com.hikky.vketcloudsdk
Version:
This is the SDK for creating the world in VketCloud.
11,845 lines • 1.45 MB
JavaScript
(() => {
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __esm = (fn, res) => function __init() {
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
};
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
// scripts/const.ts
var heliportWindow, MOBILE_USER_AGENT_REGS, IPHONE_USER_AGENT_REGS, IOS_VER_15;
var init_const = __esm({
"scripts/const.ts"() {
"use strict";
heliportWindow = window;
MOBILE_USER_AGENT_REGS = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
IPHONE_USER_AGENT_REGS = /iPhone|iPod/i;
IOS_VER_15 = 1500;
}
});
// scripts/configs/development.ts
var devConfig;
var init_development = __esm({
"scripts/configs/development.ts"() {
"use strict";
devConfig = {
skywayKey: "development",
socketIOUrl: "development",
printLog: true,
vketCloudDomain: "http://labtest.vketcloud.com",
uploadApiDomain: "https://staging.asset-upload.hikky.dev",
accountApiDomain: "https://account.vket.dev",
authClientId: "Kl2dnR0q3PlILGG1-A7oXwmIJNM-tNdYm82jcq-Jr_c",
vrAdDomain: "https://api-6kueossvhq-an.a.run.app",
resourceApiDomain: "https://resources.api.hikky.dev",
roomDomain: "https://proto.vcb.hikky.dev"
};
}
});
// scripts/configs/production.ts
var init_production = __esm({
"scripts/configs/production.ts"() {
"use strict";
}
});
// scripts/configs/index.ts
var getConfig;
var init_configs = __esm({
"scripts/configs/index.ts"() {
"use strict";
init_const();
init_development();
init_production();
getConfig = function() {
if (false) {
return prodConfig;
}
return devConfig;
};
heliportWindow.getConfig = getConfig;
}
});
// scripts/utils/debug.ts
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i = 0, arr2 = new Array(len); i < len; i++)
arr2[i] = arr[i];
return arr2;
}
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray(arr);
}
function _iterableToArray(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
}
function _unsupportedIterableToArray(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor)
n = o.constructor.name;
if (n === "Map" || n === "Set")
return Array.from(n);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))
return _arrayLikeToArray(o, minLen);
}
var config, formatDate, getNowDate, debugLog;
var init_debug = __esm({
"scripts/utils/debug.ts"() {
"use strict";
init_configs();
config = getConfig();
formatDate = function(date) {
return "".concat(date.getFullYear(), "-").concat(date.getMonth() + 1, "-").concat(date.getDate(), " ").concat(date.getHours(), ":").concat(date.getMinutes(), " ").concat(date.getSeconds());
};
getNowDate = function() {
var date = new Date();
return formatDate(date);
};
debugLog = function(text) {
for (var _len = arguments.length, optionalParams = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
optionalParams[_key - 1] = arguments[_key];
}
var _console;
if (!config.printLog) {
return;
}
(_console = console).log.apply(_console, [
"[ ".concat(getNowDate(), " ] ").concat(text)
].concat(_toConsumableArray(optionalParams)));
};
}
});
// scripts/modules/dom.ts
var getMainCanvas, getConfigUrl, getConfigUrlText, getUserName, getUserNameText, getGUIDebug, getGUIDebugTab, getMsg, getLocalText, getScreenShotContainer, getScreenShotModal, getScreenShotModalCloseButton, reflectCanvasSize;
var init_dom = __esm({
"scripts/modules/dom.ts"() {
"use strict";
init_const();
getMainCanvas = function() {
return document.getElementById("canvas");
};
getConfigUrl = function() {
return document.getElementById("configurl");
};
getConfigUrlText = function() {
return document.getElementById("configurl-text");
};
getUserName = function() {
return document.getElementById("username");
};
getUserNameText = function() {
return document.getElementById("username-text");
};
getGUIDebug = function() {
return document.getElementById("GUIdebug");
};
getGUIDebugTab = function() {
return document.getElementById("GUIdebugTab");
};
getMsg = function() {
return document.getElementById("msg");
};
getLocalText = function() {
return document.getElementById("js-local-text");
};
getScreenShotContainer = function() {
return document.querySelector("#__ss_modal");
};
getScreenShotModal = function() {
return document.querySelector("#__ss_modal-dialog-btn_open_ss");
};
getScreenShotModalCloseButton = function() {
return document.querySelector("#__ss_modal-dialog-btn_close");
};
reflectCanvasSize = function() {
if (!heliportWindow.g_ReflectCanvasSizeMode)
return;
var width = document.documentElement.clientWidth;
var height = document.documentElement.clientHeight;
if (width <= 0 || height <= 0) {
return;
}
var mainCanvas = getMainCanvas();
if (mainCanvas !== null) {
mainCanvas.width = width;
mainCanvas.height = height;
}
};
}
});
// scripts/modules/screenShotModal.ts
var container, modal, closeButton, hideScreenShotModal, initializeScreenShotModal, showScreenShotModal;
var init_screenShotModal = __esm({
"scripts/modules/screenShotModal.ts"() {
"use strict";
init_debug();
init_dom();
container = getScreenShotContainer();
modal = getScreenShotModal();
closeButton = getScreenShotModalCloseButton();
hideScreenShotModal = function() {
if (container === null) {
debugLog("[ hideScreenShotModal ] ScreenShotContainer not found so noop");
return;
}
container.style.visibility = "hidden";
};
initializeScreenShotModal = function() {
if (modal !== null) {
modal.removeEventListener("click", hideScreenShotModal);
modal.addEventListener("click", hideScreenShotModal);
}
if (closeButton !== null) {
closeButton.removeEventListener("click", hideScreenShotModal);
closeButton.addEventListener("click", hideScreenShotModal);
}
};
showScreenShotModal = function() {
if (container === null) {
debugLog("[ showScreenShotModal ] ScreenShotContainer not found so noop");
return;
}
container.style.visibility = "visible";
};
}
});
// scripts/deviceFeatures/configs.ts
var loadConfig;
var init_configs2 = __esm({
"scripts/deviceFeatures/configs.ts"() {
"use strict";
init_const();
init_screenShotModal();
loadConfig = function() {
heliportWindow.g_ReflectCanvasSizeMode = true;
initializeScreenShotModal();
};
}
});
// scripts/composables/useAnalytics.ts
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === "function") {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function(key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
var dataLayer, setAnalytics, setGtag, useAnalytics;
var init_useAnalytics = __esm({
"scripts/composables/useAnalytics.ts"() {
"use strict";
init_const();
init_debug();
dataLayer = heliportWindow.dataLayer;
setAnalytics = function(ev, aName, params) {
if (dataLayer === void 0) {
debugLog("[ setAnalytics ] dataLayer is undefined");
return;
}
debugLog(ev, aName, JSON.stringify(params));
var data = _objectSpread({
event: ev
}, params);
dataLayer.push(data);
};
setGtag = function(aName, params) {
if (typeof heliportWindow.gtag === "function") {
debugLog("[ setGtag ] set ".concat(aName, " event for params = ").concat(JSON.stringify(params)));
heliportWindow.gtag("event", aName, params);
}
};
useAnalytics = function() {
return {
setAnalytics,
setGtag
};
};
}
});
// scripts/deviceFeatures/useStorage.ts
var getLocalStorageValue, setLocalStorageValue, getSessionStorageValue, setSessionStorageValue, useStorage;
var init_useStorage = __esm({
"scripts/deviceFeatures/useStorage.ts"() {
"use strict";
getLocalStorageValue = function(key) {
return localStorage.getItem(key);
};
setLocalStorageValue = function(key, value) {
return localStorage.setItem(key, value);
};
getSessionStorageValue = function(key) {
return sessionStorage.getItem(key);
};
setSessionStorageValue = function(key, value) {
return sessionStorage.setItem(key, value);
};
useStorage = function() {
return {
getLocalStorageValue,
setLocalStorageValue,
getSessionStorageValue,
setSessionStorageValue
};
};
}
});
// scripts/modules/auth.ts
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var __generator, validateAuth;
var init_auth = __esm({
"scripts/modules/auth.ts"() {
"use strict";
init_useAuth();
init_useStorage();
__generator = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
validateAuth = function() {
var _ref = _asyncToGenerator(function() {
var isLoggedIn2, idToken;
return __generator(this, function(_state) {
switch (_state.label) {
case 0:
return [
4,
useAuth().isLoggedIn()
];
case 1:
isLoggedIn2 = _state.sent();
if (!isLoggedIn2) {
return [
2,
""
];
}
idToken = useStorage().getSessionStorageValue("id-token");
if (idToken === null) {
return [
2,
""
];
}
return [
2,
idToken
];
}
});
});
return function validateAuth2() {
return _ref.apply(this, arguments);
};
}();
}
});
// scripts/services/api.ts
function asyncGeneratorStep2(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator2(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep2(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep2(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
function _defineProperty2(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread2(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === "function") {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function(key) {
_defineProperty2(target, key, source[key]);
});
}
return target;
}
var __generator2, getCustomHeader, fetchApi;
var init_api = __esm({
"scripts/services/api.ts"() {
"use strict";
__generator2 = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
getCustomHeader = function(accessToken) {
if (!accessToken)
return {};
return {
Authorization: "Bearer ".concat(accessToken),
Accept: "application/json"
};
};
fetchApi = function() {
var _ref = _asyncToGenerator2(function(method, url) {
var sendData, token, fetchParams, customHeader;
var _arguments = arguments;
return __generator2(this, function(_state) {
sendData = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : {}, token = _arguments.length > 3 && _arguments[3] !== void 0 ? _arguments[3] : void 0;
fetchParams = {
method,
mode: "cors",
headers: {
"Content-Type": "application/json;charset=UTF-8"
},
body: void 0
};
if (method.toLowerCase() !== "get") {
fetchParams.body = JSON.stringify(sendData);
}
if (token) {
customHeader = getCustomHeader(token);
fetchParams.headers = _objectSpread2({}, fetchParams.headers, customHeader);
}
return [
2,
fetch(url, fetchParams)
];
});
});
return function fetchApi2(method, url) {
return _ref.apply(this, arguments);
};
}();
}
});
// scripts/services/repositories/assetRepository.ts
function asyncGeneratorStep3(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator3(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep3(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep3(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var __generator3, config2, domain, AssetsRepository;
var init_assetRepository = __esm({
"scripts/services/repositories/assetRepository.ts"() {
"use strict";
init_configs();
init_api();
__generator3 = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
config2 = getConfig();
domain = config2.uploadApiDomain;
AssetsRepository = {
get: {
getAssets: function getAssets(idToken) {
return _asyncToGenerator3(function() {
return __generator3(this, function(_state) {
return [
2,
fetchApi("get", "".concat(domain, "/assets?setting_label=vrm"), void 0, idToken)
];
});
})();
},
getAssetByToken: function getAssetByToken() {
var downloadToken = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "", password = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "";
return _asyncToGenerator3(function() {
return __generator3(this, function(_state) {
return [
2,
fetchApi("get", "".concat(domain, "/tokens/").concat(downloadToken, "?password=").concat(password))
];
});
})();
}
},
post: {
postAsset: function postAsset(idToken, name) {
var description = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "";
return _asyncToGenerator3(function() {
return __generator3(this, function(_state) {
return [
2,
fetchApi("post", "".concat(domain, "/assets"), {
name,
description
}, idToken)
];
});
})();
},
postAssetToken: function postAssetToken(idToken, uuid) {
var password = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "";
return _asyncToGenerator3(function() {
return __generator3(this, function(_state) {
return [
2,
fetchApi("post", "".concat(domain, "/tokens"), {
uuid,
password
}, idToken)
];
});
})();
}
},
put: {},
delete: {}
};
}
});
// scripts/services/repositories/authRepository.ts
function asyncGeneratorStep4(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator4(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep4(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep4(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var __generator4, config3, domain2, getPrefix, postPrefix, AuthRepository;
var init_authRepository = __esm({
"scripts/services/repositories/authRepository.ts"() {
"use strict";
init_configs();
init_api();
__generator4 = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
config3 = getConfig();
domain2 = config3.accountApiDomain;
getPrefix = "/api/v1";
postPrefix = "/oauth";
AuthRepository = {
get: {
fetchMyProfile: function fetchMyProfile(accessToken) {
return _asyncToGenerator4(function() {
return __generator4(this, function(_state) {
return [
2,
fetchApi("get", "".concat(domain2).concat(getPrefix, "/me"), void 0, accessToken)
];
});
})();
}
},
post: {
issueIdToken: function issueIdToken(clientId2, redirectUri2, refreshToken) {
return _asyncToGenerator4(function() {
return __generator4(this, function(_state) {
return [
2,
fetchApi("post", "".concat(domain2).concat(postPrefix, "/token"), {
grant_type: "refresh_token",
client_id: clientId2,
redirect_uri: redirectUri2,
refresh_token: refreshToken
}, void 0)
];
});
})();
}
},
put: {},
delete: {}
};
}
});
// scripts/services/repositories/profileRepository.ts
function asyncGeneratorStep5(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator5(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep5(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep5(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var __generator5, config4, LABO_PLATFORM_CODE, domain3, baseUrl, ProfileRepository;
var init_profileRepository = __esm({
"scripts/services/repositories/profileRepository.ts"() {
"use strict";
init_configs();
init_api();
__generator5 = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
config4 = getConfig();
LABO_PLATFORM_CODE = "labo";
domain3 = config4.accountApiDomain;
baseUrl = "".concat(domain3, "/api/").concat(LABO_PLATFORM_CODE);
ProfileRepository = {
get: {
getProfile: function() {
var _ref = _asyncToGenerator5(function(userId) {
return __generator5(this, function(_state) {
return [
2,
fetchApi("get", "".concat(baseUrl, "/user/profiles/").concat(userId))
];
});
});
return function(userId) {
return _ref.apply(this, arguments);
};
}(),
getMyProfile: function() {
var _ref = _asyncToGenerator5(function(idToken) {
return __generator5(this, function(_state) {
return [
2,
fetchApi("get", "".concat(baseUrl, "/user/profiles"), void 0, idToken)
];
});
});
return function(idToken) {
return _ref.apply(this, arguments);
};
}(),
getGuestProfile: function() {
var _ref = _asyncToGenerator5(function(uuid) {
return __generator5(this, function(_state) {
return [
2,
fetchApi("get", "".concat(baseUrl, "/user/guest_profiles/").concat(uuid))
];
});
});
return function(uuid) {
return _ref.apply(this, arguments);
};
}()
},
post: {
postProfile: function() {
var _ref = _asyncToGenerator5(function(idToken, name) {
return __generator5(this, function(_state) {
return [
2,
fetchApi("post", "".concat(baseUrl, "/user/profiles"), {
name
}, idToken)
];
});
});
return function(idToken, name) {
return _ref.apply(this, arguments);
};
}(),
postGuestProfile: function() {
var _ref = _asyncToGenerator5(function(uuid, name) {
return __generator5(this, function(_state) {
return [
2,
fetchApi("post", "".concat(baseUrl, "/user/guest_profiles"), {
uuid,
name
})
];
});
});
return function(uuid, name) {
return _ref.apply(this, arguments);
};
}(),
postProfileList: function() {
var _ref = _asyncToGenerator5(function(userIds) {
return __generator5(this, function(_state) {
return [
2,
fetchApi("post", "".concat(baseUrl, "/user/profiles/list"), {
userIds
})
];
});
});
return function(userIds) {
return _ref.apply(this, arguments);
};
}(),
postGuestProfileList: function(uuids) {
return fetchApi("post", "".concat(baseUrl, "/user/guest_profiles/list"), {
uuids
});
}
},
put: {
putProfile: function() {
var _ref = _asyncToGenerator5(function(idToken, name, introduction) {
return __generator5(this, function(_state) {
return [
2,
fetchApi("put", "".concat(baseUrl, "/user/profiles"), {
name,
introduction
}, idToken)
];
});
});
return function(idToken, name, introduction) {
return _ref.apply(this, arguments);
};
}(),
putProfileIcon: function() {
var _ref = _asyncToGenerator5(function(idToken, icon) {
var formData, fetchParams;
return __generator5(this, function(_state) {
formData = new FormData();
formData.append("icon", icon);
fetchParams = {
method: "put",
headers: {
Authorization: "Bearer ".concat(idToken)
},
body: formData
};
return [
2,
fetch("".concat(baseUrl, "/user/profiles"), fetchParams)
];
});
});
return function(idToken, icon) {
return _ref.apply(this, arguments);
};
}(),
putGuestProfile: function() {
var _ref = _asyncToGenerator5(function(uuid, name, introduction) {
return __generator5(this, function(_state) {
return [
2,
fetchApi("put", "".concat(baseUrl, "/user/guest_profiles/").concat(uuid), {
name,
introduction
})
];
});
});
return function(uuid, name, introduction) {
return _ref.apply(this, arguments);
};
}(),
putGuestProfileIcon: function() {
var _ref = _asyncToGenerator5(function(uuid, icon) {
var formData, fetchParams;
return __generator5(this, function(_state) {
formData = new FormData();
formData.append("icon", icon);
fetchParams = {
method: "put",
body: formData
};
return [
2,
fetch("".concat(baseUrl, "/user/guest_profiles/").concat(uuid), fetchParams)
];
});
});
return function(uuid, icon) {
return _ref.apply(this, arguments);
};
}()
},
delete: {}
};
}
});
// scripts/services/repositories/roomRepository.ts
function asyncGeneratorStep6(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator6(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep6(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep6(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var __generator6, config5, domain4, commonCallback, RoomRepository;
var init_roomRepository = __esm({
"scripts/services/repositories/roomRepository.ts"() {
"use strict";
init_configs();
init_api();
__generator6 = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
config5 = getConfig();
domain4 = config5.roomDomain;
commonCallback = function(fetched, option) {
if (fetched.status === 200 && option.done !== void 0) {
option.done();
return fetched;
}
if (fetched.status !== 200 && option.error !== void 0) {
option.error();
}
return fetched;
};
RoomRepository = {
get: {
getActiveRooms: function getActiveRooms(worldId, option) {
return _asyncToGenerator6(function() {
var fetched;
return __generator6(this, function(_state) {
switch (_state.label) {
case 0:
if (worldId === void 0 || worldId === null || worldId.length === 0) {
return [
2,
null
];
}
return [
4,
fetchApi("get", "".concat(domain4, "/rooms/world/").concat(worldId))
];
case 1:
fetched = _state.sent();
return [
2,
commonCallback(fetched, option)
];
}
});
})();
},
getRandomRoom: function getRandomRoom(worldId, option) {
return _asyncToGenerator6(function() {
var fetched;
return __generator6(this, function(_state) {
switch (_state.label) {
case 0:
if (worldId === void 0 || worldId === null || worldId.length === 0) {
return [
2,
null
];
}
return [
4,
fetchApi("get", "".concat(domain4, "/rooms/random/").concat(worldId))
];
case 1:
fetched = _state.sent();
return [
2,
commonCallback(fetched, option)
];
}
});
})();
},
getRoom: function getRoom(roomId, option) {
return _asyncToGenerator6(function() {
var worldId, fetched;
return __generator6(this, function(_state) {
switch (_state.label) {
case 0:
if (roomId === void 0 || roomId === null || roomId.length === 0) {
return [
2,
null
];
}
worldId = option.world_id || "";
return [
4,
fetchApi("get", "".concat(domain4, "/rooms/").concat(roomId, "/").concat(worldId))
];
case 1:
fetched = _state.sent();
return [
2,
commonCallback(fetched, option)
];
}
});
})();
},
getRoomStatus: function getRoomStatus(roomId, option) {
return _asyncToGenerator6(function() {
var fetched;
return __generator6(this, function(_state) {
switch (_state.label) {
case 0:
if (roomId === void 0 || roomId === null || roomId.length === 0) {
return [
2,
null
];
}
return [
4,
fetchApi("get", "".concat(domain4, "/rooms/").concat(roomId, "/status"))
];
case 1:
fetched = _state.sent();
return [
2,
commonCallback(fetched, option)
];
}
});
})();
}
},
post: {
createNewRoom: function createNewRoom(worldId, option) {
return _asyncToGenerator6(function() {
var fetched;
return __generator6(this, function(_state) {
switch (_state.label) {
case 0:
if (worldId === void 0 || worldId === null || worldId.length === 0) {
return [
2,
null
];
}
return [
4,
fetchApi("post", "".concat(domain4, "/rooms"), {
world_id: worldId
})
];
case 1:
fetched = _state.sent();
return [
2,
commonCallback(fetched, option)
];
}
});
})();
},
sendHeartbeat: function sendHeartbeat(roomId, playerCount, option) {
return _asyncToGenerator6(function() {
var fetched;
return __generator6(this, function(_state) {
switch (_state.label) {
case 0:
if (roomId === void 0 || roomId === null || roomId.length === 0) {
return [
2,
null
];
}
return [
4,
fetchApi("post", "".concat(domain4, "/rooms/").concat(roomId, "/heartbeat"), {
player_count: playerCount
})
];
case 1:
fetched = _state.sent();
return [
2,
commonCallback(fetched, option)
];
}
});
})();
}
},
put: {},
delete: {
cancelReserveRoom: function cancelReserveRoom(roomId, adminKey, option) {
return _asyncToGenerator6(function() {
var fetched;
return __generator6(this, function(_state) {
switch (_state.label) {
case 0:
if (roomId === void 0 || roomId === null || roomId.length === 0) {
return [
2,
null
];
}
return [
4,
fetchApi("delete", "".concat(domain4, "/rooms/").concat(roomId, "/cancel_reserve"), {
admin_key: adminKey
})
];
case 1:
fetched = _state.sent();
return [
2,
commonCallback(fetched, option)
];
}
});
})();
}
}
};
}
});
// scripts/services/repositories/vrAdRepository.ts
function asyncGeneratorStep7(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator7(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep7(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep7(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var __generator7, config6, domain5, createPath, VrAdRepository;
var init_vrAdRepository = __esm({
"scripts/services/repositories/vrAdRepository.ts"() {
"use strict";
init_configs();
init_api();
__generator7 = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
config6 = getConfig();
domain5 = config6.vrAdDomain;
createPath = function(worldId) {
return "".concat(domain5, "/v1/ads?world_id=").concat(worldId);
};
VrAdRepository = {
get: {
getAdList: function getAdList(worldId) {
return _asyncToGenerator7(function() {
return __generator7(this, function(_state) {
return [
2,
fetchApi("get", createPath(worldId))
];
});
})();
}
},
post: {},
put: {},
delete: {}
};
}
});
// scripts/services/factory.ts
var repositories, factory;
var init_factory = __esm({
"scripts/services/factory.ts"() {
"use strict";
init_assetRepository();
init_authRepository();
init_profileRepository();
init_roomRepository();
init_vrAdRepository();
repositories = {
assets: AssetsRepository,
auth: AuthRepository,
profile: ProfileRepository,
room: RoomRepository,
vrAd: VrAdRepository
};
factory = {
get: function(name) {
return repositories[name];
}
};
}
});
// scripts/composables/useAuth.ts
function asyncGeneratorStep8(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator8(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep8(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep8(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var __generator8, config7, clientId, redirectUri, authRepository, _decode, isAliveRefreshToken, _isAliveIdToken, _setIdToken, isLoggedIn, getMyProfile, useAuth;
var init_useAuth = __esm({
"scripts/composables/useAuth.ts"() {
"use strict";
init_configs();
init_useStorage();
init_auth();
init_factory();
init_debug();
__generator8 = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
config7 = getConfig();
clientId = config7.authClientId;
redirectUri = config7.vketCloudDomain;
authRepository = factory.get("auth");
_decode = function(token) {
try {
var base64Url = token.split(".")[1];
var base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
var jsonPayload = decodeURIComponent(atob(base64).split("").map(function(c) {
return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2);
}).join(""));
return JSON.parse(jsonPayload);
} catch (e) {
debugLog(e);
return null;
}
};
isAliveRefreshToken = function() {
var refreshToken = useStorage().getLocalStorageValue("refresh-token");
if (!refreshToken)
return false;
var tokenExpiresIn = useStorage().getLocalStorageValue("token-expires-in");
var tokenCreatedAt = useStorage().getLocalStorageValue("token-created-at");
var expired = tokenExpiresIn || 0;
var created = tokenCreatedAt || 0;
var expiredUnixTime = Number(expired) + Number(created);
var currentUnixTime = new Date().getTime() / 1e3;
return currentUnixTime < expiredUnixTime;
};
_isAliveIdToken = function() {
var _ref = _asyncToGenerator8(function() {
var validated, expiredUnixTime, currentUnixTime, e;
return __generator8(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
2,
,
3
]);
return [
4,
validateAuth()
];
case 1:
validated = _state.sent();
if (validated.length === 0) {
debugLog("[ _isAliveIdToken ] auth error");
return [
2,
false
];
}
expiredUnixTime = _decode(validated).exp || 0;
currentUnixTime = new Date().getTime() / 1e3;
return [
2,
currentUnixTime < expiredUnixTime
];
case 2:
e = _state.sent();
debugLog(e);
return [
2,
false
];
case 3:
return [
2
];
}
});
});
return function _isAliveIdToken2() {
return _ref.apply(this, arguments);
};
}();
_setIdToken = function() {
var _ref = _asyncToGenerator8(function() {
var refreshToken, response, responseJson, e;
return __generator8(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
3,
,
4
]);
refreshToken = useStorage().getLocalStorageValue("refresh-token");
if (!refreshToken)
throw new Error("token went wrong.");
if (!clientId)
throw new Error("client_id went wrong.");
if (!redirectUri)
throw new Error("redirect_uri went wrong.");
return [
4,
authRepository.post.issueIdToken(clientId, redirectUri, refreshToken)
];
case 1:
response = _state.sent();
return [
4,
response.json()
];
case 2:
responseJson = _state.sent();
if (response.ok || response.status === 200) {
useStorage().setLocalStorageValue("access-token", responseJson.access_token);
useStorage().setLocalStorageValue("token-expires-in", responseJson.expires_in.toString());
useStorage().setLocalStorageValue("token-created-at", responseJson.created_at.toString());
useStorage().setLocalStorageValue("refresh-token", responseJson.refresh_token);
useStorage().setSessionStorageValue("id-token", responseJson.id_token);
}
return [
3,
4
];
case 3:
e = _state.sent();
debugLog(e);
return [
3,
4
];
case 4:
return [
2
];
}
});
});
return function _setIdToken2() {
return _ref.apply(this, arguments);
};
}();
isLoggedIn = function() {
var _ref = _asyncToGenerator8(function() {
return __generator8(this, function(_state) {
switch (_state.label) {
case 0:
debugLog("!isAliveRefreshToken => ".concat(!isAliveRefreshToken()));
if (!isAliveRefreshToken())
return [
2,
false
];
return [
4,
_isAliveIdToken()
];
case 1:
if (!!_state.sent())
return [
3,
3
];
return [
4,
_setIdToken()
];
case 2:
_state.sent();
_state.label = 3;
case 3:
return [
2,
true
];
}
});
});
return function isLoggedIn2() {
return _ref.apply(this, arguments);
};
}();
getMyProfile = function() {
var _ref = _asyncToGenerator8(function() {
var accessToken, profile, e;
return __generator8(this, function(_state) {
switch (_state.label) {
case 0:
accessToken = useStorage().getLocalStorageValue("access-token");
_state.label = 1;
case 1:
_state.trys.push([
1,
5,
,
6
]);
if (!(accessToken && isAliveRefreshToken()))
return [
3,
4
];
return [
4,
authRepository.get.fetchMyProfile(accessToken)
];
case 2:
profile = _state.sent();
return [
4,
profile.json()
];
case 3:
return [
2,
_state.sent().toString()
];
case 4:
debugLog("not logged in.");
return [
2,
""
];
case 5:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 6:
return [
2
];
}
});
});
return function getMyProfile2() {
return _ref.apply(this, arguments);
};
}();
useAuth = function() {
return {
isAliveRefreshToken,
isLoggedIn,
getMyProfile
};
};
}
});
// scripts/composables/useAvatar.ts
function asyncGeneratorStep9(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator9(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep9(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep9(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var __generator9, assetsRepository, fetchMyAvatarList, fetchMyAvatarToken, fetchOthersAvatarUrl, useAvatar;
var init_useAvatar = __esm({
"scripts/composables/useAvatar.ts"() {
"use strict";
init_useStorage();
init_auth();
init_factory();
init_debug();
init_useAuth();
__generator9 = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
assetsRepository = factory.get("assets");
fetchMyAvatarList = function() {
var _ref = _asyncToGenerator9(function() {
var validated, result, _, e;
return __generator9(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
4,
,
5
]);
return [
4,
validateAuth()
];
case 1:
validated = _state.sent();
if (validated.length === 0) {
debugLog("[ fetchMyAvatarList ] auth error");
return [
2,
""
];
}
return [
4,
assetsRepository.get.getAssets(validated)
];
case 2:
result = _state.sent();
_ = JSON.stringify;
return [
4,
result.json()
];
case 3:
return [
2,
_.apply(JSON, [
_state.sent()
])
];
case 4:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 5:
return [
2
];
}
});
});
return function fetchMyAvatarList2() {
return _ref.apply(this, arguments);
};
}();
fetchMyAvatarToken = function() {
var _ref = _asyncToGenerator9(function(uuid, password) {
var isLoggedIn2, idToken, result, _, e;
return __generator9(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
5,
,
6
]);
return [
4,
useAuth().isLoggedIn()
];
case 1:
isLoggedIn2 = _state.sent();
if (!isLoggedIn2)
throw new Error("not logged in");
idToken = useStorage().getSessionStorageValue("id-token");
if (!idToken)
throw new Error("no id-token");
if (!(uuid && password))
return [
3,
4
];
return [
4,
assetsRepository.post.postAssetToken(idToken, uuid, password)
];
case 2:
result = _state.sent();
_ = JSON.stringify;
return [
4,
result.json()
];
case 3:
return [
2,
_.apply(JSON, [
_state.sent()
])
];
case 4:
throw new Error("no params");
case 5:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 6:
return [
2
];
}
});
});
return function fetchMyAvatarToken2(uuid, password) {
return _ref.apply(this, arguments);
};
}();
fetchOthersAvatarUrl = function() {
var _ref = _asyncToGenerator9(function(downloadToken, password) {
var result, _, e;
return __generator9(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
4,
,
5
]);
if (!(downloadToken && password))
return [
3,
3
];
return [
4,
assetsRepository.get.getAssetByToken(downloadToken, password)
];
case 1:
result = _state.sent();
_ = JSON.stringify;
return [
4,
result.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent()
])
];
case 3:
throw new Error("no params");
case 4:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 5:
return [
2
];
}
});
});
return function fetchOthersAvatarUrl2(downloadToken, password) {
return _ref.apply(this, arguments);
};
}();
useAvatar = function() {
return {
fetchMyAvatarList,
fetchMyAvatarToken,
fetchOthersAvatarUrl
};
};
}
});
// scripts/composables/useInterval.ts
var timers, setIntervalDelegate, clearIntervalDelegate, useInterval;
var init_useInterval = __esm({
"scripts/composables/useInterval.ts"() {
"use strict";
timers = {};
setIntervalDelegate = function(intervalKey, func, span) {
if (timers[intervalKey] === void 0) {
timers[intervalKey] = setInterval(func, span);
}
};
clearIntervalDelegate = function(intervalKey) {
if (timers[intervalKey] !== void 0) {
clearInterval(timers[intervalKey]);
timers[intervalKey] = void 0;
}
};
useInterval = function() {
return {
setIntervalDelegate,
clearIntervalDelegate
};
};
}
});
// scripts/composables/useProfile.ts
function asyncGeneratorStep10(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator10(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep10(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep10(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var __generator10, profileRepository, fetchMyProfile2, updateProfile, updateProfileIcon, fetchUserProfile, fetchMyGuestProfile, updateGuestProfile, updateGuestProfileIcon, fetchUserGuestProfile, fetchUserProfileList, fetchUserGuestProfileList, useProfile;
var init_useProfile = __esm({
"scripts/composables/useProfile.ts"() {
"use strict";
init_const();
init_auth();
init_factory();
init_debug();
__generator10 = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
profileRepository = factory.get("profile");
fetchMyProfile2 = function() {
var _ref = _asyncToGenerator10(function() {
var validated, myProfile, _, createResponse, _1, e;
return __generator10(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
7,
,
8
]);
return [
4,
validateAuth()
];
case 1:
validated = _state.sent();
if (validated.length === 0) {
debugLog("[ fetchMyProfile ] auth error");
return [
2,
""
];
}
return [
4,
profileRepository.get.getMyProfile(validated)
];
case 2:
myProfile = _state.sent();
if (!myProfile.ok)
return [
3,
4
];
_ = JSON.stringify;
return [
4,
myProfile.json()
];
case 3:
return [
2,
_.apply(JSON, [
_state.sent().profile
])
];
case 4:
debugLog("[ fetchMyProfile ] error fetched. status = ".concat(myProfile.status, ". postProfile..."));
return [
4,
profileRepository.post.postProfile(validated, heliportWindow.g_CurrentUserName)
];
case 5:
createResponse = _state.sent();
_1 = JSON.stringify;
return [
4,
createResponse.json()
];
case 6:
return [
2,
_1.apply(JSON, [
_state.sent().profile
])
];
case 7:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 8:
return [
2
];
}
});
});
return function fetchMyProfile3() {
return _ref.apply(this, arguments);
};
}();
updateProfile = function() {
var _ref = _asyncToGenerator10(function(name, introduction) {
var validated, putProfile, _, e;
return __generator10(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
5,
,
6
]);
return [
4,
validateAuth()
];
case 1:
validated = _state.sent();
if (validated.length === 0) {
debugLog("[ updateProfile ] auth error");
return [
2,
""
];
}
return [
4,
profileRepository.put.putProfile(validated, name, introduction)
];
case 2:
putProfile = _state.sent();
if (!putProfile.ok)
return [
3,
4
];
_ = JSON.stringify;
return [
4,
putProfile.json()
];
case 3:
return [
2,
_.apply(JSON, [
_state.sent().profile
])
];
case 4:
debugLog("[ updateProfile ] error fetched. status = ".concat(putProfile.status, "."));
return [
2,
""
];
case 5:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 6:
return [
2
];
}
});
});
return function updateProfile2(name, introduction) {
return _ref.apply(this, arguments);
};
}();
updateProfileIcon = function() {
var _ref = _asyncToGenerator10(function(icon) {
var validated, putProfileIcon, _, e;
return __generator10(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
5,
,
6
]);
return [
4,
validateAuth()
];
case 1:
validated = _state.sent();
if (validated.length === 0) {
debugLog("[ updateProfileIcon ] auth error");
return [
2,
""
];
}
return [
4,
profileRepository.put.putProfileIcon(validated, icon)
];
case 2:
putProfileIcon = _state.sent();
if (!putProfileIcon.ok)
return [
3,
4
];
_ = JSON.stringify;
return [
4,
putProfileIcon.json()
];
case 3:
return [
2,
_.apply(JSON, [
_state.sent().profile
])
];
case 4:
debugLog("[ updateProfileIcon ] error fetched. status = ".concat(putProfileIcon.status, "."));
return [
2,
""
];
case 5:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 6:
return [
2
];
}
});
});
return function updateProfileIcon2(icon) {
return _ref.apply(this, arguments);
};
}();
fetchUserProfile = function() {
var _ref = _asyncToGenerator10(function(userId) {
var userProfile, _, e;
return __generator10(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
3,
,
4
]);
return [
4,
profileRepository.get.getProfile(userId)
];
case 1:
userProfile = _state.sent();
_ = JSON.stringify;
return [
4,
userProfile.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent().profile
])
];
case 3:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 4:
return [
2
];
}
});
});
return function fetchUserProfile2(userId) {
return _ref.apply(this, arguments);
};
}();
fetchMyGuestProfile = function() {
var _ref = _asyncToGenerator10(function(uuid) {
var guestProfile, _, created, _1, e;
return __generator10(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
6,
,
7
]);
return [
4,
profileRepository.get.getGuestProfile(uuid)
];
case 1:
guestProfile = _state.sent();
if (!guestProfile.ok)
return [
3,
3
];
_ = JSON.stringify;
return [
4,
guestProfile.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent().guest_profile
])
];
case 3:
debugLog("[ fetchMyGuestProfile ] error fetched. status = ".concat(guestProfile.status, ". postProfile..."));
return [
4,
profileRepository.post.postGuestProfile(uuid, heliportWindow.g_CurrentUserName)
];
case 4:
created = _state.sent();
_1 = JSON.stringify;
return [
4,
created.json()
];
case 5:
return [
2,
_1.apply(JSON, [
_state.sent().guest_profile
])
];
case 6:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 7:
return [
2
];
}
});
});
return function fetchMyGuestProfile2(uuid) {
return _ref.apply(this, arguments);
};
}();
updateGuestProfile = function() {
var _ref = _asyncToGenerator10(function(uuid, name, introduction) {
var guestProfile, _, e;
return __generator10(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
4,
,
5
]);
return [
4,
profileRepository.put.putGuestProfile(uuid, name, introduction)
];
case 1:
guestProfile = _state.sent();
if (!guestProfile.ok)
return [
3,
3
];
_ = JSON.stringify;
return [
4,
guestProfile.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent().guest_profile
])
];
case 3:
debugLog("[ updateGuestProfile ] error fetched. status = ".concat(guestProfile.status, "."));
return [
2,
""
];
case 4:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 5:
return [
2
];
}
});
});
return function updateGuestProfile2(uuid, name, introduction) {
return _ref.apply(this, arguments);
};
}();
updateGuestProfileIcon = function() {
var _ref = _asyncToGenerator10(function(uuid, icon) {
var guestProfileIcon, _, e;
return __generator10(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
4,
,
5
]);
return [
4,
profileRepository.put.putGuestProfileIcon(uuid, icon)
];
case 1:
guestProfileIcon = _state.sent();
if (!guestProfileIcon.ok)
return [
3,
3
];
_ = JSON.stringify;
return [
4,
guestProfileIcon.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent().guest_profile
])
];
case 3:
debugLog("[ updateGuestProfileIcon ] error fetched. status = ".concat(guestProfileIcon.status, "."));
return [
2,
""
];
case 4:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 5:
return [
2
];
}
});
});
return function updateGuestProfileIcon2(uuid, icon) {
return _ref.apply(this, arguments);
};
}();
fetchUserGuestProfile = function() {
var _ref = _asyncToGenerator10(function(uuid) {
var guestProfile, _, e;
return __generator10(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
3,
,
4
]);
return [
4,
profileRepository.get.getGuestProfile(uuid)
];
case 1:
guestProfile = _state.sent();
_ = JSON.stringify;
return [
4,
guestProfile.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent().guest_profile
])
];
case 3:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 4:
return [
2
];
}
});
});
return function fetchUserGuestProfile2(uuid) {
return _ref.apply(this, arguments);
};
}();
fetchUserProfileList = function() {
var _ref = _asyncToGenerator10(function(userIds) {
var profileList, _, e;
return __generator10(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
3,
,
4
]);
return [
4,
profileRepository.post.postProfileList(userIds)
];
case 1:
profileList = _state.sent();
_ = JSON.stringify;
return [
4,
profileList.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent().profiles
])
];
case 3:
e = _state.sent();
debugLog(e);
return [
2,
"[]"
];
case 4:
return [
2
];
}
});
});
return function fetchUserProfileList2(userIds) {
return _ref.apply(this, arguments);
};
}();
fetchUserGuestProfileList = function() {
var _ref = _asyncToGenerator10(function(uuids) {
var guestProfileList, _, e;
return __generator10(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
3,
,
4
]);
return [
4,
profileRepository.post.postGuestProfileList(uuids)
];
case 1:
guestProfileList = _state.sent();
_ = JSON.stringify;
return [
4,
guestProfileList.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent().guest_profiles
])
];
case 3:
e = _state.sent();
debugLog(e);
return [
2,
"[]"
];
case 4:
return [
2
];
}
});
});
return function fetchUserGuestProfileList2(uuids) {
return _ref.apply(this, arguments);
};
}();
useProfile = function() {
return {
fetchMyProfile: fetchMyProfile2,
updateProfile,
updateProfileIcon,
fetchUserProfile,
fetchMyGuestProfile,
updateGuestProfile,
updateGuestProfileIcon,
fetchUserGuestProfile,
fetchUserProfileList,
fetchUserGuestProfileList
};
};
}
});
// scripts/composables/useRoomApi.ts
function asyncGeneratorStep11(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator11(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep11(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep11(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var __generator11, roomRepository, fetchActiveRooms, fetchRandomRoom, fetchRoom, fetchRoomStatus, createRoom, sendHeartBeat, cancelReserveRoom2, useRoomApi;
var init_useRoomApi = __esm({
"scripts/composables/useRoomApi.ts"() {
"use strict";
init_factory();
init_debug();
__generator11 = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
roomRepository = factory.get("room");
fetchActiveRooms = function() {
var _ref = _asyncToGenerator11(function(worldId, option) {
var result, _, e;
return __generator11(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
3,
,
4
]);
return [
4,
roomRepository.get.getActiveRooms(worldId, option || {})
];
case 1:
result = _state.sent();
if (result === null) {
return [
2,
""
];
}
_ = JSON.stringify;
return [
4,
result.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent()
])
];
case 3:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 4:
return [
2
];
}
});
});
return function fetchActiveRooms2(worldId, option) {
return _ref.apply(this, arguments);
};
}();
fetchRandomRoom = function() {
var _ref = _asyncToGenerator11(function(worldId, option) {
var result, _, e;
return __generator11(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
3,
,
4
]);
return [
4,
roomRepository.get.getRandomRoom(worldId, option || {})
];
case 1:
result = _state.sent();
if (result === null) {
return [
2,
""
];
}
_ = JSON.stringify;
return [
4,
result.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent()
])
];
case 3:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 4:
return [
2
];
}
});
});
return function fetchRandomRoom2(worldId, option) {
return _ref.apply(this, arguments);
};
}();
fetchRoom = function() {
var _ref = _asyncToGenerator11(function(roomId, option) {
var result, _, e;
return __generator11(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
3,
,
4
]);
return [
4,
roomRepository.get.getRoom(roomId, option || {})
];
case 1:
result = _state.sent();
if (result === null) {
return [
2,
""
];
}
_ = JSON.stringify;
return [
4,
result.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent()
])
];
case 3:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 4:
return [
2
];
}
});
});
return function fetchRoom2(roomId, option) {
return _ref.apply(this, arguments);
};
}();
fetchRoomStatus = function() {
var _ref = _asyncToGenerator11(function(roomId, option) {
var result, _, e;
return __generator11(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
3,
,
4
]);
return [
4,
roomRepository.get.getRoomStatus(roomId, option || {})
];
case 1:
result = _state.sent();
if (result === null) {
return [
2,
""
];
}
_ = JSON.stringify;
return [
4,
result.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent()
])
];
case 3:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 4:
return [
2
];
}
});
});
return function fetchRoomStatus2(roomId, option) {
return _ref.apply(this, arguments);
};
}();
createRoom = function() {
var _ref = _asyncToGenerator11(function(worldId, option) {
var result, _, e;
return __generator11(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
3,
,
4
]);
return [
4,
roomRepository.post.createNewRoom(worldId, option || {})
];
case 1:
result = _state.sent();
if (result === null) {
return [
2,
""
];
}
_ = JSON.stringify;
return [
4,
result.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent()
])
];
case 3:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 4:
return [
2
];
}
});
});
return function createRoom2(worldId, option) {
return _ref.apply(this, arguments);
};
}();
sendHeartBeat = function() {
var _ref = _asyncToGenerator11(function(roomId, playerCount, option) {
var result, _, e;
return __generator11(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
3,
,
4
]);
return [
4,
roomRepository.post.sendHeartbeat(roomId, playerCount, option || {})
];
case 1:
result = _state.sent();
if (result === null) {
return [
2,
""
];
}
_ = JSON.stringify;
return [
4,
result.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent()
])
];
case 3:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 4:
return [
2
];
}
});
});
return function sendHeartBeat2(roomId, playerCount, option) {
return _ref.apply(this, arguments);
};
}();
cancelReserveRoom2 = function() {
var _ref = _asyncToGenerator11(function(roomId, adminKey, option) {
var result, _, e;
return __generator11(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
3,
,
4
]);
return [
4,
roomRepository.delete.cancelReserveRoom(roomId, adminKey, option || {})
];
case 1:
result = _state.sent();
if (result === null) {
return [
2,
""
];
}
_ = JSON.stringify;
return [
4,
result.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent()
])
];
case 3:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 4:
return [
2
];
}
});
});
return function cancelReserveRoom3(roomId, adminKey, option) {
return _ref.apply(this, arguments);
};
}();
useRoomApi = function() {
return {
fetchActiveRooms,
fetchRandomRoom,
fetchRoom,
fetchRoomStatus,
createRoom,
sendHeartBeat,
cancelReserveRoom: cancelReserveRoom2
};
};
}
});
// scripts/composables/useRouter.ts
var useRouter;
var init_useRouter = __esm({
"scripts/composables/useRouter.ts"() {
"use strict";
init_const();
useRouter = function() {
var reloadPage = function() {
return location.reload();
};
var proceedPage = function(url) {
return location.assign(url);
};
var openPage = function(url) {
return heliportWindow.open(url, "_blank");
};
return {
reloadPage,
proceedPage,
openPage
};
};
}
});
// scripts/modules/platform.ts
var isChrome, isAndroid, isMobile, isIpad, isIPhone, isMac, isFirefox, getIOSVersion, isiOS14Under, detectLang, isLangJa, defineYourRenderTypes;
var init_platform = __esm({
"scripts/modules/platform.ts"() {
"use strict";
init_const();
isChrome = function() {
return heliportWindow.navigator.userAgent.toLowerCase().indexOf("chrome") !== -1;
};
isAndroid = function() {
return heliportWindow.navigator.userAgent.toLowerCase().indexOf("android") !== -1;
};
isMobile = function() {
if (isIpad()) {
return true;
}
return heliportWindow.navigator.userAgent.search(MOBILE_USER_AGENT_REGS) !== -1;
};
isIpad = function() {
var agent = heliportWindow.navigator.userAgent.toLowerCase();
return agent.indexOf("ipad") > -1 || agent.indexOf("macintosh") > -1 && "ontouchend" in document;
};
isIPhone = function() {
if (isIpad()) {
return true;
}
return heliportWindow.navigator.userAgent.search(IPHONE_USER_AGENT_REGS) !== -1;
};
isMac = function() {
var agent = heliportWindow.navigator.userAgent.toLowerCase();
return agent.indexOf("macintosh") > -1;
};
isFirefox = function() {
return window.navigator.userAgent.toLowerCase().indexOf("firefox") !== -1;
};
getIOSVersion = function() {
if (/iP(hone|od|ad)/.test(navigator.platform)) {
var v = navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);
return parseInt(v[1], 10) * 100 + parseInt(v[2], 10);
}
return 0;
};
isiOS14Under = function() {
if (!isIPhone()) {
return false;
}
return getIOSVersion() < IOS_VER_15;
};
detectLang = function(lang) {
var browserLang = heliportWindow.navigator.languages && heliportWindow.navigator.languages[0] || heliportWindow.navigator.language || heliportWindow.navigator.userLanguage || heliportWindow.navigator.browserLanguage;
return browserLang === lang || browserLang.includes(lang);
};
isLangJa = function() {
return detectLang("ja");
};
defineYourRenderTypes = function() {
return [
"webgl",
"experimental-webgl"
];
};
}
});
// scripts/composables/useScreen.ts
function asyncGeneratorStep12(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator12(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep12(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep12(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var __generator12, useScreen;
var init_useScreen = __esm({
"scripts/composables/useScreen.ts"() {
"use strict";
init_const();
init_dom();
init_platform();
init_screenShotModal();
init_debug();
__generator12 = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
useScreen = function() {
var takeScreenShot = function() {
var mainCanvas = getMainCanvas();
if (mainCanvas === null) {
debugLog("[ takeScreenShot ] mainCanvas is not assigned. noop");
return false;
}
if (isIPhone()) {
heliportWindow.localStorage["ssBase64"] = mainCanvas.toDataURL("image/png");
showScreenShotModal();
return true;
}
mainCanvas.toBlob(function(blob) {
var a = document.createElement("a");
a.href = URL.createObjectURL(blob);
var today = new Date();
a.download = "" + today.getFullYear() + ("00" + (today.getMonth() + 1)).slice(-2) + ("00" + today.getDate()).slice(-2) + "_" + ("00" + today.getHours()).slice(-2) + ("00" + today.getMinutes()).slice(-2) + ("00" + today.getSeconds()).slice(-2) + ".png";
a.style.display = "none";
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
});
return true;
};
var toggleFullScreen = function() {
var _ref = _asyncToGenerator12(function() {
var mainCanvas;
return __generator12(this, function(_state) {
switch (_state.label) {
case 0:
mainCanvas = getMainCanvas();
if (!document.fullscreenEnabled || mainCanvas === null) {
debugLog("[ toggleFullScreen ] mainCanvasNotFound or fullScreen disabled");
return [
2,
false
];
}
if (!!document.fullscreenElement)
return [
3,
2
];
debugLog("[ toggleFullScreen ] full screen requested");
return [
4,
mainCanvas.requestFullscreen()
];
case 1:
_state.sent();
return [
3,
4
];
case 2:
debugLog("[ toggleFullScreen ] full screen exited");
return [
4,
document.exitFullscreen()
];
case 3:
_state.sent();
_state.label = 4;
case 4:
return [
2,
true
];
}
});
});
return function toggleFullScreen2() {
return _ref.apply(this, arguments);
};
}();
return {
takeScreenShot,
toggleFullScreen
};
};
}
});
// scripts/composables/useText.ts
var useText;
var init_useText = __esm({
"scripts/composables/useText.ts"() {
"use strict";
useText = function() {
var removeEmoji = function(textContext) {
var regexConditions = RegExp("\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F", "gu");
textContext.value = textContext.value.replaceAll(regexConditions, "*");
return textContext;
};
var colonControl = function(text) {
return text.replace(":", ":");
};
return {
colonControl,
removeEmoji
};
};
}
});
// scripts/composables/useVrAd.ts
function asyncGeneratorStep13(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator13(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep13(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep13(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var __generator13, vrAdRepository, fetchVrAdList, useVrAd;
var init_useVrAd = __esm({
"scripts/composables/useVrAd.ts"() {
"use strict";
init_factory();
init_debug();
__generator13 = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
vrAdRepository = factory.get("vrAd");
fetchVrAdList = function() {
var _ref = _asyncToGenerator13(function(worldId) {
var result, _, e;
return __generator13(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
3,
,
4
]);
return [
4,
vrAdRepository.get.getAdList(worldId)
];
case 1:
result = _state.sent();
_ = JSON.stringify;
return [
4,
result.json()
];
case 2:
return [
2,
_.apply(JSON, [
_state.sent()
])
];
case 3:
e = _state.sent();
debugLog(e);
return [
2,
""
];
case 4:
return [
2
];
}
});
});
return function fetchVrAdList2(worldId) {
return _ref.apply(this, arguments);
};
}();
useVrAd = function() {
return {
fetchVrAdList
};
};
}
});
// scripts/deviceFeatures/useCanvas.ts
var initializeMainCanvas, createTextCanvas, clearTextCanvas, handleVisibilityEvent, handleFullScreenChangeEvent, useCanvas;
var init_useCanvas = __esm({
"scripts/deviceFeatures/useCanvas.ts"() {
"use strict";
init_const();
init_dom();
init_debug();
initializeMainCanvas = function() {
var mainCanvas = getMainCanvas();
if (mainCanvas === null) {
debugLog("[ initializeMainCanvas ] mainCanvas not fetched");
return;
}
mainCanvas.width = document.documentElement.clientWidth;
mainCanvas.height = document.documentElement.clientHeight;
mainCanvas.onclick = function() {
heliportWindow.g_MainCanvas.focus();
};
mainCanvas.oncontextmenu = function(e) {
e.preventDefault();
};
};
createTextCanvas = function(width, height) {
var textCanvas = document.createElement("canvas");
textCanvas.style.visibility = "hidden";
textCanvas.width = width;
textCanvas.height = height;
return textCanvas;
};
clearTextCanvas = function(textCanvas) {
var context = textCanvas.getContext("2d");
if (context === null)
return;
context.clearRect(0, 0, textCanvas.width, textCanvas.height);
};
handleVisibilityEvent = function(func) {
document.addEventListener("visibilitychange", function() {
return func;
});
};
handleFullScreenChangeEvent = function(func) {
document.addEventListener("fullscreenchange", function() {
return func;
});
};
useCanvas = function() {
return {
initializeMainCanvas,
clearTextCanvas,
createTextCanvas,
getMainCanvas,
handleVisibilityEvent,
handleFullScreenChangeEvent,
reflectCanvasSize
};
};
}
});
// scripts/deviceFeatures/useCookie.ts
var getCookie, setCookie, useCookie;
var init_useCookie = __esm({
"scripts/deviceFeatures/useCookie.ts"() {
"use strict";
getCookie = function(name) {
var matches = document.cookie.match(new RegExp("(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, "\\$1") + "=([^;]*)"));
return matches ? decodeURIComponent(matches[1]) : void 0;
};
setCookie = function(name, value) {
var expires = ";Expires=Thu, 1-Jan-2030 00:00:00 GMT";
document.cookie = name + "=" + encodeURIComponent(value) + expires;
};
useCookie = function() {
return {
getCookie,
setCookie
};
};
}
});
// scripts/deviceFeatures/useDocument.ts
var toggleConfigTextField, resizeConfigUrl, setConfigUrlTextField, setConfigUrlFontSize, toggleUserNameTextField, setUserNameTextField, setUserNameFontSize, setDebugTabBy, setDebugBy, setShowChatBox, setTextFieldLocalTestFontSize, resizeChatbox, useDocument;
var init_useDocument = __esm({
"scripts/deviceFeatures/useDocument.ts"() {
"use strict";
init_dom();
toggleConfigTextField = function(show) {
var localTextConfigUrl = getConfigUrlText();
if (localTextConfigUrl !== null) {
localTextConfigUrl.style.visibility = show ? "visible" : "hidden";
}
var configUrl = getConfigUrl();
if (configUrl !== null) {
configUrl.style.visibility = show ? "visible" : "hidden";
}
};
resizeConfigUrl = function(x, y, width, height) {
var configUrl = getConfigUrl();
if (configUrl !== null) {
configUrl.style.left = x + "px";
configUrl.style.top = y + "px";
}
var localTextConfigUrl = getConfigUrlText();
if (localTextConfigUrl !== null) {
localTextConfigUrl.style.width = width + "px";
localTextConfigUrl.style.height = height + "px";
}
};
setConfigUrlTextField = function(text) {
var localTextConfigUrl = getConfigUrlText();
if (localTextConfigUrl !== null) {
localTextConfigUrl.value = text;
}
};
setConfigUrlFontSize = function(text) {
var localTextConfigUrl = getConfigUrlText();
if (localTextConfigUrl !== null) {
localTextConfigUrl.style.fontSize = text + "px";
}
};
toggleUserNameTextField = function(show) {
var userNameText = getUserNameText();
if (userNameText !== null) {
userNameText.style.visibility = show ? "visible" : "hidden";
}
var userName = getUserName();
if (userName !== null) {
userName.style.visibility = show ? "visible" : "hidden";
}
};
setUserNameTextField = function(text) {
var userNameText = getUserNameText();
if (userNameText !== null) {
userNameText.value = text;
}
};
setUserNameFontSize = function(text) {
var userNameText = getUserNameText();
if (userNameText !== null) {
userNameText.style.fontSize = text + "px";
}
};
setDebugTabBy = function(text) {
var tab = getGUIDebugTab();
if (tab === null) {
return;
}
tab.innerHTML = text;
};
setDebugBy = function(text) {
var debug = getGUIDebug();
if (debug === null) {
return;
}
debug.innerHTML = text;
};
setShowChatBox = function(show) {
var msg = getMsg();
if (msg !== null) {
msg.style.visibility = show ? "visible" : "hidden";
}
var localText = getLocalText();
if (localText === null) {
return;
}
localText.style.visibility = show ? "visible" : "hidden";
};
setTextFieldLocalTestFontSize = function(text) {
var localText = getLocalText();
if (localText === null) {
return;
}
localText.style.fontSize = text + "px";
};
resizeChatbox = function(x, y, width, height) {
var msg = getMsg();
if (msg === null) {
return;
}
msg.style.left = x + "px";
msg.style.top = y + "px";
var localText = getLocalText();
if (localText === null) {
return;
}
localText.style.width = width + "px";
localText.style.height = height + "px";
};
useDocument = function() {
return {
resizeConfigUrl,
setConfigUrlTextField,
setConfigUrlFontSize,
setUserNameTextField,
setUserNameFontSize,
toggleConfigTextField,
toggleUserNameTextField,
setDebugBy,
setDebugTabBy,
setTextFieldLocalTestFontSize,
setShowChatBox,
resizeChatbox
};
};
}
});
// scripts/deviceFeatures/useGyro.ts
function asyncGeneratorStep14(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator14(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep14(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep14(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var __generator14, initializeGyro, useGyro;
var init_useGyro = __esm({
"scripts/deviceFeatures/useGyro.ts"() {
"use strict";
__generator14 = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
initializeGyro = function() {
var _ref = _asyncToGenerator14(function() {
var permissionState;
return __generator14(this, function(_state) {
switch (_state.label) {
case 0:
if (!(DeviceOrientationEvent && DeviceOrientationEvent.requestPermission && typeof DeviceOrientationEvent.requestPermission === "function"))
return [
3,
2
];
return [
4,
DeviceOrientationEvent.requestPermission()
];
case 1:
permissionState = _state.sent();
return [
2,
permissionState === "granted"
];
case 2:
return [
2,
false
];
}
});
});
return function initializeGyro2() {
return _ref.apply(this, arguments);
};
}();
useGyro = function() {
return {
initializeGyro
};
};
}
});
// scripts/deviceFeatures/usePlatform.ts
var usePlatform;
var init_usePlatform = __esm({
"scripts/deviceFeatures/usePlatform.ts"() {
"use strict";
init_platform();
usePlatform = function() {
return {
defineYourRenderTypes,
detectLang,
getIOSVersion,
isAndroid,
isChrome,
isFirefox,
isIPhone,
isiOS14Under,
isLangJa,
isMac,
isMobile
};
};
}
});
// scripts/modules/gl.ts
var checkPVRTC, checkEtc2, checkAstc, checkDxt, checkExtShaderTextureLod, checkExtColorBufferHalfFloat, checkOesTextureHalfFloat;
var init_gl = __esm({
"scripts/modules/gl.ts"() {
"use strict";
init_platform();
checkPVRTC = function(context) {
var pvrtc = context.getExtension("WEBGL_compressed_texture_pvrtc") || context.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");
if (pvrtc === void 0) {
return false;
}
var supportedCompressedTextureFormat = context.getParameter(context.COMPRESSED_TEXTURE_FORMATS);
if (!supportedCompressedTextureFormat) {
return false;
}
var supportsPVRTCRgb = supportedCompressedTextureFormat.includes(pvrtc.COMPRESSED_RGB_PVRTC_4BPPV1_IMG);
if (!supportsPVRTCRgb) {
return false;
}
return supportedCompressedTextureFormat.includes(pvrtc.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG);
};
checkEtc2 = function(context) {
var etc2 = context.getExtension("WEBGL_compressed_texture_etc") || context.getExtension("WEBKIT_WEBGL_compressed_texture_etc");
if (etc2 === void 0) {
return false;
}
var supportedCompressedTextureFormat = context.getParameter(context.COMPRESSED_TEXTURE_FORMATS);
if (!supportedCompressedTextureFormat) {
return false;
}
var supportsETC2Rgb = supportedCompressedTextureFormat.includes(etc2.COMPRESSED_RGB8_ETC2);
if (!supportsETC2Rgb) {
return false;
}
return supportedCompressedTextureFormat.includes(etc2.COMPRESSED_RGBA8_ETC2_EAC);
};
checkAstc = function(context) {
var astc = context.getExtension("WEBGL_compressed_texture_astc") || context.getExtension("WEBKIT_WEBGL_compressed_texture_astc");
if (astc === void 0) {
return false;
}
var supportedCompressedTextureFormat = context.getParameter(context.COMPRESSED_TEXTURE_FORMATS);
if (!supportedCompressedTextureFormat) {
return false;
}
return supportedCompressedTextureFormat.includes(astc.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR);
};
checkDxt = function(context) {
var dxt = context.getExtension("EXT_texture_compression_bptc");
if (dxt === null) {
return false;
}
var supportedCompressedTextureFormat = context.getParameter(context.COMPRESSED_TEXTURE_FORMATS);
if (!supportedCompressedTextureFormat) {
return false;
}
var supportsDxtUnorm = supportedCompressedTextureFormat.includes(dxt.COMPRESSED_RGBA_BPTC_UNORM_EXT);
if (!supportsDxtUnorm) {
return false;
}
return supportedCompressedTextureFormat.includes(dxt.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT);
};
checkExtShaderTextureLod = function(context) {
return context.getExtension("EXT_shader_texture_lod") !== void 0;
};
checkExtColorBufferHalfFloat = function(context) {
var halfFloat = isFirefox() ? context.getExtension("EXT_color_buffer_float") : context.getExtension("EXT_color_buffer_half_float");
return halfFloat !== void 0;
};
checkOesTextureHalfFloat = function(context) {
var halfFloat = context.getExtension("OES_texture_half_float");
return halfFloat !== void 0;
};
}
});
// scripts/deviceFeatures/useRender.ts
var useRender;
var init_useRender = __esm({
"scripts/deviceFeatures/useRender.ts"() {
"use strict";
init_const();
init_dom();
init_gl();
init_platform();
init_debug();
useRender = function() {
var initializeGl = function(majorVersion) {
var mainCanvas = getMainCanvas();
var webGl10Toggle = majorVersion === 1 || isIPhone() || isMac();
var glAttribs = {
alpha: 0,
premultipliedAlpha: 0,
depth: true,
majorVersion,
minorVersion: 0,
enableExtensionsByDefault: 1,
antialias: true
};
var webglctx = null;
if (!webGl10Toggle && mainCanvas !== null) {
glAttribs.antialias = false;
webglctx = mainCanvas.getContext("webgl2", glAttribs);
}
if (!webglctx && mainCanvas !== null) {
webGl10Toggle = true;
glAttribs.majorVersion = 1;
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for (var _iterator = defineYourRenderTypes()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var contextType = _step.value;
webglctx = mainCanvas.getContext(contextType, glAttribs);
if (webglctx)
break;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
if (!webglctx) {
debugLog("webgl is null");
return 0;
}
var glctx = GL.registerContext(webglctx, glAttribs);
if (!glctx) {
debugLog("glctx is null");
return 0;
}
GL.makeContextCurrent(glctx);
heliportWindow.g_TextureCompression_PVRTC = checkPVRTC(webglctx);
heliportWindow.g_TextureCompression_ETC2 = checkEtc2(webglctx);
heliportWindow.g_TextureCompression_ASTC = checkAstc(webglctx);
heliportWindow.g_TextureCompression_DXT = checkDxt(webglctx);
heliportWindow.g_Use_EXT_shader_texture_lod = checkExtShaderTextureLod(webglctx);
heliportWindow.g_Use_EXT_color_buffer_half_float = checkExtColorBufferHalfFloat(webglctx);
heliportWindow.g_Use_OES_texture_half_float = checkOesTextureHalfFloat(webglctx);
return 1;
};
return {
initializeGl
};
};
}
});
// node_modules/bowser/es5.js
var require_es5 = __commonJS({
"node_modules/bowser/es5.js"(exports, module) {
function _instanceof(left, right) {
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
return !!right[Symbol.hasInstance](left);
} else {
return left instanceof right;
}
}
!function(e, t) {
"object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : "object" == typeof exports ? exports.bowser = t() : e.bowser = t();
}(exports, function() {
return function(e) {
var t = {};
function r(n) {
if (t[n])
return t[n].exports;
var i = t[n] = {
i: n,
l: false,
exports: {}
};
return e[n].call(i.exports, i, i.exports, r), i.l = true, i.exports;
}
return r.m = e, r.c = t, r.d = function(e2, t2, n) {
r.o(e2, t2) || Object.defineProperty(e2, t2, {
enumerable: true,
get: n
});
}, r.r = function(e2) {
"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e2, Symbol.toStringTag, {
value: "Module"
}), Object.defineProperty(e2, "__esModule", {
value: true
});
}, r.t = function(e2, t2) {
if (1 & t2 && (e2 = r(e2)), 8 & t2)
return e2;
if (4 & t2 && "object" == typeof e2 && e2 && e2.__esModule)
return e2;
var n = /* @__PURE__ */ Object.create(null);
if (r.r(n), Object.defineProperty(n, "default", {
enumerable: true,
value: e2
}), 2 & t2 && "string" != typeof e2)
for (var i in e2)
r.d(n, i, function(t3) {
return e2[t3];
}.bind(null, i));
return n;
}, r.n = function(e2) {
var t2 = e2 && e2.__esModule ? function t3() {
return e2.default;
} : function() {
return e2;
};
return r.d(t2, "a", t2), t2;
}, r.o = function(e2, t2) {
return Object.prototype.hasOwnProperty.call(e2, t2);
}, r.p = "", r(r.s = 90);
}({
17: function(e, t, r) {
"use strict";
t.__esModule = true, t.default = void 0;
var n = r(18), i = function() {
var _$e = function _$e2() {
};
return _$e.getFirstMatch = function(e2, t2) {
var _$r = t2.match(e2);
return _$r && _$r.length > 0 && _$r[1] || "";
}, _$e.getSecondMatch = function(e2, t2) {
var _$r = t2.match(e2);
return _$r && _$r.length > 1 && _$r[2] || "";
}, _$e.matchAndReturnConst = function(e2, t2, r2) {
if (e2.test(t2))
return r2;
}, _$e.getWindowsVersionName = function(e2) {
switch (e2) {
case "NT":
return "NT";
case "XP":
return "XP";
case "NT 5.0":
return "2000";
case "NT 5.1":
return "XP";
case "NT 5.2":
return "2003";
case "NT 6.0":
return "Vista";
case "NT 6.1":
return "7";
case "NT 6.2":
return "8";
case "NT 6.3":
return "8.1";
case "NT 10.0":
return "10";
default:
return;
}
}, _$e.getMacOSVersionName = function(e2) {
var _$t = e2.split(".").splice(0, 2).map(function(e3) {
return parseInt(e3, 10) || 0;
});
if (_$t.push(0), 10 === _$t[0])
switch (_$t[1]) {
case 5:
return "Leopard";
case 6:
return "Snow Leopard";
case 7:
return "Lion";
case 8:
return "Mountain Lion";
case 9:
return "Mavericks";
case 10:
return "Yosemite";
case 11:
return "El Capitan";
case 12:
return "Sierra";
case 13:
return "High Sierra";
case 14:
return "Mojave";
case 15:
return "Catalina";
default:
return;
}
}, _$e.getAndroidVersionName = function(e2) {
var _$t = e2.split(".").splice(0, 2).map(function(e3) {
return parseInt(e3, 10) || 0;
});
if (_$t.push(0), !(1 === _$t[0] && _$t[1] < 5))
return 1 === _$t[0] && _$t[1] < 6 ? "Cupcake" : 1 === _$t[0] && _$t[1] >= 6 ? "Donut" : 2 === _$t[0] && _$t[1] < 2 ? "Eclair" : 2 === _$t[0] && 2 === _$t[1] ? "Froyo" : 2 === _$t[0] && _$t[1] > 2 ? "Gingerbread" : 3 === _$t[0] ? "Honeycomb" : 4 === _$t[0] && _$t[1] < 1 ? "Ice Cream Sandwich" : 4 === _$t[0] && _$t[1] < 4 ? "Jelly Bean" : 4 === _$t[0] && _$t[1] >= 4 ? "KitKat" : 5 === _$t[0] ? "Lollipop" : 6 === _$t[0] ? "Marshmallow" : 7 === _$t[0] ? "Nougat" : 8 === _$t[0] ? "Oreo" : 9 === _$t[0] ? "Pie" : void 0;
}, _$e.getVersionPrecision = function(e2) {
return e2.split(".").length;
}, _$e.compareVersions = function(t2, r2, n2) {
void 0 === n2 && (n2 = false);
var i2 = _$e.getVersionPrecision(t2), s = _$e.getVersionPrecision(r2), a = Math.max(i2, s), o = 0, u = _$e.map([
t2,
r2
], function(t3) {
var _$r = a - _$e.getVersionPrecision(t3), _$n = t3 + new Array(_$r + 1).join(".0");
return _$e.map(_$n.split("."), function(e2) {
return new Array(20 - e2.length).join("0") + e2;
}).reverse();
});
for (n2 && (o = a - Math.min(i2, s)), a -= 1; a >= o; ) {
if (u[0][a] > u[1][a])
return 1;
if (u[0][a] === u[1][a]) {
if (a === o)
return 0;
a -= 1;
} else if (u[0][a] < u[1][a])
return -1;
}
}, _$e.map = function(e2, t2) {
var _$r, n2 = [];
if (Array.prototype.map)
return Array.prototype.map.call(e2, t2);
for (_$r = 0; _$r < e2.length; _$r += 1)
n2.push(t2(e2[_$r]));
return n2;
}, _$e.find = function(e2, t2) {
var _$r, n2;
if (Array.prototype.find)
return Array.prototype.find.call(e2, t2);
for (_$r = 0, n2 = e2.length; _$r < n2; _$r += 1) {
var i2 = e2[_$r];
if (t2(i2, _$r))
return i2;
}
}, _$e.assign = function(e2) {
for (var _$t, _$r, n2 = e2, i2 = arguments.length, s = new Array(i2 > 1 ? i2 - 1 : 0), a = 1; a < i2; a++)
s[a - 1] = arguments[a];
if (Object.assign)
return Object.assign.apply(Object, [
e2
].concat(s));
var o = function o2() {
var _$e2 = s[_$t];
"object" == typeof _$e2 && null !== _$e2 && Object.keys(_$e2).forEach(function(t2) {
n2[t2] = _$e2[t2];
});
};
for (_$t = 0, _$r = s.length; _$t < _$r; _$t += 1)
o();
return e2;
}, _$e.getBrowserAlias = function(e2) {
return n.BROWSER_ALIASES_MAP[e2];
}, _$e.getBrowserTypeByAlias = function(e2) {
return n.BROWSER_MAP[e2] || "";
}, _$e;
}();
t.default = i, e.exports = t.default;
},
18: function(e, t, r) {
"use strict";
t.__esModule = true, t.ENGINE_MAP = t.OS_MAP = t.PLATFORMS_MAP = t.BROWSER_MAP = t.BROWSER_ALIASES_MAP = void 0;
t.BROWSER_ALIASES_MAP = {
"Amazon Silk": "amazon_silk",
"Android Browser": "android",
Bada: "bada",
BlackBerry: "blackberry",
Chrome: "chrome",
Chromium: "chromium",
Electron: "electron",
Epiphany: "epiphany",
Firefox: "firefox",
Focus: "focus",
Generic: "generic",
"Google Search": "google_search",
Googlebot: "googlebot",
"Internet Explorer": "ie",
"K-Meleon": "k_meleon",
Maxthon: "maxthon",
"Microsoft Edge": "edge",
"MZ Browser": "mz",
"NAVER Whale Browser": "naver",
Opera: "opera",
"Opera Coast": "opera_coast",
PhantomJS: "phantomjs",
Puffin: "puffin",
QupZilla: "qupzilla",
QQ: "qq",
QQLite: "qqlite",
Safari: "safari",
Sailfish: "sailfish",
"Samsung Internet for Android": "samsung_internet",
SeaMonkey: "seamonkey",
Sleipnir: "sleipnir",
Swing: "swing",
Tizen: "tizen",
"UC Browser": "uc",
Vivaldi: "vivaldi",
"WebOS Browser": "webos",
WeChat: "wechat",
"Yandex Browser": "yandex",
Roku: "roku"
};
t.BROWSER_MAP = {
amazon_silk: "Amazon Silk",
android: "Android Browser",
bada: "Bada",
blackberry: "BlackBerry",
chrome: "Chrome",
chromium: "Chromium",
electron: "Electron",
epiphany: "Epiphany",
firefox: "Firefox",
focus: "Focus",
generic: "Generic",
googlebot: "Googlebot",
google_search: "Google Search",
ie: "Internet Explorer",
k_meleon: "K-Meleon",
maxthon: "Maxthon",
edge: "Microsoft Edge",
mz: "MZ Browser",
naver: "NAVER Whale Browser",
opera: "Opera",
opera_coast: "Opera Coast",
phantomjs: "PhantomJS",
puffin: "Puffin",
qupzilla: "QupZilla",
qq: "QQ Browser",
qqlite: "QQ Browser Lite",
safari: "Safari",
sailfish: "Sailfish",
samsung_internet: "Samsung Internet for Android",
seamonkey: "SeaMonkey",
sleipnir: "Sleipnir",
swing: "Swing",
tizen: "Tizen",
uc: "UC Browser",
vivaldi: "Vivaldi",
webos: "WebOS Browser",
wechat: "WeChat",
yandex: "Yandex Browser"
};
t.PLATFORMS_MAP = {
tablet: "tablet",
mobile: "mobile",
desktop: "desktop",
tv: "tv"
};
t.OS_MAP = {
WindowsPhone: "Windows Phone",
Windows: "Windows",
MacOS: "macOS",
iOS: "iOS",
Android: "Android",
WebOS: "WebOS",
BlackBerry: "BlackBerry",
Bada: "Bada",
Tizen: "Tizen",
Linux: "Linux",
ChromeOS: "Chrome OS",
PlayStation4: "PlayStation 4",
Roku: "Roku"
};
t.ENGINE_MAP = {
EdgeHTML: "EdgeHTML",
Blink: "Blink",
Trident: "Trident",
Presto: "Presto",
Gecko: "Gecko",
WebKit: "WebKit"
};
},
90: function(e, t, r) {
"use strict";
var a = function a2(e2, t2) {
for (var _$r = 0; _$r < t2.length; _$r++) {
var n2 = t2[_$r];
n2.enumerable = n2.enumerable || false, n2.configurable = true, "value" in n2 && (n2.writable = true), Object.defineProperty(e2, n2.key, n2);
}
};
t.__esModule = true, t.default = void 0;
var n, i = (n = r(91)) && n.__esModule ? n : {
default: n
}, s = r(18);
var o = function() {
var _$e = function _$e2() {
};
var _$t, _$r, n2;
return _$e.getParser = function(e2, t2) {
if (void 0 === t2 && (t2 = false), "string" != typeof e2)
throw new Error("UserAgent should be a string");
return new i.default(e2, t2);
}, _$e.parse = function(e2) {
return new i.default(e2).getResult();
}, _$t = _$e, n2 = [
{
key: "BROWSER_MAP",
get: function get() {
return s.BROWSER_MAP;
}
},
{
key: "ENGINE_MAP",
get: function get() {
return s.ENGINE_MAP;
}
},
{
key: "OS_MAP",
get: function get() {
return s.OS_MAP;
}
},
{
key: "PLATFORMS_MAP",
get: function get() {
return s.PLATFORMS_MAP;
}
}
], (_$r = null) && a(_$t.prototype, _$r), n2 && a(_$t, n2), _$e;
}();
t.default = o, e.exports = t.default;
},
91: function(e, t, r) {
"use strict";
var u = function u2(e2) {
return e2 && e2.__esModule ? e2 : {
default: e2
};
};
t.__esModule = true, t.default = void 0;
var n = u(r(92)), i = u(r(93)), s = u(r(94)), a = u(r(95)), o = u(r(17));
var d = function() {
var _$e = function _$e2(e2, t2) {
if (void 0 === t2 && (t2 = false), null == e2 || "" === e2)
throw new Error("UserAgent parameter can't be empty");
this._ua = e2, this.parsedResult = {}, true !== t2 && this.parse();
};
var _$t = _$e.prototype;
return _$t.getUA = function() {
return this._ua;
}, _$t.test = function(e2) {
return e2.test(this._ua);
}, _$t.parseBrowser = function() {
var _$e2 = this;
this.parsedResult.browser = {};
var _$t2 = o.default.find(n.default, function(t2) {
if ("function" == typeof t2.test)
return t2.test(_$e2);
if (_instanceof(t2.test, Array))
return t2.test.some(function(t3) {
return _$e2.test(t3);
});
throw new Error("Browser's test function is not valid");
});
return _$t2 && (this.parsedResult.browser = _$t2.describe(this.getUA())), this.parsedResult.browser;
}, _$t.getBrowser = function() {
return this.parsedResult.browser ? this.parsedResult.browser : this.parseBrowser();
}, _$t.getBrowserName = function(e2) {
return e2 ? String(this.getBrowser().name).toLowerCase() || "" : this.getBrowser().name || "";
}, _$t.getBrowserVersion = function() {
return this.getBrowser().version;
}, _$t.getOS = function() {
return this.parsedResult.os ? this.parsedResult.os : this.parseOS();
}, _$t.parseOS = function() {
var _$e2 = this;
this.parsedResult.os = {};
var _$t2 = o.default.find(i.default, function(t2) {
if ("function" == typeof t2.test)
return t2.test(_$e2);
if (_instanceof(t2.test, Array))
return t2.test.some(function(t3) {
return _$e2.test(t3);
});
throw new Error("Browser's test function is not valid");
});
return _$t2 && (this.parsedResult.os = _$t2.describe(this.getUA())), this.parsedResult.os;
}, _$t.getOSName = function(e2) {
var _$t2 = this.getOS().name;
return e2 ? String(_$t2).toLowerCase() || "" : _$t2 || "";
}, _$t.getOSVersion = function() {
return this.getOS().version;
}, _$t.getPlatform = function() {
return this.parsedResult.platform ? this.parsedResult.platform : this.parsePlatform();
}, _$t.getPlatformType = function(e2) {
void 0 === e2 && (e2 = false);
var _$t2 = this.getPlatform().type;
return e2 ? String(_$t2).toLowerCase() || "" : _$t2 || "";
}, _$t.parsePlatform = function() {
var _$e2 = this;
this.parsedResult.platform = {};
var _$t2 = o.default.find(s.default, function(t2) {
if ("function" == typeof t2.test)
return t2.test(_$e2);
if (_instanceof(t2.test, Array))
return t2.test.some(function(t3) {
return _$e2.test(t3);
});
throw new Error("Browser's test function is not valid");
});
return _$t2 && (this.parsedResult.platform = _$t2.describe(this.getUA())), this.parsedResult.platform;
}, _$t.getEngine = function() {
return this.parsedResult.engine ? this.parsedResult.engine : this.parseEngine();
}, _$t.getEngineName = function(e2) {
return e2 ? String(this.getEngine().name).toLowerCase() || "" : this.getEngine().name || "";
}, _$t.parseEngine = function() {
var _$e2 = this;
this.parsedResult.engine = {};
var _$t2 = o.default.find(a.default, function(t2) {
if ("function" == typeof t2.test)
return t2.test(_$e2);
if (_instanceof(t2.test, Array))
return t2.test.some(function(t3) {
return _$e2.test(t3);
});
throw new Error("Browser's test function is not valid");
});
return _$t2 && (this.parsedResult.engine = _$t2.describe(this.getUA())), this.parsedResult.engine;
}, _$t.parse = function() {
return this.parseBrowser(), this.parseOS(), this.parsePlatform(), this.parseEngine(), this;
}, _$t.getResult = function() {
return o.default.assign({}, this.parsedResult);
}, _$t.satisfies = function(e2) {
var _$t2 = this, _$r = {}, n2 = 0, i2 = {}, s2 = 0;
if (Object.keys(e2).forEach(function(t2) {
var a3 = e2[t2];
"string" == typeof a3 ? (i2[t2] = a3, s2 += 1) : "object" == typeof a3 && (_$r[t2] = a3, n2 += 1);
}), n2 > 0) {
var a2 = Object.keys(_$r), u2 = o.default.find(a2, function(e3) {
return _$t2.isOS(e3);
});
if (u2) {
var d2 = this.satisfies(_$r[u2]);
if (void 0 !== d2)
return d2;
}
var c = o.default.find(a2, function(e3) {
return _$t2.isPlatform(e3);
});
if (c) {
var f = this.satisfies(_$r[c]);
if (void 0 !== f)
return f;
}
}
if (s2 > 0) {
var l = Object.keys(i2), h = o.default.find(l, function(e3) {
return _$t2.isBrowser(e3, true);
});
if (void 0 !== h)
return this.compareVersion(i2[h]);
}
}, _$t.isBrowser = function(e2, t2) {
void 0 === t2 && (t2 = false);
var _$r = this.getBrowserName().toLowerCase(), n2 = e2.toLowerCase(), i2 = o.default.getBrowserTypeByAlias(n2);
return t2 && i2 && (n2 = i2.toLowerCase()), n2 === _$r;
}, _$t.compareVersion = function(e2) {
var _$t2 = [
0
], _$r = e2, n2 = false, i2 = this.getBrowserVersion();
if ("string" == typeof i2)
return ">" === e2[0] || "<" === e2[0] ? (_$r = e2.substr(1), "=" === e2[1] ? (n2 = true, _$r = e2.substr(2)) : _$t2 = [], ">" === e2[0] ? _$t2.push(1) : _$t2.push(-1)) : "=" === e2[0] ? _$r = e2.substr(1) : "~" === e2[0] && (n2 = true, _$r = e2.substr(1)), _$t2.indexOf(o.default.compareVersions(i2, _$r, n2)) > -1;
}, _$t.isOS = function(e2) {
return this.getOSName(true) === String(e2).toLowerCase();
}, _$t.isPlatform = function(e2) {
return this.getPlatformType(true) === String(e2).toLowerCase();
}, _$t.isEngine = function(e2) {
return this.getEngineName(true) === String(e2).toLowerCase();
}, _$t.is = function(e2, t2) {
return void 0 === t2 && (t2 = false), this.isBrowser(e2, t2) || this.isOS(e2) || this.isPlatform(e2);
}, _$t.some = function(e2) {
var _$t2 = this;
return void 0 === e2 && (e2 = []), e2.some(function(e3) {
return _$t2.is(e3);
});
}, _$e;
}();
t.default = d, e.exports = t.default;
},
92: function(e, t, r) {
"use strict";
t.__esModule = true, t.default = void 0;
var n, i = (n = r(17)) && n.__esModule ? n : {
default: n
};
var s = /version\/(\d+(\.?_?\d+)+)/i, a = [
{
test: [
/googlebot/i
],
describe: function describe(e2) {
var _$t = {
name: "Googlebot"
}, _$r = i.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i, e2) || i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/opera/i
],
describe: function describe(e2) {
var _$t = {
name: "Opera"
}, _$r = i.default.getFirstMatch(s, e2) || i.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/opr\/|opios/i
],
describe: function describe(e2) {
var _$t = {
name: "Opera"
}, _$r = i.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i, e2) || i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/SamsungBrowser/i
],
describe: function describe(e2) {
var _$t = {
name: "Samsung Internet for Android"
}, _$r = i.default.getFirstMatch(s, e2) || i.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/Whale/i
],
describe: function describe(e2) {
var _$t = {
name: "NAVER Whale Browser"
}, _$r = i.default.getFirstMatch(s, e2) || i.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/MZBrowser/i
],
describe: function describe(e2) {
var _$t = {
name: "MZ Browser"
}, _$r = i.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i, e2) || i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/focus/i
],
describe: function describe(e2) {
var _$t = {
name: "Focus"
}, _$r = i.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i, e2) || i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/swing/i
],
describe: function describe(e2) {
var _$t = {
name: "Swing"
}, _$r = i.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i, e2) || i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/coast/i
],
describe: function describe(e2) {
var _$t = {
name: "Opera Coast"
}, _$r = i.default.getFirstMatch(s, e2) || i.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/opt\/\d+(?:.?_?\d+)+/i
],
describe: function describe(e2) {
var _$t = {
name: "Opera Touch"
}, _$r = i.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i, e2) || i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/yabrowser/i
],
describe: function describe(e2) {
var _$t = {
name: "Yandex Browser"
}, _$r = i.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i, e2) || i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/ucbrowser/i
],
describe: function describe(e2) {
var _$t = {
name: "UC Browser"
}, _$r = i.default.getFirstMatch(s, e2) || i.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/Maxthon|mxios/i
],
describe: function describe(e2) {
var _$t = {
name: "Maxthon"
}, _$r = i.default.getFirstMatch(s, e2) || i.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/epiphany/i
],
describe: function describe(e2) {
var _$t = {
name: "Epiphany"
}, _$r = i.default.getFirstMatch(s, e2) || i.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/puffin/i
],
describe: function describe(e2) {
var _$t = {
name: "Puffin"
}, _$r = i.default.getFirstMatch(s, e2) || i.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/sleipnir/i
],
describe: function describe(e2) {
var _$t = {
name: "Sleipnir"
}, _$r = i.default.getFirstMatch(s, e2) || i.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/k-meleon/i
],
describe: function describe(e2) {
var _$t = {
name: "K-Meleon"
}, _$r = i.default.getFirstMatch(s, e2) || i.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/micromessenger/i
],
describe: function describe(e2) {
var _$t = {
name: "WeChat"
}, _$r = i.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i, e2) || i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/qqbrowser/i
],
describe: function describe(e2) {
var _$t = {
name: /qqbrowserlite/i.test(e2) ? "QQ Browser Lite" : "QQ Browser"
}, _$r = i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i, e2) || i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/msie|trident/i
],
describe: function describe(e2) {
var _$t = {
name: "Internet Explorer"
}, _$r = i.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/\sedg\//i
],
describe: function describe(e2) {
var _$t = {
name: "Microsoft Edge"
}, _$r = i.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/edg([ea]|ios)/i
],
describe: function describe(e2) {
var _$t = {
name: "Microsoft Edge"
}, _$r = i.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/vivaldi/i
],
describe: function describe(e2) {
var _$t = {
name: "Vivaldi"
}, _$r = i.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/seamonkey/i
],
describe: function describe(e2) {
var _$t = {
name: "SeaMonkey"
}, _$r = i.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/sailfish/i
],
describe: function describe(e2) {
var _$t = {
name: "Sailfish"
}, _$r = i.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/silk/i
],
describe: function describe(e2) {
var _$t = {
name: "Amazon Silk"
}, _$r = i.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/phantom/i
],
describe: function describe(e2) {
var _$t = {
name: "PhantomJS"
}, _$r = i.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/slimerjs/i
],
describe: function describe(e2) {
var _$t = {
name: "SlimerJS"
}, _$r = i.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/blackberry|\bbb\d+/i,
/rim\stablet/i
],
describe: function describe(e2) {
var _$t = {
name: "BlackBerry"
}, _$r = i.default.getFirstMatch(s, e2) || i.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/(web|hpw)[o0]s/i
],
describe: function describe(e2) {
var _$t = {
name: "WebOS Browser"
}, _$r = i.default.getFirstMatch(s, e2) || i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/bada/i
],
describe: function describe(e2) {
var _$t = {
name: "Bada"
}, _$r = i.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/tizen/i
],
describe: function describe(e2) {
var _$t = {
name: "Tizen"
}, _$r = i.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i, e2) || i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/qupzilla/i
],
describe: function describe(e2) {
var _$t = {
name: "QupZilla"
}, _$r = i.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i, e2) || i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/firefox|iceweasel|fxios/i
],
describe: function describe(e2) {
var _$t = {
name: "Firefox"
}, _$r = i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/electron/i
],
describe: function describe(e2) {
var _$t = {
name: "Electron"
}, _$r = i.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/MiuiBrowser/i
],
describe: function describe(e2) {
var _$t = {
name: "Miui"
}, _$r = i.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/chromium/i
],
describe: function describe(e2) {
var _$t = {
name: "Chromium"
}, _$r = i.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i, e2) || i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/chrome|crios|crmo/i
],
describe: function describe(e2) {
var _$t = {
name: "Chrome"
}, _$r = i.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/GSA/i
],
describe: function describe(e2) {
var _$t = {
name: "Google Search"
}, _$r = i.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: function test(e2) {
var _$t = !e2.test(/like android/i), _$r = e2.test(/android/i);
return _$t && _$r;
},
describe: function describe(e2) {
var _$t = {
name: "Android Browser"
}, _$r = i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/playstation 4/i
],
describe: function describe(e2) {
var _$t = {
name: "PlayStation 4"
}, _$r = i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/safari|applewebkit/i
],
describe: function describe(e2) {
var _$t = {
name: "Safari"
}, _$r = i.default.getFirstMatch(s, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/.*/i
],
describe: function describe(e2) {
var _$t = -1 !== e2.search("\\(") ? /^(.*)\/(.*)[ \t]\((.*)/ : /^(.*)\/(.*) /;
return {
name: i.default.getFirstMatch(_$t, e2),
version: i.default.getSecondMatch(_$t, e2)
};
}
}
];
t.default = a, e.exports = t.default;
},
93: function(e, t, r) {
"use strict";
t.__esModule = true, t.default = void 0;
var n, i = (n = r(17)) && n.__esModule ? n : {
default: n
}, s = r(18);
var a = [
{
test: [
/Roku\/DVP/
],
describe: function describe(e2) {
var _$t = i.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i, e2);
return {
name: s.OS_MAP.Roku,
version: _$t
};
}
},
{
test: [
/windows phone/i
],
describe: function describe(e2) {
var _$t = i.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i, e2);
return {
name: s.OS_MAP.WindowsPhone,
version: _$t
};
}
},
{
test: [
/windows /i
],
describe: function describe(e2) {
var _$t = i.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i, e2), _$r = i.default.getWindowsVersionName(_$t);
return {
name: s.OS_MAP.Windows,
version: _$t,
versionName: _$r
};
}
},
{
test: [
/Macintosh(.*?) FxiOS(.*?)\//
],
describe: function describe(e2) {
var _$t = {
name: s.OS_MAP.iOS
}, _$r = i.default.getSecondMatch(/(Version\/)(\d[\d.]+)/, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/macintosh/i
],
describe: function describe(e2) {
var _$t = i.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i, e2).replace(/[_\s]/g, "."), _$r = i.default.getMacOSVersionName(_$t), n2 = {
name: s.OS_MAP.MacOS,
version: _$t
};
return _$r && (n2.versionName = _$r), n2;
}
},
{
test: [
/(ipod|iphone|ipad)/i
],
describe: function describe(e2) {
var _$t = i.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i, e2).replace(/[_\s]/g, ".");
return {
name: s.OS_MAP.iOS,
version: _$t
};
}
},
{
test: function test(e2) {
var _$t = !e2.test(/like android/i), _$r = e2.test(/android/i);
return _$t && _$r;
},
describe: function describe(e2) {
var _$t = i.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i, e2), _$r = i.default.getAndroidVersionName(_$t), n2 = {
name: s.OS_MAP.Android,
version: _$t
};
return _$r && (n2.versionName = _$r), n2;
}
},
{
test: [
/(web|hpw)[o0]s/i
],
describe: function describe(e2) {
var _$t = i.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i, e2), _$r = {
name: s.OS_MAP.WebOS
};
return _$t && _$t.length && (_$r.version = _$t), _$r;
}
},
{
test: [
/blackberry|\bbb\d+/i,
/rim\stablet/i
],
describe: function describe(e2) {
var _$t = i.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i, e2) || i.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i, e2) || i.default.getFirstMatch(/\bbb(\d+)/i, e2);
return {
name: s.OS_MAP.BlackBerry,
version: _$t
};
}
},
{
test: [
/bada/i
],
describe: function describe(e2) {
var _$t = i.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i, e2);
return {
name: s.OS_MAP.Bada,
version: _$t
};
}
},
{
test: [
/tizen/i
],
describe: function describe(e2) {
var _$t = i.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i, e2);
return {
name: s.OS_MAP.Tizen,
version: _$t
};
}
},
{
test: [
/linux/i
],
describe: function describe() {
return {
name: s.OS_MAP.Linux
};
}
},
{
test: [
/CrOS/
],
describe: function describe() {
return {
name: s.OS_MAP.ChromeOS
};
}
},
{
test: [
/PlayStation 4/
],
describe: function describe(e2) {
var _$t = i.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i, e2);
return {
name: s.OS_MAP.PlayStation4,
version: _$t
};
}
}
];
t.default = a, e.exports = t.default;
},
94: function(e, t, r) {
"use strict";
t.__esModule = true, t.default = void 0;
var n, i = (n = r(17)) && n.__esModule ? n : {
default: n
}, s = r(18);
var a = [
{
test: [
/googlebot/i
],
describe: function describe() {
return {
type: "bot",
vendor: "Google"
};
}
},
{
test: [
/huawei/i
],
describe: function describe(e2) {
var _$t = i.default.getFirstMatch(/(can-l01)/i, e2) && "Nova", _$r = {
type: s.PLATFORMS_MAP.mobile,
vendor: "Huawei"
};
return _$t && (_$r.model = _$t), _$r;
}
},
{
test: [
/nexus\s*(?:7|8|9|10).*/i
],
describe: function describe() {
return {
type: s.PLATFORMS_MAP.tablet,
vendor: "Nexus"
};
}
},
{
test: [
/ipad/i
],
describe: function describe() {
return {
type: s.PLATFORMS_MAP.tablet,
vendor: "Apple",
model: "iPad"
};
}
},
{
test: [
/Macintosh(.*?) FxiOS(.*?)\//
],
describe: function describe() {
return {
type: s.PLATFORMS_MAP.tablet,
vendor: "Apple",
model: "iPad"
};
}
},
{
test: [
/kftt build/i
],
describe: function describe() {
return {
type: s.PLATFORMS_MAP.tablet,
vendor: "Amazon",
model: "Kindle Fire HD 7"
};
}
},
{
test: [
/silk/i
],
describe: function describe() {
return {
type: s.PLATFORMS_MAP.tablet,
vendor: "Amazon"
};
}
},
{
test: [
/tablet(?! pc)/i
],
describe: function describe() {
return {
type: s.PLATFORMS_MAP.tablet
};
}
},
{
test: function test(e2) {
var _$t = e2.test(/ipod|iphone/i), _$r = e2.test(/like (ipod|iphone)/i);
return _$t && !_$r;
},
describe: function describe(e2) {
var _$t = i.default.getFirstMatch(/(ipod|iphone)/i, e2);
return {
type: s.PLATFORMS_MAP.mobile,
vendor: "Apple",
model: _$t
};
}
},
{
test: [
/nexus\s*[0-6].*/i,
/galaxy nexus/i
],
describe: function describe() {
return {
type: s.PLATFORMS_MAP.mobile,
vendor: "Nexus"
};
}
},
{
test: [
/[^-]mobi/i
],
describe: function describe() {
return {
type: s.PLATFORMS_MAP.mobile
};
}
},
{
test: function test(e2) {
return "blackberry" === e2.getBrowserName(true);
},
describe: function describe() {
return {
type: s.PLATFORMS_MAP.mobile,
vendor: "BlackBerry"
};
}
},
{
test: function test(e2) {
return "bada" === e2.getBrowserName(true);
},
describe: function describe() {
return {
type: s.PLATFORMS_MAP.mobile
};
}
},
{
test: function test(e2) {
return "windows phone" === e2.getBrowserName();
},
describe: function describe() {
return {
type: s.PLATFORMS_MAP.mobile,
vendor: "Microsoft"
};
}
},
{
test: function test(e2) {
var _$t = Number(String(e2.getOSVersion()).split(".")[0]);
return "android" === e2.getOSName(true) && _$t >= 3;
},
describe: function describe() {
return {
type: s.PLATFORMS_MAP.tablet
};
}
},
{
test: function test(e2) {
return "android" === e2.getOSName(true);
},
describe: function describe() {
return {
type: s.PLATFORMS_MAP.mobile
};
}
},
{
test: function test(e2) {
return "macos" === e2.getOSName(true);
},
describe: function describe() {
return {
type: s.PLATFORMS_MAP.desktop,
vendor: "Apple"
};
}
},
{
test: function test(e2) {
return "windows" === e2.getOSName(true);
},
describe: function describe() {
return {
type: s.PLATFORMS_MAP.desktop
};
}
},
{
test: function test(e2) {
return "linux" === e2.getOSName(true);
},
describe: function describe() {
return {
type: s.PLATFORMS_MAP.desktop
};
}
},
{
test: function test(e2) {
return "playstation 4" === e2.getOSName(true);
},
describe: function describe() {
return {
type: s.PLATFORMS_MAP.tv
};
}
},
{
test: function test(e2) {
return "roku" === e2.getOSName(true);
},
describe: function describe() {
return {
type: s.PLATFORMS_MAP.tv
};
}
}
];
t.default = a, e.exports = t.default;
},
95: function(e, t, r) {
"use strict";
t.__esModule = true, t.default = void 0;
var n, i = (n = r(17)) && n.__esModule ? n : {
default: n
}, s = r(18);
var a = [
{
test: function test(e2) {
return "microsoft edge" === e2.getBrowserName(true);
},
describe: function describe(e2) {
if (/\sedg\//i.test(e2))
return {
name: s.ENGINE_MAP.Blink
};
var _$t = i.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i, e2);
return {
name: s.ENGINE_MAP.EdgeHTML,
version: _$t
};
}
},
{
test: [
/trident/i
],
describe: function describe(e2) {
var _$t = {
name: s.ENGINE_MAP.Trident
}, _$r = i.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: function test(e2) {
return e2.test(/presto/i);
},
describe: function describe(e2) {
var _$t = {
name: s.ENGINE_MAP.Presto
}, _$r = i.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: function test(e2) {
var _$t = e2.test(/gecko/i), _$r = e2.test(/like gecko/i);
return _$t && !_$r;
},
describe: function describe(e2) {
var _$t = {
name: s.ENGINE_MAP.Gecko
}, _$r = i.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
},
{
test: [
/(apple)?webkit\/537\.36/i
],
describe: function describe() {
return {
name: s.ENGINE_MAP.Blink
};
}
},
{
test: [
/(apple)?webkit/i
],
describe: function describe(e2) {
var _$t = {
name: s.ENGINE_MAP.WebKit
}, _$r = i.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i, e2);
return _$r && (_$t.version = _$r), _$t;
}
}
];
t.default = a, e.exports = t.default;
}
});
});
}
});
// node_modules/@babel/runtime/helpers/createClass.js
var require_createClass = __commonJS({
"node_modules/@babel/runtime/helpers/createClass.js"(exports, module) {
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor)
descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps)
_defineProperties(Constructor.prototype, protoProps);
if (staticProps)
_defineProperties(Constructor, staticProps);
Object.defineProperty(Constructor, "prototype", {
writable: false
});
return Constructor;
}
module.exports = _createClass, module.exports.__esModule = true, module.exports["default"] = module.exports;
}
});
// node_modules/@babel/runtime/helpers/asyncToGenerator.js
var require_asyncToGenerator = __commonJS({
"node_modules/@babel/runtime/helpers/asyncToGenerator.js"(exports, module) {
function asyncGeneratorStep16(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator16(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep16(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep16(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
module.exports = _asyncToGenerator16, module.exports.__esModule = true, module.exports["default"] = module.exports;
}
});
// node_modules/@babel/runtime/helpers/typeof.js
var require_typeof = __commonJS({
"node_modules/@babel/runtime/helpers/typeof.js"(exports, module) {
function _typeof(obj) {
"@babel/helpers - typeof";
return module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function _typeof2(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, module.exports.__esModule = true, module.exports["default"] = module.exports, _typeof(obj);
}
module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports;
}
});
// node_modules/@babel/runtime/helpers/regeneratorRuntime.js
var require_regeneratorRuntime = __commonJS({
"node_modules/@babel/runtime/helpers/regeneratorRuntime.js"(exports, module) {
function _instanceof(left, right) {
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
return !!right[Symbol.hasInstance](left);
} else {
return left instanceof right;
}
}
var _typeof = require_typeof()["default"];
function _regeneratorRuntime() {
"use strict";
var define2 = function define3(obj, key, value) {
return Object.defineProperty(obj, key, {
value,
enumerable: true,
configurable: true,
writable: true
}), obj[key];
};
var wrap = function wrap2(innerFn, outerFn, self2, tryLocsList) {
var protoGenerator = outerFn && _instanceof(outerFn.prototype, Generator) ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []);
return defineProperty(generator, "_invoke", {
value: makeInvokeMethod(innerFn, self2, context)
}), generator;
};
var tryCatch = function tryCatch2(fn, obj, arg) {
try {
return {
type: "normal",
arg: fn.call(obj, arg)
};
} catch (err) {
return {
type: "throw",
arg: err
};
}
};
var Generator = function Generator2() {
};
var GeneratorFunction = function GeneratorFunction2() {
};
var GeneratorFunctionPrototype = function GeneratorFunctionPrototype2() {
};
var defineIteratorMethods = function defineIteratorMethods2(prototype) {
[
"next",
"throw",
"return"
].forEach(function(method) {
define2(prototype, method, function(arg) {
return this._invoke(method, arg);
});
});
};
var AsyncIterator = function AsyncIterator2(generator, PromiseImpl) {
function invoke(method, arg, resolve, reject) {
var record = tryCatch(generator[method], generator, arg);
if ("throw" !== record.type) {
var result = record.arg, value = result.value;
return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function(value2) {
invoke("next", value2, resolve, reject);
}, function(err) {
invoke("throw", err, resolve, reject);
}) : PromiseImpl.resolve(value).then(function(unwrapped) {
result.value = unwrapped, resolve(result);
}, function(error) {
return invoke("throw", error, resolve, reject);
});
}
reject(record.arg);
}
var previousPromise;
defineProperty(this, "_invoke", {
value: function value(method, arg) {
function callInvokeWithMethodAndArg() {
return new PromiseImpl(function(resolve, reject) {
invoke(method, arg, resolve, reject);
});
}
return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
}
});
};
var makeInvokeMethod = function makeInvokeMethod2(innerFn, self2, context) {
var state = "suspendedStart";
return function(method, arg) {
if ("executing" === state)
throw new Error("Generator is already running");
if ("completed" === state) {
if ("throw" === method)
throw arg;
return doneResult();
}
for (context.method = method, context.arg = arg; ; ) {
var delegate = context.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context);
if (delegateResult) {
if (delegateResult === ContinueSentinel)
continue;
return delegateResult;
}
}
if ("next" === context.method)
context.sent = context._sent = context.arg;
else if ("throw" === context.method) {
if ("suspendedStart" === state)
throw state = "completed", context.arg;
context.dispatchException(context.arg);
} else
"return" === context.method && context.abrupt("return", context.arg);
state = "executing";
var record = tryCatch(innerFn, self2, context);
if ("normal" === record.type) {
if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel)
continue;
return {
value: record.arg,
done: context.done
};
}
"throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg);
}
};
};
var pushTryEntry = function pushTryEntry2(locs) {
var entry = {
tryLoc: locs[0]
};
1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
};
var resetTryEntry = function resetTryEntry2(entry) {
var record = entry.completion || {};
record.type = "normal", delete record.arg, entry.completion = record;
};
var Context = function Context2(tryLocsList) {
this.tryEntries = [
{
tryLoc: "root"
}
], tryLocsList.forEach(pushTryEntry, this), this.reset(true);
};
var values = function values2(iterable) {
if (iterable) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod)
return iteratorMethod.call(iterable);
if ("function" == typeof iterable.next)
return iterable;
if (!isNaN(iterable.length)) {
var i = -1, next = function next2() {
for (; ++i < iterable.length; ) {
if (hasOwn.call(iterable, i))
return next2.value = iterable[i], next2.done = false, next2;
}
return next2.value = void 0, next2.done = true, next2;
};
return next.next = next;
}
}
return {
next: doneResult
};
};
var doneResult = function doneResult2() {
return {
value: void 0,
done: true
};
};
module.exports = _regeneratorRuntime = function _regeneratorRuntime2() {
return exports2;
}, module.exports.__esModule = true, module.exports["default"] = module.exports;
var exports2 = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function(obj, key, desc) {
obj[key] = desc.value;
}, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
try {
define2({}, "");
} catch (err) {
define2 = function define3(obj, key, value) {
return obj[key] = value;
};
}
exports2.wrap = wrap;
var ContinueSentinel = {};
var IteratorPrototype = {};
define2(IteratorPrototype, iteratorSymbol, function() {
return this;
});
var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([])));
NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);
var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
function maybeInvokeDelegate(delegate, context) {
var method = delegate.iterator[context.method];
if (void 0 === method) {
if (context.delegate = null, "throw" === context.method) {
if (delegate.iterator["return"] && (context.method = "return", context.arg = void 0, maybeInvokeDelegate(delegate, context), "throw" === context.method))
return ContinueSentinel;
context.method = "throw", context.arg = new TypeError("The iterator does not provide a 'throw' method");
}
return ContinueSentinel;
}
var record = tryCatch(method, delegate.iterator, context.arg);
if ("throw" === record.type)
return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel;
var info = record.arg;
return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = void 0), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel);
}
return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", {
value: GeneratorFunctionPrototype,
configurable: true
}), defineProperty(GeneratorFunctionPrototype, "constructor", {
value: GeneratorFunction,
configurable: true
}), GeneratorFunction.displayName = define2(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports2.isGeneratorFunction = function(genFun) {
var ctor = "function" == typeof genFun && genFun.constructor;
return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
}, exports2.mark = function(genFun) {
return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define2(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
}, exports2.awrap = function(arg) {
return {
__await: arg
};
}, defineIteratorMethods(AsyncIterator.prototype), define2(AsyncIterator.prototype, asyncIteratorSymbol, function() {
return this;
}), exports2.AsyncIterator = AsyncIterator, exports2.async = function(innerFn, outerFn, self2, tryLocsList, PromiseImpl) {
void 0 === PromiseImpl && (PromiseImpl = Promise);
var iter = new AsyncIterator(wrap(innerFn, outerFn, self2, tryLocsList), PromiseImpl);
return exports2.isGeneratorFunction(outerFn) ? iter : iter.next().then(function(result) {
return result.done ? result.value : iter.next();
});
}, defineIteratorMethods(Gp), define2(Gp, toStringTagSymbol, "Generator"), define2(Gp, iteratorSymbol, function() {
return this;
}), define2(Gp, "toString", function() {
return "[object Generator]";
}), exports2.keys = function(val) {
var object = Object(val), keys = [];
for (var key in object) {
keys.push(key);
}
return keys.reverse(), function next() {
for (; keys.length; ) {
var key2 = keys.pop();
if (key2 in object)
return next.value = key2, next.done = false, next;
}
return next.done = true, next;
};
}, exports2.values = values, Context.prototype = {
constructor: Context,
reset: function reset(skipTempReset) {
if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = false, this.delegate = null, this.method = "next", this.arg = void 0, this.tryEntries.forEach(resetTryEntry), !skipTempReset)
for (var name in this) {
"t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = void 0);
}
},
stop: function stop() {
this.done = true;
var rootRecord = this.tryEntries[0].completion;
if ("throw" === rootRecord.type)
throw rootRecord.arg;
return this.rval;
},
dispatchException: function dispatchException(exception) {
var handle = function handle2(loc, caught) {
return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = void 0), !!caught;
};
if (this.done)
throw exception;
var context = this;
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i], record = entry.completion;
if ("root" === entry.tryLoc)
return handle("end");
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
} else if (hasCatch) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
} else {
if (!hasFinally)
throw new Error("try statement without catch or finally");
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
}
}
}
},
abrupt: function abrupt(type, arg) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
var record = finallyEntry ? finallyEntry.completion : {};
return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
},
complete: function complete(record, afterLoc) {
if ("throw" === record.type)
throw record.arg;
return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
},
finish: function finish(finallyLoc) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.finallyLoc === finallyLoc)
return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
}
},
"catch": function _catch(tryLoc) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if ("throw" === record.type) {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
throw new Error("illegal catch attempt");
},
delegateYield: function delegateYield(iterable, resultName, nextLoc) {
return this.delegate = {
iterator: values(iterable),
resultName,
nextLoc
}, "next" === this.method && (this.arg = void 0), ContinueSentinel;
}
}, exports2;
}
module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports;
}
});
// node_modules/@babel/runtime/regenerator/index.js
var require_regenerator = __commonJS({
"node_modules/@babel/runtime/regenerator/index.js"(exports, module) {
var runtime = require_regeneratorRuntime()();
module.exports = runtime;
try {
regeneratorRuntime = runtime;
} catch (accidentalStrictMode) {
if (typeof globalThis === "object") {
globalThis.regeneratorRuntime = runtime;
} else {
Function("r", "regeneratorRuntime = r")(runtime);
}
}
}
});
// node_modules/@babel/runtime/helpers/setPrototypeOf.js
var require_setPrototypeOf = __commonJS({
"node_modules/@babel/runtime/helpers/setPrototypeOf.js"(exports, module) {
function _setPrototypeOf(o, p) {
module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf2(o2, p2) {
o2.__proto__ = p2;
return o2;
}, module.exports.__esModule = true, module.exports["default"] = module.exports;
return _setPrototypeOf(o, p);
}
module.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports;
}
});
// node_modules/@babel/runtime/helpers/inheritsLoose.js
var require_inheritsLoose = __commonJS({
"node_modules/@babel/runtime/helpers/inheritsLoose.js"(exports, module) {
var setPrototypeOf = require_setPrototypeOf();
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
setPrototypeOf(subClass, superClass);
}
module.exports = _inheritsLoose, module.exports.__esModule = true, module.exports["default"] = module.exports;
}
});
// node_modules/promise-polyfill/lib/index.js
var require_lib = __commonJS({
"node_modules/promise-polyfill/lib/index.js"(exports, module) {
"use strict";
function _instanceof(left, right) {
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
return !!right[Symbol.hasInstance](left);
} else {
return left instanceof right;
}
}
var _typeof = function(obj) {
"@swc/helpers - typeof";
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
};
function finallyConstructor(callback) {
var constructor = this.constructor;
return this.then(function(value) {
return constructor.resolve(callback()).then(function() {
return value;
});
}, function(reason) {
return constructor.resolve(callback()).then(function() {
return constructor.reject(reason);
});
});
}
function allSettled(arr) {
var P = this;
return new P(function(resolve2, reject2) {
if (!(arr && typeof arr.length !== "undefined")) {
return reject2(new TypeError((typeof arr === "undefined" ? "undefined" : _typeof(arr)) + " " + arr + " is not iterable(cannot read property Symbol(Symbol.iterator))"));
}
var args = Array.prototype.slice.call(arr);
if (args.length === 0)
return resolve2([]);
var remaining = args.length;
function res(i2, val) {
if (val && (typeof val === "object" || typeof val === "function")) {
var then = val.then;
if (typeof then === "function") {
then.call(val, function(val2) {
res(i2, val2);
}, function(e) {
args[i2] = {
status: "rejected",
reason: e
};
if (--remaining === 0) {
resolve2(args);
}
});
return;
}
}
args[i2] = {
status: "fulfilled",
value: val
};
if (--remaining === 0) {
resolve2(args);
}
}
for (var i = 0; i < args.length; i++) {
res(i, args[i]);
}
});
}
var setTimeoutFunc = setTimeout;
function isArray(x) {
return Boolean(x && typeof x.length !== "undefined");
}
function noop() {
}
function bind(fn, thisArg) {
return function() {
fn.apply(thisArg, arguments);
};
}
function Promise2(fn) {
if (!_instanceof(this, Promise2))
throw new TypeError("Promises must be constructed via new");
if (typeof fn !== "function")
throw new TypeError("not a function");
this._state = 0;
this._handled = false;
this._value = void 0;
this._deferreds = [];
doResolve(fn, this);
}
function handle(self2, deferred) {
while (self2._state === 3) {
self2 = self2._value;
}
if (self2._state === 0) {
self2._deferreds.push(deferred);
return;
}
self2._handled = true;
Promise2._immediateFn(function() {
var cb = self2._state === 1 ? deferred.onFulfilled : deferred.onRejected;
if (cb === null) {
(self2._state === 1 ? resolve : reject)(deferred.promise, self2._value);
return;
}
var ret;
try {
ret = cb(self2._value);
} catch (e) {
reject(deferred.promise, e);
return;
}
resolve(deferred.promise, ret);
});
}
function resolve(self2, newValue) {
try {
if (newValue === self2)
throw new TypeError("A promise cannot be resolved with itself.");
if (newValue && (typeof newValue === "object" || typeof newValue === "function")) {
var then = newValue.then;
if (_instanceof(newValue, Promise2)) {
self2._state = 3;
self2._value = newValue;
finale(self2);
return;
} else if (typeof then === "function") {
doResolve(bind(then, newValue), self2);
return;
}
}
self2._state = 1;
self2._value = newValue;
finale(self2);
} catch (e) {
reject(self2, e);
}
}
function reject(self2, newValue) {
self2._state = 2;
self2._value = newValue;
finale(self2);
}
function finale(self2) {
if (self2._state === 2 && self2._deferreds.length === 0) {
Promise2._immediateFn(function() {
if (!self2._handled) {
Promise2._unhandledRejectionFn(self2._value);
}
});
}
for (var i = 0, len = self2._deferreds.length; i < len; i++) {
handle(self2, self2._deferreds[i]);
}
self2._deferreds = null;
}
function Handler(onFulfilled, onRejected, promise) {
this.onFulfilled = typeof onFulfilled === "function" ? onFulfilled : null;
this.onRejected = typeof onRejected === "function" ? onRejected : null;
this.promise = promise;
}
function doResolve(fn, self2) {
var done = false;
try {
fn(function(value) {
if (done)
return;
done = true;
resolve(self2, value);
}, function(reason) {
if (done)
return;
done = true;
reject(self2, reason);
});
} catch (ex) {
if (done)
return;
done = true;
reject(self2, ex);
}
}
Promise2.prototype["catch"] = function(onRejected) {
return this.then(null, onRejected);
};
Promise2.prototype.then = function(onFulfilled, onRejected) {
var prom = new this.constructor(noop);
handle(this, new Handler(onFulfilled, onRejected, prom));
return prom;
};
Promise2.prototype["finally"] = finallyConstructor;
Promise2.all = function(arr) {
return new Promise2(function(resolve2, reject2) {
if (!isArray(arr)) {
return reject2(new TypeError("Promise.all accepts an array"));
}
var args = Array.prototype.slice.call(arr);
if (args.length === 0)
return resolve2([]);
var remaining = args.length;
function res(i2, val) {
try {
if (val && (typeof val === "object" || typeof val === "function")) {
var then = val.then;
if (typeof then === "function") {
then.call(val, function(val2) {
res(i2, val2);
}, reject2);
return;
}
}
args[i2] = val;
if (--remaining === 0) {
resolve2(args);
}
} catch (ex) {
reject2(ex);
}
}
for (var i = 0; i < args.length; i++) {
res(i, args[i]);
}
});
};
Promise2.allSettled = allSettled;
Promise2.resolve = function(value) {
if (value && typeof value === "object" && value.constructor === Promise2) {
return value;
}
return new Promise2(function(resolve2) {
resolve2(value);
});
};
Promise2.reject = function(value) {
return new Promise2(function(resolve2, reject2) {
reject2(value);
});
};
Promise2.race = function(arr) {
return new Promise2(function(resolve2, reject2) {
if (!isArray(arr)) {
return reject2(new TypeError("Promise.race accepts an array"));
}
for (var i = 0, len = arr.length; i < len; i++) {
Promise2.resolve(arr[i]).then(resolve2, reject2);
}
});
};
Promise2._immediateFn = typeof setImmediate === "function" && function(fn) {
setImmediate(fn);
} || function(fn) {
setTimeoutFunc(fn, 0);
};
Promise2._unhandledRejectionFn = function _unhandledRejectionFn(err) {
if (typeof console !== "undefined" && console) {
console.warn("Possible Unhandled Promise Rejection:", err);
}
};
module.exports = Promise2;
}
});
// node_modules/@babel/runtime/helpers/assertThisInitialized.js
var require_assertThisInitialized = __commonJS({
"node_modules/@babel/runtime/helpers/assertThisInitialized.js"(exports, module) {
function _assertThisInitialized(self2) {
if (self2 === void 0) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self2;
}
module.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports["default"] = module.exports;
}
});
// node_modules/@babel/runtime/helpers/extends.js
var require_extends = __commonJS({
"node_modules/@babel/runtime/helpers/extends.js"(exports, module) {
function _extends() {
module.exports = _extends = Object.assign ? Object.assign.bind() : function _extends2(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
}, module.exports.__esModule = true, module.exports["default"] = module.exports;
return _extends.apply(this, arguments);
}
module.exports = _extends, module.exports.__esModule = true, module.exports["default"] = module.exports;
}
});
// node_modules/events/events.js
var require_events = __commonJS({
"node_modules/events/events.js"(exports, module) {
"use strict";
function _instanceof(left, right) {
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
return !!right[Symbol.hasInstance](left);
} else {
return left instanceof right;
}
}
var _typeof = function(obj) {
"@swc/helpers - typeof";
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
};
var R = typeof Reflect === "object" ? Reflect : null;
var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) {
return Function.prototype.apply.call(target, receiver, args);
};
var ReflectOwnKeys;
if (R && typeof R.ownKeys === "function") {
ReflectOwnKeys = R.ownKeys;
} else if (Object.getOwnPropertySymbols) {
ReflectOwnKeys = function ReflectOwnKeys2(target) {
return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));
};
} else {
ReflectOwnKeys = function ReflectOwnKeys2(target) {
return Object.getOwnPropertyNames(target);
};
}
function ProcessEmitWarning(warning) {
if (console && console.warn)
console.warn(warning);
}
var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) {
return value !== value;
};
function EventEmitter() {
EventEmitter.init.call(this);
}
module.exports = EventEmitter;
module.exports.once = once;
EventEmitter.EventEmitter = EventEmitter;
EventEmitter.prototype._events = void 0;
EventEmitter.prototype._eventsCount = 0;
EventEmitter.prototype._maxListeners = void 0;
var defaultMaxListeners = 10;
function checkListener(listener) {
if (typeof listener !== "function") {
throw new TypeError('The "listener" argument must be of type Function. Received type ' + (typeof listener === "undefined" ? "undefined" : _typeof(listener)));
}
}
Object.defineProperty(EventEmitter, "defaultMaxListeners", {
enumerable: true,
get: function get() {
return defaultMaxListeners;
},
set: function set(arg) {
if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) {
throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + ".");
}
defaultMaxListeners = arg;
}
});
EventEmitter.init = function() {
if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) {
this._events = /* @__PURE__ */ Object.create(null);
this._eventsCount = 0;
}
this._maxListeners = this._maxListeners || void 0;
};
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) {
throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + ".");
}
this._maxListeners = n;
return this;
};
function _getMaxListeners(that) {
if (that._maxListeners === void 0)
return EventEmitter.defaultMaxListeners;
return that._maxListeners;
}
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
return _getMaxListeners(this);
};
EventEmitter.prototype.emit = function emit(type) {
var args = [];
for (var i = 1; i < arguments.length; i++)
args.push(arguments[i]);
var doError = type === "error";
var events = this._events;
if (events !== void 0)
doError = doError && events.error === void 0;
else if (!doError)
return false;
if (doError) {
var er;
if (args.length > 0)
er = args[0];
if (_instanceof(er, Error)) {
throw er;
}
var err = new Error("Unhandled error." + (er ? " (" + er.message + ")" : ""));
err.context = er;
throw err;
}
var handler = events[type];
if (handler === void 0)
return false;
if (typeof handler === "function") {
ReflectApply(handler, this, args);
} else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for (var i = 0; i < len; ++i)
ReflectApply(listeners[i], this, args);
}
return true;
};
function _addListener(target, type, listener, prepend) {
var m;
var events;
var existing;
checkListener(listener);
events = target._events;
if (events === void 0) {
events = target._events = /* @__PURE__ */ Object.create(null);
target._eventsCount = 0;
} else {
if (events.newListener !== void 0) {
target.emit("newListener", type, listener.listener ? listener.listener : listener);
events = target._events;
}
existing = events[type];
}
if (existing === void 0) {
existing = events[type] = listener;
++target._eventsCount;
} else {
if (typeof existing === "function") {
existing = events[type] = prepend ? [
listener,
existing
] : [
existing,
listener
];
} else if (prepend) {
existing.unshift(listener);
} else {
existing.push(listener);
}
m = _getMaxListeners(target);
if (m > 0 && existing.length > m && !existing.warned) {
existing.warned = true;
var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit");
w.name = "MaxListenersExceededWarning";
w.emitter = target;
w.type = type;
w.count = existing.length;
ProcessEmitWarning(w);
}
}
return target;
}
EventEmitter.prototype.addListener = function addListener(type, listener) {
return _addListener(this, type, listener, false);
};
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
EventEmitter.prototype.prependListener = function prependListener(type, listener) {
return _addListener(this, type, listener, true);
};
function onceWrapper() {
if (!this.fired) {
this.target.removeListener(this.type, this.wrapFn);
this.fired = true;
if (arguments.length === 0)
return this.listener.call(this.target);
return this.listener.apply(this.target, arguments);
}
}
function _onceWrap(target, type, listener) {
var state = {
fired: false,
wrapFn: void 0,
target,
type,
listener
};
var wrapped = onceWrapper.bind(state);
wrapped.listener = listener;
state.wrapFn = wrapped;
return wrapped;
}
EventEmitter.prototype.once = function once2(type, listener) {
checkListener(listener);
this.on(type, _onceWrap(this, type, listener));
return this;
};
EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) {
checkListener(listener);
this.prependListener(type, _onceWrap(this, type, listener));
return this;
};
EventEmitter.prototype.removeListener = function removeListener(type, listener) {
var list, events, position, i, originalListener;
checkListener(listener);
events = this._events;
if (events === void 0)
return this;
list = events[type];
if (list === void 0)
return this;
if (list === listener || list.listener === listener) {
if (--this._eventsCount === 0)
this._events = /* @__PURE__ */ Object.create(null);
else {
delete events[type];
if (events.removeListener)
this.emit("removeListener", type, list.listener || listener);
}
} else if (typeof list !== "function") {
position = -1;
for (i = list.length - 1; i >= 0; i--) {
if (list[i] === listener || list[i].listener === listener) {
originalListener = list[i].listener;
position = i;
break;
}
}
if (position < 0)
return this;
if (position === 0)
list.shift();
else {
spliceOne(list, position);
}
if (list.length === 1)
events[type] = list[0];
if (events.removeListener !== void 0)
this.emit("removeListener", type, originalListener || listener);
}
return this;
};
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) {
var listeners, events, i;
events = this._events;
if (events === void 0)
return this;
if (events.removeListener === void 0) {
if (arguments.length === 0) {
this._events = /* @__PURE__ */ Object.create(null);
this._eventsCount = 0;
} else if (events[type] !== void 0) {
if (--this._eventsCount === 0)
this._events = /* @__PURE__ */ Object.create(null);
else
delete events[type];
}
return this;
}
if (arguments.length === 0) {
var keys = Object.keys(events);
var key;
for (i = 0; i < keys.length; ++i) {
key = keys[i];
if (key === "removeListener")
continue;
this.removeAllListeners(key);
}
this.removeAllListeners("removeListener");
this._events = /* @__PURE__ */ Object.create(null);
this._eventsCount = 0;
return this;
}
listeners = events[type];
if (typeof listeners === "function") {
this.removeListener(type, listeners);
} else if (listeners !== void 0) {
for (i = listeners.length - 1; i >= 0; i--) {
this.removeListener(type, listeners[i]);
}
}
return this;
};
function _listeners(target, type, unwrap) {
var events = target._events;
if (events === void 0)
return [];
var evlistener = events[type];
if (evlistener === void 0)
return [];
if (typeof evlistener === "function")
return unwrap ? [
evlistener.listener || evlistener
] : [
evlistener
];
return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
}
EventEmitter.prototype.listeners = function listeners(type) {
return _listeners(this, type, true);
};
EventEmitter.prototype.rawListeners = function rawListeners(type) {
return _listeners(this, type, false);
};
EventEmitter.listenerCount = function(emitter, type) {
if (typeof emitter.listenerCount === "function") {
return emitter.listenerCount(type);
} else {
return listenerCount.call(emitter, type);
}
};
EventEmitter.prototype.listenerCount = listenerCount;
function listenerCount(type) {
var events = this._events;
if (events !== void 0) {
var evlistener = events[type];
if (typeof evlistener === "function") {
return 1;
} else if (evlistener !== void 0) {
return evlistener.length;
}
}
return 0;
}
EventEmitter.prototype.eventNames = function eventNames() {
return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
};
function arrayClone(arr, n) {
var copy = new Array(n);
for (var i = 0; i < n; ++i)
copy[i] = arr[i];
return copy;
}
function spliceOne(list, index) {
for (; index + 1 < list.length; index++)
list[index] = list[index + 1];
list.pop();
}
function unwrapListeners(arr) {
var ret = new Array(arr.length);
for (var i = 0; i < ret.length; ++i) {
ret[i] = arr[i].listener || arr[i];
}
return ret;
}
function once(emitter, name) {
return new Promise(function(resolve, reject) {
var errorListener = function errorListener2(err) {
emitter.removeListener(name, resolver);
reject(err);
};
var resolver = function resolver2() {
if (typeof emitter.removeListener === "function") {
emitter.removeListener("error", errorListener);
}
resolve([].slice.call(arguments));
};
;
eventTargetAgnosticAddListener(emitter, name, resolver, {
once: true
});
if (name !== "error") {
addErrorHandlerIfEventEmitter(emitter, errorListener, {
once: true
});
}
});
}
function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
if (typeof emitter.on === "function") {
eventTargetAgnosticAddListener(emitter, "error", handler, flags);
}
}
function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
if (typeof emitter.on === "function") {
if (flags.once) {
emitter.once(name, listener);
} else {
emitter.on(name, listener);
}
} else if (typeof emitter.addEventListener === "function") {
emitter.addEventListener(name, function wrapListener(arg) {
if (flags.once) {
emitter.removeEventListener(name, wrapListener);
}
listener(arg);
});
} else {
throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + (typeof emitter === "undefined" ? "undefined" : _typeof(emitter)));
}
}
}
});
// node_modules/amazon-ivs-player/dist/index.js
var require_dist = __commonJS({
"node_modules/amazon-ivs-player/dist/index.js"(exports, module) {
function _instanceof(left, right) {
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
return !!right[Symbol.hasInstance](left);
} else {
return left instanceof right;
}
}
!function() {
"use strict";
var a = function a2(e2, t2) {
for (var i2 in t2)
Object.prototype.hasOwnProperty.call(t2, i2) && (e2[i2] = t2[i2]);
return e2;
};
var u = function u2(e2) {
return "" === e2.codecs || "undefined" == typeof MediaSource || MediaSource.isTypeSupported('video/mp4;codecs="' + e2.codecs + '"');
};
var c = function c2(e2) {
var t2, i2;
return void 0 !== e2.hidden ? (t2 = "hidden", i2 = "visibilitychange") : void 0 !== e2.msHidden ? (t2 = "msHidden", i2 = "msvisibilitychange") : void 0 !== e2.webkitHidden && (t2 = "webkitHidden", i2 = "webkitvisibilitychange"), {
hidden: t2,
visibilityChange: i2
};
};
var d = function d2(e2, t2, i2) {
return Math.min(i2, Math.max(t2, e2));
};
var h = function h2(e2) {
e2.removeAttribute("src");
};
var g = function g2(e2) {
return "number" == typeof e2.webkitDecodedFrameCount ? e2.webkitDecodedFrameCount : "function" == typeof e2.getVideoPlaybackQuality ? e2.getVideoPlaybackQuality().totalVideoFrames : "number" == typeof e2.mozDecodedFrames ? e2.mozDecodedFrames : -1;
};
var y = function y2(e2) {
return "number" == typeof e2.webkitDroppedFrameCount ? e2.webkitDroppedFrameCount : "function" == typeof e2.getVideoPlaybackQuality ? e2.getVideoPlaybackQuality().droppedVideoFrames : -1;
};
var E = function E2(e2, t2) {
for (var i2 = 0; i2 < t2.length; i2++)
console.info(e2, "start: ", t2.start(i2), ", end: ", t2.end(i2));
};
var k = function k2(e2, t2, i2) {
for (var n2 = 0; n2 < e2.length; n2++) {
var r2 = e2.start(n2), o2 = e2.end(n2);
if (!(o2 <= t2)) {
if (r2 - i2 > t2)
break;
for (var s2 = n2 + 1; s2 < e2.length && !(e2.start(s2) - o2 > i2); s2++)
o2 = e2.end(s2);
for (var a2 = n2 - 1; a2 >= 0 && !(r2 - e2.end(a2) > i2); a2--)
r2 = e2.start(a2);
return {
start: Math.min(r2, t2),
end: o2
};
}
}
return {
start: t2,
end: t2
};
};
var S = function S2(e2, t2, i2) {
void 0 === i2 && (i2 = l);
var n2 = k(e2, t2, i2).end - t2 > i2;
if (e2.length > 1 || !n2)
for (var r2 = 0; r2 < e2.length; r2++) {
var o2 = e2.start(r2), s2 = e2.end(r2);
if (t2 < o2 && s2 - o2 > i2)
return o2 + i2;
}
return n2 ? t2 + i2 : t2;
};
var b = function b2(e2, t2, i2) {
return e2.addEventListener(t2, i2), function() {
e2.removeEventListener(t2, i2);
};
};
var T = function T2(e2) {
if (e2.src) {
var t2 = e2.src;
h(e2), e2.load(), URL.revokeObjectURL(t2);
}
};
var I = function I2() {
if (_)
return _;
if ("undefined" == typeof window || "undefined" == typeof navigator)
return _ = w;
var e2, t2, n2 = i.getParser(navigator.userAgent), r2 = (e2 = String(n2.getBrowserVersion()), t2 = D.exec(e2) || R.exec(e2) || L.exec(e2) || [], {
major: parseInt(t2[1], 10) || 0,
minor: parseInt(t2[2], 10) || 0,
patch: parseInt(t2[3], 10) || 0
}), o2 = n2.getEngine();
return _ = {
chrome: !!n2.some([
"chrome"
]),
chromecast: navigator.userAgent.toLowerCase().indexOf("crkey") > -1,
domain: window.location.host.split(".").slice(-2).join("."),
electron: !!n2.some([
"electron"
]),
family: n2.getBrowserName().toLowerCase(),
firefox: !!n2.some([
"firefox"
]),
host: window.location.host,
major: r2.major,
minor: r2.minor,
msEdgeLegacy: !!n2.some([
"microsoft edge"
]) && "Blink" !== o2.name,
msEdgeChromium: !!n2.some([
"microsoft edge"
]) && "Blink" === o2.name,
msIE: !!n2.some([
"internet explorer"
]),
name: navigator.appVersion,
opera: !!n2.some([
"opera"
]),
osName: n2.getOSName(),
osVersion: String(n2.getOSVersion()),
patch: r2.patch,
safari: !!n2.some([
"safari"
]),
url: window.location.href,
userAgent: navigator.userAgent,
mobile: !(!n2.some([
"mobile"
]) && !n2.some([
"tablet"
])),
supportsDataChannels: "RTCPeerConnection" in window,
supportsWebTransport: "WebTransport" in window,
supportsMSEInWorkers: A.isSupportedInWorker()
};
};
var V = function V2(e2) {
var t2 = e2.type === C.ANALYTICS_EVENT, i2 = e2.arg && "video_error" === e2.arg.name;
if (t2 && i2) {
if (!O && !N) {
var n2 = document.createElement("canvas");
try {
var r2 = n2.getContext("webgl") || n2.getContext("experimental-webgl");
if (r2 && "getExtension" in r2) {
var o2 = r2.getExtension("WEBGL_debug_renderer_info");
o2 && "getParameter" in r2 && (O = r2.getParameter(o2.UNMASKED_RENDERER_WEBGL), N = r2.getParameter(o2.UNMASKED_VENDOR_WEBGL));
}
} catch (e1) {
}
}
e2.arg.properties.gl_renderer = O, e2.arg.properties.gl_vendor = N;
}
return e2;
};
var B = function B2() {
return "undefined" != typeof MediaSource;
};
var x = function x2() {
var e2 = I();
return "Windows" === e2.osName && (e2.chrome || e2.firefox || e2.msEdgeChromium) && B() ? "mediaCapabilities" in navigator ? navigator.mediaCapabilities.decodingInfo({
type: "media-source",
video: {
contentType: 'video/mp4;codecs="vp09.00.41.08"',
width: 1920,
height: 1080,
bitrate: 8e6,
framerate: 60
}
}).then(function(e3) {
return e3.supported && e3.smooth;
}) : Promise.resolve(MediaSource.isTypeSupported('video/mp4;codecs="vp09.00.10.08"')) : Promise.resolve(false);
};
var re = function re2(e2, t2) {
(null == t2 || t2 > e2.length) && (t2 = e2.length);
for (var i2 = 0, n2 = new Array(t2); i2 < t2; i2++)
n2[i2] = e2[i2];
return n2;
};
var oe = function oe2(e2) {
return window.WebKitMediaKeys && "function" == typeof window.WebKitMediaKeys.isTypeSupported && window.WebKitMediaKeys.isTypeSupported(Y.FAIRPLAY.keySystem) ? Y.FAIRPLAY.uuid : "function" == typeof navigator.requestMediaKeySystemAccess ? e2.safari ? "" : e2.msIE || e2.msEdgeLegacy ? Y.PLAYREADY.uuid : Y.WIDEVINE.uuid : "";
};
var se = function se2(e2, t2) {
if ((e2 = ae(e2)) === (t2 = ae(t2)))
return true;
if (e2.byteLength !== t2.byteLength)
return false;
for (var i2 = new DataView(e2), n2 = new DataView(t2), r2 = 0; r2 < i2.byteLength; r2++)
if (i2.getUint8(r2) !== n2.getUint8(r2))
return false;
return true;
};
var ae = function ae2(e2) {
return _instanceof(e2, Uint8Array) || _instanceof(e2, Uint16Array) ? e2.buffer : e2;
};
var ue = function ue2(e2) {
return t2 = function(e3) {
if (null === e3)
return [];
for (var t3 = new DataView(e3.buffer || e3), i3 = [], n2 = 0; !(n2 >= t3.buffer.byteLength); ) {
var r2 = n2 + t3.getUint32(n2);
if (n2 += 4, t3.getUint32(n2) === le("pssh")) {
n2 += 4;
var o2 = t3.getUint8(n2);
if (0 === o2 || 1 === o2) {
n2++, n2 += 3;
for (var s2 = "", a2 = 0; a2 < 4; a2++)
s2 += fe(t3.getUint8(n2 + a2));
n2 += 4, s2 += "-";
for (var u2 = 0; u2 < 2; u2++)
s2 += fe(t3.getUint8(n2 + u2));
n2 += 2, s2 += "-";
for (var c2 = 0; c2 < 2; c2++)
s2 += fe(t3.getUint8(n2 + c2));
n2 += 2, s2 += "-";
for (var d2 = 0; d2 < 2; d2++)
s2 += fe(t3.getUint8(n2 + d2));
n2 += 2, s2 += "-";
for (var h2 = 0; h2 < 6; h2++)
s2 += fe(t3.getUint8(n2 + h2));
n2 += 6, s2 = s2.toLowerCase(), n2 += 4, i3.push(s2), n2 = r2;
} else
n2 = r2;
} else
n2 = r2;
}
return i3;
}(e2), i2 = [], t2.forEach(function(e3) {
Object.keys(Y).forEach(function(t3) {
var n2 = Y[t3];
n2.uuid === e3 && i2.push(n2);
});
}), i2;
var t2, i2;
};
var ce = function ce2(e2, t2) {
return new Promise(function(i2, n2) {
var r2 = new XMLHttpRequest();
for (var o2 in r2.open(t2.method, e2, true), t2.headers)
Object.prototype.hasOwnProperty.call(t2.headers, o2) && r2.setRequestHeader(o2, t2.headers[o2]);
r2.responseType = t2.responseType, r2.onload = function() {
200 === r2.status && i2(r2.response);
}, r2.onloadend = function() {
n2(r2.status);
}, r2.send(t2.body);
});
};
var de = function de2(e2) {
var t2 = he(me(JSON.parse(String.fromCharCode.apply(null, e2)).sinf[0]), "schi");
return function(e3) {
for (var t3, i2 = "", n2 = function(e4, t4) {
var i3 = "undefined" != typeof Symbol && e4[Symbol.iterator] || e4["@@iterator"];
if (i3)
return (i3 = i3.call(e4)).next.bind(i3);
if (Array.isArray(e4) || (i3 = function(e5, t5) {
if (e5) {
if ("string" == typeof e5)
return re(e5, t5);
var i4 = Object.prototype.toString.call(e5).slice(8, -1);
return "Object" === i4 && e5.constructor && (i4 = e5.constructor.name), "Map" === i4 || "Set" === i4 ? Array.from(e5) : "Arguments" === i4 || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i4) ? re(e5, t5) : void 0;
}
}(e4)) || t4 && e4 && "number" == typeof e4.length) {
i3 && (e4 = i3);
var n3 = 0;
return function() {
return n3 >= e4.length ? {
done: true
} : {
done: false,
value: e4[n3++]
};
};
}
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}(e3); !(t3 = n2()).done; )
i2 += fe(t3.value);
return i2;
}(he(t2, "tenc").subarray(8, 24));
};
var he = function he2(e2, t2) {
for (var i2 = new DataView(e2.buffer, e2.byteOffset, e2.byteLength), n2 = le(t2), r2 = 0; r2 < e2.byteLength; ) {
var o2 = i2.getUint32(r2);
if (i2.getUint32(r2 + 4) === n2)
return e2.subarray(r2 + 8, r2 + o2);
r2 += o2;
}
return new Uint8Array(e2);
};
var le = function le2(e2) {
return (e2.charCodeAt(0) << 24) + (e2.charCodeAt(1) << 16) + (e2.charCodeAt(2) << 8) + e2.charCodeAt(3);
};
var fe = function fe2(e2) {
var t2 = e2.toString(16);
return 1 === t2.length ? "0" + t2 : t2;
};
var me = function me2(e2) {
for (var t2 = atob(e2), i2 = t2.length, n2 = new Uint8Array(i2), r2 = 0; r2 < i2; r2++)
n2[r2] = t2.charCodeAt(r2);
return n2;
};
var ve = function ve2(e2) {
return decodeURIComponent(e2.replace(/\+/g, " "));
};
var ke = function ke2(e2) {
var t2 = "";
if (e2.getElementsByTagName("Challenge").length > 0 && e2.getElementsByTagName("Challenge")[0]) {
var i2 = e2.getElementsByTagName("Challenge")[0].childNodes[0].nodeValue;
i2 && (t2 = atob(i2));
}
return t2;
};
var Se = function Se2(e2) {
for (var t2 = {}, i2 = e2.getElementsByTagName("name"), n2 = e2.getElementsByTagName("value"), r2 = 0; r2 < i2.length; r2++) {
var o2 = i2[r2].childNodes[0].nodeValue;
null != o2 && (t2[o2] = n2[r2].childNodes[0].nodeValue);
}
return t2;
};
var be = function be2(e2) {
var t2 = String.fromCharCode.apply(null, new Uint16Array(e2)), i2 = new DOMParser().parseFromString(t2, "application/xml");
return {
headers: Se(i2),
body: ke(i2)
};
};
var Te = function Te2(e2, t2) {
(null == t2 || t2 > e2.length) && (t2 = e2.length);
for (var i2 = 0, n2 = new Array(t2); i2 < t2; i2++)
n2[i2] = e2[i2];
return n2;
};
var $e = function $e2(e2, t2, i2) {
var n2, r2, o2, s2;
return void 0 === i2 && (i2 = false), I().msIE ? n2 = new Ze(e2) : (r2 = e2, o2 = window.location, (s2 = document.createElement("a")).href = r2, n2 = s2.hostname === o2.hostname && s2.port === o2.port && s2.protocol === o2.protocol ? new Worker(e2) : new Worker(URL.createObjectURL(new Blob([
"importScripts('" + e2 + "')"
])))), n2.postMessage({
wasmBinaryUrl: t2,
showWorkerLogs: i2
}), n2;
};
var it = function it2(e2) {
var t2 = e2.asmWorker, i2 = e2.wasmWorker, n2 = e2.wasmBinary;
if (!tt && !t2)
throw new Error("WebAssembly is not supported by the browser. This is required for playback.");
var r2 = $e(tt ? i2 : t2, n2, e2.showWorkerLog);
return new ht(e2, r2);
};
var mt = function mt2(e2, t2) {
if (void 0 === e2 || "function" != typeof e2.getTech)
throw {
message: "videojs not available, AmazonIVS tech not registered",
code: 1
};
if (!tt)
throw {
message: "WebAssembly support is required for AmazonIVS tech",
code: 2
};
if (!e2.getTech(ft)) {
var i2 = e2.getTech("Tech"), n2 = e2.extend(i2, {
constructor: function constructor(n3, r3) {
this._readyState = dt.HAVE_NOTHING, this._defaultPlaybackRate = 1, this._seeking = false, t2.playerFramework = {
name: "videojs",
version: e2.VERSION
}, this._mediaPlayer = it(t2), this._mediaPlayer.setAutoplay(true === n3.autoplay), this._attachVideojsListeners(), this._mediaPlayer.addEventListener(C.METADATA, this._onCaptionEvent.bind(this)), this.featuresProgressEvents = true, this.featuresTimeupdateEvents = true, this.featuresPlaybackRate = true, this.featuresFullscreenResize = true, this.featuresVolumeControl = true, this.featuresMuteControl = true, this.featuresNativeTextTracks = false, i2.call(this, n3, r3), window.vttjs && window.vttjs.restore(), this.triggerReady(), setTimeout(function() {
this.options_.loop && this._mediaPlayer.setLooping(true), this.options_.muted && this._mediaPlayer.setMuted(true);
}.bind(this), 0);
},
dispose: function dispose() {
this._mediaPlayer.delete();
},
setPreload: function setPreload() {
},
autoplay: function autoplay(e3) {
if ("boolean" != typeof e3)
return this._mediaPlayer.autoplay;
this.setAutoplay(e3);
},
setAutoplay: function setAutoplay(e3) {
this._mediaPlayer.setAutoplay(e3);
},
preload: function preload() {
},
load: function load() {
},
readyState: function readyState() {
return this._readyState;
},
seeking: function seeking() {
return this._seeking;
},
networkState: function networkState() {
if (!this._mediaPlayer)
return 0;
if (!this._mediaPlayer.getHTMLVideoElement().src)
return 3;
var _$e = this._mediaPlayer.getState();
return lt[_$e];
},
ended: function ended() {
return this._mediaPlayer.getState() === j.ENDED;
},
seekable: function seekable() {
return e2.createTimeRange(0, this._mediaPlayer.getDuration());
},
play: function play() {
this._mediaPlayer.play(), this.trigger(ut.PLAY);
},
pause: function pause() {
this._mediaPlayer.pause();
},
setCurrentTime: function setCurrentTime2(e3) {
this._mediaPlayer.getHTMLVideoElement().src && (this._mediaPlayer.seekTo(e3), this._seeking = true, this.trigger(ut.SEEKING));
},
controls: function controls() {
return false;
},
setControls: function setControls() {
return false;
},
muted: function muted() {
return this._mediaPlayer.isMuted();
},
setMuted: function setMuted(e3) {
this._mediaPlayer.setMuted(e3);
},
volume: function volume() {
return this._mediaPlayer.getVolume();
},
setVolume: function setVolume(e3) {
this._mediaPlayer.setVolume(e3);
},
defaultPlaybackRate: function defaultPlaybackRate(e3) {
if (!e3)
return this._defaultPlaybackRate;
this._defaultPlaybackRate = e3;
},
playbackRate: function playbackRate() {
return this._mediaPlayer.getPlaybackRate();
},
setPlaybackRate: function setPlaybackRate(e3) {
this._mediaPlayer.setPlaybackRate(e3);
},
paused: function paused() {
return this._mediaPlayer.isPaused();
},
duration: function duration() {
return this._mediaPlayer.getDuration();
},
currentTime: function currentTime() {
return this._mediaPlayer.getPosition();
},
createEl: function createEl() {
var _$e = this._mediaPlayer.getHTMLVideoElement();
_$e.setAttribute("class", "vjs-tech"), void 0 !== this.options_.disablePictureInPicture && (_$e.disablePictureInPicture = this.options_.disablePictureInPicture), [
"preload",
"poster"
].forEach(function(t4) {
this.options_[t4] && _$e.setAttribute(t4, this.options_[t4]);
}.bind(this)), this.options_.playsinline && (_$e.setAttribute("webkit-playsinline", ""), _$e.setAttribute("playsinline", ""));
var t3 = document.createElement("div");
return t3.appendChild(_$e), t3;
},
src: function src(e3) {
this.trigger(ut.LOADSTART), this._seeking = false, this._captionTrack && (this.textTracks().removeTrack(this._captionTrack), this._captionTrack = null), e3 && this._mediaPlayer.load(e3);
},
addEventListener: function addEventListener(e3, t3) {
this._mediaPlayer.addEventListener(e3, t3);
},
removeEventListener: function removeEventListener(e3, t3) {
this._mediaPlayer.removeEventListener(e3, t3);
},
getMediaPlayerAPI: function getMediaPlayerAPI() {
return this._mediaPlayer;
},
supportsFullScreen: function supportsFullScreen() {
return true;
},
enterFullScreen: function enterFullScreen() {
var _$e = this._mediaPlayer.getHTMLVideoElement();
(_$e.requestFullscreen || _$e.webkitRequestFullscreen || _$e.mozRequestFullScreen || _$e.msRequestFullscreen || _$e.webkitEnterFullscreen || function() {
console.error("Fullscreen API is not available");
}).call(_$e);
},
exitFullScreen: function exitFullScreen() {
(document.exitFullScreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen || function() {
console.error("Exitscreen API is not available");
}).call(document);
},
requestPictureInPicture: function requestPictureInPicture() {
return this._mediaPlayer.getHTMLVideoElement().requestPictureInPicture();
},
setDisablePictureInPicture: function setDisablePictureInPicture(e3) {
this._mediaPlayer.getHTMLVideoElement().disablePictureInPicture = e3;
},
disablePictureInPicture: function disablePictureInPicture() {
return this._mediaPlayer.getHTMLVideoElement().disablePictureInPicture;
},
_onCaptionEvent: function _onCaptionEvent(e3) {
if ("text/json" === e3.type) {
var t3 = JSON.parse(e3.data);
if (t3.caption) {
var i3 = t3.caption;
this._captionTrack || (this._captionTrack = this.addTextTrack("captions", i3.format), this._currentCue = null), this._currentCue && this._captionTrack.removeCue(this._currentCue);
var n3 = this._mediaPlayer.getHTMLVideoElement(), r3 = window.VTTCue || window.vttjs.VTTCue;
r3 ? (this._currentCue = new r3(n3.currentTime, n3.currentTime + 2, i3.text), this._captionTrack.addCue(this._currentCue)) : console.warn("No VTTCue implementation available, caption may not be available");
}
}
},
_attachVideojsListeners: function _attachVideojsListeners() {
this._mediaPlayer.addEventListener(j.READY, function() {
this._readyState = dt.HAVE_METADATA, this.trigger(ut.LOADED_METADATA);
}.bind(this)), this._mediaPlayer.addEventListener(j.IDLE, function() {
this._readyState = dt.HAVE_NOTHING, this.trigger(ut.PAUSE);
}.bind(this)), this._mediaPlayer.addEventListener(j.PLAYING, function() {
this._readyState <= dt.HAVE_CURRENT_DATA && (this._readyState = dt.HAVE_FUTURE_DATA), this.trigger(ut.PLAY), this.trigger(ut.PLAYING);
}.bind(this)), this._mediaPlayer.addEventListener(j.ENDED, function() {
this._readyState = dt.HAVE_NOTHING, this.trigger(ut.ENDED);
}.bind(this)), this._mediaPlayer.addEventListener(j.BUFFERING, function() {
this._readyState = dt.HAVE_CURRENT_DATA;
}.bind(this)), this._mediaPlayer.addEventListener(C.REBUFFERING, function() {
this._readyState = dt.HAVE_CURRENT_DATA, this.trigger(ut.WAITING);
}.bind(this)), this._mediaPlayer.addEventListener(C.TIME_UPDATE, function() {
this.trigger(ut.TIME_UPDATE);
}.bind(this)), this._mediaPlayer.addEventListener(C.VOLUME_CHANGED, function() {
this.trigger(ut.VOLUME_CHANGE);
}.bind(this)), this._mediaPlayer.addEventListener(C.MUTED_CHANGED, function() {
this.trigger(ut.VOLUME_CHANGE);
}.bind(this)), this._mediaPlayer.addEventListener(C.ERROR, function() {
this.trigger(ut.ERROR);
}.bind(this)), this._mediaPlayer.addEventListener(C.DURATION_CHANGED, function() {
this.trigger(ut.DURATION_CHANGE);
}.bind(this)), this._mediaPlayer.addEventListener(C.SEEK_COMPLETED, function() {
this._seeking = false, this.trigger(ut.SEEKED);
}.bind(this)), this._mediaPlayer.addEventListener(C.PLAYBACK_RATE_CHANGED, function() {
this.trigger(ut.RATE_CHANGE);
}.bind(this));
},
techName: ft
});
n2.supportsFullScreen = function() {
return true;
}, n2.isSupported = function() {
return -1 === (navigator.appVersion || "").toLowerCase().indexOf("rv:11");
}, n2.canPlayType = function(e3) {
return "string" == typeof e3 && e3.length > 0 && (e3.indexOf("application/x-mpegURL") > -1 ? "undefined" != typeof MediaSource && MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"') : "" !== document.createElement("video").canPlayType(e3));
}, n2.canPlaySource = function() {
return true;
}, e2.registerTech("AmazonIVS", n2);
var r2 = e2.registerPlugin || e2.plugin;
r2("getIVSEvents", function() {
return {
PlayerEventType: C,
MetadataEventType: H,
PlayerState: j,
ErrorType: rt
};
}), r2("getIVSPlayer", function() {
return this.tech(true).getMediaPlayerAPI();
});
}
};
var pt = function pt2(e2) {
if (void 0 === e2 || "function" != typeof e2.getTech)
throw {
message: "videojs not available, Amazon IVS Quality Plugin not registered",
code: 1
};
if (!e2.getPlugin(vt)) {
var t2 = e2.getComponent("MenuButton"), i2 = e2.getComponent("MenuItem"), n2 = e2.extend(i2, {
constructor: function constructor(e3, t3) {
var n3 = t3.quality;
i2.call(this, e3, {
selectable: true,
label: n3.name
}), this.quality = n3;
},
handleClick: function handleClick(e3) {
i2.prototype.handleClick.call(this, e3);
var t3 = this.player().getIVSPlayer();
"auto" === this.quality.group ? t3.setAutoQualityMode(true) : t3.setQuality(this.quality);
}
}), r2 = e2.extend(t2, {
constructor: function constructor(e3) {
t2.call(this, e3, {}), this.controlText("Quality");
},
createItems: function createItems() {
var _$e = this.player(), t3 = _$e.getIVSPlayer(), i3 = [], r3 = new n2(_$e, {
quality: {
group: "auto",
name: "Auto"
}
});
r3.selected(t3.isAutoQualityMode()), r3.on("click", this._clickHandler.bind(this, r3)), r3.on("tap", this._clickHandler.bind(this, r3)), i3.push(r3);
var o2 = t3.getQuality(), s2 = t3.getQualities();
return s2 && s2.length > 0 && s2.forEach(function(r4) {
var s3 = new n2(_$e, {
quality: r4
});
s3.on("click", this._clickHandler.bind(this, s3)), s3.on("tap", this._clickHandler.bind(this, s3)), t3.isAutoQualityMode() || s3.selected(o2.group === r4.group), i3.push(s3);
}.bind(this)), t3.addEventListener(C.QUALITY_CHANGED, function(i4) {
_$e.controlBar.getChild("QualityMenuButton").qualityItems.forEach(function(e3) {
!t3.isAutoQualityMode() && i4 && e3 && e3.quality && e3.selected(i4.group === e3.quality.group);
});
}), this.qualityItems = i3, i3;
},
buildCSSClass: function buildCSSClass() {
return "vjs-icon-hd vjs-icon-placeholder " + t2.prototype.buildCSSClass.call(this);
},
_clickHandler: function _clickHandler(e3) {
this.items.forEach(function(t3) {
t3 !== e3 && t3.selected(false);
});
}
});
e2.registerComponent("QualityMenuButton", r2), (e2.registerPlugin || e2.plugin)(vt, function() {
var _$e = this;
_$e.getIVSPlayer().addEventListener(j.READY, function() {
var t3 = _$e.controlBar.getChild("QualityMenuButton");
t3 && (t3.dispose(), _$e.controlBar.removeChild(t3)), _$e.controlBar.addChild("QualityMenuButton");
});
});
}
};
var e = {
n: function n2(t2) {
var i2 = t2 && t2.__esModule ? function i3() {
return t2.default;
} : function() {
return t2;
};
return e.d(i2, {
a: i2
}), i2;
},
d: function d2(t2, i2) {
for (var n2 in i2)
e.o(i2, n2) && !e.o(t2, n2) && Object.defineProperty(t2, n2, {
enumerable: true,
get: i2[n2]
});
}
};
e.g = function() {
if ("object" == typeof globalThis)
return globalThis;
try {
return this || new Function("return this")();
} catch (e2) {
if ("object" == typeof window)
return window;
}
}(), e.o = function(e2, t2) {
return Object.prototype.hasOwnProperty.call(e2, t2);
}, e.r = function(e2) {
"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e2, Symbol.toStringTag, {
value: "Module"
}), Object.defineProperty(e2, "__esModule", {
value: true
});
};
var t = {};
e.r(t), e.d(t, {
AuthorizationError: function AuthorizationError() {
return ot;
},
CaptureEventType: function CaptureEventType() {
return st;
},
ErrorSource: function ErrorSource() {
return nt;
},
ErrorType: function ErrorType() {
return rt;
},
LogLevel: function LogLevel() {
return at;
},
MediaPlayer: function MediaPlayer() {
return ht;
},
MetadataEventType: function MetadataEventType() {
return H;
},
MetadataID3Type: function MetadataID3Type() {
return F;
},
PlayerEventType: function PlayerEventType() {
return C;
},
PlayerState: function PlayerState() {
return j;
},
RemotePlayerEvent: function RemotePlayerEvent() {
return G;
},
create: function create2() {
return it;
},
createWorker: function createWorker() {
return $e;
},
isPlayerSupported: function isPlayerSupported2() {
return tt;
},
isVP9Supported: function isVP9Supported() {
return x;
},
isWasmSupported: function isWasmSupported() {
return et;
},
registerIVSQualityPlugin: function registerIVSQualityPlugin() {
return pt;
},
registerIVSTech: function registerIVSTech() {
return mt;
}
});
var i = require_es5(), n = require_createClass(), r = e.n(n), o = 101, s = function() {
var e2 = function e3() {
this.buffer = void 0, this.head = void 0, this.tail = void 0, this.buffer = [], this.head = 0, this.tail = 0;
};
var t2 = e2.prototype;
return t2.push = function(e3) {
this.tail === this.buffer.length ? this.buffer.push(e3) : this.buffer[this.tail] = e3, this.tail++;
}, t2.pop = function() {
var e3, t3 = null != (e3 = this.buffer[this.head]) ? e3 : null;
return this.buffer[this.head] = null, this.head++, this.empty() && (this.head = 0, this.tail = 0), t3;
}, t2.size = function() {
return this.tail - this.head;
}, t2.empty = function() {
return this.head >= this.tail;
}, e2;
}();
var l = 0.1, f = 1 << 30, m = 12e4, v = 3e3, p = {
audio: 1936684398,
video: 1986618469
};
var C, P = function() {
var e2 = function e3(e3, t3, i2, n2, r2) {
this.rawCodec = t3, this.group = i2, this.isProtected = n2, this.onError = r2, this.pending = void 0, this.unsubscribers = [], this.srcBuf = void 0, this.blocked = false, this.srcBuf = e3, this.pending = new s(), this.unsubscribers.push(b(e3, "updateend", this.process.bind(this)));
};
var t2 = e2.prototype;
return t2.getBufferedRanges = function() {
try {
var e3 = [];
if (this.srcBuf)
for (var t3 = this.srcBuf.buffered, i2 = 0; i2 < t3.length; i2++)
e3.push({
start: t3.start(i2),
end: t3.end(i2)
});
return e3;
} catch (e1) {
return [];
}
}, t2.abort = function() {
this.schedule(function(e3) {
e3.abort();
});
}, t2.appendBuffer = function(e3) {
this.schedule(function(t3) {
try {
t3.appendBuffer(e3);
} catch (e1) {
if ("QuotaExceededError" !== e1.name)
throw e1;
var i2 = t3.buffered, n2 = i2.start(0), r2 = i2.end(i2.length - 1), o2 = (n2 + r2) / 2;
t3.remove(o2, r2);
}
});
}, t2.setTimestampOffset = function(e3) {
this.schedule(function(t3) {
t3.timestampOffset = e3;
});
}, t2.remove = function(e3, t3) {
this.schedule(function(i2) {
var n2 = i2.buffered;
if (n2.length) {
var r2 = Math.max(e3, n2.start(0)), o2 = Math.min(t3, n2.end(n2.length - 1));
r2 < o2 && i2.remove(r2, o2);
}
});
}, t2.block = function() {
var e3 = this;
return new Promise(function(t3) {
e3.schedule(function() {
e3.blocked = true, t3();
});
});
}, t2.unblock = function() {
this.blocked = false, this.process();
}, t2.destroy = function() {
this.pending = new s(), this.unsubscribers.forEach(function(e3) {
return e3();
}), this.srcBuf = void 0;
}, t2.schedule = function(e3) {
this.pending.empty() && this.canProcess() ? this.safeExecute(e3) : (this.pending.push(e3), this.process());
}, t2.safeExecute = function(e3) {
try {
if (!this.srcBuf)
throw new Error("srcBuf is undefined");
e3(this.srcBuf);
} catch (e1) {
this.onError(e1, false);
}
}, t2.process = function() {
for (; !this.pending.empty() && this.canProcess(); )
this.safeExecute(this.pending.pop());
}, t2.canProcess = function() {
return !(!this.srcBuf || this.srcBuf.updating || this.blocked);
}, r()(e2, [
{
key: "buffer",
get: function get() {
return this.srcBuf;
}
},
{
key: "codec",
get: function get() {
return this.rawCodec;
}
},
{
key: "timestampOffset",
get: function get() {
return this.buffer ? this.buffer.timestampOffset : 0;
}
}
]), e2;
}(), A = function() {
var e2 = function e3(e3, t3, i2) {
this.mediaSource = e3, this.onEnded = t3, this.onError = i2, this.sourceBuffers = /* @__PURE__ */ Object.create(null), this.unsubscribers = [], this.unsubscribers.push(b(e3, "sourceended", this.onEnded));
};
e2.isSupported = function() {
return void 0 !== self.MediaSource;
}, e2.isSupportedInWorker = function() {
return e2.isSupported() && MediaSource.canConstructInDedicatedWorker && "function" == typeof MediaSourceHandle;
}, e2.create = function(t3, i2) {
var n2 = new MediaSource(), r2 = new Promise(function(r3, o2) {
var s2 = b(n2, "sourceopen", function() {
"open" === n2.readyState ? (r3(new e2(n2, t3, i2)), s2()) : o2("The MediaSource was closed upon opening");
});
});
return {
ms: n2,
sink: r2
};
};
var t2 = e2.prototype;
return t2.getBufferedRanges = function(e3) {
var t3, i2;
return null != (t3 = null == (i2 = this.sourceBuffers[p[e3]]) ? void 0 : i2.getBufferedRanges()) ? t3 : [];
}, t2.addTrack = function(e3, t3, i2, n2) {
var r2, o2 = this.mediaSource, s2 = this.sourceBuffers;
if (s2[e3])
return null != (r2 = s2[e3].buffer) ? r2 : null;
try {
var a2 = o2.addSourceBuffer("video/mp4;" + t3);
return s2[e3] = new P(a2, t3, i2, n2, this.handleError.bind(this)), a2;
} catch (e1) {
this.handleError(e1, "open" === o2.readyState);
}
return null;
}, t2.append = function(e3, t3) {
var i2;
null == (i2 = this.sourceBuffers[e3]) || i2.appendBuffer(t3);
}, t2.remove = function(e3, t3) {
for (var i2 = this.sourceBuffers, n2 = 0, r2 = Object.keys(i2); n2 < r2.length; n2++)
i2[r2[n2]].remove(e3, t3);
}, t2.setTimestampOffset = function(e3, t3) {
var i2 = this.sourceBuffers[e3];
i2 && (i2.abort(), i2.setTimestampOffset(t3));
}, t2.setDuration = function(e3) {
var t3 = this;
this.scheduleUpdate(function() {
return t3.mediaSource.duration = e3;
}).catch(function(e4) {
return t3.handleError(e4, false);
});
}, t2.setLiveSeekableRange = function(e3, t3) {
var i2 = this;
this.scheduleUpdate(function() {
return i2.mediaSource.setLiveSeekableRange(e3, t3);
}).catch(function(e4) {
return i2.handleError(e4, false);
});
}, t2.scheduleUpdate = function(e3) {
var t3 = this;
void 0 === e3 && (e3 = M);
var i2 = Object.keys(this.sourceBuffers).map(function(e4) {
return t3.sourceBuffers[e4];
});
return Promise.all(i2.map(function(e4) {
return e4.block();
})).then(e3).then(function() {
return i2.forEach(function(e4) {
return e4.unblock();
});
});
}, t2.destroy = function() {
this.destroySourceBuffers(), this.unsubscribers.forEach(function(e3) {
return e3();
}), this.unsubscribers = [];
}, t2.handleError = function(e3, t3) {
var i2 = e3.code || 102, n2 = 102;
"NotSupportedError" === e3.name && (n2 = i2 = 4), this.onError(n2, i2, e3.message, t3);
}, t2.destroySourceBuffers = function() {
for (var _$e = this.mediaSource, t3 = _$e.sourceBuffers, i2 = 0; i2 < t3.length; i2++)
try {
_$e.removeSourceBuffer(t3[i2]);
} catch (e3) {
this.handleError(e3, false);
}
for (var n2 = 0, r2 = Object.keys(this.sourceBuffers); n2 < r2.length; n2++) {
var o2 = r2[n2];
this.sourceBuffers[o2].destroy();
}
this.sourceBuffers = /* @__PURE__ */ Object.create(null);
}, r()(e2, [
{
key: "duration",
get: function get() {
return this.mediaSource.duration;
}
},
{
key: "bufferProperties",
get: function get() {
var e3 = this.sourceBuffers;
return Object.keys(e3).map(function(t3) {
var i2 = e3[t3];
return {
trackID: Number(t3),
codec: i2.codec,
mode: "mse",
path: "",
isProtected: i2.isProtected,
group: i2.group,
srcObj: null
};
});
}
}
]), e2;
}(), M = function M2() {
}, D = /^(\d+)\.(\d+)\.(\d+)[+|-]?(.*)?$/, R = /^(\d+)\.(\d+)[+|-]?(.*)?$/, L = /^(\d+)$/, w = {
chrome: false,
chromecast: false,
domain: "",
electron: false,
family: "",
firefox: false,
host: "",
major: -1,
minor: -1,
msEdgeLegacy: false,
msEdgeChromium: false,
msIE: false,
name: "",
opera: false,
osName: "",
osVersion: "",
patch: -1,
safari: false,
url: "",
userAgent: "",
mobile: false,
supportsDataChannels: false,
supportsWebTransport: false,
supportsMSEInWorkers: false
}, _ = null;
!function(e2) {
e2.INITIALIZED = "PlayerInitialized", e2.QUALITY_CHANGED = "PlayerQualityChanged", e2.DURATION_CHANGED = "PlayerDurationChanged", e2.VOLUME_CHANGED = "PlayerVolumeChanged", e2.MUTED_CHANGED = "PlayerMutedChanged", e2.PLAYBACK_RATE_CHANGED = "PlayerPlaybackRateChanged", e2.REBUFFERING = "PlayerRebuffering", e2.AUDIO_BLOCKED = "PlayerAudioBlocked", e2.PLAYBACK_BLOCKED = "PlayerPlaybackBlocked", e2.ERROR = "PlayerError", e2.RECOVERABLE_ERROR = "PlayerRecoverableError", e2.ANALYTICS_EVENT = "PlayerAnalyticsEvent", e2.TIME_UPDATE = "PlayerTimeUpdate", e2.BUFFER_UPDATE = "PlayerBufferUpdate", e2.SEEK_COMPLETED = "PlayerSeekCompleted", e2.SESSION_DATA = "PlayerSessionData", e2.STATE_CHANGED = "PlayerStateChanged", e2.WORKER_ERROR = "PlayerWorkerError", e2.METADATA = "PlayerMetadata", e2.TEXT_CUE = "PlayerTextCue", e2.TEXT_METADATA_CUE = "PlayerTextMetadataCue", e2.AD_CUE = "PlayerAdCue", e2.STREAM_SOURCE_CUE = "PlayerStreamSourceCue", e2.NETWORK_UNAVAILABLE = "PlayerNetworkUnavailable", e2.SEGMENT_DISCONTINUITY = "PlayerSegmentDiscontinuity", e2.SEGMENT_METADATA = "PlayerSegmentMetadata";
}(C || (C = {}));
var O = null, N = null;
var U = function() {
function e2() {
var t2 = this;
this.batteryManager = void 0, this.processor = this.processor.bind(this), e2.isSupported() && window.navigator.getBattery().then(function(e3) {
t2.batteryManager = e3;
});
}
return e2.isSupported = function() {
return window && window.navigator && !!window.navigator.getBattery;
}, e2.prototype.processor = function(e3) {
var t2 = e3.type === C.ANALYTICS_EVENT, i2 = e3.arg && "minute-watched" === e3.arg.name;
return t2 && i2 && this.batteryManager && (e3.arg.properties.battery_percent = this.batteryManager.level), e3;
}, e2;
}();
var H, F, G, j, W = {
keySystem: "org.w3.clearkey",
uuid: "1077efec-c0b2-4d02-ace3-3c1e52e2fb4b"
}, K = {
keySystem: "com.apple.fps.2_0",
certUrl: "https://fp-keyos-twitch.licensekeyserver.com/cert/a17fd33d3843df9b17679ccf50a419b2.der",
licenseUrl: "https://fp-keyos-twitch.licensekeyserver.com/getkey",
uuid: "94CE86FB-07FF-4F43-ADB8-93D2FA968CA2"
}, q = {
keySystem: "com.microsoft.playready",
licenseUrl: "https://pr-keyos-twitch.licensekeyserver.com/core/rightsmanager.asmx",
uuid: "9a04f079-9840-4286-ab92-e65be0885f95"
}, Q = {
keySystem: "com.widevine.alpha",
licenseUrl: "https://wv-keyos-twitch.licensekeyserver.com",
uuid: "edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"
}, Y = {
CLEARKEY: W,
FAIRPLAY: K,
PLAYREADY: q,
WIDEVINE: Q
}, z = {
"com.widevine.alpha": Q,
"com.microsoft.playready": q,
"com.apple.fps.2_0": K,
"org.w3.clearkey": W
}, X = {
value: 4,
message: "Your browser does not support any DRM Content Decryption Modules"
}, J = {
value: 4,
message: "There was an issue while updating DRM License"
}, Z = {
value: 2,
message: "Error while requesting DRM license"
}, $ = {
value: 4,
message: "Error creating key session"
}, ee = {
value: 4,
message: "Encryption key not usable because of internal error in CDM"
}, te = {
value: 4,
message: "Unable to find valid CDM support on media"
}, ie = {
value: 2,
message: "Request for AuthXML failed"
}, ne = {
value: 2,
message: "Request for DRM certificate failed"
};
!function(e2) {
e2.ID3 = "MetaID3", e2.CAPTION = "MetaCaption";
}(H || (H = {})), function(e2) {
e2.METADATA_ID = "metadata.live-video.net", e2.INBAND_METADATA_ID = "inband.metadata.live-video.net";
}(F || (F = {})), function(e2) {
e2.AVAILABLE = "RemotePlayerAvailable", e2.UNAVAILABLE = "RemotePlayerUnavailable", e2.SESSION_STARTED = "RemotePlayerSessionStarted", e2.SESSION_ENDED = "RemotePlayerSessionEnded";
}(G || (G = {})), function(e2) {
e2.IDLE = "Idle", e2.READY = "Ready", e2.BUFFERING = "Buffering", e2.PLAYING = "Playing", e2.ENDED = "Ended";
}(j || (j = {}));
var pe = require_asyncToGenerator(), ge = e.n(pe), ye = require_regenerator(), Ee = e.n(ye);
var Ce, Pe = [
{
initDataTypes: [
"cenc"
],
audioCapabilities: [
{
contentType: 'audio/mp4;codecs="mp4a.40.2"'
}
],
videoCapabilities: [
{
robustness: "SW_SECURE_CRYPTO",
contentType: 'video/mp4;codecs="avc1.42E01E"'
}
]
}
], Ae = function() {
var e2 = function e3(e3) {
var t3 = this;
this.video = void 0, this.listener = void 0, this.cdmSupport = void 0, this.selectedCDM = void 0, this.mediaKeys = void 0, this.pendingSessions = void 0, this.sessions = void 0, this.authXml = void 0, this.video = e3.video, this.listener = e3.listener, this.cdmSupport = null, this.selectedCDM = null, this.mediaKeys = void 0, this.pendingSessions = [], this.reset(), this.video.addEventListener("encrypted", function(e4) {
return t3.handleEncrypted(e4);
}), this.video.addEventListener("webkitneedkey", function(e4) {
return t3.handleWebKitEncrypted(e4);
});
};
var t2 = e2.prototype;
return t2.configure = function(e3) {
var t3 = this;
if (!this.authXml) {
var i2 = new URL(e3), n2 = i2.pathname.split("/"), r2 = n2[n2.length - 1].split(".")[0], o2 = function(e4) {
var t4 = new URL(e4).searchParams, i3 = {};
return t4.forEach(function(e5, t5) {
i3[ve(t5)] = e5 ? ve(e5) : "";
}), i3;
}(e3), s2 = o2.token, a2 = o2.sig, u2 = "https://" + i2.host + "/api/authxml/" + r2 + "?token=" + encodeURIComponent(s2) + "&sig=" + a2;
this.authXml = ce(u2, {
method: "GET",
responseType: "text"
}).catch(function(e4) {
t3.handleError(Object.assign({
code: e4
}, ie));
});
}
}, t2.reset = function() {
this.authXml = null, this.sessions = [];
}, t2.isProtected = function() {
return null !== this.authXml;
}, t2.handleError = function(e3) {
this.listener.onSinkError({
value: e3.value || 4,
code: e3.code || 0,
message: e3.message || ""
});
}, t2.hasSession = function(e3) {
if (!e3)
return false;
for (var t3, i2 = function(e4, t4) {
var i3 = "undefined" != typeof Symbol && e4[Symbol.iterator] || e4["@@iterator"];
if (i3)
return (i3 = i3.call(e4)).next.bind(i3);
if (Array.isArray(e4) || (i3 = function(e5, t5) {
if (e5) {
if ("string" == typeof e5)
return Te(e5, t5);
var i4 = Object.prototype.toString.call(e5).slice(8, -1);
return "Object" === i4 && e5.constructor && (i4 = e5.constructor.name), "Map" === i4 || "Set" === i4 ? Array.from(e5) : "Arguments" === i4 || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i4) ? Te(e5, t5) : void 0;
}
}(e4)) || t4 && e4 && "number" == typeof e4.length) {
i3 && (e4 = i3);
var n3 = 0;
return function() {
return n3 >= e4.length ? {
done: true
} : {
done: false,
value: e4[n3++]
};
};
}
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}(this.sessions); !(t3 = i2()).done; ) {
var n2 = t3.value;
if (n2.initData && se(n2.initData, e3))
return true;
}
return false;
}, t2.createKeySystemSupportChain = function() {
if (null === this.cdmSupport || 0 === this.cdmSupport.length)
return Promise.reject(te);
var e3 = Promise.reject();
return this.cdmSupport.forEach(function(t3) {
e3 = e3.catch(function() {
return navigator.requestMediaKeySystemAccess(t3.keySystem, Pe);
});
}), e3 = e3.catch(function() {
return Promise.reject(X);
});
}, t2.handleEncrypted = function() {
var e3 = ge()(Ee().mark(function e4(t3) {
var i2, n2;
return Ee().wrap(function(e5) {
for (; ; )
switch (e5.prev = e5.next) {
case 0:
if (!this.hasSession(t3.initData)) {
e5.next = 2;
break;
}
return e5.abrupt("return");
case 2:
if (this.sessions.push(t3), "sinf" !== t3.initDataType) {
e5.next = 6;
break;
}
return this.handleWebKitEncrypted(t3), e5.abrupt("return");
case 6:
if (null === this.cdmSupport && (this.cdmSupport = ue(t3.initData)), void 0 !== this.mediaKeys) {
e5.next = 24;
break;
}
return this.mediaKeys = null, e5.prev = 9, e5.next = 12, this.createKeySystemSupportChain();
case 12:
return i2 = e5.sent, this.selectedCDM = z[i2.keySystem], e5.next = 16, i2.createMediaKeys();
case 16:
return n2 = e5.sent, e5.next = 19, this.setMediaKeys(n2);
case 19:
e5.next = 24;
break;
case 21:
e5.prev = 21, e5.t0 = e5.catch(9), this.handleError(e5.t0);
case 24:
this.addSession(t3);
case 25:
case "end":
return e5.stop();
}
}, e4, this, [
[
9,
21
]
]);
}));
return function(t3) {
return e3.apply(this, arguments);
};
}(), t2.setMediaKeys = function(e3) {
var t3 = this;
return this.mediaKeys = e3, this.pendingSessions.forEach(function(e4) {
return t3.createSessionRequest(e4).catch(function() {
t3.handleError($);
});
}), this.pendingSessions = [], this.video.setMediaKeys(this.mediaKeys);
}, t2.addSession = function(e3) {
var t3 = this;
this.mediaKeys ? this.createSessionRequest(e3).catch(function() {
t3.handleError($);
}) : this.pendingSessions.push(e3);
}, t2.createSessionRequest = function(e3) {
var t3, i2 = this, n2 = e3.initDataType, r2 = e3.initData, o2 = null == (t3 = this.mediaKeys) ? void 0 : t3.createSession();
return o2 ? (o2.addEventListener("message", function(e4) {
return i2.handleMessage(e4);
}), o2.addEventListener("keystatuseschange", function(e4) {
return i2.handleKeyStatusesChange(e4, r2);
}), o2.generateRequest(n2, r2)) : Promise.reject();
}, t2.handleKeyStatusesChange = function(e3, t3) {
var i2 = this, n2 = e3.target, r2 = false;
n2.keyStatuses.forEach(function(e4) {
switch (e4) {
case "expired":
r2 = true;
break;
case "internal-error":
i2.handleError(ee);
}
}), r2 && n2.close().then(function() {
return i2.removeSession(t3);
});
}, t2.removeSession = function(e3) {
for (var t3 = 0; t3 < this.sessions.length; t3++)
if (this.sessions[t3].initData === e3)
return void this.sessions.splice(t3, 1);
}, t2.handleMessage = function() {
var e3 = ge()(Ee().mark(function e4(t3) {
var i2, n2, r2 = this;
return Ee().wrap(function(e5) {
for (; ; )
switch (e5.prev = e5.next) {
case 0:
return i2 = t3.target, e5.next = 3, this.generateLicense(t3.message);
case 3:
(n2 = e5.sent) && i2.update(n2).catch(function() {
r2.handleError(J);
});
case 5:
case "end":
return e5.stop();
}
}, e4, this);
}));
return function(t3) {
return e3.apply(this, arguments);
};
}(), t2.generateLicense = function() {
var e3 = ge()(Ee().mark(function e4(t3) {
var i2, n2, r2, o2;
return Ee().wrap(function(e5) {
for (; ; )
switch (e5.prev = e5.next) {
case 0:
if (this.selectedCDM !== Y.CLEARKEY) {
e5.next = 7;
break;
}
return i2 = JSON.parse(new TextDecoder().decode(t3)), n2 = i2.kids.map(function(e6) {
return {
kty: "oct",
alg: "A128KW",
kid: e6,
k: e6
};
}), r2 = new TextEncoder().encode(JSON.stringify({
keys: n2
})), e5.abrupt("return", Promise.resolve(r2));
case 7:
if (!this.authXml) {
e5.next = 14;
break;
}
return e5.next = 10, this.authXml;
case 10:
return o2 = e5.sent, e5.abrupt("return", this.requestLicense(t3, o2));
case 14:
this.handleError(ie);
case 15:
case "end":
return e5.stop();
}
}, e4, this);
}));
return function(t3) {
return e3.apply(this, arguments);
};
}(), t2.requestLicense = function() {
var e3 = ge()(Ee().mark(function e4(t3, i2) {
var n2, r2, o2, s2 = this;
return Ee().wrap(function(e5) {
for (; ; )
switch (e5.prev = e5.next) {
case 0:
return r2 = {
method: "POST",
responseType: "arraybuffer",
body: t3,
headers: {
customdata: i2,
"Content-Type": "application/octet-stream"
}
}, this.selectedCDM === Y.PLAYREADY && (o2 = be(t3), r2.body = o2.body, r2.headers = Object.assign(r2.headers, o2.headers)), e5.abrupt("return", ce((null == (n2 = this.selectedCDM) ? void 0 : n2.licenseUrl) || "", r2).catch(function() {
s2.handleError(Object.assign({
code: status
}, Z));
}));
case 3:
case "end":
return e5.stop();
}
}, e4, this);
}));
return function(t3, i2) {
return e3.apply(this, arguments);
};
}(), t2.handleWebKitEncrypted = function() {
var e3 = ge()(Ee().mark(function e4(t3) {
var i2, n2 = this;
return Ee().wrap(function(e5) {
for (; ; )
switch (e5.prev = e5.next) {
case 0:
return this.selectedCDM = Y.FAIRPLAY, e5.prev = 1, e5.next = 4, ce(Y.FAIRPLAY.certUrl || "", {
method: "GET",
responseType: "arraybuffer",
headers: {
Pragma: "Cache-Control: no-cache",
"Cache-Control": "max-age=0"
}
});
case 4:
i2 = e5.sent, this.setupWebKitMediaKeys(t3, i2).catch(function(e6) {
return n2.handleError(e6);
}), e5.next = 11;
break;
case 8:
e5.prev = 8, e5.t0 = e5.catch(1), this.handleError(Object.assign({
code: e5.t0
}, ne));
case 11:
case "end":
return e5.stop();
}
}, e4, this, [
[
1,
8
]
]);
}));
return function(t3) {
return e3.apply(this, arguments);
};
}(), t2.setupWebKitMediaKeys = function(e3, t3) {
var i2 = this;
if (!e3.initData)
return Promise.reject("Missing initData on MediaEncryptedEvent");
this.video.webkitKeys || this.video.webkitSetMediaKeys(new window.WebKitMediaKeys(Y.FAIRPLAY.keySystem));
var n2 = de(e3.initData), r2 = this.video.webkitKeys.createSession("video/mp4", e3.initData);
return r2.contentId = n2, new Promise(function(e4, o2) {
if (i2.video.webkitKeys || o2("Issue setting fairplay media keys"), !r2)
return o2("Could not create key session");
r2.addEventListener("webkitkeymessage", function(e5) {
var r3 = e5.target;
"certificate" === String.fromCharCode.apply(null, e5.message) ? r3.update(new Uint8Array(t3)) : i2.getWebkitLicense(e5.message, n2).then(function(e6) {
var _$t = e6.trim();
"<ckc>" === _$t.substr(0, 5) && "</ckc>" === _$t.substr(-6) && (_$t = _$t.slice(5, -6)), r3.update(me(_$t));
}).catch(o2);
}), r2.addEventListener("webkitkeyadded", e4), r2.addEventListener("webkitkeyerror", o2);
});
}, t2.getWebkitLicense = function(e3, t3) {
return this.authXml ? this.authXml.then(function(i2) {
var n2;
return ce(Y.FAIRPLAY.licenseUrl || "", {
method: "POST",
body: "spc=" + (n2 = e3, btoa(String.fromCharCode.apply(null, new Uint16Array(n2))) + "&assetId=") + t3,
responseType: "text",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
customdata: i2
}
}).catch(function(e4) {
return Promise.reject(Object.assign({
code: e4
}, Z));
});
}) : Promise.reject(ie);
}, e2;
}(), Me = require_inheritsLoose(), De = e.n(Me), Re = function() {
var e2 = function e3() {
};
var t2 = e2.prototype;
return t2.addTrack = function(e3) {
}, t2.bufferDuration = function() {
return 0;
}, t2.buffered = function() {
return {
start: 0,
end: 0
};
}, t2.getBufferedRanges = function(e3) {
return [];
}, t2.captureGesture = function() {
}, t2.configure = function(e3) {
}, t2.decodedFrames = function() {
return 0;
}, t2.delete = function() {
}, t2.droppedFrames = function() {
return 0;
}, t2.endOfStream = function() {
}, t2.enqueue = function(e3) {
}, t2.framerate = function() {
return 0;
}, t2.getCurrentTime = function() {
return 0;
}, t2.getDisplayHeight = function() {
return 0;
}, t2.getDisplayWidth = function() {
return 0;
}, t2.getPlaybackRate = function() {
return 0;
}, t2.getVolume = function() {
return 0;
}, t2.invoke = function(e3) {
this[e3.name].call(this, e3.arg);
}, t2.isMuted = function() {
return false;
}, t2.onSourceDurationChanged = function(e3) {
}, t2.pause = function() {
}, t2.play = function() {
}, t2.reinit = function() {
}, t2.remove = function(e3) {
}, t2.seekTo = function(e3) {
}, t2.setMuted = function(e3) {
}, t2.setPlaybackRate = function(e3) {
}, t2.setTimestampOffset = function(e3) {
}, t2.setVolume = function(e3) {
}, t2.changeSrc = function(e3) {
}, t2.changeSrcObj = function(e3) {
}, t2.onSegmentDiscontinuity = function() {
}, e2;
}(), Le = "pc-chromecast-sender", we = function(t2) {
function i2(e2) {
var n3;
return (n3 = t2.call(this) || this).remotePlayer = void 0, n3.remotePlayerController = void 0, n3.listener = void 0, n3.seekTime = void 0, n3.currentDuration = void 0, n3.listener = e2, n3.currentDuration = 0, i2.prepareCastContext().then(function() {
n3.remotePlayer = new cast.framework.RemotePlayer(), n3.remotePlayerController = new cast.framework.RemotePlayerController(n3.remotePlayer);
}).catch(function() {
n3.listener.onSessionError();
}), n3;
}
De()(i2, t2), i2.canCast = function() {
return I().chrome;
}, i2.stopLookingForRemotePlaybackDevices = function(e2) {
window.cast && window.cast.framework && cast.framework.CastContext.getInstance().removeEventListener(cast.framework.CastContextEventType.CAST_STATE_CHANGED, e2);
}, i2.lookForRemotePlaybackDevices = function() {
var e2 = ge()(Ee().mark(function e3(t3) {
var n3, r2;
return Ee().wrap(function(e4) {
for (; ; )
switch (e4.prev = e4.next) {
case 0:
return e4.prev = 0, e4.next = 3, i2.prepareCastContext();
case 3:
return n3 = e4.sent, r2 = function r3(e5) {
switch (e5.castState) {
case cast.framework.CastState.NO_DEVICES_AVAILABLE:
break;
case cast.framework.CastState.NOT_CONNECTED:
t3.onRemoteDevice(true);
break;
case cast.framework.CastState.CONNECTED:
var _$i = n3.getCurrentSession();
_$i && _$i.getSessionState() === cast.framework.SessionState.SESSION_RESUMED && t3.onRemoteReconnect();
}
}, n3.addEventListener(cast.framework.CastContextEventType.CAST_STATE_CHANGED, r2), n3.setOptions({
receiverApplicationId: "B3DCF968",
autoJoinPolicy: chrome.cast.AutoJoinPolicy.TAB_AND_ORIGIN_SCOPED
}), e4.abrupt("return", r2);
case 10:
e4.prev = 10, e4.t0 = e4.catch(0), t3.onRemoteDevice(false);
case 13:
case "end":
return e4.stop();
}
}, e3, null, [
[
0,
10
]
]);
}));
return function(t3) {
return e2.apply(this, arguments);
};
}(), i2.prepareCastContext = function() {
var _$t = ge()(Ee().mark(function t3() {
return Ee().wrap(function(t4) {
for (; ; )
switch (t4.prev = t4.next) {
case 0:
if (!window.cast || !window.cast.framework) {
t4.next = 2;
break;
}
return t4.abrupt("return", Promise.resolve(cast.framework.CastContext.getInstance()));
case 2:
return t4.abrupt("return", new Promise(function(t5, i3) {
if (e.g.__onGCastApiAvailable = function(e2) {
e2 ? t5(cast.framework.CastContext.getInstance()) : i3();
}, !document.getElementById(Le)) {
var n3 = document.createElement("script");
n3.id = Le, n3.onerror = function() {
document.body.removeChild(n3), e.g.__onGCastApiAvailable = function() {
}, i3();
}, n3.async = true, n3.src = "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1", document.body.appendChild(n3);
}
}));
case 3:
case "end":
return t4.stop();
}
}, t3);
}));
return function() {
return _$t.apply(this, arguments);
};
}();
var n2 = i2.prototype;
return n2.configure = function() {
var e2 = ge()(Ee().mark(function e3(t3) {
var n3, r2, o2, s2, a2, u2, c2;
return Ee().wrap(function(e4) {
for (; ; )
switch (e4.prev = e4.next) {
case 0:
return n3 = t3.path, e4.prev = 1, e4.next = 4, i2.prepareCastContext();
case 4:
if (o2 = e4.sent, s2 = o2.getCurrentSession()) {
e4.next = 13;
break;
}
return e4.next = 9, o2.requestSession();
case 9:
s2 = o2.getCurrentSession(), this.setupRemotePlayerListeners(s2), e4.next = 14;
break;
case 13:
s2.getSessionState() === cast.framework.SessionState.SESSION_RESUMED && this.setupRemotePlayerListeners(s2);
case 14:
return (a2 = new chrome.cast.media.MediaInfo(n3, "")).streamType = chrome.cast.media.StreamType.BUFFERED, u2 = new chrome.cast.media.GenericMediaMetadata(), a2.metadata = u2, a2.customData = {
analytics: {
chromecast_sender: "player-core",
platform: "web"
}
}, this.remotePlayerController.stop(), c2 = new chrome.cast.media.LoadRequest(a2), this.seekTime > 0 && (c2.currentTime = this.seekTime, this.seekTime = 0), this.currentDuration = 0, e4.next = 25, null == (r2 = s2) ? void 0 : r2.loadMedia(c2);
case 25:
e4.next = 30;
break;
case 27:
return e4.prev = 27, e4.t0 = e4.catch(1), e4.abrupt("return", this.handleError(e4.t0));
case 30:
case "end":
return e4.stop();
}
}, e3, this, [
[
1,
27
]
]);
}));
return function(t3) {
return e2.apply(this, arguments);
};
}(), n2.stopMedia = function() {
var e2 = ge()(Ee().mark(function e3(t3) {
var n3, r2;
return Ee().wrap(function(e4) {
for (; ; )
switch (e4.prev = e4.next) {
case 0:
return void 0 === t3 && (t3 = true), e4.next = 3, i2.prepareCastContext();
case 3:
n3 = e4.sent, (r2 = n3.getCurrentSession()) && r2.getSessionState() !== cast.framework.SessionState.SESSION_RESUMED && r2.endSession(t3);
case 6:
case "end":
return e4.stop();
}
}, e3);
}));
return function(t3) {
return e2.apply(this, arguments);
};
}(), n2.invoke = function(e2) {
this[e2.name].call(this, e2.arg);
}, n2.play = function() {
this.remotePlayer && this.remotePlayer.isPaused && this.remotePlayerController.playOrPause();
}, n2.pause = function() {
this.remotePlayer && !this.remotePlayer.isPaused && this.remotePlayerController.playOrPause();
}, n2.seekTo = function(e2) {
this.remotePlayer && (this.remotePlayer.playerState !== chrome.cast.media.PlayerState.IDLE ? (this.remotePlayer.currentTime = e2, this.remotePlayerController.seek()) : this.seekTime = e2);
}, n2.getCurrentTime = function() {
return this.remotePlayer ? this.remotePlayer.currentTime : 0;
}, n2.delete = function() {
this.remotePlayer && this.stopMedia();
}, n2.setMuted = function(e2) {
this.remotePlayer && e2 !== this.remotePlayer.isMuted && this.remotePlayerController.muteOrUnmute();
}, n2.isMuted = function() {
return !!this.remotePlayer && this.remotePlayer.isMuted;
}, n2.setVolume = function(e2) {
this.remotePlayer && (this.remotePlayer.volumeLevel = e2, this.remotePlayerController.setVolumeLevel());
}, n2.getVolume = function() {
return this.remotePlayer ? this.remotePlayer.volumeLevel : 0;
}, n2.getDevice = function() {
var e2 = ge()(Ee().mark(function e3() {
var _$t, n3;
return Ee().wrap(function(e4) {
for (; ; )
switch (e4.prev = e4.next) {
case 0:
return e4.next = 2, i2.prepareCastContext();
case 2:
return _$t = e4.sent, n3 = _$t.getCurrentSession(), e4.abrupt("return", (null == n3 ? void 0 : n3.getCastDevice().friendlyName) || "");
case 5:
case "end":
return e4.stop();
}
}, e3);
}));
return function() {
return e2.apply(this, arguments);
};
}(), n2.setupRemotePlayerListeners = function(e2) {
var _$t = this, _$i = function() {
var _$i2 = ge()(Ee().mark(function i3() {
var n4, r3;
return Ee().wrap(function(i4) {
for (; ; )
switch (i4.prev = i4.next) {
case 0:
(n4 = e2.getMediaSession()) && (r3 = n4.media, 0 === _$t.currentDuration && null === r3.duration && (_$t.currentDuration = 1 / 0, _$t.listener.onSinkDurationChanged(_$t.currentDuration)), _$t.listener.onSinkTimeUpdate());
case 2:
case "end":
return i4.stop();
}
}, i3);
}));
return function() {
return _$i2.apply(this, arguments);
};
}(), n3 = function n4() {
switch (_$t.remotePlayer.playerState) {
case chrome.cast.media.PlayerState.BUFFERING:
_$t.listener.onSinkIdle();
break;
case chrome.cast.media.PlayerState.PLAYING:
_$t.listener.onSinkPlaying(false);
break;
case chrome.cast.media.PlayerState.IDLE:
var _$i2 = e2.getMediaSession();
_$i2 && _$i2.idleReason === chrome.cast.media.IdleReason.FINISHED && _$t.listener.onSinkEnded();
}
}, r2 = function r3() {
_$t.listener.onSinkVolumeChanged(_$t.remotePlayer.volumeLevel, true);
}, o2 = function o3() {
_$t.listener.onSinkMutedChanged(_$t.remotePlayer.isMuted);
}, s2 = function s3() {
0 !== _$t.remotePlayer.duration && (_$t.currentDuration = _$t.remotePlayer.duration, _$t.listener.onSinkDurationChanged(_$t.currentDuration));
}, a2 = function a3() {
_$t.remotePlayerController.removeEventListener(cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED, _$i), _$t.remotePlayerController.removeEventListener(cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED, n3), _$t.remotePlayerController.removeEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, r2), _$t.remotePlayerController.removeEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, o2), _$t.remotePlayerController.removeEventListener(cast.framework.RemotePlayerEventType.DURATION_CHANGED, s2), _$t.listener.onSessionStop();
};
e2.addEventListener(cast.framework.SessionEventType.MEDIA_SESSION, function() {
_$t.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED, _$i), _$t.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED, n3), _$t.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, r2), _$t.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, o2), _$t.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.DURATION_CHANGED, s2), _$t.listener.onSessionStarted(e2.getCastDevice().friendlyName);
});
var u2 = e2.getSessionObj();
u2.addUpdateListener(function() {
u2.status === chrome.cast.SessionStatus.STOPPED && a2();
}), u2.addMediaListener(a2);
}, n2.handleError = function(e2) {
if (chrome.cast)
switch (e2) {
case chrome.cast.ErrorCode.SESSION_ERROR:
this.listener.onSessionError();
break;
case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:
this.listener.onRemoteDevice(false);
break;
case chrome.cast.ErrorCode.LOAD_MEDIA_FAILED:
this.listener.onLoadMediaError();
break;
case chrome.cast.ErrorCode.CANCEL:
this.listener.onUserCancel();
break;
default:
this.listener.onSinkError({
value: 1,
code: 0,
message: "Error requesting chromecast session"
});
}
else
this.listener.onSinkError({
value: 1,
code: 0,
message: "Error loading chromecast SDK"
});
}, i2;
}(Re), _e = function(e2) {
var t2 = function t3(t3) {
var i3;
return (i3 = e2.call(this) || this).video = void 0, i3.video = t3, i3;
};
De()(t2, e2);
var i2 = t2.prototype;
return i2.seekTo = function(e3) {
this.video.currentTime = e3;
}, i2.setPlaybackRate = function(e3) {
this.video.playbackRate = e3;
}, i2.setVolume = function(e3) {
this.video.volume = e3;
}, i2.getVolume = function() {
return this.video.volume;
}, i2.isMuted = function() {
return this.video.muted;
}, i2.setMuted = function(e3) {
this.video.muted = e3;
}, i2.getPlaybackRate = function() {
return this.video.playbackRate;
}, t2;
}(Re), Ie = function() {
var e2 = function e3(e3, t3) {
this.muted = void 0, this.video = void 0, this.listener = void 0, this.unsubscribes = [], this.expectingMutedChanged = false, this.expectingVolumeChanged = false, this.expectedRateChange = void 0, this.video = e3, this.listener = t3, this.muted = e3.muted, this.unsubscribes.push(b(e3, "volumechange", this.volumeChange.bind(this))), this.unsubscribes.push(b(e3, "ratechange", this.rateChange.bind(this)));
};
var t2 = e2.prototype;
return t2.volumeChange = function() {
var e3 = !this.expectingVolumeChanged;
this.expectingMutedChanged = false, this.expectingVolumeChanged = false;
var t3 = this.video.muted;
this.muted !== t3 ? (this.muted = t3, this.listener.onSinkMutedChanged(t3)) : this.listener.onSinkVolumeChanged(this.video.volume, e3);
}, t2.rateChange = function() {
this.video.playbackRate !== this.expectedRateChange && this.listener.onSinkPlaybackRateChanged(this.video.playbackRate);
}, t2.unsubscribe = function() {
this.unsubscribes.forEach(function(e3) {
return e3();
});
}, t2.onConfigure = function() {
this.expectingVolumeChanged && (this.listener.onSinkVolumeChanged(this.video.volume, false), this.expectingVolumeChanged = false), this.expectingMutedChanged && (this.muted = this.video.muted, this.listener.onSinkMutedChanged(this.video.muted), this.expectingMutedChanged = false), this.expectedRateChange = void 0;
}, t2.trackRPC = function(e3) {
var t3 = e3.name, i2 = e3.arg;
"setVolume" === t3 && this.video.volume !== i2 ? this.expectingVolumeChanged = true : "setMuted" === t3 && this.video.muted !== i2 ? this.expectingMutedChanged = true : "setPlaybackRate" === t3 && this.video.playbackRate !== i2 && (this.expectedRateChange = i2);
}, e2;
}(), Oe = require_lib(), Ne = e.n(Oe), Ve = ("undefined" != typeof self ? self : "undefined" != typeof window ? window : void 0 !== e.g ? e.g : void 0).Promise || Ne(), Ue = require_assertThisInitialized(), Be = e.n(Ue), xe = function(e2) {
var t2 = function t3(t3, i3) {
var n2;
return (n2 = e2.call(this) || this).paused = true, n2.listener = void 0, n2.video = void 0, n2.unsubscribers = void 0, n2.lastVolumeChangeEvent = void 0, n2.video = t3, n2.listener = i3, n2.paused = true, n2.unsubscribers = [], n2.addListener("volumechange", n2.recordMuteChange.bind(Be()(n2))), n2.recordMuteChange(), n2;
};
De()(t2, e2);
var i2 = t2.prototype;
return i2.pause = function() {
this.paused = true, this.video.pause();
}, i2.setPlaybackRate = function(e3) {
this.video.playbackRate = e3;
}, i2.delete = function() {
this.unsubscribers.forEach(function(e3) {
return e3();
});
}, i2.addListener = function(e3, t3, i3) {
void 0 === i3 && (i3 = this.video), this.unsubscribers.push(b(i3, e3, t3));
}, i2.recordMuteChange = function() {
this.lastVolumeChangeEvent = {
time: this.video.currentTime,
muted: this.video.muted
};
}, i2.checkStopped = function(e3) {
return !this.video.paused || this.video.ended || this.video.error || this.paused || this.listener.onSinkStop(e3 || this.unmuteAutopause()), false;
}, i2.unmuteAutopause = function() {
var _$e = this.lastVolumeChangeEvent;
return !this.video.muted && !_$e.muted && this.video.currentTime === _$e.time;
}, t2;
}(Re), He = function(e2) {
var t2 = function t3(t3, i3) {
var n2;
return (n2 = e2.call(this, t3, i3) || this).onSinkIdle = void 0, n2.intervalId = void 0, n2.idle = void 0, n2.lastPlayhead = void 0, n2.lastBufferEnd = void 0, n2.fps = void 0, n2.lastDecodedFrames = void 0, n2.lastTimeUpdate = void 0, n2.idleTimeout = void 0, n2.playAttempt = false, n2.seeking = false, n2.audioBufferList = void 0, n2.awaitingAutoplayCompletion = false, n2.intervalId = 0, n2.idle = true, n2.lastPlayhead = 0, n2.lastBufferEnd = 0, n2.fps = 0, n2.lastDecodedFrames = 0, n2.lastTimeUpdate = performance.now(), n2.idleTimeout = -1, n2.audioBufferList = [], n2.addListener("play", function() {
return n2.onVideoPlay();
}), n2.addListener("pause", function() {
return n2.onVideoPause();
}), n2.addListener("timeupdate", function() {
return n2.onVideoTimeUpdate();
}), n2.addListener("ended", function() {
return n2.onVideoEnded();
}), n2.addListener("error", function() {
return n2.onVideoError();
}), n2.addListener("playing", function() {
return n2.onVideoPlaying();
}), n2.addListener("seeking", function() {
return n2.onVideoSeeking();
}), n2;
};
De()(t2, e2);
var i2 = t2.prototype;
return i2.delete = function() {
e2.prototype.delete.call(this), this.audioBufferList = [], clearInterval(this.intervalId);
}, i2.play = function() {
this.paused = false;
for (var _$e = this.video.buffered, t3 = 0, i3 = 0; i3 < _$e.length; i3++) {
var n2 = _$e.start(i3);
if (this.video.currentTime <= n2) {
t3 = n2;
break;
}
}
this.video.currentTime < t3 && (console.warn("Moving to buffered region", t3, this.video.currentTime), this.listener.onSinkGapJump(t3 - this.video.currentTime), this.seekTo(t3)), this.playInternal();
}, i2.endOfStream = function() {
this.idle = false, clearTimeout(this.idleTimeout), this.idleTimeout = -1;
}, i2.framerate = function() {
return this.fps;
}, i2.seekTo = function(e3) {
this.video.seekable.length && e3 !== this.video.currentTime && (this.seeking = true, this.video.currentTime = e3);
}, i2.addSourceBuffer = function(e3, t3) {
(t3.indexOf("mp4a") > -1 || t3.indexOf("opus") > -1) && (this.audioBufferList = [
e3
]);
}, i2.clearSourceBuffers = function() {
this.audioBufferList = [];
}, i2.onIdle = function() {
var _$e;
this.listener.onSinkIdle(), null == (_$e = this.onSinkIdle) || _$e.call(this);
}, i2.onVideoPlay = function() {
var _$e = this;
this.playAttempt ? (this.lastPlayhead = this.video.currentTime, clearInterval(this.intervalId), this.intervalId = self.setInterval(function() {
return _$e.heartbeat();
}, v)) : (this.pause(), this.listener.play()), this.playAttempt = false;
}, i2.onVideoPause = function() {
this.awaitingAutoplayCompletion || (this.checkStopped(false), clearInterval(this.intervalId));
}, i2.onVideoTimeUpdate = function() {
clearTimeout(this.idleTimeout), this.idleTimeout = -1;
var _$e = g(this.video), t3 = performance.now();
this.fps = 1e3 * Math.max(_$e - this.lastDecodedFrames, 0) / (t3 - this.lastTimeUpdate), this.lastDecodedFrames = _$e, this.lastTimeUpdate = t3, this.listener.onSinkTimeUpdate();
var i3 = k(this.video.buffered, this.video.currentTime, l);
this.checkBufferUpdate(i3), this.updateIdle(i3);
}, i2.onVideoEnded = function() {
this.listener.onSinkEnded();
}, i2.onVideoPlaying = function() {
this.video.paused || this.listener.onSinkPlaying(this.paused);
}, i2.onVideoSeeking = function() {
this.seeking ? this.seeking = false : this.listener.seekTo(this.video.currentTime);
}, i2.onVideoError = function() {
var _$e, t3, i3 = null != (_$e = null == this || null == (t3 = this.video) ? void 0 : t3.error) ? _$e : {}, n2 = i3.code, r2 = void 0 === n2 ? -1 : n2, o2 = i3.message, s2 = void 0 === o2 ? "" : o2;
this.listener.onSinkError({
value: r2,
code: r2,
message: s2
});
}, i2.heartbeat = function() {
var _$e = k(this.video.buffered, this.video.currentTime, l);
if (this.video.paused)
clearInterval(this.intervalId);
else if (this.video.currentTime === this.lastPlayhead) {
var t3 = S(this.video.buffered, this.video.currentTime, l);
t3 !== this.video.currentTime && (this.audioBufferList.map(function(e3) {
E("Audio Buffer", e3.buffered);
}), E("<video> Buffer", this.video.buffered), console.warn("jumping " + (t3 - this.video.currentTime) + "s gap, current position " + this.video.currentTime + ", new position " + t3), this.listener.onSinkGapJump(t3 - this.video.currentTime), this.seekTo(t3)), this.updateIdle(_$e, t3 === this.video.currentTime);
} else
this.checkBufferUpdate(_$e), this.lastPlayhead = this.video.currentTime;
this.videoDisplaySizeUpdate();
}, i2.videoDisplaySizeUpdate = function() {
var _$e = this.video.clientWidth * window.devicePixelRatio, t3 = this.video.clientHeight * window.devicePixelRatio;
this.listener.onSinkVideoDisplaySizeChanged(_$e, t3);
}, i2.checkBufferUpdate = function(e3) {
var t3 = e3.end;
t3 !== this.lastBufferEnd && (this.lastBufferEnd = t3, this.listener.onSinkBufferUpdate());
}, i2.updateIdle = function(e3, t3) {
var i3 = this, n2 = e3.end, r2 = void 0 === n2 ? 0 : n2;
void 0 === t3 && (t3 = false);
var o2 = this.video, s2 = o2.buffered, a2 = o2.currentTime;
if (o2.paused)
this.idle = true;
else {
var u2 = [
r2
].concat(this.audioBufferList.map(function(e4) {
return k(e4.buffered, a2, l).end;
})), c2 = Math.max.apply(null, u2);
Number.isFinite(c2) || (c2 = 0);
var d2 = s2.length, h2 = d2 > 0 ? s2.end(d2 - 1) : r2, f2 = c2 - a2 < l || t3 && r2 > h2;
f2 && !this.idle && (console.warn("playhead", a2, "max buffer", c2, "max played", h2), clearTimeout(this.idleTimeout), this.idleTimeout = self.setTimeout(function() {
return i3.onBufferingTimeout();
}, m), this.onIdle()), this.idle = f2;
}
}, i2.onBufferingTimeout = function() {
clearTimeout(this.idleTimeout), this.idleTimeout = -1, this.listener.onSinkError({
value: o,
code: o,
message: "Buffering timeout"
});
}, i2.playInternal = function() {
var _$e = this;
this.playAttempt = true, this.awaitingAutoplayCompletion = true, Ve.resolve(this.video.play()).then(function() {
_$e.awaitingAutoplayCompletion = false;
}).catch(function() {
_$e.playAttempt = false, _$e.checkStopped(true);
});
}, t2;
}(xe), Fe = function(e2) {
var t2 = function t3(t3, i3) {
var n2;
return (n2 = e2.call(this) || this).listener = t3, n2.video = i3, n2.playbackMonitor = void 0, n2.controlsObserver = void 0, n2.playbackMonitor = new He(i3, t3), n2.observeControlsChange(), n2;
};
De()(t2, e2);
var i2 = t2.prototype;
return i2.configure = function(e3) {
var t3 = e3.srcObj;
this.video.srcObject || (this.video.srcObject = t3);
}, i2.invoke = function(e3) {
this[e3.name].call(this, e3.arg);
}, i2.play = function() {
this.playbackMonitor.play();
}, i2.pause = function() {
this.playbackMonitor.pause();
}, i2.seekTo = function(e3) {
this.playbackMonitor.seekTo(e3);
}, i2.endOfStream = function() {
this.playbackMonitor.endOfStream();
}, i2.setVolume = function(e3) {
this.video.volume !== e3 && (this.video.volume = e3);
}, i2.getVolume = function() {
return this.video.volume;
}, i2.isMuted = function() {
return this.video.muted;
}, i2.setMuted = function(e3) {
this.video.muted !== e3 && (this.video.muted = e3);
}, i2.getDisplayWidth = function() {
return this.video.clientWidth;
}, i2.getDisplayHeight = function() {
return this.video.clientHeight;
}, i2.setPlaybackRate = function(e3) {
this.playbackMonitor.setPlaybackRate(e3);
}, i2.getPlaybackRate = function() {
return this.video.playbackRate;
}, i2.getCurrentTime = function() {
return this.video.currentTime;
}, i2.buffered = function() {
return k(this.video.buffered, this.video.currentTime, l);
}, i2.bufferDuration = function() {
var _$e = this.buffered(), t3 = _$e.start;
return _$e.end - Math.max(t3, this.video.currentTime);
}, i2.decodedFrames = function() {
return g(this.video);
}, i2.droppedFrames = function() {
return y(this.video);
}, i2.framerate = function() {
return this.playbackMonitor.framerate();
}, i2.captureGesture = function() {
this.playbackMonitor.play(), this.playbackMonitor.pause();
}, i2.changeSrcObj = function(e3) {
var t3 = this.video, i3 = t3.playbackRate;
t3.srcObject = e3, t3.playbackRate = i3;
}, i2.delete = function() {
var _$e;
this.playbackMonitor.delete(), this.video.srcObject = null, T(this.video), null == (_$e = this.controlsObserver) || _$e.disconnect();
}, i2.observeControlsChange = function() {
var _$e = this.listener, t3 = this.video;
try {
(this.controlsObserver = new MutationObserver(function() {
_$e.onSinkControlsChanged(t3.controls);
})).observe(t3, {
attributeFilter: [
"controls"
]
}), _$e.onSinkControlsChanged(t3.controls);
} catch (e3) {
}
}, t2;
}(Re), Ge = require_extends(), je = e.n(Ge), We = function() {
var e2 = function e3(e3, t3, i2) {
this.listener = e3, this.video = t3, this.adjustments = i2, this.playbackMonitor = void 0, this.controlsObserver = void 0, this.mseSink = void 0, this.awaitSink = void 0, this.playbackMonitor = new He(t3, e3), this.observeControlsChange(), this.awaitSink = void 0, b(t3, "error", this.onVideoError.bind(this));
};
var t2 = e2.prototype;
return t2.invoke = function(e3) {
var t3 = this.awaitSink, i2 = this.mseSink;
t3 && i2 ? [
"enqueue",
"addTrack",
"setTimestampOffset"
].includes(e3.name) ? this.invokeAsync(e3) : this.invokeSync(e3) : t3 ? this.invokeAsync(e3) : i2 && this.invokeSync(e3);
}, t2.configure = function(e3) {
var t3 = this, i2 = this.awaitSink, n2 = this.mseSink, r2 = e3.trackID, o2 = e3.codec, s2 = e3.group, a2 = e3.isProtected;
if (!n2 && !i2) {
var u2 = A.create(this.onMediaSourceEnded.bind(this), this.onMediaSourceError.bind(this));
this.awaitSink = new Ve(function(e4, i3) {
u2.sink.then(function(i4) {
t3.handleCreateSuccess(i4), e4();
}).catch(function(e5) {
t3.handleCreateError(e5), i3();
});
}), this.changeSrc(URL.createObjectURL(u2.ms));
}
if (this.isContentProtectionChanging(a2) && this.queueNewSink(), this.isNewSinkNeeded(e3)) {
this.queueNewSink();
var c2 = this.getTrack(p.audio);
c2 && this.invoke({
name: "addTrack",
arg: c2
});
}
this.invoke({
name: "addTrack",
arg: je()({}, Ke, {
trackID: r2,
codec: o2,
group: s2,
isProtected: a2
})
});
}, t2.queueNewSink = function() {
var e3 = this;
this.awaitSink = new Ve(function(t3, i2) {
e3.deferUntilIdle().then(function() {
var t4 = A.create(e3.onMediaSourceEnded.bind(e3), e3.onMediaSourceError.bind(e3));
return e3.changeSrc(URL.createObjectURL(t4.ms)), t4.sink;
}).then(function(i3) {
e3.destroyMSESink(), e3.handleCreateSuccess(i3), e3.play(), t3();
}).catch(function(t4) {
e3.handleCreateError(t4), i2();
});
});
}, t2.addTrack = function(e3) {
var t3 = e3.trackID, i2 = e3.codec, n2 = e3.group, r2 = e3.isProtected, o2 = this.mseSink;
try {
var s2 = null == o2 ? void 0 : o2.addTrack(t3, i2, n2, r2);
s2 && this.playbackMonitor.addSourceBuffer(s2, i2);
} catch (e1) {
this.handleCreateError(e1);
}
}, t2.enqueue = function(e3) {
var t3, i2 = e3.trackID, n2 = e3.buffer;
null == (t3 = this.mseSink) || t3.append(i2, n2);
}, t2.endOfStream = function() {
var e3, t3 = this;
null == (e3 = this.mseSink) || e3.scheduleUpdate().then(function() {
return t3.playbackMonitor.endOfStream();
});
}, t2.setTimestampOffset = function(e3) {
var t3, i2 = e3.trackID, n2 = e3.offset;
null == (t3 = this.mseSink) || t3.setTimestampOffset(i2, n2);
}, t2.onSegmentDiscontinuity = function() {
var e3 = this.adjustments, t3 = this.awaitSink, i2 = this.mseSink;
e3.rebuildMediaSinkOnDiscontinuity && i2 && !t3 && this.queueNewSink();
}, t2.onSourceDurationChanged = function(e3) {
var t3 = this.mseSink, i2 = this.video;
if (t3) {
var n2 = t3.duration, r2 = function(e4, t4, i3) {
var n3 = e4;
return e4 === 1 / 0 || e4 === f ? i3 ? n3 = 1 / 0 : i3 || (n3 = f) : e4 !== t4 && (n3 = e4), n3;
}(e3, n2, i2.controls);
r2 !== n2 && t3.setDuration(r2);
}
}, t2.play = function() {
var e3, t3 = this;
null == (e3 = this.mseSink) || e3.scheduleUpdate().then(function() {
return t3.playbackMonitor.play();
});
}, t2.pause = function() {
var e3, t3 = this;
null == (e3 = this.mseSink) || e3.scheduleUpdate().then(function() {
return t3.playbackMonitor.pause();
});
}, t2.remove = function(e3) {
var t3, i2 = e3.start, n2 = e3.end;
null == (t3 = this.mseSink) || t3.remove(i2, n2);
}, t2.seekTo = function(e3) {
var t3 = this.mseSink, i2 = this.playbackMonitor, n2 = this.video, r2 = k(n2.buffered, n2.currentTime, l), o2 = r2.start, s2 = r2.end;
e3 >= o2 && e3 < s2 ? null == t3 || t3.scheduleUpdate().then(function() {
return i2.seekTo(e3);
}) : i2.seekTo(e3);
}, t2.setVolume = function(e3) {
this.video.volume !== e3 && (this.video.volume = e3);
}, t2.getVolume = function() {
return this.video.volume;
}, t2.isMuted = function() {
return this.video.muted;
}, t2.setMuted = function(e3) {
this.video.muted !== e3 && (this.video.muted = e3);
}, t2.getDisplayWidth = function() {
return this.video.clientWidth;
}, t2.getDisplayHeight = function() {
return this.video.clientHeight;
}, t2.setPlaybackRate = function(e3) {
this.playbackMonitor.setPlaybackRate(e3);
}, t2.getPlaybackRate = function() {
return this.video.playbackRate;
}, t2.getCurrentTime = function() {
return this.video.currentTime;
}, t2.buffered = function() {
return k(this.video.buffered, this.video.currentTime, l);
}, t2.getBufferedRanges = function(e3) {
var t3, i2;
return null != (t3 = null == (i2 = this.mseSink) ? void 0 : i2.getBufferedRanges(e3)) ? t3 : [];
}, t2.bufferDuration = function() {
var e3 = this.buffered(), t3 = e3.start;
return e3.end - Math.max(t3, this.video.currentTime);
}, t2.decodedFrames = function() {
return g(this.video);
}, t2.droppedFrames = function() {
return y(this.video);
}, t2.framerate = function() {
return this.playbackMonitor.framerate();
}, t2.captureGesture = function() {
this.playbackMonitor.play(), this.playbackMonitor.pause();
}, t2.changeSrc = function(e3) {
!function(e4, t3) {
var i2 = e4.playbackRate, n2 = e4.src;
n2 && URL.revokeObjectURL(n2), e4.src = t3, e4.playbackRate = i2;
}(this.video, e3);
}, t2.changeSrcObj = function(e3) {
}, t2.delete = function() {
var e3;
this.playbackMonitor.delete(), null == (e3 = this.controlsObserver) || e3.disconnect(), this.destroyMSESink(), T(this.video);
}, t2.invokeSync = function(e3) {
this[e3.name].call(this, e3.arg);
}, t2.invokeAsync = function(e3) {
var t3 = this;
this.awaitSink.then(function() {
return t3.invokeSync(e3);
}).catch(function() {
});
}, t2.onMediaSourceEnded = function() {
this.video.load(), this.listener.onSinkReset();
}, t2.destroyMSESink = function() {
var e3 = this, t3 = function t4() {
e3.mseSink && e3.mseSink.destroy(), e3.awaitSink = void 0, e3.mseSink = void 0;
};
this.mseSink ? t3() : this.awaitSink && this.awaitSink.then(function() {
return t3();
}), this.playbackMonitor && this.playbackMonitor.clearSourceBuffers();
}, t2.isContentProtectionChanging = function(e3) {
var t3 = this.awaitSink, i2 = this.mseSink;
if (!i2 || t3)
return false;
var n2 = i2.bufferProperties;
return !!n2.length && n2.some(function(t4) {
return t4.isProtected !== e3;
});
}, t2.isSinkVideoCodecChangeRequired = function(e3, t3) {
return !!this.adjustments.rebuildMediaSinkOnCodecChange && e3 !== t3;
}, t2.isSinkVideoSourceQualityChangeRequired = function(e3, t3) {
return !!this.adjustments.rebuildMediaSinkOnSourceQualityChange && "chunked" === e3 != ("chunked" === t3);
}, t2.isNewSinkNeeded = function(e3) {
var t3 = this.adjustments, i2 = this.mseSink, n2 = this.awaitSink;
if (e3.trackID !== p.video)
return false;
if (!t3.rebuildMediaSinkOnCodecChange && !t3.rebuildMediaSinkOnSourceQualityChange)
return false;
if (!i2 || n2)
return false;
var r2 = this.getTrack(p.video), o2 = this.getTrack(p.audio);
return !(!r2 || !o2) && (this.isSinkVideoCodecChangeRequired(r2.codec, e3.codec) || this.isSinkVideoSourceQualityChangeRequired(r2.group, e3.group));
}, t2.getTrack = function(e3) {
var t3, i2 = this.mseSink;
return null != (t3 = null == i2 ? void 0 : i2.bufferProperties.find(function(t4) {
return t4.trackID === e3;
})) ? t3 : null;
}, t2.deferUntilIdle = function() {
var e3 = this, t3 = this.mseSink, i2 = this.playbackMonitor;
return new Ve(function(n2) {
t3 && !e3.video.paused ? i2.onSinkIdle = function() {
i2.onSinkIdle = void 0, n2();
} : n2();
});
}, t2.handleCreateSuccess = function(e3) {
this.mseSink = e3, this.awaitSink = void 0, this.onSourceDurationChanged(f), this.mseSink.setLiveSeekableRange(0, f);
}, t2.handleCreateError = function(e3) {
this.listener.onSinkError({
value: 4,
code: 4,
message: e3.toString()
});
}, t2.onMediaSourceError = function(e3, t3, i2, n2) {
var r2 = {
value: e3,
code: t3,
message: i2
};
n2 ? this.listener.onSinkError(r2) : this.listener.onSinkRecoverableError(r2);
}, t2.onVideoError = function() {
this.destroyMSESink();
}, t2.observeControlsChange = function() {
var e3 = this, t3 = this.video;
try {
(this.controlsObserver = new MutationObserver(function() {
e3.invoke({
name: "onSourceDurationChanged",
arg: t3.duration
});
})).observe(t3, {
attributeFilter: [
"controls"
]
});
} catch (e1) {
}
}, e2;
}(), Ke = {
trackID: 0,
codec: "",
mode: "mse",
isProtected: false,
path: "",
group: "",
srcObj: null
}, qe = function(e2) {
var t2 = function t3(t3, i3) {
var n2;
(n2 = e2.call(this, i3, t3) || this).fps = void 0, n2.intervalId = void 0, n2.bufferingTimeoutId = void 0, n2.attemptingToPlay = void 0, n2.hasPlayedSrc = void 0, n2.hasReloadedOnDecodeError = void 0, n2.unsubscribersForTrackEvents = void 0, n2.fps = 0, n2.intervalId = -1, n2.bufferingTimeoutId = -1, n2.attemptingToPlay = false, n2.hasPlayedSrc = false, n2.hasReloadedOnDecodeError = false, n2.unsubscribersForTrackEvents = [], n2.addListener("waiting", function() {
return n2.onVideoWaiting();
}, n2.video), n2.addListener("timeupdate", function() {
return n2.onVideoTimeUpdate();
}, n2.video), n2.addListener("durationchange", function() {
return n2.onVideoDurationChange();
}, n2.video), n2.addListener("error", function() {
return n2.onVideoError();
}, n2.video), n2.addListener("play", function() {
return n2.onVideoPlay();
}, n2.video), n2.addListener("pause", function() {
return n2.onVideoPause();
}, n2.video), n2.addListener("ended", function() {
return n2.onVideoEnded();
}, n2.video), n2.addListener("playing", function() {
return n2.onVideoPlaying();
}, n2.video);
var r2 = c(document).visibilityChange;
return n2.addListener(r2, function() {
return n2.onVisibilityChange();
}, document), n2;
};
De()(t2, e2);
var i2 = t2.prototype;
return i2.invoke = function(e3) {
this[e3.name].call(this, e3.arg);
}, i2.configure = function(e3) {
var t3 = e3.path;
this.handleTrackEvents(), this.hasReloadedOnDecodeError = false, this.hasPlayedSrc = false, this.video.src = t3;
}, i2.play = function() {
var _$e = this, t3 = this.video.buffered;
if (t3.length > 0) {
var i3 = t3.start(t3.length - 1), n2 = t3.end(t3.length - 1);
this.video.duration === 1 / 0 && (n2 < this.video.currentTime || this.video.currentTime < i3) && (this.listener.onSinkGapJump(i3 - this.video.currentTime), console.warn("Moving to buffered region"), this.video.currentTime = i3);
}
this.paused = false, this.attemptingToPlay = true, Promise.resolve(this.video.play()).then(function() {
_$e.attemptingToPlay = false, _$e.hasPlayedSrc = true;
}).catch(function() {
_$e.attemptingToPlay = false, _$e.checkStopped(true);
});
}, i2.pause = function() {
e2.prototype.pause.call(this), clearTimeout(this.intervalId);
}, i2.seekTo = function(e3) {
this.video.currentTime = e3;
}, i2.setVolume = function(e3) {
this.video.volume = e3;
}, i2.getVolume = function() {
return this.video.volume;
}, i2.buffered = function() {
return k(this.video.buffered, this.video.currentTime, l);
}, i2.decodedFrames = function() {
return g(this.video);
}, i2.droppedFrames = function() {
return y(this.video);
}, i2.framerate = function() {
return this.fps;
}, i2.delete = function() {
e2.prototype.delete.call(this), this.removeTrackListeners(), this.video.src = "", this.video.load();
}, i2.isMuted = function() {
return this.video.muted;
}, i2.setMuted = function(e3) {
this.video.muted = e3;
}, i2.getDisplayWidth = function() {
return this.video.clientWidth;
}, i2.getDisplayHeight = function() {
return this.video.clientHeight;
}, i2.getPlaybackRate = function() {
return this.video.playbackRate;
}, i2.getCurrentTime = function() {
return this.video.currentTime;
}, i2.bufferDuration = function() {
var _$e = this.buffered(), t3 = _$e.start;
return _$e.end - Math.max(t3, this.video.currentTime);
}, i2.captureGesture = function() {
Promise.resolve(this.video.play()).catch(function() {
}), this.video.pause();
}, i2.addTrackListener = function(e3, t3, i3) {
this.unsubscribersForTrackEvents.push(b(i3, e3, t3));
}, i2.removeTrackListeners = function() {
this.unsubscribersForTrackEvents.forEach(function(e3) {
return e3();
});
}, i2.checkTracksStatus = function() {
for (var _$e = this.video.textTracks, t3 = 0; t3 < _$e.length; t3++) {
var i3 = _$e[t3];
"metadata" === i3.kind && "disabled" === i3.mode && (i3.mode = "hidden");
}
}, i2.handleCueChange = function(e3) {
var t3 = this, i3 = /* @__PURE__ */ new Set();
this.addTrackListener("cuechange", function() {
var n2, r2 = null != (n2 = e3.activeCues) ? n2 : [];
if (r2.length > 0) {
for (var o2 = /* @__PURE__ */ new Set(), s2 = 0; s2 < r2.length; ++s2) {
var a2 = r2[s2];
if (!i3.has(a2)) {
var u2 = a2.type, c2 = a2.value;
if ("org.id3" === u2 && c2 && ("TXXX" === c2.key && "segmentmetadata" !== c2.info || "PRIV" === c2.key && c2.info === F.METADATA_ID || "PRIV" === c2.key && c2.info === F.INBAND_METADATA_ID)) {
var d2 = "PRIV" === c2.key ? new TextDecoder("utf-8").decode(c2.data) : c2.data || "", h2 = c2.info || "";
t3.listener.onPassthroughSinkMetadata(a2.startTime, a2.endTime, d2, h2, h2);
}
}
o2.add(a2);
}
i3 = o2;
}
}, e3);
}, i2.handleTrackEvents = function() {
var _$e = this;
this.removeTrackListeners(), void 0 === window.DataCue && void 0 === window.WebKitDataCue || (this.addTrackListener("change", function() {
_$e.checkTracksStatus();
}, this.video.textTracks), this.addTrackListener("addtrack", function(t3) {
var i3 = t3.track;
"metadata" === i3.kind && "disabled" === i3.mode && (i3.mode = "hidden", _$e.handleCueChange(i3));
}, this.video.textTracks));
}, i2.onVideoWaiting = function() {
var _$e = this;
if (k(this.video.buffered, this.video.currentTime, l).end - this.video.currentTime < l) {
this.listener.onSinkIdle(), clearTimeout(this.bufferingTimeoutId), this.bufferingTimeoutId = self.setTimeout(function() {
_$e.listener.onSinkError({
value: o,
code: o,
message: "Buffering timeout"
});
}, m);
var t3 = b(this.video, "timeupdate", function() {
t3(), clearTimeout(_$e.bufferingTimeoutId);
});
}
var i3 = b(this.video, "timeupdate", function() {
4 === _$e.video.readyState && (i3(), _$e.onVideoPlaying());
});
}, i2.onVideoTimeUpdate = function() {
var _$e = this.listener, t3 = this.video;
_$e.onSinkTimeUpdate(), _$e.onSinkVideoDisplaySizeChanged(t3.clientWidth * self.devicePixelRatio, t3.clientHeight * self.devicePixelRatio);
}, i2.onVideoDurationChange = function() {
this.listener.onSinkDurationChanged(this.video.duration);
}, i2.onVideoError = function() {
var _$e = this.video.error, t3 = _$e.code, i3 = _$e.message, n2 = void 0 === i3 ? "" : i3, r2 = -1 !== this.video.src.indexOf(".m3u8");
if (4 === t3 && !this.hasPlayedSrc && r2)
return clearTimeout(this.bufferingTimeoutId), void this.listener.onSinkError({
value: 404,
code: 404,
message: n2
});
3 !== t3 || this.hasReloadedOnDecodeError ? this.listener.onSinkError({
value: t3,
code: t3,
message: n2
}) : this.hasReloadedOnDecodeError || (this.hasReloadedOnDecodeError = true, console.warn("Reload video element on MEDIA_ERR_DECODE 3"), this.video.load());
}, i2.onVideoPlay = function() {
var _$e = this, t3 = this.video.currentTime;
clearTimeout(this.intervalId), this.intervalId = self.setTimeout(function() {
return _$e.heartbeat(t3);
}, v);
}, i2.onVideoPause = function() {
clearTimeout(this.intervalId), this.attemptingToPlay || this.checkStopped(false);
}, i2.onVideoEnded = function() {
this.listener.onSinkEnded();
}, i2.onVideoPlaying = function() {
this.listener.onSinkPlaying(this.paused), this.trackFPS(g(this.video), performance.now()), this.trackBufferUpdate(k(this.video.buffered, this.video.currentTime, l).end);
}, i2.onVisibilityChange = function() {
var _$e = c(document).hidden;
document[_$e] && (this.hasReloadedOnDecodeError = false);
}, i2.heartbeat = function(e3) {
var t3, i3, n2, r2 = this, o2 = this.video.currentTime;
if (o2 === e3) {
if (t3 = this.video, l, n2 = k(t3.buffered, t3.currentTime, 0.1).end - (i3 = t3.currentTime), !(t3.ended || t3.duration - i3 < 0.1) && n2 < 0.1)
return void this.listener.onSinkIdle();
var s2 = S(this.video.buffered, o2, l);
s2 !== o2 && (console.warn("jumping " + (s2 - o2) + "s gap"), this.listener.onSinkGapJump(s2 - this.video.currentTime), this.video.currentTime = s2, o2 = this.video.currentTime);
}
this.intervalId = self.setTimeout(function() {
return r2.heartbeat(o2);
}, v);
}, i2.trackFPS = function(e3, t3) {
var i3 = this, n2 = g(this.video), r2 = performance.now();
this.fps = (n2 - e3) / (r2 - t3) * 1e3;
var o2 = b(this.video, "timeupdate", function() {
o2(), i3.trackFPS(n2, r2);
});
}, i2.trackBufferUpdate = function(e3) {
var t3 = this, i3 = this.buffered().end;
i3 !== e3 && this.listener.onSinkBufferUpdate();
var n2 = b(this.video, "timeupdate", function() {
n2(), t3.trackBufferUpdate(i3);
});
}, t2;
}(xe), Qe = function() {
var e2 = function e3(e3, t3, i2, n2) {
this.listener = e3, this.adjustments = i2, this.video = void 0, this.drmManager = void 0, this.codecs = void 0, this.sink = void 0, this.observer = void 0, this.remoteDevicesListener = void 0, this.video = n2 || document.createElement("video"), this.listener = e3, this.drmManager = new Ae({
video: this.video,
listener: e3
}), this.codecs = /* @__PURE__ */ Object.create(null), this.sink = new _e(this.video), t3 && (this.remoteDevicesListener = we.lookForRemotePlaybackDevices(this.listener)), this.observer = new Ie(this.video, e3);
};
var t2 = e2.prototype;
return t2.delete = function() {
var e3;
this.reset(), null == (e3 = this.remoteDevicesListener) || e3.then(function(e4) {
e4 && we.stopLookingForRemotePlaybackDevices(e4);
});
}, t2.configure = function(e3) {
var t3 = e3.mode, i2 = e3.codec, n2 = e3.trackID;
_instanceof(this.sink, _e) && (this.sink = "chromecast" === t3 ? new we(this.listener) : "passthrough" === t3 ? new qe(this.listener, this.video) : "mse-worker" === t3 ? new Fe(this.listener, this.video) : new We(this.listener, this.video, this.adjustments)), i2 ? this.codecs[n2] = i2 : e3.codec = this.codecs[n2], this.sink.configure(e3);
var r2 = e3.path, o2 = e3.isProtected;
r2 && o2 && this.drmManager.configure(r2), this.observer.onConfigure();
}, t2.applyRPC = function(e3) {
this.observer.trackRPC(e3), this.sink.invoke(e3);
}, t2.getCurrentSink = function() {
return this.sink;
}, t2.reset = function() {
this.sink.delete(), this.drmManager.reset(), this.sink = new _e(this.video), this.listener.onSinkTimeUpdate(), this.listener.onSinkBufferUpdate();
}, t2.videoElement = function() {
return this.video;
}, t2.isProtected = function() {
return this.drmManager.isProtected();
}, t2.captureGesture = function() {
this.video.played.length || this.sink.captureGesture();
}, t2.destroy = function() {
this.observer.unsubscribe(), this.delete();
}, t2.isLowLatencyCapable = function() {
return _instanceof(this.sink, We);
}, t2.onSegmentDiscontinuity = function() {
this.sink.onSegmentDiscontinuity();
}, e2;
}(), Ye = require_events(), ze = function() {
var e2 = function e3() {
this.emitter = void 0, this.emitter = new Ye.EventEmitter();
};
var t2 = e2.prototype;
return t2.on = function(e3, t3) {
this.emitter.on(String(e3), t3);
}, t2.removeListener = function(e3, t3) {
this.emitter.removeListener(String(e3), t3);
}, t2.emit = function(e3) {
for (var t3, i2 = arguments.length, n2 = new Array(i2 > 1 ? i2 - 1 : 0), r2 = 1; r2 < i2; r2++)
n2[r2 - 1] = arguments[r2];
(t3 = this.emitter).emit.apply(t3, [
String(e3)
].concat(n2));
}, t2.removeAllListeners = function() {
this.emitter.removeAllListeners();
}, e2;
}();
!function(e2) {
e2[e2.STATE_CHANGED = 0] = "STATE_CHANGED", e2[e2.CONFIGURE = 1] = "CONFIGURE", e2[e2.RESET = 2] = "RESET", e2[e2.ADD_CUE = 3] = "ADD_CUE", e2[e2.GET_DECODE_INFO = 4] = "GET_DECODE_INFO", e2[e2.MEDIA_SINK_RPC = 5] = "MEDIA_SINK_RPC", e2[e2.GET_EXPERIMENTS = 6] = "GET_EXPERIMENTS", e2[e2.LOG_MESSAGE = 7] = "LOG_MESSAGE", e2[e2.DATA_CHANNEL_CREATE = 8] = "DATA_CHANNEL_CREATE", e2[e2.DATA_CHANNEL_CLOSE = 9] = "DATA_CHANNEL_CLOSE", e2[e2.DATA_CHANNEL_SEND = 10] = "DATA_CHANNEL_SEND", e2[e2.RTC_SET_REMOTE_DESCRIPTION = 11] = "RTC_SET_REMOTE_DESCRIPTION", e2[e2.PROPERTY_CHANGED = 12] = "PROPERTY_CHANGED", e2[e2.BUFFERED_RANGES = 13] = "BUFFERED_RANGES", e2[e2.DESTROY = 14] = "DESTROY";
}(Ce || (Ce = {}));
var Xe = {
rebuildMediaSinkOnCodecChange: false,
rebuildMediaSinkOnSourceQualityChange: false,
rebuildMediaSinkOnDiscontinuity: false
}, Je = function() {
function e2(t3, i2) {
var n2, r2 = this;
this.worker = void 0, this.id = void 0, this.emitter = void 0, this.seekTime = void 0, this.paused = void 0, this.isLoaded = void 0, this.autoPlayOptions = void 0, this.mediaSinkManager = void 0, this.experiments = void 0, this.adjustments = void 0, this.enableRemoteSearch = void 0, this.isQualitySupported = void 0, this.onvisibilitychange = void 0, this.onmessage = void 0, this.onOnline = void 0, this.onOffline = void 0, this.pauseHiddenSilentTab = void 0, this.state = void 0, this.workerMessageProcessors = void 0, this.startCapture = void 0, this.stopCapture = void 0, this.requestCaptureAnalytics = void 0, this.worker = i2, this.id = e2.instanceId++, this.emitter = new ze(), this.seekTime = null, this.paused = true, this.isLoaded = false, this.autoPlayOptions = null, this.isQualitySupported = t3.isQualitySupported || u, this.onvisibilitychange = function() {
return r2.onVisibilityChange();
}, this.onmessage = function(e3) {
return r2.onWorkerMessage(e3);
}, this.onOnline = function() {
return r2.postMessage("onOnline");
}, this.onOffline = function() {
return r2.postMessage("onOffline");
}, this.enableRemoteSearch = t3.enableRemoteSearch || false;
var o2, s2 = I();
if (this.pauseHiddenSilentTab = s2.chrome && 63 === s2.major || s2.opera, this.adjustments = (o2 = null != (n2 = t3.adjustments) ? n2 : {}, je()({}, Xe, o2)), this.mediaSinkManager = new Qe(this, this.enableRemoteSearch, this.adjustments), this.experiments = {}, this.workerMessageProcessors = [
V
], U.isSupported()) {
var a2 = new U();
this.workerMessageProcessors.push(a2.processor);
}
this.state = {
averageBitrate: 0,
bandwidthEstimate: 0,
looping: false,
autoQualityMode: true,
volume: 1,
liveLatency: 0,
liveLowLatencyEnabled: true,
liveLowLatency: false,
statistics: {}
}, this.resetState(), this.attachHandlers(), this.postMessage("create", [
{
mseSupported: B(),
keySystem: void 0 !== t3.keySystem ? t3.keySystem : oe(s2),
browserContext: s2,
codecs: e2.isVP9Supported() ? [
"vp09"
] : [],
testOnly: t3.testOnly,
playerFramework: t3.playerFramework,
buildDistId: "npm"
}
]);
}
e2.isVP9Supported = function() {
return B() && MediaSource.isTypeSupported('video/mp4;codecs="vp09.00.10.08"');
};
var t2 = e2.prototype;
return t2.delete = function() {
var _$e = this, t3 = c(document).visibilityChange;
document.removeEventListener(t3, this.onvisibilitychange), window.removeEventListener("online", this.onOnline), window.removeEventListener("offline", this.onOffline), this.emitter.removeAllListeners(), this.emitter.on(Ce.DESTROY, function() {
_$e.mediaSinkManager.destroy(), _$e.emitter.removeAllListeners(), _$e.worker.removeEventListener("message", _$e.onmessage);
}), this.postMessage("delete");
}, t2.attachHTMLVideoElement = function(e3) {
this.mediaSinkManager && this.mediaSinkManager.destroy(), this.mediaSinkManager = new Qe(this, this.enableRemoteSearch, this.adjustments, e3), this.processVideoElementAttributes(e3);
}, t2.getHTMLVideoElement = function() {
return this.mediaSinkManager.videoElement();
}, t2.load = function(e3, t3) {
void 0 === t3 && (t3 = ""), this.postMessage("load", [
e3,
t3
]), this.autoPlayOptions && this.postMessage("playIntent");
}, t2.play = function() {
this.postMessage("playIntent"), this.mediaSinkManager.captureGesture(), this.paused = false, this.attemptPlay();
}, t2.setAutoplay = function(e3) {
this.autoPlayOptions = e3 ? {
attemptMutedRetry: true
} : null;
}, t2.setAutoPlayOptions = function(e3) {
this.autoPlayOptions = e3;
}, t2.getExperiments = function() {
return this.experiments;
}, t2.setExperiment = function(e3, t3) {
this.setExperimentData({
id: e3,
assignment: t3,
version: 0,
type: ""
});
}, t2.setExperimentData = function(e3) {
this.postMessage("setExperiment", [
e3
]);
}, t2.pause = function() {
this.paused = true, this.postMessage("pause");
}, t2.isPaused = function() {
return this.paused;
}, t2.seekTo = function(e3) {
this.seekTime = e3, this.postMessage("seekTo", [
e3
]);
}, t2.isSeeking = function() {
return null !== this.seekTime;
}, t2.isAutoplay = function() {
return !!this.autoPlayOptions;
}, t2.getDuration = function() {
return this.state.duration;
}, t2.getStartOffset = function() {
return this.state.startOffset || 0;
}, t2.getPosition = function() {
return null === this.seekTime ? this.mediaSinkManager.getCurrentSink().getCurrentTime() : this.seekTime;
}, t2.getBuffered = function() {
return this.mediaSinkManager.getCurrentSink().buffered();
}, t2.getBufferedRanges = function() {
return this.postMessage("updateBufferedRanges", []), this.state.trackBufferedRanges;
}, t2.getSinkBufferedRanges = function() {
var _$e = this.mediaSinkManager.getCurrentSink();
return {
audio: _$e.getBufferedRanges("audio"),
video: _$e.getBufferedRanges("video")
};
}, t2.getBufferDuration = function() {
return this.state.bufferedPosition - this.getPosition();
}, t2.getState = function() {
return this.state.state;
}, t2.getVideoWidth = function() {
return this.mediaSinkManager.videoElement().videoWidth;
}, t2.getVideoHeight = function() {
return this.mediaSinkManager.videoElement().videoHeight;
}, t2.getVideoFrameRate = function() {
return this.state.statistics.framerate;
}, t2.getVideoBitRate = function() {
return this.state.statistics.bitrate;
}, t2.getAverageBitrate = function() {
return this.state.averageBitrate;
}, t2.getBandwidthEstimate = function() {
return this.state.bandwidthEstimate;
}, t2.getPath = function() {
return this.state.path;
}, t2.getProtocol = function() {
return this.state.protocol;
}, t2.getVersion = function() {
return "1.13.0";
}, t2.isLiveLowLatency = function() {
return this.state.liveLowLatencyEnabled && this.state.liveLowLatency;
}, t2.isLooping = function() {
return this.state.looping;
}, t2.setLogLevel = function(e3) {
this.postMessage("setLogLevel", [
e3
]);
}, t2.setLooping = function(e3) {
this.state.looping = e3, this.postMessage("setLooping", [
e3
]);
}, t2.isMuted = function() {
return this.mediaSinkManager.getCurrentSink().isMuted();
}, t2.setMuted = function(e3) {
this.mediaSinkManager.getCurrentSink().setMuted(e3);
}, t2.setVolume = function(e3) {
this.state.volume = e3, this.postMessage("setVolume", [
this.state.volume
]);
}, t2.getVolume = function() {
return this.state.volume;
}, t2.getQuality = function() {
return this.state.quality;
}, t2.setQuality = function(e3, t3) {
void 0 === t3 && (t3 = false), this.mediaSinkManager.videoElement().controls || (this.postMessage("setQuality", [
e3,
t3
]), this.state.autoQualityMode = false);
}, t2.getQualities = function() {
return this.state.qualities;
}, t2.setAuthToken = function(e3) {
this.postMessage("setAuthToken", [
e3
]);
}, t2.isAutoQualityMode = function() {
return this.state.autoQualityMode;
}, t2.setAutoQualityMode = function(e3) {
this.state.autoQualityMode = e3, this.postMessage("setAutoQualityMode", [
e3
]);
}, t2.setAutoInitialBitrate = function(e3) {
this.postMessage("setAutoInitialBitrate", [
e3
]);
}, t2.setAutoMaxQuality = function(e3) {
this.postMessage("setAutoMaxQuality", [
e3
]);
}, t2.setAutoMaxBitrate = function(e3) {
this.postMessage("setAutoMaxBitrate", [
e3
]);
}, t2.setAutoMaxVideoSize = function(e3, t3) {
this.postMessage("setAutoMaxVideoSize", [
e3,
t3
]);
}, t2.setAutoViewportSize = function(e3, t3) {
this.postMessage("setAutoViewportSize", [
e3,
t3
]);
}, t2.getPlaybackRate = function() {
return this.mediaSinkManager.getCurrentSink().getPlaybackRate();
}, t2.setPlaybackRate = function(e3) {
return this.mediaSinkManager.getCurrentSink().setPlaybackRate(e3);
}, t2.setClientId = function(e3) {
this.postMessage("setClientId", [
e3
]);
}, t2.setDeviceId = function(e3) {
this.postMessage("setDeviceId", [
e3
]);
}, t2.setLiveSpeedUpRate = function(e3) {
this.postMessage("setLiveSpeedUpRate", [
e3
]);
}, t2.setPlayerType = function(e3) {
this.postMessage("setPlayerType", [
e3
]);
}, t2.setLiveMaxLatency = function(e3) {
this.postMessage("setLiveMaxLatency", [
e3
]);
}, t2.setLiveLowLatencyEnabled = function(e3) {
this.state.liveLowLatencyEnabled = e3, this.postMessage("setLiveLowLatencyEnabled", [
e3
]);
}, t2.setRebufferToLive = function(e3) {
this.postMessage("setRebufferToLive", [
e3
]);
}, t2.setVisible = function(e3) {
this.postMessage("setVisible", [
e3
]);
}, t2.setInitialBufferDuration = function(e3) {
this.postMessage("setInitialBufferDuration", [
e3
]);
}, t2.addEventListener = function(e3, t3) {
this.emitter.on(e3, t3);
}, t2.removeEventListener = function(e3, t3) {
this.emitter.removeListener(e3, t3);
}, t2.getDroppedFrames = function() {
return this.state.statistics.droppedFrames;
}, t2.getDecodedFrames = function() {
return this.state.statistics.decodedFrames;
}, t2.getDisplayWidth = function() {
return this.mediaSinkManager.getCurrentSink().getDisplayWidth();
}, t2.getDisplayHeight = function() {
return this.mediaSinkManager.getCurrentSink().getDisplayHeight();
}, t2.getSessionId = function() {
return this.state.sessionId;
}, t2.getSessionData = function() {
return this.state.sessionData;
}, t2.getLiveLatency = function() {
return this.state.liveLatency;
}, t2.isProtected = function() {
return this.mediaSinkManager.isProtected();
}, t2.startRemotePlayback = function() {
this.postMessage("startRemotePlayback");
}, t2.endRemotePlayback = function() {
this.postMessage("endRemotePlayback");
}, t2.setPlatformName = function(e3) {
this.postMessage("setPlatformName", [
e3
]);
}, t2.setRequestCredentials = function(e3) {
this.postMessage("setRequestCredentials", [
e3
]);
}, t2.setSinkType = function(e3) {
this.postMessage("setSinkType", [
e3
]);
}, t2.onSinkTimeUpdate = function() {
var _$e = this.mediaSinkManager.getCurrentSink();
null === this.seekTime && (this.postMessage("onClientSinkUpdate", [
{
currentTime: _$e.getCurrentTime(),
decodedFrames: _$e.decodedFrames(),
droppedFrames: _$e.droppedFrames(),
framerate: _$e.framerate(),
bufferDuration: _$e.bufferDuration(),
displayHeight: _$e.getDisplayHeight(),
displayWidth: _$e.getDisplayWidth()
}
]), this.emitter.emit(C.TIME_UPDATE, _$e.getCurrentTime()));
}, t2.onSinkBufferUpdate = function() {
this.emitter.emit(C.BUFFER_UPDATE);
}, t2.onSinkDurationChanged = function(e3) {
this.postMessage("onClientSinkDurationChanged", [
e3
]);
}, t2.onSinkEnded = function() {
this.postMessage("onClientSinkEnded");
}, t2.onSinkIdle = function() {
this.postMessage("onClientSinkIdle");
}, t2.onSinkPlaying = function(e3) {
this.postMessage("onClientSinkPlaying"), e3 && this.play();
}, t2.onSinkStop = function(e3) {
var t3, i2, n2 = c(document).hidden;
if (document[n2])
this.postMessage("pause");
else if (e3) {
if (!this.isMuted() && (null == (t3 = null == (i2 = this.autoPlayOptions) ? void 0 : i2.attemptMutedRetry) || t3))
return this.setMuted(true), this.mediaSinkManager.getCurrentSink().play(), void this.emitter.emit(C.AUDIO_BLOCKED);
this.pause(), this.emitter.emit(C.PLAYBACK_BLOCKED);
} else
this.pause();
}, t2.onSinkReset = function() {
this.postMessage("onClientSinkReset");
}, t2.onSinkError = function(e3) {
var t3 = e3.value, i2 = e3.code, n2 = e3.message;
this.postMessage("onClientSinkError", [
t3,
i2,
n2
]);
}, t2.onSinkRecoverableError = function(e3) {
var t3 = e3.value, i2 = e3.code, n2 = e3.message;
this.postMessage("onClientSinkRecoverableError", [
t3,
i2,
n2
]);
}, t2.onSinkVideoDisplaySizeChanged = function(e3, t3) {
this.setAutoViewportSize(e3, t3);
}, t2.onSinkVolumeChanged = function(e3, t3) {
this.mediaSinkManager.videoElement().controls && t3 && this.setVolume(e3), this.emitter.emit(C.VOLUME_CHANGED, this.state.volume);
}, t2.onSinkMutedChanged = function(e3) {
this.postMessage("setMuted", [
e3
]), this.emitter.emit(C.MUTED_CHANGED);
}, t2.onSinkPlaybackRateChanged = function(e3) {
this.postMessage("setPlaybackRate", [
e3
]);
}, t2.onPassthroughSinkMetadata = function(e3, t3, i2, n2, r2) {
this.emitter.emit(C.TEXT_METADATA_CUE, {
description: n2,
endTime: t3,
startTime: e3,
text: i2,
owner: r2,
type: "TextMetadataCue"
});
}, t2.onSinkControlsChanged = function(e3) {
this.postMessage("setControls", [
e3
]);
}, t2.onSinkGapJump = function(e3) {
this.postMessage("onClientSinkGapJump", [
e3
]);
}, t2.onRemoteDevice = function(e3) {
this.emitter.emit(e3 ? G.AVAILABLE : G.UNAVAILABLE);
}, t2.onRemoteReconnect = function() {
this.startRemotePlayback();
}, t2.onSessionError = function() {
this.postMessage("onClientSinkError", [
1,
0,
"Chromecast session error"
]);
}, t2.onLoadMediaError = function() {
this.postMessage("onClientSinkError", [
1,
0,
"Chromecast load media failed"
]);
}, t2.onUserCancel = function() {
this.endRemotePlayback(), this.emitter.emit(G.SESSION_ENDED);
}, t2.onSegmentDiscontinuity = function() {
this.mediaSinkManager.onSegmentDiscontinuity();
}, t2.onSessionStop = function() {
this.endRemotePlayback(), this.emitter.emit(G.SESSION_ENDED);
}, t2.onSessionStarted = function(e3) {
this.emitter.emit(G.SESSION_STARTED, e3);
}, t2.attemptPlay = function() {
var _$e = c(document).hidden;
!document[_$e] && this.isLoaded && this.postMessage("play");
}, t2.postMessage = function(e3, t3, i2) {
void 0 === i2 && (i2 = []), this.worker.postMessage({
id: this.id,
funcName: e3,
args: t3
}, i2);
}, t2.resetState = function() {
a(this.state, {
state: j.IDLE,
quality: {
name: "",
group: "",
codecs: "",
bitrate: 0,
width: 0,
height: 0,
framerate: 0
},
qualities: [],
duration: 0,
startOffset: 0,
sessionData: {},
volume: 1,
statistics: {
bitrate: 0,
framerate: 0,
droppedFrames: 0,
decodeFrames: 0,
renderedFrames: 0
},
trackBufferedRanges: {
audio: [],
video: []
}
}), this.emitter.emit(C.DURATION_CHANGED, 0), this.seekTime = null, this.isLoaded = false;
}, t2.attachHandlers = function() {
var _$e = this;
this.worker.addEventListener("message", this.onmessage);
var t3 = c(document).visibilityChange;
document.addEventListener(t3, this.onvisibilitychange), window.addEventListener("online", this.onOnline), window.addEventListener("offline", this.onOffline);
var i2 = this.emitter;
i2.on(C.VOLUME_CHANGED, function() {
return _$e.onVolumeChanged();
}), i2.on(C.MUTED_CHANGED, function() {
return _$e.onMutedChanged();
}), i2.on(C.SEEK_COMPLETED, function() {
return _$e.onSeekCompleted();
}), i2.on(C.ERROR, function() {
return _$e.onError();
}), i2.on(C.SESSION_DATA, function(t4) {
return _$e.onSessionData(t4);
}), i2.on(C.SEGMENT_DISCONTINUITY, function() {
return _$e.onSegmentDiscontinuity();
}), i2.on(Ce.STATE_CHANGED, function(t4) {
return _$e.onStateChanged(t4);
}), i2.on(Ce.MEDIA_SINK_RPC, function(t4) {
return _$e.mediaSinkManager.applyRPC(t4);
}), i2.on(Ce.CONFIGURE, function(t4) {
_$e.mediaSinkManager.configure(t4), _$e.setSinkType(t4.mode);
}), i2.on(Ce.RESET, function() {
return _$e.mediaSinkManager.reset();
}), i2.on(H.ID3, function(t4) {
return _$e.onID3(t4);
}), i2.on(Ce.GET_EXPERIMENTS, function(t4) {
_$e.experiments = t4;
}), i2.on(Ce.PROPERTY_CHANGED, function(t4) {
var i3 = t4.key, n2 = t4.value;
_$e.state[i3] = n2;
}), i2.on(Ce.BUFFERED_RANGES, function(t4) {
_$e.state.trackBufferedRanges = t4;
}), i2.on(Ce.LOG_MESSAGE, function(e3) {
var t4 = e3.level, i3 = e3.message;
return console[t4](i3);
});
}, t2.onVolumeChanged = function() {
var _$e = c(document).hidden;
this.pauseHiddenSilentTab && document[_$e] && 0 === this.getVolume() && this.postMessage("pause");
}, t2.onMutedChanged = function() {
var _$e = c(document).hidden;
this.pauseHiddenSilentTab && document[_$e] && this.isMuted() && this.postMessage("pause");
}, t2.onSeekCompleted = function() {
this.seekTime = null;
}, t2.onError = function() {
this.paused = true;
}, t2.onStateChanged = function(e3) {
var t3 = this;
switch (e3) {
case j.READY:
var i2 = function(e4, t4) {
var i3 = [], n2 = [];
return e4.forEach(function(e5) {
t4(e5) ? i3.push(e5) : n2.push(e5);
}), {
supported: i3,
unsupported: n2
};
}(this.state.qualities, this.isQualitySupported);
this.state.qualities = i2.supported, i2.unsupported.forEach(function(e4) {
return t3.postMessage("removeQuality", [
e4
]);
}), this.isLoaded = true, this.autoPlayOptions && this.play(), this.paused || this.attemptPlay();
break;
case j.ENDED:
this.paused = true;
}
this.emitter.emit(C.STATE_CHANGED, e3), this.emitter.emit(e3);
}, t2.onID3 = function(e3) {
var t3 = this;
e3.forEach(function(e4) {
if ("TXXX" === e4.id && "segmentmetadata" === e4.desc && e4.info.length) {
var i2 = function(e5) {
try {
return JSON.parse(e5);
} catch (t4) {
return console.error("Failed JSON parse:", e5), {};
}
}(e4.info[0]);
if (Object.prototype.hasOwnProperty.call(i2, "stream_offset")) {
var n2 = Number(i2.stream_offset);
isNaN(n2) || (t3.state.startOffset = n2 - t3.getPosition());
}
}
});
}, t2.onVisibilityChange = function() {
var _$e = c(document).hidden;
this.paused || document[_$e] || this.attemptPlay(), this.pauseHiddenSilentTab && !this.paused && document[_$e] && (this.isMuted() || 0 === this.getVolume()) && this.postMessage("pause"), I().firefox || this.postMessage("setVisible", [
!document[_$e]
]);
}, t2.onSessionData = function(e3) {
a(this.state, e3);
}, t2.onWorkerMessage = function(e3) {
var t3 = e3.data;
if (t3 && t3.id === this.id) {
var i2 = this.workerMessageProcessors.reduce(function(e4, t4) {
return t4(e4);
}, t3), n2 = i2.type, r2 = i2.arg;
void 0 !== t3.arg ? this.emitter.emit(n2, r2) : this.emitter.emit(n2);
}
}, t2.processVideoElementAttributes = function(e3) {
if (e3.hasAttribute("autoplay") && (e3.removeAttribute("autoplay"), this.setAutoplay(true)), e3.hasAttribute("playbackRate")) {
var t3, i2 = parseFloat(null != (t3 = e3.getAttribute("playbackRate")) ? t3 : "1.0");
if (!isNaN(i2)) {
var n2 = d(i2, 0.25, 2);
this.setPlaybackRate(n2);
}
e3.removeAttribute("playbackRate");
}
if (e3.hasAttribute("src")) {
var r2 = e3.src;
h(e3), this.load(r2);
}
if (e3.hasAttribute("loop") && (e3.removeAttribute("loop"), this.setLooping(true)), e3.hasAttribute("muted") && (e3.removeAttribute("muted"), this.setMuted(true)), e3.hasAttribute("volume")) {
var o2, s2 = parseFloat(null != (o2 = e3.getAttribute("volume")) ? o2 : "1.0");
isNaN(s2) || this.setVolume(d(s2, 0, 1)), e3.removeAttribute("volume");
}
}, e2;
}();
Je.instanceId = 0;
var Ze = function() {
var e2 = function e3(e3) {
var t3 = this;
this.workerPort = void 0, this.emitter = void 0, this.messageQueue = void 0, this.workerPort = {
postMessage: this.postMessageFromWorker.bind(this),
onmessage: function onmessage() {
}
}, this.emitter = new Ye.EventEmitter(), this.messageQueue = new s(), this.loadScript(e3, function(e4) {
return t3.applyWorkerEnv(e4);
});
};
var t2 = e2.prototype;
return t2.postMessage = function(e3) {
this.messageQueue ? this.messageQueue.push(e3) : this.postMessageToWorker(e3);
}, t2.addEventListener = function(e3, t3) {
this.emitter.on(e3, t3);
}, t2.removeEventListener = function(e3, t3) {
this.emitter.off(e3, t3);
}, t2.onmessage = function() {
}, t2.onmessageerror = function() {
}, t2.onerror = function() {
}, t2.terminate = function() {
}, t2.dispatchEvent = function() {
return true;
}, t2.loadScript = function(e3, t3) {
var i2 = this, n2 = new XMLHttpRequest();
n2.open("GET", e3), n2.addEventListener("load", function() {
n2.status >= 200 && n2.status < 400 ? t3(n2.response) : i2.emitter.emit("error", new Error(n2.statusText));
}), n2.addEventListener("error", function(e4) {
i2.emitter.emit("error", e4);
}), n2.send();
}, t2.applyWorkerEnv = function(e3) {
if (this.messageQueue) {
try {
Function("self", "messageHandler", e3)(window, this.workerPort);
} catch (e1) {
return void this.emitter.emit("error", e1);
}
for (; !this.messageQueue.empty(); )
this.postMessageToWorker(this.messageQueue.pop());
this.messageQueue = null;
}
}, t2.postMessageFromWorker = function(e3) {
var t3 = this;
setTimeout(function() {
t3.emitter.emit("message", {
data: e3
});
}, 0);
}, t2.postMessageToWorker = function(e3) {
var t3 = this;
setTimeout(function() {
t3.workerPort.onmessage({
data: e3
});
}, 0);
}, e2;
}();
var et = "undefined" != typeof window && "object" == typeof window.WebAssembly && "function" == typeof window.WebAssembly.instantiate, tt = et;
var nt, rt, ot, st, at, ut, ct, dt, ht = function() {
var e2 = function e3(e3, t3) {
this.core = void 0, this.startCapture = void 0, this.stopCapture = void 0, this.requestCaptureAnalytics = void 0, this.core = new Je(e3, t3);
};
var t2 = e2.prototype;
return t2.addEventListener = function(e3, t3) {
var i2;
null == (i2 = this.checkCore()) || i2.addEventListener(e3, t3);
}, t2.attachHTMLVideoElement = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.attachHTMLVideoElement(e3);
}, t2.delete = function() {
var e3;
null == (e3 = this.checkCore()) || e3.delete(), this.core = null;
}, t2.endRemotePlayback = function() {
var e3;
null == (e3 = this.checkCore()) || e3.endRemotePlayback();
}, t2.isAutoplay = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.isAutoplay();
}, t2.isAutoQualityMode = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.isAutoQualityMode();
}, t2.getAverageBitrate = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getAverageBitrate();
}, t2.getBandwidthEstimate = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getBandwidthEstimate();
}, t2.getBufferDuration = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getBufferDuration();
}, t2.getBuffered = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getBuffered();
}, t2.getBufferedRanges = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getBufferedRanges();
}, t2.getSinkBufferedRanges = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getSinkBufferedRanges();
}, t2.getDecodedFrames = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getDecodedFrames();
}, t2.getDisplayHeight = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getDisplayHeight();
}, t2.getDisplayWidth = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getDisplayWidth();
}, t2.getDroppedFrames = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getDroppedFrames();
}, t2.getDuration = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getDuration();
}, t2.getExperiments = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getExperiments();
}, t2.getHTMLVideoElement = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getHTMLVideoElement();
}, t2.getLiveLatency = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getLiveLatency();
}, t2.getPath = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getPath();
}, t2.getProtocol = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getProtocol();
}, t2.getPlaybackRate = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getPlaybackRate();
}, t2.getPosition = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getPosition();
}, t2.getQualities = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getQualities();
}, t2.getQuality = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getQuality();
}, t2.getSessionData = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getSessionData();
}, t2.getSessionId = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getSessionId();
}, t2.getStartOffset = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getStartOffset();
}, t2.getState = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getState();
}, t2.getVersion = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getVersion();
}, t2.getVideoBitRate = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getVideoBitRate();
}, t2.getVideoFrameRate = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getVideoFrameRate();
}, t2.getVideoHeight = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getVideoHeight();
}, t2.getVideoWidth = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getVideoWidth();
}, t2.getVolume = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.getVolume();
}, t2.isLiveLowLatency = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.isLiveLowLatency();
}, t2.isLooping = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.isLooping();
}, t2.isMuted = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.isMuted();
}, t2.isPaused = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.isPaused();
}, t2.isProtected = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.isProtected();
}, t2.isSeeking = function() {
var e3;
return null == (e3 = this.checkCore()) ? void 0 : e3.isSeeking();
}, t2.load = function(e3, t3) {
var i2;
return void 0 === t3 && (t3 = ""), null == (i2 = this.checkCore()) ? void 0 : i2.load(e3, t3);
}, t2.pause = function() {
var e3;
null == (e3 = this.checkCore()) || e3.pause();
}, t2.play = function() {
var e3;
null == (e3 = this.checkCore()) || e3.play();
}, t2.removeEventListener = function(e3, t3) {
var i2;
null == (i2 = this.checkCore()) || i2.removeEventListener(e3, t3);
}, t2.seekTo = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.seekTo(e3);
}, t2.setAuthToken = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setAuthToken(e3);
}, t2.setAutoInitialBitrate = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setAutoInitialBitrate(e3);
}, t2.setAutoMaxQuality = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setAutoMaxQuality(e3);
}, t2.setAutoMaxBitrate = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setAutoMaxBitrate(e3);
}, t2.setAutoMaxVideoSize = function(e3, t3) {
var i2;
null == (i2 = this.checkCore()) || i2.setAutoMaxVideoSize(e3, t3);
}, t2.setAutoplay = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setAutoplay(e3);
}, t2.setAutoPlayOptions = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setAutoPlayOptions(e3);
}, t2.setAutoQualityMode = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setAutoQualityMode(e3);
}, t2.setAutoViewportSize = function(e3, t3) {
var i2;
null == (i2 = this.checkCore()) || i2.setAutoViewportSize(e3, t3);
}, t2.setClientId = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setClientId(e3);
}, t2.setDeviceId = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setDeviceId(e3);
}, t2.setExperiment = function(e3, t3) {
var i2;
null == (i2 = this.checkCore()) || i2.setExperiment(e3, t3);
}, t2.setExperimentData = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setExperimentData(e3);
}, t2.setInitialBufferDuration = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setInitialBufferDuration(e3);
}, t2.setLiveLowLatencyEnabled = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setLiveLowLatencyEnabled(e3);
}, t2.setLiveMaxLatency = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setLiveMaxLatency(e3);
}, t2.setLiveSpeedUpRate = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setLiveSpeedUpRate(e3);
}, t2.setLogLevel = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setLogLevel(e3);
}, t2.setLooping = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setLooping(e3);
}, t2.setMuted = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setMuted(e3);
}, t2.setPlaybackRate = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setPlaybackRate(e3);
}, t2.setPlayerType = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setPlayerType(e3);
}, t2.setQuality = function(e3, t3) {
var i2;
void 0 === t3 && (t3 = false), null == (i2 = this.checkCore()) || i2.setQuality(e3, t3);
}, t2.setRebufferToLive = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setRebufferToLive(e3);
}, t2.setVisible = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setVisible(e3);
}, t2.setVolume = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setVolume(e3);
}, t2.startRemotePlayback = function() {
var e3;
null == (e3 = this.checkCore()) || e3.startRemotePlayback();
}, t2.setPlatformName = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setPlatformName(e3);
}, t2.setRequestCredentials = function(e3) {
var t3;
null == (t3 = this.checkCore()) || t3.setRequestCredentials(e3);
}, t2.checkCore = function() {
return this.core || console.warn("Method called on deleted player instance."), this.core;
}, e2;
}();
ht.isVP9Supported = Je.isVP9Supported, function(e2) {
e2.UNKNOWN = "Unspecified", e2.FILE = "File", e2.SEGMENT = "Segment", e2.SOURCE = "Source", e2.DECODER = "Decode", e2.RENDERER = "Render", e2.MASTER_PLAYLIST = "MasterPlaylist", e2.MEDIA_PLAYLIST = "MediaPlaylist";
}(nt || (nt = {})), function(e2) {
e2.GENERIC = "Error", e2.NOT_SUPPORTED = "ErrorNotSupported", e2.NO_SOURCE = "ErrorNoSource", e2.INVALID_DATA = "ErrorInvalidData", e2.INVALID_STATE = "ErrorInvalidState", e2.INVALID_PARAMETER = "ErrorInvalidParameter", e2.TIMEOUT = "ErrorTimeout", e2.NETWORK = "ErrorNetwork", e2.NETWORK_IO = "ErrorNetworkIO", e2.AUTHORIZATION = "ErrorAuthorization", e2.NOT_AVAILABLE = "ErrorNotAvailable";
}(rt || (rt = {})), function(e2) {
e2[e2.GEOBLOCKED = 1] = "GEOBLOCKED", e2[e2.UNSUPPORTED_DEVICE = 2] = "UNSUPPORTED_DEVICE", e2[e2.ANONYMIZER_BLOCKED = 3] = "ANONYMIZER_BLOCKED", e2[e2.CELLULAR_NETWORK_PROHIBITED = 4] = "CELLULAR_NETWORK_PROHIBITED", e2[e2.UNAUTHORIZATION_ENTITLEMENTS = 5] = "UNAUTHORIZATION_ENTITLEMENTS", e2[e2.VOD_RESTRICTED = 6] = "VOD_RESTRICTED";
}(ot || (ot = {})), function(e2) {
e2.CAPTURE_ENABLED = "CaptureEnabled", e2.CAPTURE_BUNDLE = "CaptureBundle", e2.CAPTURE_ANALYTICS = "CaptureAnalytics", e2.FMP4_SEGMENT = "FMP4Segment";
}(st || (st = {})), function(e2) {
e2.DEBUG = "debug", e2.INFO = "info", e2.WARN = "warn", e2.ERROR = "error";
}(at || (at = {})), function(e2) {
e2.DURATION_CHANGE = "durationchange", e2.ENDED = "ended", e2.ERROR = "error", e2.LOADED_METADATA = "loadedmetadata", e2.LOADSTART = "loadstart", e2.PAUSE = "pause", e2.PLAY = "play", e2.PLAYING = "playing", e2.RATE_CHANGE = "ratechange", e2.SEEKED = "seeked", e2.SEEKING = "seeking", e2.TIME_UPDATE = "timeupdate", e2.VOLUME_CHANGE = "volumechange", e2.WAITING = "waiting";
}(ut || (ut = {})), function(e2) {
e2[e2.HAVE_NOTHING = 0] = "HAVE_NOTHING", e2[e2.HAVE_METADATA = 1] = "HAVE_METADATA", e2[e2.HAVE_CURRENT_DATA = 2] = "HAVE_CURRENT_DATA", e2[e2.HAVE_FUTURE_DATA = 3] = "HAVE_FUTURE_DATA", e2[e2.HAVE_ENOUGH_DATA = 4] = "HAVE_ENOUGH_DATA";
}(dt || (dt = {}));
var lt = ((ct = {})[j.IDLE] = 1, ct[j.READY] = 1, ct[j.BUFFERING] = 2, ct[j.PLAYING] = 2, ct[j.ENDED] = 1, ct), ft = "AmazonIVS";
var vt = "enableIVSQualityPlugin";
module.exports = t;
}();
}
});
// scripts/modules/video.ts
function asyncGeneratorStep15(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator15(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep15(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep15(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var import_amazon_ivs_player, __generator15, video, videoAudioContext, videoSource, videoGainNode, isVideoEnded, connectVideoSourceWithNode, prepareVideo, playVideo, stopVideo, togglePause, isVideoPaused, setVideoForwardFor, isVideoPlaying, setVideoRewindFor, getVideoDuration, setCurrentTime, getCurrentTime, getSliderRate, seekVideoBy, setMute, initializeVideoEventListeners;
var init_video = __esm({
"scripts/modules/video.ts"() {
"use strict";
import_amazon_ivs_player = __toESM(require_dist());
init_const();
init_debug();
init_platform();
__generator15 = function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
video = void 0;
videoAudioContext = void 0;
videoSource = void 0;
videoGainNode = void 0;
isVideoEnded = false;
connectVideoSourceWithNode = function() {
if (!isIPhone() && !isMac()) {
return;
}
if (videoAudioContext === void 0) {
videoAudioContext = new (heliportWindow.AudioContext || heliportWindow.webkitAudioContext)();
}
if (videoSource === void 0 && videoAudioContext !== void 0 && video !== void 0) {
videoSource = videoAudioContext.createMediaElementSource(video);
}
if (videoGainNode === void 0) {
if (videoAudioContext !== void 0) {
videoGainNode = videoAudioContext.createGain();
}
if (videoAudioContext !== void 0 && videoSource !== void 0) {
videoSource.connect(videoGainNode || videoAudioContext.createGain());
}
if (videoGainNode !== void 0 && videoAudioContext !== void 0) {
videoGainNode.connect(videoAudioContext.destination);
}
}
};
prepareVideo = function(loop) {
if (video !== void 0) {
return;
}
video = document.getElementById("video0");
video.loop = loop;
isVideoEnded = false;
video.onseeking = function() {
return isVideoEnded = false;
};
video.onseeked = function() {
return isVideoEnded = true;
};
video.oncanplay = function() {
return isVideoEnded = false;
};
video.oncanplaythrough = function() {
return isVideoEnded = true;
};
video.onended = function(event) {
debugLog("g_Video onEnded ".concat(JSON.stringify(event)));
isVideoEnded = true;
};
video.addEventListener("loadedmetadata", function() {
if (typeof heliportWindow.hel_video_on_loadedmetadata === "function") {
heliportWindow.hel_video_on_loadedmetadata();
}
});
};
playVideo = function() {
var _ref = _asyncToGenerator15(function(videoSrc, videoStreaming) {
var player, hls;
return __generator15(this, function(_state) {
switch (_state.label) {
case 0:
if (video === void 0) {
return [
2
];
}
if (!(videoStreaming !== 0))
return [
3,
7
];
if (!import_amazon_ivs_player.isPlayerSupported)
return [
3,
1
];
connectVideoSourceWithNode();
player = (0, import_amazon_ivs_player.create)({
wasmBinary: "",
wasmWorker: ""
});
player.attachHTMLVideoElement(video);
player.load(videoSrc);
player.play();
return [
3,
6
];
case 1:
if (!(!isIPhone() && typeof Hls !== "undefined" && Hls.isSupported()))
return [
3,
3
];
connectVideoSourceWithNode();
hls = new Hls();
hls.loadSource(videoSrc);
hls.attachMedia(video);
return [
4,
video.play()
];
case 2:
_state.sent();
return [
3,
6
];
case 3:
if (!video.canPlayType("application/vnd.apple.mpegurl"))
return [
3,
5
];
connectVideoSourceWithNode();
video.src = videoSrc;
return [
4,
video.play()
];
case 4:
_state.sent();
return [
3,
6
];
case 5:
debugLog("video streaming not supported");
_state.label = 6;
case 6:
return [
3,
9
];
case 7:
connectVideoSourceWithNode();
video.src = videoSrc;
return [
4,
video.play()
];
case 8:
_state.sent();
_state.label = 9;
case 9:
return [
2
];
}
});
});
return function playVideo2(videoSrc, videoStreaming) {
return _ref.apply(this, arguments);
};
}();
stopVideo = function() {
if (video === void 0) {
return;
}
video.pause();
};
togglePause = function() {
var _ref = _asyncToGenerator15(function(toggle) {
return __generator15(this, function(_state) {
switch (_state.label) {
case 0:
if (video === void 0) {
return [
2
];
}
if (!toggle)
return [
3,
1
];
video.pause();
return [
3,
3
];
case 1:
return [
4,
video.play()
];
case 2:
_state.sent();
_state.label = 3;
case 3:
return [
2
];
}
});
});
return function togglePause2(toggle) {
return _ref.apply(this, arguments);
};
}();
isVideoPaused = function() {
if (video === void 0) {
return true;
}
return video.paused;
};
setVideoForwardFor = function(seconds) {
if (video === void 0) {
return;
}
video.currentTime += seconds;
};
isVideoPlaying = function() {
if (video === void 0) {
return false;
}
return !(video.loop && isVideoEnded);
};
setVideoRewindFor = function(seconds) {
if (video === void 0) {
return;
}
video.currentTime -= seconds;
};
getVideoDuration = function() {
if (video === void 0) {
return 0;
}
return video.duration;
};
setCurrentTime = function(sliderRate) {
if (video === void 0) {
return;
}
if (video.duration > 0) {
video.currentTime = sliderRate * video.duration;
}
};
getCurrentTime = function() {
if (video === void 0) {
return 0;
}
return video.currentTime;
};
getSliderRate = function() {
if (video === void 0) {
return 0;
}
var sliderRate = 0;
if (video.duration > 0) {
sliderRate = video.currentTime / video.duration;
}
return sliderRate;
};
seekVideoBy = function(seconds) {
if (video === void 0) {
return;
}
video.currentTime = seconds;
};
setMute = function(mute) {
if (video === void 0) {
return;
}
video.muted = mute;
};
initializeVideoEventListeners = function(onPlayed, onPaused, onEnded) {
if (video === void 0) {
return;
}
if (onPlayed !== void 0) {
video.addEventListener("play", onPlayed);
}
if (onPaused !== void 0) {
video.addEventListener("pause", onPaused);
}
if (onEnded !== void 0) {
video.addEventListener("ended", onEnded);
}
};
}
});
// scripts/deviceFeatures/useVideo.ts
var useVideo;
var init_useVideo = __esm({
"scripts/deviceFeatures/useVideo.ts"() {
"use strict";
init_video();
useVideo = function() {
return {
setVideoForwardFor,
connectVideoSourceWithNode,
setVideoRewindFor,
getVideoDuration,
initializeVideoEventListeners,
isVideoPaused,
playVideo,
isVideoPlaying,
seekVideoBy,
prepareVideo,
stopVideo,
getSliderRate,
setCurrentTime,
getCurrentTime,
togglePause,
setMute
};
};
}
});
// scripts/loader.ts
var loadApis, loadDeviceApis;
var init_loader = __esm({
"scripts/loader.ts"() {
"use strict";
init_useAnalytics();
init_useAuth();
init_useAvatar();
init_useInterval();
init_useProfile();
init_useRoomApi();
init_useRouter();
init_useScreen();
init_useText();
init_useVrAd();
init_const();
init_useCanvas();
init_useCookie();
init_useDocument();
init_useGyro();
init_usePlatform();
init_useRender();
init_useStorage();
init_useVideo();
loadApis = function() {
if (heliportWindow.api === void 0) {
heliportWindow.api = {};
}
if (heliportWindow.api.analytics === void 0) {
heliportWindow.api.analytics = {};
}
heliportWindow.api.analytics = Object.assign(heliportWindow.api.analytics, useAnalytics());
if (heliportWindow.api.auths === void 0) {
heliportWindow.api.auths = {};
}
heliportWindow.api.auths = Object.assign(heliportWindow.api.auths, useAuth());
if (heliportWindow.api.avatars === void 0) {
heliportWindow.api.avatars = {};
}
heliportWindow.api.avatars = Object.assign(heliportWindow.api.avatars, useAvatar());
if (heliportWindow.api.intervals === void 0) {
heliportWindow.api.intervals = {};
}
heliportWindow.api.intervals = Object.assign(heliportWindow.api.intervals, useInterval());
if (heliportWindow.api.profiles === void 0) {
heliportWindow.api.profiles = {};
}
heliportWindow.api.profiles = Object.assign(heliportWindow.api.profiles, useProfile());
if (heliportWindow.api.rooms === void 0) {
heliportWindow.api.rooms = {};
}
heliportWindow.api.rooms = Object.assign(heliportWindow.api.rooms, useRoomApi());
if (heliportWindow.api.routers === void 0) {
heliportWindow.api.routers = {};
}
heliportWindow.api.routers = Object.assign(heliportWindow.api.routers, useRouter());
if (heliportWindow.api.screens === void 0) {
heliportWindow.api.screens = {};
}
heliportWindow.api.screens = Object.assign(heliportWindow.api.screens, useScreen());
if (heliportWindow.api.texts === void 0) {
heliportWindow.api.texts = {};
}
heliportWindow.api.texts = Object.assign(heliportWindow.api.texts, useText());
if (heliportWindow.api.vrads === void 0) {
heliportWindow.api.vrads = {};
}
heliportWindow.api.vrads = Object.assign(heliportWindow.api.vrads, useVrAd());
};
loadDeviceApis = function() {
if (heliportWindow.canvas === void 0) {
heliportWindow.canvas = {};
}
heliportWindow.canvas = Object.assign(heliportWindow.canvas, useCanvas());
if (heliportWindow.cookie === void 0) {
heliportWindow.cookie = {};
}
heliportWindow.cookie = Object.assign(heliportWindow.cookie, useCookie());
if (heliportWindow.doc === void 0) {
heliportWindow.doc = {};
}
heliportWindow.doc = Object.assign(heliportWindow.doc, useDocument());
if (heliportWindow.gyro === void 0) {
heliportWindow.gyro = {};
}
heliportWindow.gyro = Object.assign(heliportWindow.gyro, useGyro());
if (heliportWindow.platform === void 0) {
heliportWindow.platform = {};
}
heliportWindow.platform = Object.assign(heliportWindow.platform, usePlatform());
if (heliportWindow.render === void 0) {
heliportWindow.render = {};
}
heliportWindow.render = Object.assign(heliportWindow.render, useRender());
if (heliportWindow.storage === void 0) {
heliportWindow.storage = {};
}
heliportWindow.storage = Object.assign(heliportWindow.storage, useStorage());
if (heliportWindow.video === void 0) {
heliportWindow.video = {};
}
heliportWindow.video = Object.assign(heliportWindow.video, useVideo());
};
}
});
// scripts/bootstrap.ts
var require_bootstrap = __commonJS({
"scripts/bootstrap.ts"(exports) {
"use strict";
init_configs();
init_const();
init_configs2();
init_loader();
init_debug();
function asyncGeneratorStep16(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator16(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep16(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep16(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
var __generator16 = exports && exports.__generator || function(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1)
throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [
op[0] & 2,
t.value
];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
heliportWindow.bootHeliport = /* @__PURE__ */ _asyncToGenerator16(function() {
var config8;
return __generator16(this, function(_state) {
config8 = getConfig();
debugLog("hello world at env : ".concat(config8.skywayKey));
loadConfig();
loadDeviceApis();
loadApis();
return [
2
];
});
});
heliportWindow.bootHeliport();
}
});
// scripts/index.ts
var scripts_exports = {};
__reExport(scripts_exports, __toESM(require_bootstrap()));
})();
/*! For license information please see index.js.LICENSE.txt */
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc2NyaXB0cy9jb25zdC50cyIsICIuLi9zY3JpcHRzL2NvbmZpZ3MvZGV2ZWxvcG1lbnQudHMiLCAiLi4vc2NyaXB0cy9jb25maWdzL3Byb2R1Y3Rpb24udHMiLCAiLi4vc2NyaXB0cy9jb25maWdzL2luZGV4LnRzIiwgIi4uL3NjcmlwdHMvdXRpbHMvZGVidWcudHMiLCAiLi4vc2NyaXB0cy9tb2R1bGVzL2RvbS50cyIsICIuLi9zY3JpcHRzL21vZHVsZXMvc2NyZWVuU2hvdE1vZGFsLnRzIiwgIi4uL3NjcmlwdHMvZGV2aWNlRmVhdHVyZXMvY29uZmlncy50cyIsICIuLi9zY3JpcHRzL2NvbXBvc2FibGVzL3VzZUFuYWx5dGljcy50cyIsICIuLi9zY3JpcHRzL2RldmljZUZlYXR1cmVzL3VzZVN0b3JhZ2UudHMiLCAiLi4vc2NyaXB0cy9tb2R1bGVzL2F1dGgudHMiLCAiLi4vc2NyaXB0cy9zZXJ2aWNlcy9hcGkudHMiLCAiLi4vc2NyaXB0cy9zZXJ2aWNlcy9yZXBvc2l0b3JpZXMvYXNzZXRSZXBvc2l0b3J5LnRzIiwgIi4uL3NjcmlwdHMvc2VydmljZXMvcmVwb3NpdG9yaWVzL2F1dGhSZXBvc2l0b3J5LnRzIiwgIi4uL3NjcmlwdHMvc2VydmljZXMvcmVwb3NpdG9yaWVzL3Byb2ZpbGVSZXBvc2l0b3J5LnRzIiwgIi4uL3NjcmlwdHMvc2VydmljZXMvcmVwb3NpdG9yaWVzL3Jvb21SZXBvc2l0b3J5LnRzIiwgIi4uL3NjcmlwdHMvc2VydmljZXMvcmVwb3NpdG9yaWVzL3ZyQWRSZXBvc2l0b3J5LnRzIiwgIi4uL3NjcmlwdHMvc2VydmljZXMvZmFjdG9yeS50cyIsICIuLi9zY3JpcHRzL2NvbXBvc2FibGVzL3VzZUF1dGgudHMiLCAiLi4vc2NyaXB0cy9jb21wb3NhYmxlcy91c2VBdmF0YXIudHMiLCAiLi4vc2NyaXB0cy9jb21wb3NhYmxlcy91c2VJbnRlcnZhbC50cyIsICIuLi9zY3JpcHRzL2NvbXBvc2FibGVzL3VzZVByb2ZpbGUudHMiLCAiLi4vc2NyaXB0cy9jb21wb3NhYmxlcy91c2VSb29tQXBpLnRzIiwgIi4uL3NjcmlwdHMvY29tcG9zYWJsZXMvdXNlUm91dGVyLnRzIiwgIi4uL3NjcmlwdHMvbW9kdWxlcy9wbGF0Zm9ybS50cyIsICIuLi9zY3JpcHRzL2NvbXBvc2FibGVzL3VzZVNjcmVlbi50cyIsICIuLi9zY3JpcHRzL2NvbXBvc2FibGVzL3VzZVRleHQudHMiLCAiLi4vc2NyaXB0cy9jb21wb3NhYmxlcy91c2VWckFkLnRzIiwgIi4uL3NjcmlwdHMvZGV2aWNlRmVhdHVyZXMvdXNlQ2FudmFzLnRzIiwgIi4uL3NjcmlwdHMvZGV2aWNlRmVhdHVyZXMvdXNlQ29va2llLnRzIiwgIi4uL3NjcmlwdHMvZGV2aWNlRmVhdHVyZXMvdXNlRG9jdW1lbnQudHMiLCAiLi4vc2NyaXB0cy9kZXZpY2VGZWF0dXJlcy91c2VHeXJvLnRzIiwgIi4uL3NjcmlwdHMvZGV2aWNlRmVhdHVyZXMvdXNlUGxhdGZvcm0udHMiLCAiLi4vc2NyaXB0cy9tb2R1bGVzL2dsLnRzIiwgIi4uL3NjcmlwdHMvZGV2aWNlRmVhdHVyZXMvdXNlUmVuZGVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9ib3dzZXIvZXM1LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3JlZ2VuZXJhdG9yUnVudGltZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2V0UHJvdG90eXBlT2YuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNMb29zZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcHJvbWlzZS1wb2x5ZmlsbC9saWIvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FtYXpvbi1pdnMtcGxheWVyL2Rpc3QvaW5kZXguanMiLCAiLi4vc2NyaXB0cy9tb2R1bGVzL3ZpZGVvLnRzIiwgIi4uL3NjcmlwdHMvZGV2aWNlRmVhdHVyZXMvdXNlVmlkZW8udHMiLCAiLi4vc2NyaXB0cy9sb2FkZXIudHMiLCAiLi4vc2NyaXB0cy9ib290c3RyYXAudHMiLCAiLi4vc2NyaXB0cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHZhciBoZWxpcG9ydFZlcnNpb24gPSBcIjAuMC4xIEJldGFcIjtcbmV4cG9ydCB2YXIgaGVsaXBvcnRXaW5kb3cgPSB3aW5kb3c7XG5leHBvcnQgdmFyIE1PQklMRV9VU0VSX0FHRU5UX1JFR1MgPSAvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pO1xuZXhwb3J0IHZhciBJUEhPTkVfVVNFUl9BR0VOVF9SRUdTID0gL2lQaG9uZXxpUG9kL2k7XG5leHBvcnQgdmFyIElPU19WRVJfMTUgPSAxNTAwO1xuZXhwb3J0IHZhciBERUZBVUxUX1RJTUVfT1VUID0gMTAwMCAvLyBpbiBtaWxsaXNlY29uZFxuO1xuIiwgImV4cG9ydCB2YXIgZGV2Q29uZmlnID0ge1xuICAgIHNreXdheUtleTogXCJkZXZlbG9wbWVudFwiLFxuICAgIHNvY2tldElPVXJsOiBcImRldmVsb3BtZW50XCIsXG4gICAgcHJpbnRMb2c6IHRydWUsXG4gICAgLy8gQXZhdGFyVXBsb2FkXG4gICAgdmtldENsb3VkRG9tYWluOiBcImh0dHA6Ly9sYWJ0ZXN0LnZrZXRjbG91ZC5jb21cIixcbiAgICB1cGxvYWRBcGlEb21haW46IFwiaHR0cHM6Ly9zdGFnaW5nLmFzc2V0LXVwbG9hZC5oaWtreS5kZXZcIixcbiAgICBhY2NvdW50QXBpRG9tYWluOiBcImh0dHBzOi8vYWNjb3VudC52a2V0LmRldlwiLFxuICAgIGF1dGhDbGllbnRJZDogXCJLbDJkblIwcTNQbElMR0cxLUE3b1h3bUlKTk0tdE5kWW04MmpjcS1Kcl9jXCIsXG4gICAgLy8gVlIgQWRcbiAgICB2ckFkRG9tYWluOiBcImh0dHBzOi8vYXBpLTZrdWVvc3N2aHEtYW4uYS5ydW4uYXBwXCIsXG4gICAgLy8gUHJvZmlsZVxuICAgIHJlc291cmNlQXBpRG9tYWluOiBcImh0dHBzOi8vcmVzb3VyY2VzLmFwaS5oaWtreS5kZXZcIixcbiAgICAvLyBSb29tXG4gICAgcm9vbURvbWFpbjogXCJodHRwczovL3Byb3RvLnZjYi5oaWtreS5kZXZcIlxufTtcbiIsICJleHBvcnQgdmFyIHByb2RDb25maWcgPSB7XG4gICAgc2t5d2F5S2V5OiBcInByb2R1Y3Rpb25cIixcbiAgICBzb2NrZXRJT1VybDogXCJwcm9kdWN0aW9uXCIsXG4gICAgcHJpbnRMb2c6IHRydWUsXG4gICAgLy8gQXZhdGFyVXBsb2FkXG4gICAgdmtldENsb3VkRG9tYWluOiBcImh0dHA6Ly9sYWIudmtldGNsb3VkLmNvbVwiLFxuICAgIHVwbG9hZEFwaURvbWFpbjogXCJodHRwczovL2Fzc2V0LXVwbG9hZC52a2V0LmNvbVwiLFxuICAgIGFjY291bnRBcGlEb21haW46IFwiaHR0cHM6Ly9hY2NvdW50LnZrZXQuY29tXCIsXG4gICAgYXV0aENsaWVudElkOiBcImlzbzJzTFJTX1VnbnFyU1BaOHlHREtIWDA1ME90empSUk9VNXBDWUxoWDhcIixcbiAgICAvLyBWUiBBZFxuICAgIHZyQWREb21haW46IFwiaHR0cHM6Ly9hcGkudnItYWQubmV0XCIsXG4gICAgLy8gUHJvZmlsZVxuICAgIHJlc291cmNlQXBpRG9tYWluOiBcImh0dHBzOi8vcmVzb3VyY2VzLmFwaS52a2V0LmNvbVwiLFxuICAgIC8vIFJvb21cbiAgICByb29tRG9tYWluOiBcImh0dHBzOi8vdjEuYXBpLnZrZXRjbG91ZC5jb21cIlxufTtcbiIsICJpbXBvcnQgeyBoZWxpcG9ydFdpbmRvdyB9IGZyb20gXCIuLi9jb25zdFwiO1xuaW1wb3J0IHsgZGV2Q29uZmlnIH0gZnJvbSBcIi4vZGV2ZWxvcG1lbnRcIjtcbmltcG9ydCB7IHByb2RDb25maWcgfSBmcm9tIFwiLi9wcm9kdWN0aW9uXCI7XG5leHBvcnQgdmFyIGdldENvbmZpZyA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHByb2RDb25maWc7XG4gICAgfVxuICAgIHJldHVybiBkZXZDb25maWc7XG59O1xuaGVsaXBvcnRXaW5kb3cuZ2V0Q29uZmlnID0gZ2V0Q29uZmlnO1xuIiwgImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gICAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG4gICAgZm9yKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspYXJyMltpXSA9IGFycltpXTtcbiAgICByZXR1cm4gYXJyMjtcbn1cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXFxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gICAgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgICBpZiAoIW8pIHJldHVybjtcbiAgICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICAgIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG4pO1xuICAgIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cbmltcG9ydCB7IGdldENvbmZpZyB9IGZyb20gXCIuLi9jb25maWdzXCI7XG52YXIgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG52YXIgZm9ybWF0RGF0ZSA9IGZ1bmN0aW9uKGRhdGUpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQoZGF0ZS5nZXRGdWxsWWVhcigpLCBcIi1cIikuY29uY2F0KGRhdGUuZ2V0TW9udGgoKSArIDEsIFwiLVwiKS5jb25jYXQoZGF0ZS5nZXREYXRlKCksIFwiIFwiKS5jb25jYXQoZGF0ZS5nZXRIb3VycygpLCBcIjpcIikuY29uY2F0KGRhdGUuZ2V0TWludXRlcygpLCBcIiBcIikuY29uY2F0KGRhdGUuZ2V0U2Vjb25kcygpKTtcbn07XG5leHBvcnQgdmFyIGdldE5vd0RhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIGZvcm1hdERhdGUoZGF0ZSk7XG59O1xuZXhwb3J0IHZhciBkZWJ1Z0xvZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICBmb3IodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBvcHRpb25hbFBhcmFtcyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKXtcbiAgICAgICAgb3B0aW9uYWxQYXJhbXNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICB2YXIgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcbiAgICBfY29uc29sZTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICBpZiAoIWNvbmZpZy5wcmludExvZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIChfY29uc29sZSA9IGNvbnNvbGUpLmxvZy5hcHBseShfY29uc29sZSwgW1xuICAgICAgICBcIlsgXCIuY29uY2F0KGdldE5vd0RhdGUoKSwgXCIgXSBcIikuY29uY2F0KHRleHQpXG4gICAgXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KG9wdGlvbmFsUGFyYW1zKSkpO1xufTtcbmV4cG9ydCB2YXIgZGVidWdEZXRhaWxMb2cgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgZm9yKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgb3B0aW9uYWxQYXJhbXMgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKyl7XG4gICAgICAgIG9wdGlvbmFsUGFyYW1zW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgdmFyIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG4gICAgX2NvbnNvbGU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgaWYgKCFjb25maWcucHJpbnRMb2cpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAoX2NvbnNvbGUgPSBjb25zb2xlKS5sb2cuYXBwbHkoX2NvbnNvbGUsIFtcbiAgICAgICAgXCJbIFwiLmNvbmNhdChnZXROb3dEYXRlKCksIFwiIF0gXCIpLmNvbmNhdCh0ZXh0LCBcIiBAIFwiKS5jb25jYXQobmV3IEVycm9yKCkuc3RhY2spXG4gICAgXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KG9wdGlvbmFsUGFyYW1zKSkpO1xufTtcbiIsICIvKipcbiAqIEByZW1hcmtzXG4gKiBcdTMwQTZcdTMwQTNcdTMwRjNcdTMwQzlcdTMwQTZcdTMwQUZcdTMwRTlcdTMwQTRcdTMwQTJcdTMwRjNcdTMwQzhcdTMwQjVcdTMwQTRcdTMwQkFcdTMwOTJjYW52YXNcdTMwNkJcdTUzQ0RcdTY2MjBcdTMwNTVcdTMwNUJcdTMwOEJcbiAqLyBpbXBvcnQgeyBoZWxpcG9ydFdpbmRvdyB9IGZyb20gXCIuLi9jb25zdFwiO1xuZXhwb3J0IHZhciBnZXRNYWluQ2FudmFzID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2FudmFzXCIpO1xufTtcbmV4cG9ydCB2YXIgZ2V0Q29uZmlnVXJsID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29uZmlndXJsXCIpO1xufTtcbmV4cG9ydCB2YXIgZ2V0Q29uZmlnVXJsVGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbmZpZ3VybC10ZXh0XCIpO1xufTtcbmV4cG9ydCB2YXIgZ2V0VXNlck5hbWUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ1c2VybmFtZVwiKTtcbn07XG5leHBvcnQgdmFyIGdldFVzZXJOYW1lVGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInVzZXJuYW1lLXRleHRcIik7XG59O1xuZXhwb3J0IHZhciBnZXRHVUlEZWJ1ZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIkdVSWRlYnVnXCIpO1xufTtcbmV4cG9ydCB2YXIgZ2V0R1VJRGVidWdUYWIgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJHVUlkZWJ1Z1RhYlwiKTtcbn07XG5leHBvcnQgdmFyIGdldE1zZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1zZ1wiKTtcbn07XG5leHBvcnQgdmFyIGdldExvY2FsVGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImpzLWxvY2FsLXRleHRcIik7XG59O1xuLy8gU2NyZWVuIFNob3RcbmV4cG9ydCB2YXIgZ2V0U2NyZWVuU2hvdENvbnRhaW5lciA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI19fc3NfbW9kYWxcIik7XG59O1xuZXhwb3J0IHZhciBnZXRTY3JlZW5TaG90TW9kYWwgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNfX3NzX21vZGFsLWRpYWxvZy1idG5fb3Blbl9zc1wiKTtcbn07XG5leHBvcnQgdmFyIGdldFNjcmVlblNob3RNb2RhbENsb3NlQnV0dG9uID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjX19zc19tb2RhbC1kaWFsb2ctYnRuX2Nsb3NlXCIpO1xufTtcbmV4cG9ydCB2YXIgcmVmbGVjdENhbnZhc1NpemUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIWhlbGlwb3J0V2luZG93LmdfUmVmbGVjdENhbnZhc1NpemVNb2RlKSByZXR1cm47XG4gICAgdmFyIHdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIHZhciBoZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG1haW5DYW52YXMgPSBnZXRNYWluQ2FudmFzKCk7XG4gICAgaWYgKG1haW5DYW52YXMgIT09IG51bGwpIHtcbiAgICAgICAgbWFpbkNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBtYWluQ2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICB9XG59O1xuIiwgImltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL3V0aWxzL2RlYnVnXCI7XG5pbXBvcnQgeyBnZXRTY3JlZW5TaG90Q29udGFpbmVyLCBnZXRTY3JlZW5TaG90TW9kYWwsIGdldFNjcmVlblNob3RNb2RhbENsb3NlQnV0dG9uIH0gZnJvbSBcIi4vZG9tXCI7XG52YXIgY29udGFpbmVyID0gZ2V0U2NyZWVuU2hvdENvbnRhaW5lcigpO1xudmFyIG1vZGFsID0gZ2V0U2NyZWVuU2hvdE1vZGFsKCk7XG52YXIgY2xvc2VCdXR0b24gPSBnZXRTY3JlZW5TaG90TW9kYWxDbG9zZUJ1dHRvbigpO1xudmFyIGhpZGVTY3JlZW5TaG90TW9kYWwgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoY29udGFpbmVyID09PSBudWxsKSB7XG4gICAgICAgIGRlYnVnTG9nKFwiWyBoaWRlU2NyZWVuU2hvdE1vZGFsIF0gU2NyZWVuU2hvdENvbnRhaW5lciBub3QgZm91bmQgc28gbm9vcFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG59O1xuZXhwb3J0IHZhciBpbml0aWFsaXplU2NyZWVuU2hvdE1vZGFsID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKG1vZGFsICE9PSBudWxsKSB7XG4gICAgICAgIG1vZGFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoaWRlU2NyZWVuU2hvdE1vZGFsKTtcbiAgICAgICAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhpZGVTY3JlZW5TaG90TW9kYWwpO1xuICAgIH1cbiAgICBpZiAoY2xvc2VCdXR0b24gIT09IG51bGwpIHtcbiAgICAgICAgY2xvc2VCdXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhpZGVTY3JlZW5TaG90TW9kYWwpO1xuICAgICAgICBjbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGlkZVNjcmVlblNob3RNb2RhbCk7XG4gICAgfVxufTtcbmV4cG9ydCB2YXIgc2hvd1NjcmVlblNob3RNb2RhbCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChjb250YWluZXIgPT09IG51bGwpIHtcbiAgICAgICAgZGVidWdMb2coXCJbIHNob3dTY3JlZW5TaG90TW9kYWwgXSBTY3JlZW5TaG90Q29udGFpbmVyIG5vdCBmb3VuZCBzbyBub29wXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XG59O1xuIiwgIi8vIFx1MzBFMVx1MzBBNFx1MzBGM1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEMFx1MzBCOVx1MzA2RVx1OEEyRFx1NUI5QVx1MzA5Mlx1MzA1M1x1MzA2MVx1MzA4OVx1MzA2N1x1ODg0Q1x1MzA0NlxuaW1wb3J0IHsgaGVsaXBvcnRXaW5kb3cgfSBmcm9tIFwiLi4vY29uc3RcIjtcbmltcG9ydCB7IGluaXRpYWxpemVTY3JlZW5TaG90TW9kYWwgfSBmcm9tIFwiLi4vbW9kdWxlcy9zY3JlZW5TaG90TW9kYWxcIjtcbmV4cG9ydCB2YXIgbG9hZENvbmZpZyA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFx1MzBFMVx1MzBBNFx1MzBGM1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEMFx1MzBCOVx1MzA2RVx1OEEyRFx1NUI5QVx1MzA5Mlx1MzA1M1x1MzA2MVx1MzA4OVx1MzA2N1x1ODg0Q1x1MzA0NlxuICAgIGhlbGlwb3J0V2luZG93LmdfUmVmbGVjdENhbnZhc1NpemVNb2RlID0gdHJ1ZTtcbiAgICAvLyBTY3JlZW5TaG90TW9kYWxcdTMwNkVcdTUyMURcdTY3MUZcdTUzMTZcbiAgICBpbml0aWFsaXplU2NyZWVuU2hvdE1vZGFsKCk7XG59O1xuIiwgImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5IGluIG9iaikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgICBmb3IodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgICAgIHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uKHN5bSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIG93bktleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmltcG9ydCB7IGhlbGlwb3J0V2luZG93IH0gZnJvbSBcIi4uL2NvbnN0XCI7XG5pbXBvcnQgeyBkZWJ1Z0xvZyB9IGZyb20gXCIuLi91dGlscy9kZWJ1Z1wiO1xudmFyIGRhdGFMYXllciA9IGhlbGlwb3J0V2luZG93LmRhdGFMYXllcjtcbnZhciBzZXRBbmFseXRpY3MgPSBmdW5jdGlvbihldiwgYU5hbWUsIHBhcmFtcykge1xuICAgIGlmIChkYXRhTGF5ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWJ1Z0xvZyhcIlsgc2V0QW5hbHl0aWNzIF0gZGF0YUxheWVyIGlzIHVuZGVmaW5lZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWJ1Z0xvZyhldiwgYU5hbWUsIEpTT04uc3RyaW5naWZ5KHBhcmFtcykpO1xuICAgIHZhciBkYXRhID0gX29iamVjdFNwcmVhZCh7XG4gICAgICAgIGV2ZW50OiBldlxuICAgIH0sIHBhcmFtcyk7XG4gICAgZGF0YUxheWVyLnB1c2goZGF0YSk7XG59O1xudmFyIHNldEd0YWcgPSBmdW5jdGlvbihhTmFtZSwgcGFyYW1zKSB7XG4gICAgaWYgKHR5cGVvZiBoZWxpcG9ydFdpbmRvdy5ndGFnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZGVidWdMb2coXCJbIHNldEd0YWcgXSBzZXQgXCIuY29uY2F0KGFOYW1lLCBcIiBldmVudCBmb3IgcGFyYW1zID0gXCIpLmNvbmNhdChKU09OLnN0cmluZ2lmeShwYXJhbXMpKSk7XG4gICAgICAgIGhlbGlwb3J0V2luZG93Lmd0YWcoXCJldmVudFwiLCBhTmFtZSwgcGFyYW1zKTtcbiAgICB9XG59O1xuZXhwb3J0IHZhciB1c2VBbmFseXRpY3MgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzZXRBbmFseXRpY3M6IHNldEFuYWx5dGljcyxcbiAgICAgICAgc2V0R3RhZzogc2V0R3RhZ1xuICAgIH07XG59O1xuIiwgIi8qKlxuICogQHJlbWFya3NcbiAqIGxvY2FsIHN0b3JhZ2VcdTMwNkVcdTcyNzlcdTVCOUFcdTMwNkVcdTUwMjRcdTMwOTJcdThGRDRcdTMwNTlcbiAqLyB2YXIgZ2V0TG9jYWxTdG9yYWdlVmFsdWUgPSBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbn07XG4vKipcbiAqIEByZW1hcmtzXG4gKiBsb2NhbCBzdG9yYWdlXHUzMDZCXHU3Mjc5XHU1QjlBXHUzMDZFa2V5LHZhbHVlXHUzMDkyXHU2ODNDXHU3RDBEXHUzMDU5XHUzMDhCXG4gKi8gdmFyIHNldExvY2FsU3RvcmFnZVZhbHVlID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcbn07XG4vKipcbiAqIEByZW1hcmtzXG4gKiBzZXNzaW9uIHN0b3JhZ2VcdTMwNkVcdTcyNzlcdTVCOUFcdTMwNkVcdTUwMjRcdTMwOTJcdThGRDRcdTMwNTlcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqLyB2YXIgZ2V0U2Vzc2lvblN0b3JhZ2VWYWx1ZSA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGtleSk7XG59O1xuLyoqXG4gKiBAcmVtYXJrc1xuICogc2Vzc2lvbiBzdG9yYWdlXHUzMDZCXHU3Mjc5XHU1QjlBXHUzMDZFa2V5LHZhbHVlXHUzMDkyXHU2ODNDXHU3RDBEXHUzMDU5XHUzMDhCXG4gKi8gdmFyIHNldFNlc3Npb25TdG9yYWdlVmFsdWUgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG59O1xuZXhwb3J0IHZhciB1c2VTdG9yYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0TG9jYWxTdG9yYWdlVmFsdWU6IGdldExvY2FsU3RvcmFnZVZhbHVlLFxuICAgICAgICBzZXRMb2NhbFN0b3JhZ2VWYWx1ZTogc2V0TG9jYWxTdG9yYWdlVmFsdWUsXG4gICAgICAgIGdldFNlc3Npb25TdG9yYWdlVmFsdWU6IGdldFNlc3Npb25TdG9yYWdlVmFsdWUsXG4gICAgICAgIHNldFNlc3Npb25TdG9yYWdlVmFsdWU6IHNldFNlc3Npb25TdG9yYWdlVmFsdWVcbiAgICB9O1xufTtcbiIsICJmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gICAgfVxufVxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxudmFyIF9fZ2VuZXJhdG9yID0gdGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yIHx8IGZ1bmN0aW9uKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgZiwgeSwgdCwgZywgXyA9IHtcbiAgICAgICAgbGFiZWw6IDAsXG4gICAgICAgIHNlbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdO1xuICAgICAgICAgICAgcmV0dXJuIHRbMV07XG4gICAgICAgIH0sXG4gICAgICAgIHRyeXM6IFtdLFxuICAgICAgICBvcHM6IFtdXG4gICAgfTtcbiAgICByZXR1cm4gZyA9IHtcbiAgICAgICAgbmV4dDogdmVyYigwKSxcbiAgICAgICAgXCJ0aHJvd1wiOiB2ZXJiKDEpLFxuICAgICAgICBcInJldHVyblwiOiB2ZXJiKDIpXG4gICAgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgICByZXR1cm4gc3RlcChbXG4gICAgICAgICAgICAgICAgbixcbiAgICAgICAgICAgICAgICB2XG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlKF8pdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbXG4gICAgICAgICAgICAgICAgb3BbMF0gJiAyLFxuICAgICAgICAgICAgICAgIHQudmFsdWVcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBzd2l0Y2gob3BbMF0pe1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHQgPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3BbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgICAgICAgICB5ID0gb3BbMV07XG4gICAgICAgICAgICAgICAgICAgIG9wID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG9wID0gXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCBvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gdFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gdFsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ub3BzLnB1c2gob3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIG9wID0gW1xuICAgICAgICAgICAgICAgIDYsXG4gICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHkgPSAwO1xuICAgICAgICB9IGZpbmFsbHl7XG4gICAgICAgICAgICBmID0gdCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgfTtcbiAgICB9XG59O1xuaW1wb3J0IHsgdXNlQXV0aCB9IGZyb20gXCIuLi9jb21wb3NhYmxlcy91c2VBdXRoXCI7XG5pbXBvcnQgeyB1c2VTdG9yYWdlIH0gZnJvbSBcIi4uL2RldmljZUZlYXR1cmVzL3VzZVN0b3JhZ2VcIjtcbmV4cG9ydCB2YXIgdmFsaWRhdGVBdXRoID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGlzTG9nZ2VkSW4sIGlkVG9rZW47XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfc3RhdGUpIHtcbiAgICAgICAgICAgIHN3aXRjaChfc3RhdGUubGFiZWwpe1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VBdXRoKCkuaXNMb2dnZWRJbigpXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpc0xvZ2dlZEluID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0xvZ2dlZEluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZFRva2VuID0gdXNlU3RvcmFnZSgpLmdldFNlc3Npb25TdG9yYWdlVmFsdWUoXCJpZC10b2tlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkVG9rZW4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlblxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdmFsaWRhdGVBdXRoKCkge1xuICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59KCk7XG4iLCAiLyoqXG4gKiBBUElSZXF1ZXN0XHU5MDIzXHU2NDNBXHUzMDZCXHU1N0ZBXHUzMDY1XHUzMDQ0XHUzMDY2bW9kZWxcdTMwNkZcdTc1MjhcdTYxMEZcdTMwMDJcdTczRkVcdTY2NDJcdTcwQjlcdTMwNjdcdTZFOTZcdTUwOTlcdTMwNkFcdTMwNTdcdTMwMDJcbiAqIEN1c3RvbUhlYWRlclx1MzA5Mlx1NTIyOVx1NzUyOFx1MzA1N0pXVFx1MzBDOFx1MzBGQ1x1MzBBRlx1MzBGM1x1N0I0OVx1MzA2RVx1NTIyOVx1NzUyOFx1NTNFRlxuICovIGZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgICB9XG59XG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSBpbiBvYmopIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gICAgZm9yKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuICAgICAgICB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgICAgIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbihzeW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG52YXIgX19nZW5lcmF0b3IgPSB0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IgfHwgZnVuY3Rpb24odGhpc0FyZywgYm9keSkge1xuICAgIHZhciBmLCB5LCB0LCBnLCBfID0ge1xuICAgICAgICBsYWJlbDogMCxcbiAgICAgICAgc2VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAodFswXSAmIDEpIHRocm93IHRbMV07XG4gICAgICAgICAgICByZXR1cm4gdFsxXTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ5czogW10sXG4gICAgICAgIG9wczogW11cbiAgICB9O1xuICAgIHJldHVybiBnID0ge1xuICAgICAgICBuZXh0OiB2ZXJiKDApLFxuICAgICAgICBcInRocm93XCI6IHZlcmIoMSksXG4gICAgICAgIFwicmV0dXJuXCI6IHZlcmIoMilcbiAgICB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwKFtcbiAgICAgICAgICAgICAgICBuLFxuICAgICAgICAgICAgICAgIHZcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUoXyl0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtcbiAgICAgICAgICAgICAgICBvcFswXSAmIDIsXG4gICAgICAgICAgICAgICAgdC52YWx1ZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHN3aXRjaChvcFswXSl7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBvcFsxXTtcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gb3BbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgb3AgPSBbXG4gICAgICAgICAgICAgICAgNixcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgeSA9IDA7XG4gICAgICAgIH0gZmluYWxseXtcbiAgICAgICAgICAgIGYgPSB0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLFxuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cbn07XG52YXIgZ2V0Q3VzdG9tSGVhZGVyID0gZnVuY3Rpb24oYWNjZXNzVG9rZW4pIHtcbiAgICBpZiAoIWFjY2Vzc1Rva2VuKSByZXR1cm4ge307XG4gICAgcmV0dXJuIHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogXCJCZWFyZXIgXCIuY29uY2F0KGFjY2Vzc1Rva2VuKSxcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgIH07XG59O1xuZXhwb3J0IHZhciBmZXRjaEFwaSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24obWV0aG9kLCB1cmwpIHtcbiAgICAgICAgdmFyIHNlbmREYXRhLCB0b2tlbiwgZmV0Y2hQYXJhbXMsIGN1c3RvbUhlYWRlcjtcbiAgICAgICAgdmFyIF9hcmd1bWVudHMgPSBhcmd1bWVudHM7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfc3RhdGUpIHtcbiAgICAgICAgICAgIHNlbmREYXRhID0gX2FyZ3VtZW50cy5sZW5ndGggPiAyICYmIF9hcmd1bWVudHNbMl0gIT09IHZvaWQgMCA/IF9hcmd1bWVudHNbMl0gOiB7fSwgdG9rZW4gPSBfYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgX2FyZ3VtZW50c1szXSAhPT0gdm9pZCAwID8gX2FyZ3VtZW50c1szXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGZldGNoUGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLThcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYm9keTogdW5kZWZpbmVkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKG1ldGhvZC50b0xvd2VyQ2FzZSgpICE9PSBcImdldFwiKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGZldGNoUGFyYW1zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShzZW5kRGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgICBjdXN0b21IZWFkZXIgPSBnZXRDdXN0b21IZWFkZXIodG9rZW4pO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBmZXRjaFBhcmFtcy5oZWFkZXJzID0gX29iamVjdFNwcmVhZCh7fSwgZmV0Y2hQYXJhbXMuaGVhZGVycywgY3VzdG9tSGVhZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICBmZXRjaCh1cmwsIGZldGNoUGFyYW1zKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGZldGNoQXBpKG1ldGhvZCwgdXJsKSB7XG4gICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn0oKTtcbiIsICIvKipcbiAqIEBkZXNjIEFzc2V0cyBVcGxvYWRlciBTeXN0ZW1cbiAqIEByZWYgaHR0cHM6Ly9oaWtreS5hdGxhc3NpYW4ubmV0L3dpa2kvc3BhY2VzL1ZLRVRDTE9VRC9wYWdlcy80Mjc2ODc5ODFcbiAqLyBmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gICAgfVxufVxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxudmFyIF9fZ2VuZXJhdG9yID0gdGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yIHx8IGZ1bmN0aW9uKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgZiwgeSwgdCwgZywgXyA9IHtcbiAgICAgICAgbGFiZWw6IDAsXG4gICAgICAgIHNlbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdO1xuICAgICAgICAgICAgcmV0dXJuIHRbMV07XG4gICAgICAgIH0sXG4gICAgICAgIHRyeXM6IFtdLFxuICAgICAgICBvcHM6IFtdXG4gICAgfTtcbiAgICByZXR1cm4gZyA9IHtcbiAgICAgICAgbmV4dDogdmVyYigwKSxcbiAgICAgICAgXCJ0aHJvd1wiOiB2ZXJiKDEpLFxuICAgICAgICBcInJldHVyblwiOiB2ZXJiKDIpXG4gICAgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgICByZXR1cm4gc3RlcChbXG4gICAgICAgICAgICAgICAgbixcbiAgICAgICAgICAgICAgICB2XG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlKF8pdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbXG4gICAgICAgICAgICAgICAgb3BbMF0gJiAyLFxuICAgICAgICAgICAgICAgIHQudmFsdWVcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBzd2l0Y2gob3BbMF0pe1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHQgPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3BbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgICAgICAgICB5ID0gb3BbMV07XG4gICAgICAgICAgICAgICAgICAgIG9wID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG9wID0gXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCBvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gdFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gdFsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ub3BzLnB1c2gob3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIG9wID0gW1xuICAgICAgICAgICAgICAgIDYsXG4gICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHkgPSAwO1xuICAgICAgICB9IGZpbmFsbHl7XG4gICAgICAgICAgICBmID0gdCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgfTtcbiAgICB9XG59O1xuaW1wb3J0IHsgZ2V0Q29uZmlnIH0gZnJvbSBcIi4uLy4uL2NvbmZpZ3NcIjtcbmltcG9ydCB7IGZldGNoQXBpIH0gZnJvbSBcIi4uL2FwaVwiO1xudmFyIGNvbmZpZyA9IGdldENvbmZpZygpO1xuLy8gXHU1N0ZBXHU2NzJDXHU3Njg0XHUzMDZCXHUzMDZGXHU2NzJDXHU3NTZBXHUzMDkyXHUzMDY0XHUzMDZBXHUzMDRFXHUzMDZCXHUzMDQ0XHUzMDRGXHUzMDAyXHU2NzYxXHU0RUY2XHU0RTAwXHU4MUY0XHUzMDY3c3RhZ2luZ1xudmFyIGRvbWFpbiA9IGNvbmZpZy51cGxvYWRBcGlEb21haW47XG5leHBvcnQgdmFyIEFzc2V0c1JlcG9zaXRvcnkgPSB7XG4gICAgZ2V0OiB7XG4gICAgICAgIGdldEFzc2V0czogLyoqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJRFRva2VuXHUzMDkyXHUzMDgyXHUzMDY4XHUzMDZCXHUzMEEyXHUzMEJCXHUzMEMzXHUzMEM4XHUzMEM3XHUzMEZDXHUzMEJGXHUzMDZFXHU0RTAwXHU4OUE3XHUzMDkyXHU1M0Q2XHU1Rjk3XHUzMDU5XHUzMDhCXG4gICAgICogQHJlZiBodHRwczovL2hpa2t5LmF0bGFzc2lhbi5uZXQvd2lraS9zcGFjZXMvQktTL3BhZ2VzLzQyNzY4Nzk4MSMlRTMlODIlQTIlRTMlODIlQkIlRTMlODMlODMlRTMlODMlODglRTQlQjglODAlRTglQTYlQTclRTUlOEYlOTYlRTUlQkUlOTdcbiAgICAgKi8gZnVuY3Rpb24gZ2V0QXNzZXRzKGlkVG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hBcGkoXCJnZXRcIiwgXCJcIi5jb25jYXQoZG9tYWluLCBcIi9hc3NldHM/c2V0dGluZ19sYWJlbD12cm1cIiksIHVuZGVmaW5lZCwgaWRUb2tlbilcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEFzc2V0QnlUb2tlbjogLyoqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBcdTMwQzBcdTMwQTZcdTMwRjNcdTMwRURcdTMwRkNcdTMwQzlUb2tlblx1MzA2OFx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA5Mlx1MzA4Mlx1MzA2OFx1MzA2Qlx1NUJGRVx1OEM2MVx1MzA2RVx1MzBBMlx1MzBCQlx1MzBDM1x1MzBDOFx1MzBDN1x1MzBGQ1x1MzBCRlx1MzA5Mlx1NTNENlx1NUY5N1x1MzA1OVx1MzA4QlxuICAgICAqIEByZWYgaHR0cHM6Ly9oaWtreS5hdGxhc3NpYW4ubmV0L3dpa2kvc3BhY2VzL0JLUy9wYWdlcy80Mjc2ODc5ODEjJUUzJTgzJTg4JUUzJTgzJUJDJUUzJTgyJUFGJUUzJTgzJUIzJUUzJTgxJThCJUUzJTgyJTg5JUUzJTgxJUFFJUUzJTgzJTg3JUUzJTgzJUJDJUUzJTgyJUJGJUU1JThGJTk2JUU1JUJFJTk3XG4gICAgICovIGZ1bmN0aW9uIGdldEFzc2V0QnlUb2tlbigpIHtcbiAgICAgICAgICAgIHZhciBkb3dubG9hZFRva2VuID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMF0gOiBcIlwiLCBwYXNzd29yZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdm9pZCAwID8gYXJndW1lbnRzWzFdIDogXCJcIjtcbiAgICAgICAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hBcGkoXCJnZXRcIiwgXCJcIi5jb25jYXQoZG9tYWluLCBcIi90b2tlbnMvXCIpLmNvbmNhdChkb3dubG9hZFRva2VuLCBcIj9wYXNzd29yZD1cIikuY29uY2F0KHBhc3N3b3JkKSlcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHBvc3Q6IHtcbiAgICAgICAgcG9zdEFzc2V0OiAvKipcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFx1MzBBMlx1MzBCQlx1MzBDM1x1MzBDOFx1MzBDN1x1MzBGQ1x1MzBCRlx1NEY1Q1x1NjIxMFx1MzBGQlx1MzBBMlx1MzBDM1x1MzBEN1x1MzBFRFx1MzBGQ1x1MzBDOVx1NzUyOFVSTFx1NTNENlx1NUY5N1xuICAgICAqIEByZWYgaHR0cHM6Ly9oaWtreS5hdGxhc3NpYW4ubmV0L3dpa2kvc3BhY2VzL0JLUy9wYWdlcy80Mjc2ODc5ODEjJUUzJTgyJUEyJUUzJTgyJUJCJUUzJTgzJTgzJUUzJTgzJTg4JUU3JTk5JUJCJUU5JThDJUIyXG4gICAgICovIGZ1bmN0aW9uIHBvc3RBc3NldChpZFRva2VuLCBuYW1lKSB7XG4gICAgICAgICAgICB2YXIgZGVzY3JpcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1syXSA6IFwiXCI7XG4gICAgICAgICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9zdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoQXBpKFwicG9zdFwiLCBcIlwiLmNvbmNhdChkb21haW4sIFwiL2Fzc2V0c1wiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBpZFRva2VuKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdEFzc2V0VG9rZW46IC8qKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogXHUzMEEyXHUzMEJCXHUzMEMzXHUzMEM4XHUzMDZFXHUzMEM4XHUzMEZDXHUzMEFGXHUzMEYzXHUzMDkyXHU3NjdBXHU4ODRDXHUzMDU5XHUzMDhCXG4gICAgICogQHJlZiBodHRwczovL2hpa2t5LmF0bGFzc2lhbi5uZXQvd2lraS9zcGFjZXMvQktTL3BhZ2VzLzQyNzY4Nzk4MSMlRTMlODMlODclRTMlODMlQkMlRTMlODIlQkYlRTUlODUlQjElRTYlOUMlODklRTclOTQlQTglRTMlODMlODglRTMlODMlQkMlRTMlODIlQUYlRTMlODMlQjMlRTQlQkQlOUMlRTYlODglOTAuMVxuICAgICAqLyBmdW5jdGlvbiBwb3N0QXNzZXRUb2tlbihpZFRva2VuLCB1dWlkKSB7XG4gICAgICAgICAgICB2YXIgcGFzc3dvcmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1syXSA6IFwiXCI7XG4gICAgICAgICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9zdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoQXBpKFwicG9zdFwiLCBcIlwiLmNvbmNhdChkb21haW4sIFwiL3Rva2Vuc1wiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV1aWQ6IHV1aWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBpZFRva2VuKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcHV0OiB7fSxcbiAgICBkZWxldGU6IHt9XG59O1xuIiwgIi8qKlxuICogQGRlc2MgQXV0aCBSZXBvc2l0b3J5XG4gKiBAcmVmIGh0dHBzOi8vaGlra3kuYXRsYXNzaWFuLm5ldC93aWtpL3NwYWNlcy9BQ0NPVU5UL3BhZ2VzLzQ2MjI1ODQxMS9KUytJRFxuICovIGZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgICB9XG59XG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG52YXIgX19nZW5lcmF0b3IgPSB0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IgfHwgZnVuY3Rpb24odGhpc0FyZywgYm9keSkge1xuICAgIHZhciBmLCB5LCB0LCBnLCBfID0ge1xuICAgICAgICBsYWJlbDogMCxcbiAgICAgICAgc2VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAodFswXSAmIDEpIHRocm93IHRbMV07XG4gICAgICAgICAgICByZXR1cm4gdFsxXTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ5czogW10sXG4gICAgICAgIG9wczogW11cbiAgICB9O1xuICAgIHJldHVybiBnID0ge1xuICAgICAgICBuZXh0OiB2ZXJiKDApLFxuICAgICAgICBcInRocm93XCI6IHZlcmIoMSksXG4gICAgICAgIFwicmV0dXJuXCI6IHZlcmIoMilcbiAgICB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwKFtcbiAgICAgICAgICAgICAgICBuLFxuICAgICAgICAgICAgICAgIHZcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUoXyl0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtcbiAgICAgICAgICAgICAgICBvcFswXSAmIDIsXG4gICAgICAgICAgICAgICAgdC52YWx1ZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHN3aXRjaChvcFswXSl7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBvcFsxXTtcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gb3BbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgb3AgPSBbXG4gICAgICAgICAgICAgICAgNixcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgeSA9IDA7XG4gICAgICAgIH0gZmluYWxseXtcbiAgICAgICAgICAgIGYgPSB0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLFxuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cbn07XG5pbXBvcnQgeyBnZXRDb25maWcgfSBmcm9tIFwiLi4vLi4vY29uZmlnc1wiO1xuaW1wb3J0IHsgZmV0Y2hBcGkgfSBmcm9tIFwiLi4vYXBpXCI7XG52YXIgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG4vLyBcdTU3RkFcdTY3MkNcdTc2ODRcdTMwNkJcdTMwNkZcdTY3MkNcdTc1NkFcdTMwOTJcdTMwNjRcdTMwNkFcdTMwNEVcdTMwNkJcdTMwNDRcdTMwNEZcdTMwMDJcdTY3NjFcdTRFRjZcdTRFMDBcdTgxRjRcdTMwNjdzdGFnaW5nXG52YXIgZG9tYWluID0gY29uZmlnLmFjY291bnRBcGlEb21haW47XG52YXIgZ2V0UHJlZml4ID0gXCIvYXBpL3YxXCI7XG52YXIgcG9zdFByZWZpeCA9IFwiL29hdXRoXCI7XG5leHBvcnQgdmFyIEF1dGhSZXBvc2l0b3J5ID0ge1xuICAgIGdldDoge1xuICAgICAgICBmZXRjaE15UHJvZmlsZTogLyoqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBhY2Nlc3NUb2tlblx1MzA5Mlx1MzA4Mlx1MzA2OFx1MzA2Qlx1ODFFQVx1NTIwNlx1MzA2RVx1MzBEN1x1MzBFRFx1MzBENVx1MzBBM1x1MzBGQ1x1MzBFQlx1MzA5Mlx1NTNENlx1NUY5N1x1MzA1OVx1MzA4QlxuICAgICAqIEByZWYgaHR0cHM6Ly9oaWtreS5hdGxhc3NpYW4ubmV0L3dpa2kvc3BhY2VzL0FDQ09VTlQvcGFnZXMvNDYyMjU4NDExL0pTK0lEIzYuLSVFMyU4MyU5NyVFMyU4MyVBRCVFMyU4MyU5NSVFMyU4MiVBMyVFMyU4MyVCQyVFMyU4MyVBQiVFMyU4MSVBRSVFNSU4RiU5NiVFNSVCRSU5N1xuICAgICAqLyBmdW5jdGlvbiBmZXRjaE15UHJvZmlsZShhY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmZXRjaEFwaShcImdldFwiLCBcIlwiLmNvbmNhdChkb21haW4pLmNvbmNhdChnZXRQcmVmaXgsIFwiL21lXCIpLCB1bmRlZmluZWQsIGFjY2Vzc1Rva2VuKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcG9zdDoge1xuICAgICAgICBpc3N1ZUlkVG9rZW46IC8qKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogXHUzMEEyXHUzMEJCXHUzMEMzXHUzMEM4XHUzMEM3XHUzMEZDXHUzMEJGXHU0RjVDXHU2MjEwXHUzMEZCXHUzMEEyXHUzMEMzXHUzMEQ3XHUzMEVEXHUzMEZDXHUzMEM5XHU3NTI4VVJMXHU1M0Q2XHU1Rjk3XG4gICAgICogQHJlZiBodHRwczovL2hpa2t5LmF0bGFzc2lhbi5uZXQvd2lraS9zcGFjZXMvQUNDT1VOVC9wYWdlcy80NjIyNTg0MTEvSlMrSUQjNC4tSlMtJUUzJTgxJUE3JUUzJTgyJUEyJUUzJTgyJUFGJUUzJTgyJUJCJUUzJTgyJUI5JUUzJTgzJTg4JUUzJTgzJUJDJUUzJTgyJUFGJUUzJTgzJUIzJTJGSUQlRTMlODMlODglRTMlODMlQkMlRTMlODIlQUYlRTMlODMlQjMoJUU1JTg2JThEJUU1JThGJTk2JUU1JUJFJTk3KSVFMyU4MiU5MiVFOCVBMSU4QyVFMyU4MSU4NlxuICAgICAqLyBmdW5jdGlvbiBpc3N1ZUlkVG9rZW4oY2xpZW50SWQsIHJlZGlyZWN0VXJpLCByZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hBcGkoXCJwb3N0XCIsIFwiXCIuY29uY2F0KGRvbWFpbikuY29uY2F0KHBvc3RQcmVmaXgsIFwiL3Rva2VuXCIpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnRfdHlwZTogXCJyZWZyZXNoX3Rva2VuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHJlZnJlc2hUb2tlblxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcHV0OiB7fSxcbiAgICBkZWxldGU6IHt9XG59O1xuIiwgImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgICB9XG59XG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG52YXIgX19nZW5lcmF0b3IgPSB0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IgfHwgZnVuY3Rpb24odGhpc0FyZywgYm9keSkge1xuICAgIHZhciBmLCB5LCB0LCBnLCBfID0ge1xuICAgICAgICBsYWJlbDogMCxcbiAgICAgICAgc2VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAodFswXSAmIDEpIHRocm93IHRbMV07XG4gICAgICAgICAgICByZXR1cm4gdFsxXTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ5czogW10sXG4gICAgICAgIG9wczogW11cbiAgICB9O1xuICAgIHJldHVybiBnID0ge1xuICAgICAgICBuZXh0OiB2ZXJiKDApLFxuICAgICAgICBcInRocm93XCI6IHZlcmIoMSksXG4gICAgICAgIFwicmV0dXJuXCI6IHZlcmIoMilcbiAgICB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwKFtcbiAgICAgICAgICAgICAgICBuLFxuICAgICAgICAgICAgICAgIHZcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUoXyl0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtcbiAgICAgICAgICAgICAgICBvcFswXSAmIDIsXG4gICAgICAgICAgICAgICAgdC52YWx1ZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHN3aXRjaChvcFswXSl7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBvcFsxXTtcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gb3BbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgb3AgPSBbXG4gICAgICAgICAgICAgICAgNixcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgeSA9IDA7XG4gICAgICAgIH0gZmluYWxseXtcbiAgICAgICAgICAgIGYgPSB0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLFxuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cbn07XG5pbXBvcnQgeyBnZXRDb25maWcgfSBmcm9tIFwiLi4vLi4vY29uZmlnc1wiO1xuaW1wb3J0IHsgZmV0Y2hBcGkgfSBmcm9tIFwiLi4vYXBpXCI7XG52YXIgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG52YXIgTEFCT19QTEFURk9STV9DT0RFID0gXCJsYWJvXCI7XG4vLyBcdTU3RkFcdTY3MkNcdTc2ODRcdTMwNkJcdTMwNkZcdTY3MkNcdTc1NkFcdTMwOTJcdTMwNjRcdTMwNkFcdTMwNEVcdTMwNkJcdTMwNDRcdTMwNEZcdTMwMDJcdTY3NjFcdTRFRjZcdTRFMDBcdTgxRjRcdTMwNjdzdGFnaW5nXG52YXIgZG9tYWluID0gY29uZmlnLmFjY291bnRBcGlEb21haW47XG52YXIgYmFzZVVybCA9IFwiXCIuY29uY2F0KGRvbWFpbiwgXCIvYXBpL1wiKS5jb25jYXQoTEFCT19QTEFURk9STV9DT0RFKTtcbmV4cG9ydCB2YXIgUHJvZmlsZVJlcG9zaXRvcnkgPSB7XG4gICAgZ2V0OiB7XG4gICAgICAgIC8qKlxuICAgICAqIEByZW1hcmtzIFx1NjMwN1x1NUI5QVx1MzA2RWlkXHUzMDZFXHUzMEU2XHUzMEZDXHUzMEI2XHUzMEZDXHUzMEQ3XHUzMEVEXHUzMEQ1XHUzMEEzXHUzMEZDXHUzMEVCXHU1M0Q2XHU1Rjk3XG4gICAgICogQHJldHVybiB7UHJvbWlzZTx7cHJvZmlsZTogUHJvZmlsZX0+fVxuICAgICAqIEByZWYgaHR0cHM6Ly9oaWtreS5hdGxhc3NpYW4ubmV0L3dpa2kvc3BhY2VzL1ZSTU1PL3BhZ2VzLzUzNDI0OTUwNiMlRTMlODMlOTclRTMlODMlQUQlRTMlODMlOTUlRTMlODIlQTMlRTMlODMlQkMlRTMlODMlQUIlRTUlOEYlOTYlRTUlQkUlOTdcbiAgICAgKi8gZ2V0UHJvZmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmZXRjaEFwaShcImdldFwiLCBcIlwiLmNvbmNhdChiYXNlVXJsLCBcIi91c2VyL3Byb2ZpbGVzL1wiKS5jb25jYXQodXNlcklkKSlcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KCksXG4gICAgICAgIC8qKlxuICAgICAqIEByZW1hcmtzIFx1ODFFQVx1NTIwNlx1MzA2RVx1MzBEN1x1MzBFRFx1MzBENVx1MzBBM1x1MzBGQ1x1MzBFQlx1NTNENlx1NUY5N1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8e3Byb2ZpbGU6IFByb2ZpbGV9Pn1cbiAgICAgKiBAcmVmIGh0dHBzOi8vaGlra3kuYXRsYXNzaWFuLm5ldC93aWtpL3NwYWNlcy9WUk1NTy9wYWdlcy81MzQyNDk1MDYjJUU4JTg3JUFBJUU1JTg4JTg2JUUzJTgxJUFFJUUzJTgzJTk3JUUzJTgzJUFEJUUzJTgzJTk1JUUzJTgyJUEzJUUzJTgzJUJDJUUzJTgzJUFCJUU1JThGJTk2JUU1JUJFJTk3XG4gICAgICovIGdldE15UHJvZmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKGlkVG9rZW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hBcGkoXCJnZXRcIiwgXCJcIi5jb25jYXQoYmFzZVVybCwgXCIvdXNlci9wcm9maWxlc1wiKSwgdW5kZWZpbmVkLCBpZFRva2VuKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oaWRUb2tlbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KCksXG4gICAgICAgIC8qKlxuICAgICAqIEByZW1hcmtzIFx1NjMwN1x1NUI5QVx1MzA2RXV1aWRcdTMwNkVcdTMwQjJcdTMwQjlcdTMwQzhcdTMwRTZcdTMwRkNcdTMwQjZcdTMwRkNcdTMwRDdcdTMwRURcdTMwRDVcdTMwQTNcdTMwRkNcdTMwRUJcdTUzRDZcdTVGOTdcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHtndWVzdF9wcm9maWxlOiBQcm9maWxlfT59XG4gICAgICogQHJlZiBUT0RPXG4gICAgICovIGdldEd1ZXN0UHJvZmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKHV1aWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hBcGkoXCJnZXRcIiwgXCJcIi5jb25jYXQoYmFzZVVybCwgXCIvdXNlci9ndWVzdF9wcm9maWxlcy9cIikuY29uY2F0KHV1aWQpKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odXVpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KClcbiAgICB9LFxuICAgIHBvc3Q6IHtcbiAgICAgICAgLyoqXG4gICAgICogQHJlbWFya3MgXHUzMEQ3XHUzMEVEXHUzMEQ1XHUzMEEzXHUzMEZDXHUzMEVCXHU0RjVDXHU2MjEwXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx7cHJvZmlsZTogUHJvZmlsZX0+fVxuICAgICAqIEByZWYgaHR0cHM6Ly9oaWtreS5hdGxhc3NpYW4ubmV0L3dpa2kvc3BhY2VzL1ZSTU1PL3BhZ2VzLzUzNDI0OTUwNiMlRTMlODMlOTclRTMlODMlQUQlRTMlODMlOTUlRTMlODIlQTMlRTMlODMlQkMlRTMlODMlQUIlRTQlQkQlOUMlRTYlODglOTBcbiAgICAgKi8gcG9zdFByb2ZpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbihpZFRva2VuLCBuYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9zdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoQXBpKFwicG9zdFwiLCBcIlwiLmNvbmNhdChiYXNlVXJsLCBcIi91c2VyL3Byb2ZpbGVzXCIpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgaWRUb2tlbilcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGlkVG9rZW4sIG5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSgpLFxuICAgICAgICAvKipcbiAgICAgKiBAcmVtYXJrcyBcdTMwQjJcdTMwQjlcdTMwQzhcdTMwRDdcdTMwRURcdTMwRDVcdTMwQTNcdTMwRkNcdTMwRUJcdTRGNUNcdTYyMTBcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHtndWVzdF9wcm9maWxlOiBQcm9maWxlfT59XG4gICAgICogQHJlZiBUT0RPXG4gICAgICovIHBvc3RHdWVzdFByb2ZpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbih1dWlkLCBuYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9zdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoQXBpKFwicG9zdFwiLCBcIlwiLmNvbmNhdChiYXNlVXJsLCBcIi91c2VyL2d1ZXN0X3Byb2ZpbGVzXCIpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZDogdXVpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odXVpZCwgbmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KCksXG4gICAgICAgIC8qKlxuICAgICAqIEByZW1hcmtzIFx1MzBEN1x1MzBFRFx1MzBENVx1MzBBM1x1MzBGQ1x1MzBFQlx1NEUwMFx1ODlBN1x1NTNENlx1NUY5N1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8e3Byb2ZpbGVzOiBQcm9maWxlfT59XG4gICAgICogQHJlZiBUT0RPXG4gICAgICovIHBvc3RQcm9maWxlTGlzdDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKHVzZXJJZHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hBcGkoXCJwb3N0XCIsIFwiXCIuY29uY2F0KGJhc2VVcmwsIFwiL3VzZXIvcHJvZmlsZXMvbGlzdFwiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJZHM6IHVzZXJJZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih1c2VySWRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0oKSxcbiAgICAgICAgLyoqXG4gICAgICogQHJlbWFya3MgXHUzMEIyXHUzMEI5XHUzMEM4XHUzMEQ3XHUzMEVEXHUzMEQ1XHUzMEEzXHUzMEZDXHUzMEVCXHU0RTAwXHU4OUE3XHU1M0Q2XHU1Rjk3XG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gdXVpZHNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHtndWVzdF9wcm9maWxlczogUHJvZmlsZX0+fVxuICAgICAqIEByZWYgVE9ET1xuICAgICAqLyBwb3N0R3Vlc3RQcm9maWxlTGlzdDogZnVuY3Rpb24odXVpZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBmZXRjaEFwaShcInBvc3RcIiwgXCJcIi5jb25jYXQoYmFzZVVybCwgXCIvdXNlci9ndWVzdF9wcm9maWxlcy9saXN0XCIpLCB7XG4gICAgICAgICAgICAgICAgdXVpZHM6IHV1aWRzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcHV0OiB7XG4gICAgICAgIC8qKlxuICAgICAqIEByZW1hcmtzIFx1MzBEN1x1MzBFRFx1MzBENVx1MzBBM1x1MzBGQ1x1MzBFQlx1N0RFOFx1OTZDNlxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8e3Byb2ZpbGU6IFByb2ZpbGV9Pn1cbiAgICAgKiBAcmVmIGh0dHBzOi8vaGlra3kuYXRsYXNzaWFuLm5ldC93aWtpL3NwYWNlcy9WUk1NTy9wYWdlcy81MzQyNDk1MDYjJUUzJTgzJTk3JUUzJTgzJUFEJUUzJTgzJTk1JUUzJTgyJUEzJUUzJTgzJUJDJUUzJTgzJUFCJUU3JUI3JUE4JUU5JTlCJTg2XG4gICAgICovIHB1dFByb2ZpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbihpZFRva2VuLCBuYW1lLCBpbnRyb2R1Y3Rpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hBcGkoXCJwdXRcIiwgXCJcIi5jb25jYXQoYmFzZVVybCwgXCIvdXNlci9wcm9maWxlc1wiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm9kdWN0aW9uOiBpbnRyb2R1Y3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGlkVG9rZW4pXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihpZFRva2VuLCBuYW1lLCBpbnRyb2R1Y3Rpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSgpLFxuICAgICAgICAvKipcbiAgICAgKiBAcmVtYXJrcyBcdTMwRDdcdTMwRURcdTMwRDVcdTMwQTNcdTMwRkNcdTMwRUJcdTMwQTJcdTMwQTRcdTMwQjNcdTMwRjNcdTdERThcdTk2QzZcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHtwcm9maWxlOiBQcm9maWxlfT59XG4gICAgICogQHJlZiBodHRwczovL2hpa2t5LmF0bGFzc2lhbi5uZXQvd2lraS9zcGFjZXMvVlJNTU8vcGFnZXMvNTM0MjQ5NTA2IyVFMyU4MyU5NyVFMyU4MyVBRCVFMyU4MyU5NSVFMyU4MiVBMyVFMyU4MyVCQyVFMyU4MyVBQiVFNyVCNyVBOCVFOSU5QiU4NlxuICAgICAqLyBwdXRQcm9maWxlSWNvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKGlkVG9rZW4sIGljb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgZm9ybURhdGEsIGZldGNoUGFyYW1zO1xuICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiaWNvblwiLCBpY29uKTtcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwicHV0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogXCJCZWFyZXIgXCIuY29uY2F0KGlkVG9rZW4pXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogZm9ybURhdGFcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmZXRjaChcIlwiLmNvbmNhdChiYXNlVXJsLCBcIi91c2VyL3Byb2ZpbGVzXCIpLCBmZXRjaFBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGlkVG9rZW4sIGljb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSgpLFxuICAgICAgICAvKipcbiAgICAgKiBAcmVtYXJrcyBcdTMwQjJcdTMwQjlcdTMwQzhcdTMwRDdcdTMwRURcdTMwRDVcdTMwQTNcdTMwRkNcdTMwRUJcdTdERThcdTk2QzZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXVpZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGludHJvZHVjdGlvblxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8e2d1ZXN0X3Byb2ZpbGU6IFByb2ZpbGV9Pn1cbiAgICAgKiBAcmVmIFRPRE9cbiAgICAgKi8gcHV0R3Vlc3RQcm9maWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24odXVpZCwgbmFtZSwgaW50cm9kdWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9zdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoQXBpKFwicHV0XCIsIFwiXCIuY29uY2F0KGJhc2VVcmwsIFwiL3VzZXIvZ3Vlc3RfcHJvZmlsZXMvXCIpLmNvbmNhdCh1dWlkKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm9kdWN0aW9uOiBpbnRyb2R1Y3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih1dWlkLCBuYW1lLCBpbnRyb2R1Y3Rpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSgpLFxuICAgICAgICAvKipcbiAgICAgKiBAcmVtYXJrcyBcdTMwQjJcdTMwQjlcdTMwQzhcdTMwRDdcdTMwRURcdTMwRDVcdTMwQTNcdTMwRkNcdTMwRUJcdTMwQTJcdTMwQTRcdTMwQjNcdTMwRjNcdTdERThcdTk2QzZcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHtndWVzdF9wcm9maWxlOiBQcm9maWxlfT59XG4gICAgICogQHJlZiBUT0RPXG4gICAgICovIHB1dEd1ZXN0UHJvZmlsZUljb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbih1dWlkLCBpY29uKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZvcm1EYXRhLCBmZXRjaFBhcmFtcztcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChcImljb25cIiwgaWNvbik7XG4gICAgICAgICAgICAgICAgICAgIGZldGNoUGFyYW1zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcInB1dFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogZm9ybURhdGFcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmZXRjaChcIlwiLmNvbmNhdChiYXNlVXJsLCBcIi91c2VyL2d1ZXN0X3Byb2ZpbGVzL1wiKS5jb25jYXQodXVpZCksIGZldGNoUGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odXVpZCwgaWNvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KClcbiAgICB9LFxuICAgIGRlbGV0ZToge31cbn07XG4iLCAiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX25leHQodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbnZhciBfX2dlbmVyYXRvciA9IHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvciB8fCBmdW5jdGlvbih0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIGYsIHksIHQsIGcsIF8gPSB7XG4gICAgICAgIGxhYmVsOiAwLFxuICAgICAgICBzZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTtcbiAgICAgICAgICAgIHJldHVybiB0WzFdO1xuICAgICAgICB9LFxuICAgICAgICB0cnlzOiBbXSxcbiAgICAgICAgb3BzOiBbXVxuICAgIH07XG4gICAgcmV0dXJuIGcgPSB7XG4gICAgICAgIG5leHQ6IHZlcmIoMCksXG4gICAgICAgIFwidGhyb3dcIjogdmVyYigxKSxcbiAgICAgICAgXCJyZXR1cm5cIjogdmVyYigyKVxuICAgIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odikge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXAoW1xuICAgICAgICAgICAgICAgIG4sXG4gICAgICAgICAgICAgICAgdlxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZShfKXRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW1xuICAgICAgICAgICAgICAgIG9wWzBdICYgMixcbiAgICAgICAgICAgICAgICB0LnZhbHVlXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgc3dpdGNoKG9wWzBdKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgICAgICAgICAgeSA9IG9wWzFdO1xuICAgICAgICAgICAgICAgICAgICBvcCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgb3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSBvcFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBfLm9wcy5wdXNoKG9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBvcCA9IFtcbiAgICAgICAgICAgICAgICA2LFxuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB5ID0gMDtcbiAgICAgICAgfSBmaW5hbGx5e1xuICAgICAgICAgICAgZiA9IHQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsXG4gICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxufTtcbmltcG9ydCB7IGdldENvbmZpZyB9IGZyb20gXCIuLi8uLi9jb25maWdzXCI7XG5pbXBvcnQgeyBmZXRjaEFwaSB9IGZyb20gXCIuLi9hcGlcIjtcbnZhciBjb25maWcgPSBnZXRDb25maWcoKTtcbi8vIFx1NTdGQVx1NjcyQ1x1NzY4NFx1MzA2Qlx1MzA2Rlx1NjcyQ1x1NzU2QVx1MzA5Mlx1MzA2NFx1MzA2QVx1MzA0RVx1MzA2Qlx1MzA0NFx1MzA0Rlx1MzAwMlx1Njc2MVx1NEVGNlx1NEUwMFx1ODFGNFx1MzA2N3N0YWdpbmdcbnZhciBkb21haW4gPSBjb25maWcucm9vbURvbWFpbjtcbnZhciBjb21tb25DYWxsYmFjayA9IGZ1bmN0aW9uKGZldGNoZWQsIG9wdGlvbikge1xuICAgIGlmIChmZXRjaGVkLnN0YXR1cyA9PT0gMjAwICYmIG9wdGlvbi5kb25lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9uLmRvbmUoKTtcbiAgICAgICAgcmV0dXJuIGZldGNoZWQ7XG4gICAgfVxuICAgIGlmIChmZXRjaGVkLnN0YXR1cyAhPT0gMjAwICYmIG9wdGlvbi5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbi5lcnJvcigpO1xuICAgIH1cbiAgICByZXR1cm4gZmV0Y2hlZDtcbn07XG5leHBvcnQgdmFyIFJvb21SZXBvc2l0b3J5ID0ge1xuICAgIGdldDoge1xuICAgICAgICBnZXRBY3RpdmVSb29tczogLyoqXG4gICAgICogQHJlZmVyZW5jZVxuICAgICAqIGh0dHBzOi8vaGlra3kuYXRsYXNzaWFuLm5ldC93aWtpL3NwYWNlcy9WS0VUQ0xPVUQvcGFnZXMvMTkzMjY2MTIyL0FQSVxuICAgICAqIFx1NTQwQ1x1MzBFRlx1MzBGQ1x1MzBFQlx1MzBDOVx1NTE4NVx1MzA2RVx1MzBFQlx1MzBGQ1x1MzBFMFx1NTNENlx1NUY5N1xuICAgICAqLyBmdW5jdGlvbiBnZXRBY3RpdmVSb29tcyh3b3JsZElkLCBvcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmV0Y2hlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChfc3RhdGUubGFiZWwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JsZElkID09PSB1bmRlZmluZWQgfHwgd29ybGRJZCA9PT0gbnVsbCB8fCB3b3JsZElkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hBcGkoXCJnZXRcIiwgXCJcIi5jb25jYXQoZG9tYWluLCBcIi9yb29tcy93b3JsZC9cIikuY29uY2F0KHdvcmxkSWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hlZCA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uQ2FsbGJhY2soZmV0Y2hlZCwgb3B0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFJhbmRvbVJvb206IC8qKlxuICAgICAqIEByZWZlcmVuY2VcbiAgICAgKiBodHRwczovL2hpa2t5LmF0bGFzc2lhbi5uZXQvd2lraS9zcGFjZXMvVktFVENMT1VEL3BhZ2VzLzE5MzI2NjEyMi9BUElcbiAgICAgKiBcdTkwRThcdTVDNEJcdTMwNkVcdTMwRTlcdTMwRjNcdTMwQzBcdTMwRTBcdTUxNjVcdTU4MzRcbiAgICAgKi8gZnVuY3Rpb24gZ2V0UmFuZG9tUm9vbSh3b3JsZElkLCBvcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmV0Y2hlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChfc3RhdGUubGFiZWwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JsZElkID09PSB1bmRlZmluZWQgfHwgd29ybGRJZCA9PT0gbnVsbCB8fCB3b3JsZElkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hBcGkoXCJnZXRcIiwgXCJcIi5jb25jYXQoZG9tYWluLCBcIi9yb29tcy9yYW5kb20vXCIpLmNvbmNhdCh3b3JsZElkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoZWQgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbkNhbGxiYWNrKGZldGNoZWQsIG9wdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRSb29tOiAvKipcbiAgICAgKiBAcmVmZXJlbmNlXG4gICAgICogaHR0cHM6Ly9oaWtreS5hdGxhc3NpYW4ubmV0L3dpa2kvc3BhY2VzL1ZLRVRDTE9VRC9wYWdlcy8xOTMyNjYxMjIvQVBJXG4gICAgICogXHUzMEVCXHUzMEZDXHUzMEUwXHUzMDc4XHUzMDZFXHU1MTY1XHU1ODM0XG4gICAgICpcbiAgICAgKiBcdTMwRUJcdTMwRkNcdTMwRTBcdTMwNENcdTVCNThcdTU3MjhcdTMwNTlcdTMwOEJcdTU4MzRcdTU0MDhcdTMwNkJcdTMwNkZcdTMwMDF3b3JsZF9pZFx1MzA2Rlx1NzEyMVx1ODk5Nlx1MzA1NVx1MzA4Q1x1MzA4Qlx1MzAwMlxuICAgICAqIFx1NjcwOVx1NTJCOVx1MzA2QVx1MzBFQlx1MzBGQ1x1MzBFMElEXHUzMDRCXHUzMDY0XHUzMEVCXHUzMEZDXHUzMEUwXHUzMDRDXHU5NzVFXHUzMEEyXHUzMEFGXHUzMEM2XHUzMEEzXHUzMEQ2KFx1NTI0QVx1OTY2NFx1NkUwOFx1MzA3Rlx1NzJCNlx1NjE0QilcdTMwNjd3b3JsZF9pZFx1MzA0Q1x1MzBEMVx1MzBFOVx1MzBFMVx1MzBGQ1x1MzBCRlx1MzA2Qlx1NUI1OFx1NTcyOFx1MzA1OVx1MzA4Qlx1NTgzNFx1NTQwOFx1MzAwMXdvcmxkX2lkXHUzMDkyXHU0RjdGXHUzMDYzXHUzMDY2XHUzMEVCXHUzMEZDXHUzMEUwXHUzMDRDXHU1MThEXHU0RjVDXHU2MjEwXHUzMDU1XHUzMDhDXHUzMDhCXG4gICAgICogXHUyMDNCcGxheWVyX2NvdW50XHUzMDZGXHU4MUVBXHU1MjA2XHUzMDgyXHU1MTY1XHUzMDhDXHUzMDVGXHU2NTcwXHUzMDRDXHU4RkQ0XHUzMDYzXHUzMDY2XHUzMDRGXHUzMDhCXG4gICAgICovIGZ1bmN0aW9uIGdldFJvb20ocm9vbUlkLCBvcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgd29ybGRJZCwgZmV0Y2hlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChfc3RhdGUubGFiZWwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb29tSWQgPT09IHVuZGVmaW5lZCB8fCByb29tSWQgPT09IG51bGwgfHwgcm9vbUlkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRJZCA9IG9wdGlvbi53b3JsZF9pZCB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoQXBpKFwiZ2V0XCIsIFwiXCIuY29uY2F0KGRvbWFpbiwgXCIvcm9vbXMvXCIpLmNvbmNhdChyb29tSWQsIFwiL1wiKS5jb25jYXQod29ybGRJZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaGVkID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25DYWxsYmFjayhmZXRjaGVkLCBvcHRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Um9vbVN0YXR1czogLyoqXG4gICAgICogQHJlZmVyZW5jZVxuICAgICAqIGh0dHBzOi8vaGlra3kuYXRsYXNzaWFuLm5ldC93aWtpL3NwYWNlcy9WS0VUQ0xPVUQvcGFnZXMvMTkzMjY2MTIyL0FQSVxuICAgICAqIFx1MzBFQlx1MzBGQ1x1MzBFMFx1NjBDNVx1NTgzMVx1MzA2RVx1NTNENlx1NUY5Ny9KUlx1Njg0OFx1NEVGNlx1OEZGRFx1NTJBMFxuICAgICAqLyBmdW5jdGlvbiBnZXRSb29tU3RhdHVzKHJvb21JZCwgb3B0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZldGNoZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9zdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9vbUlkID09PSB1bmRlZmluZWQgfHwgcm9vbUlkID09PSBudWxsIHx8IHJvb21JZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoQXBpKFwiZ2V0XCIsIFwiXCIuY29uY2F0KGRvbWFpbiwgXCIvcm9vbXMvXCIpLmNvbmNhdChyb29tSWQsIFwiL3N0YXR1c1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoZWQgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbkNhbGxiYWNrKGZldGNoZWQsIG9wdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBwb3N0OiB7XG4gICAgICAgIGNyZWF0ZU5ld1Jvb206IC8qKlxuICAgICAqIEByZWZlcmVuY2VcbiAgICAgKiBodHRwczovL2hpa2t5LmF0bGFzc2lhbi5uZXQvd2lraS9zcGFjZXMvVktFVENMT1VEL3BhZ2VzLzE5MzI2NjEyMi9BUElcbiAgICAgKiBcdTY1QjBcdTg5OEZcdTkwRThcdTVDNEJcdTMwNkVcdTRGNUNcdTYyMTAvSlJcdTY4NDhcdTRFRjZcdTY1MzlcdTRGRUVcbiAgICAgKi8gZnVuY3Rpb24gY3JlYXRlTmV3Um9vbSh3b3JsZElkLCBvcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmV0Y2hlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChfc3RhdGUubGFiZWwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JsZElkID09PSB1bmRlZmluZWQgfHwgd29ybGRJZCA9PT0gbnVsbCB8fCB3b3JsZElkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hBcGkoXCJwb3N0XCIsIFwiXCIuY29uY2F0KGRvbWFpbiwgXCIvcm9vbXNcIiksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkX2lkOiB3b3JsZElkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaGVkID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25DYWxsYmFjayhmZXRjaGVkLCBvcHRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZEhlYXJ0YmVhdDogZnVuY3Rpb24gc2VuZEhlYXJ0YmVhdChyb29tSWQsIHBsYXllckNvdW50LCBvcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmV0Y2hlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChfc3RhdGUubGFiZWwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb29tSWQgPT09IHVuZGVmaW5lZCB8fCByb29tSWQgPT09IG51bGwgfHwgcm9vbUlkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hBcGkoXCJwb3N0XCIsIFwiXCIuY29uY2F0KGRvbWFpbiwgXCIvcm9vbXMvXCIpLmNvbmNhdChyb29tSWQsIFwiL2hlYXJ0YmVhdFwiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyX2NvdW50OiBwbGF5ZXJDb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hlZCA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uQ2FsbGJhY2soZmV0Y2hlZCwgb3B0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHB1dDoge30sXG4gICAgZGVsZXRlOiB7XG4gICAgICAgIGNhbmNlbFJlc2VydmVSb29tOiAvKipcbiAgICAgKiBAcmVmZXJlbmNlXG4gICAgICogaHR0cHM6Ly9oaWtreS5hdGxhc3NpYW4ubmV0L3dpa2kvc3BhY2VzL1ZLRVRDTE9VRC9wYWdlcy8xOTMyNjYxMjIvQVBJXG4gICAgICogXHU5NThCXHU1MEFDXHU1MjREXHUzMDZFXHU0RTg4XHU3RDA0XHUzMEVCXHUzMEZDXHUzMEUwXHUzMDZFXHU1MjRBXHU5NjY0IEpSXHU2ODQ4XHU0RUY2XHU4RkZEXHU1MkEwXG4gICAgICovIGZ1bmN0aW9uIGNhbmNlbFJlc2VydmVSb29tKHJvb21JZCwgYWRtaW5LZXksIG9wdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBmZXRjaGVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKF9zdGF0ZS5sYWJlbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvb21JZCA9PT0gdW5kZWZpbmVkIHx8IHJvb21JZCA9PT0gbnVsbCB8fCByb29tSWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaEFwaShcImRlbGV0ZVwiLCBcIlwiLmNvbmNhdChkb21haW4sIFwiL3Jvb21zL1wiKS5jb25jYXQocm9vbUlkLCBcIi9jYW5jZWxfcmVzZXJ2ZVwiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaW5fa2V5OiBhZG1pbktleVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hlZCA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uQ2FsbGJhY2soZmV0Y2hlZCwgb3B0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwgImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgICB9XG59XG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG52YXIgX19nZW5lcmF0b3IgPSB0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IgfHwgZnVuY3Rpb24odGhpc0FyZywgYm9keSkge1xuICAgIHZhciBmLCB5LCB0LCBnLCBfID0ge1xuICAgICAgICBsYWJlbDogMCxcbiAgICAgICAgc2VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAodFswXSAmIDEpIHRocm93IHRbMV07XG4gICAgICAgICAgICByZXR1cm4gdFsxXTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ5czogW10sXG4gICAgICAgIG9wczogW11cbiAgICB9O1xuICAgIHJldHVybiBnID0ge1xuICAgICAgICBuZXh0OiB2ZXJiKDApLFxuICAgICAgICBcInRocm93XCI6IHZlcmIoMSksXG4gICAgICAgIFwicmV0dXJuXCI6IHZlcmIoMilcbiAgICB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwKFtcbiAgICAgICAgICAgICAgICBuLFxuICAgICAgICAgICAgICAgIHZcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUoXyl0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtcbiAgICAgICAgICAgICAgICBvcFswXSAmIDIsXG4gICAgICAgICAgICAgICAgdC52YWx1ZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHN3aXRjaChvcFswXSl7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBvcFsxXTtcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gb3BbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgb3AgPSBbXG4gICAgICAgICAgICAgICAgNixcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgeSA9IDA7XG4gICAgICAgIH0gZmluYWxseXtcbiAgICAgICAgICAgIGYgPSB0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLFxuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cbn07XG5pbXBvcnQgeyBnZXRDb25maWcgfSBmcm9tIFwiLi4vLi4vY29uZmlnc1wiO1xuaW1wb3J0IHsgZmV0Y2hBcGkgfSBmcm9tIFwiLi4vYXBpXCI7XG52YXIgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG4vLyBcdTU3RkFcdTY3MkNcdTc2ODRcdTMwNkJcdTMwNkZcdTY3MkNcdTc1NkFcdTMwOTJcdTMwNjRcdTMwNkFcdTMwNEVcdTMwNkJcdTMwNDRcdTMwNEZcdTMwMDJcdTY3NjFcdTRFRjZcdTRFMDBcdTgxRjRcdTMwNjdzdGFnaW5nXG52YXIgZG9tYWluID0gY29uZmlnLnZyQWREb21haW47XG52YXIgY3JlYXRlUGF0aCA9IGZ1bmN0aW9uKHdvcmxkSWQpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQoZG9tYWluLCBcIi92MS9hZHM/d29ybGRfaWQ9XCIpLmNvbmNhdCh3b3JsZElkKTtcbn07XG5leHBvcnQgdmFyIFZyQWRSZXBvc2l0b3J5ID0ge1xuICAgIGdldDoge1xuICAgICAgICBnZXRBZExpc3Q6IC8qKlxuICAgICAqIEByZWZlcmVuY2VcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vVlJISUtLWS9Wa2V0QWRfU2FtcGxlXG4gICAgICogVnJBZCBjbGFzc1xuICAgICAqLyBmdW5jdGlvbiBnZXRBZExpc3Qod29ybGRJZCkge1xuICAgICAgICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmZXRjaEFwaShcImdldFwiLCBjcmVhdGVQYXRoKHdvcmxkSWQpKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcG9zdDoge30sXG4gICAgcHV0OiB7fSxcbiAgICBkZWxldGU6IHt9XG59O1xuIiwgIi8qKlxuICogQGRlc2MgUmVwb3NpdG9yeSBGYWN0b3J5XG4gKi8gaW1wb3J0IHsgQXNzZXRzUmVwb3NpdG9yeSB9IGZyb20gXCIuL3JlcG9zaXRvcmllcy9hc3NldFJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IEF1dGhSZXBvc2l0b3J5IH0gZnJvbSBcIi4vcmVwb3NpdG9yaWVzL2F1dGhSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBQcm9maWxlUmVwb3NpdG9yeSB9IGZyb20gXCIuL3JlcG9zaXRvcmllcy9wcm9maWxlUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgUm9vbVJlcG9zaXRvcnkgfSBmcm9tIFwiLi9yZXBvc2l0b3JpZXMvcm9vbVJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFZyQWRSZXBvc2l0b3J5IH0gZnJvbSBcIi4vcmVwb3NpdG9yaWVzL3ZyQWRSZXBvc2l0b3J5XCI7XG52YXIgcmVwb3NpdG9yaWVzID0ge1xuICAgIGFzc2V0czogQXNzZXRzUmVwb3NpdG9yeSxcbiAgICBhdXRoOiBBdXRoUmVwb3NpdG9yeSxcbiAgICBwcm9maWxlOiBQcm9maWxlUmVwb3NpdG9yeSxcbiAgICByb29tOiBSb29tUmVwb3NpdG9yeSxcbiAgICB2ckFkOiBWckFkUmVwb3NpdG9yeVxufTtcbmV4cG9ydCB2YXIgZmFjdG9yeSA9IHtcbiAgICBnZXQ6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHJlcG9zaXRvcmllc1tuYW1lXTtcbiAgICB9XG59O1xuIiwgImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgICB9XG59XG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG52YXIgX19nZW5lcmF0b3IgPSB0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IgfHwgZnVuY3Rpb24odGhpc0FyZywgYm9keSkge1xuICAgIHZhciBmLCB5LCB0LCBnLCBfID0ge1xuICAgICAgICBsYWJlbDogMCxcbiAgICAgICAgc2VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAodFswXSAmIDEpIHRocm93IHRbMV07XG4gICAgICAgICAgICByZXR1cm4gdFsxXTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ5czogW10sXG4gICAgICAgIG9wczogW11cbiAgICB9O1xuICAgIHJldHVybiBnID0ge1xuICAgICAgICBuZXh0OiB2ZXJiKDApLFxuICAgICAgICBcInRocm93XCI6IHZlcmIoMSksXG4gICAgICAgIFwicmV0dXJuXCI6IHZlcmIoMilcbiAgICB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwKFtcbiAgICAgICAgICAgICAgICBuLFxuICAgICAgICAgICAgICAgIHZcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUoXyl0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtcbiAgICAgICAgICAgICAgICBvcFswXSAmIDIsXG4gICAgICAgICAgICAgICAgdC52YWx1ZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHN3aXRjaChvcFswXSl7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBvcFsxXTtcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gb3BbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgb3AgPSBbXG4gICAgICAgICAgICAgICAgNixcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgeSA9IDA7XG4gICAgICAgIH0gZmluYWxseXtcbiAgICAgICAgICAgIGYgPSB0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLFxuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cbn07XG5pbXBvcnQgeyBnZXRDb25maWcgfSBmcm9tIFwiLi4vY29uZmlnc1wiO1xuaW1wb3J0IHsgdXNlU3RvcmFnZSB9IGZyb20gXCIuLi9kZXZpY2VGZWF0dXJlcy91c2VTdG9yYWdlXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZUF1dGggfSBmcm9tIFwiLi4vbW9kdWxlcy9hdXRoXCI7XG5pbXBvcnQgeyBmYWN0b3J5IH0gZnJvbSBcIi4uL3NlcnZpY2VzL2ZhY3RvcnlcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL3V0aWxzL2RlYnVnXCI7XG52YXIgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG52YXIgY2xpZW50SWQgPSBjb25maWcuYXV0aENsaWVudElkO1xudmFyIHJlZGlyZWN0VXJpID0gY29uZmlnLnZrZXRDbG91ZERvbWFpbjtcbnZhciBhdXRoUmVwb3NpdG9yeSA9IGZhY3RvcnkuZ2V0KFwiYXV0aFwiKTtcbnZhciBfZGVjb2RlID0gZnVuY3Rpb24odG9rZW4pIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgYmFzZTY0VXJsID0gdG9rZW4uc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICB2YXIgYmFzZTY0ID0gYmFzZTY0VXJsLnJlcGxhY2UoLy0vZywgXCIrXCIpLnJlcGxhY2UoL18vZywgXCIvXCIpO1xuICAgICAgICB2YXIganNvblBheWxvYWQgPSBkZWNvZGVVUklDb21wb25lbnQoYXRvYihiYXNlNjQpLnNwbGl0KFwiXCIpLm1hcChmdW5jdGlvbihjKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIlXCIgKyAoXCIwMFwiICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpO1xuICAgICAgICB9KS5qb2luKFwiXCIpKTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblBheWxvYWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZGVidWdMb2coZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn07XG4vKipcbiAqIEByZW1hcmtzXG4gKiByZWZyZXNoVG9rZW5cdTMwNkVcdTc1MUZcdTVCNThcdTcyQjZcdTZDQzFcdTMwOTJcdTk3NUVcdTU0MENcdTY3MUZcdTUxRTZcdTc0MDZcdTMwNkFcdTMwNTdcdTMwNkJcdThGRDRcdTUzNzRcdTMwNjdcdTMwNERcdTMwOEJcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi8gdmFyIGlzQWxpdmVSZWZyZXNoVG9rZW4gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVmcmVzaFRva2VuID0gdXNlU3RvcmFnZSgpLmdldExvY2FsU3RvcmFnZVZhbHVlKFwicmVmcmVzaC10b2tlblwiKTtcbiAgICBpZiAoIXJlZnJlc2hUb2tlbikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB0b2tlbkV4cGlyZXNJbiA9IHVzZVN0b3JhZ2UoKS5nZXRMb2NhbFN0b3JhZ2VWYWx1ZShcInRva2VuLWV4cGlyZXMtaW5cIik7XG4gICAgdmFyIHRva2VuQ3JlYXRlZEF0ID0gdXNlU3RvcmFnZSgpLmdldExvY2FsU3RvcmFnZVZhbHVlKFwidG9rZW4tY3JlYXRlZC1hdFwiKTtcbiAgICB2YXIgZXhwaXJlZCA9IHRva2VuRXhwaXJlc0luIHx8IDA7XG4gICAgdmFyIGNyZWF0ZWQgPSB0b2tlbkNyZWF0ZWRBdCB8fCAwO1xuICAgIHZhciBleHBpcmVkVW5peFRpbWUgPSBOdW1iZXIoZXhwaXJlZCkgKyBOdW1iZXIoY3JlYXRlZCk7XG4gICAgLy8gbm90ZTogXHU2ODQxXHU2NTcwXHUzMDRDXHU3NTcwXHUzMDZBXHUzMDhCXHUzMDZFXHUzMDY3MS8xMDAwXHU1MDBEXHUzMDZCXHUzMDU5XHUzMDhCXG4gICAgdmFyIGN1cnJlbnRVbml4VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMDtcbiAgICByZXR1cm4gY3VycmVudFVuaXhUaW1lIDwgZXhwaXJlZFVuaXhUaW1lO1xufTtcbnZhciBfaXNBbGl2ZUlkVG9rZW4gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsaWRhdGVkLCBleHBpcmVkVW5peFRpbWUsIGN1cnJlbnRVbml4VGltZSwgZTtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9zdGF0ZSkge1xuICAgICAgICAgICAgc3dpdGNoKF9zdGF0ZS5sYWJlbCl7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBfc3RhdGUudHJ5cy5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgM1xuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUF1dGgoKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nKFwiWyBfaXNBbGl2ZUlkVG9rZW4gXSBhdXRoIGVycm9yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV4cGlyZWRVbml4VGltZSA9IF9kZWNvZGUodmFsaWRhdGVkKS5leHAgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFVuaXhUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRVbml4VGltZSA8IGV4cGlyZWRVbml4VGltZVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gX2lzQWxpdmVJZFRva2VuKCkge1xuICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59KCk7XG52YXIgX3NldElkVG9rZW4gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgcmVmcmVzaFRva2VuLCByZXNwb25zZSwgcmVzcG9uc2VKc29uLCBlO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIF9zdGF0ZS50cnlzLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICA0XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW4gPSB1c2VTdG9yYWdlKCkuZ2V0TG9jYWxTdG9yYWdlVmFsdWUoXCJyZWZyZXNoLXRva2VuXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikgdGhyb3cgbmV3IEVycm9yKFwidG9rZW4gd2VudCB3cm9uZy5cIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xpZW50SWQpIHRocm93IG5ldyBFcnJvcihcImNsaWVudF9pZCB3ZW50IHdyb25nLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWRpcmVjdFVyaSkgdGhyb3cgbmV3IEVycm9yKFwicmVkaXJlY3RfdXJpIHdlbnQgd3JvbmcuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhSZXBvc2l0b3J5LnBvc3QuaXNzdWVJZFRva2VuKGNsaWVudElkLCByZWRpcmVjdFVyaSwgcmVmcmVzaFRva2VuKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VKc29uID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VTdG9yYWdlKCkuc2V0TG9jYWxTdG9yYWdlVmFsdWUoXCJhY2Nlc3MtdG9rZW5cIiwgcmVzcG9uc2VKc29uLmFjY2Vzc190b2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VTdG9yYWdlKCkuc2V0TG9jYWxTdG9yYWdlVmFsdWUoXCJ0b2tlbi1leHBpcmVzLWluXCIsIHJlc3BvbnNlSnNvbi5leHBpcmVzX2luLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXNlU3RvcmFnZSgpLnNldExvY2FsU3RvcmFnZVZhbHVlKFwidG9rZW4tY3JlYXRlZC1hdFwiLCByZXNwb25zZUpzb24uY3JlYXRlZF9hdC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVN0b3JhZ2UoKS5zZXRMb2NhbFN0b3JhZ2VWYWx1ZShcInJlZnJlc2gtdG9rZW5cIiwgcmVzcG9uc2VKc29uLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXNlU3RvcmFnZSgpLnNldFNlc3Npb25TdG9yYWdlVmFsdWUoXCJpZC10b2tlblwiLCByZXNwb25zZUpzb24uaWRfdG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgNFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIDRcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiBfc2V0SWRUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufSgpO1xuLyoqXG4gKiBAcmVtYXJrc1xuICogW2FzeW5jXSBcdTMwRURcdTMwQjBcdTMwQTRcdTMwRjNcdTYwQzVcdTU4MzFcdTMwOTJcdThGRDRcdTMwNTlcdTMwMDJcdTMwNTVcdTMwODlcdTMwNkJcdTMwMDFJRFRva2VuXHUzMDRDXHU3MTIxXHU1MkI5XHUzMDY3XHUzMDQyXHUzMDhCXHU1ODM0XHU1NDA4XHUzMDZCXHUzMDVEXHUzMDhDXHUzMDkyXHU2NkY0XHU2NUIwXHUzMDU5XHUzMDhCXG4gKi8gdmFyIGlzTG9nZ2VkSW4gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nKFwiIWlzQWxpdmVSZWZyZXNoVG9rZW4gPT4gXCIuY29uY2F0KCFpc0FsaXZlUmVmcmVzaFRva2VuKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0FsaXZlUmVmcmVzaFRva2VuKCkpIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICBfaXNBbGl2ZUlkVG9rZW4oKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhX3N0YXRlLnNlbnQoKSkgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAzXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgX3NldElkVG9rZW4oKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgX3N0YXRlLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gaXNMb2dnZWRJbigpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufSgpO1xuLyoqXG4gKiBAcmVtYXJrc1xuICogW2FzeW5jXSBcdTMwRTZcdTMwRkNcdTMwQjZcdTMwRkNcdTYwQzVcdTU4MzFcdTMwOTJcdThGRDRcdTUzNzRcdTMwNTlcdTMwOEJcbiAqIEByZXR1cm4ge0F1dGhSZXNwb25zZX1cbiAqLyB2YXIgZ2V0TXlQcm9maWxlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFjY2Vzc1Rva2VuLCBwcm9maWxlLCBlO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc1Rva2VuID0gdXNlU3RvcmFnZSgpLmdldExvY2FsU3RvcmFnZVZhbHVlKFwiYWNjZXNzLXRva2VuXCIpO1xuICAgICAgICAgICAgICAgICAgICBfc3RhdGUubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnRyeXMucHVzaChbXG4gICAgICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgIDZcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGFjY2Vzc1Rva2VuICYmIGlzQWxpdmVSZWZyZXNoVG9rZW4oKSkpIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgNFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhSZXBvc2l0b3J5LmdldC5mZXRjaE15UHJvZmlsZShhY2Nlc3NUb2tlbilcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUuanNvbigpXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIF9zdGF0ZS5zZW50KCkudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coXCJub3QgbG9nZ2VkIGluLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBlID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGdldE15UHJvZmlsZSgpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufSgpO1xuZXhwb3J0IHZhciB1c2VBdXRoID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaXNBbGl2ZVJlZnJlc2hUb2tlbjogaXNBbGl2ZVJlZnJlc2hUb2tlbixcbiAgICAgICAgaXNMb2dnZWRJbjogaXNMb2dnZWRJbixcbiAgICAgICAgZ2V0TXlQcm9maWxlOiBnZXRNeVByb2ZpbGVcbiAgICB9O1xufTtcbiIsICJmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gICAgfVxufVxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxudmFyIF9fZ2VuZXJhdG9yID0gdGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yIHx8IGZ1bmN0aW9uKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgZiwgeSwgdCwgZywgXyA9IHtcbiAgICAgICAgbGFiZWw6IDAsXG4gICAgICAgIHNlbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdO1xuICAgICAgICAgICAgcmV0dXJuIHRbMV07XG4gICAgICAgIH0sXG4gICAgICAgIHRyeXM6IFtdLFxuICAgICAgICBvcHM6IFtdXG4gICAgfTtcbiAgICByZXR1cm4gZyA9IHtcbiAgICAgICAgbmV4dDogdmVyYigwKSxcbiAgICAgICAgXCJ0aHJvd1wiOiB2ZXJiKDEpLFxuICAgICAgICBcInJldHVyblwiOiB2ZXJiKDIpXG4gICAgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgICByZXR1cm4gc3RlcChbXG4gICAgICAgICAgICAgICAgbixcbiAgICAgICAgICAgICAgICB2XG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlKF8pdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbXG4gICAgICAgICAgICAgICAgb3BbMF0gJiAyLFxuICAgICAgICAgICAgICAgIHQudmFsdWVcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBzd2l0Y2gob3BbMF0pe1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHQgPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3BbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgICAgICAgICB5ID0gb3BbMV07XG4gICAgICAgICAgICAgICAgICAgIG9wID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG9wID0gXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCBvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gdFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gdFsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ub3BzLnB1c2gob3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIG9wID0gW1xuICAgICAgICAgICAgICAgIDYsXG4gICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHkgPSAwO1xuICAgICAgICB9IGZpbmFsbHl7XG4gICAgICAgICAgICBmID0gdCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgfTtcbiAgICB9XG59O1xuaW1wb3J0IHsgdXNlU3RvcmFnZSB9IGZyb20gXCIuLi9kZXZpY2VGZWF0dXJlcy91c2VTdG9yYWdlXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZUF1dGggfSBmcm9tIFwiLi4vbW9kdWxlcy9hdXRoXCI7XG5pbXBvcnQgeyBmYWN0b3J5IH0gZnJvbSBcIi4uL3NlcnZpY2VzL2ZhY3RvcnlcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL3V0aWxzL2RlYnVnXCI7XG5pbXBvcnQgeyB1c2VBdXRoIH0gZnJvbSBcIi4vdXNlQXV0aFwiO1xudmFyIGFzc2V0c1JlcG9zaXRvcnkgPSBmYWN0b3J5LmdldChcImFzc2V0c1wiKTtcbi8qKlxuICogQHJlbWFya3NcbiAqIFthc3luY10gXHU4MUVBXHU4RUFCXHUzMDZFXHUzMEEyXHUzMEQwXHUzMEJGXHUzMEZDXHUzMEVBXHUzMEI5XHUzMEM4XHUzMDkyXHU4RkQ0XHUzMDU5XG4gKiBAcmV0dXJucyB7QXNzZXRSZXNwb25zZX1cbiAqLyB2YXIgZmV0Y2hNeUF2YXRhckxpc3QgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsaWRhdGVkLCByZXN1bHQsIF8sIGU7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfc3RhdGUpIHtcbiAgICAgICAgICAgIHN3aXRjaChfc3RhdGUubGFiZWwpe1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnRyeXMucHVzaChbXG4gICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgIDVcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVBdXRoKClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZCA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZyhcIlsgZmV0Y2hNeUF2YXRhckxpc3QgXSBhdXRoIGVycm9yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NldHNSZXBvc2l0b3J5LmdldC5nZXRBc3NldHModmFsaWRhdGVkKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgXyA9IEpTT04uc3RyaW5naWZ5O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXy5hcHBseShKU09OLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnNlbnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGUgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gZmV0Y2hNeUF2YXRhckxpc3QoKSB7XG4gICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn0oKTtcbi8qKlxuICogQHJlbWFya3NcbiAqIFthc3luY10gXHU2MzA3XHU1QjlBXHUzMDU3XHUzMDVGdXVpZFx1MzA2RWFzc2V0c1x1MzA2RVx1MzBDMFx1MzBBNlx1MzBGM1x1MzBFRFx1MzBGQ1x1MzBDOVx1MzBDOFx1MzBGQ1x1MzBBRlx1MzBGM1x1MzA5Mlx1NEY1Q1x1NjIxMFx1MzA1N1x1MzAwMWFzc2V0XHU2MEM1XHU1ODMxXHUzMDY4XHUzMDY4XHUzMDgyXHUzMDZCXHU1M0Q2XHU1Rjk3XHUzMDU5XHUzMDhCXG4gKiBAcmV0dXJucyB7VG9rZW5HZW5lcmF0ZWRSZXNwb25zZX1cbiAqLyB2YXIgZmV0Y2hNeUF2YXRhclRva2VuID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbih1dWlkLCBwYXNzd29yZCkge1xuICAgICAgICB2YXIgaXNMb2dnZWRJbiwgaWRUb2tlbiwgcmVzdWx0LCBfLCBlO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIF9zdGF0ZS50cnlzLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDUsXG4gICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICA2XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUF1dGgoKS5pc0xvZ2dlZEluKClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlzTG9nZ2VkSW4gPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTG9nZ2VkSW4pIHRocm93IG5ldyBFcnJvcihcIm5vdCBsb2dnZWQgaW5cIik7XG4gICAgICAgICAgICAgICAgICAgIGlkVG9rZW4gPSB1c2VTdG9yYWdlKCkuZ2V0U2Vzc2lvblN0b3JhZ2VWYWx1ZShcImlkLXRva2VuXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlkVG9rZW4pIHRocm93IG5ldyBFcnJvcihcIm5vIGlkLXRva2VuXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoISh1dWlkICYmIHBhc3N3b3JkKSkgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICA0XG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXRzUmVwb3NpdG9yeS5wb3N0LnBvc3RBc3NldFRva2VuKGlkVG9rZW4sIHV1aWQsIHBhc3N3b3JkKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgXyA9IEpTT04uc3RyaW5naWZ5O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXy5hcHBseShKU09OLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnNlbnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIHBhcmFtc1wiKTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGUgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gZmV0Y2hNeUF2YXRhclRva2VuKHV1aWQsIHBhc3N3b3JkKSB7XG4gICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn0oKTtcbi8qKlxuICogQGRlc2MgW2FzeW5jXSBcdTYzMDdcdTVCOUFcdTMwNTdcdTMwNUZcdTMwQzBcdTMwQTZcdTMwRjNcdTMwRURcdTMwRkNcdTMwQzl0b2tlblx1MzA2OFx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA5Mlx1MzA4Mlx1MzA2OFx1MzA2Qlx1NUJGRVx1OEM2MVx1MzA2RVx1MzBBMlx1MzBCQlx1MzBDM1x1MzBDOFx1MzBDN1x1MzBGQ1x1MzBCRlx1MzA5Mlx1NTNENlx1NUY5N1x1MzA1OVx1MzA4QlxuICogQHJldHVybnMge0Fzc2V0QnlUb2tlblJlc3BvbnNlfVxuICovIHZhciBmZXRjaE90aGVyc0F2YXRhclVybCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24oZG93bmxvYWRUb2tlbiwgcGFzc3dvcmQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCwgXywgZTtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9zdGF0ZSkge1xuICAgICAgICAgICAgc3dpdGNoKF9zdGF0ZS5sYWJlbCl7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBfc3RhdGUudHJ5cy5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgNVxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZG93bmxvYWRUb2tlbiAmJiBwYXNzd29yZCkpIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgM1xuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2V0c1JlcG9zaXRvcnkuZ2V0LmdldEFzc2V0QnlUb2tlbihkb3dubG9hZFRva2VuLCBwYXNzd29yZClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIF8gPSBKU09OLnN0cmluZ2lmeTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuanNvbigpXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIF8uYXBwbHkoSlNPTiwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdGF0ZS5zZW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJubyBwYXJhbXNcIik7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBlID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGZldGNoT3RoZXJzQXZhdGFyVXJsKGRvd25sb2FkVG9rZW4sIHBhc3N3b3JkKSB7XG4gICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn0oKTtcbmV4cG9ydCB2YXIgdXNlQXZhdGFyID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmV0Y2hNeUF2YXRhckxpc3Q6IGZldGNoTXlBdmF0YXJMaXN0LFxuICAgICAgICBmZXRjaE15QXZhdGFyVG9rZW46IGZldGNoTXlBdmF0YXJUb2tlbixcbiAgICAgICAgZmV0Y2hPdGhlcnNBdmF0YXJVcmw6IGZldGNoT3RoZXJzQXZhdGFyVXJsXG4gICAgfTtcbn07XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG52YXIgdGltZXJzID0ge307XG52YXIgc2V0SW50ZXJ2YWxEZWxlZ2F0ZSA9IGZ1bmN0aW9uKGludGVydmFsS2V5LCBmdW5jLCBzcGFuKSB7XG4gICAgaWYgKHRpbWVyc1tpbnRlcnZhbEtleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aW1lcnNbaW50ZXJ2YWxLZXldID0gc2V0SW50ZXJ2YWwoZnVuYywgc3Bhbik7XG4gICAgfVxufTtcbnZhciBjbGVhckludGVydmFsRGVsZWdhdGUgPSBmdW5jdGlvbihpbnRlcnZhbEtleSkge1xuICAgIGlmICh0aW1lcnNbaW50ZXJ2YWxLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcnNbaW50ZXJ2YWxLZXldKTtcbiAgICAgICAgdGltZXJzW2ludGVydmFsS2V5XSA9IHVuZGVmaW5lZDtcbiAgICB9XG59O1xuZXhwb3J0IHZhciB1c2VJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNldEludGVydmFsRGVsZWdhdGU6IHNldEludGVydmFsRGVsZWdhdGUsXG4gICAgICAgIGNsZWFySW50ZXJ2YWxEZWxlZ2F0ZTogY2xlYXJJbnRlcnZhbERlbGVnYXRlXG4gICAgfTtcbn07XG4iLCAiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX25leHQodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbnZhciBfX2dlbmVyYXRvciA9IHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvciB8fCBmdW5jdGlvbih0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIGYsIHksIHQsIGcsIF8gPSB7XG4gICAgICAgIGxhYmVsOiAwLFxuICAgICAgICBzZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTtcbiAgICAgICAgICAgIHJldHVybiB0WzFdO1xuICAgICAgICB9LFxuICAgICAgICB0cnlzOiBbXSxcbiAgICAgICAgb3BzOiBbXVxuICAgIH07XG4gICAgcmV0dXJuIGcgPSB7XG4gICAgICAgIG5leHQ6IHZlcmIoMCksXG4gICAgICAgIFwidGhyb3dcIjogdmVyYigxKSxcbiAgICAgICAgXCJyZXR1cm5cIjogdmVyYigyKVxuICAgIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odikge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXAoW1xuICAgICAgICAgICAgICAgIG4sXG4gICAgICAgICAgICAgICAgdlxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZShfKXRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW1xuICAgICAgICAgICAgICAgIG9wWzBdICYgMixcbiAgICAgICAgICAgICAgICB0LnZhbHVlXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgc3dpdGNoKG9wWzBdKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgICAgICAgICAgeSA9IG9wWzFdO1xuICAgICAgICAgICAgICAgICAgICBvcCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgb3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSBvcFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBfLm9wcy5wdXNoKG9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBvcCA9IFtcbiAgICAgICAgICAgICAgICA2LFxuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB5ID0gMDtcbiAgICAgICAgfSBmaW5hbGx5e1xuICAgICAgICAgICAgZiA9IHQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsXG4gICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxufTtcbmltcG9ydCB7IGhlbGlwb3J0V2luZG93IH0gZnJvbSBcIi4uL2NvbnN0XCI7XG5pbXBvcnQgeyB2YWxpZGF0ZUF1dGggfSBmcm9tIFwiLi4vbW9kdWxlcy9hdXRoXCI7XG5pbXBvcnQgeyBmYWN0b3J5IH0gZnJvbSBcIi4uL3NlcnZpY2VzL2ZhY3RvcnlcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL3V0aWxzL2RlYnVnXCI7XG52YXIgcHJvZmlsZVJlcG9zaXRvcnkgPSBmYWN0b3J5LmdldChcInByb2ZpbGVcIik7XG4vKipcbiAqIEByZW1hcmtzXG4gKiBcdTgxRUFcdThFQUJcdTMwNkVcdTMwRDdcdTMwRURcdTMwRDVcdTMwQTNcdTMwRkNcdTMwRUJcdTUzRDZcdTVGOTcgKFx1MzA2QVx1MzA0NFx1NTgzNFx1NTQwOFx1MzA2Rlx1NjVCMFx1ODk4Rlx1NEY1Q1x1NjIxMClcbiAqIFx1MzBEN1x1MzBFRFx1MzBENVx1MzBBM1x1MzBGQ1x1MzBFQlx1MzA0Q1x1MzA2QVx1MzA0NFx1NTgzNFx1NTQwOFx1MzA0Q1x1MzA2QVx1MzA0NFx1MzBCNVx1MzBGQ1x1MzBEM1x1MzBCOVx1OEEyRFx1OEEwOFx1MzA5Mlx1NjBGM1x1NUI5QVxuICogQHJldHVybnMge1Byb2ZpbGV9XG4gKi8gdmFyIGZldGNoTXlQcm9maWxlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbGlkYXRlZCwgbXlQcm9maWxlLCBfLCBjcmVhdGVSZXNwb25zZSwgXzEsIGU7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfc3RhdGUpIHtcbiAgICAgICAgICAgIHN3aXRjaChfc3RhdGUubGFiZWwpe1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnRyeXMucHVzaChbXG4gICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgNyxcbiAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgIDhcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVBdXRoKClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZCA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZyhcIlsgZmV0Y2hNeVByb2ZpbGUgXSBhdXRoIGVycm9yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlUmVwb3NpdG9yeS5nZXQuZ2V0TXlQcm9maWxlKHZhbGlkYXRlZClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG15UHJvZmlsZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbXlQcm9maWxlLm9rKSByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIDRcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgXyA9IEpTT04uc3RyaW5naWZ5O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG15UHJvZmlsZS5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXy5hcHBseShKU09OLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnNlbnQoKS5wcm9maWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coXCJbIGZldGNoTXlQcm9maWxlIF0gZXJyb3IgZmV0Y2hlZC4gc3RhdHVzID0gXCIuY29uY2F0KG15UHJvZmlsZS5zdGF0dXMsIFwiLiBwb3N0UHJvZmlsZS4uLlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVJlcG9zaXRvcnkucG9zdC5wb3N0UHJvZmlsZSh2YWxpZGF0ZWQsIGhlbGlwb3J0V2luZG93LmdfQ3VycmVudFVzZXJOYW1lKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlUmVzcG9uc2UgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBfMSA9IEpTT04uc3RyaW5naWZ5O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBfMS5hcHBseShKU09OLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnNlbnQoKS5wcm9maWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiBmZXRjaE15UHJvZmlsZSgpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufSgpO1xuLyoqXG4gKiBAcmVtYXJrc1xuICogXHUzMEQ3XHUzMEVEXHUzMEQ1XHUzMEEzXHUzMEZDXHUzMEVCXHU2NkY0XHU2NUIwXG4gKiBAcmV0dXJucyB7UHJvZmlsZX1cbiAqLyB2YXIgdXBkYXRlUHJvZmlsZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24obmFtZSwgaW50cm9kdWN0aW9uKSB7XG4gICAgICAgIHZhciB2YWxpZGF0ZWQsIHB1dFByb2ZpbGUsIF8sIGU7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfc3RhdGUpIHtcbiAgICAgICAgICAgIHN3aXRjaChfc3RhdGUubGFiZWwpe1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnRyeXMucHVzaChbXG4gICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgIDZcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVBdXRoKClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZCA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZyhcIlsgdXBkYXRlUHJvZmlsZSBdIGF1dGggZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVSZXBvc2l0b3J5LnB1dC5wdXRQcm9maWxlKHZhbGlkYXRlZCwgbmFtZSwgaW50cm9kdWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcHV0UHJvZmlsZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcHV0UHJvZmlsZS5vaykgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICA0XG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIF8gPSBKU09OLnN0cmluZ2lmeTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRQcm9maWxlLmpzb24oKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmFwcGx5KEpTT04sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3RhdGUuc2VudCgpLnByb2ZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZyhcIlsgdXBkYXRlUHJvZmlsZSBdIGVycm9yIGZldGNoZWQuIHN0YXR1cyA9IFwiLmNvbmNhdChwdXRQcm9maWxlLnN0YXR1cywgXCIuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBlID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZVByb2ZpbGUobmFtZSwgaW50cm9kdWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn0oKTtcbi8qKlxuICogQHJlbWFya3NcbiAqIFx1MzBEN1x1MzBFRFx1MzBENVx1MzBBM1x1MzBGQ1x1MzBFQlx1MzBBMlx1MzBBNFx1MzBCM1x1MzBGM1x1NjZGNFx1NjVCMFxuICogQHJldHVybnMge1Byb2ZpbGV9XG4gKi8gdmFyIHVwZGF0ZVByb2ZpbGVJY29uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbihpY29uKSB7XG4gICAgICAgIHZhciB2YWxpZGF0ZWQsIHB1dFByb2ZpbGVJY29uLCBfLCBlO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIF9zdGF0ZS50cnlzLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDUsXG4gICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICA2XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlQXV0aCgpXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWQgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coXCJbIHVwZGF0ZVByb2ZpbGVJY29uIF0gYXV0aCBlcnJvclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVJlcG9zaXRvcnkucHV0LnB1dFByb2ZpbGVJY29uKHZhbGlkYXRlZCwgaWNvbilcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHB1dFByb2ZpbGVJY29uID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwdXRQcm9maWxlSWNvbi5vaykgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICA0XG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIF8gPSBKU09OLnN0cmluZ2lmeTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRQcm9maWxlSWNvbi5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXy5hcHBseShKU09OLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnNlbnQoKS5wcm9maWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coXCJbIHVwZGF0ZVByb2ZpbGVJY29uIF0gZXJyb3IgZmV0Y2hlZC4gc3RhdHVzID0gXCIuY29uY2F0KHB1dFByb2ZpbGVJY29uLnN0YXR1cywgXCIuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBlID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZVByb2ZpbGVJY29uKGljb24pIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufSgpO1xuLyoqXG4gKiBAcmVtYXJrc1xuICogXHU2MzA3XHU1QjlBXHUzMDZFaWRcdTMwNkVcdTMwRDdcdTMwRURcdTMwRDVcdTMwQTNcdTMwRkNcdTMwRUJcdTUzRDZcdTVGOTdcbiAqIEByZXR1cm5zIHtQcm9maWxlfVxuICovIHZhciBmZXRjaFVzZXJQcm9maWxlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbih1c2VySWQpIHtcbiAgICAgICAgdmFyIHVzZXJQcm9maWxlLCBfLCBlO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIF9zdGF0ZS50cnlzLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICA0XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVSZXBvc2l0b3J5LmdldC5nZXRQcm9maWxlKHVzZXJJZClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHVzZXJQcm9maWxlID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgXyA9IEpTT04uc3RyaW5naWZ5O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJQcm9maWxlLmpzb24oKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmFwcGx5KEpTT04sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3RhdGUuc2VudCgpLnByb2ZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBlID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGZldGNoVXNlclByb2ZpbGUodXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn0oKTtcbi8qKlxuICogQHJlbWFya3MgXHU4MUVBXHU4RUFCXHUzMDZFXHUzMEIyXHUzMEI5XHUzMEM4XHU3NTI4XHUzMEQ3XHUzMEVEXHUzMEQ1XHUzMEEzXHUzMEZDXHUzMEVCXHU1M0Q2XHU1Rjk3IChcdTMwNkFcdTMwNDRcdTU4MzRcdTU0MDhcdTMwNkZcdTY1QjBcdTg5OEZcdTRGNUNcdTYyMTApXG4gKiBcdTMwRDdcdTMwRURcdTMwRDVcdTMwQTNcdTMwRkNcdTMwRUJcdTMwNENcdTMwNkFcdTMwNDRcdTU4MzRcdTU0MDhcdTMwNENcdTMwNkFcdTMwNDRcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdThBMkRcdThBMDhcdTMwOTJcdTYwRjNcdTVCOUFcbiAqIEByZXR1cm5zIHtQcm9maWxlfVxuICovIHZhciBmZXRjaE15R3Vlc3RQcm9maWxlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbih1dWlkKSB7XG4gICAgICAgIHZhciBndWVzdFByb2ZpbGUsIF8sIGNyZWF0ZWQsIF8xLCBlO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIF9zdGF0ZS50cnlzLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDYsXG4gICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICA3XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVSZXBvc2l0b3J5LmdldC5nZXRHdWVzdFByb2ZpbGUodXVpZClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGd1ZXN0UHJvZmlsZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZ3Vlc3RQcm9maWxlLm9rKSByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIDNcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgXyA9IEpTT04uc3RyaW5naWZ5O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGd1ZXN0UHJvZmlsZS5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXy5hcHBseShKU09OLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnNlbnQoKS5ndWVzdF9wcm9maWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coXCJbIGZldGNoTXlHdWVzdFByb2ZpbGUgXSBlcnJvciBmZXRjaGVkLiBzdGF0dXMgPSBcIi5jb25jYXQoZ3Vlc3RQcm9maWxlLnN0YXR1cywgXCIuIHBvc3RQcm9maWxlLi4uXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlUmVwb3NpdG9yeS5wb3N0LnBvc3RHdWVzdFByb2ZpbGUodXVpZCwgaGVsaXBvcnRXaW5kb3cuZ19DdXJyZW50VXNlck5hbWUpXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgXzEgPSBKU09OLnN0cmluZ2lmeTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkLmpzb24oKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBfMS5hcHBseShKU09OLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnNlbnQoKS5ndWVzdF9wcm9maWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiBmZXRjaE15R3Vlc3RQcm9maWxlKHV1aWQpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufSgpO1xuLyoqXG4gKiBAcmVtYXJrcyBcdTMwRDdcdTMwRURcdTMwRDVcdTMwQTNcdTMwRkNcdTMwRUJcdTY2RjRcdTY1QjBcbiAqIEByZXR1cm5zIHtQcm9maWxlfVxuICovIHZhciB1cGRhdGVHdWVzdFByb2ZpbGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKHV1aWQsIG5hbWUsIGludHJvZHVjdGlvbikge1xuICAgICAgICB2YXIgZ3Vlc3RQcm9maWxlLCBfLCBlO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIF9zdGF0ZS50cnlzLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICA1XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVSZXBvc2l0b3J5LnB1dC5wdXRHdWVzdFByb2ZpbGUodXVpZCwgbmFtZSwgaW50cm9kdWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgZ3Vlc3RQcm9maWxlID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFndWVzdFByb2ZpbGUub2spIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgM1xuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBfID0gSlNPTi5zdHJpbmdpZnk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZ3Vlc3RQcm9maWxlLmpzb24oKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmFwcGx5KEpTT04sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3RhdGUuc2VudCgpLmd1ZXN0X3Byb2ZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZyhcIlsgdXBkYXRlR3Vlc3RQcm9maWxlIF0gZXJyb3IgZmV0Y2hlZC4gc3RhdHVzID0gXCIuY29uY2F0KGd1ZXN0UHJvZmlsZS5zdGF0dXMsIFwiLlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiB1cGRhdGVHdWVzdFByb2ZpbGUodXVpZCwgbmFtZSwgaW50cm9kdWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn0oKTtcbi8qKlxuICogQHJlbWFya3NcbiAqIFx1MzBEN1x1MzBFRFx1MzBENVx1MzBBM1x1MzBGQ1x1MzBFQlx1MzBBMlx1MzBBNFx1MzBCM1x1MzBGM1x1NjZGNFx1NjVCMFxuICogQHJldHVybnMge1Byb2ZpbGV9XG4gKi8gdmFyIHVwZGF0ZUd1ZXN0UHJvZmlsZUljb24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKHV1aWQsIGljb24pIHtcbiAgICAgICAgdmFyIGd1ZXN0UHJvZmlsZUljb24sIF8sIGU7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfc3RhdGUpIHtcbiAgICAgICAgICAgIHN3aXRjaChfc3RhdGUubGFiZWwpe1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnRyeXMucHVzaChbXG4gICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgIDVcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVJlcG9zaXRvcnkucHV0LnB1dEd1ZXN0UHJvZmlsZUljb24odXVpZCwgaWNvbilcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGd1ZXN0UHJvZmlsZUljb24gPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWd1ZXN0UHJvZmlsZUljb24ub2spIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgM1xuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBfID0gSlNPTi5zdHJpbmdpZnk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZ3Vlc3RQcm9maWxlSWNvbi5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXy5hcHBseShKU09OLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnNlbnQoKS5ndWVzdF9wcm9maWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coXCJbIHVwZGF0ZUd1ZXN0UHJvZmlsZUljb24gXSBlcnJvciBmZXRjaGVkLiBzdGF0dXMgPSBcIi5jb25jYXQoZ3Vlc3RQcm9maWxlSWNvbi5zdGF0dXMsIFwiLlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiB1cGRhdGVHdWVzdFByb2ZpbGVJY29uKHV1aWQsIGljb24pIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufSgpO1xuLyoqXG4gKiBAcmVtYXJrc1xuICogXHU2MzA3XHU1QjlBXHUzMDZFdXVpZFx1MzA2RVx1MzBEN1x1MzBFRFx1MzBENVx1MzBBM1x1MzBGQ1x1MzBFQlx1NTNENlx1NUY5N1xuICogQHJldHVybnMge1Byb2ZpbGV9XG4gKi8gdmFyIGZldGNoVXNlckd1ZXN0UHJvZmlsZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24odXVpZCkge1xuICAgICAgICB2YXIgZ3Vlc3RQcm9maWxlLCBfLCBlO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIF9zdGF0ZS50cnlzLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICA0XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVSZXBvc2l0b3J5LmdldC5nZXRHdWVzdFByb2ZpbGUodXVpZClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGd1ZXN0UHJvZmlsZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIF8gPSBKU09OLnN0cmluZ2lmeTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICBndWVzdFByb2ZpbGUuanNvbigpXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIF8uYXBwbHkoSlNPTiwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdGF0ZS5zZW50KCkuZ3Vlc3RfcHJvZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGUgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gZmV0Y2hVc2VyR3Vlc3RQcm9maWxlKHV1aWQpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufSgpO1xuLyoqXG4gKiBAcmVtYXJrcyBcdTYzMDdcdTVCOUFcdTMwNkV1c2VyX2lkXHU0RTAwXHU4OUE3XHUzMDZFXHUzMEQ3XHUzMEVEXHUzMEQ1XHUzMEEzXHUzMEZDXHUzMEVCXHU1M0Q2XHU1Rjk3XG4gKiBAcmV0dXJucyB7UHJvZmlsZVtdfVxuICovIHZhciBmZXRjaFVzZXJQcm9maWxlTGlzdCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24odXNlcklkcykge1xuICAgICAgICB2YXIgcHJvZmlsZUxpc3QsIF8sIGU7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfc3RhdGUpIHtcbiAgICAgICAgICAgIHN3aXRjaChfc3RhdGUubGFiZWwpe1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnRyeXMucHVzaChbXG4gICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgIDRcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVJlcG9zaXRvcnkucG9zdC5wb3N0UHJvZmlsZUxpc3QodXNlcklkcylcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHByb2ZpbGVMaXN0ID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgXyA9IEpTT04uc3RyaW5naWZ5O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVMaXN0Lmpzb24oKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmFwcGx5KEpTT04sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3RhdGUuc2VudCgpLnByb2ZpbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiW11cIlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGZldGNoVXNlclByb2ZpbGVMaXN0KHVzZXJJZHMpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufSgpO1xuLyoqXG4gKiBAcmVtYXJrcyBcdTYzMDdcdTVCOUFcdTMwNkV1dWlkXHU0RTAwXHU4OUE3XHUzMDZFXHUzMEQ3XHUzMEVEXHUzMEQ1XHUzMEEzXHUzMEZDXHUzMEVCXHU1M0Q2XHU1Rjk3XG4gKiBAcmV0dXJucyB7UHJvZmlsZVtdfVxuICovIHZhciBmZXRjaFVzZXJHdWVzdFByb2ZpbGVMaXN0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbih1dWlkcykge1xuICAgICAgICB2YXIgZ3Vlc3RQcm9maWxlTGlzdCwgXywgZTtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9zdGF0ZSkge1xuICAgICAgICAgICAgc3dpdGNoKF9zdGF0ZS5sYWJlbCl7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBfc3RhdGUudHJ5cy5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgNFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlUmVwb3NpdG9yeS5wb3N0LnBvc3RHdWVzdFByb2ZpbGVMaXN0KHV1aWRzKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgZ3Vlc3RQcm9maWxlTGlzdCA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIF8gPSBKU09OLnN0cmluZ2lmeTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICBndWVzdFByb2ZpbGVMaXN0Lmpzb24oKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmFwcGx5KEpTT04sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3RhdGUuc2VudCgpLmd1ZXN0X3Byb2ZpbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiW11cIlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGZldGNoVXNlckd1ZXN0UHJvZmlsZUxpc3QodXVpZHMpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufSgpO1xuZXhwb3J0IHZhciB1c2VQcm9maWxlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmV0Y2hNeVByb2ZpbGU6IGZldGNoTXlQcm9maWxlLFxuICAgICAgICB1cGRhdGVQcm9maWxlOiB1cGRhdGVQcm9maWxlLFxuICAgICAgICB1cGRhdGVQcm9maWxlSWNvbjogdXBkYXRlUHJvZmlsZUljb24sXG4gICAgICAgIGZldGNoVXNlclByb2ZpbGU6IGZldGNoVXNlclByb2ZpbGUsXG4gICAgICAgIGZldGNoTXlHdWVzdFByb2ZpbGU6IGZldGNoTXlHdWVzdFByb2ZpbGUsXG4gICAgICAgIHVwZGF0ZUd1ZXN0UHJvZmlsZTogdXBkYXRlR3Vlc3RQcm9maWxlLFxuICAgICAgICB1cGRhdGVHdWVzdFByb2ZpbGVJY29uOiB1cGRhdGVHdWVzdFByb2ZpbGVJY29uLFxuICAgICAgICBmZXRjaFVzZXJHdWVzdFByb2ZpbGU6IGZldGNoVXNlckd1ZXN0UHJvZmlsZSxcbiAgICAgICAgZmV0Y2hVc2VyUHJvZmlsZUxpc3Q6IGZldGNoVXNlclByb2ZpbGVMaXN0LFxuICAgICAgICBmZXRjaFVzZXJHdWVzdFByb2ZpbGVMaXN0OiBmZXRjaFVzZXJHdWVzdFByb2ZpbGVMaXN0XG4gICAgfTtcbn07XG4iLCAiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX25leHQodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbnZhciBfX2dlbmVyYXRvciA9IHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvciB8fCBmdW5jdGlvbih0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIGYsIHksIHQsIGcsIF8gPSB7XG4gICAgICAgIGxhYmVsOiAwLFxuICAgICAgICBzZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTtcbiAgICAgICAgICAgIHJldHVybiB0WzFdO1xuICAgICAgICB9LFxuICAgICAgICB0cnlzOiBbXSxcbiAgICAgICAgb3BzOiBbXVxuICAgIH07XG4gICAgcmV0dXJuIGcgPSB7XG4gICAgICAgIG5leHQ6IHZlcmIoMCksXG4gICAgICAgIFwidGhyb3dcIjogdmVyYigxKSxcbiAgICAgICAgXCJyZXR1cm5cIjogdmVyYigyKVxuICAgIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odikge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXAoW1xuICAgICAgICAgICAgICAgIG4sXG4gICAgICAgICAgICAgICAgdlxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZShfKXRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW1xuICAgICAgICAgICAgICAgIG9wWzBdICYgMixcbiAgICAgICAgICAgICAgICB0LnZhbHVlXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgc3dpdGNoKG9wWzBdKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgICAgICAgICAgeSA9IG9wWzFdO1xuICAgICAgICAgICAgICAgICAgICBvcCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgb3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSBvcFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBfLm9wcy5wdXNoKG9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBvcCA9IFtcbiAgICAgICAgICAgICAgICA2LFxuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB5ID0gMDtcbiAgICAgICAgfSBmaW5hbGx5e1xuICAgICAgICAgICAgZiA9IHQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsXG4gICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxufTtcbmltcG9ydCB7IGZhY3RvcnkgfSBmcm9tIFwiLi4vc2VydmljZXMvZmFjdG9yeVwiO1xuaW1wb3J0IHsgZGVidWdMb2cgfSBmcm9tIFwiLi4vdXRpbHMvZGVidWdcIjtcbnZhciByb29tUmVwb3NpdG9yeSA9IGZhY3RvcnkuZ2V0KFwicm9vbVwiKTtcbi8qKlxuICogQHBhcmFtIHdvcmxkSWRcbiAqIEBwYXJhbSBvcHRpb25cbiAqIEByZXR1cm5zIHtHZXRBY3RpdmVSb29tUmVzcG9uc2V9XG4gKi8gdmFyIGZldGNoQWN0aXZlUm9vbXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKHdvcmxkSWQsIG9wdGlvbikge1xuICAgICAgICB2YXIgcmVzdWx0LCBfLCBlO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIF9zdGF0ZS50cnlzLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICA0XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb21SZXBvc2l0b3J5LmdldC5nZXRBY3RpdmVSb29tcyh3b3JsZElkLCBvcHRpb24gfHwge30pXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfID0gSlNPTi5zdHJpbmdpZnk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmpzb24oKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmFwcGx5KEpTT04sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3RhdGUuc2VudCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiBmZXRjaEFjdGl2ZVJvb21zKHdvcmxkSWQsIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59KCk7XG4vKipcbiAqIEBwYXJhbSB3b3JsZElkXG4gKiBAcGFyYW0gb3B0aW9uXG4gKiBAcmV0dXJucyB7R2V0UmFuZG9tUm9vbVJlc3BvbnNlfVxuICovIHZhciBmZXRjaFJhbmRvbVJvb20gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKHdvcmxkSWQsIG9wdGlvbikge1xuICAgICAgICB2YXIgcmVzdWx0LCBfLCBlO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIF9zdGF0ZS50cnlzLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICA0XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb21SZXBvc2l0b3J5LmdldC5nZXRSYW5kb21Sb29tKHdvcmxkSWQsIG9wdGlvbiB8fCB7fSlcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF8gPSBKU09OLnN0cmluZ2lmeTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuanNvbigpXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIF8uYXBwbHkoSlNPTiwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdGF0ZS5zZW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBlID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGZldGNoUmFuZG9tUm9vbSh3b3JsZElkLCBvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufSgpO1xuLyoqXG4gKiBAcGFyYW0gcm9vbUlkXG4gKiBAcGFyYW0gb3B0aW9uXG4gKiBAcmV0dXJucyB7R2V0UmFuZG9tUm9vbVJlc3BvbnNlIHwgR2V0RnVsbFJvb21SZXNwb25zZX1cbiAqLyB2YXIgZmV0Y2hSb29tID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbihyb29tSWQsIG9wdGlvbikge1xuICAgICAgICB2YXIgcmVzdWx0LCBfLCBlO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIF9zdGF0ZS50cnlzLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICA0XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb21SZXBvc2l0b3J5LmdldC5nZXRSb29tKHJvb21JZCwgb3B0aW9uIHx8IHt9KVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXyA9IEpTT04uc3RyaW5naWZ5O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXy5hcHBseShKU09OLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnNlbnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGUgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gZmV0Y2hSb29tKHJvb21JZCwgb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn0oKTtcbi8qKlxuICogQHBhcmFtIHJvb21JZFxuICogQHBhcmFtIG9wdGlvblxuICogQHJldHVybnMge0dldFJvb21TdGF0dXNSZXNwb25zZX1cbiAqLyB2YXIgZmV0Y2hSb29tU3RhdHVzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbihyb29tSWQsIG9wdGlvbikge1xuICAgICAgICB2YXIgcmVzdWx0LCBfLCBlO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIF9zdGF0ZS50cnlzLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICA0XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb21SZXBvc2l0b3J5LmdldC5nZXRSb29tU3RhdHVzKHJvb21JZCwgb3B0aW9uIHx8IHt9KVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXyA9IEpTT04uc3RyaW5naWZ5O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXy5hcHBseShKU09OLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnNlbnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGUgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gZmV0Y2hSb29tU3RhdHVzKHJvb21JZCwgb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn0oKTtcbi8qKlxuICogQHBhcmFtIHdvcmxkSWRcbiAqIEBwYXJhbSBvcHRpb25cbiAqIEByZXR1cm5zIHtDcmVhdGVkUm9vbVJlc3BvbnNlfVxuICovIHZhciBjcmVhdGVSb29tID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbih3b3JsZElkLCBvcHRpb24pIHtcbiAgICAgICAgdmFyIHJlc3VsdCwgXywgZTtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9zdGF0ZSkge1xuICAgICAgICAgICAgc3dpdGNoKF9zdGF0ZS5sYWJlbCl7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBfc3RhdGUudHJ5cy5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgNFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICByb29tUmVwb3NpdG9yeS5wb3N0LmNyZWF0ZU5ld1Jvb20od29ybGRJZCwgb3B0aW9uIHx8IHt9KVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXyA9IEpTT04uc3RyaW5naWZ5O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXy5hcHBseShKU09OLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnNlbnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGUgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlUm9vbSh3b3JsZElkLCBvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufSgpO1xuLyoqXG4gKiBAcGFyYW0gcm9vbUlkXG4gKiBAcGFyYW0gcGxheWVyQ291bnRcbiAqIEBwYXJhbSBvcHRpb25cbiAqIEByZXR1cm5zIHtTZW5kSGVhcnRCZWF0UmVzcG9uc2V9XG4gKi8gdmFyIHNlbmRIZWFydEJlYXQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKHJvb21JZCwgcGxheWVyQ291bnQsIG9wdGlvbikge1xuICAgICAgICB2YXIgcmVzdWx0LCBfLCBlO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIF9zdGF0ZS50cnlzLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICA0XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb21SZXBvc2l0b3J5LnBvc3Quc2VuZEhlYXJ0YmVhdChyb29tSWQsIHBsYXllckNvdW50LCBvcHRpb24gfHwge30pXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfID0gSlNPTi5zdHJpbmdpZnk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmpzb24oKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmFwcGx5KEpTT04sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3RhdGUuc2VudCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiBzZW5kSGVhcnRCZWF0KHJvb21JZCwgcGxheWVyQ291bnQsIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59KCk7XG4vKipcbiAqIEBwYXJhbSByb29tSWRcbiAqIEBwYXJhbSBhZG1pbktleVxuICogQHBhcmFtIG9wdGlvblxuICogQHJldHVybnMge0NhbmNlbFJlc2VydmVkUm9vbVJlc3BvbnNlfVxuICovIHZhciBjYW5jZWxSZXNlcnZlUm9vbSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24ocm9vbUlkLCBhZG1pbktleSwgb3B0aW9uKSB7XG4gICAgICAgIHZhciByZXN1bHQsIF8sIGU7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfc3RhdGUpIHtcbiAgICAgICAgICAgIHN3aXRjaChfc3RhdGUubGFiZWwpe1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnRyeXMucHVzaChbXG4gICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgIDRcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vbVJlcG9zaXRvcnkuZGVsZXRlLmNhbmNlbFJlc2VydmVSb29tKHJvb21JZCwgYWRtaW5LZXksIG9wdGlvbiB8fCB7fSlcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF8gPSBKU09OLnN0cmluZ2lmeTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuanNvbigpXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIF8uYXBwbHkoSlNPTiwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdGF0ZS5zZW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBlID0gX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNhbmNlbFJlc2VydmVSb29tKHJvb21JZCwgYWRtaW5LZXksIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59KCk7XG5leHBvcnQgdmFyIHVzZVJvb21BcGkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmZXRjaEFjdGl2ZVJvb21zOiBmZXRjaEFjdGl2ZVJvb21zLFxuICAgICAgICBmZXRjaFJhbmRvbVJvb206IGZldGNoUmFuZG9tUm9vbSxcbiAgICAgICAgZmV0Y2hSb29tOiBmZXRjaFJvb20sXG4gICAgICAgIGZldGNoUm9vbVN0YXR1czogZmV0Y2hSb29tU3RhdHVzLFxuICAgICAgICBjcmVhdGVSb29tOiBjcmVhdGVSb29tLFxuICAgICAgICBzZW5kSGVhcnRCZWF0OiBzZW5kSGVhcnRCZWF0LFxuICAgICAgICBjYW5jZWxSZXNlcnZlUm9vbTogY2FuY2VsUmVzZXJ2ZVJvb21cbiAgICB9O1xufTtcbiIsICJpbXBvcnQgeyBoZWxpcG9ydFdpbmRvdyB9IGZyb20gXCIuLi9jb25zdFwiO1xuZXhwb3J0IHZhciB1c2VSb3V0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVsb2FkUGFnZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfTtcbiAgICB2YXIgcHJvY2VlZFBhZ2UgPSBmdW5jdGlvbih1cmwpIHtcbiAgICAgICAgcmV0dXJuIGxvY2F0aW9uLmFzc2lnbih1cmwpO1xuICAgIH07XG4gICAgdmFyIG9wZW5QYWdlID0gZnVuY3Rpb24odXJsKSB7XG4gICAgICAgIHJldHVybiBoZWxpcG9ydFdpbmRvdy5vcGVuKHVybCwgXCJfYmxhbmtcIik7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICByZWxvYWRQYWdlOiByZWxvYWRQYWdlLFxuICAgICAgICBwcm9jZWVkUGFnZTogcHJvY2VlZFBhZ2UsXG4gICAgICAgIG9wZW5QYWdlOiBvcGVuUGFnZVxuICAgIH07XG59O1xuIiwgImltcG9ydCB7IElPU19WRVJfMTUsIElQSE9ORV9VU0VSX0FHRU5UX1JFR1MsIE1PQklMRV9VU0VSX0FHRU5UX1JFR1MsIGhlbGlwb3J0V2luZG93IH0gZnJvbSBcIi4uL2NvbnN0XCI7XG5leHBvcnQgdmFyIGlzQ2hyb21lID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGhlbGlwb3J0V2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwiY2hyb21lXCIpICE9PSAtMTtcbn07XG4vKipcbiAqIFx1NjcyQVx1NEY3Rlx1NzUyOFxuICovIGV4cG9ydCB2YXIgaXNBbmRyb2lkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGhlbGlwb3J0V2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwiYW5kcm9pZFwiKSAhPT0gLTE7XG59O1xuZXhwb3J0IHZhciBpc01vYmlsZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChpc0lwYWQoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhlbGlwb3J0V2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuc2VhcmNoKE1PQklMRV9VU0VSX0FHRU5UX1JFR1MpICE9PSAtMTtcbn07XG52YXIgaXNJcGFkID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFnZW50ID0gaGVsaXBvcnRXaW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBhZ2VudC5pbmRleE9mKFwiaXBhZFwiKSA+IC0xIHx8IGFnZW50LmluZGV4T2YoXCJtYWNpbnRvc2hcIikgPiAtMSAmJiBcIm9udG91Y2hlbmRcIiBpbiBkb2N1bWVudDtcbn07XG5leHBvcnQgdmFyIGlzSVBob25lID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKGlzSXBhZCgpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaGVsaXBvcnRXaW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5zZWFyY2goSVBIT05FX1VTRVJfQUdFTlRfUkVHUykgIT09IC0xO1xufTtcbmV4cG9ydCB2YXIgaXNNYWMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYWdlbnQgPSBoZWxpcG9ydFdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIGFnZW50LmluZGV4T2YoXCJtYWNpbnRvc2hcIikgPiAtMTtcbn07XG5leHBvcnQgdmFyIGlzRmlyZWZveCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJmaXJlZm94XCIpICE9PSAtMTtcbn07XG5leHBvcnQgdmFyIGdldElPU1ZlcnNpb24gPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoL2lQKGhvbmV8b2R8YWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkpIHtcbiAgICAgICAgdmFyIHYgPSBuYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvT1MgKFxcZCspXyhcXGQrKV8/KFxcZCspPy8pO1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQodlsxXSwgMTApICogMTAwICsgcGFyc2VJbnQodlsyXSwgMTApO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn07XG5leHBvcnQgdmFyIGlzaU9TMTRVbmRlciA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghaXNJUGhvbmUoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBnZXRJT1NWZXJzaW9uKCkgPCBJT1NfVkVSXzE1O1xufTtcbmV4cG9ydCB2YXIgZGV0ZWN0TGFuZyA9IGZ1bmN0aW9uKGxhbmcpIHtcbiAgICB2YXIgYnJvd3NlckxhbmcgPSBoZWxpcG9ydFdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIGhlbGlwb3J0V2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF0gfHwgaGVsaXBvcnRXaW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlIHx8IGhlbGlwb3J0V2luZG93Lm5hdmlnYXRvci51c2VyTGFuZ3VhZ2UgfHwgaGVsaXBvcnRXaW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZTtcbiAgICByZXR1cm4gYnJvd3NlckxhbmcgPT09IGxhbmcgfHwgYnJvd3NlckxhbmcuaW5jbHVkZXMobGFuZyk7XG59O1xuLy9cbmV4cG9ydCB2YXIgaXNMYW5nSmEgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGV0ZWN0TGFuZyhcImphXCIpO1xufTtcbi8qKlxuICogQHJlbWFya3NcbiAqIG1hY00xXHU3NEIwXHU1ODgzXHU3NTI4UmVuZGVyVHlwZXNcdThGRDRcdTUzNzRcdTk1QTJcdTY1NzBcbiAqLyBleHBvcnQgdmFyIGRlZmluZVlvdXJSZW5kZXJUeXBlcyA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIHJldHVybiBbJ3dlYmdsJywgJ2V4cGVyaW1lbnRhbC13ZWJnbCcsICd3ZWJnbDInXTtcbiAgICByZXR1cm4gW1xuICAgICAgICBcIndlYmdsXCIsXG4gICAgICAgIFwiZXhwZXJpbWVudGFsLXdlYmdsXCJcbiAgICBdO1xufTtcbiIsICJmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gICAgfVxufVxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxudmFyIF9fZ2VuZXJhdG9yID0gdGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yIHx8IGZ1bmN0aW9uKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgZiwgeSwgdCwgZywgXyA9IHtcbiAgICAgICAgbGFiZWw6IDAsXG4gICAgICAgIHNlbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdO1xuICAgICAgICAgICAgcmV0dXJuIHRbMV07XG4gICAgICAgIH0sXG4gICAgICAgIHRyeXM6IFtdLFxuICAgICAgICBvcHM6IFtdXG4gICAgfTtcbiAgICByZXR1cm4gZyA9IHtcbiAgICAgICAgbmV4dDogdmVyYigwKSxcbiAgICAgICAgXCJ0aHJvd1wiOiB2ZXJiKDEpLFxuICAgICAgICBcInJldHVyblwiOiB2ZXJiKDIpXG4gICAgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgICByZXR1cm4gc3RlcChbXG4gICAgICAgICAgICAgICAgbixcbiAgICAgICAgICAgICAgICB2XG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlKF8pdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbXG4gICAgICAgICAgICAgICAgb3BbMF0gJiAyLFxuICAgICAgICAgICAgICAgIHQudmFsdWVcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBzd2l0Y2gob3BbMF0pe1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHQgPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3BbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgICAgICAgICB5ID0gb3BbMV07XG4gICAgICAgICAgICAgICAgICAgIG9wID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG9wID0gXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCBvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gdFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gdFsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ub3BzLnB1c2gob3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIG9wID0gW1xuICAgICAgICAgICAgICAgIDYsXG4gICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHkgPSAwO1xuICAgICAgICB9IGZpbmFsbHl7XG4gICAgICAgICAgICBmID0gdCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgfTtcbiAgICB9XG59O1xuaW1wb3J0IHsgaGVsaXBvcnRXaW5kb3cgfSBmcm9tIFwiLi4vY29uc3RcIjtcbmltcG9ydCB7IGdldE1haW5DYW52YXMgfSBmcm9tIFwiLi4vbW9kdWxlcy9kb21cIjtcbmltcG9ydCB7IGlzSVBob25lIH0gZnJvbSBcIi4uL21vZHVsZXMvcGxhdGZvcm1cIjtcbmltcG9ydCB7IHNob3dTY3JlZW5TaG90TW9kYWwgfSBmcm9tIFwiLi4vbW9kdWxlcy9zY3JlZW5TaG90TW9kYWxcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL3V0aWxzL2RlYnVnXCI7XG5leHBvcnQgdmFyIHVzZVNjcmVlbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0YWtlU2NyZWVuU2hvdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbWFpbkNhbnZhcyA9IGdldE1haW5DYW52YXMoKTtcbiAgICAgICAgaWYgKG1haW5DYW52YXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFwiWyB0YWtlU2NyZWVuU2hvdCBdIG1haW5DYW52YXMgaXMgbm90IGFzc2lnbmVkLiBub29wXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlQaG9uZVx1MzA2N1x1MzA2RVx1MzBCOVx1MzBBRlx1MzBCN1x1MzBFN1xuICAgICAgICAvLyBcdTkwMUFcdTVFMzhcdTMwNkVcdTY1QjlcdTZDRDVcdTMwNjdcdTMwQjlcdTMwQUZcdTMwQjdcdTMwRTdcdTMwOTJcdTY0QUVcdTVGNzFcdTMwNTlcdTMwOEJcdTMwNjhTa3l3YXlcdTMwNENcdTUyMDdcdTY1QURcdTMwNTVcdTMwOENcdTMwNjZcdTMwNTdcdTMwN0VcdTMwNDZcdTMwNUZcdTMwODFcdTMwMDFcdTMwNTNcdTMwNkVcdTMwODhcdTMwNDZcdTMwNkJcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOEJcbiAgICAgICAgaWYgKGlzSVBob25lKCkpIHtcbiAgICAgICAgICAgIGhlbGlwb3J0V2luZG93LmxvY2FsU3RvcmFnZVtcInNzQmFzZTY0XCJdID0gbWFpbkNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIik7XG4gICAgICAgICAgICBzaG93U2NyZWVuU2hvdE1vZGFsKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBcdTMwNURcdTMwNkVcdTRFRDZcdTMwNkVcdTMwQzdcdTMwRDBcdTMwQTRcdTMwQjlcdTMwNjdcdTMwNkVcdTMwQjlcdTMwQUZcdTMwQjdcdTMwRTdcbiAgICAgICAgbWFpbkNhbnZhcy50b0Jsb2IoZnVuY3Rpb24oYmxvYikge1xuICAgICAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgICAgIGEuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgICAgICB2YXIgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgYS5kb3dubG9hZCA9IFwiXCIgKyB0b2RheS5nZXRGdWxsWWVhcigpICsgKFwiMDBcIiArICh0b2RheS5nZXRNb250aCgpICsgMSkpLnNsaWNlKC0yKSArIChcIjAwXCIgKyB0b2RheS5nZXREYXRlKCkpLnNsaWNlKC0yKSArIFwiX1wiICsgKFwiMDBcIiArIHRvZGF5LmdldEhvdXJzKCkpLnNsaWNlKC0yKSArIChcIjAwXCIgKyB0b2RheS5nZXRNaW51dGVzKCkpLnNsaWNlKC0yKSArIChcIjAwXCIgKyB0b2RheS5nZXRTZWNvbmRzKCkpLnNsaWNlKC0yKSArIFwiLnBuZ1wiO1xuICAgICAgICAgICAgYS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgICAgICAgYS5jbGljaygpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgdmFyIHRvZ2dsZUZ1bGxTY3JlZW4gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBtYWluQ2FudmFzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9zdGF0ZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaChfc3RhdGUubGFiZWwpe1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWluQ2FudmFzID0gZ2V0TWFpbkNhbnZhcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5mdWxsc2NyZWVuRW5hYmxlZCB8fCBtYWluQ2FudmFzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coXCJbIHRvZ2dsZUZ1bGxTY3JlZW4gXSBtYWluQ2FudmFzTm90Rm91bmQgb3IgZnVsbFNjcmVlbiBkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCkgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZyhcIlsgdG9nZ2xlRnVsbFNjcmVlbiBdIGZ1bGwgc2NyZWVuIHJlcXVlc3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluQ2FudmFzLnJlcXVlc3RGdWxsc2NyZWVuKClcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNFxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coXCJbIHRvZ2dsZUZ1bGxTY3JlZW4gXSBmdWxsIHNjcmVlbiBleGl0ZWRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9zdGF0ZS5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHRvZ2dsZUZ1bGxTY3JlZW4oKSB7XG4gICAgICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgIH0oKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0YWtlU2NyZWVuU2hvdDogdGFrZVNjcmVlblNob3QsXG4gICAgICAgIHRvZ2dsZUZ1bGxTY3JlZW46IHRvZ2dsZUZ1bGxTY3JlZW5cbiAgICB9O1xufTtcbiIsICJleHBvcnQgdmFyIHVzZVRleHQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVtb3ZlRW1vamkgPSBmdW5jdGlvbih0ZXh0Q29udGV4dCkge1xuICAgICAgICB2YXIgcmVnZXhDb25kaXRpb25zID0gUmVnRXhwKFwiXFxcXHB7RW1vamlfTW9kaWZpZXJfQmFzZX1cXFxccHtFbW9qaV9Nb2RpZmllcn0/fFxcXFxwe0Vtb2ppX1ByZXNlbnRhdGlvbn18XFxcXHB7RW1vaml9XFxcXHVGRTBGXCIsIFwiZ3VcIik7XG4gICAgICAgIHRleHRDb250ZXh0LnZhbHVlID0gdGV4dENvbnRleHQudmFsdWUucmVwbGFjZUFsbChyZWdleENvbmRpdGlvbnMsIFwiKlwiKTtcbiAgICAgICAgcmV0dXJuIHRleHRDb250ZXh0O1xuICAgIH07XG4gICAgdmFyIGNvbG9uQ29udHJvbCA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZShcIjpcIiwgXCImY29sb247XCIpO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29sb25Db250cm9sOiBjb2xvbkNvbnRyb2wsXG4gICAgICAgIHJlbW92ZUVtb2ppOiByZW1vdmVFbW9qaVxuICAgIH07XG59O1xuIiwgImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgICB9XG59XG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG52YXIgX19nZW5lcmF0b3IgPSB0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IgfHwgZnVuY3Rpb24odGhpc0FyZywgYm9keSkge1xuICAgIHZhciBmLCB5LCB0LCBnLCBfID0ge1xuICAgICAgICBsYWJlbDogMCxcbiAgICAgICAgc2VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAodFswXSAmIDEpIHRocm93IHRbMV07XG4gICAgICAgICAgICByZXR1cm4gdFsxXTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ5czogW10sXG4gICAgICAgIG9wczogW11cbiAgICB9O1xuICAgIHJldHVybiBnID0ge1xuICAgICAgICBuZXh0OiB2ZXJiKDApLFxuICAgICAgICBcInRocm93XCI6IHZlcmIoMSksXG4gICAgICAgIFwicmV0dXJuXCI6IHZlcmIoMilcbiAgICB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwKFtcbiAgICAgICAgICAgICAgICBuLFxuICAgICAgICAgICAgICAgIHZcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUoXyl0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtcbiAgICAgICAgICAgICAgICBvcFswXSAmIDIsXG4gICAgICAgICAgICAgICAgdC52YWx1ZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHN3aXRjaChvcFswXSl7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBvcFsxXTtcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gb3BbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgb3AgPSBbXG4gICAgICAgICAgICAgICAgNixcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgeSA9IDA7XG4gICAgICAgIH0gZmluYWxseXtcbiAgICAgICAgICAgIGYgPSB0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLFxuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cbn07XG5pbXBvcnQgeyBmYWN0b3J5IH0gZnJvbSBcIi4uL3NlcnZpY2VzL2ZhY3RvcnlcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL3V0aWxzL2RlYnVnXCI7XG52YXIgdnJBZFJlcG9zaXRvcnkgPSBmYWN0b3J5LmdldChcInZyQWRcIik7XG4vKipcbiAqIEByZW1hcmtzXG4gKiBbYXN5bmNdIFZyQWRcdTRFMDBcdTg5QTdcdTMwOTJcdTUzRDZcdTVGOTdcbiAqIEByZXR1cm5zIHtWckFkUmVzcG9uc2V9XG4gKi8gdmFyIGZldGNoVnJBZExpc3QgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKHdvcmxkSWQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCwgXywgZTtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9zdGF0ZSkge1xuICAgICAgICAgICAgc3dpdGNoKF9zdGF0ZS5sYWJlbCl7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBfc3RhdGUudHJ5cy5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgNFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICB2ckFkUmVwb3NpdG9yeS5nZXQuZ2V0QWRMaXN0KHdvcmxkSWQpXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBfID0gSlNPTi5zdHJpbmdpZnk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmpzb24oKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmFwcGx5KEpTT04sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3RhdGUuc2VudCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZSA9IF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiBmZXRjaFZyQWRMaXN0KHdvcmxkSWQpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufSgpO1xuZXhwb3J0IHZhciB1c2VWckFkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmV0Y2hWckFkTGlzdDogZmV0Y2hWckFkTGlzdFxuICAgIH07XG59O1xuIiwgImltcG9ydCB7IGhlbGlwb3J0V2luZG93IH0gZnJvbSBcIi4uL2NvbnN0XCI7XG5pbXBvcnQgeyBnZXRNYWluQ2FudmFzLCByZWZsZWN0Q2FudmFzU2l6ZSB9IGZyb20gXCIuLi9tb2R1bGVzL2RvbVwiO1xuaW1wb3J0IHsgZGVidWdMb2cgfSBmcm9tIFwiLi4vdXRpbHMvZGVidWdcIjtcbnZhciBpbml0aWFsaXplTWFpbkNhbnZhcyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBtYWluQ2FudmFzID0gZ2V0TWFpbkNhbnZhcygpO1xuICAgIGlmIChtYWluQ2FudmFzID09PSBudWxsKSB7XG4gICAgICAgIGRlYnVnTG9nKFwiWyBpbml0aWFsaXplTWFpbkNhbnZhcyBdIG1haW5DYW52YXMgbm90IGZldGNoZWRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbWFpbkNhbnZhcy53aWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBtYWluQ2FudmFzLmhlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgbWFpbkNhbnZhcy5vbmNsaWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGhlbGlwb3J0V2luZG93LmdfTWFpbkNhbnZhcy5mb2N1cygpO1xuICAgIH07XG4gICAgbWFpbkNhbnZhcy5vbmNvbnRleHRtZW51ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcbn07XG52YXIgY3JlYXRlVGV4dENhbnZhcyA9IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB2YXIgdGV4dENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgdGV4dENhbnZhcy5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICB0ZXh0Q2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgdGV4dENhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgcmV0dXJuIHRleHRDYW52YXM7XG59O1xudmFyIGNsZWFyVGV4dENhbnZhcyA9IGZ1bmN0aW9uKHRleHRDYW52YXMpIHtcbiAgICB2YXIgY29udGV4dCA9IHRleHRDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIGlmIChjb250ZXh0ID09PSBudWxsKSByZXR1cm47XG4gICAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGV4dENhbnZhcy53aWR0aCwgdGV4dENhbnZhcy5oZWlnaHQpO1xufTtcbnZhciBoYW5kbGVWaXNpYmlsaXR5RXZlbnQgPSBmdW5jdGlvbihmdW5jKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBmdW5jO1xuICAgIH0pO1xufTtcbnZhciBoYW5kbGVGdWxsU2NyZWVuQ2hhbmdlRXZlbnQgPSBmdW5jdGlvbihmdW5jKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZ1bGxzY3JlZW5jaGFuZ2VcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBmdW5jO1xuICAgIH0pO1xufTtcbmV4cG9ydCB2YXIgdXNlQ2FudmFzID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5pdGlhbGl6ZU1haW5DYW52YXM6IGluaXRpYWxpemVNYWluQ2FudmFzLFxuICAgICAgICBjbGVhclRleHRDYW52YXM6IGNsZWFyVGV4dENhbnZhcyxcbiAgICAgICAgY3JlYXRlVGV4dENhbnZhczogY3JlYXRlVGV4dENhbnZhcyxcbiAgICAgICAgZ2V0TWFpbkNhbnZhczogZ2V0TWFpbkNhbnZhcyxcbiAgICAgICAgaGFuZGxlVmlzaWJpbGl0eUV2ZW50OiBoYW5kbGVWaXNpYmlsaXR5RXZlbnQsXG4gICAgICAgIGhhbmRsZUZ1bGxTY3JlZW5DaGFuZ2VFdmVudDogaGFuZGxlRnVsbFNjcmVlbkNoYW5nZUV2ZW50LFxuICAgICAgICByZWZsZWN0Q2FudmFzU2l6ZTogcmVmbGVjdENhbnZhc1NpemVcbiAgICB9O1xufTtcbiIsICJ2YXIgZ2V0Q29va2llID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBtYXRjaGVzID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoXCIoPzpefDsgKVwiICsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgbmFtZS5yZXBsYWNlKC8oW1xcLiQ/Knx7fVxcKFxcKVxcW1xcXVxcXFxcXC9cXCteXSkvZywgXCJcXFxcJDFcIikgKyBcIj0oW147XSopXCIpKTtcbiAgICByZXR1cm4gbWF0Y2hlcyA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaGVzWzFdKSA6IHVuZGVmaW5lZDtcbn07XG52YXIgc2V0Q29va2llID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgZXhwaXJlcyA9IFwiO0V4cGlyZXM9VGh1LCAxLUphbi0yMDMwIDAwOjAwOjAwIEdNVFwiO1xuICAgIC8vIENvb2tpZSBuZWVkcyBVUkwtZW5jb2RlLlxuICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgKyBleHBpcmVzO1xufTtcbmV4cG9ydCB2YXIgdXNlQ29va2llID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0Q29va2llOiBnZXRDb29raWUsXG4gICAgICAgIHNldENvb2tpZTogc2V0Q29va2llXG4gICAgfTtcbn07XG4iLCAiaW1wb3J0IHsgZ2V0Q29uZmlnVXJsLCBnZXRDb25maWdVcmxUZXh0LCBnZXRVc2VyTmFtZVRleHQsIGdldFVzZXJOYW1lLCBnZXRHVUlEZWJ1Z1RhYiwgZ2V0R1VJRGVidWcsIGdldE1zZywgZ2V0TG9jYWxUZXh0IH0gZnJvbSBcIi4uL21vZHVsZXMvZG9tXCI7XG52YXIgdG9nZ2xlQ29uZmlnVGV4dEZpZWxkID0gZnVuY3Rpb24oc2hvdykge1xuICAgIHZhciBsb2NhbFRleHRDb25maWdVcmwgPSBnZXRDb25maWdVcmxUZXh0KCk7XG4gICAgaWYgKGxvY2FsVGV4dENvbmZpZ1VybCAhPT0gbnVsbCkge1xuICAgICAgICBsb2NhbFRleHRDb25maWdVcmwuc3R5bGUudmlzaWJpbGl0eSA9IHNob3cgPyBcInZpc2libGVcIiA6IFwiaGlkZGVuXCI7XG4gICAgfVxuICAgIHZhciBjb25maWdVcmwgPSBnZXRDb25maWdVcmwoKTtcbiAgICBpZiAoY29uZmlnVXJsICE9PSBudWxsKSB7XG4gICAgICAgIGNvbmZpZ1VybC5zdHlsZS52aXNpYmlsaXR5ID0gc2hvdyA/IFwidmlzaWJsZVwiIDogXCJoaWRkZW5cIjtcbiAgICB9XG59O1xudmFyIHJlc2l6ZUNvbmZpZ1VybCA9IGZ1bmN0aW9uKHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICB2YXIgY29uZmlnVXJsID0gZ2V0Q29uZmlnVXJsKCk7XG4gICAgaWYgKGNvbmZpZ1VybCAhPT0gbnVsbCkge1xuICAgICAgICBjb25maWdVcmwuc3R5bGUubGVmdCA9IHggKyBcInB4XCI7XG4gICAgICAgIGNvbmZpZ1VybC5zdHlsZS50b3AgPSB5ICsgXCJweFwiO1xuICAgIH1cbiAgICB2YXIgbG9jYWxUZXh0Q29uZmlnVXJsID0gZ2V0Q29uZmlnVXJsVGV4dCgpO1xuICAgIGlmIChsb2NhbFRleHRDb25maWdVcmwgIT09IG51bGwpIHtcbiAgICAgICAgbG9jYWxUZXh0Q29uZmlnVXJsLnN0eWxlLndpZHRoID0gd2lkdGggKyBcInB4XCI7XG4gICAgICAgIGxvY2FsVGV4dENvbmZpZ1VybC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyBcInB4XCI7XG4gICAgfVxufTtcbnZhciBzZXRDb25maWdVcmxUZXh0RmllbGQgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIGxvY2FsVGV4dENvbmZpZ1VybCA9IGdldENvbmZpZ1VybFRleHQoKTtcbiAgICBpZiAobG9jYWxUZXh0Q29uZmlnVXJsICE9PSBudWxsKSB7XG4gICAgICAgIGxvY2FsVGV4dENvbmZpZ1VybC52YWx1ZSA9IHRleHQ7XG4gICAgfVxufTtcbnZhciBzZXRDb25maWdVcmxGb250U2l6ZSA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbG9jYWxUZXh0Q29uZmlnVXJsID0gZ2V0Q29uZmlnVXJsVGV4dCgpO1xuICAgIGlmIChsb2NhbFRleHRDb25maWdVcmwgIT09IG51bGwpIHtcbiAgICAgICAgbG9jYWxUZXh0Q29uZmlnVXJsLnN0eWxlLmZvbnRTaXplID0gdGV4dCArIFwicHhcIjtcbiAgICB9XG59O1xudmFyIHRvZ2dsZVVzZXJOYW1lVGV4dEZpZWxkID0gZnVuY3Rpb24oc2hvdykge1xuICAgIHZhciB1c2VyTmFtZVRleHQgPSBnZXRVc2VyTmFtZVRleHQoKTtcbiAgICBpZiAodXNlck5hbWVUZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIHVzZXJOYW1lVGV4dC5zdHlsZS52aXNpYmlsaXR5ID0gc2hvdyA/IFwidmlzaWJsZVwiIDogXCJoaWRkZW5cIjtcbiAgICB9XG4gICAgdmFyIHVzZXJOYW1lID0gZ2V0VXNlck5hbWUoKTtcbiAgICBpZiAodXNlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgdXNlck5hbWUuc3R5bGUudmlzaWJpbGl0eSA9IHNob3cgPyBcInZpc2libGVcIiA6IFwiaGlkZGVuXCI7XG4gICAgfVxufTtcbnZhciBzZXRVc2VyTmFtZVRleHRGaWVsZCA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgdXNlck5hbWVUZXh0ID0gZ2V0VXNlck5hbWVUZXh0KCk7XG4gICAgaWYgKHVzZXJOYW1lVGV4dCAhPT0gbnVsbCkge1xuICAgICAgICB1c2VyTmFtZVRleHQudmFsdWUgPSB0ZXh0O1xuICAgIH1cbn07XG52YXIgc2V0VXNlck5hbWVGb250U2l6ZSA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgdXNlck5hbWVUZXh0ID0gZ2V0VXNlck5hbWVUZXh0KCk7XG4gICAgaWYgKHVzZXJOYW1lVGV4dCAhPT0gbnVsbCkge1xuICAgICAgICB1c2VyTmFtZVRleHQuc3R5bGUuZm9udFNpemUgPSB0ZXh0ICsgXCJweFwiO1xuICAgIH1cbn07XG52YXIgc2V0RGVidWdUYWJCeSA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgdGFiID0gZ2V0R1VJRGVidWdUYWIoKTtcbiAgICBpZiAodGFiID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGFiLmlubmVySFRNTCA9IHRleHQ7XG59O1xudmFyIHNldERlYnVnQnkgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIGRlYnVnID0gZ2V0R1VJRGVidWcoKTtcbiAgICBpZiAoZGVidWcgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWJ1Zy5pbm5lckhUTUwgPSB0ZXh0O1xufTtcbnZhciBzZXRTaG93Q2hhdEJveCA9IGZ1bmN0aW9uKHNob3cpIHtcbiAgICB2YXIgbXNnID0gZ2V0TXNnKCk7XG4gICAgaWYgKG1zZyAhPT0gbnVsbCkge1xuICAgICAgICBtc2cuc3R5bGUudmlzaWJpbGl0eSA9IHNob3cgPyBcInZpc2libGVcIiA6IFwiaGlkZGVuXCI7XG4gICAgfVxuICAgIHZhciBsb2NhbFRleHQgPSBnZXRMb2NhbFRleHQoKTtcbiAgICBpZiAobG9jYWxUZXh0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbG9jYWxUZXh0LnN0eWxlLnZpc2liaWxpdHkgPSBzaG93ID8gXCJ2aXNpYmxlXCIgOiBcImhpZGRlblwiO1xufTtcbnZhciBzZXRUZXh0RmllbGRMb2NhbFRlc3RGb250U2l6ZSA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbG9jYWxUZXh0ID0gZ2V0TG9jYWxUZXh0KCk7XG4gICAgaWYgKGxvY2FsVGV4dCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvY2FsVGV4dC5zdHlsZS5mb250U2l6ZSA9IHRleHQgKyBcInB4XCI7XG59O1xudmFyIHJlc2l6ZUNoYXRib3ggPSBmdW5jdGlvbih4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdmFyIG1zZyA9IGdldE1zZygpO1xuICAgIGlmIChtc2cgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBtc2cuc3R5bGUubGVmdCA9IHggKyBcInB4XCI7XG4gICAgbXNnLnN0eWxlLnRvcCA9IHkgKyBcInB4XCI7XG4gICAgdmFyIGxvY2FsVGV4dCA9IGdldExvY2FsVGV4dCgpO1xuICAgIGlmIChsb2NhbFRleHQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2NhbFRleHQuc3R5bGUud2lkdGggPSB3aWR0aCArIFwicHhcIjtcbiAgICBsb2NhbFRleHQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgXCJweFwiO1xufTtcbmV4cG9ydCB2YXIgdXNlRG9jdW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICByZXNpemVDb25maWdVcmw6IHJlc2l6ZUNvbmZpZ1VybCxcbiAgICAgICAgc2V0Q29uZmlnVXJsVGV4dEZpZWxkOiBzZXRDb25maWdVcmxUZXh0RmllbGQsXG4gICAgICAgIHNldENvbmZpZ1VybEZvbnRTaXplOiBzZXRDb25maWdVcmxGb250U2l6ZSxcbiAgICAgICAgc2V0VXNlck5hbWVUZXh0RmllbGQ6IHNldFVzZXJOYW1lVGV4dEZpZWxkLFxuICAgICAgICBzZXRVc2VyTmFtZUZvbnRTaXplOiBzZXRVc2VyTmFtZUZvbnRTaXplLFxuICAgICAgICB0b2dnbGVDb25maWdUZXh0RmllbGQ6IHRvZ2dsZUNvbmZpZ1RleHRGaWVsZCxcbiAgICAgICAgdG9nZ2xlVXNlck5hbWVUZXh0RmllbGQ6IHRvZ2dsZVVzZXJOYW1lVGV4dEZpZWxkLFxuICAgICAgICBzZXREZWJ1Z0J5OiBzZXREZWJ1Z0J5LFxuICAgICAgICBzZXREZWJ1Z1RhYkJ5OiBzZXREZWJ1Z1RhYkJ5LFxuICAgICAgICBzZXRUZXh0RmllbGRMb2NhbFRlc3RGb250U2l6ZTogc2V0VGV4dEZpZWxkTG9jYWxUZXN0Rm9udFNpemUsXG4gICAgICAgIHNldFNob3dDaGF0Qm94OiBzZXRTaG93Q2hhdEJveCxcbiAgICAgICAgcmVzaXplQ2hhdGJveDogcmVzaXplQ2hhdGJveFxuICAgIH07XG59O1xuIiwgImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgICB9XG59XG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG52YXIgX19nZW5lcmF0b3IgPSB0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IgfHwgZnVuY3Rpb24odGhpc0FyZywgYm9keSkge1xuICAgIHZhciBmLCB5LCB0LCBnLCBfID0ge1xuICAgICAgICBsYWJlbDogMCxcbiAgICAgICAgc2VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAodFswXSAmIDEpIHRocm93IHRbMV07XG4gICAgICAgICAgICByZXR1cm4gdFsxXTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ5czogW10sXG4gICAgICAgIG9wczogW11cbiAgICB9O1xuICAgIHJldHVybiBnID0ge1xuICAgICAgICBuZXh0OiB2ZXJiKDApLFxuICAgICAgICBcInRocm93XCI6IHZlcmIoMSksXG4gICAgICAgIFwicmV0dXJuXCI6IHZlcmIoMilcbiAgICB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwKFtcbiAgICAgICAgICAgICAgICBuLFxuICAgICAgICAgICAgICAgIHZcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUoXyl0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtcbiAgICAgICAgICAgICAgICBvcFswXSAmIDIsXG4gICAgICAgICAgICAgICAgdC52YWx1ZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHN3aXRjaChvcFswXSl7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBvcFsxXTtcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gb3BbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgb3AgPSBbXG4gICAgICAgICAgICAgICAgNixcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgeSA9IDA7XG4gICAgICAgIH0gZmluYWxseXtcbiAgICAgICAgICAgIGYgPSB0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLFxuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cbn07XG52YXIgaW5pdGlhbGl6ZUd5cm8gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgcGVybWlzc2lvblN0YXRlO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKERldmljZU9yaWVudGF0aW9uRXZlbnQgJiYgRGV2aWNlT3JpZW50YXRpb25FdmVudC5yZXF1ZXN0UGVybWlzc2lvbiAmJiB0eXBlb2YgRGV2aWNlT3JpZW50YXRpb25FdmVudC5yZXF1ZXN0UGVybWlzc2lvbiA9PT0gXCJmdW5jdGlvblwiKSkgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlT3JpZW50YXRpb25FdmVudC5yZXF1ZXN0UGVybWlzc2lvbigpXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uU3RhdGUgPSBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25TdGF0ZSA9PT0gXCJncmFudGVkXCJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGluaXRpYWxpemVHeXJvKCkge1xuICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59KCk7XG5leHBvcnQgdmFyIHVzZUd5cm8gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbml0aWFsaXplR3lybzogaW5pdGlhbGl6ZUd5cm9cbiAgICB9O1xufTtcbiIsICJpbXBvcnQgeyBkZWZpbmVZb3VyUmVuZGVyVHlwZXMsIGRldGVjdExhbmcsIGdldElPU1ZlcnNpb24sIGlzQW5kcm9pZCwgaXNDaHJvbWUsIGlzRmlyZWZveCwgaXNpT1MxNFVuZGVyLCBpc0lQaG9uZSwgaXNMYW5nSmEsIGlzTWFjLCBpc01vYmlsZSB9IGZyb20gXCIuLi9tb2R1bGVzL3BsYXRmb3JtXCI7XG5leHBvcnQgdmFyIHVzZVBsYXRmb3JtID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVmaW5lWW91clJlbmRlclR5cGVzOiBkZWZpbmVZb3VyUmVuZGVyVHlwZXMsXG4gICAgICAgIGRldGVjdExhbmc6IGRldGVjdExhbmcsXG4gICAgICAgIGdldElPU1ZlcnNpb246IGdldElPU1ZlcnNpb24sXG4gICAgICAgIGlzQW5kcm9pZDogaXNBbmRyb2lkLFxuICAgICAgICBpc0Nocm9tZTogaXNDaHJvbWUsXG4gICAgICAgIGlzRmlyZWZveDogaXNGaXJlZm94LFxuICAgICAgICBpc0lQaG9uZTogaXNJUGhvbmUsXG4gICAgICAgIGlzaU9TMTRVbmRlcjogaXNpT1MxNFVuZGVyLFxuICAgICAgICBpc0xhbmdKYTogaXNMYW5nSmEsXG4gICAgICAgIGlzTWFjOiBpc01hYyxcbiAgICAgICAgaXNNb2JpbGU6IGlzTW9iaWxlXG4gICAgfTtcbn07XG4iLCAiaW1wb3J0IHsgaXNGaXJlZm94IH0gZnJvbSBcIi4vcGxhdGZvcm1cIjtcbmV4cG9ydCB2YXIgY2hlY2tQVlJUQyA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgICB2YXIgcHZydGMgPSBjb250ZXh0LmdldEV4dGVuc2lvbihcIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Y1wiKSB8fCBjb250ZXh0LmdldEV4dGVuc2lvbihcIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGNcIik7XG4gICAgaWYgKHB2cnRjID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgc3VwcG9ydGVkQ29tcHJlc3NlZFRleHR1cmVGb3JtYXQgPSBjb250ZXh0LmdldFBhcmFtZXRlcihjb250ZXh0LkNPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTKTtcbiAgICBpZiAoIXN1cHBvcnRlZENvbXByZXNzZWRUZXh0dXJlRm9ybWF0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHN1cHBvcnRzUFZSVENSZ2IgPSBzdXBwb3J0ZWRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdC5pbmNsdWRlcyhwdnJ0Yy5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HKTtcbiAgICBpZiAoIXN1cHBvcnRzUFZSVENSZ2IpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3VwcG9ydGVkQ29tcHJlc3NlZFRleHR1cmVGb3JtYXQuaW5jbHVkZXMocHZydGMuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUcpO1xufTtcbmV4cG9ydCB2YXIgY2hlY2tFdGMyID0gZnVuY3Rpb24oY29udGV4dCkge1xuICAgIHZhciBldGMyID0gY29udGV4dC5nZXRFeHRlbnNpb24oXCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjXCIpIHx8IGNvbnRleHQuZ2V0RXh0ZW5zaW9uKFwiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGNcIik7XG4gICAgaWYgKGV0YzIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBzdXBwb3J0ZWRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdCA9IGNvbnRleHQuZ2V0UGFyYW1ldGVyKGNvbnRleHQuQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMpO1xuICAgIGlmICghc3VwcG9ydGVkQ29tcHJlc3NlZFRleHR1cmVGb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgc3VwcG9ydHNFVEMyUmdiID0gc3VwcG9ydGVkQ29tcHJlc3NlZFRleHR1cmVGb3JtYXQuaW5jbHVkZXMoZXRjMi5DT01QUkVTU0VEX1JHQjhfRVRDMik7XG4gICAgaWYgKCFzdXBwb3J0c0VUQzJSZ2IpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3VwcG9ydGVkQ29tcHJlc3NlZFRleHR1cmVGb3JtYXQuaW5jbHVkZXMoZXRjMi5DT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDKTtcbn07XG5leHBvcnQgdmFyIGNoZWNrQXN0YyA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgICB2YXIgYXN0YyA9IGNvbnRleHQuZ2V0RXh0ZW5zaW9uKFwiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGNcIikgfHwgY29udGV4dC5nZXRFeHRlbnNpb24oXCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGNcIik7XG4gICAgaWYgKGFzdGMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBzdXBwb3J0ZWRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdCA9IGNvbnRleHQuZ2V0UGFyYW1ldGVyKGNvbnRleHQuQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMpO1xuICAgIGlmICghc3VwcG9ydGVkQ29tcHJlc3NlZFRleHR1cmVGb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3VwcG9ydGVkQ29tcHJlc3NlZFRleHR1cmVGb3JtYXQuaW5jbHVkZXMoYXN0Yy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzR4NF9LSFIpO1xufTtcbmV4cG9ydCB2YXIgY2hlY2tEeHQgPSBmdW5jdGlvbihjb250ZXh0KSB7XG4gICAgdmFyIGR4dCA9IGNvbnRleHQuZ2V0RXh0ZW5zaW9uKFwiRVhUX3RleHR1cmVfY29tcHJlc3Npb25fYnB0Y1wiKTtcbiAgICBpZiAoZHh0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHN1cHBvcnRlZENvbXByZXNzZWRUZXh0dXJlRm9ybWF0ID0gY29udGV4dC5nZXRQYXJhbWV0ZXIoY29udGV4dC5DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyk7XG4gICAgaWYgKCFzdXBwb3J0ZWRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBzdXBwb3J0c0R4dFVub3JtID0gc3VwcG9ydGVkQ29tcHJlc3NlZFRleHR1cmVGb3JtYXQuaW5jbHVkZXMoZHh0LkNPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNX0VYVCk7XG4gICAgaWYgKCFzdXBwb3J0c0R4dFVub3JtKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cHBvcnRlZENvbXByZXNzZWRUZXh0dXJlRm9ybWF0LmluY2x1ZGVzKGR4dC5DT01QUkVTU0VEX1NSR0JfQUxQSEFfQlBUQ19VTk9STV9FWFQpO1xufTtcbi8vIFNoYWRlciBFeHRlbnNpb25cbmV4cG9ydCB2YXIgY2hlY2tFeHRTaGFkZXJUZXh0dXJlTG9kID0gZnVuY3Rpb24oY29udGV4dCkge1xuICAgIHJldHVybiBjb250ZXh0LmdldEV4dGVuc2lvbihcIkVYVF9zaGFkZXJfdGV4dHVyZV9sb2RcIikgIT09IHVuZGVmaW5lZDtcbn07XG4vLyBUZXh0dXJlIEV4dGVuc2lvblxuZXhwb3J0IHZhciBjaGVja0V4dENvbG9yQnVmZmVySGFsZkZsb2F0ID0gZnVuY3Rpb24oY29udGV4dCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjYW1lbGNhc2VcbiAgICB2YXIgaGFsZkZsb2F0ID0gaXNGaXJlZm94KCkgPyBjb250ZXh0LmdldEV4dGVuc2lvbihcIkVYVF9jb2xvcl9idWZmZXJfZmxvYXRcIikgOiBjb250ZXh0LmdldEV4dGVuc2lvbihcIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdFwiKTtcbiAgICByZXR1cm4gaGFsZkZsb2F0ICE9PSB1bmRlZmluZWQ7XG59O1xuZXhwb3J0IHZhciBjaGVja09lc1RleHR1cmVIYWxmRmxvYXQgPSBmdW5jdGlvbihjb250ZXh0KSB7XG4gICAgdmFyIGhhbGZGbG9hdCA9IGNvbnRleHQuZ2V0RXh0ZW5zaW9uKFwiT0VTX3RleHR1cmVfaGFsZl9mbG9hdFwiKTtcbiAgICByZXR1cm4gaGFsZkZsb2F0ICE9PSB1bmRlZmluZWQ7XG59O1xuIiwgImltcG9ydCB7IGhlbGlwb3J0V2luZG93IH0gZnJvbSBcIi4uL2NvbnN0XCI7XG5pbXBvcnQgeyBnZXRNYWluQ2FudmFzIH0gZnJvbSBcIi4uL21vZHVsZXMvZG9tXCI7XG5pbXBvcnQgeyBjaGVja0FzdGMsIGNoZWNrRHh0LCBjaGVja0V0YzIsIGNoZWNrRXh0Q29sb3JCdWZmZXJIYWxmRmxvYXQsIGNoZWNrRXh0U2hhZGVyVGV4dHVyZUxvZCwgY2hlY2tPZXNUZXh0dXJlSGFsZkZsb2F0LCBjaGVja1BWUlRDIH0gZnJvbSBcIi4uL21vZHVsZXMvZ2xcIjtcbmltcG9ydCB7IGRlZmluZVlvdXJSZW5kZXJUeXBlcywgaXNJUGhvbmUsIGlzTWFjIH0gZnJvbSBcIi4uL21vZHVsZXMvcGxhdGZvcm1cIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL3V0aWxzL2RlYnVnXCI7XG5leHBvcnQgdmFyIHVzZVJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbml0aWFsaXplR2wgPSBmdW5jdGlvbihtYWpvclZlcnNpb24pIHtcbiAgICAgICAgdmFyIG1haW5DYW52YXMgPSBnZXRNYWluQ2FudmFzKCk7XG4gICAgICAgIHZhciB3ZWJHbDEwVG9nZ2xlID0gbWFqb3JWZXJzaW9uID09PSAxIHx8IGlzSVBob25lKCkgfHwgaXNNYWMoKTtcbiAgICAgICAgdmFyIGdsQXR0cmlicyA9IHtcbiAgICAgICAgICAgIGFscGhhOiAwLFxuICAgICAgICAgICAgcHJlbXVsdGlwbGllZEFscGhhOiAwLFxuICAgICAgICAgICAgZGVwdGg6IHRydWUsXG4gICAgICAgICAgICBtYWpvclZlcnNpb246IG1ham9yVmVyc2lvbixcbiAgICAgICAgICAgIG1pbm9yVmVyc2lvbjogMCxcbiAgICAgICAgICAgIGVuYWJsZUV4dGVuc2lvbnNCeURlZmF1bHQ6IDEsXG4gICAgICAgICAgICBhbnRpYWxpYXM6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHdlYmdsY3R4ID0gbnVsbDtcbiAgICAgICAgaWYgKCF3ZWJHbDEwVG9nZ2xlICYmIG1haW5DYW52YXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGdsQXR0cmlicy5hbnRpYWxpYXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHdlYmdsY3R4ID0gbWFpbkNhbnZhcy5nZXRDb250ZXh0KFwid2ViZ2wyXCIsIGdsQXR0cmlicyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF3ZWJnbGN0eCAmJiBtYWluQ2FudmFzICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3ZWJHbDEwVG9nZ2xlID0gdHJ1ZTtcbiAgICAgICAgICAgIGdsQXR0cmlicy5tYWpvclZlcnNpb24gPSAxO1xuICAgICAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlLCBfaXRlcmF0b3JFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yKHZhciBfaXRlcmF0b3IgPSBkZWZpbmVZb3VyUmVuZGVyVHlwZXMoKVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSAoX3N0ZXAgPSBfaXRlcmF0b3IubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWUpe1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dFR5cGUgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgd2ViZ2xjdHggPSBtYWluQ2FudmFzLmdldENvbnRleHQoY29udGV4dFR5cGUsIGdsQXR0cmlicyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3ZWJnbGN0eCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gZXJyO1xuICAgICAgICAgICAgfSBmaW5hbGx5e1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3IucmV0dXJuICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9pdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZmluYWxseXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXdlYmdsY3R4KSB7XG4gICAgICAgICAgICBkZWJ1Z0xvZyhcIndlYmdsIGlzIG51bGxcIik7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ2xjdHggPSBHTC5yZWdpc3RlckNvbnRleHQod2ViZ2xjdHgsIGdsQXR0cmlicyk7XG4gICAgICAgIGlmICghZ2xjdHgpIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFwiZ2xjdHggaXMgbnVsbFwiKTtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIEdMLm1ha2VDb250ZXh0Q3VycmVudChnbGN0eCk7XG4gICAgICAgIGhlbGlwb3J0V2luZG93LmdfVGV4dHVyZUNvbXByZXNzaW9uX1BWUlRDID0gY2hlY2tQVlJUQyh3ZWJnbGN0eCk7XG4gICAgICAgIGhlbGlwb3J0V2luZG93LmdfVGV4dHVyZUNvbXByZXNzaW9uX0VUQzIgPSBjaGVja0V0YzIod2ViZ2xjdHgpO1xuICAgICAgICBoZWxpcG9ydFdpbmRvdy5nX1RleHR1cmVDb21wcmVzc2lvbl9BU1RDID0gY2hlY2tBc3RjKHdlYmdsY3R4KTtcbiAgICAgICAgaGVsaXBvcnRXaW5kb3cuZ19UZXh0dXJlQ29tcHJlc3Npb25fRFhUID0gY2hlY2tEeHQod2ViZ2xjdHgpO1xuICAgICAgICAvLyBTaGFkZXIgRXh0ZW5zaW9uXG4gICAgICAgIGhlbGlwb3J0V2luZG93LmdfVXNlX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgPSBjaGVja0V4dFNoYWRlclRleHR1cmVMb2Qod2ViZ2xjdHgpO1xuICAgICAgICAvLyBUZXh0dXJlIEV4dGVuc2lvblxuICAgICAgICBoZWxpcG9ydFdpbmRvdy5nX1VzZV9FWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQgPSBjaGVja0V4dENvbG9yQnVmZmVySGFsZkZsb2F0KHdlYmdsY3R4KTtcbiAgICAgICAgaGVsaXBvcnRXaW5kb3cuZ19Vc2VfT0VTX3RleHR1cmVfaGFsZl9mbG9hdCA9IGNoZWNrT2VzVGV4dHVyZUhhbGZGbG9hdCh3ZWJnbGN0eCk7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5pdGlhbGl6ZUdsOiBpbml0aWFsaXplR2xcbiAgICB9O1xufTtcbiIsICJmdW5jdGlvbiBfaW5zdGFuY2VvZihsZWZ0LCByaWdodCkge1xuICAgIGlmIChyaWdodCAhPSBudWxsICYmIHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgcmlnaHRbU3ltYm9sLmhhc0luc3RhbmNlXSkge1xuICAgICAgICByZXR1cm4gISFyaWdodFtTeW1ib2wuaGFzSW5zdGFuY2VdKGxlZnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsZWZ0IGluc3RhbmNlb2YgcmlnaHQ7XG4gICAgfVxufVxuIWZ1bmN0aW9uKGUsIHQpIHtcbiAgICBcIm9iamVjdFwiID09IHR5cGVvZiBleHBvcnRzICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIG1vZHVsZSA/IG1vZHVsZS5leHBvcnRzID0gdCgpIDogXCJmdW5jdGlvblwiID09IHR5cGVvZiBkZWZpbmUgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbXSwgdCkgOiBcIm9iamVjdFwiID09IHR5cGVvZiBleHBvcnRzID8gZXhwb3J0cy5ib3dzZXIgPSB0KCkgOiBlLmJvd3NlciA9IHQoKTtcbn0odGhpcywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdmFyIHQgPSB7fTtcbiAgICAgICAgZnVuY3Rpb24gcihuKSB7XG4gICAgICAgICAgICBpZiAodFtuXSkgcmV0dXJuIHRbbl0uZXhwb3J0cztcbiAgICAgICAgICAgIHZhciBpID0gdFtuXSA9IHtcbiAgICAgICAgICAgICAgICBpOiBuLFxuICAgICAgICAgICAgICAgIGw6ICExLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGVbbl0uY2FsbChpLmV4cG9ydHMsIGksIGkuZXhwb3J0cywgciksIGkubCA9ICEwLCBpLmV4cG9ydHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHIubSA9IGUsIHIuYyA9IHQsIHIuZCA9IGZ1bmN0aW9uKGUsIHQsIG4pIHtcbiAgICAgICAgICAgIHIubyhlLCB0KSB8fCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgICAgICAgICAgIGdldDogblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIHIuciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wudG9TdHJpbmdUYWcgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcIk1vZHVsZVwiXG4gICAgICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6ICEwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgci50ID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgaWYgKDEgJiB0ICYmIChlID0gcihlKSksIDggJiB0KSByZXR1cm4gZTtcbiAgICAgICAgICAgIGlmICg0ICYgdCAmJiBcIm9iamVjdFwiID09IHR5cGVvZiBlICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIGlmIChyLnIobiksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCBcImRlZmF1bHRcIiwge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBlXG4gICAgICAgICAgICB9KSwgMiAmIHQgJiYgXCJzdHJpbmdcIiAhPSB0eXBlb2YgZSkgZm9yKHZhciBpIGluIGUpci5kKG4sIGksIChmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVbdF07XG4gICAgICAgICAgICB9KS5iaW5kKG51bGwsIGkpKTtcbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9LCByLm4gPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdCA9IGUgJiYgZS5fX2VzTW9kdWxlID8gZnVuY3Rpb24gdCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5kZWZhdWx0O1xuICAgICAgICAgICAgfSA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiByLmQodCwgXCJhXCIsIHQpLCB0O1xuICAgICAgICB9LCByLm8gPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHQpO1xuICAgICAgICB9LCByLnAgPSBcIlwiLCByKHIucyA9IDkwKTtcbiAgICB9KHtcbiAgICAgICAgMTc6IGZ1bmN0aW9uKGUsIHQsIHIpIHtcbiAgICAgICAgICAgIFwidXNlIHN0cmljdFwiO1xuICAgICAgICAgICAgdC5fX2VzTW9kdWxlID0gITAsIHQuZGVmYXVsdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciBuID0gcigxOCksIGkgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgXyRlID0gZnVuY3Rpb24gXyRlKCkge307XG4gICAgICAgICAgICAgICAgcmV0dXJuIF8kZS5nZXRGaXJzdE1hdGNoID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgXyRyID0gdC5tYXRjaChlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kciAmJiBfJHIubGVuZ3RoID4gMCAmJiBfJHJbMV0gfHwgXCJcIjtcbiAgICAgICAgICAgICAgICB9LCBfJGUuZ2V0U2Vjb25kTWF0Y2ggPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfJHIgPSB0Lm1hdGNoKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIF8kci5sZW5ndGggPiAxICYmIF8kclsyXSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIH0sIF8kZS5tYXRjaEFuZFJldHVybkNvbnN0ID0gZnVuY3Rpb24oZSwgdCwgcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZS50ZXN0KHQpKSByZXR1cm4gcjtcbiAgICAgICAgICAgICAgICB9LCBfJGUuZ2V0V2luZG93c1ZlcnNpb25OYW1lID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTlRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJOVFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlhQXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiWFBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJOVCA1LjBcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIyMDAwXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTlQgNS4xXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiWFBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJOVCA1LjJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIyMDAzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTlQgNi4wXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiVmlzdGFcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJOVCA2LjFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCI3XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTlQgNi4yXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiOFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk5UIDYuM1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIjguMVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk5UIDEwLjBcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIxMFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfJGUuZ2V0TWFjT1NWZXJzaW9uTmFtZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IGUuc3BsaXQoXCIuXCIpLnNwbGljZSgwLCAyKS5tYXAoZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGUsIDEwKSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF8kdC5wdXNoKDApLCAxMCA9PT0gXyR0WzBdKSBzd2l0Y2goXyR0WzFdKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJMZW9wYXJkXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiU25vdyBMZW9wYXJkXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiTGlvblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIk1vdW50YWluIExpb25cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJNYXZlcmlja3NcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiWW9zZW1pdGVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiRWwgQ2FwaXRhblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJTaWVycmFcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiSGlnaCBTaWVycmFcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiTW9qYXZlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIkNhdGFsaW5hXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIF8kZS5nZXRBbmRyb2lkVmVyc2lvbk5hbWUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSBlLnNwbGl0KFwiLlwiKS5zcGxpY2UoMCwgMikubWFwKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChlLCAxMCkgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfJHQucHVzaCgwKSwgISgxID09PSBfJHRbMF0gJiYgXyR0WzFdIDwgNSkpIHJldHVybiAxID09PSBfJHRbMF0gJiYgXyR0WzFdIDwgNiA/IFwiQ3VwY2FrZVwiIDogMSA9PT0gXyR0WzBdICYmIF8kdFsxXSA+PSA2ID8gXCJEb251dFwiIDogMiA9PT0gXyR0WzBdICYmIF8kdFsxXSA8IDIgPyBcIkVjbGFpclwiIDogMiA9PT0gXyR0WzBdICYmIDIgPT09IF8kdFsxXSA/IFwiRnJveW9cIiA6IDIgPT09IF8kdFswXSAmJiBfJHRbMV0gPiAyID8gXCJHaW5nZXJicmVhZFwiIDogMyA9PT0gXyR0WzBdID8gXCJIb25leWNvbWJcIiA6IDQgPT09IF8kdFswXSAmJiBfJHRbMV0gPCAxID8gXCJJY2UgQ3JlYW0gU2FuZHdpY2hcIiA6IDQgPT09IF8kdFswXSAmJiBfJHRbMV0gPCA0ID8gXCJKZWxseSBCZWFuXCIgOiA0ID09PSBfJHRbMF0gJiYgXyR0WzFdID49IDQgPyBcIktpdEthdFwiIDogNSA9PT0gXyR0WzBdID8gXCJMb2xsaXBvcFwiIDogNiA9PT0gXyR0WzBdID8gXCJNYXJzaG1hbGxvd1wiIDogNyA9PT0gXyR0WzBdID8gXCJOb3VnYXRcIiA6IDggPT09IF8kdFswXSA/IFwiT3Jlb1wiIDogOSA9PT0gXyR0WzBdID8gXCJQaWVcIiA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB9LCBfJGUuZ2V0VmVyc2lvblByZWNpc2lvbiA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3BsaXQoXCIuXCIpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9LCBfJGUuY29tcGFyZVZlcnNpb25zID0gZnVuY3Rpb24odCwgciwgbikge1xuICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IG4gJiYgKG4gPSAhMSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gXyRlLmdldFZlcnNpb25QcmVjaXNpb24odCksIHMgPSBfJGUuZ2V0VmVyc2lvblByZWNpc2lvbihyKSwgYSA9IE1hdGgubWF4KGksIHMpLCBvID0gMCwgdSA9IF8kZS5tYXAoW1xuICAgICAgICAgICAgICAgICAgICAgICAgdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJcbiAgICAgICAgICAgICAgICAgICAgXSwgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kciA9IGEgLSBfJGUuZ2V0VmVyc2lvblByZWNpc2lvbih0KSwgXyRuID0gdCArIG5ldyBBcnJheShfJHIgKyAxKS5qb2luKFwiLjBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRlLm1hcChfJG4uc3BsaXQoXCIuXCIpLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheSgyMCAtIGUubGVuZ3RoKS5qb2luKFwiMFwiKSArIGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBmb3IobiAmJiAobyA9IGEgLSBNYXRoLm1pbihpLCBzKSksIGEgLT0gMTsgYSA+PSBvOyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodVswXVthXSA+IHVbMV1bYV0pIHJldHVybiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVbMF1bYV0gPT09IHVbMV1bYV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PT0gbykgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1WzBdW2FdIDwgdVsxXVthXSkgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgXyRlLm1hcCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF8kciwgbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkucHJvdG90eXBlLm1hcCkgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChlLCB0KTtcbiAgICAgICAgICAgICAgICAgICAgZm9yKF8kciA9IDA7IF8kciA8IGUubGVuZ3RoOyBfJHIgKz0gMSluLnB1c2godChlW18kcl0pKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgICAgICAgICAgfSwgXyRlLmZpbmQgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfJHIsIG47XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5wcm90b3R5cGUuZmluZCkgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwoZSwgdCk7XG4gICAgICAgICAgICAgICAgICAgIGZvcihfJHIgPSAwLCBuID0gZS5sZW5ndGg7IF8kciA8IG47IF8kciArPSAxKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZVtfJHJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQoaSwgXyRyKSkgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBfJGUuYXNzaWduID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IodmFyIF8kdCwgXyRyLCBuID0gZSwgaSA9IGFyZ3VtZW50cy5sZW5ndGgsIHMgPSBuZXcgQXJyYXkoaSA+IDEgPyBpIC0gMSA6IDApLCBhID0gMTsgYSA8IGk7IGErKylzW2EgLSAxXSA9IGFyZ3VtZW50c1thXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5hc3NpZ24pIHJldHVybiBPYmplY3QuYXNzaWduLmFwcGx5KE9iamVjdCwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgICAgICAgICBdLmNvbmNhdChzKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvID0gZnVuY3Rpb24gbygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJGUgPSBzW18kdF07XG4gICAgICAgICAgICAgICAgICAgICAgICBcIm9iamVjdFwiID09IHR5cGVvZiBfJGUgJiYgbnVsbCAhPT0gXyRlICYmIE9iamVjdC5rZXlzKF8kZSkuZm9yRWFjaChmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgblt0XSA9IF8kZVt0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBmb3IoXyR0ID0gMCwgXyRyID0gcy5sZW5ndGg7IF8kdCA8IF8kcjsgXyR0ICs9IDEpbygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgICAgICB9LCBfJGUuZ2V0QnJvd3NlckFsaWFzID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5CUk9XU0VSX0FMSUFTRVNfTUFQW2VdO1xuICAgICAgICAgICAgICAgIH0sIF8kZS5nZXRCcm93c2VyVHlwZUJ5QWxpYXMgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuLkJST1dTRVJfTUFQW2VdIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgfSwgXyRlO1xuICAgICAgICAgICAgfSgpO1xuICAgICAgICAgICAgdC5kZWZhdWx0ID0gaSwgZS5leHBvcnRzID0gdC5kZWZhdWx0O1xuICAgICAgICB9LFxuICAgICAgICAxODogZnVuY3Rpb24oZSwgdCwgcikge1xuICAgICAgICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgICAgICAgICB0Ll9fZXNNb2R1bGUgPSAhMCwgdC5FTkdJTkVfTUFQID0gdC5PU19NQVAgPSB0LlBMQVRGT1JNU19NQVAgPSB0LkJST1dTRVJfTUFQID0gdC5CUk9XU0VSX0FMSUFTRVNfTUFQID0gdm9pZCAwO1xuICAgICAgICAgICAgdC5CUk9XU0VSX0FMSUFTRVNfTUFQID0ge1xuICAgICAgICAgICAgICAgIFwiQW1hem9uIFNpbGtcIjogXCJhbWF6b25fc2lsa1wiLFxuICAgICAgICAgICAgICAgIFwiQW5kcm9pZCBCcm93c2VyXCI6IFwiYW5kcm9pZFwiLFxuICAgICAgICAgICAgICAgIEJhZGE6IFwiYmFkYVwiLFxuICAgICAgICAgICAgICAgIEJsYWNrQmVycnk6IFwiYmxhY2tiZXJyeVwiLFxuICAgICAgICAgICAgICAgIENocm9tZTogXCJjaHJvbWVcIixcbiAgICAgICAgICAgICAgICBDaHJvbWl1bTogXCJjaHJvbWl1bVwiLFxuICAgICAgICAgICAgICAgIEVsZWN0cm9uOiBcImVsZWN0cm9uXCIsXG4gICAgICAgICAgICAgICAgRXBpcGhhbnk6IFwiZXBpcGhhbnlcIixcbiAgICAgICAgICAgICAgICBGaXJlZm94OiBcImZpcmVmb3hcIixcbiAgICAgICAgICAgICAgICBGb2N1czogXCJmb2N1c1wiLFxuICAgICAgICAgICAgICAgIEdlbmVyaWM6IFwiZ2VuZXJpY1wiLFxuICAgICAgICAgICAgICAgIFwiR29vZ2xlIFNlYXJjaFwiOiBcImdvb2dsZV9zZWFyY2hcIixcbiAgICAgICAgICAgICAgICBHb29nbGVib3Q6IFwiZ29vZ2xlYm90XCIsXG4gICAgICAgICAgICAgICAgXCJJbnRlcm5ldCBFeHBsb3JlclwiOiBcImllXCIsXG4gICAgICAgICAgICAgICAgXCJLLU1lbGVvblwiOiBcImtfbWVsZW9uXCIsXG4gICAgICAgICAgICAgICAgTWF4dGhvbjogXCJtYXh0aG9uXCIsXG4gICAgICAgICAgICAgICAgXCJNaWNyb3NvZnQgRWRnZVwiOiBcImVkZ2VcIixcbiAgICAgICAgICAgICAgICBcIk1aIEJyb3dzZXJcIjogXCJtelwiLFxuICAgICAgICAgICAgICAgIFwiTkFWRVIgV2hhbGUgQnJvd3NlclwiOiBcIm5hdmVyXCIsXG4gICAgICAgICAgICAgICAgT3BlcmE6IFwib3BlcmFcIixcbiAgICAgICAgICAgICAgICBcIk9wZXJhIENvYXN0XCI6IFwib3BlcmFfY29hc3RcIixcbiAgICAgICAgICAgICAgICBQaGFudG9tSlM6IFwicGhhbnRvbWpzXCIsXG4gICAgICAgICAgICAgICAgUHVmZmluOiBcInB1ZmZpblwiLFxuICAgICAgICAgICAgICAgIFF1cFppbGxhOiBcInF1cHppbGxhXCIsXG4gICAgICAgICAgICAgICAgUVE6IFwicXFcIixcbiAgICAgICAgICAgICAgICBRUUxpdGU6IFwicXFsaXRlXCIsXG4gICAgICAgICAgICAgICAgU2FmYXJpOiBcInNhZmFyaVwiLFxuICAgICAgICAgICAgICAgIFNhaWxmaXNoOiBcInNhaWxmaXNoXCIsXG4gICAgICAgICAgICAgICAgXCJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkXCI6IFwic2Ftc3VuZ19pbnRlcm5ldFwiLFxuICAgICAgICAgICAgICAgIFNlYU1vbmtleTogXCJzZWFtb25rZXlcIixcbiAgICAgICAgICAgICAgICBTbGVpcG5pcjogXCJzbGVpcG5pclwiLFxuICAgICAgICAgICAgICAgIFN3aW5nOiBcInN3aW5nXCIsXG4gICAgICAgICAgICAgICAgVGl6ZW46IFwidGl6ZW5cIixcbiAgICAgICAgICAgICAgICBcIlVDIEJyb3dzZXJcIjogXCJ1Y1wiLFxuICAgICAgICAgICAgICAgIFZpdmFsZGk6IFwidml2YWxkaVwiLFxuICAgICAgICAgICAgICAgIFwiV2ViT1MgQnJvd3NlclwiOiBcIndlYm9zXCIsXG4gICAgICAgICAgICAgICAgV2VDaGF0OiBcIndlY2hhdFwiLFxuICAgICAgICAgICAgICAgIFwiWWFuZGV4IEJyb3dzZXJcIjogXCJ5YW5kZXhcIixcbiAgICAgICAgICAgICAgICBSb2t1OiBcInJva3VcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQuQlJPV1NFUl9NQVAgPSB7XG4gICAgICAgICAgICAgICAgYW1hem9uX3NpbGs6IFwiQW1hem9uIFNpbGtcIixcbiAgICAgICAgICAgICAgICBhbmRyb2lkOiBcIkFuZHJvaWQgQnJvd3NlclwiLFxuICAgICAgICAgICAgICAgIGJhZGE6IFwiQmFkYVwiLFxuICAgICAgICAgICAgICAgIGJsYWNrYmVycnk6IFwiQmxhY2tCZXJyeVwiLFxuICAgICAgICAgICAgICAgIGNocm9tZTogXCJDaHJvbWVcIixcbiAgICAgICAgICAgICAgICBjaHJvbWl1bTogXCJDaHJvbWl1bVwiLFxuICAgICAgICAgICAgICAgIGVsZWN0cm9uOiBcIkVsZWN0cm9uXCIsXG4gICAgICAgICAgICAgICAgZXBpcGhhbnk6IFwiRXBpcGhhbnlcIixcbiAgICAgICAgICAgICAgICBmaXJlZm94OiBcIkZpcmVmb3hcIixcbiAgICAgICAgICAgICAgICBmb2N1czogXCJGb2N1c1wiLFxuICAgICAgICAgICAgICAgIGdlbmVyaWM6IFwiR2VuZXJpY1wiLFxuICAgICAgICAgICAgICAgIGdvb2dsZWJvdDogXCJHb29nbGVib3RcIixcbiAgICAgICAgICAgICAgICBnb29nbGVfc2VhcmNoOiBcIkdvb2dsZSBTZWFyY2hcIixcbiAgICAgICAgICAgICAgICBpZTogXCJJbnRlcm5ldCBFeHBsb3JlclwiLFxuICAgICAgICAgICAgICAgIGtfbWVsZW9uOiBcIkstTWVsZW9uXCIsXG4gICAgICAgICAgICAgICAgbWF4dGhvbjogXCJNYXh0aG9uXCIsXG4gICAgICAgICAgICAgICAgZWRnZTogXCJNaWNyb3NvZnQgRWRnZVwiLFxuICAgICAgICAgICAgICAgIG16OiBcIk1aIEJyb3dzZXJcIixcbiAgICAgICAgICAgICAgICBuYXZlcjogXCJOQVZFUiBXaGFsZSBCcm93c2VyXCIsXG4gICAgICAgICAgICAgICAgb3BlcmE6IFwiT3BlcmFcIixcbiAgICAgICAgICAgICAgICBvcGVyYV9jb2FzdDogXCJPcGVyYSBDb2FzdFwiLFxuICAgICAgICAgICAgICAgIHBoYW50b21qczogXCJQaGFudG9tSlNcIixcbiAgICAgICAgICAgICAgICBwdWZmaW46IFwiUHVmZmluXCIsXG4gICAgICAgICAgICAgICAgcXVwemlsbGE6IFwiUXVwWmlsbGFcIixcbiAgICAgICAgICAgICAgICBxcTogXCJRUSBCcm93c2VyXCIsXG4gICAgICAgICAgICAgICAgcXFsaXRlOiBcIlFRIEJyb3dzZXIgTGl0ZVwiLFxuICAgICAgICAgICAgICAgIHNhZmFyaTogXCJTYWZhcmlcIixcbiAgICAgICAgICAgICAgICBzYWlsZmlzaDogXCJTYWlsZmlzaFwiLFxuICAgICAgICAgICAgICAgIHNhbXN1bmdfaW50ZXJuZXQ6IFwiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZFwiLFxuICAgICAgICAgICAgICAgIHNlYW1vbmtleTogXCJTZWFNb25rZXlcIixcbiAgICAgICAgICAgICAgICBzbGVpcG5pcjogXCJTbGVpcG5pclwiLFxuICAgICAgICAgICAgICAgIHN3aW5nOiBcIlN3aW5nXCIsXG4gICAgICAgICAgICAgICAgdGl6ZW46IFwiVGl6ZW5cIixcbiAgICAgICAgICAgICAgICB1YzogXCJVQyBCcm93c2VyXCIsXG4gICAgICAgICAgICAgICAgdml2YWxkaTogXCJWaXZhbGRpXCIsXG4gICAgICAgICAgICAgICAgd2Vib3M6IFwiV2ViT1MgQnJvd3NlclwiLFxuICAgICAgICAgICAgICAgIHdlY2hhdDogXCJXZUNoYXRcIixcbiAgICAgICAgICAgICAgICB5YW5kZXg6IFwiWWFuZGV4IEJyb3dzZXJcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQuUExBVEZPUk1TX01BUCA9IHtcbiAgICAgICAgICAgICAgICB0YWJsZXQ6IFwidGFibGV0XCIsXG4gICAgICAgICAgICAgICAgbW9iaWxlOiBcIm1vYmlsZVwiLFxuICAgICAgICAgICAgICAgIGRlc2t0b3A6IFwiZGVza3RvcFwiLFxuICAgICAgICAgICAgICAgIHR2OiBcInR2XCJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0Lk9TX01BUCA9IHtcbiAgICAgICAgICAgICAgICBXaW5kb3dzUGhvbmU6IFwiV2luZG93cyBQaG9uZVwiLFxuICAgICAgICAgICAgICAgIFdpbmRvd3M6IFwiV2luZG93c1wiLFxuICAgICAgICAgICAgICAgIE1hY09TOiBcIm1hY09TXCIsXG4gICAgICAgICAgICAgICAgaU9TOiBcImlPU1wiLFxuICAgICAgICAgICAgICAgIEFuZHJvaWQ6IFwiQW5kcm9pZFwiLFxuICAgICAgICAgICAgICAgIFdlYk9TOiBcIldlYk9TXCIsXG4gICAgICAgICAgICAgICAgQmxhY2tCZXJyeTogXCJCbGFja0JlcnJ5XCIsXG4gICAgICAgICAgICAgICAgQmFkYTogXCJCYWRhXCIsXG4gICAgICAgICAgICAgICAgVGl6ZW46IFwiVGl6ZW5cIixcbiAgICAgICAgICAgICAgICBMaW51eDogXCJMaW51eFwiLFxuICAgICAgICAgICAgICAgIENocm9tZU9TOiBcIkNocm9tZSBPU1wiLFxuICAgICAgICAgICAgICAgIFBsYXlTdGF0aW9uNDogXCJQbGF5U3RhdGlvbiA0XCIsXG4gICAgICAgICAgICAgICAgUm9rdTogXCJSb2t1XCJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LkVOR0lORV9NQVAgPSB7XG4gICAgICAgICAgICAgICAgRWRnZUhUTUw6IFwiRWRnZUhUTUxcIixcbiAgICAgICAgICAgICAgICBCbGluazogXCJCbGlua1wiLFxuICAgICAgICAgICAgICAgIFRyaWRlbnQ6IFwiVHJpZGVudFwiLFxuICAgICAgICAgICAgICAgIFByZXN0bzogXCJQcmVzdG9cIixcbiAgICAgICAgICAgICAgICBHZWNrbzogXCJHZWNrb1wiLFxuICAgICAgICAgICAgICAgIFdlYktpdDogXCJXZWJLaXRcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgOTA6IGZ1bmN0aW9uKGUsIHQsIHIpIHtcbiAgICAgICAgICAgIFwidXNlIHN0cmljdFwiO1xuICAgICAgICAgICAgdmFyIGEgPSBmdW5jdGlvbiBhKGUsIHQpIHtcbiAgICAgICAgICAgICAgICBmb3IodmFyIF8kciA9IDA7IF8kciA8IHQubGVuZ3RoOyBfJHIrKyl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuID0gdFtfJHJdO1xuICAgICAgICAgICAgICAgICAgICBuLmVudW1lcmFibGUgPSBuLmVudW1lcmFibGUgfHwgITEsIG4uY29uZmlndXJhYmxlID0gITAsIFwidmFsdWVcIiBpbiBuICYmIChuLndyaXRhYmxlID0gITApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgbi5rZXksIG4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0Ll9fZXNNb2R1bGUgPSAhMCwgdC5kZWZhdWx0ID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIG4sIGkgPSAobiA9IHIoOTEpKSAmJiBuLl9fZXNNb2R1bGUgPyBuIDoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG5cbiAgICAgICAgICAgIH0sIHMgPSByKDE4KTtcbiAgICAgICAgICAgIHZhciBvID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIF8kZSA9IGZ1bmN0aW9uIF8kZSgpIHt9O1xuICAgICAgICAgICAgICAgIHZhciBfJHQsIF8kciwgbjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXyRlLmdldFBhcnNlciA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gdCAmJiAodCA9ICExKSwgXCJzdHJpbmdcIiAhPSB0eXBlb2YgZSkgdGhyb3cgbmV3IEVycm9yKFwiVXNlckFnZW50IHNob3VsZCBiZSBhIHN0cmluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpLmRlZmF1bHQoZSwgdCk7XG4gICAgICAgICAgICAgICAgfSwgXyRlLnBhcnNlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGkuZGVmYXVsdChlKS5nZXRSZXN1bHQoKTtcbiAgICAgICAgICAgICAgICB9LCBfJHQgPSBfJGUsIG4gPSBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJCUk9XU0VSX01BUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuQlJPV1NFUl9NQVA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJFTkdJTkVfTUFQXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5FTkdJTkVfTUFQO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiT1NfTUFQXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5PU19NQVA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJQTEFURk9STVNfTUFQXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5QTEFURk9STVNfTUFQO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSwgKF8kciA9IG51bGwpICYmIGEoXyR0LnByb3RvdHlwZSwgXyRyKSwgbiAmJiBhKF8kdCwgbiksIF8kZTtcbiAgICAgICAgICAgIH0oKTtcbiAgICAgICAgICAgIHQuZGVmYXVsdCA9IG8sIGUuZXhwb3J0cyA9IHQuZGVmYXVsdDtcbiAgICAgICAgfSxcbiAgICAgICAgOTE6IGZ1bmN0aW9uKGUsIHQsIHIpIHtcbiAgICAgICAgICAgIFwidXNlIHN0cmljdFwiO1xuICAgICAgICAgICAgdmFyIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0Ll9fZXNNb2R1bGUgPSAhMCwgdC5kZWZhdWx0ID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIG4gPSB1KHIoOTIpKSwgaSA9IHUocig5MykpLCBzID0gdShyKDk0KSksIGEgPSB1KHIoOTUpKSwgbyA9IHUocigxNykpO1xuICAgICAgICAgICAgdmFyIGQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgXyRlID0gZnVuY3Rpb24gXyRlKGUsIHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gdCAmJiAodCA9ICExKSwgbnVsbCA9PSBlIHx8IFwiXCIgPT09IGUpIHRocm93IG5ldyBFcnJvcihcIlVzZXJBZ2VudCBwYXJhbWV0ZXIgY2FuJ3QgYmUgZW1wdHlcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VhID0gZSwgdGhpcy5wYXJzZWRSZXN1bHQgPSB7fSwgITAgIT09IHQgJiYgdGhpcy5wYXJzZSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIF8kdCA9IF8kZS5wcm90b3R5cGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF8kdC5nZXRVQSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdWE7XG4gICAgICAgICAgICAgICAgfSwgXyR0LnRlc3QgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRlc3QodGhpcy5fdWEpO1xuICAgICAgICAgICAgICAgIH0sIF8kdC5wYXJzZUJyb3dzZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF8kZSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXIgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IG8uZGVmYXVsdC5maW5kKG4uZGVmYXVsdCwgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdC50ZXN0KSByZXR1cm4gdC50ZXN0KF8kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2luc3RhbmNlb2YodC50ZXN0LCBBcnJheSkpIHJldHVybiB0LnRlc3Quc29tZShmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kZS50ZXN0KHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWRcIik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyR0ICYmICh0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyID0gXyR0LmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLCB0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyO1xuICAgICAgICAgICAgICAgIH0sIF8kdC5nZXRCcm93c2VyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyID8gdGhpcy5wYXJzZWRSZXN1bHQuYnJvd3NlciA6IHRoaXMucGFyc2VCcm93c2VyKCk7XG4gICAgICAgICAgICAgICAgfSwgXyR0LmdldEJyb3dzZXJOYW1lID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/IFN0cmluZyh0aGlzLmdldEJyb3dzZXIoKS5uYW1lKS50b0xvd2VyQ2FzZSgpIHx8IFwiXCIgOiB0aGlzLmdldEJyb3dzZXIoKS5uYW1lIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgfSwgXyR0LmdldEJyb3dzZXJWZXJzaW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEJyb3dzZXIoKS52ZXJzaW9uO1xuICAgICAgICAgICAgICAgIH0sIF8kdC5nZXRPUyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQub3MgPyB0aGlzLnBhcnNlZFJlc3VsdC5vcyA6IHRoaXMucGFyc2VPUygpO1xuICAgICAgICAgICAgICAgIH0sIF8kdC5wYXJzZU9TID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfJGUgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZFJlc3VsdC5vcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0gby5kZWZhdWx0LmZpbmQoaS5kZWZhdWx0LCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09IHR5cGVvZiB0LnRlc3QpIHJldHVybiB0LnRlc3QoXyRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaW5zdGFuY2VvZih0LnRlc3QsIEFycmF5KSkgcmV0dXJuIHQudGVzdC5zb21lKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRlLnRlc3QodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJyb3dzZXIncyB0ZXN0IGZ1bmN0aW9uIGlzIG5vdCB2YWxpZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfJHQgJiYgKHRoaXMucGFyc2VkUmVzdWx0Lm9zID0gXyR0LmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLCB0aGlzLnBhcnNlZFJlc3VsdC5vcztcbiAgICAgICAgICAgICAgICB9LCBfJHQuZ2V0T1NOYW1lID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0gdGhpcy5nZXRPUygpLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gU3RyaW5nKF8kdCkudG9Mb3dlckNhc2UoKSB8fCBcIlwiIDogXyR0IHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgfSwgXyR0LmdldE9TVmVyc2lvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRPUygpLnZlcnNpb247XG4gICAgICAgICAgICAgICAgfSwgXyR0LmdldFBsYXRmb3JtID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybSA/IHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtIDogdGhpcy5wYXJzZVBsYXRmb3JtKCk7XG4gICAgICAgICAgICAgICAgfSwgXyR0LmdldFBsYXRmb3JtVHlwZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBlICYmIChlID0gITEpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0gdGhpcy5nZXRQbGF0Zm9ybSgpLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gU3RyaW5nKF8kdCkudG9Mb3dlckNhc2UoKSB8fCBcIlwiIDogXyR0IHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgfSwgXyR0LnBhcnNlUGxhdGZvcm0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF8kZSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtID0ge307XG4gICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSBvLmRlZmF1bHQuZmluZChzLmRlZmF1bHQsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIHQudGVzdCkgcmV0dXJuIHQudGVzdChfJGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pbnN0YW5jZW9mKHQudGVzdCwgQXJyYXkpKSByZXR1cm4gdC50ZXN0LnNvbWUoZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfJGUudGVzdCh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkXCIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kdCAmJiAodGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm0gPSBfJHQuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksIHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtO1xuICAgICAgICAgICAgICAgIH0sIF8kdC5nZXRFbmdpbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZSA/IHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZSA6IHRoaXMucGFyc2VFbmdpbmUoKTtcbiAgICAgICAgICAgICAgICB9LCBfJHQuZ2V0RW5naW5lTmFtZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyBTdHJpbmcodGhpcy5nZXRFbmdpbmUoKS5uYW1lKS50b0xvd2VyQ2FzZSgpIHx8IFwiXCIgOiB0aGlzLmdldEVuZ2luZSgpLm5hbWUgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICB9LCBfJHQucGFyc2VFbmdpbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF8kZSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0gby5kZWZhdWx0LmZpbmQoYS5kZWZhdWx0LCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09IHR5cGVvZiB0LnRlc3QpIHJldHVybiB0LnRlc3QoXyRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaW5zdGFuY2VvZih0LnRlc3QsIEFycmF5KSkgcmV0dXJuIHQudGVzdC5zb21lKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRlLnRlc3QodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJyb3dzZXIncyB0ZXN0IGZ1bmN0aW9uIGlzIG5vdCB2YWxpZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfJHQgJiYgKHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZSA9IF8kdC5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSwgdGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lO1xuICAgICAgICAgICAgICAgIH0sIF8kdC5wYXJzZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJyb3dzZXIoKSwgdGhpcy5wYXJzZU9TKCksIHRoaXMucGFyc2VQbGF0Zm9ybSgpLCB0aGlzLnBhcnNlRW5naW5lKCksIHRoaXM7XG4gICAgICAgICAgICAgICAgfSwgXyR0LmdldFJlc3VsdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5kZWZhdWx0LmFzc2lnbih7fSwgdGhpcy5wYXJzZWRSZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0sIF8kdC5zYXRpc2ZpZXMgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB0aGlzLCBfJHIgPSB7fSwgbiA9IDAsIGkgPSB7fSwgcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZVt0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic3RyaW5nXCIgPT0gdHlwZW9mIGEgPyAoaVt0XSA9IGEsIHMgKz0gMSkgOiBcIm9iamVjdFwiID09IHR5cGVvZiBhICYmIChfJHJbdF0gPSBhLCBuICs9IDEpO1xuICAgICAgICAgICAgICAgICAgICB9KSwgbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gT2JqZWN0LmtleXMoXyRyKSwgdSA9IG8uZGVmYXVsdC5maW5kKGEsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyR0LmlzT1MoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB0aGlzLnNhdGlzZmllcyhfJHJbdV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGQpIHJldHVybiBkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBvLmRlZmF1bHQuZmluZChhLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kdC5pc1BsYXRmb3JtKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gdGhpcy5zYXRpc2ZpZXMoXyRyW2NdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBmKSByZXR1cm4gZjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gT2JqZWN0LmtleXMoaSksIGggPSBvLmRlZmF1bHQuZmluZChsLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kdC5pc0Jyb3dzZXIoZSwgITApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBoKSByZXR1cm4gdGhpcy5jb21wYXJlVmVyc2lvbihpW2hdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIF8kdC5pc0Jyb3dzZXIgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gdCAmJiAodCA9ICExKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF8kciA9IHRoaXMuZ2V0QnJvd3Nlck5hbWUoKS50b0xvd2VyQ2FzZSgpLCBuID0gZS50b0xvd2VyQ2FzZSgpLCBpID0gby5kZWZhdWx0LmdldEJyb3dzZXJUeXBlQnlBbGlhcyhuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgaSAmJiAobiA9IGkudG9Mb3dlckNhc2UoKSksIG4gPT09IF8kcjtcbiAgICAgICAgICAgICAgICB9LCBfJHQuY29tcGFyZVZlcnNpb24gPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgIF0sIF8kciA9IGUsIG4gPSAhMSwgaSA9IHRoaXMuZ2V0QnJvd3NlclZlcnNpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIGkpIHJldHVybiBcIj5cIiA9PT0gZVswXSB8fCBcIjxcIiA9PT0gZVswXSA/IChfJHIgPSBlLnN1YnN0cigxKSwgXCI9XCIgPT09IGVbMV0gPyAobiA9ICEwLCBfJHIgPSBlLnN1YnN0cigyKSkgOiBfJHQgPSBbXSwgXCI+XCIgPT09IGVbMF0gPyBfJHQucHVzaCgxKSA6IF8kdC5wdXNoKC0xKSkgOiBcIj1cIiA9PT0gZVswXSA/IF8kciA9IGUuc3Vic3RyKDEpIDogXCJ+XCIgPT09IGVbMF0gJiYgKG4gPSAhMCwgXyRyID0gZS5zdWJzdHIoMSkpLCBfJHQuaW5kZXhPZihvLmRlZmF1bHQuY29tcGFyZVZlcnNpb25zKGksIF8kciwgbikpID4gLTE7XG4gICAgICAgICAgICAgICAgfSwgXyR0LmlzT1MgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE9TTmFtZSghMCkgPT09IFN0cmluZyhlKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIH0sIF8kdC5pc1BsYXRmb3JtID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQbGF0Zm9ybVR5cGUoITApID09PSBTdHJpbmcoZSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9LCBfJHQuaXNFbmdpbmUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEVuZ2luZU5hbWUoITApID09PSBTdHJpbmcoZSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9LCBfJHQuaXMgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IHQgJiYgKHQgPSAhMSksIHRoaXMuaXNCcm93c2VyKGUsIHQpIHx8IHRoaXMuaXNPUyhlKSB8fCB0aGlzLmlzUGxhdGZvcm0oZSk7XG4gICAgICAgICAgICAgICAgfSwgXyR0LnNvbWUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBlICYmIChlID0gW10pLCBlLnNvbWUoZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kdC5pcyhlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgXyRlO1xuICAgICAgICAgICAgfSgpO1xuICAgICAgICAgICAgdC5kZWZhdWx0ID0gZCwgZS5leHBvcnRzID0gdC5kZWZhdWx0O1xuICAgICAgICB9LFxuICAgICAgICA5MjogZnVuY3Rpb24oZSwgdCwgcikge1xuICAgICAgICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgICAgICAgICB0Ll9fZXNNb2R1bGUgPSAhMCwgdC5kZWZhdWx0ID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIG4sIGkgPSAobiA9IHIoMTcpKSAmJiBuLl9fZXNNb2R1bGUgPyBuIDoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG5cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgcyA9IC92ZXJzaW9uXFwvKFxcZCsoXFwuP18/XFxkKykrKS9pLCBhID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL2dvb2dsZWJvdC9pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiR29vZ2xlYm90XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9nb29nbGVib3RcXC8oXFxkKyhcXC5cXGQrKSkvaSwgZSkgfHwgaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2gocywgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvb3BlcmEvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk9wZXJhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKHMsIGUpIHx8IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpvcGVyYSlbXFxzL10oXFxkKyhcXC4/Xz9cXGQrKSspL2ksIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kciAmJiAoXyR0LnZlcnNpb24gPSBfJHIpLCBfJHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL29wclxcL3xvcGlvcy9pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiT3BlcmFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/Om9wcnxvcGlvcylbXFxzL10oXFxTKykvaSwgZSkgfHwgaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2gocywgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvU2Ftc3VuZ0Jyb3dzZXIvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNhbXN1bmcgSW50ZXJuZXQgZm9yIEFuZHJvaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2gocywgZSkgfHwgaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/OlNhbXN1bmdCcm93c2VyKVtcXHMvXShcXGQrKFxcLj9fP1xcZCspKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvV2hhbGUvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk5BVkVSIFdoYWxlIEJyb3dzZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2gocywgZSkgfHwgaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/OndoYWxlKVtcXHMvXShcXGQrKD86XFwuXFxkKykrKS9pLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfJHIgJiYgKF8kdC52ZXJzaW9uID0gXyRyKSwgXyR0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9NWkJyb3dzZXIvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk1aIEJyb3dzZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/Ok1aQnJvd3NlcilbXFxzL10oXFxkKyg/OlxcLlxcZCspKykvaSwgZSkgfHwgaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2gocywgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvZm9jdXMvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkZvY3VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpmb2N1cylbXFxzL10oXFxkKyg/OlxcLlxcZCspKykvaSwgZSkgfHwgaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2gocywgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvc3dpbmcvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN3aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpzd2luZylbXFxzL10oXFxkKyg/OlxcLlxcZCspKykvaSwgZSkgfHwgaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2gocywgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvY29hc3QvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk9wZXJhIENvYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKHMsIGUpIHx8IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpjb2FzdClbXFxzL10oXFxkKyhcXC4/Xz9cXGQrKSspL2ksIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kciAmJiAoXyR0LnZlcnNpb24gPSBfJHIpLCBfJHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL29wdFxcL1xcZCsoPzouP18/XFxkKykrL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJPcGVyYSBUb3VjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBfJHIgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86b3B0KVtcXHMvXShcXGQrKFxcLj9fP1xcZCspKykvaSwgZSkgfHwgaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2gocywgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAveWFicm93c2VyL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJZYW5kZXggQnJvd3NlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBfJHIgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86eWFicm93c2VyKVtcXHMvXShcXGQrKFxcLj9fP1xcZCspKykvaSwgZSkgfHwgaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2gocywgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvdWNicm93c2VyL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJVQyBCcm93c2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKHMsIGUpIHx8IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzp1Y2Jyb3dzZXIpW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfJHIgJiYgKF8kdC52ZXJzaW9uID0gXyRyKSwgXyR0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9NYXh0aG9ufG14aW9zL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJNYXh0aG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKHMsIGUpIHx8IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpNYXh0aG9ufG14aW9zKVtcXHMvXShcXGQrKFxcLj9fP1xcZCspKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvZXBpcGhhbnkvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVwaXBoYW55XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKHMsIGUpIHx8IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzplcGlwaGFueSlbXFxzL10oXFxkKyhcXC4/Xz9cXGQrKSspL2ksIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kciAmJiAoXyR0LnZlcnNpb24gPSBfJHIpLCBfJHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL3B1ZmZpbi9pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiUHVmZmluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKHMsIGUpIHx8IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpwdWZmaW4pW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfJHIgJiYgKF8kdC52ZXJzaW9uID0gXyRyKSwgXyR0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9zbGVpcG5pci9pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2xlaXBuaXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2gocywgZSkgfHwgaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/OnNsZWlwbmlyKVtcXHMvXShcXGQrKFxcLj9fP1xcZCspKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvay1tZWxlb24vaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkstTWVsZW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKHMsIGUpIHx8IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzprLW1lbGVvbilbXFxzL10oXFxkKyhcXC4/Xz9cXGQrKSspL2ksIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kciAmJiAoXyR0LnZlcnNpb24gPSBfJHIpLCBfJHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL21pY3JvbWVzc2VuZ2VyL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJXZUNoYXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/Om1pY3JvbWVzc2VuZ2VyKVtcXHMvXShcXGQrKFxcLj9fP1xcZCspKykvaSwgZSkgfHwgaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2gocywgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvcXFicm93c2VyL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogL3FxYnJvd3NlcmxpdGUvaS50ZXN0KGUpID8gXCJRUSBCcm93c2VyIExpdGVcIiA6IFwiUVEgQnJvd3NlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBfJHIgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86cXFicm93c2VybGl0ZXxxcWJyb3dzZXIpWy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLCBlKSB8fCBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChzLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfJHIgJiYgKF8kdC52ZXJzaW9uID0gXyRyKSwgXyR0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9tc2llfHRyaWRlbnQvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkludGVybmV0IEV4cGxvcmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzptc2llIHxydjopKFxcZCsoXFwuP18/XFxkKykrKS9pLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfJHIgJiYgKF8kdC52ZXJzaW9uID0gXyRyKSwgXyR0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9cXHNlZGdcXC8vaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk1pY3Jvc29mdCBFZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9cXHNlZGdcXC8oXFxkKyhcXC4/Xz9cXGQrKSspL2ksIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kciAmJiAoXyR0LnZlcnNpb24gPSBfJHIpLCBfJHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL2VkZyhbZWFdfGlvcykvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk1pY3Jvc29mdCBFZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRTZWNvbmRNYXRjaCgvZWRnKFtlYV18aW9zKVxcLyhcXGQrKFxcLj9fP1xcZCspKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvdml2YWxkaS9pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVml2YWxkaVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBfJHIgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvdml2YWxkaVxcLyhcXGQrKFxcLj9fP1xcZCspKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvc2VhbW9ua2V5L2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZWFNb25rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL3NlYW1vbmtleVxcLyhcXGQrKFxcLj9fP1xcZCspKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvc2FpbGZpc2gvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNhaWxmaXNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9zYWlsZmlzaFxccz9icm93c2VyXFwvKFxcZCsoXFwuXFxkKyk/KS9pLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfJHIgJiYgKF8kdC52ZXJzaW9uID0gXyRyKSwgXyR0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9zaWxrL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJBbWF6b24gU2lsa1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBfJHIgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvc2lsa1xcLyhcXGQrKFxcLj9fP1xcZCspKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvcGhhbnRvbS9pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiUGhhbnRvbUpTXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9waGFudG9tanNcXC8oXFxkKyhcXC4/Xz9cXGQrKSspL2ksIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kciAmJiAoXyR0LnZlcnNpb24gPSBfJHIpLCBfJHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL3NsaW1lcmpzL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTbGltZXJKU1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBfJHIgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvc2xpbWVyanNcXC8oXFxkKyhcXC4/Xz9cXGQrKSspL2ksIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kciAmJiAoXyR0LnZlcnNpb24gPSBfJHIpLCBfJHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL2JsYWNrYmVycnl8XFxiYmJcXGQrL2ksXG4gICAgICAgICAgICAgICAgICAgICAgICAvcmltXFxzdGFibGV0L2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCbGFja0JlcnJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKHMsIGUpIHx8IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9ibGFja2JlcnJ5W1xcZF0rXFwvKFxcZCsoXFwuP18/XFxkKykrKS9pLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfJHIgJiYgKF8kdC52ZXJzaW9uID0gXyRyKSwgXyR0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8od2VifGhwdylbbzBdcy9pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiV2ViT1MgQnJvd3NlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBfJHIgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChzLCBlKSB8fCBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvdyg/OmViKT9bbzBdc2Jyb3dzZXJcXC8oXFxkKyhcXC4/Xz9cXGQrKSspL2ksIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kciAmJiAoXyR0LnZlcnNpb24gPSBfJHIpLCBfJHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL2JhZGEvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJhZGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL2RvbGZpblxcLyhcXGQrKFxcLj9fP1xcZCspKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvdGl6ZW4vaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRpemVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzp0aXplblxccz8pP2Jyb3dzZXJcXC8oXFxkKyhcXC4/Xz9cXGQrKSspL2ksIGUpIHx8IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKHMsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kciAmJiAoXyR0LnZlcnNpb24gPSBfJHIpLCBfJHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL3F1cHppbGxhL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJRdXBaaWxsYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBfJHIgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86cXVwemlsbGEpW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLCBlKSB8fCBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChzLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfJHIgJiYgKF8kdC52ZXJzaW9uID0gXyRyKSwgXyR0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9maXJlZm94fGljZXdlYXNlbHxmeGlvcy9pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRmlyZWZveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBfJHIgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86ZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MpW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfJHIgJiYgKF8kdC52ZXJzaW9uID0gXyRyKSwgXyR0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9lbGVjdHJvbi9pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRWxlY3Ryb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/OmVsZWN0cm9uKVxcLyhcXGQrKFxcLj9fP1xcZCspKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvTWl1aUJyb3dzZXIvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk1pdWlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/Ok1pdWlCcm93c2VyKVtcXHMvXShcXGQrKFxcLj9fP1xcZCspKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvY2hyb21pdW0vaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNocm9taXVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpjaHJvbWl1bSlbXFxzL10oXFxkKyhcXC4/Xz9cXGQrKSspL2ksIGUpIHx8IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKHMsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kciAmJiAoXyR0LnZlcnNpb24gPSBfJHIpLCBfJHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL2Nocm9tZXxjcmlvc3xjcm1vL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDaHJvbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/OmNocm9tZXxjcmlvc3xjcm1vKVxcLyhcXGQrKFxcLj9fP1xcZCspKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvR1NBL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJHb29nbGUgU2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpHU0EpXFwvKFxcZCsoXFwuP18/XFxkKykrKS9pLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfJHIgJiYgKF8kdC52ZXJzaW9uID0gXyRyKSwgXyR0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9ICFlLnRlc3QoL2xpa2UgYW5kcm9pZC9pKSwgXyRyID0gZS50ZXN0KC9hbmRyb2lkL2kpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kdCAmJiBfJHI7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQW5kcm9pZCBCcm93c2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8kciA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKHMsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kciAmJiAoXyR0LnZlcnNpb24gPSBfJHIpLCBfJHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL3BsYXlzdGF0aW9uIDQvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlBsYXlTdGF0aW9uIDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2gocywgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvc2FmYXJpfGFwcGxld2Via2l0L2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTYWZhcmlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2gocywgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvLiovaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IC0xICE9PSBlLnNlYXJjaChcIlxcXFwoXCIpID8gL14oLiopXFwvKC4qKVsgXFx0XVxcKCguKikvIDogL14oLiopXFwvKC4qKSAvO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChfJHQsIGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IGkuZGVmYXVsdC5nZXRTZWNvbmRNYXRjaChfJHQsIGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHQuZGVmYXVsdCA9IGEsIGUuZXhwb3J0cyA9IHQuZGVmYXVsdDtcbiAgICAgICAgfSxcbiAgICAgICAgOTM6IGZ1bmN0aW9uKGUsIHQsIHIpIHtcbiAgICAgICAgICAgIFwidXNlIHN0cmljdFwiO1xuICAgICAgICAgICAgdC5fX2VzTW9kdWxlID0gITAsIHQuZGVmYXVsdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciBuLCBpID0gKG4gPSByKDE3KSkgJiYgbi5fX2VzTW9kdWxlID8gbiA6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBuXG4gICAgICAgICAgICB9LCBzID0gcigxOCk7XG4gICAgICAgICAgICB2YXIgYSA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9Sb2t1XFwvRFZQL1xuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9Sb2t1XFwvRFZQLShcXGQrXFwuXFxkKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHMuT1NfTUFQLlJva3UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogXyR0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC93aW5kb3dzIHBob25lL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvd2luZG93cyBwaG9uZSAoPzpvcyk/XFxzPyhcXGQrKFxcLlxcZCspKikvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHMuT1NfTUFQLldpbmRvd3NQaG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBfJHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL3dpbmRvd3MgL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvV2luZG93cyAoKE5UfFhQKSggXFxkXFxkPy5cXGQpPykvaSwgZSksIF8kciA9IGkuZGVmYXVsdC5nZXRXaW5kb3dzVmVyc2lvbk5hbWUoXyR0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcy5PU19NQVAuV2luZG93cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBfJHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbk5hbWU6IF8kclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvTWFjaW50b3NoKC4qPykgRnhpT1MoLio/KVxcLy9cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcy5PU19NQVAuaU9TXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBfJHIgPSBpLmRlZmF1bHQuZ2V0U2Vjb25kTWF0Y2goLyhWZXJzaW9uXFwvKShcXGRbXFxkLl0rKS8sIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kciAmJiAoXyR0LnZlcnNpb24gPSBfJHIpLCBfJHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL21hY2ludG9zaC9pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL21hYyBvcyB4IChcXGQrKFxcLj9fP1xcZCspKykvaSwgZSkucmVwbGFjZSgvW19cXHNdL2csIFwiLlwiKSwgXyRyID0gaS5kZWZhdWx0LmdldE1hY09TVmVyc2lvbk5hbWUoXyR0KSwgbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzLk9TX01BUC5NYWNPUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBfJHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChuLnZlcnNpb25OYW1lID0gXyRyKSwgbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvKGlwb2R8aXBob25lfGlwYWQpL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvb3MgKFxcZCsoW19cXHNdXFxkKykqKSBsaWtlIG1hYyBvcyB4L2ksIGUpLnJlcGxhY2UoL1tfXFxzXS9nLCBcIi5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHMuT1NfTUFQLmlPUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBfJHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogZnVuY3Rpb24gdGVzdChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0gIWUudGVzdCgvbGlrZSBhbmRyb2lkL2kpLCBfJHIgPSBlLnRlc3QoL2FuZHJvaWQvaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyR0ICYmIF8kcjtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvYW5kcm9pZFtcXHMvLV0oXFxkKyhcXC5cXGQrKSopL2ksIGUpLCBfJHIgPSBpLmRlZmF1bHQuZ2V0QW5kcm9pZFZlcnNpb25OYW1lKF8kdCksIG4gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcy5PU19NQVAuQW5kcm9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBfJHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChuLnZlcnNpb25OYW1lID0gXyRyKSwgbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvKHdlYnxocHcpW28wXXMvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzp3ZWJ8aHB3KVtvMF1zXFwvKFxcZCsoXFwuXFxkKykqKS9pLCBlKSwgXyRyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHMuT1NfTUFQLldlYk9TXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kdCAmJiBfJHQubGVuZ3RoICYmIChfJHIudmVyc2lvbiA9IF8kdCksIF8kcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvYmxhY2tiZXJyeXxcXGJiYlxcZCsvaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC9yaW1cXHN0YWJsZXQvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9yaW1cXHN0YWJsZXRcXHNvc1xccyhcXGQrKFxcLlxcZCspKikvaSwgZSkgfHwgaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL2JsYWNrYmVycnlcXGQrXFwvKFxcZCsoW19cXHNdXFxkKykqKS9pLCBlKSB8fCBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvXFxiYmIoXFxkKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHMuT1NfTUFQLkJsYWNrQmVycnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogXyR0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9iYWRhL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvYmFkYVxcLyhcXGQrKFxcLlxcZCspKikvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHMuT1NfTUFQLkJhZGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogXyR0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC90aXplbi9pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL3RpemVuWy9cXHNdKFxcZCsoXFwuXFxkKykqKS9pLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcy5PU19NQVAuVGl6ZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogXyR0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9saW51eC9pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcy5PU19NQVAuTGludXhcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL0NyT1MvXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcy5PU19NQVAuQ2hyb21lT1NcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL1BsYXlTdGF0aW9uIDQvXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL1BsYXlTdGF0aW9uIDRbL1xcc10oXFxkKyhcXC5cXGQrKSopL2ksIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzLk9TX01BUC5QbGF5U3RhdGlvbjQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogXyR0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHQuZGVmYXVsdCA9IGEsIGUuZXhwb3J0cyA9IHQuZGVmYXVsdDtcbiAgICAgICAgfSxcbiAgICAgICAgOTQ6IGZ1bmN0aW9uKGUsIHQsIHIpIHtcbiAgICAgICAgICAgIFwidXNlIHN0cmljdFwiO1xuICAgICAgICAgICAgdC5fX2VzTW9kdWxlID0gITAsIHQuZGVmYXVsdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciBuLCBpID0gKG4gPSByKDE3KSkgJiYgbi5fX2VzTW9kdWxlID8gbiA6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBuXG4gICAgICAgICAgICB9LCBzID0gcigxOCk7XG4gICAgICAgICAgICB2YXIgYSA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9nb29nbGVib3QvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYm90XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yOiBcIkdvb2dsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9odWF3ZWkvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oY2FuLWwwMSkvaSwgZSkgJiYgXCJOb3ZhXCIsIF8kciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzLlBMQVRGT1JNU19NQVAubW9iaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcjogXCJIdWF3ZWlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfJHQgJiYgKF8kci5tb2RlbCA9IF8kdCksIF8kcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvbmV4dXNcXHMqKD86N3w4fDl8MTApLiovaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHMuUExBVEZPUk1TX01BUC50YWJsZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yOiBcIk5leHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL2lwYWQvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHMuUExBVEZPUk1TX01BUC50YWJsZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yOiBcIkFwcGxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWw6IFwiaVBhZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9NYWNpbnRvc2goLio/KSBGeGlPUyguKj8pXFwvL1xuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHMuUExBVEZPUk1TX01BUC50YWJsZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yOiBcIkFwcGxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWw6IFwiaVBhZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC9rZnR0IGJ1aWxkL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzLlBMQVRGT1JNU19NQVAudGFibGV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcjogXCJBbWF6b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbDogXCJLaW5kbGUgRmlyZSBIRCA3XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL3NpbGsvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHMuUExBVEZPUk1TX01BUC50YWJsZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yOiBcIkFtYXpvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC90YWJsZXQoPyEgcGMpL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzLlBMQVRGT1JNU19NQVAudGFibGV0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IGUudGVzdCgvaXBvZHxpcGhvbmUvaSksIF8kciA9IGUudGVzdCgvbGlrZSAoaXBvZHxpcGhvbmUpL2kpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kdCAmJiAhXyRyO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oaXBvZHxpcGhvbmUpL2ksIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzLlBMQVRGT1JNU19NQVAubW9iaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcjogXCJBcHBsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsOiBfJHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL25leHVzXFxzKlswLTZdLiovaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC9nYWxheHkgbmV4dXMvaVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHMuUExBVEZPUk1TX01BUC5tb2JpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yOiBcIk5leHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgL1teLV1tb2JpL2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzLlBMQVRGT1JNU19NQVAubW9iaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYmxhY2tiZXJyeVwiID09PSBlLmdldEJyb3dzZXJOYW1lKCEwKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzLlBMQVRGT1JNU19NQVAubW9iaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcjogXCJCbGFja0JlcnJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogZnVuY3Rpb24gdGVzdChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJiYWRhXCIgPT09IGUuZ2V0QnJvd3Nlck5hbWUoITApO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHMuUExBVEZPUk1TX01BUC5tb2JpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogZnVuY3Rpb24gdGVzdChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ3aW5kb3dzIHBob25lXCIgPT09IGUuZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzLlBMQVRGT1JNU19NQVAubW9iaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcjogXCJNaWNyb3NvZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSBOdW1iZXIoU3RyaW5nKGUuZ2V0T1NWZXJzaW9uKCkpLnNwbGl0KFwiLlwiKVswXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJhbmRyb2lkXCIgPT09IGUuZ2V0T1NOYW1lKCEwKSAmJiBfJHQgPj0gMztcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzLlBMQVRGT1JNU19NQVAudGFibGV0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYW5kcm9pZFwiID09PSBlLmdldE9TTmFtZSghMCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcy5QTEFURk9STVNfTUFQLm1vYmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm1hY29zXCIgPT09IGUuZ2V0T1NOYW1lKCEwKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzLlBMQVRGT1JNU19NQVAuZGVza3RvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3I6IFwiQXBwbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIndpbmRvd3NcIiA9PT0gZS5nZXRPU05hbWUoITApO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHMuUExBVEZPUk1TX01BUC5kZXNrdG9wXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibGludXhcIiA9PT0gZS5nZXRPU05hbWUoITApO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmliZTogZnVuY3Rpb24gZGVzY3JpYmUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHMuUExBVEZPUk1TX01BUC5kZXNrdG9wXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicGxheXN0YXRpb24gNFwiID09PSBlLmdldE9TTmFtZSghMCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcy5QTEFURk9STVNfTUFQLnR2XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicm9rdVwiID09PSBlLmdldE9TTmFtZSghMCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcy5QTEFURk9STVNfTUFQLnR2XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHQuZGVmYXVsdCA9IGEsIGUuZXhwb3J0cyA9IHQuZGVmYXVsdDtcbiAgICAgICAgfSxcbiAgICAgICAgOTU6IGZ1bmN0aW9uKGUsIHQsIHIpIHtcbiAgICAgICAgICAgIFwidXNlIHN0cmljdFwiO1xuICAgICAgICAgICAgdC5fX2VzTW9kdWxlID0gITAsIHQuZGVmYXVsdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciBuLCBpID0gKG4gPSByKDE3KSkgJiYgbi5fX2VzTW9kdWxlID8gbiA6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBuXG4gICAgICAgICAgICB9LCBzID0gcigxOCk7XG4gICAgICAgICAgICB2YXIgYSA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibWljcm9zb2Z0IGVkZ2VcIiA9PT0gZS5nZXRCcm93c2VyTmFtZSghMCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoL1xcc2VkZ1xcLy9pLnRlc3QoZSkpIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcy5FTkdJTkVfTUFQLkJsaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IGkuZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9lZGdlXFwvKFxcZCsoXFwuP18/XFxkKykrKS9pLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcy5FTkdJTkVfTUFQLkVkZ2VIVE1MLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IF8kdFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvdHJpZGVudC9pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHMuRU5HSU5FX01BUC5UcmlkZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBfJHIgPSBpLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvdHJpZGVudFxcLyhcXGQrKFxcLj9fP1xcZCspKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRlc3QoL3ByZXN0by9pKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcy5FTkdJTkVfTUFQLlByZXN0b1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL3ByZXN0b1xcLyhcXGQrKFxcLj9fP1xcZCspKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSBlLnRlc3QoL2dlY2tvL2kpLCBfJHIgPSBlLnRlc3QoL2xpa2UgZ2Vja28vaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyR0ICYmICFfJHI7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbiBkZXNjcmliZShlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyR0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHMuRU5HSU5FX01BUC5HZWNrb1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL2dlY2tvXFwvKFxcZCsoXFwuP18/XFxkKykrKS9pLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfJHIgJiYgKF8kdC52ZXJzaW9uID0gXyRyKSwgXyR0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8oYXBwbGUpP3dlYmtpdFxcLzUzN1xcLjM2L2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzLkVOR0lORV9NQVAuQmxpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgLyhhcHBsZSk/d2Via2l0L2lcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIGRlc2NyaWJlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcy5FTkdJTkVfTUFQLldlYktpdFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyRyID0gaS5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL3dlYmtpdFxcLyhcXGQrKFxcLj9fP1xcZCspKykvaSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyRyICYmIChfJHQudmVyc2lvbiA9IF8kciksIF8kdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB0LmRlZmF1bHQgPSBhLCBlLmV4cG9ydHMgPSB0LmRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuIiwgImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspe1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2NyZWF0ZUNsYXNzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7XG4iLCAiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX25leHQodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2FzeW5jVG9HZW5lcmF0b3IsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cztcbiIsICJmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcbiAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfSA6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgX3R5cGVvZihvYmopO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7XG4iLCAiZnVuY3Rpb24gX2luc3RhbmNlb2YobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAocmlnaHQgIT0gbnVsbCAmJiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIHJpZ2h0W1N5bWJvbC5oYXNJbnN0YW5jZV0pIHtcbiAgICAgICAgcmV0dXJuICEhcmlnaHRbU3ltYm9sLmhhc0luc3RhbmNlXShsZWZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbGVmdCBpbnN0YW5jZW9mIHJpZ2h0O1xuICAgIH1cbn1cbnZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4vdHlwZW9mLmpzXCIpW1wiZGVmYXVsdFwiXTtcbmZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7IC8qISByZWdlbmVyYXRvci1ydW50aW1lIC0tIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLiAtLSBsaWNlbnNlIChNSVQpOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL0xJQ0VOU0UgKi8gXG4gICAgdmFyIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgICAgICAgd3JpdGFibGU6ICEwXG4gICAgICAgIH0pLCBvYmpba2V5XTtcbiAgICB9O1xuICAgIHZhciB3cmFwID0gZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgICAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIF9pbnN0YW5jZW9mKG91dGVyRm4ucHJvdG90eXBlLCBHZW5lcmF0b3IpID8gb3V0ZXJGbiA6IEdlbmVyYXRvciwgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpLCBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuICAgICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZ2VuZXJhdG9yLCBcIl9pbnZva2VcIiwge1xuICAgICAgICAgICAgdmFsdWU6IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dClcbiAgICAgICAgfSksIGdlbmVyYXRvcjtcbiAgICB9O1xuICAgIHZhciB0cnlDYXRjaCA9IGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm5vcm1hbFwiLFxuICAgICAgICAgICAgICAgIGFyZzogZm4uY2FsbChvYmosIGFyZylcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRocm93XCIsXG4gICAgICAgICAgICAgICAgYXJnOiBlcnJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHZhciBHZW5lcmF0b3IgPSBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fTtcbiAgICB2YXIgR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9O1xuICAgIHZhciBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSA9IGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge307XG4gICAgdmFyIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyA9IGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICAgICAgW1xuICAgICAgICAgICAgXCJuZXh0XCIsXG4gICAgICAgICAgICBcInRocm93XCIsXG4gICAgICAgICAgICBcInJldHVyblwiXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgICAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB2YXIgQXN5bmNJdGVyYXRvciA9IGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yLCBQcm9taXNlSW1wbCkge1xuICAgICAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICAgICAgICBpZiAoXCJ0aHJvd1wiICE9PSByZWNvcmQudHlwZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnLCB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgJiYgXCJvYmplY3RcIiA9PSBfdHlwZW9mKHZhbHVlKSAmJiBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpID8gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICB9KSA6IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZCwgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9pbnZva2VcIiwge1xuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID0gcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgdmFyIG1ha2VJbnZva2VNZXRob2QgPSBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24obWV0aG9kLCBhcmcpIHtcbiAgICAgICAgICAgIGlmIChcImV4ZWN1dGluZ1wiID09PSBzdGF0ZSkgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgICAgICAgIGlmIChcImNvbXBsZXRlZFwiID09PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChcInRocm93XCIgPT09IG1ldGhvZCkgdGhyb3cgYXJnO1xuICAgICAgICAgICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IoY29udGV4dC5tZXRob2QgPSBtZXRob2QsIGNvbnRleHQuYXJnID0gYXJnOzspe1xuICAgICAgICAgICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgICAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFwibmV4dFwiID09PSBjb250ZXh0Lm1ldGhvZCkgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwic3VzcGVuZGVkU3RhcnRcIiA9PT0gc3RhdGUpIHRocm93IHN0YXRlID0gXCJjb21wbGV0ZWRcIiwgY29udGV4dC5hcmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBcInJldHVyblwiID09PSBjb250ZXh0Lm1ldGhvZCAmJiBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgICAgICAgICAgc3RhdGUgPSBcImV4ZWN1dGluZ1wiO1xuICAgICAgICAgICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoXCJub3JtYWxcIiA9PT0gcmVjb3JkLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID0gY29udGV4dC5kb25lID8gXCJjb21wbGV0ZWRcIiA6IFwic3VzcGVuZGVkWWllbGRcIiwgcmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcInRocm93XCIgPT09IHJlY29yZC50eXBlICYmIChzdGF0ZSA9IFwiY29tcGxldGVkXCIsIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gICAgdmFyIHB1c2hUcnlFbnRyeSA9IGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHtcbiAgICAgICAgICAgIHRyeUxvYzogbG9jc1swXVxuICAgICAgICB9O1xuICAgICAgICAxIGluIGxvY3MgJiYgKGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXSksIDIgaW4gbG9jcyAmJiAoZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl0sIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB9O1xuICAgIHZhciByZXNldFRyeUVudHJ5ID0gZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiLCBkZWxldGUgcmVjb3JkLmFyZywgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgICB9O1xuICAgIHZhciBDb250ZXh0ID0gZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgICAgICB0aGlzLnRyeUVudHJpZXMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHJ5TG9jOiBcInJvb3RcIlxuICAgICAgICAgICAgfVxuICAgICAgICBdLCB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyksIHRoaXMucmVzZXQoITApO1xuICAgIH07XG4gICAgdmFyIHZhbHVlcyA9IGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgICAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgICAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgICAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgaXRlcmFibGUubmV4dCkgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcig7ICsraSA8IGl0ZXJhYmxlLmxlbmd0aDspe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkgcmV0dXJuIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXSwgbmV4dC5kb25lID0gITEsIG5leHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQudmFsdWUgPSB1bmRlZmluZWQsIG5leHQuZG9uZSA9ICEwLCBuZXh0O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHQ6IGRvbmVSZXN1bHRcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBkb25lUmVzdWx0ID0gZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkb25lOiAhMFxuICAgICAgICB9O1xuICAgIH07XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHtcbiAgICAgICAgcmV0dXJuIGV4cG9ydHM7XG4gICAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzO1xuICAgIHZhciBleHBvcnRzID0ge30sIE9wID0gT2JqZWN0LnByb3RvdHlwZSwgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHksIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZ1bmN0aW9uKG9iaiwga2V5LCBkZXNjKSB7XG4gICAgICAgIG9ialtrZXldID0gZGVzYy52YWx1ZTtcbiAgICB9LCAkU3ltYm9sID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgPyBTeW1ib2wgOiB7fSwgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiLCBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCIsIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcbiAgICB0cnkge1xuICAgICAgICBkZWZpbmUoe30sIFwiXCIpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBkZWZpbmUgPSBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZXhwb3J0cy53cmFwID0gd3JhcDtcbiAgICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuICAgIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICAgIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9KTtcbiAgICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpICYmIChJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gICAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgICAgICBpZiAodW5kZWZpbmVkID09PSBtZXRob2QpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgXCJ0aHJvd1wiID09PSBjb250ZXh0Lm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSAmJiAoY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCwgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCksIFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpKSByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSByZXR1cm4gY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcbiAgICAgICAgcmV0dXJuIGluZm8gPyBpbmZvLmRvbmUgPyAoY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWUsIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2MsIFwicmV0dXJuXCIgIT09IGNvbnRleHQubWV0aG9kICYmIChjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBDb250aW51ZVNlbnRpbmVsKSA6IGluZm8gOiAoY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCk7XG4gICAgfVxuICAgIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lUHJvcGVydHkoR3AsIFwiY29uc3RydWN0b3JcIiwge1xuICAgICAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICB9KSwgZGVmaW5lUHJvcGVydHkoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIFwiY29uc3RydWN0b3JcIiwge1xuICAgICAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb24sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpLCBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICAgICAgdmFyIGN0b3IgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGdlbkZ1biAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgICAgIHJldHVybiAhIWN0b3IgJiYgKGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8IFwiR2VuZXJhdG9yRnVuY3Rpb25cIiA9PT0gKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSk7XG4gICAgfSwgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAoZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSksIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKSwgZ2VuRnVuO1xuICAgIH0sIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9fYXdhaXQ6IGFyZ1xuICAgICAgICB9O1xuICAgIH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSksIGRlZmluZShBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSwgYXN5bmNJdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0pLCBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yLCBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7XG4gICAgICAgIHZvaWQgMCA9PT0gUHJvbWlzZUltcGwgJiYgKFByb21pc2VJbXBsID0gUHJvbWlzZSk7XG4gICAgICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3Iod3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksIFByb21pc2VJbXBsKTtcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKSA/IGl0ZXIgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICAgIH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCksIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpLCBkZWZpbmUoR3AsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSksIGRlZmluZShHcCwgXCJ0b1N0cmluZ1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gICAgfSksIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YXIgb2JqZWN0ID0gT2JqZWN0KHZhbCksIGtleXMgPSBbXTtcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gb2JqZWN0KXtcbiAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXlzLnJldmVyc2UoKSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIGZvcig7IGtleXMubGVuZ3RoOyl7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHJldHVybiBuZXh0LnZhbHVlID0ga2V5LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXh0LmRvbmUgPSAhMCwgbmV4dDtcbiAgICAgICAgfTtcbiAgICB9LCBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcywgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuICAgICAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoc2tpcFRlbXBSZXNldCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSBcIm5leHRcIiwgdGhpcy5hcmcgPSB1bmRlZmluZWQsIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCAhc2tpcFRlbXBSZXNldCkgZm9yKHZhciBuYW1lIGluIHRoaXMpe1xuICAgICAgICAgICAgICAgIFwidFwiID09PSBuYW1lLmNoYXJBdCgwKSAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpICYmICh0aGlzW25hbWVdID0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgICAgICAgIHRoaXMuZG9uZSA9ICEwO1xuICAgICAgICAgICAgdmFyIHJvb3RSZWNvcmQgPSB0aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtcbiAgICAgICAgICAgIGlmIChcInRocm93XCIgPT09IHJvb3RSZWNvcmQudHlwZSkgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgICAgICB9LFxuICAgICAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24gZGlzcGF0Y2hFeGNlcHRpb24oZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiLCByZWNvcmQuYXJnID0gZXhjZXB0aW9uLCBjb250ZXh0Lm5leHQgPSBsb2MsIGNhdWdodCAmJiAoY29udGV4dC5tZXRob2QgPSBcIm5leHRcIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQpLCAhIWNhdWdodDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5kb25lKSB0aHJvdyBleGNlcHRpb247XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICAgICAgICBmb3IodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpe1xuICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXSwgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICAgICAgICBpZiAoXCJyb290XCIgPT09IGVudHJ5LnRyeUxvYykgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKSwgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzRmluYWxseSkgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodHlwZSwgYXJnKSB7XG4gICAgICAgICAgICBmb3IodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpe1xuICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5RW50cnkgJiYgKFwiYnJlYWtcIiA9PT0gdHlwZSB8fCBcImNvbnRpbnVlXCIgPT09IHR5cGUpICYmIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYyAmJiAoZmluYWxseUVudHJ5ID0gbnVsbCk7XG4gICAgICAgICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgICAgICAgIHJldHVybiByZWNvcmQudHlwZSA9IHR5cGUsIHJlY29yZC5hcmcgPSBhcmcsIGZpbmFsbHlFbnRyeSA/ICh0aGlzLm1ldGhvZCA9IFwibmV4dFwiLCB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYywgQ29udGludWVTZW50aW5lbCkgOiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZShyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICAgICAgICBpZiAoXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSkgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJldHVybiBcImJyZWFrXCIgPT09IHJlY29yZC50eXBlIHx8IFwiY29udGludWVcIiA9PT0gcmVjb3JkLnR5cGUgPyB0aGlzLm5leHQgPSByZWNvcmQuYXJnIDogXCJyZXR1cm5cIiA9PT0gcmVjb3JkLnR5cGUgPyAodGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnLCB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCIsIHRoaXMubmV4dCA9IFwiZW5kXCIpIDogXCJub3JtYWxcIiA9PT0gcmVjb3JkLnR5cGUgJiYgYWZ0ZXJMb2MgJiYgKHRoaXMubmV4dCA9IGFmdGVyTG9jKSwgQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfSxcbiAgICAgICAgZmluaXNoOiBmdW5jdGlvbiBmaW5pc2goZmluYWxseUxvYykge1xuICAgICAgICAgICAgZm9yKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKXtcbiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHJldHVybiB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKSwgcmVzZXRUcnlFbnRyeShlbnRyeSksIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24gX2NhdGNoKHRyeUxvYykge1xuICAgICAgICAgICAgZm9yKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKXtcbiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24gZGVsZWdhdGVZaWVsZChpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgICAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICAgICAgICB9LCBcIm5leHRcIiA9PT0gdGhpcy5tZXRob2QgJiYgKHRoaXMuYXJnID0gdW5kZWZpbmVkKSwgQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgIH0sIGV4cG9ydHM7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9yZWdlbmVyYXRvclJ1bnRpbWUsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cztcbiIsICIvLyBUT0RPKEJhYmVsIDgpOiBSZW1vdmUgdGhpcyBmaWxlLlxudmFyIHJ1bnRpbWUgPSByZXF1aXJlKFwiLi4vaGVscGVycy9yZWdlbmVyYXRvclJ1bnRpbWVcIikoKTtcbm1vZHVsZS5leHBvcnRzID0gcnVudGltZTtcbi8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9ibG9iL21haW4vcGFja2FnZXMvcnVudGltZS9ydW50aW1lLmpzI0w3MzY9XG50cnkge1xuICAgIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG59IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBnbG9iYWxUaGlzLnJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgRnVuY3Rpb24oXCJyXCIsIFwicmVnZW5lcmF0b3JSdW50aW1lID0gclwiKShydW50aW1lKTtcbiAgICB9XG59XG4iLCAiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgICAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgICAgIHJldHVybiBvO1xuICAgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cztcbiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cztcbiIsICJ2YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiKTtcbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gICAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gICAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG4gICAgc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfaW5oZXJpdHNMb29zZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuZnVuY3Rpb24gX2luc3RhbmNlb2YobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAocmlnaHQgIT0gbnVsbCAmJiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIHJpZ2h0W1N5bWJvbC5oYXNJbnN0YW5jZV0pIHtcbiAgICAgICAgcmV0dXJuICEhcmlnaHRbU3ltYm9sLmhhc0luc3RhbmNlXShsZWZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbGVmdCBpbnN0YW5jZW9mIHJpZ2h0O1xuICAgIH1cbn1cbnZhciBfdHlwZW9mID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgXCJAc3djL2hlbHBlcnMgLSB0eXBlb2ZcIjtcbiAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbn07XG4vKipcbiAqIEB0aGlzIHtQcm9taXNlfVxuICovIGZ1bmN0aW9uIGZpbmFsbHlDb25zdHJ1Y3RvcihjYWxsYmFjaykge1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5yZXNvbHZlKGNhbGxiYWNrKCkpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5yZXNvbHZlKGNhbGxiYWNrKCkpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gYWxsU2V0dGxlZChhcnIpIHtcbiAgICB2YXIgUCA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBpZiAoIShhcnIgJiYgdHlwZW9mIGFyci5sZW5ndGggIT09IFwidW5kZWZpbmVkXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBUeXBlRXJyb3IoKHR5cGVvZiBhcnIgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihhcnIpKSArIFwiIFwiICsgYXJyICsgXCIgaXMgbm90IGl0ZXJhYmxlKGNhbm5vdCByZWFkIHByb3BlcnR5IFN5bWJvbChTeW1ib2wuaXRlcmF0b3IpKVwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcnIpO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiByZXNvbHZlKFtdKTtcbiAgICAgICAgdmFyIHJlbWFpbmluZyA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICBmdW5jdGlvbiByZXMoaSwgdmFsKSB7XG4gICAgICAgICAgICBpZiAodmFsICYmICh0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhlbiA9IHZhbC50aGVuO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoZW4uY2FsbCh2YWwsIGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzKGksIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcInJlamVjdGVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tcmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcmdzW2ldID0ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogXCJmdWxmaWxsZWRcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKC0tcmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICByZXMoaSwgYXJnc1tpXSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIFN0b3JlIHNldFRpbWVvdXQgcmVmZXJlbmNlIHNvIHByb21pc2UtcG9seWZpbGwgd2lsbCBiZSB1bmFmZmVjdGVkIGJ5XG4vLyBvdGhlciBjb2RlIG1vZGlmeWluZyBzZXRUaW1lb3V0IChsaWtlIHNpbm9uLnVzZUZha2VUaW1lcnMoKSlcbnZhciBzZXRUaW1lb3V0RnVuYyA9IHNldFRpbWVvdXQ7XG5mdW5jdGlvbiBpc0FycmF5KHgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih4ICYmIHR5cGVvZiB4Lmxlbmd0aCAhPT0gXCJ1bmRlZmluZWRcIik7XG59XG5mdW5jdGlvbiBub29wKCkge31cbi8vIFBvbHlmaWxsIGZvciBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxuZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKi8gZnVuY3Rpb24gUHJvbWlzZShmbikge1xuICAgIGlmICghX2luc3RhbmNlb2YodGhpcywgUHJvbWlzZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9taXNlcyBtdXN0IGJlIGNvbnN0cnVjdGVkIHZpYSBuZXdcIik7XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwibm90IGEgZnVuY3Rpb25cIik7XG4gICAgLyoqIEB0eXBlIHshbnVtYmVyfSAqLyB0aGlzLl9zdGF0ZSA9IDA7XG4gICAgLyoqIEB0eXBlIHshYm9vbGVhbn0gKi8gdGhpcy5faGFuZGxlZCA9IGZhbHNlO1xuICAgIC8qKiBAdHlwZSB7UHJvbWlzZXx1bmRlZmluZWR9ICovIHRoaXMuX3ZhbHVlID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7IUFycmF5PCFGdW5jdGlvbj59ICovIHRoaXMuX2RlZmVycmVkcyA9IFtdO1xuICAgIGRvUmVzb2x2ZShmbiwgdGhpcyk7XG59XG5mdW5jdGlvbiBoYW5kbGUoc2VsZiwgZGVmZXJyZWQpIHtcbiAgICB3aGlsZShzZWxmLl9zdGF0ZSA9PT0gMyl7XG4gICAgICAgIHNlbGYgPSBzZWxmLl92YWx1ZTtcbiAgICB9XG4gICAgaWYgKHNlbGYuX3N0YXRlID09PSAwKSB7XG4gICAgICAgIHNlbGYuX2RlZmVycmVkcy5wdXNoKGRlZmVycmVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZWxmLl9oYW5kbGVkID0gdHJ1ZTtcbiAgICBQcm9taXNlLl9pbW1lZGlhdGVGbihmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNiID0gc2VsZi5fc3RhdGUgPT09IDEgPyBkZWZlcnJlZC5vbkZ1bGZpbGxlZCA6IGRlZmVycmVkLm9uUmVqZWN0ZWQ7XG4gICAgICAgIGlmIChjYiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgKHNlbGYuX3N0YXRlID09PSAxID8gcmVzb2x2ZSA6IHJlamVjdCkoZGVmZXJyZWQucHJvbWlzZSwgc2VsZi5fdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXQgPSBjYihzZWxmLl92YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChkZWZlcnJlZC5wcm9taXNlLCBlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRlZmVycmVkLnByb21pc2UsIHJldCk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiByZXNvbHZlKHNlbGYsIG5ld1ZhbHVlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gUHJvbWlzZSBSZXNvbHV0aW9uIFByb2NlZHVyZTogaHR0cHM6Ly9naXRodWIuY29tL3Byb21pc2VzLWFwbHVzL3Byb21pc2VzLXNwZWMjdGhlLXByb21pc2UtcmVzb2x1dGlvbi1wcm9jZWR1cmVcbiAgICAgICAgaWYgKG5ld1ZhbHVlID09PSBzZWxmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi5cIik7XG4gICAgICAgIGlmIChuZXdWYWx1ZSAmJiAodHlwZW9mIG5ld1ZhbHVlID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBuZXdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgICAgICAgdmFyIHRoZW4gPSBuZXdWYWx1ZS50aGVuO1xuICAgICAgICAgICAgaWYgKF9pbnN0YW5jZW9mKG5ld1ZhbHVlLCBQcm9taXNlKSkge1xuICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gMztcbiAgICAgICAgICAgICAgICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIGZpbmFsZShzZWxmKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBkb1Jlc29sdmUoYmluZCh0aGVuLCBuZXdWYWx1ZSksIHNlbGYpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZWxmLl9zdGF0ZSA9IDE7XG4gICAgICAgIHNlbGYuX3ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIGZpbmFsZShzZWxmKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChzZWxmLCBlKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZWplY3Qoc2VsZiwgbmV3VmFsdWUpIHtcbiAgICBzZWxmLl9zdGF0ZSA9IDI7XG4gICAgc2VsZi5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICBmaW5hbGUoc2VsZik7XG59XG5mdW5jdGlvbiBmaW5hbGUoc2VsZikge1xuICAgIGlmIChzZWxmLl9zdGF0ZSA9PT0gMiAmJiBzZWxmLl9kZWZlcnJlZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIFByb21pc2UuX2ltbWVkaWF0ZUZuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKCFzZWxmLl9oYW5kbGVkKSB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5fdW5oYW5kbGVkUmVqZWN0aW9uRm4oc2VsZi5fdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yKHZhciBpID0gMCwgbGVuID0gc2VsZi5fZGVmZXJyZWRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXtcbiAgICAgICAgaGFuZGxlKHNlbGYsIHNlbGYuX2RlZmVycmVkc1tpXSk7XG4gICAgfVxuICAgIHNlbGYuX2RlZmVycmVkcyA9IG51bGw7XG59XG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICovIGZ1bmN0aW9uIEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb21pc2UpIHtcbiAgICB0aGlzLm9uRnVsZmlsbGVkID0gdHlwZW9mIG9uRnVsZmlsbGVkID09PSBcImZ1bmN0aW9uXCIgPyBvbkZ1bGZpbGxlZCA6IG51bGw7XG4gICAgdGhpcy5vblJlamVjdGVkID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT09IFwiZnVuY3Rpb25cIiA/IG9uUmVqZWN0ZWQgOiBudWxsO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG59XG4vKipcbiAqIFRha2UgYSBwb3RlbnRpYWxseSBtaXNiZWhhdmluZyByZXNvbHZlciBmdW5jdGlvbiBhbmQgbWFrZSBzdXJlXG4gKiBvbkZ1bGZpbGxlZCBhbmQgb25SZWplY3RlZCBhcmUgb25seSBjYWxsZWQgb25jZS5cbiAqXG4gKiBNYWtlcyBubyBndWFyYW50ZWVzIGFib3V0IGFzeW5jaHJvbnkuXG4gKi8gZnVuY3Rpb24gZG9SZXNvbHZlKGZuLCBzZWxmKSB7XG4gICAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICBmbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgcmVzb2x2ZShzZWxmLCB2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgcmVqZWN0KHNlbGYsIHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICByZWplY3Qoc2VsZiwgZXgpO1xuICAgIH1cbn1cblByb21pc2UucHJvdG90eXBlW1wiY2F0Y2hcIl0gPSBmdW5jdGlvbihvblJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGVkKTtcbn07XG5Qcm9taXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdmFyIHByb20gPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcihub29wKTtcbiAgICBoYW5kbGUodGhpcywgbmV3IEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb20pKTtcbiAgICByZXR1cm4gcHJvbTtcbn07XG5Qcm9taXNlLnByb3RvdHlwZVtcImZpbmFsbHlcIl0gPSBmaW5hbGx5Q29uc3RydWN0b3I7XG5Qcm9taXNlLmFsbCA9IGZ1bmN0aW9uKGFycikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgaWYgKCFpc0FycmF5KGFycikpIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IFR5cGVFcnJvcihcIlByb21pc2UuYWxsIGFjY2VwdHMgYW4gYXJyYXlcIikpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJyKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzb2x2ZShbXSk7XG4gICAgICAgIHZhciByZW1haW5pbmcgPSBhcmdzLmxlbmd0aDtcbiAgICAgICAgZnVuY3Rpb24gcmVzKGksIHZhbCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsICYmICh0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRoZW4gPSB2YWwudGhlbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4uY2FsbCh2YWwsIGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyhpLCB2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhcmdzW2ldID0gdmFsO1xuICAgICAgICAgICAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICByZXMoaSwgYXJnc1tpXSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5Qcm9taXNlLmFsbFNldHRsZWQgPSBhbGxTZXR0bGVkO1xuUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlLmNvbnN0cnVjdG9yID09PSBQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSk7XG59O1xuUHJvbWlzZS5yZWplY3QgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgcmVqZWN0KHZhbHVlKTtcbiAgICB9KTtcbn07XG5Qcm9taXNlLnJhY2UgPSBmdW5jdGlvbihhcnIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGlmICghaXNBcnJheShhcnIpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJQcm9taXNlLnJhY2UgYWNjZXB0cyBhbiBhcnJheVwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gYXJyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXtcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShhcnJbaV0pLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcbi8vIFVzZSBwb2x5ZmlsbCBmb3Igc2V0SW1tZWRpYXRlIGZvciBwZXJmb3JtYW5jZSBnYWluc1xuUHJvbWlzZS5faW1tZWRpYXRlRm4gPSAvLyBAdHMtaWdub3JlXG50eXBlb2Ygc2V0SW1tZWRpYXRlID09PSBcImZ1bmN0aW9uXCIgJiYgZnVuY3Rpb24oZm4pIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgc2V0SW1tZWRpYXRlKGZuKTtcbn0gfHwgZnVuY3Rpb24oZm4pIHtcbiAgICBzZXRUaW1lb3V0RnVuYyhmbiwgMCk7XG59O1xuUHJvbWlzZS5fdW5oYW5kbGVkUmVqZWN0aW9uRm4gPSBmdW5jdGlvbiBfdW5oYW5kbGVkUmVqZWN0aW9uRm4oZXJyKSB7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiUG9zc2libGUgVW5oYW5kbGVkIFByb21pc2UgUmVqZWN0aW9uOlwiLCBlcnIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuIiwgImZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICAgIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZjtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzO1xuIiwgImZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiBfZXh0ZW5kcyh0YXJnZXQpIHtcbiAgICAgICAgZm9yKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yKHZhciBrZXkgaW4gc291cmNlKXtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cztcbiAgICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2V4dGVuZHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cztcbiIsICIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblwidXNlIHN0cmljdFwiO1xuZnVuY3Rpb24gX2luc3RhbmNlb2YobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAocmlnaHQgIT0gbnVsbCAmJiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIHJpZ2h0W1N5bWJvbC5oYXNJbnN0YW5jZV0pIHtcbiAgICAgICAgcmV0dXJuICEhcmlnaHRbU3ltYm9sLmhhc0luc3RhbmNlXShsZWZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbGVmdCBpbnN0YW5jZW9mIHJpZ2h0O1xuICAgIH1cbn1cbnZhciBfdHlwZW9mID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgXCJAc3djL2hlbHBlcnMgLSB0eXBlb2ZcIjtcbiAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbn07XG52YXIgUiA9IHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiID8gUmVmbGVjdCA6IG51bGw7XG52YXIgUmVmbGVjdEFwcGx5ID0gUiAmJiB0eXBlb2YgUi5hcHBseSA9PT0gXCJmdW5jdGlvblwiID8gUi5hcHBseSA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpO1xufTtcbnZhciBSZWZsZWN0T3duS2V5cztcbmlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIFJlZmxlY3RPd25LZXlzID0gUi5vd25LZXlzO1xufSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSk7XG4gICAgfTtcbn0gZWxzZSB7XG4gICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7XG4gICAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4od2FybmluZyk7XG59XG52YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufTtcbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5tb2R1bGUuZXhwb3J0cy5vbmNlID0gb25jZTtcbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbnZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5mdW5jdGlvbiBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIGxpc3RlbmVyID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YobGlzdGVuZXIpKSk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVycztcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KGFyZykge1xuICAgICAgICBpZiAodHlwZW9mIGFyZyAhPT0gXCJudW1iZXJcIiB8fCBhcmcgPCAwIHx8IE51bWJlcklzTmFOKGFyZykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArIFwiLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0TWF4TGlzdGVuZXJzID0gYXJnO1xuICAgIH1cbn0pO1xuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHwgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgfVxuICAgIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59O1xuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgICBpZiAodHlwZW9mIG4gIT09IFwibnVtYmVyXCIgfHwgbiA8IDAgfHwgTnVtYmVySXNOYU4obikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgbiArIFwiLlwiKTtcbiAgICB9XG4gICAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgICByZXR1cm4gdGhpcztcbn07XG5mdW5jdGlvbiBfZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gICAgcmV0dXJuIF9nZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICBmb3IodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKWFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIHZhciBkb0Vycm9yID0gdHlwZSA9PT0gXCJlcnJvclwiO1xuICAgIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKSBkb0Vycm9yID0gZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT09IHVuZGVmaW5lZDtcbiAgICBlbHNlIGlmICghZG9FcnJvcikgcmV0dXJuIGZhbHNlO1xuICAgIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgICBpZiAoZG9FcnJvcikge1xuICAgICAgICB2YXIgZXI7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIGVyID0gYXJnc1swXTtcbiAgICAgICAgaWYgKF9pbnN0YW5jZW9mKGVyLCBFcnJvcikpIHtcbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvd1xuICAgICAgICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi5cbiAgICAgICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgICAgICB9XG4gICAgICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIlVuaGFuZGxlZCBlcnJvci5cIiArIChlciA/IFwiIChcIiArIGVyLm1lc3NhZ2UgKyBcIilcIiA6IFwiXCIpKTtcbiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICAgICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH1cbiAgICB2YXIgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcbiAgICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICAgIHZhciBtO1xuICAgIHZhciBldmVudHM7XG4gICAgdmFyIGV4aXN0aW5nO1xuICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICAgICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0YXJnZXQuZW1pdChcIm5ld0xpc3RlbmVyXCIsIHR5cGUsIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG4gICAgICAgICAgICAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAgICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG4gICAgICAgICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICAgICAgfVxuICAgICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgICB9XG4gICAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgICAgICsrdGFyZ2V0Ll9ldmVudHNDb3VudDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBwcmVwZW5kID8gW1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nXG4gICAgICAgICAgICBdIDogW1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLFxuICAgICAgICAgICAgICAgIGxpc3RlbmVyXG4gICAgICAgICAgICBdO1xuICAgICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICAgICAgICBtID0gX2dldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgICAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICAgICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoXCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuIFwiICsgZXhpc3RpbmcubGVuZ3RoICsgXCIgXCIgKyBTdHJpbmcodHlwZSkgKyBcIiBsaXN0ZW5lcnMgXCIgKyBcImFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBcIiArIFwiaW5jcmVhc2UgbGltaXRcIik7XG4gICAgICAgICAgICB3Lm5hbWUgPSBcIk1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZ1wiO1xuICAgICAgICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgICAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICAgICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID0gZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG59O1xuZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7XG4gICAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pO1xuICAgICAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCwgYXJndW1lbnRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgICAgZmlyZWQ6IGZhbHNlLFxuICAgICAgICB3cmFwRm46IHVuZGVmaW5lZCxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGxpc3RlbmVyOiBsaXN0ZW5lclxuICAgIH07XG4gICAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTtcbiAgICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgc3RhdGUud3JhcEZuID0gd3JhcHBlZDtcbiAgICByZXR1cm4gd3JhcHBlZDtcbn1cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgIHJldHVybiB0aGlzO1xufTtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9IGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICB0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgICByZXR1cm4gdGhpcztcbn07XG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgdmFyIGxpc3QsIGV2ZW50cywgcG9zaXRpb24sIGksIG9yaWdpbmFsTGlzdGVuZXI7XG4gICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG4gICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICBpZiAobGlzdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcbiAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpIHRoaXMuZW1pdChcInJlbW92ZUxpc3RlbmVyXCIsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG4gICAgICAgIGZvcihpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG4gICAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMCkgbGlzdC5zaGlmdCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSBldmVudHNbdHlwZV0gPSBsaXN0WzBdO1xuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHRoaXMuZW1pdChcInJlbW92ZUxpc3RlbmVyXCIsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbn07XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKSB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgZWxzZSBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cyk7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpe1xuICAgICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFwicmVtb3ZlTGlzdGVuZXJcIikgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKFwicmVtb3ZlTGlzdGVuZXJcIik7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgICB9IGVsc2UgaWYgKGxpc3RlbmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExJRk8gb3JkZXJcbiAgICAgICAgZm9yKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pe1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xufTtcbmZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHtcbiAgICB2YXIgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG4gICAgaWYgKGV2bGlzdGVuZXIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdW53cmFwID8gW1xuICAgICAgICBldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJcbiAgICBdIDogW1xuICAgICAgICBldmxpc3RlbmVyXG4gICAgXTtcbiAgICByZXR1cm4gdW53cmFwID8gdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpIDogYXJyYXlDbG9uZShldmxpc3RlbmVyLCBldmxpc3RlbmVyLmxlbmd0aCk7XG59XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gICAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgdHJ1ZSk7XG59O1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTtcbn07XG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLCB0eXBlKTtcbiAgICB9XG59O1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDtcbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICAgIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICAgICAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBSZWZsZWN0T3duS2V5cyh0aGlzLl9ldmVudHMpIDogW107XG59O1xuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIG4pIHtcbiAgICB2YXIgY29weSA9IG5ldyBBcnJheShuKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbjsgKytpKWNvcHlbaV0gPSBhcnJbaV07XG4gICAgcmV0dXJuIGNvcHk7XG59XG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgICBmb3IoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgICBsaXN0LnBvcCgpO1xufVxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICAgIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSl7XG4gICAgICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBvbmNlKGVtaXR0ZXIsIG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBlcnJvckxpc3RlbmVyID0gZnVuY3Rpb24gZXJyb3JMaXN0ZW5lcihlcnIpIHtcbiAgICAgICAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgcmVzb2x2ZXIpO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH07XG4gICAgICAgIHZhciByZXNvbHZlciA9IGZ1bmN0aW9uIHJlc29sdmVyKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgZXJyb3JMaXN0ZW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgICAgIH07XG4gICAgICAgIDtcbiAgICAgICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7XG4gICAgICAgICAgICBvbmNlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobmFtZSAhPT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBlcnJvckxpc3RlbmVyLCB7XG4gICAgICAgICAgICAgICAgb25jZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7XG4gICAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIFwiZXJyb3JcIiwgaGFuZGxlciwgZmxhZ3MpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCBsaXN0ZW5lciwgZmxhZ3MpIHtcbiAgICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgICAgICAgZW1pdHRlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVtaXR0ZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgLy8gRXZlbnRUYXJnZXQgZG9lcyBub3QgaGF2ZSBgZXJyb3JgIGV2ZW50IHNlbWFudGljcyBsaWtlIE5vZGVcbiAgICAgICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS5cbiAgICAgICAgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmN0aW9uIHdyYXBMaXN0ZW5lcihhcmcpIHtcbiAgICAgICAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgYnVpbHRpbiBgeyBvbmNlOiB0cnVlIH1gIHN1cHBvcnQgc28gd2VcbiAgICAgICAgICAgIC8vIGhhdmUgdG8gZG8gaXQgbWFudWFsbHkuXG4gICAgICAgICAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgICAgICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlzdGVuZXIoYXJnKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiZW1pdHRlclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgZW1pdHRlciA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKGVtaXR0ZXIpKSk7XG4gICAgfVxufVxuIiwgIi8qISBGb3IgbGljZW5zZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIGluZGV4LmpzLkxJQ0VOU0UudHh0ICovIGZ1bmN0aW9uIF9pbnN0YW5jZW9mKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKHJpZ2h0ICE9IG51bGwgJiYgdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiByaWdodFtTeW1ib2wuaGFzSW5zdGFuY2VdKSB7XG4gICAgICAgIHJldHVybiAhIXJpZ2h0W1N5bWJvbC5oYXNJbnN0YW5jZV0obGVmdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGxlZnQgaW5zdGFuY2VvZiByaWdodDtcbiAgICB9XG59XG4hZnVuY3Rpb24oKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgdmFyIGEgPSBmdW5jdGlvbiBhKGUsIHQpIHtcbiAgICAgICAgZm9yKHZhciBpIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIGkpICYmIChlW2ldID0gdFtpXSk7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH07XG4gICAgdmFyIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgICAgcmV0dXJuIFwiXCIgPT09IGUuY29kZWNzIHx8IFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIE1lZGlhU291cmNlIHx8IE1lZGlhU291cmNlLmlzVHlwZVN1cHBvcnRlZCgndmlkZW8vbXA0O2NvZGVjcz1cIicgKyBlLmNvZGVjcyArICdcIicpO1xuICAgIH07XG4gICAgdmFyIGMgPSBmdW5jdGlvbiBjKGUpIHtcbiAgICAgICAgdmFyIHQsIGk7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IGUuaGlkZGVuID8gKHQgPSBcImhpZGRlblwiLCBpID0gXCJ2aXNpYmlsaXR5Y2hhbmdlXCIpIDogdm9pZCAwICE9PSBlLm1zSGlkZGVuID8gKHQgPSBcIm1zSGlkZGVuXCIsIGkgPSBcIm1zdmlzaWJpbGl0eWNoYW5nZVwiKSA6IHZvaWQgMCAhPT0gZS53ZWJraXRIaWRkZW4gJiYgKHQgPSBcIndlYmtpdEhpZGRlblwiLCBpID0gXCJ3ZWJraXR2aXNpYmlsaXR5Y2hhbmdlXCIpLCB7XG4gICAgICAgICAgICBoaWRkZW46IHQsXG4gICAgICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlOiBpXG4gICAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgZCA9IGZ1bmN0aW9uIGQoZSwgdCwgaSkge1xuICAgICAgICByZXR1cm4gTWF0aC5taW4oaSwgTWF0aC5tYXgodCwgZSkpO1xuICAgIH07XG4gICAgdmFyIGggPSBmdW5jdGlvbiBoKGUpIHtcbiAgICAgICAgZS5yZW1vdmVBdHRyaWJ1dGUoXCJzcmNcIik7XG4gICAgfTtcbiAgICB2YXIgZyA9IGZ1bmN0aW9uIGcoZSkge1xuICAgICAgICByZXR1cm4gXCJudW1iZXJcIiA9PSB0eXBlb2YgZS53ZWJraXREZWNvZGVkRnJhbWVDb3VudCA/IGUud2Via2l0RGVjb2RlZEZyYW1lQ291bnQgOiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkgPyBlLmdldFZpZGVvUGxheWJhY2tRdWFsaXR5KCkudG90YWxWaWRlb0ZyYW1lcyA6IFwibnVtYmVyXCIgPT0gdHlwZW9mIGUubW96RGVjb2RlZEZyYW1lcyA/IGUubW96RGVjb2RlZEZyYW1lcyA6IC0xO1xuICAgIH07XG4gICAgdmFyIHkgPSBmdW5jdGlvbiB5KGUpIHtcbiAgICAgICAgcmV0dXJuIFwibnVtYmVyXCIgPT0gdHlwZW9mIGUud2Via2l0RHJvcHBlZEZyYW1lQ291bnQgPyBlLndlYmtpdERyb3BwZWRGcmFtZUNvdW50IDogXCJmdW5jdGlvblwiID09IHR5cGVvZiBlLmdldFZpZGVvUGxheWJhY2tRdWFsaXR5ID8gZS5nZXRWaWRlb1BsYXliYWNrUXVhbGl0eSgpLmRyb3BwZWRWaWRlb0ZyYW1lcyA6IC0xO1xuICAgIH07XG4gICAgdmFyIEUgPSBmdW5jdGlvbiBFKGUsIHQpIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspY29uc29sZS5pbmZvKGUsIFwic3RhcnQ6IFwiLCB0LnN0YXJ0KGkpLCBcIiwgZW5kOiBcIiwgdC5lbmQoaSkpO1xuICAgIH07XG4gICAgdmFyIGsgPSBmdW5jdGlvbiBrKGUsIHQsIGkpIHtcbiAgICAgICAgZm9yKHZhciBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspe1xuICAgICAgICAgICAgdmFyIHIgPSBlLnN0YXJ0KG4pLCBvID0gZS5lbmQobik7XG4gICAgICAgICAgICBpZiAoIShvIDw9IHQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHIgLSBpID4gdCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgZm9yKHZhciBzID0gbiArIDE7IHMgPCBlLmxlbmd0aCAmJiAhKGUuc3RhcnQocykgLSBvID4gaSk7IHMrKylvID0gZS5lbmQocyk7XG4gICAgICAgICAgICAgICAgZm9yKHZhciBhID0gbiAtIDE7IGEgPj0gMCAmJiAhKHIgLSBlLmVuZChhKSA+IGkpOyBhLS0pciA9IGUuc3RhcnQoYSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IE1hdGgubWluKHIsIHQpLFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IG9cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGFydDogdCxcbiAgICAgICAgICAgIGVuZDogdFxuICAgICAgICB9O1xuICAgIH07XG4gICAgdmFyIFMgPSBmdW5jdGlvbiBTKGUsIHQsIGkpIHtcbiAgICAgICAgdm9pZCAwID09PSBpICYmIChpID0gbCk7XG4gICAgICAgIHZhciBuID0gayhlLCB0LCBpKS5lbmQgLSB0ID4gaTtcbiAgICAgICAgaWYgKGUubGVuZ3RoID4gMSB8fCAhbikgZm9yKHZhciByID0gMDsgciA8IGUubGVuZ3RoOyByKyspe1xuICAgICAgICAgICAgdmFyIG8gPSBlLnN0YXJ0KHIpLCBzID0gZS5lbmQocik7XG4gICAgICAgICAgICBpZiAodCA8IG8gJiYgcyAtIG8gPiBpKSByZXR1cm4gbyArIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG4gPyB0ICsgaSA6IHQ7XG4gICAgfTtcbiAgICB2YXIgYiA9IGZ1bmN0aW9uIGIoZSwgdCwgaSkge1xuICAgICAgICByZXR1cm4gZS5hZGRFdmVudExpc3RlbmVyKHQsIGkpLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LCBpKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBUID0gZnVuY3Rpb24gVChlKSB7XG4gICAgICAgIGlmIChlLnNyYykge1xuICAgICAgICAgICAgdmFyIHQgPSBlLnNyYztcbiAgICAgICAgICAgIGgoZSksIGUubG9hZCgpLCBVUkwucmV2b2tlT2JqZWN0VVJMKHQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2YXIgSSA9IGZ1bmN0aW9uIEkoKSB7XG4gICAgICAgIGlmIChfKSByZXR1cm4gXztcbiAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIHdpbmRvdyB8fCBcInVuZGVmaW5lZFwiID09IHR5cGVvZiBuYXZpZ2F0b3IpIHJldHVybiBfID0gdztcbiAgICAgICAgdmFyIGUsIHQsIG4gPSBpLmdldFBhcnNlcihuYXZpZ2F0b3IudXNlckFnZW50KSwgciA9IChlID0gU3RyaW5nKG4uZ2V0QnJvd3NlclZlcnNpb24oKSksIHQgPSBELmV4ZWMoZSkgfHwgUi5leGVjKGUpIHx8IEwuZXhlYyhlKSB8fCBbXSwge1xuICAgICAgICAgICAgbWFqb3I6IHBhcnNlSW50KHRbMV0sIDEwKSB8fCAwLFxuICAgICAgICAgICAgbWlub3I6IHBhcnNlSW50KHRbMl0sIDEwKSB8fCAwLFxuICAgICAgICAgICAgcGF0Y2g6IHBhcnNlSW50KHRbM10sIDEwKSB8fCAwXG4gICAgICAgIH0pLCBvID0gbi5nZXRFbmdpbmUoKTtcbiAgICAgICAgcmV0dXJuIF8gPSB7XG4gICAgICAgICAgICBjaHJvbWU6ICEhbi5zb21lKFtcbiAgICAgICAgICAgICAgICBcImNocm9tZVwiXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIGNocm9tZWNhc3Q6IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwiY3JrZXlcIikgPiAtMSxcbiAgICAgICAgICAgIGRvbWFpbjogd2luZG93LmxvY2F0aW9uLmhvc3Quc3BsaXQoXCIuXCIpLnNsaWNlKC0yKS5qb2luKFwiLlwiKSxcbiAgICAgICAgICAgIGVsZWN0cm9uOiAhIW4uc29tZShbXG4gICAgICAgICAgICAgICAgXCJlbGVjdHJvblwiXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIGZhbWlseTogbi5nZXRCcm93c2VyTmFtZSgpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICBmaXJlZm94OiAhIW4uc29tZShbXG4gICAgICAgICAgICAgICAgXCJmaXJlZm94XCJcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgaG9zdDogd2luZG93LmxvY2F0aW9uLmhvc3QsXG4gICAgICAgICAgICBtYWpvcjogci5tYWpvcixcbiAgICAgICAgICAgIG1pbm9yOiByLm1pbm9yLFxuICAgICAgICAgICAgbXNFZGdlTGVnYWN5OiAhIW4uc29tZShbXG4gICAgICAgICAgICAgICAgXCJtaWNyb3NvZnQgZWRnZVwiXG4gICAgICAgICAgICBdKSAmJiBcIkJsaW5rXCIgIT09IG8ubmFtZSxcbiAgICAgICAgICAgIG1zRWRnZUNocm9taXVtOiAhIW4uc29tZShbXG4gICAgICAgICAgICAgICAgXCJtaWNyb3NvZnQgZWRnZVwiXG4gICAgICAgICAgICBdKSAmJiBcIkJsaW5rXCIgPT09IG8ubmFtZSxcbiAgICAgICAgICAgIG1zSUU6ICEhbi5zb21lKFtcbiAgICAgICAgICAgICAgICBcImludGVybmV0IGV4cGxvcmVyXCJcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgbmFtZTogbmF2aWdhdG9yLmFwcFZlcnNpb24sXG4gICAgICAgICAgICBvcGVyYTogISFuLnNvbWUoW1xuICAgICAgICAgICAgICAgIFwib3BlcmFcIlxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBvc05hbWU6IG4uZ2V0T1NOYW1lKCksXG4gICAgICAgICAgICBvc1ZlcnNpb246IFN0cmluZyhuLmdldE9TVmVyc2lvbigpKSxcbiAgICAgICAgICAgIHBhdGNoOiByLnBhdGNoLFxuICAgICAgICAgICAgc2FmYXJpOiAhIW4uc29tZShbXG4gICAgICAgICAgICAgICAgXCJzYWZhcmlcIlxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxuICAgICAgICAgICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgICAgICAgICAgbW9iaWxlOiAhKCFuLnNvbWUoW1xuICAgICAgICAgICAgICAgIFwibW9iaWxlXCJcbiAgICAgICAgICAgIF0pICYmICFuLnNvbWUoW1xuICAgICAgICAgICAgICAgIFwidGFibGV0XCJcbiAgICAgICAgICAgIF0pKSxcbiAgICAgICAgICAgIHN1cHBvcnRzRGF0YUNoYW5uZWxzOiBcIlJUQ1BlZXJDb25uZWN0aW9uXCIgaW4gd2luZG93LFxuICAgICAgICAgICAgc3VwcG9ydHNXZWJUcmFuc3BvcnQ6IFwiV2ViVHJhbnNwb3J0XCIgaW4gd2luZG93LFxuICAgICAgICAgICAgc3VwcG9ydHNNU0VJbldvcmtlcnM6IEEuaXNTdXBwb3J0ZWRJbldvcmtlcigpXG4gICAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgViA9IGZ1bmN0aW9uIFYoZSkge1xuICAgICAgICB2YXIgdCA9IGUudHlwZSA9PT0gQy5BTkFMWVRJQ1NfRVZFTlQsIGkgPSBlLmFyZyAmJiBcInZpZGVvX2Vycm9yXCIgPT09IGUuYXJnLm5hbWU7XG4gICAgICAgIGlmICh0ICYmIGkpIHtcbiAgICAgICAgICAgIGlmICghTyAmJiAhTikge1xuICAgICAgICAgICAgICAgIHZhciBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4uZ2V0Q29udGV4dChcIndlYmdsXCIpIHx8IG4uZ2V0Q29udGV4dChcImV4cGVyaW1lbnRhbC13ZWJnbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIgJiYgXCJnZXRFeHRlbnNpb25cIiBpbiByKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHIuZ2V0RXh0ZW5zaW9uKFwiV0VCR0xfZGVidWdfcmVuZGVyZXJfaW5mb1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG8gJiYgXCJnZXRQYXJhbWV0ZXJcIiBpbiByICYmIChPID0gci5nZXRQYXJhbWV0ZXIoby5VTk1BU0tFRF9SRU5ERVJFUl9XRUJHTCksIE4gPSByLmdldFBhcmFtZXRlcihvLlVOTUFTS0VEX1ZFTkRPUl9XRUJHTCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTEpIHt9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlLmFyZy5wcm9wZXJ0aWVzLmdsX3JlbmRlcmVyID0gTywgZS5hcmcucHJvcGVydGllcy5nbF92ZW5kb3IgPSBOO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlO1xuICAgIH07XG4gICAgdmFyIEIgPSBmdW5jdGlvbiBCKCkge1xuICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgTWVkaWFTb3VyY2U7XG4gICAgfTtcbiAgICB2YXIgeCA9IGZ1bmN0aW9uIHgoKSB7XG4gICAgICAgIHZhciBlID0gSSgpO1xuICAgICAgICByZXR1cm4gXCJXaW5kb3dzXCIgPT09IGUub3NOYW1lICYmIChlLmNocm9tZSB8fCBlLmZpcmVmb3ggfHwgZS5tc0VkZ2VDaHJvbWl1bSkgJiYgQigpID8gXCJtZWRpYUNhcGFiaWxpdGllc1wiIGluIG5hdmlnYXRvciA/IG5hdmlnYXRvci5tZWRpYUNhcGFiaWxpdGllcy5kZWNvZGluZ0luZm8oe1xuICAgICAgICAgICAgdHlwZTogXCJtZWRpYS1zb3VyY2VcIixcbiAgICAgICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6ICd2aWRlby9tcDQ7Y29kZWNzPVwidnAwOS4wMC40MS4wOFwiJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogMTkyMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwODAsXG4gICAgICAgICAgICAgICAgYml0cmF0ZTogOGU2LFxuICAgICAgICAgICAgICAgIGZyYW1lcmF0ZTogNjBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbihmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICByZXR1cm4gZS5zdXBwb3J0ZWQgJiYgZS5zbW9vdGg7XG4gICAgICAgIH0pIDogUHJvbWlzZS5yZXNvbHZlKE1lZGlhU291cmNlLmlzVHlwZVN1cHBvcnRlZCgndmlkZW8vbXA0O2NvZGVjcz1cInZwMDkuMDAuMTAuMDhcIicpKSA6IFByb21pc2UucmVzb2x2ZSghMSk7XG4gICAgfTtcbiAgICB2YXIgcmUgPSBmdW5jdGlvbiByZShlLCB0KSB7XG4gICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTtcbiAgICAgICAgZm9yKHZhciBpID0gMCwgbiA9IG5ldyBBcnJheSh0KTsgaSA8IHQ7IGkrKyluW2ldID0gZVtpXTtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfTtcbiAgICB2YXIgb2UgPSBmdW5jdGlvbiBvZShlKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuV2ViS2l0TWVkaWFLZXlzICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2Ygd2luZG93LldlYktpdE1lZGlhS2V5cy5pc1R5cGVTdXBwb3J0ZWQgJiYgd2luZG93LldlYktpdE1lZGlhS2V5cy5pc1R5cGVTdXBwb3J0ZWQoWS5GQUlSUExBWS5rZXlTeXN0ZW0pID8gWS5GQUlSUExBWS51dWlkIDogXCJmdW5jdGlvblwiID09IHR5cGVvZiBuYXZpZ2F0b3IucmVxdWVzdE1lZGlhS2V5U3lzdGVtQWNjZXNzID8gZS5zYWZhcmkgPyBcIlwiIDogZS5tc0lFIHx8IGUubXNFZGdlTGVnYWN5ID8gWS5QTEFZUkVBRFkudXVpZCA6IFkuV0lERVZJTkUudXVpZCA6IFwiXCI7XG4gICAgfTtcbiAgICB2YXIgc2UgPSBmdW5jdGlvbiBzZShlLCB0KSB7XG4gICAgICAgIGlmICgoZSA9IGFlKGUpKSA9PT0gKHQgPSBhZSh0KSkpIHJldHVybiAhMDtcbiAgICAgICAgaWYgKGUuYnl0ZUxlbmd0aCAhPT0gdC5ieXRlTGVuZ3RoKSByZXR1cm4gITE7XG4gICAgICAgIGZvcih2YXIgaSA9IG5ldyBEYXRhVmlldyhlKSwgbiA9IG5ldyBEYXRhVmlldyh0KSwgciA9IDA7IHIgPCBpLmJ5dGVMZW5ndGg7IHIrKylpZiAoaS5nZXRVaW50OChyKSAhPT0gbi5nZXRVaW50OChyKSkgcmV0dXJuICExO1xuICAgICAgICByZXR1cm4gITA7XG4gICAgfTtcbiAgICB2YXIgYWUgPSBmdW5jdGlvbiBhZShlKSB7XG4gICAgICAgIHJldHVybiBfaW5zdGFuY2VvZihlLCBVaW50OEFycmF5KSB8fCBfaW5zdGFuY2VvZihlLCBVaW50MTZBcnJheSkgPyBlLmJ1ZmZlciA6IGU7XG4gICAgfTtcbiAgICB2YXIgdWUgPSBmdW5jdGlvbiB1ZShlKSB7XG4gICAgICAgIHJldHVybiB0ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgaWYgKG51bGwgPT09IGUpIHJldHVybiBbXTtcbiAgICAgICAgICAgIGZvcih2YXIgdCA9IG5ldyBEYXRhVmlldyhlLmJ1ZmZlciB8fCBlKSwgaSA9IFtdLCBuID0gMDsgIShuID49IHQuYnVmZmVyLmJ5dGVMZW5ndGgpOyl7XG4gICAgICAgICAgICAgICAgdmFyIHIgPSBuICsgdC5nZXRVaW50MzIobik7XG4gICAgICAgICAgICAgICAgaWYgKG4gKz0gNCwgdC5nZXRVaW50MzIobikgPT09IGxlKFwicHNzaFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBuICs9IDQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvID0gdC5nZXRVaW50OChuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IG8gfHwgMSA9PT0gbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbisrLCBuICs9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IodmFyIHMgPSBcIlwiLCBhID0gMDsgYSA8IDQ7IGErKylzICs9IGZlKHQuZ2V0VWludDgobiArIGEpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG4gKz0gNCwgcyArPSBcIi1cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgdSA9IDA7IHUgPCAyOyB1KyspcyArPSBmZSh0LmdldFVpbnQ4KG4gKyB1KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuICs9IDIsIHMgKz0gXCItXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGMgPSAwOyBjIDwgMjsgYysrKXMgKz0gZmUodC5nZXRVaW50OChuICsgYykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbiArPSAyLCBzICs9IFwiLVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBkID0gMDsgZCA8IDI7IGQrKylzICs9IGZlKHQuZ2V0VWludDgobiArIGQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG4gKz0gMiwgcyArPSBcIi1cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaCA9IDA7IGggPCA2OyBoKyspcyArPSBmZSh0LmdldFVpbnQ4KG4gKyBoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuICs9IDYsIHMgPSBzLnRvTG93ZXJDYXNlKCksIG4gKz0gNCwgaS5wdXNoKHMpLCBuID0gcjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIG4gPSByO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBuID0gcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9KGUpLCBpID0gW10sIHQuZm9yRWFjaChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhZKS5mb3JFYWNoKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgbiA9IFlbdF07XG4gICAgICAgICAgICAgICAgbi51dWlkID09PSBlICYmIGkucHVzaChuKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSwgaTtcbiAgICAgICAgdmFyIHQsIGk7XG4gICAgfTtcbiAgICB2YXIgY2UgPSBmdW5jdGlvbiBjZShlLCB0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihpLCBuKSB7XG4gICAgICAgICAgICB2YXIgciA9IG5ldyBYTUxIdHRwUmVxdWVzdDtcbiAgICAgICAgICAgIGZvcih2YXIgbyBpbiByLm9wZW4odC5tZXRob2QsIGUsICEwKSwgdC5oZWFkZXJzKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LmhlYWRlcnMsIG8pICYmIHIuc2V0UmVxdWVzdEhlYWRlcihvLCB0LmhlYWRlcnNbb10pO1xuICAgICAgICAgICAgci5yZXNwb25zZVR5cGUgPSB0LnJlc3BvbnNlVHlwZSwgci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAyMDAgPT09IHIuc3RhdHVzICYmIGkoci5yZXNwb25zZSk7XG4gICAgICAgICAgICB9LCByLm9ubG9hZGVuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIG4oci5zdGF0dXMpO1xuICAgICAgICAgICAgfSwgci5zZW5kKHQuYm9keSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgdmFyIGRlID0gZnVuY3Rpb24gZGUoZSkge1xuICAgICAgICB2YXIgdCA9IGhlKG1lKEpTT04ucGFyc2UoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBlKSkuc2luZlswXSksIFwic2NoaVwiKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGZvcih2YXIgdCwgaSA9IFwiXCIsIG4gPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgZVtTeW1ib2wuaXRlcmF0b3JdIHx8IGVbXCJAQGl0ZXJhdG9yXCJdO1xuICAgICAgICAgICAgICAgIGlmIChpKSByZXR1cm4gKGkgPSBpLmNhbGwoZSkpLm5leHQuYmluZChpKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSB8fCAoaSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiBlKSByZXR1cm4gcmUoZSwgdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LCAtMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJPYmplY3RcIiA9PT0gaSAmJiBlLmNvbnN0cnVjdG9yICYmIChpID0gZS5jb25zdHJ1Y3Rvci5uYW1lKSwgXCJNYXBcIiA9PT0gaSB8fCBcIlNldFwiID09PSBpID8gQXJyYXkuZnJvbShlKSA6IFwiQXJndW1lbnRzXCIgPT09IGkgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoaSkgPyByZShlLCB0KSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0oZSkpIHx8IHQgJiYgZSAmJiBcIm51bWJlclwiID09IHR5cGVvZiBlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpICYmIChlID0gaSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuID0gMDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPj0gZS5sZW5ndGggPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogITEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVbbisrXVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xuICAgICAgICAgICAgfShlKTsgISh0ID0gbigpKS5kb25lOylpICs9IGZlKHQudmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH0oaGUodCwgXCJ0ZW5jXCIpLnN1YmFycmF5KDgsIDI0KSk7XG4gICAgfTtcbiAgICB2YXIgaGUgPSBmdW5jdGlvbiBoZShlLCB0KSB7XG4gICAgICAgIGZvcih2YXIgaSA9IG5ldyBEYXRhVmlldyhlLmJ1ZmZlciwgZS5ieXRlT2Zmc2V0LCBlLmJ5dGVMZW5ndGgpLCBuID0gbGUodCksIHIgPSAwOyByIDwgZS5ieXRlTGVuZ3RoOyl7XG4gICAgICAgICAgICB2YXIgbyA9IGkuZ2V0VWludDMyKHIpO1xuICAgICAgICAgICAgaWYgKGkuZ2V0VWludDMyKHIgKyA0KSA9PT0gbikgcmV0dXJuIGUuc3ViYXJyYXkociArIDgsIHIgKyBvKTtcbiAgICAgICAgICAgIHIgKz0gbztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSk7XG4gICAgfTtcbiAgICB2YXIgbGUgPSBmdW5jdGlvbiBsZShlKSB7XG4gICAgICAgIHJldHVybiAoZS5jaGFyQ29kZUF0KDApIDw8IDI0KSArIChlLmNoYXJDb2RlQXQoMSkgPDwgMTYpICsgKGUuY2hhckNvZGVBdCgyKSA8PCA4KSArIGUuY2hhckNvZGVBdCgzKTtcbiAgICB9O1xuICAgIHZhciBmZSA9IGZ1bmN0aW9uIGZlKGUpIHtcbiAgICAgICAgdmFyIHQgPSBlLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgcmV0dXJuIDEgPT09IHQubGVuZ3RoID8gXCIwXCIgKyB0IDogdDtcbiAgICB9O1xuICAgIHZhciBtZSA9IGZ1bmN0aW9uIG1lKGUpIHtcbiAgICAgICAgZm9yKHZhciB0ID0gYXRvYihlKSwgaSA9IHQubGVuZ3RoLCBuID0gbmV3IFVpbnQ4QXJyYXkoaSksIHIgPSAwOyByIDwgaTsgcisrKW5bcl0gPSB0LmNoYXJDb2RlQXQocik7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH07XG4gICAgdmFyIHZlID0gZnVuY3Rpb24gdmUoZSkge1xuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGUucmVwbGFjZSgvXFwrL2csIFwiIFwiKSk7XG4gICAgfTtcbiAgICB2YXIga2UgPSBmdW5jdGlvbiBrZShlKSB7XG4gICAgICAgIHZhciB0ID0gXCJcIjtcbiAgICAgICAgaWYgKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJDaGFsbGVuZ2VcIikubGVuZ3RoID4gMCAmJiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiQ2hhbGxlbmdlXCIpWzBdKSB7XG4gICAgICAgICAgICB2YXIgaSA9IGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJDaGFsbGVuZ2VcIilbMF0uY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICBpICYmICh0ID0gYXRvYihpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICB2YXIgU2UgPSBmdW5jdGlvbiBTZShlKSB7XG4gICAgICAgIGZvcih2YXIgdCA9IHt9LCBpID0gZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcIm5hbWVcIiksIG4gPSBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidmFsdWVcIiksIHIgPSAwOyByIDwgaS5sZW5ndGg7IHIrKyl7XG4gICAgICAgICAgICB2YXIgbyA9IGlbcl0uY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICBudWxsICE9IG8gJiYgKHRbb10gPSBuW3JdLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHZhciBiZSA9IGZ1bmN0aW9uIGJlKGUpIHtcbiAgICAgICAgdmFyIHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50MTZBcnJheShlKSksIGkgPSAobmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsIFwiYXBwbGljYXRpb24veG1sXCIpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGVhZGVyczogU2UoaSksXG4gICAgICAgICAgICBib2R5OiBrZShpKVxuICAgICAgICB9O1xuICAgIH07XG4gICAgdmFyIFRlID0gZnVuY3Rpb24gVGUoZSwgdCkge1xuICAgICAgICAobnVsbCA9PSB0IHx8IHQgPiBlLmxlbmd0aCkgJiYgKHQgPSBlLmxlbmd0aCk7XG4gICAgICAgIGZvcih2YXIgaSA9IDAsIG4gPSBuZXcgQXJyYXkodCk7IGkgPCB0OyBpKyspbltpXSA9IGVbaV07XG4gICAgICAgIHJldHVybiBuO1xuICAgIH07XG4gICAgdmFyICRlID0gZnVuY3Rpb24gJGUoZSwgdCwgaSkge1xuICAgICAgICB2YXIgbiwgciwgbywgcztcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gaSAmJiAoaSA9ICExKSwgSSgpLm1zSUUgPyBuID0gbmV3IFplKGUpIDogKHIgPSBlLCBvID0gd2luZG93LmxvY2F0aW9uLCAocyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpKS5ocmVmID0gciwgbiA9IHMuaG9zdG5hbWUgPT09IG8uaG9zdG5hbWUgJiYgcy5wb3J0ID09PSBvLnBvcnQgJiYgcy5wcm90b2NvbCA9PT0gby5wcm90b2NvbCA/IG5ldyBXb3JrZXIoZSkgOiBuZXcgV29ya2VyKFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW1xuICAgICAgICAgICAgXCJpbXBvcnRTY3JpcHRzKCdcIiArIGUgKyBcIicpXCJcbiAgICAgICAgXSkpKSksIG4ucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgd2FzbUJpbmFyeVVybDogdCxcbiAgICAgICAgICAgIHNob3dXb3JrZXJMb2dzOiBpXG4gICAgICAgIH0pLCBuO1xuICAgIH07XG4gICAgdmFyIGl0ID0gZnVuY3Rpb24gaXQoZSkge1xuICAgICAgICB2YXIgdCA9IGUuYXNtV29ya2VyLCBpID0gZS53YXNtV29ya2VyLCBuID0gZS53YXNtQmluYXJ5O1xuICAgICAgICBpZiAoIXR0ICYmICF0KSB0aHJvdyBuZXcgRXJyb3IoXCJXZWJBc3NlbWJseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyLiBUaGlzIGlzIHJlcXVpcmVkIGZvciBwbGF5YmFjay5cIik7XG4gICAgICAgIHZhciByID0gJGUodHQgPyBpIDogdCwgbiwgZS5zaG93V29ya2VyTG9nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBodChlLCByKTtcbiAgICB9O1xuICAgIHZhciBtdCA9IGZ1bmN0aW9uIG10KGUsIHQpIHtcbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gZSB8fCBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUuZ2V0VGVjaCkgdGhyb3cge1xuICAgICAgICAgICAgbWVzc2FnZTogXCJ2aWRlb2pzIG5vdCBhdmFpbGFibGUsIEFtYXpvbklWUyB0ZWNoIG5vdCByZWdpc3RlcmVkXCIsXG4gICAgICAgICAgICBjb2RlOiAxXG4gICAgICAgIH07XG4gICAgICAgIGlmICghdHQpIHRocm93IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IFwiV2ViQXNzZW1ibHkgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3IgQW1hem9uSVZTIHRlY2hcIixcbiAgICAgICAgICAgIGNvZGU6IDJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFlLmdldFRlY2goZnQpKSB7XG4gICAgICAgICAgICB2YXIgaSA9IGUuZ2V0VGVjaChcIlRlY2hcIiksIG4gPSBlLmV4dGVuZChpLCB7XG4gICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uIGNvbnN0cnVjdG9yKG4sIHIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IGR0LkhBVkVfTk9USElORywgdGhpcy5fZGVmYXVsdFBsYXliYWNrUmF0ZSA9IDEsIHRoaXMuX3NlZWtpbmcgPSAhMSwgdC5wbGF5ZXJGcmFtZXdvcmsgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInZpZGVvanNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IGUuVkVSU0lPTlxuICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9tZWRpYVBsYXllciA9IGl0KHQpLCB0aGlzLl9tZWRpYVBsYXllci5zZXRBdXRvcGxheSghMCA9PT0gbi5hdXRvcGxheSksIHRoaXMuX2F0dGFjaFZpZGVvanNMaXN0ZW5lcnMoKSwgdGhpcy5fbWVkaWFQbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcihDLk1FVEFEQVRBLCB0aGlzLl9vbkNhcHRpb25FdmVudC5iaW5kKHRoaXMpKSwgdGhpcy5mZWF0dXJlc1Byb2dyZXNzRXZlbnRzID0gITAsIHRoaXMuZmVhdHVyZXNUaW1ldXBkYXRlRXZlbnRzID0gITAsIHRoaXMuZmVhdHVyZXNQbGF5YmFja1JhdGUgPSAhMCwgdGhpcy5mZWF0dXJlc0Z1bGxzY3JlZW5SZXNpemUgPSAhMCwgdGhpcy5mZWF0dXJlc1ZvbHVtZUNvbnRyb2wgPSAhMCwgdGhpcy5mZWF0dXJlc011dGVDb250cm9sID0gITAsIHRoaXMuZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzID0gITEsIGkuY2FsbCh0aGlzLCBuLCByKSwgd2luZG93LnZ0dGpzICYmIHdpbmRvdy52dHRqcy5yZXN0b3JlKCksIHRoaXMudHJpZ2dlclJlYWR5KCksIHNldFRpbWVvdXQoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zXy5sb29wICYmIHRoaXMuX21lZGlhUGxheWVyLnNldExvb3BpbmcoITApLCB0aGlzLm9wdGlvbnNfLm11dGVkICYmIHRoaXMuX21lZGlhUGxheWVyLnNldE11dGVkKCEwKTtcbiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSwgMCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlOiBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYVBsYXllci5kZWxldGUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldFByZWxvYWQ6IGZ1bmN0aW9uIHNldFByZWxvYWQoKSB7fSxcbiAgICAgICAgICAgICAgICBhdXRvcGxheTogZnVuY3Rpb24gYXV0b3BsYXkoZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJib29sZWFuXCIgIT0gdHlwZW9mIGUpIHJldHVybiB0aGlzLl9tZWRpYVBsYXllci5hdXRvcGxheTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdXRvcGxheShlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldEF1dG9wbGF5OiBmdW5jdGlvbiBzZXRBdXRvcGxheShlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhUGxheWVyLnNldEF1dG9wbGF5KGUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHJlbG9hZDogZnVuY3Rpb24gcHJlbG9hZCgpIHt9LFxuICAgICAgICAgICAgICAgIGxvYWQ6IGZ1bmN0aW9uIGxvYWQoKSB7fSxcbiAgICAgICAgICAgICAgICByZWFkeVN0YXRlOiBmdW5jdGlvbiByZWFkeVN0YXRlKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZHlTdGF0ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlZWtpbmc6IGZ1bmN0aW9uIHNlZWtpbmcoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZWVraW5nO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbmV0d29ya1N0YXRlOiBmdW5jdGlvbiBuZXR3b3JrU3RhdGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbWVkaWFQbGF5ZXIpIHJldHVybiAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21lZGlhUGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQoKS5zcmMpIHJldHVybiAzO1xuICAgICAgICAgICAgICAgICAgICB2YXIgXyRlID0gdGhpcy5fbWVkaWFQbGF5ZXIuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGx0W18kZV07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlbmRlZDogZnVuY3Rpb24gZW5kZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tZWRpYVBsYXllci5nZXRTdGF0ZSgpID09PSBqLkVOREVEO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2Vla2FibGU6IGZ1bmN0aW9uIHNlZWthYmxlKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jcmVhdGVUaW1lUmFuZ2UoMCwgdGhpcy5fbWVkaWFQbGF5ZXIuZ2V0RHVyYXRpb24oKSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwbGF5OiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYVBsYXllci5wbGF5KCksIHRoaXMudHJpZ2dlcih1dC5QTEFZKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhdXNlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFQbGF5ZXIucGF1c2UoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldEN1cnJlbnRUaW1lOiBmdW5jdGlvbiBzZXRDdXJyZW50VGltZShlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhUGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQoKS5zcmMgJiYgKHRoaXMuX21lZGlhUGxheWVyLnNlZWtUbyhlKSwgdGhpcy5fc2Vla2luZyA9ICEwLCB0aGlzLnRyaWdnZXIodXQuU0VFS0lORykpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29udHJvbHM6IGZ1bmN0aW9uIGNvbnRyb2xzKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRDb250cm9sczogZnVuY3Rpb24gc2V0Q29udHJvbHMoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG11dGVkOiBmdW5jdGlvbiBtdXRlZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhUGxheWVyLmlzTXV0ZWQoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldE11dGVkOiBmdW5jdGlvbiBzZXRNdXRlZChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhUGxheWVyLnNldE11dGVkKGUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdm9sdW1lOiBmdW5jdGlvbiB2b2x1bWUoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tZWRpYVBsYXllci5nZXRWb2x1bWUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldFZvbHVtZTogZnVuY3Rpb24gc2V0Vm9sdW1lKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFQbGF5ZXIuc2V0Vm9sdW1lKGUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGVmYXVsdFBsYXliYWNrUmF0ZTogZnVuY3Rpb24gZGVmYXVsdFBsYXliYWNrUmF0ZShlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZSkgcmV0dXJuIHRoaXMuX2RlZmF1bHRQbGF5YmFja1JhdGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRQbGF5YmFja1JhdGUgPSBlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlOiBmdW5jdGlvbiBwbGF5YmFja1JhdGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tZWRpYVBsYXllci5nZXRQbGF5YmFja1JhdGUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldFBsYXliYWNrUmF0ZTogZnVuY3Rpb24gc2V0UGxheWJhY2tSYXRlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFQbGF5ZXIuc2V0UGxheWJhY2tSYXRlKGUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGF1c2VkOiBmdW5jdGlvbiBwYXVzZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tZWRpYVBsYXllci5pc1BhdXNlZCgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IGZ1bmN0aW9uIGR1cmF0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWVkaWFQbGF5ZXIuZ2V0RHVyYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lOiBmdW5jdGlvbiBjdXJyZW50VGltZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhUGxheWVyLmdldFBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjcmVhdGVFbDogZnVuY3Rpb24gY3JlYXRlRWwoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfJGUgPSB0aGlzLl9tZWRpYVBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIF8kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcInZqcy10ZWNoXCIpLCB2b2lkIDAgIT09IHRoaXMub3B0aW9uc18uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgJiYgKF8kZS5kaXNhYmxlUGljdHVyZUluUGljdHVyZSA9IHRoaXMub3B0aW9uc18uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcInByZWxvYWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicG9zdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgXS5mb3JFYWNoKChmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNfW3RdICYmIF8kZS5zZXRBdHRyaWJ1dGUodCwgdGhpcy5vcHRpb25zX1t0XSk7XG4gICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpLCB0aGlzLm9wdGlvbnNfLnBsYXlzaW5saW5lICYmIChfJGUuc2V0QXR0cmlidXRlKFwid2Via2l0LXBsYXlzaW5saW5lXCIsIFwiXCIpLCBfJGUuc2V0QXR0cmlidXRlKFwicGxheXNpbmxpbmVcIiwgXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFwcGVuZENoaWxkKF8kZSksIHQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzcmM6IGZ1bmN0aW9uIHNyYyhlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcih1dC5MT0FEU1RBUlQpLCB0aGlzLl9zZWVraW5nID0gITEsIHRoaXMuX2NhcHRpb25UcmFjayAmJiAodGhpcy50ZXh0VHJhY2tzKCkucmVtb3ZlVHJhY2sodGhpcy5fY2FwdGlvblRyYWNrKSwgdGhpcy5fY2FwdGlvblRyYWNrID0gbnVsbCksIGUgJiYgdGhpcy5fbWVkaWFQbGF5ZXIubG9hZChlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZSwgdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYVBsYXllci5hZGRFdmVudExpc3RlbmVyKGUsIHQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihlLCB0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhUGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSwgdCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRNZWRpYVBsYXllckFQSTogZnVuY3Rpb24gZ2V0TWVkaWFQbGF5ZXJBUEkoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tZWRpYVBsYXllcjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN1cHBvcnRzRnVsbFNjcmVlbjogZnVuY3Rpb24gc3VwcG9ydHNGdWxsU2NyZWVuKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlbnRlckZ1bGxTY3JlZW46IGZ1bmN0aW9uIGVudGVyRnVsbFNjcmVlbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF8kZSA9IHRoaXMuX21lZGlhUGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgKF8kZS5yZXF1ZXN0RnVsbHNjcmVlbiB8fCBfJGUud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4gfHwgXyRlLm1velJlcXVlc3RGdWxsU2NyZWVuIHx8IF8kZS5tc1JlcXVlc3RGdWxsc2NyZWVuIHx8IF8kZS53ZWJraXRFbnRlckZ1bGxzY3JlZW4gfHwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRnVsbHNjcmVlbiBBUEkgaXMgbm90IGF2YWlsYWJsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSkuY2FsbChfJGUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXhpdEZ1bGxTY3JlZW46IGZ1bmN0aW9uIGV4aXRGdWxsU2NyZWVuKCkge1xuICAgICAgICAgICAgICAgICAgICAoZG9jdW1lbnQuZXhpdEZ1bGxTY3JlZW4gfHwgZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4gfHwgZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbiB8fCBkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuIHx8IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkV4aXRzY3JlZW4gQVBJIGlzIG5vdCBhdmFpbGFibGVcIik7XG4gICAgICAgICAgICAgICAgICAgIH0pLmNhbGwoZG9jdW1lbnQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVxdWVzdFBpY3R1cmVJblBpY3R1cmU6IGZ1bmN0aW9uIHJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWVkaWFQbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudCgpLnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXREaXNhYmxlUGljdHVyZUluUGljdHVyZTogZnVuY3Rpb24gc2V0RGlzYWJsZVBpY3R1cmVJblBpY3R1cmUoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYVBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50KCkuZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgPSBlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGlzYWJsZVBpY3R1cmVJblBpY3R1cmU6IGZ1bmN0aW9uIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWVkaWFQbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudCgpLmRpc2FibGVQaWN0dXJlSW5QaWN0dXJlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgX29uQ2FwdGlvbkV2ZW50OiBmdW5jdGlvbiBfb25DYXB0aW9uRXZlbnQoZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJ0ZXh0L2pzb25cIiA9PT0gZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmNhcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQuY2FwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYXB0aW9uVHJhY2sgfHwgKHRoaXMuX2NhcHRpb25UcmFjayA9IHRoaXMuYWRkVGV4dFRyYWNrKFwiY2FwdGlvbnNcIiwgaS5mb3JtYXQpLCB0aGlzLl9jdXJyZW50Q3VlID0gbnVsbCksIHRoaXMuX2N1cnJlbnRDdWUgJiYgdGhpcy5fY2FwdGlvblRyYWNrLnJlbW92ZUN1ZSh0aGlzLl9jdXJyZW50Q3VlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMuX21lZGlhUGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQoKSwgciA9IHdpbmRvdy5WVFRDdWUgfHwgd2luZG93LnZ0dGpzLlZUVEN1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID8gKHRoaXMuX2N1cnJlbnRDdWUgPSBuZXcgcihuLmN1cnJlbnRUaW1lLCBuLmN1cnJlbnRUaW1lICsgMiwgaS50ZXh0KSwgdGhpcy5fY2FwdGlvblRyYWNrLmFkZEN1ZSh0aGlzLl9jdXJyZW50Q3VlKSkgOiBjb25zb2xlLndhcm4oXCJObyBWVFRDdWUgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlLCBjYXB0aW9uIG1heSBub3QgYmUgYXZhaWxhYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBfYXR0YWNoVmlkZW9qc0xpc3RlbmVyczogZnVuY3Rpb24gX2F0dGFjaFZpZGVvanNMaXN0ZW5lcnMoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhUGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoai5SRUFEWSwgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IGR0LkhBVkVfTUVUQURBVEEsIHRoaXMudHJpZ2dlcih1dC5MT0FERURfTUVUQURBVEEpO1xuICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpKSwgdGhpcy5fbWVkaWFQbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcihqLklETEUsIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBkdC5IQVZFX05PVEhJTkcsIHRoaXMudHJpZ2dlcih1dC5QQVVTRSk7XG4gICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpLCB0aGlzLl9tZWRpYVBsYXllci5hZGRFdmVudExpc3RlbmVyKGouUExBWUlORywgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA8PSBkdC5IQVZFX0NVUlJFTlRfREFUQSAmJiAodGhpcy5fcmVhZHlTdGF0ZSA9IGR0LkhBVkVfRlVUVVJFX0RBVEEpLCB0aGlzLnRyaWdnZXIodXQuUExBWSksIHRoaXMudHJpZ2dlcih1dC5QTEFZSU5HKTtcbiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSksIHRoaXMuX21lZGlhUGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoai5FTkRFRCwgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IGR0LkhBVkVfTk9USElORywgdGhpcy50cmlnZ2VyKHV0LkVOREVEKTtcbiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSksIHRoaXMuX21lZGlhUGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoai5CVUZGRVJJTkcsIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBkdC5IQVZFX0NVUlJFTlRfREFUQTtcbiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSksIHRoaXMuX21lZGlhUGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoQy5SRUJVRkZFUklORywgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IGR0LkhBVkVfQ1VSUkVOVF9EQVRBLCB0aGlzLnRyaWdnZXIodXQuV0FJVElORyk7XG4gICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpLCB0aGlzLl9tZWRpYVBsYXllci5hZGRFdmVudExpc3RlbmVyKEMuVElNRV9VUERBVEUsIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcih1dC5USU1FX1VQREFURSk7XG4gICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpLCB0aGlzLl9tZWRpYVBsYXllci5hZGRFdmVudExpc3RlbmVyKEMuVk9MVU1FX0NIQU5HRUQsIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcih1dC5WT0xVTUVfQ0hBTkdFKTtcbiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSksIHRoaXMuX21lZGlhUGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoQy5NVVRFRF9DSEFOR0VELCAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIodXQuVk9MVU1FX0NIQU5HRSk7XG4gICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpLCB0aGlzLl9tZWRpYVBsYXllci5hZGRFdmVudExpc3RlbmVyKEMuRVJST1IsIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcih1dC5FUlJPUik7XG4gICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpLCB0aGlzLl9tZWRpYVBsYXllci5hZGRFdmVudExpc3RlbmVyKEMuRFVSQVRJT05fQ0hBTkdFRCwgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKHV0LkRVUkFUSU9OX0NIQU5HRSk7XG4gICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpLCB0aGlzLl9tZWRpYVBsYXllci5hZGRFdmVudExpc3RlbmVyKEMuU0VFS19DT01QTEVURUQsIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlZWtpbmcgPSAhMSwgdGhpcy50cmlnZ2VyKHV0LlNFRUtFRCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpLCB0aGlzLl9tZWRpYVBsYXllci5hZGRFdmVudExpc3RlbmVyKEMuUExBWUJBQ0tfUkFURV9DSEFOR0VELCAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIodXQuUkFURV9DSEFOR0UpO1xuICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRlY2hOYW1lOiBmdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuLnN1cHBvcnRzRnVsbFNjcmVlbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH0sIG4uaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTEgPT09IChuYXZpZ2F0b3IuYXBwVmVyc2lvbiB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJydjoxMVwiKTtcbiAgICAgICAgICAgIH0sIG4uY2FuUGxheVR5cGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCIgPT0gdHlwZW9mIGUgJiYgZS5sZW5ndGggPiAwICYmIChlLmluZGV4T2YoXCJhcHBsaWNhdGlvbi94LW1wZWdVUkxcIikgPiAtMSA/IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIE1lZGlhU291cmNlICYmIE1lZGlhU291cmNlLmlzVHlwZVN1cHBvcnRlZCgndmlkZW8vbXA0OyBjb2RlY3M9XCJhdmMxLjQyRTAxRSxtcDRhLjQwLjJcIicpIDogXCJcIiAhPT0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpLmNhblBsYXlUeXBlKGUpKTtcbiAgICAgICAgICAgIH0sIG4uY2FuUGxheVNvdXJjZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH0sIGUucmVnaXN0ZXJUZWNoKFwiQW1hem9uSVZTXCIsIG4pO1xuICAgICAgICAgICAgdmFyIHIgPSBlLnJlZ2lzdGVyUGx1Z2luIHx8IGUucGx1Z2luO1xuICAgICAgICAgICAgcihcImdldElWU0V2ZW50c1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBQbGF5ZXJFdmVudFR5cGU6IEMsXG4gICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhRXZlbnRUeXBlOiBILFxuICAgICAgICAgICAgICAgICAgICBQbGF5ZXJTdGF0ZTogaixcbiAgICAgICAgICAgICAgICAgICAgRXJyb3JUeXBlOiBydFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSwgcihcImdldElWU1BsYXllclwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50ZWNoKCEwKS5nZXRNZWRpYVBsYXllckFQSSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHZhciBwdCA9IGZ1bmN0aW9uIHB0KGUpIHtcbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gZSB8fCBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUuZ2V0VGVjaCkgdGhyb3cge1xuICAgICAgICAgICAgbWVzc2FnZTogXCJ2aWRlb2pzIG5vdCBhdmFpbGFibGUsIEFtYXpvbiBJVlMgUXVhbGl0eSBQbHVnaW4gbm90IHJlZ2lzdGVyZWRcIixcbiAgICAgICAgICAgIGNvZGU6IDFcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFlLmdldFBsdWdpbih2dCkpIHtcbiAgICAgICAgICAgIHZhciB0ID0gZS5nZXRDb21wb25lbnQoXCJNZW51QnV0dG9uXCIpLCBpID0gZS5nZXRDb21wb25lbnQoXCJNZW51SXRlbVwiKSwgbiA9IGUuZXh0ZW5kKGksIHtcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24gY29uc3RydWN0b3IoZSwgdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQucXVhbGl0eTtcbiAgICAgICAgICAgICAgICAgICAgaS5jYWxsKHRoaXMsIGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6ICEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG4ubmFtZVxuICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5xdWFsaXR5ID0gbjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBmdW5jdGlvbiBoYW5kbGVDbGljayhlKSB7XG4gICAgICAgICAgICAgICAgICAgIGkucHJvdG90eXBlLmhhbmRsZUNsaWNrLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5wbGF5ZXIoKS5nZXRJVlNQbGF5ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgXCJhdXRvXCIgPT09IHRoaXMucXVhbGl0eS5ncm91cCA/IHQuc2V0QXV0b1F1YWxpdHlNb2RlKCEwKSA6IHQuc2V0UXVhbGl0eSh0aGlzLnF1YWxpdHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLCByID0gZS5leHRlbmQodCwge1xuICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbiBjb25zdHJ1Y3RvcihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHQuY2FsbCh0aGlzLCBlLCB7fSksIHRoaXMuY29udHJvbFRleHQoXCJRdWFsaXR5XCIpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY3JlYXRlSXRlbXM6IGZ1bmN0aW9uIGNyZWF0ZUl0ZW1zKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgXyRlID0gdGhpcy5wbGF5ZXIoKSwgdCA9IF8kZS5nZXRJVlNQbGF5ZXIoKSwgaSA9IFtdLCByID0gbmV3IG4oXyRlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiYXV0b1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByLnNlbGVjdGVkKHQuaXNBdXRvUXVhbGl0eU1vZGUoKSksIHIub24oXCJjbGlja1wiLCB0aGlzLl9jbGlja0hhbmRsZXIuYmluZCh0aGlzLCByKSksIHIub24oXCJ0YXBcIiwgdGhpcy5fY2xpY2tIYW5kbGVyLmJpbmQodGhpcywgcikpLCBpLnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvID0gdC5nZXRRdWFsaXR5KCksIHMgPSB0LmdldFF1YWxpdGllcygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyAmJiBzLmxlbmd0aCA+IDAgJiYgcy5mb3JFYWNoKChmdW5jdGlvbihyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IG5ldyBuKF8kZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHk6IHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcy5vbihcImNsaWNrXCIsIHRoaXMuX2NsaWNrSGFuZGxlci5iaW5kKHRoaXMsIHMpKSwgcy5vbihcInRhcFwiLCB0aGlzLl9jbGlja0hhbmRsZXIuYmluZCh0aGlzLCBzKSksIHQuaXNBdXRvUXVhbGl0eU1vZGUoKSB8fCBzLnNlbGVjdGVkKG8uZ3JvdXAgPT09IHIuZ3JvdXApLCBpLnB1c2gocyk7XG4gICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpLCB0LmFkZEV2ZW50TGlzdGVuZXIoQy5RVUFMSVRZX0NIQU5HRUQsIGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8kZS5jb250cm9sQmFyLmdldENoaWxkKFwiUXVhbGl0eU1lbnVCdXR0b25cIikucXVhbGl0eUl0ZW1zLmZvckVhY2goZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0LmlzQXV0b1F1YWxpdHlNb2RlKCkgJiYgaSAmJiBlICYmIGUucXVhbGl0eSAmJiBlLnNlbGVjdGVkKGkuZ3JvdXAgPT09IGUucXVhbGl0eS5ncm91cCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMucXVhbGl0eUl0ZW1zID0gaSwgaTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJ1aWxkQ1NTQ2xhc3M6IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcInZqcy1pY29uLWhkIHZqcy1pY29uLXBsYWNlaG9sZGVyIFwiICsgdC5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgX2NsaWNrSGFuZGxlcjogZnVuY3Rpb24gX2NsaWNrSGFuZGxlcihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ICE9PSBlICYmIHQuc2VsZWN0ZWQoITEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGUucmVnaXN0ZXJDb21wb25lbnQoXCJRdWFsaXR5TWVudUJ1dHRvblwiLCByKSwgKGUucmVnaXN0ZXJQbHVnaW4gfHwgZS5wbHVnaW4pKHZ0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgXyRlID0gdGhpcztcbiAgICAgICAgICAgICAgICBfJGUuZ2V0SVZTUGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcihqLlJFQURZLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBfJGUuY29udHJvbEJhci5nZXRDaGlsZChcIlF1YWxpdHlNZW51QnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgICAgICB0ICYmICh0LmRpc3Bvc2UoKSwgXyRlLmNvbnRyb2xCYXIucmVtb3ZlQ2hpbGQodCkpLCBfJGUuY29udHJvbEJhci5hZGRDaGlsZChcIlF1YWxpdHlNZW51QnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHZhciBlID0ge1xuICAgICAgICBuOiBmdW5jdGlvbiBuKHQpIHtcbiAgICAgICAgICAgIHZhciBpID0gdCAmJiB0Ll9fZXNNb2R1bGUgPyBmdW5jdGlvbiBpKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0LmRlZmF1bHQ7XG4gICAgICAgICAgICB9IDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGUuZChpLCB7XG4gICAgICAgICAgICAgICAgYTogaVxuICAgICAgICAgICAgfSksIGk7XG4gICAgICAgIH0sXG4gICAgICAgIGQ6IGZ1bmN0aW9uIGQodCwgaSkge1xuICAgICAgICAgICAgZm9yKHZhciBuIGluIGkpZS5vKGksIG4pICYmICFlLm8odCwgbikgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIG4sIHtcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgICAgICAgICBnZXQ6IGlbbl1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBlLmcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgPT0gdHlwZW9mIGdsb2JhbFRoaXMpIHJldHVybiBnbG9iYWxUaGlzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKFwib2JqZWN0XCIgPT0gdHlwZW9mIHdpbmRvdykgcmV0dXJuIHdpbmRvdztcbiAgICAgICAgfVxuICAgIH0oKSwgZS5vID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHQpO1xuICAgIH0sIGUuciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC50b1N0cmluZ1RhZyAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgICAgICB2YWx1ZTogXCJNb2R1bGVcIlxuICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgICAgICB2YWx1ZTogITBcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGUucih0KSwgZS5kKHQsIHtcbiAgICAgICAgQXV0aG9yaXphdGlvbkVycm9yOiBmdW5jdGlvbiBBdXRob3JpemF0aW9uRXJyb3IoKSB7XG4gICAgICAgICAgICByZXR1cm4gb3Q7XG4gICAgICAgIH0sXG4gICAgICAgIENhcHR1cmVFdmVudFR5cGU6IGZ1bmN0aW9uIENhcHR1cmVFdmVudFR5cGUoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3Q7XG4gICAgICAgIH0sXG4gICAgICAgIEVycm9yU291cmNlOiBmdW5jdGlvbiBFcnJvclNvdXJjZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBudDtcbiAgICAgICAgfSxcbiAgICAgICAgRXJyb3JUeXBlOiBmdW5jdGlvbiBFcnJvclR5cGUoKSB7XG4gICAgICAgICAgICByZXR1cm4gcnQ7XG4gICAgICAgIH0sXG4gICAgICAgIExvZ0xldmVsOiBmdW5jdGlvbiBMb2dMZXZlbCgpIHtcbiAgICAgICAgICAgIHJldHVybiBhdDtcbiAgICAgICAgfSxcbiAgICAgICAgTWVkaWFQbGF5ZXI6IGZ1bmN0aW9uIE1lZGlhUGxheWVyKCkge1xuICAgICAgICAgICAgcmV0dXJuIGh0O1xuICAgICAgICB9LFxuICAgICAgICBNZXRhZGF0YUV2ZW50VHlwZTogZnVuY3Rpb24gTWV0YWRhdGFFdmVudFR5cGUoKSB7XG4gICAgICAgICAgICByZXR1cm4gSDtcbiAgICAgICAgfSxcbiAgICAgICAgTWV0YWRhdGFJRDNUeXBlOiBmdW5jdGlvbiBNZXRhZGF0YUlEM1R5cGUoKSB7XG4gICAgICAgICAgICByZXR1cm4gRjtcbiAgICAgICAgfSxcbiAgICAgICAgUGxheWVyRXZlbnRUeXBlOiBmdW5jdGlvbiBQbGF5ZXJFdmVudFR5cGUoKSB7XG4gICAgICAgICAgICByZXR1cm4gQztcbiAgICAgICAgfSxcbiAgICAgICAgUGxheWVyU3RhdGU6IGZ1bmN0aW9uIFBsYXllclN0YXRlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgIH0sXG4gICAgICAgIFJlbW90ZVBsYXllckV2ZW50OiBmdW5jdGlvbiBSZW1vdGVQbGF5ZXJFdmVudCgpIHtcbiAgICAgICAgICAgIHJldHVybiBHO1xuICAgICAgICB9LFxuICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBpdDtcbiAgICAgICAgfSxcbiAgICAgICAgY3JlYXRlV29ya2VyOiBmdW5jdGlvbiBjcmVhdGVXb3JrZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gJGU7XG4gICAgICAgIH0sXG4gICAgICAgIGlzUGxheWVyU3VwcG9ydGVkOiBmdW5jdGlvbiBpc1BsYXllclN1cHBvcnRlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0dDtcbiAgICAgICAgfSxcbiAgICAgICAgaXNWUDlTdXBwb3J0ZWQ6IGZ1bmN0aW9uIGlzVlA5U3VwcG9ydGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIH0sXG4gICAgICAgIGlzV2FzbVN1cHBvcnRlZDogZnVuY3Rpb24gaXNXYXNtU3VwcG9ydGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIGV0O1xuICAgICAgICB9LFxuICAgICAgICByZWdpc3RlcklWU1F1YWxpdHlQbHVnaW46IGZ1bmN0aW9uIHJlZ2lzdGVySVZTUXVhbGl0eVBsdWdpbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwdDtcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaXN0ZXJJVlNUZWNoOiBmdW5jdGlvbiByZWdpc3RlcklWU1RlY2goKSB7XG4gICAgICAgICAgICByZXR1cm4gbXQ7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgaSA9IHJlcXVpcmUoXCJib3dzZXJcIiksIG4gPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKSwgciA9IGUubihuKSwgbyA9IDEwMSwgcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IHZvaWQgMCwgdGhpcy5oZWFkID0gdm9pZCAwLCB0aGlzLnRhaWwgPSB2b2lkIDAsIHRoaXMuYnVmZmVyID0gW10sIHRoaXMuaGVhZCA9IDAsIHRoaXMudGFpbCA9IDA7XG4gICAgICAgIH07XG4gICAgICAgIHZhciB0ID0gZS5wcm90b3R5cGU7XG4gICAgICAgIHJldHVybiB0LnB1c2ggPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnRhaWwgPT09IHRoaXMuYnVmZmVyLmxlbmd0aCA/IHRoaXMuYnVmZmVyLnB1c2goZSkgOiB0aGlzLmJ1ZmZlclt0aGlzLnRhaWxdID0gZSwgdGhpcy50YWlsKys7XG4gICAgICAgIH0sIHQucG9wID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZSwgdCA9IG51bGwgIT0gKGUgPSB0aGlzLmJ1ZmZlclt0aGlzLmhlYWRdKSA/IGUgOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaGVhZF0gPSBudWxsLCB0aGlzLmhlYWQrKywgdGhpcy5lbXB0eSgpICYmICh0aGlzLmhlYWQgPSAwLCB0aGlzLnRhaWwgPSAwKSwgdDtcbiAgICAgICAgfSwgdC5zaXplID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YWlsIC0gdGhpcy5oZWFkO1xuICAgICAgICB9LCB0LmVtcHR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oZWFkID49IHRoaXMudGFpbDtcbiAgICAgICAgfSwgZTtcbiAgICB9KCk7XG4gICAgdmFyIGwgPSAuMSwgZiA9IDEgPDwgMzAsIG0gPSAxMmU0LCB2ID0gM2UzLCBwID0ge1xuICAgICAgICBhdWRpbzogMTkzNjY4NDM5OCxcbiAgICAgICAgdmlkZW86IDE5ODY2MTg0NjlcbiAgICB9O1xuICAgIHZhciBDLCBQID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlID0gZnVuY3Rpb24gZShlLCB0LCBpLCBuLCByKSB7XG4gICAgICAgICAgICB0aGlzLnJhd0NvZGVjID0gdCwgdGhpcy5ncm91cCA9IGksIHRoaXMuaXNQcm90ZWN0ZWQgPSBuLCB0aGlzLm9uRXJyb3IgPSByLCB0aGlzLnBlbmRpbmcgPSB2b2lkIDAsIHRoaXMudW5zdWJzY3JpYmVycyA9IFtdLCB0aGlzLnNyY0J1ZiA9IHZvaWQgMCwgdGhpcy5ibG9ja2VkID0gITEsIHRoaXMuc3JjQnVmID0gZSwgdGhpcy5wZW5kaW5nID0gbmV3IHMsIHRoaXMudW5zdWJzY3JpYmVycy5wdXNoKGIoZSwgXCJ1cGRhdGVlbmRcIiwgdGhpcy5wcm9jZXNzLmJpbmQodGhpcykpKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHQgPSBlLnByb3RvdHlwZTtcbiAgICAgICAgcmV0dXJuIHQuZ2V0QnVmZmVyZWRSYW5nZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zcmNCdWYpIGZvcih2YXIgdCA9IHRoaXMuc3JjQnVmLmJ1ZmZlcmVkLCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHQuc3RhcnQoaSksXG4gICAgICAgICAgICAgICAgICAgIGVuZDogdC5lbmQoaSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0LmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBlLmFib3J0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdC5hcHBlbmRCdWZmZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0LmFwcGVuZEJ1ZmZlcihlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJRdW90YUV4Y2VlZGVkRXJyb3JcIiAhPT0gZTEubmFtZSkgdGhyb3cgZTE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5idWZmZXJlZCwgbiA9IGkuc3RhcnQoMCksIHIgPSBpLmVuZChpLmxlbmd0aCAtIDEpLCBvID0gKG4gKyByKSAvIDI7XG4gICAgICAgICAgICAgICAgICAgIHQucmVtb3ZlKG8sIHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB0LnNldFRpbWVzdGFtcE9mZnNldCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUoZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHQudGltZXN0YW1wT2Zmc2V0ID0gZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB0LnJlbW92ZSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUoZnVuY3Rpb24oaSkge1xuICAgICAgICAgICAgICAgIHZhciBuID0gaS5idWZmZXJlZDtcbiAgICAgICAgICAgICAgICBpZiAobi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBNYXRoLm1heChlLCBuLnN0YXJ0KDApKSwgbyA9IE1hdGgubWluKHQsIG4uZW5kKG4ubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgICAgICByIDwgbyAmJiBpLnJlbW92ZShyLCBvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdC5ibG9jayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICBlLnNjaGVkdWxlKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBlLmJsb2NrZWQgPSAhMCwgdCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIHQudW5ibG9jayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5ibG9ja2VkID0gITEsIHRoaXMucHJvY2VzcygpO1xuICAgICAgICB9LCB0LmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IG5ldyBzLCB0aGlzLnVuc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUoKTtcbiAgICAgICAgICAgIH0pLCB0aGlzLnNyY0J1ZiA9IHZvaWQgMDtcbiAgICAgICAgfSwgdC5zY2hlZHVsZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZy5lbXB0eSgpICYmIHRoaXMuY2FuUHJvY2VzcygpID8gdGhpcy5zYWZlRXhlY3V0ZShlKSA6ICh0aGlzLnBlbmRpbmcucHVzaChlKSwgdGhpcy5wcm9jZXNzKCkpO1xuICAgICAgICB9LCB0LnNhZmVFeGVjdXRlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3JjQnVmKSB0aHJvdyBuZXcgRXJyb3IoXCJzcmNCdWYgaXMgdW5kZWZpbmVkXCIpO1xuICAgICAgICAgICAgICAgIGUodGhpcy5zcmNCdWYpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZTEsICExKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdC5wcm9jZXNzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBmb3IoOyAhdGhpcy5wZW5kaW5nLmVtcHR5KCkgJiYgdGhpcy5jYW5Qcm9jZXNzKCk7KXRoaXMuc2FmZUV4ZWN1dGUodGhpcy5wZW5kaW5nLnBvcCgpKTtcbiAgICAgICAgfSwgdC5jYW5Qcm9jZXNzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gISghdGhpcy5zcmNCdWYgfHwgdGhpcy5zcmNCdWYudXBkYXRpbmcgfHwgdGhpcy5ibG9ja2VkKTtcbiAgICAgICAgfSwgcigpKGUsIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiYnVmZmVyXCIsXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNyY0J1ZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogXCJjb2RlY1wiLFxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yYXdDb2RlYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogXCJ0aW1lc3RhbXBPZmZzZXRcIixcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIudGltZXN0YW1wT2Zmc2V0IDogMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF0pLCBlO1xuICAgIH0oKSwgQSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uIGUoZSwgdCwgaSkge1xuICAgICAgICAgICAgdGhpcy5tZWRpYVNvdXJjZSA9IGUsIHRoaXMub25FbmRlZCA9IHQsIHRoaXMub25FcnJvciA9IGksIHRoaXMuc291cmNlQnVmZmVycyA9IE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMudW5zdWJzY3JpYmVycyA9IFtdLCB0aGlzLnVuc3Vic2NyaWJlcnMucHVzaChiKGUsIFwic291cmNlZW5kZWRcIiwgdGhpcy5vbkVuZGVkKSk7XG4gICAgICAgIH07XG4gICAgICAgIGUuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IHNlbGYuTWVkaWFTb3VyY2U7XG4gICAgICAgIH0sIGUuaXNTdXBwb3J0ZWRJbldvcmtlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGUuaXNTdXBwb3J0ZWQoKSAmJiBNZWRpYVNvdXJjZS5jYW5Db25zdHJ1Y3RJbkRlZGljYXRlZFdvcmtlciAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE1lZGlhU291cmNlSGFuZGxlO1xuICAgICAgICB9LCBlLmNyZWF0ZSA9IGZ1bmN0aW9uKHQsIGkpIHtcbiAgICAgICAgICAgIHZhciBuID0gbmV3IE1lZGlhU291cmNlLCByID0gbmV3IFByb21pc2UoZnVuY3Rpb24ociwgbykge1xuICAgICAgICAgICAgICAgIHZhciBzID0gYihuLCBcInNvdXJjZW9wZW5cIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIFwib3BlblwiID09PSBuLnJlYWR5U3RhdGUgPyAocihuZXcgZShuLCB0LCBpKSksIHMoKSkgOiBvKFwiVGhlIE1lZGlhU291cmNlIHdhcyBjbG9zZWQgdXBvbiBvcGVuaW5nXCIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1zOiBuLFxuICAgICAgICAgICAgICAgIHNpbms6IHJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIHZhciB0ID0gZS5wcm90b3R5cGU7XG4gICAgICAgIHJldHVybiB0LmdldEJ1ZmZlcmVkUmFuZ2VzID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQsIGk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCAhPSAodCA9IG51bGwgPT0gKGkgPSB0aGlzLnNvdXJjZUJ1ZmZlcnNbcFtlXV0pID8gdm9pZCAwIDogaS5nZXRCdWZmZXJlZFJhbmdlcygpKSA/IHQgOiBbXTtcbiAgICAgICAgfSwgdC5hZGRUcmFjayA9IGZ1bmN0aW9uKGUsIHQsIGksIG4pIHtcbiAgICAgICAgICAgIHZhciByLCBvID0gdGhpcy5tZWRpYVNvdXJjZSwgcyA9IHRoaXMuc291cmNlQnVmZmVycztcbiAgICAgICAgICAgIGlmIChzW2VdKSByZXR1cm4gbnVsbCAhPSAociA9IHNbZV0uYnVmZmVyKSA/IHIgOiBudWxsO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgYSA9IG8uYWRkU291cmNlQnVmZmVyKFwidmlkZW8vbXA0O1wiICsgdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNbZV0gPSBuZXcgUChhLCB0LCBpLCBuLCB0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpLCBhO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGUxLCBcIm9wZW5cIiA9PT0gby5yZWFkeVN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9LCB0LmFwcGVuZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgbnVsbCA9PSAoaSA9IHRoaXMuc291cmNlQnVmZmVyc1tlXSkgfHwgaS5hcHBlbmRCdWZmZXIodCk7XG4gICAgICAgIH0sIHQucmVtb3ZlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgZm9yKHZhciBpID0gdGhpcy5zb3VyY2VCdWZmZXJzLCBuID0gMCwgciA9IE9iamVjdC5rZXlzKGkpOyBuIDwgci5sZW5ndGg7IG4rKylpW3Jbbl1dLnJlbW92ZShlLCB0KTtcbiAgICAgICAgfSwgdC5zZXRUaW1lc3RhbXBPZmZzZXQgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICB2YXIgaSA9IHRoaXMuc291cmNlQnVmZmVyc1tlXTtcbiAgICAgICAgICAgIGkgJiYgKGkuYWJvcnQoKSwgaS5zZXRUaW1lc3RhbXBPZmZzZXQodCkpO1xuICAgICAgICB9LCB0LnNldER1cmF0aW9uID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVVwZGF0ZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5tZWRpYVNvdXJjZS5kdXJhdGlvbiA9IGU7XG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuaGFuZGxlRXJyb3IoZSwgITEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIHQuc2V0TGl2ZVNlZWthYmxlUmFuZ2UgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICB2YXIgaSA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpLm1lZGlhU291cmNlLnNldExpdmVTZWVrYWJsZVJhbmdlKGUsIHQpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpLmhhbmRsZUVycm9yKGUsICExKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB0LnNjaGVkdWxlVXBkYXRlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgICAgICAgdm9pZCAwID09PSBlICYmIChlID0gTSk7XG4gICAgICAgICAgICB2YXIgaSA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQnVmZmVycykubWFwKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5zb3VyY2VCdWZmZXJzW2VdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoaS5tYXAoZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmJsb2NrKCk7XG4gICAgICAgICAgICB9KSkudGhlbihlKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpLmZvckVhY2goZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51bmJsb2NrKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdC5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lTb3VyY2VCdWZmZXJzKCksIHRoaXMudW5zdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZSgpO1xuICAgICAgICAgICAgfSksIHRoaXMudW5zdWJzY3JpYmVycyA9IFtdO1xuICAgICAgICB9LCB0LmhhbmRsZUVycm9yID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgdmFyIGkgPSBlLmNvZGUgfHwgMTAyLCBuID0gMTAyO1xuICAgICAgICAgICAgXCJOb3RTdXBwb3J0ZWRFcnJvclwiID09PSBlLm5hbWUgJiYgKG4gPSBpID0gNCksIHRoaXMub25FcnJvcihuLCBpLCBlLm1lc3NhZ2UsIHQpO1xuICAgICAgICB9LCB0LmRlc3Ryb3lTb3VyY2VCdWZmZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBmb3IodmFyIF8kZSA9IHRoaXMubWVkaWFTb3VyY2UsIHQgPSBfJGUuc291cmNlQnVmZmVycywgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKXRyeSB7XG4gICAgICAgICAgICAgICAgXyRlLnJlbW92ZVNvdXJjZUJ1ZmZlcih0W2ldKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGUsICExKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvcih2YXIgbiA9IDAsIHIgPSBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZUJ1ZmZlcnMpOyBuIDwgci5sZW5ndGg7IG4rKyl7XG4gICAgICAgICAgICAgICAgdmFyIG8gPSByW25dO1xuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQnVmZmVyc1tvXS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUJ1ZmZlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB9LCByKCkoZSwgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogXCJkdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZWRpYVNvdXJjZS5kdXJhdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogXCJidWZmZXJQcm9wZXJ0aWVzXCIsXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5zb3VyY2VCdWZmZXJzO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZSkubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZVt0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJRDogTnVtYmVyKHQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjOiBpLmNvZGVjLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IFwibXNlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Byb3RlY3RlZDogaS5pc1Byb3RlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cDogaS5ncm91cCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNPYmo6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXSksIGU7XG4gICAgfSgpLCBNID0gZnVuY3Rpb24gTSgpIHt9LCBEID0gL14oXFxkKylcXC4oXFxkKylcXC4oXFxkKylbK3wtXT8oLiopPyQvLCBSID0gL14oXFxkKylcXC4oXFxkKylbK3wtXT8oLiopPyQvLCBMID0gL14oXFxkKykkLywgdyA9IHtcbiAgICAgICAgY2hyb21lOiAhMSxcbiAgICAgICAgY2hyb21lY2FzdDogITEsXG4gICAgICAgIGRvbWFpbjogXCJcIixcbiAgICAgICAgZWxlY3Ryb246ICExLFxuICAgICAgICBmYW1pbHk6IFwiXCIsXG4gICAgICAgIGZpcmVmb3g6ICExLFxuICAgICAgICBob3N0OiBcIlwiLFxuICAgICAgICBtYWpvcjogLTEsXG4gICAgICAgIG1pbm9yOiAtMSxcbiAgICAgICAgbXNFZGdlTGVnYWN5OiAhMSxcbiAgICAgICAgbXNFZGdlQ2hyb21pdW06ICExLFxuICAgICAgICBtc0lFOiAhMSxcbiAgICAgICAgbmFtZTogXCJcIixcbiAgICAgICAgb3BlcmE6ICExLFxuICAgICAgICBvc05hbWU6IFwiXCIsXG4gICAgICAgIG9zVmVyc2lvbjogXCJcIixcbiAgICAgICAgcGF0Y2g6IC0xLFxuICAgICAgICBzYWZhcmk6ICExLFxuICAgICAgICB1cmw6IFwiXCIsXG4gICAgICAgIHVzZXJBZ2VudDogXCJcIixcbiAgICAgICAgbW9iaWxlOiAhMSxcbiAgICAgICAgc3VwcG9ydHNEYXRhQ2hhbm5lbHM6ICExLFxuICAgICAgICBzdXBwb3J0c1dlYlRyYW5zcG9ydDogITEsXG4gICAgICAgIHN1cHBvcnRzTVNFSW5Xb3JrZXJzOiAhMVxuICAgIH0sIF8gPSBudWxsO1xuICAgICFmdW5jdGlvbihlKSB7XG4gICAgICAgIGUuSU5JVElBTElaRUQgPSBcIlBsYXllckluaXRpYWxpemVkXCIsIGUuUVVBTElUWV9DSEFOR0VEID0gXCJQbGF5ZXJRdWFsaXR5Q2hhbmdlZFwiLCBlLkRVUkFUSU9OX0NIQU5HRUQgPSBcIlBsYXllckR1cmF0aW9uQ2hhbmdlZFwiLCBlLlZPTFVNRV9DSEFOR0VEID0gXCJQbGF5ZXJWb2x1bWVDaGFuZ2VkXCIsIGUuTVVURURfQ0hBTkdFRCA9IFwiUGxheWVyTXV0ZWRDaGFuZ2VkXCIsIGUuUExBWUJBQ0tfUkFURV9DSEFOR0VEID0gXCJQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkXCIsIGUuUkVCVUZGRVJJTkcgPSBcIlBsYXllclJlYnVmZmVyaW5nXCIsIGUuQVVESU9fQkxPQ0tFRCA9IFwiUGxheWVyQXVkaW9CbG9ja2VkXCIsIGUuUExBWUJBQ0tfQkxPQ0tFRCA9IFwiUGxheWVyUGxheWJhY2tCbG9ja2VkXCIsIGUuRVJST1IgPSBcIlBsYXllckVycm9yXCIsIGUuUkVDT1ZFUkFCTEVfRVJST1IgPSBcIlBsYXllclJlY292ZXJhYmxlRXJyb3JcIiwgZS5BTkFMWVRJQ1NfRVZFTlQgPSBcIlBsYXllckFuYWx5dGljc0V2ZW50XCIsIGUuVElNRV9VUERBVEUgPSBcIlBsYXllclRpbWVVcGRhdGVcIiwgZS5CVUZGRVJfVVBEQVRFID0gXCJQbGF5ZXJCdWZmZXJVcGRhdGVcIiwgZS5TRUVLX0NPTVBMRVRFRCA9IFwiUGxheWVyU2Vla0NvbXBsZXRlZFwiLCBlLlNFU1NJT05fREFUQSA9IFwiUGxheWVyU2Vzc2lvbkRhdGFcIiwgZS5TVEFURV9DSEFOR0VEID0gXCJQbGF5ZXJTdGF0ZUNoYW5nZWRcIiwgZS5XT1JLRVJfRVJST1IgPSBcIlBsYXllcldvcmtlckVycm9yXCIsIGUuTUVUQURBVEEgPSBcIlBsYXllck1ldGFkYXRhXCIsIGUuVEVYVF9DVUUgPSBcIlBsYXllclRleHRDdWVcIiwgZS5URVhUX01FVEFEQVRBX0NVRSA9IFwiUGxheWVyVGV4dE1ldGFkYXRhQ3VlXCIsIGUuQURfQ1VFID0gXCJQbGF5ZXJBZEN1ZVwiLCBlLlNUUkVBTV9TT1VSQ0VfQ1VFID0gXCJQbGF5ZXJTdHJlYW1Tb3VyY2VDdWVcIiwgZS5ORVRXT1JLX1VOQVZBSUxBQkxFID0gXCJQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGVcIiwgZS5TRUdNRU5UX0RJU0NPTlRJTlVJVFkgPSBcIlBsYXllclNlZ21lbnREaXNjb250aW51aXR5XCIsIGUuU0VHTUVOVF9NRVRBREFUQSA9IFwiUGxheWVyU2VnbWVudE1ldGFkYXRhXCI7XG4gICAgfShDIHx8IChDID0ge30pKTtcbiAgICB2YXIgTyA9IG51bGwsIE4gPSBudWxsO1xuICAgIHZhciBVID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgICAgICB2YXIgdCA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmJhdHRlcnlNYW5hZ2VyID0gdm9pZCAwLCB0aGlzLnByb2Nlc3NvciA9IHRoaXMucHJvY2Vzc29yLmJpbmQodGhpcyksIGUuaXNTdXBwb3J0ZWQoKSAmJiB3aW5kb3cubmF2aWdhdG9yLmdldEJhdHRlcnkoKS50aGVuKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICB0LmJhdHRlcnlNYW5hZ2VyID0gZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93ICYmIHdpbmRvdy5uYXZpZ2F0b3IgJiYgISF3aW5kb3cubmF2aWdhdG9yLmdldEJhdHRlcnk7XG4gICAgICAgIH0sIGUucHJvdG90eXBlLnByb2Nlc3NvciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gZS50eXBlID09PSBDLkFOQUxZVElDU19FVkVOVCwgaSA9IGUuYXJnICYmIFwibWludXRlLXdhdGNoZWRcIiA9PT0gZS5hcmcubmFtZTtcbiAgICAgICAgICAgIHJldHVybiB0ICYmIGkgJiYgdGhpcy5iYXR0ZXJ5TWFuYWdlciAmJiAoZS5hcmcucHJvcGVydGllcy5iYXR0ZXJ5X3BlcmNlbnQgPSB0aGlzLmJhdHRlcnlNYW5hZ2VyLmxldmVsKSwgZTtcbiAgICAgICAgfSwgZTtcbiAgICB9KCk7XG4gICAgdmFyIEgsIEYsIEcsIGosIFcgPSB7XG4gICAgICAgIGtleVN5c3RlbTogXCJvcmcudzMuY2xlYXJrZXlcIixcbiAgICAgICAgdXVpZDogXCIxMDc3ZWZlYy1jMGIyLTRkMDItYWNlMy0zYzFlNTJlMmZiNGJcIlxuICAgIH0sIEsgPSB7XG4gICAgICAgIGtleVN5c3RlbTogXCJjb20uYXBwbGUuZnBzLjJfMFwiLFxuICAgICAgICBjZXJ0VXJsOiBcImh0dHBzOi8vZnAta2V5b3MtdHdpdGNoLmxpY2Vuc2VrZXlzZXJ2ZXIuY29tL2NlcnQvYTE3ZmQzM2QzODQzZGY5YjE3Njc5Y2NmNTBhNDE5YjIuZGVyXCIsXG4gICAgICAgIGxpY2Vuc2VVcmw6IFwiaHR0cHM6Ly9mcC1rZXlvcy10d2l0Y2gubGljZW5zZWtleXNlcnZlci5jb20vZ2V0a2V5XCIsXG4gICAgICAgIHV1aWQ6IFwiOTRDRTg2RkItMDdGRi00RjQzLUFEQjgtOTNEMkZBOTY4Q0EyXCJcbiAgICB9LCBxID0ge1xuICAgICAgICBrZXlTeXN0ZW06IFwiY29tLm1pY3Jvc29mdC5wbGF5cmVhZHlcIixcbiAgICAgICAgbGljZW5zZVVybDogXCJodHRwczovL3ByLWtleW9zLXR3aXRjaC5saWNlbnNla2V5c2VydmVyLmNvbS9jb3JlL3JpZ2h0c21hbmFnZXIuYXNteFwiLFxuICAgICAgICB1dWlkOiBcIjlhMDRmMDc5LTk4NDAtNDI4Ni1hYjkyLWU2NWJlMDg4NWY5NVwiXG4gICAgfSwgUSA9IHtcbiAgICAgICAga2V5U3lzdGVtOiBcImNvbS53aWRldmluZS5hbHBoYVwiLFxuICAgICAgICBsaWNlbnNlVXJsOiBcImh0dHBzOi8vd3Yta2V5b3MtdHdpdGNoLmxpY2Vuc2VrZXlzZXJ2ZXIuY29tXCIsXG4gICAgICAgIHV1aWQ6IFwiZWRlZjhiYTktNzlkNi00YWNlLWEzYzgtMjdkY2Q1MWQyMWVkXCJcbiAgICB9LCBZID0ge1xuICAgICAgICBDTEVBUktFWTogVyxcbiAgICAgICAgRkFJUlBMQVk6IEssXG4gICAgICAgIFBMQVlSRUFEWTogcSxcbiAgICAgICAgV0lERVZJTkU6IFFcbiAgICB9LCB6ID0ge1xuICAgICAgICBcImNvbS53aWRldmluZS5hbHBoYVwiOiBRLFxuICAgICAgICBcImNvbS5taWNyb3NvZnQucGxheXJlYWR5XCI6IHEsXG4gICAgICAgIFwiY29tLmFwcGxlLmZwcy4yXzBcIjogSyxcbiAgICAgICAgXCJvcmcudzMuY2xlYXJrZXlcIjogV1xuICAgIH0sIFggPSB7XG4gICAgICAgIHZhbHVlOiA0LFxuICAgICAgICBtZXNzYWdlOiBcIllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGFueSBEUk0gQ29udGVudCBEZWNyeXB0aW9uIE1vZHVsZXNcIlxuICAgIH0sIEogPSB7XG4gICAgICAgIHZhbHVlOiA0LFxuICAgICAgICBtZXNzYWdlOiBcIlRoZXJlIHdhcyBhbiBpc3N1ZSB3aGlsZSB1cGRhdGluZyBEUk0gTGljZW5zZVwiXG4gICAgfSwgWiA9IHtcbiAgICAgICAgdmFsdWU6IDIsXG4gICAgICAgIG1lc3NhZ2U6IFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBEUk0gbGljZW5zZVwiXG4gICAgfSwgJCA9IHtcbiAgICAgICAgdmFsdWU6IDQsXG4gICAgICAgIG1lc3NhZ2U6IFwiRXJyb3IgY3JlYXRpbmcga2V5IHNlc3Npb25cIlxuICAgIH0sIGVlID0ge1xuICAgICAgICB2YWx1ZTogNCxcbiAgICAgICAgbWVzc2FnZTogXCJFbmNyeXB0aW9uIGtleSBub3QgdXNhYmxlIGJlY2F1c2Ugb2YgaW50ZXJuYWwgZXJyb3IgaW4gQ0RNXCJcbiAgICB9LCB0ZSA9IHtcbiAgICAgICAgdmFsdWU6IDQsXG4gICAgICAgIG1lc3NhZ2U6IFwiVW5hYmxlIHRvIGZpbmQgdmFsaWQgQ0RNIHN1cHBvcnQgb24gbWVkaWFcIlxuICAgIH0sIGllID0ge1xuICAgICAgICB2YWx1ZTogMixcbiAgICAgICAgbWVzc2FnZTogXCJSZXF1ZXN0IGZvciBBdXRoWE1MIGZhaWxlZFwiXG4gICAgfSwgbmUgPSB7XG4gICAgICAgIHZhbHVlOiAyLFxuICAgICAgICBtZXNzYWdlOiBcIlJlcXVlc3QgZm9yIERSTSBjZXJ0aWZpY2F0ZSBmYWlsZWRcIlxuICAgIH07XG4gICAgIWZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZS5JRDMgPSBcIk1ldGFJRDNcIiwgZS5DQVBUSU9OID0gXCJNZXRhQ2FwdGlvblwiO1xuICAgIH0oSCB8fCAoSCA9IHt9KSksIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZS5NRVRBREFUQV9JRCA9IFwibWV0YWRhdGEubGl2ZS12aWRlby5uZXRcIiwgZS5JTkJBTkRfTUVUQURBVEFfSUQgPSBcImluYmFuZC5tZXRhZGF0YS5saXZlLXZpZGVvLm5ldFwiO1xuICAgIH0oRiB8fCAoRiA9IHt9KSksIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZS5BVkFJTEFCTEUgPSBcIlJlbW90ZVBsYXllckF2YWlsYWJsZVwiLCBlLlVOQVZBSUxBQkxFID0gXCJSZW1vdGVQbGF5ZXJVbmF2YWlsYWJsZVwiLCBlLlNFU1NJT05fU1RBUlRFRCA9IFwiUmVtb3RlUGxheWVyU2Vzc2lvblN0YXJ0ZWRcIiwgZS5TRVNTSU9OX0VOREVEID0gXCJSZW1vdGVQbGF5ZXJTZXNzaW9uRW5kZWRcIjtcbiAgICB9KEcgfHwgKEcgPSB7fSkpLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIGUuSURMRSA9IFwiSWRsZVwiLCBlLlJFQURZID0gXCJSZWFkeVwiLCBlLkJVRkZFUklORyA9IFwiQnVmZmVyaW5nXCIsIGUuUExBWUlORyA9IFwiUGxheWluZ1wiLCBlLkVOREVEID0gXCJFbmRlZFwiO1xuICAgIH0oaiB8fCAoaiA9IHt9KSk7XG4gICAgdmFyIHBlID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKSwgZ2UgPSBlLm4ocGUpLCB5ZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKSwgRWUgPSBlLm4oeWUpO1xuICAgIHZhciBDZSwgUGUgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGluaXREYXRhVHlwZXM6IFtcbiAgICAgICAgICAgICAgICBcImNlbmNcIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGF1ZGlvQ2FwYWJpbGl0aWVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogJ2F1ZGlvL21wNDtjb2RlY3M9XCJtcDRhLjQwLjJcIidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgdmlkZW9DYXBhYmlsaXRpZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJvYnVzdG5lc3M6IFwiU1dfU0VDVVJFX0NSWVBUT1wiLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogJ3ZpZGVvL21wNDtjb2RlY3M9XCJhdmMxLjQyRTAxRVwiJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIF0sIEFlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlID0gZnVuY3Rpb24gZShlKSB7XG4gICAgICAgICAgICB2YXIgdCA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLnZpZGVvID0gdm9pZCAwLCB0aGlzLmxpc3RlbmVyID0gdm9pZCAwLCB0aGlzLmNkbVN1cHBvcnQgPSB2b2lkIDAsIHRoaXMuc2VsZWN0ZWRDRE0gPSB2b2lkIDAsIHRoaXMubWVkaWFLZXlzID0gdm9pZCAwLCB0aGlzLnBlbmRpbmdTZXNzaW9ucyA9IHZvaWQgMCwgdGhpcy5zZXNzaW9ucyA9IHZvaWQgMCwgdGhpcy5hdXRoWG1sID0gdm9pZCAwLCB0aGlzLnZpZGVvID0gZS52aWRlbywgdGhpcy5saXN0ZW5lciA9IGUubGlzdGVuZXIsIHRoaXMuY2RtU3VwcG9ydCA9IG51bGwsIHRoaXMuc2VsZWN0ZWRDRE0gPSBudWxsLCB0aGlzLm1lZGlhS2V5cyA9IHZvaWQgMCwgdGhpcy5wZW5kaW5nU2Vzc2lvbnMgPSBbXSwgdGhpcy5yZXNldCgpLCB0aGlzLnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoXCJlbmNyeXB0ZWRcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0LmhhbmRsZUVuY3J5cHRlZChlKTtcbiAgICAgICAgICAgIH0pLCB0aGlzLnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoXCJ3ZWJraXRuZWVka2V5XCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5oYW5kbGVXZWJLaXRFbmNyeXB0ZWQoZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHQgPSBlLnByb3RvdHlwZTtcbiAgICAgICAgcmV0dXJuIHQuY29uZmlndXJlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmF1dGhYbWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBVUkwoZSksIG4gPSBpLnBhdGhuYW1lLnNwbGl0KFwiL1wiKSwgciA9IG5bbi5sZW5ndGggLSAxXS5zcGxpdChcIi5cIilbMF0sIG8gPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IFVSTChlKS5zZWFyY2hQYXJhbXMsIGkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpW3ZlKHQpXSA9IGUgPyB2ZShlKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pLCBpO1xuICAgICAgICAgICAgICAgIH0oZSksIHMgPSBvLnRva2VuLCBhID0gby5zaWcsIHUgPSBcImh0dHBzOi8vXCIgKyBpLmhvc3QgKyBcIi9hcGkvYXV0aHhtbC9cIiArIHIgKyBcIj90b2tlbj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChzKSArIFwiJnNpZz1cIiArIGE7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRoWG1sID0gY2UodSwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHQuaGFuZGxlRXJyb3IoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBlXG4gICAgICAgICAgICAgICAgICAgIH0sIGllKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHQucmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aFhtbCA9IG51bGwsIHRoaXMuc2Vzc2lvbnMgPSBbXTtcbiAgICAgICAgfSwgdC5pc1Byb3RlY3RlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IHRoaXMuYXV0aFhtbDtcbiAgICAgICAgfSwgdC5oYW5kbGVFcnJvciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIub25TaW5rRXJyb3Ioe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBlLnZhbHVlIHx8IDQsXG4gICAgICAgICAgICAgICAgY29kZTogZS5jb2RlIHx8IDAsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlIHx8IFwiXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB0Lmhhc1Nlc3Npb24gPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBpZiAoIWUpIHJldHVybiAhMTtcbiAgICAgICAgICAgIGZvcih2YXIgdCwgaSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBlW1N5bWJvbC5pdGVyYXRvcl0gfHwgZVtcIkBAaXRlcmF0b3JcIl07XG4gICAgICAgICAgICAgICAgaWYgKGkpIHJldHVybiAoaSA9IGkuY2FsbChlKSkubmV4dC5iaW5kKGkpO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpIHx8IChpID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIGUpIHJldHVybiBUZShlLCB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIk9iamVjdFwiID09PSBpICYmIGUuY29uc3RydWN0b3IgJiYgKGkgPSBlLmNvbnN0cnVjdG9yLm5hbWUpLCBcIk1hcFwiID09PSBpIHx8IFwiU2V0XCIgPT09IGkgPyBBcnJheS5mcm9tKGUpIDogXCJBcmd1bWVudHNcIiA9PT0gaSB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChpKSA/IFRlKGUsIHQpIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfShlKSkgfHwgdCAmJiBlICYmIFwibnVtYmVyXCIgPT0gdHlwZW9mIGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGkgJiYgKGUgPSBpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAwO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA+PSBlLmxlbmd0aCA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZVtuKytdXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG4gICAgICAgICAgICB9KHRoaXMuc2Vzc2lvbnMpOyAhKHQgPSBpKCkpLmRvbmU7KXtcbiAgICAgICAgICAgICAgICB2YXIgbiA9IHQudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKG4uaW5pdERhdGEgJiYgc2Uobi5pbml0RGF0YSwgZSkpIHJldHVybiAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfSwgdC5jcmVhdGVLZXlTeXN0ZW1TdXBwb3J0Q2hhaW4gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChudWxsID09PSB0aGlzLmNkbVN1cHBvcnQgfHwgMCA9PT0gdGhpcy5jZG1TdXBwb3J0Lmxlbmd0aCkgcmV0dXJuIFByb21pc2UucmVqZWN0KHRlKTtcbiAgICAgICAgICAgIHZhciBlID0gUHJvbWlzZS5yZWplY3QoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNkbVN1cHBvcnQuZm9yRWFjaChmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgZSA9IGUuY2F0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3IucmVxdWVzdE1lZGlhS2V5U3lzdGVtQWNjZXNzKHQua2V5U3lzdGVtLCBQZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSwgZSA9IGUuY2F0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIHQuaGFuZGxlRW5jcnlwdGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZSA9IGdlKCkoRWUoKS5tYXJrKGZ1bmN0aW9uIGUodCkge1xuICAgICAgICAgICAgICAgIHZhciBpLCBuO1xuICAgICAgICAgICAgICAgIHJldHVybiBFZSgpLndyYXAoZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IoOzspc3dpdGNoKGUucHJldiA9IGUubmV4dCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1Nlc3Npb24odC5pbml0RGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFicnVwdChcInJldHVyblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXNzaW9ucy5wdXNoKHQpLCBcInNpbmZcIiAhPT0gdC5pbml0RGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVdlYktpdEVuY3J5cHRlZCh0KSwgZS5hYnJ1cHQoXCJyZXR1cm5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IHRoaXMuY2RtU3VwcG9ydCAmJiAodGhpcy5jZG1TdXBwb3J0ID0gdWUodC5pbml0RGF0YSkpLCB2b2lkIDAgIT09IHRoaXMubWVkaWFLZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDI0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVkaWFLZXlzID0gbnVsbCwgZS5wcmV2ID0gOSwgZS5uZXh0ID0gMTIsIHRoaXMuY3JlYXRlS2V5U3lzdGVtU3VwcG9ydENoYWluKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpID0gZS5zZW50LCB0aGlzLnNlbGVjdGVkQ0RNID0geltpLmtleVN5c3RlbV0sIGUubmV4dCA9IDE2LCBpLmNyZWF0ZU1lZGlhS2V5cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA9IGUuc2VudCwgZS5uZXh0ID0gMTksIHRoaXMuc2V0TWVkaWFLZXlzKG4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSAyNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ID0gMjEsIGUudDAgPSBlLmNhdGNoKDkpLCB0aGlzLmhhbmRsZUVycm9yKGUudDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFNlc3Npb24odCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGUsIHRoaXMsIFtcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgOSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDIxXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0oKSwgdC5zZXRNZWRpYUtleXMgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZWRpYUtleXMgPSBlLCB0aGlzLnBlbmRpbmdTZXNzaW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5jcmVhdGVTZXNzaW9uUmVxdWVzdChlKS5jYXRjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdC5oYW5kbGVFcnJvcigkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLCB0aGlzLnBlbmRpbmdTZXNzaW9ucyA9IFtdLCB0aGlzLnZpZGVvLnNldE1lZGlhS2V5cyh0aGlzLm1lZGlhS2V5cyk7XG4gICAgICAgIH0sIHQuYWRkU2Vzc2lvbiA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMubWVkaWFLZXlzID8gdGhpcy5jcmVhdGVTZXNzaW9uUmVxdWVzdChlKS5jYXRjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB0LmhhbmRsZUVycm9yKCQpO1xuICAgICAgICAgICAgfSkgOiB0aGlzLnBlbmRpbmdTZXNzaW9ucy5wdXNoKGUpO1xuICAgICAgICB9LCB0LmNyZWF0ZVNlc3Npb25SZXF1ZXN0ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQsIGkgPSB0aGlzLCBuID0gZS5pbml0RGF0YVR5cGUsIHIgPSBlLmluaXREYXRhLCBvID0gbnVsbCA9PSAodCA9IHRoaXMubWVkaWFLZXlzKSA/IHZvaWQgMCA6IHQuY3JlYXRlU2Vzc2lvbigpO1xuICAgICAgICAgICAgcmV0dXJuIG8gPyAoby5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkuaGFuZGxlTWVzc2FnZShlKTtcbiAgICAgICAgICAgIH0pLCBvLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlzdGF0dXNlc2NoYW5nZVwiLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkuaGFuZGxlS2V5U3RhdHVzZXNDaGFuZ2UoZSwgcik7XG4gICAgICAgICAgICB9KSwgby5nZW5lcmF0ZVJlcXVlc3QobiwgcikpIDogUHJvbWlzZS5yZWplY3QoKTtcbiAgICAgICAgfSwgdC5oYW5kbGVLZXlTdGF0dXNlc0NoYW5nZSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgIHZhciBpID0gdGhpcywgbiA9IGUudGFyZ2V0LCByID0gITE7XG4gICAgICAgICAgICBuLmtleVN0YXR1c2VzLmZvckVhY2goZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaChlKXtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImV4cGlyZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAhMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaW50ZXJuYWwtZXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGkuaGFuZGxlRXJyb3IoZWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLCByICYmIG4uY2xvc2UoKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpLnJlbW92ZVNlc3Npb24odCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdC5yZW1vdmVTZXNzaW9uID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgZm9yKHZhciB0ID0gMDsgdCA8IHRoaXMuc2Vzc2lvbnMubGVuZ3RoOyB0KyspaWYgKHRoaXMuc2Vzc2lvbnNbdF0uaW5pdERhdGEgPT09IGUpIHJldHVybiB2b2lkIHRoaXMuc2Vzc2lvbnMuc3BsaWNlKHQsIDEpO1xuICAgICAgICB9LCB0LmhhbmRsZU1lc3NhZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlID0gZ2UoKShFZSgpLm1hcmsoZnVuY3Rpb24gZSh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGksIG4sIHIgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHJldHVybiBFZSgpLndyYXAoZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IoOzspc3dpdGNoKGUucHJldiA9IGUubmV4dCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPSB0LnRhcmdldCwgZS5uZXh0ID0gMywgdGhpcy5nZW5lcmF0ZUxpY2Vuc2UodC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobiA9IGUuc2VudCkgJiYgaS51cGRhdGUobikuY2F0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaGFuZGxlRXJyb3IoSik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgZSwgdGhpcyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KCksIHQuZ2VuZXJhdGVMaWNlbnNlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZSA9IGdlKCkoRWUoKS5tYXJrKGZ1bmN0aW9uIGUodCkge1xuICAgICAgICAgICAgICAgIHZhciBpLCBuLCByLCBvO1xuICAgICAgICAgICAgICAgIHJldHVybiBFZSgpLndyYXAoZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IoOzspc3dpdGNoKGUucHJldiA9IGUubmV4dCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDRE0gIT09IFkuQ0xFQVJLRVkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gNztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpID0gSlNPTi5wYXJzZSgobmV3IFRleHREZWNvZGVyKS5kZWNvZGUodCkpLCBuID0gaS5raWRzLm1hcChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdHk6IFwib2N0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGc6IFwiQTEyOEtXXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraWQ6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrOiBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIgPSAobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiBuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBlLmFicnVwdChcInJldHVyblwiLCBQcm9taXNlLnJlc29sdmUocikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5hdXRoWG1sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubmV4dCA9IDEwLCB0aGlzLmF1dGhYbWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvID0gZS5zZW50LCBlLmFicnVwdChcInJldHVyblwiLCB0aGlzLnJlcXVlc3RMaWNlbnNlKHQsIG8pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihpZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGUsIHRoaXMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSgpLCB0LnJlcXVlc3RMaWNlbnNlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZSA9IGdlKCkoRWUoKS5tYXJrKGZ1bmN0aW9uIGUodCwgaSkge1xuICAgICAgICAgICAgICAgIHZhciBuLCByLCBvLCBzID0gdGhpcztcbiAgICAgICAgICAgICAgICByZXR1cm4gRWUoKS53cmFwKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yKDs7KXN3aXRjaChlLnByZXYgPSBlLm5leHQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYXJyYXlidWZmZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tZGF0YTogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2VsZWN0ZWRDRE0gPT09IFkuUExBWVJFQURZICYmIChvID0gYmUodCksIHIuYm9keSA9IG8uYm9keSwgci5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbihyLmhlYWRlcnMsIG8uaGVhZGVycykpLCBlLmFicnVwdChcInJldHVyblwiLCBjZSgobnVsbCA9PSAobiA9IHRoaXMuc2VsZWN0ZWRDRE0pID8gdm9pZCAwIDogbi5saWNlbnNlVXJsKSB8fCBcIlwiLCByKS5jYXRjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5oYW5kbGVFcnJvcihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IHN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBaKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGUsIHRoaXMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSgpLCB0LmhhbmRsZVdlYktpdEVuY3J5cHRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGUgPSBnZSgpKEVlKCkubWFyayhmdW5jdGlvbiBlKHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSwgbiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVlKCkud3JhcChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcig7Oylzd2l0Y2goZS5wcmV2ID0gZS5uZXh0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENETSA9IFkuRkFJUlBMQVksIGUucHJldiA9IDEsIGUubmV4dCA9IDQsIGNlKFkuRkFJUlBMQVkuY2VydFVybCB8fCBcIlwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImFycmF5YnVmZmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByYWdtYTogXCJDYWNoZS1Db250cm9sOiBuby1jYWNoZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDYWNoZS1Db250cm9sXCI6IFwibWF4LWFnZT0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlLnNlbnQsIHRoaXMuc2V0dXBXZWJLaXRNZWRpYUtleXModCwgaSkuY2F0Y2goZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5oYW5kbGVFcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZS5uZXh0ID0gMTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ID0gOCwgZS50MCA9IGUuY2F0Y2goMSksIHRoaXMuaGFuZGxlRXJyb3IoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IGUudDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBlLCB0aGlzLCBbXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICA4XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0oKSwgdC5zZXR1cFdlYktpdE1lZGlhS2V5cyA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgIHZhciBpID0gdGhpcztcbiAgICAgICAgICAgIGlmICghZS5pbml0RGF0YSkgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiTWlzc2luZyBpbml0RGF0YSBvbiBNZWRpYUVuY3J5cHRlZEV2ZW50XCIpO1xuICAgICAgICAgICAgdGhpcy52aWRlby53ZWJraXRLZXlzIHx8IHRoaXMudmlkZW8ud2Via2l0U2V0TWVkaWFLZXlzKG5ldyB3aW5kb3cuV2ViS2l0TWVkaWFLZXlzKFkuRkFJUlBMQVkua2V5U3lzdGVtKSk7XG4gICAgICAgICAgICB2YXIgbiA9IGRlKGUuaW5pdERhdGEpLCByID0gdGhpcy52aWRlby53ZWJraXRLZXlzLmNyZWF0ZVNlc3Npb24oXCJ2aWRlby9tcDRcIiwgZS5pbml0RGF0YSk7XG4gICAgICAgICAgICByZXR1cm4gci5jb250ZW50SWQgPSBuLCBuZXcgUHJvbWlzZShmdW5jdGlvbihlLCBvKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkudmlkZW8ud2Via2l0S2V5cyB8fCBvKFwiSXNzdWUgc2V0dGluZyBmYWlycGxheSBtZWRpYSBrZXlzXCIpLCAhcikgcmV0dXJuIG8oXCJDb3VsZCBub3QgY3JlYXRlIGtleSBzZXNzaW9uXCIpO1xuICAgICAgICAgICAgICAgIHIuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmtpdGtleW1lc3NhZ2VcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBcImNlcnRpZmljYXRlXCIgPT09IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgZS5tZXNzYWdlKSA/IHIudXBkYXRlKG5ldyBVaW50OEFycmF5KHQpKSA6IGkuZ2V0V2Via2l0TGljZW5zZShlLm1lc3NhZ2UsIG4pLnRoZW4oZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8kdCA9IGUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgXCI8Y2tjPlwiID09PSBfJHQuc3Vic3RyKDAsIDUpICYmIFwiPC9ja2M+XCIgPT09IF8kdC5zdWJzdHIoLTYpICYmIChfJHQgPSBfJHQuc2xpY2UoNSwgLTYpKSwgci51cGRhdGUobWUoXyR0KSk7XG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKG8pO1xuICAgICAgICAgICAgICAgIH0pLCByLmFkZEV2ZW50TGlzdGVuZXIoXCJ3ZWJraXRrZXlhZGRlZFwiLCBlKSwgci5hZGRFdmVudExpc3RlbmVyKFwid2Via2l0a2V5ZXJyb3JcIiwgbyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdC5nZXRXZWJraXRMaWNlbnNlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXV0aFhtbCA/IHRoaXMuYXV0aFhtbC50aGVuKGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbjtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2UoWS5GQUlSUExBWS5saWNlbnNlVXJsIHx8IFwiXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICAgICAgYm9keTogXCJzcGM9XCIgKyAobiA9IGUsIGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDE2QXJyYXkobikpKSArIFwiJmFzc2V0SWQ9XCIpICsgdCxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWRhdGE6IGlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogZVxuICAgICAgICAgICAgICAgICAgICB9LCBaKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSA6IFByb21pc2UucmVqZWN0KGllKTtcbiAgICAgICAgfSwgZTtcbiAgICB9KCksIE1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNMb29zZVwiKSwgRGUgPSBlLm4oTWUpLCBSZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uIGUoKSB7fTtcbiAgICAgICAgdmFyIHQgPSBlLnByb3RvdHlwZTtcbiAgICAgICAgcmV0dXJuIHQuYWRkVHJhY2sgPSBmdW5jdGlvbihlKSB7fSwgdC5idWZmZXJEdXJhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0sIHQuYnVmZmVyZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgICAgICAgZW5kOiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCB0LmdldEJ1ZmZlcmVkUmFuZ2VzID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9LCB0LmNhcHR1cmVHZXN0dXJlID0gZnVuY3Rpb24oKSB7fSwgdC5jb25maWd1cmUgPSBmdW5jdGlvbihlKSB7fSwgdC5kZWNvZGVkRnJhbWVzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSwgdC5kZWxldGUgPSBmdW5jdGlvbigpIHt9LCB0LmRyb3BwZWRGcmFtZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9LCB0LmVuZE9mU3RyZWFtID0gZnVuY3Rpb24oKSB7fSwgdC5lbnF1ZXVlID0gZnVuY3Rpb24oZSkge30sIHQuZnJhbWVyYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSwgdC5nZXRDdXJyZW50VGltZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0sIHQuZ2V0RGlzcGxheUhlaWdodCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0sIHQuZ2V0RGlzcGxheVdpZHRoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSwgdC5nZXRQbGF5YmFja1JhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9LCB0LmdldFZvbHVtZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0sIHQuaW52b2tlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpc1tlLm5hbWVdLmNhbGwodGhpcywgZS5hcmcpO1xuICAgICAgICB9LCB0LmlzTXV0ZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfSwgdC5vblNvdXJjZUR1cmF0aW9uQ2hhbmdlZCA9IGZ1bmN0aW9uKGUpIHt9LCB0LnBhdXNlID0gZnVuY3Rpb24oKSB7fSwgdC5wbGF5ID0gZnVuY3Rpb24oKSB7fSwgdC5yZWluaXQgPSBmdW5jdGlvbigpIHt9LCB0LnJlbW92ZSA9IGZ1bmN0aW9uKGUpIHt9LCB0LnNlZWtUbyA9IGZ1bmN0aW9uKGUpIHt9LCB0LnNldE11dGVkID0gZnVuY3Rpb24oZSkge30sIHQuc2V0UGxheWJhY2tSYXRlID0gZnVuY3Rpb24oZSkge30sIHQuc2V0VGltZXN0YW1wT2Zmc2V0ID0gZnVuY3Rpb24oZSkge30sIHQuc2V0Vm9sdW1lID0gZnVuY3Rpb24oZSkge30sIHQuY2hhbmdlU3JjID0gZnVuY3Rpb24oZSkge30sIHQuY2hhbmdlU3JjT2JqID0gZnVuY3Rpb24oZSkge30sIHQub25TZWdtZW50RGlzY29udGludWl0eSA9IGZ1bmN0aW9uKCkge30sIGU7XG4gICAgfSgpLCBMZSA9IFwicGMtY2hyb21lY2FzdC1zZW5kZXJcIiwgd2UgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgICAgICAgdmFyIG47XG4gICAgICAgICAgICByZXR1cm4gKG4gPSB0LmNhbGwodGhpcykgfHwgdGhpcykucmVtb3RlUGxheWVyID0gdm9pZCAwLCBuLnJlbW90ZVBsYXllckNvbnRyb2xsZXIgPSB2b2lkIDAsIG4ubGlzdGVuZXIgPSB2b2lkIDAsIG4uc2Vla1RpbWUgPSB2b2lkIDAsIG4uY3VycmVudER1cmF0aW9uID0gdm9pZCAwLCBuLmxpc3RlbmVyID0gZSwgbi5jdXJyZW50RHVyYXRpb24gPSAwLCBpLnByZXBhcmVDYXN0Q29udGV4dCgpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgbi5yZW1vdGVQbGF5ZXIgPSBuZXcgY2FzdC5mcmFtZXdvcmsuUmVtb3RlUGxheWVyLCBuLnJlbW90ZVBsYXllckNvbnRyb2xsZXIgPSBuZXcgY2FzdC5mcmFtZXdvcmsuUmVtb3RlUGxheWVyQ29udHJvbGxlcihuLnJlbW90ZVBsYXllcik7XG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBuLmxpc3RlbmVyLm9uU2Vzc2lvbkVycm9yKCk7XG4gICAgICAgICAgICB9KSwgbjtcbiAgICAgICAgfVxuICAgICAgICBEZSgpKGksIHQpLCBpLmNhbkNhc3QgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBJKCkuY2hyb21lO1xuICAgICAgICB9LCBpLnN0b3BMb29raW5nRm9yUmVtb3RlUGxheWJhY2tEZXZpY2VzID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgd2luZG93LmNhc3QgJiYgd2luZG93LmNhc3QuZnJhbWV3b3JrICYmIGNhc3QuZnJhbWV3b3JrLkNhc3RDb250ZXh0LmdldEluc3RhbmNlKCkucmVtb3ZlRXZlbnRMaXN0ZW5lcihjYXN0LmZyYW1ld29yay5DYXN0Q29udGV4dEV2ZW50VHlwZS5DQVNUX1NUQVRFX0NIQU5HRUQsIGUpO1xuICAgICAgICB9LCBpLmxvb2tGb3JSZW1vdGVQbGF5YmFja0RldmljZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlID0gZ2UoKShFZSgpLm1hcmsoZnVuY3Rpb24gZSh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIG4sIHI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVlKCkud3JhcChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcig7Oylzd2l0Y2goZS5wcmV2ID0gZS5uZXh0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wcmV2ID0gMCwgZS5uZXh0ID0gMywgaS5wcmVwYXJlQ2FzdENvbnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA9IGUuc2VudCwgciA9IGZ1bmN0aW9uIHIoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZS5jYXN0U3RhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBjYXN0LmZyYW1ld29yay5DYXN0U3RhdGUuTk9fREVWSUNFU19BVkFJTEFCTEU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGNhc3QuZnJhbWV3b3JrLkNhc3RTdGF0ZS5OT1RfQ09OTkVDVEVEOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQub25SZW1vdGVEZXZpY2UoITApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBjYXN0LmZyYW1ld29yay5DYXN0U3RhdGUuQ09OTkVDVEVEOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfJGkgPSBuLmdldEN1cnJlbnRTZXNzaW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyRpICYmIF8kaS5nZXRTZXNzaW9uU3RhdGUoKSA9PT0gY2FzdC5mcmFtZXdvcmsuU2Vzc2lvblN0YXRlLlNFU1NJT05fUkVTVU1FRCAmJiB0Lm9uUmVtb3RlUmVjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmFkZEV2ZW50TGlzdGVuZXIoY2FzdC5mcmFtZXdvcmsuQ2FzdENvbnRleHRFdmVudFR5cGUuQ0FTVF9TVEFURV9DSEFOR0VELCByKSwgbi5zZXRPcHRpb25zKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJBcHBsaWNhdGlvbklkOiBcIkIzRENGOTY4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Kb2luUG9saWN5OiBjaHJvbWUuY2FzdC5BdXRvSm9pblBvbGljeS5UQUJfQU5EX09SSUdJTl9TQ09QRURcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZS5hYnJ1cHQoXCJyZXR1cm5cIiwgcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldiA9IDEwLCBlLnQwID0gZS5jYXRjaCgwKSwgdC5vblJlbW90ZURldmljZSghMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGUsIG51bGwsIFtcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0oKSwgaS5wcmVwYXJlQ2FzdENvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBfJHQgPSBnZSgpKEVlKCkubWFyayhmdW5jdGlvbiB0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBFZSgpLndyYXAoZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IoOzspc3dpdGNoKHQucHJldiA9IHQubmV4dCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuY2FzdCB8fCAhd2luZG93LmNhc3QuZnJhbWV3b3JrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hYnJ1cHQoXCJyZXR1cm5cIiwgUHJvbWlzZS5yZXNvbHZlKGNhc3QuZnJhbWV3b3JrLkNhc3RDb250ZXh0LmdldEluc3RhbmNlKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hYnJ1cHQoXCJyZXR1cm5cIiwgbmV3IFByb21pc2UoZnVuY3Rpb24odCwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5nLl9fb25HQ2FzdEFwaUF2YWlsYWJsZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPyB0KGNhc3QuZnJhbWV3b3JrLkNhc3RDb250ZXh0LmdldEluc3RhbmNlKCkpIDogaSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoTGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmlkID0gTGUsIG4ub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobiksIGUuZy5fX29uR0Nhc3RBcGlBdmFpbGFibGUgPSBmdW5jdGlvbigpIHt9LCBpKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmFzeW5jID0gITAsIG4uc3JjID0gXCJodHRwczovL3d3dy5nc3RhdGljLmNvbS9jdi9qcy9zZW5kZXIvdjEvY2FzdF9zZW5kZXIuanM/bG9hZENhc3RGcmFtZXdvcms9MVwiLCBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfJHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0oKTtcbiAgICAgICAgdmFyIG4gPSBpLnByb3RvdHlwZTtcbiAgICAgICAgcmV0dXJuIG4uY29uZmlndXJlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZSA9IGdlKCkoRWUoKS5tYXJrKGZ1bmN0aW9uIGUodCkge1xuICAgICAgICAgICAgICAgIHZhciBuLCByLCBvLCBzLCBhLCB1LCBjO1xuICAgICAgICAgICAgICAgIHJldHVybiBFZSgpLndyYXAoZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IoOzspc3dpdGNoKGUucHJldiA9IGUubmV4dCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPSB0LnBhdGgsIGUucHJldiA9IDEsIGUubmV4dCA9IDQsIGkucHJlcGFyZUNhc3RDb250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPSBlLnNlbnQsIHMgPSBvLmdldEN1cnJlbnRTZXNzaW9uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMTM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uZXh0ID0gOSwgby5yZXF1ZXN0U2Vzc2lvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBvLmdldEN1cnJlbnRTZXNzaW9uKCksIHRoaXMuc2V0dXBSZW1vdGVQbGF5ZXJMaXN0ZW5lcnMocyksIGUubmV4dCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdldFNlc3Npb25TdGF0ZSgpID09PSBjYXN0LmZyYW1ld29yay5TZXNzaW9uU3RhdGUuU0VTU0lPTl9SRVNVTUVEICYmIHRoaXMuc2V0dXBSZW1vdGVQbGF5ZXJMaXN0ZW5lcnMocyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSA9IG5ldyBjaHJvbWUuY2FzdC5tZWRpYS5NZWRpYUluZm8obiwgXCJcIikpLnN0cmVhbVR5cGUgPSBjaHJvbWUuY2FzdC5tZWRpYS5TdHJlYW1UeXBlLkJVRkZFUkVELCB1ID0gbmV3IGNocm9tZS5jYXN0Lm1lZGlhLkdlbmVyaWNNZWRpYU1ldGFkYXRhLCBhLm1ldGFkYXRhID0gdSwgYS5jdXN0b21EYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFseXRpY3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocm9tZWNhc3Rfc2VuZGVyOiBcInBsYXllci1jb3JlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybTogXCJ3ZWJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5yZW1vdGVQbGF5ZXJDb250cm9sbGVyLnN0b3AoKSwgYyA9IG5ldyBjaHJvbWUuY2FzdC5tZWRpYS5Mb2FkUmVxdWVzdChhKSwgdGhpcy5zZWVrVGltZSA+IDAgJiYgKGMuY3VycmVudFRpbWUgPSB0aGlzLnNlZWtUaW1lLCB0aGlzLnNlZWtUaW1lID0gMCksIHRoaXMuY3VycmVudER1cmF0aW9uID0gMCwgZS5uZXh0ID0gMjUsIG51bGwgPT0gKHIgPSBzKSA/IHZvaWQgMCA6IHIubG9hZE1lZGlhKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSAzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucHJldiA9IDI3LCBlLnQwID0gZS5jYXRjaCgxKSwgZS5hYnJ1cHQoXCJyZXR1cm5cIiwgdGhpcy5oYW5kbGVFcnJvcihlLnQwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGUsIHRoaXMsIFtcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDI3XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0oKSwgbi5zdG9wTWVkaWEgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlID0gZ2UoKShFZSgpLm1hcmsoZnVuY3Rpb24gZSh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIG4sIHI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVlKCkud3JhcChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcig7Oylzd2l0Y2goZS5wcmV2ID0gZS5uZXh0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0ICYmICh0ID0gITApLCBlLm5leHQgPSAzLCBpLnByZXBhcmVDYXN0Q29udGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBlLnNlbnQsIChyID0gbi5nZXRDdXJyZW50U2Vzc2lvbigpKSAmJiByLmdldFNlc3Npb25TdGF0ZSgpICE9PSBjYXN0LmZyYW1ld29yay5TZXNzaW9uU3RhdGUuU0VTU0lPTl9SRVNVTUVEICYmIHIuZW5kU2Vzc2lvbih0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBlKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0oKSwgbi5pbnZva2UgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzW2UubmFtZV0uY2FsbCh0aGlzLCBlLmFyZyk7XG4gICAgICAgIH0sIG4ucGxheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdGVQbGF5ZXIgJiYgdGhpcy5yZW1vdGVQbGF5ZXIuaXNQYXVzZWQgJiYgdGhpcy5yZW1vdGVQbGF5ZXJDb250cm9sbGVyLnBsYXlPclBhdXNlKCk7XG4gICAgICAgIH0sIG4ucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3RlUGxheWVyICYmICF0aGlzLnJlbW90ZVBsYXllci5pc1BhdXNlZCAmJiB0aGlzLnJlbW90ZVBsYXllckNvbnRyb2xsZXIucGxheU9yUGF1c2UoKTtcbiAgICAgICAgfSwgbi5zZWVrVG8gPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW90ZVBsYXllciAmJiAodGhpcy5yZW1vdGVQbGF5ZXIucGxheWVyU3RhdGUgIT09IGNocm9tZS5jYXN0Lm1lZGlhLlBsYXllclN0YXRlLklETEUgPyAodGhpcy5yZW1vdGVQbGF5ZXIuY3VycmVudFRpbWUgPSBlLCB0aGlzLnJlbW90ZVBsYXllckNvbnRyb2xsZXIuc2VlaygpKSA6IHRoaXMuc2Vla1RpbWUgPSBlKTtcbiAgICAgICAgfSwgbi5nZXRDdXJyZW50VGltZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3RlUGxheWVyID8gdGhpcy5yZW1vdGVQbGF5ZXIuY3VycmVudFRpbWUgOiAwO1xuICAgICAgICB9LCBuLmRlbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdGVQbGF5ZXIgJiYgdGhpcy5zdG9wTWVkaWEoKTtcbiAgICAgICAgfSwgbi5zZXRNdXRlZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3RlUGxheWVyICYmIGUgIT09IHRoaXMucmVtb3RlUGxheWVyLmlzTXV0ZWQgJiYgdGhpcy5yZW1vdGVQbGF5ZXJDb250cm9sbGVyLm11dGVPclVubXV0ZSgpO1xuICAgICAgICB9LCBuLmlzTXV0ZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiAhIXRoaXMucmVtb3RlUGxheWVyICYmIHRoaXMucmVtb3RlUGxheWVyLmlzTXV0ZWQ7XG4gICAgICAgIH0sIG4uc2V0Vm9sdW1lID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdGVQbGF5ZXIgJiYgKHRoaXMucmVtb3RlUGxheWVyLnZvbHVtZUxldmVsID0gZSwgdGhpcy5yZW1vdGVQbGF5ZXJDb250cm9sbGVyLnNldFZvbHVtZUxldmVsKCkpO1xuICAgICAgICB9LCBuLmdldFZvbHVtZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3RlUGxheWVyID8gdGhpcy5yZW1vdGVQbGF5ZXIudm9sdW1lTGV2ZWwgOiAwO1xuICAgICAgICB9LCBuLmdldERldmljZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGUgPSBnZSgpKEVlKCkubWFyayhmdW5jdGlvbiBlKCkge1xuICAgICAgICAgICAgICAgIHZhciBfJHQsIG47XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVlKCkud3JhcChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcig7Oylzd2l0Y2goZS5wcmV2ID0gZS5uZXh0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uZXh0ID0gMiwgaS5wcmVwYXJlQ2FzdENvbnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXyR0ID0gZS5zZW50LCBuID0gXyR0LmdldEN1cnJlbnRTZXNzaW9uKCksIGUuYWJydXB0KFwicmV0dXJuXCIsIChudWxsID09IG4gPyB2b2lkIDAgOiBuLmdldENhc3REZXZpY2UoKS5mcmllbmRseU5hbWUpIHx8IFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGUpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KCksIG4uc2V0dXBSZW1vdGVQbGF5ZXJMaXN0ZW5lcnMgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgXyR0ID0gdGhpcywgXyRpID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIF8kaSA9IGdlKCkoRWUoKS5tYXJrKGZ1bmN0aW9uIGkoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuLCByO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRWUoKS53cmFwKGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcig7Oylzd2l0Y2goaS5wcmV2ID0gaS5uZXh0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuID0gZS5nZXRNZWRpYVNlc3Npb24oKSkgJiYgKHIgPSBuLm1lZGlhLCAwID09PSBfJHQuY3VycmVudER1cmF0aW9uICYmIG51bGwgPT09IHIuZHVyYXRpb24gJiYgKF8kdC5jdXJyZW50RHVyYXRpb24gPSAxIC8gMCwgXyR0Lmxpc3RlbmVyLm9uU2lua0R1cmF0aW9uQ2hhbmdlZChfJHQuY3VycmVudER1cmF0aW9uKSksIF8kdC5saXN0ZW5lci5vblNpbmtUaW1lVXBkYXRlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgaSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8kaS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KCksIG4gPSBmdW5jdGlvbiBuKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaChfJHQucmVtb3RlUGxheWVyLnBsYXllclN0YXRlKXtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBjaHJvbWUuY2FzdC5tZWRpYS5QbGF5ZXJTdGF0ZS5CVUZGRVJJTkc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfJHQubGlzdGVuZXIub25TaW5rSWRsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgY2hyb21lLmNhc3QubWVkaWEuUGxheWVyU3RhdGUuUExBWUlORzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF8kdC5saXN0ZW5lci5vblNpbmtQbGF5aW5nKCExKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGNocm9tZS5jYXN0Lm1lZGlhLlBsYXllclN0YXRlLklETEU6XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyRpID0gZS5nZXRNZWRpYVNlc3Npb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8kaSAmJiBfJGkuaWRsZVJlYXNvbiA9PT0gY2hyb21lLmNhc3QubWVkaWEuSWRsZVJlYXNvbi5GSU5JU0hFRCAmJiBfJHQubGlzdGVuZXIub25TaW5rRW5kZWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCByID0gZnVuY3Rpb24gcigpIHtcbiAgICAgICAgICAgICAgICBfJHQubGlzdGVuZXIub25TaW5rVm9sdW1lQ2hhbmdlZChfJHQucmVtb3RlUGxheWVyLnZvbHVtZUxldmVsLCAhMCk7XG4gICAgICAgICAgICB9LCBvID0gZnVuY3Rpb24gbygpIHtcbiAgICAgICAgICAgICAgICBfJHQubGlzdGVuZXIub25TaW5rTXV0ZWRDaGFuZ2VkKF8kdC5yZW1vdGVQbGF5ZXIuaXNNdXRlZCk7XG4gICAgICAgICAgICB9LCBzID0gZnVuY3Rpb24gcygpIHtcbiAgICAgICAgICAgICAgICAwICE9PSBfJHQucmVtb3RlUGxheWVyLmR1cmF0aW9uICYmIChfJHQuY3VycmVudER1cmF0aW9uID0gXyR0LnJlbW90ZVBsYXllci5kdXJhdGlvbiwgXyR0Lmxpc3RlbmVyLm9uU2lua0R1cmF0aW9uQ2hhbmdlZChfJHQuY3VycmVudER1cmF0aW9uKSk7XG4gICAgICAgICAgICB9LCBhID0gZnVuY3Rpb24gYSgpIHtcbiAgICAgICAgICAgICAgICBfJHQucmVtb3RlUGxheWVyQ29udHJvbGxlci5yZW1vdmVFdmVudExpc3RlbmVyKGNhc3QuZnJhbWV3b3JrLlJlbW90ZVBsYXllckV2ZW50VHlwZS5DVVJSRU5UX1RJTUVfQ0hBTkdFRCwgXyRpKSwgXyR0LnJlbW90ZVBsYXllckNvbnRyb2xsZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihjYXN0LmZyYW1ld29yay5SZW1vdGVQbGF5ZXJFdmVudFR5cGUuUExBWUVSX1NUQVRFX0NIQU5HRUQsIG4pLCBfJHQucmVtb3RlUGxheWVyQ29udHJvbGxlci5yZW1vdmVFdmVudExpc3RlbmVyKGNhc3QuZnJhbWV3b3JrLlJlbW90ZVBsYXllckV2ZW50VHlwZS5WT0xVTUVfTEVWRUxfQ0hBTkdFRCwgciksIF8kdC5yZW1vdGVQbGF5ZXJDb250cm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoY2FzdC5mcmFtZXdvcmsuUmVtb3RlUGxheWVyRXZlbnRUeXBlLklTX01VVEVEX0NIQU5HRUQsIG8pLCBfJHQucmVtb3RlUGxheWVyQ29udHJvbGxlci5yZW1vdmVFdmVudExpc3RlbmVyKGNhc3QuZnJhbWV3b3JrLlJlbW90ZVBsYXllckV2ZW50VHlwZS5EVVJBVElPTl9DSEFOR0VELCBzKSwgXyR0Lmxpc3RlbmVyLm9uU2Vzc2lvblN0b3AoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBlLmFkZEV2ZW50TGlzdGVuZXIoY2FzdC5mcmFtZXdvcmsuU2Vzc2lvbkV2ZW50VHlwZS5NRURJQV9TRVNTSU9OLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBfJHQucmVtb3RlUGxheWVyQ29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKGNhc3QuZnJhbWV3b3JrLlJlbW90ZVBsYXllckV2ZW50VHlwZS5DVVJSRU5UX1RJTUVfQ0hBTkdFRCwgXyRpKSwgXyR0LnJlbW90ZVBsYXllckNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcihjYXN0LmZyYW1ld29yay5SZW1vdGVQbGF5ZXJFdmVudFR5cGUuUExBWUVSX1NUQVRFX0NIQU5HRUQsIG4pLCBfJHQucmVtb3RlUGxheWVyQ29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKGNhc3QuZnJhbWV3b3JrLlJlbW90ZVBsYXllckV2ZW50VHlwZS5WT0xVTUVfTEVWRUxfQ0hBTkdFRCwgciksIF8kdC5yZW1vdGVQbGF5ZXJDb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoY2FzdC5mcmFtZXdvcmsuUmVtb3RlUGxheWVyRXZlbnRUeXBlLklTX01VVEVEX0NIQU5HRUQsIG8pLCBfJHQucmVtb3RlUGxheWVyQ29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKGNhc3QuZnJhbWV3b3JrLlJlbW90ZVBsYXllckV2ZW50VHlwZS5EVVJBVElPTl9DSEFOR0VELCBzKSwgXyR0Lmxpc3RlbmVyLm9uU2Vzc2lvblN0YXJ0ZWQoZS5nZXRDYXN0RGV2aWNlKCkuZnJpZW5kbHlOYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIHUgPSBlLmdldFNlc3Npb25PYmooKTtcbiAgICAgICAgICAgIHUuYWRkVXBkYXRlTGlzdGVuZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdS5zdGF0dXMgPT09IGNocm9tZS5jYXN0LlNlc3Npb25TdGF0dXMuU1RPUFBFRCAmJiBhKCk7XG4gICAgICAgICAgICB9KSwgdS5hZGRNZWRpYUxpc3RlbmVyKGEpO1xuICAgICAgICB9LCBuLmhhbmRsZUVycm9yID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgaWYgKGNocm9tZS5jYXN0KSBzd2l0Y2goZSl7XG4gICAgICAgICAgICAgICAgY2FzZSBjaHJvbWUuY2FzdC5FcnJvckNvZGUuU0VTU0lPTl9FUlJPUjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5vblNlc3Npb25FcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGNocm9tZS5jYXN0LkVycm9yQ29kZS5SRUNFSVZFUl9VTkFWQUlMQUJMRTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5vblJlbW90ZURldmljZSghMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgY2hyb21lLmNhc3QuRXJyb3JDb2RlLkxPQURfTUVESUFfRkFJTEVEOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9uTG9hZE1lZGlhRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBjaHJvbWUuY2FzdC5FcnJvckNvZGUuQ0FOQ0VMOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9uVXNlckNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9uU2lua0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiRXJyb3IgcmVxdWVzdGluZyBjaHJvbWVjYXN0IHNlc3Npb25cIlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgdGhpcy5saXN0ZW5lci5vblNpbmtFcnJvcih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgICAgICAgY29kZTogMCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkVycm9yIGxvYWRpbmcgY2hyb21lY2FzdCBTREtcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGk7XG4gICAgfShSZSksIF9lID0gZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgdCA9IGZ1bmN0aW9uIHQodCkge1xuICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICByZXR1cm4gKGkgPSBlLmNhbGwodGhpcykgfHwgdGhpcykudmlkZW8gPSB2b2lkIDAsIGkudmlkZW8gPSB0LCBpO1xuICAgICAgICB9O1xuICAgICAgICBEZSgpKHQsIGUpO1xuICAgICAgICB2YXIgaSA9IHQucHJvdG90eXBlO1xuICAgICAgICByZXR1cm4gaS5zZWVrVG8gPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lID0gZTtcbiAgICAgICAgfSwgaS5zZXRQbGF5YmFja1JhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvLnBsYXliYWNrUmF0ZSA9IGU7XG4gICAgICAgIH0sIGkuc2V0Vm9sdW1lID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy52aWRlby52b2x1bWUgPSBlO1xuICAgICAgICB9LCBpLmdldFZvbHVtZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlkZW8udm9sdW1lO1xuICAgICAgICB9LCBpLmlzTXV0ZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZGVvLm11dGVkO1xuICAgICAgICB9LCBpLnNldE11dGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy52aWRlby5tdXRlZCA9IGU7XG4gICAgICAgIH0sIGkuZ2V0UGxheWJhY2tSYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aWRlby5wbGF5YmFja1JhdGU7XG4gICAgICAgIH0sIHQ7XG4gICAgfShSZSksIEllID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlID0gZnVuY3Rpb24gZShlLCB0KSB7XG4gICAgICAgICAgICB0aGlzLm11dGVkID0gdm9pZCAwLCB0aGlzLnZpZGVvID0gdm9pZCAwLCB0aGlzLmxpc3RlbmVyID0gdm9pZCAwLCB0aGlzLnVuc3Vic2NyaWJlcyA9IFtdLCB0aGlzLmV4cGVjdGluZ011dGVkQ2hhbmdlZCA9ICExLCB0aGlzLmV4cGVjdGluZ1ZvbHVtZUNoYW5nZWQgPSAhMSwgdGhpcy5leHBlY3RlZFJhdGVDaGFuZ2UgPSB2b2lkIDAsIHRoaXMudmlkZW8gPSBlLCB0aGlzLmxpc3RlbmVyID0gdCwgdGhpcy5tdXRlZCA9IGUubXV0ZWQsIHRoaXMudW5zdWJzY3JpYmVzLnB1c2goYihlLCBcInZvbHVtZWNoYW5nZVwiLCB0aGlzLnZvbHVtZUNoYW5nZS5iaW5kKHRoaXMpKSksIHRoaXMudW5zdWJzY3JpYmVzLnB1c2goYihlLCBcInJhdGVjaGFuZ2VcIiwgdGhpcy5yYXRlQ2hhbmdlLmJpbmQodGhpcykpKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHQgPSBlLnByb3RvdHlwZTtcbiAgICAgICAgcmV0dXJuIHQudm9sdW1lQ2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZSA9ICF0aGlzLmV4cGVjdGluZ1ZvbHVtZUNoYW5nZWQ7XG4gICAgICAgICAgICB0aGlzLmV4cGVjdGluZ011dGVkQ2hhbmdlZCA9ICExLCB0aGlzLmV4cGVjdGluZ1ZvbHVtZUNoYW5nZWQgPSAhMTtcbiAgICAgICAgICAgIHZhciB0ID0gdGhpcy52aWRlby5tdXRlZDtcbiAgICAgICAgICAgIHRoaXMubXV0ZWQgIT09IHQgPyAodGhpcy5tdXRlZCA9IHQsIHRoaXMubGlzdGVuZXIub25TaW5rTXV0ZWRDaGFuZ2VkKHQpKSA6IHRoaXMubGlzdGVuZXIub25TaW5rVm9sdW1lQ2hhbmdlZCh0aGlzLnZpZGVvLnZvbHVtZSwgZSk7XG4gICAgICAgIH0sIHQucmF0ZUNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy52aWRlby5wbGF5YmFja1JhdGUgIT09IHRoaXMuZXhwZWN0ZWRSYXRlQ2hhbmdlICYmIHRoaXMubGlzdGVuZXIub25TaW5rUGxheWJhY2tSYXRlQ2hhbmdlZCh0aGlzLnZpZGVvLnBsYXliYWNrUmF0ZSk7XG4gICAgICAgIH0sIHQudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmVzLmZvckVhY2goZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdC5vbkNvbmZpZ3VyZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5leHBlY3RpbmdWb2x1bWVDaGFuZ2VkICYmICh0aGlzLmxpc3RlbmVyLm9uU2lua1ZvbHVtZUNoYW5nZWQodGhpcy52aWRlby52b2x1bWUsICExKSwgdGhpcy5leHBlY3RpbmdWb2x1bWVDaGFuZ2VkID0gITEpLCB0aGlzLmV4cGVjdGluZ011dGVkQ2hhbmdlZCAmJiAodGhpcy5tdXRlZCA9IHRoaXMudmlkZW8ubXV0ZWQsIHRoaXMubGlzdGVuZXIub25TaW5rTXV0ZWRDaGFuZ2VkKHRoaXMudmlkZW8ubXV0ZWQpLCB0aGlzLmV4cGVjdGluZ011dGVkQ2hhbmdlZCA9ICExKSwgdGhpcy5leHBlY3RlZFJhdGVDaGFuZ2UgPSB2b2lkIDA7XG4gICAgICAgIH0sIHQudHJhY2tSUEMgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdCA9IGUubmFtZSwgaSA9IGUuYXJnO1xuICAgICAgICAgICAgXCJzZXRWb2x1bWVcIiA9PT0gdCAmJiB0aGlzLnZpZGVvLnZvbHVtZSAhPT0gaSA/IHRoaXMuZXhwZWN0aW5nVm9sdW1lQ2hhbmdlZCA9ICEwIDogXCJzZXRNdXRlZFwiID09PSB0ICYmIHRoaXMudmlkZW8ubXV0ZWQgIT09IGkgPyB0aGlzLmV4cGVjdGluZ011dGVkQ2hhbmdlZCA9ICEwIDogXCJzZXRQbGF5YmFja1JhdGVcIiA9PT0gdCAmJiB0aGlzLnZpZGVvLnBsYXliYWNrUmF0ZSAhPT0gaSAmJiAodGhpcy5leHBlY3RlZFJhdGVDaGFuZ2UgPSBpKTtcbiAgICAgICAgfSwgZTtcbiAgICB9KCksIE9lID0gcmVxdWlyZShcInByb21pc2UtcG9seWZpbGxcIiksIE5lID0gZS5uKE9lKSwgVmUgPSAoXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2Ygc2VsZiA/IHNlbGYgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiB3aW5kb3cgPyB3aW5kb3cgOiB2b2lkIDAgIT09IGUuZyA/IGUuZyA6IHZvaWQgMCkuUHJvbWlzZSB8fCBOZSgpLCBVZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiKSwgQmUgPSBlLm4oVWUpLCB4ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdmFyIHQgPSBmdW5jdGlvbiB0KHQsIGkpIHtcbiAgICAgICAgICAgIHZhciBuO1xuICAgICAgICAgICAgcmV0dXJuIChuID0gZS5jYWxsKHRoaXMpIHx8IHRoaXMpLnBhdXNlZCA9ICEwLCBuLmxpc3RlbmVyID0gdm9pZCAwLCBuLnZpZGVvID0gdm9pZCAwLCBuLnVuc3Vic2NyaWJlcnMgPSB2b2lkIDAsIG4ubGFzdFZvbHVtZUNoYW5nZUV2ZW50ID0gdm9pZCAwLCBuLnZpZGVvID0gdCwgbi5saXN0ZW5lciA9IGksIG4ucGF1c2VkID0gITAsIG4udW5zdWJzY3JpYmVycyA9IFtdLCBuLmFkZExpc3RlbmVyKFwidm9sdW1lY2hhbmdlXCIsIG4ucmVjb3JkTXV0ZUNoYW5nZS5iaW5kKEJlKCkobikpKSwgbi5yZWNvcmRNdXRlQ2hhbmdlKCksIG47XG4gICAgICAgIH07XG4gICAgICAgIERlKCkodCwgZSk7XG4gICAgICAgIHZhciBpID0gdC5wcm90b3R5cGU7XG4gICAgICAgIHJldHVybiBpLnBhdXNlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnBhdXNlZCA9ICEwLCB0aGlzLnZpZGVvLnBhdXNlKCk7XG4gICAgICAgIH0sIGkuc2V0UGxheWJhY2tSYXRlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy52aWRlby5wbGF5YmFja1JhdGUgPSBlO1xuICAgICAgICB9LCBpLmRlbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgaS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKGUsIHQsIGkpIHtcbiAgICAgICAgICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IHRoaXMudmlkZW8pLCB0aGlzLnVuc3Vic2NyaWJlcnMucHVzaChiKGksIGUsIHQpKTtcbiAgICAgICAgfSwgaS5yZWNvcmRNdXRlQ2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RWb2x1bWVDaGFuZ2VFdmVudCA9IHtcbiAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgICAgICAgICAgIG11dGVkOiB0aGlzLnZpZGVvLm11dGVkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCBpLmNoZWNrU3RvcHBlZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy52aWRlby5wYXVzZWQgfHwgdGhpcy52aWRlby5lbmRlZCB8fCB0aGlzLnZpZGVvLmVycm9yIHx8IHRoaXMucGF1c2VkIHx8IHRoaXMubGlzdGVuZXIub25TaW5rU3RvcChlIHx8IHRoaXMudW5tdXRlQXV0b3BhdXNlKCkpLCAhMTtcbiAgICAgICAgfSwgaS51bm11dGVBdXRvcGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBfJGUgPSB0aGlzLmxhc3RWb2x1bWVDaGFuZ2VFdmVudDtcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy52aWRlby5tdXRlZCAmJiAhXyRlLm11dGVkICYmIHRoaXMudmlkZW8uY3VycmVudFRpbWUgPT09IF8kZS50aW1lO1xuICAgICAgICB9LCB0O1xuICAgIH0oUmUpLCBIZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdmFyIHQgPSBmdW5jdGlvbiB0KHQsIGkpIHtcbiAgICAgICAgICAgIHZhciBuO1xuICAgICAgICAgICAgcmV0dXJuIChuID0gZS5jYWxsKHRoaXMsIHQsIGkpIHx8IHRoaXMpLm9uU2lua0lkbGUgPSB2b2lkIDAsIG4uaW50ZXJ2YWxJZCA9IHZvaWQgMCwgbi5pZGxlID0gdm9pZCAwLCBuLmxhc3RQbGF5aGVhZCA9IHZvaWQgMCwgbi5sYXN0QnVmZmVyRW5kID0gdm9pZCAwLCBuLmZwcyA9IHZvaWQgMCwgbi5sYXN0RGVjb2RlZEZyYW1lcyA9IHZvaWQgMCwgbi5sYXN0VGltZVVwZGF0ZSA9IHZvaWQgMCwgbi5pZGxlVGltZW91dCA9IHZvaWQgMCwgbi5wbGF5QXR0ZW1wdCA9ICExLCBuLnNlZWtpbmcgPSAhMSwgbi5hdWRpb0J1ZmZlckxpc3QgPSB2b2lkIDAsIG4uYXdhaXRpbmdBdXRvcGxheUNvbXBsZXRpb24gPSAhMSwgbi5pbnRlcnZhbElkID0gMCwgbi5pZGxlID0gITAsIG4ubGFzdFBsYXloZWFkID0gMCwgbi5sYXN0QnVmZmVyRW5kID0gMCwgbi5mcHMgPSAwLCBuLmxhc3REZWNvZGVkRnJhbWVzID0gMCwgbi5sYXN0VGltZVVwZGF0ZSA9IHBlcmZvcm1hbmNlLm5vdygpLCBuLmlkbGVUaW1lb3V0ID0gLTEsIG4uYXVkaW9CdWZmZXJMaXN0ID0gW10sIG4uYWRkTGlzdGVuZXIoXCJwbGF5XCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuLm9uVmlkZW9QbGF5KCk7XG4gICAgICAgICAgICB9KSwgbi5hZGRMaXN0ZW5lcihcInBhdXNlXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuLm9uVmlkZW9QYXVzZSgpO1xuICAgICAgICAgICAgfSksIG4uYWRkTGlzdGVuZXIoXCJ0aW1ldXBkYXRlXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuLm9uVmlkZW9UaW1lVXBkYXRlKCk7XG4gICAgICAgICAgICB9KSwgbi5hZGRMaXN0ZW5lcihcImVuZGVkXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuLm9uVmlkZW9FbmRlZCgpO1xuICAgICAgICAgICAgfSksIG4uYWRkTGlzdGVuZXIoXCJlcnJvclwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5vblZpZGVvRXJyb3IoKTtcbiAgICAgICAgICAgIH0pLCBuLmFkZExpc3RlbmVyKFwicGxheWluZ1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5vblZpZGVvUGxheWluZygpO1xuICAgICAgICAgICAgfSksIG4uYWRkTGlzdGVuZXIoXCJzZWVraW5nXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuLm9uVmlkZW9TZWVraW5nKCk7XG4gICAgICAgICAgICB9KSwgbjtcbiAgICAgICAgfTtcbiAgICAgICAgRGUoKSh0LCBlKTtcbiAgICAgICAgdmFyIGkgPSB0LnByb3RvdHlwZTtcbiAgICAgICAgcmV0dXJuIGkuZGVsZXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBlLnByb3RvdHlwZS5kZWxldGUuY2FsbCh0aGlzKSwgdGhpcy5hdWRpb0J1ZmZlckxpc3QgPSBbXSwgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xuICAgICAgICB9LCBpLnBsYXkgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMucGF1c2VkID0gITE7XG4gICAgICAgICAgICBmb3IodmFyIF8kZSA9IHRoaXMudmlkZW8uYnVmZmVyZWQsIHQgPSAwLCBpID0gMDsgaSA8IF8kZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgdmFyIG4gPSBfJGUuc3RhcnQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmlkZW8uY3VycmVudFRpbWUgPD0gbikge1xuICAgICAgICAgICAgICAgICAgICB0ID0gbjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52aWRlby5jdXJyZW50VGltZSA8IHQgJiYgKGNvbnNvbGUud2FybihcIk1vdmluZyB0byBidWZmZXJlZCByZWdpb25cIiwgdCwgdGhpcy52aWRlby5jdXJyZW50VGltZSksIHRoaXMubGlzdGVuZXIub25TaW5rR2FwSnVtcCh0IC0gdGhpcy52aWRlby5jdXJyZW50VGltZSksIHRoaXMuc2Vla1RvKHQpKSwgdGhpcy5wbGF5SW50ZXJuYWwoKTtcbiAgICAgICAgfSwgaS5lbmRPZlN0cmVhbSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5pZGxlID0gITEsIGNsZWFyVGltZW91dCh0aGlzLmlkbGVUaW1lb3V0KSwgdGhpcy5pZGxlVGltZW91dCA9IC0xO1xuICAgICAgICB9LCBpLmZyYW1lcmF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnBzO1xuICAgICAgICB9LCBpLnNlZWtUbyA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW8uc2Vla2FibGUubGVuZ3RoICYmIGUgIT09IHRoaXMudmlkZW8uY3VycmVudFRpbWUgJiYgKHRoaXMuc2Vla2luZyA9ICEwLCB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lID0gZSk7XG4gICAgICAgIH0sIGkuYWRkU291cmNlQnVmZmVyID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgKHQuaW5kZXhPZihcIm1wNGFcIikgPiAtMSB8fCB0LmluZGV4T2YoXCJvcHVzXCIpID4gLTEpICYmICh0aGlzLmF1ZGlvQnVmZmVyTGlzdCA9IFtcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSwgaS5jbGVhclNvdXJjZUJ1ZmZlcnMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9CdWZmZXJMaXN0ID0gW107XG4gICAgICAgIH0sIGkub25JZGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgXyRlO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5vblNpbmtJZGxlKCksIG51bGwgPT0gKF8kZSA9IHRoaXMub25TaW5rSWRsZSkgfHwgXyRlLmNhbGwodGhpcyk7XG4gICAgICAgIH0sIGkub25WaWRlb1BsYXkgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBfJGUgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5wbGF5QXR0ZW1wdCA/ICh0aGlzLmxhc3RQbGF5aGVhZCA9IHRoaXMudmlkZW8uY3VycmVudFRpbWUsIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElkKSwgdGhpcy5pbnRlcnZhbElkID0gc2VsZi5zZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXyRlLmhlYXJ0YmVhdCgpO1xuICAgICAgICAgICAgfSwgdikpIDogKHRoaXMucGF1c2UoKSwgdGhpcy5saXN0ZW5lci5wbGF5KCkpLCB0aGlzLnBsYXlBdHRlbXB0ID0gITE7XG4gICAgICAgIH0sIGkub25WaWRlb1BhdXNlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLmF3YWl0aW5nQXV0b3BsYXlDb21wbGV0aW9uIHx8ICh0aGlzLmNoZWNrU3RvcHBlZCghMSksIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElkKSk7XG4gICAgICAgIH0sIGkub25WaWRlb1RpbWVVcGRhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlkbGVUaW1lb3V0KSwgdGhpcy5pZGxlVGltZW91dCA9IC0xO1xuICAgICAgICAgICAgdmFyIF8kZSA9IGcodGhpcy52aWRlbyksIHQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgIHRoaXMuZnBzID0gMWUzICogTWF0aC5tYXgoXyRlIC0gdGhpcy5sYXN0RGVjb2RlZEZyYW1lcywgMCkgLyAodCAtIHRoaXMubGFzdFRpbWVVcGRhdGUpLCB0aGlzLmxhc3REZWNvZGVkRnJhbWVzID0gXyRlLCB0aGlzLmxhc3RUaW1lVXBkYXRlID0gdCwgdGhpcy5saXN0ZW5lci5vblNpbmtUaW1lVXBkYXRlKCk7XG4gICAgICAgICAgICB2YXIgaSA9IGsodGhpcy52aWRlby5idWZmZXJlZCwgdGhpcy52aWRlby5jdXJyZW50VGltZSwgbCk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrQnVmZmVyVXBkYXRlKGkpLCB0aGlzLnVwZGF0ZUlkbGUoaSk7XG4gICAgICAgIH0sIGkub25WaWRlb0VuZGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9uU2lua0VuZGVkKCk7XG4gICAgICAgIH0sIGkub25WaWRlb1BsYXlpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW8ucGF1c2VkIHx8IHRoaXMubGlzdGVuZXIub25TaW5rUGxheWluZyh0aGlzLnBhdXNlZCk7XG4gICAgICAgIH0sIGkub25WaWRlb1NlZWtpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vla2luZyA/IHRoaXMuc2Vla2luZyA9ICExIDogdGhpcy5saXN0ZW5lci5zZWVrVG8odGhpcy52aWRlby5jdXJyZW50VGltZSk7XG4gICAgICAgIH0sIGkub25WaWRlb0Vycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgXyRlLCB0LCBpID0gbnVsbCAhPSAoXyRlID0gbnVsbCA9PSB0aGlzIHx8IG51bGwgPT0gKHQgPSB0aGlzLnZpZGVvKSA/IHZvaWQgMCA6IHQuZXJyb3IpID8gXyRlIDoge30sIG4gPSBpLmNvZGUsIHIgPSB2b2lkIDAgPT09IG4gPyAtMSA6IG4sIG8gPSBpLm1lc3NhZ2UsIHMgPSB2b2lkIDAgPT09IG8gPyBcIlwiIDogbztcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIub25TaW5rRXJyb3Ioe1xuICAgICAgICAgICAgICAgIHZhbHVlOiByLFxuICAgICAgICAgICAgICAgIGNvZGU6IHIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGkuaGVhcnRiZWF0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgXyRlID0gayh0aGlzLnZpZGVvLmJ1ZmZlcmVkLCB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lLCBsKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZGVvLnBhdXNlZCkgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52aWRlby5jdXJyZW50VGltZSA9PT0gdGhpcy5sYXN0UGxheWhlYWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgdCA9IFModGhpcy52aWRlby5idWZmZXJlZCwgdGhpcy52aWRlby5jdXJyZW50VGltZSwgbCk7XG4gICAgICAgICAgICAgICAgdCAhPT0gdGhpcy52aWRlby5jdXJyZW50VGltZSAmJiAodGhpcy5hdWRpb0J1ZmZlckxpc3QubWFwKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgRShcIkF1ZGlvIEJ1ZmZlclwiLCBlLmJ1ZmZlcmVkKTtcbiAgICAgICAgICAgICAgICB9KSwgRShcIjx2aWRlbz4gQnVmZmVyXCIsIHRoaXMudmlkZW8uYnVmZmVyZWQpLCBjb25zb2xlLndhcm4oXCJqdW1waW5nIFwiICsgKHQgLSB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSArIFwicyBnYXAsIGN1cnJlbnQgcG9zaXRpb24gXCIgKyB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lICsgXCIsIG5ldyBwb3NpdGlvbiBcIiArIHQpLCB0aGlzLmxpc3RlbmVyLm9uU2lua0dhcEp1bXAodCAtIHRoaXMudmlkZW8uY3VycmVudFRpbWUpLCB0aGlzLnNlZWtUbyh0KSksIHRoaXMudXBkYXRlSWRsZShfJGUsIHQgPT09IHRoaXMudmlkZW8uY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHRoaXMuY2hlY2tCdWZmZXJVcGRhdGUoXyRlKSwgdGhpcy5sYXN0UGxheWhlYWQgPSB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lO1xuICAgICAgICAgICAgdGhpcy52aWRlb0Rpc3BsYXlTaXplVXBkYXRlKCk7XG4gICAgICAgIH0sIGkudmlkZW9EaXNwbGF5U2l6ZVVwZGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIF8kZSA9IHRoaXMudmlkZW8uY2xpZW50V2lkdGggKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgdCA9IHRoaXMudmlkZW8uY2xpZW50SGVpZ2h0ICogd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9uU2lua1ZpZGVvRGlzcGxheVNpemVDaGFuZ2VkKF8kZSwgdCk7XG4gICAgICAgIH0sIGkuY2hlY2tCdWZmZXJVcGRhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdCA9IGUuZW5kO1xuICAgICAgICAgICAgdCAhPT0gdGhpcy5sYXN0QnVmZmVyRW5kICYmICh0aGlzLmxhc3RCdWZmZXJFbmQgPSB0LCB0aGlzLmxpc3RlbmVyLm9uU2lua0J1ZmZlclVwZGF0ZSgpKTtcbiAgICAgICAgfSwgaS51cGRhdGVJZGxlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLCBuID0gZS5lbmQsIHIgPSB2b2lkIDAgPT09IG4gPyAwIDogbjtcbiAgICAgICAgICAgIHZvaWQgMCA9PT0gdCAmJiAodCA9ICExKTtcbiAgICAgICAgICAgIHZhciBvID0gdGhpcy52aWRlbywgcyA9IG8uYnVmZmVyZWQsIGEgPSBvLmN1cnJlbnRUaW1lO1xuICAgICAgICAgICAgaWYgKG8ucGF1c2VkKSB0aGlzLmlkbGUgPSAhMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB1ID0gW1xuICAgICAgICAgICAgICAgICAgICByXG4gICAgICAgICAgICAgICAgXS5jb25jYXQodGhpcy5hdWRpb0J1ZmZlckxpc3QubWFwKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsoZS5idWZmZXJlZCwgYSwgbCkuZW5kO1xuICAgICAgICAgICAgICAgIH0pKSwgYyA9IE1hdGgubWF4LmFwcGx5KG51bGwsIHUpO1xuICAgICAgICAgICAgICAgIE51bWJlci5pc0Zpbml0ZShjKSB8fCAoYyA9IDApO1xuICAgICAgICAgICAgICAgIHZhciBkID0gcy5sZW5ndGgsIGggPSBkID4gMCA/IHMuZW5kKGQgLSAxKSA6IHIsIGYgPSBjIC0gYSA8IGwgfHwgdCAmJiByID4gaDtcbiAgICAgICAgICAgICAgICBmICYmICF0aGlzLmlkbGUgJiYgKGNvbnNvbGUud2FybihcInBsYXloZWFkXCIsIGEsIFwibWF4IGJ1ZmZlclwiLCBjLCBcIm1heCBwbGF5ZWRcIiwgaCksIGNsZWFyVGltZW91dCh0aGlzLmlkbGVUaW1lb3V0KSwgdGhpcy5pZGxlVGltZW91dCA9IHNlbGYuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkub25CdWZmZXJpbmdUaW1lb3V0KCk7XG4gICAgICAgICAgICAgICAgfSwgbSksIHRoaXMub25JZGxlKCkpLCB0aGlzLmlkbGUgPSBmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBpLm9uQnVmZmVyaW5nVGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaWRsZVRpbWVvdXQpLCB0aGlzLmlkbGVUaW1lb3V0ID0gLTEsIHRoaXMubGlzdGVuZXIub25TaW5rRXJyb3Ioe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBvLFxuICAgICAgICAgICAgICAgIGNvZGU6IG8sXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJCdWZmZXJpbmcgdGltZW91dFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgaS5wbGF5SW50ZXJuYWwgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBfJGUgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5wbGF5QXR0ZW1wdCA9ICEwLCB0aGlzLmF3YWl0aW5nQXV0b3BsYXlDb21wbGV0aW9uID0gITAsIFZlLnJlc29sdmUodGhpcy52aWRlby5wbGF5KCkpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgXyRlLmF3YWl0aW5nQXV0b3BsYXlDb21wbGV0aW9uID0gITE7XG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBfJGUucGxheUF0dGVtcHQgPSAhMSwgXyRlLmNoZWNrU3RvcHBlZCghMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdDtcbiAgICB9KHhlKSwgRmUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgIHZhciB0ID0gZnVuY3Rpb24gdCh0LCBpKSB7XG4gICAgICAgICAgICB2YXIgbjtcbiAgICAgICAgICAgIHJldHVybiAobiA9IGUuY2FsbCh0aGlzKSB8fCB0aGlzKS5saXN0ZW5lciA9IHQsIG4udmlkZW8gPSBpLCBuLnBsYXliYWNrTW9uaXRvciA9IHZvaWQgMCwgbi5jb250cm9sc09ic2VydmVyID0gdm9pZCAwLCBuLnBsYXliYWNrTW9uaXRvciA9IG5ldyBIZShpLCB0KSwgbi5vYnNlcnZlQ29udHJvbHNDaGFuZ2UoKSwgbjtcbiAgICAgICAgfTtcbiAgICAgICAgRGUoKSh0LCBlKTtcbiAgICAgICAgdmFyIGkgPSB0LnByb3RvdHlwZTtcbiAgICAgICAgcmV0dXJuIGkuY29uZmlndXJlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQgPSBlLnNyY09iajtcbiAgICAgICAgICAgIHRoaXMudmlkZW8uc3JjT2JqZWN0IHx8ICh0aGlzLnZpZGVvLnNyY09iamVjdCA9IHQpO1xuICAgICAgICB9LCBpLmludm9rZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXNbZS5uYW1lXS5jYWxsKHRoaXMsIGUuYXJnKTtcbiAgICAgICAgfSwgaS5wbGF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXliYWNrTW9uaXRvci5wbGF5KCk7XG4gICAgICAgIH0sIGkucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMucGxheWJhY2tNb25pdG9yLnBhdXNlKCk7XG4gICAgICAgIH0sIGkuc2Vla1RvID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5wbGF5YmFja01vbml0b3Iuc2Vla1RvKGUpO1xuICAgICAgICB9LCBpLmVuZE9mU3RyZWFtID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXliYWNrTW9uaXRvci5lbmRPZlN0cmVhbSgpO1xuICAgICAgICB9LCBpLnNldFZvbHVtZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW8udm9sdW1lICE9PSBlICYmICh0aGlzLnZpZGVvLnZvbHVtZSA9IGUpO1xuICAgICAgICB9LCBpLmdldFZvbHVtZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlkZW8udm9sdW1lO1xuICAgICAgICB9LCBpLmlzTXV0ZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZGVvLm11dGVkO1xuICAgICAgICB9LCBpLnNldE11dGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy52aWRlby5tdXRlZCAhPT0gZSAmJiAodGhpcy52aWRlby5tdXRlZCA9IGUpO1xuICAgICAgICB9LCBpLmdldERpc3BsYXlXaWR0aCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlkZW8uY2xpZW50V2lkdGg7XG4gICAgICAgIH0sIGkuZ2V0RGlzcGxheUhlaWdodCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlkZW8uY2xpZW50SGVpZ2h0O1xuICAgICAgICB9LCBpLnNldFBsYXliYWNrUmF0ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMucGxheWJhY2tNb25pdG9yLnNldFBsYXliYWNrUmF0ZShlKTtcbiAgICAgICAgfSwgaS5nZXRQbGF5YmFja1JhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZGVvLnBsYXliYWNrUmF0ZTtcbiAgICAgICAgfSwgaS5nZXRDdXJyZW50VGltZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlkZW8uY3VycmVudFRpbWU7XG4gICAgICAgIH0sIGkuYnVmZmVyZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBrKHRoaXMudmlkZW8uYnVmZmVyZWQsIHRoaXMudmlkZW8uY3VycmVudFRpbWUsIGwpO1xuICAgICAgICB9LCBpLmJ1ZmZlckR1cmF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgXyRlID0gdGhpcy5idWZmZXJlZCgpLCB0ID0gXyRlLnN0YXJ0O1xuICAgICAgICAgICAgcmV0dXJuIF8kZS5lbmQgLSBNYXRoLm1heCh0LCB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTtcbiAgICAgICAgfSwgaS5kZWNvZGVkRnJhbWVzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gZyh0aGlzLnZpZGVvKTtcbiAgICAgICAgfSwgaS5kcm9wcGVkRnJhbWVzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4geSh0aGlzLnZpZGVvKTtcbiAgICAgICAgfSwgaS5mcmFtZXJhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBsYXliYWNrTW9uaXRvci5mcmFtZXJhdGUoKTtcbiAgICAgICAgfSwgaS5jYXB0dXJlR2VzdHVyZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5wbGF5YmFja01vbml0b3IucGxheSgpLCB0aGlzLnBsYXliYWNrTW9uaXRvci5wYXVzZSgpO1xuICAgICAgICB9LCBpLmNoYW5nZVNyY09iaiA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gdGhpcy52aWRlbywgaSA9IHQucGxheWJhY2tSYXRlO1xuICAgICAgICAgICAgdC5zcmNPYmplY3QgPSBlLCB0LnBsYXliYWNrUmF0ZSA9IGk7XG4gICAgICAgIH0sIGkuZGVsZXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgXyRlO1xuICAgICAgICAgICAgdGhpcy5wbGF5YmFja01vbml0b3IuZGVsZXRlKCksIHRoaXMudmlkZW8uc3JjT2JqZWN0ID0gbnVsbCwgVCh0aGlzLnZpZGVvKSwgbnVsbCA9PSAoXyRlID0gdGhpcy5jb250cm9sc09ic2VydmVyKSB8fCBfJGUuZGlzY29ubmVjdCgpO1xuICAgICAgICB9LCBpLm9ic2VydmVDb250cm9sc0NoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIF8kZSA9IHRoaXMubGlzdGVuZXIsIHQgPSB0aGlzLnZpZGVvO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAodGhpcy5jb250cm9sc09ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIF8kZS5vblNpbmtDb250cm9sc0NoYW5nZWQodC5jb250cm9scyk7XG4gICAgICAgICAgICAgICAgfSkpLm9ic2VydmUodCwge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY29udHJvbHNcIlxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSksIF8kZS5vblNpbmtDb250cm9sc0NoYW5nZWQodC5jb250cm9scyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB9LCB0O1xuICAgIH0oUmUpLCBHZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIiksIGplID0gZS5uKEdlKSwgV2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiBlKGUsIHQsIGkpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIgPSBlLCB0aGlzLnZpZGVvID0gdCwgdGhpcy5hZGp1c3RtZW50cyA9IGksIHRoaXMucGxheWJhY2tNb25pdG9yID0gdm9pZCAwLCB0aGlzLmNvbnRyb2xzT2JzZXJ2ZXIgPSB2b2lkIDAsIHRoaXMubXNlU2luayA9IHZvaWQgMCwgdGhpcy5hd2FpdFNpbmsgPSB2b2lkIDAsIHRoaXMucGxheWJhY2tNb25pdG9yID0gbmV3IEhlKHQsIGUpLCB0aGlzLm9ic2VydmVDb250cm9sc0NoYW5nZSgpLCB0aGlzLmF3YWl0U2luayA9IHZvaWQgMCwgYih0LCBcImVycm9yXCIsIHRoaXMub25WaWRlb0Vycm9yLmJpbmQodGhpcykpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgdCA9IGUucHJvdG90eXBlO1xuICAgICAgICByZXR1cm4gdC5pbnZva2UgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdCA9IHRoaXMuYXdhaXRTaW5rLCBpID0gdGhpcy5tc2VTaW5rO1xuICAgICAgICAgICAgdCAmJiBpID8gW1xuICAgICAgICAgICAgICAgIFwiZW5xdWV1ZVwiLFxuICAgICAgICAgICAgICAgIFwiYWRkVHJhY2tcIixcbiAgICAgICAgICAgICAgICBcInNldFRpbWVzdGFtcE9mZnNldFwiXG4gICAgICAgICAgICBdLmluY2x1ZGVzKGUubmFtZSkgPyB0aGlzLmludm9rZUFzeW5jKGUpIDogdGhpcy5pbnZva2VTeW5jKGUpIDogdCA/IHRoaXMuaW52b2tlQXN5bmMoZSkgOiBpICYmIHRoaXMuaW52b2tlU3luYyhlKTtcbiAgICAgICAgfSwgdC5jb25maWd1cmUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdCA9IHRoaXMsIGkgPSB0aGlzLmF3YWl0U2luaywgbiA9IHRoaXMubXNlU2luaywgciA9IGUudHJhY2tJRCwgbyA9IGUuY29kZWMsIHMgPSBlLmdyb3VwLCBhID0gZS5pc1Byb3RlY3RlZDtcbiAgICAgICAgICAgIGlmICghbiAmJiAhaSkge1xuICAgICAgICAgICAgICAgIHZhciB1ID0gQS5jcmVhdGUodGhpcy5vbk1lZGlhU291cmNlRW5kZWQuYmluZCh0aGlzKSwgdGhpcy5vbk1lZGlhU291cmNlRXJyb3IuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hd2FpdFNpbmsgPSBuZXcgVmUoZnVuY3Rpb24oZSwgaSkge1xuICAgICAgICAgICAgICAgICAgICB1LnNpbmsudGhlbihmdW5jdGlvbihpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0LmhhbmRsZUNyZWF0ZVN1Y2Nlc3MoaSksIGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdC5oYW5kbGVDcmVhdGVFcnJvcihlKSwgaSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KSwgdGhpcy5jaGFuZ2VTcmMoVVJMLmNyZWF0ZU9iamVjdFVSTCh1Lm1zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5pc0NvbnRlbnRQcm90ZWN0aW9uQ2hhbmdpbmcoYSkgJiYgdGhpcy5xdWV1ZU5ld1NpbmsoKSwgdGhpcy5pc05ld1NpbmtOZWVkZWQoZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlTmV3U2luaygpO1xuICAgICAgICAgICAgICAgIHZhciBjID0gdGhpcy5nZXRUcmFjayhwLmF1ZGlvKTtcbiAgICAgICAgICAgICAgICBjICYmIHRoaXMuaW52b2tlKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJhZGRUcmFja1wiLFxuICAgICAgICAgICAgICAgICAgICBhcmc6IGNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW52b2tlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImFkZFRyYWNrXCIsXG4gICAgICAgICAgICAgICAgYXJnOiBqZSgpKHt9LCBLZSwge1xuICAgICAgICAgICAgICAgICAgICB0cmFja0lEOiByLFxuICAgICAgICAgICAgICAgICAgICBjb2RlYzogbyxcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IHMsXG4gICAgICAgICAgICAgICAgICAgIGlzUHJvdGVjdGVkOiBhXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB0LnF1ZXVlTmV3U2luayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5hd2FpdFNpbmsgPSBuZXcgVmUoZnVuY3Rpb24odCwgaSkge1xuICAgICAgICAgICAgICAgIGUuZGVmZXJVbnRpbElkbGUoKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEEuY3JlYXRlKGUub25NZWRpYVNvdXJjZUVuZGVkLmJpbmQoZSksIGUub25NZWRpYVNvdXJjZUVycm9yLmJpbmQoZSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jaGFuZ2VTcmMoVVJMLmNyZWF0ZU9iamVjdFVSTCh0Lm1zKSksIHQuc2luaztcbiAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5kZXN0cm95TVNFU2luaygpLCBlLmhhbmRsZUNyZWF0ZVN1Y2Nlc3MoaSksIGUucGxheSgpLCB0KCk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICBlLmhhbmRsZUNyZWF0ZUVycm9yKHQpLCBpKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdC5hZGRUcmFjayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gZS50cmFja0lELCBpID0gZS5jb2RlYywgbiA9IGUuZ3JvdXAsIHIgPSBlLmlzUHJvdGVjdGVkLCBvID0gdGhpcy5tc2VTaW5rO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IG51bGwgPT0gbyA/IHZvaWQgMCA6IG8uYWRkVHJhY2sodCwgaSwgbiwgcik7XG4gICAgICAgICAgICAgICAgcyAmJiB0aGlzLnBsYXliYWNrTW9uaXRvci5hZGRTb3VyY2VCdWZmZXIocywgaSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ3JlYXRlRXJyb3IoZTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0LmVucXVldWUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdCwgaSA9IGUudHJhY2tJRCwgbiA9IGUuYnVmZmVyO1xuICAgICAgICAgICAgbnVsbCA9PSAodCA9IHRoaXMubXNlU2luaykgfHwgdC5hcHBlbmQoaSwgbik7XG4gICAgICAgIH0sIHQuZW5kT2ZTdHJlYW0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlLCB0ID0gdGhpcztcbiAgICAgICAgICAgIG51bGwgPT0gKGUgPSB0aGlzLm1zZVNpbmspIHx8IGUuc2NoZWR1bGVVcGRhdGUoKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0LnBsYXliYWNrTW9uaXRvci5lbmRPZlN0cmVhbSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIHQuc2V0VGltZXN0YW1wT2Zmc2V0ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQsIGkgPSBlLnRyYWNrSUQsIG4gPSBlLm9mZnNldDtcbiAgICAgICAgICAgIG51bGwgPT0gKHQgPSB0aGlzLm1zZVNpbmspIHx8IHQuc2V0VGltZXN0YW1wT2Zmc2V0KGksIG4pO1xuICAgICAgICB9LCB0Lm9uU2VnbWVudERpc2NvbnRpbnVpdHkgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlID0gdGhpcy5hZGp1c3RtZW50cywgdCA9IHRoaXMuYXdhaXRTaW5rLCBpID0gdGhpcy5tc2VTaW5rO1xuICAgICAgICAgICAgZS5yZWJ1aWxkTWVkaWFTaW5rT25EaXNjb250aW51aXR5ICYmIGkgJiYgIXQgJiYgdGhpcy5xdWV1ZU5ld1NpbmsoKTtcbiAgICAgICAgfSwgdC5vblNvdXJjZUR1cmF0aW9uQ2hhbmdlZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5tc2VTaW5rLCBpID0gdGhpcy52aWRlbztcbiAgICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIG4gPSB0LmR1cmF0aW9uLCByID0gZnVuY3Rpb24oZSwgdCwgaSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09PSAxIC8gMCB8fCBlID09PSBmID8gaSA/IG4gPSAxIC8gMCA6IGkgfHwgKG4gPSBmKSA6IGUgIT09IHQgJiYgKG4gPSBlKSwgbjtcbiAgICAgICAgICAgICAgICB9KGUsIG4sIGkuY29udHJvbHMpO1xuICAgICAgICAgICAgICAgIHIgIT09IG4gJiYgdC5zZXREdXJhdGlvbihyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdC5wbGF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZSwgdCA9IHRoaXM7XG4gICAgICAgICAgICBudWxsID09IChlID0gdGhpcy5tc2VTaW5rKSB8fCBlLnNjaGVkdWxlVXBkYXRlKCkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5wbGF5YmFja01vbml0b3IucGxheSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIHQucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlLCB0ID0gdGhpcztcbiAgICAgICAgICAgIG51bGwgPT0gKGUgPSB0aGlzLm1zZVNpbmspIHx8IGUuc2NoZWR1bGVVcGRhdGUoKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0LnBsYXliYWNrTW9uaXRvci5wYXVzZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIHQucmVtb3ZlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQsIGkgPSBlLnN0YXJ0LCBuID0gZS5lbmQ7XG4gICAgICAgICAgICBudWxsID09ICh0ID0gdGhpcy5tc2VTaW5rKSB8fCB0LnJlbW92ZShpLCBuKTtcbiAgICAgICAgfSwgdC5zZWVrVG8gPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdCA9IHRoaXMubXNlU2luaywgaSA9IHRoaXMucGxheWJhY2tNb25pdG9yLCBuID0gdGhpcy52aWRlbywgciA9IGsobi5idWZmZXJlZCwgbi5jdXJyZW50VGltZSwgbCksIG8gPSByLnN0YXJ0LCBzID0gci5lbmQ7XG4gICAgICAgICAgICBlID49IG8gJiYgZSA8IHMgPyBudWxsID09IHQgfHwgdC5zY2hlZHVsZVVwZGF0ZSgpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkuc2Vla1RvKGUpO1xuICAgICAgICAgICAgfSkgOiBpLnNlZWtUbyhlKTtcbiAgICAgICAgfSwgdC5zZXRWb2x1bWUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvLnZvbHVtZSAhPT0gZSAmJiAodGhpcy52aWRlby52b2x1bWUgPSBlKTtcbiAgICAgICAgfSwgdC5nZXRWb2x1bWUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZGVvLnZvbHVtZTtcbiAgICAgICAgfSwgdC5pc011dGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aWRlby5tdXRlZDtcbiAgICAgICAgfSwgdC5zZXRNdXRlZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW8ubXV0ZWQgIT09IGUgJiYgKHRoaXMudmlkZW8ubXV0ZWQgPSBlKTtcbiAgICAgICAgfSwgdC5nZXREaXNwbGF5V2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZGVvLmNsaWVudFdpZHRoO1xuICAgICAgICB9LCB0LmdldERpc3BsYXlIZWlnaHQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZGVvLmNsaWVudEhlaWdodDtcbiAgICAgICAgfSwgdC5zZXRQbGF5YmFja1JhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXliYWNrTW9uaXRvci5zZXRQbGF5YmFja1JhdGUoZSk7XG4gICAgICAgIH0sIHQuZ2V0UGxheWJhY2tSYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aWRlby5wbGF5YmFja1JhdGU7XG4gICAgICAgIH0sIHQuZ2V0Q3VycmVudFRpbWUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lO1xuICAgICAgICB9LCB0LmJ1ZmZlcmVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gayh0aGlzLnZpZGVvLmJ1ZmZlcmVkLCB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lLCBsKTtcbiAgICAgICAgfSwgdC5nZXRCdWZmZXJlZFJhbmdlcyA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0LCBpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gKHQgPSBudWxsID09IChpID0gdGhpcy5tc2VTaW5rKSA/IHZvaWQgMCA6IGkuZ2V0QnVmZmVyZWRSYW5nZXMoZSkpID8gdCA6IFtdO1xuICAgICAgICB9LCB0LmJ1ZmZlckR1cmF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZSA9IHRoaXMuYnVmZmVyZWQoKSwgdCA9IGUuc3RhcnQ7XG4gICAgICAgICAgICByZXR1cm4gZS5lbmQgLSBNYXRoLm1heCh0LCB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTtcbiAgICAgICAgfSwgdC5kZWNvZGVkRnJhbWVzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gZyh0aGlzLnZpZGVvKTtcbiAgICAgICAgfSwgdC5kcm9wcGVkRnJhbWVzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4geSh0aGlzLnZpZGVvKTtcbiAgICAgICAgfSwgdC5mcmFtZXJhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBsYXliYWNrTW9uaXRvci5mcmFtZXJhdGUoKTtcbiAgICAgICAgfSwgdC5jYXB0dXJlR2VzdHVyZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5wbGF5YmFja01vbml0b3IucGxheSgpLCB0aGlzLnBsYXliYWNrTW9uaXRvci5wYXVzZSgpO1xuICAgICAgICB9LCB0LmNoYW5nZVNyYyA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICFmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBlLnBsYXliYWNrUmF0ZSwgbiA9IGUuc3JjO1xuICAgICAgICAgICAgICAgIG4gJiYgVVJMLnJldm9rZU9iamVjdFVSTChuKSwgZS5zcmMgPSB0LCBlLnBsYXliYWNrUmF0ZSA9IGk7XG4gICAgICAgICAgICB9KHRoaXMudmlkZW8sIGUpO1xuICAgICAgICB9LCB0LmNoYW5nZVNyY09iaiA9IGZ1bmN0aW9uKGUpIHt9LCB0LmRlbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICB0aGlzLnBsYXliYWNrTW9uaXRvci5kZWxldGUoKSwgbnVsbCA9PSAoZSA9IHRoaXMuY29udHJvbHNPYnNlcnZlcikgfHwgZS5kaXNjb25uZWN0KCksIHRoaXMuZGVzdHJveU1TRVNpbmsoKSwgVCh0aGlzLnZpZGVvKTtcbiAgICAgICAgfSwgdC5pbnZva2VTeW5jID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpc1tlLm5hbWVdLmNhbGwodGhpcywgZS5hcmcpO1xuICAgICAgICB9LCB0Lmludm9rZUFzeW5jID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5hd2FpdFNpbmsudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5pbnZva2VTeW5jKGUpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oKSB7fSk7XG4gICAgICAgIH0sIHQub25NZWRpYVNvdXJjZUVuZGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvLmxvYWQoKSwgdGhpcy5saXN0ZW5lci5vblNpbmtSZXNldCgpO1xuICAgICAgICB9LCB0LmRlc3Ryb3lNU0VTaW5rID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZSA9IHRoaXMsIHQgPSBmdW5jdGlvbiB0KCkge1xuICAgICAgICAgICAgICAgIGUubXNlU2luayAmJiBlLm1zZVNpbmsuZGVzdHJveSgpLCBlLmF3YWl0U2luayA9IHZvaWQgMCwgZS5tc2VTaW5rID0gdm9pZCAwO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMubXNlU2luayA/IHQoKSA6IHRoaXMuYXdhaXRTaW5rICYmIHRoaXMuYXdhaXRTaW5rLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQoKTtcbiAgICAgICAgICAgIH0pLCB0aGlzLnBsYXliYWNrTW9uaXRvciAmJiB0aGlzLnBsYXliYWNrTW9uaXRvci5jbGVhclNvdXJjZUJ1ZmZlcnMoKTtcbiAgICAgICAgfSwgdC5pc0NvbnRlbnRQcm90ZWN0aW9uQ2hhbmdpbmcgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdCA9IHRoaXMuYXdhaXRTaW5rLCBpID0gdGhpcy5tc2VTaW5rO1xuICAgICAgICAgICAgaWYgKCFpIHx8IHQpIHJldHVybiAhMTtcbiAgICAgICAgICAgIHZhciBuID0gaS5idWZmZXJQcm9wZXJ0aWVzO1xuICAgICAgICAgICAgcmV0dXJuICEhbi5sZW5ndGggJiYgbi5zb21lKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5pc1Byb3RlY3RlZCAhPT0gZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB0LmlzU2lua1ZpZGVvQ29kZWNDaGFuZ2VSZXF1aXJlZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgIHJldHVybiAhIXRoaXMuYWRqdXN0bWVudHMucmVidWlsZE1lZGlhU2lua09uQ29kZWNDaGFuZ2UgJiYgZSAhPT0gdDtcbiAgICAgICAgfSwgdC5pc1NpbmtWaWRlb1NvdXJjZVF1YWxpdHlDaGFuZ2VSZXF1aXJlZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgIHJldHVybiAhIXRoaXMuYWRqdXN0bWVudHMucmVidWlsZE1lZGlhU2lua09uU291cmNlUXVhbGl0eUNoYW5nZSAmJiBcImNodW5rZWRcIiA9PT0gZSAhPSAoXCJjaHVua2VkXCIgPT09IHQpO1xuICAgICAgICB9LCB0LmlzTmV3U2lua05lZWRlZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5hZGp1c3RtZW50cywgaSA9IHRoaXMubXNlU2luaywgbiA9IHRoaXMuYXdhaXRTaW5rO1xuICAgICAgICAgICAgaWYgKGUudHJhY2tJRCAhPT0gcC52aWRlbykgcmV0dXJuICExO1xuICAgICAgICAgICAgaWYgKCF0LnJlYnVpbGRNZWRpYVNpbmtPbkNvZGVjQ2hhbmdlICYmICF0LnJlYnVpbGRNZWRpYVNpbmtPblNvdXJjZVF1YWxpdHlDaGFuZ2UpIHJldHVybiAhMTtcbiAgICAgICAgICAgIGlmICghaSB8fCBuKSByZXR1cm4gITE7XG4gICAgICAgICAgICB2YXIgciA9IHRoaXMuZ2V0VHJhY2socC52aWRlbyksIG8gPSB0aGlzLmdldFRyYWNrKHAuYXVkaW8pO1xuICAgICAgICAgICAgcmV0dXJuICEoIXIgfHwgIW8pICYmICh0aGlzLmlzU2lua1ZpZGVvQ29kZWNDaGFuZ2VSZXF1aXJlZChyLmNvZGVjLCBlLmNvZGVjKSB8fCB0aGlzLmlzU2lua1ZpZGVvU291cmNlUXVhbGl0eUNoYW5nZVJlcXVpcmVkKHIuZ3JvdXAsIGUuZ3JvdXApKTtcbiAgICAgICAgfSwgdC5nZXRUcmFjayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0LCBpID0gdGhpcy5tc2VTaW5rO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gKHQgPSBudWxsID09IGkgPyB2b2lkIDAgOiBpLmJ1ZmZlclByb3BlcnRpZXMuZmluZChmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQudHJhY2tJRCA9PT0gZTtcbiAgICAgICAgICAgIH0pKSA/IHQgOiBudWxsO1xuICAgICAgICB9LCB0LmRlZmVyVW50aWxJZGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZSA9IHRoaXMsIHQgPSB0aGlzLm1zZVNpbmssIGkgPSB0aGlzLnBsYXliYWNrTW9uaXRvcjtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmUoZnVuY3Rpb24obikge1xuICAgICAgICAgICAgICAgIHQgJiYgIWUudmlkZW8ucGF1c2VkID8gaS5vblNpbmtJZGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGkub25TaW5rSWRsZSA9IHZvaWQgMCwgbigpO1xuICAgICAgICAgICAgICAgIH0gOiBuKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdC5oYW5kbGVDcmVhdGVTdWNjZXNzID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5tc2VTaW5rID0gZSwgdGhpcy5hd2FpdFNpbmsgPSB2b2lkIDAsIHRoaXMub25Tb3VyY2VEdXJhdGlvbkNoYW5nZWQoZiksIHRoaXMubXNlU2luay5zZXRMaXZlU2Vla2FibGVSYW5nZSgwLCBmKTtcbiAgICAgICAgfSwgdC5oYW5kbGVDcmVhdGVFcnJvciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIub25TaW5rRXJyb3Ioe1xuICAgICAgICAgICAgICAgIHZhbHVlOiA0LFxuICAgICAgICAgICAgICAgIGNvZGU6IDQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS50b1N0cmluZygpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdC5vbk1lZGlhU291cmNlRXJyb3IgPSBmdW5jdGlvbihlLCB0LCBpLCBuKSB7XG4gICAgICAgICAgICB2YXIgciA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZSxcbiAgICAgICAgICAgICAgICBjb2RlOiB0LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBuID8gdGhpcy5saXN0ZW5lci5vblNpbmtFcnJvcihyKSA6IHRoaXMubGlzdGVuZXIub25TaW5rUmVjb3ZlcmFibGVFcnJvcihyKTtcbiAgICAgICAgfSwgdC5vblZpZGVvRXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveU1TRVNpbmsoKTtcbiAgICAgICAgfSwgdC5vYnNlcnZlQ29udHJvbHNDaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlID0gdGhpcywgdCA9IHRoaXMudmlkZW87XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICh0aGlzLmNvbnRyb2xzT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5pbnZva2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJvblNvdXJjZUR1cmF0aW9uQ2hhbmdlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnOiB0LmR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pKS5vYnNlcnZlKHQsIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlRmlsdGVyOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNvbnRyb2xzXCJcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTEpIHt9XG4gICAgICAgIH0sIGU7XG4gICAgfSgpLCBLZSA9IHtcbiAgICAgICAgdHJhY2tJRDogMCxcbiAgICAgICAgY29kZWM6IFwiXCIsXG4gICAgICAgIG1vZGU6IFwibXNlXCIsXG4gICAgICAgIGlzUHJvdGVjdGVkOiAhMSxcbiAgICAgICAgcGF0aDogXCJcIixcbiAgICAgICAgZ3JvdXA6IFwiXCIsXG4gICAgICAgIHNyY09iajogbnVsbFxuICAgIH0sIHFlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgdCA9IGZ1bmN0aW9uIHQodCwgaSkge1xuICAgICAgICAgICAgdmFyIG47XG4gICAgICAgICAgICAobiA9IGUuY2FsbCh0aGlzLCBpLCB0KSB8fCB0aGlzKS5mcHMgPSB2b2lkIDAsIG4uaW50ZXJ2YWxJZCA9IHZvaWQgMCwgbi5idWZmZXJpbmdUaW1lb3V0SWQgPSB2b2lkIDAsIG4uYXR0ZW1wdGluZ1RvUGxheSA9IHZvaWQgMCwgbi5oYXNQbGF5ZWRTcmMgPSB2b2lkIDAsIG4uaGFzUmVsb2FkZWRPbkRlY29kZUVycm9yID0gdm9pZCAwLCBuLnVuc3Vic2NyaWJlcnNGb3JUcmFja0V2ZW50cyA9IHZvaWQgMCwgbi5mcHMgPSAwLCBuLmludGVydmFsSWQgPSAtMSwgbi5idWZmZXJpbmdUaW1lb3V0SWQgPSAtMSwgbi5hdHRlbXB0aW5nVG9QbGF5ID0gITEsIG4uaGFzUGxheWVkU3JjID0gITEsIG4uaGFzUmVsb2FkZWRPbkRlY29kZUVycm9yID0gITEsIG4udW5zdWJzY3JpYmVyc0ZvclRyYWNrRXZlbnRzID0gW10sIG4uYWRkTGlzdGVuZXIoXCJ3YWl0aW5nXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuLm9uVmlkZW9XYWl0aW5nKCk7XG4gICAgICAgICAgICB9LCBuLnZpZGVvKSwgbi5hZGRMaXN0ZW5lcihcInRpbWV1cGRhdGVcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4ub25WaWRlb1RpbWVVcGRhdGUoKTtcbiAgICAgICAgICAgIH0sIG4udmlkZW8pLCBuLmFkZExpc3RlbmVyKFwiZHVyYXRpb25jaGFuZ2VcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4ub25WaWRlb0R1cmF0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgICB9LCBuLnZpZGVvKSwgbi5hZGRMaXN0ZW5lcihcImVycm9yXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuLm9uVmlkZW9FcnJvcigpO1xuICAgICAgICAgICAgfSwgbi52aWRlbyksIG4uYWRkTGlzdGVuZXIoXCJwbGF5XCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuLm9uVmlkZW9QbGF5KCk7XG4gICAgICAgICAgICB9LCBuLnZpZGVvKSwgbi5hZGRMaXN0ZW5lcihcInBhdXNlXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuLm9uVmlkZW9QYXVzZSgpO1xuICAgICAgICAgICAgfSwgbi52aWRlbyksIG4uYWRkTGlzdGVuZXIoXCJlbmRlZFwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5vblZpZGVvRW5kZWQoKTtcbiAgICAgICAgICAgIH0sIG4udmlkZW8pLCBuLmFkZExpc3RlbmVyKFwicGxheWluZ1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5vblZpZGVvUGxheWluZygpO1xuICAgICAgICAgICAgfSwgbi52aWRlbyk7XG4gICAgICAgICAgICB2YXIgciA9IGMoZG9jdW1lbnQpLnZpc2liaWxpdHlDaGFuZ2U7XG4gICAgICAgICAgICByZXR1cm4gbi5hZGRMaXN0ZW5lcihyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5vblZpc2liaWxpdHlDaGFuZ2UoKTtcbiAgICAgICAgICAgIH0sIGRvY3VtZW50KSwgbjtcbiAgICAgICAgfTtcbiAgICAgICAgRGUoKSh0LCBlKTtcbiAgICAgICAgdmFyIGkgPSB0LnByb3RvdHlwZTtcbiAgICAgICAgcmV0dXJuIGkuaW52b2tlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpc1tlLm5hbWVdLmNhbGwodGhpcywgZS5hcmcpO1xuICAgICAgICB9LCBpLmNvbmZpZ3VyZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gZS5wYXRoO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmFja0V2ZW50cygpLCB0aGlzLmhhc1JlbG9hZGVkT25EZWNvZGVFcnJvciA9ICExLCB0aGlzLmhhc1BsYXllZFNyYyA9ICExLCB0aGlzLnZpZGVvLnNyYyA9IHQ7XG4gICAgICAgIH0sIGkucGxheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIF8kZSA9IHRoaXMsIHQgPSB0aGlzLnZpZGVvLmJ1ZmZlcmVkO1xuICAgICAgICAgICAgaWYgKHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBpID0gdC5zdGFydCh0Lmxlbmd0aCAtIDEpLCBuID0gdC5lbmQodC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvLmR1cmF0aW9uID09PSAxIC8gMCAmJiAobiA8IHRoaXMudmlkZW8uY3VycmVudFRpbWUgfHwgdGhpcy52aWRlby5jdXJyZW50VGltZSA8IGkpICYmICh0aGlzLmxpc3RlbmVyLm9uU2lua0dhcEp1bXAoaSAtIHRoaXMudmlkZW8uY3VycmVudFRpbWUpLCBjb25zb2xlLndhcm4oXCJNb3ZpbmcgdG8gYnVmZmVyZWQgcmVnaW9uXCIpLCB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lID0gaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBhdXNlZCA9ICExLCB0aGlzLmF0dGVtcHRpbmdUb1BsYXkgPSAhMCwgUHJvbWlzZS5yZXNvbHZlKHRoaXMudmlkZW8ucGxheSgpKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIF8kZS5hdHRlbXB0aW5nVG9QbGF5ID0gITEsIF8kZS5oYXNQbGF5ZWRTcmMgPSAhMDtcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIF8kZS5hdHRlbXB0aW5nVG9QbGF5ID0gITEsIF8kZS5jaGVja1N0b3BwZWQoITApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGkucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGUucHJvdG90eXBlLnBhdXNlLmNhbGwodGhpcyksIGNsZWFyVGltZW91dCh0aGlzLmludGVydmFsSWQpO1xuICAgICAgICB9LCBpLnNlZWtUbyA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW8uY3VycmVudFRpbWUgPSBlO1xuICAgICAgICB9LCBpLnNldFZvbHVtZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW8udm9sdW1lID0gZTtcbiAgICAgICAgfSwgaS5nZXRWb2x1bWUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZGVvLnZvbHVtZTtcbiAgICAgICAgfSwgaS5idWZmZXJlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGsodGhpcy52aWRlby5idWZmZXJlZCwgdGhpcy52aWRlby5jdXJyZW50VGltZSwgbCk7XG4gICAgICAgIH0sIGkuZGVjb2RlZEZyYW1lcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGcodGhpcy52aWRlbyk7XG4gICAgICAgIH0sIGkuZHJvcHBlZEZyYW1lcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHkodGhpcy52aWRlbyk7XG4gICAgICAgIH0sIGkuZnJhbWVyYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mcHM7XG4gICAgICAgIH0sIGkuZGVsZXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBlLnByb3RvdHlwZS5kZWxldGUuY2FsbCh0aGlzKSwgdGhpcy5yZW1vdmVUcmFja0xpc3RlbmVycygpLCB0aGlzLnZpZGVvLnNyYyA9IFwiXCIsIHRoaXMudmlkZW8ubG9hZCgpO1xuICAgICAgICB9LCBpLmlzTXV0ZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZGVvLm11dGVkO1xuICAgICAgICB9LCBpLnNldE11dGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy52aWRlby5tdXRlZCA9IGU7XG4gICAgICAgIH0sIGkuZ2V0RGlzcGxheVdpZHRoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aWRlby5jbGllbnRXaWR0aDtcbiAgICAgICAgfSwgaS5nZXREaXNwbGF5SGVpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aWRlby5jbGllbnRIZWlnaHQ7XG4gICAgICAgIH0sIGkuZ2V0UGxheWJhY2tSYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aWRlby5wbGF5YmFja1JhdGU7XG4gICAgICAgIH0sIGkuZ2V0Q3VycmVudFRpbWUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lO1xuICAgICAgICB9LCBpLmJ1ZmZlckR1cmF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgXyRlID0gdGhpcy5idWZmZXJlZCgpLCB0ID0gXyRlLnN0YXJ0O1xuICAgICAgICAgICAgcmV0dXJuIF8kZS5lbmQgLSBNYXRoLm1heCh0LCB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTtcbiAgICAgICAgfSwgaS5jYXB0dXJlR2VzdHVyZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHRoaXMudmlkZW8ucGxheSgpKS5jYXRjaChmdW5jdGlvbigpIHt9KSwgdGhpcy52aWRlby5wYXVzZSgpO1xuICAgICAgICB9LCBpLmFkZFRyYWNrTGlzdGVuZXIgPSBmdW5jdGlvbihlLCB0LCBpKSB7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlcnNGb3JUcmFja0V2ZW50cy5wdXNoKGIoaSwgZSwgdCkpO1xuICAgICAgICB9LCBpLnJlbW92ZVRyYWNrTGlzdGVuZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlcnNGb3JUcmFja0V2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGkuY2hlY2tUcmFja3NTdGF0dXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZvcih2YXIgXyRlID0gdGhpcy52aWRlby50ZXh0VHJhY2tzLCB0ID0gMDsgdCA8IF8kZS5sZW5ndGg7IHQrKyl7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBfJGVbdF07XG4gICAgICAgICAgICAgICAgXCJtZXRhZGF0YVwiID09PSBpLmtpbmQgJiYgXCJkaXNhYmxlZFwiID09PSBpLm1vZGUgJiYgKGkubW9kZSA9IFwiaGlkZGVuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBpLmhhbmRsZUN1ZUNoYW5nZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gdGhpcywgaSA9IG5ldyBTZXQ7XG4gICAgICAgICAgICB0aGlzLmFkZFRyYWNrTGlzdGVuZXIoXCJjdWVjaGFuZ2VcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIG4sIHIgPSBudWxsICE9IChuID0gZS5hY3RpdmVDdWVzKSA/IG4gOiBbXTtcbiAgICAgICAgICAgICAgICBpZiAoci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcih2YXIgbyA9IG5ldyBTZXQsIHMgPSAwOyBzIDwgci5sZW5ndGg7ICsrcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHJbc107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkuaGFzKGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBhLnR5cGUsIGMgPSBhLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcIm9yZy5pZDNcIiA9PT0gdSAmJiBjICYmIChcIlRYWFhcIiA9PT0gYy5rZXkgJiYgXCJzZWdtZW50bWV0YWRhdGFcIiAhPT0gYy5pbmZvIHx8IFwiUFJJVlwiID09PSBjLmtleSAmJiBjLmluZm8gPT09IEYuTUVUQURBVEFfSUQgfHwgXCJQUklWXCIgPT09IGMua2V5ICYmIGMuaW5mbyA9PT0gRi5JTkJBTkRfTUVUQURBVEFfSUQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gXCJQUklWXCIgPT09IGMua2V5ID8gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIikuZGVjb2RlKGMuZGF0YSkgOiBjLmRhdGEgfHwgXCJcIiwgaCA9IGMuaW5mbyB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmxpc3RlbmVyLm9uUGFzc3Rocm91Z2hTaW5rTWV0YWRhdGEoYS5zdGFydFRpbWUsIGEuZW5kVGltZSwgZCwgaCwgaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgby5hZGQoYSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSA9IG87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZSk7XG4gICAgICAgIH0sIGkuaGFuZGxlVHJhY2tFdmVudHMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBfJGUgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUcmFja0xpc3RlbmVycygpLCB2b2lkIDAgPT09IHdpbmRvdy5EYXRhQ3VlICYmIHZvaWQgMCA9PT0gd2luZG93LldlYktpdERhdGFDdWUgfHwgKHRoaXMuYWRkVHJhY2tMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBfJGUuY2hlY2tUcmFja3NTdGF0dXMoKTtcbiAgICAgICAgICAgIH0sIHRoaXMudmlkZW8udGV4dFRyYWNrcyksIHRoaXMuYWRkVHJhY2tMaXN0ZW5lcihcImFkZHRyYWNrXCIsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IHQudHJhY2s7XG4gICAgICAgICAgICAgICAgXCJtZXRhZGF0YVwiID09PSBpLmtpbmQgJiYgXCJkaXNhYmxlZFwiID09PSBpLm1vZGUgJiYgKGkubW9kZSA9IFwiaGlkZGVuXCIsIF8kZS5oYW5kbGVDdWVDaGFuZ2UoaSkpO1xuICAgICAgICAgICAgfSwgdGhpcy52aWRlby50ZXh0VHJhY2tzKSk7XG4gICAgICAgIH0sIGkub25WaWRlb1dhaXRpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBfJGUgPSB0aGlzO1xuICAgICAgICAgICAgaWYgKGsodGhpcy52aWRlby5idWZmZXJlZCwgdGhpcy52aWRlby5jdXJyZW50VGltZSwgbCkuZW5kIC0gdGhpcy52aWRlby5jdXJyZW50VGltZSA8IGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9uU2lua0lkbGUoKSwgY2xlYXJUaW1lb3V0KHRoaXMuYnVmZmVyaW5nVGltZW91dElkKSwgdGhpcy5idWZmZXJpbmdUaW1lb3V0SWQgPSBzZWxmLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIF8kZS5saXN0ZW5lci5vblNpbmtFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IG8sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkJ1ZmZlcmluZyB0aW1lb3V0XCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgbSk7XG4gICAgICAgICAgICAgICAgdmFyIHQgPSBiKHRoaXMudmlkZW8sIFwidGltZXVwZGF0ZVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdCgpLCBjbGVhclRpbWVvdXQoXyRlLmJ1ZmZlcmluZ1RpbWVvdXRJZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaSA9IGIodGhpcy52aWRlbywgXCJ0aW1ldXBkYXRlXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIDQgPT09IF8kZS52aWRlby5yZWFkeVN0YXRlICYmIChpKCksIF8kZS5vblZpZGVvUGxheWluZygpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBpLm9uVmlkZW9UaW1lVXBkYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgXyRlID0gdGhpcy5saXN0ZW5lciwgdCA9IHRoaXMudmlkZW87XG4gICAgICAgICAgICBfJGUub25TaW5rVGltZVVwZGF0ZSgpLCBfJGUub25TaW5rVmlkZW9EaXNwbGF5U2l6ZUNoYW5nZWQodC5jbGllbnRXaWR0aCAqIHNlbGYuZGV2aWNlUGl4ZWxSYXRpbywgdC5jbGllbnRIZWlnaHQgKiBzZWxmLmRldmljZVBpeGVsUmF0aW8pO1xuICAgICAgICB9LCBpLm9uVmlkZW9EdXJhdGlvbkNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5vblNpbmtEdXJhdGlvbkNoYW5nZWQodGhpcy52aWRlby5kdXJhdGlvbik7XG4gICAgICAgIH0sIGkub25WaWRlb0Vycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgXyRlID0gdGhpcy52aWRlby5lcnJvciwgdCA9IF8kZS5jb2RlLCBpID0gXyRlLm1lc3NhZ2UsIG4gPSB2b2lkIDAgPT09IGkgPyBcIlwiIDogaSwgciA9IC0xICE9PSB0aGlzLnZpZGVvLnNyYy5pbmRleE9mKFwiLm0zdThcIik7XG4gICAgICAgICAgICBpZiAoNCA9PT0gdCAmJiAhdGhpcy5oYXNQbGF5ZWRTcmMgJiYgcikgcmV0dXJuIGNsZWFyVGltZW91dCh0aGlzLmJ1ZmZlcmluZ1RpbWVvdXRJZCksIHZvaWQgdGhpcy5saXN0ZW5lci5vblNpbmtFcnJvcih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDQwNCxcbiAgICAgICAgICAgICAgICBjb2RlOiA0MDQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAzICE9PSB0IHx8IHRoaXMuaGFzUmVsb2FkZWRPbkRlY29kZUVycm9yID8gdGhpcy5saXN0ZW5lci5vblNpbmtFcnJvcih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHQsXG4gICAgICAgICAgICAgICAgY29kZTogdCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBuXG4gICAgICAgICAgICB9KSA6IHRoaXMuaGFzUmVsb2FkZWRPbkRlY29kZUVycm9yIHx8ICh0aGlzLmhhc1JlbG9hZGVkT25EZWNvZGVFcnJvciA9ICEwLCBjb25zb2xlLndhcm4oXCJSZWxvYWQgdmlkZW8gZWxlbWVudCBvbiBNRURJQV9FUlJfREVDT0RFIDNcIiksIHRoaXMudmlkZW8ubG9hZCgpKTtcbiAgICAgICAgfSwgaS5vblZpZGVvUGxheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIF8kZSA9IHRoaXMsIHQgPSB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lO1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaW50ZXJ2YWxJZCksIHRoaXMuaW50ZXJ2YWxJZCA9IHNlbGYuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXyRlLmhlYXJ0YmVhdCh0KTtcbiAgICAgICAgICAgIH0sIHYpO1xuICAgICAgICB9LCBpLm9uVmlkZW9QYXVzZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaW50ZXJ2YWxJZCksIHRoaXMuYXR0ZW1wdGluZ1RvUGxheSB8fCB0aGlzLmNoZWNrU3RvcHBlZCghMSk7XG4gICAgICAgIH0sIGkub25WaWRlb0VuZGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9uU2lua0VuZGVkKCk7XG4gICAgICAgIH0sIGkub25WaWRlb1BsYXlpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIub25TaW5rUGxheWluZyh0aGlzLnBhdXNlZCksIHRoaXMudHJhY2tGUFMoZyh0aGlzLnZpZGVvKSwgcGVyZm9ybWFuY2Uubm93KCkpLCB0aGlzLnRyYWNrQnVmZmVyVXBkYXRlKGsodGhpcy52aWRlby5idWZmZXJlZCwgdGhpcy52aWRlby5jdXJyZW50VGltZSwgbCkuZW5kKTtcbiAgICAgICAgfSwgaS5vblZpc2liaWxpdHlDaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBfJGUgPSBjKGRvY3VtZW50KS5oaWRkZW47XG4gICAgICAgICAgICBkb2N1bWVudFtfJGVdICYmICh0aGlzLmhhc1JlbG9hZGVkT25EZWNvZGVFcnJvciA9ICExKTtcbiAgICAgICAgfSwgaS5oZWFydGJlYXQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdCwgaSwgbiwgciA9IHRoaXMsIG8gPSB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lO1xuICAgICAgICAgICAgaWYgKG8gPT09IGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodCA9IHRoaXMudmlkZW8sIGwsIG4gPSBrKHQuYnVmZmVyZWQsIHQuY3VycmVudFRpbWUsIC4xKS5lbmQgLSAoaSA9IHQuY3VycmVudFRpbWUpLCAhKHQuZW5kZWQgfHwgdC5kdXJhdGlvbiAtIGkgPCAuMSkgJiYgbiA8IC4xKSByZXR1cm4gdm9pZCB0aGlzLmxpc3RlbmVyLm9uU2lua0lkbGUoKTtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IFModGhpcy52aWRlby5idWZmZXJlZCwgbywgbCk7XG4gICAgICAgICAgICAgICAgcyAhPT0gbyAmJiAoY29uc29sZS53YXJuKFwianVtcGluZyBcIiArIChzIC0gbykgKyBcInMgZ2FwXCIpLCB0aGlzLmxpc3RlbmVyLm9uU2lua0dhcEp1bXAocyAtIHRoaXMudmlkZW8uY3VycmVudFRpbWUpLCB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lID0gcywgbyA9IHRoaXMudmlkZW8uY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pbnRlcnZhbElkID0gc2VsZi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByLmhlYXJ0YmVhdChvKTtcbiAgICAgICAgICAgIH0sIHYpO1xuICAgICAgICB9LCBpLnRyYWNrRlBTID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLCBuID0gZyh0aGlzLnZpZGVvKSwgciA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgdGhpcy5mcHMgPSAobiAtIGUpIC8gKHIgLSB0KSAqIDFlMztcbiAgICAgICAgICAgIHZhciBvID0gYih0aGlzLnZpZGVvLCBcInRpbWV1cGRhdGVcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgbygpLCBpLnRyYWNrRlBTKG4sIHIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGkudHJhY2tCdWZmZXJVcGRhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdCA9IHRoaXMsIGkgPSB0aGlzLmJ1ZmZlcmVkKCkuZW5kO1xuICAgICAgICAgICAgaSAhPT0gZSAmJiB0aGlzLmxpc3RlbmVyLm9uU2lua0J1ZmZlclVwZGF0ZSgpO1xuICAgICAgICAgICAgdmFyIG4gPSBiKHRoaXMudmlkZW8sIFwidGltZXVwZGF0ZVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBuKCksIHQudHJhY2tCdWZmZXJVcGRhdGUoaSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdDtcbiAgICB9KHhlKSwgUWUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiBlKGUsIHQsIGksIG4pIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIgPSBlLCB0aGlzLmFkanVzdG1lbnRzID0gaSwgdGhpcy52aWRlbyA9IHZvaWQgMCwgdGhpcy5kcm1NYW5hZ2VyID0gdm9pZCAwLCB0aGlzLmNvZGVjcyA9IHZvaWQgMCwgdGhpcy5zaW5rID0gdm9pZCAwLCB0aGlzLm9ic2VydmVyID0gdm9pZCAwLCB0aGlzLnJlbW90ZURldmljZXNMaXN0ZW5lciA9IHZvaWQgMCwgdGhpcy52aWRlbyA9IG4gfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpLCB0aGlzLmxpc3RlbmVyID0gZSwgdGhpcy5kcm1NYW5hZ2VyID0gbmV3IEFlKHtcbiAgICAgICAgICAgICAgICB2aWRlbzogdGhpcy52aWRlbyxcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcjogZVxuICAgICAgICAgICAgfSksIHRoaXMuY29kZWNzID0gT2JqZWN0LmNyZWF0ZShudWxsKSwgdGhpcy5zaW5rID0gbmV3IF9lKHRoaXMudmlkZW8pLCB0ICYmICh0aGlzLnJlbW90ZURldmljZXNMaXN0ZW5lciA9IHdlLmxvb2tGb3JSZW1vdGVQbGF5YmFja0RldmljZXModGhpcy5saXN0ZW5lcikpLCB0aGlzLm9ic2VydmVyID0gbmV3IEllKHRoaXMudmlkZW8sIGUpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgdCA9IGUucHJvdG90eXBlO1xuICAgICAgICByZXR1cm4gdC5kZWxldGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpLCBudWxsID09IChlID0gdGhpcy5yZW1vdGVEZXZpY2VzTGlzdGVuZXIpIHx8IGUudGhlbihmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgZSAmJiB3ZS5zdG9wTG9va2luZ0ZvclJlbW90ZVBsYXliYWNrRGV2aWNlcyhlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB0LmNvbmZpZ3VyZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gZS5tb2RlLCBpID0gZS5jb2RlYywgbiA9IGUudHJhY2tJRDtcbiAgICAgICAgICAgIF9pbnN0YW5jZW9mKHRoaXMuc2luaywgX2UpICYmICh0aGlzLnNpbmsgPSBcImNocm9tZWNhc3RcIiA9PT0gdCA/IG5ldyB3ZSh0aGlzLmxpc3RlbmVyKSA6IFwicGFzc3Rocm91Z2hcIiA9PT0gdCA/IG5ldyBxZSh0aGlzLmxpc3RlbmVyLCB0aGlzLnZpZGVvKSA6IFwibXNlLXdvcmtlclwiID09PSB0ID8gbmV3IEZlKHRoaXMubGlzdGVuZXIsIHRoaXMudmlkZW8pIDogbmV3IFdlKHRoaXMubGlzdGVuZXIsIHRoaXMudmlkZW8sIHRoaXMuYWRqdXN0bWVudHMpKSwgaSA/IHRoaXMuY29kZWNzW25dID0gaSA6IGUuY29kZWMgPSB0aGlzLmNvZGVjc1tuXSwgdGhpcy5zaW5rLmNvbmZpZ3VyZShlKTtcbiAgICAgICAgICAgIHZhciByID0gZS5wYXRoLCBvID0gZS5pc1Byb3RlY3RlZDtcbiAgICAgICAgICAgIHIgJiYgbyAmJiB0aGlzLmRybU1hbmFnZXIuY29uZmlndXJlKHIpLCB0aGlzLm9ic2VydmVyLm9uQ29uZmlndXJlKCk7XG4gICAgICAgIH0sIHQuYXBwbHlSUEMgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLnRyYWNrUlBDKGUpLCB0aGlzLnNpbmsuaW52b2tlKGUpO1xuICAgICAgICB9LCB0LmdldEN1cnJlbnRTaW5rID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaW5rO1xuICAgICAgICB9LCB0LnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnNpbmsuZGVsZXRlKCksIHRoaXMuZHJtTWFuYWdlci5yZXNldCgpLCB0aGlzLnNpbmsgPSBuZXcgX2UodGhpcy52aWRlbyksIHRoaXMubGlzdGVuZXIub25TaW5rVGltZVVwZGF0ZSgpLCB0aGlzLmxpc3RlbmVyLm9uU2lua0J1ZmZlclVwZGF0ZSgpO1xuICAgICAgICB9LCB0LnZpZGVvRWxlbWVudCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlkZW87XG4gICAgICAgIH0sIHQuaXNQcm90ZWN0ZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRybU1hbmFnZXIuaXNQcm90ZWN0ZWQoKTtcbiAgICAgICAgfSwgdC5jYXB0dXJlR2VzdHVyZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy52aWRlby5wbGF5ZWQubGVuZ3RoIHx8IHRoaXMuc2luay5jYXB0dXJlR2VzdHVyZSgpO1xuICAgICAgICB9LCB0LmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIudW5zdWJzY3JpYmUoKSwgdGhpcy5kZWxldGUoKTtcbiAgICAgICAgfSwgdC5pc0xvd0xhdGVuY3lDYXBhYmxlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gX2luc3RhbmNlb2YodGhpcy5zaW5rLCBXZSk7XG4gICAgICAgIH0sIHQub25TZWdtZW50RGlzY29udGludWl0eSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5zaW5rLm9uU2VnbWVudERpc2NvbnRpbnVpdHkoKTtcbiAgICAgICAgfSwgZTtcbiAgICB9KCksIFllID0gcmVxdWlyZShcImV2ZW50c1wiKSwgemUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiBlKCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyID0gdm9pZCAwLCB0aGlzLmVtaXR0ZXIgPSBuZXcgWWUuRXZlbnRFbWl0dGVyO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgdCA9IGUucHJvdG90eXBlO1xuICAgICAgICByZXR1cm4gdC5vbiA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci5vbihTdHJpbmcoZSksIHQpO1xuICAgICAgICB9LCB0LnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnJlbW92ZUxpc3RlbmVyKFN0cmluZyhlKSwgdCk7XG4gICAgICAgIH0sIHQuZW1pdCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGZvcih2YXIgdCwgaSA9IGFyZ3VtZW50cy5sZW5ndGgsIG4gPSBuZXcgQXJyYXkoaSA+IDEgPyBpIC0gMSA6IDApLCByID0gMTsgciA8IGk7IHIrKyluW3IgLSAxXSA9IGFyZ3VtZW50c1tyXTtcbiAgICAgICAgICAgICh0ID0gdGhpcy5lbWl0dGVyKS5lbWl0LmFwcGx5KHQsIFtcbiAgICAgICAgICAgICAgICBTdHJpbmcoZSlcbiAgICAgICAgICAgIF0uY29uY2F0KG4pKTtcbiAgICAgICAgfSwgdC5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgfSwgZTtcbiAgICB9KCk7XG4gICAgIWZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZVtlLlNUQVRFX0NIQU5HRUQgPSAwXSA9IFwiU1RBVEVfQ0hBTkdFRFwiLCBlW2UuQ09ORklHVVJFID0gMV0gPSBcIkNPTkZJR1VSRVwiLCBlW2UuUkVTRVQgPSAyXSA9IFwiUkVTRVRcIiwgZVtlLkFERF9DVUUgPSAzXSA9IFwiQUREX0NVRVwiLCBlW2UuR0VUX0RFQ09ERV9JTkZPID0gNF0gPSBcIkdFVF9ERUNPREVfSU5GT1wiLCBlW2UuTUVESUFfU0lOS19SUEMgPSA1XSA9IFwiTUVESUFfU0lOS19SUENcIiwgZVtlLkdFVF9FWFBFUklNRU5UUyA9IDZdID0gXCJHRVRfRVhQRVJJTUVOVFNcIiwgZVtlLkxPR19NRVNTQUdFID0gN10gPSBcIkxPR19NRVNTQUdFXCIsIGVbZS5EQVRBX0NIQU5ORUxfQ1JFQVRFID0gOF0gPSBcIkRBVEFfQ0hBTk5FTF9DUkVBVEVcIiwgZVtlLkRBVEFfQ0hBTk5FTF9DTE9TRSA9IDldID0gXCJEQVRBX0NIQU5ORUxfQ0xPU0VcIiwgZVtlLkRBVEFfQ0hBTk5FTF9TRU5EID0gMTBdID0gXCJEQVRBX0NIQU5ORUxfU0VORFwiLCBlW2UuUlRDX1NFVF9SRU1PVEVfREVTQ1JJUFRJT04gPSAxMV0gPSBcIlJUQ19TRVRfUkVNT1RFX0RFU0NSSVBUSU9OXCIsIGVbZS5QUk9QRVJUWV9DSEFOR0VEID0gMTJdID0gXCJQUk9QRVJUWV9DSEFOR0VEXCIsIGVbZS5CVUZGRVJFRF9SQU5HRVMgPSAxM10gPSBcIkJVRkZFUkVEX1JBTkdFU1wiLCBlW2UuREVTVFJPWSA9IDE0XSA9IFwiREVTVFJPWVwiO1xuICAgIH0oQ2UgfHwgKENlID0ge30pKTtcbiAgICB2YXIgWGUgPSB7XG4gICAgICAgIHJlYnVpbGRNZWRpYVNpbmtPbkNvZGVjQ2hhbmdlOiAhMSxcbiAgICAgICAgcmVidWlsZE1lZGlhU2lua09uU291cmNlUXVhbGl0eUNoYW5nZTogITEsXG4gICAgICAgIHJlYnVpbGRNZWRpYVNpbmtPbkRpc2NvbnRpbnVpdHk6ICExXG4gICAgfSwgSmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgZnVuY3Rpb24gZSh0LCBpKSB7XG4gICAgICAgICAgICB2YXIgbiwgciA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLndvcmtlciA9IHZvaWQgMCwgdGhpcy5pZCA9IHZvaWQgMCwgdGhpcy5lbWl0dGVyID0gdm9pZCAwLCB0aGlzLnNlZWtUaW1lID0gdm9pZCAwLCB0aGlzLnBhdXNlZCA9IHZvaWQgMCwgdGhpcy5pc0xvYWRlZCA9IHZvaWQgMCwgdGhpcy5hdXRvUGxheU9wdGlvbnMgPSB2b2lkIDAsIHRoaXMubWVkaWFTaW5rTWFuYWdlciA9IHZvaWQgMCwgdGhpcy5leHBlcmltZW50cyA9IHZvaWQgMCwgdGhpcy5hZGp1c3RtZW50cyA9IHZvaWQgMCwgdGhpcy5lbmFibGVSZW1vdGVTZWFyY2ggPSB2b2lkIDAsIHRoaXMuaXNRdWFsaXR5U3VwcG9ydGVkID0gdm9pZCAwLCB0aGlzLm9udmlzaWJpbGl0eWNoYW5nZSA9IHZvaWQgMCwgdGhpcy5vbm1lc3NhZ2UgPSB2b2lkIDAsIHRoaXMub25PbmxpbmUgPSB2b2lkIDAsIHRoaXMub25PZmZsaW5lID0gdm9pZCAwLCB0aGlzLnBhdXNlSGlkZGVuU2lsZW50VGFiID0gdm9pZCAwLCB0aGlzLnN0YXRlID0gdm9pZCAwLCB0aGlzLndvcmtlck1lc3NhZ2VQcm9jZXNzb3JzID0gdm9pZCAwLCB0aGlzLnN0YXJ0Q2FwdHVyZSA9IHZvaWQgMCwgdGhpcy5zdG9wQ2FwdHVyZSA9IHZvaWQgMCwgdGhpcy5yZXF1ZXN0Q2FwdHVyZUFuYWx5dGljcyA9IHZvaWQgMCwgdGhpcy53b3JrZXIgPSBpLCB0aGlzLmlkID0gZS5pbnN0YW5jZUlkKyssIHRoaXMuZW1pdHRlciA9IG5ldyB6ZSwgdGhpcy5zZWVrVGltZSA9IG51bGwsIHRoaXMucGF1c2VkID0gITAsIHRoaXMuaXNMb2FkZWQgPSAhMSwgdGhpcy5hdXRvUGxheU9wdGlvbnMgPSBudWxsLCB0aGlzLmlzUXVhbGl0eVN1cHBvcnRlZCA9IHQuaXNRdWFsaXR5U3VwcG9ydGVkIHx8IHUsIHRoaXMub252aXNpYmlsaXR5Y2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHIub25WaXNpYmlsaXR5Q2hhbmdlKCk7XG4gICAgICAgICAgICB9LCB0aGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gci5vbldvcmtlck1lc3NhZ2UoZSk7XG4gICAgICAgICAgICB9LCB0aGlzLm9uT25saW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHIucG9zdE1lc3NhZ2UoXCJvbk9ubGluZVwiKTtcbiAgICAgICAgICAgIH0sIHRoaXMub25PZmZsaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHIucG9zdE1lc3NhZ2UoXCJvbk9mZmxpbmVcIik7XG4gICAgICAgICAgICB9LCB0aGlzLmVuYWJsZVJlbW90ZVNlYXJjaCA9IHQuZW5hYmxlUmVtb3RlU2VhcmNoIHx8ICExO1xuICAgICAgICAgICAgdmFyIG8sIHMgPSBJKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXVzZUhpZGRlblNpbGVudFRhYiA9IHMuY2hyb21lICYmIDYzID09PSBzLm1ham9yIHx8IHMub3BlcmEsIHRoaXMuYWRqdXN0bWVudHMgPSAobyA9IG51bGwgIT0gKG4gPSB0LmFkanVzdG1lbnRzKSA/IG4gOiB7fSwgamUoKSh7fSwgWGUsIG8pKSwgdGhpcy5tZWRpYVNpbmtNYW5hZ2VyID0gbmV3IFFlKHRoaXMsIHRoaXMuZW5hYmxlUmVtb3RlU2VhcmNoLCB0aGlzLmFkanVzdG1lbnRzKSwgdGhpcy5leHBlcmltZW50cyA9IHt9LCB0aGlzLndvcmtlck1lc3NhZ2VQcm9jZXNzb3JzID0gW1xuICAgICAgICAgICAgICAgIFZcbiAgICAgICAgICAgIF0sIFUuaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBhID0gbmV3IFU7XG4gICAgICAgICAgICAgICAgdGhpcy53b3JrZXJNZXNzYWdlUHJvY2Vzc29ycy5wdXNoKGEucHJvY2Vzc29yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgYXZlcmFnZUJpdHJhdGU6IDAsXG4gICAgICAgICAgICAgICAgYmFuZHdpZHRoRXN0aW1hdGU6IDAsXG4gICAgICAgICAgICAgICAgbG9vcGluZzogITEsXG4gICAgICAgICAgICAgICAgYXV0b1F1YWxpdHlNb2RlOiAhMCxcbiAgICAgICAgICAgICAgICB2b2x1bWU6IDEsXG4gICAgICAgICAgICAgICAgbGl2ZUxhdGVuY3k6IDAsXG4gICAgICAgICAgICAgICAgbGl2ZUxvd0xhdGVuY3lFbmFibGVkOiAhMCxcbiAgICAgICAgICAgICAgICBsaXZlTG93TGF0ZW5jeTogITEsXG4gICAgICAgICAgICAgICAgc3RhdGlzdGljczoge31cbiAgICAgICAgICAgIH0sIHRoaXMucmVzZXRTdGF0ZSgpLCB0aGlzLmF0dGFjaEhhbmRsZXJzKCksIHRoaXMucG9zdE1lc3NhZ2UoXCJjcmVhdGVcIiwgW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbXNlU3VwcG9ydGVkOiBCKCksXG4gICAgICAgICAgICAgICAgICAgIGtleVN5c3RlbTogdm9pZCAwICE9PSB0LmtleVN5c3RlbSA/IHQua2V5U3lzdGVtIDogb2UocyksXG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0OiBzLFxuICAgICAgICAgICAgICAgICAgICBjb2RlY3M6IGUuaXNWUDlTdXBwb3J0ZWQoKSA/IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidnAwOVwiXG4gICAgICAgICAgICAgICAgICAgIF0gOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgdGVzdE9ubHk6IHQudGVzdE9ubHksXG4gICAgICAgICAgICAgICAgICAgIHBsYXllckZyYW1ld29yazogdC5wbGF5ZXJGcmFtZXdvcmssXG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkRGlzdElkOiBcIm5wbVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgZS5pc1ZQOVN1cHBvcnRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIEIoKSAmJiBNZWRpYVNvdXJjZS5pc1R5cGVTdXBwb3J0ZWQoJ3ZpZGVvL21wNDtjb2RlY3M9XCJ2cDA5LjAwLjEwLjA4XCInKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHQgPSBlLnByb3RvdHlwZTtcbiAgICAgICAgcmV0dXJuIHQuZGVsZXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgXyRlID0gdGhpcywgdCA9IGMoZG9jdW1lbnQpLnZpc2liaWxpdHlDaGFuZ2U7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHQsIHRoaXMub252aXNpYmlsaXR5Y2hhbmdlKSwgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgdGhpcy5vbk9ubGluZSksIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwib2ZmbGluZVwiLCB0aGlzLm9uT2ZmbGluZSksIHRoaXMuZW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKSwgdGhpcy5lbWl0dGVyLm9uKENlLkRFU1RST1ksIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIF8kZS5tZWRpYVNpbmtNYW5hZ2VyLmRlc3Ryb3koKSwgXyRlLmVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCksIF8kZS53b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgXyRlLm9ubWVzc2FnZSk7XG4gICAgICAgICAgICB9KSwgdGhpcy5wb3N0TWVzc2FnZShcImRlbGV0ZVwiKTtcbiAgICAgICAgfSwgdC5hdHRhY2hIVE1MVmlkZW9FbGVtZW50ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5tZWRpYVNpbmtNYW5hZ2VyICYmIHRoaXMubWVkaWFTaW5rTWFuYWdlci5kZXN0cm95KCksIHRoaXMubWVkaWFTaW5rTWFuYWdlciA9IG5ldyBRZSh0aGlzLCB0aGlzLmVuYWJsZVJlbW90ZVNlYXJjaCwgdGhpcy5hZGp1c3RtZW50cywgZSksIHRoaXMucHJvY2Vzc1ZpZGVvRWxlbWVudEF0dHJpYnV0ZXMoZSk7XG4gICAgICAgIH0sIHQuZ2V0SFRNTFZpZGVvRWxlbWVudCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVkaWFTaW5rTWFuYWdlci52aWRlb0VsZW1lbnQoKTtcbiAgICAgICAgfSwgdC5sb2FkID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgdm9pZCAwID09PSB0ICYmICh0ID0gXCJcIiksIHRoaXMucG9zdE1lc3NhZ2UoXCJsb2FkXCIsIFtcbiAgICAgICAgICAgICAgICBlLFxuICAgICAgICAgICAgICAgIHRcbiAgICAgICAgICAgIF0pLCB0aGlzLmF1dG9QbGF5T3B0aW9ucyAmJiB0aGlzLnBvc3RNZXNzYWdlKFwicGxheUludGVudFwiKTtcbiAgICAgICAgfSwgdC5wbGF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKFwicGxheUludGVudFwiKSwgdGhpcy5tZWRpYVNpbmtNYW5hZ2VyLmNhcHR1cmVHZXN0dXJlKCksIHRoaXMucGF1c2VkID0gITEsIHRoaXMuYXR0ZW1wdFBsYXkoKTtcbiAgICAgICAgfSwgdC5zZXRBdXRvcGxheSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b1BsYXlPcHRpb25zID0gZSA/IHtcbiAgICAgICAgICAgICAgICBhdHRlbXB0TXV0ZWRSZXRyeTogITBcbiAgICAgICAgICAgIH0gOiBudWxsO1xuICAgICAgICB9LCB0LnNldEF1dG9QbGF5T3B0aW9ucyA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b1BsYXlPcHRpb25zID0gZTtcbiAgICAgICAgfSwgdC5nZXRFeHBlcmltZW50cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwZXJpbWVudHM7XG4gICAgICAgIH0sIHQuc2V0RXhwZXJpbWVudCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RXhwZXJpbWVudERhdGEoe1xuICAgICAgICAgICAgICAgIGlkOiBlLFxuICAgICAgICAgICAgICAgIGFzc2lnbm1lbnQ6IHQsXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogMCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdC5zZXRFeHBlcmltZW50RGF0YSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoXCJzZXRFeHBlcmltZW50XCIsIFtcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSwgdC5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5wYXVzZWQgPSAhMCwgdGhpcy5wb3N0TWVzc2FnZShcInBhdXNlXCIpO1xuICAgICAgICB9LCB0LmlzUGF1c2VkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXVzZWQ7XG4gICAgICAgIH0sIHQuc2Vla1RvID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5zZWVrVGltZSA9IGUsIHRoaXMucG9zdE1lc3NhZ2UoXCJzZWVrVG9cIiwgW1xuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LCB0LmlzU2Vla2luZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IHRoaXMuc2Vla1RpbWU7XG4gICAgICAgIH0sIHQuaXNBdXRvcGxheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5hdXRvUGxheU9wdGlvbnM7XG4gICAgICAgIH0sIHQuZ2V0RHVyYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmR1cmF0aW9uO1xuICAgICAgICB9LCB0LmdldFN0YXJ0T2Zmc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5zdGFydE9mZnNldCB8fCAwO1xuICAgICAgICB9LCB0LmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gdGhpcy5zZWVrVGltZSA/IHRoaXMubWVkaWFTaW5rTWFuYWdlci5nZXRDdXJyZW50U2luaygpLmdldEN1cnJlbnRUaW1lKCkgOiB0aGlzLnNlZWtUaW1lO1xuICAgICAgICB9LCB0LmdldEJ1ZmZlcmVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZWRpYVNpbmtNYW5hZ2VyLmdldEN1cnJlbnRTaW5rKCkuYnVmZmVyZWQoKTtcbiAgICAgICAgfSwgdC5nZXRCdWZmZXJlZFJhbmdlcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdE1lc3NhZ2UoXCJ1cGRhdGVCdWZmZXJlZFJhbmdlc1wiLCBbXSksIHRoaXMuc3RhdGUudHJhY2tCdWZmZXJlZFJhbmdlcztcbiAgICAgICAgfSwgdC5nZXRTaW5rQnVmZmVyZWRSYW5nZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBfJGUgPSB0aGlzLm1lZGlhU2lua01hbmFnZXIuZ2V0Q3VycmVudFNpbmsoKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYXVkaW86IF8kZS5nZXRCdWZmZXJlZFJhbmdlcyhcImF1ZGlvXCIpLFxuICAgICAgICAgICAgICAgIHZpZGVvOiBfJGUuZ2V0QnVmZmVyZWRSYW5nZXMoXCJ2aWRlb1wiKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSwgdC5nZXRCdWZmZXJEdXJhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYnVmZmVyZWRQb3NpdGlvbiAtIHRoaXMuZ2V0UG9zaXRpb24oKTtcbiAgICAgICAgfSwgdC5nZXRTdGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuc3RhdGU7XG4gICAgICAgIH0sIHQuZ2V0VmlkZW9XaWR0aCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVkaWFTaW5rTWFuYWdlci52aWRlb0VsZW1lbnQoKS52aWRlb1dpZHRoO1xuICAgICAgICB9LCB0LmdldFZpZGVvSGVpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZWRpYVNpbmtNYW5hZ2VyLnZpZGVvRWxlbWVudCgpLnZpZGVvSGVpZ2h0O1xuICAgICAgICB9LCB0LmdldFZpZGVvRnJhbWVSYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5zdGF0aXN0aWNzLmZyYW1lcmF0ZTtcbiAgICAgICAgfSwgdC5nZXRWaWRlb0JpdFJhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnN0YXRpc3RpY3MuYml0cmF0ZTtcbiAgICAgICAgfSwgdC5nZXRBdmVyYWdlQml0cmF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYXZlcmFnZUJpdHJhdGU7XG4gICAgICAgIH0sIHQuZ2V0QmFuZHdpZHRoRXN0aW1hdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmJhbmR3aWR0aEVzdGltYXRlO1xuICAgICAgICB9LCB0LmdldFBhdGggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnBhdGg7XG4gICAgICAgIH0sIHQuZ2V0UHJvdG9jb2wgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnByb3RvY29sO1xuICAgICAgICB9LCB0LmdldFZlcnNpb24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjEuMTMuMFwiO1xuICAgICAgICB9LCB0LmlzTGl2ZUxvd0xhdGVuY3kgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmxpdmVMb3dMYXRlbmN5RW5hYmxlZCAmJiB0aGlzLnN0YXRlLmxpdmVMb3dMYXRlbmN5O1xuICAgICAgICB9LCB0LmlzTG9vcGluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUubG9vcGluZztcbiAgICAgICAgfSwgdC5zZXRMb2dMZXZlbCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoXCJzZXRMb2dMZXZlbFwiLCBbXG4gICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0sIHQuc2V0TG9vcGluZyA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUubG9vcGluZyA9IGUsIHRoaXMucG9zdE1lc3NhZ2UoXCJzZXRMb29waW5nXCIsIFtcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSwgdC5pc011dGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZWRpYVNpbmtNYW5hZ2VyLmdldEN1cnJlbnRTaW5rKCkuaXNNdXRlZCgpO1xuICAgICAgICB9LCB0LnNldE11dGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5tZWRpYVNpbmtNYW5hZ2VyLmdldEN1cnJlbnRTaW5rKCkuc2V0TXV0ZWQoZSk7XG4gICAgICAgIH0sIHQuc2V0Vm9sdW1lID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS52b2x1bWUgPSBlLCB0aGlzLnBvc3RNZXNzYWdlKFwic2V0Vm9sdW1lXCIsIFtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnZvbHVtZVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0sIHQuZ2V0Vm9sdW1lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS52b2x1bWU7XG4gICAgICAgIH0sIHQuZ2V0UXVhbGl0eSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUucXVhbGl0eTtcbiAgICAgICAgfSwgdC5zZXRRdWFsaXR5ID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgdm9pZCAwID09PSB0ICYmICh0ID0gITEpLCB0aGlzLm1lZGlhU2lua01hbmFnZXIudmlkZW9FbGVtZW50KCkuY29udHJvbHMgfHwgKHRoaXMucG9zdE1lc3NhZ2UoXCJzZXRRdWFsaXR5XCIsIFtcbiAgICAgICAgICAgICAgICBlLFxuICAgICAgICAgICAgICAgIHRcbiAgICAgICAgICAgIF0pLCB0aGlzLnN0YXRlLmF1dG9RdWFsaXR5TW9kZSA9ICExKTtcbiAgICAgICAgfSwgdC5nZXRRdWFsaXRpZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnF1YWxpdGllcztcbiAgICAgICAgfSwgdC5zZXRBdXRoVG9rZW4gPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKFwic2V0QXV0aFRva2VuXCIsIFtcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSwgdC5pc0F1dG9RdWFsaXR5TW9kZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYXV0b1F1YWxpdHlNb2RlO1xuICAgICAgICB9LCB0LnNldEF1dG9RdWFsaXR5TW9kZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuYXV0b1F1YWxpdHlNb2RlID0gZSwgdGhpcy5wb3N0TWVzc2FnZShcInNldEF1dG9RdWFsaXR5TW9kZVwiLCBbXG4gICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0sIHQuc2V0QXV0b0luaXRpYWxCaXRyYXRlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZShcInNldEF1dG9Jbml0aWFsQml0cmF0ZVwiLCBbXG4gICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0sIHQuc2V0QXV0b01heFF1YWxpdHkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKFwic2V0QXV0b01heFF1YWxpdHlcIiwgW1xuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LCB0LnNldEF1dG9NYXhCaXRyYXRlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZShcInNldEF1dG9NYXhCaXRyYXRlXCIsIFtcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSwgdC5zZXRBdXRvTWF4VmlkZW9TaXplID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZShcInNldEF1dG9NYXhWaWRlb1NpemVcIiwgW1xuICAgICAgICAgICAgICAgIGUsXG4gICAgICAgICAgICAgICAgdFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0sIHQuc2V0QXV0b1ZpZXdwb3J0U2l6ZSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoXCJzZXRBdXRvVmlld3BvcnRTaXplXCIsIFtcbiAgICAgICAgICAgICAgICBlLFxuICAgICAgICAgICAgICAgIHRcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LCB0LmdldFBsYXliYWNrUmF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVkaWFTaW5rTWFuYWdlci5nZXRDdXJyZW50U2luaygpLmdldFBsYXliYWNrUmF0ZSgpO1xuICAgICAgICB9LCB0LnNldFBsYXliYWNrUmF0ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1lZGlhU2lua01hbmFnZXIuZ2V0Q3VycmVudFNpbmsoKS5zZXRQbGF5YmFja1JhdGUoZSk7XG4gICAgICAgIH0sIHQuc2V0Q2xpZW50SWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKFwic2V0Q2xpZW50SWRcIiwgW1xuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LCB0LnNldERldmljZUlkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZShcInNldERldmljZUlkXCIsIFtcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSwgdC5zZXRMaXZlU3BlZWRVcFJhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKFwic2V0TGl2ZVNwZWVkVXBSYXRlXCIsIFtcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSwgdC5zZXRQbGF5ZXJUeXBlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZShcInNldFBsYXllclR5cGVcIiwgW1xuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LCB0LnNldExpdmVNYXhMYXRlbmN5ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZShcInNldExpdmVNYXhMYXRlbmN5XCIsIFtcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSwgdC5zZXRMaXZlTG93TGF0ZW5jeUVuYWJsZWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmxpdmVMb3dMYXRlbmN5RW5hYmxlZCA9IGUsIHRoaXMucG9zdE1lc3NhZ2UoXCJzZXRMaXZlTG93TGF0ZW5jeUVuYWJsZWRcIiwgW1xuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LCB0LnNldFJlYnVmZmVyVG9MaXZlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZShcInNldFJlYnVmZmVyVG9MaXZlXCIsIFtcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSwgdC5zZXRWaXNpYmxlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZShcInNldFZpc2libGVcIiwgW1xuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LCB0LnNldEluaXRpYWxCdWZmZXJEdXJhdGlvbiA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoXCJzZXRJbml0aWFsQnVmZmVyRHVyYXRpb25cIiwgW1xuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LCB0LmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIub24oZSwgdCk7XG4gICAgICAgIH0sIHQucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihlLCB0KTtcbiAgICAgICAgfSwgdC5nZXREcm9wcGVkRnJhbWVzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5zdGF0aXN0aWNzLmRyb3BwZWRGcmFtZXM7XG4gICAgICAgIH0sIHQuZ2V0RGVjb2RlZEZyYW1lcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuc3RhdGlzdGljcy5kZWNvZGVkRnJhbWVzO1xuICAgICAgICB9LCB0LmdldERpc3BsYXlXaWR0aCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVkaWFTaW5rTWFuYWdlci5nZXRDdXJyZW50U2luaygpLmdldERpc3BsYXlXaWR0aCgpO1xuICAgICAgICB9LCB0LmdldERpc3BsYXlIZWlnaHQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1lZGlhU2lua01hbmFnZXIuZ2V0Q3VycmVudFNpbmsoKS5nZXREaXNwbGF5SGVpZ2h0KCk7XG4gICAgICAgIH0sIHQuZ2V0U2Vzc2lvbklkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5zZXNzaW9uSWQ7XG4gICAgICAgIH0sIHQuZ2V0U2Vzc2lvbkRhdGEgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnNlc3Npb25EYXRhO1xuICAgICAgICB9LCB0LmdldExpdmVMYXRlbmN5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5saXZlTGF0ZW5jeTtcbiAgICAgICAgfSwgdC5pc1Byb3RlY3RlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVkaWFTaW5rTWFuYWdlci5pc1Byb3RlY3RlZCgpO1xuICAgICAgICB9LCB0LnN0YXJ0UmVtb3RlUGxheWJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoXCJzdGFydFJlbW90ZVBsYXliYWNrXCIpO1xuICAgICAgICB9LCB0LmVuZFJlbW90ZVBsYXliYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKFwiZW5kUmVtb3RlUGxheWJhY2tcIik7XG4gICAgICAgIH0sIHQuc2V0UGxhdGZvcm1OYW1lID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZShcInNldFBsYXRmb3JtTmFtZVwiLCBbXG4gICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0sIHQuc2V0UmVxdWVzdENyZWRlbnRpYWxzID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZShcInNldFJlcXVlc3RDcmVkZW50aWFsc1wiLCBbXG4gICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0sIHQuc2V0U2lua1R5cGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKFwic2V0U2lua1R5cGVcIiwgW1xuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LCB0Lm9uU2lua1RpbWVVcGRhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBfJGUgPSB0aGlzLm1lZGlhU2lua01hbmFnZXIuZ2V0Q3VycmVudFNpbmsoKTtcbiAgICAgICAgICAgIG51bGwgPT09IHRoaXMuc2Vla1RpbWUgJiYgKHRoaXMucG9zdE1lc3NhZ2UoXCJvbkNsaWVudFNpbmtVcGRhdGVcIiwgW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRpbWU6IF8kZS5nZXRDdXJyZW50VGltZSgpLFxuICAgICAgICAgICAgICAgICAgICBkZWNvZGVkRnJhbWVzOiBfJGUuZGVjb2RlZEZyYW1lcygpLFxuICAgICAgICAgICAgICAgICAgICBkcm9wcGVkRnJhbWVzOiBfJGUuZHJvcHBlZEZyYW1lcygpLFxuICAgICAgICAgICAgICAgICAgICBmcmFtZXJhdGU6IF8kZS5mcmFtZXJhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyRHVyYXRpb246IF8kZS5idWZmZXJEdXJhdGlvbigpLFxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0OiBfJGUuZ2V0RGlzcGxheUhlaWdodCgpLFxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGg6IF8kZS5nZXREaXNwbGF5V2lkdGgoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0pLCB0aGlzLmVtaXR0ZXIuZW1pdChDLlRJTUVfVVBEQVRFLCBfJGUuZ2V0Q3VycmVudFRpbWUoKSkpO1xuICAgICAgICB9LCB0Lm9uU2lua0J1ZmZlclVwZGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLmVtaXQoQy5CVUZGRVJfVVBEQVRFKTtcbiAgICAgICAgfSwgdC5vblNpbmtEdXJhdGlvbkNoYW5nZWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKFwib25DbGllbnRTaW5rRHVyYXRpb25DaGFuZ2VkXCIsIFtcbiAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSwgdC5vblNpbmtFbmRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZShcIm9uQ2xpZW50U2lua0VuZGVkXCIpO1xuICAgICAgICB9LCB0Lm9uU2lua0lkbGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoXCJvbkNsaWVudFNpbmtJZGxlXCIpO1xuICAgICAgICB9LCB0Lm9uU2lua1BsYXlpbmcgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKFwib25DbGllbnRTaW5rUGxheWluZ1wiKSwgZSAmJiB0aGlzLnBsYXkoKTtcbiAgICAgICAgfSwgdC5vblNpbmtTdG9wID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQsIGksIG4gPSBjKGRvY3VtZW50KS5oaWRkZW47XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnRbbl0pIHRoaXMucG9zdE1lc3NhZ2UoXCJwYXVzZVwiKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNNdXRlZCgpICYmIChudWxsID09ICh0ID0gbnVsbCA9PSAoaSA9IHRoaXMuYXV0b1BsYXlPcHRpb25zKSA/IHZvaWQgMCA6IGkuYXR0ZW1wdE11dGVkUmV0cnkpIHx8IHQpKSByZXR1cm4gdGhpcy5zZXRNdXRlZCghMCksIHRoaXMubWVkaWFTaW5rTWFuYWdlci5nZXRDdXJyZW50U2luaygpLnBsYXkoKSwgdm9pZCB0aGlzLmVtaXR0ZXIuZW1pdChDLkFVRElPX0JMT0NLRUQpO1xuICAgICAgICAgICAgICAgIHRoaXMucGF1c2UoKSwgdGhpcy5lbWl0dGVyLmVtaXQoQy5QTEFZQkFDS19CTE9DS0VEKTtcbiAgICAgICAgICAgIH0gZWxzZSB0aGlzLnBhdXNlKCk7XG4gICAgICAgIH0sIHQub25TaW5rUmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoXCJvbkNsaWVudFNpbmtSZXNldFwiKTtcbiAgICAgICAgfSwgdC5vblNpbmtFcnJvciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gZS52YWx1ZSwgaSA9IGUuY29kZSwgbiA9IGUubWVzc2FnZTtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoXCJvbkNsaWVudFNpbmtFcnJvclwiLCBbXG4gICAgICAgICAgICAgICAgdCxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIG5cbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LCB0Lm9uU2lua1JlY292ZXJhYmxlRXJyb3IgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdCA9IGUudmFsdWUsIGkgPSBlLmNvZGUsIG4gPSBlLm1lc3NhZ2U7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKFwib25DbGllbnRTaW5rUmVjb3ZlcmFibGVFcnJvclwiLCBbXG4gICAgICAgICAgICAgICAgdCxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIG5cbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LCB0Lm9uU2lua1ZpZGVvRGlzcGxheVNpemVDaGFuZ2VkID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgdGhpcy5zZXRBdXRvVmlld3BvcnRTaXplKGUsIHQpO1xuICAgICAgICB9LCB0Lm9uU2lua1ZvbHVtZUNoYW5nZWQgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICB0aGlzLm1lZGlhU2lua01hbmFnZXIudmlkZW9FbGVtZW50KCkuY29udHJvbHMgJiYgdCAmJiB0aGlzLnNldFZvbHVtZShlKSwgdGhpcy5lbWl0dGVyLmVtaXQoQy5WT0xVTUVfQ0hBTkdFRCwgdGhpcy5zdGF0ZS52b2x1bWUpO1xuICAgICAgICB9LCB0Lm9uU2lua011dGVkQ2hhbmdlZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoXCJzZXRNdXRlZFwiLCBbXG4gICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgXSksIHRoaXMuZW1pdHRlci5lbWl0KEMuTVVURURfQ0hBTkdFRCk7XG4gICAgICAgIH0sIHQub25TaW5rUGxheWJhY2tSYXRlQ2hhbmdlZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoXCJzZXRQbGF5YmFja1JhdGVcIiwgW1xuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LCB0Lm9uUGFzc3Rocm91Z2hTaW5rTWV0YWRhdGEgPSBmdW5jdGlvbihlLCB0LCBpLCBuLCByKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdChDLlRFWFRfTUVUQURBVEFfQ1VFLCB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IG4sXG4gICAgICAgICAgICAgICAgZW5kVGltZTogdCxcbiAgICAgICAgICAgICAgICBzdGFydFRpbWU6IGUsXG4gICAgICAgICAgICAgICAgdGV4dDogaSxcbiAgICAgICAgICAgICAgICBvd25lcjogcixcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlRleHRNZXRhZGF0YUN1ZVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdC5vblNpbmtDb250cm9sc0NoYW5nZWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKFwic2V0Q29udHJvbHNcIiwgW1xuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LCB0Lm9uU2lua0dhcEp1bXAgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKFwib25DbGllbnRTaW5rR2FwSnVtcFwiLCBbXG4gICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0sIHQub25SZW1vdGVEZXZpY2UgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdChlID8gRy5BVkFJTEFCTEUgOiBHLlVOQVZBSUxBQkxFKTtcbiAgICAgICAgfSwgdC5vblJlbW90ZVJlY29ubmVjdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydFJlbW90ZVBsYXliYWNrKCk7XG4gICAgICAgIH0sIHQub25TZXNzaW9uRXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoXCJvbkNsaWVudFNpbmtFcnJvclwiLCBbXG4gICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIFwiQ2hyb21lY2FzdCBzZXNzaW9uIGVycm9yXCJcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LCB0Lm9uTG9hZE1lZGlhRXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoXCJvbkNsaWVudFNpbmtFcnJvclwiLCBbXG4gICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIFwiQ2hyb21lY2FzdCBsb2FkIG1lZGlhIGZhaWxlZFwiXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSwgdC5vblVzZXJDYW5jZWwgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kUmVtb3RlUGxheWJhY2soKSwgdGhpcy5lbWl0dGVyLmVtaXQoRy5TRVNTSU9OX0VOREVEKTtcbiAgICAgICAgfSwgdC5vblNlZ21lbnREaXNjb250aW51aXR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLm1lZGlhU2lua01hbmFnZXIub25TZWdtZW50RGlzY29udGludWl0eSgpO1xuICAgICAgICB9LCB0Lm9uU2Vzc2lvblN0b3AgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kUmVtb3RlUGxheWJhY2soKSwgdGhpcy5lbWl0dGVyLmVtaXQoRy5TRVNTSU9OX0VOREVEKTtcbiAgICAgICAgfSwgdC5vblNlc3Npb25TdGFydGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLmVtaXQoRy5TRVNTSU9OX1NUQVJURUQsIGUpO1xuICAgICAgICB9LCB0LmF0dGVtcHRQbGF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgXyRlID0gYyhkb2N1bWVudCkuaGlkZGVuO1xuICAgICAgICAgICAgIWRvY3VtZW50W18kZV0gJiYgdGhpcy5pc0xvYWRlZCAmJiB0aGlzLnBvc3RNZXNzYWdlKFwicGxheVwiKTtcbiAgICAgICAgfSwgdC5wb3N0TWVzc2FnZSA9IGZ1bmN0aW9uKGUsIHQsIGkpIHtcbiAgICAgICAgICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IFtdKSwgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGZ1bmNOYW1lOiBlLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHRcbiAgICAgICAgICAgIH0sIGkpO1xuICAgICAgICB9LCB0LnJlc2V0U3RhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGEodGhpcy5zdGF0ZSwge1xuICAgICAgICAgICAgICAgIHN0YXRlOiBqLklETEUsXG4gICAgICAgICAgICAgICAgcXVhbGl0eToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgY29kZWNzOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBiaXRyYXRlOiAwLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgICAgICAgICBmcmFtZXJhdGU6IDBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHF1YWxpdGllczogW10sXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDAsXG4gICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQ6IDAsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbkRhdGE6IHt9LFxuICAgICAgICAgICAgICAgIHZvbHVtZTogMSxcbiAgICAgICAgICAgICAgICBzdGF0aXN0aWNzOiB7XG4gICAgICAgICAgICAgICAgICAgIGJpdHJhdGU6IDAsXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lcmF0ZTogMCxcbiAgICAgICAgICAgICAgICAgICAgZHJvcHBlZEZyYW1lczogMCxcbiAgICAgICAgICAgICAgICAgICAgZGVjb2RlRnJhbWVzOiAwLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEZyYW1lczogMFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHJhY2tCdWZmZXJlZFJhbmdlczoge1xuICAgICAgICAgICAgICAgICAgICBhdWRpbzogW10sXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvOiBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLCB0aGlzLmVtaXR0ZXIuZW1pdChDLkRVUkFUSU9OX0NIQU5HRUQsIDApLCB0aGlzLnNlZWtUaW1lID0gbnVsbCwgdGhpcy5pc0xvYWRlZCA9ICExO1xuICAgICAgICB9LCB0LmF0dGFjaEhhbmRsZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgXyRlID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMud29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMub25tZXNzYWdlKTtcbiAgICAgICAgICAgIHZhciB0ID0gYyhkb2N1bWVudCkudmlzaWJpbGl0eUNoYW5nZTtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIodCwgdGhpcy5vbnZpc2liaWxpdHljaGFuZ2UpLCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLCB0aGlzLm9uT25saW5lKSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsIHRoaXMub25PZmZsaW5lKTtcbiAgICAgICAgICAgIHZhciBpID0gdGhpcy5lbWl0dGVyO1xuICAgICAgICAgICAgaS5vbihDLlZPTFVNRV9DSEFOR0VELCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXyRlLm9uVm9sdW1lQ2hhbmdlZCgpO1xuICAgICAgICAgICAgfSksIGkub24oQy5NVVRFRF9DSEFOR0VELCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXyRlLm9uTXV0ZWRDaGFuZ2VkKCk7XG4gICAgICAgICAgICB9KSwgaS5vbihDLlNFRUtfQ09NUExFVEVELCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXyRlLm9uU2Vla0NvbXBsZXRlZCgpO1xuICAgICAgICAgICAgfSksIGkub24oQy5FUlJPUiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF8kZS5vbkVycm9yKCk7XG4gICAgICAgICAgICB9KSwgaS5vbihDLlNFU1NJT05fREFUQSwgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfJGUub25TZXNzaW9uRGF0YSh0KTtcbiAgICAgICAgICAgIH0pLCBpLm9uKEMuU0VHTUVOVF9ESVNDT05USU5VSVRZLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXyRlLm9uU2VnbWVudERpc2NvbnRpbnVpdHkoKTtcbiAgICAgICAgICAgIH0pLCBpLm9uKENlLlNUQVRFX0NIQU5HRUQsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXyRlLm9uU3RhdGVDaGFuZ2VkKHQpO1xuICAgICAgICAgICAgfSksIGkub24oQ2UuTUVESUFfU0lOS19SUEMsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXyRlLm1lZGlhU2lua01hbmFnZXIuYXBwbHlSUEModCk7XG4gICAgICAgICAgICB9KSwgaS5vbihDZS5DT05GSUdVUkUsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICBfJGUubWVkaWFTaW5rTWFuYWdlci5jb25maWd1cmUodCksIF8kZS5zZXRTaW5rVHlwZSh0Lm1vZGUpO1xuICAgICAgICAgICAgfSksIGkub24oQ2UuUkVTRVQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfJGUubWVkaWFTaW5rTWFuYWdlci5yZXNldCgpO1xuICAgICAgICAgICAgfSksIGkub24oSC5JRDMsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXyRlLm9uSUQzKHQpO1xuICAgICAgICAgICAgfSksIGkub24oQ2UuR0VUX0VYUEVSSU1FTlRTLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgXyRlLmV4cGVyaW1lbnRzID0gdDtcbiAgICAgICAgICAgIH0pLCBpLm9uKENlLlBST1BFUlRZX0NIQU5HRUQsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IHQua2V5LCBuID0gdC52YWx1ZTtcbiAgICAgICAgICAgICAgICBfJGUuc3RhdGVbaV0gPSBuO1xuICAgICAgICAgICAgfSksIGkub24oQ2UuQlVGRkVSRURfUkFOR0VTLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgXyRlLnN0YXRlLnRyYWNrQnVmZmVyZWRSYW5nZXMgPSB0O1xuICAgICAgICAgICAgfSksIGkub24oQ2UuTE9HX01FU1NBR0UsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdCA9IGUubGV2ZWwsIGkgPSBlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGVbdF0oaSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdC5vblZvbHVtZUNoYW5nZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBfJGUgPSBjKGRvY3VtZW50KS5oaWRkZW47XG4gICAgICAgICAgICB0aGlzLnBhdXNlSGlkZGVuU2lsZW50VGFiICYmIGRvY3VtZW50W18kZV0gJiYgMCA9PT0gdGhpcy5nZXRWb2x1bWUoKSAmJiB0aGlzLnBvc3RNZXNzYWdlKFwicGF1c2VcIik7XG4gICAgICAgIH0sIHQub25NdXRlZENoYW5nZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBfJGUgPSBjKGRvY3VtZW50KS5oaWRkZW47XG4gICAgICAgICAgICB0aGlzLnBhdXNlSGlkZGVuU2lsZW50VGFiICYmIGRvY3VtZW50W18kZV0gJiYgdGhpcy5pc011dGVkKCkgJiYgdGhpcy5wb3N0TWVzc2FnZShcInBhdXNlXCIpO1xuICAgICAgICB9LCB0Lm9uU2Vla0NvbXBsZXRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5zZWVrVGltZSA9IG51bGw7XG4gICAgICAgIH0sIHQub25FcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5wYXVzZWQgPSAhMDtcbiAgICAgICAgfSwgdC5vblN0YXRlQ2hhbmdlZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gdGhpcztcbiAgICAgICAgICAgIHN3aXRjaChlKXtcbiAgICAgICAgICAgICAgICBjYXNlIGouUkVBRFk6XG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBbXSwgbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdChlKSA/IGkucHVzaChlKSA6IG4ucHVzaChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkOiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkOiBuXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KHRoaXMuc3RhdGUucXVhbGl0aWVzLCB0aGlzLmlzUXVhbGl0eVN1cHBvcnRlZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUucXVhbGl0aWVzID0gaS5zdXBwb3J0ZWQsIGkudW5zdXBwb3J0ZWQuZm9yRWFjaChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wb3N0TWVzc2FnZShcInJlbW92ZVF1YWxpdHlcIiwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5pc0xvYWRlZCA9ICEwLCB0aGlzLmF1dG9QbGF5T3B0aW9ucyAmJiB0aGlzLnBsYXkoKSwgdGhpcy5wYXVzZWQgfHwgdGhpcy5hdHRlbXB0UGxheSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGouRU5ERUQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF1c2VkID0gITA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdChDLlNUQVRFX0NIQU5HRUQsIGUpLCB0aGlzLmVtaXR0ZXIuZW1pdChlKTtcbiAgICAgICAgfSwgdC5vbklEMyA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gdGhpcztcbiAgICAgICAgICAgIGUuZm9yRWFjaChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKFwiVFhYWFwiID09PSBlLmlkICYmIFwic2VnbWVudG1ldGFkYXRhXCIgPT09IGUuZGVzYyAmJiBlLmluZm8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcihcIkZhaWxlZCBKU09OIHBhcnNlOlwiLCBlKSwge307XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0oZS5pbmZvWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLCBcInN0cmVhbV9vZmZzZXRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gTnVtYmVyKGkuc3RyZWFtX29mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc05hTihuKSB8fCAodC5zdGF0ZS5zdGFydE9mZnNldCA9IG4gLSB0LmdldFBvc2l0aW9uKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIHQub25WaXNpYmlsaXR5Q2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgXyRlID0gYyhkb2N1bWVudCkuaGlkZGVuO1xuICAgICAgICAgICAgdGhpcy5wYXVzZWQgfHwgZG9jdW1lbnRbXyRlXSB8fCB0aGlzLmF0dGVtcHRQbGF5KCksIHRoaXMucGF1c2VIaWRkZW5TaWxlbnRUYWIgJiYgIXRoaXMucGF1c2VkICYmIGRvY3VtZW50W18kZV0gJiYgKHRoaXMuaXNNdXRlZCgpIHx8IDAgPT09IHRoaXMuZ2V0Vm9sdW1lKCkpICYmIHRoaXMucG9zdE1lc3NhZ2UoXCJwYXVzZVwiKSwgSSgpLmZpcmVmb3ggfHwgdGhpcy5wb3N0TWVzc2FnZShcInNldFZpc2libGVcIiwgW1xuICAgICAgICAgICAgICAgICFkb2N1bWVudFtfJGVdXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSwgdC5vblNlc3Npb25EYXRhID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgYSh0aGlzLnN0YXRlLCBlKTtcbiAgICAgICAgfSwgdC5vbldvcmtlck1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdCA9IGUuZGF0YTtcbiAgICAgICAgICAgIGlmICh0ICYmIHQuaWQgPT09IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMud29ya2VyTWVzc2FnZVByb2Nlc3NvcnMucmVkdWNlKGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQoZSk7XG4gICAgICAgICAgICAgICAgfSwgdCksIG4gPSBpLnR5cGUsIHIgPSBpLmFyZztcbiAgICAgICAgICAgICAgICB2b2lkIDAgIT09IHQuYXJnID8gdGhpcy5lbWl0dGVyLmVtaXQobiwgcikgOiB0aGlzLmVtaXR0ZXIuZW1pdChuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdC5wcm9jZXNzVmlkZW9FbGVtZW50QXR0cmlidXRlcyA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcImF1dG9wbGF5XCIpICYmIChlLnJlbW92ZUF0dHJpYnV0ZShcImF1dG9wbGF5XCIpLCB0aGlzLnNldEF1dG9wbGF5KCEwKSksIGUuaGFzQXR0cmlidXRlKFwicGxheWJhY2tSYXRlXCIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHQsIGkgPSBwYXJzZUZsb2F0KG51bGwgIT0gKHQgPSBlLmdldEF0dHJpYnV0ZShcInBsYXliYWNrUmF0ZVwiKSkgPyB0IDogXCIxLjBcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihpKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGQoaSwgLjI1LCAyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQbGF5YmFja1JhdGUobik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGUucmVtb3ZlQXR0cmlidXRlKFwicGxheWJhY2tSYXRlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwic3JjXCIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHIgPSBlLnNyYztcbiAgICAgICAgICAgICAgICBoKGUpLCB0aGlzLmxvYWQocik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJsb29wXCIpICYmIChlLnJlbW92ZUF0dHJpYnV0ZShcImxvb3BcIiksIHRoaXMuc2V0TG9vcGluZyghMCkpLCBlLmhhc0F0dHJpYnV0ZShcIm11dGVkXCIpICYmIChlLnJlbW92ZUF0dHJpYnV0ZShcIm11dGVkXCIpLCB0aGlzLnNldE11dGVkKCEwKSksIGUuaGFzQXR0cmlidXRlKFwidm9sdW1lXCIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG8sIHMgPSBwYXJzZUZsb2F0KG51bGwgIT0gKG8gPSBlLmdldEF0dHJpYnV0ZShcInZvbHVtZVwiKSkgPyBvIDogXCIxLjBcIik7XG4gICAgICAgICAgICAgICAgaXNOYU4ocykgfHwgdGhpcy5zZXRWb2x1bWUoZChzLCAwLCAxKSksIGUucmVtb3ZlQXR0cmlidXRlKFwidm9sdW1lXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBlO1xuICAgIH0oKTtcbiAgICBKZS5pbnN0YW5jZUlkID0gMDtcbiAgICB2YXIgWmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiBlKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMud29ya2VyUG9ydCA9IHZvaWQgMCwgdGhpcy5lbWl0dGVyID0gdm9pZCAwLCB0aGlzLm1lc3NhZ2VRdWV1ZSA9IHZvaWQgMCwgdGhpcy53b3JrZXJQb3J0ID0ge1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB0aGlzLnBvc3RNZXNzYWdlRnJvbVdvcmtlci5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICAgIG9ubWVzc2FnZTogZnVuY3Rpb24gb25tZXNzYWdlKCkge31cbiAgICAgICAgICAgIH0sIHRoaXMuZW1pdHRlciA9IG5ldyBZZS5FdmVudEVtaXR0ZXIsIHRoaXMubWVzc2FnZVF1ZXVlID0gbmV3IHMsIHRoaXMubG9hZFNjcmlwdChlLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuYXBwbHlXb3JrZXJFbnYoZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHQgPSBlLnByb3RvdHlwZTtcbiAgICAgICAgcmV0dXJuIHQucG9zdE1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA/IHRoaXMubWVzc2FnZVF1ZXVlLnB1c2goZSkgOiB0aGlzLnBvc3RNZXNzYWdlVG9Xb3JrZXIoZSk7XG4gICAgICAgIH0sIHQuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci5vbihlLCB0KTtcbiAgICAgICAgfSwgdC5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLm9mZihlLCB0KTtcbiAgICAgICAgfSwgdC5vbm1lc3NhZ2UgPSBmdW5jdGlvbigpIHt9LCB0Lm9ubWVzc2FnZWVycm9yID0gZnVuY3Rpb24oKSB7fSwgdC5vbmVycm9yID0gZnVuY3Rpb24oKSB7fSwgdC50ZXJtaW5hdGUgPSBmdW5jdGlvbigpIHt9LCB0LmRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgfSwgdC5sb2FkU2NyaXB0ID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLCBuID0gbmV3IFhNTEh0dHBSZXF1ZXN0O1xuICAgICAgICAgICAgbi5vcGVuKFwiR0VUXCIsIGUpLCBuLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIG4uc3RhdHVzID49IDIwMCAmJiBuLnN0YXR1cyA8IDQwMCA/IHQobi5yZXNwb25zZSkgOiBpLmVtaXR0ZXIuZW1pdChcImVycm9yXCIsIG5ldyBFcnJvcihuLnN0YXR1c1RleHQpKTtcbiAgICAgICAgICAgIH0pLCBuLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaS5lbWl0dGVyLmVtaXQoXCJlcnJvclwiLCBlKTtcbiAgICAgICAgICAgIH0pLCBuLnNlbmQoKTtcbiAgICAgICAgfSwgdC5hcHBseVdvcmtlckVudiA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1lc3NhZ2VRdWV1ZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uKFwic2VsZlwiLCBcIm1lc3NhZ2VIYW5kbGVyXCIsIGUpKHdpbmRvdywgdGhpcy53b3JrZXJQb3J0KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXR0ZXIuZW1pdChcImVycm9yXCIsIGUxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yKDsgIXRoaXMubWVzc2FnZVF1ZXVlLmVtcHR5KCk7KXRoaXMucG9zdE1lc3NhZ2VUb1dvcmtlcih0aGlzLm1lc3NhZ2VRdWV1ZS5wb3AoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlUXVldWUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0LnBvc3RNZXNzYWdlRnJvbVdvcmtlciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gdGhpcztcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdC5lbWl0dGVyLmVtaXQoXCJtZXNzYWdlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0sIHQucG9zdE1lc3NhZ2VUb1dvcmtlciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gdGhpcztcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdC53b3JrZXJQb3J0Lm9ubWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9LCBlO1xuICAgIH0oKTtcbiAgICB2YXIgZXQgPSBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiB3aW5kb3cgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2Ygd2luZG93LldlYkFzc2VtYmx5ICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2Ygd2luZG93LldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlLCB0dCA9IGV0O1xuICAgIHZhciBudCwgcnQsIG90LCBzdCwgYXQsIHV0LCBjdCwgZHQsIGh0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlID0gZnVuY3Rpb24gZShlLCB0KSB7XG4gICAgICAgICAgICB0aGlzLmNvcmUgPSB2b2lkIDAsIHRoaXMuc3RhcnRDYXB0dXJlID0gdm9pZCAwLCB0aGlzLnN0b3BDYXB0dXJlID0gdm9pZCAwLCB0aGlzLnJlcXVlc3RDYXB0dXJlQW5hbHl0aWNzID0gdm9pZCAwLCB0aGlzLmNvcmUgPSBuZXcgSmUoZSwgdCk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciB0ID0gZS5wcm90b3R5cGU7XG4gICAgICAgIHJldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIG51bGwgPT0gKGkgPSB0aGlzLmNoZWNrQ29yZSgpKSB8fCBpLmFkZEV2ZW50TGlzdGVuZXIoZSwgdCk7XG4gICAgICAgIH0sIHQuYXR0YWNoSFRNTFZpZGVvRWxlbWVudCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0O1xuICAgICAgICAgICAgbnVsbCA9PSAodCA9IHRoaXMuY2hlY2tDb3JlKCkpIHx8IHQuYXR0YWNoSFRNTFZpZGVvRWxlbWVudChlKTtcbiAgICAgICAgfSwgdC5kZWxldGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgbnVsbCA9PSAoZSA9IHRoaXMuY2hlY2tDb3JlKCkpIHx8IGUuZGVsZXRlKCksIHRoaXMuY29yZSA9IG51bGw7XG4gICAgICAgIH0sIHQuZW5kUmVtb3RlUGxheWJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgbnVsbCA9PSAoZSA9IHRoaXMuY2hlY2tDb3JlKCkpIHx8IGUuZW5kUmVtb3RlUGxheWJhY2soKTtcbiAgICAgICAgfSwgdC5pc0F1dG9wbGF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmlzQXV0b3BsYXkoKTtcbiAgICAgICAgfSwgdC5pc0F1dG9RdWFsaXR5TW9kZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSAoZSA9IHRoaXMuY2hlY2tDb3JlKCkpID8gdm9pZCAwIDogZS5pc0F1dG9RdWFsaXR5TW9kZSgpO1xuICAgICAgICB9LCB0LmdldEF2ZXJhZ2VCaXRyYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmdldEF2ZXJhZ2VCaXRyYXRlKCk7XG4gICAgICAgIH0sIHQuZ2V0QmFuZHdpZHRoRXN0aW1hdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gKGUgPSB0aGlzLmNoZWNrQ29yZSgpKSA/IHZvaWQgMCA6IGUuZ2V0QmFuZHdpZHRoRXN0aW1hdGUoKTtcbiAgICAgICAgfSwgdC5nZXRCdWZmZXJEdXJhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSAoZSA9IHRoaXMuY2hlY2tDb3JlKCkpID8gdm9pZCAwIDogZS5nZXRCdWZmZXJEdXJhdGlvbigpO1xuICAgICAgICB9LCB0LmdldEJ1ZmZlcmVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmdldEJ1ZmZlcmVkKCk7XG4gICAgICAgIH0sIHQuZ2V0QnVmZmVyZWRSYW5nZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gKGUgPSB0aGlzLmNoZWNrQ29yZSgpKSA/IHZvaWQgMCA6IGUuZ2V0QnVmZmVyZWRSYW5nZXMoKTtcbiAgICAgICAgfSwgdC5nZXRTaW5rQnVmZmVyZWRSYW5nZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gKGUgPSB0aGlzLmNoZWNrQ29yZSgpKSA/IHZvaWQgMCA6IGUuZ2V0U2lua0J1ZmZlcmVkUmFuZ2VzKCk7XG4gICAgICAgIH0sIHQuZ2V0RGVjb2RlZEZyYW1lcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSAoZSA9IHRoaXMuY2hlY2tDb3JlKCkpID8gdm9pZCAwIDogZS5nZXREZWNvZGVkRnJhbWVzKCk7XG4gICAgICAgIH0sIHQuZ2V0RGlzcGxheUhlaWdodCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSAoZSA9IHRoaXMuY2hlY2tDb3JlKCkpID8gdm9pZCAwIDogZS5nZXREaXNwbGF5SGVpZ2h0KCk7XG4gICAgICAgIH0sIHQuZ2V0RGlzcGxheVdpZHRoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmdldERpc3BsYXlXaWR0aCgpO1xuICAgICAgICB9LCB0LmdldERyb3BwZWRGcmFtZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gKGUgPSB0aGlzLmNoZWNrQ29yZSgpKSA/IHZvaWQgMCA6IGUuZ2V0RHJvcHBlZEZyYW1lcygpO1xuICAgICAgICB9LCB0LmdldER1cmF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmdldER1cmF0aW9uKCk7XG4gICAgICAgIH0sIHQuZ2V0RXhwZXJpbWVudHMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gKGUgPSB0aGlzLmNoZWNrQ29yZSgpKSA/IHZvaWQgMCA6IGUuZ2V0RXhwZXJpbWVudHMoKTtcbiAgICAgICAgfSwgdC5nZXRIVE1MVmlkZW9FbGVtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmdldEhUTUxWaWRlb0VsZW1lbnQoKTtcbiAgICAgICAgfSwgdC5nZXRMaXZlTGF0ZW5jeSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSAoZSA9IHRoaXMuY2hlY2tDb3JlKCkpID8gdm9pZCAwIDogZS5nZXRMaXZlTGF0ZW5jeSgpO1xuICAgICAgICB9LCB0LmdldFBhdGggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gKGUgPSB0aGlzLmNoZWNrQ29yZSgpKSA/IHZvaWQgMCA6IGUuZ2V0UGF0aCgpO1xuICAgICAgICB9LCB0LmdldFByb3RvY29sID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmdldFByb3RvY29sKCk7XG4gICAgICAgIH0sIHQuZ2V0UGxheWJhY2tSYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmdldFBsYXliYWNrUmF0ZSgpO1xuICAgICAgICB9LCB0LmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmdldFBvc2l0aW9uKCk7XG4gICAgICAgIH0sIHQuZ2V0UXVhbGl0aWVzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmdldFF1YWxpdGllcygpO1xuICAgICAgICB9LCB0LmdldFF1YWxpdHkgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gKGUgPSB0aGlzLmNoZWNrQ29yZSgpKSA/IHZvaWQgMCA6IGUuZ2V0UXVhbGl0eSgpO1xuICAgICAgICB9LCB0LmdldFNlc3Npb25EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmdldFNlc3Npb25EYXRhKCk7XG4gICAgICAgIH0sIHQuZ2V0U2Vzc2lvbklkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmdldFNlc3Npb25JZCgpO1xuICAgICAgICB9LCB0LmdldFN0YXJ0T2Zmc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmdldFN0YXJ0T2Zmc2V0KCk7XG4gICAgICAgIH0sIHQuZ2V0U3RhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gKGUgPSB0aGlzLmNoZWNrQ29yZSgpKSA/IHZvaWQgMCA6IGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgfSwgdC5nZXRWZXJzaW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmdldFZlcnNpb24oKTtcbiAgICAgICAgfSwgdC5nZXRWaWRlb0JpdFJhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gKGUgPSB0aGlzLmNoZWNrQ29yZSgpKSA/IHZvaWQgMCA6IGUuZ2V0VmlkZW9CaXRSYXRlKCk7XG4gICAgICAgIH0sIHQuZ2V0VmlkZW9GcmFtZVJhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gKGUgPSB0aGlzLmNoZWNrQ29yZSgpKSA/IHZvaWQgMCA6IGUuZ2V0VmlkZW9GcmFtZVJhdGUoKTtcbiAgICAgICAgfSwgdC5nZXRWaWRlb0hlaWdodCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSAoZSA9IHRoaXMuY2hlY2tDb3JlKCkpID8gdm9pZCAwIDogZS5nZXRWaWRlb0hlaWdodCgpO1xuICAgICAgICB9LCB0LmdldFZpZGVvV2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gKGUgPSB0aGlzLmNoZWNrQ29yZSgpKSA/IHZvaWQgMCA6IGUuZ2V0VmlkZW9XaWR0aCgpO1xuICAgICAgICB9LCB0LmdldFZvbHVtZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSAoZSA9IHRoaXMuY2hlY2tDb3JlKCkpID8gdm9pZCAwIDogZS5nZXRWb2x1bWUoKTtcbiAgICAgICAgfSwgdC5pc0xpdmVMb3dMYXRlbmN5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgPyB2b2lkIDAgOiBlLmlzTGl2ZUxvd0xhdGVuY3koKTtcbiAgICAgICAgfSwgdC5pc0xvb3BpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gKGUgPSB0aGlzLmNoZWNrQ29yZSgpKSA/IHZvaWQgMCA6IGUuaXNMb29waW5nKCk7XG4gICAgICAgIH0sIHQuaXNNdXRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSAoZSA9IHRoaXMuY2hlY2tDb3JlKCkpID8gdm9pZCAwIDogZS5pc011dGVkKCk7XG4gICAgICAgIH0sIHQuaXNQYXVzZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gKGUgPSB0aGlzLmNoZWNrQ29yZSgpKSA/IHZvaWQgMCA6IGUuaXNQYXVzZWQoKTtcbiAgICAgICAgfSwgdC5pc1Byb3RlY3RlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSAoZSA9IHRoaXMuY2hlY2tDb3JlKCkpID8gdm9pZCAwIDogZS5pc1Byb3RlY3RlZCgpO1xuICAgICAgICB9LCB0LmlzU2Vla2luZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSAoZSA9IHRoaXMuY2hlY2tDb3JlKCkpID8gdm9pZCAwIDogZS5pc1NlZWtpbmcoKTtcbiAgICAgICAgfSwgdC5sb2FkID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0ICYmICh0ID0gXCJcIiksIG51bGwgPT0gKGkgPSB0aGlzLmNoZWNrQ29yZSgpKSA/IHZvaWQgMCA6IGkubG9hZChlLCB0KTtcbiAgICAgICAgfSwgdC5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICBudWxsID09IChlID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgZS5wYXVzZSgpO1xuICAgICAgICB9LCB0LnBsYXkgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgbnVsbCA9PSAoZSA9IHRoaXMuY2hlY2tDb3JlKCkpIHx8IGUucGxheSgpO1xuICAgICAgICB9LCB0LnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIG51bGwgPT0gKGkgPSB0aGlzLmNoZWNrQ29yZSgpKSB8fCBpLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSwgdCk7XG4gICAgICAgIH0sIHQuc2Vla1RvID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICBudWxsID09ICh0ID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgdC5zZWVrVG8oZSk7XG4gICAgICAgIH0sIHQuc2V0QXV0aFRva2VuID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICBudWxsID09ICh0ID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgdC5zZXRBdXRoVG9rZW4oZSk7XG4gICAgICAgIH0sIHQuc2V0QXV0b0luaXRpYWxCaXRyYXRlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICBudWxsID09ICh0ID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgdC5zZXRBdXRvSW5pdGlhbEJpdHJhdGUoZSk7XG4gICAgICAgIH0sIHQuc2V0QXV0b01heFF1YWxpdHkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdDtcbiAgICAgICAgICAgIG51bGwgPT0gKHQgPSB0aGlzLmNoZWNrQ29yZSgpKSB8fCB0LnNldEF1dG9NYXhRdWFsaXR5KGUpO1xuICAgICAgICB9LCB0LnNldEF1dG9NYXhCaXRyYXRlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICBudWxsID09ICh0ID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgdC5zZXRBdXRvTWF4Qml0cmF0ZShlKTtcbiAgICAgICAgfSwgdC5zZXRBdXRvTWF4VmlkZW9TaXplID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICBudWxsID09IChpID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgaS5zZXRBdXRvTWF4VmlkZW9TaXplKGUsIHQpO1xuICAgICAgICB9LCB0LnNldEF1dG9wbGF5ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICBudWxsID09ICh0ID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgdC5zZXRBdXRvcGxheShlKTtcbiAgICAgICAgfSwgdC5zZXRBdXRvUGxheU9wdGlvbnMgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdDtcbiAgICAgICAgICAgIG51bGwgPT0gKHQgPSB0aGlzLmNoZWNrQ29yZSgpKSB8fCB0LnNldEF1dG9QbGF5T3B0aW9ucyhlKTtcbiAgICAgICAgfSwgdC5zZXRBdXRvUXVhbGl0eU1vZGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdDtcbiAgICAgICAgICAgIG51bGwgPT0gKHQgPSB0aGlzLmNoZWNrQ29yZSgpKSB8fCB0LnNldEF1dG9RdWFsaXR5TW9kZShlKTtcbiAgICAgICAgfSwgdC5zZXRBdXRvVmlld3BvcnRTaXplID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICBudWxsID09IChpID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgaS5zZXRBdXRvVmlld3BvcnRTaXplKGUsIHQpO1xuICAgICAgICB9LCB0LnNldENsaWVudElkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICBudWxsID09ICh0ID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgdC5zZXRDbGllbnRJZChlKTtcbiAgICAgICAgfSwgdC5zZXREZXZpY2VJZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0O1xuICAgICAgICAgICAgbnVsbCA9PSAodCA9IHRoaXMuY2hlY2tDb3JlKCkpIHx8IHQuc2V0RGV2aWNlSWQoZSk7XG4gICAgICAgIH0sIHQuc2V0RXhwZXJpbWVudCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgbnVsbCA9PSAoaSA9IHRoaXMuY2hlY2tDb3JlKCkpIHx8IGkuc2V0RXhwZXJpbWVudChlLCB0KTtcbiAgICAgICAgfSwgdC5zZXRFeHBlcmltZW50RGF0YSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0O1xuICAgICAgICAgICAgbnVsbCA9PSAodCA9IHRoaXMuY2hlY2tDb3JlKCkpIHx8IHQuc2V0RXhwZXJpbWVudERhdGEoZSk7XG4gICAgICAgIH0sIHQuc2V0SW5pdGlhbEJ1ZmZlckR1cmF0aW9uID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICBudWxsID09ICh0ID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgdC5zZXRJbml0aWFsQnVmZmVyRHVyYXRpb24oZSk7XG4gICAgICAgIH0sIHQuc2V0TGl2ZUxvd0xhdGVuY3lFbmFibGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICBudWxsID09ICh0ID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgdC5zZXRMaXZlTG93TGF0ZW5jeUVuYWJsZWQoZSk7XG4gICAgICAgIH0sIHQuc2V0TGl2ZU1heExhdGVuY3kgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdDtcbiAgICAgICAgICAgIG51bGwgPT0gKHQgPSB0aGlzLmNoZWNrQ29yZSgpKSB8fCB0LnNldExpdmVNYXhMYXRlbmN5KGUpO1xuICAgICAgICB9LCB0LnNldExpdmVTcGVlZFVwUmF0ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0O1xuICAgICAgICAgICAgbnVsbCA9PSAodCA9IHRoaXMuY2hlY2tDb3JlKCkpIHx8IHQuc2V0TGl2ZVNwZWVkVXBSYXRlKGUpO1xuICAgICAgICB9LCB0LnNldExvZ0xldmVsID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICBudWxsID09ICh0ID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgdC5zZXRMb2dMZXZlbChlKTtcbiAgICAgICAgfSwgdC5zZXRMb29waW5nID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICBudWxsID09ICh0ID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgdC5zZXRMb29waW5nKGUpO1xuICAgICAgICB9LCB0LnNldE11dGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICBudWxsID09ICh0ID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgdC5zZXRNdXRlZChlKTtcbiAgICAgICAgfSwgdC5zZXRQbGF5YmFja1JhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdDtcbiAgICAgICAgICAgIG51bGwgPT0gKHQgPSB0aGlzLmNoZWNrQ29yZSgpKSB8fCB0LnNldFBsYXliYWNrUmF0ZShlKTtcbiAgICAgICAgfSwgdC5zZXRQbGF5ZXJUeXBlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICBudWxsID09ICh0ID0gdGhpcy5jaGVja0NvcmUoKSkgfHwgdC5zZXRQbGF5ZXJUeXBlKGUpO1xuICAgICAgICB9LCB0LnNldFF1YWxpdHkgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIHZvaWQgMCA9PT0gdCAmJiAodCA9ICExKSwgbnVsbCA9PSAoaSA9IHRoaXMuY2hlY2tDb3JlKCkpIHx8IGkuc2V0UXVhbGl0eShlLCB0KTtcbiAgICAgICAgfSwgdC5zZXRSZWJ1ZmZlclRvTGl2ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0O1xuICAgICAgICAgICAgbnVsbCA9PSAodCA9IHRoaXMuY2hlY2tDb3JlKCkpIHx8IHQuc2V0UmVidWZmZXJUb0xpdmUoZSk7XG4gICAgICAgIH0sIHQuc2V0VmlzaWJsZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0O1xuICAgICAgICAgICAgbnVsbCA9PSAodCA9IHRoaXMuY2hlY2tDb3JlKCkpIHx8IHQuc2V0VmlzaWJsZShlKTtcbiAgICAgICAgfSwgdC5zZXRWb2x1bWUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdDtcbiAgICAgICAgICAgIG51bGwgPT0gKHQgPSB0aGlzLmNoZWNrQ29yZSgpKSB8fCB0LnNldFZvbHVtZShlKTtcbiAgICAgICAgfSwgdC5zdGFydFJlbW90ZVBsYXliYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICAgIG51bGwgPT0gKGUgPSB0aGlzLmNoZWNrQ29yZSgpKSB8fCBlLnN0YXJ0UmVtb3RlUGxheWJhY2soKTtcbiAgICAgICAgfSwgdC5zZXRQbGF0Zm9ybU5hbWUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdDtcbiAgICAgICAgICAgIG51bGwgPT0gKHQgPSB0aGlzLmNoZWNrQ29yZSgpKSB8fCB0LnNldFBsYXRmb3JtTmFtZShlKTtcbiAgICAgICAgfSwgdC5zZXRSZXF1ZXN0Q3JlZGVudGlhbHMgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgdDtcbiAgICAgICAgICAgIG51bGwgPT0gKHQgPSB0aGlzLmNoZWNrQ29yZSgpKSB8fCB0LnNldFJlcXVlc3RDcmVkZW50aWFscyhlKTtcbiAgICAgICAgfSwgdC5jaGVja0NvcmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvcmUgfHwgY29uc29sZS53YXJuKFwiTWV0aG9kIGNhbGxlZCBvbiBkZWxldGVkIHBsYXllciBpbnN0YW5jZS5cIiksIHRoaXMuY29yZTtcbiAgICAgICAgfSwgZTtcbiAgICB9KCk7XG4gICAgaHQuaXNWUDlTdXBwb3J0ZWQgPSBKZS5pc1ZQOVN1cHBvcnRlZCwgZnVuY3Rpb24oZSkge1xuICAgICAgICBlLlVOS05PV04gPSBcIlVuc3BlY2lmaWVkXCIsIGUuRklMRSA9IFwiRmlsZVwiLCBlLlNFR01FTlQgPSBcIlNlZ21lbnRcIiwgZS5TT1VSQ0UgPSBcIlNvdXJjZVwiLCBlLkRFQ09ERVIgPSBcIkRlY29kZVwiLCBlLlJFTkRFUkVSID0gXCJSZW5kZXJcIiwgZS5NQVNURVJfUExBWUxJU1QgPSBcIk1hc3RlclBsYXlsaXN0XCIsIGUuTUVESUFfUExBWUxJU1QgPSBcIk1lZGlhUGxheWxpc3RcIjtcbiAgICB9KG50IHx8IChudCA9IHt9KSksIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZS5HRU5FUklDID0gXCJFcnJvclwiLCBlLk5PVF9TVVBQT1JURUQgPSBcIkVycm9yTm90U3VwcG9ydGVkXCIsIGUuTk9fU09VUkNFID0gXCJFcnJvck5vU291cmNlXCIsIGUuSU5WQUxJRF9EQVRBID0gXCJFcnJvckludmFsaWREYXRhXCIsIGUuSU5WQUxJRF9TVEFURSA9IFwiRXJyb3JJbnZhbGlkU3RhdGVcIiwgZS5JTlZBTElEX1BBUkFNRVRFUiA9IFwiRXJyb3JJbnZhbGlkUGFyYW1ldGVyXCIsIGUuVElNRU9VVCA9IFwiRXJyb3JUaW1lb3V0XCIsIGUuTkVUV09SSyA9IFwiRXJyb3JOZXR3b3JrXCIsIGUuTkVUV09SS19JTyA9IFwiRXJyb3JOZXR3b3JrSU9cIiwgZS5BVVRIT1JJWkFUSU9OID0gXCJFcnJvckF1dGhvcml6YXRpb25cIiwgZS5OT1RfQVZBSUxBQkxFID0gXCJFcnJvck5vdEF2YWlsYWJsZVwiO1xuICAgIH0ocnQgfHwgKHJ0ID0ge30pKSwgZnVuY3Rpb24oZSkge1xuICAgICAgICBlW2UuR0VPQkxPQ0tFRCA9IDFdID0gXCJHRU9CTE9DS0VEXCIsIGVbZS5VTlNVUFBPUlRFRF9ERVZJQ0UgPSAyXSA9IFwiVU5TVVBQT1JURURfREVWSUNFXCIsIGVbZS5BTk9OWU1JWkVSX0JMT0NLRUQgPSAzXSA9IFwiQU5PTllNSVpFUl9CTE9DS0VEXCIsIGVbZS5DRUxMVUxBUl9ORVRXT1JLX1BST0hJQklURUQgPSA0XSA9IFwiQ0VMTFVMQVJfTkVUV09SS19QUk9ISUJJVEVEXCIsIGVbZS5VTkFVVEhPUklaQVRJT05fRU5USVRMRU1FTlRTID0gNV0gPSBcIlVOQVVUSE9SSVpBVElPTl9FTlRJVExFTUVOVFNcIiwgZVtlLlZPRF9SRVNUUklDVEVEID0gNl0gPSBcIlZPRF9SRVNUUklDVEVEXCI7XG4gICAgfShvdCB8fCAob3QgPSB7fSkpLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIGUuQ0FQVFVSRV9FTkFCTEVEID0gXCJDYXB0dXJlRW5hYmxlZFwiLCBlLkNBUFRVUkVfQlVORExFID0gXCJDYXB0dXJlQnVuZGxlXCIsIGUuQ0FQVFVSRV9BTkFMWVRJQ1MgPSBcIkNhcHR1cmVBbmFseXRpY3NcIiwgZS5GTVA0X1NFR01FTlQgPSBcIkZNUDRTZWdtZW50XCI7XG4gICAgfShzdCB8fCAoc3QgPSB7fSkpLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIGUuREVCVUcgPSBcImRlYnVnXCIsIGUuSU5GTyA9IFwiaW5mb1wiLCBlLldBUk4gPSBcIndhcm5cIiwgZS5FUlJPUiA9IFwiZXJyb3JcIjtcbiAgICB9KGF0IHx8IChhdCA9IHt9KSksIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZS5EVVJBVElPTl9DSEFOR0UgPSBcImR1cmF0aW9uY2hhbmdlXCIsIGUuRU5ERUQgPSBcImVuZGVkXCIsIGUuRVJST1IgPSBcImVycm9yXCIsIGUuTE9BREVEX01FVEFEQVRBID0gXCJsb2FkZWRtZXRhZGF0YVwiLCBlLkxPQURTVEFSVCA9IFwibG9hZHN0YXJ0XCIsIGUuUEFVU0UgPSBcInBhdXNlXCIsIGUuUExBWSA9IFwicGxheVwiLCBlLlBMQVlJTkcgPSBcInBsYXlpbmdcIiwgZS5SQVRFX0NIQU5HRSA9IFwicmF0ZWNoYW5nZVwiLCBlLlNFRUtFRCA9IFwic2Vla2VkXCIsIGUuU0VFS0lORyA9IFwic2Vla2luZ1wiLCBlLlRJTUVfVVBEQVRFID0gXCJ0aW1ldXBkYXRlXCIsIGUuVk9MVU1FX0NIQU5HRSA9IFwidm9sdW1lY2hhbmdlXCIsIGUuV0FJVElORyA9IFwid2FpdGluZ1wiO1xuICAgIH0odXQgfHwgKHV0ID0ge30pKSwgZnVuY3Rpb24oZSkge1xuICAgICAgICBlW2UuSEFWRV9OT1RISU5HID0gMF0gPSBcIkhBVkVfTk9USElOR1wiLCBlW2UuSEFWRV9NRVRBREFUQSA9IDFdID0gXCJIQVZFX01FVEFEQVRBXCIsIGVbZS5IQVZFX0NVUlJFTlRfREFUQSA9IDJdID0gXCJIQVZFX0NVUlJFTlRfREFUQVwiLCBlW2UuSEFWRV9GVVRVUkVfREFUQSA9IDNdID0gXCJIQVZFX0ZVVFVSRV9EQVRBXCIsIGVbZS5IQVZFX0VOT1VHSF9EQVRBID0gNF0gPSBcIkhBVkVfRU5PVUdIX0RBVEFcIjtcbiAgICB9KGR0IHx8IChkdCA9IHt9KSk7XG4gICAgdmFyIGx0ID0gKChjdCA9IHt9KVtqLklETEVdID0gMSwgY3Rbai5SRUFEWV0gPSAxLCBjdFtqLkJVRkZFUklOR10gPSAyLCBjdFtqLlBMQVlJTkddID0gMiwgY3Rbai5FTkRFRF0gPSAxLCBjdCksIGZ0ID0gXCJBbWF6b25JVlNcIjtcbiAgICB2YXIgdnQgPSBcImVuYWJsZUlWU1F1YWxpdHlQbHVnaW5cIjtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHQ7XG59KCk7XG4iLCAiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX25leHQodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbnZhciBfX2dlbmVyYXRvciA9IHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvciB8fCBmdW5jdGlvbih0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIGYsIHksIHQsIGcsIF8gPSB7XG4gICAgICAgIGxhYmVsOiAwLFxuICAgICAgICBzZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTtcbiAgICAgICAgICAgIHJldHVybiB0WzFdO1xuICAgICAgICB9LFxuICAgICAgICB0cnlzOiBbXSxcbiAgICAgICAgb3BzOiBbXVxuICAgIH07XG4gICAgcmV0dXJuIGcgPSB7XG4gICAgICAgIG5leHQ6IHZlcmIoMCksXG4gICAgICAgIFwidGhyb3dcIjogdmVyYigxKSxcbiAgICAgICAgXCJyZXR1cm5cIjogdmVyYigyKVxuICAgIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odikge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXAoW1xuICAgICAgICAgICAgICAgIG4sXG4gICAgICAgICAgICAgICAgdlxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZShfKXRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW1xuICAgICAgICAgICAgICAgIG9wWzBdICYgMixcbiAgICAgICAgICAgICAgICB0LnZhbHVlXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgc3dpdGNoKG9wWzBdKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgICAgICAgICAgeSA9IG9wWzFdO1xuICAgICAgICAgICAgICAgICAgICBvcCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgb3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSBvcFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBfLm9wcy5wdXNoKG9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBvcCA9IFtcbiAgICAgICAgICAgICAgICA2LFxuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB5ID0gMDtcbiAgICAgICAgfSBmaW5hbGx5e1xuICAgICAgICAgICAgZiA9IHQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsXG4gICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxufTtcbmltcG9ydCB7IGNyZWF0ZSwgaXNQbGF5ZXJTdXBwb3J0ZWQgfSBmcm9tIFwiYW1hem9uLWl2cy1wbGF5ZXJcIjtcbmltcG9ydCB7IGhlbGlwb3J0V2luZG93IH0gZnJvbSBcIi4uL2NvbnN0XCI7XG5pbXBvcnQgeyBkZWJ1Z0xvZyB9IGZyb20gXCIuLi91dGlscy9kZWJ1Z1wiO1xuaW1wb3J0IHsgaXNJUGhvbmUsIGlzTWFjIH0gZnJvbSBcIi4vcGxhdGZvcm1cIjtcbnZhciB2aWRlbyA9IHVuZGVmaW5lZDtcbnZhciB2aWRlb0F1ZGlvQ29udGV4dCA9IHVuZGVmaW5lZDtcbnZhciB2aWRlb1NvdXJjZSA9IHVuZGVmaW5lZDtcbnZhciB2aWRlb0dhaW5Ob2RlID0gdW5kZWZpbmVkO1xudmFyIGlzVmlkZW9FbmRlZCA9IGZhbHNlO1xuZXhwb3J0IHZhciBjb25uZWN0VmlkZW9Tb3VyY2VXaXRoTm9kZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghaXNJUGhvbmUoKSAmJiAhaXNNYWMoKSkge1xuICAgICAgICAvLyBpT1MvTWFjXHU0RUU1XHU1OTE2XHUzMDY3XHUzMDZGVmlkZW8udm9sdW1lXHUzMDRDXHU0RjdGXHUzMDQ4XHUzMDhCXHUzMDZFXHUzMDY3Z2Fpbk5vZGVcdTMwNkZcdTc1MUZcdTYyMTBcdTMwNTdcdTMwNkFcdTMwNDRcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmlkZW9BdWRpb0NvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2aWRlb0F1ZGlvQ29udGV4dCA9IG5ldyAoaGVsaXBvcnRXaW5kb3cuQXVkaW9Db250ZXh0IHx8IGhlbGlwb3J0V2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCkoKTtcbiAgICB9XG4gICAgaWYgKHZpZGVvU291cmNlID09PSB1bmRlZmluZWQgJiYgdmlkZW9BdWRpb0NvbnRleHQgIT09IHVuZGVmaW5lZCAmJiB2aWRlbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZpZGVvU291cmNlID0gdmlkZW9BdWRpb0NvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKHZpZGVvKTtcbiAgICB9XG4gICAgaWYgKHZpZGVvR2Fpbk5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodmlkZW9BdWRpb0NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmlkZW9HYWluTm9kZSA9IHZpZGVvQXVkaW9Db250ZXh0LmNyZWF0ZUdhaW4oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlkZW9BdWRpb0NvbnRleHQgIT09IHVuZGVmaW5lZCAmJiB2aWRlb1NvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2aWRlb1NvdXJjZS5jb25uZWN0KHZpZGVvR2Fpbk5vZGUgfHwgdmlkZW9BdWRpb0NvbnRleHQuY3JlYXRlR2FpbigpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlkZW9HYWluTm9kZSAhPT0gdW5kZWZpbmVkICYmIHZpZGVvQXVkaW9Db250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZpZGVvR2Fpbk5vZGUuY29ubmVjdCh2aWRlb0F1ZGlvQ29udGV4dC5kZXN0aW5hdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG59O1xuLyoqXG4gKiBAcmVtYXJrc1xuICogQysrXHUzMDRCXHUzMDg5XHU1NDdDXHU1MUZBXHUzMDU3XG4gKiBAcGFyYW0gbG9vcFxuICovIGV4cG9ydCB2YXIgcHJlcGFyZVZpZGVvID0gZnVuY3Rpb24obG9vcCkge1xuICAgIGlmICh2aWRlbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmlkZW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInZpZGVvMFwiKTtcbiAgICAvLyB3b3JsZFZpZXdlcldpbmRvdy5nX1ZpZGVvLmF1dG9wbGF5ID0gZmFsc2U7XG4gICAgdmlkZW8ubG9vcCA9IGxvb3A7XG4gICAgLy8gd29ybGRWaWV3ZXJXaW5kb3cuZ19WaWRlby50eXBlID0gJ3ZpZGVvL21wNCc7XG4gICAgLy8gd29ybGRWaWV3ZXJXaW5kb3cuZ19WaWRlby5hdXRvUGljdHVyZUluUGljdHVyZSA9IGZhbHNlO1xuICAgIC8vIHdvcmxkVmlld2VyV2luZG93LmdfVmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgPSB0cnVlO1xuICAgIC8vIHdvcmxkVmlld2VyV2luZG93LmdfVmlkZW8uY29udHJvbHNsaXN0ID0gXCJub2Rvd25sb2FkXCI7XG4gICAgLy8gd29ybGRWaWV3ZXJXaW5kb3cuZ19WaWRlby5wbGF5c2lubGluZSA9IHRydWU7XG4gICAgaXNWaWRlb0VuZGVkID0gZmFsc2U7XG4gICAgdmlkZW8ub25zZWVraW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBpc1ZpZGVvRW5kZWQgPSBmYWxzZTtcbiAgICB9O1xuICAgIHZpZGVvLm9uc2Vla2VkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBpc1ZpZGVvRW5kZWQgPSB0cnVlO1xuICAgIH07XG4gICAgdmlkZW8ub25jYW5wbGF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBpc1ZpZGVvRW5kZWQgPSBmYWxzZTtcbiAgICB9O1xuICAgIHZpZGVvLm9uY2FucGxheXRocm91Z2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGlzVmlkZW9FbmRlZCA9IHRydWU7XG4gICAgfTtcbiAgICB2aWRlby5vbmVuZGVkID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgZGVidWdMb2coXCJnX1ZpZGVvIG9uRW5kZWQgXCIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGV2ZW50KSkpO1xuICAgICAgICBpc1ZpZGVvRW5kZWQgPSB0cnVlO1xuICAgIH07XG4gICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRlZG1ldGFkYXRhXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIGhlbGlwb3J0V2luZG93LmhlbF92aWRlb19vbl9sb2FkZWRtZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBoZWxpcG9ydFdpbmRvdy5oZWxfdmlkZW9fb25fbG9hZGVkbWV0YWRhdGEoKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcbmV4cG9ydCB2YXIgcGxheVZpZGVvID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbih2aWRlb1NyYywgdmlkZW9TdHJlYW1pbmcpIHtcbiAgICAgICAgdmFyIHBsYXllciwgaGxzO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aWRlbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodmlkZW9TdHJlYW1pbmcgIT09IDApKSByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIDdcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1BsYXllclN1cHBvcnRlZCkgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RWaWRlb1NvdXJjZVdpdGhOb2RlKCk7XG4gICAgICAgICAgICAgICAgICAgIHBsYXllciA9IGNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXNtQmluYXJ5OiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2FzbVdvcmtlcjogXCJcIlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmF0dGFjaEhUTUxWaWRlb0VsZW1lbnQodmlkZW8pO1xuICAgICAgICAgICAgICAgICAgICBwbGF5ZXIubG9hZCh2aWRlb1NyYyk7XG4gICAgICAgICAgICAgICAgICAgIHBsYXllci5wbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgNlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoIWlzSVBob25lKCkgJiYgdHlwZW9mIEhscyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBIbHMuaXNTdXBwb3J0ZWQoKSkpIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgM1xuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0VmlkZW9Tb3VyY2VXaXRoTm9kZSgpO1xuICAgICAgICAgICAgICAgICAgICBobHMgPSBuZXcgSGxzKCk7XG4gICAgICAgICAgICAgICAgICAgIGhscy5sb2FkU291cmNlKHZpZGVvU3JjKTtcbiAgICAgICAgICAgICAgICAgICAgaGxzLmF0dGFjaE1lZGlhKHZpZGVvKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5wbGF5KClcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIF9zdGF0ZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgNlxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2aWRlby5jYW5QbGF5VHlwZShcImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5tcGVndXJsXCIpKSByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIDVcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdFZpZGVvU291cmNlV2l0aE5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdmlkZW8uc3JjID0gdmlkZW9TcmM7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8ucGxheSgpXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIDZcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nKFwidmlkZW8gc3RyZWFtaW5nIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIF9zdGF0ZS5sYWJlbCA9IDY7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIDlcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RWaWRlb1NvdXJjZVdpdGhOb2RlKCk7XG4gICAgICAgICAgICAgICAgICAgIHZpZGVvLnNyYyA9IHZpZGVvU3JjO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLnBsYXkoKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgX3N0YXRlLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgX3N0YXRlLmxhYmVsID0gOTtcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiBwbGF5VmlkZW8odmlkZW9TcmMsIHZpZGVvU3RyZWFtaW5nKSB7XG4gICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn0oKTtcbmV4cG9ydCB2YXIgc3RvcFZpZGVvID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHZpZGVvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2aWRlby5wYXVzZSgpO1xufTtcbmV4cG9ydCB2YXIgdG9nZ2xlUGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKHRvZ2dsZSkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgICAgICBzd2l0Y2goX3N0YXRlLmxhYmVsKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aWRlbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2dnbGUpIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB2aWRlby5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIDNcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8ucGxheSgpXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBfc3RhdGUuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBfc3RhdGUubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHRvZ2dsZVBhdXNlKHRvZ2dsZSkge1xuICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59KCk7XG5leHBvcnQgdmFyIGlzVmlkZW9QYXVzZWQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodmlkZW8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZGVvLnBhdXNlZDtcbn07XG5leHBvcnQgdmFyIHNldFZpZGVvRm9yd2FyZEZvciA9IGZ1bmN0aW9uKHNlY29uZHMpIHtcbiAgICBpZiAodmlkZW8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZpZGVvLmN1cnJlbnRUaW1lICs9IHNlY29uZHM7XG59O1xuZXhwb3J0IHZhciBpc1ZpZGVvUGxheWluZyA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh2aWRlbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEodmlkZW8ubG9vcCAmJiBpc1ZpZGVvRW5kZWQpO1xufTtcbmV4cG9ydCB2YXIgc2V0VmlkZW9SZXdpbmRGb3IgPSBmdW5jdGlvbihzZWNvbmRzKSB7XG4gICAgaWYgKHZpZGVvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2aWRlby5jdXJyZW50VGltZSAtPSBzZWNvbmRzO1xufTtcbmV4cG9ydCB2YXIgZ2V0VmlkZW9EdXJhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh2aWRlbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gdmlkZW8uZHVyYXRpb247XG59O1xuZXhwb3J0IHZhciBzZXRDdXJyZW50VGltZSA9IGZ1bmN0aW9uKHNsaWRlclJhdGUpIHtcbiAgICBpZiAodmlkZW8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2aWRlby5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSBzbGlkZXJSYXRlICogdmlkZW8uZHVyYXRpb247XG4gICAgfVxufTtcbmV4cG9ydCB2YXIgZ2V0Q3VycmVudFRpbWUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodmlkZW8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIHZpZGVvLmN1cnJlbnRUaW1lO1xufTtcbmV4cG9ydCB2YXIgZ2V0U2xpZGVyUmF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh2aWRlbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAwLjA7XG4gICAgfVxuICAgIHZhciBzbGlkZXJSYXRlID0gMC4wO1xuICAgIGlmICh2aWRlby5kdXJhdGlvbiA+IDAuMCkge1xuICAgICAgICBzbGlkZXJSYXRlID0gdmlkZW8uY3VycmVudFRpbWUgLyB2aWRlby5kdXJhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHNsaWRlclJhdGU7XG59O1xuZXhwb3J0IHZhciBzZWVrVmlkZW9CeSA9IGZ1bmN0aW9uKHNlY29uZHMpIHtcbiAgICBpZiAodmlkZW8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gc2Vjb25kcztcbn07XG5leHBvcnQgdmFyIHNldE11dGUgPSBmdW5jdGlvbihtdXRlKSB7XG4gICAgaWYgKHZpZGVvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2aWRlby5tdXRlZCA9IG11dGU7XG59O1xuZXhwb3J0IHZhciBpbml0aWFsaXplVmlkZW9FdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uKG9uUGxheWVkLCBvblBhdXNlZCwgb25FbmRlZCkge1xuICAgIGlmICh2aWRlbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9uUGxheWVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihcInBsYXlcIiwgb25QbGF5ZWQpO1xuICAgIH1cbiAgICBpZiAob25QYXVzZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKFwicGF1c2VcIiwgb25QYXVzZWQpO1xuICAgIH1cbiAgICBpZiAob25FbmRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoXCJlbmRlZFwiLCBvbkVuZGVkKTtcbiAgICB9XG59O1xuIiwgImltcG9ydCB7IHNldFZpZGVvRm9yd2FyZEZvciwgY29ubmVjdFZpZGVvU291cmNlV2l0aE5vZGUsIHNldFZpZGVvUmV3aW5kRm9yLCBpbml0aWFsaXplVmlkZW9FdmVudExpc3RlbmVycywgZ2V0VmlkZW9EdXJhdGlvbiwgaXNWaWRlb1BhdXNlZCwgcGxheVZpZGVvLCBpc1ZpZGVvUGxheWluZywgc2Vla1ZpZGVvQnksIHByZXBhcmVWaWRlbywgc3RvcFZpZGVvLCBnZXRTbGlkZXJSYXRlLCBzZXRDdXJyZW50VGltZSwgZ2V0Q3VycmVudFRpbWUsIHRvZ2dsZVBhdXNlLCBzZXRNdXRlIH0gZnJvbSBcIi4uL21vZHVsZXMvdmlkZW9cIjtcbmV4cG9ydCB2YXIgdXNlVmlkZW8gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzZXRWaWRlb0ZvcndhcmRGb3I6IHNldFZpZGVvRm9yd2FyZEZvcixcbiAgICAgICAgY29ubmVjdFZpZGVvU291cmNlV2l0aE5vZGU6IGNvbm5lY3RWaWRlb1NvdXJjZVdpdGhOb2RlLFxuICAgICAgICBzZXRWaWRlb1Jld2luZEZvcjogc2V0VmlkZW9SZXdpbmRGb3IsXG4gICAgICAgIGdldFZpZGVvRHVyYXRpb246IGdldFZpZGVvRHVyYXRpb24sXG4gICAgICAgIGluaXRpYWxpemVWaWRlb0V2ZW50TGlzdGVuZXJzOiBpbml0aWFsaXplVmlkZW9FdmVudExpc3RlbmVycyxcbiAgICAgICAgaXNWaWRlb1BhdXNlZDogaXNWaWRlb1BhdXNlZCxcbiAgICAgICAgcGxheVZpZGVvOiBwbGF5VmlkZW8sXG4gICAgICAgIGlzVmlkZW9QbGF5aW5nOiBpc1ZpZGVvUGxheWluZyxcbiAgICAgICAgc2Vla1ZpZGVvQnk6IHNlZWtWaWRlb0J5LFxuICAgICAgICBwcmVwYXJlVmlkZW86IHByZXBhcmVWaWRlbyxcbiAgICAgICAgc3RvcFZpZGVvOiBzdG9wVmlkZW8sXG4gICAgICAgIGdldFNsaWRlclJhdGU6IGdldFNsaWRlclJhdGUsXG4gICAgICAgIHNldEN1cnJlbnRUaW1lOiBzZXRDdXJyZW50VGltZSxcbiAgICAgICAgZ2V0Q3VycmVudFRpbWU6IGdldEN1cnJlbnRUaW1lLFxuICAgICAgICB0b2dnbGVQYXVzZTogdG9nZ2xlUGF1c2UsXG4gICAgICAgIHNldE11dGU6IHNldE11dGVcbiAgICB9O1xufTtcbiIsICJpbXBvcnQgeyB1c2VBbmFseXRpY3MgfSBmcm9tIFwiLi9jb21wb3NhYmxlcy91c2VBbmFseXRpY3NcIjtcbmltcG9ydCB7IHVzZUF1dGggfSBmcm9tIFwiLi9jb21wb3NhYmxlcy91c2VBdXRoXCI7XG5pbXBvcnQgeyB1c2VBdmF0YXIgfSBmcm9tIFwiLi9jb21wb3NhYmxlcy91c2VBdmF0YXJcIjtcbmltcG9ydCB7IHVzZUludGVydmFsIH0gZnJvbSBcIi4vY29tcG9zYWJsZXMvdXNlSW50ZXJ2YWxcIjtcbmltcG9ydCB7IHVzZVByb2ZpbGUgfSBmcm9tIFwiLi9jb21wb3NhYmxlcy91c2VQcm9maWxlXCI7XG5pbXBvcnQgeyB1c2VSb29tQXBpIH0gZnJvbSBcIi4vY29tcG9zYWJsZXMvdXNlUm9vbUFwaVwiO1xuaW1wb3J0IHsgdXNlUm91dGVyIH0gZnJvbSBcIi4vY29tcG9zYWJsZXMvdXNlUm91dGVyXCI7XG5pbXBvcnQgeyB1c2VTY3JlZW4gfSBmcm9tIFwiLi9jb21wb3NhYmxlcy91c2VTY3JlZW5cIjtcbmltcG9ydCB7IHVzZVRleHQgfSBmcm9tIFwiLi9jb21wb3NhYmxlcy91c2VUZXh0XCI7XG5pbXBvcnQgeyB1c2VWckFkIH0gZnJvbSBcIi4vY29tcG9zYWJsZXMvdXNlVnJBZFwiO1xuaW1wb3J0IHsgaGVsaXBvcnRXaW5kb3cgfSBmcm9tIFwiLi9jb25zdFwiO1xuaW1wb3J0IHsgdXNlQ2FudmFzIH0gZnJvbSBcIi4vZGV2aWNlRmVhdHVyZXMvdXNlQ2FudmFzXCI7XG5pbXBvcnQgeyB1c2VDb29raWUgfSBmcm9tIFwiLi9kZXZpY2VGZWF0dXJlcy91c2VDb29raWVcIjtcbmltcG9ydCB7IHVzZURvY3VtZW50IH0gZnJvbSBcIi4vZGV2aWNlRmVhdHVyZXMvdXNlRG9jdW1lbnRcIjtcbmltcG9ydCB7IHVzZUd5cm8gfSBmcm9tIFwiLi9kZXZpY2VGZWF0dXJlcy91c2VHeXJvXCI7XG5pbXBvcnQgeyB1c2VQbGF0Zm9ybSB9IGZyb20gXCIuL2RldmljZUZlYXR1cmVzL3VzZVBsYXRmb3JtXCI7XG5pbXBvcnQgeyB1c2VSZW5kZXIgfSBmcm9tIFwiLi9kZXZpY2VGZWF0dXJlcy91c2VSZW5kZXJcIjtcbmltcG9ydCB7IHVzZVN0b3JhZ2UgfSBmcm9tIFwiLi9kZXZpY2VGZWF0dXJlcy91c2VTdG9yYWdlXCI7XG5pbXBvcnQgeyB1c2VWaWRlbyB9IGZyb20gXCIuL2RldmljZUZlYXR1cmVzL3VzZVZpZGVvXCI7XG5leHBvcnQgdmFyIGxvYWRBcGlzID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKGhlbGlwb3J0V2luZG93LmFwaSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlbGlwb3J0V2luZG93LmFwaSA9IHt9O1xuICAgIH1cbiAgICBpZiAoaGVsaXBvcnRXaW5kb3cuYXBpLmFuYWx5dGljcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlbGlwb3J0V2luZG93LmFwaS5hbmFseXRpY3MgPSB7fTtcbiAgICB9XG4gICAgaGVsaXBvcnRXaW5kb3cuYXBpLmFuYWx5dGljcyA9IE9iamVjdC5hc3NpZ24oaGVsaXBvcnRXaW5kb3cuYXBpLmFuYWx5dGljcywgdXNlQW5hbHl0aWNzKCkpO1xuICAgIGlmIChoZWxpcG9ydFdpbmRvdy5hcGkuYXV0aHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWxpcG9ydFdpbmRvdy5hcGkuYXV0aHMgPSB7fTtcbiAgICB9XG4gICAgaGVsaXBvcnRXaW5kb3cuYXBpLmF1dGhzID0gT2JqZWN0LmFzc2lnbihoZWxpcG9ydFdpbmRvdy5hcGkuYXV0aHMsIHVzZUF1dGgoKSk7XG4gICAgaWYgKGhlbGlwb3J0V2luZG93LmFwaS5hdmF0YXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVsaXBvcnRXaW5kb3cuYXBpLmF2YXRhcnMgPSB7fTtcbiAgICB9XG4gICAgaGVsaXBvcnRXaW5kb3cuYXBpLmF2YXRhcnMgPSBPYmplY3QuYXNzaWduKGhlbGlwb3J0V2luZG93LmFwaS5hdmF0YXJzLCB1c2VBdmF0YXIoKSk7XG4gICAgaWYgKGhlbGlwb3J0V2luZG93LmFwaS5pbnRlcnZhbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWxpcG9ydFdpbmRvdy5hcGkuaW50ZXJ2YWxzID0ge307XG4gICAgfVxuICAgIGhlbGlwb3J0V2luZG93LmFwaS5pbnRlcnZhbHMgPSBPYmplY3QuYXNzaWduKGhlbGlwb3J0V2luZG93LmFwaS5pbnRlcnZhbHMsIHVzZUludGVydmFsKCkpO1xuICAgIGlmIChoZWxpcG9ydFdpbmRvdy5hcGkucHJvZmlsZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWxpcG9ydFdpbmRvdy5hcGkucHJvZmlsZXMgPSB7fTtcbiAgICB9XG4gICAgaGVsaXBvcnRXaW5kb3cuYXBpLnByb2ZpbGVzID0gT2JqZWN0LmFzc2lnbihoZWxpcG9ydFdpbmRvdy5hcGkucHJvZmlsZXMsIHVzZVByb2ZpbGUoKSk7XG4gICAgaWYgKGhlbGlwb3J0V2luZG93LmFwaS5yb29tcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlbGlwb3J0V2luZG93LmFwaS5yb29tcyA9IHt9O1xuICAgIH1cbiAgICBoZWxpcG9ydFdpbmRvdy5hcGkucm9vbXMgPSBPYmplY3QuYXNzaWduKGhlbGlwb3J0V2luZG93LmFwaS5yb29tcywgdXNlUm9vbUFwaSgpKTtcbiAgICBpZiAoaGVsaXBvcnRXaW5kb3cuYXBpLnJvdXRlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWxpcG9ydFdpbmRvdy5hcGkucm91dGVycyA9IHt9O1xuICAgIH1cbiAgICBoZWxpcG9ydFdpbmRvdy5hcGkucm91dGVycyA9IE9iamVjdC5hc3NpZ24oaGVsaXBvcnRXaW5kb3cuYXBpLnJvdXRlcnMsIHVzZVJvdXRlcigpKTtcbiAgICBpZiAoaGVsaXBvcnRXaW5kb3cuYXBpLnNjcmVlbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWxpcG9ydFdpbmRvdy5hcGkuc2NyZWVucyA9IHt9O1xuICAgIH1cbiAgICBoZWxpcG9ydFdpbmRvdy5hcGkuc2NyZWVucyA9IE9iamVjdC5hc3NpZ24oaGVsaXBvcnRXaW5kb3cuYXBpLnNjcmVlbnMsIHVzZVNjcmVlbigpKTtcbiAgICBpZiAoaGVsaXBvcnRXaW5kb3cuYXBpLnRleHRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVsaXBvcnRXaW5kb3cuYXBpLnRleHRzID0ge307XG4gICAgfVxuICAgIGhlbGlwb3J0V2luZG93LmFwaS50ZXh0cyA9IE9iamVjdC5hc3NpZ24oaGVsaXBvcnRXaW5kb3cuYXBpLnRleHRzLCB1c2VUZXh0KCkpO1xuICAgIGlmIChoZWxpcG9ydFdpbmRvdy5hcGkudnJhZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWxpcG9ydFdpbmRvdy5hcGkudnJhZHMgPSB7fTtcbiAgICB9XG4gICAgaGVsaXBvcnRXaW5kb3cuYXBpLnZyYWRzID0gT2JqZWN0LmFzc2lnbihoZWxpcG9ydFdpbmRvdy5hcGkudnJhZHMsIHVzZVZyQWQoKSk7XG59O1xuZXhwb3J0IHZhciBsb2FkRGV2aWNlQXBpcyA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChoZWxpcG9ydFdpbmRvdy5jYW52YXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWxpcG9ydFdpbmRvdy5jYW52YXMgPSB7fTtcbiAgICB9XG4gICAgaGVsaXBvcnRXaW5kb3cuY2FudmFzID0gT2JqZWN0LmFzc2lnbihoZWxpcG9ydFdpbmRvdy5jYW52YXMsIHVzZUNhbnZhcygpKTtcbiAgICBpZiAoaGVsaXBvcnRXaW5kb3cuY29va2llID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVsaXBvcnRXaW5kb3cuY29va2llID0ge307XG4gICAgfVxuICAgIGhlbGlwb3J0V2luZG93LmNvb2tpZSA9IE9iamVjdC5hc3NpZ24oaGVsaXBvcnRXaW5kb3cuY29va2llLCB1c2VDb29raWUoKSk7XG4gICAgaWYgKGhlbGlwb3J0V2luZG93LmRvYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlbGlwb3J0V2luZG93LmRvYyA9IHt9O1xuICAgIH1cbiAgICBoZWxpcG9ydFdpbmRvdy5kb2MgPSBPYmplY3QuYXNzaWduKGhlbGlwb3J0V2luZG93LmRvYywgdXNlRG9jdW1lbnQoKSk7XG4gICAgaWYgKGhlbGlwb3J0V2luZG93Lmd5cm8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWxpcG9ydFdpbmRvdy5neXJvID0ge307XG4gICAgfVxuICAgIGhlbGlwb3J0V2luZG93Lmd5cm8gPSBPYmplY3QuYXNzaWduKGhlbGlwb3J0V2luZG93Lmd5cm8sIHVzZUd5cm8oKSk7XG4gICAgaWYgKGhlbGlwb3J0V2luZG93LnBsYXRmb3JtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVsaXBvcnRXaW5kb3cucGxhdGZvcm0gPSB7fTtcbiAgICB9XG4gICAgaGVsaXBvcnRXaW5kb3cucGxhdGZvcm0gPSBPYmplY3QuYXNzaWduKGhlbGlwb3J0V2luZG93LnBsYXRmb3JtLCB1c2VQbGF0Zm9ybSgpKTtcbiAgICBpZiAoaGVsaXBvcnRXaW5kb3cucmVuZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVsaXBvcnRXaW5kb3cucmVuZGVyID0ge307XG4gICAgfVxuICAgIGhlbGlwb3J0V2luZG93LnJlbmRlciA9IE9iamVjdC5hc3NpZ24oaGVsaXBvcnRXaW5kb3cucmVuZGVyLCB1c2VSZW5kZXIoKSk7XG4gICAgaWYgKGhlbGlwb3J0V2luZG93LnN0b3JhZ2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWxpcG9ydFdpbmRvdy5zdG9yYWdlID0ge307XG4gICAgfVxuICAgIGhlbGlwb3J0V2luZG93LnN0b3JhZ2UgPSBPYmplY3QuYXNzaWduKGhlbGlwb3J0V2luZG93LnN0b3JhZ2UsIHVzZVN0b3JhZ2UoKSk7XG4gICAgaWYgKGhlbGlwb3J0V2luZG93LnZpZGVvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVsaXBvcnRXaW5kb3cudmlkZW8gPSB7fTtcbiAgICB9XG4gICAgaGVsaXBvcnRXaW5kb3cudmlkZW8gPSBPYmplY3QuYXNzaWduKGhlbGlwb3J0V2luZG93LnZpZGVvLCB1c2VWaWRlbygpKTtcbn07XG4iLCAiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX25leHQodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbnZhciBfX2dlbmVyYXRvciA9IHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvciB8fCBmdW5jdGlvbih0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIGYsIHksIHQsIGcsIF8gPSB7XG4gICAgICAgIGxhYmVsOiAwLFxuICAgICAgICBzZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTtcbiAgICAgICAgICAgIHJldHVybiB0WzFdO1xuICAgICAgICB9LFxuICAgICAgICB0cnlzOiBbXSxcbiAgICAgICAgb3BzOiBbXVxuICAgIH07XG4gICAgcmV0dXJuIGcgPSB7XG4gICAgICAgIG5leHQ6IHZlcmIoMCksXG4gICAgICAgIFwidGhyb3dcIjogdmVyYigxKSxcbiAgICAgICAgXCJyZXR1cm5cIjogdmVyYigyKVxuICAgIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odikge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXAoW1xuICAgICAgICAgICAgICAgIG4sXG4gICAgICAgICAgICAgICAgdlxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZShfKXRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW1xuICAgICAgICAgICAgICAgIG9wWzBdICYgMixcbiAgICAgICAgICAgICAgICB0LnZhbHVlXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgc3dpdGNoKG9wWzBdKXtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgICAgICAgICAgeSA9IG9wWzFdO1xuICAgICAgICAgICAgICAgICAgICBvcCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgb3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSBvcFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBfLm9wcy5wdXNoKG9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBvcCA9IFtcbiAgICAgICAgICAgICAgICA2LFxuICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB5ID0gMDtcbiAgICAgICAgfSBmaW5hbGx5e1xuICAgICAgICAgICAgZiA9IHQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsXG4gICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxufTtcbmltcG9ydCB7IGdldENvbmZpZyB9IGZyb20gXCIuL2NvbmZpZ3NcIjtcbmltcG9ydCB7IGhlbGlwb3J0V2luZG93IH0gZnJvbSBcIi4vY29uc3RcIjtcbmltcG9ydCB7IGxvYWRDb25maWcgfSBmcm9tIFwiLi9kZXZpY2VGZWF0dXJlcy9jb25maWdzXCI7XG5pbXBvcnQgeyBsb2FkQXBpcywgbG9hZERldmljZUFwaXMgfSBmcm9tIFwiLi9sb2FkZXJcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4vdXRpbHMvZGVidWdcIjtcbmhlbGlwb3J0V2luZG93LmJvb3RIZWxpcG9ydCA9IC8qI19fUFVSRV9fKi8gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvbmZpZztcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX3N0YXRlKSB7XG4gICAgICAgIGNvbmZpZyA9IGdldENvbmZpZygpO1xuICAgICAgICBkZWJ1Z0xvZyhcImhlbGxvIHdvcmxkIGF0IGVudiA6IFwiLmNvbmNhdChjb25maWcuc2t5d2F5S2V5KSk7XG4gICAgICAgIC8vIFx1OEEyRFx1NUI5QVx1NTAyNFx1MzA2RVx1NjMwN1x1NUI5QVxuICAgICAgICBsb2FkQ29uZmlnKCk7XG4gICAgICAgIC8vIEFQSVx1MzBFRFx1MzBGQ1x1MzBDN1x1MzBBM1x1MzBGM1x1MzBCMFxuICAgICAgICAvLyBUT0RPIFx1NTIwNlx1NUM5MFx1Njc2MVx1NEVGNlx1MzA0Q1x1MzA0RFx1MzA3RVx1MzA2M1x1MzA1Rlx1MzA4OVx1MzBERVx1MzBDM1x1MzBENFx1MzBGM1x1MzBCMFx1MzA5Mlx1NTE2NVx1MzA4Q1x1MzA2Nlx1NTIwNlx1NUM5MFx1MzBFRFx1MzBCOFx1MzBDM1x1MzBBRlx1NUI5Rlx1ODhDNVxuICAgICAgICBsb2FkRGV2aWNlQXBpcygpO1xuICAgICAgICBsb2FkQXBpcygpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgMlxuICAgICAgICBdO1xuICAgIH0pO1xufSk7XG4vLyBcdTUzNThcdTRGNTNcdTVCOUZcdTg4NENcdTMwQzZcdTMwQjlcdTMwQzhcdTc1MjhcbmhlbGlwb3J0V2luZG93LmJvb3RIZWxpcG9ydCgpO1xuIiwgImV4cG9ydCAqIGZyb20gXCIuL2Jvb3RzdHJhcFwiO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE1BQ1csZ0JBQ0Esd0JBQ0Esd0JBQ0E7QUFKWDtBQUFBO0FBQUE7QUFDTyxNQUFJLGlCQUFpQjtBQUNyQixNQUFJLHlCQUF5QjtBQUM3QixNQUFJLHlCQUF5QjtBQUM3QixNQUFJLGFBQWE7QUFBQTtBQUFBOzs7QUNKeEIsTUFBVztBQUFYO0FBQUE7QUFBQTtBQUFPLE1BQUksWUFBWTtBQUFBLFFBQ25CLFdBQVc7QUFBQSxRQUNYLGFBQWE7QUFBQSxRQUNi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Q0FBQztBQUFBLFlBQzdCLFNBQVMsR0FBUDtBQUNFLG1CQUFLO0FBQUEsZ0JBQ0Q7QUFBQSxnQkFDQTtBQUFBLGNBQ0o7QUFDQSxrQkFBSTtBQUFBLFlBQ1IsVUFBRTtBQUNFLGtCQUFJLElBQUk7QUFBQSxZQUNaO0FBQ0EsY0FBSSxHQUFHLEtBQUs7QUFBRyxrQkFBTSxHQUFHO0FBQ3hCLGlCQUFPO0FBQUEsWUFDSCxPQUFPLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFBQSxZQUN2QixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBTUEscUJBQWUsZUFBNkIsZ0JBQUFGLG9CQUFrQixXQUFXO0FBQ3JFLFlBQUlHO0FBQ0osZUFBT0QsY0FBWSxNQUFNLFNBQVMsUUFBUTtBQUN0QyxVQUFBQyxVQUFTLFVBQVU7QUFDbkIsbUJBQVMsd0JBQXdCLE9BQU9BLFFBQU8sU0FBUyxDQUFDO0FBRXpELHFCQUFXO0FBR1gseUJBQWU7QUFDZixtQkFBUztBQUNULGlCQUFPO0FBQUEsWUFDSDtBQUFBLFVBQ0o7QUFBQSxRQUNKLENBQUM7QUFBQSxNQUNMLENBQUM7QUFFRCxxQkFBZSxhQUFhO0FBQUE7QUFBQTs7O0FDbEo1QjtBQUFBLDhCQUFjOyIsCiAgIm5hbWVzIjogWyJpbml0X2NvbmZpZ3MiLCAic2VsZiIsICJpc0xvZ2dlZEluIiwgInZhbGlkYXRlQXV0aCIsICJhc3luY0dlbmVyYXRvclN0ZXAiLCAiX2FzeW5jVG9HZW5lcmF0b3IiLCAic2VsZiIsICJfZGVmaW5lUHJvcGVydHkiLCAiX29iamVjdFNwcmVhZCIsICJfX2dlbmVyYXRvciIsICJmZXRjaEFwaSIsICJhc3luY0dlbmVyYXRvclN0ZXAiLCAiX2FzeW5jVG9HZW5lcmF0b3IiLCAic2VsZiIsICJfX2dlbmVyYXRvciIsICJjb25maWciLCAiYXN5bmNHZW5lcmF0b3JTdGVwIiwgIl9hc3luY1RvR2VuZXJhdG9yIiwgInNlbGYiLCAiX19nZW5lcmF0b3IiLCAiY29uZmlnIiwgImRvbWFpbiIsICJjbGllbnRJZCIsICJyZWRpcmVjdFVyaSIsICJhc3luY0dlbmVyYXRvclN0ZXAiLCAiX2FzeW5jVG9HZW5lcmF0b3IiLCAic2VsZiIsICJfX2dlbmVyYXRvciIsICJjb25maWciLCAiZG9tYWluIiwgImFzeW5jR2VuZXJhdG9yU3RlcCIsICJfYXN5bmNUb0dlbmVyYXRvciIsICJzZWxmIiwgIl9fZ2VuZXJhdG9yIiwgImNvbmZpZyIsICJkb21haW4iLCAiYXN5bmNHZW5lcmF0b3JTdGVwIiwgIl9hc3luY1RvR2VuZXJhdG9yIiwgInNlbGYiLCAiX19nZW5lcmF0b3IiLCAiY29uZmlnIiwgImRvbWFpbiIsICJhc3luY0dlbmVyYXRvclN0ZXAiLCAiX2FzeW5jVG9HZW5lcmF0b3IiLCAic2VsZiIsICJfX2dlbmVyYXRvciIsICJjb25maWciLCAiX2lzQWxpdmVJZFRva2VuIiwgIl9zZXRJZFRva2VuIiwgImlzTG9nZ2VkSW4iLCAiZ2V0TXlQcm9maWxlIiwgImFzeW5jR2VuZXJhdG9yU3RlcCIsICJfYXN5bmNUb0dlbmVyYXRvciIsICJzZWxmIiwgIl9fZ2VuZXJhdG9yIiwgImZldGNoTXlBdmF0YXJMaXN0IiwgImlzTG9nZ2VkSW4iLCAiZmV0Y2hNeUF2YXRhclRva2VuIiwgImZldGNoT3RoZXJzQXZhdGFyVXJsIiwgImFzeW5jR2VuZXJhdG9yU3RlcCIsICJfYXN5bmNUb0dlbmVyYXRvciIsICJzZWxmIiwgIl9fZ2VuZXJhdG9yIiwgImZldGNoTXlQcm9maWxlIiwgInVwZGF0ZVByb2ZpbGUiLCAidXBkYXRlUHJvZmlsZUljb24iLCAiZmV0Y2hVc2VyUHJvZmlsZSIsICJmZXRjaE15R3Vlc3RQcm9maWxlIiwgInVwZGF0ZUd1ZXN0UHJvZmlsZSIsICJ1cGRhdGVHdWVzdFByb2ZpbGVJY29uIiwgImZldGNoVXNlckd1ZXN0UHJvZmlsZSIsICJmZXRjaFVzZXJQcm9maWxlTGlzdCIsICJmZXRjaFVzZXJHdWVzdFByb2ZpbGVMaXN0IiwgImFzeW5jR2VuZXJhdG9yU3RlcCIsICJfYXN5bmNUb0dlbmVyYXRvciIsICJzZWxmIiwgIl9fZ2VuZXJhdG9yIiwgImNhbmNlbFJlc2VydmVSb29tIiwgImZldGNoQWN0aXZlUm9vbXMiLCAiZmV0Y2hSYW5kb21Sb29tIiwgImZldGNoUm9vbSIsICJmZXRjaFJvb21TdGF0dXMiLCAiY3JlYXRlUm9vbSIsICJzZW5kSGVhcnRCZWF0IiwgImFzeW5jR2VuZXJhdG9yU3RlcCIsICJfYXN5bmNUb0dlbmVyYXRvciIsICJzZWxmIiwgIl9fZ2VuZXJhdG9yIiwgInRvZ2dsZUZ1bGxTY3JlZW4iLCAiYXN5bmNHZW5lcmF0b3JTdGVwIiwgIl9hc3luY1RvR2VuZXJhdG9yIiwgInNlbGYiLCAiX19nZW5lcmF0b3IiLCAiZmV0Y2hWckFkTGlzdCIsICJhc3luY0dlbmVyYXRvclN0ZXAiLCAiX2FzeW5jVG9HZW5lcmF0b3IiLCAic2VsZiIsICJfX2dlbmVyYXRvciIsICJpbml0aWFsaXplR3lybyIsICJlIiwgInQiLCAiXyRlIiwgInIiLCAibiIsICJpIiwgIm8iLCAiYSIsICJ1IiwgIl8kdCIsICJzIiwgImQiLCAiYXN5bmNHZW5lcmF0b3JTdGVwIiwgIl9hc3luY1RvR2VuZXJhdG9yIiwgInNlbGYiLCAiX3R5cGVvZiIsICJvYmoiLCAiZGVmaW5lIiwgIndyYXAiLCAic2VsZiIsICJ0cnlDYXRjaCIsICJHZW5lcmF0b3IiLCAiR2VuZXJhdG9yRnVuY3Rpb24iLCAiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCAiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwgIkFzeW5jSXRlcmF0b3IiLCAidmFsdWUiLCAibWFrZUludm9rZU1ldGhvZCIsICJwdXNoVHJ5RW50cnkiLCAicmVzZXRUcnlFbnRyeSIsICJDb250ZXh0IiwgInZhbHVlcyIsICJuZXh0IiwgImRvbmVSZXN1bHQiLCAiX3JlZ2VuZXJhdG9yUnVudGltZSIsICJleHBvcnRzIiwgImtleSIsICJoYW5kbGUiLCAiX3NldFByb3RvdHlwZU9mIiwgIm8iLCAicCIsICJyZXNvbHZlIiwgInJlamVjdCIsICJpIiwgInZhbCIsICJQcm9taXNlIiwgInNlbGYiLCAic2VsZiIsICJfZXh0ZW5kcyIsICJSZWZsZWN0QXBwbHkiLCAiUmVmbGVjdE93bktleXMiLCAiTnVtYmVySXNOYU4iLCAib25jZSIsICJlcnJvckxpc3RlbmVyIiwgInJlc29sdmVyIiwgImEiLCAiZSIsICJ0IiwgImkiLCAidSIsICJjIiwgImQiLCAiaCIsICJnIiwgInkiLCAiRSIsICJrIiwgIm4iLCAiciIsICJvIiwgInMiLCAiUyIsICJiIiwgIlQiLCAiSSIsICJWIiwgIkIiLCAieCIsICJyZSIsICJvZSIsICJzZSIsICJhZSIsICJ1ZSIsICJjZSIsICJkZSIsICJoZSIsICJsZSIsICJmZSIsICJtZSIsICJ2ZSIsICJrZSIsICJTZSIsICJiZSIsICJUZSIsICIkZSIsICJpdCIsICJtdCIsICJzZXRDdXJyZW50VGltZSIsICJwdCIsICJjcmVhdGUiLCAiaXNQbGF5ZXJTdXBwb3J0ZWQiLCAiTSIsICJfJGkiLCAiZiIsICJhc3luY0dlbmVyYXRvclN0ZXAiLCAiX2FzeW5jVG9HZW5lcmF0b3IiLCAic2VsZiIsICJfX2dlbmVyYXRvciIsICJwbGF5VmlkZW8iLCAidG9nZ2xlUGF1c2UiLCAiaW5pdF9jb25maWdzIiwgImFzeW5jR2VuZXJhdG9yU3RlcCIsICJfYXN5bmNUb0dlbmVyYXRvciIsICJzZWxmIiwgIl9fZ2VuZXJhdG9yIiwgImNvbmZpZyJdCn0K