sean.zhou
2022-03-21 b5f655fd6e424984bbafc58adf16209f2d041c22
initial
93 files added
23360 ■■■■■ changed files
.eslintignore 1 ●●●● patch | view | raw | blame | history
.eslintrc.js 22 ●●●●● patch | view | raw | blame | history
.gitignore 25 ●●●●● patch | view | raw | blame | history
.gitignore copy 5 ●●●●● patch | view | raw | blame | history
.npmrc 1 ●●●● patch | view | raw | blame | history
README.md 2 ●●●●● patch | view | raw | blame | history
env/.env 2 ●●●●● patch | view | raw | blame | history
env/.env.production 2 ●●●●● patch | view | raw | blame | history
env/.env.stag 2 ●●●●● patch | view | raw | blame | history
index.html 13 ●●●●● patch | view | raw | blame | history
package-lock.json 13530 ●●●●● patch | view | raw | blame | history
package.json 87 ●●●●● patch | view | raw | blame | history
public/favicon.ico patch | view | raw | blame | history
src/App.vue 34 ●●●●● patch | view | raw | blame | history
src/antd.ts 13 ●●●●● patch | view | raw | blame | history
src/api/http.ts 42 ●●●●● patch | view | raw | blame | history
src/api/http/config.ts 20 ●●●●● patch | view | raw | blame | history
src/api/http/request.ts 64 ●●●●● patch | view | raw | blame | history
src/api/http/type.ts 38 ●●●●● patch | view | raw | blame | history
src/api/layer.ts 52 ●●●●● patch | view | raw | blame | history
src/api/manage.ts 62 ●●●●● patch | view | raw | blame | history
src/api/media.ts 9 ●●●●● patch | view | raw | blame | history
src/api/pilot-bridge.ts 183 ●●●●● patch | view | raw | blame | history
src/api/wayline.ts 9 ●●●●● patch | view | raw | blame | history
src/api/websocket.ts 30 ●●●●● patch | view | raw | blame | history
src/assets/icons/check.svg 11 ●●●●● patch | view | raw | blame | history
src/assets/icons/dji-logo-vector.svg 16 ●●●●● patch | view | raw | blame | history
src/assets/icons/layer.svg 4 ●●●● patch | view | raw | blame | history
src/assets/icons/media.svg 4 ●●●● patch | view | raw | blame | history
src/assets/icons/pin-19be6b.svg 22 ●●●●● patch | view | raw | blame | history
src/assets/icons/pin-212121.svg 22 ●●●●● patch | view | raw | blame | history
src/assets/icons/pin-2d8cf0.svg 22 ●●●●● patch | view | raw | blame | history
src/assets/icons/pin-b620e0.svg 22 ●●●●● patch | view | raw | blame | history
src/assets/icons/pin-e23c39.svg 22 ●●●●● patch | view | raw | blame | history
src/assets/icons/pin-ffbb00.svg 22 ●●●●● patch | view | raw | blame | history
src/assets/icons/tsa.svg 14 ●●●●● patch | view | raw | blame | history
src/components/GMap.vue 311 ●●●●● patch | view | raw | blame | history
src/components/LayersTree.vue 217 ●●●●● patch | view | raw | blame | history
src/components/MediaPanel.vue 92 ●●●●● patch | view | raw | blame | history
src/components/svgIcon.vue 42 ●●●●● patch | view | raw | blame | history
src/components/wayline-panel.vue 122 ●●●●● patch | view | raw | blame | history
src/constants/index.ts 19 ●●●●● patch | view | raw | blame | history
src/constants/map.ts 23 ●●●●● patch | view | raw | blame | history
src/constants/mock-layers.ts 138 ●●●●● patch | view | raw | blame | history
src/env.d.ts 9 ●●●●● patch | view | raw | blame | history
src/hooks/use-g-map-cover.ts 144 ●●●●● patch | view | raw | blame | history
src/hooks/use-g-map.ts 34 ●●●●● patch | view | raw | blame | history
src/hooks/use-mouse-tool.ts 71 ●●●●● patch | view | raw | blame | history
src/main.ts 14 ●●●●● patch | view | raw | blame | history
src/pages/elements/elements.vue 21 ●●●●● patch | view | raw | blame | history
src/pages/page-pilot/pilot-home.vue 150 ●●●●● patch | view | raw | blame | history
src/pages/page-pilot/pilot-index.vue 145 ●●●●● patch | view | raw | blame | history
src/pages/page-pilot/pilot-liveshare.vue 202 ●●●●● patch | view | raw | blame | history
src/pages/page-pilot/pilot-media.vue 130 ●●●●● patch | view | raw | blame | history
src/pages/project-app/index.vue 208 ●●●●● patch | view | raw | blame | history
src/pages/project-app/projects/layer.vue 438 ●●●●● patch | view | raw | blame | history
src/pages/project-app/projects/livestream-agora.vue 327 ●●●●● patch | view | raw | blame | history
src/pages/project-app/projects/livestream-others.vue 351 ●●●●● patch | view | raw | blame | history
src/pages/project-app/projects/livestream.vue 82 ●●●●● patch | view | raw | blame | history
src/pages/project-app/projects/media.vue 11 ●●●●● patch | view | raw | blame | history
src/pages/project-app/projects/tsa.vue 11 ●●●●● patch | view | raw | blame | history
src/pages/project-app/projects/wayline.vue 9 ●●●●● patch | view | raw | blame | history
src/pages/project-app/sidebar.vue 103 ●●●●● patch | view | raw | blame | history
src/plugins/svgBuilder.ts 50 ●●●●● patch | view | raw | blame | history
src/root.ts 24 ●●●●● patch | view | raw | blame | history
src/router/index.ts 70 ●●●●● patch | view | raw | blame | history
src/shims-vue.d.ts 5 ●●●●● patch | view | raw | blame | history
src/store/index.ts 135 ●●●●● patch | view | raw | blame | history
src/styles/common.scss 19 ●●●●● patch | view | raw | blame | history
src/styles/flex.style.scss 318 ●●●●● patch | view | raw | blame | history
src/styles/fonts.scss 72 ●●●●● patch | view | raw | blame | history
src/styles/index.scss 3 ●●●●● patch | view | raw | blame | history
src/styles/reset.scss 164 ●●●●● patch | view | raw | blame | history
src/styles/variables.scss 72 ●●●●● patch | view | raw | blame | history
src/types/enums.ts 19 ●●●●● patch | view | raw | blame | history
src/types/index.ts 1 ●●●● patch | view | raw | blame | history
src/types/map-enum.ts 6 ●●●●● patch | view | raw | blame | history
src/types/map.d.ts 100 ●●●●● patch | view | raw | blame | history
src/types/mapLayer.ts 98 ●●●●● patch | view | raw | blame | history
src/use-common-components.ts 13 ●●●●● patch | view | raw | blame | history
src/utils/data-process.ts 4 ●●●● patch | view | raw | blame | history
src/utils/genjson.ts 81 ●●●●● patch | view | raw | blame | history
src/utils/layer-tree.ts 19 ●●●●● patch | view | raw | blame | history
src/utils/logger.ts 28 ●●●●● patch | view | raw | blame | history
src/utils/map-layer-utils.ts 44 ●●●●● patch | view | raw | blame | history
src/utils/storage.ts 42 ●●●●● patch | view | raw | blame | history
src/utils/uuid.ts 6 ●●●●● patch | view | raw | blame | history
src/vendors/coordtransform.js 85 ●●●●● patch | view | raw | blame | history
src/vendors/jswebrtc.min.js 2 ●●●●● patch | view | raw | blame | history
src/vite-env.d.ts 1 ●●●● patch | view | raw | blame | history
tsconfig.json 29 ●●●●● patch | view | raw | blame | history
vite.config.ts 70 ●●●●● patch | view | raw | blame | history
yarn.lock 3927 ●●●●● patch | view | raw | blame | history
.eslintignore
New file
@@ -0,0 +1 @@
/src/vendors/**
.eslintrc.js
New file
@@ -0,0 +1,22 @@
module.exports = {
  env: {
    browser: true,
    commonjs: true,
    es2021: true,
    node: true
  },
  extends: ['standard', 'plugin:vue/vue3-essential'],
  parserOptions: {
    ecmaVersion: 12,
    parser: '@typescript-eslint/parser'
  },
  plugins: ['vue', '@typescript-eslint'],
  rules: {
    'comma-dangle': 'off',
    'import/no-absolute-path': 'off',
    'no-unused-vars': 'off',
    camelcase: 'off',
    'no-redeclare': 'off',
    'vue/no-unused-components': 'off'
  }
}
.gitignore
New file
@@ -0,0 +1,25 @@
node_modules
.DS_Store
dist
dist-ssr
*.local
node_modules/
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
# .vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
.history
/coverage
/backup
node_modules
.gitignore copy
New file
@@ -0,0 +1,5 @@
node_modules
.DS_Store
dist
dist-ssr
*.local
.npmrc
New file
@@ -0,0 +1 @@
registry=https://registry.npm.taobao.org/
README.md
New file
@@ -0,0 +1,2 @@
# VUE3
全系统选用 script setup 模式
env/.env
New file
@@ -0,0 +1,2 @@
VITE_APP_ENVIRONMENT=DEV
VITE_APP_APIGATEWAY_BACKEND_HOST=''
env/.env.production
New file
@@ -0,0 +1,2 @@
VITE_APP_ENVIRONMENT=production
VITE_APP_APIGATEWAY_BACKEND_HOST=''
env/.env.stag
New file
@@ -0,0 +1,2 @@
VITE_APP_ENVIRONMENT=STAG
VITE_APP_APIGATEWAY_BACKEND_HOST=''
index.html
New file
@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" href="/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>demo-web</title>
  </head>
  <body>
    <div id="demo-app"></div>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>
package-lock.json
New file
Diff too large
package.json
New file
@@ -0,0 +1,87 @@
{
  "name": "demo-web",
  "version": "0.0.1",
  "scripts": {
    "serve": "vite",
    "build:test": "vite build --mode stag",
    "build": "vite build",
    "preview": "vite preview",
    "lint": "eslint --fix"
  },
  "dependencies": {
    "@amap/amap-jsapi-loader": "^1.0.1",
    "@ant-design/icons-vue": "^6.0.1",
    "@vitejs/plugin-legacy": "^1.6.2",
    "agora-rtc-sdk-ng": "latest",
    "ant-design-vue": "^2.2.8",
    "axios": "^0.21.1",
    "query-string": "^7.0.1",
    "reconnecting-websocket": "^4.4.0",
    "vconsole": "^3.8.1",
    "vite-plugin-components": "^0.13.3",
    "vite-plugin-importer": "^0.2.5",
    "vite-plugin-optimize-persist": "^0.1.2",
    "vite-plugin-package-config": "^0.1.1",
    "vue": "^3.2.26",
    "vue-cookies": "^1.7.4",
    "vue-i18n": "^9.1.6",
    "vue-router": "4",
    "vuex": "^4.0.2"
  },
  "devDependencies": {
    "@types/node": "^16.3.2",
    "@types/urlencode": "^1.1.2",
    "@typescript-eslint/eslint-plugin": "^5.8.1",
    "@typescript-eslint/parser": "^5.8.1",
    "@vitejs/plugin-vue": "^1.2.4",
    "@vue/compiler-sfc": "^3.0.5",
    "eslint": "^7.30.0",
    "eslint-config-standard": "^16.0.3",
    "eslint-plugin-import": "^2.23.4",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-promise": "^5.1.0",
    "eslint-plugin-vue": "^7.13.0",
    "rollup-plugin-external-globals": "^0.6.1",
    "sass": "^1.35.1",
    "typescript": "^4.5.4",
    "vite": "^2.4.0",
    "vite-plugin-eslint": "^1.3.0",
    "vite-plugin-style-import": "^1.0.1",
    "vite-plugin-svg-icons": "^1.0.5",
    "vite-plugin-vconsole": "^1.1.0",
    "vue-tsc": "^0.0.24"
  },
  "license": "ISC",
  "vite": {
    "optimizeDeps": {
      "include": [
        "@amap/amap-jsapi-loader",
        "@ant-design/icons-vue",
        "@vue/reactivity",
        "agora-rtc-sdk-ng",
        "ant-design-vue",
        "ant-design-vue/es",
        "ant-design-vue/es/button/style/css",
        "ant-design-vue/es/divider/style/css",
        "ant-design-vue/es/drawer/style/css",
        "ant-design-vue/es/form/style/css",
        "ant-design-vue/es/image/style/css",
        "ant-design-vue/es/input/style/css",
        "ant-design-vue/es/message/style/css",
        "ant-design-vue/es/modal/style/css",
        "ant-design-vue/es/radio/style/css",
        "ant-design-vue/es/select/style/css",
        "ant-design-vue/es/switch/style/css",
        "ant-design-vue/es/table/style/css",
        "ant-design-vue/es/tooltip/style/css",
        "ant-design-vue/es/tree/style/css",
        "axios",
        "reconnecting-websocket",
        "vconsole",
        "vue",
        "vue-router",
        "vuex"
      ]
    }
  }
}
public/favicon.ico
src/App.vue
New file
@@ -0,0 +1,34 @@
<template>
  <div id="demo-app" class="demo-app">
    <router-view />
    <!-- <div class="map-wrapper">
      <GMap/>
    </div> -->
  </div>
</template>
<script lang="ts">
import { computed, defineComponent, ref } from 'vue'
import { useMyStore } from './store'
import GMap from '/@/components/GMap.vue'
export default defineComponent({
  name: 'App',
  components: { GMap },
  setup () {
    const store = useMyStore()
    return {}
  }
})
</script>
<style lang="scss" scoped>
.demo-app {
  width: 100%;
  height: 100%;
  .map-wrapper {
    height: 100%;
    width: 100%;
  }
}
</style>
src/antd.ts
New file
@@ -0,0 +1,13 @@
// import Icon from '@ant-design/icons-vue'
import * as antDesign from 'ant-design-vue'
import 'ant-design-vue/dist/antd.css'
import { App } from 'vue'
import svgIcon from '/@/components/svgIcon.vue'
export const antComponents = {
  install (app: App): void {
    app.use(antDesign)
    // app.component('Icon', Icon)
    app.component('svg-icon', svgIcon)
  }
}
src/api/http.ts
New file
@@ -0,0 +1,42 @@
/**
 * 职责声明:
 * 1.提供一个 单一的 axios 实例(方面进行统一拦截)
 * 2.允许调用方定制自己的配置(例如拦截器等),而不影响其他实例
 *
 * 暴露 API:
 * 1.一个统一的 axios 实例: singleAxiosInstance(绑定了统一的拦截器)
 * 2.创建 axios 实例的方法 createAxiosInstance,并在参数中允许配置是否绑定统一拦截器
 * 3.对外暴露统一拦截器绑定方案,允许外界进行定制: bindCommonRequestInterceptors、bindCommonResponseInterceptors
 */
import Axios, { AxiosInstance, AxiosRequestConfig } from 'axios'
// 统一的 request 拦截器
export function bindCommonRequestInterceptors (instance: AxiosInstance): void {
  instance.interceptors.request.use(config => {
    return config
  })
}
// Unified response interceptor
export function bindCommonResponseInterceptors (instance: AxiosInstance): void {
  instance.interceptors.response.use(config => {
    return config
  }, err => {
    return Promise.reject(err)
  })
}
export function createAxiosInstance (config?: AxiosRequestConfig, commonInterceptorConf: { request?: boolean, response?: boolean } = {}): AxiosInstance {
  const instance = Axios.create(config)
  // Binding a unified interceptor, binding by default
  commonInterceptorConf.request !== false && bindCommonRequestInterceptors(instance)
  commonInterceptorConf.response !== false && bindCommonResponseInterceptors(instance)
  return instance
}
const singleAxios = createAxiosInstance({}, { request: true, response: false })
export default singleAxios
src/api/http/config.ts
New file
@@ -0,0 +1,20 @@
export const CURRENT_CONFIG = {
  baseURL: 'Please enter the backend access address prefix.', // This url must end with "/". Example: 'http://192.168.1.1:6789/cloud/'
  websocketURL: 'Please enter the WebSocket access address.',  // Example: 'ws://192.168.1.1:6789/api/v1/ws'
  rtmpURL: 'Please enter the rtmp access address.',  // Example: 'rtmp://192.168.1.1/live/'
  gb28181Para:
    'serverIP=Please enter the server ip.&serverPort=Please enter the server port.&serverID=Please enter the server id.' +
    '&agentID=Please enter the agent id.&agentPassword=Please enter the agent password' +
    '&localPort=Please enter the local port.&channel=Please enter the channel.',
  rtspPara: 'userName=Please enter the username.&password=Please enter the password&port=Please enter the port.',
  amapKey: 'Please enter the amap key.',
  agoraAPPID: 'Please enter the agora app id.',
  agoraToken: 'Please enter the agora token.',
  agoraChannel: 'Please enter the agora channel.',
  appId: 'Please enter the app id.',  // You need to go to the development website to apply.
  appKey: 'Please enter the app key.',  // You need to go to the development website to apply.
  appLicense: 'Please enter the app license.' // You need to go to the development website to apply.
}
src/api/http/request.ts
New file
@@ -0,0 +1,64 @@
import axios from 'axios'
import { uuidv4 } from '/@/utils/uuid'
import { CURRENT_CONFIG } from './config'
export * from './type'
const REQUEST_ID = 'X-Request-Id'
function getAuthToken () {
  return localStorage.getItem('x-auth-token')
}
const instance = axios.create({
  // withCredentials: true,
  headers: {
    'Content-Type': 'application/json',
  },
  // timeout: 12000,
})
instance.interceptors.request.use(
  config => {
    config.headers['X-Auth-Token'] = getAuthToken()
    // config.headers[REQUEST_ID] = uuidv4()
    config.baseURL = CURRENT_CONFIG.baseURL
    return config
  },
  error => {
    return Promise.reject(error)
  },
)
instance.interceptors.response.use(
  response => response,
  err => {
    const requestId = err?.config?.headers && err?.config?.headers[REQUEST_ID]
    console.info('')
    if (requestId) {
      console.info(REQUEST_ID, ':', requestId)
    }
    console.info('url: ', err?.config?.url, `【${err?.config?.method}】 \n>>>> err: `, err)
    let description = '-'
    if (err.response?.data && err.response.data.message) {
      description = err.response.data.message
    }
    if (err.response?.data && err.response.data.result) {
      description = err.response.data.result.message
    }
    // @See: https://github.com/axios/axios/issues/383
    if (!err.response || !err.response.status) {
      console.log('The network is abnormal, please check the network and try again')
    } else if (err.response?.status !== 200) {
      console.log(`ERROR_CODE: ${err.response?.status}`)
    }
    if (err.response?.status === 403) {
      // window.location.href = '/'
    }
    if (err.response?.status === 401) {
      console.log(err.response)
    }
    return Promise.reject(err)
  },
)
export default instance
src/api/http/type.ts
New file
@@ -0,0 +1,38 @@
export interface IResult {
 code: number;
 message: string;
}
export interface IPage {
 page: number;
 total: number;
 page_size: number;
}
export interface IListWorkspaceResponse<T> {
 code: number;
 message: string;
 data: {
   list: T[];
   pagination: IPage;
 };
}
// 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 {
 data: {
   list: T[];
   pagination: IPage;
 };
}
export interface CommonResponse<T> extends IResult {
 data: T
}
src/api/layer.ts
New file
@@ -0,0 +1,52 @@
import request, { IWorkspaceResponse } from '/@/api/http/request'
import { mapLayers } from '/@/constants/mock-layers'
import { elementGroupsReq, PostElementsBody, PutElementsBody } from '/@/types/mapLayer'
const PREFIX = '/map/api/v1'
const workspace_id = localStorage.getItem('workspace-id')
type UnknownResponse = Promise<IWorkspaceResponse<unknown>>
// get elements group
// export const getLayers = async (reqParams: elementGroupsReq): UnknownResponse => {
//   const url = `${PREFIX}/workspaces/${workspace_id}/element_groups`
//   const result = await request.get(url, {
//     params: {
//       group_id: reqParams.groupId,
//       is_distributed: reqParams.isDistributed
//     },
//   })
//   return result.data
// }
export const getLayers = async (reqParams: elementGroupsReq): UnknownResponse => {
  return mapLayers
}
// Get elements groups request
export const getElementGroupsReq = async (body: elementGroupsReq): Promise<IWorkspaceResponse<any>> => {
  const url = `${PREFIX}/workspaces/` + workspace_id + '/element-groups'
  const result = await request.get(url, body)
  return result.data
}
// add element
export const postElementsReq = async (pid: string, body: PostElementsBody): Promise<IWorkspaceResponse<{ id: string }>> => {
  const url = `${PREFIX}/workspaces/` + workspace_id + `/element-groups/${pid}/elements`
  const result = await request.post(url, body)
  return result.data
}
// Update map element request
export const updateElementsReq = async (id: string, body: PutElementsBody): Promise<IWorkspaceResponse<{ id: string }>> => {
  const url = `${PREFIX}/workspaces/` + workspace_id + `/elements/${id}`
  const result = await request.put(url, body)
  return result.data
}
// Delete map element
export const deleteElementReq = async (id: string, body: {}): Promise<any> => {
  const url = `${PREFIX}/workspaces/` + workspace_id + `/elements/${id}`
  const result = await request.delete(url, body)
  return result.data
}
// Delete layer elements
export const deleteLayerEleReq = async (id: string, body: {}): Promise<any> => {
  const url = `${PREFIX}/workspaces/` + workspace_id + `/element-groups/${id}/elements`
  const result = await request.delete(url, body)
  return result.data
}
src/api/manage.ts
New file
@@ -0,0 +1,62 @@
import request, { IWorkspaceResponse } from '/@/api/http/request'
const HTTP_PREFIX = '/manage/api/v1'
// login
interface loginBody {
 username: string,
 password: string
}
export const login = async function (body: loginBody): Promise<IWorkspaceResponse<any>> {
  const url = `${HTTP_PREFIX}/login`
  const result = await request.post(url, body)
  return result.data
}
// Refresh Token
export const refreshToken = async function (body: {}): Promise<IWorkspaceResponse<any>> {
  const url = `${HTTP_PREFIX}/token/refresh`
  const result = await request.post(url, body)
  return result.data
}
// Get Platform Info
export const getPlatformInfo = async function (body: {}): Promise<IWorkspaceResponse<any>> {
  const url = `${HTTP_PREFIX}/workspaces/current`
  const result = await request.get(url, body)
  return result.data
}
// Get User Info
export const getUserInfo = async function (body: {}): Promise<IWorkspaceResponse<any>> {
  const url = `${HTTP_PREFIX}/users/current`
  const result = await request.get(url, body)
  return result.data
}
// Get Device Topo
export const getDeviceTopo = async function (body: {}): Promise<IWorkspaceResponse<any>> {
  const url = `${HTTP_PREFIX}/devices/devices`
  const result = await request.get(url, body)
  return result.data
}
// Get Livestream Capacity
export const getLiveCapacity = async function (body: {}): Promise<IWorkspaceResponse<any>> {
  const url = `${HTTP_PREFIX}/live/capacity`
  const result = await request.get(url, body)
  return result.data
}
// Start Livestream
export const startLivestream = async function (body: {}): Promise<IWorkspaceResponse<any>> {
  const url = `${HTTP_PREFIX}/live/streams/start`
  const result = await request.post(url, body)
  return result.data
}
// Stop Livestream
export const stopLivestream = async function (body: {}): Promise<IWorkspaceResponse<any>> {
  const url = `${HTTP_PREFIX}/live/streams/stop`
  const result = await request.post(url, body)
  return result.data
}
src/api/media.ts
New file
@@ -0,0 +1,9 @@
import request from '/@/api/http/request'
const HTTP_PREFIX = '/media/api/v1'
// Get Media Files
export const getMediaFiles = async function (wid: string, body: {}): Promise<any> {
  const url = `${HTTP_PREFIX}/files/${wid}/files`
  const result = await request.get(url, body)
  return result.data
}
src/api/pilot-bridge.ts
New file
@@ -0,0 +1,183 @@
import { getRoot } from '/@/root'
const root = getRoot()
const components = new Map()
declare let window:any
interface JsResponse{
  code:number,
  message:string,
  data:{}
}
export default {
  init () {
    components.set('thing', {
      host: '',
      connectCallback: '',
      username: '',
      password: ''
    })
    components.set('liveshare', {
      videoPublishType: 'video-demand-aux-manual', // video-on-demand、video-by-manual、video-demand-aux-manual
      statusCallback: ''
    })
    components.set('map', {
      userName: '',
      elementPreName: ''
    })
    components.set('ws', {
      host: '',
      token: '',
      connectCallback: ''
    })
    components.set('api', {
      host: '',
      token: ''
    })
    components.set('tsa', {
    })
    components.set('media', {
      autoUploadPhoto: true, // 是否自动上传图片, 非必需
      autoUploadPhotoType: 1, // 自动上传的照片类型,0:原图, 1:缩略图, 非必需
      autoUploadVideo: true // 是否自动上传视频, 非必需
    })
    components.set('mission', {
    })
  },
  getComponentParam (key:string) {
    return components.get(key)
  },
  setComponentParam (key:string, value:any) {
    components.set(key, value)
  },
  loadComponent (name:string, param:any):string {
    return window.djiBridge.platformLoadComponent(name, JSON.stringify(param))
  },
  unloadComponent (name:string) :string {
    return window.djiBridge.platformUnloadComponent(name)
  },
  isComponentLoaded (module:string):string {
    return window.djiBridge.platformIsComponentLoaded(module)
  },
  setWorkspaceId (uuid:string):string {
    return window.djiBridge.platformSetWorkspaceId(uuid)
  },
  setPlatformMessage (platformName:string, title:string, desc:string):string {
    return window.djiBridge.platformSetInformation(platformName, title, desc)
  },
  getRemoteControllerSN () :string {
    return window.djiBridge.platformGetRemoteControllerSN()
  },
  getAircraftSN ():string {
    return window.djiBridge.platformGetAircraftSN()
  },
  stopwebview ():string {
    return window.djiBridge.platformStopSelf()
  },
  getToken () :string {
    const res:string = this.isComponentLoaded('api')
    const resObj = JSON.parse(res)
    console.log('api load status:', resObj)
    if (resObj.data === true) {
      const tokenRes = JSON.parse(window.djiBridge.apiGetToken())
      return tokenRes.data
    } else {
      console.warn('warning: not api component loaded!!')
      return ''
    }
  },
  setToken (token:string):string {
    return window.djiBridge.apiSetToken(token)
  },
  setLogEncryptKey (key:string):string {
    return window.djiBridge.platformSetLogEncryptKey(key)
  },
  clearLogEncryptKey ():string {
    return window.djiBridge.platformClearLogEncryptKey()
  },
  getLogPath ():string {
    return window.djiBridge.platformGetLogPath()
  },
  platformVerifyLicense (appId:string, appKey:string, appLicense:string):string {
    return window.djiBridge.platformVerifyLicense(appId, appKey, appLicense)
  },
  isPlatformVerifySuccess ():string {
    return window.djiBridge.platformIsVerified()
  },
  // liveshare
  /**
   *
   * @param type
   * video-on-demand: 服务器点播,依赖于thing模块,具体的点播命令参见设备物模型的直播服务
   * video-by-manual:手动点播,配置好直播类型参数之后,在图传页面可修改直播参数,停止直播
   * video-demand-aux-manual: 混合模式,支持服务器点播,以及图传页面修改直播参数,停止直播
   */
  setVideoPublishType (type:string):string {
    return window.djiBridge.liveshareSetVideoPublishType(type)
  },
  /**
   *
   * @returns
   * type: liveshare type, 0:unknown, 1:agora, 2:rtmp, 3:rtsp, 4:gb28181
   */
  getLiveshareConfig () {
    return window.djiBridge.liveshareGetConfig()
  },
  setLiveshareConfig (type:number, params:string):string {
    return window.djiBridge.liveshareSetConfig(type, params)
  },
  setLiveshareStatusCallback (callbackFunc:string) :string {
    return window.djiBridge.liveshareSetStatusCallback(callbackFunc)
  },
  getLiveshareStatus () {
    return window.djiBridge.liveshareGetStatus()
  },
  startLiveshare ():string {
    return window.djiBridge.liveshareStartLive()
  },
  stopLiveshare ():string {
    return window.djiBridge.liveshareStopLive()
  },
  // media
  setAutoUploadPhoto (auto:boolean):string {
    return window.djiBridge.mediaSetAutoUploadPhoto(auto)
  },
  getAutoUploadPhoto () {
    return window.djiBridge.mediaGetAutoUploadPhoto()
  },
  setUploadPhotoType (type:number):string {
    return window.djiBridge.mediaSetUploadPhotoType(type)
  },
  getUploadPhotoType () {
    return window.djiBridge.mediaGetUploadPhotoType()
  },
  setAutoUploadVideo (auto:boolean):string {
    return window.djiBridge.mediaSetAutoUploadVideo(auto)
  },
  getAutoUploadVideo () {
    return window.djiBridge.mediaGetAutoUploadVideo()
  },
  setDownloadOwner (rcIndex:number):string {
    return window.djiBridge.mediaSetDownloadOwner(rcIndex)
  },
  getDownloadOwner () {
    return window.djiBridge.mediaGetDownloadOwner()
  },
  onBackClickReg () {
    window.djiBridge.onBackClick = () => {
      if (root.$router.currentRoute.value.path === '/pilot-home') {
        console.log(root.$router.currentRoute.value.path)
        return false
      } else {
        console.log(root.$router.currentRoute.value.path)
        history.go(-1)
        return true
      }
    }
  }
}
src/api/wayline.ts
New file
@@ -0,0 +1,9 @@
import request from '/@/api/http/request'
const HTTP_PREFIX = '/wayline/api/v1'
// Get Wayline Files
export const getWaylineFiles = async function (wid: string, body: {}): Promise<any> {
  const url = `${HTTP_PREFIX}/workspaces/${wid}/waylines?` + 'order_by=' + body.order_by + '&page=' + body.page + '&page_size=' + body.page_size
  const result = await request.get(url)
  return result.data
}
src/api/websocket.ts
New file
@@ -0,0 +1,30 @@
import ReconnectingWebSocket from 'reconnecting-websocket'
import { CURRENT_CONFIG as config } from '/@/api/http/config'
let socket = {}
export default {
  init (getMsgFunc) {
    const token = localStorage.getItem('x-auth-token')
    const wspath =
      config.websocketURL + '?x-auth-token=' + escape(token)
    socket = new ReconnectingWebSocket(wspath)
    socket.onopen = this.onOpen
    socket.onerror = this.onError
    socket.onmessage = getMsgFunc
    socket.onclose = this.onClose
    return socket
  },
  onOpen () {
    console.log('ws opened')
  },
  onError (err) {
    console.error(err)
  },
  onClose () {
    console.log('ws closed')
  },
  sendMsg (data) {
    this.socket.send(data)
  }
}
src/assets/icons/check.svg
New file
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 61.2 (89653) - https://sketch.com -->
    <title>ic/panel/checkbox_active</title>
    <desc>Created with Sketch.</desc>
    <g id="ic/panel/checkbox_active" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="Group-3" fill="#FFFFFF">
            <polygon id="Shape-Copy" points="11.2103387 4.23529412 6.47425817 8.97137463 4.50089127 6.99800776 2.82352941 8.65563591 4.79689632 10.6290028 6.37558979 12.2076964 6.47425817 12.286631 12.8877005 5.8929223"></polygon>
        </g>
    </g>
