瀏覽代碼

first commit

ith5cn 1 月之前
當前提交
7f0ffed332
共有 40 個文件被更改,包括 5270 次插入0 次删除
  1. 9 0
      .editorconfig
  2. 5 0
      .gitignore
  3. 37 0
      README.md
  4. 14 0
      config/api.js
  5. 31 0
      config/game.js
  6. 7 0
      config/sdk.js
  7. 264 0
      game.js
  8. 3 0
      game.json
  9. 二進制
      icon.png
  10. 25 0
      index.js
  11. 5 0
      index.ttml
  12. 683 0
      lib/md5.js
  13. 24 0
      model/DyPayConfigModel.js
  14. 23 0
      model/IpInfoModel.js
  15. 27 0
      model/OrderInfoModel.js
  16. 36 0
      model/SdkLoginReUserInfoModel.js
  17. 25 0
      model/ShareConfigModel.js
  18. 23 0
      model/SubscribeConfigModel.js
  19. 25 0
      model/XcxPayConfigModel.js
  20. 102 0
      model/base.js
  21. 2055 0
      package-lock.json
  22. 21 0
      package.json
  23. 21 0
      project.config.json
  24. 26 0
      project.private.config.json
  25. 84 0
      src/dataReport.js
  26. 206 0
      src/feedsubscribe.js
  27. 88 0
      src/init.js
  28. 28 0
      src/ip.js
  29. 228 0
      src/login.js
  30. 34 0
      src/navigate.js
  31. 363 0
      src/payment.js
  32. 0 0
      src/qrcode.min.js
  33. 153 0
      src/recommendDc.js
  34. 25 0
      src/service.js
  35. 108 0
      src/share.js
  36. 36 0
      src/shortcut.js
  37. 200 0
      utils/index.js
  38. 153 0
      utils/request.js
  39. 33 0
      utils/uqrcode.js
  40. 40 0
      webpack.config.js

+ 9 - 0
.editorconfig

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

+ 5 - 0
.gitignore

@@ -0,0 +1,5 @@
+.idea
+.DS_Store
+node_modules
+
+/dist

+ 37 - 0
README.md

@@ -0,0 +1,37 @@
+## 项目安装
+```
+npm install
+```
+
+### 编译压缩代码(生产环境)
+```
+npm run build
+```
+
+
+### sdk使用文档(例子参考game.js)
+
+```
+import {
+  init,
+  loginUserInfo,
+  dataReport,
+  makePayment,
+  shareAppMessage,
+  payConfig,
+  navigateToMiniProgram,
+  getBindPhoneCode,
+  bindPhone,
+  onShareAppMessage,
+  requestSubscribeMessage,
+  triggerSubscribe
+} from 'dist/miniGameSdk.1.0.0.js'
+
+// 初始化skd
+await init({
+    app_version: "1.0.0",
+    config_id: "ttce36b88b51081cb507",
+    game_name: "头条小游戏",
+});
+
+```

+ 14 - 0
config/api.js

@@ -0,0 +1,14 @@
+// 生产环境接口地址
+const DOMAIN = "https://app.hainanruiyu.cn";
+const REPORT_DOMAIN = "https://tj.hainanruiyu.cn";
+
+const apiConfig = {
+  COMMON: `${DOMAIN}/api/dyxyx/index.php`,
+  IOS_REPORT: `${REPORT_DOMAIN}/api/userinfo.php`,
+  ANDROID_REPORT: `${REPORT_DOMAIN}/api/userinfo.php`,
+  AD_REPORT: "",
+  IPV4: "",
+  IPV6: "",
+};
+
+export default apiConfig;

+ 31 - 0
config/game.js

@@ -0,0 +1,31 @@
+// 广告配置
+const AGENT_ID = 1000;
+const SITE_ID = 1000;
+const IOS_AGENT_ID = 1000;
+const IOS_SITE_ID = 1000;
+
+const ANDROID_SHARE_AGENT_ID = 1000;
+const ANDROID_SHARE_SITE_ID = 1000;
+const IOS_SHARE_AGENT_ID = 1000;
+const IOS_SHARE_SITE_ID = 1000;
+const MTYPE = 1; //默认自营抖音小游戏的mtype
+
+// 生成分享query参数,改用后端传,废弃
+const makeShareQuery = () => {
+  return `agent_id=${ANDROID_SHARE_AGENT_ID}&site_id=${ANDROID_SHARE_SITE_ID}`;
+};
+
+const makeIOSShareQuery = () => {
+  return `agent_id=${IOS_SHARE_AGENT_ID}&site_id=${IOS_SHARE_SITE_ID}`;
+};
+
+const gameConfig = {
+  // 游戏配置
+  AGENT_ID: AGENT_ID,
+  IOS_AGENT_ID: IOS_AGENT_ID,
+  SITE_ID: SITE_ID,
+  IOS_SITE_ID: IOS_SITE_ID,
+  MTYPE: MTYPE,
+};
+
+export default gameConfig;

+ 7 - 0
config/sdk.js

@@ -0,0 +1,7 @@
+const sdkConfig = {
+  SDK_VERSION: '1.0.2',
+  SDK_VERSION_CODE: '10002',
+  DEVICE_NO: 'dy_minigame_imei',
+}
+
+export default sdkConfig

+ 264 - 0
game.js

@@ -0,0 +1,264 @@
+import {
+  init,
+  loginUserInfo,
+  login,
+  dataReport,
+  makePayment,
+  shareAppMessage,
+  addShortcut,
+  checkShortcut,
+  onShareAppMessage,
+  navigateToScene,
+  openCustomerServiceConversation,
+  requestFeedSubscribe,
+  checkFeedSubscribeStatus,
+  reportScene,
+  getFeedLaunchParams
+} from "index";
+// from './dist/dyMiniGameSdk.1.0.0.js'
+
+// 初始化skd
+(async () => {
+  try {
+    let data = {
+      app_version: "1.0.0",
+      config_id: "tta0dbd6663eb8fad902",
+      game_name: "暮影战神",
+    };
+    // 静默授权
+    const res = await init(data);
+    console.log("初始化")
+    console.log(res);
+    tt.showToast({
+      title: "进入游戏成功",
+    });
+  } catch (error) {
+    console.log(error);
+  }
+})();
+
+// 下单
+const handleMakePayment = async () => {
+  try {
+    let info = {
+      amt: 1,
+      server_id: 1,
+      server_name: "测试1服",
+      role_id: "10000111",
+      role_name: "小林",
+      role_level: 1,
+      ext: "aaaaaaa",
+      product_id: "001",
+      product_name: "测试商品",
+    };
+
+    makePayment(info)
+      .then((res) => {
+        console.log("支付调用结果:", res);
+      })
+      .catch((error) => {
+        console.log(error);
+      });
+  } catch (error) {
+    console.log("支付调用结果error:", error);
+  }
+};
+
+//角色上报按钮
+const handleDataReport = async () => {
+  try {
+    let info = {
+      data_type: 2,
+      server_id: 1,
+      server_name: "测试1服",
+      role_id: "10000111",
+      role_name: "小林",
+      role_level: 1,
+      role_currency: 1000,
+    };
+    const res = await dataReport(info);
+    tt.showToast({
+      title: "角色上报成功",
+    });
+    console.log("角色上报")
+    console.log(res);
+  } catch (error) {
+    console.log(error);
+  }
+};
+
+/**
+ * 2025年05月06日
+ * 新增登陆方法
+ */
+const handleLogin = async ()=>{
+  try {
+    const res = await login();
+    console.log("登录")
+    console.log(res);
+    tt.showToast({
+      title: "获取成功",
+    });
+  } catch (error) {
+    console.log(error);
+  }
+}
+
+//获取平台登录用户信息
+const handleLoginUserInfo = async () => {
+  try {
+    const res = await loginUserInfo();
+    console.log(res);
+    tt.showToast({
+      title: "获取成功",
+    });
+  } catch (error) {
+    console.log(error);
+  }
+};
+
+//主动分享
+const handleShareAppMessage = async () => {
+  try {
+    let info = {
+      title: "分享测试",
+      imageUrl: "https://app.hainanruiyu.com/hd/img/632-2.jpg",
+      ext: "&ceshi=linquan321",
+      channel: "",
+      templateId: "",
+    };
+    await shareAppMessage(info);
+    tt.showToast({
+      title: "分享成功",
+    });
+  } catch (error) {
+    console.log(error);
+  }
+};
+
+//主动监听
+const handleOnShareAppMessage = () => {
+  onShareAppMessage({
+    title: "测试",
+    imageUrl: "https://app.hainanruiyu.com/hd/img/632-2.jpg",
+    ext: "&ceshi=test",
+  });
+};
+
+// 将小游戏快捷方式添加到手机桌面上
+const handleAddShortcut = async () => {
+  checkShortcut()
+    .then((res) => {
+      console.log("+++++++++++++++++++++++checkShortcut_res", res);
+    })
+    .catch((error) => {
+      console.log(error);
+    });
+};
+
+// 侧边栏能力
+const handleNavigateToScene = async () => {
+  navigateToScene()
+    .then((res) => {
+      console.log("navigateToScene then res:", res);
+    })
+    .catch((error) => {
+      console.log(error);
+    });
+};
+
+// IM客服能力
+const handleService = async () => {
+  openCustomerServiceConversation()
+    .then((res) => {
+      console.log("openCustomerServiceConversation then res:", res);
+    })
+    .catch((error) => {
+      console.log(error);
+    });
+};
+
+// 请求推荐流直出订阅
+const handleRequestFeedSubscribe = async () => {
+  requestFeedSubscribe({ scene: 3})
+    .then((res) => {
+      console.log("cp调用【请求推荐流直出订阅】res: ", res);
+    })
+    .catch((error) => {
+      console.log(error);
+    });
+}
+
+// 检查推荐流直出订阅状态
+const handleCheckFeedSubscribeStatus = async () => {
+  checkFeedSubscribeStatus({ scene: 3 })
+    .then((res) => {
+      console.log("checkFeedSubscribeStatus then res:", res);
+    })
+    .catch((error) => {
+      console.log(error);
+    });
+}
+
+
+reportScene()
+
+getFeedLaunchParams().then(res=>{
+  console.log("CP调用启动参数res:", res)
+})
+
+
+// =================== 按钮功能 UI
+
+function newButtonMap(name, callback, x, y, w = 200, h = 30) {
+  return {
+    name: name,
+    callback: callback,
+    x: x,
+    y: y,
+    w: w,
+    h: h,
+  };
+}
+let buttonList = [
+  newButtonMap("登陆", handleLogin, 10, 150),
+  newButtonMap("获取平台登陆用户信息", handleLoginUserInfo, 10, 200),
+  newButtonMap("上报用户角色", handleDataReport, 10, 250),
+  newButtonMap("生成1元订单", handleMakePayment, 10, 300),
+  newButtonMap("主动分享", handleShareAppMessage, 10, 350),
+  newButtonMap("监听分享传参", handleOnShareAppMessage, 10, 400),
+  newButtonMap("添加到桌面", handleAddShortcut, 10, 450),
+  newButtonMap("侧边栏能力", handleNavigateToScene, 10, 500),
+  newButtonMap("IM客服能力", handleService, 10, 550),
+  newButtonMap("请求推荐流直出订阅", handleRequestFeedSubscribe, 10, 600),
+  newButtonMap("检查推荐流直出订阅状态", handleCheckFeedSubscribeStatus, 10, 650),
+  // newButtonMap("监听推荐流直出订阅状态变化", handleOnFeedStatusChange, 10, 700),
+  // newButtonMap("取消监听推荐流直出订阅状态变化", handleOffFeedStatusChange, 10, 750),
+  // newButtonMap("存储推荐流直出订阅数据", handleStoreFeedData, 10, 800),
+  // newButtonMap("获取游戏是否直玩就绪状态数据", handleGetFeedData, 10, 850),
+];
+
+const canvas = tt.createCanvas();
+const ctx = canvas.getContext("2d");
+
+ctx.fillStyle = "#ff0000";
+ctx.font = "14px Arial";
+ctx.strokeStyle = "#ff0000";
+
+
+for (let k in buttonList) {
+  ctx.fillText(buttonList[k].name, 20, buttonList[k].y + 20);
+}
+tt.onTouchEnd(function (a) {
+  let cur = a.changedTouches[0];
+  for (let k in buttonList) {
+    if (
+      cur.clientX >= buttonList[k].x &&
+      cur.clientX <= buttonList[k].x + buttonList[k].w &&
+      cur.clientY >= buttonList[k].y &&
+      cur.clientY <= buttonList[k].y + buttonList[k].h
+    ) {
+      buttonList[k].callback.call(this);
+    }
+  }
+});

+ 3 - 0
game.json

@@ -0,0 +1,3 @@
+{
+    "deviceOrientation": "portrait"
+}

二進制
icon.png


+ 25 - 0
index.js

@@ -0,0 +1,25 @@
+/*
+ * @Author: xiaolin
+ * @Date: 2022-10-17 10:46:59
+ * @LastEditors: xiaolin
+ * @LastEditTime: 2022-10-21 14:49:55
+ * @Description: file content
+ * @FilePath: \image.platform.com\xyxJsSdkV2\index.js
+ */
+
+export { init } from "./src/init.js";
+export { navigateToMiniProgram } from "./utils/index.js";
+export {
+  payConfig,
+  makePayment,
+  triggerSubscribe,
+  requestSubscribeMessage,
+} from "./src/payment.js";
+export { loginUserInfo,login } from "./src/login.js";
+export { shareAppMessage, onShareAppMessage } from "./src/share.js";
+export { addShortcut, checkShortcut } from "./src/shortcut.js";
+export { navigateToScene } from "./src/navigate.js";
+export { dataReport } from "./src/dataReport.js";
+export { requestFeedSubscribe, checkFeedSubscribeStatus, reportScene, getFeedLaunchParams, onFeedStatusChange, offFeedStatusChange } from "./src/feedsubscribe.js";
+export { openCustomerServiceConversation } from "./src/service.js";
+// export { requestFeedSubscribe, checkFeedSubscribeStatus, onFeedStatusChange, offFeedStatusChange, storeFeedData, getFeedData } from "./src/recommendDc.js";

+ 5 - 0
index.ttml

@@ -0,0 +1,5 @@
+<view class="intro">
+    <image style="width: 100%;" mode="widthFix" src="{{src}}"></image>
+
+    <canvas canvas-id="mako" style="width: 200px;height: 200px;"></canvas>
+</view>

+ 683 - 0
lib/md5.js

