|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/ladder/view/ladder_main_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, 'e7e11Sjh5FGaaMKEg8kuLGU', 'ladder_main_window');
|
// Scripts/mod/ladder/view/ladder_main_window.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 跨服天梯mainview
|
// <br/>Create: 2019-07-24 16:56:38
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool");
|
|
var RoleController = require("role_controller");
|
|
var LadderController = require("ladder_controller");
|
|
var LadderRoleItem = require("ladder_role_item");
|
|
var TimeTool = require("timetool");
|
|
var MainuiController = require("mainui_controller");
|
|
var CommonAlert = require("commonalert");
|
|
var LadderConst = require("ladder_const");
|
|
var LadderEvent = require("ladder_event");
|
|
var Ladder_mainWindow = cc.Class({
|
"extends": BaseView,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("ladder", "ladder_main_window"); // this.viewTag = SCENE_TAG.ui; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
|
// this.win_type = WinType.Full; //是否是全屏窗体 WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
|
},
|
// 初始化一些配置数据,可以用于声明一些变量之类的
|
initConfig: function initConfig() {
|
this.role_vo = RoleController.getInstance().getRoleVo();
|
this.role_panels = {};
|
this.role_items = {};
|
this.ctrl = LadderController.getInstance();
|
this.model = this.ctrl.getModel();
|
this.white_color = new cc.Color(255, 255, 255, 255);
|
this.color_1 = new cc.Color(71, 132, 37, 255);
|
},
|
// 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
|
openCallBack: function openCallBack() {
|
var background = this.seekChild("background");
|
background.scale = FIT_SCALE;
|
this.loadRes(PathTool.getBigBg("bigbg_58"), function (sp) {
|
background.getComponent(cc.Sprite).spriteFrame = sp;
|
}.bind(this));
|
this.main_container = this.seekChild("main_container");
|
this.top_panel = this.seekChild(this.main_container, "top_panel");
|
var win_title = this.seekChild(this.top_panel, "win_title", cc.Label);
|
win_title.string = Utils.TI18N("天梯争霸");
|
this.btn_rule = this.seekChild(this.top_panel, "btn_rule");
|
this.btn_role = this.seekChild(this.top_panel, "btn_role");
|
this.btn_log = this.seekChild(this.top_panel, "btn_log");
|
this.btn_rank = this.seekChild(this.top_panel, "btn_rank");
|
this.btn_award = this.seekChild(this.top_panel, "btn_award");
|
this.btn_shop = this.seekChild(this.top_panel, "btn_shop");
|
this.bottom_panel = this.seekChild(this.main_container, "bottom_panel");
|
var black_bg = this.seekChild(this.bottom_panel, "black_bg");
|
var count_title = this.seekChild(this.bottom_panel, "count_title", cc.Label);
|
count_title.string = Utils.TI18N("挑战次数:");
|
this.count_label_lb = this.seekChild(this.bottom_panel, "count_label", cc.Label);
|
var tips_label = this.seekChild(this.main_container, "tips_label", cc.Label);
|
tips_label.string = Utils.TI18N("快速挑战排名不变");
|
this.time_title_lb = this.seekChild(this.bottom_panel, "time_title", cc.Label);
|
this.time_title_lb.string = Utils.TI18N("距离结束:");
|
this.time_label_lb = this.seekChild(this.bottom_panel, "time_label", cc.Label);
|
var score_bg = this.seekChild(this.main_container, "score_bg");
|
this.score_label_lb = this.seekChild(score_bg, "score_label", cc.Label);
|
this.score_label_lb.string = this.role_vo.sky_coin;
|
var rank_bg = this.seekChild(this.main_container, "rank_bg");
|
var rank_title = this.seekChild(rank_bg, "rank_title", cc.Label);
|
rank_title.string = Utils.TI18N("排名:");
|
this.rank_label_lb = this.seekChild(rank_bg, "rank_label", cc.Label);
|
this.close_btn = this.seekChild(this.main_container, "close_btn");
|
this.refresh_btn = this.seekChild(this.main_container, "refresh_btn");
|
this.refresh_btn._can_touch = true;
|
this.refresh_btn_label_lb = this.seekChild(this.refresh_btn, "label", cc.Label);
|
this.refresh_btn_label_lo = this.seekChild(this.refresh_btn, "label", cc.LabelOutline);
|
this.refresh_btn_label_lb.string = Utils.TI18N("刷新");
|
this.challenge_btn = this.seekChild(this.main_container, "challenge_btn");
|
this.challenge_btn_label_lb = this.seekChild(this.challenge_btn, "label", cc.Label);
|
this.challenge_btn_label_lb.string = Utils.TI18N("一键挑战");
|
this.add_btn = this.seekChild(this.bottom_panel, "add_btn");
|
|
for (var i = 1; i <= 5; i++) {
|
var role_panel = this.seekChild(this.main_container, "role_pos_" + i);
|
this.role_panels[i] = role_panel;
|
}
|
|
this.role_panel_size = this.role_panels[1].getContentSize();
|
},
|
// 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
|
registerEvent: function registerEvent() {
|
Utils.onTouchEnd(this.close_btn, function () {
|
this.ctrl.openMainWindow(false);
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.btn_rule, function () {
|
MainuiController.getInstance().openCommonExplainView(true, Config.sky_ladder_data.data_explain);
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.btn_role, function () {
|
this.ctrl.openLadderTopThreeWindow(true);
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.btn_log, function () {
|
this.ctrl.openLadderLogWindow(true);
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.btn_rank, function () {
|
this.ctrl.openLadderRankWindow(true);
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.btn_award, function () {
|
this.ctrl.openLadderAwardWindow(true);
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.btn_shop, function () {
|
this.ctrl.openLadderShopWindow(true);
|
}.bind(this), 1); //添加挑战次数
|
|
Utils.onTouchEnd(this.add_btn, function () {
|
var is_open = this.model.getLadderIsOpen();
|
|
if (!is_open) {
|
var txt_cfg = Config.sky_ladder_data.data_const["close_text"];
|
|
if (txt_cfg) {
|
message(cc.js.formatStr(Utils.TI18N("每%s天梯争霸"), txt_cfg.desc));
|
}
|
}
|
|
if (this.myBaseInfo) {
|
var buy_combat_num = this.myBaseInfo.buy_combat_num || 0;
|
var cost_config = Config.sky_ladder_data.data_buy_num[buy_combat_num + 1];
|
|
if (cost_config) {
|
if (this.role_vo.vip_lev >= cost_config.vip) {
|
var res = PathTool.getItemRes(Config.ItemData.data_assets_label2id.gold);
|
var msg = cc.js.formatStr(Utils.TI18N("确定消耗<img src='%s'/>%s增加一次挑战次数吗?"), Config.ItemData.data_assets_label2id.gold, cost_config.cost);
|
CommonAlert.show(msg, Utils.TI18N("确定"), function () {
|
this.ctrl.requestBuyChallengeCount();
|
}.bind(this), Utils.TI18N("取消"), null, 2, null, {
|
resArr: [res]
|
});
|
} else {
|
message(Utils.TI18N("提升VIP等级可增加购买次数"));
|
}
|
} else {
|
message(Utils.TI18N("当前已经购买达到上限"));
|
}
|
}
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.refresh_btn, function () {
|
var is_open = this.model.getLadderIsOpen();
|
|
if (is_open) {
|
this.ctrl.requestRefreshEnemyList();
|
} else {
|
var txt_cfg = Config.sky_ladder_data.data_const["clost_text"];
|
|
if (txt_cfg) {
|
message(cc.js.formatStr(Utils.TI18N("每%s天梯争霸"), txt_cfg.desc));
|
}
|
}
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.challenge_btn, function () {
|
var is_open = this.model.getLadderIsOpen();
|
|
if (!is_open) {
|
var txt_cfg = Config.sky_ladder_data.data_const["close_text"];
|
|
if (txt_cfg) {
|
message(cc.js.formatStr(Utils.TI18N("每%s天梯争霸"), txt_cfg.desc));
|
}
|
|
return;
|
}
|
|
var fun = function () {
|
this.ctrl.checkJoinLadderBattle(null, null, true);
|
}.bind(this);
|
|
var str = Utils.TI18N("一键挑战将直接获得奖励,是否继续?\n\n\n <size=22>(消耗一次挑战次数)</size>");
|
CommonAlert.show(str, Utils.TI18N("确定"), fun, Utils.TI18N("取消"), null, 2, null);
|
}.bind(this), 1); //个人数据更新
|
|
this.addGlobalEvent(LadderEvent.UpdateLadderMyBaseInfo, function () {
|
this.refreshMyBaseInfo();
|
}, this); //更新所有对手列表
|
|
this.addGlobalEvent(LadderEvent.UpdateAllLadderEnemyList, function () {
|
this.refreshRoleList();
|
}, this); //积分更新
|
|
if (this.role_vo != null) {
|
if (this.role_assets_event == null) {
|
this.role_assets_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) {
|
if (key == "sky_coin") {
|
this.score_label_lb.string = value;
|
}
|
}.bind(this));
|
}
|
} //活动开启/关闭
|
|
|
this.addGlobalEvent(LadderEvent.UpdateLadderOpenStatus, function () {
|
this.refreshMyBaseInfo();
|
}, this); //红点
|
|
this.addGlobalEvent(LadderEvent.UpdateLadderRedStatus, function () {
|
this.refrehsBtnRedStatus(bid, status);
|
}, this);
|
},
|
// 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
|
openRootWnd: function openRootWnd(params) {
|
this.ctrl.requestLadderMyBaseInfo();
|
this.ctrl.requestLadderEnemyListData();
|
this.refrehsBtnRedStatus();
|
},
|
refreshRoleList: function refreshRoleList() {
|
var enemy_datas = this.model.getLadderEnemyListData();
|
cc.log("enemy_datas==", enemy_datas);
|
|
var sortFunc = function sortFunc(objA, objB) {
|
if (objA.rank != 0 && objB.rank != 0) {
|
return objA.rank - objB.rank;
|
} else if (objA.rank == 0 && objB.rank != 0) {
|
return 1;
|
} else if (objA.rank != 0 && objB.rank == 0) {
|
return -1;
|
} else {
|
return 1;
|
}
|
}; // enemy_datas.sort(sortFunc);
|
//循环
|
|
|
this.list_index = 1;
|
this.startUpdate(5, function () {
|
var index = this.list_index;
|
var role_item = this.role_items[index];
|
|
if (!role_item) {
|
role_item = new LadderRoleItem();
|
var role_panel = this.role_panels[index];
|
role_item.setPosition(cc.v2(this.role_panel_size.width / 2, this.role_panel_size.height - 140));
|
role_item.setParent(role_panel);
|
this.role_items[index] = role_item;
|
}
|
|
var enemy_data = enemy_datas[index];
|
|
if (enemy_data && Utils.next(enemy_data) != null) {
|
role_item.setData(enemy_data);
|
role_item.setVisible(true);
|
} else {
|
role_item.setVisible(false);
|
}
|
|
this.list_index += 1;
|
}.bind(this), 1000 / 5);
|
},
|
//刷新个人信息数据
|
refreshMyBaseInfo: function refreshMyBaseInfo() {
|
this.myBaseInfo = this.model.getLadderMyBaseInfo();
|
var is_open = this.model.getLadderIsOpen();
|
this.count_label_lb.string = this.myBaseInfo.can_combat_num || 0; //今日剩余购买次数
|
|
if (!this.left_buy_count) {
|
this.left_buy_count = Utils.createRichLabel(20, this.white_color, cc.v2(0.5, 0.5), cc.v2(590, 10));
|
this.left_buy_count.setParent(this.bottom_panel);
|
}
|
|
var left_count = this.model.getTodayLeftBuyCount();
|
this.left_buy_count.string = cc.js.formatStr(Utils.TI18N("<color=#fff8bf><outline=2 color=#000000>(剩余购买次数:</outline></c><color=#39e522><outline=2 color=#000000>%d</outline></c><color=#fff8bf><outline=2 color=#000000>)</outline></c>", left_count));
|
|
if (!is_open || !this.myBaseInfo.rank || this.myBaseInfo.rank == 0) {
|
this.rank_label_lb.string = Utils.TI18N("暂无");
|
} else {
|
this.rank_label_lb.string = this.myBaseInfo.rank;
|
}
|
|
this.ref_time = this.myBaseInfo.ref_time || 0; //下次可刷新时间
|
|
this.combat_time = this.myBaseInfo.combat_time || 0; //结束时间
|
|
var cur_time = gcore.SmartSocket.getTime();
|
var com_left_time = this.combat_time - cur_time;
|
|
if (com_left_time < 0) {
|
com_left_time = 0;
|
} //活动开启显示剩余时间、活动未开启显示参赛条件
|
|
|
if (!is_open) {
|
this.time_label_lb.node.active = false;
|
this.time_title_lb.node.active = false;
|
|
if (!this.join_text) {
|
this.join_text = Utils.createRichLabel(22, this.white_color, cc.v2(0.5, 0.5), cc.v2(346, 38.5));
|
this.join_text.setParent(this.bottom_panel);
|
}
|
|
this.join_text.node.active = true;
|
var rank_cfg = Config.sky_ladder_data.data_const["arena_rank"];
|
|
if (rank_cfg) {
|
this.join_text.string = cc.js.formatStr(Utils.TI18N("color=#fff8bf><outline=2 color=#000000>参赛条件:竞技场排名前</outline></c>color=#39e522><outline=2 color=#000000>%d</outline></c>color=#fff8bf><outline=2 color=#000000>名</outline></c>", rank_cfg.val));
|
}
|
} else {
|
this.time_label_lb.node.active = true;
|
this.time_title_lb.node.active = true;
|
this.time_label_lb.string = TimeTool.getTimeFormat(com_left_time);
|
|
if (this.join_text) {
|
this.join_text.node.active = false;
|
}
|
|
this.openLadderTimer(true);
|
}
|
|
var ref_left_time = this.ref_time - cur_time;
|
|
if (ref_left_time <= 0 && this.refresh_btn._can_touch == false) {
|
// setChildUnEnabled(true, self.refresh_btn)
|
this.refresh_btn._can_touch = true;
|
this.refresh_btn_label_lb.string = Utils.TI18N("刷新"); // this.refresh_btn_label_lo.color = this.color_1;
|
|
this.refresh_btn_label_lo.enabled = true;
|
} else if (ref_left_time > 0 && this.refresh_btn._can_touch == true) {
|
// setChildUnEnabled(true, self.refresh_btn)
|
this.refresh_btn._can_touch = false;
|
this.refresh_btn_label_lb.string = cc.js.formatStr(Utils.TI18N("%s秒"), ref_left_time);
|
this.refresh_btn_label_lo.enabled = false;
|
}
|
},
|
//计时器
|
openLadderTimer: function openLadderTimer(status) {
|
if (status == true) {
|
if (this.ladder_timer == null) {
|
this.ladder_timer = gcore.Timer.set(function () {
|
var cur_time = gcore.SmartSocket.getTime();
|
var com_left_time = this.combat_time - cur_time;
|
var ref_left_time = this.ref_time - cur_time;
|
|
if (com_left_time <= 0 && ref_left_time <= 0) {
|
gcore.Timer.del(this.ladder_timer);
|
this.ladder_timer = null;
|
}
|
|
if (com_left_time < 0) {
|
com_left_time = 0;
|
}
|
|
if (com_left_time <= 0) {
|
this.time_label_lb.node.active = false;
|
this.time_title_lb.node.active = false;
|
|
if (this.join_text) {
|
this.join_text.node.active = true;
|
}
|
} else {
|
this.time_label_lb.node.active = true;
|
this.time_title_lb.node.active = true;
|
this.time_label_lb.string = TimeTool.getTimeFormat(com_left_time);
|
}
|
|
if (ref_left_time <= 0) {
|
if (this.refresh_btn._can_touch == false) {
|
this.refresh_btn._can_touch = true; // this.refresh_btn_label_lo.color = this.color_1;
|
// setChildUnEnabled(true, self.refresh_btn)
|
}
|
|
this.refresh_btn_label_lb.string = Utils.TI18N("刷新");
|
} else if (ref_left_time > 0) {
|
if (this.refresh_btn._can_touch == true) {
|
// setChildUnEnabled(true, self.refresh_btn)
|
this.refresh_btn._can_touch = false;
|
this.refresh_btn_label_lo.enabled = false;
|
}
|
|
this.refresh_btn_label_lb.string = cc.js.formatStr(Utils.TI18N("%s秒"), ref_left_time);
|
}
|
}.bind(this), 1000, 1);
|
}
|
} else {
|
if (this.ladder_timer != null) {
|
gcore.Timer.del(this.ladder_timer);
|
this.ladder_timer = null;
|
}
|
}
|
},
|
//红点
|
refrehsBtnRedStatus: function refrehsBtnRedStatus(bid, status) {
|
if (bid == LadderConst.RedType.TopThree) {
|
Utils.addRedPointToNodeByStatus(this.btn_role, status);
|
} else if (bid == LadderConst.RedType.BattleLog) {
|
Utils.addRedPointToNodeByStatus(this.btn_log, status);
|
} else {
|
var top_three_status = this.model.checkRedIsShowByRedType(LadderConst.RedType.TopThree);
|
Utils.addRedPointToNodeByStatus(this.btn_role, top_three_status);
|
var log_status = this.model.checkRedIsShowByRedType(LadderConst.RedType.BattleLog);
|
Utils.addRedPointToNodeByStatus(this.btn_log, log_status);
|
}
|
},
|
// 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
|
closeCallBack: function closeCallBack() {
|
if (this.role_vo) {
|
if (this.role_assets_event) {
|
this.role_vo.unbind(this.role_assets_event);
|
this.role_assets_event = null;
|
}
|
|
this.role_vo = null;
|
}
|
|
for (var k in this.role_items) {
|
var item = this.role_items[k];
|
|
if (item) {
|
item.deleteMe();
|
item = null;
|
}
|
}
|
|
this.role_items = null;
|
this.openLadderTimer(false);
|
this.ctrl.openMainWindow(false);
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxsYWRkZXJcXHZpZXdcXGxhZGRlcl9tYWluX3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsIkxhZGRlckNvbnRyb2xsZXIiLCJMYWRkZXJSb2xlSXRlbSIsIlRpbWVUb29sIiwiTWFpbnVpQ29udHJvbGxlciIsIkNvbW1vbkFsZXJ0IiwiTGFkZGVyQ29uc3QiLCJMYWRkZXJFdmVudCIsIkxhZGRlcl9tYWluV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwiaW5pdENvbmZpZyIsInJvbGVfdm8iLCJnZXRJbnN0YW5jZSIsImdldFJvbGVWbyIsInJvbGVfcGFuZWxzIiwicm9sZV9pdGVtcyIsImN0cmwiLCJtb2RlbCIsImdldE1vZGVsIiwid2hpdGVfY29sb3IiLCJDb2xvciIsImNvbG9yXzEiLCJvcGVuQ2FsbEJhY2siLCJiYWNrZ3JvdW5kIiwic2Vla0NoaWxkIiwic2NhbGUiLCJGSVRfU0NBTEUiLCJsb2FkUmVzIiwiZ2V0QmlnQmciLCJzcCIsImdldENvbXBvbmVudCIsIlNwcml0ZSIsInNwcml0ZUZyYW1lIiwiYmluZCIsIm1haW5fY29udGFpbmVyIiwidG9wX3BhbmVsIiwid2luX3RpdGxlIiwiTGFiZWwiLCJzdHJpbmciLCJVdGlscyIsIlRJMThOIiwiYnRuX3J1bGUiLCJidG5fcm9sZSIsImJ0bl9sb2ciLCJidG5fcmFuayIsImJ0bl9hd2FyZCIsImJ0bl9zaG9wIiwiYm90dG9tX3BhbmVsIiwiYmxhY2tfYmciLCJjb3VudF90aXRsZSIsImNvdW50X2xhYmVsX2xiIiwidGlwc19sYWJlbCIsInRpbWVfdGl0bGVfbGIiLCJ0aW1lX2xhYmVsX2xiIiwic2NvcmVfYmciLCJzY29yZV9sYWJlbF9sYiIsInNreV9jb2luIiwicmFua19iZyIsInJhbmtfdGl0bGUiLCJyYW5rX2xhYmVsX2xiIiwiY2xvc2VfYnRuIiwicmVmcmVzaF9idG4iLCJfY2FuX3RvdWNoIiwicmVmcmVzaF9idG5fbGFiZWxfbGIiLCJyZWZyZXNoX2J0bl9sYWJlbF9sbyIsIkxhYmVsT3V0bGluZSIsImNoYWxsZW5nZV9idG4iLCJjaGFsbGVuZ2VfYnRuX2xhYmVsX2xiIiwiYWRkX2J0biIsImkiLCJyb2xlX3BhbmVsIiwicm9sZV9wYW5lbF9zaXplIiwiZ2V0Q29udGVudFNpemUiLCJyZWdpc3RlckV2ZW50Iiwib25Ub3VjaEVuZCIsIm9wZW5NYWluV2luZG93Iiwib3BlbkNvbW1vbkV4cGxhaW5WaWV3IiwiQ29uZmlnIiwic2t5X2xhZGRlcl9kYXRhIiwiZGF0YV9leHBsYWluIiwib3BlbkxhZGRlclRvcFRocmVlV2luZG93Iiwib3BlbkxhZGRlckxvZ1dpbmRvdyIsIm9wZW5MYWRkZXJSYW5rV2luZG93Iiwib3BlbkxhZGRlckF3YXJkV2luZG93Iiwib3BlbkxhZGRlclNob3BXaW5kb3ciLCJpc19vcGVuIiwiZ2V0TGFkZGVySXNPcGVuIiwidHh0X2NmZyIsImRhdGFfY29uc3QiLCJtZXNzYWdlIiwianMiLCJmb3JtYXRTdHIiLCJkZXNjIiwibXlCYXNlSW5mbyIsImJ1eV9jb21iYXRfbnVtIiwiY29zdF9jb25maWciLCJkYXRhX2J1eV9udW0iLCJ2aXBfbGV2IiwidmlwIiwicmVzIiwiZ2V0SXRlbVJlcyIsIkl0ZW1EYXRhIiwiZGF0YV9hc3NldHNfbGFiZWwyaWQiLCJnb2xkIiwibXNnIiwiY29zdCIsInNob3ciLCJyZXF1ZXN0QnV5Q2hhbGxlbmdlQ291bnQiLCJyZXNBcnIiLCJyZXF1ZXN0UmVmcmVzaEVuZW15TGlzdCIsImZ1biIsImNoZWNrSm9pbkxhZGRlckJhdHRsZSIsInN0ciIsImFkZEdsb2JhbEV2ZW50IiwiVXBkYXRlTGFkZGVyTXlCYXNlSW5mbyIsInJlZnJlc2hNeUJhc2VJbmZvIiwiVXBkYXRlQWxsTGFkZGVyRW5lbXlMaXN0IiwicmVmcmVzaFJvbGVMaXN0Iiwicm9sZV9hc3NldHNfZXZlbnQiLCJFdmVudElkIiwiVVBEQVRFX1JPTEVfQVRUUklCVVRFIiwia2V5IiwidmFsdWUiLCJVcGRhdGVMYWRkZXJPcGVuU3RhdHVzIiwiVXBkYXRlTGFkZGVyUmVkU3RhdHVzIiwicmVmcmVoc0J0blJlZFN0YXR1cyIsImJpZCIsInN0YXR1cyIsIm9wZW5Sb290V25kIiwicGFyYW1zIiwicmVxdWVzdExhZGRlck15QmFzZUluZm8iLCJyZXF1ZXN0TGFkZGVyRW5lbXlMaXN0RGF0YSIsImVuZW15X2RhdGFzIiwiZ2V0TGFkZGVyRW5lbXlMaXN0RGF0YSIsImxvZyIsInNvcnRGdW5jIiwib2JqQSIsIm9iakIiLCJyYW5rIiwibGlzdF9pbmRleCIsInN0YXJ0VXBkYXRlIiwiaW5kZXgiLCJyb2xlX2l0ZW0iLCJzZXRQb3NpdGlvbiIsInYyIiwid2lkdGgiLCJoZWlnaHQiLCJzZXRQYXJlbnQiLCJlbmVteV9kYXRhIiwibmV4dCIsInNldERhdGEiLCJzZXRWaXNpYmxlIiwiZ2V0TGFkZGVyTXlCYXNlSW5mbyIsImNhbl9jb21iYXRfbnVtIiwibGVmdF9idXlfY291bnQiLCJjcmVhdGVSaWNoTGFiZWwiLCJsZWZ0X2NvdW50IiwiZ2V0VG9kYXlMZWZ0QnV5Q291bnQiLCJyZWZfdGltZSIsImNvbWJhdF90aW1lIiwiY3VyX3RpbWUiLCJnY29yZSIsIlNtYXJ0U29ja2V0IiwiZ2V0VGltZSIsImNvbV9sZWZ0X3RpbWUiLCJub2RlIiwiYWN0aXZlIiwiam9pbl90ZXh0IiwicmFua19jZmciLCJ2YWwiLCJnZXRUaW1lRm9ybWF0Iiwib3BlbkxhZGRlclRpbWVyIiwicmVmX2xlZnRfdGltZSIsImVuYWJsZWQiLCJsYWRkZXJfdGltZXIiLCJUaW1lciIsInNldCIsImRlbCIsIlJlZFR5cGUiLCJUb3BUaHJlZSIsImFkZFJlZFBvaW50VG9Ob2RlQnlTdGF0dXMiLCJCYXR0bGVMb2ciLCJ0b3BfdGhyZWVfc3RhdHVzIiwiY2hlY2tSZWRJc1Nob3dCeVJlZFR5cGUiLCJsb2dfc3RhdHVzIiwiY2xvc2VDYWxsQmFjayIs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QUFDQUMsRUFBQUEsYUFBYSxFQUFFLHlCQUFZO0FBQ3ZCLFFBQUksS0FBSzlLLE9BQVQsRUFBa0I7QUFDZCxVQUFJLEtBQUsyRyxpQkFBVCxFQUE0QjtBQUN4QixhQUFLM0csT0FBTCxDQUFhK0ssTUFBYixDQUFvQixLQUFLcEUsaUJBQXpCO0FBQ0EsYUFBS0EsaUJBQUwsR0FBeUIsSUFBekI7QUFDSDs7QUFDRCxXQUFLM0csT0FBTCxHQUFlLElBQWY7QUFDSDs7QUFDRCxTQUFLLElBQUlnTCxDQUFULElBQWMsS0FBSzVLLFVBQW5CLEVBQStCO0FBQzNCLFVBQUk2SyxJQUFJLEdBQUcsS0FBSzdLLFVBQUwsQ0FBZ0I0SyxDQUFoQixDQUFYOztBQUNBLFVBQUlDLElBQUosRUFBVTtBQUNOQSxRQUFBQSxJQUFJLENBQUNDLFFBQUw7QUFDQUQsUUFBQUEsSUFBSSxHQUFHLElBQVA7QUFDSDtBQUNKOztBQUNELFNBQUs3SyxVQUFMLEdBQWtCLElBQWxCO0FBQ0EsU0FBSzRKLGVBQUwsQ0FBcUIsS0FBckI7QUFDQSxTQUFLM0osSUFBTCxDQUFVMkQsY0FBVixDQUF5QixLQUF6QjtBQUNIO0FBclk0QixDQUFULENBQXhCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAg6Leo5pyN5aSp5qKvbWFpbnZpZXdcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTA3LTI0IDE2OjU2OjM4XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBMYWRkZXJDb250cm9sbGVyID0gcmVxdWlyZShcImxhZGRlcl9jb250cm9sbGVyXCIpO1xudmFyIExhZGRlclJvbGVJdGVtID0gcmVxdWlyZShcImxhZGRlcl9yb2xlX2l0ZW1cIik7XG52YXIgVGltZVRvb2wgPSByZXF1aXJlKFwidGltZXRvb2xcIik7XG52YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbnZhciBDb21tb25BbGVydCA9IHJlcXVpcmUoXCJjb21tb25hbGVydFwiKTtcbnZhciBMYWRkZXJDb25zdCA9IHJlcXVpcmUoXCJsYWRkZXJfY29uc3RcIik7XG52YXIgTGFkZGVyRXZlbnQgPSByZXF1aXJlKFwibGFkZGVyX2V2ZW50XCIpO1xuXG52YXIgTGFkZGVyX21haW5XaW5kb3cgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVZpZXcsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwibGFkZGVyXCIsIFwibGFkZGVyX21haW5fd2luZG93XCIpO1xuICAgICAgICAvLyB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcudWk7ICAgICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICAvLyB0aGlzLndpbl90eXBlID0gV2luVHlwZS5GdWxsOyAgICAgICAgICAgICAgIC8v5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICB0aGlzLnJvbGVfcGFuZWxzID0ge307XG4gICAgICAgIHRoaXMucm9sZV9pdGVtcyA9IHt9O1xuICAgICAgICB0aGlzLmN0cmwgPSBMYWRkZXJDb250cm9sbGVyLmdldEluc3RhbmNlKCk7XG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKTtcblxuICAgICAgICB0aGlzLndoaXRlX2NvbG9yID0gbmV3IGNjLkNvbG9yKDI1NSwgMjU1LCAyNTUsIDI1NSk7XG4gICAgICAgIHRoaXMuY29sb3JfMSA9IG5ldyBjYy5Db2xvcig3MSwgMTMyLCAzNywgMjU1KTtcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCO55qE5Zue6LCDLOWPr+S7peWcqOi/memHjOaNleiOt+ebuOWFs+iKgueCueaIluiAhee7hOS7tlxuICAgIG9wZW5DYWxsQmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgYmFja2dyb3VuZCA9IHRoaXMuc2Vla0NoaWxkKFwiYmFja2dyb3VuZFwiKTtcbiAgICAgICAgYmFja2dyb3VuZC5zY2FsZSA9IEZJVF9TQ0FMRTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldEJpZ0JnKFwiYmlnYmdfNThcIiksIGZ1bmN0aW9uIChzcCkge1xuICAgICAgICAgICAgYmFja2dyb3VuZC5nZXRDb21wb25lbnQoY2MuU3ByaXRlKS5zcHJpdGVGcmFtZSA9IHNwO1xuICAgICAgICB9LmJpbmQodGhpcykpXG5cbiAgICAgICAgdGhpcy5tYWluX2NvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKFwibWFpbl9jb250YWluZXJcIik7XG5cbiAgICAgICAgdGhpcy50b3BfcGFuZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInRvcF9wYW5lbFwiKTtcblxuICAgICAgICBsZXQgd2luX3RpdGxlID0gdGhpcy5zZWVrQ2hpbGQodGhpcy50b3BfcGFuZWwsIFwid2luX3RpdGxlXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgd2luX3RpdGxlLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5aSp5qKv5LqJ6Zy4XCIpO1xuICAgICAgICB0aGlzLmJ0bl9ydWxlID0gdGhpcy5zZWVrQ2hpbGQodGhpcy50b3BfcGFuZWwsIFwiYnRuX3J1bGVcIik7XG4gICAgICAgIHRoaXMuYnRuX3JvbGUgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnRvcF9wYW5lbCwgXCJidG5fcm9sZVwiKTtcbiAgICAgICAgdGhpcy5idG5fbG9nID0gdGhpcy5zZWVrQ2hpbGQodGhpcy50b3BfcGFuZWwsIFwiYnRuX2xvZ1wiKTtcbiAgICAgICAgdGhpcy5idG5fcmFuayA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudG9wX3BhbmVsLCBcImJ0bl9yYW5rXCIpO1xuICAgICAgICB0aGlzLmJ0bl9hd2FyZCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudG9wX3BhbmVsLCBcImJ0bl9hd2FyZFwiKTtcbiAgICAgICAgdGhpcy5idG5fc2hvcCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudG9wX3BhbmVsLCBcImJ0bl9zaG9wXCIpO1xuXG4gICAgICAgIHRoaXMuYm90dG9tX3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJib3R0b21fcGFuZWxcIik7XG4gICAgICAgIGxldCBibGFja19iZyA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYm90dG9tX3BhbmVsLCBcImJsYWNrX2JnXCIpO1xuICAgICAgICBsZXQgY291bnRfdGl0bGUgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmJvdHRvbV9wYW5lbCwgXCJjb3VudF90aXRsZVwiLCBjYy5MYWJlbCk7XG4gICAgICAgIGNvdW50X3RpdGxlLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5oyR5oiY5qyh5pWwOlwiKTtcbiAgICAgICAgdGhpcy5jb3VudF9sYWJlbF9sYiA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYm90dG9tX3BhbmVsLCBcImNvdW50X2xhYmVsXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgbGV0IHRpcHNfbGFiZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInRpcHNfbGFiZWxcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aXBzX2xhYmVsLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5b+r6YCf5oyR5oiY5o6S5ZCN5LiN5Y+YXCIpO1xuICAgICAgICB0aGlzLnRpbWVfdGl0bGVfbGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmJvdHRvbV9wYW5lbCwgXCJ0aW1lX3RpdGxlXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy50aW1lX3RpdGxlX2xiLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi6Led56a757uT5p2f77yaXCIpO1xuICAgICAgICB0aGlzLnRpbWVfbGFiZWxfbGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmJvdHRvbV9wYW5lbCwgXCJ0aW1lX2xhYmVsXCIsIGNjLkxhYmVsKTtcblxuICAgICAgICBsZXQgc2NvcmVfYmcgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInNjb3JlX2JnXCIpO1xuICAgICAgICB0aGlzLnNjb3JlX2xhYmVsX2xiID0gdGhpcy5zZWVrQ2hpbGQoc2NvcmVfYmcsIFwic2NvcmVfbGFiZWxcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnNjb3JlX2xhYmVsX2xiLnN0cmluZyA9IHRoaXMucm9sZV92by5za3lfY29pbjtcbiAgICAgICAgbGV0IHJhbmtfYmcgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInJhbmtfYmdcIik7XG4gICAgICAgIGxldCByYW5rX3RpdGxlID0gdGhpcy5zZWVrQ2hpbGQocmFua19iZywgXCJyYW5rX3RpdGxlXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgcmFua190aXRsZS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuaOkuWQjTpcIik7XG4gICAgICAgIHRoaXMucmFua19sYWJlbF9sYiA9IHRoaXMuc2Vla0NoaWxkKHJhbmtfYmcsIFwicmFua19sYWJlbFwiLCBjYy5MYWJlbCk7XG5cbiAgICAgICAgdGhpcy5jbG9zZV9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcImNsb3NlX2J0blwiKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoX2J0biA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9jb250YWluZXIsIFwicmVmcmVzaF9idG5cIik7XG4gICAgICAgIHRoaXMucmVmcmVzaF9idG4uX2Nhbl90b3VjaCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVmcmVzaF9idG5fbGFiZWxfbGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnJlZnJlc2hfYnRuLCBcImxhYmVsXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYWJlbF9sbyA9IHRoaXMuc2Vla0NoaWxkKHRoaXMucmVmcmVzaF9idG4sIFwibGFiZWxcIiwgY2MuTGFiZWxPdXRsaW5lKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYWJlbF9sYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuWIt+aWsFwiKTtcbiAgICAgICAgdGhpcy5jaGFsbGVuZ2VfYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJjaGFsbGVuZ2VfYnRuXCIpO1xuICAgICAgICB0aGlzLmNoYWxsZW5nZV9idG5fbGFiZWxfbGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmNoYWxsZW5nZV9idG4sIFwibGFiZWxcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLmNoYWxsZW5nZV9idG5fbGFiZWxfbGIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLkuIDplK7mjJHmiJhcIik7XG4gICAgICAgIHRoaXMuYWRkX2J0biA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYm90dG9tX3BhbmVsLCBcImFkZF9idG5cIik7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gNTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcm9sZV9wYW5lbCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9jb250YWluZXIsIFwicm9sZV9wb3NfXCIgKyBpKTtcbiAgICAgICAgICAgIHRoaXMucm9sZV9wYW5lbHNbaV0gPSByb2xlX3BhbmVsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm9sZV9wYW5lbF9zaXplID0gdGhpcy5yb2xlX3BhbmVsc1sxXS5nZXRDb250ZW50U2l6ZSgpO1xuICAgIH0sXG5cbiAgICAvLyDms6jlhozkuovku7bnm5HlkKznmoTmjqXlj6Ms5LiN6ZyA6KaB5omL5Yqo6LCD55SoLOWmguaenOaYr+S9v+eUqGdjb3JlLkdsb2JhbEV2ZW5055uR5ZCsLOWPr+S7peebtOaOpeiwg+eUqGFkZEdsb2JhbEV2ZW50XG4gICAgcmVnaXN0ZXJFdmVudDogZnVuY3Rpb24gKCkge1xuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMuY2xvc2VfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3Blbk1haW5XaW5kb3coZmFsc2UpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmJ0bl9ydWxlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkNvbW1vbkV4cGxhaW5WaWV3KHRydWUsIENvbmZpZy5za3lfbGFkZGVyX2RhdGEuZGF0YV9leHBsYWluKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5idG5fcm9sZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5MYWRkZXJUb3BUaHJlZVdpbmRvdyh0cnVlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5idG5fbG9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3BlbkxhZGRlckxvZ1dpbmRvdyh0cnVlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5idG5fcmFuaywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5MYWRkZXJSYW5rV2luZG93KHRydWUpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmJ0bl9hd2FyZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5MYWRkZXJBd2FyZFdpbmRvdyh0cnVlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5idG5fc2hvcCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5MYWRkZXJTaG9wV2luZG93KHRydWUpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgLy/mt7vliqDmjJHmiJjmrKHmlbBcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmFkZF9idG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBpc19vcGVuID0gdGhpcy5tb2RlbC5nZXRMYWRkZXJJc09wZW4oKTtcbiAgICAgICAgICAgIGlmICghaXNfb3Blbikge1xuICAgICAgICAgICAgICAgIGxldCB0eHRfY2ZnID0gQ29uZmlnLnNreV9sYWRkZXJfZGF0YS5kYXRhX2NvbnN0W1wiY2xvc2VfdGV4dFwiXTtcbiAgICAgICAgICAgICAgICBpZiAodHh0X2NmZykge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuavjyVz5aSp5qKv5LqJ6Zy4XCIpLCB0eHRfY2ZnLmRlc2MpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5teUJhc2VJbmZvKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJ1eV9jb21iYXRfbnVtID0gdGhpcy5teUJhc2VJbmZvLmJ1eV9jb21iYXRfbnVtIHx8IDA7XG4gICAgICAgICAgICAgICAgbGV0IGNvc3RfY29uZmlnID0gQ29uZmlnLnNreV9sYWRkZXJfZGF0YS5kYXRhX2J1eV9udW1bYnV5X2NvbWJhdF9udW0gKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoY29zdF9jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucm9sZV92by52aXBfbGV2ID49IGNvc3RfY29uZmlnLnZpcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcyA9IFBhdGhUb29sLmdldEl0ZW1SZXMoQ29uZmlnLkl0ZW1EYXRhLmRhdGFfYXNzZXRzX2xhYmVsMmlkLmdvbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXNnID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi56Gu5a6a5raI6ICXPGltZyBzcmM9JyVzJy8+JXPlop7liqDkuIDmrKHmjJHmiJjmrKHmlbDlkJfvvJ9cIiksIENvbmZpZy5JdGVtRGF0YS5kYXRhX2Fzc2V0c19sYWJlbDJpZC5nb2xkLCBjb3N0X2NvbmZpZy5jb3N0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkFsZXJ0LnNob3cobXNnLCBVdGlscy5USTE4TihcIuehruWumlwiKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybC5yZXF1ZXN0QnV5Q2hhbGxlbmdlQ291bnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgVXRpbHMuVEkxOE4oXCLlj5bmtohcIiksIG51bGwsIDIsIG51bGwsIHsgcmVzQXJyOiBbcmVzXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UoVXRpbHMuVEkxOE4oXCLmj5DljYdWSVDnrYnnuqflj6/lop7liqDotK3kubDmrKHmlbBcIikpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5b2T5YmN5bey57uP6LSt5Lmw6L6+5Yiw5LiK6ZmQXCIpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5yZWZyZXNoX2J0biwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGlzX29wZW4gPSB0aGlzLm1vZGVsLmdldExhZGRlcklzT3BlbigpO1xuICAgICAgICAgICAgaWYgKGlzX29wZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwucmVxdWVzdFJlZnJlc2hFbmVteUxpc3QoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHR4dF9jZmcgPSBDb25maWcuc2t5X2xhZGRlcl9kYXRhLmRhdGFfY29uc3RbXCJjbG9zdF90ZXh0XCJdO1xuICAgICAgICAgICAgICAgIGlmICh0eHRfY2ZnKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UoY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5q+PJXPlpKnmoq/kuonpnLhcIiksIHR4dF9jZmcuZGVzYykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5jaGFsbGVuZ2VfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgaXNfb3BlbiA9IHRoaXMubW9kZWwuZ2V0TGFkZGVySXNPcGVuKCk7XG4gICAgICAgICAgICBpZiAoIWlzX29wZW4pIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0X2NmZyA9IENvbmZpZy5za3lfbGFkZGVyX2RhdGEuZGF0YV9jb25zdFtcImNsb3NlX3RleHRcIl07XG4gICAgICAgICAgICAgICAgaWYgKHR4dF9jZmcpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZShjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLmr48lc+Wkqeair+S6iemcuFwiKSwgdHh0X2NmZy5kZXNjKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGZ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwuY2hlY2tKb2luTGFkZGVyQmF0dGxlKG51bGwsIG51bGwsIHRydWUpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgICBsZXQgc3RyID0gVXRpbHMuVEkxOE4oXCLkuIDplK7mjJHmiJjlsIbnm7TmjqXojrflvpflpZblirHvvIzmmK/lkKbnu6fnu63vvJ9cXG5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplPTIyPijmtojogJfkuIDmrKHmjJHmiJjmrKHmlbApPC9zaXplPlwiKTtcbiAgICAgICAgICAgIENvbW1vbkFsZXJ0LnNob3coc3RyLCBVdGlscy5USTE4TihcIuehruWumlwiKSwgZnVuLCBVdGlscy5USTE4TihcIuWPlua2iFwiKSwgbnVsbCwgMiwgbnVsbCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSlcblxuICAgICAgICAvL+S4quS6uuaVsOaNruabtOaWsFxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KExhZGRlckV2ZW50LlVwZGF0ZUxhZGRlck15QmFzZUluZm8sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE15QmFzZUluZm8oKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICAvL+abtOaWsOaJgOacieWvueaJi+WIl+ihqFxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KExhZGRlckV2ZW50LlVwZGF0ZUFsbExhZGRlckVuZW15TGlzdCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoUm9sZUxpc3QoKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICAvL+enr+WIhuabtOaWsFxuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfYXNzZXRzX2V2ZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGVfYXNzZXRzX2V2ZW50ID0gdGhpcy5yb2xlX3ZvLmJpbmQoRXZlbnRJZC5VUERBVEVfUk9MRV9BVFRSSUJVVEUsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gXCJza3lfY29pblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjb3JlX2xhYmVsX2xiLnN0cmluZyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy/mtLvliqjlvIDlkK8v5YWz6ZetXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoTGFkZGVyRXZlbnQuVXBkYXRlTGFkZGVyT3BlblN0YXR1cywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTXlCYXNlSW5mbygpO1xuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIC8v57qi54K5XG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoTGFkZGVyRXZlbnQuVXBkYXRlTGFkZGVyUmVkU3RhdHVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlaHNCdG5SZWRTdGF0dXMoYmlkLCBzdGF0dXMpO1xuICAgICAgICB9LCB0aGlzKVxuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB0aGlzLmN0cmwucmVxdWVzdExhZGRlck15QmFzZUluZm8oKTtcbiAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RMYWRkZXJFbmVteUxpc3REYXRhKCk7XG4gICAgICAgIHRoaXMucmVmcmVoc0J0blJlZFN0YXR1cygpO1xuICAgIH0sXG5cbiAgICByZWZyZXNoUm9sZUxpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGVuZW15X2RhdGFzID0gdGhpcy5tb2RlbC5nZXRMYWRkZXJFbmVteUxpc3REYXRhKCk7XG4gICAgICAgIGNjLmxvZyhcImVuZW15X2RhdGFzPT1cIiwgZW5lbXlfZGF0YXMpXG4gICAgICAgIGxldCBzb3J0RnVuYyA9IGZ1bmN0aW9uIChvYmpBLCBvYmpCKSB7XG4gICAgICAgICAgICBpZiAob2JqQS5yYW5rICE9IDAgJiYgb2JqQi5yYW5rICE9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqQS5yYW5rIC0gb2JqQi5yYW5rXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9iakEucmFuayA9PSAwICYmIG9iakIucmFuayAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqQS5yYW5rICE9IDAgJiYgb2JqQi5yYW5rID09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBlbmVteV9kYXRhcy5zb3J0KHNvcnRGdW5jKTtcbiAgICAgICAgLy/lvqrnjq9cbiAgICAgICAgdGhpcy5saXN0X2luZGV4ID0gMTtcbiAgICAgICAgdGhpcy5zdGFydFVwZGF0ZSg1LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmxpc3RfaW5kZXg7XG4gICAgICAgICAgICBsZXQgcm9sZV9pdGVtID0gdGhpcy5yb2xlX2l0ZW1zW2luZGV4XTtcbiAgICAgICAgICAgIGlmICghcm9sZV9pdGVtKSB7XG4gICAgICAgICAgICAgICAgcm9sZV9pdGVtID0gbmV3IExhZGRlclJvbGVJdGVtKCk7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVfcGFuZWwgPSB0aGlzLnJvbGVfcGFuZWxzW2luZGV4XTtcbiAgICAgICAgICAgICAgICByb2xlX2l0ZW0uc2V0UG9zaXRpb24oY2MudjIodGhpcy5yb2xlX3BhbmVsX3NpemUud2lkdGggLyAyLCB0aGlzLnJvbGVfcGFuZWxfc2l6ZS5oZWlnaHQgLSAxNDApKTtcbiAgICAgICAgICAgICAgICByb2xlX2l0ZW0uc2V0UGFyZW50KHJvbGVfcGFuZWwpO1xuICAgICAgICAgICAgICAgIHRoaXMucm9sZV9pdGVtc1tpbmRleF0gPSByb2xlX2l0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZW5lbXlfZGF0YSA9IGVuZW15X2RhdGFzW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChlbmVteV9kYXRhICYmIFV0aWxzLm5leHQoZW5lbXlfZGF0YSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJvbGVfaXRlbS5zZXREYXRhKGVuZW15X2RhdGEpO1xuICAgICAgICAgICAgICAgIHJvbGVfaXRlbS5zZXRWaXNpYmxlKHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByb2xlX2l0ZW0uc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxpc3RfaW5kZXggKz0gMTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxMDAwIC8gNSlcbiAgICB9LFxuXG4gICAgLy/liLfmlrDkuKrkurrkv6Hmga/mlbDmja5cbiAgICByZWZyZXNoTXlCYXNlSW5mbzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm15QmFzZUluZm8gPSB0aGlzLm1vZGVsLmdldExhZGRlck15QmFzZUluZm8oKTtcbiAgICAgICAgbGV0IGlzX29wZW4gPSB0aGlzLm1vZGVsLmdldExhZGRlcklzT3BlbigpO1xuICAgICAgICB0aGlzLmNvdW50X2xhYmVsX2xiLnN0cmluZyA9IHRoaXMubXlCYXNlSW5mby5jYW5fY29tYmF0X251bSB8fCAwO1xuICAgICAgICAvL+S7iuaXpeWJqeS9mei0reS5sOasoeaVsFxuICAgICAgICBpZiAoIXRoaXMubGVmdF9idXlfY291bnQpIHtcbiAgICAgICAgICAgIHRoaXMubGVmdF9idXlfY291bnQgPSBVdGlscy5jcmVhdGVSaWNoTGFiZWwoMjAsIHRoaXMud2hpdGVfY29sb3IsIGNjLnYyKDAuNSwgMC41KSwgY2MudjIoNTkwLCAxMCkpO1xuICAgICAgICAgICAgdGhpcy5sZWZ0X2J1eV9jb3VudC5zZXRQYXJlbnQodGhpcy5ib3R0b21fcGFuZWwpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsZWZ0X2NvdW50ID0gdGhpcy5tb2RlbC5nZXRUb2RheUxlZnRCdXlDb3VudCgpO1xuICAgICAgICB0aGlzLmxlZnRfYnV5X2NvdW50LnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIjxjb2xvcj0jZmZmOGJmPjxvdXRsaW5lPTIgY29sb3I9IzAwMDAwMD4o5Ymp5L2Z6LSt5Lmw5qyh5pWwOjwvb3V0bGluZT48L2M+PGNvbG9yPSMzOWU1MjI+PG91dGxpbmU9MiBjb2xvcj0jMDAwMDAwPiVkPC9vdXRsaW5lPjwvYz48Y29sb3I9I2ZmZjhiZj48b3V0bGluZT0yIGNvbG9yPSMwMDAwMDA+KTwvb3V0bGluZT48L2M+XCIsIGxlZnRfY291bnQpKTtcblxuICAgICAgICBpZiAoIWlzX29wZW4gfHwgIXRoaXMubXlCYXNlSW5mby5yYW5rIHx8IHRoaXMubXlCYXNlSW5mby5yYW5rID09IDApIHtcbiAgICAgICAgICAgIHRoaXMucmFua19sYWJlbF9sYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuaaguaXoFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmFua19sYWJlbF9sYi5zdHJpbmcgPSB0aGlzLm15QmFzZUluZm8ucmFuaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlZl90aW1lID0gdGhpcy5teUJhc2VJbmZvLnJlZl90aW1lIHx8IDA7ICAgICAgLy/kuIvmrKHlj6/liLfmlrDml7bpl7RcbiAgICAgICAgdGhpcy5jb21iYXRfdGltZSA9IHRoaXMubXlCYXNlSW5mby5jb21iYXRfdGltZSB8fCAwOy8v57uT5p2f5pe26Ze0XG5cbiAgICAgICAgbGV0IGN1cl90aW1lID0gZ2NvcmUuU21hcnRTb2NrZXQuZ2V0VGltZSgpO1xuICAgICAgICBsZXQgY29tX2xlZnRfdGltZSA9IHRoaXMuY29tYmF0X3RpbWUgLSBjdXJfdGltZTtcbiAgICAgICAgaWYgKGNvbV9sZWZ0X3RpbWUgPCAwKSB7XG4gICAgICAgICAgICBjb21fbGVmdF90aW1lID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvL+a0u+WKqOW8gOWQr+aYvuekuuWJqeS9meaXtumXtOOAgea0u+WKqOacquW8gOWQr+aYvuekuuWPgui1m+adoeS7tlxuICAgICAgICBpZiAoIWlzX29wZW4pIHtcbiAgICAgICAgICAgIHRoaXMudGltZV9sYWJlbF9sYi5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy50aW1lX3RpdGxlX2xiLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXRoaXMuam9pbl90ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5qb2luX3RleHQgPSBVdGlscy5jcmVhdGVSaWNoTGFiZWwoMjIsIHRoaXMud2hpdGVfY29sb3IsIGNjLnYyKDAuNSwgMC41KSwgY2MudjIoMzQ2LCAzOC41KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5qb2luX3RleHQuc2V0UGFyZW50KHRoaXMuYm90dG9tX3BhbmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuam9pbl90ZXh0Lm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCByYW5rX2NmZyA9IENvbmZpZy5za3lfbGFkZGVyX2RhdGEuZGF0YV9jb25zdFtcImFyZW5hX3JhbmtcIl07XG4gICAgICAgICAgICBpZiAocmFua19jZmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmpvaW5fdGV4dC5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCJjb2xvcj0jZmZmOGJmPjxvdXRsaW5lPTIgY29sb3I9IzAwMDAwMD7lj4LotZvmnaHku7Y656ue5oqA5Zy65o6S5ZCN5YmNPC9vdXRsaW5lPjwvYz5jb2xvcj0jMzllNTIyPjxvdXRsaW5lPTIgY29sb3I9IzAwMDAwMD4lZDwvb3V0bGluZT48L2M+Y29sb3I9I2ZmZjhiZj48b3V0bGluZT0yIGNvbG9yPSMwMDAwMDA+5ZCNPC9vdXRsaW5lPjwvYz5cIiwgcmFua19jZmcudmFsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVfbGFiZWxfbGIubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50aW1lX3RpdGxlX2xiLm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudGltZV9sYWJlbF9sYi5zdHJpbmcgPSBUaW1lVG9vbC5nZXRUaW1lRm9ybWF0KGNvbV9sZWZ0X3RpbWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuam9pbl90ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5qb2luX3RleHQubm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3BlbkxhZGRlclRpbWVyKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlZl9sZWZ0X3RpbWUgPSB0aGlzLnJlZl90aW1lIC0gY3VyX3RpbWU7XG4gICAgICAgIGlmIChyZWZfbGVmdF90aW1lIDw9IDAgJiYgdGhpcy5yZWZyZXNoX2J0bi5fY2FuX3RvdWNoID09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyBzZXRDaGlsZFVuRW5hYmxlZCh0cnVlLCBzZWxmLnJlZnJlc2hfYnRuKVxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2J0bi5fY2FuX3RvdWNoID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaF9idG5fbGFiZWxfbGIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLliLfmlrBcIik7XG4gICAgICAgICAgICAvLyB0aGlzLnJlZnJlc2hfYnRuX2xhYmVsX2xvLmNvbG9yID0gdGhpcy5jb2xvcl8xO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYWJlbF9sby5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChyZWZfbGVmdF90aW1lID4gMCAmJiB0aGlzLnJlZnJlc2hfYnRuLl9jYW5fdG91Y2ggPT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gc2V0Q2hpbGRVbkVuYWJsZWQodHJ1ZSwgc2VsZi5yZWZyZXNoX2J0bilcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaF9idG4uX2Nhbl90b3VjaCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYWJlbF9sYi5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCIlc+enklwiKSwgcmVmX2xlZnRfdGltZSk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hfYnRuX2xhYmVsX2xvLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+iuoeaXtuWZqFxuICAgIG9wZW5MYWRkZXJUaW1lcjogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAoc3RhdHVzID09IHRydWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhZGRlcl90aW1lciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWRkZXJfdGltZXIgPSBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VyX3RpbWUgPSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21fbGVmdF90aW1lID0gdGhpcy5jb21iYXRfdGltZSAtIGN1cl90aW1lO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmX2xlZnRfdGltZSA9IHRoaXMucmVmX3RpbWUgLSBjdXJfdGltZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbV9sZWZ0X3RpbWUgPD0gMCAmJiByZWZfbGVmdF90aW1lIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLmxhZGRlcl90aW1lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhZGRlcl90aW1lciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbV9sZWZ0X3RpbWUgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21fbGVmdF90aW1lID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tX2xlZnRfdGltZSA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVfbGFiZWxfbGIubm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZV90aXRsZV9sYi5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuam9pbl90ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qb2luX3RleHQubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lX2xhYmVsX2xiLm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZV90aXRsZV9sYi5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVfbGFiZWxfbGIuc3RyaW5nID0gVGltZVRvb2wuZ2V0VGltZUZvcm1hdChjb21fbGVmdF90aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVmX2xlZnRfdGltZSA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWZyZXNoX2J0bi5fY2FuX3RvdWNoID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2J0bi5fY2FuX3RvdWNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnJlZnJlc2hfYnRuX2xhYmVsX2xvLmNvbG9yID0gdGhpcy5jb2xvcl8xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldENoaWxkVW5FbmFibGVkKHRydWUsIHNlbGYucmVmcmVzaF9idG4pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hfYnRuX2xhYmVsX2xiLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5Yi35pawXCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZl9sZWZ0X3RpbWUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWZyZXNoX2J0bi5fY2FuX3RvdWNoID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXRDaGlsZFVuRW5hYmxlZCh0cnVlLCBzZWxmLnJlZnJlc2hfYnRuKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaF9idG4uX2Nhbl90b3VjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaF9idG5fbGFiZWxfbG8uZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYWJlbF9sYi5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCIlc+enklwiKSwgcmVmX2xlZnRfdGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksIDEwMDAsIDEpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYWRkZXJfdGltZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLmxhZGRlcl90aW1lcik7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWRkZXJfdGltZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v57qi54K5XG4gICAgcmVmcmVoc0J0blJlZFN0YXR1czogZnVuY3Rpb24gKGJpZCwgc3RhdHVzKSB7XG4gICAgICAgIGlmIChiaWQgPT0gTGFkZGVyQ29uc3QuUmVkVHlwZS5Ub3BUaHJlZSkge1xuICAgICAgICAgICAgVXRpbHMuYWRkUmVkUG9pbnRUb05vZGVCeVN0YXR1cyh0aGlzLmJ0bl9yb2xlLCBzdGF0dXMpO1xuICAgICAgICB9IGVsc2UgaWYgKGJpZCA9PSBMYWRkZXJDb25zdC5SZWRUeXBlLkJhdHRsZUxvZykge1xuICAgICAgICAgICAgVXRpbHMuYWRkUmVkUG9pbnRUb05vZGVCeVN0YXR1cyh0aGlzLmJ0bl9sb2csIHN0YXR1cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgdG9wX3RocmVlX3N0YXR1cyA9IHRoaXMubW9kZWwuY2hlY2tSZWRJc1Nob3dCeVJlZFR5cGUoTGFkZGVyQ29uc3QuUmVkVHlwZS5Ub3BUaHJlZSk7XG4gICAgICAgICAgICBVdGlscy5hZGRSZWRQb2ludFRvTm9kZUJ5U3RhdHVzKHRoaXMuYnRuX3JvbGUsIHRvcF90aHJlZV9zdGF0dXMpO1xuICAgICAgICAgICAgbGV0IGxvZ19zdGF0dXMgPSB0aGlzLm1vZGVsLmNoZWNrUmVkSXNTaG93QnlSZWRUeXBlKExhZGRlckNvbnN0LlJlZFR5cGUuQmF0dGxlTG9nKTtcbiAgICAgICAgICAgIFV0aWxzLmFkZFJlZFBvaW50VG9Ob2RlQnlTdGF0dXModGhpcy5idG5fbG9nLCBsb2dfc3RhdHVzKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDlhbPpl63nqpfkvZPlm57osIMs6ZyA6KaB5Zyo6L+Z6YeM6LCD55So6K+l56qX5L2T5omA5bGeY29udHJvbGxlcueahGNsb3Nl5pa55rOV5rKh55So5LqO572u56m66K+l56qX5L2T5a6e5L6L5a+56LGhXG4gICAgY2xvc2VDYWxsQmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb2xlX2Fzc2V0c19ldmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMucm9sZV92by51bmJpbmQodGhpcy5yb2xlX2Fzc2V0c19ldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlX2Fzc2V0c19ldmVudCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJvbGVfdm8gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGsgaW4gdGhpcy5yb2xlX2l0ZW1zKSB7XG4gICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMucm9sZV9pdGVtc1trXTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5kZWxldGVNZSgpO1xuICAgICAgICAgICAgICAgIGl0ZW0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucm9sZV9pdGVtcyA9IG51bGw7XG4gICAgICAgIHRoaXMub3BlbkxhZGRlclRpbWVyKGZhbHNlKTtcbiAgICAgICAgdGhpcy5jdHJsLm9wZW5NYWluV2luZG93KGZhbHNlKTtcbiAgICB9LFxufSkiXX0=
|