</svg>
src/assets/icons/dji-logo-vector.svg
New file
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<svg version="1.1" id="layer" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     viewBox="0 0 652 652" style="enable-background:new 0 0 652 652;" xml:space="preserve">
<style type="text/css">
    .st0{fill:#241F1F;}
</style>
<g>
    <path class="st0" d="M464.9,404.7l44.3-183.9h-95l-40.5,164.9c-5.9,32.2-40.4,47.2-64.9,47.6h-67.3l-22.9,66.3h141.5
        C395,499.6,446.5,481.8,464.9,404.7"/>
    <path class="st0" d="M265.5,339.9L310.1,153h97.8l-50.8,212.6c-9.8,41.1-40.3,50.9-68.5,50.9H63.2c-24.8,0-45.6-10.6-34.4-58
        l20.3-84.8c10.3-43,42.3-52.9,65.4-52.9h157.3l-12.7,53h-80.3c-11.8,0-18.3,2.6-21.6,16.3l-13,54.1c-4.6,19.4,2.2,20.8,16.4,20.8
        h73.6C247.8,365.2,259.6,364.3,265.5,339.9"/>
    <polygon class="st0" points="530.7,220.9 484.6,416.5 579.7,416.5 625.7,220.9     "/>
</g>
</svg>
src/assets/icons/layer.svg
New file
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs><path d="m14.042 0 14.043 8.055-5.128 2.941 5.128 2.941-5.127 2.94 5.127 2.942-14.043 8.055L0 19.82l5.126-2.942L0 13.937l5.127-2.941L0 8.056 14.042 0zM7.638 18.318l-2.614 1.5 9.018 5.175 9.017-5.174-2.614-1.5-6.403 3.674-6.404-3.675zm0-5.882-2.615 1.5 9.02 5.175 9.017-5.173-2.615-1.501-6.403 3.674-6.404-3.675zm6.404-9.554L5.024 8.056l9.018 5.174 9.017-5.174-9.017-5.174z" id="layer_a"></path></defs><g transform="translate(2 2)" fill-rule="evenodd"><mask id="layer_b"><use xlink:href="#layer_a"></use></mask><use fill-rule="nonzero" xlink:href="#layer_a"></use><g mask="url(#layer_b)"><path d="M-19-20h68v68h-68z"></path></g></g>
</svg>
src/assets/icons/media.svg
New file
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
   <defs><path d="M29.5 4v21.5h-4v2H3V8h3V4h23.5zM10.553 18.859 5.5 22.399V25H23v-6.088l-7.011 5.108-5.436-5.161zM27 6.5H8.499L8.5 8h17v15H27V6.5zm-4 4H5.5v8.847l5.293-3.707 5.406 5.133L23 15.819V10.5zm-6.362 1.956a2 2 0 1 1 0 4 2 2 0 0 1 0-4z" id="media_a"></path></defs><g fill-rule="evenodd"><mask id="media_b"><use xlink:href="#media_a"></use></mask><use fill-rule="nonzero" xlink:href="#media_a"></use><g mask="url(#media_b)"><path d="M-17-18h68v68h-68z"></path></g></g>
</svg>
src/assets/icons/pin-19be6b.svg
New file
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 61.2 (89653) - https://sketch.com -->
    <title>2图标/24px/pin</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M6.56239716,0 L13.1247943,9.89949494 L6.56239716,19.7989899 L0,9.89949494 L6.56239716,0 Z M6.56239716,3.61897251 L2.39965953,9.89878783 L6.56239716,16.1786032 L10.7251348,9.89878783 L6.56239716,3.61897251 Z" id="path-1"></path>
    </defs>
    <g id="2图标//24px/pin" stroke="none" stroke-width="1" fill="#19BE6B" fill-rule="evenodd">
        <g id="编组" transform="translate(5.000000, 2.000000)">
            <mask id="mask-2" fill="white">
                <use xlink:href="#path-1"></use>
            </mask>
            <use id="形状" fill="#19BE6B" fill-rule="nonzero" xlink:href="#path-1"></use>
            <g id="1颜色/ic色/nor" mask="url(#mask-2)" fill="#19BE6B">
                <g transform="translate(-26.000000, -26.000000)">
                    <rect x="0" y="0" width="68" height="68"></rect>
                </g>
            </g>
        </g>
    </g>
</svg>
src/assets/icons/pin-212121.svg
New file
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 61.2 (89653) - https://sketch.com -->
    <title>2图标/24px/pin</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M6.56239716,0 L13.1247943,9.89949494 L6.56239716,19.7989899 L0,9.89949494 L6.56239716,0 Z M6.56239716,3.61897251 L2.39965953,9.89878783 L6.56239716,16.1786032 L10.7251348,9.89878783 L6.56239716,3.61897251 Z" id="path-1"></path>
    </defs>
    <g id="2图标//24px/pin" stroke="none" stroke-width="1" fill="#212121" fill-rule="evenodd">
        <g id="编组" transform="translate(5.000000, 2.000000)">
            <mask id="mask-2" fill="white">
                <use xlink:href="#path-1"></use>
            </mask>
            <use id="形状" fill="#212121" fill-rule="nonzero" xlink:href="#path-1"></use>
            <g id="1颜色/ic色/nor" mask="url(#mask-2)" fill="#212121">
                <g transform="translate(-26.000000, -26.000000)">
                    <rect x="0" y="0" width="68" height="68"></rect>
                </g>
            </g>
        </g>
    </g>
</svg>
src/assets/icons/pin-2d8cf0.svg
New file
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 61.2 (89653) - https://sketch.com -->
    <title>2图标/24px/pin</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M6.56239716,0 L13.1247943,9.89949494 L6.56239716,19.7989899 L0,9.89949494 L6.56239716,0 Z M6.56239716,3.61897251 L2.39965953,9.89878783 L6.56239716,16.1786032 L10.7251348,9.89878783 L6.56239716,3.61897251 Z" id="path-1"></path>
    </defs>
    <g id="2图标//24px/pin" stroke="none" stroke-width="1" fill="#2D8CF0" fill-rule="evenodd">
        <g id="编组" transform="translate(5.000000, 2.000000)">
            <mask id="mask-2" fill="white">
                <use xlink:href="#path-1"></use>
            </mask>
            <use id="形状" fill="#2D8CF0" fill-rule="nonzero" xlink:href="#path-1"></use>
            <g id="1颜色/ic色/nor" mask="url(#mask-2)" fill="#2D8CF0">
                <g transform="translate(-26.000000, -26.000000)">
                    <rect x="0" y="0" width="68" height="68"></rect>
                </g>
            </g>
        </g>
    </g>
</svg>
src/assets/icons/pin-b620e0.svg
New file
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 61.2 (89653) - https://sketch.com -->
    <title>2图标/24px/pin</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M6.56239716,0 L13.1247943,9.89949494 L6.56239716,19.7989899 L0,9.89949494 L6.56239716,0 Z M6.56239716,3.61897251 L2.39965953,9.89878783 L6.56239716,16.1786032 L10.7251348,9.89878783 L6.56239716,3.61897251 Z" id="path-1"></path>
    </defs>
    <g id="2图标//24px/pin" stroke="none" stroke-width="1" fill="#b620e0" fill-rule="evenodd">
        <g id="编组" transform="translate(5.000000, 2.000000)">
            <mask id="mask-2" fill="white">
                <use xlink:href="#path-1"></use>
            </mask>
            <use id="形状" fill="#b620e0" fill-rule="nonzero" xlink:href="#path-1"></use>
            <g id="1颜色/ic色/nor" mask="url(#mask-2)" fill="#b620e0">
                <g transform="translate(-26.000000, -26.000000)">
                    <rect x="0" y="0" width="68" height="68"></rect>
                </g>
            </g>
        </g>
    </g>
</svg>
src/assets/icons/pin-e23c39.svg
New file
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 61.2 (89653) - https://sketch.com -->
    <title>2图标/24px/pin</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M6.56239716,0 L13.1247943,9.89949494 L6.56239716,19.7989899 L0,9.89949494 L6.56239716,0 Z M6.56239716,3.61897251 L2.39965953,9.89878783 L6.56239716,16.1786032 L10.7251348,9.89878783 L6.56239716,3.61897251 Z" id="path-1"></path>
    </defs>
    <g id="2图标//24px/pin" stroke="none" stroke-width="1" fill="#e23c39" fill-rule="evenodd">
        <g id="编组" transform="translate(5.000000, 2.000000)">
            <mask id="mask-2" fill="white">
                <use xlink:href="#path-1"></use>
            </mask>
            <use id="形状" fill="#e23c39" fill-rule="nonzero" xlink:href="#path-1"></use>
            <g id="1颜色/ic色/nor" mask="url(#mask-2)" fill="#e23c39">
                <g transform="translate(-26.000000, -26.000000)">
                    <rect x="0" y="0" width="68" height="68"></rect>
                </g>
            </g>
        </g>
    </g>
</svg>
src/assets/icons/pin-ffbb00.svg
New file
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 61.2 (89653) - https://sketch.com -->
    <title>2图标/24px/pin</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M6.56239716,0 L13.1247943,9.89949494 L6.56239716,19.7989899 L0,9.89949494 L6.56239716,0 Z M6.56239716,3.61897251 L2.39965953,9.89878783 L6.56239716,16.1786032 L10.7251348,9.89878783 L6.56239716,3.61897251 Z" id="path-1"></path>
    </defs>
    <g id="2图标//24px/pin" stroke="none" stroke-width="1" fill="#FFBB00" fill-rule="evenodd">
        <g id="编组" transform="translate(5.000000, 2.000000)">
            <mask id="mask-2" fill="white">
                <use xlink:href="#path-1"></use>
            </mask>
            <use id="形状" fill="#FFBB00" fill-rule="nonzero" xlink:href="#path-1"></use>
            <g id="1颜色/ic色/nor" mask="url(#mask-2)" fill="#FFBB00">
                <g transform="translate(-26.000000, -26.000000)">
                    <rect x="0" y="0" width="68" height="68"></rect>
                </g>
            </g>
        </g>
    </g>
</svg>
src/assets/icons/tsa.svg
New file
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <defs>
        <path d="m19.87 10.131-1.01 2.518-.86-.012v-.006l-7.045.002-.068.004a1.75 1.75 0 0 0-1.614 1.737l.006.144.656 8.388h4.804l-1.005 2.5h-6.11l-.168-2.137H.544l-.53-6.896a4.25 4.25 0 0 1 4.03-4.598l.206-.005h2.48a4.25 4.25 0 0 1 .873.09 4.238 4.238 0 0 1 3.089-1.716l.166-.01.166-.003h8.846zm1.106 1.7 5.476 13.566-5.454-1.781-5.497 1.78 5.475-13.565zm.008 4.028.011 6.18H21l2.854.931-2.87-7.111zm-14.21-1.588L4.25 14.27a1.75 1.75 0 0 0-1.75 1.75l.007.153.352 4.597 4.401-.001-.473-6.056a4.3 4.3 0 0 1-.012-.442zM6.193 3.748a3.25 3.25 0 1 1 0 6.5 3.25 3.25 0 0 1 0-6.5zM14.3 0a4.25 4.25 0 1 1 0 8.5 4.25 4.25 0 0 1 0-8.5zM6.192 5.748a1.25 1.25 0 1 0 0 2.5 1.25 1.25 0 0 0 0-2.5zM14.3 2a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5z" id="team_a">
        </path>
    </defs>
    <g transform="translate(3 3)" fill-rule="evenodd">
        <mask id="team_b">
            <use xlink:href="#team_a"></use>
        </mask>
        <use fill-rule="nonzero" xlink:href="#team_a"></use>
        <g mask="url(#team_b)"><path d="M-20-21h68v68h-68z"></path>
    </g></g>
</svg>
src/components/GMap.vue
New file
@@ -0,0 +1,311 @@
<template>
  <div class="g-map-wrapper">
    <div id="g-container" :style="{ width: '100%', height: '100%' }" />
    <div
      class="g-action-panle"
      :style="{ right: drawVisible ? '316px' : '16px' }"
    >
      <div class="g-action-item" @click="draw('pin', true)">
        <a-button type="primary">PIN</a-button>
      </div>
      <div class="g-action-item" @click="draw('polyline', true)">
        <a-button type="primary">Line</a-button>
      </div>
      <div class="g-action-item" @click="draw('polygon', true)">
        <a-button type="primary">Poly</a-button>
      </div>
      <div v-if="mouseMode" class="g-action-item" @click="draw('off', false)">
        <a-button type="primary" danger>X</a-button>
      </div>
    </div>
  </div>
</template>
<script lang="ts">
import { computed, defineComponent, onMounted, reactive, ref, watch } from 'vue'
import {
  generateLineContent,
  generatePointContent,
  generatePolyContent
} from '../utils/map-layer-utils'
import { postElementsReq } from '/@/api/layer'
import { MapDoodleType, MapElementEnum } from '/@/constants/map'
import { useGMapManage } from '/@/hooks/use-g-map'
import { useGMapCover } from '/@/hooks/use-g-map-cover'
import { useMouseTool } from '/@/hooks/use-mouse-tool'
import { getApp } from '/@/root'
import { useMyStore } from '/@/store'
import { GeojsonCoordinate } from '/@/types/map'
import { MapDoodleEnum } from '/@/types/map-enum'
import { PostElementsBody } from '/@/types/mapLayer'
import { uuidv4 } from '/@/utils/uuid'
import { gcj02towgs84, wgs84togcj02 } from '/@/vendors/coordtransform'
export default defineComponent({
  name: 'GMap',
  props: {},
  setup () {
    const useMouseToolHook = useMouseTool()
    const useGMapManageHook = useGMapManage()
    const mouseMode = ref(false)
    const store = useMyStore()
    const state = reactive({
      currentType: '',
      coverIndex: 0
    })
    const shareId = computed(() => {
      return store.state.layerBaseInfo.share
    })
    const defaultId = computed(() => {
      return store.state.layerBaseInfo.default
    })
    const drawVisible = computed(() => {
      return store.state.drawVisible
    })
    watch(
      () => store.state.wsEvent,
      newData => {
        const useGMapCoverHook = useGMapCover()
        const event = newData
        let exist = false
        if (Object.keys(event.mapElementCreat).length !== 0) {
          console.log(event.mapElementCreat)
          const ele = event.mapElementCreat
          store.state.Layers.forEach(layer => {
            layer.elements.forEach(e => {
              if (e.id === ele.id) {
                exist = true
                console.log('true')
              }
            })
          })
          if (exist === false) {
            setLayers({
              id: ele.id,
              name: ele.name,
              resource: ele.resource
            })
            updateCoordinates('wgs84-gcj02', ele)
            useGMapCoverHook.init2DPin(
              ele.name,
              ele.resource.content.geometry.coordinates,
              ele.resource.content.properties.color,
              {
                id: ele.id,
                name: ele.name
              }
            )
          }
          store.state.wsEvent.mapElementCreat = {}
        }
        if (Object.keys(event.mapElementUpdate).length !== 0) {
          console.log(event.mapElementUpdate)
          console.log('该功能还未实现,请开发商自己增加')
          store.state.wsEvent.mapElementUpdate = {}
        }
        if (Object.keys(event.mapElementDelete).length !== 0) {
          console.log(event.mapElementDelete)
          console.log('该功能还未实现,请开发商自己增加')
          store.state.wsEvent.mapElementDelete = {}
        }
      },
      {
        deep: true
      }
    )
    function draw (type: MapDoodleType, bool: boolean) {
      state.currentType = type
      useMouseToolHook.mouseTool(type, getDrawCallback)
      mouseMode.value = bool
    }
    onMounted(() => {
      const app = getApp()
      useGMapManageHook.globalPropertiesConfig(app)
    })
    function getDrawCallback ({ obj }) {
      switch (state.currentType) {
        case MapDoodleEnum.PIN:
          postPinPositionResource(obj)
          break
        case MapDoodleEnum.POLYLINE:
          postPolylineResource(obj)
          break
        case MapDoodleEnum.POLYGON:
          postPolygonResource(obj)
          break
        default:
          break
      }
    }
    async function postPinPositionResource (obj) {
      const req = getPinPositionResource(obj)
      setLayers(req)
      updateCoordinates('gcj02-wgs84', req)
      const result = await postElementsReq(shareId.value, req)
      obj.setExtData({ id: req.id, name: req.name })
      store.state.coverList.push(obj)
      // console.log(store.state.coverList)
    }
    async function postPolylineResource (obj) {
      const req = getPolylineResource(obj)
      setLayers(req)
      updateCoordinates('gcj02-wgs84', req)
      const result = await postElementsReq(shareId.value, req)
      obj.setExtData({ id: req.id, name: req.name })
      store.state.coverList.push(obj)
      // console.log(store.state.coverList)
    }
    async function postPolygonResource (obj) {
      const req = getPoygonResource(obj)
      setLayers(req)
      updateCoordinates('gcj02-wgs84', req)
      const result = await postElementsReq(shareId.value, req)
      obj.setExtData({ id: req.id, name: req.name })
      store.state.coverList.push(obj)
      // console.log(store.state.coverList)
    }
    function getPinPositionResource (obj) {
      const position = obj.getPosition()
      const resource = generatePointContent(position)
      const name = obj._originOpts.title
      const id = uuidv4()
      return {
        id,
        name,
        resource
      }
    }
    function getPolylineResource (obj) {
      const path = obj.getPath()
      const resource = generateLineContent(path)
      const { name, id } = getBaseInfo(obj._opts)
      return {
        id,
        name,
        resource
      }
    }
    function getPoygonResource (obj) {
      const path = obj.getPath()
      const resource = generatePolyContent(path)
      const { name, id } = getBaseInfo(obj._opts)
      return {
        id,
        name,
        resource
      }
    }
    function getBaseInfo (obj) {
      const name = obj.title
      const id = uuidv4()
      return { name, id }
    }
    function setLayers (resource: PostElementsBody) {
      const layers = store.state.Layers
      const layer = layers.find(item => item.id.includes(shareId.value))
      // layer.id = 'private_layer' + uuidv4()
      // layer?.elements.push(resource)
      if (layer?.elements) {
        ;(layer?.elements as any[]).push(resource)
      }
      console.log('layers', layers)
      store.commit('SET_LAYER_INFO', layers)
    }
    function updateCoordinates (transformType: string, element: any) {
      const geoType = element.resource?.content.geometry.type
      const type = element.resource?.type as number
      if (element.resource) {
        if (MapElementEnum.PIN === type) {
          const coordinates = element.resource?.content.geometry
            .coordinates as GeojsonCoordinate
          if (transformType === 'wgs84-gcj02') {
            const transResult = wgs84togcj02(
              coordinates[0],
              coordinates[1]
            ) as GeojsonCoordinate
            element.resource.content.geometry.coordinates = transResult
          } else if (transformType === 'gcj02-wgs84') {
            const transResult = gcj02towgs84(
              coordinates[0],
              coordinates[1]
            ) as GeojsonCoordinate
            element.resource.content.geometry.coordinates = transResult
          }
        } else if (MapElementEnum.LINE === type && geoType === 'LineString') {
          const coordinates = element.resource?.content.geometry
            .coordinates as GeojsonCoordinate[]
          if (transformType === 'wgs84-gcj02') {
            coordinates.forEach(coordinate => {
              coordinate = wgs84togcj02(
                coordinate[0],
                coordinate[1]
              ) as GeojsonCoordinate
            })
          } else if (transformType === 'gcj02-wgs84') {
            coordinates.forEach(coordinate => {
              coordinate = gcj02towgs84(
                coordinate[0],
                coordinate[1]
              ) as GeojsonCoordinate
            })
          }
          element.resource.content.geometry.coordinates = coordinates
        } else if (MapElementEnum.LINE === type && geoType === 'Polygon') {
          const coordinates = element.resource?.content.geometry
            .coordinates[0] as GeojsonCoordinate[]
          if (transformType === 'wgs84-gcj02') {
            coordinates.forEach(coordinate => {
              coordinate = wgs84togcj02(
                coordinate[0],
                coordinate[1]
              ) as GeojsonCoordinate
            })
          } else if (transformType === 'gcj02-wgs84') {
            coordinates.forEach(coordinate => {
              coordinate = gcj02towgs84(
                coordinate[0],
                coordinate[1]
              ) as GeojsonCoordinate
            })
          }
          element.resource.content.geometry.coordinates = [coordinates]
        }
      }
    }
    return {
      draw,
      mouseMode,
      drawVisible
    }
  }
})
</script>
<style lang="scss" scoped>
.g-map-wrapper {
  height: 100%;
  width: 100%;
  .g-action-panle {
    position: absolute;
    top: 16px;
    right: 16px;
    .g-action-item {
      padding-top: 8px;
    }
  }
}
</style>
<style lang="scss">
.amap-logo {
  opacity: 0;
}
.amap-copyright {
  opacity: 0;
}
</style>
src/components/LayersTree.vue
New file
@@ -0,0 +1,217 @@
<template>
  <span>
    <a-tree
      draggable
      :defaultExpandAll="true"
      class="device-map-layers"
      @drop="onDrop"
      v-bind="$attrs"
    >
      <a-tree-node
        :title="layer.name"
        :id="layer.id"
        v-for="layer in getTreeData"
        :key="layer.id"
      >
        <!-- <template #title>
                {{layer.name}}
              </template> -->
        <template v-if="layer.elements">
          <a-tree-node
            v-for="resource in layer.elements"
            :id="getLayerTreeKey('resource', resource.id)"
            :key="getLayerTreeKey('resource', resource.id)"
          >
            <template #title>
              {{ resource.name }}
            </template>
          </a-tree-node>
        </template>
      </a-tree-node>
    </a-tree>
  </span>
</template>
<script lang="ts" setup>
import { computed, defineProps, PropType, reactive } from 'vue'
import { useMyStore } from '/@/store'
import { DropEvent, mapLayer } from '/@/types/mapLayer'
import { getLayerTreeKey } from '/@/utils/layer-tree'
const store = useMyStore()
const props = defineProps({
  layerData: Array as PropType<mapLayer[]>
})
const state = reactive({
  checkedKeys: [] as string[],
  expandedKeys: [] as string[]
})
const getTreeData = computed(() => {
  // console.log('props.treeData', JSON.parse(JSON.stringify(props.layerData)))
  return JSON.parse(JSON.stringify(props.layerData))
})
const shareId = computed(() => {
  return store.state.layerBaseInfo.share
})
const defaultId = computed(() => {
  return store.state.layerBaseInfo.default
})
async function onDrop ({ node, dragNode, dropPosition, dropToGap }: DropEvent) {
  let _treeData = props.layerData || []
  let dragKey = dragNode.eventKey
  dragKey = dragKey.replaceAll('resource__', '')
  const dropPos = node.pos.split('-')
  let dropKey =
    node.eventKey.includes(shareId.value) ||
    node.eventKey.includes(defaultId.value)
      ? node.eventKey
      : node.$parent.eventKey
  if (!dragKey || !dropKey) return
  dropKey = dropKey.replaceAll('resource__', '')
  const loop = (data: mapLayer[], key: string, callback: Function) => {
    data.forEach((item, index, arr) => {
      if (item.id === key) {
        return callback(item, index, arr)
      }
      if (item.elements) {
        return loop(item.elements, key, callback)
      }
    })
  }
  const data = [..._treeData] as mapLayer[]
  // Find dragObject
  let dragObj = {} as mapLayer
  loop(data, dragKey, (item: mapLayer, index: number, arr: mapLayer[]) => {
    arr.splice(index, 1)
    dragObj = item
  })
  if (!dropToGap) {
    // Drop on the content
    loop(data, dropKey, (item: mapLayer) => {
      item.elements = item.elements || []
      // where to insert 示例添加到尾部,可以是随意位置
      item.elements.push(dragObj)
    })
  }
  _treeData = data
  // console.log('_treeData', _treeData)
}
</script>
<style lang="scss">
$antPrefix: 'ant';
.device-map-layers.#{$antPrefix}-tree {
  color: #fff;
  .#{$antPrefix}-tree-checkbox:not(.#{$antPrefix}-tree-checkbox-checked)
    .#{$antPrefix}-tree-checkbox-inner {
    background-color: unset;
  }
  .anticon {
    font-size: 16px;
  }
  // 第一个层级的 li,有左边距 16px
  > li {
    padding-left: 16px;
    padding-right: 16px;
  }
  li {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    padding-top: 0;
    padding-bottom: 0;
    &:first-child {
      padding-top: 4px;
    }
    &.#{$antPrefix}-tree-treenode-disabled
      > .#{$antPrefix}-tree-node-content-wrapper {
      height: 20px;
      span {
        color: #fff;
      }
    }
    > ul {
      width: 100%;
    }
    .#{$antPrefix}-tree-switcher {
      z-index: 1;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    .#{$antPrefix}-tree-checkbox {
      z-index: 1;
    }
    .#{$antPrefix}-tree-checkbox:hover::after,
    .#{$antPrefix}-tree-checkbox-wrapper:hover
      .#{$antPrefix}-tree-checkbox::after {
      visibility: collapse;
    }
    .#{$antPrefix}-tree-title {
      display: block;
    }
    .#{$antPrefix}-tree-node-content-wrapper {
      color: #fff;
      width: calc(100% - 46px);
      flex: 1;
      box-sizing: content-box;
      height: 20px;
      min-width: 0; // 解决文字溢出不会省略的问题
      padding-right: 0;
      &:not([draggable='true']) {
        border-top: 2px transparent solid;
        border-bottom: 2px transparent solid;
      }
      &:hover {
        background-color: transparent;
      }
      > span {
        &::before {
          // position: absolute;
          // right: 0;
          // left: 0;
          height: 28px;
          transition: all 0.3s;
          content: '';
        }
        // 进度条组件需要相对最外层定位,进度条组件的position不能设置为relative
        > *:not(.progress-wrapper) {
          position: relative;
          z-index: 1;
        }
      }
      &.#{$antPrefix}-tree-node-selected {
        background-color: transparent;
        color: #2d8cf0;
        > span {
          &::before {
            background-color: #4f4f4f;
          }
        }
      }
    }
  }
  span.#{$antPrefix}-tree-switcher.#{$antPrefix}-tree-switcher_open
    .#{$antPrefix}-tree-switcher-icon {
    transform: rotate(0deg) !important;
  }
  span.#{$antPrefix}-tree-switcher.#{$antPrefix}-tree-switcher_close
    .#{$antPrefix}-tree-switcher-icon {
    transform: rotate(0deg) !important;
  }
}
</style>
src/components/MediaPanel.vue
New file
@@ -0,0 +1,92 @@
<template>
  <div class="media-panel-wrapper">
    <div class="header">Media</div>
    <a-button type="primary" style="margin-top:20px" @click="onRefresh"
      >Refresh</a-button
    >
    <a-table class="media-table" :columns="columns" :data-source="data">
      <template #name="{ text, record }">
        <a :href="record.preview_url">{{ text }}</a>
      </template>
      <template #action>
        <span class="action-area">
          action
        </span>
      </template>
    </a-table>
  </div>
