hivessh
Version:
HiveSsh is an innovative library designed to streamline SSH2 connections and simplify task execution on Linux servers.
353 lines • 46.7 kB
JavaScript
export const logNames = [
"Fatal", "Error", "Warning", "Info", "Trace", "Debug",
];
export const logShorts = [
"FAT", "ERR", "WAR", "INF", "TRA", "DEB",
];
export const customLogType = {};
export const fatalLogType = getLogTypeByLevel(0);
export const errorLogType = getLogTypeByLevel(4);
export const warningLogType = getLogTypeByLevel(8);
export const infoLogType = getLogTypeByLevel(12);
export const traceLogType = getLogTypeByLevel(16);
export const debugLogType = getLogTypeByLevel(20);
export function getLogTypeByLevel(level) {
if (level == 0 ||
level == 4 ||
level == 8 ||
level == 12 ||
level == 16 ||
level == 20) {
return {
level: level,
name: logNames[level / 4],
short: logShorts[level / 4]
};
}
if (customLogType[level]) {
return {
name: customLogType[level].name,
short: (customLogType[level].short)
.toUpperCase()
.slice(0, 3),
level: level,
};
}
return {
level: level,
name: "Unknown",
short: "UNK",
};
}
export function defaultLogParser(log) {
return getLogTimestemp(log.time) +
"|" + log.type.short +
"|" + (log.area ?
log.area + "| " :
" ") + (log.value
.split("\n")
.join("\n ")) + (log.value.includes("\n") ?
"\n" :
"");
}
export function getLogTimestemp(date) {
if (typeof date == "number") {
date = new Date(date);
}
let year = date.getFullYear();
let month = ('0' + (date.getMonth() + 1)).slice(-2);
let day = ('0' + date.getDate()).slice(-2);
let hours = ('0' + date.getHours()).slice(-2);
let minutes = ('0' + date.getMinutes()).slice(-2);
let seconds = ('0' + date.getSeconds()).slice(-2);
return `${year}.${month}.${day}-${hours}:${minutes}:${seconds}`;
}
export class Logger {
prefix;
logs;
pipeTargets;
static StdOut = new Logger((log) => {
console.info(defaultLogParser(log));
});
static StdStreams = new Logger((log) => {
if (log.type.level < 10) {
console.error(defaultLogParser(log));
}
else {
console.info(defaultLogParser(log));
}
});
constructor(pipeTargets = undefined, prefix = "", logs = []) {
this.prefix = prefix;
this.logs = logs;
if (pipeTargets) {
if (Array.isArray(pipeTargets)) {
this.pipeTargets = pipeTargets;
}
else {
this.pipeTargets = [pipeTargets];
}
for (const pipeTarget of this.pipeTargets) {
if (!pipeTarget ||
pipeTarget == null ||
(typeof pipeTarget != "function" &&
typeof pipeTarget != "object")) {
throw new Error("Pipe target need to be an object with log method or a calback function");
}
else if (pipeTarget == this) {
throw new Error("Cant select a logger as its own pipe target");
}
}
}
}
rewrite = (options) => {
const settings = {
...options,
isArea: !options.isArea ?
undefined :
Array.isArray(options.isArea) ?
options.isArea :
[options.isArea],
notArea: !options.notArea ?
undefined :
Array.isArray(options.notArea) ?
options.notArea :
[options.notArea],
startsWithArea: !options.startsWithArea ?
undefined :
Array.isArray(options.startsWithArea) ?
options.startsWithArea :
[options.startsWithArea],
newAreaPrefix: options.newAreaPrefix ?
parseArea(options.newAreaPrefix) :
undefined,
};
return (log) => {
if (log.area) {
if (settings.justWithoutArea == true) {
return;
}
if (settings.notArea &&
settings.notArea.includes(log.area)) {
return;
}
if (settings.isArea &&
!settings.isArea.includes(log.area)) {
return;
}
if (settings.startsWithArea) {
let found = false;
for (const startsWithArea of settings.startsWithArea) {
if (log.area.startsWith(startsWithArea)) {
found = true;
break;
}
}
if (!found) {
return;
}
}
}
else if (settings.justWithArea == true ||
(settings.isArea &&
settings.isArea.length > 0 ||
settings.startsWithArea &&
settings.startsWithArea.length > 0)) {
return;
}
if (settings.maxLogLevel &&
log.type.level > settings.maxLogLevel) {
return;
}
if (settings.minLogLevel &&
log.type.level < settings.minLogLevel) {
return;
}
this.addLog({
...log,
area: log.area ? (settings.newAreaPrefix ?
settings.newAreaPrefix + "-" + log.area :
log.area) : (settings.newAreaPrefix ?
settings.newAreaPrefix :
undefined)
});
};
};
pipe(pipeTarget, justNewLogs = false) {
if (!pipeTarget ||
pipeTarget == null ||
(typeof pipeTarget != "function" &&
typeof pipeTarget != "object")) {
throw new Error("Pipe target need to be an object with log method or a calback function");
}
else if (pipeTarget == this) {
throw new Error("Cant select a logger as its own pipe target");
}
if (!justNewLogs) {
for (const log of this.logs) {
if (typeof pipeTarget == "function") {
pipeTarget(log);
}
else {
pipeTarget.addLog(log);
}
}
}
if (!this.pipeTargets) {
this.pipeTargets = [];
}
this.pipeTargets.push(pipeTarget);
}
unpipe(pipeTarget) {
if (!this.pipeTargets ||
pipeTarget == this) {
return;
}
if (!pipeTarget ||
pipeTarget == null ||
(typeof pipeTarget != "function" &&
typeof pipeTarget != "object")) {
throw new Error("Pipe target need to be an object with log method or a calback function");
}
if (typeof pipeTarget == "function") {
const pipeTargetString = "" + pipeTarget;
this.pipeTargets = this.pipeTargets.filter((v) => {
if (typeof v == "function") {
return "" + v != pipeTargetString;
}
return true;
});
}
else {
this.pipeTargets = this.pipeTargets.filter((v) => {
if (typeof v == "object") {
return v != pipeTarget;
}
return true;
});
}
if (this.pipeTargets.length == 0) {
this.pipeTargets = undefined;
}
}
unpipeAll() {
this.pipeTargets = undefined;
}
clear() {
this.logs = [];
}
fatal(value, area) {
this.log(fatalLogType, value, area);
}
error(value, area) {
this.log(errorLogType, value, area);
}
warn(value, area) {
this.log(warningLogType, value, area);
}
info(value, area) {
this.log(infoLogType, value, area);
}
trace(value, area) {
this.log(traceLogType, value, area);
}
debug(value, area) {
this.log(debugLogType, value, area);
}
log(level, value, area) {
this.addLog({
type: typeof level == "number" ?
getLogTypeByLevel(level) :
level,
value: (this.prefix != undefined ?
this.prefix + value :
value),
area: area ?
parseArea(area) :
undefined,
time: Date.now(),
});
}
addLog(log) {
this.logs.push(log);
if (this.pipeTargets) {
for (const pipeTarget of this.pipeTargets) {
if (typeof pipeTarget == "function") {
pipeTarget(log);
}
else {
pipeTarget.addLog(log);
}
}
}
}
getAbove(level, includeLevel) {
return this.logs.filter((v) => includeLevel ?
v.type.level >= level :
v.type.level > level);
}
getBelow(level, includeLevel) {
return this.logs.filter((v) => includeLevel ?
v.type.level <= level :
v.type.level < level);
}
getLogsWithAreas(areas) {
return this.logs.filter((v) => v.area ?
areas.includes(v.area) :
false);
}
getLogsInArea(areas) {
return this.logs.filter((v) => {
if (!v.area) {
return false;
}
for (const area of areas) {
if (area.startsWith(v.area)) {
return true;
}
}
return false;
});
}
getLogsNotInAreas(areas) {
return this.logs.filter((v) => v.area ?
!areas.includes(v.area) :
!areas.includes("default"));
}
parseLogs(logParser = defaultLogParser) {
let out = "";
for (const log of this.logs) {
out += logParser(log) + "\n";
}
return out;
}
}
export function parseArea(area) {
area = area.toLowerCase();
while (area.startsWith("-")) {
area = area.slice(1);
}
while (area.endsWith("-")) {
area = area.slice(0, -1);
}
if (area.includes(" ")) {
area = area.split(" ").join("-");
}
if (area.includes("_")) {
area = area.split("_").join("-");
}
if (area.includes("#")) {
area = area.split("#").join("-");
}
if (area.includes(";")) {
area = area.split(";").join("-");
}
if (area.includes("/")) {
area = area.split("/").join("-");
}
if (area.includes("\\")) {
area = area.split("\\").join("-");
}
return area;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUc7SUFDcEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPO0NBQy9DLENBQUE7QUFHVixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUc7SUFDckIsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLO0NBQ2xDLENBQUE7QUFHVixNQUFNLENBQUMsTUFBTSxhQUFhLEdBS3RCLEVBQUUsQ0FBQTtBQUVOLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBWSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUN6RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDekQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFZLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQzNELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBWSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUN6RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVksaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDMUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFZLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBUTFELE1BQU0sVUFBVSxpQkFBaUIsQ0FDN0IsS0FBYTtJQUViLElBQ0ksS0FBSyxJQUFJLENBQUM7UUFDVixLQUFLLElBQUksQ0FBQztRQUNWLEtBQUssSUFBSSxDQUFDO1FBQ1YsS0FBSyxJQUFJLEVBQUU7UUFDWCxLQUFLLElBQUksRUFBRTtRQUNYLEtBQUssSUFBSSxFQUFFLEVBQ2IsQ0FBQztRQUNDLE9BQU87WUFDSCxLQUFLLEVBQUUsS0FB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SUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyQixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDcEMsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3JCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNwQyxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDckIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3BDLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyQixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDcEMsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgY29uc3QgbG9nTmFtZXMgPSBbXG4gICAgXCJGYXRhbFwiLCBcIkVycm9yXCIsIFwiV2FybmluZ1wiLCBcIkluZm9cIiwgXCJUcmFjZVwiLCBcIkRlYnVnXCIsXG5dIGFzIGNvbnN0XG5leHBvcnQgdHlwZSBMb2dOYW1lID0gdHlwZW9mIGxvZ05hbWVzW251bWJlcl1cblxuZXhwb3J0IGNvbnN0IGxvZ1Nob3J0cyA9IFtcbiAgICBcIkZBVFwiLCBcIkVSUlwiLCBcIldBUlwiLCBcIklORlwiLCBcIlRSQVwiLCBcIkRFQlwiLFxuXSBhcyBjb25zdFxuZXhwb3J0IHR5cGUgTG9nU2hvcnQgPSB0eXBlb2YgbG9nU2hvcnRzW251bWJlcl1cblxuZXhwb3J0IGNvbnN0IGN1c3RvbUxvZ1R5cGU6IHtcbiAgICBbbGV2ZWw6IG51bWJlcl06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBzaG9ydDogc3RyaW5nLFxuICAgIH1cbn0gPSB7fVxuXG5leHBvcnQgY29uc3QgZmF0YWxMb2dUeXBlOiBMb2dUeXBlID0gZ2V0TG9nVHlwZUJ5TGV2ZWwoMClcbmV4cG9ydCBjb25zdCBlcnJvckxvZ1R5cGU6IExvZ1R5cGUgPSBnZXRMb2dUeXBlQnlMZXZlbCg0KVxuZXhwb3J0IGNvbnN0IHdhcm5pbmdMb2dUeXBlOiBMb2dUeXBlID0gZ2V0TG9nVHlwZUJ5TGV2ZWwoOClcbmV4cG9ydCBjb25zdCBpbmZvTG9nVHlwZTogTG9nVHlwZSA9IGdldExvZ1R5cGVCeUxldmVsKDEyKVxuZXhwb3J0IGNvbnN0IHRyYWNlTG9nVHlwZTogTG9nVHlwZSA9IGdldExvZ1R5cGVCeUxldmVsKDE2KVxuZXhwb3J0IGNvbnN0IGRlYnVnTG9nVHlwZTogTG9nVHlwZSA9IGdldExvZ1R5cGVCeUxldmVsKDIwKVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ1R5cGUge1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzaG9ydDogc3RyaW5nLFxuICAgIGxldmVsOiBudW1iZXIsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2dUeXBlQnlMZXZlbChcbiAgICBsZXZlbDogbnVtYmVyXG4pOiBMb2dUeXBlIHtcbiAgICBpZiAoXG4gICAgICAgIGxldmVsID09IDAgfHxcbiAgICAgICAgbGV2ZWwgPT0gNCB8fFxuICAgICAgICBsZXZlbCA9PSA4IHx8XG4gICAgICAgIGxldmVsID09IDEyIHx8XG4gICAgICAgIGxldmVsID09IDE2IHx8XG4gICAgICAgIGxldmVsID09IDIwXG4gICAgKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZXZlbDogbGV2ZWwsXG4gICAgICAgICAgICBuYW1lOiBsb2dOYW1lc1tsZXZlbCAvIDRdLFxuICAgICAgICAgICAgc2hvcnQ6IGxvZ1Nob3J0c1tsZXZlbCAvIDRdXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3VzdG9tTG9nVHlwZVtsZXZlbF0pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGN1c3RvbUxvZ1R5cGVbbGV2ZWxdLm5hbWUsXG4gICAgICAgICAgICBzaG9ydDogKGN1c3RvbUxvZ1R5cGVbbGV2ZWxdLnNob3J0KVxuICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsLFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGV2ZWw6IGxldmVsLFxuICAgICAgICBuYW1lOiBcIlVua25vd25cIixcbiAgICAgICAgc2hvcnQ6IFwiVU5LXCIsXG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZyB7XG4gICAgdGltZTogbnVtYmVyLFxuICAgIHR5cGU6IExvZ1R5cGUsXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBhcmVhPzogc3RyaW5nLFxufVxuXG5leHBvcnQgdHlwZSBMb2dQYXJzZXIgPSAobG9nOiBMb2cpID0+IHN0cmluZ1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdExvZ1BhcnNlcihsb2c6IExvZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldExvZ1RpbWVzdGVtcChsb2cudGltZSkgK1xuICAgICAgICBcInxcIiArIGxvZy50eXBlLnNob3J0ICtcbiAgICAgICAgXCJ8XCIgKyAoXG4gICAgICAgICAgICBsb2cuYXJlYSA/XG4gICAgICAgICAgICAgICAgbG9nLmFyZWEgKyBcInwgXCIgOlxuICAgICAgICAgICAgICAgIFwiIFwiXG4gICAgICAgICkgKyAoXG4gICAgICAgICAgICBsb2cudmFsdWVcbiAgICAgICAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAgICAgICAuam9pbihcIlxcbiAgXCIpXG4gICAgICAgICkgKyAoXG4gICAgICAgICAgICBsb2cudmFsdWUuaW5jbHVkZXMoXCJcXG5cIikgP1xuICAgICAgICAgICAgICAgIFwiXFxuXCIgOlxuICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9nVGltZXN0ZW1wKGRhdGU6IERhdGUgfCBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgZGF0ZSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlKVxuICAgIH1cblxuICAgIGxldCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpXG4gICAgbGV0IG1vbnRoID0gKCcwJyArIChkYXRlLmdldE1vbnRoKCkgKyAxKSkuc2xpY2UoLTIpXG4gICAgbGV0IGRheSA9ICgnMCcgKyBkYXRlLmdldERhdGUoKSkuc2xpY2UoLTIpXG4gICAgbGV0IGhvdXJzID0gKCcwJyArIGRhdGUuZ2V0SG91cnMoKSkuc2xpY2UoLTIpXG4gICAgbGV0IG1pbnV0ZXMgPSAoJzAnICsgZGF0ZS5nZXRNaW51dGVzKCkpLnNsaWNlKC0yKVxuICAgIGxldCBzZWNvbmRzID0gKCcwJyArIGRhdGUuZ2V0U2Vjb25kcygpKS5zbGljZSgtMilcblxuICAgIHJldHVybiBgJHt5ZWFyfS4ke21vbnRofS4ke2RheX0tJHtob3Vyc306JHttaW51dGVzfToke3NlY29uZHN9YFxufVxuXG5leHBvcnQgdHlwZSBQaXBlVGFyZ2V0RnVuYyA9ICgobG9nOiBMb2cpID0+IGFueSlcbmV4cG9ydCBpbnRlcmZhY2UgUGlwZVRhcmdldE9iamVjdCB7XG4gICAgYWRkTG9nOiAobG9nOiBMb2cpID0+IGFueVxufVxuXG5leHBvcnQgdHlwZSBQaXBlVGFyZ2V0ID0gUGlwZVRhcmdldEZ1bmMgfCBQaXBlVGFyZ2V0T2JqZWN0XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nUmV3cml0ZU9wdGlvbnMge1xuICAgIGlzQXJlYT86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIG5vdEFyZWE/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBzdGFydHNXaXRoQXJlYT86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIG5ld0FyZWFQcmVmaXg/OiBzdHJpbmcsXG4gICAganVzdFdpdGhvdXRBcmVhPzogYm9vbGVhbixcbiAgICBqdXN0V2l0aEFyZWE/OiBib29sZWFuLFxuICAgIG1pbkxvZ0xldmVsPzogbnVtYmVyLFxuICAgIG1heExvZ0xldmVsPzogbnVtYmVyLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ1Jld3JpdGVTZXR0aW5ncyB7XG4gICAgaXNBcmVhOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICBub3RBcmVhOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICBzdGFydHNXaXRoQXJlYTogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gICAgbmV3QXJlYVByZWZpeDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGp1c3RXaXRob3V0QXJlYT86IGJvb2xlYW4sXG4gICAganVzdFdpdGhBcmVhPzogYm9vbGVhbixcbiAgICBtaW5Mb2dMZXZlbD86IG51bWJlcixcbiAgICBtYXhMb2dMZXZlbD86IG51bWJlcixcbn1cblxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XG4gICAgcGlwZVRhcmdldHM6IFBpcGVUYXJnZXRbXSB8IHVuZGVmaW5lZFxuXG4gICAgc3RhdGljIFN0ZE91dDogTG9nZ2VyID0gbmV3IExvZ2dlcihcbiAgICAgICAgKGxvZzogTG9nKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oZGVmYXVsdExvZ1BhcnNlcihsb2cpKVxuICAgICAgICB9XG4gICAgKVxuXG4gICAgc3RhdGljIFN0ZFN0cmVhbXM6IExvZ2dlciA9IG5ldyBMb2dnZXIoXG4gICAgICAgIChsb2c6IExvZyk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGxvZy50eXBlLmxldmVsIDwgMTApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGRlZmF1bHRMb2dQYXJzZXIobG9nKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKGRlZmF1bHRMb2dQYXJzZXIobG9nKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIClcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwaXBlVGFyZ2V0czogUGlwZVRhcmdldCB8IFBpcGVUYXJnZXRbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICAgICAgcHVibGljIHByZWZpeDogc3RyaW5nIHwgdW5kZWZpbmVkID0gXCJcIixcbiAgICAgICAgcHVibGljIGxvZ3M6IExvZ1tdID0gW10sXG4gICAgKSB7XG4gICAgICAgIGlmIChwaXBlVGFyZ2V0cykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGlwZVRhcmdldHMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5waXBlVGFyZ2V0cyA9IHBpcGVUYXJnZXRzXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGlwZVRhcmdldHMgPSBbcGlwZVRhcmdldHNdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBpcGVUYXJnZXQgb2YgdGhpcy5waXBlVGFyZ2V0cykge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXBpcGVUYXJnZXQgfHxcbiAgICAgICAgICAgICAgICAgICAgcGlwZVRhcmdldCA9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwaXBlVGFyZ2V0ICE9IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBpcGVUYXJnZXQgIT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUGlwZSB0YXJnZXQgbmVlZCB0byBiZSBhbiBvYmplY3Qgd2l0aCBsb2cgbWV0aG9kIG9yIGEgY2FsYmFjayBmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBpcGVUYXJnZXQgPT0gdGhpcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW50IHNlbGVjdCBhIGxvZ2dlciBhcyBpdHMgb3duIHBpcGUgdGFyZ2V0XCIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV3cml0ZSA9IChcbiAgICAgICAgb3B0aW9uczogTG9nUmV3cml0ZU9wdGlvbnNcbiAgICApOiBQaXBlVGFyZ2V0RnVuYyA9PiB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzOiBMb2dSZXdyaXRlU2V0dGluZ3MgPSB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgaXNBcmVhOiAhb3B0aW9ucy5pc0FyZWEgP1xuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShvcHRpb25zLmlzQXJlYSkgP1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmlzQXJlYSA6XG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zLmlzQXJlYV0sXG4gICAgICAgICAgICBub3RBcmVhOiAhb3B0aW9ucy5ub3RBcmVhID9cbiAgICAgICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9ucy5ub3RBcmVhKSA/XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubm90QXJlYSA6XG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zLm5vdEFyZWFdLFxuICAgICAgICAgICAgc3RhcnRzV2l0aEFyZWE6ICFvcHRpb25zLnN0YXJ0c1dpdGhBcmVhID9cbiAgICAgICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9ucy5zdGFydHNXaXRoQXJlYSkgP1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXJ0c1dpdGhBcmVhIDpcbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbnMuc3RhcnRzV2l0aEFyZWFdLFxuICAgICAgICAgICAgbmV3QXJlYVByZWZpeDogb3B0aW9ucy5uZXdBcmVhUHJlZml4ID9cbiAgICAgICAgICAgICAgICBwYXJzZUFyZWEob3B0aW9ucy5uZXdBcmVhUHJlZml4KSA6XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChsb2cpID0+IHtcbiAgICAgICAgICAgIGlmIChsb2cuYXJlYSkge1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5qdXN0V2l0aG91dEFyZWEgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm5vdEFyZWEgJiZcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mubm90QXJlYS5pbmNsdWRlcyhsb2cuYXJlYSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5pc0FyZWEgJiZcbiAgICAgICAgICAgICAgICAgICAgIXNldHRpbmdzLmlzQXJlYS5pbmNsdWRlcyhsb2cuYXJlYSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zdGFydHNXaXRoQXJlYVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQ6IGJvb2xlYW4gPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0YXJ0c1dpdGhBcmVhIG9mIHNldHRpbmdzLnN0YXJ0c1dpdGhBcmVhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmFyZWEuc3RhcnRzV2l0aChzdGFydHNXaXRoQXJlYSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5qdXN0V2l0aEFyZWEgPT0gdHJ1ZSB8fFxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuaXNBcmVhICYmXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmlzQXJlYS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnN0YXJ0c1dpdGhBcmVhICYmXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnN0YXJ0c1dpdGhBcmVhLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNldHRpbmdzLm1heExvZ0xldmVsICYmXG4gICAgICAgICAgICAgICAgbG9nLnR5cGUubGV2ZWwgPiBzZXR0aW5ncy5tYXhMb2dMZXZlbFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5taW5Mb2dMZXZlbCAmJlxuICAgICAgICAgICAgICAgIGxvZy50eXBlLmxldmVsIDwgc2V0dGluZ3MubWluTG9nTGV2ZWxcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFkZExvZyh7XG4gICAgICAgICAgICAgICAgLi4ubG9nLFxuICAgICAgICAgICAgICAgIGFyZWE6IGxvZy5hcmVhID8gKFxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5uZXdBcmVhUHJlZml4ID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm5ld0FyZWFQcmVmaXggKyBcIi1cIiArIGxvZy5hcmVhIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5hcmVhXG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MubmV3QXJlYVByZWZpeCA/XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5uZXdBcmVhUHJlZml4IDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwaXBlKFxuICAgICAgICBwaXBlVGFyZ2V0OiBQaXBlVGFyZ2V0LFxuICAgICAgICBqdXN0TmV3TG9nczogYm9vbGVhbiA9IGZhbHNlXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFwaXBlVGFyZ2V0IHx8XG4gICAgICAgICAgICBwaXBlVGFyZ2V0ID09IG51bGwgfHxcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgcGlwZVRhcmdldCAhPSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgcGlwZVRhcmdldCAhPSBcIm9iamVjdFwiXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiUGlwZSB0YXJnZXQgbmVlZCB0byBiZSBhbiBvYmplY3Qgd2l0aCBsb2cgbWV0aG9kIG9yIGEgY2FsYmFjayBmdW5jdGlvblwiXG4gICAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAocGlwZVRhcmdldCA9PSB0aGlzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW50IHNlbGVjdCBhIGxvZ2dlciBhcyBpdHMgb3duIHBpcGUgdGFyZ2V0XCIpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWp1c3ROZXdMb2dzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxvZyBvZiB0aGlzLmxvZ3MpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBpcGVUYXJnZXQgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBpcGVUYXJnZXQobG9nKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBpcGVUYXJnZXQuYWRkTG9nKGxvZylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMucGlwZVRhcmdldHMpIHtcbiAgICAgICAgICAgIHRoaXMucGlwZVRhcmdldHMgPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5waXBlVGFyZ2V0cy5wdXNoKHBpcGVUYXJnZXQpXG4gICAgfVxuXG4gICAgdW5waXBlKFxuICAgICAgICBwaXBlVGFyZ2V0OiBQaXBlVGFyZ2V0LFxuICAgICk6IHZvaWQge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5waXBlVGFyZ2V0cyB8fFxuICAgICAgICAgICAgcGlwZVRhcmdldCA9PSB0aGlzXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhcGlwZVRhcmdldCB8fFxuICAgICAgICAgICAgcGlwZVRhcmdldCA9PSBudWxsIHx8XG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgdHlwZW9mIHBpcGVUYXJnZXQgIT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHBpcGVUYXJnZXQgIT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIlBpcGUgdGFyZ2V0IG5lZWQgdG8gYmUgYW4gb2JqZWN0IHdpdGggbG9nIG1ldGhvZCBvciBhIGNhbGJhY2sgZnVuY3Rpb25cIlxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwaXBlVGFyZ2V0ID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgY29uc3QgcGlwZVRhcmdldFN0cmluZyA9IFwiXCIgKyBwaXBlVGFyZ2V0XG5cbiAgICAgICAgICAgIHRoaXMucGlwZVRhcmdldHMgPSB0aGlzLnBpcGVUYXJnZXRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAodikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHYgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIHYgIT0gcGlwZVRhcmdldFN0cmluZ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5waXBlVGFyZ2V0cyA9IHRoaXMucGlwZVRhcmdldHMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdiAhPSBwaXBlVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5waXBlVGFyZ2V0cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5waXBlVGFyZ2V0cyA9IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdW5waXBlQWxsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpcGVUYXJnZXRzID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9ncyA9IFtdXG4gICAgfVxuXG4gICAgZmF0YWwoXG4gICAgICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIGFyZWE/OiBzdHJpbmcsXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgZmF0YWxMb2dUeXBlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBhcmVhXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBlcnJvcihcbiAgICAgICAgdmFsdWU6IHN0cmluZyxcbiAgICAgICAgYXJlYT86IHN0cmluZyxcbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgICBlcnJvckxvZ1R5cGUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGFyZWFcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHdhcm4oXG4gICAgICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIGFyZWE/OiBzdHJpbmcsXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgd2FybmluZ0xvZ1R5cGUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGFyZWFcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGluZm8oXG4gICAgICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIGFyZWE/OiBzdHJpbmcsXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgaW5mb0xvZ1R5cGUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGFyZWFcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHRyYWNlKFxuICAgICAgICB2YWx1ZTogc3RyaW5nLFxuICAgICAgICBhcmVhPzogc3RyaW5nLFxuICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZyhcbiAgICAgICAgICAgIHRyYWNlTG9nVHlwZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgYXJlYVxuICAgICAgICApXG4gICAgfVxuXG4gICAgZGVidWcoXG4gICAgICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIGFyZWE/OiBzdHJpbmcsXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgZGVidWdMb2dUeXBlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBhcmVhXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBsb2coXG4gICAgICAgIGxldmVsOiBudW1iZXIgfCBMb2dUeXBlLFxuICAgICAgICB2YWx1ZTogc3RyaW5nLFxuICAgICAgICBhcmVhPzogc3RyaW5nLFxuICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZExvZyh7XG4gICAgICAgICAgICB0eXBlOiB0eXBlb2YgbGV2ZWwgPT0gXCJudW1iZXJcIiA/XG4gICAgICAgICAgICAgICAgZ2V0TG9nVHlwZUJ5TGV2ZWwobGV2ZWwpIDpcbiAgICAgICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICAgIHZhbHVlOiAoXG4gICAgICAgICAgICAgICAgdGhpcy5wcmVmaXggIT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVmaXggKyB2YWx1ZSA6XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgYXJlYTogYXJlYSA/XG4gICAgICAgICAgICAgICAgcGFyc2VBcmVhKGFyZWEpIDpcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICB0aW1lOiBEYXRlLm5vdygpLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGFkZExvZyhcbiAgICAgICAgbG9nOiBMb2csXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9ncy5wdXNoKGxvZylcblxuICAgICAgICBpZiAodGhpcy5waXBlVGFyZ2V0cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwaXBlVGFyZ2V0IG9mIHRoaXMucGlwZVRhcmdldHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBpcGVUYXJnZXQgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBpcGVUYXJnZXQobG9nKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBpcGVUYXJnZXQuYWRkTG9nKGxvZylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRBYm92ZShcbiAgICAgICAgbGV2ZWw6IG51bWJlcixcbiAgICAgICAgaW5jbHVkZUxldmVsOiBib29sZWFuLFxuICAgICk6IExvZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9ncy5maWx0ZXIoXG4gICAgICAgICAgICAodikgPT4gaW5jbHVkZUxldmVsID9cbiAgICAgICAgICAgICAgICB2LnR5cGUubGV2ZWwgPj0gbGV2ZWwgOlxuICAgICAgICAgICAgICAgIHYudHlwZS5sZXZlbCA+IGxldmVsXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBnZXRCZWxvdyhcbiAgICAgICAgbGV2ZWw6IG51bWJlcixcbiAgICAgICAgaW5jbHVkZUxldmVsOiBib29sZWFuLFxuICAgICk6IExvZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9ncy5maWx0ZXIoXG4gICAgICAgICAgICAodikgPT4gaW5jbHVkZUxldmVsID9cbiAgICAgICAgICAgICAgICB2LnR5cGUubGV2ZWwgPD0gbGV2ZWwgOlxuICAgICAgICAgICAgICAgIHYudHlwZS5sZXZlbCA8IGxldmVsXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBnZXRMb2dzV2l0aEFyZWFzKFxuICAgICAgICBhcmVhczogc3RyaW5nW11cbiAgICApOiBMb2dbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvZ3MuZmlsdGVyKFxuICAgICAgICAgICAgKHYpID0+IHYuYXJlYSA/XG4gICAgICAgICAgICAgICAgYXJlYXMuaW5jbHVkZXModi5hcmVhKSA6XG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGdldExvZ3NJbkFyZWEoXG4gICAgICAgIGFyZWFzOiBzdHJpbmdbXVxuICAgICk6IExvZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9ncy5maWx0ZXIoXG4gICAgICAgICAgICAodikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdi5hcmVhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXJlYSBvZiBhcmVhcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJlYS5zdGFydHNXaXRoKHYuYXJlYSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICB9XG5cbiAgICBnZXRMb2dzTm90SW5BcmVhcyhcbiAgICAgICAgYXJlYXM6IHN0cmluZ1tdXG4gICAgKTogTG9nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2dzLmZpbHRlcihcbiAgICAgICAgICAgICh2KSA9PiB2LmFyZWEgP1xuICAgICAgICAgICAgICAgICFhcmVhcy5pbmNsdWRlcyh2LmFyZWEpIDpcbiAgICAgICAgICAgICAgICAhYXJlYXMuaW5jbHVkZXMoXCJkZWZhdWx0XCIpXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBwYXJzZUxvZ3MoXG4gICAgICAgIGxvZ1BhcnNlcjogTG9nUGFyc2VyID0gZGVmYXVsdExvZ1BhcnNlcixcbiAgICApIHtcbiAgICAgICAgbGV0IG91dDogc3RyaW5nID0gXCJcIlxuICAgICAgICBmb3IgKGNvbnN0IGxvZyBvZiB0aGlzLmxvZ3MpIHtcbiAgICAgICAgICAgIG91dCArPSBsb2dQYXJzZXIobG9nKSArIFwiXFxuXCJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBcmVhKFxuICAgIGFyZWE6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgICBhcmVhID0gYXJlYS50b0xvd2VyQ2FzZSgpXG4gICAgd2hpbGUgKGFyZWEuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgYXJlYSA9IGFyZWEuc2xpY2UoMSlcbiAgICB9XG5cbiAgICB3aGlsZSAoYXJlYS5lbmRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgYXJlYSA9IGFyZWEuc2xpY2UoMCwgLTEpXG4gICAgfVxuXG4gICAgaWYgKGFyZWEuaW5jbHVkZXMoXCIgXCIpKSB7XG4gICAgICAgIGFyZWEgPSBhcmVhLnNwbGl0KFwiIFwiKS5qb2luKFwiLVwiKVxuICAgIH1cbiAgICBpZiAoYXJlYS5pbmNsdWRlcyhcIl9cIikpIHtcbiAgICAgICAgYXJlYSA9IGFyZWEuc3BsaXQoXCJfXCIpLmpvaW4oXCItXCIpXG4gICAgfVxuICAgIGlmIChhcmVhLmluY2x1ZGVzKFwiI1wiKSkge1xuICAgICAgICBhcmVhID0gYXJlYS5zcGxpdChcIiNcIikuam9pbihcIi1cIilcbiAgICB9XG4gICAgaWYgKGFyZWEuaW5jbHVkZXMoXCI7XCIpKSB7XG4gICAgICAgIGFyZWEgPSBhcmVhLnNwbGl0KFwiO1wiKS5qb2luKFwiLVwiKVxuICAgIH1cbiAgICBpZiAoYXJlYS5pbmNsdWRlcyhcIi9cIikpIHtcbiAgICAgICAgYXJlYSA9IGFyZWEuc3BsaXQoXCIvXCIpLmpvaW4oXCItXCIpXG4gICAgfVxuICAgIGlmIChhcmVhLmluY2x1ZGVzKFwiXFxcXFwiKSkge1xuICAgICAgICBhcmVhID0gYXJlYS5zcGxpdChcIlxcXFxcIikuam9pbihcIi1cIilcbiAgICB9XG4gICAgcmV0dXJuIGFyZWFcbn0iXX0=