@@ -0,0 +1,683 @@
+/**
+ * [js-md5]{@link https://github.com/emn178/js-md5}
+ *
+ * @namespace md5
+ * @version 0.7.3
+ * @author Chen, Yi-Cyuan [emn178@gmail.com]
+ * @copyright Chen, Yi-Cyuan 2014-2017
+ * @license MIT
+ */
+(function () {
+    'use strict';
+
+    var ERROR = 'input is invalid type';
+    var WINDOW = typeof window === 'object';
+    var root = WINDOW ? window : {};
+    if (root.JS_MD5_NO_WINDOW) {
+        WINDOW = false;
+    }
+    var WEB_WORKER = !WINDOW && typeof self === 'object';
+    var NODE_JS = !root.JS_MD5_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
+    if (NODE_JS) {
+        root = global;
+    } else if (WEB_WORKER) {
+        root = self;
+    }
+    var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports;
+    var AMD = typeof define === 'function' && define.amd;
+    var ARRAY_BUFFER = !root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
+    var HEX_CHARS = '0123456789abcdef'.split('');
+    var EXTRA = [128, 32768, 8388608, -2147483648];
+    var SHIFT = [0, 8, 16, 24];
+    var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer', 'arrayBuffer', 'base64'];
+    var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
+
+    var blocks = [], buffer8;
+    if (ARRAY_BUFFER) {
+        var buffer = new ArrayBuffer(68);
+        buffer8 = new Uint8Array(buffer);
+        blocks = new Uint32Array(buffer);
+    }
+
+    if (root.JS_MD5_NO_NODE_JS || !Array.isArray) {
+        Array.isArray = function (obj) {
+            return Object.prototype.toString.call(obj) === '[object Array]';
+        };
+    }
+
+    if (ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
+        ArrayBuffer.isView = function (obj) {
+            return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
+        };
+    }
+
+    /**
+     * @method hex
+     * @memberof md5
+     * @description Output hash as hex string
+     * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+     * @returns {String} Hex string
+     * @example
+     * md5.hex('The quick brown fox jumps over the lazy dog');
+     * // equal to
+     * md5('The quick brown fox jumps over the lazy dog');
+     */
+    /**
+     * @method digest
+     * @memberof md5
+     * @description Output hash as bytes array
+     * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+     * @returns {Array} Bytes array
+     * @example
+     * md5.digest('The quick brown fox jumps over the lazy dog');
+     */
+    /**
+     * @method array
+     * @memberof md5
+     * @description Output hash as bytes array
+     * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+     * @returns {Array} Bytes array
+     * @example
+     * md5.array('The quick brown fox jumps over the lazy dog');
+     */
+    /**
+     * @method arrayBuffer
+     * @memberof md5
+     * @description Output hash as ArrayBuffer
+     * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+     * @returns {ArrayBuffer} ArrayBuffer
+     * @example
+     * md5.arrayBuffer('The quick brown fox jumps over the lazy dog');
+     */
+    /**
+     * @method buffer
+     * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
+     * @memberof md5
+     * @description Output hash as ArrayBuffer
+     * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+     * @returns {ArrayBuffer} ArrayBuffer
+     * @example
+     * md5.buffer('The quick brown fox jumps over the lazy dog');
+     */
+    /**
+     * @method base64
+     * @memberof md5
+     * @description Output hash as base64 string
+     * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+     * @returns {String} base64 string
+     * @example
+     * md5.base64('The quick brown fox jumps over the lazy dog');
+     */
+    var createOutputMethod = function (outputType) {
+        return function (message) {
+            return new Md5(true).update(message)[outputType]();
+        };
+    };
+
+    /**
+     * @method create
+     * @memberof md5
+     * @description Create Md5 object
+     * @returns {Md5} Md5 object.
+     * @example
+     * var hash = md5.create();
+     */
+    /**
+     * @method update
+     * @memberof md5
+     * @description Create and update Md5 object
+     * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+     * @returns {Md5} Md5 object.
+     * @example
+     * var hash = md5.update('The quick brown fox jumps over the lazy dog');
+     * // equal to
+     * var hash = md5.create();
+     * hash.update('The quick brown fox jumps over the lazy dog');
+     */
+    var createMethod = function () {
+        var method = createOutputMethod('hex');
+        if (NODE_JS) {
+            method = nodeWrap(method);
+        }
+        method.create = function () {
+            return new Md5();
+        };
+        method.update = function (message) {
+            return method.create().update(message);
+        };
+        for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
+            var type = OUTPUT_TYPES[i];
+            method[type] = createOutputMethod(type);
+        }
+        return method;
+    };
+
+    var nodeWrap = function (method) {
+        var crypto = eval("require('crypto')");
+        var Buffer = eval("require('buffer').Buffer");
+        var nodeMethod = function (message) {
+            if (typeof message === 'string') {
+                return crypto.createHash('md5').update(message, 'utf8').digest('hex');
+            } else {
+                if (message === null || message === undefined) {
+                    throw ERROR;
+                } else if (message.constructor === ArrayBuffer) {
+                    message = new Uint8Array(message);
+                }
+            }
+            if (Array.isArray(message) || ArrayBuffer.isView(message) ||
+                message.constructor === Buffer) {
+                return crypto.createHash('md5').update(new Buffer(message)).digest('hex');
+            } else {
+                return method(message);
+            }
+        };
+        return nodeMethod;
+    };
+
+    /**
+     * Md5 class
+     * @class Md5
+     * @description This is internal class.
+     * @see {@link md5.create}
+     */
+    function Md5(sharedMemory) {
+        if (sharedMemory) {
+            blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
+                blocks[4] = blocks[5] = blocks[6] = blocks[7] =
+                    blocks[8] = blocks[9] = blocks[10] = blocks[11] =
+                        blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
+            this.blocks = blocks;
+            this.buffer8 = buffer8;
+        } else {
+            if (ARRAY_BUFFER) {
+                var buffer = new ArrayBuffer(68);
+                this.buffer8 = new Uint8Array(buffer);
+                this.blocks = new Uint32Array(buffer);
+            } else {
+                this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+            }
+        }
+        this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
+        this.finalized = this.hashed = false;
+        this.first = true;
+    }
+
+    /**
+     * @method update
+     * @memberof Md5
+     * @instance
+     * @description Update hash
+     * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+     * @returns {Md5} Md5 object.
+     * @see {@link md5.update}
+     */
+    Md5.prototype.update = function (message) {
+        if (this.finalized) {
+            return;
+        }
+
+        var notString, type = typeof message;
+        if (type !== 'string') {
+            if (type === 'object') {
+                if (message === null) {
+                    throw ERROR;
+                } else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
+                    message = new Uint8Array(message);
+                } else if (!Array.isArray(message)) {
+                    if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
+                        throw ERROR;
+                    }
+                }
+            } else {
+                throw ERROR;
+            }
+            notString = true;
+        }
+        var code, index = 0, i, length = message.length, blocks = this.blocks;
+        var buffer8 = this.buffer8;
+
+        while (index < length) {
+            if (this.hashed) {
+                this.hashed = false;
+                blocks[0] = blocks[16];
+                blocks[16] = blocks[1] = blocks[2] = blocks[3] =
+                    blocks[4] = blocks[5] = blocks[6] = blocks[7] =
+                        blocks[8] = blocks[9] = blocks[10] = blocks[11] =
+                            blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
+            }
+
+            if (notString) {
+                if (ARRAY_BUFFER) {
+                    for (i = this.start; index < length && i < 64; ++index) {
+                        buffer8[i++] = message[index];
+                    }
+                } else {
+                    for (i = this.start; index < length && i < 64; ++index) {
+                        blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
+                    }
+                }
+            } else {
+                if (ARRAY_BUFFER) {
+                    for (i = this.start; index < length && i < 64; ++index) {
+                        code = message.charCodeAt(index);
+                        if (code < 0x80) {
+                            buffer8[i++] = code;
+                        } else if (code < 0x800) {
+                            buffer8[i++] = 0xc0 | (code >> 6);
+                            buffer8[i++] = 0x80 | (code & 0x3f);
+                        } else if (code < 0xd800 || code >= 0xe000) {
+                            buffer8[i++] = 0xe0 | (code >> 12);
+                            buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
+                            buffer8[i++] = 0x80 | (code & 0x3f);
+                        } else {
+                            code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
+                            buffer8[i++] = 0xf0 | (code >> 18);
+                            buffer8[i++] = 0x80 | ((code >> 12) & 0x3f);
+                            buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
+                            buffer8[i++] = 0x80 | (code & 0x3f);
+                        }
+                    }
+                } else {
+                    for (i = this.start; index < length && i < 64; ++index) {
+                        code = message.charCodeAt(index);
+                        if (code < 0x80) {
+                            blocks[i >> 2] |= code << SHIFT[i++ & 3];
+                        } else if (code < 0x800) {
+                            blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
+                            blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
+                        } else if (code < 0xd800 || code >= 0xe000) {
+                            blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
+                            blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
+                            blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
+                        } else {
+                            code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
+                            blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
+                            blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
+                            blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
+                            blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
+                        }
+                    }
+                }
+            }
+            this.lastByteIndex = i;
+            this.bytes += i - this.start;
+            if (i >= 64) {
+                this.start = i - 64;
+                this.hash();
+                this.hashed = true;
+            } else {
+                this.start = i;
+            }
+        }
+        if (this.bytes > 4294967295) {
+            this.hBytes += this.bytes / 4294967296 << 0;
+            this.bytes = this.bytes % 4294967296;
+        }
+        return this;
+    };
+
+    Md5.prototype.finalize = function () {
+        if (this.finalized) {
+            return;
+        }
+        this.finalized = true;
+        var blocks = this.blocks, i = this.lastByteIndex;
+        blocks[i >> 2] |= EXTRA[i & 3];
+        if (i >= 56) {
+            if (!this.hashed) {
+                this.hash();
+            }
+            blocks[0] = blocks[16];
+            blocks[16] = blocks[1] = blocks[2] = blocks[3] =
+                blocks[4] = blocks[5] = blocks[6] = blocks[7] =
+                    blocks[8] = blocks[9] = blocks[10] = blocks[11] =
+                        blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
+        }
+        blocks[14] = this.bytes << 3;
+        blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
+        this.hash();
+    };
+
+    Md5.prototype.hash = function () {
+        var a, b, c, d, bc, da, blocks = this.blocks;
+
+        if (this.first) {
+            a = blocks[0] - 680876937;
+            a = (a << 7 | a >>> 25) - 271733879 << 0;
+            d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;
+            d = (d << 12 | d >>> 20) + a << 0;
+            c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;
+            c = (c << 17 | c >>> 15) + d << 0;
+            b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;
+            b = (b << 22 | b >>> 10) + c << 0;
+        } else {
+            a = this.h0;
+            b = this.h1;
+            c = this.h2;
+            d = this.h3;
+            a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;
+            a = (a << 7 | a >>> 25) + b << 0;
+            d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;
+            d = (d << 12 | d >>> 20) + a << 0;
+            c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;
+            c = (c << 17 | c >>> 15) + d << 0;
+            b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;
+            b = (b << 22 | b >>> 10) + c << 0;
+        }
+
+        a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;
+        a = (a << 7 | a >>> 25) + b << 0;
+        d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;
+        d = (d << 12 | d >>> 20) + a << 0;
+        c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;
+        c = (c << 17 | c >>> 15) + d << 0;
+        b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;
+        b = (b << 22 | b >>> 10) + c << 0;
+        a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;
+        a = (a << 7 | a >>> 25) + b << 0;
+        d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;
+        d = (d << 12 | d >>> 20) + a << 0;
+        c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;
+        c = (c << 17 | c >>> 15) + d << 0;
+        b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;
+        b = (b << 22 | b >>> 10) + c << 0;
+        a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;
+        a = (a << 7 | a >>> 25) + b << 0;
+        d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;
+        d = (d << 12 | d >>> 20) + a << 0;
+        c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;
+        c = (c << 17 | c >>> 15) + d << 0;
+        b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;
+        b = (b << 22 | b >>> 10) + c << 0;
+        a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;
+        a = (a << 5 | a >>> 27) + b << 0;
+        d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;
+        d = (d << 9 | d >>> 23) + a << 0;
+        c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;
+        c = (c << 14 | c >>> 18) + d << 0;
+        b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;
+        b = (b << 20 | b >>> 12) + c << 0;
+        a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;
+        a = (a << 5 | a >>> 27) + b << 0;
+        d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;
+        d = (d << 9 | d >>> 23) + a << 0;
+        c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;
+        c = (c << 14 | c >>> 18) + d << 0;
+        b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;
+        b = (b << 20 | b >>> 12) + c << 0;
+        a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;
+        a = (a << 5 | a >>> 27) + b << 0;
+        d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;
+        d = (d << 9 | d >>> 23) + a << 0;
+        c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;
+        c = (c << 14 | c >>> 18) + d << 0;
+        b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;
+        b = (b << 20 | b >>> 12) + c << 0;
+        a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;
+        a = (a << 5 | a >>> 27) + b << 0;
+        d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;
+        d = (d << 9 | d >>> 23) + a << 0;
+        c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;
+        c = (c << 14 | c >>> 18) + d << 0;
+        b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;
+        b = (b << 20 | b >>> 12) + c << 0;
+        bc = b ^ c;
+        a += (bc ^ d) + blocks[5] - 378558;
+        a = (a << 4 | a >>> 28) + b << 0;
+        d += (bc ^ a) + blocks[8] - 2022574463;
+        d = (d << 11 | d >>> 21) + a << 0;
+        da = d ^ a;
+        c += (da ^ b) + blocks[11] + 1839030562;
+        c = (c << 16 | c >>> 16) + d << 0;
+        b += (da ^ c) + blocks[14] - 35309556;
+        b = (b << 23 | b >>> 9) + c << 0;
+        bc = b ^ c;
+        a += (bc ^ d) + blocks[1] - 1530992060;
+        a = (a << 4 | a >>> 28) + b << 0;
+        d += (bc ^ a) + blocks[4] + 1272893353;
+        d = (d << 11 | d >>> 21) + a << 0;
+        da = d ^ a;
+        c += (da ^ b) + blocks[7] - 155497632;
+        c = (c << 16 | c >>> 16) + d << 0;
+        b += (da ^ c) + blocks[10] - 1094730640;
+        b = (b << 23 | b >>> 9) + c << 0;
+        bc = b ^ c;
+        a += (bc ^ d) + blocks[13] + 681279174;
+        a = (a << 4 | a >>> 28) + b << 0;
+        d += (bc ^ a) + blocks[0] - 358537222;
+        d = (d << 11 | d >>> 21) + a << 0;
+        da = d ^ a;
+        c += (da ^ b) + blocks[3] - 722521979;
+        c = (c << 16 | c >>> 16) + d << 0;
+        b += (da ^ c) + blocks[6] + 76029189;
+        b = (b << 23 | b >>> 9) + c << 0;
+        bc = b ^ c;
+        a += (bc ^ d) + blocks[9] - 640364487;
+        a = (a << 4 | a >>> 28) + b << 0;
+        d += (bc ^ a) + blocks[12] - 421815835;
+        d = (d << 11 | d >>> 21) + a << 0;
+        da = d ^ a;
+        c += (da ^ b) + blocks[15] + 530742520;
+        c = (c << 16 | c >>> 16) + d << 0;
+        b += (da ^ c) + blocks[2] - 995338651;
+        b = (b << 23 | b >>> 9) + c << 0;
+        a += (c ^ (b | ~d)) + blocks[0] - 198630844;
+        a = (a << 6 | a >>> 26) + b << 0;
+        d += (b ^ (a | ~c)) + blocks[7] + 1126891415;
+        d = (d << 10 | d >>> 22) + a << 0;
+        c += (a ^ (d | ~b)) + blocks[14] - 1416354905;
+        c = (c << 15 | c >>> 17) + d << 0;
+        b += (d ^ (c | ~a)) + blocks[5] - 57434055;
+        b = (b << 21 | b >>> 11) + c << 0;
+        a += (c ^ (b | ~d)) + blocks[12] + 1700485571;
+        a = (a << 6 | a >>> 26) + b << 0;
+        d += (b ^ (a | ~c)) + blocks[3] - 1894986606;
+        d = (d << 10 | d >>> 22) + a << 0;
+        c += (a ^ (d | ~b)) + blocks[10] - 1051523;
+        c = (c << 15 | c >>> 17) + d << 0;
+        b += (d ^ (c | ~a)) + blocks[1] - 2054922799;
+        b = (b << 21 | b >>> 11) + c << 0;
+        a += (c ^ (b | ~d)) + blocks[8] + 1873313359;
+        a = (a << 6 | a >>> 26) + b << 0;
+        d += (b ^ (a | ~c)) + blocks[15] - 30611744;
+        d = (d << 10 | d >>> 22) + a << 0;
+        c += (a ^ (d | ~b)) + blocks[6] - 1560198380;
+        c = (c << 15 | c >>> 17) + d << 0;
+        b += (d ^ (c | ~a)) + blocks[13] + 1309151649;
+        b = (b << 21 | b >>> 11) + c << 0;
+        a += (c ^ (b | ~d)) + blocks[4] - 145523070;
+        a = (a << 6 | a >>> 26) + b << 0;
+        d += (b ^ (a | ~c)) + blocks[11] - 1120210379;
+        d = (d << 10 | d >>> 22) + a << 0;
+        c += (a ^ (d | ~b)) + blocks[2] + 718787259;
+        c = (c << 15 | c >>> 17) + d << 0;
+        b += (d ^ (c | ~a)) + blocks[9] - 343485551;
+        b = (b << 21 | b >>> 11) + c << 0;
+
+        if (this.first) {
+            this.h0 = a + 1732584193 << 0;
+            this.h1 = b - 271733879 << 0;
+            this.h2 = c - 1732584194 << 0;
+            this.h3 = d + 271733878 << 0;
+            this.first = false;
+        } else {
+            this.h0 = this.h0 + a << 0;
+            this.h1 = this.h1 + b << 0;
+            this.h2 = this.h2 + c << 0;
+            this.h3 = this.h3 + d << 0;
+        }
+    };
+
+    /**
+     * @method hex
+     * @memberof Md5
+     * @instance
+     * @description Output hash as hex string
+     * @returns {String} Hex string
+     * @see {@link md5.hex}
+     * @example
+     * hash.hex();
+     */
+    Md5.prototype.hex = function () {
+        this.finalize();
+
+        var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
+
+        return HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
+            HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +
+            HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +
+            HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +
+            HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
+            HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +
+            HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +
+            HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +
+            HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
+            HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +
+            HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +
+            HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +
+            HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
+            HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +
+            HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +
+            HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F];
+    };
+
+    /**
+     * @method toString
+     * @memberof Md5
+     * @instance
+     * @description Output hash as hex string
+     * @returns {String} Hex string
+     * @see {@link md5.hex}
+     * @example
+     * hash.toString();
+     */
+    Md5.prototype.toString = Md5.prototype.hex;
+
+    /**
+     * @method digest
+     * @memberof Md5
+     * @instance
+     * @description Output hash as bytes array
+     * @returns {Array} Bytes array
+     * @see {@link md5.digest}
+     * @example
+     * hash.digest();
+     */
+    Md5.prototype.digest = function () {
+        this.finalize();
+
+        var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
+        return [
+            h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 24) & 0xFF,
+            h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 24) & 0xFF,
+            h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 24) & 0xFF,
+            h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 24) & 0xFF
+        ];
+    };
+
+    /**
+     * @method array
+     * @memberof Md5
+     * @instance
+     * @description Output hash as bytes array
+     * @returns {Array} Bytes array
+     * @see {@link md5.array}
+     * @example
+     * hash.array();
+     */
+    Md5.prototype.array = Md5.prototype.digest;
+
+    /**
+     * @method arrayBuffer
+     * @memberof Md5
+     * @instance
+     * @description Output hash as ArrayBuffer
+     * @returns {ArrayBuffer} ArrayBuffer
+     * @see {@link md5.arrayBuffer}
+     * @example
+     * hash.arrayBuffer();
+     */
+    Md5.prototype.arrayBuffer = function () {
+        this.finalize();
+
+        var buffer = new ArrayBuffer(16);
+        var blocks = new Uint32Array(buffer);
+        blocks[0] = this.h0;
+        blocks[1] = this.h1;
+        blocks[2] = this.h2;
+        blocks[3] = this.h3;
+        return buffer;
+    };
+
+    /**
+     * @method buffer
+     * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
+     * @memberof Md5
+     * @instance
+     * @description Output hash as ArrayBuffer
+     * @returns {ArrayBuffer} ArrayBuffer
+     * @see {@link md5.buffer}
+     * @example
+     * hash.buffer();
+     */
+    Md5.prototype.buffer = Md5.prototype.arrayBuffer;
+
+    /**
+     * @method base64
+     * @memberof Md5
+     * @instance
+     * @description Output hash as base64 string
+     * @returns {String} base64 string
+     * @see {@link md5.base64}
+     * @example
+     * hash.base64();
+     */
+    Md5.prototype.base64 = function () {
+        var v1, v2, v3, base64Str = '', bytes = this.array();
+        for (var i = 0; i < 15;) {
+            v1 = bytes[i++];
+            v2 = bytes[i++];
+            v3 = bytes[i++];
+            base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
+                BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +
+                BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +
+                BASE64_ENCODE_CHAR[v3 & 63];
+        }
+        v1 = bytes[i];
+        base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
+            BASE64_ENCODE_CHAR[(v1 << 4) & 63] +
+            '==';
+        return base64Str;
+    };
+
+    var exports = createMethod();
+
+    if (COMMON_JS) {
+        module.exports = exports;
+    } else {
+        /**
+         * @method md5
+         * @description Md5 hash function, export to global in browsers.
+         * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
+         * @returns {String} md5 hashes
+         * @example
+         * md5(''); // d41d8cd98f00b204e9800998ecf8427e
+         * md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
+         * md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
+         *
+         * // It also supports UTF-8 encoding
+         * md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07
+         *
+         * // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
+         * md5([]); // d41d8cd98f00b204e9800998ecf8427e
+         * md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e
+         */
+        root.md5 = exports;
+        if (AMD) {
+            define(function () {
+                return exports;
+            });
+        }
+    }
+})();

