소스 검색

init: first commit

zhangyuhan 3 년 전
커밋
ba93198557
21개의 변경된 파일3012개의 추가작업 그리고 0개의 파일을 삭제
  1. 5 0
      .babelrc
  2. 9 0
      .editorconfig
  3. 17 0
      .gitignore
  4. 1 0
      README.md
  5. 103 0
      examples/test.html
  6. 18 0
      package.json
  7. 27 0
      rollup.config.js
  8. 68 0
      src/core/emitter.js
  9. 58 0
      src/core/index.js
  10. 33 0
      src/core/logger.js
  11. 23 0
      src/core/record.js
  12. 25 0
      src/index.js
  13. 43 0
      src/module/crypto.js
  14. 97 0
      src/module/help.js
  15. 533 0
      src/module/record.js
  16. 8 0
      src/module/types.js
  17. 375 0
      src/module/utils.js
  18. 32 0
      src/plugins/base.js
  19. 82 0
      src/plugins/click.js
  20. 7 0
      src/plugins/index.js
  21. 1448 0
      yarn.lock

+ 5 - 0
.babelrc

@@ -0,0 +1,5 @@
+{
+  "presets": [
+    "@babel/preset-env"
+  ]
+}

+ 9 - 0
.editorconfig

@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true

+ 17 - 0
.gitignore

@@ -0,0 +1,17 @@
+.DS_Store
+node_modules
+yarn-error.log
+
+# test
+coverage
+.idea
+
+# api-extractor
+temp
+dist
+
+# analyzer
+analyzer.html
+
+packages/*/dist
+packages/*/node_modules

+ 1 - 0
README.md

@@ -0,0 +1 @@
+# 剑鱼埋点

+ 103 - 0
examples/test.html

@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta http-equiv="Pragma" content="no-cache" />
+  <meta http-equiv="Cache-Control" content="no-cache" />
+  <meta http-equiv="Expires" content="0" />
+  <meta charset="UTF-8" />
+  <meta name="format-detection" content="telephone=no, email=no"/>
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
+  <title>Title</title>
+  <link href='//cdn-common.jianyu360.com/cdn/lib/vant/2.8.2/lib/index.css' />
+  <style>
+    main {
+      width: 100px;
+      height: 100px;
+      border: 1px solid #eee;
+    }
+    form {
+      border: 1px solid #2c3e50;
+      padding: 20px;
+    }
+  </style>
+</head>
+<body>
+
+<button onclick="console.log(dasds)">点击事件错误1</button>
+<button onclick="console.log(a1)">点击事件错误2</button>
+<div id="test">
+  <h1>test jq & addEventListener</h1>
+  <a href="#test">点击锚点</a>
+</div>
+<main>
+  <form action="">
+    <button>测试</button>
+  </form>
+</main>
+<div id="app">
+  <button id="test-vue" @click="test">点击Vue click</button>
+  <van-button type="primary" size="large" @click="test">立即充值</van-button>
+</div>
+
+
+
+<script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.min.js"></script>
+<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
+<script src="https://cdn-common.jianyu360.com/cdn/lib/vant/2.8.2/vant.min.js"> </script>
+<script src=https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js></script>
+<script src="../dist/j-track.min.js"></script>
+<script>
+  new Vue({
+    el: '#app',
+    methods: {
+      test () {
+        console.log('点击Vue')
+      }
+    }
+  })
+  // $('body').on('click','#test', function () {
+  //   console.log('jq b test')
+  // })
+  $('#test').on('click', function () {
+    console.log('jq test')
+  })
+  document.querySelector('#test').addEventListener('click', function (e) {
+    console.log('tes')
+  })
+  // document.querySelector('main').addEventListener('click', function (e) {
+  //   console.log('冒泡 main')
+  // }, false)
+  // document.querySelector('main').addEventListener('click', function (e) {
+  //   console.log('捕获 main')
+  // }, true)
+  //
+  // document.querySelector('form').addEventListener('submit', function (e) {
+  //   console.log('捕获 form submit')
+  //   // e.preventDefault()
+  // }, true)
+  // document.querySelector('form').addEventListener('submit', function (e) {
+  //   console.log('冒泡 form submit')
+  //   e.preventDefault()
+  //
+  //   // e.preventDefault()
+  // }, false)
+  //
+  // document.querySelector('form').addEventListener('click', function (e) {
+  //   console.log('捕获 form')
+  // }, true)
+  // document.querySelector('form').addEventListener('click', function (e) {
+  //   console.log('冒泡 form')
+  // }, false)
+  // //
+  // document.querySelector('button').addEventListener('click', function (e) {
+  //   console.log('捕获 button')
+  //
+  // }, true)
+  // document.querySelector('button').addEventListener('click', function (e) {
+  //   console.log('冒泡 button')
+  //
+  // }, false)
+</script>
+</body>
+</html>

+ 18 - 0
package.json

@@ -0,0 +1,18 @@
+{
+  "name": "rollup-js",
+  "version": "1.0.0",
+  "main": "index.js",
+  "license": "MIT",
+  "scripts": {
+    "build": "rollup -c -w"
+  },
+  "devDependencies": {
+    "@babel/core": "^7.16.5",
+    "@babel/preset-env": "^7.16.5",
+    "rollup": "^2.62.0",
+    "rollup-plugin-babel": "^4.4.0",
+    "rollup-plugin-commonjs": "^10.1.0",
+    "rollup-plugin-node-resolve": "^5.2.0",
+    "rollup-plugin-terser": "^7.0.2"
+  }
+}

+ 27 - 0
rollup.config.js

@@ -0,0 +1,27 @@
+import babel from 'rollup-plugin-babel';
+import { terser } from 'rollup-plugin-terser';
+import resolve from 'rollup-plugin-node-resolve';
+import commonjs from 'rollup-plugin-commonjs';
+export default {
+    input: './src/index.js',
+    output: [
+        {
+            file: 'dist/j-track.min.js',
+            format: 'umd',
+            name: 'JTrack',
+            sourcemap: true,
+            global:{
+              'jquery': '$',
+              'CryptoJS': 'CryptoJS'
+            }
+        }
+    ],
+    plugins: [
+      resolve(),
+      commonjs(),
+      babel({
+          exclude: 'node_modules/**'
+      }),
+      terser()
+    ]
+}

+ 68 - 0
src/core/emitter.js

@@ -0,0 +1,68 @@
+/**
+ * 订阅-发布模式实现
+ * @link https://juejin.cn/post/6844903850105634824
+ * */
+export default class JyEmitter {
+    constructor() {
+        this.list = {}
+        this.$public = {
+            $on: this.on.bind(this),
+            $off: this.off.bind(this),
+            $emit: this.emit.bind(this)
+        }
+        return this.$public
+    }
+    /**
+     * 订阅
+     * @function on
+     * @param {string} event - 订阅key
+     * @param {function} fn - 事件
+     * @returns this
+     */
+    on (event, fn) {
+        ;(this.list[event] || (this.list[event] = [])).push(fn)
+        return this.$public
+    }
+    /**
+     * 取消订阅
+     * @function off
+     * @param {string} event - 订阅key
+     * @param {function} [fn] - 指定事件或默认取消所有事件
+     * @returns this
+     */
+    off (event, fn) {
+        let fns = this.list[event]
+        if (!fns) {
+            return false
+        }
+        if (!fn) {
+            fns && (fns.length = 0)
+        } else {
+            let cb;
+            for (let i = 0, cbLen = fns.length; i < cbLen; i++) {
+                cb = fns[i];
+                if (cb === fn || cb.fn === fn) {
+                    fns.splice(i, 1);
+                    break
+                }
+            }
+        }
+        return this.$public
+    }
+    /**
+     * 发布
+     * @function emit
+     * @returns this
+     */
+    emit () {
+        let event = [].shift.call(arguments),
+            fns = [...this.list[event]];
+        if (!fns || fns.length === 0) {
+            return false;
+        }
+        fns.forEach(fn => {
+            fn.apply(this, arguments);
+        });
+        return this.$public
+    }
+}

+ 58 - 0
src/core/index.js

@@ -0,0 +1,58 @@
+import JyEmitter from "./emitter"
+import JyRecord from './record'
+import JyLogger from './logger'
+import TrackPlugins from '../plugins/index'
+import createHelp from "../module/help";
+import { SDK_INFO } from "../module/types"
+
+class Track {
+  constructor(options) {
+    this.options = Object.assign({
+      debug: false,
+      maxDuplicateCount: 2,
+      maxBreadcrumbs: 10,
+      watchClick: true
+    }, options)
+    return this.init()
+  }
+
+  init() {
+    const Subscribe = new JyEmitter()
+    this.$subscribe = Subscribe
+    this.$record = new JyRecord(this.options, this.$subscribe.$emit)
+
+    this.logger = new JyLogger(this.options)
+    if (this.options.debug) {
+      this.logger.debug = createHelp()
+    }
+
+    this.use(TrackPlugins)
+
+    return this
+  }
+
+  use (plugins) {
+    const _global = this
+    plugins.forEach(TrackPlugin => {
+      const plugin = new TrackPlugin(_global)
+      plugin.monitor()
+      const wrapperTransform = (...args) => {
+        // 先执行transform
+        const res = plugin.transform?.apply(this, args)
+        // 拿到transform返回的数据并传入
+        plugin.consumer?.call(this, res)
+        // 如果需要新增hook,可在这里添加逻辑
+      }
+      // 订阅插件中的名字,并传入回调函数
+      _global.$subscribe.$on(plugin.name, wrapperTransform)
+    })
+  }
+
+  getInfo() {
+    return {
+      version: SDK_INFO.VERSION
+    }
+  }
+}
+
+export default Track

+ 33 - 0
src/core/logger.js

@@ -0,0 +1,33 @@
+import { SDK_INFO } from "../module/types";
+
+export default class JyLogger {
+  constructor(options) {
+    this.enabled = options.debug ? true : false
+    this._console = {}
+    return this.init()
+  }
+
+  init () {
+    if (this.enabled) {
+      return console
+    }
+    if (console) {
+      const logType = ['log', 'debug', 'info', 'warn', 'error', 'assert']
+      logType.forEach((level) => {
+        if (!(level in console)) return
+        this._console[level] = console[level]
+      })
+    }
+    return this._console
+  }
+
+  log(...args) {
+    this._console.log(`${SDK_INFO.PREFIX}[Log]:`, ...args)
+  }
+  warn(...args) {
+    this._console.warn(`${SDK_INFO.PREFIX}[Warn]:`, ...args)
+  }
+  error(...args) {
+    this._console.error(`${SDK_INFO.PREFIX}[Error]:`, ...args)
+  }
+}

+ 23 - 0
src/core/record.js

@@ -0,0 +1,23 @@
+import { Subscribe } from "../module/types";
+
+export default class JyRecord {
+  constructor(options, $emit) {
+    this.options = Object.assign({
+      maxDuplicateCount: 2
+    }, options)
+    this.$emit = $emit
+    this.events = []
+  }
+  set (key, data) {
+    const hasKeyLength = this.events.filter(v => v.key = key).length
+    if (hasKeyLength >= this.options.maxDuplicateCount) {
+      return
+    }
+    const info = { key, data }
+    this.events.push(info)
+    this.$emit(Subscribe.CHANGE, data, this.get())
+  }
+  get () {
+    return this.events
+  }
+}

+ 25 - 0
src/index.js

@@ -0,0 +1,25 @@
+import Track from './core/index'
+import { loadJS } from './module/utils'
+
+;(function () {
+  loadJS('https://cdn-common.jianyu360.com/cdn/lib/crypto/4.1.1/crypto-js.min.js', () => {
+   const jyEventTrack =  new Track()
+    jyEventTrack.$subscribe.$on('CLICK-TRACK', function (transformedData, pageInfo) {
+      if (typeof clab_tracker !== 'undefined' && typeof clab_tracker.track === 'function') {
+        clab_tracker.track('c_jyclick', {
+          c_breakername: transformedData.data.content,
+          c_pagename: pageInfo.href.title,
+          c_platform: pageInfo.platform,
+          c_pageid: pageInfo.id,
+          c_url: pageInfo.href.href,
+          c_breakerid: transformedData.key,
+          c_clicktime: new Date(transformedData.data.event_time),
+          date: new Date(transformedData.data.event_time),
+          summary: `唯一ID: ${transformedData.key} \n 元素位置: ${transformedData.data.selector} \n 元素内容: ${transformedData.data.content} \n 元素事件: ${transformedData.data.event_fn}`
+        })
+      }
+    })
+  })
+})();
+
+export default Track

+ 43 - 0
src/module/crypto.js

@@ -0,0 +1,43 @@
+const key  = '1234567812345678'
+const iv   = 'Pkcs7'
+
+
+function checkHasCryptoJS () {
+  return typeof CryptoJS !== 'undefined'
+}
+
+function getAesString(data, key, iv){
+  var key  = CryptoJS.enc.Hex.parse(key);
+  var iv   = CryptoJS.enc.Latin1.parse(iv);
+  var encrypted = CryptoJS.AES.encrypt(data,key,
+    {
+      iv:iv,
+      mode:CryptoJS.mode.CBC,
+      padding:CryptoJS.pad.Pkcs7
+    });
+  return encrypted;
+}
+function getDAesString(encrypted, key, iv){
+  var key  = CryptoJS.enc.Hex.parse(key);
+  var iv   = CryptoJS.enc.Latin1.parse(iv);
+  var decrypted = CryptoJS.AES.decrypt(encrypted,key,
+    {
+      iv:iv,
+      mode:CryptoJS.mode.CBC,
+      padding:CryptoJS.pad.Pkcs7
+    });
+  return decrypted.toString(CryptoJS.enc.Utf8);
+}
+export function getAES (data){
+  if (checkHasCryptoJS()) {
+    return getAesString(data, key, iv)
+  }
+  return encodeURI(data)
+}
+
+export function getDAes (encrypted){
+  if (checkHasCryptoJS()) {
+    return getDAesString(encrypted, key, iv)
+  }
+  return decodeURI(encrypted)
+}

