FlyUp/temp/quick-scripts/dst/assets/Script/tool/GameTool.js
2024-07-10 18:24:08 +08:00

351 lines
47 KiB
JavaScript

(function() {
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
var __module = nodeEnv ? module : {exports:{}};
var __filename = 'preview-scripts/assets/Script/tool/GameTool.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, '35a73aTEIBAZoXKp/xutwzU', 'GameTool');
// Script/tool/GameTool.ts
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GameTool = void 0;
var GameData_1 = require("../GameData");
var HttpUtil_1 = require("../crypto/HttpUtil");
var Storage_1 = require("./Storage");
//最大工具类
var GameTool = {
_startTime: 0,
_endTime: 0,
_totalTime: 0,
getSeedRandom: function (min, max) {
max = max || 1;
min = min || 0;
GameData_1.default._instance.GM_INFO.currSeed = (GameData_1.default._instance.GM_INFO.currSeed * 9301 + 49297) % 233280;
var rnd = GameData_1.default._instance.GM_INFO.currSeed / 233280.0;
var tmp = min + rnd * (max - min);
return Math.floor(tmp);
},
//获取userId
Authentication: function () {
var name = "user_" + GameData_1.default._instance.GM_INFO.gameId;
var data = JSON.parse(localStorage.getItem(name));
if (data == "undifend" || data == null || data == "") {
var url = "https://api.sparkus.cn/api/user/auth/login?domain=hui32579WdYPsgYq&callback=" + location.href;
window.location.href = url;
}
else {
Storage_1.StorageMessage.setStorage(name, data);
GameData_1.default._instance.GM_INFO.userId = parseInt(data.userId);
}
},
//埋点上传
setGameData: function () {
//GAME_DATA 初始化 每次清零
GameData_1.default._instance.GAME_DATA = [];
GameData_1.default._instance.GAME_DATA.push(GameData_1.default._instance.CLICK_DATA);
//GAME_DATA 赋值后 CLICK_DATA清零
GameData_1.default._instance.CLICK_init();
var matchId = this.getMatchId(GameData_1.default._instance.GAME_DATA[0].round);
var postData = {
"matchId": matchId,
"data": GameData_1.default._instance.GAME_DATA
};
// console.log("上传数据:",postData);
HttpUtil_1.default.uploadUserLogData(postData, function () { });
},
setRank: function () {
//GAME_DATA 初始化 每次清零
var postData = {
"type": 1,
"round": "1",
"score": GameData_1.default._instance.GM_INFO.score,
"success": GameData_1.default._instance.GM_INFO.success
};
HttpUtil_1.default.rankData(1, function () { }, postData);
},
//获取matchId 用于上传每次点击数据里面记录id方便查询
getMatchId: function (level) {
var matchId = cc.sys.localStorage.getItem("matchId");
if (matchId == "undifend" || matchId == null) {
matchId = this.setMatchId();
}
else {
if (this.containsNanana(matchId) == true) {
matchId = this.setMatchId();
}
else {
var char = parseInt(cc.sys.localStorage.getItem("matchNumber"));
if (level == 1) {
char += 1;
cc.sys.localStorage.setItem("matchNumber", char);
}
matchId = matchId.slice(0, 10) + char + "";
GameData_1.default._instance.GM_INFO.matchId = matchId;
cc.sys.localStorage.setItem("matchId", matchId);
}
}
return matchId;
},
//检测matchId 如果有缓存以前的nanana数据清除
containsNanana: function (str) {
return /na/i.test(str);
},
//重新设置MatchId
setMatchId: function () {
// 定义包含可用字符的字符集
var characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
// 创建一个数组以保存随机字符
var uuidArray = [];
// 循环10次 生成10位的UUID
for (var i = 0; i < 10; i++) {
// 生成随机索引,范围是字符集的长度
var randomIndex = Math.floor(Math.random() * characters.length);
// 从字符集中获取随机字符
var randomChar = characters.charAt(randomIndex);
// 将字符添加到数组中
uuidArray.push(randomChar);
}
var data = uuidArray.join('') + 1 + "";
cc.sys.localStorage.setItem("matchNumber", 1);
cc.sys.localStorage.setItem("matchId", data);
GameData_1.default._instance.GM_INFO.matchId = data;
return data;
},
getSetScreenResolutionFlag: function () {
var size = cc.winSize;
var width = size.width;
var height = size.height;
if ((height / width) > (16.2 / 9))
return false;
return true;
},
//判断全面屏适配
setFit: function (canvas) {
var flag = GameTool.getSetScreenResolutionFlag();
if (flag) {
// console.log("不是全面屏");
}
else {
// console.log("是全面屏");
}
return flag;
},
getTip: function () {
var index = Math.floor(Math.random() * 4) + 1;
switch (index) {
case 1: {
return "根据小球的位置,合理晃动手机,确保小球不掉出木板。";
}
case 2: {
return "根据小球位置控制晃动幅度,过大或过小都不是个好选择。";
}
case 3: {
return "不要被天上掉落的障碍吓到,有时候它反而会帮你保持平衡。";
}
case 4: {
return "尝试着顶开掉落的障碍,是个很酷的玩法。";
}
}
},
beginTiming: function () {
this._startTime = new Date().getTime();
},
endTiming: function () {
this._endTime = new Date().getTime();
// this._totalTime = endTime - this._startTime;
},
//如果是判断时常的游戏 调用此方法
updateScoreTime: function () {
var endTime = new Date().getTime();
var tempTime = endTime - this._startTime;
if (tempTime < 0 || tempTime > 500) {
tempTime = Math.round(cc.director.getAnimationInterval() * 1000);
}
this._endTime += tempTime / 1000;
this._totalTime = this._endTime.toFixed(2);
GameData_1.default._instance.GM_INFO.currScore = this._totalTime;
this._startTime = endTime;
},
//倒计时调用此方法
countDown: function () {
this._endTime = new Date().getTime();
this._totalTime = Math.floor((this._endTime - this._startTime) / 1000);
GameData_1.default._instance.GM_INFO.remainingTime = GameData_1.default._instance.GM_INFO.totalTime - this._totalTime;
},
getGameInfo: function (node) {
var jg = false;
return jg;
},
//根据服务器数据重置所需要所有数据
reset: function () {
// console.log("本地数据丢失,重新启动游戏");
cc.director.loadScene('LoadScene');
},
setGameInfo: function (pd) {
},
//输入秒,返回需要展示时间格式
getTimeMargin: function (second) {
var total = second;
var hour = Math.floor(total / (60 * 60)); //计算整数小时数
var afterHour = total - hour * 60 * 60; //取得算出小时数后剩余的秒数
var min = Math.floor(afterHour / 60); //计算整数分
var afterMin = total - hour * 60 * 60 - min * 60; //取得算出分后剩余的秒数
return '剩余:' + hour + ':' + min + ':' + afterMin;
},
getTimeMargin2: function (second) {
var total = second;
var min = null;
var afterMin = null;
var hour = Math.floor(total / (60 * 60)); //计算整数小时数
var afterHour = total - hour * 60 * 60; //取得算出小时数后剩余的秒数
min = Math.floor(afterHour / 60); //计算整数分
if (min < 10)
min = "0" + min;
afterMin = total - hour * 60 * 60 - min * 60; //取得算出分后剩余的秒数
if (afterMin < 10)
afterMin = "0" + afterMin;
return '剩余:' + min + ':' + afterMin;
},
//将时间转换为59:23
getTime: function (time) {
var label = "";
var number_1 = null;
var number_2 = null;
number_1 = Math.floor(time / 60);
number_2 = time - number_1 * 60;
if (number_1 < 10) {
number_1 = "0" + number_1;
}
if (number_2 < 10) {
number_2 = "0" + number_2;
}
label = number_1 + ":" + number_2;
return label;
},
//number 为传进来的数值,type为最多显示几位数
getNumber: function (number, type) {
// console.log(type,"需要转换的数字为:",number);
var count = 1000;
var place = type - 3;
if (number > Math.pow(count, 8) * Math.pow(10, place)) {
if (number / Math.pow(count, 8) < 100)
number = Math.floor(number / Math.pow(count, 8) * 10) / 10 + "S";
else
number = Math.floor(number / Math.pow(count, 8)) + "S";
}
else if (number > Math.pow(count, 7) * Math.pow(10, place)) {
if (number / Math.pow(count, 7) < 100)
number = Math.floor(number / Math.pow(count, 7) * 10) / 10 + "s";
else
number = Math.floor(number / Math.pow(count, 7)) + "s";
}
else if (number > Math.pow(count, 6) * Math.pow(10, place)) {
if (number / Math.pow(count, 6) < 100)
number = Math.floor(number / Math.pow(count, 6) * 10) / 10 + "Q";
else
number = Math.floor(number / Math.pow(count, 6)) + "Q";
}
else if (number > Math.pow(count, 5) * Math.pow(10, place)) {
if (number / Math.pow(count, 5) < 100)
number = Math.floor(number / Math.pow(count, 5) * 10) / 10 + "q";
else
number = Math.floor(number / Math.pow(count, 5)) + "q";
}
else if (number > Math.pow(count, 4) * Math.pow(10, place)) {
if (number / Math.pow(count, 4) < 100)
number = Math.floor(number / Math.pow(count, 4) * 10) / 10 + "t";
else
number = Math.floor(number / Math.pow(count, 4)) + "t";
}
else if (number > Math.pow(count, 3) * Math.pow(10, place)) {
if (number / Math.pow(count, 3) < 100)
number = Math.floor(number / Math.pow(count, 3) * 10) / 10 + "b";
else
number = Math.floor(number / Math.pow(count, 3)) + "b";
}
else if (number > Math.pow(count, 2) * Math.pow(10, place)) {
if (number / Math.pow(count, 2) < 100)
number = Math.floor(number / Math.pow(count, 2) * 10) / 10 + "m";
else
number = Math.floor(number / Math.pow(count, 2)) + "m";
}
else if (number > Math.pow(count, 1) * Math.pow(10, place)) {
if (number / Math.pow(count, 1) < 100) {
number = Math.floor(number / Math.pow(count, 1) * 10) / 10 + "k";
}
else
number = Math.floor(number / Math.pow(count, 1)) + "k";
}
else {
number = Math.floor(number / Math.pow(count, 0)) + "";
}
// console.log("结果为"+type+"位数",number);
return number;
},
begainTiming: function () {
this._startTime = new Date().getTime();
},
endTiming2: function () {
var endTime = new Date().getTime();
this._endTime = endTime;
this._totalTime = endTime - this._startTime;
},
getScoreTime: function () {
var endTime = new Date().getTime();
var tempTime = endTime - this._startTime;
if (tempTime < 0 || tempTime > 500) {
tempTime = Math.round(cc.director.getAnimationInterval() * 1000);
}
GameData_1.default._instance.GM_INFO.currScore += tempTime;
this._startTime = endTime;
},
getFormatTime: function (time) {
var date = new Date();
date.setTime(time);
var ms = date.getMilliseconds();
// let msString = date.getMilliseconds();
var msString = null;
var secondString = null;
var minString = null;
msString = Math.floor(ms / 10) % 100;
secondString = date.getSeconds();
minString = date.getMinutes();
if (msString < 10) {
msString = "0" + msString;
}
if (secondString < 10) {
secondString = "0" + secondString;
}
secondString = secondString + ":";
if (minString < 10) {
minString = "0" + minString;
}
minString = minString + ":";
return minString + secondString + msString;
},
pushLister: function () {
},
removeAllLister: function () {
},
};
exports.GameTool = GameTool;
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFx0b29sXFxHYW1lVG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx3Q0FBbUM7QUFDbkMsK0NBQTBDO0FBQzFDLHFDQUEyQztBQUMzQyxPQUFPO0FBQ1AsSUFBSSxRQUFRLEdBQUc7SUFDWCxVQUFVLEVBQUUsQ0FBQztJQUNiLFFBQVEsRUFBRSxDQUFDO0lBQ1gsVUFBVSxFQUFFLENBQUM7SUFDYixhQUFhLEVBQUUsVUFBVSxHQUFHLEVBQUUsR0FBRztRQUM3QixHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNmLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2Ysa0JBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLGtCQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUNwRyxJQUFJLEdBQUcsR0FBRyxrQkFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6RCxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBQ0QsVUFBVTtJQUNWLGNBQWM7UUFDVixJQUFJLElBQUksR0FBRyxPQUFPLEdBQUcsa0JBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUN2RCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFHLElBQUksSUFBSSxVQUFVLElBQUksSUFBSSxJQUFFLElBQUksSUFBSSxJQUFJLElBQUksRUFB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QztRQUNyQixRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3JDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDakMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM5QixJQUFJLFFBQVEsR0FBRyxFQUFFLEVBQUU7WUFDZixRQUFRLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQztTQUM3QjtRQUNELElBQUksWUFBWSxHQUFHLEVBQUUsRUFBRTtZQUNuQixZQUFZLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQztTQUNyQztRQUNELFlBQVksR0FBRyxZQUFZLEdBQUcsR0FBRyxDQUFDO1FBRWxDLElBQUksU0FBUyxHQUFHLEVBQUUsRUFBRTtZQUNoQixTQUFTLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQztTQUMvQjtRQUNELFNBQVMsR0FBRyxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBQzVCLE9BQU8sU0FBUyxHQUFHLFlBQVksR0FBRyxRQUFRLENBQUM7SUFFL0MsQ0FBQztJQUNELFVBQVUsRUFBQztJQUVYLENBQUM7SUFDRCxlQUFlLEVBQUM7SUFFaEIsQ0FBQztDQUVKLENBQUM7QUFDTyw0QkFBUSIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBHYW1lRGF0YSBmcm9tIFwiLi4vR2FtZURhdGFcIjtcclxuaW1wb3J0IEh0dHBVdGlsIGZyb20gXCIuLi9jcnlwdG8vSHR0cFV0aWxcIjtcclxuaW1wb3J0IHsgU3RvcmFnZU1lc3NhZ2UgfSBmcm9tIFwiLi9TdG9yYWdlXCI7XHJcbi8v5pyA5aSn5bel5YW357G7XHJcbnZhciBHYW1lVG9vbCA9IHtcclxuICAgIF9zdGFydFRpbWU6IDAsXHJcbiAgICBfZW5kVGltZTogMCxcclxuICAgIF90b3RhbFRpbWU6IDAsXHJcbiAgICBnZXRTZWVkUmFuZG9tOiBmdW5jdGlvbiAobWluLCBtYXgpIHsvL+WMheWQq21pbiDkuI3ljIXlkKttYXhcclxuICAgICAgICBtYXggPSBtYXggfHwgMTtcclxuICAgICAgICBtaW4gPSBtaW4gfHwgMDtcclxuICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5jdXJyU2VlZCA9IChHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5jdXJyU2VlZCAqIDkzMDEgKyA0OTI5NykgJSAyMzMyODA7XHJcbiAgICAgICAgbGV0IHJuZCA9IEdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLmN1cnJTZWVkIC8gMjMzMjgwLjA7XHJcbiAgICAgICAgbGV0IHRtcCA9IG1pbiArIHJuZCAqIChtYXggLSBtaW4pO1xyXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRtcCk7XHJcbiAgICB9LFxyXG4gICAgLy/ojrflj5Z1c2VySWRcclxuICAgIEF1dGhlbnRpY2F0aW9uKCl7XHJcbiAgICAgICAgbGV0IG5hbWUgPSBcInVzZXJfXCIgKyBHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5nYW1lSWQ7XHJcbiAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcclxuICAgICAgICBpZihkYXRhID09IFwidW5kaWZlbmRcIiB8fCBkYXRhPT1udWxsIHx8IGRhdGEgPT0gXCJcIil7XHJcbiAgICAgICAgICAgIGxldCB1cmwgPSBcImh0dHBzOi8vYXBpLnNwYXJrdXMuY24vYXBpL3VzZXIvYXV0aC9sb2dpbj9kb21haW49aHVpMzI1NzlXZFlQc2dZcSZjYWxsYmFjaz1cIitsb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgU3RvcmFnZU1lc3NhZ2Uuc2V0U3RvcmFnZShuYW1lLGRhdGEpO1xyXG4gICAgICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy51c2VySWQgPSBwYXJzZUludChkYXRhLnVzZXJJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+Wfi+eCueS4iuS8oFxyXG4gICAgc2V0R2FtZURhdGEoKXtcclxuICAgICAgICAvL0dBTUVfREFUQSDliJ3lp4vljJYg5q+P5qyh5riF6Zu2XHJcbiAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkdBTUVfREFUQSA9IFtdO1xyXG4gICAgICAgIEdhbWVEYXRhLl9pbnN0YW5jZS5HQU1FX0RBVEEucHVzaChHYW1lRGF0YS5faW5zdGFuY2UuQ0xJQ0tfREFUQSk7XHJcbiAgICAgICAgLy9HQU1FX0RBVEEg6LWL5YC85ZCOIENMSUNLX0RBVEHmuIXpm7YgXHJcbiAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkNMSUNLX2luaXQoKTtcclxuXHJcbiAgICAgICAgbGV0IG1hdGNoSWQgPSB0aGlzLmdldE1hdGNoSWQoR2FtZURhdGEuX2luc3RhbmNlLkdBTUVfREFUQVswXS5yb3VuZCk7XHJcbiAgICAgICAgbGV0IHBvc3REYXRhID0ge1xyXG4gICAgICAgICAgICBcIm1hdGNoSWRcIjptYXRjaElkLFxyXG4gICAgICAgICAgICBcImRhdGFcIjogR2FtZURhdGEuX2luc3RhbmNlLkdBTUVfREFUQVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCLkuIrkvKDmlbDmja46XCIscG9zdERhdGEpO1xyXG4gICAgICAgIEh0dHBVdGlsLnVwbG9hZFVzZXJMb2dEYXRhKHBvc3REYXRhLGZ1bmN0aW9uKCl7fSlcclxuICAgIH0sXHJcblxyXG4gICAgc2V0UmFuaygpe1xyXG4gICAgICAgIC8vR0FNRV9EQVRBIOWIneWni+WMliDmr4/mrKHmuIXpm7ZcclxuICAgICAgICBsZXQgcG9zdERhdGEgPSB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOjEsXHJcbiAgICAgICAgICAgIFwicm91bmRcIjpcIjFcIixcclxuICAgICAgICAgICAgXCJzY29yZVwiOiBHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5zY29yZSxcclxuICAgICAgICAgICAgXCJzdWNjZXNzXCI6IEdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLnN1Y2Nlc3NcclxuICAgICAgICB9O1xyXG4gICAgICAgIEh0dHBVdGlsLnJhbmtEYXRhKDEsZnVuY3Rpb24oKXt9LHBvc3REYXRhKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy/ojrflj5ZtYXRjaElkICDnlKjkuo7kuIrkvKDmr4/mrKHngrnlh7vmlbDmja7ph4zpnaLorrDlvZVpZOaWueS+v+afpeivolxyXG4gICAgZ2V0TWF0Y2hJZCAobGV2ZWwpe1xyXG4gICAgICAgIGxldCBtYXRjaElkID0gY2Muc3lzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKFwibWF0Y2hJZFwiKTtcclxuICAgICAgICBpZihtYXRjaElkID09IFwidW5kaWZlbmRcIiB8fCBtYXRjaElkPT1udWxsKXtcclxuICAgICAgICAgICAgbWF0Y2hJZCA9ICB0aGlzLnNldE1hdGNoSWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgaWYodGhpcy5jb250YWluc05hbmFuYShtYXRjaElkKSA9PSB0cnVlKXtcclxuICAgICAgICAgICAgICAgIG1hdGNoSWQgPSAgdGhpcy5zZXRNYXRjaElkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIGxldCBjaGFyICA9IHBhcnNlSW50KGNjLnN5cy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIm1hdGNoTnVtYmVyXCIpKTtcclxuICAgICAgICAgICAgICAgIGlmKGxldmVsID09IDEpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYXIgKz0gMTtcclxuICAgICAgICAgICAgICAgICAgICBjYy5zeXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJtYXRjaE51bWJlclwiLGNoYXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbWF0Y2hJZCAgPSBtYXRjaElkLnNsaWNlKDAsIDEwKSArIGNoYXIgKyBcIlwiO1xyXG4gICAgICAgICAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8ubWF0Y2hJZCA9IG1hdGNoSWQ7XHJcbiAgICAgICAgICAgICAgICBjYy5zeXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJtYXRjaElkXCIsbWF0Y2hJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoSWQ7XHJcbiAgICB9LFxyXG4gICAgLy/mo4DmtYttYXRjaElkIOWmguaenOaciee8k+WtmOS7peWJjeeahG5hbmFuYeaVsOaNrua4hemZpFxyXG4gICAgY29udGFpbnNOYW5hbmEoc3RyKSB7XHJcbiAgICAgICAgcmV0dXJuIC9uYS9pLnRlc3Qoc3RyKTtcclxuICAgIH0sXHJcbiAgICAvL+mHjeaWsOiuvue9rk1hdGNoSWRcclxuICAgIHNldE1hdGNoSWQgKCl7XHJcbiAgICAgICAgLy8g5a6a5LmJ5YyF5ZCr5Y+v55So5a2X56ym55qE5a2X56ym6ZuGXHJcbiAgICAgICAgY29uc3QgY2hhcmFjdGVycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSc7XHJcbiAgICAgICAgLy8g5Yib5bu65LiA5Liq5pWw57uE5Lul5L+d5a2Y6ZqP5py65a2X56ymXHJcbiAgICAgICAgY29uc3QgdXVpZEFycmF5ID0gW107XHJcbiAgICAgICAgLy8g5b6q546vMTDmrKEg55Sf5oiQMTDkvY3nmoRVVUlEXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyDnlJ/miJDpmo/mnLrntKLlvJXvvIzojIPlm7TmmK/lrZfnrKbpm4bnmoTplb/luqZcclxuICAgICAgICAgICAgY29uc3QgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyYWN0ZXJzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIC8vIOS7juWtl+espumbhuS4reiOt+WPlumaj+acuuWtl+esplxyXG4gICAgICAgICAgICBjb25zdCByYW5kb21DaGFyID0gY2hhcmFjdGVycy5jaGFyQXQocmFuZG9tSW5kZXgpO1xyXG4gICAgICAgICAgICAvLyDlsIblrZfnrKbmt7vliqDliLDmlbDnu4TkuK1cclxuICAgICAgICAgICAgdXVpZEFycmF5LnB1c2gocmFuZG9tQ2hhcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBkYXRhID0gIHV1aWRBcnJheS5qb2luKCcnKSArIDEgKyBcIlwiO1xyXG4gICAgICAgIGNjLnN5cy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIm1hdGNoTnVtYmVyXCIsMSk7XHJcbiAgICAgICAgY2Muc3lzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwibWF0Y2hJZFwiLGRhdGEpO1xyXG4gICAgICAgIEdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLm1hdGNoSWQgPSBkYXRhO1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfSxcclxuICAgIFxyXG4gICAgZ2V0U2V0U2NyZWVuUmVzb2x1dGlvbkZsYWc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgc2l6ZSA9IGNjLndpblNpemU7XHJcbiAgICAgICAgbGV0IHdpZHRoID0gc2l6ZS53aWR0aDtcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgaWYgKChoZWlnaHQgLyB3aWR0aCkgPiAoMTYuMiAvIDkpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG4gICAgLy/liKTmlq3lhajpnaLlsY/pgILphY1cclxuICAgIHNldEZpdDogZnVuY3Rpb24gKGNhbnZhcykge1xyXG4gICAgICAgIGxldCBmbGFnID0gR2FtZVRvb2wuZ2V0U2V0U2NyZWVuUmVzb2x1dGlvbkZsYWcoKTtcclxuICAgICAgICBpZiAoZmxhZykge1xyXG4gICAgICAgIFx0Ly8gY29uc29sZS5sb2coXCLkuI3mmK/lhajpnaLlsY9cIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICBcdC8vIGNvbnNvbGUubG9nKFwi5piv5YWo6Z2i5bGPXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZztcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0VGlwOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNCkgKyAxO1xyXG4gICAgICAgIHN3aXRjaCAoaW5kZXgpIHtcclxuICAgICAgICAgICAgY2FzZSAxOiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCLmoLnmja7lsI/nkIPnmoTkvY3nva7vvIzlkIjnkIbmmYPliqjmiYvmnLrvvIznoa7kv53lsI/nkIPkuI3mjonlh7rmnKjmnb/jgIJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgMjoge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwi5qC55o2u5bCP55CD5L2N572u5o6n5Yi25pmD5Yqo5bmF5bqm77yM6L+H5aSn5oiW6L+H5bCP6YO95LiN5piv5Liq5aW96YCJ5oup44CCXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIDM6IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIuS4jeimgeiiq+WkqeS4iuaOieiQveeahOmanOeijeWQk+WIsO+8jOacieaXtuWAmeWug+WPjeiAjOS8muW4ruS9oOS/neaMgeW5s+ihoeOAglwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSA0OiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCLlsJ3or5XnnYDpobblvIDmjonokL3nmoTpmpznoo3vvIzmmK/kuKrlvojphbfnmoTnjqnms5XjgIJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBiZWdpblRpbWluZzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICBlbmRUaW1pbmc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLl9lbmRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgLy8gdGhpcy5fdG90YWxUaW1lID0gZW5kVGltZSAtIHRoaXMuX3N0YXJ0VGltZTtcclxuICAgIH0sXHJcbiAgICAvL+WmguaenOaYr+WIpOaWreaXtuW4uOeahOa4uOaIjyDosIPnlKjmraTmlrnms5VcclxuICAgIHVwZGF0ZVNjb3JlVGltZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBlbmRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgbGV0IHRlbXBUaW1lID0gZW5kVGltZSAtIHRoaXMuX3N0YXJ0VGltZTtcclxuICAgICAgICBpZiAodGVtcFRpbWUgPCAwIHx8IHRlbXBUaW1lID4gNTAwKSB7XHJcbiAgICAgICAgICAgIHRlbXBUaW1lID0gTWF0aC5yb3VuZChjYy5kaXJlY3Rvci5nZXRBbmltYXRpb25JbnRlcnZhbCgpICogMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2VuZFRpbWUgKz0gdGVtcFRpbWUgLyAxMDAwO1xyXG4gICAgICAgIHRoaXMuX3RvdGFsVGltZSA9IHRoaXMuX2VuZFRpbWUudG9GaXhlZCgyKTtcclxuICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5jdXJyU2NvcmUgPSB0aGlzLl90b3RhbFRpbWU7XHJcbiAgICAgICAgdGhpcy5fc3RhcnRUaW1lID0gZW5kVGltZTtcclxuICAgIH0sXHJcbiAgICAvL+WAkuiuoeaXtuiwg+eUqOatpOaWueazlVxyXG4gICAgY291bnREb3duOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5fZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIHRoaXMuX3RvdGFsVGltZSA9IE1hdGguZmxvb3IoKHRoaXMuX2VuZFRpbWUgLSB0aGlzLl9zdGFydFRpbWUpIC8gMTAwMCk7XHJcbiAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8ucmVtYWluaW5nVGltZSA9IEdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLnRvdGFsVGltZSAtIHRoaXMuX3RvdGFsVGltZTtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0R2FtZUluZm86IGZ1bmN0aW9uKG5vZGUpe1xyXG4gICAgICAgIHZhciBqZyA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBqZztcclxuICAgIH0sXHJcbiAgICAvL+agueaNruacjeWKoeWZqOaVsOaNrumHjee9ruaJgOmcgOimgeaJgOacieaVsOaNrlxyXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCLmnKzlnLDmlbDmja7kuKLlpLEs6YeN5paw5ZCv5Yqo5ri45oiPXCIpO1xyXG4gICAgICAgIGNjLmRpcmVjdG9yLmxvYWRTY2VuZSgnTG9hZFNjZW5lJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldEdhbWVJbmZvOiBmdW5jdGlvbihwZCl7XHJcbiAgIFxyXG4gICAgfSxcclxuICAgIC8v6L6T5YWl56eSLOi/lOWbnumcgOimgeWxleekuuaXtumXtOagvOW8j1xyXG4gICAgZ2V0VGltZU1hcmdpbjooc2Vjb25kKSA9PiB7XHJcbiAgICAgICAgbGV0IHRvdGFsID0gc2Vjb25kO1xyXG4gICAgICAgIGxldCBob3VyID0gTWF0aC5mbG9vcih0b3RhbCAvICg2MCAqIDYwKSk7Ly/orqHnrpfmlbTmlbDlsI/ml7bmlbBcclxuICAgICAgICBsZXQgYWZ0ZXJIb3VyID0gdG90YWwgLSBob3VyICogNjAgKiA2MDsvL+WPluW+l+eul+WHuuWwj+aXtuaVsOWQjuWJqeS9meeahOenkuaVsFxyXG4gICAgICAgIGxldCBtaW4gPSBNYXRoLmZsb29yKGFmdGVySG91ciAvIDYwKTsvL+iuoeeul+aVtOaVsOWIhlxyXG4gICAgICAgIGxldCBhZnRlck1pbiA9IHRvdGFsIC0gaG91ciAqIDYwICogNjAgLSBtaW4gKiA2MDsvL+WPluW+l+eul+WHuuWIhuWQjuWJqeS9meeahOenkuaVsFxyXG4gICAgICAgIHJldHVybiAn5Ymp5L2ZOicgKyBob3VyICsgJzonICsgbWluICsgJzonICsgYWZ0ZXJNaW5cclxuICAgIH0sXHJcblxyXG4gICAgZ2V0VGltZU1hcmdpbjI6KHNlY29uZCkgPT4ge1xyXG4gICAgICAgIGxldCB0b3RhbCA9IHNlY29uZDtcclxuICAgICAgICBsZXQgbWluID0gbnVsbDtcclxuICAgICAgICBsZXQgYWZ0ZXJNaW4gPSBudWxsO1xyXG4gICAgICAgIGxldCBob3VyID0gTWF0aC5mbG9vcih0b3RhbCAvICg2MCAqIDYwKSk7Ly/orqHnrpfmlbTmlbDlsI/ml7bmlbBcclxuICAgICAgICBsZXQgYWZ0ZXJIb3VyID0gdG90YWwgLSBob3VyICogNjAgKiA2MDsvL+WPluW+l+eul+WHuuWwj+aXtuaVsOWQjuWJqeS9meeahOenkuaVsFxyXG4gICAgICAgIG1pbiA9IE1hdGguZmxvb3IoYWZ0ZXJIb3VyIC8gNjApOy8v6K6h566X5pW05pWw5YiGXHJcbiAgICAgICAgaWYobWluIDwgMTApIG1pbiA9IFwiMFwiK21pbjtcclxuICAgICAgICBhZnRlck1pbiA9IHRvdGFsIC0gaG91ciAqIDYwICogNjAgLSBtaW4gKiA2MDsvL+WPluW+l+eul+WHuuWIhuWQjuWJqeS9meeahOenkuaVsFxyXG4gICAgICAgIGlmKGFmdGVyTWluIDwgMTApIGFmdGVyTWluID0gXCIwXCIgKyBhZnRlck1pbjtcclxuICAgICAgICByZXR1cm4gJ+WJqeS9mTonICArIG1pbiArICc6JyArIGFmdGVyTWluXHJcbiAgICB9LFxyXG4gICAgLy/lsIbml7bpl7TovazmjaLkuLo1OToyM1xyXG4gICAgZ2V0VGltZTogZnVuY3Rpb24odGltZSl7XHJcbiAgICAgICAgdmFyIGxhYmVsID0gXCJcIjtcclxuICAgICAgICB2YXIgbnVtYmVyXzEgPSBudWxsO1xyXG4gICAgICAgIHZhciBudW1iZXJfMiA9IG51bGw7XHJcbiAgICAgICAgbnVtYmVyXzEgPSBNYXRoLmZsb29yKHRpbWUvNjApXHJcbiAgICAgICAgbnVtYmVyXzIgPSB0aW1lLW51bWJlcl8xKjYwO1xyXG4gICAgICAgIGlmKG51bWJlcl8xIDwgMTApe1xyXG4gICAgICAgICAgICBudW1iZXJfMSA9IFwiMFwiK251bWJlcl8xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihudW1iZXJfMiA8IDEwKXtcclxuICAgICAgICAgICAgbnVtYmVyXzIgPSBcIjBcIitudW1iZXJfMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGFiZWwgPSBudW1iZXJfMSArIFwiOlwiICsgbnVtYmVyXzI7XHJcbiAgICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgfSxcclxuICAgIC8vbnVtYmVyIOS4uuS8oOi/m+adpeeahOaVsOWAvCx0eXBl5Li65pyA5aSa5pi+56S65Yeg5L2N5pWwXHJcbiAgICBnZXROdW1iZXI6IGZ1bmN0aW9uKG51bWJlcix0eXBlKXtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0eXBlLFwi6ZyA6KaB6L2s5o2i55qE5pWw5a2X5Li6OlwiLG51bWJlcik7XHJcbiAgICAgICAgdmFyIGNvdW50ID0gMTAwMDtcclxuICAgICAgICB2YXIgcGxhY2UgPSB0eXBlIC0gMztcclxuICAgICAgICBpZihudW1iZXIgPiBNYXRoLnBvdyhjb3VudCw4KSpNYXRoLnBvdygxMCxwbGFjZSkpe1xyXG4gICAgICAgICAgICBpZihudW1iZXIvTWF0aC5wb3coY291bnQsOCkgPCAxMDApXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBNYXRoLmZsb29yKG51bWJlci9NYXRoLnBvdyhjb3VudCw4KSoxMCkvMTArXCJTXCI7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IE1hdGguZmxvb3IobnVtYmVyL01hdGgucG93KGNvdW50LDgpKStcIlNcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihudW1iZXIgPiBNYXRoLnBvdyhjb3VudCw3KSpNYXRoLnBvdygxMCxwbGFjZSkpe1xyXG4gICAgICAgICAgICBpZihudW1iZXIvTWF0aC5wb3coY291bnQsNykgPCAxMDApXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBNYXRoLmZsb29yKG51bWJlci9NYXRoLnBvdyhjb3VudCw3KSoxMCkvMTArXCJzXCI7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IE1hdGguZmxvb3IobnVtYmVyL01hdGgucG93KGNvdW50LDcpKStcInNcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihudW1iZXIgPiBNYXRoLnBvdyhjb3VudCw2KSpNYXRoLnBvdygxMCxwbGFjZSkpe1xyXG4gICAgICAgICAgICBpZihudW1iZXIvTWF0aC5wb3coY291bnQsNikgPCAxMDApXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBNYXRoLmZsb29yKG51bWJlci9NYXRoLnBvdyhjb3VudCw2KSoxMCkvMTArXCJRXCI7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IE1hdGguZmxvb3IobnVtYmVyL01hdGgucG93KGNvdW50LDYpKStcIlFcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihudW1iZXIgPiBNYXRoLnBvdyhjb3VudCw1KSpNYXRoLnBvdygxMCxwbGFjZSkpe1xyXG4gICAgICAgICAgICBpZihudW1iZXIvTWF0aC5wb3coY291bnQsNSkgPCAxMDApXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBNYXRoLmZsb29yKG51bWJlci9NYXRoLnBvdyhjb3VudCw1KSoxMCkvMTArXCJxXCI7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IE1hdGguZmxvb3IobnVtYmVyL01hdGgucG93KGNvdW50LDUpKStcInFcIjtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYobnVtYmVyID4gTWF0aC5wb3coY291bnQsNCkqTWF0aC5wb3coMTAscGxhY2UpKXtcclxuICAgICAgICAgICAgaWYobnVtYmVyL01hdGgucG93KGNvdW50LDQpIDwgMTAwKVxyXG4gICAgICAgICAgICAgICAgbnVtYmVyID0gTWF0aC5mbG9vcihudW1iZXIvTWF0aC5wb3coY291bnQsNCkqMTApLzEwK1widFwiO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBNYXRoLmZsb29yKG51bWJlci9NYXRoLnBvdyhjb3VudCw0KSkrXCJ0XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYobnVtYmVyID4gTWF0aC5wb3coY291bnQsMykqTWF0aC5wb3coMTAscGxhY2UpKXtcclxuICAgICAgICAgICAgaWYobnVtYmVyL01hdGgucG93KGNvdW50LDMpIDwgMTAwKVxyXG4gICAgICAgICAgICAgICAgbnVtYmVyID0gTWF0aC5mbG9vcihudW1iZXIvTWF0aC5wb3coY291bnQsMykqMTApLzEwK1wiYlwiO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBNYXRoLmZsb29yKG51bWJlci9NYXRoLnBvdyhjb3VudCwzKSkrXCJiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYobnVtYmVyID4gTWF0aC5wb3coY291bnQsMikqTWF0aC5wb3coMTAscGxhY2UpKXtcclxuICAgICAgICAgICAgaWYobnVtYmVyL01hdGgucG93KGNvdW50LDIpIDwgMTAwKVxyXG4gICAgICAgICAgICAgICAgbnVtYmVyID0gTWF0aC5mbG9vcihudW1iZXIvTWF0aC5wb3coY291bnQsMikqMTApLzEwK1wibVwiO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBNYXRoLmZsb29yKG51bWJlci9NYXRoLnBvdyhjb3VudCwyKSkrXCJtXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYobnVtYmVyID4gTWF0aC5wb3coY291bnQsMSkqTWF0aC5wb3coMTAscGxhY2UpKXtcclxuICAgICAgICAgICAgaWYobnVtYmVyL01hdGgucG93KGNvdW50LDEpIDwgMTAwKXtcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IE1hdGguZmxvb3IobnVtYmVyL01hdGgucG93KGNvdW50LDEpKjEwKS8xMCtcImtcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBNYXRoLmZsb29yKG51bWJlci9NYXRoLnBvdyhjb3VudCwxKSkrXCJrXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIG51bWJlciA9IE1hdGguZmxvb3IobnVtYmVyL01hdGgucG93KGNvdW50LDApKStcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIue7k+aenOS4ulwiK3R5cGUrXCLkvY3mlbBcIixudW1iZXIpO1xyXG4gICAgICAgIHJldHVybiBudW1iZXI7XHJcbiAgICB9LFxyXG5cclxuICAgIGJlZ2FpblRpbWluZzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICBlbmRUaW1pbmcyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICB0aGlzLl9lbmRUaW1lID0gZW5kVGltZTtcclxuICAgICAgICB0aGlzLl90b3RhbFRpbWUgPSBlbmRUaW1lIC0gdGhpcy5fc3RhcnRUaW1lO1xyXG4gICAgfSxcclxuICAgIGdldFNjb3JlVGltZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBlbmRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgbGV0IHRlbXBUaW1lID0gZW5kVGltZSAtIHRoaXMuX3N0YXJ0VGltZTtcclxuICAgICAgICBpZiAodGVtcFRpbWUgPCAwIHx8IHRlbXBUaW1lID4gNTAwKSB7XHJcbiAgICAgICAgICAgIHRlbXBUaW1lID0gTWF0aC5yb3VuZChjYy5kaXJlY3Rvci5nZXRBbmltYXRpb25JbnRlcnZhbCgpICogMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLmN1cnJTY29yZSArPSB0ZW1wVGltZTtcclxuICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSBlbmRUaW1lO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRGb3JtYXRUaW1lOiBmdW5jdGlvbiAodGltZSkge1xyXG4gICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICBkYXRlLnNldFRpbWUodGltZSk7XHJcbiAgICAgICAgbGV0IG1zID0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTtcclxuICAgICAgICAvLyBsZXQgbXNTdHJpbmcgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgIGxldCBtc1N0cmluZyA9IG51bGw7XHJcbiAgICAgICAgbGV0IHNlY29uZFN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgbGV0IG1pblN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgbXNTdHJpbmcgPSBNYXRoLmZsb29yKG1zIC8gMTApICUgMTAwO1xyXG4gICAgICAgIHNlY29uZFN0cmluZyA9IGRhdGUuZ2V0U2Vjb25kcygpO1xyXG4gICAgICAgIG1pblN0cmluZyA9IGRhdGUuZ2V0TWludXRlcygpO1xyXG4gICAgICAgIGlmIChtc1N0cmluZyA8IDEwKSB7XHJcbiAgICAgICAgICAgIG1zU3RyaW5nID0gXCIwXCIgKyBtc1N0cmluZztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNlY29uZFN0cmluZyA8IDEwKSB7XHJcbiAgICAgICAgICAgIHNlY29uZFN0cmluZyA9IFwiMFwiICsgc2Vjb25kU3RyaW5nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZWNvbmRTdHJpbmcgPSBzZWNvbmRTdHJpbmcgKyBcIjpcIjtcclxuXHJcbiAgICAgICAgaWYgKG1pblN0cmluZyA8IDEwKSB7XHJcbiAgICAgICAgICAgIG1pblN0cmluZyA9IFwiMFwiICsgbWluU3RyaW5nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBtaW5TdHJpbmcgPSBtaW5TdHJpbmcgKyBcIjpcIjtcclxuICAgICAgICByZXR1cm4gbWluU3RyaW5nICsgc2Vjb25kU3RyaW5nICsgbXNTdHJpbmc7XHJcblxyXG4gICAgfSxcclxuICAgIHB1c2hMaXN0ZXI6ZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIFxyXG4gICAgfSxcclxuICAgIHJlbW92ZUFsbExpc3RlcjpmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgXHJcbiAgICB9LFxyXG5cclxufTtcclxuZXhwb3J0IHsgR2FtZVRvb2wgfTsiXX0=