From fa611ff2eeaac289931eb0e21a962743fb271ba7 Mon Sep 17 00:00:00 2001
From: sean.zhou <sean.zhou@dji.com>
Date: Fri, 23 Sep 2022 17:46:57 +0800
Subject: [PATCH] Update v1.2.0

---
 src/api/media.ts                                                          |   17 
 src/components/devices/device-log/use-device-log-upload-detail.ts         |   23 
 src/components/devices/device-log/DeviceLogUploadModal.vue                |  210 +
 src/api/device-log/index.ts                                               |  172 +
 src/pages/page-web/projects/dock.vue                                      |    0 
 src/types/device.ts                                                       |  190 +
 src/pages/page-web/home.vue                                               |   71 
 src/pages/page-web/projects/task.vue                                      |    0 
 src/components/devices/device-log/DeviceLogDetailModal.vue                |  150 
 src/pages/page-web/projects/create-plan.vue                               |    0 
 src/api/wayline.ts                                                        |   13 
 src/utils/color.ts                                                        |    8 
 src/pages/page-web/projects/workspace.vue                                 |   45 
 src/components/common/topbar.vue                                          |    2 
 src/router/index.ts                                                       |   37 
 src/components/devices/device-upgrade/DeviceFirmwareUpgrade.vue           |   64 
 src/pages/page-web/projects/layer.vue                                     |    0 
 src/hooks/use-g-map.ts                                                    |   19 
 src/event-bus/index.ts                                                    |   10 
 src/pages/page-web/projects/wayline.vue                                   |   10 
 src/utils/constants.ts                                                    |   15 
 src/api/device-upgrade/index.ts                                           |   47 
 src/components/common/sidebar.vue                                         |    6 
 src/styles/flex.style.scss                                                |   12 
 src/utils/time.ts                                                         |   15 
 tsconfig.json                                                             |    4 
 yarn.lock                                                                 | 5820 +++++++++++++++++-----------------
 src/api/manage.ts                                                         |   17 
 src/utils/bytes.ts                                                        |   86 
 src/pages/page-web/projects/media.vue                                     |    0 
 src/api/http/type.ts                                                      |    2 
 src/components/GMap.vue                                                   |   54 
 src/components/devices/device-log/DeviceLogUploadRecordDrawer.vue         |  326 +
 src/components/devices/device-hms/DeviceHmsDrawer.vue                     |  268 +
 package-lock.json                                                         |   11 
 src/components/devices/device-log/use-device-log-upload-progress-event.ts |   19 
 src/components/g-map/DockControlPanel.vue                                 |  131 
 src/api/device-cmd/index.ts                                               |   20 
 src/pages/page-web/projects/livestream.vue                                |    0 
 src/pages/page-web/projects/tsa.vue                                       |    4 
 src/websocket/index.ts                                                    |   85 
 src/utils/common.ts                                                       |    6 
 src/pages/page-pilot/pilot-home.vue                                       |   20 
 src/types/enums.ts                                                        |   21 
 src/types/device-log.ts                                                   |   65 
 src/components/MediaPanel.vue                                             |   10 
 src/hooks/use-g-map-cover.ts                                              |   18 
 src/websocket/util/config.ts                                              |    8 
 src/utils/download.ts                                                     |   82 
 src/components/devices/device-upgrade/use-device-upgrade-event.ts         |   19 
 src/pages/page-web/projects/members.vue                                   |   15 
 src/utils/device-cmd.ts                                                   |  350 ++
 src/types/airport-tsa.ts                                                  |   38 
 src/hooks/use-g-map-tsa.ts                                                |   42 
 src/root.ts                                                               |    4 
 src/pages/page-web/index.vue                                              |   10 
 src/hooks/use-mouse-tool.ts                                               |    8 
 src/components/g-map/useDockControl.ts                                    |   48 
 src/pages/page-web/projects/devices.vue                                   |  436 ++
 src/store/index.ts                                                        |   26 
 /dev/null                                                                 |  518 ---
 src/hooks/use-connect-websocket.ts                                        |   21 
 src/components/devices/device-upgrade/DeviceFirmwareUpgradeModal.vue      |   93 
 package.json                                                              |    3 
 src/components/TaskPanel.vue                                              |    2 
 src/types/device-cmd.ts                                                   |  210 +
 src/components/devices/device-upgrade/use-device-upgrade.ts               |   42 
 67 files changed, 6,526 insertions(+), 3,572 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index ccce315..f3082b8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,6 +15,7 @@
         "agora-rtc-sdk-ng": "^4.12.1",
         "ant-design-vue": "^2.2.8",
         "axios": "^0.21.1",
+        "mitt": "^3.0.0",
         "query-string": "^7.0.1",
         "reconnecting-websocket": "^4.4.0",
         "vconsole": "^3.8.1",
@@ -4900,6 +4901,11 @@
       "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz",
       "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=",
       "license": "MIT"
+    },
+    "node_modules/mitt": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.0.tgz",
+      "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ=="
     },
     "node_modules/mixin-deep": {
       "version": "1.3.2",
@@ -11340,6 +11346,11 @@
       "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz",
       "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI="
     },
+    "mitt": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.0.tgz",
+      "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ=="
+    },
     "mixin-deep": {
       "version": "1.3.2",
       "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz",
diff --git a/package.json b/package.json
index 89acf7c..2cf085e 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,7 @@
     "agora-rtc-sdk-ng": "^4.12.1",
     "ant-design-vue": "^2.2.8",
     "axios": "^0.21.1",
+    "mitt": "^3.0.0",
     "query-string": "^7.0.1",
     "reconnecting-websocket": "^4.4.0",
     "vconsole": "^3.8.1",
@@ -90,9 +91,11 @@
         "ant-design-vue/es/spin/style/css",
         "ant-design-vue/es/switch/style/css",
         "ant-design-vue/es/table/style/css",
+        "ant-design-vue/es/tag/style/css",
         "ant-design-vue/es/tooltip/style/css",
         "ant-design-vue/es/tree/style/css",
         "axios",
+        "mitt",
         "moment",
         "reconnecting-websocket",
         "vconsole",
diff --git a/src/api/device-cmd/index.ts b/src/api/device-cmd/index.ts
new file mode 100644
index 0000000..f4ea817
--- /dev/null
+++ b/src/api/device-cmd/index.ts
@@ -0,0 +1,20 @@
+import request, { IWorkspaceResponse } from '/@/api/http/request'
+import { DeviceCmd } from '/@/types/device-cmd'
+
+const CMD_API_PREFIX = '/control/api/v1'
+
+export interface SendCmdParams {
+  dock_sn: string, // 机场cn
+  device_cmd: DeviceCmd // 指令
+}
+
+/**
+ * 发送机场控制指令
+ * @param params
+ * @returns
+ */
+// /control/api/v1/devices/{dock_sn}/jobs/{service_identifier}
+export async function postSendCmd (params: SendCmdParams): Promise<IWorkspaceResponse<{}>> {
+  const resp = await request.post(`${CMD_API_PREFIX}/devices/${params.dock_sn}/jobs/${params.device_cmd}`)
+  return resp.data
+}
diff --git a/src/api/device-log/index.ts b/src/api/device-log/index.ts
new file mode 100644
index 0000000..57099e9
--- /dev/null
+++ b/src/api/device-log/index.ts
@@ -0,0 +1,172 @@
+import request, { IWorkspaceResponse, IListWorkspaceResponse } from '/@/api/http/request'
+import { DeviceValue, DOMAIN } from '/@/types/device'
+import { DeviceLogUploadStatusEnum } from '/@/types/device-log'
+import { ELocalStorageKey } from '/@/types'
+import { CURRENT_CONFIG } from '/@/api/http/config'
+
+const MNG_API_PREFIX = '/manage/api/v1'
+
+const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || ''
+
+export interface GetDeviceUploadLogListParams {
+  device_sn: string,
+  page: number,
+  page_size: number,
+  begin_time?: number, // 开始时间
+  end_time?: number, // 结束时间
+  status?: DeviceLogUploadStatusEnum, // 日志上传状态
+  logs_information?: string // 搜索内容
+}
+
+export interface BriefDeviceInfo {
+  sn: string,
+  device_model: DeviceValue,
+  device_callsign: string
+}
+
+export interface DeviceLogProgressInfo{
+  device_sn: string,
+  device_model_domain: DOMAIN,
+  progress: number, // 进度
+  result: number, // 上传结果
+  upload_rate: number, // 上传速率
+  status: DeviceLogUploadStatusEnum // 上传状态
+}
+
+export interface DeviceLogItem {
+  boot_index: number, // 日志id
+  start_time: number, // 日志开始时间
+  end_time: number, // 日志结束时间
+  size: number // 日志大小
+}
+
+export interface DeviceLogFileInfo {
+  device_sn: string,
+  module: DOMAIN,
+  result: number,
+  object_key: string,
+  file_id: string,
+  list: DeviceLogItem[]
+}
+
+export interface DeviceLogFileListInfo {
+  files: DeviceLogFileInfo[]
+}
+
+export interface GetDeviceUploadLogListRsp {
+  logs_id: string, // 记录id
+  happen_time: string, // 发生时间
+  user_name: string, // 用户
+  logs_information: string, // 异常描述
+  create_time: string, // 上传时间
+  status:DeviceLogUploadStatusEnum, // 日志上传状态
+  device_topo:{ // 设备topo
+    hosts: BriefDeviceInfo[],
+    parents: BriefDeviceInfo[]
+  },
+  logs_progress: DeviceLogProgressInfo[], // 日志上传进度
+  device_logs: DeviceLogFileListInfo // 设备日志
+}
+
+/**
+ * 获取设备上传日志列表信息
+ * @param params
+ * @returns
+ */
+export async function getDeviceUploadLogList (params: GetDeviceUploadLogListParams): Promise<IListWorkspaceResponse<GetDeviceUploadLogListRsp>> {
+  const resp = await request.get(`${MNG_API_PREFIX}/workspaces/${workspaceId}/devices/${params.device_sn}/logs-uploaded`, {
+    params: params
+  })
+  return resp.data
+}
+
+export interface GetDeviceLogListParams{
+  device_sn: string,
+  domain: DOMAIN[]
+}
+
+/**
+ * 获取设备日志列表信息
+ * @param params
+ * @returns
+ */
+export async function getDeviceLogList (params: GetDeviceLogListParams): Promise<IWorkspaceResponse<DeviceLogFileListInfo>> {
+  const domain = params.domain ? params.domain : []
+  const resp = await request.get(`${MNG_API_PREFIX}/workspaces/${workspaceId}/devices/${params.device_sn}/logs`, {
+    params: {
+      domain_list: domain.join(',')
+    }
+  })
+  return resp.data
+}
+
+export interface UploadDeviceLogBody {
+  device_sn: string
+  happen_time: string // 发生时间
+  logs_information: string // 异常描述
+  files:{
+    list: DeviceLogItem[],
+    device_sn: string,
+    module: DOMAIN
+  }[]
+}
+
+/**
+ * 上传设备日志
+ * @param body
+ * @returns
+ */
+export async function postDeviceUpgrade (body: UploadDeviceLogBody): Promise<IWorkspaceResponse<{}>> {
+  const resp = await request.post(`${MNG_API_PREFIX}/workspaces/${workspaceId}/devices/${body.device_sn}/logs`, body)
+  return resp.data
+}
+
+export type DeviceLogUploadAction = 'cancel'
+
+export interface CancelDeviceLogUploadBody {
+  device_sn: string
+  status: DeviceLogUploadAction
+  module_list: DOMAIN[]
+}
+
+// 取消上传
+export async function cancelDeviceLogUpload (body: CancelDeviceLogUploadBody): Promise<IWorkspaceResponse<{}>> {
+  const url = `${MNG_API_PREFIX}/workspaces/${workspaceId}/devices/${body.device_sn}/logs`
+  const result = await request.delete(url, {
+    data: body
+  })
+  return result.data
+}
+
+export interface DeleteDeviceLogUploadBody {
+  device_sn: string
+  logs_id: string
+}
+
+// 取消上传
+export async function deleteDeviceLogUpload (body: DeleteDeviceLogUploadBody): Promise<IWorkspaceResponse<{}>> {
+  const url = `${MNG_API_PREFIX}/workspaces/${workspaceId}/devices/${body.device_sn}/logs/${body.logs_id}`
+  const result = await request.delete(url, {
+    data: body
+  })
+  return result.data
+}
+
+export interface GetUploadDeviceLogUrlParams{
+  logs_id: string,
+  file_id: string,
+}
+
+// export interface GetUploadDeviceLogRsp{
+//   url: string
+// }
+
+/**
+ * 获取设备上传日志url
+ * @param params
+ * @returns
+ */
+export async function getUploadDeviceLogUrl (params: GetUploadDeviceLogUrlParams): Promise<IWorkspaceResponse<string>> {
+  const resp = await request.get(`${MNG_API_PREFIX}/workspaces/${workspaceId}/logs/${params.logs_id}/url/${params.file_id}`)
+  return resp.data
+}
diff --git a/src/api/device-upgrade/index.ts b/src/api/device-upgrade/index.ts
new file mode 100644
index 0000000..b1223c5
--- /dev/null
+++ b/src/api/device-upgrade/index.ts
@@ -0,0 +1,47 @@
+import request, { IWorkspaceResponse } from '/@/api/http/request'
+import { DeviceFirmwareTypeEnum } from '/@/types/device'
+
+const MNG_API_PREFIX = '/manage/api/v1'
+
+export interface GetDeviceUpgradeInfoParams {
+  device_name: string
+}
+
+export interface GetDeviceUpgradeInfoRsp {
+  device_name: string
+  product_version: string
+  release_note: string
+  released_time: string
+}
+
+/**
+ * 获取设备升级信息
+ * @param params
+ * @returns
+ */
+export async function getDeviceUpgradeInfo (params: GetDeviceUpgradeInfoParams): Promise<IWorkspaceResponse<GetDeviceUpgradeInfoRsp[]>> {
+  const resp = await request.get(`${MNG_API_PREFIX}/workspaces/firmware-release-notes/latest`, {
+    params: params
+  })
+  return resp.data
+}
+
+export interface UpgradeDeviceInfo {
+  device_name: string,
+  sn: string,
+  product_version: string,
+  firmware_upgrade_type: DeviceFirmwareTypeEnum // 1-普通升级,2-一致性升级
+}
+
+export type DeviceUpgradeBody = UpgradeDeviceInfo[]
+
+/**
+ * 设备升级
+ * @param workspace_id
+ * @param body
+ * @returns
+ */
+export async function postDeviceUpgrade (workspace_id: string, body: DeviceUpgradeBody): Promise<IWorkspaceResponse<{}>> {
+  const resp = await request.post(`${MNG_API_PREFIX}/devices/${workspace_id}/devices/ota`, body)
+  return resp.data
+}
diff --git a/src/api/http/type.ts b/src/api/http/type.ts
index 33c2a73..f7d7982 100644
--- a/src/api/http/type.ts
+++ b/src/api/http/type.ts
@@ -19,11 +19,11 @@
 }
 // Workspace
 export interface IWorkspaceResponse<T> {
-[x: string]: number;
  code: number;
  data: T;
  message: string;
 }
+
 export type IStatus = 'WAITING' | 'DOING' | 'SUCCESS' | 'FAILED';
 
 export interface CommonListResponse<T> extends IResult {
diff --git a/src/api/manage.ts b/src/api/manage.ts
index 1fe6b06..559d12b 100644
--- a/src/api/manage.ts
+++ b/src/api/manage.ts
@@ -1,4 +1,6 @@
 import request, { CommonListResponse, IListWorkspaceResponse, IPage, IWorkspaceResponse } from '/@/api/http/request'
+import { Device } from '/@/types/device'
+
 const HTTP_PREFIX = '/manage/api/v1'
 
 // login
@@ -116,7 +118,14 @@
   return result.data
 }
 
-export const getBindingDevices = async function (workspace_id: string, body: IPage, domain: string): Promise<IWorkspaceResponse<any>> {
+/**
+ * 获取绑定设备信息
+ * @param workspace_id
+ * @param body
+ * @param domain
+ * @returns
+ */
+export const getBindingDevices = async function (workspace_id: string, body: IPage, domain: string): Promise<IListWorkspaceResponse<Device>> {
   const url = `${HTTP_PREFIX}/devices/${workspace_id}/devices/bound?&page=${body.page}&page_size=${body.page_size}&domain=${domain}`
   const result = await request.get(url)
   return result.data
@@ -141,11 +150,11 @@
 }
 
 export const getDeviceHms = async function (body: HmsQueryBody, workspace_id: string, pagination: IPage): Promise<IListWorkspaceResponse<any>> {
-  let url = `${HTTP_PREFIX}/devices/${workspace_id}/devices/hms?page=${pagination.page}&pageSize=${pagination.page_size}` + 
-    `&level=${body.level ?? ''}&beginTime=${body.begin_time ?? ''}&endTime=${body.end_time ?? ''}&message=${body.message ?? ''}&language=${body.language}`
+  let url = `${HTTP_PREFIX}/devices/${workspace_id}/devices/hms?page=${pagination.page}&page_size=${pagination.page_size}` + 
+    `&level=${body.level ?? ''}&begin_time=${body.begin_time ?? ''}&end_time=${body.end_time ?? ''}&message=${body.message ?? ''}&language=${body.language}`
   body.sns.forEach((sn: string) => {
     if (sn !== '') {
-      url = url.concat(`&deviceSn=${sn}`)
+      url = url.concat(`&device_sn=${sn}`)
     }
   })
   const result = await request.get(url)
diff --git a/src/api/media.ts b/src/api/media.ts
index 9cf48d9..9a03ef5 100644
--- a/src/api/media.ts
+++ b/src/api/media.ts
@@ -1,3 +1,4 @@
+import { message } from 'ant-design-vue'
 import request, { IPage, IWorkspaceResponse } from '/@/api/http/request'
 const HTTP_PREFIX = '/media/api/v1'
 
@@ -8,11 +9,19 @@
   return result.data
 }
 // Download Media File
-export const downloadMediaFile = async function (workspaceId: string, fingerprint: string): Promise<any> {
-  const url = `${HTTP_PREFIX}/files/${workspaceId}/file/${fingerprint}/url`
+export const downloadMediaFile = async function (workspaceId: string, fileId: string): Promise<any> {
+  const url = `${HTTP_PREFIX}/files/${workspaceId}/file/${fileId}/url`
   const result = await request.get(url, { responseType: 'blob' })
-  if (result.data.code) {
+  if (result.data.type === 'application/json') {
+    const reader = new FileReader()
+    reader.onload = function (e) {
+      let text = reader.result as string
+      const result = JSON.parse(text)
+      message.error(result.message)
+    }
+    reader.readAsText(result.data, 'utf-8')
+    return
+  } else {
     return result.data
   }
-  return result
 }
diff --git a/src/api/wayline.ts b/src/api/wayline.ts
index 87c9c31..2efa822 100644
--- a/src/api/wayline.ts
+++ b/src/api/wayline.ts
@@ -1,3 +1,4 @@
+import { message } from 'ant-design-vue'
 import request, { IPage, IWorkspaceResponse } from '/@/api/http/request'
 const HTTP_PREFIX = '/wayline/api/v1'
 
@@ -20,10 +21,18 @@
 export const downloadWaylineFile = async function (workspaceId: string, waylineId: string): Promise<any> {
   const url = `${HTTP_PREFIX}/workspaces/${workspaceId}/waylines/${waylineId}/url`
   const result = await request.get(url, { responseType: 'blob' })
-  if (result.data.code) {
+  if (result.data.type === 'application/json') {
+    const reader = new FileReader()
+    reader.onload = function (e) {
+      let text = reader.result as string
+      const result = JSON.parse(text)
+      message.error(result.message)
+    }
+    reader.readAsText(result.data, 'utf-8')
+    return
+  } else {
     return result.data
   }
-  return result
 }
 
 // Delete Wayline File
diff --git a/src/api/websocket.ts b/src/api/websocket.ts
deleted file mode 100644
index 0d5a08f..0000000
--- a/src/api/websocket.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import ReconnectingWebSocket from 'reconnecting-websocket'
-import { ELocalStorageKey } from '../types/enums'
-import { CURRENT_CONFIG as config } from '/@/api/http/config'
-
-let socket: ReconnectingWebSocket
-
-export default {
-  init (getMsgFunc: any) {
-    const token: string = localStorage.getItem(ELocalStorageKey.Token)!
-    const wspath = config.websocketURL + '?x-auth-token=' + encodeURI(token)
-    socket = new ReconnectingWebSocket(wspath, '', { maxRetries: 5 })
-    socket.onopen = this.onOpen
-    socket.onerror = this.onError
-    socket.onmessage = getMsgFunc
-    socket.onclose = this.onClose
-    return socket
-  },
-  onOpen () {
-    console.log('ws opened')
-  },
-  onError (err: any) {
-    console.error(err)
-  },
-  onClose () {
-    console.log('ws closed')
-  },
-  sendMsg (data: any) {
-    socket.send(data)
-  },
-  close () {
-    socket.close()
-  }
-}
diff --git a/src/components/GMap.vue b/src/components/GMap.vue
index 80d540b..411b7ed 100644
--- a/src/components/GMap.vue
+++ b/src/components/GMap.vue
@@ -137,21 +137,23 @@
         </div>
       </div>
     </div>
-    <div v-if="osdVisible.visible && osdVisible.is_dock" class="osd-panel fz12" style="height: 280px;">
+    <!-- 机场OSD -->
+    <div v-if="osdVisible.visible && osdVisible.is_dock" class="osd-panel fz12">
       <div class="fz16 pl5 pr5 flex-align-center flex-row flex-justify-between" style="border-bottom: 1px solid #515151; height: 10%;">
         <span>{{ osdVisible.gateway_callsign }}</span>
         <span><a style="color: white;" @click="() => osdVisible.visible = false"><CloseOutlined /></a></span>
       </div>
-      <div style="height: 45%; border-bottom: 1px solid #515151;">
-        <div class="flex-column flex-align-center flex-justify-center" style="float: left; width: 60px; height: 100%; background: #2d2d2d;">
+        <!-- 机场 -->
+      <div class ="flex-display" style="border-bottom: 1px solid #515151;">
+        <div class="flex-column flex-align-stretch flex-justify-center" style="width: 60px; background: #2d2d2d;">
           <a-tooltip :title="osdVisible.model">
-            <div class="flex-column flex-align-center flex-justify-center" style="width: 90%;">
+            <div class="flex-column  flex-align-center flex-justify-center" style="width: 90%;">
               <span><RobotFilled style="font-size: 48px;"/></span>
               <span class="mt10">Dock</span>
             </div>
           </a-tooltip>
         </div>
-        <div class="osd">
+        <div class="osd flex-1" style="flex: 1">
             <a-row>
               <a-col span="16" :style="deviceInfo.dock.mode_code === EDockModeCode.Disconnected ? 'color: red; font-weight: 700;': 'color: rgb(25,190,107)'">
                 {{ EDockModeCode[deviceInfo.dock.mode_code] }}</a-col>
@@ -260,10 +262,20 @@
                 </a-tooltip>
               </a-col>
             </a-row>
+            <a-row class="p5">
+              <a-col span="24">
+                <a-button type="primary" :disabled="controlPanelVisible" size="small" @click="dockDebugOnOff(osdVisible.gateway_sn, true)">
+                  远程调试
+                </a-button>
+              </a-col>
+            </a-row>
+            <DockControlPanel v-if="controlPanelVisible" :sn="osdVisible.gateway_sn"  :deviceInfo="deviceInfo" @close-control-panel="dockDebugOnOff">
+            </DockControlPanel>
         </div>
       </div>
-      <div style="height: 45%;">
-        <div class="flex-column flex-align-center flex-justify-center" style="float: left; width: 60px; height: 100%; background: #2d2d2d;">
+      <!--  飞机-->
+      <div class ="flex-display">
+        <div class="flex-column flex-align-stretch flex-justify-center" style="width: 60px;  background: #2d2d2d;">
           <a-tooltip :title="osdVisible.model">
             <div style="width: 90%;" class="flex-column flex-align-center flex-justify-center">
               <span><a-image :src="M30" :preview="false"/></span>
@@ -271,7 +283,7 @@
             </div>
           </a-tooltip>
         </div>
-        <div class="osd">
+        <div class="osd flex-1">
             <a-row>
               <a-col span="16" :style="!deviceInfo.device || deviceInfo.device?.mode_code === EModeCode.Disconnected ? 'color: red; font-weight: 700;': 'color: rgb(25,190,107)'">
                 {{ !deviceInfo.device ? EModeCode[EModeCode.Disconnected] : EModeCode[deviceInfo.device?.mode_code] }}</a-col>
@@ -409,6 +421,8 @@
   FieldTimeOutlined, CloudOutlined, CloudFilled, FolderOpenOutlined, RobotFilled, ArrowUpOutlined
 } from '@ant-design/icons-vue'
 import { EDeviceTypeName } from '../types'
+import DockControlPanel from './g-map/DockControlPanel.vue'
+import { useDockControl } from './g-map/useDockControl'
 
 export default defineComponent({
   components: {
@@ -428,7 +442,8 @@
     FolderOpenOutlined,
     RobotFilled,
     ArrowUpOutlined,
-    ArrowDownOutlined
+    ArrowDownOutlined,
+    DockControlPanel
   },
   name: 'GMap',
   props: {},
@@ -642,6 +657,15 @@
       useMouseToolHook.mouseTool(type, getDrawCallback)
       mouseMode.value = bool
     }
+
+    // dock 控制指令
+    const {
+      controlPanelVisible,
+      setControlPanelVisible,
+      sendDockControlCmd,
+      dockDebugOnOff,
+    } = useDockControl()
+
     onMounted(() => {
       const app = getApp()
       useGMapManageHook.globalPropertiesConfig(app)
@@ -813,15 +837,19 @@
       EModeCode,
       str,
       EDockModeCode,
+      controlPanelVisible,
+      dockDebugOnOff,
     }
   }
 })
 </script>
 
 <style lang="scss" scoped>
+
 .g-map-wrapper {
   height: 100%;
   width: 100%;
+
   .g-action-panle {
     position: absolute;
     top: 16px;
@@ -845,13 +873,19 @@
     border: 1px solid $primary;
     border-radius: 2px;
   }
+
+  // antd button 光晕
+  &:deep(.ant-btn){
+    &::after {
+      display: none;
+    }
+  }
 }
 .osd-panel {
   position: absolute;
   left: 350px;
   top: 10px;
   width: 480px;
-  height: 160px;
   background: black;
   color: white;
   border-radius: 2px;
diff --git a/src/components/MediaPanel.vue b/src/components/MediaPanel.vue
index 32b7714..0d1dedd 100644
--- a/src/components/MediaPanel.vue
+++ b/src/components/MediaPanel.vue
@@ -32,7 +32,7 @@
 import { downloadFile } from '../utils/common'
 import { downloadMediaFile, getMediaFiles } from '/@/api/media'
 import { DownloadOutlined } from '@ant-design/icons-vue'
-import { Pagination } from 'ant-design-vue'
+import { message, Pagination } from 'ant-design-vue'
 import { load } from '@amap/amap-jsapi-loader'
 
 const workspaceId = localStorage.getItem(ELocalStorageKey.WorkspaceId)!
@@ -101,6 +101,7 @@
   file_name: string,
   file_path: string,
   create_time: string,
+  file_id: string,
 }
 
 const mediaData = reactive({
@@ -128,12 +129,11 @@
 
 function downloadMedia (media: MediaFile) {
   loading.value = true
-  downloadMediaFile(workspaceId, media.fingerprint).then(res => {
-    if (res.code && res.code !== 0) {
+  downloadMediaFile(workspaceId, media.file_id).then(res => {
+    if (!res) {
       return
     }
-    const suffix = media.file_name.substring(media.file_name.lastIndexOf('.'))
-    const data = new Blob([res.data], { type: suffix === '.mp4' ? 'video/mp4' : 'image/jpeg' })
+    const data = new Blob([res])
     downloadFile(data, media.file_name)
   }).finally(() => {
     loading.value = false
diff --git a/src/components/TaskPanel.vue b/src/components/TaskPanel.vue
index ce880e0..084626f 100644
--- a/src/components/TaskPanel.vue
+++ b/src/components/TaskPanel.vue
@@ -9,7 +9,7 @@
       <template #status="{ record }">
         <span v-if="taskProgressMap[record.bid]">
           <a-progress type="line" :percent="taskProgressMap[record.bid]?.progress?.percent"
-            :status="taskProgressMap[record.bid]?.status === ETaskStatus.FAILED ? 'exception' : taskProgressMap[record.bid]?.status === ETaskStatus.OK ? 'success' : 'normal'">
+            :status="taskProgressMap[record.bid]?.status.indexOf(ETaskStatus.FAILED) != -1 ? 'exception' : taskProgressMap[record.bid]?.status.indexOf(ETaskStatus.OK) != -1 ? 'success' : 'normal'">
             <template #format="percent">
               <a-tooltip :title="taskProgressMap[record.bid]?.status">
                 <div style="white-space: nowrap; text-overflow: ellipsis; overflow: hidden; position: absolute; left: 5px; top: -12px;">
diff --git a/src/pages/project-app/sidebar.vue b/src/components/common/sidebar.vue
similarity index 95%
rename from src/pages/project-app/sidebar.vue
rename to src/components/common/sidebar.vue
index c042e6e..41f6bb7 100644
--- a/src/pages/project-app/sidebar.vue
+++ b/src/components/common/sidebar.vue
@@ -28,7 +28,6 @@
 import { getRoot } from '/@/root'
 import * as icons from '@ant-design/icons-vue'
 import { ERouterName } from '/@/types'
-import websocket from '/@/api/websocket'
 
 interface IOptions {
   key: number
@@ -58,7 +57,7 @@
       { key: 1, label: 'Livestream', path: '/' + ERouterName.LIVESTREAM, icon: 'VideoCameraOutlined' },
       { key: 2, label: 'Annotations', path: '/' + ERouterName.LAYER, icon: 'EnvironmentOutlined' },
       { key: 3, label: 'Media Files', path: '/' + ERouterName.MEDIA, icon: 'PictureOutlined' },
-      { key: 4, label: 'Fligth Route Library', path: '/' + ERouterName.WAYLINE, icon: 'NodeIndexOutlined' },
+      { key: 4, label: 'Flight Route Library', path: '/' + ERouterName.WAYLINE, icon: 'NodeIndexOutlined' },
       { key: 5, label: 'Task Plan Library', path: '/' + ERouterName.TASK, icon: 'CalendarOutlined' }
     ]
 
@@ -66,10 +65,11 @@
       const path = typeof item.path === 'string' ? item.path : item.path.path
       return root.$route.path?.indexOf(path) === 0
     }
+
     function goHome () {
       root.$router.push('/' + ERouterName.MEMBERS)
-      websocket.close()
     }
+
     return {
       options,
       selectedRoute,
diff --git a/src/pages/project-app/topbar.vue b/src/components/common/topbar.vue
similarity index 96%
rename from src/pages/project-app/topbar.vue
rename to src/components/common/topbar.vue
index 1555372..02423e4 100644
--- a/src/pages/project-app/topbar.vue
+++ b/src/components/common/topbar.vue
@@ -44,8 +44,6 @@
 import { ELocalStorageKey, ERouterName } from '/@/types'
 import { UserOutlined, ExportOutlined } from '@ant-design/icons-vue'
 import cloudapi from '/@/assets/icons/cloudapi.png'
-import ReconnectingWebSocket from 'reconnecting-websocket'
-import websocket from '/@/api/websocket'
 
 const root = getRoot()
 
diff --git a/src/components/devices/device-hms/DeviceHmsDrawer.vue b/src/components/devices/device-hms/DeviceHmsDrawer.vue
new file mode 100644
index 0000000..a553ef7
--- /dev/null
+++ b/src/components/devices/device-hms/DeviceHmsDrawer.vue
@@ -0,0 +1,268 @@
+<template>
+  <a-drawer
+    title="Hms Info"
+    placement="right"
+    v-model:visible="sVisible"
+    @update:visible="onVisibleChange"
+    :destroyOnClose="true"
+    :width="800">
+    <div class="flex-row flex-align-center">
+      <div style="width: 240px;">
+        <a-range-picker
+          v-model:value="time"
+          format="YYYY-MM-DD"
+          :placeholder="['Start Time', 'End Time']"
+          @change="onTimeChange"/>
+      </div>
+      <div class="ml5">
+        <a-select
+          style="width: 150px"
+          v-model:value="param.level"
+          @select="onLevelSelect">
+          <a-select-option
+            v-for="item in levels"
+            :key="item.label"
+            :value="item.value"
+          >
+            {{ item.label }}
+          </a-select-option>
+        </a-select>
+      </div>
+      <div class="ml5">
+        <a-select
+          v-model:value="param.domain"
+          :disabled="!param.children_sn || !param.device_sn"
+          style="width: 150px"
+          @select="onDeviceTypeSelect">
+          <a-select-option
+            v-for="item in deviceTypes"
+            :key="item.label"
+            :value="item.value"
+          >
+            {{ item.label }}
+          </a-select-option>
+        </a-select>
+      </div>
+      <div class="ml5">
+        <a-input-search
+          v-model:value="param.message"
+          placeholder="input search message"
+          style="width: 200px"
+          @search="getHms"/>
+      </div>
+    </div>
+    <div>
+      <a-table :columns="hmsColumns"  :scroll="{ x: '100%', y: 600 }" :data-source="hmsData.data" :pagination="hmsPaginationProp" @change="refreshHmsData" row-key="hms_id"
+        :rowClassName="rowClassName" :loading="loading">
+        <template #time="{ record }">
+          <div>{{ record.create_time }}</div>
+          <div :style="record.update_time ? '' : record.level === EHmsLevel.CAUTION ? 'color: orange;' :
+            record.level === EHmsLevel.WARN ? 'color: red;' : 'color: #28d445;'">{{ record.update_time ?? 'It is happening...' }}</div>
+        </template>
+        <template #level="{ text }">
+          <div class="flex-row flex-align-center">
+            <div :class="text === EHmsLevel.CAUTION ? 'caution' : text === EHmsLevel.WARN ? 'warn' : 'notice'" style="width: 10px; height: 10px; border-radius: 50%;"></div>
+            <div style="margin-left: 3px;">{{ EHmsLevel[text] }}</div>
+          </div>
+        </template>
+        <template v-for="col in ['code', 'message']" #[col]="{ text }" :key="col">
+          <a-tooltip :title="text">
+              <span>{{ text }}</span>
+          </a-tooltip>
+        </template>
+      </a-table>
+    </div>
+  </a-drawer>
+</template>
+
+<!-- 暂时只抽取该组件 -->
+<script lang="ts" setup>
+import { watchEffect, reactive, ref, defineProps, defineEmits } from 'vue'
+import { getDeviceHms, HmsQueryBody } from '/@/api/manage'
+import moment, { Moment } from 'moment'
+import { ColumnProps, TableState } from 'ant-design-vue/lib/table/interface'
+import { Device, DeviceHms } from '/@/types/device'
+import { IPage } from '/@/api/http/type'
+import { EDeviceTypeName, EHmsLevel, ELocalStorageKey } from '/@/types'
+
+const props = defineProps<{
+  visible: boolean,
+  device: null | Device,
+}>()
+const emit = defineEmits(['update:visible', 'ok', 'cancel'])
+
+const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || ''
+// 健康状态
+const sVisible = ref(false)
+
+watchEffect(() => {
+  sVisible.value = props.visible
+  // 显示弹框时,获取设备hms信息
+  if (props.visible) {
+    showHms()
+  }
+})
+
+function onVisibleChange (sVisible: boolean) {
+  setVisible(sVisible)
+}
+
+function setVisible (v: boolean, e?: Event) {
+  sVisible.value = v
+  emit('update:visible', v, e)
+}
+
+const loading = ref(false)
+
+const hmsColumns: ColumnProps[] = [
+  { title: 'Alarm Begin | End Time', dataIndex: 'create_time', width: '25%', className: 'titleStyle', slots: { customRender: 'time' } },
+  { title: 'Level', dataIndex: 'level', width: '120px', className: 'titleStyle', slots: { customRender: 'level' } },
+  { title: 'Device', dataIndex: 'domain', width: '12%', className: 'titleStyle' },
+  { title: 'Error Code', dataIndex: 'key', width: '20%', className: 'titleStyle', slots: { customRender: 'code' } },
+  { title: 'Hms Message', dataIndex: 'message_en', className: 'titleStyle', ellipsis: true, slots: { customRender: 'message' } },
+]
+
+interface DeviceHmsData {
+  data: DeviceHms[]
+}
+
+const hmsData = reactive<DeviceHmsData>({
+  data: []
+})
+
+type Pagination = TableState['pagination']
+
+const hmsPaginationProp = reactive({
+  pageSizeOptions: ['20', '50', '100'],
+  showQuickJumper: true,
+  showSizeChanger: true,
+  pageSize: 50,
+  current: 1,
+  total: 0
+})
+
+// 获取分页信息
+function getPaginationBody () {
+  return {
+    page: hmsPaginationProp.current,
+    page_size: hmsPaginationProp.pageSize
+  } as IPage
+}
+
+function showHms () {
+  const dock = props.device
+  if (!dock) return
+  if (dock.domain === EDeviceTypeName.Dock) {
+    getDeviceHmsBySn(dock.device_sn, dock.children?.[0].device_sn ?? '')
+  }
+  if (dock.domain === EDeviceTypeName.Aircraft) {
+    param.domain = EDeviceTypeName.Aircraft
+    getDeviceHmsBySn('', dock.device_sn)
+  }
+}
+
+function refreshHmsData (page: Pagination) {
+  hmsPaginationProp.current = page?.current!
+  hmsPaginationProp.pageSize = page?.pageSize!
+  getHms()
+}
+
+const param = reactive<HmsQueryBody>({
+  sns: [],
+  device_sn: '',
+  children_sn: '',
+  language: 'en',
+  begin_time: new Date(new Date().setDate(new Date().getDate() - 7)).setHours(0, 0, 0, 0),
+  end_time: new Date().setHours(23, 59, 59, 999),
+  domain: '',
+  level: '',
+  message: ''
+})
+
+const levels = [
+  {
+    label: 'All',
+    value: ''
+  }, {
+    label: EHmsLevel[0],
+    value: EHmsLevel.NOTICE
+  }, {
+    label: EHmsLevel[1],
+    value: EHmsLevel.CAUTION
+  }, {
+    label: EHmsLevel[2],
+    value: EHmsLevel.WARN
+  }
+]
+
+const deviceTypes = [
+  {
+    label: 'All',
+    value: ''
+  }, {
+    label: EDeviceTypeName.Aircraft,
+    value: EDeviceTypeName.Aircraft
+  }, {
+    label: EDeviceTypeName.Dock,
+    value: EDeviceTypeName.Dock
+  }
+]
+
+const rowClassName = (record: any, index: number) => {
+  const className = []
+  if ((index & 1) === 0) {
+    className.push('table-striped')
+  }
+  if (record.domain !== EDeviceTypeName.Dock) {
+    className.push('child-row')
+  }
+  return className.toString().replaceAll(',', ' ')
+}
+
+const time = ref([moment(param.begin_time), moment(param.end_time)])
+
+function getHms () {
+  loading.value = true
+  getDeviceHms(param, workspaceId, getPaginationBody())
+    .then(res => {
+      hmsPaginationProp.total = res.data.pagination.total
+      hmsPaginationProp.current = res.data.pagination.page
+      hmsData.data = res.data.list
+      hmsData.data.forEach(hms => {
+        hms.domain = hms.sn === param.children_sn ? EDeviceTypeName.Aircraft : EDeviceTypeName.Dock
+      })
+      loading.value = false
+    }).catch(_err => {
+      loading.value = false
+    })
+}
+
+function getDeviceHmsBySn (sn: string, childSn: string) {
+  param.device_sn = sn
+  param.children_sn = childSn
+  param.sns = [param.device_sn, param.children_sn]
+  getHms()
+}
+
+function onTimeChange (newTime: [Moment, Moment]) {
+  param.begin_time = newTime[0].valueOf()
+  param.end_time = newTime[1].valueOf()
+  getHms()
+}
+
+function onDeviceTypeSelect (val: string) {
+  param.sns = [param.device_sn, param.children_sn]
+  if (val === EDeviceTypeName.Dock) {
+    param.sns = [param.device_sn, '']
+  }
+  if (val === EDeviceTypeName.Aircraft) {
+    param.sns = ['', param.children_sn]
+  }
+  getHms()
+}
+
+function onLevelSelect (val: number) {
+  param.level = val
+  getHms()
+}
+</script>
diff --git a/src/components/devices/device-log/DeviceLogDetailModal.vue b/src/components/devices/device-log/DeviceLogDetailModal.vue
new file mode 100644
index 0000000..c203ce3
--- /dev/null
+++ b/src/components/devices/device-log/DeviceLogDetailModal.vue
@@ -0,0 +1,150 @@
+<template>
+  <a-modal
+    title="日志上传详情"
+    v-model:visible="sVisible"
+    width="900px"
+    :footer="null"
+    @update:visible="onVisibleChange">
+    <div class="device-log-detail-wrap">
+      <div class="device-log-list">
+        <div class="log-list-item">
+          <a-button type="primary" class="download-btn" :disabled="!airportTableLogState.logList?.file_id"  size="small" @click="onDownloadLog(airportTableLogState.logList.file_id)">
+             下载机场日志
+          </a-button>
+          <a-table  :columns="airportLogColumns"
+                    :scroll="{ x: '100%', y: 600 }"
+                    :data-source="airportTableLogState.logList?.list"
+                    rowKey="boot_index"
+                    :pagination = "false"
+                    >
+            <template #log_time="{record}">
+              <div>{{getLogTime(record)}}</div>
+            </template>
+            <template #size="{record}">
+              <div>{{getLogSize(record.size)}}</div>
+            </template>
+          </a-table>
+        </div>
+        <div class="log-list-item">
+          <a-button type="primary"  class="download-btn" :disabled="!droneTableLogState.logList?.file_id" size="small" @click="onDownloadLog(droneTableLogState.logList.file_id)">
+             下载飞行器日志
+          </a-button>
+          <a-table  :columns="droneLogColumns"
+                    :scroll="{ x: '100%', y: 600 }"
+                    :data-source="droneTableLogState.logList?.list"
+                    rowKey="boot_index"
+                    :pagination = "false"
+          >
+            <template #log_time="{record}">
+              <div>{{getLogTime(record)}}</div>
+            </template>
+            <template #size="{record}">
+              <div>{{getLogSize(record.size)}}</div>
+            </template>
+          </a-table>
+        </div>
+      </div>
+    </div>
+  </a-modal>
+</template>
+
+<script lang="ts" setup>
+import { watchEffect, reactive, ref, defineProps, defineEmits } from 'vue'
+import { ColumnProps, TableState } from 'ant-design-vue/lib/table/interface'
+import { IPage } from '/@/api/http/type'
+import { DOMAIN } from '/@/types/device'
+import { DeviceLogFileInfo, GetDeviceUploadLogListRsp, getUploadDeviceLogUrl } from '/@/api/device-log'
+import { useDeviceLogUploadDetail } from './use-device-log-upload-detail'
+import { download } from '/@/utils/download'
+
+const props = defineProps<{
+  visible: boolean,
+  deviceLog: null | GetDeviceUploadLogListRsp,
+}>()
+const emit = defineEmits(['update:visible'])
+
+const sVisible = ref(false)
+
+watchEffect(() => {
+  sVisible.value = props.visible
+  if (props.visible) {
+    classifyDeviceLog()
+  }
+})
+
+function onVisibleChange (sVisible: boolean) {
+  setVisible(sVisible)
+}
+
+function setVisible (v: boolean, e?: Event) {
+  sVisible.value = v
+  emit('update:visible', v, e)
+}
+
+// 表格
+const airportLogColumns: ColumnProps[] = [
+  { title: '机场日志', dataIndex: 'time', width: '70%', slots: { customRender: 'log_time' } },
+  { title: '文件大小', dataIndex: 'size', width: '30%', slots: { customRender: 'size' } },
+]
+
+const droneLogColumns: ColumnProps[] = [
+  { title: '飞行器日志', dataIndex: 'time', width: '70%', slots: { customRender: 'log_time' } },
+  { title: '文件大小', dataIndex: 'size', width: '30%', slots: { customRender: 'size' } },
+]
+
+const airportTableLogState = reactive({
+  logList: {} as DeviceLogFileInfo,
+})
+
+const droneTableLogState = reactive({
+  logList: {} as DeviceLogFileInfo,
+})
+
+function classifyDeviceLog () {
+  if (!props.deviceLog) return
+  const { device_logs } = props.deviceLog
+  const { files } = device_logs || {}
+  if (files && files.length > 0) {
+    files.forEach(file => {
+      if (file.module === DOMAIN.DOCK) {
+        airportTableLogState.logList = file
+      } else if (file.module === DOMAIN.DRONE) {
+        droneTableLogState.logList = file
+      }
+    })
+  }
+}
+
+const { getLogTime, getLogSize } = useDeviceLogUploadDetail()
+
+async function onDownloadLog (fileId: string) {
+  const { data } = await getUploadDeviceLogUrl({
+    file_id: fileId,
+    logs_id: props.deviceLog?.logs_id || ''
+  })
+  if (data) {
+    download(data)
+  // download('https:/github.com/dji-sdk/Mobile-SDK-Android-V5/archive/refs/heads/dev-sdk-main.zip')
+  }
+}
+
+</script>
+
+<style lang="scss" scoped>
+.device-log-detail-wrap{
+
+  .device-log-list{
+    display: flex;
+    justify-content: space-between;
+    padding: 8px 0;
+    .log-list-item{
+      width: 420px;
+
+      .download-btn{
+        margin-bottom: 10px;
+      }
+    }
+  }
+}
+</style>
+>
diff --git a/src/components/devices/device-log/DeviceLogUploadModal.vue b/src/components/devices/device-log/DeviceLogUploadModal.vue
new file mode 100644
index 0000000..99c2efd
--- /dev/null
+++ b/src/components/devices/device-log/DeviceLogUploadModal.vue
@@ -0,0 +1,210 @@
+<template>
+  <a-modal
+    title="设备日志上传"
+    v-model:visible="sVisible"
+    width="900px"
+    :footer="null"
+    @update:visible="onVisibleChange">
+    <div class="device-log-upload-wrap">
+      <div class="page-action-row">
+        <a-button type="primary" :disabled="deviceLogUploadBtnDisabled" @click="uploadDeviceLog">上传日志</a-button>
+      </div>
+      <div class="device-log-list">
+        <div class="log-list-item">
+          <a-table  :columns="airportLogColumns"
+                    :scroll="{ x: '100%', y: 600 }"
+                    :data-source="airportTableLogState.logList?.list"
+                    :loading="airportTableLogState.tableLoading"
+                    :row-selection="airportTableLogState.rowSelection"
+                    rowKey="boot_index"
+                    :pagination = "false">
+            <template #log_time="{record}">
+              <div>{{getLogTime(record)}}</div>
+            </template>
+            <template #size="{record}">
+              <div>{{getLogSize(record.size)}}</div>
+            </template>
+          </a-table>
+        </div>
+        <div class="log-list-item">
+          <a-table  :columns="droneLogColumns"
+                    :scroll="{ x: '100%', y: 600 }"
+                    :data-source="droneTableLogState.logList?.list"
+                    :loading="droneTableLogState.tableLoading"
+                    :row-selection="droneTableLogState.rowSelection"
+                    rowKey="boot_index"
+                    :pagination = "false">
+            <template #log_time="{record}">
+              <div>{{getLogTime(record)}}</div>
+            </template>
+            <template #size="{record}">
+              <div>{{getLogSize(record.size)}}</div>
+            </template>
+          </a-table>
+        </div>
+      </div>
+    </div>
+  </a-modal>
+</template>
+
+<script lang="ts" setup>
+import { watchEffect, reactive, ref, computed, defineProps, defineEmits } from 'vue'
+import { ColumnProps, TableState } from 'ant-design-vue/lib/table/interface'
+import { IPage } from '/@/api/http/type'
+import { Device, DOMAIN } from '/@/types/device'
+import { getDeviceLogList, postDeviceUpgrade, DeviceLogFileInfo, UploadDeviceLogBody, DeviceLogItem } from '/@/api/device-log'
+import { message } from 'ant-design-vue'
+import { useDeviceLogUploadDetail } from './use-device-log-upload-detail'
+
+const props = defineProps<{
+  visible: boolean,
+  device: null | Device,
+}>()
+const emit = defineEmits(['update:visible', 'upload-log-ok'])
+
+const sVisible = ref(false)
+
+watchEffect(() => {
+  sVisible.value = props.visible
+  // 显示弹框时,获取设备日志信息
+  if (props.visible) {
+    getDeviceLogInfo()
+  }
+})
+
+function onVisibleChange (sVisible: boolean) {
+  setVisible(sVisible)
+  if (!sVisible) {
+    resetTableLogState()
+  }
+}
+
+function setVisible (v: boolean, e?: Event) {
+  sVisible.value = v
+  emit('update:visible', v, e)
+}
+
+// 表格
+const airportLogColumns: ColumnProps[] = [
+  { title: '机场日志', dataIndex: 'time', width: 100, slots: { customRender: 'log_time' } },
+  { title: '文件大小', dataIndex: 'size', width: 25, slots: { customRender: 'size' } },
+]
+
+const droneLogColumns: ColumnProps[] = [
+  { title: '飞行器日志', dataIndex: 'time', width: 100, slots: { customRender: 'log_time' } },
+  { title: '文件大小', dataIndex: 'size', width: 25, slots: { customRender: 'size' } },
+]
+
+const airportTableLogState = reactive({
+  logList: {} as DeviceLogFileInfo,
+  tableLoading: false,
+  selectRow: [],
+  rowSelection: {
+    columnWidth: 15,
+    selectedRowKeys: [] as number[],
+    onChange: (selectedRowKeys:number[], selectedRows: []) => {
+      airportTableLogState.rowSelection.selectedRowKeys = selectedRowKeys
+      airportTableLogState.selectRow = selectedRows
+      console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows)
+    },
+  }
+})
+
+function resetTableLogState () {
+  airportTableLogState.logList = {} as DeviceLogFileInfo
+  airportTableLogState.selectRow = []
+  airportTableLogState.tableLoading = false
+}
+
+const droneTableLogState = reactive({
+  logList: {} as DeviceLogFileInfo,
+  tableLoading: false,
+  selectRow: [],
+  rowSelection: {
+    columnWidth: 15,
+    selectedRowKeys: [] as number[],
+    onChange: (selectedRowKeys: number[], selectedRows: []) => {
+      droneTableLogState.rowSelection.selectedRowKeys = selectedRowKeys
+      droneTableLogState.selectRow = selectedRows
+      console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows)
+    },
+  }
+})
+
+const deviceLogUploadBtnDisabled = computed(() => {
+  return (airportTableLogState.rowSelection.selectedRowKeys && airportTableLogState.rowSelection.selectedRowKeys.length <= 0) &&
+  (droneTableLogState.rowSelection.selectedRowKeys && droneTableLogState.rowSelection.selectedRowKeys.length <= 0)
+})
+
+// 获取设备内日志
+async function getDeviceLogInfo () {
+  airportTableLogState.tableLoading = true
+  droneTableLogState.tableLoading = true
+  try {
+    const { code, data } = await getDeviceLogList({
+      device_sn: props.device?.device_sn || '',
+      domain: [DOMAIN.DOCK, DOMAIN.DRONE]
+    })
+    if (code === 0) {
+      const { files } = data
+      if (files && files.length > 0) {
+        files.forEach(file => {
+          if (file.module === DOMAIN.DOCK) {
+            airportTableLogState.logList = file
+          } else if (file.module === DOMAIN.DRONE) {
+            droneTableLogState.logList = file
+          }
+        })
+      }
+    }
+  } catch (err) {
+  }
+  airportTableLogState.tableLoading = false
+  droneTableLogState.tableLoading = false
+}
+
+// 日志上传
+async function uploadDeviceLog () {
+  const body = {
+    device_sn: props.device?.device_sn || '',
+    files: [] as any
+  } as UploadDeviceLogBody
+  if (airportTableLogState.selectRow && airportTableLogState.selectRow.length > 0) {
+    body.files.push({
+      list: airportTableLogState.selectRow,
+      device_sn: airportTableLogState.logList.device_sn,
+      module: airportTableLogState.logList.module
+    })
+  }
+  if (droneTableLogState.selectRow && droneTableLogState.selectRow.length > 0) {
+    body.files.push({
+      list: droneTableLogState.selectRow,
+      device_sn: droneTableLogState.logList.device_sn,
+      module: droneTableLogState.logList.module
+    })
+  }
+  const { code } = await postDeviceUpgrade(body)
+  if (code === 0) {
+    message.success('日志上传任务执行成功')
+    emit('upload-log-ok')
+    setVisible(false)
+  }
+}
+
+const { getLogTime, getLogSize } = useDeviceLogUploadDetail()
+
+</script>
+
+<style lang="scss" scoped>
+.device-log-upload-wrap{
+
+  .device-log-list{
+    display: flex;
+    justify-content: space-between;
+    padding: 8px 0;
+    .log-list-item{
+      width: 420px;
+    }
+  }
+}
+</style>
diff --git a/src/components/devices/device-log/DeviceLogUploadRecordDrawer.vue b/src/components/devices/device-log/DeviceLogUploadRecordDrawer.vue
new file mode 100644
index 0000000..1d1b2a4
--- /dev/null
+++ b/src/components/devices/device-log/DeviceLogUploadRecordDrawer.vue
@@ -0,0 +1,326 @@
+<template>
+  <a-drawer
+    title="设备日志上传记录"
+    placement="right"
+    v-model:visible="sVisible"
+    @update:visible="onVisibleChange"
+    :width="800">
+    <!-- 设备日志上传记录 -->
+    <div class="device-log-upload-record-wrap">
+      <div class="page-action-row">
+        <a-button type="primary" @click="onUploadDeviceLog">上传日志</a-button>
+      </div>
+      <div class="device-log-upload-list">
+        <a-table :columns="deviceLogUploadListColumns"
+                  :scroll="{ x: '100%', y: 600 }"
+                  :data-source="deviceUploadLogState.uploadLogList"
+                  :loading="deviceUploadLogState.loading"
+                  :pagination="deviceUploadLogState.paginationProp"
+                  @change="onDeviceUploadLogTableChange"
+                  rowKey="logs_id">
+         <!-- 设备类型 -->
+          <template #device_type="{ record }">
+            <div>
+              <div v-if="getDeviceInfo(record).parents && getDeviceInfo(record).parents.length > 0">{{ DEVICE_NAME[getDeviceInfo(record).parents[0].device_model.key]}}</div>
+              <div v-if="getDeviceInfo(record).hosts && getDeviceInfo(record).hosts.length > 0">{{ DEVICE_NAME[getDeviceInfo(record).hosts[0].device_model.key]}}</div>
+            </div>
+          </template>
+          <!-- 设备sn -->
+          <template #device_sn="{ record }">
+            <div>
+              <div v-if="getDeviceInfo(record).parents && getDeviceInfo(record).parents.length > 0">{{ getDeviceInfo(record).parents[0].sn }}</div>
+              <div v-if="getDeviceInfo(record).hosts && getDeviceInfo(record).hosts.length > 0">{{ getDeviceInfo(record).hosts[0].sn }}</div>
+            </div>
+          </template>
+          <!-- 上传状态 -->
+          <template #status="{ record }">
+            <div>
+              <div>
+                <span class="circle-icon" :style="{backgroundColor: getDeviceLogUploadStatus(record).color}"></span>
+                {{ getDeviceLogUploadStatus(record).text }}
+              </div>
+              <div v-if="record.status === DeviceLogUploadStatusEnum.Uploading">
+                <a-progress :percent="getLogProgress(record)" />
+              </div>
+            </div>
+          </template>
+          <!-- 操作 -->
+          <template #action="{ record }">
+            <div class="row-action">
+              <a-tooltip title="查看详情">
+                  <FileTextOutlined  @click="showDeviceLogDetail(record)"/>
+              </a-tooltip>
+              <span v-if="record.status === DeviceLogUploadStatusEnum.Uploading">
+                <a-tooltip title="取消">
+                  <StopOutlined @click="onCancelUploadDeviceLog(record)"/>
+                </a-tooltip>
+              </span>
+              <span v-else>
+                <a-tooltip title="删除">
+                  <DeleteOutlined @click="onDeleteUploadDeviceLog(record)"/>
+                </a-tooltip>
+              </span>
+            </div>
+          </template>
+        </a-table>
+      </div>
+    </div>
+  </a-drawer>
+  <!-- 设备日志上传弹框 -->
+  <DeviceLogUploadModal
+     v-model:visible="deviceLogUploadModalVisible"
+     :device="props.device"
+     @upload-log-ok="onUploadLogOk"
+  ></DeviceLogUploadModal>
+
+  <!-- 设备日志上传详情弹框 -->
+  <DeviceLogDetailModal
+     v-model:visible="deviceLogDetailModalVisible"
+     :deviceLog="currentDeviceLog"
+  ></DeviceLogDetailModal>
+</template>
+
+<script lang="ts" setup>
+import { watchEffect, reactive, ref, defineProps, defineEmits } from 'vue'
+import { ColumnProps, TableState } from 'ant-design-vue/lib/table/interface'
+import { IPage } from '/@/api/http/type'
+import { Device, DOMAIN, DEVICE_NAME } from '/@/types/device'
+import DeviceLogUploadModal from './DeviceLogUploadModal.vue'
+import DeviceLogDetailModal from './DeviceLogDetailModal.vue'
+import { getDeviceUploadLogList, GetDeviceUploadLogListRsp, cancelDeviceLogUpload, deleteDeviceLogUpload } from '/@/api/device-log'
+import { StopOutlined, DeleteOutlined, FileTextOutlined } from '@ant-design/icons-vue'
+import { DeviceLogUploadStatusEnum, DeviceLogUploadStatusMap, DeviceLogUploadStatusColor, DeviceLogUploadInfo, DeviceLogUploadWsStatusMap, DeviceLogProgressInfo } from '/@/types/device-log'
+import { useDeviceLogUploadProgressEvent } from './use-device-log-upload-progress-event'
+import { Modal } from 'ant-design-vue'
+
+const props = defineProps<{
+  visible: boolean,
+  device: null | Device,
+}>()
+const emit = defineEmits(['update:visible'])
+
+const sVisible = ref(false)
+
+watchEffect(() => {
+  sVisible.value = props.visible
+  // 显示弹框时,获取设备日志上传记录信息
+  if (props.visible) {
+    getDeviceUploadLogInfo()
+  }
+})
+
+function onVisibleChange (sVisible: boolean) {
+  setVisible(sVisible)
+}
+
+function setVisible (v: boolean, e?: Event) {
+  sVisible.value = v
+  emit('update:visible', v, e)
+}
+
+// 日志列表
+const deviceLogUploadListColumns: ColumnProps[] = [
+  { title: '上传时间', dataIndex: 'create_time', width: 100 },
+  { title: '设备型号', dataIndex: 'device_type', width: 80, slots: { customRender: 'device_type' } },
+  { title: '设备SN', dataIndex: 'device_sn', width: 120, slots: { customRender: 'device_sn' } },
+  { title: '上传状态', dataIndex: 'status', width: 120, slots: { customRender: 'status' } },
+  { title: '操作', dataIndex: 'actions', width: 80, slots: { customRender: 'action' } },
+]
+
+const deviceUploadLogState = reactive({
+  uploadLogList: [] as GetDeviceUploadLogListRsp[],
+  loading: false,
+  paginationProp: {
+    pageSizeOptions: ['20', '50', '100'],
+    showQuickJumper: true,
+    showSizeChanger: true,
+    pageSize: 50,
+    current: 1,
+    total: 0
+  }
+})
+
+// 获取上传的设备日志
+async function getDeviceUploadLogInfo () {
+  deviceUploadLogState.loading = true
+  try {
+    const { code, data } = await getDeviceUploadLogList({
+      device_sn: props.device?.device_sn || '',
+      page: deviceUploadLogState.paginationProp.current,
+      page_size: deviceUploadLogState.paginationProp.pageSize
+    })
+    if (code === 0) {
+      deviceUploadLogState.uploadLogList = data.list
+      deviceUploadLogState.paginationProp.total = data.pagination.total
+      deviceUploadLogState.paginationProp.current = data.pagination.page
+      deviceUploadLogState.paginationProp.pageSize = data.pagination.page_size
+    }
+    deviceUploadLogState.loading = false
+  } catch (error) {
+    deviceUploadLogState.loading = false
+  }
+}
+type Pagination = TableState['pagination']
+
+// 获取设备信息
+function getDeviceInfo (deviceLogItem: GetDeviceUploadLogListRsp) {
+  const { device_topo: deviceTopo } = deviceLogItem
+  return deviceTopo
+}
+
+// 获取上传状态
+function getDeviceLogUploadStatus (deviceLogItem: GetDeviceUploadLogListRsp) {
+  const statusObj = {
+    color: '',
+    text: ''
+  }
+  const { status } = deviceLogItem
+  statusObj.color = DeviceLogUploadStatusColor[status]
+  statusObj.text = DeviceLogUploadStatusMap[status]
+  return statusObj
+}
+
+// 获取上传进度
+function getLogProgress (deviceLogItem: GetDeviceUploadLogListRsp) {
+  let percent = 0
+  const { logs_progress } = deviceLogItem
+  if (logs_progress && logs_progress.length > 0) {
+    logs_progress.forEach(log => {
+      percent += (log.progress || 0)
+    })
+    percent = percent / logs_progress.length
+  }
+  return Math.floor(percent)
+}
+
+// 设备日志上传进度更新
+function onDeviceLogUploadWs (data: DeviceLogUploadInfo) {
+  const { sn, output } = data
+  if (output) {
+    const { files, status, logs_id: logId } = output || {}
+    const deviceLogItem = deviceUploadLogState.uploadLogList.find(log => log.logs_id === logId)
+    if (!deviceLogItem) return
+    if (status) {
+      deviceLogItem.status = DeviceLogUploadWsStatusMap[status]
+    }
+    if (files && files.length > 0) {
+      const logsProgress = [] as DeviceLogProgressInfo[]
+      files.forEach(file => {
+        logsProgress.push({
+          ...file,
+          status: DeviceLogUploadWsStatusMap[file.status]
+        })
+      })
+      deviceLogItem.logs_progress = logsProgress
+    }
+  }
+}
+
+useDeviceLogUploadProgressEvent(onDeviceLogUploadWs)
+
+// 搜索
+async function onDeviceUploadLogTableChange (page: Pagination) {
+  deviceUploadLogState.paginationProp.current = page?.current || 1
+  deviceUploadLogState.paginationProp.pageSize = page?.pageSize || 20
+  await getDeviceUploadLogInfo()
+}
+
+// 查看上传设备日志详情
+const deviceLogDetailModalVisible = ref(false)
+const currentDeviceLog = ref({} as GetDeviceUploadLogListRsp)
+
+function showDeviceLogDetail (deviceLogItem: GetDeviceUploadLogListRsp) {
+  if (!deviceLogItem) return
+  currentDeviceLog.value = deviceLogItem
+  deviceLogDetailModalVisible.value = true
+}
+
+// 取消上传设备日志
+async function onCancelUploadDeviceLog (deviceLogItem: GetDeviceUploadLogListRsp) {
+  Modal.confirm({
+    title: '取消日志上传',
+    content: '您确认取消设备日志上传吗?',
+    okType: 'danger',
+    onOk () {
+      cancelDeviceLogUploadOk()
+    },
+  })
+}
+
+async function cancelDeviceLogUploadOk () {
+  const { code } = await cancelDeviceLogUpload({
+    device_sn: props.device?.device_sn || '',
+    module_list: [DOMAIN.DOCK, DOMAIN.DRONE],
+    status: 'cancel'
+  })
+  if (code === 0) {
+    await getDeviceUploadLogInfo()
+  }
+}
+
+// 删除上传的设备日志
+function onDeleteUploadDeviceLog (deviceLogItem: GetDeviceUploadLogListRsp) {
+  Modal.confirm({
+    title: '删除上传日志',
+    content: '您确认删除该条已上传设备日志吗?',
+    okType: 'danger',
+    onOk () {
+      deleteUploadDeviceLogOk(deviceLogItem)
+    },
+  })
+}
+
+async function deleteUploadDeviceLogOk (deviceLogItem: GetDeviceUploadLogListRsp) {
+  const { code } = await deleteDeviceLogUpload({
+    device_sn: props.device?.device_sn || '',
+    logs_id: deviceLogItem.logs_id
+  })
+  if (code === 0) {
+    await getDeviceUploadLogInfo()
+  }
+}
+
+// 上传日志
+const deviceLogUploadModalVisible = ref(false)
+
+function onUploadDeviceLog () {
+  deviceLogUploadModalVisible.value = true
+}
+
+function onUploadLogOk () {
+  // 刷新列表
+  getDeviceUploadLogInfo()
+}
+</script>
+
+<style lang="scss" scoped>
+.device-log-upload-record-wrap{
+  .page-action-row{
+    display: flex;
+    justify-content: space-between;
+    width: 100%;
+  }
+
+  .device-log-upload-list{
+    padding: 20px 0 10px;
+  }
+
+  .circle-icon {
+    display: inline-block;
+    width: 12px;
+    height: 12px;
+    margin-right: 3px;
+    border-radius: 50%;
+    vertical-align: middle;
+    flex-shrink: 0;
+  }
+
+  .row-action{
+    color: #2d8cf0;
+
+    & > span{
+      margin-right: 10px;
+    }
+  }
+}
+</style>
diff --git a/src/components/devices/device-log/use-device-log-upload-detail.ts b/src/components/devices/device-log/use-device-log-upload-detail.ts
new file mode 100644
index 0000000..3a140d4
--- /dev/null
+++ b/src/components/devices/device-log/use-device-log-upload-detail.ts
@@ -0,0 +1,23 @@
+import { DeviceLogItem } from '/@/api/device-log'
+import { bytesToSize } from '/@/utils/bytes'
+import { formatUnixTime } from '/@/utils/time'
+import {
+  DATE_FORMAT_MINUTE
+} from '/@/utils/constants'
+
+export function useDeviceLogUploadDetail () {
+  function getLogTime (deviceLog: DeviceLogItem): string {
+    const startTime = formatUnixTime(deviceLog.start_time, DATE_FORMAT_MINUTE)
+    const endTime = formatUnixTime(deviceLog.end_time, DATE_FORMAT_MINUTE)
+    return `${startTime} — ${endTime}`
+  }
+
+  function getLogSize (size: number) {
+    return bytesToSize(size)
+  }
+
+  return {
+    getLogTime,
+    getLogSize
+  }
+}
diff --git a/src/components/devices/device-log/use-device-log-upload-progress-event.ts b/src/components/devices/device-log/use-device-log-upload-progress-event.ts
new file mode 100644
index 0000000..42a8135
--- /dev/null
+++ b/src/components/devices/device-log/use-device-log-upload-progress-event.ts
@@ -0,0 +1,19 @@
+import EventBus from '/@/event-bus/'
+import { onMounted, onBeforeUnmount } from 'vue'
+import { DeviceLogUploadInfo } from '/@/types/device-log'
+
+export function useDeviceLogUploadProgressEvent (onDeviceLogUploadWs: (data: DeviceLogUploadInfo) => void): void {
+  function handleDeviceLogUploadProgress (payload: any) {
+    onDeviceLogUploadWs(payload.data)
+    // eslint-disable-next-line no-unused-expressions
+    // console.log('payload', payload.data)
+  }
+
+  onMounted(() => {
+    EventBus.on('deviceLogUploadProgress', handleDeviceLogUploadProgress)
+  })
+
+  onBeforeUnmount(() => {
+    EventBus.off('deviceLogUploadProgress', handleDeviceLogUploadProgress)
+  })
+}
diff --git a/src/components/devices/device-upgrade/DeviceFirmwareUpgrade.vue b/src/components/devices/device-upgrade/DeviceFirmwareUpgrade.vue
new file mode 100644
index 0000000..84b0ad8
--- /dev/null
+++ b/src/components/devices/device-upgrade/DeviceFirmwareUpgrade.vue
@@ -0,0 +1,64 @@
+<template>
+<div class="firmware_upgrade_wrap">
+  <!-- 版本 -->
+  <span class="version"> {{ device.firmware_version }}</span>
+  <!-- tag -->
+  <span v-if="getTagStatus(device)"
+        class="status-tag pointer">
+    <a-tag class="pointer"
+           :color="getFirmwareTag(device.firmware_status).color"
+           @click="deviceUpgrade(device)">
+      {{ getFirmwareTag(device.firmware_status).text }}
+    </a-tag>
+  </span>
+  <!-- 进度 -->
+  <span v-if="device.firmware_status === DeviceFirmwareStatusEnum.DuringUpgrade">
+  {{ `${device.firmware_progress}%`}}
+  </span>
+</div>
+</template>
+
+<script lang="ts" setup>
+import { defineProps, defineEmits, ref, watch, computed } from 'vue'
+import { Device, DeviceFirmwareStatusEnum, DeviceFirmwareStatus, DeviceFirmwareStatusColor } from '/@/types/device'
+
+const props = defineProps<{
+  device: Device,
+}>()
+
+const emit = defineEmits(['device-upgrade'])
+const needUpgrade = computed(() => {
+  return props.device.firmware_status === DeviceFirmwareStatusEnum.ConsistencyUpgrade ||
+         props.device.firmware_status === DeviceFirmwareStatusEnum.ToUpgraded
+})
+
+function getTagStatus (record: Device) {
+  return record.firmware_status && record.firmware_status !== DeviceFirmwareStatusEnum.None
+}
+
+function getFirmwareTag (status: DeviceFirmwareStatusEnum) {
+  return {
+    text: DeviceFirmwareStatus[status] || '',
+    color: DeviceFirmwareStatusColor[status] || ''
+  }
+}
+
+function deviceUpgrade (record: Device) {
+  if (!needUpgrade.value) return
+  emit('device-upgrade', record)
+}
+
+</script>
+
+<style lang="scss" scoped>
+.firmware_upgrade_wrap{
+
+  .status-tag{
+    margin-left: 10px;
+  }
+
+  .pointer {
+    cursor: pointer;
+  }
+}
+</style>
diff --git a/src/components/devices/device-upgrade/DeviceFirmwareUpgradeModal.vue b/src/components/devices/device-upgrade/DeviceFirmwareUpgradeModal.vue
new file mode 100644
index 0000000..5da7f37
--- /dev/null
+++ b/src/components/devices/device-upgrade/DeviceFirmwareUpgradeModal.vue
@@ -0,0 +1,93 @@
+<template>
+<a-modal :visible="sVisible"
+         :title="title"
+         :closable="false"
+         centered
+         @update:visible="onVisibleChange"
+         @cancel="onCancel"
+         @ok="onConfirm">
+         <div>
+          升级固件版本: {{ deviceUpgradeInfo?.product_version }}
+         </div>
+</a-modal>
+</template>
+
+<script lang="ts" setup>
+import { defineProps, defineEmits, ref, Ref, watchEffect } from 'vue'
+import { Device, DeviceFirmwareStatusEnum, DeviceFirmwareStatus, DeviceFirmwareTypeEnum } from '/@/types/device'
+import { getDeviceUpgradeInfo, GetDeviceUpgradeInfoRsp, DeviceUpgradeBody } from '/@/api/device-upgrade'
+
+const props = defineProps<{
+  visible: boolean,
+  title: string,
+  device: null | Device,
+}>()
+
+const emit = defineEmits(['update:visible', 'ok', 'cancel'])
+
+const deviceUpgradeInfo:Ref<GetDeviceUpgradeInfoRsp> = ref({} as GetDeviceUpgradeInfoRsp)
+const sVisible = ref(false)
+
+watchEffect(() => {
+  sVisible.value = props.visible
+  // 显示弹框时,获取设备升级信息
+  if (props.visible) {
+    initDeviceUpgradeInfo()
+  }
+})
+
+function onVisibleChange (sVisible: boolean) {
+  setVisible(sVisible)
+}
+
+function setVisible (v: boolean, e?: Event) {
+  sVisible.value = v
+  emit('update:visible', v, e)
+}
+
+// 获取设备升级信息
+async function initDeviceUpgradeInfo () {
+  if (!props.device?.device_name) {
+    return
+  }
+  const { code, data } = await getDeviceUpgradeInfo({ device_name: props.device?.device_name })
+  if (code === 0) {
+    deviceUpgradeInfo.value = data && data[0]
+  }
+}
+
+// 提交
+function checkConfirm () {
+  if (!deviceUpgradeInfo.value.product_version) {
+    return false
+  }
+  if (!props.device) {
+    return false
+  }
+  if (props.device.firmware_status !== DeviceFirmwareStatusEnum.ToUpgraded && props.device.firmware_status !== DeviceFirmwareStatusEnum.ConsistencyUpgrade) {
+    return false
+  }
+  return true
+}
+
+function onConfirm (e: Event) {
+  if (!checkConfirm()) {
+    return
+  }
+  setVisible(false, e)
+  emit('ok', [{
+    device_name: props.device?.device_name,
+    sn: props.device?.device_sn,
+    product_version: deviceUpgradeInfo.value.product_version,
+    firmware_upgrade_type: props.device?.firmware_status === DeviceFirmwareStatusEnum.ToUpgraded ? DeviceFirmwareTypeEnum.ToUpgraded : DeviceFirmwareTypeEnum.ConsistencyUpgrade // 1-普通升级,2-一致性升级
+  }] as DeviceUpgradeBody, e)
+}
+
+function onCancel (e: Event) {
+  setVisible(false, e)
+  emit('cancel', e)
+}
+</script>
+
+<style lang="scss" scoped>
+</style>
diff --git a/src/components/devices/device-upgrade/use-device-upgrade-event.ts b/src/components/devices/device-upgrade/use-device-upgrade-event.ts
new file mode 100644
index 0000000..8195a98
--- /dev/null
+++ b/src/components/devices/device-upgrade/use-device-upgrade-event.ts
@@ -0,0 +1,19 @@
+import EventBus from '/@/event-bus/'
+import { onMounted, onBeforeUnmount } from 'vue'
+import { DeviceCmdExecuteInfo, DeviceCmdExecuteStatus } from '/@/types/device-cmd'
+
+export function useDeviceUpgradeEvent (onDeviceUpgradeWs: (payload: DeviceCmdExecuteInfo) => void): void {
+  function handleDeviceUpgrade (payload: any) {
+    onDeviceUpgradeWs(payload.data)
+    // eslint-disable-next-line no-unused-expressions
+    // console.log('payload', payload.data)
+  }
+
+  onMounted(() => {
+    EventBus.on('deviceUpgrade', handleDeviceUpgrade)
+  })
+
+  onBeforeUnmount(() => {
+    EventBus.off('deviceUpgrade', handleDeviceUpgrade)
+  })
+}
diff --git a/src/components/devices/device-upgrade/use-device-upgrade.ts b/src/components/devices/device-upgrade/use-device-upgrade.ts
new file mode 100644
index 0000000..2591fa5
--- /dev/null
+++ b/src/components/devices/device-upgrade/use-device-upgrade.ts
@@ -0,0 +1,42 @@
+import { Ref, ref } from 'vue'
+import { Device } from '/@/types/device'
+import { postDeviceUpgrade, DeviceUpgradeBody } from '/@/api/device-upgrade'
+
+export function useDeviceFirmwareUpgrade (workspaceId: string) {
+  const deviceFirmwareUpgradeModalVisible = ref(false)
+  const selectedDevice: Ref<null | Device> = ref(null)
+
+  function setDeviceFirmwareUpgradeModalVisible (visible: boolean) {
+    deviceFirmwareUpgradeModalVisible.value = visible
+  }
+
+  function setSelectedDevice (device: null | Device) {
+    selectedDevice.value = device
+  }
+
+  // 点击设备升级
+  function onDeviceUpgrade (record: Device) {
+    if (!record) {
+      return
+    }
+    setSelectedDevice(record)
+    setDeviceFirmwareUpgradeModalVisible(true)
+  }
+
+  // 确认设备升级
+  async function onUpgradeDeviceOk (deviceUpgradeBody: DeviceUpgradeBody) {
+    const { code } = await postDeviceUpgrade(workspaceId, deviceUpgradeBody)
+    if (code === 0) {
+      // setDeviceFirmwareUpgradeModalVisible(false)
+    }
+  }
+
+  return {
+    deviceFirmwareUpgradeModalVisible,
+    setDeviceFirmwareUpgradeModalVisible,
+    selectedDevice,
+    setSelectedDevice,
+    onDeviceUpgrade,
+    onUpgradeDeviceOk,
+  }
+}
diff --git a/src/components/g-map/DockControlPanel.vue b/src/components/g-map/DockControlPanel.vue
new file mode 100644
index 0000000..284d9ca
--- /dev/null
+++ b/src/components/g-map/DockControlPanel.vue
@@ -0,0 +1,131 @@
+<template>
+<div class="dock-control-panel">
+  <!-- title -->
+  <div class="dock-control-panel-header fz16 pl5 pr5 flex-align-center flex-row flex-justify-between">
+    <span>远程调试 {{ props.sn}}</span>
+    <span @click="closeControlPanel">
+    <CloseOutlined />
+    </span>
+  </div>
+  <!-- cmd -->
+  <div class="control-cmd-wrapper">
+    <div v-for="(cmdItem, index) in cmdList" :key="cmdItem.cmdKey" class="control-cmd-item">
+     <div class="control-cmd-item-left">
+        <div class="item-label">{{ cmdItem.label }}</div>
+        <div class="item-status">{{ cmdItem.status }}</div>
+     </div>
+     <div class="control-cmd-item-right">
+        <a-button :loading="cmdItem.loading" size="small" type="primary" @click="sendControlCmd(cmdItem, index)">
+        {{ cmdItem.operateText }}
+        </a-button>
+     </div>
+   </div>
+ </div>
+</div>
+
+</template>
+
+<script setup lang="ts">
+import { defineProps, defineEmits, ref, watch } from 'vue'
+import {
+  CloseOutlined
+} from '@ant-design/icons-vue'
+import { useDockControl } from './useDockControl'
+import { DeviceInfoType } from '/@/types/device'
+import { cmdList as baseCmdList, DeviceCmdItem } from '/@/types/device-cmd'
+import { useMyStore } from '/@/store'
+import { updateDeviceCmdInfoByOsd, updateDeviceCmdInfoByExecuteInfo } from '/@/utils/device-cmd'
+
+const props = defineProps<{
+  sn: string,
+  deviceInfo: DeviceInfoType,
+}>()
+
+const store = useMyStore()
+const initCmdList = baseCmdList.map(cmdItem => Object.assign({}, cmdItem))
+const cmdList = ref(initCmdList)
+
+// 根据机场指令执行状态更新信息
+watch(() => store.state.devicesCmdExecuteInfo, (devicesCmdExecuteInfo) => {
+  if (props.sn && devicesCmdExecuteInfo[props.sn]) {
+    updateDeviceCmdInfoByExecuteInfo(cmdList.value, devicesCmdExecuteInfo[props.sn])
+  }
+}, {
+  immediate: true,
+  deep: true,
+})
+
+// 根据设备osd信息更新信息
+watch(() => props.deviceInfo, (value) => {
+  updateDeviceCmdInfoByOsd(cmdList.value, value)
+  // console.log('deviceInfo', value)
+}, {
+  immediate: true,
+  deep: true
+})
+
+const emit = defineEmits(['close-control-panel'])
+
+function closeControlPanel () {
+  emit('close-control-panel', props.sn, false)
+}
+
+// dock 控制指令
+const {
+  sendDockControlCmd,
+} = useDockControl()
+
+async function sendControlCmd (cmdItem: DeviceCmdItem, index: number) {
+  const success = await sendDockControlCmd({
+    sn: props.sn,
+    cmd: cmdItem.cmdKey
+  }, true)
+  if (success) {
+    // updateDeviceSingleCmdInfo(cmdList.value[index])
+  }
+}
+
+</script>
+
+<style lang='scss' scoped>
+.dock-control-panel{
+  position: absolute;
+  left: calc(100% + 10px);
+  top: 0px;
+  width: 480px;
+  padding: 0 !important;
+  background: #000;
+  color: #fff;
+  border-radius: 2px;
+
+  .dock-control-panel-header{
+    border-bottom: 1px solid #515151;
+  }
+
+  .control-cmd-wrapper{
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-between;
+    padding: 4px 10px;
+    .control-cmd-item{
+      width: 220px;
+      height: 58px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      border: 1px solid #666;
+      margin: 4px 0;
+      padding: 0 8px;
+
+      .control-cmd-item-left{
+        display: flex;
+        flex-direction: column;
+
+        .item-label{
+          font-weight: 700;
+        }
+      }
+    }
+  }
+}
+</style>
diff --git a/src/components/g-map/useDockControl.ts b/src/components/g-map/useDockControl.ts
new file mode 100644
index 0000000..94e302f
--- /dev/null
+++ b/src/components/g-map/useDockControl.ts
@@ -0,0 +1,48 @@
+import { message } from 'ant-design-vue'
+import { ref } from 'vue'
+import { postSendCmd } from '/@/api/device-cmd'
+import { DeviceCmd } from '/@/types/device-cmd'
+
+export function useDockControl () {
+  const controlPanelVisible = ref(false)
+
+  function setControlPanelVisible (visible: boolean) {
+    controlPanelVisible.value = visible
+  }
+
+  // 远程调试开关
+  async function dockDebugOnOff (sn: string, on: boolean) {
+    const success = await sendDockControlCmd({
+      sn: sn,
+      cmd: on ? DeviceCmd.DebugModeOpen : DeviceCmd.DebugModeClose
+    }, false)
+    if (success) {
+      setControlPanelVisible(on)
+    }
+  }
+
+  // 发送指令
+  async function sendDockControlCmd (params: {
+    sn: string,
+    cmd: DeviceCmd
+  }, tip = true) {
+    try {
+      const { code, message: msg } = await postSendCmd({ dock_sn: params.sn, device_cmd: params.cmd })
+      if (code === 0) {
+        tip && message.success('指令发送成功')
+        return true
+      }
+      throw (msg)
+    } catch (e) {
+      tip && message.error('指令发送失败')
+      return false
+    }
+  }
+
+  return {
+    controlPanelVisible,
+    setControlPanelVisible,
+    sendDockControlCmd,
+    dockDebugOnOff,
+  }
+}
diff --git a/src/event-bus/index.ts b/src/event-bus/index.ts
new file mode 100644
index 0000000..8024981
--- /dev/null
+++ b/src/event-bus/index.ts
@@ -0,0 +1,10 @@
+import mitt, { Emitter } from 'mitt'
+
+type Events = {
+  deviceUpgrade: any;
+  deviceLogUploadProgress: any
+};
+
+const emitter: Emitter<Events> = mitt<Events>()
+
+export default emitter
diff --git a/src/hooks/use-connect-websocket.ts b/src/hooks/use-connect-websocket.ts
new file mode 100644
index 0000000..43fb527
--- /dev/null
+++ b/src/hooks/use-connect-websocket.ts
@@ -0,0 +1,21 @@
+import { onMounted, onUnmounted } from 'vue'
+import ReconnectingWebSocket from 'reconnecting-websocket'
+import ConnectWebSocket, { MessageHandler } from '/@/websocket'
+import { getWebsocketUrl } from '/@/websocket/util/config'
+
+/**
+ * 接收一个message函数
+ * @param messageHandler
+ */
+export function useConnectWebSocket (messageHandler: MessageHandler) {
+  const webSocket = new ConnectWebSocket(getWebsocketUrl())
+
+  onMounted(() => {
+    webSocket?.registerMessageHandler(messageHandler)
+    webSocket?.initSocket()
+  })
+
+  onUnmounted(() => {
+    webSocket?.close()
+  })
+}
diff --git a/src/hooks/use-g-map-cover.ts b/src/hooks/use-g-map-cover.ts
index 1ddf152..38e6d4e 100644
--- a/src/hooks/use-g-map-cover.ts
+++ b/src/hooks/use-g-map-cover.ts
@@ -10,16 +10,18 @@
 
 export function useGMapCover () {
   const root = getRoot()
-  const AMap = root.$aMapObj
+  const AMap = root.$aMap
 
   const normalColor = '#2D8CF0'
   const store = rootStore
   const coverList = store.state.coverList
+
   function AddCoverToMap (cover :any) {
-    root.$aMap.add(cover)
+    root.$map.add(cover)
     coverList.push(cover)
     // console.log('coverList:', store.state.coverList)
   }
+
   function getPinIcon (color?:string) {
     // console.log('color', color)
     const colorObj: {
@@ -31,7 +33,6 @@
       'b620e0': pinb620e0,
       'e23c39': pine23c39,
       'ffbb00': pineffbb00,
-
     }
     const iconName = (color?.replaceAll('#', '') || '').toLocaleLowerCase()
     return new AMap.Icon({
@@ -41,6 +42,7 @@
       // imageSize: new AMap.Size(40, 50)
     })
   }
+
   function init2DPin (name: string, coordinates:GeojsonCoordinate, color?:string, data?:{}) {
     console.log(name, coordinates[0], coordinates[1], color, data)
     const pin = new AMap.Marker({
@@ -54,8 +56,9 @@
     // console.log('coordinates pin', pin)
     AddCoverToMap(pin)
   }
+
   function AddOverlayGroup (overlayGroup) {
-    root.$aMap.add(overlayGroup)
+    root.$map.add(overlayGroup)
     coverList.push(overlayGroup)
   }
   function initPolyline (name: string, coordinates:GeojsonCoordinate[], color?:string, data?:{}) {
@@ -74,6 +77,7 @@
     })
     AddOverlayGroup(polyline)
   }
+
   function initPolygon (name: string, coordinates:GeojsonCoordinate[], color?:string, data?:{}) {
     const path = [] as GeojsonCoordinate[]
     coordinates.forEach(coordinate => {
@@ -92,6 +96,7 @@
     })
     AddOverlayGroup(Polygon)
   }
+
   function removeCoverFromMap (id:string) {
     for (let i = 0; i < coverList.length; i++) {
       const ele = coverList[i]
@@ -99,12 +104,13 @@
       const extdata = ele?.getExtData()
       if (extdata?.id === id) {
         console.log(extdata)
-        root.$aMap.remove(ele)
+        root.$map.remove(ele)
         coverList.slice(i, 1)
         break
       }
     }
   }
+
   function getElementFromMap (id:string) {
     // console.log('start', new Date().getTime())
     const ele = coverList.find(ele => ele?.getExtData().id === id)
@@ -118,6 +124,7 @@
     //   }
     // })
   }
+
   function updatePinElement (id:string, name: string, coordinates:GeojsonCoordinate, color?:string) {
     const element = getElementFromMap(id) as any
     if (element) {
@@ -133,6 +140,7 @@
       })
     }
   }
+
   return {
     init2DPin,
     initPolyline,
diff --git a/src/hooks/use-g-map-tsa.ts b/src/hooks/use-g-map-tsa.ts
index 55b1b59..6db59d8 100644
--- a/src/hooks/use-g-map-tsa.ts
+++ b/src/hooks/use-g-map-tsa.ts
@@ -6,23 +6,30 @@
 
 export function deviceTsaUpdate () {
   const root = getRoot()
-  const AMap = root.$aMapObj
+  const AMap = root.$aMap
 
-  const map = root.$aMap
   const icons: {
     [key: string]: string
   } = {
-    'sub-device' : '/@/assets/icons/drone.png',
+    'sub-device': '/@/assets/icons/drone.png',
     'gateway': '/@/assets/icons/rc.png',
     'dock': '/@/assets/icons/dock.png'
   }
   const markers = store.state.markerInfo.coverMap
   const paths = store.state.markerInfo.pathMap
-  
-  const passedPolyline = new AMap.Polyline({
-    map: map,
-    strokeColor: '#939393' // 线颜色
-  })
+
+  // Fix: 航迹初始化报错
+  // TODO: 从时序上解决
+  let trackLine = null as any
+  function getTrackLineInstance () {
+    if (!trackLine) {
+      trackLine = new AMap.Polyline({
+        map: root.$map,
+        strokeColor: '#939393' // 线颜色
+      })
+    }
+    return trackLine
+  }
 
   function initIcon (type: string) {
     return new AMap.Icon({
@@ -36,13 +43,13 @@
       return
     }
     markers[sn] = new AMap.Marker({
-      position: new AMap.LngLat(lng ? lng : 113.935913, lat ? lat : 22.525335),
+      position: new AMap.LngLat(lng || 113.935913, lat || 22.525335),
       icon: initIcon(type),
       title: name,
       anchor: 'top-center',
       offset: [0, -20],
     })
-    root.$aMap.add(markers[sn])
+    root.$map.add(markers[sn])
 
     // markers[sn].on('moving', function (e: any) {
     //   let path = paths[sn]
@@ -52,19 +59,21 @@
     //   }
     //   path.push(e.passedPath[0])
     //   path.push(e.passedPath[1])
-    //   passedPolyline.setPath(path)
+    //   getTrackLineInstance().setPath(path)
     // })
   }
+
   function removeMarker (sn: string) {
     if (!markers[sn]) {
       return
     }
-    root.$aMap.remove(markers[sn])
-    passedPolyline.setPath([])
+    root.$map.remove(markers[sn])
+    getTrackLineInstance().setPath([])
     delete markers[sn]
     delete paths[sn]
   }
-  function addMarker(sn: string, lng?: number, lat?: number) {
+
+  function addMarker (sn: string, lng?: number, lat?: number) {
     getDeviceBySn(localStorage.getItem(ELocalStorageKey.WorkspaceId)!, sn)
       .then(data => {
         if (data.code !== 0) {
@@ -74,7 +83,8 @@
         initMarker(data.data.domain, data.data.nickname, sn, lng, lat)
       })
   }
-  function moveTo(sn: string, lng: number, lat: number) {
+
+  function moveTo (sn: string, lng: number, lat: number) {
     let marker = markers[sn]
     if (!marker) {
       addMarker(sn, lng, lat)
@@ -86,7 +96,7 @@
       autoRotation: true
     })
   }
-  
+
   return {
     marker: markers,
     initMarker,
diff --git a/src/hooks/use-g-map.ts b/src/hooks/use-g-map.ts
index ebb095d..020d591 100644
--- a/src/hooks/use-g-map.ts
+++ b/src/hooks/use-g-map.ts
@@ -4,30 +4,35 @@
 
 export function useGMapManage () {
   const state = reactive({
-    mapEntity: null,
-    mapObj: null,
+    aMap: null, // Map类
+    map: null, // 地图对象
     mouseTool: null,
   })
+
   async function initMap (container: string, app:App) {
     AMapLoader.load({
       ...AMapConfig
     }).then((AMap) => {
-      state.mapObj = AMap
-      state.mapEntity = new AMap.Map(container, {
+      state.aMap = AMap
+      state.map = new AMap.Map(container, {
         center: [113.935913, 22.525335],
         zoom: 15
       })
-      state.mouseTool = new AMap.MouseTool(state.mapEntity)
-      app.config.globalProperties.$aMap = state.mapEntity
-      app.config.globalProperties.$aMapObj = state.mapObj
+      state.mouseTool = new AMap.MouseTool(state.map)
+
+      // 挂在到全局
+      app.config.globalProperties.$aMap = state.aMap
+      app.config.globalProperties.$map = state.map
       app.config.globalProperties.$mouseTool = state.mouseTool
     }).catch(e => {
       console.log(e)
     })
   }
+
   function globalPropertiesConfig (app:App) {
     initMap('g-container', app)
   }
+
   return {
     globalPropertiesConfig,
   }
diff --git a/src/hooks/use-mouse-tool.ts b/src/hooks/use-mouse-tool.ts
index 2a5aa84..2794b7f 100644
--- a/src/hooks/use-mouse-tool.ts
+++ b/src/hooks/use-mouse-tool.ts
@@ -6,13 +6,14 @@
 
 export function useMouseTool () {
   const root = getRoot()
-  const AMap = root.$aMapObj
+
   const state = reactive({
     pinNum: 0,
     polylineNum: 0,
     PolygonNum: 0,
     currentType: '',
   })
+
   function drawPin (type:MapDoodleType, getDrawCallback:Function) {
     root?.$mouseTool.marker({
       title: type + state.pinNum,
@@ -21,6 +22,7 @@
     state.pinNum++
     root?.$mouseTool.on('draw', getDrawCallback)
   }
+
   function drawPolyline (type:MapDoodleType, getDrawCallback:Function) {
     root?.$mouseTool.polyline({
       strokeColor: '#2d8cf0',
@@ -32,6 +34,7 @@
     })
     root?.$mouseTool.on('draw', getDrawCallback)
   }
+
   function drawPolygon (type:MapDoodleType, getDrawCallback:Function) {
     root?.$mouseTool.polygon({
       strokeColor: '#2d8cf0',
@@ -44,10 +47,12 @@
     })
     root?.$mouseTool.on('draw', getDrawCallback)
   }
+
   function drawOff (type:MapDoodleType) {
     root?.$mouseTool.close()
     root?.$mouseTool.off('draw')
   }
+
   function mouseTool (type: MapDoodleType, getDrawCallback: Function) {
     state.currentType = type
     switch (type) {
@@ -65,6 +70,7 @@
         break
     }
   }
+
   return {
     mouseTool
   }
diff --git a/src/pages/elements/elements.vue b/src/pages/elements/elements.vue
deleted file mode 100644
index deeba41..0000000
--- a/src/pages/elements/elements.vue
+++ /dev/null
@@ -1,21 +0,0 @@
-<template>
-  <div class="element-map-wrapper">
-     <GMap/>
-  </div>
-</template>
-
-<script lang="ts">
-import { defineComponent, onMounted } from 'vue'
-import GMap from '/@/components/GMap.vue'
-export default defineComponent({
-  name: 'Elements',
-  components: { GMap },
-  setup () {
-    return {
-    }
-  },
-})
-</script>
-
-<style lang="scss" scoped>
-</style>
diff --git a/src/pages/page-pilot/pilot-home.vue b/src/pages/page-pilot/pilot-home.vue
index 42416fb..fd15838 100644
--- a/src/pages/page-pilot/pilot-home.vue
+++ b/src/pages/page-pilot/pilot-home.vue
@@ -130,9 +130,8 @@
 import cloudapi from '/@/assets/icons/cloudapi.png'
 import { RightOutlined, CloudOutlined, CloudSyncOutlined, SyncOutlined } from '@ant-design/icons-vue'
 import { useMyStore } from '/@/store'
-import ReconnectingWebSocket from 'reconnecting-websocket'
-import websocket from '/@/api/websocket'
 import { DeviceStatus } from '/@/types/device'
+import { useConnectWebSocket } from '/@/hooks/use-connect-websocket'
 
 const root = getRoot()
 const gatewayState = ref<boolean>(localStorage.getItem(ELocalStorageKey.GatewayOnline) === 'true')
@@ -211,8 +210,10 @@
 
 const store = useMyStore()
 
-const wsGetMsg = async (res: any) => {
-  const payload = JSON.parse(res.data)
+const messageHandler = async (payload: any) => {
+  if (!payload) {
+    return
+  }
   switch (payload.biz_code) {
     case EBizCode.DeviceOnline: {
       console.info('online: ', payload)
@@ -241,8 +242,11 @@
       break
   }
 }
+
+// 监听ws 消息
+useConnectWebSocket(messageHandler)
+
 let bindNum: number
-let socket: ReconnectingWebSocket
 
 onMounted(() => {
   apiPilot.onBackClickReg()
@@ -259,8 +263,6 @@
   }
   device.data.sn = apiPilot.getAircraftSN()
   getDeviceInfo()
-
-  socket = websocket.init(wsGetMsg)
 
   const isLoaded = apiPilot.isComponentLoaded(EComponentName.Thing)
   if (isLoaded) {
@@ -300,10 +302,6 @@
   window.wsConnectCallback = arg => {
     wsConnectCallback(arg)
   }
-})
-
-onUnmounted(() => {
-  socket.close()
 })
 
 const connectCallback = async (arg: any) => {
diff --git a/src/pages/page-web/home.vue b/src/pages/page-web/home.vue
new file mode 100644
index 0000000..78bec53
--- /dev/null
+++ b/src/pages/page-web/home.vue
@@ -0,0 +1,71 @@
+<template>
+  <a-layout class="width-100 flex-display" style="height: 100vh">
+    <a-layout-header class="header">
+      <Topbar />
+    </a-layout-header>
+    <a-layout-content>
+      <router-view />
+    </a-layout-content>
+
+  </a-layout>
+</template>
+
+<script lang="ts" setup>
+import Topbar from '/@/components/common/topbar.vue'
+import { onMounted, reactive, ref, UnwrapRef, watch } from 'vue'
+import { getRoot } from '/@/root'
+import { EBizCode, ELocalStorageKey, ERouterName } from '/@/types'
+import { useConnectWebSocket } from '/@/hooks/use-connect-websocket'
+import EventBus from '/@/event-bus'
+
+interface FormState {
+  user: string
+  password: string
+}
+
+const root = getRoot()
+
+const messageHandler = async (payload: any) => {
+  if (!payload) {
+    return
+  }
+  switch (payload.biz_code) {
+    case EBizCode.DeviceUpgrade: {
+      EventBus.emit('deviceUpgrade', payload)
+      break
+    }
+    case EBizCode.DeviceLogUploadProgress: {
+      EventBus.emit('deviceLogUploadProgress', payload)
+      break
+    }
+  }
+}
+
+// 监听ws 消息
+useConnectWebSocket(messageHandler)
+
+onMounted(() => {
+  const token = localStorage.getItem(ELocalStorageKey.Token)
+  if (!token) {
+    root.$router.push(ERouterName.PROJECT)
+  }
+})
+
+</script>
+
+<style lang="scss" scoped>
+@import '/@/styles/index.scss';
+
+.fontBold {
+  font-weight: 500;
+  font-size: 18px;
+}
+
+.header {
+  background-color: black;
+  color: white;
+  height: 60px;
+  font-size: 15px;
+  padding: 0 20px;
+}
+</style>
diff --git a/src/pages/project-app/index.vue b/src/pages/page-web/index.vue
similarity index 92%
rename from src/pages/project-app/index.vue
rename to src/pages/page-web/index.vue
index b5a855d..8616925 100644
--- a/src/pages/project-app/index.vue
+++ b/src/pages/page-web/index.vue
@@ -34,7 +34,7 @@
           class="m0"
           type="primary"
           html-type="submit"
-          :disabled="formState.user === '' || formState.password === ''"
+          :disabled="loginBtnDisabled"
           @click="onSubmit"
         >
           Login
@@ -49,23 +49,27 @@
 import djiLogo from '/@/assets/icons/dji_logo.png'
 import { LockOutlined, UserOutlined } from '@ant-design/icons-vue'
 import { message } from 'ant-design-vue'
-import { reactive, ref, UnwrapRef } from 'vue'
+import { reactive, computed, UnwrapRef } from 'vue'
 import { login, LoginBody } from '/@/api/manage'
 import { getRoot } from '/@/root'
 import { ELocalStorageKey, ERouterName, EUserType } from '/@/types'
 import router from '/@/router'
 
 const root = getRoot()
+
 const formState: UnwrapRef<LoginBody> = reactive({
   username: 'adminPC',
   password: 'adminPC',
   flag: EUserType.Web,
 })
 
+const loginBtnDisabled = computed(() => {
+  return !formState.username || !formState.password
+})
+
 const onSubmit = async (e: any) => {
   const result = await login(formState)
   if (result.code === 0) {
-    console.log(result)
     localStorage.setItem(ELocalStorageKey.Token, result.data.access_token)
     localStorage.setItem(ELocalStorageKey.WorkspaceId, result.data.workspace_id)
     localStorage.setItem(ELocalStorageKey.Username, result.data.username)
diff --git a/src/pages/project-app/projects/create-plan.vue b/src/pages/page-web/projects/create-plan.vue
similarity index 100%
rename from src/pages/project-app/projects/create-plan.vue
rename to src/pages/page-web/projects/create-plan.vue
diff --git a/src/pages/page-web/projects/devices.vue b/src/pages/page-web/projects/devices.vue
new file mode 100644
index 0000000..c5fd408
--- /dev/null
+++ b/src/pages/page-web/projects/devices.vue
@@ -0,0 +1,436 @@
+
+<template>
+  <a-menu v-model:selectedKeys="current" mode="horizontal" @select="select">
+    <a-menu-item :key="EDeviceTypeName.Aircraft" class="ml20">
+      Aircraft
+    </a-menu-item>
+    <a-menu-item :key="EDeviceTypeName.Dock">
+      Dock
+    </a-menu-item>
+  </a-menu>
+  <div class="device-table-wrap table flex-display flex-column">
+    <a-table :columns="columns" :data-source="data.device" :pagination="paginationProp" @change="refreshData" row-key="device_sn" :expandedRowKeys="expandRows"
+    :row-selection="rowSelection" :rowClassName="rowClassName" :scroll="{ x: '100%', y: 600 }"
+      :expandIcon="expandIcon" :loading="loading">
+      <template v-for="col in ['nickname']" #[col]="{ text, record }" :key="col">
+        <div>
+          <a-input
+            v-if="editableData[record.device_sn]"
+            v-model:value="editableData[record.device_sn][col]"
+            style="margin: -5px 0"
+          />
+          <template v-else>
+            {{ text }}
+          </template>
+        </div>
+      </template>
+      <template v-for="col in ['sn', 'workspace']" #[col]="{ text }" :key="col">
+        <a-tooltip :title="text">
+            <span>{{ text }}</span>
+        </a-tooltip>
+      </template>
+      <!-- 固件版本 -->
+      <template #firmware_version="{ record }">
+        <span v-if="judgeCurrentType(EDeviceTypeName.Dock)">
+          <DeviceFirmwareUpgrade :device="record"
+                                  class="table-flex-col"
+                                  @device-upgrade="onDeviceUpgrade"
+                                 />
+        </span>
+        <span v-else>
+          {{ record.firmware_version }}
+        </span>
+      </template>
+      <!-- 状态 -->
+      <template #status="{ text }">
+        <span v-if="text" class="flex-row flex-align-center">
+            <span class="mr5" style="width: 12px; height: 12px; border-radius: 50%; background-color: green;" />
+            <span>Online</span>
+        </span>
+        <span class="flex-row flex-align-center" v-else>
+            <span class="mr5" style="width: 12px; height: 12px; border-radius: 50%; background-color: red;" />
+            <span>Offline</span>
+        </span>
+      </template>
+      <!-- 操作 -->
+      <template #action="{ record }">
+        <div class="editable-row-operations">
+          <!-- 编辑态操作 -->
+          <div v-if="editableData[record.device_sn]">
+            <a-tooltip title="Confirm changes">
+              <span @click="save(record)" style="color: #28d445;"><CheckOutlined /></span>
+            </a-tooltip>
+            <a-tooltip title="Modification canceled">
+              <span @click="() => delete editableData[record.device_sn]" style="color: #e70102;"><CloseOutlined /></span>
+            </a-tooltip>
+          </div>
+          <!-- 非编辑态操作 -->
+          <div v-else class="flex-align-center flex-row" style="color: #2d8cf0">
+            <a-tooltip v-if="current.indexOf(EDeviceTypeName.Dock) !== -1" title="设备日志">
+              <CloudServerOutlined @click="showDeviceLogUploadRecord(record)"/>
+            </a-tooltip>
+            <a-tooltip v-if="current.indexOf(EDeviceTypeName.Dock) !== -1" title="Hms Info">
+              <FileSearchOutlined @click="showHms(record)"/>
+            </a-tooltip>
+            <a-tooltip title="Edit">
+              <EditOutlined @click="edit(record)"/>
+            </a-tooltip>
+            <a-tooltip title="Delete">
+              <DeleteOutlined @click="() => { deleteTip = true, deleteSn = record.device_sn }"/>
+            </a-tooltip>
+          </div>
+        </div>
+      </template>
+
+    </a-table>
+    <a-modal v-model:visible="deleteTip" width="450px" :closable="false" centered :okButtonProps="{ danger: true }" @ok="unbind">
+        <p class="pt10 pl20" style="height: 50px;">Delete device from workspace?</p>
+        <template #title>
+            <div class="flex-row flex-justify-center">
+                <span>Delete devices</span>
+            </div>
+        </template>
+    </a-modal>
+
+    <!-- 设备升级 -->
+    <DeviceFirmwareUpgradeModal title="设备升级"
+      v-model:visible="deviceFirmwareUpgradeModalVisible"
+      :device="selectedDevice"
+      @ok="onUpgradeDeviceOk"
+    ></DeviceFirmwareUpgradeModal>
+
+    <!-- 设备日志上传记录 -->
+    <DeviceLogUploadRecordDrawer
+      v-model:visible="deviceLogUploadRecordVisible"
+      :device="currentDevice"
+    ></DeviceLogUploadRecordDrawer>
+
+    <!-- hms 信息 -->
+    <DeviceHmsDrawer
+       v-model:visible="hmsVisible"
+      :device="currentDevice">
+    </DeviceHmsDrawer>
+  </div>
+</template>
+<script lang="ts" setup>
+import { ColumnProps, TableState } from 'ant-design-vue/lib/table/interface'
+import { h, onMounted, reactive, ref, UnwrapRef } from 'vue'
+import { IPage } from '/@/api/http/type'
+import { BindBody, bindDevice, getBindingDevices, unbindDevice, updateDevice } from '/@/api/manage'
+import { EDeviceTypeName, ELocalStorageKey } from '/@/types'
+import { EditOutlined, CheckOutlined, CloseOutlined, DeleteOutlined, FileSearchOutlined, CloudServerOutlined } from '@ant-design/icons-vue'
+import { Device, DeviceFirmwareStatusEnum } from '/@/types/device'
+import DeviceFirmwareUpgrade from '/@/components/devices/device-upgrade/DeviceFirmwareUpgrade.vue'
+import DeviceFirmwareUpgradeModal from '/@/components/devices/device-upgrade/DeviceFirmwareUpgradeModal.vue'
+import { useDeviceFirmwareUpgrade } from '/@/components/devices/device-upgrade/use-device-upgrade'
+import { useDeviceUpgradeEvent } from '/@/components/devices/device-upgrade/use-device-upgrade-event'
+import { DeviceCmdExecuteInfo, DeviceCmdExecuteStatus } from '/@/types/device-cmd'
+import DeviceLogUploadRecordDrawer from '/@/components/devices/device-log/DeviceLogUploadRecordDrawer.vue'
+import DeviceHmsDrawer from '/@/components/devices/device-hms/DeviceHmsDrawer.vue'
+import { message } from 'ant-design-vue'
+
+interface DeviceData {
+  device: Device[]
+}
+
+const loading = ref(true)
+const deleteTip = ref<boolean>(false)
+const deleteSn = ref<string>()
+const columns: ColumnProps[] = [
+  { title: 'Model', dataIndex: 'device_name', width: 100, className: 'titleStyle' },
+  { title: 'SN', dataIndex: 'device_sn', width: 100, className: 'titleStyle', ellipsis: true, slots: { customRender: 'sn' } },
+  {
+    title: 'Name',
+    dataIndex: 'nickname',
+    width: 100,
+    sorter: (a: Device, b: Device) => a.nickname.localeCompare(b.nickname),
+    className: 'titleStyle',
+    ellipsis: true,
+    slots: { customRender: 'nickname' }
+  },
+  { title: 'Firmware Version', dataIndex: 'firmware_version', width: 150, className: 'titleStyle', slots: { customRender: 'firmware_version' } },
+  { title: 'Status', dataIndex: 'status', width: 100, className: 'titleStyle', slots: { customRender: 'status' } },
+  {
+    title: 'Workspace',
+    dataIndex: 'workspace_name',
+    width: 100,
+    className: 'titleStyle',
+    ellipsis: true,
+    slots: { customRender: 'workspace' },
+    customRender: ({ text, record, index }) => {
+      const obj = {
+        children: text,
+        props: {} as any,
+      }
+      if (current.value.indexOf(EDeviceTypeName.Dock) !== -1) {
+        if (record.domain === EDeviceTypeName.Aircraft) {
+          obj.children = ''
+        }
+      }
+      return obj
+    }
+  },
+  { title: 'Joined', dataIndex: 'bound_time', width: 150, sorter: (a: Device, b: Device) => a.bound_time.localeCompare(b.bound_time), className: 'titleStyle' },
+  { title: 'Last Online', dataIndex: 'login_time', width: 150, sorter: (a: Device, b: Device) => a.login_time.localeCompare(b.login_time), className: 'titleStyle' },
+  {
+    title: 'Actions',
+    dataIndex: 'actions',
+    width: 100,
+    className: 'titleStyle',
+    slots: { customRender: 'action' }
+  },
+]
+
+const expandIcon = (props: any) => {
+  if (judgeCurrentType(EDeviceTypeName.Dock) && !props.expanded) {
+    return h('div',
+      {
+        style: 'border-left: 2px solid rgb(200,200,200); border-bottom: 2px solid rgb(200,200,200); height: 16px; width: 16px; float: left;',
+        class: 'mt-5 ml0',
+      })
+  }
+}
+
+const rowClassName = (record: any, index: number) => {
+  const className = []
+  if ((index & 1) === 0) {
+    className.push('table-striped')
+  }
+  if (record.domain !== EDeviceTypeName.Dock) {
+    className.push('child-row')
+  }
+  return className.toString().replaceAll(',', ' ')
+}
+
+const expandRows = ref<string[]>([])
+const data = reactive<DeviceData>({
+  device: []
+})
+
+const paginationProp = reactive({
+  pageSizeOptions: ['20', '50', '100'],
+  showQuickJumper: true,
+  showSizeChanger: true,
+  pageSize: 50,
+  current: 1,
+  total: 0
+})
+
+// 获取分页信息
+function getPaginationBody () {
+  return {
+    page: paginationProp.current,
+    page_size: paginationProp.pageSize
+  } as IPage
+}
+
+const rowSelection = {
+  onChange: (selectedRowKeys: (string | number)[], selectedRows: []) => {
+    console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows)
+  },
+  onSelect: (record: any, selected: boolean, selectedRows: []) => {
+    console.log(record, selected, selectedRows)
+  },
+  onSelectAll: (selected: boolean, selectedRows: [], changeRows: []) => {
+    console.log(selected, selectedRows, changeRows)
+  },
+  getCheckboxProps: (record: any) => ({
+    disabled: judgeCurrentType(EDeviceTypeName.Dock) && record.domain !== EDeviceTypeName.Dock,
+    style: judgeCurrentType(EDeviceTypeName.Dock) && record.domain !== EDeviceTypeName.Dock ? 'display: none' : ''
+  }),
+}
+type Pagination = TableState['pagination']
+
+const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || ''
+const editableData: UnwrapRef<Record<string, Device>> = reactive({})
+const current = ref([EDeviceTypeName.Aircraft])
+
+function judgeCurrentType (type: EDeviceTypeName): boolean {
+  return current.value.indexOf(type) !== -1
+}
+
+// 设备升级
+const {
+  deviceFirmwareUpgradeModalVisible,
+  selectedDevice,
+  onDeviceUpgrade,
+  onUpgradeDeviceOk
+} = useDeviceFirmwareUpgrade(workspaceId)
+
+function onDeviceUpgradeWs (payload: DeviceCmdExecuteInfo) {
+  updateDevicesByWs(data.device, payload)
+}
+
+function updateDevicesByWs (devices: Device[], payload: DeviceCmdExecuteInfo) {
+  if (!devices || devices.length <= 0) {
+    return
+  }
+  for (let i = 0; i < devices.length; i++) {
+    if (devices[i].device_sn === payload.sn) {
+      if (!payload.output) return
+      const { status, progress } = payload.output
+      if (status === DeviceCmdExecuteStatus.Sent || status === DeviceCmdExecuteStatus.InProgress) { // 升级中
+        devices[i].firmware_status = DeviceFirmwareStatusEnum.DuringUpgrade
+        devices[i].firmware_progress = progress?.percent || 0
+      } else { // 终态:成功,失败,超时
+        if (status === DeviceCmdExecuteStatus.Failed || status === DeviceCmdExecuteStatus.Timeout) {
+          message.error(`设备(${payload.sn}) 升级失败`)
+        }
+        // 拉取列表
+        getDevices(current.value[0], true)
+      }
+      return
+    }
+    if (devices[i].children) {
+      updateDevicesByWs(devices[i].children || [], payload)
+    }
+  }
+}
+
+useDeviceUpgradeEvent(onDeviceUpgradeWs)
+
+// 获取设备列表信息
+function getDevices (domain: string, closeLoading?: boolean) {
+  if (!closeLoading) {
+    loading.value = true
+  }
+  getBindingDevices(workspaceId, getPaginationBody(), domain).then(res => {
+    if (res.code !== 0) {
+      return
+    }
+    const resData: Device[] = res.data.list
+    expandRows.value = []
+    resData.forEach((val: any) => {
+      if (val.children) {
+        val.children = [val.children]
+      }
+      if (judgeCurrentType(EDeviceTypeName.Dock)) {
+        expandRows.value.push(val.device_sn)
+      }
+    })
+    data.device = resData
+    paginationProp.total = res.data.pagination.total
+    paginationProp.current = res.data.pagination.page
+    paginationProp.pageSize = res.data.pagination.page_size
+    loading.value = false
+  })
+}
+
+function refreshData (page: Pagination) {
+  paginationProp.current = page?.current!
+  paginationProp.pageSize = page?.pageSize!
+  getDevices(current.value[0])
+}
+
+// 编辑
+function edit (record: Device) {
+  editableData[record.device_sn] = record
+}
+
+// 保存
+function save (record: Device) {
+  delete editableData[record.device_sn]
+  updateDevice({ nickname: record.nickname }, workspaceId, record.device_sn)
+}
+
+// 删除
+function showDeleteTip (sn: any) {
+  deleteTip.value = true
+}
+
+// 解绑
+function unbind () {
+  deleteTip.value = false
+  unbindDevice(deleteSn.value?.toString()!).then(res => {
+    if (res.code !== 0) {
+      return
+    }
+    getDevices(current.value[0])
+  })
+}
+
+// 选择设备
+function select (item: any) {
+  getDevices(item.key)
+}
+
+const currentDevice = ref({} as Device)
+// 设备日志
+const deviceLogUploadRecordVisible = ref(false)
+function showDeviceLogUploadRecord (dock: Device) {
+  deviceLogUploadRecordVisible.value = true
+  currentDevice.value = dock
+}
+
+// 健康状态
+const hmsVisible = ref<boolean>(false)
+
+function showHms (dock: Device) {
+  hmsVisible.value = true
+  currentDevice.value = dock
+}
+
+onMounted(() => {
+  getDevices(current.value[0])
+})
+</script>
+
+<style lang="scss" scoped>
+.device-table-wrap{
+  .editable-row-operations{
+    div > span {
+      margin-right: 10px;
+    }
+  }
+}
+</style>
+
+<style lang="scss">
+.table {
+  background-color: white;
+  margin: 20px;
+  padding: 20px;
+  height: 88vh;
+}
+.table-striped {
+  background-color: #f7f9fa;
+}
+.ant-table {
+  border-top: 1px solid rgb(0,0,0,0.06);
+  border-bottom: 1px solid rgb(0,0,0,0.06);
+}
+.ant-table-tbody tr td {
+  border: 0;
+}
+.ant-table td {
+  white-space: nowrap;
+}
+.ant-table-thead tr th {
+  background: white !important;
+  border: 0;
+}
+th.ant-table-selection-column {
+  background-color: white !important;
+}
+.ant-table-header {
+  background-color: white !important;
+}
+.child-row {
+  height: 70px;
+}
+.notice {
+  background: $success;
+  overflow: hidden;
+  cursor: pointer;
+}
+.caution {
+  background: orange;
+  cursor: pointer;
+  overflow: hidden;
+}
+.warn {
+  background: red;
+  cursor: pointer;
+  overflow: hidden;
+}
+</style>
diff --git a/src/pages/project-app/projects/dock.vue b/src/pages/page-web/projects/dock.vue
similarity index 100%
rename from src/pages/project-app/projects/dock.vue
rename to src/pages/page-web/projects/dock.vue
diff --git a/src/pages/project-app/projects/layer.vue b/src/pages/page-web/projects/layer.vue
similarity index 100%
rename from src/pages/project-app/projects/layer.vue
rename to src/pages/page-web/projects/layer.vue
diff --git a/src/pages/project-app/projects/livestream.vue b/src/pages/page-web/projects/livestream.vue
similarity index 100%
rename from src/pages/project-app/projects/livestream.vue
rename to src/pages/page-web/projects/livestream.vue
diff --git a/src/pages/project-app/projects/media.vue b/src/pages/page-web/projects/media.vue
similarity index 100%
rename from src/pages/project-app/projects/media.vue
rename to src/pages/page-web/projects/media.vue
diff --git a/src/pages/project-app/projects/members.vue b/src/pages/page-web/projects/members.vue
similarity index 90%
rename from src/pages/project-app/projects/members.vue
rename to src/pages/page-web/projects/members.vue
index be0ad1e..642599a 100644
--- a/src/pages/project-app/projects/members.vue
+++ b/src/pages/page-web/projects/members.vue
@@ -57,13 +57,13 @@
   member: Member[]
 }
 const columns = [
-  { title: 'Account', dataIndex: 'username', width: 250, sorter: (a: Member, b: Member) => a.username.localeCompare(b.username), className: 'titleStyle' },
-  { title: 'User Type', dataIndex: 'user_type', width: 250, className: 'titleStyle' },
-  { title: 'Workspace Name', dataIndex: 'workspace_name', width: 250, className: 'titleStyle' },
-  { title: 'Mqtt Username', dataIndex: 'mqtt_username', width: 250, className: 'titleStyle', slots: { customRender: 'mqtt_username' } },
-  { title: 'Mqtt Password', dataIndex: 'mqtt_password', width: 250, className: 'titleStyle', slots: { customRender: 'mqtt_password' } },
-  { title: 'Joined', dataIndex: 'create_time', width: 250, sorter: (a: Member, b: Member) => a.create_time.localeCompare(b.create_time), className: 'titleStyle' },
-  { title: 'Action', dataIndex: 'action', className: 'titleStyle', slots: { customRender: 'action' } },
+  { title: 'Account', dataIndex: 'username', width: 150, sorter: (a: Member, b: Member) => a.username.localeCompare(b.username), className: 'titleStyle' },
+  { title: 'User Type', dataIndex: 'user_type', width: 150, className: 'titleStyle' },
+  { title: 'Workspace Name', dataIndex: 'workspace_name', width: 150, className: 'titleStyle' },
+  { title: 'Mqtt Username', dataIndex: 'mqtt_username', width: 150, className: 'titleStyle', slots: { customRender: 'mqtt_username' } },
+  { title: 'Mqtt Password', dataIndex: 'mqtt_password', width: 150, className: 'titleStyle', slots: { customRender: 'mqtt_password' } },
+  { title: 'Joined', dataIndex: 'create_time', width: 150, sorter: (a: Member, b: Member) => a.create_time.localeCompare(b.create_time), className: 'titleStyle' },
+  { title: 'Action', dataIndex: 'action', width: 100, className: 'titleStyle', slots: { customRender: 'action' } },
 ]
 
 const data = reactive<MemberData>({
@@ -117,7 +117,6 @@
     data.member = userList
     paginationProp.total = res.data.pagination.total
     paginationProp.current = res.data.pagination.page
-
   })
 }
 
diff --git a/src/pages/project-app/projects/task.vue b/src/pages/page-web/projects/task.vue
similarity index 100%
rename from src/pages/project-app/projects/task.vue
rename to src/pages/page-web/projects/task.vue
diff --git a/src/pages/project-app/projects/tsa.vue b/src/pages/page-web/projects/tsa.vue
similarity index 98%
rename from src/pages/project-app/projects/tsa.vue
rename to src/pages/page-web/projects/tsa.vue
index f1d1d30..b7bfe47 100644
--- a/src/pages/project-app/projects/tsa.vue
+++ b/src/pages/page-web/projects/tsa.vue
@@ -24,9 +24,9 @@
                     </a-tooltip>
                   </div>
                   <div class="mt5 flex-align-center flex-row flex-justify-between" style="background: #595959;">
-                    <div>
+                    <div class="flex-align-center flex-row">
                       <span class="ml5 mr5"><RobotOutlined /></span>
-                      <span class="font-bold" :style="dockInfo[dock.gateway.sn] && dockInfo[dock.gateway.sn].mode_code !== EDockModeCode.Disconnected ? 'color: #00ee8b' :  'color: red;'">
+                      <span class="font-bold text-hidden" style="max-width: 80px;" :style="dockInfo[dock.gateway.sn] && dockInfo[dock.gateway.sn].mode_code !== EDockModeCode.Disconnected ? 'color: #00ee8b' :  'color: red;'">
                         {{ dockInfo[dock.gateway.sn] ? EDockModeCode[dockInfo[dock.gateway.sn].mode_code] : EDockModeCode[EDockModeCode.Disconnected] }}
                       </span>
                     </div>
diff --git a/src/pages/project-app/projects/wayline.vue b/src/pages/page-web/projects/wayline.vue
similarity index 95%
rename from src/pages/project-app/projects/wayline.vue
rename to src/pages/page-web/projects/wayline.vue
index 3ef8e32..b64e8e8 100644
--- a/src/pages/project-app/projects/wayline.vue
+++ b/src/pages/page-web/projects/wayline.vue
@@ -8,6 +8,7 @@
       </a-row>
     </div>
     <div class="height-100">
+    <a-spin :spinning="loading" :delay="1000" tip="downloading" size="large">
       <div class="scrollbar uranus-scrollbar" v-if="waylinesData.data.length !== 0" @scroll="onScroll">
         <div v-for="wayline in waylinesData.data" :key="wayline.id">
           <div class="wayline-panel" style="padding-top: 5px;" @click="selectRoute(wayline)">
@@ -62,6 +63,7 @@
               </div>
           </template>
       </a-modal>
+    </a-spin>
     </div>
   </div>
 </template>
@@ -79,6 +81,7 @@
 import { downloadFile } from '/@/utils/common'
 import { IPage } from '/@/api/http/type'
 
+const loading = ref(false)
 const store = useMyStore()
 const pagination :IPage = {
   page: 1,
@@ -154,12 +157,15 @@
 }
 
 function downloadWayline (waylineId: string, fileName: string) {
+  loading.value = true
   downloadWaylineFile(workspaceId, waylineId).then(res => {
-    if (res.code && res.code !== 0) {
+    if (!res) {
       return
     }
-    const data = new Blob([res.data], { type: 'application/zip' })
+    const data = new Blob([res], { type: 'application/zip' })
     downloadFile(data, fileName + '.kmz')
+  }).finally(() => {
+    loading.value = false
   })
 }
 
diff --git a/src/pages/project-app/projects/workspace.vue b/src/pages/page-web/projects/workspace.vue
similarity index 77%
rename from src/pages/project-app/projects/workspace.vue
rename to src/pages/page-web/projects/workspace.vue
index b8dba51..4fc4dd3 100644
--- a/src/pages/project-app/projects/workspace.vue
+++ b/src/pages/page-web/projects/workspace.vue
@@ -21,22 +21,23 @@
 </template>
 <script lang="ts" setup>
 
-import Sidebar from '../sidebar.vue'
+import Sidebar from '/@/components/common/sidebar.vue'
 import MediaPanel from '/@/components/MediaPanel.vue'
 import TaskPanel from '/@/components/TaskPanel.vue'
 import GMap from '/@/components/GMap.vue'
 import { EBizCode, ERouterName } from '/@/types'
 import { getRoot } from '/@/root'
-import { onMounted, onUnmounted, watch } from 'vue'
-import ReconnectingWebSocket from 'reconnecting-websocket'
 import { useMyStore } from '/@/store'
-import websocket from '/@/api/websocket'
-// import { enableAgoraLive, enableOthersLive } from '/@/pages/project-app/projects/livestream.vue'
+import { useConnectWebSocket } from '/@/hooks/use-connect-websocket'
 
 const root = getRoot()
+const store = useMyStore()
 
-const wsGetMsg = async (res: any) => {
-  const payload = JSON.parse(res.data)
+const messageHandler = async (payload: any) => {
+  if (!payload) {
+    return
+  }
+
   switch (payload.biz_code) {
     case EBizCode.GatewayOsd: {
       store.commit('SET_GATEWAY_INFO', payload.data)
@@ -78,21 +79,33 @@
       store.commit('SET_DEVICE_HMS_INFO', payload.data)
       break
     }
+    case EBizCode.DeviceReboot:
+    case EBizCode.DroneOpen:
+    case EBizCode.DroneClose:
+    case EBizCode.CoverOpen:
+    case EBizCode.CoverClose:
+    case EBizCode.PutterOpen:
+    case EBizCode.PutterClose:
+    case EBizCode.ChargeOpen:
+    case EBizCode.ChargeClose:
+    case EBizCode.DeviceFormat:
+    case EBizCode.DroneFormat:
+    {
+      store.commit('SET_DEVICES_CMD_EXECUTE_INFO', {
+        biz_code: payload.biz_code,
+        timestamp: payload.timestamp,
+        ...payload.data,
+      })
+      break
+    }
     default:
       break
   }
 }
 
-const store = useMyStore()
+// 监听ws 消息
+useConnectWebSocket(messageHandler)
 
-let socket: ReconnectingWebSocket
-
-onMounted(() => {
-  socket = websocket.init(wsGetMsg)
-})
-onUnmounted(() => {
-  socket.close()
-})
 </script>
 <style lang="scss" scoped>
 @import '/@/styles/index.scss';
diff --git a/src/pages/project-app/home.vue b/src/pages/project-app/home.vue
deleted file mode 100644
index c06bc5c..0000000
--- a/src/pages/project-app/home.vue
+++ /dev/null
@@ -1,57 +0,0 @@
-<template>
-  <a-layout class="width-100 flex-display" style="height: 100vh">
-    <a-layout-header class="header">
-      <Topbar />
-    </a-layout-header>
-    <a-layout-content>
-      <router-view />
-    </a-layout-content>
-
-  </a-layout>
-</template>
-
-<script lang="ts" setup>
-import Topbar from './topbar.vue'
-import { message } from 'ant-design-vue'
-import { onMounted, reactive, ref, UnwrapRef, watch } from 'vue'
-import { getPlatformInfo, getUserInfo } from '/@/api/manage'
-import websocket from '/@/api/websocket'
-import { useGMapCover } from '/@/hooks/use-g-map-cover'
-import { getRoot } from '/@/root'
-import { useMyStore } from '/@/store'
-import { ELocalStorageKey, ERouterName } from '/@/types'
-import ReconnectingWebSocket from 'reconnecting-websocket'
-
-interface FormState {
-  user: string
-  password: string
-}
-
-const root = getRoot()
-const showLogin = ref(true)
-
-onMounted(() => {
-  const token = localStorage.getItem(ELocalStorageKey.Token)
-  if (!token) {
-    root.$router.push(ERouterName.PROJECT)
-  }
-})
-
-</script>
-
-<style lang="scss" scoped>
-@import '/@/styles/index.scss';
-
-.fontBold {
-  font-weight: 500;
-  font-size: 18px;
-}
-
-.header {
-  background-color: black;
-  color: white;
-  height: 60px;
-  font-size: 15px;
-  padding: 0 20px;
-}
-</style>
diff --git a/src/pages/project-app/projects/devices.vue b/src/pages/project-app/projects/devices.vue
deleted file mode 100644
index 71201ec..0000000
--- a/src/pages/project-app/projects/devices.vue
+++ /dev/null
@@ -1,518 +0,0 @@
-
-<template>
-  <a-menu v-model:selectedKeys="current" mode="horizontal" @select="select">
-    <a-menu-item :key="EDeviceTypeName.Aircraft" class="ml20">
-      Aircraft
-    </a-menu-item>
-    <a-menu-item :key="EDeviceTypeName.Dock">
-      Dock
-    </a-menu-item>
-  </a-menu>
-  <div class="table flex-display flex-column">
-    <a-table :columns="columns" :data-source="data.device" :pagination="paginationProp" @change="refreshData" row-key="device_sn" :expandedRowKeys="expandRows"
-    :row-selection="rowSelection" :rowClassName="rowClassName" :scroll="{ x: '100%', y: 600 }"
-      :expandIcon="expandIcon" :loading="loading">
-      <template v-for="col in ['nickname']" #[col]="{ text, record }" :key="col">
-        <div>
-          <a-input
-            v-if="editableData[record.device_sn]"
-            v-model:value="editableData[record.device_sn][col]"
-            style="margin: -5px 0"
-          />
-          <template v-else>
-            {{ text }}
-          </template>
-        </div>
-      </template>
-      <template v-for="col in ['sn', 'workspace']" #[col]="{ text }" :key="col">
-        <a-tooltip :title="text">
-            <span>{{ text }}</span>
-        </a-tooltip>
-      </template>
-      <template #status="{ text }">
-        <span v-if="text" class="flex-row flex-align-center">
-            <span class="mr5" style="width: 12px; height: 12px; border-radius: 50%; background-color: green;" />
-            <span>Online</span>
-        </span>
-        <span class="flex-row flex-align-center" v-else>
-            <span class="mr5" style="width: 12px; height: 12px; border-radius: 50%; background-color: red;" />
-            <span>Offline</span>
-        </span>
-      </template>
-      <template #action="{ record }">
-        <div class="editable-row-operations">
-          <span v-if="editableData[record.device_sn]">
-            <a-tooltip title="Confirm changes">
-              <span @click="save(record)" style="color: #28d445;"><CheckOutlined /></span>
-            </a-tooltip>
-            <a-tooltip title="Modification canceled">
-              <span @click="() => delete editableData[record.device_sn]" class="ml15" style="color: #e70102;"><CloseOutlined /></span>
-            </a-tooltip>
-          </span>
-          <span v-else class="flex-align-center flex-row" style="color: #2d8cf0">
-            <a-tooltip v-if="current.indexOf(EDeviceTypeName.Dock) !== -1" title="Hms Info">
-              <FileSearchOutlined @click="showHms(record)"/>
-            </a-tooltip>
-            <a-tooltip title="Edit">
-             <EditOutlined @click="edit(record)" class="ml10" />
-            </a-tooltip>
-            <a-tooltip title="Delete">
-              <DeleteOutlined @click="() => { deleteTip = true, deleteSn = record.device_sn }" class="ml15" />
-            </a-tooltip>
-          </span>
-        </div>
-      </template>
-
-    </a-table>
-    <a-modal v-model:visible="deleteTip" width="450px" :closable="false" centered :okButtonProps="{ danger: true }" @ok="unbind">
-        <p class="pt10 pl20" style="height: 50px;">Delete device from workspace?</p>
-        <template #title>
-            <div class="flex-row flex-justify-center">
-                <span>Delete devices</span>
-            </div>
-        </template>
-    </a-modal>
-
-    <a-drawer
-      title="Hms Info"
-      placement="right"
-      v-model:visible="hmsVisible"
-      :width="800">
-      <div class="flex-row flex-align-center">
-        <div style="width: 240px;">
-          <a-range-picker
-            v-model:value="time"
-            format="YYYY-MM-DD"
-            :placeholder="['Start Time', 'End Time']"
-            @change="onTimeChange"/>
-        </div>
-        <div class="ml5">
-          <a-select
-            style="width: 150px"
-            v-model:value="param.level"
-            @select="onLevelSelect">
-            <a-select-option
-              v-for="item in levels"
-              :key="item.label"
-              :value="item.value"
-            >
-              {{ item.label }}
-            </a-select-option>
-          </a-select>
-        </div>
-        <div class="ml5">
-          <a-select
-            v-model:value="param.domain"
-            :disabled="!param.children_sn || !param.device_sn"
-            style="width: 150px"
-            @select="onDeviceTypeSelect">
-            <a-select-option
-              v-for="item in deviceTypes"
-              :key="item.label"
-              :value="item.value"
-            >
-              {{ item.label }}
-            </a-select-option>
-          </a-select>
-        </div>
-        <div class="ml5">
-          <a-input-search
-            v-model:value="param.message"
-            placeholder="input search message"
-            style="width: 200px"
-            @search="getHms"/>
-        </div>
-      </div>
-      <div>
-        <a-table :columns="hmsColumns"  :scroll="{ x: '100%', y: 600 }" :data-source="hmsData.data" :pagination="hmsPaginationProp" @change="refreshHmsData" row-key="hms_id"
-          :rowClassName="rowClassName" :loading="loading">
-          <template #time="{ record }">
-            <div>{{ record.create_time }}</div>
-            <div :style="record.update_time ? '' : record.level === EHmsLevel.CAUTION ? 'color: orange;' :
-              record.level === EHmsLevel.WARN ? 'color: red;' : 'color: #28d445;'">{{ record.update_time ?? 'It is happening...' }}</div>
-          </template>
-          <template #level="{ text }">
-            <div class="flex-row flex-align-center">
-              <div :class="text === EHmsLevel.CAUTION ? 'caution' : text === EHmsLevel.WARN ? 'warn' : 'notice'" style="width: 10px; height: 10px; border-radius: 50%;"></div>
-              <div style="margin-left: 3px;">{{ EHmsLevel[text] }}</div>
-            </div>
-          </template>
-          <template v-for="col in ['code', 'message']" #[col]="{ text }" :key="col">
-            <a-tooltip :title="text">
-                <span>{{ text }}</span>
-            </a-tooltip>
-          </template>
-        </a-table>
-      </div>
-    </a-drawer>
-  </div>
-</template>
-<script lang="ts" setup>
-import { message } from 'ant-design-vue'
-import { ColumnProps, TableState } from 'ant-design-vue/lib/table/interface'
-import { h, onMounted, reactive, ref, UnwrapRef } from 'vue'
-import { IPage } from '/@/api/http/type'
-import { BindBody, bindDevice, getBindingDevices, getDeviceHms, HmsQueryBody, unbindDevice, updateDevice } from '/@/api/manage'
-import { EDeviceTypeName, EHmsLevel, ELocalStorageKey } from '/@/types'
-import { EditOutlined, CheckOutlined, CloseOutlined, DeleteOutlined, FileSearchOutlined } from '@ant-design/icons-vue'
-import { Device, DeviceHms } from '/@/types/device'
-import moment, { Moment } from 'moment'
-
-interface DeviceData {
-  device: Device[]
-}
-const loading = ref(true)
-const deleteTip = ref<boolean>(false)
-const deleteSn = ref<string>()
-const hmsVisible = ref<boolean>(false)
-const columns: ColumnProps[] = [
-  { title: 'Model', dataIndex: 'device_name', width: '10%', className: 'titleStyle' },
-  { title: 'SN', dataIndex: 'device_sn', width: '10%', className: 'titleStyle', ellipsis: true, slots: { customRender: 'sn' } },
-  {
-    title: 'Name',
-    dataIndex: 'nickname',
-    width: '15%',
-    sorter: (a: Device, b: Device) => a.nickname.localeCompare(b.nickname),
-    className: 'titleStyle',
-    ellipsis: true,
-    slots: { customRender: 'nickname' }
-  },
-  { title: 'Firmware Version', dataIndex: 'firmware_version', width: '10%', className: 'titleStyle' },
-  { title: 'Status', dataIndex: 'status', width: '100px', className: 'titleStyle', slots: { customRender: 'status' } },
-  {
-    title: 'Workspace',
-    dataIndex: 'workspace_name',
-    width: '10%',
-    className: 'titleStyle',
-    ellipsis: true,
-    slots: { customRender: 'workspace' },
-    customRender: ({ text, record, index }) => {
-      const obj = {
-        children: text,
-        props: {} as any,
-      }
-      if (current.value.indexOf(EDeviceTypeName.Aircraft) !== -1 || (!record.child_device_sn && record.domain === EDeviceTypeName.Dock)) {
-        return obj
-      }
-
-      obj.props.rowSpan = record.domain === EDeviceTypeName.Dock ? 2 : 0
-      return obj
-    }
-  },
-  { title: 'Joined', dataIndex: 'bound_time', width: '15%', sorter: (a: Device, b: Device) => a.bound_time.localeCompare(b.bound_time), className: 'titleStyle' },
-  { title: 'Last Online', dataIndex: 'login_time', width: '15%', sorter: (a: Device, b: Device) => a.login_time.localeCompare(b.login_time), className: 'titleStyle' },
-  {
-    title: 'Actions',
-    dataIndex: 'actions',
-    className: 'titleStyle',
-    slots: { customRender: 'action' }
-  },
-]
-const expandIcon = (props: any) => {
-  if (judgeCurrentType(EDeviceTypeName.Dock) && !props.expanded) {
-    return h('div',
-      {
-        style: 'border-left: 2px solid rgb(200,200,200); border-bottom: 2px solid rgb(200,200,200); height: 16px; width: 16px; float: left;',
-        class: 'mt-5 ml0',
-      })
-  }
-}
-const rowClassName = (record: any, index: number) => {
-  const className = []
-  if ((index & 1) === 0) {
-    className.push('table-striped')
-  }
-  if (record.domain !== EDeviceTypeName.Dock) {
-    className.push('child-row')
-  }
-  return className.toString().replaceAll(',', ' ')
-}
-
-const expandRows = ref<string[]>([])
-const data = reactive<DeviceData>({
-  device: []
-})
-
-const paginationProp = reactive({
-  pageSizeOptions: ['20', '50', '100'],
-  showQuickJumper: true,
-  showSizeChanger: true,
-  pageSize: 50,
-  current: 1,
-  total: 0
-})
-
-const rowSelection = {
-  onChange: (selectedRowKeys: (string | number)[], selectedRows: []) => {
-    console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows)
-  },
-  onSelect: (record: any, selected: boolean, selectedRows: []) => {
-    console.log(record, selected, selectedRows)
-  },
-  onSelectAll: (selected: boolean, selectedRows: [], changeRows: []) => {
-    console.log(selected, selectedRows, changeRows)
-  },
-  getCheckboxProps: (record: any) => ({
-    disabled: judgeCurrentType(EDeviceTypeName.Dock) && record.domain !== EDeviceTypeName.Dock,
-    style: judgeCurrentType(EDeviceTypeName.Dock) && record.domain !== EDeviceTypeName.Dock ? 'display: none' : ''
-  }),
-}
-type Pagination = TableState['pagination']
-
-const body: IPage = {
-  page: 1,
-  total: 0,
-  page_size: 50
-}
-const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId)!
-
-const editableData: UnwrapRef<Record<string, Device>> = reactive({})
-
-const current = ref([EDeviceTypeName.Aircraft])
-
-onMounted(() => {
-  getDevices(workspaceId, body, current.value[0])
-})
-
-function judgeCurrentType (type: EDeviceTypeName): boolean {
-  return current.value.indexOf(type) !== -1
-}
-
-function getDevices (workspaceId: string, body: IPage, domain: string) {
-  loading.value = true
-  getBindingDevices(workspaceId, body, domain).then(res => {
-    if (res.code !== 0) {
-      return
-    }
-    const resData: Device[] = res.data.list
-    expandRows.value = []
-    resData.forEach((val: any) => {
-      if (val.children) {
-        val.children = [val.children]
-      }
-      if (judgeCurrentType(EDeviceTypeName.Dock)) {
-        expandRows.value.push(val.device_sn)
-      }
-    })
-    data.device = resData
-    paginationProp.total = res.data.pagination.total
-    paginationProp.current = res.data.pagination.page
-    loading.value = false
-  })
-}
-
-function refreshData (page: Pagination) {
-  body.page = page?.current!
-  body.page_size = page?.pageSize!
-  getDevices(workspaceId, body, current.value[0])
-}
-
-function edit (record: Device) {
-  editableData[record.device_sn] = record
-}
-
-function save (record: Device) {
-  delete editableData[record.device_sn]
-  updateDevice({ nickname: record.nickname }, workspaceId, record.device_sn)
-}
-
-function showDeleteTip (sn: any) {
-  deleteTip.value = true
-}
-
-function unbind () {
-  deleteTip.value = false
-  unbindDevice(deleteSn.value?.toString()!).then(res => {
-    if (res.code !== 0) {
-      return
-    }
-    getDevices(workspaceId, body, current.value[0])
-  })
-}
-
-function select (item: any) {
-  getDevices(workspaceId, body, item.key)
-}
-
-const hmsColumns: ColumnProps[] = [
-  { title: 'Alarm Begin | End Time', dataIndex: 'create_time', width: '25%', className: 'titleStyle', slots: { customRender: 'time' } },
-  { title: 'Level', dataIndex: 'level', width: '120px', className: 'titleStyle', slots: { customRender: 'level' } },
-  { title: 'Device', dataIndex: 'domain', width: '12%', className: 'titleStyle' },
-  { title: 'Error Code', dataIndex: 'key', width: '20%', className: 'titleStyle', slots: { customRender: 'code' } },
-  { title: 'Hms Message', dataIndex: 'message_en', className: 'titleStyle', ellipsis: true, slots: { customRender: 'message' } },
-]
-
-interface DeviceHmsData {
-  data: DeviceHms[]
-}
-const hmsData = reactive<DeviceHmsData>({
-  data: []
-})
-
-const hmsPaginationProp = reactive({
-  pageSizeOptions: ['20', '50', '100'],
-  showQuickJumper: true,
-  showSizeChanger: true,
-  pageSize: 50,
-  current: 1,
-  total: 0
-})
-
-const hmsPage: IPage = {
-  page: 1,
-  total: 0,
-  page_size: 50
-}
-
-function showHms (dock: Device) {
-  hmsVisible.value = true
-  if (dock.domain === EDeviceTypeName.Dock) {
-    param.domain = ''
-    getDeviceHmsBySn(dock.device_sn, dock.children?.[0].device_sn ?? '')
-  }
-  if (dock.domain === EDeviceTypeName.Aircraft) {
-    param.domain = EDeviceTypeName.Aircraft
-    getDeviceHmsBySn('', dock.device_sn)
-  }
-}
-
-function refreshHmsData (page: Pagination) {
-  hmsPage.page = page?.current!
-  hmsPage.page_size = page?.pageSize!
-  getHms()
-}
-
-const param = reactive<HmsQueryBody>({
-  sns: [],
-  device_sn: '',
-  children_sn: '',
-  language: 'en',
-  begin_time: new Date(new Date().setDate(new Date().getDate() - 7)).setHours(0, 0, 0, 0),
-  end_time: new Date().setHours(23, 59, 59, 999),
-  domain: '',
-  level: '',
-  message: ''
-})
-
-const levels = [
-  {
-    label: 'All',
-    value: ''
-  }, {
-    label: EHmsLevel[0],
-    value: EHmsLevel.NOTICE
-  }, {
-    label: EHmsLevel[1],
-    value: EHmsLevel.CAUTION
-  }, {
-    label: EHmsLevel[2],
-    value: EHmsLevel.WARN
-  }
-]
-
-const deviceTypes = [
-  {
-    label: 'All',
-    value: ''
-  }, {
-    label: EDeviceTypeName.Aircraft,
-    value: EDeviceTypeName.Aircraft
-  }, {
-    label: EDeviceTypeName.Dock,
-    value: EDeviceTypeName.Dock
-  }
-]
-
-const time = ref([moment(param.begin_time), moment(param.end_time)])
-
-function getHms () {
-  getDeviceHms(param, workspaceId, hmsPage)
-    .then(res => {
-      hmsPaginationProp.total = res.data.pagination.total
-      hmsPaginationProp.current = res.data.pagination.page
-      hmsData.data = res.data.list
-      hmsData.data.forEach(hms => {
-        hms.domain = hms.sn === param.children_sn ? EDeviceTypeName.Aircraft : EDeviceTypeName.Dock
-      })
-    })
-}
-
-function getDeviceHmsBySn (sn: string, childSn: string) {
-  param.device_sn = sn
-  param.children_sn = childSn
-  param.sns = [param.device_sn, param.children_sn]
-  getHms()
-}
-
-function onTimeChange (newTime: [Moment, Moment]) {
-  param.begin_time = newTime[0].valueOf()
-  param.end_time = newTime[1].valueOf()
-  getHms()
-}
-
-function onDeviceTypeSelect (val: string) {
-  param.sns = [param.device_sn, param.children_sn]
-  if (val === EDeviceTypeName.Dock) {
-    param.sns = [param.device_sn, '']
-  }
-  if (val === EDeviceTypeName.Aircraft) {
-    param.sns = ['', param.children_sn]
-  }
-  getHms()
-}
-
-function onLevelSelect (val: number) {
-  param.level = val
-  getHms()
-}
-</script>
-<style lang="scss">
-
-.table {
-  background-color: white;
-  margin: 20px;
-  padding: 20px;
-  height: 88vh;
-}
-.table-striped {
-  background-color: #f7f9fa;
-}
-.ant-table {
-  border-top: 1px solid rgb(0,0,0,0.06);
-  border-bottom: 1px solid rgb(0,0,0,0.06);
-}
-.ant-table-tbody tr td {
-  border: 0;
-}
-.ant-table td {
-  white-space: nowrap;
-}
-.ant-table-thead tr th {
-  background: white !important;
-  border: 0;
-}
-th.ant-table-selection-column {
-  background-color: white !important;
-}
-.ant-table-header {
-  background-color: white !important;
-}
-.child-row {
-  height: 70px;
-}
-.notice {
-  background: $success;
-  overflow: hidden;
-  cursor: pointer;
-}
-.caution {
-  background: orange;
-  cursor: pointer;
-  overflow: hidden;
-}
-.warn {
-  background: red;
-  cursor: pointer;
-  overflow: hidden;
-}
-</style>
diff --git a/src/root.ts b/src/root.ts
index a3bba92..db3944f 100644
--- a/src/root.ts
+++ b/src/root.ts
@@ -1,8 +1,8 @@
 import { createApp, ComponentCustomProperties, App as VueApp } from 'vue'
 declare module '@vue/runtime-core' {
   interface ComponentCustomProperties {
-    $aMap: any
-    $aMapObj: any
+    $aMap: any // Map类
+    $map: any // 地图对象
     $mouseTool: any
   }
 }
diff --git a/src/router/index.ts b/src/router/index.ts
index 78f8bb5..8b20a35 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -1,8 +1,8 @@
 import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
 import { ERouterName } from '/@/types/index'
-import CreatePlan from '../pages/project-app/projects/create-plan.vue'
-import WaylinePanel from '/@/pages/project-app/projects/wayline.vue'
-import DockPanel from '/@/pages/project-app/projects/dock.vue'
+import CreatePlan from '../pages/page-web/projects/create-plan.vue'
+import WaylinePanel from '/@/pages/page-web/projects/wayline.vue'
+import DockPanel from '/@/pages/page-web/projects/dock.vue'
 import LiveAgora from '/@/components/livestream-agora.vue'
 import LiveOthers from '/@/components/livestream-others.vue'
 
@@ -11,38 +11,41 @@
     path: '/',
     redirect: '/' + ERouterName.PROJECT
   },
+  // 首页
   {
     path: '/' + ERouterName.PROJECT,
     name: ERouterName.PROJECT,
-    component: () => import('/@/pages/project-app/index.vue')
+    component: () => import('/@/pages/page-web/index.vue')
   },
+  // members, devices
   {
     path: '/' + ERouterName.HOME,
     name: ERouterName.HOME,
-    component: () => import('/@/pages/project-app/home.vue'),
+    component: () => import('/@/pages/page-web/home.vue'),
     children: [
       {
         path: '/' + ERouterName.MEMBERS,
         name: ERouterName.MEMBERS,
-        component: () => import('/@/pages/project-app/projects/members.vue')
+        component: () => import('/@/pages/page-web/projects/members.vue')
       },
       {
         path: '/' + ERouterName.DEVICES,
         name: ERouterName.DEVICES,
-        component: () => import('/@/pages/project-app/projects/devices.vue')
+        component: () => import('/@/pages/page-web/projects/devices.vue')
       }
     ]
   },
+  // workspace
   {
     path: '/' + ERouterName.WORKSPACE,
     name: ERouterName.WORKSPACE,
-    component: () => import('/@/pages/project-app/projects/workspace.vue'),
+    component: () => import('/@/pages/page-web/projects/workspace.vue'),
     redirect: '/' + ERouterName.TSA,
     children: [
       {
         path: '/' + ERouterName.LIVESTREAM,
         name: ERouterName.LIVESTREAM,
-        component: () => import('/@/pages/project-app/projects/livestream.vue'),
+        component: () => import('/@/pages/page-web/projects/livestream.vue'),
         children: [
           {
             path: ERouterName.LIVING,
@@ -56,27 +59,27 @@
       },
       {
         path: '/' + ERouterName.TSA,
-        component: () => import('/@/pages/project-app/projects/tsa.vue')
+        component: () => import('/@/pages/page-web/projects/tsa.vue')
       },
       {
         path: '/' + ERouterName.LAYER,
         name: ERouterName.LAYER,
-        component: () => import('/@/pages/project-app/projects/layer.vue')
+        component: () => import('/@/pages/page-web/projects/layer.vue')
       },
       {
         path: '/' + ERouterName.MEDIA,
         name: ERouterName.MEDIA,
-        component: () => import('/@/pages/project-app/projects/media.vue')
+        component: () => import('/@/pages/page-web/projects/media.vue')
       },
       {
         path: '/' + ERouterName.WAYLINE,
         name: ERouterName.WAYLINE,
-        component: () => import('/@/pages/project-app/projects/wayline.vue')
+        component: () => import('/@/pages/page-web/projects/wayline.vue')
       },
       {
         path: '/' + ERouterName.TASK,
         name: ERouterName.TASK,
-        component: () => import('/@/pages/project-app/projects/task.vue'),
+        component: () => import('/@/pages/page-web/projects/task.vue'),
         children: [
           {
             path: ERouterName.CREATE_PLAN,
@@ -98,6 +101,7 @@
       }
     ]
   },
+  // pilot
   {
     path: '/' + ERouterName.PILOT,
     name: ERouterName.PILOT,
@@ -118,11 +122,6 @@
   {
     path: '/' + ERouterName.PILOT_BIND,
     component: () => import('/@/pages/page-pilot/pilot-bind.vue')
-  },
-  {
-    path: '/' + ERouterName.ELEMENT,
-    name: ERouterName.ELEMENT,
-    component: () => import('/@/pages/elements/elements.vue')
   }
 ]
 
diff --git a/src/store/index.ts b/src/store/index.ts
index bdcd972..36a7725 100644
--- a/src/store/index.ts
+++ b/src/store/index.ts
@@ -5,6 +5,7 @@
 import { getLayers } from '/@/api/layer'
 import { LayerType } from '/@/types/mapLayer'
 import { ETaskStatus, TaskInfo, WaylineFile } from '/@/types/wayline'
+import { DevicesCmdExecuteInfo } from '/@/types/device-cmd'
 
 const initStateFunc = () => ({
   Layers: [
@@ -87,7 +88,10 @@
   },
   hmsInfo: {} as {
     [sn: string]: DeviceHms[]
-  }
+  },
+  // 机场指令执行状态信息
+  devicesCmdExecuteInfo: {
+  } as DevicesCmdExecuteInfo
 })
 
 export type RootStateType = ReturnType<typeof initStateFunc>
@@ -144,7 +148,6 @@
     delete state.deviceState.deviceInfo[info.sn]
     delete state.deviceState.dockInfo[info.sn]
     delete state.hmsInfo[info.sn]
-    
     // delete state.markerInfo.coverMap[info.sn]
     // delete state.markerInfo.pathMap[info.sn]
   },
@@ -171,6 +174,25 @@
   SET_DEVICE_HMS_INFO (state, info) {
     const hmsList: Array<DeviceHms> = state.hmsInfo[info.sn]
     state.hmsInfo[info.sn] = info.host.concat(hmsList ?? [])
+  },
+  SET_DEVICES_CMD_EXECUTE_INFO (state, info) { // 保存设备指令ws消息推送
+    if (!info.sn) {
+      return
+    }
+    if (state.devicesCmdExecuteInfo[info.sn]) {
+      const index = state.devicesCmdExecuteInfo[info.sn].findIndex(cmdExecuteInfo => cmdExecuteInfo.biz_code === info.biz_code)
+      if (index >= 0) {
+        // 丢弃前面的消息
+        if (state.devicesCmdExecuteInfo[info.sn][index].timestamp > info.timestamp) {
+          return
+        }
+        state.devicesCmdExecuteInfo[info.sn][index] = info
+      } else {
+        state.devicesCmdExecuteInfo[info.sn].push(info)
+      }
+    } else {
+      state.devicesCmdExecuteInfo[info.sn] = [info]
+    }
   }
 }
 
diff --git a/src/styles/flex.style.scss b/src/styles/flex.style.scss
index 4dddf26..25ad19a 100644
--- a/src/styles/flex.style.scss
+++ b/src/styles/flex.style.scss
@@ -44,6 +44,18 @@
   justify-content: space-around;
 }
 
+.flex-1 {
+  flex: 1;
+}
+
+.flex-shrink-0 {
+  flex-shrink: 0;
+}
+
+.flex-shrink-1 {
+  flex-shrink: 1;
+}
+
 //width
 .width-100vw {
   width: 100vw;
diff --git a/src/types/airport-tsa.ts b/src/types/airport-tsa.ts
new file mode 100644
index 0000000..c672f36
--- /dev/null
+++ b/src/types/airport-tsa.ts
@@ -0,0 +1,38 @@
+// 机场存储容量:总容量(单位:KB)、已使用(单位:KB)
+export interface AirportStorage {
+  total: number, // 单位:KB
+  used: number
+}
+
+// 舱盖状态
+export enum CoverStateEnum {
+  Close = 0, // 关闭
+  Open = 1, // 打开
+  HalfOpen = 2, // 半打开
+  Failed = 3 // 失败
+}
+
+// 推杆状态
+export enum PutterStateEnum {
+  Close = 0, // 关闭
+  Open = 1, // 打开
+  HalfOpen = 2, // 半打开
+  Failed = 3 // 失败
+}
+
+// 充电状态
+export enum ChargeStateEnum {
+  NotCharge = 0, // 空闲
+  Charge = 1, // 正在充电
+}
+
+export interface DroneChargeState {
+  state: ChargeStateEnum,
+  capacity_percent: string,
+}
+
+// 补光灯状态
+export enum SupplementLightStateEnum {
+  Close = 0, // 关闭
+  Open = 1, // 打开
+}
diff --git a/src/types/device-cmd.ts b/src/types/device-cmd.ts
new file mode 100644
index 0000000..1230881
--- /dev/null
+++ b/src/types/device-cmd.ts
@@ -0,0 +1,210 @@
+// 机场指令集
+export enum DeviceCmd {
+  // 简单指令
+  DebugModeOpen = 'debug_mode_open', // 调试模式开启
+  DebugModeClose = 'debug_mode_close', // 调试模式关闭
+  SupplementLightOpen = 'supplement_light_open', // 打开补光灯
+  SupplementLightClose = 'supplement_light_close', // 关闭补光灯
+  ReturnHome = 'return_home', // 一键返航
+  // 复杂指令
+  DeviceReboot = 'device_reboot', // 机场重启
+  DroneOpen = 'drone_open', // 飞行器开机
+  DroneClose = 'drone_close', // 飞行器关机
+  // DeviceCheck = 'device_check', // 一键排障(一键起飞自检)
+  DeviceFormat = 'device_format', // 机场数据格式化
+  DroneFormat = 'drone_format', // 飞行器数据格式化
+  CoverOpen = 'cover_open', // 打开舱盖
+  CoverClose = 'cover_close', // 关闭舱盖
+  PutterOpen = 'putter_open', // 推杆展开
+  PutterClose = 'putter_close', // 推杆闭合
+  ChargeOpen = 'charge_open', // 打开充电
+  ChargeClose = 'charge_close', // 关闭充电
+}
+
+export interface DeviceCmdItem{
+  label: string, // 标题
+  status: string, // 当前状态
+  operateText: string, // 按钮文字
+  cmdKey: DeviceCmd, // 请求指令
+  oppositeCmdKey?: DeviceCmd, // 相反状态指令
+  func: string, // 处理函数
+  loading: boolean // 按钮loading
+}
+
+// 机场指令
+export const cmdList: DeviceCmdItem[] = [
+  {
+    // iconName: ,
+    label: '机场系统',
+    status: '工作中',
+    operateText: '重启',
+    cmdKey: DeviceCmd.DeviceReboot,
+    func: 'deviceReboot',
+    loading: false,
+    // btnAnimationIconName: '',
+    // operateTips: '',
+    // statusColor: '',
+  },
+  {
+    label: '飞行器',
+    status: '关机',
+    operateText: '开机',
+    cmdKey: DeviceCmd.DroneOpen,
+    oppositeCmdKey: DeviceCmd.DroneClose,
+    func: 'droneStatus',
+    loading: false,
+  },
+  {
+    label: '舱盖',
+    status: '关',
+    operateText: '开启',
+    cmdKey: DeviceCmd.CoverOpen,
+    oppositeCmdKey: DeviceCmd.CoverClose,
+    func: 'coverStatus',
+    loading: false,
+  },
+  {
+    label: '推杆',
+    status: '闭合',
+    operateText: '展开',
+    cmdKey: DeviceCmd.PutterOpen,
+    oppositeCmdKey: DeviceCmd.PutterClose,
+    func: 'putterStatus',
+    loading: false,
+  },
+  {
+    label: '充电状态',
+    status: '未充电',
+    operateText: '充电',
+    cmdKey: DeviceCmd.ChargeOpen,
+    oppositeCmdKey: DeviceCmd.ChargeClose,
+    func: 'chargeStatus',
+    loading: false,
+  },
+  {
+    label: '一键返航',
+    status: '--',
+    operateText: '返航',
+    cmdKey: DeviceCmd.ReturnHome,
+    func: 'returnHome',
+    loading: false,
+  },
+  {
+    label: '机场存储',
+    status: '--',
+    operateText: '格式化',
+    cmdKey: DeviceCmd.DeviceFormat,
+    func: 'deviceFormat',
+    loading: false,
+  },
+  {
+    label: '飞行器存储',
+    status: '--',
+    operateText: '格式化',
+    cmdKey: DeviceCmd.DroneFormat,
+    func: 'droneFormat',
+    loading: false,
+  },
+  {
+    label: '补光灯',
+    status: '关',
+    operateText: '打开',
+    cmdKey: DeviceCmd.SupplementLightOpen,
+    oppositeCmdKey: DeviceCmd.SupplementLightClose,
+    func: 'supplementLightStatus',
+    loading: false,
+  },
+]
+
+export enum DeviceCmdStatusText {
+  DeviceRebootNormalText = '工作中',
+  DeviceRebootInProgressText = '重启中...',
+  DeviceRebootFailedText = '重启失败',
+
+  DroneStatusOpenNormalText = '开',
+  DroneStatusOpenInProgressText = '开机中...',
+  DroneStatusOpenFailedText = '关',
+  DroneStatusOpenBtnText = '关机',
+
+  DroneStatusCloseNormalText = '关',
+  DroneStatusCloseInProgressText = '关机中...',
+  DroneStatusCloseFailedText = '开',
+  DroneStatusCloseBtnText = '开机',
+
+  DeviceCoverOpenNormalText = '开',
+  DeviceCoverOpenInProgressText = '开启中...',
+  DeviceCoverOpenFailedText = '关',
+  DeviceCoverOpenBtnText = '关闭',
+
+  DeviceCoverCloseNormalText = '关',
+  DeviceCoverCloseInProgressText = '关闭中...',
+  DeviceCoverCloseFailedText = '开',
+  DeviceCoverCloseBtnText = '开启',
+
+  DevicePutterOpenNormalText = '展开',
+  DevicePutterOpenBtnText = '闭合',
+  DevicePutterOpenInProgressText = '推杆展开中',
+  DevicePutterOpenFailedText = '闭合',
+
+  DevicePutterCloseNormalText = '闭合',
+  DevicePutterCloseInProgressText = '推杆闭合中',
+  DevicePutterCloseFailedText = '展开',
+  DevicePutterCloseBtnText = '展开',
+
+  DeviceChargeOpenNormalText = '充电',
+  DeviceChargeOpenInProgressText = '充电中...',
+  DeviceChargeOpenFailedText = '未充电',
+  DeviceChargeOpenBtnText = '断电',
+
+  DeviceChargeCloseNormalText = '断电',
+  DeviceChargeCloseInProgressText = '断电中...',
+  DeviceChargeCloseFailedText = '充电',
+  DeviceChargeCloseBtnText = '充电',
+
+  DeviceFormatInProgressText = '格式化...',
+  DeviceFormatFailedText = '格式化失败',
+
+  DroneFormatInProgressText = '格式化...',
+  DroneFormatFailedText = '格式化失败',
+
+  DeviceSupplementLightOpenNormalText = '开',
+  DeviceSupplementLightOpenInProgressText = '开启中...',
+  DeviceSupplementLightOpenFailedText = '关',
+  DeviceSupplementLightOpenBtnText = '关闭',
+
+  DeviceSupplementLightCloseNormalText = '关',
+  DeviceSupplementLightCloseText = '关闭中...',
+  DeviceSupplementLightCloseFailedText = '开',
+  DeviceSupplementLightCloseBtnText = '打开',
+}
+
+// cmd ws 消息状态
+export enum DeviceCmdExecuteStatus {
+  Sent = 'sent', // 已下发
+  InProgress = 'in_progress', // 执行中
+  OK = 'ok', // 执行成功
+  Failed = 'failed', // 失败
+  Canceled = 'canceled', // 取消
+  Timeout = 'timeout' // 超时
+}
+
+export interface DeviceCmdExecuteInfo {
+  biz_code: string,
+  timestamp: number,
+  sn: string,
+  bid: string,
+  output:{
+    status: DeviceCmdExecuteStatus,
+    progress?: {
+      percent: number,
+      step_key: string,
+      step_result: number
+    }
+  }
+  result: number,
+}
+
+// 所有机场的指令执行状态
+export interface DevicesCmdExecuteInfo {
+  [key: string]: DeviceCmdExecuteInfo[], // sn --- DeviceCmdExecuteInfo
+}
diff --git a/src/types/device-log.ts b/src/types/device-log.ts
new file mode 100644
index 0000000..307c249
--- /dev/null
+++ b/src/types/device-log.ts
@@ -0,0 +1,65 @@
+import { DOMAIN } from '/@/types/device'
+import { commonColor } from '/@/utils/color'
+
+// 日志上传状态
+export enum DeviceLogUploadStatusEnum {
+  Uploading = 1, //  上传中
+  Done = 2, // 完成
+  Canceled = 3, // 取消
+  Failed = 4, // 失败
+}
+
+export const DeviceLogUploadStatusMap = {
+  [DeviceLogUploadStatusEnum.Uploading]: '上传中',
+  [DeviceLogUploadStatusEnum.Done]: '上传成功',
+  [DeviceLogUploadStatusEnum.Canceled]: '取消上传',
+  [DeviceLogUploadStatusEnum.Failed]: '上传失败',
+}
+
+export const DeviceLogUploadStatusColor = {
+  [DeviceLogUploadStatusEnum.Uploading]: commonColor.BLUE,
+  [DeviceLogUploadStatusEnum.Done]: commonColor.NORMAL,
+  [DeviceLogUploadStatusEnum.Canceled]: commonColor.WARN,
+  [DeviceLogUploadStatusEnum.Failed]: commonColor.FAIL,
+}
+
+// 设备日志上传 ws 消息状态
+export enum DeviceLogUploadStatus {
+  FilePull = 'file_pull', // 拉取日志 可以作为 正在处理中
+  FileZip = 'file_zip', // 拉取日志,日志压缩可以作为 正在处理中
+  FileUploading = 'file_uploading', // 正在上传
+  Canceled = 'canceled', // 取消
+  Timeout = 'timeout', // 超时
+  Failed = 'failed', // 失败
+  OK = 'ok', // 上传成功
+  // Paused = 'paused' // 暂停
+}
+
+export interface DeviceLogUploadInfo {
+  sn: string,
+  bid: string,
+  output:{
+    logs_id: string
+    status: DeviceLogUploadStatus,
+    files: {
+        device_sn: string,
+        device_model_domain: DOMAIN,
+        progress: number,
+        result: number,
+        upload_rate: number,
+        status: DeviceLogUploadStatus
+    }[]
+  }
+  result: number,
+}
+
+// ws status => log status
+export const DeviceLogUploadWsStatusMap = {
+  [DeviceLogUploadStatus.FilePull]: DeviceLogUploadStatusEnum.Uploading,
+  [DeviceLogUploadStatus.FileZip]: DeviceLogUploadStatusEnum.Uploading,
+  [DeviceLogUploadStatus.FileUploading]: DeviceLogUploadStatusEnum.Uploading,
+  [DeviceLogUploadStatus.OK]: DeviceLogUploadStatusEnum.Done,
+  [DeviceLogUploadStatus.Failed]: DeviceLogUploadStatusEnum.Failed,
+  [DeviceLogUploadStatus.Canceled]: DeviceLogUploadStatusEnum.Canceled,
+  [DeviceLogUploadStatus.Timeout]: DeviceLogUploadStatusEnum.Failed,
+}
diff --git a/src/types/device.ts b/src/types/device.ts
index 8a77512..08c285a 100644
--- a/src/types/device.ts
+++ b/src/types/device.ts
@@ -1,16 +1,188 @@
-import { EDeviceTypeName } from ".";
+import { commonColor } from '/@/utils/color'
+
+export interface DeviceValue {
+  key: string; // 'domain-type-subtype'
+  domain: string; // 表示一个领域,作为一个命名空间,暂时分 飞机类-0, 负载类-1,RC类-2,机场类-3 4种
+  type: number; // 设备类型枚举
+  sub_type: number; // 设备类型枚举 负载一般表示镜头
+}
+
+// domain
+export enum DOMAIN {
+  DRONE = '0', // 飞行器
+  PAYLOAD = '1', // 负载
+  RC = '2', // 遥控
+  DOCK = '3', // 机场
+}
+
+// DJI飞机类型
+export enum DRONE_TYPE {
+  M30 = 67,
+  M300 = 60,
+  Phantom4 = 11,
+  Phantom4Pro = 18,
+  Phantom4RTK = 59,
+  Phantom4Advanced = 27,
+  Mavic3EnterpriseAdvanced= 77,
+}
+
+// DJI负载类型枚举值
+export enum PAYLOAD_TYPE {
+  FPV = 39,
+  H20 = 42,
+  H20T = 43,
+  H20N = 61,
+  EP600 = 50,
+  EP800 = 90742,
+  M30D = 52,
+  M30T = 53,
+  XT2 = 26,
+  XTS = 41,
+  Z30 = 20,
+  DockTopCamera = 165,
+
+  M3E = 66,
+  M3T = 67,
+  // UNKNOWN = 65535
+}
+
+// RC type
+export enum RC_TYPE {
+  RC = 56,
+  RCPlus = 119,
+  RC144 = 144,
+}
+
+// DOCK type
+export enum DOCK_TYPE {
+  Dock = 1,
+}
+
+// 设备sub_type 从0升序
+export enum DEVICE_SUB_TYPE {
+  ZERO,
+  ONE,
+  TWO,
+  THREE,
+  UNKNOWN = 65535,
+}
+
+export const DEVICE_MODEL_KEY = {
+  M30: `${DOMAIN.DRONE}-${DRONE_TYPE.M30}-${DEVICE_SUB_TYPE.ZERO}`,
+  M30T: `${DOMAIN.DRONE}-${DRONE_TYPE.M30}-${DEVICE_SUB_TYPE.ONE}`,
+
+  M3E: `${DOMAIN.DRONE}-${DRONE_TYPE.Mavic3EnterpriseAdvanced}-${DEVICE_SUB_TYPE.ZERO}`,
+  M3T: `${DOMAIN.DRONE}-${DRONE_TYPE.Mavic3EnterpriseAdvanced}-${DEVICE_SUB_TYPE.ONE}`,
+
+  M300: `${DOMAIN.DRONE}-${DRONE_TYPE.M300}-${DEVICE_SUB_TYPE.ZERO}`,
+  Phantom4: `${DOMAIN.DRONE}-${DRONE_TYPE.Phantom4}-${DEVICE_SUB_TYPE.ZERO}`,
+  Phantom4Pro: `${DOMAIN.DRONE}-${DRONE_TYPE.Phantom4Pro}-${DEVICE_SUB_TYPE.ZERO}`,
+  Phantom4RTK: `${DOMAIN.DRONE}-${DRONE_TYPE.Phantom4RTK}-${DEVICE_SUB_TYPE.ZERO}`,
+  Phantom4Advanced: `${DOMAIN.DRONE}-${DRONE_TYPE.Phantom4Advanced}-${DEVICE_SUB_TYPE.ZERO}`,
+
+  FPV: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.FPV}-${DEVICE_SUB_TYPE.ZERO}`,
+  H20: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.H20}-${DEVICE_SUB_TYPE.ZERO}`,
+  H20T: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.H20T}-${DEVICE_SUB_TYPE.ZERO}`,
+  H20N: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.H20N}-${DEVICE_SUB_TYPE.ZERO}`,
+  EP600: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.EP600}-${DEVICE_SUB_TYPE.UNKNOWN}`,
+  EP800: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.EP800}-${DEVICE_SUB_TYPE.ZERO}`,
+  M30Camera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.M30D}-${DEVICE_SUB_TYPE.ZERO}`,
+  M30TCamera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.M30T}-${DEVICE_SUB_TYPE.ZERO}`,
+
+  M3ECamera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.M3E}-${DEVICE_SUB_TYPE.ZERO}`,
+  M3TCamera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.M3T}-${DEVICE_SUB_TYPE.ZERO}`,
+  // M3MCamera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.M3M}-${DEVICE_SUB_TYPE.ZERO}`,
+
+  XT2: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.XT2}-${DEVICE_SUB_TYPE.ZERO}`,
+  XTS: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.XTS}-${DEVICE_SUB_TYPE.ZERO}`,
+  Z30: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.Z30}-${DEVICE_SUB_TYPE.ZERO}`,
+  DockTopCamera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.DockTopCamera}-${DEVICE_SUB_TYPE.ZERO}`,
+
+  RC: `${DOMAIN.RC}-${RC_TYPE.RC}-${DEVICE_SUB_TYPE.ZERO}`,
+  RCPlus: `${DOMAIN.RC}-${RC_TYPE.RCPlus}-${DEVICE_SUB_TYPE.ZERO}`,
+
+  Dock: `${DOMAIN.DOCK}-${DOCK_TYPE.Dock}-${DEVICE_SUB_TYPE.ZERO}`,
+}
+
+export const DEVICE_NAME = {
+  // drone
+  [DEVICE_MODEL_KEY.M30]: 'M30',
+  [DEVICE_MODEL_KEY.M30T]: 'M30T',
+  [DEVICE_MODEL_KEY.M3E]: 'Mavic 3E',
+  [DEVICE_MODEL_KEY.M3T]: 'Mavic 3T',
+  // [DEVICE_MODEL_KEY.M3M]: 'Mavic 3M',
+  [DEVICE_MODEL_KEY.M300]: 'M300 RTK',
+  [DEVICE_MODEL_KEY.Phantom4]: 'Phantom 4',
+  [DEVICE_MODEL_KEY.Phantom4Pro]: 'Phantom 4 Pro',
+  [DEVICE_MODEL_KEY.Phantom4RTK]: 'Phantom 4 RTK',
+  [DEVICE_MODEL_KEY.Phantom4Advanced]: 'Phantom 4 Advanced',
+
+  // payload
+  [DEVICE_MODEL_KEY.FPV]: 'FPV',
+  [DEVICE_MODEL_KEY.H20]: 'H20',
+  [DEVICE_MODEL_KEY.H20T]: 'H20T',
+  [DEVICE_MODEL_KEY.H20N]: 'H20N',
+  [DEVICE_MODEL_KEY.EP600]: 'P1',
+  [DEVICE_MODEL_KEY.EP800]: 'L1',
+  [DEVICE_MODEL_KEY.M30Camera]: 'M30 Camera',
+  [DEVICE_MODEL_KEY.M30TCamera]: 'M30T Camera',
+  [DEVICE_MODEL_KEY.M3ECamera]: 'Mavic 3E',
+  [DEVICE_MODEL_KEY.M3TCamera]: 'Mavic 3T',
+  // [DEVICE_MODEL_KEY.M3MCamera]: 'Mavic 3M',
+  [DEVICE_MODEL_KEY.XT2]: 'XT2',
+  [DEVICE_MODEL_KEY.XTS]: 'XTS',
+  [DEVICE_MODEL_KEY.Z30]: 'Z30',
+  [DEVICE_MODEL_KEY.DockTopCamera]: 'Dock Camera',
+
+  // rc
+  [DEVICE_MODEL_KEY.RC]: 'RC',
+  [DEVICE_MODEL_KEY.RCPlus]: 'RC Plus',
+
+  // dock
+  [DEVICE_MODEL_KEY.Dock]: 'Dock',
+}
+
+// 固件升级类型
+export enum DeviceFirmwareTypeEnum {
+  ToUpgraded = 3, // 普通升级
+  ConsistencyUpgrade =2, // 一致性升级
+}
+
+// 固件升级状态
+export enum DeviceFirmwareStatusEnum {
+  None = 1, // 无需升级
+  ToUpgraded = 2, // 待升级
+  ConsistencyUpgrade = 3, // 一致性升级
+  DuringUpgrade = 4, // 升级中
+}
+
+export const DeviceFirmwareStatus = {
+  [DeviceFirmwareStatusEnum.None]: '',
+  [DeviceFirmwareStatusEnum.ToUpgraded]: '待升级',
+  [DeviceFirmwareStatusEnum.ConsistencyUpgrade]: '一致性升级',
+  [DeviceFirmwareStatusEnum.DuringUpgrade]: '升级中',
+}
+
+export const DeviceFirmwareStatusColor = {
+  [DeviceFirmwareStatusEnum.None]: commonColor.WHITE,
+  [DeviceFirmwareStatusEnum.ToUpgraded]: commonColor.BLUE,
+  [DeviceFirmwareStatusEnum.ConsistencyUpgrade]: commonColor.WARN,
+  [DeviceFirmwareStatusEnum.DuringUpgrade]: commonColor.NORMAL,
+}
 
 export interface Device {
   device_name: string,
   device_sn: string,
   nickname: string,
   firmware_version: string,
+  firmware_status: DeviceFirmwareStatusEnum,
   status: string,
   workspace_name: string,
   bound_time: string,
   login_time: string,
-  children?: Device[]
-  domain: string
+  children?: Device[],
+  domain: string,
+  firmware_progress?: number, // 升级进度
 }
 
 export interface DeviceStatus {
@@ -78,7 +250,7 @@
   network_state: {
     type: number,
     quality: number,
-    rate: number, 
+    rate: number,
   },
   drone_in_dock: number,
   drone_charge_state: {
@@ -195,4 +367,12 @@
   create_time: string,
   update_time: string,
   domain: string
-}
\ No newline at end of file
+}
+
+// TODO: 设备拓扑管理优化
+// 设备信息
+export interface DeviceInfoType {
+  gateway: GatewayOsd, // 遥控器
+  dock: DockOsd, // 机场
+  device: DeviceOsd, // 飞机
+}
diff --git a/src/types/enums.ts b/src/types/enums.ts
index 999f1e1..00a298c 100644
--- a/src/types/enums.ts
+++ b/src/types/enums.ts
@@ -92,6 +92,25 @@
     DeviceOffline = 'device_offline',
     FlightTaskProgress = 'flighttask_progress',
     DeviceHms = 'device_hms',
+
+    // 设备指令
+    DeviceReboot = 'device_reboot', // 机场重启
+    DroneOpen = 'drone_open', // 飞行器开机
+    DroneClose = 'drone_close', // 飞行器关机
+    DeviceFormat = 'device_format', // 机场数据格式化
+    DroneFormat = 'drone_format', // 飞行器数据格式化
+    CoverOpen = 'cover_open', // 打开舱盖
+    CoverClose = 'cover_close', // 关闭舱盖
+    PutterOpen = 'putter_open', // 推杆展开
+    PutterClose = 'putter_close', // 推杆闭合
+    ChargeOpen = 'charge_open', // 打开充电
+    ChargeClose = 'charge_close', // 关闭充电
+
+    // 设备升级
+    DeviceUpgrade = 'ota_progress', // 设备升级
+
+    // 设备日志
+    DeviceLogUploadProgress = 'fileupload_progress' // 设备日志上传上传
 }
 
 export enum EDeviceTypeName {
@@ -104,4 +123,4 @@
     NOTICE,
     CAUTION,
     WARN,
-}
\ No newline at end of file
+}
diff --git a/src/utils/bytes.ts b/src/utils/bytes.ts
new file mode 100644
index 0000000..a1dd1fb
--- /dev/null
+++ b/src/utils/bytes.ts
@@ -0,0 +1,86 @@
+import { DEFAULT_PLACEHOLDER, SIZES as byteSizes, BYTE_SIZES } from './constants'
+
+/**
+ * 转换字节数为单位B,KB,GB...
+ * 保留一位小数
+ * @param bytes 字节数
+ * @param holder 0字节占位符,默认 --
+ * @returns
+ */
+export function bytesToSize (bytes: number, holder = DEFAULT_PLACEHOLDER, fix = 1, unit = false): string {
+  if (isNaN(bytes) || bytes === 0) {
+    return holder
+  }
+  // 兼容负数
+  let prefix = ''
+  if (bytes < 0) {
+    bytes = 0 - bytes
+    prefix = '-'
+  }
+  const k = 1024
+  const sizes = unit ? BYTE_SIZES : byteSizes// ['B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']
+  const i = Math.floor(Math.log(bytes) / Math.log(k))
+  return prefix + (bytes / Math.pow(k, i)).toFixed(fix) + '' + sizes[i]
+}
+
+//  获取转化后数据及单位
+export function getBytesObject (bytes: number, holder = DEFAULT_PLACEHOLDER, fix = 1): {
+  value: string,
+  size: string
+  index: number
+} {
+  if (isNaN(bytes) || bytes === 0) {
+    return {
+      value: holder,
+      size: '',
+      index: -1,
+    }
+  }
+  // 兼容负数
+  let prefix = ''
+  if (bytes < 0) {
+    bytes = 0 - bytes
+    prefix = '-'
+  }
+  const k = 1024
+  const sizes = byteSizes// ['B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']
+  const i = Math.floor(Math.log(bytes) / Math.log(k))
+
+  return {
+    value: prefix + (bytes / Math.pow(k, i)).toFixed(fix),
+    size: sizes[i],
+    index: i,
+  }
+}
+
+/**
+ * 根据最小单位返回文件大小
+ * @param bytes
+ * @param minUnit
+ * @param fix
+ * @returns
+ */
+export function bytesToSizeWithMinUnit (bytes: number, minUnit = 'B', fix = 1): string {
+  const holder = `0${minUnit}`
+  const sizes = byteSizes// ['B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']
+  const k = 1024
+  const findIndex = sizes.findIndex(item => item === minUnit)
+
+  const { value, size, index } = getBytesObject(bytes, holder, fix)
+  // 0
+  if (index === -1) {
+    return holder
+  }
+  // 转换后单位小于传入的最小单位
+  if (index < findIndex) {
+    const sizeToMinUint = parseFloat(value) / (Math.pow(k, findIndex - index))
+    return sizeToMinUint.toFixed(fix) + minUnit
+  }
+  // 其他
+  return value + size
+}
+// console.log('size', bytesToSizeWithMinUnit(0))
+// console.log('size', bytesToSizeWithMinUnit(1023))
+// console.log('size', bytesToSizeWithMinUnit(1024))
+// console.log('size', bytesToSizeWithMinUnit(1000 * 1024, 'MB', 2))
+// console.log('size', bytesToSizeWithMinUnit(1024 * 1024, 'MB', 2))
diff --git a/src/utils/color.ts b/src/utils/color.ts
new file mode 100644
index 0000000..5ad4ee3
--- /dev/null
+++ b/src/utils/color.ts
@@ -0,0 +1,8 @@
+export const commonColor = {
+  WARN: '#FF9900', // 黄色
+  FAIL: '#E02020', // 红色
+  WHITE: '#FFFFFF', // 白色
+  NORMAL: '#19BE6B', // 绿色
+  BLUE: '#2B85E4', // 蓝色
+  PINK: '#F7C0BA', // 粉
+}
diff --git a/src/utils/common.ts b/src/utils/common.ts
index 03c65f2..26fd977 100644
--- a/src/utils/common.ts
+++ b/src/utils/common.ts
@@ -1,4 +1,8 @@
-
+/**
+ * 下载文件
+ * @param data
+ * @param fileName
+ */
 export function downloadFile (data: Blob, fileName: string) {
   const lable = document.createElement('a')
   lable.href = window.URL.createObjectURL(data)
diff --git a/src/utils/constants.ts b/src/utils/constants.ts
new file mode 100644
index 0000000..06ad646
--- /dev/null
+++ b/src/utils/constants.ts
@@ -0,0 +1,15 @@
+
+export const DEFAULT_PLACEHOLDER = '--' // 默认占位符
+
+// 全局日期格式
+export const DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss'
+export const DATE_FORMAT_MINUTE = 'YYYY-MM-DD HH:mm'
+export const DATE_FORMAT_DAY = 'YYYY-MM-DD'
+export const TIME_FORMAT = 'HH:mm:ss'
+export const TIME_FORMAT_MINUTE = 'HH:mm'
+export const DATE_FORMAT_MM = 'MM-DD HH:mm'
+
+export const SIZES = ['B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']
+export const BYTE_SIZES = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
+export const PAGE_SIZE_OPTIONS = ['20', '50', '100']
+export const PAGE_SIZE = 50
diff --git a/src/utils/device-cmd.ts b/src/utils/device-cmd.ts
new file mode 100644
index 0000000..b6c80dd
--- /dev/null
+++ b/src/utils/device-cmd.ts
@@ -0,0 +1,350 @@
+import { DeviceInfoType } from '/@/types/device'
+import { DeviceCmd, DeviceCmdItem, DeviceCmdExecuteInfo, DeviceCmdStatusText, DeviceCmdExecuteStatus } from '/@/types/device-cmd'
+import { AirportStorage, CoverStateEnum, PutterStateEnum, ChargeStateEnum, SupplementLightStateEnum } from '/@/types/airport-tsa'
+import { getBytesObject } from './bytes'
+import { DEFAULT_PLACEHOLDER } from './constants'
+
+/**
+ * 根据osd 更新信息
+ * @param cmdList
+ * @param deviceInfo
+ * @returns
+ */
+export function updateDeviceCmdInfoByOsd (cmdList: DeviceCmdItem[], deviceInfo: DeviceInfoType) {
+  const { device, dock, gateway } = deviceInfo || {}
+  if (!cmdList || cmdList.length < 1) {
+    return
+  }
+  cmdList.forEach(cmdItem => {
+    if (cmdItem.loading) {
+      return
+    }
+    if (cmdItem.cmdKey === DeviceCmd.DeviceReboot) { // 重启
+      // console.log('DeviceReboot')
+    } else if (cmdItem.cmdKey === DeviceCmd.DroneOpen || cmdItem.cmdKey === DeviceCmd.DroneClose) { // 飞行器开关机
+      getDroneState(cmdItem, device)
+    } else if (cmdItem.cmdKey === DeviceCmd.CoverOpen || cmdItem.cmdKey === DeviceCmd.CoverClose) { // 舱盖开关
+      getCoverState(cmdItem, dock)
+    } else if (cmdItem.cmdKey === DeviceCmd.PutterOpen || cmdItem.cmdKey === DeviceCmd.PutterClose) { // 推杆闭合展开
+      getPutterState(cmdItem, dock)
+    } else if (cmdItem.cmdKey === DeviceCmd.ChargeOpen || cmdItem.cmdKey === DeviceCmd.ChargeClose) { // 充电状态
+      getChargeState(cmdItem, dock)
+    } else if (cmdItem.cmdKey === DeviceCmd.DeviceFormat) { // 机场存储
+      deviceFormat(cmdItem, dock)
+    } else if (cmdItem.cmdKey === DeviceCmd.DroneFormat) { // 飞行器存储
+      droneFormat(cmdItem, device)
+    } else if (cmdItem.cmdKey === DeviceCmd.SupplementLightOpen || cmdItem.cmdKey === DeviceCmd.SupplementLightClose) { // 补光灯开关
+      getSupplementLightState(cmdItem, dock)
+    }
+  })
+}
+
+// 飞行器开关机
+function getDroneState (cmdItem: DeviceCmdItem, droneProperties: any) {
+  if (!droneProperties) {
+    cmdItem.status = DeviceCmdStatusText.DroneStatusCloseNormalText
+    cmdItem.operateText = DeviceCmdStatusText.DroneStatusCloseBtnText
+    if (cmdItem.cmdKey !== DeviceCmd.DroneOpen) {
+      exchangeDeviceCmd(cmdItem)
+    }
+  } else {
+    cmdItem.status = DeviceCmdStatusText.DroneStatusOpenNormalText
+    cmdItem.operateText = DeviceCmdStatusText.DroneStatusOpenBtnText
+    if (cmdItem.cmdKey !== DeviceCmd.DroneClose) {
+      exchangeDeviceCmd(cmdItem)
+    }
+  }
+}
+
+// 舱盖开关
+function getCoverState (cmdItem: DeviceCmdItem, airportProperties: any) {
+  const coverState = airportProperties?.cover_state as CoverStateEnum
+
+  if (coverState === CoverStateEnum.Close || coverState === CoverStateEnum.Failed) {
+    cmdItem.status = DeviceCmdStatusText.DeviceCoverCloseNormalText
+    cmdItem.operateText = DeviceCmdStatusText.DeviceCoverCloseBtnText
+    if (cmdItem.cmdKey !== DeviceCmd.CoverOpen) {
+      exchangeDeviceCmd(cmdItem)
+    }
+  } else if (coverState === CoverStateEnum.Open || coverState === CoverStateEnum.HalfOpen) {
+    cmdItem.status = DeviceCmdStatusText.DeviceCoverOpenNormalText
+    cmdItem.operateText = DeviceCmdStatusText.DeviceCoverOpenBtnText
+    if (cmdItem.cmdKey !== DeviceCmd.CoverClose) {
+      exchangeDeviceCmd(cmdItem)
+    }
+  }
+}
+
+// 推杆状态
+function getPutterState (cmdItem: DeviceCmdItem, airportProperties: any) {
+  const putterState = airportProperties?.putter_state as PutterStateEnum
+  if (putterState === PutterStateEnum.Close || putterState === PutterStateEnum.Failed) {
+    cmdItem.status = DeviceCmdStatusText.DevicePutterCloseNormalText
+    cmdItem.operateText = DeviceCmdStatusText.DevicePutterCloseBtnText
+    if (cmdItem.cmdKey !== DeviceCmd.PutterOpen) {
+      exchangeDeviceCmd(cmdItem)
+    }
+  } else if (putterState === PutterStateEnum.Open || putterState === PutterStateEnum.HalfOpen) {
+    cmdItem.status = DeviceCmdStatusText.DevicePutterOpenNormalText
+    cmdItem.operateText = DeviceCmdStatusText.DevicePutterOpenBtnText
+    if (cmdItem.cmdKey !== DeviceCmd.PutterClose) {
+      exchangeDeviceCmd(cmdItem)
+    }
+  }
+}
+
+// 充电状态
+function getChargeState (cmdItem: DeviceCmdItem, airportProperties: any) {
+  const chargeState = airportProperties?.drone_charge_state
+  const state = chargeState?.state as ChargeStateEnum
+  if (!state) return
+  if (state === ChargeStateEnum.Charge) {
+    cmdItem.status = DeviceCmdStatusText.DeviceChargeOpenNormalText
+    cmdItem.operateText = DeviceCmdStatusText.DeviceChargeOpenBtnText
+    if (cmdItem.cmdKey !== DeviceCmd.ChargeClose) {
+      exchangeDeviceCmd(cmdItem)
+    }
+  } else if (state === ChargeStateEnum.NotCharge) {
+    cmdItem.status = DeviceCmdStatusText.DeviceChargeCloseNormalText
+    cmdItem.operateText = DeviceCmdStatusText.DeviceChargeCloseBtnText
+    if (cmdItem.cmdKey !== DeviceCmd.ChargeOpen) {
+      exchangeDeviceCmd(cmdItem)
+    }
+  }
+}
+
+// 机场存储格式化
+function deviceFormat (cmdItem: DeviceCmdItem, airportProperties: any) {
+  const airportStorage = airportProperties?.storage
+  const value = getAirportStorage(airportStorage)
+  cmdItem.status = value
+}
+
+// 机场存储格式化
+function droneFormat (cmdItem: DeviceCmdItem, droneProperties: any) {
+  const droneStorage = droneProperties?.storage
+  const value = getAirportStorage(droneStorage)
+  cmdItem.status = value
+}
+
+// 获取机场存储容量
+// {
+// "total": 10000, // 单位:KB
+// "used": 500
+// }
+export function getAirportStorage (storage: AirportStorage) {
+  if (!storage) {
+    return DEFAULT_PLACEHOLDER
+  }
+  const total = storage.total
+  const used = storage.used
+  const byteObj = getBytesObject(total * 1024)
+  const _total = byteObj.value
+  const _used = getBytes(used * 1024, byteObj.index)
+  return `${_used}/${_total} ${byteObj.size}`
+}
+
+function getBytes (bytes: number, index: number, fixed = 1) {
+  return (bytes / Math.pow(1024, index)).toFixed(fixed)
+}
+
+// 补光灯状态
+function getSupplementLightState (cmdItem: DeviceCmdItem, airportProperties: any) {
+  const supplementLightState = airportProperties?.supplement_light_state
+  if (supplementLightState === SupplementLightStateEnum.Close) {
+    cmdItem.operateText = DeviceCmdStatusText.DeviceSupplementLightCloseBtnText
+    cmdItem.status = DeviceCmdStatusText.DeviceSupplementLightCloseNormalText
+    if (cmdItem.cmdKey !== DeviceCmd.SupplementLightOpen) {
+      exchangeDeviceCmd(cmdItem)
+    }
+  } else if (supplementLightState === SupplementLightStateEnum.Open) {
+    cmdItem.operateText = DeviceCmdStatusText.DeviceSupplementLightOpenBtnText
+    cmdItem.status = DeviceCmdStatusText.DeviceSupplementLightOpenNormalText
+    if (cmdItem.cmdKey !== DeviceCmd.SupplementLightClose) {
+      exchangeDeviceCmd(cmdItem)
+    }
+  }
+}
+
+/**
+ * 交换指令
+ * @param cmd
+ */
+function exchangeDeviceCmd (cmdItem: DeviceCmdItem) {
+  if (cmdItem.oppositeCmdKey) {
+    const oppositeCmdKey = cmdItem.oppositeCmdKey
+    cmdItem.oppositeCmdKey = cmdItem.cmdKey
+    cmdItem.cmdKey = oppositeCmdKey
+  }
+}
+
+// /**
+//  * 更新简单指令发送情况更新信息
+//  * @param cmd
+//  */
+// export function updateDeviceSingleCmdInfo (cmdItem: DeviceCmdItem) {
+//   // 补光灯
+//   if (cmdItem.cmdKey === DeviceCmd.SupplementLightOpen) {
+//     cmdItem.status = DeviceCmdStatusText.DeviceSupplementLightOpenNormalText
+//     cmdItem.operateText = DeviceCmdStatusText.DeviceSupplementLightOpenBtnText
+//     exchangeDeviceCmd(cmdItem)
+//   } else if (cmdItem.cmdKey === DeviceCmd.SupplementLightClose) {
+//     cmdItem.status = DeviceCmdStatusText.DeviceSupplementLightCloseNormalText
+//     cmdItem.operateText = DeviceCmdStatusText.DeviceSupplementLightCloseBtnText
+//     exchangeDeviceCmd(cmdItem)
+//   }
+// }
+
+/**
+ * 根据指令执行消息更新信息
+ * @param cmd
+ * @param deviceCmdExecuteInfo
+ * @returns
+ */
+export function updateDeviceCmdInfoByExecuteInfo (cmdList: DeviceCmdItem[], deviceCmdExecuteInfos?: DeviceCmdExecuteInfo[]) {
+  if (!deviceCmdExecuteInfos || !cmdList) {
+    return
+  }
+  cmdList.forEach(cmdItem => {
+    // 获取当前设备相应指令信息
+    const deviceCmdExecuteInfo = deviceCmdExecuteInfos.find(cmdExecuteInfo => cmdExecuteInfo.biz_code === cmdItem.cmdKey)
+    if (deviceCmdExecuteInfo) {
+      if (cmdItem.cmdKey === DeviceCmd.DeviceReboot) { // 重启
+        if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.InProgress) {
+          cmdItem.status = DeviceCmdStatusText.DeviceRebootInProgressText
+          cmdItem.loading = true
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.Failed) {
+          cmdItem.status = DeviceCmdStatusText.DeviceRebootFailedText
+          cmdItem.loading = false
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.OK) {
+          cmdItem.status = DeviceCmdStatusText.DeviceRebootNormalText
+          cmdItem.loading = false
+        }
+      } else if (cmdItem.cmdKey === DeviceCmd.DroneOpen) { // 飞行器开关机
+        if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.InProgress) {
+          cmdItem.status = DeviceCmdStatusText.DroneStatusOpenInProgressText
+          cmdItem.loading = true
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.Failed) {
+          cmdItem.status = DeviceCmdStatusText.DroneStatusOpenFailedText
+          cmdItem.loading = false
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.OK) {
+          cmdItem.status = DeviceCmdStatusText.DroneStatusOpenNormalText
+          cmdItem.operateText = DeviceCmdStatusText.DroneStatusOpenBtnText
+          exchangeDeviceCmd(cmdItem)
+          cmdItem.loading = false
+        }
+      } else if (cmdItem.cmdKey === DeviceCmd.DroneClose) {
+        if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.InProgress) {
+          cmdItem.status = DeviceCmdStatusText.DroneStatusCloseInProgressText
+          cmdItem.loading = true
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.Failed) {
+          cmdItem.status = DeviceCmdStatusText.DroneStatusCloseFailedText
+          cmdItem.loading = false
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.OK) {
+          cmdItem.status = DeviceCmdStatusText.DroneStatusCloseNormalText
+          cmdItem.operateText = DeviceCmdStatusText.DroneStatusCloseBtnText
+          exchangeDeviceCmd(cmdItem)
+          cmdItem.loading = false
+        }
+      } else if (cmdItem.cmdKey === DeviceCmd.CoverOpen) { // 舱盖开关
+        if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.InProgress) {
+          cmdItem.status = DeviceCmdStatusText.DeviceCoverOpenInProgressText
+          cmdItem.loading = true
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.Failed) {
+          cmdItem.status = DeviceCmdStatusText.DeviceCoverOpenFailedText
+          cmdItem.loading = false
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.OK) {
+          cmdItem.status = DeviceCmdStatusText.DeviceCoverOpenNormalText
+          cmdItem.operateText = DeviceCmdStatusText.DeviceCoverOpenBtnText
+          exchangeDeviceCmd(cmdItem)
+          cmdItem.loading = false
+        }
+      } else if (cmdItem.cmdKey === DeviceCmd.CoverClose) {
+        if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.InProgress) {
+          cmdItem.status = DeviceCmdStatusText.DeviceCoverCloseInProgressText
+          cmdItem.loading = true
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.Failed) {
+          cmdItem.status = DeviceCmdStatusText.DeviceCoverCloseFailedText
+          cmdItem.loading = false
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.OK) {
+          cmdItem.status = DeviceCmdStatusText.DeviceCoverCloseNormalText
+          cmdItem.operateText = DeviceCmdStatusText.DeviceCoverCloseBtnText
+          exchangeDeviceCmd(cmdItem)
+          cmdItem.loading = false
+        }
+      } else if (cmdItem.cmdKey === DeviceCmd.PutterOpen) { // 推杆闭合展开
+        if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.InProgress) {
+          cmdItem.status = DeviceCmdStatusText.DevicePutterOpenInProgressText
+          cmdItem.loading = true
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.Failed) {
+          cmdItem.status = DeviceCmdStatusText.DevicePutterOpenFailedText
+          cmdItem.loading = false
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.OK) {
+          cmdItem.status = DeviceCmdStatusText.DevicePutterOpenNormalText
+          cmdItem.operateText = DeviceCmdStatusText.DevicePutterOpenBtnText
+          exchangeDeviceCmd(cmdItem)
+          cmdItem.loading = false
+        }
+      } else if (cmdItem.cmdKey === DeviceCmd.PutterClose) {
+        if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.InProgress) {
+          cmdItem.status = DeviceCmdStatusText.DevicePutterCloseInProgressText
+          cmdItem.loading = true
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.Failed) {
+          cmdItem.status = DeviceCmdStatusText.DevicePutterCloseFailedText
+          cmdItem.loading = false
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.OK) {
+          cmdItem.status = DeviceCmdStatusText.DevicePutterCloseNormalText
+          cmdItem.operateText = DeviceCmdStatusText.DevicePutterCloseBtnText
+          exchangeDeviceCmd(cmdItem)
+          cmdItem.loading = false
+        }
+      } else if (cmdItem.cmdKey === DeviceCmd.ChargeOpen) { // 充电状态
+        if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.InProgress) {
+          cmdItem.status = DeviceCmdStatusText.DeviceChargeOpenInProgressText
+          cmdItem.loading = true
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.Failed) {
+          cmdItem.status = DeviceCmdStatusText.DeviceChargeOpenFailedText
+          cmdItem.loading = false
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.OK) {
+          cmdItem.status = DeviceCmdStatusText.DeviceChargeOpenNormalText
+          cmdItem.operateText = DeviceCmdStatusText.DeviceChargeOpenBtnText
+          exchangeDeviceCmd(cmdItem)
+          cmdItem.loading = false
+        }
+      } else if (cmdItem.cmdKey === DeviceCmd.ChargeClose) {
+        if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.InProgress) {
+          cmdItem.status = DeviceCmdStatusText.DeviceChargeCloseInProgressText
+          cmdItem.loading = true
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.Failed) {
+          cmdItem.status = DeviceCmdStatusText.DeviceChargeCloseFailedText
+          cmdItem.loading = false
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.OK) {
+          cmdItem.status = DeviceCmdStatusText.DeviceChargeCloseNormalText
+          cmdItem.operateText = DeviceCmdStatusText.DeviceChargeCloseBtnText
+          exchangeDeviceCmd(cmdItem)
+          cmdItem.loading = false
+        }
+      } else if (cmdItem.cmdKey === DeviceCmd.DeviceFormat) { // 机场存储
+        if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.InProgress) {
+          cmdItem.status = DeviceCmdStatusText.DeviceFormatInProgressText
+          cmdItem.loading = true
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.Failed) {
+          cmdItem.status = DeviceCmdStatusText.DeviceFormatFailedText
+          cmdItem.loading = false
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.OK) {
+          cmdItem.loading = false
+        }
+      } else if (cmdItem.cmdKey === DeviceCmd.DroneFormat) { // 飞行器存储
+        if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.InProgress) {
+          cmdItem.status = DeviceCmdStatusText.DroneFormatInProgressText
+          cmdItem.loading = true
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.Failed) {
+          cmdItem.status = DeviceCmdStatusText.DroneFormatFailedText
+          cmdItem.loading = false
+        } else if (deviceCmdExecuteInfo.output.status === DeviceCmdExecuteStatus.OK) {
+          cmdItem.loading = false
+        }
+      }
+    }
+  })
+}
diff --git a/src/utils/download.ts b/src/utils/download.ts
new file mode 100644
index 0000000..3838865
--- /dev/null
+++ b/src/utils/download.ts
@@ -0,0 +1,82 @@
+/**
+ * 加载图片
+ * @param url
+ * @returns
+ */
+export function urlToImage (url: string) {
+  return new Promise<HTMLImageElement>((resolve, reject) => {
+    const image = new Image()
+    image.src = url
+    image.onload = () => { resolve(image) }
+    image.onerror = () => { reject(new Error('image load error')) }
+  })
+}
+
+export interface CompressImageData {
+  blob: Blob | null;
+  imageData: ImageData;
+}
+export function compressImage (imgToCompress: HTMLImageElement, targetWidth: number, targetHeight: number): Promise<CompressImageData> | undefined {
+  // resizing the image
+  const canvas = document.createElement('canvas')
+  const context = canvas.getContext('2d')
+  if (context) {
+    const iWidth = imgToCompress.width
+    const iHeight = imgToCompress.height
+    const iRatio = iWidth / iHeight // 图像宽高比
+    const tRatio = targetWidth / targetHeight // 目标宽高比
+    let dw = targetWidth
+    let dh = targetHeight
+    let dx = 0
+    let dy = 0
+    if (iRatio > tRatio) {
+      // 如果图像宽高比比目标宽高比要大,说明图像比目标尺寸更宽,这时候我们应该按照高度缩放比来进行缩放宽度
+      dw = (targetHeight / iHeight) * iWidth
+      // 宽度溢出,应该放在中间
+      dx = -(dw - targetWidth) / 2
+    } else {
+      // 否则说明图像比目标尺寸更高,按照宽度缩放比来缩放高度
+      dh = (targetWidth / iWidth) * iHeight
+      // 高度溢出,应该放在中间
+      dy = -(dh - targetHeight) / 2
+    }
+
+    canvas.width = targetWidth
+    canvas.height = targetHeight
+
+    context.drawImage(
+      imgToCompress,
+      dx,
+      dy,
+      dw,
+      dh,
+    )
+
+    return new Promise<CompressImageData>((resolve) => {
+      const imageData = context.getImageData(0, 0, canvas.width, canvas.height)
+
+      canvas.toBlob(blob => resolve({
+        blob,
+        imageData,
+      }))
+    })
+  }
+}
+
+/**
+ * 根据资源url下载文件
+ * @param url
+ * @param fileName
+ */
+export function download (url: string, fileName = ''): void {
+  const aLink = document.createElement('a')
+  aLink.style.display = 'none'
+  aLink.download = fileName
+  aLink.href = url
+  document.body.appendChild(aLink)
+  // 避免新开页面,闪烁
+  // aLink.target = '_blank'
+  aLink.click()
+  document.body.removeChild(aLink)
+  // aLink.remove()
+}
diff --git a/src/utils/time.ts b/src/utils/time.ts
new file mode 100644
index 0000000..31f3717
--- /dev/null
+++ b/src/utils/time.ts
@@ -0,0 +1,15 @@
+import {
+  DATE_FORMAT,
+  DEFAULT_PLACEHOLDER
+} from '/@/utils/constants'
+import moment, { Moment } from 'moment'
+
+// 时间字符串 或者 Unix 时间戳(毫秒数)
+export function formatDateTime (time: string | number, format = DATE_FORMAT) {
+  return time ? moment(time, format) : DEFAULT_PLACEHOLDER
+}
+
+// Unix 时间戳 (秒)
+export function formatUnixTime (time: number, format = DATE_FORMAT): string {
+  return time ? moment.unix(time).format(format) : DEFAULT_PLACEHOLDER
+}
diff --git a/src/websocket/index.ts b/src/websocket/index.ts
new file mode 100644
index 0000000..8edd25c
--- /dev/null
+++ b/src/websocket/index.ts
@@ -0,0 +1,85 @@
+import { message } from 'ant-design-vue'
+import ReconnectingWebSocket from 'reconnecting-websocket'
+
+interface WebSocketOptions {
+  data: any
+  cache?: boolean | string
+  destroyCache?: string
+}
+
+export interface MessageHandler {
+  (data : {[key: string]: any}): void
+}
+
+/**
+ * ConnectWebSocket 类
+ * TODO: 优化messageHandler: EventEmitter。暂时传入回调函数
+ */
+class ConnectWebSocket {
+  _url: string
+  _socket: ReconnectingWebSocket | null
+  _hasInit: boolean
+  _messageHandler: MessageHandler | null
+
+  constructor (url: string) {
+    this._url = url
+    this._socket = null
+    this._hasInit = false
+    this._messageHandler = null
+  }
+
+  initSocket () {
+    if (this._hasInit) {
+      return
+    }
+    if (!this._url) {
+      return
+    }
+
+    // 会自动重连,无需处理重连逻辑
+    this._socket = new ReconnectingWebSocket(this._url, [], {
+      maxReconnectionDelay: 20000, // 断开后最大的重连时间: 20s,每多一次重连,会增加 1.3 倍,5 * 1.3 * 1.3 * 1.3...
+      minReconnectionDelay: 5000, // 断开后最短的重连时间: 5s
+      maxRetries: 5
+    })
+
+    this._hasInit = true
+
+    this._socket.addEventListener('open', this._onOpen.bind(this))
+    this._socket.addEventListener('close', this._onClose.bind(this))
+    this._socket.addEventListener('error', this._onError.bind(this))
+    this._socket.addEventListener('message', this._onMessage.bind(this))
+  }
+
+  _onOpen () {
+    console.log('连接成功')
+  }
+
+  _onClose () {
+    console.log('连接已断开')
+  }
+
+  _onError () {
+    console.log('连接 error')
+  }
+
+  registerMessageHandler (messageHandler: MessageHandler) {
+    this._messageHandler = messageHandler
+  }
+
+  _onMessage (msg: MessageEvent) {
+    const data = JSON.parse(msg.data)
+    this._messageHandler && this._messageHandler(data)
+    // console.log('接受消息', message)
+  }
+
+  sendMessage = (message: WebSocketOptions): void => {
+    this._socket?.send(JSON.stringify(message.data))
+  }
+
+  close () {
+    this._socket?.close()
+  }
+}
+
+export default ConnectWebSocket
diff --git a/src/websocket/util/config.ts b/src/websocket/util/config.ts
new file mode 100644
index 0000000..46c8c2e
--- /dev/null
+++ b/src/websocket/util/config.ts
@@ -0,0 +1,8 @@
+import { ELocalStorageKey } from '/@/types/enums'
+import { CURRENT_CONFIG } from '/@/api/http/config'
+
+export function getWebsocketUrl () {
+  const token: string = localStorage.getItem(ELocalStorageKey.Token) || '' as string
+  const url = CURRENT_CONFIG.websocketURL + '?x-auth-token=' + encodeURI(token)
+  return url
+}
diff --git a/tsconfig.json b/tsconfig.json
index cffee3a..8aefcd9 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -25,6 +25,6 @@
     "src/**/*.d.ts",
     "src/**/*.tsx",
     "src/**/*.vue", 
-    "src/vendors/coordtransform.js"  
-  ]
+    "src/vendors/coordtransform.js"
+    ]
 }
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index 475880b..b48720b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3,55 +3,55 @@
 
 
 "@amap/amap-jsapi-loader@^1.0.1":
-  "integrity" "sha1-nsS01dJGfqxFH2yFLjXbaen58MA="
-  "resolved" "https://registry.npmmirror.com/@amap/amap-jsapi-loader/download/@amap/amap-jsapi-loader-1.0.1.tgz"
-  "version" "1.0.1"
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/@amap/amap-jsapi-loader/download/@amap/amap-jsapi-loader-1.0.1.tgz"
+  integrity sha1-nsS01dJGfqxFH2yFLjXbaen58MA=
 
 "@ant-design/colors@^5.0.0":
-  "integrity" "sha1-gAshhrHifmZDLmfQPtlq8+IdiUA="
-  "resolved" "https://registry.npm.taobao.org/@ant-design/colors/download/@ant-design/colors-5.1.1.tgz"
-  "version" "5.1.1"
+  version "5.1.1"
+  resolved "https://registry.npm.taobao.org/@ant-design/colors/download/@ant-design/colors-5.1.1.tgz"
+  integrity sha1-gAshhrHifmZDLmfQPtlq8+IdiUA=
   dependencies:
     "@ctrl/tinycolor" "^3.3.1"
 
 "@ant-design/icons-svg@^4.0.0":
-  "integrity" "sha1-hjDajrRHGkqr2u19H/apfcss8Fo="
-  "resolved" "https://registry.npmmirror.com/@ant-design/icons-svg/download/@ant-design/icons-svg-4.2.1.tgz?cache=0&sync_timestamp=1632478211055&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40ant-design%2Ficons-svg%2Fdownload%2F%40ant-design%2Ficons-svg-4.2.1.tgz"
-  "version" "4.2.1"
+  version "4.2.1"
+  resolved "https://registry.npmmirror.com/@ant-design/icons-svg/download/@ant-design/icons-svg-4.2.1.tgz?cache=0&sync_timestamp=1632478211055&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40ant-design%2Ficons-svg%2Fdownload%2F%40ant-design%2Ficons-svg-4.2.1.tgz"
+  integrity sha1-hjDajrRHGkqr2u19H/apfcss8Fo=
 
 "@ant-design/icons-vue@^6.0.0", "@ant-design/icons-vue@^6.0.1":
-  "integrity" "sha1-nYBMPHTSz6+XyxjlgtO5QAk09f0="
-  "resolved" "https://registry.npmmirror.com/@ant-design/icons-vue/download/@ant-design/icons-vue-6.0.1.tgz"
-  "version" "6.0.1"
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/@ant-design/icons-vue/download/@ant-design/icons-vue-6.0.1.tgz"
+  integrity sha1-nYBMPHTSz6+XyxjlgtO5QAk09f0=
   dependencies:
     "@ant-design/colors" "^5.0.0"
     "@ant-design/icons-svg" "^4.0.0"
     "@types/lodash" "^4.14.165"
-    "lodash" "^4.17.15"
-
-"@babel/code-frame@^7.16.7":
-  "integrity" "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg=="
-  "resolved" "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.16.7.tgz"
-  "version" "7.16.7"
-  dependencies:
-    "@babel/highlight" "^7.16.7"
+    lodash "^4.17.15"
 
 "@babel/code-frame@7.12.11":
-  "integrity" "sha1-9K1DWqJj25NbjxDyxVLSP7cWpj8="
-  "resolved" "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.12.11.tgz"
-  "version" "7.12.11"
+  version "7.12.11"
+  resolved "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.12.11.tgz"
+  integrity sha1-9K1DWqJj25NbjxDyxVLSP7cWpj8=
   dependencies:
     "@babel/highlight" "^7.10.4"
 
-"@babel/compat-data@^7.16.4":
-  "integrity" "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q=="
-  "resolved" "https://registry.npmmirror.com/@babel/compat-data/download/@babel/compat-data-7.16.8.tgz"
-  "version" "7.16.8"
+"@babel/code-frame@^7.16.7":
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.16.7.tgz"
+  integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==
+  dependencies:
+    "@babel/highlight" "^7.16.7"
 
-"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.17":
-  "integrity" "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA=="
-  "resolved" "https://registry.npmmirror.com/@babel/core/download/@babel/core-7.16.7.tgz"
-  "version" "7.16.7"
+"@babel/compat-data@^7.16.4":
+  version "7.16.8"
+  resolved "https://registry.npmmirror.com/@babel/compat-data/download/@babel/compat-data-7.16.8.tgz"
+  integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==
+
+"@babel/core@^7.12.17":
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/core/download/@babel/core-7.16.7.tgz"
+  integrity sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==
   dependencies:
     "@babel/code-frame" "^7.16.7"
     "@babel/generator" "^7.16.7"
@@ -62,73 +62,73 @@
     "@babel/template" "^7.16.7"
     "@babel/traverse" "^7.16.7"
     "@babel/types" "^7.16.7"
-    "convert-source-map" "^1.7.0"
-    "debug" "^4.1.0"
-    "gensync" "^1.0.0-beta.2"
-    "json5" "^2.1.2"
-    "semver" "^6.3.0"
-    "source-map" "^0.5.0"
+    convert-source-map "^1.7.0"
+    debug "^4.1.0"
+    gensync "^1.0.0-beta.2"
+    json5 "^2.1.2"
+    semver "^6.3.0"
+    source-map "^0.5.0"
 
 "@babel/generator@^7.16.7", "@babel/generator@^7.16.8":
-  "integrity" "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw=="
-  "resolved" "https://registry.npmmirror.com/@babel/generator/download/@babel/generator-7.16.8.tgz"
-  "version" "7.16.8"
+  version "7.16.8"
+  resolved "https://registry.npmmirror.com/@babel/generator/download/@babel/generator-7.16.8.tgz"
+  integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==
   dependencies:
     "@babel/types" "^7.16.8"
-    "jsesc" "^2.5.1"
-    "source-map" "^0.5.0"
+    jsesc "^2.5.1"
+    source-map "^0.5.0"
 
 "@babel/helper-compilation-targets@^7.16.7":
-  "integrity" "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA=="
-  "resolved" "https://registry.npmmirror.com/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.16.7.tgz"
+  integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==
   dependencies:
     "@babel/compat-data" "^7.16.4"
     "@babel/helper-validator-option" "^7.16.7"
-    "browserslist" "^4.17.5"
-    "semver" "^6.3.0"
+    browserslist "^4.17.5"
+    semver "^6.3.0"
 
 "@babel/helper-environment-visitor@^7.16.7":
-  "integrity" "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag=="
-  "resolved" "https://registry.npmmirror.com/@babel/helper-environment-visitor/download/@babel/helper-environment-visitor-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/download/@babel/helper-environment-visitor-7.16.7.tgz"
+  integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==
   dependencies:
     "@babel/types" "^7.16.7"
 
 "@babel/helper-function-name@^7.16.7":
-  "integrity" "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA=="
-  "resolved" "https://registry.npmmirror.com/@babel/helper-function-name/download/@babel/helper-function-name-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/helper-function-name/download/@babel/helper-function-name-7.16.7.tgz"
+  integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==
   dependencies:
     "@babel/helper-get-function-arity" "^7.16.7"
     "@babel/template" "^7.16.7"
     "@babel/types" "^7.16.7"
 
 "@babel/helper-get-function-arity@^7.16.7":
-  "integrity" "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw=="
-  "resolved" "https://registry.npmmirror.com/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.16.7.tgz"
+  integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==
   dependencies:
     "@babel/types" "^7.16.7"
 
 "@babel/helper-hoist-variables@^7.16.7":
-  "integrity" "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg=="
-  "resolved" "https://registry.npmmirror.com/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.16.7.tgz"
+  integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==
   dependencies:
     "@babel/types" "^7.16.7"
 
 "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.7":
-  "integrity" "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg=="
-  "resolved" "https://registry.npmmirror.com/@babel/helper-module-imports/download/@babel/helper-module-imports-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/helper-module-imports/download/@babel/helper-module-imports-7.16.7.tgz"
+  integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==
   dependencies:
     "@babel/types" "^7.16.7"
 
 "@babel/helper-module-transforms@^7.16.7":
-  "integrity" "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng=="
-  "resolved" "https://registry.npmmirror.com/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.16.7.tgz"
+  integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==
   dependencies:
     "@babel/helper-environment-visitor" "^7.16.7"
     "@babel/helper-module-imports" "^7.16.7"
@@ -140,89 +140,89 @@
     "@babel/types" "^7.16.7"
 
 "@babel/helper-plugin-utils@^7.10.4":
-  "integrity" "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA=="
-  "resolved" "https://registry.npmmirror.com/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.16.7.tgz"
+  integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==
 
 "@babel/helper-simple-access@^7.16.7":
-  "integrity" "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g=="
-  "resolved" "https://registry.npmmirror.com/@babel/helper-simple-access/download/@babel/helper-simple-access-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/helper-simple-access/download/@babel/helper-simple-access-7.16.7.tgz"
+  integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==
   dependencies:
     "@babel/types" "^7.16.7"
 
 "@babel/helper-split-export-declaration@^7.16.7":
-  "integrity" "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw=="
-  "resolved" "https://registry.npmmirror.com/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.16.7.tgz"
+  integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==
   dependencies:
     "@babel/types" "^7.16.7"
 
 "@babel/helper-validator-identifier@^7.16.7":
-  "integrity" "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw=="
-  "resolved" "https://registry.npmmirror.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.16.7.tgz"
+  integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
 
 "@babel/helper-validator-option@^7.16.7":
-  "integrity" "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ=="
-  "resolved" "https://registry.npmmirror.com/@babel/helper-validator-option/download/@babel/helper-validator-option-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/helper-validator-option/download/@babel/helper-validator-option-7.16.7.tgz"
+  integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==
 
 "@babel/helpers@^7.16.7":
-  "integrity" "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw=="
-  "resolved" "https://registry.npmmirror.com/@babel/helpers/download/@babel/helpers-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/helpers/download/@babel/helpers-7.16.7.tgz"
+  integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==
   dependencies:
     "@babel/template" "^7.16.7"
     "@babel/traverse" "^7.16.7"
     "@babel/types" "^7.16.7"
 
 "@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7":
-  "integrity" "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw=="
-  "resolved" "https://registry.npmmirror.com/@babel/highlight/download/@babel/highlight-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/highlight/download/@babel/highlight-7.16.7.tgz"
+  integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==
   dependencies:
     "@babel/helper-validator-identifier" "^7.16.7"
-    "chalk" "^2.0.0"
-    "js-tokens" "^4.0.0"
+    chalk "^2.0.0"
+    js-tokens "^4.0.0"
 
 "@babel/parser@^7.16.4", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8":
-  "integrity" "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw=="
-  "resolved" "https://registry.npmmirror.com/@babel/parser/download/@babel/parser-7.16.8.tgz"
-  "version" "7.16.8"
+  version "7.16.8"
+  resolved "https://registry.npmmirror.com/@babel/parser/download/@babel/parser-7.16.8.tgz"
+  integrity sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==
 
 "@babel/plugin-syntax-import-meta@^7.10.4":
-  "integrity" "sha1-7mATSMNw+jNNIge+FYd3SWUh/VE="
-  "resolved" "https://registry.npm.taobao.org/@babel/plugin-syntax-import-meta/download/@babel/plugin-syntax-import-meta-7.10.4.tgz"
-  "version" "7.10.4"
+  version "7.10.4"
+  resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-import-meta/download/@babel/plugin-syntax-import-meta-7.10.4.tgz"
+  integrity sha1-7mATSMNw+jNNIge+FYd3SWUh/VE=
   dependencies:
     "@babel/helper-plugin-utils" "^7.10.4"
 
 "@babel/runtime@^7.0.0", "@babel/runtime@^7.10.5":
-  "integrity" "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ=="
-  "resolved" "https://registry.npmmirror.com/@babel/runtime/download/@babel/runtime-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/runtime/download/@babel/runtime-7.16.7.tgz"
+  integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==
   dependencies:
-    "regenerator-runtime" "^0.13.4"
+    regenerator-runtime "^0.13.4"
 
 "@babel/standalone@^7.16.4":
-  "integrity" "sha512-2xC+uqniw1MNMTxzkfRUD8y0koEav+cGyWNCTVFAMC58Mb6HYfxqzQt+YtdMpSEcNqrDjvatthhyU0v18PNrnA=="
-  "resolved" "https://registry.npmmirror.com/@babel/standalone/download/@babel/standalone-7.16.9.tgz"
-  "version" "7.16.9"
+  version "7.16.9"
+  resolved "https://registry.npmmirror.com/@babel/standalone/download/@babel/standalone-7.16.9.tgz"
+  integrity sha512-2xC+uqniw1MNMTxzkfRUD8y0koEav+cGyWNCTVFAMC58Mb6HYfxqzQt+YtdMpSEcNqrDjvatthhyU0v18PNrnA==
 
 "@babel/template@^7.16.7":
-  "integrity" "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w=="
-  "resolved" "https://registry.npmmirror.com/@babel/template/download/@babel/template-7.16.7.tgz"
-  "version" "7.16.7"
+  version "7.16.7"
+  resolved "https://registry.npmmirror.com/@babel/template/download/@babel/template-7.16.7.tgz"
+  integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==
   dependencies:
     "@babel/code-frame" "^7.16.7"
     "@babel/parser" "^7.16.7"
     "@babel/types" "^7.16.7"
 
 "@babel/traverse@^7.16.7":
-  "integrity" "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ=="
-  "resolved" "https://registry.npmmirror.com/@babel/traverse/download/@babel/traverse-7.16.8.tgz"
-  "version" "7.16.8"
+  version "7.16.8"
+  resolved "https://registry.npmmirror.com/@babel/traverse/download/@babel/traverse-7.16.8.tgz"
+  integrity sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==
   dependencies:
     "@babel/code-frame" "^7.16.7"
     "@babel/generator" "^7.16.8"
@@ -232,55 +232,55 @@
     "@babel/helper-split-export-declaration" "^7.16.7"
     "@babel/parser" "^7.16.8"
     "@babel/types" "^7.16.8"
-    "debug" "^4.1.0"
-    "globals" "^11.1.0"
+    debug "^4.1.0"
+    globals "^11.1.0"
 
 "@babel/types@^7.16.7", "@babel/types@^7.16.8":
-  "integrity" "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg=="
-  "resolved" "https://registry.npmmirror.com/@babel/types/download/@babel/types-7.16.8.tgz"
-  "version" "7.16.8"
+  version "7.16.8"
+  resolved "https://registry.npmmirror.com/@babel/types/download/@babel/types-7.16.8.tgz"
+  integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==
   dependencies:
     "@babel/helper-validator-identifier" "^7.16.7"
-    "to-fast-properties" "^2.0.0"
+    to-fast-properties "^2.0.0"
 
 "@ctrl/tinycolor@^3.3.1":
-  "integrity" "sha1-w8WuVDyJfKqcKmhjC+01W+X5mQ8="
-  "resolved" "https://registry.npmmirror.com/@ctrl/tinycolor/download/@ctrl/tinycolor-3.4.0.tgz"
-  "version" "3.4.0"
+  version "3.4.0"
+  resolved "https://registry.npmmirror.com/@ctrl/tinycolor/download/@ctrl/tinycolor-3.4.0.tgz"
+  integrity sha1-w8WuVDyJfKqcKmhjC+01W+X5mQ8=
 
 "@eslint/eslintrc@^0.4.3":
-  "integrity" "sha1-nkKYHvA1vrPdSa3ResuW6P9vOUw="
-  "resolved" "https://registry.npmmirror.com/@eslint/eslintrc/download/@eslint/eslintrc-0.4.3.tgz"
-  "version" "0.4.3"
+  version "0.4.3"
+  resolved "https://registry.npmmirror.com/@eslint/eslintrc/download/@eslint/eslintrc-0.4.3.tgz"
+  integrity sha1-nkKYHvA1vrPdSa3ResuW6P9vOUw=
   dependencies:
-    "ajv" "^6.12.4"
-    "debug" "^4.1.1"
-    "espree" "^7.3.0"
-    "globals" "^13.9.0"
-    "ignore" "^4.0.6"
-    "import-fresh" "^3.2.1"
-    "js-yaml" "^3.13.1"
-    "minimatch" "^3.0.4"
-    "strip-json-comments" "^3.1.1"
+    ajv "^6.12.4"
+    debug "^4.1.1"
+    espree "^7.3.0"
+    globals "^13.9.0"
+    ignore "^4.0.6"
+    import-fresh "^3.2.1"
+    js-yaml "^3.13.1"
+    minimatch "^3.0.4"
+    strip-json-comments "^3.1.1"
 
 "@humanwhocodes/config-array@^0.5.0":
-  "integrity" "sha1-FAeWfUxu7Nc4j4Os8er00Mbljvk="
-  "resolved" "https://registry.npmmirror.com/@humanwhocodes/config-array/download/@humanwhocodes/config-array-0.5.0.tgz?cache=0&sync_timestamp=1635880739605&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40humanwhocodes%2Fconfig-array%2Fdownload%2F%40humanwhocodes%2Fconfig-array-0.5.0.tgz"
-  "version" "0.5.0"
+  version "0.5.0"
+  resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/download/@humanwhocodes/config-array-0.5.0.tgz?cache=0&sync_timestamp=1635880739605&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40humanwhocodes%2Fconfig-array%2Fdownload%2F%40humanwhocodes%2Fconfig-array-0.5.0.tgz"
+  integrity sha1-FAeWfUxu7Nc4j4Os8er00Mbljvk=
   dependencies:
     "@humanwhocodes/object-schema" "^1.2.0"
-    "debug" "^4.1.1"
-    "minimatch" "^3.0.4"
+    debug "^4.1.1"
+    minimatch "^3.0.4"
 
 "@humanwhocodes/object-schema@^1.2.0":
-  "integrity" "sha1-tSBSnsIdjllFoYUd/Rwy6U45/0U="
-  "resolved" "https://registry.npmmirror.com/@humanwhocodes/object-schema/download/@humanwhocodes/object-schema-1.2.1.tgz"
-  "version" "1.2.1"
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/download/@humanwhocodes/object-schema-1.2.1.tgz"
+  integrity sha1-tSBSnsIdjllFoYUd/Rwy6U45/0U=
 
 "@intlify/core-base@9.1.9":
-  "integrity" "sha1-5OjJUQEHKOSvOg0T10zz+eet1/Y="
-  "resolved" "https://registry.npmmirror.com/@intlify/core-base/download/@intlify/core-base-9.1.9.tgz"
-  "version" "9.1.9"
+  version "9.1.9"
+  resolved "https://registry.npmmirror.com/@intlify/core-base/download/@intlify/core-base-9.1.9.tgz"
+  integrity sha1-5OjJUQEHKOSvOg0T10zz+eet1/Y=
   dependencies:
     "@intlify/devtools-if" "9.1.9"
     "@intlify/message-compiler" "9.1.9"
@@ -290,246 +290,246 @@
     "@intlify/vue-devtools" "9.1.9"
 
 "@intlify/devtools-if@9.1.9":
-  "integrity" "sha1-ow4d0SVv8sXJjY110HU4T7qJjl0="
-  "resolved" "https://registry.npmmirror.com/@intlify/devtools-if/download/@intlify/devtools-if-9.1.9.tgz"
-  "version" "9.1.9"
+  version "9.1.9"
+  resolved "https://registry.npmmirror.com/@intlify/devtools-if/download/@intlify/devtools-if-9.1.9.tgz"
+  integrity sha1-ow4d0SVv8sXJjY110HU4T7qJjl0=
   dependencies:
     "@intlify/shared" "9.1.9"
 
 "@intlify/message-compiler@9.1.9":
-  "integrity" "sha1-EZPL0iSnHC+5gUVbhTSjx2bSlI0="
-  "resolved" "https://registry.npmmirror.com/@intlify/message-compiler/download/@intlify/message-compiler-9.1.9.tgz"
-  "version" "9.1.9"
+  version "9.1.9"
+  resolved "https://registry.npmmirror.com/@intlify/message-compiler/download/@intlify/message-compiler-9.1.9.tgz"
+  integrity sha1-EZPL0iSnHC+5gUVbhTSjx2bSlI0=
   dependencies:
     "@intlify/message-resolver" "9.1.9"
     "@intlify/shared" "9.1.9"
-    "source-map" "0.6.1"
+    source-map "0.6.1"
 
 "@intlify/message-resolver@9.1.9":
-  "integrity" "sha1-MVXM0vXm0NwWyti38djpf82gW/w="
-  "resolved" "https://registry.npmmirror.com/@intlify/message-resolver/download/@intlify/message-resolver-9.1.9.tgz?cache=0&sync_timestamp=1633533008021&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40intlify%2Fmessage-resolver%2Fdownload%2F%40intlify%2Fmessage-resolver-9.1.9.tgz"
-  "version" "9.1.9"
+  version "9.1.9"
+  resolved "https://registry.npmmirror.com/@intlify/message-resolver/download/@intlify/message-resolver-9.1.9.tgz?cache=0&sync_timestamp=1633533008021&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40intlify%2Fmessage-resolver%2Fdownload%2F%40intlify%2Fmessage-resolver-9.1.9.tgz"
+  integrity sha1-MVXM0vXm0NwWyti38djpf82gW/w=
 
 "@intlify/runtime@9.1.9":
-  "integrity" "sha1-LBLOKVGKB1Yp7+0KjtKT7nQMsoU="
-  "resolved" "https://registry.npmmirror.com/@intlify/runtime/download/@intlify/runtime-9.1.9.tgz?cache=0&sync_timestamp=1633534552005&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40intlify%2Fruntime%2Fdownload%2F%40intlify%2Fruntime-9.1.9.tgz"
-  "version" "9.1.9"
+  version "9.1.9"
+  resolved "https://registry.npmmirror.com/@intlify/runtime/download/@intlify/runtime-9.1.9.tgz?cache=0&sync_timestamp=1633534552005&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40intlify%2Fruntime%2Fdownload%2F%40intlify%2Fruntime-9.1.9.tgz"
+  integrity sha1-LBLOKVGKB1Yp7+0KjtKT7nQMsoU=
   dependencies:
     "@intlify/message-compiler" "9.1.9"
     "@intlify/message-resolver" "9.1.9"
     "@intlify/shared" "9.1.9"
 
 "@intlify/shared@9.1.9":
-  "integrity" "sha1-C6r5YSi4VWBma+x4T/sB9mI8wXo="
-  "resolved" "https://registry.npmmirror.com/@intlify/shared/download/@intlify/shared-9.1.9.tgz"
-  "version" "9.1.9"
+  version "9.1.9"
+  resolved "https://registry.npmmirror.com/@intlify/shared/download/@intlify/shared-9.1.9.tgz"
+  integrity sha1-C6r5YSi4VWBma+x4T/sB9mI8wXo=
 
 "@intlify/vue-devtools@9.1.9":
-  "integrity" "sha1-K+j02+f37UEVZ26zI0gUHUEeQms="
-  "resolved" "https://registry.npmmirror.com/@intlify/vue-devtools/download/@intlify/vue-devtools-9.1.9.tgz"
-  "version" "9.1.9"
+  version "9.1.9"
+  resolved "https://registry.npmmirror.com/@intlify/vue-devtools/download/@intlify/vue-devtools-9.1.9.tgz"
+  integrity sha1-K+j02+f37UEVZ26zI0gUHUEeQms=
   dependencies:
     "@intlify/message-resolver" "9.1.9"
     "@intlify/runtime" "9.1.9"
     "@intlify/shared" "9.1.9"
 
 "@nodelib/fs.scandir@2.1.5":
-  "integrity" "sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U="
-  "resolved" "https://registry.nlark.com/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.5.tgz"
-  "version" "2.1.5"
+  version "2.1.5"
+  resolved "https://registry.nlark.com/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.5.tgz"
+  integrity sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=
   dependencies:
     "@nodelib/fs.stat" "2.0.5"
-    "run-parallel" "^1.1.9"
+    run-parallel "^1.1.9"
 
-"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
-  "integrity" "sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos="
-  "resolved" "https://registry.npmmirror.com/@nodelib/fs.stat/download/@nodelib/fs.stat-2.0.5.tgz"
-  "version" "2.0.5"
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/@nodelib/fs.stat/download/@nodelib/fs.stat-2.0.5.tgz"
+  integrity sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=
 
 "@nodelib/fs.walk@^1.2.3":
-  "integrity" "sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po="
-  "resolved" "https://registry.nlark.com/@nodelib/fs.walk/download/@nodelib/fs.walk-1.2.8.tgz?cache=0&sync_timestamp=1625769815389&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40nodelib%2Ffs.walk%2Fdownload%2F%40nodelib%2Ffs.walk-1.2.8.tgz"
-  "version" "1.2.8"
+  version "1.2.8"
+  resolved "https://registry.nlark.com/@nodelib/fs.walk/download/@nodelib/fs.walk-1.2.8.tgz?cache=0&sync_timestamp=1625769815389&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40nodelib%2Ffs.walk%2Fdownload%2F%40nodelib%2Ffs.walk-1.2.8.tgz"
+  integrity sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=
   dependencies:
     "@nodelib/fs.scandir" "2.1.5"
-    "fastq" "^1.6.0"
+    fastq "^1.6.0"
 
 "@rollup/pluginutils@^4.0.0", "@rollup/pluginutils@^4.1.0", "@rollup/pluginutils@^4.1.2":
-  "integrity" "sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ=="
-  "resolved" "https://registry.npmmirror.com/@rollup/pluginutils/download/@rollup/pluginutils-4.1.2.tgz"
-  "version" "4.1.2"
+  version "4.1.2"
+  resolved "https://registry.npmmirror.com/@rollup/pluginutils/download/@rollup/pluginutils-4.1.2.tgz"
+  integrity sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ==
   dependencies:
-    "estree-walker" "^2.0.1"
-    "picomatch" "^2.2.2"
+    estree-walker "^2.0.1"
+    picomatch "^2.2.2"
 
 "@simonwep/pickr@~1.8.0":
-  "integrity" "sha1-ltyGZ1lA18rWPWnCIIPdHLuXl8s="
-  "resolved" "https://registry.nlark.com/@simonwep/pickr/download/@simonwep/pickr-1.8.2.tgz"
-  "version" "1.8.2"
+  version "1.8.2"
+  resolved "https://registry.nlark.com/@simonwep/pickr/download/@simonwep/pickr-1.8.2.tgz"
+  integrity sha1-ltyGZ1lA18rWPWnCIIPdHLuXl8s=
   dependencies:
-    "core-js" "^3.15.1"
-    "nanopop" "^2.1.0"
+    core-js "^3.15.1"
+    nanopop "^2.1.0"
 
 "@trysound/sax@0.2.0":
-  "integrity" "sha1-zMqrdYr1Z2Hre/N69vA/Mm3XmK0="
-  "resolved" "https://registry.nlark.com/@trysound/sax/download/@trysound/sax-0.2.0.tgz"
-  "version" "0.2.0"
+  version "0.2.0"
+  resolved "https://registry.nlark.com/@trysound/sax/download/@trysound/sax-0.2.0.tgz"
+  integrity sha1-zMqrdYr1Z2Hre/N69vA/Mm3XmK0=
 
 "@types/estree@*":
-  "integrity" "sha1-Hgyqk2TT/M0pMcPtlv2+ql1MyoM="
-  "resolved" "https://registry.npmmirror.com/@types/estree/download/@types/estree-0.0.50.tgz?cache=0&sync_timestamp=1637266061438&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Festree%2Fdownload%2F%40types%2Festree-0.0.50.tgz"
-  "version" "0.0.50"
+  version "0.0.50"
+  resolved "https://registry.npmmirror.com/@types/estree/download/@types/estree-0.0.50.tgz?cache=0&sync_timestamp=1637266061438&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Festree%2Fdownload%2F%40types%2Festree-0.0.50.tgz"
+  integrity sha1-Hgyqk2TT/M0pMcPtlv2+ql1MyoM=
 
 "@types/json-schema@^7.0.9":
-  "integrity" "sha1-l+3JA36gw4WFMgsolk3eOznkZg0="
-  "resolved" "https://registry.npmmirror.com/@types/json-schema/download/@types/json-schema-7.0.9.tgz?cache=0&sync_timestamp=1637265456183&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.9.tgz"
-  "version" "7.0.9"
+  version "7.0.9"
+  resolved "https://registry.npmmirror.com/@types/json-schema/download/@types/json-schema-7.0.9.tgz?cache=0&sync_timestamp=1637265456183&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.9.tgz"
+  integrity sha1-l+3JA36gw4WFMgsolk3eOznkZg0=
 
 "@types/json5@^0.0.29":
-  "integrity" "sha1-7ihweulOEdK4J7y+UnC86n8+ce4="
-  "resolved" "https://registry.npm.taobao.org/@types/json5/download/@types/json5-0.0.29.tgz"
-  "version" "0.0.29"
+  version "0.0.29"
+  resolved "https://registry.npm.taobao.org/@types/json5/download/@types/json5-0.0.29.tgz"
+  integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
 
 "@types/lodash@^4.14.165":
-  "integrity" "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw=="
-  "resolved" "https://registry.npmmirror.com/@types/lodash/download/@types/lodash-4.14.178.tgz"
-  "version" "4.14.178"
+  version "4.14.178"
+  resolved "https://registry.npmmirror.com/@types/lodash/download/@types/lodash-4.14.178.tgz"
+  integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==
 
 "@types/node@*", "@types/node@^16.3.2":
-  "integrity" "sha512-BPAcfDPoHlRQNKktbsbnpACGdypPFBuX4xQlsWDE7B8XXcfII+SpOLay3/qZmCLb39kV5S1RTYwXdkx2lwLYng=="
-  "resolved" "https://registry.npmmirror.com/@types/node/download/@types/node-16.11.19.tgz"
-  "version" "16.11.19"
+  version "16.11.19"
+  resolved "https://registry.npmmirror.com/@types/node/download/@types/node-16.11.19.tgz"
+  integrity sha512-BPAcfDPoHlRQNKktbsbnpACGdypPFBuX4xQlsWDE7B8XXcfII+SpOLay3/qZmCLb39kV5S1RTYwXdkx2lwLYng==
 
 "@types/svgo@^2.6.0":
-  "integrity" "sha512-4BfUnd19L25BD2iRyZTNuG4pfL9HBs+rvF7zp5maKhbX42uOpc5prGdBXXmCdHlVZfTWq8pNP/vxQt9v8ACxqQ=="
-  "resolved" "https://registry.npmmirror.com/@types/svgo/download/@types/svgo-2.6.1.tgz"
-  "version" "2.6.1"
+  version "2.6.1"
+  resolved "https://registry.npmmirror.com/@types/svgo/download/@types/svgo-2.6.1.tgz"
+  integrity sha512-4BfUnd19L25BD2iRyZTNuG4pfL9HBs+rvF7zp5maKhbX42uOpc5prGdBXXmCdHlVZfTWq8pNP/vxQt9v8ACxqQ==
   dependencies:
     "@types/node" "*"
 
 "@types/urlencode@^1.1.2":
-  "integrity" "sha1-YMiiBmZ+TJaom0rkfowKna35A0s="
-  "resolved" "https://registry.npmmirror.com/@types/urlencode/download/@types/urlencode-1.1.2.tgz"
-  "version" "1.1.2"
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/@types/urlencode/download/@types/urlencode-1.1.2.tgz"
+  integrity sha1-YMiiBmZ+TJaom0rkfowKna35A0s=
 
 "@typescript-eslint/eslint-plugin@^5.8.1":
-  "integrity" "sha512-Xv9tkFlyD4MQGpJgTo6wqDqGvHIRmRgah/2Sjz1PUnJTawjHWIwBivUE9x0QtU2WVii9baYgavo/bHjrZJkqTw=="
-  "resolved" "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/download/@typescript-eslint/eslint-plugin-5.9.1.tgz"
-  "version" "5.9.1"
+  version "5.9.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/download/@typescript-eslint/eslint-plugin-5.9.1.tgz"
+  integrity sha512-Xv9tkFlyD4MQGpJgTo6wqDqGvHIRmRgah/2Sjz1PUnJTawjHWIwBivUE9x0QtU2WVii9baYgavo/bHjrZJkqTw==
   dependencies:
     "@typescript-eslint/experimental-utils" "5.9.1"
     "@typescript-eslint/scope-manager" "5.9.1"
     "@typescript-eslint/type-utils" "5.9.1"
-    "debug" "^4.3.2"
-    "functional-red-black-tree" "^1.0.1"
-    "ignore" "^5.1.8"
-    "regexpp" "^3.2.0"
-    "semver" "^7.3.5"
-    "tsutils" "^3.21.0"
+    debug "^4.3.2"
+    functional-red-black-tree "^1.0.1"
+    ignore "^5.1.8"
+    regexpp "^3.2.0"
+    semver "^7.3.5"
+    tsutils "^3.21.0"
 
 "@typescript-eslint/experimental-utils@5.9.1":
-  "integrity" "sha512-cb1Njyss0mLL9kLXgS/eEY53SZQ9sT519wpX3i+U457l2UXRDuo87hgKfgRazmu9/tQb0x2sr3Y0yrU+Zz0y+w=="
-  "resolved" "https://registry.npmmirror.com/@typescript-eslint/experimental-utils/download/@typescript-eslint/experimental-utils-5.9.1.tgz"
-  "version" "5.9.1"
+  version "5.9.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/experimental-utils/download/@typescript-eslint/experimental-utils-5.9.1.tgz"
+  integrity sha512-cb1Njyss0mLL9kLXgS/eEY53SZQ9sT519wpX3i+U457l2UXRDuo87hgKfgRazmu9/tQb0x2sr3Y0yrU+Zz0y+w==
   dependencies:
     "@types/json-schema" "^7.0.9"
     "@typescript-eslint/scope-manager" "5.9.1"
     "@typescript-eslint/types" "5.9.1"
     "@typescript-eslint/typescript-estree" "5.9.1"
-    "eslint-scope" "^5.1.1"
-    "eslint-utils" "^3.0.0"
+    eslint-scope "^5.1.1"
+    eslint-utils "^3.0.0"
 
-"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.8.1":
-  "integrity" "sha512-PLYO0AmwD6s6n0ZQB5kqPgfvh73p0+VqopQQLuNfi7Lm0EpfKyDalchpVwkE+81k5HeiRrTV/9w1aNHzjD7C4g=="
-  "resolved" "https://registry.npmmirror.com/@typescript-eslint/parser/download/@typescript-eslint/parser-5.9.1.tgz"
-  "version" "5.9.1"
+"@typescript-eslint/parser@^5.8.1":
+  version "5.9.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/parser/download/@typescript-eslint/parser-5.9.1.tgz"
+  integrity sha512-PLYO0AmwD6s6n0ZQB5kqPgfvh73p0+VqopQQLuNfi7Lm0EpfKyDalchpVwkE+81k5HeiRrTV/9w1aNHzjD7C4g==
   dependencies:
     "@typescript-eslint/scope-manager" "5.9.1"
     "@typescript-eslint/types" "5.9.1"
     "@typescript-eslint/typescript-estree" "5.9.1"
-    "debug" "^4.3.2"
+    debug "^4.3.2"
 
 "@typescript-eslint/scope-manager@5.9.1":
-  "integrity" "sha512-8BwvWkho3B/UOtzRyW07ffJXPaLSUKFBjpq8aqsRvu6HdEuzCY57+ffT7QoV4QXJXWSU1+7g3wE4AlgImmQ9pQ=="
-  "resolved" "https://registry.npmmirror.com/@typescript-eslint/scope-manager/download/@typescript-eslint/scope-manager-5.9.1.tgz"
-  "version" "5.9.1"
+  version "5.9.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/download/@typescript-eslint/scope-manager-5.9.1.tgz"
+  integrity sha512-8BwvWkho3B/UOtzRyW07ffJXPaLSUKFBjpq8aqsRvu6HdEuzCY57+ffT7QoV4QXJXWSU1+7g3wE4AlgImmQ9pQ==
   dependencies:
     "@typescript-eslint/types" "5.9.1"
     "@typescript-eslint/visitor-keys" "5.9.1"
 
 "@typescript-eslint/type-utils@5.9.1":
-  "integrity" "sha512-tRSpdBnPRssjlUh35rE9ug5HrUvaB9ntREy7gPXXKwmIx61TNN7+l5YKgi1hMKxo5NvqZCfYhA5FvyuJG6X6vg=="
-  "resolved" "https://registry.npmmirror.com/@typescript-eslint/type-utils/download/@typescript-eslint/type-utils-5.9.1.tgz"
-  "version" "5.9.1"
+  version "5.9.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/download/@typescript-eslint/type-utils-5.9.1.tgz"
+  integrity sha512-tRSpdBnPRssjlUh35rE9ug5HrUvaB9ntREy7gPXXKwmIx61TNN7+l5YKgi1hMKxo5NvqZCfYhA5FvyuJG6X6vg==
   dependencies:
     "@typescript-eslint/experimental-utils" "5.9.1"
-    "debug" "^4.3.2"
-    "tsutils" "^3.21.0"
+    debug "^4.3.2"
+    tsutils "^3.21.0"
 
 "@typescript-eslint/types@5.9.1":
-  "integrity" "sha512-SsWegWudWpkZCwwYcKoDwuAjoZXnM1y2EbEerTHho19Hmm+bQ56QG4L4jrtCu0bI5STaRTvRTZmjprWlTw/5NQ=="
-  "resolved" "https://registry.npmmirror.com/@typescript-eslint/types/download/@typescript-eslint/types-5.9.1.tgz"
-  "version" "5.9.1"
+  version "5.9.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/types/download/@typescript-eslint/types-5.9.1.tgz"
+  integrity sha512-SsWegWudWpkZCwwYcKoDwuAjoZXnM1y2EbEerTHho19Hmm+bQ56QG4L4jrtCu0bI5STaRTvRTZmjprWlTw/5NQ==
 
 "@typescript-eslint/typescript-estree@5.9.1":
-  "integrity" "sha512-gL1sP6A/KG0HwrahVXI9fZyeVTxEYV//6PmcOn1tD0rw8VhUWYeZeuWHwwhnewnvEMcHjhnJLOBhA9rK4vmb8A=="
-  "resolved" "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/download/@typescript-eslint/typescript-estree-5.9.1.tgz"
-  "version" "5.9.1"
+  version "5.9.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/download/@typescript-eslint/typescript-estree-5.9.1.tgz"
+  integrity sha512-gL1sP6A/KG0HwrahVXI9fZyeVTxEYV//6PmcOn1tD0rw8VhUWYeZeuWHwwhnewnvEMcHjhnJLOBhA9rK4vmb8A==
   dependencies:
     "@typescript-eslint/types" "5.9.1"
     "@typescript-eslint/visitor-keys" "5.9.1"
-    "debug" "^4.3.2"
-    "globby" "^11.0.4"
-    "is-glob" "^4.0.3"
-    "semver" "^7.3.5"
-    "tsutils" "^3.21.0"
+    debug "^4.3.2"
+    globby "^11.0.4"
+    is-glob "^4.0.3"
+    semver "^7.3.5"
+    tsutils "^3.21.0"
 
 "@typescript-eslint/visitor-keys@5.9.1":
-  "integrity" "sha512-Xh37pNz9e9ryW4TVdwiFzmr4hloty8cFj8GTWMXh3Z8swGwyQWeCcNgF0hm6t09iZd6eiZmIf4zHedQVP6TVtg=="
-  "resolved" "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/download/@typescript-eslint/visitor-keys-5.9.1.tgz"
-  "version" "5.9.1"
+  version "5.9.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/download/@typescript-eslint/visitor-keys-5.9.1.tgz"
+  integrity sha512-Xh37pNz9e9ryW4TVdwiFzmr4hloty8cFj8GTWMXh3Z8swGwyQWeCcNgF0hm6t09iZd6eiZmIf4zHedQVP6TVtg==
   dependencies:
     "@typescript-eslint/types" "5.9.1"
-    "eslint-visitor-keys" "^3.0.0"
+    eslint-visitor-keys "^3.0.0"
 
 "@vitejs/plugin-legacy@^1.6.2":
-  "integrity" "sha512-geH2F3hTRN++E4n9NZ0JFumxIWUKqW4FA9PAgM7Q6RvUOUUYW4tlURhEmCBYfZSN24H/yX3mEolX+wFVErsAYQ=="
-  "resolved" "https://registry.npmmirror.com/@vitejs/plugin-legacy/download/@vitejs/plugin-legacy-1.6.4.tgz"
-  "version" "1.6.4"
+  version "1.6.4"
+  resolved "https://registry.npmmirror.com/@vitejs/plugin-legacy/download/@vitejs/plugin-legacy-1.6.4.tgz"
+  integrity sha512-geH2F3hTRN++E4n9NZ0JFumxIWUKqW4FA9PAgM7Q6RvUOUUYW4tlURhEmCBYfZSN24H/yX3mEolX+wFVErsAYQ==
   dependencies:
     "@babel/standalone" "^7.16.4"
-    "core-js" "^3.19.1"
-    "magic-string" "^0.25.7"
-    "regenerator-runtime" "^0.13.9"
-    "systemjs" "^6.11.0"
+    core-js "^3.19.1"
+    magic-string "^0.25.7"
+    regenerator-runtime "^0.13.9"
+    systemjs "^6.11.0"
 
 "@vitejs/plugin-vue@^1.2.4":
-  "integrity" "sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw=="
-  "resolved" "https://registry.npmmirror.com/@vitejs/plugin-vue/download/@vitejs/plugin-vue-1.10.2.tgz"
-  "version" "1.10.2"
+  version "1.10.2"
+  resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/download/@vitejs/plugin-vue-1.10.2.tgz"
+  integrity sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw==
 
 "@vue/compiler-core@3.2.26":
-  "integrity" "sha512-N5XNBobZbaASdzY9Lga2D9Lul5vdCIOXvUMd6ThcN8zgqQhPKfCV+wfAJNNJKQkSHudnYRO2gEB+lp0iN3g2Tw=="
-  "resolved" "https://registry.npmmirror.com/@vue/compiler-core/download/@vue/compiler-core-3.2.26.tgz"
-  "version" "3.2.26"
+  version "3.2.26"
+  resolved "https://registry.npmmirror.com/@vue/compiler-core/download/@vue/compiler-core-3.2.26.tgz"
+  integrity sha512-N5XNBobZbaASdzY9Lga2D9Lul5vdCIOXvUMd6ThcN8zgqQhPKfCV+wfAJNNJKQkSHudnYRO2gEB+lp0iN3g2Tw==
   dependencies:
     "@babel/parser" "^7.16.4"
     "@vue/shared" "3.2.26"
-    "estree-walker" "^2.0.2"
-    "source-map" "^0.6.1"
+    estree-walker "^2.0.2"
+    source-map "^0.6.1"
 
 "@vue/compiler-dom@3.2.26":
-  "integrity" "sha512-smBfaOW6mQDxcT3p9TKT6mE22vjxjJL50GFVJiI0chXYGU/xzC05QRGrW3HHVuJrmLTLx5zBhsZ2dIATERbarg=="
-  "resolved" "https://registry.npmmirror.com/@vue/compiler-dom/download/@vue/compiler-dom-3.2.26.tgz"
-  "version" "3.2.26"
+  version "3.2.26"
+  resolved "https://registry.npmmirror.com/@vue/compiler-dom/download/@vue/compiler-dom-3.2.26.tgz"
+  integrity sha512-smBfaOW6mQDxcT3p9TKT6mE22vjxjJL50GFVJiI0chXYGU/xzC05QRGrW3HHVuJrmLTLx5zBhsZ2dIATERbarg==
   dependencies:
     "@vue/compiler-core" "3.2.26"
     "@vue/shared" "3.2.26"
 
-"@vue/compiler-sfc@^3.0.5", "@vue/compiler-sfc@>=3.1.0", "@vue/compiler-sfc@3.2.26":
-  "integrity" "sha512-ePpnfktV90UcLdsDQUh2JdiTuhV0Skv2iYXxfNMOK/F3Q+2BO0AulcVcfoksOpTJGmhhfosWfMyEaEf0UaWpIw=="
-  "resolved" "https://registry.npmmirror.com/@vue/compiler-sfc/download/@vue/compiler-sfc-3.2.26.tgz"
-  "version" "3.2.26"
+"@vue/compiler-sfc@3.2.26", "@vue/compiler-sfc@^3.0.5":
+  version "3.2.26"
+  resolved "https://registry.npmmirror.com/@vue/compiler-sfc/download/@vue/compiler-sfc-3.2.26.tgz"
+  integrity sha512-ePpnfktV90UcLdsDQUh2JdiTuhV0Skv2iYXxfNMOK/F3Q+2BO0AulcVcfoksOpTJGmhhfosWfMyEaEf0UaWpIw==
   dependencies:
     "@babel/parser" "^7.16.4"
     "@vue/compiler-core" "3.2.26"
@@ -537,3348 +537,3330 @@
     "@vue/compiler-ssr" "3.2.26"
     "@vue/reactivity-transform" "3.2.26"
     "@vue/shared" "3.2.26"
-    "estree-walker" "^2.0.2"
-    "magic-string" "^0.25.7"
-    "postcss" "^8.1.10"
-    "source-map" "^0.6.1"
+    estree-walker "^2.0.2"
+    magic-string "^0.25.7"
+    postcss "^8.1.10"
+    source-map "^0.6.1"
 
 "@vue/compiler-ssr@3.2.26":
-  "integrity" "sha512-2mywLX0ODc4Zn8qBoA2PDCsLEZfpUGZcyoFRLSOjyGGK6wDy2/5kyDOWtf0S0UvtoyVq95OTSGIALjZ4k2q/ag=="
-  "resolved" "https://registry.npmmirror.com/@vue/compiler-ssr/download/@vue/compiler-ssr-3.2.26.tgz"
-  "version" "3.2.26"
+  version "3.2.26"
+  resolved "https://registry.npmmirror.com/@vue/compiler-ssr/download/@vue/compiler-ssr-3.2.26.tgz"
+  integrity sha512-2mywLX0ODc4Zn8qBoA2PDCsLEZfpUGZcyoFRLSOjyGGK6wDy2/5kyDOWtf0S0UvtoyVq95OTSGIALjZ4k2q/ag==
   dependencies:
     "@vue/compiler-dom" "3.2.26"
     "@vue/shared" "3.2.26"
 
 "@vue/devtools-api@^6.0.0-beta.11", "@vue/devtools-api@^6.0.0-beta.18", "@vue/devtools-api@^6.0.0-beta.7":
-  "integrity" "sha512-FqC4s3pm35qGVeXRGOjTsRzlkJjrBLriDS9YXbflHLsfA9FrcKzIyWnLXoNm+/7930E8rRakXuAc2QkC50swAw=="
-  "resolved" "https://registry.npmmirror.com/@vue/devtools-api/download/@vue/devtools-api-6.0.0-beta.21.1.tgz"
-  "version" "6.0.0-beta.21.1"
+  version "6.0.0-beta.21.1"
+  resolved "https://registry.npmmirror.com/@vue/devtools-api/download/@vue/devtools-api-6.0.0-beta.21.1.tgz"
+  integrity sha512-FqC4s3pm35qGVeXRGOjTsRzlkJjrBLriDS9YXbflHLsfA9FrcKzIyWnLXoNm+/7930E8rRakXuAc2QkC50swAw==
 
 "@vue/reactivity-transform@3.2.26":
-  "integrity" "sha512-XKMyuCmzNA7nvFlYhdKwD78rcnmPb7q46uoR00zkX6yZrUmcCQ5OikiwUEVbvNhL5hBJuvbSO95jB5zkUon+eQ=="
-  "resolved" "https://registry.npmmirror.com/@vue/reactivity-transform/download/@vue/reactivity-transform-3.2.26.tgz"
-  "version" "3.2.26"
+  version "3.2.26"
+  resolved "https://registry.npmmirror.com/@vue/reactivity-transform/download/@vue/reactivity-transform-3.2.26.tgz"
+  integrity sha512-XKMyuCmzNA7nvFlYhdKwD78rcnmPb7q46uoR00zkX6yZrUmcCQ5OikiwUEVbvNhL5hBJuvbSO95jB5zkUon+eQ==
   dependencies:
     "@babel/parser" "^7.16.4"
     "@vue/compiler-core" "3.2.26"
     "@vue/shared" "3.2.26"
-    "estree-walker" "^2.0.2"
-    "magic-string" "^0.25.7"
+    estree-walker "^2.0.2"
+    magic-string "^0.25.7"
 
 "@vue/reactivity@3.2.26":
-  "integrity" "sha512-h38bxCZLW6oFJVDlCcAiUKFnXI8xP8d+eO0pcDxx+7dQfSPje2AO6M9S9QO6MrxQB7fGP0DH0dYQ8ksf6hrXKQ=="
-  "resolved" "https://registry.npmmirror.com/@vue/reactivity/download/@vue/reactivity-3.2.26.tgz"
-  "version" "3.2.26"
+  version "3.2.26"
+  resolved "https://registry.npmmirror.com/@vue/reactivity/download/@vue/reactivity-3.2.26.tgz"
+  integrity sha512-h38bxCZLW6oFJVDlCcAiUKFnXI8xP8d+eO0pcDxx+7dQfSPje2AO6M9S9QO6MrxQB7fGP0DH0dYQ8ksf6hrXKQ==
   dependencies:
     "@vue/shared" "3.2.26"
 
 "@vue/runtime-core@3.2.26":
-  "integrity" "sha512-BcYi7qZ9Nn+CJDJrHQ6Zsmxei2hDW0L6AB4vPvUQGBm2fZyC0GXd/4nVbyA2ubmuhctD5RbYY8L+5GUJszv9mQ=="
-  "resolved" "https://registry.npmmirror.com/@vue/runtime-core/download/@vue/runtime-core-3.2.26.tgz"
-  "version" "3.2.26"
+  version "3.2.26"
+  resolved "https://registry.npmmirror.com/@vue/runtime-core/download/@vue/runtime-core-3.2.26.tgz"
+  integrity sha512-BcYi7qZ9Nn+CJDJrHQ6Zsmxei2hDW0L6AB4vPvUQGBm2fZyC0GXd/4nVbyA2ubmuhctD5RbYY8L+5GUJszv9mQ==
   dependencies:
     "@vue/reactivity" "3.2.26"
     "@vue/shared" "3.2.26"
 
 "@vue/runtime-dom@3.2.26":
-  "integrity" "sha512-dY56UIiZI+gjc4e8JQBwAifljyexfVCkIAu/WX8snh8vSOt/gMSEGwPRcl2UpYpBYeyExV8WCbgvwWRNt9cHhQ=="
-  "resolved" "https://registry.npmmirror.com/@vue/runtime-dom/download/@vue/runtime-dom-3.2.26.tgz"
-  "version" "3.2.26"
+  version "3.2.26"
+  resolved "https://registry.npmmirror.com/@vue/runtime-dom/download/@vue/runtime-dom-3.2.26.tgz"
+  integrity sha512-dY56UIiZI+gjc4e8JQBwAifljyexfVCkIAu/WX8snh8vSOt/gMSEGwPRcl2UpYpBYeyExV8WCbgvwWRNt9cHhQ==
   dependencies:
     "@vue/runtime-core" "3.2.26"
     "@vue/shared" "3.2.26"
-    "csstype" "^2.6.8"
+    csstype "^2.6.8"
 
 "@vue/server-renderer@3.2.26":
-  "integrity" "sha512-Jp5SggDUvvUYSBIvYEhy76t4nr1vapY/FIFloWmQzn7UxqaHrrBpbxrqPcTrSgGrcaglj0VBp22BKJNre4aA1w=="
-  "resolved" "https://registry.npmmirror.com/@vue/server-renderer/download/@vue/server-renderer-3.2.26.tgz"
-  "version" "3.2.26"
+  version "3.2.26"
+  resolved "https://registry.npmmirror.com/@vue/server-renderer/download/@vue/server-renderer-3.2.26.tgz"
+  integrity sha512-Jp5SggDUvvUYSBIvYEhy76t4nr1vapY/FIFloWmQzn7UxqaHrrBpbxrqPcTrSgGrcaglj0VBp22BKJNre4aA1w==
   dependencies:
     "@vue/compiler-ssr" "3.2.26"
     "@vue/shared" "3.2.26"
 
 "@vue/shared@3.2.26":
-  "integrity" "sha512-vPV6Cq+NIWbH5pZu+V+2QHE9y1qfuTq49uNWw4f7FDEeZaDU2H2cx5jcUZOAKW7qTrUS4k6qZPbMy1x4N96nbA=="
-  "resolved" "https://registry.npmmirror.com/@vue/shared/download/@vue/shared-3.2.26.tgz"
-  "version" "3.2.26"
+  version "3.2.26"
+  resolved "https://registry.npmmirror.com/@vue/shared/download/@vue/shared-3.2.26.tgz"
+  integrity sha512-vPV6Cq+NIWbH5pZu+V+2QHE9y1qfuTq49uNWw4f7FDEeZaDU2H2cx5jcUZOAKW7qTrUS4k6qZPbMy1x4N96nbA==
 
-"acorn-jsx@^5.2.0", "acorn-jsx@^5.3.1":
-  "integrity" "sha1-ftW7VZCLOy8bxVxq8WU7rafweTc="
-  "resolved" "https://registry.nlark.com/acorn-jsx/download/acorn-jsx-5.3.2.tgz"
-  "version" "5.3.2"
+acorn-jsx@^5.2.0, acorn-jsx@^5.3.1:
+  version "5.3.2"
+  resolved "https://registry.nlark.com/acorn-jsx/download/acorn-jsx-5.3.2.tgz"
+  integrity sha1-ftW7VZCLOy8bxVxq8WU7rafweTc=
 
-"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^7.1.1", "acorn@^7.4.0":
-  "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
-  "resolved" "https://registry.npmmirror.com/acorn/download/acorn-7.4.1.tgz"
-  "version" "7.4.1"
+acorn@^7.1.1, acorn@^7.4.0:
+  version "7.4.1"
+  resolved "https://registry.npmmirror.com/acorn/download/acorn-7.4.1.tgz"
+  integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
 
-"agora-rtc-sdk-ng@^4.12.1":
-  "integrity" "sha512-kmc+ZyKDdnY/BN3iAwBs+MSgTX8Zkc6THFSIAXN9WebjZ/F+N/JXItoNEcgQe3MdTABUli6w3pZ+iObnDqVkBw=="
-  "resolved" "https://registry.npmmirror.com/agora-rtc-sdk-ng/-/agora-rtc-sdk-ng-4.12.1.tgz"
-  "version" "4.12.1"
+agora-rtc-sdk-ng@^4.12.1:
+  version "4.12.1"
+  resolved "https://registry.npmmirror.com/agora-rtc-sdk-ng/-/agora-rtc-sdk-ng-4.12.1.tgz"
+  integrity sha512-kmc+ZyKDdnY/BN3iAwBs+MSgTX8Zkc6THFSIAXN9WebjZ/F+N/JXItoNEcgQe3MdTABUli6w3pZ+iObnDqVkBw==
   dependencies:
-    "agora-rte-extension" "^1.0.22"
+    agora-rte-extension "^1.0.22"
 
-"agora-rte-extension@^1.0.22":
-  "integrity" "sha512-X2cGBg+L5ZJIFU91qvMASvRsBfg1HXTktVG3YROw9wxHsILSI7jgF9R9XraLc3fNX/UjovaYAlUW+hiJe0v6Xw=="
-  "resolved" "https://registry.npmmirror.com/agora-rte-extension/-/agora-rte-extension-1.0.23.tgz"
-  "version" "1.0.23"
+agora-rte-extension@^1.0.22:
+  version "1.0.23"
+  resolved "https://registry.npmmirror.com/agora-rte-extension/-/agora-rte-extension-1.0.23.tgz"
+  integrity sha512-X2cGBg+L5ZJIFU91qvMASvRsBfg1HXTktVG3YROw9wxHsILSI7jgF9R9XraLc3fNX/UjovaYAlUW+hiJe0v6Xw==
 
-"ajv@^6.10.0", "ajv@^6.12.4":
-  "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="
-  "resolved" "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz"
-  "version" "6.12.6"
+ajv@^6.10.0, ajv@^6.12.4:
+  version "6.12.6"
+  resolved "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz"
+  integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
   dependencies:
-    "fast-deep-equal" "^3.1.1"
-    "fast-json-stable-stringify" "^2.0.0"
-    "json-schema-traverse" "^0.4.1"
-    "uri-js" "^4.2.2"
+    fast-deep-equal "^3.1.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
 
-"ajv@^8.0.1":
-  "integrity" "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw=="
-  "resolved" "https://registry.npmmirror.com/ajv/download/ajv-8.8.2.tgz"
-  "version" "8.8.2"
+ajv@^8.0.1:
+  version "8.8.2"
+  resolved "https://registry.npmmirror.com/ajv/download/ajv-8.8.2.tgz"
+  integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==
   dependencies:
-    "fast-deep-equal" "^3.1.1"
-    "json-schema-traverse" "^1.0.0"
-    "require-from-string" "^2.0.2"
-    "uri-js" "^4.2.2"
+    fast-deep-equal "^3.1.1"
+    json-schema-traverse "^1.0.0"
+    require-from-string "^2.0.2"
+    uri-js "^4.2.2"
 
-"ansi-colors@^4.1.1":
-  "integrity" "sha1-y7muJWv3UK8eqzRPIpqif+lLo0g="
-  "resolved" "https://registry.nlark.com/ansi-colors/download/ansi-colors-4.1.1.tgz"
-  "version" "4.1.1"
+ansi-colors@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.nlark.com/ansi-colors/download/ansi-colors-4.1.1.tgz"
+  integrity sha1-y7muJWv3UK8eqzRPIpqif+lLo0g=
 
-"ansi-regex@^2.0.0":
-  "integrity" "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
-  "resolved" "https://registry.nlark.com/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz"
-  "version" "2.1.1"
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.nlark.com/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz"
+  integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
 
-"ansi-regex@^5.0.1":
-  "integrity" "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ="
-  "resolved" "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-5.0.1.tgz"
-  "version" "5.0.1"
+ansi-regex@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-5.0.1.tgz"
+  integrity sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=
 
-"ansi-styles@^2.2.1":
-  "integrity" "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="
-  "resolved" "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-2.2.1.tgz"
-  "version" "2.2.1"
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-2.2.1.tgz"
+  integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==
 
-"ansi-styles@^3.2.1":
-  "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="
-  "resolved" "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-3.2.1.tgz"
-  "version" "3.2.1"
+ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-3.2.1.tgz"
+  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
   dependencies:
-    "color-convert" "^1.9.0"
+    color-convert "^1.9.0"
 
-"ansi-styles@^4.0.0", "ansi-styles@^4.1.0":
-  "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="
-  "resolved" "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-4.3.0.tgz"
-  "version" "4.3.0"
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-4.3.0.tgz"
+  integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
   dependencies:
-    "color-convert" "^2.0.1"
+    color-convert "^2.0.1"
 
-"ant-design-vue@^2.2.8":
-  "integrity" "sha512-3graq9/gCfJQs6hznrHV6sa9oDmk/D1H3Oo0vLdVpPS/I61fZPk8NEyNKCHpNA6fT2cx6xx9U3QS63uuyikg/Q=="
-  "resolved" "https://registry.npmmirror.com/ant-design-vue/download/ant-design-vue-2.2.8.tgz"
-  "version" "2.2.8"
+ant-design-vue@^2.2.8:
+  version "2.2.8"
+  resolved "https://registry.npmmirror.com/ant-design-vue/download/ant-design-vue-2.2.8.tgz"
+  integrity sha512-3graq9/gCfJQs6hznrHV6sa9oDmk/D1H3Oo0vLdVpPS/I61fZPk8NEyNKCHpNA6fT2cx6xx9U3QS63uuyikg/Q==
   dependencies:
     "@ant-design/icons-vue" "^6.0.0"
     "@babel/runtime" "^7.10.5"
     "@simonwep/pickr" "~1.8.0"
-    "array-tree-filter" "^2.1.0"
-    "async-validator" "^3.3.0"
-    "dom-align" "^1.12.1"
-    "dom-scroll-into-view" "^2.0.0"
-    "lodash" "^4.17.21"
-    "lodash-es" "^4.17.15"
-    "moment" "^2.27.0"
-    "omit.js" "^2.0.0"
-    "resize-observer-polyfill" "^1.5.1"
-    "scroll-into-view-if-needed" "^2.2.25"
-    "shallow-equal" "^1.0.0"
-    "vue-types" "^3.0.0"
-    "warning" "^4.0.0"
+    array-tree-filter "^2.1.0"
+    async-validator "^3.3.0"
+    dom-align "^1.12.1"
+    dom-scroll-into-view "^2.0.0"
+    lodash "^4.17.21"
+    lodash-es "^4.17.15"
+    moment "^2.27.0"
+    omit.js "^2.0.0"
+    resize-observer-polyfill "^1.5.1"
+    scroll-into-view-if-needed "^2.2.25"
+    shallow-equal "^1.0.0"
+    vue-types "^3.0.0"
+    warning "^4.0.0"
 
-"anymatch@~3.1.2":
-  "integrity" "sha1-wFV8CWrzLxBhmPT04qODU343hxY="
-  "resolved" "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.2.tgz"
-  "version" "3.1.2"
+anymatch@~3.1.2:
+  version "3.1.2"
+  resolved "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.2.tgz"
+  integrity sha1-wFV8CWrzLxBhmPT04qODU343hxY=
   dependencies:
-    "normalize-path" "^3.0.0"
-    "picomatch" "^2.0.4"
+    normalize-path "^3.0.0"
+    picomatch "^2.0.4"
 
-"argparse@^1.0.7":
-  "integrity" "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE="
-  "resolved" "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz"
-  "version" "1.0.10"
+argparse@^1.0.7:
+  version "1.0.10"
+  resolved "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz"
+  integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=
   dependencies:
-    "sprintf-js" "~1.0.2"
+    sprintf-js "~1.0.2"
 
-"arr-diff@^4.0.0":
-  "integrity" "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
-  "resolved" "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz"
-  "version" "4.0.0"
+arr-diff@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz"
+  integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
 
-"arr-flatten@^1.1.0":
-  "integrity" "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE="
-  "resolved" "https://registry.nlark.com/arr-flatten/download/arr-flatten-1.1.0.tgz"
-  "version" "1.1.0"
+arr-flatten@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.nlark.com/arr-flatten/download/arr-flatten-1.1.0.tgz"
+  integrity sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=
 
-"arr-union@^3.1.0":
-  "integrity" "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
-  "resolved" "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz"
-  "version" "3.1.0"
+arr-union@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz"
+  integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
 
-"array-includes@^3.1.4":
-  "integrity" "sha1-9bSTFix2DzU5Yx8AW6K7Rqy0W6k="
-  "resolved" "https://registry.npmmirror.com/array-includes/download/array-includes-3.1.4.tgz"
-  "version" "3.1.4"
+array-includes@^3.1.4:
+  version "3.1.4"
+  resolved "https://registry.npmmirror.com/array-includes/download/array-includes-3.1.4.tgz"
+  integrity sha1-9bSTFix2DzU5Yx8AW6K7Rqy0W6k=
   dependencies:
-    "call-bind" "^1.0.2"
-    "define-properties" "^1.1.3"
-    "es-abstract" "^1.19.1"
-    "get-intrinsic" "^1.1.1"
-    "is-string" "^1.0.7"
+    call-bind "^1.0.2"
+    define-properties "^1.1.3"
+    es-abstract "^1.19.1"
+    get-intrinsic "^1.1.1"
+    is-string "^1.0.7"
 
-"array-tree-filter@^2.1.0":
-  "integrity" "sha1-hzrAD+yDdJ8lWsjdCDgUtPYykZA="
-  "resolved" "https://registry.npm.taobao.org/array-tree-filter/download/array-tree-filter-2.1.0.tgz"
-  "version" "2.1.0"
+array-tree-filter@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npm.taobao.org/array-tree-filter/download/array-tree-filter-2.1.0.tgz"
+  integrity sha1-hzrAD+yDdJ8lWsjdCDgUtPYykZA=
 
-"array-union@^2.1.0":
-  "integrity" "sha1-t5hCCtvrHego2ErNii4j0+/oXo0="
-  "resolved" "https://registry.nlark.com/array-union/download/array-union-2.1.0.tgz"
-  "version" "2.1.0"
+array-union@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.nlark.com/array-union/download/array-union-2.1.0.tgz"
+  integrity sha1-t5hCCtvrHego2ErNii4j0+/oXo0=
 
-"array-unique@^0.3.2":
-  "integrity" "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
-  "resolved" "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz"
-  "version" "0.3.2"
+array-unique@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz"
+  integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
 
-"array.prototype.flat@^1.2.5":
-  "integrity" "sha1-B+CXXYS7x8SM0YedYJ5oJZjTPhM="
-  "resolved" "https://registry.npmmirror.com/array.prototype.flat/download/array.prototype.flat-1.2.5.tgz?cache=0&sync_timestamp=1633109609894&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Farray.prototype.flat%2Fdownload%2Farray.prototype.flat-1.2.5.tgz"
-  "version" "1.2.5"
+array.prototype.flat@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.npmmirror.com/array.prototype.flat/download/array.prototype.flat-1.2.5.tgz?cache=0&sync_timestamp=1633109609894&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Farray.prototype.flat%2Fdownload%2Farray.prototype.flat-1.2.5.tgz"
+  integrity sha1-B+CXXYS7x8SM0YedYJ5oJZjTPhM=
   dependencies:
-    "call-bind" "^1.0.2"
-    "define-properties" "^1.1.3"
-    "es-abstract" "^1.19.0"
+    call-bind "^1.0.2"
+    define-properties "^1.1.3"
+    es-abstract "^1.19.0"
 
-"assign-symbols@^1.0.0":
-  "integrity" "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
-  "resolved" "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz"
-  "version" "1.0.0"
+assign-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz"
+  integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
 
-"astral-regex@^2.0.0":
-  "integrity" "sha1-SDFDxWeu7UeFdZwIZXhtx319LjE="
-  "resolved" "https://registry.npm.taobao.org/astral-regex/download/astral-regex-2.0.0.tgz"
-  "version" "2.0.0"
+astral-regex@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npm.taobao.org/astral-regex/download/astral-regex-2.0.0.tgz"
+  integrity sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=
 
-"async-validator@^3.3.0":
-  "integrity" "sha1-aOhmqWgk6LJpT/eoMcGiXETV5QA="
-  "resolved" "https://registry.npmmirror.com/async-validator/download/async-validator-3.5.2.tgz"
-  "version" "3.5.2"
+async-validator@^3.3.0:
+  version "3.5.2"
+  resolved "https://registry.npmmirror.com/async-validator/download/async-validator-3.5.2.tgz"
+  integrity sha1-aOhmqWgk6LJpT/eoMcGiXETV5QA=
 
-"atob@^2.1.2":
-  "integrity" "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k="
-  "resolved" "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz"
-  "version" "2.1.2"
+atob@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz"
+  integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=
 
-"axios@^0.21.1":
-  "integrity" "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg=="
-  "resolved" "https://registry.npmmirror.com/axios/download/axios-0.21.4.tgz"
-  "version" "0.21.4"
+axios@^0.21.1:
+  version "0.21.4"
+  resolved "https://registry.npmmirror.com/axios/download/axios-0.21.4.tgz"
+  integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
   dependencies:
-    "follow-redirects" "^1.14.0"
+    follow-redirects "^1.14.0"
 
-"babel-plugin-import@^1.13.3":
-  "integrity" "sha1-nbu6fRrHK9QSkXqDDUReAJQdJtc="
-  "resolved" "https://registry.npmmirror.com/babel-plugin-import/download/babel-plugin-import-1.13.3.tgz"
-  "version" "1.13.3"
+babel-plugin-import@^1.13.3:
+  version "1.13.3"
+  resolved "https://registry.npmmirror.com/babel-plugin-import/download/babel-plugin-import-1.13.3.tgz"
+  integrity sha1-nbu6fRrHK9QSkXqDDUReAJQdJtc=
   dependencies:
     "@babel/helper-module-imports" "^7.0.0"
     "@babel/runtime" "^7.0.0"
 
-"balanced-match@^1.0.0":
-  "integrity" "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4="
-  "resolved" "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbalanced-match%2Fdownload%2Fbalanced-match-1.0.2.tgz"
-  "version" "1.0.2"
+balanced-match@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbalanced-match%2Fdownload%2Fbalanced-match-1.0.2.tgz"
+  integrity sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=
 
-"base@^0.11.1":
-  "integrity" "sha1-e95c7RRbbVUakNuH+DxVi060io8="
-  "resolved" "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz"
-  "version" "0.11.2"
+base@^0.11.1:
+  version "0.11.2"
+  resolved "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz"
+  integrity sha1-e95c7RRbbVUakNuH+DxVi060io8=
   dependencies:
-    "cache-base" "^1.0.1"
-    "class-utils" "^0.3.5"
-    "component-emitter" "^1.2.1"
-    "define-property" "^1.0.0"
-    "isobject" "^3.0.1"
-    "mixin-deep" "^1.2.0"
-    "pascalcase" "^0.1.1"
+    cache-base "^1.0.1"
+    class-utils "^0.3.5"
+    component-emitter "^1.2.1"
+    define-property "^1.0.0"
+    isobject "^3.0.1"
+    mixin-deep "^1.2.0"
+    pascalcase "^0.1.1"
 
-"big-integer@^1.6.17":
-  "integrity" "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg=="
-  "resolved" "https://registry.npmmirror.com/big-integer/download/big-integer-1.6.51.tgz"
-  "version" "1.6.51"
+big-integer@^1.6.17:
+  version "1.6.51"
+  resolved "https://registry.npmmirror.com/big-integer/download/big-integer-1.6.51.tgz"
+  integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==
 
-"big.js@^5.2.2":
-  "integrity" "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg="
-  "resolved" "https://registry.npmmirror.com/big.js/download/big.js-5.2.2.tgz"
-  "version" "5.2.2"
+big.js@^5.2.2:
+  version "5.2.2"
+  resolved "https://registry.npmmirror.com/big.js/download/big.js-5.2.2.tgz"
+  integrity sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=
 
-"binary-extensions@^2.0.0":
-  "integrity" "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0="
-  "resolved" "https://registry.nlark.com/binary-extensions/download/binary-extensions-2.2.0.tgz"
-  "version" "2.2.0"
+binary-extensions@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.nlark.com/binary-extensions/download/binary-extensions-2.2.0.tgz"
+  integrity sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=
 
-"binary@~0.3.0":
-  "integrity" "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk="
-  "resolved" "https://registry.npm.taobao.org/binary/download/binary-0.3.0.tgz"
-  "version" "0.3.0"
+binary@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npm.taobao.org/binary/download/binary-0.3.0.tgz"
+  integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=
   dependencies:
-    "buffers" "~0.1.1"
-    "chainsaw" "~0.1.0"
+    buffers "~0.1.1"
+    chainsaw "~0.1.0"
 
-"bluebird@^3.5.0":
-  "integrity" "sha1-nyKcFb4nJFT/qXOs4NvueaGww28="
-  "resolved" "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz"
-  "version" "3.7.2"
+bluebird@^3.5.0:
+  version "3.7.2"
+  resolved "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz"
+  integrity sha1-nyKcFb4nJFT/qXOs4NvueaGww28=
 
-"bluebird@~3.4.1":
-  "integrity" "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM="
-  "resolved" "https://registry.npm.taobao.org/bluebird/download/bluebird-3.4.7.tgz"
-  "version" "3.4.7"
+bluebird@~3.4.1:
+  version "3.4.7"
+  resolved "https://registry.npm.taobao.org/bluebird/download/bluebird-3.4.7.tgz"
+  integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=
 
-"boolbase@^1.0.0":
-  "integrity" "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
-  "resolved" "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz"
-  "version" "1.0.0"
+boolbase@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz"
+  integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
 
-"brace-expansion@^1.1.7":
-  "integrity" "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0="
-  "resolved" "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz?cache=0&sync_timestamp=1614010709807&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrace-expansion%2Fdownload%2Fbrace-expansion-1.1.11.tgz"
-  "version" "1.1.11"
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz?cache=0&sync_timestamp=1614010709807&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrace-expansion%2Fdownload%2Fbrace-expansion-1.1.11.tgz"
+  integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=
   dependencies:
-    "balanced-match" "^1.0.0"
-    "concat-map" "0.0.1"
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
 
-"braces@^2.2.2":
-  "integrity" "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk="
-  "resolved" "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz"
-  "version" "2.3.2"
+braces@^2.2.2:
+  version "2.3.2"
+  resolved "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz"
+  integrity sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=
   dependencies:
-    "arr-flatten" "^1.1.0"
-    "array-unique" "^0.3.2"
-    "extend-shallow" "^2.0.1"
-    "fill-range" "^4.0.0"
-    "isobject" "^3.0.1"
-    "repeat-element" "^1.1.2"
-    "snapdragon" "^0.8.1"
-    "snapdragon-node" "^2.0.1"
-    "split-string" "^3.0.2"
-    "to-regex" "^3.0.1"
+    arr-flatten "^1.1.0"
+    array-unique "^0.3.2"
+    extend-shallow "^2.0.1"
+    fill-range "^4.0.0"
+    isobject "^3.0.1"
+    repeat-element "^1.1.2"
+    snapdragon "^0.8.1"
+    snapdragon-node "^2.0.1"
+    split-string "^3.0.2"
+    to-regex "^3.0.1"
 
-"braces@^3.0.1", "braces@~3.0.2":
-  "integrity" "sha1-NFThpGLujVmeI23zNs2epPiv4Qc="
-  "resolved" "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz"
-  "version" "3.0.2"
+braces@^3.0.1, braces@~3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz"
+  integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc=
   dependencies:
-    "fill-range" "^7.0.1"
+    fill-range "^7.0.1"
 
-"browserslist@^4.17.5":
-  "integrity" "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A=="
-  "resolved" "https://registry.npmmirror.com/browserslist/download/browserslist-4.19.1.tgz"
-  "version" "4.19.1"
+browserslist@^4.17.5:
+  version "4.19.1"
+  resolved "https://registry.npmmirror.com/browserslist/download/browserslist-4.19.1.tgz"
+  integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==
   dependencies:
-    "caniuse-lite" "^1.0.30001286"
-    "electron-to-chromium" "^1.4.17"
-    "escalade" "^3.1.1"
-    "node-releases" "^2.0.1"
-    "picocolors" "^1.0.0"
+    caniuse-lite "^1.0.30001286"
+    electron-to-chromium "^1.4.17"
+    escalade "^3.1.1"
+    node-releases "^2.0.1"
+    picocolors "^1.0.0"
 
-"buffer-indexof-polyfill@~1.0.0":
-  "integrity" "sha1-0nMhNcWZnGSyd/z5savjSYJUcpw="
-  "resolved" "https://registry.npm.taobao.org/buffer-indexof-polyfill/download/buffer-indexof-polyfill-1.0.2.tgz"
-  "version" "1.0.2"
+buffer-indexof-polyfill@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.npm.taobao.org/buffer-indexof-polyfill/download/buffer-indexof-polyfill-1.0.2.tgz"
+  integrity sha1-0nMhNcWZnGSyd/z5savjSYJUcpw=
 
-"buffers@~0.1.1":
-  "integrity" "sha1-skV5w77U1tOWru5tmorn9Ugqt7s="
-  "resolved" "https://registry.npm.taobao.org/buffers/download/buffers-0.1.1.tgz"
-  "version" "0.1.1"
+buffers@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npm.taobao.org/buffers/download/buffers-0.1.1.tgz"
+  integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s=
 
-"cache-base@^1.0.1":
-  "integrity" "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI="
-  "resolved" "https://registry.npmmirror.com/cache-base/download/cache-base-1.0.1.tgz?cache=0&sync_timestamp=1636237629294&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcache-base%2Fdownload%2Fcache-base-1.0.1.tgz"
-  "version" "1.0.1"
+cache-base@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/cache-base/download/cache-base-1.0.1.tgz?cache=0&sync_timestamp=1636237629294&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcache-base%2Fdownload%2Fcache-base-1.0.1.tgz"
+  integrity sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=
   dependencies:
-    "collection-visit" "^1.0.0"
-    "component-emitter" "^1.2.1"
-    "get-value" "^2.0.6"
-    "has-value" "^1.0.0"
-    "isobject" "^3.0.1"
-    "set-value" "^2.0.0"
-    "to-object-path" "^0.3.0"
-    "union-value" "^1.0.0"
-    "unset-value" "^1.0.0"
+    collection-visit "^1.0.0"
+    component-emitter "^1.2.1"
+    get-value "^2.0.6"
+    has-value "^1.0.0"
+    isobject "^3.0.1"
+    set-value "^2.0.0"
+    to-object-path "^0.3.0"
+    union-value "^1.0.0"
+    unset-value "^1.0.0"
 
-"call-bind@^1.0.0", "call-bind@^1.0.2":
-  "integrity" "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw="
-  "resolved" "https://registry.nlark.com/call-bind/download/call-bind-1.0.2.tgz"
-  "version" "1.0.2"
+call-bind@^1.0.0, call-bind@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.nlark.com/call-bind/download/call-bind-1.0.2.tgz"
+  integrity sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=
   dependencies:
-    "function-bind" "^1.1.1"
-    "get-intrinsic" "^1.0.2"
+    function-bind "^1.1.1"
+    get-intrinsic "^1.0.2"
 
-"callsites@^3.0.0":
-  "integrity" "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M="
-  "resolved" "https://registry.nlark.com/callsites/download/callsites-3.1.0.tgz"
-  "version" "3.1.0"
+callsites@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.nlark.com/callsites/download/callsites-3.1.0.tgz"
+  integrity sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=
 
-"camel-case@^4.1.2":
-  "integrity" "sha1-lygHKpVPgFIoIlpt7qazhGHhvVo="
-  "resolved" "https://registry.npm.taobao.org/camel-case/download/camel-case-4.1.2.tgz?cache=0&sync_timestamp=1606867297052&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamel-case%2Fdownload%2Fcamel-case-4.1.2.tgz"
-  "version" "4.1.2"
+camel-case@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.npm.taobao.org/camel-case/download/camel-case-4.1.2.tgz?cache=0&sync_timestamp=1606867297052&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamel-case%2Fdownload%2Fcamel-case-4.1.2.tgz"
+  integrity sha1-lygHKpVPgFIoIlpt7qazhGHhvVo=
   dependencies:
-    "pascal-case" "^3.1.2"
-    "tslib" "^2.0.3"
+    pascal-case "^3.1.2"
+    tslib "^2.0.3"
 
-"caniuse-lite@^1.0.30001286":
-  "integrity" "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw=="
-  "resolved" "https://registry.npmmirror.com/caniuse-lite/download/caniuse-lite-1.0.30001299.tgz"
-  "version" "1.0.30001299"
+caniuse-lite@^1.0.30001286:
+  version "1.0.30001299"
+  resolved "https://registry.npmmirror.com/caniuse-lite/download/caniuse-lite-1.0.30001299.tgz"
+  integrity sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw==
 
-"capital-case@^1.0.4":
-  "integrity" "sha1-nRMCkjU8kkn2sA+lhSvuOKcX5mk="
-  "resolved" "https://registry.nlark.com/capital-case/download/capital-case-1.0.4.tgz"
-  "version" "1.0.4"
+capital-case@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.nlark.com/capital-case/download/capital-case-1.0.4.tgz"
+  integrity sha1-nRMCkjU8kkn2sA+lhSvuOKcX5mk=
   dependencies:
-    "no-case" "^3.0.4"
-    "tslib" "^2.0.3"
-    "upper-case-first" "^2.0.2"
+    no-case "^3.0.4"
+    tslib "^2.0.3"
+    upper-case-first "^2.0.2"
 
-"chainsaw@~0.1.0":
-  "integrity" "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg="
-  "resolved" "https://registry.npm.taobao.org/chainsaw/download/chainsaw-0.1.0.tgz"
-  "version" "0.1.0"
+chainsaw@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npm.taobao.org/chainsaw/download/chainsaw-0.1.0.tgz"
+  integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=
   dependencies:
-    "traverse" ">=0.3.0 <0.4"
+    traverse ">=0.3.0 <0.4"
 
-"chalk@^1.1.3":
-  "integrity" "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg="
-  "resolved" "https://registry.npmmirror.com/chalk/download/chalk-1.1.3.tgz"
-  "version" "1.1.3"
+chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/chalk/download/chalk-1.1.3.tgz"
+  integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
   dependencies:
-    "ansi-styles" "^2.2.1"
-    "escape-string-regexp" "^1.0.2"
-    "has-ansi" "^2.0.0"
-    "strip-ansi" "^3.0.0"
-    "supports-color" "^2.0.0"
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
 
-"chalk@^2.0.0":
-  "integrity" "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ="
-  "resolved" "https://registry.npmmirror.com/chalk/download/chalk-2.4.2.tgz"
-  "version" "2.4.2"
+chalk@^2.0.0:
+  version "2.4.2"
+  resolved "https://registry.npmmirror.com/chalk/download/chalk-2.4.2.tgz"
+  integrity sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=
   dependencies:
-    "ansi-styles" "^3.2.1"
-    "escape-string-regexp" "^1.0.5"
-    "supports-color" "^5.3.0"
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
 
-"chalk@^4.0.0":
-  "integrity" "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE="
-  "resolved" "https://registry.npmmirror.com/chalk/download/chalk-4.1.2.tgz"
-  "version" "4.1.2"
+chalk@^4.0.0:
+  version "4.1.2"
+  resolved "https://registry.npmmirror.com/chalk/download/chalk-4.1.2.tgz"
+  integrity sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=
   dependencies:
-    "ansi-styles" "^4.1.0"
-    "supports-color" "^7.1.0"
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
 
-"change-case@^4.1.2":
-  "integrity" "sha1-/t/F8TYEXiOYwEEO5EH5VwRkHhI="
-  "resolved" "https://registry.npm.taobao.org/change-case/download/change-case-4.1.2.tgz?cache=0&sync_timestamp=1606867326259&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchange-case%2Fdownload%2Fchange-case-4.1.2.tgz"
-  "version" "4.1.2"
+change-case@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.npm.taobao.org/change-case/download/change-case-4.1.2.tgz?cache=0&sync_timestamp=1606867326259&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchange-case%2Fdownload%2Fchange-case-4.1.2.tgz"
+  integrity sha1-/t/F8TYEXiOYwEEO5EH5VwRkHhI=
   dependencies:
-    "camel-case" "^4.1.2"
-    "capital-case" "^1.0.4"
-    "constant-case" "^3.0.4"
-    "dot-case" "^3.0.4"
-    "header-case" "^2.0.4"
-    "no-case" "^3.0.4"
-    "param-case" "^3.0.4"
-    "pascal-case" "^3.1.2"
-    "path-case" "^3.0.4"
-    "sentence-case" "^3.0.4"
-    "snake-case" "^3.0.4"
-    "tslib" "^2.0.3"
+    camel-case "^4.1.2"
+    capital-case "^1.0.4"
+    constant-case "^3.0.4"
+    dot-case "^3.0.4"
+    header-case "^2.0.4"
+    no-case "^3.0.4"
+    param-case "^3.0.4"
+    pascal-case "^3.1.2"
+    path-case "^3.0.4"
+    sentence-case "^3.0.4"
+    snake-case "^3.0.4"
+    tslib "^2.0.3"
 
 "chokidar@>=3.0.0 <4.0.0":
-  "integrity" "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ=="
-  "resolved" "https://registry.npmmirror.com/chokidar/download/chokidar-3.5.2.tgz"
-  "version" "3.5.2"
+  version "3.5.2"
+  resolved "https://registry.npmmirror.com/chokidar/download/chokidar-3.5.2.tgz"
+  integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
   dependencies:
-    "anymatch" "~3.1.2"
-    "braces" "~3.0.2"
-    "glob-parent" "~5.1.2"
-    "is-binary-path" "~2.1.0"
-    "is-glob" "~4.0.1"
-    "normalize-path" "~3.0.0"
-    "readdirp" "~3.6.0"
+    anymatch "~3.1.2"
+    braces "~3.0.2"
+    glob-parent "~5.1.2"
+    is-binary-path "~2.1.0"
+    is-glob "~4.0.1"
+    normalize-path "~3.0.0"
+    readdirp "~3.6.0"
   optionalDependencies:
-    "fsevents" "~2.3.2"
+    fsevents "~2.3.2"
 
-"class-utils@^0.3.5":
-  "integrity" "sha1-+TNprouafOAv1B+q0MqDAzGQxGM="
-  "resolved" "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz"
-  "version" "0.3.6"
+class-utils@^0.3.5:
+  version "0.3.6"
+  resolved "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz"
+  integrity sha1-+TNprouafOAv1B+q0MqDAzGQxGM=
   dependencies:
-    "arr-union" "^3.1.0"
-    "define-property" "^0.2.5"
-    "isobject" "^3.0.0"
-    "static-extend" "^0.1.1"
+    arr-union "^3.1.0"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    static-extend "^0.1.1"
 
-"clone@^2.1.1":
-  "integrity" "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
-  "resolved" "https://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz?cache=0&sync_timestamp=1589682821772&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclone%2Fdownload%2Fclone-2.1.2.tgz"
-  "version" "2.1.2"
+clone@^2.1.1:
+  version "2.1.2"
+  resolved "https://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz?cache=0&sync_timestamp=1589682821772&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclone%2Fdownload%2Fclone-2.1.2.tgz"
+  integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
 
-"collection-visit@^1.0.0":
-  "integrity" "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA="
-  "resolved" "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz"
-  "version" "1.0.0"
+collection-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz"
+  integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
   dependencies:
-    "map-visit" "^1.0.0"
-    "object-visit" "^1.0.0"
+    map-visit "^1.0.0"
+    object-visit "^1.0.0"
 
-"color-convert@^1.9.0":
-  "integrity" "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg="
-  "resolved" "https://registry.npmmirror.com/color-convert/download/color-convert-1.9.3.tgz"
-  "version" "1.9.3"
+color-convert@^1.9.0:
+  version "1.9.3"
+  resolved "https://registry.npmmirror.com/color-convert/download/color-convert-1.9.3.tgz"
+  integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=
   dependencies:
-    "color-name" "1.1.3"
+    color-name "1.1.3"
 
-"color-convert@^2.0.1":
-  "integrity" "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM="
-  "resolved" "https://registry.npmmirror.com/color-convert/download/color-convert-2.0.1.tgz"
-  "version" "2.0.1"
+color-convert@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/color-convert/download/color-convert-2.0.1.tgz"
+  integrity sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=
   dependencies:
-    "color-name" "~1.1.4"
+    color-name "~1.1.4"
 
-"color-name@~1.1.4":
-  "integrity" "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI="
-  "resolved" "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz"
-  "version" "1.1.4"
+color-name@1.1.3:
+  version "1.1.3"
+  resolved "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz"
+  integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
 
-"color-name@1.1.3":
-  "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
-  "resolved" "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz"
-  "version" "1.1.3"
+color-name@~1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz"
+  integrity sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=
 
-"commander@^7.2.0":
-  "integrity" "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="
-  "resolved" "https://registry.npmmirror.com/commander/download/commander-7.2.0.tgz"
-  "version" "7.2.0"
+commander@^7.2.0:
+  version "7.2.0"
+  resolved "https://registry.npmmirror.com/commander/download/commander-7.2.0.tgz"
+  integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
 
-"component-emitter@^1.2.1":
-  "integrity" "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A="
-  "resolved" "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz"
-  "version" "1.3.0"
+component-emitter@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz"
+  integrity sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=
 
-"compute-scroll-into-view@^1.0.17":
-  "integrity" "sha1-aojxis2dQunPS6pr7H4FImB6t6s="
-  "resolved" "https://registry.npm.taobao.org/compute-scroll-into-view/download/compute-scroll-into-view-1.0.17.tgz?cache=0&sync_timestamp=1614043178722&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcompute-scroll-into-view%2Fdownload%2Fcompute-scroll-into-view-1.0.17.tgz"
-  "version" "1.0.17"
+compute-scroll-into-view@^1.0.17:
+  version "1.0.17"
+  resolved "https://registry.npm.taobao.org/compute-scroll-into-view/download/compute-scroll-into-view-1.0.17.tgz?cache=0&sync_timestamp=1614043178722&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcompute-scroll-into-view%2Fdownload%2Fcompute-scroll-into-view-1.0.17.tgz"
+  integrity sha1-aojxis2dQunPS6pr7H4FImB6t6s=
 
-"concat-map@0.0.1":
-  "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-  "resolved" "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz"
-  "version" "0.0.1"
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz"
+  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
 
-"constant-case@^3.0.4":
-  "integrity" "sha1-O4Sprq9M8x7EXmv13pG9+wWJ+vE="
-  "resolved" "https://registry.npm.taobao.org/constant-case/download/constant-case-3.0.4.tgz?cache=0&sync_timestamp=1606867325763&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconstant-case%2Fdownload%2Fconstant-case-3.0.4.tgz"
-  "version" "3.0.4"
+constant-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npm.taobao.org/constant-case/download/constant-case-3.0.4.tgz?cache=0&sync_timestamp=1606867325763&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconstant-case%2Fdownload%2Fconstant-case-3.0.4.tgz"
+  integrity sha1-O4Sprq9M8x7EXmv13pG9+wWJ+vE=
   dependencies:
-    "no-case" "^3.0.4"
-    "tslib" "^2.0.3"
-    "upper-case" "^2.0.2"
+    no-case "^3.0.4"
+    tslib "^2.0.3"
+    upper-case "^2.0.2"
 
-"convert-source-map@^1.7.0":
-  "integrity" "sha1-8zc8MtIbTXgN2ABFFGhPt5HKQ2k="
-  "resolved" "https://registry.nlark.com/convert-source-map/download/convert-source-map-1.8.0.tgz?cache=0&sync_timestamp=1624045304679&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fconvert-source-map%2Fdownload%2Fconvert-source-map-1.8.0.tgz"
-  "version" "1.8.0"
+convert-source-map@^1.7.0:
+  version "1.8.0"
+  resolved "https://registry.nlark.com/convert-source-map/download/convert-source-map-1.8.0.tgz?cache=0&sync_timestamp=1624045304679&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fconvert-source-map%2Fdownload%2Fconvert-source-map-1.8.0.tgz"
+  integrity sha1-8zc8MtIbTXgN2ABFFGhPt5HKQ2k=
   dependencies:
-    "safe-buffer" "~5.1.1"
+    safe-buffer "~5.1.1"
 
-"cookie-storage@^6.1.0":
-  "integrity" "sha1-KRsvZi2WG+RPmZYmWTQhy/zyN5A="
-  "resolved" "https://registry.nlark.com/cookie-storage/download/cookie-storage-6.1.0.tgz"
-  "version" "6.1.0"
+cookie-storage@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.nlark.com/cookie-storage/download/cookie-storage-6.1.0.tgz"
+  integrity sha1-KRsvZi2WG+RPmZYmWTQhy/zyN5A=
 
-"copy-descriptor@^0.1.0":
-  "integrity" "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
-  "resolved" "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz"
-  "version" "0.1.1"
+copy-descriptor@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz"
+  integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
 
-"copy-text-to-clipboard@^3.0.1":
-  "integrity" "sha1-jL+PkOCkfxLkokdDc2Jl0Ve85pw="
-  "resolved" "https://registry.npm.taobao.org/copy-text-to-clipboard/download/copy-text-to-clipboard-3.0.1.tgz"
-  "version" "3.0.1"
+copy-text-to-clipboard@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npm.taobao.org/copy-text-to-clipboard/download/copy-text-to-clipboard-3.0.1.tgz"
+  integrity sha1-jL+PkOCkfxLkokdDc2Jl0Ve85pw=
 
-"core-js@^3.11.0", "core-js@^3.15.1", "core-js@^3.19.1":
-  "integrity" "sha512-nuqhq11DcOAbFBV4zCbKeGbKQsUDRqTX0oqx7AttUBuqe3h20ixsE039QHelbL6P4h+9kytVqyEtyZ6gsiwEYw=="
-  "resolved" "https://registry.npmmirror.com/core-js/download/core-js-3.20.2.tgz"
-  "version" "3.20.2"
+core-js@^3.11.0, core-js@^3.15.1, core-js@^3.19.1:
+  version "3.20.2"
+  resolved "https://registry.npmmirror.com/core-js/download/core-js-3.20.2.tgz"
+  integrity sha512-nuqhq11DcOAbFBV4zCbKeGbKQsUDRqTX0oqx7AttUBuqe3h20ixsE039QHelbL6P4h+9kytVqyEtyZ6gsiwEYw==
 
-"core-util-is@~1.0.0":
-  "integrity" "sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U="
-  "resolved" "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.3.tgz"
-  "version" "1.0.3"
+core-util-is@~1.0.0:
+  version "1.0.3"
+  resolved "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.3.tgz"
+  integrity sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U=
 
-"cors@^2.8.5":
-  "integrity" "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="
-  "resolved" "https://registry.npmmirror.com/cors/download/cors-2.8.5.tgz"
-  "version" "2.8.5"
+cors@^2.8.5:
+  version "2.8.5"
+  resolved "https://registry.npmmirror.com/cors/download/cors-2.8.5.tgz"
+  integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
   dependencies:
-    "object-assign" "^4"
-    "vary" "^1"
+    object-assign "^4"
+    vary "^1"
 
-"cross-spawn@^7.0.2":
-  "integrity" "sha1-9zqFudXUHQRVUcF34ogtSshXKKY="
-  "resolved" "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz"
-  "version" "7.0.3"
+cross-spawn@^7.0.2:
+  version "7.0.3"
+  resolved "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz"
+  integrity sha1-9zqFudXUHQRVUcF34ogtSshXKKY=
   dependencies:
-    "path-key" "^3.1.0"
-    "shebang-command" "^2.0.0"
-    "which" "^2.0.1"
+    path-key "^3.1.0"
+    shebang-command "^2.0.0"
+    which "^2.0.1"
 
-"css-select@^4.1.3":
-  "integrity" "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ=="
-  "resolved" "https://registry.npmmirror.com/css-select/download/css-select-4.2.1.tgz"
-  "version" "4.2.1"
+css-select@^4.1.3:
+  version "4.2.1"
+  resolved "https://registry.npmmirror.com/css-select/download/css-select-4.2.1.tgz"
+  integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==
   dependencies:
-    "boolbase" "^1.0.0"
-    "css-what" "^5.1.0"
-    "domhandler" "^4.3.0"
-    "domutils" "^2.8.0"
-    "nth-check" "^2.0.1"
+    boolbase "^1.0.0"
+    css-what "^5.1.0"
+    domhandler "^4.3.0"
+    domutils "^2.8.0"
+    nth-check "^2.0.1"
 
-"css-tree@^1.1.2", "css-tree@^1.1.3":
-  "integrity" "sha1-60hw+2/XcHMn7JXC/yqwm16NuR0="
-  "resolved" "https://registry.npmmirror.com/css-tree/download/css-tree-1.1.3.tgz"
-  "version" "1.1.3"
+css-tree@^1.1.2, css-tree@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/css-tree/download/css-tree-1.1.3.tgz"
+  integrity sha1-60hw+2/XcHMn7JXC/yqwm16NuR0=
   dependencies:
-    "mdn-data" "2.0.14"
-    "source-map" "^0.6.1"
+    mdn-data "2.0.14"
+    source-map "^0.6.1"
 
-"css-what@^5.1.0":
-  "integrity" "sha1-P3tweq32M7r2LCzrhXm1RbtA9/4="
-  "resolved" "https://registry.npmmirror.com/css-what/download/css-what-5.1.0.tgz"
-  "version" "5.1.0"
+css-what@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.npmmirror.com/css-what/download/css-what-5.1.0.tgz"
+  integrity sha1-P3tweq32M7r2LCzrhXm1RbtA9/4=
 
-"csso@^4.2.0":
-  "integrity" "sha1-6jpWE0bo3J9UbW/r7dUBh884lSk="
-  "resolved" "https://registry.npmmirror.com/csso/download/csso-4.2.0.tgz"
-  "version" "4.2.0"
+csso@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.npmmirror.com/csso/download/csso-4.2.0.tgz"
+  integrity sha1-6jpWE0bo3J9UbW/r7dUBh884lSk=
   dependencies:
-    "css-tree" "^1.1.2"
+    css-tree "^1.1.2"
 
-"csstype@^2.6.8":
-  "integrity" "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ=="
-  "resolved" "https://registry.npmmirror.com/csstype/download/csstype-2.6.19.tgz?cache=0&sync_timestamp=1637224514674&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcsstype%2Fdownload%2Fcsstype-2.6.19.tgz"
-  "version" "2.6.19"
+csstype@^2.6.8:
+  version "2.6.19"
+  resolved "https://registry.npmmirror.com/csstype/download/csstype-2.6.19.tgz?cache=0&sync_timestamp=1637224514674&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcsstype%2Fdownload%2Fcsstype-2.6.19.tgz"
+  integrity sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==
 
-"debug@^2.2.0":
-  "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
-  "resolved" "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz"
-  "version" "2.6.9"
+debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
+  version "2.6.9"
+  resolved "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz"
+  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
   dependencies:
-    "ms" "2.0.0"
+    ms "2.0.0"
 
-"debug@^2.3.3":
-  "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
-  "resolved" "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz"
-  "version" "2.6.9"
+debug@^3.2.7:
+  version "3.2.7"
+  resolved "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz"
+  integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
   dependencies:
-    "ms" "2.0.0"
+    ms "^2.1.1"
 
-"debug@^2.6.9":
-  "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
-  "resolved" "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz"
-  "version" "2.6.9"
+debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3:
+  version "4.3.3"
+  resolved "https://registry.npmmirror.com/debug/download/debug-4.3.3.tgz"
+  integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
   dependencies:
-    "ms" "2.0.0"
+    ms "2.1.2"
 
-"debug@^3.2.7":
-  "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="
-  "resolved" "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz"
-  "version" "3.2.7"
+decode-uri-component@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz"
+  integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+deep-is@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.nlark.com/deep-is/download/deep-is-0.1.4.tgz"
+  integrity sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE=
+
+define-properties@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz"
+  integrity sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=
   dependencies:
-    "ms" "^2.1.1"
+    object-keys "^1.0.12"
 
-"debug@^4.0.1", "debug@^4.1.0", "debug@^4.1.1", "debug@^4.3.2", "debug@^4.3.3":
-  "integrity" "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q=="
-  "resolved" "https://registry.npmmirror.com/debug/download/debug-4.3.3.tgz"
-  "version" "4.3.3"
+define-property@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz"
+  integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
   dependencies:
-    "ms" "2.1.2"
+    is-descriptor "^0.1.0"
 
-"decode-uri-component@^0.2.0":
-  "integrity" "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
-  "resolved" "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz"
-  "version" "0.2.0"
-
-"deep-is@^0.1.3":
-  "integrity" "sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE="
-  "resolved" "https://registry.nlark.com/deep-is/download/deep-is-0.1.4.tgz"
-  "version" "0.1.4"
-
-"define-properties@^1.1.3":
-  "integrity" "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE="
-  "resolved" "https://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz"
-  "version" "1.1.3"
+define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz"
+  integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
   dependencies:
-    "object-keys" "^1.0.12"
+    is-descriptor "^1.0.0"
 
-"define-property@^0.2.5":
-  "integrity" "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY="
-  "resolved" "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz"
-  "version" "0.2.5"
+define-property@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz"
+  integrity sha1-1Flono1lS6d+AqgX+HENcCyxbp0=
   dependencies:
-    "is-descriptor" "^0.1.0"
+    is-descriptor "^1.0.2"
+    isobject "^3.0.1"
 
-"define-property@^1.0.0":
-  "integrity" "sha1-dp66rz9KY6rTr56NMEybvnm/sOY="
-  "resolved" "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz"
-  "version" "1.0.0"
+dir-glob@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npm.taobao.org/dir-glob/download/dir-glob-3.0.1.tgz"
+  integrity sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=
   dependencies:
-    "is-descriptor" "^1.0.0"
+    path-type "^4.0.0"
 
-"define-property@^2.0.2":
-  "integrity" "sha1-1Flono1lS6d+AqgX+HENcCyxbp0="
-  "resolved" "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz"
-  "version" "2.0.2"
+doctrine@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npm.taobao.org/doctrine/download/doctrine-2.1.0.tgz"
+  integrity sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=
   dependencies:
-    "is-descriptor" "^1.0.2"
-    "isobject" "^3.0.1"
+    esutils "^2.0.2"
 
-"dir-glob@^3.0.1":
-  "integrity" "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8="
-  "resolved" "https://registry.npm.taobao.org/dir-glob/download/dir-glob-3.0.1.tgz"
-  "version" "3.0.1"
+doctrine@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz"
+  integrity sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=
   dependencies:
-    "path-type" "^4.0.0"
+    esutils "^2.0.2"
 
-"doctrine@^2.1.0":
-  "integrity" "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850="
-  "resolved" "https://registry.npm.taobao.org/doctrine/download/doctrine-2.1.0.tgz"
-  "version" "2.1.0"
+dom-align@^1.12.1:
+  version "1.12.2"
+  resolved "https://registry.nlark.com/dom-align/download/dom-align-1.12.2.tgz"
+  integrity sha1-D4Fk69DJwhsMeQMQSTzYVYkqzUs=
+
+dom-scroll-into-view@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npm.taobao.org/dom-scroll-into-view/download/dom-scroll-into-view-2.0.1.tgz"
+  integrity sha1-DezIUigB/Y0/HGujVadNOCxfmJs=
+
+dom-serializer@0:
+  version "0.2.2"
+  resolved "https://registry.nlark.com/dom-serializer/download/dom-serializer-0.2.2.tgz?cache=0&sync_timestamp=1621256830355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-0.2.2.tgz"
+  integrity sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=
   dependencies:
-    "esutils" "^2.0.2"
+    domelementtype "^2.0.1"
+    entities "^2.0.0"
 
-"doctrine@^3.0.0":
-  "integrity" "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE="
-  "resolved" "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz"
-  "version" "3.0.0"
+dom-serializer@^1.0.1:
+  version "1.3.2"
+  resolved "https://registry.nlark.com/dom-serializer/download/dom-serializer-1.3.2.tgz?cache=0&sync_timestamp=1621256830355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.3.2.tgz"
+  integrity sha1-YgZDfTLO767HFhgDIwx6ILwbTZE=
   dependencies:
-    "esutils" "^2.0.2"
+    domelementtype "^2.0.1"
+    domhandler "^4.2.0"
+    entities "^2.0.0"
 
-"dom-align@^1.12.1":
-  "integrity" "sha1-D4Fk69DJwhsMeQMQSTzYVYkqzUs="
-  "resolved" "https://registry.nlark.com/dom-align/download/dom-align-1.12.2.tgz"
-  "version" "1.12.2"
+domelementtype@1, domelementtype@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz?cache=0&sync_timestamp=1617298554829&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-1.3.1.tgz"
+  integrity sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=
 
-"dom-scroll-into-view@^2.0.0":
-  "integrity" "sha1-DezIUigB/Y0/HGujVadNOCxfmJs="
-  "resolved" "https://registry.npm.taobao.org/dom-scroll-into-view/download/dom-scroll-into-view-2.0.1.tgz"
-  "version" "2.0.1"
+domelementtype@^2.0.1, domelementtype@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz?cache=0&sync_timestamp=1617298554829&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.2.0.tgz"
+  integrity sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=
 
-"dom-serializer@^1.0.1":
-  "integrity" "sha1-YgZDfTLO767HFhgDIwx6ILwbTZE="
-  "resolved" "https://registry.nlark.com/dom-serializer/download/dom-serializer-1.3.2.tgz?cache=0&sync_timestamp=1621256830355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.3.2.tgz"
-  "version" "1.3.2"
+domhandler@^2.3.0:
+  version "2.4.2"
+  resolved "https://registry.npmmirror.com/domhandler/download/domhandler-2.4.2.tgz"
+  integrity sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=
   dependencies:
-    "domelementtype" "^2.0.1"
-    "domhandler" "^4.2.0"
-    "entities" "^2.0.0"
+    domelementtype "1"
 
-"dom-serializer@0":
-  "integrity" "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E="
-  "resolved" "https://registry.nlark.com/dom-serializer/download/dom-serializer-0.2.2.tgz?cache=0&sync_timestamp=1621256830355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-0.2.2.tgz"
-  "version" "0.2.2"
+domhandler@^4.2.0, domhandler@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/domhandler/download/domhandler-4.3.0.tgz"
+  integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==
   dependencies:
-    "domelementtype" "^2.0.1"
-    "entities" "^2.0.0"
+    domelementtype "^2.2.0"
 
-"domelementtype@^1.3.1", "domelementtype@1":
-  "integrity" "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8="
-  "resolved" "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz?cache=0&sync_timestamp=1617298554829&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-1.3.1.tgz"
-  "version" "1.3.1"
-
-"domelementtype@^2.0.1", "domelementtype@^2.2.0":
-  "integrity" "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc="
-  "resolved" "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz?cache=0&sync_timestamp=1617298554829&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.2.0.tgz"
-  "version" "2.2.0"
-
-"domhandler@^2.3.0":
-  "integrity" "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM="
-  "resolved" "https://registry.npmmirror.com/domhandler/download/domhandler-2.4.2.tgz"
-  "version" "2.4.2"
+domutils@^1.5.1:
+  version "1.7.0"
+  resolved "https://registry.npmmirror.com/domutils/download/domutils-1.7.0.tgz"
+  integrity sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=
   dependencies:
-    "domelementtype" "1"
+    dom-serializer "0"
+    domelementtype "1"
 
-"domhandler@^4.2.0", "domhandler@^4.3.0":
-  "integrity" "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g=="
-  "resolved" "https://registry.npmmirror.com/domhandler/download/domhandler-4.3.0.tgz"
-  "version" "4.3.0"
+domutils@^2.8.0:
+  version "2.8.0"
+  resolved "https://registry.npmmirror.com/domutils/download/domutils-2.8.0.tgz"
+  integrity sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU=
   dependencies:
-    "domelementtype" "^2.2.0"
+    dom-serializer "^1.0.1"
+    domelementtype "^2.2.0"
+    domhandler "^4.2.0"
 
-"domutils@^1.5.1":
-  "integrity" "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo="
-  "resolved" "https://registry.npmmirror.com/domutils/download/domutils-1.7.0.tgz"
-  "version" "1.7.0"
+dot-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npm.taobao.org/dot-case/download/dot-case-3.0.4.tgz?cache=0&sync_timestamp=1606867327042&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-case%2Fdownload%2Fdot-case-3.0.4.tgz"
+  integrity sha1-mytnDQCkMWZ6inW6Kc0bmICc51E=
   dependencies:
-    "dom-serializer" "0"
-    "domelementtype" "1"
+    no-case "^3.0.4"
+    tslib "^2.0.3"
 
-"domutils@^2.8.0":
-  "integrity" "sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU="
-  "resolved" "https://registry.npmmirror.com/domutils/download/domutils-2.8.0.tgz"
-  "version" "2.8.0"
+duplexer2@~0.1.4:
+  version "0.1.4"
+  resolved "https://registry.npm.taobao.org/duplexer2/download/duplexer2-0.1.4.tgz"
+  integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=
   dependencies:
-    "dom-serializer" "^1.0.1"
-    "domelementtype" "^2.2.0"
-    "domhandler" "^4.2.0"
+    readable-stream "^2.0.2"
 
-"dot-case@^3.0.4":
-  "integrity" "sha1-mytnDQCkMWZ6inW6Kc0bmICc51E="
-  "resolved" "https://registry.npm.taobao.org/dot-case/download/dot-case-3.0.4.tgz?cache=0&sync_timestamp=1606867327042&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-case%2Fdownload%2Fdot-case-3.0.4.tgz"
-  "version" "3.0.4"
+electron-to-chromium@^1.4.17:
+  version "1.4.43"
+  resolved "https://registry.npmmirror.com/electron-to-chromium/download/electron-to-chromium-1.4.43.tgz"
+  integrity sha512-PO3kEfcxPrti/4STbXvCkNIF4fgWvCKl2508e6UI7KomCDffpIfeBZLXsh5DK/XGsjUw3kwq6WEsi0MJTlGAdg==
+
+emoji-regex@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1632751333727&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz"
+  integrity sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=
+
+emojis-list@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz"
+  integrity sha1-VXBmIEatKeLpFucariYKvf9Pang=
+
+enquirer@^2.3.5:
+  version "2.3.6"
+  resolved "https://registry.npm.taobao.org/enquirer/download/enquirer-2.3.6.tgz"
+  integrity sha1-Kn/l3WNKHkElqXXsmU/1RW3Dc00=
   dependencies:
-    "no-case" "^3.0.4"
-    "tslib" "^2.0.3"
+    ansi-colors "^4.1.1"
 
-"duplexer2@~0.1.4":
-  "integrity" "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME="
-  "resolved" "https://registry.npm.taobao.org/duplexer2/download/duplexer2-0.1.4.tgz"
-  "version" "0.1.4"
+entities@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.nlark.com/entities/download/entities-1.1.2.tgz?cache=0&sync_timestamp=1628508126700&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-1.1.2.tgz"
+  integrity sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=
+
+entities@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.nlark.com/entities/download/entities-2.2.0.tgz?cache=0&sync_timestamp=1628508126700&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-2.2.0.tgz"
+  integrity sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=
+
+es-abstract@^1.19.0, es-abstract@^1.19.1:
+  version "1.19.1"
+  resolved "https://registry.npmmirror.com/es-abstract/download/es-abstract-1.19.1.tgz?cache=0&sync_timestamp=1633234313248&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fes-abstract%2Fdownload%2Fes-abstract-1.19.1.tgz"
+  integrity sha1-1IhXlodpFpWd547aoN9FZicRXsM=
   dependencies:
-    "readable-stream" "^2.0.2"
+    call-bind "^1.0.2"
+    es-to-primitive "^1.2.1"
+    function-bind "^1.1.1"
+    get-intrinsic "^1.1.1"
+    get-symbol-description "^1.0.0"
+    has "^1.0.3"
+    has-symbols "^1.0.2"
+    internal-slot "^1.0.3"
+    is-callable "^1.2.4"
+    is-negative-zero "^2.0.1"
+    is-regex "^1.1.4"
+    is-shared-array-buffer "^1.0.1"
+    is-string "^1.0.7"
+    is-weakref "^1.0.1"
+    object-inspect "^1.11.0"
+    object-keys "^1.1.1"
+    object.assign "^4.1.2"
+    string.prototype.trimend "^1.0.4"
+    string.prototype.trimstart "^1.0.4"
+    unbox-primitive "^1.0.1"
 
-"electron-to-chromium@^1.4.17":
-  "integrity" "sha512-PO3kEfcxPrti/4STbXvCkNIF4fgWvCKl2508e6UI7KomCDffpIfeBZLXsh5DK/XGsjUw3kwq6WEsi0MJTlGAdg=="
-  "resolved" "https://registry.npmmirror.com/electron-to-chromium/download/electron-to-chromium-1.4.43.tgz"
-  "version" "1.4.43"
+es-module-lexer@^0.9.3:
+  version "0.9.3"
+  resolved "https://registry.npmmirror.com/es-module-lexer/download/es-module-lexer-0.9.3.tgz?cache=0&sync_timestamp=1633645560577&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fes-module-lexer%2Fdownload%2Fes-module-lexer-0.9.3.tgz"
+  integrity sha1-bxPbAMw4QXE32vdDZvU1yOtDjxk=
 
-"emoji-regex@^8.0.0":
-  "integrity" "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc="
-  "resolved" "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1632751333727&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz"
-  "version" "8.0.0"
-
-"emojis-list@^3.0.0":
-  "integrity" "sha1-VXBmIEatKeLpFucariYKvf9Pang="
-  "resolved" "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz"
-  "version" "3.0.0"
-
-"enquirer@^2.3.5":
-  "integrity" "sha1-Kn/l3WNKHkElqXXsmU/1RW3Dc00="
-  "resolved" "https://registry.npm.taobao.org/enquirer/download/enquirer-2.3.6.tgz"
-  "version" "2.3.6"
+es-to-primitive@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.nlark.com/es-to-primitive/download/es-to-primitive-1.2.1.tgz"
+  integrity sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=
   dependencies:
-    "ansi-colors" "^4.1.1"
+    is-callable "^1.1.4"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.2"
 
-"entities@^1.1.1":
-  "integrity" "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY="
-  "resolved" "https://registry.nlark.com/entities/download/entities-1.1.2.tgz?cache=0&sync_timestamp=1628508126700&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-1.1.2.tgz"
-  "version" "1.1.2"
+esbuild-android-arm64@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.13.15.tgz#3fc3ff0bab76fe35dd237476b5d2b32bb20a3d44"
+  integrity sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==
 
-"entities@^2.0.0":
-  "integrity" "sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU="
-  "resolved" "https://registry.nlark.com/entities/download/entities-2.2.0.tgz?cache=0&sync_timestamp=1628508126700&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-2.2.0.tgz"
-  "version" "2.2.0"
+esbuild-darwin-64@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-darwin-64/download/esbuild-darwin-64-0.13.15.tgz"
+  integrity sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==
 
-"es-abstract@^1.19.0", "es-abstract@^1.19.1":
-  "integrity" "sha1-1IhXlodpFpWd547aoN9FZicRXsM="
-  "resolved" "https://registry.npmmirror.com/es-abstract/download/es-abstract-1.19.1.tgz?cache=0&sync_timestamp=1633234313248&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fes-abstract%2Fdownload%2Fes-abstract-1.19.1.tgz"
-  "version" "1.19.1"
-  dependencies:
-    "call-bind" "^1.0.2"
-    "es-to-primitive" "^1.2.1"
-    "function-bind" "^1.1.1"
-    "get-intrinsic" "^1.1.1"
-    "get-symbol-description" "^1.0.0"
-    "has" "^1.0.3"
-    "has-symbols" "^1.0.2"
-    "internal-slot" "^1.0.3"
-    "is-callable" "^1.2.4"
-    "is-negative-zero" "^2.0.1"
-    "is-regex" "^1.1.4"
-    "is-shared-array-buffer" "^1.0.1"
-    "is-string" "^1.0.7"
-    "is-weakref" "^1.0.1"
-    "object-inspect" "^1.11.0"
-    "object-keys" "^1.1.1"
-    "object.assign" "^4.1.2"
-    "string.prototype.trimend" "^1.0.4"
-    "string.prototype.trimstart" "^1.0.4"
-    "unbox-primitive" "^1.0.1"
+esbuild-darwin-arm64@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.15.tgz#1b07f893b632114f805e188ddfca41b2b778229a"
+  integrity sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ==
 
-"es-module-lexer@^0.9.3":
-  "integrity" "sha1-bxPbAMw4QXE32vdDZvU1yOtDjxk="
-  "resolved" "https://registry.npmmirror.com/es-module-lexer/download/es-module-lexer-0.9.3.tgz?cache=0&sync_timestamp=1633645560577&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fes-module-lexer%2Fdownload%2Fes-module-lexer-0.9.3.tgz"
-  "version" "0.9.3"
+esbuild-freebsd-64@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.15.tgz#0b8b7eca1690c8ec94c75680c38c07269c1f4a85"
+  integrity sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==
 
-"es-to-primitive@^1.2.1":
-  "integrity" "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo="
-  "resolved" "https://registry.nlark.com/es-to-primitive/download/es-to-primitive-1.2.1.tgz"
-  "version" "1.2.1"
-  dependencies:
-    "is-callable" "^1.1.4"
-    "is-date-object" "^1.0.1"
-    "is-symbol" "^1.0.2"
+esbuild-freebsd-arm64@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.15.tgz#2e1a6c696bfdcd20a99578b76350b41db1934e52"
+  integrity sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==
 
-"esbuild-darwin-64@0.13.15":
-  "integrity" "sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ=="
-  "resolved" "https://registry.npmmirror.com/esbuild-darwin-64/download/esbuild-darwin-64-0.13.15.tgz"
-  "version" "0.13.15"
+esbuild-linux-32@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.13.15.tgz#6fd39f36fc66dd45b6b5f515728c7bbebc342a69"
+  integrity sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==
 
-"esbuild@^0.13.12":
-  "integrity" "sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw=="
-  "resolved" "https://registry.npmmirror.com/esbuild/download/esbuild-0.13.15.tgz"
-  "version" "0.13.15"
+esbuild-linux-64@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.13.15.tgz#9cb8e4bcd7574e67946e4ee5f1f1e12386bb6dd3"
+  integrity sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==
+
+esbuild-linux-arm64@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.15.tgz#3891aa3704ec579a1b92d2a586122e5b6a2bfba1"
+  integrity sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==
+
+esbuild-linux-arm@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.13.15.tgz#8a00e99e6a0c6c9a6b7f334841364d8a2b4aecfe"
+  integrity sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==
+
+esbuild-linux-mips64le@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.15.tgz#36b07cc47c3d21e48db3bb1f4d9ef8f46aead4f7"
+  integrity sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==
+
+esbuild-linux-ppc64le@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.15.tgz#f7e6bba40b9a11eb9dcae5b01550ea04670edad2"
+  integrity sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==
+
+esbuild-netbsd-64@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.15.tgz#a2fedc549c2b629d580a732d840712b08d440038"
+  integrity sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==
+
+esbuild-openbsd-64@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.15.tgz#b22c0e5806d3a1fbf0325872037f885306b05cd7"
+  integrity sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g==
+
+esbuild-sunos-64@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.13.15.tgz#d0b6454a88375ee8d3964daeff55c85c91c7cef4"
+  integrity sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw==
+
+esbuild-windows-32@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.13.15.tgz#c96d0b9bbb52f3303322582ef8e4847c5ad375a7"
+  integrity sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==
+
+esbuild-windows-64@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.13.15.tgz#1f79cb9b1e1bb02fb25cd414cb90d4ea2892c294"
+  integrity sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==
+
+esbuild-windows-arm64@0.13.15:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.15.tgz#482173070810df22a752c686509c370c3be3b3c3"
+  integrity sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==
+
+esbuild@^0.13.12:
+  version "0.13.15"
+  resolved "https://registry.npmmirror.com/esbuild/download/esbuild-0.13.15.tgz"
+  integrity sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==
   optionalDependencies:
-    "esbuild-android-arm64" "0.13.15"
-    "esbuild-darwin-64" "0.13.15"
-    "esbuild-darwin-arm64" "0.13.15"
-    "esbuild-freebsd-64" "0.13.15"
-    "esbuild-freebsd-arm64" "0.13.15"
-    "esbuild-linux-32" "0.13.15"
-    "esbuild-linux-64" "0.13.15"
-    "esbuild-linux-arm" "0.13.15"
-    "esbuild-linux-arm64" "0.13.15"
-    "esbuild-linux-mips64le" "0.13.15"
-    "esbuild-linux-ppc64le" "0.13.15"
-    "esbuild-netbsd-64" "0.13.15"
-    "esbuild-openbsd-64" "0.13.15"
-    "esbuild-sunos-64" "0.13.15"
-    "esbuild-windows-32" "0.13.15"
-    "esbuild-windows-64" "0.13.15"
-    "esbuild-windows-arm64" "0.13.15"
+    esbuild-android-arm64 "0.13.15"
+    esbuild-darwin-64 "0.13.15"
+    esbuild-darwin-arm64 "0.13.15"
+    esbuild-freebsd-64 "0.13.15"
+    esbuild-freebsd-arm64 "0.13.15"
+    esbuild-linux-32 "0.13.15"
+    esbuild-linux-64 "0.13.15"
+    esbuild-linux-arm "0.13.15"
+    esbuild-linux-arm64 "0.13.15"
+    esbuild-linux-mips64le "0.13.15"
+    esbuild-linux-ppc64le "0.13.15"
+    esbuild-netbsd-64 "0.13.15"
+    esbuild-openbsd-64 "0.13.15"
+    esbuild-sunos-64 "0.13.15"
+    esbuild-windows-32 "0.13.15"
+    esbuild-windows-64 "0.13.15"
+    esbuild-windows-arm64 "0.13.15"
 
-"escalade@^3.1.1":
-  "integrity" "sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA="
-  "resolved" "https://registry.npm.taobao.org/escalade/download/escalade-3.1.1.tgz?cache=0&sync_timestamp=1602567224085&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescalade%2Fdownload%2Fescalade-3.1.1.tgz"
-  "version" "3.1.1"
+escalade@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.npm.taobao.org/escalade/download/escalade-3.1.1.tgz?cache=0&sync_timestamp=1602567224085&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescalade%2Fdownload%2Fescalade-3.1.1.tgz"
+  integrity sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=
 
-"escape-string-regexp@^1.0.2":
-  "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
-  "resolved" "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz"
-  "version" "1.0.5"
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz"
+  integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
 
-"escape-string-regexp@^1.0.5":
-  "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
-  "resolved" "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz"
-  "version" "1.0.5"
+escape-string-regexp@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-4.0.0.tgz"
+  integrity sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=
 
-"escape-string-regexp@^4.0.0":
-  "integrity" "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ="
-  "resolved" "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-4.0.0.tgz"
-  "version" "4.0.0"
+eslint-config-standard@^16.0.3:
+  version "16.0.3"
+  resolved "https://registry.npmmirror.com/eslint-config-standard/download/eslint-config-standard-16.0.3.tgz"
+  integrity sha1-bIdh5UTpbFMf+SZC7rh4QrhIhRY=
 
-"escape-string-regexp@1.0.5":
-  "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
-  "resolved" "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz"
-  "version" "1.0.5"
-
-"eslint-config-standard@^16.0.3":
-  "integrity" "sha1-bIdh5UTpbFMf+SZC7rh4QrhIhRY="
-  "resolved" "https://registry.npmmirror.com/eslint-config-standard/download/eslint-config-standard-16.0.3.tgz"
-  "version" "16.0.3"
-
-"eslint-import-resolver-node@^0.3.6":
-  "integrity" "sha1-QEi5WDldqJZoJSAB29nsprg7rL0="
-  "resolved" "https://registry.nlark.com/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.6.tgz?cache=0&sync_timestamp=1629046546232&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-import-resolver-node%2Fdownload%2Feslint-import-resolver-node-0.3.6.tgz"
-  "version" "0.3.6"
+eslint-import-resolver-node@^0.3.6:
+  version "0.3.6"
+  resolved "https://registry.nlark.com/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.6.tgz?cache=0&sync_timestamp=1629046546232&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-import-resolver-node%2Fdownload%2Feslint-import-resolver-node-0.3.6.tgz"
+  integrity sha1-QEi5WDldqJZoJSAB29nsprg7rL0=
   dependencies:
-    "debug" "^3.2.7"
-    "resolve" "^1.20.0"
+    debug "^3.2.7"
+    resolve "^1.20.0"
 
-"eslint-module-utils@^2.7.2":
-  "integrity" "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg=="
-  "resolved" "https://registry.npmmirror.com/eslint-module-utils/download/eslint-module-utils-2.7.2.tgz"
-  "version" "2.7.2"
+eslint-module-utils@^2.7.2:
+  version "2.7.2"
+  resolved "https://registry.npmmirror.com/eslint-module-utils/download/eslint-module-utils-2.7.2.tgz"
+  integrity sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==
   dependencies:
-    "debug" "^3.2.7"
-    "find-up" "^2.1.0"
+    debug "^3.2.7"
+    find-up "^2.1.0"
 
-"eslint-plugin-es@^3.0.0":
-  "integrity" "sha1-dafN/czdwFiZNK7rOEF18iHFeJM="
-  "resolved" "https://registry.npm.taobao.org/eslint-plugin-es/download/eslint-plugin-es-3.0.1.tgz?cache=0&sync_timestamp=1605769798981&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-es%2Fdownload%2Feslint-plugin-es-3.0.1.tgz"
-  "version" "3.0.1"
+eslint-plugin-es@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.npm.taobao.org/eslint-plugin-es/download/eslint-plugin-es-3.0.1.tgz?cache=0&sync_timestamp=1605769798981&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-es%2Fdownload%2Feslint-plugin-es-3.0.1.tgz"
+  integrity sha1-dafN/czdwFiZNK7rOEF18iHFeJM=
   dependencies:
-    "eslint-utils" "^2.0.0"
-    "regexpp" "^3.0.0"
+    eslint-utils "^2.0.0"
+    regexpp "^3.0.0"
 
-"eslint-plugin-import@^2.22.1", "eslint-plugin-import@^2.23.4":
-  "integrity" "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA=="
-  "resolved" "https://registry.npmmirror.com/eslint-plugin-import/download/eslint-plugin-import-2.25.4.tgz"
-  "version" "2.25.4"
+eslint-plugin-import@^2.23.4:
+  version "2.25.4"
+  resolved "https://registry.npmmirror.com/eslint-plugin-import/download/eslint-plugin-import-2.25.4.tgz"
+  integrity sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==
   dependencies:
-    "array-includes" "^3.1.4"
-    "array.prototype.flat" "^1.2.5"
-    "debug" "^2.6.9"
-    "doctrine" "^2.1.0"
-    "eslint-import-resolver-node" "^0.3.6"
-    "eslint-module-utils" "^2.7.2"
-    "has" "^1.0.3"
-    "is-core-module" "^2.8.0"
-    "is-glob" "^4.0.3"
-    "minimatch" "^3.0.4"
-    "object.values" "^1.1.5"
-    "resolve" "^1.20.0"
-    "tsconfig-paths" "^3.12.0"
+    array-includes "^3.1.4"
+    array.prototype.flat "^1.2.5"
+    debug "^2.6.9"
+    doctrine "^2.1.0"
+    eslint-import-resolver-node "^0.3.6"
+    eslint-module-utils "^2.7.2"
+    has "^1.0.3"
+    is-core-module "^2.8.0"
+    is-glob "^4.0.3"
+    minimatch "^3.0.4"
+    object.values "^1.1.5"
+    resolve "^1.20.0"
+    tsconfig-paths "^3.12.0"
 
-"eslint-plugin-node@^11.1.0":
-  "integrity" "sha1-yVVEQW7kraJnQKMEdO78VALcZx0="
-  "resolved" "https://registry.npmmirror.com/eslint-plugin-node/download/eslint-plugin-node-11.1.0.tgz"
-  "version" "11.1.0"
+eslint-plugin-node@^11.1.0:
+  version "11.1.0"
+  resolved "https://registry.npmmirror.com/eslint-plugin-node/download/eslint-plugin-node-11.1.0.tgz"
+  integrity sha1-yVVEQW7kraJnQKMEdO78VALcZx0=
   dependencies:
-    "eslint-plugin-es" "^3.0.0"
-    "eslint-utils" "^2.0.0"
-    "ignore" "^5.1.1"
-    "minimatch" "^3.0.4"
-    "resolve" "^1.10.1"
-    "semver" "^6.1.0"
+    eslint-plugin-es "^3.0.0"
+    eslint-utils "^2.0.0"
+    ignore "^5.1.1"
+    minimatch "^3.0.4"
+    resolve "^1.10.1"
+    semver "^6.1.0"
 
-"eslint-plugin-promise@^4.2.1 || ^5.0.0", "eslint-plugin-promise@^5.1.0":
-  "integrity" "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw=="
-  "resolved" "https://registry.npmmirror.com/eslint-plugin-promise/download/eslint-plugin-promise-5.2.0.tgz"
-  "version" "5.2.0"
+eslint-plugin-promise@^5.1.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/eslint-plugin-promise/download/eslint-plugin-promise-5.2.0.tgz"
+  integrity sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==
 
-"eslint-plugin-vue@^7.13.0":
-  "integrity" "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw=="
-  "resolved" "https://registry.npmmirror.com/eslint-plugin-vue/download/eslint-plugin-vue-7.20.0.tgz"
-  "version" "7.20.0"
+eslint-plugin-vue@^7.13.0:
+  version "7.20.0"
+  resolved "https://registry.npmmirror.com/eslint-plugin-vue/download/eslint-plugin-vue-7.20.0.tgz"
+  integrity sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==
   dependencies:
-    "eslint-utils" "^2.1.0"
-    "natural-compare" "^1.4.0"
-    "semver" "^6.3.0"
-    "vue-eslint-parser" "^7.10.0"
+    eslint-utils "^2.1.0"
+    natural-compare "^1.4.0"
+    semver "^6.3.0"
+    vue-eslint-parser "^7.10.0"
 
-"eslint-scope@^5.1.1":
-  "integrity" "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw="
-  "resolved" "https://registry.npmmirror.com/eslint-scope/download/eslint-scope-5.1.1.tgz?cache=0&sync_timestamp=1637466913662&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-scope%2Fdownload%2Feslint-scope-5.1.1.tgz"
-  "version" "5.1.1"
+eslint-scope@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.npmmirror.com/eslint-scope/download/eslint-scope-5.1.1.tgz?cache=0&sync_timestamp=1637466913662&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-scope%2Fdownload%2Feslint-scope-5.1.1.tgz"
+  integrity sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=
   dependencies:
-    "esrecurse" "^4.3.0"
-    "estraverse" "^4.1.1"
+    esrecurse "^4.3.0"
+    estraverse "^4.1.1"
 
-"eslint-utils@^2.0.0":
-  "integrity" "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc="
-  "resolved" "https://registry.nlark.com/eslint-utils/download/eslint-utils-2.1.0.tgz"
-  "version" "2.1.0"
+eslint-utils@^2.0.0, eslint-utils@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.nlark.com/eslint-utils/download/eslint-utils-2.1.0.tgz"
+  integrity sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc=
   dependencies:
-    "eslint-visitor-keys" "^1.1.0"
+    eslint-visitor-keys "^1.1.0"
 
-"eslint-utils@^2.1.0":
-  "integrity" "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc="
-  "resolved" "https://registry.nlark.com/eslint-utils/download/eslint-utils-2.1.0.tgz"
-  "version" "2.1.0"
+eslint-utils@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.nlark.com/eslint-utils/download/eslint-utils-3.0.0.tgz"
+  integrity sha1-iuuvrOc0W7M1WdsKHxOh0tSMNnI=
   dependencies:
-    "eslint-visitor-keys" "^1.1.0"
+    eslint-visitor-keys "^2.0.0"
 
-"eslint-utils@^3.0.0":
-  "integrity" "sha1-iuuvrOc0W7M1WdsKHxOh0tSMNnI="
-  "resolved" "https://registry.nlark.com/eslint-utils/download/eslint-utils-3.0.0.tgz"
-  "version" "3.0.0"
-  dependencies:
-    "eslint-visitor-keys" "^2.0.0"
+eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz?cache=0&sync_timestamp=1636378395014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.3.0.tgz"
+  integrity sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=
 
-"eslint-visitor-keys@^1.1.0":
-  "integrity" "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4="
-  "resolved" "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz?cache=0&sync_timestamp=1636378395014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.3.0.tgz"
-  "version" "1.3.0"
+eslint-visitor-keys@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-2.1.0.tgz?cache=0&sync_timestamp=1636378395014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-2.1.0.tgz"
+  integrity sha1-9lMoJZMFknOSyTjtROsKXJsr0wM=
 
-"eslint-visitor-keys@^1.3.0":
-  "integrity" "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4="
-  "resolved" "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz?cache=0&sync_timestamp=1636378395014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.3.0.tgz"
-  "version" "1.3.0"
+eslint-visitor-keys@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-3.1.0.tgz?cache=0&sync_timestamp=1636378395014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-3.1.0.tgz"
+  integrity sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==
 
-"eslint-visitor-keys@^2.0.0":
-  "integrity" "sha1-9lMoJZMFknOSyTjtROsKXJsr0wM="
-  "resolved" "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-2.1.0.tgz?cache=0&sync_timestamp=1636378395014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-2.1.0.tgz"
-  "version" "2.1.0"
-
-"eslint-visitor-keys@^3.0.0":
-  "integrity" "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA=="
-  "resolved" "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-3.1.0.tgz?cache=0&sync_timestamp=1636378395014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-3.1.0.tgz"
-  "version" "3.1.0"
-
-"eslint@*", "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.2.0 || ^7.0.0 || ^8.0.0", "eslint@^7.0.0", "eslint@^7.12.1", "eslint@^7.26.0", "eslint@^7.30.0", "eslint@>=4.19.1", "eslint@>=5", "eslint@>=5.0.0", "eslint@>=5.16.0":
-  "integrity" "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA=="
-  "resolved" "https://registry.npmmirror.com/eslint/download/eslint-7.32.0.tgz"
-  "version" "7.32.0"
+eslint@^7.26.0, eslint@^7.30.0:
+  version "7.32.0"
+  resolved "https://registry.npmmirror.com/eslint/download/eslint-7.32.0.tgz"
+  integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==
   dependencies:
     "@babel/code-frame" "7.12.11"
     "@eslint/eslintrc" "^0.4.3"
     "@humanwhocodes/config-array" "^0.5.0"
-    "ajv" "^6.10.0"
-    "chalk" "^4.0.0"
-    "cross-spawn" "^7.0.2"
-    "debug" "^4.0.1"
-    "doctrine" "^3.0.0"
-    "enquirer" "^2.3.5"
-    "escape-string-regexp" "^4.0.0"
-    "eslint-scope" "^5.1.1"
-    "eslint-utils" "^2.1.0"
-    "eslint-visitor-keys" "^2.0.0"
-    "espree" "^7.3.1"
-    "esquery" "^1.4.0"
-    "esutils" "^2.0.2"
-    "fast-deep-equal" "^3.1.3"
-    "file-entry-cache" "^6.0.1"
-    "functional-red-black-tree" "^1.0.1"
-    "glob-parent" "^5.1.2"
-    "globals" "^13.6.0"
-    "ignore" "^4.0.6"
-    "import-fresh" "^3.0.0"
-    "imurmurhash" "^0.1.4"
-    "is-glob" "^4.0.0"
-    "js-yaml" "^3.13.1"
-    "json-stable-stringify-without-jsonify" "^1.0.1"
-    "levn" "^0.4.1"
-    "lodash.merge" "^4.6.2"
-    "minimatch" "^3.0.4"
-    "natural-compare" "^1.4.0"
-    "optionator" "^0.9.1"
-    "progress" "^2.0.0"
-    "regexpp" "^3.1.0"
-    "semver" "^7.2.1"
-    "strip-ansi" "^6.0.0"
-    "strip-json-comments" "^3.1.0"
-    "table" "^6.0.9"
-    "text-table" "^0.2.0"
-    "v8-compile-cache" "^2.0.3"
+    ajv "^6.10.0"
+    chalk "^4.0.0"
+    cross-spawn "^7.0.2"
+    debug "^4.0.1"
+    doctrine "^3.0.0"
+    enquirer "^2.3.5"
+    escape-string-regexp "^4.0.0"
+    eslint-scope "^5.1.1"
+    eslint-utils "^2.1.0"
+    eslint-visitor-keys "^2.0.0"
+    espree "^7.3.1"
+    esquery "^1.4.0"
+    esutils "^2.0.2"
+    fast-deep-equal "^3.1.3"
+    file-entry-cache "^6.0.1"
+    functional-red-black-tree "^1.0.1"
+    glob-parent "^5.1.2"
+    globals "^13.6.0"
+    ignore "^4.0.6"
+    import-fresh "^3.0.0"
+    imurmurhash "^0.1.4"
+    is-glob "^4.0.0"
+    js-yaml "^3.13.1"
+    json-stable-stringify-without-jsonify "^1.0.1"
+    levn "^0.4.1"
+    lodash.merge "^4.6.2"
+    minimatch "^3.0.4"
+    natural-compare "^1.4.0"
+    optionator "^0.9.1"
+    progress "^2.0.0"
+    regexpp "^3.1.0"
+    semver "^7.2.1"
+    strip-ansi "^6.0.0"
+    strip-json-comments "^3.1.0"
+    table "^6.0.9"
+    text-table "^0.2.0"
+    v8-compile-cache "^2.0.3"
 
-"espree@^6.2.1":
-  "integrity" "sha1-d/xy4f10SiBSwg84pbV1gy6Cc0o="
-  "resolved" "https://registry.npmmirror.com/espree/download/espree-6.2.1.tgz"
-  "version" "6.2.1"
+espree@^6.2.1:
+  version "6.2.1"
+  resolved "https://registry.npmmirror.com/espree/download/espree-6.2.1.tgz"
+  integrity sha1-d/xy4f10SiBSwg84pbV1gy6Cc0o=
   dependencies:
-    "acorn" "^7.1.1"
-    "acorn-jsx" "^5.2.0"
-    "eslint-visitor-keys" "^1.1.0"
+    acorn "^7.1.1"
+    acorn-jsx "^5.2.0"
+    eslint-visitor-keys "^1.1.0"
 
-"espree@^7.3.0", "espree@^7.3.1":
-  "integrity" "sha1-8t8zC3Usb1UBn4vYm3ZgA5wbu7Y="
-  "resolved" "https://registry.npmmirror.com/espree/download/espree-7.3.1.tgz"
-  "version" "7.3.1"
+espree@^7.3.0, espree@^7.3.1:
+  version "7.3.1"
+  resolved "https://registry.npmmirror.com/espree/download/espree-7.3.1.tgz"
+  integrity sha1-8t8zC3Usb1UBn4vYm3ZgA5wbu7Y=
   dependencies:
-    "acorn" "^7.4.0"
-    "acorn-jsx" "^5.3.1"
-    "eslint-visitor-keys" "^1.3.0"
+    acorn "^7.4.0"
+    acorn-jsx "^5.3.1"
+    eslint-visitor-keys "^1.3.0"
 
-"esprima@^4.0.0":
-  "integrity" "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE="
-  "resolved" "https://registry.nlark.com/esprima/download/esprima-4.0.1.tgz"
-  "version" "4.0.1"
+esprima@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.nlark.com/esprima/download/esprima-4.0.1.tgz"
+  integrity sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=
 
-"esquery@^1.4.0":
-  "integrity" "sha1-IUj/w4uC6McFff7UhCWz5h8PJKU="
-  "resolved" "https://registry.npm.taobao.org/esquery/download/esquery-1.4.0.tgz"
-  "version" "1.4.0"
+esquery@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.npm.taobao.org/esquery/download/esquery-1.4.0.tgz"
+  integrity sha1-IUj/w4uC6McFff7UhCWz5h8PJKU=
   dependencies:
-    "estraverse" "^5.1.0"
+    estraverse "^5.1.0"
 
-"esrecurse@^4.3.0":
-  "integrity" "sha1-eteWTWeauyi+5yzsY3WLHF0smSE="
-  "resolved" "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.3.0.tgz"
-  "version" "4.3.0"
+esrecurse@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.3.0.tgz"
+  integrity sha1-eteWTWeauyi+5yzsY3WLHF0smSE=
   dependencies:
-    "estraverse" "^5.2.0"
+    estraverse "^5.2.0"
 
-"estraverse@^4.1.1":
-  "integrity" "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0="
-  "resolved" "https://registry.npmmirror.com/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz"
-  "version" "4.3.0"
+estraverse@^4.1.1:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz"
+  integrity sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=
 
-"estraverse@^5.1.0":
-  "integrity" "sha1-LupSkHAvJquP5TcDcP+GyWXSESM="
-  "resolved" "https://registry.npmmirror.com/estraverse/download/estraverse-5.3.0.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-5.3.0.tgz"
-  "version" "5.3.0"
+estraverse@^5.1.0, estraverse@^5.2.0:
+  version "5.3.0"
+  resolved "https://registry.npmmirror.com/estraverse/download/estraverse-5.3.0.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-5.3.0.tgz"
+  integrity sha1-LupSkHAvJquP5TcDcP+GyWXSESM=
 
-"estraverse@^5.2.0":
-  "integrity" "sha1-LupSkHAvJquP5TcDcP+GyWXSESM="
-  "resolved" "https://registry.npmmirror.com/estraverse/download/estraverse-5.3.0.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-5.3.0.tgz"
-  "version" "5.3.0"
+estree-walker@^2.0.1, estree-walker@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/estree-walker/download/estree-walker-2.0.2.tgz"
+  integrity sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw=
 
-"estree-walker@^2.0.1", "estree-walker@^2.0.2":
-  "integrity" "sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw="
-  "resolved" "https://registry.npmmirror.com/estree-walker/download/estree-walker-2.0.2.tgz"
-  "version" "2.0.2"
+esutils@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz"
+  integrity sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=
 
-"esutils@^2.0.2":
-  "integrity" "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q="
-  "resolved" "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz"
-  "version" "2.0.3"
+etag@^1.8.1:
+  version "1.8.1"
+  resolved "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz"
+  integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
 
-"etag@^1.8.1":
-  "integrity" "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
-  "resolved" "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz"
-  "version" "1.8.1"
-
-"expand-brackets@^2.1.4":
-  "integrity" "sha1-t3c14xXOMPa27/D4OwQVGiJEliI="
-  "resolved" "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz"
-  "version" "2.1.4"
+expand-brackets@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz"
+  integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
   dependencies:
-    "debug" "^2.3.3"
-    "define-property" "^0.2.5"
-    "extend-shallow" "^2.0.1"
-    "posix-character-classes" "^0.1.0"
-    "regex-not" "^1.0.0"
-    "snapdragon" "^0.8.1"
-    "to-regex" "^3.0.1"
+    debug "^2.3.3"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    posix-character-classes "^0.1.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
 
-"extend-shallow@^2.0.1":
-  "integrity" "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8="
-  "resolved" "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz"
-  "version" "2.0.1"
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz"
+  integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
   dependencies:
-    "is-extendable" "^0.1.0"
+    is-extendable "^0.1.0"
 
-"extend-shallow@^3.0.0":
-  "integrity" "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg="
-  "resolved" "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz"
-  "version" "3.0.2"
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz"
+  integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
   dependencies:
-    "assign-symbols" "^1.0.0"
-    "is-extendable" "^1.0.1"
+    assign-symbols "^1.0.0"
+    is-extendable "^1.0.1"
 
-"extend-shallow@^3.0.2":
-  "integrity" "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg="
-  "resolved" "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz"
-  "version" "3.0.2"
+extglob@^2.0.2:
+  version "2.0.4"
+  resolved "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz"
+  integrity sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=
   dependencies:
-    "assign-symbols" "^1.0.0"
-    "is-extendable" "^1.0.1"
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    expand-brackets "^2.1.4"
+    extend-shallow "^2.0.1"
+    fragment-cache "^0.2.1"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
 
-"extglob@^2.0.2":
-  "integrity" "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM="
-  "resolved" "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz"
-  "version" "2.0.4"
-  dependencies:
-    "array-unique" "^0.3.2"
-    "define-property" "^1.0.0"
-    "expand-brackets" "^2.1.4"
-    "extend-shallow" "^2.0.1"
-    "fragment-cache" "^0.2.1"
-    "regex-not" "^1.0.0"
-    "snapdragon" "^0.8.1"
-    "to-regex" "^3.0.1"
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz"
+  integrity sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=
 
-"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3":
-  "integrity" "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU="
-  "resolved" "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz"
-  "version" "3.1.3"
-
-"fast-glob@^3.2.7", "fast-glob@^3.2.9":
-  "integrity" "sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A=="
-  "resolved" "https://registry.npmmirror.com/fast-glob/download/fast-glob-3.2.10.tgz"
-  "version" "3.2.10"
+fast-glob@^3.2.7, fast-glob@^3.2.9:
+  version "3.2.10"
+  resolved "https://registry.npmmirror.com/fast-glob/download/fast-glob-3.2.10.tgz"
+  integrity sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A==
   dependencies:
     "@nodelib/fs.stat" "^2.0.2"
     "@nodelib/fs.walk" "^1.2.3"
-    "glob-parent" "^5.1.2"
-    "merge2" "^1.3.0"
-    "micromatch" "^4.0.4"
+    glob-parent "^5.1.2"
+    merge2 "^1.3.0"
+    micromatch "^4.0.4"
 
-"fast-json-stable-stringify@^2.0.0":
-  "integrity" "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM="
-  "resolved" "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz"
-  "version" "2.1.0"
+fast-json-stable-stringify@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz"
+  integrity sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=
 
-"fast-levenshtein@^2.0.6":
-  "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
-  "resolved" "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz"
-  "version" "2.0.6"
+fast-levenshtein@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz"
+  integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
 
-"fastq@^1.6.0":
-  "integrity" "sha1-YWdg+Ip1Jr38WWt8q4wYk4w2uYw="
-  "resolved" "https://registry.nlark.com/fastq/download/fastq-1.13.0.tgz"
-  "version" "1.13.0"
+fastq@^1.6.0:
+  version "1.13.0"
+  resolved "https://registry.nlark.com/fastq/download/fastq-1.13.0.tgz"
+  integrity sha1-YWdg+Ip1Jr38WWt8q4wYk4w2uYw=
   dependencies:
-    "reusify" "^1.0.4"
+    reusify "^1.0.4"
 
-"file-entry-cache@^6.0.1":
-  "integrity" "sha1-IRst2WWcsDlLBz5zI6w8kz1SICc="
-  "resolved" "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-6.0.1.tgz?cache=0&sync_timestamp=1613794357372&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffile-entry-cache%2Fdownload%2Ffile-entry-cache-6.0.1.tgz"
-  "version" "6.0.1"
+file-entry-cache@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-6.0.1.tgz?cache=0&sync_timestamp=1613794357372&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffile-entry-cache%2Fdownload%2Ffile-entry-cache-6.0.1.tgz"
+  integrity sha1-IRst2WWcsDlLBz5zI6w8kz1SICc=
   dependencies:
-    "flat-cache" "^3.0.4"
+    flat-cache "^3.0.4"
 
-"fill-range@^4.0.0":
-  "integrity" "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc="
-  "resolved" "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz"
-  "version" "4.0.0"
+fill-range@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz"
+  integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
   dependencies:
-    "extend-shallow" "^2.0.1"
-    "is-number" "^3.0.0"
-    "repeat-string" "^1.6.1"
-    "to-regex-range" "^2.1.0"
+    extend-shallow "^2.0.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+    to-regex-range "^2.1.0"
 
-"fill-range@^7.0.1":
-  "integrity" "sha1-GRmmp8df44ssfHflGYU12prN2kA="
-  "resolved" "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz"
-  "version" "7.0.1"
+fill-range@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz"
+  integrity sha1-GRmmp8df44ssfHflGYU12prN2kA=
   dependencies:
-    "to-regex-range" "^5.0.1"
+    to-regex-range "^5.0.1"
 
-"filter-obj@^1.1.0":
-  "integrity" "sha1-mzERErxsYSehbgFsbF1/GeCAXFs="
-  "resolved" "https://registry.nlark.com/filter-obj/download/filter-obj-1.1.0.tgz?cache=0&sync_timestamp=1630004006859&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffilter-obj%2Fdownload%2Ffilter-obj-1.1.0.tgz"
-  "version" "1.1.0"
+filter-obj@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.nlark.com/filter-obj/download/filter-obj-1.1.0.tgz?cache=0&sync_timestamp=1630004006859&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffilter-obj%2Fdownload%2Ffilter-obj-1.1.0.tgz"
+  integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs=
 
-"find-up@^2.1.0":
-  "integrity" "sha1-RdG35QbHF93UgndaK3eSCjwMV6c="
-  "resolved" "https://registry.npmmirror.com/find-up/download/find-up-2.1.0.tgz"
-  "version" "2.1.0"
+find-up@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/find-up/download/find-up-2.1.0.tgz"
+  integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
   dependencies:
-    "locate-path" "^2.0.0"
+    locate-path "^2.0.0"
 
-"flat-cache@^3.0.4":
-  "integrity" "sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE="
-  "resolved" "https://registry.nlark.com/flat-cache/download/flat-cache-3.0.4.tgz"
-  "version" "3.0.4"
+flat-cache@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.nlark.com/flat-cache/download/flat-cache-3.0.4.tgz"
+  integrity sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE=
   dependencies:
-    "flatted" "^3.1.0"
-    "rimraf" "^3.0.2"
+    flatted "^3.1.0"
+    rimraf "^3.0.2"
 
-"flatted@^3.1.0":
-  "integrity" "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw=="
-  "resolved" "https://registry.npmmirror.com/flatted/download/flatted-3.2.4.tgz?cache=0&sync_timestamp=1636473813364&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fflatted%2Fdownload%2Fflatted-3.2.4.tgz"
-  "version" "3.2.4"
+flatted@^3.1.0:
+  version "3.2.4"
+  resolved "https://registry.npmmirror.com/flatted/download/flatted-3.2.4.tgz?cache=0&sync_timestamp=1636473813364&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fflatted%2Fdownload%2Fflatted-3.2.4.tgz"
+  integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==
 
-"follow-redirects@^1.14.0":
-  "integrity" "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ=="
-  "resolved" "https://registry.npmmirror.com/follow-redirects/download/follow-redirects-1.14.7.tgz"
-  "version" "1.14.7"
+follow-redirects@^1.14.0:
+  version "1.14.7"
+  resolved "https://registry.npmmirror.com/follow-redirects/download/follow-redirects-1.14.7.tgz"
+  integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==
 
-"for-in@^1.0.2":
-  "integrity" "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
-  "resolved" "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz"
-  "version" "1.0.2"
+for-in@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz"
+  integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
 
-"fragment-cache@^0.2.1":
-  "integrity" "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk="
-  "resolved" "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz"
-  "version" "0.2.1"
+fragment-cache@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz"
+  integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
   dependencies:
-    "map-cache" "^0.2.2"
+    map-cache "^0.2.2"
 
-"fs-extra@^10.0.0":
-  "integrity" "sha1-n/YbZV3eU/s0qC34S7IUzoAuF8E="
-  "resolved" "https://registry.nlark.com/fs-extra/download/fs-extra-10.0.0.tgz?cache=0&sync_timestamp=1622604476909&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffs-extra%2Fdownload%2Ffs-extra-10.0.0.tgz"
-  "version" "10.0.0"
+fs-extra@^10.0.0:
+  version "10.0.0"
+  resolved "https://registry.nlark.com/fs-extra/download/fs-extra-10.0.0.tgz?cache=0&sync_timestamp=1622604476909&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffs-extra%2Fdownload%2Ffs-extra-10.0.0.tgz"
+  integrity sha1-n/YbZV3eU/s0qC34S7IUzoAuF8E=
   dependencies:
-    "graceful-fs" "^4.2.0"
-    "jsonfile" "^6.0.1"
-    "universalify" "^2.0.0"
+    graceful-fs "^4.2.0"
+    jsonfile "^6.0.1"
+    universalify "^2.0.0"
 
-"fs.realpath@^1.0.0":
-  "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
-  "resolved" "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz"
-  "version" "1.0.0"
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz"
+  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
 
-"fsevents@~2.3.2":
-  "integrity" "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro="
-  "resolved" "https://registry.npmmirror.com/fsevents/download/fsevents-2.3.2.tgz"
-  "version" "2.3.2"
+fsevents@~2.3.2:
+  version "2.3.2"
+  resolved "https://registry.npmmirror.com/fsevents/download/fsevents-2.3.2.tgz"
+  integrity sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=
 
-"fstream@^1.0.12":
-  "integrity" "sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU="
-  "resolved" "https://registry.npm.taobao.org/fstream/download/fstream-1.0.12.tgz"
-  "version" "1.0.12"
+fstream@^1.0.12:
+  version "1.0.12"
+  resolved "https://registry.npm.taobao.org/fstream/download/fstream-1.0.12.tgz"
+  integrity sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU=
   dependencies:
-    "graceful-fs" "^4.1.2"
-    "inherits" "~2.0.0"
-    "mkdirp" ">=0.5 0"
-    "rimraf" "2"
+    graceful-fs "^4.1.2"
+    inherits "~2.0.0"
+    mkdirp ">=0.5 0"
+    rimraf "2"
 
-"function-bind@^1.1.1":
-  "integrity" "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0="
-  "resolved" "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz"
-  "version" "1.1.1"
+function-bind@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz"
+  integrity sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=
 
-"functional-red-black-tree@^1.0.1":
-  "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
-  "resolved" "https://registry.nlark.com/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz?cache=0&sync_timestamp=1626768951311&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffunctional-red-black-tree%2Fdownload%2Ffunctional-red-black-tree-1.0.1.tgz"
-  "version" "1.0.1"
+functional-red-black-tree@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.nlark.com/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz?cache=0&sync_timestamp=1626768951311&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffunctional-red-black-tree%2Fdownload%2Ffunctional-red-black-tree-1.0.1.tgz"
+  integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
 
-"gensync@^1.0.0-beta.2":
-  "integrity" "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA="
-  "resolved" "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.2.tgz"
-  "version" "1.0.0-beta.2"
+gensync@^1.0.0-beta.2:
+  version "1.0.0-beta.2"
+  resolved "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.2.tgz"
+  integrity sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=
 
-"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.0", "get-intrinsic@^1.1.1":
-  "integrity" "sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y="
-  "resolved" "https://registry.nlark.com/get-intrinsic/download/get-intrinsic-1.1.1.tgz"
-  "version" "1.1.1"
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.nlark.com/get-intrinsic/download/get-intrinsic-1.1.1.tgz"
+  integrity sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y=
   dependencies:
-    "function-bind" "^1.1.1"
-    "has" "^1.0.3"
-    "has-symbols" "^1.0.1"
+    function-bind "^1.1.1"
+    has "^1.0.3"
+    has-symbols "^1.0.1"
 
-"get-symbol-description@^1.0.0":
-  "integrity" "sha1-f9uByQAQH71WTdXxowr1qtweWNY="
-  "resolved" "https://registry.nlark.com/get-symbol-description/download/get-symbol-description-1.0.0.tgz"
-  "version" "1.0.0"
+get-symbol-description@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.nlark.com/get-symbol-description/download/get-symbol-description-1.0.0.tgz"
+  integrity sha1-f9uByQAQH71WTdXxowr1qtweWNY=
   dependencies:
-    "call-bind" "^1.0.2"
-    "get-intrinsic" "^1.1.1"
+    call-bind "^1.0.2"
+    get-intrinsic "^1.1.1"
 
-"get-value@^2.0.3", "get-value@^2.0.6":
-  "integrity" "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
-  "resolved" "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz"
-  "version" "2.0.6"
+get-value@^2.0.3, get-value@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz"
+  integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
 
-"glob-parent@^5.1.2", "glob-parent@~5.1.2":
-  "integrity" "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ="
-  "resolved" "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz"
-  "version" "5.1.2"
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz"
+  integrity sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=
   dependencies:
-    "is-glob" "^4.0.1"
+    is-glob "^4.0.1"
 
-"glob@^7.1.3":
-  "integrity" "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q=="
-  "resolved" "https://registry.npmmirror.com/glob/download/glob-7.2.0.tgz"
-  "version" "7.2.0"
+glob@^7.1.3:
+  version "7.2.0"
+  resolved "https://registry.npmmirror.com/glob/download/glob-7.2.0.tgz"
+  integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
   dependencies:
-    "fs.realpath" "^1.0.0"
-    "inflight" "^1.0.4"
-    "inherits" "2"
-    "minimatch" "^3.0.4"
-    "once" "^1.3.0"
-    "path-is-absolute" "^1.0.0"
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
 
-"globals@^11.1.0":
-  "integrity" "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4="
-  "resolved" "https://registry.npmmirror.com/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1635390798667&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz"
-  "version" "11.12.0"
+globals@^11.1.0:
+  version "11.12.0"
+  resolved "https://registry.npmmirror.com/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1635390798667&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz"
+  integrity sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=
 
-"globals@^13.6.0", "globals@^13.9.0":
-  "integrity" "sha1-TXM3YDBCMKAILtluIeXFZfiYCJ4="
-  "resolved" "https://registry.npmmirror.com/globals/download/globals-13.12.0.tgz?cache=0&sync_timestamp=1635390798667&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglobals%2Fdownload%2Fglobals-13.12.0.tgz"
-  "version" "13.12.0"
+globals@^13.6.0, globals@^13.9.0:
+  version "13.12.0"
+  resolved "https://registry.npmmirror.com/globals/download/globals-13.12.0.tgz?cache=0&sync_timestamp=1635390798667&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglobals%2Fdownload%2Fglobals-13.12.0.tgz"
+  integrity sha1-TXM3YDBCMKAILtluIeXFZfiYCJ4=
   dependencies:
-    "type-fest" "^0.20.2"
+    type-fest "^0.20.2"
 
-"globby@^11.0.4":
-  "integrity" "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="
-  "resolved" "https://registry.npmmirror.com/globby/download/globby-11.1.0.tgz"
-  "version" "11.1.0"
+globby@^11.0.4:
+  version "11.1.0"
+  resolved "https://registry.npmmirror.com/globby/download/globby-11.1.0.tgz"
+  integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
   dependencies:
-    "array-union" "^2.1.0"
-    "dir-glob" "^3.0.1"
-    "fast-glob" "^3.2.9"
-    "ignore" "^5.2.0"
-    "merge2" "^1.4.1"
-    "slash" "^3.0.0"
+    array-union "^2.1.0"
+    dir-glob "^3.0.1"
+    fast-glob "^3.2.9"
+    ignore "^5.2.0"
+    merge2 "^1.4.1"
+    slash "^3.0.0"
 
-"graceful-fs@^4.1.2", "graceful-fs@^4.1.6", "graceful-fs@^4.2.0", "graceful-fs@^4.2.2":
-  "integrity" "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ=="
-  "resolved" "https://registry.npmmirror.com/graceful-fs/download/graceful-fs-4.2.9.tgz"
-  "version" "4.2.9"
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2:
+  version "4.2.9"
+  resolved "https://registry.npmmirror.com/graceful-fs/download/graceful-fs-4.2.9.tgz"
+  integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
 
-"has-ansi@^2.0.0":
-  "integrity" "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE="
-  "resolved" "https://registry.nlark.com/has-ansi/download/has-ansi-2.0.0.tgz?cache=0&sync_timestamp=1631556755105&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-ansi%2Fdownload%2Fhas-ansi-2.0.0.tgz"
-  "version" "2.0.0"
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.nlark.com/has-ansi/download/has-ansi-2.0.0.tgz?cache=0&sync_timestamp=1631556755105&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-ansi%2Fdownload%2Fhas-ansi-2.0.0.tgz"
+  integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
   dependencies:
-    "ansi-regex" "^2.0.0"
+    ansi-regex "^2.0.0"
 
-"has-bigints@^1.0.1":
-  "integrity" "sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM="
-  "resolved" "https://registry.npm.taobao.org/has-bigints/download/has-bigints-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-bigints%2Fdownload%2Fhas-bigints-1.0.1.tgz"
-  "version" "1.0.1"
+has-bigints@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npm.taobao.org/has-bigints/download/has-bigints-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-bigints%2Fdownload%2Fhas-bigints-1.0.1.tgz"
+  integrity sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM=
 
-"has-flag@^1.0.0":
-  "integrity" "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
-  "resolved" "https://registry.nlark.com/has-flag/download/has-flag-1.0.0.tgz"
-  "version" "1.0.0"
+has-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.nlark.com/has-flag/download/has-flag-1.0.0.tgz"
+  integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=
 
-"has-flag@^3.0.0":
-  "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
-  "resolved" "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz"
-  "version" "3.0.0"
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz"
+  integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
 
-"has-flag@^4.0.0":
-  "integrity" "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s="
-  "resolved" "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz"
-  "version" "4.0.0"
+has-flag@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz"
+  integrity sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=
 
-"has-symbols@^1.0.1", "has-symbols@^1.0.2":
-  "integrity" "sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM="
-  "resolved" "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.2.tgz"
-  "version" "1.0.2"
+has-symbols@^1.0.1, has-symbols@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.2.tgz"
+  integrity sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM=
 
-"has-tostringtag@^1.0.0":
-  "integrity" "sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU="
-  "resolved" "https://registry.nlark.com/has-tostringtag/download/has-tostringtag-1.0.0.tgz"
-  "version" "1.0.0"
+has-tostringtag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.nlark.com/has-tostringtag/download/has-tostringtag-1.0.0.tgz"
+  integrity sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU=
   dependencies:
-    "has-symbols" "^1.0.2"
+    has-symbols "^1.0.2"
 
-"has-value@^0.3.1":
-  "integrity" "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8="
-  "resolved" "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz"
-  "version" "0.3.1"
+has-value@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz"
+  integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
   dependencies:
-    "get-value" "^2.0.3"
-    "has-values" "^0.1.4"
-    "isobject" "^2.0.0"
+    get-value "^2.0.3"
+    has-values "^0.1.4"
+    isobject "^2.0.0"
 
-"has-value@^1.0.0":
-  "integrity" "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc="
-  "resolved" "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz"
-  "version" "1.0.0"
+has-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz"
+  integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
   dependencies:
-    "get-value" "^2.0.6"
-    "has-values" "^1.0.0"
-    "isobject" "^3.0.0"
+    get-value "^2.0.6"
+    has-values "^1.0.0"
+    isobject "^3.0.0"
 
-"has-values@^0.1.4":
-  "integrity" "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
-  "resolved" "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz"
-  "version" "0.1.4"
+has-values@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz"
+  integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
 
-"has-values@^1.0.0":
-  "integrity" "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8="
-  "resolved" "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz"
-  "version" "1.0.0"
+has-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz"
+  integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
   dependencies:
-    "is-number" "^3.0.0"
-    "kind-of" "^4.0.0"
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
 
-"has@^1.0.3":
-  "integrity" "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y="
-  "resolved" "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz"
-  "version" "1.0.3"
+has@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz"
+  integrity sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=
   dependencies:
-    "function-bind" "^1.1.1"
+    function-bind "^1.1.1"
 
-"he@^1.1.1":
-  "integrity" "sha1-hK5l+n6vsWX922FWauFLrwVmTw8="
-  "resolved" "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz"
-  "version" "1.2.0"
+he@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz"
+  integrity sha1-hK5l+n6vsWX922FWauFLrwVmTw8=
 
-"header-case@^2.0.4":
-  "integrity" "sha1-WkLmO1UXc0nPQFvrjXdayruSwGM="
-  "resolved" "https://registry.npm.taobao.org/header-case/download/header-case-2.0.4.tgz"
-  "version" "2.0.4"
+header-case@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.npm.taobao.org/header-case/download/header-case-2.0.4.tgz"
+  integrity sha1-WkLmO1UXc0nPQFvrjXdayruSwGM=
   dependencies:
-    "capital-case" "^1.0.4"
-    "tslib" "^2.0.3"
+    capital-case "^1.0.4"
+    tslib "^2.0.3"
 
-"htmlparser2@^3.8.3":
-  "integrity" "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8="
-  "resolved" "https://registry.npmmirror.com/htmlparser2/download/htmlparser2-3.10.1.tgz?cache=0&sync_timestamp=1636640933377&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-3.10.1.tgz"
-  "version" "3.10.1"
+htmlparser2@^3.8.3:
+  version "3.10.1"
+  resolved "https://registry.npmmirror.com/htmlparser2/download/htmlparser2-3.10.1.tgz?cache=0&sync_timestamp=1636640933377&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-3.10.1.tgz"
+  integrity sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=
   dependencies:
-    "domelementtype" "^1.3.1"
-    "domhandler" "^2.3.0"
-    "domutils" "^1.5.1"
-    "entities" "^1.1.1"
-    "inherits" "^2.0.1"
-    "readable-stream" "^3.1.1"
+    domelementtype "^1.3.1"
+    domhandler "^2.3.0"
+    domutils "^1.5.1"
+    entities "^1.1.1"
+    inherits "^2.0.1"
+    readable-stream "^3.1.1"
 
-"ignore@^4.0.6":
-  "integrity" "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
-  "resolved" "https://registry.npmmirror.com/ignore/download/ignore-4.0.6.tgz"
-  "version" "4.0.6"
+ignore@^4.0.6:
+  version "4.0.6"
+  resolved "https://registry.npmmirror.com/ignore/download/ignore-4.0.6.tgz"
+  integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
-"ignore@^5.1.1", "ignore@^5.1.8", "ignore@^5.2.0":
-  "integrity" "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ=="
-  "resolved" "https://registry.npmmirror.com/ignore/download/ignore-5.2.0.tgz"
-  "version" "5.2.0"
+ignore@^5.1.1, ignore@^5.1.8, ignore@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/ignore/download/ignore-5.2.0.tgz"
+  integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
 
-"image-size@^0.5.1":
-  "integrity" "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w="
-  "resolved" "https://registry.npmmirror.com/image-size/download/image-size-0.5.5.tgz"
-  "version" "0.5.5"
+image-size@^0.5.1:
+  version "0.5.5"
+  resolved "https://registry.npmmirror.com/image-size/download/image-size-0.5.5.tgz"
+  integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=
 
-"immutable@^4.0.0":
-  "integrity" "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw=="
-  "resolved" "https://registry.npmmirror.com/immutable/download/immutable-4.0.0.tgz"
-  "version" "4.0.0"
+immutable@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/immutable/download/immutable-4.0.0.tgz"
+  integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==
 
-"import-fresh@^3.0.0", "import-fresh@^3.2.1":
-  "integrity" "sha1-NxYsJfy566oublPVtNiM4X2eDCs="
-  "resolved" "https://registry.nlark.com/import-fresh/download/import-fresh-3.3.0.tgz"
-  "version" "3.3.0"
+import-fresh@^3.0.0, import-fresh@^3.2.1:
+  version "3.3.0"
+  resolved "https://registry.nlark.com/import-fresh/download/import-fresh-3.3.0.tgz"
+  integrity sha1-NxYsJfy566oublPVtNiM4X2eDCs=
   dependencies:
-    "parent-module" "^1.0.0"
-    "resolve-from" "^4.0.0"
+    parent-module "^1.0.0"
+    resolve-from "^4.0.0"
 
-"imurmurhash@^0.1.4":
-  "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o="
-  "resolved" "https://registry.nlark.com/imurmurhash/download/imurmurhash-0.1.4.tgz"
-  "version" "0.1.4"
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.nlark.com/imurmurhash/download/imurmurhash-0.1.4.tgz"
+  integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
 
-"inflight@^1.0.4":
-  "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk="
-  "resolved" "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz"
-  "version" "1.0.6"
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz"
+  integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
   dependencies:
-    "once" "^1.3.0"
-    "wrappy" "1"
+    once "^1.3.0"
+    wrappy "1"
 
-"inherits@^2.0.1", "inherits@^2.0.3", "inherits@~2.0.0", "inherits@~2.0.3", "inherits@2":
-  "integrity" "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w="
-  "resolved" "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz"
-  "version" "2.0.4"
+inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.3:
+  version "2.0.4"
+  resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz"
+  integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=
 
-"internal-slot@^1.0.3":
-  "integrity" "sha1-c0fjB97uovqsKsYgXUvH00ln9Zw="
-  "resolved" "https://registry.npm.taobao.org/internal-slot/download/internal-slot-1.0.3.tgz?cache=0&sync_timestamp=1611694392178&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finternal-slot%2Fdownload%2Finternal-slot-1.0.3.tgz"
-  "version" "1.0.3"
+internal-slot@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npm.taobao.org/internal-slot/download/internal-slot-1.0.3.tgz?cache=0&sync_timestamp=1611694392178&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finternal-slot%2Fdownload%2Finternal-slot-1.0.3.tgz"
+  integrity sha1-c0fjB97uovqsKsYgXUvH00ln9Zw=
   dependencies:
-    "get-intrinsic" "^1.1.0"
-    "has" "^1.0.3"
-    "side-channel" "^1.0.4"
+    get-intrinsic "^1.1.0"
+    has "^1.0.3"
+    side-channel "^1.0.4"
 
-"is-accessor-descriptor@^0.1.6":
-  "integrity" "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY="
-  "resolved" "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz"
-  "version" "0.1.6"
+is-accessor-descriptor@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz"
+  integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
   dependencies:
-    "kind-of" "^3.0.2"
+    kind-of "^3.0.2"
 
-"is-accessor-descriptor@^1.0.0":
-  "integrity" "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY="
-  "resolved" "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz"
-  "version" "1.0.0"
+is-accessor-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz"
+  integrity sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=
   dependencies:
-    "kind-of" "^6.0.0"
+    kind-of "^6.0.0"
 
-"is-bigint@^1.0.1":
-  "integrity" "sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM="
-  "resolved" "https://registry.nlark.com/is-bigint/download/is-bigint-1.0.4.tgz"
-  "version" "1.0.4"
+is-bigint@^1.0.1:
+  version "1.0.4"
+  resolved "https://registry.nlark.com/is-bigint/download/is-bigint-1.0.4.tgz"
+  integrity sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM=
   dependencies:
-    "has-bigints" "^1.0.1"
+    has-bigints "^1.0.1"
 
-"is-binary-path@~2.1.0":
-  "integrity" "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk="
-  "resolved" "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz"
-  "version" "2.1.0"
+is-binary-path@~2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz"
+  integrity sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=
   dependencies:
-    "binary-extensions" "^2.0.0"
+    binary-extensions "^2.0.0"
 
-"is-boolean-object@^1.1.0":
-  "integrity" "sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk="
-  "resolved" "https://registry.nlark.com/is-boolean-object/download/is-boolean-object-1.1.2.tgz"
-  "version" "1.1.2"
+is-boolean-object@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.nlark.com/is-boolean-object/download/is-boolean-object-1.1.2.tgz"
+  integrity sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk=
   dependencies:
-    "call-bind" "^1.0.2"
-    "has-tostringtag" "^1.0.0"
+    call-bind "^1.0.2"
+    has-tostringtag "^1.0.0"
 
-"is-buffer@^1.1.5":
-  "integrity" "sha1-76ouqdqg16suoTqXsritUf776L4="
-  "resolved" "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz?cache=0&sync_timestamp=1604429452232&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-1.1.6.tgz"
-  "version" "1.1.6"
+is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz?cache=0&sync_timestamp=1604429452232&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-1.1.6.tgz"
+  integrity sha1-76ouqdqg16suoTqXsritUf776L4=
 
-"is-callable@^1.1.4", "is-callable@^1.2.4":
-  "integrity" "sha1-RzAdWN0CWUB4ZVR4U99tYf5HGUU="
-  "resolved" "https://registry.nlark.com/is-callable/download/is-callable-1.2.4.tgz"
-  "version" "1.2.4"
+is-callable@^1.1.4, is-callable@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.nlark.com/is-callable/download/is-callable-1.2.4.tgz"
+  integrity sha1-RzAdWN0CWUB4ZVR4U99tYf5HGUU=
 
-"is-core-module@^2.8.0":
-  "integrity" "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA=="
-  "resolved" "https://registry.npmmirror.com/is-core-module/download/is-core-module-2.8.1.tgz"
-  "version" "2.8.1"
+is-core-module@^2.8.0:
+  version "2.8.1"
+  resolved "https://registry.npmmirror.com/is-core-module/download/is-core-module-2.8.1.tgz"
+  integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
   dependencies:
-    "has" "^1.0.3"
+    has "^1.0.3"
 
-"is-data-descriptor@^0.1.4":
-  "integrity" "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y="
-  "resolved" "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz"
-  "version" "0.1.4"
+is-data-descriptor@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz"
+  integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
   dependencies:
-    "kind-of" "^3.0.2"
+    kind-of "^3.0.2"
 
-"is-data-descriptor@^1.0.0":
-  "integrity" "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc="
-  "resolved" "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz"
-  "version" "1.0.0"
+is-data-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz"
+  integrity sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=
   dependencies:
-    "kind-of" "^6.0.0"
+    kind-of "^6.0.0"
 
-"is-date-object@^1.0.1":
-  "integrity" "sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8="
-  "resolved" "https://registry.nlark.com/is-date-object/download/is-date-object-1.0.5.tgz"
-  "version" "1.0.5"
+is-date-object@^1.0.1:
+  version "1.0.5"
+  resolved "https://registry.nlark.com/is-date-object/download/is-date-object-1.0.5.tgz"
+  integrity sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8=
   dependencies:
-    "has-tostringtag" "^1.0.0"
+    has-tostringtag "^1.0.0"
 
-"is-descriptor@^0.1.0":
-  "integrity" "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco="
-  "resolved" "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz"
-  "version" "0.1.6"
+is-descriptor@^0.1.0:
+  version "0.1.6"
+  resolved "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz"
+  integrity sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=
   dependencies:
-    "is-accessor-descriptor" "^0.1.6"
-    "is-data-descriptor" "^0.1.4"
-    "kind-of" "^5.0.0"
+    is-accessor-descriptor "^0.1.6"
+    is-data-descriptor "^0.1.4"
+    kind-of "^5.0.0"
 
-"is-descriptor@^1.0.0", "is-descriptor@^1.0.2":
-  "integrity" "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw="
-  "resolved" "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz"
-  "version" "1.0.2"
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz"
+  integrity sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=
   dependencies:
-    "is-accessor-descriptor" "^1.0.0"
-    "is-data-descriptor" "^1.0.0"
-    "kind-of" "^6.0.2"
+    is-accessor-descriptor "^1.0.0"
+    is-data-descriptor "^1.0.0"
+    kind-of "^6.0.2"
 
-"is-extendable@^0.1.0", "is-extendable@^0.1.1":
-  "integrity" "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
-  "resolved" "https://registry.nlark.com/is-extendable/download/is-extendable-0.1.1.tgz"
-  "version" "0.1.1"
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.nlark.com/is-extendable/download/is-extendable-0.1.1.tgz"
+  integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
 
-"is-extendable@^1.0.1":
-  "integrity" "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ="
-  "resolved" "https://registry.nlark.com/is-extendable/download/is-extendable-1.0.1.tgz"
-  "version" "1.0.1"
+is-extendable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.nlark.com/is-extendable/download/is-extendable-1.0.1.tgz"
+  integrity sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=
   dependencies:
-    "is-plain-object" "^2.0.4"
+    is-plain-object "^2.0.4"
 
-"is-extglob@^2.1.1":
-  "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
-  "resolved" "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz"
-  "version" "2.1.1"
+is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz"
+  integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
 
-"is-fullwidth-code-point@^3.0.0":
-  "integrity" "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0="
-  "resolved" "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz?cache=0&sync_timestamp=1618552489864&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-fullwidth-code-point%2Fdownload%2Fis-fullwidth-code-point-3.0.0.tgz"
-  "version" "3.0.0"
+is-fullwidth-code-point@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz?cache=0&sync_timestamp=1618552489864&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-fullwidth-code-point%2Fdownload%2Fis-fullwidth-code-point-3.0.0.tgz"
+  integrity sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=
 
-"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1":
-  "integrity" "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ="
-  "resolved" "https://registry.npmmirror.com/is-glob/download/is-glob-4.0.3.tgz"
-  "version" "4.0.3"
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/is-glob/download/is-glob-4.0.3.tgz"
+  integrity sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=
   dependencies:
-    "is-extglob" "^2.1.1"
+    is-extglob "^2.1.1"
 
-"is-negative-zero@^2.0.1":
-  "integrity" "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA=="
-  "resolved" "https://registry.npmmirror.com/is-negative-zero/download/is-negative-zero-2.0.2.tgz"
-  "version" "2.0.2"
+is-negative-zero@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/is-negative-zero/download/is-negative-zero-2.0.2.tgz"
+  integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
 
-"is-number-object@^1.0.4":
-  "integrity" "sha1-anqvg4x/BoalC0VT9+VKlklOifA="
-  "resolved" "https://registry.nlark.com/is-number-object/download/is-number-object-1.0.6.tgz"
-  "version" "1.0.6"
+is-number-object@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.nlark.com/is-number-object/download/is-number-object-1.0.6.tgz"
+  integrity sha1-anqvg4x/BoalC0VT9+VKlklOifA=
   dependencies:
-    "has-tostringtag" "^1.0.0"
+    has-tostringtag "^1.0.0"
 
-"is-number@^3.0.0":
-  "integrity" "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU="
-  "resolved" "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz"
-  "version" "3.0.0"
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz"
+  integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
   dependencies:
-    "kind-of" "^3.0.2"
+    kind-of "^3.0.2"
 
-"is-number@^7.0.0":
-  "integrity" "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss="
-  "resolved" "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz"
-  "version" "7.0.0"
+is-number@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz"
+  integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=
 
-"is-plain-obj@^1.1":
-  "integrity" "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
-  "resolved" "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz?cache=0&sync_timestamp=1618600489644&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-1.1.0.tgz"
-  "version" "1.1.0"
+is-plain-obj@^1.1:
+  version "1.1.0"
+  resolved "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz?cache=0&sync_timestamp=1618600489644&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-1.1.0.tgz"
+  integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
 
-"is-plain-object@^2.0.3":
-  "integrity" "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc="
-  "resolved" "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz"
-  "version" "2.0.4"
+is-plain-object@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-3.0.1.tgz"
+  integrity sha1-Zi2S0kwKpDAkB7DUXSHyJRyF+Fs=
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz"
+  integrity sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=
   dependencies:
-    "isobject" "^3.0.1"
+    isobject "^3.0.1"
 
-"is-plain-object@^2.0.4":
-  "integrity" "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc="
-  "resolved" "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz"
-  "version" "2.0.4"
-  dependencies:
-    "isobject" "^3.0.1"
-
-"is-plain-object@3.0.1":
-  "integrity" "sha1-Zi2S0kwKpDAkB7DUXSHyJRyF+Fs="
-  "resolved" "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-3.0.1.tgz"
-  "version" "3.0.1"
-
-"is-reference@^1.2.1":
-  "integrity" "sha1-iy2sCzcfS8mU/eq6nrVC0DAC0Lc="
-  "resolved" "https://registry.nlark.com/is-reference/download/is-reference-1.2.1.tgz"
-  "version" "1.2.1"
+is-reference@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.nlark.com/is-reference/download/is-reference-1.2.1.tgz"
+  integrity sha1-iy2sCzcfS8mU/eq6nrVC0DAC0Lc=
   dependencies:
     "@types/estree" "*"
 
-"is-regex@^1.1.4":
-  "integrity" "sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg="
-  "resolved" "https://registry.nlark.com/is-regex/download/is-regex-1.1.4.tgz"
-  "version" "1.1.4"
+is-regex@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.nlark.com/is-regex/download/is-regex-1.1.4.tgz"
+  integrity sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg=
   dependencies:
-    "call-bind" "^1.0.2"
-    "has-tostringtag" "^1.0.0"
+    call-bind "^1.0.2"
+    has-tostringtag "^1.0.0"
 
-"is-shared-array-buffer@^1.0.1":
-  "integrity" "sha1-l7DIX72stZycRG/mU7gs8rW3z+Y="
-  "resolved" "https://registry.npmmirror.com/is-shared-array-buffer/download/is-shared-array-buffer-1.0.1.tgz"
-  "version" "1.0.1"
+is-shared-array-buffer@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/is-shared-array-buffer/download/is-shared-array-buffer-1.0.1.tgz"
+  integrity sha1-l7DIX72stZycRG/mU7gs8rW3z+Y=
 
-"is-string@^1.0.5", "is-string@^1.0.7":
-  "integrity" "sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0="
-  "resolved" "https://registry.nlark.com/is-string/download/is-string-1.0.7.tgz"
-  "version" "1.0.7"
+is-string@^1.0.5, is-string@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.nlark.com/is-string/download/is-string-1.0.7.tgz"
+  integrity sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0=
   dependencies:
-    "has-tostringtag" "^1.0.0"
+    has-tostringtag "^1.0.0"
 
-"is-symbol@^1.0.2", "is-symbol@^1.0.3":
-  "integrity" "sha1-ptrJO2NbBjymhyI23oiRClevE5w="
-  "resolved" "https://registry.nlark.com/is-symbol/download/is-symbol-1.0.4.tgz?cache=0&sync_timestamp=1620501174327&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-symbol%2Fdownload%2Fis-symbol-1.0.4.tgz"
-  "version" "1.0.4"
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.nlark.com/is-symbol/download/is-symbol-1.0.4.tgz?cache=0&sync_timestamp=1620501174327&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-symbol%2Fdownload%2Fis-symbol-1.0.4.tgz"
+  integrity sha1-ptrJO2NbBjymhyI23oiRClevE5w=
   dependencies:
-    "has-symbols" "^1.0.2"
+    has-symbols "^1.0.2"
 
-"is-weakref@^1.0.1":
-  "integrity" "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ=="
-  "resolved" "https://registry.npmmirror.com/is-weakref/download/is-weakref-1.0.2.tgz"
-  "version" "1.0.2"
+is-weakref@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/is-weakref/download/is-weakref-1.0.2.tgz"
+  integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
   dependencies:
-    "call-bind" "^1.0.2"
+    call-bind "^1.0.2"
 
-"is-windows@^1.0.2":
-  "integrity" "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0="
-  "resolved" "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz"
-  "version" "1.0.2"
+is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz"
+  integrity sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=
 
-"isarray@~1.0.0", "isarray@1.0.0":
-  "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-  "resolved" "https://registry.nlark.com/isarray/download/isarray-1.0.0.tgz"
-  "version" "1.0.0"
+isarray@1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.nlark.com/isarray/download/isarray-1.0.0.tgz"
+  integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
 
-"isexe@^2.0.0":
-  "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
-  "resolved" "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz"
-  "version" "2.0.0"
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz"
+  integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
 
-"isobject@^2.0.0":
-  "integrity" "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA=="
-  "resolved" "https://registry.npmmirror.com/isobject/download/isobject-2.1.0.tgz"
-  "version" "2.1.0"
+isobject@^2.0.0, isobject@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/isobject/download/isobject-2.1.0.tgz"
+  integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==
   dependencies:
-    "isarray" "1.0.0"
+    isarray "1.0.0"
 
-"isobject@^2.1.0":
-  "integrity" "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA=="
-  "resolved" "https://registry.npmmirror.com/isobject/download/isobject-2.1.0.tgz"
-  "version" "2.1.0"
+isobject@^3.0.0, isobject@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/isobject/download/isobject-3.0.1.tgz"
+  integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
+
+js-base64@^2.1.9:
+  version "2.6.4"
+  resolved "https://registry.npmmirror.com/js-base64/download/js-base64-2.6.4.tgz"
+  integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.nlark.com/js-tokens/download/js-tokens-4.0.0.tgz?cache=0&sync_timestamp=1619345098261&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-tokens%2Fdownload%2Fjs-tokens-4.0.0.tgz"
+  integrity sha1-GSA/tZmR35jjoocFDUZHzerzJJk=
+
+js-yaml@^3.13.1:
+  version "3.14.1"
+  resolved "https://registry.npmmirror.com/js-yaml/download/js-yaml-3.14.1.tgz"
+  integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
   dependencies:
-    "isarray" "1.0.0"
+    argparse "^1.0.7"
+    esprima "^4.0.0"
 
-"isobject@^3.0.0":
-  "integrity" "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="
-  "resolved" "https://registry.npmmirror.com/isobject/download/isobject-3.0.1.tgz"
-  "version" "3.0.1"
+jsesc@^2.5.1:
+  version "2.5.2"
+  resolved "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz?cache=0&sync_timestamp=1603891232110&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-2.5.2.tgz"
+  integrity sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=
 
-"isobject@^3.0.1":
-  "integrity" "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="
-  "resolved" "https://registry.npmmirror.com/isobject/download/isobject-3.0.1.tgz"
-  "version" "3.0.1"
+json-schema-traverse@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz?cache=0&sync_timestamp=1607999852153&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-0.4.1.tgz"
+  integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA=
 
-"js-base64@^2.1.9":
-  "integrity" "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ=="
-  "resolved" "https://registry.npmmirror.com/js-base64/download/js-base64-2.6.4.tgz"
-  "version" "2.6.4"
+json-schema-traverse@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-1.0.0.tgz?cache=0&sync_timestamp=1607999852153&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-1.0.0.tgz"
+  integrity sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=
 
-"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0":
-  "integrity" "sha1-GSA/tZmR35jjoocFDUZHzerzJJk="
-  "resolved" "https://registry.nlark.com/js-tokens/download/js-tokens-4.0.0.tgz?cache=0&sync_timestamp=1619345098261&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-tokens%2Fdownload%2Fjs-tokens-4.0.0.tgz"
-  "version" "4.0.0"
+json-stable-stringify-without-jsonify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz"
+  integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
 
-"js-yaml@^3.13.1":
-  "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="
-  "resolved" "https://registry.npmmirror.com/js-yaml/download/js-yaml-3.14.1.tgz"
-  "version" "3.14.1"
+json5@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/json5/download/json5-1.0.1.tgz"
+  integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
   dependencies:
-    "argparse" "^1.0.7"
-    "esprima" "^4.0.0"
+    minimist "^1.2.0"
 
-"jsesc@^2.5.1":
-  "integrity" "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q="
-  "resolved" "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz?cache=0&sync_timestamp=1603891232110&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-2.5.2.tgz"
-  "version" "2.5.2"
-
-"json-schema-traverse@^0.4.1":
-  "integrity" "sha1-afaofZUTq4u4/mO9sJecRI5oRmA="
-  "resolved" "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz?cache=0&sync_timestamp=1607999852153&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-0.4.1.tgz"
-  "version" "0.4.1"
-
-"json-schema-traverse@^1.0.0":
-  "integrity" "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI="
-  "resolved" "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-1.0.0.tgz?cache=0&sync_timestamp=1607999852153&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-1.0.0.tgz"
-  "version" "1.0.0"
-
-"json-stable-stringify-without-jsonify@^1.0.1":
-  "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
-  "resolved" "https://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz"
-  "version" "1.0.1"
-
-"json5@^1.0.1":
-  "integrity" "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow=="
-  "resolved" "https://registry.npmmirror.com/json5/download/json5-1.0.1.tgz"
-  "version" "1.0.1"
+json5@^2.1.2:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/json5/download/json5-2.2.0.tgz"
+  integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
   dependencies:
-    "minimist" "^1.2.0"
+    minimist "^1.2.5"
 
-"json5@^2.1.2":
-  "integrity" "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA=="
-  "resolved" "https://registry.npmmirror.com/json5/download/json5-2.2.0.tgz"
-  "version" "2.2.0"
+jsonfile@^6.0.1:
+  version "6.1.0"
+  resolved "https://registry.nlark.com/jsonfile/download/jsonfile-6.1.0.tgz"
+  integrity sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4=
   dependencies:
-    "minimist" "^1.2.5"
-
-"jsonfile@^6.0.1":
-  "integrity" "sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4="
-  "resolved" "https://registry.nlark.com/jsonfile/download/jsonfile-6.1.0.tgz"
-  "version" "6.1.0"
-  dependencies:
-    "universalify" "^2.0.0"
+    universalify "^2.0.0"
   optionalDependencies:
-    "graceful-fs" "^4.1.6"
+    graceful-fs "^4.1.6"
 
-"kind-of@^3.0.2", "kind-of@^3.0.3":
-  "integrity" "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="
-  "resolved" "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz"
-  "version" "3.2.2"
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+  version "3.2.2"
+  resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz"
+  integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
   dependencies:
-    "is-buffer" "^1.1.5"
+    is-buffer "^1.1.5"
 
-"kind-of@^3.2.0":
-  "integrity" "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="
-  "resolved" "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz"
-  "version" "3.2.2"
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz"
+  integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
   dependencies:
-    "is-buffer" "^1.1.5"
+    is-buffer "^1.1.5"
 
-"kind-of@^4.0.0":
-  "integrity" "sha1-IIE989cSkosgc3hpGkUGb65y3Vc="
-  "resolved" "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz"
-  "version" "4.0.0"
+kind-of@^5.0.0, kind-of@^5.0.2:
+  version "5.1.0"
+  resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz"
+  integrity sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+  version "6.0.3"
+  resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz"
+  integrity sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=
+
+levn@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.npm.taobao.org/levn/download/levn-0.4.1.tgz"
+  integrity sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=
   dependencies:
-    "is-buffer" "^1.1.5"
+    prelude-ls "^1.2.1"
+    type-check "~0.4.0"
 
-"kind-of@^5.0.0", "kind-of@^5.0.2":
-  "integrity" "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0="
-  "resolved" "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz"
-  "version" "5.1.0"
+listenercount@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npm.taobao.org/listenercount/download/listenercount-1.0.1.tgz"
+  integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=
 
-"kind-of@^6.0.0":
-  "integrity" "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0="
-  "resolved" "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz"
-  "version" "6.0.3"
-
-"kind-of@^6.0.2":
-  "integrity" "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0="
-  "resolved" "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz"
-  "version" "6.0.3"
-
-"levn@^0.4.1":
-  "integrity" "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4="
-  "resolved" "https://registry.npm.taobao.org/levn/download/levn-0.4.1.tgz"
-  "version" "0.4.1"
+loader-utils@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/loader-utils/download/loader-utils-1.4.0.tgz"
+  integrity sha1-xXm140yzSxp07cbB+za/o3HVphM=
   dependencies:
-    "prelude-ls" "^1.2.1"
-    "type-check" "~0.4.0"
+    big.js "^5.2.2"
+    emojis-list "^3.0.0"
+    json5 "^1.0.1"
 
-"listenercount@~1.0.1":
-  "integrity" "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc="
-  "resolved" "https://registry.npm.taobao.org/listenercount/download/listenercount-1.0.1.tgz"
-  "version" "1.0.1"
-
-"loader-utils@^1.1.0":
-  "integrity" "sha1-xXm140yzSxp07cbB+za/o3HVphM="
-  "resolved" "https://registry.npmmirror.com/loader-utils/download/loader-utils-1.4.0.tgz"
-  "version" "1.4.0"
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.nlark.com/locate-path/download/locate-path-2.0.0.tgz?cache=0&sync_timestamp=1629895618224&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-2.0.0.tgz"
+  integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
   dependencies:
-    "big.js" "^5.2.2"
-    "emojis-list" "^3.0.0"
-    "json5" "^1.0.1"
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
 
-"locate-path@^2.0.0":
-  "integrity" "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4="
-  "resolved" "https://registry.nlark.com/locate-path/download/locate-path-2.0.0.tgz?cache=0&sync_timestamp=1629895618224&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-2.0.0.tgz"
-  "version" "2.0.0"
+lodash-es@^4.17.15:
+  version "4.17.21"
+  resolved "https://registry.npmmirror.com/lodash-es/download/lodash-es-4.17.21.tgz"
+  integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
+lodash.merge@^4.6.2:
+  version "4.6.2"
+  resolved "https://registry.npm.taobao.org/lodash.merge/download/lodash.merge-4.6.2.tgz"
+  integrity sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=
+
+lodash.truncate@^4.4.2:
+  version "4.4.2"
+  resolved "https://registry.nlark.com/lodash.truncate/download/lodash.truncate-4.4.2.tgz"
+  integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
+
+lodash@^4.17.15, lodash@^4.17.21:
+  version "4.17.21"
+  resolved "https://registry.npmmirror.com/lodash/download/lodash-4.17.21.tgz"
+  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+loose-envify@^1.0.0:
+  version "1.4.0"
+  resolved "https://registry.nlark.com/loose-envify/download/loose-envify-1.4.0.tgz?cache=0&sync_timestamp=1631633000868&other_urls=https%3A%2F%2Fregistry.nlark.com%2Floose-envify%2Fdownload%2Floose-envify-1.4.0.tgz"
+  integrity sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=
   dependencies:
-    "p-locate" "^2.0.0"
-    "path-exists" "^3.0.0"
+    js-tokens "^3.0.0 || ^4.0.0"
 
-"lodash-es@^4.17.15":
-  "integrity" "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
-  "resolved" "https://registry.npmmirror.com/lodash-es/download/lodash-es-4.17.21.tgz"
-  "version" "4.17.21"
-
-"lodash.merge@^4.6.2":
-  "integrity" "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo="
-  "resolved" "https://registry.npm.taobao.org/lodash.merge/download/lodash.merge-4.6.2.tgz"
-  "version" "4.6.2"
-
-"lodash.truncate@^4.4.2":
-  "integrity" "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM="
-  "resolved" "https://registry.nlark.com/lodash.truncate/download/lodash.truncate-4.4.2.tgz"
-  "version" "4.4.2"
-
-"lodash@^4.17.15", "lodash@^4.17.21":
-  "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-  "resolved" "https://registry.npmmirror.com/lodash/download/lodash-4.17.21.tgz"
-  "version" "4.17.21"
-
-"loose-envify@^1.0.0":
-  "integrity" "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8="
-  "resolved" "https://registry.nlark.com/loose-envify/download/loose-envify-1.4.0.tgz?cache=0&sync_timestamp=1631633000868&other_urls=https%3A%2F%2Fregistry.nlark.com%2Floose-envify%2Fdownload%2Floose-envify-1.4.0.tgz"
-  "version" "1.4.0"
+lower-case@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npm.taobao.org/lower-case/download/lower-case-2.0.2.tgz?cache=0&sync_timestamp=1606867333511&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flower-case%2Fdownload%2Flower-case-2.0.2.tgz"
+  integrity sha1-b6I3xj29xKgsoP2ILkci3F5jTig=
   dependencies:
-    "js-tokens" "^3.0.0 || ^4.0.0"
+    tslib "^2.0.3"
 
-"lower-case@^2.0.2":
-  "integrity" "sha1-b6I3xj29xKgsoP2ILkci3F5jTig="
-  "resolved" "https://registry.npm.taobao.org/lower-case/download/lower-case-2.0.2.tgz?cache=0&sync_timestamp=1606867333511&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flower-case%2Fdownload%2Flower-case-2.0.2.tgz"
-  "version" "2.0.2"
+lru-cache@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npm.taobao.org/lru-cache/download/lru-cache-6.0.0.tgz?cache=0&sync_timestamp=1599054167787&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-6.0.0.tgz"
+  integrity sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=
   dependencies:
-    "tslib" "^2.0.3"
+    yallist "^4.0.0"
 
-"lru-cache@^6.0.0":
-  "integrity" "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ="
-  "resolved" "https://registry.npm.taobao.org/lru-cache/download/lru-cache-6.0.0.tgz?cache=0&sync_timestamp=1599054167787&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-6.0.0.tgz"
-  "version" "6.0.0"
+magic-string@^0.25.7:
+  version "0.25.7"
+  resolved "https://registry.npm.taobao.org/magic-string/download/magic-string-0.25.7.tgz"
+  integrity sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE=
   dependencies:
-    "yallist" "^4.0.0"
+    sourcemap-codec "^1.4.4"
 
-"magic-string@^0.25.7":
-  "integrity" "sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE="
-  "resolved" "https://registry.npm.taobao.org/magic-string/download/magic-string-0.25.7.tgz"
-  "version" "0.25.7"
+map-cache@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz"
+  integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.nlark.com/map-visit/download/map-visit-1.0.0.tgz"
+  integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
   dependencies:
-    "sourcemap-codec" "^1.4.4"
+    object-visit "^1.0.0"
 
-"map-cache@^0.2.2":
-  "integrity" "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
-  "resolved" "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz"
-  "version" "0.2.2"
+mdn-data@2.0.14:
+  version "2.0.14"
+  resolved "https://registry.npmmirror.com/mdn-data/download/mdn-data-2.0.14.tgz"
+  integrity sha1-cRP8QoGRfWPOKbQ0RvcB5owlulA=
 
-"map-visit@^1.0.0":
-  "integrity" "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48="
-  "resolved" "https://registry.nlark.com/map-visit/download/map-visit-1.0.0.tgz"
-  "version" "1.0.0"
+merge-options@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npm.taobao.org/merge-options/download/merge-options-1.0.1.tgz"
+  integrity sha1-KmSyRFe+zU5NxggoMkfpTOWJqjI=
   dependencies:
-    "object-visit" "^1.0.0"
+    is-plain-obj "^1.1"
 
-"mdn-data@2.0.14":
-  "integrity" "sha1-cRP8QoGRfWPOKbQ0RvcB5owlulA="
-  "resolved" "https://registry.npmmirror.com/mdn-data/download/mdn-data-2.0.14.tgz"
-  "version" "2.0.14"
+merge2@^1.3.0, merge2@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz"
+  integrity sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=
 
-"merge-options@1.0.1":
-  "integrity" "sha1-KmSyRFe+zU5NxggoMkfpTOWJqjI="
-  "resolved" "https://registry.npm.taobao.org/merge-options/download/merge-options-1.0.1.tgz"
-  "version" "1.0.1"
+micromatch@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.0.tgz?cache=0&sync_timestamp=1618054740956&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-3.1.0.tgz"
+  integrity sha1-UQLU6vILaZfWAI46z+HESj+oFeI=
   dependencies:
-    "is-plain-obj" "^1.1"
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    braces "^2.2.2"
+    define-property "^1.0.0"
+    extend-shallow "^2.0.1"
+    extglob "^2.0.2"
+    fragment-cache "^0.2.1"
+    kind-of "^5.0.2"
+    nanomatch "^1.2.1"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
 
-"merge2@^1.3.0", "merge2@^1.4.1":
-  "integrity" "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4="
-  "resolved" "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz"
-  "version" "1.4.1"
-
-"micromatch@^4.0.4":
-  "integrity" "sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k="
-  "resolved" "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.4.tgz?cache=0&sync_timestamp=1618054740956&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-4.0.4.tgz"
-  "version" "4.0.4"
+micromatch@^4.0.4:
+  version "4.0.4"
+  resolved "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.4.tgz?cache=0&sync_timestamp=1618054740956&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-4.0.4.tgz"
+  integrity sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k=
   dependencies:
-    "braces" "^3.0.1"
-    "picomatch" "^2.2.3"
+    braces "^3.0.1"
+    picomatch "^2.2.3"
 
-"micromatch@3.1.0":
-  "integrity" "sha1-UQLU6vILaZfWAI46z+HESj+oFeI="
-  "resolved" "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.0.tgz?cache=0&sync_timestamp=1618054740956&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-3.1.0.tgz"
-  "version" "3.1.0"
+minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz"
+  integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=
   dependencies:
-    "arr-diff" "^4.0.0"
-    "array-unique" "^0.3.2"
-    "braces" "^2.2.2"
-    "define-property" "^1.0.0"
-    "extend-shallow" "^2.0.1"
-    "extglob" "^2.0.2"
-    "fragment-cache" "^0.2.1"
-    "kind-of" "^5.0.2"
-    "nanomatch" "^1.2.1"
-    "object.pick" "^1.3.0"
-    "regex-not" "^1.0.0"
-    "snapdragon" "^0.8.1"
-    "to-regex" "^3.0.1"
+    brace-expansion "^1.1.7"
 
-"minimatch@^3.0.4":
-  "integrity" "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM="
-  "resolved" "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz"
-  "version" "3.0.4"
+minimist@^1.2.0, minimist@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz"
+  integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=
+
+mitt@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/mitt/-/mitt-3.0.0.tgz#69ef9bd5c80ff6f57473e8d89326d01c414be0bd"
+  integrity sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==
+
+mixin-deep@^1.2.0:
+  version "1.3.2"
+  resolved "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz"
+  integrity sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=
   dependencies:
-    "brace-expansion" "^1.1.7"
-
-"minimist@^1.2.0", "minimist@^1.2.5":
-  "integrity" "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI="
-  "resolved" "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz"
-  "version" "1.2.5"
-
-"mixin-deep@^1.2.0":
-  "integrity" "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY="
-  "resolved" "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz"
-  "version" "1.3.2"
-  dependencies:
-    "for-in" "^1.0.2"
-    "is-extendable" "^1.0.1"
+    for-in "^1.0.2"
+    is-extendable "^1.0.1"
 
 "mkdirp@>=0.5 0":
-  "integrity" "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8="
-  "resolved" "https://registry.npmmirror.com/mkdirp/download/mkdirp-0.5.5.tgz?cache=0&sync_timestamp=1636300883420&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.5.tgz"
-  "version" "0.5.5"
+  version "0.5.5"
+  resolved "https://registry.npmmirror.com/mkdirp/download/mkdirp-0.5.5.tgz?cache=0&sync_timestamp=1636300883420&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.5.tgz"
+  integrity sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=
   dependencies:
-    "minimist" "^1.2.5"
+    minimist "^1.2.5"
 
-"moment@^2.27.0":
-  "integrity" "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
-  "resolved" "https://registry.npmmirror.com/moment/download/moment-2.29.1.tgz"
-  "version" "2.29.1"
+moment@^2.27.0:
+  version "2.29.1"
+  resolved "https://registry.npmmirror.com/moment/download/moment-2.29.1.tgz"
+  integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
 
-"ms@^2.1.1", "ms@2.1.2":
-  "integrity" "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk="
-  "resolved" "https://registry.npmmirror.com/ms/download/ms-2.1.2.tgz"
-  "version" "2.1.2"
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz"
+  integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
 
-"ms@2.0.0":
-  "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-  "resolved" "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz"
-  "version" "2.0.0"
+ms@2.1.2, ms@^2.1.1:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/ms/download/ms-2.1.2.tgz"
+  integrity sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=
 
-"mutation-observer@^1.0.3":
-  "integrity" "sha1-QukiKxAbyoLlup1aes9KFMDyY9A="
-  "resolved" "https://registry.npm.taobao.org/mutation-observer/download/mutation-observer-1.0.3.tgz"
-  "version" "1.0.3"
+mutation-observer@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npm.taobao.org/mutation-observer/download/mutation-observer-1.0.3.tgz"
+  integrity sha1-QukiKxAbyoLlup1aes9KFMDyY9A=
 
-"nanoid@^3.1.30":
-  "integrity" "sha512-ZivnJm0o9bb13p2Ot5CpgC2rQdzB9Uxm/mFZweqm5eMViqOJe3PV6LU2E30SiLgheesmcPrjquqraoolONSA0A=="
-  "resolved" "https://registry.npmmirror.com/nanoid/download/nanoid-3.1.31.tgz"
-  "version" "3.1.31"
+nanoid@^3.1.30:
+  version "3.1.31"
+  resolved "https://registry.npmmirror.com/nanoid/download/nanoid-3.1.31.tgz"
+  integrity sha512-ZivnJm0o9bb13p2Ot5CpgC2rQdzB9Uxm/mFZweqm5eMViqOJe3PV6LU2E30SiLgheesmcPrjquqraoolONSA0A==
 
-"nanomatch@^1.2.1":
-  "integrity" "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk="
-  "resolved" "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz"
-  "version" "1.2.13"
+nanomatch@^1.2.1:
+  version "1.2.13"
+  resolved "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz"
+  integrity sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=
   dependencies:
-    "arr-diff" "^4.0.0"
-    "array-unique" "^0.3.2"
-    "define-property" "^2.0.2"
-    "extend-shallow" "^3.0.2"
-    "fragment-cache" "^0.2.1"
-    "is-windows" "^1.0.2"
-    "kind-of" "^6.0.2"
-    "object.pick" "^1.3.0"
-    "regex-not" "^1.0.0"
-    "snapdragon" "^0.8.1"
-    "to-regex" "^3.0.1"
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    fragment-cache "^0.2.1"
+    is-windows "^1.0.2"
+    kind-of "^6.0.2"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
 
-"nanopop@^2.1.0":
-  "integrity" "sha1-I0dlE87iQFiIr9LopLVAZrcLnmA="
-  "resolved" "https://registry.npm.taobao.org/nanopop/download/nanopop-2.1.0.tgz"
-  "version" "2.1.0"
+nanopop@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npm.taobao.org/nanopop/download/nanopop-2.1.0.tgz"
+  integrity sha1-I0dlE87iQFiIr9LopLVAZrcLnmA=
 
-"natural-compare@^1.4.0":
-  "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
-  "resolved" "https://registry.nlark.com/natural-compare/download/natural-compare-1.4.0.tgz"
-  "version" "1.4.0"
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.nlark.com/natural-compare/download/natural-compare-1.4.0.tgz"
+  integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
 
-"no-case@^3.0.4":
-  "integrity" "sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0="
-  "resolved" "https://registry.npm.taobao.org/no-case/download/no-case-3.0.4.tgz?cache=0&sync_timestamp=1606867308811&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fno-case%2Fdownload%2Fno-case-3.0.4.tgz"
-  "version" "3.0.4"
+no-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npm.taobao.org/no-case/download/no-case-3.0.4.tgz?cache=0&sync_timestamp=1606867308811&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fno-case%2Fdownload%2Fno-case-3.0.4.tgz"
+  integrity sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0=
   dependencies:
-    "lower-case" "^2.0.2"
-    "tslib" "^2.0.3"
+    lower-case "^2.0.2"
+    tslib "^2.0.3"
 
-"node-releases@^2.0.1":
-  "integrity" "sha1-PR05XyBPHy8ppUNYuftnh2WtL8U="
-  "resolved" "https://registry.npmmirror.com/node-releases/download/node-releases-2.0.1.tgz"
-  "version" "2.0.1"
+node-releases@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/node-releases/download/node-releases-2.0.1.tgz"
+  integrity sha1-PR05XyBPHy8ppUNYuftnh2WtL8U=
 
-"normalize-path@^3.0.0", "normalize-path@~3.0.0":
-  "integrity" "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU="
-  "resolved" "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz"
-  "version" "3.0.0"
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz"
+  integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=
 
-"nth-check@^2.0.1":
-  "integrity" "sha1-Lv4WL1w9oGoolZ+9PbddvuqfD8I="
-  "resolved" "https://registry.nlark.com/nth-check/download/nth-check-2.0.1.tgz?cache=0&sync_timestamp=1631793617973&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnth-check%2Fdownload%2Fnth-check-2.0.1.tgz"
-  "version" "2.0.1"
+nth-check@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.nlark.com/nth-check/download/nth-check-2.0.1.tgz?cache=0&sync_timestamp=1631793617973&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnth-check%2Fdownload%2Fnth-check-2.0.1.tgz"
+  integrity sha1-Lv4WL1w9oGoolZ+9PbddvuqfD8I=
   dependencies:
-    "boolbase" "^1.0.0"
+    boolbase "^1.0.0"
 
-"object-assign@^4", "object-assign@^4.1.0":
-  "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
-  "resolved" "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz"
-  "version" "4.1.1"
+object-assign@^4, object-assign@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz"
+  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
 
-"object-copy@^0.1.0":
-  "integrity" "sha1-fn2Fi3gb18mRpBupde04EnVOmYw="
-  "resolved" "https://registry.nlark.com/object-copy/download/object-copy-0.1.0.tgz"
-  "version" "0.1.0"
+object-copy@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.nlark.com/object-copy/download/object-copy-0.1.0.tgz"
+  integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
   dependencies:
-    "copy-descriptor" "^0.1.0"
-    "define-property" "^0.2.5"
-    "kind-of" "^3.0.3"
+    copy-descriptor "^0.1.0"
+    define-property "^0.2.5"
+    kind-of "^3.0.3"
 
-"object-inspect@^1.11.0", "object-inspect@^1.9.0":
-  "integrity" "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
-  "resolved" "https://registry.npmmirror.com/object-inspect/download/object-inspect-1.12.0.tgz"
-  "version" "1.12.0"
+object-inspect@^1.11.0, object-inspect@^1.9.0:
+  version "1.12.0"
+  resolved "https://registry.npmmirror.com/object-inspect/download/object-inspect-1.12.0.tgz"
+  integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==
 
-"object-keys@^1.0.12", "object-keys@^1.1.1":
-  "integrity" "sha1-HEfyct8nfzsdrwYWd9nILiMixg4="
-  "resolved" "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz"
-  "version" "1.1.1"
+object-keys@^1.0.12, object-keys@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz"
+  integrity sha1-HEfyct8nfzsdrwYWd9nILiMixg4=
 
-"object-visit@^1.0.0":
-  "integrity" "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs="
-  "resolved" "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz"
-  "version" "1.0.1"
+object-visit@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz"
+  integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
   dependencies:
-    "isobject" "^3.0.0"
+    isobject "^3.0.0"
 
-"object.assign@^4.1.2":
-  "integrity" "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA="
-  "resolved" "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.2.tgz?cache=0&sync_timestamp=1604115158081&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.assign%2Fdownload%2Fobject.assign-4.1.2.tgz"
-  "version" "4.1.2"
+object.assign@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.2.tgz?cache=0&sync_timestamp=1604115158081&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.assign%2Fdownload%2Fobject.assign-4.1.2.tgz"
+  integrity sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=
   dependencies:
-    "call-bind" "^1.0.0"
-    "define-properties" "^1.1.3"
-    "has-symbols" "^1.0.1"
-    "object-keys" "^1.1.1"
+    call-bind "^1.0.0"
+    define-properties "^1.1.3"
+    has-symbols "^1.0.1"
+    object-keys "^1.1.1"
 
-"object.pick@^1.3.0":
-  "integrity" "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c="
-  "resolved" "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz"
-  "version" "1.3.0"
+object.pick@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz"
+  integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
   dependencies:
-    "isobject" "^3.0.1"
+    isobject "^3.0.1"
 
-"object.values@^1.1.5":
-  "integrity" "sha1-lZ9j486e8QhyAzMIITHkpFm3Fqw="
-  "resolved" "https://registry.npmmirror.com/object.values/download/object.values-1.1.5.tgz"
-  "version" "1.1.5"
+object.values@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.npmmirror.com/object.values/download/object.values-1.1.5.tgz"
+  integrity sha1-lZ9j486e8QhyAzMIITHkpFm3Fqw=
   dependencies:
-    "call-bind" "^1.0.2"
-    "define-properties" "^1.1.3"
-    "es-abstract" "^1.19.1"
+    call-bind "^1.0.2"
+    define-properties "^1.1.3"
+    es-abstract "^1.19.1"
 
-"omit.js@^2.0.0":
-  "integrity" "sha1-3ZuENvq5R6Xz/yFMslOGMeMT7C8="
-  "resolved" "https://registry.npm.taobao.org/omit.js/download/omit.js-2.0.2.tgz"
-  "version" "2.0.2"
+omit.js@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.npm.taobao.org/omit.js/download/omit.js-2.0.2.tgz"
+  integrity sha1-3ZuENvq5R6Xz/yFMslOGMeMT7C8=
 
-"once@^1.3.0":
-  "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E="
-  "resolved" "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz"
-  "version" "1.4.0"
+once@^1.3.0:
+  version "1.4.0"
+  resolved "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz"
+  integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
   dependencies:
-    "wrappy" "1"
+    wrappy "1"
 
-"optionator@^0.9.1":
-  "integrity" "sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk="
-  "resolved" "https://registry.npm.taobao.org/optionator/download/optionator-0.9.1.tgz"
-  "version" "0.9.1"
+optionator@^0.9.1:
+  version "0.9.1"
+  resolved "https://registry.npm.taobao.org/optionator/download/optionator-0.9.1.tgz"
+  integrity sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk=
   dependencies:
-    "deep-is" "^0.1.3"
-    "fast-levenshtein" "^2.0.6"
-    "levn" "^0.4.1"
-    "prelude-ls" "^1.2.1"
-    "type-check" "^0.4.0"
-    "word-wrap" "^1.2.3"
+    deep-is "^0.1.3"
+    fast-levenshtein "^2.0.6"
+    levn "^0.4.1"
+    prelude-ls "^1.2.1"
+    type-check "^0.4.0"
+    word-wrap "^1.2.3"
 
-"p-limit@^1.1.0":
-  "integrity" "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg="
-  "resolved" "https://registry.nlark.com/p-limit/download/p-limit-1.3.0.tgz"
-  "version" "1.3.0"
+p-limit@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.nlark.com/p-limit/download/p-limit-1.3.0.tgz"
+  integrity sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=
   dependencies:
-    "p-try" "^1.0.0"
+    p-try "^1.0.0"
 
-"p-locate@^2.0.0":
-  "integrity" "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM="
-  "resolved" "https://registry.nlark.com/p-locate/download/p-locate-2.0.0.tgz?cache=0&sync_timestamp=1629892721671&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-2.0.0.tgz"
-  "version" "2.0.0"
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.nlark.com/p-locate/download/p-locate-2.0.0.tgz?cache=0&sync_timestamp=1629892721671&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-2.0.0.tgz"
+  integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
   dependencies:
-    "p-limit" "^1.1.0"
+    p-limit "^1.1.0"
 
-"p-try@^1.0.0":
-  "integrity" "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
-  "resolved" "https://registry.npmmirror.com/p-try/download/p-try-1.0.0.tgz?cache=0&sync_timestamp=1633364462890&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-try%2Fdownload%2Fp-try-1.0.0.tgz"
-  "version" "1.0.0"
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/p-try/download/p-try-1.0.0.tgz?cache=0&sync_timestamp=1633364462890&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-try%2Fdownload%2Fp-try-1.0.0.tgz"
+  integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
 
-"param-case@^3.0.4":
-  "integrity" "sha1-fRf+SqEr3jTUp32RrPtiGcqtAcU="
-  "resolved" "https://registry.npm.taobao.org/param-case/download/param-case-3.0.4.tgz?cache=0&sync_timestamp=1606867292797&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparam-case%2Fdownload%2Fparam-case-3.0.4.tgz"
-  "version" "3.0.4"
+param-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npm.taobao.org/param-case/download/param-case-3.0.4.tgz?cache=0&sync_timestamp=1606867292797&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparam-case%2Fdownload%2Fparam-case-3.0.4.tgz"
+  integrity sha1-fRf+SqEr3jTUp32RrPtiGcqtAcU=
   dependencies:
-    "dot-case" "^3.0.4"
-    "tslib" "^2.0.3"
+    dot-case "^3.0.4"
+    tslib "^2.0.3"
 
-"parent-module@^1.0.0":
-  "integrity" "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI="
-  "resolved" "https://registry.npmmirror.com/parent-module/download/parent-module-1.0.1.tgz"
-  "version" "1.0.1"
+parent-module@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/parent-module/download/parent-module-1.0.1.tgz"
+  integrity sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=
   dependencies:
-    "callsites" "^3.0.0"
+    callsites "^3.0.0"
 
-"pascal-case@^3.1.2":
-  "integrity" "sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs="
-  "resolved" "https://registry.npm.taobao.org/pascal-case/download/pascal-case-3.1.2.tgz?cache=0&sync_timestamp=1606867325163&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpascal-case%2Fdownload%2Fpascal-case-3.1.2.tgz"
-  "version" "3.1.2"
+pascal-case@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.npm.taobao.org/pascal-case/download/pascal-case-3.1.2.tgz?cache=0&sync_timestamp=1606867325163&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpascal-case%2Fdownload%2Fpascal-case-3.1.2.tgz"
+  integrity sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs=
   dependencies:
-    "no-case" "^3.0.4"
-    "tslib" "^2.0.3"
+    no-case "^3.0.4"
+    tslib "^2.0.3"
 
-"pascalcase@^0.1.1":
-  "integrity" "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
-  "resolved" "https://registry.npmmirror.com/pascalcase/download/pascalcase-0.1.1.tgz"
-  "version" "0.1.1"
+pascalcase@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/pascalcase/download/pascalcase-0.1.1.tgz"
+  integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
 
-"path-case@^3.0.4":
-  "integrity" "sha1-kWhkUzTrlCZYN1xW+AtMDLX4LG8="
-  "resolved" "https://registry.npm.taobao.org/path-case/download/path-case-3.0.4.tgz?cache=0&sync_timestamp=1606867325967&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-case%2Fdownload%2Fpath-case-3.0.4.tgz"
-  "version" "3.0.4"
+path-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npm.taobao.org/path-case/download/path-case-3.0.4.tgz?cache=0&sync_timestamp=1606867325967&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-case%2Fdownload%2Fpath-case-3.0.4.tgz"
+  integrity sha1-kWhkUzTrlCZYN1xW+AtMDLX4LG8=
   dependencies:
-    "dot-case" "^3.0.4"
-    "tslib" "^2.0.3"
+    dot-case "^3.0.4"
+    tslib "^2.0.3"
 
-"path-exists@^3.0.0":
-  "integrity" "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
-  "resolved" "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz"
-  "version" "3.0.0"
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz"
+  integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
 
-"path-is-absolute@^1.0.0":
-  "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
-  "resolved" "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz"
-  "version" "1.0.1"
+path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz"
+  integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
 
-"path-key@^3.1.0":
-  "integrity" "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U="
-  "resolved" "https://registry.npmmirror.com/path-key/download/path-key-3.1.1.tgz"
-  "version" "3.1.1"
+path-key@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/path-key/download/path-key-3.1.1.tgz"
+  integrity sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=
 
-"path-parse@^1.0.7":
-  "integrity" "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU="
-  "resolved" "https://registry.nlark.com/path-parse/download/path-parse-1.0.7.tgz"
-  "version" "1.0.7"
+path-parse@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.nlark.com/path-parse/download/path-parse-1.0.7.tgz"
+  integrity sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=
 
-"path-type@^4.0.0":
-  "integrity" "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs="
-  "resolved" "https://registry.nlark.com/path-type/download/path-type-4.0.0.tgz"
-  "version" "4.0.0"
+path-type@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.nlark.com/path-type/download/path-type-4.0.0.tgz"
+  integrity sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=
 
-"picocolors@^1.0.0":
-  "integrity" "sha1-y1vcdP8/UYkiNur3nWi8RFZKuBw="
-  "resolved" "https://registry.npmmirror.com/picocolors/download/picocolors-1.0.0.tgz?cache=0&sync_timestamp=1634093442271&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpicocolors%2Fdownload%2Fpicocolors-1.0.0.tgz"
-  "version" "1.0.0"
+picocolors@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/picocolors/download/picocolors-1.0.0.tgz?cache=0&sync_timestamp=1634093442271&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpicocolors%2Fdownload%2Fpicocolors-1.0.0.tgz"
+  integrity sha1-y1vcdP8/UYkiNur3nWi8RFZKuBw=
 
-"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.2.2", "picomatch@^2.2.3":
-  "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
-  "resolved" "https://registry.npmmirror.com/picomatch/download/picomatch-2.3.1.tgz"
-  "version" "2.3.1"
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/picomatch/download/picomatch-2.3.1.tgz"
+  integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
 
-"posix-character-classes@^0.1.0":
-  "integrity" "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
-  "resolved" "https://registry.npmmirror.com/posix-character-classes/download/posix-character-classes-0.1.1.tgz"
-  "version" "0.1.1"
+posix-character-classes@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/posix-character-classes/download/posix-character-classes-0.1.1.tgz"
+  integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
 
-"postcss-prefix-selector@^1.6.0":
-  "integrity" "sha512-8d5fiBQZWMtGWH/7ewEeo6RnBNyT2kLD5wTIfV2oHYqH4hjiofg/rP5X3SUwnqOINzE4mM/K/UOAiNrIaKzd4w=="
-  "resolved" "https://registry.npmmirror.com/postcss-prefix-selector/download/postcss-prefix-selector-1.14.0.tgz"
-  "version" "1.14.0"
+postcss-prefix-selector@^1.6.0:
+  version "1.14.0"
+  resolved "https://registry.npmmirror.com/postcss-prefix-selector/download/postcss-prefix-selector-1.14.0.tgz"
+  integrity sha512-8d5fiBQZWMtGWH/7ewEeo6RnBNyT2kLD5wTIfV2oHYqH4hjiofg/rP5X3SUwnqOINzE4mM/K/UOAiNrIaKzd4w==
 
-"postcss@^5.2.17":
-  "integrity" "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg=="
-  "resolved" "https://registry.npmmirror.com/postcss/download/postcss-5.2.18.tgz"
-  "version" "5.2.18"
+postcss@^5.2.17:
+  version "5.2.18"
+  resolved "https://registry.npmmirror.com/postcss/download/postcss-5.2.18.tgz"
+  integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==
   dependencies:
-    "chalk" "^1.1.3"
-    "js-base64" "^2.1.9"
-    "source-map" "^0.5.6"
-    "supports-color" "^3.2.3"
+    chalk "^1.1.3"
+    js-base64 "^2.1.9"
+    source-map "^0.5.6"
+    supports-color "^3.2.3"
 
-"postcss@^8.1.10", "postcss@^8.4.5", "postcss@7.x || 8.x":
-  "integrity" "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg=="
-  "resolved" "https://registry.npmmirror.com/postcss/download/postcss-8.4.5.tgz"
-  "version" "8.4.5"
+postcss@^8.1.10, postcss@^8.4.5:
+  version "8.4.5"
+  resolved "https://registry.npmmirror.com/postcss/download/postcss-8.4.5.tgz"
+  integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==
   dependencies:
-    "nanoid" "^3.1.30"
-    "picocolors" "^1.0.0"
-    "source-map-js" "^1.0.1"
+    nanoid "^3.1.30"
+    picocolors "^1.0.0"
+    source-map-js "^1.0.1"
 
-"posthtml-parser@^0.2.0", "posthtml-parser@^0.2.1":
-  "integrity" "sha1-NdUw3jhnQMK6JP8usvrznM3ycd0="
-  "resolved" "https://registry.nlark.com/posthtml-parser/download/posthtml-parser-0.2.1.tgz"
-  "version" "0.2.1"
+posthtml-parser@^0.2.0, posthtml-parser@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.nlark.com/posthtml-parser/download/posthtml-parser-0.2.1.tgz"
+  integrity sha1-NdUw3jhnQMK6JP8usvrznM3ycd0=
   dependencies:
-    "htmlparser2" "^3.8.3"
-    "isobject" "^2.1.0"
+    htmlparser2 "^3.8.3"
+    isobject "^2.1.0"
 
-"posthtml-rename-id@^1.0":
-  "integrity" "sha1-z39us3FGvxr6wx5o8YxswZrmFDM="
-  "resolved" "https://registry.npm.taobao.org/posthtml-rename-id/download/posthtml-rename-id-1.0.12.tgz"
-  "version" "1.0.12"
+posthtml-rename-id@^1.0:
+  version "1.0.12"
+  resolved "https://registry.npm.taobao.org/posthtml-rename-id/download/posthtml-rename-id-1.0.12.tgz"
+  integrity sha1-z39us3FGvxr6wx5o8YxswZrmFDM=
   dependencies:
-    "escape-string-regexp" "1.0.5"
+    escape-string-regexp "1.0.5"
 
-"posthtml-render@^1.0.5", "posthtml-render@^1.0.6":
-  "integrity" "sha1-QBFAcMRYgcrLkzR9rj7/U6+8/xM="
-  "resolved" "https://registry.nlark.com/posthtml-render/download/posthtml-render-1.4.0.tgz"
-  "version" "1.4.0"
+posthtml-render@^1.0.5, posthtml-render@^1.0.6:
+  version "1.4.0"
+  resolved "https://registry.nlark.com/posthtml-render/download/posthtml-render-1.4.0.tgz"
+  integrity sha1-QBFAcMRYgcrLkzR9rj7/U6+8/xM=
 
-"posthtml-svg-mode@^1.0.3":
-  "integrity" "sha1-q9VU+s6BIjyrDLNn4Y5O/SpOdLA="
-  "resolved" "https://registry.npm.taobao.org/posthtml-svg-mode/download/posthtml-svg-mode-1.0.3.tgz"
-  "version" "1.0.3"
+posthtml-svg-mode@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npm.taobao.org/posthtml-svg-mode/download/posthtml-svg-mode-1.0.3.tgz"
+  integrity sha1-q9VU+s6BIjyrDLNn4Y5O/SpOdLA=
   dependencies:
-    "merge-options" "1.0.1"
-    "posthtml" "^0.9.2"
-    "posthtml-parser" "^0.2.1"
-    "posthtml-render" "^1.0.6"
+    merge-options "1.0.1"
+    posthtml "^0.9.2"
+    posthtml-parser "^0.2.1"
+    posthtml-render "^1.0.6"
 
-"posthtml@^0.9.2":
-  "integrity" "sha1-9MBtufZ7Yf0XxOJW5+PZUVv3Jv0="
-  "resolved" "https://registry.nlark.com/posthtml/download/posthtml-0.9.2.tgz?cache=0&sync_timestamp=1627459255104&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fposthtml%2Fdownload%2Fposthtml-0.9.2.tgz"
-  "version" "0.9.2"
+posthtml@^0.9.2:
+  version "0.9.2"
+  resolved "https://registry.nlark.com/posthtml/download/posthtml-0.9.2.tgz?cache=0&sync_timestamp=1627459255104&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fposthtml%2Fdownload%2Fposthtml-0.9.2.tgz"
+  integrity sha1-9MBtufZ7Yf0XxOJW5+PZUVv3Jv0=
   dependencies:
-    "posthtml-parser" "^0.2.0"
-    "posthtml-render" "^1.0.5"
+    posthtml-parser "^0.2.0"
+    posthtml-render "^1.0.5"
 
-"prelude-ls@^1.2.1":
-  "integrity" "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y="
-  "resolved" "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.2.1.tgz"
-  "version" "1.2.1"
+prelude-ls@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.2.1.tgz"
+  integrity sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=
 
-"process-nextick-args@~2.0.0":
-  "integrity" "sha1-eCDZsWEgzFXKmud5JoCufbptf+I="
-  "resolved" "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz"
-  "version" "2.0.1"
+process-nextick-args@~2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz"
+  integrity sha1-eCDZsWEgzFXKmud5JoCufbptf+I=
 
-"progress@^2.0.0":
-  "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
-  "resolved" "https://registry.npmmirror.com/progress/download/progress-2.0.3.tgz"
-  "version" "2.0.3"
+progress@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/progress/download/progress-2.0.3.tgz"
+  integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
 
-"punycode@^2.1.0":
-  "integrity" "sha1-tYsBCsQMIsVldhbI0sLALHv0eew="
-  "resolved" "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz"
-  "version" "2.1.1"
+punycode@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz"
+  integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew=
 
-"query-string@^4.3.2":
-  "integrity" "sha1-u7aTucqRXCMlFbIosaArYJBD2+s="
-  "resolved" "https://registry.npmmirror.com/query-string/download/query-string-4.3.4.tgz"
-  "version" "4.3.4"
+query-string@^4.3.2:
+  version "4.3.4"
+  resolved "https://registry.npmmirror.com/query-string/download/query-string-4.3.4.tgz"
+  integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s=
   dependencies:
-    "object-assign" "^4.1.0"
-    "strict-uri-encode" "^1.0.0"
+    object-assign "^4.1.0"
+    strict-uri-encode "^1.0.0"
 
-"query-string@^7.0.1":
-  "integrity" "sha512-wnJ8covk+S9isYR5JIXPt93kFUmI2fQ4R/8130fuq+qwLiGVTurg7Klodgfw4NSz/oe7xnyi09y3lSrogUeM3g=="
-  "resolved" "https://registry.npmmirror.com/query-string/download/query-string-7.1.0.tgz"
-  "version" "7.1.0"
+query-string@^7.0.1:
+  version "7.1.0"
+  resolved "https://registry.npmmirror.com/query-string/download/query-string-7.1.0.tgz"
+  integrity sha512-wnJ8covk+S9isYR5JIXPt93kFUmI2fQ4R/8130fuq+qwLiGVTurg7Klodgfw4NSz/oe7xnyi09y3lSrogUeM3g==
   dependencies:
-    "decode-uri-component" "^0.2.0"
-    "filter-obj" "^1.1.0"
-    "split-on-first" "^1.0.0"
-    "strict-uri-encode" "^2.0.0"
+    decode-uri-component "^0.2.0"
+    filter-obj "^1.1.0"
+    split-on-first "^1.0.0"
+    strict-uri-encode "^2.0.0"
 
-"queue-microtask@^1.2.2":
-  "integrity" "sha1-SSkii7xyTfrEPg77BYyve2z7YkM="
-  "resolved" "https://registry.npm.taobao.org/queue-microtask/download/queue-microtask-1.2.3.tgz?cache=0&sync_timestamp=1616391641179&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqueue-microtask%2Fdownload%2Fqueue-microtask-1.2.3.tgz"
-  "version" "1.2.3"
+queue-microtask@^1.2.2:
+  version "1.2.3"
+  resolved "https://registry.npm.taobao.org/queue-microtask/download/queue-microtask-1.2.3.tgz?cache=0&sync_timestamp=1616391641179&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqueue-microtask%2Fdownload%2Fqueue-microtask-1.2.3.tgz"
+  integrity sha1-SSkii7xyTfrEPg77BYyve2z7YkM=
 
-"readable-stream@^2.0.2":
-  "integrity" "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c="
-  "resolved" "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz"
-  "version" "2.3.7"
+readable-stream@^2.0.2, readable-stream@~2.3.6:
+  version "2.3.7"
+  resolved "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz"
+  integrity sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=
   dependencies:
-    "core-util-is" "~1.0.0"
-    "inherits" "~2.0.3"
-    "isarray" "~1.0.0"
-    "process-nextick-args" "~2.0.0"
-    "safe-buffer" "~5.1.1"
-    "string_decoder" "~1.1.1"
-    "util-deprecate" "~1.0.1"
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.1.1"
+    util-deprecate "~1.0.1"
 
-"readable-stream@^3.1.1":
-  "integrity" "sha1-M3u9o63AcGvT4CRCaihtS0sskZg="
-  "resolved" "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz"
-  "version" "3.6.0"
+readable-stream@^3.1.1:
+  version "3.6.0"
+  resolved "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz"
+  integrity sha1-M3u9o63AcGvT4CRCaihtS0sskZg=
   dependencies:
-    "inherits" "^2.0.3"
-    "string_decoder" "^1.1.1"
-    "util-deprecate" "^1.0.1"
+    inherits "^2.0.3"
+    string_decoder "^1.1.1"
+    util-deprecate "^1.0.1"
 
-"readable-stream@~2.3.6":
-  "integrity" "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c="
-  "resolved" "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz"
-  "version" "2.3.7"
+readdirp@~3.6.0:
+  version "3.6.0"
+  resolved "https://registry.npm.taobao.org/readdirp/download/readdirp-3.6.0.tgz?cache=0&sync_timestamp=1615717369278&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-3.6.0.tgz"
+  integrity sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=
   dependencies:
-    "core-util-is" "~1.0.0"
-    "inherits" "~2.0.3"
-    "isarray" "~1.0.0"
-    "process-nextick-args" "~2.0.0"
-    "safe-buffer" "~5.1.1"
-    "string_decoder" "~1.1.1"
-    "util-deprecate" "~1.0.1"
+    picomatch "^2.2.1"
 
-"readdirp@~3.6.0":
-  "integrity" "sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc="
-  "resolved" "https://registry.npm.taobao.org/readdirp/download/readdirp-3.6.0.tgz?cache=0&sync_timestamp=1615717369278&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-3.6.0.tgz"
-  "version" "3.6.0"
+reconnecting-websocket@^4.4.0:
+  version "4.4.0"
+  resolved "https://registry.npmmirror.com/reconnecting-websocket/download/reconnecting-websocket-4.4.0.tgz"
+  integrity sha1-Ow5blu8RnnigMTWGW4uwrxuUh4M=
+
+regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9:
+  version "0.13.9"
+  resolved "https://registry.npmmirror.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz"
+  integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz"
+  integrity sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=
   dependencies:
-    "picomatch" "^2.2.1"
+    extend-shallow "^3.0.2"
+    safe-regex "^1.1.0"
 
-"reconnecting-websocket@^4.4.0":
-  "integrity" "sha1-Ow5blu8RnnigMTWGW4uwrxuUh4M="
-  "resolved" "https://registry.npmmirror.com/reconnecting-websocket/download/reconnecting-websocket-4.4.0.tgz"
-  "version" "4.4.0"
+regexpp@^3.0.0, regexpp@^3.1.0, regexpp@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.nlark.com/regexpp/download/regexpp-3.2.0.tgz"
+  integrity sha1-BCWido2PI7rXDKS5BGH6LxIT4bI=
 
-"regenerator-runtime@^0.13.4", "regenerator-runtime@^0.13.9":
-  "integrity" "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
-  "resolved" "https://registry.npmmirror.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz"
-  "version" "0.13.9"
+repeat-element@^1.1.2:
+  version "1.1.4"
+  resolved "https://registry.nlark.com/repeat-element/download/repeat-element-1.1.4.tgz"
+  integrity sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek=
 
-"regex-not@^1.0.0", "regex-not@^1.0.2":
-  "integrity" "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw="
-  "resolved" "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz"
-  "version" "1.0.2"
+repeat-string@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz?cache=0&sync_timestamp=1589682793094&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frepeat-string%2Fdownload%2Frepeat-string-1.6.1.tgz"
+  integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+require-from-string@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npm.taobao.org/require-from-string/download/require-from-string-2.0.2.tgz"
+  integrity sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=
+
+resize-observer-polyfill@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz"
+  integrity sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ=
+
+resolve-from@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz"
+  integrity sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=
+
+resolve-url@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.npmmirror.com/resolve-url/download/resolve-url-0.2.1.tgz"
+  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@^1.10.1, resolve@^1.20.0:
+  version "1.21.0"
+  resolved "https://registry.npmmirror.com/resolve/download/resolve-1.21.0.tgz"
+  integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==
   dependencies:
-    "extend-shallow" "^3.0.2"
-    "safe-regex" "^1.1.0"
+    is-core-module "^2.8.0"
+    path-parse "^1.0.7"
+    supports-preserve-symlinks-flag "^1.0.0"
 
-"regexpp@^3.0.0", "regexpp@^3.1.0", "regexpp@^3.2.0":
-  "integrity" "sha1-BCWido2PI7rXDKS5BGH6LxIT4bI="
-  "resolved" "https://registry.nlark.com/regexpp/download/regexpp-3.2.0.tgz"
-  "version" "3.2.0"
+ret@~0.1.10:
+  version "0.1.15"
+  resolved "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz"
+  integrity sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=
 
-"repeat-element@^1.1.2":
-  "integrity" "sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek="
-  "resolved" "https://registry.nlark.com/repeat-element/download/repeat-element-1.1.4.tgz"
-  "version" "1.1.4"
+reusify@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npm.taobao.org/reusify/download/reusify-1.0.4.tgz"
+  integrity sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=
 
-"repeat-string@^1.6.1":
-  "integrity" "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
-  "resolved" "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz?cache=0&sync_timestamp=1589682793094&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frepeat-string%2Fdownload%2Frepeat-string-1.6.1.tgz"
-  "version" "1.6.1"
-
-"require-from-string@^2.0.2":
-  "integrity" "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk="
-  "resolved" "https://registry.npm.taobao.org/require-from-string/download/require-from-string-2.0.2.tgz"
-  "version" "2.0.2"
-
-"resize-observer-polyfill@^1.5.1":
-  "integrity" "sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ="
-  "resolved" "https://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz"
-  "version" "1.5.1"
-
-"resolve-from@^4.0.0":
-  "integrity" "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY="
-  "resolved" "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz"
-  "version" "4.0.0"
-
-"resolve-url@^0.2.1":
-  "integrity" "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
-  "resolved" "https://registry.npmmirror.com/resolve-url/download/resolve-url-0.2.1.tgz"
-  "version" "0.2.1"
-
-"resolve@^1.10.1", "resolve@^1.20.0":
-  "integrity" "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA=="
-  "resolved" "https://registry.npmmirror.com/resolve/download/resolve-1.21.0.tgz"
-  "version" "1.21.0"
+rimraf@2:
+  version "2.7.1"
+  resolved "https://registry.npmmirror.com/rimraf/download/rimraf-2.7.1.tgz"
+  integrity sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=
   dependencies:
-    "is-core-module" "^2.8.0"
-    "path-parse" "^1.0.7"
-    "supports-preserve-symlinks-flag" "^1.0.0"
+    glob "^7.1.3"
 
-"ret@~0.1.10":
-  "integrity" "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w="
-  "resolved" "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz"
-  "version" "0.1.15"
-
-"reusify@^1.0.4":
-  "integrity" "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY="
-  "resolved" "https://registry.npm.taobao.org/reusify/download/reusify-1.0.4.tgz"
-  "version" "1.0.4"
-
-"rimraf@^3.0.2":
-  "integrity" "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho="
-  "resolved" "https://registry.npmmirror.com/rimraf/download/rimraf-3.0.2.tgz"
-  "version" "3.0.2"
+rimraf@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/rimraf/download/rimraf-3.0.2.tgz"
+  integrity sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=
   dependencies:
-    "glob" "^7.1.3"
+    glob "^7.1.3"
 
-"rimraf@2":
-  "integrity" "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w="
-  "resolved" "https://registry.npmmirror.com/rimraf/download/rimraf-2.7.1.tgz"
-  "version" "2.7.1"
-  dependencies:
-    "glob" "^7.1.3"
-
-"rollup-plugin-external-globals@^0.6.1":
-  "integrity" "sha1-hhwmC1cnFE4P0bQksQP58Cgvw2U="
-  "resolved" "https://registry.nlark.com/rollup-plugin-external-globals/download/rollup-plugin-external-globals-0.6.1.tgz"
-  "version" "0.6.1"
+rollup-plugin-external-globals@^0.6.1:
+  version "0.6.1"
+  resolved "https://registry.nlark.com/rollup-plugin-external-globals/download/rollup-plugin-external-globals-0.6.1.tgz"
+  integrity sha1-hhwmC1cnFE4P0bQksQP58Cgvw2U=
   dependencies:
     "@rollup/pluginutils" "^4.0.0"
-    "estree-walker" "^2.0.1"
-    "is-reference" "^1.2.1"
-    "magic-string" "^0.25.7"
+    estree-walker "^2.0.1"
+    is-reference "^1.2.1"
+    magic-string "^0.25.7"
 
-"rollup@^2.25.0", "rollup@^2.47.0", "rollup@^2.59.0":
-  "integrity" "sha512-XrMKOYK7oQcTio4wyTz466mucnd8LzkiZLozZ4Rz0zQD+HeX4nUK4B8GrTX/2EvN2/vBF/i2WnaXboPxo0JylA=="
-  "resolved" "https://registry.npmmirror.com/rollup/-/rollup-2.68.0.tgz"
-  "version" "2.68.0"
+rollup@^2.47.0, rollup@^2.59.0:
+  version "2.68.0"
+  resolved "https://registry.npmmirror.com/rollup/-/rollup-2.68.0.tgz"
+  integrity sha512-XrMKOYK7oQcTio4wyTz466mucnd8LzkiZLozZ4Rz0zQD+HeX4nUK4B8GrTX/2EvN2/vBF/i2WnaXboPxo0JylA==
   optionalDependencies:
-    "fsevents" "~2.3.2"
+    fsevents "~2.3.2"
 
-"run-parallel@^1.1.9":
-  "integrity" "sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4="
-  "resolved" "https://registry.npm.taobao.org/run-parallel/download/run-parallel-1.2.0.tgz?cache=0&sync_timestamp=1612925943325&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frun-parallel%2Fdownload%2Frun-parallel-1.2.0.tgz"
-  "version" "1.2.0"
+run-parallel@^1.1.9:
+  version "1.2.0"
+  resolved "https://registry.npm.taobao.org/run-parallel/download/run-parallel-1.2.0.tgz?cache=0&sync_timestamp=1612925943325&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frun-parallel%2Fdownload%2Frun-parallel-1.2.0.tgz"
+  integrity sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=
   dependencies:
-    "queue-microtask" "^1.2.2"
+    queue-microtask "^1.2.2"
 
-"safe-buffer@~5.1.0", "safe-buffer@~5.1.1":
-  "integrity" "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
-  "resolved" "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.1.2.tgz"
-  "version" "5.1.2"
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.2"
+  resolved "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.1.2.tgz"
+  integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0=
 
-"safe-buffer@~5.2.0":
-  "integrity" "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY="
-  "resolved" "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz"
-  "version" "5.2.1"
+safe-buffer@~5.2.0:
+  version "5.2.1"
+  resolved "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz"
+  integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=
 
-"safe-regex@^1.1.0":
-  "integrity" "sha1-QKNmnzsHfR6UPURinhV91IAjvy4="
-  "resolved" "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz"
-  "version" "1.1.0"
+safe-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz"
+  integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
   dependencies:
-    "ret" "~0.1.10"
+    ret "~0.1.10"
 
-"sass@*", "sass@^1.35.1":
-  "integrity" "sha512-GtXwvwgD7/6MLUZPnlA5/8cdRgC9SzT5kAnnJMRmEZQFRE3J56Foswig4NyyyQGsnmNvg6EUM/FP0Pe9Y2zywQ=="
-  "resolved" "https://registry.npmmirror.com/sass/download/sass-1.47.0.tgz"
-  "version" "1.47.0"
+sass@^1.35.1:
+  version "1.47.0"
+  resolved "https://registry.npmmirror.com/sass/download/sass-1.47.0.tgz"
+  integrity sha512-GtXwvwgD7/6MLUZPnlA5/8cdRgC9SzT5kAnnJMRmEZQFRE3J56Foswig4NyyyQGsnmNvg6EUM/FP0Pe9Y2zywQ==
   dependencies:
-    "chokidar" ">=3.0.0 <4.0.0"
-    "immutable" "^4.0.0"
-    "source-map-js" ">=0.6.2 <2.0.0"
+    chokidar ">=3.0.0 <4.0.0"
+    immutable "^4.0.0"
+    source-map-js ">=0.6.2 <2.0.0"
 
-"scroll-into-view-if-needed@^2.2.25":
-  "integrity" "sha1-WhWy9YpSZCyIyOylhGROAXA9ZFo="
-  "resolved" "https://registry.npmmirror.com/scroll-into-view-if-needed/download/scroll-into-view-if-needed-2.2.28.tgz"
-  "version" "2.2.28"
+scroll-into-view-if-needed@^2.2.25:
+  version "2.2.28"
+  resolved "https://registry.npmmirror.com/scroll-into-view-if-needed/download/scroll-into-view-if-needed-2.2.28.tgz"
+  integrity sha1-WhWy9YpSZCyIyOylhGROAXA9ZFo=
   dependencies:
-    "compute-scroll-into-view" "^1.0.17"
+    compute-scroll-into-view "^1.0.17"
 
-"semver@^6.1.0":
-  "integrity" "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0="
-  "resolved" "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz"
-  "version" "6.3.0"
+semver@^6.1.0, semver@^6.3.0:
+  version "6.3.0"
+  resolved "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz"
+  integrity sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=
 
-"semver@^6.3.0":
-  "integrity" "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0="
-  "resolved" "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz"
-  "version" "6.3.0"
-
-"semver@^7.2.1", "semver@^7.3.5":
-  "integrity" "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc="
-  "resolved" "https://registry.npm.taobao.org/semver/download/semver-7.3.5.tgz"
-  "version" "7.3.5"
+semver@^7.2.1, semver@^7.3.5:
+  version "7.3.5"
+  resolved "https://registry.npm.taobao.org/semver/download/semver-7.3.5.tgz"
+  integrity sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=
   dependencies:
-    "lru-cache" "^6.0.0"
+    lru-cache "^6.0.0"
 
-"sentence-case@^3.0.4":
-  "integrity" "sha1-NkWnuMEXx4f96HAgViJbtipFEx8="
-  "resolved" "https://registry.npm.taobao.org/sentence-case/download/sentence-case-3.0.4.tgz?cache=0&sync_timestamp=1606867325535&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsentence-case%2Fdownload%2Fsentence-case-3.0.4.tgz"
-  "version" "3.0.4"
+sentence-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npm.taobao.org/sentence-case/download/sentence-case-3.0.4.tgz?cache=0&sync_timestamp=1606867325535&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsentence-case%2Fdownload%2Fsentence-case-3.0.4.tgz"
+  integrity sha1-NkWnuMEXx4f96HAgViJbtipFEx8=
   dependencies:
-    "no-case" "^3.0.4"
-    "tslib" "^2.0.3"
-    "upper-case-first" "^2.0.2"
+    no-case "^3.0.4"
+    tslib "^2.0.3"
+    upper-case-first "^2.0.2"
 
-"set-value@^2.0.0", "set-value@^2.0.1":
-  "integrity" "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs="
-  "resolved" "https://registry.nlark.com/set-value/download/set-value-2.0.1.tgz"
-  "version" "2.0.1"
+set-value@^2.0.0, set-value@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.nlark.com/set-value/download/set-value-2.0.1.tgz"
+  integrity sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=
   dependencies:
-    "extend-shallow" "^2.0.1"
-    "is-extendable" "^0.1.1"
-    "is-plain-object" "^2.0.3"
-    "split-string" "^3.0.1"
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.3"
+    split-string "^3.0.1"
 
-"setimmediate@~1.0.4":
-  "integrity" "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
-  "resolved" "https://registry.npmmirror.com/setimmediate/download/setimmediate-1.0.5.tgz"
-  "version" "1.0.5"
+setimmediate@~1.0.4:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/setimmediate/download/setimmediate-1.0.5.tgz"
+  integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
 
-"shallow-equal@^1.0.0":
-  "integrity" "sha1-TBar+lYEOqINBQMk76aJQLDaedo="
-  "resolved" "https://registry.npm.taobao.org/shallow-equal/download/shallow-equal-1.2.1.tgz"
-  "version" "1.2.1"
+shallow-equal@^1.0.0:
+  version "1.2.1"
+  resolved "https://registry.npm.taobao.org/shallow-equal/download/shallow-equal-1.2.1.tgz"
+  integrity sha1-TBar+lYEOqINBQMk76aJQLDaedo=
 
-"shebang-command@^2.0.0":
-  "integrity" "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo="
-  "resolved" "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz"
-  "version" "2.0.0"
+shebang-command@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz"
+  integrity sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=
   dependencies:
-    "shebang-regex" "^3.0.0"
+    shebang-regex "^3.0.0"
 
-"shebang-regex@^3.0.0":
-  "integrity" "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI="
-  "resolved" "https://registry.nlark.com/shebang-regex/download/shebang-regex-3.0.0.tgz"
-  "version" "3.0.0"
+shebang-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.nlark.com/shebang-regex/download/shebang-regex-3.0.0.tgz"
+  integrity sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=
 
-"side-channel@^1.0.4":
-  "integrity" "sha1-785cj9wQTudRslxY1CkAEfpeos8="
-  "resolved" "https://registry.npm.taobao.org/side-channel/download/side-channel-1.0.4.tgz?cache=0&sync_timestamp=1609270210432&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fside-channel%2Fdownload%2Fside-channel-1.0.4.tgz"
-  "version" "1.0.4"
+side-channel@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npm.taobao.org/side-channel/download/side-channel-1.0.4.tgz?cache=0&sync_timestamp=1609270210432&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fside-channel%2Fdownload%2Fside-channel-1.0.4.tgz"
+  integrity sha1-785cj9wQTudRslxY1CkAEfpeos8=
   dependencies:
-    "call-bind" "^1.0.0"
-    "get-intrinsic" "^1.0.2"
-    "object-inspect" "^1.9.0"
+    call-bind "^1.0.0"
+    get-intrinsic "^1.0.2"
+    object-inspect "^1.9.0"
 
-"slash@^3.0.0":
-  "integrity" "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ="
-  "resolved" "https://registry.nlark.com/slash/download/slash-3.0.0.tgz"
-  "version" "3.0.0"
+slash@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.nlark.com/slash/download/slash-3.0.0.tgz"
+  integrity sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=
 
-"slice-ansi@^4.0.0":
-  "integrity" "sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms="
-  "resolved" "https://registry.nlark.com/slice-ansi/download/slice-ansi-4.0.0.tgz"
-  "version" "4.0.0"
+slice-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.nlark.com/slice-ansi/download/slice-ansi-4.0.0.tgz"
+  integrity sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms=
   dependencies:
-    "ansi-styles" "^4.0.0"
-    "astral-regex" "^2.0.0"
-    "is-fullwidth-code-point" "^3.0.0"
+    ansi-styles "^4.0.0"
+    astral-regex "^2.0.0"
+    is-fullwidth-code-point "^3.0.0"
 
-"snake-case@^3.0.4":
-  "integrity" "sha1-Tyu9Vo6ZNavf1ZPzTGkdrbScRSw="
-  "resolved" "https://registry.npm.taobao.org/snake-case/download/snake-case-3.0.4.tgz?cache=0&sync_timestamp=1606867326057&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsnake-case%2Fdownload%2Fsnake-case-3.0.4.tgz"
-  "version" "3.0.4"
+snake-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npm.taobao.org/snake-case/download/snake-case-3.0.4.tgz?cache=0&sync_timestamp=1606867326057&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsnake-case%2Fdownload%2Fsnake-case-3.0.4.tgz"
+  integrity sha1-Tyu9Vo6ZNavf1ZPzTGkdrbScRSw=
   dependencies:
-    "dot-case" "^3.0.4"
-    "tslib" "^2.0.3"
+    dot-case "^3.0.4"
+    tslib "^2.0.3"
 
-"snapdragon-node@^2.0.1":
-  "integrity" "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs="
-  "resolved" "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz"
-  "version" "2.1.1"
+snapdragon-node@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz"
+  integrity sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=
   dependencies:
-    "define-property" "^1.0.0"
-    "isobject" "^3.0.0"
-    "snapdragon-util" "^3.0.1"
+    define-property "^1.0.0"
+    isobject "^3.0.0"
+    snapdragon-util "^3.0.1"
 
-"snapdragon-util@^3.0.1":
-  "integrity" "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI="
-  "resolved" "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz"
-  "version" "3.0.1"
+snapdragon-util@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz"
+  integrity sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=
   dependencies:
-    "kind-of" "^3.2.0"
+    kind-of "^3.2.0"
 
-"snapdragon@^0.8.1":
-  "integrity" "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0="
-  "resolved" "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz"
-  "version" "0.8.2"
+snapdragon@^0.8.1:
+  version "0.8.2"
+  resolved "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz"
+  integrity sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=
   dependencies:
-    "base" "^0.11.1"
-    "debug" "^2.2.0"
-    "define-property" "^0.2.5"
-    "extend-shallow" "^2.0.1"
-    "map-cache" "^0.2.2"
-    "source-map" "^0.5.6"
-    "source-map-resolve" "^0.5.0"
-    "use" "^3.1.0"
+    base "^0.11.1"
+    debug "^2.2.0"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    map-cache "^0.2.2"
+    source-map "^0.5.6"
+    source-map-resolve "^0.5.0"
+    use "^3.1.0"
 
-"source-map-js@^1.0.1", "source-map-js@>=0.6.2 <2.0.0":
-  "integrity" "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA=="
-  "resolved" "https://registry.npmmirror.com/source-map-js/download/source-map-js-1.0.1.tgz"
-  "version" "1.0.1"
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/source-map-js/download/source-map-js-1.0.1.tgz"
+  integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==
 
-"source-map-resolve@^0.5.0":
-  "integrity" "sha1-GQhmvs51U+H48mei7oLGBrVQmho="
-  "resolved" "https://registry.npmmirror.com/source-map-resolve/download/source-map-resolve-0.5.3.tgz"
-  "version" "0.5.3"
+source-map-resolve@^0.5.0:
+  version "0.5.3"
+  resolved "https://registry.npmmirror.com/source-map-resolve/download/source-map-resolve-0.5.3.tgz"
+  integrity sha1-GQhmvs51U+H48mei7oLGBrVQmho=
   dependencies:
-    "atob" "^2.1.2"
-    "decode-uri-component" "^0.2.0"
-    "resolve-url" "^0.2.1"
-    "source-map-url" "^0.4.0"
-    "urix" "^0.1.0"
+    atob "^2.1.2"
+    decode-uri-component "^0.2.0"
+    resolve-url "^0.2.1"
+    source-map-url "^0.4.0"
+    urix "^0.1.0"
 
-"source-map-url@^0.4.0":
-  "integrity" "sha1-CvZmBadFpaL5HPG7+KevvCg97FY="
-  "resolved" "https://registry.npmmirror.com/source-map-url/download/source-map-url-0.4.1.tgz"
-  "version" "0.4.1"
+source-map-url@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.npmmirror.com/source-map-url/download/source-map-url-0.4.1.tgz"
+  integrity sha1-CvZmBadFpaL5HPG7+KevvCg97FY=
 
-"source-map@^0.5.0":
-  "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-  "resolved" "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz"
-  "version" "0.5.7"
+source-map@0.6.1, source-map@^0.6.1:
+  version "0.6.1"
+  resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz"
+  integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM=
 
-"source-map@^0.5.6":
-  "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-  "resolved" "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz"
-  "version" "0.5.7"
+source-map@^0.5.0, source-map@^0.5.6:
+  version "0.5.7"
+  resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz"
+  integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
 
-"source-map@^0.6.1", "source-map@0.6.1":
-  "integrity" "sha1-dHIq8y6WFOnCh6jQu95IteLxomM="
-  "resolved" "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz"
-  "version" "0.6.1"
+sourcemap-codec@^1.4.4:
+  version "1.4.8"
+  resolved "https://registry.npm.taobao.org/sourcemap-codec/download/sourcemap-codec-1.4.8.tgz"
+  integrity sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=
 
-"sourcemap-codec@^1.4.4":
-  "integrity" "sha1-6oBL2UhXQC5pktBaOO8a41qatMQ="
-  "resolved" "https://registry.npm.taobao.org/sourcemap-codec/download/sourcemap-codec-1.4.8.tgz"
-  "version" "1.4.8"
+split-on-first@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npm.taobao.org/split-on-first/download/split-on-first-1.1.0.tgz?cache=0&sync_timestamp=1618467042029&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsplit-on-first%2Fdownload%2Fsplit-on-first-1.1.0.tgz"
+  integrity sha1-9hCv7uOxK84dDDBCXnY5i3gkml8=
 
-"split-on-first@^1.0.0":
-  "integrity" "sha1-9hCv7uOxK84dDDBCXnY5i3gkml8="
-  "resolved" "https://registry.npm.taobao.org/split-on-first/download/split-on-first-1.1.0.tgz?cache=0&sync_timestamp=1618467042029&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsplit-on-first%2Fdownload%2Fsplit-on-first-1.1.0.tgz"
-  "version" "1.1.0"
-
-"split-string@^3.0.1", "split-string@^3.0.2":
-  "integrity" "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I="
-  "resolved" "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz"
-  "version" "3.1.0"
+split-string@^3.0.1, split-string@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz"
+  integrity sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=
   dependencies:
-    "extend-shallow" "^3.0.0"
+    extend-shallow "^3.0.0"
 
-"sprintf-js@~1.0.2":
-  "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
-  "resolved" "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz"
-  "version" "1.0.3"
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz"
+  integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
 
-"stable@^0.1.8":
-  "integrity" "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88="
-  "resolved" "https://registry.npmmirror.com/stable/download/stable-0.1.8.tgz"
-  "version" "0.1.8"
+stable@^0.1.8:
+  version "0.1.8"
+  resolved "https://registry.npmmirror.com/stable/download/stable-0.1.8.tgz"
+  integrity sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=
 
-"static-extend@^0.1.1":
-  "integrity" "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY="
-  "resolved" "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz"
-  "version" "0.1.2"
+static-extend@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz"
+  integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
   dependencies:
-    "define-property" "^0.2.5"
-    "object-copy" "^0.1.0"
+    define-property "^0.2.5"
+    object-copy "^0.1.0"
 
-"strict-uri-encode@^1.0.0":
-  "integrity" "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
-  "resolved" "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz"
-  "version" "1.1.0"
+strict-uri-encode@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz"
+  integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
 
-"strict-uri-encode@^2.0.0":
-  "integrity" "sha1-ucczDHBChi9rFC3CdLvMWGbONUY="
-  "resolved" "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-2.0.0.tgz"
-  "version" "2.0.0"
+strict-uri-encode@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-2.0.0.tgz"
+  integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
 
-"string_decoder@^1.1.1":
-  "integrity" "sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4="
-  "resolved" "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.3.0.tgz"
-  "version" "1.3.0"
+string-width@^4.2.3:
+  version "4.2.3"
+  resolved "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz"
+  integrity sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=
   dependencies:
-    "safe-buffer" "~5.2.0"
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.1"
 
-"string_decoder@~1.1.1":
-  "integrity" "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g="
-  "resolved" "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz"
-  "version" "1.1.1"
+string.prototype.trimend@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npm.taobao.org/string.prototype.trimend/download/string.prototype.trimend-1.0.4.tgz"
+  integrity sha1-51rpDClCxjUEaGwYsoe0oLGkX4A=
   dependencies:
-    "safe-buffer" "~5.1.0"
+    call-bind "^1.0.2"
+    define-properties "^1.1.3"
 
-"string-width@^4.2.3":
-  "integrity" "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA="
-  "resolved" "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz"
-  "version" "4.2.3"
+string.prototype.trimstart@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npm.taobao.org/string.prototype.trimstart/download/string.prototype.trimstart-1.0.4.tgz?cache=0&sync_timestamp=1614127357785&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimstart%2Fdownload%2Fstring.prototype.trimstart-1.0.4.tgz"
+  integrity sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0=
   dependencies:
-    "emoji-regex" "^8.0.0"
-    "is-fullwidth-code-point" "^3.0.0"
-    "strip-ansi" "^6.0.1"
+    call-bind "^1.0.2"
+    define-properties "^1.1.3"
 
-"string.prototype.trimend@^1.0.4":
-  "integrity" "sha1-51rpDClCxjUEaGwYsoe0oLGkX4A="
-  "resolved" "https://registry.npm.taobao.org/string.prototype.trimend/download/string.prototype.trimend-1.0.4.tgz"
-  "version" "1.0.4"
+string_decoder@^1.1.1:
+  version "1.3.0"
+  resolved "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.3.0.tgz"
+  integrity sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4=
   dependencies:
-    "call-bind" "^1.0.2"
-    "define-properties" "^1.1.3"
+    safe-buffer "~5.2.0"
 
-"string.prototype.trimstart@^1.0.4":
-  "integrity" "sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0="
-  "resolved" "https://registry.npm.taobao.org/string.prototype.trimstart/download/string.prototype.trimstart-1.0.4.tgz?cache=0&sync_timestamp=1614127357785&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimstart%2Fdownload%2Fstring.prototype.trimstart-1.0.4.tgz"
-  "version" "1.0.4"
+string_decoder@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz"
+  integrity sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=
   dependencies:
-    "call-bind" "^1.0.2"
-    "define-properties" "^1.1.3"
+    safe-buffer "~5.1.0"
 
-"strip-ansi@^3.0.0":
-  "integrity" "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8="
-  "resolved" "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-3.0.1.tgz"
-  "version" "3.0.1"
+strip-ansi@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-3.0.1.tgz"
+  integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
   dependencies:
-    "ansi-regex" "^2.0.0"
+    ansi-regex "^2.0.0"
 
-"strip-ansi@^6.0.0", "strip-ansi@^6.0.1":
-  "integrity" "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk="
-  "resolved" "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz"
-  "version" "6.0.1"
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz"
+  integrity sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=
   dependencies:
-    "ansi-regex" "^5.0.1"
+    ansi-regex "^5.0.1"
 
-"strip-bom@^3.0.0":
-  "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
-  "resolved" "https://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz?cache=0&sync_timestamp=1618599587805&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-bom%2Fdownload%2Fstrip-bom-3.0.0.tgz"
-  "version" "3.0.0"
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz?cache=0&sync_timestamp=1618599587805&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-bom%2Fdownload%2Fstrip-bom-3.0.0.tgz"
+  integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
 
-"strip-json-comments@^3.1.0", "strip-json-comments@^3.1.1":
-  "integrity" "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY="
-  "resolved" "https://registry.nlark.com/strip-json-comments/download/strip-json-comments-3.1.1.tgz"
-  "version" "3.1.1"
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.nlark.com/strip-json-comments/download/strip-json-comments-3.1.1.tgz"
+  integrity sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=
 
-"supports-color@^2.0.0":
-  "integrity" "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
-  "resolved" "https://registry.npmmirror.com/supports-color/download/supports-color-2.0.0.tgz"
-  "version" "2.0.0"
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/supports-color/download/supports-color-2.0.0.tgz"
+  integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
 
-"supports-color@^3.2.3":
-  "integrity" "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY="
-  "resolved" "https://registry.npmmirror.com/supports-color/download/supports-color-3.2.3.tgz"
-  "version" "3.2.3"
+supports-color@^3.2.3:
+  version "3.2.3"
+  resolved "https://registry.npmmirror.com/supports-color/download/supports-color-3.2.3.tgz"
+  integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
   dependencies:
-    "has-flag" "^1.0.0"
+    has-flag "^1.0.0"
 
-"supports-color@^5.3.0":
-  "integrity" "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8="
-  "resolved" "https://registry.npmmirror.com/supports-color/download/supports-color-5.5.0.tgz"
-  "version" "5.5.0"
+supports-color@^5.3.0:
+  version "5.5.0"
+  resolved "https://registry.npmmirror.com/supports-color/download/supports-color-5.5.0.tgz"
+  integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=
   dependencies:
-    "has-flag" "^3.0.0"
+    has-flag "^3.0.0"
 
-"supports-color@^7.1.0":
-  "integrity" "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo="
-  "resolved" "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz"
-  "version" "7.2.0"
+supports-color@^7.1.0:
+  version "7.2.0"
+  resolved "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz"
+  integrity sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=
   dependencies:
-    "has-flag" "^4.0.0"
+    has-flag "^4.0.0"
 
-"supports-preserve-symlinks-flag@^1.0.0":
-  "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
-  "resolved" "https://registry.npmmirror.com/supports-preserve-symlinks-flag/download/supports-preserve-symlinks-flag-1.0.0.tgz"
-  "version" "1.0.0"
+supports-preserve-symlinks-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/download/supports-preserve-symlinks-flag-1.0.0.tgz"
+  integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
 
-"svg-baker@1.7.0":
-  "integrity" "sha1-g2f3jYdVUMUv5HVvcwPVxdfC6ac="
-  "resolved" "https://registry.npm.taobao.org/svg-baker/download/svg-baker-1.7.0.tgz"
-  "version" "1.7.0"
+svg-baker@1.7.0:
+  version "1.7.0"
+  resolved "https://registry.npm.taobao.org/svg-baker/download/svg-baker-1.7.0.tgz"
+  integrity sha1-g2f3jYdVUMUv5HVvcwPVxdfC6ac=
   dependencies:
-    "bluebird" "^3.5.0"
-    "clone" "^2.1.1"
-    "he" "^1.1.1"
-    "image-size" "^0.5.1"
-    "loader-utils" "^1.1.0"
-    "merge-options" "1.0.1"
-    "micromatch" "3.1.0"
-    "postcss" "^5.2.17"
-    "postcss-prefix-selector" "^1.6.0"
-    "posthtml-rename-id" "^1.0"
-    "posthtml-svg-mode" "^1.0.3"
-    "query-string" "^4.3.2"
-    "traverse" "^0.6.6"
+    bluebird "^3.5.0"
+    clone "^2.1.1"
+    he "^1.1.1"
+    image-size "^0.5.1"
+    loader-utils "^1.1.0"
+    merge-options "1.0.1"
+    micromatch "3.1.0"
+    postcss "^5.2.17"
+    postcss-prefix-selector "^1.6.0"
+    posthtml-rename-id "^1.0"
+    posthtml-svg-mode "^1.0.3"
+    query-string "^4.3.2"
+    traverse "^0.6.6"
 
-"svgo@^2.8.0":
-  "integrity" "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg=="
-  "resolved" "https://registry.npmmirror.com/svgo/download/svgo-2.8.0.tgz"
-  "version" "2.8.0"
+svgo@^2.8.0:
+  version "2.8.0"
+  resolved "https://registry.npmmirror.com/svgo/download/svgo-2.8.0.tgz"
+  integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==
   dependencies:
     "@trysound/sax" "0.2.0"
-    "commander" "^7.2.0"
-    "css-select" "^4.1.3"
-    "css-tree" "^1.1.3"
-    "csso" "^4.2.0"
-    "picocolors" "^1.0.0"
-    "stable" "^0.1.8"
+    commander "^7.2.0"
+    css-select "^4.1.3"
+    css-tree "^1.1.3"
+    csso "^4.2.0"
+    picocolors "^1.0.0"
+    stable "^0.1.8"
 
-"systemjs@^6.11.0":
-  "integrity" "sha512-7YPIY44j+BoY+E6cGBSw0oCU8SNTTIHKZgftcBdwWkDzs/M86Fdlr21FrzAyph7Zo8r3CFGscyFe4rrBtixrBg=="
-  "resolved" "https://registry.npmmirror.com/systemjs/download/systemjs-6.11.0.tgz"
-  "version" "6.11.0"
+systemjs@^6.11.0:
+  version "6.11.0"
+  resolved "https://registry.npmmirror.com/systemjs/download/systemjs-6.11.0.tgz"
+  integrity sha512-7YPIY44j+BoY+E6cGBSw0oCU8SNTTIHKZgftcBdwWkDzs/M86Fdlr21FrzAyph7Zo8r3CFGscyFe4rrBtixrBg==
 
-"table@^6.0.9":
-  "integrity" "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA=="
-  "resolved" "https://registry.npmmirror.com/table/download/table-6.8.0.tgz"
-  "version" "6.8.0"
+table@^6.0.9:
+  version "6.8.0"
+  resolved "https://registry.npmmirror.com/table/download/table-6.8.0.tgz"
+  integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==
   dependencies:
-    "ajv" "^8.0.1"
-    "lodash.truncate" "^4.4.2"
-    "slice-ansi" "^4.0.0"
-    "string-width" "^4.2.3"
-    "strip-ansi" "^6.0.1"
+    ajv "^8.0.1"
+    lodash.truncate "^4.4.2"
+    slice-ansi "^4.0.0"
+    string-width "^4.2.3"
+    strip-ansi "^6.0.1"
 
-"text-table@^0.2.0":
-  "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
-  "resolved" "https://registry.nlark.com/text-table/download/text-table-0.2.0.tgz"
-  "version" "0.2.0"
+text-table@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.nlark.com/text-table/download/text-table-0.2.0.tgz"
+  integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
 
-"to-fast-properties@^2.0.0":
-  "integrity" "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
-  "resolved" "https://registry.nlark.com/to-fast-properties/download/to-fast-properties-2.0.0.tgz?cache=0&sync_timestamp=1628418893613&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fto-fast-properties%2Fdownload%2Fto-fast-properties-2.0.0.tgz"
-  "version" "2.0.0"
+to-fast-properties@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.nlark.com/to-fast-properties/download/to-fast-properties-2.0.0.tgz?cache=0&sync_timestamp=1628418893613&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fto-fast-properties%2Fdownload%2Fto-fast-properties-2.0.0.tgz"
+  integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
 
-"to-object-path@^0.3.0":
-  "integrity" "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68="
-  "resolved" "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz"
-  "version" "0.3.0"
+to-object-path@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz"
+  integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
   dependencies:
-    "kind-of" "^3.0.2"
+    kind-of "^3.0.2"
 
-"to-regex-range@^2.1.0":
-  "integrity" "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg="
-  "resolved" "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz"
-  "version" "2.1.1"
+to-regex-range@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz"
+  integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
   dependencies:
-    "is-number" "^3.0.0"
-    "repeat-string" "^1.6.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
 
-"to-regex-range@^5.0.1":
-  "integrity" "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ="
-  "resolved" "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz"
-  "version" "5.0.1"
+to-regex-range@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz"
+  integrity sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=
   dependencies:
-    "is-number" "^7.0.0"
+    is-number "^7.0.0"
 
-"to-regex@^3.0.1":
-  "integrity" "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4="
-  "resolved" "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz"
-  "version" "3.0.2"
+to-regex@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz"
+  integrity sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=
   dependencies:
-    "define-property" "^2.0.2"
-    "extend-shallow" "^3.0.2"
-    "regex-not" "^1.0.2"
-    "safe-regex" "^1.1.0"
-
-"traverse@^0.6.6":
-  "integrity" "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc="
-  "resolved" "https://registry.npm.taobao.org/traverse/download/traverse-0.6.6.tgz"
-  "version" "0.6.6"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    regex-not "^1.0.2"
+    safe-regex "^1.1.0"
 
 "traverse@>=0.3.0 <0.4":
-  "integrity" "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk="
-  "resolved" "https://registry.npm.taobao.org/traverse/download/traverse-0.3.9.tgz"
-  "version" "0.3.9"
+  version "0.3.9"
+  resolved "https://registry.npm.taobao.org/traverse/download/traverse-0.3.9.tgz"
+  integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=
 
-"tsconfig-paths@^3.12.0":
-  "integrity" "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg=="
-  "resolved" "https://registry.npmmirror.com/tsconfig-paths/download/tsconfig-paths-3.12.0.tgz"
-  "version" "3.12.0"
+traverse@^0.6.6:
+  version "0.6.6"
+  resolved "https://registry.npm.taobao.org/traverse/download/traverse-0.6.6.tgz"
+  integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=
+
+tsconfig-paths@^3.12.0:
+  version "3.12.0"
+  resolved "https://registry.npmmirror.com/tsconfig-paths/download/tsconfig-paths-3.12.0.tgz"
+  integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==
   dependencies:
     "@types/json5" "^0.0.29"
-    "json5" "^1.0.1"
-    "minimist" "^1.2.0"
-    "strip-bom" "^3.0.0"
+    json5 "^1.0.1"
+    minimist "^1.2.0"
+    strip-bom "^3.0.0"
 
-"tslib@^1.8.1":
-  "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-  "resolved" "https://registry.npmmirror.com/tslib/download/tslib-1.14.1.tgz"
-  "version" "1.14.1"
+tslib@^1.8.1:
+  version "1.14.1"
+  resolved "https://registry.npmmirror.com/tslib/download/tslib-1.14.1.tgz"
+  integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
 
-"tslib@^2.0.3":
-  "integrity" "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
-  "resolved" "https://registry.npmmirror.com/tslib/download/tslib-2.3.1.tgz"
-  "version" "2.3.1"
+tslib@^2.0.3:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/tslib/download/tslib-2.3.1.tgz"
+  integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
 
-"tsutils@^3.21.0":
-  "integrity" "sha1-tIcX05TOpsHglpg+7Vjp1hcVtiM="
-  "resolved" "https://registry.npm.taobao.org/tsutils/download/tsutils-3.21.0.tgz?cache=0&sync_timestamp=1615138184534&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftsutils%2Fdownload%2Ftsutils-3.21.0.tgz"
-  "version" "3.21.0"
+tsutils@^3.21.0:
+  version "3.21.0"
+  resolved "https://registry.npm.taobao.org/tsutils/download/tsutils-3.21.0.tgz?cache=0&sync_timestamp=1615138184534&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftsutils%2Fdownload%2Ftsutils-3.21.0.tgz"
+  integrity sha1-tIcX05TOpsHglpg+7Vjp1hcVtiM=
   dependencies:
-    "tslib" "^1.8.1"
+    tslib "^1.8.1"
 
-"type-check@^0.4.0", "type-check@~0.4.0":
-  "integrity" "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE="
-  "resolved" "https://registry.npm.taobao.org/type-check/download/type-check-0.4.0.tgz"
-  "version" "0.4.0"
+type-check@^0.4.0, type-check@~0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npm.taobao.org/type-check/download/type-check-0.4.0.tgz"
+  integrity sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=
   dependencies:
-    "prelude-ls" "^1.2.1"
+    prelude-ls "^1.2.1"
 
-"type-fest@^0.20.2":
-  "integrity" "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ="
-  "resolved" "https://registry.npmmirror.com/type-fest/download/type-fest-0.20.2.tgz"
-  "version" "0.20.2"
+type-fest@^0.20.2:
+  version "0.20.2"
+  resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.20.2.tgz"
+  integrity sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=
 
-"typescript@^4.5.4", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta":
-  "integrity" "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg=="
-  "resolved" "https://registry.npmmirror.com/typescript/download/typescript-4.5.4.tgz"
-  "version" "4.5.4"
+typescript@^4.5.4:
+  version "4.5.4"
+  resolved "https://registry.npmmirror.com/typescript/download/typescript-4.5.4.tgz"
+  integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==
 
-"unbox-primitive@^1.0.1":
-  "integrity" "sha1-CF4hViXsMWJXTciFmr7nilmxRHE="
-  "resolved" "https://registry.npm.taobao.org/unbox-primitive/download/unbox-primitive-1.0.1.tgz?cache=0&sync_timestamp=1616706302651&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funbox-primitive%2Fdownload%2Funbox-primitive-1.0.1.tgz"
-  "version" "1.0.1"
+unbox-primitive@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npm.taobao.org/unbox-primitive/download/unbox-primitive-1.0.1.tgz?cache=0&sync_timestamp=1616706302651&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funbox-primitive%2Fdownload%2Funbox-primitive-1.0.1.tgz"
+  integrity sha1-CF4hViXsMWJXTciFmr7nilmxRHE=
   dependencies:
-    "function-bind" "^1.1.1"
-    "has-bigints" "^1.0.1"
-    "has-symbols" "^1.0.2"
-    "which-boxed-primitive" "^1.0.2"
+    function-bind "^1.1.1"
+    has-bigints "^1.0.1"
+    has-symbols "^1.0.2"
+    which-boxed-primitive "^1.0.2"
 
-"union-value@^1.0.0":
-  "integrity" "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc="
-  "resolved" "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz"
-  "version" "1.0.1"
+union-value@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz"
+  integrity sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=
   dependencies:
-    "arr-union" "^3.1.0"
-    "get-value" "^2.0.6"
-    "is-extendable" "^0.1.1"
-    "set-value" "^2.0.1"
+    arr-union "^3.1.0"
+    get-value "^2.0.6"
+    is-extendable "^0.1.1"
+    set-value "^2.0.1"
 
-"universalify@^2.0.0":
-  "integrity" "sha1-daSYTv7cSwiXXFrrc/Uw0C3yVxc="
-  "resolved" "https://registry.npm.taobao.org/universalify/download/universalify-2.0.0.tgz?cache=0&sync_timestamp=1603179967633&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-2.0.0.tgz"
-  "version" "2.0.0"
+universalify@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npm.taobao.org/universalify/download/universalify-2.0.0.tgz?cache=0&sync_timestamp=1603179967633&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-2.0.0.tgz"
+  integrity sha1-daSYTv7cSwiXXFrrc/Uw0C3yVxc=
 
-"unset-value@^1.0.0":
-  "integrity" "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk="
-  "resolved" "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz"
-  "version" "1.0.0"
+unset-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz"
+  integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
   dependencies:
-    "has-value" "^0.3.1"
-    "isobject" "^3.0.0"
+    has-value "^0.3.1"
+    isobject "^3.0.0"
 
-"unzipper@0.10.11":
-  "integrity" "sha1-C0mRRGRyy9uS7nQDkJ8mwkGceC4="
-  "resolved" "https://registry.npm.taobao.org/unzipper/download/unzipper-0.10.11.tgz"
-  "version" "0.10.11"
+unzipper@0.10.11:
+  version "0.10.11"
+  resolved "https://registry.npm.taobao.org/unzipper/download/unzipper-0.10.11.tgz"
+  integrity sha1-C0mRRGRyy9uS7nQDkJ8mwkGceC4=
   dependencies:
-    "big-integer" "^1.6.17"
-    "binary" "~0.3.0"
-    "bluebird" "~3.4.1"
-    "buffer-indexof-polyfill" "~1.0.0"
-    "duplexer2" "~0.1.4"
-    "fstream" "^1.0.12"
-    "graceful-fs" "^4.2.2"
-    "listenercount" "~1.0.1"
-    "readable-stream" "~2.3.6"
-    "setimmediate" "~1.0.4"
+    big-integer "^1.6.17"
+    binary "~0.3.0"
+    bluebird "~3.4.1"
+    buffer-indexof-polyfill "~1.0.0"
+    duplexer2 "~0.1.4"
+    fstream "^1.0.12"
+    graceful-fs "^4.2.2"
+    listenercount "~1.0.1"
+    readable-stream "~2.3.6"
+    setimmediate "~1.0.4"
 
-"upper-case-first@^2.0.2":
-  "integrity" "sha1-mSwyc/iCq9GdHgKJTMFHEX+EQyQ="
-  "resolved" "https://registry.npm.taobao.org/upper-case-first/download/upper-case-first-2.0.2.tgz?cache=0&sync_timestamp=1606867326586&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupper-case-first%2Fdownload%2Fupper-case-first-2.0.2.tgz"
-  "version" "2.0.2"
+upper-case-first@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npm.taobao.org/upper-case-first/download/upper-case-first-2.0.2.tgz?cache=0&sync_timestamp=1606867326586&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupper-case-first%2Fdownload%2Fupper-case-first-2.0.2.tgz"
+  integrity sha1-mSwyc/iCq9GdHgKJTMFHEX+EQyQ=
   dependencies:
-    "tslib" "^2.0.3"
+    tslib "^2.0.3"
 
-"upper-case@^2.0.2":
-  "integrity" "sha1-2JgQgj+qsd8VSbfZenb4Ziuub3o="
-  "resolved" "https://registry.npm.taobao.org/upper-case/download/upper-case-2.0.2.tgz"
-  "version" "2.0.2"
+upper-case@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npm.taobao.org/upper-case/download/upper-case-2.0.2.tgz"
+  integrity sha1-2JgQgj+qsd8VSbfZenb4Ziuub3o=
   dependencies:
-    "tslib" "^2.0.3"
+    tslib "^2.0.3"
 
-"uri-js@^4.2.2":
-  "integrity" "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34="
-  "resolved" "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.1.tgz?cache=0&sync_timestamp=1610237624359&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.1.tgz"
-  "version" "4.4.1"
+uri-js@^4.2.2:
+  version "4.4.1"
+  resolved "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.1.tgz?cache=0&sync_timestamp=1610237624359&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.1.tgz"
+  integrity sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=
   dependencies:
-    "punycode" "^2.1.0"
+    punycode "^2.1.0"
 
-"urix@^0.1.0":
-  "integrity" "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
-  "resolved" "https://registry.npmmirror.com/urix/download/urix-0.1.0.tgz"
-  "version" "0.1.0"
+urix@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/urix/download/urix-0.1.0.tgz"
+  integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
 
-"use@^3.1.0":
-  "integrity" "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8="
-  "resolved" "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz"
-  "version" "3.1.1"
+use@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz"
+  integrity sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=
 
-"util-deprecate@^1.0.1", "util-deprecate@~1.0.1":
-  "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-  "resolved" "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz"
-  "version" "1.0.2"
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz"
+  integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
 
-"v8-compile-cache@^2.0.3":
-  "integrity" "sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4="
-  "resolved" "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.3.0.tgz?cache=0&sync_timestamp=1614993994061&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fv8-compile-cache%2Fdownload%2Fv8-compile-cache-2.3.0.tgz"
-  "version" "2.3.0"
+v8-compile-cache@^2.0.3:
+  version "2.3.0"
+  resolved "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.3.0.tgz?cache=0&sync_timestamp=1614993994061&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fv8-compile-cache%2Fdownload%2Fv8-compile-cache-2.3.0.tgz"
+  integrity sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4=
 
-"vary@^1":
-  "integrity" "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
-  "resolved" "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz"
-  "version" "1.1.2"
+vary@^1:
+  version "1.1.2"
+  resolved "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz"
+  integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
 
-"vconsole@^3.8.1":
-  "integrity" "sha512-DZ6WrSy+5ep11FWxq89DHv8we83rCCrGZaZqlHEXZ+wCvivFd6kfo8OizIP5iQZ0Ynf8Qxj3UfnilFp4HtTVcA=="
-  "resolved" "https://registry.npmmirror.com/vconsole/download/vconsole-3.11.0.tgz"
-  "version" "3.11.0"
+vconsole@^3.8.1:
+  version "3.11.0"
+  resolved "https://registry.npmmirror.com/vconsole/download/vconsole-3.11.0.tgz"
+  integrity sha512-DZ6WrSy+5ep11FWxq89DHv8we83rCCrGZaZqlHEXZ+wCvivFd6kfo8OizIP5iQZ0Ynf8Qxj3UfnilFp4HtTVcA==
   dependencies:
-    "cookie-storage" "^6.1.0"
-    "copy-text-to-clipboard" "^3.0.1"
-    "core-js" "^3.11.0"
-    "mutation-observer" "^1.0.3"
+    cookie-storage "^6.1.0"
+    copy-text-to-clipboard "^3.0.1"
+    core-js "^3.11.0"
+    mutation-observer "^1.0.3"
 
-"vite-plugin-components@^0.13.3":
-  "integrity" "sha1-i9oPUI7pAkmgZrpj1ZhXmOXKn+0="
-  "resolved" "https://registry.nlark.com/vite-plugin-components/download/vite-plugin-components-0.13.3.tgz"
-  "version" "0.13.3"
+vite-plugin-components@^0.13.3:
+  version "0.13.3"
+  resolved "https://registry.nlark.com/vite-plugin-components/download/vite-plugin-components-0.13.3.tgz"
+  integrity sha1-i9oPUI7pAkmgZrpj1ZhXmOXKn+0=
   dependencies:
-    "debug" "^4.3.2"
-    "fast-glob" "^3.2.7"
-    "magic-string" "^0.25.7"
-    "minimatch" "^3.0.4"
+    debug "^4.3.2"
+    fast-glob "^3.2.7"
+    magic-string "^0.25.7"
+    minimatch "^3.0.4"
 
-"vite-plugin-eslint@^1.3.0":
-  "integrity" "sha1-y8PxVCyl6Q1ZLM+2tJV+m2P5mg4="
-  "resolved" "https://registry.nlark.com/vite-plugin-eslint/download/vite-plugin-eslint-1.3.0.tgz"
-  "version" "1.3.0"
+vite-plugin-eslint@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.nlark.com/vite-plugin-eslint/download/vite-plugin-eslint-1.3.0.tgz"
+  integrity sha1-y8PxVCyl6Q1ZLM+2tJV+m2P5mg4=
   dependencies:
     "@rollup/pluginutils" "^4.1.0"
-    "eslint" "^7.26.0"
-    "rollup" "^2.47.0"
+    eslint "^7.26.0"
+    rollup "^2.47.0"
 
-"vite-plugin-importer@^0.2.5":
-  "integrity" "sha1-I2PcDZfU7OxTDuQBcTEKF8LbB34="
-  "resolved" "https://registry.npmmirror.com/vite-plugin-importer/download/vite-plugin-importer-0.2.5.tgz"
-  "version" "0.2.5"
+vite-plugin-importer@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.npmmirror.com/vite-plugin-importer/download/vite-plugin-importer-0.2.5.tgz"
+  integrity sha1-I2PcDZfU7OxTDuQBcTEKF8LbB34=
   dependencies:
     "@babel/core" "^7.12.17"
     "@babel/plugin-syntax-import-meta" "^7.10.4"
-    "babel-plugin-import" "^1.13.3"
+    babel-plugin-import "^1.13.3"
 
-"vite-plugin-optimize-persist@^0.1.2":
-  "integrity" "sha512-H/Ebn2kZO8PvwUF08SsT5K5xMJNCWKoGX71+e9/ER3yNj7GHiFjNQlvGg5ih/zEx09MZ9m7WCxOwmEKbeIVzww=="
-  "resolved" "https://registry.npmmirror.com/vite-plugin-optimize-persist/download/vite-plugin-optimize-persist-0.1.2.tgz"
-  "version" "0.1.2"
+vite-plugin-optimize-persist@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.npmmirror.com/vite-plugin-optimize-persist/download/vite-plugin-optimize-persist-0.1.2.tgz"
+  integrity sha512-H/Ebn2kZO8PvwUF08SsT5K5xMJNCWKoGX71+e9/ER3yNj7GHiFjNQlvGg5ih/zEx09MZ9m7WCxOwmEKbeIVzww==
   dependencies:
-    "debug" "^4.3.2"
-    "fs-extra" "^10.0.0"
+    debug "^4.3.2"
+    fs-extra "^10.0.0"
 
-"vite-plugin-package-config@^0.1.0", "vite-plugin-package-config@^0.1.1":
-  "integrity" "sha512-w9B3I8ZnqoyhlbzimXjXNk85imrMZgvI9m8f6j3zonK5IVA5KXzpT+PZOHlDz8lqh1vqvoEI1uhy+ZDoLAiA/w=="
-  "resolved" "https://registry.npmmirror.com/vite-plugin-package-config/download/vite-plugin-package-config-0.1.1.tgz"
-  "version" "0.1.1"
+vite-plugin-package-config@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/vite-plugin-package-config/download/vite-plugin-package-config-0.1.1.tgz"
+  integrity sha512-w9B3I8ZnqoyhlbzimXjXNk85imrMZgvI9m8f6j3zonK5IVA5KXzpT+PZOHlDz8lqh1vqvoEI1uhy+ZDoLAiA/w==
   dependencies:
-    "debug" "^4.3.3"
+    debug "^4.3.3"
 
-"vite-plugin-style-import@^1.0.1":
-  "integrity" "sha512-lJCRvm7+So0hHdnSJiJPg9gD5mxtL6YY0jmhEph+k7ArpsyvqOh6han2kG5htbWWDZxHkUN9d1BuTFL//yCLLQ=="
-  "resolved" "https://registry.npmmirror.com/vite-plugin-style-import/download/vite-plugin-style-import-1.4.1.tgz"
-  "version" "1.4.1"
+vite-plugin-style-import@^1.0.1:
+  version "1.4.1"
+  resolved "https://registry.npmmirror.com/vite-plugin-style-import/download/vite-plugin-style-import-1.4.1.tgz"
+  integrity sha512-lJCRvm7+So0hHdnSJiJPg9gD5mxtL6YY0jmhEph+k7ArpsyvqOh6han2kG5htbWWDZxHkUN9d1BuTFL//yCLLQ==
   dependencies:
     "@rollup/pluginutils" "^4.1.2"
-    "change-case" "^4.1.2"
-    "debug" "^4.3.3"
-    "es-module-lexer" "^0.9.3"
-    "fs-extra" "^10.0.0"
-    "magic-string" "^0.25.7"
+    change-case "^4.1.2"
+    debug "^4.3.3"
+    es-module-lexer "^0.9.3"
+    fs-extra "^10.0.0"
+    magic-string "^0.25.7"
 
-"vite-plugin-svg-icons@^1.0.5":
-  "integrity" "sha512-dmpr7Wq8vQN6ajBrVTrBxy8wJjQfcP30i73q+40uAZc8p7EwphBNZ+bVTI0enFaCrsITI8y0Ruo/mN/SaJQ6Hw=="
-  "resolved" "https://registry.npmmirror.com/vite-plugin-svg-icons/download/vite-plugin-svg-icons-1.1.0.tgz"
-  "version" "1.1.0"
+vite-plugin-svg-icons@^1.0.5:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/vite-plugin-svg-icons/download/vite-plugin-svg-icons-1.1.0.tgz"
+  integrity sha512-dmpr7Wq8vQN6ajBrVTrBxy8wJjQfcP30i73q+40uAZc8p7EwphBNZ+bVTI0enFaCrsITI8y0Ruo/mN/SaJQ6Hw==
   dependencies:
     "@types/svgo" "^2.6.0"
-    "cors" "^2.8.5"
-    "debug" "^4.3.3"
-    "etag" "^1.8.1"
-    "fs-extra" "^10.0.0"
-    "svg-baker" "1.7.0"
-    "svgo" "^2.8.0"
+    cors "^2.8.5"
+    debug "^4.3.3"
+    etag "^1.8.1"
+    fs-extra "^10.0.0"
+    svg-baker "1.7.0"
+    svgo "^2.8.0"
 
-"vite-plugin-vconsole@^1.1.0":
-  "integrity" "sha512-8oODvR4inPCVbfeWkxmV++sP6qypH7DfxBAzCT3Erm7XnoK8aTuRls30wXlXL6LDB6e090vTELOYyreGe7OOLA=="
-  "resolved" "https://registry.npmmirror.com/vite-plugin-vconsole/download/vite-plugin-vconsole-1.1.1.tgz"
-  "version" "1.1.1"
+vite-plugin-vconsole@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/vite-plugin-vconsole/download/vite-plugin-vconsole-1.1.1.tgz"
+  integrity sha512-8oODvR4inPCVbfeWkxmV++sP6qypH7DfxBAzCT3Erm7XnoK8aTuRls30wXlXL6LDB6e090vTELOYyreGe7OOLA==
 
-"vite@^2.0.0", "vite@^2.4.0", "vite@^2.5.10", "vite@>=2.0.0":
-  "integrity" "sha512-KEY96ntXUid1/xJihJbgmLZx7QSC2D4Tui0FdS0Old5OokYzFclcofhtxtjDdGOk/fFpPbHv9yw88+rB93Tb8w=="
-  "resolved" "https://registry.npmmirror.com/vite/download/vite-2.7.10.tgz"
-  "version" "2.7.10"
+vite@^2.4.0:
+  version "2.7.10"
+  resolved "https://registry.npmmirror.com/vite/download/vite-2.7.10.tgz"
+  integrity sha512-KEY96ntXUid1/xJihJbgmLZx7QSC2D4Tui0FdS0Old5OokYzFclcofhtxtjDdGOk/fFpPbHv9yw88+rB93Tb8w==
   dependencies:
-    "esbuild" "^0.13.12"
-    "postcss" "^8.4.5"
-    "resolve" "^1.20.0"
-    "rollup" "^2.59.0"
+    esbuild "^0.13.12"
+    postcss "^8.4.5"
+    resolve "^1.20.0"
+    rollup "^2.59.0"
   optionalDependencies:
-    "fsevents" "~2.3.2"
+    fsevents "~2.3.2"
 
-"vue-cookies@^1.7.4":
-  "integrity" "sha1-0kHQoEMdoHlYN2UdELTXPnyNPo0="
-  "resolved" "https://registry.nlark.com/vue-cookies/download/vue-cookies-1.7.4.tgz"
-  "version" "1.7.4"
+vue-cookies@^1.7.4:
+  version "1.7.4"
+  resolved "https://registry.nlark.com/vue-cookies/download/vue-cookies-1.7.4.tgz"
+  integrity sha1-0kHQoEMdoHlYN2UdELTXPnyNPo0=
 
-"vue-eslint-parser@^7.10.0":
-  "integrity" "sha1-IUtd6pYQB/z/su5luJEjB2KNDa8="
-  "resolved" "https://registry.npmmirror.com/vue-eslint-parser/download/vue-eslint-parser-7.11.0.tgz"
-  "version" "7.11.0"
+vue-eslint-parser@^7.10.0:
+  version "7.11.0"
+  resolved "https://registry.npmmirror.com/vue-eslint-parser/download/vue-eslint-parser-7.11.0.tgz"
+  integrity sha1-IUtd6pYQB/z/su5luJEjB2KNDa8=
   dependencies:
-    "debug" "^4.1.1"
-    "eslint-scope" "^5.1.1"
-    "eslint-visitor-keys" "^1.1.0"
-    "espree" "^6.2.1"
-    "esquery" "^1.4.0"
-    "lodash" "^4.17.21"
-    "semver" "^6.3.0"
+    debug "^4.1.1"
+    eslint-scope "^5.1.1"
+    eslint-visitor-keys "^1.1.0"
+    espree "^6.2.1"
+    esquery "^1.4.0"
+    lodash "^4.17.21"
+    semver "^6.3.0"
 
-"vue-i18n@^9.1.6":
-  "integrity" "sha512-JeRdNVxS2OGp1E+pye5XB6+M6BBkHwAv9C80Q7+kzoMdUDGRna06tjC0vCB/jDX9aWrl5swxOMFcyAr7or8XTA=="
-  "resolved" "https://registry.npmmirror.com/vue-i18n/download/vue-i18n-9.1.9.tgz"
-  "version" "9.1.9"
+vue-i18n@^9.1.6:
+  version "9.1.9"
+  resolved "https://registry.npmmirror.com/vue-i18n/download/vue-i18n-9.1.9.tgz"
+  integrity sha512-JeRdNVxS2OGp1E+pye5XB6+M6BBkHwAv9C80Q7+kzoMdUDGRna06tjC0vCB/jDX9aWrl5swxOMFcyAr7or8XTA==
   dependencies:
     "@intlify/core-base" "9.1.9"
     "@intlify/shared" "9.1.9"
     "@intlify/vue-devtools" "9.1.9"
     "@vue/devtools-api" "^6.0.0-beta.7"
 
-"vue-router@4":
-  "integrity" "sha512-CPXvfqe+mZLB1kBWssssTiWg4EQERyqJZes7USiqfW9B5N2x+nHlnsM1D3b5CaJ6qgCvMmYJnz+G0iWjNCvXrg=="
-  "resolved" "https://registry.npmmirror.com/vue-router/download/vue-router-4.0.12.tgz"
-  "version" "4.0.12"
+vue-router@4:
+  version "4.0.12"
+  resolved "https://registry.npmmirror.com/vue-router/download/vue-router-4.0.12.tgz"
+  integrity sha512-CPXvfqe+mZLB1kBWssssTiWg4EQERyqJZes7USiqfW9B5N2x+nHlnsM1D3b5CaJ6qgCvMmYJnz+G0iWjNCvXrg==
   dependencies:
     "@vue/devtools-api" "^6.0.0-beta.18"
 
-"vue-tsc@^0.0.24":
-  "integrity" "sha1-DNkNtnn1PqFpQlS4Zj/bPWJKCHI="
-  "resolved" "https://registry.npmmirror.com/vue-tsc/download/vue-tsc-0.0.24.tgz"
-  "version" "0.0.24"
+vue-tsc@^0.0.24:
+  version "0.0.24"
+  resolved "https://registry.npmmirror.com/vue-tsc/download/vue-tsc-0.0.24.tgz"
+  integrity sha1-DNkNtnn1PqFpQlS4Zj/bPWJKCHI=
   dependencies:
-    "unzipper" "0.10.11"
+    unzipper "0.10.11"
 
-"vue-types@^3.0.0":
-  "integrity" "sha1-7BbgXUEsA4Ji/B76TOuWR+f7YB0="
-  "resolved" "https://registry.npmmirror.com/vue-types/download/vue-types-3.0.2.tgz"
-  "version" "3.0.2"
+vue-types@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/vue-types/download/vue-types-3.0.2.tgz"
+  integrity sha1-7BbgXUEsA4Ji/B76TOuWR+f7YB0=
   dependencies:
-    "is-plain-object" "3.0.1"
+    is-plain-object "3.0.1"
 
-"vue@^3.0.0", "vue@^3.0.2", "vue@^3.2.26", "vue@>=3.0.3", "vue@>=3.1.0", "vue@3.2.26":
-  "integrity" "sha512-KD4lULmskL5cCsEkfhERVRIOEDrfEL9CwAsLYpzptOGjaGFNWo3BQ9g8MAb7RaIO71rmVOziZ/uEN/rHwcUIhg=="
-  "resolved" "https://registry.npmmirror.com/vue/download/vue-3.2.26.tgz"
-  "version" "3.2.26"
+vue@^3.2.26:
+  version "3.2.26"
+  resolved "https://registry.npmmirror.com/vue/download/vue-3.2.26.tgz"
+  integrity sha512-KD4lULmskL5cCsEkfhERVRIOEDrfEL9CwAsLYpzptOGjaGFNWo3BQ9g8MAb7RaIO71rmVOziZ/uEN/rHwcUIhg==
   dependencies:
     "@vue/compiler-dom" "3.2.26"
     "@vue/compiler-sfc" "3.2.26"
@@ -3886,49 +3868,49 @@
     "@vue/server-renderer" "3.2.26"
     "@vue/shared" "3.2.26"
 
-"vuex@^4.0.2":
-  "integrity" "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q=="
-  "resolved" "https://registry.npmmirror.com/vuex/download/vuex-4.0.2.tgz"
-  "version" "4.0.2"
+vuex@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/vuex/download/vuex-4.0.2.tgz"
+  integrity sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==
   dependencies:
     "@vue/devtools-api" "^6.0.0-beta.11"
 
-"warning@^4.0.0":
-  "integrity" "sha1-Fungd+uKhtavfWSqHgX9hbRnjKM="
-  "resolved" "https://registry.npm.taobao.org/warning/download/warning-4.0.3.tgz"
-  "version" "4.0.3"
+warning@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.npm.taobao.org/warning/download/warning-4.0.3.tgz"
+  integrity sha1-Fungd+uKhtavfWSqHgX9hbRnjKM=
   dependencies:
-    "loose-envify" "^1.0.0"
+    loose-envify "^1.0.0"
 
-"which-boxed-primitive@^1.0.2":
-  "integrity" "sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY="
-  "resolved" "https://registry.npm.taobao.org/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz"
-  "version" "1.0.2"
+which-boxed-primitive@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npm.taobao.org/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz"
+  integrity sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY=
   dependencies:
-    "is-bigint" "^1.0.1"
-    "is-boolean-object" "^1.1.0"
-    "is-number-object" "^1.0.4"
-    "is-string" "^1.0.5"
-    "is-symbol" "^1.0.3"
+    is-bigint "^1.0.1"
+    is-boolean-object "^1.1.0"
+    is-number-object "^1.0.4"
+    is-string "^1.0.5"
+    is-symbol "^1.0.3"
 
-"which@^2.0.1":
-  "integrity" "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE="
-  "resolved" "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz"
-  "version" "2.0.2"
+which@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz"
+  integrity sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=
   dependencies:
-    "isexe" "^2.0.0"
+    isexe "^2.0.0"
 
-"word-wrap@^1.2.3":
-  "integrity" "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w="
-  "resolved" "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz?cache=0&sync_timestamp=1589683603678&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fword-wrap%2Fdownload%2Fword-wrap-1.2.3.tgz"
-  "version" "1.2.3"
+word-wrap@^1.2.3:
+  version "1.2.3"
+  resolved "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz?cache=0&sync_timestamp=1589683603678&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fword-wrap%2Fdownload%2Fword-wrap-1.2.3.tgz"
+  integrity sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=
 
-"wrappy@1":
-  "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
-  "resolved" "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz"
-  "version" "1.0.2"
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz"
+  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
 
-"yallist@^4.0.0":
-  "integrity" "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI="
-  "resolved" "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz"
-  "version" "4.0.0"
+yallist@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz"
+  integrity sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=

--
Gitblit v1.9.3