+ 97 - 0
src/module/help.js

@@ -0,0 +1,97 @@
+const template = `
+<style>
+  .jy-track-debug-dialog {
+    z-index: 9999999;
+    position: fixed;
+    right: 0;
+    bottom: 0;
+    width: 100%;
+    background: #f9f9f9;
+    box-shadow: 0 0 5px #2c3e50;
+    padding: 0 1em;
+    box-sizing: border-box;
+    height: 30vh;
+  }
+  .jy-track-title-group {
+    width: 100%;
+    font-size: 18px;
+    line-height: 30px;
+    color: #2CB7CA;
+    padding: 8px;
+    box-sizing: border-box;
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+  }
+  .jy-track-title-group button {
+    position: unset;
+    cursor: pointer;
+    padding: 2px 10px;
+  }
+  .jy-track-debug-dialog ul {
+    margin: 0;
+    padding: 0;
+    max-height: 80%;
+    overflow-y: scroll;
+  }
+  .jy-track-debug-dialog li {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    border-bottom: 1px solid #333;
+    padding: 4px;
+    box-sizing: border-box;
+    word-break: break-all;
+    margin: 6px;
+  }
+  .jy-track-open {
+    position: fixed;
+    bottom: 15%;
+    right: 20px;
+    z-index: 999999;
+    cursor: pointer;
+    padding: 10px;
+    box-shadow: 0px 10px 16px 1px rgb(233 183 105 / 20%);
+    border-radius: 6px 6px 6px 6px;
+    background: #49bfd0;
+    color: #fff;
+  }
+</style>
+    <div>
+  <button class="jy-track-open">Jy-Track 调试</button>
+  <div class="jy-track-debug-dialog" style="display: none">
+    <div class="jy-track-title-group">
+      <span>Jy-Track Debugger</span>
+      <div>
+        <button class="jy-track-clear">清除</button>
+        <button class="jy-track-open">收起</button>
+      </div>
+    </div>
+    <ul>
+      <li id="template-li" style="display: none">
+        <div></div>
+      </li>
+    </ul>
+  </div>
+</div>
+  <script>
+    $('.jy-track-open').on('click', function () {
+      $('.jy-track-debug-dialog').fadeToggle()
+    })
+    $('.jy-track-clear').on('click', function () {
+      $('.jy-track-debug-dialog ul li:not("#template-li")').remove()
+    })
+    function addLog (content) {
+      var clone = $('#template-li').clone()
+      $(clone).show()
+      $(clone).attr('id', '')
+      $(clone).html(content)
+      $('.jy-track-debug-dialog ul').prepend($(clone))
+      $('.jy-track-debug-dialog ul').scrollTop(0)
+    }
+  </script>`
+
+export default function createHelp () {
+  $('body').append(template)
+  return addLog
+}

+ 533 - 0
src/module/record.js

@@ -0,0 +1,533 @@
+/**
+ * 追踪页面访问时长及点击/hover/弹窗事件
+ * */
+export default class JyTrackRecord {
+    /**
+     * @constructor
+     * @param {Object} config
+     * @param {function} [config.handleParams]  - Ajax参数请求前处理
+     * @returns {Object} _jyTrack
+     */
+    constructor(config = {}) {
+        this.utils = _jyGlobal.utils
+        this.config = {
+            handleParams: this.utils.getDefaultFill(config, 'handleParams', (s) => s),
+            baseURL: this.utils.getDefaultFill(config,'baseURL', location.origin),
+            allowFn: this.utils.getDefaultFill(config, 'allowFn', (s) => true),
+            canListenerEvent: this.utils.getDefaultFill(config, 'canListenerEvent', 'click|dialog')
+        }
+        this.middle = new JyEmitter()
+        this.inPageTime = this.utils.getDefaultFill(config, 'inPageTime', new Date().getTime())
+        this.getNowTime = _jyGlobal.diffDate.getTime
+        this.getDiffTime = () => {
+            return this.getNowTime() - this.inPageTime
+        }
+        this.canEventCache = () => true
+        this.canTimeCache = () => true
+        this.canBackCache = () => true
+        return this.init()
+    }
+    /**
+     * 初始化
+     * @function init
+     */
+    init () {
+        if (window._jyTrack) {
+            window._jyTrack.destroy()
+        }
+        // 缓存判断函数
+        this.canEventCache = this.checkEventCache()
+        this.canTimeCache = this.checkEventCache({
+            minTimeInterval: 200
+        })
+        this.canBackCache = this.checkEventCache({
+            minTimeInterval: 500
+        })
+
+        // this.middle.$on('initEvent', (t) => {
+        //   console.warn('initEvent', t)
+        // })
+        // this.middle.$on('destroyEvent', (t) => {
+        //   console.warn('destroyEvent', t)
+        // })
+        // this.middle.$on('destroyTime', (t) => {
+        //   console.warn('destroyTime', t)
+        // })
+
+        // 判断Jquery依赖
+        // this.utils.getCheckJQuery(() => {
+        // 页面计时
+        this.initTime()
+        // 新增事件监听 click / hover / dialog / history
+        this.initListenerHistoryChange()
+        if (this.config.canListenerEvent.indexOf('click') !== -1) {
+            this.initEventListener()
+        }
+        if (this.config.canListenerEvent.indexOf('dialog') !== -1) {
+            this.initListenerModal()
+        }
+
+        this.middle.$emit('initEvent', 'init checkJQuery')
+
+        $(() => {
+            this.middle.$emit('destroyEvent', 'init onload')
+            this.middle.$emit('initEvent', 'init onload')
+        })
+        // })
+        // 暴露函数
+        const _jyTrack = {
+            destroy: this.destroy.bind(this),
+            trackEvent: this.trackEvent.bind(this)
+        }
+        window._jyTrack = _jyTrack
+        return _jyTrack
+    }
+    /**
+     * 销毁事件订阅
+     * @function destroy
+     */
+    destroy () {
+        this.middle.$emit('destroyEvent' , 'destroy')
+        this.middle.$emit('destroyTime', 'destroy')
+    }
+    /**
+     * 对外暴露方法
+     * @function trackEvent - 发送事件
+     * @param {Event} e - Event
+     * @param {Object} record - 参数
+     * @param {string} [record.href] - 触发事件的Node节点Name
+     * @param {string} [record.name] - 触发事件的Node节点Name
+     * @param {string} record.event - 事件类型 click/hover/dialog
+     * @param {string} record.tag - 触发事件的Node节点Tag
+     * @param {string} record.path - 触发事件的Node节点Selector
+     * @param {string} [record.id] - 触发事件的Node节点ID
+     * @param {string} [record.text] - 触发事件的Node节点文本
+     * @param {string} [record.name] - 触发事件的Node节点Name
+     */
+    trackEvent (record, e) {
+        if (e) {
+            this.triggerEvent(this.getAjaxEventParams(e, record))
+        } else {
+            this.triggerEvent(record)
+        }
+    }
+    /**
+     * 检查是否跳过事件监听
+     * @function checkSkip
+     * @param {Event} e - Event
+     * @returns {Boolean}
+     * */
+    checkSkip (e) {
+        var canSkip = $(this).hasClass('skip-track') || $(this).parents('.skip-track').length > 0
+        return canSkip
+    }
+    /**
+     * 检查是否存在Jquery事件监听
+     * @function checkJqueryEventBind
+     * @param {Event} e - Event
+     * @returns {Boolean}
+     * */
+    checkJqueryEventBind (e) {
+        const nowEvents = $._data($(this).get(0), 'events')
+        const nowEventsForLine = typeof $(this).get(0)['on' + e.type] === 'function'
+        return (nowEvents && nowEvents[e.type]) || nowEventsForLine
+    }
+    /**
+     * 检查是否存在Vue事件监听
+     * @function checkVueEventBind
+     * @param {Event} e - Event
+     * @returns {Boolean}
+     * */
+    checkVueEventBind (e) {
+        let canVue = typeof this.__vue__ === 'object'
+        let vueEvents = {}
+        if (canVue) {
+            try {
+                vueEvents = this.__vue__._vnode.data.on
+            } catch (e) {
+                console.warn(e)
+            }
+        }
+        return (vueEvents && vueEvents[e.type])
+    }
+    /**
+     * A Links事件监听
+     * @function checkLinkEventBind
+     * @param {Event} e - Event
+     * @returns {Boolean}
+     * */
+    checkLinkEventBind (e) {
+        let canLink = this.nodeName === 'A' || this.nodeName === 'a'
+        return canLink && $(this).attr('href')
+    }
+    /**
+     * data-jy-track 自定义属性监听
+     * @function checkDataAttrEventBind
+     * @param {Event} e - Event
+     * @param {Object} _this - 作用域
+     * @returns {Boolean}
+     * */
+    checkDataAttrEventBind (e, _this) {
+        let canDataAttr = $(this).attr('data-jy-track')
+        let canEvents = []
+        if (canDataAttr) {
+            canEvents = canDataAttr.split('-')
+        }
+        return canEvents.indexOf(_this.checkEventType(e.type)) !== -1
+    }
+    /**
+     * 检查Event Type类型
+     * @function checkEventType
+     * @param {string} type - Event Type
+     * @returns {string} - click|hover
+     * */
+    checkEventType (type) {
+        let t = type
+        switch (type) {
+            case 'mouseenter': {
+                t = 'hover'
+                break
+            }
+            case 'mouseleave': {
+                t = 'hover'
+                break
+            }
+            case 'mouseout': {
+                t = 'hover'
+                break
+            }
+            case 'mouseover': {
+                t = 'hover'
+                break
+            }
+            case 'tap': {
+                t = 'click'
+                break
+            }
+        }
+        return t
+    }
+
+    /**
+     * 初始化事件监听 click mouseenter mouseleave mouseout mouseover
+     * @function initEventListener
+     */
+    initEventListener () {
+        const _this = this
+        function bindEvent (e) {
+            // 判断是否跳过检查
+            if (!_this.config.allowFn.call(this, e)) {
+                return
+            }
+            // 判断是否跳过检查
+            if (_this.checkSkip.call(this, e)) {
+                return
+            }
+            // 事件过滤器
+            if (_this.checkJqueryEventBind.call(this, e)
+                || _this.checkVueEventBind.call(this, e)
+                || _this.checkLinkEventBind.call(this, e)
+                || _this.checkDataAttrEventBind.call(this, e, _this)
+            ) {
+                _this.triggerEvent(_this.getAjaxEventParams(e,{
+                    event: _this.checkEventType(e.type)
+                }))
+            }
+        }
+        // 订阅初始化及销毁
+        this.middle.$on('initEvent', () => {
+            $("body").on('click', '*', bindEvent)
+        })
+        this.middle.$on('destroyEvent', () => {
+            $("body").off('click', '*', bindEvent)
+        })
+    }
+    /**
+     * 初始化弹窗监听
+     * @function initListenerModal
+     */
+    initListenerModal () {
+        const triggerFn = (e, type) => {
+            this.triggerEvent(this.getAjaxEventParams(e,{
+                event: 'dialog',
+                element_name: type
+            }))
+        }
+        const showFn = (e) => {
+            triggerFn(e, 'show')
+        }
+        const hideFn = (e) => {
+            triggerFn(e, 'false')
+        }
+        // 订阅初始化及销毁
+        this.middle.$on('initEvent', () => {
+            const modals = $('.modal[role="dialog"]')
+            if (modals.length > 0) {
+                modals.on("show.bs.modal",  showFn)
+                modals.on("hidden.bs.modal", hideFn)
+            }
+        })
+        this.middle.$on('destroyEvent', () => {
+            const modals = $('.modal[role="dialog"]')
+            if (modals.length > 0) {
+                modals.off("show.bs.modal",  showFn)
+                modals.off("hidden.bs.modal", hideFn)
+            }
+        })
+    }
+    /**
+     * 兼容Vue或History历史页面
+     * @function initListenerHistoryChange
+     * */
+    initListenerHistoryChange () {
+        let _histroyListener = (type) => {}
+        const _historyWrap = function(type) {
+            const orig = history[type];
+            let e = {}
+            try {
+                e = new Event(type)
+            } catch (e) {
+                console.log('IE not support')
+            }
+            return function() {
+                const rv = orig.apply(this, arguments);
+                e.arguments = arguments;
+                setTimeout(function () {
+                    _histroyListener(type)
+                }, 300)
+                return rv;
+            };
+        }
+        history.pushState = _historyWrap('pushState')
+        history.replaceState = _historyWrap('replaceState')
+        let onceStatus = false
+        let waitInit = false
+        let waitInitTn = null
+        // 订阅初始化及销毁
+        this.middle.$on('initEvent', () => {
+            if (onceStatus) {
+                return
+            }
+            onceStatus = true
+            _histroyListener = (type) => {
+                if (this.canBackCache('执行重新初始化')) {
+                    this.destroy()
+                    clearTimeout(waitInitTn)
+                    waitInitTn = setTimeout(() => {
+                        clearTimeout(waitInitTn)
+                        this.initTime(false)
+                        this.middle.$emit('initEvent')
+                    }, 300)
+                }
+            }
+            $(window).on('popstate hashchange', _histroyListener)
+        })
+        this.middle.$on('destroyEvent', () => {
+            onceStatus = false
+            $(window).off('popstate hashchange', _histroyListener)
+            _histroyListener = () => {}
+        })
+    }
+    /**
+     * 初始化页面计时
+     * @function initTime
+     * */
+    initTime (initStatus = true) {
+        if (!initStatus) {
+            this.inPageTime = this.getNowTime()
+            console.log('页面Hash变化,重新初始化', new Date(this.inPageTime).toLocaleString())
+        }
+        const inTime = this.inPageTime
+        let params = this.getAjaxTimeParams(inTime)
+        let nextTimeInterval = 0
+        let sendPageTn = null
+
+        // 1min 5s间隔    2min 10s间隔   3min 20s间隔   4min30s   5min达到最大值
+        const updateNextTimeInterval = () => {
+            const viewTime =  this.getDiffTime() / 60000
+            if (viewTime <= 1) {
+                return nextTimeInterval = 5
+            } else if (viewTime <= 2) {
+                return nextTimeInterval = 10
+            } else if (viewTime <= 3) {
+                return nextTimeInterval = 20
+            } else if (viewTime <= 5) {
+                return nextTimeInterval = 30
+            } else {
+                return nextTimeInterval = -1
+            }
+        }
+        // 发送
+        let sendData =  (type) => {
+            // 节流
+            if (!this.canTimeCache(location.href + 'sendData' + type)) {
+                return
+            }
+            if (nextTimeInterval === -1) {
+                console.log('stop page time')
+                clearTimeout(sendPageTn)
+                return
+            }
+            // 计数
+            params.count++
+            params.viewtime = Math.round(this.getDiffTime() / 1000)
+            if (type === false) {
+                params.outtime = this.getNowTime()
+            }
+            this.ajaxFn('time', params, type !== false)
+            if (type !== false) {
+                updateNextTimeInterval()
+                sendPageTn = setTimeout(sendData, nextTimeInterval * 1000)
+            } else {
+                clearTimeout(sendPageTn)
+            }
+        }
+        function levelTime () {
+            sendData(false)
+        }
+        // 初始化发送一次
+        sendData()
+
+        // 销毁
+        const destroy =   () => {
+            this.middle.$off('initEvent', () => {
+                window.addEventListener('beforeunload', levelTime)
+                window.addEventListener('unload', levelTime)
+            })
+            this.middle.$off('destroyEvent', () => {
+                window.removeEventListener('beforeunload', levelTime)
+                window.removeEventListener('unload', levelTime)
+            })
+            this.middle.$off('destroyTime', () => {
+                clearTimeout(sendPageTn)
+                sendData(false)
+                clearTimeout(sendPageTn)
+            })
+        }
+
+        this.middle.$on('initEvent', () => {
+            $(window).on('beforeunload unload', levelTime)
+        })
+        this.middle.$on('destroyEvent', () => {
+            $(window).off('beforeunload unload', levelTime)
+        })
+        this.middle.$on('destroyTime', () => {
+            clearTimeout(sendPageTn)
+            sendData(false)
+            clearTimeout(sendPageTn)
+            sendData = () => {
+                console.warn('track now not sendData')
+            }
+        })
+
+        return {
+            destroy: () => {
+                destroy()
+            }
+        }
+    }
+    triggerEvent (params) {
+        let onlyKey = params.xmlpath + '@event=' + params.event
+        if (params.event === 'hover') {
+            onlyKey = 'hover'
+        }
+        if (this.canEventCache(onlyKey)) {
+            this.ajaxFn('event', params)
+        }
+    }
+    checkEventCache (config = {
+        minTimeInterval: 800
+    }) {
+        const LastTime = {}
+        return function (onlyKey) {
+            const nowTime = this.getNowTime()
+            const minTime = nowTime - config.minTimeInterval
+            if (minTime >= (LastTime[onlyKey] || (LastTime[onlyKey] = minTime))) {
+                LastTime[onlyKey] = nowTime
+                return true
+            }
+            return false
+        }
+    }
+
+    getAjaxEventParams (e, cover) {
+        const data = this.utils.getElement(e)
+        for (let k in cover) {
+            if (cover[k]) {
+                data[k] = cover[k]
+            }
+        }
+        return {
+            href: this.utils.getHref().href,
+            platform: this.utils.getPlatform(),
+            entrytime: this.inPageTime,
+            event: data.event,
+            params: JSON.stringify(this.utils.getHref().params),
+            element_id: data.element_id,
+            element_name: data.element_name,
+            element_text: data.element_text,
+            element_parent: data.element_parent,
+            element_tag: data.element_tag,
+            xmlpath: data.xmlpath,
+            sessionid: this.utils.getCookieByName('SESSIONID'),
+            _d: this.utils.getCookieByName('ud_safe'),
+            onlyKey: null
+        }
+    }
+    getAjaxTimeParams (inTime) {
+        return {
+            href: this.utils.getHref().href,
+            count: 0,
+            platform: this.utils.getPlatform(),
+            viewtime: Math.round(this.getDiffTime() / 1000),
+            entrytime: inTime,
+            outtime: null,
+            params: JSON.stringify(this.utils.getHref().params),
+            refer: document.referrer || null,
+            sessionid: this.utils.getCookieByName('SESSIONID'),
+            _d: this.utils.getCookieByName('ud_safe'),
+            onlyKey: null
+        }
+    }
+    ajaxFn (type, params, async = true) {
+        const paramsData = this.config.handleParams(params)
+        const diffMax = 5 * 60 * 1000
+        if (paramsData.outtime) {
+            const diffTime = Math.abs(paramsData.outtime - paramsData.entrytime) / 1000
+            if (diffTime > diffMax) {
+                paramsData.outtime = paramsData.entrytime + diffMax
+            }
+            if (paramsData.outtime < paramsData.entrytime) {
+                paramsData.outtime = null
+            }
+        }
+        if (paramsData.viewtime > (diffMax / 1000)) {
+            paramsData.viewtime = (diffMax / 1000)
+        }
+        if (paramsData.viewtime < 0) {
+            paramsData.viewtime = 0
+        }
+        if (type === 'time') {
+            const onlyHashKey = paramsData.href + '?time=' + paramsData.entrytime
+            _jyTrackUp.setData({
+                type: 'time',
+                onlyKey: onlyHashKey,
+                data: paramsData,
+                ajax: {
+                    pending: !paramsData.outtime
+                }
+            })
+        } else {
+            const randomN = Number(Math.random().toString().substr(3, 15) + Date.now()).toString(36);
+            const onlyHashKey = `${paramsData.href}?time=${paramsData.entrytime}&event=${paramsData.event}&path=${paramsData.xmlpath}&hash=${randomN}`
+            _jyTrackUp.setData({
+                type: 'event',
+                onlyKey: onlyHashKey,
+                data: paramsData,
+                ajax: {
+                    pending: false
+                }
+            })
+        }
+    }
+}