+ 24 - 0
model/DyPayConfigModel.js

@@ -0,0 +1,24 @@
+import base from './base.js'
+
+class DyPayConfigModel extends base {
+  constructor(config) {
+    super()
+    this.storageKey = 'dyPayConfig'
+    this.defaultInfo = {
+      env: 0, //0正式环境,1测试环境
+      zoneId: 0,
+      buyQuantity: '',
+    }
+    this.load(config)
+  }
+
+  static getInstance(config) {
+    if (!DyPayConfigModel.instance) {
+      DyPayConfigModel.instance = new DyPayConfigModel(config)
+      return DyPayConfigModel.instance
+    }
+    return DyPayConfigModel.instance
+  }
+}
+
+export default DyPayConfigModel

+ 23 - 0
model/IpInfoModel.js

@@ -0,0 +1,23 @@
+import base from './base.js'
+
+class IpInfoModel extends base{
+    constructor(config) {
+        super();
+        this.storageKey = 'ip';
+        this.defaultInfo = {
+            'ipv4': '',
+            'ipv6': '',
+        }
+        this.load(config)
+    }
+
+    static getInstance(config) {
+      if (!IpInfoModel.instance) {
+        IpInfoModel.instance = new IpInfoModel(config)
+        return IpInfoModel.instance
+      }
+      return IpInfoModel.instance
+    }
+}
+
+export default IpInfoModel;

+ 27 - 0
model/OrderInfoModel.js

@@ -0,0 +1,27 @@
+import base from './base.js'
+
+class OrderInfoModel extends base{
+    constructor(config) {
+        super();
+        this.storageKey = 'orderInfo';
+        this.defaultInfo = {
+            'order_no': '',
+            'amt':0, //金额
+            'buy_quantity':'',
+            'pay_type' : '',
+            'pop_content' : '',
+            'pop_title' : '',
+        }
+        this.load(config)
+    }
+
+    static getInstance(config) {
+      if (!OrderInfoModel.instance) {
+        OrderInfoModel.instance = new OrderInfoModel(config)
+        return OrderInfoModel.instance
+      }
+      return OrderInfoModel.instance
+    }
+}
+
+export default OrderInfoModel;

+ 36 - 0
model/SdkLoginReUserInfoModel.js

@@ -0,0 +1,36 @@
+import base from "./base.js";
+import gameConfig from "../config/game.js";
+
+class SdkLoginReUserInfoModel extends base {
+  constructor(config) {
+    super();
+    this.storageKey = "sdkLoginReUserInfo";
+    this.defaultInfo = {
+      access_token: "",
+      head_img_url: "",
+      nickname: "",
+      username: "",
+      fcm: 0,
+      uid: 0,
+      openid: "",
+      cp_appid: 0, //主包appid,研发校验登录态会用
+      appid: 0, //子包appid,根据platform判断
+      agent_id: 1000,
+      site_id: 1000,
+      mobile: "", //绑定手机号
+      pop_content: "", //弹窗内容
+      pop_title: "", //弹窗标题
+    };
+    this.load(config);
+  }
+
+  static getInstance(config) {
+    if (!SdkLoginReUserInfoModel.instance) {
+      SdkLoginReUserInfoModel.instance = new SdkLoginReUserInfoModel(config);
+      return SdkLoginReUserInfoModel.instance;
+    }
+    return SdkLoginReUserInfoModel.instance;
+  }
+}
+
+export default SdkLoginReUserInfoModel;

+ 25 - 0
model/ShareConfigModel.js

@@ -0,0 +1,25 @@
+import base from './base.js'
+
+class ShareConfigModel extends base {
+  constructor(config) {
+    super()
+    this.storageKey = 'shareConfig'
+    this.defaultInfo = {
+      title: '',
+      imageUrl: '',
+      query: '',
+      share_ext : '', //服务端需要拼接的参数
+    }
+    this.load(config)
+  }
+
+  static getInstance(config) {
+    if (!ShareConfigModel.instance) {
+      ShareConfigModel.instance = new ShareConfigModel(config)
+      return ShareConfigModel.instance
+    }
+    return ShareConfigModel.instance
+  }
+}
+
+export default ShareConfigModel

+ 23 - 0
model/SubscribeConfigModel.js

@@ -0,0 +1,23 @@
+import base from './base.js'
+
+class SubscribeConfig extends base {
+  constructor(config) {
+    super()
+    this.storageKey = 'subscribeConfig'
+    this.defaultInfo = {
+      pay: [],
+      login:[],
+    }
+    this.load(config)
+  }
+
+  static getInstance(config) {
+    if (!SubscribeConfig.instance) {
+      SubscribeConfig.instance = new SubscribeConfig(config)
+      return SubscribeConfig.instance
+    }
+    return SubscribeConfig.instance
+  }
+}
+
+export default SubscribeConfig

+ 25 - 0
model/XcxPayConfigModel.js

@@ -0,0 +1,25 @@
+import base from './base.js'
+
+class XcxPayConfig extends base {
+  constructor(config) {
+    super()
+    this.storageKey = 'xcxPayConfig'
+    this.defaultInfo = {
+      xcxAppid: '',
+      path:'',
+      extraData:{},//需要传递给目标小程序的数据
+      envVersion:'',
+    }
+    this.load(config)
+  }
+
+  static getInstance(config) {
+    if (!XcxPayConfig.instance) {
+      XcxPayConfig.instance = new XcxPayConfig(config)
+      return XcxPayConfig.instance
+    }
+    return XcxPayConfig.instance
+  }
+}
+
+export default XcxPayConfig

+ 102 - 0
model/base.js

@@ -0,0 +1,102 @@
+import {
+  getStorage,
+  setStorage,
+  removeStorage
+} from '../utils/index.js'
+
+class base {
+  constructor() {
+    this.storageKey = '';
+    this.storageInfo = {};
+    this.defaultInfo = {};
+  }
+
+  /**
+   * 装载属性,只会压入配置过的属性
+   * @param {*} obj 
+   */
+  load(obj) {
+    let info = {};
+    //合并,后覆盖前,所以必定有默认key
+    Object.assign(info, this.defaultInfo, obj)
+    for (let key in this.defaultInfo) {
+      if (typeof (info[key]) !== 'undefined') {
+        this.storageInfo[key] = info[key];
+      }
+    }
+  }
+
+  /**
+   * 追加
+   * @param {*} obj 
+   */
+  addInfo(obj) {
+    let info = {};
+    Object.assign(info, this.defaultInfo, this.storageInfo, obj)
+    for (let key in this.defaultInfo) {
+      if (typeof (info[key]) !== 'undefined') {
+        this.storageInfo[key] = info[key];
+      }
+    }
+  }
+
+  //获取类里面的属性
+  getInfo(key) {
+    if (key && (key in this.storageInfo)) {
+      return this.storageInfo[key]
+    } else {
+      return this.storageInfo
+    }
+  }
+
+  //保存到缓存,传进来>默认值
+  setStorage(obj) {
+    if (obj) {
+      this.load(obj);
+    }
+    if (!this.storageKey) {
+      return false;
+    }
+    if (Object.getOwnPropertyNames(this.storageInfo).length === 0) {
+      return false;
+    }
+    setStorage(this.storageKey, this.storageInfo);
+  }
+
+  //追加到缓存,传进来>缓存>默认值
+  addStorage(obj) {
+    if (!this.storageKey) {
+      return false;
+    }
+    let info = {};
+    let curStorageInfo = getStorage(this.storageKey);
+    Object.assign(info, curStorageInfo, obj)
+    this.load(obj);
+    setStorage(this.storageKey, this.storageInfo);
+  }
+
+  //获取缓存的属性
+  getStorage(key) {
+    if (!this.storageKey) {
+      return false;
+    }
+    let info = getStorage(this.storageKey);
+    Object.assign(this.storageInfo, info)
+    if (key && (key in this.storageInfo)) {
+      return this.storageInfo[key]
+    } else {
+      return this.storageInfo
+    }
+  }
+
+  //销毁缓存的属性
+  destroyStorage() {
+    if (!this.storageKey) {
+      return false;
+    }
+    removeStorage(this.storageKey)
+    this.load();
+  }
+}
+
+export default base;

+ 2055 - 0
package-lock.json