</template>
<script setup lang="ts">
import { ref } from '@vue/reactivity'
import { getMediaFiles } from '/@/api/media'
const columns = [
  {
    title: 'FileName',
    dataIndex: 'name',
    key: 'name',
    slots: { customRender: 'name' }
  },
  {
    title: 'FileSize',
    dataIndex: 'size',
    key: 'size'
  },
  {
    title: 'PayloadType',
    dataIndex: 'payload_type',
    key: 'payload_type',
    ellipsis: true
  },
  {
    title: 'Action',
    key: 'action',
    slots: { customRender: 'action' }
  }
]
const data = ref([
  {
    key: '1',
    name: 'name1',
    size: 32,
    payload_type: 'PM320_DUAL',
    preview_url: ''
  }
])
const onRefresh = async () => {
  const wid = localStorage.getItem('workspace-id')
  data.value = []
  const index = 1
  const res = await getMediaFiles(wid, {})
  res.data.forEach(ele => {
    data.value.push({
      key: index.toString(),
      name: ele.file_name
    })
  })
  console.log(res)
}
</script>
<style lang="scss" scoped>
.media-panel-wrapper {
  width: 100%;
  .media-table {
    background: #fff;
    margin-top: 32px;
  }
  .header {
    width: 100%;
    height: 60px;
    background: #fff;
    padding: 16px 24px;
    font-size: 20px;
    text-align: start;
    color: #000;
  }
  .action-area {
    color: $primary;
    cursor: pointer;
  }
}
</style>
src/components/svgIcon.vue
New file
@@ -0,0 +1,42 @@
<template>
  <svg :class="svgClass" :aria-hidden="true" :style="{color: color, width:computedWidth, height:computedWidth}">
    <use :xlink:href="iconName" :fill="color"/>
  </svg>
</template>
<script setup>
import { defineProps, computed } from 'vue'
const props = defineProps({
  name: {
    type: String,
    required: true
  },
  color: {
    type: String,
    default: ''
  },
  size: {
    type: Number,
  },
})
const iconName = computed(() => `#icon-${props.name}`)
const svgClass = computed(() => {
  console.log(props.name, 'props.name')
  if (props.name) {
    return `svg-icon icon-${props.name}`
  }
  return 'svg-icon'
})
const computedWidth = computed(() => {
  const result = props.width || props.size
  return result ? result + 'px' : '1em'
})
</script>
<style lang='scss'>
.svg-icon {
  width: 1em;
  height: 1em;
  fill: currentColor;
  vertical-align: middle;
}
</style>
src/components/wayline-panel.vue
New file
@@ -0,0 +1,122 @@
<template>
  <div class="panel-wrapper">
    <div class="header">Wayline Library</div>
    <a-button type="primary" style="margin-top:20px" @click="onRefresh"
      >Refresh</a-button
    >
    <a-table class="table" :columns="columns" :data-source="data">
      <template #name="{ text, record }">
        <a :href="record.preview_url">{{ text }}</a>
      </template>
      <template #action>
        <span class="action-area">
          action
        </span>
      </template>
    </a-table>
  </div>
</template>
<script setup lang="ts">
import { ref } from '@vue/reactivity'
import { onMounted } from 'vue'
import { getWaylineFiles } from '/@/api/wayline'
const columns = [
  {
    title: 'FileName',
    dataIndex: 'name',
    key: 'name',
    slots: { customRender: 'name' }
  },
  {
    title: 'TemplateType',
    dataIndex: 'template_type',
    key: 'template_type'
  },
  {
    title: 'Favorited',
    dataIndex: 'favorite',
    key: 'favorite'
  },
  {
    title: 'DroneType',
    dataIndex: 'drone_type',
    key: 'drone_type'
  },
  {
    title: 'PayloadType',
    dataIndex: 'payload_type',
    key: 'payload_type'
  },
  {
    title: 'User',
    dataIndex: 'user',
    key: 'user'
  },
  {
    title: 'Action',
    key: 'action',
    slots: { customRender: 'action' }
  }
]
const data = ref([
  {
    key: '1',
    name: 'name1',
    template_type: '0',
    drone_type: '0-60-0',
    payload_type: 'PM320_DUAL',
    user: 'pilot',
    favorited: 'true'
  }
])
onMounted(() => {
  onRefresh()
})
const onRefresh = async () => {
  const wid: string = localStorage.getItem('workspace-id')
  data.value = []
  const index = 1
  const res = await getWaylineFiles(wid, {
    page: 1, // 页数
    page_size: 9, // 每页大小
    order_by: 'update_time desc' // 排序, xxx_column_desc, xxx_column_asc,  xxx_column(default asc)
  })
  console.log(res)
  res.data.list.forEach(ele => {
    data.value.push({
      key: index.toString(),
      name: ele.name,
      template_type: ele.template_types[0],
      drone_type: ele.drone_model_key,
      payload_type: ele.payload_model_keys[0],
      user: ele.user_name,
      favorite: ele.favorited.toString()
    })
  })
  console.log('wayline files:', data.value)
}
</script>
<style lang="scss" scoped>
.panel-wrapper {
  width: 100%;
  .table {
    background: #fff;
    margin-top: 32px;
  }
  .header {
    width: 100%;
    height: 60px;
    background: #fff;
    padding: 16px 24px;
    font-size: 20px;
    text-align: start;
    color: #000;
  }
  .action-area {
    color: $primary;
    cursor: pointer;
  }
}
</style>
src/constants/index.ts
New file
@@ -0,0 +1,19 @@
export const AMapConfig = {
  key: '26d54da6733de88435c68d1a2e88b682',
  version: '2.0',
  plugins: [
    'AMap.Scale',
    'AMap.ToolBar',
    'AMap.ControlBar',
    'AMap.ElasticMarker',
    'AMap.MapType',
    'AMap.Geocoder',
    'AMap.CircleEditor',
    'AMap.PolygonEditor',
    'AMap.PolylineEditor',
    'AMap.PolyEditor',
    'AMap.RangingTool',
    'AMap.Weather',
    'AMap.MouseTool'
  ]
}
src/constants/map.ts
New file
@@ -0,0 +1,23 @@
export enum MapElementColor {
    Blue = '#2D8CF0',
    Green = '#19BE6B',
    Yellow = '#FFBB00',
    Red = '#E23C39',
    Orange = '#B620E0',
    Default = '#212121'
  }
export const MapElementDefaultColor = MapElementColor.Default
export enum MapDoodleColor {
  PinColor = '#2D8CF0',
  PolylineColor = '#3366FF',
  PolygonColor = '#FF33FF'
}
export enum MapElementEnum {
  PIN = 0,
  LINE = 1,
  POLY = 2
}
export type MapDoodleType = 'pin' | 'polyline' | 'polygon' | 'off'
src/constants/mock-layers.ts
New file
@@ -0,0 +1,138 @@
export const mapLayers = {
  code: 0,
  message: 'success',
  data: {
    list: [{
      id: 'private_layer',
      name: 'Private Layer',
      order: 0,
      is_distributed: false,
      type: 1,
      is_lock: false,
      create_time: 1634268707424,
      elements: [{
        id: 'b2370d29-be65-42b0-9224-4d816e86dc64',
        name: 'xuejia n. 1',
        order: 0,
        status: 1,
        display: 1,
        resource: {
          content: {
            type: 'Feature',
            properties: {
              color: '#2D8CF0'
            },
            geometry: {
              type: 'Polygon',
              coordinates: [
                [
                  [114.156671, 38.468249],
                  [114.139517, 37.372177],
                  [115.52899, 37.712212]
                ]
              ]
            }
          },
          type: 4,
          user_name: 'xuejia n.',
          user_id: '1402914943455727616'
        },
        update_time: 1636966336566,
        create_time: 1636966325700,
        elevation_load_status: 0,
        icon: 'area'
      }, {
        id: '768e9fcd-121f-47a6-96b9-f1aee27d32f0',
        name: 'xuejia n. 1',
        order: 0,
        status: 1,
        display: 1,
        resource: {
          content: {
            type: 'Feature',
            properties: {
              color: '#2D8CF0'
            },
            geometry: {
              type: 'LineString',
              coordinates: [
                [116.263962, 40.234929],
                [116.503006, 40.237026],
                [116.335465, 40.155206],
                [116.541458, 40.12371]
              ]
            }
          },
          type: 4,
          user_name: 'xuejia n.',
          user_id: '1402914943455727616'
        },
        update_time: 1636966322636,
        create_time: 1636966316803,
        elevation_load_status: 0,
        icon: 'line'
      }, {
        id: '4e741a76-3600-4af5-ace8-d805e7cd31fa',
        name: 'xuejia n. 2',
        order: 0,
        status: 1,
        display: 1,
        resource: {
          content: {
            type: 'Feature',
            properties: {
              color: '#2D8CF0',
              clampToGround: true
            },
            geometry: {
              type: 'Point',
              coordinates: [116.098223, 39.976538, 104]
            }
          },
          type: 6,
          user_name: 'xuejia n.',
          user_id: '1402914943455727616'
        },
        update_time: 1636966305229,
        create_time: 1636966305229,
        elevation_load_status: 0,
        icon: 'pin'
      }, {
        id: 'efff2b5d-de22-4d48-8d92-4f53170668f6',
        name: 'xuejia n. 1',
        order: 0,
        status: 1,
        display: 1,
        resource: {
          content: {
            type: 'Feature',
            properties: {
              color: '#19BE6B',
              clampToGround: true
            },
            geometry: {
              type: 'Point',
              coordinates: [113.35367028239645, 23.755194000519843, 22]
            }
          },
          type: 6,
          user_name: 'xuejia n.',
          user_id: '1402914943455727616'
        },
        update_time: 1636966304432,
        create_time: 1636966299455,
        elevation_load_status: 0,
        icon: 'pin'
      }]
    }, {
      id: 'share_layer',
      name: 'Share Layer',
      order: 0,
      is_distributed: true,
      type: 2,
      is_lock: false,
      create_time: 1634268707414,
      elements: []
    }]
  }
}
src/env.d.ts
New file
@@ -0,0 +1,9 @@
// Environment variable definition
// https://cn.vitejs.dev/guide/env-and-mode.html#env-files
interface ImportMetaEnv {
  VITE_APP_ENVIRONMENT: 'DEV' | 'STAG' | 'UAT' | 'PROD',
  // api gateway
  VITE_APP_APIGATEWAY_BACKEND_HOST: string
  // More environment variables...
}
src/hooks/use-g-map-cover.ts
New file
@@ -0,0 +1,144 @@
import pin19be6b from '/@/assets/icons/pin-19be6b.svg'
import pin212121 from '/@/assets/icons/pin-212121.svg'
import pin2d8cf0 from '/@/assets/icons/pin-2d8cf0.svg'
import pinb620e0 from '/@/assets/icons/pin-b620e0.svg'
import pine23c39 from '/@/assets/icons/pin-e23c39.svg'
import pineffbb00 from '/@/assets/icons/pin-ffbb00.svg'
import { getRoot } from '/@/root'
import rootStore from '/@/store'
import { GeojsonCoordinate } from '/@/types/map'
export function useGMapCover () {
  const root = getRoot()
  const AMap = root.$aMapObj
  const normalColor = '#2D8CF0'
  const store = rootStore
  const coverList = store.state.coverList
  function AddCoverToMap (cover :any) {
    root.$aMap.add(cover)
    coverList.push(cover)
    // console.log('coverList:', store.state.coverList)
  }
  function getPinIcon (color?:string) {
    // console.log('color', color)
    const colorObj: {
      [key: number| string]: any
    } = {
      '2d8cf0': pin2d8cf0,
      '19be6b': pin19be6b,
      212121: pin212121,
      b620e0: pinb620e0,
      e23c39: pine23c39,
      ffbb00: pineffbb00,
    }
    const iconName = (color?.replaceAll('#', '') || '').toLocaleLowerCase()
    return new AMap.Icon({
      // size: new AMap.Size(40, 50),
      image: colorObj[iconName],
      // imageOffset: new AMap.Pixel(0, -60),
      // 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({
      position: new AMap.LngLat(coordinates[0], coordinates[1]),
      title: name,
      icon: getPinIcon(color),
      // strokeColor: color || normalColor,
      // fillColor: color || normalColor,
      extData: data
    })
    // console.log('coordinates pin', pin)
    AddCoverToMap(pin)
  }
  function AddOverlayGroup (overlayGroup) {
    root.$aMap.add(overlayGroup)
    coverList.push(overlayGroup)
  }
  function initPolyline (name: string, coordinates:GeojsonCoordinate[], color?:string, data?:{}) {
    const path = [] as GeojsonCoordinate[]
    coordinates.forEach(coordinate => {
      path.push(new AMap.LngLat(coordinate[0], coordinate[1]))
    })
    const polyline = new AMap.Polyline({
      path: path,
      strokeColor: color || normalColor,
      strokeOpacity: 1,
      strokeWeight: 2,
      strokeStyle: 'solid',
      extData: data
      // draggable: true,
    })
    AddOverlayGroup(polyline)
  }
  function initPolygon (name: string, coordinates:GeojsonCoordinate[], color?:string, data?:{}) {
    const path = [] as GeojsonCoordinate[]
    coordinates.forEach(coordinate => {
      path.push(new AMap.LngLat(coordinate[0], coordinate[1]))
    })
    // console.log('Polygon', path)
    const Polygon = new AMap.Polygon({
      path: path,
      strokeOpacity: 1,
      strokeWeight: 2,
      fillColor: color || normalColor,
      fillOpacity: 0.4,
      // draggable: true,
      strokeColor: color || normalColor,
      extData: data
    })
    AddOverlayGroup(Polygon)
  }
  function removeCoverFromMap (id:string) {
    for (let i = 0; i < coverList.length; i++) {
      const ele = coverList[i]
      // console.log(ele)
      const extdata = ele?.getExtData()
      if (extdata?.id === id) {
        console.log(extdata)
        root.$aMap.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)
    // console.log('end', new Date().getTime())
    return ele
    // coverList.forEach((ele:any) => {
    //   const extdata = ele?.getExtData()
    //   // console.log(extdata)
    //   if (extdata?.id === id) {
    //     return ele
    //   }
    // })
  }
  function updatePinElement (id:string, name: string, coordinates:GeojsonCoordinate, color?:string) {
    const element = getElementFromMap(id) as any
    if (element) {
      const icon = getPinIcon(color)
      element.setPosition(new AMap.LngLat(coordinates[0], coordinates[1]))
      element.setIcon(icon)
      element.setTitle(name)
    } else {
      // console.log('into init PIN')
      init2DPin(name, coordinates, color, {
        id: id,
        name: name
      })
    }
  }
  return {
    init2DPin,
    initPolyline,
    initPolygon,
    removeCoverFromMap,
    getElementFromMap,
    updatePinElement
  }
}
src/hooks/use-g-map.ts
New file
@@ -0,0 +1,34 @@
import AMapLoader from '@amap/amap-jsapi-loader'
import { App, reactive } from 'vue'
import { AMapConfig } from '/@/constants/index'
export function useGMapManage () {
  const state = reactive({
    mapEntity: null,
    mapObj: null,
    mouseTool: null,
  })
  async function initMap (container: string, app:App) {
    AMapLoader.load({
      ...AMapConfig
    }).then((AMap) => {
      state.mapObj = AMap
      state.mapEntity = 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
      app.config.globalProperties.$mouseTool = state.mouseTool
    }).catch(e => {
      console.log(e)
    })
  }
  function globalPropertiesConfig (app:App) {
    initMap('g-container', app)
  }
  return {
    globalPropertiesConfig,
  }
}
src/hooks/use-mouse-tool.ts
New file
@@ -0,0 +1,71 @@
import { reactive } from 'vue'
import pin2d8cf0 from '/@/assets/icons/pin-2d8cf0.svg'
import { MapDoodleType } from '/@/constants/map'
import { getRoot } from '/@/root'
import { MapDoodleEnum } from '/@/types/map-enum'
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,
      icon: pin2d8cf0,
    })
    state.pinNum++
    root?.$mouseTool.on('draw', getDrawCallback)
  }
  function drawPolyline (type:MapDoodleType, getDrawCallback:Function) {
    root?.$mouseTool.polyline({
      strokeColor: '#2d8cf0',
      strokeOpacity: 1,
      strokeWeight: 2,
      strokeStyle: 'solid',
      draggable: true,
      title: type + state.polylineNum++
    })
    root?.$mouseTool.on('draw', getDrawCallback)
  }
  function drawPolygon (type:MapDoodleType, getDrawCallback:Function) {
    root?.$mouseTool.polygon({
      strokeColor: '#2d8cf0',
      strokeOpacity: 1,
      strokeWeight: 2,
      fillColor: '#1791fc',
      fillOpacity: 0.4,
      draggable: true,
      title: type + state.PolygonNum++
    })
    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) {
      case MapDoodleEnum.PIN:
        drawPin(type, getDrawCallback)
        break
      case MapDoodleEnum.POLYLINE:
        drawPolyline(type, getDrawCallback)
        break
      case MapDoodleEnum.POLYGON:
        drawPolygon(type, getDrawCallback)
        break
      case MapDoodleEnum.Close:
        drawOff(type)
        break
    }
  }
  return {
    mouseTool
  }
}
src/main.ts
New file
@@ -0,0 +1,14 @@
import App from './App.vue'
import router from './router'
import { antComponents } from './antd'
import { CommonComponents } from './use-common-components'
import 'virtual:svg-icons-register'
import store, { storeKey } from './store'
import { createInstance } from '/@/root'
import '/@/styles/index.scss'
const app = createInstance(App)
app.use(store, storeKey)
app.use(router)
app.use(CommonComponents)
app.use(antComponents)
app.mount('#demo-app')
src/pages/elements/elements.vue
New file
@@ -0,0 +1,21 @@
<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>
src/pages/page-pilot/pilot-home.vue
New file
@@ -0,0 +1,150 @@
<template>
  <div class="page">
    <div class="left flex-column flex-justify-start flex-align-center">
      <p class="fz26 mb0 mt10" style="color: #727272">
        {{ platformName }}
      </p>
      <p class="fz16 ml10 mb0 mt10" style="color: #2d8cf0">
        status:{{ connect }}
      </p>
      <p class="fz32 mb0 mt50" style="color: #000000">{{ workspaceName }}</p>
      <a-button
        class="fz20 mt20 flex-column flex-justify-center flex-align-center"
        style="width: 30vw; height: 12vh;"
        type="default"
        @click="onOpen3rdApp"
        >Open 3rd Party APP</a-button
      >
      <a-button
        class="fz20"
        style="width: 15vw; height: 12vh; position: fixed; bottom: 7vh"
        type="primary"
        @click="onExit"
        >Quit</a-button
      >
    </div>
    <div class="right flex-column flex-justify-start flex-align-center">
      <p class="fz24 mb0 mt10 ">Setting</p>
      <a-button class="mt10 fz16" style="width:90%" @click="onMediaSetting"
        >Media File Upload Setting</a-button
      >
      <a-button class="mt10 fz16" style="width:90%" @click="onLiveshareSetting"
        >Manual Live Share Setting</a-button
      >
    </div>
  </div>
