difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/sdks/qq_sdk.js';
                    var __require = nodeEnv ? function (request) {
                        return cc.require(request);
                    } : function (request) {
                        return __quick_compile_project__.require(request, __filename);
                    };
                    function __define (exports, require, module) {
                        if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
cc._RF.push(module, '5c5bd9NS+JOaLaYqbUdHfeN', 'qq_sdk');
// Scripts/sdks/qq_sdk.js
 
"use strict";
 
// window.PLATFORM = "qq";        // 平台号
// window.PACKAGE_VERSION = "_0_0_2";
// window.CHANNEL = "h5sszg_qq";  // 渠道号
window.PACKAGE_NAME = "闪烁之光口袋版"; // 渠道号
 
var LoginController = require("login_controller");
 
var RoleController = require("role_controller");
 
var VipEvent = require("vip_event");
 
var QQSDK = function QQSDK() {};
 
QQSDK.account_info = null;
QQSDK.user_info = null;
 
QQSDK.initSDK = function () {
  console.log("QQSDK相关");
  console.log(window);
  if (!window.qq) return;
  this.initTopInfo();
  window.CHANNEL = "h5youyi_qq";
  window.PLATFORM_NAME = "wb";
  window.PLATFORM = "wb";
  qq.setKeepScreenOn({
    keepScreenOn: true
  });
  qq.onShow(function (res) {
    qq.setKeepScreenOn({
      keepScreenOn: true
    });
  });
  qq.onHide(function (res) {
    qq.setKeepScreenOn({
      keepScreenOn: false
    });
  });
  qq.showShareMenu({
    showShareItems: ['qq', 'qzone', 'wechatFriends', 'wechatMoment'],
    success: function success() {
      qq.onShareAppMessage(function () {
        return {
          imageUrl: "https://s2.ax1x.com/2019/09/21/nvzZlj.png" // 图片 URL
 
        };
      });
    }
  });
  qq.getSetting({
    success: function success(res) {
      cc.log(res);
 
      if (res.authSetting["scope.userInfo"]) {
        QQSDK.checkLoginStatus();
      } else {
        var info = qq.getSystemInfoSync();
        var button = qq.createUserInfoButton({
          type: 'text',
          text: '',
          style: {
            left: 0,
            //info.screenWidth/2-80,
            top: info.screenHeight / 2,
            //info.windowHeight - info.windowHeight/3,
            width: info.screenWidth,
            //160,
            height: info.screenHeight / 2,
            //40,
            lineHeight: 0,
            backgroundColor: '',
            color: '#ffffff',
            textAlign: 'center',
            fontSize: 16,
            borderRadius: 4
          }
        });
        button.show();
        button.onTap(function (res) {
          button.hide();
          QQSDK.checkLoginStatus();
          console.log(res);
        });
      }
    }
  });
};
 
QQSDK.initTopInfo = function () {
  var menuInfo = qq.getMenuButtonBoundingClientRect();
  var systemInfo = qq.getSystemInfoSync();
 
  if (menuInfo.top > 30) {
    window.WX_FIT = menuInfo.top / systemInfo.screenHeight * 0.7 || 0;
  } else {
    window.WX_FIT = menuInfo.top / systemInfo.screenHeight * 0.1 || 0;
  }
 
  console.log("QQ小游戏菜单栏的适配值");
  cc.log(WX_FIT);
};
 
QQSDK.checkLoginStatus = function () {
  // 获取本地key
  try {
    var value = this.account_info = qq.getStorageSync('account_info');
 
    if (value) {
      QQSDK.checkSessionKey(value);
    } else {
      QQSDK.login();
    }
  } catch (e) {// Do something when catch error
  }
};
 
QQSDK.login = function () {
  if (window.qq) {
    qq.login({
      success: function success(res) {
        if (res.code) {
          //发起网络请求
          cc.log("初始化登录信息返回");
          cc.log(res);
          qq.request({
            url: 'https://s1-wb-h5sszg.shiyuegame.com/api.php/pf/qq/login',
            method: "POST",
            data: {
              js_code: res.code,
              cps: "qqtest"
            },
            header: {
              'content-type': 'application/json' // 默认值
 
            },
            success: function success(res) {
              cc.log("服务器登录信息返回");
              cc.log(res);
 
              if (res && res.data) {
                if (res.data.error == 666) {
                  // 请求成功
                  try {
                    console.log("保存用户信息到本地");
                    cc.log(res.data.msg);
                    QQSDK.account_info = res.data.msg;
                    qq.setStorageSync('account_info', res.data.msg); // 请求成功开始登录游戏
 
                    QQSDK.initUserInfo();
                  } catch (e) {}
                }
              }
            }
          });
        } else {
          console.log('登录失败!' + res.errMsg);
        }
      }
    });
  }
};
 
QQSDK.checkSessionKey = function (data) {
  cc.log("校验key是否过期");
  qq.checkSession({
    success: function success() {
      // 没有失效,继续登录
      QQSDK.initUserInfo();
    },
    fail: function fail() {
      // session_key 已经失效,需要重新执行登录流程
      QQSDK.login();
    }
  });
};
 
QQSDK.initUserInfo = function () {
  qq.getUserInfo({
    success: function success(res) {
      QQSDK.user_info = res;
      cc.log("获取用户信息成功");
      cc.log(res);
      QQSDK.setLoginData(res);
    },
    fail: function fail(res) {
      cc.log("获取用户信息失败");
    }
  });
};
 
QQSDK.setLoginData = function (user_info) {
  this.user_info = user_info;
  this.sdkBackLogin();
}; // SDK登录成功回调
 
 
QQSDK.sdkBackLogin = function () {
  var login_data = {};
  login_data.usrName = "qq_" + this.account_info.openid;
  login_data.password = "qq123456";
  console.log("QQ数据初始花成功,开始请求服务器列表");
  LoginController.getInstance().loginPlatformRequest(login_data);
};
 
QQSDK.loginGame = function () {
  var test_acount = LoginController.getInstance().getTestAccount();
  cc.log("使用了QQ测试账号");
  cc.log(test_acount); // SDK请求登录游戏
 
  var login_data = {};
 
  if (test_acount) {
    login_data.account = test_acount;
  } else {
    login_data.account = "qq_" + this.account_info.openid;
  }
 
  login_data.rawData = this.user_info.rawData;
  login_data.signature = this.user_info.signature;
  login_data.channel = CHANNEL;
  login_data.package_name = PACKAGE_NAME;
  login_data.package_version = PACKAGE_VERSION;
  login_data.platform = PLATFORM;
  login_data.token = QQSDK.account_info.session_key;
  login_data.timestamp = QQSDK.account_info.time;
  login_data.sign = QQSDK.account_info.sign;
  LoginController.getInstance().cusSDKLogin(login_data);
}; // 通知服务器成功
 
 
QQSDK.submitLogin = function (url) {
  if (url) {
    var submit_url = "https://" + url + "/api.php/pf/qq/session";
    console.log(submit_url);
    console.log(QQSDK.account_info);
    qq.request({
      url: submit_url,
      method: "POST",
      data: {
        session_key: QQSDK.account_info.session_key,
        openid: QQSDK.account_info.openid,
        time: QQSDK.account_info.time,
        sign: QQSDK.account_info.sign,
        cps: "qqtest"
      },
      header: {
        'content-type': 'application/json' // 默认值
 
      },
      success: function success(res) {
        cc.log("服务器登录信息返回");
        cc.log(res);
 
        if (res && res.data) {
          console.log(res.data);
 
          if (res.data.error == 666) {// 请求成功
          }
        }
      }
    });
  }
};
 
QQSDK.getCurrChannel = function () {};
 
QQSDK.canvasToTempFilePath = function () {
  var canvas = cc.game.canvas;
  canvas.toTempFilePath({
    x: 0,
    y: 510 * canvas.height / 1280,
    width: canvas.width,
    height: 550 * canvas.height / 1280,
    destWidth: 500,
    destHeight: 400,
    fileType: "jpg",
    success: function success(res) {
      //.可以保存该截屏图片
      qq.shareAppMessage({
        imageUrl: res.tempFilePath
      });
    },
    fail: function fail(res) {
      //.可以保存该截屏图片
      qq.shareAppMessage({
        imageUrl: "https://s2.ax1x.com/2019/09/21/nvzZlj.png" // 图片 URL
 
      });
    }
  });
};
 
QQSDK.getSubChannel = function () {}; // QQ小游戏余额查询
 
 
QQSDK.checkBalance = function () {
  var loginInfo = LoginController.getInstance().model.getLoginInfo();
  var data = {
    openid: this.account_info.openid,
    time: QQSDK.account_info.time,
    sign: QQSDK.account_info.sign,
    cps: "qqtest"
  };
  qq.request({
    url: "https://" + loginInfo.host + "/api.php/pf/qq/balance",
    method: "POST",
    data: data,
    header: {
      'content-type': 'application/json' // 默认值
 
    },
    success: function success(res) {
      if (res && res.data) {
        if (res.data.error == 666) {
          // 请求成功
          try {
            if (res.data.msg) {
              gcore.GlobalEvent.fire(VipEvent.UPDATA_QQ_BALANCE, res.data.msg.remainder);
            }
          } catch (e) {}
        }
      }
    }
  });
}; //支付
 
 
QQSDK.pay = function (money, buyNum, prodId, productName, productDesc, extension, coinNum) {
  var payCallFunc = function () {
    var loginInfo = LoginController.getInstance().model.getLoginInfo();
    var roleVo = RoleController.getInstance().getRoleVo();
    if (roleVo == null) return;
    var severInfo = roleVo.srv_id.split("_");
    var platform = severInfo[0] || "";
    var zone_id = severInfo[1];
    var systemInfo = qq.getSystemInfoSync();
    var systemName = systemInfo.system;
    var pf = "";
 
    if (systemName.indexOf("iOS") > -1) {// return;
    } else if (systemName.indexOf("Android") > -1) {
      pf = "qq_m_qq-2001-android-2011";
    } //时间戳
 
 
    var date_time = Math.ceil(Date.now() / 1000);
    productName = productName || money * 10 + "钻石";
    var cps = "qqtest";
    var channel = CHANNEL;
 
    var _extension = roleVo.rid + "$$" + platform + "$$" + zone_id + "$$" + channel + "$$" + prodId + "$$" + productName + "$$" + cps + "$$" + date_time;
 
    cc.log("拓展参数_extension==>", _extension);
 
    var base_64 = require("base64").Base64;
 
    _extension = base_64.encode(_extension);
    qq.request({
      url: "https://" + loginInfo.host + "/api.php/pf/qq/pre_pay",
      method: "POST",
      data: {
        openid: this.account_info.openid,
        zone_id: zone_id,
        pf: pf,
        amt: money * 10,
        good_num: 1,
        time: QQSDK.account_info.time,
        sign: QQSDK.account_info.sign,
        app_remark: _extension,
        cps: cps
      },
      header: {
        'content-type': 'application/json' // 默认值
 
      },
      success: function success(res) {
        console.log("预下单返回");
        console.log(res);
 
        if (res && res.data) {
          if (res.data.error == 666) {
            // 请求成功
            try {
              qq.requestMidasPayment({
                prepayId: res.data.msg.prepayId,
                starCurrency: money * 10,
                success: function success(res) {
                  console.log("支付回调成功", res);
                },
                fail: function fail(res) {
                  console.log("支付回调失败", res);
                },
                complete: function complete(res) {
                  console.log("支付回调complete", res);
                }
              });
            } catch (e) {}
          }
        }
      }
    });
  }.bind(this);
 
  require("tips_controller").getInstance().showFirstCharge(payCallFunc);
};
 
module.exports = QQSDK;
 
cc._RF.pop();
                    }
                    if (nodeEnv) {
                        __define(__module.exports, __require, __module);
                    }
                    else {
                        __quick_compile_project__.registerModuleFunc(__filename, function () {
                            __define(__module.exports, __require, __module);
                        });
                    }
                })();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcc2Rrc1xccXFfc2RrLmpzIl0sIm5hbWVzIjpbIndpbmRvdyIsIlBBQ0tBR0VfTkFNRSIsIkxvZ2luQ29udHJvbGxlciIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsIlZpcEV2ZW50IiwiUVFTREsiLCJhY2NvdW50X2luZm8iLCJ1c2VyX2luZm8iLCJpbml0U0RLIiwiY29uc29sZSIsImxvZyIsInFxIiwiaW5pdFRvcEluZm8iLCJDSEFOTkVMIiwiUExBVEZPUk1fTkFNRSIsIlBMQVRGT1JNIiwic2V0S2VlcFNjcmVlbk9uIiwia2VlcFNjcmVlbk9uIiwib25TaG93IiwicmVzIiwib25IaWRlIiwic2hvd1NoYXJlTWVudSIsInNob3dTaGFyZUl0ZW1zIiwic3VjY2VzcyIsIm9uU2hhcmVBcHBNZXNzYWdlIiwiaW1hZ2VVcmwiLCJnZXRTZXR0aW5nIiwiY2MiLCJhdXRoU2V0dGluZyIsImNoZWNrTG9naW5TdGF0dXMiLCJpbmZvIiwiZ2V0U3lzdGVtSW5mb1N5bmMiLCJidXR0b24iLCJjcmVhdGVVc2VySW5mb0J1dHRvbiIsInR5cGUiLCJ0ZXh0Iiwic3R5bGUiLCJsZWZ0IiwidG9wIiwic2NyZWVuSGVpZ2h0Iiwid2lkdGgiLCJzY3JlZW5XaWR0aCIsImhlaWdodCIsImxpbmVIZWlnaHQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJjb2xvciIsInRleHRBbGlnbiIsImZvbnRTaXplIiwiYm9yZGVyUmFkaXVzIiwic2hvdyIsIm9uVGFwIiwiaGlkZSIsIm1lbnVJbmZvIiwiZ2V0TWVudUJ1dHRvbkJvdW5kaW5nQ2xpZW50UmVjdCIsInN5c3RlbUluZm8iLCJXWF9GSVQiLCJ2YWx1ZSIsImdldFN0b3JhZ2VTeW5jIiwiY2hlY2tTZXNzaW9uS2V5IiwibG9naW4iLCJlIiwiY29kZSIsInJlcXVlc3QiLCJ1cmwiLCJtZXRob2QiLCJkYXRhIiwianNfY29kZSIsImNwcyIsImhlYWRlciIsImVycm9yIiwibXNnIiwic2V0U3RvcmFnZVN5bmMiLCJpbml0VXNlckluZm8iLCJlcnJNc2ciLCJjaGVja1Nlc3Npb24iLCJmYWlsIiwiZ2V0VXNlckluZm8iLCJzZXRMb2dpbkRhdGEiLCJzZGtCYWNrTG9naW4iLCJsb2dpbl9kYXRhIiwidXNyTmFtZSIsIm9wZW5pZCIsInBhc3N3b3JkIiwiZ2V0SW5zdGFuY2UiLCJsb2dpblBsYXRmb3JtUmVxdWVzdCIsImxvZ2luR2FtZSIsInRlc3RfYWNvdW50IiwiZ2V0VGVzdEFjY291bnQiLCJhY2NvdW50IiwicmF3RGF0YSIsInNpZ25hdHVyZSIsImNoYW5uZWwiLCJwYWNrYWdlX25hbWUiLCJwYWNrYWdlX3ZlcnNpb24iLCJQQUNLQUdFX1ZFUlNJT04iLCJwbGF0Zm9ybSIsInRva2VuIiwic2Vzc2lvbl9rZXkiLCJ0aW1lc3RhbXAiLCJ0aW1lIiwic2lnbiIsImN1c1NES0xvZ2luIiwic3VibWl0TG9naW4iLCJzdWJtaXRfdXJsIiwiZ2V0Q3VyckNoYW5uZWwiLCJjYW52YXNUb1RlbXBGaWxlUGF0aCIsImNhbnZhcyIsImdhbWUiLCJ0b1RlbXBGaWxlUGF0aCIsIngiLCJ5IiwiZGVzdFdpZHRoIiwiZGVzdEhlaWdodCIsImZpbGVUeXBlIiwic2hhcmVBcHBNZXNzYWdlIiwidGVtcEZpbGVQYXRoIiwiZ2V0U3ViQ2hhbm5lbCIsImNoZWNrQmFsYW5jZSIsImxvZ2luSW5mbyIsIm1vZGVsIiwiZ2V0TG9naW5JbmZvIiwiaG9zdCIsImdjb3JlIiwiR2xvYmFsRXZlbnQiLCJmaXJlIiwiVVBEQVRBX1FRX0JBTEFOQ0UiLCJyZW1haW5kZXIiLCJwYXkiLCJtb25leSIsImJ1eU51bSIsInByb2RJZCIsInByb2R1Y3ROYW1lIiwicHJvZHVjdERlc2MiLCJleHRlbnNpb24iLCJjb2luTnVtIiwicGF5Q2FsbEZ1bmMiLCJyb2xlVm8iLCJnZXRSb2xlVm8iLCJzZXZlckluZm8iLCJzcnZfaWQiLCJzcGxpdCIsInpvbmVfaWQiLCJzeXN0ZW1OYW1lIiwic3lzdGVtIiwicGYiLCJpbmRleE9mIiwiZGF0ZV90aW1lIiwiTWF0aCIsImNlaWwiLCJEYXRlIiwibm93IiwiX2V4dGVuc2lvbiIsInJpZCIsImJhc2VfNjQiLCJCYXNlNjQiLCJlbmNvZGUiLCJhbXQiLCJnb29kX251bSIsImFwcF9yZW1hcmsiLCJyZXF1ZXN0TWlkYXNQYXltZW50IiwicHJlcGF5SWQiLCJzdGFyQ3VycmVuY3kiLCJjb21wbGV0ZSIsImJpbmQiLCJzaG93Rmlyc3RDaGFyZ2UiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBQSxNQUFNLENBQUNDLFlBQVAsR0FBc0IsU0FBdEIsRUFBa0M7O0FBRWxDLElBQUlDLGVBQWUsR0FBR0MsT0FBTyxDQUFDLGtCQUFELENBQTdCOztBQUNBLElBQUlDLGNBQWMsR0FBR0QsT0FBTyxDQUFDLGlCQUFELENBQTVCOztBQUNBLElBQUlFLFFBQVEsR0FBR0YsT0FBTyxDQUFDLFdBQUQsQ0FBdEI7O0FBRUEsSUFBSUcsS0FBSyxHQUFHLFNBQVJBLEtBQVEsR0FBVyxDQUV0QixDQUZEOztBQUlBQSxLQUFLLENBQUNDLFlBQU4sR0FBcUIsSUFBckI7QUFDQUQsS0FBSyxDQUFDRSxTQUFOLEdBQWtCLElBQWxCOztBQUVBRixLQUFLLENBQUNHLE9BQU4sR0FBZ0IsWUFBVztBQUN2QkMsRUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQVksU0FBWjtBQUNBRCxFQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWVgsTUFBWjtBQUdFLE1BQUksQ0FBQ0EsTUFBTSxDQUFDWSxFQUFaLEVBQWlCO0FBRWpCLE9BQUtDLFdBQUw7QUFFQWIsRUFBQUEsTUFBTSxDQUFDYyxPQUFQLEdBQWlCLFlBQWpCO0FBQ0FkLEVBQUFBLE1BQU0sQ0FBQ2UsYUFBUCxHQUF1QixJQUF2QjtBQUNBZixFQUFBQSxNQUFNLENBQUNnQixRQUFQLEdBQWtCLElBQWxCO0FBRUFKLEVBQUFBLEVBQUUsQ0FBQ0ssZUFBSCxDQUFtQjtBQUNqQkMsSUFBQUEsWUFBWSxFQUFFO0FBREcsR0FBbkI7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aEJELENBZ0JFLE9BQU95QyxDQUFQLEVBQVUsQ0FFWDtBQUNGO0FBQ0Y7QUFDRjtBQTNDUSxLQUFYO0FBNkNELEdBN0VpQixDQTZFaEJ1RyxJQTdFZ0IsQ0E2RVgsSUE3RVcsQ0FBbEI7O0FBOEVBakssRUFBQUEsT0FBTyxDQUFDLGlCQUFELENBQVAsQ0FBMkJpRixXQUEzQixHQUF5Q2lGLGVBQXpDLENBQXlEN0IsV0FBekQ7QUFDRCxDQWhGRDs7QUFxRkE4QixNQUFNLENBQUNDLE9BQVAsR0FBaUJqSyxLQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gd2luZG93LlBMQVRGT1JNID0gXCJxcVwiOyAgICAgICAgLy8g5bmz5Y+w5Y+3XHJcbi8vIHdpbmRvdy5QQUNLQUdFX1ZFUlNJT04gPSBcIl8wXzBfMlwiO1xyXG4vLyB3aW5kb3cuQ0hBTk5FTCA9IFwiaDVzc3pnX3FxXCI7ICAvLyDmuKDpgZPlj7dcclxud2luZG93LlBBQ0tBR0VfTkFNRSA9IFwi6Zeq54OB5LmL5YWJ5Y+j6KKL54mIXCI7ICAvLyDmuKDpgZPlj7dcclxuXHJcbnZhciBMb2dpbkNvbnRyb2xsZXIgPSByZXF1aXJlKFwibG9naW5fY29udHJvbGxlclwiKTtcclxudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcclxudmFyIFZpcEV2ZW50ID0gcmVxdWlyZShcInZpcF9ldmVudFwiKVxyXG5cclxudmFyIFFRU0RLID0gZnVuY3Rpb24oKSB7XHJcblxyXG59O1xyXG5cclxuUVFTREsuYWNjb3VudF9pbmZvID0gbnVsbDtcclxuUVFTREsudXNlcl9pbmZvID0gbnVsbDtcclxuXHJcblFRU0RLLmluaXRTREsgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiUVFTREvnm7jlhbNcIik7XHJcbiAgICBjb25zb2xlLmxvZyh3aW5kb3cpO1xyXG5cclxuICAgXHJcbiAgICAgIGlmICghd2luZG93LnFxKSAgcmV0dXJuO1xyXG4gIFxyXG4gICAgICB0aGlzLmluaXRUb3BJbmZvKCk7XHJcblxyXG4gICAgICB3aW5kb3cuQ0hBTk5FTCA9IFwiaDV5b3V5aV9xcVwiO1xyXG4gICAgICB3aW5kb3cuUExBVEZPUk1fTkFNRSA9IFwid2JcIjtcclxuICAgICAgd2luZG93LlBMQVRGT1JNID0gXCJ3YlwiOyBcclxuICAgICAgXHJcbiAgICAgIHFxLnNldEtlZXBTY3JlZW5Pbih7XHJcbiAgICAgICAga2VlcFNjcmVlbk9uOiB0cnVlXHJcbiAgICAgIH0pXHJcbiAgICAgIHFxLm9uU2hvdyhmdW5jdGlvbihyZXMpe1xyXG4gICAgICAgIHFxLnNldEtlZXBTY3JlZW5Pbih7XHJcbiAgICAgICAgICBrZWVwU2NyZWVuT246IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHFxLm9uSGlkZShmdW5jdGlvbihyZXMpe1xyXG4gICAgICAgIHFxLnNldEtlZXBTY3JlZW5Pbih7XHJcbiAgICAgICAgICBrZWVwU2NyZWVuT246IGZhbHNlXHJcbiAgICAgICAgfSlcclxuICAgICAgfSk7XHJcbiAgICAgIFxyXG4gICAgICBxcS5zaG93U2hhcmVNZW51KHtcclxuICAgICAgICBzaG93U2hhcmVJdGVtczogWydxcScsICdxem9uZScsJ3dlY2hhdEZyaWVuZHMnLCAnd2VjaGF0TW9tZW50J10sXHJcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICBxcS5vblNoYXJlQXBwTWVzc2FnZSgoKSA9PiAoe1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaW1hZ2VVcmw6IFwiaHR0cHM6Ly9zMi5heDF4LmNvbS8yMDE5LzA5LzIxL252elpsai5wbmdcIiAvLyDlm77niYcgVVJMXHJcbiAgICAgICAgICB9KSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBxcS5nZXRTZXR0aW5nKHtcclxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHtcclxuICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgaWYgKHJlcy5hdXRoU2V0dGluZ1tcInNjb3BlLnVzZXJJbmZvXCJdKSB7XHJcbiAgICAgICAgICAgIFFRU0RLLmNoZWNrTG9naW5TdGF0dXMoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBpbmZvID0gcXEuZ2V0U3lzdGVtSW5mb1N5bmMoKTtcclxuICAgICAgICAgICAgdmFyIGJ1dHRvbiA9IHFxLmNyZWF0ZVVzZXJJbmZvQnV0dG9uKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICAgIHRleHQ6ICcnLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgbGVmdDogMCwvL2luZm8uc2NyZWVuV2lkdGgvMi04MCxcclxuICAgICAgICAgICAgICAgICAgdG9wOiBpbmZvLnNjcmVlbkhlaWdodC8yLC8vaW5mby53aW5kb3dIZWlnaHQgLSBpbmZvLndpbmRvd0hlaWdodC8zLFxyXG4gICAgICAgICAgICAgICAgICB3aWR0aDogaW5mby5zY3JlZW5XaWR0aCwvLzE2MCxcclxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBpbmZvLnNjcmVlbkhlaWdodC8yLC8vNDAsXHJcbiAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJycsXHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZmZmZicsXHJcbiAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAxNixcclxuICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiA0LFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBidXR0b24uc2hvdygpO1xyXG4gICAgICAgICAgICBidXR0b24ub25UYXAoKHJlcyk9PntcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICBRUVNESy5jaGVja0xvZ2luU3RhdHVzKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxufVxyXG5cclxuXHJcblFRU0RLLmluaXRUb3BJbmZvID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgbWVudUluZm8gPSBxcS5nZXRNZW51QnV0dG9uQm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB2YXIgc3lzdGVtSW5mbyA9IHFxLmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICBpZihtZW51SW5mby50b3A+MzApe1xyXG4gICAgICB3aW5kb3cuV1hfRklUID0gbWVudUluZm8udG9wIC8gc3lzdGVtSW5mby5zY3JlZW5IZWlnaHQgKjAuNyB8fCAwO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHdpbmRvdy5XWF9GSVQgPSBtZW51SW5mby50b3AgLyBzeXN0ZW1JbmZvLnNjcmVlbkhlaWdodCAqMC4xIHx8IDA7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcIlFR5bCP5ri45oiP6I+c5Y2V5qCP55qE6YCC6YWN5YC8XCIpO1xyXG4gICAgY2MubG9nKFdYX0ZJVCk7XHJcbn1cclxuXHJcblFRU0RLLmNoZWNrTG9naW5TdGF0dXMgPSBmdW5jdGlvbigpIHtcclxuICAvLyDojrflj5bmnKzlnLBrZXlcclxuICB0cnkge1xyXG4gICAgdmFyIHZhbHVlID0gdGhpcy5hY2NvdW50X2luZm8gPSBxcS5nZXRTdG9yYWdlU3luYygnYWNjb3VudF9pbmZvJylcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBRUVNESy5jaGVja1Nlc3Npb25LZXkodmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgUVFTREsubG9naW4oKTtcclxuICAgIH1cclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICAvLyBEbyBzb21ldGhpbmcgd2hlbiBjYXRjaCBlcnJvclxyXG4gIH1cclxufVxyXG5cclxuXHJcblFRU0RLLmxvZ2luID0gZnVuY3Rpb24oKSB7XHJcbiAgaWYgKHdpbmRvdy5xcSkge1xyXG4gICAgICBxcS5sb2dpbih7XHJcbiAgICAgICAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAvL+WPkei1t+e9kee7nOivt+axglxyXG4gICAgICAgICAgICAgICAgY2MubG9nKFwi5Yid5aeL5YyW55m75b2V5L+h5oGv6L+U5ZueXCIpO1xyXG4gICAgICAgICAgICAgICAgY2MubG9nKHJlcyk7XHJcbiAgICAgICAgICAgICAgICBxcS5yZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9zMS13Yi1oNXNzemcuc2hpeXVlZ2FtZS5jb20vYXBpLnBocC9wZi9xcS9sb2dpbicsXHJcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICBqc19jb2RlOiByZXMuY29kZSxcclxuICAgICAgICAgICAgICAgICAgICBjcHM6IFwicXF0ZXN0XCJcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgc3VjY2VzcyAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2MubG9nKFwi5pyN5Yqh5Zmo55m75b2V5L+h5oGv6L+U5ZueXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS/neWtmOeUqOaIt+S/oeaBr+WIsOacrOWcsFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLmxvZyhyZXMuZGF0YS5tc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUVFTREsuYWNjb3VudF9pbmZvID0gcmVzLmRhdGEubXNnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXEuc2V0U3RvcmFnZVN5bmMoJ2FjY291bnRfaW5mbycsIHJlcy5kYXRhLm1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDor7fmsYLmiJDlip/lvIDlp4vnmbvlvZXmuLjmiI9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFRU0RLLmluaXRVc2VySW5mbygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+eZu+W9leWksei0pe+8gScgKyByZXMuZXJyTXNnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuUVFTREsuY2hlY2tTZXNzaW9uS2V5ID0gZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgY2MubG9nKFwi5qCh6aqMa2V55piv5ZCm6L+H5pyfXCIpO1xyXG4gICAgICBxcS5jaGVja1Nlc3Npb24oe1xyXG4gICAgICAgIHN1Y2Nlc3MgKCkge1xyXG4gICAgICAgICAgLy8g5rKh5pyJ5aSx5pWI77yM57un57ut55m75b2VXHJcbiAgICAgICAgICBRUVNESy5pbml0VXNlckluZm8oKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZhaWwgKCkge1xyXG4gICAgICAgICAgLy8gc2Vzc2lvbl9rZXkg5bey57uP5aSx5pWI77yM6ZyA6KaB6YeN5paw5omn6KGM55m75b2V5rWB56iLXHJcbiAgICAgICAgICBRUVNESy5sb2dpbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxufVxyXG5cclxuUVFTREsuaW5pdFVzZXJJbmZvID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHFxLmdldFVzZXJJbmZvKHtcclxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHtcclxuICAgICAgICAgIFFRU0RLLnVzZXJfaW5mbyA9IHJlcztcclxuICAgICAgICAgIGNjLmxvZyhcIuiOt+WPlueUqOaIt+S/oeaBr+aIkOWKn1wiKTtcclxuICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgUVFTREsuc2V0TG9naW5EYXRhKHJlcyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgZmFpbDogZnVuY3Rpb24ocmVzKSB7XHJcbiAgICAgICAgICBjYy5sb2coXCLojrflj5bnlKjmiLfkv6Hmga/lpLHotKVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG59XHJcblxyXG5RUVNESy5zZXRMb2dpbkRhdGEgPSBmdW5jdGlvbih1c2VyX2luZm8pIHtcclxuICB0aGlzLnVzZXJfaW5mbyA9IHVzZXJfaW5mbztcclxuICB0aGlzLnNka0JhY2tMb2dpbigpO1xyXG59XHJcblxyXG4vLyBTREvnmbvlvZXmiJDlip/lm57osINcclxuUVFTREsuc2RrQmFja0xvZ2luID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIGxvZ2luX2RhdGEgPSB7fTtcclxuICBsb2dpbl9kYXRhLnVzck5hbWUgPSBcInFxX1wiICsgdGhpcy5hY2NvdW50X2luZm8ub3BlbmlkO1xyXG4gIGxvZ2luX2RhdGEucGFzc3dvcmQgPSBcInFxMTIzNDU2XCI7XHJcbiAgY29uc29sZS5sb2coXCJRUeaVsOaNruWIneWni+iKseaIkOWKn++8jOW8gOWni+ivt+axguacjeWKoeWZqOWIl+ihqFwiKTtcclxuICBMb2dpbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5sb2dpblBsYXRmb3JtUmVxdWVzdChsb2dpbl9kYXRhKTtcclxufVxyXG5cclxuUVFTREsubG9naW5HYW1lID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIHRlc3RfYWNvdW50ID0gTG9naW5Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0VGVzdEFjY291bnQoKTtcclxuICBjYy5sb2coXCLkvb/nlKjkuoZRUea1i+ivlei0puWPt1wiKTtcclxuICBjYy5sb2codGVzdF9hY291bnQpO1xyXG5cclxuICAvLyBTREvor7fmsYLnmbvlvZXmuLjmiI9cclxuICB2YXIgbG9naW5fZGF0YSA9IHt9O1xyXG4gIGlmICh0ZXN0X2Fjb3VudCkge1xyXG4gICAgbG9naW5fZGF0YS5hY2NvdW50ID0gdGVzdF9hY291bnQ7XHJcbiAgfSBlbHNlIHtcclxuICAgIGxvZ2luX2RhdGEuYWNjb3VudCA9IFwicXFfXCIgKyB0aGlzLmFjY291bnRfaW5mby5vcGVuaWQ7XHJcbiAgfVxyXG4gIGxvZ2luX2RhdGEucmF3RGF0YSA9IHRoaXMudXNlcl9pbmZvLnJhd0RhdGE7XHJcbiAgbG9naW5fZGF0YS5zaWduYXR1cmUgPSB0aGlzLnVzZXJfaW5mby5zaWduYXR1cmU7XHJcbiAgbG9naW5fZGF0YS5jaGFubmVsID0gQ0hBTk5FTDtcclxuICBsb2dpbl9kYXRhLnBhY2thZ2VfbmFtZSA9IFBBQ0tBR0VfTkFNRTtcclxuICBsb2dpbl9kYXRhLnBhY2thZ2VfdmVyc2lvbiA9IFBBQ0tBR0VfVkVSU0lPTjtcclxuICBsb2dpbl9kYXRhLnBsYXRmb3JtID0gUExBVEZPUk07XHJcbiAgbG9naW5fZGF0YS50b2tlbiA9IFFRU0RLLmFjY291bnRfaW5mby5zZXNzaW9uX2tleTtcclxuICBsb2dpbl9kYXRhLnRpbWVzdGFtcCA9IFFRU0RLLmFjY291bnRfaW5mby50aW1lO1xyXG4gIGxvZ2luX2RhdGEuc2lnbiA9IFFRU0RLLmFjY291bnRfaW5mby5zaWduO1xyXG5cclxuICBMb2dpbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jdXNTREtMb2dpbihsb2dpbl9kYXRhKTtcclxufVxyXG5cclxuLy8g6YCa55+l5pyN5Yqh5Zmo5oiQ5YqfXHJcblFRU0RLLnN1Ym1pdExvZ2luID0gZnVuY3Rpb24odXJsKSB7XHJcbiAgICBpZiAodXJsKSB7XHJcbiAgICAgIHZhciBzdWJtaXRfdXJsID0gXCJodHRwczovL1wiICsgdXJsICsgXCIvYXBpLnBocC9wZi9xcS9zZXNzaW9uXCI7XHJcbiAgICAgIGNvbnNvbGUubG9nKHN1Ym1pdF91cmwpO1xyXG4gICAgICBjb25zb2xlLmxvZyhRUVNESy5hY2NvdW50X2luZm8pO1xyXG5cclxuICAgICAgcXEucmVxdWVzdCh7XHJcbiAgICAgICAgdXJsOiBzdWJtaXRfdXJsLFxyXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgc2Vzc2lvbl9rZXk6IFFRU0RLLmFjY291bnRfaW5mby5zZXNzaW9uX2tleSxcclxuICAgICAgICAgIG9wZW5pZDogUVFTREsuYWNjb3VudF9pbmZvLm9wZW5pZCxcclxuICAgICAgICAgIHRpbWU6UVFTREsuYWNjb3VudF9pbmZvLnRpbWUsXHJcbiAgICAgICAgICBzaWduOlFRU0RLLmFjY291bnRfaW5mby5zaWduLFxyXG4gICAgICAgICAgY3BzOiBcInFxdGVzdFwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICBoZWFkZXI6IHtcclxuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgLy8g6buY6K6k5YC8XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgICAgIGNjLmxvZyhcIuacjeWKoeWZqOeZu+W9leS/oeaBr+i/lOWbnlwiKTtcclxuICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuZGF0YSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMuZGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG5cclxuICAgIH0gXHJcbn1cclxuXHJcblFRU0RLLmdldEN1cnJDaGFubmVsID0gZnVuY3Rpb24oKSB7XHJcblxyXG59XHJcblxyXG5RUVNESy5jYW52YXNUb1RlbXBGaWxlUGF0aCA9IGZ1bmN0aW9uKCkge1xyXG4gIHZhciBjYW52YXMgPSBjYy5nYW1lLmNhbnZhcztcclxuICBcclxuICBjYW52YXMudG9UZW1wRmlsZVBhdGgoe1xyXG4gICAgICB4OiAwLFxyXG4gICAgICB5OiA1MTAqY2FudmFzLmhlaWdodC8xMjgwLFxyXG4gICAgICB3aWR0aDogY2FudmFzLndpZHRoLFxyXG4gICAgICBoZWlnaHQ6IDU1MCpjYW52YXMuaGVpZ2h0LzEyODAsXHJcbiAgICAgIGRlc3RXaWR0aDogNTAwLFxyXG4gICAgICBkZXN0SGVpZ2h0OiA0MDAsXHJcbiAgICAgIGZpbGVUeXBlOlwianBnXCIsXHJcblxyXG4gICAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgICAgIC8vLuWPr+S7peS/neWtmOivpeaIquWxj+WbvueJh1xyXG4gICAgICAgICAgcXEuc2hhcmVBcHBNZXNzYWdlKHtcclxuICAgICAgICAgICAgICBpbWFnZVVybDogcmVzLnRlbXBGaWxlUGF0aFxyXG4gICAgICAgICAgfSlcclxuICAgICAgfSxcclxuICAgICAgZmFpbCAocmVzKSB7XHJcbiAgICAgICAgICAvLy7lj6/ku6Xkv53lrZjor6XmiKrlsY/lm77niYdcclxuICAgICAgICAgIHFxLnNoYXJlQXBwTWVzc2FnZSh7XHJcbiAgICAgICAgICAgIGltYWdlVXJsOiBcImh0dHBzOi8vczIuYXgxeC5jb20vMjAxOS8wOS8yMS9udnpabGoucG5nXCIgLy8g5Zu+54mHIFVSTFxyXG4gICAgICAgICAgfSlcclxuICAgICAgfSxcclxuICB9KVxyXG5cclxufVxyXG5cclxuUVFTREsuZ2V0U3ViQ2hhbm5lbCA9IGZ1bmN0aW9uKCkge1xyXG4gIFxyXG59XHJcblxyXG5cclxuLy8gUVHlsI/muLjmiI/kvZnpop3mn6Xor6JcclxuUVFTREsuY2hlY2tCYWxhbmNlID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIGxvZ2luSW5mbyA9IExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm1vZGVsLmdldExvZ2luSW5mbygpO1xyXG4gIFxyXG4gIHZhciBkYXRhID0ge1xyXG4gICAgICBvcGVuaWQ6IHRoaXMuYWNjb3VudF9pbmZvLm9wZW5pZCxcclxuICAgICAgdGltZTpRUVNESy5hY2NvdW50X2luZm8udGltZSxcclxuICAgICAgc2lnbjpRUVNESy5hY2NvdW50X2luZm8uc2lnbixcclxuICAgICAgY3BzOiBcInFxdGVzdFwiXHJcbiAgICB9XHJcbiAgICBcclxuICBxcS5yZXF1ZXN0KHtcclxuICAgIHVybDogXCJodHRwczovL1wiK2xvZ2luSW5mby5ob3N0K1wiL2FwaS5waHAvcGYvcXEvYmFsYW5jZVwiLFxyXG4gICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgIGRhdGE6IGRhdGEsXHJcbiAgICBoZWFkZXI6IHtcclxuICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgIH0sXHJcbiAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgaWYgKHJlcyAmJiByZXMuZGF0YSkge1xyXG4gICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGlmKHJlcy5kYXRhLm1zZyl7XHJcbiAgICAgICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKFZpcEV2ZW50LlVQREFUQV9RUV9CQUxBTkNFLHJlcy5kYXRhLm1zZy5yZW1haW5kZXIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSlcclxufVxyXG5cclxuLy/mlK/ku5hcclxuUVFTREsucGF5ID0gZnVuY3Rpb24obW9uZXksIGJ1eU51bSwgcHJvZElkLCBwcm9kdWN0TmFtZSwgcHJvZHVjdERlc2MsIGV4dGVuc2lvbiwgY29pbk51bSkge1xyXG4gIHZhciBwYXlDYWxsRnVuYyA9IGZ1bmN0aW9uKCl7XHJcbiAgICB2YXIgbG9naW5JbmZvID0gTG9naW5Db250cm9sbGVyLmdldEluc3RhbmNlKCkubW9kZWwuZ2V0TG9naW5JbmZvKCk7XHJcblxyXG4gICAgdmFyIHJvbGVWbyA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XHJcbiAgICBpZiAocm9sZVZvID09IG51bGwpIHJldHVybjtcclxuICAgIHZhciBzZXZlckluZm8gPSByb2xlVm8uc3J2X2lkLnNwbGl0KFwiX1wiKTtcclxuICAgIHZhciBwbGF0Zm9ybSA9IHNldmVySW5mb1swXSB8fCBcIlwiO1xyXG4gICAgdmFyIHpvbmVfaWQgPSBzZXZlckluZm9bMV07XHJcblxyXG4gICAgdmFyIHN5c3RlbUluZm8gPSBxcS5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgdmFyIHN5c3RlbU5hbWUgPSBzeXN0ZW1JbmZvLnN5c3RlbTtcclxuICAgIHZhciBwZiA9IFwiXCI7XHJcbiAgICBpZihzeXN0ZW1OYW1lLmluZGV4T2YoXCJpT1NcIik+LTEpe1xyXG4gICAgICAvLyByZXR1cm47XHJcbiAgICB9ZWxzZSBpZihzeXN0ZW1OYW1lLmluZGV4T2YoXCJBbmRyb2lkXCIpPi0xKXtcclxuICAgICAgcGYgPSBcInFxX21fcXEtMjAwMS1hbmRyb2lkLTIwMTFcIjtcclxuICAgIH1cclxuXHJcbiAgICAvL+aXtumXtOaIs1xyXG4gICAgdmFyIGRhdGVfdGltZSA9IE1hdGguY2VpbChEYXRlLm5vdygpIC8gMTAwMCk7XHJcblxyXG4gICAgcHJvZHVjdE5hbWUgPSBwcm9kdWN0TmFtZSB8fCAobW9uZXkgKiAxMCkgKyBcIumSu+efs1wiO1xyXG4gICAgdmFyIGNwcyA9IFwicXF0ZXN0XCI7XHJcbiAgICB2YXIgY2hhbm5lbCA9IENIQU5ORUw7XHJcblxyXG4gICAgdmFyIF9leHRlbnNpb24gPSByb2xlVm8ucmlkICsgXCIkJFwiICsgcGxhdGZvcm0gKyBcIiQkXCIgKyB6b25lX2lkICtcclxuICAgICAgICAgIFwiJCRcIiArIGNoYW5uZWwgKyBcIiQkXCIgKyBwcm9kSWQgKyBcIiQkXCIgKyBwcm9kdWN0TmFtZSArIFwiJCRcIiArIGNwcyArIFwiJCRcIiArIGRhdGVfdGltZTtcclxuICAgICAgY2MubG9nKFwi5ouT5bGV5Y+C5pWwX2V4dGVuc2lvbj09PlwiLCBfZXh0ZW5zaW9uKVxyXG4gICAgICB2YXIgYmFzZV82NCA9IHJlcXVpcmUoXCJiYXNlNjRcIikuQmFzZTY0O1xyXG4gICAgICBfZXh0ZW5zaW9uID0gYmFzZV82NC5lbmNvZGUoX2V4dGVuc2lvbik7XHJcbiAgICBcclxuICAgIFxyXG4gICAgcXEucmVxdWVzdCh7XHJcbiAgICAgIHVybDogXCJodHRwczovL1wiK2xvZ2luSW5mby5ob3N0K1wiL2FwaS5waHAvcGYvcXEvcHJlX3BheVwiLFxyXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgb3BlbmlkOiB0aGlzLmFjY291bnRfaW5mby5vcGVuaWQsXHJcbiAgICAgICAgem9uZV9pZDogem9uZV9pZCxcclxuICAgICAgICBwZjogcGYsXHJcbiAgICAgICAgYW10Om1vbmV5KjEwLFxyXG4gICAgICAgIGdvb2RfbnVtOiAxLFxyXG4gICAgICAgIHRpbWU6UVFTREsuYWNjb3VudF9pbmZvLnRpbWUsXHJcbiAgICAgICAgc2lnbjpRUVNESy5hY2NvdW50X2luZm8uc2lnbixcclxuICAgICAgICBhcHBfcmVtYXJrOl9leHRlbnNpb24sXHJcbiAgICAgICAgY3BzOiBjcHNcclxuICAgICAgfSxcclxuICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgICAgfSxcclxuICAgICAgc3VjY2VzcyAocmVzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLpooTkuIvljZXov5Tlm55cIik7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzKTtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5kYXRhKSB7XHJcbiAgICAgICAgICBpZiAocmVzLmRhdGEuZXJyb3IgPT0gNjY2KSB7ICAgIC8vIOivt+axguaIkOWKn1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcXEucmVxdWVzdE1pZGFzUGF5bWVudCh7XHJcbiAgICAgICAgICAgICAgICAgIHByZXBheUlkOnJlcy5kYXRhLm1zZy5wcmVwYXlJZCxcclxuICAgICAgICAgICAgICAgICAgc3RhckN1cnJlbmN5Om1vbmV5KjEwLFxyXG4gICAgICAgICAgICAgICAgICBzdWNjZXNzOmZ1bmN0aW9uKHJlcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmlK/ku5jlm57osIPmiJDlip9cIixyZXMpXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgICBmYWlsOmZ1bmN0aW9uKHJlcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmlK/ku5jlm57osIPlpLHotKVcIixyZXMpXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICBjb21wbGV0ZTpmdW5jdGlvbihyZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pSv5LuY5Zue6LCDY29tcGxldGVcIixyZXMpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfS5iaW5kKHRoaXMpO1xyXG4gIHJlcXVpcmUoXCJ0aXBzX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5zaG93Rmlyc3RDaGFyZ2UocGF5Q2FsbEZ1bmMpO1xyXG59O1xyXG5cclxuXHJcblxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBRUVNESzsiXX0=