|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/sdks/qq_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, '5c5bd9NS+JOaLaYqbUdHfeN', 'qq_sdk');
|
// Scripts/sdks/qq_sdk.js
|
|
"use strict";
|
|
// window.PLATFORM = "qq"; // 平台号
|
// window.PACKAGE_VERSION = "_0_0_2";
|
// window.CHANNEL = "h5sszg_qq"; // 渠道号
|
window.PACKAGE_NAME = "闪烁之光口袋版"; // 渠道号
|
|
var LoginController = require("login_controller");
|
|
var RoleController = require("role_controller");
|
|
var VipEvent = require("vip_event");
|
|
var QQSDK = function QQSDK() {};
|
|
QQSDK.account_info = null;
|
QQSDK.user_info = null;
|
|
QQSDK.initSDK = function () {
|
console.log("QQSDK相关");
|
console.log(window);
|
if (!window.qq) return;
|
this.initTopInfo();
|
window.CHANNEL = "h5youyi_qq";
|
window.PLATFORM_NAME = "wb";
|
window.PLATFORM = "wb";
|
qq.setKeepScreenOn({
|
keepScreenOn: true
|
});
|
qq.onShow(function (res) {
|
qq.setKeepScreenOn({
|
keepScreenOn: true
|
});
|
});
|
qq.onHide(function (res) {
|
qq.setKeepScreenOn({
|
keepScreenOn: false
|
});
|
});
|
qq.showShareMenu({
|
showShareItems: ['qq', 'qzone', 'wechatFriends', 'wechatMoment'],
|
success: function success() {
|
qq.onShareAppMessage(function () {
|
return {
|
imageUrl: "https://s2.ax1x.com/2019/09/21/nvzZlj.png" // 图片 URL
|
|
};
|
});
|
}
|
});
|
qq.getSetting({
|
success: function success(res) {
|
cc.log(res);
|
|
if (res.authSetting["scope.userInfo"]) {
|
QQSDK.checkLoginStatus();
|
} else {
|
var info = qq.getSystemInfoSync();
|
var button = qq.createUserInfoButton({
|
type: 'text',
|
text: '',
|
style: {
|
left: 0,
|
//info.screenWidth/2-80,
|
top: info.screenHeight / 2,
|
//info.windowHeight - info.windowHeight/3,
|
width: info.screenWidth,
|
//160,
|
height: info.screenHeight / 2,
|
//40,
|
lineHeight: 0,
|
backgroundColor: '',
|
color: '#ffffff',
|
textAlign: 'center',
|
fontSize: 16,
|
borderRadius: 4
|
}
|
});
|
button.show();
|
button.onTap(function (res) {
|
button.hide();
|
QQSDK.checkLoginStatus();
|
console.log(res);
|
});
|
}
|
}
|
});
|
};
|
|
QQSDK.initTopInfo = function () {
|
var menuInfo = qq.getMenuButtonBoundingClientRect();
|
var systemInfo = qq.getSystemInfoSync();
|
|
if (menuInfo.top > 30) {
|
window.WX_FIT = menuInfo.top / systemInfo.screenHeight * 0.7 || 0;
|
} else {
|
window.WX_FIT = menuInfo.top / systemInfo.screenHeight * 0.1 || 0;
|
}
|
|
console.log("QQ小游戏菜单栏的适配值");
|
cc.log(WX_FIT);
|
};
|
|
QQSDK.checkLoginStatus = function () {
|
// 获取本地key
|
try {
|
var value = this.account_info = qq.getStorageSync('account_info');
|
|
if (value) {
|
QQSDK.checkSessionKey(value);
|
} else {
|
QQSDK.login();
|
}
|
} catch (e) {// Do something when catch error
|
}
|
};
|
|
QQSDK.login = function () {
|
if (window.qq) {
|
qq.login({
|
success: function success(res) {
|
if (res.code) {
|
//发起网络请求
|
cc.log("初始化登录信息返回");
|
cc.log(res);
|
qq.request({
|
url: 'https://s1-wb-h5sszg.shiyuegame.com/api.php/pf/qq/login',
|
method: "POST",
|
data: {
|
js_code: res.code,
|
cps: "qqtest"
|
},
|
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);
|
QQSDK.account_info = res.data.msg;
|
qq.setStorageSync('account_info', res.data.msg); // 请求成功开始登录游戏
|
|
QQSDK.initUserInfo();
|
} catch (e) {}
|
}
|
}
|
}
|
});
|
} else {
|
console.log('登录失败!' + res.errMsg);
|
}
|
}
|
});
|
}
|
};
|
|
QQSDK.checkSessionKey = function (data) {
|
cc.log("校验key是否过期");
|
qq.checkSession({
|
success: function success() {
|
// 没有失效,继续登录
|
QQSDK.initUserInfo();
|
},
|
fail: function fail() {
|
// session_key 已经失效,需要重新执行登录流程
|
QQSDK.login();
|
}
|
});
|
};
|
|
QQSDK.initUserInfo = function () {
|
qq.getUserInfo({
|
success: function success(res) {
|
QQSDK.user_info = res;
|
cc.log("获取用户信息成功");
|
cc.log(res);
|
QQSDK.setLoginData(res);
|
},
|
fail: function fail(res) {
|
cc.log("获取用户信息失败");
|
}
|
});
|
};
|
|
QQSDK.setLoginData = function (user_info) {
|
this.user_info = user_info;
|
this.sdkBackLogin();
|
}; // SDK登录成功回调
|
|
|
QQSDK.sdkBackLogin = function () {
|
var login_data = {};
|
login_data.usrName = "qq_" + this.account_info.openid;
|
login_data.password = "qq123456";
|
console.log("QQ数据初始花成功,开始请求服务器列表");
|
LoginController.getInstance().loginPlatformRequest(login_data);
|
};
|
|
QQSDK.loginGame = function () {
|
var test_acount = LoginController.getInstance().getTestAccount();
|
cc.log("使用了QQ测试账号");
|
cc.log(test_acount); // SDK请求登录游戏
|
|
var login_data = {};
|
|
if (test_acount) {
|
login_data.account = test_acount;
|
} else {
|
login_data.account = "qq_" + 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 = QQSDK.account_info.session_key;
|
login_data.timestamp = QQSDK.account_info.time;
|
login_data.sign = QQSDK.account_info.sign;
|
LoginController.getInstance().cusSDKLogin(login_data);
|
}; // 通知服务器成功
|
|
|
QQSDK.submitLogin = function (url) {
|
if (url) {
|
var submit_url = "https://" + url + "/api.php/pf/qq/session";
|
console.log(submit_url);
|
console.log(QQSDK.account_info);
|
qq.request({
|
url: submit_url,
|
method: "POST",
|
data: {
|
session_key: QQSDK.account_info.session_key,
|
openid: QQSDK.account_info.openid,
|
time: QQSDK.account_info.time,
|
sign: QQSDK.account_info.sign,
|
cps: "qqtest"
|
},
|
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) {// 请求成功
|
}
|
}
|
}
|
});
|
}
|
};
|
|
QQSDK.getCurrChannel = function () {};
|
|
QQSDK.canvasToTempFilePath = function () {
|
var canvas = cc.game.canvas;
|
canvas.toTempFilePath({
|
x: 0,
|
y: 510 * canvas.height / 1280,
|
width: canvas.width,
|
height: 550 * canvas.height / 1280,
|
destWidth: 500,
|
destHeight: 400,
|
fileType: "jpg",
|
success: function success(res) {
|
//.可以保存该截屏图片
|
qq.shareAppMessage({
|
imageUrl: res.tempFilePath
|
});
|
},
|
fail: function fail(res) {
|
//.可以保存该截屏图片
|
qq.shareAppMessage({
|
imageUrl: "https://s2.ax1x.com/2019/09/21/nvzZlj.png" // 图片 URL
|
|
});
|
}
|
});
|
};
|
|
QQSDK.getSubChannel = function () {}; // QQ小游戏余额查询
|
|
|
QQSDK.checkBalance = function () {
|
var loginInfo = LoginController.getInstance().model.getLoginInfo();
|
var data = {
|
openid: this.account_info.openid,
|
time: QQSDK.account_info.time,
|
sign: QQSDK.account_info.sign,
|
cps: "qqtest"
|
};
|
qq.request({
|
url: "https://" + loginInfo.host + "/api.php/pf/qq/balance",
|
method: "POST",
|
data: data,
|
header: {
|
'content-type': 'application/json' // 默认值
|
|
},
|
success: function success(res) {
|
if (res && res.data) {
|
if (res.data.error == 666) {
|
// 请求成功
|
try {
|
if (res.data.msg) {
|
gcore.GlobalEvent.fire(VipEvent.UPDATA_QQ_BALANCE, res.data.msg.remainder);
|
}
|
} catch (e) {}
|
}
|
}
|
}
|
});
|
}; //支付
|
|
|
QQSDK.pay = function (money, buyNum, prodId, productName, productDesc, extension, coinNum) {
|
var payCallFunc = function () {
|
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 = qq.getSystemInfoSync();
|
var systemName = systemInfo.system;
|
var pf = "";
|
|
if (systemName.indexOf("iOS") > -1) {// return;
|
} else if (systemName.indexOf("Android") > -1) {
|
pf = "qq_m_qq-2001-android-2011";
|
} //时间戳
|
|
|
var date_time = Math.ceil(Date.now() / 1000);
|
productName = productName || money * 10 + "钻石";
|
var cps = "qqtest";
|
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);
|
qq.request({
|
url: "https://" + loginInfo.host + "/api.php/pf/qq/pre_pay",
|
method: "POST",
|
data: {
|
openid: this.account_info.openid,
|
zone_id: zone_id,
|
pf: pf,
|
amt: money * 10,
|
good_num: 1,
|
time: QQSDK.account_info.time,
|
sign: QQSDK.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) {
|
// 请求成功
|
try {
|
qq.requestMidasPayment({
|
prepayId: res.data.msg.prepayId,
|
starCurrency: money * 10,
|
success: function success(res) {
|
console.log("支付回调成功", res);
|
},
|
fail: function fail(res) {
|
console.log("支付回调失败", res);
|
},
|
complete: function complete(res) {
|
console.log("支付回调complete", res);
|
}
|
});
|
} catch (e) {}
|
}
|
}
|
}
|
});
|
}.bind(this);
|
|
require("tips_controller").getInstance().showFirstCharge(payCallFunc);
|
};
|
|
module.exports = QQSDK;
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcc2Rrc1xccXFfc2RrLmpzIl0sIm5hbWVzIjpbIndpbmRvdyIsIlBBQ0tBR0VfTkFNRSIsIkxvZ2luQ29udHJvbGxlciIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsIlZpcEV2ZW50IiwiUVFTREsiLCJhY2NvdW50X2luZm8iLCJ1c2VyX2luZm8iLCJpbml0U0RLIiwiY29uc29sZSIsImxvZyIsInFxIiwiaW5pdFRvcEluZm8iLCJDSEFOTkVMIiwiUExBVEZPUk1fTkFNRSIsIlBMQVRGT1JNIiwic2V0S2VlcFNjcmVlbk9uIiwia2VlcFNjcmVlbk9uIiwib25TaG93IiwicmVzIiwib25IaWRlIiwic2hvd1NoYXJlTWVudSIsInNob3dTaGFyZUl0ZW1zIiwic3VjY2VzcyIsIm9uU2hhcmVBcHBNZXNzYWdlIiwiaW1hZ2VVcmwiLCJnZXRTZXR0aW5nIiwiY2MiLCJhdXRoU2V0dGluZyIsImNoZWNrTG9naW5TdGF0dXMiLCJpbmZvIiwiZ2V0U3lzdGVtSW5mb1N5bmMiLCJidXR0b24iLCJjcmVhdGVVc2VySW5mb0J1dHRvbiIsInR5cGUiLCJ0ZXh0Iiwic3R5bGUiLCJsZWZ0IiwidG9wIiwic2NyZWVuSGVpZ2h0Iiwid2lkdGgiLCJzY3JlZW5XaWR0aCIsImhlaWdodCIsImxpbmVIZWlnaHQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJjb2xvciIsInRleHRBbGlnbiIsImZvbnRTaXplIiwiYm9yZGVyUmFkaXVzIiwic2hvdyIsIm9uVGFwIiwiaGlkZSIsIm1lbnVJbmZvIiwiZ2V0TWVudUJ1dHRvbkJvdW5kaW5nQ2xpZW50UmVjdCIsInN5c3RlbUluZm8iLCJXWF9GSVQiLCJ2YWx1ZSIsImdldFN0b3JhZ2VTeW5jIiwiY2hlY2tTZXNzaW9uS2V5IiwibG9naW4iLCJlIiwiY29kZSIsInJlcXVlc3QiLCJ1cmwiLCJtZXRob2QiLCJkYXRhIiwianNfY29kZSIsImNwcyIsImhlYWRlciIsImVycm9yIiwibXNnIiwic2V0U3RvcmFnZVN5bmMiLCJpbml0VXNlckluZm8iLCJlcnJNc2ciLCJjaGVja1Nlc3Npb24iLCJmYWlsIiwiZ2V0VXNlckluZm8iLCJzZXRMb2dpbkRhdGEiLCJzZGtCYWNrTG9naW4iLCJsb2dpbl9kYXRhIiwidXNyTmFtZSIsIm9wZW5pZCIsInBhc3N3b3JkIiwiZ2V0SW5zdGFuY2UiLCJsb2dpblBsYXRmb3JtUmVxdWVzdCIsImxvZ2luR2FtZSIsInRlc3RfYWNvdW50IiwiZ2V0VGVzdEFjY291bnQiLCJhY2NvdW50IiwicmF3RGF0YSIsInNpZ25hdHVyZSIsImNoYW5uZWwiLCJwYWNrYWdlX25hbWUiLCJwYWNrYWdlX3ZlcnNpb24iLCJQQUNLQUdFX1ZFUlNJT04iLCJwbGF0Zm9ybSIsInRva2VuIiwic2Vzc2lvbl9rZXkiLCJ0aW1lc3RhbXAiLCJ0aW1lIiwic2lnbiIsImN1c1NES0xvZ2luIiwic3VibWl0TG9naW4iLCJzdWJtaXRfdXJsIiwiZ2V0Q3VyckNoYW5uZWwiLCJjYW52YXNUb1RlbXBGaWxlUGF0aCIsImNhbnZhcyIsImdhbWUiLCJ0b1RlbXBGaWxlUGF0aCIsIngiLCJ5IiwiZGVzdFdpZHRoIiwiZGVzdEhlaWdodCIsImZpbGVUeXBlIiwic2hhcmVBcHBNZXNzYWdlIiwidGVtcEZpbGVQYXRoIiwiZ2V0U3ViQ2hhbm5lbCIsImNoZWNrQmFsYW5jZSIsImxvZ2luSW5mbyIsIm1vZGVsIiwiZ2V0TG9naW5JbmZvIiwiaG9zdCIsImdjb3JlIiwiR2xvYmFsRXZlbnQiLCJmaXJlIiwiVVBEQVRBX1FRX0JBTEFOQ0UiLCJyZW1haW5kZXIiLCJwYXkiLCJtb25leSIsImJ1eU51bSIsInByb2RJZCIsInByb2R1Y3ROYW1lIiwicHJvZHVjdERlc2MiLCJleHRlbnNpb24iLCJjb2luTnVtIiwicGF5Q2FsbEZ1bmMiLCJyb2xlVm8iLCJnZXRSb2xlVm8iLCJzZXZlckluZm8iLCJzcnZfaWQiLCJzcGxpdCIsInpvbmVfaWQiLCJzeXN0ZW1OYW1lIiwic3lzdGVtIiwicGYiLCJpbmRleE9mIiwiZGF0ZV90aW1lIiwiTWF0aCIsImNlaWwiLCJEYXRlIiwibm93IiwiX2V4dGVuc2lvbiIsInJpZCIsImJhc2VfNjQiLCJCYXNlNjQiLCJlbmNvZGUiLCJhbXQiLCJnb29kX251bSIsImFwcF9yZW1hcmsiLCJyZXF1ZXN0TWlkYXNQYXltZW50IiwicHJlcGF5SWQiLCJzdGFyQ3VycmVuY3kiLCJjb21wbGV0ZSIsImJpbmQiLCJzaG93Rmlyc3RDaGFyZ2UiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBQSxNQUFNLENBQUNDLFlBQVAsR0FBc0IsU0FBdEIsRUFBa0M7O0FBRWxDLElBQUlDLGVBQWUsR0FBR0MsT0FBTyxDQUFDLGtCQUFELENBQTdCOztBQUNBLElBQUlDLGNBQWMsR0FBR0QsT0FBTyxDQUFDLGlCQUFELENBQTVCOztBQUNBLElBQUlFLFFBQVEsR0FBR0YsT0FBTyxDQUFDLFdBQUQsQ0FBdEI7O0FBRUEsSUFBSUcsS0FBSyxHQUFHLFNBQVJBLEtBQVEsR0FBVyxDQUV0QixDQUZEOztBQUlBQSxLQUFLLENBQUNDLFlBQU4sR0FBcUIsSUFBckI7QUFDQUQsS0FBSyxDQUFDRSxTQUFOLEdBQWtCLElBQWxCOztBQUVBRixLQUFLLENBQUNHLE9BQU4sR0FBZ0IsWUFBVztBQUN2QkMsRUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQVksU0FBWjtBQUNBRCxFQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWVgsTUFBWjtBQUdFLE1BQUksQ0FBQ0EsTUFBTSxDQUFDWSxFQUFaLEVBQWlCO0FBRWpCLE9BQUtDLFdBQUw7QUFFQWIsRUFBQUEsTUFBTSxDQUFDYyxPQUFQLEdBQWlCLFlBQWpCO0FBQ0FkLEVBQUFBLE1BQU0sQ0FBQ2UsYUFBUCxHQUF1QixJQUF2QjtBQUNBZixFQUFBQSxNQUFNLENBQUNnQixRQUFQLEdBQWtCLElBQWxCO0FBRUFKLEVBQUFBLEVBQUUsQ0FBQ0ssZUFBSCxDQUFtQjtBQUNqQkMsSUFBQUEsWUFBWSxFQUFFO0FBREcsR0FBbkI7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aEJELENBZ0JFLE9BQU95QyxDQUFQLEVBQVUsQ0FFWDtBQUNGO0FBQ0Y7QUFDRjtBQTNDUSxLQUFYO0FBNkNELEdBN0VpQixDQTZFaEJ1RyxJQTdFZ0IsQ0E2RVgsSUE3RVcsQ0FBbEI7O0FBOEVBakssRUFBQUEsT0FBTyxDQUFDLGlCQUFELENBQVAsQ0FBMkJpRixXQUEzQixHQUF5Q2lGLGVBQXpDLENBQXlEN0IsV0FBekQ7QUFDRCxDQWhGRDs7QUFxRkE4QixNQUFNLENBQUNDLE9BQVAsR0FBaUJqSyxLQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gd2luZG93LlBMQVRGT1JNID0gXCJxcVwiOyAgICAgICAgLy8g5bmz5Y+w5Y+3XHJcbi8vIHdpbmRvdy5QQUNLQUdFX1ZFUlNJT04gPSBcIl8wXzBfMlwiO1xyXG4vLyB3aW5kb3cuQ0hBTk5FTCA9IFwiaDVzc3pnX3FxXCI7ICAvLyDmuKDpgZPlj7dcclxud2luZG93LlBBQ0tBR0VfTkFNRSA9IFwi6Zeq54OB5LmL5YWJ5Y+j6KKL54mIXCI7ICAvLyDmuKDpgZPlj7dcclxuXHJcbnZhciBMb2dpbkNvbnRyb2xsZXIgPSByZXF1aXJlKFwibG9naW5fY29udHJvbGxlclwiKTtcclxudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcclxudmFyIFZpcEV2ZW50ID0gcmVxdWlyZShcInZpcF9ldmVudFwiKVxyXG5cclxudmFyIFFRU0RLID0gZnVuY3Rpb24oKSB7XHJcblxyXG59O1xyXG5cclxuUVFTREsuYWNjb3VudF9pbmZvID0gbnVsbDtcclxuUVFTREsudXNlcl9pbmZvID0gbnVsbDtcclxuXHJcblFRU0RLLmluaXRTREsgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiUVFTREvnm7jlhbNcIik7XHJcbiAgICBjb25zb2xlLmxvZyh3aW5kb3cpO1xyXG5cclxuICAgXHJcbiAgICAgIGlmICghd2luZG93LnFxKSAgcmV0dXJuO1xyXG4gIFxyXG4gICAgICB0aGlzLmluaXRUb3BJbmZvKCk7XHJcblxyXG4gICAgICB3aW5kb3cuQ0hBTk5FTCA9IFwiaDV5b3V5aV9xcVwiO1xyXG4gICAgICB3aW5kb3cuUExBVEZPUk1fTkFNRSA9IFwid2JcIjtcclxuICAgICAgd2luZG93LlBMQVRGT1JNID0gXCJ3YlwiOyBcclxuICAgICAgXHJcbiAgICAgIHFxLnNldEtlZXBTY3JlZW5Pbih7XHJcbiAgICAgICAga2VlcFNjcmVlbk9uOiB0cnVlXHJcbiAgICAgIH0pXHJcbiAgICAgIHFxLm9uU2hvdyhmdW5jdGlvbihyZXMpe1xyXG4gICAgICAgIHFxLnNldEtlZXBTY3JlZW5Pbih7XHJcbiAgICAgICAgICBrZWVwU2NyZWVuT246IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHFxLm9uSGlkZShmdW5jdGlvbihyZXMpe1xyXG4gICAgICAgIHFxLnNldEtlZXBTY3JlZW5Pbih7XHJcbiAgICAgICAgICBrZWVwU2NyZWVuT246IGZhbHNlXHJcbiAgICAgICAgfSlcclxuICAgICAgfSk7XHJcbiAgICAgIFxyXG4gICAgICBxcS5zaG93U2hhcmVNZW51KHtcclxuICAgICAgICBzaG93U2hhcmVJdGVtczogWydxcScsICdxem9uZScsJ3dlY2hhdEZyaWVuZHMnLCAnd2VjaGF0TW9tZW50J10sXHJcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICBxcS5vblNoYXJlQXBwTWVzc2FnZSgoKSA9PiAoe1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaW1hZ2VVcmw6IFwiaHR0cHM6Ly9zMi5heDF4LmNvbS8yMDE5LzA5LzIxL252elpsai5wbmdcIiAvLyDlm77niYcgVVJMXHJcbiAgICAgICAgICB9KSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBxcS5nZXRTZXR0aW5nKHtcclxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHtcclxuICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgaWYgKHJlcy5hdXRoU2V0dGluZ1tcInNjb3BlLnVzZXJJbmZvXCJdKSB7XHJcbiAgICAgICAgICAgIFFRU0RLLmNoZWNrTG9naW5TdGF0dXMoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBpbmZvID0gcXEuZ2V0U3lzdGVtSW5mb1N5bmMoKTtcclxuICAgICAgICAgICAgdmFyIGJ1dHRvbiA9IHFxLmNyZWF0ZVVzZXJJbmZvQnV0dG9uKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICAgIHRleHQ6ICcnLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgbGVmdDogMCwvL2luZm8uc2NyZWVuV2lkdGgvMi04MCxcclxuICAgICAgICAgICAgICAgICAgdG9wOiBpbmZvLnNjcmVlbkhlaWdodC8yLC8vaW5mby53aW5kb3dIZWlnaHQgLSBpbmZvLndpbmRvd0hlaWdodC8zLFxyXG4gICAgICAgICAgICAgICAgICB3aWR0aDogaW5mby5zY3JlZW5XaWR0aCwvLzE2MCxcclxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBpbmZvLnNjcmVlbkhlaWdodC8yLC8vNDAsXHJcbiAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJycsXHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZmZmZicsXHJcbiAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAxNixcclxuICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiA0LFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBidXR0b24uc2hvdygpO1xyXG4gICAgICAgICAgICBidXR0b24ub25UYXAoKHJlcyk9PntcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICBRUVNESy5jaGVja0xvZ2luU3RhdHVzKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxufVxyXG5cclxuXHJcblFRU0RLLmluaXRUb3BJbmZvID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgbWVudUluZm8gPSBxcS5nZXRNZW51QnV0dG9uQm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB2YXIgc3lzdGVtSW5mbyA9IHFxLmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICBpZihtZW51SW5mby50b3A+MzApe1xyXG4gICAgICB3aW5kb3cuV1hfRklUID0gbWVudUluZm8udG9wIC8gc3lzdGVtSW5mby5zY3JlZW5IZWlnaHQgKjAuNyB8fCAwO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHdpbmRvdy5XWF9GSVQgPSBtZW51SW5mby50b3AgLyBzeXN0ZW1JbmZvLnNjcmVlbkhlaWdodCAqMC4xIHx8IDA7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcIlFR5bCP5ri45oiP6I+c5Y2V5qCP55qE6YCC6YWN5YC8XCIpO1xyXG4gICAgY2MubG9nKFdYX0ZJVCk7XHJcbn1cclxuXHJcblFRU0RLLmNoZWNrTG9naW5TdGF0dXMgPSBmdW5jdGlvbigpIHtcclxuICAvLyDojrflj5bmnKzlnLBrZXlcclxuICB0cnkge1xyXG4gICAgdmFyIHZhbHVlID0gdGhpcy5hY2NvdW50X2luZm8gPSBxcS5nZXRTdG9yYWdlU3luYygnYWNjb3VudF9pbmZvJylcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBRUVNESy5jaGVja1Nlc3Npb25LZXkodmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgUVFTREsubG9naW4oKTtcclxuICAgIH1cclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICAvLyBEbyBzb21ldGhpbmcgd2hlbiBjYXRjaCBlcnJvclxyXG4gIH1cclxufVxyXG5cclxuXHJcblFRU0RLLmxvZ2luID0gZnVuY3Rpb24oKSB7XHJcbiAgaWYgKHdpbmRvdy5xcSkge1xyXG4gICAgICBxcS5sb2dpbih7XHJcbiAgICAgICAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAvL+WPkei1t+e9kee7nOivt+axglxyXG4gICAgICAgICAgICAgICAgY2MubG9nKFwi5Yid5aeL5YyW55m75b2V5L+h5oGv6L+U5ZueXCIpO1xyXG4gICAgICAgICAgICAgICAgY2MubG9nKHJlcyk7XHJcbiAgICAgICAgICAgICAgICBxcS5yZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9zMS13Yi1oNXNzemcuc2hpeXVlZ2FtZS5jb20vYXBpLnBocC9wZi9xcS9sb2dpbicsXHJcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICBqc19jb2RlOiByZXMuY29kZSxcclxuICAgICAgICAgICAgICAgICAgICBjcHM6IFwicXF0ZXN0XCJcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgc3VjY2VzcyAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2MubG9nKFwi5pyN5Yqh5Zmo55m75b2V5L+h5oGv6L+U5ZueXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS/neWtmOeUqOaIt+S/oeaBr+WIsOacrOWcsFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLmxvZyhyZXMuZGF0YS5tc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUVFTREsuYWNjb3VudF9pbmZvID0gcmVzLmRhdGEubXNnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXEuc2V0U3RvcmFnZVN5bmMoJ2FjY291bnRfaW5mbycsIHJlcy5kYXRhLm1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDor7fmsYLmiJDlip/lvIDlp4vnmbvlvZXmuLjmiI9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFRU0RLLmluaXRVc2VySW5mbygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+eZu+W9leWksei0pe+8gScgKyByZXMuZXJyTXNnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuUVFTREsuY2hlY2tTZXNzaW9uS2V5ID0gZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgY2MubG9nKFwi5qCh6aqMa2V55piv5ZCm6L+H5pyfXCIpO1xyXG4gICAgICBxcS5jaGVja1Nlc3Npb24oe1xyXG4gICAgICAgIHN1Y2Nlc3MgKCkge1xyXG4gICAgICAgICAgLy8g5rKh5pyJ5aSx5pWI77yM57un57ut55m75b2VXHJcbiAgICAgICAgICBRUVNESy5pbml0VXNlckluZm8oKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZhaWwgKCkge1xyXG4gICAgICAgICAgLy8gc2Vzc2lvbl9rZXkg5bey57uP5aSx5pWI77yM6ZyA6KaB6YeN5paw5omn6KGM55m75b2V5rWB56iLXHJcbiAgICAgICAgICBRUVNESy5sb2dpbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxufVxyXG5cclxuUVFTREsuaW5pdFVzZXJJbmZvID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHFxLmdldFVzZXJJbmZvKHtcclxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHtcclxuICAgICAgICAgIFFRU0RLLnVzZXJfaW5mbyA9IHJlcztcclxuICAgICAgICAgIGNjLmxvZyhcIuiOt+WPlueUqOaIt+S/oeaBr+aIkOWKn1wiKTtcclxuICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgUVFTREsuc2V0TG9naW5EYXRhKHJlcyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgZmFpbDogZnVuY3Rpb24ocmVzKSB7XHJcbiAgICAgICAgICBjYy5sb2coXCLojrflj5bnlKjmiLfkv6Hmga/lpLHotKVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG59XHJcblxyXG5RUVNESy5zZXRMb2dpbkRhdGEgPSBmdW5jdGlvbih1c2VyX2luZm8pIHtcclxuICB0aGlzLnVzZXJfaW5mbyA9IHVzZXJfaW5mbztcclxuICB0aGlzLnNka0JhY2tMb2dpbigpO1xyXG59XHJcblxyXG4vLyBTREvnmbvlvZXmiJDlip/lm57osINcclxuUVFTREsuc2RrQmFja0xvZ2luID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIGxvZ2luX2RhdGEgPSB7fTtcclxuICBsb2dpbl9kYXRhLnVzck5hbWUgPSBcInFxX1wiICsgdGhpcy5hY2NvdW50X2luZm8ub3BlbmlkO1xyXG4gIGxvZ2luX2RhdGEucGFzc3dvcmQgPSBcInFxMTIzNDU2XCI7XHJcbiAgY29uc29sZS5sb2coXCJRUeaVsOaNruWIneWni+iKseaIkOWKn++8jOW8gOWni+ivt+axguacjeWKoeWZqOWIl+ihqFwiKTtcclxuICBMb2dpbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5sb2dpblBsYXRmb3JtUmVxdWVzdChsb2dpbl9kYXRhKTtcclxufVxyXG5cclxuUVFTREsubG9naW5HYW1lID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIHRlc3RfYWNvdW50ID0gTG9naW5Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0VGVzdEFjY291bnQoKTtcclxuICBjYy5sb2coXCLkvb/nlKjkuoZRUea1i+ivlei0puWPt1wiKTtcclxuICBjYy5sb2codGVzdF9hY291bnQpO1xyXG5cclxuICAvLyBTREvor7fmsYLnmbvlvZXmuLjmiI9cclxuICB2YXIgbG9naW5fZGF0YSA9IHt9O1xyXG4gIGlmICh0ZXN0X2Fjb3VudCkge1xyXG4gICAgbG9naW5fZGF0YS5hY2NvdW50ID0gdGVzdF9hY291bnQ7XHJcbiAgfSBlbHNlIHtcclxuICAgIGxvZ2luX2RhdGEuYWNjb3VudCA9IFwicXFfXCIgKyB0aGlzLmFjY291bnRfaW5mby5vcGVuaWQ7XHJcbiAgfVxyXG4gIGxvZ2luX2RhdGEucmF3RGF0YSA9IHRoaXMudXNlcl9pbmZvLnJhd0RhdGE7XHJcbiAgbG9naW5fZGF0YS5zaWduYXR1cmUgPSB0aGlzLnVzZXJfaW5mby5zaWduYXR1cmU7XHJcbiAgbG9naW5fZGF0YS5jaGFubmVsID0gQ0hBTk5FTDtcclxuICBsb2dpbl9kYXRhLnBhY2thZ2VfbmFtZSA9IFBBQ0tBR0VfTkFNRTtcclxuICBsb2dpbl9kYXRhLnBhY2thZ2VfdmVyc2lvbiA9IFBBQ0tBR0VfVkVSU0lPTjtcclxuICBsb2dpbl9kYXRhLnBsYXRmb3JtID0gUExBVEZPUk07XHJcbiAgbG9naW5fZGF0YS50b2tlbiA9IFFRU0RLLmFjY291bnRfaW5mby5zZXNzaW9uX2tleTtcclxuICBsb2dpbl9kYXRhLnRpbWVzdGFtcCA9IFFRU0RLLmFjY291bnRfaW5mby50aW1lO1xyXG4gIGxvZ2luX2RhdGEuc2lnbiA9IFFRU0RLLmFjY291bnRfaW5mby5zaWduO1xyXG5cclxuICBMb2dpbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jdXNTREtMb2dpbihsb2dpbl9kYXRhKTtcclxufVxyXG5cclxuLy8g6YCa55+l5pyN5Yqh5Zmo5oiQ5YqfXHJcblFRU0RLLnN1Ym1pdExvZ2luID0gZnVuY3Rpb24odXJsKSB7XHJcbiAgICBpZiAodXJsKSB7XHJcbiAgICAgIHZhciBzdWJtaXRfdXJsID0gXCJodHRwczovL1wiICsgdXJsICsgXCIvYXBpLnBocC9wZi9xcS9zZXNzaW9uXCI7XHJcbiAgICAgIGNvbnNvbGUubG9nKHN1Ym1pdF91cmwpO1xyXG4gICAgICBjb25zb2xlLmxvZyhRUVNESy5hY2NvdW50X2luZm8pO1xyXG5cclxuICAgICAgcXEucmVxdWVzdCh7XHJcbiAgICAgICAgdXJsOiBzdWJtaXRfdXJsLFxyXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgc2Vzc2lvbl9rZXk6IFFRU0RLLmFjY291bnRfaW5mby5zZXNzaW9uX2tleSxcclxuICAgICAgICAgIG9wZW5pZDogUVFTREsuYWNjb3VudF9pbmZvLm9wZW5pZCxcclxuICAgICAgICAgIHRpbWU6UVFTREsuYWNjb3VudF9pbmZvLnRpbWUsXHJcbiAgICAgICAgICBzaWduOlFRU0RLLmFjY291bnRfaW5mby5zaWduLFxyXG4gICAgICAgICAgY3BzOiBcInFxdGVzdFwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICBoZWFkZXI6IHtcclxuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgLy8g6buY6K6k5YC8XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgICAgIGNjLmxvZyhcIuacjeWKoeWZqOeZu+W9leS/oeaBr+i/lOWbnlwiKTtcclxuICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuZGF0YSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMuZGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG5cclxuICAgIH0gXHJcbn1cclxuXHJcblFRU0RLLmdldEN1cnJDaGFubmVsID0gZnVuY3Rpb24oKSB7XHJcblxyXG59XHJcblxyXG5RUVNESy5jYW52YXNUb1RlbXBGaWxlUGF0aCA9IGZ1bmN0aW9uKCkge1xyXG4gIHZhciBjYW52YXMgPSBjYy5nYW1lLmNhbnZhcztcclxuICBcclxuICBjYW52YXMudG9UZW1wRmlsZVBhdGgoe1xyXG4gICAgICB4OiAwLFxyXG4gICAgICB5OiA1MTAqY2FudmFzLmhlaWdodC8xMjgwLFxyXG4gICAgICB3aWR0aDogY2FudmFzLndpZHRoLFxyXG4gICAgICBoZWlnaHQ6IDU1MCpjYW52YXMuaGVpZ2h0LzEyODAsXHJcbiAgICAgIGRlc3RXaWR0aDogNTAwLFxyXG4gICAgICBkZXN0SGVpZ2h0OiA0MDAsXHJcbiAgICAgIGZpbGVUeXBlOlwianBnXCIsXHJcblxyXG4gICAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgICAgIC8vLuWPr+S7peS/neWtmOivpeaIquWxj+WbvueJh1xyXG4gICAgICAgICAgcXEuc2hhcmVBcHBNZXNzYWdlKHtcclxuICAgICAgICAgICAgICBpbWFnZVVybDogcmVzLnRlbXBGaWxlUGF0aFxyXG4gICAgICAgICAgfSlcclxuICAgICAgfSxcclxuICAgICAgZmFpbCAocmVzKSB7XHJcbiAgICAgICAgICAvLy7lj6/ku6Xkv53lrZjor6XmiKrlsY/lm77niYdcclxuICAgICAgICAgIHFxLnNoYXJlQXBwTWVzc2FnZSh7XHJcbiAgICAgICAgICAgIGltYWdlVXJsOiBcImh0dHBzOi8vczIuYXgxeC5jb20vMjAxOS8wOS8yMS9udnpabGoucG5nXCIgLy8g5Zu+54mHIFVSTFxyXG4gICAgICAgICAgfSlcclxuICAgICAgfSxcclxuICB9KVxyXG5cclxufVxyXG5cclxuUVFTREsuZ2V0U3ViQ2hhbm5lbCA9IGZ1bmN0aW9uKCkge1xyXG4gIFxyXG59XHJcblxyXG5cclxuLy8gUVHlsI/muLjmiI/kvZnpop3mn6Xor6JcclxuUVFTREsuY2hlY2tCYWxhbmNlID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIGxvZ2luSW5mbyA9IExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm1vZGVsLmdldExvZ2luSW5mbygpO1xyXG4gIFxyXG4gIHZhciBkYXRhID0ge1xyXG4gICAgICBvcGVuaWQ6IHRoaXMuYWNjb3VudF9pbmZvLm9wZW5pZCxcclxuICAgICAgdGltZTpRUVNESy5hY2NvdW50X2luZm8udGltZSxcclxuICAgICAgc2lnbjpRUVNESy5hY2NvdW50X2luZm8uc2lnbixcclxuICAgICAgY3BzOiBcInFxdGVzdFwiXHJcbiAgICB9XHJcbiAgICBcclxuICBxcS5yZXF1ZXN0KHtcclxuICAgIHVybDogXCJodHRwczovL1wiK2xvZ2luSW5mby5ob3N0K1wiL2FwaS5waHAvcGYvcXEvYmFsYW5jZVwiLFxyXG4gICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgIGRhdGE6IGRhdGEsXHJcbiAgICBoZWFkZXI6IHtcclxuICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgIH0sXHJcbiAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgaWYgKHJlcyAmJiByZXMuZGF0YSkge1xyXG4gICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGlmKHJlcy5kYXRhLm1zZyl7XHJcbiAgICAgICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKFZpcEV2ZW50LlVQREFUQV9RUV9CQUxBTkNFLHJlcy5kYXRhLm1zZy5yZW1haW5kZXIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSlcclxufVxyXG5cclxuLy/mlK/ku5hcclxuUVFTREsucGF5ID0gZnVuY3Rpb24obW9uZXksIGJ1eU51bSwgcHJvZElkLCBwcm9kdWN0TmFtZSwgcHJvZHVjdERlc2MsIGV4dGVuc2lvbiwgY29pbk51bSkge1xyXG4gIHZhciBwYXlDYWxsRnVuYyA9IGZ1bmN0aW9uKCl7XHJcbiAgICB2YXIgbG9naW5JbmZvID0gTG9naW5Db250cm9sbGVyLmdldEluc3RhbmNlKCkubW9kZWwuZ2V0TG9naW5JbmZvKCk7XHJcblxyXG4gICAgdmFyIHJvbGVWbyA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XHJcbiAgICBpZiAocm9sZVZvID09IG51bGwpIHJldHVybjtcclxuICAgIHZhciBzZXZlckluZm8gPSByb2xlVm8uc3J2X2lkLnNwbGl0KFwiX1wiKTtcclxuICAgIHZhciBwbGF0Zm9ybSA9IHNldmVySW5mb1swXSB8fCBcIlwiO1xyXG4gICAgdmFyIHpvbmVfaWQgPSBzZXZlckluZm9bMV07XHJcblxyXG4gICAgdmFyIHN5c3RlbUluZm8gPSBxcS5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgdmFyIHN5c3RlbU5hbWUgPSBzeXN0ZW1JbmZvLnN5c3RlbTtcclxuICAgIHZhciBwZiA9IFwiXCI7XHJcbiAgICBpZihzeXN0ZW1OYW1lLmluZGV4T2YoXCJpT1NcIik+LTEpe1xyXG4gICAgICAvLyByZXR1cm47XHJcbiAgICB9ZWxzZSBpZihzeXN0ZW1OYW1lLmluZGV4T2YoXCJBbmRyb2lkXCIpPi0xKXtcclxuICAgICAgcGYgPSBcInFxX21fcXEtMjAwMS1hbmRyb2lkLTIwMTFcIjtcclxuICAgIH1cclxuXHJcbiAgICAvL+aXtumXtOaIs1xyXG4gICAgdmFyIGRhdGVfdGltZSA9IE1hdGguY2VpbChEYXRlLm5vdygpIC8gMTAwMCk7XHJcblxyXG4gICAgcHJvZHVjdE5hbWUgPSBwcm9kdWN0TmFtZSB8fCAobW9uZXkgKiAxMCkgKyBcIumSu+efs1wiO1xyXG4gICAgdmFyIGNwcyA9IFwicXF0ZXN0XCI7XHJcbiAgICB2YXIgY2hhbm5lbCA9IENIQU5ORUw7XHJcblxyXG4gICAgdmFyIF9leHRlbnNpb24gPSByb2xlVm8ucmlkICsgXCIkJFwiICsgcGxhdGZvcm0gKyBcIiQkXCIgKyB6b25lX2lkICtcclxuICAgICAgICAgIFwiJCRcIiArIGNoYW5uZWwgKyBcIiQkXCIgKyBwcm9kSWQgKyBcIiQkXCIgKyBwcm9kdWN0TmFtZSArIFwiJCRcIiArIGNwcyArIFwiJCRcIiArIGRhdGVfdGltZTtcclxuICAgICAgY2MubG9nKFwi5ouT5bGV5Y+C5pWwX2V4dGVuc2lvbj09PlwiLCBfZXh0ZW5zaW9uKVxyXG4gICAgICB2YXIgYmFzZV82NCA9IHJlcXVpcmUoXCJiYXNlNjRcIikuQmFzZTY0O1xyXG4gICAgICBfZXh0ZW5zaW9uID0gYmFzZV82NC5lbmNvZGUoX2V4dGVuc2lvbik7XHJcbiAgICBcclxuICAgIFxyXG4gICAgcXEucmVxdWVzdCh7XHJcbiAgICAgIHVybDogXCJodHRwczovL1wiK2xvZ2luSW5mby5ob3N0K1wiL2FwaS5waHAvcGYvcXEvcHJlX3BheVwiLFxyXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgb3BlbmlkOiB0aGlzLmFjY291bnRfaW5mby5vcGVuaWQsXHJcbiAgICAgICAgem9uZV9pZDogem9uZV9pZCxcclxuICAgICAgICBwZjogcGYsXHJcbiAgICAgICAgYW10Om1vbmV5KjEwLFxyXG4gICAgICAgIGdvb2RfbnVtOiAxLFxyXG4gICAgICAgIHRpbWU6UVFTREsuYWNjb3VudF9pbmZvLnRpbWUsXHJcbiAgICAgICAgc2lnbjpRUVNESy5hY2NvdW50X2luZm8uc2lnbixcclxuICAgICAgICBhcHBfcmVtYXJrOl9leHRlbnNpb24sXHJcbiAgICAgICAgY3BzOiBjcHNcclxuICAgICAgfSxcclxuICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgICAgfSxcclxuICAgICAgc3VjY2VzcyAocmVzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLpooTkuIvljZXov5Tlm55cIik7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzKTtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5kYXRhKSB7XHJcbiAgICAgICAgICBpZiAocmVzLmRhdGEuZXJyb3IgPT0gNjY2KSB7ICAgIC8vIOivt+axguaIkOWKn1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcXEucmVxdWVzdE1pZGFzUGF5bWVudCh7XHJcbiAgICAgICAgICAgICAgICAgIHByZXBheUlkOnJlcy5kYXRhLm1zZy5wcmVwYXlJZCxcclxuICAgICAgICAgICAgICAgICAgc3RhckN1cnJlbmN5Om1vbmV5KjEwLFxyXG4gICAgICAgICAgICAgICAgICBzdWNjZXNzOmZ1bmN0aW9uKHJlcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmlK/ku5jlm57osIPmiJDlip9cIixyZXMpXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgICBmYWlsOmZ1bmN0aW9uKHJlcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmlK/ku5jlm57osIPlpLHotKVcIixyZXMpXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICBjb21wbGV0ZTpmdW5jdGlvbihyZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pSv5LuY5Zue6LCDY29tcGxldGVcIixyZXMpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfS5iaW5kKHRoaXMpO1xyXG4gIHJlcXVpcmUoXCJ0aXBzX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5zaG93Rmlyc3RDaGFyZ2UocGF5Q2FsbEZ1bmMpO1xyXG59O1xyXG5cclxuXHJcblxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBRUVNESzsiXX0=
|