</template>
<script lang="ts" setup>
import { message } from 'ant-design-vue'
import { onMounted, ref } from 'vue'
import { CURRENT_CONFIG } from '/@/api/http/config'
import { getPlatformInfo, getUserInfo } from '/@/api/manage'
import apiPilot from '/@/api/pilot-bridge'
import { getRoot } from '/@/root'
const root = getRoot()
const connect = ref('Disconnect')
const platformName = ref('Unknown')
const workspaceName = ref('Unknown')
const workspaceDesc = ref('Unknown')
const wsId = ref()
onMounted(() => {
  apiPilot.init()
  const token = apiPilot.getToken()
  if (token) {
    getPlatformInfo({}).then(res => {
      console.log(res)
      platformName.value = res.data.platform_name
      workspaceName.value = res.data.workspace_name
      workspaceDesc.value = res.data.workspace_desc
      wsId.value = res.data.workspace_id
      apiPilot.setPlatformMessage(
        platformName.value,
        workspaceName.value,
        workspaceDesc.value
      )
      apiPilot.setWorkspaceId(wsId.value)
    })
  }
  if (JSON.parse(apiPilot.isComponentLoaded('thing')).data === false || token) {
    getUserInfo({}).then(res => {
      const param = {
        host: res.data.mqtt_addr,
        username: res.data.mqtt_username,
        password: res.data.mqtt_password,
        connectCallback: 'connectCallback'
      }
      apiPilot.setComponentParam('thing', param)
      apiPilot.loadComponent('thing', apiPilot.getComponentParam('thing'))
    })
  } else {
    const connectState = JSON.parse(window.djiBridge.thingGetConnectState())
    if (connectState.code === 0 && connectState.data) {
      connect.value = 'Connected'
    } else {
      connect.value = 'Disconnect'
    }
  }
  apiPilot.loadComponent('liveshare', apiPilot.getComponentParam('liveshare'))
  console.log('ws token:', token)
  apiPilot.setComponentParam('ws', {
    host: CURRENT_CONFIG.websocketURL,
    token: token
  })
  apiPilot.loadComponent('ws', apiPilot.getComponentParam('ws'))
  apiPilot.setComponentParam('map', {
    userName: 'pilot1',
    elementPreName: 'PILOT'
  })
  apiPilot.loadComponent('map', apiPilot.getComponentParam('map'))
  apiPilot.loadComponent('tsa', apiPilot.getComponentParam('tsa'))
  apiPilot.loadComponent('media', apiPilot.getComponentParam('media'))
  apiPilot.loadComponent('mission', {})
  window.connectCallback = arg => {
    connectCallback(arg)
  }
  apiPilot.onBackClickReg()
})
const connectCallback = (arg: any) => {
  console.info('into callback', arg)
  if (arg) {
    connect.value = 'Connected'
    window.djiBridge.mediaSetDownloadOwner(0)
    window.djiBridge.mediaSetUploadPhotoType(1)
  } else {
    connect.value = 'Disconnect'
  }
}
const onExit = async (e: any) => {
  apiPilot.stopwebview()
}
const onMediaSetting = async (e: any) => {
  root.$router.push('/pilot-media')
}
const onLiveshareSetting = async (e: any) => {
  root.$router.push('/pilot-liveshare')
}
const onOpen3rdApp = () => {
  window.open('mydjischeme://www.dji.com')
}
</script>
<style lang="scss" scoped>
@import '/@/styles/index.scss';
.page {
  display: flex;
  position: absolute;
  transition: width 0.2s ease;
  height: 100%;
  width: 100%;
  .left {
    width: 50%;
    border-right: red solid 2px;
  }
  .right {
    width: 100%;
    height: 100%;
  }
}
</style>
src/pages/page-pilot/pilot-index.vue
New file
@@ -0,0 +1,145 @@
<template>
  <div class="login flex-column flex-justify-center flex-align-center m0 b0">
    <a-image
      style="width: 17vw; height: 10vw; margin-bottom: 50px"
      src="http://lofrev.net/wp-content/photos/2016/09/dji_logo_png.png"
    />
    <p class="logo fz35 pb50">Pilot Cloud API Demo</p>
    <a-form
      layout="inline"
      :model="formState"
      class="flex-row flex-justify-center flex-align-center"
    >
      <a-form-item>
        <a-input v-model:value="formState.user" placeholder="Username">
          <template #prefix
            ><UserOutlined style="color: rgba(0, 0, 0, 0.25)"
          /></template>
        </a-input>
      </a-form-item>
      <a-form-item>
        <a-input
          v-model:value="formState.password"
          type="password"
          placeholder="Password"
        >
          <template #prefix
            ><LockOutlined style="color: rgba(0, 0, 0, 0.25)"
          /></template>
        </a-input>
      </a-form-item>
      <a-form-item>
        <a-button
          class="m0"
          type="primary"
          html-type="submit"
          :disabled="formState.user === '' || formState.password === ''"
          @click="onSubmit"
        >
          Login
        </a-button>
      </a-form-item>
    </a-form>
  </div>
</template>
<script lang="ts" setup>
import { LockOutlined, UserOutlined } from '@ant-design/icons-vue'
import { message } from 'ant-design-vue'
import { onMounted, reactive, UnwrapRef } from 'vue'
import { CURRENT_CONFIG } from '/@/api/http/config'
import { login, refreshToken } from '/@/api/manage'
import apiPilot from '/@/api/pilot-bridge'
import { getRoot } from '/@/root'
interface FormState {
  user: string
  password: string
}
const root = getRoot()
const formState: UnwrapRef<FormState> = reactive({
  user: 'pilot',
  password: 'pilot123'
})
let isVerified:any
onMounted(async () => {
  const verifyLicense = JSON.parse(apiPilot.platformVerifyLicense(CURRENT_CONFIG.appId,
    CURRENT_CONFIG.appKey, CURRENT_CONFIG.appLicense))
  const platformVerify = JSON.parse(apiPilot.isPlatformVerifySuccess())
  isVerified = platformVerify.data
  if (platformVerify.data === true) {
    message.success('The license verification is successful.')
  } else {
    message.error('Filed to verify the license. message is ' + verifyLicense.data)
    return
  }
  const token = apiPilot.getToken()
  console.log('api token:', token)
  apiPilot.setPlatformMessage('Cloud Api Platform', '', '')
  if (token && token !== undefined) {
    await refreshToken({})
      .then(res => {
        apiPilot.setComponentParam('api', {
          host: CURRENT_CONFIG.baseURL,
          token: res.data.access_token
        })
        const jsres = JSON.parse(
          apiPilot.loadComponent('api', apiPilot.getComponentParam('api'))
        )
        console.log('load api module status:', jsres)
        apiPilot.setToken(res.data.access_token)
        localStorage.setItem('x-auth-token', res.data.access_token)
        message.success('Login Success')
        root.$router.push('/pilot-home')
      })
      .catch(err => {
        console.error(err)
      })
  }
})
const onSubmit = async (e: any) => {
  await login({
    username: formState.user,
    password: formState.password
  })
    .then(res => {
      if (!isVerified) {
        message.error('Please verify the license firstly.')
        return
      }
      console.log('login res:', res)
      if (res.code === 0) {
        apiPilot.setComponentParam('api', {
          host: CURRENT_CONFIG.baseURL,
          token: res.data.access_token
        })
        const jsres = apiPilot.loadComponent(
          'api',
          apiPilot.getComponentParam('api')
        )
        console.log('load api module res:', jsres)
        apiPilot.setToken(res.data.access_token)
        localStorage.setItem('x-auth-token', res.data.access_token)
        localStorage.setItem('workspace-id', res.data.workspace_id)
        localStorage.setItem('username', res.data.username)
        message.success('Login Success')
        root.$router.push('/pilot-home')
      }
    })
    .catch(err => {
      console.error(err)
    })
}
</script>
<style lang="scss" scoped>
@import '/@/styles/index.scss';
.login {
  // background-color: $dark-highlight;
  height: 100vh;
}
.logo {
  color: $primary;
}
</style>
src/pages/page-pilot/pilot-liveshare.vue
New file
@@ -0,0 +1,202 @@
<template>
  <div
    class="width-100vw height-100vh flex-column flex-justify-start flex-align-start"
  >
    <div
      class="mt20 flex-row flex-align-center flex-justify-between"
      style="width: 100%"
    >
      <p class="ml10 mb0 fz16" style="color: black">
        Select Video Publish Mode:
      </p>
      <a-select
        style="width: 200px"
        placeholder="Select Mode"
        @select="onPublishModeSelect"
      >
        <a-select-option
          v-for="item in publishModeList"
          :key="item.label"
          :value="item.value"
        >
          {{ item.label }}
        </a-select-option>
      </a-select>
    </div>
    <a-divider dashed class="mt10 mb0"></a-divider>
    <div
      class="flex-row flex-align-center flex-justify-between mt10"
      style="width: 100%"
    >
      <p class="ml10 mb0 fz16" style="color: black">Select Live Share Type:</p>
      <a-select
        style="width: 200px"
        placeholder="Select Live Type"
        @select="onLiveTypeSelect"
      >
        <a-select-option
          v-for="item in liveTypeList"
          :key="item.label"
          :value="item.value"
        >
          {{ item.label }}
        </a-select-option>
      </a-select>
    </div>
    <a-divider dashed class="mt10 mb0"></a-divider>
    <div
      class="flex-row flex-align-center flex-justify-center mt20"
      style="width: 100%"
    >
      <p>Live Share State: {{ liveState }}</p>
    </div>
    <div
      class="flex-row flex-align-center flex-justify-center mt20"
      style="width: 100%"
    >
      <a-button type="primary" @click="onPlay">Play</a-button>
      <a-button class="ml20" type="primary" @click="onGetConfig"
        >Get Config</a-button
      >
      <a-button class="ml20" type="primary" @click="onGetStatus"
        >Get Status</a-button
      >
    </div>
  </div>
</template>
<script lang="ts" setup>
import { message } from 'ant-design-vue'
import { onMounted, ref } from 'vue'
import { CURRENT_CONFIG as config } from '/@/api/http/config'
import apiPilot from '/@/api/pilot-bridge'
import { getRoot } from '/@/root'
const root = getRoot()
const publishModeList = [
  {
    value: 'video-on-demand',
    label: 'video-on-demand'
  },
  {
    value: 'video-by-manual',
    label: 'video-by-manual'
  },
  {
    value: 'video-demand-aux-manual',
    label: 'video-demand-aux-manual'
  }
]
const liveTypeList = [
  {
    value: 1,
    label: 'AGORA'
  },
  {
    value: 2,
    label: 'RTMP'
  },
  {
    value: 3,
    label: 'RTSP'
  },
  {
    value: 4,
    label: 'GB28181'
  }
]
const agoraParam = {
  uid: config.agoraAPPID,
  token: config.agoraToken,
  channelId: config.agoraChannel
}
const rtmpParam = {
  url: config.rtmpURL + '12345'
}
const rtspParam = {
  userName: 'dji-live-share',
  password: '12345678',
  port: '8554'
}
const gb28181Param = {
  serverIp: '114.55.103.238',
  serverPort: '5060',
  serverId: '34020000002000000001',
  agentId: '34020000001310000004',
  password: '12345678',
  agentPort: '7060',
  agentChannel: '34020000001310000004'
}
const liveState = ref<string>('STOP')
const livetypeSelected = ref<number>(1)
const publishModeSelected = ref<string>('video-demand-aux-manual')
onMounted(() => {
  const status: any = apiPilot.getLiveshareStatus()
  console.log(status)
  // liveState.value =
  //   status.status === 0
  //     ? 'Cannot connect to server'
  //     : status.status === 1
  //       ? 'Connect to server'
  //       : 'Playing'
  // console.log(liveState.value)
})
const onLiveTypeSelect = (val: any) => {
  livetypeSelected.value = val
  message.info('set livetype:' + livetypeSelected.value, 5)
}
const onPublishModeSelect = (val: string) => {
  publishModeSelected.value = val
  message.info(
    'set publish mode res:' +
      apiPilot.setVideoPublishType(publishModeSelected.value),
    5
  )
}
const onPlay = () => {
  switch (livetypeSelected.value) {
    case 1: {
      message.info('agoraParam:' + JSON.stringify(agoraParam))
      apiPilot.setLiveshareConfig(1, JSON.stringify(agoraParam))
      apiPilot.startLiveshare()
      break
    }
    case 2: {
      message.info('rtmpParam:' + JSON.stringify(rtmpParam))
      apiPilot.setLiveshareConfig(2, JSON.stringify(rtmpParam))
      message.info(apiPilot.startLiveshare())
      break
    }
    case 3: {
      message.info('rtspParam:' + JSON.stringify(rtspParam))
      apiPilot.setLiveshareConfig(3, JSON.stringify(rtspParam))
      apiPilot.startLiveshare()
      break
    }
    case 4: {
      message.info('gb28181Param:' + JSON.stringify(gb28181Param))
      apiPilot.setLiveshareConfig(4, JSON.stringify(gb28181Param))
      apiPilot.startLiveshare()
      break
    }
  }
}
const onGetStatus = () => {
  const status = apiPilot.getLiveshareStatus()
  message.info(status, 5)
}
const onGetConfig = () => {
  const status = apiPilot.getLiveshareConfig()
  message.info(status, 5)
}
</script>
<style lang="scss" scoped>
// @import '/@/styles/index.scss';
</style>
src/pages/page-pilot/pilot-media.vue
New file
@@ -0,0 +1,130 @@
<template>
  <div
    class="width-100vw height-100vh flex-column flex-justify-start flex-align-start"
  >
    <p class="fz16 ml10 mt10 mb10 color-text-title color-font-bold">
      If Enabled, Pilot will upload photos or videos to the server
      automatically.
    </p>
    <div
      class="flex-row flex-align-center flex-justify-between"
      style="width: 100%"
    >
      <p class="ml10 mb0 fz16" style="color: black">Auto Upload Photos</p>
      <a-switch
        class="mt0 mb0"
        v-model:checked="enablePhotoUpload"
        @change="onPhotoUpload"
      ></a-switch>
    </div>
    <div
      class="flex-row flex-align-center flex-justify-between"
      style="width: 100%"
    >
      <a-radio-group
        class="mt10 ml20"
        v-if="enablePhotoUpload == true"
        v-model:value="photoType"
        defaultChecked="0"
        @change="onPhototype"
      >
        <a-radio :value="0">Original Photo</a-radio>
        <a-radio class="ml20" :value="1">Preview Photo</a-radio>
      </a-radio-group>
    </div>
    <a-divider dashed class="mt10 mb0"></a-divider>
    <div
      class="flex-row flex-align-center flex-justify-between mt10"
      style="width: 100%"
    >
      <p class="ml10 mb0 fz16" style="color: black">Auto Upload Video</p>
      <a-switch
        @change="onVideoUpload"
        v-model:checked="enableVideoUpload"
      ></a-switch>
    </div>
    <a-divider dashed class="mt10 mb0"></a-divider>
    <div
      class="flex-row flex-align-center flex-justify-between mt20"
      style="width: 100%"
    >
      <p class="ml10 mb0 fz16 color-font-bold" style="color: black">
        Path for uploading media resources in dual-controller mode
      </p>
      <a-radio-group
        class="mt0 mb0"
        v-model:value="uploadPath"
        button-style="solid"
        @change="onUploadPath"
      >
        <a-radio-button :value="0">Mine</a-radio-button>
        <a-radio-button :value="1">Another</a-radio-button>
      </a-radio-group>
    </div>
  </div>
</template>
<script lang="ts" setup>
import { message } from 'ant-design-vue'
import { onMounted, ref } from 'vue'
import apiPilot from '/@/api/pilot-bridge'
import { getRoot } from '/@/root'
const root = getRoot()
const enablePhotoUpload = ref<boolean>(true)
const enableVideoUpload = ref<boolean>(false)
const photoType = ref<number>(1)
const uploadPath = ref<number>(0)
onMounted(() => {
  message.info('After setting, please use the physical button of the remote control to return, otherwise the setting is invalid.')
  enablePhotoUpload.value =
    apiPilot.getAutoUploadPhoto() === undefined
      ? true
      : apiPilot.getAutoUploadPhoto()
  enableVideoUpload.value =
    apiPilot.getAutoUploadVideo() === undefined
      ? false
      : apiPilot.getAutoUploadVideo()
  photoType.value =
    apiPilot.getUploadPhotoType() === undefined
      ? 1
      : apiPilot.getUploadPhotoType()
  uploadPath.value =
    apiPilot.getDownloadOwner() === undefined ? 0 : apiPilot.getDownloadOwner()
  console.log(
    enablePhotoUpload.value,
    enableVideoUpload.value,
    photoType.value,
    uploadPath.value
  )
  apiPilot.setComponentParam('media', {
    autoUploadPhoto: enablePhotoUpload.value,
    autoUploadPhotoType: photoType.value,
    autoUploadVideo: enableVideoUpload.value
  })
})
const onPhotoUpload = () => {
  apiPilot.setAutoUploadPhoto(enablePhotoUpload.value)
}
const onVideoUpload = () => {
  console.log(enableVideoUpload.value)
  apiPilot.setAutoUploadVideo(enableVideoUpload.value)
}
const onPhototype = () => {
  console.log(photoType.value)
  apiPilot.setUploadPhotoType(photoType.value)
}
const onUploadPath = (e: any) => {
  apiPilot.setDownloadOwner(uploadPath.value)
}
</script>
<style lang="scss" scoped>
// @import '/@/styles/index.scss';
</style>
src/pages/project-app/index.vue
New file
@@ -0,0 +1,208 @@
<template>
  <div
    v-if="showLogin"
    class="login flex-column flex-justify-center flex-align-center m0 b0"
  >
    <a-image
      style="width: 17vw; height: 10vw; margin-bottom: 50px"
      src="http://lofrev.net/wp-content/photos/2016/09/dji_logo_png.png"
    />
    <p class="logo fz35 pb50">Cloud API Demo</p>
    <a-form
      layout="inline"
      :model="formState"
      class="flex-row flex-justify-center flex-align-center"
    >
      <a-form-item>
        <a-input v-model:value="formState.user" placeholder="Username">
          <template #prefix
            ><UserOutlined style="color: rgba(0, 0, 0, 0.25)"
          /></template>
        </a-input>
      </a-form-item>
      <a-form-item>
        <a-input
          v-model:value="formState.password"
          type="password"
          placeholder="Password"
        >
          <template #prefix
            ><LockOutlined style="color: rgba(0, 0, 0, 0.25)"
          /></template>
        </a-input>
      </a-form-item>
      <a-form-item>
        <a-button
          class="m0"
          type="primary"
          html-type="submit"
          :disabled="formState.user === '' || formState.password === ''"
          @click="onSubmit"
        >
          Login
        </a-button>
      </a-form-item>
    </a-form>
  </div>
  <div v-else class="project-app-wrapper">
    <div class="left">
      <Sidebar />
      <div class="main-content uranus-scrollbar dark">
        <router-view />
      </div>
    </div>
    <div class="right">
      <div class="map-wrapper">
        <GMap />
      </div>
      <div class="media-wrapper" v-if="getMediaRoute()">
        <MediaPanel />
      </div>
      <div class="wayline-wrapper" v-if="getWaylineRoute()">
        <WaylinePanel />
      </div>
    </div>
  </div>
