|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/backpack/view/backpack_batchuse_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, '7559clcpgVKtJy66gBOyogW', 'backpack_batchuse_window');
|
// Scripts/mod/backpack/view/backpack_batchuse_window.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 这里是描述这个窗体的作用的
|
// <br/>Create: 2019-04-13 09:32:44
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool");
|
|
var RoleController = require("role_controller");
|
|
var BackPackConst = require("backpack_const");
|
|
var Backpack_batchuseWindow = cc.Class({
|
"extends": BaseView,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("backpack", "batchuse_panel_view");
|
this.viewTag = SCENE_TAG.msg; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
|
|
this.win_type = WinType.Mini; //是否是全屏窗体 WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
|
|
this.ctrl = arguments[0];
|
this.model = this.ctrl.getModel();
|
},
|
// 初始化一些配置数据,可以用于声明一些变量之类的
|
initConfig: function initConfig() {
|
this.role_vo = RoleController.getInstance().getRoleVo();
|
this.cur_selected_sum = 0; // 当前选中消耗的数量
|
|
this.select_goods = null;
|
},
|
// 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
|
openCallBack: function openCallBack() {
|
this.background = this.root_wnd.getChildByName("background");
|
this.main_container = this.root_wnd.getChildByName("main_container");
|
this.close_btn = this.main_container.getChildByName("close_btn");
|
this.item = ItemsPool.getInstance().getItem("backpack_item");
|
this.item.initConfig(true, 1, false);
|
this.item.setParent(this.main_container);
|
this.item.show();
|
this.item.setPosition(-200, 140);
|
this.use_btn = this.main_container.getChildByName("use_btn");
|
this.use_btn_lab = this.use_btn.getChildByName("Label").getComponent(cc.Label);
|
this.use_btn_lab.string = Utils.TI18N("使用");
|
this.handle_container = this.main_container.getChildByName("handle_container");
|
this.handle_container_cy = 0; // 如果不是产出资源类的,这个东西要居中父节点
|
|
this.container = this.handle_container.getChildByName("container");
|
this.container_y = this.container.y;
|
this.sub_btn = this.container.getChildByName("sub_btn"); // 减号
|
|
this.add_btn = this.container.getChildByName("add_btn"); // 加号
|
|
this.max_btn = this.container.getChildByName("max_btn"); // 最大值
|
|
this.slider = this.container.getChildByName("slider").getComponent(cc.Slider); // 滑块
|
|
this.progress = this.container.getChildByName("ProgressBar").getComponent(cc.ProgressBar); // this.slider:setBarPercent(20, 80)
|
|
this.value = this.container.getChildByName("value").getComponent(cc.Label); // 使用数量提示
|
|
this.use_title = this.container.getChildByName("title").getComponent(cc.Label); // 使用数量提示
|
|
this.use_title.string = Utils.TI18N("使用数量:");
|
this.extend_container = this.handle_container.getChildByName("extend_container");
|
this.use_item_title = this.extend_container.getChildByName("use_item_title").getComponent(cc.Label);
|
this.use_item_title.string = "";
|
this.use_effect = this.extend_container.getChildByName("use_effect").getComponent(cc.Label);
|
this.title_label = this.main_container.getChildByName("title_label").getComponent(cc.Label);
|
this.title_label.string = Utils.TI18N("批量使用");
|
this.item_name = this.main_container.getChildByName("item_name").getComponent(cc.Label);
|
this.item_own = this.main_container.getChildByName("item_own").getComponent(cc.Label);
|
},
|
// 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
|
registerEvent: function registerEvent() {
|
Utils.onTouchEnd(this.close_btn, function () {
|
this.ctrl.openBatchUseItemView(false);
|
}.bind(this), 2);
|
Utils.onTouchEnd(this.use_btn, function () {
|
if (this.item_vo == null || this.item_vo.config == null) return;
|
this.cur_selected_sum = Math.min(this.cur_selected_sum, this.item_vo.quantity);
|
|
if (this.cur_selected_sum == 0) {
|
message(Utils.TI18N("当前数量不能为0"));
|
return;
|
}
|
|
if (this.type == BackPackConst.ItemConsumeType.use) {
|
this.ctrl.sender10515(this.item_vo.id, this.cur_selected_sum, this.select_goods);
|
} else {
|
// 金币市场的物品出售
|
if (this.select_goods && this.select_goods.type && this.select_goods.type == 1) {
|
// MarketController:getInstance():sender23502( this.item_vo.id,this.cur_selected_sum)
|
this.ctrl.openBatchUseItemView(false);
|
return;
|
}
|
|
this.ctrl.sender10522(BackPackConst.Bag_Code.BACKPACK, [{
|
id: this.item_vo.id,
|
bid: this.item_vo.base_id,
|
num: this.cur_selected_sum
|
}]);
|
}
|
}.bind(this), 1);
|
this.slider.node.on("slide", function () {
|
this.setCurUseItemInfoByPercent(this.slider.progress);
|
this.progress.progress = this.slider.progress;
|
}, this);
|
Utils.onTouchEnd(this.sub_btn, function () {
|
if (this.item_vo == null) return;
|
var percent = this.slider.progress;
|
if (percent == 0) return; //已经是最小的了
|
|
if (this.cur_selected_sum == 0) return;
|
this.cur_selected_sum = this.cur_selected_sum - 1;
|
this.setCurUseItemInfoByNum(this.cur_selected_sum);
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.add_btn, function () {
|
if (this.item_vo == null) return;
|
var percent = this.slider.progress;
|
if (percent == 100) return; //已经是最大的了
|
|
if (this.cur_selected_sum >= this.item_vo.quantity) return;
|
this.cur_selected_sum = this.cur_selected_sum + 1;
|
this.setCurUseItemInfoByNum(this.cur_selected_sum);
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.max_btn, function () {
|
if (this.item_vo == null) return;
|
var percent = this.slider.progress;
|
if (percent == 100) return; //已经是最大的了
|
|
if (this.cur_selected_sum >= this.item_vo.quantity) return;
|
this.cur_selected_sum = this.item_vo.quantity;
|
this.setCurUseItemInfoByNum(this.cur_selected_sum);
|
}.bind(this), 1);
|
},
|
// 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
|
openRootWnd: function openRootWnd(params) {
|
var item = params[0];
|
var type = params[1];
|
var select_vo = params[2];
|
this.type = type || BackPackConst.ItemConsumeType.use;
|
this.item_vo = item;
|
this.select_goods = select_vo;
|
|
if (this.item_vo == null || this.item_vo.config == null) {
|
this.ctrl.openBatchUseItemView(false);
|
return;
|
}
|
|
if (this.type == BackPackConst.ItemConsumeType.use) {
|
this.title_label.string = Utils.TI18N("批量使用");
|
this.use_title.string = Utils.TI18N("使用数量:");
|
this.use_btn_lab.string = Utils.TI18N("使用");
|
this.updateItem();
|
} else if (this.type == BackPackConst.ItemConsumeType.resolve) {
|
this.title_label.string = Utils.TI18N("批量分解");
|
this.use_title.string = Utils.TI18N("分解数量:");
|
this.use_btn_lab.string = Utils.TI18N("分解");
|
this.updateCellItem();
|
} else {
|
this.title_label.string = Utils.TI18N("物品出售");
|
this.use_title.string = Utils.TI18N("出售数量:");
|
this.use_btn_lab.string = Utils.TI18N("出售");
|
this.updateCellItem();
|
}
|
|
this.setUseInfo(100);
|
},
|
// --==============================--
|
// --desc:针对出售类物品的处理
|
// --@return
|
// --==============================--
|
updateCellItem: function updateCellItem() {
|
if (this.item_vo == null || this.item_vo.config == null) return;
|
this.item.setData(this.item_vo.config);
|
this.item_name.string = this.item_vo.config.name;
|
this.item_own.string = cc.js.formatStr(Utils.TI18N("拥有 %s 个"), this.item_vo.quantity);
|
this.cur_selected_sum = this.item_vo.quantity; // 打开面板的时候,都是默认选中最大数量
|
|
this.value.string = this.item_vo.quantity; // 设置最大
|
|
this.slider.progress = 1;
|
this.progress.progress = this.slider.progress;
|
var value = this.item_vo.config.value;
|
|
if (value != null && Utils.next(value) != null) {
|
this.value_config = value[0];
|
if (this.value_config == null || this.value_config[0] == null || typeof this.value_config[0] != "number") return;
|
var base_id = this.value_config[0];
|
var own = 0;
|
var item_config = Utils.getItemConfig(base_id);
|
if (item_config == null) return;
|
|
if (this.value_config[0] == gdata("item_data", "data_assets_label2id", "coin")) {
|
own = this.role_vo.coin;
|
} else if (this.value_config[0] == gdata("item_data", "data_assets_label2id", "hero_soul")) {
|
own = this.role_vo.hero_soul;
|
}
|
|
this.setCurUseItemInfoByPercent(1);
|
}
|
|
if (this.select_goods && this.select_goods.type && this.select_goods.type == 1) {
|
this.value_config = this.select_goods.value_list || {};
|
this.setCurUseItemInfoByPercent(1);
|
}
|
},
|
updateItem: function updateItem() {
|
if (this.item_vo == null || this.item_vo.config == null) return;
|
this.item.setData(this.item_vo.config);
|
this.item_name.string = this.item_vo.config.name;
|
this.item_own.string = cc.js.formatStr(Utils.TI18N("拥有 %s 个"), this.item_vo.quantity);
|
this.cur_selected_sum = this.item_vo.quantity; // 打开面板的时候,都是默认选中最大数量
|
|
this.value.string = this.item_vo.quantity; // 设置最大
|
|
this.slider.progress = 1;
|
this.progress.progress = this.slider.progress; // 如果是产出资产类的
|
|
if (this.isAssetsItem(this.item_vo.config) == true) {
|
this.container.y = this.container_y;
|
this.extend_container.active = true; // 直接取第一个效果吧
|
|
if (this.item_vo.config.effect && Utils.next(this.item_vo.config.effect) != null) {
|
var effect = this.item_vo.config.effect[0];
|
|
if (effect != null && this.role_vo != null) {
|
var own = 0;
|
|
if (effect.effect_type == BackPackConst.item_effect_type.GOLD) {
|
own = this.role_vo.coin;
|
} else if (effect.effect_type == BackPackConst.item_effect_type.COIN) {
|
own = this.role_vo.coin;
|
} else if (effect.effect_type == BackPackConst.item_effect_type.PARTNER_EXP) {
|
own = this.role_vo.partner_exp_all;
|
}
|
}
|
}
|
|
this.setCurUseItemInfoByPercent(1);
|
} else {
|
this.container.y = this.handle_container_cy;
|
this.extend_container.active = false;
|
}
|
},
|
// --==============================--
|
// --desc:设置当前进度的相关数据
|
// --@percent:
|
// --@return
|
// --==============================--
|
setCurUseItemInfoByPercent: function setCurUseItemInfoByPercent(percent) {
|
if (this.item_vo == null) return;
|
this.cur_selected_sum = Math.max(1, Math.floor(percent * this.item_vo.quantity));
|
this.setUseInfo(this.cur_selected_sum);
|
},
|
setCurUseItemInfoByNum: function setCurUseItemInfoByNum(num) {
|
if (this.item_vo == null) return;
|
this.cur_selected_sum = Math.max(1, num);
|
var all_num = Math.max(1, this.item_vo.quantity - 1);
|
var percent = (this.cur_selected_sum - 1) / all_num;
|
this.slider.progress = percent;
|
this.progress.progress = this.slider.progress;
|
this.setUseInfo(this.cur_selected_sum);
|
},
|
setUseInfo: function setUseInfo(sum) {
|
sum = Math.min(this.item_vo.quantity, sum);
|
this.value.string = sum;
|
|
if (this.type == BackPackConst.ItemConsumeType.sell && this.value_config != null) {
|
var base_value = this.value_config[1] || 0;
|
var base_id = this.value_config[0];
|
if (base_id == null) return;
|
var item_config = Utils.getItemConfig(base_id);
|
if (item_config == null) return;
|
this.use_item_title.string = cc.js.formatStr(Utils.TI18N("出售后可获得%s:"), item_config.name);
|
this.use_effect.string = base_value * sum;
|
this.use_effect.node.x = this.use_item_title.node.getContentSize().width + this.use_item_title.node.x;
|
} else if (this.type == BackPackConst.ItemConsumeType.resolve && this.value_config != null) {
|
var base_value = this.value_config[1] || 0;
|
var base_id = this.value_config[0];
|
if (base_id == null) return;
|
var item_config = Utils.getItemConfig(base_id);
|
if (item_config == null) return;
|
this.use_item_title.string = cc.js.formatStr(Utils.TI18N("分解后可获得%s:"), item_config.name);
|
this.use_effect.string = base_value * sum;
|
this.use_effect.node.x = this.use_item_title.node.getContentSize().width + this.use_item_title.node.x;
|
} else {
|
if (this.item_vo == null || this.item_vo.config == null || this.item_vo.config.effect == null || Utils.next(this.item_vo.config.effect) == null) return;
|
if (this.isAssetsItem(this.item_vo.config) == false) return;
|
var effect = this.item_vo.config.effect[0];
|
|
if (effect != null) {
|
this.use_item_title.string = cc.js.formatStr(Utils.TI18N("使用后可获得%s:"), Config.item_data.data_item_effect_type[effect.effect_type]);
|
this.use_effect.string = effect.val * sum;
|
this.use_effect.node.x = this.use_item_title.node.getContentSize().width + this.use_item_title.node.x;
|
}
|
}
|
},
|
// --==============================--
|
// --desc:是否是财产类的物品
|
// --@return
|
// --==============================--
|
isAssetsItem: function isAssetsItem(config) {
|
if (config == null) {
|
return false;
|
}
|
|
if (config.effect == null || Utils.next(config.effect) == null) {
|
return false;
|
}
|
|
var is_assets = false;
|
|
for (var i in config.effect) {
|
var v = config.effect[i];
|
|
if (v.effect_type == BackPackConst.item_effect_type.GOLD || v.effect_type == BackPackConst.item_effect_type.COIN || v.effect_type == BackPackConst.item_effect_type.PARTNER_EXP) {
|
is_assets = true;
|
break;
|
}
|
}
|
|
return is_assets;
|
},
|
// 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
|
closeCallBack: function closeCallBack() {
|
if (this.item) {
|
this.item.deleteMe();
|
}
|
|
this.item = null;
|
this.ctrl.openBatchUseItemView(false);
|
}
|
});
|
|
cc._RF.pop();
|
}
|
if (nodeEnv) {
|
__define(__module.exports, __require, __module);
|
}
|
else {
|
__quick_compile_project__.registerModuleFunc(__filename, function () {
|
__define(__module.exports, __require, __module);
|
});
|
}
|
})();
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYWNrcGFja1xcdmlld1xcYmFja3BhY2tfYmF0Y2h1c2Vfd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIlJvbGVDb250cm9sbGVyIiwiQmFja1BhY2tDb25zdCIsIkJhY2twYWNrX2JhdGNodXNlV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsIm1zZyIsIndpbl90eXBlIiwiV2luVHlwZSIsIk1pbmkiLCJjdHJsIiwiYXJndW1lbnRzIiwibW9kZWwiLCJnZXRNb2RlbCIsImluaXRDb25maWciLCJyb2xlX3ZvIiwiZ2V0SW5zdGFuY2UiLCJnZXRSb2xlVm8iLCJjdXJfc2VsZWN0ZWRfc3VtIiwic2VsZWN0X2dvb2RzIiwib3BlbkNhbGxCYWNrIiwiYmFja2dyb3VuZCIsInJvb3Rfd25kIiwiZ2V0Q2hpbGRCeU5hbWUiLCJtYWluX2NvbnRhaW5lciIsImNsb3NlX2J0biIsIml0ZW0iLCJJdGVtc1Bvb2wiLCJnZXRJdGVtIiwic2V0UGFyZW50Iiwic2hvdyIsInNldFBvc2l0aW9uIiwidXNlX2J0biIsInVzZV9idG5fbGFiIiwiZ2V0Q29tcG9uZW50IiwiTGFiZWwiLCJzdHJpbmciLCJVdGlscyIsIlRJMThOIiwiaGFuZGxlX2NvbnRhaW5lciIsImhhbmRsZV9jb250YWluZXJfY3kiLCJjb250YWluZXIiLCJjb250YWluZXJfeSIsInkiLCJzdWJfYnRuIiwiYWRkX2J0biIsIm1heF9idG4iLCJzbGlkZXIiLCJTbGlkZXIiLCJwcm9ncmVzcyIsIlByb2dyZXNzQmFyIiwidmFsdWUiLCJ1c2VfdGl0bGUiLCJleHRlbmRfY29udGFpbmVyIiwidXNlX2l0ZW1fdGl0bGUiLCJ1c2VfZWZmZWN0IiwidGl0bGVfbGFiZWwiLCJpdGVtX25hbWUiLCJpdGVtX293biIsInJlZ2lzdGVyRXZlbnQiLCJvblRvdWNoRW5kIiwib3BlbkJhdGNoVXNlSXRlbVZpZXciLCJiaW5kIiwiaXRlbV92byIsImNvbmZpZyIsIk1hdGgiLCJtaW4iLCJxdWFudGl0eSIsIm1lc3NhZ2UiLCJ0eXBlIiwiSXRlbUNvbnN1bWVUeXBlIiwidXNlIiwic2VuZGVyMTA1MTUiLCJpZCIsInNlbmRlcjEwNTIyIiwiQmFnX0NvZGUiLCJCQUNLUEFDSyIsImJpZCIsImJhc2VfaWQiLCJudW0iLCJub2RlIiwib24iLCJzZXRDdXJVc2VJdGVtSW5mb0J5UGVyY2VudCIsInBlcmNlbnQiLCJzZXRDdXJVc2VJdGVtSW5mb0J5TnVtIiwib3BlblJvb3RXbmQiLCJwYXJhbXMiLCJzZWxlY3Rfdm8iLCJ1cGRhdGVJdGVtIiwicmVzb2x2ZSIsInVwZGF0ZUNlbGxJdGVtIiwic2V0VXNlSW5mbyIsInNldERhdGEiLCJuYW1lIiwianMiLCJmb3JtYXRTdHIiLCJuZXh0IiwidmFsdWVfY29uZmlnIiwib3duIiwiaXRlbV9jb25maWciLCJnZXRJdGVtQ29uZmlnIiwiZ2RhdGEiLCJjb2luIiwiaGVyb19zb3VsIiwidmFsdWVfbGlzdCIsImlzQXNzZXRzSXRlbSIsImFjdGl2ZSIsImVmZmVjdCIsImVmZmVjdF90eXBlIiwiaXRlbV9lZmZlY3RfdHlwZSIsIkdPTEQiLCJDT0lOIiwiUEFSVE5FUl9FWFAiLCJwYXJ0bmVyX2V4cF9hbGwiLCJtYXgiLCJmbG9vciIsImFsbF9udW0iLCJzdW0iLCJzZWxsIiwiYmFzZV92YWx1ZSIsIngiLCJnZXRDb250ZW50U2l6ZSIsIndpZHRoIiwiQ29uZmlnIiwiaXRlbV9kYXRhIiwiZGF0YV9pdGVtX2VmZmVjdF90eXBlIiwidmFsIiwiaXNfYXNzZXRzIiwiaSIsInYiLCJjbG9zZUNhbGxCYWNrIiwiZGVsZXRlTWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFD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QUssQ0FBQzJELElBQU4sQ0FBV2hDLE1BQU0sQ0FBQzJDLE1BQWxCLEtBQTZCLElBQXpELEVBQThEO0FBQzFELGFBQU8sS0FBUDtBQUNIOztBQUNELFFBQUlvQixTQUFTLEdBQUcsS0FBaEI7O0FBQ0EsU0FBSSxJQUFJQyxDQUFSLElBQWFoRSxNQUFNLENBQUMyQyxNQUFwQixFQUEyQjtBQUN2QixVQUFJc0IsQ0FBQyxHQUFHakUsTUFBTSxDQUFDMkMsTUFBUCxDQUFjcUIsQ0FBZCxDQUFSOztBQUNBLFVBQUdDLENBQUMsQ0FBQ3JCLFdBQUYsSUFBaUJoSCxhQUFhLENBQUNpSCxnQkFBZCxDQUErQkMsSUFBaEQsSUFDSG1CLENBQUMsQ0FBQ3JCLFdBQUYsSUFBaUJoSCxhQUFhLENBQUNpSCxnQkFBZCxDQUErQkUsSUFEN0MsSUFFSGtCLENBQUMsQ0FBQ3JCLFdBQUYsSUFBaUJoSCxhQUFhLENBQUNpSCxnQkFBZCxDQUErQkcsV0FGaEQsRUFFNEQ7QUFDeERlLFFBQUFBLFNBQVMsR0FBRyxJQUFaO0FBQ0E7QUFDSDtBQUNKOztBQUNELFdBQU9BLFNBQVA7QUFDSCxHQW5Ua0M7QUFxVG5DO0FBQ0FHLEVBQUFBLGFBQWEsRUFBQyx5QkFBVTtBQUNwQixRQUFHLEtBQUt4RyxJQUFSLEVBQWE7QUFDVCxXQUFLQSxJQUFMLENBQVV5RyxRQUFWO0FBQ0g7O0FBQ0QsU0FBS3pHLElBQUwsR0FBWSxJQUFaO0FBQ0EsU0FBS2hCLElBQUwsQ0FBVW1ELG9CQUFWLENBQStCLEtBQS9CO0FBQ0g7QUE1VGtDLENBQVQsQ0FBOUIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICDov5nph4zmmK/mj4/ov7Dov5nkuKrnqpfkvZPnmoTkvZznlKjnmoRcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTA0LTEzIDA5OjMyOjQ0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBCYWNrUGFja0NvbnN0ID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnN0XCIpO1xuXG52YXIgQmFja3BhY2tfYmF0Y2h1c2VXaW5kb3cgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVZpZXcsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiYmFja3BhY2tcIiwgXCJiYXRjaHVzZV9wYW5lbF92aWV3XCIpO1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcubXNnOyAgICAgICAgICAgICAgICAvL+ivpeeql+S9k+aJgOWxnnVp5bGC57qnLOWFqOWxj3Vp6ZyA6KaB5ZyodWnlsYIs6Z2e5YWo5bGPdWnlnKhkaWFsb2d1ZeWxgizov5nkuKropoHms6jmhI9cbiAgICAgICAgdGhpcy53aW5fdHlwZSA9IFdpblR5cGUuTWluaTsgICAgICAgICAgICAgICAvL+aYr+WQpuaYr+WFqOWxj+eql+S9kyAgV2luVHlwZS5GdWxsLCBXaW5UeXBlLkJpZywgV2luVHlwZS5NaW5pLCBXaW5UeXBlLlRpcHNcbiAgICAgICAgdGhpcy5jdHJsID0gYXJndW1lbnRzWzBdO1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy5jdHJsLmdldE1vZGVsKCk7XG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcbiAgICBpbml0Q29uZmlnOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMucm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgIHRoaXMuY3VyX3NlbGVjdGVkX3N1bSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvLyDlvZPliY3pgInkuK3mtojogJfnmoTmlbDph49cbiAgICAgICAgdGhpcy5zZWxlY3RfZ29vZHMgPSBudWxsO1xuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI7nmoTlm57osIMs5Y+v5Lul5Zyo6L+Z6YeM5o2V6I6355u45YWz6IqC54K55oiW6ICF57uE5Lu2XG4gICAgb3BlbkNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJiYWNrZ3JvdW5kXCIpO1xuICAgIFxuICAgICAgICB0aGlzLm1haW5fY29udGFpbmVyID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcIm1haW5fY29udGFpbmVyXCIpO1xuICAgICAgICB0aGlzLmNsb3NlX2J0biA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJjbG9zZV9idG5cIik7XG4gICAgXG4gICAgICAgIHRoaXMuaXRlbSA9IEl0ZW1zUG9vbC5nZXRJbnN0YW5jZSgpLmdldEl0ZW0oXCJiYWNrcGFja19pdGVtXCIpO1xuICAgICAgICB0aGlzLml0ZW0uaW5pdENvbmZpZyh0cnVlLCAxLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuaXRlbS5zZXRQYXJlbnQodGhpcy5tYWluX2NvbnRhaW5lcilcbiAgICAgICAgdGhpcy5pdGVtLnNob3coKTtcbiAgICAgICAgdGhpcy5pdGVtLnNldFBvc2l0aW9uKC0yMDAsIDE0MCk7XG4gICAgXG4gICAgICAgIHRoaXMudXNlX2J0biA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJ1c2VfYnRuXCIpO1xuICAgICAgICB0aGlzLnVzZV9idG5fbGFiID0gdGhpcy51c2VfYnRuLmdldENoaWxkQnlOYW1lKFwiTGFiZWxcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy51c2VfYnRuX2xhYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuS9v+eUqFwiKTtcbiAgICBcbiAgICAgICAgdGhpcy5oYW5kbGVfY29udGFpbmVyID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImhhbmRsZV9jb250YWluZXJcIik7XG4gICAgICAgIHRoaXMuaGFuZGxlX2NvbnRhaW5lcl9jeSA9IDA7XG4gICAgXG4gICAgICAgIC8vICDlpoLmnpzkuI3mmK/kuqflh7rotYTmupDnsbvnmoQs6L+Z5Liq5Lic6KW/6KaB5bGF5Lit54i26IqC54K5XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5oYW5kbGVfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiY29udGFpbmVyXCIpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lcl95ID0gdGhpcy5jb250YWluZXIueTtcbiAgICBcbiAgICAgICAgdGhpcy5zdWJfYnRuID0gdGhpcy5jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJzdWJfYnRuXCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWHj+WPt1xuICAgICAgICB0aGlzLmFkZF9idG4gPSB0aGlzLmNvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImFkZF9idG5cIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Yqg5Y+3XG4gICAgICAgIHRoaXMubWF4X2J0biA9IHRoaXMuY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwibWF4X2J0blwiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmnIDlpKflgLxcbiAgICAgICAgdGhpcy5zbGlkZXIgPSB0aGlzLmNvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInNsaWRlclwiKS5nZXRDb21wb25lbnQoY2MuU2xpZGVyKTsvLyDmu5HlnZdcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IHRoaXMuY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiUHJvZ3Jlc3NCYXJcIikuZ2V0Q29tcG9uZW50KGNjLlByb2dyZXNzQmFyKTtcbiAgICAgICAgLy8gdGhpcy5zbGlkZXI6c2V0QmFyUGVyY2VudCgyMCwgODApXG4gICAgXG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmNvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInZhbHVlXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7ICAgICAgICAgICAgICAvLyDkvb/nlKjmlbDph4/mj5DnpLpcbiAgICBcbiAgICAgICAgdGhpcy51c2VfdGl0bGUgPSB0aGlzLmNvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInRpdGxlXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7ICAgICAgICAgICAvLyDkvb/nlKjmlbDph4/mj5DnpLpcbiAgICAgICAgdGhpcy51c2VfdGl0bGUuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLkvb/nlKjmlbDph4/vvJpcIik7XG4gICAgXG4gICAgICAgIHRoaXMuZXh0ZW5kX2NvbnRhaW5lciA9IHRoaXMuaGFuZGxlX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImV4dGVuZF9jb250YWluZXJcIik7XG4gICAgICAgIHRoaXMudXNlX2l0ZW1fdGl0bGUgPSB0aGlzLmV4dGVuZF9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJ1c2VfaXRlbV90aXRsZVwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnVzZV9pdGVtX3RpdGxlLnN0cmluZyA9IFwiXCI7XG4gICAgXG4gICAgICAgIHRoaXMudXNlX2VmZmVjdCA9IHRoaXMuZXh0ZW5kX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInVzZV9lZmZlY3RcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICBcbiAgICAgICAgdGhpcy50aXRsZV9sYWJlbCA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXRsZV9sYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnRpdGxlX2xhYmVsLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5om56YeP5L2/55SoXCIpO1xuICAgICAgICB0aGlzLml0ZW1fbmFtZSA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJpdGVtX25hbWVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5pdGVtX293biA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJpdGVtX293blwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgIH0sXG5cbiAgICAvLyDms6jlhozkuovku7bnm5HlkKznmoTmjqXlj6Ms5LiN6ZyA6KaB5omL5Yqo6LCD55SoLOWmguaenOaYr+S9v+eUqGdjb3JlLkdsb2JhbEV2ZW5055uR5ZCsLOWPr+S7peebtOaOpeiwg+eUqGFkZEdsb2JhbEV2ZW50XG4gICAgcmVnaXN0ZXJFdmVudDpmdW5jdGlvbigpe1xuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMuY2xvc2VfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3BlbkJhdGNoVXNlSXRlbVZpZXcoZmFsc2UpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDIpO1xuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy51c2VfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZih0aGlzLml0ZW1fdm8gPT0gbnVsbCB8fCB0aGlzLml0ZW1fdm8uY29uZmlnID09IG51bGwpcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5jdXJfc2VsZWN0ZWRfc3VtID0gTWF0aC5taW4odGhpcy5jdXJfc2VsZWN0ZWRfc3VtLHRoaXMuaXRlbV92by5xdWFudGl0eSk7XG4gICAgICAgICAgICBpZih0aGlzLmN1cl9zZWxlY3RlZF9zdW0gPT0gMCl7XG4gICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuW9k+WJjeaVsOmHj+S4jeiDveS4ujBcIikpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMudHlwZSA9PSBCYWNrUGFja0NvbnN0Lkl0ZW1Db25zdW1lVHlwZS51c2Upe1xuICAgICAgICAgICAgICAgIHRoaXMuY3RybC5zZW5kZXIxMDUxNSh0aGlzLml0ZW1fdm8uaWQsIHRoaXMuY3VyX3NlbGVjdGVkX3N1bSx0aGlzLnNlbGVjdF9nb29kcyk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAvLyDph5HluIHluILlnLrnmoTnianlk4Hlh7rllK5cbiAgICAgICAgICAgICAgICBpZih0aGlzLnNlbGVjdF9nb29kcyAmJiB0aGlzLnNlbGVjdF9nb29kcy50eXBlICYmIHRoaXMuc2VsZWN0X2dvb2RzLnR5cGUgPT0gMSl7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1hcmtldENvbnRyb2xsZXI6Z2V0SW5zdGFuY2UoKTpzZW5kZXIyMzUwMiggdGhpcy5pdGVtX3ZvLmlkLHRoaXMuY3VyX3NlbGVjdGVkX3N1bSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5CYXRjaFVzZUl0ZW1WaWV3KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY3RybC5zZW5kZXIxMDUyMihCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLLCBbe2lkOnRoaXMuaXRlbV92by5pZCwgYmlkOnRoaXMuaXRlbV92by5iYXNlX2lkLG51bTp0aGlzLmN1cl9zZWxlY3RlZF9zdW19XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSk7XG5cbiAgICAgICAgdGhpcy5zbGlkZXIubm9kZS5vbihcInNsaWRlXCIsZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VyVXNlSXRlbUluZm9CeVBlcmNlbnQodGhpcy5zbGlkZXIucHJvZ3Jlc3MpO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcy5wcm9ncmVzcyA9IHRoaXMuc2xpZGVyLnByb2dyZXNzO1xuICAgICAgICB9LHRoaXMpXG5cbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLnN1Yl9idG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuaXRlbV92byA9PSBudWxsKXJldHVybjtcbiAgICAgICAgICAgIHZhciBwZXJjZW50ID0gdGhpcy5zbGlkZXIucHJvZ3Jlc3M7XG4gICAgICAgICAgICBpZihwZXJjZW50ID09IDApcmV0dXJuOy8v5bey57uP5piv5pyA5bCP55qE5LqGXG4gICAgICAgICAgICBpZih0aGlzLmN1cl9zZWxlY3RlZF9zdW0gPT0gMClyZXR1cm47XG4gICAgICAgICAgICB0aGlzLmN1cl9zZWxlY3RlZF9zdW0gPSB0aGlzLmN1cl9zZWxlY3RlZF9zdW0gLSAxO1xuICAgICAgICAgICAgdGhpcy5zZXRDdXJVc2VJdGVtSW5mb0J5TnVtKHRoaXMuY3VyX3NlbGVjdGVkX3N1bSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSk7XG5cbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmFkZF9idG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuaXRlbV92byA9PSBudWxsKXJldHVybjtcbiAgICAgICAgICAgIHZhciBwZXJjZW50ID0gdGhpcy5zbGlkZXIucHJvZ3Jlc3M7XG4gICAgICAgICAgICBpZihwZXJjZW50ID09IDEwMClyZXR1cm47Ly/lt7Lnu4/mmK/mnIDlpKfnmoTkuoZcbiAgICAgICAgICAgIGlmKHRoaXMuY3VyX3NlbGVjdGVkX3N1bSA+PSB0aGlzLml0ZW1fdm8ucXVhbnRpdHkpcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5jdXJfc2VsZWN0ZWRfc3VtID0gdGhpcy5jdXJfc2VsZWN0ZWRfc3VtICsgMTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VyVXNlSXRlbUluZm9CeU51bSh0aGlzLmN1cl9zZWxlY3RlZF9zdW0pO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpO1xuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5tYXhfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZih0aGlzLml0ZW1fdm8gPT0gbnVsbClyZXR1cm47XG4gICAgICAgICAgICB2YXIgcGVyY2VudCA9IHRoaXMuc2xpZGVyLnByb2dyZXNzO1xuICAgICAgICAgICAgaWYocGVyY2VudCA9PSAxMDApcmV0dXJuOy8v5bey57uP5piv5pyA5aSn55qE5LqGXG4gICAgICAgICAgICBpZih0aGlzLmN1cl9zZWxlY3RlZF9zdW0gPj0gdGhpcy5pdGVtX3ZvLnF1YW50aXR5KXJldHVybjtcbiAgICAgICAgICAgIHRoaXMuY3VyX3NlbGVjdGVkX3N1bSA9IHRoaXMuaXRlbV92by5xdWFudGl0eTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VyVXNlSXRlbUluZm9CeU51bSh0aGlzLmN1cl9zZWxlY3RlZF9zdW0pO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpO1xuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDpmdW5jdGlvbihwYXJhbXMpe1xuICAgICAgICB2YXIgaXRlbSA9IHBhcmFtc1swXTtcbiAgICAgICAgdmFyIHR5cGUgPSBwYXJhbXNbMV07XG4gICAgICAgIHZhciBzZWxlY3Rfdm8gPSBwYXJhbXNbMl07XG5cbiAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCBCYWNrUGFja0NvbnN0Lkl0ZW1Db25zdW1lVHlwZS51c2U7XG4gICAgICAgIHRoaXMuaXRlbV92byA9IGl0ZW07XG4gICAgICAgIHRoaXMuc2VsZWN0X2dvb2RzID0gc2VsZWN0X3ZvO1xuICAgICAgICBpZih0aGlzLml0ZW1fdm8gPT0gbnVsbCB8fCB0aGlzLml0ZW1fdm8uY29uZmlnID09IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5CYXRjaFVzZUl0ZW1WaWV3KGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLnR5cGUgPT0gQmFja1BhY2tDb25zdC5JdGVtQ29uc3VtZVR5cGUudXNlKXtcbiAgICAgICAgICAgIHRoaXMudGl0bGVfbGFiZWwuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmibnph4/kvb/nlKhcIik7XG4gICAgICAgICAgICB0aGlzLnVzZV90aXRsZS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuS9v+eUqOaVsOmHj++8mlwiKTtcbiAgICAgICAgICAgIHRoaXMudXNlX2J0bl9sYWIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLkvb/nlKhcIik7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW0oKTtcbiAgICAgICAgfWVsc2UgaWYodGhpcy50eXBlID09IEJhY2tQYWNrQ29uc3QuSXRlbUNvbnN1bWVUeXBlLnJlc29sdmUpe1xuICAgICAgICAgICAgdGhpcy50aXRsZV9sYWJlbC5zdHJpbmcgPSBVdGlscy5USTE4TihcIuaJuemHj+WIhuino1wiKTtcbiAgICAgICAgICAgIHRoaXMudXNlX3RpdGxlLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5YiG6Kej5pWw6YeP77yaXCIpO1xuICAgICAgICAgICAgdGhpcy51c2VfYnRuX2xhYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuWIhuino1wiKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2VsbEl0ZW0oKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLnRpdGxlX2xhYmVsLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi54mp5ZOB5Ye65ZSuXCIpO1xuICAgICAgICAgICAgdGhpcy51c2VfdGl0bGUuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLlh7rllK7mlbDph4/vvJpcIik7XG4gICAgICAgICAgICB0aGlzLnVzZV9idG5fbGFiLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5Ye65ZSuXCIpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDZWxsSXRlbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRVc2VJbmZvKDEwMClcbiAgICB9LFxuXG4gICAgLy8gLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIC8vIC0tZGVzYzrpkojlr7nlh7rllK7nsbvnianlk4HnmoTlpITnkIZcbiAgICAvLyAtLUByZXR1cm4gXG4gICAgLy8gLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIHVwZGF0ZUNlbGxJdGVtOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuaXRlbV92byA9PSBudWxsIHx8IHRoaXMuaXRlbV92by5jb25maWcgPT1udWxsKXJldHVybjtcbiAgICAgICAgdGhpcy5pdGVtLnNldERhdGEodGhpcy5pdGVtX3ZvLmNvbmZpZyk7XG4gICAgICAgIHRoaXMuaXRlbV9uYW1lLnN0cmluZyA9IHRoaXMuaXRlbV92by5jb25maWcubmFtZTtcbiAgICAgICAgdGhpcy5pdGVtX293bi5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLmi6XmnIkgJXMg5LiqXCIpLCB0aGlzLml0ZW1fdm8ucXVhbnRpdHkpO1xuICAgICAgICB0aGlzLmN1cl9zZWxlY3RlZF9zdW0gPSB0aGlzLml0ZW1fdm8ucXVhbnRpdHk7XG4gICAgICAgIC8vICDmiZPlvIDpnaLmnb/nmoTml7blgJks6YO95piv6buY6K6k6YCJ5Lit5pyA5aSn5pWw6YePXG4gICAgICAgIHRoaXMudmFsdWUuc3RyaW5nID0gdGhpcy5pdGVtX3ZvLnF1YW50aXR5O1xuICAgICAgICAvLyAg6K6+572u5pyA5aSnXG4gICAgICAgIHRoaXMuc2xpZGVyLnByb2dyZXNzID0gMTtcbiAgICAgICAgdGhpcy5wcm9ncmVzcy5wcm9ncmVzcyA9IHRoaXMuc2xpZGVyLnByb2dyZXNzO1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLml0ZW1fdm8uY29uZmlnLnZhbHVlO1xuICAgICAgICBpZih2YWx1ZSAhPSBudWxsICYmIFV0aWxzLm5leHQodmFsdWUpICE9bnVsbCl7XG4gICAgICAgICAgICB0aGlzLnZhbHVlX2NvbmZpZyA9IHZhbHVlWzBdO1xuICAgICAgICAgICAgaWYodGhpcy52YWx1ZV9jb25maWcgPT0gbnVsbCB8fCB0aGlzLnZhbHVlX2NvbmZpZ1swXSA9PSBudWxsIHx8IHR5cGVvZih0aGlzLnZhbHVlX2NvbmZpZ1swXSkgIT0gXCJudW1iZXJcIilyZXR1cm47XG4gICAgICAgICAgICB2YXIgYmFzZV9pZCA9IHRoaXMudmFsdWVfY29uZmlnWzBdO1xuICAgICAgICAgICAgdmFyIG93biA9IDA7XG4gICAgICAgICAgICB2YXIgaXRlbV9jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGJhc2VfaWQpO1xuICAgICAgICAgICAgaWYoaXRlbV9jb25maWc9PW51bGwpcmV0dXJuO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZih0aGlzLnZhbHVlX2NvbmZpZ1swXSA9PSBnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfYXNzZXRzX2xhYmVsMmlkXCIsIFwiY29pblwiKSl7XG4gICAgICAgICAgICAgICAgb3duID0gdGhpcy5yb2xlX3ZvLmNvaW47XG4gICAgICAgICAgICB9ZWxzZSBpZih0aGlzLnZhbHVlX2NvbmZpZ1swXSA9PSBnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfYXNzZXRzX2xhYmVsMmlkXCIsIFwiaGVyb19zb3VsXCIpKXtcbiAgICAgICAgICAgICAgICBvd24gPSB0aGlzLnJvbGVfdm8uaGVyb19zb3VsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLnNldEN1clVzZUl0ZW1JbmZvQnlQZXJjZW50KDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuc2VsZWN0X2dvb2RzICYmIHRoaXMuc2VsZWN0X2dvb2RzLnR5cGUgJiYgdGhpcy5zZWxlY3RfZ29vZHMudHlwZSA9PSAxKXtcbiAgICAgICAgICAgIHRoaXMudmFsdWVfY29uZmlnID0gdGhpcy5zZWxlY3RfZ29vZHMudmFsdWVfbGlzdCB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VyVXNlSXRlbUluZm9CeVBlcmNlbnQoMSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlSXRlbTpmdW5jdGlvbigpe1xuICAgICAgICBpZih0aGlzLml0ZW1fdm8gPT0gbnVsbCB8fCB0aGlzLml0ZW1fdm8uY29uZmlnID09IG51bGwpcmV0dXJuO1xuICAgICAgICB0aGlzLml0ZW0uc2V0RGF0YSh0aGlzLml0ZW1fdm8uY29uZmlnKTtcbiAgICAgICAgdGhpcy5pdGVtX25hbWUuc3RyaW5nID0gdGhpcy5pdGVtX3ZvLmNvbmZpZy5uYW1lO1xuICAgICAgICB0aGlzLml0ZW1fb3duLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuaLpeaciSAlcyDkuKpcIiksIHRoaXMuaXRlbV92by5xdWFudGl0eSk7XG4gICAgICAgIHRoaXMuY3VyX3NlbGVjdGVkX3N1bSA9IHRoaXMuaXRlbV92by5xdWFudGl0eTtcbiAgICAgICAgLy8gIOaJk+W8gOmdouadv+eahOaXtuWAmSzpg73mmK/pu5jorqTpgInkuK3mnIDlpKfmlbDph49cbiAgICAgICAgdGhpcy52YWx1ZS5zdHJpbmcgPSB0aGlzLml0ZW1fdm8ucXVhbnRpdHk7XG4gICAgICAgIC8vICDorr7nva7mnIDlpKdcbiAgICAgICAgdGhpcy5zbGlkZXIucHJvZ3Jlc3MgPSAxO1xuICAgICAgICB0aGlzLnByb2dyZXNzLnByb2dyZXNzID0gdGhpcy5zbGlkZXIucHJvZ3Jlc3M7XG4gICAgICAgIC8vIOWmguaenOaYr+S6p+WHuui1hOS6p+exu+eahFxuICAgICAgICBpZih0aGlzLmlzQXNzZXRzSXRlbSh0aGlzLml0ZW1fdm8uY29uZmlnKSA9PSB0cnVlKXtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnkgPSB0aGlzLmNvbnRhaW5lcl95O1xuICAgICAgICAgICAgdGhpcy5leHRlbmRfY29udGFpbmVyLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAvLyAg55u05o6l5Y+W56ys5LiA5Liq5pWI5p6c5ZCnXG4gICAgICAgICAgICBpZih0aGlzLml0ZW1fdm8uY29uZmlnLmVmZmVjdCAmJiBVdGlscy5uZXh0KHRoaXMuaXRlbV92by5jb25maWcuZWZmZWN0KSAhPSBudWxsKXtcbiAgICAgICAgICAgICAgICB2YXIgZWZmZWN0ID0gdGhpcy5pdGVtX3ZvLmNvbmZpZy5lZmZlY3RbMF07XG4gICAgICAgICAgICAgICAgaWYoZWZmZWN0ICE9IG51bGwgJiYgdGhpcy5yb2xlX3ZvICE9IG51bGwpe1xuICAgICAgICAgICAgICAgICAgICB2YXIgb3duID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYoZWZmZWN0LmVmZmVjdF90eXBlID09IEJhY2tQYWNrQ29uc3QuaXRlbV9lZmZlY3RfdHlwZS5HT0xEKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG93biA9IHRoaXMucm9sZV92by5jb2luO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihlZmZlY3QuZWZmZWN0X3R5cGUgPT0gQmFja1BhY2tDb25zdC5pdGVtX2VmZmVjdF90eXBlLkNPSU4pe1xuICAgICAgICAgICAgICAgICAgICAgICAgb3duID0gdGhpcy5yb2xlX3ZvLmNvaW47XG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGVmZmVjdC5lZmZlY3RfdHlwZSA9PSBCYWNrUGFja0NvbnN0Lml0ZW1fZWZmZWN0X3R5cGUuUEFSVE5FUl9FWFApe1xuICAgICAgICAgICAgICAgICAgICAgICAgb3duID0gdGhpcy5yb2xlX3ZvLnBhcnRuZXJfZXhwX2FsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0Q3VyVXNlSXRlbUluZm9CeVBlcmNlbnQoMSk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIueSA9IHRoaXMuaGFuZGxlX2NvbnRhaW5lcl9jeTtcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kX2NvbnRhaW5lci5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyAtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gLS1kZXNjOuiuvue9ruW9k+WJjei/m+W6pueahOebuOWFs+aVsOaNrlxuICAgIC8vIC0tQHBlcmNlbnQ6XG4gICAgLy8gLS1AcmV0dXJuIFxuICAgIC8vIC0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICBzZXRDdXJVc2VJdGVtSW5mb0J5UGVyY2VudDpmdW5jdGlvbihwZXJjZW50KXtcbiAgICAgICAgaWYodGhpcy5pdGVtX3ZvID09IG51bGwpcmV0dXJuO1xuICAgICAgICB0aGlzLmN1cl9zZWxlY3RlZF9zdW0gPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKCBwZXJjZW50ICogdGhpcy5pdGVtX3ZvLnF1YW50aXR5KSk7XG4gICAgICAgIHRoaXMuc2V0VXNlSW5mbyh0aGlzLmN1cl9zZWxlY3RlZF9zdW0pO1xuICAgIH0sXG5cbiAgICBzZXRDdXJVc2VJdGVtSW5mb0J5TnVtOmZ1bmN0aW9uKG51bSl7XG4gICAgICAgIGlmKHRoaXMuaXRlbV92byA9PSBudWxsKXJldHVybjtcbiAgICAgICAgdGhpcy5jdXJfc2VsZWN0ZWRfc3VtID0gTWF0aC5tYXgoMSwgbnVtKTtcbiAgICAgICAgdmFyIGFsbF9udW0gPU1hdGgubWF4KDEsdGhpcy5pdGVtX3ZvLnF1YW50aXR5LTEpO1xuICAgICAgICB2YXIgcGVyY2VudCA9ICh0aGlzLmN1cl9zZWxlY3RlZF9zdW0tMSkgLyBhbGxfbnVtO1xuICAgICAgICB0aGlzLnNsaWRlci5wcm9ncmVzcyA9IHBlcmNlbnQ7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MucHJvZ3Jlc3MgPSB0aGlzLnNsaWRlci5wcm9ncmVzcztcbiAgICAgICAgdGhpcy5zZXRVc2VJbmZvKHRoaXMuY3VyX3NlbGVjdGVkX3N1bSk7XG4gICAgfSxcblxuICAgIHNldFVzZUluZm86ZnVuY3Rpb24oc3VtKXtcbiAgICAgICAgc3VtID0gTWF0aC5taW4odGhpcy5pdGVtX3ZvLnF1YW50aXR5LHN1bSk7XG4gICAgICAgIHRoaXMudmFsdWUuc3RyaW5nID0gc3VtO1xuICAgICAgICBpZih0aGlzLnR5cGUgPT0gQmFja1BhY2tDb25zdC5JdGVtQ29uc3VtZVR5cGUuc2VsbCAmJiB0aGlzLnZhbHVlX2NvbmZpZyAhPW51bGwpe1xuICAgICAgICAgICAgdmFyIGJhc2VfdmFsdWUgPSB0aGlzLnZhbHVlX2NvbmZpZ1sxXSB8fCAwO1xuICAgICAgICAgICAgdmFyIGJhc2VfaWQgPSB0aGlzLnZhbHVlX2NvbmZpZ1swXTtcbiAgICAgICAgICAgIGlmKGJhc2VfaWQ9PSBudWxsKXJldHVybjsgXG4gICAgICAgICAgICB2YXIgaXRlbV9jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGJhc2VfaWQpO1xuICAgICAgICAgICAgaWYoaXRlbV9jb25maWc9PW51bGwpcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy51c2VfaXRlbV90aXRsZS5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLlh7rllK7lkI7lj6/ojrflvpclc++8mlwiKSwgaXRlbV9jb25maWcubmFtZSk7XG4gICAgICAgICAgICB0aGlzLnVzZV9lZmZlY3Quc3RyaW5nID0gYmFzZV92YWx1ZSAqIHN1bTtcbiAgICAgICAgICAgIHRoaXMudXNlX2VmZmVjdC5ub2RlLnggPSB0aGlzLnVzZV9pdGVtX3RpdGxlLm5vZGUuZ2V0Q29udGVudFNpemUoKS53aWR0aCArIHRoaXMudXNlX2l0ZW1fdGl0bGUubm9kZS54O1xuICAgICAgICB9ZWxzZSBpZih0aGlzLnR5cGUgPT0gQmFja1BhY2tDb25zdC5JdGVtQ29uc3VtZVR5cGUucmVzb2x2ZSAmJiB0aGlzLnZhbHVlX2NvbmZpZyAhPSBudWxsKXtcbiAgICAgICAgICAgIHZhciBiYXNlX3ZhbHVlID0gdGhpcy52YWx1ZV9jb25maWdbMV0gfHwgMDtcbiAgICAgICAgICAgIHZhciBiYXNlX2lkID0gdGhpcy52YWx1ZV9jb25maWdbMF07XG4gICAgICAgICAgICBpZihiYXNlX2lkID09bnVsbClyZXR1cm47XG4gICAgICAgICAgICB2YXIgaXRlbV9jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGJhc2VfaWQpO1xuICAgICAgICAgICAgaWYoaXRlbV9jb25maWcgPT0gbnVsbClyZXR1cm47XG4gICAgICAgICAgICB0aGlzLnVzZV9pdGVtX3RpdGxlLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuWIhuino+WQjuWPr+iOt+W+lyVz77yaXCIpLCBpdGVtX2NvbmZpZy5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMudXNlX2VmZmVjdC5zdHJpbmcgPSBiYXNlX3ZhbHVlICogc3VtO1xuICAgICAgICAgICAgdGhpcy51c2VfZWZmZWN0Lm5vZGUueCA9IHRoaXMudXNlX2l0ZW1fdGl0bGUubm9kZS5nZXRDb250ZW50U2l6ZSgpLndpZHRoICsgdGhpcy51c2VfaXRlbV90aXRsZS5ub2RlLng7IFxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKHRoaXMuaXRlbV92byA9PSBudWxsIHx8IHRoaXMuaXRlbV92by5jb25maWcgPT0gbnVsbCB8fCB0aGlzLml0ZW1fdm8uY29uZmlnLmVmZmVjdCA9PSBudWxsIHx8IFV0aWxzLm5leHQodGhpcy5pdGVtX3ZvLmNvbmZpZy5lZmZlY3QpID09IG51bGwpcmV0dXJuO1xuICAgICAgICAgICAgaWYodGhpcy5pc0Fzc2V0c0l0ZW0odGhpcy5pdGVtX3ZvLmNvbmZpZykgPT0gZmFsc2UpcmV0dXJuO1xuICAgICAgICAgICAgdmFyIGVmZmVjdCA9IHRoaXMuaXRlbV92by5jb25maWcuZWZmZWN0WzBdO1xuICAgICAgICAgICAgaWYoZWZmZWN0IT1udWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZV9pdGVtX3RpdGxlLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuS9v+eUqOWQjuWPr+iOt+W+lyVz77yaXCIpLCBDb25maWcuaXRlbV9kYXRhLmRhdGFfaXRlbV9lZmZlY3RfdHlwZVtlZmZlY3QuZWZmZWN0X3R5cGVdKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZV9lZmZlY3Quc3RyaW5nID0gZWZmZWN0LnZhbCAqIHN1bTtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZV9lZmZlY3Qubm9kZS54ID0gdGhpcy51c2VfaXRlbV90aXRsZS5ub2RlLmdldENvbnRlbnRTaXplKCkud2lkdGggKyB0aGlzLnVzZV9pdGVtX3RpdGxlLm5vZGUueDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyAtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gLS1kZXNjOuaYr+WQpuaYr+i0ouS6p+exu+eahOeJqeWTgVxuICAgIC8vIC0tQHJldHVybiBcbiAgICAvLyAtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgaXNBc3NldHNJdGVtOmZ1bmN0aW9uKGNvbmZpZyl7XG4gICAgICAgIGlmKGNvbmZpZyA9PSBudWxsKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZihjb25maWcuZWZmZWN0ID09IG51bGwgfHwgVXRpbHMubmV4dChjb25maWcuZWZmZWN0KSA9PSBudWxsKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaXNfYXNzZXRzID0gZmFsc2U7XG4gICAgICAgIGZvcih2YXIgaSBpbiBjb25maWcuZWZmZWN0KXtcbiAgICAgICAgICAgIHZhciB2ID0gY29uZmlnLmVmZmVjdFtpXTtcbiAgICAgICAgICAgIGlmKHYuZWZmZWN0X3R5cGUgPT0gQmFja1BhY2tDb25zdC5pdGVtX2VmZmVjdF90eXBlLkdPTEQgfHxcbiAgICAgICAgICAgIHYuZWZmZWN0X3R5cGUgPT0gQmFja1BhY2tDb25zdC5pdGVtX2VmZmVjdF90eXBlLkNPSU4gfHxcbiAgICAgICAgICAgIHYuZWZmZWN0X3R5cGUgPT0gQmFja1BhY2tDb25zdC5pdGVtX2VmZmVjdF90eXBlLlBBUlRORVJfRVhQKXtcbiAgICAgICAgICAgICAgICBpc19hc3NldHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc19hc3NldHM7XG4gICAgfSxcblxuICAgIC8vIOWFs+mXreeql+S9k+WbnuiwgyzpnIDopoHlnKjov5nph4zosIPnlKjor6XnqpfkvZPmiYDlsZ5jb250cm9sbGVy55qEY2xvc2Xmlrnms5XmsqHnlKjkuo7nva7nqbror6XnqpfkvZPlrp7kvovlr7nosaFcbiAgICBjbG9zZUNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuaXRlbSl7XG4gICAgICAgICAgICB0aGlzLml0ZW0uZGVsZXRlTWUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLml0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLmN0cmwub3BlbkJhdGNoVXNlSXRlbVZpZXcoZmFsc2UpO1xuICAgIH0sXG59KSJdfQ==
|