(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/script/common/gameMethod.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, '759dfgRoXNKsKzb4lS9Dfkm', 'gameMethod'); // script/common/gameMethod.ts "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SeedRand = exports.gameMethod = void 0; var gameCfg_1 = require("./gameCfg"); var gezi = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, ]; var GameMethod = /** @class */ (function () { function GameMethod() { } /** * 钻石购买金币获得道具公式 * @param id 配置表档位ID * @param level 角色等级 */ GameMethod.prototype.shopCoinItem = function (id, level) { var cfg = gameCfg_1.default.shopCoin.getItem(id); if (cfg == null) { return [1, 2, 1]; } var count = cfg.rate * Math.min(10 + Math.floor(level / 10), 50); return [1, 2, count]; }; /** * 两个对象合并 * @param obj1 from object * @param obj2 to object * @return obj2 */ GameMethod.prototype.objMerge = function (obj1, obj2) { obj1 = typeof obj1 != "object" ? {} : obj1; obj2 = typeof obj2 != "object" ? {} : obj2; for (var key in obj2) { if (obj1[key] == null) { obj1[key] = obj2[key]; continue; } if (typeof obj2[key] == "object") { this.objMerge(obj1[key], obj2[key]); continue; } obj1[key] = obj2[key]; } return obj1; //然后在把复制好的对象给return出去 }; /** * 两个对象合并 值相加 */ GameMethod.prototype.objMergeNum = function (_eps1, _eps2) { var eps = this.objCopy(_eps1); var ep2 = this.objCopy(_eps2); for (var key in ep2) { if (eps[key] == null) { eps[key] = 0; } eps[key] += ep2[key]; } return eps; }; /** * 数组合并 */ GameMethod.prototype.addArr = function (arr1, arr2) { var _arr1 = JSON.parse(JSON.stringify(arr1)); var _arr2 = JSON.parse(JSON.stringify(arr2)); for (var _i = 0, _arr2_1 = _arr2; _i < _arr2_1.length; _i++) { var arr = _arr2_1[_i]; _arr1.push(arr); } return _arr1; }; /** * 业务判空 以下情况返回true * 字符串 : 空字符的为空 * 数值: 0 为空 负数不为空 * 数组: 长度为0 * 对象: 没有节点 * 布尔型 false */ GameMethod.prototype.isEmpty = function (value) { if (value == null) { return true; } switch (typeof value) { case "string": if (value.length == null || value.length <= 0) { return true; } break; case "object": if (Object.keys(value).length > 0) { return false; } return true; case "number": if (value == 0) { return true; } break; case "boolean": if (value == false) { return true; } break; } return false; }; /** * 通用深拷贝函数。 * @param obj from object * @return obj2 */ GameMethod.prototype.objCopy = function (obj) { return JSON.parse(JSON.stringify(obj)); }; /** * 相同kind 和 itemid 数组合并 */ GameMethod.prototype.mergeArr = function (arrs) { var resObj = {}; for (var _i = 0, arrs_1 = arrs; _i < arrs_1.length; _i++) { var arr = arrs_1[_i]; if (resObj[arr[0]] == null) { resObj[arr[0]] = {}; } if (resObj[arr[0]][arr[1]] == null) { resObj[arr[0]][arr[1]] = 0; } resObj[arr[0]][arr[1]] += arr[2]; } var resArr = []; for (var kind in resObj) { for (var id in resObj[kind]) { resArr.push([parseInt(kind), parseInt(id), resObj[kind][id]]); } } return resArr; }; // 判断字符长度 GameMethod.prototype.getStrCharacterLength = function (str) { var patternChinese = new RegExp("[\u4E00-\u9FA5]+"); // 中文 var leng = 0; for (var index = 0; index < str.length; index++) { if (patternChinese.test(str[index])) { leng += 2; } else { leng += 1; } } return leng; }; /** * 随机数 * @param min * @param max */ GameMethod.prototype.rand = function (min, max) { return Math.round((max - min + 1) * Math.random() - 0.5) + min; }; //判断uuid是否npc GameMethod.prototype.isNpc = function (fuuid) { if (Number(fuuid) < 10000) { return true; } return false; }; GameMethod.prototype.hdDiZiModelRate = function (out, data, actDiZiList) { var rate = 0; var zRate = 0; for (var pzid in out.tree.list) { if (!data.list[pzid]) { console.error("hd_cfg_err:hdQiYuanModelRate: \u65E0\u6548\u7684\u54C1\u8D28ID " + pzid); continue; } for (var ygzid = 1; ygzid <= out.tree.list[pzid].open; ygzid++) { var _rate = 0; var _zRate = 0; var dzid = out.tree.list[pzid].dzList[ygzid]; if (!dzid || !actDiZiList[dzid]) { _rate += Number(data.make["2"].item[0]); _zRate += Number(data.make["2"].zItem[0]); continue; } var dzInfo = actDiZiList[dzid]; var cfgDzInfo = gameCfg_1.default.huobanBase.getItem(dzInfo.id); if (!cfgDzInfo) { continue; } var dzpinzhi = cfgDzInfo.pinzhi; // 等级加成 for (var _i = 0, _a = data.make[dzpinzhi.toString()].levelItem; _i < _a.length; _i++) { var chanchu = _a[_i]; if (chanchu[0] <= dzInfo.level && dzInfo.level <= chanchu[1]) { _rate += Number(chanchu[2]); break; } } for (var _b = 0, _c = data.make[dzpinzhi.toString()].levelZItem; _b < _c.length; _b++) { var chanchu = _c[_b]; if (chanchu[0] <= dzInfo.level && dzInfo.level <= chanchu[1]) { _zRate += Number(chanchu[2]); break; } } // 星级加成 for (var _d = 0, _e = data.make[dzpinzhi.toString()].starItem; _d < _e.length; _d++) { var chanchu = _e[_d]; if (chanchu[0] <= dzInfo.star && dzInfo.star <= chanchu[1]) { _rate += Number(chanchu[2]); break; } } for (var _f = 0, _g = data.make[dzpinzhi.toString()].starZItem; _f < _g.length; _f++) { var chanchu = _g[_f]; if (chanchu[0] <= dzInfo.star && dzInfo.star <= chanchu[1]) { _zRate += Number(chanchu[2]); break; } } if (Number(cfgDzInfo.liupai) === Number(pzid)) { _rate *= Number(data.make[dzpinzhi.toString()].item[2]); _zRate *= Number(data.make[dzpinzhi.toString()].zItem[2]); } else { _rate *= Number(data.make[dzpinzhi.toString()].item[1]); _zRate *= Number(data.make[dzpinzhi.toString()].zItem[1]); } rate += _rate; zRate += _zRate; } } return { rate: rate, zRate: zRate }; }; //根据速度和 当前XX 计算出当前总积分 兽灵 GameMethod.prototype.hdDiZiModelTotol = function (out, data, rate, zRate, nowTime) { //过了多长时间 var dtime = nowTime - out.tree.s_time; //根据速度 掉落 //现在改为限制产出时间,而不是限制产出数量 dtime = Math.min(dtime, data.tree.scoreTimeMax); var score = Math.round((rate * dtime) / 3600); var totol = score + out.tree.s_num; var zScore = Math.round((zRate * dtime) / 3600); var zTotal = zScore + out.tree.z_num; // if (totol > data.tree.scoreMax) { // //实际产出 // let sj = data.tree.scoreMax - out.tree.s_num; // //实际产出 所需时间 // dtime = Math.round((sj / rate) * 3600); // //获得的总产出 // totol = data.tree.scoreMax; // } //根据速率 结算 return { totol: totol, zTotal: zTotal, dtime: dtime, }; }; /** * 计算心魔积分范围 */ GameMethod.prototype.hdShouLingScore = function (xmId, cfg, actShouLing, gzids) { if (actShouLing === void 0) { actShouLing = {}; } if (gzids === void 0) { gzids = []; } var shoulingCfg = cfg.shouling[xmId]; if (shoulingCfg == null) { console.error("xmId_err :" + xmId); return [0, 0]; } //初始积分: 心魔积分 var scores = [shoulingCfg.score[0], shoulingCfg.score[1]]; for (var i = 0; i < gzids.length; i++) { var gzid = gzids[i]; var addOne = exports.gameMethod.hdShouLingScoreOne(cfg, actShouLing, gzid); scores[0] += addOne[0]; scores[1] += addOne[1]; } return scores; }; /** * 心魔计算 一个宠物加的积分 */ GameMethod.prototype.hdShouLingScoreOne = function (cfg, slinfo, gzid) { //初始积分: 心魔积分 var sadd = [0, 0]; //是否存在 if (slinfo[gzid] == null) { console.error("fzInfo_null :" + gzid); return sadd; } //获取法阵等级配置 var cfgsl = gameCfg_1.default.shoulingInfo.getItem(slinfo[gzid].slid); if (cfgsl == null) { console.error("cfgsl_null :" + gzid); return sadd; } //等级积分累加 if (cfg.sMath[cfgsl.pinzhi.toString()] != null) { //[积分价值,积分下限,积分上限,系数下限,系数上限] var pzcfg = cfg.sMath[cfgsl.pinzhi.toString()]; //积分价值 sadd[0] += pzcfg.xishu[0]; sadd[1] += pzcfg.xishu[0]; //积分上下限 sadd[0] += pzcfg.xishu[1]; sadd[1] += pzcfg.xishu[2]; //积分系数 * 等级(saveId) sadd[0] += slinfo[gzid].level * pzcfg.xishu[3]; sadd[1] += slinfo[gzid].level * pzcfg.xishu[4]; //积分系数 * 星级(saveId) sadd[0] += slinfo[gzid].star * pzcfg.xishu[5]; sadd[1] += slinfo[gzid].star * pzcfg.xishu[6]; } return sadd; }; /** * 计算灵脉积分产出 */ GameMethod.prototype.lingMaiScore = function (jingjieId, chenghaoId) { var cfgBase = gameCfg_1.default.mathInfo.getItem("lingmai_base_score"); if (cfgBase == null || cfgBase.pram == null || cfgBase.pram.count == null) { return 0; } //计算境界加成 var jingjieAdd = 0; var jingjieCfg = gameCfg_1.default.jingjieStep.getItem(jingjieId); if (jingjieCfg != null) { jingjieAdd = jingjieCfg.lmjc; } //计算称号加成 var titleAdd = 0; var titleCfg = gameCfg_1.default.chenghaoInfo.getItem(chenghaoId); if (titleCfg != null) { titleAdd = titleCfg.jc; } //初始积分: 心魔积分 var scores = Math.round(cfgBase.pram.count * (1 + jingjieAdd / 100) * (1 + titleAdd / 100)); return scores; }; //--------------属性计算 (主角基础属性 ) ------------------------- // (天赋数值+装备数值+基础属性)*(1+百分比加成)=面板属性 /** * 属性合并 */ GameMethod.prototype.ep_merge = function (_eps1, _eps2) { var eps = this.objCopy(_eps1); var ep2 = this.objCopy(_eps2); for (var key in ep2) { if (eps[key] == null) { eps[key] = 0; } eps[key] += ep2[key]; } eps.hp = eps.hp_max || 0; return eps; }; /** * {[key:string]:number} 属性合并 _eps2的key _eps1没有就不加 */ GameMethod.prototype.ep_mergeKv_has = function (_eps1, _eps2) { var eps = this.objCopy(_eps1); var ep2 = this.objCopy(_eps2); for (var key in ep2) { if (eps[key] == null) { continue; } eps[key] += ep2[key]; } eps["hp"] = eps["hp_max"]; //不要删 return eps; }; /** * {[key:string]:number} 属性合并 x 系数 */ GameMethod.prototype.ep_KvRate = function (_eps1, rate) { var eps = this.objCopy(_eps1); for (var key in eps) { eps[key] = Math.floor(eps[key] * rate); } return eps; }; /** * 属性初始化 */ GameMethod.prototype.ep_init = function () { var eps = {}; var userEpPool = gameCfg_1.default.userEp.pool; for (var key in userEpPool) { eps[userEpPool[key].key] = 0; } return eps; }; /** * 角色基础属性 */ GameMethod.prototype.ep_user = function () { var eps = {}; var userEpPool = gameCfg_1.default.userEp.pool; for (var key in userEpPool) { eps[userEpPool[key].key] = userEpPool[key].initEp; } return eps; }; /** * 属性展示总属性 */ GameMethod.prototype.ep_all_base = function (sevBack) { //属性初始化 var eps = this.ep_init(); //+角色基础属性 eps = this.ep_merge(eps, this.ep_user()); //后端记录的属性 if (sevBack.actEps != null && sevBack.actEps.a != null) { for (var kid in sevBack.actEps.a) { eps = exports.gameMethod.ep_merge(eps, sevBack.actEps.a[kid]); } } eps["hp"] = Math.round(eps["hp"]); eps["atk"] = Math.round(eps["atk"]); eps["def"] = Math.round(eps["def"]); return exports.gameMethod.objCopy(eps); }; /** * 属性展示总属性 (面板属性) * 面板属性 = 角色基础属性 */ GameMethod.prototype.ep_all = function (sevBack) { var eps = this.ep_all_base(sevBack); //攻速 eps.speed += Math.floor((eps.speed * eps.speed_per) / 10000); //攻击 eps.atk += Math.floor((eps.atk * eps.atk_per) / 10000); eps.atk += Math.floor((eps.atk * eps.finally_atk_per) / 10000); //防御 eps.def += Math.floor((eps.def * eps.def_per) / 10000); eps.def += Math.floor((eps.def * eps.finally_def_per) / 10000); //血量 eps.hp_max += Math.floor((eps.hp_max * eps.hp_max_per) / 10000); eps.hp_max += Math.floor((eps.hp_max * eps.finally_hp_max_per) / 10000); eps.hp = eps.hp_max; //攻速 eps.speed_per = 0; //攻击 eps.atk_per = 0; eps.finally_atk_per = 0; //防御 eps.def_per = 0; eps.finally_def_per = 0; //血量 eps.hp_max_per = 0; eps.finally_hp_max_per = 0; return exports.gameMethod.objCopy(eps); }; /** * 属性展示总属性 (面板属性) * 面板属性 = 角色基础属性 */ GameMethod.prototype.ep_all_fight = function (eps) { eps = exports.gameMethod.objCopy(eps); //攻速 eps.speed += Math.floor((eps.speed * eps.speed_per) / 10000); //攻击 eps.atk += Math.floor((eps.atk * eps.atk_per) / 10000); eps.atk += Math.floor((eps.atk * eps.finally_atk_per) / 10000); eps.atk += eps.finally_atk; //防御 eps.def += Math.floor((eps.def * eps.def_per) / 10000); eps.def += Math.floor((eps.def * eps.finally_def_per) / 10000); eps.def += eps.finally_def; //血量 eps.hp_max += Math.floor((eps.hp_max * eps.hp_max_per) / 10000); eps.hp_max += Math.floor((eps.hp_max * eps.finally_hp_max_per) / 10000); eps.hp_max += eps.finally_hp_max; eps.hp = eps.hp_max; //攻速 eps.speed_per = 0; //攻击 eps.atk_per = 0; eps.finally_atk_per = 0; eps.finally_atk = 0; //防御 eps.def_per = 0; eps.finally_def_per = 0; eps.finally_def = 0; //血量 eps.hp_max_per = 0; eps.finally_hp_max_per = 0; eps.finally_hp_max = 0; return eps; }; /** * 属性展示总属性 (面板属性)显示最终属性 */ GameMethod.prototype.ep_all_zz = function (eps) { eps = exports.gameMethod.objCopy(eps); //攻击 var atk = eps.atk; atk += eps.atk_per ? Math.floor((atk * eps.atk_per) / 10000) : 0; atk += eps.finally_atk_per ? Math.floor((atk * eps.finally_atk_per) / 10000) : 0; atk += eps.finally_atk; //防御 var def = eps.def; def += eps.def_per ? Math.floor((def * eps.def_per) / 10000) : 0; def += eps.finally_def_per ? Math.floor((def * eps.finally_def_per) / 10000) : 0; def += eps.finally_def; //血量 var hp_max = eps.hp_max; hp_max += eps.hp_max_per ? Math.floor((hp_max * eps.hp_max_per) / 10000) : 0; hp_max += eps.finally_hp_max_per ? Math.floor((hp_max * eps.finally_hp_max_per) / 10000) : 0; hp_max += eps.finally_hp_max; return { "finally_atk": atk, "finally_def": def, "finally_hp_max": hp_max, }; }; /** * 主角战斗属性 */ GameMethod.prototype.ep_fight = function (sevBack) { var eps = this.ep_all(sevBack); //攻速 eps.speed_per = 0; //攻击 eps.atk_per = 0; eps.finally_atk_per = 0; //防御 eps.def_per = 0; eps.finally_def_per = 0; //血量 eps.hp_max_per = 0; eps.finally_hp_max_per = 0; return eps; }; /** * 弟子战斗属性 * @param dzInfo 弟子信息 * @param eps 主角属性 * @returns */ GameMethod.prototype.ep_fight_dizi = function (dzInfo, epsAll) { var dzEps = exports.gameMethod.ep_init(); //初始化属性 var cfgdz = gameCfg_1.default.huobanBase.getItem(dzInfo.id); if (cfgdz == null) { return dzEps; } var cfgZhongZu = gameCfg_1.default.huobanZhongzu.getItem(cfgdz.pinzhi, cfgdz.zhongzu.toString()); if (cfgZhongZu == null) { return dzEps; } dzEps = exports.gameMethod.ep_merge(dzEps, cfgdz.eps); for (var key in cfgZhongZu.inherit_attr) { //继承主角属性 dzEps[key] += Math.floor((epsAll[key] * cfgZhongZu.inherit_attr[key]) / 10000); } for (var key in cfgZhongZu.inherit_attr_hide) { //继承主角属性 dzEps[key] += Math.floor((epsAll[key] * cfgZhongZu.inherit_attr_hide[key]) / 10000); } dzEps.hp = dzEps.hp_max; return dzEps; }; /** * 阵法 */ GameMethod.prototype.ep_zhenfa = function (actZhenfa) { var eps = {}; var chuanKeys = Object.keys(actZhenfa.chuan); for (var i = 0; i < chuanKeys.length; i++) { var buwei = chuanKeys[i]; //装备属性 eps = this.ep_merge(eps, actZhenfa.chuan[buwei].eps); //附魔属性 var addEps = {}; for (var _i = 0, _a = actZhenfa.chuan[buwei].fmEps; _i < _a.length; _i++) { var fmEps = _a[_i]; if (addEps[fmEps[0]] == null) { addEps[fmEps[0]] = 0; } addEps[fmEps[0]] += fmEps[1]; } // 洗练属性 for (var posId in actZhenfa.chuan[buwei].xilianEps) { if (actZhenfa.chuan[buwei].xilianEps[posId].id == null || actZhenfa.chuan[buwei].xilianEps[posId].id == "") { continue; } var xilian_c = gameCfg_1.default.zhenfaXilianWord.getItem(actZhenfa.chuan[buwei].xilianEps[posId].id); if (xilian_c != null) { eps = this.ep_merge(eps, xilian_c.attr); } } eps = this.ep_merge(eps, addEps); } return eps; }; /** * 阵法 */ GameMethod.prototype.ep_zhenfa_list = function (actZhenfa) { var eps = {}; // 阵法New var keys = Object.keys(actZhenfa.zfList); for (var i = 0; i < keys.length; i++) { var zfBase = gameCfg_1.default.zfxtZfbase.getItem(keys[i]); if (zfBase != null) { var zfShengji = gameCfg_1.default.zfxtZfshengji.getItem(zfBase.pinzhi, actZhenfa.zfList[keys[i]].level.toString()); if (zfShengji != null) { eps = this.ep_merge(eps, zfShengji.attr); } } } return eps; }; /** * 大帝古字 */ GameMethod.prototype.ep_dadiguzi = function (actDadiGuzi, mfList) { var eps = {}; var keys = Object.keys(actDadiGuzi.mpList[actDadiGuzi.mpXhid]); for (var i = 0; i < keys.length; i++) { var buwei = keys[i]; if (exports.gameMethod.isEmpty(actDadiGuzi.mpList[actDadiGuzi.mpXhid][buwei]) == true) { continue; } eps = this.ep_merge(eps, actDadiGuzi.mpList[actDadiGuzi.mpXhid][buwei].eps); } //上阵列表 var szMfids = []; var mfZhanKeys = Object.keys(actDadiGuzi.mfZhan); for (var i = 0; i < mfZhanKeys.length; i++) { var _type = mfZhanKeys[i]; if (actDadiGuzi.mfZhan[_type] == "") { continue; } szMfids.push(actDadiGuzi.mfZhan[_type]); } //仙法 + 铭文 var mfListKeys = Object.keys(mfList); for (var i = 0; i < mfListKeys.length; i++) { var mfid = mfListKeys[i]; var cfgXfInfo = gameCfg_1.default.dadiguziXfinfo.getItem(mfid); if (cfgXfInfo == null) { continue; } var cfg = gameCfg_1.default.dadiguziXflv.getItem(cfgXfInfo.pinzhi.toString(), mfList[mfid].level.toString()); if (cfg != null) { if (eps["hp_max"] == null) { eps["hp_max"] = 0; } if (eps["atk"] == null) { eps["atk"] = 0; } if (eps["def"] == null) { eps["def"] = 0; } eps["hp_max"] += cfg.hp_max; eps["atk"] += cfg.atk; eps["def"] += cfg.def; } if (szMfids.indexOf(mfid) == -1) { continue; //没上阵 不加铭文属性 } for (var _i = 0, _a = mfList[mfid].mwLock; _i < _a.length; _i++) { var mwid = _a[_i]; if (mwid == null || mwid == "") { continue; } var cfgMw = gameCfg_1.default.dadiguziMingwen.getItem(mwid); if (cfgMw != null) { eps = this.ep_merge(eps, cfgMw.eps); } } } //图鉴 var tjlistKeys = Object.keys(actDadiGuzi.tjlist); for (var i = 0; i < tjlistKeys.length; i++) { var _key = tjlistKeys[i]; var cfgtjNew = gameCfg_1.default.dadiguziXftj.getItem(_key, actDadiGuzi.tjlist[_key].toString()); if (cfgtjNew == null) { continue; } eps = this.ep_merge(eps, cfgtjNew.eps); } return eps; }; /** * 计算弟子全局属性 弟子加成只有突破属性和图鉴加成 */ GameMethod.prototype.ep_dizi_base = function (actDiZi, actDiZiList) { var eps = {}; var dzListKeys = Object.keys(actDiZiList); for (var i = 0; i < dzListKeys.length; i++) { var dzid = dzListKeys[i]; //计算弟子阶级属性 var dizi = actDiZiList[dzid]; // let num = dizi.level % 5; var diZiStar_c = gameCfg_1.default.huobanStar.getItem(dzid, dizi.star.toString()); if (diZiStar_c != null) { for (var i_1 = 0; i_1 <= Number(diZiStar_c.star); i_1++) { var cfgStep = gameCfg_1.default.huobanStar.getItem(dzid, i_1.toString()); if (cfgStep != null) { var stepEps = cfgStep.attr; eps = this.ep_merge(eps, stepEps); } } } } //计算弟子图鉴属性 var tujianKeys = Object.keys(actDiZi.tujian); for (var i = 0; i < tujianKeys.length; i++) { var tujianKey = tujianKeys[i]; var diziTuJian_c = gameCfg_1.default.huobanTujian.getItem(tujianKey, actDiZi.tujian[tujianKey].toString()); if (diziTuJian_c == null) { continue; } eps = this.ep_merge(eps, diziTuJian_c.attr); } //皮肤属性 for (var i = 0; i < dzListKeys.length; i++) { var dzid = dzListKeys[i]; var dizi = actDiZiList[dzid]; if (!actDiZiList[dzid].skins) { continue; } for (var key in actDiZiList[dzid].skins) { var level = actDiZiList[dzid].skins[key].level; var skinCfg = gameCfg_1.default.huobanSkinlevel.getItem(key, level.toString()); if (skinCfg) { eps = this.ep_merge(eps, skinCfg.levelEps); } } } return eps; }; GameMethod.prototype.ep_shouling_shengxiao = function (actShouLingList) { var shoulingList = {}; var gzList = {}; var listKeys = Object.keys(actShouLingList); for (var i = 0; i < listKeys.length; i++) { var index = listKeys[i]; if (actShouLingList[index] != null && exports.gameMethod.isEmpty(actShouLingList[index].slid) == false) { var slid = actShouLingList[index].slid; var eps = this.ep_shouling_gezi(actShouLingList[index]); var zhanli = eps["hp_max_per"]; var existingZhanli = shoulingList[slid]; if (existingZhanli === undefined || zhanli > existingZhanli) { shoulingList[slid] = zhanli; gzList[slid] = index; } } } var gzIdlist = []; var gzListKeys = Object.keys(gzList); for (var i = 0; i < gzListKeys.length; i++) { gzIdlist.push(gzList[gzListKeys[i]]); } return gzIdlist; }; /** * 计算兽灵总属性加成 */ GameMethod.prototype.ep_shouling = function (actShouLingList, actShouLing, jiuxiao) { if (jiuxiao === void 0) { jiuxiao = 0; } var eps = {}; //计算兽灵属性总加成(不包含技能) var shoulingList = {}; var gzList = {}; //遍历出最高属性的兽灵的格子id var listKeys = Object.keys(actShouLingList); for (var i = 0; i < listKeys.length; i++) { var index = listKeys[i]; if (actShouLingList[index] != null && exports.gameMethod.isEmpty(actShouLingList[index].slid) == false) { var slid = actShouLingList[index].slid; var eps_1 = this.ep_shouling_gezi(actShouLingList[index]); var zhanli = eps_1["hp_max_per"]; var existingZhanli = shoulingList[slid]; if (existingZhanli === undefined || zhanli > existingZhanli) { shoulingList[slid] = zhanli; gzList[slid] = index; } } } var gzListKeys = Object.keys(gzList); for (var i = 0; i < gzListKeys.length; i++) { var gz = gzListKeys[i]; if (exports.gameMethod.isEmpty(gzList[gz]) == false) { eps = this.ep_merge(eps, this.ep_shouling_gezi(actShouLingList[gzList[gz]], jiuxiao)); } } //羁绊属性加成 var jiban = actShouLing.jiban; var jibanKeys = Object.keys(actShouLing.jiban); for (var i = 0; i < jibanKeys.length; i++) { var jbid = jibanKeys[i]; if (exports.gameMethod.isEmpty(jiban[jbid].level)) { continue; } var cfgJiBan = gameCfg_1.default.shoulingJiban.getItem(jbid, jiban[jbid].level.toString()); if (cfgJiBan == null || cfgJiBan.eps == null) { continue; } eps = this.ep_merge(eps, cfgJiBan.eps); } //上阵兽灵被动属性加成 var useGzIdKeys = Object.keys(actShouLing.useGzId); for (var i = 0; i < useGzIdKeys.length; i++) { var useGzId = useGzIdKeys[i]; var skBdeps = {}; var gzid = actShouLing.useGzId[useGzId]; if (gzid == null || gzid == "") { continue; } var shouling = actShouLingList[gzid]; if (shouling == null) { continue; } var cfg = gameCfg_1.default.shoulingInfo.getItem(shouling.slid); if (cfg == null) { continue; } var pinzhiCfg = gameCfg_1.default.shoulingPinzhi.getItem(cfg.pinzhi); if (pinzhiCfg == null) { continue; } //主站 if (useGzId == "0") { var skBdKeys = Object.keys(shouling.skBd); for (var i_2 = 0; i_2 < skBdKeys.length; i_2++) { var caoId = skBdKeys[i_2]; var skill = shouling.skBd[caoId]; var cfgEffect = gameCfg_1.default.shoulingBeidong.getItem(skill.skillId.toString()); if (cfgEffect == null) { continue; } var newEps = {}; newEps[cfgEffect.type] = cfgEffect.esp[skill.lv - 1]; skBdeps = this.ep_merge(skBdeps, newEps); } } else { var skBdKeys = Object.keys(shouling.skBd); for (var i_3 = 0; i_3 < skBdKeys.length; i_3++) { var caoId = skBdKeys[i_3]; var skill = shouling.skBd[caoId]; var cfgEffect = gameCfg_1.default.shoulingBeidong.getItem(skill.skillId.toString()); if (cfgEffect == null) { continue; } var newEps = {}; newEps[cfgEffect.type] = cfgEffect.esp[skill.lv - 1]; var bdEps = exports.gameMethod.objCopy(newEps); var bdEpsKeys = Object.keys(bdEps); for (var i_4 = 0; i_4 < bdEpsKeys.length; i_4++) { var key = bdEpsKeys[i_4]; bdEps[key] = Math.round((bdEps[key] * pinzhiCfg.skOdds) / 100); } skBdeps = this.ep_merge(skBdeps, bdEps); } } eps = this.ep_merge(eps, skBdeps); } return eps; }; /** * 单个道友的属性 */ GameMethod.prototype.ep_daoyou = function (daoyou) { var eps = {}; for (var one in daoyou.daoyouMap) { var dyid = daoyou.daoyouMap[one].did; var level = daoyou.daoyouMap[one].favorLv; var skkills = daoyou.daoyouMap[one].skill; //计算等级属性加成 for (var i = 1; i <= level; i++) { var cfg = gameCfg_1.default.daoyouFavorLv.getItem(dyid, i.toString()); if (cfg != null) { eps = this.ep_merge(eps, cfg.eps); } } //计算技能属性加成 for (var _i = 0, skkills_1 = skkills; _i < skkills_1.length; _i++) { var sk = skkills_1[_i]; var cfgSkill = gameCfg_1.default.daoyouSkillLv.getItem(sk.toString()); if (cfgSkill != null) { var cfgSkillType = gameCfg_1.default.daoyouSkillType.getItem(cfgSkill.sid); if (cfgSkillType != null && cfgSkillType.type == 2) { for (var _a = 0, _b = Object.keys(cfgSkillType.param); _a < _b.length; _a++) { var key = _b[_a]; var num = cfgSkill.value[Object.keys(cfgSkillType.param).indexOf(key)]; cfgSkillType.param[key] = num; } eps = this.ep_merge(eps, cfgSkillType.param); } } } } return eps; }; /** * 单个法宝的属性 */ GameMethod.prototype.ep_fabao = function (actFaBao) { var eps = {}; for (var _i = 0, _a = Object.values(actFaBao.fabaoList); _i < _a.length; _i++) { var fabao = _a[_i]; // 基础属性 var cfgFbInfo = gameCfg_1.default.fabaoInfo.getItem(fabao.fbId); if (cfgFbInfo != null) { eps = this.ep_merge(eps, cfgFbInfo.attributes); } // 升级属性 for (var _b = 0, _c = Object.values(gameCfg_1.default.fabaoUplevel.pool); _b < _c.length; _b++) { var cfg = _c[_b]; if (cfg.id.toString() === fabao.fbId && cfg.level <= fabao.level) { eps = this.ep_merge(eps, cfg.attributes); } } // 升星属性 for (var _d = 0, _e = Object.values(gameCfg_1.default.fabaoUpstar.pool); _d < _e.length; _d++) { var cfg = _e[_d]; if (cfg.id.toString() === fabao.fbId && cfg.level <= fabao.star) { eps = this.ep_merge(eps, cfg.attributes); } } } return eps; }; /** * 法宝羁绊的属性 */ GameMethod.prototype.ep_fabaoJiban = function (actFaBao) { var eps = {}; var jibanListKeys = Object.keys(actFaBao.jibanList); for (var i = 0; i < jibanListKeys.length; i++) { var jbId = jibanListKeys[i]; // 羁绊属性 var cfgJbInfo = gameCfg_1.default.fabaoJiban.getItem(jbId, actFaBao.jibanList.star.toString()); if (cfgJbInfo !== null) { eps = this.ep_merge(eps, cfgJbInfo.attributes); } } return eps; }; /** * 当前境界的属性 */ GameMethod.prototype.ep_jingjie = function (actJingJie, jingjieId) { var eps = {}; //突破后获得属性 var pool = gameCfg_1.default.jingjieStep.pool; var maxLv = 0; for (var key in pool) { //境界属性(目标型) if (Number(jingjieId) == Number(pool[key].id)) { eps = this.ep_merge(eps, pool[key].tp_eps); } var addCount = 0; for (var i = maxLv + 1; i <= pool[key].maxlv; i++) { if (i > actJingJie.level) { break; } var cfg = gameCfg_1.default.jingjieLevel.getItem(i.toString()); if (cfg == null) { continue; } //等级获得属性(目标型) if (i == actJingJie.level) { eps = this.ep_merge(eps, cfg.eps); } if (i == actJingJie.level) { addCount += Math.round(actJingJie.exp / cfg.exp[2]); } else { addCount += Math.round(cfg.needExp / cfg.exp[2]); } } //因为属性是3次一个循环 // 计算每个 eps 的执行次数 var eps1Count = Math.floor((addCount + 2) / 3); // eps1 应用的次数 var eps2Count = Math.floor((addCount + 1) / 3); // eps2 应用的次数 var eps3Count = Math.floor(addCount / 3); // eps3 应用的次数 eps = this.ep_merge(eps, this.ep_KvRate(pool[key].eps1, eps1Count)); eps = this.ep_merge(eps, this.ep_KvRate(pool[key].eps2, eps2Count)); eps = this.ep_merge(eps, this.ep_KvRate(pool[key].eps3, eps3Count)); maxLv = pool[key].maxlv; if (maxLv >= actJingJie.level) { break; } } return eps; }; /** * 世家秘术 * */ GameMethod.prototype.ep_clubMiShu = function (actClubMiShu) { var eps = {}; // 世家筋骨 var jinGuKeys = Object.keys(actClubMiShu.jinGu); for (var i = 0; i < jinGuKeys.length; i++) { var type = jinGuKeys[i]; var lv = actClubMiShu.jinGu[type]; var cfg = gameCfg_1.default.clubMiShuJinGu.getItem(type, lv.toString()); if (cfg != null) { eps = this.ep_merge(eps, cfg.eps); } } // 世家秘术筋骨筋骨全等级达到 ,额外加成属性 var minLvKey = Object.keys(actClubMiShu.jinGu).reduce(function (pre, cur) { if (actClubMiShu.jinGu[cur] < actClubMiShu.jinGu[pre]) { return cur; } return pre; }); var minLv1 = actClubMiShu.jinGu[minLvKey]; // 0,10,20,30... var JinGuJc = gameCfg_1.default.clubMiShuJinGuJc.getItem((Math.floor(minLv1 / 10) * 10).toString()); if (JinGuJc != null) { eps = this.ep_merge(eps, JinGuJc.eps); } // 世家经络 var jlList = actClubMiShu.jllist; for (var jlid in jlList) { var cfgJl = gameCfg_1.default.clubMiShuJingluo.getItem(jlid, jlList[jlid].level.toString()); if (cfgJl != null) { eps = this.ep_merge(eps, cfgJl.addEp); } } var cfgJlQ = gameCfg_1.default.clubMiShuJlquality.getItem(actClubMiShu.curJlQuality.toString()); if (cfgJlQ != null) { eps = this.ep_merge(eps, cfgJlQ.qualityEp); } return eps; }; /** * 世家圣兵 * */ GameMethod.prototype.ep_clubShengB = function (actClubShengB) { var _a; var eps = {}; // 获取当前方案的所有位置的词条 for (var posId in actClubShengB.plan[actClubShengB.curPlan]) { // 获取词条配置 var cfg = gameCfg_1.default.clubShengBWord.getItem(actClubShengB.plan[actClubShengB.curPlan][posId].id); if (cfg != null) { // 算一下第一个属性的值 var n = cfg.attr[Object.keys(cfg.attr)[0]] + actClubShengB.plan[actClubShengB.curPlan][posId].range; eps = this.ep_merge(eps, (_a = {}, _a[Object.keys(cfg.attr)[0]] = n, _a)); } } return eps; }; /** * 宗门-门徒 * */ GameMethod.prototype.eps_zongMen_mentu = function (mentu, jiuxiao) { var _a, _b; if (jiuxiao === void 0) { jiuxiao = 0; } var mentu_eps = {}; if (!mentu.basicAttr) { return mentu_eps; } mentu_eps = mentu.basicAttr; var _mentu = (_b = (_a = mentu.married) === null || _a === void 0 ? void 0 : _a[Object.keys(mentu.married)[0]]) === null || _b === void 0 ? void 0 : _b.mentuInfo; if (_mentu && _mentu.basicAttr) { // _mentu.basicAttr的值最多不超过mentu.basicAttr的300% for (var key in _mentu.basicAttr) { if (mentu.basicAttr[key] == null) { mentu.basicAttr[key] = 0; } if (_mentu.basicAttr[key] == null) { _mentu.basicAttr[key] = 0; } var nCfg = gameCfg_1.default.mathInfo.getItem("zongMen_add_basicAttr_limit"); if (nCfg != null && nCfg.pram != null && nCfg.pram.count != null) { _mentu.basicAttr[key] = Math.min(Math.floor(mentu.basicAttr[key] * nCfg.pram.count), _mentu.basicAttr[key]); } } mentu_eps = this.ep_merge(mentu_eps, _mentu.basicAttr); } return this.ep_KvRate(mentu_eps, 1 + jiuxiao); }; /** * 宗门 * */ GameMethod.prototype.ep_zongMen = function (_actZongMenMentuLs1, _actZongMenMentuLs2, _actZongMen, showBasicAttr, jiuxiao) { var _a, _b; var _c, _d; if (showBasicAttr === void 0) { showBasicAttr = true; } if (jiuxiao === void 0) { jiuxiao = 0; } // 记录基础 var eps = {}; // 记录委任的特殊属性 var speEps = {}; // 拷贝一份数据 var actZongMenMentuLs1 = exports.gameMethod.objCopy(_actZongMenMentuLs1); var actZongMenMentuLs2 = exports.gameMethod.objCopy(_actZongMenMentuLs2); var actZongMen = exports.gameMethod.objCopy(_actZongMen); // 获取宗门等级配置 var zm_cfg = gameCfg_1.default.zongMenInfo.getItem(actZongMen.level.toString()); if (zm_cfg == null) return eps; // 委任加属性 for (var id in actZongMen.appointPos) { var mentuId = actZongMen.appointPos[id].mentuId; // 获取未结好的门徒信息 var mentu = actZongMen.mentu[mentuId] || actZongMenMentuLs1[mentuId]; // 如果获取不到门徒信息,说明是已经结好的门徒,从已结好的门徒列表中获取 // --------------------------------已经结好的门徒Start-------------------------------- if (mentu == null) { // 结好的门徒有两个门徒,需要分别计算 一个是自己,一个是配偶 // 1. 特殊属性 //自己 mentu = actZongMenMentuLs2[mentuId]; if (mentu == null) continue; var speAttr1 = mentu.speAttr || []; // 配偶 var _mentu = (_d = (_c = mentu.married) === null || _c === void 0 ? void 0 : _c[Object.keys(mentu.married)[0]]) === null || _d === void 0 ? void 0 : _d.mentuInfo; var speAttr2 = (_mentu === null || _mentu === void 0 ? void 0 : _mentu.speAttr) || []; for (var _i = 0, _e = speAttr1.concat(speAttr2); _i < _e.length; _i++) { var attrId = _e[_i]; var cfg_1 = gameCfg_1.default.zongMenSpeAttr.getItem(attrId); if (cfg_1 != null) { if (cfg_1 != null) { var _f = Object.entries(cfg_1.attr)[0], attrKey = _f[0], attrValue = _f[1]; var EpsObj = (_a = {}, _a[attrKey] = attrValue, _a); speEps = this.ep_merge(speEps, EpsObj); } } } // 2. 出师属性 var graduateAttr1 = mentu.graduateAttr || {}; var graduateAttr2 = (_mentu === null || _mentu === void 0 ? void 0 : _mentu.graduateAttr) || {}; // 先确定值-graduateAttr2不超过graduateAttr1的x倍 var nCfg = gameCfg_1.default.mathInfo.getItem("zongMen_add_graduateAttr_limit"); if (nCfg != null && nCfg.pram != null && nCfg.pram.count != null) { var value = graduateAttr1[Object.keys(graduateAttr1)[0]]; graduateAttr2[Object.keys(graduateAttr2)[0]] = Math.min(value * nCfg.pram.count, graduateAttr2[Object.keys(graduateAttr2)[0]]); } // 根据委任的位置id获取加成配置 var cfg = gameCfg_1.default.zongMenAppointPos.getItem(id); if (cfg == null) continue; for (var key in graduateAttr1) { graduateAttr1[key] = Math.floor(graduateAttr1[key] * (1 + cfg.add / 100)); } speEps = this.ep_merge(speEps, graduateAttr1); for (var key in graduateAttr2) { graduateAttr2[key] = Math.floor(graduateAttr2[key] * (1 + cfg.add / 100)); } speEps = this.ep_merge(speEps, graduateAttr2); } // --------------------------------已经结好的门徒End-------------------------------- // --------------------------------未结好的门徒Start-------------------------------- else { // 特殊属性 var speAttr = mentu.speAttr || []; for (var _g = 0, speAttr_1 = speAttr; _g < speAttr_1.length; _g++) { var attrId = speAttr_1[_g]; var cfg_2 = gameCfg_1.default.zongMenSpeAttr.getItem(attrId); if (cfg_2 != null) { var _h = Object.entries(cfg_2.attr)[0], attrKey = _h[0], attrValue = _h[1]; var EpsObj = (_b = {}, _b[attrKey] = attrValue, _b); speEps = this.ep_merge(speEps, EpsObj); } } var graduateAttr = mentu.graduateAttr || {}; // 根据id获取配置 var cfg = gameCfg_1.default.zongMenAppointPos.getItem(id); if (cfg == null) continue; for (var key in graduateAttr) { graduateAttr[key] = Math.floor(graduateAttr[key] * (1 + cfg.add / 100)); } speEps = this.ep_merge(speEps, graduateAttr); } // --------------------------------未结好的门徒End-------------------------------- } // 每个门徒的基础属性全部加起来给主角 if (showBasicAttr) { for (var id in actZongMen.mentu) { eps = this.ep_merge(eps, this.eps_zongMen_mentu(actZongMen.mentu[id], jiuxiao)); } for (var id in actZongMenMentuLs1) { eps = this.ep_merge(eps, this.eps_zongMen_mentu(actZongMenMentuLs1[id], jiuxiao)); } for (var id in actZongMenMentuLs2) { eps = this.ep_merge(eps, this.eps_zongMen_mentu(actZongMenMentuLs2[id], jiuxiao)); } } // 每一条委任的特殊属性都不能超过配置的最大值 zm_cfg.maxSpeAttrAdd for (var key in speEps) { speEps[key] = Math.min(speEps[key], zm_cfg.maxSpeAttrAdd); } eps = this.ep_merge(eps, speEps); return eps; }; /** * 道纹 * 镶嵌道纹的基础属性 + 词条属性 + 解封等级的属性 + 套装buff */ GameMethod.prototype.ep_daowen = function (actDaoWen, actDdaoWenList) { var eps_zhu = this.ep_daowen_zhu(actDaoWen, actDdaoWenList); //主属性 var eps_other = this.ep_daowen_other(actDaoWen, actDdaoWenList); ; //副属性 return this.ep_merge(eps_zhu, eps_other); }; /** * 道纹 * 镶嵌道纹的主属性 */ GameMethod.prototype.ep_daowen_zhu = function (actDaoWen, actDdaoWenList) { var eps_zhu = {}; //主属性 var real_dc = actDaoWen.dc || "1"; if (actDaoWen.dcs[real_dc] != null) { var slotKeys = Object.keys(actDaoWen.dcs[real_dc].slot); for (var i = 0; i < slotKeys.length; i++) { var slot = slotKeys[i]; var iid = actDaoWen.dcs[real_dc].slot[slot]; var stone = actDdaoWenList[iid.toString()]; if (stone == null) { continue; } var base_eps_c = gameCfg_1.default.daowenZhushuxing.getItem(stone.baseEps.sxid, stone.baseEps.level.toString()); if (base_eps_c != null) { eps_zhu = this.ep_merge(eps_zhu, base_eps_c.eps); } } } return eps_zhu; }; /** * 道纹 * 镶嵌道纹的其他属性 */ GameMethod.prototype.ep_daowen_other = function (actDaoWen, actDdaoWenList) { var eps_fu = {}; //副属性 var eps_level = {}; //解封等级属性 var real_dc = actDaoWen.dc || "1"; if (actDaoWen.dcs[real_dc] != null) { var slotKeys = Object.keys(actDaoWen.dcs[real_dc].slot); for (var i = 0; i < slotKeys.length; i++) { var slot = slotKeys[i]; var iid = actDaoWen.dcs[real_dc].slot[slot]; var stone = actDdaoWenList[iid.toString()]; if (stone == null) { continue; } //词条属性 var fuEpsKeys = Object.keys(stone.fuEps); for (var i_5 = 0; i_5 < fuEpsKeys.length; i_5++) { var eps_id = fuEpsKeys[i_5]; var ct_info_c = gameCfg_1.default.daowenFushuxing.getItem(eps_id, stone.fuEps[eps_id].pinzhi.toString(), stone.fuEps[eps_id].level.toString()); if (ct_info_c != null) { eps_fu = this.ep_merge(eps_fu, ct_info_c.eps); } } } } //解封等级的属性 var level = actDaoWen.unlockLevel; var unlock_level_c = gameCfg_1.default.daowenUnlock_level.getItem(level.toString()); if (unlock_level_c != null) { eps_level = this.ep_merge(eps_level, unlock_level_c.eps); //镶嵌效果 } return this.ep_merge(eps_fu, eps_level); }; /** * 计算兽灵单个格子属性加成 */ GameMethod.prototype.ep_shouling_gezi = function (actShouLingOne, jiuxiao) { if (jiuxiao === void 0) { jiuxiao = 0; } var eps = {}; if (actShouLingOne == null || actShouLingOne.slid == "") { return eps; } var slid = actShouLingOne.slid; var cfgInfo = gameCfg_1.default.shoulingInfo.getItem(slid); if (cfgInfo == null) { return eps; } var cfgPinzhi = gameCfg_1.default.shoulingPinzhi.getItem(cfgInfo.pinzhi); if (cfgPinzhi == null) { return eps; } //兽灵基础属性 eps = this.ep_merge(eps, cfgPinzhi.eps); //九霄天枢对兽灵基本属性加成 if (jiuxiao > 0) { eps = this.ep_KvRate(eps, 1 + jiuxiao); } //升级属性加成 var level = actShouLingOne.level; var levelEps = {}; for (var i = 1; i <= level; i++) { var lv = gameCfg_1.default.shoulingLevel.getItem(cfgPinzhi.id, i.toString()); if (lv == null) { continue; } levelEps = this.ep_merge(levelEps, lv.levelEps); } eps = this.ep_merge(eps, levelEps); //计算升星属性加成 var star = actShouLingOne.star; var starEps = {}; for (var index = star; index >= 0; index--) { var star_c = gameCfg_1.default.shoulingStar.getItem(cfgPinzhi.id, index.toString()); if (star_c == null) { continue; } starEps = this.ep_merge(starEps, star_c.starEps); } eps = this.ep_merge(eps, starEps); //计算觉醒属性加成 var stepEps = {}; var step = actShouLingOne.step; var jueXingCfg = gameCfg_1.default.shoulingJuexing.getItem(step.toString()); if (jueXingCfg) { stepEps = this.ep_merge(stepEps, jueXingCfg.eps); } eps = this.ep_merge(eps, stepEps); //皮肤属性 var skinEps = {}; if (actShouLingOne.skins == null) { return eps; } for (var skinId in actShouLingOne.skins) { var skin = actShouLingOne.skins[skinId]; var skinCfg = gameCfg_1.default.shoulingLevel.getItem(skinId, skin.level.toString()); if (skinCfg) { skinEps = this.ep_merge(skinEps, skinCfg.levelEps); } } eps = this.ep_merge(eps, skinEps); return eps; }; /** * 计算异象属性加成 */ GameMethod.prototype.ep_yixiang = function (actYiXiang) { var eps = {}; //计算升级升阶异象属性 var cfg = gameCfg_1.default.yixiangLevel.getItem(actYiXiang.id.toString()); if (cfg == null) { return eps; } var cfgJieJi = gameCfg_1.default.yixiangJieji.getItem(cfg.step.toString()); if (cfgJieJi == null) { return eps; } eps = this.ep_merge(eps, cfg.ep0); eps = this.ep_merge(eps, cfgJieJi.ep1); //计算上阵异象属性 var cfgStep = gameCfg_1.default.yixiangStep.getItem(actYiXiang.hh, cfg.step.toString()); if (cfgStep == null) { return eps; } // 计算化形属性 for (var id in actYiXiang.hxData) { var cfgHx = gameCfg_1.default.yixiangHuaxing.getItem(id, actYiXiang.hxData[id].level.toString()); if (cfgHx != null) { eps = this.ep_merge(eps, cfgHx.levelEps); } } eps = this.ep_merge(eps, cfgStep.ep); return eps; }; /** * 计算皮肤属性加成 */ GameMethod.prototype.ep_pifu = function (actPifu) { var eps = {}; for (var key in actPifu.list) { var pifu = actPifu.list[key]; if (!pifu) { continue; } if (!pifu.level) { pifu.level = 1; } //计算皮肤属性属性 var cfg = gameCfg_1.default.skinSkinlevel.getItem(key.toString(), pifu.level.toString()); if (cfg == null) { continue; } eps = this.ep_merge(eps, cfg.levelEps); } return eps; }; /** * 计算洞天道童属性加成 */ GameMethod.prototype.ep_dongtian = function (actDongTian) { var eps = {}; //计算道童等级属性加成 var xlLvKeys = Object.keys(actDongTian.xlLv); for (var i = 0; i < xlLvKeys.length; i++) { var type = xlLvKeys[i]; var cfg = gameCfg_1.default.dongtianXlLv.getItem(type, actDongTian.xlLv[type].toString()); if (cfg == null) { continue; } eps = this.ep_merge(eps, cfg.eps); } var cfgStep = gameCfg_1.default.dongtianXlStep.getItem(actDongTian.xlStep.toString()); if (cfgStep == null) { return eps; } var epsKeys = Object.keys(eps); for (var i = 0; i < epsKeys.length; i++) { var key = epsKeys[i]; eps[key] *= cfgStep.eps / 10000; } return eps; }; /** * 计算药田属性加成 */ GameMethod.prototype.ep_yaotian = function (actYaoTianEps) { var eps = {}; for (var key in actYaoTianEps) { eps[key] = Math.floor(actYaoTianEps[key]); } return eps; }; /** * 计算称号属性加成 */ GameMethod.prototype.ep_chenghao = function (actChenghao) { var eps = {}; for (var id in actChenghao.list) { var cfg = gameCfg_1.default.chenghaoShuxing.getItem(id); if (cfg != null) { eps = this.ep_merge(eps, cfg.eps); } } return eps; }; // /** // * 分别统计主角和弟子的的战斗属性 // */ GameMethod.prototype.ep_userAndDiZi = function (sevBack) { var _a, _b, _c, _d, _e, _f, _g, _h; var allEps = {}; var userBase = exports.gameMethod.ep_all_base(sevBack); allEps["user"] = userBase; var userEps = exports.gameMethod.ep_all_fight(userBase); for (var gzid in (_b = (_a = sevBack.actDiZi) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b.shangZhen) { var eps = {}; var dzId = (_d = (_c = sevBack.actDiZi) === null || _c === void 0 ? void 0 : _c.a) === null || _d === void 0 ? void 0 : _d.shangZhen[gzid]; if (dzId == null || dzId == "") { continue; } var cfgdz = gameCfg_1.default.huobanBase.getItem(dzId); var dizi = (_f = (_e = sevBack.actDiZiList) === null || _e === void 0 ? void 0 : _e.a) === null || _f === void 0 ? void 0 : _f[dzId]; if (cfgdz == null || dizi == null || cfgdz.zhanli == 0) { continue; } var cfgZhongZu = gameCfg_1.default.huobanZhongzu.getItem(cfgdz.pinzhi, cfgdz.zhongzu.toString()); if (cfgZhongZu == null) { continue; } //计算弟子升级属性 var levelEps = {}; for (var i = 1; i <= dizi.level; i++) { var diziLevel = gameCfg_1.default.huobanShengji.getItem(cfgdz.pinzhi, i.toString()); if (diziLevel == null) { continue; } levelEps = this.ep_merge(levelEps, diziLevel.attr); } //九霄天枢对弟子基础属性加成 for (var hdcid in sevBack.hdJiuXiaoTianShu) { // 检查属性是否存在 if (!Object.prototype.hasOwnProperty.call(sevBack.hdJiuXiaoTianShu, hdcid)) { continue; } var jiuxiao = (_h = (_g = sevBack.hdJiuXiaoTianShu) === null || _g === void 0 ? void 0 : _g[hdcid]) === null || _h === void 0 ? void 0 : _h.a; if (!jiuxiao) { continue; } // 检查伙伴属性加成是否大于0 if (jiuxiao.huoBanEps > 0) { var rate = 1 + (jiuxiao.huoBanEps / 100); levelEps = this.ep_KvRate(levelEps, rate); } } eps = this.ep_merge(eps, levelEps); //计算弟子升星的基础属性加成 var starEps = {}; for (var i = 1; i <= dizi.star; i++) { var diziStar = gameCfg_1.default.huobanStar.getItem(cfgdz.id, i.toString()); if (diziStar == null) { continue; } starEps = this.ep_merge(starEps, diziStar.attr2); } eps = this.ep_merge(eps, starEps); //计算弟子境界属性 var jingjieEps = {}; for (var i = 1; i <= dizi.jingjie; i++) { var diziJingjie = gameCfg_1.default.huobanTupo.getItem(cfgdz.pinzhi, i.toString()); if (diziJingjie == null) { continue; } jingjieEps = this.ep_merge(jingjieEps, diziJingjie.attr); } eps = this.ep_merge(eps, jingjieEps); var dzEps = exports.gameMethod.ep_init(); //初始化属性 dzEps = exports.gameMethod.ep_merge(dzEps, cfgdz.eps); for (var key in cfgZhongZu.inherit_attr) { //继承主角属性 dzEps[key] += Math.floor((userEps[key] * cfgZhongZu.inherit_attr[key]) / 10000); } for (var key in cfgZhongZu.inherit_attr_hide) { //继承主角属性 dzEps[key] += Math.floor((userEps[key] * cfgZhongZu.inherit_attr_hide[key]) / 10000); } eps = exports.gameMethod.ep_merge(eps, dzEps); allEps[dzId + "_" + cfgdz.dzName] = eps; } return allEps; }; /** * 计算角色总战力 * jiuxiao: 对弟子基础属性加成 */ GameMethod.prototype.ep_power_all = function (sevBack, ep_all_base) { var _a, _b, _c, _d, _e, _f, _g, _h; if (ep_all_base === void 0) { ep_all_base = {}; } var userBase = {}; if (exports.gameMethod.isEmpty(ep_all_base) == false) { userBase = ep_all_base; } else { userBase = exports.gameMethod.ep_all_base(sevBack); } var userEps = exports.gameMethod.ep_all_fight(userBase); var diziPower = 0; for (var gzid in (_b = (_a = sevBack.actDiZi) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b.shangZhen) { var diziEps = {}; var dzId = (_d = (_c = sevBack.actDiZi) === null || _c === void 0 ? void 0 : _c.a) === null || _d === void 0 ? void 0 : _d.shangZhen[gzid]; if (dzId == null || dzId == "") { continue; } var cfgdz = gameCfg_1.default.huobanBase.getItem(dzId); var dizi = (_f = (_e = sevBack.actDiZiList) === null || _e === void 0 ? void 0 : _e.a) === null || _f === void 0 ? void 0 : _f[dzId]; if (cfgdz == null || dizi == null || cfgdz.zhanli == 0) { continue; } var cfgZhongZu = gameCfg_1.default.huobanZhongzu.getItem(cfgdz.pinzhi, cfgdz.zhongzu.toString()); if (cfgZhongZu == null) { continue; } //计算弟子升级属性 var levelEps = {}; for (var i = 1; i <= dizi.level; i++) { var diziLevel = gameCfg_1.default.huobanShengji.getItem(cfgdz.pinzhi, i.toString()); if (diziLevel == null) { continue; } levelEps = this.ep_merge(levelEps, diziLevel.attr); } //九霄天枢对弟子基础属性加成 for (var hdcid in sevBack.hdJiuXiaoTianShu) { // 检查属性是否存在 if (!Object.prototype.hasOwnProperty.call(sevBack.hdJiuXiaoTianShu, hdcid)) { continue; } var jiuxiao = (_h = (_g = sevBack.hdJiuXiaoTianShu) === null || _g === void 0 ? void 0 : _g[hdcid]) === null || _h === void 0 ? void 0 : _h.a; if (!jiuxiao) { continue; } // 检查伙伴属性加成是否大于0 if (jiuxiao.huoBanEps > 0) { var rate = 1 + (jiuxiao.huoBanEps / 100); levelEps = this.ep_KvRate(levelEps, rate); } } diziEps = this.ep_merge(diziEps, levelEps); //计算弟子升星的基础属性加成 var starEps = {}; for (var i = 1; i <= dizi.star; i++) { var diziStar = gameCfg_1.default.huobanStar.getItem(cfgdz.id, i.toString()); if (diziStar == null) { continue; } starEps = this.ep_merge(starEps, diziStar.attr2); } diziEps = this.ep_merge(diziEps, starEps); //计算弟子境界属性 var jingjieEps = {}; for (var i = 1; i <= dizi.jingjie; i++) { var diziJingjie = gameCfg_1.default.huobanTupo.getItem(cfgdz.pinzhi, i.toString()); if (diziJingjie == null) { continue; } jingjieEps = this.ep_merge(jingjieEps, diziJingjie.attr); } diziEps = this.ep_merge(diziEps, jingjieEps); var dzEps = exports.gameMethod.ep_init(); //初始化属性 dzEps = exports.gameMethod.ep_merge(dzEps, cfgdz.eps); for (var key in cfgZhongZu.inherit_attr) { //继承主角属性 dzEps[key] += Math.floor((userEps[key] * cfgZhongZu.inherit_attr[key]) / 10000); } for (var key in cfgZhongZu.inherit_attr_hide) { //继承主角属性 dzEps[key] += Math.floor((userEps[key] * cfgZhongZu.inherit_attr_hide[key]) / 10000); } diziEps = this.ep_merge(diziEps, dzEps); diziPower += exports.gameMethod.ep_power(0, diziEps); } // 兽灵战力 var slPower = 0; if (sevBack.actShouLing != null && sevBack.actShouLingList != null && sevBack.actShouLing.a && sevBack.actShouLingList.a) { var useGzIdKeys = Object.keys(sevBack.actShouLing.a.useGzId); for (var i = 0; i < useGzIdKeys.length; i++) { var useGzId = useGzIdKeys[i]; var gzid = sevBack.actShouLing.a.useGzId[useGzId]; if (gzid == null || gzid == "") { continue; } var shouling = sevBack.actShouLingList.a[gzid]; if (shouling == null) { continue; } /*let cfg = Gamecfg.shoulingInfo.getItem(shouling.slid); if (cfg == null) { continue; } let pinzhiCfg = Gamecfg.shoulingPinzhi.getItem(cfg.pinzhi); if (pinzhiCfg == null) { continue; }*/ //主战 if (useGzId == "0") { var skill = shouling.sk; var step = shouling.step; var skillCfg = gameCfg_1.default.spellSkill.getItem(skill.skillId, skill.lv.toString(), step.toString()); if (skillCfg == null) { continue; } slPower += skillCfg.zhanli; } else { // 助战位 var skill = shouling.sk; var step = shouling.step; var skillCfg = gameCfg_1.default.spellSkill.getItem(skill.skillId, skill.lv.toString(), step.toString()); if (skillCfg == null) { continue; } slPower += skillCfg.zhanli; } } } return diziPower + exports.gameMethod.ep_power(0, userBase) + slPower; }; GameMethod.prototype.ep_power_dizi = function (sevBack, dzId) { var _a, _b, _c, _d; var userEps = exports.gameMethod.ep_all(sevBack); var diziEps = {}; if (dzId == null || dzId == "") { return 0; } var cfgdz = gameCfg_1.default.huobanBase.getItem(dzId); var dizi = (_b = (_a = sevBack.actDiZiList) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b[dzId]; if (cfgdz == null || dizi == null || cfgdz.zhanli == 0) { return 0; } var cfgZhongZu = gameCfg_1.default.huobanZhongzu.getItem(cfgdz.pinzhi, cfgdz.zhongzu.toString()); if (cfgZhongZu == null) { return 0; } //计算弟子升级属性 var levelEps = {}; for (var i = 1; i <= dizi.level; i++) { var diziLevel = gameCfg_1.default.huobanShengji.getItem(cfgdz.pinzhi, i.toString()); if (diziLevel == null) { continue; } levelEps = this.ep_merge(levelEps, diziLevel.attr); } //九霄天枢对弟子基础属性加成 for (var hdcid in sevBack.hdJiuXiaoTianShu) { // 检查属性是否存在 if (!Object.prototype.hasOwnProperty.call(sevBack.hdJiuXiaoTianShu, hdcid)) { continue; } var jiuxiao = (_d = (_c = sevBack.hdJiuXiaoTianShu) === null || _c === void 0 ? void 0 : _c[hdcid]) === null || _d === void 0 ? void 0 : _d.a; if (!jiuxiao) { continue; } // 检查伙伴属性加成是否大于0 if (jiuxiao.huoBanEps > 0) { var rate = 1 + (jiuxiao.huoBanEps / 100); levelEps = this.ep_KvRate(levelEps, rate); } } diziEps = this.ep_merge(diziEps, levelEps); //计算弟子升星的基础属性加成 var starEps = {}; for (var i = 1; i <= dizi.star; i++) { var diziStar = gameCfg_1.default.huobanStar.getItem(cfgdz.id, i.toString()); if (diziStar == null) { continue; } starEps = this.ep_merge(starEps, diziStar.attr2); } diziEps = this.ep_merge(diziEps, starEps); //计算弟子境界属性 var jingjieEps = {}; for (var i = 1; i <= dizi.jingjie; i++) { var diziJingjie = gameCfg_1.default.huobanTupo.getItem(cfgdz.pinzhi, i.toString()); if (diziJingjie == null) { continue; } jingjieEps = this.ep_merge(jingjieEps, diziJingjie.attr); } diziEps = this.ep_merge(diziEps, jingjieEps); var dzEps = exports.gameMethod.ep_init(); //初始化属性 dzEps = exports.gameMethod.ep_merge(dzEps, cfgdz.eps); for (var key in cfgZhongZu.inherit_attr) { //继承主角属性 dzEps[key] += Math.floor((userEps[key] * cfgZhongZu.inherit_attr[key]) / 10000); } for (var key in cfgZhongZu.inherit_attr_hide) { //继承主角属性 dzEps[key] += Math.floor((userEps[key] * cfgZhongZu.inherit_attr_hide[key]) / 10000); } diziEps = this.ep_merge(diziEps, dzEps); return exports.gameMethod.ep_power(0, diziEps); }; /** * 计算阵法更换的战力变化值 (弃用) */ GameMethod.prototype.ep_power_zhenfa = function (sevBack, linshi) { //原本的战力 var initPower = this.ep_power_all(sevBack); var newSevBack = exports.gameMethod.objCopy(sevBack); if (newSevBack.actZhenfa == null || newSevBack.actZhenfa.a == null) { return 0; } var cfgpf = gameCfg_1.default.zhenfaPifu.getItem(linshi.pfid); if (cfgpf == null) { return 0; } if (newSevBack.actZhenfa.a.chuan[cfgpf.buwei] == null) { newSevBack.actZhenfa.a.chuan[cfgpf.buwei] = { pfid: "", level: 0, eps: {}, fmLv: 0, fmBd: 0, fmEps: [], fmZhBd: [], fmZhls: [], pinzhi: "", }; } newSevBack.actZhenfa.a.chuan[cfgpf.buwei].pfid = linshi.pfid; newSevBack.actZhenfa.a.chuan[cfgpf.buwei].level = linshi.level; newSevBack.actZhenfa.a.chuan[cfgpf.buwei].eps = linshi.eps; newSevBack.actZhenfa.a.chuan[cfgpf.buwei].pinzhi = linshi.pinzhi; var newPower = this.ep_power_all(newSevBack); return newPower - initPower; }; /** * 计算阵法更换的战力变化值 */ GameMethod.prototype.ep_power_zhenfaNew = function (sevBack, linshi) { if (sevBack.actZhenfaNew == null || sevBack.actZhenfaNew.a == null || sevBack.actZhenfaNew.a.chuan == null) { return 0; } var cfgpf = gameCfg_1.default.zhenfaPifu.getItem(linshi.pfid); if (cfgpf == null) { return 0; } var oldCeps = {}; if (sevBack.actZhenfaNew.a.chuan[cfgpf.buwei] != null) { oldCeps = sevBack.actZhenfaNew.a.chuan[cfgpf.buwei].eps; } //原本的战力 var initPower = this.ep_power_all(sevBack); var ep_base = this.ep_all_base(sevBack); for (var key in oldCeps) { ep_base[key] -= oldCeps[key]; } for (var key in linshi.eps) { ep_base[key] += linshi.eps[key]; } var newPower = this.ep_power_all(sevBack, ep_base); return newPower - initPower; }; /** * 计算已经穿戴的装备属性 */ GameMethod.prototype.ep_power_zhenfaNew_chuan = function (sevBack, buwei) { if (sevBack.actZhenfaNew == null || sevBack.actZhenfaNew.a == null || sevBack.actZhenfaNew.a.chuan == null) { return 0; } //原本的战力 var initPower = this.ep_power_all(sevBack); var oldCeps = {}; if (sevBack.actZhenfaNew.a.chuan[buwei] != null) { var chuan = sevBack.actZhenfaNew.a.chuan[buwei]; oldCeps = this.ep_merge(oldCeps, chuan.eps); for (var _i = 0, _a = chuan.fmEps; _i < _a.length; _i++) { var fmEps = _a[_i]; if (oldCeps[fmEps[0]] == null) { oldCeps[fmEps[0]] = 0; } oldCeps[fmEps[0]] += fmEps[1]; } // 洗练属性 for (var posId in chuan.xilianEps) { if (chuan.xilianEps[posId].id == null || chuan.xilianEps[posId].id == "") { continue; } var xilian_c = gameCfg_1.default.zhenfaXilianWord.getItem(chuan.xilianEps[posId].id); if (xilian_c != null) { oldCeps = this.ep_merge(oldCeps, xilian_c.attr); } } } var ep_base = this.ep_all_base(sevBack); for (var key in oldCeps) { ep_base[key] -= oldCeps[key]; } var newPower = this.ep_power_all(sevBack, ep_base); return newPower - initPower; }; /** * 计算阵法更换的战力变化值 */ GameMethod.prototype.ep_power_guzi = function (sevBack, linshi) { //原本的战力 var oldCeps = {}; if (sevBack.actDadiGuzi != null && sevBack.actDadiGuzi.a != null && sevBack.actDadiGuzi.a.mpList != null && sevBack.actDadiGuzi.a.mpXhid != null && sevBack.actDadiGuzi.a.mpList[sevBack.actDadiGuzi.a.mpXhid] != null && sevBack.actDadiGuzi.a.mpList[sevBack.actDadiGuzi.a.mpXhid][linshi.buwei] != null) { oldCeps = sevBack.actDadiGuzi.a.mpList[sevBack.actDadiGuzi.a.mpXhid][linshi.buwei].eps; } var ep_base = this.ep_all_base(sevBack); var ep_base2 = exports.gameMethod.objCopy(ep_base); ep_base.atk += Math.floor((ep_base.atk * ep_base.atk_per) / 10000); ep_base.def += Math.floor((ep_base.def * ep_base.def_per) / 10000); ep_base.hp_max += Math.floor((ep_base.hp_max * ep_base.hp_max_per) / 10000); ep_base.hp = ep_base.hp_max; var initPower = this.ep_power(0, ep_base); for (var key in oldCeps) { ep_base2[key] -= oldCeps[key]; } for (var key in linshi.eps) { ep_base2[key] += linshi.eps[key]; } ep_base2.atk += Math.floor((ep_base2.atk * ep_base2.atk_per) / 10000); ep_base2.def += Math.floor((ep_base2.def * ep_base2.def_per) / 10000); ep_base2.hp_max += Math.floor((ep_base2.hp_max * ep_base2.hp_max_per) / 10000); ep_base2.hp = ep_base2.hp_max; var newPower = this.ep_power(0, ep_base2); return newPower - initPower; }; // 计算门徒的战力 GameMethod.prototype.ep_power_mentu = function (mentu) { var power = 0; // 基础属性 power += this.ep_power(0, mentu.basicAttr); // 特殊属性 if (mentu.speAttr != null) { for (var _i = 0, _a = mentu.speAttr; _i < _a.length; _i++) { var id = _a[_i]; var specialCfg = gameCfg_1.default.zongMenSpeAttr.getItem(id + ""); if (specialCfg == null) { continue; } power += this.ep_power(0, specialCfg.attr); } } return power; }; /** * 属性转化成战力 * @param type 默认 0默认 1怪物 * @param eps 属性消息 * @returns */ GameMethod.prototype.ep_power = function (type, _eps) { var eps = exports.gameMethod.ep_init(); eps = exports.gameMethod.ep_merge(eps, _eps); eps = exports.gameMethod.ep_all_fight(eps); var power = 0; var cfgEpPool = gameCfg_1.default.userEp.pool; for (var key in cfgEpPool) { var rpKey = cfgEpPool[key].key; if (eps[rpKey] == null || typeof eps[rpKey] != "number") { continue; } var xishu = 0; switch (type) { case 1: if (exports.gameMethod.isEmpty(cfgEpPool[key].momPower) == true) { continue; } xishu = cfgEpPool[key].momPower; break; default: if (exports.gameMethod.isEmpty(cfgEpPool[key].power) == true) { continue; } xishu = cfgEpPool[key].power; break; } var addPower = Math.floor(xishu * eps[rpKey]); power += addPower; } return power; }; //获取药田吃药加成的属性 GameMethod.prototype.eps_yaofang = function (count, danyao, yx, eps) { var needCount = count; var shiyong = {}; while (needCount > 0) { //要降级 if (danyao.shiyong + needCount >= yx[0] && danyao.naiyao > yx[2]) { needCount -= yx[0] - danyao.shiyong; //记录食用 shiyong[danyao.naiyao] = yx[0] - danyao.shiyong; danyao.shiyong = 0; danyao.naiyao -= yx[1]; danyao.naiyao = Math.max(danyao.naiyao, yx[2]); } else { if (danyao.naiyao == 100) { //耐药等于最低的时候不加shiyong数量只加count数量 shiyong[danyao.naiyao] = needCount; needCount -= needCount; } else { danyao.shiyong += needCount; //记录食用 shiyong[danyao.naiyao] = needCount; needCount -= needCount; } } } var epsAll = {}; for (var naiyao in shiyong) { //遍历食用加属性 for (var key in eps) { if (epsAll[key] == null) { epsAll[key] = 0; } epsAll[key] += (eps[key] * shiyong[naiyao] * Number(naiyao)) / 10000; } } for (var key in epsAll) { epsAll[key] = Math.floor(epsAll[key]); } return epsAll; }; //计算弟子战斗自身属性(不包括继承主角的属性) GameMethod.prototype.ep_diziEps = function (sevBack, dzId) { var _a, _b, _c, _d; var diziEps = exports.gameMethod.ep_init(); //初始化属性 if (dzId == null || dzId == "") { return diziEps; } var cfgdz = gameCfg_1.default.huobanBase.getItem(dzId); var dizi = (_b = (_a = sevBack.actDiZiList) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b[dzId]; if (cfgdz == null || dizi == null || cfgdz.zhanli == 0) { return diziEps; } //弟子基础属性 diziEps = this.ep_merge(diziEps, cfgdz.eps); var cfgZhongZu = gameCfg_1.default.huobanZhongzu.getItem(cfgdz.pinzhi, cfgdz.zhongzu.toString()); if (cfgZhongZu == null) { return diziEps; } //计算弟子升级属性 var levelEps = {}; for (var i = 1; i <= dizi.level; i++) { var diziLevel = gameCfg_1.default.huobanShengji.getItem(cfgdz.pinzhi, i.toString()); if (diziLevel == null) { continue; } levelEps = this.ep_merge(levelEps, diziLevel.attr); } //九霄天枢对弟子基础属性加成 for (var hdcid in sevBack.hdJiuXiaoTianShu) { // 检查属性是否存在 if (!Object.prototype.hasOwnProperty.call(sevBack.hdJiuXiaoTianShu, hdcid)) { continue; } var jiuxiao = (_d = (_c = sevBack.hdJiuXiaoTianShu) === null || _c === void 0 ? void 0 : _c[hdcid]) === null || _d === void 0 ? void 0 : _d.a; if (!jiuxiao) { continue; } // 检查伙伴属性加成是否大于0 if (jiuxiao.huoBanEps > 0) { var rate = 1 + (jiuxiao.huoBanEps / 100); levelEps = this.ep_KvRate(levelEps, rate); } } diziEps = this.ep_merge(diziEps, levelEps); //计算弟子升星的基础属性加成 var starEps = {}; for (var i = 1; i <= dizi.star; i++) { var diziStar = gameCfg_1.default.huobanStar.getItem(cfgdz.id, i.toString()); if (diziStar == null) { continue; } starEps = this.ep_merge(starEps, diziStar.attr2); } diziEps = this.ep_merge(diziEps, starEps); //计算弟子境界属性 var jingjieEps = {}; for (var i = 1; i <= dizi.jingjie; i++) { var diziJingjie = gameCfg_1.default.huobanTupo.getItem(cfgdz.pinzhi, i.toString()); if (diziJingjie == null) { continue; } jingjieEps = this.ep_merge(jingjieEps, diziJingjie.attr); } diziEps = this.ep_merge(diziEps, jingjieEps); return diziEps; }; //获取模块的属性加成 GameMethod.prototype.ep_act = function (sevBack, key) { var eps = this.ep_init(); if (sevBack.actEps != null && sevBack.actEps.a != null && sevBack.actEps.a[key] != null) { eps = exports.gameMethod.ep_merge(eps, sevBack.actEps.a[key]); } return eps; }; /** * 解析洞天 矿车数据 * @param carInfo * @param now * @returns edtime //离结束 还有多长时间 (0 已完成 )(未开始 -1) * @returns win //胜利方是谁 0守方 1攻方 (未开始默认0) * @returns nowpos nowpos, //当前位置 */ GameMethod.prototype.getDongTianCar = function (carInfo, now) { if (carInfo.stime <= 0) { //未启动 return { edtime: -1, win: 0, nowpos: carInfo.dpos, }; } //获取矿车配置 var carCfg = gameCfg_1.default.dongtianCar.getItem(carInfo.id); if (carCfg == null) { console.error("dongtianCar_err:" + carInfo.id); return { edtime: -1, win: 0, nowpos: carInfo.dpos, }; } var dnum = 0; //胜利方多出来的人数 var pow = 1; //胜利方状态值 var leng = carInfo.dpos; //距离(本方距离) var win = 0; var fevCard = false; //胜利方是否有终生卡 //人数对比 if (carInfo.he.knum.length > carInfo.my.knum.length) { //进攻方胜利 dnum = carInfo.he.knum.length - carInfo.my.knum.length; pow = carInfo.he.pow; leng = carCfg.lengs[2] - carInfo.dpos; //反向距离 win = 1; //进攻方胜利 fevCard = carInfo.he.fevCard; //终生卡 } else { //防守方胜利 dnum = carInfo.my.knum.length - carInfo.he.knum.length; pow = carInfo.my.pow; fevCard = carInfo.my.fevCard; //终生卡 } //如果人数 <= 0 (防守方胜利 系数0.7) 就当防守方有0.7个人 dnum = Math.max(dnum, 0.7); //哥布林速度系数 var wkVel = 1; var cfgMath = gameCfg_1.default.mathInfo.getItem("dongtian_wkVel"); if (cfgMath == null || cfgMath.pram.count == null) { console.error("dongtian_wkVel"); } else { wkVel = cfgMath.pram.count; } var tilixs = 200; //根据体力获得系数 //总速度 var vel = (dnum * wkVel * tilixs) / 100; //终生卡 速度加成 +5% var sdadd = 10000; if (fevCard) { sdadd += 1500; } vel = (vel * sdadd) / 10000; //总的需要时间 计算公式 var allTime = Math.ceil(leng / vel); //经过时间 var dtime = now - carInfo.stime; if (dtime >= allTime) { //已完成 return { edtime: 0, win: win, nowpos: win ? carCfg.lengs[2] : 0, }; } else { //未完成 计算 当前位置偏移量 var dpos = dtime * vel; //当前位置 var nowpos = carInfo.dpos; if (win > 0) { nowpos += dpos; nowpos = Math.floor(nowpos); //进攻方胜利 取余偏向防守方(小值) } else { nowpos -= dpos; nowpos = Math.ceil(nowpos); //防守方胜利 取余偏向进攻方(大值) } return { edtime: allTime - dtime, win: win, nowpos: nowpos, }; } }; /** * 章节挂机计算 * @param actZhangjie 章节信息 * @param newTime 现在时间 * @param zflevel 阵法等级 * @returns */ GameMethod.prototype.guajiItems = function (_actZhangjie, newTime, zflevel) { var actZhangjie = this.objCopy(_actZhangjie); var items = []; //挂机奖励(总) var zy_items = []; //挂机奖励(金币/玩家经验/阵法经验) var dj_items = []; //挂机奖励(道具) var cfgzj = gameCfg_1.default.zhangjieInfo.getItem(actZhangjie.zjid); if (cfgzj == null) { return { actZhangjie: actZhangjie, items: items, zy_items: zy_items, dj_items: dj_items, }; } for (var _i = 0, _a = cfgzj.gjRwd_zy; _i < _a.length; _i++) { var item = _a[_i]; var cAt = newTime - actZhangjie.gjtime; cAt = Math.min(cAt, actZhangjie.gjMax * 3600); //8小时上限 var count = Math.floor(cAt / (item[3] / item[2])); if (count > 0) { items.push([item[0], item[1], count]); zy_items.push([item[0], item[1], count]); } } for (var _b = 0, _c = cfgzj.gjRwd_dj; _b < _c.length; _b++) { var item = _c[_b]; if (item[4] != null && item[4] > zflevel) { continue; //未达到阵法等级 } if (actZhangjie.gjRwd_dj[item[0].toString()] == null) { actZhangjie.gjRwd_dj[item[0].toString()] = {}; } if (actZhangjie.gjRwd_dj[item[0].toString()][item[1].toString()] == null) { actZhangjie.gjRwd_dj[item[0].toString()][item[1].toString()] = 0; } var cAt = newTime - actZhangjie.gjtime; cAt = Math.min(cAt, actZhangjie.gjMax * 3600) + actZhangjie.gjRwd_dj[item[0].toString()][item[1].toString()]; //获得一个道具 需要多长时间 var oneTime = item[3] / item[2]; var count = Math.floor(cAt / oneTime); if (count > 0) { items.push([item[0], item[1], count]); dj_items.push([item[0], item[1], count]); actZhangjie.gjRwd_dj[item[0].toString()][item[1].toString()] = 0; } actZhangjie.gjRwd_dj[item[0].toString()][item[1].toString()] = Math.floor(cAt % oneTime); } actZhangjie.gjtime = newTime; return { actZhangjie: actZhangjie, // items: gameMethod.mergeArr(items), items: items, zy_items: exports.gameMethod.mergeArr(zy_items), dj_items: exports.gameMethod.mergeArr(dj_items), }; }; //异或加解密 GameMethod.prototype.xorEncrypt = function (str, x, key) { if (x === void 0) { x = true; } if (key === void 0) { key = "zgyx2024888"; } if (!x) { return str; } var result = []; for (var i = 0; i < str.length; i++) { var charCode = str.charCodeAt(i) ^ key.charCodeAt(i % key.length); result.push(String.fromCharCode(charCode)); } return result.join(""); }; // 用随机种子获取太初古矿地图 GameMethod.prototype.getGuKuangMap = function (randNum, cs) { var geziCp = Object.values(gezi); var map = []; // 地图数据 var sendRand = new SeedRand(randNum); sendRand.random(); geziCp = sendRand.arrayShuffle(geziCp); var index = 1; var tcInfo; var tsInfo; var tcInfoLast; var tsInfoLast; while (index > 0) { var tcInfo2 = void 0; var tsInfo2 = void 0; if (tcInfo == null) { tcInfo2 = gameCfg_1.default.taichuInfo.getItem(index.toString()); } if (tsInfo == null) { tsInfo2 = gameCfg_1.default.taichuTs.getItem(index.toString()); } if (tcInfo2 && tcInfo2.cs[0] <= cs && tcInfo2.cs[1] >= cs) { tcInfo = tcInfo2; } else if (tcInfo2) { tcInfoLast = tcInfo2; } if (tsInfo2 && tsInfo2.cs[0] <= cs && tsInfo2.cs[1] >= cs) { tsInfo = tsInfo2; } else if (tsInfo2) { tsInfoLast = tsInfo2; } if (tcInfo && tsInfo) { index = -1; } else if (tcInfo2 == null && tsInfo2 == null && tcInfoLast && tsInfoLast) { tcInfo = exports.gameMethod.objCopy(tcInfoLast); tsInfo = exports.gameMethod.objCopy(tsInfoLast); var ts_cs_min = tsInfo.cs[0]; var ts_cs_max = tsInfo.cs[1]; var cha = 0; while (ts_cs_max + cha < cs) { cha = ts_cs_max - ts_cs_min; ts_cs_min = ts_cs_max + 1; ts_cs_max = ts_cs_min + cha; cha = 0; } tsInfo.cs = [ts_cs_min, ts_cs_max]; index = -1; } else { index++; } } if (tcInfo == null || tsInfo == null) { return map; } var jlCs = []; for (var i = tsInfo.cs[0]; i <= tsInfo.cs[1]; i++) { jlCs.push(i); } var jlC = sendRand.getRandArr2(jlCs, 1).result[0]; // 当前层数区间 奖励层所在层数 var itemCount = {}; // 地块id:[格子数组] var sd = tcInfo.sd; for (var i = 0; i < sd.length; i++) { var result = sendRand.getRandArr2(geziCp, sd[i][1]); geziCp = result.arr; itemCount[sd[i][0].toString()] = result.result; } var jlcNum = null; // 奖励层所在行数 0-5 if (jlC == cs) { jlcNum = sendRand.getRandArr2([0, 1, 2, 3, 4, 5], 1).result[0]; } var itemCountKeys = Object.keys(itemCount); var mapLine = []; var isHas = false; var tilesInfo101 = gameCfg_1.default.taichuTiles.getItem("1"); var tilesInfo301 = gameCfg_1.default.taichuTiles.getItem("301"); var line = 0; // 第几行 for (var i = 0; i < gezi.length; i++) { line = Math.floor(i / 6) + 1; // 开始绘制地图 if (i % 6 == 0 && mapLine.length > 0) { map.push(mapLine); mapLine = []; } isHas = false; var zuojiaInfo = gameCfg_1.default.taichuZuojia.getItem(cs.toString(), line.toString()); if (zuojiaInfo != null) { isHas = true; for (var _i = 0, _a = zuojiaInfo.item; _i < _a.length; _i++) { var id = _a[_i]; var tilesInfo = gameCfg_1.default.taichuTiles.getItem(id.toString()); if (tilesInfo != null) { mapLine.push({ id: tilesInfo.id, hp: tilesInfo.hp, item: tilesInfo.itme, icon: tilesInfo.icon, }); } else { mapLine.push({ id: "", hp: 0, item: [], icon: "", }); } } i += 5; } else { for (var k = 0; k < itemCountKeys.length; k++) { if (itemCount[itemCountKeys[k]].indexOf(i) != -1) { var tilesInfo = gameCfg_1.default.taichuTiles.getItem(itemCountKeys[k]); if (tilesInfo != null) { mapLine.push({ id: itemCountKeys[k], hp: tilesInfo.hp, item: tilesInfo.itme, icon: tilesInfo.icon, }); isHas = true; break; } } } } if (!isHas) { if (cs == 1 && i < 6) { if (tilesInfo101 != null) { mapLine.push({ id: "1", hp: 1, item: [], icon: tilesInfo101.icon, }); } } else { if (tilesInfo101 && map.length > 0 && map[map.length - 1][mapLine.length].hp == 0) { // 如果上一层是空格 加一个木块 mapLine.push({ id: tilesInfo101.id, hp: tilesInfo101.hp, item: tilesInfo101.itme, icon: tilesInfo101.icon, }); } else { mapLine.push({ id: "", hp: 0, item: [], icon: "", }); } } } } if (mapLine.length > 0) { map.push(mapLine); } if (jlcNum != null) { var len = tsInfo.sd.length; if (len != 12) { return map; } for (var i = 0; i < tsInfo.sd.length; i++) { if (i % 6 == 0 && i != 0) { jlcNum += 1; } if (tilesInfo301 != null) { map[jlcNum][i % 6] = tsInfo.sd[i].length == 1 ? { id: "301", hp: 0, item: [], icon: i == 0 ? tilesInfo301.icon : "", } : { id: "301", hp: 1, item: [tsInfo.sd[i]], icon: i == 0 ? tilesInfo301.icon : "", }; } } // 奖励层下一层 整行不能为空 for (var i = 0; i < 6; i++) { if (i % 6 == 0) { jlcNum += 1; } if (map[jlcNum][i % 6].hp <= 0 && tilesInfo101 != null) { // 转成石头 map[jlcNum][i % 6] = { id: tilesInfo101.id, hp: tilesInfo101.hp, item: tilesInfo101.itme, icon: tilesInfo101.icon, }; } } } return map; }; /** * 根据玩家选的流派推荐阵容 * @param type 玩家预选流派 * @returns */ GameMethod.prototype.tuijian = function (sevBack, type) { var _this = this; //用于记录哪些位置被使用了 var gezi = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]; var tuijian = {}; //先筛选出符合要求的弟子id列表 var dzList1 = []; //前排 var dzList2 = []; //中排 var dzList3 = []; //后排 var wanbian1 = []; //万变流前排 var wanbian2 = []; //万变流中排 var wanbian3 = []; //万变流后排 var other1 = []; //其他前排 var other2 = []; //其他中排 var other3 = []; //其他后排 var actDiZiList = {}; if (sevBack.actDiZiList != null && sevBack.actDiZiList.a != null) { actDiZiList = sevBack.actDiZiList.a; } for (var dzid in actDiZiList) { var cfg = gameCfg_1.default.huobanBase.getItem(actDiZiList[dzid].id); if (cfg == null || cfg.show == 0) { continue; } //不是预选流派和万变流不符合条件 if (cfg.liupai != type && cfg.liupai != "5") { if (cfg.dingwei == "1") { other1.push(dzid); } else if (cfg.dingwei == "2") { other2.push(dzid); } else if (cfg.dingwei == "3") { other3.push(dzid); } } if (cfg.dingwei == "1" && cfg.liupai == type) { dzList1.push(dzid); } else if (cfg.dingwei == "2" && cfg.liupai == type) { dzList2.push(dzid); } else if (cfg.dingwei == "3" && cfg.liupai == type) { dzList3.push(dzid); } else if (cfg.dingwei == "1" && cfg.liupai == "5") { wanbian1.push(dzid); } else if (cfg.dingwei == "2" && cfg.liupai == "5") { wanbian2.push(dzid); } else if (cfg.dingwei == "3" && cfg.liupai == "5") { wanbian3.push(dzid); } } var push1 = 0; //记录前排放了几个弟子 var push2 = 0; //记录中排放了几个弟子 var push3 = 0; //记录后排放了几个弟子 //选出1个前排3个中排2个后排 优先选本流派,然后选万变流,否则选所有弟子里面战力最高的 if (dzList1.length > 0) { //如果是只有一个就直接进去 if (dzList1.length == 1) { tuijian["1"] = dzList1[0]; var index = gezi.indexOf("1"); if (index > -1) { gezi.splice(index, 1); } push1 += 1; } else { var maxPower = 0; for (var _i = 0, dzList1_1 = dzList1; _i < dzList1_1.length; _i++) { var dzid = dzList1_1[_i]; var power = this.ep_power_dizi(sevBack, dzid); if (power > maxPower) { maxPower = power; tuijian["1"] = dzid; var index = gezi.indexOf("1"); if (index > -1) { gezi.splice(index, 1); } push1 += 1; } } } } else if (wanbian1.length > 0 && push1 < 1) { //没有就遍历万变流 //如果是只有一个就直接进去 if (wanbian1.length == 1) { tuijian["1"] = wanbian1[0]; var index = gezi.indexOf("1"); if (index > -1) { gezi.splice(index, 1); } push1 += 1; } else { var maxPower = 0; for (var _a = 0, wanbian1_1 = wanbian1; _a < wanbian1_1.length; _a++) { var dzid = wanbian1_1[_a]; var power = this.ep_power_dizi(sevBack, dzid); if (power > maxPower) { maxPower = power; tuijian["1"] = dzid; var index = gezi.indexOf("1"); if (index > -1) { gezi.splice(index, 1); } push1 += 1; } } } } //放中排的 if (dzList2.length > 0) { //如果是小于等于3个就直接放进去 if (dzList2.length <= 3) { var xb = 4; for (var i = 0; i < dzList2.length; i++) { tuijian[(xb + i).toString()] = dzList2[i]; var index = gezi.indexOf((xb + i).toString()); if (index > -1) { gezi.splice(index, 1); } push2 += 1; } } else { var needDzid = dzList2 .map(function (dzid) { return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) }; }) .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序 .slice(0, 3) // 选出战力最高的三个弟子 .map(function (item) { return item.dzid; }); // 只取 dzid var xb = 4; for (var i = 0; i < 3; i++) { tuijian[(xb + i).toString()] = needDzid[i]; var index = gezi.indexOf((xb + i).toString()); if (index > -1) { gezi.splice(index, 1); } push2 += 1; } } } else if (wanbian2.length > 0 && push2 < 3) { //弟子不满足3个就遍历万变流 var needDzid = wanbian2 .map(function (dzid) { return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) }; }) .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序 .slice(0, 3 - push2) // 选出战力最高的需要的弟子数量 .map(function (item) { return item.dzid; }); // 只取 dzid var xb = 4 + push2; var cs = 2 - push3; cs = Math.min(cs, wanbian2.length); for (var i = 0; i < cs; i++) { tuijian[(xb + i).toString()] = needDzid[i]; var index = gezi.indexOf((xb + i).toString()); if (index > -1) { gezi.splice(index, 1); } push2 += 1; } } //放后排的 if (dzList3.length > 0) { //如果是小于等于2个就直接放进去 if (dzList3.length <= 2) { var xb = 7; for (var i = 0; i < dzList3.length; i++) { tuijian[(xb + i).toString()] = dzList3[i]; var index = gezi.indexOf((xb + i).toString()); if (index > -1) { gezi.splice(index, 1); } push3 += 1; } } else { var needDzid = dzList3 .map(function (dzid) { return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) }; }) .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序 .slice(0, 2) // 选出战力最高的2个弟子 .map(function (item) { return item.dzid; }); // 只取 dzid var xb = 7; for (var i = 0; i < 2; i++) { tuijian[(xb + i).toString()] = needDzid[i]; var index = gezi.indexOf((xb + i).toString()); if (index > -1) { gezi.splice(index, 1); } push3 += 1; } } } else if (wanbian3.length > 0 && push3 < 2) { //弟子不满足2个就遍历万变流 var needDzid = wanbian3 .map(function (dzid) { return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) }; }) .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序 .slice(0, 2 - push3) // 选出战力最高的需要的弟子数量 .map(function (item) { return item.dzid; }); // 只取 dzid var xb = 7 + push3; var cs = 2 - push3; cs = Math.min(cs, wanbian3.length); for (var i = 0; i < cs; i++) { tuijian[(xb + i).toString()] = needDzid[i]; var index = gezi.indexOf((xb + i).toString()); if (index > -1) { gezi.splice(index, 1); } push3 += 1; } } //如果遍历同派和万变流都没有符合的就优先从同站位最高战力里面拿 if (push1 < 1) { //选择的流派和万变流都没有前排弟子就从其他前排弟子里面拿战力最高的 var needDzid = other1 .map(function (dzid) { return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) }; }) .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序 .slice(0, 1) // 选出战力最高的需要的弟子数量 .map(function (item) { return item.dzid; }); // 只取 dzid var xb = 1; var cs = Math.min(1, other1.length); for (var i = 0; i < cs; i++) { tuijian[(xb + i).toString()] = needDzid[i]; var index = gezi.indexOf((xb + i).toString()); if (index > -1) { gezi.splice(index, 1); } //把用掉的弟子剔除 var index1 = other1.indexOf(needDzid[i]); if (index1 > -1) { other1.splice(index, 1); } } } if (push2 < 3) { //选择的流派和万变流都没有前排弟子就从其他前排弟子里面拿战力最高的 var needDzid = other2 .map(function (dzid) { return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) }; }) .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序 .slice(0, 3 - push2) // 选出战力最高的需要的弟子数量 .map(function (item) { return item.dzid; }); // 只取 dzid var xb = 4 + push2; var cs = Math.min(3 - push2, other2.length); for (var i = 0; i < cs; i++) { tuijian[(xb + i).toString()] = needDzid[i]; var index = gezi.indexOf((xb + i).toString()); if (index > -1) { gezi.splice(index, 1); } //把用掉的弟子剔除 var index1 = other2.indexOf(needDzid[i]); if (index1 > -1) { other2.splice(index, 1); } } } if (push3 < 2) { //选择的流派和万变流都没有前排弟子就从其他前排弟子里面拿战力最高的 var needDzid = other3 .map(function (dzid) { return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) }; }) .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序 .slice(0, 2 - push3) // 选出战力最高的需要的弟子数量 .map(function (item) { return item.dzid; }); // 只取 dzid var xb = 7 + push3; var cs = Math.min(2 - push3, other3.length); for (var i = 0; i < cs; i++) { tuijian[(xb + i).toString()] = needDzid[i]; var index = gezi.indexOf((xb + i).toString()); if (index > -1) { gezi.splice(index, 1); } //把用掉的弟子剔除 var index1 = other3.indexOf(needDzid[i]); if (index1 > -1) { other3.splice(index, 1); } } } //如果还是不足6个弟子就直接拿战力最高的前几个从空位开始放 if (Object.keys(tuijian).length < 6) { //把其余的弟子合并 var other = this.addArr(other1, other2); other = this.addArr(other, other3); var needDzid = other .map(function (dzid) { return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) }; }) .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序 .slice(0, 6 - Object.keys(tuijian).length) // 选出战力最高的需要的弟子数量 .map(function (item) { return item.dzid; }); // 只取 dzid for (var i = 0; i < needDzid.length; i++) { //这个时候用掉的格子都已经删掉了,所以直接取就可以了 tuijian[gezi[i]] = needDzid[i]; } } return tuijian; }; GameMethod.prototype.getSeedRand = function (seed) { return new SeedRand(seed); }; return GameMethod; }()); //输出 exports.gameMethod = new GameMethod(); //种子随机 var SeedRand = /** @class */ (function () { function SeedRand(seed) { this.seed = seed; } /** * 核心方法 输出一个小数 */ SeedRand.prototype.random = function () { this.seed = (this.seed * 9301 + 49297) % 233280; return this.seed / 233280.0; }; SeedRand.prototype.random2 = function (seed) { seed = (seed * 9301 + 49297) % 233280; return seed / 233280.0; }; /** * 按照范围获取一个随机数 */ SeedRand.prototype.rand = function (min, max) { var _rd = Math.round((max - min + 1) * this.random() - 0.5) + min; return _rd; }; /** * 随机排列一个数组 */ SeedRand.prototype.arrayShuffle = function (arr) { var len = arr.length; for (var i = 0; i < len - 1; i++) { var index = this.rand(0, len - i - 1); var temp = arr[index]; arr[index] = arr[len - i - 1]; arr[len - i - 1] = temp; } return arr; }; /** * 随机获取数组元素 */ SeedRand.prototype.getRandArr = function (_arr, num) { var arr = exports.gameMethod.objCopy(_arr); var result = []; num = Math.min(num, arr.length); for (var i = 0; i < num; i++) { var ran = Math.floor(this.random() * (arr.length - i)); result.push(arr[ran]); arr[ran] = arr[arr.length - i - 1]; } return result; }; /** * 随机获取数组元素 seed、_arr、num不变 随机出的数据完全一致 */ SeedRand.prototype.getRandArr2 = function (_arr, num) { var arr = exports.gameMethod.objCopy(_arr); var result = []; num = Math.min(num, arr.length); var seed = this.random2(this.seed); for (var i = 0; i < num; i++) { seed = this.random2(seed); var ran = Math.floor(seed * arr.length); result.push(arr[ran]); arr.splice(ran, 1); } return { result: result, arr: arr }; }; return SeedRand; }()); exports.SeedRand = SeedRand; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvY29tbW9uL2dhbWVNZXRob2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EscUNBQWdDO0FBRWhDLElBQU0sSUFBSSxHQUFhO0lBQ25CLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUNoSixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDN0QsQ0FBQztBQUVGO0lBQUE7SUFveUZBLENBQUM7SUFueUZHOzs7O09BSUc7SUFDSCxpQ0FBWSxHQUFaLFVBQWEsRUFBVSxFQUFFLEtBQWE7UUFDbEMsSUFBSSxHQUFHLEdBQUcsaUJBQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtZQUNiLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMs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LElBQVMsRUFBRSxHQUFXO1FBQ2pDLElBQUksR0FBRyxHQUFRLGtCQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksTUFBTSxHQUFRLEVBQUUsQ0FBQztRQUNyQixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDdEI7UUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUNMLGVBQUM7QUFBRCxDQXRFQSxBQXNFQyxJQUFBO0FBdEVZLDRCQUFRIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgWHlzIGZyb20gXCIuL1h5c1wiO1xuaW1wb3J0IEdhbWVjZmcgZnJvbSBcIi4vZ2FtZUNmZ1wiO1xuXG5jb25zdCBnZXppOiBudW1iZXJbXSA9IFtcbiAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsXG4gICAgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1Myxcbl07XG5cbmNsYXNzIEdhbWVNZXRob2Qge1xuICAgIC8qKlxuICAgICAqIOmSu+efs+i0reS5sOmHkeW4geiOt+W+l+mBk+WFt+WFrOW8j1xuICAgICAqIEBwYXJhbSBpZCDphY3nva7ooajmoaPkvY1JRFxuICAgICAqIEBwYXJhbSBsZXZlbCDop5LoibLnrYnnuqdcbiAgICAgKi9cbiAgICBzaG9wQ29pbkl0ZW0oaWQ6IHN0cmluZywgbGV2ZWw6IG51bWJlcik6IFh5cy5LaW5kSXRlbSB7XG4gICAgICAgIGxldCBjZmcgPSBHYW1lY2ZnLnNob3BDb2luLmdldEl0ZW0oaWQpO1xuICAgICAgICBpZiAoY2ZnID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbMSwgMiwgMV07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvdW50ID0gY2ZnLnJhdGUgKiBNYXRoLm1pbigxMCArIE1hdGguZmxvb3IobGV2ZWwgLyAxMCksIDUwKTtcbiAgICAgICAgcmV0dXJuIFsxLCAyLCBjb3VudF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Lik5Liq5a+56LGh5ZCI5bm2XG4gICAgICogQHBhcmFtIG9iajEgZnJvbSBvYmplY3RcbiAgICAgKiBAcGFyYW0gb2JqMiB0byBvYmplY3RcbiAgICAgKiBAcmV0dXJuIG9iajJcbiAgICAgKi9cbiAgICBvYmpNZXJnZShvYmoxOiBhbnksIG9iajI6IGFueSkge1xuICAgICAgICBvYmoxID0gdHlwZW9mIG9iajEgIT0gXCJvYmplY3RcIiA/IHt9IDogb2JqMTtcbiAgICAgICAgb2JqMiA9IHR5cGVvZiBvYmoyICE9IFwib2JqZWN0XCIgPyB7fSA6IG9iajI7XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgICAgICAgaWYgKG9iajFba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmoyW2tleV0gPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIHRoaXMub2JqTWVyZ2Uob2JqMVtrZXldLCBvYmoyW2tleV0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9iajE7IC8v54S25ZCO5Zyo5oqK5aSN5Yi25aW955qE5a+56LGh57uZcmV0dXJu5Ye65Y67XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOS4pOS4quWvueixoeWQiOW5tiDlgLznm7jliqBcbiAgICAgKi9cbiAgICBvYmpNZXJnZU51bShfZXBzMTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSwgX2VwczI6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0pOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwczogYW55ID0gdGhpcy5vYmpDb3B5KF9lcHMxKTtcbiAgICAgICAgbGV0IGVwMjogYW55ID0gdGhpcy5vYmpDb3B5KF9lcHMyKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZXAyKSB7XG4gICAgICAgICAgICBpZiAoZXBzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGVwc1trZXldID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVwc1trZXldICs9IGVwMltrZXldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5pWw57uE5ZCI5bm2XG4gICAgICovXG4gICAgYWRkQXJyKGFycjE6IGFueVtdLCBhcnIyOiBhbnlbXSkge1xuICAgICAgICBsZXQgX2FycjEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFycjEpKTtcbiAgICAgICAgbGV0IF9hcnIyID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhcnIyKSk7XG4gICAgICAgIGZvciAoY29uc3QgYXJyIG9mIF9hcnIyKSB7XG4gICAgICAgICAgICBfYXJyMS5wdXNoKGFycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9hcnIxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS4muWKoeWIpOepuiDku6XkuIvmg4XlhrXov5Tlm550cnVlXG4gICAgICog5a2X56ym5LiyIDog56m65a2X56ym55qE5Li656m6XG4gICAgICog5pWw5YC8OiAwIOS4uuepuiDotJ/mlbDkuI3kuLrnqbpcbiAgICAgKiDmlbDnu4Q6IOmVv+W6puS4ujBcbiAgICAgKiDlr7nosaE6IOayoeacieiKgueCuVxuICAgICAqIOW4g+WwlOWeiyBmYWxzZVxuICAgICAqL1xuICAgIGlzRW1wdHkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09IG51bGwgfHwgdmFsdWUubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOmAmueUqOa3seaLt+i0neWHveaVsOOAglxuICAgICAqIEBwYXJhbSBvYmogZnJvbSBvYmplY3RcbiAgICAgKiBAcmV0dXJuIG9iajJcbiAgICAgKi9cbiAgICBvYmpDb3B5PFQ+KG9iajogVCk6IFQge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAg55u45ZCMa2luZCDlkowgaXRlbWlkIOaVsOe7hOWQiOW5tlxuICAgICAqL1xuICAgIG1lcmdlQXJyKGFycnM6IFh5cy5LaW5kSXRlbVtdKSB7XG4gICAgICAgIGxldCByZXNPYmo6IHsgW2tpbmQ6IG51bWJlcl06IHsgW2l0ZW1pZDogbnVtYmVyXTogbnVtYmVyIH0gfSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGFyciBvZiBhcnJzKSB7XG4gICAgICAgICAgICBpZiAocmVzT2JqW2FyclswXV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlc09ialthcnJbMF1dID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzT2JqW2FyclswXV1bYXJyWzFdXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzT2JqW2FyclswXV1bYXJyWzFdXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNPYmpbYXJyWzBdXVthcnJbMV1dICs9IGFyclsyXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzQXJyID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2luZCBpbiByZXNPYmopIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gcmVzT2JqW2tpbmRdKSB7XG4gICAgICAgICAgICAgICAgcmVzQXJyLnB1c2goW3BhcnNlSW50KGtpbmQpLCBwYXJzZUludChpZCksIHJlc09ialtraW5kXVtpZF1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzQXJyO1xuICAgIH1cblxuICAgIC8vIOWIpOaWreWtl+espumVv+W6plxuICAgIGdldFN0ckNoYXJhY3Rlckxlbmd0aChzdHI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGxldCBwYXR0ZXJuQ2hpbmVzZSA9IG5ldyBSZWdFeHAoXCJbXFx1NEUwMC1cXHU5RkE1XStcIik7IC8vIOS4reaWh1xuICAgICAgICBsZXQgbGVuZyA9IDA7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzdHIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBpZiAocGF0dGVybkNoaW5lc2UudGVzdChzdHJbaW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIGxlbmcgKz0gMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGVuZyArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsZW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmaj+acuuaVsFxuICAgICAqIEBwYXJhbSBtaW5cbiAgICAgKiBAcGFyYW0gbWF4XG4gICAgICovXG4gICAgcmFuZChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKG1heCAtIG1pbiArIDEpICogTWF0aC5yYW5kb20oKSAtIDAuNSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy/liKTmlq11dWlk5piv5ZCmbnBjXG4gICAgaXNOcGMoZnV1aWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoTnVtYmVyKGZ1dWlkKSA8IDEwMDAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhkRGlaaU1vZGVsUmF0ZShvdXQ6IFh5cy5IZERpWmlPdXQsIGRhdGE6IFh5cy5IZERpWmlEYXRhLCBhY3REaVppTGlzdDogeyBbZHppZDogc3RyaW5nXTogWHlzLkFjdERpWmlfSW5mbyB9KSB7XG4gICAgICAgIGxldCByYXRlID0gMDtcbiAgICAgICAgbGV0IHpSYXRlID0gMDtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgcHppZCBpbiBvdXQudHJlZS5saXN0KSB7XG4gICAgICAgICAgICBpZiAoIWRhdGEubGlzdFtwemlkXSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGhkX2NmZ19lcnI6aGRRaVl1YW5Nb2RlbFJhdGU6IOaXoOaViOeahOWTgei0qElEICR7cHppZH1gKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZm9yIChsZXQgeWd6aWQgPSAxOyB5Z3ppZCA8PSBvdXQudHJlZS5saXN0W3B6aWRdLm9wZW47IHlnemlkKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgX3JhdGUgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBfelJhdGUgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBkemlkID0gb3V0LnRyZWUubGlzdFtwemlkXS5kekxpc3RbeWd6aWRdO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICghZHppZCB8fCAhYWN0RGlaaUxpc3RbZHppZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgX3JhdGUgKz0gTnVtYmVyKGRhdGEubWFrZVtcIjJcIl0uaXRlbVswXSk7XG4gICAgICAgICAgICAgICAgICAgIF96UmF0ZSArPSBOdW1iZXIoZGF0YS5tYWtlW1wiMlwiXS56SXRlbVswXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgZHpJbmZvID0gYWN0RGlaaUxpc3RbZHppZF07XG4gICAgICAgICAgICAgICAgbGV0IGNmZ0R6SW5mbyA9IEdhbWVjZmcuaHVvYmFuQmFzZS5nZXRJdGVtKGR6SW5mby5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjZmdEekluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCBkenBpbnpoaSA9IGNmZ0R6SW5mby5waW56aGk7XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8g562J57qn5Yqg5oiQXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2hhbmNodSBvZiBkYXRhLm1ha2VbZHpwaW56aGkudG9TdHJpbmcoKV0ubGV2ZWxJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuY2h1WzBdIDw9IGR6SW5mby5sZXZlbCAmJiBkekluZm8ubGV2ZWwgPD0gY2hhbmNodVsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JhdGUgKz0gTnVtYmVyKGNoYW5jaHVbMl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2hhbmNodSBvZiBkYXRhLm1ha2VbZHpwaW56aGkudG9TdHJpbmcoKV0ubGV2ZWxaSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmNodVswXSA8PSBkekluZm8ubGV2ZWwgJiYgZHpJbmZvLmxldmVsIDw9IGNoYW5jaHVbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF96UmF0ZSArPSBOdW1iZXIoY2hhbmNodVsyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyDmmJ/nuqfliqDmiJBcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjaGFuY2h1IG9mIGRhdGEubWFrZVtkenBpbnpoaS50b1N0cmluZygpXS5zdGFySXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmNodVswXSA8PSBkekluZm8uc3RhciAmJiBkekluZm8uc3RhciA8PSBjaGFuY2h1WzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmF0ZSArPSBOdW1iZXIoY2hhbmNodVsyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjaGFuY2h1IG9mIGRhdGEubWFrZVtkenBpbnpoaS50b1N0cmluZygpXS5zdGFyWkl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5jaHVbMF0gPD0gZHpJbmZvLnN0YXIgJiYgZHpJbmZvLnN0YXIgPD0gY2hhbmNodVsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3pSYXRlICs9IE51bWJlcihjaGFuY2h1WzJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKE51bWJlcihjZmdEekluZm8ubGl1cGFpKSA9PT0gTnVtYmVyKHB6aWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yYXRlICo9IE51bWJlcihkYXRhLm1ha2VbZHpwaW56aGkudG9TdHJpbmcoKV0uaXRlbVsyXSk7XG4gICAgICAgICAgICAgICAgICAgIF96UmF0ZSAqPSBOdW1iZXIoZGF0YS5tYWtlW2R6cGluemhpLnRvU3RyaW5nKCldLnpJdGVtWzJdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfcmF0ZSAqPSBOdW1iZXIoZGF0YS5tYWtlW2R6cGluemhpLnRvU3RyaW5nKCldLml0ZW1bMV0pO1xuICAgICAgICAgICAgICAgICAgICBfelJhdGUgKj0gTnVtYmVyKGRhdGEubWFrZVtkenBpbnpoaS50b1N0cmluZygpXS56SXRlbVsxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJhdGUgKz0gX3JhdGU7XG4gICAgICAgICAgICAgICAgelJhdGUgKz0gX3pSYXRlO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7IHJhdGUsIHpSYXRlIH07XG4gICAgfVxuXG4gICAgXG4gICAgLy/moLnmja7pgJ/luqblkowg5b2T5YmNWFgg6K6h566X5Ye65b2T5YmN5oC756ev5YiGICDlhb3ngbVcbiAgICBoZERpWmlNb2RlbFRvdG9sKG91dDogWHlzLkhkRGlaaU91dCwgZGF0YTogWHlzLkhkRGlaaURhdGEsIHJhdGU6IG51bWJlciwgelJhdGU6IG51bWJlciwgbm93VGltZTogbnVtYmVyKSB7XG4gICAgICAgIC8v6L+H5LqG5aSa6ZW/5pe26Ze0XG4gICAgICAgIGxldCBkdGltZSA9IG5vd1RpbWUgLSBvdXQudHJlZS5zX3RpbWU7XG4gICAgICAgIC8v5qC55o2u6YCf5bqmIOaOieiQvVxuICAgICAgICAvL+eOsOWcqOaUueS4uumZkOWItuS6p+WHuuaXtumXtO+8jOiAjOS4jeaYr+mZkOWItuS6p+WHuuaVsOmHj1xuICAgICAgICBkdGltZSA9IE1hdGgubWluKGR0aW1lLCBkYXRhLnRyZWUuc2NvcmVUaW1lTWF4KTtcbiAgICAgICAgbGV0IHNjb3JlID0gTWF0aC5yb3VuZCgocmF0ZSAqIGR0aW1lKSAvIDM2MDApO1xuICAgICAgICBsZXQgdG90b2wgPSBzY29yZSArIG91dC50cmVlLnNfbnVtO1xuICAgICAgICBjb25zdCB6U2NvcmUgPSBNYXRoLnJvdW5kKCh6UmF0ZSAqIGR0aW1lKSAvIDM2MDApO1xuICAgICAgICBsZXQgelRvdGFsID0gelNjb3JlICsgb3V0LnRyZWUuel9udW07XG4gICAgICAgIC8vIGlmICh0b3RvbCA+IGRhdGEudHJlZS5zY29yZU1heCkge1xuICAgICAgICAvLyAgICAgLy/lrp7pmYXkuqflh7pcbiAgICAgICAgLy8gICAgIGxldCBzaiA9IGRhdGEudHJlZS5zY29yZU1heCAtIG91dC50cmVlLnNfbnVtO1xuICAgICAgICAvLyAgICAgLy/lrp7pmYXkuqflh7og5omA6ZyA5pe26Ze0XG4gICAgICAgIC8vICAgICBkdGltZSA9IE1hdGgucm91bmQoKHNqIC8gcmF0ZSkgKiAzNjAwKTtcbiAgICAgICAgLy8gICAgIC8v6I635b6X55qE5oC75Lqn5Ye6XG4gICAgICAgIC8vICAgICB0b3RvbCA9IGRhdGEudHJlZS5zY29yZU1heDtcbiAgICAgICAgLy8gfVxuICAgICAgICAvL+agueaNrumAn+eOhyDnu5PnrpdcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvdG9sOiB0b3RvbCwgLy/lvZPliY3mgLvkuqflh7pcbiAgICAgICAgICAgIHpUb3RhbDogelRvdGFsLCAvL+i1t+a6kOS5i+W+geaAu+S6p+WHulxuICAgICAgICAgICAgZHRpbWU6IGR0aW1lLCAvL+acrOasoeiuoeeulyDlrp7pmYXkuqflh7rml7bplb9cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpflv4PprZTnp6/liIbojIPlm7RcbiAgICAgKi9cbiAgICBoZFNob3VMaW5nU2NvcmUoXG4gICAgICAgIHhtSWQ6IHN0cmluZyxcbiAgICAgICAgY2ZnOiBYeXMuSGRTaG91TGluZ0RhdGEsXG4gICAgICAgIGFjdFNob3VMaW5nOiB7IFtnemlkOiBzdHJpbmddOiBPbWl0PFh5cy5BY3RTaG91TGluZ19MaXN0T25lLCAnc2snPiB9ID0ge30sXG4gICAgICAgIGd6aWRzOiBzdHJpbmdbXSA9IFtdXG4gICAgKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGxldCBzaG91bGluZ0NmZyA9IGNmZy5zaG91bGluZ1t4bUlkXTtcbiAgICAgICAgaWYgKHNob3VsaW5nQ2ZnID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHhtSWRfZXJyIDoke3htSWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gWzAsIDBdO1xuICAgICAgICB9XG4gICAgICAgIC8v5Yid5aeL56ev5YiGOiDlv4PprZTnp6/liIZcbiAgICAgICAgbGV0IHNjb3JlczogW251bWJlciwgbnVtYmVyXSA9IFtzaG91bGluZ0NmZy5zY29yZVswXSwgc2hvdWxpbmdDZmcuc2NvcmVbMV1dO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGd6aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZ3ppZCA9IGd6aWRzW2ldO1xuICAgICAgICAgICAgbGV0IGFkZE9uZSA9IGdhbWVNZXRob2QuaGRTaG91TGluZ1Njb3JlT25lKGNmZywgYWN0U2hvdUxpbmcsIGd6aWQpO1xuICAgICAgICAgICAgc2NvcmVzWzBdICs9IGFkZE9uZVswXTtcbiAgICAgICAgICAgIHNjb3Jlc1sxXSArPSBhZGRPbmVbMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjb3JlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICog5b+D6a2U6K6h566XIOS4gOS4quWuoOeJqeWKoOeahOenr+WIhlxuICAgICAqL1xuICAgIGhkU2hvdUxpbmdTY29yZU9uZShjZmc6IFh5cy5IZFNob3VMaW5nRGF0YSwgc2xpbmZvOiB7IFtnemlkOiBzdHJpbmddOiBPbWl0PFh5cy5BY3RTaG91TGluZ19MaXN0T25lLCAnc2snPiB9LCBnemlkOiBzdHJpbmcpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgLy/liJ3lp4vnp6/liIY6IOW/g+mtlOenr+WIhlxuICAgICAgICBsZXQgc2FkZDogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcblxuICAgICAgICAvL+aYr+WQpuWtmOWcqFxuICAgICAgICBpZiAoc2xpbmZvW2d6aWRdID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGZ6SW5mb19udWxsIDoke2d6aWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gc2FkZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8v6I635Y+W5rOV6Zi1562J57qn6YWN572uXG4gICAgICAgIGxldCBjZmdzbCA9IEdhbWVjZmcuc2hvdWxpbmdJbmZvLmdldEl0ZW0oc2xpbmZvW2d6aWRdLnNsaWQpO1xuICAgICAgICBpZiAoY2Znc2wgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgY2Znc2xfbnVsbCA6JHtnemlkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHNhZGQ7XG4gICAgICAgIH1cblxuICAgICAgICAvL+etiee6p+enr+WIhue0r+WKoFxuICAgICAgICBpZiAoY2ZnLnNNYXRoW2NmZ3NsLnBpbnpoaS50b1N0cmluZygpXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvL1vnp6/liIbku7flgLws56ev5YiG5LiL6ZmQLOenr+WIhuS4iumZkCzns7vmlbDkuIvpmZAs57O75pWw5LiK6ZmQXVxuICAgICAgICAgICAgbGV0IHB6Y2ZnID0gY2ZnLnNNYXRoW2NmZ3NsLnBpbnpoaS50b1N0cmluZygpXTtcbiAgICAgICAgICAgIC8v56ev5YiG5Lu35YC8XG4gICAgICAgICAgICBzYWRkWzBdICs9IHB6Y2ZnLnhpc2h1WzBdO1xuICAgICAgICAgICAgc2FkZFsxXSArPSBwemNmZy54aXNodVswXTtcbiAgICAgICAgICAgIC8v56ev5YiG5LiK5LiL6ZmQXG4gICAgICAgICAgICBzYWRkWzBdICs9IHB6Y2ZnLnhpc2h1WzFdO1xuICAgICAgICAgICAgc2FkZFsxXSArPSBwemNmZy54aXNodVsyXTtcbiAgICAgICAgICAgIC8v56ev5YiG57O75pWwICog562J57qnKHNhdmVJZClcbiAgICAgICAgICAgIHNhZGRbMF0gKz0gc2xpbmZvW2d6aWRdLmxldmVsICogcHpjZmcueGlzaHVbM107XG4gICAgICAgICAgICBzYWRkWzFdICs9IHNsaW5mb1tnemlkXS5sZXZlbCAqIHB6Y2ZnLnhpc2h1WzRdO1xuICAgICAgICAgICAgLy/np6/liIbns7vmlbAgKiDmmJ/nuqcoc2F2ZUlkKVxuICAgICAgICAgICAgc2FkZFswXSArPSBzbGluZm9bZ3ppZF0uc3RhciAqIHB6Y2ZnLnhpc2h1WzVdO1xuICAgICAgICAgICAgc2FkZFsxXSArPSBzbGluZm9bZ3ppZF0uc3RhciAqIHB6Y2ZnLnhpc2h1WzZdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzYWRkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+eBteiEieenr+WIhuS6p+WHulxuICAgICAqL1xuICAgIGxpbmdNYWlTY29yZShqaW5namllSWQ6IHN0cmluZywgY2hlbmdoYW9JZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGNmZ0Jhc2UgPSBHYW1lY2ZnLm1hdGhJbmZvLmdldEl0ZW0oXCJsaW5nbWFpX2Jhc2Vfc2NvcmVcIik7XG4gICAgICAgIGlmIChjZmdCYXNlID09IG51bGwgfHwgY2ZnQmFzZS5wcmFtID09IG51bGwgfHwgY2ZnQmFzZS5wcmFtLmNvdW50ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy/orqHnrpflooPnlYzliqDmiJBcbiAgICAgICAgbGV0IGppbmdqaWVBZGQgPSAwO1xuICAgICAgICBsZXQgamluZ2ppZUNmZyA9IEdhbWVjZmcuamluZ2ppZVN0ZXAuZ2V0SXRlbShqaW5namllSWQpO1xuICAgICAgICBpZiAoamluZ2ppZUNmZyAhPSBudWxsKSB7XG4gICAgICAgICAgICBqaW5namllQWRkID0gamluZ2ppZUNmZy5sbWpjO1xuICAgICAgICB9XG4gICAgICAgIC8v6K6h566X56ew5Y+35Yqg5oiQXG4gICAgICAgIGxldCB0aXRsZUFkZCA9IDA7XG4gICAgICAgIGxldCB0aXRsZUNmZyA9IEdhbWVjZmcuY2hlbmdoYW9JbmZvLmdldEl0ZW0oY2hlbmdoYW9JZCk7XG4gICAgICAgIGlmICh0aXRsZUNmZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aXRsZUFkZCA9IHRpdGxlQ2ZnLmpjO1xuICAgICAgICB9XG4gICAgICAgIC8v5Yid5aeL56ev5YiGOiDlv4PprZTnp6/liIZcbiAgICAgICAgbGV0IHNjb3JlcyA9IE1hdGgucm91bmQoY2ZnQmFzZS5wcmFtLmNvdW50ICogKDEgKyBqaW5namllQWRkIC8gMTAwKSAqICgxICsgdGl0bGVBZGQgLyAxMDApKTtcbiAgICAgICAgcmV0dXJuIHNjb3JlcztcbiAgICB9XG4gICAgLy8tLS0tLS0tLS0tLS0tLeWxnuaAp+iuoeeulyDvvIjkuLvop5Lln7rnoYDlsZ7mgKcg77yJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyDvvIjlpKnotYvmlbDlgLwr6KOF5aSH5pWw5YC8K+WfuuehgOWxnuaAp++8iSrvvIgxK+eZvuWIhuavlOWKoOaIkO+8iT3pnaLmnb/lsZ7mgKdcblxuICAgIC8qKlxuICAgICAqIOWxnuaAp+WQiOW5tlxuICAgICAqL1xuICAgIGVwX21lcmdlKF9lcHMxOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9LCBfZXBzMjogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiBhbnkgPSB0aGlzLm9iakNvcHkoX2VwczEpO1xuICAgICAgICBsZXQgZXAyOiBhbnkgPSB0aGlzLm9iakNvcHkoX2VwczIpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlcDIpIHtcbiAgICAgICAgICAgIGlmIChlcHNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZXBzW2tleV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXBzW2tleV0gKz0gZXAyW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZXBzLmhwID0gZXBzLmhwX21heCB8fCAwO1xuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtba2V5OnN0cmluZ106bnVtYmVyfSDlsZ7mgKflkIjlubYgX2VwczLnmoRrZXkgX2VwczHmsqHmnInlsLHkuI3liqBcbiAgICAgKi9cbiAgICBlcF9tZXJnZUt2X2hhcyhfZXBzMTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSwgX2VwczI6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0pOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwczogYW55ID0gdGhpcy5vYmpDb3B5KF9lcHMxKTtcbiAgICAgICAgbGV0IGVwMjogYW55ID0gdGhpcy5vYmpDb3B5KF9lcHMyKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZXAyKSB7XG4gICAgICAgICAgICBpZiAoZXBzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXBzW2tleV0gKz0gZXAyW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZXBzW1wiaHBcIl0gPSBlcHNbXCJocF9tYXhcIl07IC8v5LiN6KaB5YigXG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge1trZXk6c3RyaW5nXTpudW1iZXJ9IOWxnuaAp+WQiOW5tiB4IOezu+aVsFxuICAgICAqL1xuICAgIGVwX0t2UmF0ZShfZXBzMTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSwgcmF0ZTogbnVtYmVyKTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBlcHM6IGFueSA9IHRoaXMub2JqQ29weShfZXBzMSk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVwcykge1xuICAgICAgICAgICAgZXBzW2tleV0gPSBNYXRoLmZsb29yKGVwc1trZXldICogcmF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlsZ7mgKfliJ3lp4vljJZcbiAgICAgKi9cbiAgICBlcF9pbml0KCk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiBhbnkgPSB7fTtcbiAgICAgICAgbGV0IHVzZXJFcFBvb2wgPSBHYW1lY2ZnLnVzZXJFcC5wb29sO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB1c2VyRXBQb29sKSB7XG4gICAgICAgICAgICBlcHNbdXNlckVwUG9vbFtrZXldLmtleV0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6KeS6Imy5Z+656GA5bGe5oCnXG4gICAgICovXG4gICAgZXBfdXNlcigpOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBsZXQgdXNlckVwUG9vbCA9IEdhbWVjZmcudXNlckVwLnBvb2w7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHVzZXJFcFBvb2wpIHtcbiAgICAgICAgICAgIGVwc1t1c2VyRXBQb29sW2tleV0ua2V5XSA9IHVzZXJFcFBvb2xba2V5XS5pbml0RXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG4gICAgLyoqXG4gICAgICog5bGe5oCn5bGV56S65oC75bGe5oCnXG4gICAgICovXG4gICAgZXBfYWxsX2Jhc2Uoc2V2QmFjazogWHlzLlNldkJhY2spOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgLy/lsZ7mgKfliJ3lp4vljJZcbiAgICAgICAgbGV0IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHRoaXMuZXBfaW5pdCgpO1xuICAgICAgICAvLyvop5LoibLln7rnoYDlsZ7mgKdcbiAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHRoaXMuZXBfdXNlcigpKTtcblxuICAgICAgICAvL+WQjuerr+iusOW9leeahOWxnuaAp1xuICAgICAgICBpZiAoc2V2QmFjay5hY3RFcHMgIT0gbnVsbCAmJiBzZXZCYWNrLmFjdEVwcy5hICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2lkIGluIHNldkJhY2suYWN0RXBzLmEpIHtcbiAgICAgICAgICAgICAgICBlcHMgPSBnYW1lTWV0aG9kLmVwX21lcmdlKGVwcywgc2V2QmFjay5hY3RFcHMuYVtraWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVwc1tcImhwXCJdID0gTWF0aC5yb3VuZChlcHNbXCJocFwiXSk7XG4gICAgICAgIGVwc1tcImF0a1wiXSA9IE1hdGgucm91bmQoZXBzW1wiYXRrXCJdKTtcbiAgICAgICAgZXBzW1wiZGVmXCJdID0gTWF0aC5yb3VuZChlcHNbXCJkZWZcIl0pO1xuICAgICAgICByZXR1cm4gZ2FtZU1ldGhvZC5vYmpDb3B5KGVwcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5bGe5oCn5bGV56S65oC75bGe5oCnIO+8iOmdouadv+WxnuaAp++8iVxuICAgICAqIOmdouadv+WxnuaApyA9IOinkuiJsuWfuuehgOWxnuaAp1xuICAgICAqL1xuICAgIGVwX2FsbChzZXZCYWNrOiBYeXMuU2V2QmFjayk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzID0gdGhpcy5lcF9hbGxfYmFzZShzZXZCYWNrKTtcbiAgICAgICAgLy/mlLvpgJ9cbiAgICAgICAgZXBzLnNwZWVkICs9IE1hdGguZmxvb3IoKGVwcy5zcGVlZCAqIGVwcy5zcGVlZF9wZXIpIC8gMTAwMDApO1xuICAgICAgICAvL+aUu+WHu1xuICAgICAgICBlcHMuYXRrICs9IE1hdGguZmxvb3IoKGVwcy5hdGsgKiBlcHMuYXRrX3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwcy5hdGsgKz0gTWF0aC5mbG9vcigoZXBzLmF0ayAqIGVwcy5maW5hbGx5X2F0a19wZXIpIC8gMTAwMDApO1xuICAgICAgICAvL+mYsuW+oVxuICAgICAgICBlcHMuZGVmICs9IE1hdGguZmxvb3IoKGVwcy5kZWYgKiBlcHMuZGVmX3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwcy5kZWYgKz0gTWF0aC5mbG9vcigoZXBzLmRlZiAqIGVwcy5maW5hbGx5X2RlZl9wZXIpIC8gMTAwMDApO1xuICAgICAgICAvL+ihgOmHj1xuICAgICAgICBlcHMuaHBfbWF4ICs9IE1hdGguZmxvb3IoKGVwcy5ocF9tYXggKiBlcHMuaHBfbWF4X3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwcy5ocF9tYXggKz0gTWF0aC5mbG9vcigoZXBzLmhwX21heCAqIGVwcy5maW5hbGx5X2hwX21heF9wZXIpIC8gMTAwMDApO1xuICAgICAgICBlcHMuaHAgPSBlcHMuaHBfbWF4O1xuXG4gICAgICAgIC8v5pS76YCfXG4gICAgICAgIGVwcy5zcGVlZF9wZXIgPSAwO1xuICAgICAgICAvL+aUu+WHu1xuICAgICAgICBlcHMuYXRrX3BlciA9IDBcbiAgICAgICAgZXBzLmZpbmFsbHlfYXRrX3BlciA9IDBcbiAgICAgICAgLy/pmLLlvqFcbiAgICAgICAgZXBzLmRlZl9wZXIgPSAwXG4gICAgICAgIGVwcy5maW5hbGx5X2RlZl9wZXIgPSAwO1xuICAgICAgICAvL+ihgOmHj1xuICAgICAgICBlcHMuaHBfbWF4X3BlciA9IDA7XG4gICAgICAgIGVwcy5maW5hbGx5X2hwX21heF9wZXIgPSAwO1xuXG4gICAgICAgIHJldHVybiBnYW1lTWV0aG9kLm9iakNvcHkoZXBzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlsZ7mgKflsZXnpLrmgLvlsZ7mgKcg77yI6Z2i5p2/5bGe5oCn77yJXG4gICAgICog6Z2i5p2/5bGe5oCnID0g6KeS6Imy5Z+656GA5bGe5oCnXG4gICAgICovXG4gICAgZXBfYWxsX2ZpZ2h0KGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBlcHMgPSBnYW1lTWV0aG9kLm9iakNvcHkoZXBzKVxuICAgICAgICAvL+aUu+mAn1xuICAgICAgICBlcHMuc3BlZWQgKz0gTWF0aC5mbG9vcigoZXBzLnNwZWVkICogZXBzLnNwZWVkX3BlcikgLyAxMDAwMCk7XG4gICAgICAgIC8v5pS75Ye7XG4gICAgICAgIGVwcy5hdGsgKz0gTWF0aC5mbG9vcigoZXBzLmF0ayAqIGVwcy5hdGtfcGVyKSAvIDEwMDAwKTtcbiAgICAgICAgZXBzLmF0ayArPSBNYXRoLmZsb29yKChlcHMuYXRrICogZXBzLmZpbmFsbHlfYXRrX3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwcy5hdGsgKz0gZXBzLmZpbmFsbHlfYXRrXG4gICAgICAgIC8v6Ziy5b6hXG4gICAgICAgIGVwcy5kZWYgKz0gTWF0aC5mbG9vcigoZXBzLmRlZiAqIGVwcy5kZWZfcGVyKSAvIDEwMDAwKTtcbiAgICAgICAgZXBzLmRlZiArPSBNYXRoLmZsb29yKChlcHMuZGVmICogZXBzLmZpbmFsbHlfZGVmX3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwcy5kZWYgKz0gZXBzLmZpbmFsbHlfZGVmXG4gICAgICAgIC8v6KGA6YePXG4gICAgICAgIGVwcy5ocF9tYXggKz0gTWF0aC5mbG9vcigoZXBzLmhwX21heCAqIGVwcy5ocF9tYXhfcGVyKSAvIDEwMDAwKTtcbiAgICAgICAgZXBzLmhwX21heCArPSBNYXRoLmZsb29yKChlcHMuaHBfbWF4ICogZXBzLmZpbmFsbHlfaHBfbWF4X3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwcy5ocF9tYXggKz0gZXBzLmZpbmFsbHlfaHBfbWF4XG4gICAgICAgIGVwcy5ocCA9IGVwcy5ocF9tYXg7XG5cbiAgICAgICAgLy/mlLvpgJ9cbiAgICAgICAgZXBzLnNwZWVkX3BlciA9IDA7XG4gICAgICAgIC8v5pS75Ye7XG4gICAgICAgIGVwcy5hdGtfcGVyID0gMFxuICAgICAgICBlcHMuZmluYWxseV9hdGtfcGVyID0gMFxuICAgICAgICBlcHMuZmluYWxseV9hdGsgPSAwXG4gICAgICAgIC8v6Ziy5b6hXG4gICAgICAgIGVwcy5kZWZfcGVyID0gMFxuICAgICAgICBlcHMuZmluYWxseV9kZWZfcGVyID0gMDtcbiAgICAgICAgZXBzLmZpbmFsbHlfZGVmID0gMDtcbiAgICAgICAgLy/ooYDph49cbiAgICAgICAgZXBzLmhwX21heF9wZXIgPSAwO1xuICAgICAgICBlcHMuZmluYWxseV9ocF9tYXhfcGVyID0gMDtcbiAgICAgICAgZXBzLmZpbmFsbHlfaHBfbWF4ID0gMDtcblxuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWxnuaAp+WxleekuuaAu+WxnuaApyDvvIjpnaLmnb/lsZ7mgKfvvInmmL7npLrmnIDnu4jlsZ7mgKdcbiAgICAgKi9cbiAgICBlcF9hbGxfenooZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9KTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGVwcyA9IGdhbWVNZXRob2Qub2JqQ29weShlcHMpXG4gICAgICAgIC8v5pS75Ye7XG4gICAgICAgIGxldCBhdGs6bnVtYmVyID0gZXBzLmF0a1xuICAgICAgICBhdGsgKz0gZXBzLmF0a19wZXI/IE1hdGguZmxvb3IoKGF0ayAqIGVwcy5hdGtfcGVyKSAvIDEwMDAwKTowO1xuICAgICAgICBhdGsgKz0gZXBzLmZpbmFsbHlfYXRrX3Blcj9NYXRoLmZsb29yKChhdGsgKiBlcHMuZmluYWxseV9hdGtfcGVyKSAvIDEwMDAwKTowO1xuICAgICAgICBhdGsgKz0gZXBzLmZpbmFsbHlfYXRrXG4gICAgICAgIC8v6Ziy5b6hXG4gICAgICAgIGxldCBkZWY6bnVtYmVyID0gZXBzLmRlZlxuICAgICAgICBkZWYgKz0gZXBzLmRlZl9wZXI/IE1hdGguZmxvb3IoKGRlZiAqIGVwcy5kZWZfcGVyKSAvIDEwMDAwKTowO1xuICAgICAgICBkZWYgKz0gZXBzLmZpbmFsbHlfZGVmX3Blcj9NYXRoLmZsb29yKChkZWYgKiBlcHMuZmluYWxseV9kZWZfcGVyKSAvIDEwMDAwKTowO1xuICAgICAgICBkZWYgKz0gZXBzLmZpbmFsbHlfZGVmXG4gICAgICAgIC8v6KGA6YePXG4gICAgICAgIGxldCBocF9tYXg6bnVtYmVyID0gZXBzLmhwX21heFxuICAgICAgICBocF9tYXggKz0gZXBzLmhwX21heF9wZXI/TWF0aC5mbG9vcigoaHBfbWF4ICogZXBzLmhwX21heF9wZXIpIC8gMTAwMDApOjA7XG4gICAgICAgIGhwX21heCArPSBlcHMuZmluYWxseV9ocF9tYXhfcGVyP01hdGguZmxvb3IoKGhwX21heCAqIGVwcy5maW5hbGx5X2hwX21heF9wZXIpIC8gMTAwMDApOjA7XG4gICAgICAgIGhwX21heCArPSBlcHMuZmluYWxseV9ocF9tYXhcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFwiZmluYWxseV9hdGtcIjphdGssXG4gICAgICAgICAgICBcImZpbmFsbHlfZGVmXCI6ZGVmLFxuICAgICAgICAgICAgXCJmaW5hbGx5X2hwX21heFwiOmhwX21heCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog5Li76KeS5oiY5paX5bGe5oCnXG4gICAgICovXG4gICAgZXBfZmlnaHQoc2V2QmFjazogWHlzLlNldkJhY2spOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwcyA9IHRoaXMuZXBfYWxsKHNldkJhY2spO1xuICAgICAgICAvL+aUu+mAn1xuICAgICAgICBlcHMuc3BlZWRfcGVyID0gMDtcbiAgICAgICAgLy/mlLvlh7tcbiAgICAgICAgZXBzLmF0a19wZXIgPSAwXG4gICAgICAgIGVwcy5maW5hbGx5X2F0a19wZXIgPSAwXG4gICAgICAgIC8v6Ziy5b6hXG4gICAgICAgIGVwcy5kZWZfcGVyID0gMFxuICAgICAgICBlcHMuZmluYWxseV9kZWZfcGVyID0gMDtcbiAgICAgICAgLy/ooYDph49cbiAgICAgICAgZXBzLmhwX21heF9wZXIgPSAwO1xuICAgICAgICBlcHMuZmluYWxseV9ocF9tYXhfcGVyID0gMDtcbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIOW8n+WtkOaImOaWl+WxnuaAp1xuICAgICAqIEBwYXJhbSBkekluZm8g5byf5a2Q5L+h5oGvXG4gICAgICogQHBhcmFtIGVwcyDkuLvop5LlsZ7mgKdcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGVwX2ZpZ2h0X2RpemkoZHpJbmZvOiBYeXMuQWN0RGlaaV9JbmZvLCBlcHNBbGw6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0pOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGR6RXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0gZ2FtZU1ldGhvZC5lcF9pbml0KCk7IC8v5Yid5aeL5YyW5bGe5oCnXG4gICAgICAgIGxldCBjZmdkeiA9IEdhbWVjZmcuaHVvYmFuQmFzZS5nZXRJdGVtKGR6SW5mby5pZCk7XG4gICAgICAgIGlmIChjZmdkeiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZHpFcHM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNmZ1pob25nWnUgPSBHYW1lY2ZnLmh1b2Jhblpob25nenUuZ2V0SXRlbShjZmdkei5waW56aGksIGNmZ2R6Lnpob25nenUudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChjZmdaaG9uZ1p1ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBkekVwcztcbiAgICAgICAgfVxuICAgICAgICBkekVwcyA9IGdhbWVNZXRob2QuZXBfbWVyZ2UoZHpFcHMsIGNmZ2R6LmVwcyk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyKSB7XG4gICAgICAgICAgICAvL+e7p+aJv+S4u+inkuWxnuaAp1xuICAgICAgICAgICAgZHpFcHNba2V5XSArPSBNYXRoLmZsb29yKChlcHNBbGxba2V5XSAqIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyW2tleV0pIC8gMTAwMDApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyX2hpZGUpIHtcbiAgICAgICAgICAgIC8v57un5om/5Li76KeS5bGe5oCnXG4gICAgICAgICAgICBkekVwc1trZXldICs9IE1hdGguZmxvb3IoKGVwc0FsbFtrZXldICogY2ZnWmhvbmdadS5pbmhlcml0X2F0dHJfaGlkZVtrZXldKSAvIDEwMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBkekVwcy5ocCA9IGR6RXBzLmhwX21heDtcbiAgICAgICAgcmV0dXJuIGR6RXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmYteazlVxuICAgICAqL1xuICAgIGVwX3poZW5mYShhY3RaaGVuZmE6IFh5cy5BY3RaaGVuZmFOZXcpOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBjb25zdCBjaHVhbktleXMgPSBPYmplY3Qua2V5cyhhY3RaaGVuZmEuY2h1YW4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNodWFuS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYnV3ZWkgPSBjaHVhbktleXNbaV07XG4gICAgICAgICAgICAvL+ijheWkh+WxnuaAp1xuICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIGFjdFpoZW5mYS5jaHVhbltidXdlaV0uZXBzKTtcbiAgICAgICAgICAgIC8v6ZmE6a2U5bGe5oCnXG4gICAgICAgICAgICBsZXQgYWRkRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZtRXBzIG9mIGFjdFpoZW5mYS5jaHVhbltidXdlaV0uZm1FcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWRkRXBzW2ZtRXBzWzBdXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZEVwc1tmbUVwc1swXV0gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZGRFcHNbZm1FcHNbMF1dICs9IGZtRXBzWzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDmtJfnu4PlsZ7mgKdcbiAgICAgICAgICAgIGZvciAoY29uc3QgcG9zSWQgaW4gYWN0WmhlbmZhLmNodWFuW2J1d2VpXS54aWxpYW5FcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0WmhlbmZhLmNodWFuW2J1d2VpXS54aWxpYW5FcHNbcG9zSWRdLmlkID09IG51bGwgfHwgYWN0WmhlbmZhLmNodWFuW2J1d2VpXS54aWxpYW5FcHNbcG9zSWRdLmlkID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCB4aWxpYW5fYyA9IEdhbWVjZmcuemhlbmZhWGlsaWFuV29yZC5nZXRJdGVtKGFjdFpoZW5mYS5jaHVhbltidXdlaV0ueGlsaWFuRXBzW3Bvc0lkXS5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKHhpbGlhbl9jICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHhpbGlhbl9jLmF0dHIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIGFkZEVwcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmYteazlVxuICAgICAqL1xuICAgIGVwX3poZW5mYV9saXN0KGFjdFpoZW5mYTogWHlzLkFjdFpoZW5mYU5ldyk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIC8vIOmYteazlU5ld1xuICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKGFjdFpoZW5mYS56Zkxpc3QpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB6ZkJhc2UgPSBHYW1lY2ZnLnpmeHRaZmJhc2UuZ2V0SXRlbShrZXlzW2ldKTtcbiAgICAgICAgICAgIGlmICh6ZkJhc2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCB6ZlNoZW5namkgPSBHYW1lY2ZnLnpmeHRaZnNoZW5namkuZ2V0SXRlbSh6ZkJhc2UucGluemhpLCBhY3RaaGVuZmEuemZMaXN0W2tleXNbaV1dLmxldmVsLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGlmICh6ZlNoZW5namkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgemZTaGVuZ2ppLmF0dHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWkp+W4neWPpOWtl1xuICAgICAqL1xuICAgIGVwX2RhZGlndXppKGFjdERhZGlHdXppOiBYeXMuQWN0RGFkaUd1emksIG1mTGlzdDogeyBbbWZpZDogc3RyaW5nXTogWHlzLm1mSW5mbyB9KTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBlcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFjdERhZGlHdXppLm1wTGlzdFthY3REYWRpR3V6aS5tcFhoaWRdKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBidXdlaSA9IGtleXNbaV07XG4gICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGFjdERhZGlHdXppLm1wTGlzdFthY3REYWRpR3V6aS5tcFhoaWRdW2J1d2VpXSkgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIGFjdERhZGlHdXppLm1wTGlzdFthY3REYWRpR3V6aS5tcFhoaWRdW2J1d2VpXS5lcHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy/kuIrpmLXliJfooahcbiAgICAgICAgbGV0IHN6TWZpZHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IG1mWmhhbktleXMgPSBPYmplY3Qua2V5cyhhY3REYWRpR3V6aS5tZlpoYW4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1mWmhhbktleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IF90eXBlID0gbWZaaGFuS2V5c1tpXTtcbiAgICAgICAgICAgIGlmIChhY3REYWRpR3V6aS5tZlpoYW5bX3R5cGVdID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN6TWZpZHMucHVzaChhY3REYWRpR3V6aS5tZlpoYW5bX3R5cGVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8v5LuZ5rOVICsg6ZOt5paHXG4gICAgICAgIGNvbnN0IG1mTGlzdEtleXMgPSBPYmplY3Qua2V5cyhtZkxpc3QpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1mTGlzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1maWQgPSBtZkxpc3RLZXlzW2ldO1xuICAgICAgICAgICAgbGV0IGNmZ1hmSW5mbyA9IEdhbWVjZmcuZGFkaWd1emlYZmluZm8uZ2V0SXRlbShtZmlkKTtcbiAgICAgICAgICAgIGlmIChjZmdYZkluZm8gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNmZyA9IEdhbWVjZmcuZGFkaWd1emlYZmx2LmdldEl0ZW0oY2ZnWGZJbmZvLnBpbnpoaS50b1N0cmluZygpLCBtZkxpc3RbbWZpZF0ubGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoY2ZnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXBzW1wiaHBfbWF4XCJdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZXBzW1wiaHBfbWF4XCJdID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVwc1tcImF0a1wiXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGVwc1tcImF0a1wiXSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlcHNbXCJkZWZcIl0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBlcHNbXCJkZWZcIl0gPSAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVwc1tcImhwX21heFwiXSArPSBjZmcuaHBfbWF4O1xuICAgICAgICAgICAgICAgIGVwc1tcImF0a1wiXSArPSBjZmcuYXRrO1xuICAgICAgICAgICAgICAgIGVwc1tcImRlZlwiXSArPSBjZmcuZGVmO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3pNZmlkcy5pbmRleE9mKG1maWQpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7IC8v5rKh5LiK6Zi1IOS4jeWKoOmTreaWh+WxnuaAp1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBtd2lkIG9mIG1mTGlzdFttZmlkXS5td0xvY2spIHtcbiAgICAgICAgICAgICAgICBpZiAobXdpZCA9PSBudWxsIHx8IG13aWQgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNmZ013ID0gR2FtZWNmZy5kYWRpZ3V6aU1pbmd3ZW4uZ2V0SXRlbShtd2lkKTtcbiAgICAgICAgICAgICAgICBpZiAoY2ZnTXcgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgY2ZnTXcuZXBzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL+WbvumJtFxuICAgICAgICBjb25zdCB0amxpc3RLZXlzID0gT2JqZWN0LmtleXMoYWN0RGFkaUd1emkudGpsaXN0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0amxpc3RLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBfa2V5ID0gdGpsaXN0S2V5c1tpXTtcbiAgICAgICAgICAgIGxldCBjZmd0ak5ldyA9IEdhbWVjZmcuZGFkaWd1emlYZnRqLmdldEl0ZW0oX2tleSwgYWN0RGFkaUd1emkudGpsaXN0W19rZXldLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgaWYgKGNmZ3RqTmV3ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmd0ak5ldy5lcHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpflvJ/lrZDlhajlsYDlsZ7mgKcg5byf5a2Q5Yqg5oiQ5Y+q5pyJ56qB56C05bGe5oCn5ZKM5Zu+6Ym05Yqg5oiQXG4gICAgICovXG4gICAgZXBfZGl6aV9iYXNlKGFjdERpWmk6IFh5cy5BY3REaVppLCBhY3REaVppTGlzdDogeyBbZGl6aTogc3RyaW5nXTogWHlzLkFjdERpWmlfSW5mb30pOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBjb25zdCBkekxpc3RLZXlzID0gT2JqZWN0LmtleXMoYWN0RGlaaUxpc3QpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGR6TGlzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGR6aWQgPSBkekxpc3RLZXlzW2ldO1xuICAgICAgICAgICAgLy/orqHnrpflvJ/lrZDpmLbnuqflsZ7mgKdcbiAgICAgICAgICAgIGxldCBkaXppID0gYWN0RGlaaUxpc3RbZHppZF07XG4gICAgICAgICAgICAvLyBsZXQgbnVtID0gZGl6aS5sZXZlbCAlIDU7XG4gICAgICAgICAgICBjb25zdCBkaVppU3Rhcl9jID0gR2FtZWNmZy5odW9iYW5TdGFyLmdldEl0ZW0oZHppZCwgZGl6aS5zdGFyLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgaWYgKGRpWmlTdGFyX2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IE51bWJlcihkaVppU3Rhcl9jLnN0YXIpOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2ZnU3RlcCA9IEdhbWVjZmcuaHVvYmFuU3Rhci5nZXRJdGVtKGR6aWQsIGkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjZmdTdGVwICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGVwRXBzID0gY2ZnU3RlcC5hdHRyO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHN0ZXBFcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy/orqHnrpflvJ/lrZDlm77pibTlsZ7mgKdcbiAgICAgICAgY29uc3QgdHVqaWFuS2V5cyA9IE9iamVjdC5rZXlzKGFjdERpWmkudHVqaWFuKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0dWppYW5LZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0dWppYW5LZXkgPSB0dWppYW5LZXlzW2ldO1xuICAgICAgICAgICAgY29uc3QgZGl6aVR1Smlhbl9jID0gR2FtZWNmZy5odW9iYW5UdWppYW4uZ2V0SXRlbSh0dWppYW5LZXksIGFjdERpWmkudHVqaWFuW3R1amlhbktleV0udG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoZGl6aVR1Smlhbl9jID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBkaXppVHVKaWFuX2MuYXR0cik7XG4gICAgICAgIH1cblxuICAgICAgICAvL+earuiCpOWxnuaAp1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGR6TGlzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGR6aWQgPSBkekxpc3RLZXlzW2ldO1xuICAgICAgICAgICAgbGV0IGRpemkgPSBhY3REaVppTGlzdFtkemlkXTtcbiAgICAgICAgICAgIGlmKCFhY3REaVppTGlzdFtkemlkXS5za2lucyl7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhY3REaVppTGlzdFtkemlkXS5za2lucykge1xuICAgICAgICAgICAgICAgIGxldCBsZXZlbCA9IGFjdERpWmlMaXN0W2R6aWRdLnNraW5zW2tleV0ubGV2ZWw7XG4gICAgICAgICAgICAgICAgbGV0IHNraW5DZmcgPSBHYW1lY2ZnLmh1b2JhblNraW5sZXZlbC5nZXRJdGVtKGtleSwgbGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYoc2tpbkNmZyl7XG4gICAgICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBza2luQ2ZnLmxldmVsRXBzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuXG4gICAgZXBfc2hvdWxpbmdfc2hlbmd4aWFvKGFjdFNob3VMaW5nTGlzdDogeyBbZ3ppZDogc3RyaW5nXTogWHlzLkFjdFNob3VMaW5nX0xpc3RPbmUgfSkge1xuICAgICAgICBsZXQgc2hvdWxpbmdMaXN0OiB7IFtzbGlkOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBsZXQgZ3pMaXN0OiB7IFtzbGlkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgICAgICBjb25zdCBsaXN0S2V5cyA9IE9iamVjdC5rZXlzKGFjdFNob3VMaW5nTGlzdCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gbGlzdEtleXNbaV07XG4gICAgICAgICAgICBpZiAoYWN0U2hvdUxpbmdMaXN0W2luZGV4XSAhPSBudWxsICYmIGdhbWVNZXRob2QuaXNFbXB0eShhY3RTaG91TGluZ0xpc3RbaW5kZXhdLnNsaWQpID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xpZCA9IGFjdFNob3VMaW5nTGlzdFtpbmRleF0uc2xpZDtcbiAgICAgICAgICAgICAgICBjb25zdCBlcHMgPSB0aGlzLmVwX3Nob3VsaW5nX2dlemkoYWN0U2hvdUxpbmdMaXN0W2luZGV4XSk7XG4gICAgICAgICAgICAgICAgY29uc3QgemhhbmxpID0gZXBzW1wiaHBfbWF4X3BlclwiXTtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1poYW5saSA9IHNob3VsaW5nTGlzdFtzbGlkXTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdaaGFubGkgPT09IHVuZGVmaW5lZCB8fCB6aGFubGkgPiBleGlzdGluZ1poYW5saSkge1xuICAgICAgICAgICAgICAgICAgICBzaG91bGluZ0xpc3Rbc2xpZF0gPSB6aGFubGk7XG4gICAgICAgICAgICAgICAgICAgIGd6TGlzdFtzbGlkXSA9IGluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgZ3pJZGxpc3Q6IGFueVtdID0gW107XG4gICAgICAgIGxldCBnekxpc3RLZXlzID0gT2JqZWN0LmtleXMoZ3pMaXN0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnekxpc3RLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBneklkbGlzdC5wdXNoKGd6TGlzdFtnekxpc3RLZXlzW2ldXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGd6SWRsaXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+WFveeBteaAu+WxnuaAp+WKoOaIkFxuICAgICAqL1xuICAgIGVwX3Nob3VsaW5nKGFjdFNob3VMaW5nTGlzdDogeyBbZ3ppZDogc3RyaW5nXTogWHlzLkFjdFNob3VMaW5nX0xpc3RPbmUgfSwgYWN0U2hvdUxpbmc6IFh5cy5BY3RTaG91TGluZywgaml1eGlhbzogbnVtYmVyID0gMCk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIC8v6K6h566X5YW954G15bGe5oCn5oC75Yqg5oiQKOS4jeWMheWQq+aKgOiDvSlcbiAgICAgICAgbGV0IHNob3VsaW5nTGlzdDogeyBbc2xpZDogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgbGV0IGd6TGlzdDogeyBbc2xpZDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICAgICAgLy/pgY3ljoblh7rmnIDpq5jlsZ7mgKfnmoTlhb3ngbXnmoTmoLzlrZBpZFxuICAgICAgICBjb25zdCBsaXN0S2V5cyA9IE9iamVjdC5rZXlzKGFjdFNob3VMaW5nTGlzdCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gbGlzdEtleXNbaV07XG4gICAgICAgICAgICBpZiAoYWN0U2hvdUxpbmdMaXN0W2luZGV4XSAhPSBudWxsICYmIGdhbWVNZXRob2QuaXNFbXB0eShhY3RTaG91TGluZ0xpc3RbaW5kZXhdLnNsaWQpID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xpZCA9IGFjdFNob3VMaW5nTGlzdFtpbmRleF0uc2xpZDtcbiAgICAgICAgICAgICAgICBjb25zdCBlcHMgPSB0aGlzLmVwX3Nob3VsaW5nX2dlemkoYWN0U2hvdUxpbmdMaXN0W2luZGV4XSk7XG4gICAgICAgICAgICAgICAgY29uc3QgemhhbmxpID0gZXBzW1wiaHBfbWF4X3BlclwiXTtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1poYW5saSA9IHNob3VsaW5nTGlzdFtzbGlkXTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdaaGFubGkgPT09IHVuZGVmaW5lZCB8fCB6aGFubGkgPiBleGlzdGluZ1poYW5saSkge1xuICAgICAgICAgICAgICAgICAgICBzaG91bGluZ0xpc3Rbc2xpZF0gPSB6aGFubGk7XG4gICAgICAgICAgICAgICAgICAgIGd6TGlzdFtzbGlkXSA9IGluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBnekxpc3RLZXlzID0gT2JqZWN0LmtleXMoZ3pMaXN0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnekxpc3RLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBneiA9IGd6TGlzdEtleXNbaV07XG4gICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGd6TGlzdFtnel0pID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHRoaXMuZXBfc2hvdWxpbmdfZ2V6aShhY3RTaG91TGluZ0xpc3RbZ3pMaXN0W2d6XV0sIGppdXhpYW8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL+e+gee7iuWxnuaAp+WKoOaIkFxuICAgICAgICBsZXQgamliYW4gPSBhY3RTaG91TGluZy5qaWJhbjtcbiAgICAgICAgY29uc3QgamliYW5LZXlzID0gT2JqZWN0LmtleXMoYWN0U2hvdUxpbmcuamliYW4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGppYmFuS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgamJpZCA9IGppYmFuS2V5c1tpXTtcbiAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoamliYW5bamJpZF0ubGV2ZWwpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2ZnSmlCYW4gPSBHYW1lY2ZnLnNob3VsaW5nSmliYW4uZ2V0SXRlbShqYmlkLCBqaWJhbltqYmlkXS5sZXZlbC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChjZmdKaUJhbiA9PSBudWxsIHx8IGNmZ0ppQmFuLmVwcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgY2ZnSmlCYW4uZXBzKTtcbiAgICAgICAgfVxuICAgICAgICAvL+S4iumYteWFveeBteiiq+WKqOWxnuaAp+WKoOaIkFxuICAgICAgICBjb25zdCB1c2VHeklkS2V5cyA9IE9iamVjdC5rZXlzKGFjdFNob3VMaW5nLnVzZUd6SWQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVzZUd6SWRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB1c2VHeklkID0gdXNlR3pJZEtleXNbaV07XG4gICAgICAgICAgICBsZXQgc2tCZGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICAgICAgbGV0IGd6aWQgPSBhY3RTaG91TGluZy51c2VHeklkW3VzZUd6SWRdO1xuICAgICAgICAgICAgaWYgKGd6aWQgPT0gbnVsbCB8fCBnemlkID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzaG91bGluZyA9IGFjdFNob3VMaW5nTGlzdFtnemlkXTtcbiAgICAgICAgICAgIGlmIChzaG91bGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2ZnID0gR2FtZWNmZy5zaG91bGluZ0luZm8uZ2V0SXRlbShzaG91bGluZy5zbGlkKTtcbiAgICAgICAgICAgIGlmIChjZmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHBpbnpoaUNmZyA9IEdhbWVjZmcuc2hvdWxpbmdQaW56aGkuZ2V0SXRlbShjZmcucGluemhpKTtcbiAgICAgICAgICAgIGlmIChwaW56aGlDZmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy/kuLvnq5lcbiAgICAgICAgICAgIGlmICh1c2VHeklkID09IFwiMFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2tCZEtleXMgPSBPYmplY3Qua2V5cyhzaG91bGluZy5za0JkKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNrQmRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjYW9JZCA9IHNrQmRLZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2tpbGwgPSBzaG91bGluZy5za0JkW2Nhb0lkXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNmZ0VmZmVjdCA9IEdhbWVjZmcuc2hvdWxpbmdCZWlkb25nLmdldEl0ZW0oc2tpbGwuc2tpbGxJZC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmZmVjdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgICAgICAgICAgICAgIG5ld0Vwc1tjZmdFZmZlY3QudHlwZV0gPSBjZmdFZmZlY3QuZXNwW3NraWxsLmx2IC0gMV07XG4gICAgICAgICAgICAgICAgICAgIHNrQmRlcHMgPSB0aGlzLmVwX21lcmdlKHNrQmRlcHMsIG5ld0Vwcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBza0JkS2V5cyA9IE9iamVjdC5rZXlzKHNob3VsaW5nLnNrQmQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2tCZEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhb0lkID0gc2tCZEtleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBza2lsbCA9IHNob3VsaW5nLnNrQmRbY2FvSWRdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2ZnRWZmZWN0ID0gR2FtZWNmZy5zaG91bGluZ0JlaWRvbmcuZ2V0SXRlbShza2lsbC5za2lsbElkLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWZmZWN0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgbmV3RXBzW2NmZ0VmZmVjdC50eXBlXSA9IGNmZ0VmZmVjdC5lc3Bbc2tpbGwubHYgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJkRXBzID0gZ2FtZU1ldGhvZC5vYmpDb3B5KG5ld0Vwcyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiZEVwc0tleXMgPSBPYmplY3Qua2V5cyhiZEVwcyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmRFcHNLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gYmRFcHNLZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmRFcHNba2V5XSA9IE1hdGgucm91bmQoKGJkRXBzW2tleV0gKiBwaW56aGlDZmcuc2tPZGRzKSAvIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2tCZGVwcyA9IHRoaXMuZXBfbWVyZ2Uoc2tCZGVwcywgYmRFcHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBza0JkZXBzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y2V5Liq6YGT5Y+L55qE5bGe5oCnXG4gICAgICovXG4gICAgZXBfZGFveW91KGRhb3lvdTogWHlzLkFjdERhb3lvdSk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGZvciAobGV0IG9uZSBpbiBkYW95b3UuZGFveW91TWFwKSB7XG4gICAgICAgICAgICBsZXQgZHlpZCA9IGRhb3lvdS5kYW95b3VNYXBbb25lXS5kaWQ7XG4gICAgICAgICAgICBsZXQgbGV2ZWwgPSBkYW95b3UuZGFveW91TWFwW29uZV0uZmF2b3JMdjtcbiAgICAgICAgICAgIGxldCBza2tpbGxzID0gZGFveW91LmRhb3lvdU1hcFtvbmVdLnNraWxsO1xuICAgICAgICAgICAgLy/orqHnrpfnrYnnuqflsZ7mgKfliqDmiJBcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGxldmVsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY2ZnID0gR2FtZWNmZy5kYW95b3VGYXZvckx2LmdldEl0ZW0oZHlpZCwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAoY2ZnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIGNmZy5lcHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8v6K6h566X5oqA6IO95bGe5oCn5Yqg5oiQXG4gICAgICAgICAgICBmb3IgKGxldCBzayBvZiBza2tpbGxzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNmZ1NraWxsID0gR2FtZWNmZy5kYW95b3VTa2lsbEx2LmdldEl0ZW0oc2sudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGNmZ1NraWxsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNmZ1NraWxsVHlwZSA9IEdhbWVjZmcuZGFveW91U2tpbGxUeXBlLmdldEl0ZW0oY2ZnU2tpbGwuc2lkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ1NraWxsVHlwZSAhPSBudWxsICYmIGNmZ1NraWxsVHlwZS50eXBlID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhjZmdTa2lsbFR5cGUucGFyYW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IGNmZ1NraWxsLnZhbHVlW09iamVjdC5rZXlzKGNmZ1NraWxsVHlwZS5wYXJhbSkuaW5kZXhPZihrZXkpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmdTa2lsbFR5cGUucGFyYW1ba2V5XSA9IG51bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmdTa2lsbFR5cGUucGFyYW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOWNleS4quazleWuneeahOWxnuaAp1xuICAgICAqL1xuICAgIGVwX2ZhYmFvKGFjdEZhQmFvOiBYeXMuQWN0RmFCYW8pOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGZhYmFvIG9mIE9iamVjdC52YWx1ZXMoYWN0RmFCYW8uZmFiYW9MaXN0KSkge1xuICAgICAgICAgICAgLy8g5Z+656GA5bGe5oCnXG4gICAgICAgICAgICBsZXQgY2ZnRmJJbmZvID0gR2FtZWNmZy5mYWJhb0luZm8uZ2V0SXRlbShmYWJhby5mYklkKTtcbiAgICAgICAgICAgIGlmIChjZmdGYkluZm8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmdGYkluZm8uYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDljYfnuqflsZ7mgKdcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2ZnIG9mIE9iamVjdC52YWx1ZXMoR2FtZWNmZy5mYWJhb1VwbGV2ZWwucG9vbCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2ZnLmlkLnRvU3RyaW5nKCkgPT09IGZhYmFvLmZiSWQgJiYgY2ZnLmxldmVsIDw9IGZhYmFvLmxldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmcuYXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5Y2H5pif5bGe5oCnXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNmZyBvZiBPYmplY3QudmFsdWVzKEdhbWVjZmcuZmFiYW9VcHN0YXIucG9vbCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2ZnLmlkLnRvU3RyaW5nKCkgPT09IGZhYmFvLmZiSWQgJiYgY2ZnLmxldmVsIDw9IGZhYmFvLnN0YXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIGNmZy5hdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDms5Xlrp3nvoHnu4rnmoTlsZ7mgKdcbiAgICAgKi9cbiAgICBlcF9mYWJhb0ppYmFuKGFjdEZhQmFvOiBYeXMuQWN0RmFCYW8pOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwcyA9IHt9O1xuICAgICAgICBjb25zdCBqaWJhbkxpc3RLZXlzID0gT2JqZWN0LmtleXMoYWN0RmFCYW8uamliYW5MaXN0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBqaWJhbkxpc3RLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBqYklkID0gamliYW5MaXN0S2V5c1tpXTtcbiAgICAgICAgICAgIC8vIOe+gee7iuWxnuaAp1xuICAgICAgICAgICAgbGV0IGNmZ0piSW5mbyA9IEdhbWVjZmcuZmFiYW9KaWJhbi5nZXRJdGVtKGpiSWQsIGFjdEZhQmFvLmppYmFuTGlzdC5zdGFyLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgaWYgKGNmZ0piSW5mbyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmdKYkluZm8uYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlvZPliY3looPnlYznmoTlsZ7mgKdcbiAgICAgKi9cbiAgICBlcF9qaW5namllKGFjdEppbmdKaWU6IFh5cy5BY3RKaW5nSmllLCBqaW5namllSWQ6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5cbiAgICAgICAgLy/nqoHnoLTlkI7ojrflvpflsZ7mgKdcbiAgICAgICAgbGV0IHBvb2wgPSBHYW1lY2ZnLmppbmdqaWVTdGVwLnBvb2xcbiAgICAgICAgbGV0IG1heEx2Om51bWJlciA9IDBcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcG9vbCkge1xuICAgICAgICAgICAgLy/looPnlYzlsZ7mgKco55uu5qCH5Z6LKVxuICAgICAgICAgICAgaWYoTnVtYmVyKGppbmdqaWVJZCkgPT0gTnVtYmVyKHBvb2xba2V5XS5pZCkpe1xuICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBwb29sW2tleV0udHBfZXBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhZGRDb3VudCA9IDBcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBtYXhMdisxOyBpIDw9IHBvb2xba2V5XS5tYXhsdjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYoaSA+IGFjdEppbmdKaWUubGV2ZWwpe1xuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY2ZnID0gR2FtZWNmZy5qaW5namllTGV2ZWwuZ2V0SXRlbShpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGlmIChjZmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy/nrYnnuqfojrflvpflsZ7mgKco55uu5qCH5Z6LKVxuICAgICAgICAgICAgICAgIGlmKGkgPT0gYWN0SmluZ0ppZS5sZXZlbCl7XG4gICAgICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmcuZXBzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYoaSA9PSBhY3RKaW5nSmllLmxldmVsKXtcbiAgICAgICAgICAgICAgICAgICAgYWRkQ291bnQgKz0gTWF0aC5yb3VuZChhY3RKaW5nSmllLmV4cCAvY2ZnLmV4cFsyXSk7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIGFkZENvdW50ICs9IE1hdGgucm91bmQoY2ZnLm5lZWRFeHAgL2NmZy5leHBbMl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8v5Zug5Li65bGe5oCn5pivM+asoeS4gOS4quW+queOr1xuICAgICAgICAgICAgLy8g6K6h566X5q+P5LiqIGVwcyDnmoTmiafooYzmrKHmlbBcbiAgICAgICAgICAgIGNvbnN0IGVwczFDb3VudCA9IE1hdGguZmxvb3IoKGFkZENvdW50ICsgMikgLyAzKTsgLy8gZXBzMSDlupTnlKjnmoTmrKHmlbBcbiAgICAgICAgICAgIGNvbnN0IGVwczJDb3VudCA9IE1hdGguZmxvb3IoKGFkZENvdW50ICsgMSkgLyAzKTsgLy8gZXBzMiDlupTnlKjnmoTmrKHmlbBcbiAgICAgICAgICAgIGNvbnN0IGVwczNDb3VudCA9IE1hdGguZmxvb3IoYWRkQ291bnQgLyAzKTsgLy8gZXBzMyDlupTnlKjnmoTmrKHmlbBcblxuICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHRoaXMuZXBfS3ZSYXRlKHBvb2xba2V5XS5lcHMxLGVwczFDb3VudCkpOyBcbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCB0aGlzLmVwX0t2UmF0ZShwb29sW2tleV0uZXBzMixlcHMyQ291bnQpKTsgXG4gICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgdGhpcy5lcF9LdlJhdGUocG9vbFtrZXldLmVwczMsZXBzM0NvdW50KSk7IFxuXG4gICAgICAgICAgICBtYXhMdiA9IHBvb2xba2V5XS5tYXhsdlxuICAgICAgICAgICAgaWYobWF4THYgPj0gYWN0SmluZ0ppZS5sZXZlbCl7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS4luWutuenmOacr1xuICAgICAqXG4gICAgICovXG4gICAgZXBfY2x1Yk1pU2h1KGFjdENsdWJNaVNodTogWHlzLkFjdENsdWJNaVNodSk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIC8vIOS4luWutueti+mqqFxuICAgICAgICBjb25zdCBqaW5HdUtleXMgPSBPYmplY3Qua2V5cyhhY3RDbHViTWlTaHUuamluR3UpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGppbkd1S2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGppbkd1S2V5c1tpXTtcbiAgICAgICAgICAgIGxldCBsdiA9IGFjdENsdWJNaVNodS5qaW5HdVt0eXBlXTtcbiAgICAgICAgICAgIGxldCBjZmcgPSBHYW1lY2ZnLmNsdWJNaVNodUppbkd1LmdldEl0ZW0odHlwZSwgbHYudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoY2ZnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgY2ZnLmVwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g5LiW5a6256eY5pyv562L6aqo562L6aqo5YWo562J57qn6L6+5YiwICzpop3lpJbliqDmiJDlsZ7mgKdcbiAgICAgICAgbGV0IG1pbkx2S2V5ID0gT2JqZWN0LmtleXMoYWN0Q2x1Yk1pU2h1Lmppbkd1KS5yZWR1Y2UoKHByZSwgY3VyKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0Q2x1Yk1pU2h1Lmppbkd1W2N1cl0gPCBhY3RDbHViTWlTaHUuamluR3VbcHJlXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJlO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IG1pbkx2MSA9IGFjdENsdWJNaVNodS5qaW5HdVttaW5MdktleV07XG4gICAgICAgIC8vIDAsMTAsMjAsMzAuLi5cbiAgICAgICAgbGV0IEppbkd1SmMgPSBHYW1lY2ZnLmNsdWJNaVNodUppbkd1SmMuZ2V0SXRlbSgoTWF0aC5mbG9vcihtaW5MdjEgLyAxMCkgKiAxMCkudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChKaW5HdUpjICE9IG51bGwpIHtcbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBKaW5HdUpjLmVwcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDkuJblrrbnu4/nu5xcbiAgICAgICAgbGV0IGpsTGlzdCA9IGFjdENsdWJNaVNodS5qbGxpc3Q7XG4gICAgICAgIGZvciAobGV0IGpsaWQgaW4gamxMaXN0KSB7XG4gICAgICAgICAgICBsZXQgY2ZnSmwgPSBHYW1lY2ZnLmNsdWJNaVNodUppbmdsdW8uZ2V0SXRlbShqbGlkLCBqbExpc3RbamxpZF0ubGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoY2ZnSmwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmdKbC5hZGRFcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNmZ0psUSA9IEdhbWVjZmcuY2x1Yk1pU2h1SmxxdWFsaXR5LmdldEl0ZW0oYWN0Q2x1Yk1pU2h1LmN1ckpsUXVhbGl0eS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKGNmZ0psUSAhPSBudWxsKSB7XG4gICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgY2ZnSmxRLnF1YWxpdHlFcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDkuJblrrblnKPlhbVcbiAgICAgKlxuICAgICAqL1xuICAgIGVwX2NsdWJTaGVuZ0IoYWN0Q2x1YlNoZW5nQjogWHlzLkFjdENsdWJTaGVuZ0IpOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICAvLyDojrflj5blvZPliY3mlrnmoYjnmoTmiYDmnInkvY3nva7nmoTor43mnaFcbiAgICAgICAgZm9yIChsZXQgcG9zSWQgaW4gYWN0Q2x1YlNoZW5nQi5wbGFuW2FjdENsdWJTaGVuZ0IuY3VyUGxhbl0pIHtcbiAgICAgICAgICAgIC8vIOiOt+WPluivjeadoemFjee9rlxuICAgICAgICAgICAgbGV0IGNmZyA9IEdhbWVjZmcuY2x1YlNoZW5nQldvcmQuZ2V0SXRlbShhY3RDbHViU2hlbmdCLnBsYW5bYWN0Q2x1YlNoZW5nQi5jdXJQbGFuXVtwb3NJZF0uaWQpO1xuICAgICAgICAgICAgaWYgKGNmZyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8g566X5LiA5LiL56ys5LiA5Liq5bGe5oCn55qE5YC8XG4gICAgICAgICAgICAgICAgbGV0IG4gPSBjZmcuYXR0cltPYmplY3Qua2V5cyhjZmcuYXR0cilbMF1dICsgYWN0Q2x1YlNoZW5nQi5wbGFuW2FjdENsdWJTaGVuZ0IuY3VyUGxhbl1bcG9zSWRdLnJhbmdlO1xuICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCB7IFtPYmplY3Qua2V5cyhjZmcuYXR0cilbMF1dOiBuIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAgLyoqXG4gICAgICog5a6X6ZeoLemXqOW+klxuICAgICAqXG4gICAgICovXG4gICAgIGVwc196b25nTWVuX21lbnR1KG1lbnR1OiBYeXMubWVudHUsIGppdXhpYW86IG51bWJlciA9IDApe1xuICAgICAgICBsZXQgbWVudHVfZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGlmKCFtZW50dS5iYXNpY0F0dHIpe1xuICAgICAgICAgICAgcmV0dXJuIG1lbnR1X2Vwc1xuICAgICAgICB9XG4gICAgICAgIG1lbnR1X2VwcyA9IG1lbnR1LmJhc2ljQXR0clxuICAgICAgICBsZXQgX21lbnR1ID0gbWVudHUubWFycmllZD8uW09iamVjdC5rZXlzKG1lbnR1Lm1hcnJpZWQpWzBdXT8ubWVudHVJbmZvO1xuICAgICAgICBpZiAoX21lbnR1ICYmIF9tZW50dS5iYXNpY0F0dHIpIHtcbiAgICAgICAgICAgIC8vIF9tZW50dS5iYXNpY0F0dHLnmoTlgLzmnIDlpJrkuI3otoXov4dtZW50dS5iYXNpY0F0dHLnmoQzMDAlXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBfbWVudHUuYmFzaWNBdHRyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lbnR1LmJhc2ljQXR0cltrZXldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVudHUuYmFzaWNBdHRyW2tleV0gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoX21lbnR1LmJhc2ljQXR0cltrZXldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgX21lbnR1LmJhc2ljQXR0cltrZXldID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG5DZmcgPSBHYW1lY2ZnLm1hdGhJbmZvLmdldEl0ZW0oXCJ6b25nTWVuX2FkZF9iYXNpY0F0dHJfbGltaXRcIik7XG4gICAgICAgICAgICAgICAgaWYgKG5DZmcgIT0gbnVsbCAmJiBuQ2ZnLnByYW0gIT0gbnVsbCAmJiBuQ2ZnLnByYW0uY291bnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBfbWVudHUuYmFzaWNBdHRyW2tleV0gPSBNYXRoLm1pbiggTWF0aC5mbG9vcihtZW50dS5iYXNpY0F0dHJba2V5XSAqIG5DZmcucHJhbS5jb3VudCksIF9tZW50dS5iYXNpY0F0dHJba2V5XSApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1lbnR1X2VwcyA9IHRoaXMuZXBfbWVyZ2UobWVudHVfZXBzLCBfbWVudHUuYmFzaWNBdHRyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5lcF9LdlJhdGUobWVudHVfZXBzLCAxICsgaml1eGlhbyk7XG4gICAgIH1cbiAgICAgICAgXG4gICAgLyoqXG4gICAgICog5a6X6ZeoXG4gICAgICpcbiAgICAgKi9cbiAgICBlcF96b25nTWVuKFxuICAgICAgICBfYWN0Wm9uZ01lbk1lbnR1THMxOiB7IFtpZDogc3RyaW5nXTogWHlzLm1lbnR1IH0sXG4gICAgICAgIF9hY3Rab25nTWVuTWVudHVMczI6IHsgW2lkOiBzdHJpbmddOiBYeXMubWVudHUgfSxcbiAgICAgICAgX2FjdFpvbmdNZW46IFh5cy5BY3Rab25nTWVuLHNob3dCYXNpY0F0dHI6Ym9vbGVhbiA9IHRydWUsXG4gICAgICAgIGppdXhpYW86IG51bWJlciA9IDBcbiAgICApOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgLy8g6K6w5b2V5Z+656GAXG4gICAgICAgIGxldCBlcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcblxuICAgICAgICAvLyDorrDlvZXlp5Tku7vnmoTnibnmrorlsZ7mgKdcbiAgICAgICAgbGV0IHNwZUVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuXG4gICAgICAgIC8vIOaLt+i0neS4gOS7veaVsOaNrlxuICAgICAgICBsZXQgYWN0Wm9uZ01lbk1lbnR1THMxID0gZ2FtZU1ldGhvZC5vYmpDb3B5KF9hY3Rab25nTWVuTWVudHVMczEpO1xuICAgICAgICBsZXQgYWN0Wm9uZ01lbk1lbnR1THMyID0gZ2FtZU1ldGhvZC5vYmpDb3B5KF9hY3Rab25nTWVuTWVudHVMczIpO1xuICAgICAgICBsZXQgYWN0Wm9uZ01lbiA9IGdhbWVNZXRob2Qub2JqQ29weShfYWN0Wm9uZ01lbik7XG4gICAgICAgIC8vIOiOt+WPluWul+mXqOetiee6p+mFjee9rlxuICAgICAgICBsZXQgem1fY2ZnID0gR2FtZWNmZy56b25nTWVuSW5mby5nZXRJdGVtKGFjdFpvbmdNZW4ubGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmICh6bV9jZmcgPT0gbnVsbCkgcmV0dXJuIGVwcztcblxuICAgICAgICAvLyDlp5Tku7vliqDlsZ7mgKdcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBhY3Rab25nTWVuLmFwcG9pbnRQb3MpIHtcbiAgICAgICAgICAgIGxldCBtZW50dUlkID0gYWN0Wm9uZ01lbi5hcHBvaW50UG9zW2lkXS5tZW50dUlkO1xuICAgICAgICAgICAgLy8g6I635Y+W5pyq57uT5aW955qE6Zeo5b6S5L+h5oGvXG4gICAgICAgICAgICBsZXQgbWVudHUgPSBhY3Rab25nTWVuLm1lbnR1W21lbnR1SWRdIHx8IGFjdFpvbmdNZW5NZW50dUxzMVttZW50dUlkXTtcbiAgICAgICAgICAgIC8vIOWmguaenOiOt+WPluS4jeWIsOmXqOW+kuS/oeaBr++8jOivtOaYjuaYr+W3sue7j+e7k+WlveeahOmXqOW+ku+8jOS7juW3sue7k+WlveeahOmXqOW+kuWIl+ihqOS4reiOt+WPllxuICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS3lt7Lnu4/nu5Plpb3nmoTpl6jlvpJTdGFydC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAgICBpZiAobWVudHUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIOe7k+WlveeahOmXqOW+kuacieS4pOS4qumXqOW+ku+8jOmcgOimgeWIhuWIq+iuoeeulyDkuIDkuKrmmK/oh6rlt7HvvIzkuIDkuKrmmK/phY3lgbZcbiAgICAgICAgICAgICAgICAvLyAxLiDnibnmrorlsZ7mgKdcbiAgICAgICAgICAgICAgICAvL+iHquW3sVxuICAgICAgICAgICAgICAgIG1lbnR1ID0gYWN0Wm9uZ01lbk1lbnR1THMyW21lbnR1SWRdO1xuICAgICAgICAgICAgICAgIGlmIChtZW50dSA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgc3BlQXR0cjEgPSBtZW50dS5zcGVBdHRyIHx8IFtdO1xuICAgICAgICAgICAgICAgIC8vIOmFjeWBtlxuXG4gICAgICAgICAgICAgICAgbGV0IF9tZW50dSA9IG1lbnR1Lm1hcnJpZWQ/LltPYmplY3Qua2V5cyhtZW50dS5tYXJyaWVkKVswXV0/Lm1lbnR1SW5mbztcbiAgICAgICAgICAgICAgICBsZXQgc3BlQXR0cjIgPSBfbWVudHU/LnNwZUF0dHIgfHwgW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHJJZCBvZiBzcGVBdHRyMS5jb25jYXQoc3BlQXR0cjIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjZmcgPSBHYW1lY2ZnLnpvbmdNZW5TcGVBdHRyLmdldEl0ZW0oYXR0cklkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNmZyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgW2F0dHJLZXksIGF0dHJWYWx1ZV0gPSBPYmplY3QuZW50cmllcyhjZmcuYXR0cilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXBzT2JqID0geyBbYXR0cktleV06IGF0dHJWYWx1ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZUVwcyA9IHRoaXMuZXBfbWVyZ2Uoc3BlRXBzLCBFcHNPYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gMi4g5Ye65biI5bGe5oCnXG5cbiAgICAgICAgICAgICAgICBsZXQgZ3JhZHVhdGVBdHRyMSA9IG1lbnR1LmdyYWR1YXRlQXR0ciB8fCB7fTtcbiAgICAgICAgICAgICAgICBsZXQgZ3JhZHVhdGVBdHRyMiA9IF9tZW50dT8uZ3JhZHVhdGVBdHRyIHx8IHt9O1xuXG4gICAgICAgICAgICAgICAgLy8g5YWI56Gu5a6a5YC8LWdyYWR1YXRlQXR0cjLkuI3otoXov4dncmFkdWF0ZUF0dHIx55qEeOWAjVxuICAgICAgICAgICAgICAgIGxldCBuQ2ZnID0gR2FtZWNmZy5tYXRoSW5mby5nZXRJdGVtKFwiem9uZ01lbl9hZGRfZ3JhZHVhdGVBdHRyX2xpbWl0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChuQ2ZnICE9IG51bGwgJiYgbkNmZy5wcmFtICE9IG51bGwgJiYgbkNmZy5wcmFtLmNvdW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZ3JhZHVhdGVBdHRyMVtPYmplY3Qua2V5cyhncmFkdWF0ZUF0dHIxKVswXV1cbiAgICAgICAgICAgICAgICAgICAgZ3JhZHVhdGVBdHRyMltPYmplY3Qua2V5cyhncmFkdWF0ZUF0dHIyKVswXV0gPSBNYXRoLm1pbih2YWx1ZSAqIG5DZmcucHJhbS5jb3VudCwgZ3JhZHVhdGVBdHRyMltPYmplY3Qua2V5cyhncmFkdWF0ZUF0dHIyKVswXV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIOagueaNruWnlOS7u+eahOS9jee9rmlk6I635Y+W5Yqg5oiQ6YWN572uXG4gICAgICAgICAgICAgICAgbGV0IGNmZyA9IEdhbWVjZmcuem9uZ01lbkFwcG9pbnRQb3MuZ2V0SXRlbShpZCk7XG4gICAgICAgICAgICAgICAgaWYgKGNmZyA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBncmFkdWF0ZUF0dHIxKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyYWR1YXRlQXR0cjFba2V5XSA9IE1hdGguZmxvb3IoZ3JhZHVhdGVBdHRyMVtrZXldICogKDEgKyBjZmcuYWRkIC8gMTAwKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3BlRXBzID0gdGhpcy5lcF9tZXJnZShzcGVFcHMsIGdyYWR1YXRlQXR0cjEpO1xuXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBncmFkdWF0ZUF0dHIyKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyYWR1YXRlQXR0cjJba2V5XSA9IE1hdGguZmxvb3IoZ3JhZHVhdGVBdHRyMltrZXldICogKDEgKyBjZmcuYWRkIC8gMTAwKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3BlRXBzID0gdGhpcy5lcF9tZXJnZShzcGVFcHMsIGdyYWR1YXRlQXR0cjIpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t5bey57uP57uT5aW955qE6Zeo5b6SRW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS3mnKrnu5Plpb3nmoTpl6jlvpJTdGFydC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyDnibnmrorlsZ7mgKdcbiAgICAgICAgICAgICAgICBsZXQgc3BlQXR0ciA9IG1lbnR1LnNwZUF0dHIgfHwgW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdHRySWQgb2Ygc3BlQXR0cikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2ZnID0gR2FtZWNmZy56b25nTWVuU3BlQXR0ci5nZXRJdGVtKGF0dHJJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjZmcgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IFthdHRyS2V5LCBhdHRyVmFsdWVdID0gT2JqZWN0LmVudHJpZXMoY2ZnLmF0dHIpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXBzT2JqID0geyBbYXR0cktleV06IGF0dHJWYWx1ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3BlRXBzID0gdGhpcy5lcF9tZXJnZShzcGVFcHMsIEVwc09iaik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGdyYWR1YXRlQXR0ciA9IG1lbnR1LmdyYWR1YXRlQXR0ciB8fCB7fTtcbiAgICAgICAgICAgICAgICAvLyDmoLnmja5pZOiOt+WPlumFjee9rlxuICAgICAgICAgICAgICAgIGxldCBjZmcgPSBHYW1lY2ZnLnpvbmdNZW5BcHBvaW50UG9zLmdldEl0ZW0oaWQpO1xuICAgICAgICAgICAgICAgIGlmIChjZmcgPT0gbnVsbCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZ3JhZHVhdGVBdHRyKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyYWR1YXRlQXR0cltrZXldID0gTWF0aC5mbG9vcihncmFkdWF0ZUF0dHJba2V5XSAqICgxICsgY2ZnLmFkZCAvIDEwMCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNwZUVwcyA9IHRoaXMuZXBfbWVyZ2Uoc3BlRXBzLCBncmFkdWF0ZUF0dHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS3mnKrnu5Plpb3nmoTpl6jlvpJFbmQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g5q+P5Liq6Zeo5b6S55qE5Z+656GA5bGe5oCn5YWo6YOo5Yqg6LW35p2l57uZ5Li76KeSXG4gICAgICAgIGlmKHNob3dCYXNpY0F0dHIpe1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBhY3Rab25nTWVuLm1lbnR1KSB7XG4gICAgICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHRoaXMuZXBzX3pvbmdNZW5fbWVudHUoYWN0Wm9uZ01lbi5tZW50dVtpZF0sIGppdXhpYW8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gYWN0Wm9uZ01lbk1lbnR1THMxKSB7XG4gICAgICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHRoaXMuZXBzX3pvbmdNZW5fbWVudHUoYWN0Wm9uZ01lbk1lbnR1THMxW2lkXSwgaml1eGlhbykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGFjdFpvbmdNZW5NZW50dUxzMikge1xuICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCB0aGlzLmVwc196b25nTWVuX21lbnR1KGFjdFpvbmdNZW5NZW50dUxzMltpZF0sIGppdXhpYW8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8g5q+P5LiA5p2h5aeU5Lu755qE54m55q6K5bGe5oCn6YO95LiN6IO96LaF6L+H6YWN572u55qE5pyA5aSn5YC8IHptX2NmZy5tYXhTcGVBdHRyQWRkXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNwZUVwcykge1xuICAgICAgICAgICAgc3BlRXBzW2tleV0gPSBNYXRoLm1pbihzcGVFcHNba2V5XSwgem1fY2ZnLm1heFNwZUF0dHJBZGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHNwZUVwcyk7XG5cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpgZPnurlcbiAgICAgKiDplbbltYzpgZPnurnnmoTln7rnoYDlsZ7mgKcgKyDor43mnaHlsZ7mgKcgKyDop6PlsIHnrYnnuqfnmoTlsZ7mgKcgKyDlpZfoo4VidWZmXG4gICAgICovXG4gICAgZXBfZGFvd2VuKGFjdERhb1dlbjogWHlzLkFjdERhb1dlbiwgYWN0RGRhb1dlbkxpc3Q6IHsgW2lpZDogc3RyaW5nXTogWHlzLkRhb1dlbl9TdG9uZSB9KTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBlcHNfemh1OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0gdGhpcy5lcF9kYW93ZW5femh1KGFjdERhb1dlbiwgYWN0RGRhb1dlbkxpc3QpOyAvL+S4u+WxnuaAp1xuICAgICAgICBsZXQgZXBzX290aGVyOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0gdGhpcy5lcF9kYW93ZW5fb3RoZXIoYWN0RGFvV2VuLCBhY3REZGFvV2VuTGlzdCk7OyAvL+WJr+WxnuaAp1xuICAgICAgICByZXR1cm4gdGhpcy5lcF9tZXJnZShlcHNfemh1LCBlcHNfb3RoZXIpO1xuICAgIH1cblxuICAgIFxuICAgIC8qKlxuICAgICAqIOmBk+e6uVxuICAgICAqIOmVtuW1jOmBk+e6ueeahOS4u+WxnuaAp1xuICAgICAqL1xuICAgIGVwX2Rhb3dlbl96aHUoYWN0RGFvV2VuOiBYeXMuQWN0RGFvV2VuLCBhY3REZGFvV2VuTGlzdDogeyBbaWlkOiBzdHJpbmddOiBYeXMuRGFvV2VuX1N0b25lIH0pOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwc196aHU6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTsgLy/kuLvlsZ7mgKdcbiAgICAgICAgXG4gICAgICAgIGxldCByZWFsX2RjID0gYWN0RGFvV2VuLmRjIHx8IFwiMVwiO1xuICAgICAgICBpZiAoYWN0RGFvV2VuLmRjc1tyZWFsX2RjXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzbG90S2V5cyA9IE9iamVjdC5rZXlzKGFjdERhb1dlbi5kY3NbcmVhbF9kY10uc2xvdCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsb3RLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xvdCA9IHNsb3RLZXlzW2ldO1xuICAgICAgICAgICAgICAgIGxldCBpaWQgPSBhY3REYW9XZW4uZGNzW3JlYWxfZGNdLnNsb3Rbc2xvdF07XG4gICAgICAgICAgICAgICAgbGV0IHN0b25lID0gYWN0RGRhb1dlbkxpc3RbaWlkLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgICAgIGlmIChzdG9uZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VfZXBzX2MgPSBHYW1lY2ZnLmRhb3dlblpodXNodXhpbmcuZ2V0SXRlbShzdG9uZS5iYXNlRXBzLnN4aWQsIHN0b25lLmJhc2VFcHMubGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGJhc2VfZXBzX2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBlcHNfemh1ID0gdGhpcy5lcF9tZXJnZShlcHNfemh1LCBiYXNlX2Vwc19jLmVwcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcHNfemh1O1xuICAgIH1cblxuICAgIFxuICAgIC8qKlxuICAgICAqIOmBk+e6uVxuICAgICAqIOmVtuW1jOmBk+e6ueeahOWFtuS7luWxnuaAp1xuICAgICAqL1xuICAgIGVwX2Rhb3dlbl9vdGhlcihhY3REYW9XZW46IFh5cy5BY3REYW9XZW4sIGFjdERkYW9XZW5MaXN0OiB7IFtpaWQ6IHN0cmluZ106IFh5cy5EYW9XZW5fU3RvbmUgfSk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzX2Z1OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307IC8v5Ymv5bGe5oCnXG4gICAgICAgIGxldCBlcHNfbGV2ZWw6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTsgLy/op6PlsIHnrYnnuqflsZ7mgKdcblxuICAgICAgICBsZXQgcmVhbF9kYyA9IGFjdERhb1dlbi5kYyB8fCBcIjFcIjtcbiAgICAgICAgaWYgKGFjdERhb1dlbi5kY3NbcmVhbF9kY10gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc2xvdEtleXMgPSBPYmplY3Qua2V5cyhhY3REYW9XZW4uZGNzW3JlYWxfZGNdLnNsb3QpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbG90S2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNsb3QgPSBzbG90S2V5c1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgaWlkID0gYWN0RGFvV2VuLmRjc1tyZWFsX2RjXS5zbG90W3Nsb3RdO1xuICAgICAgICAgICAgICAgIGxldCBzdG9uZSA9IGFjdERkYW9XZW5MaXN0W2lpZC50b1N0cmluZygpXTtcbiAgICAgICAgICAgICAgICBpZiAoc3RvbmUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL+ivjeadoeWxnuaAp1xuICAgICAgICAgICAgICAgIGNvbnN0IGZ1RXBzS2V5cyA9IE9iamVjdC5rZXlzKHN0b25lLmZ1RXBzKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZ1RXBzS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcHNfaWQgPSBmdUVwc0tleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN0X2luZm9fYyA9IEdhbWVjZmcuZGFvd2VuRnVzaHV4aW5nLmdldEl0ZW0oXG4gICAgICAgICAgICAgICAgICAgICAgICBlcHNfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9uZS5mdUVwc1tlcHNfaWRdLnBpbnpoaS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvbmUuZnVFcHNbZXBzX2lkXS5sZXZlbC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdF9pbmZvX2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXBzX2Z1ID0gdGhpcy5lcF9tZXJnZShlcHNfZnUsIGN0X2luZm9fYy5lcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy/op6PlsIHnrYnnuqfnmoTlsZ7mgKdcbiAgICAgICAgbGV0IGxldmVsID0gYWN0RGFvV2VuLnVubG9ja0xldmVsO1xuICAgICAgICBjb25zdCB1bmxvY2tfbGV2ZWxfYyA9IEdhbWVjZmcuZGFvd2VuVW5sb2NrX2xldmVsLmdldEl0ZW0obGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmICh1bmxvY2tfbGV2ZWxfYyAhPSBudWxsKSB7XG4gICAgICAgICAgICBlcHNfbGV2ZWwgPSB0aGlzLmVwX21lcmdlKGVwc19sZXZlbCwgdW5sb2NrX2xldmVsX2MuZXBzKTsgLy/plbbltYzmlYjmnpxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVwX21lcmdlKGVwc19mdSwgZXBzX2xldmVsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpflhb3ngbXljZXkuKrmoLzlrZDlsZ7mgKfliqDmiJBcbiAgICAgKi9cbiAgICBlcF9zaG91bGluZ19nZXppKGFjdFNob3VMaW5nT25lOiBYeXMuQWN0U2hvdUxpbmdfTGlzdE9uZSwgaml1eGlhbzogbnVtYmVyID0gMCk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGlmIChhY3RTaG91TGluZ09uZSA9PSBudWxsIHx8IGFjdFNob3VMaW5nT25lLnNsaWQgPT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIGVwcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2xpZCA9IGFjdFNob3VMaW5nT25lLnNsaWQ7XG4gICAgICAgIGxldCBjZmdJbmZvID0gR2FtZWNmZy5zaG91bGluZ0luZm8uZ2V0SXRlbShzbGlkKTtcbiAgICAgICAgaWYgKGNmZ0luZm8gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGVwcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2ZnUGluemhpID0gR2FtZWNmZy5zaG91bGluZ1BpbnpoaS5nZXRJdGVtKGNmZ0luZm8ucGluemhpKTtcblxuICAgICAgICBpZiAoY2ZnUGluemhpID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBlcHM7XG4gICAgICAgIH1cbiAgICAgICAgLy/lhb3ngbXln7rnoYDlsZ7mgKdcbiAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIGNmZ1BpbnpoaS5lcHMpO1xuXG4gICAgICAgIC8v5Lmd6ZyE5aSp5p6i5a+55YW954G15Z+65pys5bGe5oCn5Yqg5oiQXG4gICAgICAgIGlmKGppdXhpYW8gPiAwKXtcbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfS3ZSYXRlKGVwcywgMSArIGppdXhpYW8pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy/ljYfnuqflsZ7mgKfliqDmiJBcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBhY3RTaG91TGluZ09uZS5sZXZlbDtcbiAgICAgICAgbGV0IGxldmVsRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGxldmVsOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsdiA9IEdhbWVjZmcuc2hvdWxpbmdMZXZlbC5nZXRJdGVtKGNmZ1BpbnpoaS5pZCwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChsdiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXZlbEVwcyA9IHRoaXMuZXBfbWVyZ2UobGV2ZWxFcHMsIGx2LmxldmVsRXBzKTtcbiAgICAgICAgfVxuICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgbGV2ZWxFcHMpO1xuICAgICAgICAvL+iuoeeul+WNh+aYn+WxnuaAp+WKoOaIkFxuICAgICAgICBjb25zdCBzdGFyID0gYWN0U2hvdUxpbmdPbmUuc3RhcjtcbiAgICAgICAgbGV0IHN0YXJFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSBzdGFyOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgICAgICAgICBsZXQgc3Rhcl9jID0gR2FtZWNmZy5zaG91bGluZ1N0YXIuZ2V0SXRlbShjZmdQaW56aGkuaWQsIGluZGV4LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgaWYgKHN0YXJfYyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFyRXBzID0gdGhpcy5lcF9tZXJnZShzdGFyRXBzLCBzdGFyX2Muc3RhckVwcyk7XG4gICAgICAgIH1cbiAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHN0YXJFcHMpO1xuXG4gICAgICAgIC8v6K6h566X6KeJ6YaS5bGe5oCn5Yqg5oiQXG4gICAgICAgIGxldCBzdGVwRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGNvbnN0IHN0ZXAgPSBhY3RTaG91TGluZ09uZS5zdGVwO1xuICAgICAgICBsZXQganVlWGluZ0NmZyA9IEdhbWVjZmcuc2hvdWxpbmdKdWV4aW5nLmdldEl0ZW0oc3RlcC50b1N0cmluZygpKTtcbiAgICAgICAgaWYoanVlWGluZ0NmZyl7XG4gICAgICAgICAgICBzdGVwRXBzID0gdGhpcy5lcF9tZXJnZShzdGVwRXBzLCBqdWVYaW5nQ2ZnLmVwcyk7XG4gICAgICAgIH1cbiAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHN0ZXBFcHMpO1xuXG4gICAgICAgIC8v55qu6IKk5bGe5oCnXG4gICAgICAgIGxldCBza2luRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGlmIChhY3RTaG91TGluZ09uZS5za2lucyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZXBzO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IHNraW5JZCBpbiBhY3RTaG91TGluZ09uZS5za2lucykge1xuICAgICAgICAgICAgbGV0IHNraW4gPSBhY3RTaG91TGluZ09uZS5za2luc1tza2luSWRdO1xuICAgICAgICAgICAgbGV0IHNraW5DZmcgPSBHYW1lY2ZnLnNob3VsaW5nTGV2ZWwuZ2V0SXRlbShza2luSWQsIHNraW4ubGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoc2tpbkNmZykge1xuICAgICAgICAgICAgICAgIHNraW5FcHMgPSB0aGlzLmVwX21lcmdlKHNraW5FcHMsIHNraW5DZmcubGV2ZWxFcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBza2luRXBzKTtcbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpflvILosaHlsZ7mgKfliqDmiJBcbiAgICAgKi9cbiAgICBlcF95aXhpYW5nKGFjdFlpWGlhbmc6IFh5cy5BY3RZaVhpYW5nKTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBlcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgLy/orqHnrpfljYfnuqfljYfpmLblvILosaHlsZ7mgKdcbiAgICAgICAgY29uc3QgY2ZnID0gR2FtZWNmZy55aXhpYW5nTGV2ZWwuZ2V0SXRlbShhY3RZaVhpYW5nLmlkLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoY2ZnID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBlcHM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2ZnSmllSmkgPSBHYW1lY2ZnLnlpeGlhbmdKaWVqaS5nZXRJdGVtKGNmZy5zdGVwLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoY2ZnSmllSmkgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGVwcztcbiAgICAgICAgfVxuICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgY2ZnLmVwMCk7XG4gICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmdKaWVKaS5lcDEpO1xuICAgICAgICAvL+iuoeeul+S4iumYteW8guixoeWxnuaAp1xuICAgICAgICBjb25zdCBjZmdTdGVwID0gR2FtZWNmZy55aXhpYW5nU3RlcC5nZXRJdGVtKGFjdFlpWGlhbmcuaGgsIGNmZy5zdGVwLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoY2ZnU3RlcCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZXBzO1xuICAgICAgICB9XG4gICAgICAgIC8vIOiuoeeul+WMluW9ouWxnuaAp1xuICAgICAgICBmb3IobGV0IGlkIGluIGFjdFlpWGlhbmcuaHhEYXRhKXtcbiAgICAgICAgICAgIGxldCBjZmdIeCA9IEdhbWVjZmcueWl4aWFuZ0h1YXhpbmcuZ2V0SXRlbShpZCxhY3RZaVhpYW5nLmh4RGF0YVtpZF0ubGV2ZWwudG9TdHJpbmcoKSlcbiAgICAgICAgICAgIGlmKGNmZ0h4ICE9IG51bGwpe1xuICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmdIeC5sZXZlbEVwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIGNmZ1N0ZXAuZXApO1xuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+earuiCpOWxnuaAp+WKoOaIkFxuICAgICAqL1xuICAgIGVwX3BpZnUoYWN0UGlmdTogWHlzLkFjdFBpZnUpOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhY3RQaWZ1Lmxpc3QpIHtcbiAgICAgICAgICAgIGxldCBwaWZ1ID0gYWN0UGlmdS5saXN0W2tleV07XG4gICAgICAgICAgICBpZighcGlmdSl7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZighcGlmdS5sZXZlbCl7XG4gICAgICAgICAgICAgICAgcGlmdS5sZXZlbCA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL+iuoeeul+earuiCpOWxnuaAp+WxnuaAp1xuICAgICAgICAgICAgY29uc3QgY2ZnID0gR2FtZWNmZy5za2luU2tpbmxldmVsLmdldEl0ZW0oa2V5LnRvU3RyaW5nKCksIHBpZnUubGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoY2ZnID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmcubGV2ZWxFcHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6h566X5rSe5aSp6YGT56ul5bGe5oCn5Yqg5oiQXG4gICAgICovXG4gICAgZXBfZG9uZ3RpYW4oYWN0RG9uZ1RpYW46IFh5cy5BY3REb25nVGlhbik6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIC8v6K6h566X6YGT56ul562J57qn5bGe5oCn5Yqg5oiQXG4gICAgICAgIGNvbnN0IHhsTHZLZXlzID0gT2JqZWN0LmtleXMoYWN0RG9uZ1RpYW4ueGxMdik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeGxMdktleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB4bEx2S2V5c1tpXTtcbiAgICAgICAgICAgIGxldCBjZmcgPSBHYW1lY2ZnLmRvbmd0aWFuWGxMdi5nZXRJdGVtKHR5cGUsIGFjdERvbmdUaWFuLnhsTHZbdHlwZV0udG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoY2ZnID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmcuZXBzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2ZnU3RlcCA9IEdhbWVjZmcuZG9uZ3RpYW5YbFN0ZXAuZ2V0SXRlbShhY3REb25nVGlhbi54bFN0ZXAudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChjZmdTdGVwID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBlcHM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXBzS2V5cyA9IE9iamVjdC5rZXlzKGVwcyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXBzS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gZXBzS2V5c1tpXTtcbiAgICAgICAgICAgIGVwc1trZXldICo9IGNmZ1N0ZXAuZXBzIC8gMTAwMDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpfoja/nlLDlsZ7mgKfliqDmiJBcbiAgICAgKi9cbiAgICBlcF95YW90aWFuKGFjdFlhb1RpYW5FcHM6IFh5cy5BY3RZYW9UaWFuRXBzKTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBlcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGFjdFlhb1RpYW5FcHMpIHtcbiAgICAgICAgICAgIGVwc1trZXldID0gTWF0aC5mbG9vcihhY3RZYW9UaWFuRXBzW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6h566X56ew5Y+35bGe5oCn5Yqg5oiQXG4gICAgICovXG4gICAgZXBfY2hlbmdoYW8oYWN0Q2hlbmdoYW86IFh5cy5BY3RDaGVuZ2hhbyk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGZvcihsZXQgaWQgaW4gYWN0Q2hlbmdoYW8ubGlzdCl7XG4gICAgICAgICAgICBsZXQgY2ZnID0gR2FtZWNmZy5jaGVuZ2hhb1NodXhpbmcuZ2V0SXRlbShpZClcbiAgICAgICAgICAgIGlmKGNmZyAhPSBudWxsKXtcbiAgICAgICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgY2ZnLmVwcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8vIC8qKlxuICAgIC8vICAqIOWIhuWIq+e7n+iuoeS4u+inkuWSjOW8n+WtkOeahOeahOaImOaWl+WxnuaAp1xuICAgIC8vICAqL1xuICAgIGVwX3VzZXJBbmREaVppKHNldkJhY2s6IFh5cy5TZXZCYWNrKSB7XG4gICAgICAgIGxldCBhbGxFcHM6IGFueSA9IHt9O1xuICAgICAgICBsZXQgdXNlckJhc2UgPSBnYW1lTWV0aG9kLmVwX2FsbF9iYXNlKHNldkJhY2spO1xuICAgICAgICBhbGxFcHNbXCJ1c2VyXCJdID0gdXNlckJhc2VcbiAgICAgICAgbGV0IHVzZXJFcHMgPSBnYW1lTWV0aG9kLmVwX2FsbF9maWdodCh1c2VyQmFzZSk7XG5cbiAgICAgICAgZm9yIChsZXQgZ3ppZCBpbiBzZXZCYWNrLmFjdERpWmk/LmE/LnNoYW5nWmhlbikge1xuICAgICAgICAgICAgbGV0IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICAgICAgbGV0IGR6SWQgPSBzZXZCYWNrLmFjdERpWmk/LmE/LnNoYW5nWmhlbltnemlkXTtcbiAgICAgICAgICAgIGlmIChkeklkID09IG51bGwgfHwgZHpJZCA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2ZnZHogPSBHYW1lY2ZnLmh1b2JhbkJhc2UuZ2V0SXRlbShkeklkKTtcbiAgICAgICAgICAgIGxldCBkaXppID0gc2V2QmFjay5hY3REaVppTGlzdD8uYT8uW2R6SWRdO1xuICAgICAgICAgICAgaWYgKGNmZ2R6ID09IG51bGwgfHwgZGl6aSA9PSBudWxsIHx8IGNmZ2R6LnpoYW5saSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2ZnWmhvbmdadSA9IEdhbWVjZmcuaHVvYmFuWmhvbmd6dS5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgY2ZnZHouemhvbmd6dS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChjZmdaaG9uZ1p1ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8v6K6h566X5byf5a2Q5Y2H57qn5bGe5oCnXG4gICAgICAgICAgICBsZXQgbGV2ZWxFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRpemkubGV2ZWw7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpemlMZXZlbCA9IEdhbWVjZmcuaHVvYmFuU2hlbmdqaS5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAoZGl6aUxldmVsID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldmVsRXBzID0gdGhpcy5lcF9tZXJnZShsZXZlbEVwcywgZGl6aUxldmVsLmF0dHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAvL+S5nemchOWkqeaeouWvueW8n+WtkOWfuuehgOWxnuaAp+WKoOaIkFxuICAgICAgICAgICAgZm9yIChjb25zdCBoZGNpZCBpbiBzZXZCYWNrLmhkSml1WGlhb1RpYW5TaHUpIHtcbiAgICAgICAgICAgICAgICAvLyDmo4Dmn6XlsZ7mgKfmmK/lkKblrZjlnKhcbiAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXZCYWNrLmhkSml1WGlhb1RpYW5TaHUsIGhkY2lkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGppdXhpYW8gPSBzZXZCYWNrLmhkSml1WGlhb1RpYW5TaHU/LltoZGNpZF0/LmE7XG4gICAgICAgICAgICAgICAgaWYgKCFqaXV4aWFvKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDmo4Dmn6XkvJnkvLTlsZ7mgKfliqDmiJDmmK/lkKblpKfkuo4wXG4gICAgICAgICAgICAgICAgaWYgKGppdXhpYW8uaHVvQmFuRXBzID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmF0ZSA9IDEgKyAoaml1eGlhby5odW9CYW5FcHMgLyAxMDApO1xuICAgICAgICAgICAgICAgICAgICBsZXZlbEVwcyA9IHRoaXMuZXBfS3ZSYXRlKGxldmVsRXBzLCByYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgbGV2ZWxFcHMpO1xuICAgICAgICAgICAgLy/orqHnrpflvJ/lrZDljYfmmJ/nmoTln7rnoYDlsZ7mgKfliqDmiJBcbiAgICAgICAgICAgIGxldCBzdGFyRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkaXppLnN0YXI7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpemlTdGFyID0gR2FtZWNmZy5odW9iYW5TdGFyLmdldEl0ZW0oY2ZnZHouaWQsIGkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGRpemlTdGFyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YXJFcHMgPSB0aGlzLmVwX21lcmdlKHN0YXJFcHMsIGRpemlTdGFyLmF0dHIyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBzdGFyRXBzKTtcbiAgICAgICAgICAgIC8v6K6h566X5byf5a2Q5aKD55WM5bGe5oCnXG4gICAgICAgICAgICBsZXQgamluZ2ppZUVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gZGl6aS5qaW5namllOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXppSmluZ2ppZSA9IEdhbWVjZmcuaHVvYmFuVHVwby5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAoZGl6aUppbmdqaWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgamluZ2ppZUVwcyA9IHRoaXMuZXBfbWVyZ2UoamluZ2ppZUVwcywgZGl6aUppbmdqaWUuYXR0cik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgamluZ2ppZUVwcyk7XG4gICAgICAgICAgICBsZXQgZHpFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSBnYW1lTWV0aG9kLmVwX2luaXQoKTsgLy/liJ3lp4vljJblsZ7mgKdcbiAgICAgICAgICAgIGR6RXBzID0gZ2FtZU1ldGhvZC5lcF9tZXJnZShkekVwcywgY2ZnZHouZXBzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyKSB7XG4gICAgICAgICAgICAgICAgLy/nu6fmib/kuLvop5LlsZ7mgKdcbiAgICAgICAgICAgICAgICBkekVwc1trZXldICs9IE1hdGguZmxvb3IoKHVzZXJFcHNba2V5XSAqIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyW2tleV0pIC8gMTAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY2ZnWmhvbmdadS5pbmhlcml0X2F0dHJfaGlkZSkge1xuICAgICAgICAgICAgICAgIC8v57un5om/5Li76KeS5bGe5oCnXG4gICAgICAgICAgICAgICAgZHpFcHNba2V5XSArPSBNYXRoLmZsb29yKCh1c2VyRXBzW2tleV0gKiBjZmdaaG9uZ1p1LmluaGVyaXRfYXR0cl9oaWRlW2tleV0pIC8gMTAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXBzID0gZ2FtZU1ldGhvZC5lcF9tZXJnZShlcHMsIGR6RXBzKTtcbiAgICAgICAgICAgIGFsbEVwc1tgJHtkeklkfV8ke2NmZ2R6LmR6TmFtZX1gXSA9IGVwcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsRXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+inkuiJsuaAu+aImOWKm1xuICAgICAqIGppdXhpYW86IOWvueW8n+WtkOWfuuehgOWxnuaAp+WKoOaIkFxuICAgICAqL1xuICAgIGVwX3Bvd2VyX2FsbChzZXZCYWNrOiBYeXMuU2V2QmFjaywgZXBfYWxsX2Jhc2U6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fSkge1xuICAgICAgICBsZXQgdXNlckJhc2U6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShlcF9hbGxfYmFzZSkgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHVzZXJCYXNlID0gZXBfYWxsX2Jhc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1c2VyQmFzZSA9IGdhbWVNZXRob2QuZXBfYWxsX2Jhc2Uoc2V2QmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVzZXJFcHMgPSBnYW1lTWV0aG9kLmVwX2FsbF9maWdodCh1c2VyQmFzZSlcblxuICAgICAgICBsZXQgZGl6aVBvd2VyOiBudW1iZXIgPSAwO1xuICAgICAgICBmb3IgKGxldCBnemlkIGluIHNldkJhY2suYWN0RGlaaT8uYT8uc2hhbmdaaGVuKSB7XG4gICAgICAgICAgICBsZXQgZGl6aUVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICAgICAgbGV0IGR6SWQgPSBzZXZCYWNrLmFjdERpWmk/LmE/LnNoYW5nWmhlbltnemlkXTtcbiAgICAgICAgICAgIGlmIChkeklkID09IG51bGwgfHwgZHpJZCA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2ZnZHogPSBHYW1lY2ZnLmh1b2JhbkJhc2UuZ2V0SXRlbShkeklkKTtcbiAgICAgICAgICAgIGxldCBkaXppID0gc2V2QmFjay5hY3REaVppTGlzdD8uYT8uW2R6SWRdO1xuICAgICAgICAgICAgaWYgKGNmZ2R6ID09IG51bGwgfHwgZGl6aSA9PSBudWxsIHx8IGNmZ2R6LnpoYW5saSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2ZnWmhvbmdadSA9IEdhbWVjZmcuaHVvYmFuWmhvbmd6dS5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgY2ZnZHouemhvbmd6dS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChjZmdaaG9uZ1p1ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8v6K6h566X5byf5a2Q5Y2H57qn5bGe5oCnXG4gICAgICAgICAgICBsZXQgbGV2ZWxFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRpemkubGV2ZWw7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpemlMZXZlbCA9IEdhbWVjZmcuaHVvYmFuU2hlbmdqaS5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAoZGl6aUxldmVsID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldmVsRXBzID0gdGhpcy5lcF9tZXJnZShsZXZlbEVwcywgZGl6aUxldmVsLmF0dHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy/kuZ3pnITlpKnmnqLlr7nlvJ/lrZDln7rnoYDlsZ7mgKfliqDmiJBcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGRjaWQgaW4gc2V2QmFjay5oZEppdVhpYW9UaWFuU2h1KSB7XG4gICAgICAgICAgICAgICAgLy8g5qOA5p+l5bGe5oCn5piv5ZCm5a2Y5ZyoXG4gICAgICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V2QmFjay5oZEppdVhpYW9UaWFuU2h1LCBoZGNpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBqaXV4aWFvID0gc2V2QmFjay5oZEppdVhpYW9UaWFuU2h1Py5baGRjaWRdPy5hO1xuICAgICAgICAgICAgICAgIGlmICghaml1eGlhbykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g5qOA5p+l5LyZ5Ly05bGe5oCn5Yqg5oiQ5piv5ZCm5aSn5LqOMFxuICAgICAgICAgICAgICAgIGlmIChqaXV4aWFvLmh1b0JhbkVwcyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhdGUgPSAxICsgKGppdXhpYW8uaHVvQmFuRXBzIC8gMTAwKTtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWxFcHMgPSB0aGlzLmVwX0t2UmF0ZShsZXZlbEVwcywgcmF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgbGV2ZWxFcHMpO1xuXG4gICAgICAgICAgICAvL+iuoeeul+W8n+WtkOWNh+aYn+eahOWfuuehgOWxnuaAp+WKoOaIkFxuICAgICAgICAgICAgbGV0IHN0YXJFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRpemkuc3RhcjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGl6aVN0YXIgPSBHYW1lY2ZnLmh1b2JhblN0YXIuZ2V0SXRlbShjZmdkei5pZCwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAoZGl6aVN0YXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhckVwcyA9IHRoaXMuZXBfbWVyZ2Uoc3RhckVwcywgZGl6aVN0YXIuYXR0cjIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgc3RhckVwcyk7XG4gICAgICAgICAgICAvL+iuoeeul+W8n+WtkOWig+eVjOWxnuaAp1xuICAgICAgICAgICAgbGV0IGppbmdqaWVFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRpemkuamluZ2ppZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGl6aUppbmdqaWUgPSBHYW1lY2ZnLmh1b2JhblR1cG8uZ2V0SXRlbShjZmdkei5waW56aGksIGkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGRpemlKaW5namllID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGppbmdqaWVFcHMgPSB0aGlzLmVwX21lcmdlKGppbmdqaWVFcHMsIGRpemlKaW5namllLmF0dHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgamluZ2ppZUVwcyk7XG4gICAgICAgICAgICBsZXQgZHpFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSBnYW1lTWV0aG9kLmVwX2luaXQoKTsgLy/liJ3lp4vljJblsZ7mgKdcbiAgICAgICAgICAgIGR6RXBzID0gZ2FtZU1ldGhvZC5lcF9tZXJnZShkekVwcywgY2ZnZHouZXBzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyKSB7XG4gICAgICAgICAgICAgICAgLy/nu6fmib/kuLvop5LlsZ7mgKdcbiAgICAgICAgICAgICAgICBkekVwc1trZXldICs9IE1hdGguZmxvb3IoKHVzZXJFcHNba2V5XSAqIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyW2tleV0pIC8gMTAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY2ZnWmhvbmdadS5pbmhlcml0X2F0dHJfaGlkZSkge1xuICAgICAgICAgICAgICAgIC8v57un5om/5Li76KeS5bGe5oCnXG4gICAgICAgICAgICAgICAgZHpFcHNba2V5XSArPSBNYXRoLmZsb29yKCh1c2VyRXBzW2tleV0gKiBjZmdaaG9uZ1p1LmluaGVyaXRfYXR0cl9oaWRlW2tleV0pIC8gMTAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgZHpFcHMpO1xuICAgICAgICAgICAgZGl6aVBvd2VyICs9IGdhbWVNZXRob2QuZXBfcG93ZXIoMCwgZGl6aUVwcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5YW954G15oiY5YqbXG4gICAgICAgIGxldCBzbFBvd2VyOiBudW1iZXIgPSAwO1xuICAgICAgICBpZiAoc2V2QmFjay5hY3RTaG91TGluZyAhPSBudWxsICYmIHNldkJhY2suYWN0U2hvdUxpbmdMaXN0ICE9IG51bGwgJiYgc2V2QmFjay5hY3RTaG91TGluZy5hICYmIHNldkJhY2suYWN0U2hvdUxpbmdMaXN0LmEpIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZUd6SWRLZXlzID0gT2JqZWN0LmtleXMoc2V2QmFjay5hY3RTaG91TGluZy5hLnVzZUd6SWQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VHeklkS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZUd6SWQgPSB1c2VHeklkS2V5c1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgZ3ppZCA9IHNldkJhY2suYWN0U2hvdUxpbmcuYS51c2VHeklkW3VzZUd6SWRdO1xuICAgICAgICAgICAgICAgIGlmIChnemlkID09IG51bGwgfHwgZ3ppZCA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgc2hvdWxpbmcgPSBzZXZCYWNrLmFjdFNob3VMaW5nTGlzdC5hW2d6aWRdO1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKmxldCBjZmcgPSBHYW1lY2ZnLnNob3VsaW5nSW5mby5nZXRJdGVtKHNob3VsaW5nLnNsaWQpO1xuICAgICAgICAgICAgICAgIGlmIChjZmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBpbnpoaUNmZyA9IEdhbWVjZmcuc2hvdWxpbmdQaW56aGkuZ2V0SXRlbShjZmcucGluemhpKTtcbiAgICAgICAgICAgICAgICBpZiAocGluemhpQ2ZnID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSovXG4gICAgICAgICAgICAgICAgLy/kuLvmiJhcbiAgICAgICAgICAgICAgICBpZiAodXNlR3pJZCA9PSBcIjBcIikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2tpbGwgPSBzaG91bGluZy5zaztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXAgID0gc2hvdWxpbmcuc3RlcFxuICAgICAgICAgICAgICAgICAgICBsZXQgc2tpbGxDZmcgPSBHYW1lY2ZnLnNwZWxsU2tpbGwuZ2V0SXRlbShza2lsbC5za2lsbElkLCBza2lsbC5sdi50b1N0cmluZygpLCBzdGVwLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbGxDZmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2xQb3dlciArPSBza2lsbENmZy56aGFubGk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g5Yqp5oiY5L2NXG4gICAgICAgICAgICAgICAgICAgIGxldCBza2lsbCA9IHNob3VsaW5nLnNrO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RlcCA9IHNob3VsaW5nLnN0ZXBcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNraWxsQ2ZnID0gR2FtZWNmZy5zcGVsbFNraWxsLmdldEl0ZW0oc2tpbGwuc2tpbGxJZCwgc2tpbGwubHYudG9TdHJpbmcoKSwgc3RlcC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNraWxsQ2ZnID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNsUG93ZXIgKz0gc2tpbGxDZmcuemhhbmxpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGl6aVBvd2VyICsgZ2FtZU1ldGhvZC5lcF9wb3dlcigwLCB1c2VyQmFzZSkgKyBzbFBvd2VyO1xuICAgIH1cblxuICAgIGVwX3Bvd2VyX2Rpemkoc2V2QmFjazogWHlzLlNldkJhY2ssIGR6SWQ6IHN0cmluZykge1xuICAgICAgICBsZXQgdXNlckVwcyA9IGdhbWVNZXRob2QuZXBfYWxsKHNldkJhY2spO1xuICAgICAgICBsZXQgZGl6aUVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBpZiAoZHpJZCA9PSBudWxsIHx8IGR6SWQgPT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNmZ2R6ID0gR2FtZWNmZy5odW9iYW5CYXNlLmdldEl0ZW0oZHpJZCk7XG4gICAgICAgIGxldCBkaXppID0gc2V2QmFjay5hY3REaVppTGlzdD8uYT8uW2R6SWRdO1xuICAgICAgICBpZiAoY2ZnZHogPT0gbnVsbCB8fCBkaXppID09IG51bGwgfHwgY2ZnZHouemhhbmxpID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjZmdaaG9uZ1p1ID0gR2FtZWNmZy5odW9iYW5aaG9uZ3p1LmdldEl0ZW0oY2ZnZHoucGluemhpLCBjZmdkei56aG9uZ3p1LnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoY2ZnWmhvbmdadSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvL+iuoeeul+W8n+WtkOWNh+e6p+WxnuaAp1xuICAgICAgICBsZXQgbGV2ZWxFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gZGl6aS5sZXZlbDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkaXppTGV2ZWwgPSBHYW1lY2ZnLmh1b2JhblNoZW5namkuZ2V0SXRlbShjZmdkei5waW56aGksIGkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoZGl6aUxldmVsID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldmVsRXBzID0gdGhpcy5lcF9tZXJnZShsZXZlbEVwcywgZGl6aUxldmVsLmF0dHIpO1xuICAgICAgICB9XG4gICAgICAgIC8v5Lmd6ZyE5aSp5p6i5a+55byf5a2Q5Z+656GA5bGe5oCn5Yqg5oiQXG4gICAgICAgIGZvciAoY29uc3QgaGRjaWQgaW4gc2V2QmFjay5oZEppdVhpYW9UaWFuU2h1KSB7XG4gICAgICAgICAgICAvLyDmo4Dmn6XlsZ7mgKfmmK/lkKblrZjlnKhcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldkJhY2suaGRKaXVYaWFvVGlhblNodSwgaGRjaWQpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaml1eGlhbyA9IHNldkJhY2suaGRKaXVYaWFvVGlhblNodT8uW2hkY2lkXT8uYTtcbiAgICAgICAgICAgIGlmICghaml1eGlhbykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5qOA5p+l5LyZ5Ly05bGe5oCn5Yqg5oiQ5piv5ZCm5aSn5LqOMFxuICAgICAgICAgICAgaWYgKGppdXhpYW8uaHVvQmFuRXBzID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByYXRlID0gMSArIChqaXV4aWFvLmh1b0JhbkVwcyAvIDEwMCk7XG4gICAgICAgICAgICAgICAgbGV2ZWxFcHMgPSB0aGlzLmVwX0t2UmF0ZShsZXZlbEVwcywgcmF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgbGV2ZWxFcHMpO1xuICAgICAgICAvL+iuoeeul+W8n+WtkOWNh+aYn+eahOWfuuehgOWxnuaAp+WKoOaIkFxuICAgICAgICBsZXQgc3RhckVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkaXppLnN0YXI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGl6aVN0YXIgPSBHYW1lY2ZnLmh1b2JhblN0YXIuZ2V0SXRlbShjZmdkei5pZCwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChkaXppU3RhciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFyRXBzID0gdGhpcy5lcF9tZXJnZShzdGFyRXBzLCBkaXppU3Rhci5hdHRyMik7XG4gICAgICAgIH1cbiAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgc3RhckVwcyk7XG4gICAgICAgIC8v6K6h566X5byf5a2Q5aKD55WM5bGe5oCnXG4gICAgICAgIGxldCBqaW5namllRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRpemkuamluZ2ppZTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkaXppSmluZ2ppZSA9IEdhbWVjZmcuaHVvYmFuVHVwby5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChkaXppSmluZ2ppZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqaW5namllRXBzID0gdGhpcy5lcF9tZXJnZShqaW5namllRXBzLCBkaXppSmluZ2ppZS5hdHRyKTtcbiAgICAgICAgfVxuICAgICAgICBkaXppRXBzID0gdGhpcy5lcF9tZXJnZShkaXppRXBzLCBqaW5namllRXBzKTtcbiAgICAgICAgbGV0IGR6RXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0gZ2FtZU1ldGhvZC5lcF9pbml0KCk7IC8v5Yid5aeL5YyW5bGe5oCnXG4gICAgICAgIGR6RXBzID0gZ2FtZU1ldGhvZC5lcF9tZXJnZShkekVwcywgY2ZnZHouZXBzKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY2ZnWmhvbmdadS5pbmhlcml0X2F0dHIpIHtcbiAgICAgICAgICAgIC8v57un5om/5Li76KeS5bGe5oCnXG4gICAgICAgICAgICBkekVwc1trZXldICs9IE1hdGguZmxvb3IoKHVzZXJFcHNba2V5XSAqIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyW2tleV0pIC8gMTAwMDApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyX2hpZGUpIHtcbiAgICAgICAgICAgIC8v57un5om/5Li76KeS5bGe5oCnXG4gICAgICAgICAgICBkekVwc1trZXldICs9IE1hdGguZmxvb3IoKHVzZXJFcHNba2V5XSAqIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyX2hpZGVba2V5XSkgLyAxMDAwMCk7XG4gICAgICAgIH1cbiAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgZHpFcHMpO1xuICAgICAgICByZXR1cm4gZ2FtZU1ldGhvZC5lcF9wb3dlcigwLCBkaXppRXBzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpfpmLXms5Xmm7TmjaLnmoTmiJjlipvlj5jljJblgLwgKOW8g+eUqClcbiAgICAgKi9cbiAgICBlcF9wb3dlcl96aGVuZmEoc2V2QmFjazogWHlzLlNldkJhY2ssIGxpbnNoaTogeyBwZmlkOiBzdHJpbmc7IGxldmVsOiBudW1iZXI7IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfTsgcGluemhpOiBzdHJpbmcgfSk6IG51bWJlciB7XG4gICAgICAgIC8v5Y6f5pys55qE5oiY5YqbXG4gICAgICAgIGNvbnN0IGluaXRQb3dlciA9IHRoaXMuZXBfcG93ZXJfYWxsKHNldkJhY2spO1xuICAgICAgICBsZXQgbmV3U2V2QmFjayA9IGdhbWVNZXRob2Qub2JqQ29weShzZXZCYWNrKTtcbiAgICAgICAgaWYgKG5ld1NldkJhY2suYWN0WmhlbmZhID09IG51bGwgfHwgbmV3U2V2QmFjay5hY3RaaGVuZmEuYSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2ZncGYgPSBHYW1lY2ZnLnpoZW5mYVBpZnUuZ2V0SXRlbShsaW5zaGkucGZpZCk7XG4gICAgICAgIGlmIChjZmdwZiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV3U2V2QmFjay5hY3RaaGVuZmEuYS5jaHVhbltjZmdwZi5idXdlaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3U2V2QmFjay5hY3RaaGVuZmEuYS5jaHVhbltjZmdwZi5idXdlaV0gPSB7XG4gICAgICAgICAgICAgICAgcGZpZDogXCJcIixcbiAgICAgICAgICAgICAgICBsZXZlbDogMCxcbiAgICAgICAgICAgICAgICBlcHM6IHt9LFxuICAgICAgICAgICAgICAgIGZtTHY6IDAsXG4gICAgICAgICAgICAgICAgZm1CZDogMCxcbiAgICAgICAgICAgICAgICBmbUVwczogW10sXG4gICAgICAgICAgICAgICAgZm1aaEJkOiBbXSxcbiAgICAgICAgICAgICAgICBmbVpobHM6IFtdLFxuICAgICAgICAgICAgICAgIHBpbnpoaTogXCJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbmV3U2V2QmFjay5hY3RaaGVuZmEuYS5jaHVhbltjZmdwZi5idXdlaV0ucGZpZCA9IGxpbnNoaS5wZmlkO1xuICAgICAgICBuZXdTZXZCYWNrLmFjdFpoZW5mYS5hLmNodWFuW2NmZ3BmLmJ1d2VpXS5sZXZlbCA9IGxpbnNoaS5sZXZlbDtcbiAgICAgICAgbmV3U2V2QmFjay5hY3RaaGVuZmEuYS5jaHVhbltjZmdwZi5idXdlaV0uZXBzID0gbGluc2hpLmVwcztcbiAgICAgICAgbmV3U2V2QmFjay5hY3RaaGVuZmEuYS5jaHVhbltjZmdwZi5idXdlaV0ucGluemhpID0gbGluc2hpLnBpbnpoaTtcbiAgICAgICAgY29uc3QgbmV3UG93ZXIgPSB0aGlzLmVwX3Bvd2VyX2FsbChuZXdTZXZCYWNrKTtcblxuICAgICAgICByZXR1cm4gbmV3UG93ZXIgLSBpbml0UG93ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6h566X6Zi15rOV5pu05o2i55qE5oiY5Yqb5Y+Y5YyW5YC8XG4gICAgICovXG4gICAgZXBfcG93ZXJfemhlbmZhTmV3KHNldkJhY2s6IFh5cy5TZXZCYWNrLCBsaW5zaGk6IHsgcGZpZDogc3RyaW5nOyBsZXZlbDogbnVtYmVyOyBlcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH07IHBpbnpoaTogc3RyaW5nIH0pOiBudW1iZXIge1xuICAgICAgICBpZiAoc2V2QmFjay5hY3RaaGVuZmFOZXcgPT0gbnVsbCB8fCBzZXZCYWNrLmFjdFpoZW5mYU5ldy5hID09IG51bGwgfHwgc2V2QmFjay5hY3RaaGVuZmFOZXcuYS5jaHVhbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2ZncGYgPSBHYW1lY2ZnLnpoZW5mYVBpZnUuZ2V0SXRlbShsaW5zaGkucGZpZCk7XG4gICAgICAgIGlmIChjZmdwZiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb2xkQ2VwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBpZiAoc2V2QmFjay5hY3RaaGVuZmFOZXcuYS5jaHVhbltjZmdwZi5idXdlaV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgb2xkQ2VwcyA9IHNldkJhY2suYWN0WmhlbmZhTmV3LmEuY2h1YW5bY2ZncGYuYnV3ZWldLmVwcztcbiAgICAgICAgfVxuICAgICAgICAvL+WOn+acrOeahOaImOWKm1xuICAgICAgICBjb25zdCBpbml0UG93ZXIgPSB0aGlzLmVwX3Bvd2VyX2FsbChzZXZCYWNrKTtcbiAgICAgICAgbGV0IGVwX2Jhc2UgPSB0aGlzLmVwX2FsbF9iYXNlKHNldkJhY2spO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvbGRDZXBzKSB7XG4gICAgICAgICAgICBlcF9iYXNlW2tleV0gLT0gb2xkQ2Vwc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGxpbnNoaS5lcHMpIHtcbiAgICAgICAgICAgIGVwX2Jhc2Vba2V5XSArPSBsaW5zaGkuZXBzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3UG93ZXIgPSB0aGlzLmVwX3Bvd2VyX2FsbChzZXZCYWNrLCBlcF9iYXNlKTtcbiAgICAgICAgcmV0dXJuIG5ld1Bvd2VyIC0gaW5pdFBvd2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+W3sue7j+epv+aItOeahOijheWkh+WxnuaAp1xuICAgICAqL1xuICAgIGVwX3Bvd2VyX3poZW5mYU5ld19jaHVhbihzZXZCYWNrOiBYeXMuU2V2QmFjaywgYnV3ZWk6c3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHNldkJhY2suYWN0WmhlbmZhTmV3ID09IG51bGwgfHwgc2V2QmFjay5hY3RaaGVuZmFOZXcuYSA9PSBudWxsIHx8IHNldkJhY2suYWN0WmhlbmZhTmV3LmEuY2h1YW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgLy/ljp/mnKznmoTmiJjliptcbiAgICAgICAgY29uc3QgaW5pdFBvd2VyID0gdGhpcy5lcF9wb3dlcl9hbGwoc2V2QmFjayk7XG4gICAgICAgIGxldCBvbGRDZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGlmIChzZXZCYWNrLmFjdFpoZW5mYU5ldy5hLmNodWFuW2J1d2VpXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgY2h1YW4gPSBzZXZCYWNrLmFjdFpoZW5mYU5ldy5hLmNodWFuW2J1d2VpXVxuICAgICAgICAgICAgb2xkQ2VwcyA9IHRoaXMuZXBfbWVyZ2Uob2xkQ2VwcywgY2h1YW4uZXBzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZm1FcHMgb2YgY2h1YW4uZm1FcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAob2xkQ2Vwc1tmbUVwc1swXV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBvbGRDZXBzW2ZtRXBzWzBdXSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9sZENlcHNbZm1FcHNbMF1dICs9IGZtRXBzWzFdO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgLy8g5rSX57uD5bGe5oCnXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBvc0lkIGluIGNodWFuLnhpbGlhbkVwcykge1xuICAgICAgICAgICAgICAgIGlmIChjaHVhbi54aWxpYW5FcHNbcG9zSWRdLmlkID09IG51bGwgfHwgY2h1YW4ueGlsaWFuRXBzW3Bvc0lkXS5pZCA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgeGlsaWFuX2MgPSBHYW1lY2ZnLnpoZW5mYVhpbGlhbldvcmQuZ2V0SXRlbShjaHVhbi54aWxpYW5FcHNbcG9zSWRdLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoeGlsaWFuX2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBvbGRDZXBzID0gdGhpcy5lcF9tZXJnZShvbGRDZXBzLCB4aWxpYW5fYy5hdHRyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVwX2Jhc2UgPSB0aGlzLmVwX2FsbF9iYXNlKHNldkJhY2spO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvbGRDZXBzKSB7XG4gICAgICAgICAgICBlcF9iYXNlW2tleV0gLT0gb2xkQ2Vwc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1Bvd2VyID0gdGhpcy5lcF9wb3dlcl9hbGwoc2V2QmFjaywgZXBfYmFzZSk7XG4gICAgICAgIHJldHVybiBuZXdQb3dlciAtIGluaXRQb3dlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpfpmLXms5Xmm7TmjaLnmoTmiJjlipvlj5jljJblgLxcbiAgICAgKi9cbiAgICBlcF9wb3dlcl9ndXppKHNldkJhY2s6IFh5cy5TZXZCYWNrLCBsaW5zaGk6IFh5cy5saXNoaUdaSW5mbyk6IG51bWJlciB7XG4gICAgICAgIC8v5Y6f5pys55qE5oiY5YqbXG4gICAgICAgIGxldCBvbGRDZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHNldkJhY2suYWN0RGFkaUd1emkgIT0gbnVsbCAmJlxuICAgICAgICAgICAgc2V2QmFjay5hY3REYWRpR3V6aS5hICE9IG51bGwgJiZcbiAgICAgICAgICAgIHNldkJhY2suYWN0RGFkaUd1emkuYS5tcExpc3QgIT0gbnVsbCAmJlxuICAgICAgICAgICAgc2V2QmFjay5hY3REYWRpR3V6aS5hLm1wWGhpZCAhPSBudWxsICYmXG4gICAgICAgICAgICBzZXZCYWNrLmFjdERhZGlHdXppLmEubXBMaXN0W3NldkJhY2suYWN0RGFkaUd1emkuYS5tcFhoaWRdICE9IG51bGwgJiZcbiAgICAgICAgICAgIHNldkJhY2suYWN0RGFkaUd1emkuYS5tcExpc3Rbc2V2QmFjay5hY3REYWRpR3V6aS5hLm1wWGhpZF1bbGluc2hpLmJ1d2VpXSAhPSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgICAgb2xkQ2VwcyA9IHNldkJhY2suYWN0RGFkaUd1emkuYS5tcExpc3Rbc2V2QmFjay5hY3REYWRpR3V6aS5hLm1wWGhpZF1bbGluc2hpLmJ1d2VpXS5lcHM7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZXBfYmFzZSA9IHRoaXMuZXBfYWxsX2Jhc2Uoc2V2QmFjayk7XG4gICAgICAgIGxldCBlcF9iYXNlMiA9IGdhbWVNZXRob2Qub2JqQ29weShlcF9iYXNlKTtcbiAgICAgICAgZXBfYmFzZS5hdGsgKz0gTWF0aC5mbG9vcigoZXBfYmFzZS5hdGsgKiBlcF9iYXNlLmF0a19wZXIpIC8gMTAwMDApO1xuICAgICAgICBlcF9iYXNlLmRlZiArPSBNYXRoLmZsb29yKChlcF9iYXNlLmRlZiAqIGVwX2Jhc2UuZGVmX3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwX2Jhc2UuaHBfbWF4ICs9IE1hdGguZmxvb3IoKGVwX2Jhc2UuaHBfbWF4ICogZXBfYmFzZS5ocF9tYXhfcGVyKSAvIDEwMDAwKTtcbiAgICAgICAgZXBfYmFzZS5ocCA9IGVwX2Jhc2UuaHBfbWF4O1xuICAgICAgICBjb25zdCBpbml0UG93ZXIgPSB0aGlzLmVwX3Bvd2VyKDAsIGVwX2Jhc2UpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvbGRDZXBzKSB7XG4gICAgICAgICAgICBlcF9iYXNlMltrZXldIC09IG9sZENlcHNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBsaW5zaGkuZXBzKSB7XG4gICAgICAgICAgICBlcF9iYXNlMltrZXldICs9IGxpbnNoaS5lcHNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlcF9iYXNlMi5hdGsgKz0gTWF0aC5mbG9vcigoZXBfYmFzZTIuYXRrICogZXBfYmFzZTIuYXRrX3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwX2Jhc2UyLmRlZiArPSBNYXRoLmZsb29yKChlcF9iYXNlMi5kZWYgKiBlcF9iYXNlMi5kZWZfcGVyKSAvIDEwMDAwKTtcbiAgICAgICAgZXBfYmFzZTIuaHBfbWF4ICs9IE1hdGguZmxvb3IoKGVwX2Jhc2UyLmhwX21heCAqIGVwX2Jhc2UyLmhwX21heF9wZXIpIC8gMTAwMDApO1xuICAgICAgICBlcF9iYXNlMi5ocCA9IGVwX2Jhc2UyLmhwX21heDtcbiAgICAgICAgY29uc3QgbmV3UG93ZXIgPSB0aGlzLmVwX3Bvd2VyKDAsIGVwX2Jhc2UyKTtcblxuICAgICAgICByZXR1cm4gbmV3UG93ZXIgLSBpbml0UG93ZXI7XG4gICAgfVxuXG4gICAgLy8g6K6h566X6Zeo5b6S55qE5oiY5YqbXG4gICAgZXBfcG93ZXJfbWVudHUobWVudHU6IFh5cy5tZW50dSkge1xuICAgICAgICBsZXQgcG93ZXIgPSAwO1xuXG4gICAgICAgIC8vIOWfuuehgOWxnuaAp1xuICAgICAgICBwb3dlciArPSB0aGlzLmVwX3Bvd2VyKDAsIG1lbnR1LmJhc2ljQXR0cik7XG5cbiAgICAgICAgLy8g54m55q6K5bGe5oCnXG4gICAgICAgIGlmIChtZW50dS5zcGVBdHRyICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgbWVudHUuc3BlQXR0cikge1xuICAgICAgICAgICAgICAgIGxldCBzcGVjaWFsQ2ZnID0gR2FtZWNmZy56b25nTWVuU3BlQXR0ci5nZXRJdGVtKGlkICsgXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKHNwZWNpYWxDZmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG93ZXIgKz0gdGhpcy5lcF9wb3dlcigwLCBzcGVjaWFsQ2ZnLmF0dHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBvd2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWxnuaAp+i9rOWMluaIkOaImOWKm1xuICAgICAqIEBwYXJhbSB0eXBlIOm7mOiupCAgMOm7mOiupCAgMeaAqueJqVxuICAgICAqIEBwYXJhbSBlcHMg5bGe5oCn5raI5oGvXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBlcF9wb3dlcih0eXBlOiBudW1iZXIsIF9lcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gfCBhbnkpOiBudW1iZXIge1xuICAgICAgICBsZXQgZXBzID0gZ2FtZU1ldGhvZC5lcF9pbml0KCk7XG4gICAgICAgIGVwcyA9IGdhbWVNZXRob2QuZXBfbWVyZ2UoZXBzLCBfZXBzKTtcbiAgICAgICAgZXBzID0gZ2FtZU1ldGhvZC5lcF9hbGxfZmlnaHQoZXBzKVxuXG4gICAgICAgIGxldCBwb3dlcjogbnVtYmVyID0gMDtcbiAgICAgICAgbGV0IGNmZ0VwUG9vbCA9IEdhbWVjZmcudXNlckVwLnBvb2w7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNmZ0VwUG9vbCkge1xuICAgICAgICAgICAgbGV0IHJwS2V5ID0gY2ZnRXBQb29sW2tleV0ua2V5O1xuICAgICAgICAgICAgaWYgKGVwc1tycEtleV0gPT0gbnVsbCB8fCB0eXBlb2YgZXBzW3JwS2V5XSAhPSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgeGlzaHUgPSAwO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VwUG9vbFtrZXldLm1vbVBvd2VyKSA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aXNodSA9IGNmZ0VwUG9vbFtrZXldLm1vbVBvd2VyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VwUG9vbFtrZXldLnBvd2VyKSA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aXNodSA9IGNmZ0VwUG9vbFtrZXldLnBvd2VyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhZGRQb3dlciA9IE1hdGguZmxvb3IoeGlzaHUgKiBlcHNbcnBLZXldKTtcbiAgICAgICAgICAgIHBvd2VyICs9IGFkZFBvd2VyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3dlcjtcbiAgICB9XG5cbiAgICAvL+iOt+WPluiNr+eUsOWQg+iNr+WKoOaIkOeahOWxnuaAp1xuICAgIGVwc195YW9mYW5nKGNvdW50OiBudW1iZXIsIGRhbnlhbzogeyBuYWl5YW86IG51bWJlcjsgc2hpeW9uZzogbnVtYmVyIH0sIHl4OiBudW1iZXJbXSwgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9KSB7XG4gICAgICAgIGxldCBuZWVkQ291bnQgPSBjb3VudDtcbiAgICAgICAgbGV0IHNoaXlvbmc6IGFueSA9IHt9O1xuICAgICAgICB3aGlsZSAobmVlZENvdW50ID4gMCkge1xuICAgICAgICAgICAgLy/opoHpmY3nuqdcbiAgICAgICAgICAgIGlmIChkYW55YW8uc2hpeW9uZyArIG5lZWRDb3VudCA+PSB5eFswXSAmJiBkYW55YW8ubmFpeWFvID4geXhbMl0pIHtcbiAgICAgICAgICAgICAgICBuZWVkQ291bnQgLT0geXhbMF0gLSBkYW55YW8uc2hpeW9uZztcbiAgICAgICAgICAgICAgICAvL+iusOW9lemjn+eUqFxuICAgICAgICAgICAgICAgIHNoaXlvbmdbZGFueWFvLm5haXlhb10gPSB5eFswXSAtIGRhbnlhby5zaGl5b25nO1xuICAgICAgICAgICAgICAgIGRhbnlhby5zaGl5b25nID0gMDtcbiAgICAgICAgICAgICAgICBkYW55YW8ubmFpeWFvIC09IHl4WzFdO1xuICAgICAgICAgICAgICAgIGRhbnlhby5uYWl5YW8gPSBNYXRoLm1heChkYW55YW8ubmFpeWFvLCB5eFsyXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChkYW55YW8ubmFpeWFvID09IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICAvL+iAkOiNr+etieS6juacgOS9jueahOaXtuWAmeS4jeWKoHNoaXlvbmfmlbDph4/lj6rliqBjb3VudOaVsOmHj1xuICAgICAgICAgICAgICAgICAgICBzaGl5b25nW2Rhbnlhby5uYWl5YW9dID0gbmVlZENvdW50O1xuICAgICAgICAgICAgICAgICAgICBuZWVkQ291bnQgLT0gbmVlZENvdW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhbnlhby5zaGl5b25nICs9IG5lZWRDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgLy/orrDlvZXpo5/nlKhcbiAgICAgICAgICAgICAgICAgICAgc2hpeW9uZ1tkYW55YW8ubmFpeWFvXSA9IG5lZWRDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgbmVlZENvdW50IC09IG5lZWRDb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVwc0FsbDogYW55ID0ge307XG4gICAgICAgIGZvciAobGV0IG5haXlhbyBpbiBzaGl5b25nKSB7XG4gICAgICAgICAgICAvL+mBjeWOhumjn+eUqOWKoOWxnuaAp1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGVwcykge1xuICAgICAgICAgICAgICAgIGlmIChlcHNBbGxba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGVwc0FsbFtrZXldID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXBzQWxsW2tleV0gKz0gKGVwc1trZXldICogc2hpeW9uZ1tuYWl5YW9dICogTnVtYmVyKG5haXlhbykpIC8gMTAwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQga2V5IGluIGVwc0FsbCkge1xuICAgICAgICAgICAgZXBzQWxsW2tleV0gPSBNYXRoLmZsb29yKGVwc0FsbFtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXBzQWxsO1xuICAgIH1cblxuICAgIC8v6K6h566X5byf5a2Q5oiY5paX6Ieq6Lqr5bGe5oCn77yI5LiN5YyF5ous57un5om/5Li76KeS55qE5bGe5oCn77yJXG4gICAgZXBfZGl6aUVwcyhzZXZCYWNrOiBYeXMuU2V2QmFjaywgZHpJZDogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBkaXppRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0gZ2FtZU1ldGhvZC5lcF9pbml0KCk7IC8v5Yid5aeL5YyW5bGe5oCnXG4gICAgICAgIGlmIChkeklkID09IG51bGwgfHwgZHpJZCA9PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGl6aUVwcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2ZnZHogPSBHYW1lY2ZnLmh1b2JhbkJhc2UuZ2V0SXRlbShkeklkKTtcbiAgICAgICAgbGV0IGRpemkgPSBzZXZCYWNrLmFjdERpWmlMaXN0Py5hPy5bZHpJZF07XG4gICAgICAgIGlmIChjZmdkeiA9PSBudWxsIHx8IGRpemkgPT0gbnVsbCB8fCBjZmdkei56aGFubGkgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGRpemlFcHM7XG4gICAgICAgIH1cbiAgICAgICAgLy/lvJ/lrZDln7rnoYDlsZ7mgKdcbiAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgY2ZnZHouZXBzKTtcbiAgICAgICAgbGV0IGNmZ1pob25nWnUgPSBHYW1lY2ZnLmh1b2Jhblpob25nenUuZ2V0SXRlbShjZmdkei5waW56aGksIGNmZ2R6Lnpob25nenUudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChjZmdaaG9uZ1p1ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBkaXppRXBzO1xuICAgICAgICB9XG4gICAgICAgIC8v6K6h566X5byf5a2Q5Y2H57qn5bGe5oCnXG4gICAgICAgIGxldCBsZXZlbEVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkaXppLmxldmVsOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRpemlMZXZlbCA9IEdhbWVjZmcuaHVvYmFuU2hlbmdqaS5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChkaXppTGV2ZWwgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV2ZWxFcHMgPSB0aGlzLmVwX21lcmdlKGxldmVsRXBzLCBkaXppTGV2ZWwuYXR0cik7XG4gICAgICAgIH1cbiAgICAgICAvL+S5nemchOWkqeaeouWvueW8n+WtkOWfuuehgOWxnuaAp+WKoOaIkFxuICAgICAgIGZvciAoY29uc3QgaGRjaWQgaW4gc2V2QmFjay5oZEppdVhpYW9UaWFuU2h1KSB7XG4gICAgICAgICAgICAvLyDmo4Dmn6XlsZ7mgKfmmK/lkKblrZjlnKhcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldkJhY2suaGRKaXVYaWFvVGlhblNodSwgaGRjaWQpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaml1eGlhbyA9IHNldkJhY2suaGRKaXVYaWFvVGlhblNodT8uW2hkY2lkXT8uYTtcbiAgICAgICAgICAgIGlmICghaml1eGlhbykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5qOA5p+l5LyZ5Ly05bGe5oCn5Yqg5oiQ5piv5ZCm5aSn5LqOMFxuICAgICAgICAgICAgaWYgKGppdXhpYW8uaHVvQmFuRXBzID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByYXRlID0gMSArIChqaXV4aWFvLmh1b0JhbkVwcyAvIDEwMCk7XG4gICAgICAgICAgICAgICAgbGV2ZWxFcHMgPSB0aGlzLmVwX0t2UmF0ZShsZXZlbEVwcywgcmF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgbGV2ZWxFcHMpO1xuICAgICAgICAvL+iuoeeul+W8n+WtkOWNh+aYn+eahOWfuuehgOWxnuaAp+WKoOaIkFxuICAgICAgICBsZXQgc3RhckVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkaXppLnN0YXI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGl6aVN0YXIgPSBHYW1lY2ZnLmh1b2JhblN0YXIuZ2V0SXRlbShjZmdkei5pZCwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChkaXppU3RhciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFyRXBzID0gdGhpcy5lcF9tZXJnZShzdGFyRXBzLCBkaXppU3Rhci5hdHRyMik7XG4gICAgICAgIH1cbiAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgc3RhckVwcyk7XG4gICAgICAgIC8v6K6h566X5byf5a2Q5aKD55WM5bGe5oCnXG4gICAgICAgIGxldCBqaW5namllRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRpemkuamluZ2ppZTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkaXppSmluZ2ppZSA9IEdhbWVjZmcuaHVvYmFuVHVwby5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChkaXppSmluZ2ppZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqaW5namllRXBzID0gdGhpcy5lcF9tZXJnZShqaW5namllRXBzLCBkaXppSmluZ2ppZS5hdHRyKTtcbiAgICAgICAgfVxuICAgICAgICBkaXppRXBzID0gdGhpcy5lcF9tZXJnZShkaXppRXBzLCBqaW5namllRXBzKTtcbiAgICAgICAgcmV0dXJuIGRpemlFcHM7XG4gICAgfVxuXG4gICAgLy/ojrflj5bmqKHlnZfnmoTlsZ7mgKfliqDmiJBcbiAgICBlcF9hY3Qoc2V2QmFjazogWHlzLlNldkJhY2ssIGtleTogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBlcHMgPSB0aGlzLmVwX2luaXQoKTtcbiAgICAgICAgaWYgKHNldkJhY2suYWN0RXBzICE9IG51bGwgJiYgc2V2QmFjay5hY3RFcHMuYSAhPSBudWxsICYmIHNldkJhY2suYWN0RXBzLmFba2V5XSAhPSBudWxsKSB7XG4gICAgICAgICAgICBlcHMgPSBnYW1lTWV0aG9kLmVwX21lcmdlKGVwcywgc2V2QmFjay5hY3RFcHMuYVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOino+aekOa0nuWkqSDnn7/ovabmlbDmja5cbiAgICAgKiBAcGFyYW0gY2FySW5mb1xuICAgICAqIEBwYXJhbSBub3dcbiAgICAgKiBAcmV0dXJucyBlZHRpbWUgLy/nprvnu5PmnZ8g6L+Y5pyJ5aSa6ZW/5pe26Ze0ICgwIOW3suWujOaIkCApKOacquW8gOWniyAtMSlcbiAgICAgKiBAcmV0dXJucyB3aW4gLy/og5zliKnmlrnmmK/osIEgMOWuiOaWuSAx5pS75pa5ICjmnKrlvIDlp4vpu5jorqQwKVxuICAgICAqIEByZXR1cm5zIG5vd3BvcyBub3dwb3MsIC8v5b2T5YmN5L2N572uXG4gICAgICovXG4gICAgZ2V0RG9uZ1RpYW5DYXIoY2FySW5mbzogWHlzLkFjdERvbmdUaWFuX0NhckluZm8gfCBhbnksIG5vdzogbnVtYmVyKTogWHlzLkFjdERvbmdUaWFuX0NhcnNob3cge1xuICAgICAgICBpZiAoY2FySW5mby5zdGltZSA8PSAwKSB7XG4gICAgICAgICAgICAvL+acquWQr+WKqFxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBlZHRpbWU6IC0xLCAvL+emu+e7k+adnyDov5jmnInlpJrplb/ml7bpl7RcbiAgICAgICAgICAgICAgICB3aW46IDAsIC8v6IOc5Yip5pa55piv6LCBIDDlrojmlrkgMeaUu+aWuSAo5pyq5byA5aeL6buY6K6kMClcbiAgICAgICAgICAgICAgICBub3dwb3M6IGNhckluZm8uZHBvcywgLy/lvZPliY3kvY3nva5cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy/ojrflj5bnn7/ovabphY3nva5cbiAgICAgICAgbGV0IGNhckNmZyA9IEdhbWVjZmcuZG9uZ3RpYW5DYXIuZ2V0SXRlbShjYXJJbmZvLmlkKTtcbiAgICAgICAgaWYgKGNhckNmZyA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBkb25ndGlhbkNhcl9lcnI6JHtjYXJJbmZvLmlkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBlZHRpbWU6IC0xLCAvL+emu+e7k+adnyDov5jmnInlpJrplb/ml7bpl7RcbiAgICAgICAgICAgICAgICB3aW46IDAsIC8v6IOc5Yip5pa55piv6LCBIDDlrojmlrkgMeaUu+aWuSAo5pyq5byA5aeL6buY6K6kMClcbiAgICAgICAgICAgICAgICBub3dwb3M6IGNhckluZm8uZHBvcywgLy/lvZPliY3kvY3nva5cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG51bSA9IDA7IC8v6IOc5Yip5pa55aSa5Ye65p2l55qE5Lq65pWwXG4gICAgICAgIGxldCBwb3cgPSAxOyAvL+iDnOWIqeaWueeKtuaAgeWAvFxuICAgICAgICBsZXQgbGVuZyA9IGNhckluZm8uZHBvczsgLy/ot53nprso5pys5pa56Led56a7KVxuICAgICAgICBsZXQgd2luOiAwIHwgMSA9IDA7XG4gICAgICAgIGxldCBmZXZDYXJkOiBib29sZWFuID0gZmFsc2U7IC8v6IOc5Yip5pa55piv5ZCm5pyJ57uI55Sf5Y2hXG4gICAgICAgIC8v5Lq65pWw5a+55q+UXG4gICAgICAgIGlmIChjYXJJbmZvLmhlLmtudW0ubGVuZ3RoID4gY2FySW5mby5teS5rbnVtLmxlbmd0aCkge1xuICAgICAgICAgICAgLy/ov5vmlLvmlrnog5zliKlcbiAgICAgICAgICAgIGRudW0gPSBjYXJJbmZvLmhlLmtudW0ubGVuZ3RoIC0gY2FySW5mby5teS5rbnVtLmxlbmd0aDtcbiAgICAgICAgICAgIHBvdyA9IGNhckluZm8uaGUucG93O1xuICAgICAgICAgICAgbGVuZyA9IGNhckNmZy5sZW5nc1syXSAtIGNhckluZm8uZHBvczsgLy/lj43lkJHot53nprtcbiAgICAgICAgICAgIHdpbiA9IDE7IC8v6L+b5pS75pa56IOc5YipXG4gICAgICAgICAgICBmZXZDYXJkID0gY2FySW5mby5oZS5mZXZDYXJkOyAvL+e7iOeUn+WNoVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy/pmLLlrojmlrnog5zliKlcbiAgICAgICAgICAgIGRudW0gPSBjYXJJbmZvLm15LmtudW0ubGVuZ3RoIC0gY2FySW5mby5oZS5rbnVtLmxlbmd0aDtcbiAgICAgICAgICAgIHBvdyA9IGNhckluZm8ubXkucG93O1xuICAgICAgICAgICAgZmV2Q2FyZCA9IGNhckluZm8ubXkuZmV2Q2FyZDsgLy/nu4jnlJ/ljaFcbiAgICAgICAgfVxuICAgICAgICAvL+WmguaenOS6uuaVsCA8PSAwICjpmLLlrojmlrnog5zliKkg57O75pWwMC43KSAg5bCx5b2T6Ziy5a6I5pa55pyJMC435Liq5Lq6XG4gICAgICAgIGRudW0gPSBNYXRoLm1heChkbnVtLCAwLjcpO1xuXG4gICAgICAgIC8v5ZOl5biD5p6X6YCf5bqm57O75pWwXG4gICAgICAgIGxldCB3a1ZlbCA9IDE7XG4gICAgICAgIGxldCBjZmdNYXRoID0gR2FtZWNmZy5tYXRoSW5mby5nZXRJdGVtKFwiZG9uZ3RpYW5fd2tWZWxcIik7XG4gICAgICAgIGlmIChjZmdNYXRoID09IG51bGwgfHwgY2ZnTWF0aC5wcmFtLmNvdW50ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGRvbmd0aWFuX3drVmVsYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3a1ZlbCA9IGNmZ01hdGgucHJhbS5jb3VudDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdGlsaXhzID0gMjAwOyAvL+agueaNruS9k+WKm+iOt+W+l+ezu+aVsFxuXG4gICAgICAgIC8v5oC76YCf5bqmXG4gICAgICAgIGxldCB2ZWwgPSAoZG51bSAqIHdrVmVsICogdGlsaXhzKSAvIDEwMDtcbiAgICAgICAgLy/nu4jnlJ/ljaEg6YCf5bqm5Yqg5oiQICs1JVxuICAgICAgICBsZXQgc2RhZGQgPSAxMDAwMDtcbiAgICAgICAgaWYgKGZldkNhcmQpIHtcbiAgICAgICAgICAgIHNkYWRkICs9IDE1MDA7XG4gICAgICAgIH1cbiAgICAgICAgdmVsID0gKHZlbCAqIHNkYWRkKSAvIDEwMDAwO1xuXG4gICAgICAgIC8v5oC755qE6ZyA6KaB5pe26Ze0IOiuoeeul+WFrOW8j1xuICAgICAgICBsZXQgYWxsVGltZSA9IE1hdGguY2VpbChsZW5nIC8gdmVsKTtcblxuICAgICAgICAvL+e7j+i/h+aXtumXtFxuICAgICAgICBsZXQgZHRpbWUgPSBub3cgLSBjYXJJbmZvLnN0aW1lO1xuICAgICAgICBpZiAoZHRpbWUgPj0gYWxsVGltZSkge1xuICAgICAgICAgICAgLy/lt7LlrozmiJBcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZWR0aW1lOiAwLCAvL+emu+e7k+adnyDov5jmnInlpJrplb/ml7bpl7QgKOacquW8gOWniyAtMSlcbiAgICAgICAgICAgICAgICB3aW46IHdpbiwgLy/og5zliKnmlrnmmK/osIEgMOWuiOaWuSAx5pS75pa5ICjmnKrlvIDlp4vpu5jorqQwKVxuICAgICAgICAgICAgICAgIG5vd3Bvczogd2luID8gY2FyQ2ZnLmxlbmdzWzJdIDogMCwgLy/lvZPliY3kvY3nva4g6Ziy5a6I5pa56IOc5YipIOWwseaYrzAg6L+b5pS75pa56IOc5YipIOWwseaYr+acgOWkp+WAvFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8v5pyq5a6M5oiQIOiuoeeulyDlvZPliY3kvY3nva7lgY/np7vph49cbiAgICAgICAgICAgIGxldCBkcG9zID0gZHRpbWUgKiB2ZWw7XG4gICAgICAgICAgICAvL+W9k+WJjeS9jee9rlxuICAgICAgICAgICAgbGV0IG5vd3BvcyA9IGNhckluZm8uZHBvcztcbiAgICAgICAgICAgIGlmICh3aW4gPiAwKSB7XG4gICAgICAgICAgICAgICAgbm93cG9zICs9IGRwb3M7XG4gICAgICAgICAgICAgICAgbm93cG9zID0gTWF0aC5mbG9vcihub3dwb3MpOyAvL+i/m+aUu+aWueiDnOWIqSDlj5bkvZnlgY/lkJHpmLLlrojmlrko5bCP5YC8KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub3dwb3MgLT0gZHBvcztcbiAgICAgICAgICAgICAgICBub3dwb3MgPSBNYXRoLmNlaWwobm93cG9zKTsgLy/pmLLlrojmlrnog5zliKkg5Y+W5L2Z5YGP5ZCR6L+b5pS75pa5KOWkp+WAvClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZWR0aW1lOiBhbGxUaW1lIC0gZHRpbWUsIC8v56a757uT5p2fIOi/mOacieWkmumVv+aXtumXtCAo5pyq5byA5aeLIC0xKVxuICAgICAgICAgICAgICAgIHdpbjogd2luLCAvL+iDnOWIqeaWueaYr+iwgSAw5a6I5pa5IDHmlLvmlrkgKOacquW8gOWni+m7mOiupDApXG4gICAgICAgICAgICAgICAgbm93cG9zOiBub3dwb3MsIC8v5b2T5YmN5L2N572uXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog56ug6IqC5oyC5py66K6h566XXG4gICAgICogQHBhcmFtIGFjdFpoYW5namllIOeroOiKguS/oeaBr1xuICAgICAqIEBwYXJhbSBuZXdUaW1lIOeOsOWcqOaXtumXtFxuICAgICAqIEBwYXJhbSB6ZmxldmVsIOmYteazleetiee6p1xuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgZ3VhamlJdGVtcyhcbiAgICAgICAgX2FjdFpoYW5namllOiBYeXMuQWN0WmhhbmdqaWUsXG4gICAgICAgIG5ld1RpbWU6IG51bWJlcixcbiAgICAgICAgemZsZXZlbDogbnVtYmVyXG4gICAgKTogeyBpdGVtczogWHlzLktpbmRJdGVtW107IHp5X2l0ZW1zOiBYeXMuS2luZEl0ZW1bXTsgZGpfaXRlbXM6IFh5cy5LaW5kSXRlbVtdOyBhY3RaaGFuZ2ppZTogWHlzLkFjdFpoYW5namllIH0ge1xuICAgICAgICBsZXQgYWN0WmhhbmdqaWU6IFh5cy5BY3RaaGFuZ2ppZSA9IHRoaXMub2JqQ29weShfYWN0WmhhbmdqaWUpO1xuICAgICAgICBsZXQgaXRlbXM6IFh5cy5LaW5kSXRlbVtdID0gW107IC8v5oyC5py65aWW5YqxKOaAuylcbiAgICAgICAgbGV0IHp5X2l0ZW1zOiBYeXMuS2luZEl0ZW1bXSA9IFtdOyAvL+aMguacuuWlluWKse+8iOmHkeW4gS/njqnlrrbnu4/pqowv6Zi15rOV57uP6aqM77yJXG4gICAgICAgIGxldCBkal9pdGVtczogWHlzLktpbmRJdGVtW10gPSBbXTsgLy/mjILmnLrlpZblirHvvIjpgZPlhbfvvIlcbiAgICAgICAgbGV0IGNmZ3pqID0gR2FtZWNmZy56aGFuZ2ppZUluZm8uZ2V0SXRlbShhY3RaaGFuZ2ppZS56amlkKTtcbiAgICAgICAgaWYgKGNmZ3pqID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYWN0WmhhbmdqaWU6IGFjdFpoYW5namllLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBpdGVtcyxcbiAgICAgICAgICAgICAgICB6eV9pdGVtczogenlfaXRlbXMsXG4gICAgICAgICAgICAgICAgZGpfaXRlbXM6IGRqX2l0ZW1zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY2ZnemouZ2pSd2RfenkpIHtcbiAgICAgICAgICAgIGxldCBjQXQ6IG51bWJlciA9IG5ld1RpbWUgLSBhY3RaaGFuZ2ppZS5nanRpbWU7XG4gICAgICAgICAgICBjQXQgPSBNYXRoLm1pbihjQXQsIGFjdFpoYW5namllLmdqTWF4ICogMzYwMCk7IC8vOOWwj+aXtuS4iumZkFxuICAgICAgICAgICAgbGV0IGNvdW50ID0gTWF0aC5mbG9vcihjQXQgLyAoaXRlbVszXSAvIGl0ZW1bMl0pKTtcbiAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKFtpdGVtWzBdLCBpdGVtWzFdLCBjb3VudF0pO1xuICAgICAgICAgICAgICAgIHp5X2l0ZW1zLnB1c2goW2l0ZW1bMF0sIGl0ZW1bMV0sIGNvdW50XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY2ZnemouZ2pSd2RfZGopIHtcbiAgICAgICAgICAgIGlmIChpdGVtWzRdICE9IG51bGwgJiYgaXRlbVs0XSA+IHpmbGV2ZWwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/mnKrovr7liLDpmLXms5XnrYnnuqdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhY3RaaGFuZ2ppZS5nalJ3ZF9kaltpdGVtWzBdLnRvU3RyaW5nKCldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhY3RaaGFuZ2ppZS5nalJ3ZF9kaltpdGVtWzBdLnRvU3RyaW5nKCldID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWN0WmhhbmdqaWUuZ2pSd2RfZGpbaXRlbVswXS50b1N0cmluZygpXVtpdGVtWzFdLnRvU3RyaW5nKCldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhY3RaaGFuZ2ppZS5nalJ3ZF9kaltpdGVtWzBdLnRvU3RyaW5nKCldW2l0ZW1bMV0udG9TdHJpbmcoKV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNBdDogbnVtYmVyID0gbmV3VGltZSAtIGFjdFpoYW5namllLmdqdGltZTtcbiAgICAgICAgICAgIGNBdCA9IE1hdGgubWluKGNBdCwgYWN0WmhhbmdqaWUuZ2pNYXggKiAzNjAwKSArIGFjdFpoYW5namllLmdqUndkX2RqW2l0ZW1bMF0udG9TdHJpbmcoKV1baXRlbVsxXS50b1N0cmluZygpXTtcblxuICAgICAgICAgICAgLy/ojrflvpfkuIDkuKrpgZPlhbcg6ZyA6KaB5aSa6ZW/5pe26Ze0XG4gICAgICAgICAgICBsZXQgb25lVGltZSA9IGl0ZW1bM10gLyBpdGVtWzJdO1xuICAgICAgICAgICAgbGV0IGNvdW50ID0gTWF0aC5mbG9vcihjQXQgLyBvbmVUaW1lKTtcbiAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKFtpdGVtWzBdLCBpdGVtWzFdLCBjb3VudF0pO1xuICAgICAgICAgICAgICAgIGRqX2l0ZW1zLnB1c2goW2l0ZW1bMF0sIGl0ZW1bMV0sIGNvdW50XSk7XG4gICAgICAgICAgICAgICAgYWN0WmhhbmdqaWUuZ2pSd2RfZGpbaXRlbVswXS50b1N0cmluZygpXVtpdGVtWzFdLnRvU3RyaW5nKCldID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjdFpoYW5namllLmdqUndkX2RqW2l0ZW1bMF0udG9TdHJpbmcoKV1baXRlbVsxXS50b1N0cmluZygpXSA9IE1hdGguZmxvb3IoY0F0ICUgb25lVGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgYWN0WmhhbmdqaWUuZ2p0aW1lID0gbmV3VGltZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFjdFpoYW5namllOiBhY3RaaGFuZ2ppZSxcbiAgICAgICAgICAgIC8vIGl0ZW1zOiBnYW1lTWV0aG9kLm1lcmdlQXJyKGl0ZW1zKSxcbiAgICAgICAgICAgIGl0ZW1zOiBpdGVtcyxcbiAgICAgICAgICAgIHp5X2l0ZW1zOiBnYW1lTWV0aG9kLm1lcmdlQXJyKHp5X2l0ZW1zKSxcbiAgICAgICAgICAgIGRqX2l0ZW1zOiBnYW1lTWV0aG9kLm1lcmdlQXJyKGRqX2l0ZW1zKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvL+W8guaIluWKoOino+WvhlxuICAgIHhvckVuY3J5cHQoc3RyOiBzdHJpbmcsIHg6Ym9vbGVhbiA9IHRydWUsIGtleTogc3RyaW5nID0gXCJ6Z3l4MjAyNDg4OFwiKSB7XG4gICAgICAgIGlmKCF4KXtcbiAgICAgICAgICAgIHJldHVybiBzdHJcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSkgXiBrZXkuY2hhckNvZGVBdChpICUga2V5Lmxlbmd0aCk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXCIpO1xuICAgIH1cblxuICAgIC8vIOeUqOmaj+acuuenjeWtkOiOt+WPluWkquWIneWPpOefv+WcsOWbvlxuICAgIGdldEd1S3VhbmdNYXAocmFuZE51bTogbnVtYmVyLCBjczogbnVtYmVyKTogeyBpZDogc3RyaW5nOyBocDogbnVtYmVyOyBpdGVtOiBudW1iZXJbXVtdOyBpY29uOiBzdHJpbmcgfVtdW10ge1xuICAgICAgICBsZXQgZ2V6aUNwOiBudW1iZXJbXSA9IE9iamVjdC52YWx1ZXMoZ2V6aSk7XG4gICAgICAgIGxldCBtYXA6IHtcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBocDogbnVtYmVyO1xuICAgICAgICAgICAgaXRlbTogbnVtYmVyW11bXTtcbiAgICAgICAgICAgIGljb246IHN0cmluZztcbiAgICAgICAgfVtdW10gPSBbXTsgLy8g5Zyw5Zu+5pWw5o2uXG4gICAgICAgIGxldCBzZW5kUmFuZCA9IG5ldyBTZWVkUmFuZChyYW5kTnVtKTtcbiAgICAgICAgc2VuZFJhbmQucmFuZG9tKCk7XG4gICAgICAgIGdlemlDcCA9IHNlbmRSYW5kLmFycmF5U2h1ZmZsZShnZXppQ3ApO1xuICAgICAgICBsZXQgaW5kZXggPSAxO1xuICAgICAgICBsZXQgdGNJbmZvO1xuICAgICAgICBsZXQgdHNJbmZvO1xuICAgICAgICBsZXQgdGNJbmZvTGFzdDtcbiAgICAgICAgbGV0IHRzSW5mb0xhc3Q7XG4gICAgICAgIHdoaWxlIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgIGxldCB0Y0luZm8yO1xuICAgICAgICAgICAgbGV0IHRzSW5mbzI7XG4gICAgICAgICAgICBpZiAodGNJbmZvID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0Y0luZm8yID0gR2FtZWNmZy50YWljaHVJbmZvLmdldEl0ZW0oaW5kZXgudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHNJbmZvID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0c0luZm8yID0gR2FtZWNmZy50YWljaHVUcy5nZXRJdGVtKGluZGV4LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRjSW5mbzIgJiYgdGNJbmZvMi5jc1swXSA8PSBjcyAmJiB0Y0luZm8yLmNzWzFdID49IGNzKSB7XG4gICAgICAgICAgICAgICAgdGNJbmZvID0gdGNJbmZvMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGNJbmZvMikge1xuICAgICAgICAgICAgICAgIHRjSW5mb0xhc3QgPSB0Y0luZm8yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRzSW5mbzIgJiYgdHNJbmZvMi5jc1swXSA8PSBjcyAmJiB0c0luZm8yLmNzWzFdID49IGNzKSB7XG4gICAgICAgICAgICAgICAgdHNJbmZvID0gdHNJbmZvMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHNJbmZvMikge1xuICAgICAgICAgICAgICAgIHRzSW5mb0xhc3QgPSB0c0luZm8yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRjSW5mbyAmJiB0c0luZm8pIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0Y0luZm8yID09IG51bGwgJiYgdHNJbmZvMiA9PSBudWxsICYmIHRjSW5mb0xhc3QgJiYgdHNJbmZvTGFzdCkge1xuICAgICAgICAgICAgICAgIHRjSW5mbyA9IGdhbWVNZXRob2Qub2JqQ29weSh0Y0luZm9MYXN0KTtcbiAgICAgICAgICAgICAgICB0c0luZm8gPSBnYW1lTWV0aG9kLm9iakNvcHkodHNJbmZvTGFzdCk7XG4gICAgICAgICAgICAgICAgbGV0IHRzX2NzX21pbiA9IHRzSW5mby5jc1swXTtcbiAgICAgICAgICAgICAgICBsZXQgdHNfY3NfbWF4ID0gdHNJbmZvLmNzWzFdO1xuICAgICAgICAgICAgICAgIGxldCBjaGEgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0c19jc19tYXggKyBjaGEgPCBjcykge1xuICAgICAgICAgICAgICAgICAgICBjaGEgPSB0c19jc19tYXggLSB0c19jc19taW47XG4gICAgICAgICAgICAgICAgICAgIHRzX2NzX21pbiA9IHRzX2NzX21heCArIDE7XG4gICAgICAgICAgICAgICAgICAgIHRzX2NzX21heCA9IHRzX2NzX21pbiArIGNoYTtcbiAgICAgICAgICAgICAgICAgICAgY2hhID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHNJbmZvLmNzID0gW3RzX2NzX21pbiwgdHNfY3NfbWF4XTtcbiAgICAgICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0Y0luZm8gPT0gbnVsbCB8fCB0c0luZm8gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgamxDczogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRzSW5mby5jc1swXTsgaSA8PSB0c0luZm8uY3NbMV07IGkrKykge1xuICAgICAgICAgICAgamxDcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBqbEMgPSBzZW5kUmFuZC5nZXRSYW5kQXJyMihqbENzLCAxKS5yZXN1bHRbMF07IC8vIOW9k+WJjeWxguaVsOWMuumXtCDlpZblirHlsYLmiYDlnKjlsYLmlbBcbiAgICAgICAgbGV0IGl0ZW1Db3VudDogeyBbaXRlbWlkOiBzdHJpbmddOiBudW1iZXJbXSB9ID0ge307IC8vIOWcsOWdl2lkOlvmoLzlrZDmlbDnu4RdXG4gICAgICAgIGxldCBzZCA9IHRjSW5mby5zZDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHNlbmRSYW5kLmdldFJhbmRBcnIyKGdlemlDcCwgc2RbaV1bMV0pO1xuICAgICAgICAgICAgZ2V6aUNwID0gcmVzdWx0LmFycjtcbiAgICAgICAgICAgIGl0ZW1Db3VudFtzZFtpXVswXS50b1N0cmluZygpXSA9IHJlc3VsdC5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGpsY051bTogbnVtYmVyIHwgbnVsbCA9IG51bGw7IC8vIOWlluWKseWxguaJgOWcqOihjOaVsCAwLTVcbiAgICAgICAgaWYgKGpsQyA9PSBjcykge1xuICAgICAgICAgICAgamxjTnVtID0gc2VuZFJhbmQuZ2V0UmFuZEFycjIoWzAsIDEsIDIsIDMsIDQsIDVdLCAxKS5yZXN1bHRbMF07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGl0ZW1Db3VudEtleXMgPSBPYmplY3Qua2V5cyhpdGVtQ291bnQpO1xuICAgICAgICBsZXQgbWFwTGluZToge1xuICAgICAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIGhwOiBudW1iZXI7XG4gICAgICAgICAgICBpdGVtOiBudW1iZXJbXVtdO1xuICAgICAgICAgICAgaWNvbjogc3RyaW5nO1xuICAgICAgICB9W10gPSBbXTtcbiAgICAgICAgbGV0IGlzSGFzID0gZmFsc2U7XG4gICAgICAgIGxldCB0aWxlc0luZm8xMDEgPSBHYW1lY2ZnLnRhaWNodVRpbGVzLmdldEl0ZW0oXCIxXCIpO1xuICAgICAgICBsZXQgdGlsZXNJbmZvMzAxID0gR2FtZWNmZy50YWljaHVUaWxlcy5nZXRJdGVtKFwiMzAxXCIpO1xuICAgICAgICBsZXQgbGluZSA9IDA7IC8vIOesrOWHoOihjFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdlemkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxpbmUgPSBNYXRoLmZsb29yKGkgLyA2KSArIDE7XG4gICAgICAgICAgICAvLyDlvIDlp4vnu5jliLblnLDlm75cbiAgICAgICAgICAgIGlmIChpICUgNiA9PSAwICYmIG1hcExpbmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG1hcC5wdXNoKG1hcExpbmUpO1xuICAgICAgICAgICAgICAgIG1hcExpbmUgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzSGFzID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgenVvamlhSW5mbyA9IEdhbWVjZmcudGFpY2h1WnVvamlhLmdldEl0ZW0oY3MudG9TdHJpbmcoKSwgbGluZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmICh6dW9qaWFJbmZvICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpc0hhcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWQgb2YgenVvamlhSW5mby5pdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0aWxlc0luZm8gPSBHYW1lY2ZnLnRhaWNodVRpbGVzLmdldEl0ZW0oaWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlc0luZm8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGluZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdGlsZXNJbmZvLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwOiB0aWxlc0luZm8uaHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogdGlsZXNJbmZvLml0bWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogdGlsZXNJbmZvLmljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcExpbmUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkgKz0gNTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBpdGVtQ291bnRLZXlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQ291bnRbaXRlbUNvdW50S2V5c1trXV0uaW5kZXhPZihpKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbGVzSW5mbyA9IEdhbWVjZmcudGFpY2h1VGlsZXMuZ2V0SXRlbShpdGVtQ291bnRLZXlzW2tdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aWxlc0luZm8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcExpbmUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpdGVtQ291bnRLZXlzW2tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocDogdGlsZXNJbmZvLmhwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiB0aWxlc0luZm8uaXRtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogdGlsZXNJbmZvLmljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIYXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0hhcykge1xuICAgICAgICAgICAgICAgIGlmIChjcyA9PSAxICYmIGkgPCA2KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlc0luZm8xMDEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGluZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHA6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogdGlsZXNJbmZvMTAxLmljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlc0luZm8xMDEgJiYgbWFwLmxlbmd0aCA+IDAgJiYgbWFwW21hcC5sZW5ndGggLSAxXVttYXBMaW5lLmxlbmd0aF0uaHAgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5aaC5p6c5LiK5LiA5bGC5piv56m65qC8IOWKoOS4gOS4quacqOWdl1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGluZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdGlsZXNJbmZvMTAxLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwOiB0aWxlc0luZm8xMDEuaHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogdGlsZXNJbmZvMTAxLml0bWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogdGlsZXNJbmZvMTAxLmljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcExpbmUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXBMaW5lLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1hcC5wdXNoKG1hcExpbmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChqbGNOdW0gIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRzSW5mby5zZC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAobGVuICE9IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHNJbmZvLnNkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgJSA2ID09IDAgJiYgaSAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGpsY051bSArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGlsZXNJbmZvMzAxICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwW2psY051bV1baSAlIDZdID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRzSW5mby5zZFtpXS5sZW5ndGggPT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogXCIzMDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBpID09IDAgPyB0aWxlc0luZm8zMDEuaWNvbiA6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogXCIzMDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHA6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IFt0c0luZm8uc2RbaV1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBpID09IDAgPyB0aWxlc0luZm8zMDEuaWNvbiA6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDlpZblirHlsYLkuIvkuIDlsYIg5pW06KGM5LiN6IO95Li656m6XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpICUgNiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGpsY051bSArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWFwW2psY051bV1baSAlIDZdLmhwIDw9IDAgJiYgdGlsZXNJbmZvMTAxICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g6L2s5oiQ55+z5aS0XG4gICAgICAgICAgICAgICAgICAgIG1hcFtqbGNOdW1dW2kgJSA2XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aWxlc0luZm8xMDEuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBocDogdGlsZXNJbmZvMTAxLmhwLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogdGlsZXNJbmZvMTAxLml0bWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiB0aWxlc0luZm8xMDEuaWNvbixcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmoLnmja7njqnlrrbpgInnmoTmtYHmtL7mjqjojZDpmLXlrrlcbiAgICAgKiBAcGFyYW0gdHlwZSDnjqnlrrbpooTpgInmtYHmtL5cbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHR1aWppYW4oc2V2QmFjazogWHlzLlNldkJhY2ssIHR5cGU6IHN0cmluZykge1xuICAgICAgICAvL+eUqOS6juiusOW9leWTquS6m+S9jee9ruiiq+S9v+eUqOS6hlxuICAgICAgICBsZXQgZ2V6aTogc3RyaW5nW10gPSBbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCIsIFwiNVwiLCBcIjZcIiwgXCI3XCIsIFwiOFwiLCBcIjlcIl07XG4gICAgICAgIGxldCB0dWlqaWFuOiB7IFtnemlkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgICAgICAvL+WFiOetm+mAieWHuuespuWQiOimgeaxgueahOW8n+WtkGlk5YiX6KGoXG4gICAgICAgIGxldCBkekxpc3QxOiBhbnlbXSA9IFtdOyAvL+WJjeaOklxuICAgICAgICBsZXQgZHpMaXN0MjogYW55W10gPSBbXTsgLy/kuK3mjpJcbiAgICAgICAgbGV0IGR6TGlzdDM6IGFueVtdID0gW107IC8v5ZCO5o6SXG4gICAgICAgIGxldCB3YW5iaWFuMTogYW55W10gPSBbXTsgLy/kuIflj5jmtYHliY3mjpJcbiAgICAgICAgbGV0IHdhbmJpYW4yOiBhbnlbXSA9IFtdOyAvL+S4h+WPmOa1geS4reaOklxuICAgICAgICBsZXQgd2FuYmlhbjM6IGFueVtdID0gW107IC8v5LiH5Y+Y5rWB5ZCO5o6SXG4gICAgICAgIGxldCBvdGhlcjE6IGFueVtdID0gW107IC8v5YW25LuW5YmN5o6SXG4gICAgICAgIGxldCBvdGhlcjI6IGFueVtdID0gW107IC8v5YW25LuW5Lit5o6SXG4gICAgICAgIGxldCBvdGhlcjM6IGFueVtdID0gW107IC8v5YW25LuW5ZCO5o6SXG4gICAgICAgIGxldCBhY3REaVppTGlzdDogYW55ID0ge307XG4gICAgICAgIGlmIChzZXZCYWNrLmFjdERpWmlMaXN0ICE9IG51bGwgJiYgc2V2QmFjay5hY3REaVppTGlzdC5hICE9IG51bGwpIHtcbiAgICAgICAgICAgIGFjdERpWmlMaXN0ID0gc2V2QmFjay5hY3REaVppTGlzdC5hO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGR6aWQgaW4gYWN0RGlaaUxpc3QpIHtcbiAgICAgICAgICAgIGxldCBjZmcgPSBHYW1lY2ZnLmh1b2JhbkJhc2UuZ2V0SXRlbShhY3REaVppTGlzdFtkemlkXS5pZCk7XG4gICAgICAgICAgICBpZiAoY2ZnID09IG51bGwgfHwgY2ZnLnNob3cgPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy/kuI3mmK/pooTpgInmtYHmtL7lkozkuIflj5jmtYHkuI3nrKblkIjmnaHku7ZcbiAgICAgICAgICAgIGlmIChjZmcubGl1cGFpICE9IHR5cGUgJiYgY2ZnLmxpdXBhaSAhPSBcIjVcIikge1xuICAgICAgICAgICAgICAgIGlmIChjZmcuZGluZ3dlaSA9PSBcIjFcIikge1xuICAgICAgICAgICAgICAgICAgICBvdGhlcjEucHVzaChkemlkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNmZy5kaW5nd2VpID09IFwiMlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIG90aGVyMi5wdXNoKGR6aWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ZnLmRpbmd3ZWkgPT0gXCIzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3RoZXIzLnB1c2goZHppZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNmZy5kaW5nd2VpID09IFwiMVwiICYmIGNmZy5saXVwYWkgPT0gdHlwZSkge1xuICAgICAgICAgICAgICAgIGR6TGlzdDEucHVzaChkemlkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ZnLmRpbmd3ZWkgPT0gXCIyXCIgJiYgY2ZnLmxpdXBhaSA9PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgZHpMaXN0Mi5wdXNoKGR6aWQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjZmcuZGluZ3dlaSA9PSBcIjNcIiAmJiBjZmcubGl1cGFpID09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICBkekxpc3QzLnB1c2goZHppZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNmZy5kaW5nd2VpID09IFwiMVwiICYmIGNmZy5saXVwYWkgPT0gXCI1XCIpIHtcbiAgICAgICAgICAgICAgICB3YW5iaWFuMS5wdXNoKGR6aWQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjZmcuZGluZ3dlaSA9PSBcIjJcIiAmJiBjZmcubGl1cGFpID09IFwiNVwiKSB7XG4gICAgICAgICAgICAgICAgd2FuYmlhbjIucHVzaChkemlkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ZnLmRpbmd3ZWkgPT0gXCIzXCIgJiYgY2ZnLmxpdXBhaSA9PSBcIjVcIikge1xuICAgICAgICAgICAgICAgIHdhbmJpYW4zLnB1c2goZHppZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHB1c2gxID0gMDsgLy/orrDlvZXliY3mjpLmlL7kuoblh6DkuKrlvJ/lrZBcbiAgICAgICAgbGV0IHB1c2gyID0gMDsgLy/orrDlvZXkuK3mjpLmlL7kuoblh6DkuKrlvJ/lrZBcbiAgICAgICAgbGV0IHB1c2gzID0gMDsgLy/orrDlvZXlkI7mjpLmlL7kuoblh6DkuKrlvJ/lrZBcbiAgICAgICAgLy/pgInlh7ox5Liq5YmN5o6SM+S4quS4reaOkjLkuKrlkI7mjpIg5LyY5YWI6YCJ5pys5rWB5rS+77yM54S25ZCO6YCJ5LiH5Y+Y5rWB77yM5ZCm5YiZ6YCJ5omA5pyJ5byf5a2Q6YeM6Z2i5oiY5Yqb5pyA6auY55qEXG4gICAgICAgIGlmIChkekxpc3QxLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8v5aaC5p6c5piv5Y+q5pyJ5LiA5Liq5bCx55u05o6l6L+b5Y67XG4gICAgICAgICAgICBpZiAoZHpMaXN0MS5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgIHR1aWppYW5bXCIxXCJdID0gZHpMaXN0MVswXTtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBnZXppLmluZGV4T2YoXCIxXCIpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlemkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHVzaDEgKz0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1heFBvd2VyID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkemlkIG9mIGR6TGlzdDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvd2VyID0gdGhpcy5lcF9wb3dlcl9kaXppKHNldkJhY2ssIGR6aWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG93ZXIgPiBtYXhQb3dlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4UG93ZXIgPSBwb3dlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR1aWppYW5bXCIxXCJdID0gZHppZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGdlemkuaW5kZXhPZihcIjFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlemkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2gxICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2FuYmlhbjEubGVuZ3RoID4gMCAmJiBwdXNoMSA8IDEpIHtcbiAgICAgICAgICAgIC8v5rKh5pyJ5bCx6YGN5Y6G5LiH5Y+Y5rWBXG4gICAgICAgICAgICAvL+WmguaenOaYr+WPquacieS4gOS4quWwseebtOaOpei/m+WOu1xuICAgICAgICAgICAgaWYgKHdhbmJpYW4xLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgdHVpamlhbltcIjFcIl0gPSB3YW5iaWFuMVswXTtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBnZXppLmluZGV4T2YoXCIxXCIpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlemkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHVzaDEgKz0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1heFBvd2VyID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkemlkIG9mIHdhbmJpYW4xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3dlciA9IHRoaXMuZXBfcG93ZXJfZGl6aShzZXZCYWNrLCBkemlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvd2VyID4gbWF4UG93ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvd2VyID0gcG93ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0dWlqaWFuW1wiMVwiXSA9IGR6aWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBnZXppLmluZGV4T2YoXCIxXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXppLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoMSArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8v5pS+5Lit5o6S55qEXG4gICAgICAgIGlmIChkekxpc3QyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8v5aaC5p6c5piv5bCP5LqO562J5LqOM+S4quWwseebtOaOpeaUvui/m+WOu1xuICAgICAgICAgICAgaWYgKGR6TGlzdDIubGVuZ3RoIDw9IDMpIHtcbiAgICAgICAgICAgICAgICBsZXQgeGIgPSA0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZHpMaXN0Mi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0dWlqaWFuWyh4YiArIGkpLnRvU3RyaW5nKCldID0gZHpMaXN0MltpXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gZ2V6aS5pbmRleE9mKCh4YiArIGkpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V6aS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHB1c2gyICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmVlZER6aWQgPSBkekxpc3QyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGR6aWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGR6aWQsIHBvd2VyOiB0aGlzLmVwX3Bvd2VyX2Rpemkoc2V2QmFjaywgZHppZCkgfTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIucG93ZXIgLSBhLnBvd2VyKSAvLyDmjInmiJjlipvku47lpKfliLDlsI/mjpLluo9cbiAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsIDMpIC8vIOmAieWHuuaImOWKm+acgOmrmOeahOS4ieS4quW8n+WtkFxuICAgICAgICAgICAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmR6aWQpOyAvLyDlj6rlj5YgZHppZFxuICAgICAgICAgICAgICAgIGxldCB4YiA9IDQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdHVpamlhblsoeGIgKyBpKS50b1N0cmluZygpXSA9IG5lZWREemlkW2ldO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBnZXppLmluZGV4T2YoKHhiICsgaSkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXppLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHVzaDIgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2FuYmlhbjIubGVuZ3RoID4gMCAmJiBwdXNoMiA8IDMpIHtcbiAgICAgICAgICAgIC8v5byf5a2Q5LiN5ruh6LazM+S4quWwsemBjeWOhuS4h+WPmOa1gVxuICAgICAgICAgICAgbGV0IG5lZWREemlkID0gd2FuYmlhbjJcbiAgICAgICAgICAgICAgICAubWFwKChkemlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGR6aWQsIHBvd2VyOiB0aGlzLmVwX3Bvd2VyX2Rpemkoc2V2QmFjaywgZHppZCkgfTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnBvd2VyIC0gYS5wb3dlcikgLy8g5oyJ5oiY5Yqb5LuO5aSn5Yiw5bCP5o6S5bqPXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIDMgLSBwdXNoMikgLy8g6YCJ5Ye65oiY5Yqb5pyA6auY55qE6ZyA6KaB55qE5byf5a2Q5pWw6YePXG4gICAgICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5kemlkKTsgLy8g5Y+q5Y+WIGR6aWRcbiAgICAgICAgICAgIGxldCB4YiA9IDQgKyBwdXNoMjtcbiAgICAgICAgICAgIGxldCBjcyA9IDIgLSBwdXNoMztcbiAgICAgICAgICAgIGNzID0gTWF0aC5taW4oY3MsIHdhbmJpYW4yLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNzOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0dWlqaWFuWyh4YiArIGkpLnRvU3RyaW5nKCldID0gbmVlZER6aWRbaV07XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gZ2V6aS5pbmRleE9mKCh4YiArIGkpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlemkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHVzaDIgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL+aUvuWQjuaOkueahFxuICAgICAgICBpZiAoZHpMaXN0My5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvL+WmguaenOaYr+Wwj+S6juetieS6jjLkuKrlsLHnm7TmjqXmlL7ov5vljrtcbiAgICAgICAgICAgIGlmIChkekxpc3QzLmxlbmd0aCA8PSAyKSB7XG4gICAgICAgICAgICAgICAgbGV0IHhiID0gNztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGR6TGlzdDMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdHVpamlhblsoeGIgKyBpKS50b1N0cmluZygpXSA9IGR6TGlzdDNbaV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGdlemkuaW5kZXhPZigoeGIgKyBpKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlemkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwdXNoMyArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG5lZWREemlkID0gZHpMaXN0M1xuICAgICAgICAgICAgICAgICAgICAubWFwKChkemlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkemlkLCBwb3dlcjogdGhpcy5lcF9wb3dlcl9kaXppKHNldkJhY2ssIGR6aWQpIH07XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnBvd2VyIC0gYS5wb3dlcikgLy8g5oyJ5oiY5Yqb5LuO5aSn5Yiw5bCP5o6S5bqPXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCAyKSAvLyDpgInlh7rmiJjlipvmnIDpq5jnmoQy5Liq5byf5a2QXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0uZHppZCk7IC8vIOWPquWPliBkemlkXG4gICAgICAgICAgICAgICAgbGV0IHhiID0gNztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0dWlqaWFuWyh4YiArIGkpLnRvU3RyaW5nKCldID0gbmVlZER6aWRbaV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGdlemkuaW5kZXhPZigoeGIgKyBpKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlemkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwdXNoMyArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh3YW5iaWFuMy5sZW5ndGggPiAwICYmIHB1c2gzIDwgMikge1xuICAgICAgICAgICAgLy/lvJ/lrZDkuI3mu6HotrMy5Liq5bCx6YGN5Y6G5LiH5Y+Y5rWBXG4gICAgICAgICAgICBsZXQgbmVlZER6aWQgPSB3YW5iaWFuM1xuICAgICAgICAgICAgICAgIC5tYXAoKGR6aWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZHppZCwgcG93ZXI6IHRoaXMuZXBfcG93ZXJfZGl6aShzZXZCYWNrLCBkemlkKSB9O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIucG93ZXIgLSBhLnBvd2VyKSAvLyDmjInmiJjlipvku47lpKfliLDlsI/mjpLluo9cbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgMiAtIHB1c2gzKSAvLyDpgInlh7rmiJjlipvmnIDpq5jnmoTpnIDopoHnmoTlvJ/lrZDmlbDph49cbiAgICAgICAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmR6aWQpOyAvLyDlj6rlj5YgZHppZFxuICAgICAgICAgICAgbGV0IHhiID0gNyArIHB1c2gzO1xuICAgICAgICAgICAgbGV0IGNzID0gMiAtIHB1c2gzO1xuICAgICAgICAgICAgY3MgPSBNYXRoLm1pbihjcywgd2FuYmlhbjMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3M7IGkrKykge1xuICAgICAgICAgICAgICAgIHR1aWppYW5bKHhiICsgaSkudG9TdHJpbmcoKV0gPSBuZWVkRHppZFtpXTtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBnZXppLmluZGV4T2YoKHhiICsgaSkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V6aS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwdXNoMyArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8v5aaC5p6c6YGN5Y6G5ZCM5rS+5ZKM5LiH5Y+Y5rWB6YO95rKh5pyJ56ym5ZCI55qE5bCx5LyY5YWI5LuO5ZCM56uZ5L2N5pyA6auY5oiY5Yqb6YeM6Z2i5ou/XG4gICAgICAgIGlmIChwdXNoMSA8IDEpIHtcbiAgICAgICAgICAgIC8v6YCJ5oup55qE5rWB5rS+5ZKM5LiH5Y+Y5rWB6YO95rKh5pyJ5YmN5o6S5byf5a2Q5bCx5LuO5YW25LuW5YmN5o6S5byf5a2Q6YeM6Z2i5ou/5oiY5Yqb5pyA6auY55qEXG4gICAgICAgICAgICBsZXQgbmVlZER6aWQgPSBvdGhlcjFcbiAgICAgICAgICAgICAgICAubWFwKChkemlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGR6aWQsIHBvd2VyOiB0aGlzLmVwX3Bvd2VyX2Rpemkoc2V2QmFjaywgZHppZCkgfTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnBvd2VyIC0gYS5wb3dlcikgLy8g5oyJ5oiY5Yqb5LuO5aSn5Yiw5bCP5o6S5bqPXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIDEpIC8vIOmAieWHuuaImOWKm+acgOmrmOeahOmcgOimgeeahOW8n+WtkOaVsOmHj1xuICAgICAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0uZHppZCk7IC8vIOWPquWPliBkemlkXG4gICAgICAgICAgICBsZXQgeGIgPSAxO1xuICAgICAgICAgICAgbGV0IGNzID0gTWF0aC5taW4oMSwgb3RoZXIxLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNzOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0dWlqaWFuWyh4YiArIGkpLnRvU3RyaW5nKCldID0gbmVlZER6aWRbaV07XG5cbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBnZXppLmluZGV4T2YoKHhiICsgaSkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V6aS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL+aKiueUqOaOieeahOW8n+WtkOWJlOmZpFxuICAgICAgICAgICAgICAgIGxldCBpbmRleDEgPSBvdGhlcjEuaW5kZXhPZihuZWVkRHppZFtpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4MSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIG90aGVyMS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHVzaDIgPCAzKSB7XG4gICAgICAgICAgICAvL+mAieaLqeeahOa1gea0vuWSjOS4h+WPmOa1gemDveayoeacieWJjeaOkuW8n+WtkOWwseS7juWFtuS7luWJjeaOkuW8n+WtkOmHjOmdouaLv+aImOWKm+acgOmrmOeahFxuICAgICAgICAgICAgbGV0IG5lZWREemlkID0gb3RoZXIyXG4gICAgICAgICAgICAgICAgLm1hcCgoZHppZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkemlkLCBwb3dlcjogdGhpcy5lcF9wb3dlcl9kaXppKHNldkJhY2ssIGR6aWQpIH07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYi5wb3dlciAtIGEucG93ZXIpIC8vIOaMieaImOWKm+S7juWkp+WIsOWwj+aOkuW6j1xuICAgICAgICAgICAgICAgIC5zbGljZSgwLCAzIC0gcHVzaDIpIC8vIOmAieWHuuaImOWKm+acgOmrmOeahOmcgOimgeeahOW8n+WtkOaVsOmHj1xuICAgICAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0uZHppZCk7IC8vIOWPquWPliBkemlkXG4gICAgICAgICAgICBsZXQgeGIgPSA0ICsgcHVzaDI7XG4gICAgICAgICAgICBsZXQgY3MgPSBNYXRoLm1pbigzIC0gcHVzaDIsIG90aGVyMi5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdHVpamlhblsoeGIgKyBpKS50b1N0cmluZygpXSA9IG5lZWREemlkW2ldO1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGdlemkuaW5kZXhPZigoeGIgKyBpKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICBnZXppLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8v5oqK55So5o6J55qE5byf5a2Q5YmU6ZmkXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4MSA9IG90aGVyMi5pbmRleE9mKG5lZWREemlkW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXgxID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgb3RoZXIyLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwdXNoMyA8IDIpIHtcbiAgICAgICAgICAgIC8v6YCJ5oup55qE5rWB5rS+5ZKM5LiH5Y+Y5rWB6YO95rKh5pyJ5YmN5o6S5byf5a2Q5bCx5LuO5YW25LuW5YmN5o6S5byf5a2Q6YeM6Z2i5ou/5oiY5Yqb5pyA6auY55qEXG4gICAgICAgICAgICBsZXQgbmVlZER6aWQgPSBvdGhlcjNcbiAgICAgICAgICAgICAgICAubWFwKChkemlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGR6aWQsIHBvd2VyOiB0aGlzLmVwX3Bvd2VyX2Rpemkoc2V2QmFjaywgZHppZCkgfTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnBvd2VyIC0gYS5wb3dlcikgLy8g5oyJ5oiY5Yqb5LuO5aSn5Yiw5bCP5o6S5bqPXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIDIgLSBwdXNoMykgLy8g6YCJ5Ye65oiY5Yqb5pyA6auY55qE6ZyA6KaB55qE5byf5a2Q5pWw6YePXG4gICAgICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5kemlkKTsgLy8g5Y+q5Y+WIGR6aWRcbiAgICAgICAgICAgIGxldCB4YiA9IDcgKyBwdXNoMztcbiAgICAgICAgICAgIGxldCBjcyA9IE1hdGgubWluKDIgLSBwdXNoMywgb3RoZXIzLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNzOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0dWlqaWFuWyh4YiArIGkpLnRvU3RyaW5nKCldID0gbmVlZER6aWRbaV07XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gZ2V6aS5pbmRleE9mKCh4YiArIGkpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlemkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy/miornlKjmjonnmoTlvJ/lrZDliZTpmaRcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXgxID0gb3RoZXIzLmluZGV4T2YobmVlZER6aWRbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleDEgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICBvdGhlcjMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy/lpoLmnpzov5jmmK/kuI3otrM25Liq5byf5a2Q5bCx55u05o6l5ou/5oiY5Yqb5pyA6auY55qE5YmN5Yeg5Liq5LuO56m65L2N5byA5aeL5pS+XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0dWlqaWFuKS5sZW5ndGggPCA2KSB7XG4gICAgICAgICAgICAvL+aKiuWFtuS9meeahOW8n+WtkOWQiOW5tlxuICAgICAgICAgICAgbGV0IG90aGVyOiBhbnlbXSA9IHRoaXMuYWRkQXJyKG90aGVyMSwgb3RoZXIyKTtcbiAgICAgICAgICAgIG90aGVyID0gdGhpcy5hZGRBcnIob3RoZXIsIG90aGVyMyk7XG4gICAgICAgICAgICBsZXQgbmVlZER6aWQgPSBvdGhlclxuICAgICAgICAgICAgICAgIC5tYXAoKGR6aWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZHppZCwgcG93ZXI6IHRoaXMuZXBfcG93ZXJfZGl6aShzZXZCYWNrLCBkemlkKSB9O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIucG93ZXIgLSBhLnBvd2VyKSAvLyDmjInmiJjlipvku47lpKfliLDlsI/mjpLluo9cbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgNiAtIE9iamVjdC5rZXlzKHR1aWppYW4pLmxlbmd0aCkgLy8g6YCJ5Ye65oiY5Yqb5pyA6auY55qE6ZyA6KaB55qE5byf5a2Q5pWw6YePXG4gICAgICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5kemlkKTsgLy8g5Y+q5Y+WIGR6aWRcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmVlZER6aWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvL+i/meS4quaXtuWAmeeUqOaOieeahOagvOWtkOmDveW3sue7j+WIoOaOieS6hu+8jOaJgOS7peebtOaOpeWPluWwseWPr+S7peS6hlxuICAgICAgICAgICAgICAgIHR1aWppYW5bZ2V6aVtpXV0gPSBuZWVkRHppZFtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHVpamlhbjtcbiAgICB9XG5cbiAgICBnZXRTZWVkUmFuZChzZWVkOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWVkUmFuZChzZWVkKTtcbiAgICB9XG59XG5cbi8v6L6T5Ye6XG5leHBvcnQgbGV0IGdhbWVNZXRob2Q6IEdhbWVNZXRob2QgPSBuZXcgR2FtZU1ldGhvZCgpO1xuXG4vL+enjeWtkOmaj+aculxuZXhwb3J0IGNsYXNzIFNlZWRSYW5kIHtcbiAgICBzZWVkOiBudW1iZXI7XG4gICAgY29uc3RydWN0b3Ioc2VlZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2VlZCA9IHNlZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5qC45b+D5pa55rOVIOi+k+WHuuS4gOS4quWwj+aVsFxuICAgICAqL1xuICAgIHJhbmRvbSgpOiBudW1iZXIge1xuICAgICAgICB0aGlzLnNlZWQgPSAodGhpcy5zZWVkICogOTMwMSArIDQ5Mjk3KSAlIDIzMzI4MDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VlZCAvIDIzMzI4MC4wO1xuICAgIH1cbiAgICByYW5kb20yKHNlZWQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHNlZWQgPSAoc2VlZCAqIDkzMDEgKyA0OTI5NykgJSAyMzMyODA7XG4gICAgICAgIHJldHVybiBzZWVkIC8gMjMzMjgwLjA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5oyJ54Wn6IyD5Zu06I635Y+W5LiA5Liq6ZqP5py65pWwXG4gICAgICovXG4gICAgcmFuZChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgX3JkID0gTWF0aC5yb3VuZCgobWF4IC0gbWluICsgMSkgKiB0aGlzLnJhbmRvbSgpIC0gMC41KSArIG1pbjtcbiAgICAgICAgcmV0dXJuIF9yZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpmo/mnLrmjpLliJfkuIDkuKrmlbDnu4RcbiAgICAgKi9cbiAgICBhcnJheVNodWZmbGUoYXJyOiBhbnlbXSkge1xuICAgICAgICBsZXQgbGVuID0gYXJyLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMucmFuZCgwLCBsZW4gLSBpIC0gMSk7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IGFycltpbmRleF07XG4gICAgICAgICAgICBhcnJbaW5kZXhdID0gYXJyW2xlbiAtIGkgLSAxXTtcbiAgICAgICAgICAgIGFycltsZW4gLSBpIC0gMV0gPSB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6ZqP5py66I635Y+W5pWw57uE5YWD57SgXG4gICAgICovXG4gICAgZ2V0UmFuZEFycjxUPihfYXJyOiBUW10sIG51bTogbnVtYmVyKTogVFtdIHtcbiAgICAgICAgbGV0IGFyciA9IGdhbWVNZXRob2Qub2JqQ29weShfYXJyKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBudW0gPSBNYXRoLm1pbihudW0sIGFyci5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmFuID0gTWF0aC5mbG9vcih0aGlzLnJhbmRvbSgpICogKGFyci5sZW5ndGggLSBpKSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChhcnJbcmFuXSk7XG4gICAgICAgICAgICBhcnJbcmFuXSA9IGFyclthcnIubGVuZ3RoIC0gaSAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOmaj+acuuiOt+WPluaVsOe7hOWFg+e0oCBzZWVk44CBX2FycuOAgW51beS4jeWPmCDpmo/mnLrlh7rnmoTmlbDmja7lrozlhajkuIDoh7RcbiAgICAgKi9cbiAgICBnZXRSYW5kQXJyMjxUPihfYXJyOiBUW10sIG51bTogbnVtYmVyKSB7XG4gICAgICAgIGxldCBhcnI6IFRbXSA9IGdhbWVNZXRob2Qub2JqQ29weShfYXJyKTtcbiAgICAgICAgbGV0IHJlc3VsdDogVFtdID0gW107XG4gICAgICAgIG51bSA9IE1hdGgubWluKG51bSwgYXJyLmxlbmd0aCk7XG4gICAgICAgIGxldCBzZWVkID0gdGhpcy5yYW5kb20yKHRoaXMuc2VlZCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtOyBpKyspIHtcbiAgICAgICAgICAgIHNlZWQgPSB0aGlzLnJhbmRvbTIoc2VlZCk7XG4gICAgICAgICAgICBsZXQgcmFuID0gTWF0aC5mbG9vcihzZWVkICogYXJyLmxlbmd0aCk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChhcnJbcmFuXSk7XG4gICAgICAgICAgICBhcnIuc3BsaWNlKHJhbiwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiByZXN1bHQsIGFycjogYXJyIH07XG4gICAgfVxufVxuIl19