(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/login/login_model.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, 'a9e8eXmlbpG26XbXfg4uht+', 'login_model'); // Scripts/mod/login/login_model.js "use strict"; var _shmix, _ServerData; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } // -------------------------------------------------------------------- // @author: shiraho@syg.com(必填, 创建模块的人员) // @description: // 登录数据管理 //
Create: new Date().toISOString() // -------------------------------------------------------------------- var LoginEvent = require("login_event"); var LoginPlatform = require("login_platform"); var ServerData = (_ServerData = {}, _defineProperty(_ServerData, "sh", _defineProperty({}, "1", "英雄之路")), _defineProperty(_ServerData, "shmix", (_shmix = {}, _defineProperty(_shmix, "1", "风王结界"), _defineProperty(_shmix, "2", "魔力领域"), _shmix)), _ServerData); var LoginModel = cc.Class({ ctor: function ctor() { this.server_list = []; this.login_info = {}; //登入游戏数据 this.isSocket = false; }, properties: {}, initConfig: function initConfig() { // this.login_info.platform = PLATFORM_NAME //暂时的 this.login_info.ip = ""; this.login_info.port = ""; this.login_info.role_count = "0"; this.login_info.status = "0"; // 默认的服务器拥挤状态 this.login_info.isNew = false; // 是否是新服 this.login_info.isClose = false; // 是否关服 this.login_info.host = ""; // host this.login_info.open_time = 0; this.login_info.srv_name = ""; this.login_info.srv_id = ""; this.login_info.main_srv_id = ""; this.login_info.rid = 0; this.login_info.usrName = ""; this.login_info.password = ""; this.login_info.tuijianCareer = 0; // 推荐职业 来源于 10100 this.login_info.platform_flag = ""; // 平台标签 // 从本地缓存读取最后一次使用的账号和密码 this.login_info.usrName = gcore.SysEnv.get("user_name") || ""; this.login_info.password = gcore.SysEnv.get("password") || ""; // this.loginData.usrNameList = SysEnv:getInstance():getTable(SysEnv.keys.usrNameList) }, //获取登录数据 getLoginInfo: function getLoginInfo() { return this.login_info; }, // 请求默认服务器信息 requestDefaultServer: function requestDefaultServer() { //1默认 0所有 var account = this.login_info.account || ''; var srv_id = ""; var str_ = "srv_id" + this.login_info.usrName; console.log("---服务器---", str_, gcore.SysEnv.get(str_)); if (gcore.SysEnv.get(str_)) { srv_id = gcore.SysEnv.get(str_); } var time = gcore.SmartSocket.getTime(); var url = SERVER_LIST_URL + "?platform=" + PLATFORM + "&chanleId=" + CHANNEL + "&account=" + account + "&srvid=" + srv_id + "&start=0&num=1" + "&time=" + time; //默认 var url1 = SERVER_LIST_URL + "?platform=" + PLATFORM + "&chanleId=" + CHANNEL + "&account=" + account + "&srvid=" + srv_id + "&start=0&num=0" + "&time=" + time; //所有 cc.loader.load(url, function (err, json) { cc.log("默认服务器列表"); var objs = JSON.parse(json); cc.log(objs); this.handleDefaultServer(objs); cc.loader.load(url1, function (err, json) { var objs1 = JSON.parse(json); this.handleAllServer(objs1); }.bind(this)); }.bind(this)); }, // 获取默认服务器列表 requestDefaultServerList: function requestDefaultServerList(account, platform) { account = account || this.loginData.usrName || ""; platform = platform || PLATFORM_NAME; this.account = account; this.platform = platform; var srv_id = ""; // console.log("---服务器---", gcore.SysEnv.get("srv_id")) // if(gcore.SysEnv.get("srv_id")){ // srv_id = gcore.SysEnv.get("srv_id") // } var str_ = "srv_id" + this.login_info.usrName; console.log("---服务器---", str_, gcore.SysEnv.get(str_)); if (gcore.SysEnv.get(str_)) { srv_id = gcore.SysEnv.get(str_); } var channelId = LoginPlatform.getInstance().getChannel(); var finalChannelId = LoginPlatform.getInstance().getFinalChannel(); if (!finalChannelId) finalChannelId = CHANNEL; // if (channelId) // account = channelId + "_" + account; var time = gcore.SmartSocket.getTime(); var url = SERVER_LIST_URL + "?platform=" + platform + "&chanleId=" + finalChannelId + "&account=" + account + "&srvid=" + srv_id + "&start=0&num=1" + "&time=" + time; //默认 var url1 = SERVER_LIST_URL + "?platform=" + platform + "&chanleId=" + finalChannelId + "&account=" + account + "&srvid=" + srv_id + "&start=0&num=0" + "&time=" + time; //所有 console.log("请求服务器列表链接" + url); cc.loader.load(url, function (err, json) { var objs = JSON.parse(json); this.handleSDKDefaultServer(objs, account, platform); cc.log("默认服务器列表"); cc.log(objs); console.log("默认服务器列表", objs); if (USE_SDK == true && PLATFORM_TYPR == "SH_SDK") { SDK.dataPlacement(75000); } cc.loader.load(url1, function (err, json) { var objs1 = JSON.parse(json); this.handleAllServer(objs1); }.bind(this)); }.bind(this)); }, // 获取所有服务列表 requestAllDefaultServerList: function requestAllDefaultServerList() {}, handleSDKDefaultServer: function handleSDKDefaultServer(objs, account, platform) { var data = objs.data || objs.msg; if (_typeof(data) != 'object') { return; } if (this.login_info.srv_name) { return; } var defserver = data.default_zone; var server = this.convertServerInfo(defserver); this.setCurServer(server); gcore.GlobalEvent.fire(LoginEvent.LOGIN_EVENT_DEFSERVER_SUCCESS); }, // 处理默认服务器信息 handleDefaultServer: function handleDefaultServer(objs) { var data = objs.data || objs.msg; if (_typeof(data) != 'object') { return; } if (this.login_info.srv_name) { return; } var defserver = data.default_zone; var server = this.convertServerInfo(defserver); this.setCurServer(server); gcore.GlobalEvent.fire(LoginEvent.LOGIN_EVENT_DEFSERVER_SUCCESS); }, handleAllServer: function handleAllServer(objs) { var data = objs.data || objs.msg; if (_typeof(data) != 'object') { return; } this.server_list = []; for (var i = 0; i < data.server_list.length; ++i) { var list = Utils.deepCopy(this.convertServerInfo(data.server_list[i])); this.server_list.push(list); } }, // 服务器信息数据转换 convertServerInfo: function convertServerInfo(server) { return { srv_name: server.name || server.srv_name, srv_id: server.srv_id || server.platform + "_" + server.zone_id, ip: server.ip || server.host, host: server.host || server.ip, port: server.port, ws: server.ws || "ws", zone_id: server.zone_id, platform: server.platform, main_srv_id: server.main_srv_id, is_close: server.maintain == 1, is_try: server.first_zone == 1, is_new: Number(server.isnew) == 1, is_recomed: server.recomed == 1, open_time: server.open_time || server.begin_time, roles: server.roles || [], group_num: server.group_num || 1, group_id: server.group_id || 1 }; }, // 设置当前服务器信息 setCurServer: function setCurServer(server) { this.login_info.ip = server.ip; this.login_info.host = server.host; this.login_info.port = server.port; this.login_info.ws = server.ws; this.login_info.srv_id = server.srv_id; this.login_info.platform = server.platform; this.login_info.zone_id = server.zone_id; this.login_info.srv_name = server.srv_name; this.login_info.open_time = server.open_time; this.login_info.is_close = server.is_close; this.login_info.is_new = server.is_new; gcore.GlobalEvent.fire(LoginEvent.LOGIN_EVENT_CUR_SERVER_UPDATE); }, // 查找指定服务器信息 findServer: function findServer(srv_id) { if (srv_id) { for (var srv_i in this.server_list) { if (this.server_list[srv_i].srv_id == srv_id) { return this.server_list[srv_i]; } } } return null; }, //获取服务器列表 getServerList: function getServerList() { return this.server_list; }, //获取对应服务器信息 getServerInfo: function getServerInfo(index) { if (this.server_list[index]) { return this.server_list[index]; } }, //获取当前服务器名称 getSvrName: function getSvrName(srv_id) { if (this.server_list == null || srv_id == null) { return ""; } for (var i in this.server_list) { var v = this.server_list[i]; if (v.srv_id == srv_id) { return v.srv_name; } } return ""; }, setIsSocket: function setIsSocket(bool) { this.isSocket = bool; }, getLoginData: function getLoginData() { return this.login_info; }, checkReloadServerData: function checkReloadServerData(data) { var now = gcore.SmartSocket.getTime(); this.check_time = this.check_time || 0; if (now - this.check_time > 10) { this.check_time = now; if (this.account && this.platform) { this.requestDefaultServerList(this.account, this.platform); } } }, setFirstRoleData: function setFirstRoleData(data) { this.first_role_data = data; }, getFirstRoleData: function getFirstRoleData() { return this.first_role_data; }, getSrvGroupNameByGroupId: function getSrvGroupNameByGroupId(group_id) { if (group_id == null) return ""; var srv_cfg = ServerData[PLATFORM_NAME]; if (srv_cfg) { return srv_cfg[group_id]; } return ""; // if(group_id == null) return ""; // let platform_id = 1 // if(PLATFORM_NAME == "sh"){ // platform_id = 1 // }else if(PLATFORM_NAME == "shmix"){ // platform_id = 2 // } // let srv_cfg = ServerData[group_id] // if(srv_cfg){ // return srv_cfg[platform_id] || "" // } // return "" } }); module.exports = LoginModel; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxsb2dpblxcbG9naW5fbW9kZWwuanMiXSwibmFtZXMiOlsiTG9naW5FdmVudCIsInJlcXVpcmUiLCJMb2dpblBsYXRmb3JtIiwiU2VydmVyRGF0YSIsIkxvZ2luTW9kZWwiLCJjYyIsIkNsYXNzIiwiY3RvciIsInNlcnZlcl9saXN0IiwibG9naW5faW5mbyIsImlzU29ja2V0IiwicHJvcGVydGllcyIsImluaXRDb25maWciLCJpcCIsInBvcnQiLCJyb2xlX2NvdW50Iiwic3RhdHVzIiwiaXNOZXciLCJpc0Nsb3NlIiwiaG9zdCIsIm9wZW5fdGltZSIsInNydl9uYW1lIiwic3J2X2lkIiwibWFpbl9zcnZfaWQiLCJyaWQiLCJ1c3JOYW1lIiwicGFzc3dvcmQiLCJ0dWlqaWFuQ2FyZWVyIiwicGxhdGZvcm1fZmxhZyIsImdjb3JlIiwiU3lzRW52IiwiZ2V0IiwiZ2V0TG9naW5JbmZvIiwicmVxdWVzdERlZmF1bHRTZXJ2ZXIiLCJhY2NvdW50Iiwic3RyXyIsImNvbnNvbGUiLCJsb2ciLCJ0aW1lIiwiU21hcnRTb2NrZXQiLCJnZXRUaW1lIiwidXJsIiwiU0VSVkVSX0xJU1RfVVJMIiwiUExBVEZPUk0iLCJDSEFOTkVMIiwidXJsMSIsImxvYWRlciIsImxvYWQiLCJlcnIiLCJqc29uIiwib2JqcyIsIkpTT04iLCJwYXJzZSIsImhhbmRsZURlZmF1bHRTZXJ2ZXIiLCJvYmpzMSIsImhhbmRsZUFsbFNlcnZlciIsImJpbmQiLCJyZXF1ZXN0RGVmYXVsdFNlcnZlckxpc3QiLCJwbGF0Zm9ybSIsImxvZ2luRGF0YSIsIlBMQVRGT1JNX05BTUUiLCJjaGFubmVsSWQiLCJnZXRJbnN0YW5jZSIsImdldENoYW5uZWwiLCJmaW5hbENoYW5uZWxJZCIsImdldEZpbmFsQ2hhbm5lbCIsImhhbmRsZVNES0RlZmF1bHRTZXJ2ZXIiLCJVU0VfU0RLIiwiUExBVEZPUk1fVFlQUiIsIlNESyIsImRhdGFQbGFjZW1lbnQiLCJyZXF1ZXN0QWxsRGVmYXVsdFNlcnZlckxpc3QiLCJkYXRhIiwibXNnIiwiZGVmc2VydmVyIiwiZGVmYXVsdF96b25lIiwic2VydmVyIiwiY29udmVydFNlcnZlckluZm8iLCJzZXRDdXJTZXJ2ZXIiLCJHbG9iYWxFdmVudCIsImZpcmUiLCJMT0dJTl9FVkVOVF9ERUZTRVJWRVJfU1VDQ0VTUyIsImkiLCJsZW5ndGgiLCJsaXN0IiwiVXRpbHMiLCJkZWVwQ29weSIsInB1c2giLCJuYW1lIiwiem9uZV9pZCIsIndzIiwiaXNfY2xvc2UiLCJtYWludGFpbiIsImlzX3RyeSIsImZpcnN0X3pvbmUiLCJpc19uZXciLCJOdW1iZXIiLCJpc25ldyIsImlzX3JlY29tZWQiLCJyZWNvbWVkIiwiYmVnaW5fdGltZSIsInJvbGVzIiwiZ3JvdXBfbnVtIiwiZ3JvdXBfaWQiLCJMT0dJTl9FVkVOVF9DVVJfU0VSVkVSX1VQREFURSIsImZpbmRTZXJ2ZXIiLCJzcnZfaSIsImdldFNlcnZlckxpc3QiLCJnZXRTZXJ2ZXJJbmZvIiwiaW5kZXgiLCJnZXRTdnJOYW1lIiwidiIsInNldElzU29ja2V0IiwiYm9vbCIsImdldExvZ2luRGF0YSIsImNoZWNrUmVsb2FkU2VydmVyRGF0YSIsIm5vdyIsImNoZWNrX3RpbWUiLCJzZXRGaXJzdFJvbGVEYXRhIiwiZmlyc3Rfcm9sZV9kYXRhIiwiZ2V0Rmlyc3RSb2xlRGF0YSIsImdldFNydkdyb3VwTmFtZUJ5R3JvdXBJZCIsInNydl9jZmciLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFVBQVUsR0FBR0MsT0FBTyxDQUFDLGFBQUQsQ0FBeEI7O0FBQ0EsSUFBSUMsYUFBYSxHQUFHRCxPQUFPLENBQUMsZ0JBQUQsQ0FBM0I7O0FBQ0EsSUFBSUUsVUFBVSxtREFDVCxJQURTLHNCQUVELEdBRkMsRUFFSSxNQUZKLGlDQUlSLE9BSlEsd0NBS0wsR0FMSyxFQUtBLE1BTEEsMkJB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QUFnQixLQUFLd0IsUUFBeEIsRUFBaUM7QUFDN0IsYUFBS0Qsd0JBQUwsQ0FBOEIsS0FBS3ZCLE9BQW5DLEVBQTJDLEtBQUt3QixRQUFoRDtBQUNIO0FBQ0o7QUFFSixHQTVQcUI7QUE4UHRCNEQsRUFBQUEsZ0JBQWdCLEVBQUMsMEJBQVM5QyxJQUFULEVBQWM7QUFDM0IsU0FBSytDLGVBQUwsR0FBdUIvQyxJQUF2QjtBQUNILEdBaFFxQjtBQWtRdEJnRCxFQUFBQSxnQkFBZ0IsRUFBQyw0QkFBVTtBQUN2QixXQUFPLEtBQUtELGVBQVo7QUFDSCxHQXBRcUI7QUFzUXRCRSxFQUFBQSx3QkFBd0IsRUFBQyxrQ0FBU2xCLFFBQVQsRUFBa0I7QUFDdkMsUUFBR0EsUUFBUSxJQUFJLElBQWYsRUFBc0IsT0FBTyxFQUFQO0FBRXRCLFFBQUltQixPQUFPLEdBQUd2SCxVQUFVLENBQUN5RCxhQUFELENBQXhCOztBQUNBLFFBQUc4RCxPQUFILEVBQVc7QUFDUCxhQUFPQSxPQUFPLENBQUNuQixRQUFELENBQWQ7QUFDSDs7QUFDRCxXQUFPLEVBQVAsQ0FQdUMsQ0FRdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0g7QUExUnFCLENBQVQsQ0FBakI7QUE2UkFvQixNQUFNLENBQUNDLE9BQVAsR0FBaUJ4SCxVQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHNoaXJhaG9Ac3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICAg55m75b2V5pWw5o2u566h55CGXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIExvZ2luRXZlbnQgPSByZXF1aXJlKFwibG9naW5fZXZlbnRcIik7XG52YXIgTG9naW5QbGF0Zm9ybSA9IHJlcXVpcmUoXCJsb2dpbl9wbGF0Zm9ybVwiKTtcbnZhciBTZXJ2ZXJEYXRhID0ge1xuICAgIFtcInNoXCJdIDoge1xuICAgICAgICAgICAgW1wiMVwiXTpcIuiLsembhOS5i+i3r1wiLFxuICAgICAgICB9XG4gICAgLFtcInNobWl4XCJdOntcbiAgICAgICAgW1wiMVwiXTpcIumjjueOi+e7k+eVjFwiLFxuICAgICAgICBbXCIyXCJdOlwi6a2U5Yqb6aKG5Z+fXCIsXG4gICAgfVxufVxudmFyIExvZ2luTW9kZWwgPSBjYy5DbGFzcyh7XG5cbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2VydmVyX2xpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5sb2dpbl9pbmZvID0ge307ICAgLy/nmbvlhaXmuLjmiI/mlbDmja5cbiAgICAgICAgdGhpcy5pc1NvY2tldCA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgfSxcblxuICAgIGluaXRDb25maWc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gdGhpcy5sb2dpbl9pbmZvLnBsYXRmb3JtID0gUExBVEZPUk1fTkFNRSAvL+aaguaXtueahFxuICAgICAgICB0aGlzLmxvZ2luX2luZm8uaXAgPSBcIlwiO1xuICAgICAgICB0aGlzLmxvZ2luX2luZm8ucG9ydCA9IFwiXCI7XG4gICAgICAgIHRoaXMubG9naW5faW5mby5yb2xlX2NvdW50ID0gXCIwXCI7XG4gICAgICAgIHRoaXMubG9naW5faW5mby5zdGF0dXMgPSBcIjBcIjsgICAgICAvLyDpu5jorqTnmoTmnI3liqHlmajmi6XmjKTnirbmgIFcbiAgICAgICAgdGhpcy5sb2dpbl9pbmZvLmlzTmV3ID0gZmFsc2U7ICAgICAvLyDmmK/lkKbmmK/mlrDmnI1cbiAgICAgICAgdGhpcy5sb2dpbl9pbmZvLmlzQ2xvc2UgPSBmYWxzZTsgICAvLyDmmK/lkKblhbPmnI1cbiAgICAgICAgdGhpcy5sb2dpbl9pbmZvLmhvc3QgPSBcIlwiOyAgICAgICAgIC8vIGhvc3RcbiAgICAgICAgdGhpcy5sb2dpbl9pbmZvLm9wZW5fdGltZSA9IDA7XG4gICAgICAgIHRoaXMubG9naW5faW5mby5zcnZfbmFtZSA9IFwiXCI7XG4gICAgICAgIHRoaXMubG9naW5faW5mby5zcnZfaWQgPSBcIlwiO1xuICAgICAgICB0aGlzLmxvZ2luX2luZm8ubWFpbl9zcnZfaWQgPSBcIlwiO1xuICAgICAgICB0aGlzLmxvZ2luX2luZm8ucmlkID0gMDtcbiAgICAgICAgdGhpcy5sb2dpbl9pbmZvLnVzck5hbWUgPSBcIlwiO1xuICAgICAgICB0aGlzLmxvZ2luX2luZm8ucGFzc3dvcmQgPSBcIlwiO1xuICAgICAgICB0aGlzLmxvZ2luX2luZm8udHVpamlhbkNhcmVlciA9IDA7ICAvLyDmjqjojZDogYzkuJog5p2l5rqQ5LqOIDEwMTAwXG4gICAgICAgIHRoaXMubG9naW5faW5mby5wbGF0Zm9ybV9mbGFnID0gXCJcIjsgLy8g5bmz5Y+w5qCH562+XG5cbiAgICAgICAgLy8g5LuO5pys5Zyw57yT5a2Y6K+75Y+W5pyA5ZCO5LiA5qyh5L2/55So55qE6LSm5Y+35ZKM5a+G56CBXG4gICAgICAgIHRoaXMubG9naW5faW5mby51c3JOYW1lID0gZ2NvcmUuU3lzRW52LmdldChcInVzZXJfbmFtZVwiKSB8fCBcIlwiO1xuICAgICAgICB0aGlzLmxvZ2luX2luZm8ucGFzc3dvcmQgPSBnY29yZS5TeXNFbnYuZ2V0KFwicGFzc3dvcmRcIikgfHwgXCJcIjtcbiAgICAvLyB0aGlzLmxvZ2luRGF0YS51c3JOYW1lTGlzdCA9IFN5c0VudjpnZXRJbnN0YW5jZSgpOmdldFRhYmxlKFN5c0Vudi5rZXlzLnVzck5hbWVMaXN0KVxuXG4gICAgfSxcblxuICAgIC8v6I635Y+W55m75b2V5pWw5o2uXG4gICAgZ2V0TG9naW5JbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvZ2luX2luZm87XG4gICAgfSxcblxuICAgIC8vIOivt+axgum7mOiupOacjeWKoeWZqOS/oeaBr1xuICAgIHJlcXVlc3REZWZhdWx0U2VydmVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vMem7mOiupCAw5omA5pyJXG4gICAgICAgIHZhciBhY2NvdW50ID0gdGhpcy5sb2dpbl9pbmZvLmFjY291bnQgfHwgJyc7XG4gICAgICAgIHZhciBzcnZfaWQgPSBcIlwiO1xuICAgICAgICBsZXQgc3RyXyA9IFwic3J2X2lkXCIgKyB0aGlzLmxvZ2luX2luZm8udXNyTmFtZTtcbiAgICAgICAgY29uc29sZS5sb2coXCItLS3mnI3liqHlmagtLS1cIiwgc3RyXyxnY29yZS5TeXNFbnYuZ2V0KHN0cl8pKVxuICAgICAgICBpZihnY29yZS5TeXNFbnYuZ2V0KHN0cl8pKXtcbiAgICAgICAgICAgIHNydl9pZCA9IGdjb3JlLlN5c0Vudi5nZXQoc3RyXylcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0aW1lID0gZ2NvcmUuU21hcnRTb2NrZXQuZ2V0VGltZSgpO1xuICAgICAgICB2YXIgdXJsID0gU0VSVkVSX0xJU1RfVVJMICsgXCI/cGxhdGZvcm09XCIgKyBQTEFURk9STSArIFwiJmNoYW5sZUlkPVwiICsgQ0hBTk5FTCArIFwiJmFjY291bnQ9XCIgKyBhY2NvdW50ICsgXCImc3J2aWQ9XCIgKyBzcnZfaWQgKyBcIiZzdGFydD0wJm51bT0xXCIrXCImdGltZT1cIit0aW1lOy8v6buY6K6kXG4gICAgICAgIHZhciB1cmwxID0gU0VSVkVSX0xJU1RfVVJMICsgXCI/cGxhdGZvcm09XCIgKyBQTEFURk9STSArIFwiJmNoYW5sZUlkPVwiICsgQ0hBTk5FTCArIFwiJmFjY291bnQ9XCIgKyBhY2NvdW50ICsgXCImc3J2aWQ9XCIgKyBzcnZfaWQgKyBcIiZzdGFydD0wJm51bT0wXCIrXCImdGltZT1cIit0aW1lOy8v5omA5pyJXG4gICAgICAgIGNjLmxvYWRlci5sb2FkKHVybCwgKGZ1bmN0aW9uIChlcnIsIGpzb24pIHtcbiAgICAgICAgICAgIGNjLmxvZyhcIum7mOiupOacjeWKoeWZqOWIl+ihqFwiKTtcbiAgICAgICAgICAgIHZhciBvYmpzID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgICAgIGNjLmxvZyhvYmpzKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRGVmYXVsdFNlcnZlcihvYmpzKTtcbiAgICAgICAgICAgIGNjLmxvYWRlci5sb2FkKHVybDEsIChmdW5jdGlvbiAoZXJyLCBqc29uKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9ianMxID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFsbFNlcnZlcihvYmpzMSlcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W6buY6K6k5pyN5Yqh5Zmo5YiX6KGoXG4gICAgcmVxdWVzdERlZmF1bHRTZXJ2ZXJMaXN0OiBmdW5jdGlvbihhY2NvdW50LCBwbGF0Zm9ybSkge1xuICAgICAgICBhY2NvdW50ID0gYWNjb3VudCB8fCB0aGlzLmxvZ2luRGF0YS51c3JOYW1lIHx8IFwiXCI7XG4gICAgICAgIHBsYXRmb3JtID0gcGxhdGZvcm0gfHwgUExBVEZPUk1fTkFNRTtcbiAgICAgICAgdGhpcy5hY2NvdW50ID0gYWNjb3VudDtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybSA9IHBsYXRmb3JtO1xuICAgICAgICB2YXIgc3J2X2lkID0gXCJcIjtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCItLS3mnI3liqHlmagtLS1cIiwgZ2NvcmUuU3lzRW52LmdldChcInNydl9pZFwiKSlcbiAgICAgICAgLy8gaWYoZ2NvcmUuU3lzRW52LmdldChcInNydl9pZFwiKSl7XG4gICAgICAgIC8vICAgICBzcnZfaWQgPSBnY29yZS5TeXNFbnYuZ2V0KFwic3J2X2lkXCIpXG4gICAgICAgIC8vIH1cbiAgICAgICAgbGV0IHN0cl8gPSBcInNydl9pZFwiICsgdGhpcy5sb2dpbl9pbmZvLnVzck5hbWU7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiLS0t5pyN5Yqh5ZmoLS0tXCIsc3RyXywgZ2NvcmUuU3lzRW52LmdldChzdHJfKSlcbiAgICAgICAgaWYoZ2NvcmUuU3lzRW52LmdldChzdHJfKSl7XG4gICAgICAgICAgICBzcnZfaWQgPSBnY29yZS5TeXNFbnYuZ2V0KHN0cl8pXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hhbm5lbElkID0gTG9naW5QbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmdldENoYW5uZWwoKTtcbiAgICAgICAgdmFyIGZpbmFsQ2hhbm5lbElkID0gTG9naW5QbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmdldEZpbmFsQ2hhbm5lbCgpO1xuICAgICAgICBpZiAoIWZpbmFsQ2hhbm5lbElkKVxuICAgICAgICAgICAgZmluYWxDaGFubmVsSWQgPSBDSEFOTkVMO1xuICAgICAgICAvLyBpZiAoY2hhbm5lbElkKVxuICAgICAgICAgICAgLy8gYWNjb3VudCA9IGNoYW5uZWxJZCArIFwiX1wiICsgYWNjb3VudDtcbiAgICAgICAgdmFyIHRpbWUgPSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCk7XG4gICAgICAgIHZhciB1cmwgPSBTRVJWRVJfTElTVF9VUkwgKyBcIj9wbGF0Zm9ybT1cIiArIHBsYXRmb3JtICsgXCImY2hhbmxlSWQ9XCIgKyBmaW5hbENoYW5uZWxJZCArIFwiJmFjY291bnQ9XCIgKyBhY2NvdW50ICsgXCImc3J2aWQ9XCIgKyBzcnZfaWQgKyBcIiZzdGFydD0wJm51bT0xXCIrXCImdGltZT1cIit0aW1lOyAvL+m7mOiupFxuICAgICAgICB2YXIgdXJsMSA9IFNFUlZFUl9MSVNUX1VSTCArIFwiP3BsYXRmb3JtPVwiICsgcGxhdGZvcm0gKyBcIiZjaGFubGVJZD1cIiArIGZpbmFsQ2hhbm5lbElkICsgXCImYWNjb3VudD1cIiArIGFjY291bnQgKyBcIiZzcnZpZD1cIiArIHNydl9pZCArIFwiJnN0YXJ0PTAmbnVtPTBcIitcIiZ0aW1lPVwiK3RpbWU7IC8v5omA5pyJICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2coXCLor7fmsYLmnI3liqHlmajliJfooajpk77mjqVcIiArIHVybCk7XG4gICAgICAgIGNjLmxvYWRlci5sb2FkKHVybCwgZnVuY3Rpb24gKGVyciwganNvbikge1xuICAgICAgICAgICAgdmFyIG9ianMgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTREtEZWZhdWx0U2VydmVyKG9ianMsIGFjY291bnQsIHBsYXRmb3JtKTtcbiAgICAgICAgICAgIGNjLmxvZyhcIum7mOiupOacjeWKoeWZqOWIl+ihqFwiKTtcbiAgICAgICAgICAgIGNjLmxvZyhvYmpzKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6buY6K6k5pyN5Yqh5Zmo5YiX6KGoXCIsb2Jqcyk7XG4gICAgICAgICAgICBpZihVU0VfU0RLID09IHRydWUgJiYgUExBVEZPUk1fVFlQUiA9PSBcIlNIX1NES1wiKXtcbiAgICAgICAgICAgICAgICBTREsuZGF0YVBsYWNlbWVudCg3NTAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYy5sb2FkZXIubG9hZCh1cmwxLCAoZnVuY3Rpb24gKGVyciwganNvbikge1xuICAgICAgICAgICAgICAgIHZhciBvYmpzMSA9IEpTT04ucGFyc2UoanNvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBbGxTZXJ2ZXIob2JqczEpXG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTsgICAgICAgICAgICBcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgfSxcblxuICAgIC8vIOiOt+WPluaJgOacieacjeWKoeWIl+ihqFxuICAgIHJlcXVlc3RBbGxEZWZhdWx0U2VydmVyTGlzdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIFxuICAgIH0sXG5cblxuICAgIGhhbmRsZVNES0RlZmF1bHRTZXJ2ZXI6IGZ1bmN0aW9uKG9ianMsIGFjY291bnQsIHBsYXRmb3JtKSB7XG4gICAgICAgIHZhciBkYXRhID0gb2Jqcy5kYXRhIHx8IG9ianMubXNnO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sb2dpbl9pbmZvLnNydl9uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRlZnNlcnZlciA9IGRhdGEuZGVmYXVsdF96b25lO1xuICAgICAgICB2YXIgc2VydmVyID0gdGhpcy5jb252ZXJ0U2VydmVySW5mbyhkZWZzZXJ2ZXIpO1xuICAgICAgICB0aGlzLnNldEN1clNlcnZlcihzZXJ2ZXIpO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKExvZ2luRXZlbnQuTE9HSU5fRVZFTlRfREVGU0VSVkVSX1NVQ0NFU1MpOyAgICAgICAgXG4gICAgfSxcblxuICAgIC8vIOWkhOeQhum7mOiupOacjeWKoeWZqOS/oeaBr1xuICAgIGhhbmRsZURlZmF1bHRTZXJ2ZXI6IGZ1bmN0aW9uIChvYmpzKSB7XG4gICAgICAgIHZhciBkYXRhID0gb2Jqcy5kYXRhIHx8IG9ianMubXNnO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sb2dpbl9pbmZvLnNydl9uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRlZnNlcnZlciA9IGRhdGEuZGVmYXVsdF96b25lO1xuICAgICAgICB2YXIgc2VydmVyID0gdGhpcy5jb252ZXJ0U2VydmVySW5mbyhkZWZzZXJ2ZXIpO1xuICAgICAgICB0aGlzLnNldEN1clNlcnZlcihzZXJ2ZXIpO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKExvZ2luRXZlbnQuTE9HSU5fRVZFTlRfREVGU0VSVkVSX1NVQ0NFU1MpO1xuICAgIH0sXG5cbiAgICBoYW5kbGVBbGxTZXJ2ZXI6IGZ1bmN0aW9uIChvYmpzKSB7XG4gICAgICAgIHZhciBkYXRhID0gb2Jqcy5kYXRhIHx8IG9ianMubXNnO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlcnZlcl9saXN0ID0gW11cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLnNlcnZlcl9saXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgbGlzdCA9IFV0aWxzLmRlZXBDb3B5KHRoaXMuY29udmVydFNlcnZlckluZm8oZGF0YS5zZXJ2ZXJfbGlzdFtpXSkpXG4gICAgICAgICAgICB0aGlzLnNlcnZlcl9saXN0LnB1c2gobGlzdClcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIOacjeWKoeWZqOS/oeaBr+aVsOaNrui9rOaNolxuICAgIGNvbnZlcnRTZXJ2ZXJJbmZvOiBmdW5jdGlvbiAoc2VydmVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzcnZfbmFtZTogc2VydmVyLm5hbWUgfHwgc2VydmVyLnNydl9uYW1lXG4gICAgICAgICAgICAsIHNydl9pZDogc2VydmVyLnNydl9pZCB8fCBzZXJ2ZXIucGxhdGZvcm0gKyBcIl9cIiArIHNlcnZlci56b25lX2lkXG4gICAgICAgICAgICAsIGlwOiBzZXJ2ZXIuaXAgfHwgc2VydmVyLmhvc3RcbiAgICAgICAgICAgICwgaG9zdDogc2VydmVyLmhvc3QgfHwgc2VydmVyLmlwXG4gICAgICAgICAgICAsIHBvcnQ6IHNlcnZlci5wb3J0XG4gICAgICAgICAgICAsIHdzOiBzZXJ2ZXIud3MgfHwgXCJ3c1wiXG4gICAgICAgICAgICAsIHpvbmVfaWQ6IHNlcnZlci56b25lX2lkXG4gICAgICAgICAgICAsIHBsYXRmb3JtOiBzZXJ2ZXIucGxhdGZvcm1cbiAgICAgICAgICAgICwgbWFpbl9zcnZfaWQ6IHNlcnZlci5tYWluX3Nydl9pZFxuICAgICAgICAgICAgLCBpc19jbG9zZTogc2VydmVyLm1haW50YWluID09IDFcbiAgICAgICAgICAgICwgaXNfdHJ5OiBzZXJ2ZXIuZmlyc3Rfem9uZSA9PSAxXG4gICAgICAgICAgICAsIGlzX25ldzogTnVtYmVyKHNlcnZlci5pc25ldykgPT0gMVxuICAgICAgICAgICAgLCBpc19yZWNvbWVkOiBzZXJ2ZXIucmVjb21lZCA9PSAxXG4gICAgICAgICAgICAsIG9wZW5fdGltZTogc2VydmVyLm9wZW5fdGltZSB8fCBzZXJ2ZXIuYmVnaW5fdGltZVxuICAgICAgICAgICAgLCByb2xlczogc2VydmVyLnJvbGVzIHx8IFtdXG4gICAgICAgICAgICAsIGdyb3VwX251bTogc2VydmVyLmdyb3VwX251bSB8fCAxXG4gICAgICAgICAgICAsIGdyb3VwX2lkOiBzZXJ2ZXIuZ3JvdXBfaWQgfHwgMVxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvLyDorr7nva7lvZPliY3mnI3liqHlmajkv6Hmga9cbiAgICBzZXRDdXJTZXJ2ZXI6IGZ1bmN0aW9uIChzZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5sb2dpbl9pbmZvLmlwID0gc2VydmVyLmlwO1xuICAgICAgICB0aGlzLmxvZ2luX2luZm8uaG9zdCA9IHNlcnZlci5ob3N0O1xuICAgICAgICB0aGlzLmxvZ2luX2luZm8ucG9ydCA9IHNlcnZlci5wb3J0O1xuICAgICAgICB0aGlzLmxvZ2luX2luZm8ud3MgPSBzZXJ2ZXIud3M7XG4gICAgICAgIHRoaXMubG9naW5faW5mby5zcnZfaWQgPSBzZXJ2ZXIuc3J2X2lkO1xuICAgICAgICB0aGlzLmxvZ2luX2luZm8ucGxhdGZvcm0gPSBzZXJ2ZXIucGxhdGZvcm07XG4gICAgICAgIHRoaXMubG9naW5faW5mby56b25lX2lkID0gc2VydmVyLnpvbmVfaWQ7XG4gICAgICAgIHRoaXMubG9naW5faW5mby5zcnZfbmFtZSA9IHNlcnZlci5zcnZfbmFtZTtcbiAgICAgICAgdGhpcy5sb2dpbl9pbmZvLm9wZW5fdGltZSA9IHNlcnZlci5vcGVuX3RpbWU7XG4gICAgICAgIHRoaXMubG9naW5faW5mby5pc19jbG9zZSA9IHNlcnZlci5pc19jbG9zZTtcbiAgICAgICAgdGhpcy5sb2dpbl9pbmZvLmlzX25ldyA9IHNlcnZlci5pc19uZXc7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoTG9naW5FdmVudC5MT0dJTl9FVkVOVF9DVVJfU0VSVkVSX1VQREFURSk7XG4gICAgfSxcblxuICAgIC8vIOafpeaJvuaMh+WumuacjeWKoeWZqOS/oeaBr1xuICAgIGZpbmRTZXJ2ZXI6IGZ1bmN0aW9uIChzcnZfaWQpIHtcbiAgICAgICAgaWYgKHNydl9pZCkgeyAgICAgICAgXG4gICAgICAgICAgICBmb3IgKHZhciBzcnZfaSBpbiB0aGlzLnNlcnZlcl9saXN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VydmVyX2xpc3Rbc3J2X2ldLnNydl9pZCA9PSBzcnZfaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmVyX2xpc3Rbc3J2X2ldXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgLy/ojrflj5bmnI3liqHlmajliJfooahcbiAgICBnZXRTZXJ2ZXJMaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2ZXJfbGlzdDtcbiAgICB9LFxuICAgIC8v6I635Y+W5a+55bqU5pyN5Yqh5Zmo5L+h5oGvXG4gICAgZ2V0U2VydmVySW5mbyhpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5zZXJ2ZXJfbGlzdFtpbmRleF0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZlcl9saXN0W2luZGV4XTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy/ojrflj5blvZPliY3mnI3liqHlmajlkI3np7BcbiAgICBnZXRTdnJOYW1lOiBmdW5jdGlvbiAoc3J2X2lkKSB7XG4gICAgICAgIGlmICh0aGlzLnNlcnZlcl9saXN0ID09IG51bGwgfHwgc3J2X2lkID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiXG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLnNlcnZlcl9saXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMuc2VydmVyX2xpc3RbaV07XG4gICAgICAgICAgICBpZiAodi5zcnZfaWQgPT0gc3J2X2lkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHYuc3J2X25hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCJcbiAgICB9LFxuXG4gICAgc2V0SXNTb2NrZXQoYm9vbCkge1xuICAgICAgICB0aGlzLmlzU29ja2V0ID0gYm9vbDtcbiAgICB9LFxuXG4gICAgZ2V0TG9naW5EYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9naW5faW5mbztcbiAgICB9LFxuXG4gICAgY2hlY2tSZWxvYWRTZXJ2ZXJEYXRhKGRhdGEpe1xuICAgICAgICBsZXQgbm93ID0gZ2NvcmUuU21hcnRTb2NrZXQuZ2V0VGltZSgpXG4gICAgICAgIHRoaXMuY2hlY2tfdGltZSA9IHRoaXMuY2hlY2tfdGltZSB8fCAwO1xuICAgICAgICBpZihub3cgLSB0aGlzLmNoZWNrX3RpbWUgPiAxMCl7XG4gICAgICAgICAgICB0aGlzLmNoZWNrX3RpbWUgPSBub3dcbiAgICAgICAgICAgIGlmKHRoaXMuYWNjb3VudCAmJiB0aGlzLnBsYXRmb3JtKXtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3REZWZhdWx0U2VydmVyTGlzdCh0aGlzLmFjY291bnQsdGhpcy5wbGF0Zm9ybSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIHNldEZpcnN0Um9sZURhdGE6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMuZmlyc3Rfcm9sZV9kYXRhID0gZGF0YTtcbiAgICB9LFxuXG4gICAgZ2V0Rmlyc3RSb2xlRGF0YTpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5maXJzdF9yb2xlX2RhdGE7XG4gICAgfSxcblxuICAgIGdldFNydkdyb3VwTmFtZUJ5R3JvdXBJZDpmdW5jdGlvbihncm91cF9pZCl7XG4gICAgICAgIGlmKGdyb3VwX2lkID09IG51bGwpICByZXR1cm4gXCJcIjtcblxuICAgICAgICBsZXQgc3J2X2NmZyA9IFNlcnZlckRhdGFbUExBVEZPUk1fTkFNRV1cbiAgICAgICAgaWYoc3J2X2NmZyl7XG4gICAgICAgICAgICByZXR1cm4gc3J2X2NmZ1tncm91cF9pZF1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJcIlxuICAgICAgICAvLyBpZihncm91cF9pZCA9PSBudWxsKSAgcmV0dXJuIFwiXCI7XG4gICAgICAgIC8vIGxldCBwbGF0Zm9ybV9pZCAgPSAxXG4gICAgICAgIC8vIGlmKFBMQVRGT1JNX05BTUUgPT0gXCJzaFwiKXtcbiAgICAgICAgLy8gICAgIHBsYXRmb3JtX2lkID0gMVxuICAgICAgICAvLyB9ZWxzZSBpZihQTEFURk9STV9OQU1FID09IFwic2htaXhcIil7XG4gICAgICAgIC8vICAgICBwbGF0Zm9ybV9pZCA9IDJcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBsZXQgc3J2X2NmZyA9IFNlcnZlckRhdGFbZ3JvdXBfaWRdXG4gICAgICAgIC8vIGlmKHNydl9jZmcpe1xuICAgICAgICAvLyAgICAgcmV0dXJuIHNydl9jZmdbcGxhdGZvcm1faWRdIHx8IFwiXCJcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyByZXR1cm4gXCJcIlxuICAgIH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBMb2dpbk1vZGVsO1xuIl19