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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/partnersummon/view/partnersummon_show_window.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, '78c3aRo8gpItYMuh6K04FLu', 'partnersummon_show_window');
// Scripts/mod/partnersummon/view/partnersummon_show_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-01-16 11:47:41
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var GuideEvent = require("guide_event");
 
var PartnersummonConst = require("partnersummon_const");
 
var PartnersummonShowWindow = cc.Class({
  "extends": BaseView,
  properties: {
    skelton_data: null,
    conmmon_sp: null
  },
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("partnersummon", "partnersummon_show_window");
    this.viewTag = SCENE_TAG.dialogue; // 该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
 
    this.win_type = WinType.Full; // 是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
 
    this.ctrl = arguments[0];
    this.model = this.ctrl.getModel();
    this.show_bids = arguments[1];
    this.finish_cb = arguments[2];
    this.bg_type = arguments[3];
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {
    this.partnersummon_config = Config.recruit_data.data_partnersummon_data;
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {},
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {},
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(params) {
    this.initWidget();
    this.initBgInfo();
    this.showRecruit();
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    gcore.GlobalEvent.fire(GuideEvent.CloseTaskEffect);
 
    var PartnersummonController = require("partnersummon_controller");
 
    PartnersummonController.getInstance().openSummonGainShowWindow(false);
  },
  initBgInfo: function initBgInfo() {
    this.recruit_data = this.model.getRecruitData(); // 背景
 
    if (this.recruit_data) {
      var summon_cfg_item = this.partnersummon_config[this.recruit_data.group_id];
    }
 
    var resources_id = "partnersummon_call_bg_100";
 
    if (this.bg_type != null && this.bg_type == 2) {
      resources_id = "partnersummon_call_bg_200";
    }
 
    if (summon_cfg_item) resources_id = summon_cfg_item.call_bg;
    var bg_path = PathTool.getUIIconPath("bigbg/partnersummon", resources_id);
    this.loadRes(bg_path, function (bigbg_sf) {
      this.summon_bg_sp.spriteFrame = bigbg_sf;
    }.bind(this)); // 背景动画
    // var bg_effect_id = "140"
    // if (summon_cfg_item)
    //     bg_effect_id = summon_cfg_item.call_bg_action;
    // var effect_res = PathTool.getEffectRes(bg_effect_id);
    // var effect_path = PathTool.getSpinePath(effect_res, "action");
    // this.loadRes(effect_path, function(bg_sd) {
    //     this.bg_effect_sk.skeletonData = bg_sd;
    //     this.bg_effect_sk.setAnimation(0, "action", true);
    // }.bind(this));
  },
  initWidget: function initWidget() {
    this.summon_bg_sp = this.seekChild("summon_bg", cc.Sprite);
    this.bg_effect_sk = this.seekChild("bg_effect", sp.Skeleton);
    this.herocard_info_nd = this.seekChild("herocard_info");
    this.partnersummon_bg = this.seekChild("partnersummon_bg");
    this.summon_bg_nd = this.seekChild("summon_bg");
    this.summon_bg_nd.scale = this.summon_bg_nd.scale * FIT_SCALE;
    this.partnersummon_bg.scale = FIT_SCALE;
    this.share_conten_nd = this.seekChild("share_conten");
    this.show_conten_nd = this.seekChild("show_conten");
    this.skill_item_nd = this.seekChild("skill_item"); // 可复制的技能item
 
    this.star_item_nd = this.seekChild("star_item"); // 可复制的星星
 
    this.herocard_sp = this.seekChild("herocard", cc.Sprite);
    this.stars_conten_nd = this.seekChild("stars_conten");
    this.hero_type_sp = this.seekChild("hero_type", cc.Sprite);
    this.hero_name_lb = this.seekChild("hero_name", cc.Label);
    this.hero_slogn_lb = this.seekChild("hero_slogn", cc.Label);
    this.camp_type_sp = this.seekChild("camp_type", cc.Sprite); // 展示相关
 
    this.share_btn_nd = this.seekChild("share_btn");
    this.partnersummon_tag_bg_nd = this.seekChild("partnersummon_tag_bg");
    this.again_one_txt_nd = this.seekChild("again_one_txt");
    this.again_ten_txt_nd = this.seekChild("again_ten_txt");
    this.confirm_btn_nd = this.seekChild("confirm_btn");
 
    if (PLATFORM_TYPR == "QQ_SDK") {
      this.share_btn_nd.active = true; //临时屏蔽
    } else {
      this.share_btn_nd.active = false; //临时屏蔽
 
      this.confirm_btn_nd.x = 360;
    }
 
    this.skills_content_nd = this.seekChild("skills_content");
    this.reward_nd = this.seekChild("reward");
    this.reward_nd.active = false; //临时屏蔽
 
    this.get_des_nd = this.seekChild("get_des");
    this.gongxi_img_nd = this.seekChild("gongxi_img"); // 分享相关
 
    this.return_btn_nd = this.seekChild("return_btn");
    this.weixin_btn_nd = this.seekChild("weixin_btn");
    this.friend_btn_nd = this.seekChild("friend_btn");
    this.card_skeleton = this.seekChild("card_skelton", sp.Skeleton);
    this.card_skeleton.setCompleteListener(this.animaComplete.bind(this));
    this.get_anima_sp = this.seekChild("get_anima", sp.Skeleton);
    this.share_btn_nd.on(cc.Node.EventType.TOUCH_END, this.didClickShareBtn, this);
    this.confirm_btn_nd.on(cc.Node.EventType.TOUCH_END, this.didClickConfimBtn, this);
    this.return_btn_nd.on(cc.Node.EventType.TOUCH_END, this.didClickReturnBtn, this);
  },
  updateWidget: function updateWidget(bid_info) {
    if (!this.par_base_config || !this.par_star_config || !bid_info) return;
 
    if (bid_info.show_type && bid_info.show_type == PartnersummonConst.Gain_Show_Type.Skin_show) {
      var skin_config = Config.partner_skin_data.data_skin_info[bid_info.skin_id];
 
      if (skin_config) {
        this.hero_name_lb.string = skin_config.skin_name;
        this.hero_slogn_lb.string = cc.js.formatStr(Utils.TI18N("%s·皮肤"), this.par_base_config.name);
        this.stars_conten_nd.active = false;
        this.partnersummon_tag_bg_nd.active = false;
        return;
      }
    }
 
    var camp_path = PathTool.getHeroCampRes(this.par_base_config.camp_type); // var common_res_path = PathTool.getUIIconPath("partnersummon", camp_path);
    // this.loadRes(common_res_path, function(sf_obj){
    //     this.camp_type_sp.spriteFrame = sf_obj;
    // }.bind(this))
 
    this.loadRes(PathTool.getUIIconPath("common", camp_path), function (sf_obj) {
      this.camp_type_sp.spriteFrame = sf_obj;
    }.bind(this));
    var common_res_path_2 = PathTool.getUIIconPath("partnersummon", "partnersummon_type_" + this.par_base_config.type);
    this.loadRes(common_res_path_2, function (sf_obj) {
      this.hero_type_sp.spriteFrame = sf_obj;
    }.bind(this));
 
    if (this.par_base_config.voice) {
      Utils.playEffectSound(AUDIO_TYPE.DUBBING, this.par_base_config.voice);
    } // 星星
 
 
    this.stars_conten_nd.removeAllChildren();
 
    for (var i = 0; i < bid_info.init_star; i++) {
      var star_nd = cc.instantiate(this.star_item_nd);
      this.stars_conten_nd.addChild(star_nd);
    }
 
    this.hero_name_lb.string = this.par_base_config.name;
    this.hero_slogn_lb.string = this.par_base_config.hero_pos; // 技能
    // var SkillItem = require("skill_item");
    // this.skill_item = new SkillItem();
    // this.skill_item.setPosition(cc.v2(60, 90));
    // this.skill_item.setLeveStatus(false);
    // this.skill_item.setShowTips(true);
    // this.skill_item.setParent(this.container);
 
    this.skills_content_nd.removeAllChildren();
    var skill_list = this.par_star_config.skills;
 
    for (var skill_i = 0; skill_i < skill_list.length; skill_i++) {
      var skill_info = skill_list[skill_i];
 
      if (skill_info[0] != 1) {
        // var skill_config = gdata("skill_data", "data_get_skill", skill_info[1]);
        // var icon_path = PathTool.getIconPath("skillicon", skill_config.icon);
        var skill_nd = cc.instantiate(this.skill_item_nd);
        skill_nd.y = 0;
        var skill_con = skill_nd.getChildByName("skill_con"); // this.loadRes(icon_path, function(skill_item, sf_obj){
        //     if (skill_item && sf_obj) {
        //         var skill_item_sp = skill_item.getComponent(cc.Sprite);
        //         skill_item_sp.spriteFrame = sf_obj;
        //     }
        // }.bind(this, skill_item));
 
        this.skills_content_nd.addChild(skill_nd);
 
        var SkillItem = require("skill_item");
 
        var skill_item = new SkillItem();
        skill_item.setLeveStatus(false);
        skill_item.setShowTips(true);
        skill_item.setParent(skill_con);
        skill_item.setData(skill_info[1]);
        skill_item.showBG(false);
      }
    }
  },
  showRecruit: function showRecruit() {
    if (this.show_bids.length > 0) {
      // 重置显示
      this.show_conten_nd.active = false;
      this.herocard_info_nd.active = false;
      var bid_info = this.show_bids.shift();
      this.par_base_config = Config.partner_data.data_partner_base[bid_info.partner_bid];
      this.par_star_config = gdata("partner_data", "data_partner_star", bid_info.partner_bid.toString() + "_" + bid_info.init_star.toString()); // if (!this.conmmon_sp) {
      //     var common_atlas_path = PathTool.getResFrame("partnersummon", "partnersummon");
      //     this.loadRes(common_atlas_path, function(bid_info, atlas_obj) {
      //         this.conmmon_sp = atlas_obj;
      //         this.updateWidget(bid_info);
      //     }.bind(this, bid_info));
      // } else {
 
      this.updateWidget(bid_info); // }
      // 卡牌资源
 
      var card_path = null;
 
      if (bid_info.show_type && bid_info.show_type == PartnersummonConst.Gain_Show_Type.Skin_show) {
        var skin_config = Config.partner_skin_data.data_skin_info[bid_info.skin_id];
        card_path = PathTool.getBigBg("partnercard_" + skin_config.head_card_id, "png", "partnercard");
      } else {
        card_path = PathTool.getBigBg("partnercard_" + bid_info.partner_bid, "png", "partnercard");
      }
 
      this.loadRes(card_path, function (sf_bof) {
        this.herocard_sp.spriteFrame = sf_bof;
      }.bind(this)); // 卡牌动画
 
      var action_name = "action1";
 
      if (this.card_skeleton) {
        this.is_playing = true;
 
        if (this.card_skeleton.skeletonData) {
          this.card_skeleton.setAnimation(0, "action1");
        } else {
          var sketon_path = PathTool.getSpinePath("E51007", "action");
          this.loadRes(sketon_path, function (skeleton_data) {
            this.card_skeleton.skeletonData = skeleton_data;
            this.card_skeleton.setAnimation(0, "action1");
          }.bind(this));
        }
      } // 获得动作
 
 
      this.get_des_nd.scale = 1.5;
 
      if (!this.get_action) {
        var delay_act = cc.delayTime(0.1);
        var scale_act = cc.scaleTo(0.1, 1);
        var call_act = cc.callFunc(function () {
          // 获得动画
          if (this.get_anima_sp) {
            if (this.get_anima_sp.skeletonData) {
              this.get_anima_sp.setAnimation(0, "action");
            } else {
              var sketon_path = PathTool.getSpinePath("E50093", "action");
              this.loadRes(sketon_path, function (skeleton_data) {
                this.get_anima_sp.skeletonData = skeleton_data;
                this.get_anima_sp.setAnimation(0, "action");
              }.bind(this));
            }
          }
        }.bind(this));
        this.get_action = cc.sequence(call_act, delay_act, scale_act);
      }
 
      this.get_des_nd.runAction(this.get_action);
    }
  },
  didClickShareBtn: function didClickShareBtn(event) {
    Utils.playButtonSound(1);
 
    if (PLATFORM_TYPR == "QQ_SDK") {
      SDK.canvasToTempFilePath();
    } // this.share_conten_nd.active = true;
 
  },
  didClickConfimBtn: function didClickConfimBtn(event) {
    Utils.playButtonSound(1);
 
    if (this.show_bids.length > 0) {
      this.showRecruit();
    } else {
      if (this.finish_cb) this.finish_cb();
 
      var PartnersummonController = require("partnersummon_controller");
 
      PartnersummonController.getInstance().openSummonGainShowWindow(false);
    }
 
    if (window.TASK_TIPS) gcore.GlobalEvent.fire(GuideEvent.TaskNextStep, "confirm_btn"); //任务引导用到
  },
  didClickReturnBtn: function didClickReturnBtn() {
    Utils.playButtonSound(1);
    this.show_conten_nd.active = true;
    this.show_conten_nd.active = true;
    this.share_conten_nd.active = false;
  },
  animaComplete: function animaComplete(trackEntry, loopCount) {
    if (this.is_playing == false) return;
    var animationName = trackEntry.animation ? trackEntry.animation.name : "";
 
    if (animationName == "action1" || animationName == "action2") {
      this.card_skeleton.setAnimation(0, "action3", true);
      this.show_conten_nd.active = true;
      this.herocard_info_nd.active = true;
    }
 
    this.is_playing = false;
    this.shakeScreen(this.root_wnd);
  },
  shakeScreen: function shakeScreen(root_wnd) {
    var _this = this;
 
    var node = root_wnd;
 
    if (node.action) {
      this.is_shake = false;
      node.stopAllActions();
      node.action = null;
    }
 
    this.camera_shake_pos = root_wnd.getPosition();
    this.is_shake = true;
 
    var returnPos = function () {
      this.is_shake = false;
      node.setPosition(this.camera_shake_pos);
    }.bind(this);
 
    var order = [1, 4, 7, 8, 9, 6, 3, 2];
    var str = 15; //--振幅,单位像素
 
    var damp = 3; //--振动减衰, 单位像素
 
    var step = 0.015; //--振动间隔,单位秒
 
    var shakeXTime = 0.25; //--横向加倍
 
    var shakeYTime = 0.25; //--纵向加倍
 
    var shakeTime = 1; //--振动次数
 
    var xy_list = [[-0.7, 0.7], [0, 1], [0.7, 0.7], [-1, 0], [0, 0], [1, 0], [-0.7, -0.7], [0, -1], [0.7, -0.7]];
 
    var setRandomPos = function (index) {
      var pos_x, pos_y;
      pos_x = str * shakeYTime * xy_list[order[index] - 1][0];
      pos_y = -str * shakeXTime * xy_list[order[index] - 1][1];
      var pos = cc.v2(this.camera_shake_pos.x + pos_x, this.camera_shake_pos.y + pos_y);
      node.setPosition(pos);
    }.bind(this);
 
    var base_call = cc.delayTime(0);
 
    for (var j = 0; j < shakeTime; ++j) {
      var _loop = function _loop(i) {
        var delay = cc.delayTime(step);
        base_call = cc.sequence(base_call, cc.callFunc(function () {
          setRandomPos(i);
        }.bind(_this)), delay);
      };
 
      for (var i = 0; i < order.length; ++i) {
        _loop(i);
      }
 
      str = str - damp;
    }
 
    base_call = cc.sequence(base_call, cc.callFunc(returnPos));
    node.action = base_call;
    node.runAction(base_call);
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxwYXJ0bmVyc3VtbW9uXFx2aWV3XFxwYXJ0bmVyc3VtbW9uX3Nob3dfd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIkd1aWRlRXZlbnQiLCJQYXJ0bmVyc3VtbW9uQ29uc3QiLCJQYXJ0bmVyc3VtbW9uU2hvd1dpbmRvdyIsImNjIiwiQ2xhc3MiLCJCYXNlVmlldyIsInByb3BlcnRpZXMiLCJza2VsdG9uX2RhdGEiLCJjb25tbW9uX3NwIiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsImRpYWxvZ3VlIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiRnVsbCIsImN0cmwiLCJhcmd1bWVudHMiLCJtb2RlbCIsImdldE1vZGVsIiwic2hvd19iaWRzIiwiZmluaXNoX2NiIiwiYmdfdHlwZSIsImluaXRDb25maWciLCJwYXJ0bmVyc3VtbW9uX2NvbmZpZyIsIkNvbmZpZyIsInJlY3J1aXRfZGF0YSIsImRhdGFfcGFydG5lcnN1bW1vbl9kYXRhIiwib3BlbkNhbGxCYWNrIiwicmVnaXN0ZXJFdmVudCIsIm9wZW5Sb290V25kIiwicGFyYW1zIiwiaW5pdFdpZGdldCIsImluaXRCZ0luZm8iLCJzaG93UmVjcnVpdCIsImNsb3NlQ2FsbEJhY2siLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIkNsb3NlVGFza0VmZmVjdCIsIlBhcnRuZXJzdW1tb25Db250cm9sbGVyIiwiZ2V0SW5zdGFuY2UiLCJvcGVuU3VtbW9uR2FpblNob3dXaW5kb3ciLCJnZXRSZWNydWl0RGF0YSIsInN1bW1vbl9jZmdfaXRlbSIsImdyb3VwX2lkIiwicmVzb3VyY2VzX2lkIiwiY2FsbF9iZyIsImJnX3BhdGgiLCJnZXRVSUljb25QYXRoIiwibG9hZFJlcyIsImJpZ2JnX3NmIiwic3VtbW9uX2JnX3NwIiwic3ByaXRlRnJhbWUiLCJiaW5kIiwic2Vla0NoaWxkIiwiU3ByaXRlIiwiYmdfZWZmZWN0X3NrIiwic3AiLCJTa2VsZXRvbiIsImhlcm9jYXJkX2luZm9fbmQiLCJwYXJ0bmVyc3VtbW9uX2JnIiwic3VtbW9uX2JnX25kIiwic2NhbGUiLCJGSVRfU0NBTEUiLCJzaGFyZV9jb250ZW5fbmQiLCJzaG93X2NvbnRlbl9uZCIsInNraWxsX2l0ZW1fbmQiLCJzdGFyX2l0ZW1fbmQiLCJoZXJvY2FyZF9zcCIsInN0YXJzX2NvbnRlbl9uZCIsImhlcm9fdHlwZV9zcCIsImhlcm9fbmFtZV9sYiIsIkxhYmVsIiwiaGVyb19zbG9nbl9sYiIsImNhbXBfdHlwZV9zcCIsInNoYXJlX2J0bl9uZCIsInBhcnRuZXJzdW1tb25fdGFnX2JnX25kIiwiYWdhaW5fb25lX3R4dF9uZCIsImFnYWluX3Rlbl90eHRfbmQiLCJjb25maXJtX2J0bl9uZCIsIlBMQVRGT1JNX1RZUFIiLCJhY3RpdmUiLCJ4Iiwic2tpbGxzX2NvbnRlbnRfbmQiLCJyZXdhcmRfbmQiLCJnZXRfZGVzX25kIiwiZ29uZ3hpX2ltZ19uZCIsInJldHVybl9idG5fbmQiLCJ3ZWl4aW5fYnRuX25kIiwiZnJpZW5kX2J0bl9uZCIsImNhcmRfc2tlbGV0b24iLCJzZXRDb21wbGV0ZUxpc3RlbmVyIiwiYW5pbWFDb21wbGV0ZSIsImdldF9hbmltYV9zcCIsIm9uIiwiTm9kZSIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsImRpZENsaWNrU2hhcmVCdG4iLCJkaWRDbGlja0NvbmZpbUJ0biIsImRpZENsaWNrUmV0dXJuQnRuIiwidXBkYXRlV2lkZ2V0IiwiYmlkX2luZm8iLCJwYXJfYmFzZV9jb25maWciLCJwYXJfc3Rhcl9jb25maWciLCJzaG93X3R5cGUiLCJHYWluX1Nob3dfVHlwZSIsIlNraW5fc2hvdyIsInNraW5fY29uZmlnIiwicGFydG5lcl9za2luX2RhdGEiLCJkYXRhX3NraW5faW5mbyIsInNraW5faWQiLCJzdHJpbmciLCJza2luX25hbWUiLCJqcyIsImZvcm1hdFN0ciIsIlV0aWxzIiwiVEkxOE4iLCJuYW1lIiwiY2FtcF9wYXRoIiwiZ2V0SGVyb0NhbXBSZXMiLCJjYW1wX3R5cGUiLCJzZl9vYmoiLCJjb21tb25fcmVzX3BhdGhfMiIsInR5cGUiLCJ2b2ljZSIsInBsYXlFZmZlY3RTb3VuZCIsIkFVRElPX1RZUEUiLCJEVUJCSU5HIiwicmVtb3ZlQWxsQ2hpbGRyZW4iLCJpIiwiaW5pdF9zdGFyIiwic3Rhcl9uZCIsImluc3RhbnRpYXRlIiwiYWRkQ2hpbGQiLCJoZXJvX3BvcyIsInNraWxsX2xpc3QiLCJza2lsbHMiLCJza2lsbF9pIiwibGVuZ3RoIiwic2tpbGxfaW5mbyIsInNraWxsX25kIiwieSIsInNraWxsX2NvbiIsImdldENoaWxkQnlOYW1lIiwiU2tpbGxJdGVtIiwic2tpbGxfaXRlbSIsInNldExldmVTdGF0dXMiLCJzZXRTaG93VGlwcyIsInNldFBhcmVudCIsInNldERhdGEiLCJzaG93QkciLCJzaGlmdCIsInBhcnRuZXJfZGF0YSIsImRhdGFfcGFydG5lcl9iYXNlIiwicGFydG5lcl9iaWQiLCJnZGF0YSIsInRvU3RyaW5nIiwiY2FyZF9wYXRoIiwiZ2V0QmlnQmciLCJoZWFkX2NhcmRfaWQiLCJzZl9ib2YiLCJhY3Rpb25fbmFtZSIsImlzX3BsYXlpbmciLCJza2VsZXRvbkRhdGEiLCJzZXRBbmltYXRpb24iLCJza2V0b25fcGF0aCIsImdldFNwaW5lUGF0aCIsInNrZWxldG9uX2RhdGEiLCJnZXRfYWN0aW9uIiwiZGVsYXlfYWN0IiwiZGVsYXlUaW1lIiwic2NhbGVfYWN0Iiwic2NhbGVUbyIsImNhbGxfYWN0IiwiY2FsbEZ1bmMiLCJzZXF1ZW5jZSIsInJ1bkFjdGlvbiIsImV2ZW50IiwicGxheUJ1dHRvblNvdW5kIiwiU0RLIiwiY2FudmFzVG9UZW1wRmlsZVBhdGgiLCJ3aW5kb3ciLCJUQVNLX1RJUFMiLCJUYXNrTmV4dFN0ZXAiLCJ0cmFja0VudHJ5IiwibG9vcENvdW50IiwiYW5pbWF0aW9uTmFtZSIsImFuaW1hdGlvbiIsInNoYWtlU2NyZWVuIiwicm9vdF93bmQiLCJub2RlIiwiYWN0aW9uIiwiaXNfc2hha2UiLCJzdG9wQWxsQWN0aW9ucyIsImNhbWVyYV9zaGFrZV9wb3MiLCJnZXRQb3NpdGlvbiIsInJldHVyblBvcyIsInNldFBvc2l0aW9uIiwib3JkZXIiLCJzdHIiLCJkYW1wIiwic3RlcCIsInNoYWtlWFRpbWUiLCJzaGFrZVlUaW1lIiwic2hha2VUaW1lIiwieHlfbGlzdCIsInNldFJhbmRvbVBvcyIsImluZGV4IiwicG9zX3giLCJwb3NfeSIsInBvcyIsInYyIiwiYmFzZV9jYWxsIiwiaiIsImRlbGF5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsVUFBVSxHQUFHRCxPQUFPLENBQUMsYUFBRCxDQUF4Qjs7QUFDQSxJQUFJRSxrQkFBa0IsR0FBR0YsT0FBTyxDQUFDLHFCQUFELENBQWhDOztBQUVBLElBQUlHLHVCQUF1QixHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUNuQyxhQUFTQyxRQUQwQjtBQUduQ0MsRUFBQUEsVUFBVSxFQUFFO0FBQ1JDLElBQUFBLFlBQVksRUFBRSxJQUROO0FBRVJDLElBQUFBLFVBQVUsRUFBRTtBQUZKLEdBSHVCO0FBUW5DQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxVQUFMLEdBQWtCWixRQUFRLENBQUNhLGFBQVQsQ0FBdUIsZUFBdkIsRUFBd0MsMkJBQXhDLENBQWxCO0FBQ0EsU0FBS0MsT0FBTCxHQUFlQyxTQUFTLENBQUNDLFFBQXpCLENBRmMsQ0FFOEI7O0FBQzVDLFNBQUtDLFFBQUwsR0FBZ0JDLE9BQU8sQ0FBQ0MsSUFBeEIsQ0FIYyxDQUc4Qjs7QUFFNUMsU0FBS0MsSUFBTCxHQUFpQkMsU0FBUyxDQUFDLENBQUQsQ0FBMUI7QUFDQSxTQUFLQyxLQUFMLEdBQWlCLEtBQUtGLElBQUwsQ0FBVUcsUUFBVixFQUFqQjtBQUNBLFNBQUtDLFNBQUws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QUFDK0ssUUFBSCxDQUFZc0IsU0FBWixDQUF2QixDQUFaO0FBQ0FOLElBQUFBLElBQUksQ0FBQ0MsTUFBTCxHQUFjcUIsU0FBZDtBQUNBdEIsSUFBQUEsSUFBSSxDQUFDZCxTQUFMLENBQWVvQyxTQUFmO0FBQ0g7QUFqWGtDLENBQVQsQ0FBOUIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICDov5nph4zmmK/mj4/ov7Dov5nkuKrnqpfkvZPnmoTkvZznlKjnmoRcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAxLTE2IDExOjQ3OjQxXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIEd1aWRlRXZlbnQgPSByZXF1aXJlKFwiZ3VpZGVfZXZlbnRcIik7XG52YXIgUGFydG5lcnN1bW1vbkNvbnN0ID0gcmVxdWlyZShcInBhcnRuZXJzdW1tb25fY29uc3RcIik7XG5cbnZhciBQYXJ0bmVyc3VtbW9uU2hvd1dpbmRvdyA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlVmlldyxcblxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgc2tlbHRvbl9kYXRhOiBudWxsLFxuICAgICAgICBjb25tbW9uX3NwOiBudWxsLFxuICAgIH0sXG5cbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJwYXJ0bmVyc3VtbW9uXCIsIFwicGFydG5lcnN1bW1vbl9zaG93X3dpbmRvd1wiKTtcbiAgICAgICAgdGhpcy52aWV3VGFnID0gU0NFTkVfVEFHLmRpYWxvZ3VlOyAgICAgICAgICAvLyDor6XnqpfkvZPmiYDlsZ51aeWxgue6pyzlhajlsY91aemcgOimgeWcqHVp5bGCLOmdnuWFqOWxj3Vp5ZyoZGlhbG9ndWXlsYIs6L+Z5Liq6KaB5rOo5oSPXG4gICAgICAgIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLkZ1bGw7ICAgICAgICAgICAgICAgLy8g5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuXG4gICAgICAgIHRoaXMuY3RybCAgICAgID0gYXJndW1lbnRzWzBdO1xuICAgICAgICB0aGlzLm1vZGVsICAgICA9IHRoaXMuY3RybC5nZXRNb2RlbCgpO1xuICAgICAgICB0aGlzLnNob3dfYmlkcyA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgdGhpcy5maW5pc2hfY2IgPSBhcmd1bWVudHNbMl07XG4gICAgICAgIHRoaXMuYmdfdHlwZSAgID0gYXJndW1lbnRzWzNdO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLnBhcnRuZXJzdW1tb25fY29uZmlnID0gQ29uZmlnLnJlY3J1aXRfZGF0YS5kYXRhX3BhcnRuZXJzdW1tb25fZGF0YTtcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCO55qE5Zue6LCDLOWPr+S7peWcqOi/memHjOaNleiOt+ebuOWFs+iKgueCueaIluiAhee7hOS7tlxuICAgIG9wZW5DYWxsQmFjazpmdW5jdGlvbigpe1xuXG4gICAgfSxcblxuICAgIC8vIOazqOWGjOS6i+S7tuebkeWQrOeahOaOpeWPoyzkuI3pnIDopoHmiYvliqjosIPnlKgs5aaC5p6c5piv5L2/55SoZ2NvcmUuR2xvYmFsRXZlbnTnm5HlkKws5Y+v5Lul55u05o6l6LCD55SoYWRkR2xvYmFsRXZlbnRcbiAgICByZWdpc3RlckV2ZW50OmZ1bmN0aW9uKCl7XG5cbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCOLOa3u+WKoOWIsOWvueW6lOS4u+iKgueCueS5i+WQjueahOWbnuiwgyzkuZ/lsLHmmK/kuIDkuKrnqpfkvZPnmoTmraPlvI/lhaXlj6Ms5Y+v5Lul6K6+572u5LiA5Lqb5pWw5o2u5LqGXG4gICAgb3BlblJvb3RXbmQ6ZnVuY3Rpb24ocGFyYW1zKXtcbiAgICAgICAgdGhpcy5pbml0V2lkZ2V0KCk7XG4gICAgICAgIHRoaXMuaW5pdEJnSW5mbygpO1xuICAgICAgICB0aGlzLnNob3dSZWNydWl0KCk7XG4gICAgfSxcblxuICAgIC8vIOWFs+mXreeql+S9k+WbnuiwgyzpnIDopoHlnKjov5nph4zosIPnlKjor6XnqpfkvZPmiYDlsZ5jb250cm9sbGVy55qEY2xvc2Xmlrnms5XmsqHnlKjkuo7nva7nqbror6XnqpfkvZPlrp7kvovlr7nosaFcbiAgICBjbG9zZUNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpZGVFdmVudC5DbG9zZVRhc2tFZmZlY3QpO1xuICAgICAgICB2YXIgUGFydG5lcnN1bW1vbkNvbnRyb2xsZXIgPSByZXF1aXJlKFwicGFydG5lcnN1bW1vbl9jb250cm9sbGVyXCIpO1xuICAgICAgICBQYXJ0bmVyc3VtbW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5TdW1tb25HYWluU2hvd1dpbmRvdyhmYWxzZSlcbiAgICB9LFxuXG4gICAgaW5pdEJnSW5mbzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMucmVjcnVpdF9kYXRhID0gdGhpcy5tb2RlbC5nZXRSZWNydWl0RGF0YSgpO1xuICAgICAgICBcbiAgICAgICAgLy8g6IOM5pmvXG4gICAgICAgIGlmKCB0aGlzLnJlY3J1aXRfZGF0YSl7XG4gICAgICAgICAgICB2YXIgc3VtbW9uX2NmZ19pdGVtID0gdGhpcy5wYXJ0bmVyc3VtbW9uX2NvbmZpZ1t0aGlzLnJlY3J1aXRfZGF0YS5ncm91cF9pZF07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc291cmNlc19pZCA9IFwicGFydG5lcnN1bW1vbl9jYWxsX2JnXzEwMFwiO1xuICAgICAgICBpZih0aGlzLmJnX3R5cGUgIT0gbnVsbCAmJiB0aGlzLmJnX3R5cGUgPT0gMil7XG4gICAgICAgICAgICByZXNvdXJjZXNfaWQgPSBcInBhcnRuZXJzdW1tb25fY2FsbF9iZ18yMDBcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VtbW9uX2NmZ19pdGVtKVxuICAgICAgICAgICAgcmVzb3VyY2VzX2lkID0gc3VtbW9uX2NmZ19pdGVtLmNhbGxfYmc7XG4gICAgICAgIHZhciBiZ19wYXRoID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImJpZ2JnL3BhcnRuZXJzdW1tb25cIiwgcmVzb3VyY2VzX2lkKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKGJnX3BhdGgsIGZ1bmN0aW9uKGJpZ2JnX3NmKSB7XG4gICAgICAgICAgICB0aGlzLnN1bW1vbl9iZ19zcC5zcHJpdGVGcmFtZSA9IGJpZ2JnX3NmO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgIC8vIOiDjOaZr+WKqOeUu1xuICAgICAgICAvLyB2YXIgYmdfZWZmZWN0X2lkID0gXCIxNDBcIlxuICAgICAgICAvLyBpZiAoc3VtbW9uX2NmZ19pdGVtKVxuICAgICAgICAvLyAgICAgYmdfZWZmZWN0X2lkID0gc3VtbW9uX2NmZ19pdGVtLmNhbGxfYmdfYWN0aW9uO1xuICAgICAgICAvLyB2YXIgZWZmZWN0X3JlcyA9IFBhdGhUb29sLmdldEVmZmVjdFJlcyhiZ19lZmZlY3RfaWQpO1xuICAgICAgICAvLyB2YXIgZWZmZWN0X3BhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgoZWZmZWN0X3JlcywgXCJhY3Rpb25cIik7XG4gICAgICAgIC8vIHRoaXMubG9hZFJlcyhlZmZlY3RfcGF0aCwgZnVuY3Rpb24oYmdfc2QpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuYmdfZWZmZWN0X3NrLnNrZWxldG9uRGF0YSA9IGJnX3NkO1xuICAgICAgICAvLyAgICAgdGhpcy5iZ19lZmZlY3Rfc2suc2V0QW5pbWF0aW9uKDAsIFwiYWN0aW9uXCIsIHRydWUpO1xuICAgICAgICAvLyB9LmJpbmQodGhpcykpO1xuICAgIH0sXG5cbiAgICBpbml0V2lkZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5zdW1tb25fYmdfc3AgICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJzdW1tb25fYmdcIiwgY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5iZ19lZmZlY3Rfc2sgICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJiZ19lZmZlY3RcIiwgc3AuU2tlbGV0b24pO1xuICAgICAgICB0aGlzLmhlcm9jYXJkX2luZm9fbmQgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImhlcm9jYXJkX2luZm9cIik7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnBhcnRuZXJzdW1tb25fYmcgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcInBhcnRuZXJzdW1tb25fYmdcIik7XG4gICAgICAgIHRoaXMuc3VtbW9uX2JnX25kICAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwic3VtbW9uX2JnXCIpO1xuICAgICAgICB0aGlzLnN1bW1vbl9iZ19uZC5zY2FsZSAgICAgPSB0aGlzLnN1bW1vbl9iZ19uZC5zY2FsZSAqIEZJVF9TQ0FMRSAgICAgICAgXG4gICAgICAgIHRoaXMucGFydG5lcnN1bW1vbl9iZy5zY2FsZSA9IEZJVF9TQ0FMRTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuc2hhcmVfY29udGVuX25kICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwic2hhcmVfY29udGVuXCIpO1xuICAgICAgICB0aGlzLnNob3dfY29udGVuX25kICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcInNob3dfY29udGVuXCIpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5za2lsbF9pdGVtX25kICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJza2lsbF9pdGVtXCIpOyAgICAgICAgICAgICAgICAgIC8vIOWPr+WkjeWItueahOaKgOiDvWl0ZW1cbiAgICAgICAgdGhpcy5zdGFyX2l0ZW1fbmQgICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJzdGFyX2l0ZW1cIik7ICAgICAgICAgICAgICAgICAgIC8vIOWPr+WkjeWItueahOaYn+aYn1xuICAgICAgICBcbiAgICAgICAgdGhpcy5oZXJvY2FyZF9zcCAgICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJoZXJvY2FyZFwiLCBjYy5TcHJpdGUpOyAgICAgICAgICAgICBcbiAgICAgICAgdGhpcy5zdGFyc19jb250ZW5fbmQgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJzdGFyc19jb250ZW5cIik7ICAgICAgIFxuICAgICAgICB0aGlzLmhlcm9fdHlwZV9zcCAgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImhlcm9fdHlwZVwiLCBjYy5TcHJpdGUpOyAgICAgICAgICAgXG4gICAgICAgIHRoaXMuaGVyb19uYW1lX2xiICAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiaGVyb19uYW1lXCIsIGNjLkxhYmVsKTsgICAgICAgICBcbiAgICAgICAgdGhpcy5oZXJvX3Nsb2duX2xiICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJoZXJvX3Nsb2duXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5jYW1wX3R5cGVfc3AgICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJjYW1wX3R5cGVcIiwgY2MuU3ByaXRlKTtcbiAgICAgICAgXG4gICAgICAgIC8vIOWxleekuuebuOWFs1xuICAgICAgICB0aGlzLnNoYXJlX2J0bl9uZCAgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcInNoYXJlX2J0blwiKTtcbiAgICAgICBcbiAgICAgICAgdGhpcy5wYXJ0bmVyc3VtbW9uX3RhZ19iZ19uZCAgPSB0aGlzLnNlZWtDaGlsZChcInBhcnRuZXJzdW1tb25fdGFnX2JnXCIpXG4gICAgICAgIFxuICAgICAgICB0aGlzLmFnYWluX29uZV90eHRfbmQgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImFnYWluX29uZV90eHRcIik7XG4gICAgICAgIHRoaXMuYWdhaW5fdGVuX3R4dF9uZCAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiYWdhaW5fdGVuX3R4dFwiKTtcbiAgICAgICAgdGhpcy5jb25maXJtX2J0bl9uZCAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJjb25maXJtX2J0blwiKTtcbiAgICAgICAgIGlmKFBMQVRGT1JNX1RZUFIgPT0gXCJRUV9TREtcIil7XG4gICAgICAgICAgICB0aGlzLnNoYXJlX2J0bl9uZC5hY3RpdmUgPSB0cnVlOy8v5Li05pe25bGP6JS9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5zaGFyZV9idG5fbmQuYWN0aXZlID0gZmFsc2U7Ly/kuLTml7blsY/olL1cbiAgICAgICAgICAgIHRoaXMuY29uZmlybV9idG5fbmQueCA9IDM2MDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNraWxsc19jb250ZW50X25kICAgICAgPSB0aGlzLnNlZWtDaGlsZChcInNraWxsc19jb250ZW50XCIpO1xuICAgICAgICB0aGlzLnJld2FyZF9uZCAgICAgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcInJld2FyZFwiKTtcbiAgICAgICAgdGhpcy5yZXdhcmRfbmQuYWN0aXZlID0gZmFsc2U7Ly/kuLTml7blsY/olL1cbiAgICAgICAgdGhpcy5nZXRfZGVzX25kICAgICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJnZXRfZGVzXCIpO1xuICAgICAgICB0aGlzLmdvbmd4aV9pbWdfbmQgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImdvbmd4aV9pbWdcIik7XG4gICAgICAgIFxuICAgICAgICAvLyDliIbkuqvnm7jlhbNcbiAgICAgICAgdGhpcy5yZXR1cm5fYnRuX25kICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJyZXR1cm5fYnRuXCIpO1xuICAgICAgICB0aGlzLndlaXhpbl9idG5fbmQgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcIndlaXhpbl9idG5cIik7XG4gICAgICAgIHRoaXMuZnJpZW5kX2J0bl9uZCAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiZnJpZW5kX2J0blwiKTtcblxuICAgICAgICB0aGlzLmNhcmRfc2tlbGV0b24gICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJjYXJkX3NrZWx0b25cIiwgc3AuU2tlbGV0b24pO1xuICAgICAgICB0aGlzLmNhcmRfc2tlbGV0b24uc2V0Q29tcGxldGVMaXN0ZW5lcih0aGlzLmFuaW1hQ29tcGxldGUuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5nZXRfYW5pbWFfc3AgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiZ2V0X2FuaW1hXCIsIHNwLlNrZWxldG9uKTtcblxuICAgICAgICB0aGlzLnNoYXJlX2J0bl9uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMuZGlkQ2xpY2tTaGFyZUJ0biwgdGhpcyk7XG4gICAgICAgIHRoaXMuY29uZmlybV9idG5fbmQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLmRpZENsaWNrQ29uZmltQnRuLCB0aGlzKTtcbiAgICAgICAgdGhpcy5yZXR1cm5fYnRuX25kLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy5kaWRDbGlja1JldHVybkJ0biwgdGhpcylcbiAgICB9LFxuXG4gICAgdXBkYXRlV2lkZ2V0OiBmdW5jdGlvbihiaWRfaW5mbykge1xuICAgICAgICBpZiAoIXRoaXMucGFyX2Jhc2VfY29uZmlnIHx8ICF0aGlzLnBhcl9zdGFyX2NvbmZpZyB8fCAhYmlkX2luZm8pIHJldHVybjtcbiAgICAgICAgaWYoYmlkX2luZm8uc2hvd190eXBlICYmIGJpZF9pbmZvLnNob3dfdHlwZSA9PSBQYXJ0bmVyc3VtbW9uQ29uc3QuR2Fpbl9TaG93X1R5cGUuU2tpbl9zaG93KXtcbiAgICAgICAgICAgIGxldCBza2luX2NvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX3NraW5fZGF0YS5kYXRhX3NraW5faW5mb1tiaWRfaW5mby5za2luX2lkXTtcbiAgICAgICAgICAgIGlmKHNraW5fY29uZmlnKXtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fbmFtZV9sYi5zdHJpbmcgPSBza2luX2NvbmZpZy5za2luX25hbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX3Nsb2duX2xiLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIiVzwrfnmq7ogqRcIiksIHRoaXMucGFyX2Jhc2VfY29uZmlnLm5hbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnNfY29udGVuX25kLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMucGFydG5lcnN1bW1vbl90YWdfYmdfbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2FtcF9wYXRoID0gUGF0aFRvb2wuZ2V0SGVyb0NhbXBSZXModGhpcy5wYXJfYmFzZV9jb25maWcuY2FtcF90eXBlKVxuICAgICAgICAvLyB2YXIgY29tbW9uX3Jlc19wYXRoID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcInBhcnRuZXJzdW1tb25cIiwgY2FtcF9wYXRoKTtcbiAgICAgICAgLy8gdGhpcy5sb2FkUmVzKGNvbW1vbl9yZXNfcGF0aCwgZnVuY3Rpb24oc2Zfb2JqKXtcbiAgICAgICAgLy8gICAgIHRoaXMuY2FtcF90eXBlX3NwLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAvLyB9LmJpbmQodGhpcykpXG5cbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJjb21tb25cIiwgY2FtcF9wYXRoKSwgZnVuY3Rpb24oc2Zfb2JqKXtcbiAgICAgICAgICAgIHRoaXMuY2FtcF90eXBlX3NwLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICB9LmJpbmQodGhpcykpIFxuXG4gICAgICAgIHZhciBjb21tb25fcmVzX3BhdGhfMiA9IFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJwYXJ0bmVyc3VtbW9uXCIsIFwicGFydG5lcnN1bW1vbl90eXBlX1wiICsgdGhpcy5wYXJfYmFzZV9jb25maWcudHlwZSk7XG4gICAgICAgIHRoaXMubG9hZFJlcyhjb21tb25fcmVzX3BhdGhfMiwgZnVuY3Rpb24oc2Zfb2JqKXtcbiAgICAgICAgICAgIHRoaXMuaGVyb190eXBlX3NwLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICB9LmJpbmQodGhpcykpXG5cbiAgICAgICAgaWYgKHRoaXMucGFyX2Jhc2VfY29uZmlnLnZvaWNlKSB7XG4gICAgICAgICAgICBVdGlscy5wbGF5RWZmZWN0U291bmQoQVVESU9fVFlQRS5EVUJCSU5HLCB0aGlzLnBhcl9iYXNlX2NvbmZpZy52b2ljZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDmmJ/mmJ9cbiAgICAgICAgdGhpcy5zdGFyc19jb250ZW5fbmQucmVtb3ZlQWxsQ2hpbGRyZW4oKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaWRfaW5mby5pbml0X3N0YXI7IGkrKykge1xuICAgICAgICAgICAgdmFyIHN0YXJfbmQgPSBjYy5pbnN0YW50aWF0ZSh0aGlzLnN0YXJfaXRlbV9uZCk7XG4gICAgICAgICAgICB0aGlzLnN0YXJzX2NvbnRlbl9uZC5hZGRDaGlsZChzdGFyX25kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGVyb19uYW1lX2xiLnN0cmluZyA9IHRoaXMucGFyX2Jhc2VfY29uZmlnLm5hbWU7XG4gICAgICAgIHRoaXMuaGVyb19zbG9nbl9sYi5zdHJpbmcgPSB0aGlzLnBhcl9iYXNlX2NvbmZpZy5oZXJvX3BvcztcblxuICAgICAgICAvLyDmioDog71cbiAgICAgICAgLy8gdmFyIFNraWxsSXRlbSA9IHJlcXVpcmUoXCJza2lsbF9pdGVtXCIpO1xuICAgICAgICAvLyB0aGlzLnNraWxsX2l0ZW0gPSBuZXcgU2tpbGxJdGVtKCk7XG4gICAgICAgIC8vIHRoaXMuc2tpbGxfaXRlbS5zZXRQb3NpdGlvbihjYy52Mig2MCwgOTApKTtcbiAgICAgICAgLy8gdGhpcy5za2lsbF9pdGVtLnNldExldmVTdGF0dXMoZmFsc2UpO1xuICAgICAgICAvLyB0aGlzLnNraWxsX2l0ZW0uc2V0U2hvd1RpcHModHJ1ZSk7XG4gICAgICAgIC8vIHRoaXMuc2tpbGxfaXRlbS5zZXRQYXJlbnQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICAgIHRoaXMuc2tpbGxzX2NvbnRlbnRfbmQucmVtb3ZlQWxsQ2hpbGRyZW4oKTtcbiAgICAgICAgdmFyIHNraWxsX2xpc3QgPSB0aGlzLnBhcl9zdGFyX2NvbmZpZy5za2lsbHM7XG4gICAgICAgIGZvciAodmFyIHNraWxsX2kgPSAwOyBza2lsbF9pIDwgc2tpbGxfbGlzdC5sZW5ndGg7IHNraWxsX2krKykge1xuICAgICAgICAgICAgdmFyIHNraWxsX2luZm8gPSBza2lsbF9saXN0W3NraWxsX2ldO1xuICAgICAgICAgICAgaWYgKHNraWxsX2luZm9bMF0gIT0gMSkgeyAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIHZhciBza2lsbF9jb25maWcgPSBnZGF0YShcInNraWxsX2RhdGFcIiwgXCJkYXRhX2dldF9za2lsbFwiLCBza2lsbF9pbmZvWzFdKTtcbiAgICAgICAgICAgICAgICAvLyB2YXIgaWNvbl9wYXRoID0gUGF0aFRvb2wuZ2V0SWNvblBhdGgoXCJza2lsbGljb25cIiwgc2tpbGxfY29uZmlnLmljb24pO1xuICAgICAgICAgICAgICAgIHZhciBza2lsbF9uZCA9IGNjLmluc3RhbnRpYXRlKHRoaXMuc2tpbGxfaXRlbV9uZCk7XG4gICAgICAgICAgICAgICAgc2tpbGxfbmQueSA9IDA7XG4gICAgICAgICAgICAgICAgdmFyIHNraWxsX2NvbiA9IHNraWxsX25kLmdldENoaWxkQnlOYW1lKFwic2tpbGxfY29uXCIpO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMubG9hZFJlcyhpY29uX3BhdGgsIGZ1bmN0aW9uKHNraWxsX2l0ZW0sIHNmX29iail7XG4gICAgICAgICAgICAgICAgLy8gICAgIGlmIChza2lsbF9pdGVtICYmIHNmX29iaikge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgdmFyIHNraWxsX2l0ZW1fc3AgPSBza2lsbF9pdGVtLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgc2tpbGxfaXRlbV9zcC5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH0uYmluZCh0aGlzLCBza2lsbF9pdGVtKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbHNfY29udGVudF9uZC5hZGRDaGlsZChza2lsbF9uZCk7XG5cbiAgICAgICAgICAgICAgICB2YXIgU2tpbGxJdGVtID0gcmVxdWlyZShcInNraWxsX2l0ZW1cIik7XG4gICAgICAgICAgICAgICAgdmFyIHNraWxsX2l0ZW0gPSBuZXcgU2tpbGxJdGVtKCk7XG4gICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5zZXRMZXZlU3RhdHVzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBza2lsbF9pdGVtLnNldFNob3dUaXBzKHRydWUpO1xuICAgICAgICAgICAgICAgIHNraWxsX2l0ZW0uc2V0UGFyZW50KHNraWxsX2Nvbik7XG4gICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5zZXREYXRhKHNraWxsX2luZm9bMV0pO1xuICAgICAgICAgICAgICAgIHNraWxsX2l0ZW0uc2hvd0JHKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzaG93UmVjcnVpdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3dfYmlkcy5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgICAgIC8vIOmHjee9ruaYvuekulxuICAgICAgICAgICAgdGhpcy5zaG93X2NvbnRlbl9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaGVyb2NhcmRfaW5mb19uZC5hY3RpdmUgPSBmYWxzZTtcblxuICAgICAgICAgICAgdmFyIGJpZF9pbmZvID0gdGhpcy5zaG93X2JpZHMuc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMucGFyX2Jhc2VfY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX3BhcnRuZXJfYmFzZVtiaWRfaW5mby5wYXJ0bmVyX2JpZF07XG4gICAgICAgICAgICB0aGlzLnBhcl9zdGFyX2NvbmZpZyA9IGdkYXRhKFwicGFydG5lcl9kYXRhXCIsIFwiZGF0YV9wYXJ0bmVyX3N0YXJcIiwgYmlkX2luZm8ucGFydG5lcl9iaWQudG9TdHJpbmcoKSArIFwiX1wiICsgYmlkX2luZm8uaW5pdF9zdGFyLnRvU3RyaW5nKCkpOyBcbiAgICAgICAgICAgIC8vIGlmICghdGhpcy5jb25tbW9uX3NwKSB7XG4gICAgICAgICAgICAvLyAgICAgdmFyIGNvbW1vbl9hdGxhc19wYXRoID0gUGF0aFRvb2wuZ2V0UmVzRnJhbWUoXCJwYXJ0bmVyc3VtbW9uXCIsIFwicGFydG5lcnN1bW1vblwiKTtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmxvYWRSZXMoY29tbW9uX2F0bGFzX3BhdGgsIGZ1bmN0aW9uKGJpZF9pbmZvLCBhdGxhc19vYmopIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5jb25tbW9uX3NwID0gYXRsYXNfb2JqO1xuICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldChiaWRfaW5mbyk7XG4gICAgICAgICAgICAvLyAgICAgfS5iaW5kKHRoaXMsIGJpZF9pbmZvKSk7XG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0KGJpZF9pbmZvKTtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8g5Y2h54mM6LWE5rqQXG4gICAgICAgICAgICB2YXIgY2FyZF9wYXRoID0gbnVsbDtcbiAgICAgICAgICAgIGlmKGJpZF9pbmZvLnNob3dfdHlwZSAmJiBiaWRfaW5mby5zaG93X3R5cGUgPT0gUGFydG5lcnN1bW1vbkNvbnN0LkdhaW5fU2hvd19UeXBlLlNraW5fc2hvdyl7XG4gICAgICAgICAgICAgICAgbGV0IHNraW5fY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfc2tpbl9kYXRhLmRhdGFfc2tpbl9pbmZvW2JpZF9pbmZvLnNraW5faWRdO1xuICAgICAgICAgICAgICAgIGNhcmRfcGF0aCA9IFBhdGhUb29sLmdldEJpZ0JnKFwicGFydG5lcmNhcmRfXCIgKyBza2luX2NvbmZpZy5oZWFkX2NhcmRfaWQsIFwicG5nXCIsIFwicGFydG5lcmNhcmRcIik7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBjYXJkX3BhdGggPSBQYXRoVG9vbC5nZXRCaWdCZyhcInBhcnRuZXJjYXJkX1wiICsgYmlkX2luZm8ucGFydG5lcl9iaWQsIFwicG5nXCIsIFwicGFydG5lcmNhcmRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMoY2FyZF9wYXRoLCBmdW5jdGlvbihzZl9ib2YpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9jYXJkX3NwLnNwcml0ZUZyYW1lID0gc2ZfYm9mO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgICAgICAvLyDljaHniYzliqjnlLtcbiAgICAgICAgICAgIHZhciBhY3Rpb25fbmFtZSA9IFwiYWN0aW9uMVwiXG4gICAgICAgICAgICBpZiAodGhpcy5jYXJkX3NrZWxldG9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc19wbGF5aW5nID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhcmRfc2tlbGV0b24uc2tlbGV0b25EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FyZF9za2VsZXRvbi5zZXRBbmltYXRpb24oMCwgXCJhY3Rpb24xXCIpOyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNrZXRvbl9wYXRoID0gUGF0aFRvb2wuZ2V0U3BpbmVQYXRoKFwiRTUxMDA3XCIsIFwiYWN0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoc2tldG9uX3BhdGgsIGZ1bmN0aW9uKHNrZWxldG9uX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FyZF9za2VsZXRvbi5za2VsZXRvbkRhdGEgPSBza2VsZXRvbl9kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJkX3NrZWxldG9uLnNldEFuaW1hdGlvbigwLCBcImFjdGlvbjFcIik7ICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDojrflvpfliqjkvZxcbiAgICAgICAgICAgIHRoaXMuZ2V0X2Rlc19uZC5zY2FsZSA9IDEuNTtcbiAgICAgICAgICAgIGlmICghdGhpcy5nZXRfYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlbGF5X2FjdCA9IGNjLmRlbGF5VGltZSgwLjEpO1xuICAgICAgICAgICAgICAgIHZhciBzY2FsZV9hY3QgPSBjYy5zY2FsZVRvKDAuMSwgMSk7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGxfYWN0ID0gY2MuY2FsbEZ1bmMoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOiOt+W+l+WKqOeUu1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRfYW5pbWFfc3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldF9hbmltYV9zcC5za2VsZXRvbkRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldF9hbmltYV9zcC5zZXRBbmltYXRpb24oMCwgXCJhY3Rpb25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBza2V0b25fcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChcIkU1MDA5M1wiLCBcImFjdGlvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoc2tldG9uX3BhdGgsIGZ1bmN0aW9uKHNrZWxldG9uX2RhdGEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldF9hbmltYV9zcC5za2VsZXRvbkRhdGEgPSBza2VsZXRvbl9kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldF9hbmltYV9zcC5zZXRBbmltYXRpb24oMCwgXCJhY3Rpb25cIik7ICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0X2FjdGlvbiA9IGNjLnNlcXVlbmNlKGNhbGxfYWN0LCBkZWxheV9hY3QsIHNjYWxlX2FjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdldF9kZXNfbmQucnVuQWN0aW9uKHRoaXMuZ2V0X2FjdGlvbik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZGlkQ2xpY2tTaGFyZUJ0bjogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKDEpXG4gICAgICAgIGlmKFBMQVRGT1JNX1RZUFIgPT0gXCJRUV9TREtcIil7XG4gICAgICAgICAgICBTREsuY2FudmFzVG9UZW1wRmlsZVBhdGgoKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gdGhpcy5zaGFyZV9jb250ZW5fbmQuYWN0aXZlID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgZGlkQ2xpY2tDb25maW1CdG46IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZCgxKVxuICAgICAgICBpZiAodGhpcy5zaG93X2JpZHMubGVuZ3RoID4gMCkgeyAgICAgICAgXG4gICAgICAgICAgICB0aGlzLnNob3dSZWNydWl0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5maW5pc2hfY2IpIHRoaXMuZmluaXNoX2NiKCk7XG4gICAgICAgICAgICB2YXIgUGFydG5lcnN1bW1vbkNvbnRyb2xsZXIgPSByZXF1aXJlKFwicGFydG5lcnN1bW1vbl9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgUGFydG5lcnN1bW1vbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuU3VtbW9uR2FpblNob3dXaW5kb3coZmFsc2UpOyAgICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIGlmKHdpbmRvdy5UQVNLX1RJUFMpXG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWRlRXZlbnQuVGFza05leHRTdGVwLFwiY29uZmlybV9idG5cIik7Ly/ku7vliqHlvJXlr7znlKjliLBcbiAgICB9LFxuXG4gICAgZGlkQ2xpY2tSZXR1cm5CdG46IGZ1bmN0aW9uKCkge1xuICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoMSlcbiAgICAgICAgdGhpcy5zaG93X2NvbnRlbl9uZC5hY3RpdmUgPSB0cnVlOyAgICAgICAgXG4gICAgICAgIHRoaXMuc2hvd19jb250ZW5fbmQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaGFyZV9jb250ZW5fbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgfSxcblxuICAgIGFuaW1hQ29tcGxldGU6IGZ1bmN0aW9uKHRyYWNrRW50cnksIGxvb3BDb3VudCkge1xuICAgICAgICBpZih0aGlzLmlzX3BsYXlpbmcgPT0gZmFsc2UpcmV0dXJuO1xuICAgICAgICB2YXIgYW5pbWF0aW9uTmFtZSA9IHRyYWNrRW50cnkuYW5pbWF0aW9uID8gdHJhY2tFbnRyeS5hbmltYXRpb24ubmFtZSA6IFwiXCI7XG4gICAgICAgIGlmIChhbmltYXRpb25OYW1lID09IFwiYWN0aW9uMVwiIHx8IGFuaW1hdGlvbk5hbWUgPT0gXCJhY3Rpb24yXCIpIHtcbiAgICAgICAgICAgIHRoaXMuY2FyZF9za2VsZXRvbi5zZXRBbmltYXRpb24oMCwgXCJhY3Rpb24zXCIsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5zaG93X2NvbnRlbl9uZC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5oZXJvY2FyZF9pbmZvX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH0gXG4gICAgICAgIHRoaXMuaXNfcGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNoYWtlU2NyZWVuKHRoaXMucm9vdF93bmQpXG4gICAgfSxcbiAgICBzaGFrZVNjcmVlbihyb290X3duZCl7XG4gICAgICAgIGxldCBub2RlID0gcm9vdF93bmQ7XG4gICAgICAgIGlmKG5vZGUuYWN0aW9uKXtcbiAgICAgICAgICAgIHRoaXMuaXNfc2hha2UgPSBmYWxzZTtcbiAgICAgICAgICAgIG5vZGUuc3RvcEFsbEFjdGlvbnMoKTtcbiAgICAgICAgICAgIG5vZGUuYWN0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbWVyYV9zaGFrZV9wb3MgPSByb290X3duZC5nZXRQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLmlzX3NoYWtlID0gdHJ1ZTtcbiAgICAgICAgbGV0IHJldHVyblBvcyA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICB0aGlzLmlzX3NoYWtlID0gZmFsc2U7XG4gICAgICAgICAgICBub2RlLnNldFBvc2l0aW9uKHRoaXMuY2FtZXJhX3NoYWtlX3Bvcyk7XG4gICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICBsZXQgb3JkZXIgPSBbMSwgNCwgNywgOCwgOSwgNiwgMywgMl1cbiAgICAgICAgbGV0IHN0ciA9IDE1IC8vLS3mjK/luYXvvIzljZXkvY3lg4/ntKBcbiAgICAgICAgbGV0IGRhbXAgPSAzIC8vLS3mjK/liqjlh4/oobAsIOWNleS9jeWDj+e0oFxuICAgICAgICBsZXQgc3RlcCA9IDAuMDE1IC8vLS3mjK/liqjpl7TpmpTvvIzljZXkvY3np5JcbiAgICAgICAgbGV0IHNoYWtlWFRpbWUgPSAwLjI1IC8vLS3mqKrlkJHliqDlgI1cbiAgICAgICAgbGV0IHNoYWtlWVRpbWUgPSAwLjI1IC8vLS3nurXlkJHliqDlgI1cbiAgICAgICAgbGV0IHNoYWtlVGltZSA9ICAxIC8vLS3mjK/liqjmrKHmlbBcbiAgICAgICAgbGV0IHh5X2xpc3QgPSBbIFstMC43LCAwLjcgXSwgWyAwLCAxIF0sIFsgMC43LCAwLjcgXSwgWy0xLCAwIF0sIFsgMCwgMCBdLCBbIDEsIDAgXSwgWy0wLjcsIC0wLjcgXSwgWyAwLCAtMSBdLCBbIDAuNywgLTAuNyBdIF07XG4gICAgICAgIGxldCBzZXRSYW5kb21Qb3MgPSBmdW5jdGlvbiAoaW5kZXgpe1xuICAgICAgICAgICAgbGV0IHBvc194LCBwb3NfeTtcbiAgICAgICAgICAgIHBvc194ID0gc3RyICogc2hha2VZVGltZSAqIHh5X2xpc3Rbb3JkZXJbaW5kZXhdIC0gMV1bMF07XG4gICAgICAgICAgICBwb3NfeSA9IC1zdHIgKiBzaGFrZVhUaW1lICogeHlfbGlzdFtvcmRlcltpbmRleF0gLSAxXVsxXTtcbiAgICAgICAgICAgIGxldCBwb3MgPSBjYy52Mih0aGlzLmNhbWVyYV9zaGFrZV9wb3MueCArIHBvc194LCB0aGlzLmNhbWVyYV9zaGFrZV9wb3MueSArIHBvc195KTtcbiAgICAgICAgICAgIG5vZGUuc2V0UG9zaXRpb24ocG9zKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgIGxldCBiYXNlX2NhbGwgPSBjYy5kZWxheVRpbWUoMCk7XG4gICAgICAgIGZvcihsZXQgaj0wO2o8c2hha2VUaW1lOysrail7XG4gICAgICAgICAgICBmb3IobGV0IGk9MDtpPG9yZGVyLmxlbmd0aDsrK2kpe1xuICAgICAgICAgICAgICAgIGxldCBkZWxheSA9IGNjLmRlbGF5VGltZShzdGVwKTtcbiAgICAgICAgICAgICAgICBiYXNlX2NhbGwgPSBjYy5zZXF1ZW5jZShiYXNlX2NhbGwsY2MuY2FsbEZ1bmMoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgc2V0UmFuZG9tUG9zKGkpO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSksZGVsYXkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHIgPSBzdHIgLSBkYW1wO1xuICAgICAgICB9XG4gICAgICAgIGJhc2VfY2FsbCA9IGNjLnNlcXVlbmNlKGJhc2VfY2FsbCwgY2MuY2FsbEZ1bmMocmV0dXJuUG9zKSk7XG4gICAgICAgIG5vZGUuYWN0aW9uID0gYmFzZV9jYWxsO1xuICAgICAgICBub2RlLnJ1bkFjdGlvbihiYXNlX2NhbGwpO1xuICAgIH0sXG5cbn0pIl19