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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/guildboss/guildboss_controller.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, 'b7c6bk9cudNq7xr3s77FCOb', 'guildboss_controller');
// Scripts/mod/guildboss/guildboss_controller.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//      这里填写详细说明,主要填写该模块的功能简要
// <br/>Create: 2019-01-24 17:44:54
// --------------------------------------------------------------------
var RoleController = require("role_controller");
 
var MainuiController = require("mainui_controller");
 
var GuildbossEvent = require("guildboss_event");
 
var BattleController = require("battle_controller");
 
var BattleConst = require("battle_const");
 
var GuildbossConst = require("guildboss_const");
 
var GuildbossController = cc.Class({
  "extends": BaseController,
  ctor: function ctor() {},
  // 初始化配置数据
  initConfig: function initConfig() {
    var GuildbossModel = require("guildboss_model");
 
    this.model = new GuildbossModel();
    this.model.initConfig();
  },
  // 返回当前的model
  getModel: function getModel() {
    return this.model;
  },
  // 注册监听事件
  registerEvents: function registerEvents() {
    if (this.init_role_event == null) {
      this.init_role_event = gcore.GlobalEvent.bind(EventId.EVT_ROLE_CREATE_SUCCESS, function () {
        gcore.GlobalEvent.unbind(this.init_role_event);
        this.init_role_event = null;
        this.role_vo = RoleController.getInstance().getRoleVo();
 
        if (this.role_vo != null) {
          this.requestInitProtocal(true);
 
          if (this.role_assets_event == null) {
            this.role_assets_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) {
              if (key == "guild_lev") {
                this.requestInitProtocal();
              } else if (key == "gid") {
                if (value == 0) {
                  this.openMainWindow(false);
                }
              }
            }, this);
          }
        }
      }, this);
    }
 
    if (this.re_link_game_event == null) {
      this.re_link_game_event = gcore.GlobalEvent.bind(EventId.EVT_RE_LINK_GAME, function () {
        this.requestInitProtocal(true);
      }, this);
    }
  },
  //请求或者清除一些基础信息的东西
  requestInitProtocal: function requestInitProtocal(force) {
    if (this.role_vo == null) return;
    var config = gdata("guild_dun_data", "data_const", "guild_lev");
    if (config == null) return;
 
    if (this.role_vo.gid == 0 || this.role_vo.guild_lev < config.val) {
      this.model.clearGuildBossInfo({});
    } else {
      if (force == true) {
        this.requestGuildDunBaseInfo();
      } else {
        var base_info = this.model.getBaseInfo();
 
        if (base_info == null || Utils.next(base_info) == null) {
          this.requestGuildDunBaseInfo();
        }
      }
    }
  },
  // 注册协议接受事件
  registerProtocals: function registerProtocals() {
    this.RegisterProtocal(21300, this.handle21300); // 公会副本的基础信息
 
    this.RegisterProtocal(21307, this.handle21307); // 重置返回
 
    this.RegisterProtocal(21308, this.handle21308); // 请求挑战返回
 
    this.RegisterProtocal(21312, this.handle21312); // 购买挑战次数返回
 
    this.RegisterProtocal(21318, this.handle21318); // 公会排行榜
 
    this.RegisterProtocal(21319, this.handle21319); // 个人排行榜
 
    this.RegisterProtocal(21303, this.handle21303); // 公会宝箱情况
 
    this.RegisterProtocal(21304, this.handle21304); // 领取公会宝箱
 
    this.RegisterProtocal(21309, this.handle21309); // 战斗结果,用于显示战斗结算
 
    this.RegisterProtocal(21317, this.handle21317); // 扫荡结果,用于显示战斗结算
 
    this.RegisterProtocal(21305, this.handle21305); // 加buff
 
    this.RegisterProtocal(21323, this.handle21323); //集结
  },
  //开关主窗体
  openMainWindow: function openMainWindow(status) {
    if (!status) {
      if (this.main_window) {
        this.main_window.close();
        this.main_window = null;
      }
    } else {
      if (this.role_vo == null || this.role_vo.gid == 0) {
        message(Utils.TI18N("你当前还没有加入任何公会!"));
        return;
      }
 
      var config = gdata("guild_dun_data", "data_const", "guild_lev");
 
      if (config == null) {
        message(Utils.TI18N("公会副本数据异常!"));
        return;
      }
 
      if (this.role_vo.guild_lev < config.val) {
        message(config.desc);
        return;
      }
 
      var open_data = gdata("function_data", "data_base", [6]);
      var bool = MainuiController.getInstance().checkIsOpenByActivate(open_data.activate);
 
      if (bool == false) {
        message(open_data.desc);
        return;
      }
 
      if (this.main_window == null) {
        this.main_window = Utils.createClass("guildboss_main_window");
      }
 
      this.main_window.open();
    }
  },
  //开关boss总览窗体
  openGuildBossPreviewWindow: function openGuildBossPreviewWindow(status) {
    if (!status) {
      if (this.boss_preview_window) {
        this.boss_preview_window.close();
        this.boss_preview_window = null;
      }
    } else {
      if (this.boss_preview_window == null) {
        this.boss_preview_window = Utils.createClass("guildboss_preview_window");
      }
 
      this.boss_preview_window.open();
    }
  },
  //挑战或者扫荡结算面板
  openGuildbossResultWindow: function openGuildbossResultWindow(status, data) {
    if (!status) {
      if (this.result_window) {
        this.result_window.close();
        this.result_window = null;
      }
    } else {
      if (this.result_window == null) {
        this.result_window = Utils.createClass("guildboss_result_window");
      }
 
      this.result_window.open(data);
    }
  },
  //伤害排行榜
  openGuildBossRankWindow: function openGuildBossRankWindow(status, data) {
    if (!status) {
      if (this.rank_window) {
        this.rank_window.close();
        this.rank_window = null;
      }
    } else {
      if (this.rank_window == null) {
        this.rank_window = Utils.createClass("guildboss_rank_window");
      }
 
      this.rank_window.open(data);
    }
  },
  //打开总览奖励界面
  oepnGuildRewardShowView: function oepnGuildRewardShowView(status) {
    if (!status) {
      if (this.reward_view) {
        this.reward_view.close();
        this.reward_view = null;
      }
    } else {
      if (this.reward_view == null) {
        this.reward_view = Utils.createClass("guildboss_reward_view");
      }
 
      this.reward_view.open();
    }
  },
  //请求公会副本的基础信息,这个在每次打开面板的时候都请求一下吧
  requestGuildDunBaseInfo: function requestGuildDunBaseInfo() {
    this.SendProtocal(21300, {});
  },
  //公会副本的基础信息返回
  handle21300: function handle21300(data) {
    this.model.updateGuildDunBaseInfo(data);
    gcore.GlobalEvent.fire(GuildbossEvent.MusterCoolTime, data.coldtime || 0);
  },
  //购买次数提示,FALSE为普通购买次数 TRUE是挑战购买次数
  requestBuyChallengeTimes: function requestBuyChallengeTimes(buy_type) {
    var base_info = this.model.getBaseInfo();
    if (base_info == null || base_info.buy_count == null) return;
    var role_vo = RoleController.getInstance().getRoleVo();
    if (role_vo == null) return;
 
    if (base_info.count != 0) {
      message(Utils.TI18N("挑战次数为0时可购买,请努力挑战Boss!"));
      return;
    }
 
    var buy_callback = function (type) {
      var protocal = {};
      protocal.type = type;
      this.SendProtocal(21312, protocal);
    }.bind(this);
 
    var buy_next_num = base_info.buy_count + 1;
    var buy_config = gdata("guild_dun_data", "data_buy_count", [buy_next_num]);
 
    if (buy_config == null) {
      message(Utils.TI18N("当前购买次数已到达本日上限"));
    } else {
      if (role_vo.vip_lev < buy_config.vip_lev) {
        var msg = cc.js.formatStr(Utils.TI18N("提升至<color=#289b14>vip%s</c>可提高<color=#289b14>1</c>点次数购买上限,是否前往充值提升vip等级"), buy_config.vip_lev);
 
        var CommonAlert = require("commonalert");
 
        CommonAlert.show(msg, Utils.TI18N("我要提升"), function () {
          require("vip_controller").getInstance().openVipMainWindow(true, VIPTABCONST.CHARGE);
        }, Utils.TI18N("取消"), null, 2);
      } else {
        var cost = buy_config.expend;
        if (cost == null || Utils.getArrLen(cost) < 2) return;
        var item_config = Utils.getItemConfig(cost[0]);
 
        if (item_config) {
          var msg = cc.js.formatStr(Utils.TI18N("是否花费 <img src='%s' scale=0.35 />%s 购买<color=#289b14>1</c>点挑战次数?"), item_config.icon, cost[1]);
          var res = PathTool.getItemRes(item_config.icon);
 
          var CommonAlert = require("commonalert");
 
          CommonAlert.show(msg, Utils.TI18N("确定"), function () {
            buy_callback(buy_type);
          }, Utils.TI18N("取消"), null, 2, null, {
            resArr: [res]
          });
        }
      }
    }
  },
  //购买次数返回
  handle21312: function handle21312(data) {
    message(data.msg);
    if (data.code == 1) this.model.updateBaseWithTimes(data.count, data.buy_count, data.type);
  },
  //请求重置公会章节信息
  requestResetGuildDun: function requestResetGuildDun(type) {
    var protocal = {};
    protocal.type = type;
    this.SendProtocal(21307, protocal);
  },
  //重置返回
  handle21307: function handle21307(data) {
    message(data.msg);
  },
  //请求挑战指定的boss
  send21308: function send21308(boss_id, formation_type, pos_info, hallows_id) {
    var protocal = {};
    protocal.boss_id = boss_id;
    protocal.formation_type = formation_type;
    protocal.pos_info = pos_info;
    protocal.hallows_id = hallows_id;
    this.SendProtocal(21308, protocal);
  },
  //请求挑战返回
  handle21308: function handle21308(data) {
    message(data.msg);
  },
  //更新每日宝箱
  handle21303: function handle21303(data) {
    this.model.initDayBoxRewardsStatus(data.bos_list);
  },
  //领取宝箱返回
  handle21304: function handle21304(data) {
    message(data.msg);
    if (data.code == 1) this.model.updateBoxRewards(data.fid, data.num);
  },
  handle21321: function handle21321(data) {
    message(data.msg);
  },
  //集结
  send21323: function send21323() {
    this.SendProtocal(21323, {});
  },
  handle21323: function handle21323(data) {
    if (data.code == 0) {
      message(data.msg);
    } else if (data.code == 1) {
      var less_time = data.coldtime - gcore.SmartSocket.getTime();
      gcore.GlobalEvent.fire(GuildbossEvent.MusterCoolTime, less_time || 0);
    }
  },
  //加buff数据
  send21305: function send21305() {
    this.SendProtocal(21305, {});
  },
  handle21305: function handle21305(data) {
    message(data.msg);
  },
  //请求排行榜数据
  requestGuildDunRank: function requestGuildDunRank(index, protocal) {
    if (index == GuildbossConst.rank.guild) {
      this.SendProtocal(21327, {});
    } else if (index == GuildbossConst.rank.role) {
      if (protocal) this.SendProtocal(21319, protocal);
    }
  },
  //公会排行榜
  handle21318: function handle21318(data) {
    gcore.GlobalEvent.fire(GuildbossEvent.UpdateGuildDunRank, data, GuildbossConst.rank.guild);
  },
  //个人排行榜
  handle21319: function handle21319(data) {
    this.model.setRaknRoleList(data);
    gcore.GlobalEvent.fire(GuildbossEvent.UpdateGuildDunRank, data, GuildbossConst.rank.role);
  },
  //挑战结果,用于显示结算面板的
  handle21309: function handle21309(data) {
    BattleController.getInstance().openFinishView(true, BattleConst.Fight_Type.GuildDun, data);
  },
  //扫荡结算
  handle21317: function handle21317(data) {
    message(data.msg);
    if (data.code == 1) BattleController.getInstance().openFinishView(true, BattleConst.Fight_Type.GuildDun, data);
  },
  //请求扫荡指定boss
  requestMopupMonster: function requestMopupMonster(boss_id) {
    var protocal = {};
    protocal.boss_id = boss_id;
    this.SendProtocal(21317, protocal);
  },
  getGuildBossMainRootWnd: function getGuildBossMainRootWnd() {
    if (this.main_window) {
      return this.main_window.root_wnd;
    }
  }
});
module.exports = GuildbossController;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlsZGJvc3NcXGd1aWxkYm9zc19jb250cm9sbGVyLmpzIl0sIm5hbWVzIjpbIlJvbGVDb250cm9sbGVyIiwicmVxdWlyZSIsIk1haW51aUNvbnRyb2xsZXIiLCJHdWlsZGJvc3NFdmVudCIsIkJhdHRsZUNvbnRyb2xsZXIiLCJCYXR0bGVDb25zdCIsIkd1aWxkYm9zc0NvbnN0IiwiR3VpbGRib3NzQ29udHJvbGxlciIsImNjIiwiQ2xhc3MiLCJCYXNlQ29udHJvbGxlciIsImN0b3IiLCJpbml0Q29uZmlnIiwiR3VpbGRib3NzTW9kZWwiLCJtb2RlbCIsImdldE1vZGVsIiwicmVnaXN0ZXJFdmVudHMiLCJpbml0X3JvbGVfZXZlbnQiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiYmluZCIsIkV2ZW50SWQiLCJFVlRfUk9MRV9DUkVBVEVfU1VDQ0VTUyIsInVuYmluZCIsInJvbGVfdm8iLCJnZXRJbnN0YW5jZSIsImdldFJvbGVWbyIsInJlcXVlc3RJbml0UHJvdG9jYWwiLCJyb2xlX2Fzc2V0c19ldmVudCIsIlVQREFURV9ST0xFX0FUVFJJQlVURSIsImtleSIsInZhbHVlIiwib3Blbk1haW5XaW5kb3ciLCJyZV9saW5rX2dhbWVfZXZlbnQiLCJFVlRfUkVfTElOS19HQU1FIiwiZm9yY2UiLCJjb25maWciLCJnZGF0YSIsImdpZCIsImd1aWxkX2xldiIsInZhbCIsImNsZWFyR3VpbGRCb3NzSW5mbyIsInJlcXVlc3RHdWlsZER1bkJhc2VJbmZvIiwiYmFzZV9pbmZvIiwiZ2V0QmFzZUluZm8iLCJVdGlscyIsIm5leHQiLCJyZWdpc3RlclByb3RvY2FscyIsIlJlZ2lzdGVyUHJvdG9jYWwiLCJoYW5kbGUyMTMwMCIsImhhbmRsZTIxMzA3IiwiaGFuZGxlMjEzMDgiLCJoYW5kbGUyMTMxMiIsImhhbmRsZTIxMzE4IiwiaGFuZGxlMjEzMTkiLCJoYW5kbGUyMTMwMyIsImhhbmRsZTIxMzA0IiwiaGFuZGxlMjEzMDkiLCJoYW5kbGUyMTMxNyIsImhhbmRsZTIxMzA1IiwiaGFuZGxlMjEzMjMiLCJzdGF0dXMiLCJtYWluX3dpbmRvdyIsImNsb3NlIiwibWVzc2FnZSIsIlRJMThOIiwiZGVzYyIsIm9wZW5fZGF0YSIsImJvb2wiLCJjaGVja0lzT3BlbkJ5QWN0aXZhdGUiLCJhY3RpdmF0ZSIsImNyZWF0ZUNsYXNzIiwib3BlbiIsIm9wZW5HdWlsZEJvc3NQcmV2aWV3V2luZG93IiwiYm9zc19wcmV2aWV3X3dpbmRvdyIsIm9wZW5HdWlsZGJvc3NSZXN1bHRXaW5kb3ciLCJkYXRhIiwicmVzdWx0X3dpbmRvdyIsIm9wZW5HdWlsZEJvc3NSYW5rV2luZG93IiwicmFua193aW5kb3ciLCJvZXBuR3VpbGRSZXdhcmRTaG93VmlldyIsInJld2FyZF92aWV3IiwiU2VuZFByb3RvY2FsIiwidXBkYXRlR3VpbGREdW5CYXNlSW5mbyIsImZpcmUiLCJNdXN0ZXJDb29sVGltZSIsImNvbGR0aW1lIiwicmVxdWVzdEJ1eUNoYWxsZW5nZVRpbWVzIiwiYnV5X3R5cGUiLCJidXlfY291bnQiLCJjb3VudCIsImJ1eV9jYWxsYmFjayIsInR5cGUiLCJwcm90b2NhbCIsImJ1eV9uZXh0X251bSIsImJ1eV9jb25maWciLCJ2aXBfbGV2IiwibXNnIiwianMiLCJmb3JtYXRTdHIiLCJDb21tb25BbGVydCIsInNob3ciLCJvcGVuVmlwTWFpbldpbmRvdyIsIlZJUFRBQkNPTlNUIiwiQ0hBUkdFIiwiY29zdCIsImV4cGVuZCIsImdldEFyckxlbiIsIml0ZW1fY29uZmlnIiwiZ2V0SXRlbUNvbmZpZyIsImljb24iLCJyZXMiLCJQYXRoVG9vbCIsImdldEl0ZW1SZXMiLCJyZXNBcnIiLCJjb2RlIiwidXBkYXRlQmFzZVdpdGhUaW1lcyIsInJlcXVlc3RSZXNldEd1aWxkRHVuIiwic2VuZDIxMzA4IiwiYm9zc19pZCIsImZvcm1hdGlvbl90eXBlIiwicG9zX2luZm8iLCJoYWxsb3dzX2lkIiwiaW5pdERheUJveFJld2FyZHNTdGF0dXMiLCJib3NfbGlzdCIsInVwZGF0ZUJveFJld2FyZHMiLCJmaWQiLCJudW0iLCJoYW5kbGUyMTMyMSIsInNlbmQyMTMyMyIsImxlc3NfdGltZSIsIlNtYXJ0U29ja2V0IiwiZ2V0VGltZSIsInNlbmQyMTMwNSIsInJlcXVlc3RHdWlsZER1blJhbmsiLCJpbmRleCIsInJhbmsiLCJndWlsZCIsInJvbGUiLCJVcGRhdGVHdWlsZER1blJhbmsiLCJzZXRSYWtuUm9sZUxpc3QiLCJvcGVuRmluaXNoVmlldyIsIkZpZ2h0X1R5cGUiLCJHdWlsZER1biIsInJlcXVlc3RNb3B1cE1vbnN0ZXIiLCJnZXRHdWlsZEJvc3NNYWluUm9vdFduZCIsInJvb3Rfd25kIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxjQUFjLEdBQUdDLE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJQyxnQkFBZ0IsR0FBR0QsT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlFLGNBQWMsR0FBR0YsT0FBTyxDQUFDLGlCQUFELENBQTVCOztBQUNBLElBQUlHLGdCQUFnQixHQUFHSCxPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSUksV0FBVyxHQUFHSixPQUFPLENBQUMsY0FBRCxDQUF6Qjs7QUFDQSxJQUFJSyxjQUFjLEdBQUdMLE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFFQSxJQUFJTSxtQkFBbUIsR0FBR0MsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDL0IsYUFBU0MsY0FEc0I7QUFFL0JDLEVBQUFBLElBQUksRUFBRSxnQkFBWSxDQUNqQixDQUg4QjtBQUsvQjtBQUNBQyxFQUFBQSxVQUFVLEVBQUUsc0JBQVk7QUFDcEIsUUFBSUMsY0FBYyxHQUFHWixPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBRUEsU0FBS2EsS0FBTCxHQUFhLElBQUlELGNBQUosRUFBYjtBQUNBLFNBQUtDLEtBQUwsQ0FBV0YsVUFBWDtBQUNI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QUEzVzhCLENBQVQsQ0FBMUI7QUE4V0FDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjdJLG1CQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDov5nph4zloavlhpnor6bnu4bor7TmmI4s5Li76KaB5aGr5YaZ6K+l5qih5Z2X55qE5Yqf6IO9566A6KaBXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wMS0yNCAxNzo0NDo1NFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XG52YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbnZhciBHdWlsZGJvc3NFdmVudCA9IHJlcXVpcmUoXCJndWlsZGJvc3NfZXZlbnRcIik7XG52YXIgQmF0dGxlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKTtcbnZhciBCYXR0bGVDb25zdCA9IHJlcXVpcmUoXCJiYXR0bGVfY29uc3RcIik7XG52YXIgR3VpbGRib3NzQ29uc3QgPSByZXF1aXJlKFwiZ3VpbGRib3NzX2NvbnN0XCIpO1xuXG52YXIgR3VpbGRib3NzQ29udHJvbGxlciA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlQ29udHJvbGxlcixcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMlumFjee9ruaVsOaNrlxuICAgIGluaXRDb25maWc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEd1aWxkYm9zc01vZGVsID0gcmVxdWlyZShcImd1aWxkYm9zc19tb2RlbFwiKTtcblxuICAgICAgICB0aGlzLm1vZGVsID0gbmV3IEd1aWxkYm9zc01vZGVsKCk7XG4gICAgICAgIHRoaXMubW9kZWwuaW5pdENvbmZpZygpO1xuICAgIH0sXG5cbiAgICAvLyDov5Tlm57lvZPliY3nmoRtb2RlbFxuICAgIGdldE1vZGVsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICAgIH0sXG5cbiAgICAvLyDms6jlhoznm5HlkKzkuovku7ZcbiAgICByZWdpc3RlckV2ZW50czogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbml0X3JvbGVfZXZlbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5pbml0X3JvbGVfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuRVZUX1JPTEVfQ1JFQVRFX1NVQ0NFU1MsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC51bmJpbmQodGhpcy5pbml0X3JvbGVfZXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdF9yb2xlX2V2ZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfdm8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RJbml0UHJvdG9jYWwodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfYXNzZXRzX2V2ZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPSB0aGlzLnJvbGVfdm8uYmluZChFdmVudElkLlVQREFURV9ST0xFX0FUVFJJQlVURSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09IFwiZ3VpbGRfbGV2XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5pdFByb3RvY2FsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0gXCJnaWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuTWFpbldpbmRvdyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdGhpcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlX2xpbmtfZ2FtZV9ldmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlX2xpbmtfZ2FtZV9ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoRXZlbnRJZC5FVlRfUkVfTElOS19HQU1FLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5pdFByb3RvY2FsKHRydWUpO1xuICAgICAgICAgICAgfSwgdGhpcylcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+ivt+axguaIluiAhea4hemZpOS4gOS6m+WfuuehgOS/oeaBr+eahOS4nOilv1xuICAgIHJlcXVlc3RJbml0UHJvdG9jYWw6IGZ1bmN0aW9uIChmb3JjZSkge1xuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdmFyIGNvbmZpZyA9IGdkYXRhKFwiZ3VpbGRfZHVuX2RhdGFcIiwgXCJkYXRhX2NvbnN0XCIsIFwiZ3VpbGRfbGV2XCIpO1xuICAgICAgICBpZiAoY29uZmlnID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgaWYgKHRoaXMucm9sZV92by5naWQgPT0gMCB8fCB0aGlzLnJvbGVfdm8uZ3VpbGRfbGV2IDwgY29uZmlnLnZhbCkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5jbGVhckd1aWxkQm9zc0luZm8oe30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcmNlID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RHdWlsZER1bkJhc2VJbmZvKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBiYXNlX2luZm8gPSB0aGlzLm1vZGVsLmdldEJhc2VJbmZvKCk7XG4gICAgICAgICAgICAgICAgaWYgKGJhc2VfaW5mbyA9PSBudWxsIHx8IFV0aWxzLm5leHQoYmFzZV9pbmZvKSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdEd1aWxkRHVuQmFzZUluZm8oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5Y2P6K6u5o6l5Y+X5LqL5Lu2XG4gICAgcmVnaXN0ZXJQcm90b2NhbHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIxMzAwLCB0aGlzLmhhbmRsZTIxMzAwKSAgICAgICAgIC8vIOWFrOS8muWJr+acrOeahOWfuuehgOS/oeaBr1xuXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMTMwNywgdGhpcy5oYW5kbGUyMTMwNykgICAgICAgICAvLyDph43nva7ov5Tlm55cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIxMzA4LCB0aGlzLmhhbmRsZTIxMzA4KSAgICAgICAgIC8vIOivt+axguaMkeaImOi/lOWbnlxuXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMTMxMiwgdGhpcy5oYW5kbGUyMTMxMikgICAgICAgICAvLyDotK3kubDmjJHmiJjmrKHmlbDov5Tlm55cblxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjEzMTgsIHRoaXMuaGFuZGxlMjEzMTgpICAgICAgICAgLy8g5YWs5Lya5o6S6KGM5qacXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMTMxOSwgdGhpcy5oYW5kbGUyMTMxOSkgICAgICAgICAvLyDkuKrkurrmjpLooYzmppxcblxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjEzMDMsIHRoaXMuaGFuZGxlMjEzMDMpICAgICAgICAgLy8g5YWs5Lya5a6d566x5oOF5Ya1XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMTMwNCwgdGhpcy5oYW5kbGUyMTMwNCkgICAgICAgICAvLyDpooblj5blhazkvJrlrp3nrrFcblxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjEzMDksIHRoaXMuaGFuZGxlMjEzMDkpICAgICAgICAgLy8g5oiY5paX57uT5p6c77yM55So5LqO5pi+56S65oiY5paX57uT566XXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMTMxNywgdGhpcy5oYW5kbGUyMTMxNykgICAgICAgICAvLyDmiavojaHnu5PmnpzvvIznlKjkuo7mmL7npLrmiJjmlpfnu5PnrpdcblxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjEzMDUsIHRoaXMuaGFuZGxlMjEzMDUpICAgICAgICAgLy8g5YqgYnVmZlxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjEzMjMsIHRoaXMuaGFuZGxlMjEzMjMpICAgICAgICAgLy/pm4bnu5NcblxuICAgIH0sXG5cbiAgICAvL+W8gOWFs+S4u+eql+S9k1xuICAgIG9wZW5NYWluV2luZG93OiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmICghc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tYWluX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMubWFpbl93aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5fd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfdm8gPT0gbnVsbCB8fCB0aGlzLnJvbGVfdm8uZ2lkID09IDApIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5L2g5b2T5YmN6L+Y5rKh5pyJ5Yqg5YWl5Lu75L2V5YWs5LyaIVwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY29uZmlnID0gZ2RhdGEoXCJndWlsZF9kdW5fZGF0YVwiLCBcImRhdGFfY29uc3RcIiwgXCJndWlsZF9sZXZcIik7XG4gICAgICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5YWs5Lya5Ymv5pys5pWw5o2u5byC5bi4IVwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5yb2xlX3ZvLmd1aWxkX2xldiA8IGNvbmZpZy52YWwpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlKGNvbmZpZy5kZXNjKTtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvcGVuX2RhdGEgPSBnZGF0YShcImZ1bmN0aW9uX2RhdGFcIiwgXCJkYXRhX2Jhc2VcIiwgWzZdKTtcbiAgICAgICAgICAgIHZhciBib29sID0gTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmNoZWNrSXNPcGVuQnlBY3RpdmF0ZShvcGVuX2RhdGEuYWN0aXZhdGUpO1xuICAgICAgICAgICAgaWYgKGJvb2wgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlKG9wZW5fZGF0YS5kZXNjKTtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm1haW5fd2luZG93ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5fd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJndWlsZGJvc3NfbWFpbl93aW5kb3dcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1haW5fd2luZG93Lm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+W8gOWFs2Jvc3PmgLvop4jnqpfkvZNcbiAgICBvcGVuR3VpbGRCb3NzUHJldmlld1dpbmRvdzogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAoIXN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYm9zc19wcmV2aWV3X3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuYm9zc19wcmV2aWV3X3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYm9zc19wcmV2aWV3X3dpbmRvdyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ib3NzX3ByZXZpZXdfd2luZG93ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJvc3NfcHJldmlld193aW5kb3cgPSBVdGlscy5jcmVhdGVDbGFzcyhcImd1aWxkYm9zc19wcmV2aWV3X3dpbmRvd1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYm9zc19wcmV2aWV3X3dpbmRvdy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvL+aMkeaImOaIluiAheaJq+iNoee7k+eul+mdouadv1xuICAgIG9wZW5HdWlsZGJvc3NSZXN1bHRXaW5kb3c6IGZ1bmN0aW9uIChzdGF0dXMsIGRhdGEpIHtcbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc3VsdF93aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdF93aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdF93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzdWx0X3dpbmRvdyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJndWlsZGJvc3NfcmVzdWx0X3dpbmRvd1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVzdWx0X3dpbmRvdy5vcGVuKGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuXG4gICAgLy/kvKTlrrPmjpLooYzmppxcbiAgICBvcGVuR3VpbGRCb3NzUmFua1dpbmRvdzogZnVuY3Rpb24gKHN0YXR1cywgZGF0YSkge1xuICAgICAgICBpZiAoIXN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHRoaXMucmFua193aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhbmtfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yYW5rX3dpbmRvdyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yYW5rX3dpbmRvdyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYW5rX3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiZ3VpbGRib3NzX3Jhbmtfd2luZG93XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yYW5rX3dpbmRvdy5vcGVuKGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5omT5byA5oC76KeI5aWW5Yqx55WM6Z2iXG4gICAgb2Vwbkd1aWxkUmV3YXJkU2hvd1ZpZXc6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJld2FyZF92aWV3KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXdhcmRfdmlldy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmV3YXJkX3ZpZXcgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucmV3YXJkX3ZpZXcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmV3YXJkX3ZpZXcgPSBVdGlscy5jcmVhdGVDbGFzcyhcImd1aWxkYm9zc19yZXdhcmRfdmlld1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmV3YXJkX3ZpZXcub3BlbigpO1xuICAgICAgICB9XG4gICAgfSxcblxuXG4gICAgLy/or7fmsYLlhazkvJrlia/mnKznmoTln7rnoYDkv6Hmga/vvIzov5nkuKrlnKjmr4/mrKHmiZPlvIDpnaLmnb/nmoTml7blgJnpg73or7fmsYLkuIDkuIvlkKdcbiAgICByZXF1ZXN0R3VpbGREdW5CYXNlSW5mbzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMTMwMCwge30pO1xuICAgIH0sXG5cbiAgICAvL+WFrOS8muWJr+acrOeahOWfuuehgOS/oeaBr+i/lOWbnlxuICAgIGhhbmRsZTIxMzAwOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZUd1aWxkRHVuQmFzZUluZm8oZGF0YSk7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpbGRib3NzRXZlbnQuTXVzdGVyQ29vbFRpbWUsIGRhdGEuY29sZHRpbWUgfHwgMCk7XG4gICAgfSxcblxuICAgIC8v6LSt5Lmw5qyh5pWw5o+Q56S677yMRkFMU0XkuLrmma7pgJrotK3kubDmrKHmlbAgVFJVReaYr+aMkeaImOi0reS5sOasoeaVsFxuICAgIHJlcXVlc3RCdXlDaGFsbGVuZ2VUaW1lczogZnVuY3Rpb24gKGJ1eV90eXBlKSB7XG4gICAgICAgIHZhciBiYXNlX2luZm8gPSB0aGlzLm1vZGVsLmdldEJhc2VJbmZvKCk7XG4gICAgICAgIGlmIChiYXNlX2luZm8gPT0gbnVsbCB8fCBiYXNlX2luZm8uYnV5X2NvdW50ID09IG51bGwpIHJldHVyblxuICAgICAgICB2YXIgcm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgIGlmIChyb2xlX3ZvID09IG51bGwpIHJldHVyblxuICAgICAgICBpZiAoYmFzZV9pbmZvLmNvdW50ICE9IDApIHtcbiAgICAgICAgICAgIG1lc3NhZ2UoVXRpbHMuVEkxOE4oXCLmjJHmiJjmrKHmlbDkuLow5pe25Y+v6LSt5Lmw77yM6K+35Yqq5Yqb5oyR5oiYQm9zc++8gVwiKSk7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB2YXIgYnV5X2NhbGxiYWNrID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICAgICAgcHJvdG9jYWwudHlwZSA9IHR5cGU7XG4gICAgICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMTMxMiwgcHJvdG9jYWwpO1xuICAgICAgICB9LmJpbmQodGhpcylcblxuICAgICAgICB2YXIgYnV5X25leHRfbnVtID0gYmFzZV9pbmZvLmJ1eV9jb3VudCArIDE7XG4gICAgICAgIHZhciBidXlfY29uZmlnID0gZ2RhdGEoXCJndWlsZF9kdW5fZGF0YVwiLCBcImRhdGFfYnV5X2NvdW50XCIsIFtidXlfbmV4dF9udW1dKTtcbiAgICAgICAgaWYgKGJ1eV9jb25maWcgPT0gbnVsbCkge1xuICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuW9k+WJjei0reS5sOasoeaVsOW3suWIsOi+vuacrOaXpeS4iumZkFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocm9sZV92by52aXBfbGV2IDwgYnV5X2NvbmZpZy52aXBfbGV2KSB7XG4gICAgICAgICAgICAgICAgdmFyIG1zZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuaPkOWNh+iHszxjb2xvcj0jMjg5YjE0PnZpcCVzPC9jPuWPr+aPkOmrmDxjb2xvcj0jMjg5YjE0PjE8L2M+54K55qyh5pWw6LSt5Lmw5LiK6ZmQ77yM5piv5ZCm5YmN5b6A5YWF5YC85o+Q5Y2Hdmlw562J57qnXCIpLCBidXlfY29uZmlnLnZpcF9sZXYpO1xuICAgICAgICAgICAgICAgIHZhciBDb21tb25BbGVydCA9IHJlcXVpcmUoXCJjb21tb25hbGVydFwiKTtcbiAgICAgICAgICAgICAgICBDb21tb25BbGVydC5zaG93KG1zZywgVXRpbHMuVEkxOE4oXCLmiJHopoHmj5DljYdcIiksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShcInZpcF9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlblZpcE1haW5XaW5kb3codHJ1ZSwgVklQVEFCQ09OU1QuQ0hBUkdFKVxuICAgICAgICAgICAgICAgIH0sIFV0aWxzLlRJMThOKFwi5Y+W5raIXCIpLCBudWxsLCAyKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgY29zdCA9IGJ1eV9jb25maWcuZXhwZW5kO1xuICAgICAgICAgICAgICAgIGlmIChjb3N0ID09IG51bGwgfHwgVXRpbHMuZ2V0QXJyTGVuKGNvc3QpIDwgMikgcmV0dXJuXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1fY29uZmlnID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyhjb3N0WzBdKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbV9jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1zZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuaYr+WQpuiKsei0uSA8aW1nIHNyYz0nJXMnIHNjYWxlPTAuMzUgLz4lcyDotK3kubA8Y29sb3I9IzI4OWIxND4xPC9jPueCueaMkeaImOasoeaVsO+8n1wiKSwgaXRlbV9jb25maWcuaWNvbiwgY29zdFsxXSlcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldEl0ZW1SZXMoaXRlbV9jb25maWcuaWNvbilcbiAgICAgICAgICAgICAgICAgICAgdmFyIENvbW1vbkFsZXJ0ID0gcmVxdWlyZShcImNvbW1vbmFsZXJ0XCIpO1xuICAgICAgICAgICAgICAgICAgICBDb21tb25BbGVydC5zaG93KG1zZywgVXRpbHMuVEkxOE4oXCLnoa7lrppcIiksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1eV9jYWxsYmFjayhidXlfdHlwZSlcbiAgICAgICAgICAgICAgICAgICAgfSwgVXRpbHMuVEkxOE4oXCLlj5bmtohcIiksIG51bGwsIDIsIG51bGwsIHsgcmVzQXJyOiBbcmVzXSB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+i0reS5sOasoeaVsOi/lOWbnlxuICAgIGhhbmRsZTIxMzEyOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgaWYgKGRhdGEuY29kZSA9PSAxKVxuICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVCYXNlV2l0aFRpbWVzKGRhdGEuY291bnQsIGRhdGEuYnV5X2NvdW50LCBkYXRhLnR5cGUpO1xuICAgIH0sXG5cbiAgICAvL+ivt+axgumHjee9ruWFrOS8mueroOiKguS/oeaBr1xuICAgIHJlcXVlc3RSZXNldEd1aWxkRHVuOiBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIxMzA3LCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIC8v6YeN572u6L+U5ZueXG4gICAgaGFuZGxlMjEzMDc6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgIH0sXG5cbiAgICAvL+ivt+axguaMkeaImOaMh+WumueahGJvc3NcbiAgICBzZW5kMjEzMDg6IGZ1bmN0aW9uIChib3NzX2lkLCBmb3JtYXRpb25fdHlwZSwgcG9zX2luZm8sIGhhbGxvd3NfaWQpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmJvc3NfaWQgPSBib3NzX2lkO1xuICAgICAgICBwcm90b2NhbC5mb3JtYXRpb25fdHlwZSA9IGZvcm1hdGlvbl90eXBlO1xuICAgICAgICBwcm90b2NhbC5wb3NfaW5mbyA9IHBvc19pbmZvO1xuICAgICAgICBwcm90b2NhbC5oYWxsb3dzX2lkID0gaGFsbG93c19pZDtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjEzMDgsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgLy/or7fmsYLmjJHmiJjov5Tlm55cbiAgICBoYW5kbGUyMTMwODogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgfSxcblxuXG4gICAgLy/mm7TmlrDmr4/ml6Xlrp3nrrFcbiAgICBoYW5kbGUyMTMwMzogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5pbml0RGF5Qm94UmV3YXJkc1N0YXR1cyhkYXRhLmJvc19saXN0KTtcbiAgICB9LFxuXG4gICAgLy/pooblj5blrp3nrrHov5Tlm55cbiAgICBoYW5kbGUyMTMwNDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcbiAgICAgICAgaWYgKGRhdGEuY29kZSA9PSAxKVxuICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVCb3hSZXdhcmRzKGRhdGEuZmlkLCBkYXRhLm51bSk7XG4gICAgfSxcblxuICAgIGhhbmRsZTIxMzIxOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICB9LFxuXG4gICAgLy/pm4bnu5NcbiAgICBzZW5kMjEzMjM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjEzMjMsIHt9KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjEzMjM6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLmNvZGUgPT0gMCkge1xuICAgICAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5jb2RlID09IDEpIHtcbiAgICAgICAgICAgIHZhciBsZXNzX3RpbWUgPSBkYXRhLmNvbGR0aW1lIC0gZ2NvcmUuU21hcnRTb2NrZXQuZ2V0VGltZSgpO1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZGJvc3NFdmVudC5NdXN0ZXJDb29sVGltZSwgbGVzc190aW1lIHx8IDApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5YqgYnVmZuaVsOaNrlxuICAgIHNlbmQyMTMwNTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMTMwNSwge30pO1xuICAgIH0sXG5cbiAgICBoYW5kbGUyMTMwNTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgfSxcblxuICAgIC8v6K+35rGC5o6S6KGM5qac5pWw5o2uXG4gICAgcmVxdWVzdEd1aWxkRHVuUmFuazogZnVuY3Rpb24gKGluZGV4LCBwcm90b2NhbCkge1xuICAgICAgICBpZiAoaW5kZXggPT0gR3VpbGRib3NzQ29uc3QucmFuay5ndWlsZCkge1xuICAgICAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjEzMjcsIHt9KTtcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleCA9PSBHdWlsZGJvc3NDb25zdC5yYW5rLnJvbGUpIHtcbiAgICAgICAgICAgIGlmIChwcm90b2NhbClcbiAgICAgICAgICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMTMxOSwgcHJvdG9jYWwpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5YWs5Lya5o6S6KGM5qacXG5cbiAgICBoYW5kbGUyMTMxODogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZGJvc3NFdmVudC5VcGRhdGVHdWlsZER1blJhbmssIGRhdGEsIEd1aWxkYm9zc0NvbnN0LnJhbmsuZ3VpbGQpXG4gICAgfSxcblxuICAgIC8v5Liq5Lq65o6S6KGM5qacXG4gICAgaGFuZGxlMjEzMTk6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHRoaXMubW9kZWwuc2V0UmFrblJvbGVMaXN0KGRhdGEpO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkYm9zc0V2ZW50LlVwZGF0ZUd1aWxkRHVuUmFuaywgZGF0YSwgR3VpbGRib3NzQ29uc3QucmFuay5yb2xlKTtcbiAgICB9LFxuXG4gICAgLy/mjJHmiJjnu5PmnpzvvIznlKjkuo7mmL7npLrnu5PnrpfpnaLmnb/nmoRcbiAgICBoYW5kbGUyMTMwOTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgQmF0dGxlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5GaW5pc2hWaWV3KHRydWUsIEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuR3VpbGREdW4sIGRhdGEpO1xuICAgIH0sXG5cbiAgICAvL+aJq+iNoee7k+eul1xuICAgIGhhbmRsZTIxMzE3OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgaWYgKGRhdGEuY29kZSA9PSAxKVxuICAgICAgICAgICAgQmF0dGxlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5GaW5pc2hWaWV3KHRydWUsIEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuR3VpbGREdW4sIGRhdGEpXG4gICAgfSxcblxuICAgIC8v6K+35rGC5omr6I2h5oyH5a6aYm9zc1xuICAgIHJlcXVlc3RNb3B1cE1vbnN0ZXI6IGZ1bmN0aW9uIChib3NzX2lkKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5ib3NzX2lkID0gYm9zc19pZDtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjEzMTcsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgZ2V0R3VpbGRCb3NzTWFpblJvb3RXbmQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYodGhpcy5tYWluX3dpbmRvdyl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWluX3dpbmRvdy5yb290X3duZDtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEd1aWxkYm9zc0NvbnRyb2xsZXI7Il19