@@ -0,0 +1,2055 @@
+{
+  "name": "dyxyx-ruiyu",
+  "version": "1.0.1",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "dyxyx-ruiyu",
+      "version": "1.0.1",
+      "license": "ISC",
+      "dependencies": {
+        "webpack": "^5.74.0",
+        "webpack-cli": "^4.10.0"
+      }
+    },
+    "node_modules/@discoveryjs/json-ext": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+      "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+      "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+      "dependencies": {
+        "@jridgewell/set-array": "^1.0.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/source-map": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
+      "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.4.14",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.17",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+      "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "3.1.0",
+        "@jridgewell/sourcemap-codec": "1.4.14"
+      }
+    },
+    "node_modules/@types/eslint": {
+      "version": "8.4.7",
+      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.7.tgz",
+      "integrity": "sha512-ehM7cCt2RSFs42mb+lcmhFT9ouIlV92PuaeRGn8N8c98oMjG4Z5pJHA9b1QiCcuqnbPSHcyfiD3mlhqMaHsQIw==",
+      "dependencies": {
+        "@types/estree": "*",
+        "@types/json-schema": "*"
+      }
+    },
+    "node_modules/@types/eslint-scope": {
+      "version": "3.7.4",
+      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz",
+      "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==",
+      "dependencies": {
+        "@types/eslint": "*",
+        "@types/estree": "*"
+      }
+    },
+    "node_modules/@types/estree": {
+      "version": "0.0.51",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
+      "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ=="
+    },
+    "node_modules/@types/json-schema": {
+      "version": "7.0.11",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+      "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ=="
+    },
+    "node_modules/@types/node": {
+      "version": "18.11.3",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.3.tgz",
+      "integrity": "sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A=="
+    },
+    "node_modules/@webassemblyjs/ast": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
+      "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
+      "dependencies": {
+        "@webassemblyjs/helper-numbers": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
+      "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
+    },
+    "node_modules/@webassemblyjs/helper-api-error": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
+      "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
+    },
+    "node_modules/@webassemblyjs/helper-buffer": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
+      "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
+    },
+    "node_modules/@webassemblyjs/helper-numbers": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
+      "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
+      "dependencies": {
+        "@webassemblyjs/floating-point-hex-parser": "1.11.1",
+        "@webassemblyjs/helper-api-error": "1.11.1",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
+      "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
+    },
+    "node_modules/@webassemblyjs/helper-wasm-section": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
+      "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/ieee754": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
+      "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
+      "dependencies": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "node_modules/@webassemblyjs/leb128": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
+      "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
+      "dependencies": {
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webassemblyjs/utf8": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
+      "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
+    },
+    "node_modules/@webassemblyjs/wasm-edit": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
+      "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/helper-wasm-section": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1",
+        "@webassemblyjs/wasm-opt": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1",
+        "@webassemblyjs/wast-printer": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-gen": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
+      "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/ieee754": "1.11.1",
+        "@webassemblyjs/leb128": "1.11.1",
+        "@webassemblyjs/utf8": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-opt": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
+      "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-parser": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
+      "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-api-error": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/ieee754": "1.11.1",
+        "@webassemblyjs/leb128": "1.11.1",
+        "@webassemblyjs/utf8": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/wast-printer": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
+      "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webpack-cli/configtest": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
+      "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
+      "peerDependencies": {
+        "webpack": "4.x.x || 5.x.x",
+        "webpack-cli": "4.x.x"
+      }
+    },
+    "node_modules/@webpack-cli/info": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz",
+      "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==",
+      "dependencies": {
+        "envinfo": "^7.7.3"
+      },
+      "peerDependencies": {
+        "webpack-cli": "4.x.x"
+      }
+    },
+    "node_modules/@webpack-cli/serve": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
+      "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
+      "peerDependencies": {
+        "webpack-cli": "4.x.x"
+      },
+      "peerDependenciesMeta": {
+        "webpack-dev-server": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+    },
+    "node_modules/@xtuc/long": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+    },
+    "node_modules/acorn": {
+      "version": "8.8.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
+      "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-import-assertions": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
+      "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
+      "peerDependencies": {
+        "acorn": "^8"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/ajv-keywords": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "peerDependencies": {
+        "ajv": "^6.9.1"
+      }
+    },
+    "node_modules/browserslist": {
+      "version": "4.21.4",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
+      "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        }
+      ],
+      "dependencies": {
+        "caniuse-lite": "^1.0.30001400",
+        "electron-to-chromium": "^1.4.251",
+        "node-releases": "^2.0.6",
+        "update-browserslist-db": "^1.0.9"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      }
+    },
+    "node_modules/buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001423",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001423.tgz",
+      "integrity": "sha512-09iwWGOlifvE1XuHokFMP7eR38a0JnajoyL3/i87c8ZjRWRrdKo1fqjNfugfBD0UDBIOz0U+jtNhJ0EPm1VleQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        }
+      ]
+    },
+    "node_modules/chrome-trace-event": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+      "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+      "engines": {
+        "node": ">=6.0"
+      }
+    },
+    "node_modules/clone-deep": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+      "dependencies": {
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.2",
+        "shallow-clone": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/colorette": {
+      "version": "2.0.19",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
+      "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ=="
+    },
+    "node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/electron-to-chromium": {
+      "version": "1.4.284",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+      "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA=="
+    },
+    "node_modules/enhanced-resolve": {
+      "version": "5.10.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
+      "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==",
+      "dependencies": {
+        "graceful-fs": "^4.2.4",
+        "tapable": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/envinfo": {
+      "version": "7.8.1",
+      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
+      "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
+      "bin": {
+        "envinfo": "dist/cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/es-module-lexer": {
+      "version": "0.9.3",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+      "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
+    },
+    "node_modules/escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/eslint-scope": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esrecurse/node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "engines": {
+        "node": ">=0.8.x"
+      }
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+    },
+    "node_modules/fastest-levenshtein": {
+      "version": "1.0.16",
+      "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+      "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+      "engines": {
+        "node": ">= 4.9.1"
+      }
+    },
+    "node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "dependencies": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+    },
+    "node_modules/glob-to-regexp": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.10",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+      "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
+    },
+    "node_modules/has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dependencies": {
+        "function-bind": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/import-local": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+      "dependencies": {
+        "pkg-dir": "^4.2.0",
+        "resolve-cwd": "^3.0.0"
+      },
+      "bin": {
+        "import-local-fixture": "fixtures/cli.js"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/interpret": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+      "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+      "dependencies": {
+        "has": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dependencies": {
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+    },
+    "node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/jest-worker": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+      "dependencies": {
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^8.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      }
+    },
+    "node_modules/json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+    },
+    "node_modules/kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/loader-runner": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+      "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+      "engines": {
+        "node": ">=6.11.5"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "dependencies": {
+        "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+    },
+    "node_modules/node-releases": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+      "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg=="
+    },
+    "node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+    },
+    "node_modules/picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "node_modules/pkg-dir": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+      "dependencies": {
+        "find-up": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dependencies": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/rechoir": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
+      "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
+      "dependencies": {
+        "resolve": "^1.9.0"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/resolve": {
+      "version": "1.22.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+      "dependencies": {
+        "is-core-module": "^2.9.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/resolve-cwd": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+      "dependencies": {
+        "resolve-from": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/schema-utils": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+      "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/serialize-javascript": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+      "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+      "dependencies": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "node_modules/shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+      "dependencies": {
+        "kind-of": "^6.0.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+      "dependencies": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/tapable": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/terser": {
+      "version": "5.15.1",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz",
+      "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==",
+      "dependencies": {
+        "@jridgewell/source-map": "^0.3.2",
+        "acorn": "^8.5.0",
+        "commander": "^2.20.0",
+        "source-map-support": "~0.5.20"
+      },
+      "bin": {
+        "terser": "bin/terser"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/terser-webpack-plugin": {
+      "version": "5.3.6",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz",
+      "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==",
+      "dependencies": {
+        "@jridgewell/trace-mapping": "^0.3.14",
+        "jest-worker": "^27.4.5",
+        "schema-utils": "^3.1.1",
+        "serialize-javascript": "^6.0.0",
+        "terser": "^5.14.1"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "^5.1.0"
+      },
+      "peerDependenciesMeta": {
+        "@swc/core": {
+          "optional": true
+        },
+        "esbuild": {
+          "optional": true
+        },
+        "uglify-js": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/update-browserslist-db": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+      "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        }
+      ],
+      "dependencies": {
+        "escalade": "^3.1.1",
+        "picocolors": "^1.0.0"
+      },
+      "bin": {
+        "browserslist-lint": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/watchpack": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+      "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+      "dependencies": {
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.1.2"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/webpack": {
+      "version": "5.74.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz",
+      "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==",
+      "dependencies": {
+        "@types/eslint-scope": "^3.7.3",
+        "@types/estree": "^0.0.51",
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/wasm-edit": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1",
+        "acorn": "^8.7.1",
+        "acorn-import-assertions": "^1.7.6",
+        "browserslist": "^4.14.5",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^5.10.0",
+        "es-module-lexer": "^0.9.0",
+        "eslint-scope": "5.1.1",
+        "events": "^3.2.0",
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.2.9",
+        "json-parse-even-better-errors": "^2.3.1",
+        "loader-runner": "^4.2.0",
+        "mime-types": "^2.1.27",
+        "neo-async": "^2.6.2",
+        "schema-utils": "^3.1.0",
+        "tapable": "^2.1.1",
+        "terser-webpack-plugin": "^5.1.3",
+        "watchpack": "^2.4.0",
+        "webpack-sources": "^3.2.3"
+      },
+      "bin": {
+        "webpack": "bin/webpack.js"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependenciesMeta": {
+        "webpack-cli": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/webpack-cli": {
+      "version": "4.10.0",
+      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz",
+      "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==",
+      "dependencies": {
+        "@discoveryjs/json-ext": "^0.5.0",
+        "@webpack-cli/configtest": "^1.2.0",
+        "@webpack-cli/info": "^1.5.0",
+        "@webpack-cli/serve": "^1.7.0",
+        "colorette": "^2.0.14",
+        "commander": "^7.0.0",
+        "cross-spawn": "^7.0.3",
+        "fastest-levenshtein": "^1.0.12",
+        "import-local": "^3.0.2",
+        "interpret": "^2.2.0",
+        "rechoir": "^0.7.0",
+        "webpack-merge": "^5.7.3"
+      },
+      "bin": {
+        "webpack-cli": "bin/cli.js"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "4.x.x || 5.x.x"
+      },
+      "peerDependenciesMeta": {
+        "@webpack-cli/generators": {
+          "optional": true
+        },
+        "@webpack-cli/migrate": {
+          "optional": true
+        },
+        "webpack-bundle-analyzer": {
+          "optional": true
+        },
+        "webpack-dev-server": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/webpack-cli/node_modules/commander": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/webpack-merge": {
+      "version": "5.8.0",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
+      "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
+      "dependencies": {
+        "clone-deep": "^4.0.1",
+        "wildcard": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/webpack-sources": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+      "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/wildcard": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
+      "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw=="
+    }
+  },
+  "dependencies": {
+    "@discoveryjs/json-ext": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+      "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw=="
+    },
+    "@jridgewell/gen-mapping": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+      "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+      "requires": {
+        "@jridgewell/set-array": "^1.0.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      }
+    },
+    "@jridgewell/resolve-uri": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
+    },
+    "@jridgewell/set-array": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="
+    },
+    "@jridgewell/source-map": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
+      "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+      "requires": {
+        "@jridgewell/gen-mapping": "^0.3.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      }
+    },
+    "@jridgewell/sourcemap-codec": {
+      "version": "1.4.14",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
+    },
+    "@jridgewell/trace-mapping": {
+      "version": "0.3.17",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+      "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+      "requires": {
+        "@jridgewell/resolve-uri": "3.1.0",
+        "@jridgewell/sourcemap-codec": "1.4.14"
+      }
+    },
+    "@types/eslint": {
+      "version": "8.4.7",
+      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.7.tgz",
+      "integrity": "sha512-ehM7cCt2RSFs42mb+lcmhFT9ouIlV92PuaeRGn8N8c98oMjG4Z5pJHA9b1QiCcuqnbPSHcyfiD3mlhqMaHsQIw==",
+      "requires": {
+        "@types/estree": "*",
+        "@types/json-schema": "*"
+      }
+    },
+    "@types/eslint-scope": {
+      "version": "3.7.4",
+      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz",
+      "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==",
+      "requires": {
+        "@types/eslint": "*",
+        "@types/estree": "*"
+      }
+    },
+    "@types/estree": {
+      "version": "0.0.51",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
+      "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ=="
+    },
+    "@types/json-schema": {
+      "version": "7.0.11",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+      "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ=="
+    },
+    "@types/node": {
+      "version": "18.11.3",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.3.tgz",
+      "integrity": "sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A=="
+    },
+    "@webassemblyjs/ast": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
+      "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
+      "requires": {
+        "@webassemblyjs/helper-numbers": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
+      }
+    },
+    "@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
+      "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
+    },
+    "@webassemblyjs/helper-api-error": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
+      "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
+    },
+    "@webassemblyjs/helper-buffer": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
+      "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
+    },
+    "@webassemblyjs/helper-numbers": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
+      "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
+      "requires": {
+        "@webassemblyjs/floating-point-hex-parser": "1.11.1",
+        "@webassemblyjs/helper-api-error": "1.11.1",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
+      "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
+    },
+    "@webassemblyjs/helper-wasm-section": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
+      "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
+      "requires": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1"
+      }
+    },
+    "@webassemblyjs/ieee754": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
+      "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
+      "requires": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "@webassemblyjs/leb128": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
+      "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
+      "requires": {
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@webassemblyjs/utf8": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
+      "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
+    },
+    "@webassemblyjs/wasm-edit": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
+      "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
+      "requires": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/helper-wasm-section": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1",
+        "@webassemblyjs/wasm-opt": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1",
+        "@webassemblyjs/wast-printer": "1.11.1"
+      }
+    },
+    "@webassemblyjs/wasm-gen": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
+      "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
+      "requires": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/ieee754": "1.11.1",
+        "@webassemblyjs/leb128": "1.11.1",
+        "@webassemblyjs/utf8": "1.11.1"
+      }
+    },
+    "@webassemblyjs/wasm-opt": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
+      "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
+      "requires": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1"
+      }
+    },
+    "@webassemblyjs/wasm-parser": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
+      "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
+      "requires": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-api-error": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/ieee754": "1.11.1",
+        "@webassemblyjs/leb128": "1.11.1",
+        "@webassemblyjs/utf8": "1.11.1"
+      }
+    },
+    "@webassemblyjs/wast-printer": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
+      "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
+      "requires": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@webpack-cli/configtest": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
+      "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
+      "requires": {}
+    },
+    "@webpack-cli/info": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz",
+      "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==",
+      "requires": {
+        "envinfo": "^7.7.3"
+      }
+    },
+    "@webpack-cli/serve": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
+      "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
+      "requires": {}
+    },
+    "@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+    },
+    "@xtuc/long": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+    },
+    "acorn": {
+      "version": "8.8.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
+      "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w=="
+    },
+    "acorn-import-assertions": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
+      "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
+      "requires": {}
+    },
+    "ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "requires": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "ajv-keywords": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "requires": {}
+    },
+    "browserslist": {
+      "version": "4.21.4",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
+      "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+      "requires": {
+        "caniuse-lite": "^1.0.30001400",
+        "electron-to-chromium": "^1.4.251",
+        "node-releases": "^2.0.6",
+        "update-browserslist-db": "^1.0.9"
+      }
+    },
+    "buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+    },
+    "caniuse-lite": {
+      "version": "1.0.30001423",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001423.tgz",
+      "integrity": "sha512-09iwWGOlifvE1XuHokFMP7eR38a0JnajoyL3/i87c8ZjRWRrdKo1fqjNfugfBD0UDBIOz0U+jtNhJ0EPm1VleQ=="
+    },
+    "chrome-trace-event": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+      "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg=="
+    },
+    "clone-deep": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+      "requires": {
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.2",
+        "shallow-clone": "^3.0.0"
+      }
+    },
+    "colorette": {
+      "version": "2.0.19",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
+      "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ=="
+    },
+    "commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+    },
+    "cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "requires": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      }
+    },
+    "electron-to-chromium": {
+      "version": "1.4.284",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+      "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA=="
+    },
+    "enhanced-resolve": {
+      "version": "5.10.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
+      "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==",
+      "requires": {
+        "graceful-fs": "^4.2.4",
+        "tapable": "^2.2.0"
+      }
+    },
+    "envinfo": {
+      "version": "7.8.1",
+      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
+      "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw=="
+    },
+    "es-module-lexer": {
+      "version": "0.9.3",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+      "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
+    },
+    "escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+    },
+    "eslint-scope": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "requires": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "requires": {
+        "estraverse": "^5.2.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+        }
+      }
+    },
+    "estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+    },
+    "events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
+    },
+    "fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+    },
+    "fastest-levenshtein": {
+      "version": "1.0.16",
+      "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+      "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="
+    },
+    "find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "requires": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      }
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+    },
+    "glob-to-regexp": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+    },
+    "graceful-fs": {
+      "version": "4.2.10",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+      "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+    },
+    "import-local": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+      "requires": {
+        "pkg-dir": "^4.2.0",
+        "resolve-cwd": "^3.0.0"
+      }
+    },
+    "interpret": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+      "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw=="
+    },
+    "is-core-module": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="
+    },
+    "jest-worker": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+      "requires": {
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^8.0.0"
+      }
+    },
+    "json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+    },
+    "kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
+    },
+    "loader-runner": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+      "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg=="
+    },
+    "locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "requires": {
+        "p-locate": "^4.1.0"
+      }
+    },
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+    },
+    "mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+    },
+    "mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "requires": {
+        "mime-db": "1.52.0"
+      }
+    },
+    "neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+    },
+    "node-releases": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+      "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg=="
+    },
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "requires": {
+        "p-limit": "^2.2.0"
+      }
+    },
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+    },
+    "path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+    },
+    "path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+    },
+    "path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+    },
+    "picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "pkg-dir": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+      "requires": {
+        "find-up": "^4.0.0"
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+    },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "rechoir": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
+      "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
+      "requires": {
+        "resolve": "^1.9.0"
+      }
+    },
+    "resolve": {
+      "version": "1.22.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+      "requires": {
+        "is-core-module": "^2.9.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      }
+    },
+    "resolve-cwd": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+      "requires": {
+        "resolve-from": "^5.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
+    },
+    "safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+    },
+    "schema-utils": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+      "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+      "requires": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      }
+    },
+    "serialize-javascript": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+      "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+      "requires": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+      "requires": {
+        "kind-of": "^6.0.2"
+      }
+    },
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "requires": {
+        "shebang-regex": "^3.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+    },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+    },
+    "source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "supports-color": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "requires": {
+        "has-flag": "^4.0.0"
+      }
+    },
+    "supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
+    },
+    "tapable": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="
+    },
+    "terser": {
+      "version": "5.15.1",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz",
+      "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==",
+      "requires": {
+        "@jridgewell/source-map": "^0.3.2",
+        "acorn": "^8.5.0",
+        "commander": "^2.20.0",
+        "source-map-support": "~0.5.20"
+      }
+    },
+    "terser-webpack-plugin": {
+      "version": "5.3.6",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz",
+      "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==",
+      "requires": {
+        "@jridgewell/trace-mapping": "^0.3.14",
+        "jest-worker": "^27.4.5",
+        "schema-utils": "^3.1.1",
+        "serialize-javascript": "^6.0.0",
+        "terser": "^5.14.1"
+      }
+    },
+    "update-browserslist-db": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+      "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+      "requires": {
+        "escalade": "^3.1.1",
+        "picocolors": "^1.0.0"
+      }
+    },
+    "uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "watchpack": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+      "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+      "requires": {
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.1.2"
+      }
+    },
+    "webpack": {
+      "version": "5.74.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz",
+      "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==",
+      "requires": {
+        "@types/eslint-scope": "^3.7.3",
+        "@types/estree": "^0.0.51",
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/wasm-edit": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1",
+        "acorn": "^8.7.1",
+        "acorn-import-assertions": "^1.7.6",
+        "browserslist": "^4.14.5",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^5.10.0",
+        "es-module-lexer": "^0.9.0",
+        "eslint-scope": "5.1.1",
+        "events": "^3.2.0",
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.2.9",
+        "json-parse-even-better-errors": "^2.3.1",
+        "loader-runner": "^4.2.0",
+        "mime-types": "^2.1.27",
+        "neo-async": "^2.6.2",
+        "schema-utils": "^3.1.0",
+        "tapable": "^2.1.1",
+        "terser-webpack-plugin": "^5.1.3",
+        "watchpack": "^2.4.0",
+        "webpack-sources": "^3.2.3"
+      }
+    },
+    "webpack-cli": {
+      "version": "4.10.0",
+      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz",
+      "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==",
+      "requires": {
+        "@discoveryjs/json-ext": "^0.5.0",
+        "@webpack-cli/configtest": "^1.2.0",
+        "@webpack-cli/info": "^1.5.0",
+        "@webpack-cli/serve": "^1.7.0",
+        "colorette": "^2.0.14",
+        "commander": "^7.0.0",
+        "cross-spawn": "^7.0.3",
+        "fastest-levenshtein": "^1.0.12",
+        "import-local": "^3.0.2",
+        "interpret": "^2.2.0",
+        "rechoir": "^0.7.0",
+        "webpack-merge": "^5.7.3"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+          "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="
+        }
+      }
+    },
+    "webpack-merge": {
+      "version": "5.8.0",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
+      "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
+      "requires": {
+        "clone-deep": "^4.0.1",
+        "wildcard": "^2.0.0"
+      }
+    },
+    "webpack-sources": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+      "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w=="
+    },
+    "which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "wildcard": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
+      "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw=="
+    }
+  }
+}

