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
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/sdks/sh_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, '027ebFO+T1Dk5fPGU9ZJlNI', 'sh_sdk');
// Scripts/sdks/sh_sdk.js
 
"use strict";
 
// window.PLATFORM = "sh_sdk";                 // 平台号
// window.CHANNEL = "";               // 深海小游戏安卓和苹果的渠道
window.PACKAGE_NAME = "闪烁之光口袋版"; // 渠道号
// window.PACKAGE_VERSION = "0.0.18";
 
window.SH_SDK_PID = "0"; //深海小游戏区别安卓,苹果的pid , 
 
window.SH_SDK_AND_PID = "P0006089"; //诗悦-闪烁之光马包-安卓
 
window.SH_SDK_IOS_PID = "P0006090"; //诗悦-闪烁之光马包-ios
 
window.SH_SDK_FOLLOW = true; //深海小游戏关注功能显隐 true:关闭  false:开启 
 
var ShSdk = require("shsdk");
 
var RoleController = require("role_controller");
 
var LoginController = require("login_controller");
 
var WelfareEvent = require("welfare_event");
 
var SHSDK = function SHSDK() {};
 
SHSDK.uid = null;
SHSDK.sign = null;
SHSDK.role_info = null; // 判断是否授权
 
SHSDK.initSDK = function () {
  console.log("深海SDK相关");
  console.log(window);
  if (!window.wx) return;
  this.initTopInfo();
  var systemInfo = wx.getSystemInfoSync();
  var systemName = systemInfo.system;
  window.PLATFORM = "sy";
  window.PLATFORM_NAME = "sy";
 
  if (systemName.indexOf("iOS") > -1) {
    SH_SDK_PID = SH_SDK_IOS_PID;
  } else if (systemName.indexOf("Android") > -1) {
    SH_SDK_PID = SH_SDK_AND_PID;
  }
 
  CHANNEL = SH_SDK_PID;
  ShSdk.init({
    package_code: SH_SDK_PID //这是测试的切包编号,正式的请跟我们运营要
    // debug:true        //米大师沙箱支付控制
 
  });
  this.dataPlacement(10000);
  this.dataPlacement(20000);
  ShSdk.share(function () {
    //转发成功时调用这里代码
    console.log("ShSdk.share success callback");
  });
  wx.setKeepScreenOn({
    keepScreenOn: true
  });
  wx.onShow(function (res) {
    if (res) {
      gcore.GlobalEvent.fire(WelfareEvent.Update_SHWX_show_scene_val, res.scene);
    }
 
    wx.setKeepScreenOn({
      keepScreenOn: true
    });
  });
  wx.onHide(function (res) {
    wx.setKeepScreenOn({
      keepScreenOn: false
    });
  });
  wx.getSetting({
    success: function success(res) {
      cc.log(res);
 
      if (res.authSetting["scope.userInfo"]) {
        SHSDK.login();
      } else {
        var info = wx.getSystemInfoSync();
        var button = wx.createUserInfoButton({
          type: 'text',
          text: '',
          style: {
            left: 0,
            bottom: 0,
            width: info.screenWidth,
            height: info.screenHeight / 2,
            lineHeight: 40,
            backgroundColor: '',
            color: '#ffffff',
            textAlign: 'center',
            fontSize: 16,
            borderRadius: 4
          }
        });
        button.show();
        button.onTap(function (res) {
          button.hide();
          ShSdk.unionId(res);
          SHSDK.login();
          console.log(res);
        });
      }
    }
  });
}, SHSDK.login = function () {
  this.dataPlacement(30000);
  ShSdk.login(function (data) {
    this.dataPlacement(30001); //根据需要,做相应操作
 
    window.SH_SDK_TOKENID = data.tokenid;
    SHSDK.postFunc(function (result) {
      console.log(result);
      SHSDK.uid = result.msg.uid;
      SHSDK.sign = result.msg.sign;
      var login_data = {};
      login_data.usrName = "sh_" + SHSDK.uid;
      login_data.password = "wx123456";
      console.log("深海小游戏初始化成功,开始请求服务器列表");
      LoginController.getInstance().loginPlatformRequest(login_data);
    }.bind(this));
  });
};
 
SHSDK.postFunc = function (callback) {
  var xhr = cc.loader.getXMLHttpRequest();
  var url = "https://s1-h5mlf-h5sszg.shiyuegame.com/api.php/pf/diai/login/";
  url = url + "?tokenid=" + SH_SDK_TOKENID;
  url = url + "&cps=" + SH_SDK_PID;
  xhr.open("POST", url); //xhr.open("GET", ServerLink+link+"?"+parm,false);
 
  xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  xhr.send();
 
  xhr.onreadystatechange = function () {
    if (xhr.readyState == 4 && xhr.status >= 200 && xhr.status <= 207) {
      var result = JSON.parse(xhr.responseText);
      cc.log("result==>", result);
 
      if (result["error"] == -1) {
        message(result["msg"]);
        return;
      }
 
      SHSDK.dataPlacement(40000);
      callback(result);
    }
  };
}; // 计算小程序菜单位置
 
 
SHSDK.initTopInfo = function () {
  var menuInfo = wx.getMenuButtonBoundingClientRect();
  var systemInfo = wx.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("微信小游戏菜单栏的适配值");
  cc.log(WX_FIT);
}; // 链接游戏服,登陆游戏
 
 
SHSDK.loginGame = function () {
  var login_data = [];
 
  var _account = "sh_" + SHSDK.uid;
 
  var sign = SHSDK.sign;
  console.log("_account==>", _account);
  login_data = [{
    key: "channel",
    val: SH_SDK_PID
  }, {
    key: "package_name",
    val: PACKAGE_NAME
  }, {
    key: "package_version",
    val: PACKAGE_VERSION
  }, {
    key: "platform",
    val: PLATFORM
  }, {
    key: "account",
    val: _account
  }, {
    key: "token",
    val: SH_SDK_TOKENID
  }, {
    key: "sign",
    val: sign
  }];
  console.log("login_data==>", login_data);
  LoginController.getInstance().cusSDKLogin_2(login_data);
};
 
