(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/sdks/wx_sdk.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, '2d077OaeBRL8JWTIOk7HYAN', 'wx_sdk'); // Scripts/sdks/wx_sdk.js "use strict"; // window.PLATFORM = "wx"; // 平台号 // window.PACKAGE_VERSION = "0.0.2"; // window.CHANNEL = "h5sszg_wx"; // 渠道号 window.PACKAGE_NAME = "闪烁之光口袋版"; // 渠道号 var LoginController = require("login_controller"); var RoleController = require("role_controller"); var sha1 = require('sha1.min'); var WXSDK = function WXSDK() { wx = null; }; // 7dec9c4e4c26c46cf1a4e28a083f82bd WXSDK.account_info = null; WXSDK.user_info = null; // 游戏加载完成、初始化SDK WXSDK.initSDK = function () { console.log("微信SDK相关"); console.log(window); if (!window.wx) return; this.initTopInfo(); wx.setKeepScreenOn({ keepScreenOn: true }); wx.onShow(function (res) { wx.setKeepScreenOn({ keepScreenOn: true }); }); wx.onHide(function (res) { wx.setKeepScreenOn({ keepScreenOn: false }); }); wx.showShareMenu({ success: function success() { wx.onShareAppMessage(function () { return { title: '闪烁之光', imageUrl: '' // 图片 URL }; }); } }); wx.getSetting({ success: function success(res) { cc.log(res); if (res.authSetting["scope.userInfo"]) { WXSDK.checkLoginStatus(); } else { var info = wx.getSystemInfoSync(); var button = wx.createUserInfoButton({ type: 'text', text: '', style: { left: 0, bottom: 0, width: info.screenWidth, height: info.screenHeight / 2, lineHeight: 40, backgroundColor: '', color: '#ffffff', textAlign: 'center', fontSize: 16, borderRadius: 4 } }); button.show(); button.onTap(function (res) { button.hide(); WXSDK.checkLoginStatus(); console.log(res); }); } } }); }; WXSDK.initTopInfo = function () { var menuInfo = wx.getMenuButtonBoundingClientRect(); var systemInfo = wx.getSystemInfoSync(); window.WX_FIT = menuInfo.top / systemInfo.screenHeight * 0.8 || 0; console.log("微信小游戏菜单栏的适配值"); cc.log(WX_FIT); }; WXSDK.checkLoginStatus = function () { // 获取本地key try { var value = this.account_info = wx.getStorageSync('account_info'); if (value) { WXSDK.checkSessionKey(value); } else { WXSDK.login(); } } catch (e) {// Do something when catch error } }; WXSDK.login = function () { if (window.wx) { wx.login({ success: function success(res) { if (res.code) { //发起网络请求 cc.log("初始化登录信息返回"); cc.log(res); wx.request({ url: 'https://s1-wx-h5sszg.shiyuegame.com/api.php/pf/wx/login/', method: "POST", data: { js_code: res.code, cps: "wxtest" }, header: { 'content-type': 'application/json' // 默认值 }, success: function success(res) { cc.log("服务器登录信息返回"); cc.log(res); if (res && res.data) { if (res.data.error == 666) { // 请求成功 try { console.log("保存用户信息到本地"); cc.log(res.data.msg); WXSDK.account_info = res.data.msg; wx.setStorageSync('account_info', res.data.msg); // 请求成功开始登录游戏 WXSDK.initUserInfo(); } catch (e) {} } } } }); } else { console.log('登录失败!' + res.errMsg); } } }); } }; WXSDK.checkSessionKey = function (data) { cc.log("校验key是否过期"); wx.checkSession({ success: function success() { // 没有失效,继续登录 WXSDK.initUserInfo(); }, fail: function fail() { // session_key 已经失效,需要重新执行登录流程 WXSDK.login(); } }); // wx.getUserInfo({ // success: function(res) { // console.log("用户信息"); // console.log(res) // // 请求access_token // cc.log("发送到服务器校验是否过期"); // cc.log(data); // wx.request({ // url: 'http://s1-release-h5sszg.shiyuegame.com/api.php/pf/wx/token', // data: { // cps: "wxtest" // }, // header: { // 'content-type': 'application/json' // 默认值 // }, // success (res1) { // if (res1 && res1.data) { // cc.log("ASSESS_TOKEN返回"); // cc.log(res1); // if (res1.data.error == 666) { // 请求成功 // cc.log("校验ASSESS_TOKEN是否过期"); // var signature = sha1(res.rawData + data.session_key) // wx.request({ // url: 'http://s1-release-h5sszg.shiyuegame.com/api.php/pf/wx/check_session', // data: { // access_token: res1.data.msg.access_token, // openid: data.openid, // signature: signature, // cps: "wxtest", // }, // header: { // 'content-type': 'application/json' // 默认值 // }, // success (res) { // cc.log("校验结果"); // cc.log(res); // if (res && res.data) { // if (res.data.error == 666) { // 请求成功 // try { // console.log("HHHHHHHHHHHHHHHHHHHHHHHHH"); // console.log("校验成功开始登录游戏"); // } catch (e) { // } // } // } // } // }) // } // } // } // }) // }, // fail: function(res) { // console.log("UUUUUUUUUUUUUUUUu"); // console.log(res) // } // }) }; WXSDK.initUserInfo = function () { wx.getUserInfo({ success: function success(res) { WXSDK.user_info = res; cc.log("获取用户信息成功"); cc.log(res); WXSDK.setLoginData(res); }, fail: function fail(res) { cc.log("获取用户信息失败"); } }); }; WXSDK.setLoginData = function (user_info) { this.user_info = user_info; this.sdkBackLogin(); }; // SDK登录成功回调 WXSDK.sdkBackLogin = function () { var login_data = {}; login_data.usrName = "wx_" + this.account_info.openid; login_data.password = "wx123456"; console.log("微信数据初始花成功,开始请求服务器列表"); LoginController.getInstance().loginPlatformRequest(login_data); }; WXSDK.pay = function (money, buyNum, prodId, productName, productDesc, extension, coinNum) { console.log("开始调用支付"); var loginInfo = LoginController.getInstance().model.getLoginInfo(); var roleVo = RoleController.getInstance().getRoleVo(); if (roleVo == null) return; var severInfo = roleVo.srv_id.split("_"); var platform = severInfo[0] || ""; var zone_id = severInfo[1]; var systemInfo = wx.getSystemInfoSync(); var systemName = systemInfo.system; var pf = ""; if (systemName.indexOf("iOS") > -1) {// return; } else if (systemName.indexOf("Android") > -1) { pf = "android"; } var data = { openid: WXSDK.account_info.openid, time: WXSDK.account_info.time, sign: WXSDK.account_info.sign, zone_id: zone_id, pf: pf, cps: "wxtest" }; wx.request({ url: "https://" + loginInfo.host + "/api.php/pf/wx/balance", method: "POST", data: data, header: { 'content-type': 'application/json' // 默认值 }, success: function success(res) { console.log("请求余额", res); if (res && res.data) { if (res.data.error == 666) { // 请求成功 try { //时间戳 var date_time = Math.ceil(Date.now() / 1000); productName = productName || money * 10 + "钻石"; var cps = "wxtest"; var channel = CHANNEL; var _extension = roleVo.rid + "$$" + platform + "$$" + zone_id + "$$" + channel + "$$" + prodId + "$$" + productName + "$$" + cps + "$$" + date_time; cc.log("拓展参数_extension==>", _extension); var base_64 = require("base64").Base64; _extension = base_64.encode(_extension); cc.log("拓展参数_extension==222222222>", _extension); if (res.data.msg) { if (res.data.msg.balance >= money * 10) { wx.request({ url: "https://" + loginInfo.host + "/api.php/pf/wx/pay", method: "POST", data: { openid: WXSDK.account_info.openid, zone_id: zone_id, pf: pf, amt: money * 10, time: WXSDK.account_info.time, sign: WXSDK.account_info.sign, app_remark: _extension, cps: cps }, header: { 'content-type': 'application/json' // 默认值 }, success: function success(res) { console.log("预下单返回"); console.log(res); if (res && res.data) { if (res.data.error == 666) {// 请求成功 } else if (res.data.error == 1) {} else if (res.data.error == -1) { console.log("充值失败"); } } } }); } else { wx.requestMidasPayment({ mode: "game", env: 1, // offerId: "1450021881", currencyType: "CNY", platform: pf, buyQuantity: money * 10, zoneId: zone_id, success: function success(res) { console.log("支付回调成功"); wx.request({ url: "https://" + loginInfo.host + "/api.php/pf/wx/pay", method: "POST", data: { openid: WXSDK.account_info.openid, zone_id: zone_id, pf: pf, amt: money * 10, time: WXSDK.account_info.time, sign: WXSDK.account_info.sign, app_remark: _extension, cps: cps }, header: { 'content-type': 'application/json' // 默认值 }, success: function success(res) { console.log("预下单返回"); console.log(res); if (res && res.data) { if (res.data.error == 666) {// 请求成功 } else if (res.data.error == 1) {} else if (res.data.error == -1) { console.log("充值失败"); } } } }); }, fail: function fail(res) { console.log("支付回调失败", res); }, complete: function complete(res) { console.log("支付回调complete", res); } }); } } } catch (e) {} } } } }); }; WXSDK.loginGame = function () { var test_acount = LoginController.getInstance().getTestAccount(); cc.log("使用了微信测试账号"); cc.log(test_acount); // SDK请求登录游戏 var login_data = {}; if (test_acount) { login_data.account = test_acount; } else { login_data.account = "wx_" + this.account_info.openid; } login_data.rawData = this.user_info.rawData; login_data.signature = this.user_info.signature; login_data.channel = CHANNEL; login_data.package_name = PACKAGE_NAME; login_data.package_version = PACKAGE_VERSION; login_data.platform = PLATFORM; login_data.token = WXSDK.account_info.session_key; login_data.timestamp = WXSDK.account_info.time; login_data.sign = WXSDK.account_info.sign; LoginController.getInstance().cusSDKLogin(login_data); }; // 通知服务器成功 WXSDK.submitLogin = function (url) { if (url) { var submit_url = "https://" + url + "/api.php/pf/wx/session"; console.log(submit_url); console.log(WXSDK.account_info); wx.request({ url: submit_url, method: "POST", data: { session_key: WXSDK.account_info.session_key, openid: WXSDK.account_info.openid, time: WXSDK.account_info.time, sign: WXSDK.account_info.sign, cps: "wxtest" }, header: { 'content-type': 'application/json' // 默认值 }, success: function success(res) { cc.log("服务器登录信息返回"); cc.log(res); if (res && res.data) { console.log(res.data); if (res.data.error == 666) {// 请求成功 } } } }); } }; WXSDK.getCurrChannel = function () {}; WXSDK.getSubChannel = function () {}; WXSDK.loginLog = function () { var options = wx.getLaunchOptionsSync(); console.log("xhj------------", options); if (options == null || options.query == null || options.query.weixinadinfo == null) return; var weixinadinfoArr = options.query.weixinadinfo.split("."); var aid = weixinadinfoArr[0]; if (aid == null) return; var url = window.location.href; console.log("xhj+++++++++++++", url); wx.request({ url: "", method: "POST", data: { sku: options.query.sku, app_id: options.query.app_id, sy_ad_id: options.query.sy_ad_id, channel_id: options.query.channel_id, gdt_vid: options.query.gdt_vid, weixinadinfo: options.query.weixinadinfo, sub_ad_id: aid, url: url }, header: { 'content-type': 'application/json' // 默认值 }, success: function success(res) { console.log("上报登录信息返回"); console.log(res); } }); }; WXSDK.download_qrcode_png = function () { wx.request({ url: 'https://s1-h5mlf-h5sszg.shiyuegame.com/api.php/pf/wx/token', method: "POST", data: { cps: "wxtest" }, header: { 'content-type': 'application/json' // 默认值 }, success: function success(res1) { if (res1.data.error == 666) { // 请求成功 //res1.data.msg.access_token, console.log("获取assess_token"); console.log(res1); var query = wx.getLaunchOptionsSync(); var scene = decodeURIComponent(query.scene); console.log("获取小游戏scene"); console.log(query); console.log(scene); console.log("请求二维码相关"); } } }); }; WXSDK.createGameClubButton = function () { var clubButton = wx.createGameClubButton({ icon: 'green', style: { left: 10, top: 76, width: 40, height: 40 } }); }; module.exports = WXSDK; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcc2Rrc1xcd3hfc2RrLmpzIl0sIm5hbWVzIjpbIndpbmRvdyIsIlBBQ0tBR0VfTkFNRSIsIkxvZ2luQ29udHJvbGxlciIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsInNoYTEiLCJXWFNESyIsInd4IiwiYWNjb3VudF9pbmZvIiwidXNlcl9pbmZvIiwiaW5pdFNESyIsImNvbnNvbGUiLCJsb2ciLCJpbml0VG9wSW5mbyIsInNldEtlZXBTY3JlZW5PbiIsImtlZXBTY3JlZW5PbiIsIm9uU2hvdyIsInJlcyIsIm9uSGlkZSIsInNob3dTaGFyZU1lbnUiLCJzdWNjZXNzIiwib25TaGFyZUFwcE1lc3NhZ2UiLCJ0aXRsZSIsImltYWdlVXJsIiwiZ2V0U2V0dGluZyIsImNjIiwiYXV0aFNldHRpbmciLCJjaGVja0xvZ2luU3RhdHVzIiwiaW5mbyIsImdldFN5c3RlbUluZm9TeW5jIiwiYnV0dG9uIiwiY3JlYXRlVXNlckluZm9CdXR0b24iLCJ0eXBlIiwidGV4dCIsInN0eWxlIiwibGVmdCIsImJvdHRvbSIsIndpZHRoIiwic2NyZWVuV2lkdGgiLCJoZWlnaHQiLCJzY3JlZW5IZWlnaHQiLCJsaW5lSGVpZ2h0IiwiYmFja2dyb3VuZENvbG9yIiwiY29sb3IiLCJ0ZXh0QWxpZ24iLCJmb250U2l6ZSIsImJvcmRlclJhZGl1cyIsInNob3ciLCJvblRhcCIsImhpZGUiLCJtZW51SW5mbyIsImdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3QiLCJzeXN0ZW1JbmZvIiwiV1hfRklUIiwidG9wIiwidmFsdWUiLCJnZXRTdG9yYWdlU3luYyIsImNoZWNrU2Vzc2lvbktleSIsImxvZ2luIiwiZSIsImNvZGUiLCJyZXF1ZXN0IiwidXJsIiwibWV0aG9kIiwiZGF0YSIsImpzX2NvZGUiLCJjcHMiLCJoZWFkZXIiLCJlcnJvciIsIm1zZyIsInNldFN0b3JhZ2VTeW5jIiwiaW5pdFVzZXJJbmZvIiwiZXJyTXNnIiwiY2hlY2tTZXNzaW9uIiwiZmFpbCIsImdldFVzZXJJbmZvIiwic2V0TG9naW5EYXRhIiwic2RrQmFja0xvZ2luIiwibG9naW5fZGF0YSIsInVzck5hbWUiLCJvcGVuaWQiLCJwYXNzd29yZCIsImdldEluc3RhbmNlIiwibG9naW5QbGF0Zm9ybVJlcXVlc3QiLCJwYXkiLCJtb25leSIsImJ1eU51bSIsInByb2RJZCIsInByb2R1Y3ROYW1lIiwicHJvZHVjdERlc2MiLCJleHRlbnNpb24iLCJjb2luTnVtIiwibG9naW5JbmZvIiwibW9kZWwiLCJnZXRMb2dpbkluZm8iLCJyb2xlVm8iLCJnZXRSb2xlVm8iLCJzZXZlckluZm8iLCJzcnZfaWQiLCJzcGxpdCIsInBsYXRmb3JtIiwiem9uZV9pZCIsInN5c3RlbU5hbWUiLCJzeXN0ZW0iLCJwZiIsImluZGV4T2YiLCJ0aW1lIiwic2lnbiIsImhvc3QiLCJkYXRlX3RpbWUiLCJNYXRoIiwiY2VpbCIsIkRhdGUiLCJub3ciLCJjaGFubmVsIiwiQ0hBTk5FTCIsIl9leHRlbnNpb24iLCJyaWQiLCJiYXNlXzY0IiwiQmFzZTY0IiwiZW5jb2RlIiwiYmFsYW5jZSIsImFtdCIsImFwcF9yZW1hcmsiLCJyZXF1ZXN0TWlkYXNQYXltZW50IiwibW9kZSIsImVudiIsIm9mZmVySWQiLCJjdXJyZW5jeVR5cGUiLCJidXlRdWFudGl0eSIsInpvbmVJZCIsImNvbXBsZXRlIiwibG9naW5HYW1lIiwidGVzdF9hY291bnQiLCJnZXRUZXN0QWNjb3VudCIsImFjY291bnQiLCJyYXdEYXRhIiwic2lnbmF0dXJlIiwicGFja2FnZV9uYW1lIiwicGFja2FnZV92ZXJzaW9uIiwiUEFDS0FHRV9WRVJTSU9OIiwiUExBVEZPUk0iLCJ0b2tlbiIsInNlc3Npb25fa2V5IiwidGltZXN0YW1wIiwiY3VzU0RLTG9naW4iLCJzdWJtaXRMb2dpbiIsInN1Ym1pdF91cmwiLCJnZXRDdXJyQ2hhbm5lbCIsImdldFN1YkNoYW5uZWwiLCJsb2dpbkxvZyIsIm9wdGlvbnMiLCJnZXRMYXVuY2hPcHRpb25zU3luYyIsInF1ZXJ5Iiwid2VpeGluYWRpbmZvIiwid2VpeGluYWRpbmZvQXJyIiwiYWlkIiwibG9jYXRpb24iLCJocmVmIiwic2t1IiwiYXBwX2lkIiwic3lfYWRfaWQiLCJjaGFubmVsX2lkIiwiZ2R0X3ZpZCIsInN1Yl9hZF9pZCIsImRvd25sb2FkX3FyY29kZV9wbmciLCJyZXMxIiwic2NlbmUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJjcmVhdGVHYW1lQ2x1YkJ1dHRvbiIsImNsdWJCdXR0b24iLCJpY29uIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQUEsTUFBTSxDQUFDQyxZQUFQLEdBQXNCLFNBQXRCLEVBQWtDOztBQUVsQyxJQUFJQyxlQUFlLEdBQUdDLE9BQU8sQ0FBQyxrQkFBRCxDQUE3Qjs7QUFDQSxJQUFJQyxjQUFjLEdBQUdELE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJRSxJQUFJLEdBQUdGLE9BQU8sQ0FBQyxVQUFELENBQWxCOztBQUVBLElBQUlHLEtBQUssR0FBRyxTQUFSQSxLQUFRLEdBQVc7QUFDbkJDLEVBQUFBLEVBQUUsR0FBRyxJQUFMO0FBQ0gsQ0FGRCxFQUlBOzs7QUFDQUQsS0FBSyxDQUFDRSxZQUFOLEdBQXFCLElBQXJCO0FBQ0FGLEtBQUssQ0FBQ0csU0FBTixHQUFrQixJQUFsQixFQUVBOztBQUNBSCxLQUFLLENBQUNJLE9BQU4sR0FBZ0IsWUFBVztBQUN2QkMsRUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQVksU0FBWjtBQUNBRCxFQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWVosTUFBWjtBQUVBLE1BQUksQ0FBQ0EsTUFBTSxDQUFDTyxFQUFaLEVBQWlCO0FBRWpCLE9BQUtNLFdBQUw7QUFFQU4sRUFBQUEsRUFBRSxDQUFDTyxlQUFILENBQW1CO0FBQ2ZDLElBQUFBLFlBQVksRUFBRTtBQURDLEdBQW5CO0FBR0FSLEVBQUFBLEVBQUUsQ0FBQ1MsTUFBSCxDQUFVLFVBQVNDLEdBQVQsRUFB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SDtBQUVIbUIsTUFBQUEsR0FBRyxFQUFFLEVBRkY7QUFHSGpCLE1BQUFBLEtBQUssRUFBRSxFQUhKO0FBSUhFLE1BQUFBLE1BQU0sRUFBRTtBQUpMO0FBRmdDLEdBQXhCLENBQWpCO0FBU0QsQ0FWRDs7QUFZQXFJLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnZLLEtBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLy8gd2luZG93LlBMQVRGT1JNID0gXCJ3eFwiOyAgICAgICAgLy8g5bmz5Y+w5Y+3XHJcbi8vIHdpbmRvdy5QQUNLQUdFX1ZFUlNJT04gPSBcIjAuMC4yXCI7XHJcbi8vIHdpbmRvdy5DSEFOTkVMID0gXCJoNXNzemdfd3hcIjsgIC8vIOa4oOmBk+WPt1xyXG53aW5kb3cuUEFDS0FHRV9OQU1FID0gXCLpl6rng4HkuYvlhYnlj6PooovniYhcIjsgIC8vIOa4oOmBk+WPt1xyXG5cclxudmFyIExvZ2luQ29udHJvbGxlciA9IHJlcXVpcmUoXCJsb2dpbl9jb250cm9sbGVyXCIpO1xyXG52YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xyXG52YXIgc2hhMSA9IHJlcXVpcmUoJ3NoYTEubWluJyk7XHJcblxyXG52YXIgV1hTREsgPSBmdW5jdGlvbigpIHtcclxuICAgIHd4ID0gbnVsbDtcclxufVxyXG5cclxuLy8gN2RlYzljNGU0YzI2YzQ2Y2YxYTRlMjhhMDgzZjgyYmRcclxuV1hTREsuYWNjb3VudF9pbmZvID0gbnVsbDtcclxuV1hTREsudXNlcl9pbmZvID0gbnVsbDtcclxuXHJcbi8vIOa4uOaIj+WKoOi9veWujOaIkOOAgeWIneWni+WMllNES1xyXG5XWFNESy5pbml0U0RLID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIuW+ruS/oVNES+ebuOWFs1wiKTtcclxuICAgIGNvbnNvbGUubG9nKHdpbmRvdyk7XHJcblxyXG4gICAgaWYgKCF3aW5kb3cud3gpICByZXR1cm47XHJcbiAgICBcclxuICAgIHRoaXMuaW5pdFRvcEluZm8oKTtcclxuICAgIFxyXG4gICAgd3guc2V0S2VlcFNjcmVlbk9uKHtcclxuICAgICAgICBrZWVwU2NyZWVuT246IHRydWVcclxuICAgIH0pXHJcbiAgICB3eC5vblNob3coZnVuY3Rpb24ocmVzKXtcclxuICAgICAgd3guc2V0S2VlcFNjcmVlbk9uKHtcclxuICAgICAgICBrZWVwU2NyZWVuT246IHRydWVcclxuICAgICAgfSlcclxuICAgIH0pO1xyXG5cclxuICAgIHd4Lm9uSGlkZShmdW5jdGlvbihyZXMpe1xyXG4gICAgICB3eC5zZXRLZWVwU2NyZWVuT24oe1xyXG4gICAgICAgIGtlZXBTY3JlZW5PbjogZmFsc2VcclxuICAgICAgfSlcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICB3eC5zaG93U2hhcmVNZW51KHtcclxuICAgICAgc3VjY2VzczogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgd3gub25TaGFyZUFwcE1lc3NhZ2UoKCkgPT4gKHtcclxuICAgICAgICAgIHRpdGxlOiAn6Zeq54OB5LmL5YWJJyxcclxuICAgICAgICAgIGltYWdlVXJsOiAnJyAvLyDlm77niYcgVVJMXHJcbiAgICAgICAgfSkpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgd3guZ2V0U2V0dGluZyh7XHJcbiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykge1xyXG4gICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgIGlmIChyZXMuYXV0aFNldHRpbmdbXCJzY29wZS51c2VySW5mb1wiXSkge1xyXG4gICAgICAgICAgV1hTREsuY2hlY2tMb2dpblN0YXR1cygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YXIgaW5mbyA9IHd4LmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgICB2YXIgYnV0dG9uID0gd3guY3JlYXRlVXNlckluZm9CdXR0b24oe1xyXG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXHJcbiAgICAgICAgICAgIHRleHQ6ICcnLFxyXG4gICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICBsZWZ0OiAwLFxyXG4gICAgICAgICAgICBib3R0b206IDAsXHJcbiAgICAgICAgICAgIHdpZHRoOiBpbmZvLnNjcmVlbldpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGluZm8uc2NyZWVuSGVpZ2h0LzIsXHJcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IDQwLFxyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcnLFxyXG4gICAgICAgICAgICBjb2xvcjogJyNmZmZmZmYnLFxyXG4gICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgICAgICBmb250U2l6ZTogMTYsXHJcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogNFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnV0dG9uLnNob3coKTtcclxuICAgICAgICAgIGJ1dHRvbi5vblRhcCgocmVzKT0+e1xyXG4gICAgICAgICAgICBidXR0b24uaGlkZSgpO1xyXG4gICAgICAgICAgICBXWFNESy5jaGVja0xvZ2luU3RhdHVzKCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcylcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxuV1hTREsuaW5pdFRvcEluZm8gPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBtZW51SW5mbyA9IHd4LmdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHZhciBzeXN0ZW1JbmZvID0gd3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcclxuICAgIHdpbmRvdy5XWF9GSVQgPSBtZW51SW5mby50b3AgLyBzeXN0ZW1JbmZvLnNjcmVlbkhlaWdodCAqIDAuOCB8fCAwO1xyXG4gICAgY29uc29sZS5sb2coXCLlvq7kv6HlsI/muLjmiI/oj5zljZXmoI/nmoTpgILphY3lgLxcIik7XHJcbiAgICBjYy5sb2coV1hfRklUKTtcclxufVxyXG5cclxuV1hTREsuY2hlY2tMb2dpblN0YXR1cyA9IGZ1bmN0aW9uKCkge1xyXG4gIC8vIOiOt+WPluacrOWcsGtleVxyXG4gIHRyeSB7XHJcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmFjY291bnRfaW5mbyA9IHd4LmdldFN0b3JhZ2VTeW5jKCdhY2NvdW50X2luZm8nKVxyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIFdYU0RLLmNoZWNrU2Vzc2lvbktleSh2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBXWFNESy5sb2dpbigpO1xyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIC8vIERvIHNvbWV0aGluZyB3aGVuIGNhdGNoIGVycm9yXHJcbiAgfVxyXG59XHJcblxyXG5cclxuV1hTREsubG9naW4gPSBmdW5jdGlvbigpIHtcclxuICBpZiAod2luZG93Lnd4KSB7XHJcbiAgICAgIHd4LmxvZ2luKHtcclxuICAgICAgICAgIHN1Y2Nlc3MgKHJlcykge1xyXG4gICAgICAgICAgICBpZiAocmVzLmNvZGUpIHtcclxuICAgICAgICAgICAgICAgIC8v5Y+R6LW3572R57uc6K+35rGCXHJcbiAgICAgICAgICAgICAgICBjYy5sb2coXCLliJ3lp4vljJbnmbvlvZXkv6Hmga/ov5Tlm55cIik7XHJcbiAgICAgICAgICAgICAgICBjYy5sb2cocmVzKTtcclxuICAgICAgICAgICAgICAgIHd4LnJlcXVlc3Qoe1xyXG4gICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL3MxLXd4LWg1c3N6Zy5zaGl5dWVnYW1lLmNvbS9hcGkucGhwL3BmL3d4L2xvZ2luLycsXHJcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICBqc19jb2RlOiByZXMuY29kZSxcclxuICAgICAgICAgICAgICAgICAgICBjcHM6IFwid3h0ZXN0XCJcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgc3VjY2VzcyAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2MubG9nKFwi5pyN5Yqh5Zmo55m75b2V5L+h5oGv6L+U5ZueXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS/neWtmOeUqOaIt+S/oeaBr+WIsOacrOWcsFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLmxvZyhyZXMuZGF0YS5tc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1hTREsuYWNjb3VudF9pbmZvID0gcmVzLmRhdGEubXNnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3guc2V0U3RvcmFnZVN5bmMoJ2FjY291bnRfaW5mbycsIHJlcy5kYXRhLm1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDor7fmsYLmiJDlip/lvIDlp4vnmbvlvZXmuLjmiI9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdYU0RLLmluaXRVc2VySW5mbygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+eZu+W9leWksei0pe+8gScgKyByZXMuZXJyTXNnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuV1hTREsuY2hlY2tTZXNzaW9uS2V5ID0gZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgY2MubG9nKFwi5qCh6aqMa2V55piv5ZCm6L+H5pyfXCIpO1xyXG4gICAgICB3eC5jaGVja1Nlc3Npb24oe1xyXG4gICAgICAgIHN1Y2Nlc3MgKCkge1xyXG4gICAgICAgICAgLy8g5rKh5pyJ5aSx5pWI77yM57un57ut55m75b2VXHJcbiAgICAgICAgICBXWFNESy5pbml0VXNlckluZm8oKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZhaWwgKCkge1xyXG4gICAgICAgICAgLy8gc2Vzc2lvbl9rZXkg5bey57uP5aSx5pWI77yM6ZyA6KaB6YeN5paw5omn6KGM55m75b2V5rWB56iLXHJcbiAgICAgICAgICBXWFNESy5sb2dpbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIC8vIHd4LmdldFVzZXJJbmZvKHtcclxuICAgIC8vICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKSB7XHJcbiAgICAvLyAgICAgY29uc29sZS5sb2coXCLnlKjmiLfkv6Hmga9cIik7XHJcbiAgICAvLyAgICAgY29uc29sZS5sb2cocmVzKVxyXG5cclxuICAgIC8vICAgICAvLyDor7fmsYJhY2Nlc3NfdG9rZW5cclxuICAgIC8vICAgICBjYy5sb2coXCLlj5HpgIHliLDmnI3liqHlmajmoKHpqozmmK/lkKbov4fmnJ9cIik7XHJcbiAgICAvLyAgICAgY2MubG9nKGRhdGEpO1xyXG5cclxuICAgIC8vICAgICB3eC5yZXF1ZXN0KHtcclxuICAgIC8vICAgICAgIHVybDogJ2h0dHA6Ly9zMS1yZWxlYXNlLWg1c3N6Zy5zaGl5dWVnYW1lLmNvbS9hcGkucGhwL3BmL3d4L3Rva2VuJyxcclxuICAgIC8vICAgICAgIGRhdGE6IHtcclxuICAgIC8vICAgICAgICAgY3BzOiBcInd4dGVzdFwiXHJcbiAgICAvLyAgICAgICB9LFxyXG4gICAgLy8gICAgICAgaGVhZGVyOiB7XHJcbiAgICAvLyAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgLy8g6buY6K6k5YC8XHJcbiAgICAvLyAgICAgICB9LFxyXG4gICAgLy8gICAgICAgc3VjY2VzcyAocmVzMSkge1xyXG4gICAgLy8gICAgICAgICBpZiAocmVzMSAmJiByZXMxLmRhdGEpIHtcclxuICAgIC8vICAgICAgICAgICBjYy5sb2coXCJBU1NFU1NfVE9LRU7ov5Tlm55cIik7XHJcbiAgICAvLyAgICAgICAgICAgY2MubG9nKHJlczEpO1xyXG4gICAgLy8gICAgICAgICAgIGlmIChyZXMxLmRhdGEuZXJyb3IgPT0gNjY2KSB7ICAgIC8vIOivt+axguaIkOWKn1xyXG4gICAgLy8gICAgICAgICAgICAgY2MubG9nKFwi5qCh6aqMQVNTRVNTX1RPS0VO5piv5ZCm6L+H5pyfXCIpO1xyXG4gICAgLy8gICAgICAgICAgICAgdmFyIHNpZ25hdHVyZSA9IHNoYTEocmVzLnJhd0RhdGEgKyBkYXRhLnNlc3Npb25fa2V5KVxyXG4gICAgLy8gICAgICAgICAgICAgd3gucmVxdWVzdCh7XHJcbiAgICAvLyAgICAgICAgICAgICAgIHVybDogJ2h0dHA6Ly9zMS1yZWxlYXNlLWg1c3N6Zy5zaGl5dWVnYW1lLmNvbS9hcGkucGhwL3BmL3d4L2NoZWNrX3Nlc3Npb24nLFxyXG4gICAgLy8gICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiByZXMxLmRhdGEubXNnLmFjY2Vzc190b2tlbixcclxuICAgIC8vICAgICAgICAgICAgICAgICBvcGVuaWQ6IGRhdGEub3BlbmlkLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNwczogXCJ3eHRlc3RcIixcclxuICAgIC8vICAgICAgICAgICAgICAgfSxcclxuICAgIC8vICAgICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgIC8vICAgICAgICAgICAgICAgfSxcclxuICAgIC8vICAgICAgICAgICAgICAgc3VjY2VzcyAocmVzKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY2MubG9nKFwi5qCh6aqM57uT5p6cXCIpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkhISEhISEhISEhISEhISEhISEhISEhISEhcIik7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuagoemqjOaIkOWKn+W8gOWni+eZu+W9lea4uOaIj1wiKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfSlcclxuXHJcblxyXG4gICAgLy8gICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH0pXHJcblxyXG4gICAgLy8gICB9LFxyXG5cclxuICAgIC8vICAgZmFpbDogZnVuY3Rpb24ocmVzKSB7XHJcbiAgICAvLyAgICAgY29uc29sZS5sb2coXCJVVVVVVVVVVVVVVVVVVVVVdVwiKTtcclxuICAgIC8vICAgICBjb25zb2xlLmxvZyhyZXMpXHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH0pXHJcbn1cclxuXHJcbldYU0RLLmluaXRVc2VySW5mbyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICB3eC5nZXRVc2VySW5mbyh7XHJcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKSB7XHJcbiAgICAgICAgICBXWFNESy51c2VyX2luZm8gPSByZXM7XHJcbiAgICAgICAgICBjYy5sb2coXCLojrflj5bnlKjmiLfkv6Hmga/miJDlip9cIik7XHJcbiAgICAgICAgICBjYy5sb2cocmVzKTtcclxuICAgICAgICAgIFdYU0RLLnNldExvZ2luRGF0YShyZXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZhaWw6IGZ1bmN0aW9uKHJlcykge1xyXG4gICAgICAgICAgY2MubG9nKFwi6I635Y+W55So5oi35L+h5oGv5aSx6LSlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxufVxyXG5cclxuV1hTREsuc2V0TG9naW5EYXRhID0gZnVuY3Rpb24odXNlcl9pbmZvKSB7XHJcbiAgdGhpcy51c2VyX2luZm8gPSB1c2VyX2luZm87XHJcbiAgdGhpcy5zZGtCYWNrTG9naW4oKTtcclxufVxyXG5cclxuLy8gU0RL55m75b2V5oiQ5Yqf5Zue6LCDXHJcbldYU0RLLnNka0JhY2tMb2dpbiA9IGZ1bmN0aW9uKCkge1xyXG4gIHZhciBsb2dpbl9kYXRhID0ge307XHJcbiAgbG9naW5fZGF0YS51c3JOYW1lID0gXCJ3eF9cIiArIHRoaXMuYWNjb3VudF9pbmZvLm9wZW5pZDtcclxuICBsb2dpbl9kYXRhLnBhc3N3b3JkID0gXCJ3eDEyMzQ1NlwiO1xyXG4gIGNvbnNvbGUubG9nKFwi5b6u5L+h5pWw5o2u5Yid5aeL6Iqx5oiQ5Yqf77yM5byA5aeL6K+35rGC5pyN5Yqh5Zmo5YiX6KGoXCIpO1xyXG4gIExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmxvZ2luUGxhdGZvcm1SZXF1ZXN0KGxvZ2luX2RhdGEpO1xyXG59XHJcblxyXG5XWFNESy5wYXkgPSBmdW5jdGlvbihtb25leSwgYnV5TnVtLCBwcm9kSWQsIHByb2R1Y3ROYW1lLCBwcm9kdWN0RGVzYywgZXh0ZW5zaW9uLCBjb2luTnVtKSB7XHJcbiAgY29uc29sZS5sb2coXCLlvIDlp4vosIPnlKjmlK/ku5hcIik7XHJcbiAgdmFyIGxvZ2luSW5mbyA9IExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm1vZGVsLmdldExvZ2luSW5mbygpO1xyXG4gIHZhciByb2xlVm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xyXG4gIGlmIChyb2xlVm8gPT0gbnVsbCkgcmV0dXJuO1xyXG4gIHZhciBzZXZlckluZm8gPSByb2xlVm8uc3J2X2lkLnNwbGl0KFwiX1wiKTtcclxuICB2YXIgcGxhdGZvcm0gPSBzZXZlckluZm9bMF0gfHwgXCJcIjtcclxuICB2YXIgem9uZV9pZCA9IHNldmVySW5mb1sxXTtcclxuXHJcbiAgdmFyIHN5c3RlbUluZm8gPSB3eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gIHZhciBzeXN0ZW1OYW1lID0gc3lzdGVtSW5mby5zeXN0ZW07XHJcbiAgdmFyIHBmID0gXCJcIjtcclxuICBpZihzeXN0ZW1OYW1lLmluZGV4T2YoXCJpT1NcIik+LTEpe1xyXG4gICAgLy8gcmV0dXJuO1xyXG4gIH1lbHNlIGlmKHN5c3RlbU5hbWUuaW5kZXhPZihcIkFuZHJvaWRcIik+LTEpe1xyXG4gICAgcGYgPSBcImFuZHJvaWRcIjtcclxuICB9XHJcbiAgdmFyIGRhdGEgPSB7XHJcbiAgICAgIG9wZW5pZDogV1hTREsuYWNjb3VudF9pbmZvLm9wZW5pZCxcclxuICAgICAgdGltZTpXWFNESy5hY2NvdW50X2luZm8udGltZSxcclxuICAgICAgc2lnbjpXWFNESy5hY2NvdW50X2luZm8uc2lnbixcclxuICAgICAgem9uZV9pZDogem9uZV9pZCxcclxuICAgICAgcGY6IHBmLFxyXG4gICAgICBjcHM6IFwid3h0ZXN0XCJcclxuICAgIH1cclxuICAgIFxyXG4gIHd4LnJlcXVlc3Qoe1xyXG4gICAgdXJsOiBcImh0dHBzOi8vXCIrbG9naW5JbmZvLmhvc3QrXCIvYXBpLnBocC9wZi93eC9iYWxhbmNlXCIsXHJcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgZGF0YTogZGF0YSxcclxuICAgIGhlYWRlcjoge1xyXG4gICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIC8vIOm7mOiupOWAvFxyXG4gICAgfSxcclxuICAgIHN1Y2Nlc3MgKHJlcykge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIuivt+axguS9meminVwiLHJlcyk7XHJcbiAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcclxuICAgICAgICBpZiAocmVzLmRhdGEuZXJyb3IgPT0gNjY2KSB7ICAgIC8vIOivt+axguaIkOWKn1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAvL+aXtumXtOaIs1xyXG4gICAgICAgICAgICAgIHZhciBkYXRlX3RpbWUgPSBNYXRoLmNlaWwoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG5cclxuICAgICAgICAgICAgICBwcm9kdWN0TmFtZSA9IHByb2R1Y3ROYW1lIHx8IChtb25leSAqIDEwKSArIFwi6ZK755+zXCI7XHJcbiAgICAgICAgICAgICAgdmFyIGNwcyA9IFwid3h0ZXN0XCI7XHJcbiAgICAgICAgICAgICAgdmFyIGNoYW5uZWwgPSBDSEFOTkVMO1xyXG5cclxuICAgICAgICAgICAgICB2YXIgX2V4dGVuc2lvbiA9IHJvbGVWby5yaWQgKyBcIiQkXCIgKyBwbGF0Zm9ybSArIFwiJCRcIiArIHpvbmVfaWQgK1xyXG4gICAgICAgICAgICAgICAgXCIkJFwiICsgY2hhbm5lbCArIFwiJCRcIiArIHByb2RJZCArIFwiJCRcIiArIHByb2R1Y3ROYW1lICsgXCIkJFwiICsgY3BzICsgXCIkJFwiICsgZGF0ZV90aW1lO1xyXG4gICAgICAgICAgICAgICAgICBjYy5sb2coXCLmi5PlsZXlj4LmlbBfZXh0ZW5zaW9uPT0+XCIsIF9leHRlbnNpb24pXHJcbiAgICAgICAgICAgICAgICAgIHZhciBiYXNlXzY0ID0gcmVxdWlyZShcImJhc2U2NFwiKS5CYXNlNjQ7XHJcbiAgICAgICAgICAgICAgICAgIF9leHRlbnNpb24gPSBiYXNlXzY0LmVuY29kZShfZXh0ZW5zaW9uKTtcclxuICAgICAgICAgICAgICAgICAgY2MubG9nKFwi5ouT5bGV5Y+C5pWwX2V4dGVuc2lvbj09MjIyMjIyMjIyPlwiLCBfZXh0ZW5zaW9uKVxyXG5cclxuICAgICAgICAgICAgICBpZihyZXMuZGF0YS5tc2cpe1xyXG4gICAgICAgICAgICAgICAgaWYocmVzLmRhdGEubXNnLmJhbGFuY2U+PW1vbmV5KjEwKXtcclxuICAgICAgICAgICAgICAgICAgd3gucmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBcImh0dHBzOi8vXCIrbG9naW5JbmZvLmhvc3QrXCIvYXBpLnBocC9wZi93eC9wYXlcIixcclxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICAgIG9wZW5pZDogV1hTREsuYWNjb3VudF9pbmZvLm9wZW5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgIHpvbmVfaWQ6IHpvbmVfaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwZjogcGYsXHJcbiAgICAgICAgICAgICAgICAgICAgICBhbXQ6bW9uZXkqMTAsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aW1lOldYU0RLLmFjY291bnRfaW5mby50aW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgc2lnbjpXWFNESy5hY2NvdW50X2luZm8uc2lnbixcclxuICAgICAgICAgICAgICAgICAgICAgIGFwcF9yZW1hcms6X2V4dGVuc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgIGNwczogY3BzXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgLy8g6buY6K6k5YC8XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6aKE5LiL5Y2V6L+U5ZueXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhLmVycm9yID09IDY2NikgeyAgICAvLyDor7fmsYLmiJDlip9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYocmVzLmRhdGEuZXJyb3IgPT0gMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHJlcy5kYXRhLmVycm9yID09IC0xKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuWFheWAvOWksei0pVwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgd3gucmVxdWVzdE1pZGFzUGF5bWVudCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTpcImdhbWVcIixcclxuICAgICAgICAgICAgICAgICAgICBlbnY6MSwvL1xyXG4gICAgICAgICAgICAgICAgICAgIG9mZmVySWQ6XCIxNDUwMDIxODgxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lUeXBlOlwiQ05ZXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm06cGYsXHJcbiAgICAgICAgICAgICAgICAgICAgYnV5UXVhbnRpdHk6bW9uZXkqMTAsXHJcbiAgICAgICAgICAgICAgICAgICAgem9uZUlkOnpvbmVfaWQsXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ZnVuY3Rpb24ocmVzKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pSv5LuY5Zue6LCD5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICB3eC5yZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBcImh0dHBzOi8vXCIrbG9naW5JbmZvLmhvc3QrXCIvYXBpLnBocC9wZi93eC9wYXlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5pZDogV1hTREsuYWNjb3VudF9pbmZvLm9wZW5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lX2lkOiB6b25lX2lkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBmOiBwZixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhbXQ6bW9uZXkqMTAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTpXWFNESy5hY2NvdW50X2luZm8udGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduOldYU0RLLmFjY291bnRfaW5mby5zaWduLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFwcF9yZW1hcms6X2V4dGVuc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjcHM6IGNwc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIC8vIOm7mOiupOWAvFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIumihOS4i+WNlei/lOWbnlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYocmVzLmRhdGEuZXJyb3IgPT0gMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihyZXMuZGF0YS5lcnJvciA9PSAtMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YWF5YC85aSx6LSlXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZhaWw6ZnVuY3Rpb24ocmVzKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pSv5LuY5Zue6LCD5aSx6LSlXCIscmVzKVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6ZnVuY3Rpb24ocmVzKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pSv5LuY5Zue6LCDY29tcGxldGVcIixyZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgXHJcbiAgXHJcbiAgXHJcbn1cclxuXHJcbldYU0RLLmxvZ2luR2FtZSA9IGZ1bmN0aW9uKCkge1xyXG4gIHZhciB0ZXN0X2Fjb3VudCA9IExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFRlc3RBY2NvdW50KCk7XHJcbiAgY2MubG9nKFwi5L2/55So5LqG5b6u5L+h5rWL6K+V6LSm5Y+3XCIpO1xyXG4gIGNjLmxvZyh0ZXN0X2Fjb3VudCk7XHJcblxyXG4gIC8vIFNES+ivt+axgueZu+W9lea4uOaIj1xyXG4gIHZhciBsb2dpbl9kYXRhID0ge307XHJcbiAgaWYgKHRlc3RfYWNvdW50KSB7XHJcbiAgICBsb2dpbl9kYXRhLmFjY291bnQgPSB0ZXN0X2Fjb3VudDtcclxuICB9IGVsc2Uge1xyXG4gICAgbG9naW5fZGF0YS5hY2NvdW50ID0gXCJ3eF9cIiArIHRoaXMuYWNjb3VudF9pbmZvLm9wZW5pZDtcclxuICB9XHJcbiAgbG9naW5fZGF0YS5yYXdEYXRhID0gdGhpcy51c2VyX2luZm8ucmF3RGF0YTtcclxuICBsb2dpbl9kYXRhLnNpZ25hdHVyZSA9IHRoaXMudXNlcl9pbmZvLnNpZ25hdHVyZTtcclxuICBsb2dpbl9kYXRhLmNoYW5uZWwgPSBDSEFOTkVMO1xyXG4gIGxvZ2luX2RhdGEucGFja2FnZV9uYW1lID0gUEFDS0FHRV9OQU1FO1xyXG4gIGxvZ2luX2RhdGEucGFja2FnZV92ZXJzaW9uID0gUEFDS0FHRV9WRVJTSU9OO1xyXG4gIGxvZ2luX2RhdGEucGxhdGZvcm0gPSBQTEFURk9STTtcclxuICBsb2dpbl9kYXRhLnRva2VuID0gV1hTREsuYWNjb3VudF9pbmZvLnNlc3Npb25fa2V5O1xyXG4gIGxvZ2luX2RhdGEudGltZXN0YW1wID0gV1hTREsuYWNjb3VudF9pbmZvLnRpbWU7XHJcbiAgbG9naW5fZGF0YS5zaWduID0gV1hTREsuYWNjb3VudF9pbmZvLnNpZ247XHJcblxyXG4gIExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmN1c1NES0xvZ2luKGxvZ2luX2RhdGEpO1xyXG59XHJcblxyXG4vLyDpgJrnn6XmnI3liqHlmajmiJDlip9cclxuV1hTREsuc3VibWl0TG9naW4gPSBmdW5jdGlvbih1cmwpIHtcclxuICAgIGlmICh1cmwpIHtcclxuICAgICAgdmFyIHN1Ym1pdF91cmwgPSBcImh0dHBzOi8vXCIgKyB1cmwgKyBcIi9hcGkucGhwL3BmL3d4L3Nlc3Npb25cIjtcclxuICAgICAgY29uc29sZS5sb2coc3VibWl0X3VybCk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFdYU0RLLmFjY291bnRfaW5mbyk7XHJcblxyXG4gICAgICB3eC5yZXF1ZXN0KHtcclxuICAgICAgICB1cmw6IHN1Ym1pdF91cmwsXHJcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBzZXNzaW9uX2tleTogV1hTREsuYWNjb3VudF9pbmZvLnNlc3Npb25fa2V5LFxyXG4gICAgICAgICAgb3BlbmlkOiBXWFNESy5hY2NvdW50X2luZm8ub3BlbmlkLFxyXG4gICAgICAgICAgdGltZTpXWFNESy5hY2NvdW50X2luZm8udGltZSxcclxuICAgICAgICAgIHNpZ246V1hTREsuYWNjb3VudF9pbmZvLnNpZ24sXHJcbiAgICAgICAgICBjcHM6IFwid3h0ZXN0XCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIGhlYWRlcjoge1xyXG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHN1Y2Nlc3MgKHJlcykge1xyXG4gICAgICAgICAgY2MubG9nKFwi5pyN5Yqh5Zmo55m75b2V5L+h5oGv6L+U5ZueXCIpO1xyXG4gICAgICAgICAgY2MubG9nKHJlcyk7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5kYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcy5kYXRhKTtcclxuICAgICAgICAgICAgaWYgKHJlcy5kYXRhLmVycm9yID09IDY2NikgeyAgICAvLyDor7fmsYLmiJDlip9cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcblxyXG4gICAgfSBcclxufVxyXG5cclxuV1hTREsuZ2V0Q3VyckNoYW5uZWwgPSBmdW5jdGlvbigpIHtcclxuXHJcbn1cclxuXHJcbldYU0RLLmdldFN1YkNoYW5uZWwgPSBmdW5jdGlvbigpIHtcclxuICBcclxufVxyXG5cclxuXHJcbldYU0RLLmxvZ2luTG9nID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIG9wdGlvbnMgPSB3eC5nZXRMYXVuY2hPcHRpb25zU3luYygpO1xyXG4gIGNvbnNvbGUubG9nKFwieGhqLS0tLS0tLS0tLS0tXCIsb3B0aW9ucyk7XHJcbiAgXHJcbiAgaWYob3B0aW9ucyA9PSBudWxsIHx8IG9wdGlvbnMucXVlcnkgPT0gbnVsbCB8fCBvcHRpb25zLnF1ZXJ5LndlaXhpbmFkaW5mbyA9PSBudWxsKXJldHVybjtcclxuICBcclxuICB2YXIgd2VpeGluYWRpbmZvQXJyID0gb3B0aW9ucy5xdWVyeS53ZWl4aW5hZGluZm8uc3BsaXQoXCIuXCIpO1xyXG4gIHZhciBhaWQgPSB3ZWl4aW5hZGluZm9BcnJbMF07XHJcbiAgaWYoYWlkID09IG51bGwpcmV0dXJuO1xyXG5cclxuICB2YXIgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgY29uc29sZS5sb2coXCJ4aGorKysrKysrKysrKysrXCIsdXJsKTtcclxuICB3eC5yZXF1ZXN0KHtcclxuICAgIHVybDogXCJcIixcclxuICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICBkYXRhOiB7XHJcbiAgICAgIHNrdTogb3B0aW9ucy5xdWVyeS5za3UsXHJcbiAgICAgIGFwcF9pZDogb3B0aW9ucy5xdWVyeS5hcHBfaWQsXHJcbiAgICAgIHN5X2FkX2lkOm9wdGlvbnMucXVlcnkuc3lfYWRfaWQsXHJcbiAgICAgIGNoYW5uZWxfaWQ6b3B0aW9ucy5xdWVyeS5jaGFubmVsX2lkLFxyXG4gICAgICBnZHRfdmlkOiBvcHRpb25zLnF1ZXJ5LmdkdF92aWQsXHJcbiAgICAgIHdlaXhpbmFkaW5mbzpvcHRpb25zLnF1ZXJ5LndlaXhpbmFkaW5mbyxcclxuICAgICAgc3ViX2FkX2lkOmFpZCxcclxuICAgICAgdXJsOnVybCxcclxuICAgIH0sXHJcbiAgICBoZWFkZXI6IHtcclxuICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgIH0sXHJcbiAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgY29uc29sZS5sb2coXCLkuIrmiqXnmbvlvZXkv6Hmga/ov5Tlm55cIik7XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlcyk7XHJcbiAgICB9XHJcbiAgfSlcclxufVxyXG5cclxuV1hTREsuZG93bmxvYWRfcXJjb2RlX3BuZyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICB3eC5yZXF1ZXN0KHtcclxuICAgICAgICB1cmw6ICdodHRwczovL3MxLWg1bWxmLWg1c3N6Zy5zaGl5dWVnYW1lLmNvbS9hcGkucGhwL3BmL3d4L3Rva2VuJyxcclxuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGNwczogXCJ3eHRlc3RcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIC8vIOm7mOiupOWAvFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3VjY2VzcyAocmVzMSkge1xyXG4gICAgICAgICAgaWYgKHJlczEuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcbiAgICAgICAgICAgICAgLy9yZXMxLmRhdGEubXNnLmFjY2Vzc190b2tlbixcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuiOt+WPlmFzc2Vzc190b2tlblwiKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMxKTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgcXVlcnkgPSB3eC5nZXRMYXVuY2hPcHRpb25zU3luYygpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHNjZW5lID0gZGVjb2RlVVJJQ29tcG9uZW50KHF1ZXJ5LnNjZW5lKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuiOt+WPluWwj+a4uOaIj3NjZW5lXCIpO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKHF1ZXJ5KTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhzY2VuZSk7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6K+35rGC5LqM57u056CB55u45YWzXCIpXHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuXHJcbn1cclxuXHJcbldYU0RLLmNyZWF0ZUdhbWVDbHViQnV0dG9uID0gZnVuY3Rpb24gKCkge1xyXG4gIHZhciBjbHViQnV0dG9uID0gd3guY3JlYXRlR2FtZUNsdWJCdXR0b24oe1xyXG7CoCDCoCBpY29uOiAnZ3JlZW4nLFxyXG7CoCDCoMKgc3R5bGU6IHtcclxuwqAgwqAgwqAgwqAgbGVmdDogMTAsIFxyXG7CoCDCoCDCoCDCoCB0b3A6IDc2LCBcclxuwqAgwqAgwqAgwqAgd2lkdGg6IDQwLFxyXG7CoCDCoCDCoCDCoCBoZWlnaHQ6IDQwXHJcbsKgIMKgIH1cclxuICB9KTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBXWFNESzsiXX0=