|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/hallows/view/hallows_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, 'b18f0+jzYJJfL57wcKEO/YN', 'hallows_main_window');
|
// Scripts/mod/hallows/view/hallows_main_window.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 这里是描述这个窗体的作用的
|
// <br/>Create: 2019-02-18 14:17:00
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool");
|
|
var HallowsConst = require("hallows_const");
|
|
var BackpackController = require("backpack_controller");
|
|
var HallowsEvent = require("hallows_event");
|
|
var BackpackEvent = require("backpack_event");
|
|
var BackPackConst = require("backpack_const");
|
|
var PartnerCalculate = require("partner_calculate");
|
|
var hallows_mainWindow = cc.Class({
|
"extends": BaseView,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("hallows", "hallows_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
|
|
this.rleasePrefab = false;
|
this.ctrl = arguments[0];
|
this.model = this.ctrl.getModel();
|
},
|
// 初始化一些配置数据,可以用于声明一些变量之类的
|
initConfig: function initConfig() {
|
this.skill_attr_list = {}; // 技能加成
|
|
this.is_in_advance = false; // 是否在自动进阶中
|
|
this.hallows_list = {};
|
this.hallows_sum = 0;
|
this.tab_list = {};
|
this.attr_bgs = {};
|
this.base_attr_list = {};
|
this.is_max_hallows_lv = false; // 神器是否达到最大等级
|
|
this.is_max_skill_lv = false; // 技能是否达到最大等级
|
|
this.cur_index = HallowsConst.Tab_Index.uplv;
|
this.hallows_uplv_cost_bid_1 = 0; // 选中的神器升级所需消耗1
|
|
this.hallows_uplv_cost_num_1 = 0;
|
this.hallows_uplv_cost_bid_2 = 0; // 选中的神器升级所需消耗2
|
|
this.hallows_uplv_cost_num_2 = 0;
|
this.skill_lvup_cost_bid_1 = 0; // 选中的神器技能升级所需消耗1
|
|
this.skill_lvup_cost_num_1 = 0;
|
this.skill_lvup_cost_bid_2 = 0; // 选中的神器技能升级所需消耗2
|
|
this.skill_lvup_cost_num_2 = 0;
|
},
|
// 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
|
openCallBack: function openCallBack() {
|
this.background = this.seekChild(this.root_wnd, "background");
|
this.background.scale = FIT_SCALE;
|
this.bg = this.seekChild(this.root_wnd, "background", cc.Sprite);
|
this.loadRes(PathTool.getBigBg("bigbg_68", "jpg"), function (resObject) {
|
this.bg.spriteFrame = resObject;
|
}.bind(this));
|
var main_panel = this.root_wnd.getChildByName("main_panel");
|
var title_bg = main_panel.getChildByName("title_bg");
|
this.title_bg_img = title_bg.getComponent(cc.Sprite);
|
this.loadRes(PathTool.getCommonIcomPath("common_2015"), function (resObject) {
|
this.title_bg_img.spriteFrame = resObject;
|
}.bind(this));
|
this.bottom_bg = main_panel.getChildByName("bottom_bg");
|
this.bottom_bg_img = this.bottom_bg.getComponent(cc.Sprite);
|
this.loadRes(PathTool.getUIIconPath("hallows", "hallows_1001"), function (resObject) {
|
this.bottom_bg_img.spriteFrame = resObject;
|
}.bind(this)); // 升级
|
|
this.step_container = main_panel.getChildByName("step_container");
|
this.attr_bg_1 = this.step_container.getChildByName("attr_bg_1").getComponent(cc.Sprite);
|
this.attr_bg_2 = this.step_container.getChildByName("attr_bg_2").getComponent(cc.Sprite);
|
this.loadRes(PathTool.getUIIconPath("hallows", "hallows_1007"), function (resObject) {
|
this.attr_bg_1.spriteFrame = resObject;
|
this.attr_bg_2.spriteFrame = resObject;
|
}.bind(this));
|
this.bottom_bg_2 = this.bottom_bg.getChildByName("bottom_bg_2").getComponent(cc.Sprite);
|
this.loadRes(PathTool.getCommonIcomPath("common_2007"), function (resObject) {
|
this.bottom_bg_2.spriteFrame = resObject;
|
}.bind(this));
|
this.skill_bg = main_panel.getChildByName("skill_bg");
|
var skill_title = this.skill_bg.getChildByName("skill_title").getComponent(cc.Label);
|
skill_title.string = Utils.TI18N("技能加成");
|
this.trace_btn = main_panel.getChildByName("trace_btn"); // 圣印按钮
|
|
var trace_lab = this.trace_btn.getChildByName("label").getComponent(cc.Label);
|
trace_lab.string = Utils.TI18N("圣印");
|
this.trace_btn_tips = this.trace_btn.getChildByName("tips"); // 圣印红点
|
|
this.trace_btn_tips.active = false;
|
this.reset_btn = main_panel.getChildByName("reset_btn");
|
var reset_lab = this.reset_btn.getChildByName("label").getComponent(cc.Label);
|
reset_lab.string = Utils.TI18N("重铸");
|
this.reset_btn.active = false;
|
this.artifact_btn = main_panel.getChildByName("artifact_btn");
|
var artifact_btn_label = this.artifact_btn.getChildByName("label").getComponent(cc.Label);
|
artifact_btn_label.string = Utils.TI18N("失落神器");
|
this.touch_layout = main_panel.getChildByName("touch_layout");
|
this.left_btn = main_panel.getChildByName("left_btn"); // 左移按钮
|
|
this.right_btn = main_panel.getChildByName("right_btn"); // 右移按钮
|
|
this.explain_btn = main_panel.getChildByName("explain_btn"); // 说明按钮
|
|
this.hallows_name = title_bg.getChildByName("hallows_name").getComponent(cc.Label); // 圣器名字
|
|
var title_attr = this.step_container.getChildByName("title_attr").getComponent(cc.Label);
|
title_attr.string = Utils.TI18N("全队基础属性");
|
|
for (var i = 1; i < 3; i++) {
|
var attr_bg = this.step_container.getChildByName("attr_bg_" + i);
|
this.attr_bgs[i] = attr_bg;
|
}
|
|
this.uplv_layout = this.step_container.getChildByName("uplv_layout");
|
this.step_progress = this.uplv_layout.getChildByName("progress").getComponent(cc.ProgressBar); // 当前经验条
|
|
this.step_progress_value = this.uplv_layout.getChildByName("progress_value").getComponent(cc.Label); // 当前经验值
|
|
this.step_advanced_btn = this.uplv_layout.getChildByName("advanced_btn"); // 进阶一次按钮
|
|
this.step_auto_advanced_btn = this.uplv_layout.getChildByName("auto_advanced_btn"); // 一键进阶按钮
|
|
var step_advanced = this.step_advanced_btn.getChildByName("label").getComponent(cc.Label);
|
step_advanced.string = Utils.TI18N("升级");
|
this.step_auto_advanced_btn_label = this.step_auto_advanced_btn.getChildByName("label").getComponent(cc.Label);
|
this.step_auto_advanced_btn_label.string = Utils.TI18N("一键升级");
|
this.step_advanced_btn_tips = this.step_advanced_btn.getChildByName("tips"); // 进阶红点
|
|
this.step_advanced_btn_tips.active = false; // 升级消耗
|
|
var lvup_cost_bg = this.uplv_layout.getChildByName("lvup_cost_bg");
|
this.lvup_cost_bg_img = lvup_cost_bg.getComponent(cc.Sprite);
|
this.lvup_cost_res_1 = lvup_cost_bg.getChildByName("res_icon").getComponent(cc.Sprite);
|
this.lvup_cost_label_1 = lvup_cost_bg.getChildByName("lvup_cost_label").getComponent(cc.Label);
|
var auto_lvup_cost_bg = this.uplv_layout.getChildByName("auto_lvup_cost_bg");
|
this.auto_lvup_cost_img = auto_lvup_cost_bg.getComponent(cc.Sprite);
|
this.lvup_cost_res_2 = auto_lvup_cost_bg.getChildByName("res_icon").getComponent(cc.Sprite);
|
;
|
this.lvup_cost_label_2 = auto_lvup_cost_bg.getChildByName("auto_lvup_cost_label").getComponent(cc.Label); // 技能
|
|
this.skill_container = main_panel.getChildByName("skill_container");
|
this.skill_layout = this.skill_container.getChildByName("skill_layout");
|
this.skill_lvup_node = this.skill_layout.getChildByName("skill_lvup_btn");
|
this.skill_lvup_btn = this.skill_layout.getChildByName("skill_lvup_btn").getComponent(cc.Button);
|
this.skill_lvup_btn_label = this.skill_lvup_node.getChildByName("label").getComponent(cc.Label);
|
this.skill_lvup_btn_label.string = Utils.TI18N("升级");
|
this.skill_lvup_btn_line = this.skill_lvup_node.getChildByName("label").getComponent(cc.LabelOutline); // 技能升级消耗
|
|
this.skill_cost_bg_1 = this.skill_layout.getChildByName("skill_cost_bg_1");
|
this.skill_cost_bg_1_img = this.skill_cost_bg_1.getComponent(cc.Sprite);
|
this.skill_res_icon_1 = this.skill_cost_bg_1.getChildByName("skill_res_icon_1").getComponent(cc.Sprite);
|
this.skill_cost_label_1 = this.skill_cost_bg_1.getChildByName("skill_cost_label_1").getComponent(cc.Label);
|
this.skill_cost_bg_2 = this.skill_layout.getChildByName("skill_cost_bg_2");
|
this.skill_cost_bg_2_img = this.skill_cost_bg_2.getComponent(cc.Sprite);
|
this.skill_res_icon_2 = this.skill_cost_bg_2.getChildByName("skill_res_icon_2").getComponent(cc.Sprite);
|
this.skill_cost_label_2 = this.skill_cost_bg_2.getChildByName("skill_cost_label_2").getComponent(cc.Label);
|
this.loadRes(PathTool.getUIIconPath("hallows", "hallows_1008"), function (resObject) {
|
this.lvup_cost_bg_img.spriteFrame = resObject;
|
this.auto_lvup_cost_img.spriteFrame = resObject;
|
this.skill_cost_bg_1_img.spriteFrame = resObject;
|
this.skill_cost_bg_2_img.spriteFrame = resObject;
|
}.bind(this)); // 无法升级时的提示
|
|
this.skill_lvup_tips = this.skill_layout.getChildByName("skill_lvup_tips").getComponent(cc.Label); // 满级
|
|
this.maxlv_layout = main_panel.getChildByName("maxlv_layout");
|
this.max_lv_tips = this.maxlv_layout.getChildByName("max_lv_tips").getComponent(cc.Label);
|
var tab_container = main_panel.getChildByName("tab_container");
|
|
for (var i = 1; i < 3; i++) {
|
var object = {};
|
var tab_btn = tab_container.getChildByName("tab_btn_" + i);
|
|
if (tab_btn) {
|
var title = tab_btn.getChildByName("title").getComponent(cc.Label);
|
|
if (i == 1) {
|
title.string = Utils.TI18N("升级");
|
} else if (i == 2) {
|
title.string = Utils.TI18N("技能");
|
}
|
|
var tips = tab_btn.getChildByName("tips");
|
var tab_btn_img = tab_container.getChildByName("tab_btn_" + i).getComponent(cc.Sprite);
|
var res = PathTool.getCommonIcomPath("common_2009");
|
this.loadRes(res, function (sf_obj) {
|
object.tab_btn_img.spriteFrame = sf_obj;
|
}.bind(this));
|
object.tab_btn = tab_btn;
|
object.label = title;
|
object.index = i;
|
object.tips = tips;
|
object.tab_btn_img = tab_btn_img;
|
this.tab_list[i] = object;
|
}
|
}
|
|
this.hallows_eff_node = this.seekChild("hallows_eff_node");
|
this.hallows_eff_sk = this.seekChild("hallows_eff_node", sp.Skeleton);
|
this.update_eff_node = this.seekChild("update_eff_node");
|
this.update_eff_sk = this.seekChild("update_eff_node", sp.Skeleton);
|
this.main_panel = main_panel;
|
},
|
// 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
|
registerEvent: function registerEvent() {
|
this.step_advanced_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
this.changeAutoAdvanceStatus(false);
|
|
if (this.select_hallows) {
|
this.ctrl.requestHallowsAdvance(this.select_hallows.id, false);
|
}
|
}, this);
|
this.step_auto_advanced_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
var is_in_advance = !this.is_in_advance;
|
|
if (is_in_advance == true && this.select_hallows) {
|
this.ctrl.requestHallowsAdvance(this.select_hallows.id, false);
|
}
|
|
this.changeAutoAdvanceStatus(is_in_advance);
|
}, this);
|
this.left_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
|
if (this.hallows_list && Utils.next(this.hallows_list) != null) {
|
var select_index = parseInt(this.select_index);
|
|
if (select_index <= 0) {
|
select_index = this.hallows_sum;
|
} else {
|
select_index = select_index - 1;
|
}
|
|
this.selectHallowsIndex(select_index);
|
}
|
}, this);
|
this.right_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
|
if (this.hallows_list && Utils.next(this.hallows_list) != null) {
|
var select_index = parseInt(this.select_index);
|
|
if (select_index + 1 >= this.hallows_sum) {
|
select_index = 0;
|
} else {
|
select_index = select_index + 1;
|
}
|
|
this.selectHallowsIndex(select_index);
|
}
|
}, this);
|
this.explain_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
|
Utils.playButtonSound(ButtonSound.Normal);
|
var config = Config.hallows_data.data_const.game_rule;
|
var pos = event.touch.getLocation();
|
|
require("tips_controller").getInstance().showCommonTips(config.desc, pos, null, null, 500);
|
}, this);
|
this.trace_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
|
if (this.select_hallows) {
|
if (this.select_hallows.vo == null) {
|
message(TI18N("该圣器暂未激活"));
|
} else {
|
var cost_config = Config.hallows_data.data_const.imprint_lowest;
|
|
if (cost_config) {
|
if (this.select_hallows.vo.step < cost_config.val) {
|
message(cost_config.desc);
|
} else {
|
this.ctrl.openHallowsTraceWindow(true, this.select_hallows);
|
}
|
}
|
}
|
}
|
}, this);
|
this.reset_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
|
this._onClickResetBtn();
|
}, this);
|
this.skill_lvup_node.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
|
this._onClickSkillLvupBtn();
|
}, this);
|
this.artifact_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
|
this._onClickBtnArtifact();
|
}, this);
|
this.touch_layout.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
|
this._onClickTouchLayout();
|
}, this);
|
|
for (var i in this.tab_list) {
|
if (this.tab_list[i].tab_btn) {
|
this.tab_list[i].tab_btn.on(cc.Node.EventType.TOUCH_END, function (index) {
|
Utils.playButtonSound(ButtonSound.Tab);
|
this.changeSelectedTab(index);
|
}.bind(this, this.tab_list[i].index), this);
|
}
|
}
|
|
this.addGlobalEvent(HallowsEvent.HallowsUpdateEvent, function (id) {
|
this.handleUpdateEvent(id);
|
}.bind(this));
|
this.addGlobalEvent(HallowsEvent.HallowsAdvanceEvent, function (id, result) {
|
if (this.select_hallows && this.select_hallows.id != id) {
|
this.changeAutoAdvanceStatus(false);
|
} else {
|
if (result == 0 || result == 1) {
|
//0标识材料之类的不足 1标识升阶了,这两种情况都停掉
|
this.changeAutoAdvanceStatus(false);
|
}
|
}
|
}.bind(this)); // 显示为某一神器(从所有神器预览界面打开)
|
|
this.addGlobalEvent(HallowsEvent.UndateHallowsInfoEvent, function (id) {
|
if (this.select_hallows && this.select_hallows.id != id) {
|
var select_index = this.getHallowsIndexById(id);
|
this.selectHallowsIndex(select_index);
|
}
|
}.bind(this)); // 神器红点更新
|
|
this.addGlobalEvent(HallowsEvent.HallowsRedStatus, function (red_type, setatus) {
|
if (this.select_hallows) {
|
this.updateTabRedStatus();
|
}
|
}.bind(this));
|
this.addGlobalEvent(BackpackEvent.ADD_GOODS, function (bag_code, item_list) {
|
if (bag_code != BackPackConst.Bag_Code.BACKPACK) return;
|
this.checkNeedUpdateItemNum(item_list);
|
}.bind(this));
|
this.addGlobalEvent(BackpackEvent.MODIFY_GOODS_NUM, function (bag_code, item_list) {
|
if (bag_code != BackPackConst.Bag_Code.BACKPACK) return;
|
this.checkNeedUpdateItemNum(item_list);
|
}.bind(this));
|
this.addGlobalEvent(BackpackEvent.DELETE_GOODS, function (bag_code, item_list) {
|
if (bag_code != BackPackConst.Bag_Code.BACKPACK) return;
|
this.checkNeedUpdateItemNum(item_list);
|
}.bind(this));
|
},
|
// 点击重铸
|
_onClickResetBtn: function _onClickResetBtn() {
|
var str = Utils.TI18N("重铸后神器将回到初始状态,同时返还除金币外所有资源,是否重铸?");
|
|
var CommonAlert = require("commonalert");
|
|
CommonAlert.show(str, Utils.TI18N("确定"), function () {
|
if (this.select_hallows) {
|
this.ctrl.requestHallowsReset(this.select_hallows.id);
|
}
|
}.bind(this), Utils.TI18N("取消"));
|
},
|
// 技能升级
|
_onClickSkillLvupBtn: function _onClickSkillLvupBtn() {
|
if (this.select_hallows == null) return;
|
var vo = this.select_hallows.vo;
|
|
if (vo) {
|
this.ctrl.requestHallowsSkillUpgrade(vo.id);
|
}
|
},
|
// 失落神器
|
_onClickBtnArtifact: function _onClickBtnArtifact() {
|
this.ctrl.openHallowsPreviewWindow(true);
|
},
|
// 点击神器显示tip
|
_onClickTouchLayout: function _onClickTouchLayout() {
|
if (this.select_hallows == null) return;
|
var vo = this.select_hallows.vo;
|
|
if (vo) {
|
var max_vo = this.model.makeHighestHallowVo(vo.id);
|
this.ctrl.openHallowsTips(true, max_vo);
|
}
|
},
|
// 切换分页
|
changeSelectedTab: function changeSelectedTab(index) {
|
if (this.tab_object && this.tab_object.index == index) return;
|
|
if (this.tab_object) {
|
var res = PathTool.getCommonIcomPath("common_2009");
|
this.loadRes(res, function (sf_obj) {
|
this.tab_object.tab_btn_img.spriteFrame = sf_obj;
|
}.bind(this));
|
this.tab_object.label.node.color = new cc.Color(207, 181, 147, 255);
|
this.tab_object = null;
|
}
|
|
this.tab_object = this.tab_list[index];
|
|
if (this.tab_object) {
|
var res = PathTool.getCommonIcomPath("common_2010");
|
this.loadRes(res, function (sf_obj) {
|
this.tab_object.tab_btn_img.spriteFrame = sf_obj;
|
}.bind(this));
|
this.tab_object.label.node.color = new cc.Color(255, 237, 214, 255);
|
}
|
|
this.cur_index = index;
|
this.step_container.active = index == HallowsConst.Tab_Index.uplv;
|
this.skill_container.active = index == HallowsConst.Tab_Index.skill;
|
this.updateMaxLvTips();
|
},
|
// 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
|
openRootWnd: function openRootWnd(hallows_id, index) {
|
// 根据激活数和id重新排序,
|
var config_list = Config.hallows_data.data_base;
|
this.hallows_list = [];
|
this.hallows_sum = Config.hallows_data.data_base_length;
|
|
for (var i in config_list) {
|
var object = {};
|
object.id = config_list[i].id;
|
object.name = config_list[i].name;
|
object.effect = config_list[i].effect;
|
object.item_id = config_list[i].item_id;
|
object.open_desc = config_list[i].open_desc;
|
var vo = this.model.getHallowsById(config_list[i].id);
|
object.vo = vo;
|
this.hallows_list.push(object);
|
} // 显示列表重新排序
|
|
|
if (Utils.next(this.hallows_list)) {
|
this.hallows_list.sort(function (a, b) {
|
return a.id - b.id;
|
});
|
}
|
|
var select_index = this.getDefaultHallowsIndex(hallows_id);
|
this.selectHallowsIndex(select_index);
|
index = index || HallowsConst.Tab_Index.uplv;
|
this.changeSelectedTab(index);
|
},
|
// 取出进入界面时默认选中的神器index
|
getDefaultHallowsIndex: function getDefaultHallowsIndex(hallows_id) {
|
var temp_hallows_list = Utils.deepCopy(this.hallows_list);
|
var select_index = 0;
|
|
if (hallows_id) {
|
select_index = this.getHallowsIndexById(hallows_id);
|
} else {
|
//等级最高>进度最高>id越高
|
var temp_hallows = [];
|
temp_hallows_list.sort(function (a, b) {
|
return b.vo.step - a.vo.step;
|
});
|
var max_step = 0;
|
|
for (var i in temp_hallows_list) {
|
if (max_step <= temp_hallows_list[i].vo.step) {
|
max_step = temp_hallows_list[i].vo.step;
|
temp_hallows.push(temp_hallows_list[i]);
|
}
|
}
|
|
if (temp_hallows.length == 1) {
|
select_index = this.getHallowsIndexById(temp_hallows[0].id);
|
} else {
|
var max_lucky = 0;
|
temp_hallows.sort(function (a, b) {
|
return b.vo.lucky - a.vo.lucky;
|
});
|
var temp_hallows_2 = [];
|
|
for (var j in temp_hallows) {
|
var hallows = temp_hallows[j];
|
|
if (hallows.vo.lucky >= max_lucky) {
|
max_lucky = hallows.vo.lucky;
|
temp_hallows_2.push(hallows);
|
}
|
}
|
|
if (temp_hallows_2.length == 1) {
|
select_index = this.getHallowsIndexById(temp_hallows_2[0].id);
|
} else {
|
temp_hallows_2.sort(function (a, b) {
|
return b.id - a.id;
|
});
|
select_index = this.getHallowsIndexById(temp_hallows_2[0].id);
|
}
|
}
|
}
|
|
return select_index;
|
},
|
// 根据神器id获取对应的index
|
getHallowsIndexById: function getHallowsIndexById(id) {
|
var index = 1;
|
|
for (var i in this.hallows_list) {
|
if (this.hallows_list[i].id && this.hallows_list[i].id == id) {
|
index = i;
|
}
|
}
|
|
return index;
|
},
|
// 选中某一神器
|
selectHallowsIndex: function selectHallowsIndex(index, force) {
|
if (this.select_index == index && !force) return; //只要是正常切换,就终止掉自动进阶
|
|
if (!force) {
|
this.changeAutoAdvanceStatus(false);
|
} else {
|
this.handleEffect(true);
|
}
|
|
this.select_index = index;
|
this.select_hallows = this.hallows_list[index];
|
if (this.select_hallows == null) return;
|
this.reset_btn.active = this.checkIsShowResetBtn(); // 切换神器时需要清掉的数据
|
|
this.is_max_hallows_lv = false; // 神器是否达到最大等级
|
|
this.is_max_skill_lv = false; // 技能是否达到最大等级
|
|
this.hallows_uplv_cost_bid_1 = 0; // 选中的神器升级所需消耗1
|
|
this.hallows_uplv_cost_num_1 = 0;
|
this.hallows_uplv_cost_bid_2 = 0; // 选中的神器升级所需消耗2
|
|
this.hallows_uplv_cost_num_2 = 0;
|
this.skill_lvup_cost_bid_1 = 0; // 选中的神器技能升级所需消耗1
|
|
this.skill_lvup_cost_num_1 = 0;
|
this.skill_lvup_cost_bid_2 = 0; // 选中的神器技能升级所需消耗2
|
|
this.skill_lvup_cost_num_2 = 0;
|
this.updateHallowsBaseInfo();
|
this.updateSkillList();
|
this.updateHallowStatusInfo();
|
this.updateTabRedStatus();
|
},
|
handleEffect: function handleEffect(status) {
|
if (!status) {
|
if (this.update_eff_sk) {
|
this.update_eff_sk.setToSetupPose();
|
this.update_eff_sk.clearTracks();
|
}
|
} else {
|
var anima_path = PathTool.getSpinePath(Config.effect_data.data_effect_info[185], "action");
|
this.loadRes(anima_path, function (ske_data) {
|
this.update_eff_sk.skeletonData = ske_data;
|
this.update_eff_sk.setAnimation(0, PlayerAction.action, false);
|
}.bind(this));
|
}
|
},
|
//基础信息显示模型、名称、基础属性、技能等
|
updateHallowsBaseInfo: function updateHallowsBaseInfo() {
|
if (this.select_hallows == null) return;
|
var action = PlayerAction.action_1;
|
|
if (this.select_hallows.vo != null) {
|
action = PlayerAction.action_2;
|
}
|
|
if (this.hallows_model_id != this.select_hallows.effect) {
|
this.hallows_model_id = this.select_hallows.effect;
|
this.handleEffect(false);
|
|
if (this.hallows_eff_sk) {
|
this.hallows_eff_sk.setToSetupPose();
|
this.hallows_eff_sk.clearTracks();
|
}
|
|
var anima_path = PathTool.getSpinePath(this.hallows_model_id, "action");
|
this.loadRes(anima_path, function (ske_data) {
|
this.hallows_eff_sk.skeletonData = ske_data;
|
this.hallows_eff_sk.setAnimation(0, action, true);
|
}.bind(this));
|
}
|
|
if (this.select_hallows.vo) {
|
this.hallows_eff_node.color = new cc.Color(255, 255, 255, 255); // setChildUnEnabled(false, self.hallows_model)
|
} else {
|
this.hallows_eff_node.color = new cc.Color(169, 169, 169, 255); // setChildUnEnabled(true, self.hallows_model)
|
} // 基础属性
|
|
|
var vo = this.select_hallows.vo;
|
if (vo == null) return; //名称
|
|
this.hallows_name.string = this.select_hallows.name + "+" + vo.step;
|
var step_config = gdata("hallows_data", "data_info", Utils.getNorKey(vo.id, vo.step));
|
var next_step_config = gdata("hallows_data", "data_info", Utils.getNorKey(vo.id, vo.step + 1)) || {}; // 基础属性
|
|
for (var i in this.base_attr_list) {
|
this.base_attr_list[i].action = false;
|
}
|
|
for (var j in step_config.attr) {
|
if (j > 2) break; //UI只支持显示两个技能
|
|
var attr_key = step_config.attr[j][0];
|
var attr_val = step_config.attr[j][1] || 0;
|
var next_attr_val = 0; //取出下一级属性加成,计算临时变量
|
|
if (next_step_config.attr) {
|
for (var k in next_step_config.attr) {
|
if (next_step_config.attr[k][0] && next_step_config.attr[k][0] == attr_key) {
|
next_attr_val = next_step_config.attr[k][1] || 0;
|
}
|
}
|
}
|
|
var attr_name = Config.attr_data.data_key_to_name[attr_key];
|
|
if (attr_name) {
|
var attr_text = this.base_attr_list[j];
|
|
if (attr_text == null) {
|
attr_text = Utils.createRichLabel(24, new cc.Color(100, 50, 35, 255), cc.v2(0, 0.5), cc.v2(20, 20), 30, 380);
|
attr_text.horizontalAlign = cc.macro.TextAlignment.LEFT;
|
var attr_bg = this.attr_bgs[parseInt(j) + 1];
|
attr_bg.addChild(attr_text.node);
|
this.base_attr_list[j] = attr_text;
|
}
|
|
attr_text.active = true;
|
var icon = PathTool.getAttrIconByStr(attr_key);
|
var add_value = 0;
|
; // 临时变量
|
|
if (next_attr_val > 0) {
|
var ratio_config = Config.hallows_data.data_const["temporary_ratio"] || {};
|
var ratio = ratio_config.val || 800;
|
add_value = Math.round(vo.lucky / step_config.max_lucky * (next_attr_val - attr_val) * (ratio / 1000));
|
}
|
|
var is_per = PartnerCalculate.isShowPerByStr(attr_key); //当前属性值=配置表中的值+圣印加成的值
|
|
var stone_config = Config.hallows_data.data_const["stone_attribute"];
|
|
if (vo.seal > 0 && stone_config) {
|
var stone_val = 0;
|
|
for (var k in stone_config.val) {
|
if (stone_config.val[k][0] && stone_config.val[k][0] == attr_key) {
|
stone_val = stone_config.val[k][1] || 0;
|
break;
|
}
|
}
|
|
attr_val = attr_val + stone_val * vo.seal;
|
}
|
|
if (is_per) {
|
attr_val = attr_val / 10 + "%";
|
}
|
|
var attr_str = cc.js.formatStr("<img src='%s'/> <color=#643223> %s:</c><color=#643223>%s</c>", icon, attr_name, attr_val.toString());
|
|
if (add_value > 0) {
|
if (is_per) {
|
add_value = add_value / 10 + "%";
|
}
|
|
attr_str = attr_str + cc.js.formatStr("<color=#249003> +%s</c>", add_value.toString());
|
}
|
|
attr_text.string = attr_str;
|
this.loadRes(PathTool.getCommonIcomPath(icon), function (attr_text, resObject) {
|
attr_text.addSpriteFrame(resObject);
|
}.bind(this, attr_text));
|
}
|
} //神器技能
|
|
|
var hallows_skill = gdata("hallows_data", "data_skill_up", Utils.getNorKey(this.select_hallows.id, vo.skill_lev));
|
|
if (hallows_skill && hallows_skill.skill_bid != 0) {
|
var config = gdata("skill_data", "data_get_skill", hallows_skill.skill_bid);
|
|
if (!config || Utils.next(config) == null) {
|
return;
|
}
|
|
if (!this.hallow_skill_icon) {
|
var SkillItem = require("skill_item");
|
|
this.hallow_skill_icon = new SkillItem(); //true,true,true,0.9
|
|
this.hallow_skill_icon.setParent(this.skill_container);
|
this.hallow_skill_icon.setScale(0.9);
|
this.hallow_skill_icon.setLeveStatus(false);
|
this.hallow_skill_icon.setPosition(cc.v2(75, 245));
|
}
|
|
this.hallow_skill_icon.setData(config.bid);
|
|
if (!this.hallows_skill_name) {
|
this.hallows_skill_name = Utils.createLabel(24, new cc.Color(139, 71, 21, 255), null, 135, 267, "", this.skill_container, 1, cc.v2(0, 0));
|
}
|
|
this.hallows_skill_name.string = config.name + "+" + vo.skill_lev;
|
|
if (!this.hallows_skill_desc) {
|
this.hallows_skill_desc = Utils.createRichLabel(22, new cc.Color(100, 50, 35, 255), cc.v2(0, 1), cc.v2(135, 250), 30, 550);
|
this.hallows_skill_desc.horizontalAlign = cc.macro.TextAlignment.LEFT;
|
this.skill_container.addChild(this.hallows_skill_desc.node);
|
}
|
|
this.hallows_skill_desc.string = config.des;
|
}
|
},
|
//创建技能加成
|
updateSkillList: function updateSkillList() {
|
if (this.select_hallows == null) return;
|
var vo = this.select_hallows.vo;
|
var skill_attr_config = Config.hallows_data.data_skill_attr[this.select_hallows.id] || {};
|
|
for (var i in this.skill_attr_list) {
|
this.skill_attr_list[i].active = false;
|
}
|
|
for (var j in skill_attr_config) {
|
var attr_txt = this.skill_attr_list[j];
|
|
if (attr_txt == null) {
|
attr_txt = Utils.createLabel(20, new cc.Color(157, 141, 115, 255), null, 0, 0, "", this.skill_bg, 1, cc.v2(0, 0.5));
|
this.skill_attr_list[j] = attr_txt;
|
}
|
|
attr_txt.active = true;
|
attr_txt.node.setPosition(cc.v2(20, 90 - (j - 1) * 32));
|
|
if (vo.skill_lev >= skill_attr_config[j].lev_limit) {
|
attr_txt.node.color = new cc.Color(247, 152, 68, 255);
|
} else {
|
attr_txt.node.color = new cc.Color(157, 141, 115, 255);
|
}
|
|
var attr_str = cc.js.formatStr(Utils.TI18N("技能%d级:%s"), skill_attr_config[j].lev_limit, skill_attr_config[j].desc);
|
attr_txt.string = attr_str;
|
}
|
},
|
//设置神器升级与技能状态显示
|
updateHallowStatusInfo: function updateHallowStatusInfo() {
|
if (this.select_hallows == null) return;
|
var vo = this.select_hallows.vo;
|
|
if (vo == null) {
|
return;
|
} else {
|
//神器是否达到最大等级
|
var max_lev = Config.hallows_data.data_max_lev[vo.id] || 100;
|
|
if (vo.step >= max_lev) {
|
this.is_max_hallows_lv = true;
|
this.uplv_layout.active = false;
|
} else {
|
this.is_max_hallows_lv = false;
|
this.uplv_layout.active = true;
|
} //技能是否达到最大等级
|
|
|
var max_skill_lv = Config.hallows_data.data_skill_max_lev[vo.id] || 10;
|
var skill_lv = vo.skill_lev;
|
|
if (skill_lv >= max_skill_lv) {
|
this.is_max_skill_lv = true;
|
this.skill_layout.active = false;
|
} else {
|
this.is_max_skill_lv = false;
|
this.skill_layout.active = true;
|
} //更新神器升级与技能显示
|
|
|
if (!this.is_max_hallows_lv) {
|
this.updateStepInfo();
|
}
|
|
if (!this.is_max_skill_lv) {
|
this.updateSkillInfo();
|
}
|
|
this.updateMaxLvTips();
|
}
|
},
|
// 刷新满级提示语
|
updateMaxLvTips: function updateMaxLvTips() {
|
if (this.cur_index == HallowsConst.Tab_Index.uplv && this.is_max_hallows_lv) {
|
this.max_lv_tips.string = Utils.TI18N("神器已满级");
|
this.maxlv_layout.active = true;
|
} else if (this.cur_index == HallowsConst.Tab_Index.skill && this.is_max_skill_lv) {
|
this.max_lv_tips.string = Utils.TI18N("技能已满级");
|
this.maxlv_layout.active = true;
|
} else {
|
this.maxlv_layout.active = false;
|
}
|
},
|
//设置神器升级相关显示
|
updateStepInfo: function updateStepInfo() {
|
if (this.select_hallows == null) return;
|
var vo = this.select_hallows.vo;
|
if (vo == null) return;
|
var step_config = gdata("hallows_data", "data_info", Utils.getNorKey(vo.id, vo.step));
|
|
if (step_config) {
|
//进度条
|
this.step_progress_value.string = vo.lucky + "/" + step_config.max_lucky;
|
this.step_progress.progress = vo.lucky / step_config.max_lucky; // 神器升级消耗
|
|
var expend_1 = step_config.loss[0];
|
var expend_2 = step_config.loss[1];
|
|
if (expend_1) {
|
var bid = expend_1[0];
|
var num = expend_1[1];
|
this.hallows_uplv_cost_bid_1 = bid;
|
this.hallows_uplv_cost_num_1 = num;
|
this.setCostDataToNode(this.lvup_cost_res_1, this.lvup_cost_label_1, bid, num);
|
}
|
|
if (expend_2) {
|
var bid = expend_2[0];
|
var num = expend_2[1];
|
this.hallows_uplv_cost_bid_2 = bid;
|
this.hallows_uplv_cost_num_2 = num;
|
this.setCostDataToNode(this.lvup_cost_res_2, this.lvup_cost_label_2, bid, num);
|
}
|
}
|
},
|
// 更新神器技能相关显示
|
updateSkillInfo: function updateSkillInfo() {
|
if (this.select_hallows == null) return;
|
var vo = this.select_hallows.vo;
|
if (vo == null) return;
|
var hallows_skill = gdata("hallows_data", "data_skill_up", Utils.getNorKey(this.select_hallows.id, vo.skill_lev));
|
|
if (hallows_skill && hallows_skill.skill_bid != 0) {
|
//升级消耗
|
if (hallows_skill.lev_limit > vo.step) {
|
this.skill_lvup_tips.string = cc.js.formatStr(Utils.TI18N("神器%d级可继续升级"), hallows_skill.lev_limit);
|
this.skill_lvup_tips.node.active = true;
|
this.skill_cost_bg_1.active = false;
|
this.skill_cost_bg_2.active = false;
|
this.skill_lvup_btn.enableAutoGrayEffect = true;
|
this.skill_lvup_btn.interactable = false; // this.skill_lvup_btn_line.width = 0;
|
|
this.skill_lvup_btn_line.enabled = false;
|
} else {
|
this.skill_lvup_btn.enableAutoGrayEffect = false;
|
this.skill_lvup_btn.interactable = true; // this.skill_lvup_btn_line.width = 2;
|
|
this.skill_lvup_btn_line.enabled = true;
|
this.skill_lvup_tips.node.active = false;
|
this.skill_cost_bg_1.active = true;
|
this.skill_cost_bg_2.active = true;
|
var expend_1 = hallows_skill.lose[0];
|
var expend_2 = hallows_skill.lose[1];
|
|
if (expend_1) {
|
var bid = expend_1[0];
|
var num = expend_1[1];
|
this.skill_lvup_cost_bid_1 = bid;
|
this.skill_lvup_cost_num_1 = num;
|
this.setCostDataToNode(this.skill_res_icon_1, this.skill_cost_label_1, bid, num);
|
}
|
|
if (expend_2) {
|
var bid = expend_2[0];
|
var num = expend_2[1];
|
this.skill_lvup_cost_bid_2 = bid;
|
this.skill_lvup_cost_num_2 = num;
|
this.setCostDataToNode(this.skill_res_icon_2, this.skill_cost_label_2, bid, num);
|
}
|
}
|
}
|
},
|
// 更新tab按钮红点显示
|
updateTabRedStatus: function updateTabRedStatus() {
|
if (this.select_hallows == null) return;
|
var red_hallows_id = this.model.getRedHallowsId();
|
|
if (red_hallows_id && red_hallows_id == this.select_hallows.id) {
|
for (var i in this.tab_list) {
|
var tab_object = this.tab_list[i];
|
|
if (tab_object.tips && tab_object.index) {
|
var red_status = false;
|
|
if (tab_object.index == HallowsConst.Tab_Index.uplv) {
|
red_status = this.model.checkRedIsShowByRedType(HallowsConst.Red_Index.hallows_lvup);
|
} else if (tab_object.index == HallowsConst.Tab_Index.skill) {
|
red_status = this.model.checkRedIsShowByRedType(HallowsConst.Red_Index.skill_lvup);
|
}
|
|
tab_object.tips.active = red_status;
|
}
|
}
|
|
if (this.trace_btn_tips) {
|
var trace_red = this.model.checkRedIsShowByRedType(HallowsConst.Red_Index.stone_use);
|
this.trace_btn_tips.active = trace_red;
|
}
|
} else {
|
for (var j in this.tab_list) {
|
var tab_object = this.tab_list[j];
|
|
if (tab_object.tips) {
|
tab_object.tips.active = false;
|
}
|
}
|
|
if (this.trace_btn_tips) {
|
this.trace_btn_tips.active = false;
|
}
|
}
|
},
|
// 显示消耗数据
|
setCostDataToNode: function setCostDataToNode(item_icon, item_label, item_bid, item_num) {
|
var item_config = Utils.getItemConfig(item_bid);
|
|
if (item_config) {
|
var res = PathTool.getItemRes(item_config.icon);
|
this.loadRes(res, function (item_icon, sf_obj) {
|
item_icon.spriteFrame = sf_obj;
|
}.bind(this, item_icon));
|
var count = BackpackController.getInstance().getModel().getItemNumByBid(item_bid);
|
item_label.string = cc.js.formatStr("%s/%s", Utils.getMoneyString(count, false), Utils.getMoneyString(item_num, false));
|
|
if (count < item_num) {
|
item_label.node.color = new cc.Color(255, 93, 93, 255);
|
} else {
|
item_label.node.color = new cc.Color(255, 246, 228, 255);
|
}
|
}
|
},
|
//消耗物品的数量更新
|
checkNeedUpdateItemNum: function checkNeedUpdateItemNum(item_list) {
|
if (item_list == null || Utils.next(item_list) == null) return;
|
|
for (var i in item_list) {
|
var vo = item_list[i];
|
|
if (vo.config) {
|
var bid = vo.config.id;
|
|
if (bid == this.hallows_uplv_cost_bid_1) {
|
this.setCostDataToNode(this.lvup_cost_res_1, this.lvup_cost_label_1, bid, this.hallows_uplv_cost_num_1);
|
} else if (bid == this.hallows_uplv_cost_bid_2) {
|
this.setCostDataToNode(this.lvup_cost_res_2, this.lvup_cost_label_2, bid, this.hallows_uplv_cost_num_2);
|
} else if (bid == this.skill_lvup_cost_bid_1) {
|
this.setCostDataToNode(this.skill_res_icon_1, this.skill_cost_label_1, bid, this.skill_lvup_cost_num_1);
|
} else if (bid == this.skill_lvup_cost_bid_2) {
|
this.setCostDataToNode(this.skill_res_icon_2, this.skill_cost_label_2, bid, this.skill_lvup_cost_num_2);
|
}
|
}
|
}
|
},
|
//圣器更新处理
|
handleUpdateEvent: function handleUpdateEvent(id) {
|
if (id && this.select_hallows && id == this.select_hallows.id) {
|
this.selectHallowsIndex(this.select_index, true);
|
}
|
},
|
// 是否显示重铸按钮
|
checkIsShowResetBtn: function checkIsShowResetBtn() {
|
var is_show = false;
|
|
if (this.select_hallows == null) {
|
return is_show;
|
}
|
|
var vo = this.select_hallows.vo;
|
|
if (vo == null) {
|
return is_show;
|
}
|
|
if (vo.step > 1 || vo.seal > 0 || vo.skill_lev > 1) {
|
is_show = true;
|
}
|
|
return is_show;
|
},
|
//自动进阶显示状态
|
changeAutoAdvanceStatus: function changeAutoAdvanceStatus(is_in_advance) {
|
if (is_in_advance == this.is_in_advance) return;
|
this.is_in_advance = is_in_advance;
|
|
if (this.is_in_advance) {
|
this.step_auto_advanced_btn_label.string = Utils.TI18N("停止");
|
|
if (this.auto_time_ticket == null) {
|
this.auto_time_ticket = gcore.Timer.set(function () {
|
if (this.is_in_advance) {
|
this.ctrl.requestHallowsAdvance(this.select_hallows.id, false);
|
}
|
}.bind(this), 500, -1);
|
}
|
} else {
|
this.clearAutoTimeticket();
|
this.step_auto_advanced_btn_label.string = Utils.TI18N("一键升级");
|
}
|
},
|
clearAutoTimeticket: function clearAutoTimeticket() {
|
if (this.auto_time_ticket) {
|
gcore.Timer.del(this.auto_time_ticket);
|
this.auto_time_ticket = null;
|
}
|
},
|
// 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
|
closeCallBack: function closeCallBack() {
|
this.clearAutoTimeticket();
|
this.handleEffect(false);
|
|
if (this.hallow_skill_icon) {
|
this.hallow_skill_icon.deleteMe();
|
this.hallow_skill_icon = null;
|
}
|
|
if (this.hallows_eff_sk) {
|
this.hallows_eff_sk.setToSetupPose();
|
this.hallows_eff_sk.clearTracks();
|
}
|
|
this.ctrl.openHallowsMainWindow(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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoYWxsb3dzXFx2aWV3XFxoYWxsb3dzX21haW5fd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIkhhbGxvd3NDb25zdCIsIkJhY2twYWNrQ29udHJvbGxlciIsIkhhbGxvd3NFdmVudCIsIkJhY2twYWNrRXZlbnQiLCJCYWNrUGFja0NvbnN0IiwiUGFydG5lckNhbGN1bGF0ZSIsImhhbGxvd3NfbWFpbldpbmRvdyIsImNjIiwiQ2xhc3MiLCJCYXNlVmlldyIsImN0b3IiLCJwcmVmYWJQYXRoIiwiZ2V0UHJlZmFiUGF0aCIsInZpZXdUYWciLCJTQ0VORV9UQUciLCJ1aSIsIndpbl90eXBlIiwiV2luVHlwZSIsIkZ1bGwiLCJybGVhc2VQcmVmYWIiLCJjdHJsIiwiYXJndW1lbnRzIiwibW9kZWwiLCJnZXRNb2RlbCIsImluaXRDb25maWciLCJza2lsbF9hdHRyX2xpc3QiLCJpc19pbl9hZHZhbmNlIiwiaGFsbG93c19saXN0IiwiaGFsbG93c19zdW0iLCJ0YWJfbGlzdCIsImF0dHJfYmdzIiwiYmFzZV9hdHRyX2xpc3QiLCJpc19tYXhfaGFsbG93c19sdiIsImlzX21heF9za2lsbF9sdiIsImN1cl9pbmRleCIsIlRhYl9JbmRleCIsInVwbHYiLCJoYWxsb3dzX3VwbHZfY29zdF9iaWRfMSIsImhhbGxvd3NfdXBsdl9jb3N0X251bV8xIiwiaGFsbG93c191cGx2X2Nvc3RfYmlkXzIiLCJoYWxsb3dzX3VwbHZfY29zdF9udW1fMiIsInNraWxsX2x2dXBfY29zdF9iaWRfMSIsInNraWxsX2x2dXBfY29zdF9udW1fMSIsInNraWxsX2x2dXBfY29zdF9iaWRfMiIsInNraWxsX2x2dXBfY29zdF9udW1fMiIsIm9wZW5DYWxsQmFjayIsImJhY2tncm91bmQiLCJzZWVrQ2hpbGQiLCJyb290X3duZCIsInNjYWxlIiwiRklUX1NDQUxFIiwiYmciLCJTcHJpdGUiLCJsb2FkUmVzIiwiZ2V0QmlnQmciLCJyZXNPYmplY3QiLCJzcHJpdGVGcmFtZSIsImJpbmQiLCJtYWluX3BhbmVsIiwiZ2V0Q2hpbGRCeU5hbWUiLCJ0aXRsZV9iZyIsInRpdGxlX2JnX2ltZyIsImdldENvbXBvbmVudCIsImdldENvbW1vbkljb21QYXRoIiwiYm90dG9tX2JnIiwiYm90dG9tX2JnX2ltZyIsImdldFVJSWNvblBhdGgiLCJzdGVwX2NvbnRhaW5lciIsImF0dHJfYmdfMSIsImF0dHJfYmdfMiIsImJvdHRvbV9iZ18yIiwic2tpbGxfYmciLCJza2lsbF90aXRsZSIsIkxhYmVsIiwic3RyaW5nIiwiVXRpbHMiLCJUSTE4TiIsInRyYWNlX2J0biIsInRyYWNlX2xhYiIsInRyYWNlX2J0bl90aXBzIiwiYWN0aXZlIiwicmVzZXRfYnRuIiwicmVzZXRfbGFiIiwiYXJ0aWZhY3RfYnRuIiwiYXJ0aWZhY3RfYnRuX2xhYmVsIiwidG91Y2hfbGF5b3V0IiwibGVmdF9idG4iLCJyaWdodF9idG4iLCJleHBsYWluX2J0biIsImhhbGxvd3NfbmFtZSIsInRpdGxlX2F0dHIiLCJpIiwiYXR0cl9iZyIsInVwbHZfbGF5b3V0Iiwic3RlcF9wcm9ncmVzcyIsIlByb2dyZXNzQmFyIiwic3RlcF9wcm9ncmVzc192YWx1ZSIsInN0ZXBfYWR2YW5jZWRfYnRuIiwic3RlcF9hdXRvX2FkdmFuY2VkX2J0biIsInN0ZXBfYWR2YW5jZWQiLCJzdGVwX2F1dG9fYWR2YW5jZWRfYnRuX2xhYmVsIiwic3RlcF9hZHZhbmNlZF9idG5fdGlwcyIsImx2dXBfY29zdF9iZyIsImx2dXBfY29zdF9iZ19pbWciLCJsdnVwX2Nvc3RfcmVzXzEiLCJsdnVwX2Nvc3RfbGFiZWxfMSIsImF1dG9fbHZ1cF9jb3N0X2JnIiwiYXV0b19sdnVwX2Nvc3RfaW1nIiwibHZ1cF9jb3N0X3Jlc18yIiwibHZ1cF9jb3N0X2xhYmVsXzIiLCJza2lsbF9jb250YWluZXIiLCJza2lsbF9sYXlvdXQiLCJza2lsbF9sdnVwX25vZGUiLCJza2lsbF9sdnVwX2J0biIsIkJ1dHRvbiIsInNraWxsX2x2dXBfYnRuX2xhYmVsIiwic2tpbGxfbHZ1cF9idG5fbGluZSIsIkxhYmVsT3V0bGluZSIsInNraWxsX2Nvc3RfYmdfMSIsInNraWxsX2Nvc3RfYmdfMV9pbWciLCJza2lsbF9yZXNfaWNvbl8xIiwic2tpbGxfY29zdF9sYWJlbF8xIiwic2tpbGxfY29zdF9iZ18yIiwic2tpbGxfY29zdF9iZ18yX2ltZyIsInNraWxsX3Jlc19pY29uXzIiLCJza2lsbF9jb3N0X2xhYmVsXzIiLCJza2lsbF9sdnVwX3RpcHMiLCJtYXhsdl9sYXlvdXQiLCJtYXhfbHZfdGlwcyIsInRhYl9jb250YWluZXIiLCJvYmplY3QiLCJ0YWJfYnRuIiwidGl0bGUiLCJ0aXBzIiwidGFiX2J0bl9pbWciLCJyZXMiLCJzZl9vYmoiLCJsYWJlbCIsImluZGV4IiwiaGFsbG93c19lZmZfbm9kZSIsImhhbGxvd3NfZWZmX3NrIiwic3AiLCJTa2VsZXRvbiIsInVwZGF0ZV9lZmZfbm9kZSIsInVwZGF0ZV9lZmZfc2siLCJyZWdpc3RlckV2ZW50Iiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwicGxheUJ1dHRvblNvdW5kIiwiQnV0dG9uU291bmQiLCJOb3JtYWwiLCJjaGFuZ2VBdXRvQWR2YW5jZVN0YXR1cyIsInNlbGVjdF9oYWxsb3dzIiwicmVxdWVzdEhhbGxvd3NBZHZhbmNlIiwiaWQiLCJuZXh0Iiwic2VsZWN0X2luZGV4IiwicGFyc2VJbnQiLCJzZWxlY3RIYWxsb3dzSW5kZXgiLCJldmVudCIsImNvbmZpZyIsIkNvbmZpZyIsImhhbGxvd3NfZGF0YSIsImRhdGFfY29uc3QiLCJnYW1lX3J1bGUiLCJwb3MiLCJ0b3VjaCIsImdldExvY2F0aW9uIiwiZ2V0SW5zdGFuY2UiLCJzaG93Q29tbW9uVGlwcyIsImRlc2MiLCJ2byIsIm1lc3NhZ2UiLCJjb3N0X2NvbmZpZyIsImltcHJpbnRfbG93ZXN0Iiwic3RlcCIsInZhbCIsIm9wZW5IYWxsb3dzVHJhY2VXaW5kb3ciLCJfb25DbGlja1Jlc2V0QnRuIiwiX29uQ2xpY2tTa2lsbEx2dXBCdG4iLCJfb25DbGlja0J0bkFydGlmYWN0IiwiX29uQ2xpY2tUb3VjaExheW91dCIsIlRhYiIsImNoYW5nZVNlbGVjdGVkVGFiIiwiYWRkR2xvYmFsRXZlbnQiLCJIYWxsb3dzVXBkYXRlRXZlbnQiLCJoYW5kbGVVcGRhdGVFdmVudCIsIkhhbGxvd3NBZHZhbmNlRXZlbnQiLCJyZXN1bHQiLCJVbmRhdGVIYWxsb3dzSW5mb0V2ZW50IiwiZ2V0SGFsbG93c0luZGV4QnlJZCIsIkhhbGxvd3NSZWRTdGF0dXMiLCJyZWRfdHlwZSIsInNldGF0dXMiLCJ1cGRhdGVUYWJSZWRTdGF0dXMiLCJBRERfR09PRFMiLCJiYWdfY29kZSIsIml0ZW1fbGlzdCIsIkJhZ19Db2RlIiwiQkFDS1BBQ0siLCJjaGVja05lZWRVcGRhdGVJdGVtTnVtIiwiTU9ESUZZX0dPT0RTX05VTSIsIkRFTEVURV9HT09EUyIsInN0ciIsIkNvbW1vbkFsZXJ0Iiwic2hvdyIsInJlcXVlc3RIYWxsb3dzUmVzZXQiLCJyZXF1ZXN0SGFsbG93c1NraWxsVXBncmFkZSIsIm9wZW5IYWxsb3dzUHJldmlld1dpbmRvdyIsIm1heF92byIsIm1ha2VIaWdoZXN0SGFsbG93Vm8iLCJvcGVuSGFsbG93c1RpcHMiLCJ0YWJfb2JqZWN0Iiwibm9kZSIsImNvbG9yIiwiQ29sb3IiLCJza2lsbCIsInVwZGF0ZU1heEx2VGlwcyIsIm9wZW5Sb290V25kIiwiaGFsbG93c19pZCIsImNvbmZpZ19saXN0IiwiZGF0YV9iYXNlIiwiZGF0YV9iYXNlX2xlbmd0aCIsIm5hbWUiLCJlZmZlY3QiLCJpdGVtX2lkIiwib3Blbl9kZXNjIiwiZ2V0SGFsbG93c0J5SWQiLCJwdXNoIiwic29ydCIsImEiLCJiIiwiZ2V0RGVmYXVsdEhhbGxvd3NJbmRleCIsInRlbXBfaGFsbG93c19saXN0IiwiZGVlcENvcHkiLCJ0ZW1wX2hhbGxvd3MiLCJtYXhfc3RlcCIsImxlbmd0aCIsIm1heF9sdWNreSIsImx1Y2t5IiwidGVtcF9oYWxsb3dzXzIiLCJqIiwiaGFsbG93cyIsImZvcmNlIiwiaGFuZGxlRWZmZWN0IiwiY2hlY2tJc1Nob3dSZXNldEJ0biIsInVwZGF0ZUhhbGxvd3NCYXNlSW5mbyIsInVwZGF0ZVNraWxsTGlzdCIsInVwZGF0ZUhhbGxvd1N0YXR1c0luZm8iLCJzdGF0dXMiLCJzZXRUb1NldHVwUG9zZSIsImNsZWFyVHJhY2tzIiwiYW5pbWFfcGF0aCIsImdldFNwaW5lUGF0aCIsImVmZmVjdF9kYXRhIiwiZGF0YV9lZmZlY3RfaW5mbyIsInNrZV9kYXRhIiwic2tlbGV0b25EYXRhIiwic2V0QW5pbWF0aW9uIiwiUGxheWVyQWN0aW9uIiwiYWN0aW9uIiwiYWN0aW9uXzEiLCJhY3Rpb25fMiIsImhhbGxvd3NfbW9kZWxfaWQiLCJzdGVwX2NvbmZpZyIsImdkYXRhIiwiZ2V0Tm9yS2V5IiwibmV4dF9zdGVwX2NvbmZpZyIsImF0dHIiLCJhdHRyX2tleSIsImF0dHJfdmFsIiwibmV4dF9hdHRyX3ZhbCIsImsiLCJhdHRyX25hbWUiLCJhdHRyX2RhdGEiLCJkYXRhX2tleV90b19uYW1lIiwiYXR0cl90ZXh0IiwiY3JlYXRlUmljaExhYmVsIiwidjIiLCJob3Jpem9udGFsQWxpZ24iLCJtYWNybyIsIlRleHRBbGlnbm1lbnQiLCJMRUZUIiwiYWRkQ2hpbGQiLCJpY29uIiwiZ2V0QXR0ckljb25CeVN0ciIsImFkZF92YWx1ZSIsInJhdGlvX2NvbmZpZyIsInJhdGlvIiwiTWF0aCIsInJvdW5kIiwiaXNfcGVyIiwiaXNTaG93UGVyQnlTdHIiLCJzdG9uZV9jb25maWciLCJzZWFsIiwic3RvbmVfdmFsIiwiYXR0cl9zdHIiLCJqcyIsImZvcm1hdFN0ciIsInRvU3RyaW5nIiwiYWRkU3ByaXRlRnJhbWUiLCJoYWxsb3dzX3NraWxsIiwic2tpbGxfbGV2Iiwic2tpbGxfYmlkIiwiaGFsbG93X3NraWxsX2ljb24iLCJTa2lsbEl0ZW0iLCJzZXRQYXJlbnQiLCJzZXRTY2FsZSIsInNldExldmVTdGF0dXMiLCJzZXRQb3NpdGlvbiIsInNldERhdGEiLCJiaWQiLCJoYWxsb3dzX3NraWxsX25hbWUiLCJjcmVhdGVMYWJlbCIsImhhbGxvd3Nfc2tpbGxfZGVzYyIsImRlcyIsInNraWxsX2F0dHJfY29uZmlnIiwiZGF0YV9za2lsbF9hdHRyIiwiYXR0cl90eHQiLCJsZXZfbGltaXQiLCJtYXhfbGV2IiwiZGF0YV9tYXhfbGV2IiwibWF4X3NraWxsX2x2IiwiZGF0YV9za2lsbF9tYXhfbGV2Iiwic2tpbGxfbHYiLCJ1cGRhdGVTdGVwSW5mbyIsInVwZGF0ZVNraWxsSW5mbyIsInByb2dyZXNzIiwiZXhwZW5kXzEiLCJsb3NzIiwiZXhwZW5kXzIiLCJudW0iLCJzZXRDb3N0RGF0YVRvTm9kZSIsImVuYWJsZUF1dG9HcmF5RWZmZWN0IiwiaW50ZXJhY3RhYmxlIiwiZW5hYmxlZCIsImxvc2UiLCJyZWRfaGFsbG93c19pZCIsImdldFJlZEhhbGxvd3NJZCIsInJlZF9zdGF0dXMiLCJjaGVja1JlZElzU2hvd0J5UmVkVHlwZSIsIlJlZF9JbmRleCIsImhhbGxvd3NfbHZ1cCIsInNraWxsX2x2dXAiLCJ0cmFjZV9yZWQiLCJzdG9uZV91c2UiLCJpdGVtX2ljb24iLCJpdGVtX2xhYmVsIiwiaXRlbV9iaWQiLCJpdGVtX251bSIsIml0ZW1fY29uZmlnIiwiZ2V0SXRlbUNvbmZpZyIsImdldEl0ZW1SZXMiLCJjb3VudCIsImdldEl0ZW1OdW1CeUJpZCIsImdldE1vbmV5U3RyaW5nIiwiaXNfc2hvdyIsImF1dG9fdGltZV90aWNrZXQiLCJnY29yZSIsIlRpbWVyIiwic2V0IiwiY2xlYXJBdXRvVGltZXRpY2tldCIsImRlbCIsImNsb3NlQ2FsbEJhY2siLCJkZWxldGVNZSIsIm9wZW5IYWxsb3dzTWFpbldpbmRvdyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxRQUFRLEdBQUdDLE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUNBLElBQUlDLFlBQVksR0FBR0QsT0FBTyxDQUFDLGVBQUQsQ0FBMUI7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Q0EsV0FBS0EsZ0JBQUwsR0FBd0IsSUFBeEI7QUFDSDtBQUNKLEdBOTdCNkI7QUFnOEI5QjtBQUNBTSxFQUFBQSxhQUFhLEVBQUMseUJBQVU7QUFDcEIsU0FBS0YsbUJBQUw7QUFDQSxTQUFLckgsWUFBTCxDQUFrQixLQUFsQjs7QUFDQSxRQUFHLEtBQUs0RCxpQkFBUixFQUEwQjtBQUN0QixXQUFLQSxpQkFBTCxDQUF1QjRELFFBQXZCO0FBQ0EsV0FBSzVELGlCQUFMLEdBQXlCLElBQXpCO0FBQ0g7O0FBRUQsUUFBRyxLQUFLdEssY0FBUixFQUF1QjtBQUNuQixXQUFLQSxjQUFMLENBQW9CZ0gsY0FBcEI7QUFDQSxXQUFLaEgsY0FBTCxDQUFvQmlILFdBQXBCO0FBRUg7O0FBRUQsU0FBS3pPLElBQUwsQ0FBVTJWLHFCQUFWLENBQWdDLEtBQWhDO0FBQ0g7QUFoOUI2QixDQUFULENBQXpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAg6L+Z6YeM5piv5o+P6L+w6L+Z5Liq56qX5L2T55qE5L2c55So55qEXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wMi0xOCAxNDoxNzowMFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBIYWxsb3dzQ29uc3QgPSByZXF1aXJlKFwiaGFsbG93c19jb25zdFwiKTtcbnZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcbnZhciBIYWxsb3dzRXZlbnQgPSByZXF1aXJlKFwiaGFsbG93c19ldmVudFwiKTtcbnZhciBCYWNrcGFja0V2ZW50ID0gcmVxdWlyZShcImJhY2twYWNrX2V2ZW50XCIpO1xudmFyIEJhY2tQYWNrQ29uc3QgPSByZXF1aXJlKFwiYmFja3BhY2tfY29uc3RcIilcbnZhciBQYXJ0bmVyQ2FsY3VsYXRlID0gcmVxdWlyZShcInBhcnRuZXJfY2FsY3VsYXRlXCIpO1xuXG52YXIgaGFsbG93c19tYWluV2luZG93ID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VWaWV3LFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcImhhbGxvd3NcIiwgXCJoYWxsb3dzX21haW5fd2luZG93XCIpO1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcudWk7ICAgICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5GdWxsOyAgICAgICAgICAgICAgIC8v5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuICAgICAgICB0aGlzLnJsZWFzZVByZWZhYiA9IGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5jdHJsID0gYXJndW1lbnRzWzBdO1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy5jdHJsLmdldE1vZGVsKCk7XG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcbiAgICBpbml0Q29uZmlnOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuc2tpbGxfYXR0cl9saXN0ID0ge307IC8vIOaKgOiDveWKoOaIkFxuICAgICAgICB0aGlzLmlzX2luX2FkdmFuY2UgPSBmYWxzZTtcdFx0Ly8g5piv5ZCm5Zyo6Ieq5Yqo6L+b6Zi25LitXG4gICAgICAgIHRoaXMuaGFsbG93c19saXN0ID0ge307XG4gICAgICAgIHRoaXMuaGFsbG93c19zdW0gPSAwO1xuICAgICAgICB0aGlzLnRhYl9saXN0ID0ge307XG4gICAgICAgIHRoaXMuYXR0cl9iZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlX2F0dHJfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLmlzX21heF9oYWxsb3dzX2x2ID0gZmFsc2U7ICAvLyDnpZ7lmajmmK/lkKbovr7liLDmnIDlpKfnrYnnuqdcbiAgICAgICAgdGhpcy5pc19tYXhfc2tpbGxfbHYgPSBmYWxzZTtcdC8vIOaKgOiDveaYr+WQpui+vuWIsOacgOWkp+etiee6p1xuICAgICAgICB0aGlzLmN1cl9pbmRleCA9IEhhbGxvd3NDb25zdC5UYWJfSW5kZXgudXBsdjtcbiAgICAgICAgdGhpcy5oYWxsb3dzX3VwbHZfY29zdF9iaWRfMSA9IDA7IC8vIOmAieS4reeahOelnuWZqOWNh+e6p+aJgOmcgOa2iOiAlzFcbiAgICAgICAgdGhpcy5oYWxsb3dzX3VwbHZfY29zdF9udW1fMSA9IDA7XG4gICAgICAgIHRoaXMuaGFsbG93c191cGx2X2Nvc3RfYmlkXzIgPSAwOy8vIOmAieS4reeahOelnuWZqOWNh+e6p+aJgOmcgOa2iOiAlzJcbiAgICAgICAgdGhpcy5oYWxsb3dzX3VwbHZfY29zdF9udW1fMiA9IDA7XG4gICAgICAgIHRoaXMuc2tpbGxfbHZ1cF9jb3N0X2JpZF8xID0gMDsgICAvLyDpgInkuK3nmoTnpZ7lmajmioDog73ljYfnuqfmiYDpnIDmtojogJcxXG4gICAgICAgIHRoaXMuc2tpbGxfbHZ1cF9jb3N0X251bV8xID0gMDtcbiAgICAgICAgdGhpcy5za2lsbF9sdnVwX2Nvc3RfYmlkXzIgPSAwOyBcdCAvLyDpgInkuK3nmoTnpZ7lmajmioDog73ljYfnuqfmiYDpnIDmtojogJcyXG4gICAgICAgIHRoaXMuc2tpbGxfbHZ1cF9jb3N0X251bV8yID0gMDtcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCO55qE5Zue6LCDLOWPr+S7peWcqOi/memHjOaNleiOt+ebuOWFs+iKgueCueaIluiAhee7hOS7tlxuICAgIG9wZW5DYWxsQmFjazpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnJvb3Rfd25kLCBcImJhY2tncm91bmRcIik7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZC5zY2FsZSA9IEZJVF9TQ0FMRTtcbiAgICAgICAgdGhpcy5iZyA9IHRoaXMuc2Vla0NoaWxkKHRoaXMucm9vdF93bmQsIFwiYmFja2dyb3VuZFwiLCBjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0QmlnQmcoXCJiaWdiZ182OFwiLFwianBnXCIpLCAoZnVuY3Rpb24ocmVzT2JqZWN0KXtcbiAgICAgICAgICAgIHRoaXMuYmcuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHZhciBtYWluX3BhbmVsID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcIm1haW5fcGFuZWxcIik7XG4gICAgICAgIHZhciB0aXRsZV9iZyA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXRsZV9iZ1wiKTtcblxuICAgICAgICB0aGlzLnRpdGxlX2JnX2ltZyA9IHRpdGxlX2JnLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fMjAxNVwiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLnRpdGxlX2JnX2ltZy5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgfSkuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5ib3R0b21fYmcgPSBtYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiYm90dG9tX2JnXCIpO1xuXG4gICAgICAgIHRoaXMuYm90dG9tX2JnX2ltZyA9IHRoaXMuYm90dG9tX2JnLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImhhbGxvd3NcIixcImhhbGxvd3NfMTAwMVwiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLmJvdHRvbV9iZ19pbWcuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIC8vIOWNh+e6p1xuXHQgICAgdGhpcy5zdGVwX2NvbnRhaW5lciA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJzdGVwX2NvbnRhaW5lclwiKTtcbiAgICAgICAgdGhpcy5hdHRyX2JnXzEgPSB0aGlzLnN0ZXBfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiYXR0cl9iZ18xXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmF0dHJfYmdfMiA9IHRoaXMuc3RlcF9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJhdHRyX2JnXzJcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMubG9hZFJlcyhQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiaGFsbG93c1wiLFwiaGFsbG93c18xMDA3XCIpLCAoZnVuY3Rpb24ocmVzT2JqZWN0KXtcbiAgICAgICAgICAgIHRoaXMuYXR0cl9iZ18xLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICAgICAgdGhpcy5hdHRyX2JnXzIuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuYm90dG9tX2JnXzIgPSB0aGlzLmJvdHRvbV9iZy5nZXRDaGlsZEJ5TmFtZShcImJvdHRvbV9iZ18yXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fMjAwN1wiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLmJvdHRvbV9iZ18yLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLnNraWxsX2JnID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInNraWxsX2JnXCIpO1xuICAgICAgICB2YXIgc2tpbGxfdGl0bGUgPSB0aGlzLnNraWxsX2JnLmdldENoaWxkQnlOYW1lKFwic2tpbGxfdGl0bGVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgc2tpbGxfdGl0bGUuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmioDog73liqDmiJBcIik7XG5cbiAgICAgICAgdGhpcy50cmFjZV9idG4gPSBtYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwidHJhY2VfYnRuXCIpO1x0XHRcdFx0XHRcdC8vIOWco+WNsOaMiemSrlxuICAgICAgICB2YXIgdHJhY2VfbGFiID0gdGhpcy50cmFjZV9idG4uZ2V0Q2hpbGRCeU5hbWUoXCJsYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0cmFjZV9sYWIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLlnKPljbBcIik7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnRyYWNlX2J0bl90aXBzID0gdGhpcy50cmFjZV9idG4uZ2V0Q2hpbGRCeU5hbWUoXCJ0aXBzXCIpO1x0XHRcdFx0XHQvLyDlnKPljbDnuqLngrlcbiAgICAgICAgdGhpcy50cmFjZV9idG5fdGlwcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldF9idG4gPSBtYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwicmVzZXRfYnRuXCIpO1xuICAgICAgICB2YXIgcmVzZXRfbGFiID0gdGhpcy5yZXNldF9idG4uZ2V0Q2hpbGRCeU5hbWUoXCJsYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICByZXNldF9sYWIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLph43pk7hcIik7XG4gICAgICAgIHRoaXMucmVzZXRfYnRuLmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuYXJ0aWZhY3RfYnRuID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImFydGlmYWN0X2J0blwiKTtcbiAgICAgICAgdmFyIGFydGlmYWN0X2J0bl9sYWJlbCA9IHRoaXMuYXJ0aWZhY3RfYnRuLmdldENoaWxkQnlOYW1lKFwibGFiZWxcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgYXJ0aWZhY3RfYnRuX2xhYmVsLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5aSx6JC956We5ZmoXCIpO1xuICAgICAgICB0aGlzLnRvdWNoX2xheW91dCA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJ0b3VjaF9sYXlvdXRcIik7XG5cbiAgICAgICAgdGhpcy5sZWZ0X2J0biA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJsZWZ0X2J0blwiKTtcdFx0XHRcdFx0XHQgICAgLy8g5bem56e75oyJ6ZKuXG4gICAgICAgIHRoaXMucmlnaHRfYnRuID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInJpZ2h0X2J0blwiKTtcdFx0XHRcdFx0XHQvLyDlj7Pnp7vmjInpkq5cbiAgICAgICAgdGhpcy5leHBsYWluX2J0biA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJleHBsYWluX2J0blwiKTtcdFx0XHRcdFx0Ly8g6K+05piO5oyJ6ZKuXG4gICAgICAgIHRoaXMuaGFsbG93c19uYW1lID0gdGl0bGVfYmcuZ2V0Q2hpbGRCeU5hbWUoXCJoYWxsb3dzX25hbWVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcdFx0XHRcdCAgICAvLyDlnKPlmajlkI3lrZdcblxuICAgICAgICBcbiAgICAgICAgdmFyIHRpdGxlX2F0dHIgPSB0aGlzLnN0ZXBfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwidGl0bGVfYXR0clwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0aXRsZV9hdHRyLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5YWo6Zif5Z+656GA5bGe5oCnXCIpO1xuICAgICAgICBmb3IodmFyIGkgPSAxO2k8MztpKyspe1xuICAgICAgICAgICAgdmFyIGF0dHJfYmcgPSB0aGlzLnN0ZXBfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiYXR0cl9iZ19cIitpKTtcblx0XHQgICAgdGhpcy5hdHRyX2Jnc1tpXSA9IGF0dHJfYmc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwbHZfbGF5b3V0ID0gdGhpcy5zdGVwX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInVwbHZfbGF5b3V0XCIpO1xuICAgICAgICB0aGlzLnN0ZXBfcHJvZ3Jlc3MgPSB0aGlzLnVwbHZfbGF5b3V0LmdldENoaWxkQnlOYW1lKFwicHJvZ3Jlc3NcIikuZ2V0Q29tcG9uZW50KGNjLlByb2dyZXNzQmFyKTtcdFx0XHRcdFx0XHRcdC8vIOW9k+WJjee7j+mqjOadoVxuICAgICAgICB0aGlzLnN0ZXBfcHJvZ3Jlc3NfdmFsdWUgPSB0aGlzLnVwbHZfbGF5b3V0LmdldENoaWxkQnlOYW1lKFwicHJvZ3Jlc3NfdmFsdWVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcdFx0XHRcdCAgICAvLyDlvZPliY3nu4/pqozlgLxcbiAgICAgICAgdGhpcy5zdGVwX2FkdmFuY2VkX2J0biA9IHRoaXMudXBsdl9sYXlvdXQuZ2V0Q2hpbGRCeU5hbWUoXCJhZHZhbmNlZF9idG5cIik7XHRcdFx0XHRcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDov5vpmLbkuIDmrKHmjInpkq5cbiAgICAgICAgdGhpcy5zdGVwX2F1dG9fYWR2YW5jZWRfYnRuID0gdGhpcy51cGx2X2xheW91dC5nZXRDaGlsZEJ5TmFtZShcImF1dG9fYWR2YW5jZWRfYnRuXCIpXHRcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5LiA6ZSu6L+b6Zi25oyJ6ZKuXG4gICAgICAgIHZhciBzdGVwX2FkdmFuY2VkID0gdGhpcy5zdGVwX2FkdmFuY2VkX2J0bi5nZXRDaGlsZEJ5TmFtZShcImxhYmVsXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIHN0ZXBfYWR2YW5jZWQuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLljYfnuqdcIik7XG4gICAgICAgIHRoaXMuc3RlcF9hdXRvX2FkdmFuY2VkX2J0bl9sYWJlbCA9IHRoaXMuc3RlcF9hdXRvX2FkdmFuY2VkX2J0bi5nZXRDaGlsZEJ5TmFtZShcImxhYmVsXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMuc3RlcF9hdXRvX2FkdmFuY2VkX2J0bl9sYWJlbC5zdHJpbmcgPSBVdGlscy5USTE4TihcIuS4gOmUruWNh+e6p1wiKTtcbiAgICAgICAgdGhpcy5zdGVwX2FkdmFuY2VkX2J0bl90aXBzID0gdGhpcy5zdGVwX2FkdmFuY2VkX2J0bi5nZXRDaGlsZEJ5TmFtZShcInRpcHNcIilcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOi/m+mYtue6oueCuVxuICAgICAgICB0aGlzLnN0ZXBfYWR2YW5jZWRfYnRuX3RpcHMuYWN0aXZlID0gZmFsc2U7XG5cblxuICAgICAgICAvLyDljYfnuqfmtojogJdcbiAgICAgICAgdmFyIGx2dXBfY29zdF9iZyA9IHRoaXMudXBsdl9sYXlvdXQuZ2V0Q2hpbGRCeU5hbWUoXCJsdnVwX2Nvc3RfYmdcIik7XG4gICAgICAgIHRoaXMubHZ1cF9jb3N0X2JnX2ltZyA9IGx2dXBfY29zdF9iZy5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sdnVwX2Nvc3RfcmVzXzEgPSBsdnVwX2Nvc3RfYmcuZ2V0Q2hpbGRCeU5hbWUoXCJyZXNfaWNvblwiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sdnVwX2Nvc3RfbGFiZWxfMSA9IGx2dXBfY29zdF9iZy5nZXRDaGlsZEJ5TmFtZShcImx2dXBfY29zdF9sYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB2YXIgYXV0b19sdnVwX2Nvc3RfYmcgPSB0aGlzLnVwbHZfbGF5b3V0LmdldENoaWxkQnlOYW1lKFwiYXV0b19sdnVwX2Nvc3RfYmdcIik7XG4gICAgICAgIHRoaXMuYXV0b19sdnVwX2Nvc3RfaW1nID0gYXV0b19sdnVwX2Nvc3RfYmcuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMubHZ1cF9jb3N0X3Jlc18yID0gYXV0b19sdnVwX2Nvc3RfYmcuZ2V0Q2hpbGRCeU5hbWUoXCJyZXNfaWNvblwiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTs7XG4gICAgICAgIHRoaXMubHZ1cF9jb3N0X2xhYmVsXzIgPSBhdXRvX2x2dXBfY29zdF9iZy5nZXRDaGlsZEJ5TmFtZShcImF1dG9fbHZ1cF9jb3N0X2xhYmVsXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG5cbiAgICAgICAgLy8g5oqA6IO9XG4gICAgICAgIHRoaXMuc2tpbGxfY29udGFpbmVyID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInNraWxsX2NvbnRhaW5lclwiKTtcbiAgICAgICAgdGhpcy5za2lsbF9sYXlvdXQgPSB0aGlzLnNraWxsX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInNraWxsX2xheW91dFwiKTtcbiAgICAgICAgdGhpcy5za2lsbF9sdnVwX25vZGUgPSB0aGlzLnNraWxsX2xheW91dC5nZXRDaGlsZEJ5TmFtZShcInNraWxsX2x2dXBfYnRuXCIpO1xuICAgICAgICB0aGlzLnNraWxsX2x2dXBfYnRuID0gdGhpcy5za2lsbF9sYXlvdXQuZ2V0Q2hpbGRCeU5hbWUoXCJza2lsbF9sdnVwX2J0blwiKS5nZXRDb21wb25lbnQoY2MuQnV0dG9uKTtcbiAgICAgICAgdGhpcy5za2lsbF9sdnVwX2J0bl9sYWJlbCA9IHRoaXMuc2tpbGxfbHZ1cF9ub2RlLmdldENoaWxkQnlOYW1lKFwibGFiZWxcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5za2lsbF9sdnVwX2J0bl9sYWJlbC5zdHJpbmcgPSBVdGlscy5USTE4TihcIuWNh+e6p1wiKTtcbiAgICAgICAgdGhpcy5za2lsbF9sdnVwX2J0bl9saW5lID0gdGhpcy5za2lsbF9sdnVwX25vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJsYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWxPdXRsaW5lKTtcbiAgICAgICAgXG5cbiAgICAgICAgLy8g5oqA6IO95Y2H57qn5raI6ICXXG4gICAgICAgIHRoaXMuc2tpbGxfY29zdF9iZ18xID0gdGhpcy5za2lsbF9sYXlvdXQuZ2V0Q2hpbGRCeU5hbWUoXCJza2lsbF9jb3N0X2JnXzFcIik7XG4gICAgICAgIHRoaXMuc2tpbGxfY29zdF9iZ18xX2ltZyA9IHRoaXMuc2tpbGxfY29zdF9iZ18xLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLnNraWxsX3Jlc19pY29uXzEgPSB0aGlzLnNraWxsX2Nvc3RfYmdfMS5nZXRDaGlsZEJ5TmFtZShcInNraWxsX3Jlc19pY29uXzFcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMuc2tpbGxfY29zdF9sYWJlbF8xID0gdGhpcy5za2lsbF9jb3N0X2JnXzEuZ2V0Q2hpbGRCeU5hbWUoXCJza2lsbF9jb3N0X2xhYmVsXzFcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5za2lsbF9jb3N0X2JnXzIgPSB0aGlzLnNraWxsX2xheW91dC5nZXRDaGlsZEJ5TmFtZShcInNraWxsX2Nvc3RfYmdfMlwiKTtcbiAgICAgICAgdGhpcy5za2lsbF9jb3N0X2JnXzJfaW1nID0gdGhpcy5za2lsbF9jb3N0X2JnXzIuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMuc2tpbGxfcmVzX2ljb25fMiA9IHRoaXMuc2tpbGxfY29zdF9iZ18yLmdldENoaWxkQnlOYW1lKFwic2tpbGxfcmVzX2ljb25fMlwiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5za2lsbF9jb3N0X2xhYmVsXzIgPSB0aGlzLnNraWxsX2Nvc3RfYmdfMi5nZXRDaGlsZEJ5TmFtZShcInNraWxsX2Nvc3RfbGFiZWxfMlwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuXG4gICAgICAgIHRoaXMubG9hZFJlcyhQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiaGFsbG93c1wiLFwiaGFsbG93c18xMDA4XCIpLCAoZnVuY3Rpb24ocmVzT2JqZWN0KXtcbiAgICAgICAgICAgIHRoaXMubHZ1cF9jb3N0X2JnX2ltZy5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgICAgIHRoaXMuYXV0b19sdnVwX2Nvc3RfaW1nLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICAgICAgdGhpcy5za2lsbF9jb3N0X2JnXzFfaW1nLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICAgICAgdGhpcy5za2lsbF9jb3N0X2JnXzJfaW1nLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyDml6Dms5XljYfnuqfml7bnmoTmj5DnpLpcbiAgICAgICAgdGhpcy5za2lsbF9sdnVwX3RpcHMgPSB0aGlzLnNraWxsX2xheW91dC5nZXRDaGlsZEJ5TmFtZShcInNraWxsX2x2dXBfdGlwc1wiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgIFxuICAgICAgICAvLyDmu6HnuqdcbiAgICAgICAgdGhpcy5tYXhsdl9sYXlvdXQgPSBtYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwibWF4bHZfbGF5b3V0XCIpO1xuICAgICAgICB0aGlzLm1heF9sdl90aXBzID0gdGhpcy5tYXhsdl9sYXlvdXQuZ2V0Q2hpbGRCeU5hbWUoXCJtYXhfbHZfdGlwc1wiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuXG4gICAgICAgIHZhciB0YWJfY29udGFpbmVyID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInRhYl9jb250YWluZXJcIik7XG4gICAgICAgIGZvcih2YXIgaSA9IDE7aTwzO2krKyl7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0ge307XG4gICAgICAgICAgICB2YXIgdGFiX2J0biA9IHRhYl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJ0YWJfYnRuX1wiK2kpO1xuICAgICAgICAgICAgaWYodGFiX2J0bil7XG4gICAgICAgICAgICAgICAgdmFyIHRpdGxlID0gdGFiX2J0bi5nZXRDaGlsZEJ5TmFtZShcInRpdGxlXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgICAgICAgICAgaWYoaT09MSl7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5Y2H57qnXCIpO1xuICAgICAgICAgICAgICAgIH1lbHNlIGlmKGk9PTIpe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuaKgOiDvVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHRpcHMgPSB0YWJfYnRuLmdldENoaWxkQnlOYW1lKFwidGlwc1wiKTtcbiAgICAgICAgICAgICAgICB2YXIgdGFiX2J0bl9pbWcgPSB0YWJfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwidGFiX2J0bl9cIitpKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgICAgICB2YXIgcmVzID0gUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fMjAwOVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCBmdW5jdGlvbiAoc2Zfb2JqKSB7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdC50YWJfYnRuX2ltZy5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgICAgICAgICAgb2JqZWN0LnRhYl9idG4gPSB0YWJfYnRuO1xuICAgICAgICAgICAgICAgIG9iamVjdC5sYWJlbCA9IHRpdGxlO1xuICAgICAgICAgICAgICAgIG9iamVjdC5pbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgb2JqZWN0LnRpcHMgPSB0aXBzO1xuICAgICAgICAgICAgICAgIG9iamVjdC50YWJfYnRuX2ltZyA9IHRhYl9idG5faW1nO1xuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdGhpcy50YWJfbGlzdFtpXSA9IG9iamVjdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFsbG93c19lZmZfbm9kZSA9IHRoaXMuc2Vla0NoaWxkKFwiaGFsbG93c19lZmZfbm9kZVwiKTtcbiAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zayAgICA9IHRoaXMuc2Vla0NoaWxkKFwiaGFsbG93c19lZmZfbm9kZVwiLCBzcC5Ta2VsZXRvbik7XG5cbiAgICAgICAgdGhpcy51cGRhdGVfZWZmX25vZGUgPSB0aGlzLnNlZWtDaGlsZChcInVwZGF0ZV9lZmZfbm9kZVwiKTtcbiAgICAgICAgdGhpcy51cGRhdGVfZWZmX3NrICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJ1cGRhdGVfZWZmX25vZGVcIiwgc3AuU2tlbGV0b24pO1xuICAgICAgICBcblx0ICAgIHRoaXMubWFpbl9wYW5lbCA9IG1haW5fcGFuZWw7XG4gICAgfSxcblxuICAgIC8vIOazqOWGjOS6i+S7tuebkeWQrOeahOaOpeWPoyzkuI3pnIDopoHmiYvliqjosIPnlKgs5aaC5p6c5piv5L2/55SoZ2NvcmUuR2xvYmFsRXZlbnTnm5HlkKws5Y+v5Lul55u05o6l6LCD55SoYWRkR2xvYmFsRXZlbnRcbiAgICByZWdpc3RlckV2ZW50OmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuc3RlcF9hZHZhbmNlZF9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlQXV0b0FkdmFuY2VTdGF0dXMoZmFsc2UpO1xuICAgICAgICAgICAgaWYodGhpcy5zZWxlY3RfaGFsbG93cyl7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RIYWxsb3dzQWR2YW5jZSh0aGlzLnNlbGVjdF9oYWxsb3dzLmlkLCBmYWxzZSkgO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIHRoaXMuc3RlcF9hdXRvX2FkdmFuY2VkX2J0bi5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZChCdXR0b25Tb3VuZC5Ob3JtYWwpO1xuICAgICAgICAgICAgdmFyIGlzX2luX2FkdmFuY2UgPSAhdGhpcy5pc19pbl9hZHZhbmNlO1xuICAgICAgICAgICAgaWYoaXNfaW5fYWR2YW5jZSA9PSB0cnVlICYmIHRoaXMuc2VsZWN0X2hhbGxvd3Mpe1xuICAgICAgICAgICAgICAgIHRoaXMuY3RybC5yZXF1ZXN0SGFsbG93c0FkdmFuY2UodGhpcy5zZWxlY3RfaGFsbG93cy5pZCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VBdXRvQWR2YW5jZVN0YXR1cyhpc19pbl9hZHZhbmNlKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICB0aGlzLmxlZnRfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKEJ1dHRvblNvdW5kLk5vcm1hbCk7XG4gICAgICAgICAgICBpZih0aGlzLmhhbGxvd3NfbGlzdCAmJiBVdGlscy5uZXh0KHRoaXMuaGFsbG93c19saXN0KSAhPSBudWxsKXtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0X2luZGV4ID0gcGFyc2VJbnQodGhpcy5zZWxlY3RfaW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmKHNlbGVjdF9pbmRleCA8PSAwKXtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0X2luZGV4ID0gdGhpcy5oYWxsb3dzX3N1bTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0X2luZGV4ID0gc2VsZWN0X2luZGV4IC0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RIYWxsb3dzSW5kZXgoc2VsZWN0X2luZGV4KVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIHRoaXMucmlnaHRfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKEJ1dHRvblNvdW5kLk5vcm1hbCk7XG4gICAgICAgICAgICBpZih0aGlzLmhhbGxvd3NfbGlzdCAmJiBVdGlscy5uZXh0KHRoaXMuaGFsbG93c19saXN0KSAhPSBudWxsKXtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0X2luZGV4ID0gcGFyc2VJbnQodGhpcy5zZWxlY3RfaW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmKHNlbGVjdF9pbmRleCsxID49IHRoaXMuaGFsbG93c19zdW0pe1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RfaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RfaW5kZXggPSBzZWxlY3RfaW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEhhbGxvd3NJbmRleChzZWxlY3RfaW5kZXgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpXG5cbiAgICAgICAgdGhpcy5leHBsYWluX2J0bi5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKEJ1dHRvblNvdW5kLk5vcm1hbCk7XG4gICAgICAgICAgICB2YXIgY29uZmlnID0gQ29uZmlnLmhhbGxvd3NfZGF0YS5kYXRhX2NvbnN0LmdhbWVfcnVsZVxuICAgICAgICAgICAgdmFyIHBvcyA9IGV2ZW50LnRvdWNoLmdldExvY2F0aW9uKCk7XG4gICAgICAgICAgICByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuc2hvd0NvbW1vblRpcHMoY29uZmlnLmRlc2MsIHBvcyxudWxsLG51bGwsNTAwKTsgICAgICAgICAgICBcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICB0aGlzLnRyYWNlX2J0bi5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZChCdXR0b25Tb3VuZC5Ob3JtYWwpO1xuICAgICAgICAgICAgaWYodGhpcy5zZWxlY3RfaGFsbG93cyl7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5zZWxlY3RfaGFsbG93cy52byA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZShUSTE4TihcIuivpeWco+WZqOaaguacqua/gOa0u1wiKSlcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvc3RfY29uZmlnID0gQ29uZmlnLmhhbGxvd3NfZGF0YS5kYXRhX2NvbnN0LmltcHJpbnRfbG93ZXN0O1xuICAgICAgICAgICAgICAgICAgICBpZihjb3N0X2NvbmZpZyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnNlbGVjdF9oYWxsb3dzLnZvLnN0ZXAgPCBjb3N0X2NvbmZpZy52YWwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UoY29zdF9jb25maWcuZGVzYylcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuSGFsbG93c1RyYWNlV2luZG93KHRydWUsIHRoaXMuc2VsZWN0X2hhbGxvd3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIHRoaXMucmVzZXRfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKEJ1dHRvblNvdW5kLk5vcm1hbCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNsaWNrUmVzZXRCdG4oKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICB0aGlzLnNraWxsX2x2dXBfbm9kZS5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZChCdXR0b25Tb3VuZC5Ob3JtYWwpO1xuICAgICAgICAgICAgdGhpcy5fb25DbGlja1NraWxsTHZ1cEJ0bigpO1xuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIHRoaXMuYXJ0aWZhY3RfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKEJ1dHRvblNvdW5kLk5vcm1hbCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNsaWNrQnRuQXJ0aWZhY3QoKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICB0aGlzLnRvdWNoX2xheW91dC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZChCdXR0b25Tb3VuZC5Ob3JtYWwpO1xuICAgICAgICAgICAgdGhpcy5fb25DbGlja1RvdWNoTGF5b3V0KCk7XG4gICAgICAgIH0sIHRoaXMpXG5cbiAgICAgICAgZm9yKHZhciBpIGluIHRoaXMudGFiX2xpc3Qpe1xuICAgICAgICAgICAgaWYodGhpcy50YWJfbGlzdFtpXS50YWJfYnRuKXtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYl9saXN0W2ldLnRhYl9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKEJ1dHRvblNvdW5kLlRhYik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlU2VsZWN0ZWRUYWIoaW5kZXgpO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLHRoaXMudGFiX2xpc3RbaV0uaW5kZXgpLCB0aGlzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChIYWxsb3dzRXZlbnQuSGFsbG93c1VwZGF0ZUV2ZW50LCBmdW5jdGlvbihpZCkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVVcGRhdGVFdmVudChpZCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSlcblxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEhhbGxvd3NFdmVudC5IYWxsb3dzQWR2YW5jZUV2ZW50LCBmdW5jdGlvbihpZCwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZih0aGlzLnNlbGVjdF9oYWxsb3dzICYmIHRoaXMuc2VsZWN0X2hhbGxvd3MuaWQgIT0gaWQpe1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQXV0b0FkdmFuY2VTdGF0dXMoZmFsc2UpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgaWYocmVzdWx0ID09IDAgfHwgcmVzdWx0ID09IDEpey8vMOagh+ivhuadkOaWmeS5i+exu+eahOS4jei2syAx5qCH6K+G5Y2H6Zi25LqGLOi/meS4pOenjeaDheWGtemDveWBnOaOiVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUF1dG9BZHZhbmNlU3RhdHVzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSlcblxuICAgICAgICAvLyDmmL7npLrkuLrmn5DkuIDnpZ7lmajvvIjku47miYDmnInnpZ7lmajpooTop4jnlYzpnaLmiZPlvIDvvIlcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChIYWxsb3dzRXZlbnQuVW5kYXRlSGFsbG93c0luZm9FdmVudCwgZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuc2VsZWN0X2hhbGxvd3MgJiYgdGhpcy5zZWxlY3RfaGFsbG93cy5pZCAhPSBpZCl7XG4gICAgICAgICAgICAgICAgdmFyIHNlbGVjdF9pbmRleCA9IHRoaXMuZ2V0SGFsbG93c0luZGV4QnlJZChpZCk7XG5cdFx0XHQgICAgdGhpcy5zZWxlY3RIYWxsb3dzSW5kZXgoc2VsZWN0X2luZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgIC8vIOelnuWZqOe6oueCueabtOaWsFxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEhhbGxvd3NFdmVudC5IYWxsb3dzUmVkU3RhdHVzLCBmdW5jdGlvbihyZWRfdHlwZSwgc2V0YXR1cykge1xuICAgICAgICAgICAgaWYodGhpcy5zZWxlY3RfaGFsbG93cyl7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUYWJSZWRTdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoQmFja3BhY2tFdmVudC5BRERfR09PRFMsIGZ1bmN0aW9uKGJhZ19jb2RlLCBpdGVtX2xpc3QpIHtcbiAgICAgICAgICAgIGlmKGJhZ19jb2RlICE9IEJhY2tQYWNrQ29uc3QuQmFnX0NvZGUuQkFDS1BBQ0spcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5jaGVja05lZWRVcGRhdGVJdGVtTnVtKGl0ZW1fbGlzdCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSlcblxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEJhY2twYWNrRXZlbnQuTU9ESUZZX0dPT0RTX05VTSwgZnVuY3Rpb24oYmFnX2NvZGUsIGl0ZW1fbGlzdCkge1xuICAgICAgICAgICAgaWYoYmFnX2NvZGUgIT0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDSylyZXR1cm47XG4gICAgICAgICAgICB0aGlzLmNoZWNrTmVlZFVwZGF0ZUl0ZW1OdW0oaXRlbV9saXN0KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoQmFja3BhY2tFdmVudC5ERUxFVEVfR09PRFMsIGZ1bmN0aW9uKGJhZ19jb2RlLCBpdGVtX2xpc3QpIHtcbiAgICAgICAgICAgIGlmKGJhZ19jb2RlICE9IEJhY2tQYWNrQ29uc3QuQmFnX0NvZGUuQkFDS1BBQ0spcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5jaGVja05lZWRVcGRhdGVJdGVtTnVtKGl0ZW1fbGlzdCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICB9LFxuXG4gICAgLy8g54K55Ye76YeN6ZO4XG4gICAgX29uQ2xpY2tSZXNldEJ0bjpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgc3RyID0gVXRpbHMuVEkxOE4oXCLph43pk7jlkI7npZ7lmajlsIblm57liLDliJ3lp4vnirbmgIHvvIzlkIzml7bov5Tov5jpmaTph5HluIHlpJbmiYDmnInotYTmupDvvIzmmK/lkKbph43pk7jvvJ9cIik7XG4gICAgICAgIHZhciBDb21tb25BbGVydCA9IHJlcXVpcmUoXCJjb21tb25hbGVydFwiKTtcbiAgICAgICAgQ29tbW9uQWxlcnQuc2hvdyhzdHIsIFV0aWxzLlRJMThOKFwi56Gu5a6aXCIpLCAoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmKHRoaXMuc2VsZWN0X2hhbGxvd3Mpe1xuICAgICAgICAgICAgICAgIHRoaXMuY3RybC5yZXF1ZXN0SGFsbG93c1Jlc2V0KHRoaXMuc2VsZWN0X2hhbGxvd3MuaWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pLmJpbmQodGhpcyksIFV0aWxzLlRJMThOKFwi5Y+W5raIXCIpKTtcbiAgICB9LFxuXG4gICAgLy8g5oqA6IO95Y2H57qnXG4gICAgX29uQ2xpY2tTa2lsbEx2dXBCdG46ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYodGhpcy5zZWxlY3RfaGFsbG93cyA9PSBudWxsKXJldHVybjtcbiAgICAgICAgdmFyIHZvID0gdGhpcy5zZWxlY3RfaGFsbG93cy52bztcbiAgICAgICAgaWYodm8pe1xuICAgICAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RIYWxsb3dzU2tpbGxVcGdyYWRlKHZvLmlkKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDlpLHokL3npZ7lmahcbiAgICBfb25DbGlja0J0bkFydGlmYWN0OmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuY3RybC5vcGVuSGFsbG93c1ByZXZpZXdXaW5kb3codHJ1ZSk7XG4gICAgfSxcblxuICAgIC8vIOeCueWHu+elnuWZqOaYvuekunRpcFxuICAgIF9vbkNsaWNrVG91Y2hMYXlvdXQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYodGhpcy5zZWxlY3RfaGFsbG93cyA9PSBudWxsKXJldHVybjtcbiAgICAgICAgdmFyIHZvID0gdGhpcy5zZWxlY3RfaGFsbG93cy52bztcbiAgICAgICAgaWYodm8pe1xuICAgICAgICAgICAgdmFyIG1heF92byA9IHRoaXMubW9kZWwubWFrZUhpZ2hlc3RIYWxsb3dWbyh2by5pZCk7XG5cdFx0ICAgIHRoaXMuY3RybC5vcGVuSGFsbG93c1RpcHModHJ1ZSwgbWF4X3ZvKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliIfmjaLliIbpobVcbiAgICBjaGFuZ2VTZWxlY3RlZFRhYjpmdW5jdGlvbiggaW5kZXggKXtcbiAgICAgICAgaWYodGhpcy50YWJfb2JqZWN0ICYmIHRoaXMudGFiX29iamVjdC5pbmRleCA9PSBpbmRleClyZXR1cm47XG4gICAgICAgIGlmKHRoaXMudGFiX29iamVjdCl7XG4gICAgICAgICAgICB2YXIgcmVzID0gUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fMjAwOVwiKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFJlcyhyZXMsIGZ1bmN0aW9uIChzZl9vYmopIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYl9vYmplY3QudGFiX2J0bl9pbWcuc3ByaXRlRnJhbWUgPSBzZl9vYmo7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy50YWJfb2JqZWN0LmxhYmVsLm5vZGUuY29sb3IgPSBuZXcgY2MuQ29sb3IoMjA3LCAxODEsIDE0NywyNTUpO1xuICAgICAgICAgICAgdGhpcy50YWJfb2JqZWN0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYl9vYmplY3QgPSB0aGlzLnRhYl9saXN0W2luZGV4XTtcbiAgICAgICAgaWYodGhpcy50YWJfb2JqZWN0KXtcbiAgICAgICAgICAgIHZhciByZXMgPSBQYXRoVG9vbC5nZXRDb21tb25JY29tUGF0aChcImNvbW1vbl8yMDEwXCIpO1xuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHNmX29iaikge1xuICAgICAgICAgICAgICAgIHRoaXMudGFiX29iamVjdC50YWJfYnRuX2ltZy5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB0aGlzLnRhYl9vYmplY3QubGFiZWwubm9kZS5jb2xvciA9IG5ldyBjYy5Db2xvcigyNTUsIDIzNywgMjE0LDI1NSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJfaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5zdGVwX2NvbnRhaW5lci5hY3RpdmUgPSBpbmRleCA9PSBIYWxsb3dzQ29uc3QuVGFiX0luZGV4LnVwbHY7XG4gICAgICAgIHRoaXMuc2tpbGxfY29udGFpbmVyLmFjdGl2ZSA9IGluZGV4ID09IEhhbGxvd3NDb25zdC5UYWJfSW5kZXguc2tpbGw7XG4gICAgICAgIHRoaXMudXBkYXRlTWF4THZUaXBzKCk7XG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjizmt7vliqDliLDlr7nlupTkuLvoioLngrnkuYvlkI7nmoTlm57osIMs5Lmf5bCx5piv5LiA5Liq56qX5L2T55qE5q2j5byP5YWl5Y+jLOWPr+S7peiuvue9ruS4gOS6m+aVsOaNruS6hlxuICAgIG9wZW5Sb290V25kOmZ1bmN0aW9uKGhhbGxvd3NfaWQsIGluZGV4KXtcbiAgICAgICAgLy8g5qC55o2u5r+A5rS75pWw5ZKMaWTph43mlrDmjpLluo8sXG4gICAgICAgIHZhciBjb25maWdfbGlzdCA9IENvbmZpZy5oYWxsb3dzX2RhdGEuZGF0YV9iYXNlO1xuICAgICAgICB0aGlzLmhhbGxvd3NfbGlzdCA9IFtdO1xuICAgICAgICB0aGlzLmhhbGxvd3Nfc3VtID0gQ29uZmlnLmhhbGxvd3NfZGF0YS5kYXRhX2Jhc2VfbGVuZ3RoO1xuICAgICAgICBmb3IodmFyIGkgaW4gY29uZmlnX2xpc3Qpe1xuICAgICAgICAgICAgdmFyIG9iamVjdCA9IHt9O1xuICAgICAgICAgICAgb2JqZWN0LmlkID0gY29uZmlnX2xpc3RbaV0uaWQ7XG4gICAgICAgICAgICBvYmplY3QubmFtZSA9IGNvbmZpZ19saXN0W2ldLm5hbWU7XG4gICAgICAgICAgICBvYmplY3QuZWZmZWN0ID0gY29uZmlnX2xpc3RbaV0uZWZmZWN0O1xuICAgICAgICAgICAgb2JqZWN0Lml0ZW1faWQgPSBjb25maWdfbGlzdFtpXS5pdGVtX2lkO1xuICAgICAgICAgICAgb2JqZWN0Lm9wZW5fZGVzYyA9IGNvbmZpZ19saXN0W2ldLm9wZW5fZGVzYztcbiAgICAgICAgICAgIHZhciB2byA9IHRoaXMubW9kZWwuZ2V0SGFsbG93c0J5SWQoY29uZmlnX2xpc3RbaV0uaWQpO1xuICAgICAgICAgICAgb2JqZWN0LnZvID0gdm87XG4gICAgICAgICAgICB0aGlzLmhhbGxvd3NfbGlzdC5wdXNoKG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5pi+56S65YiX6KGo6YeN5paw5o6S5bqPXG4gICAgICAgIGlmKFV0aWxzLm5leHQodGhpcy5oYWxsb3dzX2xpc3QpKXtcbiAgICAgICAgICAgIHRoaXMuaGFsbG93c19saXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5pZCAtIGIuaWQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgXG4gICAgICAgIHZhciBzZWxlY3RfaW5kZXggPSB0aGlzLmdldERlZmF1bHRIYWxsb3dzSW5kZXgoaGFsbG93c19pZCk7XG4gICAgICAgIHRoaXMuc2VsZWN0SGFsbG93c0luZGV4KHNlbGVjdF9pbmRleCk7XG4gICAgXG4gICAgICAgIGluZGV4ID0gaW5kZXggfHwgSGFsbG93c0NvbnN0LlRhYl9JbmRleC51cGx2XG4gICAgICAgIHRoaXMuY2hhbmdlU2VsZWN0ZWRUYWIoaW5kZXgpO1xuICAgIH0sXG5cbiAgICAvLyDlj5blh7rov5vlhaXnlYzpnaLml7bpu5jorqTpgInkuK3nmoTnpZ7lmahpbmRleFxuICAgIGdldERlZmF1bHRIYWxsb3dzSW5kZXg6ZnVuY3Rpb24oIGhhbGxvd3NfaWQgKXtcbiAgICAgICAgdmFyIHRlbXBfaGFsbG93c19saXN0ID0gVXRpbHMuZGVlcENvcHkodGhpcy5oYWxsb3dzX2xpc3QpO1xuICAgICAgICB2YXIgc2VsZWN0X2luZGV4ID0gMDtcbiAgICAgICAgaWYoaGFsbG93c19pZCl7XG4gICAgICAgICAgICBzZWxlY3RfaW5kZXggPSB0aGlzLmdldEhhbGxvd3NJbmRleEJ5SWQoaGFsbG93c19pZCk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgLy/nrYnnuqfmnIDpq5g+6L+b5bqm5pyA6auYPmlk6LaK6auYXG4gICAgICAgICAgICB2YXIgdGVtcF9oYWxsb3dzID0gW107XG4gICAgICAgICAgICB0ZW1wX2hhbGxvd3NfbGlzdC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGIudm8uc3RlcCAtIGEudm8uc3RlcDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB2YXIgbWF4X3N0ZXAgPSAwO1xuICAgICAgICAgICAgZm9yKHZhciBpIGluIHRlbXBfaGFsbG93c19saXN0KXtcbiAgICAgICAgICAgICAgICBpZihtYXhfc3RlcCA8PSB0ZW1wX2hhbGxvd3NfbGlzdFtpXS52by5zdGVwKXtcbiAgICAgICAgICAgICAgICAgICAgbWF4X3N0ZXAgPSB0ZW1wX2hhbGxvd3NfbGlzdFtpXS52by5zdGVwO1xuICAgICAgICAgICAgICAgICAgICB0ZW1wX2hhbGxvd3MucHVzaCh0ZW1wX2hhbGxvd3NfbGlzdFtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGVtcF9oYWxsb3dzLmxlbmd0aCA9PSAxKXtcbiAgICAgICAgICAgICAgICBzZWxlY3RfaW5kZXggPSB0aGlzLmdldEhhbGxvd3NJbmRleEJ5SWQodGVtcF9oYWxsb3dzWzBdLmlkKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHZhciBtYXhfbHVja3kgPSAwO1xuICAgICAgICAgICAgICAgIHRlbXBfaGFsbG93cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAgYi52by5sdWNreSAtIGEudm8ubHVja3k7XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHZhciB0ZW1wX2hhbGxvd3NfMiA9IFtdO1xuICAgICAgICAgICAgICAgIGZvcih2YXIgaiBpbiB0ZW1wX2hhbGxvd3Mpe1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFsbG93cyA9IHRlbXBfaGFsbG93c1tqXTtcblxuICAgICAgICAgICAgICAgICAgICBpZihoYWxsb3dzLnZvLmx1Y2t5ID49IG1heF9sdWNreSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhfbHVja3kgPSBoYWxsb3dzLnZvLmx1Y2t5XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2hhbGxvd3NfMi5wdXNoKGhhbGxvd3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYodGVtcF9oYWxsb3dzXzIubGVuZ3RoID09IDEpe1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RfaW5kZXggPSB0aGlzLmdldEhhbGxvd3NJbmRleEJ5SWQodGVtcF9oYWxsb3dzXzJbMF0uaWQpO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICB0ZW1wX2hhbGxvd3NfMi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYi5pZCAtIGEuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdF9pbmRleCA9IHRoaXMuZ2V0SGFsbG93c0luZGV4QnlJZCh0ZW1wX2hhbGxvd3NfMlswXS5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWxlY3RfaW5kZXg7XG4gICAgfSxcblxuICAgIC8vIOagueaNruelnuWZqGlk6I635Y+W5a+55bqU55qEaW5kZXhcbiAgICBnZXRIYWxsb3dzSW5kZXhCeUlkOmZ1bmN0aW9uKCBpZCApe1xuICAgICAgICB2YXIgaW5kZXggPSAxOyAgICBcbiAgICAgICAgZm9yKHZhciBpIGluIHRoaXMuaGFsbG93c19saXN0KXtcbiAgICAgICAgICAgIGlmKHRoaXMuaGFsbG93c19saXN0W2ldLmlkICYmIHRoaXMuaGFsbG93c19saXN0W2ldLmlkID09IGlkKXtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH0sXG5cbiAgICAvLyDpgInkuK3mn5DkuIDnpZ7lmahcbiAgICBzZWxlY3RIYWxsb3dzSW5kZXg6ZnVuY3Rpb24oaW5kZXgsIGZvcmNlKXtcbiAgICAgICAgaWYodGhpcy5zZWxlY3RfaW5kZXggPT0gaW5kZXggJiYgIWZvcmNlKXJldHVybjtcbiAgICAgICAgLy/lj6ropoHmmK/mraPluLjliIfmjaIs5bCx57uI5q2i5o6J6Ieq5Yqo6L+b6Zi2XG4gICAgICAgIGlmKCFmb3JjZSl7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZUF1dG9BZHZhbmNlU3RhdHVzKGZhbHNlKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUVmZmVjdCh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0X2luZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuc2VsZWN0X2hhbGxvd3MgPSB0aGlzLmhhbGxvd3NfbGlzdFtpbmRleF07XG4gICAgICAgIGlmKHRoaXMuc2VsZWN0X2hhbGxvd3MgPT0gbnVsbClyZXR1cm47XG4gICAgICAgIHRoaXMucmVzZXRfYnRuLmFjdGl2ZSA9IHRoaXMuY2hlY2tJc1Nob3dSZXNldEJ0bigpO1xuICAgICAgICAvLyDliIfmjaLnpZ7lmajml7bpnIDopoHmuIXmjonnmoTmlbDmja5cbiAgICAgICAgdGhpcy5pc19tYXhfaGFsbG93c19sdiA9IGZhbHNlOyAgICAgIC8vIOelnuWZqOaYr+WQpui+vuWIsOacgOWkp+etiee6p1xuICAgICAgICB0aGlzLmlzX21heF9za2lsbF9sdiA9IGZhbHNlO1x0ICAgICAvLyDmioDog73mmK/lkKbovr7liLDmnIDlpKfnrYnnuqdcbiAgICAgICAgdGhpcy5oYWxsb3dzX3VwbHZfY29zdF9iaWRfMSA9IDA7ICAgIC8vIOmAieS4reeahOelnuWZqOWNh+e6p+aJgOmcgOa2iOiAlzFcbiAgICAgICAgdGhpcy5oYWxsb3dzX3VwbHZfY29zdF9udW1fMSA9IDA7XG4gICAgICAgIHRoaXMuaGFsbG93c191cGx2X2Nvc3RfYmlkXzIgPSAwOyAgICAvLyDpgInkuK3nmoTnpZ7lmajljYfnuqfmiYDpnIDmtojogJcyXG4gICAgICAgIHRoaXMuaGFsbG93c191cGx2X2Nvc3RfbnVtXzIgPSAwO1xuICAgICAgICB0aGlzLnNraWxsX2x2dXBfY29zdF9iaWRfMSA9IDA7ICAgICAgLy8g6YCJ5Lit55qE56We5Zmo5oqA6IO95Y2H57qn5omA6ZyA5raI6ICXMVxuICAgICAgICB0aGlzLnNraWxsX2x2dXBfY29zdF9udW1fMSA9IDA7XG4gICAgICAgIHRoaXMuc2tpbGxfbHZ1cF9jb3N0X2JpZF8yID0gMDsgXHQgLy8g6YCJ5Lit55qE56We5Zmo5oqA6IO95Y2H57qn5omA6ZyA5raI6ICXMlxuICAgICAgICB0aGlzLnNraWxsX2x2dXBfY29zdF9udW1fMiA9IDA7XG5cbiAgICAgICAgdGhpcy51cGRhdGVIYWxsb3dzQmFzZUluZm8oKTtcbiAgICAgICAgdGhpcy51cGRhdGVTa2lsbExpc3QoKTtcbiAgICAgICAgdGhpcy51cGRhdGVIYWxsb3dTdGF0dXNJbmZvKCk7XG4gICAgICAgIHRoaXMudXBkYXRlVGFiUmVkU3RhdHVzKCk7XG5cbiAgICB9LFxuICAgIFxuICAgIGhhbmRsZUVmZmVjdDpmdW5jdGlvbihzdGF0dXMpe1xuICAgICAgICBpZighc3RhdHVzKXtcbiAgICAgICAgICAgIGlmKHRoaXMudXBkYXRlX2VmZl9zayl7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVfZWZmX3NrLnNldFRvU2V0dXBQb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVfZWZmX3NrLmNsZWFyVHJhY2tzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdmFyIGFuaW1hX3BhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgoQ29uZmlnLmVmZmVjdF9kYXRhLmRhdGFfZWZmZWN0X2luZm9bMTg1XSwgXCJhY3Rpb25cIik7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMoYW5pbWFfcGF0aCwgZnVuY3Rpb24oc2tlX2RhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZV9lZmZfc2suc2tlbGV0b25EYXRhID0gc2tlX2RhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVfZWZmX3NrLnNldEFuaW1hdGlvbigwLCBQbGF5ZXJBY3Rpb24uYWN0aW9uLCBmYWxzZSk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5Z+656GA5L+h5oGv5pi+56S65qih5Z6L44CB5ZCN56ew44CB5Z+656GA5bGe5oCn44CB5oqA6IO9562JXG4gICAgdXBkYXRlSGFsbG93c0Jhc2VJbmZvOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuc2VsZWN0X2hhbGxvd3MgPT0gbnVsbClyZXR1cm47XG4gICAgICAgIHZhciBhY3Rpb24gPSBQbGF5ZXJBY3Rpb24uYWN0aW9uXzE7XG4gICAgICAgIGlmKHRoaXMuc2VsZWN0X2hhbGxvd3Mudm8gIT0gbnVsbCl7XG4gICAgICAgICAgICBhY3Rpb24gPSBQbGF5ZXJBY3Rpb24uYWN0aW9uXzI7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5oYWxsb3dzX21vZGVsX2lkICE9IHRoaXMuc2VsZWN0X2hhbGxvd3MuZWZmZWN0KXtcbiAgICAgICAgICAgIHRoaXMuaGFsbG93c19tb2RlbF9pZCA9IHRoaXMuc2VsZWN0X2hhbGxvd3MuZWZmZWN0O1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVFZmZlY3QoZmFsc2UpO1xuICAgICAgICAgICAgaWYodGhpcy5oYWxsb3dzX2VmZl9zayl7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zay5zZXRUb1NldHVwUG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93c19lZmZfc2suY2xlYXJUcmFja3MoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGFuaW1hX3BhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgodGhpcy5oYWxsb3dzX21vZGVsX2lkLCBcImFjdGlvblwiKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFJlcyhhbmltYV9wYXRoLCBmdW5jdGlvbihza2VfZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93c19lZmZfc2suc2tlbGV0b25EYXRhID0gc2tlX2RhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zay5zZXRBbmltYXRpb24oMCwgYWN0aW9uLCB0cnVlKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5zZWxlY3RfaGFsbG93cy52byl7XG4gICAgICAgICAgICB0aGlzLmhhbGxvd3NfZWZmX25vZGUuY29sb3IgPSBuZXcgY2MuQ29sb3IoMjU1LDI1NSwyNTUsMjU1KTtcbiAgICAgICAgICAgIC8vIHNldENoaWxkVW5FbmFibGVkKGZhbHNlLCBzZWxmLmhhbGxvd3NfbW9kZWwpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9ub2RlLmNvbG9yID0gbmV3IGNjLkNvbG9yKDE2OSwxNjksMTY5LDI1NSk7XG4gICAgICAgICAgICAvLyBzZXRDaGlsZFVuRW5hYmxlZCh0cnVlLCBzZWxmLmhhbGxvd3NfbW9kZWwpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIOWfuuehgOWxnuaAp1xuICAgICAgICB2YXIgdm8gPSB0aGlzLnNlbGVjdF9oYWxsb3dzLnZvO1xuICAgICAgICBpZih2byA9PSBudWxsKXJldHVybjtcbiAgICAgICAgLy/lkI3np7BcbiAgICAgICAgdGhpcy5oYWxsb3dzX25hbWUuc3RyaW5nID0gdGhpcy5zZWxlY3RfaGFsbG93cy5uYW1lICsgXCIrXCIgKyB2by5zdGVwO1xuICAgICAgICBcbiAgICAgICAgdmFyIHN0ZXBfY29uZmlnID0gZ2RhdGEoXCJoYWxsb3dzX2RhdGFcIixcImRhdGFfaW5mb1wiLFV0aWxzLmdldE5vcktleSh2by5pZCwgdm8uc3RlcCkpO1xuICAgICAgICB2YXIgbmV4dF9zdGVwX2NvbmZpZyA9IGdkYXRhKFwiaGFsbG93c19kYXRhXCIsXCJkYXRhX2luZm9cIixVdGlscy5nZXROb3JLZXkodm8uaWQsIHZvLnN0ZXArMSkpIHx8IHt9O1xuICAgICAgICBcbiAgICAgICAgLy8g5Z+656GA5bGe5oCnXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmJhc2VfYXR0cl9saXN0KXtcbiAgICAgICAgICAgIHRoaXMuYmFzZV9hdHRyX2xpc3RbaV0uYWN0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGZvcih2YXIgaiBpbiBzdGVwX2NvbmZpZy5hdHRyKXtcbiAgICAgICAgICAgIGlmKGogPiAyKWJyZWFrOy8vVUnlj6rmlK/mjIHmmL7npLrkuKTkuKrmioDog71cbiAgICAgICAgICAgIHZhciBhdHRyX2tleSA9IHN0ZXBfY29uZmlnLmF0dHJbal1bMF07XG4gICAgICAgICAgICB2YXIgYXR0cl92YWwgPSBzdGVwX2NvbmZpZy5hdHRyW2pdWzFdIHx8IDA7XG4gICAgICAgICAgICB2YXIgbmV4dF9hdHRyX3ZhbCA9IDA7XG4gICAgICAgICAgICAvL+WPluWHuuS4i+S4gOe6p+WxnuaAp+WKoOaIkO+8jOiuoeeul+S4tOaXtuWPmOmHj1xuICAgICAgICAgICAgaWYobmV4dF9zdGVwX2NvbmZpZy5hdHRyKXtcbiAgICAgICAgICAgICAgICBmb3IodmFyIGsgaW4gbmV4dF9zdGVwX2NvbmZpZy5hdHRyKXtcbiAgICAgICAgICAgICAgICAgICAgaWYobmV4dF9zdGVwX2NvbmZpZy5hdHRyW2tdWzBdICYmIG5leHRfc3RlcF9jb25maWcuYXR0cltrXVswXSA9PSBhdHRyX2tleSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2F0dHJfdmFsID0gbmV4dF9zdGVwX2NvbmZpZy5hdHRyW2tdWzFdIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYXR0cl9uYW1lID0gQ29uZmlnLmF0dHJfZGF0YS5kYXRhX2tleV90b19uYW1lW2F0dHJfa2V5XTtcbiAgICAgICAgICAgIGlmKGF0dHJfbmFtZSl7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJfdGV4dCA9IHRoaXMuYmFzZV9hdHRyX2xpc3Rbal07XG4gICAgICAgICAgICAgICAgaWYoYXR0cl90ZXh0ID09IG51bGwpe1xuICAgICAgICAgICAgICAgICAgICBhdHRyX3RleHQgPSBVdGlscy5jcmVhdGVSaWNoTGFiZWwoMjQsIG5ldyBjYy5Db2xvcigxMDAsNTAsMzUsMjU1KSwgY2MudjIoMCwgMC41KSwgY2MudjIoMjAsIDIwKSwgMzAsIDM4MClcbiAgICAgICAgICAgICAgICAgICAgYXR0cl90ZXh0Lmhvcml6b250YWxBbGlnbiA9IGNjLm1hY3JvLlRleHRBbGlnbm1lbnQuTEVGVDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJfYmcgPSB0aGlzLmF0dHJfYmdzW3BhcnNlSW50KGopKzFdO1xuICAgICAgICAgICAgICAgICAgICBhdHRyX2JnLmFkZENoaWxkKGF0dHJfdGV4dC5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlX2F0dHJfbGlzdFtqXSA9IGF0dHJfdGV4dFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhdHRyX3RleHQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YXIgaWNvbiA9IFBhdGhUb29sLmdldEF0dHJJY29uQnlTdHIoYXR0cl9rZXkpO1xuICAgICAgICAgICAgICAgIHZhciBhZGRfdmFsdWUgPSAwOzsgLy8g5Li05pe25Y+Y6YePXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYobmV4dF9hdHRyX3ZhbCA+IDApe1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmF0aW9fY29uZmlnID0gQ29uZmlnLmhhbGxvd3NfZGF0YS5kYXRhX2NvbnN0W1widGVtcG9yYXJ5X3JhdGlvXCJdIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmF0aW8gPSByYXRpb19jb25maWcudmFsIHx8IDgwMDtcbiAgICAgICAgICAgIFx0ICAgIGFkZF92YWx1ZSA9IE1hdGgucm91bmQodm8ubHVja3kvc3RlcF9jb25maWcubWF4X2x1Y2t5KihuZXh0X2F0dHJfdmFsLWF0dHJfdmFsKSoocmF0aW8vMTAwMCkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpc19wZXIgPSBQYXJ0bmVyQ2FsY3VsYXRlLmlzU2hvd1BlckJ5U3RyKGF0dHJfa2V5KTtcbiAgICAgICAgICAgICAgICAvL+W9k+WJjeWxnuaAp+WAvD3phY3nva7ooajkuK3nmoTlgLwr5Zyj5Y2w5Yqg5oiQ55qE5YC8XG4gICAgICAgICAgICAgICAgdmFyIHN0b25lX2NvbmZpZyA9IENvbmZpZy5oYWxsb3dzX2RhdGEuZGF0YV9jb25zdFtcInN0b25lX2F0dHJpYnV0ZVwiXTtcbiAgICAgICAgICAgICAgICBpZih2by5zZWFsID4gMCAmJiBzdG9uZV9jb25maWcpe1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RvbmVfdmFsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBrIGluIHN0b25lX2NvbmZpZy52YWwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RvbmVfY29uZmlnLnZhbFtrXVswXSAmJiBzdG9uZV9jb25maWcudmFsW2tdWzBdID09IGF0dHJfa2V5KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9uZV92YWwgPSBzdG9uZV9jb25maWcudmFsW2tdWzFdIHx8IDA7XG4gICAgICAgICAgICBcdFx0XHQgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhdHRyX3ZhbCA9IGF0dHJfdmFsICsgc3RvbmVfdmFsKnZvLnNlYWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKGlzX3Blcil7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJfdmFsID0gKGF0dHJfdmFsLzEwKSArXCIlXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBhdHRyX3N0ciA9IGNjLmpzLmZvcm1hdFN0cihcIjxpbWcgc3JjPSclcycvPiA8Y29sb3I9IzY0MzIyMz4gJXPvvJo8L2M+PGNvbG9yPSM2NDMyMjM+JXM8L2M+XCIsaWNvbiwgYXR0cl9uYW1lLCBhdHRyX3ZhbC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBpZihhZGRfdmFsdWUgPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgaWYoaXNfcGVyKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZF92YWx1ZSA9IChhZGRfdmFsdWUvMTApICsgXCIlXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXR0cl9zdHIgPSBhdHRyX3N0ciArIGNjLmpzLmZvcm1hdFN0cihcIjxjb2xvcj0jMjQ5MDAzPiArJXM8L2M+XCIsIGFkZF92YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXR0cl90ZXh0LnN0cmluZyA9IGF0dHJfc3RyO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHRoaXMubG9hZFJlcyhQYXRoVG9vbC5nZXRDb21tb25JY29tUGF0aChpY29uKSwgKGZ1bmN0aW9uKGF0dHJfdGV4dCxyZXNPYmplY3Qpe1xuICAgICAgICAgICAgICAgICAgICBhdHRyX3RleHQuYWRkU3ByaXRlRnJhbWUocmVzT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMsYXR0cl90ZXh0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy/npZ7lmajmioDog71cbiAgICAgICAgdmFyIGhhbGxvd3Nfc2tpbGwgPSBnZGF0YShcImhhbGxvd3NfZGF0YVwiLFwiZGF0YV9za2lsbF91cFwiLFV0aWxzLmdldE5vcktleSh0aGlzLnNlbGVjdF9oYWxsb3dzLmlkLCB2by5za2lsbF9sZXYpKTtcbiAgICAgICAgaWYoaGFsbG93c19za2lsbCAmJiBoYWxsb3dzX3NraWxsLnNraWxsX2JpZCAhPSAwKXtcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBnZGF0YShcInNraWxsX2RhdGFcIixcImRhdGFfZ2V0X3NraWxsXCIsaGFsbG93c19za2lsbC5za2lsbF9iaWQpO1xuICAgICAgICAgICAgaWYoIWNvbmZpZyB8fCBVdGlscy5uZXh0KGNvbmZpZykgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIXRoaXMuaGFsbG93X3NraWxsX2ljb24pe1xuICAgICAgICAgICAgICAgIHZhciBTa2lsbEl0ZW0gPSByZXF1aXJlKFwic2tpbGxfaXRlbVwiKVxuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93X3NraWxsX2ljb24gICA9IG5ldyBTa2lsbEl0ZW0oKTsvL3RydWUsdHJ1ZSx0cnVlLDAuOVxuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93X3NraWxsX2ljb24uc2V0UGFyZW50KHRoaXMuc2tpbGxfY29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd19za2lsbF9pY29uLnNldFNjYWxlKDAuOSk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dfc2tpbGxfaWNvbi5zZXRMZXZlU3RhdHVzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd19za2lsbF9pY29uLnNldFBvc2l0aW9uKGNjLnYyKDc1LCAyNDUpKSBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaGFsbG93X3NraWxsX2ljb24uc2V0RGF0YShjb25maWcuYmlkKTtcblxuICAgICAgICAgICAgaWYoIXRoaXMuaGFsbG93c19za2lsbF9uYW1lKXtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd3Nfc2tpbGxfbmFtZSA9IFV0aWxzLmNyZWF0ZUxhYmVsKDI0LG5ldyBjYy5Db2xvcigxMzksNzEsMjEsMjU1KSxudWxsLDEzNSwyNjcsXCJcIix0aGlzLnNraWxsX2NvbnRhaW5lciwxLGNjLnYyKDAsMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oYWxsb3dzX3NraWxsX25hbWUuc3RyaW5nID0gY29uZmlnLm5hbWUgKyBcIitcIiArIHZvLnNraWxsX2xldjtcblxuICAgICAgICAgICAgaWYoIXRoaXMuaGFsbG93c19za2lsbF9kZXNjKXtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd3Nfc2tpbGxfZGVzYyA9IFV0aWxzLmNyZWF0ZVJpY2hMYWJlbCgyMixuZXcgY2MuQ29sb3IoMTAwLDUwLDM1LDI1NSksY2MudjIoMCwxKSxjYy52MigxMzUsIDI1MCksMzAsNTUwKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd3Nfc2tpbGxfZGVzYy5ob3Jpem9udGFsQWxpZ24gPSBjYy5tYWNyby5UZXh0QWxpZ25tZW50LkxFRlQ7XG5cdFx0XHQgICAgdGhpcy5za2lsbF9jb250YWluZXIuYWRkQ2hpbGQodGhpcy5oYWxsb3dzX3NraWxsX2Rlc2Mubm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhhbGxvd3Nfc2tpbGxfZGVzYy5zdHJpbmcgPSBjb25maWcuZGVzO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5Yib5bu65oqA6IO95Yqg5oiQXG4gICAgdXBkYXRlU2tpbGxMaXN0OmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuc2VsZWN0X2hhbGxvd3MgPT0gbnVsbClyZXR1cm47XG4gICAgICAgIHZhciB2byA9IHRoaXMuc2VsZWN0X2hhbGxvd3Mudm87XG4gICAgICAgIHZhciBza2lsbF9hdHRyX2NvbmZpZyA9IENvbmZpZy5oYWxsb3dzX2RhdGEuZGF0YV9za2lsbF9hdHRyW3RoaXMuc2VsZWN0X2hhbGxvd3MuaWRdIHx8IHt9O1xuICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5za2lsbF9hdHRyX2xpc3Qpe1xuICAgICAgICAgICAgdGhpcy5za2lsbF9hdHRyX2xpc3RbaV0uYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IodmFyIGogaW4gc2tpbGxfYXR0cl9jb25maWcpe1xuICAgICAgICAgICAgdmFyIGF0dHJfdHh0ID0gdGhpcy5za2lsbF9hdHRyX2xpc3Rbal07XG4gICAgICAgICAgICBpZihhdHRyX3R4dCA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICBhdHRyX3R4dCA9VXRpbHMuY3JlYXRlTGFiZWwoMjAsbmV3IGNjLkNvbG9yKDE1NywxNDEsMTE1LDI1NSksbnVsbCwwLDAsXCJcIix0aGlzLnNraWxsX2JnLDEsY2MudjIoMCwgMC41KSlcblx0XHRcdCAgICB0aGlzLnNraWxsX2F0dHJfbGlzdFtqXSA9IGF0dHJfdHh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXR0cl90eHQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIGF0dHJfdHh0Lm5vZGUuc2V0UG9zaXRpb24oY2MudjIoMjAsIDkwIC0gKGotMSkqMzIpKVxuICAgICAgICAgICAgaWYodm8uc2tpbGxfbGV2ID49IHNraWxsX2F0dHJfY29uZmlnW2pdLmxldl9saW1pdCl7XG4gICAgICAgICAgICAgICAgYXR0cl90eHQubm9kZS5jb2xvciA9IG5ldyBjYy5Db2xvcigyNDcsMTUyLDY4LDI1NSk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBhdHRyX3R4dC5ub2RlLmNvbG9yID0gbmV3IGNjLkNvbG9yKDE1NywxNDEsMTE1LDI1NSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYXR0cl9zdHIgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLmioDog70lZOe6pzolc1wiKSwgc2tpbGxfYXR0cl9jb25maWdbal0ubGV2X2xpbWl0LCBza2lsbF9hdHRyX2NvbmZpZ1tqXS5kZXNjKTtcbiAgICAgICAgICAgIGF0dHJfdHh0LnN0cmluZyA9IGF0dHJfc3RyO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6K6+572u56We5Zmo5Y2H57qn5LiO5oqA6IO954q25oCB5pi+56S6XG4gICAgdXBkYXRlSGFsbG93U3RhdHVzSW5mbzpmdW5jdGlvbigpe1xuICAgICAgICBpZih0aGlzLnNlbGVjdF9oYWxsb3dzID09IG51bGwpcmV0dXJuO1xuICAgICAgICB2YXIgdm8gPSB0aGlzLnNlbGVjdF9oYWxsb3dzLnZvO1xuICAgICAgICBpZih2byA9PSBudWxsKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAvL+elnuWZqOaYr+WQpui+vuWIsOacgOWkp+etiee6p1xuICAgICAgICAgICAgdmFyIG1heF9sZXYgPSBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfbWF4X2xldlt2by5pZF0gfHwgMTAwO1xuICAgICAgICAgICAgaWYodm8uc3RlcCA+PSBtYXhfbGV2KXtcbiAgICAgICAgICAgICAgICB0aGlzLmlzX21heF9oYWxsb3dzX2x2ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwbHZfbGF5b3V0LmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5pc19tYXhfaGFsbG93c19sdiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMudXBsdl9sYXlvdXQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8v5oqA6IO95piv5ZCm6L6+5Yiw5pyA5aSn562J57qnXG4gICAgICAgICAgICB2YXIgbWF4X3NraWxsX2x2ID0gQ29uZmlnLmhhbGxvd3NfZGF0YS5kYXRhX3NraWxsX21heF9sZXZbdm8uaWRdIHx8IDEwO1xuICAgICAgICAgICAgdmFyIHNraWxsX2x2ID0gdm8uc2tpbGxfbGV2O1xuICAgICAgICAgICAgaWYoc2tpbGxfbHYgPj0gbWF4X3NraWxsX2x2KXtcbiAgICAgICAgICAgICAgICB0aGlzLmlzX21heF9za2lsbF9sdiA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbF9sYXlvdXQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICB0aGlzLmlzX21heF9za2lsbF9sdiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpbGxfbGF5b3V0LmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL+abtOaWsOelnuWZqOWNh+e6p+S4juaKgOiDveaYvuekulxuICAgICAgICAgICAgaWYoIXRoaXMuaXNfbWF4X2hhbGxvd3NfbHYpe1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RlcEluZm8oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCF0aGlzLmlzX21heF9za2lsbF9sdil7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTa2lsbEluZm8oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlTWF4THZUaXBzKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5Yi35paw5ruh57qn5o+Q56S66K+tXG4gICAgdXBkYXRlTWF4THZUaXBzOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuY3VyX2luZGV4ID09IEhhbGxvd3NDb25zdC5UYWJfSW5kZXgudXBsdiAmJiB0aGlzLmlzX21heF9oYWxsb3dzX2x2KXtcbiAgICAgICAgICAgIHRoaXMubWF4X2x2X3RpcHMuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLnpZ7lmajlt7Lmu6HnuqdcIik7XG4gICAgICAgICAgICB0aGlzLm1heGx2X2xheW91dC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9ZWxzZSBpZih0aGlzLmN1cl9pbmRleCA9PSBIYWxsb3dzQ29uc3QuVGFiX0luZGV4LnNraWxsICYmIHRoaXMuaXNfbWF4X3NraWxsX2x2KXtcbiAgICAgICAgICAgIHRoaXMubWF4X2x2X3RpcHMuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmioDog73lt7Lmu6HnuqdcIik7XG4gICAgICAgICAgICB0aGlzLm1heGx2X2xheW91dC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRoaXMubWF4bHZfbGF5b3V0LmFjdGl2ZSA9IGZhbHNlOyAgIFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6K6+572u56We5Zmo5Y2H57qn55u45YWz5pi+56S6XG4gICAgdXBkYXRlU3RlcEluZm86ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYodGhpcy5zZWxlY3RfaGFsbG93cyA9PSBudWxsKXJldHVybjtcbiAgICAgICAgdmFyIHZvID0gdGhpcy5zZWxlY3RfaGFsbG93cy52bztcbiAgICAgICAgaWYodm8gPT0gbnVsbClyZXR1cm47XG4gICAgICAgIFxuICAgICAgICB2YXIgc3RlcF9jb25maWcgPSBnZGF0YShcImhhbGxvd3NfZGF0YVwiLFwiZGF0YV9pbmZvXCIsVXRpbHMuZ2V0Tm9yS2V5KHZvLmlkLCB2by5zdGVwKSk7XG4gICAgICAgIGlmKHN0ZXBfY29uZmlnKXtcbiAgICAgICAgICAgIC8v6L+b5bqm5p2hXG4gICAgICAgICAgICB0aGlzLnN0ZXBfcHJvZ3Jlc3NfdmFsdWUuc3RyaW5nID0gdm8ubHVja3krXCIvXCIrc3RlcF9jb25maWcubWF4X2x1Y2t5XG4gICAgICAgICAgICB0aGlzLnN0ZXBfcHJvZ3Jlc3MucHJvZ3Jlc3MgPSB2by5sdWNreS9zdGVwX2NvbmZpZy5tYXhfbHVja3k7XG5cbiAgICAgICAgICAgIC8vIOelnuWZqOWNh+e6p+a2iOiAl1xuXHRcdCAgICB2YXIgZXhwZW5kXzEgPSBzdGVwX2NvbmZpZy5sb3NzWzBdO1xuICAgICAgICAgICAgdmFyIGV4cGVuZF8yID0gc3RlcF9jb25maWcubG9zc1sxXTtcbiAgICAgICAgICAgIGlmKGV4cGVuZF8xKXtcbiAgICAgICAgICAgICAgICB2YXIgYmlkID0gZXhwZW5kXzFbMF07XG4gICAgICAgICAgICAgICAgdmFyIG51bSA9IGV4cGVuZF8xWzFdO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93c191cGx2X2Nvc3RfYmlkXzEgPSBiaWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX3VwbHZfY29zdF9udW1fMSA9IG51bTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvc3REYXRhVG9Ob2RlKHRoaXMubHZ1cF9jb3N0X3Jlc18xLCB0aGlzLmx2dXBfY29zdF9sYWJlbF8xLCBiaWQsIG51bSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihleHBlbmRfMil7XG4gICAgICAgICAgICAgICAgdmFyIGJpZCA9IGV4cGVuZF8yWzBdO1xuICAgICAgICAgICAgICAgIHZhciBudW0gPSBleHBlbmRfMlsxXTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd3NfdXBsdl9jb3N0X2JpZF8yID0gYmlkO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93c191cGx2X2Nvc3RfbnVtXzIgPSBudW07XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDb3N0RGF0YVRvTm9kZSh0aGlzLmx2dXBfY29zdF9yZXNfMiwgdGhpcy5sdnVwX2Nvc3RfbGFiZWxfMiwgYmlkLCBudW0pIDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmm7TmlrDnpZ7lmajmioDog73nm7jlhbPmmL7npLpcbiAgICB1cGRhdGVTa2lsbEluZm86ZnVuY3Rpb24oICApe1xuICAgICAgICBpZih0aGlzLnNlbGVjdF9oYWxsb3dzID09IG51bGwpcmV0dXJuO1xuICAgICAgICB2YXIgdm8gPSB0aGlzLnNlbGVjdF9oYWxsb3dzLnZvO1xuICAgICAgICBpZih2byA9PSBudWxsKXJldHVybjtcbiAgICAgICAgXG4gICAgICAgIHZhciBoYWxsb3dzX3NraWxsID0gZ2RhdGEoXCJoYWxsb3dzX2RhdGFcIixcImRhdGFfc2tpbGxfdXBcIixVdGlscy5nZXROb3JLZXkodGhpcy5zZWxlY3RfaGFsbG93cy5pZCwgdm8uc2tpbGxfbGV2KSk7XG4gICAgICAgIGlmKGhhbGxvd3Nfc2tpbGwgJiYgaGFsbG93c19za2lsbC5za2lsbF9iaWQgIT0gMCl7XG4gICAgICAgICAgICAvL+WNh+e6p+a2iOiAl1xuICAgICAgICAgICAgaWYoaGFsbG93c19za2lsbC5sZXZfbGltaXQgPiB2by5zdGVwKXtcbiAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2x2dXBfdGlwcy5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLnpZ7lmaglZOe6p+WPr+e7p+e7reWNh+e6p1wiKSwgaGFsbG93c19za2lsbC5sZXZfbGltaXQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpbGxfbHZ1cF90aXBzLm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2Nvc3RfYmdfMS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2Nvc3RfYmdfMi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2x2dXBfYnRuLmVuYWJsZUF1dG9HcmF5RWZmZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2x2dXBfYnRuLmludGVyYWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuc2tpbGxfbHZ1cF9idG5fbGluZS53aWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbF9sdnVwX2J0bl9saW5lLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpbGxfbHZ1cF9idG4uZW5hYmxlQXV0b0dyYXlFZmZlY3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2x2dXBfYnRuLmludGVyYWN0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5za2lsbF9sdnVwX2J0bl9saW5lLndpZHRoID0gMjtcbiAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2x2dXBfYnRuX2xpbmUuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbF9sdnVwX3RpcHMubm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2Nvc3RfYmdfMS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpbGxfY29zdF9iZ18yLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGV4cGVuZF8xID0gaGFsbG93c19za2lsbC5sb3NlWzBdO1xuICAgICAgICAgICAgICAgIHZhciBleHBlbmRfMiA9IGhhbGxvd3Nfc2tpbGwubG9zZVsxXTtcbiAgICAgICAgICAgICAgICBpZihleHBlbmRfMSl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBiaWQgPSBleHBlbmRfMVswXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG51bSA9IGV4cGVuZF8xWzFdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2x2dXBfY29zdF9iaWRfMSA9IGJpZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lsbF9sdnVwX2Nvc3RfbnVtXzEgPSBudW07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29zdERhdGFUb05vZGUodGhpcy5za2lsbF9yZXNfaWNvbl8xLCB0aGlzLnNraWxsX2Nvc3RfbGFiZWxfMSwgYmlkLCBudW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZihleHBlbmRfMil7XG4gICAgICAgICAgICAgICAgICAgIHZhciBiaWQgPSBleHBlbmRfMlswXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG51bSA9IGV4cGVuZF8yWzFdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2x2dXBfY29zdF9iaWRfMiA9IGJpZFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2x2dXBfY29zdF9udW1fMiA9IG51bVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENvc3REYXRhVG9Ob2RlKHRoaXMuc2tpbGxfcmVzX2ljb25fMiwgdGhpcy5za2lsbF9jb3N0X2xhYmVsXzIsIGJpZCwgbnVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5pu05pawdGFi5oyJ6ZKu57qi54K55pi+56S6XG4gICAgdXBkYXRlVGFiUmVkU3RhdHVzOmZ1bmN0aW9uKCAgKXtcbiAgICAgICAgaWYodGhpcy5zZWxlY3RfaGFsbG93cyA9PSBudWxsKXJldHVybjtcbiAgICAgICAgdmFyIHJlZF9oYWxsb3dzX2lkID0gdGhpcy5tb2RlbC5nZXRSZWRIYWxsb3dzSWQoKTtcbiAgICAgICAgaWYocmVkX2hhbGxvd3NfaWQgJiYgcmVkX2hhbGxvd3NfaWQgPT0gdGhpcy5zZWxlY3RfaGFsbG93cy5pZCl7XG4gICAgICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy50YWJfbGlzdCl7XG4gICAgICAgICAgICAgICAgdmFyIHRhYl9vYmplY3QgPSB0aGlzLnRhYl9saXN0W2ldO1xuICAgICAgICAgICAgICAgIGlmKHRhYl9vYmplY3QudGlwcyAmJiB0YWJfb2JqZWN0LmluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZF9zdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYodGFiX29iamVjdC5pbmRleCA9PSBIYWxsb3dzQ29uc3QuVGFiX0luZGV4LnVwbHYpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkX3N0YXR1cyA9IHRoaXMubW9kZWwuY2hlY2tSZWRJc1Nob3dCeVJlZFR5cGUoSGFsbG93c0NvbnN0LlJlZF9JbmRleC5oYWxsb3dzX2x2dXApO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0YWJfb2JqZWN0LmluZGV4ID09IEhhbGxvd3NDb25zdC5UYWJfSW5kZXguc2tpbGwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkX3N0YXR1cyA9IHRoaXMubW9kZWwuY2hlY2tSZWRJc1Nob3dCeVJlZFR5cGUoSGFsbG93c0NvbnN0LlJlZF9JbmRleC5za2lsbF9sdnVwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0YWJfb2JqZWN0LnRpcHMuYWN0aXZlID0gcmVkX3N0YXR1cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLnRyYWNlX2J0bl90aXBzKXtcbiAgICAgICAgICAgICAgICB2YXIgdHJhY2VfcmVkID0gdGhpcy5tb2RlbC5jaGVja1JlZElzU2hvd0J5UmVkVHlwZShIYWxsb3dzQ29uc3QuUmVkX0luZGV4LnN0b25lX3VzZSk7XG5cdFx0XHQgICAgdGhpcy50cmFjZV9idG5fdGlwcy5hY3RpdmUgPSB0cmFjZV9yZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgZm9yKHZhciBqIGluIHRoaXMudGFiX2xpc3Qpe1xuICAgICAgICAgICAgICAgIHZhciB0YWJfb2JqZWN0ID0gdGhpcy50YWJfbGlzdFtqXTtcbiAgICAgICAgICAgICAgICBpZih0YWJfb2JqZWN0LnRpcHMpe1xuICAgICAgICAgICAgICAgICAgICB0YWJfb2JqZWN0LnRpcHMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZih0aGlzLnRyYWNlX2J0bl90aXBzKXtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNlX2J0bl90aXBzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaYvuekuua2iOiAl+aVsOaNrlxuICAgIHNldENvc3REYXRhVG9Ob2RlOmZ1bmN0aW9uKCBpdGVtX2ljb24sIGl0ZW1fbGFiZWwsIGl0ZW1fYmlkLCBpdGVtX251bSApe1xuICAgICAgICB2YXIgaXRlbV9jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGl0ZW1fYmlkKTtcbiAgICAgICAgaWYoaXRlbV9jb25maWcpe1xuICAgICAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldEl0ZW1SZXMoaXRlbV9jb25maWcuaWNvbilcbiAgICAgICAgICAgIHRoaXMubG9hZFJlcyhyZXMsIGZ1bmN0aW9uIChpdGVtX2ljb24sc2Zfb2JqKSB7XG4gICAgICAgICAgICAgICAgaXRlbV9pY29uLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMsaXRlbV9pY29uKSk7XG5cbiAgICAgICAgICAgIHZhciBjb3VudCA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0SXRlbU51bUJ5QmlkKGl0ZW1fYmlkKTtcbiAgICAgICAgICAgIGl0ZW1fbGFiZWwuc3RyaW5nID0gY2MuanMuZm9ybWF0U3RyKFwiJXMvJXNcIiwgVXRpbHMuZ2V0TW9uZXlTdHJpbmcoY291bnQsIGZhbHNlKSwgVXRpbHMuZ2V0TW9uZXlTdHJpbmcoaXRlbV9udW0sIGZhbHNlKSk7XG4gICAgICAgICAgICBpZihjb3VudCA8IGl0ZW1fbnVtKXtcbiAgICAgICAgICAgICAgICBpdGVtX2xhYmVsLm5vZGUuY29sb3IgPSBuZXcgY2MuQ29sb3IoMjU1LCA5MywgOTMsMjU1KTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGl0ZW1fbGFiZWwubm9kZS5jb2xvciA9IG5ldyBjYy5Db2xvcigyNTUsIDI0NiwgMjI4LDI1NSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/mtojogJfnianlk4HnmoTmlbDph4/mm7TmlrBcbiAgICBjaGVja05lZWRVcGRhdGVJdGVtTnVtOmZ1bmN0aW9uKGl0ZW1fbGlzdCl7XG4gICAgICAgIGlmKGl0ZW1fbGlzdCA9PSBudWxsIHx8IFV0aWxzLm5leHQoaXRlbV9saXN0KSA9PSBudWxsKXJldHVybjtcbiAgICAgICAgZm9yKHZhciBpIGluIGl0ZW1fbGlzdCl7XG4gICAgICAgICAgICB2YXIgdm8gPSBpdGVtX2xpc3RbaV07XG4gICAgICAgICAgICBpZih2by5jb25maWcpe1xuICAgICAgICAgICAgICAgIHZhciBiaWQgPSB2by5jb25maWcuaWQ7XG4gICAgICAgICAgICAgICAgaWYoYmlkID09IHRoaXMuaGFsbG93c191cGx2X2Nvc3RfYmlkXzEpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENvc3REYXRhVG9Ob2RlKHRoaXMubHZ1cF9jb3N0X3Jlc18xLCB0aGlzLmx2dXBfY29zdF9sYWJlbF8xLCBiaWQsIHRoaXMuaGFsbG93c191cGx2X2Nvc3RfbnVtXzEpXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoYmlkID09IHRoaXMuaGFsbG93c191cGx2X2Nvc3RfYmlkXzIpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENvc3REYXRhVG9Ob2RlKHRoaXMubHZ1cF9jb3N0X3Jlc18yLCB0aGlzLmx2dXBfY29zdF9sYWJlbF8yLCBiaWQsIHRoaXMuaGFsbG93c191cGx2X2Nvc3RfbnVtXzIpXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoYmlkID09IHRoaXMuc2tpbGxfbHZ1cF9jb3N0X2JpZF8xKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDb3N0RGF0YVRvTm9kZSh0aGlzLnNraWxsX3Jlc19pY29uXzEsIHRoaXMuc2tpbGxfY29zdF9sYWJlbF8xLCBiaWQsIHRoaXMuc2tpbGxfbHZ1cF9jb3N0X251bV8xKVxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKGJpZCA9PSB0aGlzLnNraWxsX2x2dXBfY29zdF9iaWRfMil7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29zdERhdGFUb05vZGUodGhpcy5za2lsbF9yZXNfaWNvbl8yLCB0aGlzLnNraWxsX2Nvc3RfbGFiZWxfMiwgYmlkLCB0aGlzLnNraWxsX2x2dXBfY29zdF9udW1fMilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/lnKPlmajmm7TmlrDlpITnkIZcbiAgICBoYW5kbGVVcGRhdGVFdmVudDpmdW5jdGlvbihpZCl7XG4gICAgICAgIGlmKGlkICYmIHRoaXMuc2VsZWN0X2hhbGxvd3MgJiYgaWQgPT0gdGhpcy5zZWxlY3RfaGFsbG93cy5pZCl7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEhhbGxvd3NJbmRleCh0aGlzLnNlbGVjdF9pbmRleCwgdHJ1ZSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmmK/lkKbmmL7npLrph43pk7jmjInpkq5cbiAgICBjaGVja0lzU2hvd1Jlc2V0QnRuOmZ1bmN0aW9uKCAgKXtcbiAgICAgICAgdmFyIGlzX3Nob3cgPSBmYWxzZTtcbiAgICAgICAgaWYodGhpcy5zZWxlY3RfaGFsbG93cyA9PSBudWxsKXtcbiAgICAgICAgICAgIHJldHVybiBpc19zaG93O1xuICAgICAgICB9XG4gICAgICAgIHZhciB2byA9IHRoaXMuc2VsZWN0X2hhbGxvd3Mudm87XG4gICAgICAgIGlmKHZvID09IG51bGwpe1xuICAgICAgICAgICAgcmV0dXJuIGlzX3Nob3c7XG4gICAgICAgIH1cbiAgICAgICAgaWYodm8uc3RlcCA+IDEgfHwgdm8uc2VhbCA+IDAgfHwgdm8uc2tpbGxfbGV2ID4gMSl7XG4gICAgICAgICAgICBpc19zaG93ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNfc2hvdztcbiAgICB9LFxuXG4gICAgLy/oh6rliqjov5vpmLbmmL7npLrnirbmgIFcbiAgICBjaGFuZ2VBdXRvQWR2YW5jZVN0YXR1czpmdW5jdGlvbihpc19pbl9hZHZhbmNlKXtcbiAgICAgICAgaWYoaXNfaW5fYWR2YW5jZSA9PSB0aGlzLmlzX2luX2FkdmFuY2UpcmV0dXJuO1xuICAgICAgICB0aGlzLmlzX2luX2FkdmFuY2UgPSAgaXNfaW5fYWR2YW5jZTtcbiAgICAgICAgaWYodGhpcy5pc19pbl9hZHZhbmNlKXtcbiAgICAgICAgICAgIHRoaXMuc3RlcF9hdXRvX2FkdmFuY2VkX2J0bl9sYWJlbC5zdHJpbmcgPSBVdGlscy5USTE4TihcIuWBnOatolwiKTtcbiAgICAgICAgICAgIGlmKHRoaXMuYXV0b190aW1lX3RpY2tldCA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9fdGltZV90aWNrZXQgPSBnY29yZS5UaW1lci5zZXQoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5pc19pbl9hZHZhbmNlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybC5yZXF1ZXN0SGFsbG93c0FkdmFuY2UodGhpcy5zZWxlY3RfaGFsbG93cy5pZCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSwgNTAwLC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQXV0b1RpbWV0aWNrZXQoKTtcbiAgICAgICAgICAgIHRoaXMuc3RlcF9hdXRvX2FkdmFuY2VkX2J0bl9sYWJlbC5zdHJpbmcgPSBVdGlscy5USTE4TihcIuS4gOmUruWNh+e6p1wiKTsgICBcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjbGVhckF1dG9UaW1ldGlja2V0OmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuYXV0b190aW1lX3RpY2tldCl7XG4gICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy5hdXRvX3RpbWVfdGlja2V0KTtcbiAgICAgICAgICAgIHRoaXMuYXV0b190aW1lX3RpY2tldCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5YWz6Zet56qX5L2T5Zue6LCDLOmcgOimgeWcqOi/memHjOiwg+eUqOivpeeql+S9k+aJgOWxnmNvbnRyb2xsZXLnmoRjbG9zZeaWueazleayoeeUqOS6jue9ruepuuivpeeql+S9k+WunuS+i+WvueixoVxuICAgIGNsb3NlQ2FsbEJhY2s6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5jbGVhckF1dG9UaW1ldGlja2V0KCk7XG4gICAgICAgIHRoaXMuaGFuZGxlRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgaWYodGhpcy5oYWxsb3dfc2tpbGxfaWNvbil7XG4gICAgICAgICAgICB0aGlzLmhhbGxvd19za2lsbF9pY29uLmRlbGV0ZU1lKCk7XG4gICAgICAgICAgICB0aGlzLmhhbGxvd19za2lsbF9pY29uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMuaGFsbG93c19lZmZfc2spe1xuICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zay5zZXRUb1NldHVwUG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zay5jbGVhclRyYWNrcygpO1xuICAgICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN0cmwub3BlbkhhbGxvd3NNYWluV2luZG93KGZhbHNlKTtcbiAgICB9LFxufSkiXX0=
|