+ 21 - 0
package.json

@@ -0,0 +1,21 @@
+{
+  "name": "dyxyx-ruiyu",
+  "version": "1.0.2",
+  "description": "ry xyx sdk",
+  "scripts": {
+    "build": "webpack --mode production --progress"
+  },
+  "author": "",
+  "license": "ISC",
+  "directories": {
+    "lib": "lib"
+  },
+  "dependencies": {
+    "webpack": "^5.74.0",
+    "webpack-cli": "^4.10.0"
+  },
+  "volta": {
+    "node": "16.17.0",
+    "npm": "8.15.0"
+  }
+}

+ 21 - 0
project.config.json

@@ -0,0 +1,21 @@
+{
+    "setting": {
+        "urlCheck": false,
+        "es6": true,
+        "postcss": true,
+        "minified": true,
+        "newFeature": true,
+        "autoCompile": true,
+        "compileHotReLoad": true,
+        "nativeCompile": true
+    },
+    "appid": "tta0dbd6663eb8fad902",
+    "projectname": "暮影战神",
+    "douyinProjectType": "native",
+    "condition": {
+        "game": {
+            "current": -1,
+            "list": []
+        }
+    }
+}

+ 26 - 0
project.private.config.json

@@ -0,0 +1,26 @@
+{
+  "setting": {
+    "urlCheck": false
+  },
+  "condition": {
+    "game": {
+      "list": [
+        {
+          "pathName": "",
+          "name": "ceshi",
+          "query": "agent_id=1000&site_id=1000&gdt_vid=asdasd&weixinadinfo=asdasd",
+          "scene": null
+        },
+        {
+          "pathName": "",
+          "name": "dev",
+          "query": "xiaolin=123456789&xl=12345678",
+          "scene": 1011
+        }
+      ]
+    }
+  },
+  "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
+  "libVersion": "2.19.6",
+  "projectname": "wxxyx-sdk"
+}

+ 84 - 0
src/dataReport.js

@@ -0,0 +1,84 @@
+/*
+ * @Author: xiaolin
+ * @Date: 2022-10-21 12:21:57
+ * @LastEditors: xiaolin
+ * @LastEditTime: 2022-10-21 15:40:56
+ * @Description: file content
+ * @FilePath: \image.platform.com\xyxJsSdkV2\src\dataReport.js
+ */
+import request from '../utils/request.js'
+import {getSystem} from '../utils/index.js'
+import gameConfig from '../config/game.js'
+import SdkLoginReUserInfoModel from '../model/SdkLoginReUserInfoModel.js'
+
+
+/**
+ * @description:数据上报 
+ * @param {
+      'data_type': 3,
+      'server_id': 1,
+      'server_name': '测试1服',
+      'role_id': '10000111',
+      'role_name': '小威',
+      'role_level': 1,
+      'role_currency': 1000,
+    } data
+ * @return {*}
+ */
+export const dataReport = async (data) => {
+  console.log("dataReport入参"+JSON.stringify(data));
+  try {
+    // 对必须参数进行验证
+    const needValus = ['data_type', 'server_id', 'server_name', 'role_id', 'role_name', 'role_level', 'role_currency']
+    needValus.forEach((value) => {
+      if (data[value] === undefined) {
+        return Promise.reject({
+          msg: `invalid ${value}`
+        })
+      }
+    });
+    // 获取系统信息
+    const systemInfo = await getSystem();
+    // 定义数据上报公共参数
+    let userInfo = SdkLoginReUserInfoModel.getInstance().getInfo();
+    const reportData = {
+      mtype: gameConfig.MTYPE,
+      userid: userInfo.uid,
+      dataType: data.data_type,
+      serverID: data.server_id,
+      serverName: data.server_name,
+      roleID: data.role_id,
+      roleName: data.role_name,
+      roleLevel: data.role_level,
+      role_create_time: (typeof (data.role_create_time) === 'undefined') ? '' : data.role_create_time,
+      event_type: (typeof (data.event_type) === 'undefined') ? '' : data.event_type,
+      additional_parameters: (typeof (data.additional_parameters) === 'undefined') ? '' : data.additional_parameters,
+      moneyNum: (typeof (data.role_currency) === 'undefined') ? '' : data.role_currency,
+      time: (typeof (data.time) === 'undefined') ? '' : data.time,
+    };
+    // 定义额外上报数据及上报数据地址
+    let extData = {};
+    let reportUrl = '';
+    // 根据不同平台进行不同上报处理
+    reportData.appid = userInfo.appid;
+    switch (systemInfo.platform) {
+      case 'ios':
+        extData.os = 'ios'
+        reportUrl = 'IOS_REPORT';
+        break;
+      case 'android':
+      case 'devtools':
+      default:
+        extData.os = 'android'
+        reportUrl = 'ANDROID_REPORT';
+        break;
+    }
+    // 合并请求参数并调用接口上报数据
+    Object.assign(reportData, extData);
+    // 执行数据上报
+    const res = await request.api(reportUrl, reportData, 'post');
+    return Promise.resolve(res);
+  } catch (error) {
+    return Promise.reject(error);
+  }
+}

+ 206 - 0
src/feedsubscribe.js

@@ -0,0 +1,206 @@
+import request from "../utils/request.js";
+
+/**
+ * 向用户请求授权,允许游戏在满足一定的条件后出现在 Feed 流中
+ * @param options {{scene: int, allScene: boolean, type: string}}
+ * @returns {Promise<void>}
+ */
+export const requestFeedSubscribe = (options = {}) => {
+  if (options['scene'] === undefined && options['allScene'] === undefined) {
+    return Promise.reject(`缺少参数scene或allScene`)
+  }
+  const defaultOptions = {
+    type: 'play'
+  }
+  const mergeOptions = Object.assign({}, defaultOptions, options)
+
+  return new Promise(async (resolve, reject) => {
+    // 构造参数
+    const subscribeOptions = {
+      success(res) {
+        if(res.errMsg==='requestFeedSubscribe:ok'){
+          resolve(res)
+        }
+      },
+      fail(err) {
+        console.log("requestFeedSubscribe fail:", err.errMsg)
+        reject(err.errMsg)
+      },
+    }
+    let contentIDs = []
+    if (mergeOptions['allScene'] === true) {
+      delete mergeOptions['scene']
+    } else {
+      // 获取配置
+      const params = Object.assign({}, mergeOptions, {
+        do: "getFeedSubscribeConfig"
+      })
+      contentIDs = await request.api("COMMON", params);
+      if (contentIDs.length) {
+        subscribeOptions.contentIDs = contentIDs
+      } else {
+        reject('response contentIDs is empty')
+        return
+      }
+    }
+    Object.assign(subscribeOptions, mergeOptions)
+
+    console.log("cp调用【请求推荐流直出订阅】参数:", subscribeOptions)
+
+    tt.requestFeedSubscribe(subscribeOptions)
+  })
+}
+
+export function checkFeedSubscribeStatus(options = {}) {
+  if (options['scene'] === undefined && options['allScene'] === undefined) {
+    return Promise.reject(`缺少参数scene或allScene`)
+  }
+  const defaultOptions = {
+    type: 'play'
+  }
+  const mergeOptions = Object.assign({}, defaultOptions, options)
+  console.log('mergeOptions', mergeOptions)
+  return new Promise((resolve, reject) => {
+    // 构造参数
+    const subscribeOptions = {
+      success(res) {
+        console.log('checkFeedSubscribeStatus success:', res)
+        if(res.errMsg==='checkFeedSubscribeStatus:ok'){
+          resolve(res)
+        }
+      },
+      fail(err) {
+        console.log('checkFeedSubscribeStatus fail:', err.errMsg)
+        reject(err.errMsg)
+      },
+    }
+    if (mergeOptions['allScene'] === true) {
+      delete mergeOptions['scene']
+    }
+    Object.assign(subscribeOptions, mergeOptions)
+
+
+    tt.checkFeedSubscribeStatus(subscribeOptions)
+  })
+}
+
+export const onFeedStatusChange = (callback) => {
+  tt.onFeedStatusChange(callback)
+}
+
+export const offFeedStatusChange = (callback) => {
+  tt.offFeedStatusChange(callback)
+}
+
+
+ /**
+  * 存储推荐流直出订阅数据
+  * @param {*} params 
+  * @param {number} params.scene 场景
+  * @param {number} params.status 状态
+  * @param {string} params.contentID 内容ID
+  * @param {number} params.leftValue 左值
+  * @param {string} params.operator 操作符
+  * @param {number} params.rightValue 右值
+  * @param {string} params.extra 额外参数
+  */
+
+ export const storeFeedData = (params)=>{
+  let multipleParams = ['scene','status','contentID','leftValue','operator','rightValue'];
+
+  // 判断是否缺少必要参数, 缺少则抛出错误
+  multipleParams.forEach(param => {
+      if(!params[param]){
+          throw new Error(`缺少参数:${param}`);
+      }
+  });
+
+  let options = {};
+  const {extra} = params;
+  if(extra){
+      options.extra = extra;
+  }
+  multipleParams.forEach(param => {
+      if(params[param]){
+          options[param] = params[param];
+      }
+  });
+  tt.storeFeedData({...options,
+      success:(res)=>{
+          resolve(res)
+      },
+      fail:(res)=>{
+          reject(res.errMsg)
+      }
+  })
+}
+
+/**
+* 获取游戏是否直玩就绪状态数据。
+* @param {Object} params 参数
+* @param {number} params.scene 场景
+* @param {string} params.contentID 内容ID
+* @returns {Promise<Object>} 返回结果
+*/
+
+export const getFeedData = ()=>{
+  let multipleParams = ['scene','contentID'];
+  // 判断是否缺少必要参数, 缺少则抛出错误
+  multipleParams.forEach(param => {
+      if(!params[param]){
+          throw new Error(`缺少参数:${param}`);
+      }
+  });
+  let options = {};
+  multipleParams.forEach(param => {
+      if(params[param]){
+          options[param] = params[param];
+      }
+  });
+
+  return new Promise((resolve, reject) => {
+
+    tt.getFeedData({...options,
+      success:(res)=>{
+          let {errMsg, extra, status} = res;
+          resolve({
+            extra,
+            status
+        })
+      },
+      fail:(res)=>{
+          reject(res.errMsg)
+      }
+    })
+  })
+
+}
+
+/**
+ * 获取小游戏启动参数
+ * @returns {Promise<Object>} 返回小游戏启动参数
+ */
+
+export const getFeedLaunchParams = ()=>{
+  return new Promise((resolve, reject) => {
+    const options = tt.getLaunchOptionsSync();
+    resolve(options)
+  })
+}
+
+
+/**
+ * 自定义启动场景数据上报接口
+ */
+
+export const reportScene = ()=>{
+  console.log('自定义启动场景数据上报接口')
+    tt.reportScene({
+      costTime:50,
+      sceneId:7001,
+      success(res){
+        console.log("自定义启动场景数据上报接口 res:", res)
+      }
+    })
+  
+}