+ 8 - 0
src/module/types.js

@@ -0,0 +1,8 @@
+export const Subscribe = {
+  CHANGE: 'event_push'
+}
+
+export const SDK_INFO = {
+  VERSION: '0.1.0',
+  PREFIX: 'JyTrack'
+}

+ 375 - 0
src/module/utils.js

@@ -0,0 +1,375 @@
+export function getOnlyKey(length = 15) {
+  return Number(Math.random().toString().substr(3, length) + Date.now()).toString(36);
+}
+
+/**
+ * 获取URL信息
+ * @function getHref
+ * @returns {Object}
+ * */
+export function getHref() {
+  return {
+    href: location.href,
+    pathname: location.pathname,
+    params: getSearchJSON(),
+    title: document.title || ''
+  }
+}
+
+
+/**
+ * 获取Node信息
+ * @function getElementInfo
+ * @param {Event} e
+ * @returns {Object}
+ * */
+export function getElementInfo(e, target) {
+  const eNode = target || e.target
+  return {
+    event: e.type,
+    element_id: eNode.getAttribute('id') || null,
+    element_name: eNode.getAttribute('name') || null,
+    element_text: getText(eNode),
+    element_tag: eNode.nodeName,
+    element_class: eNode.className,
+    href: eNode.getAttribute('href') || null,
+    selector: getSelector(eNode).replace('html>','')
+  }
+}
+
+/**
+ * 获取NodeText信息
+ * @function getText
+ * @param {Element} el - 选择器或Node节点
+ * @returns {string}
+ * */
+function getText(el, level = 1) {
+  let nowStr = (el.innerText || '').trim()
+  if (nowStr === '' && level > 0) {
+    return getText(el.parentNode, --level)
+  } else {
+    return nowStr.replace(/[\n|\s|\t|\b]/g, '').substr(0, 30)
+  }
+}
+
+
+
+/**
+ * 获取NodeSelector路径
+ * @function getNodeSelector
+ * @param {Element} el - 选择器或Node节点
+ * @returns {Object}
+ * */
+function getNodeSelector(el) {
+  const locator = {xpath: '', css: '', selector: ''};
+  const eloc = {
+    getClass: function (el) {
+      let formatClass = '';
+      const elementClass = el.className;
+      if (typeof elementClass != 'undefined' && elementClass != '') {
+        formatClass = '.' + elementClass.split(/[\s\n]+/).join('.');
+      }
+      return formatClass;
+    },
+    index: function (el) {
+      const elements = el.parentNode.children;
+      if (!elements) {
+        return 0
+      }
+      for (let i = 0; i < elements.length; i++) {
+        if (elements[i] == el) {
+          return i;
+        }
+      }
+    }
+  };
+  for (; el && el.nodeType == 1; el = el.parentNode) {
+    let idx = eloc.index(el);
+    if (el.tagName.substring(0, 1) != "/" && el.tagName.toLowerCase() !== 'body' && el.tagName.toLowerCase() !== 'html') { //IE oddity: some tagNames can begin with backslash.
+      if (el.id != 'undefined' && el.id != '') {
+        const idPath = "[@id=" + "'" + el.id + "'" + "]";
+        locator.xpath = '/' + el.tagName.toLowerCase() + idPath + locator.xpath;
+        locator.selector = ' ' +  '#' + el.id  + locator.selector;
+        locator.css = el.tagName.toLowerCase() + '#' + el.id + ' > ' + locator.css;
+      } else {
+        let eqStr = ':eq(' + idx + ')'
+        if (idx === 0) {
+          eqStr = ''
+        }
+        idx = '[' + idx + ']';
+        locator.xpath = '/' + el.tagName.toLowerCase() + idx + locator.xpath;
+        locator.selector = ' ' + el.tagName.toLowerCase() + eqStr + locator.selector;
+        locator.css = el.tagName.toLowerCase() + eloc.getClass(el) + ' > ' + locator.css;
+      }
+    }
+  }
+  locator.xpath = '//html[1]/body[1]/' + locator.xpath;
+  locator.selector = 'body' + locator.selector;
+  locator.css = locator.css.substr(0, locator.css.length - 3);
+  return {
+    xpath: locator.xpath,
+    selector: locator.css,
+    path: locator.selector
+  };
+}
+
+/**
+ * 获取平台类型
+ * @function getPlatform
+ * @returns {number} - 1-pc端 2-微信端 3-APP端 4-小程序 9-其他
+ * */
+export function getPlatform() {
+  if (isApp()) {
+    return 'APP'
+  } else if (isWeChatMP()) {
+    return 'WeChatMP'
+  } else if (isWeChatWeb()) {
+    return 'WeChatWeb'
+  } else if (isPC()) {
+    return 'PC'
+  } else {
+    return 'Other'
+  }
+}
+
+function isPC() {
+  let userAgentInfo = navigator.userAgent;
+  let Agents = new Array("Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod");
+  let flag = true;
+  for (let v = 0; v < Agents.length; v++) {
+    if (userAgentInfo.indexOf(Agents[v]) > 0) {
+      flag = false;
+      break;
+    }
+  }
+  return flag;
+}
+
+function isWeChatWeb() {
+  return navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1
+}
+
+function isApp() {
+  let isApp = false
+  try {
+    isApp = Boolean(JyObj.getVersion())
+  } catch (e) {
+    isApp = false
+  }
+  return isApp
+}
+
+function isWeChatMP() {
+  return (navigator.userAgent.match(/micromessenger/i) && navigator.userAgent.match(/miniprogram/i)) || window.__wxjs_environment === 'miniprogram';
+}
+
+export function getCookieByName(cname) {
+  var name = cname + "=";
+  var ca = document.cookie.split(';');
+  for (var i = 0; i < ca.length; i++) {
+    var c = ca[i].trim();
+    if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
+  }
+  return "";
+}
+
+/**
+ * 获取URL中Search信息
+ * @function getSearchJSON
+ * @returns {Object}
+ * */
+function getSearchJSON() {
+  const searchJson = {}
+  try {
+    const searchArr = decodeURI(location.search).substr(1).split("&");
+    const hashArr = decodeURI(location.hash).substr(1).split("&");
+    for (let i in searchArr) {
+      searchJson[searchArr[i].split("=")[0]] = searchArr[i].split("=")[1]
+    }
+    for (let i in hashArr) {
+      searchJson[hashArr[i].split("=")[0]] = hashArr[i].split("=")[1]
+    }
+    delete searchJson['']
+  } catch (e) {
+  }
+  return searchJson
+}
+
+export function checkHasJquery () {
+  if (typeof jQuery === 'undefined') {
+    return false
+  }
+  return $.fn.jquery
+}
+export function checkHasVue () {
+  if (typeof Vue === 'undefined') {
+    return false
+  }
+  return Vue.version
+}
+/**
+ * 检查是否存在Jquery事件监听
+ * @function checkJqueryEventBind
+ * @param {Event} e - Event
+ * @returns {Boolean}
+ * */
+export function checkJqueryEventBind (e, level = 0) {
+    const nowEvents = $._data($(this).get(0), 'events')
+    const nowEventsForLine = typeof $(this).get(0)['on' + e.type] === 'function'
+    const result = (nowEvents && nowEvents[e.type]) || nowEventsForLine
+    if (!result && level > 0) {
+      return checkJqueryEventBind.bind($(this).parent())(e, --level)
+    }
+    return {
+      result: result,
+      target: $(this)
+    }
+}
+/**
+ * 检查是否存在Vue事件监听
+ * @function checkVueEventBind
+ * @param {Event} e - Event
+ * @returns {Boolean}
+ * */
+export function checkVueEventBind (e, level) {
+  let canVue = typeof this.__vue__ === 'object'
+  let vueEvents = {}
+  if (canVue) {
+    try {
+      vueEvents = this.__vue__._vnode.data.on
+    } catch (e) {
+      console.warn(e)
+    }
+  }
+  const result = (vueEvents && vueEvents[e.type])
+  if (!result && level > 0) {
+    return checkVueEventBind.bind($(this).parent())(e, --level)
+  }
+  return {
+    result: result,
+    target: $(this)
+  }
+}
+
+/**
+ * 函数节流
+ *
+ * @export
+ * @param {Function} fn 需要节流的函数
+ * @param {number} delay 节流的时间间隔
+ * @return {*}  {Function} 返回一个包含节流功能的函数
+ */
+export function throttle(fn, delay = 200) {
+  let canRun = true
+  return function (...args) {
+    if (!canRun) return
+    fn.apply(this, args)
+    canRun = false
+    setTimeout(() => {
+      canRun = true
+    }, delay)
+  }
+}
+
+export function getSelector (el) {
+
+    var getPath = function(el) {
+      if (!el) return false;
+      if(el.jquery) el = el[0];
+
+      if(el.nodeName && el.nodeName.toLowerCase() == '#document')
+        return 'jQueryPath_document';// == window.document
+
+      if(el.location)
+        return 'jQueryPath_window';// == window
+
+      var path = findBestSelector(el, true);
+
+      while (	el.parentNode && el.parentNode.nodeName !== '#document'
+      && (!(el.id && el.id.indexOf('.') == -1))) {
+        el = el.parentNode;
+        path = findBestSelector(el) + '>' + path;
+      }
+
+      return path;
+    }
+    /*
+     * Helpers
+     */
+
+    //Helper (we use jQuery as less as possible)
+    var next = (function() {
+      var t = $('<div><p></p><p></p></div>')[0].childNodes[1];
+
+      if (t.previousElementSibling && typeof(t.previousElementSibling) === 'object') {
+        return function(el) {
+          return el.previousElementSibling;
+        };
+      } else {
+        return function(el) {
+          return $(el).prev()[0]
+        };
+      }
+    })();
+
+    //Retreive the index of an element
+    var getIndex = function(el) {
+      if (el.previousElementSibling === null)
+        return 0;
+
+      var _el = el,
+        i = 0,
+        elT = el.nodeName;
+
+      while (_el = next(_el)) {
+        if (_el.nodeName == elT)
+          i++;
+      }
+      return i;
+    };
+
+    var findBestSelector = function(el, firstEl) {
+      var first = firstEl || false,
+        sel = '',
+        index = false;
+
+      if (el.id && el.id.indexOf('.') == -1) {
+        //because $('#my.id') didn't work width jQuery
+        sel += '#' + el.id;
+      } else {
+        sel += el.nodeName.toLowerCase();
+
+        var indexEl = getIndex(el);
+        var onlyEl = $(el).parent().children().length === 1
+        if (!onlyEl && (indexEl || first)) {
+          sel += ':eq(' + indexEl + ')';
+        }
+      }
+
+      return sel;
+    }
+
+    return getPath(el)
+}
+
+export function loadJS (url, success) {
+  var scripts = document.getElementsByTagName('script')
+  for (var i = 0; i < scripts.length; i++) {
+    if (scripts[i].src && scripts[i].src.indexOf(url) > -1) {
+      if (success) success();
+      return;
+    }
+  }
+  var domScript = document.createElement('script');
+  domScript.src = url;
+  success = success || function () {
+  };
+  domScript.onload = domScript.onreadystatechange = function () {
+    if (!this.readyState || 'loaded' === this.readyState || 'complete' === this.readyState) {
+      success();
+      this.onload = this.onreadystatechange = null;
+      //this.parentNode.removeChild(this);
+    }
+  }
+  document.getElementsByTagName('head')[0].appendChild(domScript);
+}

