|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/role/view/role_body_panel.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, '7026eDDwwdMEYbAb/lu0Q6I', 'role_body_panel');
|
// Scripts/mod/role/view/role_body_panel.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: whjing2012@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 冒险形象
|
// <br/>Create: new Date().toISOString()
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool");
|
|
var RoleController = require("role_controller");
|
|
var RoleHeadItem = require("role_head_item");
|
|
var BaseRole = require("baserole");
|
|
var BackpackController = require("backpack_controller");
|
|
var CommonScrollView = require("common_scrollview");
|
|
var HeroController = require("hero_controller");
|
|
var PartnerCalculate = require("partner_calculate");
|
|
var RoleBodyPanel = cc.Class({
|
"extends": BasePanel,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("roleinfo", "role_body_panel");
|
this.x = 0; //必须设置的两个变量
|
|
this.y = 0;
|
this.data = null;
|
this.has_list = {};
|
this.item_list = {};
|
this.select_bid = 0;
|
},
|
initPanel: function initPanel() {
|
this.setPosition(0, 0);
|
this.scroll_con = this.root_wnd.getChildByName("scroll_con");
|
this.ok_btn = this.root_wnd.getChildByName("ok_btn");
|
this.ok_label = this.ok_btn.getChildByName("Label").getComponent(cc.Label);
|
this.body_con = this.root_wnd.getChildByName("body_con");
|
this.attr_desc = this.root_wnd.getChildByName("attr_con").getChildByName("desc").getComponent(cc.RichText);
|
this.cond_desc = this.root_wnd.getChildByName("cond_con").getChildByName("desc").getComponent(cc.RichText);
|
this.spine = new BaseRole();
|
this.spine.setParent(this.body_con);
|
this.spine.node.setPosition(0, 10);
|
this.spine.scale = 0.6;
|
var setting = {
|
item_class: RoleHeadItem,
|
// 单元类
|
start_x: 0,
|
// 第一个单元的X起点
|
space_x: 4,
|
// x方向的间隔
|
start_y: 0,
|
// 第一个单元的Y起点
|
space_y: 0,
|
// y方向的间隔
|
item_width: 125,
|
// 单元的尺寸width
|
item_height: 145,
|
// 单元的尺寸height
|
row: 0,
|
// 行数,作用于水平滚动类型
|
col: 2,
|
// 列数,作用于垂直滚动类型
|
once_num: 4,
|
need_dynamic: true
|
};
|
var scroll_view_size = cc.size(250, 490);
|
this.item_scrollview = new CommonScrollView();
|
this.item_scrollview.createScroll(this.scroll_con, cc.v2(0, 0), ScrollViewDir.vertical, ScrollViewStartPos.top, scroll_view_size, setting, cc.v2(0.5, 0.5));
|
RoleController.getInstance().send10345();
|
},
|
registerEvent: function registerEvent() {
|
this.ok_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
if (this.select_item) {
|
if (this.select_item.data.status == 1) {
|
RoleController.getInstance().send10346(this.select_bid);
|
} else if (this.cond_msg) {
|
message(this.cond_msg);
|
} else {
|
RoleController.getInstance().send10347(this.select_bid);
|
}
|
}
|
}, this);
|
this.roleVo = RoleController.getInstance().getRoleVo();
|
|
if (!this.role_update_evt) {
|
var RoleEvent = require("role_event");
|
|
this.role_update_evt = this.roleVo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, val) {
|
if (key == "look_id") {
|
this.updateList();
|
}
|
}, this);
|
this.addGlobalEvent(RoleEvent.GetModelList, function (data) {
|
this.updateList(data.list);
|
});
|
}
|
},
|
onShow: function onShow() {},
|
updateList: function updateList(has_list) {
|
if (has_list) {
|
this.has_list = this.has_list || {};
|
|
for (var k = 0; k < has_list.length; ++k) {
|
this.has_list[has_list[k].id] = 1;
|
}
|
} // var list = [];
|
// for (var k in Config.looks_data.data_data) {
|
// var v = Config.looks_data.data_data[k];
|
// if (v.id == this.roleVo.look_id) {
|
// list.push({ bid: v.id, face_id: v.partner_id, name: v.name, use: 1, status: 1, sort: 1100000 - v.id });
|
// } else if (this.has_list[v.id]) {
|
// list.push({ bid: v.id, face_id: v.partner_id, name: v.name, use: 0, status: 1, sort: 100000 - v.id });
|
// } else {
|
// list.push({ bid: v.id, face_id: v.partner_id, name: v.name, use: 0, status: 0, sort: -v.id });
|
// }
|
// }
|
// list.sort(Utils.tableCommonSorter([["use", true], ["show", true], ["id", true]]));
|
|
|
if (this.list == null) {
|
this.list = [];
|
|
for (var _k in Config.looks_data.data_data) {
|
var v = Config.looks_data.data_data[_k];
|
var data = {};
|
data.tips = v.tips;
|
data.bid = v.id;
|
data.skin_id = v.skin_id;
|
data.face_id = v.partner_id;
|
|
if (data.skin_id != 0) {
|
var config = Config.partner_skin_data.data_skin_info[data.skin_id];
|
|
if (config) {
|
data.face_id = config.head_id;
|
}
|
}
|
|
data.name = v.name;
|
|
if (this.has_list) {
|
if (this.has_list[v.id]) {
|
data.status = 1; //拥有
|
} else {
|
data.status = 0; //未拥有
|
}
|
} else {
|
data.status = 0;
|
}
|
|
if (this.roleVo.look_id == v.id) {
|
data.use = 1;
|
} else {
|
data.use = 0;
|
}
|
|
this.list.push(data);
|
}
|
} else {
|
for (var i in this.list) {
|
var _data = this.list[i];
|
|
if (this.roleVo.look_id == _data.bid) {
|
_data.use = 1;
|
} else {
|
_data.use = 0;
|
}
|
}
|
} // this.list.sort(Utils.tableUpperSorter(["use", "status", "bid"]));
|
|
|
this.list.sort(Utils.tableCommonSorter([["use", true], ["status", true], ["bid", true]]));
|
|
if (this.select_bid == 0) {
|
this.select_bid = this.roleVo.look_id;
|
}
|
|
this.item_scrollview.setData(this.list, function (cell) {
|
if (cell.data.status != 1) {
|
message(Utils.TI18N("该形象未解锁"));
|
}
|
|
this.select_bid = cell.data.bid;
|
|
if (this.select_item) {
|
this.select_item.setSelected(false);
|
}
|
|
this.select_item = cell;
|
this.setSelected(cell);
|
}.bind(this), {
|
resObject: this.face_res_object,
|
select_func: this.setSelected.bind(this)
|
});
|
},
|
setSelected: function setSelected(item) {
|
if (item) {
|
item.setSelected(this.select_bid == item.data.bid);
|
|
if (this.select_item == null) {
|
this.select_item = item;
|
}
|
}
|
|
if (this.select_bid != item.data.bid) return;
|
this.spine.setData(BaseRole.type.role, this.select_bid, PlayerAction.show, true, 0.6, {
|
skin_id: item.data.skin_id
|
});
|
var config = Config.looks_data.data_data[this.select_bid];
|
this.attr_desc.string = this.attrString(config);
|
this.cond_desc.string = this.condString(config);
|
|
if (this.select_item.data.status == 1) {
|
this.ok_label.string = Utils.TI18N("更 换");
|
} else {
|
this.ok_label.string = Utils.TI18N("激 活");
|
}
|
},
|
attrString: function attrString(config) {
|
var attr_list = config.attr;
|
|
if (attr_list.length == 0) {
|
return Utils.TI18N("<color=#a95f0f>当前形象无属性加成</color>");
|
}
|
|
var attr_desc = "";
|
|
for (var i = 0, n = attr_list.length; i < n; i++) {
|
var attr = attr_list[i];
|
|
if (i > 0 && i % 2 == 0) {
|
attr_desc += "<br/>";
|
} else if (i > 0) {
|
attr_desc += " ";
|
} // attr_desc += cc.js.formatStr("%s: %d", Config.attr_data.data_key_to_name[attr[0]], attr[1]);
|
|
|
if (PartnerCalculate.isShowPerByStr(attr[0]) == true) {
|
attr_desc += cc.js.formatStr("%s: %d%", Config.attr_data.data_key_to_name[attr[0]], attr[1] * 0.1);
|
} else {
|
attr_desc += cc.js.formatStr("%s: %d", Config.attr_data.data_key_to_name[attr[0]], attr[1]);
|
}
|
}
|
|
return "<color=#a95f0f>" + attr_desc + "</color>";
|
},
|
condString: function condString(config) {
|
this.cond_msg = null;
|
|
if (this.select_item.data.status == 1) {
|
return Utils.TI18N("<color=#249003>当前形象已解锁</color>");
|
}
|
|
var cond_desc = [];
|
|
if (config.star > 0) {
|
// cond_desc.push(cc.js.formatStr("◆ %s达到%d星 <color=#249003>已达成</color>", config.name, config.star));
|
this.cond_msg = cc.js.formatStr(Utils.TI18N("%s未达到%d星"), config.name, config.star);
|
cond_desc.push(cc.js.formatStr(Utils.TI18N("◆ %s达到%d星 <color=#d95014>未达成</color>"), config.name, config.star));
|
}
|
|
if (config.skin_id) {
|
var status = HeroController.getInstance().getModel().isUnlockHeroSkin(config.skin_id);
|
|
if (status) {
|
cond_desc.push(cc.js.formatStr(Utils.TI18N("◆ 解锁皮肤%s <color=#249003>已达成</color>"), config.name));
|
} else {
|
cond_desc.push(cc.js.formatStr(Utils.TI18N("◆ 解锁皮肤%s <color=#d95014>未达成</color>"), config.name));
|
}
|
}
|
|
if (config.lev > 1) {
|
if (this.roleVo.lev >= config.lev) {
|
this.cond_msg = this.cond_msg || Utils.TI18N("等级不足");
|
cond_desc.push(cc.js.formatStr(Utils.TI18N("◆ 玩家等级达到%d <color=#249003>已达成</color>"), config.lev));
|
} else {
|
cond_desc.push(cc.js.formatStr(Utils.TI18N("◆ 玩家等级达到%d <color=#d95014>未达成</color>"), config.lev));
|
}
|
}
|
|
if (config.vip_lev > 0) {
|
if (this.roleVo.vip_lev >= config.vip_lev) {
|
this.cond_msg = this.cond_msg || Utils.TI18N("VIP等级不足");
|
cond_desc.push(cc.js.formatStr(Utils.TI18N("◆ 玩家VIP等级达到%d <color=#249003>已达成</color>"), config.vip_lev));
|
} else {
|
cond_desc.push(cc.js.formatStr(Utils.TI18N("◆ 玩家VIP等级达到%d <color=#d95014>未达成</color>"), config.vip_lev));
|
}
|
}
|
|
for (var i = 0, n = config.expend; i < n; i++) {
|
var loss = config.expend[i];
|
var itemdata = Utils.getItemConfig(loss[0]);
|
|
if (BackpackController.getInstance().getModel().getBackPackItemNumByBid(loss[0]) >= loss[1]) {
|
cond_desc.push(cc.js.formatStr(Utils.TI18N("◆ 拥有%s个%s <color=#249003>已达成</color>"), itemdata.name, loss[1]));
|
} else {
|
cond_desc.push(cc.js.formatStr(Utils.TI18N("◆ 拥有%s个%s <color=#d95014>未达成</color>"), itemdata.name, loss[1]));
|
}
|
}
|
|
return "<color=#a95f0f>" + cond_desc.join("<br/>") + "</color>";
|
},
|
onHide: function onHide() {},
|
onDelete: function onDelete() {
|
if (this.role_update_evt) {
|
this.roleVo.unbind(this.role_update_evt);
|
}
|
|
if (this.item_scrollview) {
|
this.item_scrollview.DeleteMe();
|
}
|
|
this.item_scrollview = null;
|
}
|
});
|
module.exports = RoleBodyPanel;
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxyb2xlXFx2aWV3XFxyb2xlX2JvZHlfcGFuZWwuanMiXSwibmFtZXMiOlsiUGF0aFRvb2wiLCJyZXF1aXJlIiwiUm9sZUNvbnRyb2xsZXIiLCJSb2xlSGVhZEl0ZW0iLCJCYXNlUm9sZSIsIkJhY2twYWNrQ29udHJvbGxlciIsIkNvbW1vblNjcm9sbFZpZXciLCJIZXJvQ29udHJvbGxlciIsIlBhcnRuZXJDYWxjdWxhdGUiLCJSb2xlQm9keVBhbmVsIiwiY2MiLCJDbGFzcyIsIkJhc2VQYW5lbCIsImN0b3IiLCJwcmVmYWJQYXRoIiwiZ2V0UHJlZmFiUGF0aCIsIngiLCJ5IiwiZGF0YSIsImhhc19saXN0IiwiaXRlbV9saXN0Iiwic2VsZWN0X2JpZCIsImluaXRQYW5lbCIsInNldFBvc2l0aW9uIiwic2Nyb2xsX2NvbiIsInJvb3Rfd25kIiwiZ2V0Q2hpbGRCeU5hbWUiLCJva19idG4iLCJva19sYWJlbCIsImdldENvbXBvbmVudCIsIkxhYmVsIiwiYm9keV9jb24iLCJhdHRyX2Rlc2MiLCJSaWNoVGV4dCIsImNvbmRfZGVzYyIsInNwaW5lIiwic2V0UGFyZW50Iiwibm9kZSIsInNjYWxlIiwic2V0dGluZyIsIml0ZW1fY2xhc3MiLCJzdGFydF94Iiwic3BhY2VfeCIsInN0YXJ0X3kiLCJzcGFjZV95IiwiaXRlbV93aWR0aCIsIml0ZW1faGVpZ2h0Iiwicm93IiwiY29sIiwib25jZV9udW0iLCJuZWVkX2R5bmFtaWMiLCJzY3JvbGxfdmlld19zaXplIiwic2l6ZSIsIml0ZW1fc2Nyb2xsdmlldyIsImNyZWF0ZVNjcm9sbCIsInYyIiwiU2Nyb2xsVmlld0RpciIsInZlcnRpY2FsIiwiU2Nyb2xsVmlld1N0YXJ0UG9zIiwidG9wIiwiZ2V0SW5zdGFuY2UiLCJzZW5kMTAzNDUiLCJyZWdpc3RlckV2ZW50Iiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwic2VsZWN0X2l0ZW0iLCJzdGF0dXMiLCJzZW5kMTAzNDYiLCJjb25kX21zZyIsIm1lc3NhZ2UiLCJzZW5kMTAzNDciLCJyb2xlVm8iLCJnZXRSb2xlVm8iLCJyb2xlX3VwZGF0ZV9ldnQiLCJSb2xlRXZlbnQiLCJiaW5kIiwiRXZlbnRJZCIsIlVQREFURV9ST0xFX0FUVFJJQlVURSIsImtleSIsInZhbCIsInVwZGF0ZUxpc3QiLCJhZGRHbG9iYWxFdmVudCIsIkdldE1vZGVsTGlzdCIsImxpc3QiLCJvblNob3ciLCJrIiwibGVuZ3RoIiwiaWQiLCJDb25maWciLCJsb29rc19kYXRhIiwiZGF0YV9kYXRhIiwidiIsInRpcHMiLCJiaWQiLCJza2luX2lkIiwiZmFjZV9pZCIsInBhcnRuZXJfaWQiLCJjb25maWciLCJwYXJ0bmVyX3NraW5fZGF0YSIsImRhdGFfc2tpbl9pbmZvIiwiaGVhZF9pZCIsIm5hbWUiLCJsb29rX2lkIiwidXNlIiwicHVzaCIsImkiLCJzb3J0IiwiVXRpbHMiLCJ0YWJsZUNvbW1vblNvcnRlciIsInNldERhdGEiLCJjZWxsIiwiVEkxOE4iLCJzZXRTZWxlY3RlZCIsInJlc09iamVjdCIsImZhY2VfcmVzX29iamVjdCIsInNlbGVjdF9mdW5jIiwiaXRlbSIsInR5cGUiLCJyb2xlIiwiUGxheWVyQWN0aW9uIiwic2hvdyIsInN0cmluZyIsImF0dHJTdHJpbmciLCJjb25kU3RyaW5nIiwiYXR0cl9saXN0IiwiYXR0ciIsIm4iLCJpc1Nob3dQZXJCeVN0ciIsImpzIiwiZm9ybWF0U3RyIiwiYXR0cl9kYXRhIiwiZGF0YV9rZXlfdG9fbmFtZSIsInN0YXIiLCJnZXRNb2RlbCIsImlzVW5sb2NrSGVyb1NraW4iLCJsZXYiLCJ2aXBfbGV2IiwiZXhwZW5kIiwibG9zcyIsIml0ZW1kYXRhIiwiZ2V0SXRlbUNvbmZpZyIsImdldEJhY2tQYWNrSXRlbU51bUJ5QmlkIiwiam9pbiIsIm9uSGlkZSIsIm9uRGVsZXRlIiwidW5iaW5kIiwiRGVsZXRlTWUiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztB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RSxrQkFBWSxDQUVuQixDQXRQd0I7QUF3UHpCQyxFQUFBQSxRQUFRLEVBQUUsb0JBQVk7QUFDbEIsUUFBSSxLQUFLdkUsZUFBVCxFQUEwQjtBQUN0QixXQUFLRixNQUFMLENBQVkwRSxNQUFaLENBQW1CLEtBQUt4RSxlQUF4QjtBQUNIOztBQUNELFFBQUksS0FBS3RCLGVBQVQsRUFBMEI7QUFDdEIsV0FBS0EsZUFBTCxDQUFxQitGLFFBQXJCO0FBQ0g7O0FBQ0QsU0FBSy9GLGVBQUwsR0FBdUIsSUFBdkI7QUFDSDtBQWhRd0IsQ0FBVCxDQUFwQjtBQW1RQWdHLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjdJLGFBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogd2hqaW5nMjAxMkBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDlhpLpmanlvaLosaFcbi8vIDxici8+Q3JlYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XG52YXIgUm9sZUhlYWRJdGVtID0gcmVxdWlyZShcInJvbGVfaGVhZF9pdGVtXCIpO1xudmFyIEJhc2VSb2xlID0gcmVxdWlyZShcImJhc2Vyb2xlXCIpO1xudmFyIEJhY2twYWNrQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYWNrcGFja19jb250cm9sbGVyXCIpO1xudmFyIENvbW1vblNjcm9sbFZpZXcgPSByZXF1aXJlKFwiY29tbW9uX3Njcm9sbHZpZXdcIik7XG52YXIgSGVyb0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpO1xudmFyIFBhcnRuZXJDYWxjdWxhdGUgPSByZXF1aXJlKFwicGFydG5lcl9jYWxjdWxhdGVcIik7XG5cbnZhciBSb2xlQm9keVBhbmVsID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VQYW5lbCxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJyb2xlaW5mb1wiLCBcInJvbGVfYm9keV9wYW5lbFwiKTtcbiAgICAgICAgdGhpcy54ID0gMDsvL+W/hemhu+iuvue9rueahOS4pOS4quWPmOmHj1xuICAgICAgICB0aGlzLnkgPSAwO1xuICAgICAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLmhhc19saXN0ID0ge307XG4gICAgICAgIHRoaXMuaXRlbV9saXN0ID0ge307XG4gICAgICAgIHRoaXMuc2VsZWN0X2JpZCA9IDA7XG4gICAgfSxcblxuICAgIGluaXRQYW5lbDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKDAsIDApO1xuICAgICAgICB0aGlzLnNjcm9sbF9jb24gPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwic2Nyb2xsX2NvblwiKTtcbiAgICAgICAgdGhpcy5va19idG4gPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwib2tfYnRuXCIpO1xuICAgICAgICB0aGlzLm9rX2xhYmVsID0gdGhpcy5va19idG4uZ2V0Q2hpbGRCeU5hbWUoXCJMYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLmJvZHlfY29uID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcImJvZHlfY29uXCIpO1xuICAgICAgICB0aGlzLmF0dHJfZGVzYyA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJhdHRyX2NvblwiKS5nZXRDaGlsZEJ5TmFtZShcImRlc2NcIikuZ2V0Q29tcG9uZW50KGNjLlJpY2hUZXh0KTtcbiAgICAgICAgdGhpcy5jb25kX2Rlc2MgPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwiY29uZF9jb25cIikuZ2V0Q2hpbGRCeU5hbWUoXCJkZXNjXCIpLmdldENvbXBvbmVudChjYy5SaWNoVGV4dCk7XG4gICAgICAgIHRoaXMuc3BpbmUgPSBuZXcgQmFzZVJvbGUoKTtcbiAgICAgICAgdGhpcy5zcGluZS5zZXRQYXJlbnQodGhpcy5ib2R5X2Nvbik7XG4gICAgICAgIHRoaXMuc3BpbmUubm9kZS5zZXRQb3NpdGlvbigwLCAxMCk7XG4gICAgICAgIHRoaXMuc3BpbmUuc2NhbGUgPSAwLjY7XG4gICAgICAgIHZhciBzZXR0aW5nID0ge1xuICAgICAgICAgICAgaXRlbV9jbGFzczogUm9sZUhlYWRJdGVtLCAgICAgIC8vIOWNleWFg+exu1xuICAgICAgICAgICAgc3RhcnRfeDogMCwgICAgICAgICAgICAgICAgICAgIC8vIOesrOS4gOS4quWNleWFg+eahFjotbfngrlcbiAgICAgICAgICAgIHNwYWNlX3g6IDQsICAgICAgICAgICAgICAgICAgICAvLyB45pa55ZCR55qE6Ze06ZqUXG4gICAgICAgICAgICBzdGFydF95OiAwLCAgICAgICAgICAgICAgICAgICAgLy8g56ys5LiA5Liq5Y2V5YWD55qEWei1t+eCuVxuICAgICAgICAgICAgc3BhY2VfeTogMCwgICAgICAgICAgICAgICAgICAgLy8geeaWueWQkeeahOmXtOmalFxuICAgICAgICAgICAgaXRlbV93aWR0aDogMTI1LCAgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuHdpZHRoXG4gICAgICAgICAgICBpdGVtX2hlaWdodDogMTQ1LCAgICAgICAgICAgICAgLy8g5Y2V5YWD55qE5bC65a+4aGVpZ2h0XG4gICAgICAgICAgICByb3c6IDAsICAgICAgICAgICAgICAgICAgICAgICAgLy8g6KGM5pWw77yM5L2c55So5LqO5rC05bmz5rua5Yqo57G75Z6LXG4gICAgICAgICAgICBjb2w6IDIsICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiX5pWw77yM5L2c55So5LqO5Z6C55u05rua5Yqo57G75Z6LXG4gICAgICAgICAgICBvbmNlX251bTogNCxcbiAgICAgICAgICAgIG5lZWRfZHluYW1pYzogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICB2YXIgc2Nyb2xsX3ZpZXdfc2l6ZSA9IGNjLnNpemUoMjUwLCA0OTApO1xuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldyA9IG5ldyBDb21tb25TY3JvbGxWaWV3KClcbiAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcuY3JlYXRlU2Nyb2xsKHRoaXMuc2Nyb2xsX2NvbiwgY2MudjIoMCwgMCksIFNjcm9sbFZpZXdEaXIudmVydGljYWwsIFNjcm9sbFZpZXdTdGFydFBvcy50b3AsIHNjcm9sbF92aWV3X3NpemUsIHNldHRpbmcsIGNjLnYyKDAuNSwgMC41KSk7XG4gICAgICAgIFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2VuZDEwMzQ1KCk7XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyRXZlbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5va19idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RfaXRlbSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdF9pdGVtLmRhdGEuc3RhdHVzID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZW5kMTAzNDYodGhpcy5zZWxlY3RfYmlkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZF9tc2cpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSh0aGlzLmNvbmRfbXNnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNlbmQxMDM0Nyh0aGlzLnNlbGVjdF9iaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIHRoaXMucm9sZVZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgaWYgKCF0aGlzLnJvbGVfdXBkYXRlX2V2dCkge1xuICAgICAgICAgICAgdmFyIFJvbGVFdmVudCA9IHJlcXVpcmUoXCJyb2xlX2V2ZW50XCIpO1xuICAgICAgICAgICAgdGhpcy5yb2xlX3VwZGF0ZV9ldnQgPSB0aGlzLnJvbGVWby5iaW5kKEV2ZW50SWQuVVBEQVRFX1JPTEVfQVRUUklCVVRFLCAoZnVuY3Rpb24gKGtleSwgdmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PSBcImxvb2tfaWRcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxpc3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KFJvbGVFdmVudC5HZXRNb2RlbExpc3QsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVMaXN0KGRhdGEubGlzdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIG9uU2hvdzogZnVuY3Rpb24gKCkge1xuICAgIH0sXG5cbiAgICB1cGRhdGVMaXN0OiBmdW5jdGlvbiAoaGFzX2xpc3QpIHtcbiAgICAgICAgaWYgKGhhc19saXN0KSB7XG4gICAgICAgICAgICB0aGlzLmhhc19saXN0ID0gdGhpcy5oYXNfbGlzdCB8fCB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgaGFzX2xpc3QubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc19saXN0W2hhc19saXN0W2tdLmlkXSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdmFyIGxpc3QgPSBbXTtcbiAgICAgICAgLy8gZm9yICh2YXIgayBpbiBDb25maWcubG9va3NfZGF0YS5kYXRhX2RhdGEpIHtcbiAgICAgICAgLy8gICAgIHZhciB2ID0gQ29uZmlnLmxvb2tzX2RhdGEuZGF0YV9kYXRhW2tdO1xuICAgICAgICAvLyAgICAgaWYgKHYuaWQgPT0gdGhpcy5yb2xlVm8ubG9va19pZCkge1xuICAgICAgICAvLyAgICAgICAgIGxpc3QucHVzaCh7IGJpZDogdi5pZCwgZmFjZV9pZDogdi5wYXJ0bmVyX2lkLCBuYW1lOiB2Lm5hbWUsIHVzZTogMSwgc3RhdHVzOiAxLCBzb3J0OiAxMTAwMDAwIC0gdi5pZCB9KTtcbiAgICAgICAgLy8gICAgIH0gZWxzZSBpZiAodGhpcy5oYXNfbGlzdFt2LmlkXSkge1xuICAgICAgICAvLyAgICAgICAgIGxpc3QucHVzaCh7IGJpZDogdi5pZCwgZmFjZV9pZDogdi5wYXJ0bmVyX2lkLCBuYW1lOiB2Lm5hbWUsIHVzZTogMCwgc3RhdHVzOiAxLCBzb3J0OiAxMDAwMDAgLSB2LmlkIH0pO1xuICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgICAgICBsaXN0LnB1c2goeyBiaWQ6IHYuaWQsIGZhY2VfaWQ6IHYucGFydG5lcl9pZCwgbmFtZTogdi5uYW1lLCB1c2U6IDAsIHN0YXR1czogMCwgc29ydDogLXYuaWQgfSk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gbGlzdC5zb3J0KFV0aWxzLnRhYmxlQ29tbW9uU29ydGVyKFtbXCJ1c2VcIiwgdHJ1ZV0sIFtcInNob3dcIiwgdHJ1ZV0sIFtcImlkXCIsIHRydWVdXSkpO1xuICAgICAgICBpZiAodGhpcy5saXN0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgayBpbiBDb25maWcubG9va3NfZGF0YS5kYXRhX2RhdGEpIHtcbiAgICAgICAgICAgICAgICBsZXQgdiA9IENvbmZpZy5sb29rc19kYXRhLmRhdGFfZGF0YVtrXTtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgIGRhdGEudGlwcyA9IHYudGlwcztcbiAgICAgICAgICAgICAgICBkYXRhLmJpZCA9IHYuaWQ7XG4gICAgICAgICAgICAgICAgZGF0YS5za2luX2lkID0gdi5za2luX2lkO1xuICAgICAgICAgICAgICAgIGRhdGEuZmFjZV9pZCA9IHYucGFydG5lcl9pZDtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5za2luX2lkICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX3NraW5fZGF0YS5kYXRhX3NraW5faW5mb1tkYXRhLnNraW5faWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZhY2VfaWQgPSBjb25maWcuaGVhZF9pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYXRhLm5hbWUgPSB2Lm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzX2xpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzX2xpc3Rbdi5pZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc3RhdHVzID0gMTsgICAgLy/mi6XmnIlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc3RhdHVzID0gMDsgICAgLy/mnKrmi6XmnIlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc3RhdHVzID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucm9sZVZvLmxvb2tfaWQgPT0gdi5pZCkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnVzZSA9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS51c2UgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmxpc3QucHVzaChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5saXN0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmxpc3RbaV07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucm9sZVZvLmxvb2tfaWQgPT0gZGF0YS5iaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS51c2UgPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEudXNlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGlzLmxpc3Quc29ydChVdGlscy50YWJsZVVwcGVyU29ydGVyKFtcInVzZVwiLCBcInN0YXR1c1wiLCBcImJpZFwiXSkpO1xuICAgICAgICB0aGlzLmxpc3Quc29ydChVdGlscy50YWJsZUNvbW1vblNvcnRlcihbW1widXNlXCIsIHRydWVdLCBbXCJzdGF0dXNcIiwgdHJ1ZV0sIFtcImJpZFwiLCB0cnVlXV0pKTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0X2JpZCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdF9iaWQgPSB0aGlzLnJvbGVWby5sb29rX2lkO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcuc2V0RGF0YSh0aGlzLmxpc3QsIChmdW5jdGlvbiAoY2VsbCkge1xuICAgICAgICAgICAgaWYgKGNlbGwuZGF0YS5zdGF0dXMgIT0gMSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UoVXRpbHMuVEkxOE4oXCLor6XlvaLosaHmnKrop6PplIFcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZWxlY3RfYmlkID0gY2VsbC5kYXRhLmJpZDtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdF9pdGVtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RfaXRlbS5zZXRTZWxlY3RlZChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlbGVjdF9pdGVtID0gY2VsbDtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWQoY2VsbCk7XG4gICAgICAgIH0pLmJpbmQodGhpcyksIHsgcmVzT2JqZWN0OiB0aGlzLmZhY2VfcmVzX29iamVjdCwgc2VsZWN0X2Z1bmM6IHRoaXMuc2V0U2VsZWN0ZWQuYmluZCh0aGlzKSB9KTtcbiAgICB9LFxuXG4gICAgc2V0U2VsZWN0ZWQ6IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICBpdGVtLnNldFNlbGVjdGVkKHRoaXMuc2VsZWN0X2JpZCA9PSBpdGVtLmRhdGEuYmlkKVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0X2l0ZW0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0X2l0ZW0gPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdF9iaWQgIT0gaXRlbS5kYXRhLmJpZCkgcmV0dXJuXG4gICAgICAgIHRoaXMuc3BpbmUuc2V0RGF0YShCYXNlUm9sZS50eXBlLnJvbGUsIHRoaXMuc2VsZWN0X2JpZCwgUGxheWVyQWN0aW9uLnNob3csIHRydWUsIDAuNiwgeyBza2luX2lkOiBpdGVtLmRhdGEuc2tpbl9pZCB9KTtcbiAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5sb29rc19kYXRhLmRhdGFfZGF0YVt0aGlzLnNlbGVjdF9iaWRdO1xuICAgICAgICB0aGlzLmF0dHJfZGVzYy5zdHJpbmcgPSB0aGlzLmF0dHJTdHJpbmcoY29uZmlnKTtcbiAgICAgICAgdGhpcy5jb25kX2Rlc2Muc3RyaW5nID0gdGhpcy5jb25kU3RyaW5nKGNvbmZpZyk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdF9pdGVtLmRhdGEuc3RhdHVzID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMub2tfbGFiZWwuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmm7Qg5o2iXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5va19sYWJlbC5zdHJpbmcgPSBVdGlscy5USTE4TihcIua/gCDmtLtcIik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYXR0clN0cmluZzogZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICB2YXIgYXR0cl9saXN0ID0gY29uZmlnLmF0dHI7XG4gICAgICAgIGlmIChhdHRyX2xpc3QubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5USTE4TihcIjxjb2xvcj0jYTk1ZjBmPuW9k+WJjeW9ouixoeaXoOWxnuaAp+WKoOaIkDwvY29sb3I+XCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhdHRyX2Rlc2MgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbiA9IGF0dHJfbGlzdC5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBhdHRyID0gYXR0cl9saXN0W2ldO1xuICAgICAgICAgICAgaWYgKGkgPiAwICYmIGkgJSAyID09IDApIHtcbiAgICAgICAgICAgICAgICBhdHRyX2Rlc2MgKz0gXCI8YnIvPlwiO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgIGF0dHJfZGVzYyArPSBcIiAgICAgXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhdHRyX2Rlc2MgKz0gY2MuanMuZm9ybWF0U3RyKFwiJXM6ICVkXCIsIENvbmZpZy5hdHRyX2RhdGEuZGF0YV9rZXlfdG9fbmFtZVthdHRyWzBdXSwgYXR0clsxXSk7XG5cbiAgICAgICAgICAgIGlmIChQYXJ0bmVyQ2FsY3VsYXRlLmlzU2hvd1BlckJ5U3RyKGF0dHJbMF0pID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBhdHRyX2Rlc2MgKz0gY2MuanMuZm9ybWF0U3RyKFwiJXM6ICVkJVwiLCBDb25maWcuYXR0cl9kYXRhLmRhdGFfa2V5X3RvX25hbWVbYXR0clswXV0sIGF0dHJbMV0gKiAwLjEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXR0cl9kZXNjICs9IGNjLmpzLmZvcm1hdFN0cihcIiVzOiAlZFwiLCBDb25maWcuYXR0cl9kYXRhLmRhdGFfa2V5X3RvX25hbWVbYXR0clswXV0sIGF0dHJbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIjxjb2xvcj0jYTk1ZjBmPlwiICsgYXR0cl9kZXNjICsgXCI8L2NvbG9yPlwiO1xuICAgIH0sXG5cbiAgICBjb25kU3RyaW5nOiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZF9tc2cgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RfaXRlbS5kYXRhLnN0YXR1cyA9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuVEkxOE4oXCI8Y29sb3I9IzI0OTAwMz7lvZPliY3lvaLosaHlt7Lop6PplIE8L2NvbG9yPlwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uZF9kZXNjID0gW107XG4gICAgICAgIGlmIChjb25maWcuc3RhciA+IDApIHtcbiAgICAgICAgICAgIC8vIGNvbmRfZGVzYy5wdXNoKGNjLmpzLmZvcm1hdFN0cihcIuKXhiAlc+i+vuWIsCVk5pifIDxjb2xvcj0jMjQ5MDAzPuW3sui+vuaIkDwvY29sb3I+XCIsIGNvbmZpZy5uYW1lLCBjb25maWcuc3RhcikpO1xuICAgICAgICAgICAgdGhpcy5jb25kX21zZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIiVz5pyq6L6+5YiwJWTmmJ9cIiksIGNvbmZpZy5uYW1lLCBjb25maWcuc3Rhcik7XG4gICAgICAgICAgICBjb25kX2Rlc2MucHVzaChjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLil4YgJXPovr7liLAlZOaYnyAgICA8Y29sb3I9I2Q5NTAxND7mnKrovr7miJA8L2NvbG9yPlwiKSwgY29uZmlnLm5hbWUsIGNvbmZpZy5zdGFyKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5za2luX2lkKSB7XG4gICAgICAgICAgICBsZXQgc3RhdHVzID0gSGVyb0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmlzVW5sb2NrSGVyb1NraW4oY29uZmlnLnNraW5faWQpO1xuICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIGNvbmRfZGVzYy5wdXNoKGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuKXhiDop6PplIHnmq7ogqQlcyAgICA8Y29sb3I9IzI0OTAwMz7lt7Lovr7miJA8L2NvbG9yPlwiKSwgY29uZmlnLm5hbWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uZF9kZXNjLnB1c2goY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi4peGIOino+mUgeearuiCpCVzICAgIDxjb2xvcj0jZDk1MDE0Puacqui+vuaIkDwvY29sb3I+XCIpLCBjb25maWcubmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcubGV2ID4gMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm9sZVZvLmxldiA+PSBjb25maWcubGV2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25kX21zZyA9IHRoaXMuY29uZF9tc2cgfHwgVXRpbHMuVEkxOE4oXCLnrYnnuqfkuI3otrNcIik7XG4gICAgICAgICAgICAgICAgY29uZF9kZXNjLnB1c2goY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi4peGIOeOqeWutuetiee6p+i+vuWIsCVkICAgICA8Y29sb3I9IzI0OTAwMz7lt7Lovr7miJA8L2NvbG9yPlwiKSwgY29uZmlnLmxldikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25kX2Rlc2MucHVzaChjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLil4Yg546p5a62562J57qn6L6+5YiwJWQgICAgIDxjb2xvcj0jZDk1MDE0Puacqui+vuaIkDwvY29sb3I+XCIpLCBjb25maWcubGV2KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy52aXBfbGV2ID4gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm9sZVZvLnZpcF9sZXYgPj0gY29uZmlnLnZpcF9sZXYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmRfbXNnID0gdGhpcy5jb25kX21zZyB8fCBVdGlscy5USTE4TihcIlZJUOetiee6p+S4jei2s1wiKTtcbiAgICAgICAgICAgICAgICBjb25kX2Rlc2MucHVzaChjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLil4Yg546p5a62VklQ562J57qn6L6+5YiwJWQgICA8Y29sb3I9IzI0OTAwMz7lt7Lovr7miJA8L2NvbG9yPlwiKSwgY29uZmlnLnZpcF9sZXYpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uZF9kZXNjLnB1c2goY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi4peGIOeOqeWutlZJUOetiee6p+i+vuWIsCVkICAgPGNvbG9yPSNkOTUwMTQ+5pyq6L6+5oiQPC9jb2xvcj5cIiksIGNvbmZpZy52aXBfbGV2KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSBjb25maWcuZXhwZW5kOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbG9zcyA9IGNvbmZpZy5leHBlbmRbaV07XG4gICAgICAgICAgICBsZXQgaXRlbWRhdGEgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGxvc3NbMF0pO1xuICAgICAgICAgICAgaWYgKEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0QmFja1BhY2tJdGVtTnVtQnlCaWQobG9zc1swXSkgPj0gbG9zc1sxXSkge1xuICAgICAgICAgICAgICAgIGNvbmRfZGVzYy5wdXNoKGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuKXhiDmi6XmnIklc+S4qiVzICAgPGNvbG9yPSMyNDkwMDM+5bey6L6+5oiQPC9jb2xvcj5cIiksIGl0ZW1kYXRhLm5hbWUsIGxvc3NbMV0pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uZF9kZXNjLnB1c2goY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi4peGIOaLpeaciSVz5LiqJXMgICA8Y29sb3I9I2Q5NTAxND7mnKrovr7miJA8L2NvbG9yPlwiKSwgaXRlbWRhdGEubmFtZSwgbG9zc1sxXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIjxjb2xvcj0jYTk1ZjBmPlwiICsgY29uZF9kZXNjLmpvaW4oXCI8YnIvPlwiKSArIFwiPC9jb2xvcj5cIjtcbiAgICB9LFxuXG4gICAgb25IaWRlOiBmdW5jdGlvbiAoKSB7XG5cbiAgICB9LFxuXG4gICAgb25EZWxldGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucm9sZV91cGRhdGVfZXZ0KSB7XG4gICAgICAgICAgICB0aGlzLnJvbGVWby51bmJpbmQodGhpcy5yb2xlX3VwZGF0ZV9ldnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLml0ZW1fc2Nyb2xsdmlldykge1xuICAgICAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcuRGVsZXRlTWUoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3ID0gbnVsbFxuICAgIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJvbGVCb2R5UGFuZWw7Il19
|