+ 88 - 0
src/init.js

@@ -0,0 +1,88 @@
+/*
+ * @Author: xiaolin
+ * @Date: 2022-10-12 12:09:56
+ * @LastEditors: xiaolin
+ * @LastEditTime: 2022-10-21 15:46:42
+ * @Description: file content
+ * @FilePath: \image.platform.com\xyxJsSdkV2\src\init.js
+ */
+import { setStorage } from "../utils/index.js";
+import { showShareMenu } from "./share.js";
+import { silentGetUserInfo, serverLogin, getDyUserInfo } from "./login.js";
+import { getIpInfo } from "./ip";
+import { checkFeedSubscribeStatus, requestFeedSubscribe } from "./feedsubscribe";
+
+/**
+ * @description: 初始化研发透传信息,
+ * @param {
+  app_version: '1.0.1',
+  config_id: 'wxc3b09871597c6102',
+  game_name: '心动女友'
+} config
+ * @param {*} buttonStyle //授权登录的样式,具体看文档,某些授权下才会使用
+ * @return {*}
+ */
+export const init = async (config, buttonStyle) => {
+  console.log("init入参" + JSON.stringify(config));
+  try {
+    // 检查小游戏启动参数
+    const needValues = ["config_id", "game_name", "app_version"];
+    for (var k in needValues) {
+      if (config[needValues[k]] === undefined) {
+        return Promise.reject(`缺少参数:${needValues[k]}`);
+      }
+    }
+    //获取到进入小游戏url上的参数
+    let launchOptions = tt.getLaunchOptionsSync();
+    let query = launchOptions.query;
+    let scene = launchOptions.scene;
+
+    // 当有获取到广告数据时储存
+    setStorage("urlQuery", {
+      agent_id: query.agent_id || 0,
+      site_id: query.site_id || 0,
+      gdt_vid: query.gdt_vid || "",
+      weixinadinfo: query.weixinadinfo || "",
+      queryStr: JSON.stringify(query),
+    });
+    setStorage("launchScene", scene ? scene : 0);
+
+    console.log(config);
+    setStorage("rySdkConfig", {
+      config_id: config.config_id,
+      game_name: config.game_name,
+      app_version: config.app_version,
+    });
+    // 获取ip信息
+    // await getIpInfo()
+     /**
+     * 2025年05月06日
+     * 初始化的时候,不跑服务器登录接口
+     * 
+     * 处理:抽出登陆方法
+     */
+     /**
+      * 注释代码开始
+      * let res;
+        //根据不同授权方式进入游戏,实现抖音授权和用户服务端登录
+        if (buttonStyle) {
+          //点击按钮授权
+          res = await getDyUserInfo(buttonStyle);
+        } else {
+          //静默授权
+          res = await silentGetUserInfo();
+        }
+        let loginInfo = await serverLogin(res);
+      * 
+      * 注释代码结束
+      */
+
+    // 拉起推荐流直出订阅
+    // await requestFeedSubscribe({ scene: 1 });
+
+    await showShareMenu(); // 开启系统分享
+    return Promise.resolve();
+  } catch (error) {
+    return Promise.reject(error);
+  }
+};

+ 28 - 0
src/ip.js

@@ -0,0 +1,28 @@
+/*
+ * @Author: xiaolin
+ * @Date: 2022-10-12 12:09:56
+ * @LastEditors: xiaolin
+ * @LastEditTime: 2022-10-21 15:48:14
+ * @Description: file content
+ * @FilePath: \image.platform.com\xyxJsSdkV2\src\login.js
+ */
+import request from '../utils/request.js'
+import IpInfoModel from '../model/IpInfoModel'
+
+/**
+ * @description 获取ip信息
+ * @return {*}
+ */
+export const getIpInfo = async () => {
+  try {
+    const v4res = await request.api("IPV4", {})
+    const v6res = await request.api("IPV6", {})
+    IpInfoModel.getInstance().setStorage({
+      ipv4: v4res.ipv4,
+      ipv6: v6res.ipv6
+    })
+    return Promise.resolve(res)
+  } catch (error) {
+    return Promise.reject(error)
+  }
+}

+ 228 - 0
src/login.js

@@ -0,0 +1,228 @@
+/*
+ * @Author: xiaolin
+ * @Date: 2022-10-12 12:09:56
+ * @LastEditors: xiaolin
+ * @LastEditTime: 2022-10-21 15:48:14
+ * @Description: file content
+ * @FilePath: \image.platform.com\xyxJsSdkV2\src\login.js
+ */
+import request from "../utils/request.js";
+import SdkLoginReUserInfoModel from "../model/SdkLoginReUserInfoModel";
+import { to, getStorage } from "../utils/index.js";
+
+/**
+ * @description: 登陆方法
+ * @return {*}
+ */
+export const login = async(buttonStyle)=>{
+  let res;
+  //根据不同授权方式进入游戏,实现抖音授权和用户服务端登录
+  if (buttonStyle) {
+    //点击按钮授权
+    res = await getDyUserInfo(buttonStyle);
+  } else {
+    //静默授权
+    res = await silentGetUserInfo();
+  }
+  let loginInfo = await serverLogin(res);
+  return Promise.resolve(loginInfo);
+}
+
+/**
+ * @description: 获取登录态信息,进入游戏后才能获取
+ * @return {*}
+ */
+export const loginUserInfo = async () => {
+  try {
+    let userInfo = SdkLoginReUserInfoModel.getInstance().getStorage();
+    let launchOptions = tt.getLaunchOptionsSync();
+    let query = launchOptions.query;
+    const share_ext = query.share_ext;
+    userInfo.share_ext = share_ext ? share_ext : "";
+    return Promise.resolve(userInfo);
+  } catch (error) {
+    return Promise.reject(err);
+  }
+};
+
+/**
+ * @description: 获取本地存储登录态
+ * @return {*}
+ */
+export const checkLoginStatus = async () => {
+  try {
+    let userInfo = SdkLoginReUserInfoModel.getInstance().getStorage();
+
+    if (
+      Object.getOwnPropertyNames(userInfo).length === 0 ||
+      userInfo.uid === 0 ||
+      userInfo.uid === ""
+    ) {
+      return Promise.reject({
+        msg: "获取不到本地登录态.",
+      });
+    }
+  } catch (error) {
+    return Promise.reject(err);
+  }
+};
+
+/**
+ * @description: 静态授权
+ * @return {*}
+ */
+export const silentGetUserInfo = () => {
+  return new Promise((resolve, reject) => {
+    // 执行登录
+    tt.login({
+      success(loginRes) {
+        let wxLoginReUserInfo = {
+          code: loginRes.code,
+          avatarUrl: "",
+          nickName: "",
+          iv: "",
+          encryptedData: "",
+        };
+        resolve(wxLoginReUserInfo);
+      },
+      fail(error) {
+        // 登录失败异常
+        reject(error.errMsg);
+      },
+    });
+  });
+};
+
+/**
+ * @description: 判断登录是否过期
+ * @return {*}
+ */
+export const checkLoginStatusAndReLogin = async () => {
+  let err, res;
+  [err, res] = await to(checkLoginStatus());
+  if (err === null) {
+    return Promise.resolve();
+  }
+  if (err.code === 10001) {
+    //静默授权
+    [err, res] = await to(silentGetUserInfo());
+    if (err) {
+      return Promise.reject(err);
+    }
+    [err, res] = await to(serverLogin(res));
+    if (err) {
+      return Promise.reject(err);
+    }
+    return Promise.resolve();
+  }
+  return Promise.reject(err);
+};
+
+/**
+ * @description:服务端登录
+ * @param {*} wxLoginReUserInfo
+ * @return {*}
+ */
+export const serverLogin = (wxLoginReUserInfo) => {
+  return new Promise((resolve, reject) => {
+    const query = getStorage("urlQuery");
+    let params = {
+      do: "login",
+      code: wxLoginReUserInfo.code,
+    };
+    request
+      .api("COMMON", params)
+      .then((res) => {
+        //用户态存缓存下次进游戏可以直接拿
+        console.log("缓存登录态:", res);
+        SdkLoginReUserInfoModel.getInstance().setStorage(res);
+        //判断有没有游戏弹窗,有就展示
+        if (res.pop_content) {
+          tt.showModal({
+            title: res.pop_title ? res.pop_title : "登录提示",
+            content: res.pop_content,
+            complete(res) {
+              console.log(res);
+            },
+          });
+        }
+        resolve(res);
+      })
+      .catch((error) => {
+        reject(error);
+      });
+  });
+};
+
+/**
+ * @description: 获取抖音用户登录信息如code,没有的进行授权登录
+ * @param {*} buttonStyle
+ * @return {*}
+ */
+export const getDyUserInfo = (buttonStyle) => {
+  return new Promise((resolve, reject) => {
+    // 执行抖音登录
+    tt.login({
+      /**
+       * @param loginRes object {'code':用户登录凭证(有效期五分钟)}
+       */
+      success(loginRes) {
+        tt.getSetting({
+          success(setting) {
+            //判断用户有没有授权
+            if (setting.authSetting["scope.userInfo"]) {
+              // 处理用户已授权,获取用户登录信息
+              tt.getUserInfo({
+                success(data) {
+                  let wxLoginReUserInfo = {
+                    code: loginRes.code,
+                    avatarUrl: data.userInfo.avatarUrl,
+                    nickName: data.userInfo.nickName,
+                    iv: data.iv,
+                    encryptedData: data.encryptedData,
+                  };
+                  resolve(wxLoginReUserInfo);
+                },
+                fail(error) {
+                  // 获取用户信息异常
+                  reject({
+                    code: 0,
+                    msg: error.errMsg + "---dy getUserInfo error",
+                  });
+                },
+              });
+            } else {
+              // 展示loading界面
+              tt.showLoading({
+                title: "登录中",
+              });
+              button.destroy();
+              let wxLoginReUserInfo = {
+                code: loginRes.code,
+                avatarUrl: data.userInfo.avatarUrl,
+                nickName: data.userInfo.nickName,
+                iv: data.iv,
+                encryptedData: data.encryptedData,
+              };
+              resolve(wxLoginReUserInfo);
+            }
+          },
+          fail(error) {
+            // 获取用户权限设置异常
+            reject({
+              code: 0,
+              msg: error.errMsg + "---dy getSetting error",
+            });
+          },
+        });
+      },
+      fail(error) {
+        // 抖音登录失败异常
+        reject({
+          code: 0,
+          msg: error.errMsg + "---dy login error",
+        });
+      },
+    });
+  });
+};

+ 34 - 0
src/navigate.js

@@ -0,0 +1,34 @@
+/**
+ * 侧边栏能力
+ * @returns {Promise<void>}
+ */
+export const navigateToScene = async () => {
+  return new Promise((resolve, reject) => {
+    tt.checkScene({
+      scene: "sidebar",
+      success: (res) => {
+        //成功回调逻辑
+        if (res.isExist === true) {
+          tt.navigateToScene({
+            scene: "sidebar",
+            success: (res) => {
+              // 跳转成功回调逻辑
+              resolve(true);
+            },
+            fail: (err) => {
+              // 跳转失败回调逻辑
+              reject(err.errMsg);
+            },
+          });
+        } else {
+          reject('checkScene isExist is false, 请使用真机测试')
+        }
+      },
+      fail: (err) => {
+        //失败回调逻辑
+        reject(err.errMsg);
+      }
+    });
+  })
+};
+

+ 363 - 0
src/payment.js

