(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/battle/battle_controller.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, '62167uC4DxBcKgCTRWlKWsl', 'battle_controller'); // Scripts/mod/battle/battle_controller.js "use strict"; // @author: xxx@syg.com(必填, 创建模块的人员) // -------------------------------------------------------------------- // @description: // 战斗控制器 //
Create: 2018-11-28 19:19:19 // -------------------------------------------------------------------- var BattleEvent = require("battle_event"); var BattleConst = require("battle_const"); var MainuiController = require("mainui_controller"); var LevupgradeController = require("levupgrade_controller"); var MainuiEvent = require("mainui_event"); var BattleController = cc.Class({ "extends": BaseController, ctor: function ctor() {}, // 初始化配置数据 initConfig: function initConfig() { // var BattleModel = require("battle_model"); this.model = Utils.createClass("battle_model"); // var BattleHookModel = require("battle_hook_model"); this.hook_model = Utils.createClass("battle_hook_model"); this.model.initConfig(); this.hook_model.initConfig(); this.is_watch_replay = false; // 是否属于观战状态 this.is_unlock_chapter = false; // 是否解锁章节中 this.is_normal_battle = false; // 是否是真战斗 this.finish_result_view_list = {}; // 胜利面板列表 this.finish_fail_view_list = {}; // 失败面板列表; this.cache_list = []; //缓存界面列表 }, // 返回当前的model getModel: function getModel() { return this.model; }, // 假战斗数据 getHookModel: function getHookModel() { return this.hook_model; }, // 注册监听事件 registerEvents: function registerEvents() { if (this.loading_enter_scene == null) { this.loading_enter_scene = gcore.GlobalEvent.bind(MainuiEvent.LOADING_ENTER_SCENE, function () { this.showCachePanel(); }.bind(this)); } }, // 注册协议接受事件 registerProtocals: function registerProtocals() { this.RegisterProtocal(20027, this.scInitFightStart); // 战斗真正初始化数据,从0到1的战斗 this.RegisterProtocal(20002, this.scRoundFightStart); // 回合开始的播报 -- 包含回合开始的buff this.RegisterProtocal(20004, this.scRoundFightOn); // 回合中的播报 -- 包含回合结束buff和效果播报的buff this.RegisterProtocal(20006, this.scFightEnd); // 战斗结算的,也就是真是战斗结束的 this.RegisterProtocal(20008, this.scFightExit); // 退出战斗 this.RegisterProtocal(20009, this.scSkipFirstTeam); // 跳过一队 this.RegisterProtocal(20013, this.scReBattleFight); // 战斗重连,切进战斗或者短线重连的战斗 this.RegisterProtocal(20014, this.scBattlePk); // 战斗切磋请求 this.RegisterProtocal(20015, this.scBattlePkRe); // 战斗切磋返回 this.RegisterProtocal(20016, this.scBattlePkTwice); // 战斗切磋同意 this.RegisterProtocal(20020, this.scRoundNextFight); // 下一波怪物 this.RegisterProtocal(20022, this.scFightSpeed); // 改变播放速度 this.RegisterProtocal(20029, this.scRecordBattle); // 看录像 this.RegisterProtocal(20033, this.handle20033); // 切磋结算 this.RegisterProtocal(20034, this.handle20034); // 切磋视频分享 this.RegisterProtocal(20036, this.handle20036); // 观看跨服录像,最后应该29协议全部转到这一条 this.RegisterProtocal(20060, this.handle20060); // 请求战斗类型返回,这个时候只需要做对应ui操作的 this.RegisterProtocal(20061, this.handle20061); // 假战斗初始化的,如果触发这个数据但是实际上是在真战斗中的时候,不做处理 this.RegisterProtocal(20062, this.handle20062); // 跳过战斗 }, // 是否在战斗中 isInFight: function isInFight() { return this.model.getFightStatus(); }, // 是否有战斗场景 hadBattleScene: function hadBattleScene() { return this.model.getBattleScene() != null; }, // 设置战斗场景的状态 handleBattleSceneStatus: function handleBattleSceneStatus(status) { this.model.handleBattleSceneStatus(status); }, // 根据战斗类型请求数据,r如果是切出战斗的话 则 combat_type:BattleConst.Fight_Type.Nil send20060: function send20060(combat_type) { cc.log("请求切出战斗"); var protocal = { combat_type: combat_type }; this.SendProtocal(20060, protocal); }, // 返回战斗状态, handle20060: function handle20060(data) { // data.combat_type, data.type(0:不存在战斗 1:存在战斗 2:假战斗) if (data.combat_type == 0) { // 这个就是切出战斗, this.clearBattleScene(); } else {} gcore.GlobalEvent.fire(BattleEvent.COMBAT_TYPE_BACK, data.combat_type, data.type); }, // 战斗结算的,也有可能不需要出结算面板 scFightEnd: function scFightEnd(data) { cc.log("战斗结算的,也有可能不需要出结算面板---", data); var is_replay = false; if (data.combat_type > 1000) { data.combat_type = data.combat_type - 1000; is_replay = true; } if (data.combat_type == BattleConst.Fight_Type.Endless) { var PromptController = require("prompt_controller"); var PromptTypeConst = require("prompt_type_const"); PromptController.getInstance().getModel().removePromptDataByTpye(PromptTypeConst.Endless_trail); } this.model.showWin(data, is_replay); }, // 清理战斗场景,在退出战斗或者战斗结算之后,如果个战斗是剧情副本的战斗,那么就不需要清理掉场景,而是直接切换到假战斗 clearBattleScene: function clearBattleScene() { this.model.clearBattleScene(); }, // 请求切出战斗 requestCutOutBattle: function requestCutOutBattle() { var BattleConst = require("battle_const"); this.send20060(BattleConst.Fight_Type.Nil); }, // 战斗初始化数据 scInitFightStart: function scInitFightStart(data) { var BattleConst = require("battle_const"); if (BattleConst.canDoBattle(data.combat_type)) { this.model.updateCurBattleData(data, true); this.prepareLoaderBattleScene(data.combat_type, 2); } }, // 切进战斗 scReBattleFight: function scReBattleFight(data) { var BattleConst = require("battle_const"); if (BattleConst.canDoBattle(data.combat_type)) { this.model.updateCurBattleData(data, false); this.prepareLoaderBattleScene(data.combat_type, 2); } }, // 回合开始的播报 scRoundFightStart: function scRoundFightStart(data) { Log.info("回合开始播报"); // cc.log(data); this.model.playRoundStart(data); }, // 回合中的播报 scRoundFightOn: function scRoundFightOn(data) { Log.info("回合播报"); // cc.log(data); this.model.playRoundIn(data); }, // 回合播报结束通知服务端,对应的是20004 csSkillPlayEnd: function csSkillPlayEnd() { Log.info("20004 播报完成"); this.SendProtocal(20005, {}); }, // 回合开始播报完成之后,通知服务端,对应的是20002 csRoundFightEnd: function csRoundFightEnd() { Log.info("20002 播报完成"); this.SendProtocal(20019, {}); }, // 战斗初始化完成之后 csReadyFightStart: function csReadyFightStart() { Log.info("战斗初始化完成,通知服务端可以开始播报了"); this.SendProtocal(20001, {}); }, // 请求跳过战斗 send20062: function send20062() { this.SendProtocal(20062, {}); }, handle20062: function handle20062(data) { message(data.msg); }, // 假战斗数据 handle20061: function handle20061(data) { cc.log("假战斗数据"); cc.log(data); this.hook_model.updateUnrealBattleData(data); this.prepareLoaderBattleScene(data.combat_type, 1); }, csRecordBattle: function csRecordBattle(replay_id) { var protocal = {}; protocal.replay_id = replay_id; this.SendProtocal(20029, protocal); }, // 战斗录像,这里只是记录战斗录像状态 scRecordBattle: function scRecordBattle(data) { message(data.msg); if (data.code == 1) { // ChatController:getInstance():closeChatUseAction() this.setWatchReplayStatus(true); } }, // 切磋结果返回 handle20033: function handle20033(data) { if (data.combat_type == null) { data.combat_type = BattleConst.Fight_Type.PK; } if (data.show_panel_type == null) { data.show_panel_type = 1; } this.model.showWin(data); }, // 分享切磋视频 on20034: function on20034(replay_id, channel, target_name, share_type) { var protocal = {}; protocal.replay_id = replay_id; protocal.channel = channel; protocal.target_name = target_name; protocal.share_type = share_type; this.SendProtocal(20034, protocal); }, handle20034: function handle20034(data) { message(data.msg); }, /** * 切换进战斗的唯一接口 * @param {*} combat_type * @param {*} in_fight_type 0:没有战斗 1:假战斗 2:真战斗 */ prepareLoaderBattleScene: function prepareLoaderBattleScene(combat_type, in_fight_type) { this.model.createBattleScene(in_fight_type, combat_type); // 进入战斗,抛出事件 if (in_fight_type == 2) { gcore.GlobalEvent.fire(EventId.ENTER_FIGHT, combat_type, in_fight_type); } }, /** * 下一波怪物的入口 * @param {*} data */ scRoundNextFight: function scRoundNextFight(data) { if (data) { this.model.upDateNextMon(data); } }, // 战斗每一帧更新 update: function update(dt) { this.model.mapMovescheduleUpdate(); }, // 切换战斗背景移动状态,主要是用于真假剧情战斗切换 changeMoveMapStatus: function changeMoveMapStatus(status) { this.model.changeMoveMapStatus(); }, // 查看录像返回 sender_20036: function sender_20036(replay_id, replay_srv_id) { var protocal = { replay_id: replay_id, replay_srv_id: replay_srv_id }; this.SendProtocal(20036, protocal); }, handle20036: function handle20036(data) { if (data.code == 1) { this.setWatchReplayStatus(true); } }, // 退出战斗 csFightExit: function csFightExit() { this.SendProtocal(20008, {}); }, scFightExit: function scFightExit(data) { message(data.msg); }, // 跳过一队 csSkipFirstTeam: function csSkipFirstTeam() { this.SendProtocal(20009, {}); }, scSkipFirstTeam: function scSkipFirstTeam(data) { message(data.msg); }, // 是否是观战状态 getWatchReplayStatus: function getWatchReplayStatus() { return this.is_watch_replay; }, // 设置观战状态 setWatchReplayStatus: function setWatchReplayStatus(status) { this.is_watch_replay = status; }, // 是否是观战或者切磋状态 getIsClickStatus: function getIsClickStatus() { var combat_type = this.model.getCombatType(); return this.getWatchReplayStatus() || combat_type == BattleConst.Fight_Type.PK || combat_type == BattleConst.Fight_Type.HeroTestWar; }, setUnlockChapterStatus: function setUnlockChapterStatus(status) { this.is_unlock_chapter = status; }, getUnlockChapterStatus: function getUnlockChapterStatus() { return this.is_unlock_chapter; }, //进入主场景后显示缓存的界面 showCachePanel: function showCachePanel() { if (this.cache_list == null || this.cache_list.length <= 0) return; for (var i in this.cache_list) { if (this.cache_list[i]["function"]) { this.cache_list[i]["function"](); } } this.cache_list = []; }, // 战斗结算界面 openFinishView: function openFinishView(status, combat_type, data) { if (status == true) { if (IS_LOADING == true) { this.cache_list.push({ "function": function (status, combat_type, data) { this.openFinishView(status, combat_type, data); }.bind(this, status, combat_type, data) }); return; } if (this.finish_result_view_list[combat_type]) { this.finish_result_view_list[combat_type].close(); this.finish_result_view_list[combat_type] = null; } if (!this.is_unlock_chapter) { if (combat_type == BattleConst.Fight_Type.StarTower) { //试炼塔 var StartowerController = require("startower_controller"); StartowerController.getInstance().openResultWindow(true, data); } else if (combat_type == BattleConst.Fight_Type.Arena) { var ArenaController = require("arena_controller"); ArenaController.getInstance().openLoopResultWindow(true, data); } else if (combat_type == BattleConst.Fight_Type.Darma && data && data.result == 1) { //剧情副本战斗胜利时 //设置不要马上显示升级 LevupgradeController.getInstance().waitForOpenLevUpgrade(true); var BattleMvpWindow = require("battle_mvp_window"); this.finish_result_view_list[combat_type] = new BattleMvpWindow(data); this.finish_result_view_list[combat_type].open(); } else if (combat_type == BattleConst.Fight_Type.GuildDun) { //公会副本 require("guildboss_controller").getInstance().openGuildbossResultWindow(true, data); } else if (combat_type == BattleConst.Fight_Type.PK) { // PK this.finish_result_view_list[combat_type] = Utils.createClass("battle_pk_result_window"); this.finish_result_view_list[combat_type].open(data); } else { if (!this.finish_result_view_list[combat_type]) { if (data.result == 1) { //设置不要马上显示升级 LevupgradeController.getInstance().waitForOpenLevUpgrade(true); var BattleResultView = require("battle_result_window"); this.finish_result_view_list[combat_type] = new BattleResultView(data.result, combat_type); this.finish_result_view_list[combat_type].open({ data: data, fight_type: combat_type }); } else { cc.log("打开失败界面"); this.openFailFinishView(true, combat_type, data.result, data); } } } } } else { if (this.finish_result_view_list[combat_type]) { this.finish_result_view_list[combat_type].close(); this.finish_result_view_list[combat_type] = null; } } }, getFinishView: function getFinishView(combat_type) { if (this.finish_result_view_list) { return this.finish_result_view_list[combat_type]; } }, //打开战斗伤害统计界面 openBattleHarmInfoView: function openBattleHarmInfoView(status, data) { if (status == true) { if (this.harm_info_view == null) { this.harm_info_view = Utils.createClass("battle_harm_info_window"); } this.harm_info_view.open(data); } else { if (this.harm_info_view) { this.harm_info_view.close(); this.harm_info_view = null; } } }, //失败结算界面 openFailFinishView: function openFailFinishView(status, combat_type, result, data) { if (status == true) { //如果是在剧情中,则不需要弹出这些 // if(require("guide_controller").getInstance().isInGuide())return if (!this.is_unlock_chapter) { if (!this.finish_fail_view_list[combat_type]) { //设置不要马上显示升级 LevupgradeController.getInstance().waitForOpenLevUpgrade(true); var BattleFailView = require("battle_fail_window"); var finish_view = new BattleFailView(combat_type, result, data); if (finish_view) { finish_view.open(); } this.finish_fail_view_list[combat_type] = finish_view; } } else { if (MainuiController.getInstance().checkIsInDramaUIFight()) { this.battle_controller.send20060(BattleConst.Fight_Type.Darma); } } } else { if (this.finish_fail_view_list[combat_type]) { this.finish_fail_view_list[combat_type].close(); this.finish_fail_view_list[combat_type] = null; } } }, //获取是否相同的战斗类型 getIsSameBattleType: function getIsSameBattleType(combat_type) { return combat_type == this.model.getCombatType(); }, // -- 打开阵营详细面板 openBattleCampView: function openBattleCampView(status, form_id) { if (status == true) { if (!this.battle_camp_view) { var BattleCampView = require("battle_camp_window"); this.battle_camp_view = new BattleCampView(); } if (this.battle_camp_view.isOpen() == false) { this.battle_camp_view.open(form_id); } } else { if (this.battle_camp_view) { this.battle_camp_view.close(); this.battle_camp_view = null; } } }, // 记录是否为假战斗的战斗 setIsNormaBattle: function setIsNormaBattle(status) { this.is_normal_battle = status; }, // 是否是假战斗.... getIsNoramalBattle: function getIsNoramalBattle() { return this.is_normal_battle; }, // 改变战斗速度 csFightSpeed: function csFightSpeed(speed) { var protocal = {}; protocal.speed = speed; this.SendProtocal(20022, protocal); }, scFightSpeed: function scFightSpeed(data) { message(data.msg); }, getCtrlBattleScene: function getCtrlBattleScene(cal_back) { var battle_scen = this.model.getBattleScene(); cal_back(battle_scen); }, getDramaFightUI: function getDramaFightUI(finish_cb) { if (finish_cb) { finish_cb(this.model.getDramaFightUI()); } else { if (this.model) return this.model.getDramaFightUI(); } }, // ---------------------切磋请求 csBattlePk: function csBattlePk(target_id, target_srv_id, is_province) { var protocal = {}; protocal.target_id = target_id; protocal.target_srv_id = target_srv_id; protocal.is_province = is_province; this.SendProtocal(20014, protocal); }, scBattlePk: function scBattlePk(data) { message(data.msg); require("chat_controller").getInstance().closeChatPanel(false); require("friend_controller").getInstance().openFriendCheckPanel(false); }, // 被切磋对象,在18600收到提示之后,调用这个接口同意或者取消掉 confirmBattlePk: function confirmBattlePk(promptVo) {}, // 被切磋对象,同意切磋或者拒绝切磋 csBattlePkRe: function csBattlePkRe(bool, data) { var protocal = {}; protocal.target_id = data.target_id; protocal.target_srv_id = data.target_srv_id; protocal.is_agree = bool ? 1 : 0; this.SendProtocal(20015, protocal); }, scBattlePkRe: function scBattlePkRe(data) { message(data.msg); }, // 目标这统一了自己发起的请求.这时候自己的二次确认 scBattlePkTwice: function scBattlePkTwice(data) { if (data) { if (!this.isInFight()) { var accept_fun = function () { this.csBattlePkTwiceConfirm(true, { target_srv_id: data.target_srv_id, target_id: data.target_id }); }.bind(this); var refuse_fun = function () { this.csBattlePkTwiceConfirm(false, { target_srv_id: data.target_srv_id, target_id: data.target_id }); }.bind(this); var desc = cc.js.formatStr(Utils.TI18N("玩家%s同意了你的切磋请求,点击”立即切磋“立即进入切磋战斗?"), data.target_name || ""); require("commonalert").show(desc, Utils.TI18N("立即切磋"), accept_fun, Utils.TI18N("取消"), refuse_fun); } } }, // 发起者同意进战斗或者拒绝 csBattlePkTwiceConfirm: function csBattlePkTwiceConfirm(bool, data) { var protocal = {}; protocal.target_id = data.target_id; protocal.target_srv_id = data.target_srv_id; protocal.is_agree = bool ? 1 : 0; ; this.SendProtocal(20016, protocal); }, // 打开buff总览界面 openBattleBuffInfoView: function openBattleBuffInfoView(status, left_name, right_name) { if (status == true) { if (this.buff_info_view == null) { var BattleBuffInfoView = require("battle_buff_info_window"); this.buff_info_view = new BattleBuffInfoView(); } if (this.buff_info_view.isOpen() == false) { this.buff_info_view.open({ left_name: left_name, right_name: right_name }); } } else { if (this.buff_info_view) { this.buff_info_view.close(); this.buff_info_view = null; } } }, // - 更新buff列表界面数据 updateBattleBuffListView: function updateBattleBuffListView(data, group, partner_bid) { if (this.buff_list_view && this.buff_list_view.checkIsChosedBuffList(group, partner_bid)) { this.buff_list_view.setData(data); } }, // -- 打开buff列表界面 openBattleBuffListView: function openBattleBuffListView(status, data, group, partner_bid) { if (status == true) { if (this.buff_list_view == null) { var BattleBuffListView = require("battle_buff_list_window"); this.buff_list_view = new BattleBuffListView(); } if (this.buff_list_view.isOpen() == false) { this.buff_list_view.open({ data: data, group: group, partner_bid: partner_bid }); } } else { if (this.buff_list_view) { this.buff_list_view.close(); this.buff_list_view = null; } } } }); module.exports = BattleController; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYXR0bGVcXGJhdHRsZV9jb250cm9sbGVyLmpzIl0sIm5hbWVzIjpbIkJhdHRsZUV2ZW50IiwicmVxdWlyZSIsIkJhdHRsZUNvbnN0IiwiTWFpbnVpQ29udHJvbGxlciIsIkxldnVwZ3JhZGVDb250cm9sbGVyIiwiTWFpbnVpRXZlbnQiLCJCYXR0bGVDb250cm9sbGVyIiwiY2MiLCJDbGFzcyIsIkJhc2VDb250cm9sbGVyIiwiY3RvciIsImluaXRDb25maWciLCJtb2RlbCIsIlV0aWxzIiwiY3JlYXRlQ2xhc3MiLCJob29rX21vZGVsIiwiaXNfd2F0Y2hfcmVwbGF5IiwiaXNfdW5sb2NrX2NoYXB0ZXIiLCJpc19ub3JtYWxfYmF0dGxlIiwiZmluaXNoX3Jlc3VsdF92aWV3X2xpc3QiLCJmaW5pc2hfZmFpbF92aWV3X2xpc3QiLCJjYWNoZV9saXN0IiwiZ2V0TW9kZWwiLCJnZXRIb29rTW9kZWwiLCJyZWdpc3RlckV2ZW50cyIsImxvYWRpbmdfZW50ZXJfc2NlbmUiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiYmluZCIsIkxPQURJTkdfRU5URVJfU0NFTkUiLCJzaG93Q2FjaGVQYW5lbCIsInJlZ2lzdGVyUHJvdG9jYWxzIiwiUmVnaXN0ZXJQcm90b2NhbCIsInNjSW5pdEZpZ2h0U3RhcnQiLCJzY1JvdW5kRmlnaHRTdGFydCIsInNjUm91bmRGaWdodE9uIiwic2NGaWdodEVuZCIsInNjRmlnaHRFeGl0Iiwic2NTa2lwRmlyc3RUZWFtIiwic2NSZUJhdHRsZUZpZ2h0Iiwic2NCYXR0bGVQayIsInNjQmF0dGxlUGtSZSIsInNjQmF0dGxlUGtUd2ljZSIsInNjUm91bmROZXh0RmlnaHQiLCJzY0ZpZ2h0U3BlZWQiLCJzY1JlY29yZEJhdHRsZSIsImhhbmRsZTIwMDMzIiwiaGFuZGxlMjAwMzQiLCJoYW5kbGUyMDAzNiIsImhhbmRsZTIwMDYwIiwiaGFuZGxlMjAwNjEiLCJoYW5kbGUyMDA2MiIsImlzSW5GaWdodCIsImdldEZpZ2h0U3RhdHVzIiwiaGFkQmF0dGxlU2NlbmUiLCJnZXRCYXR0bGVTY2VuZSIsImhhbmRsZUJhdHRsZVNjZW5lU3RhdHVzIiwic3RhdHVzIiwic2VuZDIwMDYwIiwiY29tYmF0X3R5cGUiLCJsb2ciLCJwcm90b2NhbCIsIlNlbmRQcm90b2NhbCIsImRhdGEiLCJjbGVhckJhdHRsZVNjZW5lIiwiZmlyZSIsIkNPTUJBVF9UWVBFX0JBQ0siLCJ0eXBlIiwiaXNfcmVwbGF5IiwiRmlnaHRfVHlwZSIsIkVuZGxlc3MiLCJQcm9tcHRDb250cm9sbGVyIiwiUHJvbXB0VHlwZUNvbnN0IiwiZ2V0SW5zdGFuY2UiLCJyZW1vdmVQcm9tcHREYXRhQnlUcHllIiwiRW5kbGVzc190cmFpbCIsInNob3dXaW4iLCJyZXF1ZXN0Q3V0T3V0QmF0dGxlIiwiTmlsIiwiY2FuRG9CYXR0bGUiLCJ1cGRhdGVDdXJCYXR0bGVEYXRhIiwicHJlcGFyZUxvYWRlckJhdHRsZVNjZW5lIiwiTG9nIiwiaW5mbyIsInBsYXlSb3VuZFN0YXJ0IiwicGxheVJvdW5kSW4iLCJjc1NraWxsUGxheUVuZCIsImNzUm91bmRGaWdodEVuZCIsImNzUmVhZHlGaWdodFN0YXJ0Iiwic2VuZDIwMDYyIiwibWVzc2FnZSIsIm1zZyIsInVwZGF0ZVVucmVhbEJhdHRsZURhdGEiLCJjc1JlY29yZEJhdHRsZSIsInJlcGxheV9pZCIsImNvZGUiLCJzZXRXYXRjaFJlcGxheVN0YXR1cyIsIlBLIiwic2hvd19wYW5lbF90eXBlIiwib24yMDAzNCIsImNoYW5uZWwiLCJ0YXJnZXRfbmFtZSIsInNoYXJlX3R5cGUiLCJpbl9maWdodF90eXBlIiwiY3JlYXRlQmF0dGxlU2NlbmUiLCJFdmVudElkIiwiRU5URVJfRklHSFQiLCJ1cERhdGVOZXh0TW9uIiwidXBkYXRlIiwiZHQiLCJtYXBNb3Zlc2NoZWR1bGVVcGRhdGUiLCJjaGFuZ2VNb3ZlTWFwU3RhdHVzIiwic2VuZGVyXzIwMDM2IiwicmVwbGF5X3Nydl9pZCIsImNzRmlnaHRFeGl0IiwiY3NTa2lwRmlyc3RUZWFtIiwiZ2V0V2F0Y2hSZXBsYXlTdGF0dXMiLCJnZXRJc0NsaWNrU3RhdHVzIiwiZ2V0Q29tYmF0VHlwZSIsIkhlcm9UZXN0V2FyIiwic2V0VW5sb2NrQ2hhcHRlclN0YXR1cyIsImdldFVubG9ja0NoYXB0ZXJTdGF0dXMiLCJsZW5ndGgiLCJpIiwib3BlbkZpbmlzaFZpZXciLCJJU19MT0FESU5HIiwicHVzaCIsImNsb3NlIiwiU3RhclRvd2VyIiwiU3RhcnRvd2VyQ29udHJvbGxlciIsIm9wZW5SZXN1bHRXaW5kb3ciLCJBcmVuYSIsIkFyZW5hQ29udHJvbGxlciIsIm9wZW5Mb29wUmVzdWx0V2luZG93IiwiRGFybWEiLCJyZXN1bHQiLCJ3YWl0Rm9yT3BlbkxldlVwZ3JhZGUiLCJCYXR0bGVNdnBXaW5kb3ciLCJvcGVuIiwiR3VpbGREdW4iLCJvcGVuR3VpbGRib3NzUmVzdWx0V2luZG93IiwiQmF0dGxlUmVzdWx0VmlldyIsImZpZ2h0X3R5cGUiLCJvcGVuRmFpbEZpbmlzaFZpZXciLCJnZXRGaW5pc2hWaWV3Iiwib3BlbkJhdHRsZUhhcm1JbmZvVmlldyIsImhhcm1faW5mb192aWV3IiwiQmF0dGxlRmFpbFZpZXciLCJmaW5pc2hfdmlldyIsImNoZWNrSXNJbkRyYW1hVUlGaWdodCIsImJhdHRsZV9jb250cm9sbGVyIiwiZ2V0SXNTYW1lQmF0dGxlVHlwZSIsIm9wZW5CYXR0bGVDYW1wVmlldyIsImZvcm1faWQiLCJiYXR0bGVfY2FtcF92aWV3IiwiQmF0dGxlQ2FtcFZpZXciLCJpc09wZW4iLCJzZXRJc05vcm1hQmF0dGxlIiwiZ2V0SXNOb3JhbWFsQmF0dGxlIiwiY3NGaWdodFNwZWVkIiwic3BlZWQiLCJnZXRDdHJsQmF0dGxlU2NlbmUiLCJjYWxfYmFjayIsImJhdHRsZV9zY2VuIiwiZ2V0RHJhbWFGaWdodFVJIiwiZmluaXNoX2NiIiwiY3NCYXR0bGVQayIsInRhcmdldF9pZCIsInRhcmdldF9zcnZfaWQiLCJpc19wcm92aW5jZSIsImNsb3NlQ2hhdFBhbmVsIiwib3BlbkZyaWVuZENoZWNrUGFuZWwiLCJjb25maXJtQmF0dGxlUGsiLCJwcm9tcHRWbyIsImNzQmF0dGxlUGtSZSIsImJvb2wiLCJpc19hZ3JlZSIsImFjY2VwdF9mdW4iLCJjc0JhdHRsZVBrVHdpY2VDb25maXJtIiwicmVmdXNlX2Z1biIsImRlc2MiLCJqcyIsImZvcm1hdFN0ciIsIlRJMThOIiwic2hvdyIsIm9wZW5CYXR0bGVCdWZmSW5mb1ZpZXciLCJsZWZ0X25hbWUiLCJyaWdodF9uYW1lIiwiYnVmZl9pbmZvX3ZpZXciLCJCYXR0bGVCdWZmSW5mb1ZpZXciLCJ1cGRhdGVCYXR0bGVCdWZmTGlzdFZpZXciLCJncm91cCIsInBhcnRuZXJfYmlkIiwiYnVmZl9saXN0X3ZpZXciLCJjaGVja0lzQ2hvc2VkQnVmZkxpc3QiLCJzZXREYXRhIiwib3BlbkJhdHRsZUJ1ZmZMaXN0VmlldyIsIkJhdHRsZUJ1ZmZMaXN0VmlldyIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsV0FBVyxHQUFHQyxPQUFPLENBQUMsY0FBRCxDQUF6Qjs7QUFDQSxJQUFJQyxXQUFXLEdBQUdELE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUNBLElBQUlFLGdCQUFnQixHQUFHRixPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSUcsb0JBQW9CLEdBQUdILE9BQU8sQ0FBQyx1QkFBRCxDQUFsQzs7QUFDQSxJQUFJSSxXQUFXLEdBQUdKLE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUVBLElBQUlLLGdCQUFnQixHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUM1QixhQUFTQyxjQURtQjtBQUU1QkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFZLENBQ2pCLENBSDJCO0FBSzVCO0FBQ0FDLEVBQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUNwQjtBQUNBLFNBQUtDLEtBQUwsR0FBYUMsS0FBSyxDQUFDQyxXQUFOLENBQWtCLGNBQWxCLENBQWIsQ0FGb0IsQ0FJcEI7O0FBQ0EsU0FBS0MsVUFBTCxHQUFrQkYsS0FBSyxDQUFDQyxXQUFOLENBQWtCLG1CQUFsQixDQUFsQjtBQUVBLFNBQUtGLEtBQUwsQ0FBV0QsVUFBWDtBQUNBLFNBQUtJLFVBQUwsQ0FBZ0JKLFVBQWhCO0FBRUEsU0FBS0ssZUFBTCxHQUF1QixLQUF2QixDQVZvQixDQVVvQjs7QUFFeEMsU0FBS0MsaUJBQUwsR0FBeUIsS0FBekIsQ0Fab0IsQ0FZb0I7O0FBQ3hDLFNBQUtDLGdCQUFMLEdBQXdCLEtBQXhCLENBYm9CLENBYW9COztBQUN4QyxTQUFLQyx1QkFBTCxHQUErQixFQUEvQixDQWRvQixDQWNvQjs7QUFDeEMsU0FBS0MscUJBQUwsR0FBNkIsRUFBN0IsQ0Fmb0IsQ0Flb0I7O0FBQ3hDLFNBQUtDLFVBQUwsR0FBa0IsRUFBbEIsQ0FoQm9CLENBZ0JvQjtBQUMzQyxHQXZCMkI7QUF5QjVCO0FBQ0FDLEVBQUFBLFFBQVEsRUFBRSxvQkFBWTtBQUNsQixXQUFPLEtBQUtWLEtBQVo7QUFDSCxHQTVCMkI7QUE4QjVCO0FBQ0FXLEVBQUFBLFlBQVksRUFBRSx3QkFBWTtBQUN0QixXQUFPLEtBQUtSLFVBQVo7QUFDSCxHQWpDMkI7QUFtQzVCO0FBQ0FTLEVBQUFBLGNBQWMsRUFBRSwwQkFBWTtBQUN4QixRQUFJLEtBQUtDLG1CQUFMLElBQTRCLElBQWhDLEVBQXNDO0FBQ2xDLFdBQUtBLG1CQUFMLEdBQTJCQyxLQUFLLENBQUNDLFdBQU4sQ0FBa0JDLElBQWxCLENBQXVCdkIsV0FBVyxDQUFDd0IsbUJBQW5DLEVBQXlELFlBQVk7QUFDNUYsYUFBS0MsY0FBTDtBQUNILE9BRmtGLENBRWhGRixJQUZnRixDQUUzRSxJQUYyRSxDQUF4RCxDQUEzQjtBQUdIO0FBQ0osR0ExQzJCO0FBNEM1QjtBQUNBRyxFQUFBQSxpQkFBaUIsRUFBRSw2QkFBWTtBQUMzQixTQUFLQyxnQkFBTCxDQUFzQixLQUF0QixFQUE2QixLQUFLQyxnQkFBbEMsRUFEMkIsQ0FDcUM7O0FBQ2hFLFNBQUtELGdCQUFMLENBQXNCLEtBQXRCLEVBQTZCLEtBQUtFLGlCQUFsQyxFQUYyQixDQUVxQzs7QUFDaEUsU0FBS0YsZ0JBQUwsQ0FBc0IsS0FBdEIsRUFBNkIsS0FBS0csY0FBbEMsRUFIMkIsQ0FHcUM7O0FBQ2hFLFNBQUtILGdCQUFMLENBQXNCLEtBQXRCLEVBQTZCLEtBQUtJLFVBQWxDLEVBSjJCLENBSXFDOztBQUNoRSxTQUFLSixnQkFBTCxDQUFzQixLQUF0QixFQUE2QixLQUFLSyxXQUFsQyxFQUwyQixDQUtxQzs7QUFDaEUsU0FBS0wsZ0JBQUwsQ0FBc0IsS0FBdEIsRUFBNkIsS0FBS00sZUFBbEMsRUFOMkIsQ0FNcUM7O0FBQ2hFLFNBQUtOLGdCQUFMLENBQXNCLEtBQXRCLEVBQTZCLEtBQUtPLGVBQWxDLEVBUDJCLENBT3FDOztBQUVoRSxTQUFLUCxnQkFBTCxDQUFzQixLQUF0QixFQUE2QixLQUFLUSxVQUFsQyxFQVQyQixDQVNxQzs7QUFDaEUsU0FBS1IsZ0JBQUwsQ0FBc0IsS0FBdEIsRUFBNkIsS0FBS1MsWUFBbEMsRUFWMkIsQ0FVcUM7O0FBQ2hFLFNBQUtULGdCQUFMLENBQXNCLEtBQXRCLEVBQTZCLEtBQUtVLGVBQWxDLEVBWDJCLENBV3FDOztBQUVoRSxTQUFLVixnQkFBTCxDQUFzQixLQUF0QixFQUE2QixLQUFLVyxnQkFBbEMsRUFiMkIsQ0FhcUM7O0FBQ2hFLFNBQUtYLGdCQUFMLENBQXNCLEtBQXRCLEVBQTZCLEtBQUtZLFlBQWxDLEVBZDJCLENBY3FDOztBQUVoRSxTQUFLWixnQkFBTCxDQUFzQixLQUF0QixFQUE2QixLQUFLYSxjQUFsQyxFQWhCMkIsQ0FnQnFDOztBQUNoRSxTQUFLYixnQkFBTCxDQUFzQixLQUF0QixFQUE2QixLQUFLYyxXQUFsQyxFQWpCMkIsQ0FpQnFDOztBQUNoRSxTQUFLZCxnQkFBTCxDQUFzQixLQUF0QixFQUE2QixLQUFLZSxXQUFsQyxFQWxCMkIsQ0FrQnFDOztBQUNoRSxTQUFLZixnQkFBTCxDQUFzQixLQUF0QixFQUE2QixLQUFLZ0IsV0FBbEMsRUFuQjJCLENBbUJxQzs7QUFFaEUsU0FBS2hCLGdCQUFMLENBQXNCLEtBQXRCLEVBQTZCLEtBQUtpQixXQUFsQyxFQXJCMkIsQ0FxQnFDOztBQUNoRSxTQUFLakIsZ0JBQUwsQ0FBc0IsS0FBdEIsRUFBNkIsS0FBS2tCLFdBQWxDLEVBdEIyQixDQXNCcUM7O0FBQ2hFLFNBQUtsQixnQkFBTCxDQUFzQixLQUF0QixFQUE2QixLQUFLbUIsV0FBbEMsRUF2QjJCLENBdUJxQztBQUNuRSxHQXJFMkI7QUF1RTVCO0FBQ0FDLEVBQUFBLFNBQVMsRUFBRSxxQkFBWTtBQUNuQixXQUFPLEtBQUt4QyxLQUFMLENBQVd5QyxjQUFYLEVBQVA7QUFDSCxHQTFFMkI7QUE0RTVCO0FBQ0FDLEVBQUFBLGNBQWMsRUFBQywwQkFBVTtBQUNyQixXQUFRLEtBQUsxQyxLQUFMLENBQVcyQyxjQUFYLE1BQStCLElBQXZDO0FBQ0gsR0EvRTJCO0FBaUY1QjtBQUNBQyxFQUFBQSx1QkFBdUIsRUFBRSxpQ0FBVUMsTUFBVixFQUFrQjtBQUN2QyxTQUFLN0MsS0FBTCxDQUFXNEMsdUJBQVgsQ0FBbUNDLE1BQW5DO0FBQ0gsR0FwRjJCO0FBc0Y1QjtBQUNBQyxFQUFBQSxTQUFTLEVBQUUsbUJBQVVDLFdBQVYsRUFBdUI7QUFDOUJwRCxJQUFBQSxFQUFFLENBQUNxRCxHQUFILENBQU8sUUFBUDtBQUNBLFFBQUlDLFFBQVEsR0FBRztBQUNYRixNQUFBQSxXQUFXLEVBQUVBO0FBREYsS0FBZjtBQUdBLFNBQUtHLFlBQUwsQ0FBa0IsS0FBbEIsRUFBeUJELFFBQXpCO0FBQ0gsR0E3RjJCO0FBOEY1QjtBQUNBWixFQUFBQSxXQUFXLEVBQUUscUJBQVVjLElBQVYsRUFBZ0I7QUFDekI7QUFDQSxRQUFJQSxJQUFJLENBQUNKLFdBQUwsSUFBb0IsQ0FBeEIsRUFBMkI7QUFBTTtBQUM3QixXQUFLSyxnQkFBTDtBQUNILEtBRkQsTUFFTyxDQUVOOztBQUNEdEMsSUFBQUEsS0FBSyxDQUFDQyxXQUFOLENBQWtCc0MsSUFBbEIsQ0FBdUJqRSxXQUFXLENBQUNrRSxnQkFBbkMsRUFBcURILElBQUksQ0FBQ0osV0FBMUQsRUFBdUVJLElBQUksQ0FBQ0ksSUFBNUU7QUFDSCxHQXZHMkI7QUF5RzVCO0FBQ0EvQixFQUFBQSxVQUFVLEVBQUUsb0JBQVUyQixJQUFWLEVBQWdCO0FBQ3hCeEQsSUFBQUEsRUFBRSxDQUFDcUQsR0FBSCxDQUFPLHVCQUFQLEVBQStCRyxJQUEvQjtBQUNBLFFBQUlLLFNBQVMsR0FBRyxLQUFoQjs7QUFDQSxRQUFJTCxJQUFJLENBQUNKLFdBQUwsR0FBbUIsSUFBdkIsRUFBNEI7QUFDeEJJLE1BQUFBLElBQUksQ0FBQ0osV0FBTCxHQUFtQkksSUFBSSxDQUFDSixXQUFMLEdBQW1CLElBQXRDO0FBQ0FTLE1BQUFBLFNBQVMsR0FBRyxJQUFaO0FBQ0g7O0FBQ0QsUUFBR0wsSUFBSSxDQUFDSixXQUFMLElBQW9CekQsV0FBVyxDQUFDbUUsVUFBWixDQUF1QkMsT0FBOUMsRUFBc0Q7QUFDbEQsVUFBSUMsZ0JBQWdCLEdBQUd0RSxPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsVUFBSXVFLGVBQWUsR0FBR3ZFLE9BQU8sQ0FBQyxtQkFBRCxDQUE3Qjs7QUFDQXNFLE1BQUFBLGdCQUFnQixDQUFDRSxXQUFqQixHQUErQm5ELFFBQS9CLEdBQTBDb0Qsc0JBQTFDLENBQWlFRixlQUFlLENBQUNHLGFBQWpGO0FBQ0g7O0FBQ0QsU0FBSy9ELEtBQUwsQ0FBV2dFLE9BQVgsQ0FBbUJiLElBQW5CLEVBQXlCSyxTQUF6QjtBQUNILEdBdkgyQjtBQXlINUI7QUFDQUosRUFBQUEsZ0JBQWdCLEVBQUUsNEJBQVk7QUFDMUIsU0FBS3BELEtBQUwsQ0FBV29ELGdCQUFYO0FBQ0gsR0E1SDJCO0FBOEg1QjtBQUNBYSxFQUFBQSxtQkFBbUIsRUFBRSwrQkFBWTtBQUM3QixRQUFJM0UsV0FBVyxHQUFHRCxPQUFPLENBQUMsY0FBRCxDQUF6Qjs7QUFDQSxTQUFLeUQsU0FBTCxDQUFleEQsV0FBVyxDQUFDbUUsVUFBWixDQUF1QlMsR0FBdEM7QUFDSCxHQWxJMkI7QUFvSTVCO0FBQ0E3QyxFQUFBQSxnQkFBZ0IsRUFBRSwwQkFBVThCLElBQVYsRUFBZ0I7QUFDOUIsUUFBSTdELFdBQVcsR0FBR0QsT0FBTyxDQUFDLGNBQUQsQ0FBekI7O0FBQ0EsUUFBSUMsV0FBVyxDQUFDNkUsV0FBWixDQUF3QmhCLElBQUksQ0FBQ0osV0FBN0IsQ0FBSixFQUErQztBQUMzQyxXQUFLL0MsS0FBTCxDQUFXb0UsbUJBQVgsQ0FBK0JqQixJQUEvQixFQUFxQyxJQUFyQztBQUVBLFdBQUtrQix3QkFBTCxDQUE4QmxCLElBQUksQ0FBQ0osV0FBbkMsRUFBZ0QsQ0FBaEQ7QUFDSDtBQUNKLEdBNUkyQjtBQThJNUI7QUFDQXBCLEVBQUFBLGVBQWUsRUFBRSx5QkFBVXdCLElBQVYsRUFBZ0I7QUFDN0IsUUFBSTdELFdBQVcsR0FBR0QsT0FBTyxDQUFDLGNBQUQsQ0FBekI7O0FBQ0EsUUFBSUMsV0FBVyxDQUFDNkUsV0FBWixDQUF3QmhCLElBQUksQ0FBQ0osV0FBN0IsQ0FBSixFQUErQztBQUMzQyxXQUFLL0MsS0FBTCxDQUFXb0UsbUJBQVgsQ0FBK0JqQixJQUEvQixFQUFxQyxLQUFyQztBQUNBLFdBQUtrQix3QkFBTCxDQUE4QmxCLElBQUksQ0FBQ0osV0FBbkMsRUFBZ0QsQ0FBaEQ7QUFDSDtBQUNKLEdBckoyQjtBQXVKNUI7QUFDQXpCLEVBQUFBLGlCQUFpQixFQUFFLDJCQUFVNkIsSUFBVixFQUFnQjtBQUMvQm1CLElBQUFBLEdBQUcsQ0FBQ0MsSUFBSixDQUFTLFFBQVQsRUFEK0IsQ0FFL0I7O0FBQ0EsU0FBS3ZFLEtBQUwsQ0FBV3dFLGNBQVgsQ0FBMEJyQixJQUExQjtBQUNILEdBNUoyQjtBQThKNUI7QUFDQTVCLEVBQUFBLGNBQWMsRUFBRSx3QkFBVTRCLElBQVYsRUFBZ0I7QUFDNUJtQixJQUFBQSxHQUFHLENBQUNDLElBQUosQ0FBUyxNQUFULEVBRDRCLENBRTVCOztBQUNBLFNBQUt2RSxLQUFMLENBQVd5RSxXQUFYLENBQXVCdEIsSUFBdkI7QUFDSCxHQW5LMkI7QUFxSzVCO0FBQ0F1QixFQUFBQSxjQUFjLEVBQUUsMEJBQVk7QUFDeEJKLElBQUFBLEdBQUcsQ0FBQ0MsSUFBSixDQUFTLFlBQVQ7QUFDQSxTQUFLckIsWUFBTCxDQUFrQixLQUFsQixFQUF5QixFQUF6QjtBQUNILEdBeksyQjtBQTJLNUI7QUFDQXlCLEVBQUFBLGVBQWUsRUFBRSwyQkFBWTtBQUN6QkwsSUFBQUEsR0FBRyxDQUFDQyxJQUFKLENBQVMsWUFBVDtBQUNBLFNBQUtyQixZQUFMLENBQWtCLEtBQWxCLEVBQXlCLEVBQXpCO0FBQ0gsR0EvSzJCO0FBaUw1QjtBQUNBMEIsRUFBQUEsaUJBQWlCLEVBQUUsNkJBQVk7QUFDM0JOLElBQUFBLEdBQUcsQ0FBQ0MsSUFBSixDQUFTLHNCQUFUO0FBQ0EsU0FBS3JCLFlBQUwsQ0FBa0IsS0FBbEIsRUFBeUIsRUFBekI7QUFDSCxHQXJMMkI7QUF1TDVCO0FBQ0EyQixFQUFBQSxTQUFTLEVBQUMscUJBQVU7QUFDaEIsU0FBSzNCLFlBQUwsQ0FBa0IsS0FBbEIsRUFBeUIsRUFBekI7QUFDSCxHQTFMMkI7QUE0TDVCWCxFQUFBQSxXQUFXLEVBQUMscUJBQVNZLElBQVQsRUFBYztBQUN0QjJCLElBQUFBLE9BQU8sQ0FBQzNCLElBQUksQ0FBQzRCLEdBQU4sQ0FBUDtBQUNILEdBOUwyQjtBQWdNNUI7QUFDQXpDLEVBQUFBLFdBQVcsRUFBRSxxQkFBVWEsSUFBVixFQUFnQjtBQUN6QnhELElBQUFBLEVBQUUsQ0FBQ3FELEdBQUgsQ0FBTyxPQUFQO0FBQ0FyRCxJQUFBQSxFQUFFLENBQUNxRCxHQUFILENBQU9HLElBQVA7QUFFQSxTQUFLaEQsVUFBTCxDQUFnQjZFLHNCQUFoQixDQUF1QzdCLElBQXZDO0FBQ0EsU0FBS2tCLHdCQUFMLENBQThCbEIsSUFBSSxDQUFDSixXQUFuQyxFQUFnRCxDQUFoRDtBQUNILEdBdk0yQjtBQXlNNUJrQyxFQUFBQSxjQUFjLEVBQUUsd0JBQVVDLFNBQVYsRUFBcUI7QUFDakMsUUFBSWpDLFFBQVEsR0FBRyxFQUFmO0FBQ0FBLElBQUFBLFFBQVEsQ0FBQ2lDLFNBQVQsR0FBcUJBLFNBQXJCO0FBQ0EsU0FBS2hDLFlBQUwsQ0FBa0IsS0FBbEIsRUFBeUJELFFBQXpCO0FBQ0gsR0E3TTJCO0FBK001QjtBQUNBaEIsRUFBQUEsY0FBYyxFQUFFLHdCQUFVa0IsSUFBVixFQUFnQjtBQUM1QjJCLElBQUFBLE9BQU8sQ0FBQzNCLElBQUksQ0FBQzRCLEdBQU4sQ0FBUDs7QUFDQSxRQUFJNUIsSUFBSSxDQUFDZ0MsSUFBTCxJQUFhLENBQWpCLEVBQW9CO0FBQ2hCO0FBQ0EsV0FBS0Msb0JBQUwsQ0FBMEIsSUFBMUI7QUFDSDtBQUNKLEdBdE4yQjtBQXdONUI7QUFDQWxELEVBQUFBLFdBQVcsRUFBQyxxQkFBU2lCLElBQVQsRUFBYztBQUN0QixRQUFJQSxJQUFJLENBQUNKLFdBQUwsSUFBb0IsSUFBeEIsRUFBNkI7QUFDekJJLE1BQUFBLElBQUksQ0FBQ0osV0FBTCxHQUFtQnpELFdBQVcsQ0FBQ21FLFVBQVosQ0FBdUI0QixFQUExQztBQUNIOztBQUNELFFBQUlsQyxJQUFJLENBQUNtQyxlQUFMLElBQXdCLElBQTVCLEVBQWlDO0FBQzdCbkMsTUFBQUEsSUFBSSxDQUFDbUMsZUFBTCxHQUF1QixDQUF2QjtBQUNIOztBQUNELFNBQUt0RixLQUFMLENBQVdnRSxPQUFYLENBQW1CYixJQUFuQjtBQUNILEdBak8yQjtBQW1PNUI7QUFDQW9DLEVBQUFBLE9BQU8sRUFBQyxpQkFBU0wsU0FBVCxFQUFtQk0sT0FBbkIsRUFBMkJDLFdBQTNCLEVBQXVDQyxVQUF2QyxFQUFrRDtBQUN0RCxRQUFJekMsUUFBUSxHQUFHLEVBQWY7QUFDQUEsSUFBQUEsUUFBUSxDQUFDaUMsU0FBVCxHQUFxQkEsU0FBckI7QUFDQWpDLElBQUFBLFFBQVEsQ0FBQ3VDLE9BQVQsR0FBbUJBLE9BQW5CO0FBQ0F2QyxJQUFBQSxRQUFRLENBQUN3QyxXQUFULEdBQXVCQSxXQUF2QjtBQUNBeEMsSUFBQUEsUUFBUSxDQUFDeUMsVUFBVCxHQUFzQkEsVUFBdEI7QUFDQSxTQUFLeEMsWUFBTCxDQUFrQixLQUFsQixFQUF3QkQsUUFBeEI7QUFDSCxHQTNPMkI7QUE2TzVCZCxFQUFBQSxXQUFXLEVBQUMscUJBQVNnQixJQUFULEVBQWM7QUFDdEIyQixJQUFBQSxPQUFPLENBQUMzQixJQUFJLENBQUM0QixHQUFOLENBQVA7QUFDSCxHQS9PMkI7O0FBaVA1Qjs7Ozs7QUFLQVYsRUFBQUEsd0JBQXdCLEVBQUUsa0NBQVV0QixXQUFWLEVBQXVCNEMsYUFBdkIsRUFBc0M7QUFDNUQsU0FBSzNGLEtBQUwsQ0FBVzRGLGlCQUFYLENBQTZCRCxhQUE3QixFQUE0QzVDLFdBQTVDLEVBRDRELENBRTVEOztBQUNBLFFBQUk0QyxhQUFhLElBQUksQ0FBckIsRUFBd0I7QUFDcEI3RSxNQUFBQSxLQUFLLENBQUNDLFdBQU4sQ0FBa0JzQyxJQUFsQixDQUF1QndDLE9BQU8sQ0FBQ0MsV0FBL0IsRUFBNEMvQyxXQUE1QyxFQUF5RDRDLGFBQXpEO0FBQ0g7QUFDSixHQTVQMkI7O0FBOFA1Qjs7OztBQUlBNUQsRUFBQUEsZ0JBQWdCLEVBQUMsMEJBQVNvQixJQUFULEVBQWM7QUFDM0IsUUFBSUEsSUFBSixFQUFTO0FBQ0wsV0FBS25ELEtBQUwsQ0FBVytGLGFBQVgsQ0FBeUI1QyxJQUF6QjtBQUNIO0FBQ0osR0F0UTJCO0FBd1E1QjtBQUNBNkMsRUFBQUEsTUFBTSxFQUFFLGdCQUFVQyxFQUFWLEVBQWM7QUFDbEIsU0FBS2pHLEtBQUwsQ0FBV2tHLHFCQUFYO0FBQ0gsR0EzUTJCO0FBNlE1QjtBQUNBQyxFQUFBQSxtQkFBbUIsRUFBRSw2QkFBVXRELE1BQVYsRUFBa0I7QUFDbkMsU0FBSzdDLEtBQUwsQ0FBV21HLG1CQUFYO0FBQ0gsR0FoUjJCO0FBa1I1QjtBQUNBQyxFQUFBQSxZQUFZLEVBQUUsc0JBQVVsQixTQUFWLEVBQXFCbUIsYUFBckIsRUFBb0M7QUFDOUMsUUFBSXBELFFBQVEsR0FBRztBQUNYaUMsTUFBQUEsU0FBUyxFQUFFQSxTQURBO0FBRVhtQixNQUFBQSxhQUFhLEVBQUVBO0FBRkosS0FBZjtBQUlBLFNBQUtuRCxZQUFMLENBQWtCLEtBQWxCLEVBQXlCRCxRQUF6QjtBQUNILEdBelIyQjtBQTBSNUJiLEVBQUFBLFdBQVcsRUFBRSxxQkFBVWUsSUFBVixFQUFnQjtBQUN6QixRQUFJQSxJQUFJLENBQUNnQyxJQUFMLElBQWEsQ0FBakIsRUFBb0I7QUFDaEIsV0FBS0Msb0JBQUwsQ0FBMEIsSUFBMUI7QUFDSDtBQUNKLEdBOVIyQjtBQWdTNUI7QUFDQWtCLEVBQUFBLFdBQVcsRUFBRSx1QkFBWTtBQUNyQixTQUFLcEQsWUFBTCxDQUFrQixLQUFsQixFQUF5QixFQUF6QjtBQUNILEdBblMyQjtBQW9TNUJ6QixFQUFBQSxXQUFXLEVBQUUscUJBQVUwQixJQUFWLEVBQWdCO0FBQ3pCMkIsSUFBQUEsT0FBTyxDQUFDM0IsSUFBSSxDQUFDNEIsR0FBTixDQUFQO0FBQ0gsR0F0UzJCO0FBd1M1QjtBQUNBd0IsRUFBQUEsZUFBZSxFQUFDLDJCQUFVO0FBQ3RCLFNBQUtyRCxZQUFMLENBQWtCLEtBQWxCLEVBQXlCLEVBQXpCO0FBQ0gsR0EzUzJCO0FBNlM1QnhCLEVBQUFBLGVBQWUsRUFBQyx5QkFBU3lCLElBQVQsRUFBYztBQUMxQjJCLElBQUFBLE9BQU8sQ0FBQzNCLElBQUksQ0FBQzRCLEdBQU4sQ0FBUDtBQUNILEdBL1MyQjtBQWlUNUI7QUFDQXlCLEVBQUFBLG9CQUFvQixFQUFFLGdDQUFZO0FBQzlCLFdBQU8sS0FBS3BHLGVBQVo7QUFDSCxHQXBUMkI7QUFzVDVCO0FBQ0FnRixFQUFBQSxvQkFBb0IsRUFBRSw4QkFBVXZDLE1BQVYsRUFBa0I7QUFDcEMsU0FBS3pDLGVBQUwsR0FBdUJ5QyxNQUF2QjtBQUNILEdBelQyQjtBQTJUNUI7QUFDQTRELEVBQUFBLGdCQUFnQixFQUFFLDRCQUFZO0FBQzFCLFFBQUkxRCxXQUFXLEdBQUcsS0FBSy9DLEtBQUwsQ0FBVzBHLGFBQVgsRUFBbEI7QUFDQSxXQUFPLEtBQUtGLG9CQUFMLE1BQWdDekQsV0FBVyxJQUFJekQsV0FBVyxDQUFDbUUsVUFBWixDQUF1QjRCLEVBQXRFLElBQThFdEMsV0FBVyxJQUFJekQsV0FBVyxDQUFDbUUsVUFBWixDQUF1QmtELFdBQTNIO0FBQ0gsR0EvVDJCO0FBaVU1QkMsRUFBQUEsc0JBQXNCLEVBQUMsZ0NBQVMvRCxNQUFULEVBQWdCO0FBQ25DLFNBQUt4QyxpQkFBTCxHQUF5QndDLE1BQXpCO0FBQ0gsR0FuVTJCO0FBcVU1QmdFLEVBQUFBLHNCQUFzQixFQUFDLGtDQUFVO0FBQzdCLFdBQU8sS0FBS3hHLGlCQUFaO0FBQ0gsR0F2VTJCO0FBeVU1QjtBQUNBYSxFQUFBQSxjQUFjLEVBQUMsMEJBQVU7QUFDckIsUUFBRyxLQUFLVCxVQUFMLElBQW1CLElBQW5CLElBQTJCLEtBQUtBLFVBQUwsQ0FBZ0JxRyxNQUFoQixJQUF3QixDQUF0RCxFQUF3RDs7QUFDeEQsU0FBSSxJQUFJQyxDQUFSLElBQWEsS0FBS3RHLFVBQWxCLEVBQTZCO0FBQ3pCLFVBQUcsS0FBS0EsVUFBTCxDQUFnQnNHLENBQWhCLGFBQUgsRUFBK0I7QUFDM0IsYUFBS3RHLFVBQUwsQ0FBZ0JzRyxDQUFoQjtBQUNIO0FBQ0o7O0FBQ0QsU0FBS3RHLFVBQUwsR0FBa0IsRUFBbEI7QUFDSCxHQWxWMkI7QUFvVjVCO0FBQ0F1RyxFQUFBQSxjQUFjLEVBQUUsd0JBQVVuRSxNQUFWLEVBQWtCRSxXQUFsQixFQUErQkksSUFBL0IsRUFBcUM7QUFDakQsUUFBSU4sTUFBTSxJQUFJLElBQWQsRUFBb0I7QUFDaEIsVUFBR29FLFVBQVUsSUFBSSxJQUFqQixFQUFzQjtBQUNsQixhQUFLeEcsVUFBTCxDQUFnQnlHLElBQWhCLENBQXFCO0FBQUMsc0JBQVMsVUFBU3JFLE1BQVQsRUFBaUJFLFdBQWpCLEVBQThCSSxJQUE5QixFQUFtQztBQUM5RCxpQkFBSzZELGNBQUwsQ0FBb0JuRSxNQUFwQixFQUE0QkUsV0FBNUIsRUFBeUNJLElBQXpDO0FBQ0gsV0FGOEIsQ0FFN0JuQyxJQUY2QixDQUV4QixJQUZ3QixFQUVuQjZCLE1BRm1CLEVBRVhFLFdBRlcsRUFFRUksSUFGRjtBQUFWLFNBQXJCO0FBR0E7QUFDSDs7QUFDRCxVQUFJLEtBQUs1Qyx1QkFBTCxDQUE2QndDLFdBQTdCLENBQUosRUFBK0M7QUFDM0MsYUFBS3hDLHVCQUFMLENBQTZCd0MsV0FBN0IsRUFBMENvRSxLQUExQztBQUNBLGFBQUs1Ryx1QkFBTCxDQUE2QndDLFdBQTdCLElBQTRDLElBQTVDO0FBQ0g7O0FBRUQsVUFBSSxDQUFDLEtBQUsxQyxpQkFBVixFQUE2QjtBQUN6QixZQUFJMEMsV0FBVyxJQUFJekQsV0FBVyxDQUFDbUUsVUFBWixDQUF1QjJELFNBQTFDLEVBQXFEO0FBQUM7QUFDbEQsY0FBSUMsbUJBQW1CLEdBQUdoSSxPQUFPLENBQUMsc0JBQUQsQ0FBakM7O0FBQ0FnSSxVQUFBQSxtQkFBbUIsQ0FBQ3hELFdBQXBCLEdBQWtDeUQsZ0JBQWxDLENBQW1ELElBQW5ELEVBQXlEbkUsSUFBekQ7QUFDSCxTQUhELE1BR08sSUFBSUosV0FBVyxJQUFJekQsV0FBVyxDQUFDbUUsVUFBWixDQUF1QjhELEtBQTFDLEVBQWlEO0FBQ3BELGNBQUlDLGVBQWUsR0FBR25JLE9BQU8sQ0FBQyxrQkFBRCxDQUE3Qjs7QUFDQW1JLFVBQUFBLGVBQWUsQ0FBQzNELFdBQWhCLEdBQThCNEQsb0JBQTlCLENBQW1ELElBQW5ELEVBQXlEdEUsSUFBekQ7QUFDSCxTQUhNLE1BR0EsSUFBSUosV0FBVyxJQUFJekQsV0FBVyxDQUFDbUUsVUFBWixDQUF1QmlFLEtBQXRDLElBQStDdkUsSUFBL0MsSUFBdURBLElBQUksQ0FBQ3dFLE1BQUwsSUFBZSxDQUExRSxFQUE2RTtBQUFFO0FBQ2xGO0FBQ0FuSSxVQUFBQSxvQkFBb0IsQ0FBQ3FFLFdBQXJCLEdBQW1DK0QscUJBQW5DLENBQXlELElBQXpEOztBQUNBLGNBQUlDLGVBQWUsR0FBR3hJLE9BQU8sQ0FBQyxtQkFBRCxDQUE3Qjs7QUFDQSxlQUFLa0IsdUJBQUwsQ0FBNkJ3QyxXQUE3QixJQUE0QyxJQUFJOEUsZUFBSixDQUFvQjFFLElBQXBCLENBQTVDO0FBQ0EsZUFBSzVDLHVCQUFMLENBQTZCd0MsV0FBN0IsRUFBMEMrRSxJQUExQztBQUNILFNBTk0sTUFNRCxJQUFJL0UsV0FBVyxJQUFJekQsV0FBVyxDQUFDbUUsVUFBWixDQUF1QnNFLFFBQTFDLEVBQXFEO0FBQUs7QUFDNUQxSSxVQUFBQSxPQUFPLENBQUMsc0JBQUQsQ0FBUCxDQUFnQ3dFLFdBQWhDLEdBQThDbUUseUJBQTlDLENBQXdFLElBQXhFLEVBQTZFN0UsSUFBN0U7QUFDSCxTQUZLLE1BRUEsSUFBSUosV0FBVyxJQUFJekQsV0FBVyxDQUFDbUUsVUFBWixDQUF1QjRCLEVBQTFDLEVBQTZDO0FBQVM7QUFDeEQsZUFBSzlFLHVCQUFMLENBQTZCd0MsV0FBN0IsSUFBNEM5QyxLQUFLLENBQUNDLFdBQU4sQ0FBa0IseUJBQWxCLENBQTVDO0FBQ0EsZUFBS0ssdUJBQUwsQ0FBNkJ3QyxXQUE3QixFQUEwQytFLElBQTFDLENBQStDM0UsSUFBL0M7QUFDSCxTQUhLLE1BR0E7QUFDRixjQUFJLENBQUMsS0FBSzVDLHVCQUFMLENBQTZCd0MsV0FBN0IsQ0FBTCxFQUFnRDtBQUM1QyxnQkFBSUksSUFBSSxDQUFDd0UsTUFBTCxJQUFlLENBQW5CLEVBQXNCO0FBQ2xCO0FBQ0FuSSxjQUFBQSxvQkFBb0IsQ0FBQ3FFLFdBQXJCLEdBQW1DK0QscUJBQW5DLENBQXlELElBQXpEOztBQUVBLGtCQUFJSyxnQkFBZ0IsR0FBRzVJLE9BQU8sQ0FBQyxzQkFBRCxDQUE5Qjs7QUFDQSxtQkFBS2tCLHVCQUFMLENBQTZCd0MsV0FBN0IsSUFBNEMsSUFBSWtGLGdCQUFKLENBQXFCOUUsSUFBSSxDQUFDd0UsTUFBMUIsRUFBa0M1RSxXQUFsQyxDQUE1QztBQUNBLG1CQUFLeEMsdUJBQUwsQ0FBNkJ3QyxXQUE3QixFQUEwQytFLElBQTFDLENBQStDO0FBQUMzRSxnQkFBQUEsSUFBSSxFQUFDQSxJQUFOO0FBQVcrRSxnQkFBQUEsVUFBVSxFQUFFbkY7QUFBdkIsZUFBL0M7QUFDSCxhQVBELE1BT087QUFDSHBELGNBQUFBLEVBQUUsQ0FBQ3FELEdBQUgsQ0FBTyxRQUFQO0FBQ0EsbUJBQUttRixrQkFBTCxDQUF3QixJQUF4QixFQUE4QnBGLFdBQTlCLEVBQTJDSSxJQUFJLENBQUN3RSxNQUFoRCxFQUF3RHhFLElBQXhEO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7QUFDSixLQTlDRCxNQThDTztBQUNILFVBQUksS0FBSzVDLHVCQUFMLENBQTZCd0MsV0FBN0IsQ0FBSixFQUErQztBQUMzQyxhQUFLeEMsdUJBQUwsQ0FBNkJ3QyxXQUE3QixFQUEwQ29FLEtBQTFDO0FBQ0EsYUFBSzVHLHVCQUFMLENBQTZCd0MsV0FBN0IsSUFBNEMsSUFBNUM7QUFDSDtBQUNKO0FBRUosR0EzWTJCO0FBNlk1QnFGLEVBQUFBLGFBQWEsRUFBRSx1QkFBU3JGLFdBQVQsRUFBc0I7QUFDakMsUUFBSSxLQUFLeEMsdUJBQVQsRUFBa0M7QUFDOUIsYUFBTyxLQUFLQSx1QkFBTCxDQUE2QndDLFdBQTdCLENBQVA7QUFDSDtBQUNKLEdBaloyQjtBQW1aNUI7QUFDQXNGLEVBQUFBLHNCQUFzQixFQUFFLGdDQUFVeEYsTUFBVixFQUFrQk0sSUFBbEIsRUFBd0I7QUFDNUMsUUFBSU4sTUFBTSxJQUFJLElBQWQsRUFBb0I7QUFDaEIsVUFBSSxLQUFLeUYsY0FBTCxJQUF1QixJQUEzQixFQUFpQztBQUM3QixhQUFLQSxjQUFMLEdBQXNCckksS0FBSyxDQUFDQyxXQUFOLENBQWtCLHlCQUFsQixDQUF0QjtBQUNIOztBQUNELFdBQUtvSSxjQUFMLENBQW9CUixJQUFwQixDQUF5QjNFLElBQXpCO0FBQ0gsS0FMRCxNQUtPO0FBQ0gsVUFBSSxLQUFLbUYsY0FBVCxFQUF5QjtBQUNyQixhQUFLQSxjQUFMLENBQW9CbkIsS0FBcEI7QUFDQSxhQUFLbUIsY0FBTCxHQUFzQixJQUF0QjtBQUNIO0FBQ0o7QUFDSixHQWhhMkI7QUFrYTVCO0FBQ0FILEVBQUFBLGtCQUFrQixFQUFFLDRCQUFVdEYsTUFBVixFQUFrQkUsV0FBbEIsRUFBK0I0RSxNQUEvQixFQUF1Q3hFLElBQXZDLEVBQTZDO0FBQzdELFFBQUlOLE1BQU0sSUFBSSxJQUFkLEVBQW9CO0FBQ2hCO0FBQ0E7QUFDQSxVQUFJLENBQUMsS0FBS3hDLGlCQUFWLEVBQTZCO0FBQ3pCLFlBQUksQ0FBQyxLQUFLRyxxQkFBTCxDQUEyQnVDLFdBQTNCLENBQUwsRUFBOEM7QUFDMUM7QUFDQXZELFVBQUFBLG9CQUFvQixDQUFDcUUsV0FBckIsR0FBbUMrRCxxQkFBbkMsQ0FBeUQsSUFBekQ7O0FBRUEsY0FBSVcsY0FBYyxHQUFHbEosT0FBTyxDQUFDLG9CQUFELENBQTVCOztBQUNBLGNBQUltSixXQUFXLEdBQUcsSUFBSUQsY0FBSixDQUFtQnhGLFdBQW5CLEVBQWdDNEUsTUFBaEMsRUFBd0N4RSxJQUF4QyxDQUFsQjs7QUFDQSxjQUFJcUYsV0FBSixFQUFpQjtBQUNiQSxZQUFBQSxXQUFXLENBQUNWLElBQVo7QUFDSDs7QUFDRCxlQUFLdEgscUJBQUwsQ0FBMkJ1QyxXQUEzQixJQUEwQ3lGLFdBQTFDO0FBQ0g7QUFDSixPQVpELE1BWU87QUFDSCxZQUFJakosZ0JBQWdCLENBQUNzRSxXQUFqQixHQUErQjRFLHFCQUEvQixFQUFKLEVBQTREO0FBQ3hELGVBQUtDLGlCQUFMLENBQXVCNUYsU0FBdkIsQ0FBaUN4RCxXQUFXLENBQUNtRSxVQUFaLENBQXVCaUUsS0FBeEQ7QUFDSDtBQUNKO0FBQ0osS0FwQkQsTUFvQk87QUFDSCxVQUFJLEtBQUtsSCxxQkFBTCxDQUEyQnVDLFdBQTNCLENBQUosRUFBNkM7QUFDekMsYUFBS3ZDLHFCQUFMLENBQTJCdUMsV0FBM0IsRUFBd0NvRSxLQUF4QztBQUNBLGFBQUszRyxxQkFBTCxDQUEyQnVDLFdBQTNCLElBQTBDLElBQTFDO0FBQ0g7QUFDSjtBQUNKLEdBOWIyQjtBQWdjNUI7QUFDQTRGLEVBQUFBLG1CQUFtQixFQUFFLDZCQUFVNUYsV0FBVixFQUF1QjtBQUN4QyxXQUFPQSxXQUFXLElBQUksS0FBSy9DLEtBQUwsQ0FBVzBHLGFBQVgsRUFBdEI7QUFDSCxHQW5jMkI7QUFvYzVCO0FBQ0FrQyxFQUFBQSxrQkFyYzRCLDhCQXFjUi9GLE1BcmNRLEVBcWNBZ0csT0FyY0EsRUFxY1M7QUFDakMsUUFBR2hHLE1BQU0sSUFBSSxJQUFiLEVBQW1CO0FBQ2YsVUFBRyxDQUFDLEtBQUtpRyxnQkFBVCxFQUEwQjtBQUN0QixZQUFJQyxjQUFjLEdBQUcxSixPQUFPLENBQUMsb0JBQUQsQ0FBNUI7O0FBQ0EsYUFBS3lKLGdCQUFMLEdBQXdCLElBQUlDLGNBQUosRUFBeEI7QUFDSDs7QUFDRCxVQUFHLEtBQUtELGdCQUFMLENBQXNCRSxNQUF0QixNQUFrQyxLQUFyQyxFQUEyQztBQUN2QyxhQUFLRixnQkFBTCxDQUFzQmhCLElBQXRCLENBQTJCZSxPQUEzQjtBQUNIO0FBQ0osS0FSRCxNQVFLO0FBQ0QsVUFBRyxLQUFLQyxnQkFBUixFQUF5QjtBQUNyQixhQUFLQSxnQkFBTCxDQUFzQjNCLEtBQXRCO0FBQ0EsYUFBSzJCLGdCQUFMLEdBQXdCLElBQXhCO0FBQ0g7QUFDSjtBQUNKLEdBcGQyQjtBQXNkNUI7QUFDQUcsRUFBQUEsZ0JBQWdCLEVBQUUsMEJBQVNwRyxNQUFULEVBQWlCO0FBQzlCLFNBQUt2QyxnQkFBTCxHQUF3QnVDLE1BQXhCO0FBQ0osR0F6ZDJCO0FBMmQ1QjtBQUNBcUcsRUFBQUEsa0JBQWtCLEVBQUUsOEJBQVc7QUFDM0IsV0FBTyxLQUFLNUksZ0JBQVo7QUFDSCxHQTlkMkI7QUFnZTVCO0FBQ0E2SSxFQUFBQSxZQUFZLEVBQUMsc0JBQVNDLEtBQVQsRUFBZTtBQUN4QixRQUFJbkcsUUFBUSxHQUFHLEVBQWY7QUFDQUEsSUFBQUEsUUFBUSxDQUFDbUcsS0FBVCxHQUFpQkEsS0FBakI7QUFDQSxTQUFLbEcsWUFBTCxDQUFrQixLQUFsQixFQUF5QkQsUUFBekI7QUFDSCxHQXJlMkI7QUF1ZTVCakIsRUFBQUEsWUFBWSxFQUFDLHNCQUFTbUIsSUFBVCxFQUFjO0FBQ3ZCMkIsSUFBQUEsT0FBTyxDQUFDM0IsSUFBSSxDQUFDNEIsR0FBTixDQUFQO0FBQ0gsR0F6ZTJCO0FBMmU1QnNFLEVBQUFBLGtCQUFrQixFQUFFLDRCQUFTQyxRQUFULEVBQW1CO0FBQ25DLFFBQUlDLFdBQVcsR0FBRyxLQUFLdkosS0FBTCxDQUFXMkMsY0FBWCxFQUFsQjtBQUNBMkcsSUFBQUEsUUFBUSxDQUFDQyxXQUFELENBQVI7QUFDSCxHQTllMkI7QUFnZjVCQyxFQUFBQSxlQUFlLEVBQUUseUJBQVNDLFNBQVQsRUFBb0I7QUFDakMsUUFBSUEsU0FBSixFQUFlO0FBQ1hBLE1BQUFBLFNBQVMsQ0FBQyxLQUFLekosS0FBTCxDQUFXd0osZUFBWCxFQUFELENBQVQ7QUFDSCxLQUZELE1BRU87QUFDSCxVQUFJLEtBQUt4SixLQUFULEVBQ0ksT0FBTyxLQUFLQSxLQUFMLENBQVd3SixlQUFYLEVBQVA7QUFDUDtBQUNKLEdBdmYyQjtBQXlmNUI7QUFDQUUsRUFBQUEsVUFBVSxFQUFFLG9CQUFVQyxTQUFWLEVBQXFCQyxhQUFyQixFQUFvQ0MsV0FBcEMsRUFBaUQ7QUFDekQsUUFBSTVHLFFBQVEsR0FBRyxFQUFmO0FBQ0FBLElBQUFBLFFBQVEsQ0FBQzBHLFNBQVQsR0FBcUJBLFNBQXJCO0FBQ0ExRyxJQUFBQSxRQUFRLENBQUMyRyxhQUFULEdBQXlCQSxhQUF6QjtBQUNBM0csSUFBQUEsUUFBUSxDQUFDNEcsV0FBVCxHQUF1QkEsV0FBdkI7QUFDQSxTQUFLM0csWUFBTCxDQUFrQixLQUFsQixFQUF5QkQsUUFBekI7QUFDSCxHQWhnQjJCO0FBa2dCNUJyQixFQUFBQSxVQUFVLEVBQUMsb0JBQVN1QixJQUFULEVBQWM7QUFDckIyQixJQUFBQSxPQUFPLENBQUMzQixJQUFJLENBQUM0QixHQUFOLENBQVA7O0FBQ0ExRixJQUFBQSxPQUFPLENBQUMsaUJBQUQsQ0FBUCxDQUEyQndFLFdBQTNCLEdBQXlDaUcsY0FBekMsQ0FBd0QsS0FBeEQ7O0FBQ0F6SyxJQUFBQSxPQUFPLENBQUMsbUJBQUQsQ0FBUCxDQUE2QndFLFdBQTdCLEdBQTJDa0csb0JBQTNDLENBQWdFLEtBQWhFO0FBQ0gsR0F0Z0IyQjtBQXdnQjVCO0FBQ0FDLEVBQUFBLGVBQWUsRUFBQyx5QkFBU0MsUUFBVCxFQUFrQixDQUVqQyxDQTNnQjJCO0FBNmdCNUI7QUFDQUMsRUFBQUEsWUFBWSxFQUFDLHNCQUFTQyxJQUFULEVBQWNoSCxJQUFkLEVBQW1CO0FBQzVCLFFBQUlGLFFBQVEsR0FBRyxFQUFmO0FBQ0FBLElBQUFBLFFBQVEsQ0FBQzBHLFNBQVQsR0FBcUJ4RyxJQUFJLENBQUN3RyxTQUExQjtBQUNBMUcsSUFBQUEsUUFBUSxDQUFDMkcsYUFBVCxHQUF5QnpHLElBQUksQ0FBQ3lHLGFBQTlCO0FBQ0EzRyxJQUFBQSxRQUFRLENBQUNtSCxRQUFULEdBQW9CRCxJQUFJLEdBQUcsQ0FBSCxHQUFPLENBQS9CO0FBQ0EsU0FBS2pILFlBQUwsQ0FBa0IsS0FBbEIsRUFBeUJELFFBQXpCO0FBQ0gsR0FwaEIyQjtBQXNoQjVCcEIsRUFBQUEsWUFBWSxFQUFDLHNCQUFTc0IsSUFBVCxFQUFjO0FBQ3ZCMkIsSUFBQUEsT0FBTyxDQUFDM0IsSUFBSSxDQUFDNEIsR0FBTixDQUFQO0FBQ0gsR0F4aEIyQjtBQTBoQjVCO0FBQ0FqRCxFQUFBQSxlQUFlLEVBQUMseUJBQVNxQixJQUFULEVBQWM7QUFDMUIsUUFBR0EsSUFBSCxFQUFRO0FBQ0osVUFBSSxDQUFFLEtBQUtYLFNBQUwsRUFBTixFQUF1QjtBQUNuQixZQUFJNkgsVUFBVSxHQUFHLFlBQVU7QUFDdkIsZUFBS0Msc0JBQUwsQ0FBNEIsSUFBNUIsRUFBa0M7QUFBQ1YsWUFBQUEsYUFBYSxFQUFFekcsSUFBSSxDQUFDeUcsYUFBckI7QUFBb0NELFlBQUFBLFNBQVMsRUFBRXhHLElBQUksQ0FBQ3dHO0FBQXBELFdBQWxDO0FBQ0gsU0FGZ0IsQ0FFZjNJLElBRmUsQ0FFVixJQUZVLENBQWpCOztBQUdBLFlBQUl1SixVQUFVLEdBQUcsWUFBVTtBQUN2QixlQUFLRCxzQkFBTCxDQUE0QixLQUE1QixFQUFtQztBQUFDVixZQUFBQSxhQUFhLEVBQUV6RyxJQUFJLENBQUN5RyxhQUFyQjtBQUFvQ0QsWUFBQUEsU0FBUyxFQUFFeEcsSUFBSSxDQUFDd0c7QUFBcEQsV0FBbkM7QUFDSCxTQUZnQixDQUVmM0ksSUFGZSxDQUVWLElBRlUsQ0FBakI7O0FBR0EsWUFBSXdKLElBQUksR0FBRzdLLEVBQUUsQ0FBQzhLLEVBQUgsQ0FBTUMsU0FBTixDQUFnQnpLLEtBQUssQ0FBQzBLLEtBQU4sQ0FBWSwwREFBWixDQUFoQixFQUF5RnhILElBQUksQ0FBQ3NDLFdBQUwsSUFBb0IsRUFBN0csQ0FBWDs7QUFDQXBHLFFBQUFBLE9BQU8sQ0FBQyxhQUFELENBQVAsQ0FBdUJ1TCxJQUF2QixDQUE0QkosSUFBNUIsRUFBa0N2SyxLQUFLLENBQUMwSyxLQUFOLENBQVksTUFBWixDQUFsQyxFQUF1RE4sVUFBdkQsRUFBbUVwSyxLQUFLLENBQUMwSyxLQUFOLENBQVksSUFBWixDQUFuRSxFQUFzRkosVUFBdEY7QUFDSDtBQUNKO0FBQ0osR0F4aUIyQjtBQTBpQjVCO0FBQ0FELEVBQUFBLHNCQUFzQixFQUFFLGdDQUFVSCxJQUFWLEVBQWdCaEgsSUFBaEIsRUFBc0I7QUFDMUMsUUFBSUYsUUFBUSxHQUFHLEVBQWY7QUFDQUEsSUFBQUEsUUFBUSxDQUFDMEcsU0FBVCxHQUFxQnhHLElBQUksQ0FBQ3dHLFNBQTFCO0FBQ0ExRyxJQUFBQSxRQUFRLENBQUMyRyxhQUFULEdBQXlCekcsSUFBSSxDQUFDeUcsYUFBOUI7QUFDQTNHLElBQUFBLFFBQVEsQ0FBQ21ILFFBQVQsR0FBb0JELElBQUksR0FBRyxDQUFILEdBQU8sQ0FBL0I7QUFBaUM7QUFDakMsU0FBS2pILFlBQUwsQ0FBa0IsS0FBbEIsRUFBeUJELFFBQXpCO0FBQ0gsR0FqakIyQjtBQWtqQjVCO0FBQ0E0SCxFQUFBQSxzQkFuakI0QixrQ0FtakJMaEksTUFuakJLLEVBbWpCR2lJLFNBbmpCSCxFQW1qQmNDLFVBbmpCZCxFQW1qQnlCO0FBQ2pELFFBQUdsSSxNQUFNLElBQUksSUFBYixFQUFrQjtBQUNkLFVBQUcsS0FBS21JLGNBQUwsSUFBdUIsSUFBMUIsRUFBK0I7QUFDM0IsWUFBSUMsa0JBQWtCLEdBQUc1TCxPQUFPLENBQUMseUJBQUQsQ0FBaEM7O0FBQ0EsYUFBSzJMLGNBQUwsR0FBc0IsSUFBSUMsa0JBQUosRUFBdEI7QUFDSDs7QUFDRCxVQUFHLEtBQUtELGNBQUwsQ0FBb0JoQyxNQUFwQixNQUFnQyxLQUFuQyxFQUF5QztBQUNyQyxhQUFLZ0MsY0FBTCxDQUFvQmxELElBQXBCLENBQXlCO0FBQUNnRCxVQUFBQSxTQUFTLEVBQUNBLFNBQVg7QUFBcUJDLFVBQUFBLFVBQVUsRUFBQ0E7QUFBaEMsU0FBekI7QUFDSDtBQUNKLEtBUkQsTUFRSztBQUNELFVBQUcsS0FBS0MsY0FBUixFQUF1QjtBQUNuQixhQUFLQSxjQUFMLENBQW9CN0QsS0FBcEI7QUFDQSxhQUFLNkQsY0FBTCxHQUFzQixJQUF0QjtBQUNIO0FBQ0o7QUFDSixHQWxrQjJCO0FBbWtCNUI7QUFDQUUsRUFBQUEsd0JBcGtCNEIsb0NBb2tCRi9ILElBcGtCRSxFQW9rQklnSSxLQXBrQkosRUFva0JXQyxXQXBrQlgsRUFva0J3QjtBQUNoRCxRQUFHLEtBQUtDLGNBQUwsSUFBdUIsS0FBS0EsY0FBTCxDQUFvQkMscUJBQXBCLENBQTBDSCxLQUExQyxFQUFpREMsV0FBakQsQ0FBMUIsRUFBd0Y7QUFDcEYsV0FBS0MsY0FBTCxDQUFvQkUsT0FBcEIsQ0FBNEJwSSxJQUE1QjtBQUNIO0FBQ0osR0F4a0IyQjtBQXlrQjVCO0FBQ0FxSSxFQUFBQSxzQkExa0I0QixrQ0Ewa0JKM0ksTUExa0JJLEVBMGtCSU0sSUExa0JKLEVBMGtCVWdJLEtBMWtCVixFQTBrQmlCQyxXQTFrQmpCLEVBMGtCOEI7QUFDdEQsUUFBR3ZJLE1BQU0sSUFBSSxJQUFiLEVBQWtCO0FBQ2QsVUFBRyxLQUFLd0ksY0FBTCxJQUF1QixJQUExQixFQUErQjtBQUMzQixZQUFJSSxrQkFBa0IsR0FBR3BNLE9BQU8sQ0FBQyx5QkFBRCxDQUFoQzs7QUFDQSxhQUFLZ00sY0FBTCxHQUFzQixJQUFJSSxrQkFBSixFQUF0QjtBQUNIOztBQUNELFVBQUcsS0FBS0osY0FBTCxDQUFvQnJDLE1BQXBCLE1BQWdDLEtBQW5DLEVBQXlDO0FBQ3JDLGFBQUtxQyxjQUFMLENBQW9CdkQsSUFBcEIsQ0FBeUI7QUFBQzNFLFVBQUFBLElBQUksRUFBQ0EsSUFBTjtBQUFZZ0ksVUFBQUEsS0FBSyxFQUFDQSxLQUFsQjtBQUF5QkMsVUFBQUEsV0FBVyxFQUFDQTtBQUFyQyxTQUF6QjtBQUNIO0FBQ0osS0FSRCxNQVFLO0FBQ0QsVUFBRyxLQUFLQyxjQUFSLEVBQXVCO0FBQ25CLGFBQUtBLGNBQUwsQ0FBb0JsRSxLQUFwQjtBQUNBLGFBQUtrRSxjQUFMLEdBQXNCLElBQXRCO0FBQ0g7QUFDSjtBQUNKO0FBemxCMkIsQ0FBVCxDQUF2QjtBQTRsQkFLLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQmpNLGdCQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDmiJjmlpfmjqfliLblmahcbi8vIDxici8+Q3JlYXRlOiAyMDE4LTExLTI4IDE5OjE5OjE5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIEJhdHRsZUV2ZW50ID0gcmVxdWlyZShcImJhdHRsZV9ldmVudFwiKTtcbnZhciBCYXR0bGVDb25zdCA9IHJlcXVpcmUoXCJiYXR0bGVfY29uc3RcIik7XG52YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbnZhciBMZXZ1cGdyYWRlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJsZXZ1cGdyYWRlX2NvbnRyb2xsZXJcIilcbnZhciBNYWludWlFdmVudCA9IHJlcXVpcmUoXCJtYWludWlfZXZlbnRcIik7XG5cbnZhciBCYXR0bGVDb250cm9sbGVyID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDb250cm9sbGVyLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW6YWN572u5pWw5o2uXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB2YXIgQmF0dGxlTW9kZWwgPSByZXF1aXJlKFwiYmF0dGxlX21vZGVsXCIpO1xuICAgICAgICB0aGlzLm1vZGVsID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJiYXR0bGVfbW9kZWxcIilcblxuICAgICAgICAvLyB2YXIgQmF0dGxlSG9va01vZGVsID0gcmVxdWlyZShcImJhdHRsZV9ob29rX21vZGVsXCIpO1xuICAgICAgICB0aGlzLmhvb2tfbW9kZWwgPSBVdGlscy5jcmVhdGVDbGFzcyhcImJhdHRsZV9ob29rX21vZGVsXCIpO1xuXG4gICAgICAgIHRoaXMubW9kZWwuaW5pdENvbmZpZygpO1xuICAgICAgICB0aGlzLmhvb2tfbW9kZWwuaW5pdENvbmZpZygpXG5cbiAgICAgICAgdGhpcy5pc193YXRjaF9yZXBsYXkgPSBmYWxzZTsgICAgICAgICAgIC8vIOaYr+WQpuWxnuS6juinguaImOeKtuaAgVxuXG4gICAgICAgIHRoaXMuaXNfdW5sb2NrX2NoYXB0ZXIgPSBmYWxzZSAgICAgICAgICAvLyDmmK/lkKbop6PplIHnq6DoioLkuK0gXG4gICAgICAgIHRoaXMuaXNfbm9ybWFsX2JhdHRsZSA9IGZhbHNlOyAgICAgICAgICAvLyDmmK/lkKbmmK/nnJ/miJjmlpcgICAgICAgIFxuICAgICAgICB0aGlzLmZpbmlzaF9yZXN1bHRfdmlld19saXN0ID0ge307ICAgICAgLy8g6IOc5Yip6Z2i5p2/5YiX6KGoXG4gICAgICAgIHRoaXMuZmluaXNoX2ZhaWxfdmlld19saXN0ID0ge307ICAgICAgICAvLyDlpLHotKXpnaLmnb/liJfooag7XG4gICAgICAgIHRoaXMuY2FjaGVfbGlzdCA9IFtdOyAgICAgICAgICAgICAgICAgICAvL+e8k+WtmOeVjOmdouWIl+ihqFxuICAgIH0sXG5cbiAgICAvLyDov5Tlm57lvZPliY3nmoRtb2RlbFxuICAgIGdldE1vZGVsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICAgIH0sXG5cbiAgICAvLyDlgYfmiJjmlpfmlbDmja5cbiAgICBnZXRIb29rTW9kZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9va19tb2RlbDtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgcmVnaXN0ZXJFdmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ19lbnRlcl9zY2VuZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdfZW50ZXJfc2NlbmUgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKE1haW51aUV2ZW50LkxPQURJTkdfRU5URVJfU0NFTkUsIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2FjaGVQYW5lbCgpO1xuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDms6jlhozljY/orq7mjqXlj5fkuovku7ZcbiAgICByZWdpc3RlclByb3RvY2FsczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAwMjcsIHRoaXMuc2NJbml0RmlnaHRTdGFydCk7ICAgICAgICAgICAgLy8g5oiY5paX55yf5q2j5Yid5aeL5YyW5pWw5o2uLOS7jjDliLAx55qE5oiY5paXXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDAwMiwgdGhpcy5zY1JvdW5kRmlnaHRTdGFydCk7ICAgICAgICAgICAvLyDlm57lkIjlvIDlp4vnmoTmkq3miqUgICAtLSDljIXlkKvlm57lkIjlvIDlp4vnmoRidWZmXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDAwNCwgdGhpcy5zY1JvdW5kRmlnaHRPbik7ICAgICAgICAgICAgICAvLyDlm57lkIjkuK3nmoTmkq3miqUgICAgIC0tIOWMheWQq+WbnuWQiOe7k+adn2J1ZmblkozmlYjmnpzmkq3miqXnmoRidWZmXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDAwNiwgdGhpcy5zY0ZpZ2h0RW5kKTsgICAgICAgICAgICAgICAgICAvLyDmiJjmlpfnu5PnrpfnmoQs5Lmf5bCx5piv55yf5piv5oiY5paX57uT5p2f55qEXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDAwOCwgdGhpcy5zY0ZpZ2h0RXhpdCk7ICAgICAgICAgICAgICAgICAvLyDpgIDlh7rmiJjmlpdcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMDA5LCB0aGlzLnNjU2tpcEZpcnN0VGVhbSk7ICAgICAgICAgICAgIC8vIOi3s+i/h+S4gOmYn1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAwMTMsIHRoaXMuc2NSZUJhdHRsZUZpZ2h0KTsgICAgICAgICAgICAgLy8g5oiY5paX6YeN6L+eLOWIh+i/m+aImOaWl+aIluiAheefree6v+mHjei/nueahOaImOaWl1xuXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDAxNCwgdGhpcy5zY0JhdHRsZVBrKTsgICAgICAgICAgICAgICAgICAvLyDmiJjmlpfliIfno4vor7fmsYJcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMDE1LCB0aGlzLnNjQmF0dGxlUGtSZSk7ICAgICAgICAgICAgICAgIC8vIOaImOaWl+WIh+eji+i/lOWbnlxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAwMTYsIHRoaXMuc2NCYXR0bGVQa1R3aWNlKTsgICAgICAgICAgICAgLy8g5oiY5paX5YiH56OL5ZCM5oSPXG5cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMDIwLCB0aGlzLnNjUm91bmROZXh0RmlnaHQpOyAgICAgICAgICAgIC8vIOS4i+S4gOazouaAqueJqVxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAwMjIsIHRoaXMuc2NGaWdodFNwZWVkKTsgICAgICAgICAgICAgICAgLy8g5pS55Y+Y5pKt5pS+6YCf5bqmXG5cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMDI5LCB0aGlzLnNjUmVjb3JkQmF0dGxlKTsgICAgICAgICAgICAgIC8vIOeci+W9leWDj1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAwMzMsIHRoaXMuaGFuZGxlMjAwMzMpOyAgICAgICAgICAgICAgICAgLy8g5YiH56OL57uT566XXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDAzNCwgdGhpcy5oYW5kbGUyMDAzNCk7ICAgICAgICAgICAgICAgICAvLyDliIfno4vop4bpopHliIbkuqtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMDM2LCB0aGlzLmhhbmRsZTIwMDM2KTsgICAgICAgICAgICAgICAgIC8vIOingueci+i3qOacjeW9leWDjyzmnIDlkI7lupTor6UyOeWNj+iuruWFqOmDqOi9rOWIsOi/meS4gOadoVxuXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDA2MCwgdGhpcy5oYW5kbGUyMDA2MCk7ICAgICAgICAgICAgICAgICAvLyDor7fmsYLmiJjmlpfnsbvlnovov5Tlm54s6L+Z5Liq5pe25YCZ5Y+q6ZyA6KaB5YGa5a+55bqUdWnmk43kvZznmoRcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMDYxLCB0aGlzLmhhbmRsZTIwMDYxKTsgICAgICAgICAgICAgICAgIC8vIOWBh+aImOaWl+WIneWni+WMlueahCzlpoLmnpzop6blj5Hov5nkuKrmlbDmja7kvYbmmK/lrp7pmYXkuIrmmK/lnKjnnJ/miJjmlpfkuK3nmoTml7blgJks5LiN5YGa5aSE55CGXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDA2MiwgdGhpcy5oYW5kbGUyMDA2Mik7ICAgICAgICAgICAgICAgICAvLyDot7Pov4fmiJjmlpdcbiAgICB9LFxuXG4gICAgLy8g5piv5ZCm5Zyo5oiY5paX5LitXG4gICAgaXNJbkZpZ2h0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmdldEZpZ2h0U3RhdHVzKClcbiAgICB9LFxuXG4gICAgLy8g5piv5ZCm5pyJ5oiY5paX5Zy65pmvXG4gICAgaGFkQmF0dGxlU2NlbmU6ZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuICh0aGlzLm1vZGVsLmdldEJhdHRsZVNjZW5lKCkgIT0gbnVsbClcbiAgICB9LFxuXG4gICAgLy8g6K6+572u5oiY5paX5Zy65pmv55qE54q25oCBXG4gICAgaGFuZGxlQmF0dGxlU2NlbmVTdGF0dXM6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5oYW5kbGVCYXR0bGVTY2VuZVN0YXR1cyhzdGF0dXMpXG4gICAgfSxcblxuICAgIC8vIOagueaNruaImOaWl+exu+Wei+ivt+axguaVsOaNrixy5aaC5p6c5piv5YiH5Ye65oiY5paX55qE6K+dIOWImSBjb21iYXRfdHlwZTpCYXR0bGVDb25zdC5GaWdodF9UeXBlLk5pbFxuICAgIHNlbmQyMDA2MDogZnVuY3Rpb24gKGNvbWJhdF90eXBlKSB7XG4gICAgICAgIGNjLmxvZyhcIuivt+axguWIh+WHuuaImOaWl1wiKTtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge1xuICAgICAgICAgICAgY29tYmF0X3R5cGU6IGNvbWJhdF90eXBlXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAwNjAsIHByb3RvY2FsKTtcbiAgICB9LFxuICAgIC8vICDov5Tlm57miJjmlpfnirbmgIEsXG4gICAgaGFuZGxlMjAwNjA6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIC8vIGRhdGEuY29tYmF0X3R5cGUsIGRhdGEudHlwZSgwOuS4jeWtmOWcqOaImOaWlyAxOuWtmOWcqOaImOaWlyAyOuWBh+aImOaWlylcbiAgICAgICAgaWYgKGRhdGEuY29tYmF0X3R5cGUgPT0gMCkgeyAgICAgLy8g6L+Z5Liq5bCx5piv5YiH5Ye65oiY5paXLFxuICAgICAgICAgICAgdGhpcy5jbGVhckJhdHRsZVNjZW5lKCk7XG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgfVxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEJhdHRsZUV2ZW50LkNPTUJBVF9UWVBFX0JBQ0ssIGRhdGEuY29tYmF0X3R5cGUsIGRhdGEudHlwZSk7XG4gICAgfSxcblxuICAgIC8vIOaImOaWl+e7k+eul+eahCzkuZ/mnInlj6/og73kuI3pnIDopoHlh7rnu5PnrpfpnaLmnb9cbiAgICBzY0ZpZ2h0RW5kOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBjYy5sb2coXCLmiJjmlpfnu5PnrpfnmoQs5Lmf5pyJ5Y+v6IO95LiN6ZyA6KaB5Ye657uT566X6Z2i5p2/LS0tXCIsZGF0YSlcbiAgICAgICAgdmFyIGlzX3JlcGxheSA9IGZhbHNlO1xuICAgICAgICBpZiAoZGF0YS5jb21iYXRfdHlwZSA+IDEwMDApe1xuICAgICAgICAgICAgZGF0YS5jb21iYXRfdHlwZSA9IGRhdGEuY29tYmF0X3R5cGUgLSAxMDAwO1xuICAgICAgICAgICAgaXNfcmVwbGF5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZihkYXRhLmNvbWJhdF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuRW5kbGVzcyl7XG4gICAgICAgICAgICB2YXIgUHJvbXB0Q29udHJvbGxlciA9IHJlcXVpcmUoXCJwcm9tcHRfY29udHJvbGxlclwiKVxuICAgICAgICAgICAgdmFyIFByb21wdFR5cGVDb25zdCA9IHJlcXVpcmUoXCJwcm9tcHRfdHlwZV9jb25zdFwiKVxuICAgICAgICAgICAgUHJvbXB0Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkucmVtb3ZlUHJvbXB0RGF0YUJ5VHB5ZShQcm9tcHRUeXBlQ29uc3QuRW5kbGVzc190cmFpbClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vZGVsLnNob3dXaW4oZGF0YSwgaXNfcmVwbGF5KTtcbiAgICB9LFxuXG4gICAgLy8g5riF55CG5oiY5paX5Zy65pmvLOWcqOmAgOWHuuaImOaWl+aIluiAheaImOaWl+e7k+eul+S5i+WQjizlpoLmnpzkuKrmiJjmlpfmmK/liafmg4Xlia/mnKznmoTmiJjmlpcs6YKj5LmI5bCx5LiN6ZyA6KaB5riF55CG5o6J5Zy65pmvLOiAjOaYr+ebtOaOpeWIh+aNouWIsOWBh+aImOaWl1xuICAgIGNsZWFyQmF0dGxlU2NlbmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5jbGVhckJhdHRsZVNjZW5lKCk7XG4gICAgfSxcblxuICAgIC8vIOivt+axguWIh+WHuuaImOaWl1xuICAgIHJlcXVlc3RDdXRPdXRCYXR0bGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEJhdHRsZUNvbnN0ID0gcmVxdWlyZShcImJhdHRsZV9jb25zdFwiKTtcbiAgICAgICAgdGhpcy5zZW5kMjAwNjAoQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5OaWwpO1xuICAgIH0sXG5cbiAgICAvLyDmiJjmlpfliJ3lp4vljJbmlbDmja5cbiAgICBzY0luaXRGaWdodFN0YXJ0OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgQmF0dGxlQ29uc3QgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnN0XCIpO1xuICAgICAgICBpZiAoQmF0dGxlQ29uc3QuY2FuRG9CYXR0bGUoZGF0YS5jb21iYXRfdHlwZSkpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwudXBkYXRlQ3VyQmF0dGxlRGF0YShkYXRhLCB0cnVlKTtcblxuICAgICAgICAgICAgdGhpcy5wcmVwYXJlTG9hZGVyQmF0dGxlU2NlbmUoZGF0YS5jb21iYXRfdHlwZSwgMik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5YiH6L+b5oiY5paXXG4gICAgc2NSZUJhdHRsZUZpZ2h0OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgQmF0dGxlQ29uc3QgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnN0XCIpO1xuICAgICAgICBpZiAoQmF0dGxlQ29uc3QuY2FuRG9CYXR0bGUoZGF0YS5jb21iYXRfdHlwZSkpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwudXBkYXRlQ3VyQmF0dGxlRGF0YShkYXRhLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVMb2FkZXJCYXR0bGVTY2VuZShkYXRhLmNvbWJhdF90eXBlLCAyKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDlm57lkIjlvIDlp4vnmoTmkq3miqVcbiAgICBzY1JvdW5kRmlnaHRTdGFydDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgTG9nLmluZm8oXCLlm57lkIjlvIDlp4vmkq3miqVcIik7XG4gICAgICAgIC8vIGNjLmxvZyhkYXRhKTtcbiAgICAgICAgdGhpcy5tb2RlbC5wbGF5Um91bmRTdGFydChkYXRhKTtcbiAgICB9LFxuXG4gICAgLy8g5Zue5ZCI5Lit55qE5pKt5oqlXG4gICAgc2NSb3VuZEZpZ2h0T246IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIExvZy5pbmZvKFwi5Zue5ZCI5pKt5oqlXCIpO1xuICAgICAgICAvLyBjYy5sb2coZGF0YSk7XG4gICAgICAgIHRoaXMubW9kZWwucGxheVJvdW5kSW4oZGF0YSk7XG4gICAgfSxcblxuICAgIC8vIOWbnuWQiOaSreaKpee7k+adn+mAmuefpeacjeWKoeerryzlr7nlupTnmoTmmK8yMDAwNFxuICAgIGNzU2tpbGxQbGF5RW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiMjAwMDQg5pKt5oql5a6M5oiQXCIpO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDAwNSwge30pO1xuICAgIH0sXG5cbiAgICAvLyDlm57lkIjlvIDlp4vmkq3miqXlrozmiJDkuYvlkI4s6YCa55+l5pyN5Yqh56uvLOWvueW6lOeahOaYrzIwMDAyXG4gICAgY3NSb3VuZEZpZ2h0RW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiMjAwMDIg5pKt5oql5a6M5oiQXCIpO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDAxOSwge30pO1xuICAgIH0sXG5cbiAgICAvLyDmiJjmlpfliJ3lp4vljJblrozmiJDkuYvlkI5cbiAgICBjc1JlYWR5RmlnaHRTdGFydDogZnVuY3Rpb24gKCkge1xuICAgICAgICBMb2cuaW5mbyhcIuaImOaWl+WIneWni+WMluWujOaIkCzpgJrnn6XmnI3liqHnq6/lj6/ku6XlvIDlp4vmkq3miqXkuoZcIik7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwMDAxLCB7fSk7XG4gICAgfSxcblxuICAgIC8vIOivt+axgui3s+i/h+aImOaWl1xuICAgIHNlbmQyMDA2MjpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDA2Miwge30pO1xuICAgIH0sXG5cbiAgICBoYW5kbGUyMDA2MjpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgfSxcblxuICAgIC8vIOWBh+aImOaWl+aVsOaNrlxuICAgIGhhbmRsZTIwMDYxOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBjYy5sb2coXCLlgYfmiJjmlpfmlbDmja5cIik7XG4gICAgICAgIGNjLmxvZyhkYXRhKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuaG9va19tb2RlbC51cGRhdGVVbnJlYWxCYXR0bGVEYXRhKGRhdGEpO1xuICAgICAgICB0aGlzLnByZXBhcmVMb2FkZXJCYXR0bGVTY2VuZShkYXRhLmNvbWJhdF90eXBlLCAxKTtcbiAgICB9LFxuXG4gICAgY3NSZWNvcmRCYXR0bGU6IGZ1bmN0aW9uIChyZXBsYXlfaWQpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnJlcGxheV9pZCA9IHJlcGxheV9pZDtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAwMjksIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgLy8g5oiY5paX5b2V5YOPLOi/memHjOWPquaYr+iusOW9leaImOaWl+W9leWDj+eKtuaAgVxuICAgIHNjUmVjb3JkQmF0dGxlOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgaWYgKGRhdGEuY29kZSA9PSAxKSB7XG4gICAgICAgICAgICAvLyBDaGF0Q29udHJvbGxlcjpnZXRJbnN0YW5jZSgpOmNsb3NlQ2hhdFVzZUFjdGlvbigpXG4gICAgICAgICAgICB0aGlzLnNldFdhdGNoUmVwbGF5U3RhdHVzKHRydWUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWIh+eji+e7k+aenOi/lOWbnlxuICAgIGhhbmRsZTIwMDMzOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBpZiAoZGF0YS5jb21iYXRfdHlwZSA9PSBudWxsKXtcbiAgICAgICAgICAgIGRhdGEuY29tYmF0X3R5cGUgPSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLlBLO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLnNob3dfcGFuZWxfdHlwZSA9PSBudWxsKXtcbiAgICAgICAgICAgIGRhdGEuc2hvd19wYW5lbF90eXBlID0gMVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kZWwuc2hvd1dpbihkYXRhKTtcbiAgICB9LFxuXG4gICAgLy8g5YiG5Lqr5YiH56OL6KeG6aKRXG4gICAgb24yMDAzNDpmdW5jdGlvbihyZXBsYXlfaWQsY2hhbm5lbCx0YXJnZXRfbmFtZSxzaGFyZV90eXBlKXtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge31cbiAgICAgICAgcHJvdG9jYWwucmVwbGF5X2lkID0gcmVwbGF5X2lkXG4gICAgICAgIHByb3RvY2FsLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgICAgIHByb3RvY2FsLnRhcmdldF9uYW1lID0gdGFyZ2V0X25hbWVcbiAgICAgICAgcHJvdG9jYWwuc2hhcmVfdHlwZSA9IHNoYXJlX3R5cGVcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAwMzQscHJvdG9jYWwpXG4gICAgfSxcblxuICAgIGhhbmRsZTIwMDM0OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5YiH5o2i6L+b5oiY5paX55qE5ZSv5LiA5o6l5Y+jXG4gICAgICogQHBhcmFtIHsqfSBjb21iYXRfdHlwZSBcbiAgICAgKiBAcGFyYW0geyp9IGluX2ZpZ2h0X3R5cGUgMDrmsqHmnInmiJjmlpcgMTrlgYfmiJjmlpcgMjrnnJ/miJjmlpdcbiAgICAgKi9cbiAgICBwcmVwYXJlTG9hZGVyQmF0dGxlU2NlbmU6IGZ1bmN0aW9uIChjb21iYXRfdHlwZSwgaW5fZmlnaHRfdHlwZSkge1xuICAgICAgICB0aGlzLm1vZGVsLmNyZWF0ZUJhdHRsZVNjZW5lKGluX2ZpZ2h0X3R5cGUsIGNvbWJhdF90eXBlKTtcbiAgICAgICAgLy8g6L+b5YWl5oiY5paXLOaKm+WHuuS6i+S7tlxuICAgICAgICBpZiAoaW5fZmlnaHRfdHlwZSA9PSAyKSB7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEV2ZW50SWQuRU5URVJfRklHSFQsIGNvbWJhdF90eXBlLCBpbl9maWdodF90eXBlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDkuIvkuIDms6LmgKrniannmoTlhaXlj6NcbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgXG4gICAgICovXG4gICAgc2NSb3VuZE5leHRGaWdodDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgaWYgKGRhdGEpe1xuICAgICAgICAgICAgdGhpcy5tb2RlbC51cERhdGVOZXh0TW9uKGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaImOaWl+avj+S4gOW4p+abtOaWsFxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgIHRoaXMubW9kZWwubWFwTW92ZXNjaGVkdWxlVXBkYXRlKCk7XG4gICAgfSxcblxuICAgIC8vIOWIh+aNouaImOaWl+iDjOaZr+enu+WKqOeKtuaAgSzkuLvopoHmmK/nlKjkuo7nnJ/lgYfliafmg4XmiJjmlpfliIfmjaJcbiAgICBjaGFuZ2VNb3ZlTWFwU3RhdHVzOiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMubW9kZWwuY2hhbmdlTW92ZU1hcFN0YXR1cygpXG4gICAgfSxcblxuICAgIC8vIOafpeeci+W9leWDj+i/lOWbnlxuICAgIHNlbmRlcl8yMDAzNjogZnVuY3Rpb24gKHJlcGxheV9pZCwgcmVwbGF5X3Nydl9pZCkge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7XG4gICAgICAgICAgICByZXBsYXlfaWQ6IHJlcGxheV9pZCxcbiAgICAgICAgICAgIHJlcGxheV9zcnZfaWQ6IHJlcGxheV9zcnZfaWQsXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAwMzYsIHByb3RvY2FsKTtcbiAgICB9LFxuICAgIGhhbmRsZTIwMDM2OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5jb2RlID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0V2F0Y2hSZXBsYXlTdGF0dXModHJ1ZSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDpgIDlh7rmiJjmlpdcbiAgICBjc0ZpZ2h0RXhpdDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDAwOCwge30pO1xuICAgIH0sXG4gICAgc2NGaWdodEV4aXQ6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgIH0sXG5cbiAgICAvLyDot7Pov4fkuIDpmJ9cbiAgICBjc1NraXBGaXJzdFRlYW06ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAwMDksIHt9KTtcbiAgICB9LFxuXG4gICAgc2NTa2lwRmlyc3RUZWFtOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICB9LFxuXG4gICAgLy8g5piv5ZCm5piv6KeC5oiY54q25oCBXG4gICAgZ2V0V2F0Y2hSZXBsYXlTdGF0dXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNfd2F0Y2hfcmVwbGF5O1xuICAgIH0sXG5cbiAgICAvLyDorr7nva7op4LmiJjnirbmgIFcbiAgICBzZXRXYXRjaFJlcGxheVN0YXR1czogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICB0aGlzLmlzX3dhdGNoX3JlcGxheSA9IHN0YXR1cztcbiAgICB9LFxuXG4gICAgLy8g5piv5ZCm5piv6KeC5oiY5oiW6ICF5YiH56OL54q25oCBXG4gICAgZ2V0SXNDbGlja1N0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29tYmF0X3R5cGUgPSB0aGlzLm1vZGVsLmdldENvbWJhdFR5cGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0V2F0Y2hSZXBsYXlTdGF0dXMoKSB8fCAoY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5QSykgfHwgKGNvbWJhdF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuSGVyb1Rlc3RXYXIpO1xuICAgIH0sXG5cbiAgICBzZXRVbmxvY2tDaGFwdGVyU3RhdHVzOmZ1bmN0aW9uKHN0YXR1cyl7XG4gICAgICAgIHRoaXMuaXNfdW5sb2NrX2NoYXB0ZXIgPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIGdldFVubG9ja0NoYXB0ZXJTdGF0dXM6ZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNfdW5sb2NrX2NoYXB0ZXI7XG4gICAgfSxcblxuICAgIC8v6L+b5YWl5Li75Zy65pmv5ZCO5pi+56S657yT5a2Y55qE55WM6Z2iXG4gICAgc2hvd0NhY2hlUGFuZWw6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYodGhpcy5jYWNoZV9saXN0ID09IG51bGwgfHwgdGhpcy5jYWNoZV9saXN0Lmxlbmd0aDw9MClyZXR1cm47XG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmNhY2hlX2xpc3Qpe1xuICAgICAgICAgICAgaWYodGhpcy5jYWNoZV9saXN0W2ldLmZ1bmN0aW9uKXtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlX2xpc3RbaV0uZnVuY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlX2xpc3QgPSBbXTtcbiAgICB9LFxuXG4gICAgLy8g5oiY5paX57uT566X55WM6Z2iXG4gICAgb3BlbkZpbmlzaFZpZXc6IGZ1bmN0aW9uIChzdGF0dXMsIGNvbWJhdF90eXBlLCBkYXRhKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYoSVNfTE9BRElORyA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlX2xpc3QucHVzaCh7ZnVuY3Rpb246ZnVuY3Rpb24oc3RhdHVzLCBjb21iYXRfdHlwZSwgZGF0YSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbkZpbmlzaFZpZXcoc3RhdHVzLCBjb21iYXRfdHlwZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsc3RhdHVzLCBjb21iYXRfdHlwZSwgZGF0YSl9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5maW5pc2hfcmVzdWx0X3ZpZXdfbGlzdFtjb21iYXRfdHlwZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaF9yZXN1bHRfdmlld19saXN0W2NvbWJhdF90eXBlXS5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoX3Jlc3VsdF92aWV3X2xpc3RbY29tYmF0X3R5cGVdID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzX3VubG9ja19jaGFwdGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbWJhdF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuU3RhclRvd2VyKSB7Ly/or5XngrzloZRcbiAgICAgICAgICAgICAgICAgICAgdmFyIFN0YXJ0b3dlckNvbnRyb2xsZXIgPSByZXF1aXJlKFwic3RhcnRvd2VyX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIFN0YXJ0b3dlckNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuUmVzdWx0V2luZG93KHRydWUsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5BcmVuYSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgQXJlbmFDb250cm9sbGVyID0gcmVxdWlyZShcImFyZW5hX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIEFyZW5hQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5Mb29wUmVzdWx0V2luZG93KHRydWUsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5EYXJtYSAmJiBkYXRhICYmIGRhdGEucmVzdWx0ID09IDEpIHsgLy/liafmg4Xlia/mnKzmiJjmlpfog5zliKnml7ZcbiAgICAgICAgICAgICAgICAgICAgLy/orr7nva7kuI3opoHpqazkuIrmmL7npLrljYfnuqdcbiAgICAgICAgICAgICAgICAgICAgTGV2dXBncmFkZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS53YWl0Rm9yT3BlbkxldlVwZ3JhZGUodHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgdmFyIEJhdHRsZU12cFdpbmRvdyA9IHJlcXVpcmUoXCJiYXR0bGVfbXZwX3dpbmRvd1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5pc2hfcmVzdWx0X3ZpZXdfbGlzdFtjb21iYXRfdHlwZV0gPSBuZXcgQmF0dGxlTXZwV2luZG93KGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaF9yZXN1bHRfdmlld19saXN0W2NvbWJhdF90eXBlXS5vcGVuKCk7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYgKGNvbWJhdF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuR3VpbGREdW4gKSB7ICAgIC8v5YWs5Lya5Ymv5pysXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoXCJndWlsZGJvc3NfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5HdWlsZGJvc3NSZXN1bHRXaW5kb3codHJ1ZSxkYXRhKTtcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZiAoY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5QSyl7ICAgICAgICAvLyBQS1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaF9yZXN1bHRfdmlld19saXN0W2NvbWJhdF90eXBlXSA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiYmF0dGxlX3BrX3Jlc3VsdF93aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoX3Jlc3VsdF92aWV3X2xpc3RbY29tYmF0X3R5cGVdLm9wZW4oZGF0YSlcbiAgICAgICAgICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5maW5pc2hfcmVzdWx0X3ZpZXdfbGlzdFtjb21iYXRfdHlwZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnJlc3VsdCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/orr7nva7kuI3opoHpqazkuIrmmL7npLrljYfnuqdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZXZ1cGdyYWRlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLndhaXRGb3JPcGVuTGV2VXBncmFkZSh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBCYXR0bGVSZXN1bHRWaWV3ID0gcmVxdWlyZShcImJhdHRsZV9yZXN1bHRfd2luZG93XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoX3Jlc3VsdF92aWV3X2xpc3RbY29tYmF0X3R5cGVdID0gbmV3IEJhdHRsZVJlc3VsdFZpZXcoZGF0YS5yZXN1bHQsIGNvbWJhdF90eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaF9yZXN1bHRfdmlld19saXN0W2NvbWJhdF90eXBlXS5vcGVuKHtkYXRhOmRhdGEsZmlnaHRfdHlwZTogY29tYmF0X3R5cGV9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MubG9nKFwi5omT5byA5aSx6LSl55WM6Z2iXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuRmFpbEZpbmlzaFZpZXcodHJ1ZSwgY29tYmF0X3R5cGUsIGRhdGEucmVzdWx0LCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmlzaF9yZXN1bHRfdmlld19saXN0W2NvbWJhdF90eXBlXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoX3Jlc3VsdF92aWV3X2xpc3RbY29tYmF0X3R5cGVdLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maW5pc2hfcmVzdWx0X3ZpZXdfbGlzdFtjb21iYXRfdHlwZV0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgZ2V0RmluaXNoVmlldzogZnVuY3Rpb24oY29tYmF0X3R5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoX3Jlc3VsdF92aWV3X2xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaF9yZXN1bHRfdmlld19saXN0W2NvbWJhdF90eXBlXVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5omT5byA5oiY5paX5Lyk5a6z57uf6K6h55WM6Z2iXG4gICAgb3BlbkJhdHRsZUhhcm1JbmZvVmlldzogZnVuY3Rpb24gKHN0YXR1cywgZGF0YSkge1xuICAgICAgICBpZiAoc3RhdHVzID09IHRydWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhcm1faW5mb192aWV3ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhcm1faW5mb192aWV3ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJiYXR0bGVfaGFybV9pbmZvX3dpbmRvd1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaGFybV9pbmZvX3ZpZXcub3BlbihkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhcm1faW5mb192aWV3KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXJtX2luZm9fdmlldy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFybV9pbmZvX3ZpZXcgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5aSx6LSl57uT566X55WM6Z2iXG4gICAgb3BlbkZhaWxGaW5pc2hWaWV3OiBmdW5jdGlvbiAoc3RhdHVzLCBjb21iYXRfdHlwZSwgcmVzdWx0LCBkYXRhKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy/lpoLmnpzmmK/lnKjliafmg4XkuK0s5YiZ5LiN6ZyA6KaB5by55Ye66L+Z5LqbXG4gICAgICAgICAgICAvLyBpZihyZXF1aXJlKFwiZ3VpZGVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmlzSW5HdWlkZSgpKXJldHVyblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzX3VubG9ja19jaGFwdGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmZpbmlzaF9mYWlsX3ZpZXdfbGlzdFtjb21iYXRfdHlwZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy/orr7nva7kuI3opoHpqazkuIrmmL7npLrljYfnuqdcbiAgICAgICAgICAgICAgICAgICAgTGV2dXBncmFkZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS53YWl0Rm9yT3BlbkxldlVwZ3JhZGUodHJ1ZSlcblxuICAgICAgICAgICAgICAgICAgICB2YXIgQmF0dGxlRmFpbFZpZXcgPSByZXF1aXJlKFwiYmF0dGxlX2ZhaWxfd2luZG93XCIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZmluaXNoX3ZpZXcgPSBuZXcgQmF0dGxlRmFpbFZpZXcoY29tYmF0X3R5cGUsIHJlc3VsdCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hfdmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoX3ZpZXcub3BlbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoX2ZhaWxfdmlld19saXN0W2NvbWJhdF90eXBlXSA9IGZpbmlzaF92aWV3O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jaGVja0lzSW5EcmFtYVVJRmlnaHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhdHRsZV9jb250cm9sbGVyLnNlbmQyMDA2MChCYXR0bGVDb25zdC5GaWdodF9UeXBlLkRhcm1hKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5maW5pc2hfZmFpbF92aWV3X2xpc3RbY29tYmF0X3R5cGVdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maW5pc2hfZmFpbF92aWV3X2xpc3RbY29tYmF0X3R5cGVdLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maW5pc2hfZmFpbF92aWV3X2xpc3RbY29tYmF0X3R5cGVdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+iOt+WPluaYr+WQpuebuOWQjOeahOaImOaWl+exu+Wei1xuICAgIGdldElzU2FtZUJhdHRsZVR5cGU6IGZ1bmN0aW9uIChjb21iYXRfdHlwZSkge1xuICAgICAgICByZXR1cm4gY29tYmF0X3R5cGUgPT0gdGhpcy5tb2RlbC5nZXRDb21iYXRUeXBlKCk7XG4gICAgfSxcbiAgICAvLyAtLSDmiZPlvIDpmLXokKXor6bnu4bpnaLmnb9cbiAgICBvcGVuQmF0dGxlQ2FtcFZpZXcoIHN0YXR1cywgZm9ybV9pZCApe1xuICAgICAgICBpZihzdGF0dXMgPT0gdHJ1ZSApe1xuICAgICAgICAgICAgaWYoIXRoaXMuYmF0dGxlX2NhbXBfdmlldyl7XG4gICAgICAgICAgICAgICAgbGV0IEJhdHRsZUNhbXBWaWV3ID0gcmVxdWlyZShcImJhdHRsZV9jYW1wX3dpbmRvd1wiKVxuICAgICAgICAgICAgICAgIHRoaXMuYmF0dGxlX2NhbXBfdmlldyA9IG5ldyBCYXR0bGVDYW1wVmlldygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLmJhdHRsZV9jYW1wX3ZpZXcuaXNPcGVuKCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIHRoaXMuYmF0dGxlX2NhbXBfdmlldy5vcGVuKGZvcm1faWQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYodGhpcy5iYXR0bGVfY2FtcF92aWV3KXtcbiAgICAgICAgICAgICAgICB0aGlzLmJhdHRsZV9jYW1wX3ZpZXcuY2xvc2UoKVxuICAgICAgICAgICAgICAgIHRoaXMuYmF0dGxlX2NhbXBfdmlldyA9IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDorrDlvZXmmK/lkKbkuLrlgYfmiJjmlpfnmoTmiJjmlpdcbiAgICBzZXRJc05vcm1hQmF0dGxlOiBmdW5jdGlvbihzdGF0dXMpIHtcbiAgICAgICAgIHRoaXMuaXNfbm9ybWFsX2JhdHRsZSA9IHN0YXR1czsgICAgICAgIFxuICAgIH0sXG5cbiAgICAvLyDmmK/lkKbmmK/lgYfmiJjmlpcuLi4uXG4gICAgZ2V0SXNOb3JhbWFsQmF0dGxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNfbm9ybWFsX2JhdHRsZTsgXG4gICAgfSxcblxuICAgIC8vIOaUueWPmOaImOaWl+mAn+W6plxuICAgIGNzRmlnaHRTcGVlZDpmdW5jdGlvbihzcGVlZCl7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9XG4gICAgICAgIHByb3RvY2FsLnNwZWVkID0gc3BlZWQ7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwMDIyLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIHNjRmlnaHRTcGVlZDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgfSxcbiBcbiAgICBnZXRDdHJsQmF0dGxlU2NlbmU6IGZ1bmN0aW9uKGNhbF9iYWNrKSB7XG4gICAgICAgIHZhciBiYXR0bGVfc2NlbiA9IHRoaXMubW9kZWwuZ2V0QmF0dGxlU2NlbmUoKTtcbiAgICAgICAgY2FsX2JhY2soYmF0dGxlX3NjZW4pO1xuICAgIH0sXG5cbiAgICBnZXREcmFtYUZpZ2h0VUk6IGZ1bmN0aW9uKGZpbmlzaF9jYikge1xuICAgICAgICBpZiAoZmluaXNoX2NiKSB7XG4gICAgICAgICAgICBmaW5pc2hfY2IodGhpcy5tb2RlbC5nZXREcmFtYUZpZ2h0VUkoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5nZXREcmFtYUZpZ2h0VUkoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS3liIfno4vor7fmsYJcbiAgICBjc0JhdHRsZVBrOiBmdW5jdGlvbiAodGFyZ2V0X2lkLCB0YXJnZXRfc3J2X2lkLCBpc19wcm92aW5jZSkge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwudGFyZ2V0X2lkID0gdGFyZ2V0X2lkO1xuICAgICAgICBwcm90b2NhbC50YXJnZXRfc3J2X2lkID0gdGFyZ2V0X3Nydl9pZDtcbiAgICAgICAgcHJvdG9jYWwuaXNfcHJvdmluY2UgPSBpc19wcm92aW5jZTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAwMTQsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgc2NCYXR0bGVQazpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIHJlcXVpcmUoXCJjaGF0X2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5jbG9zZUNoYXRQYW5lbChmYWxzZSk7XG4gICAgICAgIHJlcXVpcmUoXCJmcmllbmRfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5GcmllbmRDaGVja1BhbmVsKGZhbHNlKTtcbiAgICB9LFxuXG4gICAgLy8g6KKr5YiH56OL5a+56LGhLOWcqDE4NjAw5pS25Yiw5o+Q56S65LmL5ZCOLOiwg+eUqOi/meS4quaOpeWPo+WQjOaEj+aIluiAheWPlua2iOaOiVxuICAgIGNvbmZpcm1CYXR0bGVQazpmdW5jdGlvbihwcm9tcHRWbyl7XG5cbiAgICB9LFxuXG4gICAgLy8g6KKr5YiH56OL5a+56LGhLOWQjOaEj+WIh+eji+aIluiAheaLkue7neWIh+eji1xuICAgIGNzQmF0dGxlUGtSZTpmdW5jdGlvbihib29sLGRhdGEpe1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwudGFyZ2V0X2lkID0gZGF0YS50YXJnZXRfaWQ7XG4gICAgICAgIHByb3RvY2FsLnRhcmdldF9zcnZfaWQgPSBkYXRhLnRhcmdldF9zcnZfaWQ7XG4gICAgICAgIHByb3RvY2FsLmlzX2FncmVlID0gYm9vbCA/IDEgOiAwO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDAxNSwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBzY0JhdHRsZVBrUmU6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgIH0sXG5cbiAgICAvLyDnm67moIfov5nnu5/kuIDkuoboh6rlt7Hlj5HotbfnmoTor7fmsYIu6L+Z5pe25YCZ6Ieq5bex55qE5LqM5qyh56Gu6K6kXG4gICAgc2NCYXR0bGVQa1R3aWNlOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBpZihkYXRhKXtcbiAgICAgICAgICAgIGlmKCAhIHRoaXMuaXNJbkZpZ2h0KCkpe1xuICAgICAgICAgICAgICAgIHZhciBhY2NlcHRfZnVuID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jc0JhdHRsZVBrVHdpY2VDb25maXJtKHRydWUsIHt0YXJnZXRfc3J2X2lkOiBkYXRhLnRhcmdldF9zcnZfaWQsIHRhcmdldF9pZDogZGF0YS50YXJnZXRfaWR9KTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlZnVzZV9mdW4gPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNzQmF0dGxlUGtUd2ljZUNvbmZpcm0oZmFsc2UsIHt0YXJnZXRfc3J2X2lkOiBkYXRhLnRhcmdldF9zcnZfaWQsIHRhcmdldF9pZDogZGF0YS50YXJnZXRfaWR9KTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyk7XG4gICAgICAgICAgICAgICAgdmFyIGRlc2MgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLnjqnlrrY8Y29sb3I9IzB4MjQ5MDE1PiVzPC9jb2xvcj7lkIzmhI/kuobkvaDnmoTliIfno4vor7fmsYIs54K55Ye74oCd56uL5Y2z5YiH56OL4oCc56uL5Y2z6L+b5YWl5YiH56OL5oiY5paX77yfXCIpLCBkYXRhLnRhcmdldF9uYW1lIHx8IFwiXCIpO1xuICAgICAgICAgICAgICAgIHJlcXVpcmUoXCJjb21tb25hbGVydFwiKS5zaG93KGRlc2MsIFV0aWxzLlRJMThOKFwi56uL5Y2z5YiH56OLXCIpLCBhY2NlcHRfZnVuLCBVdGlscy5USTE4TihcIuWPlua2iFwiKSwgcmVmdXNlX2Z1bik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5Y+R6LW36ICF5ZCM5oSP6L+b5oiY5paX5oiW6ICF5ouS57udXG4gICAgY3NCYXR0bGVQa1R3aWNlQ29uZmlybTogZnVuY3Rpb24gKGJvb2wsIGRhdGEpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnRhcmdldF9pZCA9IGRhdGEudGFyZ2V0X2lkO1xuICAgICAgICBwcm90b2NhbC50YXJnZXRfc3J2X2lkID0gZGF0YS50YXJnZXRfc3J2X2lkO1xuICAgICAgICBwcm90b2NhbC5pc19hZ3JlZSA9IGJvb2wgPyAxIDogMDs7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwMDE2LCBwcm90b2NhbCk7XG4gICAgfSxcbiAgICAvLyAg5omT5byAYnVmZuaAu+iniOeVjOmdolxuICAgIG9wZW5CYXR0bGVCdWZmSW5mb1ZpZXcoc3RhdHVzLCBsZWZ0X25hbWUsIHJpZ2h0X25hbWUpe1xuICAgICAgICBpZihzdGF0dXMgPT0gdHJ1ZSl7XG4gICAgICAgICAgICBpZih0aGlzLmJ1ZmZfaW5mb192aWV3ID09IG51bGwpe1xuICAgICAgICAgICAgICAgIHZhciBCYXR0bGVCdWZmSW5mb1ZpZXcgPSByZXF1aXJlKFwiYmF0dGxlX2J1ZmZfaW5mb193aW5kb3dcIilcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfaW5mb192aWV3ID0gbmV3IEJhdHRsZUJ1ZmZJbmZvVmlldygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLmJ1ZmZfaW5mb192aWV3LmlzT3BlbigpID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfaW5mb192aWV3Lm9wZW4oe2xlZnRfbmFtZTpsZWZ0X25hbWUscmlnaHRfbmFtZTpyaWdodF9uYW1lfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZih0aGlzLmJ1ZmZfaW5mb192aWV3KXtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfaW5mb192aWV3LmNsb3NlKClcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfaW5mb192aWV3ID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyAtIOabtOaWsGJ1ZmbliJfooajnlYzpnaLmlbDmja5cbiAgICB1cGRhdGVCYXR0bGVCdWZmTGlzdFZpZXcoIGRhdGEsIGdyb3VwLCBwYXJ0bmVyX2JpZCApe1xuICAgICAgICBpZih0aGlzLmJ1ZmZfbGlzdF92aWV3ICYmIHRoaXMuYnVmZl9saXN0X3ZpZXcuY2hlY2tJc0Nob3NlZEJ1ZmZMaXN0KGdyb3VwLCBwYXJ0bmVyX2JpZCkpe1xuICAgICAgICAgICAgdGhpcy5idWZmX2xpc3Rfdmlldy5zZXREYXRhKGRhdGEpXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vIC0tIOaJk+W8gGJ1ZmbliJfooajnlYzpnaJcbiAgICBvcGVuQmF0dGxlQnVmZkxpc3RWaWV3KCBzdGF0dXMsIGRhdGEsIGdyb3VwLCBwYXJ0bmVyX2JpZCApe1xuICAgICAgICBpZihzdGF0dXMgPT0gdHJ1ZSl7XG4gICAgICAgICAgICBpZih0aGlzLmJ1ZmZfbGlzdF92aWV3ID09IG51bGwpe1xuICAgICAgICAgICAgICAgIHZhciBCYXR0bGVCdWZmTGlzdFZpZXcgPSByZXF1aXJlKFwiYmF0dGxlX2J1ZmZfbGlzdF93aW5kb3dcIilcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfbGlzdF92aWV3ID0gbmV3IEJhdHRsZUJ1ZmZMaXN0VmlldygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLmJ1ZmZfbGlzdF92aWV3LmlzT3BlbigpID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfbGlzdF92aWV3Lm9wZW4oe2RhdGE6ZGF0YSwgZ3JvdXA6Z3JvdXAsIHBhcnRuZXJfYmlkOnBhcnRuZXJfYmlkfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZih0aGlzLmJ1ZmZfbGlzdF92aWV3KXtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfbGlzdF92aWV3LmNsb3NlKClcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfbGlzdF92aWV3ID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmF0dGxlQ29udHJvbGxlcjtcbiJdfQ==