</template>
<script lang="ts" setup>
import { LockOutlined, UserOutlined } from '@ant-design/icons-vue'
import { message } from 'ant-design-vue'
import { reactive, ref, UnwrapRef } from 'vue'
import Sidebar from './sidebar.vue'
import { login } from '/@/api/manage'
import websocket from '/@/api/websocket'
import GMap from '/@/components/GMap.vue'
import MediaPanel from '/@/components/MediaPanel.vue'
import WaylinePanel from '/@/components/wayline-panel.vue'
import { useGMapCover } from '/@/hooks/use-g-map-cover'
import { getRoot } from '/@/root'
import { useMyStore } from '/@/store'
interface FormState {
  user: string
  password: string
}
const root = getRoot()
const showLogin = ref(true)
const store = useMyStore()
const formState: UnwrapRef<FormState> = reactive({
  user: 'adminPC',
  password: 'adminPC'
})
let socket = {} as any
const gMapCoverHook = useGMapCover()
const onSubmit = async (e: any) => {
  const result = await login({
    username: formState.user,
    password: formState.password
  })
  if (result.code === 0) {
    console.log(result)
    localStorage.setItem('x-auth-token', result.data.access_token)
    localStorage.setItem('workspace-id', result.data.workspace_id)
    localStorage.setItem('username', result.data.username)
    showLogin.value = false
    message.info('login success')
    socket = websocket.init(wsGetMsg)
  }
}
// function wsInfo (data) {
//   store.commit('SET_DEVICE_INFO', data)
// }
// function getDeviceInfo () {
//   const info = store.state.DeviceInfo
//   console.log(info)
const wsGetMsg = async (res: any) => {
  const payload = JSON.parse(res.data)
  // console.log(payload)
  switch (payload.biz_code) {
    case 'gateway_osd': {
      store.commit('SET_GATEWAY_INFO', payload.data)
      break
    }
    case 'device_osd': {
      store.commit('SET_DEVICE_INFO', payload.data)
      break
    }
    case 'map_element_create': {
      store.commit('SET_MAP_ELEMENT_CREATE', payload.data)
      break
    }
    case 'map_element_update': {
      store.commit('SET_MAP_ELEMENT_UPDATE', payload.data)
      break
    }
    case 'map_element_delete': {
      store.commit('SET_MAP_ELEMENT_DELETE', payload.data)
      break
    }
    default:
      break
  }
}
function getMediaRoute () {
  return root.$route.name === 'media'
}
function getWaylineRoute () {
  return root.$route.name === 'wayline'
}
</script>
<style lang="scss" scoped>
@import '/@/styles/index.scss';
.login {
  background-color: $dark-highlight;
  height: 100vh;
}
.logo {
  color: $primary;
}
.project-app-wrapper {
  display: flex;
  position: absolute;
  transition: width 0.2s ease;
  height: 100%;
  width: 100%;
  .left {
    width: 450px;
    display: flex;
    background-color: #232323;
    float: left;
  }
  .right {
    width: 100%;
    height: 100%;
    .map-wrapper {
      width: 100%;
      height: 100%;
    }
  }
  .main-content {
    flex: 1;
    color: $text-white-basic;
  }
  .media-wrapper {
    position: absolute;
    top: 0;
    bottom: 0;
    z-index: 100;
    background: #f6f8fa;
    padding: 16px;
  }
  .wayline-wrapper {
    position: absolute;
    top: 0;
    bottom: 0;
    z-index: 100;
    background: #f6f8fa;
    padding: 16px;
  }
}
</style>
src/pages/project-app/projects/layer.vue
New file
@@ -0,0 +1,438 @@
<template>
  <div class="project-layer-wrapper">
    <LayersTree
      :layer-data="mapLayers"
      class="project-layer-content"
      @check="checkLayer"
      @select="selectLayer"
      v-model:selectedKeys="selectedKeys"
      v-model:checkedKeys="checkedKeys"
    />
    <a-drawer
      title="Map Element"
      placement="right"
      :closable="true"
      v-model:visible="visible"
      :mask="false"
      wrapClassName="drawer-element-wrapper"
      @close="closeDrawer"
      width="300"
    >
      <div class="drawer-element-content">
        <div class="name element-item">
          <span class="title">Name:</span>
          <a-input
            v-model:value="layerState.layerName"
            style="width:120px"
            placeholder="element name"
            @change="changeLayer"
          />
        </div>
        <div
          class="longitude element-item"
          v-if="layerState.currentType === geoType.Point"
        >
          <span class="title">Longitude:</span>
          <a-input
            v-model:value="layerState.longitude"
            style="width:120px"
            placeholder="longitude"
            @change="changeLayer"
          />
        </div>
        <div
          class="latitude element-item"
          v-if="layerState.currentType === geoType.Point"
        >
          <span class="title">Latitude:</span>
          <a-input
            v-model:value="layerState.latitude"
            style="width:120px"
            placeholder="latitude"
            @change="changeLayer"
          />
        </div>
        <div class="color-content">
          <span class="mr30">Color: </span>
          <div
            v-for="item in colors"
            :key="item.id"
            class="color-item"
            :style="'background:' + item.color"
            @click="changeColor(item)"
          >
            <svg-icon
              v-if="item.color === layerState.color"
              :size="18"
              name="check"
            ></svg-icon>
          </div>
        </div>
      </div>
      <div class="flex-row flex-justify-around flex-align-center mt20">
        <a-button type="primary" @click="deleteElement">Delete</a-button>
      </div>
    </a-drawer>
  </div>
</template>
<script lang="ts" setup>
import { onMounted, reactive, ref, watch } from 'vue'
import {
  deleteElementReq,
  getElementGroupsReq,
  updateElementsReq
} from '/@/api/layer'
import LayersTree from '/@/components/LayersTree.vue'
import { MapDoodleColor, MapElementEnum } from '/@/constants/map'
import { useGMapCover } from '/@/hooks/use-g-map-cover'
import { getRoot } from '/@/root'
import { useMyStore } from '/@/store'
import { GeojsonCoordinate, LayerResource } from '/@/types/map'
import { Color, GeoType } from '/@/types/mapLayer'
import { generatePoint } from '/@/utils/genjson'
import { gcj02towgs84, wgs84togcj02 } from '/@/vendors/coordtransform'
const root = getRoot()
const store = useMyStore()
let useGMapCoverHook = useGMapCover(store)
console.log('store', store)
const mapLayers = ref(store.state.Layers)
const checkedKeys = ref<string[]>([])
const selectedKeys = ref<string[]>([])
const selectedKey = ref<string>('')
const selectedLayer = ref<any>(null)
const visible = ref<boolean>(false)
store.commit('SET_DRAW_VISIBLE_INFO', visible.value)
const geoType = GeoType
const layerState = reactive({
  layerName: '',
  layerId: '',
  longitude: 0,
  latitude: 0,
  currentType: '', // “LineString”,"Polygon","Point"
  color: '#212121'
})
const colors = ref<Color[]>([
  { id: 1, name: 'BLUE', color: '#2D8CF0', selected: true },
  { id: 2, name: 'GREEN', color: '#19BE6B', selected: false },
  { id: 3, name: 'YELLOW', color: '#FFBB00', selected: false },
  { id: 4, name: 'ORANGE', color: '#B620E0', selected: false },
  { id: 5, name: 'RED', color: '#E23C39', selected: false },
  { id: 6, name: 'NAME_DEFAULT', color: '#212121', selected: false }
])
async function getAllElement () {
  getElementGroups('init')
  setTimeout(() => {
    useGMapCoverHook = useGMapCover()
    initMapCover()
  }, 1000)
}
function initMapCover () {
  mapLayers.value.forEach(item => {
    if (item.elements) {
      setMapCoverByElement(item.elements)
    }
  })
}
watch(
  () => store.state.Layers,
  newData => {
    mapLayers.value = newData
  },
  {
    deep: true
  }
)
function setMapCoverByElement (elements: LayerResource[]) {
  elements.forEach(element => {
    const name = element.name
    const color = element.resource?.content.properties.color
    const type = element.resource?.type as number
    updateMapElement(element, name, color)
  })
}
function updateMapElement (
  element: LayerResource,
  name: string,
  color: string | undefined
) {
  const geoType = element.resource?.content.geometry.type
  const id = element.id
  const type = element.resource?.type as number
  if (MapElementEnum.PIN === type) {
    const coordinates = element.resource?.content.geometry
      .coordinates as GeojsonCoordinate
    useGMapCoverHook.updatePinElement(id, name, coordinates, color)
  } else if (MapElementEnum.LINE === type && geoType === 'LineString') {
    const coordinates = element.resource?.content.geometry
      .coordinates as GeojsonCoordinate[]
    useGMapCoverHook.initPolyline(name, coordinates, color, {
      id: id,
      name: name
    })
  } else if (MapElementEnum.LINE === type && geoType === 'Polygon') {
    const coordinates = element.resource?.content.geometry
      .coordinates[0] as GeojsonCoordinate[]
    useGMapCoverHook.initPolygon(name, coordinates, color, {
      id: id,
      name: name
    })
  }
}
function checkLayer (keys: string[]) {
  console.log('checkLayer', keys, selectedKeys.value, checkedKeys.value)
}
function selectLayer (keys: string[], e) {
  // console.log('selectLayer', e.node.eventKey, e.selected)
  if (e.selected) {
    selectedKey.value = e.node.eventKey
    selectedLayer.value = getCurrentLayer(selectedKey.value)
    setBaseInfo()
  }
  visible.value = e.selected
  store.commit('SET_DRAW_VISIBLE_INFO', visible.value)
  // store.dispatch('updateElement', { type: 'is_select', id: e.node.eventKey, bool: e.selected })
}
function getCurrentLayer (id: string) {
  const Layers = store.state.Layers
  const key = id.replaceAll('resource__', '')
  // console.log('selectedKey.value', selectedKey.value)
  let layer = null
  const findCan = function (V) {
    V.forEach(item => {
      if (item.id === key) {
        layer = item
      }
      if (item.elements) {
        findCan(item.elements)
      }
    })
  }
  findCan(Layers)
  // const layer = Layers.find(item => item.elements.find(el => el.id === key))
  console.log('layer', layer)
  return layer
}
function setBaseInfo () {
  const layer = selectedLayer.value
  if (layer) {
    const geoType = layer.resource?.content.geometry.type
    // “LineString”,"Polygon","Point"
    layerState.currentType = geoType
    layerState.layerName = layer.name
    layerState.layerId = layer.id
    layerState.color = layer.resource?.content.properties.color
    switch (geoType) {
      case GeoType.Point:
        layerState.longitude = layer.resource?.content.geometry.coordinates[0]
        layerState.latitude = layer.resource?.content.geometry.coordinates[1]
        break
      case GeoType.LineString:
        break
      case GeoType.Polygon:
        break
    }
  }
}
onMounted(() => {
  getAllElement()
})
function closeDrawer () {
  store.commit('SET_DRAW_VISIBLE_INFO', false)
  selectedKeys.value = []
}
function changeColor (color: Color) {
  layerState.color = color.color
  updateElements()
}
function changeLayer (val: string) {
  updateElements()
}
async function deleteElement () {
  const elementid = selectedLayer.value.id
  await deleteElementReq(elementid, {}).then(async (res: any) => {
    // console.log('delete element res:', res)
    if (res.code !== 0) {
      console.warn(res)
      return
    }
    visible.value = false
    store.commit('SET_DRAW_VISIBLE_INFO', visible.value)
    useGMapCoverHook.removeCoverFromMap(elementid)
    getElementGroups()
  })
}
async function getElementGroups (type?: string) {
  const result = await getElementGroupsReq({
    groupId: '',
    isDistributed: true
  })
  mapLayers.value = result.data
  mapLayers.value = updateWgs84togcj02()
  if (type && type === 'init') {
    store.dispatch('setLayerInfo', mapLayers.value)
  }
  store.commit('SET_LAYER_INFO', mapLayers.value)
}
async function updateElements () {
  let content = null
  if (layerState.currentType === GeoType.Point) {
    const position = {
      height: 0,
      latitude: Number(layerState.latitude || 0),
      longitude: Number(layerState.longitude || 0)
    }
    const cxt = generatePoint(position, {
      color: layerState.color || MapDoodleColor.PinColor,
      clampToGround: true
    })
    content = {
      type: MapElementEnum.PIN,
      geometry: cxt.geometry,
      properties: cxt.properties
    }
    const currentLayer = selectedLayer.value
    currentLayer.resource.content = content
    selectedLayer.value = currentLayer
  } else {
    const currentLayer = selectedLayer.value
    content = currentLayer.resource.content
    content.properties.color = layerState.color
  }
  updateMapElement(selectedLayer.value, layerState.layerName, layerState.color)
  const result = await updateElementsReq(layerState.layerId, {
    name: layerState.layerName,
    content: content
  })
  getElementGroups()
}
function updateWgs84togcj02 () {
  const layers = mapLayers.value
  layers.forEach(item => {
    if (item.elements) {
      item.elements.forEach(ele => {
        updateCoordinates('wgs84-gcj02', ele)
      })
    }
  })
  return layers
}
function updateCoordinates (transformType: string, element: LayerResource) {
  const geoType = element.resource?.content.geometry.type
  const type = element.resource?.type as number
  if (element.resource) {
    if (MapElementEnum.PIN === type) {
      const coordinates = element.resource?.content.geometry
        .coordinates as GeojsonCoordinate
      if (transformType === 'wgs84-gcj02') {
        const transResult = wgs84togcj02(
          coordinates[0],
          coordinates[1]
        ) as GeojsonCoordinate
        element.resource.content.geometry.coordinates = transResult
      } else if (transformType === 'gcj02-wgs84') {
        const transResult = gcj02towgs84(
          coordinates[0],
          coordinates[1]
        ) as GeojsonCoordinate
        element.resource.content.geometry.coordinates = transResult
      }
    } else if (MapElementEnum.LINE === type && geoType === 'LineString') {
      const coordinates = element.resource?.content.geometry
        .coordinates as GeojsonCoordinate[]
      if (transformType === 'wgs84-gcj02') {
        coordinates.forEach(coordinate => {
          coordinate = wgs84togcj02(
            coordinate[0],
            coordinate[1]
          ) as GeojsonCoordinate
        })
      } else if (transformType === 'gcj02-wgs84') {
        coordinates.forEach(coordinate => {
          coordinate = gcj02towgs84(
            coordinate[0],
            coordinate[1]
          ) as GeojsonCoordinate
        })
      }
      element.resource.content.geometry.coordinates = coordinates
    } else if (MapElementEnum.LINE === type && geoType === 'Polygon') {
      const coordinates = element.resource?.content.geometry
        .coordinates[0] as GeojsonCoordinate[]
      if (transformType === 'wgs84-gcj02') {
        coordinates.forEach(coordinate => {
          coordinate = wgs84togcj02(
            coordinate[0],
            coordinate[1]
          ) as GeojsonCoordinate
        })
      } else if (transformType === 'gcj02-wgs84') {
        coordinates.forEach(coordinate => {
          coordinate = gcj02towgs84(
            coordinate[0],
            coordinate[1]
          ) as GeojsonCoordinate
        })
      }
      element.resource.content.geometry.coordinates = [coordinates]
    }
  }
}
</script>
<style lang="scss" scoped>
@import '/@/styles/index.scss';
.project-layer-wrapper {
  padding-top: 16px;
}
</style>
<style lang="scss">
.drawer-element-wrapper {
  .ant-drawer-content {
    background-color: $dark-highlight;
    color: $text-white-basic;
    .ant-drawer-header {
      background-color: $dark-highlight;
      .ant-drawer-title {
        color: $text-white-basic;
      }
      .ant-drawer-close {
        color: $text-white-basic;
      }
    }
    .ant-input {
      background-color: #101010;
      border-color: $dark-border;
      color: $text-white-basic;
    }
  }
  .color-content {
    display: flex;
    align-items: center;
    margin-top: 8px;
    .color-item {
      cursor: pointer;
      width: 18px;
      height: 18px;
      line-height: 18px;
      display: flex;
      align-items: center;
      margin-left: 5px;
    }
  }
  .title {
    display: inline-flex;
    width: 80px;
  }
  .element-item {
    margin-bottom: 10px;
  }
}
</style>
src/pages/project-app/projects/livestream-agora.vue
New file
@@ -0,0 +1,327 @@
<template>
  <div class="flex-column flex-justify-start flex-align-center">
    <p class="fz24">Live streaming source selection</p>
    <div class="flex-row flex-justify-center flex-align-center mt10">
      <a-select
        style="width:150px"
        placeholder="Select Drone"
        @select="onDroneSelect"
      >
        <a-select-option
          v-for="item in dronePara.droneList"
          :key="item.value"
          :value="item.value"
          >{{ item.label }}</a-select-option
        >
      </a-select>
      <a-select
        class="ml10"
        style="width:150px"
        placeholder="Select Camera"
        @select="onCameraSelect"
      >
        <a-select-option
          v-for="item in dronePara.cameraList"
          :key="item.value"
          :value="item.value"
          >{{ item.label }}</a-select-option
        >
      </a-select>
      <a-select
        class="ml10"
        style="width:150px"
        placeholder="Select Lens"
        @select="onVideoSelect"
      >
        <a-select-option
          class="ml10"
          v-for="item in dronePara.videoList"
          :key="item.value"
          :value="item.value"
          >{{ item.label }}</a-select-option
        >
      </a-select>
      <a-select
        class="ml10"
        style="width:150px"
        placeholder="Select Clarity"
        @select="onClaritySelect"
      >
        <a-select-option
          v-for="item in clarityList"
          :key="item.value"
          :value="item.value"
          >{{ item.label }}</a-select-option
        >
      </a-select>
    </div>
    <p class="fz24 mt10">Agora Parameter</p>
    <p class="fz16">
      Note: Obtain The Following Parameters From https://console.agora.io
    </p>
    <div class="flex-row flex-justify-center flex-align-center">
      <a-input v-model:value="agoraPara.appid" placeholder="APP ID"></a-input>
      <a-input
        class="ml10"
        v-model:value="agoraPara.token"
        placeholder="Token"
      ></a-input>
      <a-input
        class="ml10"
        v-model:value="agoraPara.channel"
        placeholder="Channel"
      ></a-input>
    </div>
    <div class="mt20">
      <p class="fz20">
        Livestate:{{ livePara.liveState == false ? 'Stop' : 'Playing' }}
      </p>
    </div>
    <div class="mt10 flex-row flex-justify-center flex-align-center">
      <a-button type="primary" large @click="onStart">Play</a-button>
      <a-button class="ml20" type="primary" large @click="onStop"
        >Stop</a-button
      >
      <a-button class="ml20" type="primary" large @click="onRefresh"
        >Refresh Live Capacity</a-button
      >
    </div>
    <div id="player"></div>
  </div>
</template>
<script lang="ts" setup>
import AgoraRTC from 'agora-rtc-sdk-ng'
import { onMounted, reactive } from 'vue'
import { CURRENT_CONFIG as config } from '/@/api/http/config'
import { getLiveCapacity, startLivestream, stopLivestream } from '/@/api/manage'
import { getRoot } from '/@/root'
const root = getRoot()
const clarityList = [
  {
    value: 0,
    label: 'Adaptive'
  },
  {
    value: 1,
    label: 'Smooth'
  },
  {
    value: 2,
    label: 'Standard'
  },
  {
    value: 3,
    label: 'HD'
  },
  {
    value: 4,
    label: 'Super Clear'
  }
]
let agoraClient = {} as any
const agoraPara = reactive({
  appid: config.agoraAPPID,
  token: config.agoraToken,
  channel: config.agoraChannel,
  uid: null,
  stream: {}
})
const dronePara = reactive({
  livestreamSource: [],
  droneList: [],
  cameraList: [],
  videoList: [],
  droneSelected: '',
  cameraSelected: '',
  videoSelected: '',
  claritySelected: ''
})
const livePara = reactive({
  url: '',
  webrtc: {} as any,
  videoId: '',
  liveState: false
})
const onRefresh = async () => {
  await getLiveCapacity({})
    .then(res => {
      console.log(res)
      if (res.code === 0) {
        if (res.data === null) {
          console.warn('warning: get live capacity is null!!!')
          return
        }
        dronePara.livestreamSource = res.data
        dronePara.droneList = []
        console.log('live_capacity:', dronePara.livestreamSource)
        if (dronePara.livestreamSource) {
          dronePara.livestreamSource.forEach((ele: any) => {
            dronePara.droneList.push({ label: ele.sn, value: ele.sn })
          })
          console.log(dronePara.droneList)
        }
      }
    })
    .catch(error => {
      console.error(error)
    })
}
onMounted(() => {
  onRefresh()
  agoraClient = AgoraRTC.createClient({ mode: 'live', codec: 'h264' })
  agoraClient.setClientRole('audience')
  // Subscribe when a remote user publishes a stream
  agoraClient.on('user-published', async (user: any, mediaType: string) => {
    await agoraClient.subscribe(user, mediaType)
    if (mediaType === 'video') {
      console.log('subscribe success')
      // Get `RemoteVideoTrack` in the `user` object.
      const remoteVideoTrack = user.videoTrack
      // Dynamically create a container in the form of a DIV element for playing the remote video track.
      const remotePlayerContainer: any = document.getElementById('player')
      // Specify the ID of the DIV container. You can use the `uid` of the remote user.
      remotePlayerContainer.id = agoraPara.uid
      remotePlayerContainer.textContent = 'uid: ' + agoraPara.uid
      remotePlayerContainer.style.width = '640px'
      remotePlayerContainer.style.height = '480px'
      remoteVideoTrack.play(remotePlayerContainer)
    }
  })
  agoraClient.on('user-unpublished', async (user: any) => {
    console.log('unpublish live:', user)
    await agoraClient.leave()
  })
})
const handleError = (err: any) => {
  console.error(err)
}
const handleJoinChannel = (uid: any) => {
  agoraPara.uid = uid
}
const onStart = async () => {
  const that = this
  console.log(
    'drone parameter:',
    dronePara.droneSelected,
    dronePara.cameraSelected,
    dronePara.videoSelected,
    dronePara.claritySelected
  )
  const timestamp = new Date().getTime().toString()
  const liveTimestamp = timestamp
  if (
    dronePara.droneSelected == null ||
    dronePara.cameraSelected == null ||
    dronePara.videoSelected == null ||
    dronePara.claritySelected == null
  ) {
    console.warn('waring: not select live para!!!')
  }
  livePara.videoId =
    dronePara.droneSelected +
    '/' +
    dronePara.cameraSelected +
    '/' +
    dronePara.videoSelected
  console.log(agoraPara)
  await agoraClient
    .join(agoraPara.appid, agoraPara.channel, agoraPara.token, null)
    .then((res: any) => {
      console.log('agora uid:', res)
      agoraPara.uid = res
    })
  console.log(agoraPara.token)
  agoraPara.token = encodeURIComponent(agoraPara.token)
  console.log('agoraToken:', agoraPara.token)
  livePara.url =
    'channel=' +
    agoraPara.channel +
    '&sn=' +
    dronePara.droneSelected +
    '&token=' +
    agoraPara.token +
    '&uid=' +
    agoraPara.uid
  await startLivestream({
    url: livePara.url,
    video_id: livePara.videoId,
    url_type: 0,
    video_quality: dronePara.claritySelected
  })
    .then(res => {
      livePara.liveState = true
    })
    .catch(err => {
      console.error(err)
    })
}
const onStop = async () => {
  stopLivestream({
    video_id: livePara.videoId
  }).then(res => {
    livePara.liveState = false
    console.log('stop play livestream')
  })
}
const onDroneSelect = (val: any) => {
  dronePara.droneSelected = val
  if (dronePara.droneSelected) {
    const droneTemp = dronePara.livestreamSource
    droneTemp.forEach(ele => {
      const drone = ele
      if (drone.sn === dronePara.droneSelected) {
        const cameraListTemp = drone.cameras_list
        dronePara.cameraList = []
        cameraListTemp.forEach((ele: any) => {
          dronePara.cameraList.push({ label: ele.name, value: ele.index })
        })
      }
    })
  }
}
const onCameraSelect = (val: any) => {
  dronePara.cameraSelected = val
  if (dronePara.cameraSelected) {
    const droneTemp = dronePara.livestreamSource
    droneTemp.forEach(ele => {
      const drone = ele
      if (drone.sn === dronePara.droneSelected) {
        const cameraListTemp = drone.cameras_list
        cameraListTemp.forEach((ele: any) => {
          const camera = ele
          if (camera.index === dronePara.cameraSelected) {
            const videoListTemp = camera.videos_list
            dronePara.videoList = []
            videoListTemp.forEach((ele: any) => {
              dronePara.videoList.push({ label: ele.type, value: ele.index })
            })
          }
        })
      }
    })
  }
}
const onVideoSelect = (val: any) => {
  dronePara.videoSelected = val
}
const onClaritySelect = (val: any) => {
  dronePara.claritySelected = val
}
</script>
<style lang="scss" scoped>
@import '/@/styles/index.scss';
</style>
src/pages/project-app/projects/livestream-others.vue
New file
@@ -0,0 +1,351 @@
<template>
  <div class="flex-column flex-justify-start flex-align-center">
    <video
      :style="{ width: '720px', height: '480px' }"
      id="video-webrtc"
      ref="videowebrtc"
      controls
      class="mt20"
    ></video>
    <p class="fz24">Live streaming source selection</p>
    <div class="flex-row flex-justify-center flex-align-center mt10">
      <a-select
        style="width: 150px"
        placeholder="Select Live Type"
        @select="onLiveTypeSelect"
      >
        <a-select-option
          v-for="item in liveTypeList"
          :key="item.label"
          :value="item.value"
        >
          {{ item.label }}
        </a-select-option>
      </a-select>
      <a-select
        class="ml10"
        style="width:150px"
        placeholder="Select Drone"
        @select="onDroneSelect"
      >
        <a-select-option
          v-for="item in droneList"
          :key="item.value"
          :value="item.value"
          >{{ item.label }}</a-select-option
        >
      </a-select>
      <a-select
        class="ml10"
        style="width:150px"
        placeholder="Select Camera"
        @select="onCameraSelect"
      >
        <a-select-option
          v-for="item in cameraList"
          :key="item.value"
          :value="item.value"
          >{{ item.label }}</a-select-option
        >
      </a-select>
      <a-select
        class="ml10"
        style="width:150px"
        placeholder="Select Lens"
        @select="onVideoSelect"
      >
        <a-select-option
          class="ml10"
          v-for="item in videoList"
          :key="item.value"
          :value="item.value"
          >{{ item.label }}</a-select-option
        >
      </a-select>
      <a-select
        class="ml10"
        style="width:150px"
        placeholder="Select Clarity"
        @select="onClaritySelect"
      >
        <a-select-option
          v-for="item in clarityList"
          :key="item.value"
          :value="item.value"
          >{{ item.label }}</a-select-option
        >
      </a-select>
    </div>
    <div class="mt20">
      <p class="fz20">Livestate:{{ liveState == 0 ? 'Stop' : 'Playing' }}</p>
      <p class="fz10" v-if="livetypeSelected == 2">
        Please use VLC media player to play the RTSP livestream !!!
      </p>
      <p class="fz10" v-if="livetypeSelected == 2">
        RTSP Parameter:{{ rtspData }}
      </p>
    </div>
    <div class="mt10 flex-row flex-justify-center flex-align-center">
      <a-button type="primary" large @click="onStart">Play</a-button>
      <a-button class="ml20" type="primary" large @click="onStop"
        >Stop</a-button
      >
      <a-button class="ml20" type="primary" large @click="onRefresh"
        >Refresh Live Capacity</a-button
      >
    </div>
  </div>