SHSDK.pay = function (money, buyNum, prodId, productName, productDesc, extension, coinNum) {
  var payCallFunc = function () {
    var roleVo = RoleController.getInstance().getRoleVo();
    if (!roleVo) return; //时间戳
 
    var date_time = Math.ceil(Date.now() / 1000); //充值订单号
 
    var game_number = SH_SDK_PID; //游戏编号P******;
 
    game_number = game_number + "_" + SHSDK.uid; //uid
 
    game_number = game_number + "_" + date_time; //时间戳
 
    cc.log("充值订单号game_number==>", game_number);
    productName = productName || money * 10 + "钻石";
    var loginData = LoginController.getInstance().getModel().getLoginData();
    var srv_id = "";
 
    if (roleVo && roleVo.srv_id) {
      srv_id = roleVo.srv_id;
    } else if (loginData.srv_id) {
      srv_id = loginData.srv_id;
    }
 
    var index = srv_id.indexOf("_");
 
    if (index != -1) {
      srv_id = Number(srv_id.slice(index + 1, srv_id.length));
    } else {
      srv_id = 0;
    } //充值拓展内容
 
 
    var severInfo = roleVo.srv_id.split("_");
    var platform = severInfo[0] || "";
    var zone_id = severInfo[1];
    var cps = SH_SDK_PID;
    var channel = SH_SDK_PID;
 
    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);
    cc.log("base64拓展参数_extension==>", _extension);
    var params = {
      game_no: game_number,
      //游戏订单号,由前端拼接
      order_money: money * 100,
      //充值金额,单位 分
      order_name: productName,
      //订单名称
      role_id: roleVo.rid,
      //角色id,必传项
      role_name: roleVo.name,
      //角色名,
      role_level: roleVo.lev,
      //角色等级,用于判断角色等级,控制充值入口,必传项
      server_id: srv_id,
      //区服id,必传项
      server_name: loginData.srv_name,
      //区服名称,必传项
      ext: _extension //扩展信息,通知发货时会原样返回
 
    };
    console.log("充值数据", params);
    ShSdk.pay(params, function (data) {
      if (data.ret == 'SUCCESS') {
        //前端通知,不能做为实际发货的凭证,真实情况以服务端通知为准
        console.log("支付完成");
        wx.showModal({
          title: "支付成功",
          content: "支付成功"
        });
      } else if (data.ret == 'YD_TIPS') {
        wx.showModal({
          title: "温馨提示",
          content: data.msg //充值引导文字,由我们后台配置
 
        });
      } else if (data.ret == 'NOT_ALLOW') {
        wx.showModal({
          title: "支付失败",
          content: "暂不支持支付"
        });
      } else {
        console.log("支付取消或失败");
      }
    }.bind(this));
  }.bind(this);
 
  require("tips_controller").getInstance().showFirstCharge(payCallFunc);
}; //主动拉起转发 可用于游戏内按钮事件触发,分享内容由我们这边后台配置,不需要传参,【支持传参,格式如:key=111&aaa=333】
// 传参模式:ShSdk.goShare('key=111&aaa=333');
// 不传参模式:ShSdk.goShare();
 
 
SHSDK.goShare = function (data) {
  if (data) {
    ShSdk.goShare(data);
  } else {
    ShSdk.goShare();
  }
}; // 获取公众号关注状态接口【特别说明:目前还没有公众号,所以暂时没有关注回调信息】
 
 
SHSDK.subscribe = function () {
  ShSdk.subscribe(function (ret) {
    //说明【关注状态->subscribe,1:已关注,0:取消关注,关注|取消关注时间->subscribe_time】
    console.log('公众号关注状态获取结果', ret);
  });
}; // 添加数据埋点推送方法,请在对应的节点上调用此方法
 
 
SHSDK.dataPlacement = function (actionId) {
  ShSdk.dataPlacement({
    action: actionId
  });
}; // 客服
 
 
SHSDK.openCustomerServiceConversation = function () {
  if (window.wx) {
    wx.openCustomerServiceConversation();
  }
};
 
SHSDK.setRoleInfo = function (data) {
  var loginData = LoginController.getInstance().getModel().getLoginData();
  if (loginData.srv_id == "") return;
  var roleVo = RoleController.getInstance().getRoleVo() || data;
  var srv_id;
 
  if (roleVo && roleVo.srv_id) {
    srv_id = roleVo.srv_id;
  } else if (loginData.srv_id) {
    srv_id = loginData.srv_id;
  }
 
  var index = srv_id.indexOf("_");
 
  if (index != -1) {
    srv_id = Number(srv_id.slice(index + 1, srv_id.length));
  } else {
    srv_id = 0;
  }
 
  this.role_info = {
    role_id: roleVo && roleVo.rid || 0,
    //角色ID
    role_name: roleVo && roleVo.name || "",
    //角色名
    role_level: roleVo && roleVo.lev || 1,
    //角色等级
    server_id: srv_id,
    //区服编号
    server_name: loginData.srv_name,
    //区服名称
    has_gold: roleVo && roleVo.gold || 0,
    //角色所持有货币数
    vip_level: roleVo && roleVo.vip_lev || 0,
    //角色vip等级 没有可以传0
    role_power: roleVo && roleVo.power || 0,
    //int 战力、武力之类角色的核心数值,没有可以传0
    create_time: roleVo && roleVo.reg_time || 0 //时间戳,单位:秒
 
  };
}; //角色登录提交
 
 
SHSDK.submitLogin = function () {
  if (gcore.SysEnv.get("shsdk_account") == this.uid) {
    return;
  }
 
  gcore.SysEnv.set("shsdk_account", this.uid);
  this.setRoleInfo();
  console.log("角色登录提交一次--role_info==>", this.role_info);
 
  if (PLATFORM_TYPR == "SH_SDK") {
    ShSdk.enterGame(this.role_info, function (ret) {
      console.log('角色上报,返回支付情况', ret);
 
      if (ret.data.msg.sp != null) {
        window.IS_SHOW_CHARGE = ret.data.msg.sp;
      }
 
      if (ret.data.msg.follow != null) {
        window.SH_SDK_FOLLOW = ret.data.msg.follow;
      }
    });
    cc.log("登录上报方法成功-----");
  }
}; //创建角色信息上报
 
 
SHSDK.createRole = function (data) {
  this.dataPlacement(90200);
  this.setRoleInfo(data);
  cc.log("创角提交一次上报---->", this.role_info);
  ShSdk.createRole(this.role_info, function (ret) {
    console.log('角色上报,返回支付情况', ret);
 
    if (ret.data.msg.sp != null) {
      window.IS_SHOW_CHARGE = ret.data.msg.sp;
    }
 
    if (ret.data.msg.follow != null) {
      window.SH_SDK_FOLLOW = ret.data.msg.follow;
    }
  }.bind(this));
}; //角色升级信息上报
 
 
SHSDK.roleUpLevel = function (value) {
  this.setRoleInfo();
  if (this.role_info && this.role_info.create_time == 0) return;
 
  if (value != null && value > 1) {
    this.role_info.role_level = value;
    console.log('角色升级信息上报', this.role_info);
    ShSdk.roleUpLevel(this.role_info, function (ret) {
      console.log('角色上报,返回支付情况', ret);
 
      if (ret.data.msg.sp != null) {
        window.IS_SHOW_CHARGE = ret.data.msg.sp;
      }
 
      if (ret.data.msg.follow != null) {
        window.SH_SDK_FOLLOW = ret.data.msg.follow;
      }
    }.bind(this));
    cc.log("角色升级上报提交--->", this.role_info);
  } else {
    cc.log("角色升级上报提交失败--->", this.role_info, value);
  }
};
 
SHSDK.sdkBackLogin = function () {};
 
SHSDK.getCurrChannel = function () {};
 
SHSDK.getSubChannel = function () {};
 
SHSDK.setClipboardData = function (desc) {
  wx.setClipboardData({
    data: desc,
    success: function success(res) {}
  });
};
 