+ 32 - 0
src/plugins/base.js

@@ -0,0 +1,32 @@
+import {getHref, getPlatform} from "../module/utils";
+
+export default class TrackPlugins {
+  constructor (name, _global) {
+    this.name = name
+    this._global = _global
+    this.pageInfo = {
+      platform: getPlatform(),
+      href: getHref(),
+      id: ''
+    }
+    return {
+      name: this.name,
+      monitor: this.monitor.bind(this),
+      transform: this.transform.bind(this),
+      consumer: this.consumer.bind(this),
+    }
+  }
+  monitor ($emit) {
+    const pluginName = this.name
+    $emit(pluginName)
+    console.log('monitor', pluginName)
+  }
+  transform (collectedData) {
+    console.log(collectedData)
+    return collectedData
+  }
+  consumer (transformedData) {
+    console.log(transformedData)
+    return transformedData
+  }
+}

+ 82 - 0
src/plugins/click.js

@@ -0,0 +1,82 @@
+import TrackPlugins from './base'
+import { getPlatform, getHref, getElementInfo, checkJqueryEventBind, checkVueEventBind, checkHasVue, checkHasJquery, throttle } from "../module/utils";
+import { getAES } from "../module/crypto"
+
+export default class ClickPlugin extends TrackPlugins {
+  constructor (_global) {
+    super('CLICK', _global)
+  }
+  monitor () {
+    const pluginName = this.name
+    const _global = this._global
+
+    if (checkHasJquery()) {
+      const clickFn = throttle(function (e) {
+        const jqEvent = checkJqueryEventBind.call(this, e, 0)
+        let eInfo = {}
+        let eTarget = jqEvent.target
+        const vueEvent = checkVueEventBind.call(this, e, 0)
+        if (vueEvent.result) {
+          eTarget = vueEvent.target
+        }
+        if (eTarget) {
+          eInfo = getElementInfo(e, eTarget.get(0))
+        }
+        _global.$subscribe.$emit(pluginName, {
+          type: 'CLICK',
+          data: {
+            hasFn: Boolean(jqEvent),
+            hasVueFn: Boolean(vueEvent),
+            eInfo: eInfo
+          }
+        })
+      })
+      $('body').on('click', '*', clickFn)
+    } else {
+      // _global.logger.debug('未检测到Jq')
+      window.onload = () => {
+        // _global.logger.debug('重新执行检测Jq')
+        this.monitor()
+      }
+    }
+    this.pageInfo.id = getAES(this.pageInfo.href.pathname)
+    // _global.logger.log(`平台: ${this.pageInfo.platform} \n 标题: ${this.pageInfo.href.title} \n 页面路径: ${this.pageInfo.href.pathname} \n 唯一ID: ${this.pageInfo.id}`)
+    // _global.logger.debug(`平台: ${this.pageInfo.platform} 标题: ${this.pageInfo.href.title} <br> 页面路径: ${this.pageInfo.href.pathname} <br>  唯一ID: ${this.pageInfo.id}`)
+  }
+  transform (collectedData) {
+    const allowTags = ['BUTTON', 'A']
+    const allowClass = ['button', 'open', 'close', 'click']
+    const skipTags = ['BODY']
+    const eInfo = collectedData.data.eInfo
+    if (skipTags.includes(eInfo.element_tag)) return ''
+
+    const canClass = allowClass.filter(v => eInfo.element_class.indexOf(v) !== -1).length > 0
+    if (collectedData.data.hasFn || allowTags.includes(eInfo.element_tag) || canClass) {
+      const result = {
+        key: getAES(eInfo.selector).toString(),
+        type: 'click',
+        data: {
+          selector: eInfo.selector,
+          content: eInfo.element_text,
+          event_time: new Date().getTime(),
+          event_fn: collectedData.data.hasFn,
+          event_vue_fn: collectedData.data.hasVueFn
+        }
+      }
+      if (eInfo.element_tag === 'A') {
+        result.data.href = eInfo.href
+      }
+      return result
+    }
+
+    return ''
+  }
+  consumer (transformedData) {
+    if (transformedData !== '') {
+      // this._global.logger.log(transformedData, transformedData.content)
+      // this._global.logger.debug(`唯一ID: ${transformedData.key}<br>元素位置: ${transformedData.data.selector}<br>元素内容: ${transformedData.data.content}<br>元素事件: ${transformedData.data.event_fn}`)
+      this._global.$subscribe.$emit('CLICK-TRACK', transformedData, this.pageInfo)
+    }
+    return transformedData
+  }
+}

+ 7 - 0
src/plugins/index.js

@@ -0,0 +1,7 @@
+import ClickPlugin from "./click";
+
+const TrackPlugins = [
+  ClickPlugin
+]
+
+export default TrackPlugins

+ 1448 - 0
yarn.lock