</template>
<script lang="ts" setup>
import { message } from 'ant-design-vue'
import { onMounted, ref } from 'vue'
import { CURRENT_CONFIG as config } from '/@/api/http/config'
import { getLiveCapacity, startLivestream, stopLivestream } from '/@/api/manage'
import { getRoot } from '/@/root'
import jswebrtc from '/@/vendors/jswebrtc.min.js'
const root = getRoot()
const liveTypeList = [
  {
    value: 1,
    label: 'RTMP'
  },
  {
    value: 2,
    label: 'RTSP'
  },
  {
    value: 3,
    label: 'GB28181'
  }
]
const clarityList = [
  {
    value: 0,
    label: 'Adaptive'
  },
  {
    value: 1,
    label: 'Smooth'
  },
  {
    value: 2,
    label: 'Standard'
  },
  {
    value: 3,
    label: 'HD'
  },
  {
    value: 4,
    label: 'Super Clear'
  }
]
const videowebrtc = ref(null)
const livestreamSource = ref()
const droneList = ref()
const cameraList = ref()
const videoList = ref()
const droneSelected = ref()
const cameraSelected = ref()
const videoSeleted = ref()
const claritySeleted = ref()
const videoId = ref()
const liveState = ref(0)
const livetypeSelected = ref()
const rtspData = ref()
const onRefresh = async () => {
  await getLiveCapacity({})
    .then(res => {
      console.log(res)
      if (res.code === 0) {
        if (res.data === null) {
          console.warn('warning: get live capacity is null!!!')
          return
        }
        const resData: Array<[]> = res.data
        console.log('live_capacity:', resData)
        livestreamSource.value = resData
        console.log(livestreamSource)
        const temp: Array<{}> = []
        if (livestreamSource.value) {
          livestreamSource.value.forEach(ele => {
            temp.push({ label: ele.sn, value: ele.sn })
          })
          console.log(temp)
          droneList.value = temp
          console.log(droneList.value)
        }
      }
    })
    .catch(error => {
      console.error(error)
    })
}
onMounted(() => {
  onRefresh()
})
const onStart = async () => {
  const that = this
  console.log(
    '直播参数:',
    livetypeSelected.value,
    droneSelected.value,
    cameraSelected.value,
    videoSeleted.value,
    claritySeleted.value
  )
  const timestamp = new Date().getTime().toString()
  const liveTimestamp = timestamp
  if (
    livetypeSelected.value == null ||
    droneSelected.value == null ||
    cameraSelected.value == null ||
    videoSeleted.value == null ||
    claritySeleted.value == null
  ) {
    console.warn('waring: not select live para!!!')
    return
  }
  videoId.value =
    droneSelected.value + '/' + cameraSelected.value + '/' + videoSeleted.value
  let liveURL = ''
  switch (livetypeSelected.value) {
    case 1: {
      // RTMP
      liveURL = config.rtmpURL + timestamp
      break
    }
    case 2: {
      // RTSP
      liveURL = config.rtspPara
      break
    }
    case 3: {
      // GB28181
      liveURL = config.gb28181Para
      break
    }
    default:
      console.warn('warning: live type is not correct!!!')
      break
  }
  await startLivestream({
    url: liveURL,
    video_id: videoId.value,
    url_type: livetypeSelected.value,
    video_quality: claritySeleted.value
  })
    .then(res => {
      if (livetypeSelected.value === 3) {
        const url = res.data.url
        const videoElement = videowebrtc.value
        // gb28181,it will fail if not wait.
        message.loading({
          content: '直播等待中。。。',
          duration: 4,
          onClose () {
            const player = new jswebrtc.Player(url, {
              video: videoElement,
              autoplay: true,
              onPlay: obj => {
                console.log('start play livestream')
              }
            })
            liveState.value = 1
          }
        })
      } else if (livetypeSelected.value === 2) {
        console.log(res)
        rtspData.value =
          'url:' +
          res.data.url +
          '&username:' +
          res.data.username +
          '&password:' +
          res.data.password
      } else if (livetypeSelected.value === 1) {
        const url = res.data.url
        const videoElement = videowebrtc.value
        console.log('start live:', url)
        const player = new jswebrtc.Player(url, {
          video: videoElement,
          autoplay: true,
          onPlay: obj => {
            console.log('start play livestream')
            liveState.value = 1
          }
        })
      }
    })
    .catch(err => {
      console.error(err)
    })
}
const onStop = () => {
  stopLivestream({
    video_id: videoId.value
  }).then(res => {
    liveState.value = 0
    console.log('stop play livestream')
  })
}
const onLiveTypeSelect = (val: any) => {
  livetypeSelected.value = val
}
const onDroneSelect = (val: any) => {
  droneSelected.value = val
  const temp: Array<{}> = []
  if (droneSelected.value) {
    const droneTemp = livestreamSource.value
    droneTemp.forEach(ele => {
      const drone = ele
      if (drone.sn === droneSelected.value) {
        const cameraListTemp = drone.cameras_list
        cameraListTemp.forEach(ele => {
          temp.push({ label: ele.name, value: ele.index })
        })
        cameraList.value = temp
      }
    })
  }
}
const onCameraSelect = (val: any) => {
  cameraSelected.value = val
  const result: Array<{}> = []
  if (cameraSelected.value) {
    const droneTemp = livestreamSource.value
    droneTemp.forEach(ele => {
      const drone = ele
      if (drone.sn === droneSelected.value) {
        const cameraListTemp = drone.cameras_list
        cameraListTemp.forEach(ele => {
          const camera = ele
          if (camera.index === cameraSelected.value) {
            const videoListTemp = camera.videos_list
            videoListTemp.forEach(ele => {
              result.push({ label: ele.type, value: ele.index })
            })
            videoList.value = result
          }
        })
      }
    })
  }
}
const onVideoSelect = (val: any) => {
  videoSeleted.value = val
}
const onClaritySelect = (val: any) => {
  claritySeleted.value = val
}
</script>
<style lang="scss" scoped>
@import '/@/styles/index.scss';
</style>
src/pages/project-app/projects/livestream.vue
New file
@@ -0,0 +1,82 @@
<template>
  <div class="flex-column flex-justify-start flex-align-center">
    <a-button
      class="mt10  "
      style="width:90%"
      type="primary"
      @click="onAgoraLiveStream"
      >Agora Live</a-button
    >
    <a-button
      class="mt10"
      style="width:90%"
      type="primary"
      @click="onOthersLive"
      >RTMP/GB28181 Live</a-button
    >
  </div>
  <div v-if="enableAgoraLive">
    <a-modal
      style="top:0"
      v-model:visible="enableAgoraLive"
      title="Agora Live"
      width="100%"
      :maskClosable="false"
      wrapClassName="full-modal"
      :footer="null"
    >
      <LiveAgora />
    </a-modal>
  </div>
  <div v-if="enableOthersLive">
    <a-modal
      style="top:0"
      v-model:visible="enableOthersLive"
      title="RTMP/GB28181/RTSP Live"
      width="100%"
      :maskClosable="false"
      wrapClassName="full-modal"
      :footer="null"
    >
      <LiveOthers />
    </a-modal>
  </div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
import LiveAgora from './livestream-agora.vue'
import LiveOthers from './livestream-others.vue'
import { getRoot } from '/@/root'
const root = getRoot()
const enableAgoraLive = ref(false)
const enableOthersLive = ref(false)
const onAgoraLiveStream = () => {
  console.log('agora')
  enableAgoraLive.value = true
}
const onOthersLive = () => {
  console.log('liveview')
  enableOthersLive.value = true
}
</script>
<style lang="scss">
.full-modal {
  .ant-modal {
    max-width: 100%;
    top: 0;
    padding-bottom: 0;
    margin: 0;
  }
  .ant-modal-content {
    display: flex;
    flex-direction: column;
    height: calc(100vh);
  }
  .ant-modal-body {
    flex: 1;
  }
}
</style>
src/pages/project-app/projects/media.vue
New file
@@ -0,0 +1,11 @@
<template>
  <div class="project-media-wrapper">
      Media
  </div>
</template>
<script lang="ts" setup>
</script>
<style lang="scss" scoped>
</style>
src/pages/project-app/projects/tsa.vue
New file
@@ -0,0 +1,11 @@
<template>
  <div class="project-tsa-wrapper">
      TSA
  </div>
</template>
<script lang="ts" setup>
</script>
<style lang="scss" scoped>
</style>
src/pages/project-app/projects/wayline.vue
New file
@@ -0,0 +1,9 @@
<template>
  <div class="project-wayline-wrapper">
    wayline
  </div>
</template>
<script lang="ts" setup></script>
<style lang="scss" scoped></style>
src/pages/project-app/sidebar.vue
New file
@@ -0,0 +1,103 @@
<template>
  <div class="demo-project-sidebar-wrapper">
    <router-link
      v-for="item in options"
      :key="item.key"
      :to="item.path"
      :class="{
        'menu-item': true,
        selected: selectedRoute(item),
        disabled: item.key > 6
      }"
    >
      <a-tooltip :title="item.label" placement="right">
        <span>{{ item.label }}</span>
      </a-tooltip>
    </router-link>
  </div>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { getRoot } from '/@/root'
