(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/friend/friend_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, '4c2f604RNdJoLI/CXIn0Qv+', 'friend_controller'); // Scripts/mod/friend/friend_controller.js "use strict"; // -------------------------------------------------------------------- // @author: zhangyusong@syg.com(必填, 创建模块的人员) // @description: // 好友协议和逻辑控制层 //
Create: 2018-12-24 16:41:34 // -------------------------------------------------------------------- var FriendEvent = require("friend_event"); var RoleController = require("role_controller"); var FriendVo = require("friend_vo"); var FriendEvent = require("friend_event"); var FriendCheckInfoWindow = require("friend_check_info_winodw"); var FriendConst = require("friend_const"); var ChatController = require("chat_controller"); var FriendController = cc.Class({ "extends": BaseController, ctor: function ctor() {}, // 初始化配置数据 initConfig: function initConfig() { var FriendModel = require("friend_model"); this.model = new FriendModel(); this.model.initConfig(); }, // 返回当前的model getModel: function getModel() { return this.model; }, // 注册监听事件 registerEvents: function registerEvents() { if (this.login_success == null) { this.login_success = gcore.GlobalEvent.bind(EventId.EVT_ROLE_CREATE_SUCCESS, function () { this.friendList(); if (this.time_ticket) { gcore.Timer.del(this.time_ticket); this.time_ticket = null; } this.time_ticket = gcore.Timer.set(function () { this.updateFriendTishi(); }.bind(this), 60, 1); }, this); } if (!this.request_event) { this.request_event = gcore.GlobalEvent.bind(FriendEvent.REQUEST_LIST, function () { this.friendList(); this.getBlackList(); }, this); } if (!this.add_event) { this.add_event = gcore.GlobalEvent.bind(FriendEvent.FRIEND_ADD, function (srv_id, rid) { this.addOther(srv_id, rid); }, this); } if (!this.query_event) { this.query_event = gcore.GlobalEvent.bind(FriendEvent.FRIEND_QUERY_FIND, function (value) { this.queryFind(value); }, this); } if (!this.recommend_event) { this.recommend_event = gcore.GlobalEvent.bind(FriendEvent.FRIEND_RECOMMEND, function () { this.recommend(); }, this); } if (!this.infom_event) { //好友邮件界面 this.infom_event = gcore.GlobalEvent.bind(FriendEvent.OPEN_FRIEND_INFOM, function (data, count, begin_pos, group_type) { this.openInfom(data, count, begin_pos, group_type); }, this); } //增加私聊数据 if (!this.private_msg) { this.private_msg = gcore.GlobalEvent.bind(EventId.CHAT_UPDATE_SELF, function (chatVo) { this.addPrivateMsg(chatVo); }, this); } if (!this.update_chat_and_apply_event) { this.update_chat_and_apply_event = gcore.GlobalEvent.bind(FriendEvent.UPDATE_COUNT, function () { this.updateFriendTishi(); }, this); } }, // 注册协议接受事件 registerProtocals: function registerProtocals() { // this.RegisterProtocal(1110, this.on1110); this.RegisterProtocal(13300, this.friendListHandler); //好友列表 this.RegisterProtocal(13301, this.onlineHandler); //好友在线状态 this.RegisterProtocal(13302, this.friendStateHandler); //单个好友一些状态改变 this.RegisterProtocal(13303, this.addOtherHandler); //请求加好友;A向服务端请求想加B为好友;会返回消息告诉A这次请求是否成功 this.RegisterProtocal(13304, this.addMeHandler); //被加好友,服务端告诉客户端;A想加B为好友 this.RegisterProtocal(13305, this.acceptHandler); //B告诉服务端,加或不加A为好友;服务端会告诉B这次结果怎么样 this.RegisterProtocal(13306, this.batchAddHandler); //批量加好友 this.RegisterProtocal(13307, this.delOtherHandler); //主动删除好友;需要客户端把好友删除 this.RegisterProtocal(13308, this.delMeHandler); //被动删除好友 this.RegisterProtocal(13310, this.addToListHandler); //添加好友到列表(添加好友成功后服务端推送) this.RegisterProtocal(13311, this.applyListHandler); //好友申请列表 this.RegisterProtocal(13312, this.refuseApplyListHandler); //全部拒绝申请列表 this.RegisterProtocal(13314, this.queryFindHandler); //查询好友信息 this.RegisterProtocal(13315, this.queryFriendTeamHandler); //查询好友是否有队伍 this.RegisterProtocal(13316, this.strengthHandler); //好友体力赠送领取 this.RegisterProtocal(13317, this.batchStrengthHandler); //好友体力一键赠送领取 this.RegisterProtocal(13320, this.recommendHandler); //推荐好友 this.RegisterProtocal(10388, this.getRolesOnline); // 查询其它玩家是否在线 //黑名单 this.RegisterProtocal(13330, this.handle13330); //获取黑名单列表信息 this.RegisterProtocal(13331, this.handle13331); //获取增加更新黑名单列表信息 this.RegisterProtocal(13332, this.handle13332); //拉黑 this.RegisterProtocal(13333, this.handle13333); //移除黑名 this.RegisterProtocal(13334, this.handle13334); //全部同意好友申请 }, isFriend: function isFriend(srv_id, rid) { if (this.model == null) return null;else return this.model.isFriend(srv_id, rid); }, updateFriendTishi: function updateFriendTishi() { var award_num = this.getModel().getAwardNum() || 0; var appl_num = this.getModel().getApplyNum() || 0; var list = [{ bid: 1, num: award_num }, { bid: 2, num: appl_num }]; var MainuiConst = require("mainui_const"); require("mainui_controller").getInstance().setFunctionTipsStatus(MainuiConst.icon.friend, list); }, //获取好友列表 friendList: function friendList() { this.SendProtocal(13300, {}); }, friendListHandler: function friendListHandler(data) { if (this.model == null) { this.model = new FriendModel(); } this.model.setFriendPresentCount(data.present_count); this.model.setFriendDrawCount(data.draw_count); this.model.setFriendDrawTotalCount(data.draw_all); for (var k in data.friend_list) { var v = data.friend_list[k]; var friend = null; if (this.model.isFriend(v.srv_id, v.rid)) { friend = this.model.getVo(v.srv_id, v.rid); friend.setData(v); } else { friend = new FriendVo(); friend.setData(v); this.model.add(friend); } } gcore.GlobalEvent.fire(FriendEvent.FRIEND_LIST, this.model.getArray()); this.apply(); this.updateFriendTishi(); }, //好友是否上线 onlineHandler: function onlineHandler(data) { var old_index = this.model.getIndex(data.srv_id, data.rid); var vo1 = this.model.updateVo(data.srv_id, data.rid, "is_online", data.is_online); var vo2 = this.model.updateVo(data.srv_id, data.rid, "login_out_time", data.login_out_time); var new_index = this.model.getIndex(data.srv_id, data.rid); if (old_index != null && new_index != null && vo2 != null) { if (vo1 != null) { if (data.is_online == 1) { gcore.GlobalEvent.fire(FriendEvent.FRIEND_UPDATE_ITEM, vo1, 0); message(cc.js.formatStr(Utils.TI18N("您的好友%s上线了"), vo1.name)); } } } }, //单个好友一些状态改变 friendStateHandler: function friendStateHandler(data) { if (data.srv_id != null && data.rid != null) { this.model.updateSingleFriendData(data.srv_id, data.rid, data); gcore.GlobalEvent.fire(FriendEvent.FRIEND_LIST, this.model.getArray()); } this.updateFriendTishi(); }, //好友申请列表 apply: function apply() { this.SendProtocal(13311, {}); }, applyListHandler: function applyListHandler(data) { //亲密度设置为-1(表示陌生人) //Debug.info(data) for (var k in data.friend_req_list) { data.friend_req_list[k].intimacy = -1; } this.model.setApplyList(data.friend_req_list); gcore.GlobalEvent.fire(FriendEvent.FRIEND_LIST, this.model.getApplyList()); gcore.GlobalEvent.fire(FriendEvent.FRIEND_APPLY); this.updateFriendTishi(); }, send_refuseApplyList: function send_refuseApplyList() { this.SendProtocal(13312, {}); }, refuseApplyListHandler: function refuseApplyListHandler(data) { if (data.code == 1) { gcore.GlobalEvent.fire(FriendEvent.UPDATE_APPLY_LIST); this.model.apply = []; this.updateFriendTishi(); } }, //全部同意好友申请 send_acceptApplyList: function send_acceptApplyList(list) { var protocal = {}; protocal.role_ids = list; this.SendProtocal(13334, protocal); }, handle13334: function handle13334(data) { gcore.GlobalEvent.fire(FriendEvent.UPDATE_APPLY_LIST); this.model.apply = []; this.updateFriendTishi(); gcore.GlobalEvent.fire(FriendEvent.Update_Red_Point); }, //好友申请个数 appCount: function appCount() { if (this.model) { return this.model.apply.length; } return 0; }, //推荐好友 recommend: function recommend() { this.SendProtocal(13320, {}); }, recommendHandler: function recommendHandler(data) { var list = []; var srv_id = RoleController.getInstance().getRoleVo().srv_id; var rid = RoleController.getInstance().getRoleVo().rid; for (var k in data.recommend_list) { var v = data.recommend_list[k]; if (!this.isFriend(v.srv_id, v.rid) && !(srv_id == v.srv_id && rid == v.rid)) { v.intimacy = -1; //标记为陌生人 list.push(v); } } gcore.GlobalEvent.fire(FriendEvent.UD_COMMEND_LIST, list); }, //模糊查询 queryFind: function queryFind(name) { var protocal = {}; protocal.name = name; this.SendProtocal(13314, protocal); }, queryFindHandler: function queryFindHandler(data) { var t = []; if (Utils.next(data.role_list)) { var srv_id = RoleController.getInstance().getRoleVo().srv_id; var rid = RoleController.getInstance().getRoleVo().rid; var count = 0; for (var k in data.role_list) { var v = data.role_list[k]; if (!this.isFriend(v.srv_id, v.rid) && !(srv_id == v.srv_id && rid == v.rid)) { v.intimacy = -1; //标记为陌生人 t.push(v); count = count + 1; } if (count > 25) break; } t.sort(function (a, b) { return a.lev > b.lev; }); if (!t || Utils.next(t) == null) { message("找不到玩家"); } } else { message("找不到玩家"); } gcore.GlobalEvent.fire(FriendEvent.FRIEND_QUERY_RESULT, t); }, queryFriendIsHasTeam: function queryFriendIsHasTeam(rid, srv_id) { var protocal = {}; protocal.rid = rid; protocal.srv_id = srv_id; this.SendProtocal(13315, protocal); }, queryFriendTeamHandler: function queryFriendTeamHandler(data) { if (data.code == 1) { //有队伍 this.openFrinedInfo(1); } else if (data.code == 0) { //没队伍 this.openFrinedInfo(0); } }, //好友体力领取 赠送 code: 0 赠送 ,1领取 sender_13316: function sender_13316(code, rid, srv_id) { var protocal = {}; protocal.rid = rid; protocal.srv_id = srv_id; protocal.code = code; this.SendProtocal(13316, protocal); }, strengthHandler: function strengthHandler(data) { if (data.code == 1) { this.model.setFriendPresentCount(data.present_count); this.model.setFriendDrawCount(data.draw_count); //更新数据 this.model.updateVo(data.srv_id, data.rid, "is_draw", data.is_draw); this.model.updateVo(data.srv_id, data.rid, "is_present", data.is_present); gcore.GlobalEvent.fire(FriendEvent.STRENGTH_UPDATE, { list: { data: data } }); gcore.Timer.set(function () { gcore.GlobalEvent.fire(FriendEvent.Update_Red_Point); }, 60, 1); } message(data.msg); }, //好友体力领取 赠送 code: 0 赠送 ,1领取 sender_13317: function sender_13317(code, list) { var protocal = {}; protocal.list = list; protocal.code = code; this.SendProtocal(13317, protocal); }, batchStrengthHandler: function batchStrengthHandler(data) { if (data.code == 1) { gcore.GlobalEvent.fire(FriendEvent.STRENGTH_UPDATE, data); gcore.GlobalEvent.fire(FriendEvent.Update_Red_Point); } message(data.msg); }, //请求加好友;A向服务端请求想加B为好友;会返回消息告诉A这次请求是否成功 addOther: function addOther(srv_id, rid) { var protocal = {}; protocal.srv_id = srv_id; protocal.rid = rid; this.SendProtocal(13303, protocal); }, addOtherHandler: function addOtherHandler(data) { message(data.msg); if (data.code == 1) { this.closeInfo(); } }, //被加好友,服务端告诉客户端;A想加B为好友 addMeHandler: function addMeHandler(data) { if (this.model.isBlack(data.rid, data.srv_id)) return; this.apply(); }, //B告诉服务端,加或不加A为好友;服务端会告诉B这次结果怎么样 accept: function accept(srv_id, rid, agreed) { var protocal = {}; protocal.srv_id = srv_id; protocal.rid = rid; protocal.agreed = agreed; this.SendProtocal(13305, protocal); }, //删除客户端缓存的好友申请数据 acceptHandler: function acceptHandler(data) { if (data != null) { for (var k in this.model.apply) { var v = this.model.apply[k]; if (v != null && v.srv_id == data.srv_id && v.rid == data.rid) { this.model.apply.splice(k, 1); } } gcore.GlobalEvent.fire(FriendEvent.UPDATE_COUNT, 2, this.model.apply.length); //单个数据增加 this.updateFriendTishi(); if (data.code == 1) { ChatController.getInstance().getModel().saveTalkTime(data.srv_id, data.rid); message(data.msg); } else { message(data.msg); } } }, //添加好友到列表(添加好友成功后服务端推送) addToListHandler: function addToListHandler(data) { if (this.model == null) return; var friend = new FriendVo(); friend.setData(data); this.model.add(friend); if (this.model.apply != null) { for (var m in this.model.apply) { var n = this.model.apply[m]; if (n && data.srv_id == n.srv_id && data.rid == n.rid) { this.model.apply.splice(m, 1); } } } gcore.Timer.set(function () { gcore.GlobalEvent.fire(FriendEvent.UPDATE_APPLY); }, 1000, 1); message(cc.js.formatStr(Utils.TI18N("成功添加%s为好友"), data.name)); }, //批量加好友 batchAdd: function batchAdd(role_ids) { var protocal = {}; protocal.role_ids = role_ids; this.SendProtocal(13306, protocal); }, batchAddHandler: function batchAddHandler(data) { message(data.msg); }, //主动删除好友;需要客户端把好友删除 delOther: function delOther(srv_id, rid) { var confirm_handler = function () { var protocal = {}; protocal.srv_id = srv_id; protocal.rid = rid; this.SendProtocal(13307, protocal); }.bind(this); var CommonAlert = require("commonalert"); CommonAlert.show(Utils.TI18N("好友删除后,将清空聊天记录,是否删除好友?"), Utils.TI18N("删除"), confirm_handler, Utils.TI18N("取消")); // confirm_handler(); }, //删除数据 //删除视图 delOtherHandler: function delOtherHandler(data) { if (data.code == 1) { var old_data = this.model.getVo(data.srv_id, data.rid); if (old_data != null) { this.model.del(data.srv_id, data.rid); var role_vo = RoleController.getInstance().getRoleVo(); ChatController.getInstance().getModel().deltePrivateTarget(data); gcore.GlobalEvent.fire(FriendEvent.FRIEND_DELETE, old_data, this.group_type); } this.closeInfom(); } message(data.msg); }, //被动删除好友(被人删) delMeHandler: function delMeHandler(data) { var old_data = this.model.getVo(data.srv_id, data.rid); if (old_data != null) { this.model.del(data.srv_id, data.rid); var role_vo = RoleController.getInstance().getRoleVo(); ChatController.getInstance().getModel().deltePrivateTarget(data); gcore.GlobalEvent.fire(FriendEvent.UPDATE_GROUP_COUNT); } }, deleteConnecter: function deleteConnecter(vo) { var confirm_handler = function () { ChatController.getInstance().getModel().clearTalkTime(vo.srv_id, vo.rid); // gcore.GlobalEvent.fire(ContactEvent.CLOSE_TALK_INFO) this.closeInfom(); gcore.GlobalEvent.fire(FriendEvent.FRIEND_DELETE, vo, FriendConst.FriendGroupType.communicate); }.bind(this); var CommonAlert = require("commonalert"); CommonAlert.show("是否从列表中删除该联系人?", "删除", confirm_handler, "取消"); }, deleteBlackConnecter: function deleteBlackConnecter(srv_id, rid) { ChatController.getInstance().getModel().clearTalkTime(srv_id, rid); // gcore.GlobalEvent.fire(ContactEvent.CLOSE_TALK_INFO) this.closeInfom(); gcore.GlobalEvent.fire(FriendEvent.FRIEND_DELETE, { srv_id: srv_id, rid: rid }, FriendConst.FriendGroupType.friend); }, sender_10388: function sender_10388(list) { var protocal = {}; protocal.id_list = list; this.SendProtocal(10388, protocal); }, //获取常用联系人上线情况 getRolesOnline: function getRolesOnline(data) { if (data != null) { gcore.GlobalEvent.fire(FriendEvent.UPDATE_ONLINE, data.online_roles); } }, //竖版好友主界面 openFriendWindow: function openFriendWindow(bool, index) { if (bool == true) { if (!this.friend_window) { var FriendWindow = require("friend_window"); this.friend_window = new FriendWindow(); } this.friend_window.open(index); } else { if (this.friend_window) { this.friend_window.close(); this.friend_window = null; } } }, //竖版好友推荐查找界面 openFriendFindWindow: function openFriendFindWindow(bool) { if (bool == true) { if (!this.friend_find_window) { var FriendAddWindow = require("friend_add_window"); this.friend_find_window = new FriendAddWindow(); } this.friend_find_window.open(); } else { if (this.friend_find_window) { this.friend_find_window.close(); this.friend_find_window = null; } } }, //关闭好友信息界面 closeInfo: function closeInfo() {// if (!this.info && this.info.isOpen()) { // this.info.close(); // this.info = null; // } }, openFrinedInfo: function openFrinedInfo(code_type) { this.closeRecommendPanel(); var show_type = null; if (this.group_type == 1) { //我的好友 show_type = [11, 12, 15]; } else if (this.group_type == 3) { show_type = [2, 13, 15]; //黑名单 } }, //打开好友信息查看界面 data有srv_id,rid就行 openFriendCheckPanel: function openFriendCheckPanel(status, data) { if (status == true) { if (!this.friend_check_view) { this.friend_check_view = new FriendCheckInfoWindow(); } this.friend_check_view.open(data); } else { if (this.friend_check_view) { this.friend_check_view.close(); this.friend_check_view = null; } } }, //打开好友个人荣誉界面 openFriendGloryWindow: function openFriendGloryWindow(status, data) { if (status == true) { if (!this.friend_glory_view) { var FriendGloryWindow = require("friend_glory_window"); this.friend_glory_view = new FriendGloryWindow(); } this.friend_glory_view.open(data); } else { if (this.friend_glory_view) { this.friend_glory_view.close(); this.friend_glory_view = null; } } }, openInfom: function openInfom(data, count, begin_pos, group_type) { this.begin_pos = begin_pos; this.group_type = group_type || 1; this.select_data = data; this.openFrinedInfo(); }, //关闭好友邮件面板 closeInfom: function closeInfom() {// if (this.infom && this.infom.isOpen()) { // this.infom.close(); // this.infom = null; // } }, closeRecommendPanel: function closeRecommendPanel() {// if (this.commend_ui && this.commend_ui.isOpen()) { // this.commend_ui.close(); // this.commend_ui = null; // } }, //私聊未读数据显示 addPrivateMsg: function addPrivateMsg(chat_vo) {}, //删除聊天数量 delPriCount: function delPriCount(key) { this.pri_list[key] = null; gcore.GlobalEvent.fire(FriendEvent.UPDATE_COUNT, 1, key, 0); //单个数据增加 }, //获取好友联系人聊天的总数目 getLpriCount: function getLpriCount() { var count = 0; for (var i in this.pri_list) { var value = this.model.isFriend2(v); if (value == true) { count = count + v; } } return count; }, allPriCount: function allPriCount() { var count = 0; for (var i in this.pri_list) { count = count + v; } return count; }, singlePriCount: function singlePriCount(key) { if (this.pri_list[key]) { return this.pri_list[key]; } return 0; }, __delete: function __delete() { if (this.model != null) { this.model.DeleteMe(); this.model = null; } this.closeRecommendPanel(); }, //--------------黑名单部分 handle13330: function handle13330(data) { this.model.initBlackList(data.black_list); }, //获取黑名单列表 getBlackList: function getBlackList() { this.SendProtocal(13330, {}); }, //拉黑和移除黑名单推送 handle13331: function handle13331(data) { if (data.type == 1) { //加黑名单 this.model.initBlackList(data.black_list); gcore.GlobalEvent.fire(FriendEvent.UPDATE_GROUP_COUNT); } else if (data.type == 2) {//移除黑名单 } }, //拉黑 addToBlackList: function addToBlackList(rid, srv_id) { var protocal = {}; protocal.rid = rid; protocal.srv_id = srv_id; this.SendProtocal(13332, protocal); }, //拉黑是否成功返回 handle13332: function handle13332(data) { message(data.msg); if (data.code == 1) { var old_data = this.model.getVo(data.srv_id, data.rid); //拉黑后在好友列表里面删掉该好友 if (old_data) { this.model.del(data.srv_id, data.rid); //删除最近联系人 // var role_vo = RoleController.getInstance().getRoleVo(); // ChatController:getInstance():getModel():deleteCache(role_vo.srv_id,role_vo.rid,data.srv_id,data.rid) gcore.GlobalEvent.fire(FriendEvent.FRIEND_DELETE, old_data, this.group_type); } } }, //删除黑名单 deleteBlackList: function deleteBlackList(rid, srv_id) { var protocal = {}; protocal.rid = rid; protocal.srv_id = srv_id; this.SendProtocal(13333, protocal); }, //删除黑名单返回 handle13333: function handle13333(data) { if (data.code == 1) { this.model.removeBlack(data.rid, data.srv_id); gcore.GlobalEvent.fire(FriendEvent.FRIEND_DELETE, data, this.group_type || FriendConst.FriendGroupType.black_list); //类型2是黑名单分组 } } }); module.exports = FriendController; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxmcmllbmRcXGZyaWVuZF9jb250cm9sbGVyLmpzIl0sIm5hbWVzIjpbIkZyaWVuZEV2ZW50IiwicmVxdWlyZSIsIlJvbGVDb250cm9sbGVyIiwiRnJpZW5kVm8iLCJGcmllbmRDaGVja0luZm9XaW5kb3ciLCJGcmllbmRDb25zdCIsIkNoYXRDb250cm9sbGVyIiwiRnJpZW5kQ29udHJvbGxlciIsImNjIiwiQ2xhc3MiLCJCYXNlQ29udHJvbGxlciIsImN0b3IiLCJpbml0Q29uZmlnIiwiRnJpZW5kTW9kZWwiLCJtb2RlbCIsImdldE1vZGVsIiwicmVnaXN0ZXJFdmVudHMiLCJsb2dpbl9zdWNjZXNzIiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImJpbmQiLCJFdmVudElkIiwiRVZUX1JPTEVfQ1JFQVRFX1NVQ0NFU1MiLCJmcmllbmRMaXN0IiwidGltZV90aWNrZXQiLCJUaW1lciIsImRlbCIsInNldCIsInVwZGF0ZUZyaWVuZFRpc2hpIiwicmVxdWVzdF9ldmVudCIsIlJFUVVFU1RfTElTVCIsImdldEJsYWNrTGlzdCIsImFkZF9ldmVudCIsIkZSSUVORF9BREQiLCJzcnZfaWQiLCJyaWQiLCJhZGRPdGhlciIsInF1ZXJ5X2V2ZW50IiwiRlJJRU5EX1FVRVJZX0ZJTkQiLCJ2YWx1ZSIsInF1ZXJ5RmluZCIsInJlY29tbWVuZF9ldmVudCIsIkZSSUVORF9SRUNPTU1FTkQiLCJyZWNvbW1lbmQiLCJpbmZvbV9ldmVudCIsIk9QRU5fRlJJRU5EX0lORk9NIiwiZGF0YSIsImNvdW50IiwiYmVnaW5fcG9zIiwiZ3JvdXBfdHlwZSIsIm9wZW5JbmZvbSIsInByaXZhdGVfbXNnIiwiQ0hBVF9VUERBVEVfU0VMRiIsImNoYXRWbyIsImFkZFByaXZhdGVNc2ciLCJ1cGRhdGVfY2hhdF9hbmRfYXBwbHlfZXZlbnQiLCJVUERBVEVfQ09VTlQiLCJyZWdpc3RlclByb3RvY2FscyIsIlJlZ2lzdGVyUHJvdG9jYWwiLCJmcmllbmRMaXN0SGFuZGxlciIsIm9ubGluZUhhbmRsZXIiLCJmcmllbmRTdGF0ZUhhbmRsZXIiLCJhZGRPdGhlckhhbmRsZXIiLCJhZGRNZUhhbmRsZXIiLCJhY2NlcHRIYW5kbGVyIiwiYmF0Y2hBZGRIYW5kbGVyIiwiZGVsT3RoZXJIYW5kbGVyIiwiZGVsTWVIYW5kbGVyIiwiYWRkVG9MaXN0SGFuZGxlciIsImFwcGx5TGlzdEhhbmRsZXIiLCJyZWZ1c2VBcHBseUxpc3RIYW5kbGVyIiwicXVlcnlGaW5kSGFuZGxlciIsInF1ZXJ5RnJpZW5kVGVhbUhhbmRsZXIiLCJzdHJlbmd0aEhhbmRsZXIiLCJiYXRjaFN0cmVuZ3RoSGFuZGxlciIsInJlY29tbWVuZEhhbmRsZXIiLCJnZXRSb2xlc09ubGluZSIsImhhbmRsZTEzMzMwIiwiaGFuZGxlMTMzMzEiLCJoYW5kbGUxMzMzMiIsImhhbmRsZTEzMzMzIiwiaGFuZGxlMTMzMzQiLCJpc0ZyaWVuZCIsImF3YXJkX251bSIsImdldEF3YXJkTnVtIiwiYXBwbF9udW0iLCJnZXRBcHBseU51bSIsImxpc3QiLCJiaWQiLCJudW0iLCJNYWludWlDb25zdCIsImdldEluc3RhbmNlIiwic2V0RnVuY3Rpb25UaXBzU3RhdHVzIiwiaWNvbiIsImZyaWVuZCIsIlNlbmRQcm90b2NhbCIsInNldEZyaWVuZFByZXNlbnRDb3VudCIsInByZXNlbnRfY291bnQiLCJzZXRGcmllbmREcmF3Q291bnQiLCJkcmF3X2NvdW50Iiwic2V0RnJpZW5kRHJhd1RvdGFsQ291bnQiLCJkcmF3X2FsbCIsImsiLCJmcmllbmRfbGlzdCIsInYiLCJnZXRWbyIsInNldERhdGEiLCJhZGQiLCJmaXJlIiwiRlJJRU5EX0xJU1QiLCJnZXRBcnJheSIsImFwcGx5Iiwib2xkX2luZGV4IiwiZ2V0SW5kZXgiLCJ2bzEiLCJ1cGRhdGVWbyIsImlzX29ubGluZSIsInZvMiIsImxvZ2luX291dF90aW1lIiwibmV3X2luZGV4IiwiRlJJRU5EX1VQREFURV9JVEVNIiwibWVzc2FnZSIsImpzIiwiZm9ybWF0U3RyIiwiVXRpbHMiLCJUSTE4TiIsIm5hbWUiLCJ1cGRhdGVTaW5nbGVGcmllbmREYXRhIiwiZnJpZW5kX3JlcV9saXN0IiwiaW50aW1hY3kiLCJzZXRBcHBseUxpc3QiLCJnZXRBcHBseUxpc3QiLCJGUklFTkRfQVBQTFkiLCJzZW5kX3JlZnVzZUFwcGx5TGlzdCIsImNvZGUiLCJVUERBVEVfQVBQTFlfTElTVCIsInNlbmRfYWNjZXB0QXBwbHlMaXN0IiwicHJvdG9jYWwiLCJyb2xlX2lkcyIsIlVwZGF0ZV9SZWRfUG9pbnQiLCJhcHBDb3VudCIsImxlbmd0aCIsImdldFJvbGVWbyIsInJlY29tbWVuZF9saXN0IiwicHVzaCIsIlVEX0NPTU1FTkRfTElTVCIsInQiLCJuZXh0Iiwicm9sZV9saXN0Iiwic29ydCIsImEiLCJiIiwibGV2IiwiRlJJRU5EX1FVRVJZX1JFU1VMVCIsInF1ZXJ5RnJpZW5kSXNIYXNUZWFtIiwib3BlbkZyaW5lZEluZm8iLCJzZW5kZXJfMTMzMTYiLCJpc19kcmF3IiwiaXNfcHJlc2VudCIsIlNUUkVOR1RIX1VQREFURSIsIm1zZyIsInNlbmRlcl8xMzMxNyIsImNsb3NlSW5mbyIsImlzQmxhY2siLCJhY2NlcHQiLCJhZ3JlZWQiLCJzcGxpY2UiLCJzYXZlVGFsa1RpbWUiLCJtIiwibiIsIlVQREFURV9BUFBMWSIsImJhdGNoQWRkIiwiZGVsT3RoZXIiLCJjb25maXJtX2hhbmRsZXIiLCJDb21tb25BbGVydCIsInNob3ciLCJvbGRfZGF0YSIsInJvbGVfdm8iLCJkZWx0ZVByaXZhdGVUYXJnZXQiLCJGUklFTkRfREVMRVRFIiwiY2xvc2VJbmZvbSIsIlVQREFURV9HUk9VUF9DT1VOVCIsImRlbGV0ZUNvbm5lY3RlciIsInZvIiwiY2xlYXJUYWxrVGltZSIsIkZyaWVuZEdyb3VwVHlwZSIsImNvbW11bmljYXRlIiwiZGVsZXRlQmxhY2tDb25uZWN0ZXIiLCJzZW5kZXJfMTAzODgiLCJpZF9saXN0IiwiVVBEQVRFX09OTElORSIsIm9ubGluZV9yb2xlcyIsIm9wZW5GcmllbmRXaW5kb3ciLCJib29sIiwiaW5kZXgiLCJmcmllbmRfd2luZG93IiwiRnJpZW5kV2luZG93Iiwib3BlbiIsImNsb3NlIiwib3BlbkZyaWVuZEZpbmRXaW5kb3ciLCJmcmllbmRfZmluZF93aW5kb3ciLCJGcmllbmRBZGRXaW5kb3ciLCJjb2RlX3R5cGUiLCJjbG9zZVJlY29tbWVuZFBhbmVsIiwic2hvd190eXBlIiwib3BlbkZyaWVuZENoZWNrUGFuZWwiLCJzdGF0dXMiLCJmcmllbmRfY2hlY2tfdmlldyIsIm9wZW5GcmllbmRHbG9yeVdpbmRvdyIsImZyaWVuZF9nbG9yeV92aWV3IiwiRnJpZW5kR2xvcnlXaW5kb3ciLCJzZWxlY3RfZGF0YSIsImNoYXRfdm8iLCJkZWxQcmlDb3VudCIsImtleSIsInByaV9saXN0IiwiZ2V0THByaUNvdW50IiwiaSIsImlzRnJpZW5kMiIsImFsbFByaUNvdW50Iiwic2luZ2xlUHJpQ291bnQiLCJfX2RlbGV0ZSIsIkRlbGV0ZU1lIiwiaW5pdEJsYWNrTGlzdCIsImJsYWNrX2xpc3QiLCJ0eXBlIiwiYWRkVG9CbGFja0xpc3QiLCJkZWxldGVCbGFja0xpc3QiLCJyZW1vdmVCbGFjayIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsV0FBVyxHQUFHQyxPQUFPLENBQUMsY0FBRCxDQUF6Qjs7QUFDQSxJQUFJQyxjQUFjLEdBQUdELE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJRSxRQUFRLEdBQUdGLE9BQU8sQ0FBQyxXQUFELENBQXRCOztBQUNBLElBQUlELFdBQVcsR0FBR0MsT0FBTyxDQUFDLGNBQUQsQ0FBekI7O0FBQ0EsSUFBSUcscUJBQXFCLEdBQUdILE9BQU8sQ0FBQywwQkFBRCxDQUFuQzs7QUFDQSxJQUFJSSxXQUFXLEdBQUdKLE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUNBLElBQUlLLGNBQWMsR0FBR0wsT0FBTyxDQUFDLGlCQUFELENBQTVCOztB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L04sZ0JBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogemhhbmd5dXNvbmdAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICAg5aW95Y+L5Y2P6K6u5ZKM6YC76L6R5o6n5Yi25bGCXG4vLyA8YnIvPkNyZWF0ZTogMjAxOC0xMi0yNCAxNjo0MTozNFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBGcmllbmRFdmVudCA9IHJlcXVpcmUoXCJmcmllbmRfZXZlbnRcIik7XG52YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xudmFyIEZyaWVuZFZvID0gcmVxdWlyZShcImZyaWVuZF92b1wiKTtcbnZhciBGcmllbmRFdmVudCA9IHJlcXVpcmUoXCJmcmllbmRfZXZlbnRcIik7XG52YXIgRnJpZW5kQ2hlY2tJbmZvV2luZG93ID0gcmVxdWlyZShcImZyaWVuZF9jaGVja19pbmZvX3dpbm9kd1wiKTtcbnZhciBGcmllbmRDb25zdCA9IHJlcXVpcmUoXCJmcmllbmRfY29uc3RcIik7XG52YXIgQ2hhdENvbnRyb2xsZXIgPSByZXF1aXJlKFwiY2hhdF9jb250cm9sbGVyXCIpO1xuXG52YXIgRnJpZW5kQ29udHJvbGxlciA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlQ29udHJvbGxlcixcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMlumFjee9ruaVsOaNrlxuICAgIGluaXRDb25maWc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEZyaWVuZE1vZGVsID0gcmVxdWlyZShcImZyaWVuZF9tb2RlbFwiKTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IG5ldyBGcmllbmRNb2RlbCgpO1xuICAgICAgICB0aGlzLm1vZGVsLmluaXRDb25maWcoKTtcbiAgICB9LFxuXG4gICAgLy8g6L+U5Zue5b2T5YmN55qEbW9kZWxcbiAgICBnZXRNb2RlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbDtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgcmVnaXN0ZXJFdmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubG9naW5fc3VjY2VzcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2luX3N1Y2Nlc3MgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuRVZUX1JPTEVfQ1JFQVRFX1NVQ0NFU1MsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZyaWVuZExpc3QoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lX3RpY2tldCkge1xuICAgICAgICAgICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy50aW1lX3RpY2tldCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGltZV90aWNrZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVfdGlja2V0ID0gZ2NvcmUuVGltZXIuc2V0KChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRnJpZW5kVGlzaGkoKTtcbiAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpLCA2MCwgMSlcbiAgICAgICAgICAgIH0sIHRoaXMpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnJlcXVlc3RfZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdF9ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoRnJpZW5kRXZlbnQuUkVRVUVTVF9MSVNULCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcmllbmRMaXN0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRCbGFja0xpc3QoKTtcbiAgICAgICAgICAgIH0sIHRoaXMpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmFkZF9ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5hZGRfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEZyaWVuZEV2ZW50LkZSSUVORF9BREQsIGZ1bmN0aW9uIChzcnZfaWQsIHJpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkT3RoZXIoc3J2X2lkLCByaWQpO1xuICAgICAgICAgICAgfSwgdGhpcylcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucXVlcnlfZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEZyaWVuZEV2ZW50LkZSSUVORF9RVUVSWV9GSU5ELCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5RmluZCh2YWx1ZSk7XG4gICAgICAgICAgICB9LCB0aGlzKVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5yZWNvbW1lbmRfZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb21tZW5kX2V2ZW50ID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChGcmllbmRFdmVudC5GUklFTkRfUkVDT01NRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvbW1lbmQoKTtcbiAgICAgICAgICAgIH0sIHRoaXMpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmluZm9tX2V2ZW50KSB7ICAvL+WlveWPi+mCruS7tueVjOmdolxuICAgICAgICAgICAgdGhpcy5pbmZvbV9ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoRnJpZW5kRXZlbnQuT1BFTl9GUklFTkRfSU5GT00sIGZ1bmN0aW9uIChkYXRhLCBjb3VudCwgYmVnaW5fcG9zLCBncm91cF90eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuSW5mb20oZGF0YSwgY291bnQsIGJlZ2luX3BvcywgZ3JvdXBfdHlwZSlcbiAgICAgICAgICAgIH0sIHRoaXMpXG4gICAgICAgIH1cbiAgICAgICAgLy/lop7liqDnp4HogYrmlbDmja5cbiAgICAgICAgaWYgKCF0aGlzLnByaXZhdGVfbXNnKSB7XG4gICAgICAgICAgICB0aGlzLnByaXZhdGVfbXNnID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChFdmVudElkLkNIQVRfVVBEQVRFX1NFTEYsIGZ1bmN0aW9uIChjaGF0Vm8pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFByaXZhdGVNc2coY2hhdFZvKTtcbiAgICAgICAgICAgIH0sIHRoaXMpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnVwZGF0ZV9jaGF0X2FuZF9hcHBseV9ldmVudCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVfY2hhdF9hbmRfYXBwbHlfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEZyaWVuZEV2ZW50LlVQREFURV9DT1VOVCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRnJpZW5kVGlzaGkoKTtcbiAgICAgICAgICAgIH0sIHRoaXMpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5Y2P6K6u5o6l5Y+X5LqL5Lu2XG4gICAgcmVnaXN0ZXJQcm90b2NhbHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMTAsIHRoaXMub24xMTEwKTtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEzMzAwLCB0aGlzLmZyaWVuZExpc3RIYW5kbGVyKTsgICAgICAgLy/lpb3lj4vliJfooahcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEzMzAxLCB0aGlzLm9ubGluZUhhbmRsZXIpOyAgICAgICAgICAgLy/lpb3lj4vlnKjnur/nirbmgIFcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEzMzAyLCB0aGlzLmZyaWVuZFN0YXRlSGFuZGxlcik7ICAgICAgLy/ljZXkuKrlpb3lj4vkuIDkupvnirbmgIHmlLnlj5hcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEzMzAzLCB0aGlzLmFkZE90aGVySGFuZGxlcik7ICAgICAgICAgLy/or7fmsYLliqDlpb3lj4s7QeWQkeacjeWKoeerr+ivt+axguaDs+WKoELkuLrlpb3lj4s75Lya6L+U5Zue5raI5oGv5ZGK6K+JQei/measoeivt+axguaYr+WQpuaIkOWKn1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTMzMDQsIHRoaXMuYWRkTWVIYW5kbGVyKTsgICAgICAgICAgICAvL+iiq+WKoOWlveWPi++8jOacjeWKoeerr+WRiuivieWuouaIt+errztB5oOz5YqgQuS4uuWlveWPi1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTMzMDUsIHRoaXMuYWNjZXB0SGFuZGxlcik7ICAgICAgICAgICAvL0LlkYror4nmnI3liqHnq6/vvIzliqDmiJbkuI3liqBB5Li65aW95Y+LO+acjeWKoeerr+S8muWRiuiviULov5nmrKHnu5PmnpzmgI7kuYjmoLdcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEzMzA2LCB0aGlzLmJhdGNoQWRkSGFuZGxlcik7ICAgICAgICAgLy/mibnph4/liqDlpb3lj4tcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEzMzA3LCB0aGlzLmRlbE90aGVySGFuZGxlcik7ICAgICAgICAgLy/kuLvliqjliKDpmaTlpb3lj4s76ZyA6KaB5a6i5oi356uv5oqK5aW95Y+L5Yig6ZmkXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzMwOCwgdGhpcy5kZWxNZUhhbmRsZXIpOyAgICAgICAgICAgIC8v6KKr5Yqo5Yig6Zmk5aW95Y+LXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzMxMCwgdGhpcy5hZGRUb0xpc3RIYW5kbGVyKTsgICAgICAgIC8v5re75Yqg5aW95Y+L5Yiw5YiX6KGo77yI5re75Yqg5aW95Y+L5oiQ5Yqf5ZCO5pyN5Yqh56uv5o6o6YCB77yJXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzMxMSwgdGhpcy5hcHBseUxpc3RIYW5kbGVyKTsgICAgICAgIC8v5aW95Y+L55Sz6K+35YiX6KGoXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzMxMiwgdGhpcy5yZWZ1c2VBcHBseUxpc3RIYW5kbGVyKTsgICAgICAgIC8v5YWo6YOo5ouS57ud55Sz6K+35YiX6KGoXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzMxNCwgdGhpcy5xdWVyeUZpbmRIYW5kbGVyKTsgICAgICAgIC8v5p+l6K+i5aW95Y+L5L+h5oGvXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzMxNSwgdGhpcy5xdWVyeUZyaWVuZFRlYW1IYW5kbGVyKTsgIC8v5p+l6K+i5aW95Y+L5piv5ZCm5pyJ6Zif5LyNXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzMxNiwgdGhpcy5zdHJlbmd0aEhhbmRsZXIpOyAgICAgICAgIC8v5aW95Y+L5L2T5Yqb6LWg6YCB6aKG5Y+WXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzMxNywgdGhpcy5iYXRjaFN0cmVuZ3RoSGFuZGxlcik7ICAgIC8v5aW95Y+L5L2T5Yqb5LiA6ZSu6LWg6YCB6aKG5Y+WXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzMyMCwgdGhpcy5yZWNvbW1lbmRIYW5kbGVyKTsgICAgICAgIC8v5o6o6I2Q5aW95Y+LXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMDM4OCwgdGhpcy5nZXRSb2xlc09ubGluZSk7ICAgICAgICAgIC8vIOafpeivouWFtuWug+eOqeWutuaYr+WQpuWcqOe6v1xuXG4gICAgICAgIC8v6buR5ZCN5Y2VXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzMzMCwgdGhpcy5oYW5kbGUxMzMzMCk7IC8v6I635Y+W6buR5ZCN5Y2V5YiX6KGo5L+h5oGvXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzMzMSwgdGhpcy5oYW5kbGUxMzMzMSk7IC8v6I635Y+W5aKe5Yqg5pu05paw6buR5ZCN5Y2V5YiX6KGo5L+h5oGvXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzMzMiwgdGhpcy5oYW5kbGUxMzMzMik7IC8v5ouJ6buRXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzMzMywgdGhpcy5oYW5kbGUxMzMzMyk7IC8v56e76Zmk6buR5ZCNXG5cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEzMzM0LCB0aGlzLmhhbmRsZTEzMzM0KTsgLy/lhajpg6jlkIzmhI/lpb3lj4vnlLPor7dcbiAgICB9LFxuXG4gICAgaXNGcmllbmQ6IGZ1bmN0aW9uIChzcnZfaWQsIHJpZCkge1xuICAgICAgICBpZiAodGhpcy5tb2RlbCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmlzRnJpZW5kKHNydl9pZCwgcmlkKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlRnJpZW5kVGlzaGk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGF3YXJkX251bSA9IHRoaXMuZ2V0TW9kZWwoKS5nZXRBd2FyZE51bSgpIHx8IDA7XG4gICAgICAgIHZhciBhcHBsX251bSA9IHRoaXMuZ2V0TW9kZWwoKS5nZXRBcHBseU51bSgpIHx8IDA7XG4gICAgICAgIHZhciBsaXN0ID0gW3sgYmlkOiAxLCBudW06IGF3YXJkX251bSB9LCB7IGJpZDogMiwgbnVtOiBhcHBsX251bSB9XTtcbiAgICAgICAgdmFyIE1haW51aUNvbnN0ID0gcmVxdWlyZShcIm1haW51aV9jb25zdFwiKTtcbiAgICAgICAgcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuc2V0RnVuY3Rpb25UaXBzU3RhdHVzKE1haW51aUNvbnN0Lmljb24uZnJpZW5kLCBsaXN0KVxuICAgIH0sXG5cbiAgICAvL+iOt+WPluWlveWPi+WIl+ihqFxuICAgIGZyaWVuZExpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTMzMDAsIHt9KTtcbiAgICB9LFxuXG4gICAgZnJpZW5kTGlzdEhhbmRsZXI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLm1vZGVsID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwgPSBuZXcgRnJpZW5kTW9kZWwoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vZGVsLnNldEZyaWVuZFByZXNlbnRDb3VudChkYXRhLnByZXNlbnRfY291bnQpO1xuICAgICAgICB0aGlzLm1vZGVsLnNldEZyaWVuZERyYXdDb3VudChkYXRhLmRyYXdfY291bnQpO1xuICAgICAgICB0aGlzLm1vZGVsLnNldEZyaWVuZERyYXdUb3RhbENvdW50KGRhdGEuZHJhd19hbGwpO1xuXG4gICAgICAgIGZvciAodmFyIGsgaW4gZGF0YS5mcmllbmRfbGlzdCkge1xuICAgICAgICAgICAgdmFyIHYgPSBkYXRhLmZyaWVuZF9saXN0W2tdO1xuICAgICAgICAgICAgdmFyIGZyaWVuZCA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbC5pc0ZyaWVuZCh2LnNydl9pZCwgdi5yaWQpKSB7XG4gICAgICAgICAgICAgICAgZnJpZW5kID0gdGhpcy5tb2RlbC5nZXRWbyh2LnNydl9pZCwgdi5yaWQpO1xuICAgICAgICAgICAgICAgIGZyaWVuZC5zZXREYXRhKHYpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmllbmQgPSBuZXcgRnJpZW5kVm8oKTtcbiAgICAgICAgICAgICAgICBmcmllbmQuc2V0RGF0YSh2KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmFkZChmcmllbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRnJpZW5kRXZlbnQuRlJJRU5EX0xJU1QsIHRoaXMubW9kZWwuZ2V0QXJyYXkoKSk7XG4gICAgICAgIHRoaXMuYXBwbHkoKTtcbiAgICAgICAgdGhpcy51cGRhdGVGcmllbmRUaXNoaSgpO1xuICAgIH0sXG5cbiAgICAvL+WlveWPi+aYr+WQpuS4iue6v1xuICAgIG9ubGluZUhhbmRsZXI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHZhciBvbGRfaW5kZXggPSB0aGlzLm1vZGVsLmdldEluZGV4KGRhdGEuc3J2X2lkLCBkYXRhLnJpZCk7XG4gICAgICAgIHZhciB2bzEgPSB0aGlzLm1vZGVsLnVwZGF0ZVZvKGRhdGEuc3J2X2lkLCBkYXRhLnJpZCwgXCJpc19vbmxpbmVcIiwgZGF0YS5pc19vbmxpbmUpO1xuICAgICAgICB2YXIgdm8yID0gdGhpcy5tb2RlbC51cGRhdGVWbyhkYXRhLnNydl9pZCwgZGF0YS5yaWQsIFwibG9naW5fb3V0X3RpbWVcIiwgZGF0YS5sb2dpbl9vdXRfdGltZSk7XG4gICAgICAgIHZhciBuZXdfaW5kZXggPSB0aGlzLm1vZGVsLmdldEluZGV4KGRhdGEuc3J2X2lkLCBkYXRhLnJpZCk7XG4gICAgICAgIGlmIChvbGRfaW5kZXggIT0gbnVsbCAmJiBuZXdfaW5kZXggIT0gbnVsbCAmJiB2bzIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHZvMSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaXNfb25saW5lID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShGcmllbmRFdmVudC5GUklFTkRfVVBEQVRFX0lURU0sIHZvMSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UoY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5oKo55qE5aW95Y+LPGNvbG9yPSMwMGZmMDA+JXM8L2M+5LiK57q/5LqGXCIpLCB2bzEubmFtZSkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5Y2V5Liq5aW95Y+L5LiA5Lqb54q25oCB5pS55Y+YXG4gICAgZnJpZW5kU3RhdGVIYW5kbGVyOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5zcnZfaWQgIT0gbnVsbCAmJiBkYXRhLnJpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZVNpbmdsZUZyaWVuZERhdGEoZGF0YS5zcnZfaWQsIGRhdGEucmlkLCBkYXRhKTtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRnJpZW5kRXZlbnQuRlJJRU5EX0xJU1QsIHRoaXMubW9kZWwuZ2V0QXJyYXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVGcmllbmRUaXNoaSgpO1xuICAgIH0sXG5cbiAgICAvL+WlveWPi+eUs+ivt+WIl+ihqFxuICAgIGFwcGx5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDEzMzExLCB7fSk7XG4gICAgfSxcblxuICAgIGFwcGx5TGlzdEhhbmRsZXI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIC8v5Lqy5a+G5bqm6K6+572u5Li6LTEo6KGo56S66ZmM55Sf5Lq6KVxuICAgICAgICAvL0RlYnVnLmluZm8oZGF0YSlcbiAgICAgICAgZm9yICh2YXIgayBpbiBkYXRhLmZyaWVuZF9yZXFfbGlzdCkge1xuICAgICAgICAgICAgZGF0YS5mcmllbmRfcmVxX2xpc3Rba10uaW50aW1hY3kgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vZGVsLnNldEFwcGx5TGlzdChkYXRhLmZyaWVuZF9yZXFfbGlzdCk7XG5cbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShGcmllbmRFdmVudC5GUklFTkRfTElTVCwgdGhpcy5tb2RlbC5nZXRBcHBseUxpc3QoKSk7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRnJpZW5kRXZlbnQuRlJJRU5EX0FQUExZKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUZyaWVuZFRpc2hpKCk7XG5cbiAgICB9LFxuXG4gICAgc2VuZF9yZWZ1c2VBcHBseUxpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTMzMTIsIHt9KTtcbiAgICB9LFxuXG4gICAgcmVmdXNlQXBwbHlMaXN0SGFuZGxlcjogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEuY29kZSA9PSAxKSB7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEZyaWVuZEV2ZW50LlVQREFURV9BUFBMWV9MSVNUKTtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuYXBwbHkgPSBbXTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRnJpZW5kVGlzaGkoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+WFqOmDqOWQjOaEj+WlveWPi+eUs+ivt1xuICAgIHNlbmRfYWNjZXB0QXBwbHlMaXN0OiBmdW5jdGlvbiAobGlzdCkge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwucm9sZV9pZHMgPSBsaXN0O1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMzMzNCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMzMzNDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShGcmllbmRFdmVudC5VUERBVEVfQVBQTFlfTElTVCk7XG4gICAgICAgIHRoaXMubW9kZWwuYXBwbHkgPSBbXTtcbiAgICAgICAgdGhpcy51cGRhdGVGcmllbmRUaXNoaSgpO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEZyaWVuZEV2ZW50LlVwZGF0ZV9SZWRfUG9pbnQpO1xuICAgIH0sXG5cbiAgICAvL+WlveWPi+eUs+ivt+S4quaVsFxuICAgIGFwcENvdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5hcHBseS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDBcbiAgICB9LFxuXG4gICAgLy/mjqjojZDlpb3lj4tcbiAgICByZWNvbW1lbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTMzMjAsIHt9KTtcbiAgICB9LFxuXG4gICAgcmVjb21tZW5kSGFuZGxlcjogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdmFyIGxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHNydl9pZCA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCkuc3J2X2lkO1xuICAgICAgICB2YXIgcmlkID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKS5yaWQ7XG4gICAgICAgIGZvciAodmFyIGsgaW4gZGF0YS5yZWNvbW1lbmRfbGlzdCkge1xuICAgICAgICAgICAgdmFyIHYgPSBkYXRhLnJlY29tbWVuZF9saXN0W2tdO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzRnJpZW5kKHYuc3J2X2lkLCB2LnJpZCkgJiYgIShzcnZfaWQgPT0gdi5zcnZfaWQgJiYgcmlkID09IHYucmlkKSkge1xuICAgICAgICAgICAgICAgIHYuaW50aW1hY3kgPSAtMTsgLy/moIforrDkuLrpmYznlJ/kurpcbiAgICAgICAgICAgICAgICBsaXN0LnB1c2godik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShGcmllbmRFdmVudC5VRF9DT01NRU5EX0xJU1QsIGxpc3QpO1xuICAgIH0sXG5cbiAgICAvL+aooeeziuafpeivolxuICAgIHF1ZXJ5RmluZDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMzMxNCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBxdWVyeUZpbmRIYW5kbGVyOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgdCA9IFtdO1xuICAgICAgICBpZiAoVXRpbHMubmV4dChkYXRhLnJvbGVfbGlzdCkpIHtcbiAgICAgICAgICAgIHZhciBzcnZfaWQgPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpLnNydl9pZDtcbiAgICAgICAgICAgIHZhciByaWQgPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpLnJpZDtcbiAgICAgICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIGRhdGEucm9sZV9saXN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSBkYXRhLnJvbGVfbGlzdFtrXTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNGcmllbmQodi5zcnZfaWQsIHYucmlkKSAmJiAhKHNydl9pZCA9PSB2LnNydl9pZCAmJiByaWQgPT0gdi5yaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHYuaW50aW1hY3kgPSAtMTsgLy/moIforrDkuLrpmYznlJ/kurpcbiAgICAgICAgICAgICAgICAgICAgdC5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMjUpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubGV2ID4gYi5sZXY7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYgKCF0IHx8IFV0aWxzLm5leHQodCkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UoXCLmib7kuI3liLDnjqnlrrZcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXNzYWdlKFwi5om+5LiN5Yiw546p5a62XCIpO1xuICAgICAgICB9XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRnJpZW5kRXZlbnQuRlJJRU5EX1FVRVJZX1JFU1VMVCwgdCk7XG4gICAgfSxcblxuICAgIHF1ZXJ5RnJpZW5kSXNIYXNUZWFtOiBmdW5jdGlvbiAocmlkLCBzcnZfaWQpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnJpZCA9IHJpZDtcbiAgICAgICAgcHJvdG9jYWwuc3J2X2lkID0gc3J2X2lkO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMzMxNSwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBxdWVyeUZyaWVuZFRlYW1IYW5kbGVyOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5jb2RlID09IDEpIHsgICAvL+aciemYn+S8jVxuICAgICAgICAgICAgdGhpcy5vcGVuRnJpbmVkSW5mbygxKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmNvZGUgPT0gMCkgeyAvL+ayoemYn+S8jVxuICAgICAgICAgICAgdGhpcy5vcGVuRnJpbmVkSW5mbygwKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5aW95Y+L5L2T5Yqb6aKG5Y+WIOi1oOmAgSBjb2RlOiAwIOi1oOmAgSDvvIwx6aKG5Y+WXG4gICAgc2VuZGVyXzEzMzE2OiBmdW5jdGlvbiAoY29kZSwgcmlkLCBzcnZfaWQpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnJpZCA9IHJpZDtcbiAgICAgICAgcHJvdG9jYWwuc3J2X2lkID0gc3J2X2lkO1xuICAgICAgICBwcm90b2NhbC5jb2RlID0gY29kZTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTMzMTYsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgc3RyZW5ndGhIYW5kbGVyOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5jb2RlID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0RnJpZW5kUHJlc2VudENvdW50KGRhdGEucHJlc2VudF9jb3VudCk7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldEZyaWVuZERyYXdDb3VudChkYXRhLmRyYXdfY291bnQpO1xuICAgICAgICAgICAgLy/mm7TmlrDmlbDmja5cbiAgICAgICAgICAgIHRoaXMubW9kZWwudXBkYXRlVm8oZGF0YS5zcnZfaWQsIGRhdGEucmlkLCBcImlzX2RyYXdcIiwgZGF0YS5pc19kcmF3KVxuICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVWbyhkYXRhLnNydl9pZCwgZGF0YS5yaWQsIFwiaXNfcHJlc2VudFwiLCBkYXRhLmlzX3ByZXNlbnQpXG5cbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRnJpZW5kRXZlbnQuU1RSRU5HVEhfVVBEQVRFLCB7IGxpc3Q6IHsgZGF0YSB9IH0pO1xuXG4gICAgICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRnJpZW5kRXZlbnQuVXBkYXRlX1JlZF9Qb2ludClcbiAgICAgICAgICAgIH0sIDYwLCAxKVxuICAgICAgICB9XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgIH0sXG5cbiAgICAvL+WlveWPi+S9k+WKm+mihuWPliDotaDpgIEgY29kZTogMCDotaDpgIEg77yMMemihuWPllxuICAgIHNlbmRlcl8xMzMxNzogZnVuY3Rpb24gKGNvZGUsIGxpc3QpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmxpc3QgPSBsaXN0O1xuICAgICAgICBwcm90b2NhbC5jb2RlID0gY29kZTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTMzMTcsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgYmF0Y2hTdHJlbmd0aEhhbmRsZXI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLmNvZGUgPT0gMSkge1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShGcmllbmRFdmVudC5TVFJFTkdUSF9VUERBVEUsIGRhdGEpO1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShGcmllbmRFdmVudC5VcGRhdGVfUmVkX1BvaW50KTtcbiAgICAgICAgfVxuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICB9LFxuXG4gICAgLy/or7fmsYLliqDlpb3lj4s7QeWQkeacjeWKoeerr+ivt+axguaDs+WKoELkuLrlpb3lj4s75Lya6L+U5Zue5raI5oGv5ZGK6K+JQei/measoeivt+axguaYr+WQpuaIkOWKn1xuICAgIGFkZE90aGVyOiBmdW5jdGlvbiAoc3J2X2lkLCByaWQpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnNydl9pZCA9IHNydl9pZDtcbiAgICAgICAgcHJvdG9jYWwucmlkID0gcmlkO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMzMwMywgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBhZGRPdGhlckhhbmRsZXI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICBpZiAoZGF0YS5jb2RlID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VJbmZvKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/ooqvliqDlpb3lj4vvvIzmnI3liqHnq6/lkYror4nlrqLmiLfnq687QeaDs+WKoELkuLrlpb3lj4tcbiAgICBhZGRNZUhhbmRsZXI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmlzQmxhY2soZGF0YS5yaWQsIGRhdGEuc3J2X2lkKSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB0aGlzLmFwcGx5KCk7XG4gICAgfSxcblxuICAgIC8vQuWRiuivieacjeWKoeerr++8jOWKoOaIluS4jeWKoEHkuLrlpb3lj4s75pyN5Yqh56uv5Lya5ZGK6K+JQui/measoee7k+aenOaAjuS5iOagt1xuICAgIGFjY2VwdDogZnVuY3Rpb24gKHNydl9pZCwgcmlkLCBhZ3JlZWQpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnNydl9pZCA9IHNydl9pZDtcbiAgICAgICAgcHJvdG9jYWwucmlkID0gcmlkO1xuICAgICAgICBwcm90b2NhbC5hZ3JlZWQgPSBhZ3JlZWQ7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDEzMzA1LCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIC8v5Yig6Zmk5a6i5oi356uv57yT5a2Y55qE5aW95Y+L55Sz6K+35pWw5o2uXG4gICAgYWNjZXB0SGFuZGxlcjogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm1vZGVsLmFwcGx5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLm1vZGVsLmFwcGx5W2tdO1xuICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwgJiYgdi5zcnZfaWQgPT0gZGF0YS5zcnZfaWQgJiYgdi5yaWQgPT0gZGF0YS5yaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5hcHBseS5zcGxpY2UoaywgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShGcmllbmRFdmVudC5VUERBVEVfQ09VTlQsIDIsIHRoaXMubW9kZWwuYXBwbHkubGVuZ3RoKTsgLy/ljZXkuKrmlbDmja7lop7liqBcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRnJpZW5kVGlzaGkoKTtcbiAgICAgICAgICAgIGlmIChkYXRhLmNvZGUgPT0gMSkge1xuICAgICAgICAgICAgICAgIENoYXRDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5zYXZlVGFsa1RpbWUoZGF0YS5zcnZfaWQsIGRhdGEucmlkKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+a3u+WKoOWlveWPi+WIsOWIl+ihqO+8iOa3u+WKoOWlveWPi+aIkOWKn+WQjuacjeWKoeerr+aOqOmAge+8iVxuICAgIGFkZFRvTGlzdEhhbmRsZXI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLm1vZGVsID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdmFyIGZyaWVuZCA9IG5ldyBGcmllbmRWbygpO1xuICAgICAgICBmcmllbmQuc2V0RGF0YShkYXRhKTtcbiAgICAgICAgdGhpcy5tb2RlbC5hZGQoZnJpZW5kKTtcbiAgICAgICAgaWYgKHRoaXMubW9kZWwuYXBwbHkgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgbSBpbiB0aGlzLm1vZGVsLmFwcGx5KSB7XG4gICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLm1vZGVsLmFwcGx5W21dO1xuICAgICAgICAgICAgICAgIGlmIChuICYmIGRhdGEuc3J2X2lkID09IG4uc3J2X2lkICYmIGRhdGEucmlkID09IG4ucmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuYXBwbHkuc3BsaWNlKG0sIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShGcmllbmRFdmVudC5VUERBVEVfQVBQTFkpO1xuICAgICAgICB9LCAxMDAwLCAxKVxuICAgICAgICBtZXNzYWdlKGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuaIkOWKn+a3u+WKoDxjb2xvcj0jMDBmZjAwPiVzPC9jPuS4uuWlveWPi1wiKSwgZGF0YS5uYW1lKSlcbiAgICB9LFxuXG4gICAgLy/mibnph4/liqDlpb3lj4tcbiAgICBiYXRjaEFkZDogZnVuY3Rpb24gKHJvbGVfaWRzKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5yb2xlX2lkcyA9IHJvbGVfaWRzO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMzMwNiwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBiYXRjaEFkZEhhbmRsZXI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgIH0sXG5cbiAgICAvL+S4u+WKqOWIoOmZpOWlveWPizvpnIDopoHlrqLmiLfnq6/miorlpb3lj4vliKDpmaRcbiAgICBkZWxPdGhlcjogZnVuY3Rpb24gKHNydl9pZCwgcmlkKSB7XG4gICAgICAgIHZhciBjb25maXJtX2hhbmRsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgICAgICBwcm90b2NhbC5zcnZfaWQgPSBzcnZfaWQ7XG4gICAgICAgICAgICBwcm90b2NhbC5yaWQgPSByaWQ7XG4gICAgICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMzMwNywgcHJvdG9jYWwpO1xuICAgICAgICB9KS5iaW5kKHRoaXMpXG4gICAgICAgIHZhciBDb21tb25BbGVydCA9IHJlcXVpcmUoXCJjb21tb25hbGVydFwiKTtcbiAgICAgICAgQ29tbW9uQWxlcnQuc2hvdyhVdGlscy5USTE4TihcIuWlveWPi+WIoOmZpOWQju+8jOWwhua4heepuuiBiuWkqeiusOW9le+8jOaYr+WQpuWIoOmZpOWlveWPi++8n1wiKSwgVXRpbHMuVEkxOE4oXCLliKDpmaRcIiksIGNvbmZpcm1faGFuZGxlciwgVXRpbHMuVEkxOE4oXCLlj5bmtohcIikpXG4gICAgICAgIC8vIGNvbmZpcm1faGFuZGxlcigpO1xuICAgIH0sXG5cbiAgICAvL+WIoOmZpOaVsOaNrlxuICAgIC8v5Yig6Zmk6KeG5Zu+XG4gICAgZGVsT3RoZXJIYW5kbGVyOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5jb2RlID09IDEpIHtcbiAgICAgICAgICAgIHZhciBvbGRfZGF0YSA9IHRoaXMubW9kZWwuZ2V0Vm8oZGF0YS5zcnZfaWQsIGRhdGEucmlkKTtcbiAgICAgICAgICAgIGlmIChvbGRfZGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kZWwoZGF0YS5zcnZfaWQsIGRhdGEucmlkKTtcbiAgICAgICAgICAgICAgICB2YXIgcm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgICAgICAgICAgQ2hhdENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmRlbHRlUHJpdmF0ZVRhcmdldChkYXRhKVxuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRnJpZW5kRXZlbnQuRlJJRU5EX0RFTEVURSwgb2xkX2RhdGEsIHRoaXMuZ3JvdXBfdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNsb3NlSW5mb20oKTtcbiAgICAgICAgfVxuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICB9LFxuXG4gICAgLy/ooqvliqjliKDpmaTlpb3lj4vvvIjooqvkurrliKDvvIlcbiAgICBkZWxNZUhhbmRsZXI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHZhciBvbGRfZGF0YSA9IHRoaXMubW9kZWwuZ2V0Vm8oZGF0YS5zcnZfaWQsIGRhdGEucmlkKTtcbiAgICAgICAgaWYgKG9sZF9kYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZGVsKGRhdGEuc3J2X2lkLCBkYXRhLnJpZCk7XG4gICAgICAgICAgICB2YXIgcm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgICAgICBDaGF0Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZGVsdGVQcml2YXRlVGFyZ2V0KGRhdGEpXG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEZyaWVuZEV2ZW50LlVQREFURV9HUk9VUF9DT1VOVCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVsZXRlQ29ubmVjdGVyOiBmdW5jdGlvbiAodm8pIHtcbiAgICAgICAgdmFyIGNvbmZpcm1faGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIENoYXRDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5jbGVhclRhbGtUaW1lKHZvLnNydl9pZCwgdm8ucmlkKVxuICAgICAgICAgICAgLy8gZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShDb250YWN0RXZlbnQuQ0xPU0VfVEFMS19JTkZPKVxuICAgICAgICAgICAgdGhpcy5jbG9zZUluZm9tKCk7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEZyaWVuZEV2ZW50LkZSSUVORF9ERUxFVEUsIHZvLCBGcmllbmRDb25zdC5GcmllbmRHcm91cFR5cGUuY29tbXVuaWNhdGUpXG4gICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICB2YXIgQ29tbW9uQWxlcnQgPSByZXF1aXJlKFwiY29tbW9uYWxlcnRcIik7XG4gICAgICAgIENvbW1vbkFsZXJ0LnNob3coXCLmmK/lkKbku47liJfooajkuK3liKDpmaTor6XogZTns7vkurrvvJ9cIiwgXCLliKDpmaRcIiwgY29uZmlybV9oYW5kbGVyLCBcIuWPlua2iFwiKVxuICAgIH0sXG5cbiAgICBkZWxldGVCbGFja0Nvbm5lY3RlcjogZnVuY3Rpb24gKHNydl9pZCwgcmlkKSB7XG4gICAgICAgIENoYXRDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5jbGVhclRhbGtUaW1lKHNydl9pZCwgcmlkKVxuICAgICAgICAvLyBnY29yZS5HbG9iYWxFdmVudC5maXJlKENvbnRhY3RFdmVudC5DTE9TRV9UQUxLX0lORk8pXG4gICAgICAgIHRoaXMuY2xvc2VJbmZvbSgpO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEZyaWVuZEV2ZW50LkZSSUVORF9ERUxFVEUsIHsgc3J2X2lkOiBzcnZfaWQsIHJpZDogcmlkIH0sIEZyaWVuZENvbnN0LkZyaWVuZEdyb3VwVHlwZS5mcmllbmQpXG4gICAgfSxcblxuICAgIHNlbmRlcl8xMDM4ODogZnVuY3Rpb24gKGxpc3QpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmlkX2xpc3QgPSBsaXN0O1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMDM4OCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICAvL+iOt+WPluW4uOeUqOiBlOezu+S6uuS4iue6v+aDheWGtVxuICAgIGdldFJvbGVzT25saW5lOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEZyaWVuZEV2ZW50LlVQREFURV9PTkxJTkUsIGRhdGEub25saW5lX3JvbGVzKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+erlueJiOWlveWPi+S4u+eVjOmdolxuICAgIG9wZW5GcmllbmRXaW5kb3c6IGZ1bmN0aW9uIChib29sLCBpbmRleCkge1xuICAgICAgICBpZiAoYm9vbCA9PSB0cnVlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZnJpZW5kX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHZhciBGcmllbmRXaW5kb3cgPSByZXF1aXJlKFwiZnJpZW5kX3dpbmRvd1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZyaWVuZF93aW5kb3cgPSBuZXcgRnJpZW5kV2luZG93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZyaWVuZF93aW5kb3cub3BlbihpbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mcmllbmRfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcmllbmRfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mcmllbmRfd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+erlueJiOWlveWPi+aOqOiNkOafpeaJvueVjOmdolxuICAgIG9wZW5GcmllbmRGaW5kV2luZG93OiBmdW5jdGlvbiAoYm9vbCkge1xuICAgICAgICBpZiAoYm9vbCA9PSB0cnVlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZnJpZW5kX2ZpbmRfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdmFyIEZyaWVuZEFkZFdpbmRvdyA9IHJlcXVpcmUoXCJmcmllbmRfYWRkX3dpbmRvd1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZyaWVuZF9maW5kX3dpbmRvdyA9IG5ldyBGcmllbmRBZGRXaW5kb3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZnJpZW5kX2ZpbmRfd2luZG93Lm9wZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZyaWVuZF9maW5kX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuZnJpZW5kX2ZpbmRfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mcmllbmRfZmluZF93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5YWz6Zet5aW95Y+L5L+h5oGv55WM6Z2iXG4gICAgY2xvc2VJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGlmICghdGhpcy5pbmZvICYmIHRoaXMuaW5mby5pc09wZW4oKSkge1xuICAgICAgICAvLyAgICAgdGhpcy5pbmZvLmNsb3NlKCk7XG4gICAgICAgIC8vICAgICB0aGlzLmluZm8gPSBudWxsO1xuICAgICAgICAvLyB9XG4gICAgfSxcblxuICAgIG9wZW5GcmluZWRJbmZvOiBmdW5jdGlvbiAoY29kZV90eXBlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VSZWNvbW1lbmRQYW5lbCgpO1xuICAgICAgICB2YXIgc2hvd190eXBlID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBfdHlwZSA9PSAxKSB7ICAvL+aIkeeahOWlveWPi1xuICAgICAgICAgICAgc2hvd190eXBlID0gWzExLCAxMiwgMTVdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ3JvdXBfdHlwZSA9PSAzKSB7XG4gICAgICAgICAgICBzaG93X3R5cGUgPSBbMiwgMTMsIDE1XTsgLy/pu5HlkI3ljZVcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+aJk+W8gOWlveWPi+S/oeaBr+afpeeci+eVjOmdoiBkYXRh5pyJc3J2X2lkLHJpZOWwseihjFxuICAgIG9wZW5GcmllbmRDaGVja1BhbmVsOiBmdW5jdGlvbiAoc3RhdHVzLCBkYXRhKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZyaWVuZF9jaGVja192aWV3KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcmllbmRfY2hlY2tfdmlldyA9IG5ldyBGcmllbmRDaGVja0luZm9XaW5kb3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZnJpZW5kX2NoZWNrX3ZpZXcub3BlbihkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZyaWVuZF9jaGVja192aWV3KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcmllbmRfY2hlY2tfdmlldy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZnJpZW5kX2NoZWNrX3ZpZXcgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5omT5byA5aW95Y+L5Liq5Lq66I2j6KqJ55WM6Z2iXG4gICAgb3BlbkZyaWVuZEdsb3J5V2luZG93OiBmdW5jdGlvbiAoc3RhdHVzLCBkYXRhKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZyaWVuZF9nbG9yeV92aWV3KSB7XG4gICAgICAgICAgICAgICAgdmFyIEZyaWVuZEdsb3J5V2luZG93ID0gcmVxdWlyZShcImZyaWVuZF9nbG9yeV93aW5kb3dcIilcbiAgICAgICAgICAgICAgICB0aGlzLmZyaWVuZF9nbG9yeV92aWV3ID0gbmV3IEZyaWVuZEdsb3J5V2luZG93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZyaWVuZF9nbG9yeV92aWV3Lm9wZW4oZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mcmllbmRfZ2xvcnlfdmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMuZnJpZW5kX2dsb3J5X3ZpZXcuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZyaWVuZF9nbG9yeV92aWV3ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBvcGVuSW5mb206IGZ1bmN0aW9uIChkYXRhLCBjb3VudCwgYmVnaW5fcG9zLCBncm91cF90eXBlKSB7XG4gICAgICAgIHRoaXMuYmVnaW5fcG9zID0gYmVnaW5fcG9zO1xuICAgICAgICB0aGlzLmdyb3VwX3R5cGUgPSBncm91cF90eXBlIHx8IDE7XG4gICAgICAgIHRoaXMuc2VsZWN0X2RhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLm9wZW5GcmluZWRJbmZvKCk7XG4gICAgfSxcblxuICAgIC8v5YWz6Zet5aW95Y+L6YKu5Lu26Z2i5p2/XG4gICAgY2xvc2VJbmZvbTogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBpZiAodGhpcy5pbmZvbSAmJiB0aGlzLmluZm9tLmlzT3BlbigpKSB7XG4gICAgICAgIC8vICAgICB0aGlzLmluZm9tLmNsb3NlKCk7XG4gICAgICAgIC8vICAgICB0aGlzLmluZm9tID0gbnVsbDtcbiAgICAgICAgLy8gfVxuICAgIH0sXG5cbiAgICBjbG9zZVJlY29tbWVuZFBhbmVsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGlmICh0aGlzLmNvbW1lbmRfdWkgJiYgdGhpcy5jb21tZW5kX3VpLmlzT3BlbigpKSB7XG4gICAgICAgIC8vICAgICB0aGlzLmNvbW1lbmRfdWkuY2xvc2UoKTtcbiAgICAgICAgLy8gICAgIHRoaXMuY29tbWVuZF91aSA9IG51bGw7XG4gICAgICAgIC8vIH1cbiAgICB9LFxuXG4gICAgLy/np4HogYrmnKror7vmlbDmja7mmL7npLpcbiAgICBhZGRQcml2YXRlTXNnOiBmdW5jdGlvbiAoY2hhdF92bykge1xuXG4gICAgfSxcblxuICAgIC8v5Yig6Zmk6IGK5aSp5pWw6YePXG4gICAgZGVsUHJpQ291bnQ6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdGhpcy5wcmlfbGlzdFtrZXldID0gbnVsbDtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShGcmllbmRFdmVudC5VUERBVEVfQ09VTlQsIDEsIGtleSwgMCk7IC8v5Y2V5Liq5pWw5o2u5aKe5YqgXG4gICAgfSxcblxuICAgIC8v6I635Y+W5aW95Y+L6IGU57O75Lq66IGK5aSp55qE5oC75pWw55uuXG4gICAgZ2V0THByaUNvdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5wcmlfbGlzdCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5tb2RlbC5pc0ZyaWVuZDIodik7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyB2O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9LFxuXG4gICAgYWxsUHJpQ291bnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLnByaV9saXN0KSB7XG4gICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgdjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY291bnRcbiAgICB9LFxuXG4gICAgc2luZ2xlUHJpQ291bnQ6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMucHJpX2xpc3Rba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJpX2xpc3Rba2V5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMFxuICAgIH0sXG5cbiAgICBfX2RlbGV0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5tb2RlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLkRlbGV0ZU1lKCk7XG4gICAgICAgICAgICB0aGlzLm1vZGVsID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlUmVjb21tZW5kUGFuZWwoKTtcbiAgICB9LFxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLem7keWQjeWNlemDqOWIhlxuICAgIGhhbmRsZTEzMzMwOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB0aGlzLm1vZGVsLmluaXRCbGFja0xpc3QoZGF0YS5ibGFja19saXN0KTtcbiAgICB9LFxuXG4gICAgLy/ojrflj5bpu5HlkI3ljZXliJfooahcbiAgICBnZXRCbGFja0xpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTMzMzAsIHt9KTtcbiAgICB9LFxuXG4gICAgLy/mi4npu5Hlkoznp7vpmaTpu5HlkI3ljZXmjqjpgIFcbiAgICBoYW5kbGUxMzMzMTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PSAxKSB7IC8v5Yqg6buR5ZCN5Y2VXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmluaXRCbGFja0xpc3QoZGF0YS5ibGFja19saXN0KTtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRnJpZW5kRXZlbnQuVVBEQVRFX0dST1VQX0NPVU5UKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gMikgeyAvL+enu+mZpOm7keWQjeWNlVxuXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/mi4npu5FcbiAgICBhZGRUb0JsYWNrTGlzdDogZnVuY3Rpb24gKHJpZCwgc3J2X2lkKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5yaWQgPSByaWQ7XG4gICAgICAgIHByb3RvY2FsLnNydl9pZCA9IHNydl9pZDtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTMzMzIsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgLy/mi4npu5HmmK/lkKbmiJDlip/ov5Tlm55cbiAgICBoYW5kbGUxMzMzMjogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIGlmIChkYXRhLmNvZGUgPT0gMSkge1xuICAgICAgICAgICAgdmFyIG9sZF9kYXRhID0gdGhpcy5tb2RlbC5nZXRWbyhkYXRhLnNydl9pZCwgZGF0YS5yaWQpO1xuICAgICAgICAgICAgLy/mi4npu5HlkI7lnKjlpb3lj4vliJfooajph4zpnaLliKDmjonor6Xlpb3lj4tcbiAgICAgICAgICAgIGlmIChvbGRfZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGVsKGRhdGEuc3J2X2lkLCBkYXRhLnJpZCk7XG4gICAgICAgICAgICAgICAgLy/liKDpmaTmnIDov5HogZTns7vkurpcbiAgICAgICAgICAgICAgICAvLyB2YXIgcm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgICAgICAgICAgLy8gQ2hhdENvbnRyb2xsZXI6Z2V0SW5zdGFuY2UoKTpnZXRNb2RlbCgpOmRlbGV0ZUNhY2hlKHJvbGVfdm8uc3J2X2lkLHJvbGVfdm8ucmlkLGRhdGEuc3J2X2lkLGRhdGEucmlkKVxuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRnJpZW5kRXZlbnQuRlJJRU5EX0RFTEVURSwgb2xkX2RhdGEsIHRoaXMuZ3JvdXBfdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/liKDpmaTpu5HlkI3ljZVcbiAgICBkZWxldGVCbGFja0xpc3Q6IGZ1bmN0aW9uIChyaWQsIHNydl9pZCkge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwucmlkID0gcmlkO1xuICAgICAgICBwcm90b2NhbC5zcnZfaWQgPSBzcnZfaWQ7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDEzMzMzLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIC8v5Yig6Zmk6buR5ZCN5Y2V6L+U5ZueXG4gICAgaGFuZGxlMTMzMzM6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLmNvZGUgPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5yZW1vdmVCbGFjayhkYXRhLnJpZCwgZGF0YS5zcnZfaWQpO1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShGcmllbmRFdmVudC5GUklFTkRfREVMRVRFLCBkYXRhLCB0aGlzLmdyb3VwX3R5cGUgfHwgRnJpZW5kQ29uc3QuRnJpZW5kR3JvdXBUeXBlLmJsYWNrX2xpc3QpOyAvL+exu+WeizLmmK/pu5HlkI3ljZXliIbnu4RcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZyaWVuZENvbnRyb2xsZXI7Il19