@@ -0,0 +1,363 @@
+import request from "../utils/request.js";
+import { getSystem, requestGamePayment, openAwemeCustomerService, to } from "../utils/index.js";
+import OrderInfoModel from "../model/OrderInfoModel.js";
+import SdkLoginReUserInfoModel from "../model/SdkLoginReUserInfoModel";
+import DyPayConfigModel from "../model/DyPayConfigModel.js";
+import XcxPayConfigModel from "../model/XcxPayConfigModel.js";
+import SubscribeConfigModel from "../model/SubscribeConfigModel";
+
+import {
+  checkLoginStatus,
+  checkLoginStatusAndReLogin,
+  silentGetUserInfo,
+  serverLogin,
+} from "./login.js";
+
+/**
+ * @description:拉起支付
+ * @param {*} payParams
+ * @return {*}
+ */
+export const makePayment = async (payParams) => {
+  console.log("makePayment入参" + JSON.stringify(payParams));
+
+  try {
+    //判断登录是否过期,过期重新登录
+    await checkLoginStatusAndReLogin();
+    await triggerSubscribe("pay");
+
+    const orderInfo = {
+      amt: payParams.amt,
+      role_id: payParams.role_id,
+      role_name: payParams.role_name,
+      server_id: payParams.server_id,
+      server_name: payParams.server_name,
+      ext: payParams.ext ? payParams.ext : "",
+      role_level: payParams.role_level,
+      product_id: payParams.product_id,
+      product_name: payParams.product_name,
+
+    };
+    tt.showLoading({
+      title: "支付中...",
+      mask: true,
+    });
+
+    await checkUserSession();
+
+    console.log("orderInfo", orderInfo);
+
+    await makeOrder(orderInfo);
+
+    tt.hideLoading();
+
+    // 如果是抖音安卓支付则直接拉取,如果iOS则返回微信支付码
+    // if ("ios" === platform) {
+    //   let curOrderInfo = OrderInfoModel.getInstance().getInfo();
+    //   const res = await makeWxQrOrder(curOrderInfo);
+    //   return Promise.resolve(res);
+    // } else {
+      await dyPay(orderInfo);
+      return Promise.resolve(null);
+    // }
+  } catch (error) {
+
+    return Promise.reject(error);
+  }
+};
+
+// 生成订单
+const makeOrder = async (orderParams) => {
+  try {
+    const params = {
+      do: "getOrder",
+      amt: orderParams.amt,
+      role_id: orderParams.role_id,
+      role_level: orderParams.role_level,
+      role_name: orderParams.role_name,
+      server_id: orderParams.server_id,
+      server_name: orderParams.server_name,
+      product_id: orderParams.product_id,
+      product_name: orderParams.product_name,
+      ext: orderParams.ext,
+    };
+    const res = await request.api("COMMON", params);
+    let orderInfoInstance = OrderInfoModel.getInstance();
+
+    let dyPayConfigInstance = DyPayConfigModel.getInstance();
+    orderInfoInstance.load(res);
+    dyPayConfigInstance.load(
+      typeof res.dy_pay_config !== "undefinded" ? res.dy_pay_config : {}
+    );
+
+    return Promise.resolve();
+  } catch (error) {
+    return Promise.reject(error);
+  }
+};
+
+// 生成微信二维码订单
+const makeWxQrOrder = async (orderParams) => {
+  try {
+    const params = {
+      do: "wx_qr",
+      order_no: orderParams.order_no,
+    };
+    const res = await request.api("COMMON", params);
+    console.log("生成二维码订单返回:", res);
+    return Promise.resolve(res.data);
+  } catch (error) {
+    return Promise.reject(error);
+  }
+};
+
+const checkUserSession = async () => {
+  let err, platform;
+  [err, platform] = await to(getSystem("platform"));
+  if (err) {
+    return Promise.reject(err);
+  }
+
+  //检查session是否过期,过期了重新登录
+  tt.checkSession({
+    success() {
+      return Promise.resolve();
+    },
+    fail() {
+      SdkLoginReUserInfoModel.getInstance().destroyStorage();
+      // 获取用户信息
+      silentGetUserInfo()
+        .then(function (wxLoginReUserInfo) {
+          serverLogin(wxLoginReUserInfo)
+            .then(function () {
+              return Promise.resolve();
+            })
+            .catch((error) => {
+              return Promise.reject(error);
+            });
+        })
+        .catch((error) => {
+          return Promise.reject(error);
+        });
+    },
+  });
+};
+
+const dyPay = async (orderInfo) => {
+  const userInfo = SdkLoginReUserInfoModel.getInstance().getStorage();
+  const curOrderInfo = OrderInfoModel.getInstance().getInfo();
+
+  const dyPayConfig = DyPayConfigModel.getInstance().getInfo();
+  let platform = await getSystem("platform");
+
+  try {
+    var setGoodType = 0;
+    let res;
+    // 小额支付描述 https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/guide/open-ability/payment/micropayment-guide
+    // 安卓 requestGamePayment
+    if(platform==="android"){
+      // 判断是否小额支付
+      if (tt.canIUse('requestGamePayment.object.goodType')) {
+        setGoodType = 2;
+        res = await requestGamePayment({
+          goodType: setGoodType, // 道具直购
+          orderAmount:curOrderInfo.amt * 100, // 单位分
+          goodName: orderInfo.product_name,
+          currencyType: "CNY",
+          zoneId: String(dyPayConfig.zoneId),
+          customId: curOrderInfo.order_no,
+          mode: "game",
+          env: 0,
+          platform: platform, // 目前仅为"android"
+          extraInfo: String(setGoodType)
+        });
+      }else{
+        res = await requestGamePayment({
+          mode: "game",
+          env: 0,
+          platform: platform, // 目前仅为"android"
+          currencyType: "CNY",
+          buyQuantity: dyPayConfig.buyQuantity,
+          zoneId: String(dyPayConfig.zoneId),
+          customId: curOrderInfo.order_no,
+        });
+      }
+
+    }else{
+      // 判断是否小额支付
+      if (tt.canIUse('openAwemeCustomerService.object.goodType')) {
+        setGoodType = 2;
+        // iOS openAwemeCustomerService
+        res = await openAwemeCustomerService({
+          goodType: setGoodType, // 道具直购
+          orderAmount: curOrderInfo.amt * 100, // 单位分
+          goodName: orderInfo.product_name,
+          currencyType: "DIAMOND",
+          zoneId: String(dyPayConfig.zoneId),
+          customId: curOrderInfo.order_no,
+          extraInfo: String(setGoodType)
+        });
+      }else{
+        // iOS openAwemeCustomerService
+        res = await openAwemeCustomerService({
+          zoneId: String(dyPayConfig.zoneId),
+          customId: curOrderInfo.order_no,
+          currencyType: "DIAMOND",
+          buyQuantity: dyPayConfig.buyQuantity,
+        });
+      }
+    }
+
+    // 支付回调
+    request.api("COMMON", {
+      do: "payCallback",
+      accessToken: userInfo.access_token,
+      order_no: curOrderInfo.order_no,
+      amt: curOrderInfo.amt,
+      goodType:setGoodType
+    });
+
+    //请求日志
+    request.api("COMMON", {
+      do: "payLog",
+      msg: JSON.stringify(res),
+      env: dyPayConfig.env,
+      buyQuantity: dyPayConfig.buyQuantity,
+      zoneId: dyPayConfig.zoneId,
+      order_no: curOrderInfo.order_no,
+      amt: curOrderInfo.amt,
+    });
+    return Promise.resolve();
+  } catch (error) {
+    //请求记录日志
+    request.api("COMMON", {
+      do: "payLog",
+      msg: JSON.stringify(error),
+      env: dyPayConfig.env,
+      buyQuantity: dyPayConfig.buyQuantity,
+      zoneId: dyPayConfig.zoneId,
+      order_no: curOrderInfo.order_no,
+      amt: curOrderInfo.amt,
+    });
+    return Promise.reject(error);
+  }
+};
+
+/**
+ * @description:获取IOS 支付配置
+ * @return {*}
+ */
+export const payConfig = async () => {
+  try {
+    // 获取预订单数据
+    const res = await request.api("COMMON", {
+      do: "getIosPayConfig",
+    });
+    return Promise.resolve(res);
+  } catch (error) {
+    return Promise.reject(error);
+  }
+};
+
+/**
+ * @description: 获取订阅配置
+ * @return {*}
+ */
+export const getSubscribeConfig = () => {
+  return new Promise((resolve, reject) => {
+    let params = {
+      do: "getSubscribeConfig",
+    };
+    request
+      .api("COMMON", params)
+      .then((res) => {
+        resolve(res);
+      })
+      .catch((errorMsg) => {
+        reject(errorMsg);
+      });
+  });
+};
+
+/**
+ * @description: 上报订阅记录
+ * @param {*} resStr
+ * @return {*}
+ */
+export const setSubscribeSuccessLog = (resStr) => {
+  return new Promise((resolve, reject) => {
+    let params = {
+      do: "setSubscribeSuccessLog",
+      res_str: resStr,
+    };
+    request
+      .api("COMMON", params)
+      .then((res) => {
+        resolve();
+      })
+      .catch((errorMsg) => {
+        reject(errorMsg);
+      });
+  });
+};
+
+export const requestSubscribeMessage = async () => {
+  try {
+    const res = await getSubscribeConfig();
+    // //整合
+    // let templateList = {};
+    // for (let resKey in res) {
+    //   if (Array.isArray(res[resKey])) {
+    //     console.log("resKey:", res[resKey]);
+    //     let tempArr = res[resKey];
+    //     let tempList = [];
+    //     for (let k in tempArr) {
+    //       if (typeof tempArr[k]["template_id"] !== "undefined") {
+    //         tempList.push(tempArr[k]["template_id"]);
+    //       }
+    //     }
+    //     templateList[resKey] = tempList;
+    //   }
+    // }
+    // console.log("requestSubscribeMessage:", res);
+    let subscribeConfigM = SubscribeConfigModel.getInstance(res);
+    return Promise.resolve(res);
+  } catch (error) {
+    return Promise.reject(error);
+  }
+};
+
+/**
+ * @description: 触发订阅
+ * @param {*} type
+ * @return {*}
+ */
+export const triggerSubscribe = async (type = "login") => {
+  console.log("triggerSubscribe入参" + JSON.stringify(type));
+  let xcxPayConfig = SubscribeConfigModel.getInstance().getInfo();
+  let curList = [];
+  if (Array.isArray(xcxPayConfig[type])) {
+    curList = xcxPayConfig[type];
+  }
+
+  if (curList.length != 0) {
+    tt.onTouchEnd(function () {
+      tt.requestSubscribeMessage({
+        tmplIds: curList,
+        success: (res) => {
+          console.log("订阅结果", res);
+          //上报订阅结果
+          setSubscribeSuccessLog(JSON.stringify(res));
+        },
+        fail: (res) => {
+          console.log("订阅结果", res);
+        },
+        complete: (res) => {
+          console.log(res);
+          tt.offTouchEnd();
+        },
+      });
+    });
+  }
+  return Promise.resolve();
+};

文件差異過大導致無法顯示
+ 0 - 0
src/qrcode.min.js


+ 153 - 0
src/recommendDc.js

@@ -0,0 +1,153 @@
+/*
+ * 请求推荐流直出订阅
+ * @param {Object} params 参数
+ * @param {number} params.scene 场景
+ * @param {string[]} params.contentIDs 内容ID
+ * @param {boolean} params.allScene 是否所有场景
+ * @param {string} params.type 类型
+ * @returns {Promise<Object>} 返回结果\
+ * 向用户请求授权,允许游戏在满足一定的条件后出现在 Feed 流中
+ * */
+export const requestFeedSubscribe = (params)=>{
+    return new Promise((resolve, reject) => {
+        const { scene, contentIDs, allScene } = params || {};
+        const options = Object.fromEntries(
+            Object.entries({ scene, contentIDs, allScene })
+                .filter(([_, value]) => value !== undefined)
+        );
+        console.log('option', options)
+        tt.requestFeedSubscribe({...options, type:'play', success:(res)=>{
+            console.log("=====>",res.success)
+            if(res.success){
+                resolve({code:1,msg:"success"})
+            }else{
+                resolve({code:0,msg:res.errMsg})
+            }
+        },fail:(err)=>{
+            resolve({code:0,msg:err.errMsg})
+        }})
+    })
+    
+}
+
+
+/**
+ * 检查推荐流直出订阅状态
+ * @param {Object} params 参数
+ * @param {number} params.scene 场景
+ * @param {boolean} params.allScene 是否所有场景
+ * @param {string} params.type 类型, 默认play
+ * @returns {Promise<Object>} 返回结果
+ */
+ export const checkFeedSubscribeStatus = (params)=>{
+    return new Promise((resolve, reject) => {
+        const { scene, allScene, type } = params || {};
+        const options = Object.fromEntries(
+            Object.entries({ scene, allScene, type })
+                .filter(([_, value]) => value !== undefined)
+        );
+        tt.checkFeedSubscribeStatus({...options,type:"play",success:(res)=>{
+            resolve({code:1,data:res.status,msg:res.errMsg})
+        },fail:(err)=>{
+            resolve({code:0,data:null,msg:err.errMsg})
+        }})
+    })
+ }
+
+/**
+ * 监听推荐流直出订阅状态变化
+ * @param {Function} callback 监听推荐流直出订阅状态变化回调
+ */
+ export const onFeedStatusChange = (callback)=>{
+    tt.onFeedStatusChange(callback)
+ }
+
+ /**
+  * 取消监听推荐流直出订阅状态变化
+  * @param {Function} feedChangeCallback 监听推荐流直出订阅状态变化回调
+  */
+ export const offFeedStatusChange = (feedChangeCallback)=>{
+    tt.offFeedStatusChange(feedChangeCallback)
+ }
+
+ /**
+  * 存储推荐流直出订阅数据
+  * @param {*} params 
+  * @param {number} params.scene 场景
+  * @param {number} params.status 状态
+  * @param {string} params.contentID 内容ID
+  * @param {number} params.leftValue 左值
+  * @param {string} params.operator 操作符
+  * @param {number} params.rightValue 右值
+  * @param {string} params.extra 额外参数
+  */
+
+export const storeFeedData = (params)=>{
+    let multipleParams = ['scene','status','contentID','leftValue','operator','rightValue'];
+  
+    // 判断是否缺少必要参数, 缺少则抛出错误
+    multipleParams.forEach(param => {
+        if(!params[param]){
+            throw new Error(`缺少参数:${param}`);
+        }
+    });
+
+    let options = {};
+    const {extra} = params;
+    if(extra){
+        options.extra = extra;
+    }
+    multipleParams.forEach(param => {
+        if(params[param]){
+            options[param] = params[param];
+        }
+    });
+    tt.storeFeedData({...options,
+        success:(res)=>{
+            resolve({code:1,msg:"success"})
+        },
+        fail:(res)=>{
+            resolve({code:0,msg:res.errMsg})
+        }
+    })
+}
+
+/**
+ * 获取游戏是否直玩就绪状态数据。
+ * @param {Object} params 参数
+ * @param {number} params.scene 场景
+ * @param {string} params.contentID 内容ID
+ * @returns {Promise<Object>} 返回结果
+ */
+
+export const getFeedData = ()=>{
+    let multipleParams = ['scene','contentID'];
+    // 判断是否缺少必要参数, 缺少则抛出错误
+    multipleParams.forEach(param => {
+        if(!params[param]){
+            throw new Error(`缺少参数:${param}`);
+        }
+    });
+    let options = {};
+    multipleParams.forEach(param => {
+        if(params[param]){
+            options[param] = params[param];
+        }
+    });
+    tt.getFeedData({...options,
+        success:(res)=>{
+            let {errMsg, extra, status} = res;
+            resolve({
+                code:1,
+                data:{
+                    extra,
+                    status
+                },
+                msg:errMsg
+            })
+        },
+        fail:(res)=>{
+            resolve({code:0,data:null,msg:res.errMsg})
+        }
+    })
+}

+ 25 - 0
src/service.js

@@ -0,0 +1,25 @@
+/**
+ * 小游戏客服能力
+ * @returns {Promise<void>}
+ */
+export const openCustomerServiceConversation = async (options = {}) => {
+  const defaultOptions = {
+    type: 2,
+  };
+  const mergeOptions = Object.assign({}, defaultOptions, options);
+
+  return new Promise((resolve, reject) => {
+    // 构造参数
+    const subscribeOptions = {
+      success(res) {
+        resolve(res.status);
+      },
+      fail(err) {
+        reject(err.errMsg);
+      },
+    };
+
+    Object.assign(subscribeOptions, mergeOptions);
+    tt.openCustomerServiceConversation(subscribeOptions);
+  });
+};

+ 108 - 0
src/share.js