@@ -0,0 +1,1448 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.16.0.tgz?cache=0&sync_timestamp=1635560663383&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431"
+  integrity sha1-DfyAMJvuyEEeZecGRhxAiwu5tDE=
+  dependencies:
+    "@babel/highlight" "^7.16.0"
+
+"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0", "@babel/compat-data@^7.16.4":
+  version "7.16.4"
+  resolved "https://registry.npmmirror.com/@babel/compat-data/download/@babel/compat-data-7.16.4.tgz?cache=0&sync_timestamp=1637102861835&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fcompat-data%2Fdownload%2F%40babel%2Fcompat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e"
+  integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==
+
+"@babel/core@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/core/download/@babel/core-7.16.5.tgz#924aa9e1ae56e1e55f7184c8bf073a50d8677f5c"
+  integrity sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==
+  dependencies:
+    "@babel/code-frame" "^7.16.0"
+    "@babel/generator" "^7.16.5"
+    "@babel/helper-compilation-targets" "^7.16.3"
+    "@babel/helper-module-transforms" "^7.16.5"
+    "@babel/helpers" "^7.16.5"
+    "@babel/parser" "^7.16.5"
+    "@babel/template" "^7.16.0"
+    "@babel/traverse" "^7.16.5"
+    "@babel/types" "^7.16.0"
+    convert-source-map "^1.7.0"
+    debug "^4.1.0"
+    gensync "^1.0.0-beta.2"
+    json5 "^2.1.2"
+    semver "^6.3.0"
+    source-map "^0.5.0"
+
+"@babel/generator@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/generator/download/@babel/generator-7.16.5.tgz#26e1192eb8f78e0a3acaf3eede3c6fc96d22bedf"
+  integrity sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==
+  dependencies:
+    "@babel/types" "^7.16.0"
+    jsesc "^2.5.1"
+    source-map "^0.5.0"
+
+"@babel/helper-annotate-as-pure@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.16.0.tgz?cache=0&sync_timestamp=1635560944976&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-annotate-as-pure%2Fdownload%2F%40babel%2Fhelper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d"
+  integrity sha1-mh8OvNpT2aLQAQjEzqzmpdXx8I0=
+  dependencies:
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.16.5.tgz#a8429d064dce8207194b8bf05a70a9ea828746af"
+  integrity sha512-3JEA9G5dmmnIWdzaT9d0NmFRgYnWUThLsDaL7982H0XqqWr56lRrsmwheXFMjR+TMl7QMBb6mzy9kvgr1lRLUA==
+  dependencies:
+    "@babel/helper-explode-assignable-expression" "^7.16.0"
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.3":
+  version "7.16.3"
+  resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.16.3.tgz?cache=0&sync_timestamp=1636494908651&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-compilation-targets%2Fdownload%2F%40babel%2Fhelper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0"
+  integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==
+  dependencies:
+    "@babel/compat-data" "^7.16.0"
+    "@babel/helper-validator-option" "^7.14.5"
+    browserslist "^4.17.5"
+    semver "^6.3.0"
+
+"@babel/helper-create-class-features-plugin@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.16.5.tgz#5d1bcd096792c1ebec6249eebc6358eec55d0cad"
+  integrity sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.16.0"
+    "@babel/helper-environment-visitor" "^7.16.5"
+    "@babel/helper-function-name" "^7.16.0"
+    "@babel/helper-member-expression-to-functions" "^7.16.5"
+    "@babel/helper-optimise-call-expression" "^7.16.0"
+    "@babel/helper-replace-supers" "^7.16.5"
+    "@babel/helper-split-export-declaration" "^7.16.0"
+
+"@babel/helper-create-regexp-features-plugin@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.16.0.tgz?cache=0&sync_timestamp=1635566958507&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-create-regexp-features-plugin%2Fdownload%2F%40babel%2Fhelper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff"
+  integrity sha1-BrI0jON/zMT14Y3NjXUFPyp8RP8=
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.16.0"
+    regexpu-core "^4.7.1"
+
+"@babel/helper-define-polyfill-provider@^0.3.0":
+  version "0.3.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/download/@babel/helper-define-polyfill-provider-0.3.0.tgz?cache=0&sync_timestamp=1636799716380&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-define-polyfill-provider%2Fdownload%2F%40babel%2Fhelper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971"
+  integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==
+  dependencies:
+    "@babel/helper-compilation-targets" "^7.13.0"
+    "@babel/helper-module-imports" "^7.12.13"
+    "@babel/helper-plugin-utils" "^7.13.0"
+    "@babel/traverse" "^7.13.0"
+    debug "^4.1.1"
+    lodash.debounce "^4.0.8"
+    resolve "^1.14.2"
+    semver "^6.1.2"
+
+"@babel/helper-environment-visitor@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/download/@babel/helper-environment-visitor-7.16.5.tgz#f6a7f38b3c6d8b07c88faea083c46c09ef5451b8"
+  integrity sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==
+  dependencies:
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-explode-assignable-expression@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778"
+  integrity sha1-dTAXM3oV9G+cCfZ0z/EM7pudd3g=
+  dependencies:
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-function-name@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-function-name/download/@babel/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481"
+  integrity sha1-t90Hl9ALv+5PB+nE6lsOMMi7FIE=
+  dependencies:
+    "@babel/helper-get-function-arity" "^7.16.0"
+    "@babel/template" "^7.16.0"
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-get-function-arity@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa"
+  integrity sha1-AIjHSGspqctdlIsaHeRttm4InPo=
+  dependencies:
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-hoist-variables@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a"
+  integrity sha1-TJAjwvHe9+KP9G/B2802o5vqqBo=
+  dependencies:
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-member-expression-to-functions@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.16.5.tgz#1bc9f7e87354e86f8879c67b316cb03d3dc2caab"
+  integrity sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==
+  dependencies:
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-module-imports/download/@babel/helper-module-imports-7.16.0.tgz?cache=0&sync_timestamp=1635560941965&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-module-imports%2Fdownload%2F%40babel%2Fhelper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3"
+  integrity sha1-kFOOYLZy7PG0SPX09UM9N+eaPsM=
+  dependencies:
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-module-transforms@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.16.5.tgz#530ebf6ea87b500f60840578515adda2af470a29"
+  integrity sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.16.5"
+    "@babel/helper-module-imports" "^7.16.0"
+    "@babel/helper-simple-access" "^7.16.0"
+    "@babel/helper-split-export-declaration" "^7.16.0"
+    "@babel/helper-validator-identifier" "^7.15.7"
+    "@babel/template" "^7.16.0"
+    "@babel/traverse" "^7.16.5"
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-optimise-call-expression@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338"
+  integrity sha1-zs2xRdcMVAlrFWT46fEM19GTszg=
+  dependencies:
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.16.5.tgz#afe37a45f39fce44a3d50a7958129ea5b1a5c074"
+  integrity sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==
+
+"@babel/helper-remap-async-to-generator@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.16.5.tgz#e706646dc4018942acb4b29f7e185bc246d65ac3"
+  integrity sha512-X+aAJldyxrOmN9v3FKp+Hu1NO69VWgYgDGq6YDykwRPzxs5f2N+X988CBXS7EQahDU+Vpet5QYMqLk+nsp+Qxw==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.16.0"
+    "@babel/helper-wrap-function" "^7.16.5"
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-replace-supers@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.16.5.tgz#96d3988bd0ab0a2d22c88c6198c3d3234ca25326"
+  integrity sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.16.5"
+    "@babel/helper-member-expression-to-functions" "^7.16.5"
+    "@babel/helper-optimise-call-expression" "^7.16.0"
+    "@babel/traverse" "^7.16.5"
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-simple-access@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-simple-access/download/@babel/helper-simple-access-7.16.0.tgz?cache=0&sync_timestamp=1635560942808&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-simple-access%2Fdownload%2F%40babel%2Fhelper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517"
+  integrity sha1-IdaidiDjg+N1NM9sELugGab5BRc=
+  dependencies:
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/download/@babel/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09"
+  integrity sha1-DuM4gHAUfDrgUeSH7KPrsOLouwk=
+  dependencies:
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-split-export-declaration@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.16.0.tgz?cache=0&sync_timestamp=1635560943488&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-split-export-declaration%2Fdownload%2F%40babel%2Fhelper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438"
+  integrity sha1-KWcvQ2Y+k23zcKrrIr7ds7rsdDg=
+  dependencies:
+    "@babel/types" "^7.16.0"
+
+"@babel/helper-validator-identifier@^7.15.7":
+  version "7.15.7"
+  resolved "https://registry.nlark.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389"
+  integrity sha1-Ig35k7/pBKSmsCq08zhaXr9uI4k=
+
+"@babel/helper-validator-option@^7.14.5":
+  version "7.14.5"
+  resolved "https://registry.nlark.com/@babel/helper-validator-option/download/@babel/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3"
+  integrity sha1-bnKh//GNXfy4eOHmLxoCHEty1aM=
+
+"@babel/helper-wrap-function@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.16.5.tgz#0158fca6f6d0889c3fee8a6ed6e5e07b9b54e41f"
+  integrity sha512-2J2pmLBqUqVdJw78U0KPNdeE2qeuIyKoG4mKV7wAq3mc4jJG282UgjZw4ZYDnqiWQuS3Y3IYdF/AQ6CpyBV3VA==
+  dependencies:
+    "@babel/helper-function-name" "^7.16.0"
+    "@babel/template" "^7.16.0"
+    "@babel/traverse" "^7.16.5"
+    "@babel/types" "^7.16.0"
+
+"@babel/helpers@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/helpers/download/@babel/helpers-7.16.5.tgz#29a052d4b827846dd76ece16f565b9634c554ebd"
+  integrity sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==
+  dependencies:
+    "@babel/template" "^7.16.0"
+    "@babel/traverse" "^7.16.5"
+    "@babel/types" "^7.16.0"
+
+"@babel/highlight@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/highlight/download/@babel/highlight-7.16.0.tgz?cache=0&sync_timestamp=1635560940881&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhighlight%2Fdownload%2F%40babel%2Fhighlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a"
+  integrity sha1-bOsysspLj182H7f9gh4/3fShclo=
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.15.7"
+    chalk "^2.0.0"
+    js-tokens "^4.0.0"
+
+"@babel/parser@^7.16.0", "@babel/parser@^7.16.5":
+  version "7.16.6"
+  resolved "https://registry.npmmirror.com/@babel/parser/download/@babel/parser-7.16.6.tgz#8f194828193e8fa79166f34a4b4e52f3e769a314"
+  integrity sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==
+
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2":
+  version "7.16.2"
+  resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/download/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz?cache=0&sync_timestamp=1635837362783&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-bugfix-safari-id-destructuring-collision-in-function-expression%2Fdownload%2F%40babel%2Fplugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183"
+  integrity sha1-KXf8qbIS2xU8GVZ05Xz6uAdzMYM=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/download/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz#358972eaab006f5eb0826183b0c93cbcaf13e1e2"
+  integrity sha1-NYly6qsAb16wgmGDsMk8vK8T4eI=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.14.5"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+    "@babel/plugin-proposal-optional-chaining" "^7.16.0"
+
+"@babel/plugin-proposal-async-generator-functions@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.16.5.tgz#fd3bd7e0d98404a3d4cbca15a72d533f8c9a2f67"
+  integrity sha512-C/FX+3HNLV6sz7AqbTQqEo1L9/kfrKjxcVtgyBCmvIgOjvuBVUWooDoi7trsLxOzCEo5FccjRvKHkfDsJFZlfA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/helper-remap-async-to-generator" "^7.16.5"
+    "@babel/plugin-syntax-async-generators" "^7.8.4"
+
+"@babel/plugin-proposal-class-properties@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.16.5.tgz#3269f44b89122110f6339806e05d43d84106468a"
+  integrity sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A==
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.16.5"
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-proposal-class-static-block@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/download/@babel/plugin-proposal-class-static-block-7.16.5.tgz#df58ab015a7d3b0963aafc8f20792dcd834952a9"
+  integrity sha512-EEFzuLZcm/rNJ8Q5krK+FRKdVkd6FjfzT9tuSZql9sQn64K0hHA2KLJ0DqVot9/iV6+SsuadC5yI39zWnm+nmQ==
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.16.5"
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
+"@babel/plugin-proposal-dynamic-import@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.16.5.tgz#2e0d19d5702db4dcb9bc846200ca02f2e9d60e9e"
+  integrity sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
+"@babel/plugin-proposal-export-namespace-from@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/download/@babel/plugin-proposal-export-namespace-from-7.16.5.tgz#3b4dd28378d1da2fea33e97b9f25d1c2f5bf1ac9"
+  integrity sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-proposal-json-strings@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.16.5.tgz#1e726930fca139caab6b084d232a9270d9d16f9c"
+  integrity sha512-QQJueTFa0y9E4qHANqIvMsuxM/qcLQmKttBACtPCQzGUEizsXDACGonlPiSwynHfOa3vNw0FPMVvQzbuXwh4SQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/plugin-syntax-json-strings" "^7.8.3"
+
+"@babel/plugin-proposal-logical-assignment-operators@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/download/@babel/plugin-proposal-logical-assignment-operators-7.16.5.tgz#df1f2e4b5a0ec07abf061d2c18e53abc237d3ef5"
+  integrity sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz#652555bfeeeee2d2104058c6225dc6f75e2d0f07"
+  integrity sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-proposal-numeric-separator@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.16.5.tgz#edcb6379b6cf4570be64c45965d8da7a2debf039"
+  integrity sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-proposal-object-rest-spread@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.16.5.tgz#f30f80dacf7bc1404bf67f99c8d9c01665e830ad"
+  integrity sha512-UEd6KpChoyPhCoE840KRHOlGhEZFutdPDMGj+0I56yuTTOaT51GzmnEl/0uT41fB/vD2nT+Pci2KjezyE3HmUw==
+  dependencies:
+    "@babel/compat-data" "^7.16.4"
+    "@babel/helper-compilation-targets" "^7.16.3"
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+    "@babel/plugin-transform-parameters" "^7.16.5"
+
+"@babel/plugin-proposal-optional-catch-binding@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.16.5.tgz#1a5405765cf589a11a33a1fd75b2baef7d48b74e"
+  integrity sha512-ihCMxY1Iljmx4bWy/PIMJGXN4NS4oUj1MKynwO07kiKms23pNvIn1DMB92DNB2R0EA882sw0VXIelYGdtF7xEQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.16.5.tgz#a5fa61056194d5059366c0009cb9a9e66ed75c1f"
+  integrity sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"@babel/plugin-proposal-private-methods@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/download/@babel/plugin-proposal-private-methods-7.16.5.tgz#2086f7d78c1b0c712d49b5c3fbc2d1ca21a7ee12"
+  integrity sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA==
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.16.5"
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-proposal-private-property-in-object@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/download/@babel/plugin-proposal-private-property-in-object-7.16.5.tgz#a42d4b56005db3d405b12841309dbca647e7a21b"
+  integrity sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.16.0"
+    "@babel/helper-create-class-features-plugin" "^7.16.5"
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+
+"@babel/plugin-proposal-unicode-property-regex@^7.16.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.16.5.tgz#35fe753afa7c572f322bd068ff3377bde0f37080"
+  integrity sha512-s5sKtlKQyFSatt781HQwv1hoM5BQ9qRH30r+dK56OLDsHmV74mzwJNX7R1yMuE7VZKG5O6q/gmOGSAO6ikTudg==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.16.0"
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+  version "7.8.4"
+  resolved "https://registry.nlark.com/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+  integrity sha1-qYP7Gusuw/btBCohD2QOkOeG/g0=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13":
+  version "7.12.13"
+  resolved "https://registry.nlark.com/@babel/plugin-syntax-class-properties/download/@babel/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+  integrity sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-class-static-block@^7.14.5":
+  version "7.14.5"
+  resolved "https://registry.nlark.com/@babel/plugin-syntax-class-static-block/download/@babel/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
+  integrity sha1-GV34mxRrS3izv4l/16JXyEZZ1AY=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-dynamic-import@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.nlark.com/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.8.3.tgz?cache=0&sync_timestamp=1618847125283&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-syntax-dynamic-import%2Fdownload%2F%40babel%2Fplugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
+  integrity sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-export-namespace-from@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.nlark.com/@babel/plugin-syntax-export-namespace-from/download/@babel/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
+  integrity sha1-AolkqbqA28CUyRXEh618TnpmRlo=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.nlark.com/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+  integrity sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.nlark.com/@babel/plugin-syntax-logical-assignment-operators/download/@babel/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+  integrity sha1-ypHvRjA1MESLkGZSusLp/plB9pk=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.nlark.com/@babel/plugin-syntax-nullish-coalescing-operator/download/@babel/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+  integrity sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.nlark.com/@babel/plugin-syntax-numeric-separator/download/@babel/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+  integrity sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.nlark.com/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+  integrity sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+  integrity sha1-YRGiZbz7Ag6579D9/X0mQCue1sE=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.nlark.com/@babel/plugin-syntax-optional-chaining/download/@babel/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+  integrity sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-private-property-in-object@^7.14.5":
+  version "7.14.5"
+  resolved "https://registry.nlark.com/@babel/plugin-syntax-private-property-in-object/download/@babel/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
+  integrity sha1-DcZnHsDqIrbpShEU+FeXDNOd4a0=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5":
+  version "7.14.5"
+  resolved "https://registry.nlark.com/@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+  integrity sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-arrow-functions@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.16.5.tgz#04c18944dd55397b521d9d7511e791acea7acf2d"
+  integrity sha512-8bTHiiZyMOyfZFULjsCnYOWG059FVMes0iljEHSfARhNgFfpsqE92OrCffv3veSw9rwMkYcFe9bj0ZoXU2IGtQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-async-to-generator@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.16.5.tgz#89c9b501e65bb14c4579a6ce9563f859de9b34e4"
+  integrity sha512-TMXgfioJnkXU+XRoj7P2ED7rUm5jbnDWwlCuFVTpQboMfbSya5WrmubNBAMlk7KXvywpo8rd8WuYZkis1o2H8w==
+  dependencies:
+    "@babel/helper-module-imports" "^7.16.0"
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/helper-remap-async-to-generator" "^7.16.5"
+
+"@babel/plugin-transform-block-scoped-functions@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.16.5.tgz#af087494e1c387574260b7ee9b58cdb5a4e9b0b0"
+  integrity sha512-BxmIyKLjUGksJ99+hJyL/HIxLIGnLKtw772zYDER7UuycDZ+Xvzs98ZQw6NGgM2ss4/hlFAaGiZmMNKvValEjw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-block-scoping@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.16.5.tgz#b91f254fe53e210eabe4dd0c40f71c0ed253c5e7"
+  integrity sha512-JxjSPNZSiOtmxjX7PBRBeRJTUKTyJ607YUYeT0QJCNdsedOe+/rXITjP08eG8xUpsLfPirgzdCFN+h0w6RI+pQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-classes@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.16.5.tgz#6acf2ec7adb50fb2f3194dcd2909dbd056dcf216"
+  integrity sha512-DzJ1vYf/7TaCYy57J3SJ9rV+JEuvmlnvvyvYKFbk5u46oQbBvuB9/0w+YsVsxkOv8zVWKpDmUoj4T5ILHoXevA==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.16.0"
+    "@babel/helper-environment-visitor" "^7.16.5"
+    "@babel/helper-function-name" "^7.16.0"
+    "@babel/helper-optimise-call-expression" "^7.16.0"
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/helper-replace-supers" "^7.16.5"
+    "@babel/helper-split-export-declaration" "^7.16.0"
+    globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.16.5.tgz#2af91ebf0cceccfcc701281ada7cfba40a9b322a"
+  integrity sha512-n1+O7xtU5lSLraRzX88CNcpl7vtGdPakKzww74bVwpAIRgz9JVLJJpOLb0uYqcOaXVM0TL6X0RVeIJGD2CnCkg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-destructuring@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.16.5.tgz#89ebc87499ac4a81b897af53bb5d3eed261bd568"
+  integrity sha512-GuRVAsjq+c9YPK6NeTkRLWyQskDC099XkBSVO+6QzbnOnH2d/4mBVXYStaPrZD3dFRfg00I6BFJ9Atsjfs8mlg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-dotall-regex@^7.16.5", "@babel/plugin-transform-dotall-regex@^7.4.4":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.16.5.tgz#b40739c00b6686820653536d6d143e311de67936"
+  integrity sha512-iQiEMt8Q4/5aRGHpGVK2Zc7a6mx7qEAO7qehgSug3SDImnuMzgmm/wtJALXaz25zUj1PmnNHtShjFgk4PDx4nw==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.16.0"
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-duplicate-keys@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.16.5.tgz#2450f2742325412b746d7d005227f5e8973b512a"
+  integrity sha512-81tijpDg2a6I1Yhj4aWY1l3O1J4Cg/Pd7LfvuaH2VVInAkXtzibz9+zSPdUM1WvuUi128ksstAP0hM5w48vQgg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-exponentiation-operator@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.16.5.tgz#36e261fa1ab643cfaf30eeab38e00ed1a76081e2"
+  integrity sha512-12rba2HwemQPa7BLIKCzm1pT2/RuQHtSFHdNl41cFiC6oi4tcrp7gjB07pxQvFpcADojQywSjblQth6gJyE6CA==
+  dependencies:
+    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.5"
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-for-of@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.16.5.tgz#9b544059c6ca11d565457c0ff1f08e13ce225261"
+  integrity sha512-+DpCAJFPAvViR17PIMi9x2AE34dll5wNlXO43wagAX2YcRGgEVHCNFC4azG85b4YyyFarvkc/iD5NPrz4Oneqw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-function-name@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.16.5.tgz#6896ebb6a5538a75d6a4086a277752f655a7bd15"
+  integrity sha512-Fuec/KPSpVLbGo6z1RPw4EE1X+z9gZk1uQmnYy7v4xr4TO9p41v1AoUuXEtyqAI7H+xNJYSICzRqZBhDEkd3kQ==
+  dependencies:
+    "@babel/helper-function-name" "^7.16.0"
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-literals@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.16.5.tgz#af392b90e3edb2bd6dc316844cbfd6b9e009d320"
+  integrity sha512-B1j9C/IfvshnPcklsc93AVLTrNVa69iSqztylZH6qnmiAsDDOmmjEYqOm3Ts2lGSgTSywnBNiqC949VdD0/gfw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-member-expression-literals@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.16.5.tgz#4bd6ecdc11932361631097b779ca5c7570146dd5"
+  integrity sha512-d57i3vPHWgIde/9Y8W/xSFUndhvhZN5Wu2TjRrN1MVz5KzdUihKnfDVlfP1U7mS5DNj/WHHhaE4/tTi4hIyHwQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-modules-amd@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.16.5.tgz#92c0a3e83f642cb7e75fada9ab497c12c2616527"
+  integrity sha512-oHI15S/hdJuSCfnwIz+4lm6wu/wBn7oJ8+QrkzPPwSFGXk8kgdI/AIKcbR/XnD1nQVMg/i6eNaXpszbGuwYDRQ==
+  dependencies:
+    "@babel/helper-module-transforms" "^7.16.5"
+    "@babel/helper-plugin-utils" "^7.16.5"
+    babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-commonjs@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.16.5.tgz#4ee03b089536f076b2773196529d27c32b9d7bde"
+  integrity sha512-ABhUkxvoQyqhCWyb8xXtfwqNMJD7tx+irIRnUh6lmyFud7Jln1WzONXKlax1fg/ey178EXbs4bSGNd6PngO+SQ==
+  dependencies:
+    "@babel/helper-module-transforms" "^7.16.5"
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/helper-simple-access" "^7.16.0"
+    babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-systemjs@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.16.5.tgz#07078ba2e3cc94fbdd06836e355c246e98ad006b"
+  integrity sha512-53gmLdScNN28XpjEVIm7LbWnD/b/TpbwKbLk6KV4KqC9WyU6rq1jnNmVG6UgAdQZVVGZVoik3DqHNxk4/EvrjA==
+  dependencies:
+    "@babel/helper-hoist-variables" "^7.16.0"
+    "@babel/helper-module-transforms" "^7.16.5"
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/helper-validator-identifier" "^7.15.7"
+    babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-umd@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.16.5.tgz#caa9c53d636fb4e3c99fd35a4c9ba5e5cd7e002e"
+  integrity sha512-qTFnpxHMoenNHkS3VoWRdwrcJ3FhX567GvDA3hRZKF0Dj8Fmg0UzySZp3AP2mShl/bzcywb/UWAMQIjA1bhXvw==
+  dependencies:
+    "@babel/helper-module-transforms" "^7.16.5"
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.16.5.tgz#4afd8cdee377ce3568f4e8a9ee67539b69886a3c"
+  integrity sha512-/wqGDgvFUeKELW6ex6QB7dLVRkd5ehjw34tpXu1nhKC0sFfmaLabIswnpf8JgDyV2NeDmZiwoOb0rAmxciNfjA==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.16.0"
+
+"@babel/plugin-transform-new-target@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.16.5.tgz#759ea9d6fbbc20796056a5d89d13977626384416"
+  integrity sha512-ZaIrnXF08ZC8jnKR4/5g7YakGVL6go6V9ql6Jl3ecO8PQaQqFE74CuM384kezju7Z9nGCCA20BqZaR1tJ/WvHg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-object-super@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.16.5.tgz#8ccd9a1bcd3e7732ff8aa1702d067d8cd70ce380"
+  integrity sha512-tded+yZEXuxt9Jdtkc1RraW1zMF/GalVxaVVxh41IYwirdRgyAxxxCKZ9XB7LxZqmsjfjALxupNE1MIz9KH+Zg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/helper-replace-supers" "^7.16.5"
+
+"@babel/plugin-transform-parameters@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.16.5.tgz#4fc74b18a89638bd90aeec44a11793ecbe031dde"
+  integrity sha512-B3O6AL5oPop1jAVg8CV+haeUte9oFuY85zu0jwnRNZZi3tVAbJriu5tag/oaO2kGaQM/7q7aGPBlTI5/sr9enA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-property-literals@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.16.5.tgz#58f1465a7202a2bb2e6b003905212dd7a79abe3f"
+  integrity sha512-+IRcVW71VdF9pEH/2R/Apab4a19LVvdVsr/gEeotH00vSDVlKD+XgfSIw+cgGWsjDB/ziqGv/pGoQZBIiQVXHg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-regenerator@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.16.5.tgz#704cc6d8dd3dd4758267621ab7b36375238cef13"
+  integrity sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg==
+  dependencies:
+    regenerator-transform "^0.14.2"
+
+"@babel/plugin-transform-reserved-words@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.16.5.tgz#db95e98799675e193dc2b47d3e72a7c0651d0c30"
+  integrity sha512-aIB16u8lNcf7drkhXJRoggOxSTUAuihTSTfAcpynowGJOZiGf+Yvi7RuTwFzVYSYPmWyARsPqUGoZWWWxLiknw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-shorthand-properties@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.16.5.tgz#ccb60b1a23b799f5b9a14d97c5bc81025ffd96d7"
+  integrity sha512-ZbuWVcY+MAXJuuW7qDoCwoxDUNClfZxoo7/4swVbOW1s/qYLOMHlm9YRWMsxMFuLs44eXsv4op1vAaBaBaDMVg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-spread@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.16.5.tgz#912b06cff482c233025d3e69cf56d3e8fa166c29"
+  integrity sha512-5d6l/cnG7Lw4tGHEoga4xSkYp1euP7LAtrah1h1PgJ3JY7yNsjybsxQAnVK4JbtReZ/8z6ASVmd3QhYYKLaKZw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+
+"@babel/plugin-transform-sticky-regex@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.16.5.tgz#593579bb2b5a8adfbe02cb43823275d9098f75f9"
+  integrity sha512-usYsuO1ID2LXxzuUxifgWtJemP7wL2uZtyrTVM4PKqsmJycdS4U4mGovL5xXkfUheds10Dd2PjoQLXw6zCsCbg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-template-literals@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.16.5.tgz#343651385fd9923f5aa2275ca352c5d9183e1773"
+  integrity sha512-gnyKy9RyFhkovex4BjKWL3BVYzUDG6zC0gba7VMLbQoDuqMfJ1SDXs8k/XK41Mmt1Hyp4qNAvGFb9hKzdCqBRQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-typeof-symbol@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.16.5.tgz#a1d1bf2c71573fe30965d0e4cd6a3291202e20ed"
+  integrity sha512-ldxCkW180qbrvyCVDzAUZqB0TAeF8W/vGJoRcaf75awm6By+PxfJKvuqVAnq8N9wz5Xa6mSpM19OfVKKVmGHSQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-unicode-escapes@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/download/@babel/plugin-transform-unicode-escapes-7.16.5.tgz#80507c225af49b4f4ee647e2a0ce53d2eeff9e85"
+  integrity sha512-shiCBHTIIChGLdyojsKQjoAyB8MBwat25lKM7MJjbe1hE0bgIppD+LX9afr41lLHOhqceqeWl4FkLp+Bgn9o1Q==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/plugin-transform-unicode-regex@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.16.5.tgz#ac84d6a1def947d71ffb832426aa53b83d7ed49e"
+  integrity sha512-GTJ4IW012tiPEMMubd7sD07iU9O/LOo8Q/oU4xNhcaq0Xn8+6TcUQaHtC8YxySo1T+ErQ8RaWogIEeFhKGNPzw==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.16.0"
+    "@babel/helper-plugin-utils" "^7.16.5"
+
+"@babel/preset-env@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/preset-env/download/@babel/preset-env-7.16.5.tgz#2e94d922f4a890979af04ffeb6a6b4e44ba90847"
+  integrity sha512-MiJJW5pwsktG61NDxpZ4oJ1CKxM1ncam9bzRtx9g40/WkLRkxFP6mhpkYV0/DxcciqoiHicx291+eUQrXb/SfQ==
+  dependencies:
+    "@babel/compat-data" "^7.16.4"
+    "@babel/helper-compilation-targets" "^7.16.3"
+    "@babel/helper-plugin-utils" "^7.16.5"
+    "@babel/helper-validator-option" "^7.14.5"
+    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.2"
+    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0"
+    "@babel/plugin-proposal-async-generator-functions" "^7.16.5"
+    "@babel/plugin-proposal-class-properties" "^7.16.5"
+    "@babel/plugin-proposal-class-static-block" "^7.16.5"
+    "@babel/plugin-proposal-dynamic-import" "^7.16.5"
+    "@babel/plugin-proposal-export-namespace-from" "^7.16.5"
+    "@babel/plugin-proposal-json-strings" "^7.16.5"
+    "@babel/plugin-proposal-logical-assignment-operators" "^7.16.5"
+    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.5"
+    "@babel/plugin-proposal-numeric-separator" "^7.16.5"
+    "@babel/plugin-proposal-object-rest-spread" "^7.16.5"
+    "@babel/plugin-proposal-optional-catch-binding" "^7.16.5"
+    "@babel/plugin-proposal-optional-chaining" "^7.16.5"
+    "@babel/plugin-proposal-private-methods" "^7.16.5"
+    "@babel/plugin-proposal-private-property-in-object" "^7.16.5"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.16.5"
+    "@babel/plugin-syntax-async-generators" "^7.8.4"
+    "@babel/plugin-syntax-class-properties" "^7.12.13"
+    "@babel/plugin-syntax-class-static-block" "^7.14.5"
+    "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+    "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+    "@babel/plugin-syntax-json-strings" "^7.8.3"
+    "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+    "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+    "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+    "@babel/plugin-syntax-top-level-await" "^7.14.5"
+    "@babel/plugin-transform-arrow-functions" "^7.16.5"
+    "@babel/plugin-transform-async-to-generator" "^7.16.5"
+    "@babel/plugin-transform-block-scoped-functions" "^7.16.5"
+    "@babel/plugin-transform-block-scoping" "^7.16.5"
+    "@babel/plugin-transform-classes" "^7.16.5"
+    "@babel/plugin-transform-computed-properties" "^7.16.5"
+    "@babel/plugin-transform-destructuring" "^7.16.5"
+    "@babel/plugin-transform-dotall-regex" "^7.16.5"
+    "@babel/plugin-transform-duplicate-keys" "^7.16.5"
+    "@babel/plugin-transform-exponentiation-operator" "^7.16.5"
+    "@babel/plugin-transform-for-of" "^7.16.5"
+    "@babel/plugin-transform-function-name" "^7.16.5"
+    "@babel/plugin-transform-literals" "^7.16.5"
+    "@babel/plugin-transform-member-expression-literals" "^7.16.5"
+    "@babel/plugin-transform-modules-amd" "^7.16.5"
+    "@babel/plugin-transform-modules-commonjs" "^7.16.5"
+    "@babel/plugin-transform-modules-systemjs" "^7.16.5"
+    "@babel/plugin-transform-modules-umd" "^7.16.5"
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.5"
+    "@babel/plugin-transform-new-target" "^7.16.5"
+    "@babel/plugin-transform-object-super" "^7.16.5"
+    "@babel/plugin-transform-parameters" "^7.16.5"
+    "@babel/plugin-transform-property-literals" "^7.16.5"
+    "@babel/plugin-transform-regenerator" "^7.16.5"
+    "@babel/plugin-transform-reserved-words" "^7.16.5"
+    "@babel/plugin-transform-shorthand-properties" "^7.16.5"
+    "@babel/plugin-transform-spread" "^7.16.5"
+    "@babel/plugin-transform-sticky-regex" "^7.16.5"
+    "@babel/plugin-transform-template-literals" "^7.16.5"
+    "@babel/plugin-transform-typeof-symbol" "^7.16.5"
+    "@babel/plugin-transform-unicode-escapes" "^7.16.5"
+    "@babel/plugin-transform-unicode-regex" "^7.16.5"
+    "@babel/preset-modules" "^0.1.5"
+    "@babel/types" "^7.16.0"
+    babel-plugin-polyfill-corejs2 "^0.3.0"
+    babel-plugin-polyfill-corejs3 "^0.4.0"
+    babel-plugin-polyfill-regenerator "^0.3.0"
+    core-js-compat "^3.19.1"
+    semver "^6.3.0"
+
+"@babel/preset-modules@^0.1.5":
+  version "0.1.5"
+  resolved "https://registry.npmmirror.com/@babel/preset-modules/download/@babel/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9"
+  integrity sha1-75Odbn8miCfhhBY43G/5VRXhFdk=
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
+    "@babel/plugin-transform-dotall-regex" "^7.4.4"
+    "@babel/types" "^7.4.4"
+    esutils "^2.0.2"
+
+"@babel/runtime@^7.8.4":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/runtime/download/@babel/runtime-7.16.5.tgz#7f3e34bf8bdbbadf03fbb7b1ea0d929569c9487a"
+  integrity sha512-TXWihFIS3Pyv5hzR7j6ihmeLkZfrXGxAr5UfSl8CHf+6q/wpiYDkUau0czckpYG8QmnCIuPpdLtuA9VmuGGyMA==
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/template/download/@babel/template-7.16.0.tgz?cache=0&sync_timestamp=1635560664232&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Ftemplate%2Fdownload%2F%40babel%2Ftemplate-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6"
+  integrity sha1-0Wo16/TNdOICCDNW+rId2JNj3dY=
+  dependencies:
+    "@babel/code-frame" "^7.16.0"
+    "@babel/parser" "^7.16.0"
+    "@babel/types" "^7.16.0"
+
+"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.5":
+  version "7.16.5"
+  resolved "https://registry.npmmirror.com/@babel/traverse/download/@babel/traverse-7.16.5.tgz#d7d400a8229c714a59b87624fc67b0f1fbd4b2b3"
+  integrity sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==
+  dependencies:
+    "@babel/code-frame" "^7.16.0"
+    "@babel/generator" "^7.16.5"
+    "@babel/helper-environment-visitor" "^7.16.5"
+    "@babel/helper-function-name" "^7.16.0"
+    "@babel/helper-hoist-variables" "^7.16.0"
+    "@babel/helper-split-export-declaration" "^7.16.0"
+    "@babel/parser" "^7.16.5"
+    "@babel/types" "^7.16.0"
+    debug "^4.1.0"
+    globals "^11.1.0"
+
+"@babel/types@^7.16.0", "@babel/types@^7.4.4":
+  version "7.16.0"
+  resolved "https://registry.npmmirror.com/@babel/types/download/@babel/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba"
+  integrity sha1-2zsxOAT5aq3Qt3bEgj4SetZyibo=
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.15.7"
+    to-fast-properties "^2.0.0"
+
+"@types/estree@*":
+  version "0.0.50"
+  resolved "https://registry.npmmirror.com/@types/estree/download/@types/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
+  integrity sha1-Hgyqk2TT/M0pMcPtlv2+ql1MyoM=
+
+"@types/node@*":
+  version "17.0.5"
+  resolved "https://registry.npmmirror.com/@types/node/download/@types/node-17.0.5.tgz#57ca67ec4e57ad9e4ef5a6bab48a15387a1c83e0"
+  integrity sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw==
+
+"@types/resolve@0.0.8":
+  version "0.0.8"
+  resolved "https://registry.npmmirror.com/@types/resolve/download/@types/resolve-0.0.8.tgz?cache=0&sync_timestamp=1637269963703&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fresolve%2Fdownload%2F%40types%2Fresolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194"
+  integrity sha1-8mB00jjgJlnjI84aE9BB7uKA4ZQ=
+  dependencies:
+    "@types/node" "*"
+
+ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.nlark.com/ansi-styles/download/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  integrity sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=
+  dependencies:
+    color-convert "^1.9.0"
+
+babel-plugin-dynamic-import-node@^2.3.3:
+  version "2.3.3"
+  resolved "https://registry.nlark.com/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
+  integrity sha1-hP2hnJduxcbe/vV/lCez3vZuF6M=
+  dependencies:
+    object.assign "^4.1.0"
+
+babel-plugin-polyfill-corejs2@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/download/babel-plugin-polyfill-corejs2-0.3.0.tgz?cache=0&sync_timestamp=1636799826882&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbabel-plugin-polyfill-corejs2%2Fdownload%2Fbabel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd"
+  integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==
+  dependencies:
+    "@babel/compat-data" "^7.13.11"
+    "@babel/helper-define-polyfill-provider" "^0.3.0"
+    semver "^6.1.1"
+
+babel-plugin-polyfill-corejs3@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/download/babel-plugin-polyfill-corejs3-0.4.0.tgz?cache=0&sync_timestamp=1636799935761&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbabel-plugin-polyfill-corejs3%2Fdownload%2Fbabel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087"
+  integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==
+  dependencies:
+    "@babel/helper-define-polyfill-provider" "^0.3.0"
+    core-js-compat "^3.18.0"
+
+babel-plugin-polyfill-regenerator@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/download/babel-plugin-polyfill-regenerator-0.3.0.tgz?cache=0&sync_timestamp=1636799716073&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbabel-plugin-polyfill-regenerator%2Fdownload%2Fbabel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be"
+  integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==
+  dependencies:
+    "@babel/helper-define-polyfill-provider" "^0.3.0"
+
+browserslist@^4.17.5, browserslist@^4.19.1:
+  version "4.19.1"
+  resolved "https://registry.npmmirror.com/browserslist/download/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3"
+  integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==
+  dependencies:
+    caniuse-lite "^1.0.30001286"
+    electron-to-chromium "^1.4.17"
+    escalade "^3.1.1"
+    node-releases "^2.0.1"
+    picocolors "^1.0.0"
+
+buffer-from@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.nlark.com/buffer-from/download/buffer-from-1.1.2.tgz?cache=0&sync_timestamp=1627578710888&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbuffer-from%2Fdownload%2Fbuffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+  integrity sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U=
+
+builtin-modules@^3.1.0:
+  version "3.2.0"
+  resolved "https://registry.npm.taobao.org/builtin-modules/download/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887"
+  integrity sha1-RdXbmefuXmvE82LgCL+RerUEmIc=
+
+call-bind@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.nlark.com/call-bind/download/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+  integrity sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=
+  dependencies:
+    function-bind "^1.1.1"
+    get-intrinsic "^1.0.2"
+
+caniuse-lite@^1.0.30001286:
+  version "1.0.30001294"
+  resolved "https://registry.npmmirror.com/caniuse-lite/download/caniuse-lite-1.0.30001294.tgz#4849f27b101fd59ddee3751598c663801032533d"
+  integrity sha512-LiMlrs1nSKZ8qkNhpUf5KD0Al1KCBE3zaT7OLOwEkagXMEDij98SiOovn9wxVGQpklk9vVC/pUSqgYmkmKOS8g==
+
+chalk@^2.0.0:
+  version "2.4.2"
+  resolved "https://registry.npmmirror.com/chalk/download/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+  integrity sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+color-convert@^1.9.0:
+  version "1.9.3"
+  resolved "https://registry.npmmirror.com/color-convert/download/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+  integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=
+  dependencies:
+    color-name "1.1.3"
+
+color-name@1.1.3:
+  version "1.1.3"
+  resolved "https://registry.nlark.com/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+  integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+commander@^2.20.0:
+  version "2.20.3"
+  resolved "https://registry.npmmirror.com/commander/download/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+  integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+convert-source-map@^1.7.0:
+  version "1.8.0"
+  resolved "https://registry.nlark.com/convert-source-map/download/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+  integrity sha1-8zc8MtIbTXgN2ABFFGhPt5HKQ2k=
+  dependencies:
+    safe-buffer "~5.1.1"
+
+core-js-compat@^3.18.0, core-js-compat@^3.19.1:
+  version "3.20.1"
+  resolved "https://registry.npmmirror.com/core-js-compat/download/core-js-compat-3.20.1.tgz#96917b4db634fbbbc7b36575b2e8fcbf7e4f9691"
+  integrity sha512-AVhKZNpqMV3Jz8hU0YEXXE06qoxtQGsAqU0u1neUngz5IusDJRX/ZJ6t3i7mS7QxNyEONbCo14GprkBrxPlTZA==
+  dependencies:
+    browserslist "^4.19.1"
+    semver "7.0.0"
+
+crypto-es@^1.2.7:
+  version "1.2.7"
+  resolved "https://registry.npm.taobao.org/crypto-es/download/crypto-es-1.2.7.tgz#754a6d52319a94fb4eb1f119297f17196b360f88"
+  integrity sha1-dUptUjGalPtOsfEZKX8XGWs2D4g=
+
+crypto-js@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/crypto-js/download/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf"
+  integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==
+
+debug@^4.1.0, debug@^4.1.1:
+  version "4.3.3"
+  resolved "https://registry.npmmirror.com/debug/download/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
+  integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
+  dependencies:
+    ms "2.1.2"
+
+define-properties@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.nlark.com/define-properties/download/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+  integrity sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=
+  dependencies:
+    object-keys "^1.0.12"
+
+electron-to-chromium@^1.4.17:
+  version "1.4.29"
+  resolved "https://registry.npmmirror.com/electron-to-chromium/download/electron-to-chromium-1.4.29.tgz#a9b85ab888d0122124c9647c04d8dd246fae94b6"
+  integrity sha512-N2Jbwxo5Rum8G2YXeUxycs1sv4Qme/ry71HG73bv8BvZl+I/4JtRgK/En+ST/Wh/yF1fqvVCY4jZBgMxnhjtBA==
+
+escalade@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.nlark.com/escalade/download/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+  integrity sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=
+
+escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.nlark.com/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+  integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+estree-walker@^0.6.1:
+  version "0.6.1"
+  resolved "https://registry.npmmirror.com/estree-walker/download/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362"
+  integrity sha1-UwSRQ/QMbrkYsjZx0f4yGfOhs2I=
+
+esutils@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+  integrity sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=
+
+fsevents@~2.3.2:
+  version "2.3.2"
+  resolved "https://registry.npmmirror.com/fsevents/download/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+  integrity sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=
+
+function-bind@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+  integrity sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=
+
+gensync@^1.0.0-beta.2:
+  version "1.0.0-beta.2"
+  resolved "https://registry.nlark.com/gensync/download/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+  integrity sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=
+
+get-intrinsic@^1.0.2:
+  version "1.1.1"
+  resolved "https://registry.nlark.com/get-intrinsic/download/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+  integrity sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y=
+  dependencies:
+    function-bind "^1.1.1"
+    has "^1.0.3"
+    has-symbols "^1.0.1"
+
+globals@^11.1.0:
+  version "11.12.0"
+  resolved "https://registry.npmmirror.com/globals/download/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+  integrity sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+  integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+  integrity sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=
+
+has-symbols@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.nlark.com/has-symbols/download/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
+  integrity sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM=
+
+has@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.nlark.com/has/download/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+  integrity sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=
+  dependencies:
+    function-bind "^1.1.1"
+
+is-core-module@^2.2.0:
+  version "2.8.0"
+  resolved "https://registry.npmmirror.com/is-core-module/download/is-core-module-2.8.0.tgz?cache=0&sync_timestamp=1634236702465&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-core-module%2Fdownload%2Fis-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
+  integrity sha1-AyEzbD0JJeSX/Zf12VyxFKXM1Ug=
+  dependencies:
+    has "^1.0.3"
+
+is-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.nlark.com/is-module/download/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
+  integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=
+
+is-reference@^1.1.2:
+  version "1.2.1"
+  resolved "https://registry.nlark.com/is-reference/download/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7"
+  integrity sha1-iy2sCzcfS8mU/eq6nrVC0DAC0Lc=
+  dependencies:
+    "@types/estree" "*"
+
+jest-worker@^26.2.1:
+  version "26.6.2"
+  resolved "https://registry.npmmirror.com/jest-worker/download/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
+  integrity sha1-f3LLxNZDw2Xie5/XdfnQ6qnHqO0=
+  dependencies:
+    "@types/node" "*"
+    merge-stream "^2.0.0"
+    supports-color "^7.0.0"
+
+js-tokens@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.nlark.com/js-tokens/download/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+  integrity sha1-GSA/tZmR35jjoocFDUZHzerzJJk=
+
+jsesc@^2.5.1:
+  version "2.5.2"
+  resolved "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+  integrity sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=
+
+jsesc@~0.5.0:
+  version "0.5.0"
+  resolved "https://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+  integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+json5@^2.1.2:
+  version "2.2.0"
+  resolved "https://registry.nlark.com/json5/download/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
+  integrity sha1-Lf7+cgxrpSXZ69kJlQ8FFTFsiaM=
+  dependencies:
+    minimist "^1.2.5"
+
+lodash.debounce@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.nlark.com/lodash.debounce/download/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+  integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
+
+magic-string@^0.25.2:
+  version "0.25.7"
+  resolved "https://registry.nlark.com/magic-string/download/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
+  integrity sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE=
+  dependencies:
+    sourcemap-codec "^1.4.4"
+
+merge-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.nlark.com/merge-stream/download/merge-stream-2.0.0.tgz?cache=0&sync_timestamp=1622025345923&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmerge-stream%2Fdownload%2Fmerge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+  integrity sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=
+
+minimist@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.nlark.com/minimist/download/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+  integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=
+
+ms@2.1.2:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/ms/download/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+  integrity sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=
+
+node-releases@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/node-releases/download/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5"
+  integrity sha1-PR05XyBPHy8ppUNYuftnh2WtL8U=
+
+object-keys@^1.0.12, object-keys@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.nlark.com/object-keys/download/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+  integrity sha1-HEfyct8nfzsdrwYWd9nILiMixg4=
+
+object.assign@^4.1.0:
+  version "4.1.2"
+  resolved "https://registry.nlark.com/object.assign/download/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
+  integrity sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=
+  dependencies:
+    call-bind "^1.0.0"
+    define-properties "^1.1.3"
+    has-symbols "^1.0.1"
+    object-keys "^1.1.1"
+
+path-parse@^1.0.6:
+  version "1.0.7"
+  resolved "https://registry.nlark.com/path-parse/download/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+  integrity sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=
+
+picocolors@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/picocolors/download/picocolors-1.0.0.tgz?cache=0&sync_timestamp=1634093339035&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpicocolors%2Fdownload%2Fpicocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+  integrity sha1-y1vcdP8/UYkiNur3nWi8RFZKuBw=
+
+randombytes@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.nlark.com/randombytes/download/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+  integrity sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=
+  dependencies:
+    safe-buffer "^5.1.0"
+
+regenerate-unicode-properties@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.nlark.com/regenerate-unicode-properties/download/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326"
+  integrity sha1-VNCccRXh9T3CMUqXSzLBw0Tv4yY=
+  dependencies:
+    regenerate "^1.4.2"
+
+regenerate@^1.4.2:
+  version "1.4.2"
+  resolved "https://registry.nlark.com/regenerate/download/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+  integrity sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo=
+
+regenerator-runtime@^0.13.4:
+  version "0.13.9"
+  resolved "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
+  integrity sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I=
+
+regenerator-transform@^0.14.2:
+  version "0.14.5"
+  resolved "https://registry.nlark.com/regenerator-transform/download/regenerator-transform-0.14.5.tgz?cache=0&sync_timestamp=1627057533376&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-transform%2Fdownload%2Fregenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4"
+  integrity sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ=
+  dependencies:
+    "@babel/runtime" "^7.8.4"
+
+regexpu-core@^4.7.1:
+  version "4.8.0"
+  resolved "https://registry.nlark.com/regexpu-core/download/regexpu-core-4.8.0.tgz?cache=0&sync_timestamp=1631619113277&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregexpu-core%2Fdownload%2Fregexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0"
+  integrity sha1-5WBbo2G2excYR4UBMnUC9EeamPA=
+  dependencies:
+    regenerate "^1.4.2"
+    regenerate-unicode-properties "^9.0.0"
+    regjsgen "^0.5.2"
+    regjsparser "^0.7.0"
+    unicode-match-property-ecmascript "^2.0.0"
+    unicode-match-property-value-ecmascript "^2.0.0"
+
+regjsgen@^0.5.2:
+  version "0.5.2"
+  resolved "https://registry.npmmirror.com/regjsgen/download/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
+  integrity sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM=
+
+regjsparser@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.npmmirror.com/regjsparser/download/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968"
+  integrity sha1-prZntUyIXhi1JVTLSWDvcRh+mWg=
+  dependencies:
+    jsesc "~0.5.0"
+
+resolve@^1.11.0, resolve@^1.11.1, resolve@^1.14.2:
+  version "1.20.0"
+  resolved "https://registry.nlark.com/resolve/download/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+  integrity sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=
+  dependencies:
+    is-core-module "^2.2.0"
+    path-parse "^1.0.6"
+
+rollup-plugin-babel@^4.4.0:
+  version "4.4.0"
+  resolved "https://registry.npmmirror.com/rollup-plugin-babel/download/rollup-plugin-babel-4.4.0.tgz#d15bd259466a9d1accbdb2fe2fff17c52d030acb"
+  integrity sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==
+  dependencies:
+    "@babel/helper-module-imports" "^7.0.0"
+    rollup-pluginutils "^2.8.1"
+
+rollup-plugin-commonjs@^10.1.0:
+  version "10.1.0"
+  resolved "https://registry.npmmirror.com/rollup-plugin-commonjs/download/rollup-plugin-commonjs-10.1.0.tgz#417af3b54503878e084d127adf4d1caf8beb86fb"
+  integrity sha1-QXrztUUDh44ITRJ6300cr4vrhvs=
+  dependencies:
+    estree-walker "^0.6.1"
+    is-reference "^1.1.2"
+    magic-string "^0.25.2"
+    resolve "^1.11.0"
+    rollup-pluginutils "^2.8.1"
+
+rollup-plugin-node-resolve@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/rollup-plugin-node-resolve/download/rollup-plugin-node-resolve-5.2.0.tgz#730f93d10ed202473b1fb54a5997a7db8c6d8523"
+  integrity sha1-cw+T0Q7SAkc7H7VKWZen24xthSM=
+  dependencies:
+    "@types/resolve" "0.0.8"
+    builtin-modules "^3.1.0"
+    is-module "^1.0.0"
+    resolve "^1.11.1"
+    rollup-pluginutils "^2.8.1"
+
+rollup-plugin-terser@^7.0.2:
+  version "7.0.2"
+  resolved "https://registry.nlark.com/rollup-plugin-terser/download/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d"
+  integrity sha1-6Pu6SGmYGy3DWufopQLVxsBNMk0=
+  dependencies:
+    "@babel/code-frame" "^7.10.4"
+    jest-worker "^26.2.1"
+    serialize-javascript "^4.0.0"
+    terser "^5.0.0"
+
+rollup-pluginutils@^2.8.1:
+  version "2.8.2"
+  resolved "https://registry.nlark.com/rollup-pluginutils/download/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e"
+  integrity sha1-cvKvB0i1kjZNvTOJ5gDlqURKNR4=
+  dependencies:
+    estree-walker "^0.6.1"
+
+rollup@^2.62.0:
+  version "2.62.0"
+  resolved "https://registry.npmmirror.com/rollup/download/rollup-2.62.0.tgz#9e640b419fc5b9e0241844f6d55258bd79986ecc"
+  integrity sha512-cJEQq2gwB0GWMD3rYImefQTSjrPYaC6s4J9pYqnstVLJ1CHa/aZNVkD4Epuvg4iLeMA4KRiq7UM7awKK6j7jcw==
+  optionalDependencies:
+    fsevents "~2.3.2"
+
+safe-buffer@^5.1.0:
+  version "5.2.1"
+  resolved "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz?cache=0&sync_timestamp=1618847044058&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+  integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=
+
+safe-buffer@~5.1.1:
+  version "5.1.2"
+  resolved "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.1.2.tgz?cache=0&sync_timestamp=1618847044058&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+  integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0=
+
+semver@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.nlark.com/semver/download/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
+  integrity sha1-XzyjV2HkfgWyBsba/yz4FPAxa44=
+
+semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
+  version "6.3.0"
+  resolved "https://registry.nlark.com/semver/download/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+  integrity sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=
+
+serialize-javascript@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.nlark.com/serialize-javascript/download/serialize-javascript-4.0.0.tgz?cache=0&sync_timestamp=1624608021459&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fserialize-javascript%2Fdownload%2Fserialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
+  integrity sha1-tSXhI4SJpez8Qq+sw/6Z5mb0sao=
+  dependencies:
+    randombytes "^2.1.0"
+
+source-map-support@~0.5.20:
+  version "0.5.21"
+  resolved "https://registry.npmmirror.com/source-map-support/download/source-map-support-0.5.21.tgz?cache=0&sync_timestamp=1637320322789&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+  integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
+source-map@^0.5.0:
+  version "0.5.7"
+  resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+  integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0:
+  version "0.6.1"
+  resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+  integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM=
+
+source-map@~0.7.2:
+  version "0.7.3"
+  resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+  integrity sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=
+
+sourcemap-codec@^1.4.4:
+  version "1.4.8"
+  resolved "https://registry.nlark.com/sourcemap-codec/download/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
+  integrity sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=
+
+supports-color@^5.3.0:
+  version "5.5.0"
+  resolved "https://registry.npmmirror.com/supports-color/download/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+  integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=
+  dependencies:
+    has-flag "^3.0.0"
+
+supports-color@^7.0.0:
+  version "7.2.0"
+  resolved "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+  integrity sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=
+  dependencies:
+    has-flag "^4.0.0"
+
+terser@^5.0.0:
+  version "5.10.0"
+  resolved "https://registry.npmmirror.com/terser/download/terser-5.10.0.tgz?cache=0&sync_timestamp=1636988125723&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fterser%2Fdownload%2Fterser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc"
+  integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==
+  dependencies:
+    commander "^2.20.0"
+    source-map "~0.7.2"
+    source-map-support "~0.5.20"
+
+to-fast-properties@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.nlark.com/to-fast-properties/download/to-fast-properties-2.0.0.tgz?cache=0&sync_timestamp=1628418855671&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fto-fast-properties%2Fdownload%2Fto-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+  integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
+unicode-canonical-property-names-ecmascript@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.nlark.com/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
+  integrity sha1-MBrNxSVjFnDTn2FG4Od/9rvevdw=
+
+unicode-match-property-ecmascript@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.nlark.com/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-2.0.0.tgz?cache=0&sync_timestamp=1631618607567&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funicode-match-property-ecmascript%2Fdownload%2Funicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3"
+  integrity sha1-VP0W4OyxZ88Ezx91a9zJLrp5dsM=
+  dependencies:
+    unicode-canonical-property-names-ecmascript "^2.0.0"
+    unicode-property-aliases-ecmascript "^2.0.0"
+
+unicode-match-property-value-ecmascript@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.nlark.com/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-2.0.0.tgz?cache=0&sync_timestamp=1631618158421&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funicode-match-property-value-ecmascript%2Fdownload%2Funicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714"
+  integrity sha1-GgGqVyR8FMVouJd1pUk4eIGJpxQ=
+
+unicode-property-aliases-ecmascript@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.nlark.com/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-2.0.0.tgz?cache=0&sync_timestamp=1631609471881&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funicode-property-aliases-ecmascript%2Fdownload%2Funicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8"
+  integrity sha1-CjbLmlhcT2q9Ua0d7dsoXBZSl8g=