(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/battle/battle_loop.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, '5a5b5z2plxG9L+PaGlrhlMS', 'battle_loop'); // Scripts/mod/battle/battle_loop.js "use strict"; // -------------------------------------------------------------------- // @author: shiraho@syg.com(必填, 创建模块的人员) // @description: // 假战斗单位生成器 //
Create: new Date().toISOString() // -------------------------------------------------------------------- window.BattleLoop = { /** * 初始化对象生成器 * @param {*} data */ init: function init(data) { this.next_target_type_pos = 1; this.next_target_type_kill = 2; this.talk_cd = 0; this.col_info = [0, 1, 2, 3, 1, 2, 3, 1, 2, 3], this.col_pos_info = [[], [1, 4, 7], [2, 5, 8], [3, 6, 9]], this.idx = 0; this.data = data; this.a_objects = {}; this.target_objects = {}; // this.icon_res_list = [5,2,7]; // this.icon_idx = 0; this.randWaveTargets(); this.b_formation_type = data.b_formation_type || 1; this.now_num = 0; this.max_num = Math.min(data.partner_list.length, 3); this.needPlays = {}; this.last_pos = 0; this.last_time = 0; this.a_col = {}; this.target_play = {}; this.cd_time = 1; if (data.partner_list.length < 2) { this.cd_time = 2; } var config = Config.dungeon_data.data_drama_dungeon_info[data.dun_bid.toString()]; this.talk_list = config.talk_ids; var play = {}; play.objects = {}; play.target_list = {}; play.comabt_type = data.combat_type; for (var index = 0; index < data.partner_list.length; index++) { var element = data.partner_list[index]; element.playing = 0; var temp_pos = index + 1; this.a_objects[temp_pos] = element; play.objects[temp_pos] = { pos: element.pos, object_bid: element.bid, bid: element.bid, star: element.star, object_type: 2, group: 1, hp: element.hp, hp_max: element.hp, skill_list: [], fashion: element.use_skin }; var col = this.col_info[element.pos]; this.a_col[col] = this.a_col[col] || { rnum: 0, "enum": 0 }; this.a_col[col].rnum += 1; this.a_col[col][element.pos] = temp_pos; // this.a_col[col][v.pos] = i; for (var i = 0; i < element.skill_list.length; i++) { var temp = element.skill_list[i]; play.objects[temp_pos].skill_list.push(temp.sid); } } play.target_list[0] = this.nextTarget(); return play; }, // 产出下一波怪 nextTarget: function nextTarget() { var now = gcore.SmartSocket.getTime(); if (this.now_num >= this.max_num) return; if (this.now_num > 0 && now - this.last_time < this.cd_time) return; var pos_list = []; var pos_list2 = []; var pos = 0; var col = 0; for (var index = 1; index < 10; index++) { pos = index + GIRD_POS_OFFSET; col = this.col_info[index]; if (this.target_objects[pos] == null && this.a_col[col] != null && this.last_pos != pos && this.a_col[col].rnum > this.a_col[col]["enum"]) { pos_list.push(pos); if (this.col_info[this.last_pos - GIRD_POS_OFFSET] != col) { pos_list2.push(pos); } } } if (pos_list2.length > 0) { pos_list = pos_list2; } if (pos_list.length > 0) { pos = this.rand_item(pos_list); col = this.col_info[pos - GIRD_POS_OFFSET]; this.a_col[col]["enum"] = this.a_col[col]["enum"] + 1; var target = this.rand_item(this.b_objects); this.target_objects[pos] = target; this.needPlays[pos] = 1; this.last_pos = pos; this.last_time = now; // var icon = this.icon_res_list[this.icon_idx]; // this.icon_idx = this.icon_idx % (this.icon_res_list.length) + 1 this.now_num += 1; var play = this.init_play(pos); this.target_play[pos] = play; return { pos: pos, object_bid: target.bid, bid: target.bid, star: target.star, object_type: 3, group: 2, hp: target.hp, hp_max: target.hp, skill_list: [], actor: play.actor, effect_bid: play.effect_bid }; } }, // 技能播报计算 init_play: function init_play(pos) { if (pos == null) return; var target = this.target_objects[pos]; if (target == null || !this.needPlays[pos]) return; var a_idx = this.selectActor(pos); this.needPlays[pos] = a_idx; var actor = this.a_objects[a_idx]; actor.playing = actor.playing + 1; var skill = this.rand_item_by_key(actor.skill_list, 'rand'); var play = { skill_plays: [], actor: actor.pos, target: pos, skill_bid: skill.sid }; var skill_idx = 1; var effect_idx = 1; var rand_object = this.rand_talk(); var talk_pos = rand_object && rand_object.talk_pos ? rand_object.talk_pos : 0; var talk_content = rand_object && rand_object.talk_content ? rand_object.talk_content : ""; var skill_play = { order: skill_idx, bid: actor.bid, actor: actor.pos, target: pos, skill_bid: skill.sid, effect_play: [], talk_pos: talk_pos, talk_content: talk_content }; var hp = target.hp; for (var index = 0; index < skill.effect_list.length; index++) { var element = skill.effect_list[index]; play.effect_bid = element.eid; var hurt = Utils.randomNum(element.min_hurt, element.max_hurt); var is_crit = 0; var tmp_crit = Utils.randomNum(0, 1000); if (tmp_crit < actor.crit) { hurt = Math.ceil(hurt * 1.5); is_crit = 1; } var dec_hp = hurt; if (index != skill.effect_list.length - 1) { dec_hp = Math.ceil(Math.min(hurt, hp) / skill.effect_list.length); } hp = Math.max(hp - dec_hp); var effect_play = { order: effect_idx, actor: actor.pos, target: pos, effect_bid: element.eid, hp: hp, hurt: -hurt, is_crit: is_crit }; skill_play.effect_play.push(effect_play); effect_idx += 1; } play.skill_plays.push(skill_play); return play; }, // play: function play(pos) { var play = this.target_play[pos]; this.target_play[pos] = null; return play; }, // 选择进攻者(选在同行中,优先前排英雄) selectActor: function selectActor(pos) { var logic_pos = pos - GIRD_POS_OFFSET; var col = this.col_info[logic_pos]; var col_pos = this.col_pos_info[col]; var a_col_pos = this.a_col[col]; var a_idx = 0; var a_front_idx = 0; for (var index = 0; index < col_pos.length; index++) { var a_pos = col_pos[index]; a_idx = a_col_pos[a_pos]; if (a_idx) { a_front_idx = a_front_idx || a_idx; if (this.a_objects[a_idx].playing == 0) { return a_idx; } } } return a_front_idx; }, // 技能播放完成 playEnd: function playEnd(pos) { var a_idx = this.needPlays[pos]; if (a_idx) { var actor = this.a_objects[a_idx]; actor.playing -= 1; } this.needPlays[pos] = null; this.target_objects[pos] = null; this.now_num -= 1; var col = this.col_info[pos - GIRD_POS_OFFSET]; if (this.a_col[col]) { this.a_col[col]["enum"] -= 1; } }, // 随机说话 rand_talk: function rand_talk() { this.talk_cd = this.talk_cd - 1; if (this.talk_cd > 0) return; var talk = this.rand_item_by_key2(this.talk_list, 1, 10000); if (talk && talk[0]) { this.talk_cd = 5; var target = this.rand_item(this.a_objects); var idx = talk[0] || 1; var config = Config.dungeon_data.data_drama_talk[idx.toString()]; return { talk_pos: target.pos, talk_content: config.talk }; } }, randWaveTargets: function randWaveTargets() { if (this.idx % 10 == 0) { this.b_objects = this.rand_item(this.data.wave_list).unit_list; } this.idx += 1; }, // 随机从里面取出一项 rand_item: function rand_item(tab) { if (tab instanceof Array) { var length = tab.length; var index = Utils.randomNum(1, length); return tab[index - 1]; } else { var temp_ary = []; for (var key in tab) { temp_ary.push(key); } var _length = temp_ary.length; var index = Utils.randomNum(1, _length); var tab_key = temp_ary[index - 1]; return tab[tab_key]; } }, // 按指定建随机一项 rand_item_by_key: function rand_item_by_key(tab, key) { var sum = 0; for (var index = 0; index < tab.length; index++) { var element = tab[index]; sum = sum + element[key]; } return this.rand_item_by_key2(tab, key, sum); }, rand_item_by_key2: function rand_item_by_key2(tab, key, sum) { var rank = Utils.randomNum(1, sum); for (var index = 0; index < tab.length; index++) { var element = tab[index]; sum = sum - element[key]; if (rank >= sum) { return element; } } } }; // module.exports = BattleLoop; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYXR0bGVcXGJhdHRsZV9sb29wLmpzIl0sIm5hbWVzIjpbIndpbmRvdyIsIkJhdHRsZUxvb3AiLCJpbml0IiwiZGF0YSIsIm5leHRfdGFyZ2V0X3R5cGVfcG9zIiwibmV4dF90YXJnZXRfdHlwZV9raWxsIiwidGFsa19jZCIsImNvbF9pbmZvIiwiY29sX3Bvc19pbmZvIiwiaWR4IiwiYV9vYmplY3RzIiwidGFyZ2V0X29iamVjdHMiLCJyYW5kV2F2ZVRhcmdldHMiLCJiX2Zvcm1hdGlvbl90eXBlIiwibm93X251bSIsIm1heF9udW0iLCJNYXRoIiwibWluIiwicGFydG5lcl9saXN0IiwibGVuZ3RoIiwibmVlZFBsYXlzIiwibGFzdF9wb3MiLCJsYXN0X3RpbWUiLCJhX2NvbCIsInRhcmdldF9wbGF5IiwiY2RfdGltZSIsImNvbmZpZyIsIkNvbmZpZyIsImR1bmdlb25fZGF0YSIsImRhdGFfZHJhbWFfZHVuZ2Vvbl9pbmZvIiwiZHVuX2JpZCIsInRvU3RyaW5nIiwidGFsa19saXN0IiwidGFsa19pZHMiLCJwbGF5Iiwib2JqZWN0cyIsInRhcmdldF9saXN0IiwiY29tYWJ0X3R5cGUiLCJjb21iYXRfdHlwZSIsImluZGV4IiwiZWxlbWVudCIsInBsYXlpbmciLCJ0ZW1wX3BvcyIsInBvcyIsIm9iamVjdF9iaWQiLCJiaWQiLCJzdGFyIiwib2JqZWN0X3R5cGUiLCJncm91cCIsImhwIiwiaHBfbWF4Iiwic2tpbGxfbGlzdCIsImZhc2hpb24iLCJ1c2Vfc2tpbiIsImNvbCIsInJudW0iLCJpIiwidGVtcCIsInB1c2giLCJzaWQiLCJuZXh0VGFyZ2V0Iiwibm93IiwiZ2NvcmUiLCJTbWFydFNvY2tldCIsImdldFRpbWUiLCJwb3NfbGlzdCIsInBvc19saXN0MiIsIkdJUkRfUE9TX09GRlNFVCIsInJhbmRfaXRlbSIsInRhcmdldCIsImJfb2JqZWN0cyIsImluaXRfcGxheSIsImFjdG9yIiwiZWZmZWN0X2JpZCIsImFfaWR4Iiwic2VsZWN0QWN0b3IiLCJza2lsbCIsInJhbmRfaXRlbV9ieV9rZXkiLCJza2lsbF9wbGF5cyIsInNraWxsX2JpZCIsInNraWxsX2lkeCIsImVmZmVjdF9pZHgiLCJyYW5kX29iamVjdCIsInJhbmRfdGFsayIsInRhbGtfcG9zIiwidGFsa19jb250ZW50Iiwic2tpbGxfcGxheSIsIm9yZGVyIiwiZWZmZWN0X3BsYXkiLCJlZmZlY3RfbGlzdCIsImVpZCIsImh1cnQiLCJVdGlscyIsInJhbmRvbU51bSIsIm1pbl9odXJ0IiwibWF4X2h1cnQiLCJpc19jcml0IiwidG1wX2NyaXQiLCJjcml0IiwiY2VpbCIsImRlY19ocCIsIm1heCIsImxvZ2ljX3BvcyIsImNvbF9wb3MiLCJhX2NvbF9wb3MiLCJhX2Zyb250X2lkeCIsImFfcG9zIiwicGxheUVuZCIsInRhbGsiLCJyYW5kX2l0ZW1fYnlfa2V5MiIsImRhdGFfZHJhbWFfdGFsayIsIndhdmVfbGlzdCIsInVuaXRfbGlzdCIsInRhYiIsIkFycmF5IiwidGVtcF9hcnkiLCJrZXkiLCJ0YWJfa2V5Iiwic3VtIiwicmFuayJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQUEsTUFBTSxDQUFDQyxVQUFQLEdBQW9CO0FBQ2hCOzs7O0FBSUFDLEVBQUFBLElBQUksRUFBQyxjQUFTQyxJQUFULEVBQWM7QUFDZixTQUFLQyxvQkFBTCxHQUE0QixDQUE1QjtBQUNBLFNBQUtDLHFCQUFMLEdBQTZCLENBQTdCO0FBQ0EsU0FBS0MsT0FBTCxHQUFlLENBQWY7QUFDQSxTQUFLQyxRQUFMLEdBQWdCLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsQ0FBbkIsRUFBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsRUFBNEIsQ0FBNUIsQ0FBaEIsRUFDQSxLQUFLQyxZQUFMLEdBQW9CLENBQUMsRUFBRCxFQUFLLENBQUMsQ0FBRCxFQUFJLENB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QW5CO0FBQ0ErRSxNQUFBQSxHQUFHLEdBQUdBLEdBQUcsR0FBRzlFLE9BQU8sQ0FBQzRFLEdBQUQsQ0FBbkI7QUFDSDs7QUFDRCxXQUFPLEtBQUtQLGlCQUFMLENBQXVCSSxHQUF2QixFQUE0QkcsR0FBNUIsRUFBaUNFLEdBQWpDLENBQVA7QUFDSCxHQXRPZTtBQXdPaEJULEVBQUFBLGlCQUFpQixFQUFDLDJCQUFTSSxHQUFULEVBQWNHLEdBQWQsRUFBbUJFLEdBQW5CLEVBQXVCO0FBQ3JDLFFBQUlDLElBQUksR0FBRzNCLEtBQUssQ0FBQ0MsU0FBTixDQUFnQixDQUFoQixFQUFtQnlCLEdBQW5CLENBQVg7O0FBQ0EsU0FBSyxJQUFJL0UsS0FBSyxHQUFHLENBQWpCLEVBQW9CQSxLQUFLLEdBQUcwRSxHQUFHLENBQUM5RixNQUFoQyxFQUF3Q29CLEtBQUssRUFBN0MsRUFBaUQ7QUFDN0MsVUFBTUMsT0FBTyxHQUFHeUUsR0FBRyxDQUFDMUUsS0FBRCxDQUFuQjtBQUNBK0UsTUFBQUEsR0FBRyxHQUFHQSxHQUFHLEdBQUc5RSxPQUFPLENBQUM0RSxHQUFELENBQW5COztBQUNBLFVBQUlHLElBQUksSUFBSUQsR0FBWixFQUFnQjtBQUNaLGVBQVE5RSxPQUFSO0FBQ0g7QUFDSjtBQUNKO0FBalBlLENBQXBCLEVBbVBBIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDlgYfmiJjmlpfljZXkvY3nlJ/miJDlmahcbi8vIDxici8+Q3JlYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbndpbmRvdy5CYXR0bGVMb29wID0ge1xuICAgIC8qKlxuICAgICAqIOWIneWni+WMluWvueixoeeUn+aIkOWZqFxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBcbiAgICAgKi9cbiAgICBpbml0OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICB0aGlzLm5leHRfdGFyZ2V0X3R5cGVfcG9zID0gMTtcbiAgICAgICAgdGhpcy5uZXh0X3RhcmdldF90eXBlX2tpbGwgPSAyO1xuICAgICAgICB0aGlzLnRhbGtfY2QgPSAwO1xuICAgICAgICB0aGlzLmNvbF9pbmZvID0gWzAsIDEsIDIsIDMsIDEsIDIsIDMsIDEsIDIsIDNdLFxuICAgICAgICB0aGlzLmNvbF9wb3NfaW5mbyA9IFtbXSwgWzEsIDQsIDddLCBbMiwgNSwgOF0sIFszLCA2LCA5XV0sXG5cbiAgICAgICAgdGhpcy5pZHggPSAwO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmFfb2JqZWN0cyA9IHt9O1xuICAgICAgICB0aGlzLnRhcmdldF9vYmplY3RzID0ge307XG4gICAgICAgIC8vIHRoaXMuaWNvbl9yZXNfbGlzdCA9IFs1LDIsN107XG4gICAgICAgIC8vIHRoaXMuaWNvbl9pZHggPSAwO1xuICAgICAgICB0aGlzLnJhbmRXYXZlVGFyZ2V0cygpO1xuICAgICAgICB0aGlzLmJfZm9ybWF0aW9uX3R5cGUgPSBkYXRhLmJfZm9ybWF0aW9uX3R5cGUgfHwgMTtcbiAgICAgICAgdGhpcy5ub3dfbnVtID0gMDtcbiAgICAgICAgdGhpcy5tYXhfbnVtID0gTWF0aC5taW4oZGF0YS5wYXJ0bmVyX2xpc3QubGVuZ3RoLCAzKTtcbiAgICAgICAgdGhpcy5uZWVkUGxheXMgPSB7fTtcbiAgICAgICAgdGhpcy5sYXN0X3BvcyA9IDA7XG4gICAgICAgIHRoaXMubGFzdF90aW1lID0gMDtcbiAgICAgICAgdGhpcy5hX2NvbCA9IHt9XG4gICAgICAgIHRoaXMudGFyZ2V0X3BsYXkgPSB7fTtcbiAgICAgICAgdGhpcy5jZF90aW1lID0gMTtcbiAgICAgICAgaWYgKGRhdGEucGFydG5lcl9saXN0Lmxlbmd0aCA8IDIpe1xuICAgICAgICAgICAgdGhpcy5jZF90aW1lID0gMjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb25maWcgPSBDb25maWcuZHVuZ2Vvbl9kYXRhLmRhdGFfZHJhbWFfZHVuZ2Vvbl9pbmZvW2RhdGEuZHVuX2JpZC50b1N0cmluZygpXTtcbiAgICAgICAgdGhpcy50YWxrX2xpc3QgPSBjb25maWcudGFsa19pZHM7XG4gICAgICAgIHZhciBwbGF5ID0ge307XG4gICAgICAgIHBsYXkub2JqZWN0cyA9IHt9O1xuICAgICAgICBwbGF5LnRhcmdldF9saXN0ID0ge307XG4gICAgICAgIHBsYXkuY29tYWJ0X3R5cGUgPSBkYXRhLmNvbWJhdF90eXBlO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YS5wYXJ0bmVyX2xpc3QubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IGRhdGEucGFydG5lcl9saXN0W2luZGV4XTtcbiAgICAgICAgICAgIGVsZW1lbnQucGxheWluZyA9IDA7XG4gICAgICAgICAgICB2YXIgdGVtcF9wb3MgPSBpbmRleCArIDE7XG4gICAgICAgICAgICB0aGlzLmFfb2JqZWN0c1t0ZW1wX3Bvc10gPSBlbGVtZW50O1xuICAgICAgICAgICAgcGxheS5vYmplY3RzW3RlbXBfcG9zXSA9IHsgcG9zOiBlbGVtZW50LnBvcywgb2JqZWN0X2JpZDogZWxlbWVudC5iaWQsIGJpZDogZWxlbWVudC5iaWQsIHN0YXI6IGVsZW1lbnQuc3Rhciwgb2JqZWN0X3R5cGU6IDIsIGdyb3VwOiAxLCBocDogZWxlbWVudC5ocCwgaHBfbWF4OiBlbGVtZW50LmhwLCBza2lsbF9saXN0OiBbXSwgZmFzaGlvbjogZWxlbWVudC51c2Vfc2tpbiB9O1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xfaW5mb1tlbGVtZW50LnBvc107XG4gICAgICAgICAgICB0aGlzLmFfY29sW2NvbF0gPSB0aGlzLmFfY29sW2NvbF0gfHwge3JudW06MCwgZW51bTowfTtcbiAgICAgICAgICAgIHRoaXMuYV9jb2xbY29sXS5ybnVtICs9IDE7XG4gICAgICAgICAgICB0aGlzLmFfY29sW2NvbF1bZWxlbWVudC5wb3NdID0gdGVtcF9wb3M7XG4gICAgICAgICAgICAvLyB0aGlzLmFfY29sW2NvbF1bdi5wb3NdID0gaTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5za2lsbF9saXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IGVsZW1lbnQuc2tpbGxfbGlzdFtpXTtcbiAgICAgICAgICAgICAgICBwbGF5Lm9iamVjdHNbdGVtcF9wb3NdLnNraWxsX2xpc3QucHVzaCh0ZW1wLnNpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGxheS50YXJnZXRfbGlzdFswXSA9IHRoaXMubmV4dFRhcmdldCgpO1xuICAgICAgICByZXR1cm4gcGxheTtcbiAgICB9LFxuXG4gICAgLy8g5Lqn5Ye65LiL5LiA5rOi5oCqXG4gICAgbmV4dFRhcmdldDpmdW5jdGlvbigpe1xuICAgICAgICBjb25zdCBub3cgPSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCk7XG4gICAgICAgIGlmICh0aGlzLm5vd19udW0gPj0gdGhpcy5tYXhfbnVtKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLm5vd19udW0gPiAwICYmIChub3cgLSB0aGlzLmxhc3RfdGltZSA8IHRoaXMuY2RfdGltZSkpIHJldHVybjtcbiAgICAgICAgdmFyIHBvc19saXN0ID0gW107XG4gICAgICAgIHZhciBwb3NfbGlzdDIgPSBbXTtcbiAgICAgICAgdmFyIHBvcyA9IDA7XG4gICAgICAgIHZhciBjb2wgPSAwO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgMTA7IGluZGV4KyspIHtcbiAgICAgICAgICAgIHBvcyA9IGluZGV4ICsgR0lSRF9QT1NfT0ZGU0VUO1xuICAgICAgICAgICAgY29sID0gdGhpcy5jb2xfaW5mb1tpbmRleF07XG4gICAgICAgICAgICBpZiAodGhpcy50YXJnZXRfb2JqZWN0c1twb3NdID09IG51bGwgJiYgdGhpcy5hX2NvbFtjb2xdICE9IG51bGwgJiYgdGhpcy5sYXN0X3BvcyAhPSBwb3MgJiYgKHRoaXMuYV9jb2xbY29sXS5ybnVtID4gdGhpcy5hX2NvbFtjb2xdLmVudW0pKXtcbiAgICAgICAgICAgICAgICBwb3NfbGlzdC5wdXNoKHBvcyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sX2luZm9bdGhpcy5sYXN0X3BvcyAtIEdJUkRfUE9TX09GRlNFVF0gIT0gY29sKXtcbiAgICAgICAgICAgICAgICAgICAgcG9zX2xpc3QyLnB1c2gocG9zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvc19saXN0Mi5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIHBvc19saXN0ID0gcG9zX2xpc3QyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NfbGlzdC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIHBvcyA9IHRoaXMucmFuZF9pdGVtKHBvc19saXN0KTtcbiAgICAgICAgICAgIGNvbCA9IHRoaXMuY29sX2luZm9bcG9zLUdJUkRfUE9TX09GRlNFVF07XG4gICAgICAgICAgICB0aGlzLmFfY29sW2NvbF0uZW51bSA9IHRoaXMuYV9jb2xbY29sXS5lbnVtICsgMTtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLnJhbmRfaXRlbSh0aGlzLmJfb2JqZWN0cyk7XG4gICAgICAgICAgICB0aGlzLnRhcmdldF9vYmplY3RzW3Bvc10gPSB0YXJnZXQ7XG4gICAgICAgICAgICB0aGlzLm5lZWRQbGF5c1twb3NdID0gMTtcbiAgICAgICAgICAgIHRoaXMubGFzdF9wb3MgPSBwb3M7XG4gICAgICAgICAgICB0aGlzLmxhc3RfdGltZSA9IG5vdztcbiAgICAgICAgICAgIC8vIHZhciBpY29uID0gdGhpcy5pY29uX3Jlc19saXN0W3RoaXMuaWNvbl9pZHhdO1xuICAgICAgICAgICAgLy8gdGhpcy5pY29uX2lkeCA9IHRoaXMuaWNvbl9pZHggJSAodGhpcy5pY29uX3Jlc19saXN0Lmxlbmd0aCkgKyAxXG4gICAgICAgICAgICB0aGlzLm5vd19udW0gKz0gMTtcbiAgICAgICAgICAgIHZhciBwbGF5ID0gdGhpcy5pbml0X3BsYXkocG9zKTtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0X3BsYXlbcG9zXSA9IHBsYXk7XG4gICAgICAgICAgICByZXR1cm4geyBwb3M6IHBvcywgb2JqZWN0X2JpZDp0YXJnZXQuYmlkLCBiaWQ6IHRhcmdldC5iaWQsIHN0YXI6IHRhcmdldC5zdGFyLCBvYmplY3RfdHlwZTogMywgZ3JvdXA6IDIsIGhwOiB0YXJnZXQuaHAsIGhwX21heDogdGFyZ2V0LmhwLCBza2lsbF9saXN0OiBbXSwgYWN0b3I6IHBsYXkuYWN0b3IsIGVmZmVjdF9iaWQ6IHBsYXkuZWZmZWN0X2JpZH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmioDog73mkq3miqXorqHnrpdcbiAgICBpbml0X3BsYXk6ZnVuY3Rpb24gKHBvcyl7XG4gICAgICAgIGlmIChwb3MgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy50YXJnZXRfb2JqZWN0c1twb3NdO1xuICAgICAgICBpZih0YXJnZXQgPT0gbnVsbCB8fCAhdGhpcy5uZWVkUGxheXNbcG9zXSkgcmV0dXJuO1xuICAgICAgICB2YXIgYV9pZHggPSB0aGlzLnNlbGVjdEFjdG9yKHBvcyk7XG4gICAgICAgIHRoaXMubmVlZFBsYXlzW3Bvc10gPSBhX2lkeDtcbiAgICAgICAgdmFyIGFjdG9yID0gdGhpcy5hX29iamVjdHNbYV9pZHhdO1xuICAgICAgICBhY3Rvci5wbGF5aW5nID0gYWN0b3IucGxheWluZyArIDE7XG4gICAgICAgIHZhciBza2lsbCA9IHRoaXMucmFuZF9pdGVtX2J5X2tleShhY3Rvci5za2lsbF9saXN0LCAncmFuZCcpO1xuICAgICAgICB2YXIgcGxheSA9IHsgc2tpbGxfcGxheXM6IFtdLCBhY3RvcjogYWN0b3IucG9zLCB0YXJnZXQ6IHBvcywgc2tpbGxfYmlkOiBza2lsbC5zaWQgfTtcbiAgICAgICAgdmFyIHNraWxsX2lkeCA9IDE7XG4gICAgICAgIHZhciBlZmZlY3RfaWR4ID0gMTtcbiAgICAgICAgdmFyIHJhbmRfb2JqZWN0ID0gdGhpcy5yYW5kX3RhbGsoKTtcbiAgICAgICAgdmFyIHRhbGtfcG9zID0gKHJhbmRfb2JqZWN0ICYmIHJhbmRfb2JqZWN0LnRhbGtfcG9zKSA/IHJhbmRfb2JqZWN0LnRhbGtfcG9zIDogMDtcbiAgICAgICAgdmFyIHRhbGtfY29udGVudCA9IChyYW5kX29iamVjdCAmJiByYW5kX29iamVjdC50YWxrX2NvbnRlbnQpID8gcmFuZF9vYmplY3QudGFsa19jb250ZW50IDogXCJcIjtcbiAgICAgICAgdmFyIHNraWxsX3BsYXkgPSB7IG9yZGVyOiBza2lsbF9pZHgsIGJpZDogYWN0b3IuYmlkLCBhY3RvcjogYWN0b3IucG9zLCB0YXJnZXQ6IHBvcywgc2tpbGxfYmlkOiBza2lsbC5zaWQsIGVmZmVjdF9wbGF5OiBbXSwgdGFsa19wb3M6IHRhbGtfcG9zLCB0YWxrX2NvbnRlbnQ6IHRhbGtfY29udGVudCB9ICAgICAgICBcbiAgICAgICAgdmFyIGhwID0gdGFyZ2V0LmhwXG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNraWxsLmVmZmVjdF9saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHNraWxsLmVmZmVjdF9saXN0W2luZGV4XTtcbiAgICAgICAgICAgIHBsYXkuZWZmZWN0X2JpZCA9IGVsZW1lbnQuZWlkO1xuICAgICAgICAgICAgdmFyIGh1cnQgPSBVdGlscy5yYW5kb21OdW0oZWxlbWVudC5taW5faHVydCwgZWxlbWVudC5tYXhfaHVydCk7XG4gICAgICAgICAgICB2YXIgaXNfY3JpdCA9IDA7XG4gICAgICAgICAgICB2YXIgdG1wX2NyaXQgPSBVdGlscy5yYW5kb21OdW0oMCwgMTAwMCk7XG4gICAgICAgICAgICBpZiAodG1wX2NyaXQgPCBhY3Rvci5jcml0KXtcbiAgICAgICAgICAgICAgICBodXJ0ID0gTWF0aC5jZWlsKGh1cnQgKiAxLjUpO1xuICAgICAgICAgICAgICAgIGlzX2NyaXQgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGRlY19ocCA9IGh1cnQ7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT0gKHNraWxsLmVmZmVjdF9saXN0Lmxlbmd0aCAtIDEpKXtcbiAgICAgICAgICAgICAgICBkZWNfaHAgPSBNYXRoLmNlaWwoTWF0aC5taW4oaHVydCwgaHApIC8gKHNraWxsLmVmZmVjdF9saXN0Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaHAgPSBNYXRoLm1heChocCAtIGRlY19ocCk7XG4gICAgICAgICAgICB2YXIgZWZmZWN0X3BsYXkgPSB7IG9yZGVyOiBlZmZlY3RfaWR4LCBhY3RvcjogYWN0b3IucG9zLCB0YXJnZXQ6IHBvcywgZWZmZWN0X2JpZDogZWxlbWVudC5laWQsIGhwOiBocCwgaHVydDogLWh1cnQsIGlzX2NyaXQ6IGlzX2NyaXQgfVxuICAgICAgICAgICAgc2tpbGxfcGxheS5lZmZlY3RfcGxheS5wdXNoKGVmZmVjdF9wbGF5KTtcbiAgICAgICAgICAgIGVmZmVjdF9pZHggKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBwbGF5LnNraWxsX3BsYXlzLnB1c2goc2tpbGxfcGxheSk7XG4gICAgICAgIHJldHVybiBwbGF5O1xuICAgIH0sXG5cbiAgICAvLyBcbiAgICBwbGF5OmZ1bmN0aW9uKHBvcyl7XG4gICAgICAgIHZhciBwbGF5ID0gdGhpcy50YXJnZXRfcGxheVtwb3NdO1xuICAgICAgICB0aGlzLnRhcmdldF9wbGF5W3Bvc10gPSBudWxsO1xuICAgICAgICByZXR1cm4gcGxheTtcbiAgICB9LFxuXG4gICAgLy8g6YCJ5oup6L+b5pS76ICFKOmAieWcqOWQjOihjOS4rSzkvJjlhYjliY3mjpLoi7Hpm4QpXG4gICAgc2VsZWN0QWN0b3I6ZnVuY3Rpb24ocG9zKXtcbiAgICAgICAgdmFyIGxvZ2ljX3BvcyA9IHBvcyAtIEdJUkRfUE9TX09GRlNFVDtcbiAgICAgICAgdmFyIGNvbCA9IHRoaXMuY29sX2luZm9bbG9naWNfcG9zXTtcbiAgICAgICAgdmFyIGNvbF9wb3MgPSB0aGlzLmNvbF9wb3NfaW5mb1tjb2xdO1xuICAgICAgICB2YXIgYV9jb2xfcG9zID0gdGhpcy5hX2NvbFtjb2xdO1xuICAgICAgICB2YXIgYV9pZHggPSAwO1xuICAgICAgICB2YXIgYV9mcm9udF9pZHggPSAwO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29sX3Bvcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGFfcG9zID0gY29sX3Bvc1tpbmRleF07XG4gICAgICAgICAgICBhX2lkeCA9IGFfY29sX3Bvc1thX3Bvc11cbiAgICAgICAgICAgIGlmIChhX2lkeCl7XG4gICAgICAgICAgICAgICAgYV9mcm9udF9pZHggPSBhX2Zyb250X2lkeCB8fCBhX2lkeDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hX29iamVjdHNbYV9pZHhdLnBsYXlpbmcgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYV9pZHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhX2Zyb250X2lkeDtcbiAgICB9LFxuXG4gICAgLy8g5oqA6IO95pKt5pS+5a6M5oiQXG4gICAgcGxheUVuZDpmdW5jdGlvbihwb3Mpe1xuICAgICAgICB2YXIgYV9pZHggPSB0aGlzLm5lZWRQbGF5c1twb3NdO1xuICAgICAgICBpZiAoYV9pZHgpe1xuICAgICAgICAgICAgdmFyIGFjdG9yID0gdGhpcy5hX29iamVjdHNbYV9pZHhdO1xuICAgICAgICAgICAgYWN0b3IucGxheWluZyAtPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmVlZFBsYXlzW3Bvc10gPSBudWxsO1xuICAgICAgICB0aGlzLnRhcmdldF9vYmplY3RzW3Bvc10gPSBudWxsO1xuICAgICAgICB0aGlzLm5vd19udW0gLT0gMTtcbiAgICAgICAgdmFyIGNvbCA9IHRoaXMuY29sX2luZm9bcG9zIC0gR0lSRF9QT1NfT0ZGU0VUXTtcbiAgICAgICAgaWYgKHRoaXMuYV9jb2xbY29sXSl7XG4gICAgICAgICAgICB0aGlzLmFfY29sW2NvbF0uZW51bSAtPSAxO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOmaj+acuuivtOivnVxuICAgIHJhbmRfdGFsazpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLnRhbGtfY2QgPSB0aGlzLnRhbGtfY2QgLSAxO1xuICAgICAgICBpZiAodGhpcy50YWxrX2NkID4gMCkgcmV0dXJuO1xuICAgICAgICB2YXIgdGFsayA9IHRoaXMucmFuZF9pdGVtX2J5X2tleTIodGhpcy50YWxrX2xpc3QsIDEsIDEwMDAwKVxuICAgICAgICBpZiAodGFsayAmJiB0YWxrWzBdKXtcbiAgICAgICAgICAgIHRoaXMudGFsa19jZCA9IDU7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5yYW5kX2l0ZW0odGhpcy5hX29iamVjdHMpO1xuICAgICAgICAgICAgdmFyIGlkeCA9IHRhbGtbMF0gfHwgMTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IENvbmZpZy5kdW5nZW9uX2RhdGEuZGF0YV9kcmFtYV90YWxrW2lkeC50b1N0cmluZygpXTtcbiAgICAgICAgICAgIHJldHVybiB7dGFsa19wb3M6dGFyZ2V0LnBvcywgdGFsa19jb250ZW50OmNvbmZpZy50YWxrfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJhbmRXYXZlVGFyZ2V0czpmdW5jdGlvbigpe1xuICAgICAgICBpZiAodGhpcy5pZHggJSAxMCA9PSAwKXtcbiAgICAgICAgICAgIHRoaXMuYl9vYmplY3RzID0gdGhpcy5yYW5kX2l0ZW0odGhpcy5kYXRhLndhdmVfbGlzdCkudW5pdF9saXN0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaWR4ICs9IDE7XG4gICAgfSxcblxuICAgIC8vIOmaj+acuuS7jumHjOmdouWPluWHuuS4gOmhuVxuICAgIHJhbmRfaXRlbTpmdW5jdGlvbih0YWIpe1xuICAgICAgICBpZiAodGFiIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHRhYi5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBVdGlscy5yYW5kb21OdW0oMSwgbGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybiB0YWJbaW5kZXggLSAxXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0ZW1wX2FyeSA9IFtdXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGFiKSB7XG4gICAgICAgICAgICAgICAgdGVtcF9hcnkucHVzaChrZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSB0ZW1wX2FyeS5sZW5ndGhcbiAgICAgICAgICAgIHZhciBpbmRleCA9IFV0aWxzLnJhbmRvbU51bSgxLCBsZW5ndGgpO1xuICAgICAgICAgICAgdmFyIHRhYl9rZXkgPSB0ZW1wX2FyeVtpbmRleCAtIDFdO1xuICAgICAgICAgICAgcmV0dXJuIHRhYlt0YWJfa2V5XTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmjInmjIflrprlu7rpmo/mnLrkuIDpoblcbiAgICByYW5kX2l0ZW1fYnlfa2V5OmZ1bmN0aW9uKHRhYiwga2V5KXtcbiAgICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0YWIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGFiW2luZGV4XTtcbiAgICAgICAgICAgIHN1bSA9IHN1bSArIGVsZW1lbnRba2V5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yYW5kX2l0ZW1fYnlfa2V5Mih0YWIsIGtleSwgc3VtKTtcbiAgICB9LFxuXG4gICAgcmFuZF9pdGVtX2J5X2tleTI6ZnVuY3Rpb24odGFiLCBrZXksIHN1bSl7XG4gICAgICAgIHZhciByYW5rID0gVXRpbHMucmFuZG9tTnVtKDEsIHN1bSk7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0YWIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGFiW2luZGV4XTtcbiAgICAgICAgICAgIHN1bSA9IHN1bSAtIGVsZW1lbnRba2V5XTtcbiAgICAgICAgICAgIGlmIChyYW5rID49IHN1bSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuICBlbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbn07XG4vLyBtb2R1bGUuZXhwb3J0cyA9IEJhdHRsZUxvb3A7Il19