interface IOptions {
  key: number
  label: string
  path:
    | string
    | {
        path: string
        query?: any
      }
  icon: string
}
export default defineComponent({
  name: 'Sidebar',
  setup () {
    const root = getRoot()
    const options = [
      { key: 0, label: 'livestream', path: '/livestream', icon: 'livestream' },
      { key: 1, label: 'tsa', path: '/tsa', icon: 'tsa' },
      { key: 2, label: 'layer', path: '/layer', icon: 'layer' },
      { key: 3, label: 'media', path: '/media', icon: 'media' },
      { key: 4, label: 'wayline', path: '/wayline', icon: 'wayline' }
    ]
    function selectedRoute (item: IOptions) {
      const path = typeof item.path === 'string' ? item.path : item.path.path
      return root.$route.path?.indexOf(path) === 0
    }
    return {
      options,
      selectedRoute
    }
  }
})
</script>
<style scoped lang="scss">
.demo-project-sidebar-wrapper {
  display: flex;
  flex-direction: column;
  align-items: center;
  width: 80px;
  border-right: 1px solid #4f4f4f;
  color: $text-white-basic;
  // flex: 1;
  overflow: hidden;
  .menu-item {
    width: 100%;
    padding: 16px 0px;
    display: flex;
    flex-direction: column;
    align-items: center;
    color: $text-white-basic;
    cursor: pointer;
    &.selected {
      background-color: $dark-highlight;
      color: $primary;
    }
    &.disabled {
      pointer-events: none;
      opacity: 0.45;
    }
  }
  .filling {
    flex: 1;
  }
  .setting-icon {
    font-size: 24px;
    margin-bottom: 24px;
    color: $text-white-basic;
  }
}
</style>
<style>
.ant-tooltip-open {
  border: 0;
}
</style>
src/plugins/svgBuilder.ts
New file
@@ -0,0 +1,50 @@
import { readFileSync, readdirSync } from 'fs'
let idPerfix = ''
const svgTitle = /<svg([^>+].*?)>/
const clearHeightWidth = /(width|height)="([^>+].*?)"/g
const hasViewBox = /(viewBox="[^>+].*?")/g
const clearReturn = /(\r)|(\n)/g
// Find the svg file
function svgFind(e) {
  const arr = []
  const dirents = readdirSync(e, { withFileTypes: true })
  for (const dirent of dirents) {
    if (dirent.isDirectory()) arr.push(...svgFind(e + dirent.name + '/'))
    else {
      const svg = readFileSync(e + dirent.name)
        .toString()
        .replace(clearReturn, '')
        .replace(svgTitle, ($1, $2) => {
          let width = 0
          let height = 0
          let content = $2.replace(clearHeightWidth, (s1, s2, s3) => {
            if (s2 === 'width') width = s3
            else if (s2 === 'height') height = s3
            return ''
          })
          if (!hasViewBox.test($2)) content += `viewBox="0 0 ${width} ${height}"`
          return `<symbol id="${idPerfix}-${dirent.name.replace('.svg', '')}" ${content}>`
        }).replace('</svg>', '</symbol>')
      arr.push(svg)
    }
  }
  return arr
}
export const svgBuilder = (path: any, perfix = 'icon') => {
  if (path === '') return
  idPerfix = perfix
  const res = svgFind(path)
  console.log(res)
  return {
    name: 'svg-transform',
    transformIndexHtml (dom: String) {
      return dom.replace(
        '<body>',
          `<body><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position: absolute; width: 0; height: 0" version="1.1">${res.join('')}</svg>`
      )
    }
  }
}
src/root.ts
New file
@@ -0,0 +1,24 @@
import { createApp, ComponentCustomProperties, App as VueApp } from 'vue'
declare module '@vue/runtime-core' {
  interface ComponentCustomProperties {
    $aMap: any
    $aMapObj: any
    $mouseTool: any
  }
}
let root: ComponentCustomProperties
let app = null as any
export function createInstance (App: any): VueApp {
  app = createApp(App)
  root = app.config.globalProperties as ComponentCustomProperties
  return app
}
export function getRoot (): ComponentCustomProperties {
  return root
}
export function getApp (): VueApp {
  return app
}
src/router/index.ts
New file
@@ -0,0 +1,70 @@
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
import { ERouterName } from '/@/types/index'
const routes: Array<RouteRecordRaw> = [
  {
    path: '/' + ERouterName.Project,
    name: ERouterName.Project,
    // redirect: {
    //   name: ERouterName.Project
    // },
    component: () => import('/@/pages/project-app/index.vue'),
    children: [
      {
        path: '/' + ERouterName.Livestream,
        component: () => import('/@/pages/project-app/projects/livestream.vue')
      },
      {
        path: '/' + ERouterName.Tsa,
        component: () => import('/@/pages/project-app/projects/tsa.vue')
      },
      {
        path: '/' + ERouterName.Layer,
        name: ERouterName.Layer,
        component: () => import('/@/pages/project-app/projects/layer.vue')
      },
      {
        path: '/' + ERouterName.Media,
        name: ERouterName.Media,
        component: () => import('/@/pages/project-app/projects/media.vue')
      },
      {
        path: '/' + ERouterName.Wayline,
        name: ERouterName.Wayline,
        component: () => import('/@/pages/project-app/projects/wayline.vue')
      },
    ]
  },
  {
    path: '/' + ERouterName.Pilot,
    name: ERouterName.Pilot,
    component: () => import('/@/pages/page-pilot/pilot-index.vue'),
    children: [
    ]
  },
  {
    path: '/' + ERouterName.PilotHome,
    component: () => import('/@/pages/page-pilot/pilot-home.vue')
  },
  {
    path: '/' + ERouterName.PilotMedia,
    component: () => import('/@/pages/page-pilot/pilot-media.vue')
  },
  {
    path: '/' + ERouterName.PilotLiveshare,
    component: () => import('/@/pages/page-pilot/pilot-liveshare.vue')
  },
  {
    path: '/' + ERouterName.Element,
    name: ERouterName.Element,
    component: () => import('/@/pages/elements/elements.vue')
  }
]
const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes
})
export default router
src/shims-vue.d.ts
New file
@@ -0,0 +1,5 @@
declare module '*.vue' {
  import { DefineComponent } from 'vue'
  const component: DefineComponent<{}, {}, any>
  export default component
}
src/store/index.ts
New file
@@ -0,0 +1,135 @@
import { InjectionKey } from 'vue'
import { ActionTree, createStore, GetterTree, MutationTree, Store, StoreOptions, useStore } from 'vuex'
import { getLayers } from '/@/api/layer'
import { LayerType } from '/@/types/mapLayer'
const initStateFunc = () => ({
  Layers: [
    {
      name: 'default',
      id: '',
      is_distributed: true,
      elements: [],
      is_check: false,
      is_select: false,
      type: 1
    },
    {
      name: 'share',
      id: '',
      is_distributed: true,
      elements: [],
      is_check: false,
      is_select: false,
      type: 2
    }
  ],
  GatewayInfo: { // remote controller, dock
  },
  DeviceInfo: { // drone
  },
  layerBaseInfo: {} as {
    [key:string]:string
  },
  drawVisible: false,
  coverList: [
  ] as any,
  wsEvent: {
    mapElementCreat: {},
    mapElementUpdate: {},
    mapElementDelete: {}
  }
})
export type RootStateType = ReturnType<typeof initStateFunc>
const getters: GetterTree<RootStateType, RootStateType> = {
}
const mutations: MutationTree<RootStateType> = {
  SET_LAYER_INFO (state, info) {
    state.Layers = info
  },
  SET_DEVICE_INFO (state, info) {
    state.DeviceInfo = info
    // console.log(state.DeviceInfo)
  },
  SET_GATEWAY_INFO (state, info) {
    state.GatewayInfo = info
    // console.log(state.GatewayInfo)
  },
  SET_DRAW_VISIBLE_INFO (state, bool) {
    state.drawVisible = bool
  },
  SET_MAP_ELEMENT_CREATE (state, info) {
    state.wsEvent.mapElementCreat = info
  },
  SET_MAP_ELEMENT_UPDATE (state, info) {
    state.wsEvent.mapElementUpdate = info
  },
  SET_MAP_ELEMENT_DELETE (state, info) {
    state.wsEvent.mapElementDelete = info
  },
}
const actions: ActionTree<RootStateType, RootStateType> = {
  async getAllElement ({ commit }) {
    const result = await getLayers({
      groupId: '',
      isDistributed: true
    })
    commit('SET_LAYER_INFO', result.data?.list)
    console.log(result)
  },
  updateElement ({ state }, content: {type: 'is_check' | 'is_select', id: string, bool:boolean}) {
    const key = content.id.replaceAll('resource__', '')
    const type = content.type
    const layers = state.Layers
    const layer = layers.find(item => item.id === key)
    if (layer) {
      layer[type] = content.bool
    }
  },
  setLayerInfo ({ state }, layers) {
    // const layers = state.Layers
    const obj:{
      [key:string]:string
    } = {}
    layers.forEach(layer => {
      if (layer.type === LayerType.Default) {
        obj.default = layer.id
      } else {
        if (layer.type === LayerType.Share) {
          obj.share = layer.id
        }
      }
    })
    state.layerBaseInfo = obj
    console.log('state.layerBaseInfo', state.layerBaseInfo)
  },
  getLayerInfo ({ state }, id:string) {
    return state.layerBaseInfo[id]
  }
}
const storeOptions: StoreOptions<RootStateType> = {
  state: initStateFunc,
  getters,
  mutations,
  actions
}
const rootStore = createStore(storeOptions)
export default rootStore
export const storeKey: InjectionKey<Store<RootStateType>> = Symbol('')
type AllStateStoreTypes = RootStateType & {
  // moduleName: moduleType
}
export function useMyStore<T = AllStateStoreTypes> () {
  return useStore<T>(storeKey)
}
src/styles/common.scss
New file
@@ -0,0 +1,19 @@
html, body, #app, #my-app {
  height: 100%;
  overflow: hidden;
}
body {
  background-color: #f7f9fa;
  -webkit-font-smoothing: antialiased;
  // Prevent font enlargement in horizontal screen
  text-size-adjust: 100%;
  font-family: Roboto, sans-serif-medium, Arial, sans-serif;
  color: $main-text-color;
  font-size: 14px;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
src/styles/flex.style.scss
New file
@@ -0,0 +1,318 @@
.flex-display {
  display: flex;
}
.flex-column {
  @extend .flex-display;
  flex-direction: column;
}
.flex-row {
  @extend .flex-display;
  flex-direction: row;
}
.flex-align-start {
  align-items: flex-start;
}
.flex-align-end {
  align-items: flex-end;
}
.flex-align-baseline {
  align-items: baseline;
}
.flex-align-stretch {
  align-items: stretch;
}
.flex-align-center {
  align-items: center;
}
.flex-justify-start {
  justify-content: flex-start;
}
.flex-justify-end {
  justify-content: flex-end;
}
.flex-justify-center {
  justify-content: center;
}
.flex-justify-between {
  justify-content: space-between;
}
.flex-justify-around {
  justify-content: space-around;
}
//width
.width-100vw {
  width: 100vw;
}
.width-100 {
  width: 100%;
}
//height
.height-100vh {
  height: 100vh;
}
.height-100 {
  height: 100%;
}
//margin
m-5 {
  margin: -5px !important;
}
.mt-5 {
  margin-top: -5px !important;
}
.mt100 {
  margin-top: 100px !important;
}
.mt110 {
  margin-top: 110px !important;
}
.mb-5 {
  margin-bottom: -5px !important;
}
.ml-5 {
  margin-left: -5px !important;
}
.mr-5 {
  margin-right: -5px !important;
}
.m0 {
  margin: 0px !important;
}
.mt0 {
  margin-top: 0px !important;
}
.mb0 {
  margin-bottom: 0px !important;
}
.ml0 {
  margin-left: 0px !important;
}
.mr0 {
  margin-right: 0px !important;
}
.m5 {
  margin: 5px !important;
}
.mt5 {
  margin-top: 5px !important;
}
.mb5 {
  margin-bottom: 5px !important;
}
.ml5 {
  margin-left: 5px !important;
}
.mr5 {
  margin-right: 5px !important;
}
.m10 {
  margin: 10px !important;
}
.mt10 {
  margin-top: 10px !important;
}
.mb10 {
  margin-bottom: 10px !important;
}
.ml10 {
  margin-left: 10px !important;
}
.mr10 {
  margin-right: 10px !important;
}
.m15 {
  margin: 15px !important;
}
.mt15 {
  margin-top: 15px !important;
}
.mb15 {
  margin-bottom: 15px !important;
}
.ml15 {
  margin-left: 15px !important;
}
.mr15 {
  margin-right: 15px !important;
}
.m20 {
  margin: 20px !important;
}
.mt20 {
  margin-top: 20px !important;
}
.mb20 {
  margin-bottom: 20px !important;
}
.ml20 {
  margin-left: 20px !important;
}
.mr20 {
  margin-right: 20px !important;
}
.m25 {
  margin: 25px !important;
}
.mt25 {
  margin-top: 25px !important;
}
.mb25 {
  margin-bottom: 25px !important;
}
.ml25 {
  margin-left: 25px !important;
}
.mr25 {
  margin-right: 25px !important;
}
.m30 {
  margin: 30px !important;
}
.mt30 {
  margin-top: 30px !important;
}
.mb30 {
  margin-bottom: 30px !important;
}
.ml30 {
  margin-left: 30px !important;
}
.ml40 {
  margin-left: 40px !important;
}
.mr30 {
  margin-right: 30px !important;
}
.m50 {
  margin: 50px !important;
}
.mt50 {
  margin-top: 50px !important;
}
.mb50 {
  margin-bottom: 50px !important;
}
.ml50 {
  margin-left: 50px !important;
}
.mr50 {
  margin-right: 50px !important;
}
// padding值
.p0 {
  padding: 0 !important;
}
.pt0 {
  padding-top: 0 !important;
}
.pr0 {
  padding-right: 0 !important;
}
.pb0 {
  padding-bottom: 0 !important;
}
.pl0 {
  padding-left: 0 !important;
}
.p5 {
  padding: 5px;
}
.pt5 {
  padding-top: 5px;
}
.pr5 {
  padding-right: 5px;
}
.pb5 {
  padding-bottom: 5px;
}
.pl5 {
  padding-left: 5px;
}
.p10 {
  padding: 10px;
}
.pt10 {
  padding-top: 10px;
}
.pr10 {
  padding-right: 10px;
}
.pb10 {
  padding-bottom: 10px;
}
.pl10 {
  padding-left: 10px;
}
.p15 {
  padding: 15px;
}
.pt15 {
  padding-top: 15px;
}
.pr15 {
  padding-right: 15px;
}
.pb15 {
  padding-bottom: 15px;
}
.pl15 {
  padding-left: 15px;
}
.p20 {
  padding: 20px;
  box-sizing: border-box;
}
.pt20 {
  padding-top: 20px;
}
.pr20 {
  padding-right: 20px;
}
.pb20 {
  padding-bottom: 20px;
}
.pl20 {
  padding-left: 20px;
}
.p30 {
  padding: 30px;
  box-sizing: border-box;
}
.pt30 {
  padding-top: 30px;
}
.pr30 {
  padding-right: 30px;
}
.pb30 {
  padding-bottom: 30px;
}
.pl30 {
  padding-left: 30px;
}
.pb50 {
  padding-bottom: 50px;
}
.pl50 {
  padding-left: 50px;
}
.pl120 {
  padding-left: 120px;
}
.pl150 {
  padding-left: 150px;
}
.pt50 {
  padding-top: 50px;
}
src/styles/fonts.scss
New file
@@ -0,0 +1,72 @@
$font-family-sans-serif: 'Open Sans', BlinkMacSystemFont, 'Segoe UI', Roboto,
  'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB',
  'Microsoft YaHei', SimSun, sans-serif;
$line-heights: (
  12: 20px,
  14: 22px,
  16: 24px,
  18: 26px
);
// 用法: @include text(12)
@mixin text($size) {
  font-size: #{$size}px;
  line-height: map-get($line-heights, $size);
}
// 常规体
@mixin text-regular {
  font-weight: 400;
}
// 中粗体
@mixin text-semibold {
  font-weight: 600;
}
@mixin ellipsis {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.fz10 {
  font-size: 10;
}
.fz12 {
  font-size: 12px;
}
.fz14 {
  font-size: 14px;
}
.fz16 {
  font-size: 16px;
}
.fz18 {
  font-size: 18px;
}
.fz20 {
  font-size: 20px;
}
.fz22 {
  font-size: 22px;
}
.fz24 {
  font-size: 24px;
}
.fz26 {
  font-size: 26px;
}
.fz28 {
  font-size: 28px;
}
.fz30 {
  font-size: 30px;
}
.fz32 {
  font-size: 32px;
}
.fz35 {
  font-size: 35px;
}
src/styles/index.scss
New file
@@ -0,0 +1,3 @@
@import './common.scss';
@import 'flex.style.scss';
@import 'fonts.scss';
src/styles/reset.scss
New file
@@ -0,0 +1,164 @@
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video {
  margin        : 0;
  padding       : 0;
  border        : 0;
  font          : inherit;
  font-size     : 100%;
  vertical-align: baseline;
}
html {
  line-height                : 1;
  // -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
ol,
ul {
  list-style: none;
}
table {
  border-collapse: collapse;
  border-spacing : 0;
}
caption,
th,
td {
  font-weight   : normal;
  vertical-align: middle;
}
q,
blockquote {
  quotes: none;
}
q::before,
q::after,
blockquote::before,
blockquote::after {
  content: '';
  content: none;
}
a img {
  border: none;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section,
summary {
  display: block;
}
* {
  box-sizing: content-box;
}
a {
  background     : transparent;
  text-decoration: none;
}
button,
input[type='number'],
input[type='text'],
input[type='password'],
input[type='email'],
input[type='search'],
select,
textarea {
  font-family       : inherit;
  margin            : 0;
  -webkit-appearance: none;
}
src/styles/variables.scss
New file
@@ -0,0 +1,72 @@
$main-text-color: #000;
$header-height: 52px;
// Auxiliary color
$info: #1fa3f6;
$success: #28d445;
$danger: #e70102;
$alarm: #ffcc00;
$warning: #ffcc00;
$error: #e70102;
// 品牌色
$primary: #2d8cf0;
$primary-click: #2b85e4;
$primary-hover: #5cadff;
$primary-hover-dropdown: rgba($primary-hover, 0.2);
$primary-disabled: #274d75;
// 辅助色拓展
$danger-hover: #ff4d4e;
$danger-active: #d40001;
$menu-primary: #464c5b; // tab菜单主题色
// 图标颜色
$ic-white-normal: #fff;
$ic-black-normal: #4e4e4e;
$ic-hover: #a7a7a7;
$ic-disabled: #5f5f5f;
$ic-selected: #1088f2;
// 中性色-黑
$dark-bg-light: #868688; // 背景色浅色
$dark-btn-hover: #5d5f61; // 按钮 hover 色
$dark-border: #4f4f4f; // 边框色
$dark-btn-disabled: #3c3c3c; // 按钮主色禁用
$dark-border-secondary: #393939; // 第二边框色
$dark-basic-primary: #232323; // 第一基础底色
$dark-basic-secondary: #282828; // 第二基础底色
$dark-highlight: #232323; // 高亮色
$dark-disable: #444444; // 置灰底色
$dark-project-disabled: #292929;
// 中性色-白
$light-bg-primary: #fff; // 1 背景
$light-bg-secondary: #f7f9fa; // 2 背景
$light-divider: #e8eaec; // 3 分割线
$light-border: #dcdee2; // 4 边框
$light-disabled: #c5c8ce; // 5 失效
$light-auxiliary: #808695; // 6 辅助图标
$light-main-text: #515a6e; // 7 正文 ?用处
$light-title: #17233d; // 8 标题 ?用处
$light-bg-menu: #3b3e40; // 9 菜单栏背景色  ?用处
$light-border-secondary: #e8e8e8; // 第二边框色
// 字体
// 白色
$text-white-basic: #fff; // 基础色
$text-white-main: rgba($text-white-basic, 1); // 正文
$text-white-secondary: rgba($text-white-basic, 0.45); // 次级
$text-white-disabled: rgba($text-white-basic, 0.25); // 置灰
// 黑色
$text-black-basic: #000000; // 基础色
$text-black-emphasize: rgba($text-black-basic, 0.85); // 强调
$text-black-main: rgba($text-black-basic, 0.65); // 正文
$text-black-secondary: rgba($text-black-basic, 0.45); // 次要
$text-black-disabled: rgba($text-black-basic, 0.25); // 置灰
$text-link: $primary;
$text-danger: $danger;
// 标签
$tag-green: #19be6b;
// 滚动条等颜色
$scroll-bar: #c5c8ce;
$scroll-bar-dark: #5f5f5f;
// 选择框
$select-disabled: #d8d8d8;
src/types/enums.ts
New file
@@ -0,0 +1,19 @@
export enum ERouterName {
    Element = 'element',
    Project = 'project',
    Tsa = 'tsa',
    Layer = 'layer',
    Media = 'media',
    Wayline = 'wayline',
    Livestream = 'livestream',
    Pilot = 'pilot-login',
    PilotHome = 'pilot-home',
    PilotMedia = 'pilot-media',
    PilotLiveshare = 'pilot-liveshare'
}
export enum EStorageKey {
    LANG_CODE = 'DJI_CREATE_VITE_H5_APP:lang_code',
    TEST_TOOLS_POSITION_STORAGE_KEY = 'DJI_CREATE_VITE_H5_APP:test_tools_position',
    SESSION_ID = 'DJI_CREATE_VITE_H5_APP:sess'
}
src/types/index.ts
New file
@@ -0,0 +1 @@
export * from './enums'
src/types/map-enum.ts
New file
@@ -0,0 +1,6 @@
export enum MapDoodleEnum {
    PIN = 'pin',
    POLYLINE = 'polyline',
    POLYGON = 'polygon',
    Close = 'off'
}
src/types/map.d.ts
New file
@@ -0,0 +1,100 @@
export interface MapGeographicPosition {
 longitude: number;
 latitude: number;
 height?: number;
}
export enum LayerType {
 Normal,
 Default,
 Share
}
export interface pinAMapPosition {
 KL: number
 className: string
 kT: number
 lng: number
 lat: number
}
export enum ResourceStatus {
 NotShow,
 Show
}
export type GeojsonCoordinate = [number, number, number?]
export interface GeojsonLine {
 type: 'Feature'
 properties: {
   color: string
   directConnected?: boolean
 }
 geometry: {
   type: 'LineString'
   coordinates: GeojsonCoordinate[]
 }
}
export interface GeojsonPolygon {
 type: 'Feature'
 properties: {
   color: string
 }
 geometry: {
   type: 'Polygon'
   coordinates: GeojsonCoordinate[][]
 }
}
export interface GeojsonPoint {
 type: 'Feature'
 properties: {
   color: string
   clampToGround?: boolean
 }
 geometry: {
   type: 'Point'
   coordinates: GeojsonCoordinate
 }
}
export type GeojsonFeature = GeojsonLine | GeojsonPolygon | GeojsonPoint
interface ResourceObjectBasic {
 user_name: string
 user_id?: string
 type:0| 1 | 2
 content: unknown
}
export interface PinResource extends ResourceObjectBasic {
 type: 0
 content: GeojsonFeature
}
export type ResourceObject = PinResource
export enum LayerElevationLoadStatus {
 Unload,
 Load
}
export interface LayerResource {
 id: string
 name: string
 order: number
 status: ResourceStatus
 resource: ResourceObject | null
 display: number
 create_time: number
 elevation_load_status?: LayerElevationLoadStatus //
}
export interface Layer {
 id: string
 name: string
 order: number
 create_time: number
 type: LayerType
 is_distributed: boolean
 is_lock: boolean
 elements: null | LayerResource[],
 is_check?: boolean
 is_select?: boolean
}
src/types/mapLayer.ts
New file
@@ -0,0 +1,98 @@
import { MapElementEnum } from '/@/constants/map'
export interface mapLayerStyle {
  background: string
}
export interface mapLayerChildren {
  key: string
  style: mapLayerStyle
  title: string
  obj: any
}
export interface mapLayerChildrenObj {
  className: string
  key: string
  name: string
  type: string
}
// 拖拽事件
export interface DropEvent {
  node: {
    eventKey: string
    pos: string
    $parent: any
  }
  dragNode: {
    eventKey: string
  }
  dropPosition: number
  dropToGap: boolean
}
export interface mapLayer {
  key?: string
  title: string
  id: string
  name: string
  style: mapLayerStyle
  elements: any
}
export interface elementGroupsReq{
  groupId: string
  isDistributed: boolean
}
export interface PostElementsBody {
  id: string
  name: string
  resource: {
   type: MapElementEnum,
   user_name?: string,
   content: {
    type:string,
    properties:{
      color:string,
      clampToGround:boolean
    },
    geometry:{
      type:string,
      coordinates:unknown
    }
   },
  }
}
export interface Color {
  id: number
  color: string
  selected: boolean,
  name: string
}
export enum GeoType {
  LineString = 'LineString',
  Polygon = 'Polygon',
  Point = 'Point'
}
export enum ResourceStatus {
  NotShow,
  Show
}
export enum LayerElevationLoadStatus {
  Unload,
  Load
}
export interface PutElementsBody {
  name?: string
  status?: ResourceStatus
  content?: unknown
  display?: number
  elevation_load_status?: LayerElevationLoadStatus
}
export enum LayerType {
  Normal,
  Default,
  Share,
  Reconstruction
}
src/use-common-components.ts
New file
@@ -0,0 +1,13 @@
import { App, DefineComponent } from 'vue'
const components: Record<string, DefineComponent<{}, {}, any>> = {
}
export const CommonComponents = {
  install (app: App): void {
    Object.keys(components).forEach(name => {
      app.component(name, components[name])
    })
  }
}
src/utils/data-process.ts
New file
@@ -0,0 +1,4 @@
export function formatPhoneNum (phoneNum: string | number) {
  const str = String(phoneNum)
  return str.substring(0, 3) + '****' + str.slice(-4)
}
src/utils/genjson.ts
New file
@@ -0,0 +1,81 @@
import {
  MapGeographicPosition,
} from '/@/types/map'
export type GeojsonCoordinate = [number, number, number?]
export interface GeojsonLine {
 type: 'Feature'
 properties: {
   color: string
   directConnected?: boolean
 }
 geometry: {
   type: 'LineString'
   coordinates: GeojsonCoordinate[]
 }
}
export interface GeojsonPolygon {
 type: 'Feature'
 properties: {
   color: string
 }
 geometry: {
   type: 'Polygon'
   coordinates: GeojsonCoordinate[][]
 }
}
export interface GeojsonPoint {
 type: 'Feature'
 properties: {
   color: string
   clampToGround?: boolean
 }
 geometry: {
   type: 'Point'
   coordinates: GeojsonCoordinate
 }
}
export type GeojsonFeature = GeojsonLine | GeojsonPolygon | GeojsonPoint
export function geographic2Coordinate (position: MapGeographicPosition): GeojsonCoordinate {
  const coordinates: GeojsonCoordinate = [position.longitude, position.latitude]
  if (position.height !== undefined) coordinates.push(position.height)
  return coordinates
}
export function generateLine (coordinates: MapGeographicPosition[], properties: GeojsonLine['properties']): GeojsonFeature {
  return {
    type: 'Feature',
    properties,
    geometry: {
      type: 'LineString',
      coordinates: coordinates.map(geographic2Coordinate),
    },
  }
}
export function generatePolygon (coordinates: MapGeographicPosition[], properties: GeojsonPolygon['properties']): GeojsonFeature {
  return {
    type: 'Feature',
    properties,
    geometry: {
      type: 'Polygon',
      coordinates: [coordinates.map(geographic2Coordinate)],
    },
  }
}
export function generatePoint (position: MapGeographicPosition, properties: GeojsonPoint['properties']): GeojsonFeature {
  return {
    type: 'Feature',
    properties,
    geometry: {
      type: 'Point',
      coordinates: geographic2Coordinate(position),
    },
  }
}
src/utils/layer-tree.ts
New file
@@ -0,0 +1,19 @@
const layerTreeTypes = ['layer', 'resource'] as const
type LayerTreeType = (typeof layerTreeTypes)[number]
const Spliter = '__'
export function getLayerTreeKey (type: LayerTreeType, id: number | string) {
  return `${type}${Spliter}${id}`
}
export function isLayerTreeKey (key: string, type?: LayerTreeType) {
  if (type) {
    return key.startsWith(`${type}${Spliter}`)
  } else {
    return layerTreeTypes.some(t => key.startsWith(`${t}${Spliter}`))
  }
}
export function getIdFromLayerTreeKey (key: string) {
  return key.split(Spliter)[1]
}
src/utils/logger.ts
New file
@@ -0,0 +1,28 @@
/**
 * Used for log printing in a non-production environment
 * @param args
 */
export function consoleLog (...args: Parameters<typeof console.log>) {
  if (import.meta.env.VITE_APP_ENVIRONMENT !== 'PROD') {
    window.console.log.apply(null, args) // eslint-disable-line no-console
  }
}
export function consoleWarn (...args: Parameters<typeof console.warn>) {
  if (import.meta.env.VITE_APP_ENVIRONMENT !== 'PROD') {
    console.warn.apply(null, args) // eslint-disable-line no-console
  }
}
export function consoleError (...args: Parameters<typeof console.error>) {
  if (import.meta.env.VITE_APP_ENVIRONMENT !== 'PROD') {
    console.error.apply(null, args) // eslint-disable-line no-console
  }
}
export function testEnvLog (...args: Parameters<typeof console.log>) {
  if (import.meta.env.VITE_APP_ENVIRONMENT !== 'PROD') {
    console.log.apply(null, args) // eslint-disable-line no-console
  }
}
src/utils/map-layer-utils.ts
New file
@@ -0,0 +1,44 @@
import { pinAMapPosition, MapGeographicPosition, Layer, LayerType, LayerElevationLoadStatus } from '/@/types/map'
import { generatePoint, generateLine, generatePolygon } from '/@/utils/genjson'
import { MapDoodleColor, MapElementEnum } from '/@/constants/map'
function getPinPosition (pinAMapPosition: pinAMapPosition):MapGeographicPosition {
  return { height: 0, latitude: pinAMapPosition.lat, longitude: pinAMapPosition.lng }
}
export function generatePointContent (pinAMapPosition: pinAMapPosition) {
  const position = getPinPosition(pinAMapPosition)
  return {
    type: MapElementEnum.PIN,
    content: generatePoint(position, {
      color: MapDoodleColor.PinColor,
      clampToGround: true,
    })
  }
}
function getLieOrPolyPosition (mapPosition: pinAMapPosition[]):MapGeographicPosition[] {
  const position = [] as MapGeographicPosition[]
  mapPosition.forEach(item => {
    position.push({ height: 0, latitude: item.lat, longitude: item.lng })
  })
  return position
}
export function generateLineContent (mapPosition: pinAMapPosition[]) {
  const position = getLieOrPolyPosition(mapPosition)
  return {
    type: MapElementEnum.LINE,
    content: generateLine(position, {
      color: MapDoodleColor.PolylineColor,
      directConnected: false,
    })
  }
}
export function generatePolyContent (mapPosition: pinAMapPosition[]) {
  const position = getLieOrPolyPosition(mapPosition)
  return {
    type: MapElementEnum.POLY,
    content: generatePolygon(position, {
      color: MapDoodleColor.PolygonColor,
    })
  }
}
src/utils/storage.ts
New file
@@ -0,0 +1,42 @@
import { EStorageKey } from '/@/types/enums'
import { consoleWarn } from './logger'
function getStorageData (key: EStorageKey, parse?: boolean): string | null
function getStorageData<T> (key: EStorageKey, parse?: boolean): T | null
function getStorageData (key: EStorageKey, parse?: boolean): any {
  const value = window.localStorage.getItem(key)
  if (parse && value) {
    try {
      const result = JSON.parse(value)
      return result
    } catch (e) {
      consoleWarn('appStorage.get failed, err:', e)
      return null
    }
  } else {
    return value
  }
}
function clearStorageData (key: EStorageKey | EStorageKey[]) {
  let keyList: EStorageKey[] = []
  if (Array.isArray(key)) {
    keyList = key
  } else {
    keyList = [key]
  }
  keyList.forEach(item => {
    window.localStorage.removeItem(item)
  })
}
const appStorage = {
  save (key: EStorageKey, value: string) {
    window.localStorage.setItem(key, value)
  },
  get: getStorageData,
  clear: clearStorageData,
}
export default appStorage
src/utils/uuid.ts
New file
@@ -0,0 +1,6 @@
export function uuidv4 () {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
    const r = Math.random() * 16 | 0; const v = c === 'x' ? r : (r & 0x3 | 0x8)
    return v.toString(16)
  })
}
src/vendors/coordtransform.js
New file
@@ -0,0 +1,85 @@
/**
 * Conversion between the coordinates of the National Bureau of Survey and Measurement (Mars coordinates, GCJ02) and the WGS84 coordinate system
 */
const x_PI = 3.14159265358979324 * 3000.0 / 180.0;
const PI = 3.1415926535897932384626;
const a = 6378245.0;
const ee = 0.00669342162296594323;
/**
 * WGS84 to Mars coordinate system GCj02
 * @param lng
 * @param lat
 * @returns {*[]}
 */
export function wgs84togcj02(lng, lat) {
    if (out_of_china(lng, lat)) {
        return [lng, lat]
    }
    else {
        var dlat = transformlat(lng - 105.0, lat - 35.0);
        var dlng = transformlng(lng - 105.0, lat - 35.0);
        var radlat = lat / 180.0 * PI;
        var magic = Math.sin(radlat);
        magic = 1 - ee * magic * magic;
        var sqrtmagic = Math.sqrt(magic);
        dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
        dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
        var mglat = lat + dlat;
        var mglng = lng + dlng;
        return [mglng, mglat]
    }
}
/**
 * GCJ02 transform WGS84
 * @param lng
 * @param lat
 * @returns {*[]}
 */
 export function gcj02towgs84(lng, lat) {
    var lat = +lat;
    var lng = +lng;
    if (out_of_china(lng, lat)) {
      return [lng, lat]
    } else {
      var dlat = transformlat(lng - 105.0, lat - 35.0);
      var dlng = transformlng(lng - 105.0, lat - 35.0);
      var radlat = lat / 180.0 * PI;
      var magic = Math.sin(radlat);
      magic = 1 - ee * magic * magic;
      var sqrtmagic = Math.sqrt(magic);
      dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
      dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
      var mglat = lat + dlat;
      var mglng = lng + dlng;
      return [lng * 2 - mglng, lat * 2 - mglat]
    }
}
function transformlat(lng, lat) {
    var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
    ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
    ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
    ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
    return ret
}
export function transformlng(lng, lat) {
    var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
    ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
    ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
    ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
    return ret
}
/**
 * Judge whether you are in the country or not if you are not in the country
 * @param lng
 * @param lat
 * @returns {boolean}
 */
function out_of_china(lng, lat) {
    return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false);
}
src/vendors/jswebrtc.min.js
New file
@@ -0,0 +1,2 @@
var JSWebrtc = { Player: null, VideoElement: null, CreateVideoElements: function () { const elements = document.querySelectorAll('.jswebrtc'); for (let i = 0; i < elements.length; i++) { new JSWebrtc.VideoElement(elements[i]) } }, FillQuery: function (query_string, obj) { obj.user_query = {}; if (query_string.length == 0) return; if (query_string.indexOf('?') >= 0)query_string = query_string.split('?')[1]; const queries = query_string.split('&'); for (let i = 0; i < queries.length; i++) { const query = queries[i].split('='); obj[query[0]] = query[1]; obj.user_query[query[0]] = query[1] } if (obj.domain)obj.vhost = obj.domain }, ParseUrl: function (rtmp_url) { const a = document.createElement('a'); a.href = rtmp_url.replace('rtmp://', 'http://').replace('webrtc://', 'http://').replace('rtc://', 'http://'); let vhost = a.hostname; let app = a.pathname.substr(1, a.pathname.lastIndexOf('/') - 1); const stream = a.pathname.substr(a.pathname.lastIndexOf('/') + 1); app = app.replace('...vhost...', '?vhost='); if (app.indexOf('?') >= 0) { const params = app.substr(app.indexOf('?')); app = app.substr(0, app.indexOf('?')); if (params.indexOf('vhost=') > 0) { vhost = params.substr(params.indexOf('vhost=') + 'vhost='.length); if (vhost.indexOf('&') > 0) { vhost = vhost.substr(0, vhost.indexOf('&')) } } } if (a.hostname == vhost) { const re = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/; if (re.test(a.hostname))vhost = '__defaultVhost__' } let schema = 'rtmp'; if (rtmp_url.indexOf('://') > 0)schema = rtmp_url.substr(0, rtmp_url.indexOf('://')); let port = a.port; if (!port) { if (schema === 'http') { port = 80 } else if (schema === 'https') { port = 443 } else if (schema === 'rtmp') { port = 1935 } else if (schema === 'webrtc' || schema === 'rtc') { port = 1985 } } const ret = { url: rtmp_url, schema: schema, server: a.hostname, port: port, vhost: vhost, app: app, stream: stream }; JSWebrtc.FillQuery(a.search, ret); return ret }, HttpPost: function (url, data) { return new Promise(function (resolve, reject) { let xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && (xhr.status >= 200 && xhr.status < 300)) { const respone = JSON.parse(xhr.responseText); xhr.onreadystatechange = new Function(); xhr = null; resolve(respone) } }; xhr.open('POST', url, true); xhr.timeout = 5e3; xhr.responseType = 'text'; xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(data) }) } }; if (document.readyState === 'complete') { JSWebrtc.CreateVideoElements() } else { document.addEventListener('DOMContentLoaded', JSWebrtc.CreateVideoElements) }JSWebrtc.VideoElement = (function () { 'use strict'; var VideoElement = function (element) { const url = element.dataset.url; if (!url) { throw 'VideoElement has no `data-url` attribute' } const addStyles = function (element, styles) { for (const name in styles) { element.style[name] = styles[name] } }; this.container = element; addStyles(this.container, { display: 'inline-block', position: 'relative', minWidth: '80px', minHeight: '80px' }); this.video = document.createElement('video'); this.video.width = 960; this.video.height = 540; addStyles(this.video, { display: 'block', width: '100%' }); this.container.appendChild(this.video); this.playButton = document.createElement('div'); this.playButton.innerHTML = VideoElement.PLAY_BUTTON; addStyles(this.playButton, { zIndex: 2, position: 'absolute', top: '0', bottom: '0', left: '0', right: '0', maxWidth: '75px', maxHeight: '75px', margin: 'auto', opacity: '0.7', cursor: 'pointer' }); this.container.appendChild(this.playButton); const options = { video: this.video }; for (const option in element.dataset) { try { options[option] = JSON.parse(element.dataset[option]) } catch (err) { options[option] = element.dataset[option] } } this.player = new JSWebrtc.Player(url, options); element.playerInstance = this.player; if (options.poster && !options.autoplay) { options.decodeFirstFrame = false; this.poster = new Image(); this.poster.src = options.poster; this.poster.addEventListener('load', this.posterLoaded); addStyles(this.poster, { display: 'block', zIndex: 1, position: 'absolute', top: 0, left: 0, bottom: 0, right: 0 }); this.container.appendChild(this.poster) } if (!this.player.options.streaming) { this.container.addEventListener('click', this.onClick.bind(this)) } if (options.autoplay) { this.playButton.style.display = 'none' } if (this.player.audioOut && !this.player.audioOut.unlocked) { let unlockAudioElement = this.container; if (options.autoplay) { this.unmuteButton = document.createElement('div'); this.unmuteButton.innerHTML = VideoElement.UNMUTE_BUTTON; addStyles(this.unmuteButton, { zIndex: 2, position: 'absolute', bottom: '10px', right: '20px', width: '75px', height: '75px', margin: 'auto', opacity: '0.7', cursor: 'pointer' }); this.container.appendChild(this.unmuteButton); unlockAudioElement = this.unmuteButton } this.unlockAudioBound = this.onUnlockAudio.bind(this, unlockAudioElement); unlockAudioElement.addEventListener('touchstart', this.unlockAudioBound, false); unlockAudioElement.addEventListener('click', this.unlockAudioBound, true) } }; VideoElement.prototype.onUnlockAudio = function (element, ev) { if (this.unmuteButton) { ev.preventDefault(); ev.stopPropagation() } this.player.audioOut.unlock(function () { if (this.unmuteButton) { this.unmuteButton.style.display = 'none' }element.removeEventListener('touchstart', this.unlockAudioBound); element.removeEventListener('click', this.unlockAudioBound) }.bind(this)) }; VideoElement.prototype.onClick = function (ev) { if (this.player.isPlaying) { this.player.pause(); this.playButton.style.display = 'block' } else { this.player.play(); this.playButton.style.display = 'none'; if (this.poster) { this.poster.style.display = 'none' } } }; VideoElement.PLAY_BUTTON = '<svg style="max-width: 75px; max-height: 75px;" ' + 'viewBox="0 0 200 200" alt="Play video">' + '<circle cx="100" cy="100" r="90" fill="none" ' + 'stroke-width="15" stroke="#fff"/>' + '<polygon points="70, 55 70, 145 145, 100" fill="#fff"/>' + '</svg>'; VideoElement.UNMUTE_BUTTON = '<svg style="max-width: 75px; max-height: 75px;" viewBox="0 0 75 75">' + '<polygon class="audio-speaker" stroke="none" fill="#fff" ' + 'points="39,13 22,28 6,28 6,47 21,47 39,62 39,13"/>' + '<g stroke="#fff" stroke-width="5">' + '<path d="M 49,50 69,26"/>' + '<path d="M 69,50 49,26"/>' + '</g>' + '</svg>'; return VideoElement }()); JSWebrtc.Player = (function () { 'use strict'; const Player = function (url, options) { this.options = options || {}; if (!url.match(/^webrtc?:\/\//)) { throw 'JSWebrtc just work with webrtc' } if (!this.options.video) { throw 'VideoElement is null' } this.urlParams = JSWebrtc.ParseUrl(url); this.pc = null; this.autoplay = !!options.autoplay || false; this.paused = true; if (this.autoplay) this.options.video.muted = true; this.startLoading() }; Player.prototype.startLoading = function () { const _self = this; if (_self.pc) { _self.pc.close() }_self.pc = new RTCPeerConnection(null); _self.pc.ontrack = function (event) { _self.options.video.srcObject = event.streams[0] }; _self.pc.addTransceiver('audio', { direction: 'recvonly' }); _self.pc.addTransceiver('video', { direction: 'recvonly' }); _self.pc.createOffer().then(function (offer) { return _self.pc.setLocalDescription(offer).then(function () { return offer }) }).then(function (offer) { return new Promise(function (resolve, reject) { const port = _self.urlParams.port || 1985; let api = _self.urlParams.user_query.play || '/rtc/v1/play/'; if (api.lastIndexOf('/') != api.length - 1) { api += '/' } let url = 'http://' + _self.urlParams.server + ':' + port + api; for (const key in _self.urlParams.user_query) { if (key != 'api' && key != 'play') { url += '&' + key + '=' + _self.urlParams.user_query[key] } } const data = { api: url, streamurl: _self.urlParams.url, clientip: null, sdp: offer.sdp }; console.log('offer: ', data); JSWebrtc.HttpPost(url, JSON.stringify(data)).then(function (res) { console.log('answer: ', res); resolve(res.sdp) }, function (rej) { reject(rej) }) }) }).then(function (answer) { return _self.pc.setRemoteDescription(new RTCSessionDescription({ type: 'answer', sdp: answer })) }).catch(function (reason) { throw reason }); if (this.autoplay) { this.play() } }; Player.prototype.play = function (ev) { if (this.animationId) { return } this.animationId = requestAnimationFrame(this.update.bind(this)); this.paused = false }; Player.prototype.pause = function (ev) { if (this.paused) { return }cancelAnimationFrame(this.animationId); this.animationId = null; this.isPlaying = false; this.paused = true; this.options.video.pause(); if (this.options.onPause) { this.options.onPause(this) } }; Player.prototype.stop = function (ev) { this.pause() }; Player.prototype.destroy = function () { this.pause(); this.pc && this.pc.close() && this.pc.destroy(); this.audioOut && this.audioOut.destroy() }; Player.prototype.update = function () { this.animationId = requestAnimationFrame(this.update.bind(this)); if (this.options.video.readyState < 4) { return } if (!this.isPlaying) { this.isPlaying = true; this.options.video.play(); if (this.options.onPlay) { this.options.onPlay(this) } } }; return Player }())
export default JSWebrtc
src/vite-env.d.ts
New file
@@ -0,0 +1 @@
/// <reference types="vite/client" />
tsconfig.json
New file
@@ -0,0 +1,29 @@
{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "moduleResolution": "node",
    "strict": true,
    "jsx": "preserve",
    "sourceMap": true,
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "baseUrl": ".",
    "types": ["vite/client"],
    "lib": [
      "esnext",
      "dom"
    ],
    "paths": {
      "/@/*": [
        "src/*"
      ],
    }
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.d.ts",
    "src/**/*.tsx",
    "src/**/*.vue"
, "src/vendors/coordtransform.js"  ]
}
vite.config.ts
New file
@@ -0,0 +1,70 @@
import vue from '@vitejs/plugin-vue'
// config alias
import path from 'path'
import { ConfigEnv, defineConfig, UserConfigExport } from 'vite'
import ViteComponents, { AntDesignVueResolver } from 'vite-plugin-components'
// Introduce eslint plugin
import eslintPlugin from 'vite-plugin-eslint'
import OptimizationPersist from 'vite-plugin-optimize-persist'
import PkgConfig from 'vite-plugin-package-config'
import viteSvgIcons from 'vite-plugin-svg-icons'
import { viteVConsole } from 'vite-plugin-vconsole'
// https://vitejs.dev/config/
export default ({ command, mode }: ConfigEnv): UserConfigExport => defineConfig({
  plugins: [
    vue(),
    eslintPlugin({
      fix: true
    }),
    ViteComponents({
      customComponentResolvers: [AntDesignVueResolver()],
    }),
    viteSvgIcons({
      // 指定需要缓存的图标文件夹
      iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
      // 指定symbolId格式
      symbolId: 'icon-[dir]-[name]',
    }),
    viteVConsole({
      entry: path.resolve(__dirname, './src/main.ts'), // 入口文件
      // localEnabled: command === 'serve', // serve开发环境下
      // enabled: command !== 'serve' || mode === 'test', // 打包环境下/发布测试包,
      config: { // vconsole 配置项
        maxLogNumber: 1000,
        theme: 'light'
      }
    }),
    PkgConfig(),
    OptimizationPersist()
    // [svgBuilder('./src/assets/icons/')] // All svg under src/icons/svg/ have been imported here, no need to import separately
  ],
  server: {
    open: true,
    host: '0.0.0.0',
    port: 8080
  },
  envDir: './env',
  resolve: {
    alias: [{
      // https://github.com/vitejs/vite/issues/279#issuecomment-635646269
      find: '/@',
      replacement: path.resolve(__dirname, './src'),
    }
    ]
  },
  css: {
    preprocessorOptions: {
      scss: {
        // example : additionalData: `@import "./src/design/styles/variables";`
        // dont need include file extend .scss
        additionalData: '@import "./src/styles/variables";'
      },
    }
  },
  base: '/',
  build: {
    target: ['es2015'], // 最低支持 es2015
    sourcemap: true
  }
})
yarn.lock
New file
@@ -0,0 +1,3927 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@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"
"@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"
  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"
"@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"
  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"
"@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"
  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/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"
  dependencies:
    "@babel/code-frame" "^7.16.7"
    "@babel/generator" "^7.16.7"
    "@babel/helper-compilation-targets" "^7.16.7"
    "@babel/helper-module-transforms" "^7.16.7"
    "@babel/helpers" "^7.16.7"
    "@babel/parser" "^7.16.7"
    "@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"
"@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"
  dependencies:
    "@babel/types" "^7.16.8"
    "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"
  dependencies:
    "@babel/compat-data" "^7.16.4"
    "@babel/helper-validator-option" "^7.16.7"
    "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"
  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"
  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"
  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"
  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"
  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"
  dependencies:
    "@babel/helper-environment-visitor" "^7.16.7"
    "@babel/helper-module-imports" "^7.16.7"
    "@babel/helper-simple-access" "^7.16.7"
    "@babel/helper-split-export-declaration" "^7.16.7"
    "@babel/helper-validator-identifier" "^7.16.7"
    "@babel/template" "^7.16.7"
    "@babel/traverse" "^7.16.7"
    "@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"
"@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"
  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"
  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"
"@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"
"@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"
  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"
  dependencies:
    "@babel/helper-validator-identifier" "^7.16.7"
    "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"
"@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"
  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"
  dependencies:
    "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"
"@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"
  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"
  dependencies:
    "@babel/code-frame" "^7.16.7"
    "@babel/generator" "^7.16.8"
    "@babel/helper-environment-visitor" "^7.16.7"
    "@babel/helper-function-name" "^7.16.7"
    "@babel/helper-hoist-variables" "^7.16.7"
    "@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"
"@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"
  dependencies:
    "@babel/helper-validator-identifier" "^7.16.7"
    "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"
"@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"
  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"
"@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"
  dependencies:
    "@humanwhocodes/object-schema" "^1.2.0"
    "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"
"@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"
  dependencies:
    "@intlify/devtools-if" "9.1.9"
    "@intlify/message-compiler" "9.1.9"
    "@intlify/message-resolver" "9.1.9"
    "@intlify/runtime" "9.1.9"
    "@intlify/shared" "9.1.9"
    "@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"
  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"
  dependencies:
    "@intlify/message-resolver" "9.1.9"
    "@intlify/shared" "9.1.9"
    "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"
"@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"
  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"
"@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"
  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"
  dependencies:
    "@nodelib/fs.stat" "2.0.5"
    "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.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"
  dependencies:
    "@nodelib/fs.scandir" "2.1.5"
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
"@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"
"@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"
"@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"
"@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"
"@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"
"@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"
  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"
"@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"
  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"
"@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"
  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"
"@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"
  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"
"@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"
  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"
  dependencies:
    "@typescript-eslint/experimental-utils" "5.9.1"
    "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"
"@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"
  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"
"@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"
  dependencies:
    "@typescript-eslint/types" "5.9.1"
    "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"
  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"
"@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"
"@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"
  dependencies:
    "@babel/parser" "^7.16.4"
    "@vue/shared" "3.2.26"
    "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"
  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"
  dependencies:
    "@babel/parser" "^7.16.4"
    "@vue/compiler-core" "3.2.26"
    "@vue/compiler-dom" "3.2.26"
    "@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"
"@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"
  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"
"@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"
  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"
"@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"
  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"
  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"
  dependencies:
    "@vue/runtime-core" "3.2.26"
    "@vue/shared" "3.2.26"
    "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"
  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"
"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@^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"
"agora-rtc-sdk-ng@latest":
  "integrity" "sha512-Jogn3TQC7VdA7uZjGYmaAs0XzgYBgGs6nGA67/dQVjqC7kiwAfkQsAuvbevE/qxrVJmLfqtDTNxP40IFvnTlgQ=="
  "resolved" "https://registry.npmmirror.com/agora-rtc-sdk-ng/-/agora-rtc-sdk-ng-4.9.1.tgz"
  "version" "4.9.1"
"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"
  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"
"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"
  dependencies:
    "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-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@^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-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@^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"
  dependencies:
    "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"
  dependencies:
    "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"
  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"
"anymatch@~3.1.2":
  "integrity" "sha1-wFV8CWrzLxBhmPT04qODU343hxY="
  "resolved" "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.2.tgz"
  "version" "3.1.2"
  dependencies:
    "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"
  dependencies:
    "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-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-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"
"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"
  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"
"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-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-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.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"
  dependencies:
    "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"
"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"
"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"
"atob@^2.1.2":
  "integrity" "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k="
  "resolved" "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz"
  "version" "2.1.2"
"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"
  dependencies:
    "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"
  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"
"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"
  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"
"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.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"
"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@~0.3.0":
  "integrity" "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk="
  "resolved" "https://registry.npm.taobao.org/binary/download/binary-0.3.0.tgz"
  "version" "0.3.0"
  dependencies:
    "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.4.1":
  "integrity" "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM="
  "resolved" "https://registry.npm.taobao.org/bluebird/download/bluebird-3.4.7.tgz"
  "version" "3.4.7"
"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"
"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"
  dependencies:
    "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"
  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"
"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"
  dependencies:
    "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"
  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"
"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"
"buffers@~0.1.1":
  "integrity" "sha1-skV5w77U1tOWru5tmorn9Ugqt7s="
  "resolved" "https://registry.npm.taobao.org/buffers/download/buffers-0.1.1.tgz"
  "version" "0.1.1"
"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"
  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"
"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"
  dependencies:
    "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"
"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"
  dependencies:
    "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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
  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"
"chalk@^2.0.0":
  "integrity" "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ="
  "resolved" "https://registry.npmmirror.com/chalk/download/chalk-2.4.2.tgz"
  "version" "2.4.2"
  dependencies:
    "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"
  dependencies:
    "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"
  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"
"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"
  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"
  optionalDependencies:
    "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"
  dependencies:
    "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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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":
  "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
  "resolved" "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz"
  "version" "1.1.3"
"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"
"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"
"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"
"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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
"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-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"
"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-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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
"csso@^4.2.0":
  "integrity" "sha1-6jpWE0bo3J9UbW/r7dUBh884lSk="
  "resolved" "https://registry.npmmirror.com/csso/download/csso-4.2.0.tgz"
  "version" "4.2.0"
  dependencies:
    "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"
"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"
  dependencies:
    "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"
  dependencies:
    "ms" "2.0.0"
"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"
  dependencies:
    "ms" "2.0.0"
"debug@^3.2.7":
  "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="
  "resolved" "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz"
  "version" "3.2.7"
  dependencies:
    "ms" "^2.1.1"
"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"
  dependencies:
    "ms" "2.1.2"
"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"
  dependencies:
    "object-keys" "^1.0.12"
"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"
  dependencies:
    "is-descriptor" "^0.1.0"
"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"
  dependencies:
    "is-descriptor" "^1.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"
  dependencies:
    "is-descriptor" "^1.0.2"
    "isobject" "^3.0.1"
"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"
  dependencies:
    "path-type" "^4.0.0"
"doctrine@^2.1.0":
  "integrity" "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850="
  "resolved" "https://registry.npm.taobao.org/doctrine/download/doctrine-2.1.0.tgz"
  "version" "2.1.0"
  dependencies:
    "esutils" "^2.0.2"
"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"
  dependencies:
    "esutils" "^2.0.2"
"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"
"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"
"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"
  dependencies:
    "domelementtype" "^2.0.1"
    "domhandler" "^4.2.0"
    "entities" "^2.0.0"
"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"
  dependencies:
    "domelementtype" "^2.0.1"
    "entities" "^2.0.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"
  dependencies:
    "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"
  dependencies:
    "domelementtype" "^2.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"
  dependencies:
    "dom-serializer" "0"
    "domelementtype" "1"
"domutils@^2.8.0":
  "integrity" "sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU="
  "resolved" "https://registry.npmmirror.com/domutils/download/domutils-2.8.0.tgz"
  "version" "2.8.0"
  dependencies:
    "dom-serializer" "^1.0.1"
    "domelementtype" "^2.2.0"
    "domhandler" "^4.2.0"
"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"
  dependencies:
    "no-case" "^3.0.4"
    "tslib" "^2.0.3"
"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"
  dependencies:
    "readable-stream" "^2.0.2"
"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"
"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"
  dependencies:
    "ansi-colors" "^4.1.1"
"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"
"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"
"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"
"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"
"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-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@^0.13.12":
  "integrity" "sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw=="
  "resolved" "https://registry.npmmirror.com/esbuild/download/esbuild-0.13.15.tgz"
  "version" "0.13.15"
  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"
"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"
"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":
  "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":
  "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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  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"
"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"
  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-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-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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "eslint-visitor-keys" "^1.1.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":
  "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@^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@^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"
  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"
"espree@^6.2.1":
  "integrity" "sha1-d/xy4f10SiBSwg84pbV1gy6Cc0o="
  "resolved" "https://registry.npmmirror.com/espree/download/espree-6.2.1.tgz"
  "version" "6.2.1"
  dependencies:
    "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"
  dependencies:
    "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"
"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"
  dependencies:
    "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"
  dependencies:
    "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@^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.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":
  "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":
  "integrity" "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q="
  "resolved" "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz"
  "version" "2.0.3"
"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"
  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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "assign-symbols" "^1.0.0"
    "is-extendable" "^1.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":
  "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"
  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"
"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-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"
"fastq@^1.6.0":
  "integrity" "sha1-YWdg+Ip1Jr38WWt8q4wYk4w2uYw="
  "resolved" "https://registry.nlark.com/fastq/download/fastq-1.13.0.tgz"
  "version" "1.13.0"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
"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"
"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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
"fsevents@~2.3.2":
  "integrity" "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro="
  "resolved" "https://registry.npmmirror.com/fsevents/download/fsevents-2.3.2.tgz"
  "version" "2.3.2"
"fstream@^1.0.12":
  "integrity" "sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU="
  "resolved" "https://registry.npm.taobao.org/fstream/download/fstream-1.0.12.tgz"
  "version" "1.0.12"
  dependencies:
    "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"
"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"
"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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
"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"
  dependencies:
    "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"
  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"
"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@^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"
  dependencies:
    "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"
  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"
"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"
"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"
  dependencies:
    "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-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@^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@^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-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-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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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@^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"
  dependencies:
    "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"
  dependencies:
    "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"
"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"
  dependencies:
    "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"
  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"
"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@^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"
"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"
"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"
"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"
  dependencies:
    "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"
"inflight@^1.0.4":
  "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk="
  "resolved" "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz"
  "version" "1.0.6"
  dependencies:
    "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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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-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-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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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@^1.0.1":
  "integrity" "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ="
  "resolved" "https://registry.nlark.com/is-extendable/download/is-extendable-1.0.1.tgz"
  "version" "1.0.1"
  dependencies:
    "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-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-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"
  dependencies:
    "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-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"
  dependencies:
    "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"
  dependencies:
    "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-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-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"
  dependencies:
    "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"
  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"
  dependencies:
    "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-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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
"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"
"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"
"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"
  dependencies:
    "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"
  dependencies:
    "isarray" "1.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"
"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"
"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"
"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"
"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"
  dependencies:
    "argparse" "^1.0.7"
    "esprima" "^4.0.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"
  dependencies:
    "minimist" "^1.2.0"
"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"
  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"
  optionalDependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "is-buffer" "^1.1.5"
"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"
"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"
  dependencies:
    "prelude-ls" "^1.2.1"
    "type-check" "~0.4.0"
"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"
  dependencies:
    "big.js" "^5.2.2"
    "emojis-list" "^3.0.0"
    "json5" "^1.0.1"
"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"
  dependencies:
    "p-locate" "^2.0.0"
    "path-exists" "^3.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"
  dependencies:
    "js-tokens" "^3.0.0 || ^4.0.0"
"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"
  dependencies:
    "tslib" "^2.0.3"
"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"
  dependencies:
    "yallist" "^4.0.0"
"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"
  dependencies:
    "sourcemap-codec" "^1.4.4"
"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"
"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"
  dependencies:
    "object-visit" "^1.0.0"
"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"
"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"
  dependencies:
    "is-plain-obj" "^1.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"
  dependencies:
    "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"
  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"
"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"
  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"
"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"
  dependencies:
    "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"
"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":
  "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
  "resolved" "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz"
  "version" "2.0.0"
"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"
"nanoid@^3.1.30":
  "integrity" "sha512-ZivnJm0o9bb13p2Ot5CpgC2rQdzB9Uxm/mFZweqm5eMViqOJe3PV6LU2E30SiLgheesmcPrjquqraoolONSA0A=="
  "resolved" "https://registry.npmmirror.com/nanoid/download/nanoid-3.1.31.tgz"
  "version" "3.1.31"
"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"
  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"
"nanopop@^2.1.0":
  "integrity" "sha1-I0dlE87iQFiIr9LopLVAZrcLnmA="
  "resolved" "https://registry.npm.taobao.org/nanopop/download/nanopop-2.1.0.tgz"
  "version" "2.1.0"
"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"
"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"
  dependencies:
    "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"
"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"
"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"
  dependencies:
    "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-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"
  dependencies:
    "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-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-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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
"once@^1.3.0":
  "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E="
  "resolved" "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz"
  "version" "1.4.0"
  dependencies:
    "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"
  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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
"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"
  dependencies:
    "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-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-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-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-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"
"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"
"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"
"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"
"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@^5.2.17":
  "integrity" "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg=="
  "resolved" "https://registry.npmmirror.com/postcss/download/postcss-5.2.18.tgz"
  "version" "5.2.18"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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-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"
  dependencies:
    "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"
  dependencies:
    "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"
"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"
"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"
"punycode@^2.1.0":
  "integrity" "sha1-tYsBCsQMIsVldhbI0sLALHv0eew="
  "resolved" "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz"
  "version" "2.1.1"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
"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"
  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"
"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"
  dependencies:
    "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"
  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"
"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"
  dependencies:
    "picomatch" "^2.2.1"
"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"
"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"
"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"
  dependencies:
    "extend-shallow" "^3.0.2"
    "safe-regex" "^1.1.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"
"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"
"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"
  dependencies:
    "is-core-module" "^2.8.0"
    "path-parse" "^1.0.7"
    "supports-preserve-symlinks-flag" "^1.0.0"
"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"
  dependencies:
    "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"
  dependencies:
    "@rollup/pluginutils" "^4.0.0"
    "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"
  optionalDependencies:
    "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"
  dependencies:
    "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.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-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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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.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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
"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"
"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"
  dependencies:
    "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"
"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"
  dependencies:
    "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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  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"
"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-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"
  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"
"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@^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.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.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":
  "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":
  "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"
  dependencies:
    "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"
"stable@^0.1.8":
  "integrity" "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88="
  "resolved" "https://registry.npmmirror.com/stable/download/stable-0.1.8.tgz"
  "version" "0.1.8"
"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"
  dependencies:
    "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@^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"
"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"
  dependencies:
    "safe-buffer" "~5.2.0"
"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"
  dependencies:
    "safe-buffer" "~5.1.0"
"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"
  dependencies:
    "emoji-regex" "^8.0.0"
    "is-fullwidth-code-point" "^3.0.0"
    "strip-ansi" "^6.0.1"
"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"
  dependencies:
    "call-bind" "^1.0.2"
    "define-properties" "^1.1.3"
"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"
  dependencies:
    "call-bind" "^1.0.2"
    "define-properties" "^1.1.3"
"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"
  dependencies:
    "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"
  dependencies:
    "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-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"
"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@^3.2.3":
  "integrity" "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY="
  "resolved" "https://registry.npmmirror.com/supports-color/download/supports-color-3.2.3.tgz"
  "version" "3.2.3"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
"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"
  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"
"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"
  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"
"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"
"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"
  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"
"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"
"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-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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  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"
"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"
"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"
  dependencies:
    "@types/json5" "^0.0.29"
    "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@^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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
"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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
"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"
  dependencies:
    "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"
  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"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
"use@^3.1.0":
  "integrity" "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8="
  "resolved" "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz"
  "version" "3.1.1"
"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"
"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"
"vary@^1":
  "integrity" "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
  "resolved" "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz"
  "version" "1.1.2"
"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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "@rollup/pluginutils" "^4.1.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"
  dependencies:
    "@babel/core" "^7.12.17"
    "@babel/plugin-syntax-import-meta" "^7.10.4"
    "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"
  dependencies:
    "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"
  dependencies:
    "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"
  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"
"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"
  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"
"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@^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"
  dependencies:
    "esbuild" "^0.13.12"
    "postcss" "^8.4.5"
    "resolve" "^1.20.0"
    "rollup" "^2.59.0"
  optionalDependencies:
    "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-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"
  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"
"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"
  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"
  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"
  dependencies:
    "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"
  dependencies:
    "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"
  dependencies:
    "@vue/compiler-dom" "3.2.26"
    "@vue/compiler-sfc" "3.2.26"
    "@vue/runtime-dom" "3.2.26"
    "@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"
  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"
  dependencies:
    "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"
  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"
"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"
  dependencies:
    "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"
"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"
"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"