|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/guildwar/guildwar_model.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, 'dc0cbWrCZpHsKhtL0KmhaiN', 'guildwar_model');
|
// Scripts/mod/guildwar/guildwar_model.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 这里填写详细说明,主要填写该模块的功能简要
|
// <br/>Create: 2019-05-06 17:56:47
|
// --------------------------------------------------------------------
|
var GuildConst = require("guild_const");
|
|
var GuildwarConst = require("guildwar_const");
|
|
var GuildWarPositionVo = require("guildwar_position_vo");
|
|
var GuildEvent = require("guild_event");
|
|
var GuildwarEvent = require("guildwar_event");
|
|
var GuildWarBoxVo = require("guildwar_box_vo");
|
|
var Guild_warModel = cc.Class({
|
"extends": BaseClass,
|
ctor: function ctor() {
|
this.ctrl = arguments[0];
|
},
|
properties: {},
|
initConfig: function initConfig() {
|
this.challengeCount = 0; // 已挑战次数
|
|
this.guildWarResult = GuildwarConst.result.fighting; // 战斗结果
|
|
this.myGuildWarBaseInfo = {}; // 我方联盟战基础数据(星数、buff等)
|
|
this.enemyGuildWarBaseInfo = {}; // 敌方联盟战基础数据(星数、名称)
|
|
this.guildWarStatus = GuildwarConst.status.close; // 联盟战状态
|
|
this.guildWarStartTime = 0; // 联盟战开始时间
|
|
this.guildWarEndTime = 0; // 联盟战结束时间
|
|
this.guildWarEnemyFlag = 0; // 是否匹配到对手
|
|
this.guildWarTopThreeRank = {}; // 前三排名
|
|
this.myGuildWarPositionList = {}; // 我方据点数据
|
|
this.enemyGuildWarPositionList = {}; // 敌方据点数据
|
|
this.award_box_data = []; // 奖励宝箱数据
|
|
this.guildwar_red_list = {}; // 红点数据
|
},
|
//本地是否有联盟战敌方数据
|
checkIsHaveEnemyCacheData: function checkIsHaveEnemyCacheData() {
|
if (Utils.next(this.enemyGuildWarPositionList) == null) {
|
return false;
|
} else {
|
return true;
|
}
|
},
|
//设置已挑战次数
|
setGuildWarChallengeCount: function setGuildWarChallengeCount(count) {
|
this.challengeCount = count || 0;
|
this.updateChallengeCountRedStatus(0);
|
},
|
getGuildWarChallengeCount: function getGuildWarChallengeCount() {
|
return this.challengeCount;
|
},
|
//更新挑战次数红点
|
updateChallengeCountRedStatus: function updateChallengeCountRedStatus() {
|
if (this.guildWarEnemyFlag == 1 && this.guildWarStatus == GuildwarConst.status.processing && this.challengeCount < Config.guild_war_data.data_const.challange_time_limit.val) {
|
this.updateGuildWarRedStatus(GuildConst.red_index.guildwar_count, true);
|
} else {
|
this.updateGuildWarRedStatus(GuildConst.red_index.guildwar_count, false);
|
}
|
},
|
//设置联盟战结果
|
setGuildWarResult: function setGuildWarResult(result) {
|
this.guildWarResult = result;
|
},
|
getGuildWarResult: function getGuildWarResult() {
|
return this.guildWarResult;
|
},
|
//设置我方联盟战基础数据(星数、buff等)
|
setMyGuildWarBaseInfo: function setMyGuildWarBaseInfo(data) {
|
this.myGuildWarBaseInfo = data || {};
|
},
|
getMyGuildWarBaseInfo: function getMyGuildWarBaseInfo() {
|
return this.myGuildWarBaseInfo;
|
},
|
//更新我方联盟战基础数据
|
updateMyGuildWarBaseInfo: function updateMyGuildWarBaseInfo(data) {
|
for (var k in data) {
|
this.myGuildWarBaseInfo[k] = data[k];
|
}
|
},
|
//更新敌方联盟战基础数据(目前只是星数)
|
updateEnemyGuildWarBaseInfo: function updateEnemyGuildWarBaseInfo(hp) {
|
this.enemyGuildWarBaseInfo.hp = hp;
|
},
|
getEnemyGuildWarBaseInfo: function getEnemyGuildWarBaseInfo() {
|
return this.enemyGuildWarBaseInfo;
|
},
|
//设置敌方联盟战数据
|
setEnemyGuildWarData: function setEnemyGuildWarData(data) {
|
//基础数据
|
this.enemyGuildWarBaseInfo.gname = data.gname2 || "";
|
this.enemyGuildWarBaseInfo.hp = data.hp2 || 0;
|
this.enemyGuildWarBaseInfo.g_id = data.g_id || 0;
|
this.enemyGuildWarBaseInfo.g_sid = data.g_sid || ""; //据点数据
|
|
this.enemyGuildWarPositionList = {};
|
|
for (var k in data.defense || {}) {
|
var pdata = data.defense[k];
|
var position_vo = new GuildWarPositionVo();
|
position_vo.updateData(pdata);
|
this.enemyGuildWarPositionList[pdata.pos] = position_vo;
|
}
|
},
|
getEnemyGuildWarPositionList: function getEnemyGuildWarPositionList() {
|
var list = [];
|
|
for (var i in this.enemyGuildWarPositionList) {
|
var vo = this.enemyGuildWarPositionList[i];
|
|
if (vo) {
|
list.push(vo);
|
}
|
}
|
|
return list;
|
},
|
//获取敌方某一据点的当前血量
|
getEnemyPositionHpByPos: function getEnemyPositionHpByPos(pos) {
|
var position_vo = this.enemyGuildWarPositionList[pos];
|
|
if (position_vo) {
|
return position_vo.hp;
|
}
|
|
return 0;
|
},
|
//敌方是否还有存活的据点
|
checkEnemyIsHaveLivePosition: function checkEnemyIsHaveLivePosition() {
|
var is_have = false;
|
|
for (var k in this.enemyGuildWarPositionList) {
|
var vo = this.enemyGuildWarPositionList[k];
|
|
if (vo.hp > 0) {
|
is_have = true;
|
break;
|
}
|
}
|
|
return is_have;
|
},
|
//设置联盟战状态数据
|
setGuildWarStatus: function setGuildWarStatus(data) {
|
this.guildWarStatus = data.status || GuildwarConst.status.close;
|
this.guildWarStartTime = data.start_time || 0;
|
this.guildWarEndTime = data.end_time || 0;
|
this.guildWarEnemyFlag = data.flag || 0; //当状态变为未开启时,清掉缓存数据
|
|
if (this.guildWarStatus == GuildwarConst.status.close) {
|
this.initConfig();
|
}
|
|
this.checkGuildWarStatusRed();
|
this.updateChallengeCountRedStatus();
|
},
|
//更新联盟战状态的红点
|
checkGuildWarStatusRed: function checkGuildWarStatusRed() {
|
if (this.guildWarEnemyFlag == 1 && this.guildWarStatus == GuildwarConst.status.showing) {
|
this.updateGuildWarRedStatus(GuildConst.red_index.guildwar_match, true);
|
} else if (this.guildWarEnemyFlag == 1 && this.guildWarStatus == GuildwarConst.status.processing) {
|
this.updateGuildWarRedStatus(GuildConst.red_index.guildwar_start, true);
|
this.updateGuildWarRedStatus(GuildConst.red_index.guildwar_match, false);
|
} else {
|
this.updateGuildWarRedStatus(GuildConst.red_index.guildwar_match, false);
|
this.updateGuildWarRedStatus(GuildConst.red_index.guildwar_start, false);
|
}
|
},
|
getGuildWarStatus: function getGuildWarStatus() {
|
return this.guildWarStatus;
|
},
|
getGuildWarSurplusTime: function getGuildWarSurplusTime() {
|
return this.guildWarEndTime - gcore.SmartSocket.getTime();
|
},
|
getGuildWarEnemyFlag: function getGuildWarEnemyFlag() {
|
return this.guildWarEnemyFlag;
|
},
|
//设置我方联盟战据点数据
|
setMyGuildWarPositionData: function setMyGuildWarPositionData(dataList) {
|
this.myGuildWarPositionList = {};
|
|
for (var k in dataList) {
|
var data = dataList[k];
|
var position_vo = new GuildWarPositionVo();
|
position_vo.updateData(data);
|
this.myGuildWarPositionList[data.pos] = position_vo;
|
}
|
},
|
getMyGuildWarPositionList: function getMyGuildWarPositionList() {
|
return this.myGuildWarPositionList;
|
},
|
//更新我方据点数据(变量更)
|
updateMyGuildWarPositionData: function updateMyGuildWarPositionData(dataList) {
|
dataList = dataList || {};
|
|
for (var k in dataList) {
|
var data = dataList[k];
|
var position_vo = this.myGuildWarPositionList[data.pos];
|
|
if (position_vo) {
|
position_vo.updateData(data);
|
}
|
}
|
},
|
//更新敌方据点数据(变量更)
|
updateEnemyGuildWarPositionData: function updateEnemyGuildWarPositionData(dataList) {
|
dataList = dataList || {};
|
|
for (var k in dataList) {
|
var data = dataList[k];
|
var position_vo = this.enemyGuildWarPositionList[data.pos];
|
|
if (position_vo) {
|
position_vo.updateData(data);
|
}
|
}
|
},
|
//设置联盟战前三名数据
|
setGuildWarTopThreeRank: function setGuildWarTopThreeRank(data) {
|
this.guildWarTopThreeRank = data;
|
},
|
getGuildWarTopThreeRank: function getGuildWarTopThreeRank() {
|
return this.guildWarTopThreeRank;
|
},
|
//更新联盟战红点
|
updateGuildWarRedStatus: function updateGuildWarRedStatus(bid, status, is_just_guildwar) {
|
if (this.guildwar_red_list == null) {
|
this.guildwar_red_list = {};
|
}
|
|
var _status = this.guildwar_red_list[bid];
|
if (_status == status) return;
|
this.guildwar_red_list[bid] = status;
|
|
if (!is_just_guildwar) {
|
//更新场景红点状态
|
var MainuiConst = require("mainui_const");
|
|
require("mainui_controller").getInstance().setBtnRedPoint(MainuiConst.btn_index.guild, {
|
bid: bid,
|
status: status
|
}); //更新公会主界面红点
|
|
|
gcore.GlobalEvent.fire(GuildEvent.UpdateGuildRedStatus, bid, status);
|
} //更新公会战主界面红点
|
|
|
gcore.GlobalEvent.fire(GuildwarEvent.UpdateGuildWarRedStatusEvent, bid, status);
|
},
|
checkRedIsShowByRedType: function checkRedIsShowByRedType(redType) {
|
return this.guildwar_red_list[redType] || false;
|
},
|
checkGuildGuildWarRedStatus: function checkGuildGuildWarRedStatus() {
|
for (var k in this.guildwar_red_list) {
|
//排除日志红点,日志无需在入口处显示红点
|
var v = this.guildwar_red_list[k];
|
|
if (v == true && k != GuildConst.red_index.guildwar_log) {
|
return true;
|
}
|
}
|
|
return false;
|
},
|
//设置奖励宝箱数据
|
setGuildWarBoxData: function setGuildWarBoxData(data) {
|
var dataList = data.guild_war_box;
|
var result = data.result;
|
var status = data.status;
|
var end_time = data.end_time;
|
|
if (dataList) {
|
this.award_box_data = [];
|
|
for (var k in dataList) {
|
var data = dataList[k];
|
data.status = result; // 在这里赋值宝箱类型(金和铜)
|
|
var box_vo = new GuildWarBoxVo();
|
box_vo.updateData(data);
|
this.award_box_data.push(box_vo);
|
}
|
}
|
|
var cur_time = gcore.SmartSocket.getTime(); //是否有权限领取宝箱、是否已到领取截止时间
|
|
if (status && status == 1 && end_time && end_time > cur_time) {
|
this.is_can_get_box = true;
|
} else {
|
this.is_can_get_box = false;
|
}
|
|
if (this.is_can_get_box && !this.checkIsGetBoxAward()) {
|
this.updateGuildWarRedStatus(GuildConst.red_index.guildwar_box, true);
|
} else {
|
this.updateGuildWarRedStatus(GuildConst.red_index.guildwar_box, false);
|
}
|
},
|
//更新宝箱数据
|
updateGuildWarBoxData: function updateGuildWarBoxData(data) {
|
if (data) {
|
var box_vo = this.getGuildWarDataByOrder(data.order);
|
|
if (box_vo) {
|
box_vo.updateData(data);
|
}
|
|
if (this.is_can_get_box && !this.checkIsGetBoxAward()) {
|
this.updateGuildWarRedStatus(GuildConst.red_index.guildwar_box, true);
|
} else {
|
this.updateGuildWarRedStatus(GuildConst.red_index.guildwar_box, false);
|
}
|
}
|
},
|
//根据序号获取宝箱数据
|
getGuildWarDataByOrder: function getGuildWarDataByOrder(order) {
|
for (var k in this.award_box_data) {
|
var box_vo = this.award_box_data[k];
|
|
if (box_vo.order == order) {
|
return box_vo;
|
}
|
}
|
},
|
//获取全部宝箱数据
|
getGuildWarBoxData: function getGuildWarBoxData() {
|
return this.award_box_data;
|
},
|
//玩家是否领取了宝箱数据
|
checkIsGetBoxAward: function checkIsGetBoxAward() {
|
var is_get = false;
|
|
var role_vo = require("role_controller").getInstance().getRoleVo();
|
|
for (var k in this.award_box_data) {
|
var box_vo = this.award_box_data[k];
|
|
if (box_vo.rid == role_vo.rid && box_vo.sid == role_vo.srv_id) {
|
is_get = true;
|
break;
|
}
|
}
|
|
return is_get;
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlsZHdhclxcZ3VpbGR3YXJfbW9kZWwuanMiXSwibmFtZXMiOlsiR3VpbGRDb25zdCIsInJlcXVpcmUiLCJHdWlsZHdhckNvbnN0IiwiR3VpbGRXYXJQb3NpdGlvblZvIiwiR3VpbGRFdmVudCIsIkd1aWxkd2FyRXZlbnQiLCJHdWlsZFdhckJveFZvIiwiR3VpbGRfd2FyTW9kZWwiLCJjYyIsIkNsYXNzIiwiQmFzZUNsYXNzIiwiY3RvciIsImN0cmwiLCJhcmd1bWVudHMiLCJwcm9wZXJ0aWVzIiwiaW5pdENvbmZpZyIsImNoYWxsZW5nZUNvdW50IiwiZ3VpbGRXYXJSZXN1bHQiLCJyZXN1bHQiLCJmaWdodGluZyIsIm15R3VpbGRXYXJCYXNlSW5mbyIsImVuZW15R3VpbGRXYXJCYXNlSW5mbyIsImd1aWxkV2FyU3RhdHVzIiwic3RhdHVzIiwiY2xvc2UiLCJndWlsZFdhclN0YXJ0VGltZSIsImd1aWxkV2FyRW5kVGltZSIsImd1aWxkV2FyRW5lbXlGbGFnIiwiZ3VpbGRXYXJUb3BUaHJlZVJhbmsiLCJteUd1aWxkV2FyUG9zaXRpb25MaXN0IiwiZW5lbXlHdWlsZFdhclBvc2l0aW9uTGlzdCIsImF3YXJkX2JveF9kYXRhIiwiZ3VpbGR3YXJfcmVkX2xpc3QiLCJjaGVja0lzSGF2ZUVuZW15Q2FjaGVEYXRhIiwiVXRpbHMiLCJuZXh0Iiwic2V0R3VpbGRXYXJDaGFsbGVuZ2VDb3VudCIsImNvdW50IiwidXBkYXRlQ2hhbGxlbmdlQ291bnRSZWRTdGF0dXMiLCJnZXRHdWlsZFdhckNoYWxsZW5nZUNvdW50IiwicHJvY2Vzc2luZyIsIkNvbmZpZyIsImd1aWxkX3dhcl9kYXRhIiwiZGF0YV9jb25zdCIsImNoYWxsYW5nZV90aW1lX2xpbWl0IiwidmFsIiwidXBkYXRlR3VpbGRXYXJSZWRTdGF0dXMiLCJyZWRfaW5kZXgiLCJndWlsZHdhcl9jb3VudCIsInNldEd1aWxkV2FyUmVzdWx0IiwiZ2V0R3VpbGRXYXJSZXN1bHQiLCJzZXRNeUd1aWxkV2FyQmFzZUluZm8iLCJkYXRhIiwiZ2V0TXlHdWlsZFdhckJhc2VJbmZvIiwidXBkYXRlTXlHdWlsZFdhckJhc2VJbmZvIiwiayIsInVwZGF0ZUVuZW15R3VpbGRXYXJCYXNlSW5mbyIsImhwIiwiZ2V0RW5lbXlHdWlsZFdhckJhc2VJbmZvIiwic2V0RW5lbXlHdWlsZFdhckRhdGEiLCJnbmFtZSIsImduYW1lMiIsImhwMiIsImdfaWQiLCJnX3NpZCIsImRlZmVuc2UiLCJwZGF0YSIsInBvc2l0aW9uX3ZvIiwidXBkYXRlRGF0YSIsInBvcyIsImdldEVuZW15R3VpbGRXYXJQb3NpdGlvbkxpc3QiLCJsaXN0IiwiaSIsInZvIiwicHVzaCIsImdldEVuZW15UG9zaXRpb25IcEJ5UG9zIiwiY2hlY2tFbmVteUlzSGF2ZUxpdmVQb3NpdGlvbiIsImlzX2hhdmUiLCJzZXRHdWlsZFdhclN0YXR1cyIsInN0YXJ0X3RpbWUiLCJlbmRfdGltZSIsImZsYWciLCJjaGVja0d1aWxkV2FyU3RhdHVzUmVkIiwic2hvd2luZyIsImd1aWxkd2FyX21hdGNoIiwiZ3VpbGR3YXJfc3RhcnQiLCJnZXRHdWlsZFdhclN0YXR1cyIsImdldEd1aWxkV2FyU3VycGx1c1RpbWUiLCJnY29yZSIsIlNtYXJ0U29ja2V0IiwiZ2V0VGltZSIsImdldEd1aWxkV2FyRW5lbXlGbGFnIiwic2V0TXlHdWlsZFdhclBvc2l0aW9uRGF0YSIsImRhdGFMaXN0IiwiZ2V0TXlHdWlsZFdhclBvc2l0aW9uTGlzdCIsInVwZGF0ZU15R3VpbGRXYXJQb3NpdGlvbkRhdGEiLCJ1cGRhdGVFbmVteUd1aWxkV2FyUG9zaXRpb25EYXRhIiwic2V0R3VpbGRXYXJUb3BUaHJlZVJhbmsiLCJnZXRHdWlsZFdhclRvcFRocmVlUmFuayIsImJpZCIsImlzX2p1c3RfZ3VpbGR3YXIiLCJfc3RhdHVzIiwiTWFpbnVpQ29uc3QiLCJnZXRJbnN0YW5jZSIsInNldEJ0blJlZFBvaW50IiwiYnRuX2luZGV4IiwiZ3VpbGQiLCJHbG9iYWxFdmVudCIsImZpcmUiLCJVcGRhdGVHdWlsZFJlZFN0YXR1cyIsIlVwZGF0ZUd1aWxkV2FyUmVkU3RhdHVzRXZlbnQiLCJjaGVja1JlZElzU2hvd0J5UmVkVHlwZSIsInJlZFR5cGUiLCJjaGVja0d1aWxkR3VpbGRXYXJSZWRTdGF0dXMiLCJ2IiwiZ3VpbGR3YXJfbG9nIiwic2V0R3VpbGRXYXJCb3hEYXRhIiwiZ3VpbGRfd2FyX2JveCIsImJveF92byIsImN1cl90aW1lIiwiaXNfY2FuX2dldF9ib3giLCJjaGVja0lzR2V0Qm94QXdhcmQiLCJndWlsZHdhcl9ib3giLCJ1cGRhdGVHdWlsZFdhckJveERhdGEiLCJnZXRHdWlsZFdhckRhdGFCeU9yZGVyIiwib3JkZXIiLCJnZXRHdWlsZFdhckJveERhdGEiLCJpc19nZXQiLCJyb2xlX3ZvIiwiZ2V0Um9sZVZvIiwicmlkIiwic2lkIiwic3J2X2lkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFVBQVUsR0FBR0MsT0FBTyxDQUFDLGFBQUQsQ0FBeEI7O0FBQ0EsSUFBSUMsYUFBYSxHQUFHRCxPQUFPLENBQUMsZ0JBQUQsQ0FBM0I7O0FBQ0EsSUFBSUUsa0JBQWtCLEdBQUdGLE9BQU8sQ0FBQyxzQkFBRCxDQUFoQzs7QUFDQSxJQUFJRyxVQUFVLEdBQUdILE9BQU8sQ0FBQyxhQUFELENBQXhCOztBQUNBLElBQUlJLGFBQWEsR0FBR0osT0FBTyxDQUFDLGdCQUFELENBQTNCOztBQUNBLElBQUlLLGFBQWEsR0FBR0wsT0FBTyxDQUFDLGlCQUFELENBQTNCOztBQUVBLElBQUlNLGNBQWMsR0FBR0MsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDMUIsYUFBU0MsU0FEaUI7QUFFMUJDLEVBQUFBLElBQUksRUFBRSxnQkFBWTtBQUNkLFNBQUtDLElBQUwsR0FBWUMsU0FBUyxDQUFDLENBQUQsQ0FBckI7QUFDSCxHQUp5QjtBQU0xQkMsRUFBQUEsVUFBVSxFQUFFLEVBTmM7QUFTMUJDLEVB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QXlDMEIsU0FBekMsRUFBZDs7QUFDQSxTQUFLLElBQUkxRSxDQUFULElBQWMsS0FBS3hCLGNBQW5CLEVBQW1DO0FBQy9CLFVBQUl1RixNQUFNLEdBQUcsS0FBS3ZGLGNBQUwsQ0FBb0J3QixDQUFwQixDQUFiOztBQUNBLFVBQUkrRCxNQUFNLENBQUNZLEdBQVAsSUFBY0YsT0FBTyxDQUFDRSxHQUF0QixJQUE2QlosTUFBTSxDQUFDYSxHQUFQLElBQWNILE9BQU8sQ0FBQ0ksTUFBdkQsRUFBK0Q7QUFDM0RMLFFBQUFBLE1BQU0sR0FBRyxJQUFUO0FBQ0E7QUFDSDtBQUNKOztBQUNELFdBQU9BLE1BQVA7QUFDSDtBQWhWeUIsQ0FBVCxDQUFyQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDov5nph4zloavlhpnor6bnu4bor7TmmI4s5Li76KaB5aGr5YaZ6K+l5qih5Z2X55qE5Yqf6IO9566A6KaBXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wNS0wNiAxNzo1Njo0N1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBHdWlsZENvbnN0ID0gcmVxdWlyZShcImd1aWxkX2NvbnN0XCIpO1xudmFyIEd1aWxkd2FyQ29uc3QgPSByZXF1aXJlKFwiZ3VpbGR3YXJfY29uc3RcIik7XG52YXIgR3VpbGRXYXJQb3NpdGlvblZvID0gcmVxdWlyZShcImd1aWxkd2FyX3Bvc2l0aW9uX3ZvXCIpO1xudmFyIEd1aWxkRXZlbnQgPSByZXF1aXJlKFwiZ3VpbGRfZXZlbnRcIik7XG52YXIgR3VpbGR3YXJFdmVudCA9IHJlcXVpcmUoXCJndWlsZHdhcl9ldmVudFwiKTtcbnZhciBHdWlsZFdhckJveFZvID0gcmVxdWlyZShcImd1aWxkd2FyX2JveF92b1wiKTtcblxudmFyIEd1aWxkX3dhck1vZGVsID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDbGFzcyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY3RybCA9IGFyZ3VtZW50c1swXTtcbiAgICB9LFxuXG4gICAgcHJvcGVydGllczoge1xuICAgIH0sXG5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY2hhbGxlbmdlQ291bnQgPSAwIFx0XHQvLyDlt7LmjJHmiJjmrKHmlbBcbiAgICAgICAgdGhpcy5ndWlsZFdhclJlc3VsdCA9IEd1aWxkd2FyQ29uc3QucmVzdWx0LmZpZ2h0aW5nIC8vIOaImOaWl+e7k+aenFxuICAgICAgICB0aGlzLm15R3VpbGRXYXJCYXNlSW5mbyA9IHt9XHQvLyDmiJHmlrnogZTnm5/miJjln7rnoYDmlbDmja4o5pif5pWw44CBYnVmZuetiSlcbiAgICAgICAgdGhpcy5lbmVteUd1aWxkV2FyQmFzZUluZm8gPSB7fSAvLyDmlYzmlrnogZTnm5/miJjln7rnoYDmlbDmja4o5pif5pWw44CB5ZCN56ewKVxuICAgICAgICB0aGlzLmd1aWxkV2FyU3RhdHVzID0gR3VpbGR3YXJDb25zdC5zdGF0dXMuY2xvc2UgLy8g6IGU55uf5oiY54q25oCBXG4gICAgICAgIHRoaXMuZ3VpbGRXYXJTdGFydFRpbWUgPSAwIFx0XHQvLyDogZTnm5/miJjlvIDlp4vml7bpl7RcbiAgICAgICAgdGhpcy5ndWlsZFdhckVuZFRpbWUgPSAwIFx0XHQvLyDogZTnm5/miJjnu5PmnZ/ml7bpl7RcbiAgICAgICAgdGhpcy5ndWlsZFdhckVuZW15RmxhZyA9IDAgXHRcdC8vIOaYr+WQpuWMuemFjeWIsOWvueaJi1xuICAgICAgICB0aGlzLmd1aWxkV2FyVG9wVGhyZWVSYW5rID0ge30gIC8vIOWJjeS4ieaOkuWQjVxuXG4gICAgICAgIHRoaXMubXlHdWlsZFdhclBvc2l0aW9uTGlzdCA9IHt9ICAvLyDmiJHmlrnmja7ngrnmlbDmja5cbiAgICAgICAgdGhpcy5lbmVteUd1aWxkV2FyUG9zaXRpb25MaXN0ID0ge30gLy8g5pWM5pa55o2u54K55pWw5o2uXG5cbiAgICAgICAgdGhpcy5hd2FyZF9ib3hfZGF0YSA9IFtdOyAgXHRcdC8vIOWlluWKseWuneeuseaVsOaNrlxuXG4gICAgICAgIHRoaXMuZ3VpbGR3YXJfcmVkX2xpc3QgPSB7fTtcdC8vIOe6oueCueaVsOaNrlxuICAgIH0sXG5cbiAgICAvL+acrOWcsOaYr+WQpuacieiBlOebn+aImOaVjOaWueaVsOaNrlxuICAgIGNoZWNrSXNIYXZlRW5lbXlDYWNoZURhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKFV0aWxzLm5leHQodGhpcy5lbmVteUd1aWxkV2FyUG9zaXRpb25MaXN0KSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/orr7nva7lt7LmjJHmiJjmrKHmlbBcbiAgICBzZXRHdWlsZFdhckNoYWxsZW5nZUNvdW50OiBmdW5jdGlvbiAoY291bnQpIHtcbiAgICAgICAgdGhpcy5jaGFsbGVuZ2VDb3VudCA9IGNvdW50IHx8IDA7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hhbGxlbmdlQ291bnRSZWRTdGF0dXMoMCk7XG4gICAgfSxcblxuICAgIGdldEd1aWxkV2FyQ2hhbGxlbmdlQ291bnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbGxlbmdlQ291bnQ7XG4gICAgfSxcblxuICAgIC8v5pu05paw5oyR5oiY5qyh5pWw57qi54K5XG4gICAgdXBkYXRlQ2hhbGxlbmdlQ291bnRSZWRTdGF0dXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZ3VpbGRXYXJFbmVteUZsYWcgPT0gMSAmJiB0aGlzLmd1aWxkV2FyU3RhdHVzID09IEd1aWxkd2FyQ29uc3Quc3RhdHVzLnByb2Nlc3NpbmcgJiYgdGhpcy5jaGFsbGVuZ2VDb3VudCA8IENvbmZpZy5ndWlsZF93YXJfZGF0YS5kYXRhX2NvbnN0LmNoYWxsYW5nZV90aW1lX2xpbWl0LnZhbCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVHdWlsZFdhclJlZFN0YXR1cyhHdWlsZENvbnN0LnJlZF9pbmRleC5ndWlsZHdhcl9jb3VudCwgdHJ1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlR3VpbGRXYXJSZWRTdGF0dXMoR3VpbGRDb25zdC5yZWRfaW5kZXguZ3VpbGR3YXJfY291bnQsIGZhbHNlKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6K6+572u6IGU55uf5oiY57uT5p6cXG4gICAgc2V0R3VpbGRXYXJSZXN1bHQ6IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5ndWlsZFdhclJlc3VsdCA9IHJlc3VsdDtcbiAgICB9LFxuXG4gICAgZ2V0R3VpbGRXYXJSZXN1bHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGRXYXJSZXN1bHRcbiAgICB9LFxuXG4gICAgLy/orr7nva7miJHmlrnogZTnm5/miJjln7rnoYDmlbDmja4o5pif5pWw44CBYnVmZuetiSlcbiAgICBzZXRNeUd1aWxkV2FyQmFzZUluZm86IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHRoaXMubXlHdWlsZFdhckJhc2VJbmZvID0gZGF0YSB8fCB7fTtcbiAgICB9LFxuXG4gICAgZ2V0TXlHdWlsZFdhckJhc2VJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm15R3VpbGRXYXJCYXNlSW5mbztcbiAgICB9LFxuXG4gICAgLy/mm7TmlrDmiJHmlrnogZTnm5/miJjln7rnoYDmlbDmja5cbiAgICB1cGRhdGVNeUd1aWxkV2FyQmFzZUluZm86ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIGZvcih2YXIgayBpbiBkYXRhKXtcbiAgICAgICAgICAgIHRoaXMubXlHdWlsZFdhckJhc2VJbmZvW2tdID0gZGF0YVtrXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+abtOaWsOaVjOaWueiBlOebn+aImOWfuuehgOaVsOaNrijnm67liY3lj6rmmK/mmJ/mlbApXG4gICAgdXBkYXRlRW5lbXlHdWlsZFdhckJhc2VJbmZvOiBmdW5jdGlvbiAoaHApIHtcbiAgICAgICAgdGhpcy5lbmVteUd1aWxkV2FyQmFzZUluZm8uaHAgPSBocDtcbiAgICB9LFxuXG4gICAgZ2V0RW5lbXlHdWlsZFdhckJhc2VJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuZW15R3VpbGRXYXJCYXNlSW5mb1xuICAgIH0sXG5cbiAgICAvL+iuvue9ruaVjOaWueiBlOebn+aImOaVsOaNrlxuICAgIHNldEVuZW15R3VpbGRXYXJEYXRhOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAvL+WfuuehgOaVsOaNrlxuICAgICAgICB0aGlzLmVuZW15R3VpbGRXYXJCYXNlSW5mby5nbmFtZSA9IGRhdGEuZ25hbWUyIHx8IFwiXCI7XG4gICAgICAgIHRoaXMuZW5lbXlHdWlsZFdhckJhc2VJbmZvLmhwID0gZGF0YS5ocDIgfHwgMDtcbiAgICAgICAgdGhpcy5lbmVteUd1aWxkV2FyQmFzZUluZm8uZ19pZCA9IGRhdGEuZ19pZCB8fCAwO1xuICAgICAgICB0aGlzLmVuZW15R3VpbGRXYXJCYXNlSW5mby5nX3NpZCA9IGRhdGEuZ19zaWQgfHwgXCJcIjtcblxuICAgICAgICAvL+aNrueCueaVsOaNrlxuICAgICAgICB0aGlzLmVuZW15R3VpbGRXYXJQb3NpdGlvbkxpc3QgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgayBpbiAoZGF0YS5kZWZlbnNlIHx8IHt9KSkge1xuICAgICAgICAgICAgdmFyIHBkYXRhID0gZGF0YS5kZWZlbnNlW2tdO1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uX3ZvID0gbmV3IEd1aWxkV2FyUG9zaXRpb25WbygpO1xuICAgICAgICAgICAgcG9zaXRpb25fdm8udXBkYXRlRGF0YShwZGF0YSk7XG4gICAgICAgICAgICB0aGlzLmVuZW15R3VpbGRXYXJQb3NpdGlvbkxpc3RbcGRhdGEucG9zXSA9IHBvc2l0aW9uX3ZvXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0RW5lbXlHdWlsZFdhclBvc2l0aW9uTGlzdDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuZW5lbXlHdWlsZFdhclBvc2l0aW9uTGlzdCkge1xuICAgICAgICAgICAgdmFyIHZvID0gdGhpcy5lbmVteUd1aWxkV2FyUG9zaXRpb25MaXN0W2ldO1xuICAgICAgICAgICAgaWYgKHZvKSB7XG4gICAgICAgICAgICAgICAgbGlzdC5wdXNoKHZvKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaXN0O1xuICAgIH0sXG5cbiAgICAvL+iOt+WPluaVjOaWueafkOS4gOaNrueCueeahOW9k+WJjeihgOmHj1xuICAgIGdldEVuZW15UG9zaXRpb25IcEJ5UG9zOiBmdW5jdGlvbiAocG9zKSB7XG4gICAgICAgIHZhciBwb3NpdGlvbl92byA9IHRoaXMuZW5lbXlHdWlsZFdhclBvc2l0aW9uTGlzdFtwb3NdO1xuICAgICAgICBpZiAocG9zaXRpb25fdm8pIHtcbiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbl92by5ocDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMFxuICAgIH0sXG5cbiAgICAvL+aVjOaWueaYr+WQpui/mOacieWtmOa0u+eahOaNrueCuVxuICAgIGNoZWNrRW5lbXlJc0hhdmVMaXZlUG9zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlzX2hhdmUgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmVuZW15R3VpbGRXYXJQb3NpdGlvbkxpc3QpIHtcbiAgICAgICAgICAgIHZhciB2byA9IHRoaXMuZW5lbXlHdWlsZFdhclBvc2l0aW9uTGlzdFtrXTtcbiAgICAgICAgICAgIGlmICh2by5ocCA+IDApIHtcbiAgICAgICAgICAgICAgICBpc19oYXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc19oYXZlO1xuICAgIH0sXG5cbiAgICAvL+iuvue9ruiBlOebn+aImOeKtuaAgeaVsOaNrlxuICAgIHNldEd1aWxkV2FyU3RhdHVzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB0aGlzLmd1aWxkV2FyU3RhdHVzID0gZGF0YS5zdGF0dXMgfHwgR3VpbGR3YXJDb25zdC5zdGF0dXMuY2xvc2U7XG4gICAgICAgIHRoaXMuZ3VpbGRXYXJTdGFydFRpbWUgPSBkYXRhLnN0YXJ0X3RpbWUgfHwgMDtcbiAgICAgICAgdGhpcy5ndWlsZFdhckVuZFRpbWUgPSBkYXRhLmVuZF90aW1lIHx8IDA7XG4gICAgICAgIHRoaXMuZ3VpbGRXYXJFbmVteUZsYWcgPSBkYXRhLmZsYWcgfHwgMDtcblxuICAgICAgICAvL+W9k+eKtuaAgeWPmOS4uuacquW8gOWQr+aXtu+8jOa4heaOiee8k+WtmOaVsOaNrlxuICAgICAgICBpZiAodGhpcy5ndWlsZFdhclN0YXR1cyA9PSBHdWlsZHdhckNvbnN0LnN0YXR1cy5jbG9zZSkge1xuICAgICAgICAgICAgdGhpcy5pbml0Q29uZmlnKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGVja0d1aWxkV2FyU3RhdHVzUmVkKClcbiAgICAgICAgdGhpcy51cGRhdGVDaGFsbGVuZ2VDb3VudFJlZFN0YXR1cygpXG4gICAgfSxcblxuICAgIC8v5pu05paw6IGU55uf5oiY54q25oCB55qE57qi54K5XG4gICAgY2hlY2tHdWlsZFdhclN0YXR1c1JlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5ndWlsZFdhckVuZW15RmxhZyA9PSAxICYmIHRoaXMuZ3VpbGRXYXJTdGF0dXMgPT0gR3VpbGR3YXJDb25zdC5zdGF0dXMuc2hvd2luZykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVHdWlsZFdhclJlZFN0YXR1cyhHdWlsZENvbnN0LnJlZF9pbmRleC5ndWlsZHdhcl9tYXRjaCwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5ndWlsZFdhckVuZW15RmxhZyA9PSAxICYmIHRoaXMuZ3VpbGRXYXJTdGF0dXMgPT0gR3VpbGR3YXJDb25zdC5zdGF0dXMucHJvY2Vzc2luZykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVHdWlsZFdhclJlZFN0YXR1cyhHdWlsZENvbnN0LnJlZF9pbmRleC5ndWlsZHdhcl9zdGFydCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkV2FyUmVkU3RhdHVzKEd1aWxkQ29uc3QucmVkX2luZGV4Lmd1aWxkd2FyX21hdGNoLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkV2FyUmVkU3RhdHVzKEd1aWxkQ29uc3QucmVkX2luZGV4Lmd1aWxkd2FyX21hdGNoLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkV2FyUmVkU3RhdHVzKEd1aWxkQ29uc3QucmVkX2luZGV4Lmd1aWxkd2FyX3N0YXJ0LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0R3VpbGRXYXJTdGF0dXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGRXYXJTdGF0dXNcbiAgICB9LFxuXG4gICAgZ2V0R3VpbGRXYXJTdXJwbHVzVGltZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlsZFdhckVuZFRpbWUgLSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCk7XG4gICAgfSxcblxuICAgIGdldEd1aWxkV2FyRW5lbXlGbGFnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkV2FyRW5lbXlGbGFnXG4gICAgfSxcblxuICAgIC8v6K6+572u5oiR5pa56IGU55uf5oiY5o2u54K55pWw5o2uXG4gICAgc2V0TXlHdWlsZFdhclBvc2l0aW9uRGF0YTogZnVuY3Rpb24gKGRhdGFMaXN0KSB7XG4gICAgICAgIHRoaXMubXlHdWlsZFdhclBvc2l0aW9uTGlzdCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFMaXN0KSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IGRhdGFMaXN0W2tdO1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uX3ZvID0gbmV3IEd1aWxkV2FyUG9zaXRpb25WbygpO1xuICAgICAgICAgICAgcG9zaXRpb25fdm8udXBkYXRlRGF0YShkYXRhKTtcbiAgICAgICAgICAgIHRoaXMubXlHdWlsZFdhclBvc2l0aW9uTGlzdFtkYXRhLnBvc10gPSBwb3NpdGlvbl92bztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRNeUd1aWxkV2FyUG9zaXRpb25MaXN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm15R3VpbGRXYXJQb3NpdGlvbkxpc3RcbiAgICB9LFxuXG4gICAgLy/mm7TmlrDmiJHmlrnmja7ngrnmlbDmja4o5Y+Y6YeP5pu0KVxuICAgIHVwZGF0ZU15R3VpbGRXYXJQb3NpdGlvbkRhdGE6IGZ1bmN0aW9uIChkYXRhTGlzdCkge1xuICAgICAgICBkYXRhTGlzdCA9IGRhdGFMaXN0IHx8IHt9O1xuICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFMaXN0KSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IGRhdGFMaXN0W2tdO1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uX3ZvID0gdGhpcy5teUd1aWxkV2FyUG9zaXRpb25MaXN0W2RhdGEucG9zXTtcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbl92bykge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uX3ZvLnVwZGF0ZURhdGEoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/mm7TmlrDmlYzmlrnmja7ngrnmlbDmja4o5Y+Y6YeP5pu0KVxuICAgIHVwZGF0ZUVuZW15R3VpbGRXYXJQb3NpdGlvbkRhdGE6IGZ1bmN0aW9uIChkYXRhTGlzdCkge1xuICAgICAgICBkYXRhTGlzdCA9IGRhdGFMaXN0IHx8IHt9O1xuICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFMaXN0KSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IGRhdGFMaXN0W2tdO1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uX3ZvID0gdGhpcy5lbmVteUd1aWxkV2FyUG9zaXRpb25MaXN0W2RhdGEucG9zXTtcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbl92bykge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uX3ZvLnVwZGF0ZURhdGEoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/orr7nva7ogZTnm5/miJjliY3kuInlkI3mlbDmja5cbiAgICBzZXRHdWlsZFdhclRvcFRocmVlUmFuazogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5ndWlsZFdhclRvcFRocmVlUmFuayA9IGRhdGE7XG4gICAgfSxcblxuICAgIGdldEd1aWxkV2FyVG9wVGhyZWVSYW5rOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkV2FyVG9wVGhyZWVSYW5rXG4gICAgfSxcblxuICAgIC8v5pu05paw6IGU55uf5oiY57qi54K5XG4gICAgdXBkYXRlR3VpbGRXYXJSZWRTdGF0dXM6IGZ1bmN0aW9uIChiaWQsIHN0YXR1cywgaXNfanVzdF9ndWlsZHdhcikge1xuICAgICAgICBpZiAodGhpcy5ndWlsZHdhcl9yZWRfbGlzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmd1aWxkd2FyX3JlZF9saXN0ID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9zdGF0dXMgPSB0aGlzLmd1aWxkd2FyX3JlZF9saXN0W2JpZF07XG4gICAgICAgIGlmIChfc3RhdHVzID09IHN0YXR1cykgcmV0dXJuXG4gICAgICAgIHRoaXMuZ3VpbGR3YXJfcmVkX2xpc3RbYmlkXSA9IHN0YXR1cztcbiAgICAgICAgaWYgKCFpc19qdXN0X2d1aWxkd2FyKSB7XG4gICAgICAgICAgICAvL+abtOaWsOWcuuaZr+e6oueCueeKtuaAgVxuICAgICAgICAgICAgdmFyIE1haW51aUNvbnN0ID0gcmVxdWlyZShcIm1haW51aV9jb25zdFwiKTtcbiAgICAgICAgICAgIHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLnNldEJ0blJlZFBvaW50KE1haW51aUNvbnN0LmJ0bl9pbmRleC5ndWlsZCwgeyBiaWQ6IGJpZCwgc3RhdHVzOiBzdGF0dXMgfSk7XG4gICAgICAgICAgICAvL+abtOaWsOWFrOS8muS4u+eVjOmdoue6oueCuVxuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZEV2ZW50LlVwZGF0ZUd1aWxkUmVkU3RhdHVzLCBiaWQsIHN0YXR1cylcbiAgICAgICAgfVxuICAgICAgICAvL+abtOaWsOWFrOS8muaImOS4u+eVjOmdoue6oueCuVxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkd2FyRXZlbnQuVXBkYXRlR3VpbGRXYXJSZWRTdGF0dXNFdmVudCwgYmlkLCBzdGF0dXMpO1xuICAgIH0sXG5cbiAgICBjaGVja1JlZElzU2hvd0J5UmVkVHlwZTogZnVuY3Rpb24gKHJlZFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGR3YXJfcmVkX2xpc3RbcmVkVHlwZV0gfHwgZmFsc2U7XG4gICAgfSxcblxuICAgIGNoZWNrR3VpbGRHdWlsZFdhclJlZFN0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZ3VpbGR3YXJfcmVkX2xpc3QpIHtcbiAgICAgICAgICAgIC8v5o6S6Zmk5pel5b+X57qi54K577yM5pel5b+X5peg6ZyA5Zyo5YWl5Y+j5aSE5pi+56S657qi54K5XG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMuZ3VpbGR3YXJfcmVkX2xpc3Rba107XG4gICAgICAgICAgICBpZiAodiA9PSB0cnVlICYmIGsgIT0gR3VpbGRDb25zdC5yZWRfaW5kZXguZ3VpbGR3YXJfbG9nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgLy/orr7nva7lpZblirHlrp3nrrHmlbDmja5cbiAgICBzZXRHdWlsZFdhckJveERhdGE6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHZhciBkYXRhTGlzdCA9IGRhdGEuZ3VpbGRfd2FyX2JveDtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGRhdGEucmVzdWx0O1xuICAgICAgICB2YXIgc3RhdHVzID0gZGF0YS5zdGF0dXM7XG4gICAgICAgIHZhciBlbmRfdGltZSA9IGRhdGEuZW5kX3RpbWU7XG5cbiAgICAgICAgaWYgKGRhdGFMaXN0KSB7XG4gICAgICAgICAgICB0aGlzLmF3YXJkX2JveF9kYXRhID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFMaXN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBkYXRhTGlzdFtrXTtcbiAgICAgICAgICAgICAgICBkYXRhLnN0YXR1cyA9IHJlc3VsdDsgICAvLyDlnKjov5nph4zotYvlgLzlrp3nrrHnsbvlnovvvIjph5Hlkozpk5zvvIlcbiAgICAgICAgICAgICAgICB2YXIgYm94X3ZvID0gbmV3IEd1aWxkV2FyQm94Vm8oKTtcbiAgICAgICAgICAgICAgICBib3hfdm8udXBkYXRlRGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLmF3YXJkX2JveF9kYXRhLnB1c2goYm94X3ZvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY3VyX3RpbWUgPSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCk7XG4gICAgICAgIC8v5piv5ZCm5pyJ5p2D6ZmQ6aKG5Y+W5a6d566x44CB5piv5ZCm5bey5Yiw6aKG5Y+W5oiq5q2i5pe26Ze0XG4gICAgICAgIGlmIChzdGF0dXMgJiYgc3RhdHVzID09IDEgJiYgZW5kX3RpbWUgJiYgZW5kX3RpbWUgPiBjdXJfdGltZSkge1xuICAgICAgICAgICAgdGhpcy5pc19jYW5fZ2V0X2JveCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzX2Nhbl9nZXRfYm94ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNfY2FuX2dldF9ib3ggJiYgIXRoaXMuY2hlY2tJc0dldEJveEF3YXJkKCkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlR3VpbGRXYXJSZWRTdGF0dXMoR3VpbGRDb25zdC5yZWRfaW5kZXguZ3VpbGR3YXJfYm94LCB0cnVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVHdWlsZFdhclJlZFN0YXR1cyhHdWlsZENvbnN0LnJlZF9pbmRleC5ndWlsZHdhcl9ib3gsIGZhbHNlKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5pu05paw5a6d566x5pWw5o2uXG4gICAgdXBkYXRlR3VpbGRXYXJCb3hEYXRhOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdmFyIGJveF92byA9IHRoaXMuZ2V0R3VpbGRXYXJEYXRhQnlPcmRlcihkYXRhLm9yZGVyKTtcbiAgICAgICAgICAgIGlmIChib3hfdm8pIHtcbiAgICAgICAgICAgICAgICBib3hfdm8udXBkYXRlRGF0YShkYXRhKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNfY2FuX2dldF9ib3ggJiYgIXRoaXMuY2hlY2tJc0dldEJveEF3YXJkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkV2FyUmVkU3RhdHVzKEd1aWxkQ29uc3QucmVkX2luZGV4Lmd1aWxkd2FyX2JveCwgdHJ1ZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVHdWlsZFdhclJlZFN0YXR1cyhHdWlsZENvbnN0LnJlZF9pbmRleC5ndWlsZHdhcl9ib3gsIGZhbHNlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5qC55o2u5bqP5Y+36I635Y+W5a6d566x5pWw5o2uXG4gICAgZ2V0R3VpbGRXYXJEYXRhQnlPcmRlcjogZnVuY3Rpb24gKG9yZGVyKSB7XG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5hd2FyZF9ib3hfZGF0YSkge1xuICAgICAgICAgICAgdmFyIGJveF92byA9IHRoaXMuYXdhcmRfYm94X2RhdGFba107XG4gICAgICAgICAgICBpZiAoYm94X3ZvLm9yZGVyID09IG9yZGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJveF92b1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6I635Y+W5YWo6YOo5a6d566x5pWw5o2uXG4gICAgZ2V0R3VpbGRXYXJCb3hEYXRhOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF3YXJkX2JveF9kYXRhXG4gICAgfSxcblxuICAgIC8v546p5a625piv5ZCm6aKG5Y+W5LqG5a6d566x5pWw5o2uXG4gICAgY2hlY2tJc0dldEJveEF3YXJkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpc19nZXQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHJvbGVfdm8gPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5hd2FyZF9ib3hfZGF0YSkge1xuICAgICAgICAgICAgdmFyIGJveF92byA9IHRoaXMuYXdhcmRfYm94X2RhdGFba107XG4gICAgICAgICAgICBpZiAoYm94X3ZvLnJpZCA9PSByb2xlX3ZvLnJpZCAmJiBib3hfdm8uc2lkID09IHJvbGVfdm8uc3J2X2lkKSB7XG4gICAgICAgICAgICAgICAgaXNfZ2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc19nZXRcbiAgICB9XG59KTsiXX0=
|