@@ -0,0 +1,108 @@
+import request from "../utils/request.js";
+import ShareConfigModel from "../model/ShareConfigModel";
+
+/**
+ * @description:检查分享配置
+ * @return {*}
+ */
+const checkShareConfig = async () => {
+  try {
+    // 加载分享配置
+    let shareConfigInfo = ShareConfigModel.getInstance().getInfo();
+    if (
+      Object.getOwnPropertyNames(shareConfigInfo).length === 0 ||
+      shareConfigInfo.title === ""
+    ) {
+      // 获取服务端分享配置
+      const res = await request.api("COMMON", {
+        do: "getShareConfig",
+      });
+      res.imageUrl = res.image_url;
+      ShareConfigModel.getInstance().load(res);
+    }
+    return Promise.resolve();
+  } catch (error) {
+    return Promise.reject(error);
+  }
+};
+
+/**
+ * @description: 开启系统分享
+ * @return {*}
+ */
+export const showShareMenu = async () => {
+  try {
+    // 开启分享按钮
+    tt.showShareMenu({
+      withShareTicket: true,
+    });
+    await checkShareConfig();
+    let shareData = buildShareData({});
+    tt.onShareAppMessage(() => {
+      return shareData;
+    });
+    return Promise.resolve();
+  } catch (error) {
+    return Promise.reject(error);
+  }
+};
+
+/**
+ * @description: 主动发起分享
+ * @param {*} data
+ * @return {*}
+ */
+export const shareAppMessage = async (data) => {
+  console.log("shareAppMessage入参" + JSON.stringify(data));
+  try {
+    await checkShareConfig();
+    let shareData = buildShareData(data);
+    console.log("发起分享参数" + JSON.stringify(shareData));
+    // 发起分享
+    tt.shareAppMessage(shareData);
+    return Promise.resolve();
+  } catch (error) {
+    return Promise.reject(error);
+  }
+};
+
+const buildShareData = (data) => {
+  let shareConfigInfo = ShareConfigModel.getInstance().getInfo();
+  let shareData = {
+    title: shareConfigInfo.title,
+    imageUrl: shareConfigInfo.imageUrl,
+    query: shareConfigInfo.query,
+  };
+  let share_ext = "";
+  // 记录分享透传参数
+  if (data.hasOwnProperty("title") && data.title) shareData.title = data.title;
+  if (data.hasOwnProperty("imageUrl") && data.imageUrl)
+    shareData.imageUrl = data.imageUrl;
+  if (data.hasOwnProperty("ext") && data.ext) share_ext = data.ext;
+
+  //前面这个share_ext是研发透传进来的,后面这个是服务端传进来的
+  shareData.query += shareConfigInfo.share_ext;
+  if (share_ext) {
+    shareData.query += `&share_ext=` + share_ext;
+  }
+  return shareData;
+};
+
+/**
+ * @description: 主动监听研发透传参数
+ * @param {*} data
+ * @return {*}
+ */
+export const onShareAppMessage = (data, menus = ["shareAppMessage"]) => {
+  console.log("onShareAppMessage入参" + JSON.stringify(data));
+  //先off,再on
+  tt.offShareAppMessage();
+  let shareData = buildShareData(data);
+  tt.showShareMenu({
+    withShareTicket: true,
+    menus: menus,
+  });
+  tt.onShareAppMessage(() => {
+    return shareData;
+  });
+};

+ 36 - 0
src/shortcut.js

@@ -0,0 +1,36 @@
+import { getSystem } from "../utils";
+
+/**
+ * 可以将小游戏快捷方式添加到手机桌面上。
+ * @returns {Promise<void>}
+ */
+export const addShortcut = async () => {
+  return new Promise((resolve, reject) => {
+    tt.addShortcut({
+      success() {
+        resolve(true);
+      },
+      fail(err) {
+        reject(err.errMsg);
+      },
+    });
+  });
+};
+
+export const checkShortcut = () => {
+  return new Promise(async (resolve, reject) => {
+    let platform = await getSystem("platform");
+    if (platform !== "android") {
+      reject("checkShortcut 仅在Android上支持!");
+    }
+    tt.checkShortcut({
+      success(res) {
+        // 如果没有添加过
+        resolve(res.status);
+      },
+      fail(err) {
+        reject(err.errMsg);
+      },
+    });
+  });
+};

+ 200 - 0
utils/index.js

@@ -0,0 +1,200 @@
+/**
+ * @description: 跳转小程序
+ */
+export const navigateToMiniProgram = (appId) => {
+  return new Promise((resolve, reject) => {
+    tt.navigateToMiniProgram({
+      appId: appId,
+      path: "",
+      extraData: {
+        foo: "bar",
+      },
+      envVersion: "develop",
+      success(res) {
+        resolve(res);
+      },
+      fail(error) {
+        reject(error);
+      },
+    });
+  });
+};
+
+/**
+ * @description: 获取手机相关配置,每次都直接取接口
+ * @param {string} key
+ * @return {*}
+ */
+export const getSystem = (key) => {
+  return new Promise((resolve, reject) => {
+    tt.getSystemInfo({
+      success: (res) => {
+        if (key && key in res) {
+          resolve(res[key]);
+        } else {
+          resolve(res);
+        }
+      },
+      fail: (error) => {
+        reject(error);
+      },
+    });
+  });
+};
+
+/**
+ * @description: js异步转同步优化
+ * @param {*} promiseObj
+ * @return {*}
+ */
+export const to = (promiseObj) => {
+  return promiseObj
+    .then((data) => {
+      return [null, data];
+    })
+    .catch((err) => [err]);
+};
+
+/**
+ * @description: 对象排序
+ * @param {object} data
+ * @return {object}
+ */
+export const sortObj = (data) => {
+  let arr = [];
+  for (let key in data) {
+    arr.push(key);
+  }
+  arr = arr.sort();
+  let newData = {};
+  for (var i in arr) {
+    newData[arr[i]] = data[arr[i]];
+  }
+  return newData;
+};
+
+/**
+ * @description: 加密
+ * @param {*} value
+ * @return {string}
+ */
+const compile = (value) => {
+  value = JSON.stringify(value);
+  let result = String.fromCharCode(value.charCodeAt(0) + value.length);
+  for (let i = 1; i < value.length; i++) {
+    result += String.fromCharCode(
+      value.charCodeAt(i) + value.charCodeAt(i - 1)
+    );
+  }
+  return escape(result);
+};
+
+/**
+ * @description:解密
+ * @param {string} value
+ * @return {*}
+ */
+const uncompile = (value) => {
+  value = unescape(value);
+  let result = String.fromCharCode(value.charCodeAt(0) - value.length);
+  for (let i = 1; i < value.length; i++) {
+    result += String.fromCharCode(
+      value.charCodeAt(i) - result.charCodeAt(i - 1)
+    );
+  }
+  result = JSON.parse(result);
+  return result;
+};
+
+/**
+ * @description: 二次处理key
+ * @param {string} key
+ * @return {string}
+ */
+const getKey = (key) => {
+  return `xinxin_${key}_@`;
+};
+
+/**
+ * @description: 获取
+ * @param {string} key
+ * @return {*}
+ */
+export const getStorage = (key) => {
+  let value = tt.getStorageSync(getKey(key));
+  return value ? uncompile(value) : false;
+};
+
+/**
+ * @description: 存储
+ * @param {string} key
+ * @param {*} value
+ * @return {*}
+ */
+export const setStorage = (key, value) => {
+  tt.setStorageSync(getKey(key), compile(value));
+};
+
+/**
+ * @description: 删除
+ * @param {string} key
+ */
+export const removeStorage = (key) => {
+  tt.removeStorageSync(getKey(key));
+};
+
+/**
+ * @description: 随机字符串
+ * @param {number}
+ * @return {string}
+ */
+export const randomString = (length) => {
+  const chars =
+    "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+  var result = "";
+  for (let i = length; i > 0; --i)
+    result += chars[Math.floor(Math.random() * chars.length)];
+  return result;
+};
+
+/**
+ * @description: 安卓虚拟支付
+ * @param {object}
+ * @return {*}
+ */
+export const requestGamePayment = (data) => {
+  return new Promise((resolve, reject) => {
+    console.log("虚拟支付开始:", data);
+    tt.requestGamePayment({
+      ...data,
+      success: (res) => {
+        resolve(res);
+      },
+      fail: (error) => {
+        console.log("虚拟支付失败:", error);
+        reject(error);
+      },
+    });
+  });
+};
+
+/**
+ * @description: iOS 虚拟支付 发起钻石支付
+ * @param {object}
+ * @return {*}
+ */
+export const openAwemeCustomerService = (data) => {
+  return new Promise((resolve, reject) => {
+    console.log("发起钻石支付:", data);
+    tt.openAwemeCustomerService({
+      ...data,
+      success: (res) => {
+        resolve(res);
+      },
+      fail: (error) => {
+        console.log("钻石支付失败:", error);
+        reject(error);
+      },
+    });
+  });
+};

+ 153 - 0
utils/request.js

@@ -0,0 +1,153 @@
+import apiConfig from "../config/api.js";
+import gameConfig from "../config/game.js";
+import sdkConfig from "../config/sdk.js";
+import { getSystem, getStorage } from "../utils/index.js";
+import { sortObj } from "./index.js";
+import SdkLoginReUserInfoModel from "../model/SdkLoginReUserInfoModel";
+import IpInfoModel from "../model/IpInfoModel";
+
+import md5 from "../lib/md5";
+
+class request {
+  // 统一API请求入口
+  async api(type, params, method = "post") {
+    try {
+      let wxNetworkInfo;
+      const dySystemInfo = await getSystem();
+      // 获取启动query参数
+      const query = getStorage("urlQuery");
+      const rySdkConfig = getStorage("rySdkConfig");
+      // console.log(rySdkConfig);
+      // 组装公共参数
+      //启动参数有渠道id和site_id的按启动参数,没有则按系统类型对应的渠道id和site_id,游戏id按系统类型对应的游戏id
+      params.config_id = rySdkConfig.config_id; //配置id
+      params.platform = dySystemInfo.platform;
+      params.os = dySystemInfo.system;
+      params.model = dySystemInfo.model;
+      params.device_brand = dySystemInfo.brand;
+      // params.mnos = wxNetworkInfo.networkType;
+      //游戏版本,初始化的时候透传进来
+      params.app_version = rySdkConfig.app_version;
+      params.queryStr = query.queryStr;
+
+      // let ipinfo = IpInfoModel.getInstance().getStorage();
+      // params.ipv4 = ipinfo.ipv4;
+      // params.ipv6 = ipinfo.ipv6;
+      let loginInfo = SdkLoginReUserInfoModel.getInstance().getStorage();
+
+      console.log("loginInfo:", loginInfo);
+
+      params.access_token = loginInfo.access_token;
+      (params.username = loginInfo.username), (params.uid = loginInfo.uid);
+      params.openid = loginInfo.openid;
+      params.mtype = gameConfig.MTYPE;
+      params.uuid = sdkConfig.DEVICE_NO;
+      params.imei = sdkConfig.DEVICE_NO;
+      params.sdk_version = sdkConfig.SDK_VERSION;
+      params.sdk_version_code = sdkConfig.SDK_VERSION_CODE;
+      params.agent_id =
+        query.agent_id ||
+        ("ios" === dySystemInfo.platform
+          ? gameConfig.IOS_AGENT_ID
+          : gameConfig.AGENT_ID);
+      params.site_id =
+        query.site_id ||
+        ("ios" === dySystemInfo.platform
+          ? gameConfig.IOS_SITE_ID
+          : gameConfig.SITE_ID);
+
+      if (!params.appid) {
+        params.appid = loginInfo.appid;
+      }
+      // params.appid = ''
+
+      if (loginInfo.agent_id !== 1000) {
+        params.agent_id = loginInfo.agent_id;
+        params.site_id = loginInfo.site_id;
+      }
+
+      params.launchScene = getStorage("launchScene");
+
+      // 组装请求接口地址
+      const url = type in apiConfig ? apiConfig[type] : false;
+      if (url === false) {
+        return Promise.reject("type error");
+      }
+      //common类接口统一加密
+      if (type === "COMMON") {
+        params = request.addCommonSign(params);
+      }
+      // 发起请求
+      const res = await this.doRequest(url, method, params);
+      console.log("res:", res);
+      return Promise.resolve(res);
+    } catch (error) {
+      return Promise.reject(error);
+    }
+  }
+
+  doRequest(url, method, params) {
+    return new Promise((resolve, reject) => {
+      // 发起请求
+      tt.request({
+        url: url,
+        header: {
+          "Content-Type": "application/x-www-form-urlencoded",
+        },
+        method: method,
+        data: params,
+        // 成功响应
+        success: (res) => {
+          if (res.statusCode === 200) {
+            if (res.data.ret === 1) {
+                resolve(res.data.info);
+            } else {
+              reject({
+                code: res.data.ret,
+                msg: res.data.msg,
+              });
+            }
+          } else {
+            reject({
+              code: -100,
+              msg: `network error ${res.statusCode}`,
+            });
+          }
+        },
+        fail: (error) => {
+          reject({
+            code: -101,
+            msg: error.errMsg,
+          });
+        },
+      });
+    });
+  }
+
+  /**
+   * 通用类加密
+   * @param params
+   */
+  static addCommonSign(params) {
+    const rySdkConfig = getStorage("rySdkConfig");
+    if (!params.time) {
+      params.time = parseInt(new Date().getTime() / 1000);
+    }
+    let newData = sortObj(params);
+    let signStr = "";
+    for (let k in newData) {
+      if (k === "sign") {
+        continue;
+      }
+      if (newData[k] === "") {
+        continue;
+      }
+      signStr = signStr + k + "=" + newData[k] + "&";
+    }
+    signStr = signStr.substring(0, signStr.length - 1) + rySdkConfig.config_id;
+    // console.log('加密原串:'+signStr);
+    params.sign = md5(signStr);
+    return params;
+  }
+}
+export default new request();

文件差異過大導致無法顯示
+ 33 - 0
utils/uqrcode.js


+ 40 - 0
webpack.config.js

@@ -0,0 +1,40 @@
+/*
+ * @Author: xiaolin
+ * @Date: 2022-10-14 10:31:52
+ * @LastEditors: xiaolin
+ * @LastEditTime: 2022-10-17 11:45:23
+ * @Description: file content
+ * @FilePath: \image.platform.com\xyxJsSdkV2\webpack.config.js
+ */
+const TerserPlugin = require("terser-webpack-plugin");
+const path = require("path");
+const pkg = require("./package.json");
+module.exports = {
+  entry: {
+    dyMiniGameSdk: "./index.js",
+  },
+  experiments: {
+    outputModule: true,
+  },
+  output: {
+    filename: `[name].${pkg.version}.js`,
+    path: path.resolve(__dirname, "dist"),
+    library: {
+      type: "module",
+    },
+  },
+  optimization: {
+    minimize: true,
+    minimizer: [
+      new TerserPlugin({
+        terserOptions: {
+          format: {
+            comments: false,
+          },
+        },
+        extractComments: false,
+      }),
+    ],
+  },
+  // devtool: 'source-map',
+};

部分文件因文件數量過多而無法顯示