(function() {
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
var __module = nodeEnv ? module : {exports:{}};
var __filename = 'preview-scripts/assets/Scripts/mod/mall/view/mall_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, 'ddd5fLQNQdDErBfpTr0feoT', 'mall_window');
// Scripts/mod/mall/view/mall_window.js
"use strict";
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
// 用户输入框
//
Create: new Date().toISOString()
// --------------------------------------------------------------------
var PathTool = require("pathtool");
var MallController = require("mall_controller");
var RoleController = require("role_controller");
var CommonScrollView = require("common_scrollview");
var MallEvent = require("mall_event");
var MallConst = require("mall_const");
var MallItem = require("mall_item");
var TimeTool = require("timetool");
var BackpackController = require("backpack_controller");
var BackpackEvent = require("backpack_event");
var BackPackConst = require("backpack_const");
var CommonAlert = require("commonalert");
var MailWindow = cc.Class({
"extends": CommonWindowTab,
ctor: function ctor() {
this.model = MallController.getInstance().getModel();
this.ctrl = MallController.getInstance();
this.win_type = WinType.Full;
this.viewTag = SCENE_TAG.ui; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
this.tab_info_list = [{
label: gdata("exchange_data", "data_shop_list", 1).name,
index: 1,
status: true,
notice: cc.js.formatStr("%s级开启", gdata("exchange_data", "data_shop_exchage_cost", "open_gold_lev").val),
is_first: true
}, {
label: gdata("exchange_data", "data_shop_list", 2).name,
index: 2,
status: true,
notice: cc.js.formatStr("%s级开启", gdata("exchange_data", "data_shop_exchage_cost", "open_hero_soul_lev").val),
is_first: true
}, {
label: gdata("exchange_data", "data_shop_list", 3).name,
index: 3,
status: true,
notice: cc.js.formatStr("%s级开启", gdata("exchange_data", "data_shop_exchage_cost", "open_point_lev").val),
is_first: true
}, {
label: gdata("exchange_data", "data_shop_list", MallConst.MallType.SkillShop).name,
index: 4,
status: true,
notice: cc.js.formatStr("%s级开启", gdata("exchange_data", "data_shop_exchage_cost", "open_skill_lev").val),
is_first: true
}];
this.title_str = "商城";
this.tab_list = this.tab_info_list;
this.cur_tab = null;
this.cur_index = null;
this.first_index = null;
this.data_list = {};
this.role_vo = RoleController.getInstance().getRoleVo();
},
initPanel: function initPanel() {
if (this.mall_root_wnd == null) {
this.loadRes(PathTool.getPrefabPath("mall", "mall_window_2"), function (res_obj) {
var obj = res_obj;
this.createMallRootWnd(obj);
}.bind(this));
}
},
createMallRootWnd: function createMallRootWnd(view) {
this.mall_root_wnd = view;
this.mall_root_wnd.setParent(this.container);
this.mall_container = this.mall_root_wnd.getChildByName("container");
this.mall_scroll_con = this.mall_container.getChildByName("scrollCon");
this.btn = this.mall_container.getChildByName("btn");
this.btn.active = false;
this.btn_label = this.seekChild(this.btn, "Label", cc.Label);
this.btn_img = this.seekChild(this.btn, "img", cc.Sprite);
this.coin = this.mall_container.getChildByName("coin").getComponent(cc.Sprite);
this.count = this.mall_container.getChildByName("count").getComponent(cc.Label);
this.add_btn = this.mall_container.getChildByName("add_btn");
this.time_rt = this.mall_container.getChildByName("time").getComponent(cc.RichText);
this.time_down_text_rt = this.mall_container.getChildByName("time_down_text").getComponent(cc.RichText);
this.add_btn.active = false;
this.refresh_count = this.mall_container.getChildByName("refresh_count").getComponent(cc.Label);
this.tips_btn = this.mall_container.getChildByName("tips_btn");
this.tips_btn.active = false;
this.good_cons = this.mall_container.getChildByName("good_cons");
var scroll_view_size = cc.size(622, 705);
var setting = {
item_class: MallItem,
// 单元类
start_x: 4,
// 第一个单元的X起点
space_x: 0,
// x方向的间隔
start_y: 3,
// 第一个单元的Y起点
space_y: 2,
// y方向的间隔
item_width: 306,
// 单元的尺寸width
item_height: 143,
// 单元的尺寸height
row: 0,
// 行数,作用于水平滚动类型
col: 2,
// 列数,作用于垂直滚动类型
need_dynamic: true
};
this.item_scrollview = new CommonScrollView();
this.item_scrollview.createScroll(this.mall_scroll_con, cc.v2(0, 0), ScrollViewDir.vertical, ScrollViewStartPos.top, scroll_view_size, setting, cc.v2(0.5, 0.5));
this.selectedTabCallBack(this.first_index);
this.registerEvent_1();
},
registerEvent_1: function registerEvent_1() {
if (this.add_btn) {
this.add_btn.on(cc.Node.EventType.TOUCH_END, function () {
var item_bid = gdata("exchange_data", "data_shop_list", [this.cur_index]).item_bid;
var data = Utils.getItemConfig(item_bid);
require("backpack_controller").getInstance().openTipsSource(true, data);
}, this);
}
if (this.btn) {
this.btn.on(cc.Node.EventType.TOUCH_END, function () {
if (this.cur_index == 4 || this.cur_index == 2) {
var type = this.cur_index;
var fun = function () {
this.ctrl.sender13405(type);
}.bind(this);
if (this.cur_index == 4) {
type = MallConst.MallType.SkillShop;
fun();
} else {
var asset_cfg = Config.exchange_data.data_shop_exchage_cost["soul_reset_cost"];
var bid, num;
if (asset_cfg) {
bid = asset_cfg.val[0][0];
num = asset_cfg.val[0][1];
}
var good_res_path = Utils.getItemConfig(bid).icon;
var frame_arrays = [];
var good_path = PathTool.getIconPath("item", good_res_path);
frame_arrays.push(good_path);
var text = StringUtil.parseStr("是否消耗
%s
进行重置?").string;
var str = cc.js.formatStr(text, good_res_path, num);
CommonAlert.show(str, Utils.TI18N("确定"), fun.bind(this), Utils.TI18N("取消"), null, null, null, {
resArr: frame_arrays
});
}
}
}, this);
} //获取商品已购买次数(限于购买过的有限购的商品)
this.addGlobalEvent(MallEvent.Open_View_Event, function (data) {
if (this.cur_index != 4 && this.cur_index != 2) {
this.cur_tab.is_first = false;
var list = this.getConfig(this.cur_index, data);
this.data_list[this.cur_index] = Utils.deepCopy(list);
this.item_scrollview.setData(list, function (cell) {
this.ctrl.openMallBuyWindow(true, cell);
});
}
}.bind(this)); //获取神秘商店物品列表
this.addGlobalEvent(MallEvent.Get_Buy_list, function (data) {
if (this.cur_index == 4 || this.cur_index == 2) {
this.cur_tab.is_first = false;
var btn_str = Utils.TI18N("免费刷新");
if (this.cur_index == 2) {
//神格
if (data.free_count <= 0) {
var asset_cfg = gdata("exchange_data", "data_shop_exchage_cost", "soul_reset_cost");
if (asset_cfg) {
var bid = asset_cfg.val[0][0];
var num = asset_cfg.val[0][1];
btn_str = cc.js.formatStr(Utils.TI18N("%s重置"), num);
this.loadRes(PathTool.getItemRes(Utils.getItemConfig(bid).icon), function (res_object) {
this.btn_img.spriteFrame = res_object;
}.bind(this));
}
}
}
this.btn_label.string = btn_str;
this.setResetCount(data);
for (var k in data.item_list) {
var v = data.item_list[k];
if (this.cur_index == 4) {
v.shop_type = MallConst.MallType.SkillShop;
} else {
v.shop_type = this.cur_index;
}
}
this.data_list[this.cur_index] = Utils.deepCopy(data);
if (this.cur_index == 4) {
this.setLessTime(this.data_list[this.cur_index].refresh_time - gcore.SmartSocket.getTime());
}
this.item_scrollview.setData(this.data_list[this.cur_index].item_list, function (cell) {
this.ctrl.openMallBuyWindow(true, cell);
}.bind(this));
}
}.bind(this));
if (this.role_vo) {
if (this.role_update_lev_event == null) {
this.role_update_lev_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) {
if (this.cur_index == null || this.cur_index == MallConst.MallType.ScoreShop) return;
if (key == "lev") {
for (var k in this.tab_list) {
this.setTabBtnTouchStatus(this.checkBtnIsOpen(k), k);
}
} else if (key == "gold" || key == "arena_cent" || key == "guild" || key == "hero_soul" || key == "friend_point" || key == "red_gold") {
var config = gdata("exchange_data", "data_shop_list", [this.cur_index]);
if (config) {
var item_bid = config.item_bid;
if (item_bid == 15) {
//钻石
this.count.string = Utils.getMoneyString(this.role_vo.gold);
} else {
if (gdata("item_data", "data_assets_id2label", [item_bid]) == key) this.count.string = Utils.getMoneyString(this.role_vo[gdata("item_data", "data_assets_id2label", [item_bid])]);
}
} // var item_res_path = PathTool.getItemRes(Utils.getItemConfig(item_bid).icon);
// if (item_res_path) {
// this.loadRes(item_res_path, function (res_object) {
// this.coin.spriteFrame = res_object;
// }.bind(this))
// }
}
}, this);
}
} //到时候刷新了
this.addGlobalEvent(MallEvent.Frash_tips_event, function () {
if (this.cur_index == 4 || this.cur_index == 2) {
var _type = this.cur_index;
if (this.cur_index == 4) {
_type = MallConst.MallType.SkillShop;
}
this.ctrl.sender13403(_type);
}
}.bind(this)); //除神秘神格商城以外的购买成功
this.addGlobalEvent(MallEvent.Buy_Success_Event, function (data) {
if (this.cur_index == null || this.data_list == null || this.data_list[this.cur_index] == null) return;
if (this.cur_index != 2 || this.cur_index != 4) {
for (var k in this.data_list[this.cur_index]) {
var v = this.data_list[this.cur_index][k];
if (v.id == data.eid && Utils.next(data.ext || {}) != null) {
v.has_buy = data.ext[0].val;
}
}
}
}.bind(this)); //神秘/神格商城购买成功
this.addGlobalEvent(MallEvent.Buy_One_Success, function (data) {
if (this.cur_index == null || this.data_list == null || this.data_list[this.cur_index] == null) return;
var _shop_type = this.cur_index;
if (this.cur_index == 4) {
_shop_type = MallConst.MallType.SkillShop;
}
for (var k in this.data_list[this.cur_index].item_list) {
var v = this.data_list[this.cur_index].item_list[k];
if (v.shop_type == _shop_type && v.order && data.order == v.order) v.has_buy = 1;
}
}.bind(this));
this.addGlobalEvent(BackpackEvent.DELETE_GOODS, function (bag_code, temp_list) {
if (bag_code != BackPackConst.Bag_Code.EQUIPS) {
var item_bid = Config.exchange_data.data_shop_list[MallConst.MallType.SkillShop].item_bid;
for (var i in temp_list) {
var item = temp_list[i];
if (item.base_id == item_bid) {
this.updateIconInfo(item_bid);
break;
}
}
}
}.bind(this));
this.addGlobalEvent(BackpackEvent.MODIFY_GOODS_NUM, function (bag_code, temp_list) {
if (bag_code != BackPackConst.Bag_Code.EQUIPS) {
var item_bid = Config.exchange_data.data_shop_list[MallConst.MallType.SkillShop].item_bid;
for (var i in temp_list) {
var item = temp_list[i];
if (item.base_id == item_bid) {
this.updateIconInfo(item_bid);
break;
}
}
}
}.bind(this));
this.addGlobalEvent(BackpackEvent.ADD_GOODS, function (bag_code, temp_list) {
if (bag_code != BackPackConst.Bag_Code.EQUIPS) {
var item_bid = Config.exchange_data.data_shop_list[MallConst.MallType.SkillShop].item_bid;
for (var i in temp_list) {
var item = temp_list[i];
if (item.base_id == item_bid) {
this.updateIconInfo(item_bid);
break;
}
}
}
}.bind(this));
this.tips_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
var str = "";
if (this.cur_index == 2) {
var cfg = gdata("exchange_data", "data_shop_exchage_cost", "hero_soul_instruction");
if (cfg && cfg.desc) str = cfg.desc;
} else if (this.cur_index == 4) {
var cfg = gdata("exchange_data", "data_shop_exchage_cost", "secret_instruction");
if (cfg && cfg.desc) str = cfg.desc;
}
Utils.playButtonSound(1);
var pos = event.touch.getLocation();
require("tips_controller").getInstance().showCommonTips(str, pos);
}, this);
},
setLessTime: function setLessTime(less_time) {
var self = this;
if (!self.time_rt) return;
if (this.time_tichet) {
gcore.Timer.del(this.time_tichet);
this.time_tichet = null;
}
this.time_rt.node.active = true;
this.time_down_text_rt.node.active = true;
if (less_time > 0) {
self.setTimeFormatString(less_time);
if (this.time_tichet == null) {
this.time_tichet = gcore.Timer.set(function () {
less_time--;
if (less_time < 0) {
gcore.Timer.del(this.time_tichet);
this.time_tichet = null;
if (self.cur_index == 4) {
self.ctrl.sender13403(MallConst.MallType.SkillShop);
}
} else {
this.setTimeFormatString(less_time);
}
}.bind(this), 1000, -1);
}
} else {
self.setTimeFormatString(less_time);
}
},
setTimeFormatString: function setTimeFormatString(time) {
if (time > 0) {
this.time_rt.string = "免费刷新: " + TimeTool.getTimeFormat(time) + "";
} else {
this.time_rt.string = "免费刷新: 00:00:00";
}
},
updateIconInfo: function updateIconInfo(item_bid) {
if (item_bid == gdata("item_data", "data_assets_label2id", "gold")) {
this.count.string = Utils.getMoneyString(this.role_vo.gold);
} else {
this.count.string = Utils.getMoneyString(BackpackController.getInstance().getModel().getItemNumByBid(item_bid));
}
},
openRootWnd: function openRootWnd(index) {
index = index || 1;
var sub_index = index;
if (index == MallConst.MallType.SkillShop) {
sub_index = 4;
} else if (index > 4) {
var subtype = gdata("exchange_data", "data_shop_list", [3]).subtype;
if (subtype.indexOf(index) != -1) {
sub_index = 3;
}
} else if (index == MallConst.MallType.ScoreShop) {
index = 8;
} //first_index 为选中 //所在类型
this.first_index = sub_index;
this.sub_type = index;
this.ctrl.setFirstLogin(false);
this.setSelecteTab(sub_index);
},
closeCallBack: function closeCallBack() {
this.ctrl.openMallPanel(false);
if (this.item_scrollview) {
this.item_scrollview.DeleteMe();
this.item_scrollview = null;
}
if (this.son_panel) {
this.son_panel.deleteMe();
}
if (this.role_update_lev_event) {
this.role_vo.unbind(this.role_update_lev_event);
this.role_update_lev_event = null;
}
if (this.time_tichet) {
gcore.Timer.del(this.time_tichet);
this.time_tichet = null;
}
this.role_vo = null;
this.son_panel = null;
var ActionController = require("action_controller");
if (ActionController.getInstance().getTreasureView()) {
ActionController.getInstance().getTreasureView().setVisible(true);
}
},
//切换标签
selectedTabCallBack: function selectedTabCallBack(index) {
if (this.cur_index == index) return;
if (this.mall_root_wnd == null) return;
this.first_index = index;
var type;
if (index == 3) {
if (this.sub_type) {
type = this.sub_type;
this.sub_type = null;
} else {
type = gdata("exchange_data", "data_shop_list", [index]).subtype[0];
}
} else {
this.sub_type = null;
}
this.cur_index = index;
this.mall_scroll_con.active = index != 3;
this.cur_tab = this.tab_info_list[index - 1]; //容错旧版本一些跳转问题
if (this.cur_tab == null) {
index = 1;
this.cur_index = index;
this.cur_tab = this.tab_info_list[index - 1];
}
this.time_rt.node.active = false;
this.time_down_text_rt.node.active = false;
this.tips_btn.active = false;
if (this.hasSon(index)) {
this.btn.active = false;
this.good_cons.active = false;
if (!this.son_panel) {
var MallSonPanel = require("mall_son_panel");
this.son_panel = new MallSonPanel();
this.son_panel.show();
this.son_panel.setParent(this.mall_container);
} else {
this.son_panel.setVisibleStatus(true);
}
this.mall_scroll_con.active = false;
this.son_panel.setList(gdata("exchange_data", "data_shop_list", [index]).subtype);
this.son_panel.openById(type);
this.btn.active = false;
this.good_cons.active = false;
this.coin.node.active = false;
this.count.node.active = false;
this.refresh_count.label = "";
this.add_btn.active = false;
} else if (index <= 4) {
if (index != 4 && index != 2) {
this.btn.active = false;
this.coin.node.active = true;
this.count.node.active = true;
this.refresh_count.label = "";
this.add_btn.active = false;
if (this.cur_tab.is_first) {
this.ctrl.sender13401(index); //获取普通商店的限购次数
} else {
this.item_scrollview.setData(this.data_list[this.cur_index], function (cell) {
this.ctrl.openMallBuyWindow(true, cell);
});
}
} else {
this.btn.active = true;
this.coin.node.active = true;
this.count.node.active = true;
this.add_btn.active = false;
if (index == 2) {
this.tips_btn.active = true;
}
if (this.cur_tab.is_first) {
var _type = index;
if (_type == 4) {
_type = MallConst.MallType.SkillShop;
}
this.ctrl.sender13403(_type); //获取神秘/神格商店列表
} else {
if (index == 4) {
var time = this.data_list[this.cur_index].refresh_time - gcore.SmartSocket.getTime();
if (time > 0) {
this.setLessTime(time);
} else {
this.setTimeFormatString(0);
this.ctrl.sender13403(MallConst.MallType.SkillShop);
}
}
this.setResetCount(this.data_list[this.cur_index]);
this.item_scrollview.setData(this.data_list[this.cur_index].item_list, function (cell) {
this.ctrl.openMallBuyWindow(true, cell);
}.bind(this));
}
}
var item_bid;
if (index == 4) {
item_bid = gdata("exchange_data", "data_shop_list", [MallConst.MallType.SkillShop]).item_bid;
} else {
item_bid = gdata("exchange_data", "data_shop_list", [index]).item_bid;
}
var item_res_path = PathTool.getItemRes(Utils.getItemConfig(item_bid).icon);
if (item_res_path) {
this.loadRes(item_res_path, function (res_object) {
this.coin.spriteFrame = res_object;
}.bind(this));
}
this.updateIconInfo(item_bid);
this.good_cons.active = true;
if (this.son_panel) {
this.son_panel.setVisibleStatus(false);
}
}
},
getConfig: function getConfig(index, data) {
var config = [];
var list = [];
if (index == 1) {
config = Utils.deepCopy(Config.exchange_data.data_shop_exchage_gold);
} else if (index == 2) {}
var show_list = [];
if (index != 4 && index != 2) {
var list = Utils.deepCopy(data.item_list);
for (var a in config) {
var j = config[a];
if (j.type == this.cur_index) {
if (list && Utils.next(list)) {
//已经买过的限购物品
for (var k in list) {
var v = list[k];
if (j.id == v.item_id) {
if (v.ext[0] && v.ext[0].val != null) {
//不管是什么限购 赋值已购买次数就好了
j.has_buy = v.ext[0].val;
list.splice(k, 1);
}
break;
} else j.has_buy = 0;
}
} else j.has_buy = 0;
show_list.push(j);
}
}
}
return show_list;
},
//判断是否有子标签:{
hasSon: function hasSon(index) {
var sub_type = gdata("exchange_data", "data_shop_list", [index]).subtype;
return Utils.next(sub_type) != null;
},
//判断是否开启按钮
checkBtnIsOpen: function checkBtnIsOpen(index) {
if (index == 1) {
//钻石商城
if (this.role_vo.lev >= gdata("exchange_data", "data_shop_exchage_cost", "open_gold_lev").val) return true;else return false;
} else if (index == 2) {
//神格商店
if (this.role_vo.lev >= gdata("exchange_data", "data_shop_exchage_cost", "open_hero_soul_lev").val) return true;else return false;
} else if (index == 3) {
//积分
if (this.role_vo.lev >= gdata("exchange_data", "data_shop_exchage_cost", "open_point_lev").val) return true;else return false;
} else if (index == 4) {
//神秘商店
if (this.role_vo.lev >= gdata("exchange_data", "data_shop_exchage_cost", "open_secret_lev").val) return true;else return false;
}
return true;
},
setResetCount: function setResetCount(data) {
var self = this;
if (!data) return;
var free_count = data.free_count || 0;
var btn_str = Utils.TI18N("免费刷新");
this.btn_img.node.active = false;
if (self.cur_index == 2) {
//神格
if (free_count <= 0) {
var asset_cfg = Config.exchange_data.data_shop_exchage_cost["soul_reset_cost"];
if (asset_cfg) {
var bid = asset_cfg.val[0][0];
var num = asset_cfg.val[0][1];
btn_str = num + "重置";
this.btn_img.node.active = true;
this.loadRes(PathTool.getItemRes(Utils.getItemConfig(bid).icon), function (res) {
this.btn_img.spriteFrame = res;
}.bind(this));
}
}
} else if (self.cur_index == 4) {
//技能
if (free_count <= 0) {
var _config = Config.exchange_data.data_shop_list[MallConst.MallType.SkillShop];
if (_config) {
var cost_list = _config.cost_list;
var _bid = cost_list[0][0];
var _num = cost_list[0][1];
btn_str = _num + "刷新";
this.btn_img.node.active = true;
this.loadRes(PathTool.getItemRes(Utils.getItemConfig(_bid).icon), function (res) {
this.btn_img.spriteFrame = res;
}.bind(this));
}
} else {
var _asset_cfg = Config.exchange_data.data_shop_exchage_cost["skill_refresh_free"];
if (_asset_cfg) {
btn_str = cc.js.formatStr("%s(%s/%s)", Utils.TI18N("免费刷新"), free_count, _asset_cfg.val);
}
}
var config = Config.exchange_data.data_shop_exchage_cost.skill_refresh_number;
var max_count = 0;
if (config) {
max_count = config.val;
}
var count = data.count || 0;
var text = cc.js.formatStr("%s:%s/%s", Utils.TI18N("刷新次数"), count, max_count);
self.time_down_text_rt.string = text;
}
self.btn_label.string = btn_str;
},
setTabBtnTouchStatus: function setTabBtnTouchStatus(status, index) {}
});
module.exports = MailWindow;
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxtYWxsXFx2aWV3XFxtYWxsX3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJNYWxsQ29udHJvbGxlciIsIlJvbGVDb250cm9sbGVyIiwiQ29tbW9uU2Nyb2xsVmlldyIsIk1hbGxFdmVudCIsIk1hbGxDb25zdCIsIk1hbGxJdGVtIiwiVGltZVRvb2wiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJCYWNrcGFja0V2ZW50IiwiQmFja1BhY2tDb25zdCIsIkNvbW1vbkFsZXJ0IiwiTWFpbFdpbmRvdyIsImNjIiwiQ2xhc3MiLCJDb21tb25XaW5kb3dUYWIiLCJjdG9yIiwibW9kZWwiLCJnZXRJbnN0YW5jZSIsImdldE1vZGVsIiwiY3RybCIsIndpbl90eXBlIiwiV2luVHlwZSIsIkZ1bGwiLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwidWkiLCJ0YWJfaW5mb19saXN0IiwibGFiZWwiLCJnZGF0YSIsIm5hbWUiLCJpbmRleCIsInN0YXR1cyIsIm5vdGljZSIsImpzIiwiZm9ybWF0U3RyIiwidmFsIiwiaXNfZmlyc3QiLCJNYWxsVHlwZSIsIlNraWxsU2hvcCIsInRpdGxlX3N0ciIsInRhYl9saXN0IiwiY3VyX3RhYiIsImN1cl9pbmRleCIsImZpcnN0X2luZGV4IiwiZGF0YV9saXN0Iiwicm9sZV92byIsImdldFJvbGVWbyIsImluaXRQYW5lbCIsIm1hbGxfcm9vdF93bmQiLCJsb2FkUmVzIiwiZ2V0UHJlZmFiUGF0aCIsInJlc19vYmoiLCJvYmoiLCJjcmVhdGVNYWxsUm9vdFduZCIsImJpbmQiLCJ2aWV3Iiwic2V0UGFyZW50IiwiY29udGFpbmVyIiwibWFsbF9jb250YWluZXIiLCJnZXRDaGlsZEJ5TmFtZSIsIm1hbGxfc2Nyb2xsX2NvbiIsImJ0biIsImFjdGl2ZSIsImJ0bl9sYWJlbCIsInNlZWtDaGlsZCIsIkxhYmVsIiwiYnRuX2ltZyIsIlNwcml0ZSIsImNvaW4iLCJnZXRDb21wb25lbnQiLCJjb3VudCIsImFkZF9idG4iLCJ0aW1lX3J0IiwiUmljaFRleHQiLCJ0aW1lX2Rvd25fdGV4dF9ydCIsInJlZnJlc2hfY291bnQiLCJ0aXBzX2J0biIsImdvb2RfY29ucyIsInNjcm9sbF92aWV3X3NpemUiLCJzaXplIiwic2V0dGluZyIsIml0ZW1fY2xhc3MiLCJzdGFydF94Iiwic3BhY2VfeCIsInN0YXJ0X3kiLCJzcGFjZV95IiwiaXRlbV93aWR0aCIsIml0ZW1faGVpZ2h0Iiwicm93IiwiY29sIiwibmVlZF9keW5hbWljIiwiaXRlbV9zY3JvbGx2aWV3IiwiY3JlYXRlU2Nyb2xsIiwidjIiLCJTY3JvbGxWaWV3RGlyIiwidmVydGljYWwiLCJTY3JvbGxWaWV3U3RhcnRQb3MiLCJ0b3AiLCJzZWxlY3RlZFRhYkNhbGxCYWNrIiwicmVnaXN0ZXJFdmVudF8xIiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwiaXRlbV9iaWQiLCJkYXRhIiwiVXRpbHMiLCJnZXRJdGVtQ29uZmlnIiwib3BlblRpcHNTb3VyY2UiLCJ0eXBlIiwiZnVuIiwic2VuZGVyMTM0MDUiLCJhc3NldF9jZmciLCJDb25maWciLCJleGNoYW5nZV9kYXRhIiwiZGF0YV9zaG9wX2V4Y2hhZ2VfY29zdCIsImJpZCIsIm51bSIsImdvb2RfcmVzX3BhdGgiLCJpY29uIiwiZnJhbWVfYXJyYXlzIiwiZ29vZF9wYXRoIiwiZ2V0SWNvblBhdGgiLCJwdXNoIiwidGV4dCIsIlN0cmluZ1V0aWwiLCJwYXJzZVN0ciIsInN0cmluZyIsInN0ciIsInNob3ciLCJUSTE4TiIsInJlc0FyciIsImFkZEdsb2JhbEV2ZW50IiwiT3Blbl9WaWV3X0V2ZW50IiwibGlzdCIsImdldENvbmZpZyIsImRlZXBDb3B5Iiwic2V0RGF0YSIsImNlbGwiLCJvcGVuTWFsbEJ1eVdpbmRvdyIsIkdldF9CdXlfbGlzdCIsImJ0bl9zdHIiLCJmcmVlX2NvdW50IiwiZ2V0SXRlbVJlcyIsInJlc19vYmplY3QiLCJzcHJpdGVGcmFtZSIsInNldFJlc2V0Q291bnQiLCJrIiwiaXRlbV9saXN0IiwidiIsInNob3BfdHlwZSIsInNldExlc3NUaW1lIiwicmVmcmVzaF90aW1lIiwiZ2NvcmUiLCJTbWFydFNvY2tldCIsImdldFRpbWUiLCJyb2xlX3VwZGF0ZV9sZXZfZXZlbnQiLCJFdmVudElkIiwiVVBEQVRFX1JPTEVfQVRUUklCVVRFIiwia2V5IiwidmFsdWUiLCJTY29yZVNob3AiLCJzZXRUYWJCdG5Ub3VjaFN0YXR1cyIsImNoZWNrQnRuSXNPcGVuIiwiY29uZmlnIiwiZ2V0TW9uZXlTdHJpbmciLCJnb2xkIiwiRnJhc2hfdGlwc19ldmVudCIsIl90eXBlIiwic2VuZGVyMTM0MDMiLCJCdXlfU3VjY2Vzc19FdmVudCIsImlkIiwiZWlkIiwibmV4dCIsImV4dCIsImhhc19idXkiLCJCdXlfT25lX1N1Y2Nlc3MiLCJfc2hvcF90eXBlIiwib3JkZXIiLCJERUxFVEVfR09PRFMiLCJiYWdfY29kZSIsInRlbXBfbGlzdCIsIkJhZ19Db2RlIiwiRVFVSVBTIiwiZGF0YV9zaG9wX2xpc3QiLCJpIiwiaXRlbSIsImJhc2VfaWQiLCJ1cGRhdGVJY29uSW5mbyIsIk1PRElGWV9HT09EU19OVU0iLCJBRERfR09PRFMiLCJldmVudCIsImNmZyIsImRlc2MiLCJwbGF5QnV0dG9uU291bmQiLCJwb3MiLCJ0b3VjaCIsImdldExvY2F0aW9uIiwic2hvd0NvbW1vblRpcHMiLCJsZXNzX3RpbWUiLCJzZWxmIiwidGltZV90aWNoZXQiLCJUaW1lciIsImRlbCIsIm5vZGUiLCJzZXRUaW1lRm9ybWF0U3RyaW5nIiwic2V0IiwidGltZSIsImdldFRpbWVGb3JtYXQiLCJnZXRJdGVtTnVtQnlCaWQiLCJvcGVuUm9vdFduZCIsInN1Yl9pbmRleCIsInN1YnR5cGUiLCJpbmRleE9mIiwic3ViX3R5cGUiLCJzZXRGaXJzdExvZ2luIiwic2V0U2VsZWN0ZVRhYiIsImNsb3NlQ2FsbEJhY2siLCJvcGVuTWFsbFBhbmVsIiwiRGVsZXRlTWUiLCJzb25fcGFuZWwiLCJkZWxldGVNZSIsInVuYmluZCIsIkFjdGlvbkNvbnRyb2xsZXIiLCJnZXRUcmVhc3VyZVZpZXciLCJzZXRWaXNpYmxlIiwiaGFzU29uIiwiTWFsbFNvblBhbmVsIiwic2V0VmlzaWJsZVN0YXR1cyIsInNldExpc3QiLCJvcGVuQnlJZCIsInNlbmRlcjEzNDAxIiwiaXRlbV9yZXNfcGF0aCIsImRhdGFfc2hvcF9leGNoYWdlX2dvbGQiLCJzaG93X2xpc3QiLCJhIiwiaiIsIml0ZW1faWQiLCJzcGxpY2UiLCJsZXYiLCJyZXMiLCJjb3N0X2xpc3QiLCJza2lsbF9yZWZyZXNoX251bWJlciIsIm1heF9jb3VudCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsSUFBSUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxJQUFJQyxjQUFjLEdBQUdELE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJRSxjQUFjLEdBQUdGLE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJRyxnQkFBZ0IsR0FBR0gsT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlJLFNBQVMsR0FBR0osT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBQ0EsSUFBSUssU0FBUyxHQUFHTCxPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxJQUFJTSxRQUFRLEdBQUdOLE9BQU8sQ0FBQyxXQUFELENBQXRCOztBQUNBLElBQUlPLFFBQVEsR0FBR1AsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSVEsa0JBQWtCLEdBQUdSLE9BQU8sQ0FBQyxxQkFBRCxDQUFoQzs7QUFDQSxJQUFJUyxhQUFhLEdBQUdULE9BQU8sQ0FBQyxnQkFBRCxDQUEzQjs7QUFDQSxJQUFJVSxhQUFhLEdBQUdWLE9BQU8sQ0FBQyxnQkFBRCxDQUEzQjs7QUFDQSxJQUFJVyxXQUFXLEdBQUdYLE9BQU8sQ0FBQyxhQUFELENBQXpCOztBQUNBLElBQUlZ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LE9BQXhCO0FBQ0gsR0F4bUJxQjtBQXltQnRCcUIsRUFBQUEsb0JBQW9CLEVBQUUsOEJBQVVuSSxNQUFWLEVBQWtCRCxLQUFsQixFQUF5QixDQUU5QztBQTNtQnFCLENBQVQsQ0FBakI7QUFpbkJBc04sTUFBTSxDQUFDQyxPQUFQLEdBQWlCMU8sVUFBakIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIEBhdXRob3I6IHNoaXJhaG9Ac3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcclxuLy8gQGRlc2NyaXB0aW9uOlxyXG4vLyAgICAgIOeUqOaIt+i+k+WFpeahhlxyXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG52YXIgUGF0aFRvb2wgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XHJcbnZhciBNYWxsQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWxsX2NvbnRyb2xsZXJcIik7XHJcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XHJcbnZhciBDb21tb25TY3JvbGxWaWV3ID0gcmVxdWlyZShcImNvbW1vbl9zY3JvbGx2aWV3XCIpO1xyXG52YXIgTWFsbEV2ZW50ID0gcmVxdWlyZShcIm1hbGxfZXZlbnRcIik7XHJcbnZhciBNYWxsQ29uc3QgPSByZXF1aXJlKFwibWFsbF9jb25zdFwiKTtcclxudmFyIE1hbGxJdGVtID0gcmVxdWlyZShcIm1hbGxfaXRlbVwiKTtcclxudmFyIFRpbWVUb29sID0gcmVxdWlyZShcInRpbWV0b29sXCIpXHJcbnZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKVxyXG52YXIgQmFja3BhY2tFdmVudCA9IHJlcXVpcmUoXCJiYWNrcGFja19ldmVudFwiKVxyXG52YXIgQmFja1BhY2tDb25zdCA9IHJlcXVpcmUoXCJiYWNrcGFja19jb25zdFwiKVxyXG52YXIgQ29tbW9uQWxlcnQgPSByZXF1aXJlKFwiY29tbW9uYWxlcnRcIilcclxudmFyIE1haWxXaW5kb3cgPSBjYy5DbGFzcyh7XHJcbiAgICBleHRlbmRzOiBDb21tb25XaW5kb3dUYWIsXHJcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5tb2RlbCA9IE1hbGxDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKVxyXG4gICAgICAgIHRoaXMuY3RybCA9IE1hbGxDb250cm9sbGVyLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgdGhpcy53aW5fdHlwZSA9IFdpblR5cGUuRnVsbDtcclxuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcudWk7ICAgICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xyXG4gICAgICAgIHRoaXMudGFiX2luZm9fbGlzdCA9IFtcclxuICAgICAgICAgICAgeyBsYWJlbDogZ2RhdGEoXCJleGNoYW5nZV9kYXRhXCIsIFwiZGF0YV9zaG9wX2xpc3RcIiwgMSkubmFtZSwgaW5kZXg6IDEsIHN0YXR1czogdHJ1ZSwgbm90aWNlOiBjYy5qcy5mb3JtYXRTdHIoXCIlc+e6p+W8gOWQr1wiLCBnZGF0YShcImV4Y2hhbmdlX2RhdGFcIiwgXCJkYXRhX3Nob3BfZXhjaGFnZV9jb3N0XCIsIFwib3Blbl9nb2xkX2xldlwiKS52YWwpLCBpc19maXJzdDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IGxhYmVsOiBnZGF0YShcImV4Y2hhbmdlX2RhdGFcIiwgXCJkYXRhX3Nob3BfbGlzdFwiLCAyKS5uYW1lLCBpbmRleDogMiwgc3RhdHVzOiB0cnVlLCBub3RpY2U6IGNjLmpzLmZvcm1hdFN0cihcIiVz57qn5byA5ZCvXCIsIGdkYXRhKFwiZXhjaGFuZ2VfZGF0YVwiLCBcImRhdGFfc2hvcF9leGNoYWdlX2Nvc3RcIiwgXCJvcGVuX2hlcm9fc291bF9sZXZcIikudmFsKSwgaXNfZmlyc3Q6IHRydWUgfSxcclxuICAgICAgICAgICAgeyBsYWJlbDogZ2RhdGEoXCJleGNoYW5nZV9kYXRhXCIsIFwiZGF0YV9zaG9wX2xpc3RcIiwgMykubmFtZSwgaW5kZXg6IDMsIHN0YXR1czogdHJ1ZSwgbm90aWNlOiBjYy5qcy5mb3JtYXRTdHIoXCIlc+e6p+W8gOWQr1wiLCBnZGF0YShcImV4Y2hhbmdlX2RhdGFcIiwgXCJkYXRhX3Nob3BfZXhjaGFnZV9jb3N0XCIsIFwib3Blbl9wb2ludF9sZXZcIikudmFsKSwgaXNfZmlyc3Q6IHRydWUgfSxcclxuICAgICAgICAgICAgeyBsYWJlbDogZ2RhdGEoXCJleGNoYW5nZV9kYXRhXCIsIFwiZGF0YV9zaG9wX2xpc3RcIiwgTWFsbENvbnN0Lk1hbGxUeXBlLlNraWxsU2hvcCkubmFtZSAsaW5kZXg6IDQsIHN0YXR1czogdHJ1ZSwgbm90aWNlOiBjYy5qcy5mb3JtYXRTdHIoXCIlc+e6p+W8gOWQr1wiLCBnZGF0YShcImV4Y2hhbmdlX2RhdGFcIiwgXCJkYXRhX3Nob3BfZXhjaGFnZV9jb3N0XCIsIFwib3Blbl9za2lsbF9sZXZcIikudmFsKSwgaXNfZmlyc3Q6IHRydWUgfVxyXG4gICAgICAgIF07XHJcbiAgICAgICAgdGhpcy50aXRsZV9zdHIgPSBcIuWVhuWfjlwiO1xyXG4gICAgICAgIHRoaXMudGFiX2xpc3QgPSB0aGlzLnRhYl9pbmZvX2xpc3Q7XHJcbiAgICAgICAgdGhpcy5jdXJfdGFiID0gbnVsbDtcclxuICAgICAgICB0aGlzLmN1cl9pbmRleCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5maXJzdF9pbmRleCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5kYXRhX2xpc3QgPSB7fTtcclxuICAgICAgICB0aGlzLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xyXG4gICAgfSxcclxuXHJcbiAgICBpbml0UGFuZWw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5tYWxsX3Jvb3Rfd25kID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJtYWxsXCIsIFwibWFsbF93aW5kb3dfMlwiKSwgZnVuY3Rpb24gKHJlc19vYmopIHtcclxuICAgICAgICAgICAgICAgIHZhciBvYmogPSByZXNfb2JqO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVNYWxsUm9vdFduZChvYmopO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgY3JlYXRlTWFsbFJvb3RXbmQ6IGZ1bmN0aW9uICh2aWV3KSB7XHJcbiAgICAgICAgdGhpcy5tYWxsX3Jvb3Rfd25kID0gdmlldztcclxuICAgICAgICB0aGlzLm1hbGxfcm9vdF93bmQuc2V0UGFyZW50KHRoaXMuY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgdGhpcy5tYWxsX2NvbnRhaW5lciA9IHRoaXMubWFsbF9yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcImNvbnRhaW5lclwiKTtcclxuICAgICAgICB0aGlzLm1hbGxfc2Nyb2xsX2NvbiA9IHRoaXMubWFsbF9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJzY3JvbGxDb25cIik7XHJcbiAgICAgICAgdGhpcy5idG4gPSB0aGlzLm1hbGxfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiYnRuXCIpO1xyXG4gICAgICAgIHRoaXMuYnRuLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYnRuX2xhYmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5idG4sIFwiTGFiZWxcIiwgY2MuTGFiZWwpO1xyXG4gICAgICAgIHRoaXMuYnRuX2ltZyA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYnRuLCBcImltZ1wiLCBjYy5TcHJpdGUpO1xyXG5cclxuICAgICAgICB0aGlzLmNvaW4gPSB0aGlzLm1hbGxfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiY29pblwiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcclxuICAgICAgICB0aGlzLmNvdW50ID0gdGhpcy5tYWxsX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImNvdW50XCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XHJcbiAgICAgICAgdGhpcy5hZGRfYnRuID0gdGhpcy5tYWxsX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImFkZF9idG5cIik7XHJcbiAgICAgICAgdGhpcy50aW1lX3J0ID0gdGhpcy5tYWxsX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInRpbWVcIikuZ2V0Q29tcG9uZW50KGNjLlJpY2hUZXh0KVxyXG4gICAgICAgIHRoaXMudGltZV9kb3duX3RleHRfcnQgPSB0aGlzLm1hbGxfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwidGltZV9kb3duX3RleHRcIikuZ2V0Q29tcG9uZW50KGNjLlJpY2hUZXh0KVxyXG4gICAgICAgIHRoaXMuYWRkX2J0bi5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnJlZnJlc2hfY291bnQgPSB0aGlzLm1hbGxfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwicmVmcmVzaF9jb3VudFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xyXG4gICAgICAgIHRoaXMudGlwc19idG4gPSB0aGlzLm1hbGxfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwidGlwc19idG5cIik7XHJcbiAgICAgICAgdGhpcy50aXBzX2J0bi5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmdvb2RfY29ucyA9IHRoaXMubWFsbF9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJnb29kX2NvbnNcIik7XHJcblxyXG4gICAgICAgIHZhciBzY3JvbGxfdmlld19zaXplID0gY2Muc2l6ZSg2MjIsIDcwNSlcclxuICAgICAgICB2YXIgc2V0dGluZyA9IHtcclxuICAgICAgICAgICAgaXRlbV9jbGFzczogTWFsbEl0ZW0sICAgICAgLy8g5Y2V5YWD57G7XHJcbiAgICAgICAgICAgIHN0YXJ0X3g6IDQsICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoRY6LW354K5XHJcbiAgICAgICAgICAgIHNwYWNlX3g6IDAsICAgICAgICAgICAgICAgICAgICAvLyB45pa55ZCR55qE6Ze06ZqUXHJcbiAgICAgICAgICAgIHN0YXJ0X3k6IDMsICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoRZ6LW354K5XHJcbiAgICAgICAgICAgIHNwYWNlX3k6IDIsICAgICAgICAgICAgICAgICAgIC8vIHnmlrnlkJHnmoTpl7TpmpRcclxuICAgICAgICAgICAgaXRlbV93aWR0aDogMzA2LCAgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuHdpZHRoXHJcbiAgICAgICAgICAgIGl0ZW1faGVpZ2h0OiAxNDMsICAgICAgICAgICAgICAvLyDljZXlhYPnmoTlsLrlr7hoZWlnaHRcclxuICAgICAgICAgICAgcm93OiAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIOihjOaVsO+8jOS9nOeUqOS6juawtOW5s+a7muWKqOexu+Wei1xyXG4gICAgICAgICAgICBjb2w6IDIsICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiX5pWw77yM5L2c55So5LqO5Z6C55u05rua5Yqo57G75Z6LXHJcbiAgICAgICAgICAgIG5lZWRfZHluYW1pYzogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldyA9IG5ldyBDb21tb25TY3JvbGxWaWV3KClcclxuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5jcmVhdGVTY3JvbGwodGhpcy5tYWxsX3Njcm9sbF9jb24sIGNjLnYyKDAsIDApLCBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsLCBTY3JvbGxWaWV3U3RhcnRQb3MudG9wLCBzY3JvbGxfdmlld19zaXplLCBzZXR0aW5nLCBjYy52MigwLjUsIDAuNSkpXHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJDYWxsQmFjayh0aGlzLmZpcnN0X2luZGV4KTtcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyRXZlbnRfMSgpXHJcbiAgICB9LFxyXG5cclxuICAgIHJlZ2lzdGVyRXZlbnRfMTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmFkZF9idG4pIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1fYmlkID0gZ2RhdGEoXCJleGNoYW5nZV9kYXRhXCIsIFwiZGF0YV9zaG9wX2xpc3RcIiwgW3RoaXMuY3VyX2luZGV4XSkuaXRlbV9iaWQ7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IFV0aWxzLmdldEl0ZW1Db25maWcoaXRlbV9iaWQpO1xyXG4gICAgICAgICAgICAgICAgcmVxdWlyZShcImJhY2twYWNrX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuVGlwc1NvdXJjZSh0cnVlLGRhdGEpXHJcbiAgICAgICAgICAgIH0sIHRoaXMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5idG4pIHtcclxuICAgICAgICAgICAgdGhpcy5idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJfaW5kZXggPT0gNCB8fCB0aGlzLmN1cl9pbmRleCA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSB0aGlzLmN1cl9pbmRleFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmdW4gPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwuc2VuZGVyMTM0MDUodHlwZSlcclxuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmN1cl9pbmRleCA9PSA0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IE1hbGxDb25zdC5NYWxsVHlwZS5Ta2lsbFNob3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuKClcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFzc2V0X2NmZyA9IENvbmZpZy5leGNoYW5nZV9kYXRhLmRhdGFfc2hvcF9leGNoYWdlX2Nvc3RbXCJzb3VsX3Jlc2V0X2Nvc3RcIl1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJpZCxudW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXNzZXRfY2ZnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZCA9IGFzc2V0X2NmZy52YWxbMF1bMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IGFzc2V0X2NmZy52YWxbMF1bMV1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ29vZF9yZXNfcGF0aCA9IFV0aWxzLmdldEl0ZW1Db25maWcoYmlkKS5pY29uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmcmFtZV9hcnJheXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdvb2RfcGF0aCA9IFBhdGhUb29sLmdldEljb25QYXRoKFwiaXRlbVwiLCBnb29kX3Jlc19wYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfYXJyYXlzLnB1c2goZ29vZF9wYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQgPSBTdHJpbmdVdGlsLnBhcnNlU3RyKFwi5piv5ZCm5raI6ICXPGltZyBzcmM9JXMgc2NhbGU9MC4zIHZpc2libGU9dHJ1ZSAvPjxkaXY+JXM8L2Rpdj7ov5vooYzph43nva7vvJ9cIikuc3RyaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSBjYy5qcy5mb3JtYXRTdHIodGV4dCxnb29kX3Jlc19wYXRoLCBudW0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkFsZXJ0LnNob3coc3RyLCBVdGlscy5USTE4TihcIuehruWumlwiKSwgZnVuLmJpbmQodGhpcyksIFV0aWxzLlRJMThOKFwi5Y+W5raIXCIpLCBudWxsLG51bGwsbnVsbCx7cmVzQXJyOiBmcmFtZV9hcnJheXN9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgdGhpcylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8v6I635Y+W5ZWG5ZOB5bey6LSt5Lmw5qyh5pWwKOmZkOS6jui0reS5sOi/h+eahOaciemZkOi0reeahOWVhuWTgSlcclxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KE1hbGxFdmVudC5PcGVuX1ZpZXdfRXZlbnQsIGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cl9pbmRleCAhPSA0ICYmIHRoaXMuY3VyX2luZGV4ICE9IDIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VyX3RhYi5pc19maXJzdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdmFyIGxpc3QgPSB0aGlzLmdldENvbmZpZyh0aGlzLmN1cl9pbmRleCwgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFfbGlzdFt0aGlzLmN1cl9pbmRleF0gPSBVdGlscy5kZWVwQ29weShsaXN0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LnNldERhdGEobGlzdCwgZnVuY3Rpb24gKGNlbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwub3Blbk1hbGxCdXlXaW5kb3codHJ1ZSwgY2VsbCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG5cclxuICAgICAgICAvL+iOt+WPluelnuenmOWVhuW6l+eJqeWTgeWIl+ihqFxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoTWFsbEV2ZW50LkdldF9CdXlfbGlzdCwgZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX2luZGV4ID09IDQgfHwgdGhpcy5jdXJfaW5kZXggPT0gMikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJfdGFiLmlzX2ZpcnN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2YXIgYnRuX3N0ciA9IFV0aWxzLlRJMThOKFwi5YWN6LS55Yi35pawXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VyX2luZGV4ID09IDIpIHsgLy/npZ7moLxcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5mcmVlX2NvdW50IDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2V0X2NmZyA9IGdkYXRhKFwiZXhjaGFuZ2VfZGF0YVwiLCBcImRhdGFfc2hvcF9leGNoYWdlX2Nvc3RcIiwgXCJzb3VsX3Jlc2V0X2Nvc3RcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhc3NldF9jZmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiaWQgPSBhc3NldF9jZmcudmFsWzBdWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG51bSA9IGFzc2V0X2NmZy52YWxbMF1bMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG5fc3RyID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwiJXPph43nva5cIiksIG51bSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFJlcyhQYXRoVG9vbC5nZXRJdGVtUmVzKFV0aWxzLmdldEl0ZW1Db25maWcoYmlkKS5pY29uKSwgZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ0bl9pbWcuc3ByaXRlRnJhbWUgPSByZXNfb2JqZWN0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5idG5fbGFiZWwuc3RyaW5nID0gYnRuX3N0cjtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmVzZXRDb3VudChkYXRhKVxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkYXRhLml0ZW1fbGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gZGF0YS5pdGVtX2xpc3Rba107XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jdXJfaW5kZXggPT0gNCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHYuc2hvcF90eXBlID0gTWFsbENvbnN0Lk1hbGxUeXBlLlNraWxsU2hvcDtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdi5zaG9wX3R5cGUgPSB0aGlzLmN1cl9pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFfbGlzdFt0aGlzLmN1cl9pbmRleF0gPSBVdGlscy5kZWVwQ29weShkYXRhKVxyXG5cclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuY3VyX2luZGV4ID09IDQpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TGVzc1RpbWUodGhpcy5kYXRhX2xpc3RbdGhpcy5jdXJfaW5kZXhdLnJlZnJlc2hfdGltZSAtIGdjb3JlLlNtYXJ0U29ja2V0LmdldFRpbWUoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5zZXREYXRhKHRoaXMuZGF0YV9saXN0W3RoaXMuY3VyX2luZGV4XS5pdGVtX2xpc3QsIGZ1bmN0aW9uIChjZWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5NYWxsQnV5V2luZG93KHRydWUsIGNlbGwpO1xyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG5cclxuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfdXBkYXRlX2xldl9ldmVudCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGVfdXBkYXRlX2xldl9ldmVudCA9IHRoaXMucm9sZV92by5iaW5kKEV2ZW50SWQuVVBEQVRFX1JPTEVfQVRUUklCVVRFLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cl9pbmRleCA9PSBudWxsIHx8IHRoaXMuY3VyX2luZGV4ID09IE1hbGxDb25zdC5NYWxsVHlwZS5TY29yZVNob3ApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gXCJsZXZcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMudGFiX2xpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VGFiQnRuVG91Y2hTdGF0dXModGhpcy5jaGVja0J0bklzT3BlbihrKSwgayk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PSBcImdvbGRcIiB8fCBrZXkgPT0gXCJhcmVuYV9jZW50XCIgfHwga2V5ID09IFwiZ3VpbGRcIiB8fCBrZXkgPT0gXCJoZXJvX3NvdWxcIiB8fCBrZXkgPT0gXCJmcmllbmRfcG9pbnRcIiB8fCBrZXkgPT0gXCJyZWRfZ29sZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSBnZGF0YShcImV4Y2hhbmdlX2RhdGFcIiwgXCJkYXRhX3Nob3BfbGlzdFwiLCBbdGhpcy5jdXJfaW5kZXhdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1fYmlkID0gY29uZmlnLml0ZW1fYmlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1fYmlkID09IDE1KSB7IC8v6ZK755+zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudC5zdHJpbmcgPSBVdGlscy5nZXRNb25leVN0cmluZyh0aGlzLnJvbGVfdm8uZ29sZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfYXNzZXRzX2lkMmxhYmVsXCIsIFtpdGVtX2JpZF0pID09IGtleSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudC5zdHJpbmcgPSBVdGlscy5nZXRNb25leVN0cmluZyh0aGlzLnJvbGVfdm9bZ2RhdGEoXCJpdGVtX2RhdGFcIiwgXCJkYXRhX2Fzc2V0c19pZDJsYWJlbFwiLCBbaXRlbV9iaWRdKV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhciBpdGVtX3Jlc19wYXRoID0gUGF0aFRvb2wuZ2V0SXRlbVJlcyhVdGlscy5nZXRJdGVtQ29uZmlnKGl0ZW1fYmlkKS5pY29uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGl0ZW1fcmVzX3BhdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMubG9hZFJlcyhpdGVtX3Jlc19wYXRoLCBmdW5jdGlvbiAocmVzX29iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuY29pbi5zcHJpdGVGcmFtZSA9IHJlc19vYmplY3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB9LmJpbmQodGhpcykpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB0aGlzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL+WIsOaXtuWAmeWIt+aWsOS6hlxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoTWFsbEV2ZW50LkZyYXNoX3RpcHNfZXZlbnQsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX2luZGV4ID09IDQgfHwgdGhpcy5jdXJfaW5kZXggPT0gMikge1xyXG4gICAgICAgICAgICAgICAgbGV0IF90eXBlID0gdGhpcy5jdXJfaW5kZXhcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuY3VyX2luZGV4ID09IDQpe1xyXG4gICAgICAgICAgICAgICAgICAgIF90eXBlID0gTWFsbENvbnN0Lk1hbGxUeXBlLlNraWxsU2hvcFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLnNlbmRlcjEzNDAzKF90eXBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0uYmluZCh0aGlzKSlcclxuXHJcbiAgICAgICAgLy/pmaTnpZ7np5jnpZ7moLzllYbln47ku6XlpJbnmoTotK3kubDmiJDlip9cclxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KE1hbGxFdmVudC5CdXlfU3VjY2Vzc19FdmVudCwgZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX2luZGV4ID09IG51bGwgfHwgdGhpcy5kYXRhX2xpc3QgPT0gbnVsbCB8fCB0aGlzLmRhdGFfbGlzdFt0aGlzLmN1cl9pbmRleF0gPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJfaW5kZXggIT0gMiB8fCB0aGlzLmN1cl9pbmRleCAhPSA0KSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZGF0YV9saXN0W3RoaXMuY3VyX2luZGV4XSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5kYXRhX2xpc3RbdGhpcy5jdXJfaW5kZXhdW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2LmlkID09IGRhdGEuZWlkICYmIFV0aWxzLm5leHQoZGF0YS5leHQgfHwge30pICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdi5oYXNfYnV5ID0gZGF0YS5leHRbMF0udmFsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0uYmluZCh0aGlzKSlcclxuXHJcbiAgICAgICAgLy/npZ7np5gv56We5qC85ZWG5Z+O6LSt5Lmw5oiQ5YqfXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChNYWxsRXZlbnQuQnV5X09uZV9TdWNjZXNzLCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJfaW5kZXggPT0gbnVsbCB8fCB0aGlzLmRhdGFfbGlzdCA9PSBudWxsIHx8IHRoaXMuZGF0YV9saXN0W3RoaXMuY3VyX2luZGV4XSA9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIGxldCBfc2hvcF90eXBlID0gdGhpcy5jdXJfaW5kZXhcclxuICAgICAgICAgICAgaWYodGhpcy5jdXJfaW5kZXggPT0gNCl7XHJcbiAgICAgICAgICAgICAgICBfc2hvcF90eXBlID0gTWFsbENvbnN0Lk1hbGxUeXBlLlNraWxsU2hvcFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5kYXRhX2xpc3RbdGhpcy5jdXJfaW5kZXhdLml0ZW1fbGlzdCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmRhdGFfbGlzdFt0aGlzLmN1cl9pbmRleF0uaXRlbV9saXN0W2tdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHYuc2hvcF90eXBlID09IF9zaG9wX3R5cGUgJiYgdi5vcmRlciAmJiBkYXRhLm9yZGVyID09IHYub3JkZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgdi5oYXNfYnV5ID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0uYmluZCh0aGlzKSlcclxuXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChCYWNrcGFja0V2ZW50LkRFTEVURV9HT09EUyxmdW5jdGlvbihiYWdfY29kZSx0ZW1wX2xpc3Qpe1xyXG4gICAgICAgICAgICBpZihiYWdfY29kZSAhPSBCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkVRVUlQUyl7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbV9iaWQgPSBDb25maWcuZXhjaGFuZ2VfZGF0YS5kYXRhX3Nob3BfbGlzdFtNYWxsQ29uc3QuTWFsbFR5cGUuU2tpbGxTaG9wXS5pdGVtX2JpZFxyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHRlbXBfbGlzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0ZW1wX2xpc3RbaV1cclxuICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmJhc2VfaWQgPT0gaXRlbV9iaWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUljb25JbmZvKGl0ZW1fYmlkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0uYmluZCh0aGlzKSlcclxuXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChCYWNrcGFja0V2ZW50Lk1PRElGWV9HT09EU19OVU0sZnVuY3Rpb24oYmFnX2NvZGUsdGVtcF9saXN0KXtcclxuICAgICAgICAgICAgaWYoYmFnX2NvZGUgIT0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5FUVVJUFMpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW1fYmlkID0gQ29uZmlnLmV4Y2hhbmdlX2RhdGEuZGF0YV9zaG9wX2xpc3RbTWFsbENvbnN0Lk1hbGxUeXBlLlNraWxsU2hvcF0uaXRlbV9iaWRcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiB0ZW1wX2xpc3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0gdGVtcF9saXN0W2ldXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5iYXNlX2lkID09IGl0ZW1fYmlkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJY29uSW5mbyhpdGVtX2JpZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LmJpbmQodGhpcykpXHJcblxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoQmFja3BhY2tFdmVudC5BRERfR09PRFMsZnVuY3Rpb24oYmFnX2NvZGUsdGVtcF9saXN0KXtcclxuICAgICAgICAgICAgaWYoYmFnX2NvZGUgIT0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5FUVVJUFMpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW1fYmlkID0gQ29uZmlnLmV4Y2hhbmdlX2RhdGEuZGF0YV9zaG9wX2xpc3RbTWFsbENvbnN0Lk1hbGxUeXBlLlNraWxsU2hvcF0uaXRlbV9iaWRcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiB0ZW1wX2xpc3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0gdGVtcF9saXN0W2ldXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5iYXNlX2lkID09IGl0ZW1fYmlkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJY29uSW5mbyhpdGVtX2JpZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LmJpbmQodGhpcykpXHJcbiAgICAgICAgdGhpcy50aXBzX2J0bi5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICB2YXIgc3RyID0gXCJcIjtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX2luZGV4ID09IDIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjZmcgPSBnZGF0YShcImV4Y2hhbmdlX2RhdGFcIiwgXCJkYXRhX3Nob3BfZXhjaGFnZV9jb3N0XCIsIFwiaGVyb19zb3VsX2luc3RydWN0aW9uXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNmZyAmJiBjZmcuZGVzYylcclxuICAgICAgICAgICAgICAgICAgICBzdHIgPSBjZmcuZGVzYztcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJfaW5kZXggPT0gNCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNmZyA9IGdkYXRhKFwiZXhjaGFuZ2VfZGF0YVwiLCBcImRhdGFfc2hvcF9leGNoYWdlX2Nvc3RcIiwgXCJzZWNyZXRfaW5zdHJ1Y3Rpb25cIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2ZnICYmIGNmZy5kZXNjKVxyXG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IGNmZy5kZXNjO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZCgxKTtcclxuICAgICAgICAgICAgdmFyIHBvcyA9IGV2ZW50LnRvdWNoLmdldExvY2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHJlcXVpcmUoXCJ0aXBzX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5zaG93Q29tbW9uVGlwcyhzdHIsIHBvcyk7XHJcbiAgICAgICAgfSwgdGhpcylcclxuICAgIH0sXHJcblxyXG4gICAgc2V0TGVzc1RpbWU6IGZ1bmN0aW9uIChsZXNzX3RpbWUpIHtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcclxuICAgICAgICBpZighc2VsZi50aW1lX3J0KSByZXR1cm47XHJcbiAgICAgICAgaWYodGhpcy50aW1lX3RpY2hldCl7XHJcbiAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLnRpbWVfdGljaGV0KTtcclxuICAgICAgICAgICAgdGhpcy50aW1lX3RpY2hldCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGltZV9ydC5ub2RlLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy50aW1lX2Rvd25fdGV4dF9ydC5ub2RlLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgaWYobGVzc190aW1lID4gMCl7XHJcbiAgICAgICAgICAgIHNlbGYuc2V0VGltZUZvcm1hdFN0cmluZyhsZXNzX3RpbWUpXHJcbiAgICAgICAgICAgIGlmKHRoaXMudGltZV90aWNoZXQgPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVfdGljaGV0ID0gZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVzc190aW1lLS0gXHJcbiAgICAgICAgICAgICAgICAgICAgaWYobGVzc190aW1lIDwgMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLnRpbWVfdGljaGV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lX3RpY2hldCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNlbGYuY3VyX2luZGV4ID09IDQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdHJsLnNlbmRlcjEzNDAzKE1hbGxDb25zdC5NYWxsVHlwZS5Ta2lsbFNob3ApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUaW1lRm9ybWF0U3RyaW5nKGxlc3NfdGltZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksMTAwMCwtMSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBzZWxmLnNldFRpbWVGb3JtYXRTdHJpbmcobGVzc190aW1lKVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgc2V0VGltZUZvcm1hdFN0cmluZzogZnVuY3Rpb24gKHRpbWUpIHtcclxuICAgICAgICBpZih0aW1lID4gMCl7XHJcbiAgICAgICAgICAgIHRoaXMudGltZV9ydC5zdHJpbmcgPSBcIuWFjei0ueWIt+aWsDogPGNvbG9yPSMyNDkwMDM+XCIgKyBUaW1lVG9vbC5nZXRUaW1lRm9ybWF0KHRpbWUpICsgXCI8L2NvbG9yPlwiXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMudGltZV9ydC5zdHJpbmcgPSBcIuWFjei0ueWIt+aWsDogPGNvbG9yPSMyNDkwMDM+MDA6MDA6MDA8L2NvbG9yPlwiXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGVJY29uSW5mbyhpdGVtX2JpZCl7XHJcbiAgICAgICAgaWYgKGl0ZW1fYmlkID09IGdkYXRhKFwiaXRlbV9kYXRhXCIsIFwiZGF0YV9hc3NldHNfbGFiZWwyaWRcIiwgXCJnb2xkXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY291bnQuc3RyaW5nID0gVXRpbHMuZ2V0TW9uZXlTdHJpbmcodGhpcy5yb2xlX3ZvLmdvbGQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY291bnQuc3RyaW5nID0gVXRpbHMuZ2V0TW9uZXlTdHJpbmcoQmFja3BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRJdGVtTnVtQnlCaWQoaXRlbV9iaWQpKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgb3BlblJvb3RXbmQ6IGZ1bmN0aW9uIChpbmRleCkge1xyXG4gICAgICAgIGluZGV4ID0gaW5kZXggfHwgMTtcclxuICAgICAgICBsZXQgc3ViX2luZGV4ID0gaW5kZXhcclxuICAgICAgICBpZiAoaW5kZXggPT0gTWFsbENvbnN0Lk1hbGxUeXBlLlNraWxsU2hvcCl7XHJcbiAgICAgICAgICAgIHN1Yl9pbmRleCA9IDRcclxuICAgICAgICB9ZWxzZSBpZihpbmRleCA+IDQpe1xyXG4gICAgICAgICAgICBsZXQgc3VidHlwZSA9IGdkYXRhKFwiZXhjaGFuZ2VfZGF0YVwiLCBcImRhdGFfc2hvcF9saXN0XCIsIFszXSkuc3VidHlwZVxyXG4gICAgICAgICAgICBpZihzdWJ0eXBlLmluZGV4T2YoaW5kZXgpICE9IC0xKXtcclxuICAgICAgICAgICAgICAgIHN1Yl9pbmRleCA9IDNcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNlIGlmKGluZGV4ID09IE1hbGxDb25zdC5NYWxsVHlwZS5TY29yZVNob3Ape1xyXG4gICAgICAgICAgICBpbmRleCA9IDg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vZmlyc3RfaW5kZXgg5Li66YCJ5LitIC8v5omA5Zyo57G75Z6LXHJcbiAgICAgICAgdGhpcy5maXJzdF9pbmRleCA9IHN1Yl9pbmRleDtcclxuICAgICAgICB0aGlzLnN1Yl90eXBlID0gaW5kZXhcclxuICAgICAgICB0aGlzLmN0cmwuc2V0Rmlyc3RMb2dpbihmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlVGFiKHN1Yl9pbmRleCk7XHJcbiAgICB9LFxyXG5cclxuICAgIGNsb3NlQ2FsbEJhY2s6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmN0cmwub3Blbk1hbGxQYW5lbChmYWxzZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbV9zY3JvbGx2aWV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LkRlbGV0ZU1lKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuc29uX3BhbmVsKXtcclxuICAgICAgICAgICAgdGhpcy5zb25fcGFuZWwuZGVsZXRlTWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucm9sZV91cGRhdGVfbGV2X2V2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9sZV92by51bmJpbmQodGhpcy5yb2xlX3VwZGF0ZV9sZXZfZXZlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLnJvbGVfdXBkYXRlX2xldl9ldmVudCA9IG51bGxcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodGhpcy50aW1lX3RpY2hldCl7XHJcbiAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLnRpbWVfdGljaGV0KTtcclxuICAgICAgICAgICAgdGhpcy50aW1lX3RpY2hldCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucm9sZV92byA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zb25fcGFuZWwgPSBudWxsO1xyXG4gICAgICAgIHZhciBBY3Rpb25Db250cm9sbGVyID0gcmVxdWlyZShcImFjdGlvbl9jb250cm9sbGVyXCIpXHJcbiAgICAgICAgaWYoQWN0aW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFRyZWFzdXJlVmlldygpKXtcclxuICAgICAgICAgICAgQWN0aW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFRyZWFzdXJlVmlldygpLnNldFZpc2libGUodHJ1ZSlcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v5YiH5o2i5qCH562+XHJcbiAgICBzZWxlY3RlZFRhYkNhbGxCYWNrOiBmdW5jdGlvbiAoaW5kZXgpIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJfaW5kZXggPT0gaW5kZXgpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIGlmICh0aGlzLm1hbGxfcm9vdF93bmQgPT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgdGhpcy5maXJzdF9pbmRleCA9IGluZGV4XHJcbiAgICAgICAgbGV0IHR5cGVcclxuICAgICAgICBpZihpbmRleCA9PSAzKXtcclxuICAgICAgICAgICAgaWYodGhpcy5zdWJfdHlwZSl7XHJcbiAgICAgICAgICAgICAgICB0eXBlID0gdGhpcy5zdWJfdHlwZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJfdHlwZSA9IG51bGxcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB0eXBlID0gZ2RhdGEoXCJleGNoYW5nZV9kYXRhXCIsIFwiZGF0YV9zaG9wX2xpc3RcIiwgW2luZGV4XSkuc3VidHlwZVswXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMuc3ViX3R5cGUgPSBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuY3VyX2luZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgdGhpcy5tYWxsX3Njcm9sbF9jb24uYWN0aXZlID0gaW5kZXggIT0gMztcclxuXHJcbiAgICAgICAgdGhpcy5jdXJfdGFiID0gdGhpcy50YWJfaW5mb19saXN0W2luZGV4IC0gMV07XHJcbiAgICAgICAgLy/lrrnplJnml6fniYjmnKzkuIDkupvot7Povazpl67pophcclxuICAgICAgICBpZiAodGhpcy5jdXJfdGFiID09IG51bGwpIHtcclxuICAgICAgICAgICAgaW5kZXggPSAxO1xyXG4gICAgICAgICAgICB0aGlzLmN1cl9pbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgICB0aGlzLmN1cl90YWIgPSB0aGlzLnRhYl9pbmZvX2xpc3RbaW5kZXggLSAxXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudGltZV9ydC5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudGltZV9kb3duX3RleHRfcnQubm9kZS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRpcHNfYnRuLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmhhc1NvbihpbmRleCkpIHtcclxuICAgICAgICAgICAgdGhpcy5idG4uYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZ29vZF9jb25zLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc29uX3BhbmVsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgTWFsbFNvblBhbmVsID0gcmVxdWlyZShcIm1hbGxfc29uX3BhbmVsXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zb25fcGFuZWwgPSBuZXcgTWFsbFNvblBhbmVsKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvbl9wYW5lbC5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvbl9wYW5lbC5zZXRQYXJlbnQodGhpcy5tYWxsX2NvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvbl9wYW5lbC5zZXRWaXNpYmxlU3RhdHVzKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubWFsbF9zY3JvbGxfY29uLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNvbl9wYW5lbC5zZXRMaXN0KGdkYXRhKFwiZXhjaGFuZ2VfZGF0YVwiLCBcImRhdGFfc2hvcF9saXN0XCIsIFtpbmRleF0pLnN1YnR5cGUpO1xyXG4gICAgICAgICAgICB0aGlzLnNvbl9wYW5lbC5vcGVuQnlJZCh0eXBlKTtcclxuICAgICAgICAgICAgdGhpcy5idG4uYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZ29vZF9jb25zLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmNvaW4ubm9kZS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jb3VudC5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hfY291bnQubGFiZWwgPSBcIlwiO1xyXG4gICAgICAgICAgICB0aGlzLmFkZF9idG4uYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleCA8PSA0KSB7XHJcbiAgICAgICAgICAgIGlmIChpbmRleCAhPSA0ICYmIGluZGV4ICE9IDIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnRuLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb2luLm5vZGUuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY291bnQubm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2NvdW50LmxhYmVsID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkX2J0bi5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cl90YWIuaXNfZmlyc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwuc2VuZGVyMTM0MDEoaW5kZXgpOyAvL+iOt+WPluaZrumAmuWVhuW6l+eahOmZkOi0reasoeaVsFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5zZXREYXRhKHRoaXMuZGF0YV9saXN0W3RoaXMuY3VyX2luZGV4XSwgZnVuY3Rpb24gKGNlbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5NYWxsQnV5V2luZG93KHRydWUsIGNlbGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ0bi5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb2luLm5vZGUuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY291bnQubm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRfYnRuLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYoaW5kZXggPT0gMil7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aXBzX2J0bi5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cl90YWIuaXNfZmlyc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgX3R5cGUgPSBpbmRleFxyXG4gICAgICAgICAgICAgICAgICAgIGlmKF90eXBlID09IDQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdHlwZSA9IE1hbGxDb25zdC5NYWxsVHlwZS5Ta2lsbFNob3BcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJsLnNlbmRlcjEzNDAzKF90eXBlKTsgLy/ojrflj5bnpZ7np5gv56We5qC85ZWG5bqX5YiX6KGoXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGluZGV4ID09IDQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZSA9IHRoaXMuZGF0YV9saXN0W3RoaXMuY3VyX2luZGV4XS5yZWZyZXNoX3RpbWUgLSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodGltZSA+IDApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRMZXNzVGltZSh0aW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VGltZUZvcm1hdFN0cmluZygwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJsLnNlbmRlcjEzNDAzKE1hbGxDb25zdC5NYWxsVHlwZS5Ta2lsbFNob3ApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRSZXNldENvdW50KHRoaXMuZGF0YV9saXN0W3RoaXMuY3VyX2luZGV4XSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5zZXREYXRhKHRoaXMuZGF0YV9saXN0W3RoaXMuY3VyX2luZGV4XS5pdGVtX2xpc3QsIGZ1bmN0aW9uIChjZWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuTWFsbEJ1eVdpbmRvdyh0cnVlLCBjZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGl0ZW1fYmlkXHJcbiAgICAgICAgICAgIGlmKGluZGV4ID09IDQpe1xyXG4gICAgICAgICAgICAgICAgaXRlbV9iaWQgPSBnZGF0YShcImV4Y2hhbmdlX2RhdGFcIiwgXCJkYXRhX3Nob3BfbGlzdFwiLCBbTWFsbENvbnN0Lk1hbGxUeXBlLlNraWxsU2hvcF0pLml0ZW1fYmlkO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGl0ZW1fYmlkID0gZ2RhdGEoXCJleGNoYW5nZV9kYXRhXCIsIFwiZGF0YV9zaG9wX2xpc3RcIiwgW2luZGV4XSkuaXRlbV9iaWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB2YXIgaXRlbV9yZXNfcGF0aCA9IFBhdGhUb29sLmdldEl0ZW1SZXMoVXRpbHMuZ2V0SXRlbUNvbmZpZyhpdGVtX2JpZCkuaWNvbik7XHJcbiAgICAgICAgICAgIGlmIChpdGVtX3Jlc19wYXRoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoaXRlbV9yZXNfcGF0aCwgZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvaW4uc3ByaXRlRnJhbWUgPSByZXNfb2JqZWN0O1xyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSWNvbkluZm8oaXRlbV9iaWQpXHJcblxyXG4gICAgICAgICAgICB0aGlzLmdvb2RfY29ucy5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zb25fcGFuZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc29uX3BhbmVsLnNldFZpc2libGVTdGF0dXMoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgZ2V0Q29uZmlnOiBmdW5jdGlvbiAoaW5kZXgsIGRhdGEpIHtcclxuICAgICAgICB2YXIgY29uZmlnID0gW107XHJcbiAgICAgICAgdmFyIGxpc3QgPSBbXTtcclxuICAgICAgICBpZiAoaW5kZXggPT0gMSkge1xyXG4gICAgICAgICAgICBjb25maWcgPSBVdGlscy5kZWVwQ29weShDb25maWcuZXhjaGFuZ2VfZGF0YS5kYXRhX3Nob3BfZXhjaGFnZV9nb2xkKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09IDIpIHtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgc2hvd19saXN0ID0gW107XHJcbiAgICAgICAgaWYgKGluZGV4ICE9IDQgJiYgaW5kZXggIT0gMikge1xyXG4gICAgICAgICAgICB2YXIgbGlzdCA9IFV0aWxzLmRlZXBDb3B5KGRhdGEuaXRlbV9saXN0KTtcclxuICAgICAgICAgICAgZm9yICh2YXIgYSBpbiBjb25maWcpIHtcclxuICAgICAgICAgICAgICAgIHZhciBqID0gY29uZmlnW2FdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGoudHlwZSA9PSB0aGlzLmN1cl9pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ICYmIFV0aWxzLm5leHQobGlzdCkpIHsgLy/lt7Lnu4/kubDov4fnmoTpmZDotK3nianlk4FcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBsaXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IGxpc3Rba107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoai5pZCA9PSB2Lml0ZW1faWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5leHRbMF0gJiYgdi5leHRbMF0udmFsICE9IG51bGwpIHsgLy/kuI3nrqHmmK/ku4DkuYjpmZDotK0g6LWL5YC85bey6LSt5Lmw5qyh5pWw5bCx5aW95LqGXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGouaGFzX2J1eSA9IHYuZXh0WzBdLnZhbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5zcGxpY2UoaywgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgai5oYXNfYnV5ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBqLmhhc19idXkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3dfbGlzdC5wdXNoKGopXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNob3dfbGlzdDtcclxuICAgIH0sXHJcblxyXG4gICAgLy/liKTmlq3mmK/lkKbmnInlrZDmoIfnrb46e1xyXG4gICAgaGFzU29uOiBmdW5jdGlvbiAoaW5kZXgpIHtcclxuICAgICAgICB2YXIgc3ViX3R5cGUgPSBnZGF0YShcImV4Y2hhbmdlX2RhdGFcIiwgXCJkYXRhX3Nob3BfbGlzdFwiLCBbaW5kZXhdKS5zdWJ0eXBlO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5uZXh0KHN1Yl90eXBlKSAhPSBudWxsXHJcbiAgICB9LFxyXG5cclxuXHJcbiAgICAvL+WIpOaWreaYr+WQpuW8gOWQr+aMiemSrlxyXG4gICAgY2hlY2tCdG5Jc09wZW46IGZ1bmN0aW9uIChpbmRleCkge1xyXG4gICAgICAgIGlmIChpbmRleCA9PSAxKSB7ICAgICAgICAvL+mSu+efs+WVhuWfjlxyXG4gICAgICAgICAgICBpZiAodGhpcy5yb2xlX3ZvLmxldiA+PSBnZGF0YShcImV4Y2hhbmdlX2RhdGFcIiwgXCJkYXRhX3Nob3BfZXhjaGFnZV9jb3N0XCIsIFwib3Blbl9nb2xkX2xldlwiKS52YWwpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09IDIpIHsgICAgICAvL+elnuagvOWVhuW6l1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yb2xlX3ZvLmxldiA+PSBnZGF0YShcImV4Y2hhbmdlX2RhdGFcIiwgXCJkYXRhX3Nob3BfZXhjaGFnZV9jb3N0XCIsIFwib3Blbl9oZXJvX3NvdWxfbGV2XCIpLnZhbClcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gMykgeyAgICAgIC8v56ev5YiGXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfdm8ubGV2ID49IGdkYXRhKFwiZXhjaGFuZ2VfZGF0YVwiLCBcImRhdGFfc2hvcF9leGNoYWdlX2Nvc3RcIiwgXCJvcGVuX3BvaW50X2xldlwiKS52YWwpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09IDQpIHsgICAgICAvL+elnuenmOWVhuW6l1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yb2xlX3ZvLmxldiA+PSBnZGF0YShcImV4Y2hhbmdlX2RhdGFcIiwgXCJkYXRhX3Nob3BfZXhjaGFnZV9jb3N0XCIsIFwib3Blbl9zZWNyZXRfbGV2XCIpLnZhbClcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfSxcclxuICAgIHNldFJlc2V0Q291bnQoZGF0YSl7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzXHJcbiAgICAgICAgaWYoIWRhdGEpcmV0dXJuIDtcclxuICAgICAgICBsZXQgZnJlZV9jb3VudCA9IGRhdGEuZnJlZV9jb3VudCB8fCAwXHJcbiAgICAgICAgbGV0IGJ0bl9zdHIgPSBVdGlscy5USTE4TihcIuWFjei0ueWIt+aWsFwiKVxyXG4gICAgICAgIHRoaXMuYnRuX2ltZy5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIGlmKHNlbGYuY3VyX2luZGV4ID09IDIpeyAgLy/npZ7moLxcclxuICAgICAgICAgICAgaWYoZnJlZV9jb3VudCA8PSAwKXtcclxuICAgICAgICAgICAgICAgIGxldCBhc3NldF9jZmcgPSBDb25maWcuZXhjaGFuZ2VfZGF0YS5kYXRhX3Nob3BfZXhjaGFnZV9jb3N0W1wic291bF9yZXNldF9jb3N0XCJdXHJcbiAgICAgICAgICAgICAgICBpZiAoYXNzZXRfY2ZnKXtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYmlkID0gYXNzZXRfY2ZnLnZhbFswXVswXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gYXNzZXRfY2ZnLnZhbFswXVsxXTtcclxuICAgICAgICAgICAgICAgICAgICBidG5fc3RyID0gbnVtICsgXCLph43nva5cIjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ0bl9pbWcubm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFJlcyhQYXRoVG9vbC5nZXRJdGVtUmVzKFV0aWxzLmdldEl0ZW1Db25maWcoYmlkKS5pY29uKSxmdW5jdGlvbihyZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ0bl9pbWcuc3ByaXRlRnJhbWUgPSByZXNcclxuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZSBpZihzZWxmLmN1cl9pbmRleCA9PSA0KXsgLy/mioDog71cclxuICAgICAgICAgICAgaWYoZnJlZV9jb3VudCA8PSAwKXtcclxuICAgICAgICAgICAgICAgIGxldCAgY29uZmlnID0gQ29uZmlnLmV4Y2hhbmdlX2RhdGEuZGF0YV9zaG9wX2xpc3RbTWFsbENvbnN0Lk1hbGxUeXBlLlNraWxsU2hvcF1cclxuICAgICAgICAgICAgICAgIGlmKGNvbmZpZyl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvc3RfbGlzdCA9IGNvbmZpZy5jb3N0X2xpc3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJpZCA9IGNvc3RfbGlzdFswXVswXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gY29zdF9saXN0WzBdWzFdO1xyXG4gICAgICAgICAgICAgICAgICAgIGJ0bl9zdHIgPSBudW0gKyBcIuWIt+aWsFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnRuX2ltZy5ub2RlLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldEl0ZW1SZXMoVXRpbHMuZ2V0SXRlbUNvbmZpZyhiaWQpLmljb24pLGZ1bmN0aW9uKHJlcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnRuX2ltZy5zcHJpdGVGcmFtZSA9IHJlc1xyXG4gICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBsZXQgYXNzZXRfY2ZnID0gQ29uZmlnLmV4Y2hhbmdlX2RhdGEuZGF0YV9zaG9wX2V4Y2hhZ2VfY29zdFtcInNraWxsX3JlZnJlc2hfZnJlZVwiXSBcclxuICAgICAgICAgICAgICAgIGlmKGFzc2V0X2NmZyl7XHJcbiAgICAgICAgICAgICAgICAgICAgYnRuX3N0ciA9ICBjYy5qcy5mb3JtYXRTdHIoXCIlcyglcy8lcylcIixVdGlscy5USTE4TihcIuWFjei0ueWIt+aWsFwiKSxmcmVlX2NvdW50LGFzc2V0X2NmZy52YWwpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGNvbmZpZyA9IENvbmZpZy5leGNoYW5nZV9kYXRhLmRhdGFfc2hvcF9leGNoYWdlX2Nvc3Quc2tpbGxfcmVmcmVzaF9udW1iZXJcclxuICAgICAgICAgICAgbGV0IG1heF9jb3VudCA9IDAgXHJcbiAgICAgICAgICAgIGlmKGNvbmZpZyl7XHJcbiAgICAgICAgICAgICAgICBtYXhfY291bnQgPSBjb25maWcudmFsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGNvdW50ID0gZGF0YS5jb3VudCB8fCAwXHJcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gY2MuanMuZm9ybWF0U3RyKFwiJXM6JXMvJXNcIixVdGlscy5USTE4TihcIuWIt+aWsOasoeaVsFwiKSwgY291bnQsIG1heF9jb3VudClcclxuICAgICAgICAgICAgc2VsZi50aW1lX2Rvd25fdGV4dF9ydC5zdHJpbmcgPSB0ZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZWxmLmJ0bl9sYWJlbC5zdHJpbmcgPSBidG5fc3RyXHJcbiAgICB9LFxyXG4gICAgc2V0VGFiQnRuVG91Y2hTdGF0dXM6IGZ1bmN0aW9uIChzdGF0dXMsIGluZGV4KSB7XHJcblxyXG4gICAgfSxcclxuXHJcblxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1haWxXaW5kb3c7Il19