module.exports = SHSDK;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcc2Rrc1xcc2hfc2RrLmpzIl0sIm5hbWVzIjpbIndpbmRvdyIsIlBBQ0tBR0VfTkFNRSIsIlNIX1NES19QSUQiLCJTSF9TREtfQU5EX1BJRCIsIlNIX1NES19JT1NfUElEIiwiU0hfU0RLX0ZPTExPVyIsIlNoU2RrIiwicmVxdWlyZSIsIlJvbGVDb250cm9sbGVyIiwiTG9naW5Db250cm9sbGVyIiwiV2VsZmFyZUV2ZW50IiwiU0hTREsiLCJ1aWQiLCJzaWduIiwicm9sZV9pbmZvIiwiaW5pdFNESyIsImNvbnNvbGUiLCJsb2ciLCJ3eCIsImluaXRUb3BJbmZvIiwic3lzdGVtSW5mbyIsImdldFN5c3RlbUluZm9TeW5jIiwic3lzdGVtTmFtZSIsInN5c3RlbSIsIlBMQVRGT1JNIiwiUExBVEZPUk1fTkFNRSIsImluZGV4T2YiLCJDSEFOTkVMIiwiaW5pdCIsInBhY2thZ2VfY29kZSIsImRhdGFQbGFjZW1lbnQiLCJzaGFyZSIsInNldEtlZXBTY3JlZW5PbiIsImtlZXBTY3JlZW5PbiIsIm9uU2hvdyIsInJlcyIsImdjb3JlIiwiR2xvYmFsRXZlbnQiLCJmaXJlIiwiVXBkYXRlX1NIV1hfc2hvd19zY2VuZV92YWwiLCJzY2VuZSIsIm9uSGlkZSIsImdldFNldHRpbmciLCJzdWNjZXNzIiwiY2MiLCJhdXRoU2V0dGluZyIsImxvZ2luIiwiaW5mbyIsImJ1dHRvbiIsImNyZWF0ZVVzZXJJbmZvQnV0dG9uIiwidHlwZSIsInRleHQiLCJzdHlsZSIsImxlZnQiLCJib3R0b20iLCJ3aWR0aCIsInNjcmVlbldpZHRoIiwiaGVpZ2h0Iiwic2NyZWVuSGVpZ2h0IiwibGluZUhlaWdodCIsImJhY2tncm91bmRDb2xvciIsImNvbG9yIiwidGV4dEFsaWduIiwiZm9udFNpemUiLCJib3JkZXJSYWRpdXMiLCJzaG93Iiwib25UYXAiLCJoaWRlIiwidW5pb25JZCIsImRhdGEiLCJTSF9TREtfVE9LRU5JRCIsInRva2VuaWQiLCJwb3N0RnVuYyIsInJlc3VsdCIsIm1zZyIsImxvZ2luX2RhdGEiLCJ1c3JOYW1lIiwicGFzc3dvcmQiLCJnZXRJbnN0YW5jZSIsImxvZ2luUGxhdGZvcm1SZXF1ZXN0IiwiYmluZCIsImNhbGxiYWNrIiwieGhyIiwibG9hZGVyIiwiZ2V0WE1MSHR0cFJlcXVlc3QiLCJ1cmwiLCJvcGVuIiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwic3RhdHVzIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0IiwibWVzc2FnZSIsIm1lbnVJbmZvIiwiZ2V0TWVudUJ1dHRvbkJvdW5kaW5nQ2xpZW50UmVjdCIsInRvcCIsIldYX0ZJVCIsImxvZ2luR2FtZSIsIl9hY2NvdW50Iiwia2V5IiwidmFsIiwiUEFDS0FHRV9WRVJTSU9OIiwiY3VzU0RLTG9naW5fMiIsInBheSIsIm1vbmV5IiwiYnV5TnVtIiwicHJvZElkIiwicHJvZHVjdE5hbWUiLCJwcm9kdWN0RGVzYyIsImV4dGVuc2lvbiIsImNvaW5OdW0iLCJwYXlDYWxsRnVuYyIsInJvbGVWbyIsImdldFJvbGVWbyIsImRhdGVfdGltZSIsIk1hdGgiLCJjZWlsIiwiRGF0ZSIsIm5vdyIsImdhbWVfbnVtYmVyIiwibG9naW5EYXRhIiwiZ2V0TW9kZWwiLCJnZXRMb2dpbkRhdGEiLCJzcnZfaWQiLCJpbmRleCIsIk51bWJlciIsInNsaWNlIiwibGVuZ3RoIiwic2V2ZXJJbmZvIiwic3BsaXQiLCJwbGF0Zm9ybSIsInpvbmVfaWQiLCJjcHMiLCJjaGFubmVsIiwiX2V4dGVuc2lvbiIsInJpZCIsImJhc2VfNjQiLCJCYXNlNjQiLCJlbmNvZGUiLCJwYXJhbXMiLCJnYW1lX25vIiwib3JkZXJfbW9uZXkiLCJvcmRlcl9uYW1lIiwicm9sZV9pZCIsInJvbGVfbmFtZSIsIm5hbWUiLCJyb2xlX2xldmVsIiwibGV2Iiwic2VydmVyX2lkIiwic2VydmVyX25hbWUiLCJzcnZfbmFtZSIsImV4dCIsInJldCIsInNob3dNb2RhbCIsInRpdGxlIiwiY29udGVudCIsInNob3dGaXJzdENoYXJnZSIsImdvU2hhcmUiLCJzdWJzY3JpYmUiLCJhY3Rpb25JZCIsImFjdGlvbiIsIm9wZW5DdXN0b21lclNlcnZpY2VDb252ZXJzYXRpb24iLCJzZXRSb2xlSW5mbyIsImhhc19nb2xkIiwiZ29sZCIsInZpcF9sZXZlbCIsInZpcF9sZXYiLCJyb2xlX3Bvd2VyIiwicG93ZXIiLCJjcmVhdGVfdGltZSIsInJlZ190aW1lIiwic3VibWl0TG9naW4iLCJTeXNFbnYiLCJnZXQiLCJzZXQiLCJQTEFURk9STV9UWVBSIiwiZW50ZXJHYW1lIiwic3AiLCJJU19TSE9XX0NIQVJHRSIsImZvbGxvdyIsImNyZWF0ZVJvbGUiLCJyb2xlVXBMZXZlbCIsInZhbHVlIiwic2RrQmFja0xvZ2luIiwiZ2V0Q3VyckNoYW5uZWwiLCJnZXRTdWJDaGFubmVsIiwic2V0Q2xpcGJvYXJkRGF0YSIsImRlc2MiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQUEsTUFBTSxDQUFDQyxZQUFQLEdBQXNCLFNBQXRCLEVBQWtDO0FBQ2xDOztBQUNBRCxNQUFNLENBQUNFLFVBQVAsR0FBb0IsR0FBcEIsRUFBeUM7O0FBQ3pDRixNQUFNLENBQUNHLGNBQVAsR0FBd0IsVUFBeEIsRUFBMkM7O0FBQzNDSCxNQUFNLENBQUNJLGNBQVAsR0FBd0IsVUFBeEIsRUFBeUM7O0FBQ3pDSixNQUFNLENBQUNLLGFBQVAsR0FBdUIsSUFBdkIsRUFBNkM7O0FBRTdDLElBQUlDLEtBQUssR0FBR0MsT0FBTyxDQUFDLE9BQUQsQ0FBbkI7O0FBQ0EsSUFBSUMsY0FBYyxHQUFHRCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUUsZUFBZSxHQUFHRixPQUFPLENBQUMsa0JBQUQsQ0FBN0I7O0FBQ0EsSUFBSUcsWUFBWSxHQUFHSCxPQUFPLENBQUMsZUFBRCxDQUExQjs7QUFHQSxJQUFJSSxLQUFLLEdBQUcsU0FBUkEsS0FBUSxH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QUFsQztBQVVBcEMsSUFBQUEsRUFBRSxDQUFDM0IsR0FBSCxDQUFPLGNBQVAsRUFBdUIsS0FBS0gsU0FBNUI7QUFDSCxHQWRELE1BY087QUFDSDhCLElBQUFBLEVBQUUsQ0FBQzNCLEdBQUgsQ0FBTyxnQkFBUCxFQUF5QixLQUFLSCxTQUE5QixFQUF5QzJLLEtBQXpDO0FBQ0g7QUFDRixDQXJCRDs7QUF1QkE5SyxLQUFLLENBQUMrSyxZQUFOLEdBQXFCLFlBQVksQ0FDaEMsQ0FERDs7QUFHQS9LLEtBQUssQ0FBQ2dMLGNBQU4sR0FBdUIsWUFBWSxDQUVsQyxDQUZEOztBQUlBaEwsS0FBSyxDQUFDaUwsYUFBTixHQUFzQixZQUFZLENBRWpDLENBRkQ7O0FBSUFqTCxLQUFLLENBQUNrTCxnQkFBTixHQUF5QixVQUFVQyxJQUFWLEVBQWdCO0FBQ3ZDNUssRUFBQUEsRUFBRSxDQUFDMkssZ0JBQUgsQ0FBb0I7QUFDbEJ4SCxJQUFBQSxJQUFJLEVBQUV5SCxJQURZO0FBRWxCbkosSUFBQUEsT0FGa0IsbUJBRVRSLEdBRlMsRUFFSixDQUViO0FBSmlCLEdBQXBCO0FBTUQsQ0FQRDs7QUFXQTRKLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnJMLEtBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyB3aW5kb3cuUExBVEZPUk0gPSBcInNoX3Nka1wiOyAgICAgICAgICAgICAgICAgLy8g5bmz5Y+w5Y+3XHJcbi8vIHdpbmRvdy5DSEFOTkVMID0gXCJcIjsgICAgICAgICAgICAgICAvLyDmt7HmtbflsI/muLjmiI/lronljZPlkozoi7nmnpznmoTmuKDpgZNcclxud2luZG93LlBBQ0tBR0VfTkFNRSA9IFwi6Zeq54OB5LmL5YWJ5Y+j6KKL54mIXCI7ICAvLyDmuKDpgZPlj7dcclxuLy8gd2luZG93LlBBQ0tBR0VfVkVSU0lPTiA9IFwiMC4wLjE4XCI7XHJcbndpbmRvdy5TSF9TREtfUElEID0gXCIwXCI7ICAgICAgICAgICAgICAgICAvL+a3sea1t+Wwj+a4uOaIj+WMuuWIq+WuieWNk++8jOiLueaenOeahHBpZCDvvIwgXHJcbndpbmRvdy5TSF9TREtfQU5EX1BJRCA9IFwiUDAwMDYwODlcIjsgICAgICAgIC8v6K+X5oKmLemXqueDgeS5i+WFiemprOWMhS3lronljZNcclxud2luZG93LlNIX1NES19JT1NfUElEID0gXCJQMDAwNjA5MFwiOyAgICAgIC8v6K+X5oKmLemXqueDgeS5i+WFiemprOWMhS1pb3Ncclxud2luZG93LlNIX1NES19GT0xMT1cgPSB0cnVlOyAgICAgICAgICAgICAgICAgLy/mt7HmtbflsI/muLjmiI/lhbPms6jlip/og73mmL7pmpAgdHJ1ZTrlhbPpl60gIGZhbHNl77ya5byA5ZCvIFxyXG5cclxudmFyIFNoU2RrID0gcmVxdWlyZShcInNoc2RrXCIpO1xyXG52YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xyXG52YXIgTG9naW5Db250cm9sbGVyID0gcmVxdWlyZShcImxvZ2luX2NvbnRyb2xsZXJcIik7XHJcbnZhciBXZWxmYXJlRXZlbnQgPSByZXF1aXJlKFwid2VsZmFyZV9ldmVudFwiKTtcclxuXHJcblxyXG52YXIgU0hTREsgPSBmdW5jdGlvbigpIHtcclxuXHJcbn1cclxuXHJcblNIU0RLLnVpZCA9IG51bGw7XHJcblNIU0RLLnNpZ24gPSBudWxsO1xyXG5TSFNESy5yb2xlX2luZm8gPSBudWxsO1xyXG5cclxuLy8g5Yik5pat5piv5ZCm5o6I5p2DXHJcblNIU0RLLmluaXRTREsgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnNvbGUubG9nKFwi5rex5rW3U0RL55u45YWzXCIpO1xyXG4gICAgY29uc29sZS5sb2cod2luZG93KTtcclxuXHJcbiAgIFxyXG4gICAgICBpZiAoIXdpbmRvdy53eCkgIHJldHVybjtcclxuICBcclxuICAgICAgdGhpcy5pbml0VG9wSW5mbygpO1xyXG5cclxuICAgICAgdmFyIHN5c3RlbUluZm8gPSB3eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICB2YXIgc3lzdGVtTmFtZSA9IHN5c3RlbUluZm8uc3lzdGVtO1xyXG4gICAgICBcclxuICAgICAgd2luZG93LlBMQVRGT1JNID0gXCJzeVwiO1xyXG4gICAgICB3aW5kb3cuUExBVEZPUk1fTkFNRSA9IFwic3lcIjtcclxuXHJcbiAgICAgIGlmKHN5c3RlbU5hbWUuaW5kZXhPZihcImlPU1wiKT4tMSl7XHJcbiAgICAgICAgU0hfU0RLX1BJRCA9IFNIX1NES19JT1NfUElEO1xyXG4gICAgICB9ZWxzZSBpZihzeXN0ZW1OYW1lLmluZGV4T2YoXCJBbmRyb2lkXCIpPi0xKXtcclxuICAgICAgICBTSF9TREtfUElEID0gU0hfU0RLX0FORF9QSUQ7XHJcbiAgICAgIH1cclxuICAgICAgQ0hBTk5FTCA9IFNIX1NES19QSUQ7XHJcbiAgICAgIFNoU2RrLmluaXQoe1xyXG4gICAgICAgIHBhY2thZ2VfY29kZTogU0hfU0RLX1BJRCwgLy/ov5nmmK/mtYvor5XnmoTliIfljIXnvJblj7fvvIzmraPlvI/nmoTor7fot5/miJHku6zov5DokKXopoFcclxuICAgICAgICAvLyBkZWJ1Zzp0cnVlXHRcdC8v57Gz5aSn5biI5rKZ566x5pSv5LuY5o6n5Yi2XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5kYXRhUGxhY2VtZW50KDEwMDAwKTtcclxuICAgICAgdGhpcy5kYXRhUGxhY2VtZW50KDIwMDAwKTtcclxuXHJcbiAgICAgIFNoU2RrLnNoYXJlKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgLy/ovazlj5HmiJDlip/ml7bosIPnlKjov5nph4zku6PnoIFcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlNoU2RrLnNoYXJlIHN1Y2Nlc3MgY2FsbGJhY2tcIik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgd3guc2V0S2VlcFNjcmVlbk9uKHtcclxuICAgICAgICBrZWVwU2NyZWVuT246IHRydWVcclxuICAgICAgfSlcclxuICAgICAgd3gub25TaG93KGZ1bmN0aW9uKHJlcyl7XHJcbiAgICAgICAgaWYocmVzKXtcclxuICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoV2VsZmFyZUV2ZW50LlVwZGF0ZV9TSFdYX3Nob3dfc2NlbmVfdmFsLHJlcy5zY2VuZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHd4LnNldEtlZXBTY3JlZW5Pbih7XHJcbiAgICAgICAgICBrZWVwU2NyZWVuT246IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHd4Lm9uSGlkZShmdW5jdGlvbihyZXMpe1xyXG4gICAgICAgIHd4LnNldEtlZXBTY3JlZW5Pbih7XHJcbiAgICAgICAgICBrZWVwU2NyZWVuT246IGZhbHNlXHJcbiAgICAgICAgfSlcclxuICAgICAgfSk7XHJcbiAgICAgIFxyXG4gICAgICB3eC5nZXRTZXR0aW5nKHtcclxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHtcclxuICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgaWYgKHJlcy5hdXRoU2V0dGluZ1tcInNjb3BlLnVzZXJJbmZvXCJdKSB7XHJcbiAgICAgICAgICAgIFNIU0RLLmxvZ2luKCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgaW5mbyA9IHd4LmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgICAgIHZhciBidXR0b24gPSB3eC5jcmVhdGVVc2VySW5mb0J1dHRvbih7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnJyxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsXHJcbiAgICAgICAgICAgICAgICAgIGJvdHRvbTogMCxcclxuICAgICAgICAgICAgICAgICAgd2lkdGg6IGluZm8uc2NyZWVuV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogaW5mby5zY3JlZW5IZWlnaHQvMixcclxuICAgICAgICAgICAgICAgICAgbGluZUhlaWdodDogNDAsXHJcbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJycsXHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZmZmZicsXHJcbiAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAxNixcclxuICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiA0LFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBidXR0b24uc2hvdygpO1xyXG4gICAgICAgICAgICBidXR0b24ub25UYXAoKHJlcyk9PntcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICBTaFNkay51bmlvbklkKHJlcyk7XHJcbiAgICAgICAgICAgICAgICBTSFNESy5sb2dpbigpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbn0sXHJcblxyXG5cclxuU0hTREsubG9naW4gPSBmdW5jdGlvbigpe1xyXG4gIHRoaXMuZGF0YVBsYWNlbWVudCgzMDAwMCk7XHJcbiAgU2hTZGsubG9naW4oZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICB0aGlzLmRhdGFQbGFjZW1lbnQoMzAwMDEpO1xyXG4gICAgICAvL+agueaNrumcgOimge+8jOWBmuebuOW6lOaTjeS9nFxyXG4gICAgICB3aW5kb3cuU0hfU0RLX1RPS0VOSUQgPSBkYXRhLnRva2VuaWQ7XHJcbiAgICAgIFxyXG4gICAgICBcclxuICAgICAgU0hTREsucG9zdEZ1bmMoZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdClcclxuICAgICAgICBTSFNESy51aWQgPSByZXN1bHQubXNnLnVpZDtcclxuICAgICAgICBTSFNESy5zaWduID0gcmVzdWx0Lm1zZy5zaWduO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHZhciBsb2dpbl9kYXRhID0ge307XHJcbiAgICAgICAgbG9naW5fZGF0YS51c3JOYW1lID0gXCJzaF9cIiArIFNIU0RLLnVpZDtcclxuICAgICAgICBsb2dpbl9kYXRhLnBhc3N3b3JkID0gXCJ3eDEyMzQ1NlwiO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5rex5rW35bCP5ri45oiP5Yid5aeL5YyW5oiQ5Yqf77yM5byA5aeL6K+35rGC5pyN5Yqh5Zmo5YiX6KGoXCIpO1xyXG4gICAgICAgIExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmxvZ2luUGxhdGZvcm1SZXF1ZXN0KGxvZ2luX2RhdGEpO1xyXG4gICAgfS5iaW5kKHRoaXMpKVxyXG4gIH0pO1xyXG59XHJcblxyXG5TSFNESy5wb3N0RnVuYyA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xyXG4gIHZhciB4aHIgPSBjYy5sb2FkZXIuZ2V0WE1MSHR0cFJlcXVlc3QoKTtcclxuICB2YXIgdXJsID0gXCJodHRwczovL3MxLWg1bWxmLWg1c3N6Zy5zaGl5dWVnYW1lLmNvbS9hcGkucGhwL3BmL2RpYWkvbG9naW4vXCI7XHJcbiAgdXJsID0gdXJsICsgXCI/dG9rZW5pZD1cIiArIFNIX1NES19UT0tFTklEO1xyXG4gIHVybCA9IHVybCArIFwiJmNwcz1cIiArIFNIX1NES19QSUQ7XHJcbiAgeGhyLm9wZW4oXCJQT1NUXCIsIHVybCk7XHJcbiAgLy94aHIub3BlbihcIkdFVFwiLCBTZXJ2ZXJMaW5rK2xpbmsrXCI/XCIrcGFybSxmYWxzZSk7XHJcbiAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XHJcbiAgeGhyLnNlbmQoKTtcclxuICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT0gNCAmJiAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8PSAyMDcpKSB7XHJcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICAgIGNjLmxvZyhcInJlc3VsdD09PlwiLCByZXN1bHQpXHJcbiAgICAgICAgICBpZiAocmVzdWx0W1wiZXJyb3JcIl0gPT0gLTEpIHtcclxuICAgICAgICAgICAgICBtZXNzYWdlKHJlc3VsdFtcIm1zZ1wiXSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgU0hTREsuZGF0YVBsYWNlbWVudCg0MDAwMCk7XHJcbiAgICAgICAgICBjYWxsYmFjayhyZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgfTtcclxufVxyXG5cclxuLy8g6K6h566X5bCP56iL5bqP6I+c5Y2V5L2N572uXHJcblNIU0RLLmluaXRUb3BJbmZvID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgbWVudUluZm8gPSB3eC5nZXRNZW51QnV0dG9uQm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBcclxuICAgIHZhciBzeXN0ZW1JbmZvID0gd3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcclxuICAgIGlmKG1lbnVJbmZvLnRvcD4zMCl7XHJcbiAgICAgIHdpbmRvdy5XWF9GSVQgPSBtZW51SW5mby50b3AgLyBzeXN0ZW1JbmZvLnNjcmVlbkhlaWdodCAqMC43IHx8IDA7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgd2luZG93LldYX0ZJVCA9IG1lbnVJbmZvLnRvcCAvIHN5c3RlbUluZm8uc2NyZWVuSGVpZ2h0ICowLjEgfHwgMDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgY29uc29sZS5sb2coXCLlvq7kv6HlsI/muLjmiI/oj5zljZXmoI/nmoTpgILphY3lgLxcIik7XHJcbiAgICBjYy5sb2coV1hfRklUKTtcclxufVxyXG5cclxuLy8g6ZO+5o6l5ri45oiP5pyN77yM55m76ZmG5ri45oiPXHJcblNIU0RLLmxvZ2luR2FtZSA9IGZ1bmN0aW9uICgpIHtcclxuICB2YXIgbG9naW5fZGF0YSA9IFtdO1xyXG4gIHZhciBfYWNjb3VudCA9IFwic2hfXCIgKyBTSFNESy51aWQ7XHJcbiAgdmFyIHNpZ24gPSBTSFNESy5zaWduO1xyXG4gIGNvbnNvbGUubG9nKFwiX2FjY291bnQ9PT5cIiwgX2FjY291bnQpO1xyXG5cclxuICBsb2dpbl9kYXRhID0gW1xyXG4gICAgICB7IGtleTogXCJjaGFubmVsXCIsIHZhbDogU0hfU0RLX1BJRCB9LFxyXG4gICAgICB7IGtleTogXCJwYWNrYWdlX25hbWVcIiwgdmFsOiBQQUNLQUdFX05BTUUgfSxcclxuICAgICAgeyBrZXk6IFwicGFja2FnZV92ZXJzaW9uXCIsIHZhbDogUEFDS0FHRV9WRVJTSU9OIH0sXHJcbiAgICAgIHsga2V5OiBcInBsYXRmb3JtXCIsIHZhbDogUExBVEZPUk0gfSxcclxuICAgICAgeyBrZXk6IFwiYWNjb3VudFwiLCB2YWw6IF9hY2NvdW50IH0sXHJcbiAgICAgIHsga2V5OiBcInRva2VuXCIsIHZhbDogU0hfU0RLX1RPS0VOSUQgfSxcclxuICAgICAgeyBrZXk6IFwic2lnblwiLCB2YWw6IHNpZ24gfVxyXG4gIF07XHJcblxyXG4gIGNvbnNvbGUubG9nKFwibG9naW5fZGF0YT09PlwiLCBsb2dpbl9kYXRhKTtcclxuXHJcbiAgTG9naW5Db250cm9sbGVyLmdldEluc3RhbmNlKCkuY3VzU0RLTG9naW5fMihsb2dpbl9kYXRhKTtcclxufVxyXG5cclxuU0hTREsucGF5ID0gZnVuY3Rpb24obW9uZXksIGJ1eU51bSwgcHJvZElkLCBwcm9kdWN0TmFtZSwgcHJvZHVjdERlc2MsIGV4dGVuc2lvbiwgY29pbk51bSkge1xyXG4gICAgXHJcbiAgICB2YXIgcGF5Q2FsbEZ1bmMgPSBmdW5jdGlvbigpe1xyXG4gICAgICB2YXIgcm9sZVZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcclxuICAgICAgaWYgKCFyb2xlVm8pIHJldHVybjtcclxuICAgICAgXHJcbiAgICAgIC8v5pe26Ze05oizXHJcbiAgICAgIHZhciBkYXRlX3RpbWUgPSBNYXRoLmNlaWwoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG5cclxuICAgICAgLy/lhYXlgLzorqLljZXlj7dcclxuICAgICAgdmFyIGdhbWVfbnVtYmVyID0gU0hfU0RLX1BJRDsvL+a4uOaIj+e8luWPt1AqKioqKio7XHJcbiAgICAgIGdhbWVfbnVtYmVyID0gZ2FtZV9udW1iZXIgKyBcIl9cIiArIFNIU0RLLnVpZDsgICAgLy91aWRcclxuICAgICAgZ2FtZV9udW1iZXIgPSBnYW1lX251bWJlciArIFwiX1wiICsgZGF0ZV90aW1lOyAgICAvL+aXtumXtOaIs1xyXG4gICAgICBjYy5sb2coXCLlhYXlgLzorqLljZXlj7dnYW1lX251bWJlcj09PlwiLCBnYW1lX251bWJlcilcclxuXHJcbiAgICAgIHByb2R1Y3ROYW1lID0gcHJvZHVjdE5hbWUgfHwgKG1vbmV5ICogMTApICsgXCLpkrvnn7NcIjtcclxuICAgICAgbGV0IGxvZ2luRGF0YSA9IExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0TG9naW5EYXRhKCk7XHJcbiAgICAgIGxldCBzcnZfaWQgPSBcIlwiO1xyXG4gICAgICBpZiAocm9sZVZvICYmIHJvbGVWby5zcnZfaWQpIHtcclxuICAgICAgICAgIHNydl9pZCA9IHJvbGVWby5zcnZfaWQ7XHJcbiAgICAgIH0gZWxzZSBpZiAobG9naW5EYXRhLnNydl9pZCkge1xyXG4gICAgICAgICAgc3J2X2lkID0gbG9naW5EYXRhLnNydl9pZDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgaW5kZXggPSBzcnZfaWQuaW5kZXhPZihcIl9cIik7XHJcbiAgICAgIGlmIChpbmRleCAhPSAtMSkge1xyXG4gICAgICAgICAgc3J2X2lkID0gTnVtYmVyKHNydl9pZC5zbGljZShpbmRleCArIDEsIHNydl9pZC5sZW5ndGgpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNydl9pZCA9IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8v5YWF5YC85ouT5bGV5YaF5a65XHJcbiAgICAgIHZhciBzZXZlckluZm8gPSByb2xlVm8uc3J2X2lkLnNwbGl0KFwiX1wiKTtcclxuICAgICAgdmFyIHBsYXRmb3JtID0gc2V2ZXJJbmZvWzBdIHx8IFwiXCI7XHJcbiAgICAgIHZhciB6b25lX2lkID0gc2V2ZXJJbmZvWzFdO1xyXG4gICAgICB2YXIgY3BzID0gU0hfU0RLX1BJRDtcclxuICAgICAgdmFyIGNoYW5uZWwgPSBTSF9TREtfUElEO1xyXG5cclxuICAgICAgdmFyIF9leHRlbnNpb24gPSByb2xlVm8ucmlkICsgXCIkJFwiICsgcGxhdGZvcm0gKyBcIiQkXCIgKyB6b25lX2lkICtcclxuICAgICAgICAgIFwiJCRcIiArIGNoYW5uZWwgKyBcIiQkXCIgKyBwcm9kSWQgKyBcIiQkXCIgKyBwcm9kdWN0TmFtZSArIFwiJCRcIiArIGNwcyArIFwiJCRcIiArIGRhdGVfdGltZTtcclxuICAgICAgY2MubG9nKFwi5ouT5bGV5Y+C5pWwX2V4dGVuc2lvbj09PlwiLCBfZXh0ZW5zaW9uKVxyXG4gICAgICB2YXIgYmFzZV82NCA9IHJlcXVpcmUoXCJiYXNlNjRcIikuQmFzZTY0O1xyXG4gICAgICBfZXh0ZW5zaW9uID0gYmFzZV82NC5lbmNvZGUoX2V4dGVuc2lvbik7XHJcbiAgICAgIGNjLmxvZyhcImJhc2U2NOaLk+WxleWPguaVsF9leHRlbnNpb249PT5cIiwgX2V4dGVuc2lvbik7XHJcblxyXG4gICAgICBcclxuICAgICAgXHJcbiAgICAgIHZhciBwYXJhbXMgPSB7XHJcbiAgICAgICAgICBnYW1lX25vOiBnYW1lX251bWJlciwgICAvL+a4uOaIj+iuouWNleWPt++8jOeUseWJjeerr+aLvOaOpVxyXG4gICAgICAgICAgb3JkZXJfbW9uZXk6IG1vbmV5ICogMTAwLCAgICAgICAgICAgICAgICAgICAgICAvL+WFheWAvOmHkemine+8jOWNleS9jSDliIZcclxuICAgICAgICAgIG9yZGVyX25hbWU6IHByb2R1Y3ROYW1lLCAgICAgICAgICAgICAvL+iuouWNleWQjeensFxyXG4gICAgICAgICAgcm9sZV9pZDogcm9sZVZvLnJpZCwgICAgICAgICAgICAgICAgICAgICAgIC8v6KeS6ImyaWTvvIzlv4XkvKDpoblcclxuICAgICAgICAgIHJvbGVfbmFtZTogcm9sZVZvLm5hbWUsICAgICAgICAgICAgICAgICAgICAvL+inkuiJsuWQjSxcclxuICAgICAgICAgIHJvbGVfbGV2ZWw6IHJvbGVWby5sZXYsICAgICAgICAgICAgICAgICAgICAgIC8v6KeS6Imy562J57qn77yM55So5LqO5Yik5pat6KeS6Imy562J57qn77yM5o6n5Yi25YWF5YC85YWl5Y+j77yM5b+F5Lyg6aG5XHJcbiAgICAgICAgICBzZXJ2ZXJfaWQ6IHNydl9pZCwgICAgICAgICAgICAgICAgICAgICAgICAvL+WMuuacjWlk77yM5b+F5Lyg6aG5XHJcbiAgICAgICAgICBzZXJ2ZXJfbmFtZTogbG9naW5EYXRhLnNydl9uYW1lLCAgICAgICAgICAgICAgLy/ljLrmnI3lkI3np7DvvIzlv4XkvKDpoblcclxuICAgICAgICAgIGV4dDogX2V4dGVuc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5omp5bGV5L+h5oGv77yM6YCa55+l5Y+R6LSn5pe25Lya5Y6f5qC36L+U5ZueXHJcbiAgICAgICAgfTtcclxuICAgICAgXHJcbiAgICAgIGNvbnNvbGUubG9nKFwi5YWF5YC85pWw5o2uXCIscGFyYW1zKTtcclxuICAgICAgXHJcbiAgICAgIFNoU2RrLnBheShwYXJhbXMsXHJcbiAgICAgICAgICBmdW5jdGlvbihkYXRhKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGRhdGEucmV0ID09ICdTVUNDRVNTJykgeyAvL+WJjeerr+mAmuefpe+8jOS4jeiDveWBmuS4uuWunumZheWPkei0p+eahOWHreivge+8jOecn+WunuaDheWGteS7peacjeWKoeerr+mAmuefpeS4uuWHhlxyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuaUr+S7mOWujOaIkFwiKTtcclxuICAgICAgICAgICAgICAgICAgd3guc2hvd01vZGFsKHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCLmlK/ku5jmiJDlip9cIixcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBcIuaUr+S7mOaIkOWKn1wiXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5yZXQgPT0gJ1lEX1RJUFMnKSB7XHJcbiAgICAgICAgICAgICAgICB3eC5zaG93TW9kYWwoe1xyXG4gICAgICAgICAgICAgICAgICB0aXRsZTogXCLmuKnppqjmj5DnpLpcIixcclxuICAgICAgICAgICAgICAgICAgY29udGVudDogZGF0YS5tc2cgIC8v5YWF5YC85byV5a+85paH5a2X77yM55Sx5oiR5Lus5ZCO5Y+w6YWN572uXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEucmV0ID09J05PVF9BTExPVycpe1xyXG4gICAgICAgICAgICAgICAgd3guc2hvd01vZGFsKHtcclxuICAgICAgICAgICAgICAgICAgdGl0bGU6IFwi5pSv5LuY5aSx6LSlXCIsXHJcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFwi5pqC5LiN5pSv5oyB5pSv5LuYXCJcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmlK/ku5jlj5bmtojmiJblpLHotKVcIik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICk7XHJcbiAgICB9LmJpbmQodGhpcylcclxuICAgIHJlcXVpcmUoXCJ0aXBzX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5zaG93Rmlyc3RDaGFyZ2UocGF5Q2FsbEZ1bmMpO1xyXG59XHJcblxyXG4vL+S4u+WKqOaLiei1t+i9rOWPkSDlj6/nlKjkuo7muLjmiI/lhoXmjInpkq7kuovku7bop6blj5HvvIzliIbkuqvlhoXlrrnnlLHmiJHku6zov5novrnlkI7lj7DphY3nva7vvIzkuI3pnIDopoHkvKDlj4LvvIzjgJDmlK/mjIHkvKDlj4LvvIzmoLzlvI/lpoLvvJprZXk9MTExJmFhYT0zMzPjgJFcclxuLy8g5Lyg5Y+C5qih5byP77yaU2hTZGsuZ29TaGFyZSgna2V5PTExMSZhYWE9MzMzJyk7XHJcbi8vIOS4jeS8oOWPguaooeW8j++8mlNoU2RrLmdvU2hhcmUoKTtcclxuU0hTREsuZ29TaGFyZSA9IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgaWYoZGF0YSl7XHJcbiAgICBTaFNkay5nb1NoYXJlKGRhdGEpO1xyXG4gIH1lbHNle1xyXG4gICAgU2hTZGsuZ29TaGFyZSgpO1xyXG4gIH1cclxufVxyXG5cclxuLy8g6I635Y+W5YWs5LyX5Y+35YWz5rOo54q25oCB5o6l5Y+j44CQ54m55Yir6K+05piO77ya55uu5YmN6L+Y5rKh5pyJ5YWs5LyX5Y+377yM5omA5Lul5pqC5pe25rKh5pyJ5YWz5rOo5Zue6LCD5L+h5oGv44CRXHJcblNIU0RLLnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcclxuICBTaFNkay5zdWJzY3JpYmUoZnVuY3Rpb24ocmV0KXtcclxuICAgIC8v6K+05piO44CQ5YWz5rOo54q25oCBLT5zdWJzY3JpYmXvvIwx77ya5bey5YWz5rOo77yMMO+8muWPlua2iOWFs+azqO+8jOWFs+azqHzlj5bmtojlhbPms6jml7bpl7QtPnN1YnNjcmliZV90aW1l44CRXHJcbiAgICBjb25zb2xlLmxvZygn5YWs5LyX5Y+35YWz5rOo54q25oCB6I635Y+W57uT5p6cJyxyZXQpO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vLyDmt7vliqDmlbDmja7ln4vngrnmjqjpgIHmlrnms5XvvIzor7flnKjlr7nlupTnmoToioLngrnkuIrosIPnlKjmraTmlrnms5VcclxuU0hTREsuZGF0YVBsYWNlbWVudCA9IGZ1bmN0aW9uIChhY3Rpb25JZCkge1xyXG4gIFNoU2RrLmRhdGFQbGFjZW1lbnQoe1xyXG4gICAgYWN0aW9uOiBhY3Rpb25JZCxcclxuICB9KTtcclxufVxyXG5cclxuLy8g5a6i5pyNXHJcblNIU0RLLm9wZW5DdXN0b21lclNlcnZpY2VDb252ZXJzYXRpb24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgaWYod2luZG93Lnd4KXtcclxuICAgIHd4Lm9wZW5DdXN0b21lclNlcnZpY2VDb252ZXJzYXRpb24oKTtcclxuICB9XHJcbn1cclxuXHJcblxyXG5cclxuU0hTREsuc2V0Um9sZUluZm8gPSBmdW5jdGlvbiAoZGF0YSkge1xyXG4gIGxldCBsb2dpbkRhdGEgPSBMb2dpbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldExvZ2luRGF0YSgpO1xyXG4gIGlmIChsb2dpbkRhdGEuc3J2X2lkID09IFwiXCIpIHJldHVybjtcclxuICBsZXQgcm9sZVZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKSB8fCBkYXRhO1xyXG4gIGxldCBzcnZfaWQ7XHJcbiAgaWYgKHJvbGVWbyAmJiByb2xlVm8uc3J2X2lkKSB7XHJcbiAgICAgIHNydl9pZCA9IHJvbGVWby5zcnZfaWQ7XHJcbiAgfSBlbHNlIGlmIChsb2dpbkRhdGEuc3J2X2lkKSB7XHJcbiAgICAgIHNydl9pZCA9IGxvZ2luRGF0YS5zcnZfaWQ7XHJcbiAgfVxyXG4gIGxldCBpbmRleCA9IHNydl9pZC5pbmRleE9mKFwiX1wiKTtcclxuICBpZiAoaW5kZXggIT0gLTEpIHtcclxuICAgICAgc3J2X2lkID0gTnVtYmVyKHNydl9pZC5zbGljZShpbmRleCArIDEsIHNydl9pZC5sZW5ndGgpKTtcclxuICB9IGVsc2Uge1xyXG4gICAgICBzcnZfaWQgPSAwO1xyXG4gIH1cclxuICBcclxuICB0aGlzLnJvbGVfaW5mbyA9IHtcclxuICAgICAgcm9sZV9pZDogcm9sZVZvICYmIHJvbGVWby5yaWQgfHwgMCxcdFx0XHRcdFx0XHRcdFx0XHQvL+inkuiJsklEXHJcbiAgICAgIHJvbGVfbmFtZTogcm9sZVZvICYmIHJvbGVWby5uYW1lIHx8IFwiXCIsXHRcdFx0XHRcdFx0XHRcdC8v6KeS6Imy5ZCNXHJcbiAgICAgIHJvbGVfbGV2ZWw6IHJvbGVWbyAmJiByb2xlVm8ubGV2IHx8IDEsXHRcdFx0XHRcdFx0XHRcdFx0ICAgIC8v6KeS6Imy562J57qnXHJcbiAgICAgIHNlcnZlcl9pZDogc3J2X2lkLFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8v5Yy65pyN57yW5Y+3XHJcbiAgICAgIHNlcnZlcl9uYW1lOiBsb2dpbkRhdGEuc3J2X25hbWUsIFx0XHRcdC8v5Yy65pyN5ZCN56ewXHJcbiAgICAgIGhhc19nb2xkOiByb2xlVm8gJiYgcm9sZVZvLmdvbGQgfHwgMCxcdFx0XHRcdFx0XHRcdFx0XHQgIC8v6KeS6Imy5omA5oyB5pyJ6LSn5biB5pWwXHJcbiAgICAgIHZpcF9sZXZlbDogcm9sZVZvICYmIHJvbGVWby52aXBfbGV2IHx8IDAsXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICAvL+inkuiJsnZpcOetiee6pyDmsqHmnInlj6/ku6XkvKAwXHJcbiAgICAgIHJvbGVfcG93ZXI6IHJvbGVWbyAmJiByb2xlVm8ucG93ZXIgfHwgMCwgXHRcdFx0XHRcdFx0XHRcdFx0ICAvL2ludCDmiJjlipvjgIHmrablipvkuYvnsbvop5LoibLnmoTmoLjlv4PmlbDlgLzvvIzmsqHmnInlj6/ku6XkvKAwXHJcbiAgICAgIGNyZWF0ZV90aW1lOiByb2xlVm8gJiYgcm9sZVZvLnJlZ190aW1lIHx8IDAgICAvL+aXtumXtOaIs++8jOWNleS9je+8muenklxyXG4gIH07XHJcbn1cclxuXHJcbi8v6KeS6Imy55m75b2V5o+Q5LqkXHJcblNIU0RLLnN1Ym1pdExvZ2luID0gZnVuY3Rpb24gKCkge1xyXG4gIGlmIChnY29yZS5TeXNFbnYuZ2V0KFwic2hzZGtfYWNjb3VudFwiKSA9PSB0aGlzLnVpZCkge1xyXG4gICAgICByZXR1cm5cclxuICB9XHJcbiAgZ2NvcmUuU3lzRW52LnNldChcInNoc2RrX2FjY291bnRcIiwgdGhpcy51aWQpO1xyXG5cclxuICB0aGlzLnNldFJvbGVJbmZvKCk7XHJcblxyXG4gIGNvbnNvbGUubG9nKFwi6KeS6Imy55m75b2V5o+Q5Lqk5LiA5qyhLS1yb2xlX2luZm89PT5cIiwgdGhpcy5yb2xlX2luZm8pO1xyXG5cclxuICBpZiAoUExBVEZPUk1fVFlQUiA9PSBcIlNIX1NES1wiKSB7XHJcbiAgICBTaFNkay5lbnRlckdhbWUodGhpcy5yb2xlX2luZm8sIGZ1bmN0aW9uIChyZXQpIHtcclxuICAgICAgY29uc29sZS5sb2coJ+inkuiJsuS4iuaKpe+8jOi/lOWbnuaUr+S7mOaDheWGtScsIHJldCk7XHJcbiAgICAgIGlmKHJldC5kYXRhLm1zZy5zcCE9bnVsbCl7XHJcbiAgICAgICAgd2luZG93LklTX1NIT1dfQ0hBUkdFID0gcmV0LmRhdGEubXNnLnNwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHJldC5kYXRhLm1zZy5mb2xsb3chPW51bGwpe1xyXG4gICAgICAgIHdpbmRvdy5TSF9TREtfRk9MTE9XID0gcmV0LmRhdGEubXNnLmZvbGxvdztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjYy5sb2coXCLnmbvlvZXkuIrmiqXmlrnms5XmiJDlip8tLS0tLVwiKVxyXG4gIH1cclxufVxyXG5cclxuLy/liJvlu7rop5LoibLkv6Hmga/kuIrmiqVcclxuU0hTREsuY3JlYXRlUm9sZSA9IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgdGhpcy5kYXRhUGxhY2VtZW50KDkwMjAwKTtcclxuICB0aGlzLnNldFJvbGVJbmZvKGRhdGEpO1xyXG5cclxuICBjYy5sb2coXCLliJvop5Lmj5DkuqTkuIDmrKHkuIrmiqUtLS0tPlwiLCB0aGlzLnJvbGVfaW5mbyk7XHJcbiAgXHJcbiAgU2hTZGsuY3JlYXRlUm9sZSh0aGlzLnJvbGVfaW5mbywgZnVuY3Rpb24gKHJldCkge1xyXG4gICAgY29uc29sZS5sb2coJ+inkuiJsuS4iuaKpe+8jOi/lOWbnuaUr+S7mOaDheWGtScsIHJldCk7XHJcbiAgICBpZihyZXQuZGF0YS5tc2cuc3AhPW51bGwpe1xyXG4gICAgICB3aW5kb3cuSVNfU0hPV19DSEFSR0UgPSByZXQuZGF0YS5tc2cuc3A7XHJcbiAgICB9XHJcbiAgICBpZihyZXQuZGF0YS5tc2cuZm9sbG93IT1udWxsKXtcclxuICAgICAgd2luZG93LlNIX1NES19GT0xMT1cgPSByZXQuZGF0YS5tc2cuZm9sbG93O1xyXG4gICAgfVxyXG4gIH0uYmluZCh0aGlzKSk7XHJcbn1cclxuXHJcbi8v6KeS6Imy5Y2H57qn5L+h5oGv5LiK5oqlXHJcblNIU0RLLnJvbGVVcExldmVsID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgdGhpcy5zZXRSb2xlSW5mbygpO1xyXG4gIGlmICh0aGlzLnJvbGVfaW5mbyAmJiB0aGlzLnJvbGVfaW5mby5jcmVhdGVfdGltZSA9PSAwKSByZXR1cm5cclxuXHJcbiAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgPiAxKSB7XHJcbiAgICAgIHRoaXMucm9sZV9pbmZvLnJvbGVfbGV2ZWwgPSB2YWx1ZTtcclxuICAgICAgY29uc29sZS5sb2coJ+inkuiJsuWNh+e6p+S/oeaBr+S4iuaKpScsIHRoaXMucm9sZV9pbmZvKTtcclxuICAgICAgU2hTZGsucm9sZVVwTGV2ZWwodGhpcy5yb2xlX2luZm8sIGZ1bmN0aW9uIChyZXQpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygn6KeS6Imy5LiK5oql77yM6L+U5Zue5pSv5LuY5oOF5Ya1JywgcmV0KTtcclxuICAgICAgICBpZihyZXQuZGF0YS5tc2cuc3AhPW51bGwpe1xyXG4gICAgICAgICAgd2luZG93LklTX1NIT1dfQ0hBUkdFID0gcmV0LmRhdGEubXNnLnNwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZihyZXQuZGF0YS5tc2cuZm9sbG93IT1udWxsKXtcclxuICAgICAgICAgIHdpbmRvdy5TSF9TREtfRk9MTE9XID0gcmV0LmRhdGEubXNnLmZvbGxvdztcclxuICAgICAgICB9XHJcbiAgICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgICAgIGNjLmxvZyhcIuinkuiJsuWNh+e6p+S4iuaKpeaPkOS6pC0tLT5cIiwgdGhpcy5yb2xlX2luZm8pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAgIGNjLmxvZyhcIuinkuiJsuWNh+e6p+S4iuaKpeaPkOS6pOWksei0pS0tLT5cIiwgdGhpcy5yb2xlX2luZm8sIHZhbHVlKTtcclxuICB9XHJcbn1cclxuXHJcblNIU0RLLnNka0JhY2tMb2dpbiA9IGZ1bmN0aW9uICgpIHtcclxufVxyXG5cclxuU0hTREsuZ2V0Q3VyckNoYW5uZWwgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG59XHJcblxyXG5TSFNESy5nZXRTdWJDaGFubmVsID0gZnVuY3Rpb24gKCkge1xyXG5cclxufVxyXG5cclxuU0hTREsuc2V0Q2xpcGJvYXJkRGF0YSA9IGZ1bmN0aW9uIChkZXNjKSB7XHJcbiAgd3guc2V0Q2xpcGJvYXJkRGF0YSh7XHJcbiAgICBkYXRhOiBkZXNjLFxyXG4gICAgc3VjY2VzcyAocmVzKSB7XHJcbiAgICAgIFxyXG4gICAgfVxyXG4gIH0pXHJcbn1cclxuXHJcblxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTSFNESztcclxuIl19