(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/hero/hero_calculate.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, 'a43b2Qoq7pLrawGSHCNCKmH', 'hero_calculate'); // Scripts/mod/hero/hero_calculate.js "use strict"; // var HeroController = require("hero_controller"); var HeroEvent = require("hero_event"); var HeroConst = require("hero_const"); var BackpackController = require("backpack_controller"); var MainuiController = require("mainui_controller"); var MainuiConst = require("mainui_const"); var HeroCalculate = cc.Class({ "extends": BaseClass, ctor: function ctor() {}, //---------------------------英雄升级升阶的红点逻辑------------------------- //是足够需要条件 //@limit 限制条件 //@ hero_vo 英雄信息 isEnoughCondition: function isEnoughCondition(limit, hero_vo) { var isNeed = true; for (var limit_i in limit) { if (limit[limit_i][0] == "star") if (hero_vo.star < limit[limit_i][1]) { isNeed = false; break; } } return isNeed; }, calculatePower: function calculatePower(attr_list) { var total_power = 0; if (!attr_list || attr_list.length === 0) return total_power; var key = null, value = null; for (var attr_i in attr_list) { var arrt_item = attr_list[attr_i]; if (typeof arrt_item == "array") { key = arrt_item[0]; value = arrt_item[1]; } else { key = attr_i; value = arrt_item; } var radio = Config.attr_data.data_power[key]; if (radio) { total_power = total_power + value * radio * 0.001; } } return Math.ceil(total_power); }, // 检查所有有效英雄红点 checkAllHeroRedPoint: function checkAllHeroRedPoint() { var redpoint_data1 = this.checkHeroRedPointByRedPointType(HeroConst.RedPointType.eRPLevelUp, true); var redpoint_data2 = this.checkHeroRedPointByRedPointType(HeroConst.RedPointType.eRPEquip, true); var redpoint_data3 = this.checkHeroRedPointByRedPointType(HeroConst.RedPointType.eRPStar, true); var redpoint_data4 = this.checkHeroRedPointByRedPointType(HeroConst.RedPointType.eRPTalent, true); // 策划要求 天赋不算如主界面红点 但是算入英雄背包红点 var data = [redpoint_data1, redpoint_data2, redpoint_data3]; // , redpoint_data4 MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.partner, data); var data = [redpoint_data1, redpoint_data2, redpoint_data3]; gcore.GlobalEvent.fire(HeroEvent.All_Hero_RedPoint_Event, data); }, //检查单个英雄的红点信息 checkSingleHeroRedPoint: function checkSingleHeroRedPoint(hero_vo) { var is_redpoint = false; //升级 升阶红点 is_redpoint = this.checkSingleHeroLevelUpRedPoint(hero_vo); if (is_redpoint) return true; //装备红点 is_redpoint = this.checkSingleHeroEquipRedPoint(hero_vo); if (is_redpoint) return true; //升星红点 is_redpoint = this.checkSingleHeroUpgradeStarRedPoint(hero_vo); if (is_redpoint) return true; //天赋红点 is_redpoint = this.checkSingleHeroTalentSkillRedPoint(hero_vo); return is_redpoint; }, // 计算升星红点红点根据升星表 // @is_ignore_master_card 是否忽视主卡(6星以上的升星逻辑) // @partner_id 忽视主卡的 唯一id checkSingleStarFuseRedPointByStarConfig: function checkSingleStarFuseRedPointByStarConfig(star_config, is_ignore_master_card, partner_id) { if (!star_config) return false; var hero_item_data_list = {}; var index = 1; var expend = star_config.expend1[0]; // 特定条件数据 结构 dic_the_conditions[bid][星级] = 数量 var dic_the_conditions = {}; // 随机条件 dic_random_conditions[阵营][星级] = 数量 var dic_random_conditions = {}; // 标志已用 var dic_hero_id = {}; var need_count = 0; if (!is_ignore_master_card) { if (expend) { // 指定的 {10402,4,1} : 10402: 表示bid, 4: 表示星级 1:表示数量 var bid = expend[0]; var star = expend[1]; var count = expend[2]; dic_the_conditions[bid] = {}; dic_the_conditions[bid][star] = count; need_count = need_count + count; } index = index + 1; } else { dic_hero_id[partner_id] = 1; } for (var expend_i = 0; expend_i < star_config.expend2.length; ++expend_i) { // 指定的 {10402,4,1} : 10402: 表示bid, 4: 表示星级 1:表示数量 var expend = star_config.expend2[expend_i]; var bid = expend[0]; var star = expend[1]; var count = expend[2]; if (!dic_the_conditions[bid]) dic_the_conditions[bid] = {}; if (!dic_the_conditions[bid][star]) { dic_the_conditions[bid][star] = count; } else { dic_the_conditions[bid][star] = dic_the_conditions[bid][star] + count; } need_count = need_count + count; index = index + 1; } // 4是和策划说好了最多4个 if (index <= 4) { // 随机的 {1,4,2} : 1 表示阵营 4: 表示星级 2表示数量 for (var expend_i = 0; expend_i < star_config.expend3.length; ++expend_i) { var expend = star_config.expend3[expend_i]; var camp = expend[0]; var star = expend[1]; var count = expend[2]; if (!dic_random_conditions[camp]) dic_random_conditions[camp] = {}; if (!dic_random_conditions[camp][star]) { dic_random_conditions[camp][star] = count; } else { dic_random_conditions[camp][star] = dic_random_conditions[camp][star] + count; } need_count = need_count + count; index = index + 1; if (index > 4) break; } } // 获取列表 var HeroController = require("hero_controller"); var model = HeroController.getInstance().getModel(); var total_count = model.getHeroListByMatchInfo(dic_the_conditions, dic_random_conditions, dic_hero_id); var is_redpoint = total_count >= need_count; var result = { is_redpoint: is_redpoint, need_count: need_count, total_count: total_count }; return result; }, //检测符文类型的红点 //@equip_vo 符文对象..如果为空说明没有符文 checkSingleArtifactRedPoint: function checkSingleArtifactRedPoint(equip_vo) { var backpack_model = require("backpack_controller").getInstance().getModel(); var BackPackConst = require("backpack_const"); var equip_score_list = backpack_model.getAllEquipListByType(BackPackConst.item_type.ARTIFACTCHIPS); if (equip_vo == null) { if (equip_score_list && Utils.equip_score_list) { return true; } } return false; }, // 根据红点类型 清空红点记录 // @red_point_type 参考 HeroConst.RedPointType // @is_delay 是否延迟检测 clearAllHeroRecordByRedPointType: function clearAllHeroRecordByRedPointType(red_point_type, is_delay) { // 马上清除 var HeroController = require("hero_controller"); var model = HeroController.getInstance().getModel(); var hero_list = model.getHeroList(); for (var hero_i in hero_list) { hero_list[hero_i].red_point[red_point_type] = null; } this.checkHeroRedPointByRedPointType(red_point_type); if (red_point_type == HeroConst.RedPointType.eRPLevelUp || red_point_type == HeroConst.RedPointType.eRPTalent) { // --目前升级 和 天赋 用到延迟 model.is_delay_redpoint_update[red_point_type] = false; } }, // 根据红点类型 清检测红点记录 // @red_point_type 参考 HeroConst.RedPointType // @ 是否只是返回 红点数据就好 checkHeroRedPointByRedPointType: function checkHeroRedPointByRedPointType(red_point_type, is_return) { var HeroController = require("hero_controller"); var hero_list = HeroController.getInstance().getModel().getHeroList(); var redpoint_data = {}; redpoint_data.bid = red_point_type; redpoint_data.status = false; for (var hero_i in hero_list) { var hero_vo = hero_list[hero_i]; if (this.isCheckHeroRedPointByHeroVo(hero_vo)) { //等级 if (red_point_type == HeroConst.RedPointType.eRPLevelUp) { redpoint_data.status = this.checkSingleHeroLevelUpRedPoint(hero_vo); if (redpoint_data.status) break; } else if (red_point_type == HeroConst.RedPointType.eRPEquip) { //装备 redpoint_data.status = this.checkSingleHeroEquipRedPoint(hero_vo); if (redpoint_data.status) break; } else if (red_point_type == HeroConst.RedPointType.eRPStar) { //升星 redpoint_data.status = this.checkSingleHeroUpgradeStarRedPoint(hero_vo); if (redpoint_data.status) break; } else if (red_point_type == HeroConst.RedPointType.eRPTalent) { //天赋 redpoint_data.status = this.checkSingleHeroTalentSkillRedPoint(hero_vo); if (redpoint_data.status) break; } } } if (is_return) { return redpoint_data; } else { // if red_point_type ~= HeroConst.RedPointType.eRPTalent then --天赋 // // 策划要求 天赋不算如主界面红点 但是算入英雄背包红点 // MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.partner,{redpoint_data}) // end MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.partner, [redpoint_data]); gcore.GlobalEvent.fire(HeroEvent.All_Hero_RedPoint_Event, [redpoint_data]); // GlobalEvent.getInstance().Fire(HeroEvent.All_Hero_RedPoint_Event, {redpoint_data}) } }, //是否需要检测红点 isCheckHeroRedPointByHeroVo: function isCheckHeroRedPointByHeroVo(hero_vo) { // 3 以后走配置表 // 等于 > 3级 和 上阵的英雄需要检查红点 注意: hero_vo.lev > 3 暂时不要 // hero_vo.is_in_form < 10 因为 is_in_form.改成 布阵类型 *10 + 序号了 if (!hero_vo) return; if (hero_vo.isFormDrama()) return true; return false; }, // 检查单个英雄升级红点 及进阶红点 checkSingleHeroLevelUpRedPoint: function checkSingleHeroLevelUpRedPoint(hero_vo) { if (!hero_vo) return false; // if (hero_vo.red_point && typeof hero_vo.red_point[HeroConst.RedPointType.eRPLevelUp] != "boolean") { // return hero_vo.red_point[HeroConst.RedPointType.eRPLevelUp] == true; // } if (hero_vo.red_point && hero_vo.red_point[HeroConst.RedPointType.eRPLevelUp] != null) { return hero_vo.red_point[HeroConst.RedPointType.eRPLevelUp] == true; } var status = this.getHeroShowLevelStatus(hero_vo); var is_redpoint = false; if (status == 1) { //升级 var lev_config = Config.partner_data.data_partner_lev[hero_vo.lev]; if (lev_config) { var up_cost = lev_config.expend || []; var lev_redpoint = true; for (var cost_i = 0; cost_i < up_cost.length; ++cost_i) { var cost = up_cost[cost_i]; var count = BackpackController.getInstance().getModel().getItemNumByBid(cost[0]); if (count < cost[1]) { lev_redpoint = false; } } is_redpoint = lev_redpoint; } } else if (status == 2) { // 升阶 var key = Utils.getNorKey(hero_vo.type, hero_vo.break_id, hero_vo.break_lev); var break_config = Config.partner_data.data_partner_brach[key]; if (break_config) { var cost_list = break_config.expend || []; var break_redpoint = true; for (var cost_i = 0; cost_i < cost_list.length; ++cost_i) { var cost = cost_list[cost_i]; var count = BackpackController.getInstance().getModel().getItemNumByBid(cost[0]); if (count < cost[1]) break_redpoint = false; } is_redpoint = break_redpoint; } } if (hero_vo.red_point) { hero_vo.red_point[HeroConst.RedPointType.eRPLevelUp] = is_redpoint; } return is_redpoint; }, // 检查单个英雄装备红点 checkSingleHeroEquipRedPoint: function checkSingleHeroEquipRedPoint(hero_vo) { if (!hero_vo) return false; if (typeof hero_vo.red_point[HeroConst.RedPointType.eRPEquip] == "boolean") { return hero_vo.red_point[HeroConst.RedPointType.eRPEquip] == true; } var is_redpoint = false; var HeroController = require("hero_controller"); var model = HeroController.getInstance().getModel(); // 装备 var equip_list = model.getHeroEquipList(hero_vo.partner_id); var equip_type_list = HeroConst.EquipPosList || {}; for (var equip_type_i in equip_type_list) { is_redpoint = this.checkSingleHeroEachPosEquipRedPoint(equip_type_list[equip_type_i], equip_list[equip_type_i]); if (is_redpoint) break; } hero_vo.red_point[HeroConst.RedPointType.eRPEquip] = is_redpoint; return is_redpoint; }, // 检测装备类型的红点 // @equip_type 装备类型 // @equip_vo 装备对象..如果为空说明没有装备 checkSingleHeroEachPosEquipRedPoint: function checkSingleHeroEachPosEquipRedPoint(equip_type, equip_vo) { var equip_type = equip_type || 1; var backpack_model = BackpackController.getInstance().getModel(); var equip_score_list = backpack_model.getAllEquipListByType(equip_type); if (!equip_vo) { // 没有装备..判断是否有对应类型的装备 if (equip_score_list && Utils.next(equip_score_list)) { // 有红点 return true; } } else { // 如果没有分数..算一个 .. if (!equip_vo.all_score || equip_vo.all_score == 0) { equip_vo.setEnchantScore(0); } var score = equip_vo.all_score || 0; if (equip_score_list) { // 要判断当前装备比背包的装备评分底才显示红点 for (var equip_i in equip_score_list) { var equip_item = equip_score_list[equip_i]; if (equip_item && equip_item.all_score && equip_item.all_score > score) { return true; } } } } return false; }, // 检查单个英雄升星红点 checkSingleHeroUpgradeStarRedPoint: function checkSingleHeroUpgradeStarRedPoint(hero_vo) { if (!hero_vo) return false; // if (typeof hero_vo.red_point[HeroConst.RedPointType.eRPStar] == "boolean") { // return hero_vo.red_point[HeroConst.RedPointType.eRPStar] == true; // } var star = hero_vo.star || 1; var next_key = Utils.getNorKey(hero_vo.bid, star + 1); var next_star_config = gdata("partner_data", "data_partner_star", next_key); if (!next_star_config) { // 说明满星了 hero_vo.red_point[HeroConst.RedPointType.eRPStar] = false; return false; } var star_config = next_star_config; var is_redpoint = false; var HeroController = require("hero_controller"); var model = HeroController.getInstance().getModel(); if (star == model.hero_info_upgrade_star_param2) { // 10级升11有世界等级要求 is_redpoint = model.checkOpenStar11(); } else { is_redpoint = true; } if (is_redpoint) { if (star_config) { var star_result = this.checkSingleStarFuseRedPointByStarConfig(star_config, true, hero_vo.partner_id); is_redpoint = star_result.is_redpoint; // 计算消耗 if (is_redpoint && star_config.other_expend.length > 0) { var count = BackpackController.getInstance().getModel().getItemNumByBid(star_config.other_expend[0][0]); if (count < star_config.other_expend[0][1]) is_redpoint = false; } } else { is_redpoint = false; } } hero_vo.red_point[HeroConst.RedPointType.eRPStar] = is_redpoint; return is_redpoint; }, // 检查单个天赋技能红点 checkSingleHeroTalentSkillRedPoint: function checkSingleHeroTalentSkillRedPoint(hero_vo) { cc.log("checkSingleHeroTalentSkillRedPoint"); if (!hero_vo) return false; // --首次升级到6星记录 if (hero_vo.is_open_talent == true) { return true; } if (hero_vo.red_point[HeroConst.RedPointType.eRPTalent] != null) { return hero_vo.red_point[HeroConst.RedPointType.eRPTalent] == true; } if (!hero_vo.ishaveTalentData()) return false; var is_redpoint = false; var HeroController = require("hero_controller"); var dic_hero_talent_skill_learn_redpoint = HeroController.getInstance().getModel().getTalentRedpointRecord(); var dic_skill_id = {}; for (var pos in hero_vo.talent_skill_list) { var id = hero_vo.talent_skill_list[pos]; dic_skill_id[id] = pos; } for (var i in Config.partner_skill_data.data_partner_skill_pos) { var v = Config.partner_skill_data.data_partner_skill_pos[i]; if (hero_vo.talent_skill_list[v.pos]) { // --已装备技能 只需判断能否升级 is_redpoint = this.checkSingleTalentSkillLevel(hero_vo.talent_skill_list[v.pos]); if (is_redpoint) { break; } } else { // --未装备 先判断是否解锁位置 var is_lock = false; if (v.pos_limit[0] == 'star') { is_lock = hero_vo.star >= v.pos_limit[1]; } if (is_lock) { for (var _id in dic_hero_talent_skill_learn_redpoint) { if (dic_skill_id[_id] == null) { is_redpoint = true; break; } } if (is_redpoint) { break; } } } } hero_vo.red_point[HeroConst.RedPointType.eRPTalent] = is_redpoint; return is_redpoint; }, // --判断天赋技能能否升级 @skill_id 技能id checkSingleTalentSkillLevel: function checkSingleTalentSkillLevel(skill_id) { var config = Config.partner_skill_data.data_partner_skill_level[skill_id]; if (config) { var is_enough = true; for (var i = 0; i < config.expend.length; ++i) { var cost = config.expend[i]; var have_num = BackpackController.getInstance().getModel().getItemNumByBid(cost[0]); if (have_num < cost[1]) { is_enough = false; break; } } return is_enough; } return false; }, // 获取等级显示状态 // @ return 0:表示满级 1: 表示可以升级 : 2:表示可以进阶 -1 表示出错了 getHeroShowLevelStatus: function getHeroShowLevelStatus(hero_vo) { var key = hero_vo.type + "_" + hero_vo.break_id + "_" + hero_vo.break_lev; var break_config = Config.partner_data.data_partner_brach[key]; if (!break_config) return -1; var next_key = hero_vo.type + "_" + hero_vo.break_id + "_" + (hero_vo.break_lev + 1); var next_break_config = Config.partner_data.data_partner_brach[next_key]; var lev_max = break_config.lev_max; var status = 0; if (!next_break_config) { var key = hero_vo.bid + "_" + hero_vo.star; var star_config = gdata("partner_data", "data_partner_star", key); if (star_config && lev_max < star_config.lev_max) { lev_max = star_config.lev_max; } if (hero_vo.lev >= lev_max) { // 都满了 满级状态 status = 0; } else { // 等级不足 需要升级 status = 1; } } else { if (next_break_config.limit && next_break_config.limit.length > 0) { if (hero_vo.lev >= break_config.lev_max) { // 进阶有要求 需要升星 var is_enough = this.isEnoughCondition(next_break_config.limit, hero_vo); if (is_enough) { // 可以进阶了 status = 2; } else { // 不满足条件.显示满级状态 status = 0; } } else { status = 1; } } else { // 没有限制 if (hero_vo.lev >= break_config.lev_max) { // 可以进阶了 status = 2; } else { // 等级不足 需要升级 status = 1; } } } return status; }, /***************************计算祭坛的红点信息*******************************/ // 消除融合红点 clearAllStarFuseRedpointRecord: function clearAllStarFuseRedpointRecord() { var HeroController = require("hero_controller"); var dic_fuse_info = HeroController.getInstance().getModel().getStarFuseList(); if (!dic_fuse_info) return false; // 0表示全部英雄 // var camp_fuse_info = dic_fuse_info[0] for (var data_i in dic_fuse_info) { var fuse_data = dic_fuse_info[data_i]; fuse_data.cur_redpoint = null; } // 计算主界面熔炼祭坛的红点 // this.checkAllStarFuseRedpoint(); RedMgr.getInstance().addCalHandler(this.checkAllStarFuseRedpoint.bind(this), RedIds.RefuseHero); }, // 计算熔炼红点 checkAllStarFuseRedpoint: function checkAllStarFuseRedpoint() { var HeroController = require("hero_controller"); var dic_fuse_info = HeroController.getInstance().getModel().getStarFuseList(); if (!dic_fuse_info) return false; // 0表示全部英雄 // var camp_fuse_info = dic_fuse_info[0]; var is_redpoint = this.checkCampStarFuseRedpoint(dic_fuse_info); var MainSceneController = require("mainscene_controller"); var SceneConst = require("scene_const"); MainSceneController.getInstance().setBuildRedStatus(SceneConst.CenterSceneBuild.fuse, is_redpoint); return is_redpoint; }, //计算熔炼祭坛各阵营红点 checkCampStarFuseRedpoint: function checkCampStarFuseRedpoint(camp_fuse_info) { if (!camp_fuse_info) return false; var is_all_redpoint = false; var is_redpoint = false; for (var data_i in camp_fuse_info) { var fuse_data = camp_fuse_info[data_i]; is_redpoint = this.checkSingleStarFuseRedPoint(fuse_data); if (!is_all_redpoint && is_redpoint) is_all_redpoint = true; } return is_all_redpoint; }, // 计算单个英雄数据红点 checkSingleStarFuseRedPoint: function checkSingleStarFuseRedPoint(fuse_data) { //cur_redpoint == nil 就是没有计算过红点的 if (fuse_data.cur_redpoint) return fuse_data.cur_redpoint == 1; if (!fuse_data.star_config) return; // var is_redpoint, need_count, total_count var result = this.checkSingleStarFuseRedPointByStarConfig(fuse_data.star_config); if (result.is_redpoint) { // 有红点 类型 1 因为融合祭坛那边排序问题 这样定义 result.cur_redpoint = 1; fuse_data.cur_redpoint = 1; } else { // 没有红点 类型 2 result.cur_redpoint = 2; fuse_data.cur_redpoint = 2; } fuse_data.need_count = result.need_count || 0; fuse_data.total_count = result.total_count || 0; return result.is_redpoint; } }); // 实例化单利 HeroCalculate.getInstance = function () { if (!this.instance) { this.instance = new this(); } return this.instance; }; module.exports = HeroCalculate; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoZXJvXFxoZXJvX2NhbGN1bGF0ZS5qcyJdLCJuYW1lcyI6WyJIZXJvRXZlbnQiLCJyZXF1aXJlIiwiSGVyb0NvbnN0IiwiQmFja3BhY2tDb250cm9sbGVyIiwiTWFpbnVpQ29udHJvbGxlciIsIk1haW51aUNvbnN0IiwiSGVyb0NhbGN1bGF0ZSIsImNjIiwiQ2xhc3MiLCJCYXNlQ2xhc3MiLCJjdG9yIiwiaXNFbm91Z2hDb25kaXRpb24iLCJsaW1pdCIsImhlcm9fdm8iLCJpc05lZWQiLCJsaW1pdF9pIiwic3RhciIsImNhbGN1bGF0ZVBvd2VyIiwiYXR0cl9saXN0IiwidG90YWxfcG93ZXIiLCJsZW5ndGgiLCJrZXkiLCJ2YWx1ZSIsImF0dHJfaSIsImFycnRfaXRlbSIsInJhZGlvIiwiQ29uZmlnIiwiYXR0cl9kYXRhIiwiZGF0YV9wb3dlciIsIk1hdGgiLCJjZWlsIiwiY2hlY2tBbGxIZXJvUmVkUG9pbnQiLCJyZWRwb2ludF9kYXRhMSIsImNoZWNrSGVyb1JlZFBvaW50QnlSZWRQb2ludFR5cGUiLCJSZWRQb2ludFR5cGUiLCJlUlBMZXZlbFVwIiwicmVkcG9pbnRfZGF0YTIiLCJlUlBFcXVpcCIsInJlZHBvaW50X2RhdGEzIiwiZVJQU3RhciIsInJlZHBvaW50X2RhdGE0IiwiZVJQVGFsZW50IiwiZGF0YSIsImdldEluc3RhbmNlIiwic2V0QnRuUmVkUG9pbnQiLCJidG5faW5kZXgiLCJwYXJ0bmVyIiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImZpcmUiLCJBbGxfSGVyb19SZWRQb2ludF9FdmVudCIsImNoZWNrU2luZ2xlSGVyb1JlZFBvaW50IiwiaXNfcmVkcG9pbnQiLCJjaGVja1NpbmdsZUhlcm9MZXZlbFVwUmVkUG9pbnQiLCJjaGVja1NpbmdsZUhlcm9FcXVpcFJlZFBvaW50IiwiY2hlY2tTaW5nbGVIZXJvVXBncmFkZVN0YXJSZWRQb2ludCIsImNoZWNrU2luZ2xlSGVyb1RhbGVudFNraWxsUmVkUG9pbnQiLCJjaGVja1NpbmdsZVN0YXJGdXNlUmVkUG9pbnRCeVN0YXJDb25maWciLCJzdGFyX2NvbmZpZyIsImlzX2lnbm9yZV9tYXN0ZXJfY2FyZCIsInBhcnRuZXJfaWQiLCJoZXJvX2l0ZW1fZGF0YV9saXN0IiwiaW5kZXgiLCJleHBlbmQiLCJleHBlbmQxIiwiZGljX3RoZV9jb25kaXRpb25zIiwiZGljX3JhbmRvbV9jb25kaXRpb25zIiwiZGljX2hlcm9faWQiLCJuZWVkX2NvdW50IiwiYmlkIiwiY291bnQiLCJleHBlbmRfaSIsImV4cGVuZDIiLCJleHBlbmQzIiwiY2FtcCIsIkhlcm9Db250cm9sbGVyIiwibW9kZWwiLCJnZXRNb2RlbCIsInRvdGFsX2NvdW50IiwiZ2V0SGVyb0xpc3RCeU1hdGNoSW5mbyIsInJlc3VsdCIsImNoZWNrU2luZ2xlQXJ0aWZhY3RSZWRQb2ludCIsImVxdWlwX3ZvIiwiYmFja3BhY2tfbW9kZWwiLCJCYWNrUGFja0NvbnN0IiwiZXF1aXBfc2NvcmVfbGlzdCIsImdldEFsbEVxdWlwTGlzdEJ5VHlwZSIsIml0ZW1fdHlwZSIsIkFSVElGQUNUQ0hJUFMiLCJVdGlscyIsImNsZWFyQWxsSGVyb1JlY29yZEJ5UmVkUG9pbnRUeXBlIiwicmVkX3BvaW50X3R5cGUiLCJpc19kZWxheSIsImhlcm9fbGlzdCIsImdldEhlcm9MaXN0IiwiaGVyb19pIiwicmVkX3BvaW50IiwiaXNfZGVsYXlfcmVkcG9pbnRfdXBkYXRlIiwiaXNfcmV0dXJuIiwicmVkcG9pbnRfZGF0YSIsInN0YXR1cyIsImlzQ2hlY2tIZXJvUmVkUG9pbnRCeUhlcm9WbyIsImlzRm9ybURyYW1hIiwiZ2V0SGVyb1Nob3dMZXZlbFN0YXR1cyIsImxldl9jb25maWciLCJwYXJ0bmVyX2RhdGEiLCJkYXRhX3BhcnRuZXJfbGV2IiwibGV2IiwidXBfY29zdCIsImxldl9yZWRwb2ludCIsImNvc3RfaSIsImNvc3QiLCJnZXRJdGVtTnVtQnlCaWQiLCJnZXROb3JLZXkiLCJ0eXBlIiwiYnJlYWtfaWQiLCJicmVha19sZXYiLCJicmVha19jb25maWciLCJkYXRhX3BhcnRuZXJfYnJhY2giLCJjb3N0X2xpc3QiLCJicmVha19yZWRwb2ludCIsImVxdWlwX2xpc3QiLCJnZXRIZXJvRXF1aXBMaXN0IiwiZXF1aXBfdHlwZV9saXN0IiwiRXF1aXBQb3NMaXN0IiwiZXF1aXBfdHlwZV9pIiwiY2hlY2tTaW5nbGVIZXJvRWFjaFBvc0VxdWlwUmVkUG9pbnQiLCJlcXVpcF90eXBlIiwibmV4dCIsImFsbF9zY29yZSIsInNldEVuY2hhbnRTY29yZSIsInNjb3JlIiwiZXF1aXBfaSIsImVxdWlwX2l0ZW0iLCJuZXh0X2tleSIsIm5leHRfc3Rhcl9jb25maWciLCJnZGF0YSIsImhlcm9faW5mb191cGdyYWRlX3N0YXJfcGFyYW0yIiwiY2hlY2tPcGVuU3RhcjExIiwic3Rhcl9yZXN1bHQiLCJvdGhlcl9leHBlbmQiLCJsb2ciLCJpc19vcGVuX3RhbGVudCIsImlzaGF2ZVRhbGVudERhdGEiLCJkaWNfaGVyb190YWxlbnRfc2tpbGxfbGVhcm5fcmVkcG9pbnQiLCJnZXRUYWxlbnRSZWRwb2ludFJlY29yZCIsImRpY19za2lsbF9pZCIsInBvcyIsInRhbGVudF9za2lsbF9saXN0IiwiaWQiLCJpIiwicGFydG5lcl9za2lsbF9kYXRhIiwiZGF0YV9wYXJ0bmVyX3NraWxsX3BvcyIsInYiLCJjaGVja1NpbmdsZVRhbGVudFNraWxsTGV2ZWwiLCJpc19sb2NrIiwicG9zX2xpbWl0Iiwic2tpbGxfaWQiLCJjb25maWciLCJkYXRhX3BhcnRuZXJfc2tpbGxfbGV2ZWwiLCJpc19lbm91Z2giLCJoYXZlX251bSIsIm5leHRfYnJlYWtfY29uZmlnIiwibGV2X21heCIsImNsZWFyQWxsU3RhckZ1c2VSZWRwb2ludFJlY29yZCIsImRpY19mdXNlX2luZm8iLCJnZXRTdGFyRnVzZUxpc3QiLCJkYXRhX2kiLCJmdXNlX2RhdGEiLCJjdXJfcmVkcG9pbnQiLCJSZWRNZ3IiLCJhZGRDYWxIYW5kbGVyIiwiY2hlY2tBbGxTdGFyRnVzZVJlZHBvaW50IiwiYmluZCIsIlJlZElkcyIsIlJlZnVzZUhlcm8iLCJjaGVja0NhbXBTdGFyRnVzZVJlZHBvaW50IiwiTWFpblNjZW5lQ29udHJvbGxlciIsIlNjZW5lQ29uc3QiLCJzZXRCdWlsZFJlZFN0YXR1cyIsIkNlbnRlclNjZW5lQnVpbGQiLCJmdXNlIiwiY2FtcF9mdXNlX2luZm8iLCJpc19hbGxfcmVkcG9pbnQiLCJjaGVja1NpbmdsZVN0YXJGdXNlUmVkUG9pbnQiLCJpbnN0YW5jZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQSxJQUFJQSxTQUFTLEdBQVlDLE9BQU8sQ0FBQyxZQUFELENBQWhDOztBQUNBLElBQUlDLFNBQVMsR0FBWUQsT0FBTyxDQUFDLFlBQUQsQ0FBaEM7O0FBQ0EsSUFBSUUsa0JBQWtCLEdBQUdGLE9BQU8sQ0FBQyxxQkFBRCxDQUFoQzs7QUFDQSxJQUFJRyxnQkFBZ0IsR0FBS0gsT0FBTyxDQUFDLG1CQUFELENBQWhDOztBQUNBLElBQUlJLFdBQVcsR0FBVUosT0FBTyxDQUFDLGNBQUQsQ0FBaEM7O0FBRUEsSUFBSUssYUFBYSxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUM1QixhQUFTQyxTQURtQjtBQUc1QkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFXLENBRWhCLENBTDJCO0FBTzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0FDLEVBQUFBLGlCQUFpQixFQUFFLDJCQUFTQyxLQUFULEVBQWdCQyxPQUFoQixFQUF5QjtBQUN4QyxRQUFJQyxNQUFNLEdBQUcsSUFBYjs7QUFDQSxTQUFLLElBQUlDLE9BQVQsSUFBb0JILEtBQXBCLEVBQTJCO0FBQ3ZCLFVBQUlBLEtBQUssQ0FBQ0csT0FBRCxDQUFMLENBQWUsQ0FBZixLQUFxQixNQUF6QixFQUNJLElBQUlGLE9BQU8sQ0FBQ0csSUFBUixHQUFlSixLQUFLLENBQUNHLE9BQUQsQ0FBTCxDQUFlLENBQWYsQ0FBbkIsRUFBc0M7QUFDbENELFFBQUFBLE1BQU0sR0FBRyxLQUFUO0FB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LEdBQXdCRSxNQUFNLENBQUNGLFdBQVAsSUFBc0IsQ0FBOUM7QUFFQSxXQUFPRSxNQUFNLENBQUM1QixXQUFkO0FBQ0g7QUExbUIyQixDQUFULENBQXBCLEVBK21CQTs7QUFDQTlDLGFBQWEsQ0FBQ3FDLFdBQWQsR0FBNEIsWUFBVztBQUNuQyxNQUFJLENBQUMsS0FBSzhJLFFBQVYsRUFBb0I7QUFDaEIsU0FBS0EsUUFBTCxHQUFnQixJQUFJLElBQUosRUFBaEI7QUFDSDs7QUFDRCxTQUFPLEtBQUtBLFFBQVo7QUFDSCxDQUxEOztBQVFBQyxNQUFNLENBQUNDLE9BQVAsR0FBaUJyTCxhQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdmFyIEhlcm9Db250cm9sbGVyID0gcmVxdWlyZShcImhlcm9fY29udHJvbGxlclwiKTtcclxudmFyIEhlcm9FdmVudCAgICAgICAgICA9IHJlcXVpcmUoXCJoZXJvX2V2ZW50XCIpO1xyXG52YXIgSGVyb0NvbnN0ICAgICAgICAgID0gcmVxdWlyZShcImhlcm9fY29uc3RcIik7XHJcbnZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcclxudmFyIE1haW51aUNvbnRyb2xsZXIgICA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKVxyXG52YXIgTWFpbnVpQ29uc3QgICAgICAgID0gcmVxdWlyZShcIm1haW51aV9jb25zdFwiKTtcclxuXHJcbnZhciBIZXJvQ2FsY3VsYXRlID0gY2MuQ2xhc3Moe1xyXG5cdGV4dGVuZHM6IEJhc2VDbGFzcyxcclxuXHJcblx0Y3RvcjogZnVuY3Rpb24oKSB7XHJcblx0XHRcclxuXHR9LFxyXG5cclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLeiLsembhOWNh+e6p+WNh+mYtueahOe6oueCuemAu+i+kS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvL+aYr+i2s+Wkn+mcgOimgeadoeS7tlxyXG5cdC8vQGxpbWl0IOmZkOWItuadoeS7tlxyXG5cdC8vQCBoZXJvX3ZvIOiLsembhOS/oeaBr1xyXG5cdGlzRW5vdWdoQ29uZGl0aW9uOiBmdW5jdGlvbihsaW1pdCwgaGVyb192bykge1xyXG5cdCAgICB2YXIgaXNOZWVkID0gdHJ1ZTtcclxuXHQgICAgZm9yICh2YXIgbGltaXRfaSBpbiBsaW1pdCkge1xyXG5cdCAgICAgICAgaWYgKGxpbWl0W2xpbWl0X2ldWzBdID09IFwic3RhclwiKVxyXG5cdCAgICAgICAgICAgIGlmIChoZXJvX3ZvLnN0YXIgPCBsaW1pdFtsaW1pdF9pXVsxXSkge1xyXG5cdCAgICAgICAgICAgICAgICBpc05lZWQgPSBmYWxzZTtcclxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XHJcblx0ICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblx0ICAgIHJldHVybiBpc05lZWQ7XHJcblx0fSxcclxuXHJcblx0Y2FsY3VsYXRlUG93ZXI6IGZ1bmN0aW9uKGF0dHJfbGlzdCkge1xyXG5cdCAgICB2YXIgdG90YWxfcG93ZXIgPSAwO1xyXG5cdCAgICBpZiAoIWF0dHJfbGlzdCB8fCBhdHRyX2xpc3QubGVuZ3RoID09PSAwKSBcclxuXHQgICAgICAgIHJldHVybiB0b3RhbF9wb3dlclxyXG5cdCAgICBcclxuXHQgICAgdmFyIGtleSA9IG51bGwsIHZhbHVlID0gbnVsbDtcclxuXHQgICAgZm9yICh2YXIgYXR0cl9pIGluIGF0dHJfbGlzdCkge1xyXG5cdCAgICBcdHZhciBhcnJ0X2l0ZW0gPSBhdHRyX2xpc3RbYXR0cl9pXTtcclxuXHQgICAgXHRpZiAodHlwZW9mIGFycnRfaXRlbSA9PSBcImFycmF5XCIpIHtcclxuXHQgICAgXHRcdGtleSA9IGFycnRfaXRlbVswXTtcclxuXHQgICAgXHRcdHZhbHVlID0gYXJydF9pdGVtWzFdO1xyXG5cdCAgICBcdH0gZWxzZSB7XHJcblx0ICAgIFx0XHRrZXkgPSBhdHRyX2k7XHJcblx0ICAgIFx0XHR2YWx1ZSA9IGFycnRfaXRlbTtcclxuXHQgICAgXHR9XHJcblx0ICAgIFx0dmFyIHJhZGlvID0gQ29uZmlnLmF0dHJfZGF0YS5kYXRhX3Bvd2VyW2tleV07XHJcblx0ICAgIFx0aWYgKHJhZGlvKSB7XHJcblx0ICAgICAgICAgICAgdG90YWxfcG93ZXIgPSB0b3RhbF9wb3dlciArIHZhbHVlICogcmFkaW8gKiAwLjAwMTtcclxuXHQgICAgXHR9XHJcblx0ICAgIH1cclxuXHJcblx0ICAgIHJldHVybiBNYXRoLmNlaWwodG90YWxfcG93ZXIpO1xyXG5cdH0sXHJcblxyXG5cclxuXHQvLyDmo4Dmn6XmiYDmnInmnInmlYjoi7Hpm4TnuqLngrkgXHJcblx0Y2hlY2tBbGxIZXJvUmVkUG9pbnQ6IGZ1bmN0aW9uKCkge1xyXG5cdCAgICB2YXIgcmVkcG9pbnRfZGF0YTEgPSB0aGlzLmNoZWNrSGVyb1JlZFBvaW50QnlSZWRQb2ludFR5cGUoSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBMZXZlbFVwLCB0cnVlKVxyXG5cdCAgICB2YXIgcmVkcG9pbnRfZGF0YTIgPSB0aGlzLmNoZWNrSGVyb1JlZFBvaW50QnlSZWRQb2ludFR5cGUoSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBFcXVpcCwgdHJ1ZSlcclxuXHQgICAgdmFyIHJlZHBvaW50X2RhdGEzID0gdGhpcy5jaGVja0hlcm9SZWRQb2ludEJ5UmVkUG9pbnRUeXBlKEhlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQU3RhciwgdHJ1ZSlcclxuXHQgICAgdmFyIHJlZHBvaW50X2RhdGE0ID0gdGhpcy5jaGVja0hlcm9SZWRQb2ludEJ5UmVkUG9pbnRUeXBlKEhlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQVGFsZW50LCB0cnVlKVxyXG5cdCAgICAvLyDnrZbliJLopoHmsYIg5aSp6LWL5LiN566X5aaC5Li755WM6Z2i57qi54K5IOS9huaYr+eul+WFpeiLsembhOiDjOWMhee6oueCuVxyXG5cdCAgICB2YXIgZGF0YSA9IFtyZWRwb2ludF9kYXRhMSwgcmVkcG9pbnRfZGF0YTIsIHJlZHBvaW50X2RhdGEzXTsgLy8gLCByZWRwb2ludF9kYXRhNFxyXG5cdCAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0QnRuUmVkUG9pbnQoTWFpbnVpQ29uc3QuYnRuX2luZGV4LnBhcnRuZXIsZGF0YSk7XHJcblx0ICAgIHZhciBkYXRhID0gW3JlZHBvaW50X2RhdGExLCByZWRwb2ludF9kYXRhMiwgcmVkcG9pbnRfZGF0YTNdO1xyXG5cdCAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEhlcm9FdmVudC5BbGxfSGVyb19SZWRQb2ludF9FdmVudCwgZGF0YSk7XHJcblx0fSxcclxuXHJcblxyXG5cdC8v5qOA5p+l5Y2V5Liq6Iux6ZuE55qE57qi54K55L+h5oGvXHJcblx0Y2hlY2tTaW5nbGVIZXJvUmVkUG9pbnQ6IGZ1bmN0aW9uKGhlcm9fdm8pIHtcclxuXHQgICAgdmFyIGlzX3JlZHBvaW50ID0gZmFsc2U7XHJcblx0ICAgIC8v5Y2H57qnIOWNh+mYtue6oueCuVxyXG5cdCAgICBpc19yZWRwb2ludCA9IHRoaXMuY2hlY2tTaW5nbGVIZXJvTGV2ZWxVcFJlZFBvaW50KGhlcm9fdm8pO1xyXG5cdCAgICBpZiAoaXNfcmVkcG9pbnQpIHJldHVybiB0cnVlO1xyXG5cdCAgICAvL+ijheWkh+e6oueCuVxyXG5cdCAgICBpc19yZWRwb2ludCA9IHRoaXMuY2hlY2tTaW5nbGVIZXJvRXF1aXBSZWRQb2ludChoZXJvX3ZvKVxyXG5cdCAgICBpZiAoaXNfcmVkcG9pbnQpIHJldHVybiB0cnVlO1xyXG5cdCAgICAvL+WNh+aYn+e6oueCuVxyXG5cdCAgICBpc19yZWRwb2ludCA9IHRoaXMuY2hlY2tTaW5nbGVIZXJvVXBncmFkZVN0YXJSZWRQb2ludChoZXJvX3ZvKVxyXG5cdCAgICBpZiAoaXNfcmVkcG9pbnQpIHJldHVybiB0cnVlO1xyXG5cdCAgICAvL+Wkqei1i+e6oueCuVxyXG5cdCAgICBpc19yZWRwb2ludCA9IHRoaXMuY2hlY2tTaW5nbGVIZXJvVGFsZW50U2tpbGxSZWRQb2ludChoZXJvX3ZvKVxyXG5cdCAgICByZXR1cm4gaXNfcmVkcG9pbnRcdFx0XHJcblx0fSxcclxuXHJcblx0Ly8g6K6h566X5Y2H5pif57qi54K557qi54K55qC55o2u5Y2H5pif6KGoXHJcblx0Ly8gQGlzX2lnbm9yZV9tYXN0ZXJfY2FyZCDmmK/lkKblv73op4bkuLvljaEoNuaYn+S7peS4iueahOWNh+aYn+mAu+i+kSlcclxuXHQvLyBAcGFydG5lcl9pZCDlv73op4bkuLvljaHnmoQg5ZSv5LiAaWRcclxuXHRjaGVja1NpbmdsZVN0YXJGdXNlUmVkUG9pbnRCeVN0YXJDb25maWc6IGZ1bmN0aW9uKHN0YXJfY29uZmlnLCBpc19pZ25vcmVfbWFzdGVyX2NhcmQsIHBhcnRuZXJfaWQpIHtcclxuXHQgICAgaWYgKCFzdGFyX2NvbmZpZykgcmV0dXJuIGZhbHNlO1xyXG5cdCAgICB2YXIgaGVyb19pdGVtX2RhdGFfbGlzdCA9IHt9O1xyXG5cdCAgICB2YXIgaW5kZXggPSAxO1xyXG5cdCAgICB2YXIgZXhwZW5kID0gc3Rhcl9jb25maWcuZXhwZW5kMVswXTtcclxuXHQgICAgLy8g54m55a6a5p2h5Lu25pWw5o2uIOe7k+aehCBkaWNfdGhlX2NvbmRpdGlvbnNbYmlkXVvmmJ/nuqddID0g5pWw6YePXHJcblx0ICAgIHZhciBkaWNfdGhlX2NvbmRpdGlvbnMgPSB7fTtcclxuXHQgICAgLy8g6ZqP5py65p2h5Lu2IGRpY19yYW5kb21fY29uZGl0aW9uc1vpmLXokKVdW+aYn+e6p10gPSDmlbDph49cclxuXHQgICAgdmFyIGRpY19yYW5kb21fY29uZGl0aW9ucyA9IHt9O1xyXG5cdCAgICAvLyDmoIflv5flt7LnlKhcclxuXHQgICAgdmFyIGRpY19oZXJvX2lkID0ge307XHJcblx0ICAgIHZhciBuZWVkX2NvdW50ID0gMDtcclxuXHQgICAgaWYgKCFpc19pZ25vcmVfbWFzdGVyX2NhcmQpIHtcclxuXHQgICAgICAgIGlmIChleHBlbmQpIHtcclxuXHQgICAgICAgICAgICAvLyDmjIflrprnmoQgezEwNDAyLDQsMX0gOiAxMDQwMjog6KGo56S6YmlkLCA0OiDooajnpLrmmJ/nuqcgMTrooajnpLrmlbDph49cclxuXHQgICAgICAgICAgICB2YXIgYmlkID0gZXhwZW5kWzBdO1xyXG5cdCAgICAgICAgICAgIHZhciBzdGFyID0gZXhwZW5kWzFdO1xyXG5cdCAgICAgICAgICAgIHZhciBjb3VudCA9IGV4cGVuZFsyXTtcclxuXHJcblx0ICAgICAgICAgICAgZGljX3RoZV9jb25kaXRpb25zW2JpZF0gPSB7fTtcclxuXHQgICAgICAgICAgICBkaWNfdGhlX2NvbmRpdGlvbnNbYmlkXVtzdGFyXSA9IGNvdW50O1xyXG5cdCAgICAgICAgICAgIG5lZWRfY291bnQgPSBuZWVkX2NvdW50ICsgY291bnQ7XHJcblx0ICAgICAgICB9XHJcblx0ICAgICAgICBpbmRleCA9IGluZGV4ICsgMTtcdCAgICBcdFxyXG5cdCAgICB9IGVsc2Uge1xyXG5cdCAgICAgICAgZGljX2hlcm9faWRbcGFydG5lcl9pZF0gPSAxO1xyXG5cdCAgICB9XHJcblxyXG5cdCAgICBmb3IgKHZhciBleHBlbmRfaSA9IDA7ZXhwZW5kX2k8IHN0YXJfY29uZmlnLmV4cGVuZDIubGVuZ3RoOysrZXhwZW5kX2kpIHtcclxuXHQgICAgICAgIC8vIOaMh+WumueahCB7MTA0MDIsNCwxfSA6IDEwNDAyOiDooajnpLpiaWQsIDQ6IOihqOekuuaYn+e6pyAxOuihqOekuuaVsOmHj1xyXG5cdCAgICBcdHZhciBleHBlbmQgPSBzdGFyX2NvbmZpZy5leHBlbmQyW2V4cGVuZF9pXTtcclxuXHJcbiAgICAgICAgICAgIHZhciBiaWQgPSBleHBlbmRbMF07XHJcbiAgICAgICAgICAgIHZhciBzdGFyID0gZXhwZW5kWzFdO1xyXG4gICAgICAgICAgICB2YXIgY291bnQgPSBleHBlbmRbMl07XHJcblxyXG5cdCAgICAgICAgaWYgKCFkaWNfdGhlX2NvbmRpdGlvbnNbYmlkXSlcclxuXHQgICAgICAgICAgICBkaWNfdGhlX2NvbmRpdGlvbnNbYmlkXSA9IHt9O1xyXG5cclxuXHQgICAgICAgIGlmICghZGljX3RoZV9jb25kaXRpb25zW2JpZF1bc3Rhcl0pIHtcclxuXHQgICAgICAgICAgICBkaWNfdGhlX2NvbmRpdGlvbnNbYmlkXVtzdGFyXSA9IGNvdW50O1xyXG5cdCAgICAgICAgfSBlbHNlIHtcclxuXHQgICAgICAgICAgICBkaWNfdGhlX2NvbmRpdGlvbnNbYmlkXVtzdGFyXSA9IGRpY190aGVfY29uZGl0aW9uc1tiaWRdW3N0YXJdICsgY291bnQ7XHJcblx0ICAgICAgICB9XHJcblx0ICAgICAgICBuZWVkX2NvdW50ID0gbmVlZF9jb3VudCArIGNvdW50O1xyXG5cdCAgICAgICAgaW5kZXggPSBpbmRleCArIDE7XHJcblx0ICAgIH1cclxuXHJcblx0ICAgIC8vIDTmmK/lkoznrZbliJLor7Tlpb3kuobmnIDlpJo05LiqXHJcblx0ICAgIGlmIChpbmRleCA8PSA0KSB7XHJcblx0ICAgICAgICAvLyDpmo/mnLrnmoQgezEsNCwyfSA6IDEg6KGo56S66Zi16JClICA0OiDooajnpLrmmJ/nuqcgMuihqOekuuaVsOmHj1xyXG5cdFx0ICAgIGZvciAodmFyIGV4cGVuZF9pPTA7ZXhwZW5kX2k8c3Rhcl9jb25maWcuZXhwZW5kMy5sZW5ndGg7KytleHBlbmRfaSkge1xyXG5cdFx0ICAgIFx0dmFyIGV4cGVuZCA9IHN0YXJfY29uZmlnLmV4cGVuZDNbZXhwZW5kX2ldO1xyXG5cdCAgICAgICAgICAgIHZhciBjYW1wID0gZXhwZW5kWzBdO1xyXG5cdCAgICAgICAgICAgIHZhciBzdGFyID0gZXhwZW5kWzFdO1xyXG5cdCAgICAgICAgICAgIHZhciBjb3VudCA9IGV4cGVuZFsyXTtcclxuXHJcblx0ICAgICAgICAgICAgaWYgKCFkaWNfcmFuZG9tX2NvbmRpdGlvbnNbY2FtcF0pXHJcblx0ICAgICAgICAgICAgICAgIGRpY19yYW5kb21fY29uZGl0aW9uc1tjYW1wXSA9IHt9O1xyXG5cclxuXHQgICAgICAgICAgICBpZiAoIWRpY19yYW5kb21fY29uZGl0aW9uc1tjYW1wXVtzdGFyXSkge1xyXG5cdCAgICAgICAgICAgICAgICBkaWNfcmFuZG9tX2NvbmRpdGlvbnNbY2FtcF1bc3Rhcl0gPSBjb3VudDtcclxuXHQgICAgICAgICAgICB9IGVsc2Uge1xyXG5cdCAgICAgICAgICAgICAgICBkaWNfcmFuZG9tX2NvbmRpdGlvbnNbY2FtcF1bc3Rhcl0gPSBkaWNfcmFuZG9tX2NvbmRpdGlvbnNbY2FtcF1bc3Rhcl0gKyBjb3VudDtcclxuXHQgICAgICAgICAgICB9XHJcblxyXG5cdCAgICAgICAgICAgIG5lZWRfY291bnQgPSBuZWVkX2NvdW50ICsgY291bnQ7IFxyXG5cdCAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxO1xyXG5cdCAgICAgICAgICAgIGlmIChpbmRleCA+IDQpXHJcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cdFx0ICAgIH1cclxuXHQgICAgfVxyXG5cclxuXHQgICAgLy8g6I635Y+W5YiX6KGoXHJcblx0ICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XHJcblx0ICAgIHZhciBtb2RlbCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKTtcclxuXHQgICAgdmFyIHRvdGFsX2NvdW50ID0gbW9kZWwuZ2V0SGVyb0xpc3RCeU1hdGNoSW5mbyhkaWNfdGhlX2NvbmRpdGlvbnMsIGRpY19yYW5kb21fY29uZGl0aW9ucywgZGljX2hlcm9faWQpO1xyXG5cdCAgICB2YXIgaXNfcmVkcG9pbnQgPSB0b3RhbF9jb3VudCA+PSBuZWVkX2NvdW50O1xyXG5cdCAgICB2YXIgcmVzdWx0ID0ge2lzX3JlZHBvaW50OiBpc19yZWRwb2ludCwgbmVlZF9jb3VudDogbmVlZF9jb3VudCwgdG90YWxfY291bnQ6IHRvdGFsX2NvdW50fTtcclxuXHQgICAgcmV0dXJuIHJlc3VsdDtcclxuXHR9LFxyXG5cclxuXHQvL+ajgOa1i+espuaWh+exu+Wei+eahOe6oueCuVxyXG5cdC8vQGVxdWlwX3ZvIOespuaWh+WvueixoS4u5aaC5p6c5Li656m66K+05piO5rKh5pyJ56ym5paHXHJcblx0Y2hlY2tTaW5nbGVBcnRpZmFjdFJlZFBvaW50OmZ1bmN0aW9uKGVxdWlwX3ZvKXtcclxuXHRcdHZhciBiYWNrcGFja19tb2RlbCA9IHJlcXVpcmUoXCJiYWNrcGFja19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKTtcclxuXHRcdHZhciBCYWNrUGFja0NvbnN0ID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnN0XCIpXHJcblx0XHR2YXIgZXF1aXBfc2NvcmVfbGlzdCA9IGJhY2twYWNrX21vZGVsLmdldEFsbEVxdWlwTGlzdEJ5VHlwZShCYWNrUGFja0NvbnN0Lml0ZW1fdHlwZS5BUlRJRkFDVENISVBTKVxyXG5cclxuXHRcdGlmKGVxdWlwX3ZvID09IG51bGwpe1xyXG5cdFx0XHRpZihlcXVpcF9zY29yZV9saXN0ICYmIFV0aWxzLmVxdWlwX3Njb3JlX2xpc3Qpe1xyXG5cdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBmYWxzZVxyXG5cdH0sXHJcblxyXG5cdC8vIOagueaNrue6oueCueexu+WeiyDmuIXnqbrnuqLngrnorrDlvZUgXHJcblx0Ly8gQHJlZF9wb2ludF90eXBlIOWPguiAgyBIZXJvQ29uc3QuUmVkUG9pbnRUeXBlXHJcblx0Ly8gQGlzX2RlbGF5IOaYr+WQpuW7tui/n+ajgOa1i1xyXG5cdGNsZWFyQWxsSGVyb1JlY29yZEJ5UmVkUG9pbnRUeXBlOiBmdW5jdGlvbihyZWRfcG9pbnRfdHlwZSwgaXNfZGVsYXkpIHtcclxuXHQgICAgLy8g6ams5LiK5riF6ZmkXHJcblx0ICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XHJcblx0ICAgIHZhciBtb2RlbCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKTtcclxuXHQgICAgdmFyIGhlcm9fbGlzdCA9IG1vZGVsLmdldEhlcm9MaXN0KCk7XHJcblxyXG5cdCAgICBmb3IgKHZhciBoZXJvX2kgaW4gaGVyb19saXN0KSB7XHJcblx0ICAgIFx0aGVyb19saXN0W2hlcm9faV0ucmVkX3BvaW50W3JlZF9wb2ludF90eXBlXSA9IG51bGw7XHJcblx0ICAgIH1cclxuXHJcblx0XHR0aGlzLmNoZWNrSGVyb1JlZFBvaW50QnlSZWRQb2ludFR5cGUocmVkX3BvaW50X3R5cGUpO1xyXG5cdFx0aWYocmVkX3BvaW50X3R5cGUgPT0gSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBMZXZlbFVwIHx8IHJlZF9wb2ludF90eXBlID09IEhlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQVGFsZW50KXtcclxuICAgICAgICAgICAgLy8gLS3nm67liY3ljYfnuqcg5ZKMIOWkqei1iyDnlKjliLDlu7bov59cclxuICAgICAgICAgICAgbW9kZWwuaXNfZGVsYXlfcmVkcG9pbnRfdXBkYXRlW3JlZF9wb2ludF90eXBlXSA9IGZhbHNlXHJcblx0XHR9XHJcblx0fSxcclxuXHJcblxyXG5cdC8vIOagueaNrue6oueCueexu+WeiyDmuIXmo4DmtYvnuqLngrnorrDlvZUgXHJcblx0Ly8gQHJlZF9wb2ludF90eXBlIOWPguiAgyBIZXJvQ29uc3QuUmVkUG9pbnRUeXBlXHJcblx0Ly8gQCDmmK/lkKblj6rmmK/ov5Tlm54g57qi54K55pWw5o2u5bCx5aW9XHJcblx0Y2hlY2tIZXJvUmVkUG9pbnRCeVJlZFBvaW50VHlwZTogZnVuY3Rpb24ocmVkX3BvaW50X3R5cGUsIGlzX3JldHVybikge1xyXG5cdCAgICB2YXIgSGVyb0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpO1x0XHRcclxuXHQgICAgdmFyIGhlcm9fbGlzdCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRIZXJvTGlzdCgpO1xyXG5cdCAgICB2YXIgcmVkcG9pbnRfZGF0YSA9IHt9O1xyXG5cdCAgICByZWRwb2ludF9kYXRhLmJpZCA9IHJlZF9wb2ludF90eXBlO1xyXG5cdCAgICByZWRwb2ludF9kYXRhLnN0YXR1cyA9IGZhbHNlO1xyXG5cclxuXHQgICAgZm9yICh2YXIgaGVyb19pIGluIGhlcm9fbGlzdCkge1xyXG5cdCAgICBcdHZhciBoZXJvX3ZvID0gaGVyb19saXN0W2hlcm9faV07XHJcblx0ICAgICAgICBpZiAodGhpcy5pc0NoZWNrSGVyb1JlZFBvaW50QnlIZXJvVm8oaGVyb192bykpIHsgICAgICAvL+etiee6p1xyXG5cdCAgICAgICAgICAgIGlmIChyZWRfcG9pbnRfdHlwZSA9PSBIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUExldmVsVXApIHtcclxuXHQgICAgICAgICAgICAgICAgcmVkcG9pbnRfZGF0YS5zdGF0dXMgPSB0aGlzLmNoZWNrU2luZ2xlSGVyb0xldmVsVXBSZWRQb2ludChoZXJvX3ZvKTtcclxuXHQgICAgICAgICAgICAgICAgaWYgKHJlZHBvaW50X2RhdGEuc3RhdHVzKVxyXG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHQgICAgICAgICAgICBcdFxyXG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAocmVkX3BvaW50X3R5cGUgPT0gSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBFcXVpcCkgeyAgIC8v6KOF5aSHXHJcblx0ICAgICAgICAgICAgICAgIHJlZHBvaW50X2RhdGEuc3RhdHVzID0gdGhpcy5jaGVja1NpbmdsZUhlcm9FcXVpcFJlZFBvaW50KGhlcm9fdm8pO1xyXG5cdCAgICAgICAgICAgICAgICBpZiAocmVkcG9pbnRfZGF0YS5zdGF0dXMpXHJcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZF9wb2ludF90eXBlID09IEhlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQU3RhcikgeyAgIC8v5Y2H5pifXHJcblx0ICAgICAgICAgICAgICAgIHJlZHBvaW50X2RhdGEuc3RhdHVzID0gdGhpcy5jaGVja1NpbmdsZUhlcm9VcGdyYWRlU3RhclJlZFBvaW50KGhlcm9fdm8pO1xyXG5cdCAgICAgICAgICAgICAgICBpZiAocmVkcG9pbnRfZGF0YS5zdGF0dXMpIFxyXG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChyZWRfcG9pbnRfdHlwZSA9PSBIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUFRhbGVudCkgeyAgIC8v5aSp6LWLXHJcblx0ICAgICAgICAgICAgICAgIHJlZHBvaW50X2RhdGEuc3RhdHVzID0gdGhpcy5jaGVja1NpbmdsZUhlcm9UYWxlbnRTa2lsbFJlZFBvaW50KGhlcm9fdm8pO1xyXG5cdCAgICAgICAgICAgICAgICBpZiAocmVkcG9pbnRfZGF0YS5zdGF0dXMpIFxyXG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblx0ICAgICAgICAgICAgfVxyXG5cdCAgICAgICAgfVxyXG5cdCAgICB9XHJcblxyXG5cdCAgICBpZiAoaXNfcmV0dXJuKSB7XHJcblx0ICAgICAgICByZXR1cm4gcmVkcG9pbnRfZGF0YVxyXG5cdCAgICB9IGVsc2Uge1xyXG5cdCAgICAgICAgLy8gaWYgcmVkX3BvaW50X3R5cGUgfj0gSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBUYWxlbnQgdGhlbiAtLeWkqei1i1xyXG5cdCAgICAgICAgLy8gICAgIC8vIOetluWIkuimgeaxgiDlpKnotYvkuI3nrpflpoLkuLvnlYzpnaLnuqLngrkg5L2G5piv566X5YWl6Iux6ZuE6IOM5YyF57qi54K5XHJcblx0ICAgICAgICAvLyAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEJ0blJlZFBvaW50KE1haW51aUNvbnN0LmJ0bl9pbmRleC5wYXJ0bmVyLHtyZWRwb2ludF9kYXRhfSlcclxuXHQgICAgICAgIC8vIGVuZFxyXG5cdFx0ICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRCdG5SZWRQb2ludChNYWludWlDb25zdC5idG5faW5kZXgucGFydG5lciwgW3JlZHBvaW50X2RhdGFdKTtcdCAgICAgICAgXHJcbiAgICBcdCAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEhlcm9FdmVudC5BbGxfSGVyb19SZWRQb2ludF9FdmVudCwgW3JlZHBvaW50X2RhdGFdKTtcclxuXHQgICAgICAgIC8vIEdsb2JhbEV2ZW50LmdldEluc3RhbmNlKCkuRmlyZShIZXJvRXZlbnQuQWxsX0hlcm9fUmVkUG9pbnRfRXZlbnQsIHtyZWRwb2ludF9kYXRhfSlcclxuXHQgICAgfVxyXG5cdH0sXHJcblxyXG5cdC8v5piv5ZCm6ZyA6KaB5qOA5rWL57qi54K5XHJcblx0aXNDaGVja0hlcm9SZWRQb2ludEJ5SGVyb1ZvOiBmdW5jdGlvbihoZXJvX3ZvKSB7XHJcblx0ICAgIC8vICAzIOS7peWQjui1sOmFjee9ruihqCBcclxuXHQgICAgLy8g562J5LqOID4gM+e6pyDlkowg5LiK6Zi155qE6Iux6ZuE6ZyA6KaB5qOA5p+l57qi54K5IOazqOaEjzogaGVyb192by5sZXYgPiAzIOaaguaXtuS4jeimgVxyXG5cdCAgICAvLyBoZXJvX3ZvLmlzX2luX2Zvcm0gPCAxMCDlm6DkuLogaXNfaW5fZm9ybS7mlLnmiJAg5biD6Zi157G75Z6LICoxMCArIOW6j+WPt+S6hlxyXG5cdCAgICBpZiAoIWhlcm9fdm8pIHJldHVybjtcclxuXHJcblx0ICAgIGlmIChoZXJvX3ZvLmlzRm9ybURyYW1hKCkpXHJcblx0ICAgICAgICByZXR1cm4gdHJ1ZVxyXG5cdCAgICByZXR1cm4gZmFsc2U7XHJcblx0fSxcclxuXHJcblx0Ly8g5qOA5p+l5Y2V5Liq6Iux6ZuE5Y2H57qn57qi54K5IOWPiui/m+mYtue6oueCuVxyXG5cdGNoZWNrU2luZ2xlSGVyb0xldmVsVXBSZWRQb2ludDogZnVuY3Rpb24oaGVyb192bykge1x0ICAgIFxyXG5cdFx0aWYgKCFoZXJvX3ZvKSByZXR1cm4gZmFsc2U7XHJcblx0ICAgIC8vIGlmIChoZXJvX3ZvLnJlZF9wb2ludCAmJiB0eXBlb2YgaGVyb192by5yZWRfcG9pbnRbSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBMZXZlbFVwXSAhPSBcImJvb2xlYW5cIikge1xyXG5cdCAgICAvLyAgICAgcmV0dXJuIGhlcm9fdm8ucmVkX3BvaW50W0hlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQTGV2ZWxVcF0gPT0gdHJ1ZTtcclxuXHQgICAgLy8gfVxyXG5cdFx0aWYoaGVyb192by5yZWRfcG9pbnQgJiYgaGVyb192by5yZWRfcG9pbnRbSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBMZXZlbFVwXSAhPSBudWxsKXtcclxuXHRcdFx0cmV0dXJuIGhlcm9fdm8ucmVkX3BvaW50W0hlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQTGV2ZWxVcF0gPT0gdHJ1ZVxyXG5cdFx0fVxyXG5cdCAgICB2YXIgc3RhdHVzID0gdGhpcy5nZXRIZXJvU2hvd0xldmVsU3RhdHVzKGhlcm9fdm8pO1xyXG5cdCAgICB2YXIgaXNfcmVkcG9pbnQgPSBmYWxzZTtcclxuXHJcblx0ICAgIGlmIChzdGF0dXMgPT0gMSkgeyAgLy/ljYfnuqdcclxuXHQgICAgICAgIHZhciBsZXZfY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX3BhcnRuZXJfbGV2W2hlcm9fdm8ubGV2XTtcclxuXHQgICAgICAgIGlmIChsZXZfY29uZmlnKSB7XHJcblx0ICAgICAgICAgICAgdmFyIHVwX2Nvc3QgPSBsZXZfY29uZmlnLmV4cGVuZCB8fCBbXTtcclxuXHQgICAgICAgICAgICB2YXIgbGV2X3JlZHBvaW50ID0gdHJ1ZTtcclxuXHQgICAgICAgICAgICBmb3IgKHZhciBjb3N0X2kgPSAwIDtjb3N0X2kgPCB1cF9jb3N0Lmxlbmd0aDsrK2Nvc3RfaSkge1xyXG5cdCAgICAgICAgICAgIFx0dmFyIGNvc3QgPSB1cF9jb3N0W2Nvc3RfaV07XHJcblx0XHRcdFx0XHR2YXIgY291bnQgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEl0ZW1OdW1CeUJpZChjb3N0WzBdKTtcclxuXHQgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgY29zdFsxXSl7XHJcblx0XHRcdFx0XHRcdGxldl9yZWRwb2ludCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdCAgICAgICAgICAgIH1cclxuXHRcdFx0XHRpc19yZWRwb2ludCA9IGxldl9yZWRwb2ludDtcclxuXHQgICAgICAgIH1cclxuXHQgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gMikgeyAvLyDljYfpmLZcclxuXHQgICAgICAgIHZhciBrZXkgPSBVdGlscy5nZXROb3JLZXkoaGVyb192by50eXBlLCBoZXJvX3ZvLmJyZWFrX2lkLCBoZXJvX3ZvLmJyZWFrX2xldik7XHJcblx0ICAgICAgICB2YXIgYnJlYWtfY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX3BhcnRuZXJfYnJhY2hba2V5XTtcclxuXHQgICAgICAgIGlmIChicmVha19jb25maWcpIHtcclxuXHQgICAgICAgICAgICB2YXIgY29zdF9saXN0ID0gYnJlYWtfY29uZmlnLmV4cGVuZCB8fCBbXTtcclxuXHQgICAgICAgICAgICB2YXIgYnJlYWtfcmVkcG9pbnQgPSB0cnVlO1xyXG5cdCAgICAgICAgICAgIGZvciAodmFyIGNvc3RfaT0wO2Nvc3RfaSA8IGNvc3RfbGlzdC5sZW5ndGg7Kytjb3N0X2kpIHtcclxuXHQgICAgICAgICAgICBcdHZhciBjb3N0ID0gY29zdF9saXN0W2Nvc3RfaV07XHJcblx0XHRcdFx0XHR2YXIgY291bnQgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEl0ZW1OdW1CeUJpZChjb3N0WzBdKTtcclxuXHJcblx0ICAgICAgICAgICAgICAgIGlmIChjb3VudCA8IGNvc3RbMV0pXHJcblx0ICAgICAgICAgICAgICAgICAgICBicmVha19yZWRwb2ludCA9IGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHQgICAgICAgICAgICBpc19yZWRwb2ludCA9IGJyZWFrX3JlZHBvaW50O1xyXG5cdCAgICAgICAgfVxyXG5cdCAgICB9XHJcblx0XHRpZihoZXJvX3ZvLnJlZF9wb2ludCl7XHJcblx0XHRcdGhlcm9fdm8ucmVkX3BvaW50W0hlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQTGV2ZWxVcF0gPSBpc19yZWRwb2ludCBcclxuXHRcdH1cclxuXHQgICAgcmV0dXJuIGlzX3JlZHBvaW50XHRcdFxyXG5cdH0sXHJcblxyXG5cdC8vIOajgOafpeWNleS4quiLsembhOijheWkh+e6oueCuVxyXG5cdGNoZWNrU2luZ2xlSGVyb0VxdWlwUmVkUG9pbnQ6IGZ1bmN0aW9uKGhlcm9fdm8pIHtcclxuXHRcdGlmICghaGVyb192bykgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHQgICAgaWYgKHR5cGVvZiBoZXJvX3ZvLnJlZF9wb2ludFtIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUEVxdWlwXSA9PSBcImJvb2xlYW5cIikge1xyXG5cdCAgICAgICAgcmV0dXJuIGhlcm9fdm8ucmVkX3BvaW50W0hlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQRXF1aXBdID09IHRydWVcclxuXHQgICAgfVxyXG5cclxuXHQgICAgdmFyIGlzX3JlZHBvaW50ID0gZmFsc2U7XHJcblx0ICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XHJcblx0ICAgIHZhciBtb2RlbCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKVxyXG5cdCAgICAvLyDoo4XlpIdcclxuXHQgICAgdmFyIGVxdWlwX2xpc3QgPSBtb2RlbC5nZXRIZXJvRXF1aXBMaXN0KGhlcm9fdm8ucGFydG5lcl9pZCk7XHJcblx0ICAgIHZhciBlcXVpcF90eXBlX2xpc3QgPSBIZXJvQ29uc3QuRXF1aXBQb3NMaXN0IHx8IHt9O1xyXG5cclxuXHQgICAgZm9yICh2YXIgZXF1aXBfdHlwZV9pIGluIGVxdWlwX3R5cGVfbGlzdCkge1xyXG5cclxuXHQgICAgICAgIGlzX3JlZHBvaW50ID0gdGhpcy5jaGVja1NpbmdsZUhlcm9FYWNoUG9zRXF1aXBSZWRQb2ludChlcXVpcF90eXBlX2xpc3RbZXF1aXBfdHlwZV9pXSwgZXF1aXBfbGlzdFtlcXVpcF90eXBlX2ldKVxyXG5cdCAgICAgICAgaWYgKGlzX3JlZHBvaW50KVxyXG5cdCAgICAgICAgICAgIGJyZWFrXHJcblx0ICAgIH1cclxuXHJcblx0ICAgIGhlcm9fdm8ucmVkX3BvaW50W0hlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQRXF1aXBdID0gaXNfcmVkcG9pbnQ7XHJcblx0ICAgIHJldHVybiBpc19yZWRwb2ludDtcclxuXHR9LFxyXG5cclxuXHJcblx0Ly8g5qOA5rWL6KOF5aSH57G75Z6L55qE57qi54K5XHJcblx0Ly8gQGVxdWlwX3R5cGUg6KOF5aSH57G75Z6LXHJcblx0Ly8gQGVxdWlwX3ZvIOijheWkh+WvueixoS4u5aaC5p6c5Li656m66K+05piO5rKh5pyJ6KOF5aSHXHJcblx0Y2hlY2tTaW5nbGVIZXJvRWFjaFBvc0VxdWlwUmVkUG9pbnQ6IGZ1bmN0aW9uKGVxdWlwX3R5cGUsIGVxdWlwX3ZvKSB7XHJcblx0ICAgIHZhciBlcXVpcF90eXBlID0gZXF1aXBfdHlwZSB8fCAxO1xyXG5cdCAgICB2YXIgYmFja3BhY2tfbW9kZWwgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpO1xyXG5cdCAgICB2YXIgZXF1aXBfc2NvcmVfbGlzdCA9IGJhY2twYWNrX21vZGVsLmdldEFsbEVxdWlwTGlzdEJ5VHlwZShlcXVpcF90eXBlKTtcclxuXHJcblx0ICAgIGlmICghZXF1aXBfdm8pIHtcclxuXHQgICAgICAgIC8vIOayoeacieijheWkhy4u5Yik5pat5piv5ZCm5pyJ5a+55bqU57G75Z6L55qE6KOF5aSHXHJcblx0ICAgICAgICBpZiAoZXF1aXBfc2NvcmVfbGlzdCAmJiBVdGlscy5uZXh0KGVxdWlwX3Njb3JlX2xpc3QpKSB7XHJcblx0ICAgICAgICAgICAgLy8g5pyJ57qi54K5XHJcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWVcclxuXHQgICAgICAgIH1cclxuXHQgICAgfSBlbHNlIHtcclxuXHQgICAgICAgIC8vIOWmguaenOayoeacieWIhuaVsC4u566X5LiA5LiqIC4uXHJcblx0ICAgICAgICBpZiAoIWVxdWlwX3ZvLmFsbF9zY29yZSB8fCBlcXVpcF92by5hbGxfc2NvcmUgPT0gMCkge1xyXG5cdCAgICAgICAgICAgIGVxdWlwX3ZvLnNldEVuY2hhbnRTY29yZSgwKTtcclxuXHQgICAgICAgIH1cclxuXHQgICAgICAgIHZhciBzY29yZSA9IGVxdWlwX3ZvLmFsbF9zY29yZSB8fCAwO1xyXG5cdCAgICAgICAgaWYgKGVxdWlwX3Njb3JlX2xpc3QpIHtcclxuXHQgICAgICAgICAgICAvLyDopoHliKTmlq3lvZPliY3oo4XlpIfmr5Tog4zljIXnmoToo4XlpIfor4TliIblupXmiY3mmL7npLrnuqLngrlcclxuXHQgICAgICAgICAgICBmb3IgKHZhciBlcXVpcF9pIGluIGVxdWlwX3Njb3JlX2xpc3QpIHtcclxuXHQgICAgICAgICAgICBcdHZhciBlcXVpcF9pdGVtID0gZXF1aXBfc2NvcmVfbGlzdFtlcXVpcF9pXVxyXG5cdCAgICAgICAgICAgICAgICBpZiAoZXF1aXBfaXRlbSAmJiBlcXVpcF9pdGVtLmFsbF9zY29yZSAmJiBlcXVpcF9pdGVtLmFsbF9zY29yZSA+IHNjb3JlKSB7XHJcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG5cdCAgICAgICAgICAgICAgICB9XHJcblx0ICAgICAgICAgICAgfVxyXG5cdCAgICAgICAgfVxyXG5cdCAgICB9XHJcblx0ICAgIFxyXG5cdCAgICByZXR1cm4gZmFsc2VcclxuXHR9LFxyXG5cclxuXHQvLyDmo4Dmn6XljZXkuKroi7Hpm4TljYfmmJ/nuqLngrkgXHJcblx0Y2hlY2tTaW5nbGVIZXJvVXBncmFkZVN0YXJSZWRQb2ludDogZnVuY3Rpb24oaGVyb192bykge1xyXG5cdFx0aWYgKCFoZXJvX3ZvKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdCAgICAvLyBpZiAodHlwZW9mIGhlcm9fdm8ucmVkX3BvaW50W0hlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQU3Rhcl0gPT0gXCJib29sZWFuXCIpIHtcclxuXHQgICAgLy8gICAgIHJldHVybiBoZXJvX3ZvLnJlZF9wb2ludFtIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUFN0YXJdID09IHRydWU7XHJcblx0ICAgIC8vIH1cclxuXHQgICAgXHJcblx0ICAgIHZhciBzdGFyID0gaGVyb192by5zdGFyIHx8IDE7XHJcblx0ICAgIHZhciBuZXh0X2tleSA9IFV0aWxzLmdldE5vcktleShoZXJvX3ZvLmJpZCwgc3RhciArIDEpO1xyXG5cdCAgICB2YXIgbmV4dF9zdGFyX2NvbmZpZyA9IGdkYXRhKFwicGFydG5lcl9kYXRhXCIsIFwiZGF0YV9wYXJ0bmVyX3N0YXJcIiwgbmV4dF9rZXkpO1xyXG5cdCAgICBpZiAoIW5leHRfc3Rhcl9jb25maWcpIHtcclxuXHQgICAgICAgIC8vIOivtOaYjua7oeaYn+S6hlxyXG5cdCAgICAgICAgaGVyb192by5yZWRfcG9pbnRbSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBTdGFyXSA9IGZhbHNlO1xyXG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cdCAgICB9XHJcblx0ICAgIFxyXG5cdCAgICB2YXIgc3Rhcl9jb25maWcgPSBuZXh0X3N0YXJfY29uZmlnO1xyXG5cdCAgICB2YXIgaXNfcmVkcG9pbnQgPSBmYWxzZTtcclxuXHQgICAgdmFyIEhlcm9Db250cm9sbGVyID0gcmVxdWlyZShcImhlcm9fY29udHJvbGxlclwiKTtcclxuXHQgICAgdmFyIG1vZGVsID0gIEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKTtcclxuXHQgICAgaWYgKHN0YXIgPT0gbW9kZWwuaGVyb19pbmZvX3VwZ3JhZGVfc3Rhcl9wYXJhbTIpIHtcclxuXHQgICAgICAgIC8vIDEw57qn5Y2HMTHmnInkuJbnlYznrYnnuqfopoHmsYJcclxuXHQgICAgICAgIGlzX3JlZHBvaW50ID0gbW9kZWwuY2hlY2tPcGVuU3RhcjExKCk7XHJcblx0ICAgIH0gZWxzZSB7XHJcblx0ICAgICAgICBpc19yZWRwb2ludCA9IHRydWU7XHJcblx0ICAgIH1cclxuXHJcblx0ICAgIGlmIChpc19yZWRwb2ludCkge1xyXG5cdCAgICAgICAgaWYgKHN0YXJfY29uZmlnKSB7XHJcblx0ICAgICAgICBcdHZhciBzdGFyX3Jlc3VsdCA9IHRoaXMuY2hlY2tTaW5nbGVTdGFyRnVzZVJlZFBvaW50QnlTdGFyQ29uZmlnKHN0YXJfY29uZmlnLCB0cnVlLCBoZXJvX3ZvLnBhcnRuZXJfaWQpO1xyXG5cdCAgICAgICAgICAgIGlzX3JlZHBvaW50ID0gc3Rhcl9yZXN1bHQuaXNfcmVkcG9pbnQ7XHJcblx0ICAgICAgICAgICAgLy8g6K6h566X5raI6ICXICAgIFxyXG5cdCAgICAgICAgICAgIGlmIChpc19yZWRwb2ludCAmJiBzdGFyX2NvbmZpZy5vdGhlcl9leHBlbmQubGVuZ3RoID4gMCkge1xyXG5cdCAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEl0ZW1OdW1CeUJpZChzdGFyX2NvbmZpZy5vdGhlcl9leHBlbmRbMF1bMF0pO1xyXG5cdCAgICAgICAgICAgICAgICBpZiAoY291bnQgPCBzdGFyX2NvbmZpZy5vdGhlcl9leHBlbmRbMF1bMV0pXHJcblx0ICAgICAgICAgICAgICAgICAgIGlzX3JlZHBvaW50ID0gZmFsc2U7XHJcblx0ICAgICAgICAgICAgfVxyXG5cdCAgICAgICAgfSBlbHNlIHtcclxuXHQgICAgICAgICAgICBpc19yZWRwb2ludCA9IGZhbHNlO1xyXG5cdCAgICAgICAgfVxyXG5cdCAgICB9XHJcblxyXG5cdCAgICBoZXJvX3ZvLnJlZF9wb2ludFtIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUFN0YXJdID0gaXNfcmVkcG9pbnQ7XHJcblx0ICAgIHJldHVybiBpc19yZWRwb2ludFxyXG5cdH0sXHJcblxyXG5cdC8vIOajgOafpeWNleS4quWkqei1i+aKgOiDvee6oueCuVxyXG5cdGNoZWNrU2luZ2xlSGVyb1RhbGVudFNraWxsUmVkUG9pbnQ6IGZ1bmN0aW9uKGhlcm9fdm8pIHtcclxuXHRcdGNjLmxvZyhcImNoZWNrU2luZ2xlSGVyb1RhbGVudFNraWxsUmVkUG9pbnRcIilcclxuXHRcdGlmICghaGVyb192bykgcmV0dXJuIGZhbHNlO1xyXG5cdFx0Ly8gLS3pppbmrKHljYfnuqfliLA25pif6K6w5b2VXHJcblx0XHRpZihoZXJvX3ZvLmlzX29wZW5fdGFsZW50ID09IHRydWUpe1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0fVxyXG5cdFx0aWYoaGVyb192by5yZWRfcG9pbnRbSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBUYWxlbnRdICE9IG51bGwpe1xyXG5cdFx0XHRyZXR1cm4gaGVyb192by5yZWRfcG9pbnRbSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBUYWxlbnRdID09IHRydWVcclxuXHRcdH1cclxuXHJcblx0XHRpZighaGVyb192by5pc2hhdmVUYWxlbnREYXRhKCkpcmV0dXJuIGZhbHNlO1xyXG5cdFx0bGV0IGlzX3JlZHBvaW50ID0gZmFsc2VcclxuXHRcdHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIilcclxuXHRcdGxldCBkaWNfaGVyb190YWxlbnRfc2tpbGxfbGVhcm5fcmVkcG9pbnQgPSBIZXJvQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0VGFsZW50UmVkcG9pbnRSZWNvcmQoKVxyXG5cdFx0bGV0IGRpY19za2lsbF9pZCA9IHt9XHJcblx0XHRmb3IobGV0IHBvcyBpbiBoZXJvX3ZvLnRhbGVudF9za2lsbF9saXN0KXtcclxuXHRcdFx0bGV0IGlkID0gaGVyb192by50YWxlbnRfc2tpbGxfbGlzdFtwb3NdXHJcblx0XHRcdGRpY19za2lsbF9pZFtpZF0gPSBwb3NcclxuXHRcdH1cdFxyXG5cdFx0Zm9yKGxldCBpIGluIENvbmZpZy5wYXJ0bmVyX3NraWxsX2RhdGEuZGF0YV9wYXJ0bmVyX3NraWxsX3Bvcyl7XHJcblx0XHRcdGxldCB2ID0gQ29uZmlnLnBhcnRuZXJfc2tpbGxfZGF0YS5kYXRhX3BhcnRuZXJfc2tpbGxfcG9zW2ldXHJcblx0XHRcdGlmKGhlcm9fdm8udGFsZW50X3NraWxsX2xpc3Rbdi5wb3NdKSB7XHJcblx0XHRcdFx0Ly8gLS3lt7Loo4XlpIfmioDog70g5Y+q6ZyA5Yik5pat6IO95ZCm5Y2H57qnXHJcblx0XHRcdFx0aXNfcmVkcG9pbnQgPSB0aGlzLmNoZWNrU2luZ2xlVGFsZW50U2tpbGxMZXZlbChoZXJvX3ZvLnRhbGVudF9za2lsbF9saXN0W3YucG9zXSlcclxuXHRcdFx0XHRpZihpc19yZWRwb2ludCl7XHJcblx0XHRcdFx0XHRicmVha1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0Ly8gLS3mnKroo4XlpIcg5YWI5Yik5pat5piv5ZCm6Kej6ZSB5L2N572uIFxyXG5cdFx0XHRcdGxldCBpc19sb2NrID0gZmFsc2VcclxuXHRcdFx0XHRpZih2LnBvc19saW1pdFswXSA9PSAnc3Rhcicpe1xyXG5cdFx0XHRcdFx0aXNfbG9jayA9IChoZXJvX3ZvLnN0YXIgPj0gdi5wb3NfbGltaXRbMV0pXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmKGlzX2xvY2spe1xyXG5cdFx0XHRcdFx0Zm9yKGxldCBpZCBpbiBkaWNfaGVyb190YWxlbnRfc2tpbGxfbGVhcm5fcmVkcG9pbnQpeyBcclxuXHRcdFx0XHRcdFx0aWYoZGljX3NraWxsX2lkW2lkXSA9PSBudWxsKXtcclxuXHRcdFx0XHRcdFx0XHRpc19yZWRwb2ludCA9IHRydWVcclxuXHRcdFx0XHRcdFx0XHRicmVha1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZihpc19yZWRwb2ludCl7XHJcblx0XHRcdFx0XHRcdGJyZWFrXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRoZXJvX3ZvLnJlZF9wb2ludFtIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUFRhbGVudF0gPSBpc19yZWRwb2ludFxyXG5cdFx0cmV0dXJuIGlzX3JlZHBvaW50XHJcblx0fSxcdFxyXG5cdC8vIC0t5Yik5pat5aSp6LWL5oqA6IO96IO95ZCm5Y2H57qnIEBza2lsbF9pZCDmioDog71pZFxyXG5cdGNoZWNrU2luZ2xlVGFsZW50U2tpbGxMZXZlbChza2lsbF9pZCl7XHJcblx0XHRsZXQgY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfc2tpbGxfZGF0YS5kYXRhX3BhcnRuZXJfc2tpbGxfbGV2ZWxbc2tpbGxfaWRdXHJcblx0XHRpZihjb25maWcpe1xyXG5cdFx0XHRsZXQgaXNfZW5vdWdoID0gdHJ1ZVxyXG5cdFx0XHRmb3IobGV0IGk9MDtpPGNvbmZpZy5leHBlbmQubGVuZ3RoOysraSl7XHJcblx0XHRcdFx0bGV0IGNvc3QgPSBjb25maWcuZXhwZW5kW2ldXHJcblx0XHRcdFx0bGV0IGhhdmVfbnVtID0gQmFja3BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRJdGVtTnVtQnlCaWQoY29zdFswXSlcclxuXHRcdFx0XHRpZihoYXZlX251bSA8IGNvc3RbMV0pe1xyXG5cdFx0XHRcdFx0aXNfZW5vdWdoID0gZmFsc2VcclxuXHRcdFx0XHRcdGJyZWFrXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBpc19lbm91Z2hcclxuXHRcdH1cclxuXHRcdHJldHVybiBmYWxzZVxyXG5cdH0sXHJcblxyXG5cdC8vIOiOt+WPluetiee6p+aYvuekuueKtuaAgSBcclxuXHQvLyBAIHJldHVybiAwOuihqOekuua7oee6pyAgMTog6KGo56S65Y+v5Lul5Y2H57qnIDogMjrooajnpLrlj6/ku6Xov5vpmLYgIC0xIOihqOekuuWHuumUmeS6hlxyXG5cdGdldEhlcm9TaG93TGV2ZWxTdGF0dXM6IGZ1bmN0aW9uKGhlcm9fdm8pIHtcclxuXHQgICAgdmFyIGtleSA9IGhlcm9fdm8udHlwZSArIFwiX1wiICsgaGVyb192by5icmVha19pZCArIFwiX1wiICsgaGVyb192by5icmVha19sZXY7XHJcblx0ICAgIHZhciBicmVha19jb25maWcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9icmFjaFtrZXldO1xyXG5cdCAgICBpZiAoIWJyZWFrX2NvbmZpZykgcmV0dXJuIC0xO1xyXG5cdCAgICB2YXIgbmV4dF9rZXkgPSBoZXJvX3ZvLnR5cGUgKyBcIl9cIiArIGhlcm9fdm8uYnJlYWtfaWQgKyBcIl9cIiArIChoZXJvX3ZvLmJyZWFrX2xldiArIDEpO1xyXG5cdCAgICB2YXIgbmV4dF9icmVha19jb25maWcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9icmFjaFtuZXh0X2tleV07XHJcblxyXG5cdCAgICB2YXIgbGV2X21heCA9IGJyZWFrX2NvbmZpZy5sZXZfbWF4O1xyXG5cdCAgICB2YXIgc3RhdHVzID0gMDtcclxuXHJcblx0ICAgIGlmICghbmV4dF9icmVha19jb25maWcpIHtcclxuXHQgICAgICAgIHZhciBrZXkgPSBoZXJvX3ZvLmJpZCArIFwiX1wiICsgaGVyb192by5zdGFyXHJcblx0ICAgICAgICB2YXIgc3Rhcl9jb25maWcgPSBnZGF0YShcInBhcnRuZXJfZGF0YVwiLCBcImRhdGFfcGFydG5lcl9zdGFyXCIsIGtleSk7XHJcblx0ICAgICAgICBpZiAoc3Rhcl9jb25maWcgJiYgbGV2X21heCA8IHN0YXJfY29uZmlnLmxldl9tYXgpIHtcclxuXHQgICAgICAgICAgICBsZXZfbWF4ID0gc3Rhcl9jb25maWcubGV2X21heFxyXG5cdCAgICAgICAgfVxyXG5cclxuXHQgICAgICAgIGlmIChoZXJvX3ZvLmxldiA+PSBsZXZfbWF4KSB7XHJcblx0ICAgICAgICAgICAgLy8gIOmDvea7oeS6hiAg5ruh57qn54q25oCBXHJcblx0ICAgICAgICAgICAgc3RhdHVzID0gMDtcclxuXHQgICAgICAgIH0gZWxzZSB7XHJcblx0ICAgICAgICAgICAgLy8g562J57qn5LiN6LazIOmcgOimgeWNh+e6p1xyXG5cdCAgICAgICAgICAgIHN0YXR1cyA9IDE7XHJcblx0ICAgICAgICB9XHJcblx0ICAgIH0gZWxzZSB7XHJcblx0ICAgICAgICBpZiAobmV4dF9icmVha19jb25maWcubGltaXQgJiYgbmV4dF9icmVha19jb25maWcubGltaXQubGVuZ3RoID4gMCkge1xyXG5cdCAgICAgICAgICAgIGlmIChoZXJvX3ZvLmxldiA+PSBicmVha19jb25maWcubGV2X21heCkge1xyXG5cdCAgICAgICAgICAgICAgICAvLyDov5vpmLbmnInopoHmsYIg6ZyA6KaB5Y2H5pifXHJcblx0ICAgICAgICAgICAgICAgIHZhciBpc19lbm91Z2ggPSB0aGlzLmlzRW5vdWdoQ29uZGl0aW9uKG5leHRfYnJlYWtfY29uZmlnLmxpbWl0LCBoZXJvX3ZvKVxyXG5cdCAgICAgICAgICAgICAgICBpZiAoaXNfZW5vdWdoKSB7XHJcblx0ICAgICAgICAgICAgICAgICAgICAvLyDlj6/ku6Xov5vpmLbkuoZcclxuXHQgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDI7XHJcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcblx0ICAgICAgICAgICAgICAgICAgICAvLyDkuI3mu6HotrPmnaHku7Yu5pi+56S65ruh57qn54q25oCBXHJcblx0ICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwO1xyXG5cdCAgICAgICAgICAgICAgICB9XHJcblx0ICAgICAgICAgICAgfSBlbHNlIHtcclxuXHQgICAgICAgICAgICAgICAgc3RhdHVzID0gMTtcclxuXHQgICAgICAgICAgICB9XHJcblx0ICAgICAgICB9IGVsc2Uge1xyXG5cdCAgICAgICAgICAgIC8vIOayoeaciemZkOWItlxyXG5cdCAgICAgICAgICAgIGlmIChoZXJvX3ZvLmxldiA+PSBicmVha19jb25maWcubGV2X21heCkge1xyXG5cdCAgICAgICAgICAgICAgICAvLyDlj6/ku6Xov5vpmLbkuoZcclxuXHQgICAgICAgICAgICAgICAgc3RhdHVzID0gMjtcclxuXHQgICAgICAgICAgICB9IGVsc2Uge1xyXG5cdCAgICAgICAgICAgICAgICAgLy8g562J57qn5LiN6LazIOmcgOimgeWNh+e6p1xyXG5cdCAgICAgICAgICAgICAgICBzdGF0dXMgPSAxO1xyXG5cdCAgICAgICAgICAgIH1cclxuXHQgICAgICAgIH1cclxuXHQgICAgfVxyXG5cdCAgICByZXR1cm4gc3RhdHVzXHJcblx0fSxcclxuXHJcblx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKuiuoeeul+elreWdm+eahOe6oueCueS/oeaBryoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdC8vIOa2iOmZpOiejeWQiOe6oueCuVxyXG5cdGNsZWFyQWxsU3RhckZ1c2VSZWRwb2ludFJlY29yZDogZnVuY3Rpb24oKSB7XHJcblx0ICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIilcclxuXHQgICAgdmFyIGRpY19mdXNlX2luZm8gPSAgSGVyb0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldFN0YXJGdXNlTGlzdCgpO1xyXG5cdCAgICBpZiAoIWRpY19mdXNlX2luZm8pIHJldHVybiBmYWxzZTtcclxuXHJcblx0ICAgIC8vIDDooajnpLrlhajpg6joi7Hpm4QgXHJcblx0ICAgIC8vIHZhciBjYW1wX2Z1c2VfaW5mbyA9IGRpY19mdXNlX2luZm9bMF1cclxuXHQgICAgZm9yICh2YXIgZGF0YV9pIGluIGRpY19mdXNlX2luZm8pIHtcclxuXHQgICAgXHR2YXIgZnVzZV9kYXRhID0gZGljX2Z1c2VfaW5mb1tkYXRhX2ldO1xyXG5cdCAgICAgICAgZnVzZV9kYXRhLmN1cl9yZWRwb2ludCA9IG51bGw7XHJcblx0ICAgIH1cdCAgICBcclxuXHJcblx0ICAgIC8vIOiuoeeul+S4u+eVjOmdoueGlOeCvOelreWdm+eahOe6oueCuVxyXG5cdCAgICAvLyB0aGlzLmNoZWNrQWxsU3RhckZ1c2VSZWRwb2ludCgpO1xyXG5cclxuXHRcdFJlZE1nci5nZXRJbnN0YW5jZSgpLmFkZENhbEhhbmRsZXIodGhpcy5jaGVja0FsbFN0YXJGdXNlUmVkcG9pbnQuYmluZCh0aGlzKSwgUmVkSWRzLlJlZnVzZUhlcm8pO1xyXG5cclxuXHR9LFxyXG5cclxuXHQvLyDorqHnrpfnhpTngrznuqLngrlcclxuXHRjaGVja0FsbFN0YXJGdXNlUmVkcG9pbnQ6IGZ1bmN0aW9uKCkge1xyXG5cdCAgICB2YXIgSGVyb0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpO1xyXG5cdCAgICB2YXIgZGljX2Z1c2VfaW5mbyA9ICBIZXJvQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0U3RhckZ1c2VMaXN0KCk7XHJcblx0ICAgIGlmICghZGljX2Z1c2VfaW5mbykgcmV0dXJuIGZhbHNlO1xyXG5cdCAgICAvLyAw6KGo56S65YWo6YOo6Iux6ZuEIFxyXG5cdCAgICAvLyB2YXIgY2FtcF9mdXNlX2luZm8gPSBkaWNfZnVzZV9pbmZvWzBdO1xyXG5cclxuXHQgICAgdmFyIGlzX3JlZHBvaW50ID0gdGhpcy5jaGVja0NhbXBTdGFyRnVzZVJlZHBvaW50KGRpY19mdXNlX2luZm8pXHJcblxyXG5cdFx0dmFyIE1haW5TY2VuZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIik7XHJcblx0XHR2YXIgU2NlbmVDb25zdCAgICAgICAgICA9IHJlcXVpcmUoXCJzY2VuZV9jb25zdFwiKTtcclxuXHQgICAgTWFpblNjZW5lQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEJ1aWxkUmVkU3RhdHVzKFNjZW5lQ29uc3QuQ2VudGVyU2NlbmVCdWlsZC5mdXNlLCBpc19yZWRwb2ludCk7XHJcblxyXG5cdCAgICByZXR1cm4gaXNfcmVkcG9pbnRcclxuXHR9LFxyXG5cclxuXHJcblx0Ly/orqHnrpfnhpTngrznpa3lnZvlkITpmLXokKXnuqLngrlcclxuXHRjaGVja0NhbXBTdGFyRnVzZVJlZHBvaW50OiBmdW5jdGlvbihjYW1wX2Z1c2VfaW5mbykge1xyXG5cdCAgICBpZiAoIWNhbXBfZnVzZV9pbmZvKSByZXR1cm4gZmFsc2U7XHJcblx0ICAgIHZhciBpc19hbGxfcmVkcG9pbnQgPSBmYWxzZTtcclxuXHQgICAgdmFyIGlzX3JlZHBvaW50ID0gZmFsc2U7XHJcblxyXG5cdCAgICBmb3IgKHZhciBkYXRhX2kgaW4gY2FtcF9mdXNlX2luZm8pIHtcclxuXHQgICAgXHR2YXIgZnVzZV9kYXRhID0gY2FtcF9mdXNlX2luZm9bZGF0YV9pXTtcclxuXHQgICAgICAgIGlzX3JlZHBvaW50ID0gdGhpcy5jaGVja1NpbmdsZVN0YXJGdXNlUmVkUG9pbnQoZnVzZV9kYXRhKTtcclxuXHQgICAgICAgIGlmICghaXNfYWxsX3JlZHBvaW50ICYmIGlzX3JlZHBvaW50KVxyXG5cdCAgICAgICAgICAgIGlzX2FsbF9yZWRwb2ludCA9IHRydWU7XHJcblx0ICAgIH1cclxuXHJcblx0ICAgIHJldHVybiBpc19hbGxfcmVkcG9pbnRcdFx0XHJcblx0fSxcclxuXHJcblx0Ly8g6K6h566X5Y2V5Liq6Iux6ZuE5pWw5o2u57qi54K5IFxyXG5cdGNoZWNrU2luZ2xlU3RhckZ1c2VSZWRQb2ludDogZnVuY3Rpb24oZnVzZV9kYXRhKSB7XHJcblx0ICAgIC8vY3VyX3JlZHBvaW50ID09IG5pbCDlsLHmmK/msqHmnInorqHnrpfov4fnuqLngrnnmoRcclxuXHQgICAgaWYgKGZ1c2VfZGF0YS5jdXJfcmVkcG9pbnQpXHJcblx0ICAgICAgICByZXR1cm4gZnVzZV9kYXRhLmN1cl9yZWRwb2ludCA9PSAxO1xyXG5cclxuXHQgICAgaWYgKCFmdXNlX2RhdGEuc3Rhcl9jb25maWcpIHJldHVybjtcclxuXHQgICAgLy8gdmFyIGlzX3JlZHBvaW50LCBuZWVkX2NvdW50LCB0b3RhbF9jb3VudCBcclxuXHQgICAgdmFyIHJlc3VsdCA9IHRoaXMuY2hlY2tTaW5nbGVTdGFyRnVzZVJlZFBvaW50QnlTdGFyQ29uZmlnKGZ1c2VfZGF0YS5zdGFyX2NvbmZpZylcclxuXHJcblx0ICAgIGlmIChyZXN1bHQuaXNfcmVkcG9pbnQpIHtcclxuXHQgICAgICAgIC8vIOaciee6oueCuSDnsbvlnosgMSAg5Zug5Li66J6N5ZCI56Wt5Z2b6YKj6L655o6S5bqP6Zeu6aKYIOi/meagt+WumuS5iSBcclxuXHQgICAgICAgIHJlc3VsdC5jdXJfcmVkcG9pbnQgPSAxO1xyXG5cdFx0ICAgIGZ1c2VfZGF0YS5jdXJfcmVkcG9pbnQgPSAxO1xyXG5cdCAgICB9IGVsc2Uge1xyXG5cdCAgICAgICAgLy8g5rKh5pyJ57qi54K5IOexu+WeiyAyXHJcblx0ICAgICAgICByZXN1bHQuY3VyX3JlZHBvaW50ID0gMjtcclxuXHRcdCAgICBmdXNlX2RhdGEuY3VyX3JlZHBvaW50ID0gMjtcdCAgICAgICAgXHJcblx0ICAgIH1cclxuXHQgICAgZnVzZV9kYXRhLm5lZWRfY291bnQgPSByZXN1bHQubmVlZF9jb3VudCB8fCAwO1xyXG5cdCAgICBmdXNlX2RhdGEudG90YWxfY291bnQgPSByZXN1bHQudG90YWxfY291bnQgfHwgMDtcclxuXHJcblx0ICAgIHJldHVybiByZXN1bHQuaXNfcmVkcG9pbnQ7XHJcblx0fSxcclxuXHJcbn0pO1xyXG5cclxuXHJcbi8vIOWunuS+i+WMluWNleWIqVxyXG5IZXJvQ2FsY3VsYXRlLmdldEluc3RhbmNlID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgICB0aGlzLmluc3RhbmNlID0gbmV3IHRoaXMoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xyXG59XHJcblxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBIZXJvQ2FsY3VsYXRlOyJdfQ==