mirror of
https://github.com/mossy1022/Smart-Connections-Visualizer.git
synced 2026-07-22 10:20:27 +00:00
7862 lines
1.3 MiB
7862 lines
1.3 MiB
/*
|
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
if you want to view the source, please visit the github repository of this plugin
|
|
*/
|
|
|
|
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 __commonJS = (cb, mod) => function __require() {
|
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
};
|
|
var __export = (target, all) => {
|
|
for (var name in all)
|
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
};
|
|
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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
// If the importer is in node compatibility mode or this is not an ESM
|
|
// file that has been converted to a CommonJS file using a Babel-
|
|
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
mod
|
|
));
|
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
|
|
// node_modules/bootstrap/dist/js/bootstrap.bundle.min.js
|
|
var require_bootstrap_bundle_min = __commonJS({
|
|
"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"(exports, module2) {
|
|
!function(t, e) {
|
|
"object" == typeof exports && "undefined" != typeof module2 ? module2.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).bootstrap = e();
|
|
}(exports, function() {
|
|
"use strict";
|
|
const t = /* @__PURE__ */ new Map(), e = { set(e3, i2, n2) {
|
|
t.has(e3) || t.set(e3, /* @__PURE__ */ new Map());
|
|
const s2 = t.get(e3);
|
|
s2.has(i2) || 0 === s2.size ? s2.set(i2, n2) : console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s2.keys())[0]}.`);
|
|
}, get: (e3, i2) => t.has(e3) && t.get(e3).get(i2) || null, remove(e3, i2) {
|
|
if (!t.has(e3))
|
|
return;
|
|
const n2 = t.get(e3);
|
|
n2.delete(i2), 0 === n2.size && t.delete(e3);
|
|
} }, i = "transitionend", n = (t2) => (t2 && window.CSS && window.CSS.escape && (t2 = t2.replace(/#([^\s"#']+)/g, (t3, e3) => `#${CSS.escape(e3)}`)), t2), s = (t2) => {
|
|
t2.dispatchEvent(new Event(i));
|
|
}, o = (t2) => !(!t2 || "object" != typeof t2) && (void 0 !== t2.jquery && (t2 = t2[0]), void 0 !== t2.nodeType), r = (t2) => o(t2) ? t2.jquery ? t2[0] : t2 : "string" == typeof t2 && t2.length > 0 ? document.querySelector(n(t2)) : null, a2 = (t2) => {
|
|
if (!o(t2) || 0 === t2.getClientRects().length)
|
|
return false;
|
|
const e3 = "visible" === getComputedStyle(t2).getPropertyValue("visibility"), i2 = t2.closest("details:not([open])");
|
|
if (!i2)
|
|
return e3;
|
|
if (i2 !== t2) {
|
|
const e4 = t2.closest("summary");
|
|
if (e4 && e4.parentNode !== i2)
|
|
return false;
|
|
if (null === e4)
|
|
return false;
|
|
}
|
|
return e3;
|
|
}, l = (t2) => !t2 || t2.nodeType !== Node.ELEMENT_NODE || !!t2.classList.contains("disabled") || (void 0 !== t2.disabled ? t2.disabled : t2.hasAttribute("disabled") && "false" !== t2.getAttribute("disabled")), c2 = (t2) => {
|
|
if (!document.documentElement.attachShadow)
|
|
return null;
|
|
if ("function" == typeof t2.getRootNode) {
|
|
const e3 = t2.getRootNode();
|
|
return e3 instanceof ShadowRoot ? e3 : null;
|
|
}
|
|
return t2 instanceof ShadowRoot ? t2 : t2.parentNode ? c2(t2.parentNode) : null;
|
|
}, h = () => {
|
|
}, d = (t2) => {
|
|
t2.offsetHeight;
|
|
}, u = () => window.jQuery && !document.body.hasAttribute("data-bs-no-jquery") ? window.jQuery : null, f = [], p = () => "rtl" === document.documentElement.dir, m2 = (t2) => {
|
|
var e3;
|
|
e3 = () => {
|
|
const e4 = u();
|
|
if (e4) {
|
|
const i2 = t2.NAME, n2 = e4.fn[i2];
|
|
e4.fn[i2] = t2.jQueryInterface, e4.fn[i2].Constructor = t2, e4.fn[i2].noConflict = () => (e4.fn[i2] = n2, t2.jQueryInterface);
|
|
}
|
|
}, "loading" === document.readyState ? (f.length || document.addEventListener("DOMContentLoaded", () => {
|
|
for (const t3 of f)
|
|
t3();
|
|
}), f.push(e3)) : e3();
|
|
}, g = (t2, e3 = [], i2 = t2) => "function" == typeof t2 ? t2(...e3) : i2, _ = (t2, e3, n2 = true) => {
|
|
if (!n2)
|
|
return void g(t2);
|
|
const o2 = ((t3) => {
|
|
if (!t3)
|
|
return 0;
|
|
let { transitionDuration: e4, transitionDelay: i2 } = window.getComputedStyle(t3);
|
|
const n3 = Number.parseFloat(e4), s2 = Number.parseFloat(i2);
|
|
return n3 || s2 ? (e4 = e4.split(",")[0], i2 = i2.split(",")[0], 1e3 * (Number.parseFloat(e4) + Number.parseFloat(i2))) : 0;
|
|
})(e3) + 5;
|
|
let r2 = false;
|
|
const a3 = ({ target: n3 }) => {
|
|
n3 === e3 && (r2 = true, e3.removeEventListener(i, a3), g(t2));
|
|
};
|
|
e3.addEventListener(i, a3), setTimeout(() => {
|
|
r2 || s(e3);
|
|
}, o2);
|
|
}, b = (t2, e3, i2, n2) => {
|
|
const s2 = t2.length;
|
|
let o2 = t2.indexOf(e3);
|
|
return -1 === o2 ? !i2 && n2 ? t2[s2 - 1] : t2[0] : (o2 += i2 ? 1 : -1, n2 && (o2 = (o2 + s2) % s2), t2[Math.max(0, Math.min(o2, s2 - 1))]);
|
|
}, v = /[^.]*(?=\..*)\.|.*/, y3 = /\..*/, w = /::\d+$/, A = {};
|
|
let E = 1;
|
|
const T = { mouseenter: "mouseover", mouseleave: "mouseout" }, C = /* @__PURE__ */ new Set(["click", "dblclick", "mouseup", "mousedown", "contextmenu", "mousewheel", "DOMMouseScroll", "mouseover", "mouseout", "mousemove", "selectstart", "selectend", "keydown", "keypress", "keyup", "orientationchange", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup", "pointerleave", "pointercancel", "gesturestart", "gesturechange", "gestureend", "focus", "blur", "change", "reset", "select", "submit", "focusin", "focusout", "load", "unload", "beforeunload", "resize", "move", "DOMContentLoaded", "readystatechange", "error", "abort", "scroll"]);
|
|
function O(t2, e3) {
|
|
return e3 && `${e3}::${E++}` || t2.uidEvent || E++;
|
|
}
|
|
function x3(t2) {
|
|
const e3 = O(t2);
|
|
return t2.uidEvent = e3, A[e3] = A[e3] || {}, A[e3];
|
|
}
|
|
function k(t2, e3, i2 = null) {
|
|
return Object.values(t2).find((t3) => t3.callable === e3 && t3.delegationSelector === i2);
|
|
}
|
|
function L(t2, e3, i2) {
|
|
const n2 = "string" == typeof e3, s2 = n2 ? i2 : e3 || i2;
|
|
let o2 = I(t2);
|
|
return C.has(o2) || (o2 = t2), [n2, s2, o2];
|
|
}
|
|
function S(t2, e3, i2, n2, s2) {
|
|
if ("string" != typeof e3 || !t2)
|
|
return;
|
|
let [o2, r2, a3] = L(e3, i2, n2);
|
|
if (e3 in T) {
|
|
const t3 = (t4) => function(e4) {
|
|
if (!e4.relatedTarget || e4.relatedTarget !== e4.delegateTarget && !e4.delegateTarget.contains(e4.relatedTarget))
|
|
return t4.call(this, e4);
|
|
};
|
|
r2 = t3(r2);
|
|
}
|
|
const l2 = x3(t2), c3 = l2[a3] || (l2[a3] = {}), h2 = k(c3, r2, o2 ? i2 : null);
|
|
if (h2)
|
|
return void (h2.oneOff = h2.oneOff && s2);
|
|
const d2 = O(r2, e3.replace(v, "")), u2 = o2 ? function(t3, e4, i3) {
|
|
return function n3(s3) {
|
|
const o3 = t3.querySelectorAll(e4);
|
|
for (let { target: r3 } = s3; r3 && r3 !== this; r3 = r3.parentNode)
|
|
for (const a4 of o3)
|
|
if (a4 === r3)
|
|
return P(s3, { delegateTarget: r3 }), n3.oneOff && N.off(t3, s3.type, e4, i3), i3.apply(r3, [s3]);
|
|
};
|
|
}(t2, i2, r2) : function(t3, e4) {
|
|
return function i3(n3) {
|
|
return P(n3, { delegateTarget: t3 }), i3.oneOff && N.off(t3, n3.type, e4), e4.apply(t3, [n3]);
|
|
};
|
|
}(t2, r2);
|
|
u2.delegationSelector = o2 ? i2 : null, u2.callable = r2, u2.oneOff = s2, u2.uidEvent = d2, c3[d2] = u2, t2.addEventListener(a3, u2, o2);
|
|
}
|
|
function D(t2, e3, i2, n2, s2) {
|
|
const o2 = k(e3[i2], n2, s2);
|
|
o2 && (t2.removeEventListener(i2, o2, Boolean(s2)), delete e3[i2][o2.uidEvent]);
|
|
}
|
|
function $(t2, e3, i2, n2) {
|
|
const s2 = e3[i2] || {};
|
|
for (const [o2, r2] of Object.entries(s2))
|
|
o2.includes(n2) && D(t2, e3, i2, r2.callable, r2.delegationSelector);
|
|
}
|
|
function I(t2) {
|
|
return t2 = t2.replace(y3, ""), T[t2] || t2;
|
|
}
|
|
const N = { on(t2, e3, i2, n2) {
|
|
S(t2, e3, i2, n2, false);
|
|
}, one(t2, e3, i2, n2) {
|
|
S(t2, e3, i2, n2, true);
|
|
}, off(t2, e3, i2, n2) {
|
|
if ("string" != typeof e3 || !t2)
|
|
return;
|
|
const [s2, o2, r2] = L(e3, i2, n2), a3 = r2 !== e3, l2 = x3(t2), c3 = l2[r2] || {}, h2 = e3.startsWith(".");
|
|
if (void 0 === o2) {
|
|
if (h2)
|
|
for (const i3 of Object.keys(l2))
|
|
$(t2, l2, i3, e3.slice(1));
|
|
for (const [i3, n3] of Object.entries(c3)) {
|
|
const s3 = i3.replace(w, "");
|
|
a3 && !e3.includes(s3) || D(t2, l2, r2, n3.callable, n3.delegationSelector);
|
|
}
|
|
} else {
|
|
if (!Object.keys(c3).length)
|
|
return;
|
|
D(t2, l2, r2, o2, s2 ? i2 : null);
|
|
}
|
|
}, trigger(t2, e3, i2) {
|
|
if ("string" != typeof e3 || !t2)
|
|
return null;
|
|
const n2 = u();
|
|
let s2 = null, o2 = true, r2 = true, a3 = false;
|
|
e3 !== I(e3) && n2 && (s2 = n2.Event(e3, i2), n2(t2).trigger(s2), o2 = !s2.isPropagationStopped(), r2 = !s2.isImmediatePropagationStopped(), a3 = s2.isDefaultPrevented());
|
|
const l2 = P(new Event(e3, { bubbles: o2, cancelable: true }), i2);
|
|
return a3 && l2.preventDefault(), r2 && t2.dispatchEvent(l2), l2.defaultPrevented && s2 && s2.preventDefault(), l2;
|
|
} };
|
|
function P(t2, e3 = {}) {
|
|
for (const [i2, n2] of Object.entries(e3))
|
|
try {
|
|
t2[i2] = n2;
|
|
} catch (e4) {
|
|
Object.defineProperty(t2, i2, { configurable: true, get: () => n2 });
|
|
}
|
|
return t2;
|
|
}
|
|
function j(t2) {
|
|
if ("true" === t2)
|
|
return true;
|
|
if ("false" === t2)
|
|
return false;
|
|
if (t2 === Number(t2).toString())
|
|
return Number(t2);
|
|
if ("" === t2 || "null" === t2)
|
|
return null;
|
|
if ("string" != typeof t2)
|
|
return t2;
|
|
try {
|
|
return JSON.parse(decodeURIComponent(t2));
|
|
} catch (e3) {
|
|
return t2;
|
|
}
|
|
}
|
|
function M(t2) {
|
|
return t2.replace(/[A-Z]/g, (t3) => `-${t3.toLowerCase()}`);
|
|
}
|
|
const F = { setDataAttribute(t2, e3, i2) {
|
|
t2.setAttribute(`data-bs-${M(e3)}`, i2);
|
|
}, removeDataAttribute(t2, e3) {
|
|
t2.removeAttribute(`data-bs-${M(e3)}`);
|
|
}, getDataAttributes(t2) {
|
|
if (!t2)
|
|
return {};
|
|
const e3 = {}, i2 = Object.keys(t2.dataset).filter((t3) => t3.startsWith("bs") && !t3.startsWith("bsConfig"));
|
|
for (const n2 of i2) {
|
|
let i3 = n2.replace(/^bs/, "");
|
|
i3 = i3.charAt(0).toLowerCase() + i3.slice(1, i3.length), e3[i3] = j(t2.dataset[n2]);
|
|
}
|
|
return e3;
|
|
}, getDataAttribute: (t2, e3) => j(t2.getAttribute(`data-bs-${M(e3)}`)) };
|
|
class H {
|
|
static get Default() {
|
|
return {};
|
|
}
|
|
static get DefaultType() {
|
|
return {};
|
|
}
|
|
static get NAME() {
|
|
throw new Error('You have to implement the static method "NAME", for each component!');
|
|
}
|
|
_getConfig(t2) {
|
|
return t2 = this._mergeConfigObj(t2), t2 = this._configAfterMerge(t2), this._typeCheckConfig(t2), t2;
|
|
}
|
|
_configAfterMerge(t2) {
|
|
return t2;
|
|
}
|
|
_mergeConfigObj(t2, e3) {
|
|
const i2 = o(e3) ? F.getDataAttribute(e3, "config") : {};
|
|
return { ...this.constructor.Default, ..."object" == typeof i2 ? i2 : {}, ...o(e3) ? F.getDataAttributes(e3) : {}, ..."object" == typeof t2 ? t2 : {} };
|
|
}
|
|
_typeCheckConfig(t2, e3 = this.constructor.DefaultType) {
|
|
for (const [n2, s2] of Object.entries(e3)) {
|
|
const e4 = t2[n2], r2 = o(e4) ? "element" : null == (i2 = e4) ? `${i2}` : Object.prototype.toString.call(i2).match(/\s([a-z]+)/i)[1].toLowerCase();
|
|
if (!new RegExp(s2).test(r2))
|
|
throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n2}" provided type "${r2}" but expected type "${s2}".`);
|
|
}
|
|
var i2;
|
|
}
|
|
}
|
|
class W extends H {
|
|
constructor(t2, i2) {
|
|
super(), (t2 = r(t2)) && (this._element = t2, this._config = this._getConfig(i2), e.set(this._element, this.constructor.DATA_KEY, this));
|
|
}
|
|
dispose() {
|
|
e.remove(this._element, this.constructor.DATA_KEY), N.off(this._element, this.constructor.EVENT_KEY);
|
|
for (const t2 of Object.getOwnPropertyNames(this))
|
|
this[t2] = null;
|
|
}
|
|
_queueCallback(t2, e3, i2 = true) {
|
|
_(t2, e3, i2);
|
|
}
|
|
_getConfig(t2) {
|
|
return t2 = this._mergeConfigObj(t2, this._element), t2 = this._configAfterMerge(t2), this._typeCheckConfig(t2), t2;
|
|
}
|
|
static getInstance(t2) {
|
|
return e.get(r(t2), this.DATA_KEY);
|
|
}
|
|
static getOrCreateInstance(t2, e3 = {}) {
|
|
return this.getInstance(t2) || new this(t2, "object" == typeof e3 ? e3 : null);
|
|
}
|
|
static get VERSION() {
|
|
return "5.3.3";
|
|
}
|
|
static get DATA_KEY() {
|
|
return `bs.${this.NAME}`;
|
|
}
|
|
static get EVENT_KEY() {
|
|
return `.${this.DATA_KEY}`;
|
|
}
|
|
static eventName(t2) {
|
|
return `${t2}${this.EVENT_KEY}`;
|
|
}
|
|
}
|
|
const B = (t2) => {
|
|
let e3 = t2.getAttribute("data-bs-target");
|
|
if (!e3 || "#" === e3) {
|
|
let i2 = t2.getAttribute("href");
|
|
if (!i2 || !i2.includes("#") && !i2.startsWith("."))
|
|
return null;
|
|
i2.includes("#") && !i2.startsWith("#") && (i2 = `#${i2.split("#")[1]}`), e3 = i2 && "#" !== i2 ? i2.trim() : null;
|
|
}
|
|
return e3 ? e3.split(",").map((t3) => n(t3)).join(",") : null;
|
|
}, z = { find: (t2, e3 = document.documentElement) => [].concat(...Element.prototype.querySelectorAll.call(e3, t2)), findOne: (t2, e3 = document.documentElement) => Element.prototype.querySelector.call(e3, t2), children: (t2, e3) => [].concat(...t2.children).filter((t3) => t3.matches(e3)), parents(t2, e3) {
|
|
const i2 = [];
|
|
let n2 = t2.parentNode.closest(e3);
|
|
for (; n2; )
|
|
i2.push(n2), n2 = n2.parentNode.closest(e3);
|
|
return i2;
|
|
}, prev(t2, e3) {
|
|
let i2 = t2.previousElementSibling;
|
|
for (; i2; ) {
|
|
if (i2.matches(e3))
|
|
return [i2];
|
|
i2 = i2.previousElementSibling;
|
|
}
|
|
return [];
|
|
}, next(t2, e3) {
|
|
let i2 = t2.nextElementSibling;
|
|
for (; i2; ) {
|
|
if (i2.matches(e3))
|
|
return [i2];
|
|
i2 = i2.nextElementSibling;
|
|
}
|
|
return [];
|
|
}, focusableChildren(t2) {
|
|
const e3 = ["a", "button", "input", "textarea", "select", "details", "[tabindex]", '[contenteditable="true"]'].map((t3) => `${t3}:not([tabindex^="-"])`).join(",");
|
|
return this.find(e3, t2).filter((t3) => !l(t3) && a2(t3));
|
|
}, getSelectorFromElement(t2) {
|
|
const e3 = B(t2);
|
|
return e3 && z.findOne(e3) ? e3 : null;
|
|
}, getElementFromSelector(t2) {
|
|
const e3 = B(t2);
|
|
return e3 ? z.findOne(e3) : null;
|
|
}, getMultipleElementsFromSelector(t2) {
|
|
const e3 = B(t2);
|
|
return e3 ? z.find(e3) : [];
|
|
} }, R = (t2, e3 = "hide") => {
|
|
const i2 = `click.dismiss${t2.EVENT_KEY}`, n2 = t2.NAME;
|
|
N.on(document, i2, `[data-bs-dismiss="${n2}"]`, function(i3) {
|
|
if (["A", "AREA"].includes(this.tagName) && i3.preventDefault(), l(this))
|
|
return;
|
|
const s2 = z.getElementFromSelector(this) || this.closest(`.${n2}`);
|
|
t2.getOrCreateInstance(s2)[e3]();
|
|
});
|
|
}, q = ".bs.alert", V = `close${q}`, K = `closed${q}`;
|
|
class Q extends W {
|
|
static get NAME() {
|
|
return "alert";
|
|
}
|
|
close() {
|
|
if (N.trigger(this._element, V).defaultPrevented)
|
|
return;
|
|
this._element.classList.remove("show");
|
|
const t2 = this._element.classList.contains("fade");
|
|
this._queueCallback(() => this._destroyElement(), this._element, t2);
|
|
}
|
|
_destroyElement() {
|
|
this._element.remove(), N.trigger(this._element, K), this.dispose();
|
|
}
|
|
static jQueryInterface(t2) {
|
|
return this.each(function() {
|
|
const e3 = Q.getOrCreateInstance(this);
|
|
if ("string" == typeof t2) {
|
|
if (void 0 === e3[t2] || t2.startsWith("_") || "constructor" === t2)
|
|
throw new TypeError(`No method named "${t2}"`);
|
|
e3[t2](this);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
R(Q, "close"), m2(Q);
|
|
const X2 = '[data-bs-toggle="button"]';
|
|
class Y2 extends W {
|
|
static get NAME() {
|
|
return "button";
|
|
}
|
|
toggle() {
|
|
this._element.setAttribute("aria-pressed", this._element.classList.toggle("active"));
|
|
}
|
|
static jQueryInterface(t2) {
|
|
return this.each(function() {
|
|
const e3 = Y2.getOrCreateInstance(this);
|
|
"toggle" === t2 && e3[t2]();
|
|
});
|
|
}
|
|
}
|
|
N.on(document, "click.bs.button.data-api", X2, (t2) => {
|
|
t2.preventDefault();
|
|
const e3 = t2.target.closest(X2);
|
|
Y2.getOrCreateInstance(e3).toggle();
|
|
}), m2(Y2);
|
|
const U = ".bs.swipe", G = `touchstart${U}`, J = `touchmove${U}`, Z = `touchend${U}`, tt = `pointerdown${U}`, et = `pointerup${U}`, it = { endCallback: null, leftCallback: null, rightCallback: null }, nt = { endCallback: "(function|null)", leftCallback: "(function|null)", rightCallback: "(function|null)" };
|
|
class st extends H {
|
|
constructor(t2, e3) {
|
|
super(), this._element = t2, t2 && st.isSupported() && (this._config = this._getConfig(e3), this._deltaX = 0, this._supportPointerEvents = Boolean(window.PointerEvent), this._initEvents());
|
|
}
|
|
static get Default() {
|
|
return it;
|
|
}
|
|
static get DefaultType() {
|
|
return nt;
|
|
}
|
|
static get NAME() {
|
|
return "swipe";
|
|
}
|
|
dispose() {
|
|
N.off(this._element, U);
|
|
}
|
|
_start(t2) {
|
|
this._supportPointerEvents ? this._eventIsPointerPenTouch(t2) && (this._deltaX = t2.clientX) : this._deltaX = t2.touches[0].clientX;
|
|
}
|
|
_end(t2) {
|
|
this._eventIsPointerPenTouch(t2) && (this._deltaX = t2.clientX - this._deltaX), this._handleSwipe(), g(this._config.endCallback);
|
|
}
|
|
_move(t2) {
|
|
this._deltaX = t2.touches && t2.touches.length > 1 ? 0 : t2.touches[0].clientX - this._deltaX;
|
|
}
|
|
_handleSwipe() {
|
|
const t2 = Math.abs(this._deltaX);
|
|
if (t2 <= 40)
|
|
return;
|
|
const e3 = t2 / this._deltaX;
|
|
this._deltaX = 0, e3 && g(e3 > 0 ? this._config.rightCallback : this._config.leftCallback);
|
|
}
|
|
_initEvents() {
|
|
this._supportPointerEvents ? (N.on(this._element, tt, (t2) => this._start(t2)), N.on(this._element, et, (t2) => this._end(t2)), this._element.classList.add("pointer-event")) : (N.on(this._element, G, (t2) => this._start(t2)), N.on(this._element, J, (t2) => this._move(t2)), N.on(this._element, Z, (t2) => this._end(t2)));
|
|
}
|
|
_eventIsPointerPenTouch(t2) {
|
|
return this._supportPointerEvents && ("pen" === t2.pointerType || "touch" === t2.pointerType);
|
|
}
|
|
static isSupported() {
|
|
return "ontouchstart" in document.documentElement || navigator.maxTouchPoints > 0;
|
|
}
|
|
}
|
|
const ot = ".bs.carousel", rt = ".data-api", at = "next", lt = "prev", ct = "left", ht = "right", dt = `slide${ot}`, ut = `slid${ot}`, ft = `keydown${ot}`, pt = `mouseenter${ot}`, mt = `mouseleave${ot}`, gt = `dragstart${ot}`, _t = `load${ot}${rt}`, bt = `click${ot}${rt}`, vt = "carousel", yt = "active", wt = ".active", At = ".carousel-item", Et = wt + At, Tt = { ArrowLeft: ht, ArrowRight: ct }, Ct = { interval: 5e3, keyboard: true, pause: "hover", ride: false, touch: true, wrap: true }, Ot = { interval: "(number|boolean)", keyboard: "boolean", pause: "(string|boolean)", ride: "(boolean|string)", touch: "boolean", wrap: "boolean" };
|
|
class xt extends W {
|
|
constructor(t2, e3) {
|
|
super(t2, e3), this._interval = null, this._activeElement = null, this._isSliding = false, this.touchTimeout = null, this._swipeHelper = null, this._indicatorsElement = z.findOne(".carousel-indicators", this._element), this._addEventListeners(), this._config.ride === vt && this.cycle();
|
|
}
|
|
static get Default() {
|
|
return Ct;
|
|
}
|
|
static get DefaultType() {
|
|
return Ot;
|
|
}
|
|
static get NAME() {
|
|
return "carousel";
|
|
}
|
|
next() {
|
|
this._slide(at);
|
|
}
|
|
nextWhenVisible() {
|
|
!document.hidden && a2(this._element) && this.next();
|
|
}
|
|
prev() {
|
|
this._slide(lt);
|
|
}
|
|
pause() {
|
|
this._isSliding && s(this._element), this._clearInterval();
|
|
}
|
|
cycle() {
|
|
this._clearInterval(), this._updateInterval(), this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);
|
|
}
|
|
_maybeEnableCycle() {
|
|
this._config.ride && (this._isSliding ? N.one(this._element, ut, () => this.cycle()) : this.cycle());
|
|
}
|
|
to(t2) {
|
|
const e3 = this._getItems();
|
|
if (t2 > e3.length - 1 || t2 < 0)
|
|
return;
|
|
if (this._isSliding)
|
|
return void N.one(this._element, ut, () => this.to(t2));
|
|
const i2 = this._getItemIndex(this._getActive());
|
|
if (i2 === t2)
|
|
return;
|
|
const n2 = t2 > i2 ? at : lt;
|
|
this._slide(n2, e3[t2]);
|
|
}
|
|
dispose() {
|
|
this._swipeHelper && this._swipeHelper.dispose(), super.dispose();
|
|
}
|
|
_configAfterMerge(t2) {
|
|
return t2.defaultInterval = t2.interval, t2;
|
|
}
|
|
_addEventListeners() {
|
|
this._config.keyboard && N.on(this._element, ft, (t2) => this._keydown(t2)), "hover" === this._config.pause && (N.on(this._element, pt, () => this.pause()), N.on(this._element, mt, () => this._maybeEnableCycle())), this._config.touch && st.isSupported() && this._addTouchEventListeners();
|
|
}
|
|
_addTouchEventListeners() {
|
|
for (const t3 of z.find(".carousel-item img", this._element))
|
|
N.on(t3, gt, (t4) => t4.preventDefault());
|
|
const t2 = { leftCallback: () => this._slide(this._directionToOrder(ct)), rightCallback: () => this._slide(this._directionToOrder(ht)), endCallback: () => {
|
|
"hover" === this._config.pause && (this.pause(), this.touchTimeout && clearTimeout(this.touchTimeout), this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), 500 + this._config.interval));
|
|
} };
|
|
this._swipeHelper = new st(this._element, t2);
|
|
}
|
|
_keydown(t2) {
|
|
if (/input|textarea/i.test(t2.target.tagName))
|
|
return;
|
|
const e3 = Tt[t2.key];
|
|
e3 && (t2.preventDefault(), this._slide(this._directionToOrder(e3)));
|
|
}
|
|
_getItemIndex(t2) {
|
|
return this._getItems().indexOf(t2);
|
|
}
|
|
_setActiveIndicatorElement(t2) {
|
|
if (!this._indicatorsElement)
|
|
return;
|
|
const e3 = z.findOne(wt, this._indicatorsElement);
|
|
e3.classList.remove(yt), e3.removeAttribute("aria-current");
|
|
const i2 = z.findOne(`[data-bs-slide-to="${t2}"]`, this._indicatorsElement);
|
|
i2 && (i2.classList.add(yt), i2.setAttribute("aria-current", "true"));
|
|
}
|
|
_updateInterval() {
|
|
const t2 = this._activeElement || this._getActive();
|
|
if (!t2)
|
|
return;
|
|
const e3 = Number.parseInt(t2.getAttribute("data-bs-interval"), 10);
|
|
this._config.interval = e3 || this._config.defaultInterval;
|
|
}
|
|
_slide(t2, e3 = null) {
|
|
if (this._isSliding)
|
|
return;
|
|
const i2 = this._getActive(), n2 = t2 === at, s2 = e3 || b(this._getItems(), i2, n2, this._config.wrap);
|
|
if (s2 === i2)
|
|
return;
|
|
const o2 = this._getItemIndex(s2), r2 = (e4) => N.trigger(this._element, e4, { relatedTarget: s2, direction: this._orderToDirection(t2), from: this._getItemIndex(i2), to: o2 });
|
|
if (r2(dt).defaultPrevented)
|
|
return;
|
|
if (!i2 || !s2)
|
|
return;
|
|
const a3 = Boolean(this._interval);
|
|
this.pause(), this._isSliding = true, this._setActiveIndicatorElement(o2), this._activeElement = s2;
|
|
const l2 = n2 ? "carousel-item-start" : "carousel-item-end", c3 = n2 ? "carousel-item-next" : "carousel-item-prev";
|
|
s2.classList.add(c3), d(s2), i2.classList.add(l2), s2.classList.add(l2), this._queueCallback(() => {
|
|
s2.classList.remove(l2, c3), s2.classList.add(yt), i2.classList.remove(yt, c3, l2), this._isSliding = false, r2(ut);
|
|
}, i2, this._isAnimated()), a3 && this.cycle();
|
|
}
|
|
_isAnimated() {
|
|
return this._element.classList.contains("slide");
|
|
}
|
|
_getActive() {
|
|
return z.findOne(Et, this._element);
|
|
}
|
|
_getItems() {
|
|
return z.find(At, this._element);
|
|
}
|
|
_clearInterval() {
|
|
this._interval && (clearInterval(this._interval), this._interval = null);
|
|
}
|
|
_directionToOrder(t2) {
|
|
return p() ? t2 === ct ? lt : at : t2 === ct ? at : lt;
|
|
}
|
|
_orderToDirection(t2) {
|
|
return p() ? t2 === lt ? ct : ht : t2 === lt ? ht : ct;
|
|
}
|
|
static jQueryInterface(t2) {
|
|
return this.each(function() {
|
|
const e3 = xt.getOrCreateInstance(this, t2);
|
|
if ("number" != typeof t2) {
|
|
if ("string" == typeof t2) {
|
|
if (void 0 === e3[t2] || t2.startsWith("_") || "constructor" === t2)
|
|
throw new TypeError(`No method named "${t2}"`);
|
|
e3[t2]();
|
|
}
|
|
} else
|
|
e3.to(t2);
|
|
});
|
|
}
|
|
}
|
|
N.on(document, bt, "[data-bs-slide], [data-bs-slide-to]", function(t2) {
|
|
const e3 = z.getElementFromSelector(this);
|
|
if (!e3 || !e3.classList.contains(vt))
|
|
return;
|
|
t2.preventDefault();
|
|
const i2 = xt.getOrCreateInstance(e3), n2 = this.getAttribute("data-bs-slide-to");
|
|
return n2 ? (i2.to(n2), void i2._maybeEnableCycle()) : "next" === F.getDataAttribute(this, "slide") ? (i2.next(), void i2._maybeEnableCycle()) : (i2.prev(), void i2._maybeEnableCycle());
|
|
}), N.on(window, _t, () => {
|
|
const t2 = z.find('[data-bs-ride="carousel"]');
|
|
for (const e3 of t2)
|
|
xt.getOrCreateInstance(e3);
|
|
}), m2(xt);
|
|
const kt = ".bs.collapse", Lt = `show${kt}`, St = `shown${kt}`, Dt = `hide${kt}`, $t = `hidden${kt}`, It = `click${kt}.data-api`, Nt = "show", Pt = "collapse", jt = "collapsing", Mt = `:scope .${Pt} .${Pt}`, Ft = '[data-bs-toggle="collapse"]', Ht = { parent: null, toggle: true }, Wt = { parent: "(null|element)", toggle: "boolean" };
|
|
class Bt extends W {
|
|
constructor(t2, e3) {
|
|
super(t2, e3), this._isTransitioning = false, this._triggerArray = [];
|
|
const i2 = z.find(Ft);
|
|
for (const t3 of i2) {
|
|
const e4 = z.getSelectorFromElement(t3), i3 = z.find(e4).filter((t4) => t4 === this._element);
|
|
null !== e4 && i3.length && this._triggerArray.push(t3);
|
|
}
|
|
this._initializeChildren(), this._config.parent || this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()), this._config.toggle && this.toggle();
|
|
}
|
|
static get Default() {
|
|
return Ht;
|
|
}
|
|
static get DefaultType() {
|
|
return Wt;
|
|
}
|
|
static get NAME() {
|
|
return "collapse";
|
|
}
|
|
toggle() {
|
|
this._isShown() ? this.hide() : this.show();
|
|
}
|
|
show() {
|
|
if (this._isTransitioning || this._isShown())
|
|
return;
|
|
let t2 = [];
|
|
if (this._config.parent && (t2 = this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t3) => t3 !== this._element).map((t3) => Bt.getOrCreateInstance(t3, { toggle: false }))), t2.length && t2[0]._isTransitioning)
|
|
return;
|
|
if (N.trigger(this._element, Lt).defaultPrevented)
|
|
return;
|
|
for (const e4 of t2)
|
|
e4.hide();
|
|
const e3 = this._getDimension();
|
|
this._element.classList.remove(Pt), this._element.classList.add(jt), this._element.style[e3] = 0, this._addAriaAndCollapsedClass(this._triggerArray, true), this._isTransitioning = true;
|
|
const i2 = `scroll${e3[0].toUpperCase() + e3.slice(1)}`;
|
|
this._queueCallback(() => {
|
|
this._isTransitioning = false, this._element.classList.remove(jt), this._element.classList.add(Pt, Nt), this._element.style[e3] = "", N.trigger(this._element, St);
|
|
}, this._element, true), this._element.style[e3] = `${this._element[i2]}px`;
|
|
}
|
|
hide() {
|
|
if (this._isTransitioning || !this._isShown())
|
|
return;
|
|
if (N.trigger(this._element, Dt).defaultPrevented)
|
|
return;
|
|
const t2 = this._getDimension();
|
|
this._element.style[t2] = `${this._element.getBoundingClientRect()[t2]}px`, d(this._element), this._element.classList.add(jt), this._element.classList.remove(Pt, Nt);
|
|
for (const t3 of this._triggerArray) {
|
|
const e3 = z.getElementFromSelector(t3);
|
|
e3 && !this._isShown(e3) && this._addAriaAndCollapsedClass([t3], false);
|
|
}
|
|
this._isTransitioning = true, this._element.style[t2] = "", this._queueCallback(() => {
|
|
this._isTransitioning = false, this._element.classList.remove(jt), this._element.classList.add(Pt), N.trigger(this._element, $t);
|
|
}, this._element, true);
|
|
}
|
|
_isShown(t2 = this._element) {
|
|
return t2.classList.contains(Nt);
|
|
}
|
|
_configAfterMerge(t2) {
|
|
return t2.toggle = Boolean(t2.toggle), t2.parent = r(t2.parent), t2;
|
|
}
|
|
_getDimension() {
|
|
return this._element.classList.contains("collapse-horizontal") ? "width" : "height";
|
|
}
|
|
_initializeChildren() {
|
|
if (!this._config.parent)
|
|
return;
|
|
const t2 = this._getFirstLevelChildren(Ft);
|
|
for (const e3 of t2) {
|
|
const t3 = z.getElementFromSelector(e3);
|
|
t3 && this._addAriaAndCollapsedClass([e3], this._isShown(t3));
|
|
}
|
|
}
|
|
_getFirstLevelChildren(t2) {
|
|
const e3 = z.find(Mt, this._config.parent);
|
|
return z.find(t2, this._config.parent).filter((t3) => !e3.includes(t3));
|
|
}
|
|
_addAriaAndCollapsedClass(t2, e3) {
|
|
if (t2.length)
|
|
for (const i2 of t2)
|
|
i2.classList.toggle("collapsed", !e3), i2.setAttribute("aria-expanded", e3);
|
|
}
|
|
static jQueryInterface(t2) {
|
|
const e3 = {};
|
|
return "string" == typeof t2 && /show|hide/.test(t2) && (e3.toggle = false), this.each(function() {
|
|
const i2 = Bt.getOrCreateInstance(this, e3);
|
|
if ("string" == typeof t2) {
|
|
if (void 0 === i2[t2])
|
|
throw new TypeError(`No method named "${t2}"`);
|
|
i2[t2]();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
N.on(document, It, Ft, function(t2) {
|
|
("A" === t2.target.tagName || t2.delegateTarget && "A" === t2.delegateTarget.tagName) && t2.preventDefault();
|
|
for (const t3 of z.getMultipleElementsFromSelector(this))
|
|
Bt.getOrCreateInstance(t3, { toggle: false }).toggle();
|
|
}), m2(Bt);
|
|
var zt = "top", Rt = "bottom", qt = "right", Vt = "left", Kt = "auto", Qt = [zt, Rt, qt, Vt], Xt = "start", Yt = "end", Ut = "clippingParents", Gt = "viewport", Jt = "popper", Zt = "reference", te = Qt.reduce(function(t2, e3) {
|
|
return t2.concat([e3 + "-" + Xt, e3 + "-" + Yt]);
|
|
}, []), ee = [].concat(Qt, [Kt]).reduce(function(t2, e3) {
|
|
return t2.concat([e3, e3 + "-" + Xt, e3 + "-" + Yt]);
|
|
}, []), ie = "beforeRead", ne = "read", se = "afterRead", oe = "beforeMain", re2 = "main", ae = "afterMain", le = "beforeWrite", ce = "write", he = "afterWrite", de = [ie, ne, se, oe, re2, ae, le, ce, he];
|
|
function ue(t2) {
|
|
return t2 ? (t2.nodeName || "").toLowerCase() : null;
|
|
}
|
|
function fe(t2) {
|
|
if (null == t2)
|
|
return window;
|
|
if ("[object Window]" !== t2.toString()) {
|
|
var e3 = t2.ownerDocument;
|
|
return e3 && e3.defaultView || window;
|
|
}
|
|
return t2;
|
|
}
|
|
function pe(t2) {
|
|
return t2 instanceof fe(t2).Element || t2 instanceof Element;
|
|
}
|
|
function me(t2) {
|
|
return t2 instanceof fe(t2).HTMLElement || t2 instanceof HTMLElement;
|
|
}
|
|
function ge(t2) {
|
|
return "undefined" != typeof ShadowRoot && (t2 instanceof fe(t2).ShadowRoot || t2 instanceof ShadowRoot);
|
|
}
|
|
const _e = { name: "applyStyles", enabled: true, phase: "write", fn: function(t2) {
|
|
var e3 = t2.state;
|
|
Object.keys(e3.elements).forEach(function(t3) {
|
|
var i2 = e3.styles[t3] || {}, n2 = e3.attributes[t3] || {}, s2 = e3.elements[t3];
|
|
me(s2) && ue(s2) && (Object.assign(s2.style, i2), Object.keys(n2).forEach(function(t4) {
|
|
var e4 = n2[t4];
|
|
false === e4 ? s2.removeAttribute(t4) : s2.setAttribute(t4, true === e4 ? "" : e4);
|
|
}));
|
|
});
|
|
}, effect: function(t2) {
|
|
var e3 = t2.state, i2 = { popper: { position: e3.options.strategy, left: "0", top: "0", margin: "0" }, arrow: { position: "absolute" }, reference: {} };
|
|
return Object.assign(e3.elements.popper.style, i2.popper), e3.styles = i2, e3.elements.arrow && Object.assign(e3.elements.arrow.style, i2.arrow), function() {
|
|
Object.keys(e3.elements).forEach(function(t3) {
|
|
var n2 = e3.elements[t3], s2 = e3.attributes[t3] || {}, o2 = Object.keys(e3.styles.hasOwnProperty(t3) ? e3.styles[t3] : i2[t3]).reduce(function(t4, e4) {
|
|
return t4[e4] = "", t4;
|
|
}, {});
|
|
me(n2) && ue(n2) && (Object.assign(n2.style, o2), Object.keys(s2).forEach(function(t4) {
|
|
n2.removeAttribute(t4);
|
|
}));
|
|
});
|
|
};
|
|
}, requires: ["computeStyles"] };
|
|
function be(t2) {
|
|
return t2.split("-")[0];
|
|
}
|
|
var ve = Math.max, ye = Math.min, we = Math.round;
|
|
function Ae() {
|
|
var t2 = navigator.userAgentData;
|
|
return null != t2 && t2.brands && Array.isArray(t2.brands) ? t2.brands.map(function(t3) {
|
|
return t3.brand + "/" + t3.version;
|
|
}).join(" ") : navigator.userAgent;
|
|
}
|
|
function Ee() {
|
|
return !/^((?!chrome|android).)*safari/i.test(Ae());
|
|
}
|
|
function Te(t2, e3, i2) {
|
|
void 0 === e3 && (e3 = false), void 0 === i2 && (i2 = false);
|
|
var n2 = t2.getBoundingClientRect(), s2 = 1, o2 = 1;
|
|
e3 && me(t2) && (s2 = t2.offsetWidth > 0 && we(n2.width) / t2.offsetWidth || 1, o2 = t2.offsetHeight > 0 && we(n2.height) / t2.offsetHeight || 1);
|
|
var r2 = (pe(t2) ? fe(t2) : window).visualViewport, a3 = !Ee() && i2, l2 = (n2.left + (a3 && r2 ? r2.offsetLeft : 0)) / s2, c3 = (n2.top + (a3 && r2 ? r2.offsetTop : 0)) / o2, h2 = n2.width / s2, d2 = n2.height / o2;
|
|
return { width: h2, height: d2, top: c3, right: l2 + h2, bottom: c3 + d2, left: l2, x: l2, y: c3 };
|
|
}
|
|
function Ce(t2) {
|
|
var e3 = Te(t2), i2 = t2.offsetWidth, n2 = t2.offsetHeight;
|
|
return Math.abs(e3.width - i2) <= 1 && (i2 = e3.width), Math.abs(e3.height - n2) <= 1 && (n2 = e3.height), { x: t2.offsetLeft, y: t2.offsetTop, width: i2, height: n2 };
|
|
}
|
|
function Oe(t2, e3) {
|
|
var i2 = e3.getRootNode && e3.getRootNode();
|
|
if (t2.contains(e3))
|
|
return true;
|
|
if (i2 && ge(i2)) {
|
|
var n2 = e3;
|
|
do {
|
|
if (n2 && t2.isSameNode(n2))
|
|
return true;
|
|
n2 = n2.parentNode || n2.host;
|
|
} while (n2);
|
|
}
|
|
return false;
|
|
}
|
|
function xe(t2) {
|
|
return fe(t2).getComputedStyle(t2);
|
|
}
|
|
function ke(t2) {
|
|
return ["table", "td", "th"].indexOf(ue(t2)) >= 0;
|
|
}
|
|
function Le(t2) {
|
|
return ((pe(t2) ? t2.ownerDocument : t2.document) || window.document).documentElement;
|
|
}
|
|
function Se(t2) {
|
|
return "html" === ue(t2) ? t2 : t2.assignedSlot || t2.parentNode || (ge(t2) ? t2.host : null) || Le(t2);
|
|
}
|
|
function De(t2) {
|
|
return me(t2) && "fixed" !== xe(t2).position ? t2.offsetParent : null;
|
|
}
|
|
function $e(t2) {
|
|
for (var e3 = fe(t2), i2 = De(t2); i2 && ke(i2) && "static" === xe(i2).position; )
|
|
i2 = De(i2);
|
|
return i2 && ("html" === ue(i2) || "body" === ue(i2) && "static" === xe(i2).position) ? e3 : i2 || function(t3) {
|
|
var e4 = /firefox/i.test(Ae());
|
|
if (/Trident/i.test(Ae()) && me(t3) && "fixed" === xe(t3).position)
|
|
return null;
|
|
var i3 = Se(t3);
|
|
for (ge(i3) && (i3 = i3.host); me(i3) && ["html", "body"].indexOf(ue(i3)) < 0; ) {
|
|
var n2 = xe(i3);
|
|
if ("none" !== n2.transform || "none" !== n2.perspective || "paint" === n2.contain || -1 !== ["transform", "perspective"].indexOf(n2.willChange) || e4 && "filter" === n2.willChange || e4 && n2.filter && "none" !== n2.filter)
|
|
return i3;
|
|
i3 = i3.parentNode;
|
|
}
|
|
return null;
|
|
}(t2) || e3;
|
|
}
|
|
function Ie(t2) {
|
|
return ["top", "bottom"].indexOf(t2) >= 0 ? "x" : "y";
|
|
}
|
|
function Ne(t2, e3, i2) {
|
|
return ve(t2, ye(e3, i2));
|
|
}
|
|
function Pe(t2) {
|
|
return Object.assign({}, { top: 0, right: 0, bottom: 0, left: 0 }, t2);
|
|
}
|
|
function je(t2, e3) {
|
|
return e3.reduce(function(e4, i2) {
|
|
return e4[i2] = t2, e4;
|
|
}, {});
|
|
}
|
|
const Me = { name: "arrow", enabled: true, phase: "main", fn: function(t2) {
|
|
var e3, i2 = t2.state, n2 = t2.name, s2 = t2.options, o2 = i2.elements.arrow, r2 = i2.modifiersData.popperOffsets, a3 = be(i2.placement), l2 = Ie(a3), c3 = [Vt, qt].indexOf(a3) >= 0 ? "height" : "width";
|
|
if (o2 && r2) {
|
|
var h2 = function(t3, e4) {
|
|
return Pe("number" != typeof (t3 = "function" == typeof t3 ? t3(Object.assign({}, e4.rects, { placement: e4.placement })) : t3) ? t3 : je(t3, Qt));
|
|
}(s2.padding, i2), d2 = Ce(o2), u2 = "y" === l2 ? zt : Vt, f2 = "y" === l2 ? Rt : qt, p2 = i2.rects.reference[c3] + i2.rects.reference[l2] - r2[l2] - i2.rects.popper[c3], m3 = r2[l2] - i2.rects.reference[l2], g2 = $e(o2), _2 = g2 ? "y" === l2 ? g2.clientHeight || 0 : g2.clientWidth || 0 : 0, b2 = p2 / 2 - m3 / 2, v2 = h2[u2], y4 = _2 - d2[c3] - h2[f2], w2 = _2 / 2 - d2[c3] / 2 + b2, A2 = Ne(v2, w2, y4), E2 = l2;
|
|
i2.modifiersData[n2] = ((e3 = {})[E2] = A2, e3.centerOffset = A2 - w2, e3);
|
|
}
|
|
}, effect: function(t2) {
|
|
var e3 = t2.state, i2 = t2.options.element, n2 = void 0 === i2 ? "[data-popper-arrow]" : i2;
|
|
null != n2 && ("string" != typeof n2 || (n2 = e3.elements.popper.querySelector(n2))) && Oe(e3.elements.popper, n2) && (e3.elements.arrow = n2);
|
|
}, requires: ["popperOffsets"], requiresIfExists: ["preventOverflow"] };
|
|
function Fe(t2) {
|
|
return t2.split("-")[1];
|
|
}
|
|
var He = { top: "auto", right: "auto", bottom: "auto", left: "auto" };
|
|
function We(t2) {
|
|
var e3, i2 = t2.popper, n2 = t2.popperRect, s2 = t2.placement, o2 = t2.variation, r2 = t2.offsets, a3 = t2.position, l2 = t2.gpuAcceleration, c3 = t2.adaptive, h2 = t2.roundOffsets, d2 = t2.isFixed, u2 = r2.x, f2 = void 0 === u2 ? 0 : u2, p2 = r2.y, m3 = void 0 === p2 ? 0 : p2, g2 = "function" == typeof h2 ? h2({ x: f2, y: m3 }) : { x: f2, y: m3 };
|
|
f2 = g2.x, m3 = g2.y;
|
|
var _2 = r2.hasOwnProperty("x"), b2 = r2.hasOwnProperty("y"), v2 = Vt, y4 = zt, w2 = window;
|
|
if (c3) {
|
|
var A2 = $e(i2), E2 = "clientHeight", T2 = "clientWidth";
|
|
A2 === fe(i2) && "static" !== xe(A2 = Le(i2)).position && "absolute" === a3 && (E2 = "scrollHeight", T2 = "scrollWidth"), (s2 === zt || (s2 === Vt || s2 === qt) && o2 === Yt) && (y4 = Rt, m3 -= (d2 && A2 === w2 && w2.visualViewport ? w2.visualViewport.height : A2[E2]) - n2.height, m3 *= l2 ? 1 : -1), s2 !== Vt && (s2 !== zt && s2 !== Rt || o2 !== Yt) || (v2 = qt, f2 -= (d2 && A2 === w2 && w2.visualViewport ? w2.visualViewport.width : A2[T2]) - n2.width, f2 *= l2 ? 1 : -1);
|
|
}
|
|
var C2, O2 = Object.assign({ position: a3 }, c3 && He), x4 = true === h2 ? function(t3, e4) {
|
|
var i3 = t3.x, n3 = t3.y, s3 = e4.devicePixelRatio || 1;
|
|
return { x: we(i3 * s3) / s3 || 0, y: we(n3 * s3) / s3 || 0 };
|
|
}({ x: f2, y: m3 }, fe(i2)) : { x: f2, y: m3 };
|
|
return f2 = x4.x, m3 = x4.y, l2 ? Object.assign({}, O2, ((C2 = {})[y4] = b2 ? "0" : "", C2[v2] = _2 ? "0" : "", C2.transform = (w2.devicePixelRatio || 1) <= 1 ? "translate(" + f2 + "px, " + m3 + "px)" : "translate3d(" + f2 + "px, " + m3 + "px, 0)", C2)) : Object.assign({}, O2, ((e3 = {})[y4] = b2 ? m3 + "px" : "", e3[v2] = _2 ? f2 + "px" : "", e3.transform = "", e3));
|
|
}
|
|
const Be = { name: "computeStyles", enabled: true, phase: "beforeWrite", fn: function(t2) {
|
|
var e3 = t2.state, i2 = t2.options, n2 = i2.gpuAcceleration, s2 = void 0 === n2 || n2, o2 = i2.adaptive, r2 = void 0 === o2 || o2, a3 = i2.roundOffsets, l2 = void 0 === a3 || a3, c3 = { placement: be(e3.placement), variation: Fe(e3.placement), popper: e3.elements.popper, popperRect: e3.rects.popper, gpuAcceleration: s2, isFixed: "fixed" === e3.options.strategy };
|
|
null != e3.modifiersData.popperOffsets && (e3.styles.popper = Object.assign({}, e3.styles.popper, We(Object.assign({}, c3, { offsets: e3.modifiersData.popperOffsets, position: e3.options.strategy, adaptive: r2, roundOffsets: l2 })))), null != e3.modifiersData.arrow && (e3.styles.arrow = Object.assign({}, e3.styles.arrow, We(Object.assign({}, c3, { offsets: e3.modifiersData.arrow, position: "absolute", adaptive: false, roundOffsets: l2 })))), e3.attributes.popper = Object.assign({}, e3.attributes.popper, { "data-popper-placement": e3.placement });
|
|
}, data: {} };
|
|
var ze = { passive: true };
|
|
const Re = { name: "eventListeners", enabled: true, phase: "write", fn: function() {
|
|
}, effect: function(t2) {
|
|
var e3 = t2.state, i2 = t2.instance, n2 = t2.options, s2 = n2.scroll, o2 = void 0 === s2 || s2, r2 = n2.resize, a3 = void 0 === r2 || r2, l2 = fe(e3.elements.popper), c3 = [].concat(e3.scrollParents.reference, e3.scrollParents.popper);
|
|
return o2 && c3.forEach(function(t3) {
|
|
t3.addEventListener("scroll", i2.update, ze);
|
|
}), a3 && l2.addEventListener("resize", i2.update, ze), function() {
|
|
o2 && c3.forEach(function(t3) {
|
|
t3.removeEventListener("scroll", i2.update, ze);
|
|
}), a3 && l2.removeEventListener("resize", i2.update, ze);
|
|
};
|
|
}, data: {} };
|
|
var qe = { left: "right", right: "left", bottom: "top", top: "bottom" };
|
|
function Ve(t2) {
|
|
return t2.replace(/left|right|bottom|top/g, function(t3) {
|
|
return qe[t3];
|
|
});
|
|
}
|
|
var Ke = { start: "end", end: "start" };
|
|
function Qe(t2) {
|
|
return t2.replace(/start|end/g, function(t3) {
|
|
return Ke[t3];
|
|
});
|
|
}
|
|
function Xe(t2) {
|
|
var e3 = fe(t2);
|
|
return { scrollLeft: e3.pageXOffset, scrollTop: e3.pageYOffset };
|
|
}
|
|
function Ye(t2) {
|
|
return Te(Le(t2)).left + Xe(t2).scrollLeft;
|
|
}
|
|
function Ue(t2) {
|
|
var e3 = xe(t2), i2 = e3.overflow, n2 = e3.overflowX, s2 = e3.overflowY;
|
|
return /auto|scroll|overlay|hidden/.test(i2 + s2 + n2);
|
|
}
|
|
function Ge(t2) {
|
|
return ["html", "body", "#document"].indexOf(ue(t2)) >= 0 ? t2.ownerDocument.body : me(t2) && Ue(t2) ? t2 : Ge(Se(t2));
|
|
}
|
|
function Je(t2, e3) {
|
|
var i2;
|
|
void 0 === e3 && (e3 = []);
|
|
var n2 = Ge(t2), s2 = n2 === (null == (i2 = t2.ownerDocument) ? void 0 : i2.body), o2 = fe(n2), r2 = s2 ? [o2].concat(o2.visualViewport || [], Ue(n2) ? n2 : []) : n2, a3 = e3.concat(r2);
|
|
return s2 ? a3 : a3.concat(Je(Se(r2)));
|
|
}
|
|
function Ze(t2) {
|
|
return Object.assign({}, t2, { left: t2.x, top: t2.y, right: t2.x + t2.width, bottom: t2.y + t2.height });
|
|
}
|
|
function ti(t2, e3, i2) {
|
|
return e3 === Gt ? Ze(function(t3, e4) {
|
|
var i3 = fe(t3), n2 = Le(t3), s2 = i3.visualViewport, o2 = n2.clientWidth, r2 = n2.clientHeight, a3 = 0, l2 = 0;
|
|
if (s2) {
|
|
o2 = s2.width, r2 = s2.height;
|
|
var c3 = Ee();
|
|
(c3 || !c3 && "fixed" === e4) && (a3 = s2.offsetLeft, l2 = s2.offsetTop);
|
|
}
|
|
return { width: o2, height: r2, x: a3 + Ye(t3), y: l2 };
|
|
}(t2, i2)) : pe(e3) ? function(t3, e4) {
|
|
var i3 = Te(t3, false, "fixed" === e4);
|
|
return i3.top = i3.top + t3.clientTop, i3.left = i3.left + t3.clientLeft, i3.bottom = i3.top + t3.clientHeight, i3.right = i3.left + t3.clientWidth, i3.width = t3.clientWidth, i3.height = t3.clientHeight, i3.x = i3.left, i3.y = i3.top, i3;
|
|
}(e3, i2) : Ze(function(t3) {
|
|
var e4, i3 = Le(t3), n2 = Xe(t3), s2 = null == (e4 = t3.ownerDocument) ? void 0 : e4.body, o2 = ve(i3.scrollWidth, i3.clientWidth, s2 ? s2.scrollWidth : 0, s2 ? s2.clientWidth : 0), r2 = ve(i3.scrollHeight, i3.clientHeight, s2 ? s2.scrollHeight : 0, s2 ? s2.clientHeight : 0), a3 = -n2.scrollLeft + Ye(t3), l2 = -n2.scrollTop;
|
|
return "rtl" === xe(s2 || i3).direction && (a3 += ve(i3.clientWidth, s2 ? s2.clientWidth : 0) - o2), { width: o2, height: r2, x: a3, y: l2 };
|
|
}(Le(t2)));
|
|
}
|
|
function ei(t2) {
|
|
var e3, i2 = t2.reference, n2 = t2.element, s2 = t2.placement, o2 = s2 ? be(s2) : null, r2 = s2 ? Fe(s2) : null, a3 = i2.x + i2.width / 2 - n2.width / 2, l2 = i2.y + i2.height / 2 - n2.height / 2;
|
|
switch (o2) {
|
|
case zt:
|
|
e3 = { x: a3, y: i2.y - n2.height };
|
|
break;
|
|
case Rt:
|
|
e3 = { x: a3, y: i2.y + i2.height };
|
|
break;
|
|
case qt:
|
|
e3 = { x: i2.x + i2.width, y: l2 };
|
|
break;
|
|
case Vt:
|
|
e3 = { x: i2.x - n2.width, y: l2 };
|
|
break;
|
|
default:
|
|
e3 = { x: i2.x, y: i2.y };
|
|
}
|
|
var c3 = o2 ? Ie(o2) : null;
|
|
if (null != c3) {
|
|
var h2 = "y" === c3 ? "height" : "width";
|
|
switch (r2) {
|
|
case Xt:
|
|
e3[c3] = e3[c3] - (i2[h2] / 2 - n2[h2] / 2);
|
|
break;
|
|
case Yt:
|
|
e3[c3] = e3[c3] + (i2[h2] / 2 - n2[h2] / 2);
|
|
}
|
|
}
|
|
return e3;
|
|
}
|
|
function ii(t2, e3) {
|
|
void 0 === e3 && (e3 = {});
|
|
var i2 = e3, n2 = i2.placement, s2 = void 0 === n2 ? t2.placement : n2, o2 = i2.strategy, r2 = void 0 === o2 ? t2.strategy : o2, a3 = i2.boundary, l2 = void 0 === a3 ? Ut : a3, c3 = i2.rootBoundary, h2 = void 0 === c3 ? Gt : c3, d2 = i2.elementContext, u2 = void 0 === d2 ? Jt : d2, f2 = i2.altBoundary, p2 = void 0 !== f2 && f2, m3 = i2.padding, g2 = void 0 === m3 ? 0 : m3, _2 = Pe("number" != typeof g2 ? g2 : je(g2, Qt)), b2 = u2 === Jt ? Zt : Jt, v2 = t2.rects.popper, y4 = t2.elements[p2 ? b2 : u2], w2 = function(t3, e4, i3, n3) {
|
|
var s3 = "clippingParents" === e4 ? function(t4) {
|
|
var e6 = Je(Se(t4)), i4 = ["absolute", "fixed"].indexOf(xe(t4).position) >= 0 && me(t4) ? $e(t4) : t4;
|
|
return pe(i4) ? e6.filter(function(t5) {
|
|
return pe(t5) && Oe(t5, i4) && "body" !== ue(t5);
|
|
}) : [];
|
|
}(t3) : [].concat(e4), o3 = [].concat(s3, [i3]), r3 = o3[0], a4 = o3.reduce(function(e6, i4) {
|
|
var s4 = ti(t3, i4, n3);
|
|
return e6.top = ve(s4.top, e6.top), e6.right = ye(s4.right, e6.right), e6.bottom = ye(s4.bottom, e6.bottom), e6.left = ve(s4.left, e6.left), e6;
|
|
}, ti(t3, r3, n3));
|
|
return a4.width = a4.right - a4.left, a4.height = a4.bottom - a4.top, a4.x = a4.left, a4.y = a4.top, a4;
|
|
}(pe(y4) ? y4 : y4.contextElement || Le(t2.elements.popper), l2, h2, r2), A2 = Te(t2.elements.reference), E2 = ei({ reference: A2, element: v2, strategy: "absolute", placement: s2 }), T2 = Ze(Object.assign({}, v2, E2)), C2 = u2 === Jt ? T2 : A2, O2 = { top: w2.top - C2.top + _2.top, bottom: C2.bottom - w2.bottom + _2.bottom, left: w2.left - C2.left + _2.left, right: C2.right - w2.right + _2.right }, x4 = t2.modifiersData.offset;
|
|
if (u2 === Jt && x4) {
|
|
var k2 = x4[s2];
|
|
Object.keys(O2).forEach(function(t3) {
|
|
var e4 = [qt, Rt].indexOf(t3) >= 0 ? 1 : -1, i3 = [zt, Rt].indexOf(t3) >= 0 ? "y" : "x";
|
|
O2[t3] += k2[i3] * e4;
|
|
});
|
|
}
|
|
return O2;
|
|
}
|
|
function ni(t2, e3) {
|
|
void 0 === e3 && (e3 = {});
|
|
var i2 = e3, n2 = i2.placement, s2 = i2.boundary, o2 = i2.rootBoundary, r2 = i2.padding, a3 = i2.flipVariations, l2 = i2.allowedAutoPlacements, c3 = void 0 === l2 ? ee : l2, h2 = Fe(n2), d2 = h2 ? a3 ? te : te.filter(function(t3) {
|
|
return Fe(t3) === h2;
|
|
}) : Qt, u2 = d2.filter(function(t3) {
|
|
return c3.indexOf(t3) >= 0;
|
|
});
|
|
0 === u2.length && (u2 = d2);
|
|
var f2 = u2.reduce(function(e4, i3) {
|
|
return e4[i3] = ii(t2, { placement: i3, boundary: s2, rootBoundary: o2, padding: r2 })[be(i3)], e4;
|
|
}, {});
|
|
return Object.keys(f2).sort(function(t3, e4) {
|
|
return f2[t3] - f2[e4];
|
|
});
|
|
}
|
|
const si = { name: "flip", enabled: true, phase: "main", fn: function(t2) {
|
|
var e3 = t2.state, i2 = t2.options, n2 = t2.name;
|
|
if (!e3.modifiersData[n2]._skip) {
|
|
for (var s2 = i2.mainAxis, o2 = void 0 === s2 || s2, r2 = i2.altAxis, a3 = void 0 === r2 || r2, l2 = i2.fallbackPlacements, c3 = i2.padding, h2 = i2.boundary, d2 = i2.rootBoundary, u2 = i2.altBoundary, f2 = i2.flipVariations, p2 = void 0 === f2 || f2, m3 = i2.allowedAutoPlacements, g2 = e3.options.placement, _2 = be(g2), b2 = l2 || (_2 !== g2 && p2 ? function(t3) {
|
|
if (be(t3) === Kt)
|
|
return [];
|
|
var e4 = Ve(t3);
|
|
return [Qe(t3), e4, Qe(e4)];
|
|
}(g2) : [Ve(g2)]), v2 = [g2].concat(b2).reduce(function(t3, i3) {
|
|
return t3.concat(be(i3) === Kt ? ni(e3, { placement: i3, boundary: h2, rootBoundary: d2, padding: c3, flipVariations: p2, allowedAutoPlacements: m3 }) : i3);
|
|
}, []), y4 = e3.rects.reference, w2 = e3.rects.popper, A2 = /* @__PURE__ */ new Map(), E2 = true, T2 = v2[0], C2 = 0; C2 < v2.length; C2++) {
|
|
var O2 = v2[C2], x4 = be(O2), k2 = Fe(O2) === Xt, L2 = [zt, Rt].indexOf(x4) >= 0, S2 = L2 ? "width" : "height", D2 = ii(e3, { placement: O2, boundary: h2, rootBoundary: d2, altBoundary: u2, padding: c3 }), $2 = L2 ? k2 ? qt : Vt : k2 ? Rt : zt;
|
|
y4[S2] > w2[S2] && ($2 = Ve($2));
|
|
var I2 = Ve($2), N2 = [];
|
|
if (o2 && N2.push(D2[x4] <= 0), a3 && N2.push(D2[$2] <= 0, D2[I2] <= 0), N2.every(function(t3) {
|
|
return t3;
|
|
})) {
|
|
T2 = O2, E2 = false;
|
|
break;
|
|
}
|
|
A2.set(O2, N2);
|
|
}
|
|
if (E2)
|
|
for (var P2 = function(t3) {
|
|
var e4 = v2.find(function(e6) {
|
|
var i3 = A2.get(e6);
|
|
if (i3)
|
|
return i3.slice(0, t3).every(function(t4) {
|
|
return t4;
|
|
});
|
|
});
|
|
if (e4)
|
|
return T2 = e4, "break";
|
|
}, j2 = p2 ? 3 : 1; j2 > 0 && "break" !== P2(j2); j2--)
|
|
;
|
|
e3.placement !== T2 && (e3.modifiersData[n2]._skip = true, e3.placement = T2, e3.reset = true);
|
|
}
|
|
}, requiresIfExists: ["offset"], data: { _skip: false } };
|
|
function oi(t2, e3, i2) {
|
|
return void 0 === i2 && (i2 = { x: 0, y: 0 }), { top: t2.top - e3.height - i2.y, right: t2.right - e3.width + i2.x, bottom: t2.bottom - e3.height + i2.y, left: t2.left - e3.width - i2.x };
|
|
}
|
|
function ri(t2) {
|
|
return [zt, qt, Rt, Vt].some(function(e3) {
|
|
return t2[e3] >= 0;
|
|
});
|
|
}
|
|
const ai = { name: "hide", enabled: true, phase: "main", requiresIfExists: ["preventOverflow"], fn: function(t2) {
|
|
var e3 = t2.state, i2 = t2.name, n2 = e3.rects.reference, s2 = e3.rects.popper, o2 = e3.modifiersData.preventOverflow, r2 = ii(e3, { elementContext: "reference" }), a3 = ii(e3, { altBoundary: true }), l2 = oi(r2, n2), c3 = oi(a3, s2, o2), h2 = ri(l2), d2 = ri(c3);
|
|
e3.modifiersData[i2] = { referenceClippingOffsets: l2, popperEscapeOffsets: c3, isReferenceHidden: h2, hasPopperEscaped: d2 }, e3.attributes.popper = Object.assign({}, e3.attributes.popper, { "data-popper-reference-hidden": h2, "data-popper-escaped": d2 });
|
|
} }, li = { name: "offset", enabled: true, phase: "main", requires: ["popperOffsets"], fn: function(t2) {
|
|
var e3 = t2.state, i2 = t2.options, n2 = t2.name, s2 = i2.offset, o2 = void 0 === s2 ? [0, 0] : s2, r2 = ee.reduce(function(t3, i3) {
|
|
return t3[i3] = function(t4, e4, i4) {
|
|
var n3 = be(t4), s3 = [Vt, zt].indexOf(n3) >= 0 ? -1 : 1, o3 = "function" == typeof i4 ? i4(Object.assign({}, e4, { placement: t4 })) : i4, r3 = o3[0], a4 = o3[1];
|
|
return r3 = r3 || 0, a4 = (a4 || 0) * s3, [Vt, qt].indexOf(n3) >= 0 ? { x: a4, y: r3 } : { x: r3, y: a4 };
|
|
}(i3, e3.rects, o2), t3;
|
|
}, {}), a3 = r2[e3.placement], l2 = a3.x, c3 = a3.y;
|
|
null != e3.modifiersData.popperOffsets && (e3.modifiersData.popperOffsets.x += l2, e3.modifiersData.popperOffsets.y += c3), e3.modifiersData[n2] = r2;
|
|
} }, ci = { name: "popperOffsets", enabled: true, phase: "read", fn: function(t2) {
|
|
var e3 = t2.state, i2 = t2.name;
|
|
e3.modifiersData[i2] = ei({ reference: e3.rects.reference, element: e3.rects.popper, strategy: "absolute", placement: e3.placement });
|
|
}, data: {} }, hi = { name: "preventOverflow", enabled: true, phase: "main", fn: function(t2) {
|
|
var e3 = t2.state, i2 = t2.options, n2 = t2.name, s2 = i2.mainAxis, o2 = void 0 === s2 || s2, r2 = i2.altAxis, a3 = void 0 !== r2 && r2, l2 = i2.boundary, c3 = i2.rootBoundary, h2 = i2.altBoundary, d2 = i2.padding, u2 = i2.tether, f2 = void 0 === u2 || u2, p2 = i2.tetherOffset, m3 = void 0 === p2 ? 0 : p2, g2 = ii(e3, { boundary: l2, rootBoundary: c3, padding: d2, altBoundary: h2 }), _2 = be(e3.placement), b2 = Fe(e3.placement), v2 = !b2, y4 = Ie(_2), w2 = "x" === y4 ? "y" : "x", A2 = e3.modifiersData.popperOffsets, E2 = e3.rects.reference, T2 = e3.rects.popper, C2 = "function" == typeof m3 ? m3(Object.assign({}, e3.rects, { placement: e3.placement })) : m3, O2 = "number" == typeof C2 ? { mainAxis: C2, altAxis: C2 } : Object.assign({ mainAxis: 0, altAxis: 0 }, C2), x4 = e3.modifiersData.offset ? e3.modifiersData.offset[e3.placement] : null, k2 = { x: 0, y: 0 };
|
|
if (A2) {
|
|
if (o2) {
|
|
var L2, S2 = "y" === y4 ? zt : Vt, D2 = "y" === y4 ? Rt : qt, $2 = "y" === y4 ? "height" : "width", I2 = A2[y4], N2 = I2 + g2[S2], P2 = I2 - g2[D2], j2 = f2 ? -T2[$2] / 2 : 0, M2 = b2 === Xt ? E2[$2] : T2[$2], F2 = b2 === Xt ? -T2[$2] : -E2[$2], H2 = e3.elements.arrow, W2 = f2 && H2 ? Ce(H2) : { width: 0, height: 0 }, B2 = e3.modifiersData["arrow#persistent"] ? e3.modifiersData["arrow#persistent"].padding : { top: 0, right: 0, bottom: 0, left: 0 }, z2 = B2[S2], R2 = B2[D2], q2 = Ne(0, E2[$2], W2[$2]), V2 = v2 ? E2[$2] / 2 - j2 - q2 - z2 - O2.mainAxis : M2 - q2 - z2 - O2.mainAxis, K2 = v2 ? -E2[$2] / 2 + j2 + q2 + R2 + O2.mainAxis : F2 + q2 + R2 + O2.mainAxis, Q2 = e3.elements.arrow && $e(e3.elements.arrow), X3 = Q2 ? "y" === y4 ? Q2.clientTop || 0 : Q2.clientLeft || 0 : 0, Y3 = null != (L2 = null == x4 ? void 0 : x4[y4]) ? L2 : 0, U2 = I2 + K2 - Y3, G2 = Ne(f2 ? ye(N2, I2 + V2 - Y3 - X3) : N2, I2, f2 ? ve(P2, U2) : P2);
|
|
A2[y4] = G2, k2[y4] = G2 - I2;
|
|
}
|
|
if (a3) {
|
|
var J2, Z2 = "x" === y4 ? zt : Vt, tt2 = "x" === y4 ? Rt : qt, et2 = A2[w2], it2 = "y" === w2 ? "height" : "width", nt2 = et2 + g2[Z2], st2 = et2 - g2[tt2], ot2 = -1 !== [zt, Vt].indexOf(_2), rt2 = null != (J2 = null == x4 ? void 0 : x4[w2]) ? J2 : 0, at2 = ot2 ? nt2 : et2 - E2[it2] - T2[it2] - rt2 + O2.altAxis, lt2 = ot2 ? et2 + E2[it2] + T2[it2] - rt2 - O2.altAxis : st2, ct2 = f2 && ot2 ? function(t3, e4, i3) {
|
|
var n3 = Ne(t3, e4, i3);
|
|
return n3 > i3 ? i3 : n3;
|
|
}(at2, et2, lt2) : Ne(f2 ? at2 : nt2, et2, f2 ? lt2 : st2);
|
|
A2[w2] = ct2, k2[w2] = ct2 - et2;
|
|
}
|
|
e3.modifiersData[n2] = k2;
|
|
}
|
|
}, requiresIfExists: ["offset"] };
|
|
function di(t2, e3, i2) {
|
|
void 0 === i2 && (i2 = false);
|
|
var n2, s2, o2 = me(e3), r2 = me(e3) && function(t3) {
|
|
var e4 = t3.getBoundingClientRect(), i3 = we(e4.width) / t3.offsetWidth || 1, n3 = we(e4.height) / t3.offsetHeight || 1;
|
|
return 1 !== i3 || 1 !== n3;
|
|
}(e3), a3 = Le(e3), l2 = Te(t2, r2, i2), c3 = { scrollLeft: 0, scrollTop: 0 }, h2 = { x: 0, y: 0 };
|
|
return (o2 || !o2 && !i2) && (("body" !== ue(e3) || Ue(a3)) && (c3 = (n2 = e3) !== fe(n2) && me(n2) ? { scrollLeft: (s2 = n2).scrollLeft, scrollTop: s2.scrollTop } : Xe(n2)), me(e3) ? ((h2 = Te(e3, true)).x += e3.clientLeft, h2.y += e3.clientTop) : a3 && (h2.x = Ye(a3))), { x: l2.left + c3.scrollLeft - h2.x, y: l2.top + c3.scrollTop - h2.y, width: l2.width, height: l2.height };
|
|
}
|
|
function ui(t2) {
|
|
var e3 = /* @__PURE__ */ new Map(), i2 = /* @__PURE__ */ new Set(), n2 = [];
|
|
function s2(t3) {
|
|
i2.add(t3.name), [].concat(t3.requires || [], t3.requiresIfExists || []).forEach(function(t4) {
|
|
if (!i2.has(t4)) {
|
|
var n3 = e3.get(t4);
|
|
n3 && s2(n3);
|
|
}
|
|
}), n2.push(t3);
|
|
}
|
|
return t2.forEach(function(t3) {
|
|
e3.set(t3.name, t3);
|
|
}), t2.forEach(function(t3) {
|
|
i2.has(t3.name) || s2(t3);
|
|
}), n2;
|
|
}
|
|
var fi = { placement: "bottom", modifiers: [], strategy: "absolute" };
|
|
function pi() {
|
|
for (var t2 = arguments.length, e3 = new Array(t2), i2 = 0; i2 < t2; i2++)
|
|
e3[i2] = arguments[i2];
|
|
return !e3.some(function(t3) {
|
|
return !(t3 && "function" == typeof t3.getBoundingClientRect);
|
|
});
|
|
}
|
|
function mi(t2) {
|
|
void 0 === t2 && (t2 = {});
|
|
var e3 = t2, i2 = e3.defaultModifiers, n2 = void 0 === i2 ? [] : i2, s2 = e3.defaultOptions, o2 = void 0 === s2 ? fi : s2;
|
|
return function(t3, e4, i3) {
|
|
void 0 === i3 && (i3 = o2);
|
|
var s3, r2, a3 = { placement: "bottom", orderedModifiers: [], options: Object.assign({}, fi, o2), modifiersData: {}, elements: { reference: t3, popper: e4 }, attributes: {}, styles: {} }, l2 = [], c3 = false, h2 = { state: a3, setOptions: function(i4) {
|
|
var s4 = "function" == typeof i4 ? i4(a3.options) : i4;
|
|
d2(), a3.options = Object.assign({}, o2, a3.options, s4), a3.scrollParents = { reference: pe(t3) ? Je(t3) : t3.contextElement ? Je(t3.contextElement) : [], popper: Je(e4) };
|
|
var r3, c4, u2 = function(t4) {
|
|
var e6 = ui(t4);
|
|
return de.reduce(function(t5, i5) {
|
|
return t5.concat(e6.filter(function(t6) {
|
|
return t6.phase === i5;
|
|
}));
|
|
}, []);
|
|
}((r3 = [].concat(n2, a3.options.modifiers), c4 = r3.reduce(function(t4, e6) {
|
|
var i5 = t4[e6.name];
|
|
return t4[e6.name] = i5 ? Object.assign({}, i5, e6, { options: Object.assign({}, i5.options, e6.options), data: Object.assign({}, i5.data, e6.data) }) : e6, t4;
|
|
}, {}), Object.keys(c4).map(function(t4) {
|
|
return c4[t4];
|
|
})));
|
|
return a3.orderedModifiers = u2.filter(function(t4) {
|
|
return t4.enabled;
|
|
}), a3.orderedModifiers.forEach(function(t4) {
|
|
var e6 = t4.name, i5 = t4.options, n3 = void 0 === i5 ? {} : i5, s5 = t4.effect;
|
|
if ("function" == typeof s5) {
|
|
var o3 = s5({ state: a3, name: e6, instance: h2, options: n3 });
|
|
l2.push(o3 || function() {
|
|
});
|
|
}
|
|
}), h2.update();
|
|
}, forceUpdate: function() {
|
|
if (!c3) {
|
|
var t4 = a3.elements, e6 = t4.reference, i4 = t4.popper;
|
|
if (pi(e6, i4)) {
|
|
a3.rects = { reference: di(e6, $e(i4), "fixed" === a3.options.strategy), popper: Ce(i4) }, a3.reset = false, a3.placement = a3.options.placement, a3.orderedModifiers.forEach(function(t5) {
|
|
return a3.modifiersData[t5.name] = Object.assign({}, t5.data);
|
|
});
|
|
for (var n3 = 0; n3 < a3.orderedModifiers.length; n3++)
|
|
if (true !== a3.reset) {
|
|
var s4 = a3.orderedModifiers[n3], o3 = s4.fn, r3 = s4.options, l3 = void 0 === r3 ? {} : r3, d3 = s4.name;
|
|
"function" == typeof o3 && (a3 = o3({ state: a3, options: l3, name: d3, instance: h2 }) || a3);
|
|
} else
|
|
a3.reset = false, n3 = -1;
|
|
}
|
|
}
|
|
}, update: (s3 = function() {
|
|
return new Promise(function(t4) {
|
|
h2.forceUpdate(), t4(a3);
|
|
});
|
|
}, function() {
|
|
return r2 || (r2 = new Promise(function(t4) {
|
|
Promise.resolve().then(function() {
|
|
r2 = void 0, t4(s3());
|
|
});
|
|
})), r2;
|
|
}), destroy: function() {
|
|
d2(), c3 = true;
|
|
} };
|
|
if (!pi(t3, e4))
|
|
return h2;
|
|
function d2() {
|
|
l2.forEach(function(t4) {
|
|
return t4();
|
|
}), l2 = [];
|
|
}
|
|
return h2.setOptions(i3).then(function(t4) {
|
|
!c3 && i3.onFirstUpdate && i3.onFirstUpdate(t4);
|
|
}), h2;
|
|
};
|
|
}
|
|
var gi = mi(), _i = mi({ defaultModifiers: [Re, ci, Be, _e] }), bi = mi({ defaultModifiers: [Re, ci, Be, _e, li, si, hi, Me, ai] });
|
|
const vi = Object.freeze(Object.defineProperty({ __proto__: null, afterMain: ae, afterRead: se, afterWrite: he, applyStyles: _e, arrow: Me, auto: Kt, basePlacements: Qt, beforeMain: oe, beforeRead: ie, beforeWrite: le, bottom: Rt, clippingParents: Ut, computeStyles: Be, createPopper: bi, createPopperBase: gi, createPopperLite: _i, detectOverflow: ii, end: Yt, eventListeners: Re, flip: si, hide: ai, left: Vt, main: re2, modifierPhases: de, offset: li, placements: ee, popper: Jt, popperGenerator: mi, popperOffsets: ci, preventOverflow: hi, read: ne, reference: Zt, right: qt, start: Xt, top: zt, variationPlacements: te, viewport: Gt, write: ce }, Symbol.toStringTag, { value: "Module" })), yi = "dropdown", wi = ".bs.dropdown", Ai = ".data-api", Ei = "ArrowUp", Ti = "ArrowDown", Ci = `hide${wi}`, Oi = `hidden${wi}`, xi = `show${wi}`, ki = `shown${wi}`, Li = `click${wi}${Ai}`, Si = `keydown${wi}${Ai}`, Di = `keyup${wi}${Ai}`, $i = "show", Ii = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)', Ni = `${Ii}.${$i}`, Pi = ".dropdown-menu", ji = p() ? "top-end" : "top-start", Mi = p() ? "top-start" : "top-end", Fi = p() ? "bottom-end" : "bottom-start", Hi = p() ? "bottom-start" : "bottom-end", Wi = p() ? "left-start" : "right-start", Bi = p() ? "right-start" : "left-start", zi = { autoClose: true, boundary: "clippingParents", display: "dynamic", offset: [0, 2], popperConfig: null, reference: "toggle" }, Ri = { autoClose: "(boolean|string)", boundary: "(string|element)", display: "string", offset: "(array|string|function)", popperConfig: "(null|object|function)", reference: "(string|element|object)" };
|
|
class qi extends W {
|
|
constructor(t2, e3) {
|
|
super(t2, e3), this._popper = null, this._parent = this._element.parentNode, this._menu = z.next(this._element, Pi)[0] || z.prev(this._element, Pi)[0] || z.findOne(Pi, this._parent), this._inNavbar = this._detectNavbar();
|
|
}
|
|
static get Default() {
|
|
return zi;
|
|
}
|
|
static get DefaultType() {
|
|
return Ri;
|
|
}
|
|
static get NAME() {
|
|
return yi;
|
|
}
|
|
toggle() {
|
|
return this._isShown() ? this.hide() : this.show();
|
|
}
|
|
show() {
|
|
if (l(this._element) || this._isShown())
|
|
return;
|
|
const t2 = { relatedTarget: this._element };
|
|
if (!N.trigger(this._element, xi, t2).defaultPrevented) {
|
|
if (this._createPopper(), "ontouchstart" in document.documentElement && !this._parent.closest(".navbar-nav"))
|
|
for (const t3 of [].concat(...document.body.children))
|
|
N.on(t3, "mouseover", h);
|
|
this._element.focus(), this._element.setAttribute("aria-expanded", true), this._menu.classList.add($i), this._element.classList.add($i), N.trigger(this._element, ki, t2);
|
|
}
|
|
}
|
|
hide() {
|
|
if (l(this._element) || !this._isShown())
|
|
return;
|
|
const t2 = { relatedTarget: this._element };
|
|
this._completeHide(t2);
|
|
}
|
|
dispose() {
|
|
this._popper && this._popper.destroy(), super.dispose();
|
|
}
|
|
update() {
|
|
this._inNavbar = this._detectNavbar(), this._popper && this._popper.update();
|
|
}
|
|
_completeHide(t2) {
|
|
if (!N.trigger(this._element, Ci, t2).defaultPrevented) {
|
|
if ("ontouchstart" in document.documentElement)
|
|
for (const t3 of [].concat(...document.body.children))
|
|
N.off(t3, "mouseover", h);
|
|
this._popper && this._popper.destroy(), this._menu.classList.remove($i), this._element.classList.remove($i), this._element.setAttribute("aria-expanded", "false"), F.removeDataAttribute(this._menu, "popper"), N.trigger(this._element, Oi, t2);
|
|
}
|
|
}
|
|
_getConfig(t2) {
|
|
if ("object" == typeof (t2 = super._getConfig(t2)).reference && !o(t2.reference) && "function" != typeof t2.reference.getBoundingClientRect)
|
|
throw new TypeError(`${yi.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
|
|
return t2;
|
|
}
|
|
_createPopper() {
|
|
if (void 0 === vi)
|
|
throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");
|
|
let t2 = this._element;
|
|
"parent" === this._config.reference ? t2 = this._parent : o(this._config.reference) ? t2 = r(this._config.reference) : "object" == typeof this._config.reference && (t2 = this._config.reference);
|
|
const e3 = this._getPopperConfig();
|
|
this._popper = bi(t2, this._menu, e3);
|
|
}
|
|
_isShown() {
|
|
return this._menu.classList.contains($i);
|
|
}
|
|
_getPlacement() {
|
|
const t2 = this._parent;
|
|
if (t2.classList.contains("dropend"))
|
|
return Wi;
|
|
if (t2.classList.contains("dropstart"))
|
|
return Bi;
|
|
if (t2.classList.contains("dropup-center"))
|
|
return "top";
|
|
if (t2.classList.contains("dropdown-center"))
|
|
return "bottom";
|
|
const e3 = "end" === getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();
|
|
return t2.classList.contains("dropup") ? e3 ? Mi : ji : e3 ? Hi : Fi;
|
|
}
|
|
_detectNavbar() {
|
|
return null !== this._element.closest(".navbar");
|
|
}
|
|
_getOffset() {
|
|
const { offset: t2 } = this._config;
|
|
return "string" == typeof t2 ? t2.split(",").map((t3) => Number.parseInt(t3, 10)) : "function" == typeof t2 ? (e3) => t2(e3, this._element) : t2;
|
|
}
|
|
_getPopperConfig() {
|
|
const t2 = { placement: this._getPlacement(), modifiers: [{ name: "preventOverflow", options: { boundary: this._config.boundary } }, { name: "offset", options: { offset: this._getOffset() } }] };
|
|
return (this._inNavbar || "static" === this._config.display) && (F.setDataAttribute(this._menu, "popper", "static"), t2.modifiers = [{ name: "applyStyles", enabled: false }]), { ...t2, ...g(this._config.popperConfig, [t2]) };
|
|
}
|
|
_selectMenuItem({ key: t2, target: e3 }) {
|
|
const i2 = z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)", this._menu).filter((t3) => a2(t3));
|
|
i2.length && b(i2, e3, t2 === Ti, !i2.includes(e3)).focus();
|
|
}
|
|
static jQueryInterface(t2) {
|
|
return this.each(function() {
|
|
const e3 = qi.getOrCreateInstance(this, t2);
|
|
if ("string" == typeof t2) {
|
|
if (void 0 === e3[t2])
|
|
throw new TypeError(`No method named "${t2}"`);
|
|
e3[t2]();
|
|
}
|
|
});
|
|
}
|
|
static clearMenus(t2) {
|
|
if (2 === t2.button || "keyup" === t2.type && "Tab" !== t2.key)
|
|
return;
|
|
const e3 = z.find(Ni);
|
|
for (const i2 of e3) {
|
|
const e4 = qi.getInstance(i2);
|
|
if (!e4 || false === e4._config.autoClose)
|
|
continue;
|
|
const n2 = t2.composedPath(), s2 = n2.includes(e4._menu);
|
|
if (n2.includes(e4._element) || "inside" === e4._config.autoClose && !s2 || "outside" === e4._config.autoClose && s2)
|
|
continue;
|
|
if (e4._menu.contains(t2.target) && ("keyup" === t2.type && "Tab" === t2.key || /input|select|option|textarea|form/i.test(t2.target.tagName)))
|
|
continue;
|
|
const o2 = { relatedTarget: e4._element };
|
|
"click" === t2.type && (o2.clickEvent = t2), e4._completeHide(o2);
|
|
}
|
|
}
|
|
static dataApiKeydownHandler(t2) {
|
|
const e3 = /input|textarea/i.test(t2.target.tagName), i2 = "Escape" === t2.key, n2 = [Ei, Ti].includes(t2.key);
|
|
if (!n2 && !i2)
|
|
return;
|
|
if (e3 && !i2)
|
|
return;
|
|
t2.preventDefault();
|
|
const s2 = this.matches(Ii) ? this : z.prev(this, Ii)[0] || z.next(this, Ii)[0] || z.findOne(Ii, t2.delegateTarget.parentNode), o2 = qi.getOrCreateInstance(s2);
|
|
if (n2)
|
|
return t2.stopPropagation(), o2.show(), void o2._selectMenuItem(t2);
|
|
o2._isShown() && (t2.stopPropagation(), o2.hide(), s2.focus());
|
|
}
|
|
}
|
|
N.on(document, Si, Ii, qi.dataApiKeydownHandler), N.on(document, Si, Pi, qi.dataApiKeydownHandler), N.on(document, Li, qi.clearMenus), N.on(document, Di, qi.clearMenus), N.on(document, Li, Ii, function(t2) {
|
|
t2.preventDefault(), qi.getOrCreateInstance(this).toggle();
|
|
}), m2(qi);
|
|
const Vi = "backdrop", Ki = "show", Qi = `mousedown.bs.${Vi}`, Xi = { className: "modal-backdrop", clickCallback: null, isAnimated: false, isVisible: true, rootElement: "body" }, Yi = { className: "string", clickCallback: "(function|null)", isAnimated: "boolean", isVisible: "boolean", rootElement: "(element|string)" };
|
|
class Ui extends H {
|
|
constructor(t2) {
|
|
super(), this._config = this._getConfig(t2), this._isAppended = false, this._element = null;
|
|
}
|
|
static get Default() {
|
|
return Xi;
|
|
}
|
|
static get DefaultType() {
|
|
return Yi;
|
|
}
|
|
static get NAME() {
|
|
return Vi;
|
|
}
|
|
show(t2) {
|
|
if (!this._config.isVisible)
|
|
return void g(t2);
|
|
this._append();
|
|
const e3 = this._getElement();
|
|
this._config.isAnimated && d(e3), e3.classList.add(Ki), this._emulateAnimation(() => {
|
|
g(t2);
|
|
});
|
|
}
|
|
hide(t2) {
|
|
this._config.isVisible ? (this._getElement().classList.remove(Ki), this._emulateAnimation(() => {
|
|
this.dispose(), g(t2);
|
|
})) : g(t2);
|
|
}
|
|
dispose() {
|
|
this._isAppended && (N.off(this._element, Qi), this._element.remove(), this._isAppended = false);
|
|
}
|
|
_getElement() {
|
|
if (!this._element) {
|
|
const t2 = document.createElement("div");
|
|
t2.className = this._config.className, this._config.isAnimated && t2.classList.add("fade"), this._element = t2;
|
|
}
|
|
return this._element;
|
|
}
|
|
_configAfterMerge(t2) {
|
|
return t2.rootElement = r(t2.rootElement), t2;
|
|
}
|
|
_append() {
|
|
if (this._isAppended)
|
|
return;
|
|
const t2 = this._getElement();
|
|
this._config.rootElement.append(t2), N.on(t2, Qi, () => {
|
|
g(this._config.clickCallback);
|
|
}), this._isAppended = true;
|
|
}
|
|
_emulateAnimation(t2) {
|
|
_(t2, this._getElement(), this._config.isAnimated);
|
|
}
|
|
}
|
|
const Gi = ".bs.focustrap", Ji = `focusin${Gi}`, Zi = `keydown.tab${Gi}`, tn = "backward", en = { autofocus: true, trapElement: null }, nn = { autofocus: "boolean", trapElement: "element" };
|
|
class sn extends H {
|
|
constructor(t2) {
|
|
super(), this._config = this._getConfig(t2), this._isActive = false, this._lastTabNavDirection = null;
|
|
}
|
|
static get Default() {
|
|
return en;
|
|
}
|
|
static get DefaultType() {
|
|
return nn;
|
|
}
|
|
static get NAME() {
|
|
return "focustrap";
|
|
}
|
|
activate() {
|
|
this._isActive || (this._config.autofocus && this._config.trapElement.focus(), N.off(document, Gi), N.on(document, Ji, (t2) => this._handleFocusin(t2)), N.on(document, Zi, (t2) => this._handleKeydown(t2)), this._isActive = true);
|
|
}
|
|
deactivate() {
|
|
this._isActive && (this._isActive = false, N.off(document, Gi));
|
|
}
|
|
_handleFocusin(t2) {
|
|
const { trapElement: e3 } = this._config;
|
|
if (t2.target === document || t2.target === e3 || e3.contains(t2.target))
|
|
return;
|
|
const i2 = z.focusableChildren(e3);
|
|
0 === i2.length ? e3.focus() : this._lastTabNavDirection === tn ? i2[i2.length - 1].focus() : i2[0].focus();
|
|
}
|
|
_handleKeydown(t2) {
|
|
"Tab" === t2.key && (this._lastTabNavDirection = t2.shiftKey ? tn : "forward");
|
|
}
|
|
}
|
|
const on = ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top", rn = ".sticky-top", an = "padding-right", ln = "margin-right";
|
|
class cn {
|
|
constructor() {
|
|
this._element = document.body;
|
|
}
|
|
getWidth() {
|
|
const t2 = document.documentElement.clientWidth;
|
|
return Math.abs(window.innerWidth - t2);
|
|
}
|
|
hide() {
|
|
const t2 = this.getWidth();
|
|
this._disableOverFlow(), this._setElementAttributes(this._element, an, (e3) => e3 + t2), this._setElementAttributes(on, an, (e3) => e3 + t2), this._setElementAttributes(rn, ln, (e3) => e3 - t2);
|
|
}
|
|
reset() {
|
|
this._resetElementAttributes(this._element, "overflow"), this._resetElementAttributes(this._element, an), this._resetElementAttributes(on, an), this._resetElementAttributes(rn, ln);
|
|
}
|
|
isOverflowing() {
|
|
return this.getWidth() > 0;
|
|
}
|
|
_disableOverFlow() {
|
|
this._saveInitialAttribute(this._element, "overflow"), this._element.style.overflow = "hidden";
|
|
}
|
|
_setElementAttributes(t2, e3, i2) {
|
|
const n2 = this.getWidth();
|
|
this._applyManipulationCallback(t2, (t3) => {
|
|
if (t3 !== this._element && window.innerWidth > t3.clientWidth + n2)
|
|
return;
|
|
this._saveInitialAttribute(t3, e3);
|
|
const s2 = window.getComputedStyle(t3).getPropertyValue(e3);
|
|
t3.style.setProperty(e3, `${i2(Number.parseFloat(s2))}px`);
|
|
});
|
|
}
|
|
_saveInitialAttribute(t2, e3) {
|
|
const i2 = t2.style.getPropertyValue(e3);
|
|
i2 && F.setDataAttribute(t2, e3, i2);
|
|
}
|
|
_resetElementAttributes(t2, e3) {
|
|
this._applyManipulationCallback(t2, (t3) => {
|
|
const i2 = F.getDataAttribute(t3, e3);
|
|
null !== i2 ? (F.removeDataAttribute(t3, e3), t3.style.setProperty(e3, i2)) : t3.style.removeProperty(e3);
|
|
});
|
|
}
|
|
_applyManipulationCallback(t2, e3) {
|
|
if (o(t2))
|
|
e3(t2);
|
|
else
|
|
for (const i2 of z.find(t2, this._element))
|
|
e3(i2);
|
|
}
|
|
}
|
|
const hn = ".bs.modal", dn = `hide${hn}`, un = `hidePrevented${hn}`, fn = `hidden${hn}`, pn = `show${hn}`, mn = `shown${hn}`, gn = `resize${hn}`, _n = `click.dismiss${hn}`, bn = `mousedown.dismiss${hn}`, vn = `keydown.dismiss${hn}`, yn = `click${hn}.data-api`, wn = "modal-open", An = "show", En = "modal-static", Tn = { backdrop: true, focus: true, keyboard: true }, Cn = { backdrop: "(boolean|string)", focus: "boolean", keyboard: "boolean" };
|
|
class On extends W {
|
|
constructor(t2, e3) {
|
|
super(t2, e3), this._dialog = z.findOne(".modal-dialog", this._element), this._backdrop = this._initializeBackDrop(), this._focustrap = this._initializeFocusTrap(), this._isShown = false, this._isTransitioning = false, this._scrollBar = new cn(), this._addEventListeners();
|
|
}
|
|
static get Default() {
|
|
return Tn;
|
|
}
|
|
static get DefaultType() {
|
|
return Cn;
|
|
}
|
|
static get NAME() {
|
|
return "modal";
|
|
}
|
|
toggle(t2) {
|
|
return this._isShown ? this.hide() : this.show(t2);
|
|
}
|
|
show(t2) {
|
|
this._isShown || this._isTransitioning || N.trigger(this._element, pn, { relatedTarget: t2 }).defaultPrevented || (this._isShown = true, this._isTransitioning = true, this._scrollBar.hide(), document.body.classList.add(wn), this._adjustDialog(), this._backdrop.show(() => this._showElement(t2)));
|
|
}
|
|
hide() {
|
|
this._isShown && !this._isTransitioning && (N.trigger(this._element, dn).defaultPrevented || (this._isShown = false, this._isTransitioning = true, this._focustrap.deactivate(), this._element.classList.remove(An), this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())));
|
|
}
|
|
dispose() {
|
|
N.off(window, hn), N.off(this._dialog, hn), this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose();
|
|
}
|
|
handleUpdate() {
|
|
this._adjustDialog();
|
|
}
|
|
_initializeBackDrop() {
|
|
return new Ui({ isVisible: Boolean(this._config.backdrop), isAnimated: this._isAnimated() });
|
|
}
|
|
_initializeFocusTrap() {
|
|
return new sn({ trapElement: this._element });
|
|
}
|
|
_showElement(t2) {
|
|
document.body.contains(this._element) || document.body.append(this._element), this._element.style.display = "block", this._element.removeAttribute("aria-hidden"), this._element.setAttribute("aria-modal", true), this._element.setAttribute("role", "dialog"), this._element.scrollTop = 0;
|
|
const e3 = z.findOne(".modal-body", this._dialog);
|
|
e3 && (e3.scrollTop = 0), d(this._element), this._element.classList.add(An), this._queueCallback(() => {
|
|
this._config.focus && this._focustrap.activate(), this._isTransitioning = false, N.trigger(this._element, mn, { relatedTarget: t2 });
|
|
}, this._dialog, this._isAnimated());
|
|
}
|
|
_addEventListeners() {
|
|
N.on(this._element, vn, (t2) => {
|
|
"Escape" === t2.key && (this._config.keyboard ? this.hide() : this._triggerBackdropTransition());
|
|
}), N.on(window, gn, () => {
|
|
this._isShown && !this._isTransitioning && this._adjustDialog();
|
|
}), N.on(this._element, bn, (t2) => {
|
|
N.one(this._element, _n, (e3) => {
|
|
this._element === t2.target && this._element === e3.target && ("static" !== this._config.backdrop ? this._config.backdrop && this.hide() : this._triggerBackdropTransition());
|
|
});
|
|
});
|
|
}
|
|
_hideModal() {
|
|
this._element.style.display = "none", this._element.setAttribute("aria-hidden", true), this._element.removeAttribute("aria-modal"), this._element.removeAttribute("role"), this._isTransitioning = false, this._backdrop.hide(() => {
|
|
document.body.classList.remove(wn), this._resetAdjustments(), this._scrollBar.reset(), N.trigger(this._element, fn);
|
|
});
|
|
}
|
|
_isAnimated() {
|
|
return this._element.classList.contains("fade");
|
|
}
|
|
_triggerBackdropTransition() {
|
|
if (N.trigger(this._element, un).defaultPrevented)
|
|
return;
|
|
const t2 = this._element.scrollHeight > document.documentElement.clientHeight, e3 = this._element.style.overflowY;
|
|
"hidden" === e3 || this._element.classList.contains(En) || (t2 || (this._element.style.overflowY = "hidden"), this._element.classList.add(En), this._queueCallback(() => {
|
|
this._element.classList.remove(En), this._queueCallback(() => {
|
|
this._element.style.overflowY = e3;
|
|
}, this._dialog);
|
|
}, this._dialog), this._element.focus());
|
|
}
|
|
_adjustDialog() {
|
|
const t2 = this._element.scrollHeight > document.documentElement.clientHeight, e3 = this._scrollBar.getWidth(), i2 = e3 > 0;
|
|
if (i2 && !t2) {
|
|
const t3 = p() ? "paddingLeft" : "paddingRight";
|
|
this._element.style[t3] = `${e3}px`;
|
|
}
|
|
if (!i2 && t2) {
|
|
const t3 = p() ? "paddingRight" : "paddingLeft";
|
|
this._element.style[t3] = `${e3}px`;
|
|
}
|
|
}
|
|
_resetAdjustments() {
|
|
this._element.style.paddingLeft = "", this._element.style.paddingRight = "";
|
|
}
|
|
static jQueryInterface(t2, e3) {
|
|
return this.each(function() {
|
|
const i2 = On.getOrCreateInstance(this, t2);
|
|
if ("string" == typeof t2) {
|
|
if (void 0 === i2[t2])
|
|
throw new TypeError(`No method named "${t2}"`);
|
|
i2[t2](e3);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
N.on(document, yn, '[data-bs-toggle="modal"]', function(t2) {
|
|
const e3 = z.getElementFromSelector(this);
|
|
["A", "AREA"].includes(this.tagName) && t2.preventDefault(), N.one(e3, pn, (t3) => {
|
|
t3.defaultPrevented || N.one(e3, fn, () => {
|
|
a2(this) && this.focus();
|
|
});
|
|
});
|
|
const i2 = z.findOne(".modal.show");
|
|
i2 && On.getInstance(i2).hide(), On.getOrCreateInstance(e3).toggle(this);
|
|
}), R(On), m2(On);
|
|
const xn = ".bs.offcanvas", kn = ".data-api", Ln = `load${xn}${kn}`, Sn = "show", Dn = "showing", $n = "hiding", In = ".offcanvas.show", Nn = `show${xn}`, Pn = `shown${xn}`, jn = `hide${xn}`, Mn = `hidePrevented${xn}`, Fn = `hidden${xn}`, Hn = `resize${xn}`, Wn = `click${xn}${kn}`, Bn = `keydown.dismiss${xn}`, zn = { backdrop: true, keyboard: true, scroll: false }, Rn = { backdrop: "(boolean|string)", keyboard: "boolean", scroll: "boolean" };
|
|
class qn extends W {
|
|
constructor(t2, e3) {
|
|
super(t2, e3), this._isShown = false, this._backdrop = this._initializeBackDrop(), this._focustrap = this._initializeFocusTrap(), this._addEventListeners();
|
|
}
|
|
static get Default() {
|
|
return zn;
|
|
}
|
|
static get DefaultType() {
|
|
return Rn;
|
|
}
|
|
static get NAME() {
|
|
return "offcanvas";
|
|
}
|
|
toggle(t2) {
|
|
return this._isShown ? this.hide() : this.show(t2);
|
|
}
|
|
show(t2) {
|
|
this._isShown || N.trigger(this._element, Nn, { relatedTarget: t2 }).defaultPrevented || (this._isShown = true, this._backdrop.show(), this._config.scroll || new cn().hide(), this._element.setAttribute("aria-modal", true), this._element.setAttribute("role", "dialog"), this._element.classList.add(Dn), this._queueCallback(() => {
|
|
this._config.scroll && !this._config.backdrop || this._focustrap.activate(), this._element.classList.add(Sn), this._element.classList.remove(Dn), N.trigger(this._element, Pn, { relatedTarget: t2 });
|
|
}, this._element, true));
|
|
}
|
|
hide() {
|
|
this._isShown && (N.trigger(this._element, jn).defaultPrevented || (this._focustrap.deactivate(), this._element.blur(), this._isShown = false, this._element.classList.add($n), this._backdrop.hide(), this._queueCallback(() => {
|
|
this._element.classList.remove(Sn, $n), this._element.removeAttribute("aria-modal"), this._element.removeAttribute("role"), this._config.scroll || new cn().reset(), N.trigger(this._element, Fn);
|
|
}, this._element, true)));
|
|
}
|
|
dispose() {
|
|
this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose();
|
|
}
|
|
_initializeBackDrop() {
|
|
const t2 = Boolean(this._config.backdrop);
|
|
return new Ui({ className: "offcanvas-backdrop", isVisible: t2, isAnimated: true, rootElement: this._element.parentNode, clickCallback: t2 ? () => {
|
|
"static" !== this._config.backdrop ? this.hide() : N.trigger(this._element, Mn);
|
|
} : null });
|
|
}
|
|
_initializeFocusTrap() {
|
|
return new sn({ trapElement: this._element });
|
|
}
|
|
_addEventListeners() {
|
|
N.on(this._element, Bn, (t2) => {
|
|
"Escape" === t2.key && (this._config.keyboard ? this.hide() : N.trigger(this._element, Mn));
|
|
});
|
|
}
|
|
static jQueryInterface(t2) {
|
|
return this.each(function() {
|
|
const e3 = qn.getOrCreateInstance(this, t2);
|
|
if ("string" == typeof t2) {
|
|
if (void 0 === e3[t2] || t2.startsWith("_") || "constructor" === t2)
|
|
throw new TypeError(`No method named "${t2}"`);
|
|
e3[t2](this);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
N.on(document, Wn, '[data-bs-toggle="offcanvas"]', function(t2) {
|
|
const e3 = z.getElementFromSelector(this);
|
|
if (["A", "AREA"].includes(this.tagName) && t2.preventDefault(), l(this))
|
|
return;
|
|
N.one(e3, Fn, () => {
|
|
a2(this) && this.focus();
|
|
});
|
|
const i2 = z.findOne(In);
|
|
i2 && i2 !== e3 && qn.getInstance(i2).hide(), qn.getOrCreateInstance(e3).toggle(this);
|
|
}), N.on(window, Ln, () => {
|
|
for (const t2 of z.find(In))
|
|
qn.getOrCreateInstance(t2).show();
|
|
}), N.on(window, Hn, () => {
|
|
for (const t2 of z.find("[aria-modal][class*=show][class*=offcanvas-]"))
|
|
"fixed" !== getComputedStyle(t2).position && qn.getOrCreateInstance(t2).hide();
|
|
}), R(qn), m2(qn);
|
|
const Vn = { "*": ["class", "dir", "id", "lang", "role", /^aria-[\w-]*$/i], a: ["target", "href", "title", "rel"], area: [], b: [], br: [], col: [], code: [], dd: [], div: [], dl: [], dt: [], em: [], hr: [], h1: [], h2: [], h3: [], h4: [], h5: [], h6: [], i: [], img: ["src", "srcset", "alt", "title", "width", "height"], li: [], ol: [], p: [], pre: [], s: [], small: [], span: [], sub: [], sup: [], strong: [], u: [], ul: [] }, Kn = /* @__PURE__ */ new Set(["background", "cite", "href", "itemtype", "longdesc", "poster", "src", "xlink:href"]), Qn = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i, Xn = (t2, e3) => {
|
|
const i2 = t2.nodeName.toLowerCase();
|
|
return e3.includes(i2) ? !Kn.has(i2) || Boolean(Qn.test(t2.nodeValue)) : e3.filter((t3) => t3 instanceof RegExp).some((t3) => t3.test(i2));
|
|
}, Yn = { allowList: Vn, content: {}, extraClass: "", html: false, sanitize: true, sanitizeFn: null, template: "<div></div>" }, Un = { allowList: "object", content: "object", extraClass: "(string|function)", html: "boolean", sanitize: "boolean", sanitizeFn: "(null|function)", template: "string" }, Gn = { entry: "(string|element|function|null)", selector: "(string|element)" };
|
|
class Jn extends H {
|
|
constructor(t2) {
|
|
super(), this._config = this._getConfig(t2);
|
|
}
|
|
static get Default() {
|
|
return Yn;
|
|
}
|
|
static get DefaultType() {
|
|
return Un;
|
|
}
|
|
static get NAME() {
|
|
return "TemplateFactory";
|
|
}
|
|
getContent() {
|
|
return Object.values(this._config.content).map((t2) => this._resolvePossibleFunction(t2)).filter(Boolean);
|
|
}
|
|
hasContent() {
|
|
return this.getContent().length > 0;
|
|
}
|
|
changeContent(t2) {
|
|
return this._checkContent(t2), this._config.content = { ...this._config.content, ...t2 }, this;
|
|
}
|
|
toHtml() {
|
|
const t2 = document.createElement("div");
|
|
t2.innerHTML = this._maybeSanitize(this._config.template);
|
|
for (const [e4, i3] of Object.entries(this._config.content))
|
|
this._setContent(t2, i3, e4);
|
|
const e3 = t2.children[0], i2 = this._resolvePossibleFunction(this._config.extraClass);
|
|
return i2 && e3.classList.add(...i2.split(" ")), e3;
|
|
}
|
|
_typeCheckConfig(t2) {
|
|
super._typeCheckConfig(t2), this._checkContent(t2.content);
|
|
}
|
|
_checkContent(t2) {
|
|
for (const [e3, i2] of Object.entries(t2))
|
|
super._typeCheckConfig({ selector: e3, entry: i2 }, Gn);
|
|
}
|
|
_setContent(t2, e3, i2) {
|
|
const n2 = z.findOne(i2, t2);
|
|
n2 && ((e3 = this._resolvePossibleFunction(e3)) ? o(e3) ? this._putElementInTemplate(r(e3), n2) : this._config.html ? n2.innerHTML = this._maybeSanitize(e3) : n2.textContent = e3 : n2.remove());
|
|
}
|
|
_maybeSanitize(t2) {
|
|
return this._config.sanitize ? function(t3, e3, i2) {
|
|
if (!t3.length)
|
|
return t3;
|
|
if (i2 && "function" == typeof i2)
|
|
return i2(t3);
|
|
const n2 = new window.DOMParser().parseFromString(t3, "text/html"), s2 = [].concat(...n2.body.querySelectorAll("*"));
|
|
for (const t4 of s2) {
|
|
const i3 = t4.nodeName.toLowerCase();
|
|
if (!Object.keys(e3).includes(i3)) {
|
|
t4.remove();
|
|
continue;
|
|
}
|
|
const n3 = [].concat(...t4.attributes), s3 = [].concat(e3["*"] || [], e3[i3] || []);
|
|
for (const e4 of n3)
|
|
Xn(e4, s3) || t4.removeAttribute(e4.nodeName);
|
|
}
|
|
return n2.body.innerHTML;
|
|
}(t2, this._config.allowList, this._config.sanitizeFn) : t2;
|
|
}
|
|
_resolvePossibleFunction(t2) {
|
|
return g(t2, [this]);
|
|
}
|
|
_putElementInTemplate(t2, e3) {
|
|
if (this._config.html)
|
|
return e3.innerHTML = "", void e3.append(t2);
|
|
e3.textContent = t2.textContent;
|
|
}
|
|
}
|
|
const Zn = /* @__PURE__ */ new Set(["sanitize", "allowList", "sanitizeFn"]), ts = "fade", es = "show", is = ".modal", ns = "hide.bs.modal", ss = "hover", os = "focus", rs = { AUTO: "auto", TOP: "top", RIGHT: p() ? "left" : "right", BOTTOM: "bottom", LEFT: p() ? "right" : "left" }, as = { allowList: Vn, animation: true, boundary: "clippingParents", container: false, customClass: "", delay: 0, fallbackPlacements: ["top", "right", "bottom", "left"], html: false, offset: [0, 6], placement: "top", popperConfig: null, sanitize: true, sanitizeFn: null, selector: false, template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', title: "", trigger: "hover focus" }, ls = { allowList: "object", animation: "boolean", boundary: "(string|element)", container: "(string|element|boolean)", customClass: "(string|function)", delay: "(number|object)", fallbackPlacements: "array", html: "boolean", offset: "(array|string|function)", placement: "(string|function)", popperConfig: "(null|object|function)", sanitize: "boolean", sanitizeFn: "(null|function)", selector: "(string|boolean)", template: "string", title: "(string|element|function)", trigger: "string" };
|
|
class cs extends W {
|
|
constructor(t2, e3) {
|
|
if (void 0 === vi)
|
|
throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");
|
|
super(t2, e3), this._isEnabled = true, this._timeout = 0, this._isHovered = null, this._activeTrigger = {}, this._popper = null, this._templateFactory = null, this._newContent = null, this.tip = null, this._setListeners(), this._config.selector || this._fixTitle();
|
|
}
|
|
static get Default() {
|
|
return as;
|
|
}
|
|
static get DefaultType() {
|
|
return ls;
|
|
}
|
|
static get NAME() {
|
|
return "tooltip";
|
|
}
|
|
enable() {
|
|
this._isEnabled = true;
|
|
}
|
|
disable() {
|
|
this._isEnabled = false;
|
|
}
|
|
toggleEnabled() {
|
|
this._isEnabled = !this._isEnabled;
|
|
}
|
|
toggle() {
|
|
this._isEnabled && (this._activeTrigger.click = !this._activeTrigger.click, this._isShown() ? this._leave() : this._enter());
|
|
}
|
|
dispose() {
|
|
clearTimeout(this._timeout), N.off(this._element.closest(is), ns, this._hideModalHandler), this._element.getAttribute("data-bs-original-title") && this._element.setAttribute("title", this._element.getAttribute("data-bs-original-title")), this._disposePopper(), super.dispose();
|
|
}
|
|
show() {
|
|
if ("none" === this._element.style.display)
|
|
throw new Error("Please use show on visible elements");
|
|
if (!this._isWithContent() || !this._isEnabled)
|
|
return;
|
|
const t2 = N.trigger(this._element, this.constructor.eventName("show")), e3 = (c2(this._element) || this._element.ownerDocument.documentElement).contains(this._element);
|
|
if (t2.defaultPrevented || !e3)
|
|
return;
|
|
this._disposePopper();
|
|
const i2 = this._getTipElement();
|
|
this._element.setAttribute("aria-describedby", i2.getAttribute("id"));
|
|
const { container: n2 } = this._config;
|
|
if (this._element.ownerDocument.documentElement.contains(this.tip) || (n2.append(i2), N.trigger(this._element, this.constructor.eventName("inserted"))), this._popper = this._createPopper(i2), i2.classList.add(es), "ontouchstart" in document.documentElement)
|
|
for (const t3 of [].concat(...document.body.children))
|
|
N.on(t3, "mouseover", h);
|
|
this._queueCallback(() => {
|
|
N.trigger(this._element, this.constructor.eventName("shown")), false === this._isHovered && this._leave(), this._isHovered = false;
|
|
}, this.tip, this._isAnimated());
|
|
}
|
|
hide() {
|
|
if (this._isShown() && !N.trigger(this._element, this.constructor.eventName("hide")).defaultPrevented) {
|
|
if (this._getTipElement().classList.remove(es), "ontouchstart" in document.documentElement)
|
|
for (const t2 of [].concat(...document.body.children))
|
|
N.off(t2, "mouseover", h);
|
|
this._activeTrigger.click = false, this._activeTrigger[os] = false, this._activeTrigger[ss] = false, this._isHovered = null, this._queueCallback(() => {
|
|
this._isWithActiveTrigger() || (this._isHovered || this._disposePopper(), this._element.removeAttribute("aria-describedby"), N.trigger(this._element, this.constructor.eventName("hidden")));
|
|
}, this.tip, this._isAnimated());
|
|
}
|
|
}
|
|
update() {
|
|
this._popper && this._popper.update();
|
|
}
|
|
_isWithContent() {
|
|
return Boolean(this._getTitle());
|
|
}
|
|
_getTipElement() {
|
|
return this.tip || (this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())), this.tip;
|
|
}
|
|
_createTipElement(t2) {
|
|
const e3 = this._getTemplateFactory(t2).toHtml();
|
|
if (!e3)
|
|
return null;
|
|
e3.classList.remove(ts, es), e3.classList.add(`bs-${this.constructor.NAME}-auto`);
|
|
const i2 = ((t3) => {
|
|
do {
|
|
t3 += Math.floor(1e6 * Math.random());
|
|
} while (document.getElementById(t3));
|
|
return t3;
|
|
})(this.constructor.NAME).toString();
|
|
return e3.setAttribute("id", i2), this._isAnimated() && e3.classList.add(ts), e3;
|
|
}
|
|
setContent(t2) {
|
|
this._newContent = t2, this._isShown() && (this._disposePopper(), this.show());
|
|
}
|
|
_getTemplateFactory(t2) {
|
|
return this._templateFactory ? this._templateFactory.changeContent(t2) : this._templateFactory = new Jn({ ...this._config, content: t2, extraClass: this._resolvePossibleFunction(this._config.customClass) }), this._templateFactory;
|
|
}
|
|
_getContentForTemplate() {
|
|
return { ".tooltip-inner": this._getTitle() };
|
|
}
|
|
_getTitle() {
|
|
return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute("data-bs-original-title");
|
|
}
|
|
_initializeOnDelegatedTarget(t2) {
|
|
return this.constructor.getOrCreateInstance(t2.delegateTarget, this._getDelegateConfig());
|
|
}
|
|
_isAnimated() {
|
|
return this._config.animation || this.tip && this.tip.classList.contains(ts);
|
|
}
|
|
_isShown() {
|
|
return this.tip && this.tip.classList.contains(es);
|
|
}
|
|
_createPopper(t2) {
|
|
const e3 = g(this._config.placement, [this, t2, this._element]), i2 = rs[e3.toUpperCase()];
|
|
return bi(this._element, t2, this._getPopperConfig(i2));
|
|
}
|
|
_getOffset() {
|
|
const { offset: t2 } = this._config;
|
|
return "string" == typeof t2 ? t2.split(",").map((t3) => Number.parseInt(t3, 10)) : "function" == typeof t2 ? (e3) => t2(e3, this._element) : t2;
|
|
}
|
|
_resolvePossibleFunction(t2) {
|
|
return g(t2, [this._element]);
|
|
}
|
|
_getPopperConfig(t2) {
|
|
const e3 = { placement: t2, modifiers: [{ name: "flip", options: { fallbackPlacements: this._config.fallbackPlacements } }, { name: "offset", options: { offset: this._getOffset() } }, { name: "preventOverflow", options: { boundary: this._config.boundary } }, { name: "arrow", options: { element: `.${this.constructor.NAME}-arrow` } }, { name: "preSetPlacement", enabled: true, phase: "beforeMain", fn: (t3) => {
|
|
this._getTipElement().setAttribute("data-popper-placement", t3.state.placement);
|
|
} }] };
|
|
return { ...e3, ...g(this._config.popperConfig, [e3]) };
|
|
}
|
|
_setListeners() {
|
|
const t2 = this._config.trigger.split(" ");
|
|
for (const e3 of t2)
|
|
if ("click" === e3)
|
|
N.on(this._element, this.constructor.eventName("click"), this._config.selector, (t3) => {
|
|
this._initializeOnDelegatedTarget(t3).toggle();
|
|
});
|
|
else if ("manual" !== e3) {
|
|
const t3 = e3 === ss ? this.constructor.eventName("mouseenter") : this.constructor.eventName("focusin"), i2 = e3 === ss ? this.constructor.eventName("mouseleave") : this.constructor.eventName("focusout");
|
|
N.on(this._element, t3, this._config.selector, (t4) => {
|
|
const e4 = this._initializeOnDelegatedTarget(t4);
|
|
e4._activeTrigger["focusin" === t4.type ? os : ss] = true, e4._enter();
|
|
}), N.on(this._element, i2, this._config.selector, (t4) => {
|
|
const e4 = this._initializeOnDelegatedTarget(t4);
|
|
e4._activeTrigger["focusout" === t4.type ? os : ss] = e4._element.contains(t4.relatedTarget), e4._leave();
|
|
});
|
|
}
|
|
this._hideModalHandler = () => {
|
|
this._element && this.hide();
|
|
}, N.on(this._element.closest(is), ns, this._hideModalHandler);
|
|
}
|
|
_fixTitle() {
|
|
const t2 = this._element.getAttribute("title");
|
|
t2 && (this._element.getAttribute("aria-label") || this._element.textContent.trim() || this._element.setAttribute("aria-label", t2), this._element.setAttribute("data-bs-original-title", t2), this._element.removeAttribute("title"));
|
|
}
|
|
_enter() {
|
|
this._isShown() || this._isHovered ? this._isHovered = true : (this._isHovered = true, this._setTimeout(() => {
|
|
this._isHovered && this.show();
|
|
}, this._config.delay.show));
|
|
}
|
|
_leave() {
|
|
this._isWithActiveTrigger() || (this._isHovered = false, this._setTimeout(() => {
|
|
this._isHovered || this.hide();
|
|
}, this._config.delay.hide));
|
|
}
|
|
_setTimeout(t2, e3) {
|
|
clearTimeout(this._timeout), this._timeout = setTimeout(t2, e3);
|
|
}
|
|
_isWithActiveTrigger() {
|
|
return Object.values(this._activeTrigger).includes(true);
|
|
}
|
|
_getConfig(t2) {
|
|
const e3 = F.getDataAttributes(this._element);
|
|
for (const t3 of Object.keys(e3))
|
|
Zn.has(t3) && delete e3[t3];
|
|
return t2 = { ...e3, ..."object" == typeof t2 && t2 ? t2 : {} }, t2 = this._mergeConfigObj(t2), t2 = this._configAfterMerge(t2), this._typeCheckConfig(t2), t2;
|
|
}
|
|
_configAfterMerge(t2) {
|
|
return t2.container = false === t2.container ? document.body : r(t2.container), "number" == typeof t2.delay && (t2.delay = { show: t2.delay, hide: t2.delay }), "number" == typeof t2.title && (t2.title = t2.title.toString()), "number" == typeof t2.content && (t2.content = t2.content.toString()), t2;
|
|
}
|
|
_getDelegateConfig() {
|
|
const t2 = {};
|
|
for (const [e3, i2] of Object.entries(this._config))
|
|
this.constructor.Default[e3] !== i2 && (t2[e3] = i2);
|
|
return t2.selector = false, t2.trigger = "manual", t2;
|
|
}
|
|
_disposePopper() {
|
|
this._popper && (this._popper.destroy(), this._popper = null), this.tip && (this.tip.remove(), this.tip = null);
|
|
}
|
|
static jQueryInterface(t2) {
|
|
return this.each(function() {
|
|
const e3 = cs.getOrCreateInstance(this, t2);
|
|
if ("string" == typeof t2) {
|
|
if (void 0 === e3[t2])
|
|
throw new TypeError(`No method named "${t2}"`);
|
|
e3[t2]();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
m2(cs);
|
|
const hs = { ...cs.Default, content: "", offset: [0, 8], placement: "right", template: '<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>', trigger: "click" }, ds = { ...cs.DefaultType, content: "(null|string|element|function)" };
|
|
class us extends cs {
|
|
static get Default() {
|
|
return hs;
|
|
}
|
|
static get DefaultType() {
|
|
return ds;
|
|
}
|
|
static get NAME() {
|
|
return "popover";
|
|
}
|
|
_isWithContent() {
|
|
return this._getTitle() || this._getContent();
|
|
}
|
|
_getContentForTemplate() {
|
|
return { ".popover-header": this._getTitle(), ".popover-body": this._getContent() };
|
|
}
|
|
_getContent() {
|
|
return this._resolvePossibleFunction(this._config.content);
|
|
}
|
|
static jQueryInterface(t2) {
|
|
return this.each(function() {
|
|
const e3 = us.getOrCreateInstance(this, t2);
|
|
if ("string" == typeof t2) {
|
|
if (void 0 === e3[t2])
|
|
throw new TypeError(`No method named "${t2}"`);
|
|
e3[t2]();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
m2(us);
|
|
const fs = ".bs.scrollspy", ps = `activate${fs}`, ms = `click${fs}`, gs = `load${fs}.data-api`, _s = "active", bs = "[href]", vs = ".nav-link", ys = `${vs}, .nav-item > ${vs}, .list-group-item`, ws = { offset: null, rootMargin: "0px 0px -25%", smoothScroll: false, target: null, threshold: [0.1, 0.5, 1] }, As = { offset: "(number|null)", rootMargin: "string", smoothScroll: "boolean", target: "element", threshold: "array" };
|
|
class Es extends W {
|
|
constructor(t2, e3) {
|
|
super(t2, e3), this._targetLinks = /* @__PURE__ */ new Map(), this._observableSections = /* @__PURE__ */ new Map(), this._rootElement = "visible" === getComputedStyle(this._element).overflowY ? null : this._element, this._activeTarget = null, this._observer = null, this._previousScrollData = { visibleEntryTop: 0, parentScrollTop: 0 }, this.refresh();
|
|
}
|
|
static get Default() {
|
|
return ws;
|
|
}
|
|
static get DefaultType() {
|
|
return As;
|
|
}
|
|
static get NAME() {
|
|
return "scrollspy";
|
|
}
|
|
refresh() {
|
|
this._initializeTargetsAndObservables(), this._maybeEnableSmoothScroll(), this._observer ? this._observer.disconnect() : this._observer = this._getNewObserver();
|
|
for (const t2 of this._observableSections.values())
|
|
this._observer.observe(t2);
|
|
}
|
|
dispose() {
|
|
this._observer.disconnect(), super.dispose();
|
|
}
|
|
_configAfterMerge(t2) {
|
|
return t2.target = r(t2.target) || document.body, t2.rootMargin = t2.offset ? `${t2.offset}px 0px -30%` : t2.rootMargin, "string" == typeof t2.threshold && (t2.threshold = t2.threshold.split(",").map((t3) => Number.parseFloat(t3))), t2;
|
|
}
|
|
_maybeEnableSmoothScroll() {
|
|
this._config.smoothScroll && (N.off(this._config.target, ms), N.on(this._config.target, ms, bs, (t2) => {
|
|
const e3 = this._observableSections.get(t2.target.hash);
|
|
if (e3) {
|
|
t2.preventDefault();
|
|
const i2 = this._rootElement || window, n2 = e3.offsetTop - this._element.offsetTop;
|
|
if (i2.scrollTo)
|
|
return void i2.scrollTo({ top: n2, behavior: "smooth" });
|
|
i2.scrollTop = n2;
|
|
}
|
|
}));
|
|
}
|
|
_getNewObserver() {
|
|
const t2 = { root: this._rootElement, threshold: this._config.threshold, rootMargin: this._config.rootMargin };
|
|
return new IntersectionObserver((t3) => this._observerCallback(t3), t2);
|
|
}
|
|
_observerCallback(t2) {
|
|
const e3 = (t3) => this._targetLinks.get(`#${t3.target.id}`), i2 = (t3) => {
|
|
this._previousScrollData.visibleEntryTop = t3.target.offsetTop, this._process(e3(t3));
|
|
}, n2 = (this._rootElement || document.documentElement).scrollTop, s2 = n2 >= this._previousScrollData.parentScrollTop;
|
|
this._previousScrollData.parentScrollTop = n2;
|
|
for (const o2 of t2) {
|
|
if (!o2.isIntersecting) {
|
|
this._activeTarget = null, this._clearActiveClass(e3(o2));
|
|
continue;
|
|
}
|
|
const t3 = o2.target.offsetTop >= this._previousScrollData.visibleEntryTop;
|
|
if (s2 && t3) {
|
|
if (i2(o2), !n2)
|
|
return;
|
|
} else
|
|
s2 || t3 || i2(o2);
|
|
}
|
|
}
|
|
_initializeTargetsAndObservables() {
|
|
this._targetLinks = /* @__PURE__ */ new Map(), this._observableSections = /* @__PURE__ */ new Map();
|
|
const t2 = z.find(bs, this._config.target);
|
|
for (const e3 of t2) {
|
|
if (!e3.hash || l(e3))
|
|
continue;
|
|
const t3 = z.findOne(decodeURI(e3.hash), this._element);
|
|
a2(t3) && (this._targetLinks.set(decodeURI(e3.hash), e3), this._observableSections.set(e3.hash, t3));
|
|
}
|
|
}
|
|
_process(t2) {
|
|
this._activeTarget !== t2 && (this._clearActiveClass(this._config.target), this._activeTarget = t2, t2.classList.add(_s), this._activateParents(t2), N.trigger(this._element, ps, { relatedTarget: t2 }));
|
|
}
|
|
_activateParents(t2) {
|
|
if (t2.classList.contains("dropdown-item"))
|
|
z.findOne(".dropdown-toggle", t2.closest(".dropdown")).classList.add(_s);
|
|
else
|
|
for (const e3 of z.parents(t2, ".nav, .list-group"))
|
|
for (const t3 of z.prev(e3, ys))
|
|
t3.classList.add(_s);
|
|
}
|
|
_clearActiveClass(t2) {
|
|
t2.classList.remove(_s);
|
|
const e3 = z.find(`${bs}.${_s}`, t2);
|
|
for (const t3 of e3)
|
|
t3.classList.remove(_s);
|
|
}
|
|
static jQueryInterface(t2) {
|
|
return this.each(function() {
|
|
const e3 = Es.getOrCreateInstance(this, t2);
|
|
if ("string" == typeof t2) {
|
|
if (void 0 === e3[t2] || t2.startsWith("_") || "constructor" === t2)
|
|
throw new TypeError(`No method named "${t2}"`);
|
|
e3[t2]();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
N.on(window, gs, () => {
|
|
for (const t2 of z.find('[data-bs-spy="scroll"]'))
|
|
Es.getOrCreateInstance(t2);
|
|
}), m2(Es);
|
|
const Ts = ".bs.tab", Cs = `hide${Ts}`, Os = `hidden${Ts}`, xs = `show${Ts}`, ks = `shown${Ts}`, Ls = `click${Ts}`, Ss = `keydown${Ts}`, Ds = `load${Ts}`, $s = "ArrowLeft", Is = "ArrowRight", Ns = "ArrowUp", Ps = "ArrowDown", js = "Home", Ms = "End", Fs = "active", Hs = "fade", Ws = "show", Bs = ".dropdown-toggle", zs = `:not(${Bs})`, Rs = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]', qs = `.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`, Vs = `.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;
|
|
class Ks extends W {
|
|
constructor(t2) {
|
|
super(t2), this._parent = this._element.closest('.list-group, .nav, [role="tablist"]'), this._parent && (this._setInitialAttributes(this._parent, this._getChildren()), N.on(this._element, Ss, (t3) => this._keydown(t3)));
|
|
}
|
|
static get NAME() {
|
|
return "tab";
|
|
}
|
|
show() {
|
|
const t2 = this._element;
|
|
if (this._elemIsActive(t2))
|
|
return;
|
|
const e3 = this._getActiveElem(), i2 = e3 ? N.trigger(e3, Cs, { relatedTarget: t2 }) : null;
|
|
N.trigger(t2, xs, { relatedTarget: e3 }).defaultPrevented || i2 && i2.defaultPrevented || (this._deactivate(e3, t2), this._activate(t2, e3));
|
|
}
|
|
_activate(t2, e3) {
|
|
t2 && (t2.classList.add(Fs), this._activate(z.getElementFromSelector(t2)), this._queueCallback(() => {
|
|
"tab" === t2.getAttribute("role") ? (t2.removeAttribute("tabindex"), t2.setAttribute("aria-selected", true), this._toggleDropDown(t2, true), N.trigger(t2, ks, { relatedTarget: e3 })) : t2.classList.add(Ws);
|
|
}, t2, t2.classList.contains(Hs)));
|
|
}
|
|
_deactivate(t2, e3) {
|
|
t2 && (t2.classList.remove(Fs), t2.blur(), this._deactivate(z.getElementFromSelector(t2)), this._queueCallback(() => {
|
|
"tab" === t2.getAttribute("role") ? (t2.setAttribute("aria-selected", false), t2.setAttribute("tabindex", "-1"), this._toggleDropDown(t2, false), N.trigger(t2, Os, { relatedTarget: e3 })) : t2.classList.remove(Ws);
|
|
}, t2, t2.classList.contains(Hs)));
|
|
}
|
|
_keydown(t2) {
|
|
if (![$s, Is, Ns, Ps, js, Ms].includes(t2.key))
|
|
return;
|
|
t2.stopPropagation(), t2.preventDefault();
|
|
const e3 = this._getChildren().filter((t3) => !l(t3));
|
|
let i2;
|
|
if ([js, Ms].includes(t2.key))
|
|
i2 = e3[t2.key === js ? 0 : e3.length - 1];
|
|
else {
|
|
const n2 = [Is, Ps].includes(t2.key);
|
|
i2 = b(e3, t2.target, n2, true);
|
|
}
|
|
i2 && (i2.focus({ preventScroll: true }), Ks.getOrCreateInstance(i2).show());
|
|
}
|
|
_getChildren() {
|
|
return z.find(qs, this._parent);
|
|
}
|
|
_getActiveElem() {
|
|
return this._getChildren().find((t2) => this._elemIsActive(t2)) || null;
|
|
}
|
|
_setInitialAttributes(t2, e3) {
|
|
this._setAttributeIfNotExists(t2, "role", "tablist");
|
|
for (const t3 of e3)
|
|
this._setInitialAttributesOnChild(t3);
|
|
}
|
|
_setInitialAttributesOnChild(t2) {
|
|
t2 = this._getInnerElement(t2);
|
|
const e3 = this._elemIsActive(t2), i2 = this._getOuterElement(t2);
|
|
t2.setAttribute("aria-selected", e3), i2 !== t2 && this._setAttributeIfNotExists(i2, "role", "presentation"), e3 || t2.setAttribute("tabindex", "-1"), this._setAttributeIfNotExists(t2, "role", "tab"), this._setInitialAttributesOnTargetPanel(t2);
|
|
}
|
|
_setInitialAttributesOnTargetPanel(t2) {
|
|
const e3 = z.getElementFromSelector(t2);
|
|
e3 && (this._setAttributeIfNotExists(e3, "role", "tabpanel"), t2.id && this._setAttributeIfNotExists(e3, "aria-labelledby", `${t2.id}`));
|
|
}
|
|
_toggleDropDown(t2, e3) {
|
|
const i2 = this._getOuterElement(t2);
|
|
if (!i2.classList.contains("dropdown"))
|
|
return;
|
|
const n2 = (t3, n3) => {
|
|
const s2 = z.findOne(t3, i2);
|
|
s2 && s2.classList.toggle(n3, e3);
|
|
};
|
|
n2(Bs, Fs), n2(".dropdown-menu", Ws), i2.setAttribute("aria-expanded", e3);
|
|
}
|
|
_setAttributeIfNotExists(t2, e3, i2) {
|
|
t2.hasAttribute(e3) || t2.setAttribute(e3, i2);
|
|
}
|
|
_elemIsActive(t2) {
|
|
return t2.classList.contains(Fs);
|
|
}
|
|
_getInnerElement(t2) {
|
|
return t2.matches(qs) ? t2 : z.findOne(qs, t2);
|
|
}
|
|
_getOuterElement(t2) {
|
|
return t2.closest(".nav-item, .list-group-item") || t2;
|
|
}
|
|
static jQueryInterface(t2) {
|
|
return this.each(function() {
|
|
const e3 = Ks.getOrCreateInstance(this);
|
|
if ("string" == typeof t2) {
|
|
if (void 0 === e3[t2] || t2.startsWith("_") || "constructor" === t2)
|
|
throw new TypeError(`No method named "${t2}"`);
|
|
e3[t2]();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
N.on(document, Ls, Rs, function(t2) {
|
|
["A", "AREA"].includes(this.tagName) && t2.preventDefault(), l(this) || Ks.getOrCreateInstance(this).show();
|
|
}), N.on(window, Ds, () => {
|
|
for (const t2 of z.find(Vs))
|
|
Ks.getOrCreateInstance(t2);
|
|
}), m2(Ks);
|
|
const Qs = ".bs.toast", Xs = `mouseover${Qs}`, Ys = `mouseout${Qs}`, Us = `focusin${Qs}`, Gs = `focusout${Qs}`, Js = `hide${Qs}`, Zs = `hidden${Qs}`, to = `show${Qs}`, eo = `shown${Qs}`, io = "hide", no = "show", so = "showing", oo = { animation: "boolean", autohide: "boolean", delay: "number" }, ro = { animation: true, autohide: true, delay: 5e3 };
|
|
class ao extends W {
|
|
constructor(t2, e3) {
|
|
super(t2, e3), this._timeout = null, this._hasMouseInteraction = false, this._hasKeyboardInteraction = false, this._setListeners();
|
|
}
|
|
static get Default() {
|
|
return ro;
|
|
}
|
|
static get DefaultType() {
|
|
return oo;
|
|
}
|
|
static get NAME() {
|
|
return "toast";
|
|
}
|
|
show() {
|
|
N.trigger(this._element, to).defaultPrevented || (this._clearTimeout(), this._config.animation && this._element.classList.add("fade"), this._element.classList.remove(io), d(this._element), this._element.classList.add(no, so), this._queueCallback(() => {
|
|
this._element.classList.remove(so), N.trigger(this._element, eo), this._maybeScheduleHide();
|
|
}, this._element, this._config.animation));
|
|
}
|
|
hide() {
|
|
this.isShown() && (N.trigger(this._element, Js).defaultPrevented || (this._element.classList.add(so), this._queueCallback(() => {
|
|
this._element.classList.add(io), this._element.classList.remove(so, no), N.trigger(this._element, Zs);
|
|
}, this._element, this._config.animation)));
|
|
}
|
|
dispose() {
|
|
this._clearTimeout(), this.isShown() && this._element.classList.remove(no), super.dispose();
|
|
}
|
|
isShown() {
|
|
return this._element.classList.contains(no);
|
|
}
|
|
_maybeScheduleHide() {
|
|
this._config.autohide && (this._hasMouseInteraction || this._hasKeyboardInteraction || (this._timeout = setTimeout(() => {
|
|
this.hide();
|
|
}, this._config.delay)));
|
|
}
|
|
_onInteraction(t2, e3) {
|
|
switch (t2.type) {
|
|
case "mouseover":
|
|
case "mouseout":
|
|
this._hasMouseInteraction = e3;
|
|
break;
|
|
case "focusin":
|
|
case "focusout":
|
|
this._hasKeyboardInteraction = e3;
|
|
}
|
|
if (e3)
|
|
return void this._clearTimeout();
|
|
const i2 = t2.relatedTarget;
|
|
this._element === i2 || this._element.contains(i2) || this._maybeScheduleHide();
|
|
}
|
|
_setListeners() {
|
|
N.on(this._element, Xs, (t2) => this._onInteraction(t2, true)), N.on(this._element, Ys, (t2) => this._onInteraction(t2, false)), N.on(this._element, Us, (t2) => this._onInteraction(t2, true)), N.on(this._element, Gs, (t2) => this._onInteraction(t2, false));
|
|
}
|
|
_clearTimeout() {
|
|
clearTimeout(this._timeout), this._timeout = null;
|
|
}
|
|
static jQueryInterface(t2) {
|
|
return this.each(function() {
|
|
const e3 = ao.getOrCreateInstance(this, t2);
|
|
if ("string" == typeof t2) {
|
|
if (void 0 === e3[t2])
|
|
throw new TypeError(`No method named "${t2}"`);
|
|
e3[t2](this);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
return R(ao), m2(ao), { Alert: Q, Button: Y2, Carousel: xt, Collapse: Bt, Dropdown: qi, Modal: On, Offcanvas: qn, Popover: us, ScrollSpy: Es, Tab: Ks, Toast: ao, Tooltip: cs };
|
|
});
|
|
}
|
|
});
|
|
|
|
// main.ts
|
|
var main_exports = {};
|
|
__export(main_exports, {
|
|
default: () => MyPlugin
|
|
});
|
|
module.exports = __toCommonJS(main_exports);
|
|
var import_obsidian = require("obsidian");
|
|
|
|
// node_modules/d3-array/src/ascending.js
|
|
function ascending(a2, b) {
|
|
return a2 == null || b == null ? NaN : a2 < b ? -1 : a2 > b ? 1 : a2 >= b ? 0 : NaN;
|
|
}
|
|
|
|
// node_modules/d3-array/src/descending.js
|
|
function descending(a2, b) {
|
|
return a2 == null || b == null ? NaN : b < a2 ? -1 : b > a2 ? 1 : b >= a2 ? 0 : NaN;
|
|
}
|
|
|
|
// node_modules/d3-array/src/bisector.js
|
|
function bisector(f) {
|
|
let compare1, compare2, delta;
|
|
if (f.length !== 2) {
|
|
compare1 = ascending;
|
|
compare2 = (d, x3) => ascending(f(d), x3);
|
|
delta = (d, x3) => f(d) - x3;
|
|
} else {
|
|
compare1 = f === ascending || f === descending ? f : zero;
|
|
compare2 = f;
|
|
delta = f;
|
|
}
|
|
function left(a2, x3, lo = 0, hi = a2.length) {
|
|
if (lo < hi) {
|
|
if (compare1(x3, x3) !== 0)
|
|
return hi;
|
|
do {
|
|
const mid = lo + hi >>> 1;
|
|
if (compare2(a2[mid], x3) < 0)
|
|
lo = mid + 1;
|
|
else
|
|
hi = mid;
|
|
} while (lo < hi);
|
|
}
|
|
return lo;
|
|
}
|
|
function right(a2, x3, lo = 0, hi = a2.length) {
|
|
if (lo < hi) {
|
|
if (compare1(x3, x3) !== 0)
|
|
return hi;
|
|
do {
|
|
const mid = lo + hi >>> 1;
|
|
if (compare2(a2[mid], x3) <= 0)
|
|
lo = mid + 1;
|
|
else
|
|
hi = mid;
|
|
} while (lo < hi);
|
|
}
|
|
return lo;
|
|
}
|
|
function center(a2, x3, lo = 0, hi = a2.length) {
|
|
const i = left(a2, x3, lo, hi - 1);
|
|
return i > lo && delta(a2[i - 1], x3) > -delta(a2[i], x3) ? i - 1 : i;
|
|
}
|
|
return { left, center, right };
|
|
}
|
|
function zero() {
|
|
return 0;
|
|
}
|
|
|
|
// node_modules/d3-array/src/number.js
|
|
function number(x3) {
|
|
return x3 === null ? NaN : +x3;
|
|
}
|
|
|
|
// node_modules/d3-array/src/bisect.js
|
|
var ascendingBisect = bisector(ascending);
|
|
var bisectRight = ascendingBisect.right;
|
|
var bisectLeft = ascendingBisect.left;
|
|
var bisectCenter = bisector(number).center;
|
|
var bisect_default = bisectRight;
|
|
|
|
// node_modules/d3-array/src/ticks.js
|
|
var e10 = Math.sqrt(50);
|
|
var e5 = Math.sqrt(10);
|
|
var e2 = Math.sqrt(2);
|
|
function tickSpec(start2, stop, count) {
|
|
const step = (stop - start2) / Math.max(0, count), power = Math.floor(Math.log10(step)), error = step / Math.pow(10, power), factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;
|
|
let i1, i2, inc;
|
|
if (power < 0) {
|
|
inc = Math.pow(10, -power) / factor;
|
|
i1 = Math.round(start2 * inc);
|
|
i2 = Math.round(stop * inc);
|
|
if (i1 / inc < start2)
|
|
++i1;
|
|
if (i2 / inc > stop)
|
|
--i2;
|
|
inc = -inc;
|
|
} else {
|
|
inc = Math.pow(10, power) * factor;
|
|
i1 = Math.round(start2 / inc);
|
|
i2 = Math.round(stop / inc);
|
|
if (i1 * inc < start2)
|
|
++i1;
|
|
if (i2 * inc > stop)
|
|
--i2;
|
|
}
|
|
if (i2 < i1 && 0.5 <= count && count < 2)
|
|
return tickSpec(start2, stop, count * 2);
|
|
return [i1, i2, inc];
|
|
}
|
|
function ticks(start2, stop, count) {
|
|
stop = +stop, start2 = +start2, count = +count;
|
|
if (!(count > 0))
|
|
return [];
|
|
if (start2 === stop)
|
|
return [start2];
|
|
const reverse = stop < start2, [i1, i2, inc] = reverse ? tickSpec(stop, start2, count) : tickSpec(start2, stop, count);
|
|
if (!(i2 >= i1))
|
|
return [];
|
|
const n = i2 - i1 + 1, ticks2 = new Array(n);
|
|
if (reverse) {
|
|
if (inc < 0)
|
|
for (let i = 0; i < n; ++i)
|
|
ticks2[i] = (i2 - i) / -inc;
|
|
else
|
|
for (let i = 0; i < n; ++i)
|
|
ticks2[i] = (i2 - i) * inc;
|
|
} else {
|
|
if (inc < 0)
|
|
for (let i = 0; i < n; ++i)
|
|
ticks2[i] = (i1 + i) / -inc;
|
|
else
|
|
for (let i = 0; i < n; ++i)
|
|
ticks2[i] = (i1 + i) * inc;
|
|
}
|
|
return ticks2;
|
|
}
|
|
function tickIncrement(start2, stop, count) {
|
|
stop = +stop, start2 = +start2, count = +count;
|
|
return tickSpec(start2, stop, count)[2];
|
|
}
|
|
function tickStep(start2, stop, count) {
|
|
stop = +stop, start2 = +start2, count = +count;
|
|
const reverse = stop < start2, inc = reverse ? tickIncrement(stop, start2, count) : tickIncrement(start2, stop, count);
|
|
return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);
|
|
}
|
|
|
|
// node_modules/d3-dispatch/src/dispatch.js
|
|
var noop = { value: () => {
|
|
} };
|
|
function dispatch() {
|
|
for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
|
|
if (!(t = arguments[i] + "") || t in _ || /[\s.]/.test(t))
|
|
throw new Error("illegal type: " + t);
|
|
_[t] = [];
|
|
}
|
|
return new Dispatch(_);
|
|
}
|
|
function Dispatch(_) {
|
|
this._ = _;
|
|
}
|
|
function parseTypenames(typenames, types) {
|
|
return typenames.trim().split(/^|\s+/).map(function(t) {
|
|
var name = "", i = t.indexOf(".");
|
|
if (i >= 0)
|
|
name = t.slice(i + 1), t = t.slice(0, i);
|
|
if (t && !types.hasOwnProperty(t))
|
|
throw new Error("unknown type: " + t);
|
|
return { type: t, name };
|
|
});
|
|
}
|
|
Dispatch.prototype = dispatch.prototype = {
|
|
constructor: Dispatch,
|
|
on: function(typename, callback) {
|
|
var _ = this._, T = parseTypenames(typename + "", _), t, i = -1, n = T.length;
|
|
if (arguments.length < 2) {
|
|
while (++i < n)
|
|
if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name)))
|
|
return t;
|
|
return;
|
|
}
|
|
if (callback != null && typeof callback !== "function")
|
|
throw new Error("invalid callback: " + callback);
|
|
while (++i < n) {
|
|
if (t = (typename = T[i]).type)
|
|
_[t] = set(_[t], typename.name, callback);
|
|
else if (callback == null)
|
|
for (t in _)
|
|
_[t] = set(_[t], typename.name, null);
|
|
}
|
|
return this;
|
|
},
|
|
copy: function() {
|
|
var copy2 = {}, _ = this._;
|
|
for (var t in _)
|
|
copy2[t] = _[t].slice();
|
|
return new Dispatch(copy2);
|
|
},
|
|
call: function(type2, that) {
|
|
if ((n = arguments.length - 2) > 0)
|
|
for (var args = new Array(n), i = 0, n, t; i < n; ++i)
|
|
args[i] = arguments[i + 2];
|
|
if (!this._.hasOwnProperty(type2))
|
|
throw new Error("unknown type: " + type2);
|
|
for (t = this._[type2], i = 0, n = t.length; i < n; ++i)
|
|
t[i].value.apply(that, args);
|
|
},
|
|
apply: function(type2, that, args) {
|
|
if (!this._.hasOwnProperty(type2))
|
|
throw new Error("unknown type: " + type2);
|
|
for (var t = this._[type2], i = 0, n = t.length; i < n; ++i)
|
|
t[i].value.apply(that, args);
|
|
}
|
|
};
|
|
function get(type2, name) {
|
|
for (var i = 0, n = type2.length, c2; i < n; ++i) {
|
|
if ((c2 = type2[i]).name === name) {
|
|
return c2.value;
|
|
}
|
|
}
|
|
}
|
|
function set(type2, name, callback) {
|
|
for (var i = 0, n = type2.length; i < n; ++i) {
|
|
if (type2[i].name === name) {
|
|
type2[i] = noop, type2 = type2.slice(0, i).concat(type2.slice(i + 1));
|
|
break;
|
|
}
|
|
}
|
|
if (callback != null)
|
|
type2.push({ name, value: callback });
|
|
return type2;
|
|
}
|
|
var dispatch_default = dispatch;
|
|
|
|
// node_modules/d3-selection/src/namespaces.js
|
|
var xhtml = "http://www.w3.org/1999/xhtml";
|
|
var namespaces_default = {
|
|
svg: "http://www.w3.org/2000/svg",
|
|
xhtml,
|
|
xlink: "http://www.w3.org/1999/xlink",
|
|
xml: "http://www.w3.org/XML/1998/namespace",
|
|
xmlns: "http://www.w3.org/2000/xmlns/"
|
|
};
|
|
|
|
// node_modules/d3-selection/src/namespace.js
|
|
function namespace_default(name) {
|
|
var prefix = name += "", i = prefix.indexOf(":");
|
|
if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns")
|
|
name = name.slice(i + 1);
|
|
return namespaces_default.hasOwnProperty(prefix) ? { space: namespaces_default[prefix], local: name } : name;
|
|
}
|
|
|
|
// node_modules/d3-selection/src/creator.js
|
|
function creatorInherit(name) {
|
|
return function() {
|
|
var document2 = this.ownerDocument, uri = this.namespaceURI;
|
|
return uri === xhtml && document2.documentElement.namespaceURI === xhtml ? document2.createElement(name) : document2.createElementNS(uri, name);
|
|
};
|
|
}
|
|
function creatorFixed(fullname) {
|
|
return function() {
|
|
return this.ownerDocument.createElementNS(fullname.space, fullname.local);
|
|
};
|
|
}
|
|
function creator_default(name) {
|
|
var fullname = namespace_default(name);
|
|
return (fullname.local ? creatorFixed : creatorInherit)(fullname);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selector.js
|
|
function none() {
|
|
}
|
|
function selector_default(selector) {
|
|
return selector == null ? none : function() {
|
|
return this.querySelector(selector);
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/select.js
|
|
function select_default(select) {
|
|
if (typeof select !== "function")
|
|
select = selector_default(select);
|
|
for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) {
|
|
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
|
|
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
|
|
if ("__data__" in node)
|
|
subnode.__data__ = node.__data__;
|
|
subgroup[i] = subnode;
|
|
}
|
|
}
|
|
}
|
|
return new Selection(subgroups, this._parents);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/array.js
|
|
function array(x3) {
|
|
return x3 == null ? [] : Array.isArray(x3) ? x3 : Array.from(x3);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selectorAll.js
|
|
function empty() {
|
|
return [];
|
|
}
|
|
function selectorAll_default(selector) {
|
|
return selector == null ? empty : function() {
|
|
return this.querySelectorAll(selector);
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/selectAll.js
|
|
function arrayAll(select) {
|
|
return function() {
|
|
return array(select.apply(this, arguments));
|
|
};
|
|
}
|
|
function selectAll_default(select) {
|
|
if (typeof select === "function")
|
|
select = arrayAll(select);
|
|
else
|
|
select = selectorAll_default(select);
|
|
for (var groups = this._groups, m2 = groups.length, subgroups = [], parents = [], j = 0; j < m2; ++j) {
|
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
|
|
if (node = group[i]) {
|
|
subgroups.push(select.call(node, node.__data__, i, group));
|
|
parents.push(node);
|
|
}
|
|
}
|
|
}
|
|
return new Selection(subgroups, parents);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/matcher.js
|
|
function matcher_default(selector) {
|
|
return function() {
|
|
return this.matches(selector);
|
|
};
|
|
}
|
|
function childMatcher(selector) {
|
|
return function(node) {
|
|
return node.matches(selector);
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/selectChild.js
|
|
var find = Array.prototype.find;
|
|
function childFind(match) {
|
|
return function() {
|
|
return find.call(this.children, match);
|
|
};
|
|
}
|
|
function childFirst() {
|
|
return this.firstElementChild;
|
|
}
|
|
function selectChild_default(match) {
|
|
return this.select(match == null ? childFirst : childFind(typeof match === "function" ? match : childMatcher(match)));
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/selectChildren.js
|
|
var filter = Array.prototype.filter;
|
|
function children() {
|
|
return Array.from(this.children);
|
|
}
|
|
function childrenFilter(match) {
|
|
return function() {
|
|
return filter.call(this.children, match);
|
|
};
|
|
}
|
|
function selectChildren_default(match) {
|
|
return this.selectAll(match == null ? children : childrenFilter(typeof match === "function" ? match : childMatcher(match)));
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/filter.js
|
|
function filter_default(match) {
|
|
if (typeof match !== "function")
|
|
match = matcher_default(match);
|
|
for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) {
|
|
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
|
|
if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
|
|
subgroup.push(node);
|
|
}
|
|
}
|
|
}
|
|
return new Selection(subgroups, this._parents);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/sparse.js
|
|
function sparse_default(update) {
|
|
return new Array(update.length);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/enter.js
|
|
function enter_default() {
|
|
return new Selection(this._enter || this._groups.map(sparse_default), this._parents);
|
|
}
|
|
function EnterNode(parent, datum2) {
|
|
this.ownerDocument = parent.ownerDocument;
|
|
this.namespaceURI = parent.namespaceURI;
|
|
this._next = null;
|
|
this._parent = parent;
|
|
this.__data__ = datum2;
|
|
}
|
|
EnterNode.prototype = {
|
|
constructor: EnterNode,
|
|
appendChild: function(child) {
|
|
return this._parent.insertBefore(child, this._next);
|
|
},
|
|
insertBefore: function(child, next) {
|
|
return this._parent.insertBefore(child, next);
|
|
},
|
|
querySelector: function(selector) {
|
|
return this._parent.querySelector(selector);
|
|
},
|
|
querySelectorAll: function(selector) {
|
|
return this._parent.querySelectorAll(selector);
|
|
}
|
|
};
|
|
|
|
// node_modules/d3-selection/src/constant.js
|
|
function constant_default(x3) {
|
|
return function() {
|
|
return x3;
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/data.js
|
|
function bindIndex(parent, group, enter, update, exit, data) {
|
|
var i = 0, node, groupLength = group.length, dataLength = data.length;
|
|
for (; i < dataLength; ++i) {
|
|
if (node = group[i]) {
|
|
node.__data__ = data[i];
|
|
update[i] = node;
|
|
} else {
|
|
enter[i] = new EnterNode(parent, data[i]);
|
|
}
|
|
}
|
|
for (; i < groupLength; ++i) {
|
|
if (node = group[i]) {
|
|
exit[i] = node;
|
|
}
|
|
}
|
|
}
|
|
function bindKey(parent, group, enter, update, exit, data, key) {
|
|
var i, node, nodeByKeyValue = /* @__PURE__ */ new Map(), groupLength = group.length, dataLength = data.length, keyValues = new Array(groupLength), keyValue;
|
|
for (i = 0; i < groupLength; ++i) {
|
|
if (node = group[i]) {
|
|
keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + "";
|
|
if (nodeByKeyValue.has(keyValue)) {
|
|
exit[i] = node;
|
|
} else {
|
|
nodeByKeyValue.set(keyValue, node);
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; i < dataLength; ++i) {
|
|
keyValue = key.call(parent, data[i], i, data) + "";
|
|
if (node = nodeByKeyValue.get(keyValue)) {
|
|
update[i] = node;
|
|
node.__data__ = data[i];
|
|
nodeByKeyValue.delete(keyValue);
|
|
} else {
|
|
enter[i] = new EnterNode(parent, data[i]);
|
|
}
|
|
}
|
|
for (i = 0; i < groupLength; ++i) {
|
|
if ((node = group[i]) && nodeByKeyValue.get(keyValues[i]) === node) {
|
|
exit[i] = node;
|
|
}
|
|
}
|
|
}
|
|
function datum(node) {
|
|
return node.__data__;
|
|
}
|
|
function data_default(value, key) {
|
|
if (!arguments.length)
|
|
return Array.from(this, datum);
|
|
var bind = key ? bindKey : bindIndex, parents = this._parents, groups = this._groups;
|
|
if (typeof value !== "function")
|
|
value = constant_default(value);
|
|
for (var m2 = groups.length, update = new Array(m2), enter = new Array(m2), exit = new Array(m2), j = 0; j < m2; ++j) {
|
|
var parent = parents[j], group = groups[j], groupLength = group.length, data = arraylike(value.call(parent, parent && parent.__data__, j, parents)), dataLength = data.length, enterGroup = enter[j] = new Array(dataLength), updateGroup = update[j] = new Array(dataLength), exitGroup = exit[j] = new Array(groupLength);
|
|
bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
|
|
for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
|
|
if (previous = enterGroup[i0]) {
|
|
if (i0 >= i1)
|
|
i1 = i0 + 1;
|
|
while (!(next = updateGroup[i1]) && ++i1 < dataLength)
|
|
;
|
|
previous._next = next || null;
|
|
}
|
|
}
|
|
}
|
|
update = new Selection(update, parents);
|
|
update._enter = enter;
|
|
update._exit = exit;
|
|
return update;
|
|
}
|
|
function arraylike(data) {
|
|
return typeof data === "object" && "length" in data ? data : Array.from(data);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/exit.js
|
|
function exit_default() {
|
|
return new Selection(this._exit || this._groups.map(sparse_default), this._parents);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/join.js
|
|
function join_default(onenter, onupdate, onexit) {
|
|
var enter = this.enter(), update = this, exit = this.exit();
|
|
if (typeof onenter === "function") {
|
|
enter = onenter(enter);
|
|
if (enter)
|
|
enter = enter.selection();
|
|
} else {
|
|
enter = enter.append(onenter + "");
|
|
}
|
|
if (onupdate != null) {
|
|
update = onupdate(update);
|
|
if (update)
|
|
update = update.selection();
|
|
}
|
|
if (onexit == null)
|
|
exit.remove();
|
|
else
|
|
onexit(exit);
|
|
return enter && update ? enter.merge(update).order() : update;
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/merge.js
|
|
function merge_default(context) {
|
|
var selection2 = context.selection ? context.selection() : context;
|
|
for (var groups0 = this._groups, groups1 = selection2._groups, m0 = groups0.length, m1 = groups1.length, m2 = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m2; ++j) {
|
|
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
|
|
if (node = group0[i] || group1[i]) {
|
|
merge[i] = node;
|
|
}
|
|
}
|
|
}
|
|
for (; j < m0; ++j) {
|
|
merges[j] = groups0[j];
|
|
}
|
|
return new Selection(merges, this._parents);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/order.js
|
|
function order_default() {
|
|
for (var groups = this._groups, j = -1, m2 = groups.length; ++j < m2; ) {
|
|
for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {
|
|
if (node = group[i]) {
|
|
if (next && node.compareDocumentPosition(next) ^ 4)
|
|
next.parentNode.insertBefore(node, next);
|
|
next = node;
|
|
}
|
|
}
|
|
}
|
|
return this;
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/sort.js
|
|
function sort_default(compare) {
|
|
if (!compare)
|
|
compare = ascending2;
|
|
function compareNode(a2, b) {
|
|
return a2 && b ? compare(a2.__data__, b.__data__) : !a2 - !b;
|
|
}
|
|
for (var groups = this._groups, m2 = groups.length, sortgroups = new Array(m2), j = 0; j < m2; ++j) {
|
|
for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
|
|
if (node = group[i]) {
|
|
sortgroup[i] = node;
|
|
}
|
|
}
|
|
sortgroup.sort(compareNode);
|
|
}
|
|
return new Selection(sortgroups, this._parents).order();
|
|
}
|
|
function ascending2(a2, b) {
|
|
return a2 < b ? -1 : a2 > b ? 1 : a2 >= b ? 0 : NaN;
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/call.js
|
|
function call_default() {
|
|
var callback = arguments[0];
|
|
arguments[0] = this;
|
|
callback.apply(null, arguments);
|
|
return this;
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/nodes.js
|
|
function nodes_default() {
|
|
return Array.from(this);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/node.js
|
|
function node_default() {
|
|
for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) {
|
|
for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
|
|
var node = group[i];
|
|
if (node)
|
|
return node;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/size.js
|
|
function size_default() {
|
|
let size = 0;
|
|
for (const node of this)
|
|
++size;
|
|
return size;
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/empty.js
|
|
function empty_default() {
|
|
return !this.node();
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/each.js
|
|
function each_default(callback) {
|
|
for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) {
|
|
for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
|
|
if (node = group[i])
|
|
callback.call(node, node.__data__, i, group);
|
|
}
|
|
}
|
|
return this;
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/attr.js
|
|
function attrRemove(name) {
|
|
return function() {
|
|
this.removeAttribute(name);
|
|
};
|
|
}
|
|
function attrRemoveNS(fullname) {
|
|
return function() {
|
|
this.removeAttributeNS(fullname.space, fullname.local);
|
|
};
|
|
}
|
|
function attrConstant(name, value) {
|
|
return function() {
|
|
this.setAttribute(name, value);
|
|
};
|
|
}
|
|
function attrConstantNS(fullname, value) {
|
|
return function() {
|
|
this.setAttributeNS(fullname.space, fullname.local, value);
|
|
};
|
|
}
|
|
function attrFunction(name, value) {
|
|
return function() {
|
|
var v = value.apply(this, arguments);
|
|
if (v == null)
|
|
this.removeAttribute(name);
|
|
else
|
|
this.setAttribute(name, v);
|
|
};
|
|
}
|
|
function attrFunctionNS(fullname, value) {
|
|
return function() {
|
|
var v = value.apply(this, arguments);
|
|
if (v == null)
|
|
this.removeAttributeNS(fullname.space, fullname.local);
|
|
else
|
|
this.setAttributeNS(fullname.space, fullname.local, v);
|
|
};
|
|
}
|
|
function attr_default(name, value) {
|
|
var fullname = namespace_default(name);
|
|
if (arguments.length < 2) {
|
|
var node = this.node();
|
|
return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname);
|
|
}
|
|
return this.each((value == null ? fullname.local ? attrRemoveNS : attrRemove : typeof value === "function" ? fullname.local ? attrFunctionNS : attrFunction : fullname.local ? attrConstantNS : attrConstant)(fullname, value));
|
|
}
|
|
|
|
// node_modules/d3-selection/src/window.js
|
|
function window_default(node) {
|
|
return node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView;
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/style.js
|
|
function styleRemove(name) {
|
|
return function() {
|
|
this.style.removeProperty(name);
|
|
};
|
|
}
|
|
function styleConstant(name, value, priority) {
|
|
return function() {
|
|
this.style.setProperty(name, value, priority);
|
|
};
|
|
}
|
|
function styleFunction(name, value, priority) {
|
|
return function() {
|
|
var v = value.apply(this, arguments);
|
|
if (v == null)
|
|
this.style.removeProperty(name);
|
|
else
|
|
this.style.setProperty(name, v, priority);
|
|
};
|
|
}
|
|
function style_default(name, value, priority) {
|
|
return arguments.length > 1 ? this.each((value == null ? styleRemove : typeof value === "function" ? styleFunction : styleConstant)(name, value, priority == null ? "" : priority)) : styleValue(this.node(), name);
|
|
}
|
|
function styleValue(node, name) {
|
|
return node.style.getPropertyValue(name) || window_default(node).getComputedStyle(node, null).getPropertyValue(name);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/property.js
|
|
function propertyRemove(name) {
|
|
return function() {
|
|
delete this[name];
|
|
};
|
|
}
|
|
function propertyConstant(name, value) {
|
|
return function() {
|
|
this[name] = value;
|
|
};
|
|
}
|
|
function propertyFunction(name, value) {
|
|
return function() {
|
|
var v = value.apply(this, arguments);
|
|
if (v == null)
|
|
delete this[name];
|
|
else
|
|
this[name] = v;
|
|
};
|
|
}
|
|
function property_default(name, value) {
|
|
return arguments.length > 1 ? this.each((value == null ? propertyRemove : typeof value === "function" ? propertyFunction : propertyConstant)(name, value)) : this.node()[name];
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/classed.js
|
|
function classArray(string) {
|
|
return string.trim().split(/^|\s+/);
|
|
}
|
|
function classList(node) {
|
|
return node.classList || new ClassList(node);
|
|
}
|
|
function ClassList(node) {
|
|
this._node = node;
|
|
this._names = classArray(node.getAttribute("class") || "");
|
|
}
|
|
ClassList.prototype = {
|
|
add: function(name) {
|
|
var i = this._names.indexOf(name);
|
|
if (i < 0) {
|
|
this._names.push(name);
|
|
this._node.setAttribute("class", this._names.join(" "));
|
|
}
|
|
},
|
|
remove: function(name) {
|
|
var i = this._names.indexOf(name);
|
|
if (i >= 0) {
|
|
this._names.splice(i, 1);
|
|
this._node.setAttribute("class", this._names.join(" "));
|
|
}
|
|
},
|
|
contains: function(name) {
|
|
return this._names.indexOf(name) >= 0;
|
|
}
|
|
};
|
|
function classedAdd(node, names) {
|
|
var list = classList(node), i = -1, n = names.length;
|
|
while (++i < n)
|
|
list.add(names[i]);
|
|
}
|
|
function classedRemove(node, names) {
|
|
var list = classList(node), i = -1, n = names.length;
|
|
while (++i < n)
|
|
list.remove(names[i]);
|
|
}
|
|
function classedTrue(names) {
|
|
return function() {
|
|
classedAdd(this, names);
|
|
};
|
|
}
|
|
function classedFalse(names) {
|
|
return function() {
|
|
classedRemove(this, names);
|
|
};
|
|
}
|
|
function classedFunction(names, value) {
|
|
return function() {
|
|
(value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
|
|
};
|
|
}
|
|
function classed_default(name, value) {
|
|
var names = classArray(name + "");
|
|
if (arguments.length < 2) {
|
|
var list = classList(this.node()), i = -1, n = names.length;
|
|
while (++i < n)
|
|
if (!list.contains(names[i]))
|
|
return false;
|
|
return true;
|
|
}
|
|
return this.each((typeof value === "function" ? classedFunction : value ? classedTrue : classedFalse)(names, value));
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/text.js
|
|
function textRemove() {
|
|
this.textContent = "";
|
|
}
|
|
function textConstant(value) {
|
|
return function() {
|
|
this.textContent = value;
|
|
};
|
|
}
|
|
function textFunction(value) {
|
|
return function() {
|
|
var v = value.apply(this, arguments);
|
|
this.textContent = v == null ? "" : v;
|
|
};
|
|
}
|
|
function text_default(value) {
|
|
return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" ? textFunction : textConstant)(value)) : this.node().textContent;
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/html.js
|
|
function htmlRemove() {
|
|
this.innerHTML = "";
|
|
}
|
|
function htmlConstant(value) {
|
|
return function() {
|
|
this.innerHTML = value;
|
|
};
|
|
}
|
|
function htmlFunction(value) {
|
|
return function() {
|
|
var v = value.apply(this, arguments);
|
|
this.innerHTML = v == null ? "" : v;
|
|
};
|
|
}
|
|
function html_default(value) {
|
|
return arguments.length ? this.each(value == null ? htmlRemove : (typeof value === "function" ? htmlFunction : htmlConstant)(value)) : this.node().innerHTML;
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/raise.js
|
|
function raise() {
|
|
if (this.nextSibling)
|
|
this.parentNode.appendChild(this);
|
|
}
|
|
function raise_default() {
|
|
return this.each(raise);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/lower.js
|
|
function lower() {
|
|
if (this.previousSibling)
|
|
this.parentNode.insertBefore(this, this.parentNode.firstChild);
|
|
}
|
|
function lower_default() {
|
|
return this.each(lower);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/append.js
|
|
function append_default(name) {
|
|
var create2 = typeof name === "function" ? name : creator_default(name);
|
|
return this.select(function() {
|
|
return this.appendChild(create2.apply(this, arguments));
|
|
});
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/insert.js
|
|
function constantNull() {
|
|
return null;
|
|
}
|
|
function insert_default(name, before) {
|
|
var create2 = typeof name === "function" ? name : creator_default(name), select = before == null ? constantNull : typeof before === "function" ? before : selector_default(before);
|
|
return this.select(function() {
|
|
return this.insertBefore(create2.apply(this, arguments), select.apply(this, arguments) || null);
|
|
});
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/remove.js
|
|
function remove() {
|
|
var parent = this.parentNode;
|
|
if (parent)
|
|
parent.removeChild(this);
|
|
}
|
|
function remove_default() {
|
|
return this.each(remove);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/clone.js
|
|
function selection_cloneShallow() {
|
|
var clone = this.cloneNode(false), parent = this.parentNode;
|
|
return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
|
|
}
|
|
function selection_cloneDeep() {
|
|
var clone = this.cloneNode(true), parent = this.parentNode;
|
|
return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
|
|
}
|
|
function clone_default(deep) {
|
|
return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/datum.js
|
|
function datum_default(value) {
|
|
return arguments.length ? this.property("__data__", value) : this.node().__data__;
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/on.js
|
|
function contextListener(listener) {
|
|
return function(event) {
|
|
listener.call(this, event, this.__data__);
|
|
};
|
|
}
|
|
function parseTypenames2(typenames) {
|
|
return typenames.trim().split(/^|\s+/).map(function(t) {
|
|
var name = "", i = t.indexOf(".");
|
|
if (i >= 0)
|
|
name = t.slice(i + 1), t = t.slice(0, i);
|
|
return { type: t, name };
|
|
});
|
|
}
|
|
function onRemove(typename) {
|
|
return function() {
|
|
var on = this.__on;
|
|
if (!on)
|
|
return;
|
|
for (var j = 0, i = -1, m2 = on.length, o; j < m2; ++j) {
|
|
if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
|
|
this.removeEventListener(o.type, o.listener, o.options);
|
|
} else {
|
|
on[++i] = o;
|
|
}
|
|
}
|
|
if (++i)
|
|
on.length = i;
|
|
else
|
|
delete this.__on;
|
|
};
|
|
}
|
|
function onAdd(typename, value, options) {
|
|
return function() {
|
|
var on = this.__on, o, listener = contextListener(value);
|
|
if (on)
|
|
for (var j = 0, m2 = on.length; j < m2; ++j) {
|
|
if ((o = on[j]).type === typename.type && o.name === typename.name) {
|
|
this.removeEventListener(o.type, o.listener, o.options);
|
|
this.addEventListener(o.type, o.listener = listener, o.options = options);
|
|
o.value = value;
|
|
return;
|
|
}
|
|
}
|
|
this.addEventListener(typename.type, listener, options);
|
|
o = { type: typename.type, name: typename.name, value, listener, options };
|
|
if (!on)
|
|
this.__on = [o];
|
|
else
|
|
on.push(o);
|
|
};
|
|
}
|
|
function on_default(typename, value, options) {
|
|
var typenames = parseTypenames2(typename + ""), i, n = typenames.length, t;
|
|
if (arguments.length < 2) {
|
|
var on = this.node().__on;
|
|
if (on)
|
|
for (var j = 0, m2 = on.length, o; j < m2; ++j) {
|
|
for (i = 0, o = on[j]; i < n; ++i) {
|
|
if ((t = typenames[i]).type === o.type && t.name === o.name) {
|
|
return o.value;
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
on = value ? onAdd : onRemove;
|
|
for (i = 0; i < n; ++i)
|
|
this.each(on(typenames[i], value, options));
|
|
return this;
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/dispatch.js
|
|
function dispatchEvent(node, type2, params) {
|
|
var window2 = window_default(node), event = window2.CustomEvent;
|
|
if (typeof event === "function") {
|
|
event = new event(type2, params);
|
|
} else {
|
|
event = window2.document.createEvent("Event");
|
|
if (params)
|
|
event.initEvent(type2, params.bubbles, params.cancelable), event.detail = params.detail;
|
|
else
|
|
event.initEvent(type2, false, false);
|
|
}
|
|
node.dispatchEvent(event);
|
|
}
|
|
function dispatchConstant(type2, params) {
|
|
return function() {
|
|
return dispatchEvent(this, type2, params);
|
|
};
|
|
}
|
|
function dispatchFunction(type2, params) {
|
|
return function() {
|
|
return dispatchEvent(this, type2, params.apply(this, arguments));
|
|
};
|
|
}
|
|
function dispatch_default2(type2, params) {
|
|
return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type2, params));
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/iterator.js
|
|
function* iterator_default() {
|
|
for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) {
|
|
for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
|
|
if (node = group[i])
|
|
yield node;
|
|
}
|
|
}
|
|
}
|
|
|
|
// node_modules/d3-selection/src/selection/index.js
|
|
var root = [null];
|
|
function Selection(groups, parents) {
|
|
this._groups = groups;
|
|
this._parents = parents;
|
|
}
|
|
function selection() {
|
|
return new Selection([[document.documentElement]], root);
|
|
}
|
|
function selection_selection() {
|
|
return this;
|
|
}
|
|
Selection.prototype = selection.prototype = {
|
|
constructor: Selection,
|
|
select: select_default,
|
|
selectAll: selectAll_default,
|
|
selectChild: selectChild_default,
|
|
selectChildren: selectChildren_default,
|
|
filter: filter_default,
|
|
data: data_default,
|
|
enter: enter_default,
|
|
exit: exit_default,
|
|
join: join_default,
|
|
merge: merge_default,
|
|
selection: selection_selection,
|
|
order: order_default,
|
|
sort: sort_default,
|
|
call: call_default,
|
|
nodes: nodes_default,
|
|
node: node_default,
|
|
size: size_default,
|
|
empty: empty_default,
|
|
each: each_default,
|
|
attr: attr_default,
|
|
style: style_default,
|
|
property: property_default,
|
|
classed: classed_default,
|
|
text: text_default,
|
|
html: html_default,
|
|
raise: raise_default,
|
|
lower: lower_default,
|
|
append: append_default,
|
|
insert: insert_default,
|
|
remove: remove_default,
|
|
clone: clone_default,
|
|
datum: datum_default,
|
|
on: on_default,
|
|
dispatch: dispatch_default2,
|
|
[Symbol.iterator]: iterator_default
|
|
};
|
|
var selection_default = selection;
|
|
|
|
// node_modules/d3-selection/src/select.js
|
|
function select_default2(selector) {
|
|
return typeof selector === "string" ? new Selection([[document.querySelector(selector)]], [document.documentElement]) : new Selection([[selector]], root);
|
|
}
|
|
|
|
// node_modules/d3-selection/src/sourceEvent.js
|
|
function sourceEvent_default(event) {
|
|
let sourceEvent;
|
|
while (sourceEvent = event.sourceEvent)
|
|
event = sourceEvent;
|
|
return event;
|
|
}
|
|
|
|
// node_modules/d3-selection/src/pointer.js
|
|
function pointer_default(event, node) {
|
|
event = sourceEvent_default(event);
|
|
if (node === void 0)
|
|
node = event.currentTarget;
|
|
if (node) {
|
|
var svg = node.ownerSVGElement || node;
|
|
if (svg.createSVGPoint) {
|
|
var point = svg.createSVGPoint();
|
|
point.x = event.clientX, point.y = event.clientY;
|
|
point = point.matrixTransform(node.getScreenCTM().inverse());
|
|
return [point.x, point.y];
|
|
}
|
|
if (node.getBoundingClientRect) {
|
|
var rect = node.getBoundingClientRect();
|
|
return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
|
|
}
|
|
}
|
|
return [event.pageX, event.pageY];
|
|
}
|
|
|
|
// node_modules/d3-drag/src/noevent.js
|
|
var nonpassive = { passive: false };
|
|
var nonpassivecapture = { capture: true, passive: false };
|
|
function nopropagation(event) {
|
|
event.stopImmediatePropagation();
|
|
}
|
|
function noevent_default(event) {
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
}
|
|
|
|
// node_modules/d3-drag/src/nodrag.js
|
|
function nodrag_default(view) {
|
|
var root2 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", noevent_default, nonpassivecapture);
|
|
if ("onselectstart" in root2) {
|
|
selection2.on("selectstart.drag", noevent_default, nonpassivecapture);
|
|
} else {
|
|
root2.__noselect = root2.style.MozUserSelect;
|
|
root2.style.MozUserSelect = "none";
|
|
}
|
|
}
|
|
function yesdrag(view, noclick) {
|
|
var root2 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", null);
|
|
if (noclick) {
|
|
selection2.on("click.drag", noevent_default, nonpassivecapture);
|
|
setTimeout(function() {
|
|
selection2.on("click.drag", null);
|
|
}, 0);
|
|
}
|
|
if ("onselectstart" in root2) {
|
|
selection2.on("selectstart.drag", null);
|
|
} else {
|
|
root2.style.MozUserSelect = root2.__noselect;
|
|
delete root2.__noselect;
|
|
}
|
|
}
|
|
|
|
// node_modules/d3-drag/src/constant.js
|
|
var constant_default2 = (x3) => () => x3;
|
|
|
|
// node_modules/d3-drag/src/event.js
|
|
function DragEvent(type2, {
|
|
sourceEvent,
|
|
subject,
|
|
target,
|
|
identifier,
|
|
active,
|
|
x: x3,
|
|
y: y3,
|
|
dx,
|
|
dy,
|
|
dispatch: dispatch2
|
|
}) {
|
|
Object.defineProperties(this, {
|
|
type: { value: type2, enumerable: true, configurable: true },
|
|
sourceEvent: { value: sourceEvent, enumerable: true, configurable: true },
|
|
subject: { value: subject, enumerable: true, configurable: true },
|
|
target: { value: target, enumerable: true, configurable: true },
|
|
identifier: { value: identifier, enumerable: true, configurable: true },
|
|
active: { value: active, enumerable: true, configurable: true },
|
|
x: { value: x3, enumerable: true, configurable: true },
|
|
y: { value: y3, enumerable: true, configurable: true },
|
|
dx: { value: dx, enumerable: true, configurable: true },
|
|
dy: { value: dy, enumerable: true, configurable: true },
|
|
_: { value: dispatch2 }
|
|
});
|
|
}
|
|
DragEvent.prototype.on = function() {
|
|
var value = this._.on.apply(this._, arguments);
|
|
return value === this._ ? this : value;
|
|
};
|
|
|
|
// node_modules/d3-drag/src/drag.js
|
|
function defaultFilter(event) {
|
|
return !event.ctrlKey && !event.button;
|
|
}
|
|
function defaultContainer() {
|
|
return this.parentNode;
|
|
}
|
|
function defaultSubject(event, d) {
|
|
return d == null ? { x: event.x, y: event.y } : d;
|
|
}
|
|
function defaultTouchable() {
|
|
return navigator.maxTouchPoints || "ontouchstart" in this;
|
|
}
|
|
function drag_default() {
|
|
var filter2 = defaultFilter, container = defaultContainer, subject = defaultSubject, touchable = defaultTouchable, gestures = {}, listeners = dispatch_default("start", "drag", "end"), active = 0, mousedownx, mousedowny, mousemoving, touchending, clickDistance2 = 0;
|
|
function drag(selection2) {
|
|
selection2.on("mousedown.drag", mousedowned).filter(touchable).on("touchstart.drag", touchstarted).on("touchmove.drag", touchmoved, nonpassive).on("touchend.drag touchcancel.drag", touchended).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
|
|
}
|
|
function mousedowned(event, d) {
|
|
if (touchending || !filter2.call(this, event, d))
|
|
return;
|
|
var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse");
|
|
if (!gesture)
|
|
return;
|
|
select_default2(event.view).on("mousemove.drag", mousemoved, nonpassivecapture).on("mouseup.drag", mouseupped, nonpassivecapture);
|
|
nodrag_default(event.view);
|
|
nopropagation(event);
|
|
mousemoving = false;
|
|
mousedownx = event.clientX;
|
|
mousedowny = event.clientY;
|
|
gesture("start", event);
|
|
}
|
|
function mousemoved(event) {
|
|
noevent_default(event);
|
|
if (!mousemoving) {
|
|
var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
|
|
mousemoving = dx * dx + dy * dy > clickDistance2;
|
|
}
|
|
gestures.mouse("drag", event);
|
|
}
|
|
function mouseupped(event) {
|
|
select_default2(event.view).on("mousemove.drag mouseup.drag", null);
|
|
yesdrag(event.view, mousemoving);
|
|
noevent_default(event);
|
|
gestures.mouse("end", event);
|
|
}
|
|
function touchstarted(event, d) {
|
|
if (!filter2.call(this, event, d))
|
|
return;
|
|
var touches = event.changedTouches, c2 = container.call(this, event, d), n = touches.length, i, gesture;
|
|
for (i = 0; i < n; ++i) {
|
|
if (gesture = beforestart(this, c2, event, d, touches[i].identifier, touches[i])) {
|
|
nopropagation(event);
|
|
gesture("start", event, touches[i]);
|
|
}
|
|
}
|
|
}
|
|
function touchmoved(event) {
|
|
var touches = event.changedTouches, n = touches.length, i, gesture;
|
|
for (i = 0; i < n; ++i) {
|
|
if (gesture = gestures[touches[i].identifier]) {
|
|
noevent_default(event);
|
|
gesture("drag", event, touches[i]);
|
|
}
|
|
}
|
|
}
|
|
function touchended(event) {
|
|
var touches = event.changedTouches, n = touches.length, i, gesture;
|
|
if (touchending)
|
|
clearTimeout(touchending);
|
|
touchending = setTimeout(function() {
|
|
touchending = null;
|
|
}, 500);
|
|
for (i = 0; i < n; ++i) {
|
|
if (gesture = gestures[touches[i].identifier]) {
|
|
nopropagation(event);
|
|
gesture("end", event, touches[i]);
|
|
}
|
|
}
|
|
}
|
|
function beforestart(that, container2, event, d, identifier, touch) {
|
|
var dispatch2 = listeners.copy(), p = pointer_default(touch || event, container2), dx, dy, s;
|
|
if ((s = subject.call(that, new DragEvent("beforestart", {
|
|
sourceEvent: event,
|
|
target: drag,
|
|
identifier,
|
|
active,
|
|
x: p[0],
|
|
y: p[1],
|
|
dx: 0,
|
|
dy: 0,
|
|
dispatch: dispatch2
|
|
}), d)) == null)
|
|
return;
|
|
dx = s.x - p[0] || 0;
|
|
dy = s.y - p[1] || 0;
|
|
return function gesture(type2, event2, touch2) {
|
|
var p0 = p, n;
|
|
switch (type2) {
|
|
case "start":
|
|
gestures[identifier] = gesture, n = active++;
|
|
break;
|
|
case "end":
|
|
delete gestures[identifier], --active;
|
|
case "drag":
|
|
p = pointer_default(touch2 || event2, container2), n = active;
|
|
break;
|
|
}
|
|
dispatch2.call(
|
|
type2,
|
|
that,
|
|
new DragEvent(type2, {
|
|
sourceEvent: event2,
|
|
subject: s,
|
|
target: drag,
|
|
identifier,
|
|
active: n,
|
|
x: p[0] + dx,
|
|
y: p[1] + dy,
|
|
dx: p[0] - p0[0],
|
|
dy: p[1] - p0[1],
|
|
dispatch: dispatch2
|
|
}),
|
|
d
|
|
);
|
|
};
|
|
}
|
|
drag.filter = function(_) {
|
|
return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default2(!!_), drag) : filter2;
|
|
};
|
|
drag.container = function(_) {
|
|
return arguments.length ? (container = typeof _ === "function" ? _ : constant_default2(_), drag) : container;
|
|
};
|
|
drag.subject = function(_) {
|
|
return arguments.length ? (subject = typeof _ === "function" ? _ : constant_default2(_), drag) : subject;
|
|
};
|
|
drag.touchable = function(_) {
|
|
return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default2(!!_), drag) : touchable;
|
|
};
|
|
drag.on = function() {
|
|
var value = listeners.on.apply(listeners, arguments);
|
|
return value === listeners ? drag : value;
|
|
};
|
|
drag.clickDistance = function(_) {
|
|
return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
|
|
};
|
|
return drag;
|
|
}
|
|
|
|
// node_modules/d3-color/src/define.js
|
|
function define_default(constructor, factory, prototype) {
|
|
constructor.prototype = factory.prototype = prototype;
|
|
prototype.constructor = constructor;
|
|
}
|
|
function extend(parent, definition) {
|
|
var prototype = Object.create(parent.prototype);
|
|
for (var key in definition)
|
|
prototype[key] = definition[key];
|
|
return prototype;
|
|
}
|
|
|
|
// node_modules/d3-color/src/color.js
|
|
function Color() {
|
|
}
|
|
var darker = 0.7;
|
|
var brighter = 1 / darker;
|
|
var reI = "\\s*([+-]?\\d+)\\s*";
|
|
var reN = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*";
|
|
var reP = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*";
|
|
var reHex = /^#([0-9a-f]{3,8})$/;
|
|
var reRgbInteger = new RegExp(`^rgb\\(${reI},${reI},${reI}\\)$`);
|
|
var reRgbPercent = new RegExp(`^rgb\\(${reP},${reP},${reP}\\)$`);
|
|
var reRgbaInteger = new RegExp(`^rgba\\(${reI},${reI},${reI},${reN}\\)$`);
|
|
var reRgbaPercent = new RegExp(`^rgba\\(${reP},${reP},${reP},${reN}\\)$`);
|
|
var reHslPercent = new RegExp(`^hsl\\(${reN},${reP},${reP}\\)$`);
|
|
var reHslaPercent = new RegExp(`^hsla\\(${reN},${reP},${reP},${reN}\\)$`);
|
|
var named = {
|
|
aliceblue: 15792383,
|
|
antiquewhite: 16444375,
|
|
aqua: 65535,
|
|
aquamarine: 8388564,
|
|
azure: 15794175,
|
|
beige: 16119260,
|
|
bisque: 16770244,
|
|
black: 0,
|
|
blanchedalmond: 16772045,
|
|
blue: 255,
|
|
blueviolet: 9055202,
|
|
brown: 10824234,
|
|
burlywood: 14596231,
|
|
cadetblue: 6266528,
|
|
chartreuse: 8388352,
|
|
chocolate: 13789470,
|
|
coral: 16744272,
|
|
cornflowerblue: 6591981,
|
|
cornsilk: 16775388,
|
|
crimson: 14423100,
|
|
cyan: 65535,
|
|
darkblue: 139,
|
|
darkcyan: 35723,
|
|
darkgoldenrod: 12092939,
|
|
darkgray: 11119017,
|
|
darkgreen: 25600,
|
|
darkgrey: 11119017,
|
|
darkkhaki: 12433259,
|
|
darkmagenta: 9109643,
|
|
darkolivegreen: 5597999,
|
|
darkorange: 16747520,
|
|
darkorchid: 10040012,
|
|
darkred: 9109504,
|
|
darksalmon: 15308410,
|
|
darkseagreen: 9419919,
|
|
darkslateblue: 4734347,
|
|
darkslategray: 3100495,
|
|
darkslategrey: 3100495,
|
|
darkturquoise: 52945,
|
|
darkviolet: 9699539,
|
|
deeppink: 16716947,
|
|
deepskyblue: 49151,
|
|
dimgray: 6908265,
|
|
dimgrey: 6908265,
|
|
dodgerblue: 2003199,
|
|
firebrick: 11674146,
|
|
floralwhite: 16775920,
|
|
forestgreen: 2263842,
|
|
fuchsia: 16711935,
|
|
gainsboro: 14474460,
|
|
ghostwhite: 16316671,
|
|
gold: 16766720,
|
|
goldenrod: 14329120,
|
|
gray: 8421504,
|
|
green: 32768,
|
|
greenyellow: 11403055,
|
|
grey: 8421504,
|
|
honeydew: 15794160,
|
|
hotpink: 16738740,
|
|
indianred: 13458524,
|
|
indigo: 4915330,
|
|
ivory: 16777200,
|
|
khaki: 15787660,
|
|
lavender: 15132410,
|
|
lavenderblush: 16773365,
|
|
lawngreen: 8190976,
|
|
lemonchiffon: 16775885,
|
|
lightblue: 11393254,
|
|
lightcoral: 15761536,
|
|
lightcyan: 14745599,
|
|
lightgoldenrodyellow: 16448210,
|
|
lightgray: 13882323,
|
|
lightgreen: 9498256,
|
|
lightgrey: 13882323,
|
|
lightpink: 16758465,
|
|
lightsalmon: 16752762,
|
|
lightseagreen: 2142890,
|
|
lightskyblue: 8900346,
|
|
lightslategray: 7833753,
|
|
lightslategrey: 7833753,
|
|
lightsteelblue: 11584734,
|
|
lightyellow: 16777184,
|
|
lime: 65280,
|
|
limegreen: 3329330,
|
|
linen: 16445670,
|
|
magenta: 16711935,
|
|
maroon: 8388608,
|
|
mediumaquamarine: 6737322,
|
|
mediumblue: 205,
|
|
mediumorchid: 12211667,
|
|
mediumpurple: 9662683,
|
|
mediumseagreen: 3978097,
|
|
mediumslateblue: 8087790,
|
|
mediumspringgreen: 64154,
|
|
mediumturquoise: 4772300,
|
|
mediumvioletred: 13047173,
|
|
midnightblue: 1644912,
|
|
mintcream: 16121850,
|
|
mistyrose: 16770273,
|
|
moccasin: 16770229,
|
|
navajowhite: 16768685,
|
|
navy: 128,
|
|
oldlace: 16643558,
|
|
olive: 8421376,
|
|
olivedrab: 7048739,
|
|
orange: 16753920,
|
|
orangered: 16729344,
|
|
orchid: 14315734,
|
|
palegoldenrod: 15657130,
|
|
palegreen: 10025880,
|
|
paleturquoise: 11529966,
|
|
palevioletred: 14381203,
|
|
papayawhip: 16773077,
|
|
peachpuff: 16767673,
|
|
peru: 13468991,
|
|
pink: 16761035,
|
|
plum: 14524637,
|
|
powderblue: 11591910,
|
|
purple: 8388736,
|
|
rebeccapurple: 6697881,
|
|
red: 16711680,
|
|
rosybrown: 12357519,
|
|
royalblue: 4286945,
|
|
saddlebrown: 9127187,
|
|
salmon: 16416882,
|
|
sandybrown: 16032864,
|
|
seagreen: 3050327,
|
|
seashell: 16774638,
|
|
sienna: 10506797,
|
|
silver: 12632256,
|
|
skyblue: 8900331,
|
|
slateblue: 6970061,
|
|
slategray: 7372944,
|
|
slategrey: 7372944,
|
|
snow: 16775930,
|
|
springgreen: 65407,
|
|
steelblue: 4620980,
|
|
tan: 13808780,
|
|
teal: 32896,
|
|
thistle: 14204888,
|
|
tomato: 16737095,
|
|
turquoise: 4251856,
|
|
violet: 15631086,
|
|
wheat: 16113331,
|
|
white: 16777215,
|
|
whitesmoke: 16119285,
|
|
yellow: 16776960,
|
|
yellowgreen: 10145074
|
|
};
|
|
define_default(Color, color, {
|
|
copy(channels) {
|
|
return Object.assign(new this.constructor(), this, channels);
|
|
},
|
|
displayable() {
|
|
return this.rgb().displayable();
|
|
},
|
|
hex: color_formatHex,
|
|
// Deprecated! Use color.formatHex.
|
|
formatHex: color_formatHex,
|
|
formatHex8: color_formatHex8,
|
|
formatHsl: color_formatHsl,
|
|
formatRgb: color_formatRgb,
|
|
toString: color_formatRgb
|
|
});
|
|
function color_formatHex() {
|
|
return this.rgb().formatHex();
|
|
}
|
|
function color_formatHex8() {
|
|
return this.rgb().formatHex8();
|
|
}
|
|
function color_formatHsl() {
|
|
return hslConvert(this).formatHsl();
|
|
}
|
|
function color_formatRgb() {
|
|
return this.rgb().formatRgb();
|
|
}
|
|
function color(format2) {
|
|
var m2, l;
|
|
format2 = (format2 + "").trim().toLowerCase();
|
|
return (m2 = reHex.exec(format2)) ? (l = m2[1].length, m2 = parseInt(m2[1], 16), l === 6 ? rgbn(m2) : l === 3 ? new Rgb(m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, (m2 & 15) << 4 | m2 & 15, 1) : l === 8 ? rgba(m2 >> 24 & 255, m2 >> 16 & 255, m2 >> 8 & 255, (m2 & 255) / 255) : l === 4 ? rgba(m2 >> 12 & 15 | m2 >> 8 & 240, m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, ((m2 & 15) << 4 | m2 & 15) / 255) : null) : (m2 = reRgbInteger.exec(format2)) ? new Rgb(m2[1], m2[2], m2[3], 1) : (m2 = reRgbPercent.exec(format2)) ? new Rgb(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, 1) : (m2 = reRgbaInteger.exec(format2)) ? rgba(m2[1], m2[2], m2[3], m2[4]) : (m2 = reRgbaPercent.exec(format2)) ? rgba(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, m2[4]) : (m2 = reHslPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, 1) : (m2 = reHslaPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, m2[4]) : named.hasOwnProperty(format2) ? rgbn(named[format2]) : format2 === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null;
|
|
}
|
|
function rgbn(n) {
|
|
return new Rgb(n >> 16 & 255, n >> 8 & 255, n & 255, 1);
|
|
}
|
|
function rgba(r, g, b, a2) {
|
|
if (a2 <= 0)
|
|
r = g = b = NaN;
|
|
return new Rgb(r, g, b, a2);
|
|
}
|
|
function rgbConvert(o) {
|
|
if (!(o instanceof Color))
|
|
o = color(o);
|
|
if (!o)
|
|
return new Rgb();
|
|
o = o.rgb();
|
|
return new Rgb(o.r, o.g, o.b, o.opacity);
|
|
}
|
|
function rgb(r, g, b, opacity) {
|
|
return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
|
|
}
|
|
function Rgb(r, g, b, opacity) {
|
|
this.r = +r;
|
|
this.g = +g;
|
|
this.b = +b;
|
|
this.opacity = +opacity;
|
|
}
|
|
define_default(Rgb, rgb, extend(Color, {
|
|
brighter(k) {
|
|
k = k == null ? brighter : Math.pow(brighter, k);
|
|
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
|
|
},
|
|
darker(k) {
|
|
k = k == null ? darker : Math.pow(darker, k);
|
|
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
|
|
},
|
|
rgb() {
|
|
return this;
|
|
},
|
|
clamp() {
|
|
return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));
|
|
},
|
|
displayable() {
|
|
return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1);
|
|
},
|
|
hex: rgb_formatHex,
|
|
// Deprecated! Use color.formatHex.
|
|
formatHex: rgb_formatHex,
|
|
formatHex8: rgb_formatHex8,
|
|
formatRgb: rgb_formatRgb,
|
|
toString: rgb_formatRgb
|
|
}));
|
|
function rgb_formatHex() {
|
|
return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;
|
|
}
|
|
function rgb_formatHex8() {
|
|
return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;
|
|
}
|
|
function rgb_formatRgb() {
|
|
const a2 = clampa(this.opacity);
|
|
return `${a2 === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a2 === 1 ? ")" : `, ${a2})`}`;
|
|
}
|
|
function clampa(opacity) {
|
|
return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));
|
|
}
|
|
function clampi(value) {
|
|
return Math.max(0, Math.min(255, Math.round(value) || 0));
|
|
}
|
|
function hex(value) {
|
|
value = clampi(value);
|
|
return (value < 16 ? "0" : "") + value.toString(16);
|
|
}
|
|
function hsla(h, s, l, a2) {
|
|
if (a2 <= 0)
|
|
h = s = l = NaN;
|
|
else if (l <= 0 || l >= 1)
|
|
h = s = NaN;
|
|
else if (s <= 0)
|
|
h = NaN;
|
|
return new Hsl(h, s, l, a2);
|
|
}
|
|
function hslConvert(o) {
|
|
if (o instanceof Hsl)
|
|
return new Hsl(o.h, o.s, o.l, o.opacity);
|
|
if (!(o instanceof Color))
|
|
o = color(o);
|
|
if (!o)
|
|
return new Hsl();
|
|
if (o instanceof Hsl)
|
|
return o;
|
|
o = o.rgb();
|
|
var r = o.r / 255, g = o.g / 255, b = o.b / 255, min2 = Math.min(r, g, b), max2 = Math.max(r, g, b), h = NaN, s = max2 - min2, l = (max2 + min2) / 2;
|
|
if (s) {
|
|
if (r === max2)
|
|
h = (g - b) / s + (g < b) * 6;
|
|
else if (g === max2)
|
|
h = (b - r) / s + 2;
|
|
else
|
|
h = (r - g) / s + 4;
|
|
s /= l < 0.5 ? max2 + min2 : 2 - max2 - min2;
|
|
h *= 60;
|
|
} else {
|
|
s = l > 0 && l < 1 ? 0 : h;
|
|
}
|
|
return new Hsl(h, s, l, o.opacity);
|
|
}
|
|
function hsl(h, s, l, opacity) {
|
|
return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
|
|
}
|
|
function Hsl(h, s, l, opacity) {
|
|
this.h = +h;
|
|
this.s = +s;
|
|
this.l = +l;
|
|
this.opacity = +opacity;
|
|
}
|
|
define_default(Hsl, hsl, extend(Color, {
|
|
brighter(k) {
|
|
k = k == null ? brighter : Math.pow(brighter, k);
|
|
return new Hsl(this.h, this.s, this.l * k, this.opacity);
|
|
},
|
|
darker(k) {
|
|
k = k == null ? darker : Math.pow(darker, k);
|
|
return new Hsl(this.h, this.s, this.l * k, this.opacity);
|
|
},
|
|
rgb() {
|
|
var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;
|
|
return new Rgb(
|
|
hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
|
|
hsl2rgb(h, m1, m2),
|
|
hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
|
|
this.opacity
|
|
);
|
|
},
|
|
clamp() {
|
|
return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));
|
|
},
|
|
displayable() {
|
|
return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1);
|
|
},
|
|
formatHsl() {
|
|
const a2 = clampa(this.opacity);
|
|
return `${a2 === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a2 === 1 ? ")" : `, ${a2})`}`;
|
|
}
|
|
}));
|
|
function clamph(value) {
|
|
value = (value || 0) % 360;
|
|
return value < 0 ? value + 360 : value;
|
|
}
|
|
function clampt(value) {
|
|
return Math.max(0, Math.min(1, value || 0));
|
|
}
|
|
function hsl2rgb(h, m1, m2) {
|
|
return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;
|
|
}
|
|
|
|
// node_modules/d3-interpolate/src/basis.js
|
|
function basis(t1, v0, v1, v2, v3) {
|
|
var t2 = t1 * t1, t3 = t2 * t1;
|
|
return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6;
|
|
}
|
|
function basis_default(values) {
|
|
var n = values.length - 1;
|
|
return function(t) {
|
|
var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
|
|
return basis((t - i / n) * n, v0, v1, v2, v3);
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-interpolate/src/basisClosed.js
|
|
function basisClosed_default(values) {
|
|
var n = values.length;
|
|
return function(t) {
|
|
var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n];
|
|
return basis((t - i / n) * n, v0, v1, v2, v3);
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-interpolate/src/constant.js
|
|
var constant_default3 = (x3) => () => x3;
|
|
|
|
// node_modules/d3-interpolate/src/color.js
|
|
function linear(a2, d) {
|
|
return function(t) {
|
|
return a2 + t * d;
|
|
};
|
|
}
|
|
function exponential(a2, b, y3) {
|
|
return a2 = Math.pow(a2, y3), b = Math.pow(b, y3) - a2, y3 = 1 / y3, function(t) {
|
|
return Math.pow(a2 + t * b, y3);
|
|
};
|
|
}
|
|
function gamma(y3) {
|
|
return (y3 = +y3) === 1 ? nogamma : function(a2, b) {
|
|
return b - a2 ? exponential(a2, b, y3) : constant_default3(isNaN(a2) ? b : a2);
|
|
};
|
|
}
|
|
function nogamma(a2, b) {
|
|
var d = b - a2;
|
|
return d ? linear(a2, d) : constant_default3(isNaN(a2) ? b : a2);
|
|
}
|
|
|
|
// node_modules/d3-interpolate/src/rgb.js
|
|
var rgb_default = function rgbGamma(y3) {
|
|
var color2 = gamma(y3);
|
|
function rgb2(start2, end) {
|
|
var r = color2((start2 = rgb(start2)).r, (end = rgb(end)).r), g = color2(start2.g, end.g), b = color2(start2.b, end.b), opacity = nogamma(start2.opacity, end.opacity);
|
|
return function(t) {
|
|
start2.r = r(t);
|
|
start2.g = g(t);
|
|
start2.b = b(t);
|
|
start2.opacity = opacity(t);
|
|
return start2 + "";
|
|
};
|
|
}
|
|
rgb2.gamma = rgbGamma;
|
|
return rgb2;
|
|
}(1);
|
|
function rgbSpline(spline) {
|
|
return function(colors) {
|
|
var n = colors.length, r = new Array(n), g = new Array(n), b = new Array(n), i, color2;
|
|
for (i = 0; i < n; ++i) {
|
|
color2 = rgb(colors[i]);
|
|
r[i] = color2.r || 0;
|
|
g[i] = color2.g || 0;
|
|
b[i] = color2.b || 0;
|
|
}
|
|
r = spline(r);
|
|
g = spline(g);
|
|
b = spline(b);
|
|
color2.opacity = 1;
|
|
return function(t) {
|
|
color2.r = r(t);
|
|
color2.g = g(t);
|
|
color2.b = b(t);
|
|
return color2 + "";
|
|
};
|
|
};
|
|
}
|
|
var rgbBasis = rgbSpline(basis_default);
|
|
var rgbBasisClosed = rgbSpline(basisClosed_default);
|
|
|
|
// node_modules/d3-interpolate/src/numberArray.js
|
|
function numberArray_default(a2, b) {
|
|
if (!b)
|
|
b = [];
|
|
var n = a2 ? Math.min(b.length, a2.length) : 0, c2 = b.slice(), i;
|
|
return function(t) {
|
|
for (i = 0; i < n; ++i)
|
|
c2[i] = a2[i] * (1 - t) + b[i] * t;
|
|
return c2;
|
|
};
|
|
}
|
|
function isNumberArray(x3) {
|
|
return ArrayBuffer.isView(x3) && !(x3 instanceof DataView);
|
|
}
|
|
|
|
// node_modules/d3-interpolate/src/array.js
|
|
function genericArray(a2, b) {
|
|
var nb = b ? b.length : 0, na = a2 ? Math.min(nb, a2.length) : 0, x3 = new Array(na), c2 = new Array(nb), i;
|
|
for (i = 0; i < na; ++i)
|
|
x3[i] = value_default(a2[i], b[i]);
|
|
for (; i < nb; ++i)
|
|
c2[i] = b[i];
|
|
return function(t) {
|
|
for (i = 0; i < na; ++i)
|
|
c2[i] = x3[i](t);
|
|
return c2;
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-interpolate/src/date.js
|
|
function date_default(a2, b) {
|
|
var d = new Date();
|
|
return a2 = +a2, b = +b, function(t) {
|
|
return d.setTime(a2 * (1 - t) + b * t), d;
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-interpolate/src/number.js
|
|
function number_default(a2, b) {
|
|
return a2 = +a2, b = +b, function(t) {
|
|
return a2 * (1 - t) + b * t;
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-interpolate/src/object.js
|
|
function object_default(a2, b) {
|
|
var i = {}, c2 = {}, k;
|
|
if (a2 === null || typeof a2 !== "object")
|
|
a2 = {};
|
|
if (b === null || typeof b !== "object")
|
|
b = {};
|
|
for (k in b) {
|
|
if (k in a2) {
|
|
i[k] = value_default(a2[k], b[k]);
|
|
} else {
|
|
c2[k] = b[k];
|
|
}
|
|
}
|
|
return function(t) {
|
|
for (k in i)
|
|
c2[k] = i[k](t);
|
|
return c2;
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-interpolate/src/string.js
|
|
var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
|
|
var reB = new RegExp(reA.source, "g");
|
|
function zero2(b) {
|
|
return function() {
|
|
return b;
|
|
};
|
|
}
|
|
function one(b) {
|
|
return function(t) {
|
|
return b(t) + "";
|
|
};
|
|
}
|
|
function string_default(a2, b) {
|
|
var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];
|
|
a2 = a2 + "", b = b + "";
|
|
while ((am = reA.exec(a2)) && (bm = reB.exec(b))) {
|
|
if ((bs = bm.index) > bi) {
|
|
bs = b.slice(bi, bs);
|
|
if (s[i])
|
|
s[i] += bs;
|
|
else
|
|
s[++i] = bs;
|
|
}
|
|
if ((am = am[0]) === (bm = bm[0])) {
|
|
if (s[i])
|
|
s[i] += bm;
|
|
else
|
|
s[++i] = bm;
|
|
} else {
|
|
s[++i] = null;
|
|
q.push({ i, x: number_default(am, bm) });
|
|
}
|
|
bi = reB.lastIndex;
|
|
}
|
|
if (bi < b.length) {
|
|
bs = b.slice(bi);
|
|
if (s[i])
|
|
s[i] += bs;
|
|
else
|
|
s[++i] = bs;
|
|
}
|
|
return s.length < 2 ? q[0] ? one(q[0].x) : zero2(b) : (b = q.length, function(t) {
|
|
for (var i2 = 0, o; i2 < b; ++i2)
|
|
s[(o = q[i2]).i] = o.x(t);
|
|
return s.join("");
|
|
});
|
|
}
|
|
|
|
// node_modules/d3-interpolate/src/value.js
|
|
function value_default(a2, b) {
|
|
var t = typeof b, c2;
|
|
return b == null || t === "boolean" ? constant_default3(b) : (t === "number" ? number_default : t === "string" ? (c2 = color(b)) ? (b = c2, rgb_default) : string_default : b instanceof color ? rgb_default : b instanceof Date ? date_default : isNumberArray(b) ? numberArray_default : Array.isArray(b) ? genericArray : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object_default : number_default)(a2, b);
|
|
}
|
|
|
|
// node_modules/d3-interpolate/src/round.js
|
|
function round_default(a2, b) {
|
|
return a2 = +a2, b = +b, function(t) {
|
|
return Math.round(a2 * (1 - t) + b * t);
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-interpolate/src/transform/decompose.js
|
|
var degrees = 180 / Math.PI;
|
|
var identity = {
|
|
translateX: 0,
|
|
translateY: 0,
|
|
rotate: 0,
|
|
skewX: 0,
|
|
scaleX: 1,
|
|
scaleY: 1
|
|
};
|
|
function decompose_default(a2, b, c2, d, e, f) {
|
|
var scaleX, scaleY, skewX;
|
|
if (scaleX = Math.sqrt(a2 * a2 + b * b))
|
|
a2 /= scaleX, b /= scaleX;
|
|
if (skewX = a2 * c2 + b * d)
|
|
c2 -= a2 * skewX, d -= b * skewX;
|
|
if (scaleY = Math.sqrt(c2 * c2 + d * d))
|
|
c2 /= scaleY, d /= scaleY, skewX /= scaleY;
|
|
if (a2 * d < b * c2)
|
|
a2 = -a2, b = -b, skewX = -skewX, scaleX = -scaleX;
|
|
return {
|
|
translateX: e,
|
|
translateY: f,
|
|
rotate: Math.atan2(b, a2) * degrees,
|
|
skewX: Math.atan(skewX) * degrees,
|
|
scaleX,
|
|
scaleY
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-interpolate/src/transform/parse.js
|
|
var svgNode;
|
|
function parseCss(value) {
|
|
const m2 = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + "");
|
|
return m2.isIdentity ? identity : decompose_default(m2.a, m2.b, m2.c, m2.d, m2.e, m2.f);
|
|
}
|
|
function parseSvg(value) {
|
|
if (value == null)
|
|
return identity;
|
|
if (!svgNode)
|
|
svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
|
|
svgNode.setAttribute("transform", value);
|
|
if (!(value = svgNode.transform.baseVal.consolidate()))
|
|
return identity;
|
|
value = value.matrix;
|
|
return decompose_default(value.a, value.b, value.c, value.d, value.e, value.f);
|
|
}
|
|
|
|
// node_modules/d3-interpolate/src/transform/index.js
|
|
function interpolateTransform(parse, pxComma, pxParen, degParen) {
|
|
function pop(s) {
|
|
return s.length ? s.pop() + " " : "";
|
|
}
|
|
function translate(xa, ya, xb, yb, s, q) {
|
|
if (xa !== xb || ya !== yb) {
|
|
var i = s.push("translate(", null, pxComma, null, pxParen);
|
|
q.push({ i: i - 4, x: number_default(xa, xb) }, { i: i - 2, x: number_default(ya, yb) });
|
|
} else if (xb || yb) {
|
|
s.push("translate(" + xb + pxComma + yb + pxParen);
|
|
}
|
|
}
|
|
function rotate(a2, b, s, q) {
|
|
if (a2 !== b) {
|
|
if (a2 - b > 180)
|
|
b += 360;
|
|
else if (b - a2 > 180)
|
|
a2 += 360;
|
|
q.push({ i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number_default(a2, b) });
|
|
} else if (b) {
|
|
s.push(pop(s) + "rotate(" + b + degParen);
|
|
}
|
|
}
|
|
function skewX(a2, b, s, q) {
|
|
if (a2 !== b) {
|
|
q.push({ i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number_default(a2, b) });
|
|
} else if (b) {
|
|
s.push(pop(s) + "skewX(" + b + degParen);
|
|
}
|
|
}
|
|
function scale(xa, ya, xb, yb, s, q) {
|
|
if (xa !== xb || ya !== yb) {
|
|
var i = s.push(pop(s) + "scale(", null, ",", null, ")");
|
|
q.push({ i: i - 4, x: number_default(xa, xb) }, { i: i - 2, x: number_default(ya, yb) });
|
|
} else if (xb !== 1 || yb !== 1) {
|
|
s.push(pop(s) + "scale(" + xb + "," + yb + ")");
|
|
}
|
|
}
|
|
return function(a2, b) {
|
|
var s = [], q = [];
|
|
a2 = parse(a2), b = parse(b);
|
|
translate(a2.translateX, a2.translateY, b.translateX, b.translateY, s, q);
|
|
rotate(a2.rotate, b.rotate, s, q);
|
|
skewX(a2.skewX, b.skewX, s, q);
|
|
scale(a2.scaleX, a2.scaleY, b.scaleX, b.scaleY, s, q);
|
|
a2 = b = null;
|
|
return function(t) {
|
|
var i = -1, n = q.length, o;
|
|
while (++i < n)
|
|
s[(o = q[i]).i] = o.x(t);
|
|
return s.join("");
|
|
};
|
|
};
|
|
}
|
|
var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
|
|
var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
|
|
|
|
// node_modules/d3-interpolate/src/zoom.js
|
|
var epsilon2 = 1e-12;
|
|
function cosh(x3) {
|
|
return ((x3 = Math.exp(x3)) + 1 / x3) / 2;
|
|
}
|
|
function sinh(x3) {
|
|
return ((x3 = Math.exp(x3)) - 1 / x3) / 2;
|
|
}
|
|
function tanh(x3) {
|
|
return ((x3 = Math.exp(2 * x3)) - 1) / (x3 + 1);
|
|
}
|
|
var zoom_default = function zoomRho(rho, rho2, rho4) {
|
|
function zoom(p0, p1) {
|
|
var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;
|
|
if (d2 < epsilon2) {
|
|
S = Math.log(w1 / w0) / rho;
|
|
i = function(t) {
|
|
return [
|
|
ux0 + t * dx,
|
|
uy0 + t * dy,
|
|
w0 * Math.exp(rho * t * S)
|
|
];
|
|
};
|
|
} else {
|
|
var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
|
|
S = (r1 - r0) / rho;
|
|
i = function(t) {
|
|
var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
|
|
return [
|
|
ux0 + u * dx,
|
|
uy0 + u * dy,
|
|
w0 * coshr0 / cosh(rho * s + r0)
|
|
];
|
|
};
|
|
}
|
|
i.duration = S * 1e3 * rho / Math.SQRT2;
|
|
return i;
|
|
}
|
|
zoom.rho = function(_) {
|
|
var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;
|
|
return zoomRho(_1, _2, _4);
|
|
};
|
|
return zoom;
|
|
}(Math.SQRT2, 2, 4);
|
|
|
|
// node_modules/d3-timer/src/timer.js
|
|
var frame = 0;
|
|
var timeout = 0;
|
|
var interval = 0;
|
|
var pokeDelay = 1e3;
|
|
var taskHead;
|
|
var taskTail;
|
|
var clockLast = 0;
|
|
var clockNow = 0;
|
|
var clockSkew = 0;
|
|
var clock = typeof performance === "object" && performance.now ? performance : Date;
|
|
var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) {
|
|
setTimeout(f, 17);
|
|
};
|
|
function now() {
|
|
return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
|
|
}
|
|
function clearNow() {
|
|
clockNow = 0;
|
|
}
|
|
function Timer() {
|
|
this._call = this._time = this._next = null;
|
|
}
|
|
Timer.prototype = timer.prototype = {
|
|
constructor: Timer,
|
|
restart: function(callback, delay, time) {
|
|
if (typeof callback !== "function")
|
|
throw new TypeError("callback is not a function");
|
|
time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
|
|
if (!this._next && taskTail !== this) {
|
|
if (taskTail)
|
|
taskTail._next = this;
|
|
else
|
|
taskHead = this;
|
|
taskTail = this;
|
|
}
|
|
this._call = callback;
|
|
this._time = time;
|
|
sleep();
|
|
},
|
|
stop: function() {
|
|
if (this._call) {
|
|
this._call = null;
|
|
this._time = Infinity;
|
|
sleep();
|
|
}
|
|
}
|
|
};
|
|
function timer(callback, delay, time) {
|
|
var t = new Timer();
|
|
t.restart(callback, delay, time);
|
|
return t;
|
|
}
|
|
function timerFlush() {
|
|
now();
|
|
++frame;
|
|
var t = taskHead, e;
|
|
while (t) {
|
|
if ((e = clockNow - t._time) >= 0)
|
|
t._call.call(void 0, e);
|
|
t = t._next;
|
|
}
|
|
--frame;
|
|
}
|
|
function wake() {
|
|
clockNow = (clockLast = clock.now()) + clockSkew;
|
|
frame = timeout = 0;
|
|
try {
|
|
timerFlush();
|
|
} finally {
|
|
frame = 0;
|
|
nap();
|
|
clockNow = 0;
|
|
}
|
|
}
|
|
function poke() {
|
|
var now2 = clock.now(), delay = now2 - clockLast;
|
|
if (delay > pokeDelay)
|
|
clockSkew -= delay, clockLast = now2;
|
|
}
|
|
function nap() {
|
|
var t0, t1 = taskHead, t2, time = Infinity;
|
|
while (t1) {
|
|
if (t1._call) {
|
|
if (time > t1._time)
|
|
time = t1._time;
|
|
t0 = t1, t1 = t1._next;
|
|
} else {
|
|
t2 = t1._next, t1._next = null;
|
|
t1 = t0 ? t0._next = t2 : taskHead = t2;
|
|
}
|
|
}
|
|
taskTail = t0;
|
|
sleep(time);
|
|
}
|
|
function sleep(time) {
|
|
if (frame)
|
|
return;
|
|
if (timeout)
|
|
timeout = clearTimeout(timeout);
|
|
var delay = time - clockNow;
|
|
if (delay > 24) {
|
|
if (time < Infinity)
|
|
timeout = setTimeout(wake, time - clock.now() - clockSkew);
|
|
if (interval)
|
|
interval = clearInterval(interval);
|
|
} else {
|
|
if (!interval)
|
|
clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
|
|
frame = 1, setFrame(wake);
|
|
}
|
|
}
|
|
|
|
// node_modules/d3-timer/src/timeout.js
|
|
function timeout_default(callback, delay, time) {
|
|
var t = new Timer();
|
|
delay = delay == null ? 0 : +delay;
|
|
t.restart((elapsed) => {
|
|
t.stop();
|
|
callback(elapsed + delay);
|
|
}, delay, time);
|
|
return t;
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/schedule.js
|
|
var emptyOn = dispatch_default("start", "end", "cancel", "interrupt");
|
|
var emptyTween = [];
|
|
var CREATED = 0;
|
|
var SCHEDULED = 1;
|
|
var STARTING = 2;
|
|
var STARTED = 3;
|
|
var RUNNING = 4;
|
|
var ENDING = 5;
|
|
var ENDED = 6;
|
|
function schedule_default(node, name, id2, index2, group, timing) {
|
|
var schedules = node.__transition;
|
|
if (!schedules)
|
|
node.__transition = {};
|
|
else if (id2 in schedules)
|
|
return;
|
|
create(node, id2, {
|
|
name,
|
|
index: index2,
|
|
// For context during callback.
|
|
group,
|
|
// For context during callback.
|
|
on: emptyOn,
|
|
tween: emptyTween,
|
|
time: timing.time,
|
|
delay: timing.delay,
|
|
duration: timing.duration,
|
|
ease: timing.ease,
|
|
timer: null,
|
|
state: CREATED
|
|
});
|
|
}
|
|
function init(node, id2) {
|
|
var schedule = get2(node, id2);
|
|
if (schedule.state > CREATED)
|
|
throw new Error("too late; already scheduled");
|
|
return schedule;
|
|
}
|
|
function set2(node, id2) {
|
|
var schedule = get2(node, id2);
|
|
if (schedule.state > STARTED)
|
|
throw new Error("too late; already running");
|
|
return schedule;
|
|
}
|
|
function get2(node, id2) {
|
|
var schedule = node.__transition;
|
|
if (!schedule || !(schedule = schedule[id2]))
|
|
throw new Error("transition not found");
|
|
return schedule;
|
|
}
|
|
function create(node, id2, self2) {
|
|
var schedules = node.__transition, tween;
|
|
schedules[id2] = self2;
|
|
self2.timer = timer(schedule, 0, self2.time);
|
|
function schedule(elapsed) {
|
|
self2.state = SCHEDULED;
|
|
self2.timer.restart(start2, self2.delay, self2.time);
|
|
if (self2.delay <= elapsed)
|
|
start2(elapsed - self2.delay);
|
|
}
|
|
function start2(elapsed) {
|
|
var i, j, n, o;
|
|
if (self2.state !== SCHEDULED)
|
|
return stop();
|
|
for (i in schedules) {
|
|
o = schedules[i];
|
|
if (o.name !== self2.name)
|
|
continue;
|
|
if (o.state === STARTED)
|
|
return timeout_default(start2);
|
|
if (o.state === RUNNING) {
|
|
o.state = ENDED;
|
|
o.timer.stop();
|
|
o.on.call("interrupt", node, node.__data__, o.index, o.group);
|
|
delete schedules[i];
|
|
} else if (+i < id2) {
|
|
o.state = ENDED;
|
|
o.timer.stop();
|
|
o.on.call("cancel", node, node.__data__, o.index, o.group);
|
|
delete schedules[i];
|
|
}
|
|
}
|
|
timeout_default(function() {
|
|
if (self2.state === STARTED) {
|
|
self2.state = RUNNING;
|
|
self2.timer.restart(tick, self2.delay, self2.time);
|
|
tick(elapsed);
|
|
}
|
|
});
|
|
self2.state = STARTING;
|
|
self2.on.call("start", node, node.__data__, self2.index, self2.group);
|
|
if (self2.state !== STARTING)
|
|
return;
|
|
self2.state = STARTED;
|
|
tween = new Array(n = self2.tween.length);
|
|
for (i = 0, j = -1; i < n; ++i) {
|
|
if (o = self2.tween[i].value.call(node, node.__data__, self2.index, self2.group)) {
|
|
tween[++j] = o;
|
|
}
|
|
}
|
|
tween.length = j + 1;
|
|
}
|
|
function tick(elapsed) {
|
|
var t = elapsed < self2.duration ? self2.ease.call(null, elapsed / self2.duration) : (self2.timer.restart(stop), self2.state = ENDING, 1), i = -1, n = tween.length;
|
|
while (++i < n) {
|
|
tween[i].call(node, t);
|
|
}
|
|
if (self2.state === ENDING) {
|
|
self2.on.call("end", node, node.__data__, self2.index, self2.group);
|
|
stop();
|
|
}
|
|
}
|
|
function stop() {
|
|
self2.state = ENDED;
|
|
self2.timer.stop();
|
|
delete schedules[id2];
|
|
for (var i in schedules)
|
|
return;
|
|
delete node.__transition;
|
|
}
|
|
}
|
|
|
|
// node_modules/d3-transition/src/interrupt.js
|
|
function interrupt_default(node, name) {
|
|
var schedules = node.__transition, schedule, active, empty2 = true, i;
|
|
if (!schedules)
|
|
return;
|
|
name = name == null ? null : name + "";
|
|
for (i in schedules) {
|
|
if ((schedule = schedules[i]).name !== name) {
|
|
empty2 = false;
|
|
continue;
|
|
}
|
|
active = schedule.state > STARTING && schedule.state < ENDING;
|
|
schedule.state = ENDED;
|
|
schedule.timer.stop();
|
|
schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);
|
|
delete schedules[i];
|
|
}
|
|
if (empty2)
|
|
delete node.__transition;
|
|
}
|
|
|
|
// node_modules/d3-transition/src/selection/interrupt.js
|
|
function interrupt_default2(name) {
|
|
return this.each(function() {
|
|
interrupt_default(this, name);
|
|
});
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/tween.js
|
|
function tweenRemove(id2, name) {
|
|
var tween0, tween1;
|
|
return function() {
|
|
var schedule = set2(this, id2), tween = schedule.tween;
|
|
if (tween !== tween0) {
|
|
tween1 = tween0 = tween;
|
|
for (var i = 0, n = tween1.length; i < n; ++i) {
|
|
if (tween1[i].name === name) {
|
|
tween1 = tween1.slice();
|
|
tween1.splice(i, 1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
schedule.tween = tween1;
|
|
};
|
|
}
|
|
function tweenFunction(id2, name, value) {
|
|
var tween0, tween1;
|
|
if (typeof value !== "function")
|
|
throw new Error();
|
|
return function() {
|
|
var schedule = set2(this, id2), tween = schedule.tween;
|
|
if (tween !== tween0) {
|
|
tween1 = (tween0 = tween).slice();
|
|
for (var t = { name, value }, i = 0, n = tween1.length; i < n; ++i) {
|
|
if (tween1[i].name === name) {
|
|
tween1[i] = t;
|
|
break;
|
|
}
|
|
}
|
|
if (i === n)
|
|
tween1.push(t);
|
|
}
|
|
schedule.tween = tween1;
|
|
};
|
|
}
|
|
function tween_default(name, value) {
|
|
var id2 = this._id;
|
|
name += "";
|
|
if (arguments.length < 2) {
|
|
var tween = get2(this.node(), id2).tween;
|
|
for (var i = 0, n = tween.length, t; i < n; ++i) {
|
|
if ((t = tween[i]).name === name) {
|
|
return t.value;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
return this.each((value == null ? tweenRemove : tweenFunction)(id2, name, value));
|
|
}
|
|
function tweenValue(transition2, name, value) {
|
|
var id2 = transition2._id;
|
|
transition2.each(function() {
|
|
var schedule = set2(this, id2);
|
|
(schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
|
|
});
|
|
return function(node) {
|
|
return get2(node, id2).value[name];
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/interpolate.js
|
|
function interpolate_default(a2, b) {
|
|
var c2;
|
|
return (typeof b === "number" ? number_default : b instanceof color ? rgb_default : (c2 = color(b)) ? (b = c2, rgb_default) : string_default)(a2, b);
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/attr.js
|
|
function attrRemove2(name) {
|
|
return function() {
|
|
this.removeAttribute(name);
|
|
};
|
|
}
|
|
function attrRemoveNS2(fullname) {
|
|
return function() {
|
|
this.removeAttributeNS(fullname.space, fullname.local);
|
|
};
|
|
}
|
|
function attrConstant2(name, interpolate, value1) {
|
|
var string00, string1 = value1 + "", interpolate0;
|
|
return function() {
|
|
var string0 = this.getAttribute(name);
|
|
return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
|
|
};
|
|
}
|
|
function attrConstantNS2(fullname, interpolate, value1) {
|
|
var string00, string1 = value1 + "", interpolate0;
|
|
return function() {
|
|
var string0 = this.getAttributeNS(fullname.space, fullname.local);
|
|
return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
|
|
};
|
|
}
|
|
function attrFunction2(name, interpolate, value) {
|
|
var string00, string10, interpolate0;
|
|
return function() {
|
|
var string0, value1 = value(this), string1;
|
|
if (value1 == null)
|
|
return void this.removeAttribute(name);
|
|
string0 = this.getAttribute(name);
|
|
string1 = value1 + "";
|
|
return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
|
|
};
|
|
}
|
|
function attrFunctionNS2(fullname, interpolate, value) {
|
|
var string00, string10, interpolate0;
|
|
return function() {
|
|
var string0, value1 = value(this), string1;
|
|
if (value1 == null)
|
|
return void this.removeAttributeNS(fullname.space, fullname.local);
|
|
string0 = this.getAttributeNS(fullname.space, fullname.local);
|
|
string1 = value1 + "";
|
|
return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
|
|
};
|
|
}
|
|
function attr_default2(name, value) {
|
|
var fullname = namespace_default(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate_default;
|
|
return this.attrTween(name, typeof value === "function" ? (fullname.local ? attrFunctionNS2 : attrFunction2)(fullname, i, tweenValue(this, "attr." + name, value)) : value == null ? (fullname.local ? attrRemoveNS2 : attrRemove2)(fullname) : (fullname.local ? attrConstantNS2 : attrConstant2)(fullname, i, value));
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/attrTween.js
|
|
function attrInterpolate(name, i) {
|
|
return function(t) {
|
|
this.setAttribute(name, i.call(this, t));
|
|
};
|
|
}
|
|
function attrInterpolateNS(fullname, i) {
|
|
return function(t) {
|
|
this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));
|
|
};
|
|
}
|
|
function attrTweenNS(fullname, value) {
|
|
var t0, i0;
|
|
function tween() {
|
|
var i = value.apply(this, arguments);
|
|
if (i !== i0)
|
|
t0 = (i0 = i) && attrInterpolateNS(fullname, i);
|
|
return t0;
|
|
}
|
|
tween._value = value;
|
|
return tween;
|
|
}
|
|
function attrTween(name, value) {
|
|
var t0, i0;
|
|
function tween() {
|
|
var i = value.apply(this, arguments);
|
|
if (i !== i0)
|
|
t0 = (i0 = i) && attrInterpolate(name, i);
|
|
return t0;
|
|
}
|
|
tween._value = value;
|
|
return tween;
|
|
}
|
|
function attrTween_default(name, value) {
|
|
var key = "attr." + name;
|
|
if (arguments.length < 2)
|
|
return (key = this.tween(key)) && key._value;
|
|
if (value == null)
|
|
return this.tween(key, null);
|
|
if (typeof value !== "function")
|
|
throw new Error();
|
|
var fullname = namespace_default(name);
|
|
return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/delay.js
|
|
function delayFunction(id2, value) {
|
|
return function() {
|
|
init(this, id2).delay = +value.apply(this, arguments);
|
|
};
|
|
}
|
|
function delayConstant(id2, value) {
|
|
return value = +value, function() {
|
|
init(this, id2).delay = value;
|
|
};
|
|
}
|
|
function delay_default(value) {
|
|
var id2 = this._id;
|
|
return arguments.length ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id2, value)) : get2(this.node(), id2).delay;
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/duration.js
|
|
function durationFunction(id2, value) {
|
|
return function() {
|
|
set2(this, id2).duration = +value.apply(this, arguments);
|
|
};
|
|
}
|
|
function durationConstant(id2, value) {
|
|
return value = +value, function() {
|
|
set2(this, id2).duration = value;
|
|
};
|
|
}
|
|
function duration_default(value) {
|
|
var id2 = this._id;
|
|
return arguments.length ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id2, value)) : get2(this.node(), id2).duration;
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/ease.js
|
|
function easeConstant(id2, value) {
|
|
if (typeof value !== "function")
|
|
throw new Error();
|
|
return function() {
|
|
set2(this, id2).ease = value;
|
|
};
|
|
}
|
|
function ease_default(value) {
|
|
var id2 = this._id;
|
|
return arguments.length ? this.each(easeConstant(id2, value)) : get2(this.node(), id2).ease;
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/easeVarying.js
|
|
function easeVarying(id2, value) {
|
|
return function() {
|
|
var v = value.apply(this, arguments);
|
|
if (typeof v !== "function")
|
|
throw new Error();
|
|
set2(this, id2).ease = v;
|
|
};
|
|
}
|
|
function easeVarying_default(value) {
|
|
if (typeof value !== "function")
|
|
throw new Error();
|
|
return this.each(easeVarying(this._id, value));
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/filter.js
|
|
function filter_default2(match) {
|
|
if (typeof match !== "function")
|
|
match = matcher_default(match);
|
|
for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) {
|
|
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
|
|
if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
|
|
subgroup.push(node);
|
|
}
|
|
}
|
|
}
|
|
return new Transition(subgroups, this._parents, this._name, this._id);
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/merge.js
|
|
function merge_default2(transition2) {
|
|
if (transition2._id !== this._id)
|
|
throw new Error();
|
|
for (var groups0 = this._groups, groups1 = transition2._groups, m0 = groups0.length, m1 = groups1.length, m2 = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m2; ++j) {
|
|
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
|
|
if (node = group0[i] || group1[i]) {
|
|
merge[i] = node;
|
|
}
|
|
}
|
|
}
|
|
for (; j < m0; ++j) {
|
|
merges[j] = groups0[j];
|
|
}
|
|
return new Transition(merges, this._parents, this._name, this._id);
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/on.js
|
|
function start(name) {
|
|
return (name + "").trim().split(/^|\s+/).every(function(t) {
|
|
var i = t.indexOf(".");
|
|
if (i >= 0)
|
|
t = t.slice(0, i);
|
|
return !t || t === "start";
|
|
});
|
|
}
|
|
function onFunction(id2, name, listener) {
|
|
var on0, on1, sit = start(name) ? init : set2;
|
|
return function() {
|
|
var schedule = sit(this, id2), on = schedule.on;
|
|
if (on !== on0)
|
|
(on1 = (on0 = on).copy()).on(name, listener);
|
|
schedule.on = on1;
|
|
};
|
|
}
|
|
function on_default2(name, listener) {
|
|
var id2 = this._id;
|
|
return arguments.length < 2 ? get2(this.node(), id2).on.on(name) : this.each(onFunction(id2, name, listener));
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/remove.js
|
|
function removeFunction(id2) {
|
|
return function() {
|
|
var parent = this.parentNode;
|
|
for (var i in this.__transition)
|
|
if (+i !== id2)
|
|
return;
|
|
if (parent)
|
|
parent.removeChild(this);
|
|
};
|
|
}
|
|
function remove_default2() {
|
|
return this.on("end.remove", removeFunction(this._id));
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/select.js
|
|
function select_default3(select) {
|
|
var name = this._name, id2 = this._id;
|
|
if (typeof select !== "function")
|
|
select = selector_default(select);
|
|
for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) {
|
|
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
|
|
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
|
|
if ("__data__" in node)
|
|
subnode.__data__ = node.__data__;
|
|
subgroup[i] = subnode;
|
|
schedule_default(subgroup[i], name, id2, i, subgroup, get2(node, id2));
|
|
}
|
|
}
|
|
}
|
|
return new Transition(subgroups, this._parents, name, id2);
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/selectAll.js
|
|
function selectAll_default2(select) {
|
|
var name = this._name, id2 = this._id;
|
|
if (typeof select !== "function")
|
|
select = selectorAll_default(select);
|
|
for (var groups = this._groups, m2 = groups.length, subgroups = [], parents = [], j = 0; j < m2; ++j) {
|
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
|
|
if (node = group[i]) {
|
|
for (var children2 = select.call(node, node.__data__, i, group), child, inherit2 = get2(node, id2), k = 0, l = children2.length; k < l; ++k) {
|
|
if (child = children2[k]) {
|
|
schedule_default(child, name, id2, k, children2, inherit2);
|
|
}
|
|
}
|
|
subgroups.push(children2);
|
|
parents.push(node);
|
|
}
|
|
}
|
|
}
|
|
return new Transition(subgroups, parents, name, id2);
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/selection.js
|
|
var Selection2 = selection_default.prototype.constructor;
|
|
function selection_default2() {
|
|
return new Selection2(this._groups, this._parents);
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/style.js
|
|
function styleNull(name, interpolate) {
|
|
var string00, string10, interpolate0;
|
|
return function() {
|
|
var string0 = styleValue(this, name), string1 = (this.style.removeProperty(name), styleValue(this, name));
|
|
return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : interpolate0 = interpolate(string00 = string0, string10 = string1);
|
|
};
|
|
}
|
|
function styleRemove2(name) {
|
|
return function() {
|
|
this.style.removeProperty(name);
|
|
};
|
|
}
|
|
function styleConstant2(name, interpolate, value1) {
|
|
var string00, string1 = value1 + "", interpolate0;
|
|
return function() {
|
|
var string0 = styleValue(this, name);
|
|
return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
|
|
};
|
|
}
|
|
function styleFunction2(name, interpolate, value) {
|
|
var string00, string10, interpolate0;
|
|
return function() {
|
|
var string0 = styleValue(this, name), value1 = value(this), string1 = value1 + "";
|
|
if (value1 == null)
|
|
string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));
|
|
return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
|
|
};
|
|
}
|
|
function styleMaybeRemove(id2, name) {
|
|
var on0, on1, listener0, key = "style." + name, event = "end." + key, remove2;
|
|
return function() {
|
|
var schedule = set2(this, id2), on = schedule.on, listener = schedule.value[key] == null ? remove2 || (remove2 = styleRemove2(name)) : void 0;
|
|
if (on !== on0 || listener0 !== listener)
|
|
(on1 = (on0 = on).copy()).on(event, listener0 = listener);
|
|
schedule.on = on1;
|
|
};
|
|
}
|
|
function style_default2(name, value, priority) {
|
|
var i = (name += "") === "transform" ? interpolateTransformCss : interpolate_default;
|
|
return value == null ? this.styleTween(name, styleNull(name, i)).on("end.style." + name, styleRemove2(name)) : typeof value === "function" ? this.styleTween(name, styleFunction2(name, i, tweenValue(this, "style." + name, value))).each(styleMaybeRemove(this._id, name)) : this.styleTween(name, styleConstant2(name, i, value), priority).on("end.style." + name, null);
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/styleTween.js
|
|
function styleInterpolate(name, i, priority) {
|
|
return function(t) {
|
|
this.style.setProperty(name, i.call(this, t), priority);
|
|
};
|
|
}
|
|
function styleTween(name, value, priority) {
|
|
var t, i0;
|
|
function tween() {
|
|
var i = value.apply(this, arguments);
|
|
if (i !== i0)
|
|
t = (i0 = i) && styleInterpolate(name, i, priority);
|
|
return t;
|
|
}
|
|
tween._value = value;
|
|
return tween;
|
|
}
|
|
function styleTween_default(name, value, priority) {
|
|
var key = "style." + (name += "");
|
|
if (arguments.length < 2)
|
|
return (key = this.tween(key)) && key._value;
|
|
if (value == null)
|
|
return this.tween(key, null);
|
|
if (typeof value !== "function")
|
|
throw new Error();
|
|
return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/text.js
|
|
function textConstant2(value) {
|
|
return function() {
|
|
this.textContent = value;
|
|
};
|
|
}
|
|
function textFunction2(value) {
|
|
return function() {
|
|
var value1 = value(this);
|
|
this.textContent = value1 == null ? "" : value1;
|
|
};
|
|
}
|
|
function text_default2(value) {
|
|
return this.tween("text", typeof value === "function" ? textFunction2(tweenValue(this, "text", value)) : textConstant2(value == null ? "" : value + ""));
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/textTween.js
|
|
function textInterpolate(i) {
|
|
return function(t) {
|
|
this.textContent = i.call(this, t);
|
|
};
|
|
}
|
|
function textTween(value) {
|
|
var t0, i0;
|
|
function tween() {
|
|
var i = value.apply(this, arguments);
|
|
if (i !== i0)
|
|
t0 = (i0 = i) && textInterpolate(i);
|
|
return t0;
|
|
}
|
|
tween._value = value;
|
|
return tween;
|
|
}
|
|
function textTween_default(value) {
|
|
var key = "text";
|
|
if (arguments.length < 1)
|
|
return (key = this.tween(key)) && key._value;
|
|
if (value == null)
|
|
return this.tween(key, null);
|
|
if (typeof value !== "function")
|
|
throw new Error();
|
|
return this.tween(key, textTween(value));
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/transition.js
|
|
function transition_default() {
|
|
var name = this._name, id0 = this._id, id1 = newId();
|
|
for (var groups = this._groups, m2 = groups.length, j = 0; j < m2; ++j) {
|
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
|
|
if (node = group[i]) {
|
|
var inherit2 = get2(node, id0);
|
|
schedule_default(node, name, id1, i, group, {
|
|
time: inherit2.time + inherit2.delay + inherit2.duration,
|
|
delay: 0,
|
|
duration: inherit2.duration,
|
|
ease: inherit2.ease
|
|
});
|
|
}
|
|
}
|
|
}
|
|
return new Transition(groups, this._parents, name, id1);
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/end.js
|
|
function end_default() {
|
|
var on0, on1, that = this, id2 = that._id, size = that.size();
|
|
return new Promise(function(resolve, reject) {
|
|
var cancel = { value: reject }, end = { value: function() {
|
|
if (--size === 0)
|
|
resolve();
|
|
} };
|
|
that.each(function() {
|
|
var schedule = set2(this, id2), on = schedule.on;
|
|
if (on !== on0) {
|
|
on1 = (on0 = on).copy();
|
|
on1._.cancel.push(cancel);
|
|
on1._.interrupt.push(cancel);
|
|
on1._.end.push(end);
|
|
}
|
|
schedule.on = on1;
|
|
});
|
|
if (size === 0)
|
|
resolve();
|
|
});
|
|
}
|
|
|
|
// node_modules/d3-transition/src/transition/index.js
|
|
var id = 0;
|
|
function Transition(groups, parents, name, id2) {
|
|
this._groups = groups;
|
|
this._parents = parents;
|
|
this._name = name;
|
|
this._id = id2;
|
|
}
|
|
function transition(name) {
|
|
return selection_default().transition(name);
|
|
}
|
|
function newId() {
|
|
return ++id;
|
|
}
|
|
var selection_prototype = selection_default.prototype;
|
|
Transition.prototype = transition.prototype = {
|
|
constructor: Transition,
|
|
select: select_default3,
|
|
selectAll: selectAll_default2,
|
|
selectChild: selection_prototype.selectChild,
|
|
selectChildren: selection_prototype.selectChildren,
|
|
filter: filter_default2,
|
|
merge: merge_default2,
|
|
selection: selection_default2,
|
|
transition: transition_default,
|
|
call: selection_prototype.call,
|
|
nodes: selection_prototype.nodes,
|
|
node: selection_prototype.node,
|
|
size: selection_prototype.size,
|
|
empty: selection_prototype.empty,
|
|
each: selection_prototype.each,
|
|
on: on_default2,
|
|
attr: attr_default2,
|
|
attrTween: attrTween_default,
|
|
style: style_default2,
|
|
styleTween: styleTween_default,
|
|
text: text_default2,
|
|
textTween: textTween_default,
|
|
remove: remove_default2,
|
|
tween: tween_default,
|
|
delay: delay_default,
|
|
duration: duration_default,
|
|
ease: ease_default,
|
|
easeVarying: easeVarying_default,
|
|
end: end_default,
|
|
[Symbol.iterator]: selection_prototype[Symbol.iterator]
|
|
};
|
|
|
|
// node_modules/d3-ease/src/cubic.js
|
|
function cubicInOut(t) {
|
|
return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
|
|
}
|
|
|
|
// node_modules/d3-transition/src/selection/transition.js
|
|
var defaultTiming = {
|
|
time: null,
|
|
// Set on use.
|
|
delay: 0,
|
|
duration: 250,
|
|
ease: cubicInOut
|
|
};
|
|
function inherit(node, id2) {
|
|
var timing;
|
|
while (!(timing = node.__transition) || !(timing = timing[id2])) {
|
|
if (!(node = node.parentNode)) {
|
|
throw new Error(`transition ${id2} not found`);
|
|
}
|
|
}
|
|
return timing;
|
|
}
|
|
function transition_default2(name) {
|
|
var id2, timing;
|
|
if (name instanceof Transition) {
|
|
id2 = name._id, name = name._name;
|
|
} else {
|
|
id2 = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
|
|
}
|
|
for (var groups = this._groups, m2 = groups.length, j = 0; j < m2; ++j) {
|
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
|
|
if (node = group[i]) {
|
|
schedule_default(node, name, id2, i, group, timing || inherit(node, id2));
|
|
}
|
|
}
|
|
}
|
|
return new Transition(groups, this._parents, name, id2);
|
|
}
|
|
|
|
// node_modules/d3-transition/src/selection/index.js
|
|
selection_default.prototype.interrupt = interrupt_default2;
|
|
selection_default.prototype.transition = transition_default2;
|
|
|
|
// node_modules/d3-brush/src/brush.js
|
|
var { abs, max, min } = Math;
|
|
function number1(e) {
|
|
return [+e[0], +e[1]];
|
|
}
|
|
function number2(e) {
|
|
return [number1(e[0]), number1(e[1])];
|
|
}
|
|
var X = {
|
|
name: "x",
|
|
handles: ["w", "e"].map(type),
|
|
input: function(x3, e) {
|
|
return x3 == null ? null : [[+x3[0], e[0][1]], [+x3[1], e[1][1]]];
|
|
},
|
|
output: function(xy) {
|
|
return xy && [xy[0][0], xy[1][0]];
|
|
}
|
|
};
|
|
var Y = {
|
|
name: "y",
|
|
handles: ["n", "s"].map(type),
|
|
input: function(y3, e) {
|
|
return y3 == null ? null : [[e[0][0], +y3[0]], [e[1][0], +y3[1]]];
|
|
},
|
|
output: function(xy) {
|
|
return xy && [xy[0][1], xy[1][1]];
|
|
}
|
|
};
|
|
var XY = {
|
|
name: "xy",
|
|
handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type),
|
|
input: function(xy) {
|
|
return xy == null ? null : number2(xy);
|
|
},
|
|
output: function(xy) {
|
|
return xy;
|
|
}
|
|
};
|
|
function type(t) {
|
|
return { type: t };
|
|
}
|
|
|
|
// node_modules/d3-force/src/center.js
|
|
function center_default(x3, y3) {
|
|
var nodes, strength = 1;
|
|
if (x3 == null)
|
|
x3 = 0;
|
|
if (y3 == null)
|
|
y3 = 0;
|
|
function force() {
|
|
var i, n = nodes.length, node, sx = 0, sy = 0;
|
|
for (i = 0; i < n; ++i) {
|
|
node = nodes[i], sx += node.x, sy += node.y;
|
|
}
|
|
for (sx = (sx / n - x3) * strength, sy = (sy / n - y3) * strength, i = 0; i < n; ++i) {
|
|
node = nodes[i], node.x -= sx, node.y -= sy;
|
|
}
|
|
}
|
|
force.initialize = function(_) {
|
|
nodes = _;
|
|
};
|
|
force.x = function(_) {
|
|
return arguments.length ? (x3 = +_, force) : x3;
|
|
};
|
|
force.y = function(_) {
|
|
return arguments.length ? (y3 = +_, force) : y3;
|
|
};
|
|
force.strength = function(_) {
|
|
return arguments.length ? (strength = +_, force) : strength;
|
|
};
|
|
return force;
|
|
}
|
|
|
|
// node_modules/d3-quadtree/src/add.js
|
|
function add_default(d) {
|
|
const x3 = +this._x.call(null, d), y3 = +this._y.call(null, d);
|
|
return add(this.cover(x3, y3), x3, y3, d);
|
|
}
|
|
function add(tree, x3, y3, d) {
|
|
if (isNaN(x3) || isNaN(y3))
|
|
return tree;
|
|
var parent, node = tree._root, leaf = { data: d }, x0 = tree._x0, y0 = tree._y0, x1 = tree._x1, y1 = tree._y1, xm, ym, xp, yp, right, bottom, i, j;
|
|
if (!node)
|
|
return tree._root = leaf, tree;
|
|
while (node.length) {
|
|
if (right = x3 >= (xm = (x0 + x1) / 2))
|
|
x0 = xm;
|
|
else
|
|
x1 = xm;
|
|
if (bottom = y3 >= (ym = (y0 + y1) / 2))
|
|
y0 = ym;
|
|
else
|
|
y1 = ym;
|
|
if (parent = node, !(node = node[i = bottom << 1 | right]))
|
|
return parent[i] = leaf, tree;
|
|
}
|
|
xp = +tree._x.call(null, node.data);
|
|
yp = +tree._y.call(null, node.data);
|
|
if (x3 === xp && y3 === yp)
|
|
return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
|
|
do {
|
|
parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
|
|
if (right = x3 >= (xm = (x0 + x1) / 2))
|
|
x0 = xm;
|
|
else
|
|
x1 = xm;
|
|
if (bottom = y3 >= (ym = (y0 + y1) / 2))
|
|
y0 = ym;
|
|
else
|
|
y1 = ym;
|
|
} while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | xp >= xm));
|
|
return parent[j] = node, parent[i] = leaf, tree;
|
|
}
|
|
function addAll(data) {
|
|
var d, i, n = data.length, x3, y3, xz = new Array(n), yz = new Array(n), x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;
|
|
for (i = 0; i < n; ++i) {
|
|
if (isNaN(x3 = +this._x.call(null, d = data[i])) || isNaN(y3 = +this._y.call(null, d)))
|
|
continue;
|
|
xz[i] = x3;
|
|
yz[i] = y3;
|
|
if (x3 < x0)
|
|
x0 = x3;
|
|
if (x3 > x1)
|
|
x1 = x3;
|
|
if (y3 < y0)
|
|
y0 = y3;
|
|
if (y3 > y1)
|
|
y1 = y3;
|
|
}
|
|
if (x0 > x1 || y0 > y1)
|
|
return this;
|
|
this.cover(x0, y0).cover(x1, y1);
|
|
for (i = 0; i < n; ++i) {
|
|
add(this, xz[i], yz[i], data[i]);
|
|
}
|
|
return this;
|
|
}
|
|
|
|
// node_modules/d3-quadtree/src/cover.js
|
|
function cover_default(x3, y3) {
|
|
if (isNaN(x3 = +x3) || isNaN(y3 = +y3))
|
|
return this;
|
|
var x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1;
|
|
if (isNaN(x0)) {
|
|
x1 = (x0 = Math.floor(x3)) + 1;
|
|
y1 = (y0 = Math.floor(y3)) + 1;
|
|
} else {
|
|
var z = x1 - x0 || 1, node = this._root, parent, i;
|
|
while (x0 > x3 || x3 >= x1 || y0 > y3 || y3 >= y1) {
|
|
i = (y3 < y0) << 1 | x3 < x0;
|
|
parent = new Array(4), parent[i] = node, node = parent, z *= 2;
|
|
switch (i) {
|
|
case 0:
|
|
x1 = x0 + z, y1 = y0 + z;
|
|
break;
|
|
case 1:
|
|
x0 = x1 - z, y1 = y0 + z;
|
|
break;
|
|
case 2:
|
|
x1 = x0 + z, y0 = y1 - z;
|
|
break;
|
|
case 3:
|
|
x0 = x1 - z, y0 = y1 - z;
|
|
break;
|
|
}
|
|
}
|
|
if (this._root && this._root.length)
|
|
this._root = node;
|
|
}
|
|
this._x0 = x0;
|
|
this._y0 = y0;
|
|
this._x1 = x1;
|
|
this._y1 = y1;
|
|
return this;
|
|
}
|
|
|
|
// node_modules/d3-quadtree/src/data.js
|
|
function data_default2() {
|
|
var data = [];
|
|
this.visit(function(node) {
|
|
if (!node.length)
|
|
do
|
|
data.push(node.data);
|
|
while (node = node.next);
|
|
});
|
|
return data;
|
|
}
|
|
|
|
// node_modules/d3-quadtree/src/extent.js
|
|
function extent_default(_) {
|
|
return arguments.length ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) : isNaN(this._x0) ? void 0 : [[this._x0, this._y0], [this._x1, this._y1]];
|
|
}
|
|
|
|
// node_modules/d3-quadtree/src/quad.js
|
|
function quad_default(node, x0, y0, x1, y1) {
|
|
this.node = node;
|
|
this.x0 = x0;
|
|
this.y0 = y0;
|
|
this.x1 = x1;
|
|
this.y1 = y1;
|
|
}
|
|
|
|
// node_modules/d3-quadtree/src/find.js
|
|
function find_default(x3, y3, radius) {
|
|
var data, x0 = this._x0, y0 = this._y0, x1, y1, x22, y22, x32 = this._x1, y32 = this._y1, quads = [], node = this._root, q, i;
|
|
if (node)
|
|
quads.push(new quad_default(node, x0, y0, x32, y32));
|
|
if (radius == null)
|
|
radius = Infinity;
|
|
else {
|
|
x0 = x3 - radius, y0 = y3 - radius;
|
|
x32 = x3 + radius, y32 = y3 + radius;
|
|
radius *= radius;
|
|
}
|
|
while (q = quads.pop()) {
|
|
if (!(node = q.node) || (x1 = q.x0) > x32 || (y1 = q.y0) > y32 || (x22 = q.x1) < x0 || (y22 = q.y1) < y0)
|
|
continue;
|
|
if (node.length) {
|
|
var xm = (x1 + x22) / 2, ym = (y1 + y22) / 2;
|
|
quads.push(
|
|
new quad_default(node[3], xm, ym, x22, y22),
|
|
new quad_default(node[2], x1, ym, xm, y22),
|
|
new quad_default(node[1], xm, y1, x22, ym),
|
|
new quad_default(node[0], x1, y1, xm, ym)
|
|
);
|
|
if (i = (y3 >= ym) << 1 | x3 >= xm) {
|
|
q = quads[quads.length - 1];
|
|
quads[quads.length - 1] = quads[quads.length - 1 - i];
|
|
quads[quads.length - 1 - i] = q;
|
|
}
|
|
} else {
|
|
var dx = x3 - +this._x.call(null, node.data), dy = y3 - +this._y.call(null, node.data), d2 = dx * dx + dy * dy;
|
|
if (d2 < radius) {
|
|
var d = Math.sqrt(radius = d2);
|
|
x0 = x3 - d, y0 = y3 - d;
|
|
x32 = x3 + d, y32 = y3 + d;
|
|
data = node.data;
|
|
}
|
|
}
|
|
}
|
|
return data;
|
|
}
|
|
|
|
// node_modules/d3-quadtree/src/remove.js
|
|
function remove_default3(d) {
|
|
if (isNaN(x3 = +this._x.call(null, d)) || isNaN(y3 = +this._y.call(null, d)))
|
|
return this;
|
|
var parent, node = this._root, retainer, previous, next, x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1, x3, y3, xm, ym, right, bottom, i, j;
|
|
if (!node)
|
|
return this;
|
|
if (node.length)
|
|
while (true) {
|
|
if (right = x3 >= (xm = (x0 + x1) / 2))
|
|
x0 = xm;
|
|
else
|
|
x1 = xm;
|
|
if (bottom = y3 >= (ym = (y0 + y1) / 2))
|
|
y0 = ym;
|
|
else
|
|
y1 = ym;
|
|
if (!(parent = node, node = node[i = bottom << 1 | right]))
|
|
return this;
|
|
if (!node.length)
|
|
break;
|
|
if (parent[i + 1 & 3] || parent[i + 2 & 3] || parent[i + 3 & 3])
|
|
retainer = parent, j = i;
|
|
}
|
|
while (node.data !== d)
|
|
if (!(previous = node, node = node.next))
|
|
return this;
|
|
if (next = node.next)
|
|
delete node.next;
|
|
if (previous)
|
|
return next ? previous.next = next : delete previous.next, this;
|
|
if (!parent)
|
|
return this._root = next, this;
|
|
next ? parent[i] = next : delete parent[i];
|
|
if ((node = parent[0] || parent[1] || parent[2] || parent[3]) && node === (parent[3] || parent[2] || parent[1] || parent[0]) && !node.length) {
|
|
if (retainer)
|
|
retainer[j] = node;
|
|
else
|
|
this._root = node;
|
|
}
|
|
return this;
|
|
}
|
|
function removeAll(data) {
|
|
for (var i = 0, n = data.length; i < n; ++i)
|
|
this.remove(data[i]);
|
|
return this;
|
|
}
|
|
|
|
// node_modules/d3-quadtree/src/root.js
|
|
function root_default() {
|
|
return this._root;
|
|
}
|
|
|
|
// node_modules/d3-quadtree/src/size.js
|
|
function size_default2() {
|
|
var size = 0;
|
|
this.visit(function(node) {
|
|
if (!node.length)
|
|
do
|
|
++size;
|
|
while (node = node.next);
|
|
});
|
|
return size;
|
|
}
|
|
|
|
// node_modules/d3-quadtree/src/visit.js
|
|
function visit_default(callback) {
|
|
var quads = [], q, node = this._root, child, x0, y0, x1, y1;
|
|
if (node)
|
|
quads.push(new quad_default(node, this._x0, this._y0, this._x1, this._y1));
|
|
while (q = quads.pop()) {
|
|
if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
|
|
var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
|
|
if (child = node[3])
|
|
quads.push(new quad_default(child, xm, ym, x1, y1));
|
|
if (child = node[2])
|
|
quads.push(new quad_default(child, x0, ym, xm, y1));
|
|
if (child = node[1])
|
|
quads.push(new quad_default(child, xm, y0, x1, ym));
|
|
if (child = node[0])
|
|
quads.push(new quad_default(child, x0, y0, xm, ym));
|
|
}
|
|
}
|
|
return this;
|
|
}
|
|
|
|
// node_modules/d3-quadtree/src/visitAfter.js
|
|
function visitAfter_default(callback) {
|
|
var quads = [], next = [], q;
|
|
if (this._root)
|
|
quads.push(new quad_default(this._root, this._x0, this._y0, this._x1, this._y1));
|
|
while (q = quads.pop()) {
|
|
var node = q.node;
|
|
if (node.length) {
|
|
var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
|
|
if (child = node[0])
|
|
quads.push(new quad_default(child, x0, y0, xm, ym));
|
|
if (child = node[1])
|
|
quads.push(new quad_default(child, xm, y0, x1, ym));
|
|
if (child = node[2])
|
|
quads.push(new quad_default(child, x0, ym, xm, y1));
|
|
if (child = node[3])
|
|
quads.push(new quad_default(child, xm, ym, x1, y1));
|
|
}
|
|
next.push(q);
|
|
}
|
|
while (q = next.pop()) {
|
|
callback(q.node, q.x0, q.y0, q.x1, q.y1);
|
|
}
|
|
return this;
|
|
}
|
|
|
|
// node_modules/d3-quadtree/src/x.js
|
|
function defaultX(d) {
|
|
return d[0];
|
|
}
|
|
function x_default(_) {
|
|
return arguments.length ? (this._x = _, this) : this._x;
|
|
}
|
|
|
|
// node_modules/d3-quadtree/src/y.js
|
|
function defaultY(d) {
|
|
return d[1];
|
|
}
|
|
function y_default(_) {
|
|
return arguments.length ? (this._y = _, this) : this._y;
|
|
}
|
|
|
|
// node_modules/d3-quadtree/src/quadtree.js
|
|
function quadtree(nodes, x3, y3) {
|
|
var tree = new Quadtree(x3 == null ? defaultX : x3, y3 == null ? defaultY : y3, NaN, NaN, NaN, NaN);
|
|
return nodes == null ? tree : tree.addAll(nodes);
|
|
}
|
|
function Quadtree(x3, y3, x0, y0, x1, y1) {
|
|
this._x = x3;
|
|
this._y = y3;
|
|
this._x0 = x0;
|
|
this._y0 = y0;
|
|
this._x1 = x1;
|
|
this._y1 = y1;
|
|
this._root = void 0;
|
|
}
|
|
function leaf_copy(leaf) {
|
|
var copy2 = { data: leaf.data }, next = copy2;
|
|
while (leaf = leaf.next)
|
|
next = next.next = { data: leaf.data };
|
|
return copy2;
|
|
}
|
|
var treeProto = quadtree.prototype = Quadtree.prototype;
|
|
treeProto.copy = function() {
|
|
var copy2 = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), node = this._root, nodes, child;
|
|
if (!node)
|
|
return copy2;
|
|
if (!node.length)
|
|
return copy2._root = leaf_copy(node), copy2;
|
|
nodes = [{ source: node, target: copy2._root = new Array(4) }];
|
|
while (node = nodes.pop()) {
|
|
for (var i = 0; i < 4; ++i) {
|
|
if (child = node.source[i]) {
|
|
if (child.length)
|
|
nodes.push({ source: child, target: node.target[i] = new Array(4) });
|
|
else
|
|
node.target[i] = leaf_copy(child);
|
|
}
|
|
}
|
|
}
|
|
return copy2;
|
|
};
|
|
treeProto.add = add_default;
|
|
treeProto.addAll = addAll;
|
|
treeProto.cover = cover_default;
|
|
treeProto.data = data_default2;
|
|
treeProto.extent = extent_default;
|
|
treeProto.find = find_default;
|
|
treeProto.remove = remove_default3;
|
|
treeProto.removeAll = removeAll;
|
|
treeProto.root = root_default;
|
|
treeProto.size = size_default2;
|
|
treeProto.visit = visit_default;
|
|
treeProto.visitAfter = visitAfter_default;
|
|
treeProto.x = x_default;
|
|
treeProto.y = y_default;
|
|
|
|
// node_modules/d3-force/src/constant.js
|
|
function constant_default5(x3) {
|
|
return function() {
|
|
return x3;
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-force/src/jiggle.js
|
|
function jiggle_default(random) {
|
|
return (random() - 0.5) * 1e-6;
|
|
}
|
|
|
|
// node_modules/d3-force/src/collide.js
|
|
function x(d) {
|
|
return d.x + d.vx;
|
|
}
|
|
function y(d) {
|
|
return d.y + d.vy;
|
|
}
|
|
function collide_default(radius) {
|
|
var nodes, radii, random, strength = 1, iterations = 1;
|
|
if (typeof radius !== "function")
|
|
radius = constant_default5(radius == null ? 1 : +radius);
|
|
function force() {
|
|
var i, n = nodes.length, tree, node, xi, yi, ri, ri2;
|
|
for (var k = 0; k < iterations; ++k) {
|
|
tree = quadtree(nodes, x, y).visitAfter(prepare);
|
|
for (i = 0; i < n; ++i) {
|
|
node = nodes[i];
|
|
ri = radii[node.index], ri2 = ri * ri;
|
|
xi = node.x + node.vx;
|
|
yi = node.y + node.vy;
|
|
tree.visit(apply);
|
|
}
|
|
}
|
|
function apply(quad, x0, y0, x1, y1) {
|
|
var data = quad.data, rj = quad.r, r = ri + rj;
|
|
if (data) {
|
|
if (data.index > node.index) {
|
|
var x3 = xi - data.x - data.vx, y3 = yi - data.y - data.vy, l = x3 * x3 + y3 * y3;
|
|
if (l < r * r) {
|
|
if (x3 === 0)
|
|
x3 = jiggle_default(random), l += x3 * x3;
|
|
if (y3 === 0)
|
|
y3 = jiggle_default(random), l += y3 * y3;
|
|
l = (r - (l = Math.sqrt(l))) / l * strength;
|
|
node.vx += (x3 *= l) * (r = (rj *= rj) / (ri2 + rj));
|
|
node.vy += (y3 *= l) * r;
|
|
data.vx -= x3 * (r = 1 - r);
|
|
data.vy -= y3 * r;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
|
|
}
|
|
}
|
|
function prepare(quad) {
|
|
if (quad.data)
|
|
return quad.r = radii[quad.data.index];
|
|
for (var i = quad.r = 0; i < 4; ++i) {
|
|
if (quad[i] && quad[i].r > quad.r) {
|
|
quad.r = quad[i].r;
|
|
}
|
|
}
|
|
}
|
|
function initialize() {
|
|
if (!nodes)
|
|
return;
|
|
var i, n = nodes.length, node;
|
|
radii = new Array(n);
|
|
for (i = 0; i < n; ++i)
|
|
node = nodes[i], radii[node.index] = +radius(node, i, nodes);
|
|
}
|
|
force.initialize = function(_nodes, _random) {
|
|
nodes = _nodes;
|
|
random = _random;
|
|
initialize();
|
|
};
|
|
force.iterations = function(_) {
|
|
return arguments.length ? (iterations = +_, force) : iterations;
|
|
};
|
|
force.strength = function(_) {
|
|
return arguments.length ? (strength = +_, force) : strength;
|
|
};
|
|
force.radius = function(_) {
|
|
return arguments.length ? (radius = typeof _ === "function" ? _ : constant_default5(+_), initialize(), force) : radius;
|
|
};
|
|
return force;
|
|
}
|
|
|
|
// node_modules/d3-force/src/link.js
|
|
function index(d) {
|
|
return d.index;
|
|
}
|
|
function find2(nodeById, nodeId) {
|
|
var node = nodeById.get(nodeId);
|
|
if (!node)
|
|
throw new Error("node not found: " + nodeId);
|
|
return node;
|
|
}
|
|
function link_default(links) {
|
|
var id2 = index, strength = defaultStrength, strengths, distance = constant_default5(30), distances, nodes, count, bias, random, iterations = 1;
|
|
if (links == null)
|
|
links = [];
|
|
function defaultStrength(link) {
|
|
return 1 / Math.min(count[link.source.index], count[link.target.index]);
|
|
}
|
|
function force(alpha) {
|
|
for (var k = 0, n = links.length; k < iterations; ++k) {
|
|
for (var i = 0, link, source, target, x3, y3, l, b; i < n; ++i) {
|
|
link = links[i], source = link.source, target = link.target;
|
|
x3 = target.x + target.vx - source.x - source.vx || jiggle_default(random);
|
|
y3 = target.y + target.vy - source.y - source.vy || jiggle_default(random);
|
|
l = Math.sqrt(x3 * x3 + y3 * y3);
|
|
l = (l - distances[i]) / l * alpha * strengths[i];
|
|
x3 *= l, y3 *= l;
|
|
target.vx -= x3 * (b = bias[i]);
|
|
target.vy -= y3 * b;
|
|
source.vx += x3 * (b = 1 - b);
|
|
source.vy += y3 * b;
|
|
}
|
|
}
|
|
}
|
|
function initialize() {
|
|
if (!nodes)
|
|
return;
|
|
var i, n = nodes.length, m2 = links.length, nodeById = new Map(nodes.map((d, i2) => [id2(d, i2, nodes), d])), link;
|
|
for (i = 0, count = new Array(n); i < m2; ++i) {
|
|
link = links[i], link.index = i;
|
|
if (typeof link.source !== "object")
|
|
link.source = find2(nodeById, link.source);
|
|
if (typeof link.target !== "object")
|
|
link.target = find2(nodeById, link.target);
|
|
count[link.source.index] = (count[link.source.index] || 0) + 1;
|
|
count[link.target.index] = (count[link.target.index] || 0) + 1;
|
|
}
|
|
for (i = 0, bias = new Array(m2); i < m2; ++i) {
|
|
link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
|
|
}
|
|
strengths = new Array(m2), initializeStrength();
|
|
distances = new Array(m2), initializeDistance();
|
|
}
|
|
function initializeStrength() {
|
|
if (!nodes)
|
|
return;
|
|
for (var i = 0, n = links.length; i < n; ++i) {
|
|
strengths[i] = +strength(links[i], i, links);
|
|
}
|
|
}
|
|
function initializeDistance() {
|
|
if (!nodes)
|
|
return;
|
|
for (var i = 0, n = links.length; i < n; ++i) {
|
|
distances[i] = +distance(links[i], i, links);
|
|
}
|
|
}
|
|
force.initialize = function(_nodes, _random) {
|
|
nodes = _nodes;
|
|
random = _random;
|
|
initialize();
|
|
};
|
|
force.links = function(_) {
|
|
return arguments.length ? (links = _, initialize(), force) : links;
|
|
};
|
|
force.id = function(_) {
|
|
return arguments.length ? (id2 = _, force) : id2;
|
|
};
|
|
force.iterations = function(_) {
|
|
return arguments.length ? (iterations = +_, force) : iterations;
|
|
};
|
|
force.strength = function(_) {
|
|
return arguments.length ? (strength = typeof _ === "function" ? _ : constant_default5(+_), initializeStrength(), force) : strength;
|
|
};
|
|
force.distance = function(_) {
|
|
return arguments.length ? (distance = typeof _ === "function" ? _ : constant_default5(+_), initializeDistance(), force) : distance;
|
|
};
|
|
return force;
|
|
}
|
|
|
|
// node_modules/d3-force/src/lcg.js
|
|
var a = 1664525;
|
|
var c = 1013904223;
|
|
var m = 4294967296;
|
|
function lcg_default() {
|
|
let s = 1;
|
|
return () => (s = (a * s + c) % m) / m;
|
|
}
|
|
|
|
// node_modules/d3-force/src/simulation.js
|
|
function x2(d) {
|
|
return d.x;
|
|
}
|
|
function y2(d) {
|
|
return d.y;
|
|
}
|
|
var initialRadius = 10;
|
|
var initialAngle = Math.PI * (3 - Math.sqrt(5));
|
|
function simulation_default(nodes) {
|
|
var simulation, alpha = 1, alphaMin = 1e-3, alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), alphaTarget = 0, velocityDecay = 0.6, forces = /* @__PURE__ */ new Map(), stepper = timer(step), event = dispatch_default("tick", "end"), random = lcg_default();
|
|
if (nodes == null)
|
|
nodes = [];
|
|
function step() {
|
|
tick();
|
|
event.call("tick", simulation);
|
|
if (alpha < alphaMin) {
|
|
stepper.stop();
|
|
event.call("end", simulation);
|
|
}
|
|
}
|
|
function tick(iterations) {
|
|
var i, n = nodes.length, node;
|
|
if (iterations === void 0)
|
|
iterations = 1;
|
|
for (var k = 0; k < iterations; ++k) {
|
|
alpha += (alphaTarget - alpha) * alphaDecay;
|
|
forces.forEach(function(force) {
|
|
force(alpha);
|
|
});
|
|
for (i = 0; i < n; ++i) {
|
|
node = nodes[i];
|
|
if (node.fx == null)
|
|
node.x += node.vx *= velocityDecay;
|
|
else
|
|
node.x = node.fx, node.vx = 0;
|
|
if (node.fy == null)
|
|
node.y += node.vy *= velocityDecay;
|
|
else
|
|
node.y = node.fy, node.vy = 0;
|
|
}
|
|
}
|
|
return simulation;
|
|
}
|
|
function initializeNodes() {
|
|
for (var i = 0, n = nodes.length, node; i < n; ++i) {
|
|
node = nodes[i], node.index = i;
|
|
if (node.fx != null)
|
|
node.x = node.fx;
|
|
if (node.fy != null)
|
|
node.y = node.fy;
|
|
if (isNaN(node.x) || isNaN(node.y)) {
|
|
var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle;
|
|
node.x = radius * Math.cos(angle);
|
|
node.y = radius * Math.sin(angle);
|
|
}
|
|
if (isNaN(node.vx) || isNaN(node.vy)) {
|
|
node.vx = node.vy = 0;
|
|
}
|
|
}
|
|
}
|
|
function initializeForce(force) {
|
|
if (force.initialize)
|
|
force.initialize(nodes, random);
|
|
return force;
|
|
}
|
|
initializeNodes();
|
|
return simulation = {
|
|
tick,
|
|
restart: function() {
|
|
return stepper.restart(step), simulation;
|
|
},
|
|
stop: function() {
|
|
return stepper.stop(), simulation;
|
|
},
|
|
nodes: function(_) {
|
|
return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes;
|
|
},
|
|
alpha: function(_) {
|
|
return arguments.length ? (alpha = +_, simulation) : alpha;
|
|
},
|
|
alphaMin: function(_) {
|
|
return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
|
|
},
|
|
alphaDecay: function(_) {
|
|
return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
|
|
},
|
|
alphaTarget: function(_) {
|
|
return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
|
|
},
|
|
velocityDecay: function(_) {
|
|
return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
|
|
},
|
|
randomSource: function(_) {
|
|
return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random;
|
|
},
|
|
force: function(name, _) {
|
|
return arguments.length > 1 ? (_ == null ? forces.delete(name) : forces.set(name, initializeForce(_)), simulation) : forces.get(name);
|
|
},
|
|
find: function(x3, y3, radius) {
|
|
var i = 0, n = nodes.length, dx, dy, d2, node, closest;
|
|
if (radius == null)
|
|
radius = Infinity;
|
|
else
|
|
radius *= radius;
|
|
for (i = 0; i < n; ++i) {
|
|
node = nodes[i];
|
|
dx = x3 - node.x;
|
|
dy = y3 - node.y;
|
|
d2 = dx * dx + dy * dy;
|
|
if (d2 < radius)
|
|
closest = node, radius = d2;
|
|
}
|
|
return closest;
|
|
},
|
|
on: function(name, _) {
|
|
return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
|
|
}
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-force/src/manyBody.js
|
|
function manyBody_default() {
|
|
var nodes, node, random, alpha, strength = constant_default5(-30), strengths, distanceMin2 = 1, distanceMax2 = Infinity, theta2 = 0.81;
|
|
function force(_) {
|
|
var i, n = nodes.length, tree = quadtree(nodes, x2, y2).visitAfter(accumulate);
|
|
for (alpha = _, i = 0; i < n; ++i)
|
|
node = nodes[i], tree.visit(apply);
|
|
}
|
|
function initialize() {
|
|
if (!nodes)
|
|
return;
|
|
var i, n = nodes.length, node2;
|
|
strengths = new Array(n);
|
|
for (i = 0; i < n; ++i)
|
|
node2 = nodes[i], strengths[node2.index] = +strength(node2, i, nodes);
|
|
}
|
|
function accumulate(quad) {
|
|
var strength2 = 0, q, c2, weight = 0, x3, y3, i;
|
|
if (quad.length) {
|
|
for (x3 = y3 = i = 0; i < 4; ++i) {
|
|
if ((q = quad[i]) && (c2 = Math.abs(q.value))) {
|
|
strength2 += q.value, weight += c2, x3 += c2 * q.x, y3 += c2 * q.y;
|
|
}
|
|
}
|
|
quad.x = x3 / weight;
|
|
quad.y = y3 / weight;
|
|
} else {
|
|
q = quad;
|
|
q.x = q.data.x;
|
|
q.y = q.data.y;
|
|
do
|
|
strength2 += strengths[q.data.index];
|
|
while (q = q.next);
|
|
}
|
|
quad.value = strength2;
|
|
}
|
|
function apply(quad, x1, _, x22) {
|
|
if (!quad.value)
|
|
return true;
|
|
var x3 = quad.x - node.x, y3 = quad.y - node.y, w = x22 - x1, l = x3 * x3 + y3 * y3;
|
|
if (w * w / theta2 < l) {
|
|
if (l < distanceMax2) {
|
|
if (x3 === 0)
|
|
x3 = jiggle_default(random), l += x3 * x3;
|
|
if (y3 === 0)
|
|
y3 = jiggle_default(random), l += y3 * y3;
|
|
if (l < distanceMin2)
|
|
l = Math.sqrt(distanceMin2 * l);
|
|
node.vx += x3 * quad.value * alpha / l;
|
|
node.vy += y3 * quad.value * alpha / l;
|
|
}
|
|
return true;
|
|
} else if (quad.length || l >= distanceMax2)
|
|
return;
|
|
if (quad.data !== node || quad.next) {
|
|
if (x3 === 0)
|
|
x3 = jiggle_default(random), l += x3 * x3;
|
|
if (y3 === 0)
|
|
y3 = jiggle_default(random), l += y3 * y3;
|
|
if (l < distanceMin2)
|
|
l = Math.sqrt(distanceMin2 * l);
|
|
}
|
|
do
|
|
if (quad.data !== node) {
|
|
w = strengths[quad.data.index] * alpha / l;
|
|
node.vx += x3 * w;
|
|
node.vy += y3 * w;
|
|
}
|
|
while (quad = quad.next);
|
|
}
|
|
force.initialize = function(_nodes, _random) {
|
|
nodes = _nodes;
|
|
random = _random;
|
|
initialize();
|
|
};
|
|
force.strength = function(_) {
|
|
return arguments.length ? (strength = typeof _ === "function" ? _ : constant_default5(+_), initialize(), force) : strength;
|
|
};
|
|
force.distanceMin = function(_) {
|
|
return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
|
|
};
|
|
force.distanceMax = function(_) {
|
|
return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
|
|
};
|
|
force.theta = function(_) {
|
|
return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
|
|
};
|
|
return force;
|
|
}
|
|
|
|
// node_modules/d3-force/src/x.js
|
|
function x_default2(x3) {
|
|
var strength = constant_default5(0.1), nodes, strengths, xz;
|
|
if (typeof x3 !== "function")
|
|
x3 = constant_default5(x3 == null ? 0 : +x3);
|
|
function force(alpha) {
|
|
for (var i = 0, n = nodes.length, node; i < n; ++i) {
|
|
node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
|
|
}
|
|
}
|
|
function initialize() {
|
|
if (!nodes)
|
|
return;
|
|
var i, n = nodes.length;
|
|
strengths = new Array(n);
|
|
xz = new Array(n);
|
|
for (i = 0; i < n; ++i) {
|
|
strengths[i] = isNaN(xz[i] = +x3(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
|
|
}
|
|
}
|
|
force.initialize = function(_) {
|
|
nodes = _;
|
|
initialize();
|
|
};
|
|
force.strength = function(_) {
|
|
return arguments.length ? (strength = typeof _ === "function" ? _ : constant_default5(+_), initialize(), force) : strength;
|
|
};
|
|
force.x = function(_) {
|
|
return arguments.length ? (x3 = typeof _ === "function" ? _ : constant_default5(+_), initialize(), force) : x3;
|
|
};
|
|
return force;
|
|
}
|
|
|
|
// node_modules/d3-force/src/y.js
|
|
function y_default2(y3) {
|
|
var strength = constant_default5(0.1), nodes, strengths, yz;
|
|
if (typeof y3 !== "function")
|
|
y3 = constant_default5(y3 == null ? 0 : +y3);
|
|
function force(alpha) {
|
|
for (var i = 0, n = nodes.length, node; i < n; ++i) {
|
|
node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
|
|
}
|
|
}
|
|
function initialize() {
|
|
if (!nodes)
|
|
return;
|
|
var i, n = nodes.length;
|
|
strengths = new Array(n);
|
|
yz = new Array(n);
|
|
for (i = 0; i < n; ++i) {
|
|
strengths[i] = isNaN(yz[i] = +y3(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
|
|
}
|
|
}
|
|
force.initialize = function(_) {
|
|
nodes = _;
|
|
initialize();
|
|
};
|
|
force.strength = function(_) {
|
|
return arguments.length ? (strength = typeof _ === "function" ? _ : constant_default5(+_), initialize(), force) : strength;
|
|
};
|
|
force.y = function(_) {
|
|
return arguments.length ? (y3 = typeof _ === "function" ? _ : constant_default5(+_), initialize(), force) : y3;
|
|
};
|
|
return force;
|
|
}
|
|
|
|
// node_modules/d3-format/src/formatDecimal.js
|
|
function formatDecimal_default(x3) {
|
|
return Math.abs(x3 = Math.round(x3)) >= 1e21 ? x3.toLocaleString("en").replace(/,/g, "") : x3.toString(10);
|
|
}
|
|
function formatDecimalParts(x3, p) {
|
|
if ((i = (x3 = p ? x3.toExponential(p - 1) : x3.toExponential()).indexOf("e")) < 0)
|
|
return null;
|
|
var i, coefficient = x3.slice(0, i);
|
|
return [
|
|
coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
|
|
+x3.slice(i + 1)
|
|
];
|
|
}
|
|
|
|
// node_modules/d3-format/src/exponent.js
|
|
function exponent_default(x3) {
|
|
return x3 = formatDecimalParts(Math.abs(x3)), x3 ? x3[1] : NaN;
|
|
}
|
|
|
|
// node_modules/d3-format/src/formatGroup.js
|
|
function formatGroup_default(grouping, thousands) {
|
|
return function(value, width) {
|
|
var i = value.length, t = [], j = 0, g = grouping[0], length = 0;
|
|
while (i > 0 && g > 0) {
|
|
if (length + g + 1 > width)
|
|
g = Math.max(1, width - length);
|
|
t.push(value.substring(i -= g, i + g));
|
|
if ((length += g + 1) > width)
|
|
break;
|
|
g = grouping[j = (j + 1) % grouping.length];
|
|
}
|
|
return t.reverse().join(thousands);
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-format/src/formatNumerals.js
|
|
function formatNumerals_default(numerals) {
|
|
return function(value) {
|
|
return value.replace(/[0-9]/g, function(i) {
|
|
return numerals[+i];
|
|
});
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-format/src/formatSpecifier.js
|
|
var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
|
|
function formatSpecifier(specifier) {
|
|
if (!(match = re.exec(specifier)))
|
|
throw new Error("invalid format: " + specifier);
|
|
var match;
|
|
return new FormatSpecifier({
|
|
fill: match[1],
|
|
align: match[2],
|
|
sign: match[3],
|
|
symbol: match[4],
|
|
zero: match[5],
|
|
width: match[6],
|
|
comma: match[7],
|
|
precision: match[8] && match[8].slice(1),
|
|
trim: match[9],
|
|
type: match[10]
|
|
});
|
|
}
|
|
formatSpecifier.prototype = FormatSpecifier.prototype;
|
|
function FormatSpecifier(specifier) {
|
|
this.fill = specifier.fill === void 0 ? " " : specifier.fill + "";
|
|
this.align = specifier.align === void 0 ? ">" : specifier.align + "";
|
|
this.sign = specifier.sign === void 0 ? "-" : specifier.sign + "";
|
|
this.symbol = specifier.symbol === void 0 ? "" : specifier.symbol + "";
|
|
this.zero = !!specifier.zero;
|
|
this.width = specifier.width === void 0 ? void 0 : +specifier.width;
|
|
this.comma = !!specifier.comma;
|
|
this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision;
|
|
this.trim = !!specifier.trim;
|
|
this.type = specifier.type === void 0 ? "" : specifier.type + "";
|
|
}
|
|
FormatSpecifier.prototype.toString = function() {
|
|
return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (this.width === void 0 ? "" : Math.max(1, this.width | 0)) + (this.comma ? "," : "") + (this.precision === void 0 ? "" : "." + Math.max(0, this.precision | 0)) + (this.trim ? "~" : "") + this.type;
|
|
};
|
|
|
|
// node_modules/d3-format/src/formatTrim.js
|
|
function formatTrim_default(s) {
|
|
out:
|
|
for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {
|
|
switch (s[i]) {
|
|
case ".":
|
|
i0 = i1 = i;
|
|
break;
|
|
case "0":
|
|
if (i0 === 0)
|
|
i0 = i;
|
|
i1 = i;
|
|
break;
|
|
default:
|
|
if (!+s[i])
|
|
break out;
|
|
if (i0 > 0)
|
|
i0 = 0;
|
|
break;
|
|
}
|
|
}
|
|
return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
|
|
}
|
|
|
|
// node_modules/d3-format/src/formatPrefixAuto.js
|
|
var prefixExponent;
|
|
function formatPrefixAuto_default(x3, p) {
|
|
var d = formatDecimalParts(x3, p);
|
|
if (!d)
|
|
return x3 + "";
|
|
var coefficient = d[0], exponent = d[1], i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, n = coefficient.length;
|
|
return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join("0") : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) : "0." + new Array(1 - i).join("0") + formatDecimalParts(x3, Math.max(0, p + i - 1))[0];
|
|
}
|
|
|
|
// node_modules/d3-format/src/formatRounded.js
|
|
function formatRounded_default(x3, p) {
|
|
var d = formatDecimalParts(x3, p);
|
|
if (!d)
|
|
return x3 + "";
|
|
var coefficient = d[0], exponent = d[1];
|
|
return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join("0");
|
|
}
|
|
|
|
// node_modules/d3-format/src/formatTypes.js
|
|
var formatTypes_default = {
|
|
"%": (x3, p) => (x3 * 100).toFixed(p),
|
|
"b": (x3) => Math.round(x3).toString(2),
|
|
"c": (x3) => x3 + "",
|
|
"d": formatDecimal_default,
|
|
"e": (x3, p) => x3.toExponential(p),
|
|
"f": (x3, p) => x3.toFixed(p),
|
|
"g": (x3, p) => x3.toPrecision(p),
|
|
"o": (x3) => Math.round(x3).toString(8),
|
|
"p": (x3, p) => formatRounded_default(x3 * 100, p),
|
|
"r": formatRounded_default,
|
|
"s": formatPrefixAuto_default,
|
|
"X": (x3) => Math.round(x3).toString(16).toUpperCase(),
|
|
"x": (x3) => Math.round(x3).toString(16)
|
|
};
|
|
|
|
// node_modules/d3-format/src/identity.js
|
|
function identity_default(x3) {
|
|
return x3;
|
|
}
|
|
|
|
// node_modules/d3-format/src/locale.js
|
|
var map = Array.prototype.map;
|
|
var prefixes = ["y", "z", "a", "f", "p", "n", "\xB5", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"];
|
|
function locale_default(locale2) {
|
|
var group = locale2.grouping === void 0 || locale2.thousands === void 0 ? identity_default : formatGroup_default(map.call(locale2.grouping, Number), locale2.thousands + ""), currencyPrefix = locale2.currency === void 0 ? "" : locale2.currency[0] + "", currencySuffix = locale2.currency === void 0 ? "" : locale2.currency[1] + "", decimal = locale2.decimal === void 0 ? "." : locale2.decimal + "", numerals = locale2.numerals === void 0 ? identity_default : formatNumerals_default(map.call(locale2.numerals, String)), percent = locale2.percent === void 0 ? "%" : locale2.percent + "", minus = locale2.minus === void 0 ? "\u2212" : locale2.minus + "", nan = locale2.nan === void 0 ? "NaN" : locale2.nan + "";
|
|
function newFormat(specifier) {
|
|
specifier = formatSpecifier(specifier);
|
|
var fill = specifier.fill, align = specifier.align, sign = specifier.sign, symbol = specifier.symbol, zero3 = specifier.zero, width = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type2 = specifier.type;
|
|
if (type2 === "n")
|
|
comma = true, type2 = "g";
|
|
else if (!formatTypes_default[type2])
|
|
precision === void 0 && (precision = 12), trim = true, type2 = "g";
|
|
if (zero3 || fill === "0" && align === "=")
|
|
zero3 = true, fill = "0", align = "=";
|
|
var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type2) ? "0" + type2.toLowerCase() : "", suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type2) ? percent : "";
|
|
var formatType = formatTypes_default[type2], maybeSuffix = /[defgprs%]/.test(type2);
|
|
precision = precision === void 0 ? 6 : /[gprs]/.test(type2) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));
|
|
function format2(value) {
|
|
var valuePrefix = prefix, valueSuffix = suffix, i, n, c2;
|
|
if (type2 === "c") {
|
|
valueSuffix = formatType(value) + valueSuffix;
|
|
value = "";
|
|
} else {
|
|
value = +value;
|
|
var valueNegative = value < 0 || 1 / value < 0;
|
|
value = isNaN(value) ? nan : formatType(Math.abs(value), precision);
|
|
if (trim)
|
|
value = formatTrim_default(value);
|
|
if (valueNegative && +value === 0 && sign !== "+")
|
|
valueNegative = false;
|
|
valuePrefix = (valueNegative ? sign === "(" ? sign : minus : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
|
|
valueSuffix = (type2 === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
|
|
if (maybeSuffix) {
|
|
i = -1, n = value.length;
|
|
while (++i < n) {
|
|
if (c2 = value.charCodeAt(i), 48 > c2 || c2 > 57) {
|
|
valueSuffix = (c2 === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
|
|
value = value.slice(0, i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (comma && !zero3)
|
|
value = group(value, Infinity);
|
|
var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : "";
|
|
if (comma && zero3)
|
|
value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
|
|
switch (align) {
|
|
case "<":
|
|
value = valuePrefix + value + valueSuffix + padding;
|
|
break;
|
|
case "=":
|
|
value = valuePrefix + padding + value + valueSuffix;
|
|
break;
|
|
case "^":
|
|
value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);
|
|
break;
|
|
default:
|
|
value = padding + valuePrefix + value + valueSuffix;
|
|
break;
|
|
}
|
|
return numerals(value);
|
|
}
|
|
format2.toString = function() {
|
|
return specifier + "";
|
|
};
|
|
return format2;
|
|
}
|
|
function formatPrefix2(specifier, value) {
|
|
var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), e = Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];
|
|
return function(value2) {
|
|
return f(k * value2) + prefix;
|
|
};
|
|
}
|
|
return {
|
|
format: newFormat,
|
|
formatPrefix: formatPrefix2
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-format/src/defaultLocale.js
|
|
var locale;
|
|
var format;
|
|
var formatPrefix;
|
|
defaultLocale({
|
|
thousands: ",",
|
|
grouping: [3],
|
|
currency: ["$", ""]
|
|
});
|
|
function defaultLocale(definition) {
|
|
locale = locale_default(definition);
|
|
format = locale.format;
|
|
formatPrefix = locale.formatPrefix;
|
|
return locale;
|
|
}
|
|
|
|
// node_modules/d3-format/src/precisionFixed.js
|
|
function precisionFixed_default(step) {
|
|
return Math.max(0, -exponent_default(Math.abs(step)));
|
|
}
|
|
|
|
// node_modules/d3-format/src/precisionPrefix.js
|
|
function precisionPrefix_default(step, value) {
|
|
return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3 - exponent_default(Math.abs(step)));
|
|
}
|
|
|
|
// node_modules/d3-format/src/precisionRound.js
|
|
function precisionRound_default(step, max2) {
|
|
step = Math.abs(step), max2 = Math.abs(max2) - step;
|
|
return Math.max(0, exponent_default(max2) - exponent_default(step)) + 1;
|
|
}
|
|
|
|
// node_modules/d3-scale/src/init.js
|
|
function initRange(domain, range) {
|
|
switch (arguments.length) {
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
this.range(domain);
|
|
break;
|
|
default:
|
|
this.range(range).domain(domain);
|
|
break;
|
|
}
|
|
return this;
|
|
}
|
|
|
|
// node_modules/d3-scale/src/constant.js
|
|
function constants(x3) {
|
|
return function() {
|
|
return x3;
|
|
};
|
|
}
|
|
|
|
// node_modules/d3-scale/src/number.js
|
|
function number3(x3) {
|
|
return +x3;
|
|
}
|
|
|
|
// node_modules/d3-scale/src/continuous.js
|
|
var unit = [0, 1];
|
|
function identity2(x3) {
|
|
return x3;
|
|
}
|
|
function normalize(a2, b) {
|
|
return (b -= a2 = +a2) ? function(x3) {
|
|
return (x3 - a2) / b;
|
|
} : constants(isNaN(b) ? NaN : 0.5);
|
|
}
|
|
function clamper(a2, b) {
|
|
var t;
|
|
if (a2 > b)
|
|
t = a2, a2 = b, b = t;
|
|
return function(x3) {
|
|
return Math.max(a2, Math.min(b, x3));
|
|
};
|
|
}
|
|
function bimap(domain, range, interpolate) {
|
|
var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
|
|
if (d1 < d0)
|
|
d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
|
|
else
|
|
d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
|
|
return function(x3) {
|
|
return r0(d0(x3));
|
|
};
|
|
}
|
|
function polymap(domain, range, interpolate) {
|
|
var j = Math.min(domain.length, range.length) - 1, d = new Array(j), r = new Array(j), i = -1;
|
|
if (domain[j] < domain[0]) {
|
|
domain = domain.slice().reverse();
|
|
range = range.slice().reverse();
|
|
}
|
|
while (++i < j) {
|
|
d[i] = normalize(domain[i], domain[i + 1]);
|
|
r[i] = interpolate(range[i], range[i + 1]);
|
|
}
|
|
return function(x3) {
|
|
var i2 = bisect_default(domain, x3, 1, j) - 1;
|
|
return r[i2](d[i2](x3));
|
|
};
|
|
}
|
|
function copy(source, target) {
|
|
return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());
|
|
}
|
|
function transformer() {
|
|
var domain = unit, range = unit, interpolate = value_default, transform2, untransform, unknown, clamp = identity2, piecewise, output, input;
|
|
function rescale() {
|
|
var n = Math.min(domain.length, range.length);
|
|
if (clamp !== identity2)
|
|
clamp = clamper(domain[0], domain[n - 1]);
|
|
piecewise = n > 2 ? polymap : bimap;
|
|
output = input = null;
|
|
return scale;
|
|
}
|
|
function scale(x3) {
|
|
return x3 == null || isNaN(x3 = +x3) ? unknown : (output || (output = piecewise(domain.map(transform2), range, interpolate)))(transform2(clamp(x3)));
|
|
}
|
|
scale.invert = function(y3) {
|
|
return clamp(untransform((input || (input = piecewise(range, domain.map(transform2), number_default)))(y3)));
|
|
};
|
|
scale.domain = function(_) {
|
|
return arguments.length ? (domain = Array.from(_, number3), rescale()) : domain.slice();
|
|
};
|
|
scale.range = function(_) {
|
|
return arguments.length ? (range = Array.from(_), rescale()) : range.slice();
|
|
};
|
|
scale.rangeRound = function(_) {
|
|
return range = Array.from(_), interpolate = round_default, rescale();
|
|
};
|
|
scale.clamp = function(_) {
|
|
return arguments.length ? (clamp = _ ? true : identity2, rescale()) : clamp !== identity2;
|
|
};
|
|
scale.interpolate = function(_) {
|
|
return arguments.length ? (interpolate = _, rescale()) : interpolate;
|
|
};
|
|
scale.unknown = function(_) {
|
|
return arguments.length ? (unknown = _, scale) : unknown;
|
|
};
|
|
return function(t, u) {
|
|
transform2 = t, untransform = u;
|
|
return rescale();
|
|
};
|
|
}
|
|
function continuous() {
|
|
return transformer()(identity2, identity2);
|
|
}
|
|
|
|
// node_modules/d3-scale/src/tickFormat.js
|
|
function tickFormat(start2, stop, count, specifier) {
|
|
var step = tickStep(start2, stop, count), precision;
|
|
specifier = formatSpecifier(specifier == null ? ",f" : specifier);
|
|
switch (specifier.type) {
|
|
case "s": {
|
|
var value = Math.max(Math.abs(start2), Math.abs(stop));
|
|
if (specifier.precision == null && !isNaN(precision = precisionPrefix_default(step, value)))
|
|
specifier.precision = precision;
|
|
return formatPrefix(specifier, value);
|
|
}
|
|
case "":
|
|
case "e":
|
|
case "g":
|
|
case "p":
|
|
case "r": {
|
|
if (specifier.precision == null && !isNaN(precision = precisionRound_default(step, Math.max(Math.abs(start2), Math.abs(stop)))))
|
|
specifier.precision = precision - (specifier.type === "e");
|
|
break;
|
|
}
|
|
case "f":
|
|
case "%": {
|
|
if (specifier.precision == null && !isNaN(precision = precisionFixed_default(step)))
|
|
specifier.precision = precision - (specifier.type === "%") * 2;
|
|
break;
|
|
}
|
|
}
|
|
return format(specifier);
|
|
}
|
|
|
|
// node_modules/d3-scale/src/linear.js
|
|
function linearish(scale) {
|
|
var domain = scale.domain;
|
|
scale.ticks = function(count) {
|
|
var d = domain();
|
|
return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
|
|
};
|
|
scale.tickFormat = function(count, specifier) {
|
|
var d = domain();
|
|
return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
|
|
};
|
|
scale.nice = function(count) {
|
|
if (count == null)
|
|
count = 10;
|
|
var d = domain();
|
|
var i0 = 0;
|
|
var i1 = d.length - 1;
|
|
var start2 = d[i0];
|
|
var stop = d[i1];
|
|
var prestep;
|
|
var step;
|
|
var maxIter = 10;
|
|
if (stop < start2) {
|
|
step = start2, start2 = stop, stop = step;
|
|
step = i0, i0 = i1, i1 = step;
|
|
}
|
|
while (maxIter-- > 0) {
|
|
step = tickIncrement(start2, stop, count);
|
|
if (step === prestep) {
|
|
d[i0] = start2;
|
|
d[i1] = stop;
|
|
return domain(d);
|
|
} else if (step > 0) {
|
|
start2 = Math.floor(start2 / step) * step;
|
|
stop = Math.ceil(stop / step) * step;
|
|
} else if (step < 0) {
|
|
start2 = Math.ceil(start2 * step) / step;
|
|
stop = Math.floor(stop * step) / step;
|
|
} else {
|
|
break;
|
|
}
|
|
prestep = step;
|
|
}
|
|
return scale;
|
|
};
|
|
return scale;
|
|
}
|
|
function linear2() {
|
|
var scale = continuous();
|
|
scale.copy = function() {
|
|
return copy(scale, linear2());
|
|
};
|
|
initRange.apply(scale, arguments);
|
|
return linearish(scale);
|
|
}
|
|
|
|
// node_modules/d3-zoom/src/constant.js
|
|
var constant_default6 = (x3) => () => x3;
|
|
|
|
// node_modules/d3-zoom/src/event.js
|
|
function ZoomEvent(type2, {
|
|
sourceEvent,
|
|
target,
|
|
transform: transform2,
|
|
dispatch: dispatch2
|
|
}) {
|
|
Object.defineProperties(this, {
|
|
type: { value: type2, enumerable: true, configurable: true },
|
|
sourceEvent: { value: sourceEvent, enumerable: true, configurable: true },
|
|
target: { value: target, enumerable: true, configurable: true },
|
|
transform: { value: transform2, enumerable: true, configurable: true },
|
|
_: { value: dispatch2 }
|
|
});
|
|
}
|
|
|
|
// node_modules/d3-zoom/src/transform.js
|
|
function Transform(k, x3, y3) {
|
|
this.k = k;
|
|
this.x = x3;
|
|
this.y = y3;
|
|
}
|
|
Transform.prototype = {
|
|
constructor: Transform,
|
|
scale: function(k) {
|
|
return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
|
|
},
|
|
translate: function(x3, y3) {
|
|
return x3 === 0 & y3 === 0 ? this : new Transform(this.k, this.x + this.k * x3, this.y + this.k * y3);
|
|
},
|
|
apply: function(point) {
|
|
return [point[0] * this.k + this.x, point[1] * this.k + this.y];
|
|
},
|
|
applyX: function(x3) {
|
|
return x3 * this.k + this.x;
|
|
},
|
|
applyY: function(y3) {
|
|
return y3 * this.k + this.y;
|
|
},
|
|
invert: function(location) {
|
|
return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
|
|
},
|
|
invertX: function(x3) {
|
|
return (x3 - this.x) / this.k;
|
|
},
|
|
invertY: function(y3) {
|
|
return (y3 - this.y) / this.k;
|
|
},
|
|
rescaleX: function(x3) {
|
|
return x3.copy().domain(x3.range().map(this.invertX, this).map(x3.invert, x3));
|
|
},
|
|
rescaleY: function(y3) {
|
|
return y3.copy().domain(y3.range().map(this.invertY, this).map(y3.invert, y3));
|
|
},
|
|
toString: function() {
|
|
return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
|
|
}
|
|
};
|
|
var identity3 = new Transform(1, 0, 0);
|
|
transform.prototype = Transform.prototype;
|
|
function transform(node) {
|
|
while (!node.__zoom)
|
|
if (!(node = node.parentNode))
|
|
return identity3;
|
|
return node.__zoom;
|
|
}
|
|
|
|
// node_modules/d3-zoom/src/noevent.js
|
|
function nopropagation3(event) {
|
|
event.stopImmediatePropagation();
|
|
}
|
|
function noevent_default3(event) {
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
}
|
|
|
|
// node_modules/d3-zoom/src/zoom.js
|
|
function defaultFilter2(event) {
|
|
return (!event.ctrlKey || event.type === "wheel") && !event.button;
|
|
}
|
|
function defaultExtent() {
|
|
var e = this;
|
|
if (e instanceof SVGElement) {
|
|
e = e.ownerSVGElement || e;
|
|
if (e.hasAttribute("viewBox")) {
|
|
e = e.viewBox.baseVal;
|
|
return [[e.x, e.y], [e.x + e.width, e.y + e.height]];
|
|
}
|
|
return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];
|
|
}
|
|
return [[0, 0], [e.clientWidth, e.clientHeight]];
|
|
}
|
|
function defaultTransform() {
|
|
return this.__zoom || identity3;
|
|
}
|
|
function defaultWheelDelta(event) {
|
|
return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 2e-3) * (event.ctrlKey ? 10 : 1);
|
|
}
|
|
function defaultTouchable2() {
|
|
return navigator.maxTouchPoints || "ontouchstart" in this;
|
|
}
|
|
function defaultConstrain(transform2, extent, translateExtent) {
|
|
var dx0 = transform2.invertX(extent[0][0]) - translateExtent[0][0], dx1 = transform2.invertX(extent[1][0]) - translateExtent[1][0], dy0 = transform2.invertY(extent[0][1]) - translateExtent[0][1], dy1 = transform2.invertY(extent[1][1]) - translateExtent[1][1];
|
|
return transform2.translate(
|
|
dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
|
|
dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
|
|
);
|
|
}
|
|
function zoom_default2() {
|
|
var filter2 = defaultFilter2, extent = defaultExtent, constrain = defaultConstrain, wheelDelta = defaultWheelDelta, touchable = defaultTouchable2, scaleExtent = [0, Infinity], translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], duration = 250, interpolate = zoom_default, listeners = dispatch_default("start", "zoom", "end"), touchstarting, touchfirst, touchending, touchDelay = 500, wheelDelay = 150, clickDistance2 = 0, tapDistance = 10;
|
|
function zoom(selection2) {
|
|
selection2.property("__zoom", defaultTransform).on("wheel.zoom", wheeled, { passive: false }).on("mousedown.zoom", mousedowned).on("dblclick.zoom", dblclicked).filter(touchable).on("touchstart.zoom", touchstarted).on("touchmove.zoom", touchmoved).on("touchend.zoom touchcancel.zoom", touchended).style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
|
|
}
|
|
zoom.transform = function(collection, transform2, point, event) {
|
|
var selection2 = collection.selection ? collection.selection() : collection;
|
|
selection2.property("__zoom", defaultTransform);
|
|
if (collection !== selection2) {
|
|
schedule(collection, transform2, point, event);
|
|
} else {
|
|
selection2.interrupt().each(function() {
|
|
gesture(this, arguments).event(event).start().zoom(null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end();
|
|
});
|
|
}
|
|
};
|
|
zoom.scaleBy = function(selection2, k, p, event) {
|
|
zoom.scaleTo(selection2, function() {
|
|
var k0 = this.__zoom.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k;
|
|
return k0 * k1;
|
|
}, p, event);
|
|
};
|
|
zoom.scaleTo = function(selection2, k, p, event) {
|
|
zoom.transform(selection2, function() {
|
|
var e = extent.apply(this, arguments), t0 = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, p1 = t0.invert(p0), k1 = typeof k === "function" ? k.apply(this, arguments) : k;
|
|
return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
|
|
}, p, event);
|
|
};
|
|
zoom.translateBy = function(selection2, x3, y3, event) {
|
|
zoom.transform(selection2, function() {
|
|
return constrain(this.__zoom.translate(
|
|
typeof x3 === "function" ? x3.apply(this, arguments) : x3,
|
|
typeof y3 === "function" ? y3.apply(this, arguments) : y3
|
|
), extent.apply(this, arguments), translateExtent);
|
|
}, null, event);
|
|
};
|
|
zoom.translateTo = function(selection2, x3, y3, p, event) {
|
|
zoom.transform(selection2, function() {
|
|
var e = extent.apply(this, arguments), t = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p;
|
|
return constrain(identity3.translate(p0[0], p0[1]).scale(t.k).translate(
|
|
typeof x3 === "function" ? -x3.apply(this, arguments) : -x3,
|
|
typeof y3 === "function" ? -y3.apply(this, arguments) : -y3
|
|
), e, translateExtent);
|
|
}, p, event);
|
|
};
|
|
function scale(transform2, k) {
|
|
k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
|
|
return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y);
|
|
}
|
|
function translate(transform2, p0, p1) {
|
|
var x3 = p0[0] - p1[0] * transform2.k, y3 = p0[1] - p1[1] * transform2.k;
|
|
return x3 === transform2.x && y3 === transform2.y ? transform2 : new Transform(transform2.k, x3, y3);
|
|
}
|
|
function centroid(extent2) {
|
|
return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2];
|
|
}
|
|
function schedule(transition2, transform2, point, event) {
|
|
transition2.on("start.zoom", function() {
|
|
gesture(this, arguments).event(event).start();
|
|
}).on("interrupt.zoom end.zoom", function() {
|
|
gesture(this, arguments).event(event).end();
|
|
}).tween("zoom", function() {
|
|
var that = this, args = arguments, g = gesture(that, args).event(event), e = extent.apply(that, args), p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a2 = that.__zoom, b = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i = interpolate(a2.invert(p).concat(w / a2.k), b.invert(p).concat(w / b.k));
|
|
return function(t) {
|
|
if (t === 1)
|
|
t = b;
|
|
else {
|
|
var l = i(t), k = w / l[2];
|
|
t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k);
|
|
}
|
|
g.zoom(null, t);
|
|
};
|
|
});
|
|
}
|
|
function gesture(that, args, clean) {
|
|
return !clean && that.__zooming || new Gesture(that, args);
|
|
}
|
|
function Gesture(that, args) {
|
|
this.that = that;
|
|
this.args = args;
|
|
this.active = 0;
|
|
this.sourceEvent = null;
|
|
this.extent = extent.apply(that, args);
|
|
this.taps = 0;
|
|
}
|
|
Gesture.prototype = {
|
|
event: function(event) {
|
|
if (event)
|
|
this.sourceEvent = event;
|
|
return this;
|
|
},
|
|
start: function() {
|
|
if (++this.active === 1) {
|
|
this.that.__zooming = this;
|
|
this.emit("start");
|
|
}
|
|
return this;
|
|
},
|
|
zoom: function(key, transform2) {
|
|
if (this.mouse && key !== "mouse")
|
|
this.mouse[1] = transform2.invert(this.mouse[0]);
|
|
if (this.touch0 && key !== "touch")
|
|
this.touch0[1] = transform2.invert(this.touch0[0]);
|
|
if (this.touch1 && key !== "touch")
|
|
this.touch1[1] = transform2.invert(this.touch1[0]);
|
|
this.that.__zoom = transform2;
|
|
this.emit("zoom");
|
|
return this;
|
|
},
|
|
end: function() {
|
|
if (--this.active === 0) {
|
|
delete this.that.__zooming;
|
|
this.emit("end");
|
|
}
|
|
return this;
|
|
},
|
|
emit: function(type2) {
|
|
var d = select_default2(this.that).datum();
|
|
listeners.call(
|
|
type2,
|
|
this.that,
|
|
new ZoomEvent(type2, {
|
|
sourceEvent: this.sourceEvent,
|
|
target: zoom,
|
|
type: type2,
|
|
transform: this.that.__zoom,
|
|
dispatch: listeners
|
|
}),
|
|
d
|
|
);
|
|
}
|
|
};
|
|
function wheeled(event, ...args) {
|
|
if (!filter2.apply(this, arguments))
|
|
return;
|
|
var g = gesture(this, args).event(event), t = this.__zoom, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p = pointer_default(event);
|
|
if (g.wheel) {
|
|
if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
|
|
g.mouse[1] = t.invert(g.mouse[0] = p);
|
|
}
|
|
clearTimeout(g.wheel);
|
|
} else if (t.k === k)
|
|
return;
|
|
else {
|
|
g.mouse = [p, t.invert(p)];
|
|
interrupt_default(this);
|
|
g.start();
|
|
}
|
|
noevent_default3(event);
|
|
g.wheel = setTimeout(wheelidled, wheelDelay);
|
|
g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
|
|
function wheelidled() {
|
|
g.wheel = null;
|
|
g.end();
|
|
}
|
|
}
|
|
function mousedowned(event, ...args) {
|
|
if (touchending || !filter2.apply(this, arguments))
|
|
return;
|
|
var currentTarget = event.currentTarget, g = gesture(this, args, true).event(event), v = select_default2(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), p = pointer_default(event, currentTarget), x0 = event.clientX, y0 = event.clientY;
|
|
nodrag_default(event.view);
|
|
nopropagation3(event);
|
|
g.mouse = [p, this.__zoom.invert(p)];
|
|
interrupt_default(this);
|
|
g.start();
|
|
function mousemoved(event2) {
|
|
noevent_default3(event2);
|
|
if (!g.moved) {
|
|
var dx = event2.clientX - x0, dy = event2.clientY - y0;
|
|
g.moved = dx * dx + dy * dy > clickDistance2;
|
|
}
|
|
g.event(event2).zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer_default(event2, currentTarget), g.mouse[1]), g.extent, translateExtent));
|
|
}
|
|
function mouseupped(event2) {
|
|
v.on("mousemove.zoom mouseup.zoom", null);
|
|
yesdrag(event2.view, g.moved);
|
|
noevent_default3(event2);
|
|
g.event(event2).end();
|
|
}
|
|
}
|
|
function dblclicked(event, ...args) {
|
|
if (!filter2.apply(this, arguments))
|
|
return;
|
|
var t0 = this.__zoom, p0 = pointer_default(event.changedTouches ? event.changedTouches[0] : event, this), p1 = t0.invert(p0), k1 = t0.k * (event.shiftKey ? 0.5 : 2), t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent);
|
|
noevent_default3(event);
|
|
if (duration > 0)
|
|
select_default2(this).transition().duration(duration).call(schedule, t1, p0, event);
|
|
else
|
|
select_default2(this).call(zoom.transform, t1, p0, event);
|
|
}
|
|
function touchstarted(event, ...args) {
|
|
if (!filter2.apply(this, arguments))
|
|
return;
|
|
var touches = event.touches, n = touches.length, g = gesture(this, args, event.changedTouches.length === n).event(event), started, i, t, p;
|
|
nopropagation3(event);
|
|
for (i = 0; i < n; ++i) {
|
|
t = touches[i], p = pointer_default(t, this);
|
|
p = [p, this.__zoom.invert(p), t.identifier];
|
|
if (!g.touch0)
|
|
g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;
|
|
else if (!g.touch1 && g.touch0[2] !== p[2])
|
|
g.touch1 = p, g.taps = 0;
|
|
}
|
|
if (touchstarting)
|
|
touchstarting = clearTimeout(touchstarting);
|
|
if (started) {
|
|
if (g.taps < 2)
|
|
touchfirst = p[0], touchstarting = setTimeout(function() {
|
|
touchstarting = null;
|
|
}, touchDelay);
|
|
interrupt_default(this);
|
|
g.start();
|
|
}
|
|
}
|
|
function touchmoved(event, ...args) {
|
|
if (!this.__zooming)
|
|
return;
|
|
var g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length, i, t, p, l;
|
|
noevent_default3(event);
|
|
for (i = 0; i < n; ++i) {
|
|
t = touches[i], p = pointer_default(t, this);
|
|
if (g.touch0 && g.touch0[2] === t.identifier)
|
|
g.touch0[0] = p;
|
|
else if (g.touch1 && g.touch1[2] === t.identifier)
|
|
g.touch1[0] = p;
|
|
}
|
|
t = g.that.__zoom;
|
|
if (g.touch1) {
|
|
var p0 = g.touch0[0], l0 = g.touch0[1], p1 = g.touch1[0], l1 = g.touch1[1], dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
|
|
t = scale(t, Math.sqrt(dp / dl));
|
|
p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
|
|
l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
|
|
} else if (g.touch0)
|
|
p = g.touch0[0], l = g.touch0[1];
|
|
else
|
|
return;
|
|
g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
|
|
}
|
|
function touchended(event, ...args) {
|
|
if (!this.__zooming)
|
|
return;
|
|
var g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length, i, t;
|
|
nopropagation3(event);
|
|
if (touchending)
|
|
clearTimeout(touchending);
|
|
touchending = setTimeout(function() {
|
|
touchending = null;
|
|
}, touchDelay);
|
|
for (i = 0; i < n; ++i) {
|
|
t = touches[i];
|
|
if (g.touch0 && g.touch0[2] === t.identifier)
|
|
delete g.touch0;
|
|
else if (g.touch1 && g.touch1[2] === t.identifier)
|
|
delete g.touch1;
|
|
}
|
|
if (g.touch1 && !g.touch0)
|
|
g.touch0 = g.touch1, delete g.touch1;
|
|
if (g.touch0)
|
|
g.touch0[1] = this.__zoom.invert(g.touch0[0]);
|
|
else {
|
|
g.end();
|
|
if (g.taps === 2) {
|
|
t = pointer_default(t, this);
|
|
if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {
|
|
var p = select_default2(this).on("dblclick.zoom");
|
|
if (p)
|
|
p.apply(this, arguments);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
zoom.wheelDelta = function(_) {
|
|
return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant_default6(+_), zoom) : wheelDelta;
|
|
};
|
|
zoom.filter = function(_) {
|
|
return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default6(!!_), zoom) : filter2;
|
|
};
|
|
zoom.touchable = function(_) {
|
|
return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default6(!!_), zoom) : touchable;
|
|
};
|
|
zoom.extent = function(_) {
|
|
return arguments.length ? (extent = typeof _ === "function" ? _ : constant_default6([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
|
|
};
|
|
zoom.scaleExtent = function(_) {
|
|
return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
|
|
};
|
|
zoom.translateExtent = function(_) {
|
|
return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];
|
|
};
|
|
zoom.constrain = function(_) {
|
|
return arguments.length ? (constrain = _, zoom) : constrain;
|
|
};
|
|
zoom.duration = function(_) {
|
|
return arguments.length ? (duration = +_, zoom) : duration;
|
|
};
|
|
zoom.interpolate = function(_) {
|
|
return arguments.length ? (interpolate = _, zoom) : interpolate;
|
|
};
|
|
zoom.on = function() {
|
|
var value = listeners.on.apply(listeners, arguments);
|
|
return value === listeners ? zoom : value;
|
|
};
|
|
zoom.clickDistance = function(_) {
|
|
return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
|
|
};
|
|
zoom.tapDistance = function(_) {
|
|
return arguments.length ? (tapDistance = +_, zoom) : tapDistance;
|
|
};
|
|
return zoom;
|
|
}
|
|
|
|
// main.ts
|
|
var import_bootstrap_bundle_min = __toESM(require_bootstrap_bundle_min());
|
|
var DEFAULT_SETTINGS = {
|
|
mySetting: "default"
|
|
};
|
|
var DEFAULT_NETWORK_SETTINGS = {
|
|
scoreThreshold: 0.8,
|
|
nodeSize: 3,
|
|
linkThickness: 0.3,
|
|
repelForce: 400,
|
|
linkForce: 0.4,
|
|
linkDistance: 70,
|
|
centerForce: 0.4
|
|
};
|
|
var MyItemView = class extends import_obsidian.ItemView {
|
|
constructor(leaf) {
|
|
super(leaf);
|
|
this.connectionType = "block";
|
|
// Add a flag to track hover state
|
|
this.significanceScoreThreshold = 0.8;
|
|
this.settingsInstantiated = false;
|
|
this.nodeSize = 3;
|
|
this.linkThickness = 0.3;
|
|
this.repelForce = 400;
|
|
this.linkForce = 0.4;
|
|
this.linkDistance = 70;
|
|
this.centerForce = 0.4;
|
|
this.textFadeThreshold = 1.1;
|
|
this.minScore = 1;
|
|
this.maxScore = 0;
|
|
this.minNodeSize = 3;
|
|
this.maxNodeSize = 6;
|
|
this.minLinkThickness = 0.3;
|
|
this.maxLinkThickness = 4;
|
|
// Add this flag
|
|
this.isCtrlPressed = false;
|
|
this.isDragging = false;
|
|
this.currentNoteKey = "";
|
|
this.isHovering = false;
|
|
}
|
|
getViewType() {
|
|
return "My Item View";
|
|
}
|
|
getDisplayText() {
|
|
return "My Item View";
|
|
}
|
|
getIcon() {
|
|
return "dice";
|
|
}
|
|
// Function to update node appearance based on selection and highlight state
|
|
updateNodeAppearance() {
|
|
this.nodeSelection.transition().duration(500).attr("fill", (d) => {
|
|
if (d.id === this.centralNode.id) {
|
|
return "#7c8594";
|
|
} else if (d.selected) {
|
|
return "#f3ee5d";
|
|
} else if (d.highlighted) {
|
|
return "#d46ebe";
|
|
} else {
|
|
return d.group === "note" ? "#7c8594" : "#926ec9";
|
|
}
|
|
}).attr("stroke", (d) => d.selected ? "#ff0" : "transparent").attr("stroke-width", (d) => d.selected ? 2 : 0.3).attr("opacity", (d) => {
|
|
if (d.id === this.centralNode.id) {
|
|
return 1;
|
|
} else if (d.selected || d.highlighted) {
|
|
return 1;
|
|
} else if (this.isHovering) {
|
|
console.log("opacity low");
|
|
return 0.1;
|
|
} else {
|
|
console.log("opacity up");
|
|
return 1;
|
|
}
|
|
});
|
|
}
|
|
// Function to toggle node selection
|
|
toggleNodeSelection(nodeId) {
|
|
const node = this.nodeSelection.data().find((d) => d.id === nodeId);
|
|
if (node) {
|
|
node.selected = !node.selected;
|
|
this.updateNodeAppearance();
|
|
}
|
|
}
|
|
// Clear all selections
|
|
clearSelections() {
|
|
this.nodeSelection.each((d) => d.selected = false);
|
|
this.updateNodeAppearance();
|
|
}
|
|
highlightNode(node) {
|
|
this.nodeSelection.each((d) => {
|
|
if (d.id !== this.centralNode.id) {
|
|
d.highlighted = d.id === node.id || this.validatedLinks.some((link) => link.source.id === node.id && link.target.id === d.id || link.target.id === node.id && link.source.id === d.id);
|
|
}
|
|
});
|
|
this.updateNodeAppearance();
|
|
this.linkSelection.transition().duration(500).attr("opacity", (d) => d.source.id === node.id || d.target.id === node.id ? 1 : 0.1);
|
|
this.labelSelection.transition().duration(500).attr("opacity", (d) => d.id === node.id || this.validatedLinks.some((link) => link.source.id === node.id && link.target.id === d.id || link.target.id === node.id && link.source.id === d.id) ? 1 : 0.1);
|
|
}
|
|
unhighlightNode() {
|
|
this.nodeSelection.each((d) => {
|
|
if (d.id !== this.centralNode.id && !d.selected) {
|
|
d.highlighted = false;
|
|
}
|
|
});
|
|
this.updateNodeAppearance();
|
|
this.linkSelection.transition().duration(500).attr("opacity", 1);
|
|
this.labelSelection.transition().duration(500).attr("opacity", 1);
|
|
}
|
|
async onOpen() {
|
|
setTimeout(() => {
|
|
let that = this;
|
|
const smartNotes = window.SmartSearch.main.env.smart_notes.items;
|
|
if (Object.keys(smartNotes).length === 0) {
|
|
console.log("No smart notes found.");
|
|
return;
|
|
}
|
|
console.log("SmartNotes:", smartNotes);
|
|
let nodes = [];
|
|
let links = [];
|
|
let connections = [];
|
|
function validateGraphData(nodes2, links2) {
|
|
const nodeIds = new Set(nodes2.map((node2) => node2.id));
|
|
let isValid = true;
|
|
links2.forEach((link2, index2) => {
|
|
if (!nodeIds.has(link2.source)) {
|
|
console.error(`Link at index ${index2} has an invalid source: ${link2.source}`);
|
|
isValid = false;
|
|
}
|
|
if (!nodeIds.has(link2.target)) {
|
|
console.error(`Link at index ${index2} has an invalid target: ${link2.target}`);
|
|
isValid = false;
|
|
}
|
|
});
|
|
nodes2.forEach((node2, index2) => {
|
|
if (!node2.hasOwnProperty("id") || !node2.hasOwnProperty("name") || !node2.hasOwnProperty("group")) {
|
|
console.error(`Node at index ${index2} is missing required properties: ${JSON.stringify(node2)}`);
|
|
isValid = false;
|
|
}
|
|
});
|
|
return isValid;
|
|
}
|
|
const updateConnections = () => {
|
|
nodes = [];
|
|
links = [];
|
|
connections = [];
|
|
this.minScore = 1;
|
|
this.maxScore = 0;
|
|
if (!this.currentNoteKey)
|
|
return;
|
|
this.centralNote = smartNotes[this.currentNoteKey];
|
|
const noteConnections = this.centralNote.find_connections().filter(
|
|
(connection) => connection.score >= this.significanceScoreThreshold
|
|
);
|
|
console.log("central note: ", this.centralNote);
|
|
console.log("note connections: ", this.centralNote.find_connections());
|
|
if (this.centralNote.key && this.centralNote.key.trim() !== "" && !nodes.some((node2) => node2.id === this.centralNote.key)) {
|
|
nodes.push({
|
|
id: this.centralNote.key,
|
|
name: this.centralNote.key,
|
|
group: "note",
|
|
x: Math.random() * 1e3,
|
|
y: Math.random() * 1e3,
|
|
fx: null,
|
|
fy: null,
|
|
selected: false,
|
|
// Add selected property
|
|
highlighted: false
|
|
});
|
|
this.centralNode = nodes[0];
|
|
}
|
|
const filteredConnections = noteConnections.filter((connection) => connection.__proto__.constructor.name === (this.connectionType === "block" ? "SmartBlock" : "SmartNote"));
|
|
filteredConnections.forEach((connection, index2) => {
|
|
if (connection && connection.data && connection.data.key && connection.data.key.trim() !== "") {
|
|
const connectionId = connection.data.key;
|
|
if (!nodes.some((node2) => node2.id === connectionId)) {
|
|
nodes.push({
|
|
id: connectionId,
|
|
name: connectionId,
|
|
group: "block",
|
|
x: Math.random() * 1e3,
|
|
y: Math.random() * 1e3,
|
|
fx: null,
|
|
fy: null,
|
|
selected: false,
|
|
// Add selected property
|
|
highlighted: false
|
|
});
|
|
}
|
|
links.push({
|
|
source: this.centralNote.key,
|
|
target: connectionId,
|
|
value: connection.score || 0
|
|
// Ensure score is defined
|
|
});
|
|
connections.push({
|
|
source: this.centralNote.key,
|
|
target: connectionId,
|
|
score: connection.score || 0
|
|
// Ensure score is defined
|
|
});
|
|
if ((connection && connection.score) > this.maxScore) {
|
|
this.maxScore = connection.score;
|
|
}
|
|
if ((connection && connection.score) < this.minScore) {
|
|
this.minScore = connection.score;
|
|
}
|
|
} else {
|
|
console.warn(`Skipping invalid connection at index ${index2}:`, connection);
|
|
}
|
|
});
|
|
console.log("Nodes after updateConnections:", nodes);
|
|
console.log("Links after updateConnections:", links);
|
|
console.log("Connections after updateConnections:", connections);
|
|
const isValid = validateGraphData(nodes, links);
|
|
if (!isValid) {
|
|
console.error("Graph data validation failed.");
|
|
} else {
|
|
console.log("Graph data validation passed.");
|
|
}
|
|
};
|
|
const width = this.contentEl.clientWidth;
|
|
const height = this.contentEl.clientHeight;
|
|
const svg = select_default2(this.contentEl).append("svg").attr("width", "100%").attr("height", "98%").attr("viewBox", `0 0 ${width} ${height}`).attr("preserveAspectRatio", "xMidYMid meet").call(zoom_default2().scaleExtent([0.1, 10]).on("zoom", (event) => {
|
|
svgGroup.attr("transform", event.transform);
|
|
updateLabelOpacity(event.transform.k);
|
|
}));
|
|
const svgGroup = svg.append("g");
|
|
const startBoxSelection = (event) => {
|
|
if (!this.isCtrlPressed)
|
|
return;
|
|
this.isDragging = true;
|
|
const [x3, y3] = pointer_default(event);
|
|
this.selectionBox = svg.append("rect").attr("class", "selection-box").attr("x", x3).attr("y", y3).attr("width", 0).attr("height", 0).attr("stroke", "#00f").attr("stroke-width", 1).attr("fill", "rgba(0, 0, 255, 0.3)");
|
|
this.nodeSelection.each((d) => {
|
|
d.tempSelected = d.selected;
|
|
});
|
|
};
|
|
const updateBoxSelection = (event) => {
|
|
if (!this.isDragging)
|
|
return;
|
|
const [x3, y3] = pointer_default(event);
|
|
const startX = parseFloat(this.selectionBox.attr("x"));
|
|
const startY = parseFloat(this.selectionBox.attr("y"));
|
|
const newWidth = x3 - startX;
|
|
const newHeight = y3 - startY;
|
|
this.selectionBox.attr("width", Math.abs(newWidth)).attr("height", Math.abs(newHeight)).attr("x", newWidth < 0 ? x3 : startX).attr("y", newHeight < 0 ? y3 : startY);
|
|
const endX = newWidth < 0 ? startX : startX + newWidth;
|
|
const endY = newHeight < 0 ? startY : startY + newHeight;
|
|
const [startXSVG, startYSVG] = pointer_default(event, svg.node());
|
|
const [endXSVG, endYSVG] = pointer_default({ x: endX, y: endY }, svg.node());
|
|
this.nodeSelection.each((d) => {
|
|
const nodeX = d.x;
|
|
const nodeY = d.y;
|
|
if (nodeX >= Math.min(startXSVG, endXSVG) && nodeX <= Math.max(startXSVG, endXSVG) && nodeY >= Math.min(startYSVG, endYSVG) && nodeY <= Math.max(startYSVG, endYSVG)) {
|
|
d.selected = true;
|
|
} else {
|
|
d.selected = d.tempSelected;
|
|
}
|
|
});
|
|
this.updateNodeAppearance();
|
|
};
|
|
const endBoxSelection = () => {
|
|
if (!this.isDragging)
|
|
return;
|
|
this.isDragging = false;
|
|
this.selectionBox.remove();
|
|
this.nodeSelection.each((d) => {
|
|
delete d.tempSelected;
|
|
});
|
|
this.updateNodeAppearance();
|
|
};
|
|
svg.on("mousedown", (event) => {
|
|
if (!this.isCtrlPressed) {
|
|
this.clearSelections();
|
|
}
|
|
startBoxSelection(event);
|
|
}).on("mousemove", updateBoxSelection).on("mouseup", endBoxSelection).on("click", function(event) {
|
|
if (!event.defaultPrevented && !that.isCtrlPressed) {
|
|
that.clearSelections();
|
|
}
|
|
});
|
|
const updateLabelOpacity = (zoomLevel) => {
|
|
const maxOpacity = 1;
|
|
const minOpacity = 0;
|
|
const minZoom = 0.1;
|
|
const maxZoom = this.textFadeThreshold;
|
|
let newOpacity = (zoomLevel - minZoom) / (maxZoom - minZoom);
|
|
if (zoomLevel <= minZoom) {
|
|
newOpacity = minOpacity;
|
|
} else if (zoomLevel >= maxZoom) {
|
|
newOpacity = maxOpacity;
|
|
} else {
|
|
newOpacity = (zoomLevel - minZoom) / (maxZoom - minZoom);
|
|
}
|
|
newOpacity = Math.max(minOpacity, Math.min(maxOpacity, newOpacity));
|
|
svgGroup.selectAll(".label").transition().duration(300).attr("opacity", newOpacity);
|
|
};
|
|
const customCenterForce = (alpha) => {
|
|
if (that.centralNode) {
|
|
that.centralNode.x += (width / 2 - that.centralNode.x) * this.centerForce * alpha;
|
|
that.centralNode.y += (height / 2 - that.centralNode.y) * this.centerForce * alpha;
|
|
}
|
|
};
|
|
const customCenterForce2 = (centerX, centerY) => {
|
|
return () => {
|
|
nodes.forEach((node2) => {
|
|
if (node2.id === this.centralNode.id) {
|
|
node2.x += (centerX - node2.x) * 0.1;
|
|
node2.y += (centerY - node2.y) * 0.1;
|
|
}
|
|
});
|
|
};
|
|
};
|
|
function inverseNormalize(value) {
|
|
return 1 - (value - that.minScore) / (that.maxScore - that.minScore);
|
|
}
|
|
const simulation = simulation_default().force("center", null).force("charge", manyBody_default().strength(-DEFAULT_NETWORK_SETTINGS.repelForce)).force("link", link_default().id((d) => d.id).distance((d) => 50 + inverseNormalize(d.score) * 100).strength(1)).force("x", x_default2(width / 2).strength(this.centerForce)).force("y", y_default2(height / 2).strength(this.centerForce)).force("collide", collide_default().radius(DEFAULT_NETWORK_SETTINGS.nodeSize + 3).strength(0.7)).force("customCenter", customCenterForce2(width / 2, height / 2));
|
|
updateConnections();
|
|
let link = svgGroup.append("g").attr("class", "links").selectAll("line").data(links).enter().append("line").attr("stroke", "blue").attr("stroke-width", 2).attr("stroke-opacity", 1);
|
|
let node = svgGroup.append("g").attr("class", "nodes").selectAll("circle").data(nodes).enter().append("circle").attr("r", 20).attr("fill", "blue").call(drag_default().on("start", (event, d) => {
|
|
if (!event.active)
|
|
simulation.alphaTarget(0.3).restart();
|
|
d.fx = d.x;
|
|
d.fy = d.y;
|
|
}).on("drag", (event, d) => {
|
|
d.fx = event.x;
|
|
d.fy = event.y;
|
|
}).on("end", (event, d) => {
|
|
if (!event.active)
|
|
simulation.alphaTarget(0);
|
|
}));
|
|
let nodeLabels = svgGroup.append("g").attr("class", "labels").selectAll("text").data(nodes).enter().append("text").attr("dx", 12).attr("dy", ".35em").text((d) => d.name);
|
|
const tooltip = select_default2(this.contentEl).append("div").attr("class", "tooltip").style("position", "absolute").style("visibility", "hidden").style("background", "#333").style("color", "#fff").style("padding", "5px").style("border", "1px solid #444").style("border-radius", "5px");
|
|
link.on("mouseover", function(event, d) {
|
|
tooltip.text(`Significance: ${d.scoretoFixed(3)}`).style("visibility", "visible");
|
|
}).on("mousemove", function(event) {
|
|
const [x3, y3] = pointer_default(event);
|
|
tooltip.style("top", `${y3 + 10}px`).style("left", `${x3 + 10}px`);
|
|
}).on("mouseout", function() {
|
|
tooltip.style("visibility", "hidden");
|
|
});
|
|
const centerNetwork = () => {
|
|
simulation.force("center", center_default(width / 2, height / 2)).alpha(0.3).restart();
|
|
};
|
|
const formatLabel = (path, maxLength = 18) => {
|
|
if (path.includes("#")) {
|
|
const parts = path.split("#");
|
|
path = parts[parts.length - 1];
|
|
const cleanedPath = path.replace(/[\[\]]/g, "");
|
|
return cleanedPath.length > maxLength ? cleanedPath.slice(0, maxLength) + "..." : cleanedPath;
|
|
} else {
|
|
const filename = path.split("/").pop();
|
|
if (filename) {
|
|
const cleanedFilename = filename.replace(/[\[\]]/g, "");
|
|
return cleanedFilename.length > maxLength ? cleanedFilename.slice(0, maxLength) + "..." : cleanedFilename;
|
|
}
|
|
}
|
|
return "";
|
|
};
|
|
const updateVisualization = (newScoreThreshold) => {
|
|
if (this.updatingVisualization) {
|
|
console.log("Update already in progress. Skipping...");
|
|
return;
|
|
} else {
|
|
console.log("Update not in progress . Skipping...");
|
|
}
|
|
console.log("updating");
|
|
if (newScoreThreshold !== void 0) {
|
|
this.significanceScoreThreshold = newScoreThreshold;
|
|
}
|
|
updateConnections();
|
|
const filteredConnections = connections.filter((connection) => connection.score >= this.significanceScoreThreshold);
|
|
let visibleNodes = /* @__PURE__ */ new Set();
|
|
filteredConnections.forEach((connection) => {
|
|
visibleNodes.add(connection.source);
|
|
visibleNodes.add(connection.target);
|
|
});
|
|
const nodesData = Array.from(visibleNodes).map((id2) => {
|
|
const node2 = nodes.find((node3) => node3.id === id2);
|
|
if (node2) {
|
|
return node2;
|
|
} else {
|
|
console.warn(`Node data missing for id ${id2}`);
|
|
return null;
|
|
}
|
|
}).filter(Boolean);
|
|
console.log("Visible Nodes:", nodesData);
|
|
this.validatedLinks = filteredConnections.filter((link2) => {
|
|
const sourceNode = nodesData.find((node2) => node2.id === link2.source);
|
|
const targetNode = nodesData.find((node2) => node2.id === link2.target);
|
|
if (!sourceNode || !targetNode) {
|
|
console.error(`Invalid link found: ${link2.source} -> ${link2.target}`);
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
console.log("Validated Links:", this.validatedLinks);
|
|
if (nodesData.length === 0 || this.validatedLinks.length === 0) {
|
|
console.warn("No nodes or links to display after filtering. Aborting update.");
|
|
return;
|
|
}
|
|
const mainNodeSize = this.maxNodeSize;
|
|
const otherNodeSize = this.minNodeSize;
|
|
if (this.centralNode) {
|
|
this.centralNode.fx = width / 2;
|
|
this.centralNode.fy = height / 2;
|
|
}
|
|
const updateForces = () => {
|
|
simulation.alpha(0.3).restart();
|
|
setTimeout(() => {
|
|
this.updatingVisualization = false;
|
|
simulation.alphaTarget(0).stop();
|
|
}, 2e3);
|
|
};
|
|
this.nodeSelection = svgGroup.select("g.nodes").selectAll("circle").data(nodesData, (d) => d.id).join(
|
|
(enter) => enter.append("circle").attr("class", "node").attr("r", (d) => d.id === this.centralNode.id ? this.nodeSize + 2 : this.nodeSize).attr("fill", (d) => d.selected ? "#f3ee5d" : d.group === "note" ? "#7c8594" : "#926ec9").attr("stroke", (d) => d.selected ? "#ff0" : d.group === "note" ? "#7c8594" : "#926ec9").attr("stroke-width", (d) => d.selected ? 2 : 0.3).attr("opacity", 1).attr("cursor", "pointer").call(
|
|
drag_default().on("start", (event, d) => {
|
|
if (!event.active)
|
|
simulation.alphaTarget(0.3).restart();
|
|
d.fx = d.x;
|
|
d.fy = d.y;
|
|
}).on("drag", (event, d) => {
|
|
d.fx = event.x;
|
|
d.fy = event.y;
|
|
}).on("end", (event, d) => {
|
|
if (!event.active)
|
|
simulation.alphaTarget(0);
|
|
})
|
|
).on("click", function(event, d) {
|
|
console.log("select clicking");
|
|
if (!that.isCtrlPressed) {
|
|
console.log("select clear");
|
|
that.clearSelections();
|
|
}
|
|
d.selected = !d.selected;
|
|
console.log("selecting: ", d.selected);
|
|
that.updateNodeAppearance();
|
|
event.stopPropagation();
|
|
}).on("mouseover", function(event, d) {
|
|
that.isHovering = true;
|
|
if (!d.selected) {
|
|
if (d.id !== that.centralNode.id && !d.highlighted) {
|
|
select_default2(this).transition().duration(500).attr("fill", "#d46ebe");
|
|
}
|
|
that.highlightNode(d);
|
|
}
|
|
select_default2(this).attr("stroke", "#fff");
|
|
svgGroup.select(`text[data-id='${d.id}']`).transition().duration(250).attr("y", d.y + 4);
|
|
event.stopPropagation();
|
|
that.app.workspace.trigger("hover-link", {
|
|
event,
|
|
source: "D3",
|
|
hoverParent: this.parentElement,
|
|
targetEl: this,
|
|
linktext: d.id
|
|
});
|
|
}).on("mouseout", function(event, d) {
|
|
that.isHovering = false;
|
|
if (!d.selected) {
|
|
if (d.id !== that.centralNode.id) {
|
|
select_default2(this).transition().duration(500).attr("fill", d.group === "note" ? "#7c8594" : "#926ec9");
|
|
}
|
|
}
|
|
that.unhighlightNode();
|
|
select_default2(this).attr("stroke", d.selected ? "#ff0" : "transparent");
|
|
svgGroup.select(`text[data-id='${d.id}']`).transition().duration(250).attr("y", d.y);
|
|
}),
|
|
(update) => update.attr("r", (d) => d.id === this.centralNode.id ? this.nodeSize + 2 : this.nodeSize).attr("fill", (d) => d.selected ? "#f3ee5d" : d.group === "note" ? "#7c8594" : "#926ec9").attr("stroke", (d) => d.selected ? "#ff0" : d.group === "note" ? "#7c8594" : "#926ec9").attr("stroke-width", (d) => d.selected ? 2 : 0.3),
|
|
(exit) => exit.remove()
|
|
);
|
|
this.linkSelection = svgGroup.select("g.links").selectAll("line").data(this.validatedLinks, (d) => `${d.source}-${d.target}`).join(
|
|
(enter) => enter.append("line").attr("class", "link").attr("stroke", "#4c7787").attr("stroke-width", (d) => linear2().domain([this.minScore, this.maxScore]).range([this.minLinkThickness, this.maxLinkThickness])(d.score)).attr("stroke-opacity", 1).attr("opacity", 1).on("mouseover", function(event, d) {
|
|
const [x3, y3] = pointer_default(event);
|
|
tooltip.text(`Signficance: ${d.score.toFixed(3)}`).style("visibility", "visible");
|
|
}).on("mousemove", function(event) {
|
|
const [x3, y3] = pointer_default(event);
|
|
tooltip.style("top", `${y3 + 10}px`).style("left", `${x3}px`);
|
|
}).on("mouseout", function() {
|
|
tooltip.style("visibility", "hidden");
|
|
}),
|
|
(update) => update.attr("stroke", "#4c7787").attr("stroke-width", (d) => linear2().domain([this.minScore, this.maxScore]).range([this.minLinkThickness, this.maxLinkThickness])(d.score)).on("mouseover", function(event, d) {
|
|
}).on("mousemove", function(event, d) {
|
|
}).on("mouseout", function() {
|
|
tooltip.style("visibility", "hidden");
|
|
}),
|
|
// Thinner stroke width
|
|
(exit) => exit.remove()
|
|
);
|
|
this.labelSelection = svgGroup.select("g.labels").selectAll("text").data(nodesData, (d) => d.id).join(
|
|
(enter) => enter.append("text").attr("class", "label").attr("dx", 0).attr("font-size", 4).attr("dy", 12).attr("text-anchor", "middle").attr("fill", "#bbb").attr("opacity", 1).text((d) => formatLabel(d.name)),
|
|
(update) => update.attr("dx", 0).attr("dy", 12).attr("text-anchor", "middle").text((d) => formatLabel(d.name)).attr("fill", "#bbb").attr("font-size", 4).attr("opacity", 1),
|
|
// Ensure updated opacity is 1
|
|
(exit) => exit.remove()
|
|
).attr("x", (d) => d.x).attr("y", (d) => d.y);
|
|
simulation.nodes(nodesData);
|
|
simulation.force("link").links(this.validatedLinks);
|
|
simulation.alpha(0.3).alphaTarget(0.05).restart();
|
|
centerNetwork();
|
|
updateForces();
|
|
simulation.on("tick", () => {
|
|
customCenterForce(0.1);
|
|
this.nodeSelection.attr("cx", (d) => d.x).attr("cy", (d) => d.y);
|
|
this.linkSelection.attr("x1", (d) => d.source.x).attr("y1", (d) => d.source.y).attr("x2", (d) => d.target.x).attr("y2", (d) => d.target.y);
|
|
svgGroup.select("g.labels").selectAll("text").data(nodesData, (d) => d.id).join(
|
|
(enter) => enter.append("text").attr("class", "label").attr("dx", 12).attr("dy", ".35em").attr("fill", "#bbb").attr("data-id", (d) => d.id).text((d) => formatLabel(d.name)),
|
|
(update) => update.text((d) => formatLabel(d.name)).attr("fill", "#bbb").attr("data-id", (d) => d.id),
|
|
// Add data-id attribute for easier selection
|
|
(exit) => exit.remove()
|
|
).attr("x", (d) => d.x).attr("y", (d) => d.y);
|
|
updateLabelOpacity(transform(svg.node()).k);
|
|
});
|
|
this.updatingVisualization = true;
|
|
};
|
|
if (!this.settingsInstantiated) {
|
|
let debounce = function(func, wait) {
|
|
let timeout2;
|
|
return function(...args) {
|
|
clearTimeout(timeout2);
|
|
timeout2 = window.setTimeout(() => func.apply(this, args), wait);
|
|
};
|
|
};
|
|
if (document.querySelector(".settings-icon")) {
|
|
console.log("score settings exist");
|
|
return;
|
|
} else {
|
|
console.log("score doesnt");
|
|
}
|
|
const settingsIcon = document.createElement("div");
|
|
settingsIcon.innerHTML = "⚙";
|
|
settingsIcon.classList.add("settings-icon");
|
|
this.contentEl.appendChild(settingsIcon);
|
|
const dropdownArrow = `
|
|
<svg class="dropdown-indicator" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor">
|
|
<path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z"/>
|
|
</svg>`;
|
|
const rightArrow = `
|
|
<svg class="dropdown-indicator" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor">
|
|
<path fill-rule="evenodd" d="M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z"/>
|
|
</svg>`;
|
|
const dropdownMenu = document.createElement("div");
|
|
dropdownMenu.classList.add("dropdown-menu");
|
|
dropdownMenu.innerHTML = `
|
|
<div class="menu-header">
|
|
<div class="icon" id="refresh-icon">↻</div> <!-- Unicode for refresh icon -->
|
|
<div class="icon" id="close-icon">✕</div> <!-- Unicode for X (close) icon -->
|
|
</div>
|
|
<div class="accordion-item">
|
|
<div class="accordion-header">
|
|
<span class="arrow-icon">${rightArrow}</span>Filters
|
|
</div>
|
|
<div class="accordion-content">
|
|
<div class="slider-container">
|
|
<label id="scoreThresholdLabel" for="scoreThreshold">Signficance Threshold: ${this.significanceScoreThreshold}</label>
|
|
<input type="range" id="scoreThreshold" class="slider" name="scoreThreshold" min="0" max="0.99" value="${this.significanceScoreThreshold}" step="0.01">
|
|
</div>
|
|
<label class="settings-item-content-label">Connection Type:</label>
|
|
<div class="radio-container">
|
|
<label>
|
|
<input type="radio" name="connectionType" value="block" ${this.connectionType === "block" ? "checked" : ""}> Block
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="connectionType" value="note" ${this.connectionType === "note" ? "checked" : ""}> Note
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!--
|
|
<div class="accordion-item">
|
|
<div class="accordion-header">
|
|
<span class="arrow-icon">${rightArrow}</span>Groups
|
|
</div>
|
|
<div class="accordion-content">
|
|
<input type="checkbox" id="group1" name="group1" checked>
|
|
<label for="group1">Group 1</label><br>
|
|
<input type="checkbox" id="group2" name="group2" checked>
|
|
<label for="group2">Group 2</label>
|
|
</div>
|
|
</div>
|
|
--!>
|
|
<div class="accordion-item">
|
|
<div class="accordion-header">
|
|
<span class="arrow-icon">${rightArrow}</span>Display
|
|
</div>
|
|
<div class="accordion-content">
|
|
<div class="slider-container">
|
|
<label id="fadeThresholdLabel" for="fadeThreshold"> Text Fade Threshold: ${this.textFadeThreshold}</label>
|
|
<input type="range" id="fadeThreshold" class="slider" name="fadeThreshold" min="0.1" max="10" value="1.2" step="0.01">
|
|
</div>
|
|
<div class="slider-container">
|
|
<label id="nodeSizeLabel" for="nodeSize">Node Size: ${this.nodeSize}</label>
|
|
<input type="range" id="nodeSize" class="slider" name="nodeSize" min="1" max="15" value="${this.nodeSize}" step="0.01">
|
|
</div>
|
|
<div class="slider-container">
|
|
<label id="minLinkThicknessLabel" for="minLinkThickness">Min Link Thickness: ${this.minLinkThickness}</label>
|
|
<input type="range" id="minLinkThickness" class="slider" name="minLinkThickness" min="0.1" max="10" value="${this.minLinkThickness}" step="0.01">
|
|
</div>
|
|
<div class="slider-container">
|
|
<label id="maxLinkThicknessLabel" for="maxLinkThickness">Max Link Thickness: ${this.maxLinkThickness}</label>
|
|
<input type="range" id="maxLinkThickness" class="slider" name="maxLinkThickness" min="0.1" max="10" value="${this.maxLinkThickness}" step="0.01">
|
|
</div>
|
|
<!-- <div class="slider-container">
|
|
<label id="lineThicknessLabel" for="lineThickness">Line Thickness: ${this.linkThickness}</label>
|
|
<input type="range" id="lineThickness" class="slider" name="lineThickness" min="0.1" max="5" value="${this.linkThickness}" step="0.01">
|
|
</div> --!>
|
|
</div>
|
|
</div>
|
|
<div class="accordion-item">
|
|
<div class="accordion-header">
|
|
<span class="arrow-icon">${rightArrow}</span>Forces
|
|
</div>
|
|
<div class="accordion-content">
|
|
<div class="slider-container">
|
|
<label for="centerForce" id="centerForceLabel">Center Force: ${this.centerForce}</label>
|
|
<input type="range" id="centerForce" name="centerForce" class="slider" min="0" max="1" value="${this.centerForce}" step="0.01">
|
|
</div>
|
|
<div class="slider-container">
|
|
<label for="repelForce" id="repelForceLabel">Repel Force: ${this.repelForce}</label>
|
|
<input type="range" id="repelForce" name="repelForce" class="slider" min="0" max="1500" value="${this.repelForce}" step="1">
|
|
</div>
|
|
<div class="slider-container">
|
|
<label for="linkForce" id="linkForceLabel">Link Force: ${this.linkForce}</label>
|
|
<input type="range" id="linkForce" name="linkForce" class="slider" min="0" max="1" value=" ${this.linkForce}" step="0.01">
|
|
</div>
|
|
<label for="linkDistance" id="linkDistanceLabel">Link Distance: ${this.linkDistance}</label>
|
|
<input type="range" id="linkDistance" name="linkDistance" class="slider" min="10" max="200" value="${this.linkDistance}" step="1">
|
|
</div>
|
|
</div>
|
|
`;
|
|
this.contentEl.appendChild(dropdownMenu);
|
|
settingsIcon.addEventListener("click", () => {
|
|
dropdownMenu.classList.toggle("open");
|
|
});
|
|
const accordionHeaders = dropdownMenu.querySelectorAll(".accordion-header");
|
|
accordionHeaders.forEach((header) => {
|
|
header.addEventListener("click", () => {
|
|
const content = header.nextElementSibling;
|
|
const arrowIcon = header.querySelector(".arrow-icon");
|
|
if (content && arrowIcon) {
|
|
content.classList.toggle("show");
|
|
if (content.classList.contains("show")) {
|
|
arrowIcon.innerHTML = dropdownArrow;
|
|
} else {
|
|
arrowIcon.innerHTML = rightArrow;
|
|
}
|
|
}
|
|
});
|
|
});
|
|
const scoreThresholdSlider = document.getElementById("scoreThreshold");
|
|
const scoreThresholdLabel = document.getElementById("scoreThresholdLabel");
|
|
const nodeSizeSlider = document.getElementById("nodeSize");
|
|
const nodeSizeLabel = document.getElementById("nodeSizeLabel");
|
|
const lineThicknessSlider = document.getElementById("lineThickness");
|
|
const lineThicknessLabel = document.getElementById("lineThicknessLabel");
|
|
const centerForceSlider = document.getElementById("centerForce");
|
|
const centerForceLabel = document.getElementById("centerForceLabel");
|
|
const repelForceSlider = document.getElementById("repelForce");
|
|
const repelForceLabel = document.getElementById("repelForceLabel");
|
|
const linkForceSlider = document.getElementById("linkForce");
|
|
const linkForceLabel = document.getElementById("linkForceLabel");
|
|
const linkDistanceSlider = document.getElementById("linkDistance");
|
|
const linkDistanceLabel = document.getElementById("linkDistanceLabel");
|
|
const fadeThresholdSlider = document.getElementById("fadeThreshold");
|
|
const fadeThresholdLabel = document.getElementById("fadeThresholdLabel");
|
|
const minLinkThicknessSlider = document.getElementById("minLinkThickness");
|
|
const minLinkThicknessLabel = document.getElementById("minLinkThicknessLabel");
|
|
const maxLinkThicknessSlider = document.getElementById("maxLinkThickness");
|
|
const maxLinkThicknessLabel = document.getElementById("maxLinkThicknessLabel");
|
|
const connectionTypeRadios = document.querySelectorAll('input[name="connectionType"]');
|
|
if (connectionTypeRadios) {
|
|
connectionTypeRadios.forEach((radio) => {
|
|
radio.addEventListener("change", (event) => {
|
|
this.connectionType = event.target.value;
|
|
updateVisualization();
|
|
});
|
|
});
|
|
}
|
|
if (minLinkThicknessSlider) {
|
|
minLinkThicknessSlider.addEventListener("input", (event) => {
|
|
const newMinLinkThickness = parseFloat(event.target.value);
|
|
if (minLinkThicknessLabel) {
|
|
minLinkThicknessLabel.textContent = `Min Link Thickness: ${newMinLinkThickness}`;
|
|
}
|
|
this.minLinkThickness = newMinLinkThickness;
|
|
updateLinkThickness();
|
|
});
|
|
}
|
|
if (maxLinkThicknessSlider) {
|
|
maxLinkThicknessSlider.addEventListener("input", (event) => {
|
|
const newMaxLinkThickness = parseFloat(event.target.value);
|
|
if (maxLinkThicknessLabel) {
|
|
maxLinkThicknessLabel.textContent = `Max Link Thickness: ${newMaxLinkThickness}`;
|
|
}
|
|
this.maxLinkThickness = newMaxLinkThickness;
|
|
updateLinkThickness();
|
|
});
|
|
}
|
|
if (fadeThresholdSlider) {
|
|
fadeThresholdSlider.addEventListener("input", (event) => {
|
|
const newFadeThreshold = parseFloat(event.target.value);
|
|
if (fadeThresholdLabel) {
|
|
fadeThresholdLabel.textContent = `Fade Threshold: ${newFadeThreshold}`;
|
|
}
|
|
this.textFadeThreshold = newFadeThreshold;
|
|
updateLabelOpacity(transform(svg.node()).k);
|
|
});
|
|
}
|
|
if (centerForceSlider) {
|
|
centerForceSlider.addEventListener("input", (event) => {
|
|
const newCenterForce = parseFloat(event.target.value);
|
|
if (centerForceLabel) {
|
|
centerForceLabel.textContent = `Center Force: ${newCenterForce}`;
|
|
}
|
|
updateCenterForce(newCenterForce);
|
|
});
|
|
}
|
|
if (repelForceSlider) {
|
|
repelForceSlider.addEventListener("input", (event) => {
|
|
const newRepelForce = parseFloat(event.target.value);
|
|
if (repelForceLabel) {
|
|
repelForceLabel.textContent = `Repel Force: ${newRepelForce}`;
|
|
}
|
|
updateRepelForce(newRepelForce);
|
|
});
|
|
}
|
|
if (linkForceSlider) {
|
|
linkForceSlider.addEventListener("input", (event) => {
|
|
const newLinkForce = parseFloat(event.target.value);
|
|
if (linkForceLabel) {
|
|
linkForceLabel.textContent = `Link Force: ${newLinkForce}`;
|
|
}
|
|
updateLinkForce(newLinkForce);
|
|
});
|
|
}
|
|
if (linkDistanceSlider) {
|
|
linkDistanceSlider.addEventListener("input", (event) => {
|
|
const newLinkDistance = parseFloat(event.target.value);
|
|
if (linkDistanceLabel) {
|
|
linkDistanceLabel.textContent = `Link Distance: ${newLinkDistance}`;
|
|
}
|
|
updateLinkDistance(newLinkDistance);
|
|
});
|
|
}
|
|
const updateCenterForce = (newCenterForce) => {
|
|
simulation.force("center", null);
|
|
simulation.force("center", center_default(width / 2, height / 2).strength(newCenterForce));
|
|
simulation.alphaTarget(0.3).restart();
|
|
updateForces();
|
|
};
|
|
const updateRepelForce = (newRepelForce) => {
|
|
simulation.force("charge").strength(-newRepelForce);
|
|
simulation.alphaTarget(0.3).restart();
|
|
updateForces();
|
|
};
|
|
const updateLinkThickness = () => {
|
|
const linkStrokeScale = linear2().domain([this.minScore, this.maxScore]).range([this.minLinkThickness, this.maxLinkThickness]);
|
|
this.linkSelection.attr("stroke-width", (d) => linkStrokeScale(d.score));
|
|
};
|
|
const updateLinkForce = (newLinkForce) => {
|
|
simulation.force("link", null);
|
|
simulation.force("link", link_default(this.validatedLinks).id((d) => d.id).strength(newLinkForce).distance(this.linkDistance));
|
|
simulation.alphaTarget(0.3).restart();
|
|
updateForces();
|
|
};
|
|
const updateLinkDistance = (newLinkDistance) => {
|
|
simulation.force("link", null);
|
|
simulation.force("link", link_default(this.validatedLinks).id((d) => d.id).distance(newLinkDistance).strength(this.linkForce));
|
|
simulation.alphaTarget(0.3).restart();
|
|
updateForces();
|
|
};
|
|
const updateForces = () => {
|
|
simulation.alpha(0.3).restart();
|
|
setTimeout(() => {
|
|
simulation.alphaTarget(0).stop();
|
|
}, 2e3);
|
|
};
|
|
const updateNodeSizes = () => {
|
|
this.nodeSelection.attr("r", (d) => d.id === this.centralNode.id ? this.nodeSize + 3 : this.nodeSize);
|
|
};
|
|
if (scoreThresholdSlider && !this.settingsInstantiated) {
|
|
scoreThresholdSlider.addEventListener("input", (event) => {
|
|
const newScoreThreshold = parseFloat(event.target.value);
|
|
if (scoreThresholdLabel) {
|
|
scoreThresholdLabel.textContent = `Significance Threshold: ${newScoreThreshold}`;
|
|
}
|
|
});
|
|
const debouncedUpdateVisualization = debounce((event) => {
|
|
const newScoreThreshold = parseFloat(event.target.value);
|
|
updateVisualization(newScoreThreshold);
|
|
}, 500);
|
|
scoreThresholdSlider.addEventListener("input", debouncedUpdateVisualization);
|
|
this.settingsInstantiated = true;
|
|
}
|
|
if (nodeSizeSlider) {
|
|
nodeSizeSlider.addEventListener("input", (event) => {
|
|
const newNodeSize = parseFloat(event.target.value);
|
|
if (nodeSizeLabel) {
|
|
nodeSizeLabel.textContent = `Node Size: ${newNodeSize}`;
|
|
}
|
|
this.nodeSize = newNodeSize;
|
|
updateNodeSizes();
|
|
});
|
|
}
|
|
if (lineThicknessSlider) {
|
|
lineThicknessSlider.addEventListener("input", (event) => {
|
|
console.log("line thicking");
|
|
const newLineThickness = parseFloat(event.target.value);
|
|
this.linkThickness = newLineThickness;
|
|
if (lineThicknessLabel) {
|
|
lineThicknessLabel.textContent = `Line Thickness: ${newLineThickness}`;
|
|
}
|
|
updateLinkThickness();
|
|
});
|
|
}
|
|
const closeIcon = document.getElementById("close-icon");
|
|
if (closeIcon) {
|
|
closeIcon.addEventListener("click", () => {
|
|
console.log("Close icon CLICKED");
|
|
dropdownMenu.classList.remove("open");
|
|
});
|
|
}
|
|
const refreshIcon = document.getElementById("refresh-icon");
|
|
if (refreshIcon) {
|
|
refreshIcon.addEventListener("click", () => {
|
|
console.log("Refresh icon clicked");
|
|
resetToDefault();
|
|
});
|
|
}
|
|
document.addEventListener("keydown", (event) => {
|
|
if (event.key === "Control") {
|
|
this.isCtrlPressed = true;
|
|
svg.style("cursor", "crosshair");
|
|
}
|
|
});
|
|
document.addEventListener("keyup", (event) => {
|
|
if (event.key === "Control") {
|
|
this.isCtrlPressed = false;
|
|
svg.style("cursor", "default");
|
|
}
|
|
});
|
|
const resetToDefault = () => {
|
|
this.significanceScoreThreshold = DEFAULT_NETWORK_SETTINGS.scoreThreshold;
|
|
this.nodeSize = DEFAULT_NETWORK_SETTINGS.nodeSize;
|
|
this.linkThickness = DEFAULT_NETWORK_SETTINGS.linkThickness;
|
|
this.repelForce = DEFAULT_NETWORK_SETTINGS.repelForce;
|
|
this.linkForce = DEFAULT_NETWORK_SETTINGS.linkForce;
|
|
this.linkDistance = DEFAULT_NETWORK_SETTINGS.linkDistance;
|
|
this.centerForce = DEFAULT_NETWORK_SETTINGS.centerForce;
|
|
if (scoreThresholdSlider)
|
|
scoreThresholdSlider.value = `${this.significanceScoreThreshold}`;
|
|
if (scoreThresholdLabel)
|
|
scoreThresholdLabel.textContent = `Significance Threshold: ${this.significanceScoreThreshold}`;
|
|
if (nodeSizeSlider)
|
|
nodeSizeSlider.value = `${this.nodeSize}`;
|
|
if (nodeSizeLabel)
|
|
nodeSizeLabel.textContent = `Node Size: ${this.nodeSize}`;
|
|
if (lineThicknessSlider)
|
|
lineThicknessSlider.value = `${this.linkThickness}`;
|
|
if (lineThicknessLabel)
|
|
lineThicknessLabel.textContent = `Line Thickness: ${this.linkThickness}`;
|
|
if (centerForceSlider)
|
|
centerForceSlider.value = `${this.centerForce}`;
|
|
if (centerForceLabel)
|
|
centerForceLabel.textContent = `Center Force: ${this.centerForce}`;
|
|
if (repelForceSlider)
|
|
repelForceSlider.value = `${this.repelForce}`;
|
|
if (repelForceLabel)
|
|
repelForceLabel.textContent = `Repel Force: ${this.repelForce}`;
|
|
if (linkForceSlider)
|
|
linkForceSlider.value = `${this.linkForce}`;
|
|
if (linkForceLabel)
|
|
linkForceLabel.textContent = `Link Force: ${this.linkForce}`;
|
|
if (linkDistanceSlider)
|
|
linkDistanceSlider.value = `${this.linkDistance}`;
|
|
if (linkDistanceLabel)
|
|
linkDistanceLabel.textContent = `Link Distance: ${this.linkDistance}`;
|
|
if (fadeThresholdSlider)
|
|
fadeThresholdSlider.value = `${this.textFadeThreshold}`;
|
|
if (fadeThresholdLabel)
|
|
fadeThresholdLabel.textContent = `Fade Threshold: ${this.textFadeThreshold}`;
|
|
if (minLinkThicknessSlider)
|
|
minLinkThicknessSlider.value = `${this.minLinkThickness}`;
|
|
if (minLinkThicknessLabel)
|
|
minLinkThicknessLabel.textContent = `Min Link Thickness: ${this.minLinkThickness}`;
|
|
if (maxLinkThicknessSlider)
|
|
maxLinkThicknessSlider.value = `${this.maxLinkThickness}`;
|
|
if (maxLinkThicknessLabel)
|
|
maxLinkThicknessLabel.textContent = `Max Link Thickness: ${this.maxLinkThickness}`;
|
|
updateNodeSizes();
|
|
updateLinkThickness();
|
|
simulation.force("center", center_default(width / 2, height / 2).strength(this.centerForce)).force("charge", manyBody_default().strength(-this.repelForce)).force("link", link_default().id((d) => d.id).strength(this.linkForce).distance(this.linkDistance));
|
|
simulation.alpha(0.3).alphaTarget(0).restart();
|
|
updateVisualization(this.significanceScoreThreshold);
|
|
};
|
|
this.settingsInstantiated = true;
|
|
}
|
|
this.app.workspace.on("file-open", (file) => {
|
|
if (file && this.currentNoteKey !== file.path && !this.isHovering) {
|
|
this.currentNoteKey = file.path;
|
|
console.log("Current Note Key:", this.currentNoteKey);
|
|
updateVisualization();
|
|
}
|
|
});
|
|
updateVisualization();
|
|
}, 1e3);
|
|
}
|
|
};
|
|
var MyPlugin = class extends import_obsidian.Plugin {
|
|
async onload() {
|
|
await this.loadSettings();
|
|
this.registerView("My Item View", (leaf) => new MyItemView(leaf));
|
|
this.registerHoverLinkSource("D3", {
|
|
display: "D3 Hover Link Source",
|
|
defaultMod: true
|
|
});
|
|
const ribbonIconEl = this.addRibbonIcon("dice", "Smart Graph", (evt) => {
|
|
let leaf = this.app.workspace.getLeaf(true);
|
|
leaf.setViewState({
|
|
type: "My Item View",
|
|
active: true
|
|
});
|
|
});
|
|
ribbonIconEl.addClass("my-plugin-ribbon-class");
|
|
const statusBarItemEl = this.addStatusBarItem();
|
|
statusBarItemEl.setText("Status Bar Text");
|
|
this.addCommand({
|
|
id: "open-sample-modal-simple",
|
|
name: "Open sample modal (simple)",
|
|
callback: () => {
|
|
let leaf = this.app.workspace.getLeaf(true);
|
|
leaf.setViewState({
|
|
type: "My Item View",
|
|
active: true
|
|
});
|
|
}
|
|
});
|
|
this.addCommand({
|
|
id: "sample-editor-command",
|
|
name: "Sample editor command",
|
|
callback: () => {
|
|
let leaf = this.app.workspace.getLeaf(true);
|
|
leaf.setViewState({
|
|
type: "My Item View",
|
|
active: true
|
|
});
|
|
}
|
|
});
|
|
this.addCommand({
|
|
id: "open-sample-modal-complex",
|
|
name: "Open sample modal (complex)",
|
|
callback: () => {
|
|
let leaf = this.app.workspace.getLeaf(true);
|
|
leaf.setViewState({
|
|
type: "My Item View",
|
|
active: true
|
|
});
|
|
}
|
|
});
|
|
this.addSettingTab(new SampleSettingTab(this.app, this));
|
|
this.registerDomEvent(document, "click", (evt) => {
|
|
});
|
|
this.registerInterval(window.setInterval(() => console.log("setInterval"), 5 * 60 * 1e3));
|
|
}
|
|
onunload() {
|
|
}
|
|
async loadSettings() {
|
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
|
}
|
|
async saveSettings() {
|
|
await this.saveData(this.settings);
|
|
}
|
|
};
|
|
var SampleSettingTab = class extends import_obsidian.PluginSettingTab {
|
|
constructor(app, plugin) {
|
|
super(app, plugin);
|
|
this.plugin = plugin;
|
|
}
|
|
display() {
|
|
const { containerEl } = this;
|
|
containerEl.empty();
|
|
new import_obsidian.Setting(containerEl).setName("Setting #1").setDesc("It's a secret").addText((text) => text.setPlaceholder("Enter your secret... This will change everything").setValue(this.plugin.settings.mySetting).onChange(async (value) => {
|
|
this.plugin.settings.mySetting = value;
|
|
await this.plugin.saveSettings();
|
|
}));
|
|
}
|
|
};
|
|
/*! Bundled license information:
|
|
|
|
bootstrap/dist/js/bootstrap.bundle.min.js:
|
|
(*!
|
|
* Bootstrap v5.3.3 (https://getbootstrap.com/)
|
|
* Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
*)
|
|
*/
|
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvZG9tL2RhdGEuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9kb20vZXZlbnQtaGFuZGxlci5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9kb20vbWFuaXB1bGF0b3IuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9jb25maWcuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvYmFzZS1jb21wb25lbnQuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvZG9tL3NlbGVjdG9yLWVuZ2luZS5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy91dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvYWxlcnQuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvYnV0dG9uLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvc3dpcGUuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvY2Fyb3VzZWwuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvY29sbGFwc2UuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2VudW1zLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3cuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21hdGguanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3VzZXJBZ2VudC5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzTGF5b3V0Vmlld3BvcnQuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvY29udGFpbnMuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNUYWJsZUVsZW1lbnQuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRQYXJlbnROb2RlLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3dpdGhpbi5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2Fycm93LmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRWYXJpYXRpb24uanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvd1Njcm9sbC5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvd1Njcm9sbEJhclguanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1Njcm9sbFBhcmVudC5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2xpc3RTY3JvbGxQYXJlbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9yZWN0VG9DbGllbnRSZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Vmlld3BvcnRSZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRSZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9jb21wdXRlT2Zmc2V0cy5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvZmxpcC5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2hpZGUuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9vZmZzZXQuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRBbHRBeGlzLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVTY3JvbGwuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRIVE1MRWxlbWVudFNjcm9sbC5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvb3JkZXJNb2RpZmllcnMuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2NyZWF0ZVBvcHBlci5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGVib3VuY2UuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlQnlOYW1lLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9wb3BwZXItbGl0ZS5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2Ryb3Bkb3duLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvYmFja2Ryb3AuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9mb2N1c3RyYXAuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9zY3JvbGxiYXIuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvbW9kYWwuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvb2ZmY2FudmFzLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvc2FuaXRpemVyLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvdGVtcGxhdGUtZmFjdG9yeS5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy90b29sdGlwLmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3BvcG92ZXIuanMiLCAibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvc2Nyb2xsc3B5LmpzIiwgIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3RhYi5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy90b2FzdC5qcyIsICJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2luZGV4LnVtZC5qcyIsICJtYWluLnRzIiwgIm5vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYXNjZW5kaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvZGVzY2VuZGluZy5qcyIsICJub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2Jpc2VjdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbnVtYmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYmlzZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvdGlja3MuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRpc3BhdGNoL3NyYy9kaXNwYXRjaC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2VzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jcmVhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvYXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0b3JBbGwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdEFsbC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9tYXRjaGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RDaGlsZC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGRyZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2ZpbHRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc3BhcnNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbnRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGF0YS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZXhpdC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vam9pbi5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbWVyZ2UuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29yZGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zb3J0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jYWxsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2Rlcy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2l6ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW1wdHkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VhY2guanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2F0dHIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvd2luZG93LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zdHlsZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NsYXNzZWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3RleHQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2h0bWwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JhaXNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9sb3dlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXBwZW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbnNlcnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JlbW92ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xvbmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdHVtLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vbi5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGlzcGF0Y2guanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2l0ZXJhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc291cmNlRXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvcG9pbnRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9ldmVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9kcmFnLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvZXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL2RyYWcuanMiLCAibm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9kZWZpbmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9jb2xvci5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2Jhc2lzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXNDbG9zZWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvcmdiLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyQXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9hcnJheS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2RhdGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9udW1iZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9zdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy92YWx1ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3JvdW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2RlY29tcG9zZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9wYXJzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3pvb20uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lci5qcyIsICJub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVvdXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2NoZWR1bGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2ludGVycnVwdC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2ludGVycnVwdC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90d2Vlbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbnRlcnBvbGF0ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHJUd2Vlbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kZWxheS5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kdXJhdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2VWYXJ5aW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2ZpbHRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9tZXJnZS5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9vbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9yZW1vdmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdEFsbC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGVUd2Vlbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RleHRUd2Vlbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2VuZC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY3ViaWMuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi90cmFuc2l0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2QzLWJydXNoL3NyYy9icnVzaC5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9yY2Uvc3JjL2NlbnRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL2FkZC5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL2NvdmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvZGF0YS5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL2V4dGVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3F1YWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9maW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvcmVtb3ZlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvcm9vdC5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3NpemUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy92aXNpdC5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3Zpc2l0QWZ0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy94LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMveS5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3F1YWR0cmVlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9qaWdnbGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9jb2xsaWRlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvbGluay5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9yY2Uvc3JjL2xjZy5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9yY2Uvc3JjL3NpbXVsYXRpb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9tYW55Qm9keS5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9yY2Uvc3JjL3guanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy95LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdERlY2ltYWwuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZXhwb25lbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0R3JvdXAuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0TnVtZXJhbHMuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0U3BlY2lmaWVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFRyaW0uanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0UHJlZml4QXV0by5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRSb3VuZGVkLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFR5cGVzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2lkZW50aXR5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2xvY2FsZS5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9kZWZhdWx0TG9jYWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL3ByZWNpc2lvbkZpeGVkLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL3ByZWNpc2lvblByZWZpeC5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9wcmVjaXNpb25Sb3VuZC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2luaXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL251bWJlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2NvbnRpbnVvdXMuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy90aWNrRm9ybWF0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvbGluZWFyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvZXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvbm9ldmVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvem9vbS5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRvbS9kYXRhLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBlbGVtZW50TWFwID0gbmV3IE1hcCgpXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc2V0KGVsZW1lbnQsIGtleSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoIWVsZW1lbnRNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50TWFwLnNldChlbGVtZW50LCBuZXcgTWFwKCkpXG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2VNYXAgPSBlbGVtZW50TWFwLmdldChlbGVtZW50KVxuXG4gICAgLy8gbWFrZSBpdCBjbGVhciB3ZSBvbmx5IHdhbnQgb25lIGluc3RhbmNlIHBlciBlbGVtZW50XG4gICAgLy8gY2FuIGJlIHJlbW92ZWQgbGF0ZXIgd2hlbiBtdWx0aXBsZSBrZXkvaW5zdGFuY2VzIGFyZSBmaW5lIHRvIGJlIHVzZWRcbiAgICBpZiAoIWluc3RhbmNlTWFwLmhhcyhrZXkpICYmIGluc3RhbmNlTWFwLnNpemUgIT09IDApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKGBCb290c3RyYXAgZG9lc24ndCBhbGxvdyBtb3JlIHRoYW4gb25lIGluc3RhbmNlIHBlciBlbGVtZW50LiBCb3VuZCBpbnN0YW5jZTogJHtBcnJheS5mcm9tKGluc3RhbmNlTWFwLmtleXMoKSlbMF19LmApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpbnN0YW5jZU1hcC5zZXQoa2V5LCBpbnN0YW5jZSlcbiAgfSxcblxuICBnZXQoZWxlbWVudCwga2V5KSB7XG4gICAgaWYgKGVsZW1lbnRNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gZWxlbWVudE1hcC5nZXQoZWxlbWVudCkuZ2V0KGtleSkgfHwgbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgcmVtb3ZlKGVsZW1lbnQsIGtleSkge1xuICAgIGlmICghZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZWxlbWVudE1hcC5nZXQoZWxlbWVudClcblxuICAgIGluc3RhbmNlTWFwLmRlbGV0ZShrZXkpXG5cbiAgICAvLyBmcmVlIHVwIGVsZW1lbnQgcmVmZXJlbmNlcyBpZiB0aGVyZSBhcmUgbm8gaW5zdGFuY2VzIGxlZnQgZm9yIGFuIGVsZW1lbnRcbiAgICBpZiAoaW5zdGFuY2VNYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgZWxlbWVudE1hcC5kZWxldGUoZWxlbWVudClcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9pbmRleC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNvbnN0IE1BWF9VSUQgPSAxXzAwMF8wMDBcbmNvbnN0IE1JTExJU0VDT05EU19NVUxUSVBMSUVSID0gMTAwMFxuY29uc3QgVFJBTlNJVElPTl9FTkQgPSAndHJhbnNpdGlvbmVuZCdcblxuLyoqXG4gKiBQcm9wZXJseSBlc2NhcGUgSURzIHNlbGVjdG9ycyB0byBoYW5kbGUgd2VpcmQgSURzXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHBhcnNlU2VsZWN0b3IgPSBzZWxlY3RvciA9PiB7XG4gIGlmIChzZWxlY3RvciAmJiB3aW5kb3cuQ1NTICYmIHdpbmRvdy5DU1MuZXNjYXBlKSB7XG4gICAgLy8gZG9jdW1lbnQucXVlcnlTZWxlY3RvciBuZWVkcyBlc2NhcGluZyB0byBoYW5kbGUgSURzIChodG1sNSspIGNvbnRhaW5pbmcgZm9yIGluc3RhbmNlIC9cbiAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoLyMoW15cXHNcIiMnXSspL2csIChtYXRjaCwgaWQpID0+IGAjJHtDU1MuZXNjYXBlKGlkKX1gKVxuICB9XG5cbiAgcmV0dXJuIHNlbGVjdG9yXG59XG5cbi8vIFNob3V0LW91dCBBbmd1cyBDcm9sbCAoaHR0cHM6Ly9nb28uZ2wvcHh3UUdwKVxuY29uc3QgdG9UeXBlID0gb2JqZWN0ID0+IHtcbiAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCBvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgJHtvYmplY3R9YFxuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpLm1hdGNoKC9cXHMoW2Etel0rKS9pKVsxXS50b0xvd2VyQ2FzZSgpXG59XG5cbi8qKlxuICogUHVibGljIFV0aWwgQVBJXG4gKi9cblxuY29uc3QgZ2V0VUlEID0gcHJlZml4ID0+IHtcbiAgZG8ge1xuICAgIHByZWZpeCArPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBNQVhfVUlEKVxuICB9IHdoaWxlIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwcmVmaXgpKVxuXG4gIHJldHVybiBwcmVmaXhcbn1cblxuY29uc3QgZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIC8vIEdldCB0cmFuc2l0aW9uLWR1cmF0aW9uIG9mIHRoZSBlbGVtZW50XG4gIGxldCB7IHRyYW5zaXRpb25EdXJhdGlvbiwgdHJhbnNpdGlvbkRlbGF5IH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuXG4gIGNvbnN0IGZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uID0gTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkR1cmF0aW9uKVxuICBjb25zdCBmbG9hdFRyYW5zaXRpb25EZWxheSA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSlcblxuICAvLyBSZXR1cm4gMCBpZiBlbGVtZW50IG9yIHRyYW5zaXRpb24gZHVyYXRpb24gaXMgbm90IGZvdW5kXG4gIGlmICghZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gJiYgIWZsb2F0VHJhbnNpdGlvbkRlbGF5KSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIC8vIElmIG11bHRpcGxlIGR1cmF0aW9ucyBhcmUgZGVmaW5lZCwgdGFrZSB0aGUgZmlyc3RcbiAgdHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uLnNwbGl0KCcsJylbMF1cbiAgdHJhbnNpdGlvbkRlbGF5ID0gdHJhbnNpdGlvbkRlbGF5LnNwbGl0KCcsJylbMF1cblxuICByZXR1cm4gKE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbikgKyBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpKSAqIE1JTExJU0VDT05EU19NVUxUSVBMSUVSXG59XG5cbmNvbnN0IHRyaWdnZXJUcmFuc2l0aW9uRW5kID0gZWxlbWVudCA9PiB7XG4gIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoVFJBTlNJVElPTl9FTkQpKVxufVxuXG5jb25zdCBpc0VsZW1lbnQgPSBvYmplY3QgPT4ge1xuICBpZiAoIW9iamVjdCB8fCB0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmplY3QuanF1ZXJ5ICE9PSAndW5kZWZpbmVkJykge1xuICAgIG9iamVjdCA9IG9iamVjdFswXVxuICB9XG5cbiAgcmV0dXJuIHR5cGVvZiBvYmplY3Qubm9kZVR5cGUgIT09ICd1bmRlZmluZWQnXG59XG5cbmNvbnN0IGdldEVsZW1lbnQgPSBvYmplY3QgPT4ge1xuICAvLyBpdCdzIGEgalF1ZXJ5IG9iamVjdCBvciBhIG5vZGUgZWxlbWVudFxuICBpZiAoaXNFbGVtZW50KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0LmpxdWVyeSA/IG9iamVjdFswXSA6IG9iamVjdFxuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnICYmIG9iamVjdC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFyc2VTZWxlY3RvcihvYmplY3QpKVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuY29uc3QgaXNWaXNpYmxlID0gZWxlbWVudCA9PiB7XG4gIGlmICghaXNFbGVtZW50KGVsZW1lbnQpIHx8IGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IGVsZW1lbnRJc1Zpc2libGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3Zpc2liaWxpdHknKSA9PT0gJ3Zpc2libGUnXG4gIC8vIEhhbmRsZSBgZGV0YWlsc2AgZWxlbWVudCBhcyBpdHMgY29udGVudCBtYXkgZmFsc2llIGFwcGVhciB2aXNpYmxlIHdoZW4gaXQgaXMgY2xvc2VkXG4gIGNvbnN0IGNsb3NlZERldGFpbHMgPSBlbGVtZW50LmNsb3Nlc3QoJ2RldGFpbHM6bm90KFtvcGVuXSknKVxuXG4gIGlmICghY2xvc2VkRGV0YWlscykge1xuICAgIHJldHVybiBlbGVtZW50SXNWaXNpYmxlXG4gIH1cblxuICBpZiAoY2xvc2VkRGV0YWlscyAhPT0gZWxlbWVudCkge1xuICAgIGNvbnN0IHN1bW1hcnkgPSBlbGVtZW50LmNsb3Nlc3QoJ3N1bW1hcnknKVxuICAgIGlmIChzdW1tYXJ5ICYmIHN1bW1hcnkucGFyZW50Tm9kZSAhPT0gY2xvc2VkRGV0YWlscykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHN1bW1hcnkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50SXNWaXNpYmxlXG59XG5cbmNvbnN0IGlzRGlzYWJsZWQgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAodHlwZW9mIGVsZW1lbnQuZGlzYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuZGlzYWJsZWRcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlzYWJsZWQnKSAhPT0gJ2ZhbHNlJ1xufVxuXG5jb25zdCBmaW5kU2hhZG93Um9vdCA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hdHRhY2hTaGFkb3cpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gQ2FuIGZpbmQgdGhlIHNoYWRvdyByb290IG90aGVyd2lzZSBpdCdsbCByZXR1cm4gdGhlIGRvY3VtZW50XG4gIGlmICh0eXBlb2YgZWxlbWVudC5nZXRSb290Tm9kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKClcbiAgICByZXR1cm4gcm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QgPyByb290IDogbnVsbFxuICB9XG5cbiAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgcmV0dXJuIGVsZW1lbnRcbiAgfVxuXG4gIC8vIHdoZW4gd2UgZG9uJ3QgZmluZCBhIHNoYWRvdyByb290XG4gIGlmICghZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiBmaW5kU2hhZG93Um9vdChlbGVtZW50LnBhcmVudE5vZGUpXG59XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fVxuXG4vKipcbiAqIFRyaWNrIHRvIHJlc3RhcnQgYW4gZWxlbWVudCdzIGFuaW1hdGlvblxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4gdm9pZFxuICpcbiAqIEBzZWUgaHR0cHM6Ly93d3cuY2hhcmlzdGhlby5pby9ibG9nLzIwMjEvMDIvcmVzdGFydC1hLWNzcy1hbmltYXRpb24td2l0aC1qYXZhc2NyaXB0LyNyZXN0YXJ0aW5nLWEtY3NzLWFuaW1hdGlvblxuICovXG5jb25zdCByZWZsb3cgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5vZmZzZXRIZWlnaHQgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbn1cblxuY29uc3QgZ2V0alF1ZXJ5ID0gKCkgPT4ge1xuICBpZiAod2luZG93LmpRdWVyeSAmJiAhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ2RhdGEtYnMtbm8tanF1ZXJ5JykpIHtcbiAgICByZXR1cm4gd2luZG93LmpRdWVyeVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuY29uc3QgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcyA9IFtdXG5cbmNvbnN0IG9uRE9NQ29udGVudExvYWRlZCA9IGNhbGxiYWNrID0+IHtcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIC8vIGFkZCBsaXN0ZW5lciBvbiB0aGUgZmlyc3QgY2FsbCB3aGVuIHRoZSBkb2N1bWVudCBpcyBpbiBsb2FkaW5nIHN0YXRlXG4gICAgaWYgKCFET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIERPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MucHVzaChjYWxsYmFjaylcbiAgfSBlbHNlIHtcbiAgICBjYWxsYmFjaygpXG4gIH1cbn1cblxuY29uc3QgaXNSVEwgPSAoKSA9PiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGlyID09PSAncnRsJ1xuXG5jb25zdCBkZWZpbmVKUXVlcnlQbHVnaW4gPSBwbHVnaW4gPT4ge1xuICBvbkRPTUNvbnRlbnRMb2FkZWQoKCkgPT4ge1xuICAgIGNvbnN0ICQgPSBnZXRqUXVlcnkoKVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICgkKSB7XG4gICAgICBjb25zdCBuYW1lID0gcGx1Z2luLk5BTUVcbiAgICAgIGNvbnN0IEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bbmFtZV1cbiAgICAgICQuZm5bbmFtZV0gPSBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlXG4gICAgICAkLmZuW25hbWVdLkNvbnN0cnVjdG9yID0gcGx1Z2luXG4gICAgICAkLmZuW25hbWVdLm5vQ29uZmxpY3QgPSAoKSA9PiB7XG4gICAgICAgICQuZm5bbmFtZV0gPSBKUVVFUllfTk9fQ09ORkxJQ1RcbiAgICAgICAgcmV0dXJuIHBsdWdpbi5qUXVlcnlJbnRlcmZhY2VcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmNvbnN0IGV4ZWN1dGUgPSAocG9zc2libGVDYWxsYmFjaywgYXJncyA9IFtdLCBkZWZhdWx0VmFsdWUgPSBwb3NzaWJsZUNhbGxiYWNrKSA9PiB7XG4gIHJldHVybiB0eXBlb2YgcG9zc2libGVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IHBvc3NpYmxlQ2FsbGJhY2soLi4uYXJncykgOiBkZWZhdWx0VmFsdWVcbn1cblxuY29uc3QgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiA9IChjYWxsYmFjaywgdHJhbnNpdGlvbkVsZW1lbnQsIHdhaXRGb3JUcmFuc2l0aW9uID0gdHJ1ZSkgPT4ge1xuICBpZiAoIXdhaXRGb3JUcmFuc2l0aW9uKSB7XG4gICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGR1cmF0aW9uUGFkZGluZyA9IDVcbiAgY29uc3QgZW11bGF0ZWREdXJhdGlvbiA9IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRyYW5zaXRpb25FbGVtZW50KSArIGR1cmF0aW9uUGFkZGluZ1xuXG4gIGxldCBjYWxsZWQgPSBmYWxzZVxuXG4gIGNvbnN0IGhhbmRsZXIgPSAoeyB0YXJnZXQgfSkgPT4ge1xuICAgIGlmICh0YXJnZXQgIT09IHRyYW5zaXRpb25FbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjYWxsZWQgPSB0cnVlXG4gICAgdHJhbnNpdGlvbkVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihUUkFOU0lUSU9OX0VORCwgaGFuZGxlcilcbiAgICBleGVjdXRlKGNhbGxiYWNrKVxuICB9XG5cbiAgdHJhbnNpdGlvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihUUkFOU0lUSU9OX0VORCwgaGFuZGxlcilcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgIHRyaWdnZXJUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25FbGVtZW50KVxuICAgIH1cbiAgfSwgZW11bGF0ZWREdXJhdGlvbilcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHByZXZpb3VzL25leHQgZWxlbWVudCBvZiBhIGxpc3QuXG4gKlxuICogQHBhcmFtIHthcnJheX0gbGlzdCAgICBUaGUgbGlzdCBvZiBlbGVtZW50c1xuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnQgICBUaGUgYWN0aXZlIGVsZW1lbnRcbiAqIEBwYXJhbSBzaG91bGRHZXROZXh0ICAgQ2hvb3NlIHRvIGdldCBuZXh0IG9yIHByZXZpb3VzIGVsZW1lbnRcbiAqIEBwYXJhbSBpc0N5Y2xlQWxsb3dlZFxuICogQHJldHVybiB7RWxlbWVudHxlbGVtfSBUaGUgcHJvcGVyIGVsZW1lbnRcbiAqL1xuY29uc3QgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQgPSAobGlzdCwgYWN0aXZlRWxlbWVudCwgc2hvdWxkR2V0TmV4dCwgaXNDeWNsZUFsbG93ZWQpID0+IHtcbiAgY29uc3QgbGlzdExlbmd0aCA9IGxpc3QubGVuZ3RoXG4gIGxldCBpbmRleCA9IGxpc3QuaW5kZXhPZihhY3RpdmVFbGVtZW50KVxuXG4gIC8vIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBsaXN0IHJldHVybiBhbiBlbGVtZW50XG4gIC8vIGRlcGVuZGluZyBvbiB0aGUgZGlyZWN0aW9uIGFuZCBpZiBjeWNsZSBpcyBhbGxvd2VkXG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gIXNob3VsZEdldE5leHQgJiYgaXNDeWNsZUFsbG93ZWQgPyBsaXN0W2xpc3RMZW5ndGggLSAxXSA6IGxpc3RbMF1cbiAgfVxuXG4gIGluZGV4ICs9IHNob3VsZEdldE5leHQgPyAxIDogLTFcblxuICBpZiAoaXNDeWNsZUFsbG93ZWQpIHtcbiAgICBpbmRleCA9IChpbmRleCArIGxpc3RMZW5ndGgpICUgbGlzdExlbmd0aFxuICB9XG5cbiAgcmV0dXJuIGxpc3RbTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIGxpc3RMZW5ndGggLSAxKSldXG59XG5cbmV4cG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgZXhlY3V0ZSxcbiAgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbixcbiAgZmluZFNoYWRvd1Jvb3QsXG4gIGdldEVsZW1lbnQsXG4gIGdldGpRdWVyeSxcbiAgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQsXG4gIGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50LFxuICBnZXRVSUQsXG4gIGlzRGlzYWJsZWQsXG4gIGlzRWxlbWVudCxcbiAgaXNSVEwsXG4gIGlzVmlzaWJsZSxcbiAgbm9vcCxcbiAgb25ET01Db250ZW50TG9hZGVkLFxuICBwYXJzZVNlbGVjdG9yLFxuICByZWZsb3csXG4gIHRyaWdnZXJUcmFuc2l0aW9uRW5kLFxuICB0b1R5cGVcbn1cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL2V2ZW50LWhhbmRsZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBnZXRqUXVlcnkgfSBmcm9tICcuLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IG5hbWVzcGFjZVJlZ2V4ID0gL1teLl0qKD89XFwuLiopXFwufC4qL1xuY29uc3Qgc3RyaXBOYW1lUmVnZXggPSAvXFwuLiovXG5jb25zdCBzdHJpcFVpZFJlZ2V4ID0gLzo6XFxkKyQvXG5jb25zdCBldmVudFJlZ2lzdHJ5ID0ge30gLy8gRXZlbnRzIHN0b3JhZ2VcbmxldCB1aWRFdmVudCA9IDFcbmNvbnN0IGN1c3RvbUV2ZW50cyA9IHtcbiAgbW91c2VlbnRlcjogJ21vdXNlb3ZlcicsXG4gIG1vdXNlbGVhdmU6ICdtb3VzZW91dCdcbn1cblxuY29uc3QgbmF0aXZlRXZlbnRzID0gbmV3IFNldChbXG4gICdjbGljaycsXG4gICdkYmxjbGljaycsXG4gICdtb3VzZXVwJyxcbiAgJ21vdXNlZG93bicsXG4gICdjb250ZXh0bWVudScsXG4gICdtb3VzZXdoZWVsJyxcbiAgJ0RPTU1vdXNlU2Nyb2xsJyxcbiAgJ21vdXNlb3ZlcicsXG4gICdtb3VzZW91dCcsXG4gICdtb3VzZW1vdmUnLFxuICAnc2VsZWN0c3RhcnQnLFxuICAnc2VsZWN0ZW5kJyxcbiAgJ2tleWRvd24nLFxuICAna2V5cHJlc3MnLFxuICAna2V5dXAnLFxuICAnb3JpZW50YXRpb25jaGFuZ2UnLFxuICAndG91Y2hzdGFydCcsXG4gICd0b3VjaG1vdmUnLFxuICAndG91Y2hlbmQnLFxuICAndG91Y2hjYW5jZWwnLFxuICAncG9pbnRlcmRvd24nLFxuICAncG9pbnRlcm1vdmUnLFxuICAncG9pbnRlcnVwJyxcbiAgJ3BvaW50ZXJsZWF2ZScsXG4gICdwb2ludGVyY2FuY2VsJyxcbiAgJ2dlc3R1cmVzdGFydCcsXG4gICdnZXN0dXJlY2hhbmdlJyxcbiAgJ2dlc3R1cmVlbmQnLFxuICAnZm9jdXMnLFxuICAnYmx1cicsXG4gICdjaGFuZ2UnLFxuICAncmVzZXQnLFxuICAnc2VsZWN0JyxcbiAgJ3N1Ym1pdCcsXG4gICdmb2N1c2luJyxcbiAgJ2ZvY3Vzb3V0JyxcbiAgJ2xvYWQnLFxuICAndW5sb2FkJyxcbiAgJ2JlZm9yZXVubG9hZCcsXG4gICdyZXNpemUnLFxuICAnbW92ZScsXG4gICdET01Db250ZW50TG9hZGVkJyxcbiAgJ3JlYWR5c3RhdGVjaGFuZ2UnLFxuICAnZXJyb3InLFxuICAnYWJvcnQnLFxuICAnc2Nyb2xsJ1xuXSlcblxuLyoqXG4gKiBQcml2YXRlIG1ldGhvZHNcbiAqL1xuXG5mdW5jdGlvbiBtYWtlRXZlbnRVaWQoZWxlbWVudCwgdWlkKSB7XG4gIHJldHVybiAodWlkICYmIGAke3VpZH06OiR7dWlkRXZlbnQrK31gKSB8fCBlbGVtZW50LnVpZEV2ZW50IHx8IHVpZEV2ZW50Kytcbn1cblxuZnVuY3Rpb24gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KSB7XG4gIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChlbGVtZW50KVxuXG4gIGVsZW1lbnQudWlkRXZlbnQgPSB1aWRcbiAgZXZlbnRSZWdpc3RyeVt1aWRdID0gZXZlbnRSZWdpc3RyeVt1aWRdIHx8IHt9XG5cbiAgcmV0dXJuIGV2ZW50UmVnaXN0cnlbdWlkXVxufVxuXG5mdW5jdGlvbiBib290c3RyYXBIYW5kbGVyKGVsZW1lbnQsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgaHlkcmF0ZU9iaihldmVudCwgeyBkZWxlZ2F0ZVRhcmdldDogZWxlbWVudCB9KVxuXG4gICAgaWYgKGhhbmRsZXIub25lT2ZmKSB7XG4gICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsIGV2ZW50LnR5cGUsIGZuKVxuICAgIH1cblxuICAgIHJldHVybiBmbi5hcHBseShlbGVtZW50LCBbZXZlbnRdKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyKGVsZW1lbnQsIHNlbGVjdG9yLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgIGNvbnN0IGRvbUVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuXG4gICAgZm9yIChsZXQgeyB0YXJnZXQgfSA9IGV2ZW50OyB0YXJnZXQgJiYgdGFyZ2V0ICE9PSB0aGlzOyB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZSkge1xuICAgICAgZm9yIChjb25zdCBkb21FbGVtZW50IG9mIGRvbUVsZW1lbnRzKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50ICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgaHlkcmF0ZU9iaihldmVudCwgeyBkZWxlZ2F0ZVRhcmdldDogdGFyZ2V0IH0pXG5cbiAgICAgICAgaWYgKGhhbmRsZXIub25lT2ZmKSB7XG4gICAgICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCBldmVudC50eXBlLCBzZWxlY3RvciwgZm4pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGFyZ2V0LCBbZXZlbnRdKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSGFuZGxlcihldmVudHMsIGNhbGxhYmxlLCBkZWxlZ2F0aW9uU2VsZWN0b3IgPSBudWxsKSB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGV2ZW50cylcbiAgICAuZmluZChldmVudCA9PiBldmVudC5jYWxsYWJsZSA9PT0gY2FsbGFibGUgJiYgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yID09PSBkZWxlZ2F0aW9uU2VsZWN0b3IpXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICBjb25zdCBpc0RlbGVnYXRlZCA9IHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJ1xuICAvLyBUT0RPOiB0b29sdGlwIHBhc3NlcyBgZmFsc2VgIGluc3RlYWQgb2Ygc2VsZWN0b3IsIHNvIHdlIG5lZWQgdG8gY2hlY2tcbiAgY29uc3QgY2FsbGFibGUgPSBpc0RlbGVnYXRlZCA/IGRlbGVnYXRpb25GdW5jdGlvbiA6IChoYW5kbGVyIHx8IGRlbGVnYXRpb25GdW5jdGlvbilcbiAgbGV0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChvcmlnaW5hbFR5cGVFdmVudClcblxuICBpZiAoIW5hdGl2ZUV2ZW50cy5oYXModHlwZUV2ZW50KSkge1xuICAgIHR5cGVFdmVudCA9IG9yaWdpbmFsVHlwZUV2ZW50XG4gIH1cblxuICByZXR1cm4gW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XVxufVxuXG5mdW5jdGlvbiBhZGRIYW5kbGVyKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIG9uZU9mZikge1xuICBpZiAodHlwZW9mIG9yaWdpbmFsVHlwZUV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgbGV0IFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF0gPSBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pXG5cbiAgLy8gaW4gY2FzZSBvZiBtb3VzZWVudGVyIG9yIG1vdXNlbGVhdmUgd3JhcCB0aGUgaGFuZGxlciB3aXRoaW4gYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBmb3IgaXRzIERPTSBwb3NpdGlvblxuICAvLyB0aGlzIHByZXZlbnRzIHRoZSBoYW5kbGVyIGZyb20gYmVpbmcgZGlzcGF0Y2hlZCB0aGUgc2FtZSB3YXkgYXMgbW91c2VvdmVyIG9yIG1vdXNlb3V0IGRvZXNcbiAgaWYgKG9yaWdpbmFsVHlwZUV2ZW50IGluIGN1c3RvbUV2ZW50cykge1xuICAgIGNvbnN0IHdyYXBGdW5jdGlvbiA9IGZuID0+IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKCFldmVudC5yZWxhdGVkVGFyZ2V0IHx8IChldmVudC5yZWxhdGVkVGFyZ2V0ICE9PSBldmVudC5kZWxlZ2F0ZVRhcmdldCAmJiAhZXZlbnQuZGVsZWdhdGVUYXJnZXQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYWJsZSA9IHdyYXBGdW5jdGlvbihjYWxsYWJsZSlcbiAgfVxuXG4gIGNvbnN0IGV2ZW50cyA9IGdldEVsZW1lbnRFdmVudHMoZWxlbWVudClcbiAgY29uc3QgaGFuZGxlcnMgPSBldmVudHNbdHlwZUV2ZW50XSB8fCAoZXZlbnRzW3R5cGVFdmVudF0gPSB7fSlcbiAgY29uc3QgcHJldmlvdXNGdW5jdGlvbiA9IGZpbmRIYW5kbGVyKGhhbmRsZXJzLCBjYWxsYWJsZSwgaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbClcblxuICBpZiAocHJldmlvdXNGdW5jdGlvbikge1xuICAgIHByZXZpb3VzRnVuY3Rpb24ub25lT2ZmID0gcHJldmlvdXNGdW5jdGlvbi5vbmVPZmYgJiYgb25lT2ZmXG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChjYWxsYWJsZSwgb3JpZ2luYWxUeXBlRXZlbnQucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKVxuICBjb25zdCBmbiA9IGlzRGVsZWdhdGVkID9cbiAgICBib290c3RyYXBEZWxlZ2F0aW9uSGFuZGxlcihlbGVtZW50LCBoYW5kbGVyLCBjYWxsYWJsZSkgOlxuICAgIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgY2FsbGFibGUpXG5cbiAgZm4uZGVsZWdhdGlvblNlbGVjdG9yID0gaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbFxuICBmbi5jYWxsYWJsZSA9IGNhbGxhYmxlXG4gIGZuLm9uZU9mZiA9IG9uZU9mZlxuICBmbi51aWRFdmVudCA9IHVpZFxuICBoYW5kbGVyc1t1aWRdID0gZm5cblxuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZUV2ZW50LCBmbiwgaXNEZWxlZ2F0ZWQpXG59XG5cbmZ1bmN0aW9uIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25TZWxlY3Rvcikge1xuICBjb25zdCBmbiA9IGZpbmRIYW5kbGVyKGV2ZW50c1t0eXBlRXZlbnRdLCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpXG5cbiAgaWYgKCFmbikge1xuICAgIHJldHVyblxuICB9XG5cbiAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIEJvb2xlYW4oZGVsZWdhdGlvblNlbGVjdG9yKSlcbiAgZGVsZXRlIGV2ZW50c1t0eXBlRXZlbnRdW2ZuLnVpZEV2ZW50XVxufVxuXG5mdW5jdGlvbiByZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIG5hbWVzcGFjZSkge1xuICBjb25zdCBzdG9yZUVsZW1lbnRFdmVudCA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IHt9XG5cbiAgZm9yIChjb25zdCBbaGFuZGxlcktleSwgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgIGlmIChoYW5kbGVyS2V5LmluY2x1ZGVzKG5hbWVzcGFjZSkpIHtcbiAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGV2ZW50LmNhbGxhYmxlLCBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFR5cGVFdmVudChldmVudCkge1xuICAvLyBhbGxvdyB0byBnZXQgdGhlIG5hdGl2ZSBldmVudHMgZnJvbSBuYW1lc3BhY2VkIGV2ZW50cyAoJ2NsaWNrLmJzLmJ1dHRvbicgLS0+ICdjbGljaycpXG4gIGV2ZW50ID0gZXZlbnQucmVwbGFjZShzdHJpcE5hbWVSZWdleCwgJycpXG4gIHJldHVybiBjdXN0b21FdmVudHNbZXZlbnRdIHx8IGV2ZW50XG59XG5cbmNvbnN0IEV2ZW50SGFuZGxlciA9IHtcbiAgb24oZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGFkZEhhbmRsZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgZmFsc2UpXG4gIH0sXG5cbiAgb25lKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIHRydWUpXG4gIH0sXG5cbiAgb2ZmKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBpZiAodHlwZW9mIG9yaWdpbmFsVHlwZUV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XSA9IG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbilcbiAgICBjb25zdCBpbk5hbWVzcGFjZSA9IHR5cGVFdmVudCAhPT0gb3JpZ2luYWxUeXBlRXZlbnRcbiAgICBjb25zdCBldmVudHMgPSBnZXRFbGVtZW50RXZlbnRzKGVsZW1lbnQpXG4gICAgY29uc3Qgc3RvcmVFbGVtZW50RXZlbnQgPSBldmVudHNbdHlwZUV2ZW50XSB8fCB7fVxuICAgIGNvbnN0IGlzTmFtZXNwYWNlID0gb3JpZ2luYWxUeXBlRXZlbnQuc3RhcnRzV2l0aCgnLicpXG5cbiAgICBpZiAodHlwZW9mIGNhbGxhYmxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2ltcGxlc3QgY2FzZTogaGFuZGxlciBpcyBwYXNzZWQsIHJlbW92ZSB0aGF0IGxpc3RlbmVyIE9OTFkuXG4gICAgICBpZiAoIU9iamVjdC5rZXlzKHN0b3JlRWxlbWVudEV2ZW50KS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGNhbGxhYmxlLCBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGlzTmFtZXNwYWNlKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnRFdmVudCBvZiBPYmplY3Qua2V5cyhldmVudHMpKSB7XG4gICAgICAgIHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIGVsZW1lbnRFdmVudCwgb3JpZ2luYWxUeXBlRXZlbnQuc2xpY2UoMSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5SGFuZGxlcnMsIGV2ZW50XSBvZiBPYmplY3QuZW50cmllcyhzdG9yZUVsZW1lbnRFdmVudCkpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJLZXkgPSBrZXlIYW5kbGVycy5yZXBsYWNlKHN0cmlwVWlkUmVnZXgsICcnKVxuXG4gICAgICBpZiAoIWluTmFtZXNwYWNlIHx8IG9yaWdpbmFsVHlwZUV2ZW50LmluY2x1ZGVzKGhhbmRsZXJLZXkpKSB7XG4gICAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGV2ZW50LmNhbGxhYmxlLCBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHRyaWdnZXIoZWxlbWVudCwgZXZlbnQsIGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KClcbiAgICBjb25zdCB0eXBlRXZlbnQgPSBnZXRUeXBlRXZlbnQoZXZlbnQpXG4gICAgY29uc3QgaW5OYW1lc3BhY2UgPSBldmVudCAhPT0gdHlwZUV2ZW50XG5cbiAgICBsZXQgalF1ZXJ5RXZlbnQgPSBudWxsXG4gICAgbGV0IGJ1YmJsZXMgPSB0cnVlXG4gICAgbGV0IG5hdGl2ZURpc3BhdGNoID0gdHJ1ZVxuICAgIGxldCBkZWZhdWx0UHJldmVudGVkID0gZmFsc2VcblxuICAgIGlmIChpbk5hbWVzcGFjZSAmJiAkKSB7XG4gICAgICBqUXVlcnlFdmVudCA9ICQuRXZlbnQoZXZlbnQsIGFyZ3MpXG5cbiAgICAgICQoZWxlbWVudCkudHJpZ2dlcihqUXVlcnlFdmVudClcbiAgICAgIGJ1YmJsZXMgPSAhalF1ZXJ5RXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKVxuICAgICAgbmF0aXZlRGlzcGF0Y2ggPSAhalF1ZXJ5RXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKVxuICAgICAgZGVmYXVsdFByZXZlbnRlZCA9IGpRdWVyeUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpXG4gICAgfVxuXG4gICAgY29uc3QgZXZ0ID0gaHlkcmF0ZU9iaihuZXcgRXZlbnQoZXZlbnQsIHsgYnViYmxlcywgY2FuY2VsYWJsZTogdHJ1ZSB9KSwgYXJncylcblxuICAgIGlmIChkZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgIH1cblxuICAgIGlmIChuYXRpdmVEaXNwYXRjaCkge1xuICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2dClcbiAgICB9XG5cbiAgICBpZiAoZXZ0LmRlZmF1bHRQcmV2ZW50ZWQgJiYgalF1ZXJ5RXZlbnQpIHtcbiAgICAgIGpRdWVyeUV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICB9XG5cbiAgICByZXR1cm4gZXZ0XG4gIH1cbn1cblxuZnVuY3Rpb24gaHlkcmF0ZU9iaihvYmosIG1ldGEgPSB7fSkge1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhKSkge1xuICAgIHRyeSB7XG4gICAgICBvYmpba2V5XSA9IHZhbHVlXG4gICAgfSBjYXRjaCB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG5leHBvcnQgZGVmYXVsdCBFdmVudEhhbmRsZXJcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL21hbmlwdWxhdG9yLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuZnVuY3Rpb24gbm9ybWFsaXplRGF0YSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gTnVtYmVyKHZhbHVlKS50b1N0cmluZygpKSB7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSlcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09ICdudWxsJykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVEYXRhS2V5KGtleSkge1xuICByZXR1cm4ga2V5LnJlcGxhY2UoL1tBLVpdL2csIGNociA9PiBgLSR7Y2hyLnRvTG93ZXJDYXNlKCl9YClcbn1cblxuY29uc3QgTWFuaXB1bGF0b3IgPSB7XG4gIHNldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5LCB2YWx1ZSkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWAsIHZhbHVlKVxuICB9LFxuXG4gIHJlbW92ZURhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5KSB7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYGRhdGEtYnMtJHtub3JtYWxpemVEYXRhS2V5KGtleSl9YClcbiAgfSxcblxuICBnZXREYXRhQXR0cmlidXRlcyhlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge31cbiAgICBjb25zdCBic0tleXMgPSBPYmplY3Qua2V5cyhlbGVtZW50LmRhdGFzZXQpLmZpbHRlcihrZXkgPT4ga2V5LnN0YXJ0c1dpdGgoJ2JzJykgJiYgIWtleS5zdGFydHNXaXRoKCdic0NvbmZpZycpKVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgYnNLZXlzKSB7XG4gICAgICBsZXQgcHVyZUtleSA9IGtleS5yZXBsYWNlKC9eYnMvLCAnJylcbiAgICAgIHB1cmVLZXkgPSBwdXJlS2V5LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgcHVyZUtleS5zbGljZSgxLCBwdXJlS2V5Lmxlbmd0aClcbiAgICAgIGF0dHJpYnV0ZXNbcHVyZUtleV0gPSBub3JtYWxpemVEYXRhKGVsZW1lbnQuZGF0YXNldFtrZXldKVxuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gIH0sXG5cbiAgZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRGF0YShlbGVtZW50LmdldEF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYW5pcHVsYXRvclxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2NvbmZpZy5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuLi9kb20vbWFuaXB1bGF0b3IuanMnXG5pbXBvcnQgeyBpc0VsZW1lbnQsIHRvVHlwZSB9IGZyb20gJy4vaW5kZXguanMnXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIENvbmZpZyB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiB7fVxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBoYXZlIHRvIGltcGxlbWVudCB0aGUgc3RhdGljIG1ldGhvZCBcIk5BTUVcIiwgZm9yIGVhY2ggY29tcG9uZW50IScpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZylcbiAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZylcbiAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9tZXJnZUNvbmZpZ09iaihjb25maWcsIGVsZW1lbnQpIHtcbiAgICBjb25zdCBqc29uQ29uZmlnID0gaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCAnY29uZmlnJykgOiB7fSAvLyB0cnkgdG8gcGFyc2VcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHQsXG4gICAgICAuLi4odHlwZW9mIGpzb25Db25maWcgPT09ICdvYmplY3QnID8ganNvbkNvbmZpZyA6IHt9KSxcbiAgICAgIC4uLihpc0VsZW1lbnQoZWxlbWVudCkgPyBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlcyhlbGVtZW50KSA6IHt9KSxcbiAgICAgIC4uLih0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IHt9KVxuICAgIH1cbiAgfVxuXG4gIF90eXBlQ2hlY2tDb25maWcoY29uZmlnLCBjb25maWdUeXBlcyA9IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpIHtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgZXhwZWN0ZWRUeXBlc10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnVHlwZXMpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wZXJ0eV1cbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGlzRWxlbWVudCh2YWx1ZSkgPyAnZWxlbWVudCcgOiB0b1R5cGUodmFsdWUpXG5cbiAgICAgIGlmICghbmV3IFJlZ0V4cChleHBlY3RlZFR5cGVzKS50ZXN0KHZhbHVlVHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcIiR7cHJvcGVydHl9XCIgcHJvdmlkZWQgdHlwZSBcIiR7dmFsdWVUeXBlfVwiIGJ1dCBleHBlY3RlZCB0eXBlIFwiJHtleHBlY3RlZFR5cGVzfVwiLmBcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb25maWdcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYmFzZS1jb21wb25lbnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgRGF0YSBmcm9tICcuL2RvbS9kYXRhLmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IENvbmZpZyBmcm9tICcuL3V0aWwvY29uZmlnLmpzJ1xuaW1wb3J0IHsgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiwgZ2V0RWxlbWVudCB9IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBWRVJTSU9OID0gJzUuMy4zJ1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBCYXNlQ29tcG9uZW50IGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgZWxlbWVudCA9IGdldEVsZW1lbnQoZWxlbWVudClcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcblxuICAgIERhdGEuc2V0KHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVksIHRoaXMpXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZGlzcG9zZSgpIHtcbiAgICBEYXRhLnJlbW92ZSh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZKVxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpXG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkge1xuICAgICAgdGhpc1twcm9wZXJ0eU5hbWVdID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIF9xdWV1ZUNhbGxiYWNrKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkID0gdHJ1ZSkge1xuICAgIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24oY2FsbGJhY2ssIGVsZW1lbnQsIGlzQW5pbWF0ZWQpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgdGhpcy5fZWxlbWVudClcbiAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZylcbiAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgZ2V0SW5zdGFuY2UoZWxlbWVudCkge1xuICAgIHJldHVybiBEYXRhLmdldChnZXRFbGVtZW50KGVsZW1lbnQpLCB0aGlzLkRBVEFfS0VZKVxuICB9XG5cbiAgc3RhdGljIGdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJbnN0YW5jZShlbGVtZW50KSB8fCBuZXcgdGhpcyhlbGVtZW50LCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGwpXG4gIH1cblxuICBzdGF0aWMgZ2V0IFZFUlNJT04oKSB7XG4gICAgcmV0dXJuIFZFUlNJT05cbiAgfVxuXG4gIHN0YXRpYyBnZXQgREFUQV9LRVkoKSB7XG4gICAgcmV0dXJuIGBicy4ke3RoaXMuTkFNRX1gXG4gIH1cblxuICBzdGF0aWMgZ2V0IEVWRU5UX0tFWSgpIHtcbiAgICByZXR1cm4gYC4ke3RoaXMuREFUQV9LRVl9YFxuICB9XG5cbiAgc3RhdGljIGV2ZW50TmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIGAke25hbWV9JHt0aGlzLkVWRU5UX0tFWX1gXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQmFzZUNvbXBvbmVudFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vc2VsZWN0b3ItZW5naW5lLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IHsgaXNEaXNhYmxlZCwgaXNWaXNpYmxlLCBwYXJzZVNlbGVjdG9yIH0gZnJvbSAnLi4vdXRpbC9pbmRleC5qcydcblxuY29uc3QgZ2V0U2VsZWN0b3IgPSBlbGVtZW50ID0+IHtcbiAgbGV0IHNlbGVjdG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtdGFyZ2V0JylcblxuICBpZiAoIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSAnIycpIHtcbiAgICBsZXQgaHJlZkF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJylcblxuICAgIC8vIFRoZSBvbmx5IHZhbGlkIGNvbnRlbnQgdGhhdCBjb3VsZCBkb3VibGUgYXMgYSBzZWxlY3RvciBhcmUgSURzIG9yIGNsYXNzZXMsXG4gICAgLy8gc28gZXZlcnl0aGluZyBzdGFydGluZyB3aXRoIGAjYCBvciBgLmAuIElmIGEgXCJyZWFsXCIgVVJMIGlzIHVzZWQgYXMgdGhlIHNlbGVjdG9yLFxuICAgIC8vIGBkb2N1bWVudC5xdWVyeVNlbGVjdG9yYCB3aWxsIHJpZ2h0ZnVsbHkgY29tcGxhaW4gaXQgaXMgaW52YWxpZC5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8zMjI3M1xuICAgIGlmICghaHJlZkF0dHJpYnV0ZSB8fCAoIWhyZWZBdHRyaWJ1dGUuaW5jbHVkZXMoJyMnKSAmJiAhaHJlZkF0dHJpYnV0ZS5zdGFydHNXaXRoKCcuJykpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8vIEp1c3QgaW4gY2FzZSBzb21lIENNUyBwdXRzIG91dCBhIGZ1bGwgVVJMIHdpdGggdGhlIGFuY2hvciBhcHBlbmRlZFxuICAgIGlmIChocmVmQXR0cmlidXRlLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyaWJ1dGUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICBocmVmQXR0cmlidXRlID0gYCMke2hyZWZBdHRyaWJ1dGUuc3BsaXQoJyMnKVsxXX1gXG4gICAgfVxuXG4gICAgc2VsZWN0b3IgPSBocmVmQXR0cmlidXRlICYmIGhyZWZBdHRyaWJ1dGUgIT09ICcjJyA/IGhyZWZBdHRyaWJ1dGUudHJpbSgpIDogbnVsbFxuICB9XG5cbiAgcmV0dXJuIHNlbGVjdG9yID8gc2VsZWN0b3Iuc3BsaXQoJywnKS5tYXAoc2VsID0+IHBhcnNlU2VsZWN0b3Ioc2VsKSkuam9pbignLCcpIDogbnVsbFxufVxuXG5jb25zdCBTZWxlY3RvckVuZ2luZSA9IHtcbiAgZmluZChzZWxlY3RvciwgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgIHJldHVybiBbXS5jb25jYXQoLi4uRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbC5jYWxsKGVsZW1lbnQsIHNlbGVjdG9yKSlcbiAgfSxcblxuICBmaW5kT25lKHNlbGVjdG9yLCBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgcmV0dXJuIEVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3IuY2FsbChlbGVtZW50LCBzZWxlY3RvcilcbiAgfSxcblxuICBjaGlsZHJlbihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIHJldHVybiBbXS5jb25jYXQoLi4uZWxlbWVudC5jaGlsZHJlbikuZmlsdGVyKGNoaWxkID0+IGNoaWxkLm1hdGNoZXMoc2VsZWN0b3IpKVxuICB9LFxuXG4gIHBhcmVudHMoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICBjb25zdCBwYXJlbnRzID0gW11cbiAgICBsZXQgYW5jZXN0b3IgPSBlbGVtZW50LnBhcmVudE5vZGUuY2xvc2VzdChzZWxlY3RvcilcblxuICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgcGFyZW50cy5wdXNoKGFuY2VzdG9yKVxuICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlLmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudHNcbiAgfSxcblxuICBwcmV2KGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgbGV0IHByZXZpb3VzID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXG5cbiAgICB3aGlsZSAocHJldmlvdXMpIHtcbiAgICAgIGlmIChwcmV2aW91cy5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICByZXR1cm4gW3ByZXZpb3VzXVxuICAgICAgfVxuXG4gICAgICBwcmV2aW91cyA9IHByZXZpb3VzLnByZXZpb3VzRWxlbWVudFNpYmxpbmdcbiAgICB9XG5cbiAgICByZXR1cm4gW11cbiAgfSxcbiAgLy8gVE9ETzogdGhpcyBpcyBub3cgdW51c2VkOyByZW1vdmUgbGF0ZXIgYWxvbmcgd2l0aCBwcmV2KClcbiAgbmV4dChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGxldCBuZXh0ID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmdcblxuICAgIHdoaWxlIChuZXh0KSB7XG4gICAgICBpZiAobmV4dC5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICByZXR1cm4gW25leHRdXG4gICAgICB9XG5cbiAgICAgIG5leHQgPSBuZXh0Lm5leHRFbGVtZW50U2libGluZ1xuICAgIH1cblxuICAgIHJldHVybiBbXVxuICB9LFxuXG4gIGZvY3VzYWJsZUNoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICBjb25zdCBmb2N1c2FibGVzID0gW1xuICAgICAgJ2EnLFxuICAgICAgJ2J1dHRvbicsXG4gICAgICAnaW5wdXQnLFxuICAgICAgJ3RleHRhcmVhJyxcbiAgICAgICdzZWxlY3QnLFxuICAgICAgJ2RldGFpbHMnLFxuICAgICAgJ1t0YWJpbmRleF0nLFxuICAgICAgJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJ1xuICAgIF0ubWFwKHNlbGVjdG9yID0+IGAke3NlbGVjdG9yfTpub3QoW3RhYmluZGV4Xj1cIi1cIl0pYCkuam9pbignLCcpXG5cbiAgICByZXR1cm4gdGhpcy5maW5kKGZvY3VzYWJsZXMsIGVsZW1lbnQpLmZpbHRlcihlbCA9PiAhaXNEaXNhYmxlZChlbCkgJiYgaXNWaXNpYmxlKGVsKSlcbiAgfSxcblxuICBnZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW1lbnQpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpXG5cbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kT25lKHNlbGVjdG9yKSA/IHNlbGVjdG9yIDogbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KVxuXG4gICAgcmV0dXJuIHNlbGVjdG9yID8gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvcikgOiBudWxsXG4gIH0sXG5cbiAgZ2V0TXVsdGlwbGVFbGVtZW50c0Zyb21TZWxlY3RvcihlbGVtZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KVxuXG4gICAgcmV0dXJuIHNlbGVjdG9yID8gU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvcikgOiBbXVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdG9yRW5naW5lXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZS5qcydcbmltcG9ydCB7IGlzRGlzYWJsZWQgfSBmcm9tICcuL2luZGV4LmpzJ1xuXG5jb25zdCBlbmFibGVEaXNtaXNzVHJpZ2dlciA9IChjb21wb25lbnQsIG1ldGhvZCA9ICdoaWRlJykgPT4ge1xuICBjb25zdCBjbGlja0V2ZW50ID0gYGNsaWNrLmRpc21pc3Mke2NvbXBvbmVudC5FVkVOVF9LRVl9YFxuICBjb25zdCBuYW1lID0gY29tcG9uZW50Lk5BTUVcblxuICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIGNsaWNrRXZlbnQsIGBbZGF0YS1icy1kaXNtaXNzPVwiJHtuYW1lfVwiXWAsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0aGlzKSB8fCB0aGlzLmNsb3Nlc3QoYC4ke25hbWV9YClcbiAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldClcblxuICAgIC8vIE1ldGhvZCBhcmd1bWVudCBpcyBsZWZ0LCBmb3IgQWxlcnQgYW5kIG9ubHksIGFzIGl0IGRvZXNuJ3QgaW1wbGVtZW50IHRoZSAnaGlkZScgbWV0aG9kXG4gICAgaW5zdGFuY2VbbWV0aG9kXSgpXG4gIH0pXG59XG5cbmV4cG9ydCB7XG4gIGVuYWJsZURpc21pc3NUcmlnZ2VyXG59XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGFsZXJ0LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCB7IGVuYWJsZURpc21pc3NUcmlnZ2VyIH0gZnJvbSAnLi91dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanMnXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4gfSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdhbGVydCdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmFsZXJ0J1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcblxuY29uc3QgRVZFTlRfQ0xPU0UgPSBgY2xvc2Uke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTE9TRUQgPSBgY2xvc2VkJHtFVkVOVF9LRVl9YFxuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQWxlcnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBjbG9zZSgpIHtcbiAgICBjb25zdCBjbG9zZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xPU0UpXG5cbiAgICBpZiAoY2xvc2VFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgY29uc3QgaXNBbmltYXRlZCA9IHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSlcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHRoaXMuX2Rlc3Ryb3lFbGVtZW50KCksIHRoaXMuX2VsZW1lbnQsIGlzQW5pbWF0ZWQpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9kZXN0cm95RWxlbWVudCgpIHtcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpXG4gICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xPU0VEKVxuICAgIHRoaXMuZGlzcG9zZSgpXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBBbGVydC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKHRoaXMpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuZW5hYmxlRGlzbWlzc1RyaWdnZXIoQWxlcnQsICdjbG9zZScpXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKEFsZXJ0KVxuXG5leHBvcnQgZGVmYXVsdCBBbGVydFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBidXR0b24uanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IHsgZGVmaW5lSlF1ZXJ5UGx1Z2luIH0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnYnV0dG9uJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMuYnV0dG9uJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFID0gJ2FjdGl2ZSdcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cImJ1dHRvblwiXSdcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBCdXR0b24gZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUoKSB7XG4gICAgLy8gVG9nZ2xlIGNsYXNzIGFuZCBzeW5jIHRoZSBgYXJpYS1wcmVzc2VkYCBhdHRyaWJ1dGUgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBgLnRvZ2dsZSgpYCBtZXRob2RcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKENMQVNTX05BTUVfQUNUSVZFKSlcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IEJ1dHRvbi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpXG5cbiAgICAgIGlmIChjb25maWcgPT09ICd0b2dnbGUnKSB7XG4gICAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGV2ZW50ID0+IHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gIGNvbnN0IGJ1dHRvbiA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KFNFTEVDVE9SX0RBVEFfVE9HR0xFKVxuICBjb25zdCBkYXRhID0gQnV0dG9uLmdldE9yQ3JlYXRlSW5zdGFuY2UoYnV0dG9uKVxuXG4gIGRhdGEudG9nZ2xlKClcbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKEJ1dHRvbilcblxuZXhwb3J0IGRlZmF1bHQgQnV0dG9uXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvc3dpcGUuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4uL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IENvbmZpZyBmcm9tICcuL2NvbmZpZy5qcydcbmltcG9ydCB7IGV4ZWN1dGUgfSBmcm9tICcuL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnc3dpcGUnXG5jb25zdCBFVkVOVF9LRVkgPSAnLmJzLnN3aXBlJ1xuY29uc3QgRVZFTlRfVE9VQ0hTVEFSVCA9IGB0b3VjaHN0YXJ0JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfVE9VQ0hNT1ZFID0gYHRvdWNobW92ZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1RPVUNIRU5EID0gYHRvdWNoZW5kJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfUE9JTlRFUkRPV04gPSBgcG9pbnRlcmRvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9QT0lOVEVSVVAgPSBgcG9pbnRlcnVwJHtFVkVOVF9LRVl9YFxuY29uc3QgUE9JTlRFUl9UWVBFX1RPVUNIID0gJ3RvdWNoJ1xuY29uc3QgUE9JTlRFUl9UWVBFX1BFTiA9ICdwZW4nXG5jb25zdCBDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQgPSAncG9pbnRlci1ldmVudCdcbmNvbnN0IFNXSVBFX1RIUkVTSE9MRCA9IDQwXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGVuZENhbGxiYWNrOiBudWxsLFxuICBsZWZ0Q2FsbGJhY2s6IG51bGwsXG4gIHJpZ2h0Q2FsbGJhY2s6IG51bGxcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGVuZENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgbGVmdENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgcmlnaHRDYWxsYmFjazogJyhmdW5jdGlvbnxudWxsKSdcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgU3dpcGUgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnRcblxuICAgIGlmICghZWxlbWVudCB8fCAhU3dpcGUuaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgICB0aGlzLl9kZWx0YVggPSAwXG4gICAgdGhpcy5fc3VwcG9ydFBvaW50ZXJFdmVudHMgPSBCb29sZWFuKHdpbmRvdy5Qb2ludGVyRXZlbnQpXG4gICAgdGhpcy5faW5pdEV2ZW50cygpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGRpc3Bvc2UoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVkpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9zdGFydChldmVudCkge1xuICAgIGlmICghdGhpcy5fc3VwcG9ydFBvaW50ZXJFdmVudHMpIHtcbiAgICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WFxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaChldmVudCkpIHtcbiAgICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LmNsaWVudFhcbiAgICB9XG4gIH1cblxuICBfZW5kKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuX2V2ZW50SXNQb2ludGVyUGVuVG91Y2goZXZlbnQpKSB7XG4gICAgICB0aGlzLl9kZWx0YVggPSBldmVudC5jbGllbnRYIC0gdGhpcy5fZGVsdGFYXG4gICAgfVxuXG4gICAgdGhpcy5faGFuZGxlU3dpcGUoKVxuICAgIGV4ZWN1dGUodGhpcy5fY29uZmlnLmVuZENhbGxiYWNrKVxuICB9XG5cbiAgX21vdmUoZXZlbnQpIHtcbiAgICB0aGlzLl9kZWx0YVggPSBldmVudC50b3VjaGVzICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoID4gMSA/XG4gICAgICAwIDpcbiAgICAgIGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuX2RlbHRhWFxuICB9XG5cbiAgX2hhbmRsZVN3aXBlKCkge1xuICAgIGNvbnN0IGFic0RlbHRhWCA9IE1hdGguYWJzKHRoaXMuX2RlbHRhWClcblxuICAgIGlmIChhYnNEZWx0YVggPD0gU1dJUEVfVEhSRVNIT0xEKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkaXJlY3Rpb24gPSBhYnNEZWx0YVggLyB0aGlzLl9kZWx0YVhcblxuICAgIHRoaXMuX2RlbHRhWCA9IDBcblxuICAgIGlmICghZGlyZWN0aW9uKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBleGVjdXRlKGRpcmVjdGlvbiA+IDAgPyB0aGlzLl9jb25maWcucmlnaHRDYWxsYmFjayA6IHRoaXMuX2NvbmZpZy5sZWZ0Q2FsbGJhY2spXG4gIH1cblxuICBfaW5pdEV2ZW50cygpIHtcbiAgICBpZiAodGhpcy5fc3VwcG9ydFBvaW50ZXJFdmVudHMpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9QT0lOVEVSRE9XTiwgZXZlbnQgPT4gdGhpcy5fc3RhcnQoZXZlbnQpKVxuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1BPSU5URVJVUCwgZXZlbnQgPT4gdGhpcy5fZW5kKGV2ZW50KSlcblxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfUE9JTlRFUl9FVkVOVClcbiAgICB9IGVsc2Uge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1RPVUNIU1RBUlQsIGV2ZW50ID0+IHRoaXMuX3N0YXJ0KGV2ZW50KSlcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9UT1VDSE1PVkUsIGV2ZW50ID0+IHRoaXMuX21vdmUoZXZlbnQpKVxuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1RPVUNIRU5ELCBldmVudCA9PiB0aGlzLl9lbmQoZXZlbnQpKVxuICAgIH1cbiAgfVxuXG4gIF9ldmVudElzUG9pbnRlclBlblRvdWNoKGV2ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzICYmIChldmVudC5wb2ludGVyVHlwZSA9PT0gUE9JTlRFUl9UWVBFX1BFTiB8fCBldmVudC5wb2ludGVyVHlwZSA9PT0gUE9JTlRFUl9UWVBFX1RPVUNIKVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBpc1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDBcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTd2lwZVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBjYXJvdXNlbC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgTWFuaXB1bGF0b3IgZnJvbSAnLi9kb20vbWFuaXB1bGF0b3IuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLFxuICBnZXROZXh0QWN0aXZlRWxlbWVudCxcbiAgaXNSVEwsXG4gIGlzVmlzaWJsZSxcbiAgcmVmbG93LFxuICB0cmlnZ2VyVHJhbnNpdGlvbkVuZFxufSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5pbXBvcnQgU3dpcGUgZnJvbSAnLi91dGlsL3N3aXBlLmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnY2Fyb3VzZWwnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5jYXJvdXNlbCdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuXG5jb25zdCBBUlJPV19MRUZUX0tFWSA9ICdBcnJvd0xlZnQnXG5jb25zdCBBUlJPV19SSUdIVF9LRVkgPSAnQXJyb3dSaWdodCdcbmNvbnN0IFRPVUNIRVZFTlRfQ09NUEFUX1dBSVQgPSA1MDAgLy8gVGltZSBmb3IgbW91c2UgY29tcGF0IGV2ZW50cyB0byBmaXJlIGFmdGVyIHRvdWNoXG5cbmNvbnN0IE9SREVSX05FWFQgPSAnbmV4dCdcbmNvbnN0IE9SREVSX1BSRVYgPSAncHJldidcbmNvbnN0IERJUkVDVElPTl9MRUZUID0gJ2xlZnQnXG5jb25zdCBESVJFQ1RJT05fUklHSFQgPSAncmlnaHQnXG5cbmNvbnN0IEVWRU5UX1NMSURFID0gYHNsaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0xJRCA9IGBzbGlkJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTiA9IGBrZXlkb3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfTU9VU0VFTlRFUiA9IGBtb3VzZWVudGVyJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfTU9VU0VMRUFWRSA9IGBtb3VzZWxlYXZlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfRFJBR19TVEFSVCA9IGBkcmFnc3RhcnQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJID0gYGxvYWQke0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9DQVJPVVNFTCA9ICdjYXJvdXNlbCdcbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFID0gJ2FjdGl2ZSdcbmNvbnN0IENMQVNTX05BTUVfU0xJREUgPSAnc2xpZGUnXG5jb25zdCBDTEFTU19OQU1FX0VORCA9ICdjYXJvdXNlbC1pdGVtLWVuZCdcbmNvbnN0IENMQVNTX05BTUVfU1RBUlQgPSAnY2Fyb3VzZWwtaXRlbS1zdGFydCdcbmNvbnN0IENMQVNTX05BTUVfTkVYVCA9ICdjYXJvdXNlbC1pdGVtLW5leHQnXG5jb25zdCBDTEFTU19OQU1FX1BSRVYgPSAnY2Fyb3VzZWwtaXRlbS1wcmV2J1xuXG5jb25zdCBTRUxFQ1RPUl9BQ1RJVkUgPSAnLmFjdGl2ZSdcbmNvbnN0IFNFTEVDVE9SX0lURU0gPSAnLmNhcm91c2VsLWl0ZW0nXG5jb25zdCBTRUxFQ1RPUl9BQ1RJVkVfSVRFTSA9IFNFTEVDVE9SX0FDVElWRSArIFNFTEVDVE9SX0lURU1cbmNvbnN0IFNFTEVDVE9SX0lURU1fSU1HID0gJy5jYXJvdXNlbC1pdGVtIGltZydcbmNvbnN0IFNFTEVDVE9SX0lORElDQVRPUlMgPSAnLmNhcm91c2VsLWluZGljYXRvcnMnXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1NMSURFID0gJ1tkYXRhLWJzLXNsaWRlXSwgW2RhdGEtYnMtc2xpZGUtdG9dJ1xuY29uc3QgU0VMRUNUT1JfREFUQV9SSURFID0gJ1tkYXRhLWJzLXJpZGU9XCJjYXJvdXNlbFwiXSdcblxuY29uc3QgS0VZX1RPX0RJUkVDVElPTiA9IHtcbiAgW0FSUk9XX0xFRlRfS0VZXTogRElSRUNUSU9OX1JJR0hULFxuICBbQVJST1dfUklHSFRfS0VZXTogRElSRUNUSU9OX0xFRlRcbn1cblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgaW50ZXJ2YWw6IDUwMDAsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBwYXVzZTogJ2hvdmVyJyxcbiAgcmlkZTogZmFsc2UsXG4gIHRvdWNoOiB0cnVlLFxuICB3cmFwOiB0cnVlXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBpbnRlcnZhbDogJyhudW1iZXJ8Ym9vbGVhbiknLCAvLyBUT0RPOnY2IHJlbW92ZSBib29sZWFuIHN1cHBvcnRcbiAga2V5Ym9hcmQ6ICdib29sZWFuJyxcbiAgcGF1c2U6ICcoc3RyaW5nfGJvb2xlYW4pJyxcbiAgcmlkZTogJyhib29sZWFufHN0cmluZyknLFxuICB0b3VjaDogJ2Jvb2xlYW4nLFxuICB3cmFwOiAnYm9vbGVhbidcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQ2Fyb3VzZWwgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsXG4gICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IG51bGxcbiAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZVxuICAgIHRoaXMudG91Y2hUaW1lb3V0ID0gbnVsbFxuICAgIHRoaXMuX3N3aXBlSGVscGVyID0gbnVsbFxuXG4gICAgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0lORElDQVRPUlMsIHRoaXMuX2VsZW1lbnQpXG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5yaWRlID09PSBDTEFTU19OQU1FX0NBUk9VU0VMKSB7XG4gICAgICB0aGlzLmN5Y2xlKClcbiAgICB9XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIG5leHQoKSB7XG4gICAgdGhpcy5fc2xpZGUoT1JERVJfTkVYVClcbiAgfVxuXG4gIG5leHRXaGVuVmlzaWJsZSgpIHtcbiAgICAvLyBGSVhNRSBUT0RPIHVzZSBgZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlYFxuICAgIC8vIERvbid0IGNhbGwgbmV4dCB3aGVuIHRoZSBwYWdlIGlzbid0IHZpc2libGVcbiAgICAvLyBvciB0aGUgY2Fyb3VzZWwgb3IgaXRzIHBhcmVudCBpc24ndCB2aXNpYmxlXG4gICAgaWYgKCFkb2N1bWVudC5oaWRkZW4gJiYgaXNWaXNpYmxlKHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICB0aGlzLm5leHQoKVxuICAgIH1cbiAgfVxuXG4gIHByZXYoKSB7XG4gICAgdGhpcy5fc2xpZGUoT1JERVJfUFJFVilcbiAgfVxuXG4gIHBhdXNlKCkge1xuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIHRyaWdnZXJUcmFuc2l0aW9uRW5kKHRoaXMuX2VsZW1lbnQpXG4gICAgfVxuXG4gICAgdGhpcy5fY2xlYXJJbnRlcnZhbCgpXG4gIH1cblxuICBjeWNsZSgpIHtcbiAgICB0aGlzLl9jbGVhckludGVydmFsKClcbiAgICB0aGlzLl91cGRhdGVJbnRlcnZhbCgpXG5cbiAgICB0aGlzLl9pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHRoaXMubmV4dFdoZW5WaXNpYmxlKCksIHRoaXMuX2NvbmZpZy5pbnRlcnZhbClcbiAgfVxuXG4gIF9tYXliZUVuYWJsZUN5Y2xlKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnJpZGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfU0xJRCwgKCkgPT4gdGhpcy5jeWNsZSgpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5jeWNsZSgpXG4gIH1cblxuICB0byhpbmRleCkge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fZ2V0SXRlbXMoKVxuICAgIGlmIChpbmRleCA+IGl0ZW1zLmxlbmd0aCAtIDEgfHwgaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICBFdmVudEhhbmRsZXIub25lKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NMSUQsICgpID0+IHRoaXMudG8oaW5kZXgpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgodGhpcy5fZ2V0QWN0aXZlKCkpXG4gICAgaWYgKGFjdGl2ZUluZGV4ID09PSBpbmRleCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgb3JkZXIgPSBpbmRleCA+IGFjdGl2ZUluZGV4ID8gT1JERVJfTkVYVCA6IE9SREVSX1BSRVZcblxuICAgIHRoaXMuX3NsaWRlKG9yZGVyLCBpdGVtc1tpbmRleF0pXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIGlmICh0aGlzLl9zd2lwZUhlbHBlcikge1xuICAgICAgdGhpcy5fc3dpcGVIZWxwZXIuZGlzcG9zZSgpXG4gICAgfVxuXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy5kZWZhdWx0SW50ZXJ2YWwgPSBjb25maWcuaW50ZXJ2YWxcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5rZXlib2FyZCkge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWURPV04sIGV2ZW50ID0+IHRoaXMuX2tleWRvd24oZXZlbnQpKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcucGF1c2UgPT09ICdob3ZlcicpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRUVOVEVSLCAoKSA9PiB0aGlzLnBhdXNlKCkpXG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VMRUFWRSwgKCkgPT4gdGhpcy5fbWF5YmVFbmFibGVDeWNsZSgpKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcudG91Y2ggJiYgU3dpcGUuaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgdGhpcy5fYWRkVG91Y2hFdmVudExpc3RlbmVycygpXG4gICAgfVxuICB9XG5cbiAgX2FkZFRvdWNoRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZm9yIChjb25zdCBpbWcgb2YgU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9JVEVNX0lNRywgdGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbihpbWcsIEVWRU5UX0RSQUdfU1RBUlQsIGV2ZW50ID0+IGV2ZW50LnByZXZlbnREZWZhdWx0KCkpXG4gICAgfVxuXG4gICAgY29uc3QgZW5kQ2FsbEJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLnBhdXNlICE9PSAnaG92ZXInKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBJZiBpdCdzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2UsIG1vdXNlZW50ZXIvbGVhdmUgYXJlIGZpcmVkIGFzXG4gICAgICAvLyBwYXJ0IG9mIHRoZSBtb3VzZSBjb21wYXRpYmlsaXR5IGV2ZW50cyBvbiBmaXJzdCB0YXAgLSB0aGUgY2Fyb3VzZWxcbiAgICAgIC8vIHdvdWxkIHN0b3AgY3ljbGluZyB1bnRpbCB1c2VyIHRhcHBlZCBvdXQgb2YgaXQ7XG4gICAgICAvLyBoZXJlLCB3ZSBsaXN0ZW4gZm9yIHRvdWNoZW5kLCBleHBsaWNpdGx5IHBhdXNlIHRoZSBjYXJvdXNlbFxuICAgICAgLy8gKGFzIGlmIGl0J3MgdGhlIHNlY29uZCB0aW1lIHdlIHRhcCBvbiBpdCwgbW91c2VlbnRlciBjb21wYXQgZXZlbnRcbiAgICAgIC8vIGlzIE5PVCBmaXJlZCkgYW5kIGFmdGVyIGEgdGltZW91dCAodG8gYWxsb3cgZm9yIG1vdXNlIGNvbXBhdGliaWxpdHlcbiAgICAgIC8vIGV2ZW50cyB0byBmaXJlKSB3ZSBleHBsaWNpdGx5IHJlc3RhcnQgY3ljbGluZ1xuXG4gICAgICB0aGlzLnBhdXNlKClcbiAgICAgIGlmICh0aGlzLnRvdWNoVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50b3VjaFRpbWVvdXQpXG4gICAgICB9XG5cbiAgICAgIHRoaXMudG91Y2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9tYXliZUVuYWJsZUN5Y2xlKCksIFRPVUNIRVZFTlRfQ09NUEFUX1dBSVQgKyB0aGlzLl9jb25maWcuaW50ZXJ2YWwpXG4gICAgfVxuXG4gICAgY29uc3Qgc3dpcGVDb25maWcgPSB7XG4gICAgICBsZWZ0Q2FsbGJhY2s6ICgpID0+IHRoaXMuX3NsaWRlKHRoaXMuX2RpcmVjdGlvblRvT3JkZXIoRElSRUNUSU9OX0xFRlQpKSxcbiAgICAgIHJpZ2h0Q2FsbGJhY2s6ICgpID0+IHRoaXMuX3NsaWRlKHRoaXMuX2RpcmVjdGlvblRvT3JkZXIoRElSRUNUSU9OX1JJR0hUKSksXG4gICAgICBlbmRDYWxsYmFjazogZW5kQ2FsbEJhY2tcbiAgICB9XG5cbiAgICB0aGlzLl9zd2lwZUhlbHBlciA9IG5ldyBTd2lwZSh0aGlzLl9lbGVtZW50LCBzd2lwZUNvbmZpZylcbiAgfVxuXG4gIF9rZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkaXJlY3Rpb24gPSBLRVlfVE9fRElSRUNUSU9OW2V2ZW50LmtleV1cbiAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB0aGlzLl9zbGlkZSh0aGlzLl9kaXJlY3Rpb25Ub09yZGVyKGRpcmVjdGlvbikpXG4gICAgfVxuICB9XG5cbiAgX2dldEl0ZW1JbmRleChlbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEl0ZW1zKCkuaW5kZXhPZihlbGVtZW50KVxuICB9XG5cbiAgX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQoaW5kZXgpIHtcbiAgICBpZiAoIXRoaXMuX2luZGljYXRvcnNFbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVJbmRpY2F0b3IgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0FDVElWRSwgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpXG5cbiAgICBhY3RpdmVJbmRpY2F0b3IuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSlcbiAgICBhY3RpdmVJbmRpY2F0b3IucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnKVxuXG4gICAgY29uc3QgbmV3QWN0aXZlSW5kaWNhdG9yID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShgW2RhdGEtYnMtc2xpZGUtdG89XCIke2luZGV4fVwiXWAsIHRoaXMuX2luZGljYXRvcnNFbGVtZW50KVxuXG4gICAgaWYgKG5ld0FjdGl2ZUluZGljYXRvcikge1xuICAgICAgbmV3QWN0aXZlSW5kaWNhdG9yLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgICBuZXdBY3RpdmVJbmRpY2F0b3Iuc2V0QXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnLCAndHJ1ZScpXG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZUludGVydmFsKCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9hY3RpdmVFbGVtZW50IHx8IHRoaXMuX2dldEFjdGl2ZSgpXG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRJbnRlcnZhbCA9IE51bWJlci5wYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy1pbnRlcnZhbCcpLCAxMClcblxuICAgIHRoaXMuX2NvbmZpZy5pbnRlcnZhbCA9IGVsZW1lbnRJbnRlcnZhbCB8fCB0aGlzLl9jb25maWcuZGVmYXVsdEludGVydmFsXG4gIH1cblxuICBfc2xpZGUob3JkZXIsIGVsZW1lbnQgPSBudWxsKSB7XG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHRoaXMuX2dldEFjdGl2ZSgpXG4gICAgY29uc3QgaXNOZXh0ID0gb3JkZXIgPT09IE9SREVSX05FWFRcbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IGVsZW1lbnQgfHwgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQodGhpcy5fZ2V0SXRlbXMoKSwgYWN0aXZlRWxlbWVudCwgaXNOZXh0LCB0aGlzLl9jb25maWcud3JhcClcblxuICAgIGlmIChuZXh0RWxlbWVudCA9PT0gYWN0aXZlRWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEVsZW1lbnRJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleChuZXh0RWxlbWVudClcblxuICAgIGNvbnN0IHRyaWdnZXJFdmVudCA9IGV2ZW50TmFtZSA9PiB7XG4gICAgICByZXR1cm4gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgZXZlbnROYW1lLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IG5leHRFbGVtZW50LFxuICAgICAgICBkaXJlY3Rpb246IHRoaXMuX29yZGVyVG9EaXJlY3Rpb24ob3JkZXIpLFxuICAgICAgICBmcm9tOiB0aGlzLl9nZXRJdGVtSW5kZXgoYWN0aXZlRWxlbWVudCksXG4gICAgICAgIHRvOiBuZXh0RWxlbWVudEluZGV4XG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHNsaWRlRXZlbnQgPSB0cmlnZ2VyRXZlbnQoRVZFTlRfU0xJREUpXG5cbiAgICBpZiAoc2xpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWFjdGl2ZUVsZW1lbnQgfHwgIW5leHRFbGVtZW50KSB7XG4gICAgICAvLyBTb21lIHdlaXJkbmVzcyBpcyBoYXBwZW5pbmcsIHNvIHdlIGJhaWxcbiAgICAgIC8vIFRPRE86IGNoYW5nZSB0ZXN0cyB0aGF0IHVzZSBlbXB0eSBkaXZzIHRvIGF2b2lkIHRoaXMgY2hlY2tcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGlzQ3ljbGluZyA9IEJvb2xlYW4odGhpcy5faW50ZXJ2YWwpXG4gICAgdGhpcy5wYXVzZSgpXG5cbiAgICB0aGlzLl9pc1NsaWRpbmcgPSB0cnVlXG5cbiAgICB0aGlzLl9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KG5leHRFbGVtZW50SW5kZXgpXG4gICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IG5leHRFbGVtZW50XG5cbiAgICBjb25zdCBkaXJlY3Rpb25hbENsYXNzTmFtZSA9IGlzTmV4dCA/IENMQVNTX05BTUVfU1RBUlQgOiBDTEFTU19OQU1FX0VORFxuICAgIGNvbnN0IG9yZGVyQ2xhc3NOYW1lID0gaXNOZXh0ID8gQ0xBU1NfTkFNRV9ORVhUIDogQ0xBU1NfTkFNRV9QUkVWXG5cbiAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QuYWRkKG9yZGVyQ2xhc3NOYW1lKVxuXG4gICAgcmVmbG93KG5leHRFbGVtZW50KVxuXG4gICAgYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGRpcmVjdGlvbmFsQ2xhc3NOYW1lKVxuICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQoZGlyZWN0aW9uYWxDbGFzc05hbWUpXG5cbiAgICBjb25zdCBjb21wbGV0ZUNhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShkaXJlY3Rpb25hbENsYXNzTmFtZSwgb3JkZXJDbGFzc05hbWUpXG4gICAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuXG4gICAgICBhY3RpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUsIG9yZGVyQ2xhc3NOYW1lLCBkaXJlY3Rpb25hbENsYXNzTmFtZSlcblxuICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2VcblxuICAgICAgdHJpZ2dlckV2ZW50KEVWRU5UX1NMSUQpXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZUNhbGxCYWNrLCBhY3RpdmVFbGVtZW50LCB0aGlzLl9pc0FuaW1hdGVkKCkpXG5cbiAgICBpZiAoaXNDeWNsaW5nKSB7XG4gICAgICB0aGlzLmN5Y2xlKClcbiAgICB9XG4gIH1cblxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TTElERSlcbiAgfVxuXG4gIF9nZXRBY3RpdmUoKSB7XG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfQUNUSVZFX0lURU0sIHRoaXMuX2VsZW1lbnQpXG4gIH1cblxuICBfZ2V0SXRlbXMoKSB7XG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfSVRFTSwgdGhpcy5fZWxlbWVudClcbiAgfVxuXG4gIF9jbGVhckludGVydmFsKCkge1xuICAgIGlmICh0aGlzLl9pbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbClcbiAgICAgIHRoaXMuX2ludGVydmFsID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIF9kaXJlY3Rpb25Ub09yZGVyKGRpcmVjdGlvbikge1xuICAgIGlmIChpc1JUTCgpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fTEVGVCA/IE9SREVSX1BSRVYgOiBPUkRFUl9ORVhUXG4gICAgfVxuXG4gICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gRElSRUNUSU9OX0xFRlQgPyBPUkRFUl9ORVhUIDogT1JERVJfUFJFVlxuICB9XG5cbiAgX29yZGVyVG9EaXJlY3Rpb24ob3JkZXIpIHtcbiAgICBpZiAoaXNSVEwoKSkge1xuICAgICAgcmV0dXJuIG9yZGVyID09PSBPUkRFUl9QUkVWID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFRcbiAgICB9XG5cbiAgICByZXR1cm4gb3JkZXIgPT09IE9SREVSX1BSRVYgPyBESVJFQ1RJT05fUklHSFQgOiBESVJFQ1RJT05fTEVGVFxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQ2Fyb3VzZWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnbnVtYmVyJykge1xuICAgICAgICBkYXRhLnRvKGNvbmZpZylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW2NvbmZpZ10oKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfU0xJREUsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpXG5cbiAgaWYgKCF0YXJnZXQgfHwgIXRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9DQVJPVVNFTCkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICBjb25zdCBjYXJvdXNlbCA9IENhcm91c2VsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGFyZ2V0KVxuICBjb25zdCBzbGlkZUluZGV4ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtc2xpZGUtdG8nKVxuXG4gIGlmIChzbGlkZUluZGV4KSB7XG4gICAgY2Fyb3VzZWwudG8oc2xpZGVJbmRleClcbiAgICBjYXJvdXNlbC5fbWF5YmVFbmFibGVDeWNsZSgpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZSh0aGlzLCAnc2xpZGUnKSA9PT0gJ25leHQnKSB7XG4gICAgY2Fyb3VzZWwubmV4dCgpXG4gICAgY2Fyb3VzZWwuX21heWJlRW5hYmxlQ3ljbGUoKVxuICAgIHJldHVyblxuICB9XG5cbiAgY2Fyb3VzZWwucHJldigpXG4gIGNhcm91c2VsLl9tYXliZUVuYWJsZUN5Y2xlKClcbn0pXG5cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEksICgpID0+IHtcbiAgY29uc3QgY2Fyb3VzZWxzID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1JJREUpXG5cbiAgZm9yIChjb25zdCBjYXJvdXNlbCBvZiBjYXJvdXNlbHMpIHtcbiAgICBDYXJvdXNlbC5nZXRPckNyZWF0ZUluc3RhbmNlKGNhcm91c2VsKVxuICB9XG59KVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihDYXJvdXNlbClcblxuZXhwb3J0IGRlZmF1bHQgQ2Fyb3VzZWxcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgY29sbGFwc2UuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4vZG9tL3NlbGVjdG9yLWVuZ2luZS5qcydcbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgZ2V0RWxlbWVudCxcbiAgcmVmbG93XG59IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2NvbGxhcHNlJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMuY29sbGFwc2UnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgRVZFTlRfU0hPVyA9IGBzaG93JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPV04gPSBgc2hvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTRSA9ICdjb2xsYXBzZSdcbmNvbnN0IENMQVNTX05BTUVfQ09MTEFQU0lORyA9ICdjb2xsYXBzaW5nJ1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTRUQgPSAnY29sbGFwc2VkJ1xuY29uc3QgQ0xBU1NfTkFNRV9ERUVQRVJfQ0hJTERSRU4gPSBgOnNjb3BlIC4ke0NMQVNTX05BTUVfQ09MTEFQU0V9IC4ke0NMQVNTX05BTUVfQ09MTEFQU0V9YFxuY29uc3QgQ0xBU1NfTkFNRV9IT1JJWk9OVEFMID0gJ2NvbGxhcHNlLWhvcml6b250YWwnXG5cbmNvbnN0IFdJRFRIID0gJ3dpZHRoJ1xuY29uc3QgSEVJR0hUID0gJ2hlaWdodCdcblxuY29uc3QgU0VMRUNUT1JfQUNUSVZFUyA9ICcuY29sbGFwc2Uuc2hvdywgLmNvbGxhcHNlLmNvbGxhcHNpbmcnXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiXSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgcGFyZW50OiBudWxsLFxuICB0b2dnbGU6IHRydWVcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIHBhcmVudDogJyhudWxsfGVsZW1lbnQpJyxcbiAgdG9nZ2xlOiAnYm9vbGVhbidcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQ29sbGFwc2UgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcbiAgICB0aGlzLl90cmlnZ2VyQXJyYXkgPSBbXVxuXG4gICAgY29uc3QgdG9nZ2xlTGlzdCA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9UT0dHTEUpXG5cbiAgICBmb3IgKGNvbnN0IGVsZW0gb2YgdG9nZ2xlTGlzdCkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBTZWxlY3RvckVuZ2luZS5nZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW0pXG4gICAgICBjb25zdCBmaWx0ZXJFbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvcilcbiAgICAgICAgLmZpbHRlcihmb3VuZEVsZW1lbnQgPT4gZm91bmRFbGVtZW50ID09PSB0aGlzLl9lbGVtZW50KVxuXG4gICAgICBpZiAoc2VsZWN0b3IgIT09IG51bGwgJiYgZmlsdGVyRWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckFycmF5LnB1c2goZWxlbSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9pbml0aWFsaXplQ2hpbGRyZW4oKVxuXG4gICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICB0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModGhpcy5fdHJpZ2dlckFycmF5LCB0aGlzLl9pc1Nob3duKCkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy50b2dnbGUpIHtcbiAgICAgIHRoaXMudG9nZ2xlKClcbiAgICB9XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLmhpZGUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3coKVxuICAgIH1cbiAgfVxuXG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbmluZyB8fCB0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCBhY3RpdmVDaGlsZHJlbiA9IFtdXG5cbiAgICAvLyBmaW5kIGFjdGl2ZSBjaGlsZHJlblxuICAgIGlmICh0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICBhY3RpdmVDaGlsZHJlbiA9IHRoaXMuX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihTRUxFQ1RPUl9BQ1RJVkVTKVxuICAgICAgICAuZmlsdGVyKGVsZW1lbnQgPT4gZWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudClcbiAgICAgICAgLm1hcChlbGVtZW50ID0+IENvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgeyB0b2dnbGU6IGZhbHNlIH0pKVxuICAgIH1cblxuICAgIGlmIChhY3RpdmVDaGlsZHJlbi5sZW5ndGggJiYgYWN0aXZlQ2hpbGRyZW5bMF0uX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1cpXG4gICAgaWYgKHN0YXJ0RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhY3RpdmVJbnN0YW5jZSBvZiBhY3RpdmVDaGlsZHJlbikge1xuICAgICAgYWN0aXZlSW5zdGFuY2UuaGlkZSgpXG4gICAgfVxuXG4gICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5fZ2V0RGltZW5zaW9uKClcblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNFKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNJTkcpXG5cbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAwXG5cbiAgICB0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModGhpcy5fdHJpZ2dlckFycmF5LCB0cnVlKVxuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWVcblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcblxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0lORylcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNFLCBDTEFTU19OQU1FX1NIT1cpXG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnXG5cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOKVxuICAgIH1cblxuICAgIGNvbnN0IGNhcGl0YWxpemVkRGltZW5zaW9uID0gZGltZW5zaW9uWzBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoMSlcbiAgICBjb25zdCBzY3JvbGxTaXplID0gYHNjcm9sbCR7Y2FwaXRhbGl6ZWREaW1lbnNpb259YFxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdHJ1ZSlcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSBgJHt0aGlzLl9lbGVtZW50W3Njcm9sbFNpemVdfXB4YFxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICF0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKVxuICAgIGlmIChzdGFydEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbigpXG5cbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSBgJHt0aGlzLl9lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RpbWVuc2lvbl19cHhgXG5cbiAgICByZWZsb3codGhpcy5fZWxlbWVudClcblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNJTkcpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0UsIENMQVNTX05BTUVfU0hPVylcblxuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0aGlzLl90cmlnZ2VyQXJyYXkpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRyaWdnZXIpXG5cbiAgICAgIGlmIChlbGVtZW50ICYmICF0aGlzLl9pc1Nob3duKGVsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhbdHJpZ2dlcl0sIGZhbHNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWVcblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNJTkcpXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTRSlcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTilcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAnJ1xuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdHJ1ZSlcbiAgfVxuXG4gIF9pc1Nob3duKGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVylcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgY29uZmlnLnRvZ2dsZSA9IEJvb2xlYW4oY29uZmlnLnRvZ2dsZSkgLy8gQ29lcmNlIHN0cmluZyB2YWx1ZXNcbiAgICBjb25maWcucGFyZW50ID0gZ2V0RWxlbWVudChjb25maWcucGFyZW50KVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9nZXREaW1lbnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfSE9SSVpPTlRBTCkgPyBXSURUSCA6IEhFSUdIVFxuICB9XG5cbiAgX2luaXRpYWxpemVDaGlsZHJlbigpIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKFNFTEVDVE9SX0RBVEFfVE9HR0xFKVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudClcblxuICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhbZWxlbWVudF0sIHRoaXMuX2lzU2hvd24oc2VsZWN0ZWQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9nZXRGaXJzdExldmVsQ2hpbGRyZW4oc2VsZWN0b3IpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmQoQ0xBU1NfTkFNRV9ERUVQRVJfQ0hJTERSRU4sIHRoaXMuX2NvbmZpZy5wYXJlbnQpXG4gICAgLy8gcmVtb3ZlIGNoaWxkcmVuIGlmIGdyZWF0ZXIgZGVwdGhcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvciwgdGhpcy5fY29uZmlnLnBhcmVudCkuZmlsdGVyKGVsZW1lbnQgPT4gIWNoaWxkcmVuLmluY2x1ZGVzKGVsZW1lbnQpKVxuICB9XG5cbiAgX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0cmlnZ2VyQXJyYXksIGlzT3Blbikge1xuICAgIGlmICghdHJpZ2dlckFycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRyaWdnZXJBcnJheSkge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKENMQVNTX05BTUVfQ09MTEFQU0VELCAhaXNPcGVuKVxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBpc09wZW4pXG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgY29uc3QgX2NvbmZpZyA9IHt9XG4gICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnICYmIC9zaG93fGhpZGUvLnRlc3QoY29uZmlnKSkge1xuICAgICAgX2NvbmZpZy50b2dnbGUgPSBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IENvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgX2NvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICAvLyBwcmV2ZW50RGVmYXVsdCBvbmx5IGZvciA8YT4gZWxlbWVudHMgKHdoaWNoIGNoYW5nZSB0aGUgVVJMKSBub3QgaW5zaWRlIHRoZSBjb2xsYXBzaWJsZSBlbGVtZW50XG4gIGlmIChldmVudC50YXJnZXQudGFnTmFtZSA9PT0gJ0EnIHx8IChldmVudC5kZWxlZ2F0ZVRhcmdldCAmJiBldmVudC5kZWxlZ2F0ZVRhcmdldC50YWdOYW1lID09PSAnQScpKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIFNlbGVjdG9yRW5naW5lLmdldE11bHRpcGxlRWxlbWVudHNGcm9tU2VsZWN0b3IodGhpcykpIHtcbiAgICBDb2xsYXBzZS5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIHsgdG9nZ2xlOiBmYWxzZSB9KS50b2dnbGUoKVxuICB9XG59KVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihDb2xsYXBzZSlcblxuZXhwb3J0IGRlZmF1bHQgQ29sbGFwc2VcbiIsICJleHBvcnQgdmFyIHRvcCA9ICd0b3AnO1xuZXhwb3J0IHZhciBib3R0b20gPSAnYm90dG9tJztcbmV4cG9ydCB2YXIgcmlnaHQgPSAncmlnaHQnO1xuZXhwb3J0IHZhciBsZWZ0ID0gJ2xlZnQnO1xuZXhwb3J0IHZhciBhdXRvID0gJ2F1dG8nO1xuZXhwb3J0IHZhciBiYXNlUGxhY2VtZW50cyA9IFt0b3AsIGJvdHRvbSwgcmlnaHQsIGxlZnRdO1xuZXhwb3J0IHZhciBzdGFydCA9ICdzdGFydCc7XG5leHBvcnQgdmFyIGVuZCA9ICdlbmQnO1xuZXhwb3J0IHZhciBjbGlwcGluZ1BhcmVudHMgPSAnY2xpcHBpbmdQYXJlbnRzJztcbmV4cG9ydCB2YXIgdmlld3BvcnQgPSAndmlld3BvcnQnO1xuZXhwb3J0IHZhciBwb3BwZXIgPSAncG9wcGVyJztcbmV4cG9ydCB2YXIgcmVmZXJlbmNlID0gJ3JlZmVyZW5jZSc7XG5leHBvcnQgdmFyIHZhcmlhdGlvblBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovYmFzZVBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9bXS5jb25jYXQoYmFzZVBsYWNlbWVudHMsIFthdXRvXSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50LCBwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pOyAvLyBtb2RpZmllcnMgdGhhdCBuZWVkIHRvIHJlYWQgdGhlIERPTVxuXG5leHBvcnQgdmFyIGJlZm9yZVJlYWQgPSAnYmVmb3JlUmVhZCc7XG5leHBvcnQgdmFyIHJlYWQgPSAncmVhZCc7XG5leHBvcnQgdmFyIGFmdGVyUmVhZCA9ICdhZnRlclJlYWQnOyAvLyBwdXJlLWxvZ2ljIG1vZGlmaWVyc1xuXG5leHBvcnQgdmFyIGJlZm9yZU1haW4gPSAnYmVmb3JlTWFpbic7XG5leHBvcnQgdmFyIG1haW4gPSAnbWFpbic7XG5leHBvcnQgdmFyIGFmdGVyTWFpbiA9ICdhZnRlck1haW4nOyAvLyBtb2RpZmllciB3aXRoIHRoZSBwdXJwb3NlIHRvIHdyaXRlIHRvIHRoZSBET00gKG9yIHdyaXRlIGludG8gYSBmcmFtZXdvcmsgc3RhdGUpXG5cbmV4cG9ydCB2YXIgYmVmb3JlV3JpdGUgPSAnYmVmb3JlV3JpdGUnO1xuZXhwb3J0IHZhciB3cml0ZSA9ICd3cml0ZSc7XG5leHBvcnQgdmFyIGFmdGVyV3JpdGUgPSAnYWZ0ZXJXcml0ZSc7XG5leHBvcnQgdmFyIG1vZGlmaWVyUGhhc2VzID0gW2JlZm9yZVJlYWQsIHJlYWQsIGFmdGVyUmVhZCwgYmVmb3JlTWFpbiwgbWFpbiwgYWZ0ZXJNYWluLCBiZWZvcmVXcml0ZSwgd3JpdGUsIGFmdGVyV3JpdGVdOyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlTmFtZShlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50ID8gKGVsZW1lbnQubm9kZU5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIGlmIChub2RlLnRvU3RyaW5nKCkgIT09ICdbb2JqZWN0IFdpbmRvd10nKSB7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgcmV0dXJuIG93bmVyRG9jdW1lbnQgPyBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdyA6IHdpbmRvdztcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5FbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5IVE1MRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNTaGFkb3dSb290KG5vZGUpIHtcbiAgLy8gSUUgMTEgaGFzIG5vIFNoYWRvd1Jvb3RcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLlNoYWRvd1Jvb3Q7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbn1cblxuZXhwb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfTsiLCAiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gVGhpcyBtb2RpZmllciB0YWtlcyB0aGUgc3R5bGVzIHByZXBhcmVkIGJ5IHRoZSBgY29tcHV0ZVN0eWxlc2AgbW9kaWZpZXJcbi8vIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlIEhUTUxFbGVtZW50cyBzdWNoIGFzIHBvcHBlciBhbmQgYXJyb3dcblxuZnVuY3Rpb24gYXBwbHlTdHlsZXMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlO1xuICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBzdHlsZSA9IHN0YXRlLnN0eWxlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0byBleHRlbmQgdGhpcyBwcm9wZXJ0eSwgYnV0IGl0J3MgdGhlIG1vc3RcbiAgICAvLyBlZmZlY3RpdmUgd2F5IHRvIGFwcGx5IHN0eWxlcyB0byBhbiBIVE1MRWxlbWVudFxuICAgIC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXVxuXG5cbiAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUgPT09IHRydWUgPyAnJyA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZTtcbiAgdmFyIGluaXRpYWxTdHlsZXMgPSB7XG4gICAgcG9wcGVyOiB7XG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgbWFyZ2luOiAnMCdcbiAgICB9LFxuICAgIGFycm93OiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sXG4gICAgcmVmZXJlbmNlOiB7fVxuICB9O1xuICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLnBvcHBlci5zdHlsZSwgaW5pdGlhbFN0eWxlcy5wb3BwZXIpO1xuICBzdGF0ZS5zdHlsZXMgPSBpbml0aWFsU3R5bGVzO1xuXG4gIGlmIChzdGF0ZS5lbGVtZW50cy5hcnJvdykge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMuYXJyb3cuc3R5bGUsIGluaXRpYWxTdHlsZXMuYXJyb3cpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICAgIHZhciBzdHlsZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5zdHlsZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBzdGF0ZS5zdHlsZXNbbmFtZV0gOiBpbml0aWFsU3R5bGVzW25hbWVdKTsgLy8gU2V0IGFsbCB2YWx1ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIHVuc2V0IHRoZW1cblxuICAgICAgdmFyIHN0eWxlID0gc3R5bGVQcm9wZXJ0aWVzLnJlZHVjZShmdW5jdGlvbiAoc3R5bGUsIHByb3BlcnR5KSB7XG4gICAgICAgIHN0eWxlW3Byb3BlcnR5XSA9ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9LCB7fSk7IC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuXG4gICAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSk7XG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGFwcGx5U3R5bGVzLFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsnY29tcHV0ZVN0eWxlcyddXG59OyIsICJpbXBvcnQgeyBhdXRvIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59IiwgImV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciByb3VuZCA9IE1hdGgucm91bmQ7IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVBU3RyaW5nKCkge1xuICB2YXIgdWFEYXRhID0gbmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7XG5cbiAgaWYgKHVhRGF0YSAhPSBudWxsICYmIHVhRGF0YS5icmFuZHMgJiYgQXJyYXkuaXNBcnJheSh1YURhdGEuYnJhbmRzKSkge1xuICAgIHJldHVybiB1YURhdGEuYnJhbmRzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0uYnJhbmQgKyBcIi9cIiArIGl0ZW0udmVyc2lvbjtcbiAgICB9KS5qb2luKCcgJyk7XG4gIH1cblxuICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbn0iLCAiaW1wb3J0IGdldFVBU3RyaW5nIGZyb20gXCIuLi91dGlscy91c2VyQWdlbnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzTGF5b3V0Vmlld3BvcnQoKSB7XG4gIHJldHVybiAhL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChnZXRVQVN0cmluZygpKTtcbn0iLCAiaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc0xheW91dFZpZXdwb3J0IGZyb20gXCIuL2lzTGF5b3V0Vmlld3BvcnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBpbmNsdWRlU2NhbGUsIGlzRml4ZWRTdHJhdGVneSkge1xuICBpZiAoaW5jbHVkZVNjYWxlID09PSB2b2lkIDApIHtcbiAgICBpbmNsdWRlU2NhbGUgPSBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc0ZpeGVkU3RyYXRlZ3kgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWRTdHJhdGVneSA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGNsaWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gMTtcbiAgdmFyIHNjYWxlWSA9IDE7XG5cbiAgaWYgKGluY2x1ZGVTY2FsZSAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgc2NhbGVYID0gZWxlbWVudC5vZmZzZXRXaWR0aCA+IDAgPyByb3VuZChjbGllbnRSZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMSA6IDE7XG4gICAgc2NhbGVZID0gZWxlbWVudC5vZmZzZXRIZWlnaHQgPiAwID8gcm91bmQoY2xpZW50UmVjdC5oZWlnaHQpIC8gZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgMSA6IDE7XG4gIH1cblxuICB2YXIgX3JlZiA9IGlzRWxlbWVudChlbGVtZW50KSA/IGdldFdpbmRvdyhlbGVtZW50KSA6IHdpbmRvdyxcbiAgICAgIHZpc3VhbFZpZXdwb3J0ID0gX3JlZi52aXN1YWxWaWV3cG9ydDtcblxuICB2YXIgYWRkVmlzdWFsT2Zmc2V0cyA9ICFpc0xheW91dFZpZXdwb3J0KCkgJiYgaXNGaXhlZFN0cmF0ZWd5O1xuICB2YXIgeCA9IChjbGllbnRSZWN0LmxlZnQgKyAoYWRkVmlzdWFsT2Zmc2V0cyAmJiB2aXN1YWxWaWV3cG9ydCA/IHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQgOiAwKSkgLyBzY2FsZVg7XG4gIHZhciB5ID0gKGNsaWVudFJlY3QudG9wICsgKGFkZFZpc3VhbE9mZnNldHMgJiYgdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3AgOiAwKSkgLyBzY2FsZVk7XG4gIHZhciB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGggLyBzY2FsZVg7XG4gIHZhciBoZWlnaHQgPSBjbGllbnRSZWN0LmhlaWdodCAvIHNjYWxlWTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgdG9wOiB5LFxuICAgIHJpZ2h0OiB4ICsgd2lkdGgsXG4gICAgYm90dG9tOiB5ICsgaGVpZ2h0LFxuICAgIGxlZnQ6IHgsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59IiwgImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7IC8vIFJldHVybnMgdGhlIGxheW91dCByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC4gTGF5b3V0XG4vLyBtZWFucyBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRyYW5zZm9ybXMuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudCkge1xuICB2YXIgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTsgLy8gVXNlIHRoZSBjbGllbnRSZWN0IHNpemVzIGlmIGl0J3Mgbm90IGJlZW4gdHJhbnNmb3JtZWQuXG4gIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTIyM1xuXG4gIHZhciB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC53aWR0aCAtIHdpZHRoKSA8PSAxKSB7XG4gICAgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3QuaGVpZ2h0IC0gaGVpZ2h0KSA8PSAxKSB7XG4gICAgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn0iLCAiaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29udGFpbnMocGFyZW50LCBjaGlsZCkge1xuICB2YXIgcm9vdE5vZGUgPSBjaGlsZC5nZXRSb290Tm9kZSAmJiBjaGlsZC5nZXRSb290Tm9kZSgpOyAvLyBGaXJzdCwgYXR0ZW1wdCB3aXRoIGZhc3RlciBuYXRpdmUgbWV0aG9kXG5cbiAgaWYgKHBhcmVudC5jb250YWlucyhjaGlsZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyB0aGVuIGZhbGxiYWNrIHRvIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiB3aXRoIFNoYWRvdyBET00gc3VwcG9ydFxuICBlbHNlIGlmIChyb290Tm9kZSAmJiBpc1NoYWRvd1Jvb3Qocm9vdE5vZGUpKSB7XG4gICAgICB2YXIgbmV4dCA9IGNoaWxkO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChuZXh0ICYmIHBhcmVudC5pc1NhbWVOb2RlKG5leHQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddOiBuZWVkIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhpcy4uLlxuXG5cbiAgICAgICAgbmV4dCA9IG5leHQucGFyZW50Tm9kZSB8fCBuZXh0Lmhvc3Q7XG4gICAgICB9IHdoaWxlIChuZXh0KTtcbiAgICB9IC8vIEdpdmUgdXAsIHRoZSByZXN1bHQgaXMgZmFsc2VcblxuXG4gIHJldHVybiBmYWxzZTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0V2luZG93KGVsZW1lbnQpLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG59IiwgImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoZWxlbWVudCkpID49IDA7XG59IiwgImltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSB7XG4gIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgcmV0dXJuICgoaXNFbGVtZW50KGVsZW1lbnQpID8gZWxlbWVudC5vd25lckRvY3VtZW50IDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gIGVsZW1lbnQuZG9jdW1lbnQpIHx8IHdpbmRvdy5kb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50O1xufSIsICJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGdldE5vZGVOYW1lKGVsZW1lbnQpID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiAoLy8gdGhpcyBpcyBhIHF1aWNrZXIgKGJ1dCBsZXNzIHR5cGUgc2FmZSkgd2F5IHRvIHNhdmUgcXVpdGUgc29tZSBieXRlcyBmcm9tIHRoZSBidW5kbGVcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dXG4gICAgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgZWxlbWVudC5hc3NpZ25lZFNsb3QgfHwgLy8gc3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGVcbiAgICBlbGVtZW50LnBhcmVudE5vZGUgfHwgKCAvLyBET00gRWxlbWVudCBkZXRlY3RlZFxuICAgIGlzU2hhZG93Um9vdChlbGVtZW50KSA/IGVsZW1lbnQuaG9zdCA6IG51bGwpIHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogSFRNTEVsZW1lbnQgaXMgYSBOb2RlXG4gICAgZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIC8vIGZhbGxiYWNrXG5cbiAgKTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCwgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGlzVGFibGVFbGVtZW50IGZyb20gXCIuL2lzVGFibGVFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgZ2V0VUFTdHJpbmcgZnJvbSBcIi4uL3V0aWxzL3VzZXJBZ2VudC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvODM3XG4gIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn0gLy8gYC5vZmZzZXRQYXJlbnRgIHJlcG9ydHMgYG51bGxgIGZvciBmaXhlZCBlbGVtZW50cywgd2hpbGUgYWJzb2x1dGUgZWxlbWVudHNcbi8vIHJldHVybiB0aGUgY29udGFpbmluZyBibG9ja1xuXG5cbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB7XG4gIHZhciBpc0ZpcmVmb3ggPSAvZmlyZWZveC9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG4gIHZhciBpc0lFID0gL1RyaWRlbnQvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xuXG4gIGlmIChpc0lFICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBJbiBJRSA5LCAxMCBhbmQgMTEgZml4ZWQgZWxlbWVudHMgY29udGFpbmluZyBibG9jayBpcyBhbHdheXMgZXN0YWJsaXNoZWQgYnkgdGhlIHZpZXdwb3J0XG4gICAgdmFyIGVsZW1lbnRDc3MgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuXG4gICAgaWYgKGVsZW1lbnRDc3MucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgaWYgKGlzU2hhZG93Um9vdChjdXJyZW50Tm9kZSkpIHtcbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmhvc3Q7XG4gIH1cblxuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgWydodG1sJywgJ2JvZHknXS5pbmRleE9mKGdldE5vZGVOYW1lKGN1cnJlbnROb2RlKSkgPCAwKSB7XG4gICAgdmFyIGNzcyA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudE5vZGUpOyAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgICAvLyBjcmVhdGUgYSBjb250YWluaW5nIGJsb2NrLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG5cbiAgICBpZiAoY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IGNzcy5jb250YWluID09PSAncGFpbnQnIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5kZXhPZihjc3Mud2lsbENoYW5nZSkgIT09IC0xIHx8IGlzRmlyZWZveCAmJiBjc3Mud2lsbENoYW5nZSA9PT0gJ2ZpbHRlcicgfHwgaXNGaXJlZm94ICYmIGNzcy5maWx0ZXIgJiYgY3NzLmZpbHRlciAhPT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdodG1sJyB8fCBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luZG93O1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBbJ3RvcCcsICdib3R0b20nXS5pbmRleE9mKHBsYWNlbWVudCkgPj0gMCA/ICd4JyA6ICd5Jztcbn0iLCAiaW1wb3J0IHsgbWF4IGFzIG1hdGhNYXgsIG1pbiBhcyBtYXRoTWluIH0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpIHtcbiAgcmV0dXJuIG1hdGhNYXgobWluLCBtYXRoTWluKHZhbHVlLCBtYXgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW5NYXhDbGFtcChtaW4sIHZhbHVlLCBtYXgpIHtcbiAgdmFyIHYgPSB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KTtcbiAgcmV0dXJuIHYgPiBtYXggPyBtYXggOiB2O1xufSIsICJpbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VQYWRkaW5nT2JqZWN0KHBhZGRpbmdPYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGdldEZyZXNoU2lkZU9iamVjdCgpLCBwYWRkaW5nT2JqZWN0KTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RnJlc2hTaWRlT2JqZWN0KCkge1xuICByZXR1cm4ge1xuICAgIHRvcDogMCxcbiAgICByaWdodDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMFxuICB9O1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHBhbmRUb0hhc2hNYXAodmFsdWUsIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChoYXNoTWFwLCBrZXkpIHtcbiAgICBoYXNoTWFwW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gaGFzaE1hcDtcbiAgfSwge30pO1xufSIsICJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4uL2RvbS11dGlscy9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4gfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuLi91dGlscy9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4uL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qc1wiO1xuaW1wb3J0IHsgbGVmdCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB0b3AsIGJvdHRvbSB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB0b1BhZGRpbmdPYmplY3QgPSBmdW5jdGlvbiB0b1BhZGRpbmdPYmplY3QocGFkZGluZywgc3RhdGUpIHtcbiAgcGFkZGluZyA9IHR5cGVvZiBwYWRkaW5nID09PSAnZnVuY3Rpb24nID8gcGFkZGluZyhPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHBhZGRpbmc7XG4gIHJldHVybiBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xufTtcblxuZnVuY3Rpb24gYXJyb3coX3JlZikge1xuICB2YXIgX3N0YXRlJG1vZGlmaWVyc0RhdGEkO1xuXG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwO1xuICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBpZiAoIWFycm93RWxlbWVudCB8fCAhcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gdG9QYWRkaW5nT2JqZWN0KG9wdGlvbnMucGFkZGluZywgc3RhdGUpO1xuICB2YXIgYXJyb3dSZWN0ID0gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpO1xuICB2YXIgbWluUHJvcCA9IGF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gIHZhciBtYXhQcm9wID0gYXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gIHZhciBlbmREaWZmID0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2xlbl0gKyBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc10gLSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucG9wcGVyW2xlbl07XG4gIHZhciBzdGFydERpZmYgPSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdO1xuICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoYXJyb3dFbGVtZW50KTtcbiAgdmFyIGNsaWVudFNpemUgPSBhcnJvd09mZnNldFBhcmVudCA/IGF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMCA6IDA7XG4gIHZhciBjZW50ZXJUb1JlZmVyZW5jZSA9IGVuZERpZmYgLyAyIC0gc3RhcnREaWZmIC8gMjsgLy8gTWFrZSBzdXJlIHRoZSBhcnJvdyBkb2Vzbid0IG92ZXJmbG93IHRoZSBwb3BwZXIgaWYgdGhlIGNlbnRlciBwb2ludCBpc1xuICAvLyBvdXRzaWRlIG9mIHRoZSBwb3BwZXIgYm91bmRzXG5cbiAgdmFyIG1pbiA9IHBhZGRpbmdPYmplY3RbbWluUHJvcF07XG4gIHZhciBtYXggPSBjbGllbnRTaXplIC0gYXJyb3dSZWN0W2xlbl0gLSBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICB2YXIgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd1JlY3RbbGVuXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgdmFyIG9mZnNldCA9IHdpdGhpbihtaW4sIGNlbnRlciwgbWF4KTsgLy8gUHJldmVudHMgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy4uLlxuXG4gIHZhciBheGlzUHJvcCA9IGF4aXM7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSAoX3N0YXRlJG1vZGlmaWVyc0RhdGEkID0ge30sIF9zdGF0ZSRtb2RpZmllcnNEYXRhJFtheGlzUHJvcF0gPSBvZmZzZXQsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJC5jZW50ZXJPZmZzZXQgPSBvZmZzZXQgLSBjZW50ZXIsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJCk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudCxcbiAgICAgIGFycm93RWxlbWVudCA9IF9vcHRpb25zJGVsZW1lbnQgPT09IHZvaWQgMCA/ICdbZGF0YS1wb3BwZXItYXJyb3ddJyA6IF9vcHRpb25zJGVsZW1lbnQ7XG5cbiAgaWYgKGFycm93RWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIENTUyBzZWxlY3RvclxuXG5cbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250YWlucyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIsIGFycm93RWxlbWVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdGF0ZS5lbGVtZW50cy5hcnJvdyA9IGFycm93RWxlbWVudDtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2Fycm93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGFycm93LFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddXG59OyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcbn0iLCAiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBlbmQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB1bnNldFNpZGVzID0ge1xuICB0b3A6ICdhdXRvJyxcbiAgcmlnaHQ6ICdhdXRvJyxcbiAgYm90dG9tOiAnYXV0bycsXG4gIGxlZnQ6ICdhdXRvJ1xufTsgLy8gUm91bmQgdGhlIG9mZnNldHMgdG8gdGhlIG5lYXJlc3Qgc3VpdGFibGUgc3VicGl4ZWwgYmFzZWQgb24gdGhlIERQUi5cbi8vIFpvb21pbmcgY2FuIGNoYW5nZSB0aGUgRFBSLCBidXQgaXQgc2VlbXMgdG8gcmVwb3J0IGEgdmFsdWUgdGhhdCB3aWxsXG4vLyBjbGVhbmx5IGRpdmlkZSB0aGUgdmFsdWVzIGludG8gdGhlIGFwcHJvcHJpYXRlIHN1YnBpeGVscy5cblxuZnVuY3Rpb24gcm91bmRPZmZzZXRzQnlEUFIoX3JlZiwgd2luKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueTtcbiAgdmFyIGRwciA9IHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiB7XG4gICAgeDogcm91bmQoeCAqIGRwcikgLyBkcHIgfHwgMCxcbiAgICB5OiByb3VuZCh5ICogZHByKSAvIGRwciB8fCAwXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1N0eWxlcyhfcmVmMikge1xuICB2YXIgX09iamVjdCRhc3NpZ24yO1xuXG4gIHZhciBwb3BwZXIgPSBfcmVmMi5wb3BwZXIsXG4gICAgICBwb3BwZXJSZWN0ID0gX3JlZjIucG9wcGVyUmVjdCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYyLnBsYWNlbWVudCxcbiAgICAgIHZhcmlhdGlvbiA9IF9yZWYyLnZhcmlhdGlvbixcbiAgICAgIG9mZnNldHMgPSBfcmVmMi5vZmZzZXRzLFxuICAgICAgcG9zaXRpb24gPSBfcmVmMi5wb3NpdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9yZWYyLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGFkYXB0aXZlID0gX3JlZjIuYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHMgPSBfcmVmMi5yb3VuZE9mZnNldHMsXG4gICAgICBpc0ZpeGVkID0gX3JlZjIuaXNGaXhlZDtcbiAgdmFyIF9vZmZzZXRzJHggPSBvZmZzZXRzLngsXG4gICAgICB4ID0gX29mZnNldHMkeCA9PT0gdm9pZCAwID8gMCA6IF9vZmZzZXRzJHgsXG4gICAgICBfb2Zmc2V0cyR5ID0gb2Zmc2V0cy55LFxuICAgICAgeSA9IF9vZmZzZXRzJHkgPT09IHZvaWQgMCA/IDAgOiBfb2Zmc2V0cyR5O1xuXG4gIHZhciBfcmVmMyA9IHR5cGVvZiByb3VuZE9mZnNldHMgPT09ICdmdW5jdGlvbicgPyByb3VuZE9mZnNldHMoe1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9KSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjMueDtcbiAgeSA9IF9yZWYzLnk7XG4gIHZhciBoYXNYID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneCcpO1xuICB2YXIgaGFzWSA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3knKTtcbiAgdmFyIHNpZGVYID0gbGVmdDtcbiAgdmFyIHNpZGVZID0gdG9wO1xuICB2YXIgd2luID0gd2luZG93O1xuXG4gIGlmIChhZGFwdGl2ZSkge1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKTtcbiAgICB2YXIgaGVpZ2h0UHJvcCA9ICdjbGllbnRIZWlnaHQnO1xuICAgIHZhciB3aWR0aFByb3AgPSAnY2xpZW50V2lkdGgnO1xuXG4gICAgaWYgKG9mZnNldFBhcmVudCA9PT0gZ2V0V2luZG93KHBvcHBlcikpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IGdldERvY3VtZW50RWxlbWVudChwb3BwZXIpO1xuXG4gICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uICE9PSAnc3RhdGljJyAmJiBwb3NpdGlvbiA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgICBoZWlnaHRQcm9wID0gJ3Njcm9sbEhlaWdodCc7XG4gICAgICAgIHdpZHRoUHJvcCA9ICdzY3JvbGxXaWR0aCc7XG4gICAgICB9XG4gICAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYXN0XTogZm9yY2UgdHlwZSByZWZpbmVtZW50LCB3ZSBjb21wYXJlIG9mZnNldFBhcmVudCB3aXRoIHdpbmRvdyBhYm92ZSwgYnV0IEZsb3cgZG9lc24ndCBkZXRlY3QgaXRcblxuXG4gICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50O1xuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gdG9wIHx8IChwbGFjZW1lbnQgPT09IGxlZnQgfHwgcGxhY2VtZW50ID09PSByaWdodCkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVZID0gYm90dG9tO1xuICAgICAgdmFyIG9mZnNldFkgPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFtoZWlnaHRQcm9wXTtcbiAgICAgIHkgLT0gb2Zmc2V0WSAtIHBvcHBlclJlY3QuaGVpZ2h0O1xuICAgICAgeSAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCAocGxhY2VtZW50ID09PSB0b3AgfHwgcGxhY2VtZW50ID09PSBib3R0b20pICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWCA9IHJpZ2h0O1xuICAgICAgdmFyIG9mZnNldFggPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC53aWR0aCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W3dpZHRoUHJvcF07XG4gICAgICB4IC09IG9mZnNldFggLSBwb3BwZXJSZWN0LndpZHRoO1xuICAgICAgeCAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9LCBhZGFwdGl2ZSAmJiB1bnNldFNpZGVzKTtcblxuICB2YXIgX3JlZjQgPSByb3VuZE9mZnNldHMgPT09IHRydWUgPyByb3VuZE9mZnNldHNCeURQUih7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0sIGdldFdpbmRvdyhwb3BwZXIpKSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjQueDtcbiAgeSA9IF9yZWY0Lnk7XG5cbiAgaWYgKGdwdUFjY2VsZXJhdGlvbikge1xuICAgIHZhciBfT2JqZWN0JGFzc2lnbjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbiA9IHt9LCBfT2JqZWN0JGFzc2lnbltzaWRlWV0gPSBoYXNZID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduW3NpZGVYXSA9IGhhc1ggPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ24udHJhbnNmb3JtID0gKHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpIDw9IDEgPyBcInRyYW5zbGF0ZShcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4KVwiIDogXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4LCAwKVwiLCBfT2JqZWN0JGFzc2lnbikpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduMiA9IHt9LCBfT2JqZWN0JGFzc2lnbjJbc2lkZVldID0gaGFzWSA/IHkgKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yW3NpZGVYXSA9IGhhc1ggPyB4ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMi50cmFuc2Zvcm0gPSAnJywgX09iamVjdCRhc3NpZ24yKSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZXMoX3JlZjUpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjUuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjUub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9IG9wdGlvbnMuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uID0gX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZ3B1QWNjZWxlcmF0LFxuICAgICAgX29wdGlvbnMkYWRhcHRpdmUgPSBvcHRpb25zLmFkYXB0aXZlLFxuICAgICAgYWRhcHRpdmUgPSBfb3B0aW9ucyRhZGFwdGl2ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGFkYXB0aXZlLFxuICAgICAgX29wdGlvbnMkcm91bmRPZmZzZXRzID0gb3B0aW9ucy5yb3VuZE9mZnNldHMsXG4gICAgICByb3VuZE9mZnNldHMgPSBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRyb3VuZE9mZnNldHM7XG4gIHZhciBjb21tb25TdHlsZXMgPSB7XG4gICAgcGxhY2VtZW50OiBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCksXG4gICAgdmFyaWF0aW9uOiBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KSxcbiAgICBwb3BwZXI6IHN0YXRlLmVsZW1lbnRzLnBvcHBlcixcbiAgICBwb3BwZXJSZWN0OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiBncHVBY2NlbGVyYXRpb24sXG4gICAgaXNGaXhlZDogc3RhdGUub3B0aW9ucy5zdHJhdGVneSA9PT0gJ2ZpeGVkJ1xuICB9O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMucG9wcGVyLCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgYWRhcHRpdmU6IGFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3cgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5hcnJvdyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5hcnJvdywgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93LFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBhZGFwdGl2ZTogZmFsc2UsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCc6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ2JlZm9yZVdyaXRlJyxcbiAgZm46IGNvbXB1dGVTdHlsZXMsXG4gIGRhdGE6IHt9XG59OyIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHBhc3NpdmUgPSB7XG4gIHBhc3NpdmU6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkc2Nyb2xsID0gb3B0aW9ucy5zY3JvbGwsXG4gICAgICBzY3JvbGwgPSBfb3B0aW9ucyRzY3JvbGwgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRzY3JvbGwsXG4gICAgICBfb3B0aW9ucyRyZXNpemUgPSBvcHRpb25zLnJlc2l6ZSxcbiAgICAgIHJlc2l6ZSA9IF9vcHRpb25zJHJlc2l6ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJlc2l6ZTtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIpO1xuICB2YXIgc2Nyb2xsUGFyZW50cyA9IFtdLmNvbmNhdChzdGF0ZS5zY3JvbGxQYXJlbnRzLnJlZmVyZW5jZSwgc3RhdGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO1xuXG4gIGlmIChzY3JvbGwpIHtcbiAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzaXplKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGwpIHtcbiAgICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgIHNjcm9sbFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGZ1bmN0aW9uIGZuKCkge30sXG4gIGVmZmVjdDogZWZmZWN0LFxuICBkYXRhOiB7fVxufTsiLCAidmFyIGhhc2ggPSB7XG4gIGxlZnQ6ICdyaWdodCcsXG4gIHJpZ2h0OiAnbGVmdCcsXG4gIGJvdHRvbTogJ3RvcCcsXG4gIHRvcDogJ2JvdHRvbSdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59IiwgInZhciBoYXNoID0ge1xuICBzdGFydDogJ2VuZCcsXG4gIGVuZDogJ3N0YXJ0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL3N0YXJ0fGVuZC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbChub2RlKSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3cobm9kZSk7XG4gIHZhciBzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0O1xuICB2YXIgc2Nyb2xsVG9wID0gd2luLnBhZ2VZT2Zmc2V0O1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3BcbiAgfTtcbn0iLCAiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSB7XG4gIC8vIElmIDxodG1sPiBoYXMgYSBDU1Mgd2lkdGggZ3JlYXRlciB0aGFuIHRoZSB2aWV3cG9ydCwgdGhlbiB0aGlzIHdpbGwgYmVcbiAgLy8gaW5jb3JyZWN0IGZvciBSVEwuXG4gIC8vIFBvcHBlciAxIGlzIGJyb2tlbiBpbiB0aGlzIGNhc2UgYW5kIG5ldmVyIGhhZCBhIGJ1ZyByZXBvcnQgc28gbGV0J3MgYXNzdW1lXG4gIC8vIGl0J3Mgbm90IGFuIGlzc3VlLiBJIGRvbid0IHRoaW5rIGFueW9uZSBldmVyIHNwZWNpZmllcyB3aWR0aCBvbiA8aHRtbD5cbiAgLy8gYW55d2F5LlxuICAvLyBCcm93c2VycyB3aGVyZSB0aGUgbGVmdCBzY3JvbGxiYXIgZG9lc24ndCBjYXVzZSBhbiBpc3N1ZSByZXBvcnQgYDBgIGZvclxuICAvLyB0aGlzIChlLmcuIEVkZ2UgMjAxOSwgSUUxMSwgU2FmYXJpKVxuICByZXR1cm4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkubGVmdCArIGdldFdpbmRvd1Njcm9sbChlbGVtZW50KS5zY3JvbGxMZWZ0O1xufSIsICJpbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1Njcm9sbFBhcmVudChlbGVtZW50KSB7XG4gIC8vIEZpcmVmb3ggd2FudHMgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcbiAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSxcbiAgICAgIG92ZXJmbG93ID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1gsXG4gICAgICBvdmVyZmxvd1kgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1k7XG5cbiAgcmV0dXJuIC9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbi8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCk7XG59IiwgImltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KG5vZGUpIHtcbiAgaWYgKFsnaHRtbCcsICdib2R5JywgJyNkb2N1bWVudCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUobm9kZSkpID49IDApIHtcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgaWYgKGlzSFRNTEVsZW1lbnQobm9kZSkgJiYgaXNTY3JvbGxQYXJlbnQobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShub2RlKSk7XG59IiwgImltcG9ydCBnZXRTY3JvbGxQYXJlbnQgZnJvbSBcIi4vZ2V0U2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG4vKlxuZ2l2ZW4gYSBET00gZWxlbWVudCwgcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBzY3JvbGwgcGFyZW50cywgdXAgdGhlIGxpc3Qgb2YgYW5jZXNvcnNcbnVudGlsIHdlIGdldCB0byB0aGUgdG9wIHdpbmRvdyBvYmplY3QuIFRoaXMgbGlzdCBpcyB3aGF0IHdlIGF0dGFjaCBzY3JvbGwgbGlzdGVuZXJzXG50bywgYmVjYXVzZSBpZiBhbnkgb2YgdGhlc2UgcGFyZW50IGVsZW1lbnRzIHNjcm9sbCwgd2UnbGwgbmVlZCB0byByZS1jYWxjdWxhdGUgdGhlXG5yZWZlcmVuY2UgZWxlbWVudCdzIHBvc2l0aW9uLlxuKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGlzdFNjcm9sbFBhcmVudHMoZWxlbWVudCwgbGlzdCkge1xuICB2YXIgX2VsZW1lbnQkb3duZXJEb2N1bWVuO1xuXG4gIGlmIChsaXN0ID09PSB2b2lkIDApIHtcbiAgICBsaXN0ID0gW107XG4gIH1cblxuICB2YXIgc2Nyb2xsUGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KGVsZW1lbnQpO1xuICB2YXIgaXNCb2R5ID0gc2Nyb2xsUGFyZW50ID09PSAoKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5KTtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhzY3JvbGxQYXJlbnQpO1xuICB2YXIgdGFyZ2V0ID0gaXNCb2R5ID8gW3dpbl0uY29uY2F0KHdpbi52aXN1YWxWaWV3cG9ydCB8fCBbXSwgaXNTY3JvbGxQYXJlbnQoc2Nyb2xsUGFyZW50KSA/IHNjcm9sbFBhcmVudCA6IFtdKSA6IHNjcm9sbFBhcmVudDtcbiAgdmFyIHVwZGF0ZWRMaXN0ID0gbGlzdC5jb25jYXQodGFyZ2V0KTtcbiAgcmV0dXJuIGlzQm9keSA/IHVwZGF0ZWRMaXN0IDogLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IGlzQm9keSB0ZWxscyB1cyB0YXJnZXQgd2lsbCBiZSBhbiBIVE1MRWxlbWVudCBoZXJlXG4gIHVwZGF0ZWRMaXN0LmNvbmNhdChsaXN0U2Nyb2xsUGFyZW50cyhnZXRQYXJlbnROb2RlKHRhcmdldCkpKTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVjdFRvQ2xpZW50UmVjdChyZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCByZWN0LCB7XG4gICAgbGVmdDogcmVjdC54LFxuICAgIHRvcDogcmVjdC55LFxuICAgIHJpZ2h0OiByZWN0LnggKyByZWN0LndpZHRoLFxuICAgIGJvdHRvbTogcmVjdC55ICsgcmVjdC5oZWlnaHRcbiAgfSk7XG59IiwgImltcG9ydCB7IHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0Vmlld3BvcnRSZWN0IGZyb20gXCIuL2dldFZpZXdwb3J0UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50UmVjdCBmcm9tIFwiLi9nZXREb2N1bWVudFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCIuL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuLi91dGlscy9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBtYXgsIG1pbiB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSB7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIGZhbHNlLCBzdHJhdGVneSA9PT0gJ2ZpeGVkJyk7XG4gIHJlY3QudG9wID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgcmVjdC5sZWZ0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0O1xuICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LndpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC5oZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC54ID0gcmVjdC5sZWZ0O1xuICByZWN0LnkgPSByZWN0LnRvcDtcbiAgcmV0dXJuIHJlY3Q7XG59XG5cbmZ1bmN0aW9uIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkge1xuICByZXR1cm4gY2xpcHBpbmdQYXJlbnQgPT09IHZpZXdwb3J0ID8gcmVjdFRvQ2xpZW50UmVjdChnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpKSA6IGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgPyBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChjbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpIDogcmVjdFRvQ2xpZW50UmVjdChnZXREb2N1bWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKSk7XG59IC8vIEEgXCJjbGlwcGluZyBwYXJlbnRcIiBpcyBhbiBvdmVyZmxvd2FibGUgY29udGFpbmVyIHdpdGggdGhlIGNoYXJhY3RlcmlzdGljIG9mXG4vLyBjbGlwcGluZyAob3IgaGlkaW5nKSBvdmVyZmxvd2luZyBlbGVtZW50cyB3aXRoIGEgcG9zaXRpb24gZGlmZmVyZW50IGZyb21cbi8vIGBpbml0aWFsYFxuXG5cbmZ1bmN0aW9uIGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSB7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBsaXN0U2Nyb2xsUGFyZW50cyhnZXRQYXJlbnROb2RlKGVsZW1lbnQpKTtcbiAgdmFyIGNhbkVzY2FwZUNsaXBwaW5nID0gWydhYnNvbHV0ZScsICdmaXhlZCddLmluZGV4T2YoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbikgPj0gMDtcbiAgdmFyIGNsaXBwZXJFbGVtZW50ID0gY2FuRXNjYXBlQ2xpcHBpbmcgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSA/IGdldE9mZnNldFBhcmVudChlbGVtZW50KSA6IGVsZW1lbnQ7XG5cbiAgaWYgKCFpc0VsZW1lbnQoY2xpcHBlckVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8xNDE0XG5cblxuICByZXR1cm4gY2xpcHBpbmdQYXJlbnRzLmZpbHRlcihmdW5jdGlvbiAoY2xpcHBpbmdQYXJlbnQpIHtcbiAgICByZXR1cm4gaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSAmJiBjb250YWlucyhjbGlwcGluZ1BhcmVudCwgY2xpcHBlckVsZW1lbnQpICYmIGdldE5vZGVOYW1lKGNsaXBwaW5nUGFyZW50KSAhPT0gJ2JvZHknO1xuICB9KTtcbn0gLy8gR2V0cyB0aGUgbWF4aW11bSBhcmVhIHRoYXQgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiBkdWUgdG8gYW55IG51bWJlciBvZlxuLy8gY2xpcHBpbmcgcGFyZW50c1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENsaXBwaW5nUmVjdChlbGVtZW50LCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5LCBzdHJhdGVneSkge1xuICB2YXIgbWFpbkNsaXBwaW5nUGFyZW50cyA9IGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdQYXJlbnRzJyA/IGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSA6IFtdLmNvbmNhdChib3VuZGFyeSk7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBbXS5jb25jYXQobWFpbkNsaXBwaW5nUGFyZW50cywgW3Jvb3RCb3VuZGFyeV0pO1xuICB2YXIgZmlyc3RDbGlwcGluZ1BhcmVudCA9IGNsaXBwaW5nUGFyZW50c1swXTtcbiAgdmFyIGNsaXBwaW5nUmVjdCA9IGNsaXBwaW5nUGFyZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjY1JlY3QsIGNsaXBwaW5nUGFyZW50KSB7XG4gICAgdmFyIHJlY3QgPSBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpO1xuICAgIGFjY1JlY3QudG9wID0gbWF4KHJlY3QudG9wLCBhY2NSZWN0LnRvcCk7XG4gICAgYWNjUmVjdC5yaWdodCA9IG1pbihyZWN0LnJpZ2h0LCBhY2NSZWN0LnJpZ2h0KTtcbiAgICBhY2NSZWN0LmJvdHRvbSA9IG1pbihyZWN0LmJvdHRvbSwgYWNjUmVjdC5ib3R0b20pO1xuICAgIGFjY1JlY3QubGVmdCA9IG1heChyZWN0LmxlZnQsIGFjY1JlY3QubGVmdCk7XG4gICAgcmV0dXJuIGFjY1JlY3Q7XG4gIH0sIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGZpcnN0Q2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSk7XG4gIGNsaXBwaW5nUmVjdC53aWR0aCA9IGNsaXBwaW5nUmVjdC5yaWdodCAtIGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QuaGVpZ2h0ID0gY2xpcHBpbmdSZWN0LmJvdHRvbSAtIGNsaXBwaW5nUmVjdC50b3A7XG4gIGNsaXBwaW5nUmVjdC54ID0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC55ID0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgcmV0dXJuIGNsaXBwaW5nUmVjdDtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgaXNMYXlvdXRWaWV3cG9ydCBmcm9tIFwiLi9pc0xheW91dFZpZXdwb3J0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB2aXN1YWxWaWV3cG9ydCA9IHdpbi52aXN1YWxWaWV3cG9ydDtcbiAgdmFyIHdpZHRoID0gaHRtbC5jbGllbnRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGh0bWwuY2xpZW50SGVpZ2h0O1xuICB2YXIgeCA9IDA7XG4gIHZhciB5ID0gMDtcblxuICBpZiAodmlzdWFsVmlld3BvcnQpIHtcbiAgICB3aWR0aCA9IHZpc3VhbFZpZXdwb3J0LndpZHRoO1xuICAgIGhlaWdodCA9IHZpc3VhbFZpZXdwb3J0LmhlaWdodDtcbiAgICB2YXIgbGF5b3V0Vmlld3BvcnQgPSBpc0xheW91dFZpZXdwb3J0KCk7XG5cbiAgICBpZiAobGF5b3V0Vmlld3BvcnQgfHwgIWxheW91dFZpZXdwb3J0ICYmIHN0cmF0ZWd5ID09PSAnZml4ZWQnKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCksXG4gICAgeTogeVxuICB9O1xufSIsICJpbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmltcG9ydCB7IG1heCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7IC8vIEdldHMgdGhlIGVudGlyZSBzaXplIG9mIHRoZSBzY3JvbGxhYmxlIGRvY3VtZW50IGFyZWEsIGV2ZW4gZXh0ZW5kaW5nIG91dHNpZGVcbi8vIG9mIHRoZSBgPGh0bWw+YCBhbmQgYDxib2R5PmAgcmVjdCBib3VuZHMgaWYgaG9yaXpvbnRhbGx5IHNjcm9sbGFibGVcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgdmFyIHdpblNjcm9sbCA9IGdldFdpbmRvd1Njcm9sbChlbGVtZW50KTtcbiAgdmFyIGJvZHkgPSAoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHk7XG4gIHZhciB3aWR0aCA9IG1heChodG1sLnNjcm9sbFdpZHRoLCBodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5zY3JvbGxXaWR0aCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCk7XG4gIHZhciBoZWlnaHQgPSBtYXgoaHRtbC5zY3JvbGxIZWlnaHQsIGh0bWwuY2xpZW50SGVpZ2h0LCBib2R5ID8gYm9keS5zY3JvbGxIZWlnaHQgOiAwLCBib2R5ID8gYm9keS5jbGllbnRIZWlnaHQgOiAwKTtcbiAgdmFyIHggPSAtd2luU2Nyb2xsLnNjcm9sbExlZnQgKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpO1xuICB2YXIgeSA9IC13aW5TY3JvbGwuc2Nyb2xsVG9wO1xuXG4gIGlmIChnZXRDb21wdXRlZFN0eWxlKGJvZHkgfHwgaHRtbCkuZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgIHggKz0gbWF4KGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCkgLSB3aWR0aDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufSIsICJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgc3RhcnQsIGVuZCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZU9mZnNldHMoX3JlZikge1xuICB2YXIgcmVmZXJlbmNlID0gX3JlZi5yZWZlcmVuY2UsXG4gICAgICBlbGVtZW50ID0gX3JlZi5lbGVtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZi5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50ID8gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIHZhcmlhdGlvbiA9IHBsYWNlbWVudCA/IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIGNvbW1vblggPSByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCAvIDIgLSBlbGVtZW50LndpZHRoIC8gMjtcbiAgdmFyIGNvbW1vblkgPSByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gZWxlbWVudC5oZWlnaHQgLyAyO1xuICB2YXIgb2Zmc2V0cztcblxuICBzd2l0Y2ggKGJhc2VQbGFjZW1lbnQpIHtcbiAgICBjYXNlIHRvcDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55IC0gZWxlbWVudC5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgYm90dG9tOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHJpZ2h0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgbGVmdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54IC0gZWxlbWVudC53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54LFxuICAgICAgICB5OiByZWZlcmVuY2UueVxuICAgICAgfTtcbiAgfVxuXG4gIHZhciBtYWluQXhpcyA9IGJhc2VQbGFjZW1lbnQgPyBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCkgOiBudWxsO1xuXG4gIGlmIChtYWluQXhpcyAhPSBudWxsKSB7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICBzd2l0Y2ggKHZhcmlhdGlvbikge1xuICAgICAgY2FzZSBzdGFydDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBvZmZzZXRzW21haW5BeGlzXSAtIChyZWZlcmVuY2VbbGVuXSAvIDIgLSBlbGVtZW50W2xlbl0gLyAyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgZW5kOlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdICsgKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn0iLCAiaW1wb3J0IGdldENsaXBwaW5nUmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENsaXBwaW5nUmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gXCIuL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBjbGlwcGluZ1BhcmVudHMsIHJlZmVyZW5jZSwgcG9wcGVyLCBib3R0b20sIHRvcCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4uL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuL21lcmdlUGFkZGluZ09iamVjdC5qc1wiO1xuaW1wb3J0IGV4cGFuZFRvSGFzaE1hcCBmcm9tIFwiLi9leHBhbmRUb0hhc2hNYXAuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIF9vcHRpb25zJHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gc3RhdGUucGxhY2VtZW50IDogX29wdGlvbnMkcGxhY2VtZW50LFxuICAgICAgX29wdGlvbnMkc3RyYXRlZ3kgPSBfb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIHN0cmF0ZWd5ID0gX29wdGlvbnMkc3RyYXRlZ3kgPT09IHZvaWQgMCA/IHN0YXRlLnN0cmF0ZWd5IDogX29wdGlvbnMkc3RyYXRlZ3ksXG4gICAgICBfb3B0aW9ucyRib3VuZGFyeSA9IF9vcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucyRib3VuZGFyeSA9PT0gdm9pZCAwID8gY2xpcHBpbmdQYXJlbnRzIDogX29wdGlvbnMkYm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRyb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucyRyb290Qm91bmRhcnkgPT09IHZvaWQgMCA/IHZpZXdwb3J0IDogX29wdGlvbnMkcm9vdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZWxlbWVudENvbnRlID0gX29wdGlvbnMuZWxlbWVudENvbnRleHQsXG4gICAgICBlbGVtZW50Q29udGV4dCA9IF9vcHRpb25zJGVsZW1lbnRDb250ZSA9PT0gdm9pZCAwID8gcG9wcGVyIDogX29wdGlvbnMkZWxlbWVudENvbnRlLFxuICAgICAgX29wdGlvbnMkYWx0Qm91bmRhcnkgPSBfb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMkYWx0Qm91bmRhcnkgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucyRwYWRkaW5nID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkcGFkZGluZztcbiAgdmFyIHBhZGRpbmdPYmplY3QgPSBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xuICB2YXIgYWx0Q29udGV4dCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyByZWZlcmVuY2UgOiBwb3BwZXI7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW2FsdEJvdW5kYXJ5ID8gYWx0Q29udGV4dCA6IGVsZW1lbnRDb250ZXh0XTtcbiAgdmFyIGNsaXBwaW5nQ2xpZW50UmVjdCA9IGdldENsaXBwaW5nUmVjdChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50IDogZWxlbWVudC5jb250ZXh0RWxlbWVudCB8fCBnZXREb2N1bWVudEVsZW1lbnQoc3RhdGUuZWxlbWVudHMucG9wcGVyKSwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSwgc3RyYXRlZ3kpO1xuICB2YXIgcmVmZXJlbmNlQ2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChzdGF0ZS5lbGVtZW50cy5yZWZlcmVuY2UpO1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUNsaWVudFJlY3QsXG4gICAgZWxlbWVudDogcG9wcGVyUmVjdCxcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KTtcbiAgdmFyIHBvcHBlckNsaWVudFJlY3QgPSByZWN0VG9DbGllbnRSZWN0KE9iamVjdC5hc3NpZ24oe30sIHBvcHBlclJlY3QsIHBvcHBlck9mZnNldHMpKTtcbiAgdmFyIGVsZW1lbnRDbGllbnRSZWN0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHBvcHBlckNsaWVudFJlY3QgOiByZWZlcmVuY2VDbGllbnRSZWN0OyAvLyBwb3NpdGl2ZSA9IG92ZXJmbG93aW5nIHRoZSBjbGlwcGluZyByZWN0XG4gIC8vIDAgb3IgbmVnYXRpdmUgPSB3aXRoaW4gdGhlIGNsaXBwaW5nIHJlY3RcblxuICB2YXIgb3ZlcmZsb3dPZmZzZXRzID0ge1xuICAgIHRvcDogY2xpcHBpbmdDbGllbnRSZWN0LnRvcCAtIGVsZW1lbnRDbGllbnRSZWN0LnRvcCArIHBhZGRpbmdPYmplY3QudG9wLFxuICAgIGJvdHRvbTogZWxlbWVudENsaWVudFJlY3QuYm90dG9tIC0gY2xpcHBpbmdDbGllbnRSZWN0LmJvdHRvbSArIHBhZGRpbmdPYmplY3QuYm90dG9tLFxuICAgIGxlZnQ6IGNsaXBwaW5nQ2xpZW50UmVjdC5sZWZ0IC0gZWxlbWVudENsaWVudFJlY3QubGVmdCArIHBhZGRpbmdPYmplY3QubGVmdCxcbiAgICByaWdodDogZWxlbWVudENsaWVudFJlY3QucmlnaHQgLSBjbGlwcGluZ0NsaWVudFJlY3QucmlnaHQgKyBwYWRkaW5nT2JqZWN0LnJpZ2h0XG4gIH07XG4gIHZhciBvZmZzZXREYXRhID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQ7IC8vIE9mZnNldHMgY2FuIGJlIGFwcGxpZWQgb25seSB0byB0aGUgcG9wcGVyIGVsZW1lbnRcblxuICBpZiAoZWxlbWVudENvbnRleHQgPT09IHBvcHBlciAmJiBvZmZzZXREYXRhKSB7XG4gICAgdmFyIG9mZnNldCA9IG9mZnNldERhdGFbcGxhY2VtZW50XTtcbiAgICBPYmplY3Qua2V5cyhvdmVyZmxvd09mZnNldHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIG11bHRpcGx5ID0gW3JpZ2h0LCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gMSA6IC0xO1xuICAgICAgdmFyIGF4aXMgPSBbdG9wLCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gJ3knIDogJ3gnO1xuICAgICAgb3ZlcmZsb3dPZmZzZXRzW2tleV0gKz0gb2Zmc2V0W2F4aXNdICogbXVsdGlwbHk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gb3ZlcmZsb3dPZmZzZXRzO1xufSIsICJpbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgdmFyaWF0aW9uUGxhY2VtZW50cywgYmFzZVBsYWNlbWVudHMsIHBsYWNlbWVudHMgYXMgYWxsUGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPSBfb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPT09IHZvaWQgMCA/IGFsbFBsYWNlbWVudHMgOiBfb3B0aW9ucyRhbGxvd2VkQXV0b1A7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KTtcbiAgdmFyIHBsYWNlbWVudHMgPSB2YXJpYXRpb24gPyBmbGlwVmFyaWF0aW9ucyA/IHZhcmlhdGlvblBsYWNlbWVudHMgOiB2YXJpYXRpb25QbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSB2YXJpYXRpb247XG4gIH0pIDogYmFzZVBsYWNlbWVudHM7XG4gIHZhciBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWxsb3dlZEF1dG9QbGFjZW1lbnRzLmluZGV4T2YocGxhY2VtZW50KSA+PSAwO1xuICB9KTtcblxuICBpZiAoYWxsb3dlZFBsYWNlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzO1xuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdOiBGbG93IHNlZW1zIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCB0d28gYXJyYXkgdW5pb25zLi4uXG5cblxuICB2YXIgb3ZlcmZsb3dzID0gYWxsb3dlZFBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSlbZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpXTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdmVyZmxvd3MpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dzW2FdIC0gb3ZlcmZsb3dzW2JdO1xuICB9KTtcbn0iLCAiaW1wb3J0IGdldE9wcG9zaXRlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBjb21wdXRlQXV0b1BsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IGJvdHRvbSwgdG9wLCBzdGFydCwgcmlnaHQsIGxlZnQsIGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmZ1bmN0aW9uIGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHBsYWNlbWVudCkge1xuICBpZiAoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIG9wcG9zaXRlUGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgcmV0dXJuIFtnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpLCBvcHBvc2l0ZVBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQob3Bwb3NpdGVQbGFjZW1lbnQpXTtcbn1cblxuZnVuY3Rpb24gZmxpcChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyA9IG9wdGlvbnMuZmFsbGJhY2tQbGFjZW1lbnRzLFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZmxpcFZhcmlhdGlvID0gb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMkZmxpcFZhcmlhdGlvID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZmxpcFZhcmlhdGlvLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHM7XG4gIHZhciBwcmVmZXJyZWRQbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSBiYXNlUGxhY2VtZW50ID09PSBwcmVmZXJyZWRQbGFjZW1lbnQ7XG4gIHZhciBmYWxsYmFja1BsYWNlbWVudHMgPSBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgfHwgKGlzQmFzZVBsYWNlbWVudCB8fCAhZmxpcFZhcmlhdGlvbnMgPyBbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KV0gOiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwcmVmZXJyZWRQbGFjZW1lbnQpKTtcbiAgdmFyIHBsYWNlbWVudHMgPSBbcHJlZmVycmVkUGxhY2VtZW50XS5jb25jYXQoZmFsbGJhY2tQbGFjZW1lbnRzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvID8gY29tcHV0ZUF1dG9QbGFjZW1lbnQoc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnM6IGZsaXBWYXJpYXRpb25zLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBhbGxvd2VkQXV0b1BsYWNlbWVudHNcbiAgICB9KSA6IHBsYWNlbWVudCk7XG4gIH0sIFtdKTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgY2hlY2tzTWFwID0gbmV3IE1hcCgpO1xuICB2YXIgbWFrZUZhbGxiYWNrQ2hlY2tzID0gdHJ1ZTtcbiAgdmFyIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHNbMF07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbGFjZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBsYWNlbWVudCA9IHBsYWNlbWVudHNbaV07XG5cbiAgICB2YXIgX2Jhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG5cbiAgICB2YXIgaXNTdGFydFZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSBzdGFydDtcbiAgICB2YXIgaXNWZXJ0aWNhbCA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihfYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KTtcbiAgICB2YXIgbWFpblZhcmlhdGlvblNpZGUgPSBpc1ZlcnRpY2FsID8gaXNTdGFydFZhcmlhdGlvbiA/IHJpZ2h0IDogbGVmdCA6IGlzU3RhcnRWYXJpYXRpb24gPyBib3R0b20gOiB0b3A7XG5cbiAgICBpZiAocmVmZXJlbmNlUmVjdFtsZW5dID4gcG9wcGVyUmVjdFtsZW5dKSB7XG4gICAgICBtYWluVmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB9XG5cbiAgICB2YXIgYWx0VmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB2YXIgY2hlY2tzID0gW107XG5cbiAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbX2Jhc2VQbGFjZW1lbnRdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKG92ZXJmbG93W21haW5WYXJpYXRpb25TaWRlXSA8PSAwLCBvdmVyZmxvd1thbHRWYXJpYXRpb25TaWRlXSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tzLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH0pKSB7XG4gICAgICBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gICAgICBtYWtlRmFsbGJhY2tDaGVja3MgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNoZWNrc01hcC5zZXQocGxhY2VtZW50LCBjaGVja3MpO1xuICB9XG5cbiAgaWYgKG1ha2VGYWxsYmFja0NoZWNrcykge1xuICAgIC8vIGAyYCBtYXkgYmUgZGVzaXJlZCBpbiBzb21lIGNhc2VzIOKAkyByZXNlYXJjaCBsYXRlclxuICAgIHZhciBudW1iZXJPZkNoZWNrcyA9IGZsaXBWYXJpYXRpb25zID8gMyA6IDE7XG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChfaSkge1xuICAgICAgdmFyIGZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzLmZpbmQoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gY2hlY2tzTWFwLmdldChwbGFjZW1lbnQpO1xuXG4gICAgICAgIGlmIChjaGVja3MpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tzLnNsaWNlKDAsIF9pKS5ldmVyeShmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiBjaGVjaztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChmaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IGZpdHRpbmdQbGFjZW1lbnQ7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIF9pID0gbnVtYmVyT2ZDaGVja3M7IF9pID4gMDsgX2ktLSkge1xuICAgICAgdmFyIF9yZXQgPSBfbG9vcChfaSk7XG5cbiAgICAgIGlmIChfcmV0ID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS5wbGFjZW1lbnQgIT09IGZpcnN0Rml0dGluZ1BsYWNlbWVudCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXAgPSB0cnVlO1xuICAgIHN0YXRlLnBsYWNlbWVudCA9IGZpcnN0Rml0dGluZ1BsYWNlbWVudDtcbiAgICBzdGF0ZS5yZXNldCA9IHRydWU7XG4gIH1cbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2ZsaXAnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogZmxpcCxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXSxcbiAgZGF0YToge1xuICAgIF9za2lwOiBmYWxzZVxuICB9XG59OyIsICJpbXBvcnQgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcblxuZnVuY3Rpb24gZ2V0U2lkZU9mZnNldHMob3ZlcmZsb3csIHJlY3QsIHByZXZlbnRlZE9mZnNldHMpIHtcbiAgaWYgKHByZXZlbnRlZE9mZnNldHMgPT09IHZvaWQgMCkge1xuICAgIHByZXZlbnRlZE9mZnNldHMgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvcDogb3ZlcmZsb3cudG9wIC0gcmVjdC5oZWlnaHQgLSBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgcmlnaHQ6IG92ZXJmbG93LnJpZ2h0IC0gcmVjdC53aWR0aCArIHByZXZlbnRlZE9mZnNldHMueCxcbiAgICBib3R0b206IG92ZXJmbG93LmJvdHRvbSAtIHJlY3QuaGVpZ2h0ICsgcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIGxlZnQ6IG92ZXJmbG93LmxlZnQgLSByZWN0LndpZHRoIC0gcHJldmVudGVkT2Zmc2V0cy54XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChvdmVyZmxvdykge1xuICByZXR1cm4gW3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdF0uc29tZShmdW5jdGlvbiAoc2lkZSkge1xuICAgIHJldHVybiBvdmVyZmxvd1tzaWRlXSA+PSAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaGlkZShfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBwcmV2ZW50ZWRPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wcmV2ZW50T3ZlcmZsb3c7XG4gIHZhciByZWZlcmVuY2VPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgZWxlbWVudENvbnRleHQ6ICdyZWZlcmVuY2UnXG4gIH0pO1xuICB2YXIgcG9wcGVyQWx0T3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGFsdEJvdW5kYXJ5OiB0cnVlXG4gIH0pO1xuICB2YXIgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocmVmZXJlbmNlT3ZlcmZsb3csIHJlZmVyZW5jZVJlY3QpO1xuICB2YXIgcG9wcGVyRXNjYXBlT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHBvcHBlckFsdE92ZXJmbG93LCBwb3BwZXJSZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKTtcbiAgdmFyIGlzUmVmZXJlbmNlSGlkZGVuID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyk7XG4gIHZhciBoYXNQb3BwZXJFc2NhcGVkID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHBvcHBlckVzY2FwZU9mZnNldHMpO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0ge1xuICAgIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0czogcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzLFxuICAgIHBvcHBlckVzY2FwZU9mZnNldHM6IHBvcHBlckVzY2FwZU9mZnNldHMsXG4gICAgaXNSZWZlcmVuY2VIaWRkZW46IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgIGhhc1BvcHBlckVzY2FwZWQ6IGhhc1BvcHBlckVzY2FwZWRcbiAgfTtcbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgICdkYXRhLXBvcHBlci1yZWZlcmVuY2UtaGlkZGVuJzogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgJ2RhdGEtcG9wcGVyLWVzY2FwZWQnOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnaGlkZScsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J10sXG4gIGZuOiBoaWRlXG59OyIsICJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgcGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHJlY3RzLCBvZmZzZXQpIHtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHZhciBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicgPyBvZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgcmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KSkgOiBvZmZzZXQsXG4gICAgICBza2lkZGluZyA9IF9yZWZbMF0sXG4gICAgICBkaXN0YW5jZSA9IF9yZWZbMV07XG5cbiAgc2tpZGRpbmcgPSBza2lkZGluZyB8fCAwO1xuICBkaXN0YW5jZSA9IChkaXN0YW5jZSB8fCAwKSAqIGludmVydERpc3RhbmNlO1xuICByZXR1cm4gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyB7XG4gICAgeDogZGlzdGFuY2UsXG4gICAgeTogc2tpZGRpbmdcbiAgfSA6IHtcbiAgICB4OiBza2lkZGluZyxcbiAgICB5OiBkaXN0YW5jZVxuICB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmMi5uYW1lO1xuICB2YXIgX29wdGlvbnMkb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfb3B0aW9ucyRvZmZzZXQgPT09IHZvaWQgMCA/IFswLCAwXSA6IF9vcHRpb25zJG9mZnNldDtcbiAgdmFyIGRhdGEgPSBwbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgc3RhdGUucmVjdHMsIG9mZnNldCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICB2YXIgX2RhdGEkc3RhdGUkcGxhY2VtZW50ID0gZGF0YVtzdGF0ZS5wbGFjZW1lbnRdLFxuICAgICAgeCA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC54LFxuICAgICAgeSA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC55O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy54ICs9IHg7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnkgKz0geTtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0XG59OyIsICJpbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4uL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5cbmZ1bmN0aW9uIHBvcHBlck9mZnNldHMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgLy8gT2Zmc2V0cyBhcmUgdGhlIGFjdHVhbCBwb3NpdGlvbiB0aGUgcG9wcGVyIG5lZWRzIHRvIGhhdmUgdG8gYmVcbiAgLy8gcHJvcGVybHkgcG9zaXRpb25lZCBuZWFyIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHBsYWNlbWVudCwgYW5kIHdpbGwgYmUgYWRqdXN0ZWQgYnlcbiAgLy8gdGhlIG1vZGlmaWVycyBpbiB0aGUgbmV4dCBzdGVwXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiBzdGF0ZS5yZWN0cy5yZWZlcmVuY2UsXG4gICAgZWxlbWVudDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncG9wcGVyT2Zmc2V0cycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAncmVhZCcsXG4gIGZuOiBwb3BwZXJPZmZzZXRzLFxuICBkYXRhOiB7fVxufTsiLCAiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBzdGFydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldEFsdEF4aXMgZnJvbSBcIi4uL3V0aWxzL2dldEFsdEF4aXMuanNcIjtcbmltcG9ydCB7IHdpdGhpbiwgd2l0aGluTWF4Q2xhbXAgfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi4vdXRpbHMvZ2V0RnJlc2hTaWRlT2JqZWN0LmpzXCI7XG5pbXBvcnQgeyBtaW4gYXMgbWF0aE1pbiwgbWF4IGFzIG1hdGhNYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBwcmV2ZW50T3ZlcmZsb3coX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEF4aXMsXG4gICAgICBib3VuZGFyeSA9IG9wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBvcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXIgPSBvcHRpb25zLnRldGhlcixcbiAgICAgIHRldGhlciA9IF9vcHRpb25zJHRldGhlciA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHRldGhlcixcbiAgICAgIF9vcHRpb25zJHRldGhlck9mZnNldCA9IG9wdGlvbnMudGV0aGVyT2Zmc2V0LFxuICAgICAgdGV0aGVyT2Zmc2V0ID0gX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkdGV0aGVyT2Zmc2V0O1xuICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeVxuICB9KTtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9ICF2YXJpYXRpb247XG4gIHZhciBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGFsdEF4aXMgPSBnZXRBbHRBeGlzKG1haW5BeGlzKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHRldGhlck9mZnNldFZhbHVlID0gdHlwZW9mIHRldGhlck9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IHRldGhlck9mZnNldChPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHRldGhlck9mZnNldDtcbiAgdmFyIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXRWYWx1ZSA9PT0gJ251bWJlcicgPyB7XG4gICAgbWFpbkF4aXM6IHRldGhlck9mZnNldFZhbHVlLFxuICAgIGFsdEF4aXM6IHRldGhlck9mZnNldFZhbHVlXG4gIH0gOiBPYmplY3QuYXNzaWduKHtcbiAgICBtYWluQXhpczogMCxcbiAgICBhbHRBeGlzOiAwXG4gIH0sIHRldGhlck9mZnNldFZhbHVlKTtcbiAgdmFyIG9mZnNldE1vZGlmaWVyU3RhdGUgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldCA/IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0W3N0YXRlLnBsYWNlbWVudF0gOiBudWxsO1xuICB2YXIgZGF0YSA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQ7XG5cbiAgICB2YXIgbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgICB2YXIgYWx0U2lkZSA9IG1haW5BeGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICB2YXIgb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1ttYWluQXhpc107XG4gICAgdmFyIG1pbiA9IG9mZnNldCArIG92ZXJmbG93W21haW5TaWRlXTtcbiAgICB2YXIgbWF4ID0gb2Zmc2V0IC0gb3ZlcmZsb3dbYWx0U2lkZV07XG4gICAgdmFyIGFkZGl0aXZlID0gdGV0aGVyID8gLXBvcHBlclJlY3RbbGVuXSAvIDIgOiAwO1xuICAgIHZhciBtaW5MZW4gPSB2YXJpYXRpb24gPT09IHN0YXJ0ID8gcmVmZXJlbmNlUmVjdFtsZW5dIDogcG9wcGVyUmVjdFtsZW5dO1xuICAgIHZhciBtYXhMZW4gPSB2YXJpYXRpb24gPT09IHN0YXJ0ID8gLXBvcHBlclJlY3RbbGVuXSA6IC1yZWZlcmVuY2VSZWN0W2xlbl07IC8vIFdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgYXJyb3cgaW4gdGhlIGNhbGN1bGF0aW9uIHNvIHRoZSBhcnJvdyBkb2Vzbid0IGdvXG4gICAgLy8gb3V0c2lkZSB0aGUgcmVmZXJlbmNlIGJvdW5kc1xuXG4gICAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICAgIHZhciBhcnJvd1JlY3QgPSB0ZXRoZXIgJiYgYXJyb3dFbGVtZW50ID8gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpIDoge1xuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuICAgIHZhciBhcnJvd1BhZGRpbmdPYmplY3QgPSBzdGF0ZS5tb2RpZmllcnNEYXRhWydhcnJvdyNwZXJzaXN0ZW50J10gPyBzdGF0ZS5tb2RpZmllcnNEYXRhWydhcnJvdyNwZXJzaXN0ZW50J10ucGFkZGluZyA6IGdldEZyZXNoU2lkZU9iamVjdCgpO1xuICAgIHZhciBhcnJvd1BhZGRpbmdNaW4gPSBhcnJvd1BhZGRpbmdPYmplY3RbbWFpblNpZGVdO1xuICAgIHZhciBhcnJvd1BhZGRpbmdNYXggPSBhcnJvd1BhZGRpbmdPYmplY3RbYWx0U2lkZV07IC8vIElmIHRoZSByZWZlcmVuY2UgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiB0aGUgYXJyb3cgbGVuZ3RoLCB3ZSBkb24ndCB3YW50XG4gICAgLy8gdG8gaW5jbHVkZSBpdHMgZnVsbCBzaXplIGluIHRoZSBjYWxjdWxhdGlvbi4gSWYgdGhlIHJlZmVyZW5jZSBpcyBzbWFsbFxuICAgIC8vIGFuZCBuZWFyIHRoZSBlZGdlIG9mIGEgYm91bmRhcnksIHRoZSBwb3BwZXIgY2FuIG92ZXJmbG93IGV2ZW4gaWYgdGhlXG4gICAgLy8gcmVmZXJlbmNlIGlzIG5vdCBvdmVyZmxvd2luZyBhcyB3ZWxsIChlLmcuIHZpcnR1YWwgZWxlbWVudHMgd2l0aCBub1xuICAgIC8vIHdpZHRoIG9yIGhlaWdodClcblxuICAgIHZhciBhcnJvd0xlbiA9IHdpdGhpbigwLCByZWZlcmVuY2VSZWN0W2xlbl0sIGFycm93UmVjdFtsZW5dKTtcbiAgICB2YXIgbWluT2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiAtIGFkZGl0aXZlIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXMgOiBtaW5MZW4gLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcztcbiAgICB2YXIgbWF4T2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gLXJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgKyBhZGRpdGl2ZSArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWF4TGVuICsgYXJyb3dMZW4gKyBhcnJvd1BhZGRpbmdNYXggKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3cgJiYgZ2V0T2Zmc2V0UGFyZW50KHN0YXRlLmVsZW1lbnRzLmFycm93KTtcbiAgICB2YXIgY2xpZW50T2Zmc2V0ID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBtYWluQXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50VG9wIHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRMZWZ0IHx8IDAgOiAwO1xuICAgIHZhciBvZmZzZXRNb2RpZmllclZhbHVlID0gKF9vZmZzZXRNb2RpZmllclN0YXRlJCA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbbWFpbkF4aXNdKSAhPSBudWxsID8gX29mZnNldE1vZGlmaWVyU3RhdGUkIDogMDtcbiAgICB2YXIgdGV0aGVyTWluID0gb2Zmc2V0ICsgbWluT2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZSAtIGNsaWVudE9mZnNldDtcbiAgICB2YXIgdGV0aGVyTWF4ID0gb2Zmc2V0ICsgbWF4T2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZTtcbiAgICB2YXIgcHJldmVudGVkT2Zmc2V0ID0gd2l0aGluKHRldGhlciA/IG1hdGhNaW4obWluLCB0ZXRoZXJNaW4pIDogbWluLCBvZmZzZXQsIHRldGhlciA/IG1hdGhNYXgobWF4LCB0ZXRoZXJNYXgpIDogbWF4KTtcbiAgICBwb3BwZXJPZmZzZXRzW21haW5BeGlzXSA9IHByZXZlbnRlZE9mZnNldDtcbiAgICBkYXRhW21haW5BeGlzXSA9IHByZXZlbnRlZE9mZnNldCAtIG9mZnNldDtcbiAgfVxuXG4gIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkMjtcblxuICAgIHZhciBfbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gdG9wIDogbGVmdDtcblxuICAgIHZhciBfYWx0U2lkZSA9IG1haW5BeGlzID09PSAneCcgPyBib3R0b20gOiByaWdodDtcblxuICAgIHZhciBfb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1thbHRBeGlzXTtcblxuICAgIHZhciBfbGVuID0gYWx0QXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gICAgdmFyIF9taW4gPSBfb2Zmc2V0ICsgb3ZlcmZsb3dbX21haW5TaWRlXTtcblxuICAgIHZhciBfbWF4ID0gX29mZnNldCAtIG92ZXJmbG93W19hbHRTaWRlXTtcblxuICAgIHZhciBpc09yaWdpblNpZGUgPSBbdG9wLCBsZWZ0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcblxuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyID0gb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogb2Zmc2V0TW9kaWZpZXJTdGF0ZVthbHRBeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJDIgOiAwO1xuXG4gICAgdmFyIF90ZXRoZXJNaW4gPSBpc09yaWdpblNpZGUgPyBfbWluIDogX29mZnNldCAtIHJlZmVyZW5jZVJlY3RbX2xlbl0gLSBwb3BwZXJSZWN0W19sZW5dIC0gX29mZnNldE1vZGlmaWVyVmFsdWUgKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUuYWx0QXhpcztcblxuICAgIHZhciBfdGV0aGVyTWF4ID0gaXNPcmlnaW5TaWRlID8gX29mZnNldCArIHJlZmVyZW5jZVJlY3RbX2xlbl0gKyBwb3BwZXJSZWN0W19sZW5dIC0gX29mZnNldE1vZGlmaWVyVmFsdWUgLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUuYWx0QXhpcyA6IF9tYXg7XG5cbiAgICB2YXIgX3ByZXZlbnRlZE9mZnNldCA9IHRldGhlciAmJiBpc09yaWdpblNpZGUgPyB3aXRoaW5NYXhDbGFtcChfdGV0aGVyTWluLCBfb2Zmc2V0LCBfdGV0aGVyTWF4KSA6IHdpdGhpbih0ZXRoZXIgPyBfdGV0aGVyTWluIDogX21pbiwgX29mZnNldCwgdGV0aGVyID8gX3RldGhlck1heCA6IF9tYXgpO1xuXG4gICAgcG9wcGVyT2Zmc2V0c1thbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVthbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQgLSBfb2Zmc2V0O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogcHJldmVudE92ZXJmbG93LFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddXG59OyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRBbHRBeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd4JyA/ICd5JyA6ICd4Jztcbn0iLCAiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXROb2RlU2Nyb2xsIGZyb20gXCIuL2dldE5vZGVTY3JvbGwuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50U2NhbGVkKGVsZW1lbnQpIHtcbiAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gcm91bmQocmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDE7XG4gIHZhciBzY2FsZVkgPSByb3VuZChyZWN0LmhlaWdodCkgLyBlbGVtZW50Lm9mZnNldEhlaWdodCB8fCAxO1xuICByZXR1cm4gc2NhbGVYICE9PSAxIHx8IHNjYWxlWSAhPT0gMTtcbn0gLy8gUmV0dXJucyB0aGUgY29tcG9zaXRlIHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LlxuLy8gQ29tcG9zaXRlIG1lYW5zIGl0IHRha2VzIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zIGFzIHdlbGwgYXMgbGF5b3V0LlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXBvc2l0ZVJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudCwgaXNGaXhlZCkge1xuICBpZiAoaXNGaXhlZCA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50SXNTY2FsZWQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgaXNFbGVtZW50U2NhbGVkKG9mZnNldFBhcmVudCk7XG4gIHZhciBkb2N1bWVudEVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudElzU2NhbGVkLCBpc0ZpeGVkKTtcbiAgdmFyIHNjcm9sbCA9IHtcbiAgICBzY3JvbGxMZWZ0OiAwLFxuICAgIHNjcm9sbFRvcDogMFxuICB9O1xuICB2YXIgb2Zmc2V0cyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmICFpc0ZpeGVkKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEwNzhcbiAgICBpc1Njcm9sbFBhcmVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgb2Zmc2V0cyA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQsIHRydWUpO1xuICAgICAgb2Zmc2V0cy54ICs9IG9mZnNldFBhcmVudC5jbGllbnRMZWZ0O1xuICAgICAgb2Zmc2V0cy55ICs9IG9mZnNldFBhcmVudC5jbGllbnRUb3A7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIG9mZnNldHMueCA9IGdldFdpbmRvd1Njcm9sbEJhclgoZG9jdW1lbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IHJlY3QubGVmdCArIHNjcm9sbC5zY3JvbGxMZWZ0IC0gb2Zmc2V0cy54LFxuICAgIHk6IHJlY3QudG9wICsgc2Nyb2xsLnNjcm9sbFRvcCAtIG9mZnNldHMueSxcbiAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XG4gIH07XG59IiwgImltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRIVE1MRWxlbWVudFNjcm9sbCBmcm9tIFwiLi9nZXRIVE1MRWxlbWVudFNjcm9sbC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Tm9kZVNjcm9sbChub2RlKSB7XG4gIGlmIChub2RlID09PSBnZXRXaW5kb3cobm9kZSkgfHwgIWlzSFRNTEVsZW1lbnQobm9kZSkpIHtcbiAgICByZXR1cm4gZ2V0V2luZG93U2Nyb2xsKG5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBnZXRIVE1MRWxlbWVudFNjcm9sbChub2RlKTtcbiAgfVxufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRIVE1MRWxlbWVudFNjcm9sbChlbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgfTtcbn0iLCAiaW1wb3J0IHsgbW9kaWZpZXJQaGFzZXMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjsgLy8gc291cmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTg3NTI1NVxuXG5mdW5jdGlvbiBvcmRlcihtb2RpZmllcnMpIHtcbiAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgbWFwLnNldChtb2RpZmllci5uYW1lLCBtb2RpZmllcik7XG4gIH0pOyAvLyBPbiB2aXNpdGluZyBvYmplY3QsIGNoZWNrIGZvciBpdHMgZGVwZW5kZW5jaWVzIGFuZCB2aXNpdCB0aGVtIHJlY3Vyc2l2ZWx5XG5cbiAgZnVuY3Rpb24gc29ydChtb2RpZmllcikge1xuICAgIHZpc2l0ZWQuYWRkKG1vZGlmaWVyLm5hbWUpO1xuICAgIHZhciByZXF1aXJlcyA9IFtdLmNvbmNhdChtb2RpZmllci5yZXF1aXJlcyB8fCBbXSwgbW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cyB8fCBbXSk7XG4gICAgcmVxdWlyZXMuZm9yRWFjaChmdW5jdGlvbiAoZGVwKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGRlcCkpIHtcbiAgICAgICAgdmFyIGRlcE1vZGlmaWVyID0gbWFwLmdldChkZXApO1xuXG4gICAgICAgIGlmIChkZXBNb2RpZmllcikge1xuICAgICAgICAgIHNvcnQoZGVwTW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVzdWx0LnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgaWYgKCF2aXNpdGVkLmhhcyhtb2RpZmllci5uYW1lKSkge1xuICAgICAgLy8gY2hlY2sgZm9yIHZpc2l0ZWQgb2JqZWN0XG4gICAgICBzb3J0KG1vZGlmaWVyKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvcmRlck1vZGlmaWVycyhtb2RpZmllcnMpIHtcbiAgLy8gb3JkZXIgYmFzZWQgb24gZGVwZW5kZW5jaWVzXG4gIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXIobW9kaWZpZXJzKTsgLy8gb3JkZXIgYmFzZWQgb24gcGhhc2VcblxuICByZXR1cm4gbW9kaWZpZXJQaGFzZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBoYXNlKSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQob3JkZXJlZE1vZGlmaWVycy5maWx0ZXIoZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICByZXR1cm4gbW9kaWZpZXIucGhhc2UgPT09IHBoYXNlO1xuICAgIH0pKTtcbiAgfSwgW10pO1xufSIsICJpbXBvcnQgZ2V0Q29tcG9zaXRlUmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IG9yZGVyTW9kaWZpZXJzIGZyb20gXCIuL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzXCI7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSBcIi4vdXRpbHMvZGVib3VuY2UuanNcIjtcbmltcG9ydCBtZXJnZUJ5TmFtZSBmcm9tIFwiLi91dGlscy9tZXJnZUJ5TmFtZS5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgbW9kaWZpZXJzOiBbXSxcbiAgc3RyYXRlZ3k6ICdhYnNvbHV0ZSdcbn07XG5cbmZ1bmN0aW9uIGFyZVZhbGlkRWxlbWVudHMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gIWFyZ3Muc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHJldHVybiAhKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID09PSAnZnVuY3Rpb24nKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3BwZXJHZW5lcmF0b3IoZ2VuZXJhdG9yT3B0aW9ucykge1xuICBpZiAoZ2VuZXJhdG9yT3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgZ2VuZXJhdG9yT3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9nZW5lcmF0b3JPcHRpb25zID0gZ2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRNb2RpZmllcnMsXG4gICAgICBkZWZhdWx0TW9kaWZpZXJzID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmID09PSB2b2lkIDAgPyBbXSA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZixcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIGRlZmF1bHRPcHRpb25zID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9PT0gdm9pZCAwID8gREVGQVVMVF9PUFRJT05TIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmMjtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVBvcHBlcihyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICB9XG5cbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICAgICAgb3JkZXJlZE1vZGlmaWVyczogW10sXG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIGRlZmF1bHRPcHRpb25zKSxcbiAgICAgIG1vZGlmaWVyc0RhdGE6IHt9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlcjogcG9wcGVyXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBzdHlsZXM6IHt9XG4gICAgfTtcbiAgICB2YXIgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIHZhciBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoc2V0T3B0aW9uc0FjdGlvbikge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzZXRPcHRpb25zQWN0aW9uID09PSAnZnVuY3Rpb24nID8gc2V0T3B0aW9uc0FjdGlvbihzdGF0ZS5vcHRpb25zKSA6IHNldE9wdGlvbnNBY3Rpb247XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgc3RhdGUub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBzdGF0ZS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGlzRWxlbWVudChyZWZlcmVuY2UpID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlKSA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkgOiBbXSxcbiAgICAgICAgICBwb3BwZXI6IGxpc3RTY3JvbGxQYXJlbnRzKHBvcHBlcilcbiAgICAgICAgfTsgLy8gT3JkZXJzIHRoZSBtb2RpZmllcnMgYmFzZWQgb24gdGhlaXIgZGVwZW5kZW5jaWVzIGFuZCBgcGhhc2VgXG4gICAgICAgIC8vIHByb3BlcnRpZXNcblxuICAgICAgICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyTW9kaWZpZXJzKG1lcmdlQnlOYW1lKFtdLmNvbmNhdChkZWZhdWx0TW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycykpKTsgLy8gU3RyaXAgb3V0IGRpc2FibGVkIG1vZGlmaWVyc1xuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgICAgIHJldHVybiBtLmVuYWJsZWQ7XG4gICAgICAgIH0pO1xuICAgICAgICBydW5Nb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIC8vIFN5bmMgdXBkYXRlIOKAkyBpdCB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZCwgZXZlbiBpZiBub3QgbmVjZXNzYXJ5LiBUaGlzXG4gICAgICAvLyBpcyB1c2VmdWwgZm9yIGxvdyBmcmVxdWVuY3kgdXBkYXRlcyB3aGVyZSBzeW5jIGJlaGF2aW9yIHNpbXBsaWZpZXMgdGhlXG4gICAgICAvLyBsb2dpYy5cbiAgICAgIC8vIEZvciBoaWdoIGZyZXF1ZW5jeSB1cGRhdGVzIChlLmcuIGByZXNpemVgIGFuZCBgc2Nyb2xsYCBldmVudHMpLCBhbHdheXNcbiAgICAgIC8vIHByZWZlciB0aGUgYXN5bmMgUG9wcGVyI3VwZGF0ZSBtZXRob2RcbiAgICAgIGZvcmNlVXBkYXRlOiBmdW5jdGlvbiBmb3JjZVVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKGlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9zdGF0ZSRlbGVtZW50cyA9IHN0YXRlLmVsZW1lbnRzLFxuICAgICAgICAgICAgcmVmZXJlbmNlID0gX3N0YXRlJGVsZW1lbnRzLnJlZmVyZW5jZSxcbiAgICAgICAgICAgIHBvcHBlciA9IF9zdGF0ZSRlbGVtZW50cy5wb3BwZXI7IC8vIERvbid0IHByb2NlZWQgaWYgYHJlZmVyZW5jZWAgb3IgYHBvcHBlcmAgYXJlIG5vdCB2YWxpZCBlbGVtZW50c1xuICAgICAgICAvLyBhbnltb3JlXG5cbiAgICAgICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIGFuZCBwb3BwZXIgcmVjdHMgdG8gYmUgcmVhZCBieSBtb2RpZmllcnNcblxuXG4gICAgICAgIHN0YXRlLnJlY3RzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogZ2V0Q29tcG9zaXRlUmVjdChyZWZlcmVuY2UsIGdldE9mZnNldFBhcmVudChwb3BwZXIpLCBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnKSxcbiAgICAgICAgICBwb3BwZXI6IGdldExheW91dFJlY3QocG9wcGVyKVxuICAgICAgICB9OyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUuIFRoZVxuICAgICAgICAvLyBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGUgYGZsaXBgIG1vZGlmaWVyIGNoYW5naW5nIHRoZVxuICAgICAgICAvLyBwbGFjZW1lbnQsIHdoaWNoIHRoZW4gbmVlZHMgdG8gcmUtcnVuIGFsbCB0aGUgbW9kaWZpZXJzLCBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBsb2dpYyB3YXMgcHJldmlvdXNseSByYW4gZm9yIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQgYW5kIGlzIHRoZXJlZm9yZVxuICAgICAgICAvLyBzdGFsZS9pbmNvcnJlY3RcblxuICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5wbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDsgLy8gT24gZWFjaCB1cGRhdGUgY3ljbGUsIHRoZSBgbW9kaWZpZXJzRGF0YWAgcHJvcGVydHkgZm9yIGVhY2ggbW9kaWZpZXJcbiAgICAgICAgLy8gaXMgZmlsbGVkIHdpdGggdGhlIGluaXRpYWwgZGF0YSBzcGVjaWZpZWQgYnkgdGhlIG1vZGlmaWVyLiBUaGlzIG1lYW5zXG4gICAgICAgIC8vIGl0IGRvZXNuJ3QgcGVyc2lzdCBhbmQgaXMgZnJlc2ggb24gZWFjaCB1cGRhdGUuXG4gICAgICAgIC8vIFRvIGVuc3VyZSBwZXJzaXN0ZW50IGRhdGEsIHVzZSBgJHtuYW1lfSNwZXJzaXN0ZW50YFxuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUubW9kaWZpZXJzRGF0YVttb2RpZmllci5uYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGlmaWVyLmRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBpZiAoc3RhdGUucmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZSA9IHN0YXRlLm9yZGVyZWRNb2RpZmllcnNbaW5kZXhdLFxuICAgICAgICAgICAgICBmbiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5mbixcbiAgICAgICAgICAgICAgX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5vcHRpb25zLFxuICAgICAgICAgICAgICBfb3B0aW9ucyA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPT09IHZvaWQgMCA/IHt9IDogX3N0YXRlJG9yZGVyZWRNb2RpZmllMixcbiAgICAgICAgICAgICAgbmFtZSA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5uYW1lO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3RhdGUgPSBmbih7XG4gICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgICAgb3B0aW9uczogX29wdGlvbnMsXG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgICAgICAgfSkgfHwgc3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gQXN5bmMgYW5kIG9wdGltaXN0aWNhbGx5IG9wdGltaXplZCB1cGRhdGUg4oCTIGl0IHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmXG4gICAgICAvLyBub3QgbmVjZXNzYXJ5IChkZWJvdW5jZWQgdG8gcnVuIGF0IG1vc3Qgb25jZS1wZXItdGljaylcbiAgICAgIHVwZGF0ZTogZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICBpbnN0YW5jZS5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zZXRPcHRpb25zKG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICBpZiAoIWlzRGVzdHJveWVkICYmIG9wdGlvbnMub25GaXJzdFVwZGF0ZSkge1xuICAgICAgICBvcHRpb25zLm9uRmlyc3RVcGRhdGUoc3RhdGUpO1xuICAgICAgfVxuICAgIH0pOyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byBleGVjdXRlIGFyYml0cmFyeSBjb2RlIGJlZm9yZSB0aGUgZmlyc3RcbiAgICAvLyB1cGRhdGUgY3ljbGUgcnVucy4gVGhleSB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSB1cGRhdGVcbiAgICAvLyBjeWNsZS4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIG1vZGlmaWVyIGFkZHMgc29tZSBwZXJzaXN0ZW50IGRhdGEgdGhhdFxuICAgIC8vIG90aGVyIG1vZGlmaWVycyBuZWVkIHRvIHVzZSwgYnV0IHRoZSBtb2RpZmllciBpcyBydW4gYWZ0ZXIgdGhlIGRlcGVuZGVudFxuICAgIC8vIG9uZS5cblxuICAgIGZ1bmN0aW9uIHJ1bk1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgICAgICAgIF9yZWYkb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfcmVmJG9wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRvcHRpb25zLFxuICAgICAgICAgICAgZWZmZWN0ID0gX3JlZi5lZmZlY3Q7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlZmZlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2xlYW51cEZuID0gZWZmZWN0KHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgbm9vcEZuID0gZnVuY3Rpb24gbm9vcEZuKCkge307XG5cbiAgICAgICAgICBlZmZlY3RDbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuIHx8IG5vb3BGbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSk7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuZXhwb3J0IHZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKCk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgZGV0ZWN0T3ZlcmZsb3cgfTsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVib3VuY2UoZm4pIHtcbiAgdmFyIHBlbmRpbmc7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXNvbHZlKGZuKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwZW5kaW5nO1xuICB9O1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZUJ5TmFtZShtb2RpZmllcnMpIHtcbiAgdmFyIG1lcmdlZCA9IG1vZGlmaWVycy5yZWR1Y2UoZnVuY3Rpb24gKG1lcmdlZCwgY3VycmVudCkge1xuICAgIHZhciBleGlzdGluZyA9IG1lcmdlZFtjdXJyZW50Lm5hbWVdO1xuICAgIG1lcmdlZFtjdXJyZW50Lm5hbWVdID0gZXhpc3RpbmcgPyBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZywgY3VycmVudCwge1xuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3Rpbmcub3B0aW9ucywgY3VycmVudC5vcHRpb25zKSxcbiAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLmRhdGEsIGN1cnJlbnQuZGF0YSlcbiAgICB9KSA6IGN1cnJlbnQ7XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfSwge30pOyAvLyBJRTExIGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LnZhbHVlc1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXJnZWQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIG1lcmdlZFtrZXldO1xuICB9KTtcbn0iLCAiaW1wb3J0IHsgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdyB9IGZyb20gXCIuL2NyZWF0ZVBvcHBlci5qc1wiO1xuaW1wb3J0IGV2ZW50TGlzdGVuZXJzIGZyb20gXCIuL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qc1wiO1xuaW1wb3J0IHBvcHBlck9mZnNldHMgZnJvbSBcIi4vbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanNcIjtcbmltcG9ydCBjb21wdXRlU3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzXCI7XG5pbXBvcnQgYXBwbHlTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2FwcGx5U3R5bGVzLmpzXCI7XG52YXIgZGVmYXVsdE1vZGlmaWVycyA9IFtldmVudExpc3RlbmVycywgcG9wcGVyT2Zmc2V0cywgY29tcHV0ZVN0eWxlcywgYXBwbHlTdHlsZXNdO1xudmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBkZWZhdWx0TW9kaWZpZXJzXG59KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIsIHBvcHBlckdlbmVyYXRvciwgZGVmYXVsdE1vZGlmaWVycywgZGV0ZWN0T3ZlcmZsb3cgfTsiLCAiaW1wb3J0IHsgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdyB9IGZyb20gXCIuL2NyZWF0ZVBvcHBlci5qc1wiO1xuaW1wb3J0IGV2ZW50TGlzdGVuZXJzIGZyb20gXCIuL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qc1wiO1xuaW1wb3J0IHBvcHBlck9mZnNldHMgZnJvbSBcIi4vbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanNcIjtcbmltcG9ydCBjb21wdXRlU3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzXCI7XG5pbXBvcnQgYXBwbHlTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2FwcGx5U3R5bGVzLmpzXCI7XG5pbXBvcnQgb2Zmc2V0IGZyb20gXCIuL21vZGlmaWVycy9vZmZzZXQuanNcIjtcbmltcG9ydCBmbGlwIGZyb20gXCIuL21vZGlmaWVycy9mbGlwLmpzXCI7XG5pbXBvcnQgcHJldmVudE92ZXJmbG93IGZyb20gXCIuL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBhcnJvdyBmcm9tIFwiLi9tb2RpZmllcnMvYXJyb3cuanNcIjtcbmltcG9ydCBoaWRlIGZyb20gXCIuL21vZGlmaWVycy9oaWRlLmpzXCI7XG52YXIgZGVmYXVsdE1vZGlmaWVycyA9IFtldmVudExpc3RlbmVycywgcG9wcGVyT2Zmc2V0cywgY29tcHV0ZVN0eWxlcywgYXBwbHlTdHlsZXMsIG9mZnNldCwgZmxpcCwgcHJldmVudE92ZXJmbG93LCBhcnJvdywgaGlkZV07XG52YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcih7XG4gIGRlZmF1bHRNb2RpZmllcnM6IGRlZmF1bHRNb2RpZmllcnNcbn0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciwgcG9wcGVyR2VuZXJhdG9yLCBkZWZhdWx0TW9kaWZpZXJzLCBkZXRlY3RPdmVyZmxvdyB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciBhcyBjcmVhdGVQb3BwZXJMaXRlIH0gZnJvbSBcIi4vcG9wcGVyLWxpdGUuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgKiBmcm9tIFwiLi9tb2RpZmllcnMvaW5kZXguanNcIjsiLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRyb3Bkb3duLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0ICogYXMgUG9wcGVyIGZyb20gJ0Bwb3BwZXJqcy9jb3JlJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuL2RvbS9tYW5pcHVsYXRvci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGV4ZWN1dGUsXG4gIGdldEVsZW1lbnQsXG4gIGdldE5leHRBY3RpdmVFbGVtZW50LFxuICBpc0Rpc2FibGVkLFxuICBpc0VsZW1lbnQsXG4gIGlzUlRMLFxuICBpc1Zpc2libGUsXG4gIG5vb3Bcbn0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnZHJvcGRvd24nXG5jb25zdCBEQVRBX0tFWSA9ICdicy5kcm9wZG93bidcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuXG5jb25zdCBFU0NBUEVfS0VZID0gJ0VzY2FwZSdcbmNvbnN0IFRBQl9LRVkgPSAnVGFiJ1xuY29uc3QgQVJST1dfVVBfS0VZID0gJ0Fycm93VXAnXG5jb25zdCBBUlJPV19ET1dOX0tFWSA9ICdBcnJvd0Rvd24nXG5jb25zdCBSSUdIVF9NT1VTRV9CVVRUT04gPSAyIC8vIE1vdXNlRXZlbnQuYnV0dG9uIHZhbHVlIGZvciB0aGUgc2Vjb25kYXJ5IGJ1dHRvbiwgdXN1YWxseSB0aGUgcmlnaHQgYnV0dG9uXG5cbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSA9IGBrZXlkb3duJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuY29uc3QgRVZFTlRfS0VZVVBfREFUQV9BUEkgPSBga2V5dXAke0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QVVAgPSAnZHJvcHVwJ1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QRU5EID0gJ2Ryb3BlbmQnXG5jb25zdCBDTEFTU19OQU1FX0RST1BTVEFSVCA9ICdkcm9wc3RhcnQnXG5jb25zdCBDTEFTU19OQU1FX0RST1BVUF9DRU5URVIgPSAnZHJvcHVwLWNlbnRlcidcbmNvbnN0IENMQVNTX05BTUVfRFJPUERPV05fQ0VOVEVSID0gJ2Ryb3Bkb3duLWNlbnRlcidcblxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIl06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCknXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TSE9XTiA9IGAke1NFTEVDVE9SX0RBVEFfVE9HR0xFfS4ke0NMQVNTX05BTUVfU0hPV31gXG5jb25zdCBTRUxFQ1RPUl9NRU5VID0gJy5kcm9wZG93bi1tZW51J1xuY29uc3QgU0VMRUNUT1JfTkFWQkFSID0gJy5uYXZiYXInXG5jb25zdCBTRUxFQ1RPUl9OQVZCQVJfTkFWID0gJy5uYXZiYXItbmF2J1xuY29uc3QgU0VMRUNUT1JfVklTSUJMRV9JVEVNUyA9ICcuZHJvcGRvd24tbWVudSAuZHJvcGRvd24taXRlbTpub3QoLmRpc2FibGVkKTpub3QoOmRpc2FibGVkKSdcblxuY29uc3QgUExBQ0VNRU5UX1RPUCA9IGlzUlRMKCkgPyAndG9wLWVuZCcgOiAndG9wLXN0YXJ0J1xuY29uc3QgUExBQ0VNRU5UX1RPUEVORCA9IGlzUlRMKCkgPyAndG9wLXN0YXJ0JyA6ICd0b3AtZW5kJ1xuY29uc3QgUExBQ0VNRU5UX0JPVFRPTSA9IGlzUlRMKCkgPyAnYm90dG9tLWVuZCcgOiAnYm90dG9tLXN0YXJ0J1xuY29uc3QgUExBQ0VNRU5UX0JPVFRPTUVORCA9IGlzUlRMKCkgPyAnYm90dG9tLXN0YXJ0JyA6ICdib3R0b20tZW5kJ1xuY29uc3QgUExBQ0VNRU5UX1JJR0hUID0gaXNSVEwoKSA/ICdsZWZ0LXN0YXJ0JyA6ICdyaWdodC1zdGFydCdcbmNvbnN0IFBMQUNFTUVOVF9MRUZUID0gaXNSVEwoKSA/ICdyaWdodC1zdGFydCcgOiAnbGVmdC1zdGFydCdcbmNvbnN0IFBMQUNFTUVOVF9UT1BDRU5URVIgPSAndG9wJ1xuY29uc3QgUExBQ0VNRU5UX0JPVFRPTUNFTlRFUiA9ICdib3R0b20nXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGF1dG9DbG9zZTogdHJ1ZSxcbiAgYm91bmRhcnk6ICdjbGlwcGluZ1BhcmVudHMnLFxuICBkaXNwbGF5OiAnZHluYW1pYycsXG4gIG9mZnNldDogWzAsIDJdLFxuICBwb3BwZXJDb25maWc6IG51bGwsXG4gIHJlZmVyZW5jZTogJ3RvZ2dsZSdcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGF1dG9DbG9zZTogJyhib29sZWFufHN0cmluZyknLFxuICBib3VuZGFyeTogJyhzdHJpbmd8ZWxlbWVudCknLFxuICBkaXNwbGF5OiAnc3RyaW5nJyxcbiAgb2Zmc2V0OiAnKGFycmF5fHN0cmluZ3xmdW5jdGlvbiknLFxuICBwb3BwZXJDb25maWc6ICcobnVsbHxvYmplY3R8ZnVuY3Rpb24pJyxcbiAgcmVmZXJlbmNlOiAnKHN0cmluZ3xlbGVtZW50fG9iamVjdCknXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIERyb3Bkb3duIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZylcblxuICAgIHRoaXMuX3BvcHBlciA9IG51bGxcbiAgICB0aGlzLl9wYXJlbnQgPSB0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUgLy8gZHJvcGRvd24gd3JhcHBlclxuICAgIC8vIFRPRE86IHY2IHJldmVydCAjMzcwMTEgJiBjaGFuZ2UgbWFya3VwIGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS9kb2NzLzUuMy9mb3Jtcy9pbnB1dC1ncm91cC9cbiAgICB0aGlzLl9tZW51ID0gU2VsZWN0b3JFbmdpbmUubmV4dCh0aGlzLl9lbGVtZW50LCBTRUxFQ1RPUl9NRU5VKVswXSB8fFxuICAgICAgU2VsZWN0b3JFbmdpbmUucHJldih0aGlzLl9lbGVtZW50LCBTRUxFQ1RPUl9NRU5VKVswXSB8fFxuICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9NRU5VLCB0aGlzLl9wYXJlbnQpXG4gICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2hvd24oKSA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KClcbiAgfVxuXG4gIHNob3coKSB7XG4gICAgaWYgKGlzRGlzYWJsZWQodGhpcy5fZWxlbWVudCkgfHwgdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgIH1cblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1csIHJlbGF0ZWRUYXJnZXQpXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NyZWF0ZVBvcHBlcigpXG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgYWRkIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB0byB0aGUgYm9keSdzIGltbWVkaWF0ZSBjaGlsZHJlbjtcbiAgICAvLyBvbmx5IG5lZWRlZCBiZWNhdXNlIG9mIGJyb2tlbiBldmVudCBkZWxlZ2F0aW9uIG9uIGlPU1xuICAgIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxNC8wMi9tb3VzZV9ldmVudF9idWIuaHRtbFxuICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgIXRoaXMuX3BhcmVudC5jbG9zZXN0KFNFTEVDVE9SX05BVkJBUl9OQVYpKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbihlbGVtZW50LCAnbW91c2VvdmVyJywgbm9vcClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LmZvY3VzKClcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpXG5cbiAgICB0aGlzLl9tZW51LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG4gICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04sIHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMuX2VsZW1lbnQpIHx8ICF0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICByZWxhdGVkVGFyZ2V0OiB0aGlzLl9lbGVtZW50XG4gICAgfVxuXG4gICAgdGhpcy5fY29tcGxldGVIaWRlKHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KClcbiAgICB9XG5cbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIHVwZGF0ZSgpIHtcbiAgICB0aGlzLl9pbk5hdmJhciA9IHRoaXMuX2RldGVjdE5hdmJhcigpXG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29tcGxldGVIaWRlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFLCByZWxhdGVkVGFyZ2V0KVxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIHJlbW92ZSB0aGUgZXh0cmFcbiAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHdlIGFkZGVkIGZvciBpT1Mgc3VwcG9ydFxuICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBbXS5jb25jYXQoLi4uZG9jdW1lbnQuYm9keS5jaGlsZHJlbikpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCAnbW91c2VvdmVyJywgbm9vcClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpXG4gICAgfVxuXG4gICAgdGhpcy5fbWVudS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJylcbiAgICBNYW5pcHVsYXRvci5yZW1vdmVEYXRhQXR0cmlidXRlKHRoaXMuX21lbnUsICdwb3BwZXInKVxuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTiwgcmVsYXRlZFRhcmdldClcbiAgfVxuXG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gc3VwZXIuX2dldENvbmZpZyhjb25maWcpXG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWZlcmVuY2UgPT09ICdvYmplY3QnICYmICFpc0VsZW1lbnQoY29uZmlnLnJlZmVyZW5jZSkgJiZcbiAgICAgIHR5cGVvZiBjb25maWcucmVmZXJlbmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gJ2Z1bmN0aW9uJ1xuICAgICkge1xuICAgICAgLy8gUG9wcGVyIHZpcnR1YWwgZWxlbWVudHMgcmVxdWlyZSBhIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBtZXRob2RcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7TkFNRS50b1VwcGVyQ2FzZSgpfTogT3B0aW9uIFwicmVmZXJlbmNlXCIgcHJvdmlkZWQgdHlwZSBcIm9iamVjdFwiIHdpdGhvdXQgYSByZXF1aXJlZCBcImdldEJvdW5kaW5nQ2xpZW50UmVjdFwiIG1ldGhvZC5gKVxuICAgIH1cblxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9jcmVhdGVQb3BwZXIoKSB7XG4gICAgaWYgKHR5cGVvZiBQb3BwZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIGRyb3Bkb3ducyByZXF1aXJlIFBvcHBlciAoaHR0cHM6Ly9wb3BwZXIuanMub3JnKScpXG4gICAgfVxuXG4gICAgbGV0IHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnJlZmVyZW5jZSA9PT0gJ3BhcmVudCcpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9wYXJlbnRcbiAgICB9IGVsc2UgaWYgKGlzRWxlbWVudCh0aGlzLl9jb25maWcucmVmZXJlbmNlKSkge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IGdldEVsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSlcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9jb25maWcucmVmZXJlbmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX2NvbmZpZy5yZWZlcmVuY2VcbiAgICB9XG5cbiAgICBjb25zdCBwb3BwZXJDb25maWcgPSB0aGlzLl9nZXRQb3BwZXJDb25maWcoKVxuICAgIHRoaXMuX3BvcHBlciA9IFBvcHBlci5jcmVhdGVQb3BwZXIocmVmZXJlbmNlRWxlbWVudCwgdGhpcy5fbWVudSwgcG9wcGVyQ29uZmlnKVxuICB9XG5cbiAgX2lzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVylcbiAgfVxuXG4gIF9nZXRQbGFjZW1lbnQoKSB7XG4gICAgY29uc3QgcGFyZW50RHJvcGRvd24gPSB0aGlzLl9wYXJlbnRcblxuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRU5EKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9SSUdIVFxuICAgIH1cblxuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QU1RBUlQpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX0xFRlRcbiAgICB9XG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFVQX0NFTlRFUikpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfVE9QQ0VOVEVSXG4gICAgfVxuXG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUikpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfQk9UVE9NQ0VOVEVSXG4gICAgfVxuXG4gICAgLy8gV2UgbmVlZCB0byB0cmltIHRoZSB2YWx1ZSBiZWNhdXNlIGN1c3RvbSBwcm9wZXJ0aWVzIGNhbiBhbHNvIGluY2x1ZGUgc3BhY2VzXG4gICAgY29uc3QgaXNFbmQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX21lbnUpLmdldFByb3BlcnR5VmFsdWUoJy0tYnMtcG9zaXRpb24nKS50cmltKCkgPT09ICdlbmQnXG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFVQKSkge1xuICAgICAgcmV0dXJuIGlzRW5kID8gUExBQ0VNRU5UX1RPUEVORCA6IFBMQUNFTUVOVF9UT1BcbiAgICB9XG5cbiAgICByZXR1cm4gaXNFbmQgPyBQTEFDRU1FTlRfQk9UVE9NRU5EIDogUExBQ0VNRU5UX0JPVFRPTVxuICB9XG5cbiAgX2RldGVjdE5hdmJhcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX05BVkJBUikgIT09IG51bGxcbiAgfVxuXG4gIF9nZXRPZmZzZXQoKSB7XG4gICAgY29uc3QgeyBvZmZzZXQgfSA9IHRoaXMuX2NvbmZpZ1xuXG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2Zmc2V0LnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcG9wcGVyRGF0YSA9PiBvZmZzZXQocG9wcGVyRGF0YSwgdGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0XG4gIH1cblxuICBfZ2V0UG9wcGVyQ29uZmlnKCkge1xuICAgIGNvbnN0IGRlZmF1bHRCc1BvcHBlckNvbmZpZyA9IHtcbiAgICAgIHBsYWNlbWVudDogdGhpcy5fZ2V0UGxhY2VtZW50KCksXG4gICAgICBtb2RpZmllcnM6IFt7XG4gICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYm91bmRhcnk6IHRoaXMuX2NvbmZpZy5ib3VuZGFyeVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG9mZnNldDogdGhpcy5fZ2V0T2Zmc2V0KClcbiAgICAgICAgfVxuICAgICAgfV1cbiAgICB9XG5cbiAgICAvLyBEaXNhYmxlIFBvcHBlciBpZiB3ZSBoYXZlIGEgc3RhdGljIGRpc3BsYXkgb3IgRHJvcGRvd24gaXMgaW4gTmF2YmFyXG4gICAgaWYgKHRoaXMuX2luTmF2YmFyIHx8IHRoaXMuX2NvbmZpZy5kaXNwbGF5ID09PSAnc3RhdGljJykge1xuICAgICAgTWFuaXB1bGF0b3Iuc2V0RGF0YUF0dHJpYnV0ZSh0aGlzLl9tZW51LCAncG9wcGVyJywgJ3N0YXRpYycpIC8vIFRPRE86IHY2IHJlbW92ZVxuICAgICAgZGVmYXVsdEJzUG9wcGVyQ29uZmlnLm1vZGlmaWVycyA9IFt7XG4gICAgICAgIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICB9XVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZhdWx0QnNQb3BwZXJDb25maWcsXG4gICAgICAuLi5leGVjdXRlKHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcsIFtkZWZhdWx0QnNQb3BwZXJDb25maWddKVxuICAgIH1cbiAgfVxuXG4gIF9zZWxlY3RNZW51SXRlbSh7IGtleSwgdGFyZ2V0IH0pIHtcbiAgICBjb25zdCBpdGVtcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfVklTSUJMRV9JVEVNUywgdGhpcy5fbWVudSkuZmlsdGVyKGVsZW1lbnQgPT4gaXNWaXNpYmxlKGVsZW1lbnQpKVxuXG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGlmIHRhcmdldCBpc24ndCBpbmNsdWRlZCBpbiBpdGVtcyAoZS5nLiB3aGVuIGV4cGFuZGluZyB0aGUgZHJvcGRvd24pXG4gICAgLy8gYWxsb3cgY3ljbGluZyB0byBnZXQgdGhlIGxhc3QgaXRlbSBpbiBjYXNlIGtleSBlcXVhbHMgQVJST1dfVVBfS0VZXG4gICAgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQoaXRlbXMsIHRhcmdldCwga2V5ID09PSBBUlJPV19ET1dOX0tFWSwgIWl0ZW1zLmluY2x1ZGVzKHRhcmdldCkpLmZvY3VzKClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRpYyBjbGVhck1lbnVzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gUklHSFRfTU9VU0VfQlVUVE9OIHx8IChldmVudC50eXBlID09PSAna2V5dXAnICYmIGV2ZW50LmtleSAhPT0gVEFCX0tFWSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG9wZW5Ub2dnbGVzID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TSE9XTilcblxuICAgIGZvciAoY29uc3QgdG9nZ2xlIG9mIG9wZW5Ub2dnbGVzKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gRHJvcGRvd24uZ2V0SW5zdGFuY2UodG9nZ2xlKVxuICAgICAgaWYgKCFjb250ZXh0IHx8IGNvbnRleHQuX2NvbmZpZy5hdXRvQ2xvc2UgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBvc2VkUGF0aCA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpXG4gICAgICBjb25zdCBpc01lbnVUYXJnZXQgPSBjb21wb3NlZFBhdGguaW5jbHVkZXMoY29udGV4dC5fbWVudSlcbiAgICAgIGlmIChcbiAgICAgICAgY29tcG9zZWRQYXRoLmluY2x1ZGVzKGNvbnRleHQuX2VsZW1lbnQpIHx8XG4gICAgICAgIChjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSAnaW5zaWRlJyAmJiAhaXNNZW51VGFyZ2V0KSB8fFxuICAgICAgICAoY29udGV4dC5fY29uZmlnLmF1dG9DbG9zZSA9PT0gJ291dHNpZGUnICYmIGlzTWVudVRhcmdldClcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBUYWIgbmF2aWdhdGlvbiB0aHJvdWdoIHRoZSBkcm9wZG93biBtZW51IG9yIGV2ZW50cyBmcm9tIGNvbnRhaW5lZCBpbnB1dHMgc2hvdWxkbid0IGNsb3NlIHRoZSBtZW51XG4gICAgICBpZiAoY29udGV4dC5fbWVudS5jb250YWlucyhldmVudC50YXJnZXQpICYmICgoZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC5rZXkgPT09IFRBQl9LRVkpIHx8IC9pbnB1dHxzZWxlY3R8b3B0aW9ufHRleHRhcmVhfGZvcm0vaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHsgcmVsYXRlZFRhcmdldDogY29udGV4dC5fZWxlbWVudCB9XG5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQuY2xpY2tFdmVudCA9IGV2ZW50XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBkYXRhQXBpS2V5ZG93bkhhbmRsZXIoZXZlbnQpIHtcbiAgICAvLyBJZiBub3QgYW4gVVAgfCBET1dOIHwgRVNDQVBFIGtleSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgLy8gSWYgaW5wdXQvdGV4dGFyZWEgJiYgaWYga2V5IGlzIG90aGVyIHRoYW4gRVNDQVBFID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcblxuICAgIGNvbnN0IGlzSW5wdXQgPSAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKVxuICAgIGNvbnN0IGlzRXNjYXBlRXZlbnQgPSBldmVudC5rZXkgPT09IEVTQ0FQRV9LRVlcbiAgICBjb25zdCBpc1VwT3JEb3duRXZlbnQgPSBbQVJST1dfVVBfS0VZLCBBUlJPV19ET1dOX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KVxuXG4gICAgaWYgKCFpc1VwT3JEb3duRXZlbnQgJiYgIWlzRXNjYXBlRXZlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc0lucHV0ICYmICFpc0VzY2FwZUV2ZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAvLyBUT0RPOiB2NiByZXZlcnQgIzM3MDExICYgY2hhbmdlIG1hcmt1cCBodHRwczovL2dldGJvb3RzdHJhcC5jb20vZG9jcy81LjMvZm9ybXMvaW5wdXQtZ3JvdXAvXG4gICAgY29uc3QgZ2V0VG9nZ2xlQnV0dG9uID0gdGhpcy5tYXRjaGVzKFNFTEVDVE9SX0RBVEFfVE9HR0xFKSA/XG4gICAgICB0aGlzIDpcbiAgICAgIChTZWxlY3RvckVuZ2luZS5wcmV2KHRoaXMsIFNFTEVDVE9SX0RBVEFfVE9HR0xFKVswXSB8fFxuICAgICAgICBTZWxlY3RvckVuZ2luZS5uZXh0KHRoaXMsIFNFTEVDVE9SX0RBVEFfVE9HR0xFKVswXSB8fFxuICAgICAgICBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBldmVudC5kZWxlZ2F0ZVRhcmdldC5wYXJlbnROb2RlKSlcblxuICAgIGNvbnN0IGluc3RhbmNlID0gRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZShnZXRUb2dnbGVCdXR0b24pXG5cbiAgICBpZiAoaXNVcE9yRG93bkV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgaW5zdGFuY2Uuc2hvdygpXG4gICAgICBpbnN0YW5jZS5fc2VsZWN0TWVudUl0ZW0oZXZlbnQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuX2lzU2hvd24oKSkgeyAvLyBlbHNlIGlzIGVzY2FwZSBhbmQgd2UgY2hlY2sgaWYgaXQgaXMgc2hvd25cbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICBpbnN0YW5jZS5oaWRlKClcbiAgICAgIGdldFRvZ2dsZUJ1dHRvbi5mb2N1cygpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBEcm9wZG93bi5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fREFUQV9BUEksIFNFTEVDVE9SX01FTlUsIERyb3Bkb3duLmRhdGFBcGlLZXlkb3duSGFuZGxlcilcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIERyb3Bkb3duLmNsZWFyTWVudXMpXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWVVQX0RBVEFfQVBJLCBEcm9wZG93bi5jbGVhck1lbnVzKVxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykudG9nZ2xlKClcbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKERyb3Bkb3duKVxuXG5leHBvcnQgZGVmYXVsdCBEcm9wZG93blxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2JhY2tkcm9wLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5pbXBvcnQge1xuICBleGVjdXRlLCBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uLCBnZXRFbGVtZW50LCByZWZsb3dcbn0gZnJvbSAnLi9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2JhY2tkcm9wJ1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IEVWRU5UX01PVVNFRE9XTiA9IGBtb3VzZWRvd24uYnMuJHtOQU1FfWBcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgY2xhc3NOYW1lOiAnbW9kYWwtYmFja2Ryb3AnLFxuICBjbGlja0NhbGxiYWNrOiBudWxsLFxuICBpc0FuaW1hdGVkOiBmYWxzZSxcbiAgaXNWaXNpYmxlOiB0cnVlLCAvLyBpZiBmYWxzZSwgd2UgdXNlIHRoZSBiYWNrZHJvcCBoZWxwZXIgd2l0aG91dCBhZGRpbmcgYW55IGVsZW1lbnQgdG8gdGhlIGRvbVxuICByb290RWxlbWVudDogJ2JvZHknIC8vIGdpdmUgdGhlIGNob2ljZSB0byBwbGFjZSBiYWNrZHJvcCB1bmRlciBkaWZmZXJlbnQgZWxlbWVudHNcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gIGNsaWNrQ2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICBpc0FuaW1hdGVkOiAnYm9vbGVhbicsXG4gIGlzVmlzaWJsZTogJ2Jvb2xlYW4nLFxuICByb290RWxlbWVudDogJyhlbGVtZW50fHN0cmluZyknXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJhY2tkcm9wIGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpXG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IGZhbHNlXG4gICAgdGhpcy5fZWxlbWVudCA9IG51bGxcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgc2hvdyhjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmlzVmlzaWJsZSkge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2FwcGVuZCgpXG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5pc0FuaW1hdGVkKSB7XG4gICAgICByZWZsb3coZWxlbWVudClcbiAgICB9XG5cbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKSA9PiB7XG4gICAgICBleGVjdXRlKGNhbGxiYWNrKVxuICAgIH0pXG4gIH1cblxuICBoaWRlKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuaXNWaXNpYmxlKSB7XG4gICAgICBleGVjdXRlKGNhbGxiYWNrKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZ2V0RWxlbWVudCgpLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKSA9PiB7XG4gICAgICB0aGlzLmRpc3Bvc2UoKVxuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICB9KVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQXBwZW5kZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOKVxuXG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKVxuICAgIHRoaXMuX2lzQXBwZW5kZWQgPSBmYWxzZVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZ2V0RWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGJhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgIGJhY2tkcm9wLmNsYXNzTmFtZSA9IHRoaXMuX2NvbmZpZy5jbGFzc05hbWVcbiAgICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgICBiYWNrZHJvcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZWxlbWVudCA9IGJhY2tkcm9wXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRcbiAgfVxuXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIC8vIHVzZSBnZXRFbGVtZW50KCkgd2l0aCB0aGUgZGVmYXVsdCBcImJvZHlcIiB0byBnZXQgYSBmcmVzaCBFbGVtZW50IG9uIGVhY2ggaW5zdGFudGlhdGlvblxuICAgIGNvbmZpZy5yb290RWxlbWVudCA9IGdldEVsZW1lbnQoY29uZmlnLnJvb3RFbGVtZW50KVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9hcHBlbmQoKSB7XG4gICAgaWYgKHRoaXMuX2lzQXBwZW5kZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9nZXRFbGVtZW50KClcbiAgICB0aGlzLl9jb25maWcucm9vdEVsZW1lbnQuYXBwZW5kKGVsZW1lbnQpXG5cbiAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOLCAoKSA9PiB7XG4gICAgICBleGVjdXRlKHRoaXMuX2NvbmZpZy5jbGlja0NhbGxiYWNrKVxuICAgIH0pXG5cbiAgICB0aGlzLl9pc0FwcGVuZGVkID0gdHJ1ZVxuICB9XG5cbiAgX2VtdWxhdGVBbmltYXRpb24oY2FsbGJhY2spIHtcbiAgICBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uKGNhbGxiYWNrLCB0aGlzLl9nZXRFbGVtZW50KCksIHRoaXMuX2NvbmZpZy5pc0FuaW1hdGVkKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhY2tkcm9wXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvZm9jdXN0cmFwLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IENvbmZpZyBmcm9tICcuL2NvbmZpZy5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2ZvY3VzdHJhcCdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmZvY3VzdHJhcCdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBFVkVOVF9GT0NVU0lOID0gYGZvY3VzaW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOX1RBQiA9IGBrZXlkb3duLnRhYiR7RVZFTlRfS0VZfWBcblxuY29uc3QgVEFCX0tFWSA9ICdUYWInXG5jb25zdCBUQUJfTkFWX0ZPUldBUkQgPSAnZm9yd2FyZCdcbmNvbnN0IFRBQl9OQVZfQkFDS1dBUkQgPSAnYmFja3dhcmQnXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGF1dG9mb2N1czogdHJ1ZSxcbiAgdHJhcEVsZW1lbnQ6IG51bGwgLy8gVGhlIGVsZW1lbnQgdG8gdHJhcCBmb2N1cyBpbnNpZGUgb2Zcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGF1dG9mb2N1czogJ2Jvb2xlYW4nLFxuICB0cmFwRWxlbWVudDogJ2VsZW1lbnQnXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEZvY3VzVHJhcCBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2VcbiAgICB0aGlzLl9sYXN0VGFiTmF2RGlyZWN0aW9uID0gbnVsbFxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBhY3RpdmF0ZSgpIHtcbiAgICBpZiAodGhpcy5faXNBY3RpdmUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcuYXV0b2ZvY3VzKSB7XG4gICAgICB0aGlzLl9jb25maWcudHJhcEVsZW1lbnQuZm9jdXMoKVxuICAgIH1cblxuICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSkgLy8gZ3VhcmQgYWdhaW5zdCBpbmZpbml0ZSBmb2N1cyBsb29wXG4gICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9oYW5kbGVGb2N1c2luKGV2ZW50KSlcbiAgICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fVEFCLCBldmVudCA9PiB0aGlzLl9oYW5kbGVLZXlkb3duKGV2ZW50KSlcblxuICAgIHRoaXMuX2lzQWN0aXZlID0gdHJ1ZVxuICB9XG5cbiAgZGVhY3RpdmF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlXG4gICAgRXZlbnRIYW5kbGVyLm9mZihkb2N1bWVudCwgRVZFTlRfS0VZKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaGFuZGxlRm9jdXNpbihldmVudCkge1xuICAgIGNvbnN0IHsgdHJhcEVsZW1lbnQgfSA9IHRoaXMuX2NvbmZpZ1xuXG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gZG9jdW1lbnQgfHwgZXZlbnQudGFyZ2V0ID09PSB0cmFwRWxlbWVudCB8fCB0cmFwRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50cyA9IFNlbGVjdG9yRW5naW5lLmZvY3VzYWJsZUNoaWxkcmVuKHRyYXBFbGVtZW50KVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdHJhcEVsZW1lbnQuZm9jdXMoKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9PT0gVEFCX05BVl9CQUNLV0FSRCkge1xuICAgICAgZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV0uZm9jdXMoKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50c1swXS5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgX2hhbmRsZUtleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ICE9PSBUQUJfS0VZKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9sYXN0VGFiTmF2RGlyZWN0aW9uID0gZXZlbnQuc2hpZnRLZXkgPyBUQUJfTkFWX0JBQ0tXQVJEIDogVEFCX05BVl9GT1JXQVJEXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRm9jdXNUcmFwXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvc2Nyb2xsQmFyLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4uL2RvbS9tYW5pcHVsYXRvci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSAnLi9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBTRUxFQ1RPUl9GSVhFRF9DT05URU5UID0gJy5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AnXG5jb25zdCBTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCA9ICcuc3RpY2t5LXRvcCdcbmNvbnN0IFBST1BFUlRZX1BBRERJTkcgPSAncGFkZGluZy1yaWdodCdcbmNvbnN0IFBST1BFUlRZX01BUkdJTiA9ICdtYXJnaW4tcmlnaHQnXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFNjcm9sbEJhckhlbHBlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2VsZW1lbnQgPSBkb2N1bWVudC5ib2R5XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZ2V0V2lkdGgoKSB7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9pbm5lcldpZHRoI3VzYWdlX25vdGVzXG4gICAgY29uc3QgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aFxuICAgIHJldHVybiBNYXRoLmFicyh3aW5kb3cuaW5uZXJXaWR0aCAtIGRvY3VtZW50V2lkdGgpXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5nZXRXaWR0aCgpXG4gICAgdGhpcy5fZGlzYWJsZU92ZXJGbG93KClcbiAgICAvLyBnaXZlIHBhZGRpbmcgdG8gZWxlbWVudCB0byBiYWxhbmNlIHRoZSBoaWRkZW4gc2Nyb2xsYmFyIHdpZHRoXG4gICAgdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcy5fZWxlbWVudCwgUFJPUEVSVFlfUEFERElORywgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSArIHdpZHRoKVxuICAgIC8vIHRyaWNrOiBXZSBhZGp1c3QgcG9zaXRpdmUgcGFkZGluZ1JpZ2h0IGFuZCBuZWdhdGl2ZSBtYXJnaW5SaWdodCB0byBzdGlja3ktdG9wIGVsZW1lbnRzIHRvIGtlZXAgc2hvd2luZyBmdWxsd2lkdGhcbiAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCBQUk9QRVJUWV9QQURESU5HLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlICsgd2lkdGgpXG4gICAgdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQsIFBST1BFUlRZX01BUkdJTiwgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSAtIHdpZHRoKVxuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCAnb3ZlcmZsb3cnKVxuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcy5fZWxlbWVudCwgUFJPUEVSVFlfUEFERElORylcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQsIFBST1BFUlRZX1BBRERJTkcpXG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCwgUFJPUEVSVFlfTUFSR0lOKVxuICB9XG5cbiAgaXNPdmVyZmxvd2luZygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRXaWR0aCgpID4gMFxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZGlzYWJsZU92ZXJGbG93KCkge1xuICAgIHRoaXMuX3NhdmVJbml0aWFsQXR0cmlidXRlKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nXG4gIH1cblxuICBfc2V0RWxlbWVudEF0dHJpYnV0ZXMoc2VsZWN0b3IsIHN0eWxlUHJvcGVydHksIGNhbGxiYWNrKSB7XG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLmdldFdpZHRoKClcbiAgICBjb25zdCBtYW5pcHVsYXRpb25DYWxsQmFjayA9IGVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQgJiYgd2luZG93LmlubmVyV2lkdGggPiBlbGVtZW50LmNsaWVudFdpZHRoICsgc2Nyb2xsYmFyV2lkdGgpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NhdmVJbml0aWFsQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpXG4gICAgICBjb25zdCBjYWxjdWxhdGVkVmFsdWUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpXG4gICAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHN0eWxlUHJvcGVydHksIGAke2NhbGxiYWNrKE51bWJlci5wYXJzZUZsb2F0KGNhbGN1bGF0ZWRWYWx1ZSkpfXB4YClcbiAgICB9XG5cbiAgICB0aGlzLl9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBtYW5pcHVsYXRpb25DYWxsQmFjaylcbiAgfVxuXG4gIF9zYXZlSW5pdGlhbEF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KSB7XG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoc3R5bGVQcm9wZXJ0eSlcbiAgICBpZiAoYWN0dWFsVmFsdWUpIHtcbiAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSwgYWN0dWFsVmFsdWUpXG4gICAgfVxuICB9XG5cbiAgX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoc2VsZWN0b3IsIHN0eWxlUHJvcGVydHkpIHtcbiAgICBjb25zdCBtYW5pcHVsYXRpb25DYWxsQmFjayA9IGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpXG4gICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gcmVtb3ZlIHRoZSBwcm9wZXJ0eSBpZiB0aGUgdmFsdWUgaXMgYG51bGxgOyB0aGUgdmFsdWUgY2FuIGFsc28gYmUgemVyb1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoc3R5bGVQcm9wZXJ0eSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIE1hbmlwdWxhdG9yLnJlbW92ZURhdGFBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSlcbiAgICAgIGVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVQcm9wZXJ0eSwgdmFsdWUpXG4gICAgfVxuXG4gICAgdGhpcy5fYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayhzZWxlY3RvciwgbWFuaXB1bGF0aW9uQ2FsbEJhY2spXG4gIH1cblxuICBfYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayhzZWxlY3RvciwgY2FsbEJhY2spIHtcbiAgICBpZiAoaXNFbGVtZW50KHNlbGVjdG9yKSkge1xuICAgICAgY2FsbEJhY2soc2VsZWN0b3IpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNlbCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yLCB0aGlzLl9lbGVtZW50KSkge1xuICAgICAgY2FsbEJhY2soc2VsKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTY3JvbGxCYXJIZWxwZXJcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgbW9kYWwuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4vZG9tL3NlbGVjdG9yLWVuZ2luZS5qcydcbmltcG9ydCBCYWNrZHJvcCBmcm9tICcuL3V0aWwvYmFja2Ryb3AuanMnXG5pbXBvcnQgeyBlbmFibGVEaXNtaXNzVHJpZ2dlciB9IGZyb20gJy4vdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzJ1xuaW1wb3J0IEZvY3VzVHJhcCBmcm9tICcuL3V0aWwvZm9jdXN0cmFwLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLCBpc1JUTCwgaXNWaXNpYmxlLCByZWZsb3dcbn0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuaW1wb3J0IFNjcm9sbEJhckhlbHBlciBmcm9tICcuL3V0aWwvc2Nyb2xsYmFyLmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnbW9kYWwnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5tb2RhbCdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuY29uc3QgRVNDQVBFX0tFWSA9ICdFc2NhcGUnXG5cbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREVfUFJFVkVOVEVEID0gYGhpZGVQcmV2ZW50ZWQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPVyA9IGBzaG93JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPV04gPSBgc2hvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9SRVNJWkUgPSBgcmVzaXplJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfRElTTUlTUyA9IGBjbGljay5kaXNtaXNzJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfTU9VU0VET1dOX0RJU01JU1MgPSBgbW91c2Vkb3duLmRpc21pc3Mke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOX0RJU01JU1MgPSBga2V5ZG93bi5kaXNtaXNzJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfT1BFTiA9ICdtb2RhbC1vcGVuJ1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IENMQVNTX05BTUVfU1RBVElDID0gJ21vZGFsLXN0YXRpYydcblxuY29uc3QgT1BFTl9TRUxFQ1RPUiA9ICcubW9kYWwuc2hvdydcbmNvbnN0IFNFTEVDVE9SX0RJQUxPRyA9ICcubW9kYWwtZGlhbG9nJ1xuY29uc3QgU0VMRUNUT1JfTU9EQUxfQk9EWSA9ICcubW9kYWwtYm9keSdcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cIm1vZGFsXCJdJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBiYWNrZHJvcDogdHJ1ZSxcbiAgZm9jdXM6IHRydWUsXG4gIGtleWJvYXJkOiB0cnVlXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBiYWNrZHJvcDogJyhib29sZWFufHN0cmluZyknLFxuICBmb2N1czogJ2Jvb2xlYW4nLFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIE1vZGFsIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZylcblxuICAgIHRoaXMuX2RpYWxvZyA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfRElBTE9HLCB0aGlzLl9lbGVtZW50KVxuICAgIHRoaXMuX2JhY2tkcm9wID0gdGhpcy5faW5pdGlhbGl6ZUJhY2tEcm9wKClcbiAgICB0aGlzLl9mb2N1c3RyYXAgPSB0aGlzLl9pbml0aWFsaXplRm9jdXNUcmFwKClcbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2VcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuICAgIHRoaXMuX3Njcm9sbEJhciA9IG5ldyBTY3JvbGxCYXJIZWxwZXIoKVxuXG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldClcbiAgfVxuXG4gIHNob3cocmVsYXRlZFRhcmdldCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duIHx8IHRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVywge1xuICAgICAgcmVsYXRlZFRhcmdldFxuICAgIH0pXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2lzU2hvd24gPSB0cnVlXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuXG4gICAgdGhpcy5fc2Nyb2xsQmFyLmhpZGUoKVxuXG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfT1BFTilcblxuICAgIHRoaXMuX2FkanVzdERpYWxvZygpXG5cbiAgICB0aGlzLl9iYWNrZHJvcC5zaG93KCgpID0+IHRoaXMuX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpKVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKVxuXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2VcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlXG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4gdGhpcy5faGlkZU1vZGFsKCksIHRoaXMuX2VsZW1lbnQsIHRoaXMuX2lzQW5pbWF0ZWQoKSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9mZih3aW5kb3csIEVWRU5UX0tFWSlcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2RpYWxvZywgRVZFTlRfS0VZKVxuXG4gICAgdGhpcy5fYmFja2Ryb3AuZGlzcG9zZSgpXG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKVxuXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICBoYW5kbGVVcGRhdGUoKSB7XG4gICAgdGhpcy5fYWRqdXN0RGlhbG9nKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2luaXRpYWxpemVCYWNrRHJvcCgpIHtcbiAgICByZXR1cm4gbmV3IEJhY2tkcm9wKHtcbiAgICAgIGlzVmlzaWJsZTogQm9vbGVhbih0aGlzLl9jb25maWcuYmFja2Ryb3ApLCAvLyAnc3RhdGljJyBvcHRpb24gd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRydWUsIGFuZCBib29sZWFucyB3aWxsIGtlZXAgdGhlaXIgdmFsdWUsXG4gICAgICBpc0FuaW1hdGVkOiB0aGlzLl9pc0FuaW1hdGVkKClcbiAgICB9KVxuICB9XG5cbiAgX2luaXRpYWxpemVGb2N1c1RyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBGb2N1c1RyYXAoe1xuICAgICAgdHJhcEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9KVxuICB9XG5cbiAgX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAvLyB0cnkgdG8gYXBwZW5kIGR5bmFtaWMgbW9kYWxcbiAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHRoaXMuX2VsZW1lbnQpXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCB0cnVlKVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpXG4gICAgdGhpcy5fZWxlbWVudC5zY3JvbGxUb3AgPSAwXG5cbiAgICBjb25zdCBtb2RhbEJvZHkgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX01PREFMX0JPRFksIHRoaXMuX2RpYWxvZylcbiAgICBpZiAobW9kYWxCb2R5KSB7XG4gICAgICBtb2RhbEJvZHkuc2Nyb2xsVG9wID0gMFxuICAgIH1cblxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcblxuICAgIGNvbnN0IHRyYW5zaXRpb25Db21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuZm9jdXMpIHtcbiAgICAgICAgdGhpcy5fZm9jdXN0cmFwLmFjdGl2YXRlKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayh0cmFuc2l0aW9uQ29tcGxldGUsIHRoaXMuX2RpYWxvZywgdGhpcy5faXNBbmltYXRlZCgpKVxuICB9XG5cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgIT09IEVTQ0FQRV9LRVkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKVxuICAgIH0pXG5cbiAgICBFdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9SRVNJWkUsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc1Nob3duICYmICF0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgdGhpcy5fYWRqdXN0RGlhbG9nKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICAvLyBhIGJhZCB0cmljayB0byBzZWdyZWdhdGUgY2xpY2tzIHRoYXQgbWF5IHN0YXJ0IGluc2lkZSBkaWFsb2cgYnV0IGVuZCBvdXRzaWRlLCBhbmQgYXZvaWQgbGlzdGVuIHRvIHNjcm9sbGJhciBjbGlja3NcbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xJQ0tfRElTTUlTUywgZXZlbnQyID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQgIT09IGV2ZW50LnRhcmdldCB8fCB0aGlzLl9lbGVtZW50ICE9PSBldmVudDIudGFyZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgICAgIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCkge1xuICAgICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIF9oaWRlTW9kYWwoKSB7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSlcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcpXG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKVxuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlXG5cbiAgICB0aGlzLl9iYWNrZHJvcC5oaWRlKCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX09QRU4pXG4gICAgICB0aGlzLl9yZXNldEFkanVzdG1lbnRzKClcbiAgICAgIHRoaXMuX3Njcm9sbEJhci5yZXNldCgpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pXG4gICAgfSlcbiAgfVxuXG4gIF9pc0FuaW1hdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpXG4gIH1cblxuICBfdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpIHtcbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFX1BSRVZFTlRFRClcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGlzTW9kYWxPdmVyZmxvd2luZyA9IHRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodFxuICAgIGNvbnN0IGluaXRpYWxPdmVyZmxvd1kgPSB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WVxuICAgIC8vIHJldHVybiBpZiB0aGUgZm9sbG93aW5nIGJhY2tncm91bmQgdHJhbnNpdGlvbiBoYXNuJ3QgeWV0IGNvbXBsZXRlZFxuICAgIGlmIChpbml0aWFsT3ZlcmZsb3dZID09PSAnaGlkZGVuJyB8fCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NUQVRJQykpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU1RBVElDKVxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU1RBVElDKVxuICAgICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gaW5pdGlhbE92ZXJmbG93WVxuICAgICAgfSwgdGhpcy5fZGlhbG9nKVxuICAgIH0sIHRoaXMuX2RpYWxvZylcblxuICAgIHRoaXMuX2VsZW1lbnQuZm9jdXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBoYW5kbGUgb3ZlcmZsb3dpbmcgbW9kYWxzXG4gICAqL1xuXG4gIF9hZGp1c3REaWFsb2coKSB7XG4gICAgY29uc3QgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl9zY3JvbGxCYXIuZ2V0V2lkdGgoKVxuICAgIGNvbnN0IGlzQm9keU92ZXJmbG93aW5nID0gc2Nyb2xsYmFyV2lkdGggPiAwXG5cbiAgICBpZiAoaXNCb2R5T3ZlcmZsb3dpbmcgJiYgIWlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSBpc1JUTCgpID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IGAke3Njcm9sbGJhcldpZHRofXB4YFxuICAgIH1cblxuICAgIGlmICghaXNCb2R5T3ZlcmZsb3dpbmcgJiYgaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IGlzUlRMKCkgPyAncGFkZGluZ1JpZ2h0JyA6ICdwYWRkaW5nTGVmdCdcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbcHJvcGVydHldID0gYCR7c2Nyb2xsYmFyV2lkdGh9cHhgXG4gICAgfVxuICB9XG5cbiAgX3Jlc2V0QWRqdXN0bWVudHMoKSB7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9ICcnXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnJ1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnLCByZWxhdGVkVGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKHJlbGF0ZWRUYXJnZXQpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpXG5cbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9TSE9XLCBzaG93RXZlbnQgPT4ge1xuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgLy8gb25seSByZWdpc3RlciBmb2N1cyByZXN0b3JlciBpZiBtb2RhbCB3aWxsIGFjdHVhbGx5IGdldCBzaG93blxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uZSh0YXJnZXQsIEVWRU5UX0hJRERFTiwgKCkgPT4ge1xuICAgICAgaWYgKGlzVmlzaWJsZSh0aGlzKSkge1xuICAgICAgICB0aGlzLmZvY3VzKClcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIC8vIGF2b2lkIGNvbmZsaWN0IHdoZW4gY2xpY2tpbmcgbW9kYWwgdG9nZ2xlciB3aGlsZSBhbm90aGVyIG9uZSBpcyBvcGVuXG4gIGNvbnN0IGFscmVhZHlPcGVuID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShPUEVOX1NFTEVDVE9SKVxuICBpZiAoYWxyZWFkeU9wZW4pIHtcbiAgICBNb2RhbC5nZXRJbnN0YW5jZShhbHJlYWR5T3BlbikuaGlkZSgpXG4gIH1cblxuICBjb25zdCBkYXRhID0gTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpXG5cbiAgZGF0YS50b2dnbGUodGhpcylcbn0pXG5cbmVuYWJsZURpc21pc3NUcmlnZ2VyKE1vZGFsKVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihNb2RhbClcblxuZXhwb3J0IGRlZmF1bHQgTW9kYWxcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgb2ZmY2FudmFzLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgQmFja2Ryb3AgZnJvbSAnLi91dGlsL2JhY2tkcm9wLmpzJ1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcydcbmltcG9ydCBGb2N1c1RyYXAgZnJvbSAnLi91dGlsL2ZvY3VzdHJhcC5qcydcbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgaXNEaXNhYmxlZCxcbiAgaXNWaXNpYmxlXG59IGZyb20gJy4vdXRpbC9pbmRleC5qcydcbmltcG9ydCBTY3JvbGxCYXJIZWxwZXIgZnJvbSAnLi91dGlsL3Njcm9sbGJhci5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ29mZmNhbnZhcydcbmNvbnN0IERBVEFfS0VZID0gJ2JzLm9mZmNhbnZhcydcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuY29uc3QgRVZFTlRfTE9BRF9EQVRBX0FQSSA9IGBsb2FkJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuY29uc3QgRVNDQVBFX0tFWSA9ICdFc2NhcGUnXG5cbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XSU5HID0gJ3Nob3dpbmcnXG5jb25zdCBDTEFTU19OQU1FX0hJRElORyA9ICdoaWRpbmcnXG5jb25zdCBDTEFTU19OQU1FX0JBQ0tEUk9QID0gJ29mZmNhbnZhcy1iYWNrZHJvcCdcbmNvbnN0IE9QRU5fU0VMRUNUT1IgPSAnLm9mZmNhbnZhcy5zaG93J1xuXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREVfUFJFVkVOVEVEID0gYGhpZGVQcmV2ZW50ZWQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfUkVTSVpFID0gYHJlc2l6ZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTID0gYGtleWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZfWBcblxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwib2ZmY2FudmFzXCJdJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBiYWNrZHJvcDogdHJ1ZSxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIHNjcm9sbDogZmFsc2Vcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gIHNjcm9sbDogJ2Jvb2xlYW4nXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIE9mZmNhbnZhcyBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2VcbiAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpXG4gICAgdGhpcy5fZm9jdXN0cmFwID0gdGhpcy5faW5pdGlhbGl6ZUZvY3VzVHJhcCgpXG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldClcbiAgfVxuXG4gIHNob3cocmVsYXRlZFRhcmdldCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XLCB7IHJlbGF0ZWRUYXJnZXQgfSlcblxuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNTaG93biA9IHRydWVcbiAgICB0aGlzLl9iYWNrZHJvcC5zaG93KClcblxuICAgIGlmICghdGhpcy5fY29uZmlnLnNjcm9sbCkge1xuICAgICAgbmV3IFNjcm9sbEJhckhlbHBlcigpLmhpZGUoKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgdHJ1ZSlcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1dJTkcpXG5cbiAgICBjb25zdCBjb21wbGV0ZUNhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25maWcuc2Nyb2xsIHx8IHRoaXMuX2NvbmZpZy5iYWNrZHJvcCkge1xuICAgICAgICB0aGlzLl9mb2N1c3RyYXAuYWN0aXZhdGUoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPV0lORylcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCB7IHJlbGF0ZWRUYXJnZXQgfSlcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbEJhY2ssIHRoaXMuX2VsZW1lbnQsIHRydWUpXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5faXNTaG93bikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcblxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKVxuICAgIHRoaXMuX2VsZW1lbnQuYmx1cigpXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfSElESU5HKVxuICAgIHRoaXMuX2JhY2tkcm9wLmhpZGUoKVxuXG4gICAgY29uc3QgY29tcGxldGVDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1csIENMQVNTX05BTUVfSElESU5HKVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKVxuXG4gICAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwpIHtcbiAgICAgICAgbmV3IFNjcm9sbEJhckhlbHBlcigpLnJlc2V0KClcbiAgICAgIH1cblxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsYmFjaywgdGhpcy5fZWxlbWVudCwgdHJ1ZSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5fYmFja2Ryb3AuZGlzcG9zZSgpXG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKVxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaW5pdGlhbGl6ZUJhY2tEcm9wKCkge1xuICAgIGNvbnN0IGNsaWNrQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFX1BSRVZFTlRFRClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGlkZSgpXG4gICAgfVxuXG4gICAgLy8gJ3N0YXRpYycgb3B0aW9uIHdpbGwgYmUgdHJhbnNsYXRlZCB0byB0cnVlLCBhbmQgYm9vbGVhbnMgd2lsbCBrZWVwIHRoZWlyIHZhbHVlXG4gICAgY29uc3QgaXNWaXNpYmxlID0gQm9vbGVhbih0aGlzLl9jb25maWcuYmFja2Ryb3ApXG5cbiAgICByZXR1cm4gbmV3IEJhY2tkcm9wKHtcbiAgICAgIGNsYXNzTmFtZTogQ0xBU1NfTkFNRV9CQUNLRFJPUCxcbiAgICAgIGlzVmlzaWJsZSxcbiAgICAgIGlzQW5pbWF0ZWQ6IHRydWUsXG4gICAgICByb290RWxlbWVudDogdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLFxuICAgICAgY2xpY2tDYWxsYmFjazogaXNWaXNpYmxlID8gY2xpY2tDYWxsYmFjayA6IG51bGxcbiAgICB9KVxuICB9XG5cbiAgX2luaXRpYWxpemVGb2N1c1RyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBGb2N1c1RyYXAoe1xuICAgICAgdHJhcEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9KVxuICB9XG5cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgIT09IEVTQ0FQRV9LRVkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEKVxuICAgIH0pXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBPZmZjYW52YXMuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKHRoaXMpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpXG5cbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfSElEREVOLCAoKSA9PiB7XG4gICAgLy8gZm9jdXMgb24gdHJpZ2dlciB3aGVuIGl0IGlzIGNsb3NlZFxuICAgIGlmIChpc1Zpc2libGUodGhpcykpIHtcbiAgICAgIHRoaXMuZm9jdXMoKVxuICAgIH1cbiAgfSlcblxuICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIGEgdG9nZ2xlciBvZiBhbiBvZmZjYW52YXMsIHdoaWxlIGFub3RoZXIgaXMgb3BlblxuICBjb25zdCBhbHJlYWR5T3BlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoT1BFTl9TRUxFQ1RPUilcbiAgaWYgKGFscmVhZHlPcGVuICYmIGFscmVhZHlPcGVuICE9PSB0YXJnZXQpIHtcbiAgICBPZmZjYW52YXMuZ2V0SW5zdGFuY2UoYWxyZWFkeU9wZW4pLmhpZGUoKVxuICB9XG5cbiAgY29uc3QgZGF0YSA9IE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldClcbiAgZGF0YS50b2dnbGUodGhpcylcbn0pXG5cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEksICgpID0+IHtcbiAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBTZWxlY3RvckVuZ2luZS5maW5kKE9QRU5fU0VMRUNUT1IpKSB7XG4gICAgT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2Uoc2VsZWN0b3IpLnNob3coKVxuICB9XG59KVxuXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9SRVNJWkUsICgpID0+IHtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoJ1thcmlhLW1vZGFsXVtjbGFzcyo9c2hvd11bY2xhc3MqPW9mZmNhbnZhcy1dJykpIHtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiAhPT0gJ2ZpeGVkJykge1xuICAgICAgT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCkuaGlkZSgpXG4gICAgfVxuICB9XG59KVxuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihPZmZjYW52YXMpXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKE9mZmNhbnZhcylcblxuZXhwb3J0IGRlZmF1bHQgT2ZmY2FudmFzXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvc2FuaXRpemVyLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuLy8ganMtZG9jcy1zdGFydCBhbGxvdy1saXN0XG5jb25zdCBBUklBX0FUVFJJQlVURV9QQVRURVJOID0gL15hcmlhLVtcXHctXSokL2lcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRBbGxvd2xpc3QgPSB7XG4gIC8vIEdsb2JhbCBhdHRyaWJ1dGVzIGFsbG93ZWQgb24gYW55IHN1cHBsaWVkIGVsZW1lbnQgYmVsb3cuXG4gICcqJzogWydjbGFzcycsICdkaXInLCAnaWQnLCAnbGFuZycsICdyb2xlJywgQVJJQV9BVFRSSUJVVEVfUEFUVEVSTl0sXG4gIGE6IFsndGFyZ2V0JywgJ2hyZWYnLCAndGl0bGUnLCAncmVsJ10sXG4gIGFyZWE6IFtdLFxuICBiOiBbXSxcbiAgYnI6IFtdLFxuICBjb2w6IFtdLFxuICBjb2RlOiBbXSxcbiAgZGQ6IFtdLFxuICBkaXY6IFtdLFxuICBkbDogW10sXG4gIGR0OiBbXSxcbiAgZW06IFtdLFxuICBocjogW10sXG4gIGgxOiBbXSxcbiAgaDI6IFtdLFxuICBoMzogW10sXG4gIGg0OiBbXSxcbiAgaDU6IFtdLFxuICBoNjogW10sXG4gIGk6IFtdLFxuICBpbWc6IFsnc3JjJywgJ3NyY3NldCcsICdhbHQnLCAndGl0bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gIGxpOiBbXSxcbiAgb2w6IFtdLFxuICBwOiBbXSxcbiAgcHJlOiBbXSxcbiAgczogW10sXG4gIHNtYWxsOiBbXSxcbiAgc3BhbjogW10sXG4gIHN1YjogW10sXG4gIHN1cDogW10sXG4gIHN0cm9uZzogW10sXG4gIHU6IFtdLFxuICB1bDogW11cbn1cbi8vIGpzLWRvY3MtZW5kIGFsbG93LWxpc3RcblxuY29uc3QgdXJpQXR0cmlidXRlcyA9IG5ldyBTZXQoW1xuICAnYmFja2dyb3VuZCcsXG4gICdjaXRlJyxcbiAgJ2hyZWYnLFxuICAnaXRlbXR5cGUnLFxuICAnbG9uZ2Rlc2MnLFxuICAncG9zdGVyJyxcbiAgJ3NyYycsXG4gICd4bGluazpocmVmJ1xuXSlcblxuLyoqXG4gKiBBIHBhdHRlcm4gdGhhdCByZWNvZ25pemVzIFVSTHMgdGhhdCBhcmUgc2FmZSB3cnQuIFhTUyBpbiBVUkwgbmF2aWdhdGlvblxuICogY29udGV4dHMuXG4gKlxuICogU2hvdXQtb3V0IHRvIEFuZ3VsYXIgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iLzE1LjIuOC9wYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vdXJsX3Nhbml0aXplci50cyNMMzhcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vYmV0dGVyLXJlZ2V4XG5jb25zdCBTQUZFX1VSTF9QQVRURVJOID0gL14oPyFqYXZhc2NyaXB0OikoPzpbYS16MC05Ky4tXSs6fFteJjovPyNdKig/OlsvPyNdfCQpKS9pXG5cbmNvbnN0IGFsbG93ZWRBdHRyaWJ1dGUgPSAoYXR0cmlidXRlLCBhbGxvd2VkQXR0cmlidXRlTGlzdCkgPT4ge1xuICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKClcblxuICBpZiAoYWxsb3dlZEF0dHJpYnV0ZUxpc3QuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICBpZiAodXJpQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKFNBRkVfVVJMX1BBVFRFUk4udGVzdChhdHRyaWJ1dGUubm9kZVZhbHVlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgYSByZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdGVzIHRoZSBhdHRyaWJ1dGUuXG4gIHJldHVybiBhbGxvd2VkQXR0cmlidXRlTGlzdC5maWx0ZXIoYXR0cmlidXRlUmVnZXggPT4gYXR0cmlidXRlUmVnZXggaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgLnNvbWUocmVnZXggPT4gcmVnZXgudGVzdChhdHRyaWJ1dGVOYW1lKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplSHRtbCh1bnNhZmVIdG1sLCBhbGxvd0xpc3QsIHNhbml0aXplRnVuY3Rpb24pIHtcbiAgaWYgKCF1bnNhZmVIdG1sLmxlbmd0aCkge1xuICAgIHJldHVybiB1bnNhZmVIdG1sXG4gIH1cblxuICBpZiAoc2FuaXRpemVGdW5jdGlvbiAmJiB0eXBlb2Ygc2FuaXRpemVGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzYW5pdGl6ZUZ1bmN0aW9uKHVuc2FmZUh0bWwpXG4gIH1cblxuICBjb25zdCBkb21QYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpXG4gIGNvbnN0IGNyZWF0ZWREb2N1bWVudCA9IGRvbVBhcnNlci5wYXJzZUZyb21TdHJpbmcodW5zYWZlSHRtbCwgJ3RleHQvaHRtbCcpXG4gIGNvbnN0IGVsZW1lbnRzID0gW10uY29uY2F0KC4uLmNyZWF0ZWREb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSlcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBjb25zdCBlbGVtZW50TmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKVxuXG4gICAgaWYgKCFPYmplY3Qua2V5cyhhbGxvd0xpc3QpLmluY2x1ZGVzKGVsZW1lbnROYW1lKSkge1xuICAgICAgZWxlbWVudC5yZW1vdmUoKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVMaXN0ID0gW10uY29uY2F0KC4uLmVsZW1lbnQuYXR0cmlidXRlcylcbiAgICBjb25zdCBhbGxvd2VkQXR0cmlidXRlcyA9IFtdLmNvbmNhdChhbGxvd0xpc3RbJyonXSB8fCBbXSwgYWxsb3dMaXN0W2VsZW1lbnROYW1lXSB8fCBbXSlcblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUxpc3QpIHtcbiAgICAgIGlmICghYWxsb3dlZEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGFsbG93ZWRBdHRyaWJ1dGVzKSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUubm9kZU5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZWREb2N1bWVudC5ib2R5LmlubmVySFRNTFxufVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3RlbXBsYXRlLWZhY3RvcnkuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZS5qcydcbmltcG9ydCBDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5pbXBvcnQgeyBEZWZhdWx0QWxsb3dsaXN0LCBzYW5pdGl6ZUh0bWwgfSBmcm9tICcuL3Nhbml0aXplci5qcydcbmltcG9ydCB7IGV4ZWN1dGUsIGdldEVsZW1lbnQsIGlzRWxlbWVudCB9IGZyb20gJy4vaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdUZW1wbGF0ZUZhY3RvcnknXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGFsbG93TGlzdDogRGVmYXVsdEFsbG93bGlzdCxcbiAgY29udGVudDoge30sIC8vIHsgc2VsZWN0b3IgOiB0ZXh0ICwgIHNlbGVjdG9yMiA6IHRleHQyICwgfVxuICBleHRyYUNsYXNzOiAnJyxcbiAgaHRtbDogZmFsc2UsXG4gIHNhbml0aXplOiB0cnVlLFxuICBzYW5pdGl6ZUZuOiBudWxsLFxuICB0ZW1wbGF0ZTogJzxkaXY+PC9kaXY+J1xufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYWxsb3dMaXN0OiAnb2JqZWN0JyxcbiAgY29udGVudDogJ29iamVjdCcsXG4gIGV4dHJhQ2xhc3M6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIGh0bWw6ICdib29sZWFuJyxcbiAgc2FuaXRpemU6ICdib29sZWFuJyxcbiAgc2FuaXRpemVGbjogJyhudWxsfGZ1bmN0aW9uKScsXG4gIHRlbXBsYXRlOiAnc3RyaW5nJ1xufVxuXG5jb25zdCBEZWZhdWx0Q29udGVudFR5cGUgPSB7XG4gIGVudHJ5OiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9ufG51bGwpJyxcbiAgc2VsZWN0b3I6ICcoc3RyaW5nfGVsZW1lbnQpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUZW1wbGF0ZUZhY3RvcnkgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZ2V0Q29udGVudCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9jb25maWcuY29udGVudClcbiAgICAgIC5tYXAoY29uZmlnID0+IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGNvbmZpZykpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gIH1cblxuICBoYXNDb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldENvbnRlbnQoKS5sZW5ndGggPiAwXG4gIH1cblxuICBjaGFuZ2VDb250ZW50KGNvbnRlbnQpIHtcbiAgICB0aGlzLl9jaGVja0NvbnRlbnQoY29udGVudClcbiAgICB0aGlzLl9jb25maWcuY29udGVudCA9IHsgLi4udGhpcy5fY29uZmlnLmNvbnRlbnQsIC4uLmNvbnRlbnQgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB0b0h0bWwoKSB7XG4gICAgY29uc3QgdGVtcGxhdGVXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB0ZW1wbGF0ZVdyYXBwZXIuaW5uZXJIVE1MID0gdGhpcy5fbWF5YmVTYW5pdGl6ZSh0aGlzLl9jb25maWcudGVtcGxhdGUpXG5cbiAgICBmb3IgKGNvbnN0IFtzZWxlY3RvciwgdGV4dF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fY29uZmlnLmNvbnRlbnQpKSB7XG4gICAgICB0aGlzLl9zZXRDb250ZW50KHRlbXBsYXRlV3JhcHBlciwgdGV4dCwgc2VsZWN0b3IpXG4gICAgfVxuXG4gICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZVdyYXBwZXIuY2hpbGRyZW5bMF1cbiAgICBjb25zdCBleHRyYUNsYXNzID0gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLmV4dHJhQ2xhc3MpXG5cbiAgICBpZiAoZXh0cmFDbGFzcykge1xuICAgICAgdGVtcGxhdGUuY2xhc3NMaXN0LmFkZCguLi5leHRyYUNsYXNzLnNwbGl0KCcgJykpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRlbXBsYXRlXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF90eXBlQ2hlY2tDb25maWcoY29uZmlnKSB7XG4gICAgc3VwZXIuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpXG4gICAgdGhpcy5fY2hlY2tDb250ZW50KGNvbmZpZy5jb250ZW50KVxuICB9XG5cbiAgX2NoZWNrQ29udGVudChhcmcpIHtcbiAgICBmb3IgKGNvbnN0IFtzZWxlY3RvciwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoYXJnKSkge1xuICAgICAgc3VwZXIuX3R5cGVDaGVja0NvbmZpZyh7IHNlbGVjdG9yLCBlbnRyeTogY29udGVudCB9LCBEZWZhdWx0Q29udGVudFR5cGUpXG4gICAgfVxuICB9XG5cbiAgX3NldENvbnRlbnQodGVtcGxhdGUsIGNvbnRlbnQsIHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdGVtcGxhdGVFbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvciwgdGVtcGxhdGUpXG5cbiAgICBpZiAoIXRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29udGVudCA9IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGNvbnRlbnQpXG5cbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGlzRWxlbWVudChjb250ZW50KSkge1xuICAgICAgdGhpcy5fcHV0RWxlbWVudEluVGVtcGxhdGUoZ2V0RWxlbWVudChjb250ZW50KSwgdGVtcGxhdGVFbGVtZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5odG1sKSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5fbWF5YmVTYW5pdGl6ZShjb250ZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGVtcGxhdGVFbGVtZW50LnRleHRDb250ZW50ID0gY29udGVudFxuICB9XG5cbiAgX21heWJlU2FuaXRpemUoYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZSA/IHNhbml0aXplSHRtbChhcmcsIHRoaXMuX2NvbmZpZy5hbGxvd0xpc3QsIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZUZuKSA6IGFyZ1xuICB9XG5cbiAgX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBleGVjdXRlKGFyZywgW3RoaXNdKVxuICB9XG5cbiAgX3B1dEVsZW1lbnRJblRlbXBsYXRlKGVsZW1lbnQsIHRlbXBsYXRlRWxlbWVudCkge1xuICAgIGlmICh0aGlzLl9jb25maWcuaHRtbCkge1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9ICcnXG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQuYXBwZW5kKGVsZW1lbnQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0ZW1wbGF0ZUVsZW1lbnQudGV4dENvbnRlbnQgPSBlbGVtZW50LnRleHRDb250ZW50XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGVtcGxhdGVGYWN0b3J5XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHRvb2x0aXAuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgKiBhcyBQb3BwZXIgZnJvbSAnQHBvcHBlcmpzL2NvcmUnXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4vZG9tL21hbmlwdWxhdG9yLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLCBleGVjdXRlLCBmaW5kU2hhZG93Um9vdCwgZ2V0RWxlbWVudCwgZ2V0VUlELCBpc1JUTCwgbm9vcFxufSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5pbXBvcnQgeyBEZWZhdWx0QWxsb3dsaXN0IH0gZnJvbSAnLi91dGlsL3Nhbml0aXplci5qcydcbmltcG9ydCBUZW1wbGF0ZUZhY3RvcnkgZnJvbSAnLi91dGlsL3RlbXBsYXRlLWZhY3RvcnkuanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICd0b29sdGlwJ1xuY29uc3QgRElTQUxMT1dFRF9BVFRSSUJVVEVTID0gbmV3IFNldChbJ3Nhbml0aXplJywgJ2FsbG93TGlzdCcsICdzYW5pdGl6ZUZuJ10pXG5cbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9NT0RBTCA9ICdtb2RhbCdcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuXG5jb25zdCBTRUxFQ1RPUl9UT09MVElQX0lOTkVSID0gJy50b29sdGlwLWlubmVyJ1xuY29uc3QgU0VMRUNUT1JfTU9EQUwgPSBgLiR7Q0xBU1NfTkFNRV9NT0RBTH1gXG5cbmNvbnN0IEVWRU5UX01PREFMX0hJREUgPSAnaGlkZS5icy5tb2RhbCdcblxuY29uc3QgVFJJR0dFUl9IT1ZFUiA9ICdob3ZlcidcbmNvbnN0IFRSSUdHRVJfRk9DVVMgPSAnZm9jdXMnXG5jb25zdCBUUklHR0VSX0NMSUNLID0gJ2NsaWNrJ1xuY29uc3QgVFJJR0dFUl9NQU5VQUwgPSAnbWFudWFsJ1xuXG5jb25zdCBFVkVOVF9ISURFID0gJ2hpZGUnXG5jb25zdCBFVkVOVF9ISURERU4gPSAnaGlkZGVuJ1xuY29uc3QgRVZFTlRfU0hPVyA9ICdzaG93J1xuY29uc3QgRVZFTlRfU0hPV04gPSAnc2hvd24nXG5jb25zdCBFVkVOVF9JTlNFUlRFRCA9ICdpbnNlcnRlZCdcbmNvbnN0IEVWRU5UX0NMSUNLID0gJ2NsaWNrJ1xuY29uc3QgRVZFTlRfRk9DVVNJTiA9ICdmb2N1c2luJ1xuY29uc3QgRVZFTlRfRk9DVVNPVVQgPSAnZm9jdXNvdXQnXG5jb25zdCBFVkVOVF9NT1VTRUVOVEVSID0gJ21vdXNlZW50ZXInXG5jb25zdCBFVkVOVF9NT1VTRUxFQVZFID0gJ21vdXNlbGVhdmUnXG5cbmNvbnN0IEF0dGFjaG1lbnRNYXAgPSB7XG4gIEFVVE86ICdhdXRvJyxcbiAgVE9QOiAndG9wJyxcbiAgUklHSFQ6IGlzUlRMKCkgPyAnbGVmdCcgOiAncmlnaHQnLFxuICBCT1RUT006ICdib3R0b20nLFxuICBMRUZUOiBpc1JUTCgpID8gJ3JpZ2h0JyA6ICdsZWZ0J1xufVxuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhbGxvd0xpc3Q6IERlZmF1bHRBbGxvd2xpc3QsXG4gIGFuaW1hdGlvbjogdHJ1ZSxcbiAgYm91bmRhcnk6ICdjbGlwcGluZ1BhcmVudHMnLFxuICBjb250YWluZXI6IGZhbHNlLFxuICBjdXN0b21DbGFzczogJycsXG4gIGRlbGF5OiAwLFxuICBmYWxsYmFja1BsYWNlbWVudHM6IFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10sXG4gIGh0bWw6IGZhbHNlLFxuICBvZmZzZXQ6IFswLCA2XSxcbiAgcGxhY2VtZW50OiAndG9wJyxcbiAgcG9wcGVyQ29uZmlnOiBudWxsLFxuICBzYW5pdGl6ZTogdHJ1ZSxcbiAgc2FuaXRpemVGbjogbnVsbCxcbiAgc2VsZWN0b3I6IGZhbHNlLFxuICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJ0b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidG9vbHRpcC1hcnJvd1wiPjwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ0b29sdGlwLWlubmVyXCI+PC9kaXY+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyxcbiAgdGl0bGU6ICcnLFxuICB0cmlnZ2VyOiAnaG92ZXIgZm9jdXMnXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBhbGxvd0xpc3Q6ICdvYmplY3QnLFxuICBhbmltYXRpb246ICdib29sZWFuJyxcbiAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgY29udGFpbmVyOiAnKHN0cmluZ3xlbGVtZW50fGJvb2xlYW4pJyxcbiAgY3VzdG9tQ2xhc3M6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIGRlbGF5OiAnKG51bWJlcnxvYmplY3QpJyxcbiAgZmFsbGJhY2tQbGFjZW1lbnRzOiAnYXJyYXknLFxuICBodG1sOiAnYm9vbGVhbicsXG4gIG9mZnNldDogJyhhcnJheXxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgcGxhY2VtZW50OiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBwb3BwZXJDb25maWc6ICcobnVsbHxvYmplY3R8ZnVuY3Rpb24pJyxcbiAgc2FuaXRpemU6ICdib29sZWFuJyxcbiAgc2FuaXRpemVGbjogJyhudWxsfGZ1bmN0aW9uKScsXG4gIHNlbGVjdG9yOiAnKHN0cmluZ3xib29sZWFuKScsXG4gIHRlbXBsYXRlOiAnc3RyaW5nJyxcbiAgdGl0bGU6ICcoc3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pJyxcbiAgdHJpZ2dlcjogJ3N0cmluZydcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVG9vbHRpcCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBpZiAodHlwZW9mIFBvcHBlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Jvb3RzdHJhcFxcJ3MgdG9vbHRpcHMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKVxuICAgIH1cblxuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZylcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlXG4gICAgdGhpcy5fdGltZW91dCA9IDBcbiAgICB0aGlzLl9pc0hvdmVyZWQgPSBudWxsXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlciA9IHt9XG4gICAgdGhpcy5fcG9wcGVyID0gbnVsbFxuICAgIHRoaXMuX3RlbXBsYXRlRmFjdG9yeSA9IG51bGxcbiAgICB0aGlzLl9uZXdDb250ZW50ID0gbnVsbFxuXG4gICAgLy8gUHJvdGVjdGVkXG4gICAgdGhpcy50aXAgPSBudWxsXG5cbiAgICB0aGlzLl9zZXRMaXN0ZW5lcnMoKVxuXG4gICAgaWYgKCF0aGlzLl9jb25maWcuc2VsZWN0b3IpIHtcbiAgICAgIHRoaXMuX2ZpeFRpdGxlKClcbiAgICB9XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlXG4gIH1cblxuICBkaXNhYmxlKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9IGZhbHNlXG4gIH1cblxuICB0b2dnbGVFbmFibGVkKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9ICF0aGlzLl9pc0VuYWJsZWRcbiAgfVxuXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlci5jbGljayA9ICF0aGlzLl9hY3RpdmVUcmlnZ2VyLmNsaWNrXG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgdGhpcy5fbGVhdmUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZW50ZXIoKVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dClcblxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX01PREFMKSwgRVZFTlRfTU9EQUxfSElERSwgdGhpcy5faGlkZU1vZGFsSGFuZGxlcilcblxuICAgIGlmICh0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy1vcmlnaW5hbC10aXRsZScpKSB7XG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy1vcmlnaW5hbC10aXRsZScpKVxuICAgIH1cblxuICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKVxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgc2hvdygpIHtcbiAgICBpZiAodGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHVzZSBzaG93IG9uIHZpc2libGUgZWxlbWVudHMnKVxuICAgIH1cblxuICAgIGlmICghKHRoaXMuX2lzV2l0aENvbnRlbnQoKSAmJiB0aGlzLl9pc0VuYWJsZWQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9TSE9XKSlcbiAgICBjb25zdCBzaGFkb3dSb290ID0gZmluZFNoYWRvd1Jvb3QodGhpcy5fZWxlbWVudClcbiAgICBjb25zdCBpc0luVGhlRG9tID0gKHNoYWRvd1Jvb3QgfHwgdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuY29udGFpbnModGhpcy5fZWxlbWVudClcblxuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAhaXNJblRoZURvbSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVE9ETzogdjYgcmVtb3ZlIHRoaXMgb3IgbWFrZSBpdCBvcHRpb25hbFxuICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKVxuXG4gICAgY29uc3QgdGlwID0gdGhpcy5fZ2V0VGlwRWxlbWVudCgpXG5cbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIHRpcC5nZXRBdHRyaWJ1dGUoJ2lkJykpXG5cbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gdGhpcy5fY29uZmlnXG5cbiAgICBpZiAoIXRoaXMuX2VsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnModGhpcy50aXApKSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kKHRpcClcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0lOU0VSVEVEKSlcbiAgICB9XG5cbiAgICB0aGlzLl9wb3BwZXIgPSB0aGlzLl9jcmVhdGVQb3BwZXIodGlwKVxuXG4gICAgdGlwLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbihlbGVtZW50LCAnbW91c2VvdmVyJywgbm9vcClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1dOKSlcblxuICAgICAgaWYgKHRoaXMuX2lzSG92ZXJlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fbGVhdmUoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9pc0hvdmVyZWQgPSBmYWxzZVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMudGlwLCB0aGlzLl9pc0FuaW1hdGVkKCkpXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9ISURFKSlcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRpcEVsZW1lbnQoKVxuICAgIHRpcC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSByZW1vdmUgdGhlIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0NMSUNLXSA9IGZhbHNlXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0ZPQ1VTXSA9IGZhbHNlXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0hPVkVSXSA9IGZhbHNlXG4gICAgdGhpcy5faXNIb3ZlcmVkID0gbnVsbCAvLyBpdCBpcyBhIHRyaWNrIHRvIHN1cHBvcnQgbWFudWFsIHRyaWdnZXJpbmdcblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JylcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0hJRERFTikpXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy50aXAsIHRoaXMuX2lzQW5pbWF0ZWQoKSlcbiAgfVxuXG4gIHVwZGF0ZSgpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIudXBkYXRlKClcbiAgICB9XG4gIH1cblxuICAvLyBQcm90ZWN0ZWRcbiAgX2lzV2l0aENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fZ2V0VGl0bGUoKSlcbiAgfVxuXG4gIF9nZXRUaXBFbGVtZW50KCkge1xuICAgIGlmICghdGhpcy50aXApIHtcbiAgICAgIHRoaXMudGlwID0gdGhpcy5fY3JlYXRlVGlwRWxlbWVudCh0aGlzLl9uZXdDb250ZW50IHx8IHRoaXMuX2dldENvbnRlbnRGb3JUZW1wbGF0ZSgpKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRpcFxuICB9XG5cbiAgX2NyZWF0ZVRpcEVsZW1lbnQoY29udGVudCkge1xuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRlbXBsYXRlRmFjdG9yeShjb250ZW50KS50b0h0bWwoKVxuXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgY2hlY2sgaW4gdjZcbiAgICBpZiAoIXRpcCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB0aXAuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0ZBREUsIENMQVNTX05BTUVfU0hPVylcbiAgICAvLyBUT0RPOiB2NiB0aGUgZm9sbG93aW5nIGNhbiBiZSBhY2hpZXZlZCB3aXRoIENTUyBvbmx5XG4gICAgdGlwLmNsYXNzTGlzdC5hZGQoYGJzLSR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FfS1hdXRvYClcblxuICAgIGNvbnN0IHRpcElkID0gZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSkudG9TdHJpbmcoKVxuXG4gICAgdGlwLnNldEF0dHJpYnV0ZSgnaWQnLCB0aXBJZClcblxuICAgIGlmICh0aGlzLl9pc0FuaW1hdGVkKCkpIHtcbiAgICAgIHRpcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGlwXG4gIH1cblxuICBzZXRDb250ZW50KGNvbnRlbnQpIHtcbiAgICB0aGlzLl9uZXdDb250ZW50ID0gY29udGVudFxuICAgIGlmICh0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKVxuICAgICAgdGhpcy5zaG93KClcbiAgICB9XG4gIH1cblxuICBfZ2V0VGVtcGxhdGVGYWN0b3J5KGNvbnRlbnQpIHtcbiAgICBpZiAodGhpcy5fdGVtcGxhdGVGYWN0b3J5KSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUZhY3RvcnkuY2hhbmdlQ29udGVudChjb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUZhY3RvcnkgPSBuZXcgVGVtcGxhdGVGYWN0b3J5KHtcbiAgICAgICAgLi4udGhpcy5fY29uZmlnLFxuICAgICAgICAvLyB0aGUgYGNvbnRlbnRgIHZhciBoYXMgdG8gYmUgYWZ0ZXIgYHRoaXMuX2NvbmZpZ2BcbiAgICAgICAgLy8gdG8gb3ZlcnJpZGUgY29uZmlnLmNvbnRlbnQgaW4gY2FzZSBvZiBwb3BvdmVyXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGV4dHJhQ2xhc3M6IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jdXN0b21DbGFzcylcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlRmFjdG9yeVxuICB9XG5cbiAgX2dldENvbnRlbnRGb3JUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW1NFTEVDVE9SX1RPT0xUSVBfSU5ORVJdOiB0aGlzLl9nZXRUaXRsZSgpXG4gICAgfVxuICB9XG5cbiAgX2dldFRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcudGl0bGUpIHx8IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJylcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudCkge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmdldE9yQ3JlYXRlSW5zdGFuY2UoZXZlbnQuZGVsZWdhdGVUYXJnZXQsIHRoaXMuX2dldERlbGVnYXRlQ29uZmlnKCkpXG4gIH1cblxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmFuaW1hdGlvbiB8fCAodGhpcy50aXAgJiYgdGhpcy50aXAuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSkpXG4gIH1cblxuICBfaXNTaG93bigpIHtcbiAgICByZXR1cm4gdGhpcy50aXAgJiYgdGhpcy50aXAuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVylcbiAgfVxuXG4gIF9jcmVhdGVQb3BwZXIodGlwKSB7XG4gICAgY29uc3QgcGxhY2VtZW50ID0gZXhlY3V0ZSh0aGlzLl9jb25maWcucGxhY2VtZW50LCBbdGhpcywgdGlwLCB0aGlzLl9lbGVtZW50XSlcbiAgICBjb25zdCBhdHRhY2htZW50ID0gQXR0YWNobWVudE1hcFtwbGFjZW1lbnQudG9VcHBlckNhc2UoKV1cbiAgICByZXR1cm4gUG9wcGVyLmNyZWF0ZVBvcHBlcih0aGlzLl9lbGVtZW50LCB0aXAsIHRoaXMuX2dldFBvcHBlckNvbmZpZyhhdHRhY2htZW50KSlcbiAgfVxuXG4gIF9nZXRPZmZzZXQoKSB7XG4gICAgY29uc3QgeyBvZmZzZXQgfSA9IHRoaXMuX2NvbmZpZ1xuXG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2Zmc2V0LnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcG9wcGVyRGF0YSA9PiBvZmZzZXQocG9wcGVyRGF0YSwgdGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0XG4gIH1cblxuICBfcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGUoYXJnLCBbdGhpcy5fZWxlbWVudF0pXG4gIH1cblxuICBfZ2V0UG9wcGVyQ29uZmlnKGF0dGFjaG1lbnQpIHtcbiAgICBjb25zdCBkZWZhdWx0QnNQb3BwZXJDb25maWcgPSB7XG4gICAgICBwbGFjZW1lbnQ6IGF0dGFjaG1lbnQsXG4gICAgICBtb2RpZmllcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdmbGlwJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBmYWxsYmFja1BsYWNlbWVudHM6IHRoaXMuX2NvbmZpZy5mYWxsYmFja1BsYWNlbWVudHNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgYm91bmRhcnk6IHRoaXMuX2NvbmZpZy5ib3VuZGFyeVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdhcnJvdycsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZWxlbWVudDogYC4ke3RoaXMuY29uc3RydWN0b3IuTkFNRX0tYXJyb3dgXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3ByZVNldFBsYWNlbWVudCcsXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBwaGFzZTogJ2JlZm9yZU1haW4nLFxuICAgICAgICAgIGZuOiBkYXRhID0+IHtcbiAgICAgICAgICAgIC8vIFByZS1zZXQgUG9wcGVyJ3MgcGxhY2VtZW50IGF0dHJpYnV0ZSBpbiBvcmRlciB0byByZWFkIHRoZSBhcnJvdyBzaXplcyBwcm9wZXJseS5cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgUG9wcGVyIG1peGVzIHVwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRpbWVuc2lvbnMgc2luY2UgdGhlIGluaXRpYWwgYXJyb3cgc3R5bGUgaXMgZm9yIHRvcCBwbGFjZW1lbnRcbiAgICAgICAgICAgIHRoaXMuX2dldFRpcEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCcsIGRhdGEuc3RhdGUucGxhY2VtZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZhdWx0QnNQb3BwZXJDb25maWcsXG4gICAgICAuLi5leGVjdXRlKHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcsIFtkZWZhdWx0QnNQb3BwZXJDb25maWddKVxuICAgIH1cbiAgfVxuXG4gIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzLl9jb25maWcudHJpZ2dlci5zcGxpdCgnICcpXG5cbiAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgdHJpZ2dlcnMpIHtcbiAgICAgIGlmICh0cmlnZ2VyID09PSAnY2xpY2snKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9DTElDSyksIHRoaXMuX2NvbmZpZy5zZWxlY3RvciwgZXZlbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpXG4gICAgICAgICAgY29udGV4dC50b2dnbGUoKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyICE9PSBUUklHR0VSX01BTlVBTCkge1xuICAgICAgICBjb25zdCBldmVudEluID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfTU9VU0VFTlRFUikgOlxuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0ZPQ1VTSU4pXG4gICAgICAgIGNvbnN0IGV2ZW50T3V0ID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfTU9VU0VMRUFWRSkgOlxuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0ZPQ1VTT1VUKVxuXG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudEluLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KVxuICAgICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXJbZXZlbnQudHlwZSA9PT0gJ2ZvY3VzaW4nID8gVFJJR0dFUl9GT0NVUyA6IFRSSUdHRVJfSE9WRVJdID0gdHJ1ZVxuICAgICAgICAgIGNvbnRleHQuX2VudGVyKClcbiAgICAgICAgfSlcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIGV2ZW50T3V0LCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KVxuICAgICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXJbZXZlbnQudHlwZSA9PT0gJ2ZvY3Vzb3V0JyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXSA9XG4gICAgICAgICAgICBjb250ZXh0Ll9lbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpXG5cbiAgICAgICAgICBjb250ZXh0Ll9sZWF2ZSgpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faGlkZU1vZGFsSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9NT0RBTCksIEVWRU5UX01PREFMX0hJREUsIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpXG4gIH1cblxuICBfZml4VGl0bGUoKSB7XG4gICAgY29uc3QgdGl0bGUgPSB0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgndGl0bGUnKVxuXG4gICAgaWYgKCF0aXRsZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpICYmICF0aGlzLl9lbGVtZW50LnRleHRDb250ZW50LnRyaW0oKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aXRsZSlcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1icy1vcmlnaW5hbC10aXRsZScsIHRpdGxlKSAvLyBETyBOT1QgVVNFIElULiBJcyBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0aXRsZScpXG4gIH1cblxuICBfZW50ZXIoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSB8fCB0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgIHRoaXMuX2lzSG92ZXJlZCA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IHRydWVcblxuICAgIHRoaXMuX3NldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lzSG92ZXJlZCkge1xuICAgICAgICB0aGlzLnNob3coKVxuICAgICAgfVxuICAgIH0sIHRoaXMuX2NvbmZpZy5kZWxheS5zaG93KVxuICB9XG5cbiAgX2xlYXZlKCkge1xuICAgIGlmICh0aGlzLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IGZhbHNlXG5cbiAgICB0aGlzLl9zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5faXNIb3ZlcmVkKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LmhpZGUpXG4gIH1cblxuICBfc2V0VGltZW91dChoYW5kbGVyLCB0aW1lb3V0KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpXG4gICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoaGFuZGxlciwgdGltZW91dClcbiAgfVxuXG4gIF9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX2FjdGl2ZVRyaWdnZXIpLmluY2x1ZGVzKHRydWUpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbnN0IGRhdGFBdHRyaWJ1dGVzID0gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZXModGhpcy5fZWxlbWVudClcblxuICAgIGZvciAoY29uc3QgZGF0YUF0dHJpYnV0ZSBvZiBPYmplY3Qua2V5cyhkYXRhQXR0cmlidXRlcykpIHtcbiAgICAgIGlmIChESVNBTExPV0VEX0FUVFJJQlVURVMuaGFzKGRhdGFBdHRyaWJ1dGUpKSB7XG4gICAgICAgIGRlbGV0ZSBkYXRhQXR0cmlidXRlc1tkYXRhQXR0cmlidXRlXVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbmZpZyA9IHtcbiAgICAgIC4uLmRhdGFBdHRyaWJ1dGVzLFxuICAgICAgLi4uKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KVxuICAgIH1cbiAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcpXG4gICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpXG4gICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZylcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICBjb25maWcuY29udGFpbmVyID0gY29uZmlnLmNvbnRhaW5lciA9PT0gZmFsc2UgPyBkb2N1bWVudC5ib2R5IDogZ2V0RWxlbWVudChjb25maWcuY29udGFpbmVyKVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcuZGVsYXkgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcuZGVsYXkgPSB7XG4gICAgICAgIHNob3c6IGNvbmZpZy5kZWxheSxcbiAgICAgICAgaGlkZTogY29uZmlnLmRlbGF5XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcudGl0bGUgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcudGl0bGUgPSBjb25maWcudGl0bGUudG9TdHJpbmcoKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29uZmlnLmNvbnRlbnQgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcuY29udGVudCA9IGNvbmZpZy5jb250ZW50LnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfZ2V0RGVsZWdhdGVDb25maWcoKSB7XG4gICAgY29uc3QgY29uZmlnID0ge31cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZykpIHtcbiAgICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRba2V5XSAhPT0gdmFsdWUpIHtcbiAgICAgICAgY29uZmlnW2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbmZpZy5zZWxlY3RvciA9IGZhbHNlXG4gICAgY29uZmlnLnRyaWdnZXIgPSAnbWFudWFsJ1xuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSBjYW4gYmUgcmVwbGFjZWQgd2l0aDpcbiAgICAvLyBjb25zdCBrZXlzV2l0aERpZmZlcmVudFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZykuZmlsdGVyKGVudHJ5ID0+IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtlbnRyeVswXV0gIT09IHRoaXMuX2NvbmZpZ1tlbnRyeVswXV0pXG4gICAgLy8gYE9iamVjdC5mcm9tRW50cmllcyhrZXlzV2l0aERpZmZlcmVudFZhbHVlcylgXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2Rpc3Bvc2VQb3BwZXIoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKVxuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbFxuICAgIH1cblxuICAgIGlmICh0aGlzLnRpcCkge1xuICAgICAgdGhpcy50aXAucmVtb3ZlKClcbiAgICAgIHRoaXMudGlwID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRvb2x0aXAuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvb2x0aXApXG5cbmV4cG9ydCBkZWZhdWx0IFRvb2x0aXBcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgcG9wb3Zlci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBUb29sdGlwIGZyb20gJy4vdG9vbHRpcC5qcydcbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiB9IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ3BvcG92ZXInXG5cbmNvbnN0IFNFTEVDVE9SX1RJVExFID0gJy5wb3BvdmVyLWhlYWRlcidcbmNvbnN0IFNFTEVDVE9SX0NPTlRFTlQgPSAnLnBvcG92ZXItYm9keSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgLi4uVG9vbHRpcC5EZWZhdWx0LFxuICBjb250ZW50OiAnJyxcbiAgb2Zmc2V0OiBbMCwgOF0sXG4gIHBsYWNlbWVudDogJ3JpZ2h0JyxcbiAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwb3BvdmVyLWFycm93XCI+PC9kaXY+JyArXG4gICAgJzxoMyBjbGFzcz1cInBvcG92ZXItaGVhZGVyXCI+PC9oMz4nICtcbiAgICAnPGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiPjwvZGl2PicgK1xuICAgICc8L2Rpdj4nLFxuICB0cmlnZ2VyOiAnY2xpY2snXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICAuLi5Ub29sdGlwLkRlZmF1bHRUeXBlLFxuICBjb250ZW50OiAnKG51bGx8c3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBQb3BvdmVyIGV4dGVuZHMgVG9vbHRpcCB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBPdmVycmlkZXNcbiAgX2lzV2l0aENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldFRpdGxlKCkgfHwgdGhpcy5fZ2V0Q29udGVudCgpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9USVRMRV06IHRoaXMuX2dldFRpdGxlKCksXG4gICAgICBbU0VMRUNUT1JfQ09OVEVOVF06IHRoaXMuX2dldENvbnRlbnQoKVxuICAgIH1cbiAgfVxuXG4gIF9nZXRDb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcuY29udGVudClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFBvcG92ZXIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFBvcG92ZXIpXG5cbmV4cG9ydCBkZWZhdWx0IFBvcG92ZXJcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgc2Nyb2xsc3B5LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sIGdldEVsZW1lbnQsIGlzRGlzYWJsZWQsIGlzVmlzaWJsZVxufSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdzY3JvbGxzcHknXG5jb25zdCBEQVRBX0tFWSA9ICdicy5zY3JvbGxzcHknXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgRVZFTlRfQUNUSVZBVEUgPSBgYWN0aXZhdGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDSyA9IGBjbGljayR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNID0gJ2Ryb3Bkb3duLWl0ZW0nXG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnXG5cbmNvbnN0IFNFTEVDVE9SX0RBVEFfU1BZID0gJ1tkYXRhLWJzLXNweT1cInNjcm9sbFwiXSdcbmNvbnN0IFNFTEVDVE9SX1RBUkdFVF9MSU5LUyA9ICdbaHJlZl0nXG5jb25zdCBTRUxFQ1RPUl9OQVZfTElTVF9HUk9VUCA9ICcubmF2LCAubGlzdC1ncm91cCdcbmNvbnN0IFNFTEVDVE9SX05BVl9MSU5LUyA9ICcubmF2LWxpbmsnXG5jb25zdCBTRUxFQ1RPUl9OQVZfSVRFTVMgPSAnLm5hdi1pdGVtJ1xuY29uc3QgU0VMRUNUT1JfTElTVF9JVEVNUyA9ICcubGlzdC1ncm91cC1pdGVtJ1xuY29uc3QgU0VMRUNUT1JfTElOS19JVEVNUyA9IGAke1NFTEVDVE9SX05BVl9MSU5LU30sICR7U0VMRUNUT1JfTkFWX0lURU1TfSA+ICR7U0VMRUNUT1JfTkFWX0xJTktTfSwgJHtTRUxFQ1RPUl9MSVNUX0lURU1TfWBcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOID0gJy5kcm9wZG93bidcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBvZmZzZXQ6IG51bGwsIC8vIFRPRE86IHY2IEBkZXByZWNhdGVkLCBrZWVwIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zXG4gIHJvb3RNYXJnaW46ICcwcHggMHB4IC0yNSUnLFxuICBzbW9vdGhTY3JvbGw6IGZhbHNlLFxuICB0YXJnZXQ6IG51bGwsXG4gIHRocmVzaG9sZDogWzAuMSwgMC41LCAxXVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgb2Zmc2V0OiAnKG51bWJlcnxudWxsKScsIC8vIFRPRE8gdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJ3N0cmluZycsXG4gIHNtb290aFNjcm9sbDogJ2Jvb2xlYW4nLFxuICB0YXJnZXQ6ICdlbGVtZW50JyxcbiAgdGhyZXNob2xkOiAnYXJyYXknXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFNjcm9sbFNweSBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICAvLyB0aGlzLl9lbGVtZW50IGlzIHRoZSBvYnNlcnZhYmxlc0NvbnRhaW5lciBhbmQgY29uZmlnLnRhcmdldCB0aGUgbWVudSBsaW5rcyB3cmFwcGVyXG4gICAgdGhpcy5fdGFyZ2V0TGlua3MgPSBuZXcgTWFwKClcbiAgICB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMgPSBuZXcgTWFwKClcbiAgICB0aGlzLl9yb290RWxlbWVudCA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5fZWxlbWVudCkub3ZlcmZsb3dZID09PSAndmlzaWJsZScgPyBudWxsIDogdGhpcy5fZWxlbWVudFxuICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IG51bGxcbiAgICB0aGlzLl9vYnNlcnZlciA9IG51bGxcbiAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEgPSB7XG4gICAgICB2aXNpYmxlRW50cnlUb3A6IDAsXG4gICAgICBwYXJlbnRTY3JvbGxUb3A6IDBcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoKCkgLy8gaW5pdGlhbGl6ZVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICByZWZyZXNoKCkge1xuICAgIHRoaXMuX2luaXRpYWxpemVUYXJnZXRzQW5kT2JzZXJ2YWJsZXMoKVxuICAgIHRoaXMuX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKClcblxuICAgIGlmICh0aGlzLl9vYnNlcnZlcikge1xuICAgICAgdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29ic2VydmVyID0gdGhpcy5fZ2V0TmV3T2JzZXJ2ZXIoKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUoc2VjdGlvbilcbiAgICB9XG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyBUT0RPOiBvbiB2NiB0YXJnZXQgc2hvdWxkIGJlIGdpdmVuIGV4cGxpY2l0bHkgJiByZW1vdmUgdGhlIHt0YXJnZXQ6ICdzcy10YXJnZXQnfSBjYXNlXG4gICAgY29uZmlnLnRhcmdldCA9IGdldEVsZW1lbnQoY29uZmlnLnRhcmdldCkgfHwgZG9jdW1lbnQuYm9keVxuXG4gICAgLy8gVE9ETzogdjYgT25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gVXNlIHJvb3RNYXJnaW4gb25seVxuICAgIGNvbmZpZy5yb290TWFyZ2luID0gY29uZmlnLm9mZnNldCA/IGAke2NvbmZpZy5vZmZzZXR9cHggMHB4IC0zMCVgIDogY29uZmlnLnJvb3RNYXJnaW5cblxuICAgIGlmICh0eXBlb2YgY29uZmlnLnRocmVzaG9sZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZy50aHJlc2hvbGQgPSBjb25maWcudGhyZXNob2xkLnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUZsb2F0KHZhbHVlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfbWF5YmVFbmFibGVTbW9vdGhTY3JvbGwoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuc21vb3RoU2Nyb2xsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyB1bnJlZ2lzdGVyIGFueSBwcmV2aW91cyBsaXN0ZW5lcnNcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2NvbmZpZy50YXJnZXQsIEVWRU5UX0NMSUNLKVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2NvbmZpZy50YXJnZXQsIEVWRU5UX0NMSUNLLCBTRUxFQ1RPUl9UQVJHRVRfTElOS1MsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IG9ic2VydmFibGVTZWN0aW9uID0gdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zLmdldChldmVudC50YXJnZXQuaGFzaClcbiAgICAgIGlmIChvYnNlcnZhYmxlU2VjdGlvbikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290RWxlbWVudCB8fCB3aW5kb3dcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gb2JzZXJ2YWJsZVNlY3Rpb24ub2Zmc2V0VG9wIC0gdGhpcy5fZWxlbWVudC5vZmZzZXRUb3BcbiAgICAgICAgaWYgKHJvb3Quc2Nyb2xsVG8pIHtcbiAgICAgICAgICByb290LnNjcm9sbFRvKHsgdG9wOiBoZWlnaHQsIGJlaGF2aW9yOiAnc21vb3RoJyB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hyb21lIDYwIGRvZXNuJ3Qgc3VwcG9ydCBgc2Nyb2xsVG9gXG4gICAgICAgIHJvb3Quc2Nyb2xsVG9wID0gaGVpZ2h0XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIF9nZXROZXdPYnNlcnZlcigpIHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgcm9vdDogdGhpcy5fcm9vdEVsZW1lbnQsXG4gICAgICB0aHJlc2hvbGQ6IHRoaXMuX2NvbmZpZy50aHJlc2hvbGQsXG4gICAgICByb290TWFyZ2luOiB0aGlzLl9jb25maWcucm9vdE1hcmdpblxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZW50cmllcyA9PiB0aGlzLl9vYnNlcnZlckNhbGxiYWNrKGVudHJpZXMpLCBvcHRpb25zKVxuICB9XG5cbiAgLy8gVGhlIGxvZ2ljIG9mIHNlbGVjdGlvblxuICBfb2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzKSB7XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IGVudHJ5ID0+IHRoaXMuX3RhcmdldExpbmtzLmdldChgIyR7ZW50cnkudGFyZ2V0LmlkfWApXG4gICAgY29uc3QgYWN0aXZhdGUgPSBlbnRyeSA9PiB7XG4gICAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEudmlzaWJsZUVudHJ5VG9wID0gZW50cnkudGFyZ2V0Lm9mZnNldFRvcFxuICAgICAgdGhpcy5fcHJvY2Vzcyh0YXJnZXRFbGVtZW50KGVudHJ5KSlcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRTY3JvbGxUb3AgPSAodGhpcy5fcm9vdEVsZW1lbnQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5zY3JvbGxUb3BcbiAgICBjb25zdCB1c2VyU2Nyb2xsc0Rvd24gPSBwYXJlbnRTY3JvbGxUb3AgPj0gdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnBhcmVudFNjcm9sbFRvcFxuICAgIHRoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YS5wYXJlbnRTY3JvbGxUb3AgPSBwYXJlbnRTY3JvbGxUb3BcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsXG4gICAgICAgIHRoaXMuX2NsZWFyQWN0aXZlQ2xhc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpXG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW50cnlJc0xvd2VyVGhhblByZXZpb3VzID0gZW50cnkudGFyZ2V0Lm9mZnNldFRvcCA+PSB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEudmlzaWJsZUVudHJ5VG9wXG4gICAgICAvLyBpZiB3ZSBhcmUgc2Nyb2xsaW5nIGRvd24sIHBpY2sgdGhlIGJpZ2dlciBvZmZzZXRUb3BcbiAgICAgIGlmICh1c2VyU2Nyb2xsc0Rvd24gJiYgZW50cnlJc0xvd2VyVGhhblByZXZpb3VzKSB7XG4gICAgICAgIGFjdGl2YXRlKGVudHJ5KVxuICAgICAgICAvLyBpZiBwYXJlbnQgaXNuJ3Qgc2Nyb2xsZWQsIGxldCdzIGtlZXAgdGhlIGZpcnN0IHZpc2libGUgaXRlbSwgYnJlYWtpbmcgdGhlIGl0ZXJhdGlvblxuICAgICAgICBpZiAoIXBhcmVudFNjcm9sbFRvcCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgYXJlIHNjcm9sbGluZyB1cCwgcGljayB0aGUgc21hbGxlc3Qgb2Zmc2V0VG9wXG4gICAgICBpZiAoIXVzZXJTY3JvbGxzRG93biAmJiAhZW50cnlJc0xvd2VyVGhhblByZXZpb3VzKSB7XG4gICAgICAgIGFjdGl2YXRlKGVudHJ5KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9pbml0aWFsaXplVGFyZ2V0c0FuZE9ic2VydmFibGVzKCkge1xuICAgIHRoaXMuX3RhcmdldExpbmtzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zID0gbmV3IE1hcCgpXG5cbiAgICBjb25zdCB0YXJnZXRMaW5rcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfVEFSR0VUX0xJTktTLCB0aGlzLl9jb25maWcudGFyZ2V0KVxuXG4gICAgZm9yIChjb25zdCBhbmNob3Igb2YgdGFyZ2V0TGlua3MpIHtcbiAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBhbmNob3IgaGFzIGFuIGlkIGFuZCBpcyBub3QgZGlzYWJsZWRcbiAgICAgIGlmICghYW5jaG9yLmhhc2ggfHwgaXNEaXNhYmxlZChhbmNob3IpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9ic2VydmFibGVTZWN0aW9uID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCB0aGlzLl9lbGVtZW50KVxuXG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgb2JzZXJ2YWJsZVNlY3Rpb24gZXhpc3RzICYgaXMgdmlzaWJsZVxuICAgICAgaWYgKGlzVmlzaWJsZShvYnNlcnZhYmxlU2VjdGlvbikpIHtcbiAgICAgICAgdGhpcy5fdGFyZ2V0TGlua3Muc2V0KGRlY29kZVVSSShhbmNob3IuaGFzaCksIGFuY2hvcilcbiAgICAgICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zLnNldChhbmNob3IuaGFzaCwgb2JzZXJ2YWJsZVNlY3Rpb24pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3Byb2Nlc3ModGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZVRhcmdldCA9PT0gdGFyZ2V0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRoaXMuX2NvbmZpZy50YXJnZXQpXG4gICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gdGFyZ2V0XG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgdGhpcy5fYWN0aXZhdGVQYXJlbnRzKHRhcmdldClcblxuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0FDVElWQVRFLCB7IHJlbGF0ZWRUYXJnZXQ6IHRhcmdldCB9KVxuICB9XG5cbiAgX2FjdGl2YXRlUGFyZW50cyh0YXJnZXQpIHtcbiAgICAvLyBBY3RpdmF0ZSBkcm9wZG93biBwYXJlbnRzXG4gICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNKSkge1xuICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUsIHRhcmdldC5jbG9zZXN0KFNFTEVDVE9SX0RST1BET1dOKSlcbiAgICAgICAgLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxpc3RHcm91cCBvZiBTZWxlY3RvckVuZ2luZS5wYXJlbnRzKHRhcmdldCwgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVApKSB7XG4gICAgICAvLyBTZXQgdHJpZ2dlcmVkIGxpbmtzIHBhcmVudHMgYXMgYWN0aXZlXG4gICAgICAvLyBXaXRoIGJvdGggPHVsPiBhbmQgPG5hdj4gbWFya3VwIGEgcGFyZW50IGlzIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIGFueSBuYXYgYW5jZXN0b3JcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBTZWxlY3RvckVuZ2luZS5wcmV2KGxpc3RHcm91cCwgU0VMRUNUT1JfTElOS19JVEVNUykpIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jbGVhckFjdGl2ZUNsYXNzKHBhcmVudCkge1xuICAgIHBhcmVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuXG4gICAgY29uc3QgYWN0aXZlTm9kZXMgPSBTZWxlY3RvckVuZ2luZS5maW5kKGAke1NFTEVDVE9SX1RBUkdFVF9MSU5LU30uJHtDTEFTU19OQU1FX0FDVElWRX1gLCBwYXJlbnQpXG4gICAgZm9yIChjb25zdCBub2RlIG9mIGFjdGl2ZU5vZGVzKSB7XG4gICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gU2Nyb2xsU3B5LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBmb3IgKGNvbnN0IHNweSBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfU1BZKSkge1xuICAgIFNjcm9sbFNweS5nZXRPckNyZWF0ZUluc3RhbmNlKHNweSlcbiAgfVxufSlcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oU2Nyb2xsU3B5KVxuXG5leHBvcnQgZGVmYXVsdCBTY3JvbGxTcHlcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdGFiLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4sIGdldE5leHRBY3RpdmVFbGVtZW50LCBpc0Rpc2FibGVkIH0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAndGFiJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMudGFiJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcblxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOID0gYGtleWRvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJID0gYGxvYWQke0VWRU5UX0tFWX1gXG5cbmNvbnN0IEFSUk9XX0xFRlRfS0VZID0gJ0Fycm93TGVmdCdcbmNvbnN0IEFSUk9XX1JJR0hUX0tFWSA9ICdBcnJvd1JpZ2h0J1xuY29uc3QgQVJST1dfVVBfS0VZID0gJ0Fycm93VXAnXG5jb25zdCBBUlJPV19ET1dOX0tFWSA9ICdBcnJvd0Rvd24nXG5jb25zdCBIT01FX0tFWSA9ICdIb21lJ1xuY29uc3QgRU5EX0tFWSA9ICdFbmQnXG5cbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFID0gJ2FjdGl2ZSdcbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19EUk9QRE9XTiA9ICdkcm9wZG93bidcblxuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFID0gJy5kcm9wZG93bi10b2dnbGUnXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTl9NRU5VID0gJy5kcm9wZG93bi1tZW51J1xuY29uc3QgTk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9IGA6bm90KCR7U0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfSlgXG5cbmNvbnN0IFNFTEVDVE9SX1RBQl9QQU5FTCA9ICcubGlzdC1ncm91cCwgLm5hdiwgW3JvbGU9XCJ0YWJsaXN0XCJdJ1xuY29uc3QgU0VMRUNUT1JfT1VURVIgPSAnLm5hdi1pdGVtLCAubGlzdC1ncm91cC1pdGVtJ1xuY29uc3QgU0VMRUNUT1JfSU5ORVIgPSBgLm5hdi1saW5rJHtOT1RfU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfSwgLmxpc3QtZ3JvdXAtaXRlbSR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX0sIFtyb2xlPVwidGFiXCJdJHtOT1RfU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfWBcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cInRhYlwiXSwgW2RhdGEtYnMtdG9nZ2xlPVwicGlsbFwiXSwgW2RhdGEtYnMtdG9nZ2xlPVwibGlzdFwiXScgLy8gVE9ETzogY291bGQgb25seSBiZSBgdGFiYCBpbiB2NlxuY29uc3QgU0VMRUNUT1JfSU5ORVJfRUxFTSA9IGAke1NFTEVDVE9SX0lOTkVSfSwgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRX1gXG5cbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFX0FDVElWRSA9IGAuJHtDTEFTU19OQU1FX0FDVElWRX1bZGF0YS1icy10b2dnbGU9XCJ0YWJcIl0sIC4ke0NMQVNTX05BTUVfQUNUSVZFfVtkYXRhLWJzLXRvZ2dsZT1cInBpbGxcIl0sIC4ke0NMQVNTX05BTUVfQUNUSVZFfVtkYXRhLWJzLXRvZ2dsZT1cImxpc3RcIl1gXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRhYiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudClcbiAgICB0aGlzLl9wYXJlbnQgPSB0aGlzLl9lbGVtZW50LmNsb3Nlc3QoU0VMRUNUT1JfVEFCX1BBTkVMKVxuXG4gICAgaWYgKCF0aGlzLl9wYXJlbnQpIHtcbiAgICAgIHJldHVyblxuICAgICAgLy8gVE9ETzogc2hvdWxkIHRocm93IGV4Y2VwdGlvbiBpbiB2NlxuICAgICAgLy8gdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtlbGVtZW50Lm91dGVySFRNTH0gaGFzIG5vdCBhIHZhbGlkIHBhcmVudCAke1NFTEVDVE9SX0lOTkVSX0VMRU19YClcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgaW5pdGlhbCBhcmlhIGF0dHJpYnV0ZXNcbiAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlcyh0aGlzLl9wYXJlbnQsIHRoaXMuX2dldENoaWxkcmVuKCkpXG5cbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTiwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHNob3coKSB7IC8vIFNob3dzIHRoaXMgZWxlbSBhbmQgZGVhY3RpdmF0ZSB0aGUgYWN0aXZlIHNpYmxpbmcgaWYgZXhpc3RzXG4gICAgY29uc3QgaW5uZXJFbGVtID0gdGhpcy5fZWxlbWVudFxuICAgIGlmICh0aGlzLl9lbGVtSXNBY3RpdmUoaW5uZXJFbGVtKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gU2VhcmNoIGZvciBhY3RpdmUgdGFiIG9uIHNhbWUgcGFyZW50IHRvIGRlYWN0aXZhdGUgaXRcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLl9nZXRBY3RpdmVFbGVtKClcblxuICAgIGNvbnN0IGhpZGVFdmVudCA9IGFjdGl2ZSA/XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcihhY3RpdmUsIEVWRU5UX0hJREUsIHsgcmVsYXRlZFRhcmdldDogaW5uZXJFbGVtIH0pIDpcbiAgICAgIG51bGxcblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKGlubmVyRWxlbSwgRVZFTlRfU0hPVywgeyByZWxhdGVkVGFyZ2V0OiBhY3RpdmUgfSlcblxuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAoaGlkZUV2ZW50ICYmIGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZGVhY3RpdmF0ZShhY3RpdmUsIGlubmVyRWxlbSlcbiAgICB0aGlzLl9hY3RpdmF0ZShpbm5lckVsZW0sIGFjdGl2ZSlcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2FjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG5cbiAgICB0aGlzLl9hY3RpdmF0ZShTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpKSAvLyBTZWFyY2ggYW5kIGFjdGl2YXRlL3Nob3cgdGhlIHByb3BlciBzZWN0aW9uXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgncm9sZScpICE9PSAndGFiJykge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4JylcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgdHJ1ZSlcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIHRydWUpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcihlbGVtZW50LCBFVkVOVF9TSE9XTiwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkRWxlbVxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCBlbGVtZW50LCBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpKVxuICB9XG5cbiAgX2RlYWN0aXZhdGUoZWxlbWVudCwgcmVsYXRlZEVsZW0pIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSlcbiAgICBlbGVtZW50LmJsdXIoKVxuXG4gICAgdGhpcy5fZGVhY3RpdmF0ZShTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpKSAvLyBTZWFyY2ggYW5kIGRlYWN0aXZhdGUgdGhlIHNob3duIHNlY3Rpb24gdG9vXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgncm9sZScpICE9PSAndGFiJykge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBmYWxzZSlcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpXG4gICAgICB0aGlzLl90b2dnbGVEcm9wRG93bihlbGVtZW50LCBmYWxzZSlcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKGVsZW1lbnQsIEVWRU5UX0hJRERFTiwgeyByZWxhdGVkVGFyZ2V0OiByZWxhdGVkRWxlbSB9KVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIGVsZW1lbnQsIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSkpXG4gIH1cblxuICBfa2V5ZG93bihldmVudCkge1xuICAgIGlmICghKFtBUlJPV19MRUZUX0tFWSwgQVJST1dfUklHSFRfS0VZLCBBUlJPV19VUF9LRVksIEFSUk9XX0RPV05fS0VZLCBIT01FX0tFWSwgRU5EX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpLy8gc3RvcFByb3BhZ2F0aW9uL3ByZXZlbnREZWZhdWx0IGJvdGggYWRkZWQgdG8gc3VwcG9ydCB1cC9kb3duIGtleXMgd2l0aG91dCBzY3JvbGxpbmcgdGhlIHBhZ2VcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuX2dldENoaWxkcmVuKCkuZmlsdGVyKGVsZW1lbnQgPT4gIWlzRGlzYWJsZWQoZWxlbWVudCkpXG4gICAgbGV0IG5leHRBY3RpdmVFbGVtZW50XG5cbiAgICBpZiAoW0hPTUVfS0VZLCBFTkRfS0VZXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICBuZXh0QWN0aXZlRWxlbWVudCA9IGNoaWxkcmVuW2V2ZW50LmtleSA9PT0gSE9NRV9LRVkgPyAwIDogY2hpbGRyZW4ubGVuZ3RoIC0gMV1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNOZXh0ID0gW0FSUk9XX1JJR0hUX0tFWSwgQVJST1dfRE9XTl9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSlcbiAgICAgIG5leHRBY3RpdmVFbGVtZW50ID0gZ2V0TmV4dEFjdGl2ZUVsZW1lbnQoY2hpbGRyZW4sIGV2ZW50LnRhcmdldCwgaXNOZXh0LCB0cnVlKVxuICAgIH1cblxuICAgIGlmIChuZXh0QWN0aXZlRWxlbWVudCkge1xuICAgICAgbmV4dEFjdGl2ZUVsZW1lbnQuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pXG4gICAgICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZShuZXh0QWN0aXZlRWxlbWVudCkuc2hvdygpXG4gICAgfVxuICB9XG5cbiAgX2dldENoaWxkcmVuKCkgeyAvLyBjb2xsZWN0aW9uIG9mIGlubmVyIGVsZW1lbnRzXG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfSU5ORVJfRUxFTSwgdGhpcy5fcGFyZW50KVxuICB9XG5cbiAgX2dldEFjdGl2ZUVsZW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENoaWxkcmVuKCkuZmluZChjaGlsZCA9PiB0aGlzLl9lbGVtSXNBY3RpdmUoY2hpbGQpKSB8fCBudWxsXG4gIH1cblxuICBfc2V0SW5pdGlhbEF0dHJpYnV0ZXMocGFyZW50LCBjaGlsZHJlbikge1xuICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKHBhcmVudCwgJ3JvbGUnLCAndGFibGlzdCcpXG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uQ2hpbGQoY2hpbGQpXG4gICAgfVxuICB9XG5cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzT25DaGlsZChjaGlsZCkge1xuICAgIGNoaWxkID0gdGhpcy5fZ2V0SW5uZXJFbGVtZW50KGNoaWxkKVxuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5fZWxlbUlzQWN0aXZlKGNoaWxkKVxuICAgIGNvbnN0IG91dGVyRWxlbSA9IHRoaXMuX2dldE91dGVyRWxlbWVudChjaGlsZClcbiAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBpc0FjdGl2ZSlcblxuICAgIGlmIChvdXRlckVsZW0gIT09IGNoaWxkKSB7XG4gICAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhvdXRlckVsZW0sICdyb2xlJywgJ3ByZXNlbnRhdGlvbicpXG4gICAgfVxuXG4gICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpXG4gICAgfVxuXG4gICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMoY2hpbGQsICdyb2xlJywgJ3RhYicpXG5cbiAgICAvLyBzZXQgYXR0cmlidXRlcyB0byB0aGUgcmVsYXRlZCBwYW5lbCB0b29cbiAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwoY2hpbGQpXG4gIH1cblxuICBfc2V0SW5pdGlhbEF0dHJpYnV0ZXNPblRhcmdldFBhbmVsKGNoaWxkKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihjaGlsZClcblxuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0YXJnZXQsICdyb2xlJywgJ3RhYnBhbmVsJylcblxuICAgIGlmIChjaGlsZC5pZCkge1xuICAgICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHModGFyZ2V0LCAnYXJpYS1sYWJlbGxlZGJ5JywgYCR7Y2hpbGQuaWR9YClcbiAgICB9XG4gIH1cblxuICBfdG9nZ2xlRHJvcERvd24oZWxlbWVudCwgb3Blbikge1xuICAgIGNvbnN0IG91dGVyRWxlbSA9IHRoaXMuX2dldE91dGVyRWxlbWVudChlbGVtZW50KVxuICAgIGlmICghb3V0ZXJFbGVtLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19EUk9QRE9XTikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRvZ2dsZSA9IChzZWxlY3RvciwgY2xhc3NOYW1lKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3Rvciwgb3V0ZXJFbGVtKVxuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGNsYXNzTmFtZSwgb3BlbilcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGUoU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFLCBDTEFTU19OQU1FX0FDVElWRSlcbiAgICB0b2dnbGUoU0VMRUNUT1JfRFJPUERPV05fTUVOVSwgQ0xBU1NfTkFNRV9TSE9XKVxuICAgIG91dGVyRWxlbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBvcGVuKVxuICB9XG5cbiAgX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKGVsZW1lbnQsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSkpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpXG4gICAgfVxuICB9XG5cbiAgX2VsZW1Jc0FjdGl2ZShlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQUNUSVZFKVxuICB9XG5cbiAgLy8gVHJ5IHRvIGdldCB0aGUgaW5uZXIgZWxlbWVudCAodXN1YWxseSB0aGUgLm5hdi1saW5rKVxuICBfZ2V0SW5uZXJFbGVtZW50KGVsZW0pIHtcbiAgICByZXR1cm4gZWxlbS5tYXRjaGVzKFNFTEVDVE9SX0lOTkVSX0VMRU0pID8gZWxlbSA6IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfSU5ORVJfRUxFTSwgZWxlbSlcbiAgfVxuXG4gIC8vIFRyeSB0byBnZXQgdGhlIG91dGVyIGVsZW1lbnQgKHVzdWFsbHkgdGhlIC5uYXYtaXRlbSlcbiAgX2dldE91dGVyRWxlbWVudChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uY2xvc2VzdChTRUxFQ1RPUl9PVVRFUikgfHwgZWxlbVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10oKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKS5zaG93KClcbn0pXG5cbi8qKlxuICogSW5pdGlhbGl6ZSBvbiBmb2N1c1xuICovXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFX0FDVElWRSkpIHtcbiAgICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50KVxuICB9XG59KVxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oVGFiKVxuXG5leHBvcnQgZGVmYXVsdCBUYWJcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdG9hc3QuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcydcbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiwgcmVmbG93IH0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAndG9hc3QnXG5jb25zdCBEQVRBX0tFWSA9ICdicy50b2FzdCdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5cbmNvbnN0IEVWRU5UX01PVVNFT1ZFUiA9IGBtb3VzZW92ZXIke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRU9VVCA9IGBtb3VzZW91dCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0ZPQ1VTSU4gPSBgZm9jdXNpbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0ZPQ1VTT1VUID0gYGZvY3Vzb3V0JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfSElERSA9ICdoaWRlJyAvLyBAZGVwcmVjYXRlZCAtIGtlcHQgaGVyZSBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX1NIT1dJTkcgPSAnc2hvd2luZydcblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGFuaW1hdGlvbjogJ2Jvb2xlYW4nLFxuICBhdXRvaGlkZTogJ2Jvb2xlYW4nLFxuICBkZWxheTogJ251bWJlcidcbn1cblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYW5pbWF0aW9uOiB0cnVlLFxuICBhdXRvaGlkZTogdHJ1ZSxcbiAgZGVsYXk6IDUwMDBcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVG9hc3QgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgdGhpcy5fdGltZW91dCA9IG51bGxcbiAgICB0aGlzLl9oYXNNb3VzZUludGVyYWN0aW9uID0gZmFsc2VcbiAgICB0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9uID0gZmFsc2VcbiAgICB0aGlzLl9zZXRMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBzaG93KCkge1xuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1cpXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NsZWFyVGltZW91dCgpXG5cbiAgICBpZiAodGhpcy5fY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSlcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTilcblxuICAgICAgdGhpcy5fbWF5YmVTY2hlZHVsZUhpZGUoKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0hJREUpIC8vIEBkZXByZWNhdGVkXG4gICAgcmVmbG93KHRoaXMuX2VsZW1lbnQpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVywgQ0xBU1NfTkFNRV9TSE9XSU5HKVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdGhpcy5fY29uZmlnLmFuaW1hdGlvbilcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcblxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9ISURFKSAvLyBAZGVwcmVjYXRlZFxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPV0lORywgQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1dJTkcpXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdGhpcy5fY29uZmlnLmFuaW1hdGlvbilcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5fY2xlYXJUaW1lb3V0KClcblxuICAgIGlmICh0aGlzLmlzU2hvd24oKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICB9XG5cbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIGlzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVylcbiAgfVxuXG4gIC8vIFByaXZhdGVcblxuICBfbWF5YmVTY2hlZHVsZUhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuYXV0b2hpZGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9oYXNNb3VzZUludGVyYWN0aW9uIHx8IHRoaXMuX2hhc0tleWJvYXJkSW50ZXJhY3Rpb24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaGlkZSgpXG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5KVxuICB9XG5cbiAgX29uSW50ZXJhY3Rpb24oZXZlbnQsIGlzSW50ZXJhY3RpbmcpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgICBjYXNlICdtb3VzZW91dCc6IHtcbiAgICAgICAgdGhpcy5faGFzTW91c2VJbnRlcmFjdGlvbiA9IGlzSW50ZXJhY3RpbmdcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICBjYXNlICdmb2N1c291dCc6IHtcbiAgICAgICAgdGhpcy5faGFzS2V5Ym9hcmRJbnRlcmFjdGlvbiA9IGlzSW50ZXJhY3RpbmdcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0ludGVyYWN0aW5nKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVvdXQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQgPT09IG5leHRFbGVtZW50IHx8IHRoaXMuX2VsZW1lbnQuY29udGFpbnMobmV4dEVsZW1lbnQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9tYXliZVNjaGVkdWxlSGlkZSgpXG4gIH1cblxuICBfc2V0TGlzdGVuZXJzKCkge1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRU9WRVIsIGV2ZW50ID0+IHRoaXMuX29uSW50ZXJhY3Rpb24oZXZlbnQsIHRydWUpKVxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRU9VVCwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgZmFsc2UpKVxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCB0cnVlKSlcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfRk9DVVNPVVQsIGV2ZW50ID0+IHRoaXMuX29uSW50ZXJhY3Rpb24oZXZlbnQsIGZhbHNlKSlcbiAgfVxuXG4gIF9jbGVhclRpbWVvdXQoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpXG4gICAgdGhpcy5fdGltZW91dCA9IG51bGxcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRvYXN0LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtjb25maWddKHRoaXMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuZW5hYmxlRGlzbWlzc1RyaWdnZXIoVG9hc3QpXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvYXN0KVxuXG5leHBvcnQgZGVmYXVsdCBUb2FzdFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBpbmRleC51bWQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgQWxlcnQgZnJvbSAnLi9zcmMvYWxlcnQuanMnXG5pbXBvcnQgQnV0dG9uIGZyb20gJy4vc3JjL2J1dHRvbi5qcydcbmltcG9ydCBDYXJvdXNlbCBmcm9tICcuL3NyYy9jYXJvdXNlbC5qcydcbmltcG9ydCBDb2xsYXBzZSBmcm9tICcuL3NyYy9jb2xsYXBzZS5qcydcbmltcG9ydCBEcm9wZG93biBmcm9tICcuL3NyYy9kcm9wZG93bi5qcydcbmltcG9ydCBNb2RhbCBmcm9tICcuL3NyYy9tb2RhbC5qcydcbmltcG9ydCBPZmZjYW52YXMgZnJvbSAnLi9zcmMvb2ZmY2FudmFzLmpzJ1xuaW1wb3J0IFBvcG92ZXIgZnJvbSAnLi9zcmMvcG9wb3Zlci5qcydcbmltcG9ydCBTY3JvbGxTcHkgZnJvbSAnLi9zcmMvc2Nyb2xsc3B5LmpzJ1xuaW1wb3J0IFRhYiBmcm9tICcuL3NyYy90YWIuanMnXG5pbXBvcnQgVG9hc3QgZnJvbSAnLi9zcmMvdG9hc3QuanMnXG5pbXBvcnQgVG9vbHRpcCBmcm9tICcuL3NyYy90b29sdGlwLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIEFsZXJ0LFxuICBCdXR0b24sXG4gIENhcm91c2VsLFxuICBDb2xsYXBzZSxcbiAgRHJvcGRvd24sXG4gIE1vZGFsLFxuICBPZmZjYW52YXMsXG4gIFBvcG92ZXIsXG4gIFNjcm9sbFNweSxcbiAgVGFiLFxuICBUb2FzdCxcbiAgVG9vbHRpcFxufVxuIiwgImltcG9ydCB7IEFwcCwgUGx1Z2luLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBJdGVtVmlldywgV29ya3NwYWNlTGVhZiwgVEZpbGUgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcbmltcG9ydCAnYm9vdHN0cmFwL2Rpc3QvY3NzL2Jvb3RzdHJhcC5taW4uY3NzJztcbmltcG9ydCAnYm9vdHN0cmFwL2Rpc3QvanMvYm9vdHN0cmFwLmJ1bmRsZS5taW4uanMnO1xuXG5pbnRlcmZhY2UgTXlQbHVnaW5TZXR0aW5ncyB7XG4gICAgbXlTZXR0aW5nOiBzdHJpbmc7XG59XG5cbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IE15UGx1Z2luU2V0dGluZ3MgPSB7XG4gICAgbXlTZXR0aW5nOiAnZGVmYXVsdCdcbn1cblxuY29uc3QgREVGQVVMVF9ORVRXT1JLX1NFVFRJTkdTIDogYW55ID0ge1xuXHRzY29yZVRocmVzaG9sZDogMC44LFxuXHRub2RlU2l6ZTogMyxcblx0bGlua1RoaWNrbmVzczogMC4zLFxuXHRyZXBlbEZvcmNlOiA0MDAsXG5cdGxpbmtGb3JjZTogMC40LFxuXHRsaW5rRGlzdGFuY2U6IDcwLFxuXHRjZW50ZXJGb3JjZTogMC40MFxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIFNtYXJ0U2VhcmNoOiBhbnk7XG4gICAgfVxufVxuXG5jbGFzcyBNeUl0ZW1WaWV3IGV4dGVuZHMgSXRlbVZpZXcge1xuXG5cdGN1cnJlbnROb3RlS2V5OiBzdHJpbmc7IC8vIERlZmluZSB0aGUgY3VycmVudE5vdGVLZXkgcHJvcGVydHlcblx0Y2VudHJhbE5vdGU6IGFueTtcblx0Y2VudHJhbE5vZGU6IGFueTtcblx0Y29ubmVjdGlvblR5cGUgPSAnYmxvY2snO1xuICAgIGlzSG92ZXJpbmc6IGJvb2xlYW47IC8vIEFkZCBhIGZsYWcgdG8gdHJhY2sgaG92ZXIgc3RhdGVcblx0c2lnbmlmaWNhbmNlU2NvcmVUaHJlc2hvbGQgPSAwLjg7XG5cdHNldHRpbmdzSW5zdGFudGlhdGVkID0gZmFsc2U7XG5cdG5vZGVTaXplID0gMztcblx0bGlua1RoaWNrbmVzcyA9IDAuMztcblx0cmVwZWxGb3JjZSA9IDQwMDtcblx0bGlua0ZvcmNlID0gMC40O1xuXHRsaW5rRGlzdGFuY2UgPSA3MDtcblx0Y2VudGVyRm9yY2UgPSAwLjQwO1xuXHR0ZXh0RmFkZVRocmVzaG9sZCA9IDEuMTtcblx0bWluU2NvcmUgPSAxO1xuXHRtYXhTY29yZSA9IDA7XG5cdG1pbk5vZGVTaXplID0gMztcblx0bWF4Tm9kZVNpemUgPSA2O1xuXHRtaW5MaW5rVGhpY2tuZXNzID0gMC4zO1xuXHRtYXhMaW5rVGhpY2tuZXNzID0gNDtcblx0bm9kZVNlbGVjdGlvbiA6IGFueTtcblx0bGlua1NlbGVjdGlvbiA6IGFueTtcblx0bGFiZWxTZWxlY3Rpb24gOiBhbnk7XG5cdHVwZGF0aW5nVmlzdWFsaXphdGlvbjogYm9vbGVhbjsgLy8gQWRkIHRoaXMgZmxhZ1xuXHRpc0N0cmxQcmVzc2VkID0gZmFsc2U7XG4gICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgIHNlbGVjdGlvbkJveDogYW55O1xuXHR2YWxpZGF0ZWRMaW5rcyA6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKGxlYWY6IFdvcmtzcGFjZUxlYWYpIHtcbiAgICAgICAgc3VwZXIobGVhZik7XG5cdFx0dGhpcy5jdXJyZW50Tm90ZUtleSA9ICcnO1xuXHRcdHRoaXMuaXNIb3ZlcmluZyA9IGZhbHNlOyBcblxuICAgIH1cblxuICAgIGdldFZpZXdUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcIk15IEl0ZW0gVmlld1wiO1xuICAgIH1cblxuICAgIGdldERpc3BsYXlUZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcIk15IEl0ZW0gVmlld1wiO1xuICAgIH1cblxuICAgIGdldEljb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiZGljZVwiO1xuICAgIH1cblxuXHQvLyBGdW5jdGlvbiB0byB1cGRhdGUgbm9kZSBhcHBlYXJhbmNlIGJhc2VkIG9uIHNlbGVjdGlvbiBhbmQgaGlnaGxpZ2h0IHN0YXRlXG5cdHVwZGF0ZU5vZGVBcHBlYXJhbmNlKCkge1xuXHRcdHRoaXMubm9kZVNlbGVjdGlvbi50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKVxuXHRcdFx0LmF0dHIoJ2ZpbGwnLCAoZDogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChkLmlkID09PSB0aGlzLmNlbnRyYWxOb2RlLmlkKSB7XG5cdFx0XHRcdFx0cmV0dXJuICcjN2M4NTk0Jztcblx0XHRcdFx0fSBlbHNlIGlmIChkLnNlbGVjdGVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuICcjZjNlZTVkJztcblx0XHRcdFx0fSBlbHNlIGlmIChkLmhpZ2hsaWdodGVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuICcjZDQ2ZWJlJztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gZC5ncm91cCA9PT0gJ25vdGUnID8gJyM3Yzg1OTQnIDogJyM5MjZlYzknO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmF0dHIoJ3N0cm9rZScsIChkOiBhbnkpID0+IGQuc2VsZWN0ZWQgPyAnI2ZmMCcgOiAndHJhbnNwYXJlbnQnKVxuXHRcdFx0LmF0dHIoJ3N0cm9rZS13aWR0aCcsIChkOiBhbnkpID0+IGQuc2VsZWN0ZWQgPyAyIDogMC4zKVxuXHRcdFx0LmF0dHIoJ29wYWNpdHknLCAoZDogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChkLmlkID09PSB0aGlzLmNlbnRyYWxOb2RlLmlkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdH0gZWxzZSBpZiAoZC5zZWxlY3RlZCB8fCBkLmhpZ2hsaWdodGVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5pc0hvdmVyaW5nKSB7XG5cdFx0XHRcdFx0Y29uc29sZS5sb2coJ29wYWNpdHkgbG93Jyk7XG5cdFx0XHRcdFx0cmV0dXJuIDAuMTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zb2xlLmxvZygnb3BhY2l0eSB1cCcpO1xuXHRcdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXHRcbiAgICAvLyBGdW5jdGlvbiB0byB0b2dnbGUgbm9kZSBzZWxlY3Rpb25cbiAgICB0b2dnbGVOb2RlU2VsZWN0aW9uKG5vZGVJZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVTZWxlY3Rpb24uZGF0YSgpLmZpbmQoKGQ6IGFueSkgPT4gZC5pZCA9PT0gbm9kZUlkKTtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIG5vZGUuc2VsZWN0ZWQgPSAhbm9kZS5zZWxlY3RlZDtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTm9kZUFwcGVhcmFuY2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQgLy8gQ2xlYXIgYWxsIHNlbGVjdGlvbnNcblx0IGNsZWFyU2VsZWN0aW9ucygpIHtcbiAgICAgICAgdGhpcy5ub2RlU2VsZWN0aW9uLmVhY2goKGQ6IGFueSkgPT4gZC5zZWxlY3RlZCA9IGZhbHNlKTtcbiAgICAgICAgdGhpcy51cGRhdGVOb2RlQXBwZWFyYW5jZSgpO1xuICAgIH1cblxuXHRoaWdobGlnaHROb2RlKG5vZGU6IGFueSkge1xuXHRcdHRoaXMubm9kZVNlbGVjdGlvbi5lYWNoKChkOiBhbnkpID0+IHtcblx0XHRcdGlmIChkLmlkICE9PSB0aGlzLmNlbnRyYWxOb2RlLmlkKSB7XG5cdFx0XHRcdGQuaGlnaGxpZ2h0ZWQgPSAoZC5pZCA9PT0gbm9kZS5pZCB8fCB0aGlzLnZhbGlkYXRlZExpbmtzLnNvbWUoKGxpbms6IGFueSkgPT5cblx0XHRcdFx0XHQobGluay5zb3VyY2UuaWQgPT09IG5vZGUuaWQgJiYgbGluay50YXJnZXQuaWQgPT09IGQuaWQpIHx8XG5cdFx0XHRcdFx0KGxpbmsudGFyZ2V0LmlkID09PSBub2RlLmlkICYmIGxpbmsuc291cmNlLmlkID09PSBkLmlkKSkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHRoaXMudXBkYXRlTm9kZUFwcGVhcmFuY2UoKTtcblx0XG5cdFx0dGhpcy5saW5rU2VsZWN0aW9uLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApXG5cdFx0XHQuYXR0cignb3BhY2l0eScsIChkOiBhbnkpID0+IChkLnNvdXJjZS5pZCA9PT0gbm9kZS5pZCB8fCBkLnRhcmdldC5pZCA9PT0gbm9kZS5pZCkgPyAxIDogMC4xKTtcblx0XG5cdFx0dGhpcy5sYWJlbFNlbGVjdGlvbi50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKVxuXHRcdFx0LmF0dHIoJ29wYWNpdHknLCAoZDogYW55KSA9PlxuXHRcdFx0XHQoZC5pZCA9PT0gbm9kZS5pZCB8fCB0aGlzLnZhbGlkYXRlZExpbmtzLnNvbWUoKGxpbms6IGFueSkgPT5cblx0XHRcdFx0XHQobGluay5zb3VyY2UuaWQgPT09IG5vZGUuaWQgJiYgbGluay50YXJnZXQuaWQgPT09IGQuaWQpIHx8XG5cdFx0XHRcdFx0KGxpbmsudGFyZ2V0LmlkID09PSBub2RlLmlkICYmIGxpbmsuc291cmNlLmlkID09PSBkLmlkKSkpID8gMSA6IDAuMSk7XG5cdH1cblx0XG5cdFxuXHR1bmhpZ2hsaWdodE5vZGUoKSB7XG5cdFx0dGhpcy5ub2RlU2VsZWN0aW9uLmVhY2goKGQ6IGFueSkgPT4ge1xuXHRcdFx0aWYgKGQuaWQgIT09IHRoaXMuY2VudHJhbE5vZGUuaWQgJiYgIWQuc2VsZWN0ZWQpIHtcblx0XHRcdFx0ZC5oaWdobGlnaHRlZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHRoaXMudXBkYXRlTm9kZUFwcGVhcmFuY2UoKTtcblx0XG5cdFx0dGhpcy5saW5rU2VsZWN0aW9uLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmF0dHIoJ29wYWNpdHknLCAxKTtcblx0XHR0aGlzLmxhYmVsU2VsZWN0aW9uLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmF0dHIoJ29wYWNpdHknLCAxKTtcblx0fVxuXHRcblx0XG5cblx0YXN5bmMgb25PcGVuKCkge1xuXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XG5cdFx0XHQvLyBUbyBiZSB1c2VkIGZvciBmdW5jdGlvbnMgdGhhdCBkb250IGhhdmUgdGhpcyBpbiB0aGUgc2NvcGVcblx0XHRcdGxldCB0aGF0ID0gdGhpcztcblx0XHRcblx0XHRcdGNvbnN0IHNtYXJ0Tm90ZXMgID0gd2luZG93LlNtYXJ0U2VhcmNoLm1haW4uZW52LnNtYXJ0X25vdGVzLml0ZW1zO1xuXHRcdFxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKHNtYXJ0Tm90ZXMpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb25zb2xlLmxvZyhcIk5vIHNtYXJ0IG5vdGVzIGZvdW5kLlwiKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFxuXHRcdFx0Y29uc29sZS5sb2coJ1NtYXJ0Tm90ZXM6Jywgc21hcnROb3Rlcyk7XG5cdFx0XG5cdFx0XHRsZXQgbm9kZXM6IGFueVtdID0gW107XG5cdFx0XHRsZXQgbGlua3M6IGFueVtdID0gW107XG5cdFx0XHRsZXQgY29ubmVjdGlvbnM6IGFueVtdID0gW107XG5cdFx0XHRcblx0XHRcblx0XHRcdGZ1bmN0aW9uIHZhbGlkYXRlR3JhcGhEYXRhKG5vZGVzOiBhbnlbXSwgbGlua3M6IGFueVtdKTogYm9vbGVhbiB7XG5cdFx0XHRcdGNvbnN0IG5vZGVJZHMgPSBuZXcgU2V0KG5vZGVzLm1hcChub2RlID0+IG5vZGUuaWQpKTtcblx0XHRcdFx0bGV0IGlzVmFsaWQgPSB0cnVlO1xuXHRcdFxuXHRcdFx0XHRsaW5rcy5mb3JFYWNoKChsaW5rLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRcdGlmICghbm9kZUlkcy5oYXMobGluay5zb3VyY2UpKSB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGBMaW5rIGF0IGluZGV4ICR7aW5kZXh9IGhhcyBhbiBpbnZhbGlkIHNvdXJjZTogJHtsaW5rLnNvdXJjZX1gKTtcblx0XHRcdFx0XHRcdGlzVmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFub2RlSWRzLmhhcyhsaW5rLnRhcmdldCkpIHtcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoYExpbmsgYXQgaW5kZXggJHtpbmRleH0gaGFzIGFuIGludmFsaWQgdGFyZ2V0OiAke2xpbmsudGFyZ2V0fWApO1xuXHRcdFx0XHRcdFx0aXNWYWxpZCA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XG5cdFx0XHRcdG5vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiB7XG5cdFx0XHRcdFx0aWYgKCFub2RlLmhhc093blByb3BlcnR5KCdpZCcpIHx8ICFub2RlLmhhc093blByb3BlcnR5KCduYW1lJykgfHwgIW5vZGUuaGFzT3duUHJvcGVydHkoJ2dyb3VwJykpIHtcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoYE5vZGUgYXQgaW5kZXggJHtpbmRleH0gaXMgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0aWVzOiAke0pTT04uc3RyaW5naWZ5KG5vZGUpfWApO1xuXHRcdFx0XHRcdFx0aXNWYWxpZCA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XG5cdFx0XHRcdHJldHVybiBpc1ZhbGlkO1xuXHRcdFx0fVxuXHRcdFxuXHRcdFx0Y29uc3QgdXBkYXRlQ29ubmVjdGlvbnMgPSAoKSA9PiB7XG5cblx0XHRcdFx0Ly8gUmVzZXQgVmFyaWFibGVzXG5cdFx0XHRcdG5vZGVzID0gW107XG5cdFx0XHRcdGxpbmtzID0gW107XG5cdFx0XHRcdGNvbm5lY3Rpb25zID0gW107XG5cdFx0XHRcdHRoaXMubWluU2NvcmUgPSAxO1xuXHRcdFx0XHR0aGlzLm1heFNjb3JlID0gMDtcblx0XHRcblx0XHRcdFx0Ly8gRG9udCBib3RoZXIgZXhlY3V0aW5nIGlmIHdlIGRvbid0IGhhdmUgYSBub3RlIHRvIGZpbmQgY29ubmVjdGlvbnMgZm9yXG5cdFx0XHRcdGlmICghdGhpcy5jdXJyZW50Tm90ZUtleSkgcmV0dXJuO1xuXHRcdFxuXHRcdFx0XHR0aGlzLmNlbnRyYWxOb3RlID0gc21hcnROb3Rlc1t0aGlzLmN1cnJlbnROb3RlS2V5XTtcblx0XHRcdFx0Y29uc3Qgbm90ZUNvbm5lY3Rpb25zID0gdGhpcy5jZW50cmFsTm90ZS5maW5kX2Nvbm5lY3Rpb25zKCkuZmlsdGVyKFxuXHRcdFx0XHRcdChjb25uZWN0aW9uOiBhbnkpID0+IGNvbm5lY3Rpb24uc2NvcmUgPj0gdGhpcy5zaWduaWZpY2FuY2VTY29yZVRocmVzaG9sZCk7IFxuXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdjZW50cmFsIG5vdGU6ICcsIHRoaXMuY2VudHJhbE5vdGUpO1xuXHRcdFx0XHRjb25zb2xlLmxvZygnbm90ZSBjb25uZWN0aW9uczogJywgdGhpcy5jZW50cmFsTm90ZS5maW5kX2Nvbm5lY3Rpb25zKCkpO1xuXG5cdFx0XHRcdC8vIEFkZCB0aGUgbm90ZSBub2RlIGl0c2VsZlxuXHRcdFx0XHRpZiAodGhpcy5jZW50cmFsTm90ZS5rZXkgJiYgdGhpcy5jZW50cmFsTm90ZS5rZXkudHJpbSgpICE9PSAnJyAmJiAhbm9kZXMuc29tZShub2RlID0+IG5vZGUuaWQgPT09IHRoaXMuY2VudHJhbE5vdGUua2V5KSkge1xuXHRcdFx0XHRcdG5vZGVzLnB1c2goe1xuXHRcdFx0XHRcdFx0aWQ6IHRoaXMuY2VudHJhbE5vdGUua2V5LFxuXHRcdFx0XHRcdFx0bmFtZTogdGhpcy5jZW50cmFsTm90ZS5rZXksXG5cdFx0XHRcdFx0XHRncm91cDogJ25vdGUnLFxuXHRcdFx0XHRcdFx0eDogTWF0aC5yYW5kb20oKSAqIDEwMDAsXG5cdFx0XHRcdFx0XHR5OiBNYXRoLnJhbmRvbSgpICogMTAwMCxcblx0XHRcdFx0XHRcdGZ4OiBudWxsLFxuXHRcdFx0XHRcdFx0Znk6IG51bGwsXG5cdFx0XHRcdFx0XHRzZWxlY3RlZDogZmFsc2UsIC8vIEFkZCBzZWxlY3RlZCBwcm9wZXJ0eVxuXHRcdFx0XHRcdFx0aGlnaGxpZ2h0ZWQgOiBmYWxzZVxuXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHQvLyBBc3NpZ24gY2VudHJhbCBub2RlIC0gMXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5IHNvIGZhclxuXHRcdFx0XHRcdHRoaXMuY2VudHJhbE5vZGUgPSBub2Rlc1swXTsgXG5cblx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHQvLyBGaWx0ZXIgY29ubmVjdGlvbnMgYmFzZWQgb24gdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gdHlwZVxuXHRcdFx0XHRjb25zdCBmaWx0ZXJlZENvbm5lY3Rpb25zID0gbm90ZUNvbm5lY3Rpb25zLmZpbHRlcigoY29ubmVjdGlvbjogYW55KSA9PiBjb25uZWN0aW9uLl9fcHJvdG9fXy5jb25zdHJ1Y3Rvci5uYW1lID09PSAodGhpcy5jb25uZWN0aW9uVHlwZSA9PT0gJ2Jsb2NrJyA/ICdTbWFydEJsb2NrJyA6ICdTbWFydE5vdGUnKSk7XHRcdFxuXHRcdFx0XHQvLyBBZGRpbmcgY29ubmVjdGlvbnMgZnJvbSBibG9ja0Nvbm5lY3Rpb25zXG5cblx0XHRcdFx0ZmlsdGVyZWRDb25uZWN0aW9ucy5mb3JFYWNoKChjb25uZWN0aW9uOiBhbnksIGluZGV4OiBhbnkpID0+IHtcblx0XHRcdFx0XHRpZiAoY29ubmVjdGlvbiAmJiBjb25uZWN0aW9uLmRhdGEgJiYgY29ubmVjdGlvbi5kYXRhLmtleSAmJiBjb25uZWN0aW9uLmRhdGEua2V5LnRyaW0oKSAhPT0gJycpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb24uZGF0YS5rZXk7XG5cdFx0XG5cdFx0XHRcdFx0XHRpZiAoIW5vZGVzLnNvbWUobm9kZSA9PiBub2RlLmlkID09PSBjb25uZWN0aW9uSWQpKSB7XG5cdFx0XHRcdFx0XHRcdG5vZGVzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdGlkOiBjb25uZWN0aW9uSWQsXG5cdFx0XHRcdFx0XHRcdFx0bmFtZTogY29ubmVjdGlvbklkLFxuXHRcdFx0XHRcdFx0XHRcdGdyb3VwOiAnYmxvY2snLFxuXHRcdFx0XHRcdFx0XHRcdHg6IE1hdGgucmFuZG9tKCkgKiAxMDAwLFxuXHRcdFx0XHRcdFx0XHRcdHk6IE1hdGgucmFuZG9tKCkgKiAxMDAwLFxuXHRcdFx0XHRcdFx0XHRcdGZ4OiBudWxsLFxuXHRcdFx0XHRcdFx0XHRcdGZ5OiBudWxsLFxuXHRcdFx0XHRcdFx0XHRcdHNlbGVjdGVkOiBmYWxzZSwgLy8gQWRkIHNlbGVjdGVkIHByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdFx0aGlnaGxpZ2h0ZWQgOiBmYWxzZVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHRcdGxpbmtzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRzb3VyY2U6IHRoaXMuY2VudHJhbE5vdGUua2V5LFxuXHRcdFx0XHRcdFx0XHR0YXJnZXQ6IGNvbm5lY3Rpb25JZCxcblx0XHRcdFx0XHRcdFx0dmFsdWU6IGNvbm5lY3Rpb24uc2NvcmUgfHwgMCAgLy8gRW5zdXJlIHNjb3JlIGlzIGRlZmluZWRcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFxuXHRcdFx0XHRcdFx0Y29ubmVjdGlvbnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHNvdXJjZTogdGhpcy5jZW50cmFsTm90ZS5rZXksXG5cdFx0XHRcdFx0XHRcdHRhcmdldDogY29ubmVjdGlvbklkLFxuXHRcdFx0XHRcdFx0XHRzY29yZTogY29ubmVjdGlvbi5zY29yZSB8fCAwICAvLyBFbnN1cmUgc2NvcmUgaXMgZGVmaW5lZFxuXHRcdFx0XHRcdFx0fSk7XG5cdFxuXHRcdFx0XHRcdFx0aWYoKGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi5zY29yZSkgPiB0aGlzLm1heFNjb3JlKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubWF4U2NvcmUgPSBjb25uZWN0aW9uLnNjb3JlO1xuXHRcdFx0XHRcdFx0fVxuXHRcblx0XHRcdFx0XHRcdGlmKChjb25uZWN0aW9uICYmIGNvbm5lY3Rpb24uc2NvcmUpIDwgdGhpcy5taW5TY29yZSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLm1pblNjb3JlID0gY29ubmVjdGlvbi5zY29yZTtcblx0XHRcdFx0XHRcdH1cblx0XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybihgU2tpcHBpbmcgaW52YWxpZCBjb25uZWN0aW9uIGF0IGluZGV4ICR7aW5kZXh9OmAsIGNvbm5lY3Rpb24pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XG5cdFx0XHRcdC8vIFRPRE86OiBSZW1vdmUgZXZlbnR1YWxseSwgYnV0IGtlZXAgZm9yIG5vdyBqdXN0IGluIGNhc2Ugd2Ugd2FudCB0aGlzIGZvciBzb21lIHJlYXNvblxuXHRcdFx0XHQvLyBBZGRpbmcgU21hcnQgQmxvY2tzIGZyb20gdGhlIG5vdGUgaXRzZWxmXG5cdFx0XHRcdC8vIGNvbnN0IHNtYXJ0QmxvY2tzID0gbm90ZS5ibG9ja3M7XG5cdFx0XHRcdC8vIHNtYXJ0QmxvY2tzLmZvckVhY2goKGJsb2NrOiBhbnkpID0+IHtcblx0XHRcdFx0Ly8gXHRpZiAoYmxvY2sua2V5ICYmIGJsb2NrLmtleS50cmltKCkgIT09ICcnICYmICFub2Rlcy5zb21lKG5vZGUgPT4gbm9kZS5pZCA9PT0gYmxvY2sua2V5KSkge1xuXHRcdFx0XHQvLyBcdFx0bm9kZXMucHVzaCh7XG5cdFx0XHRcdC8vIFx0XHRcdGlkOiBibG9jay5rZXksXG5cdFx0XHRcdC8vIFx0XHRcdG5hbWU6IGJsb2NrLmtleSxcblx0XHRcdFx0Ly8gXHRcdFx0Z3JvdXA6ICdibG9jaycsXG5cdFx0XHRcdC8vIFx0XHRcdHg6IE1hdGgucmFuZG9tKCkgKiAxMDAwLFxuXHRcdFx0XHQvLyBcdFx0XHR5OiBNYXRoLnJhbmRvbSgpICogMTAwMCxcblx0XHRcdFx0Ly8gXHRcdFx0Zng6IG51bGwsXG5cdFx0XHRcdC8vIFx0XHRcdGZ5OiBudWxsXG5cdFx0XHRcdC8vIFx0XHR9KTtcblx0XHRcdFx0Ly8gXHR9XG5cdFx0XG5cdFx0XHRcdC8vIFx0bGlua3MucHVzaCh7XG5cdFx0XHRcdC8vIFx0XHRzb3VyY2U6IG5vdGUua2V5LFxuXHRcdFx0XHQvLyBcdFx0dGFyZ2V0OiBibG9jay5rZXksXG5cdFx0XHRcdC8vIFx0XHR2YWx1ZTogMC45NSAgLy8gRW5zdXJlIHNjb3JlIGlzIGRlZmluZWRcblx0XHRcdFx0Ly8gXHR9KTtcblx0XHRcblx0XHRcdFx0Ly8gXHRjb25uZWN0aW9ucy5wdXNoKHtcblx0XHRcdFx0Ly8gXHRcdHNvdXJjZTogbm90ZS5rZXksXG5cdFx0XHRcdC8vIFx0XHR0YXJnZXQ6IGJsb2NrLmtleSxcblx0XHRcdFx0Ly8gXHRcdHNjb3JlOiAwLjk1ICAvLyBFbnN1cmUgc2NvcmUgaXMgZGVmaW5lZFxuXHRcdFx0XHQvLyBcdH0pO1xuXHRcblx0XHRcdFx0Ly8gXHRpZigoY29ubmVjdGlvbiAmJiBjb25uZWN0aW9uLnNjb3JlKSA+IHRoaXMubWF4U2NvcmUpIHtcblx0XHRcdFx0Ly8gXHRcdHRoaXMubWF4U2NvcmUgPSBjb25uZWN0aW9uLnNjb3JlO1xuXHRcdFx0XHQvLyBcdH1cblx0XG5cdFx0XHRcdC8vIH0pO1xuXHRcdFxuXHRcdFx0XHRjb25zb2xlLmxvZygnTm9kZXMgYWZ0ZXIgdXBkYXRlQ29ubmVjdGlvbnM6Jywgbm9kZXMpO1xuXHRcdFx0XHRjb25zb2xlLmxvZygnTGlua3MgYWZ0ZXIgdXBkYXRlQ29ubmVjdGlvbnM6JywgbGlua3MpO1xuXHRcdFx0XHRjb25zb2xlLmxvZygnQ29ubmVjdGlvbnMgYWZ0ZXIgdXBkYXRlQ29ubmVjdGlvbnM6JywgY29ubmVjdGlvbnMpO1xuXHRcdFxuXHRcdFx0XHRjb25zdCBpc1ZhbGlkID0gdmFsaWRhdGVHcmFwaERhdGEobm9kZXMsIGxpbmtzKTtcblx0XHRcdFx0aWYgKCFpc1ZhbGlkKSB7XG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcignR3JhcGggZGF0YSB2YWxpZGF0aW9uIGZhaWxlZC4nKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zb2xlLmxvZygnR3JhcGggZGF0YSB2YWxpZGF0aW9uIHBhc3NlZC4nKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcblx0XHRcdC8vIERlZmluZSB0aGUgZGltZW5zaW9ucyBmb3IgdGhlIFNWR1xuXHRcdFx0Y29uc3Qgd2lkdGggPSB0aGlzLmNvbnRlbnRFbC5jbGllbnRXaWR0aDtcblx0XHRcdGNvbnN0IGhlaWdodCA9IHRoaXMuY29udGVudEVsLmNsaWVudEhlaWdodDtcblx0XHRcblx0XHRcdGNvbnN0IHN2ZyA9IGQzLnNlbGVjdCh0aGlzLmNvbnRlbnRFbClcblx0XHRcdFx0LmFwcGVuZCgnc3ZnJylcblx0XHRcdFx0LmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuXHRcdFx0XHQuYXR0cignaGVpZ2h0JywgJzk4JScpXG5cdFx0XHRcdC5hdHRyKCd2aWV3Qm94JywgYDAgMCAke3dpZHRofSAke2hlaWdodH1gKVxuXHRcdFx0XHQuYXR0cigncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0Jylcblx0XHRcdFx0LmNhbGwoZDMuem9vbSgpXG5cdFx0XHRcdFx0LnNjYWxlRXh0ZW50KFswLjEsIDEwXSlcblx0XHRcdFx0XHQub24oJ3pvb20nLCAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdHN2Z0dyb3VwLmF0dHIoJ3RyYW5zZm9ybScsIGV2ZW50LnRyYW5zZm9ybSk7XG5cdFx0XHRcdFx0XHR1cGRhdGVMYWJlbE9wYWNpdHkoZXZlbnQudHJhbnNmb3JtLmspO1xuXHRcdFx0XHRcdH0pKTtcblx0XHRcdFx0XG5cdFx0XHRjb25zdCBzdmdHcm91cCA9IHN2Zy5hcHBlbmQoJ2cnKTtcblx0XHRcdFxuXHRcdFx0Y29uc3Qgc3RhcnRCb3hTZWxlY3Rpb24gPSAoZXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoIXRoaXMuaXNDdHJsUHJlc3NlZCkgcmV0dXJuO1xuXHRcdFx0XG5cdFx0XHRcdHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG5cdFx0XHRcdGNvbnN0IFt4LCB5XSA9IGQzLnBvaW50ZXIoZXZlbnQpO1xuXHRcdFx0XG5cdFx0XHRcdHRoaXMuc2VsZWN0aW9uQm94ID0gc3ZnLmFwcGVuZCgncmVjdCcpXG5cdFx0XHRcdFx0LmF0dHIoJ2NsYXNzJywgJ3NlbGVjdGlvbi1ib3gnKVxuXHRcdFx0XHRcdC5hdHRyKCd4JywgeClcblx0XHRcdFx0XHQuYXR0cigneScsIHkpXG5cdFx0XHRcdFx0LmF0dHIoJ3dpZHRoJywgMClcblx0XHRcdFx0XHQuYXR0cignaGVpZ2h0JywgMClcblx0XHRcdFx0XHQuYXR0cignc3Ryb2tlJywgJyMwMGYnKVxuXHRcdFx0XHRcdC5hdHRyKCdzdHJva2Utd2lkdGgnLCAxKVxuXHRcdFx0XHRcdC5hdHRyKCdmaWxsJywgJ3JnYmEoMCwgMCwgMjU1LCAwLjMpJyk7IC8vIFNlbWktdHJhbnNwYXJlbnQgZmlsbFxuXHRcdFx0XG5cdFx0XHRcdC8vIFRyYWNrIGV4aXN0aW5nIHNlbGVjdGVkIG5vZGVzXG5cdFx0XHRcdHRoaXMubm9kZVNlbGVjdGlvbi5lYWNoKChkOiBhbnkpID0+IHtcblx0XHRcdFx0XHRkLnRlbXBTZWxlY3RlZCA9IGQuc2VsZWN0ZWQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHRcdFxuXHRcdFx0Y29uc3QgdXBkYXRlQm94U2VsZWN0aW9uID0gKGV2ZW50OiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHJldHVybjtcblx0XHRcdFxuXHRcdFx0XHRjb25zdCBbeCwgeV0gPSBkMy5wb2ludGVyKGV2ZW50KTtcblx0XHRcdFx0Y29uc3Qgc3RhcnRYID0gcGFyc2VGbG9hdCh0aGlzLnNlbGVjdGlvbkJveC5hdHRyKCd4JykpO1xuXHRcdFx0XHRjb25zdCBzdGFydFkgPSBwYXJzZUZsb2F0KHRoaXMuc2VsZWN0aW9uQm94LmF0dHIoJ3knKSk7XG5cdFx0XHRcblx0XHRcdFx0Y29uc3QgbmV3V2lkdGggPSB4IC0gc3RhcnRYO1xuXHRcdFx0XHRjb25zdCBuZXdIZWlnaHQgPSB5IC0gc3RhcnRZO1xuXHRcdFx0XG5cdFx0XHRcdHRoaXMuc2VsZWN0aW9uQm94XG5cdFx0XHRcdFx0LmF0dHIoJ3dpZHRoJywgTWF0aC5hYnMobmV3V2lkdGgpKVxuXHRcdFx0XHRcdC5hdHRyKCdoZWlnaHQnLCBNYXRoLmFicyhuZXdIZWlnaHQpKVxuXHRcdFx0XHRcdC5hdHRyKCd4JywgbmV3V2lkdGggPCAwID8geCA6IHN0YXJ0WClcblx0XHRcdFx0XHQuYXR0cigneScsIG5ld0hlaWdodCA8IDAgPyB5IDogc3RhcnRZKTtcblx0XHRcdFxuXHRcdFx0XHRjb25zdCBlbmRYID0gbmV3V2lkdGggPCAwID8gc3RhcnRYIDogc3RhcnRYICsgbmV3V2lkdGg7XG5cdFx0XHRcdGNvbnN0IGVuZFkgPSBuZXdIZWlnaHQgPCAwID8gc3RhcnRZIDogc3RhcnRZICsgbmV3SGVpZ2h0O1xuXHRcdFx0XG5cdFx0XHRcdGNvbnN0IFtzdGFydFhTVkcsIHN0YXJ0WVNWR10gPSBkMy5wb2ludGVyKGV2ZW50LCBzdmcubm9kZSgpKTtcblx0XHRcdFx0Y29uc3QgW2VuZFhTVkcsIGVuZFlTVkddID0gZDMucG9pbnRlcih7IHg6IGVuZFgsIHk6IGVuZFkgfSwgc3ZnLm5vZGUoKSk7XG5cdFx0XHRcblx0XHRcdFx0dGhpcy5ub2RlU2VsZWN0aW9uLmVhY2goKGQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG5vZGVYID0gZC54O1xuXHRcdFx0XHRcdGNvbnN0IG5vZGVZID0gZC55O1xuXHRcdFx0XHRcdGlmIChub2RlWCA+PSBNYXRoLm1pbihzdGFydFhTVkcsIGVuZFhTVkcpICYmIG5vZGVYIDw9IE1hdGgubWF4KHN0YXJ0WFNWRywgZW5kWFNWRykgJiYgbm9kZVkgPj0gTWF0aC5taW4oc3RhcnRZU1ZHLCBlbmRZU1ZHKSAmJiBub2RlWSA8PSBNYXRoLm1heChzdGFydFlTVkcsIGVuZFlTVkcpKSB7XG5cdFx0XHRcdFx0XHRkLnNlbGVjdGVkID0gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZC5zZWxlY3RlZCA9IGQudGVtcFNlbGVjdGVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcblx0XHRcdFx0dGhpcy51cGRhdGVOb2RlQXBwZWFyYW5jZSgpO1xuXHRcdFx0fTtcblx0XHRcdFxuXHRcdFx0Y29uc3QgZW5kQm94U2VsZWN0aW9uID0gKCkgPT4ge1xuXHRcdFx0XHRpZiAoIXRoaXMuaXNEcmFnZ2luZykgcmV0dXJuO1xuXHRcdFx0XHR0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcblx0XHRcdFxuXHRcdFx0XHR0aGlzLnNlbGVjdGlvbkJveC5yZW1vdmUoKTtcblx0XHRcdFxuXHRcdFx0XHQvLyBDbGVhbiB1cCB0ZW1wb3Jhcnkgc2VsZWN0aW9uIHN0YXRlXG5cdFx0XHRcdHRoaXMubm9kZVNlbGVjdGlvbi5lYWNoKChkOiBhbnkpID0+IHtcblx0XHRcdFx0XHRkZWxldGUgZC50ZW1wU2VsZWN0ZWQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XG5cdFx0XHRcdHRoaXMudXBkYXRlTm9kZUFwcGVhcmFuY2UoKTtcblx0XHRcdH07XG5cdFx0XHRcblx0XHRcdC8vIEF0dGFjaCBtb3VzZSBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIFNWR1xuXHRcdFx0c3ZnLm9uKCdtb3VzZWRvd24nLCAoZXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoIXRoaXMuaXNDdHJsUHJlc3NlZCkge1xuXHRcdFx0XHRcdHRoaXMuY2xlYXJTZWxlY3Rpb25zKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RhcnRCb3hTZWxlY3Rpb24oZXZlbnQpO1xuXHRcdFx0fSkub24oJ21vdXNlbW92ZScsIHVwZGF0ZUJveFNlbGVjdGlvbilcblx0XHRcdCAgLm9uKCdtb3VzZXVwJywgZW5kQm94U2VsZWN0aW9uKVxuXHRcdFx0ICAub24oJ2NsaWNrJywgZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRcdFx0aWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkICYmICF0aGF0LmlzQ3RybFByZXNzZWQpIHtcblx0XHRcdFx0XHR0aGF0LmNsZWFyU2VsZWN0aW9ucygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdFxuXHRcdFx0XG5cdFxuXHRcdFx0Y29uc3QgdXBkYXRlTGFiZWxPcGFjaXR5ID0gKHpvb21MZXZlbDogbnVtYmVyKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG1heE9wYWNpdHkgPSAxOyAvLyBNYXhpbXVtIG9wYWNpdHlcblx0XHRcdFx0Y29uc3QgbWluT3BhY2l0eSA9IDA7IC8vIE1pbmltdW0gb3BhY2l0eVxuXHRcdFx0XHRjb25zdCBtaW5ab29tID0gMC4xOyAvLyBNaW5pbXVtIHpvb20gbGV2ZWwgd2hlcmUgb3BhY2l0eSBpcyAwXG5cdFx0XHRcdGNvbnN0IG1heFpvb20gPSB0aGlzLnRleHRGYWRlVGhyZXNob2xkOyAvLyBVc2UgdGhlIHRleHQgZmFkZSB0aHJlc2hvbGQgdmFsdWVcblx0XHRcdFxuXHRcdFx0XHQvLyBDYWxjdWxhdGUgdGhlIG5ldyBvcGFjaXR5IGJhc2VkIG9uIHRoZSB6b29tIGxldmVsXG5cdFx0XHRcdGxldCBuZXdPcGFjaXR5ID0gKHpvb21MZXZlbCAtIG1pblpvb20pIC8gKG1heFpvb20gLSBtaW5ab29tKTtcblx0XG5cdFx0XHRcdCAgLy8gRW5zdXJlIGxhYmVscyBiZWNvbWUgaW52aXNpYmxlIGF0IGxvd2VyIHpvb20gbGV2ZWxzXG5cdFx0XHRcdGlmICh6b29tTGV2ZWwgPD0gbWluWm9vbSkge1xuXHRcdFx0XHRcdG5ld09wYWNpdHkgPSBtaW5PcGFjaXR5O1xuXHRcdFx0XHR9IGVsc2UgaWYgKHpvb21MZXZlbCA+PSBtYXhab29tKSB7XG5cdFx0XHRcdFx0bmV3T3BhY2l0eSA9IG1heE9wYWNpdHk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ2FsY3VsYXRlIHRoZSBuZXcgb3BhY2l0eSBiYXNlZCBvbiB0aGUgem9vbSBsZXZlbFxuXHRcdFx0XHRcdG5ld09wYWNpdHkgPSAoem9vbUxldmVsIC0gbWluWm9vbSkgLyAobWF4Wm9vbSAtIG1pblpvb20pO1xuXHRcdFx0XHR9XG5cdFxuXHRcdFx0XHQvLyBDbGFtcCB0aGUgb3BhY2l0eSBiZXR3ZWVuIDAgYW5kIDFcblx0XHRcdFx0bmV3T3BhY2l0eSA9IE1hdGgubWF4KG1pbk9wYWNpdHksIE1hdGgubWluKG1heE9wYWNpdHksIG5ld09wYWNpdHkpKTtcblx0XG5cdFx0XHRcdC8vIERlYnVnIHN0YXRlbWVudHNcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coYFpvb20gTGV2ZWw6ICR7em9vbUxldmVsfSwgTmV3IE9wYWNpdHk6ICR7bmV3T3BhY2l0eX0sIEZhZGUgVGhyZXNob2xkOiAke3RoaXMudGV4dEZhZGVUaHJlc2hvbGR9YCk7XG5cdFxuXHRcdFx0XG5cdFx0XHRcdHN2Z0dyb3VwLnNlbGVjdEFsbCgnLmxhYmVsJylcblx0XHRcdFx0XHQudHJhbnNpdGlvbigpXG5cdFx0XHRcdFx0LmR1cmF0aW9uKDMwMClcblx0XHRcdFx0XHQuYXR0cignb3BhY2l0eScsIG5ld09wYWNpdHkpO1xuXHRcdFx0fTtcblx0XHRcdFxuXHRcblx0XHRcdC8vVE9ETzo6IFJlZmFjdG9yIHRoaXNcblx0XHRcdC8vIERlZmluZSBhIGN1c3RvbSBjZW50ZXIgZm9yY2UgdG8gY2VudGVyIHRoZSBtYWluIG5vZGVcblx0XHRcdGNvbnN0IGN1c3RvbUNlbnRlckZvcmNlID0gKGFscGhhOiBudW1iZXIpID0+IHtcblx0XHRcdFx0aWYgKHRoYXQuY2VudHJhbE5vZGUpIHtcblx0XHRcdFx0XHR0aGF0LmNlbnRyYWxOb2RlLnggKz0gKHdpZHRoIC8gMiAtIHRoYXQuY2VudHJhbE5vZGUueCkgKiB0aGlzLmNlbnRlckZvcmNlICogYWxwaGE7XG5cdFx0XHRcdFx0dGhhdC5jZW50cmFsTm9kZS55ICs9IChoZWlnaHQgLyAyIC0gdGhhdC5jZW50cmFsTm9kZS55KSAqIHRoaXMuY2VudGVyRm9yY2UgKiBhbHBoYTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XG5cdFx0XHQvLyBGdW5jdGlvbiB0byBjcmVhdGUgYSBjdXN0b20gY2VudGVyIGZvcmNlIGZvciB0aGUgbWFpbiBub2RlXG5cdFx0XHRjb25zdCBjdXN0b21DZW50ZXJGb3JjZTIgPSAoY2VudGVyWDogbnVtYmVyLCBjZW50ZXJZOiBudW1iZXIpID0+IHtcblx0XHRcdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdFx0XHRub2Rlcy5mb3JFYWNoKChub2RlOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGlmIChub2RlLmlkID09PSB0aGlzLmNlbnRyYWxOb2RlLmlkKSB7XG5cdFx0XHRcdFx0XHRcdG5vZGUueCArPSAoY2VudGVyWCAtIG5vZGUueCkgKiAwLjE7XG5cdFx0XHRcdFx0XHRcdG5vZGUueSArPSAoY2VudGVyWSAtIG5vZGUueSkgKiAwLjE7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXHRcdFx0XG5cdFx0XHQvLyBGdW5jdGlvbiB0byBub3JtYWxpemUgc2lnbmlmaWNhbmNlIHNjb3JlIGFuZCBpbnZlcnNlIGl0IHRvIGhhdmUgbGlua3Mgd2l0aCBoaWdoZXIgc2NvcmVzIGNsb3NlciB0byB0aGUgY2VudHJhbCBub2RlXG5cdFx0XHRmdW5jdGlvbiBpbnZlcnNlTm9ybWFsaXplKHZhbHVlIDogbnVtYmVyKSB7XG5cdFx0XHRcdHJldHVybiAxIC0gKCh2YWx1ZSAtIHRoYXQubWluU2NvcmUpIC8gKHRoYXQubWF4U2NvcmUgLSB0aGF0Lm1pblNjb3JlKSk7XG5cdFx0XHR9XHRcdFxuXHRcblx0XHRcdGNvbnN0IHNpbXVsYXRpb24gPSBkMy5mb3JjZVNpbXVsYXRpb24oKVxuXHRcdFx0LmZvcmNlKCdjZW50ZXInLCBudWxsKSAvLyBSZW1vdmUgdGhlIGRlZmF1bHQgY2VudGVyIGZvcmNlXG5cdFx0XHQuZm9yY2UoJ2NoYXJnZScsIGQzLmZvcmNlTWFueUJvZHkoKS5zdHJlbmd0aCgtREVGQVVMVF9ORVRXT1JLX1NFVFRJTkdTLnJlcGVsRm9yY2UpKSAvLyBOb3RlIHRoZSBuZWdhdGl2ZSB2YWx1ZSBmb3IgcmVwdWxzaW9uXG5cdFx0XHQuZm9yY2UoJ2xpbmsnLCBkMy5mb3JjZUxpbmsoKS5pZCgoZDogYW55KSA9PiBkLmlkKS5kaXN0YW5jZSgoZDogYW55KSA9PiA1MCArIChpbnZlcnNlTm9ybWFsaXplKGQuc2NvcmUpICogMTAwKSkuc3RyZW5ndGgoMSkpXG5cdFx0XHQuZm9yY2UoJ3gnLCBkMy5mb3JjZVgod2lkdGggLyAyKS5zdHJlbmd0aCh0aGlzLmNlbnRlckZvcmNlKSlcblx0XHRcdC5mb3JjZSgneScsIGQzLmZvcmNlWShoZWlnaHQgLyAyKS5zdHJlbmd0aCh0aGlzLmNlbnRlckZvcmNlKSlcblx0XHRcdC5mb3JjZSgnY29sbGlkZScsIGQzLmZvcmNlQ29sbGlkZSgpLnJhZGl1cyhERUZBVUxUX05FVFdPUktfU0VUVElOR1Mubm9kZVNpemUgKyAzKS5zdHJlbmd0aCgwLjcpKSAvLyBBZGp1c3QgcmFkaXVzIGJhc2VkIG9uIG5vZGUgc2l6ZVxuXHRcdFx0LmZvcmNlKCdjdXN0b21DZW50ZXInLCBjdXN0b21DZW50ZXJGb3JjZTIod2lkdGggLyAyLCBoZWlnaHQgLyAyKSkgLy8gQWRkIGN1c3RvbSBjZW50ZXJpbmcgZm9yY2Vcblx0XHRcdC8vIFRPRE86OiBLZWVwIGhlcmUgZm9yIGEgd2hpbGUganVzdCBpbiBjYXNlXG5cdFx0XHQvLyAudmVsb2NpdHlEZWNheSgwLjQpIC8vIEluY3JlYXNlZCBkYW1waW5nIGZhY3RvciBmb3Igc21vb3RoZXIgdHJhbnNpdGlvbnNcblx0XHRcdC8vIC5hbHBoYURlY2F5KDAuMTUpIC8vIEluY3JlYXNlZCBhbHBoYSBkZWNheSBmb3IgZmFzdGVyIGNvb2xpbmcgZG93blxuXHRcdFx0Ly8gLmFscGhhTWluKDAuMDIpIC8vIExvd2VyIG1pbmltdW0gYWxwaGEgdmFsdWUgYmVmb3JlIHN0b3BwaW5nXG5cdFx0XHQvLyAuYWxwaGEoMC4zKSAvLyBJbml0aWFsIGFscGhhIHZhbHVlXG5cdFx0XHQvLyAuYWxwaGFUYXJnZXQoMCk7IC8vIFRhcmdldCBhbHBoYSB2YWx1ZSB0byByZWFjaCB6ZXJvIGFuZCBzdGFiaWxpemVcblx0XHRcblx0XHRcdHVwZGF0ZUNvbm5lY3Rpb25zKCk7XG5cdFx0XG5cdFx0XHRsZXQgbGluayA9IHN2Z0dyb3VwLmFwcGVuZCgnZycpXG5cdFx0XHRcdC5hdHRyKCdjbGFzcycsICdsaW5rcycpXG5cdFx0XHRcdC5zZWxlY3RBbGwoJ2xpbmUnKVxuXHRcdFx0XHQuZGF0YShsaW5rcylcblx0XHRcdFx0LmVudGVyKCkuYXBwZW5kKCdsaW5lJylcblx0XHRcdFx0LmF0dHIoJ3N0cm9rZScsICdibHVlJylcblx0XHRcdFx0LmF0dHIoJ3N0cm9rZS13aWR0aCcsIDIpXG5cdFx0XHRcdC5hdHRyKCdzdHJva2Utb3BhY2l0eScsIDEpO1xuXHRcdFxuXHRcdFx0bGV0IG5vZGUgPSBzdmdHcm91cC5hcHBlbmQoJ2cnKVxuXHRcdFx0XHQuYXR0cignY2xhc3MnLCAnbm9kZXMnKVxuXHRcdFx0XHQuc2VsZWN0QWxsKCdjaXJjbGUnKVxuXHRcdFx0XHQuZGF0YShub2Rlcylcblx0XHRcdFx0LmVudGVyKCkuYXBwZW5kKCdjaXJjbGUnKVxuXHRcdFx0XHQuYXR0cigncicsIDIwKVxuXHRcdFx0XHQuYXR0cignZmlsbCcsICdibHVlJylcblx0XHRcdFx0LmNhbGwoZDMuZHJhZygpXG5cdFx0XHRcdFx0Lm9uKCdzdGFydCcsIChldmVudCwgZDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoIWV2ZW50LmFjdGl2ZSkgc2ltdWxhdGlvbi5hbHBoYVRhcmdldCgwLjMpLnJlc3RhcnQoKTtcblx0XHRcdFx0XHRcdGQuZnggPSBkLng7XG5cdFx0XHRcdFx0XHRkLmZ5ID0gZC55O1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0Lm9uKCdkcmFnJywgKGV2ZW50LCBkOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGQuZnggPSBldmVudC54O1xuXHRcdFx0XHRcdFx0ZC5meSA9IGV2ZW50Lnk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQub24oJ2VuZCcsIChldmVudCwgZDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoIWV2ZW50LmFjdGl2ZSkgc2ltdWxhdGlvbi5hbHBoYVRhcmdldCgwKTtcblx0XHRcdFx0XHR9KSk7XG5cdFx0XG5cdFx0XHRsZXQgbm9kZUxhYmVscyA9IHN2Z0dyb3VwLmFwcGVuZCgnZycpXG5cdFx0XHRcdC5hdHRyKCdjbGFzcycsICdsYWJlbHMnKVxuXHRcdFx0XHQuc2VsZWN0QWxsKCd0ZXh0Jylcblx0XHRcdFx0LmRhdGEobm9kZXMpXG5cdFx0XHRcdC5lbnRlcigpLmFwcGVuZCgndGV4dCcpXG5cdFx0XHRcdC5hdHRyKCdkeCcsIDEyKVxuXHRcdFx0XHQuYXR0cignZHknLCAnLjM1ZW0nKVxuXHRcdFx0XHQudGV4dCgoZDogYW55KSA9PiBkLm5hbWUpO1xuXHRcdFxuXHRcdFx0Y29uc3QgdG9vbHRpcCA9IGQzLnNlbGVjdCh0aGlzLmNvbnRlbnRFbClcblx0XHRcdFx0LmFwcGVuZCgnZGl2Jylcblx0XHRcdFx0LmF0dHIoJ2NsYXNzJywgJ3Rvb2x0aXAnKVxuXHRcdFx0XHQuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcblx0XHRcdFx0LnN0eWxlKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpXG5cdFx0XHRcdC5zdHlsZSgnYmFja2dyb3VuZCcsICcjMzMzJykgLy8gVXBkYXRlZCBiYWNrZ3JvdW5kIGNvbG9yXG5cdFx0XHRcdC5zdHlsZSgnY29sb3InLCAnI2ZmZicpIC8vIFVwZGF0ZWQgdGV4dCBjb2xvclxuXHRcdFx0XHQuc3R5bGUoJ3BhZGRpbmcnLCAnNXB4Jylcblx0XHRcdFx0LnN0eWxlKCdib3JkZXInLCAnMXB4IHNvbGlkICM0NDQnKSAvLyBVcGRhdGVkIGJvcmRlciBjb2xvclxuXHRcdFx0XHQuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCAnNXB4Jyk7XG5cdFxuXHRcdFx0Ly8gQWRkIHRvb2x0aXAgZXZlbnQgbGlzdGVuZXJzIHRvIGxpbmtzXG5cdFx0XHRsaW5rLm9uKCdtb3VzZW92ZXInLCBmdW5jdGlvbihldmVudCwgZCkge1xuXG5cdFx0XHRcdHRvb2x0aXAudGV4dChgU2lnbmlmaWNhbmNlOiAke2Quc2NvcmV0b0ZpeGVkKDMpfWApXG5cdFx0XHQuc3R5bGUoJ3Zpc2liaWxpdHknLCAndmlzaWJsZScpO1xuXHRcdFx0XHRcblx0XHRcdH0pLm9uKCdtb3VzZW1vdmUnLCBmdW5jdGlvbihldmVudCkge1xuXG5cdFx0XHRcdGNvbnN0IFt4LCB5XSA9IGQzLnBvaW50ZXIoZXZlbnQpO1xuXHRcdFx0XHR0b29sdGlwLnN0eWxlKCd0b3AnLCBgJHt5ICsgMTB9cHhgKVxuXHRcdFx0XHRcdC5zdHlsZSgnbGVmdCcsIGAke3ggKyAxMH1weGApO1xuXG5cdFx0XHR9KS5vbignbW91c2VvdXQnLCBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHR0b29sdGlwLnN0eWxlKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xuXG5cdFx0XHR9KTtcblx0XHRcdFxuXHRcdFx0Ly8gVE9ETzo6IFVuY29tbWVudCBiYWNrIGluIHdoZW4gd2FudCB0byBzdGFydCBvbiB0b29sdG9wIGZ1bmNcblx0XHRcdC8vIG5vZGUub24oJ21vdXNlb3ZlcicsIGZ1bmN0aW9uKGV2ZW50LCBkOiBhbnkpIHtcblx0XHRcdC8vIFx0dG9vbHRpcC50ZXh0KGQubmFtZSlcblx0XHRcdC8vIFx0XHQuc3R5bGUoJ3Zpc2liaWxpdHknLCAndmlzaWJsZScpO1xuXHRcdFx0Ly8gfSkub24oJ21vdXNlbW92ZScsIGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0XHQvLyBcdGNvbnN0IFt4LCB5XSA9IGQzLnBvaW50ZXIoZXZlbnQpO1xuXHRcdFx0Ly8gXHR0b29sdGlwLnN0eWxlKCd0b3AnLCBgJHt5ICsgMTB9cHhgKVxuXHRcdFx0Ly8gXHRcdC5zdHlsZSgnbGVmdCcsIGAke3ggKyAxMH1weGApO1xuXHRcdFx0Ly8gfSkub24oJ21vdXNlb3V0JywgZnVuY3Rpb24oKSB7XG5cdFx0XHQvLyBcdHRvb2x0aXAuc3R5bGUoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG5cdFx0XHQvLyB9KTtcblx0XG5cdFx0XHQvLyBGdW5jaXRpb24gdG8gY2VudGVyIHRoZSBuZXR3b3JrIG9uIHVwZGF0ZVxuXHRcdFx0Y29uc3QgY2VudGVyTmV0d29yayA9ICgpID0+IHtcblx0XHRcdFx0c2ltdWxhdGlvblxuXHRcdFx0XHRcdC5mb3JjZSgnY2VudGVyJywgZDMuZm9yY2VDZW50ZXIod2lkdGggLyAyLCBoZWlnaHQgLyAyKSlcblx0XHRcdFx0XHQuYWxwaGEoMC4zKVxuXHRcdFx0XHRcdC5yZXN0YXJ0KCk7XG5cdFx0XHR9O1xuXHRcblx0XHRcdC8vIEhlbHBlciBmdW5jdGlvbiB0byB0cnVuY2F0ZSBsYWJlbHMsIGV4dHJhY3QgZmlsZW5hbWVzIG9yIHBhcnRzIGFmdGVyIGhhc2h0YWdzLCBhbmQgcmVtb3ZlIGJyYWNrZXRzXG5cdFx0XHRjb25zdCBmb3JtYXRMYWJlbCA9IChwYXRoOiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyID0gMTgpID0+IHtcblx0XHRcdFx0aWYgKHBhdGguaW5jbHVkZXMoJyMnKSkge1xuXHRcdFx0XHRcdGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnIycpO1xuXHRcdFx0XHRcdHBhdGggPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTsgLy8gVGFrZSB0aGUgbGFzdCBwYXJ0IGFmdGVyIHNwbGl0dGluZyBieSAnIydcblx0XHRcdFx0XHRjb25zdCBjbGVhbmVkUGF0aCA9IHBhdGgucmVwbGFjZSgvW1xcW1xcXV0vZywgJycpOyAvLyBSZW1vdmUgYnJhY2tldHNcblx0XHRcdFx0XHRyZXR1cm4gY2xlYW5lZFBhdGgubGVuZ3RoID4gbWF4TGVuZ3RoID8gY2xlYW5lZFBhdGguc2xpY2UoMCwgbWF4TGVuZ3RoKSArICcuLi4nIDogY2xlYW5lZFBhdGg7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgZmlsZW5hbWUgPSBwYXRoLnNwbGl0KCcvJykucG9wKCk7XG5cdFx0XHRcdFx0aWYgKGZpbGVuYW1lKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjbGVhbmVkRmlsZW5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKC9bXFxbXFxdXS9nLCAnJyk7IC8vIFJlbW92ZSBicmFja2V0c1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNsZWFuZWRGaWxlbmFtZS5sZW5ndGggPiBtYXhMZW5ndGggPyBjbGVhbmVkRmlsZW5hbWUuc2xpY2UoMCwgbWF4TGVuZ3RoKSArICcuLi4nIDogY2xlYW5lZEZpbGVuYW1lO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fTtcblx0XHRcdFxuXHRcdFx0Ly8gRnVuY3Rpb24gdG8gcmVyZW5kZXIgdmlzdWFsaXphdGlvbiB3aXRoIG1vc3QgdXAgdG8gZGF0ZSBzZXR0aW5nc1xuXHRcdFx0Y29uc3QgdXBkYXRlVmlzdWFsaXphdGlvbiA9IChuZXdTY29yZVRocmVzaG9sZD86IG51bWJlcikgPT4ge1xuXG5cdFx0XHRcdGlmICh0aGlzLnVwZGF0aW5nVmlzdWFsaXphdGlvbikge1xuXHRcdFx0XHRcdGNvbnNvbGUubG9nKCdVcGRhdGUgYWxyZWFkeSBpbiBwcm9ncmVzcy4gU2tpcHBpbmcuLi4nKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmxvZygnVXBkYXRlIG5vdCBpbiBwcm9ncmVzcyAuIFNraXBwaW5nLi4uJyk7XG5cblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zb2xlLmxvZygndXBkYXRpbmcnKTtcblxuXHRcdFx0XHRpZiAobmV3U2NvcmVUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRoaXMuc2lnbmlmaWNhbmNlU2NvcmVUaHJlc2hvbGQgPSBuZXdTY29yZVRocmVzaG9sZDtcblx0XHRcdFx0fVxuXHRcblx0XHRcdFx0dXBkYXRlQ29ubmVjdGlvbnMoKTtcblx0XHRcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ0Nvbm5lY3Rpb25zIGJlZm9yZSBmaWx0ZXJpbmc6JywgY29ubmVjdGlvbnMpO1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJlZENvbm5lY3Rpb25zID0gY29ubmVjdGlvbnMuZmlsdGVyKChjb25uZWN0aW9uOiBhbnkpID0+IGNvbm5lY3Rpb24uc2NvcmUgPj0gdGhpcy5zaWduaWZpY2FuY2VTY29yZVRocmVzaG9sZCk7XG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdGaWx0ZXJlZCBDb25uZWN0aW9uczonLCBmaWx0ZXJlZENvbm5lY3Rpb25zKTtcblx0XHRcblx0XHRcdFx0bGV0IHZpc2libGVOb2RlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdFx0XHRmaWx0ZXJlZENvbm5lY3Rpb25zLmZvckVhY2goKGNvbm5lY3Rpb24pID0+IHtcblx0XHRcdFx0XHR2aXNpYmxlTm9kZXMuYWRkKGNvbm5lY3Rpb24uc291cmNlKTtcblx0XHRcdFx0XHR2aXNpYmxlTm9kZXMuYWRkKGNvbm5lY3Rpb24udGFyZ2V0KTtcblx0XHRcdFx0fSk7XG5cdFx0XG5cdFx0XHRcdGNvbnN0IG5vZGVzRGF0YSA9IEFycmF5LmZyb20odmlzaWJsZU5vZGVzKS5tYXAoaWQgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG5vZGUgPSBub2Rlcy5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gaWQpO1xuXHRcdFx0XHRcdGlmIChub2RlKSB7XG5cdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhgTm9kZSBkYXRhIGZvciBpZCAke2lkfTpgLCBub2RlKTtcblx0XHRcdFx0XHRcdHJldHVybiBub2RlO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oYE5vZGUgZGF0YSBtaXNzaW5nIGZvciBpZCAke2lkfWApO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KS5maWx0ZXIoQm9vbGVhbik7XG5cdFx0XG5cdFx0XHRcdGNvbnNvbGUubG9nKCdWaXNpYmxlIE5vZGVzOicsIG5vZGVzRGF0YSk7XG5cdFx0XG5cdFx0XHRcdHRoaXMudmFsaWRhdGVkTGlua3MgPSBmaWx0ZXJlZENvbm5lY3Rpb25zLmZpbHRlcigobGluaykgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHNvdXJjZU5vZGUgPSBub2Rlc0RhdGEuZmluZChub2RlID0+IG5vZGUuaWQgPT09IGxpbmsuc291cmNlKTtcblx0XHRcdFx0XHRjb25zdCB0YXJnZXROb2RlID0gbm9kZXNEYXRhLmZpbmQobm9kZSA9PiBub2RlLmlkID09PSBsaW5rLnRhcmdldCk7XG5cdFx0XG5cdFx0XHRcdFx0aWYgKCFzb3VyY2VOb2RlIHx8ICF0YXJnZXROb2RlKSB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGBJbnZhbGlkIGxpbmsgZm91bmQ6ICR7bGluay5zb3VyY2V9IC0+ICR7bGluay50YXJnZXR9YCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9KTtcblx0XHRcblx0XHRcdFx0Y29uc29sZS5sb2coJ1ZhbGlkYXRlZCBMaW5rczonLCB0aGlzLnZhbGlkYXRlZExpbmtzKTtcblx0XG5cdFx0XHRcdC8vIFNhZmVndWFyZCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3Bcblx0XHRcdFx0aWYgKG5vZGVzRGF0YS5sZW5ndGggPT09IDAgfHwgdGhpcy52YWxpZGF0ZWRMaW5rcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ05vIG5vZGVzIG9yIGxpbmtzIHRvIGRpc3BsYXkgYWZ0ZXIgZmlsdGVyaW5nLiBBYm9ydGluZyB1cGRhdGUuJyk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XHRcdFxuXHRcdFx0XHRcblx0XHRcdFx0Ly9UT0RPOjogRm9yIG5vdywgc2VwYXJhdGUgY2VudHJhbCBub2RlIGFuZCBvdGhlciBub2RlIHNpemVzIHVudGlsIHdlIGRvIGEgbm9kZSBzaXplIGJ5IGZlYXR1cmVcblx0XHRcdFx0Y29uc3QgbWFpbk5vZGVTaXplID0gdGhpcy5tYXhOb2RlU2l6ZTtcblx0XHRcdFx0Y29uc3Qgb3RoZXJOb2RlU2l6ZSA9IHRoaXMubWluTm9kZVNpemU7XG5cdFxuXHRcdFx0XHQvLyBNb3ZlIGZvcmNlcyB0b3dhcmRzIGNlbnRyYWwgbm9kZVxuXHRcdFx0XHRpZiAodGhpcy5jZW50cmFsTm9kZSkge1xuXHRcdFx0XHRcdHRoaXMuY2VudHJhbE5vZGUuZnggPSB3aWR0aCAvIDI7XG5cdFx0XHRcdFx0dGhpcy5jZW50cmFsTm9kZS5meSA9IGhlaWdodCAvIDI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBFbnN1cmUgbGFzdGluZyBqaXR0ZXJpbmcgb2YgdGhlIG5vZGVzIGRvZXNuJ3QgaGFwcGVuLCBzbyBzdG9wIGFmdGVyIDIgc2Vjb25kc1xuXHRcdFx0XHRjb25zdCB1cGRhdGVGb3JjZXMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0c2ltdWxhdGlvbi5hbHBoYSgwLjMpLnJlc3RhcnQoKTsgLy8gUmVzdGFydCB0aGUgc2ltdWxhdGlvbiB3aXRoIGluaXRpYWwgYWxwaGFcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMudXBkYXRpbmdWaXN1YWxpemF0aW9uID0gZmFsc2U7IC8vIFJlc2V0IHRoZSBmbGFnIGFmdGVyIHN0b3BwaW5nIHNpbXVsYXRpb25cblx0XHRcdFx0XHRcdHNpbXVsYXRpb24uYWxwaGFUYXJnZXQoMCkuc3RvcCgpOyAvLyBTdG9wIHRoZSBzaW11bGF0aW9uIGFmdGVyIDIgc2Vjb25kc1xuXHRcdFx0XHRcdH0sIDIwMDApOyBcblx0XHRcdFx0fTtcblx0XHRcblx0XHRcdFx0dGhpcy5ub2RlU2VsZWN0aW9uID0gc3ZnR3JvdXAuc2VsZWN0KCdnLm5vZGVzJykuc2VsZWN0QWxsKCdjaXJjbGUnKVxuXHRcdFx0XHRcdC5kYXRhKG5vZGVzRGF0YSwgKGQ6IGFueSkgPT4gZC5pZClcblx0XHRcdFx0XHQuam9pbihcblx0XHRcdFx0XHRcdGVudGVyID0+IGVudGVyLmFwcGVuZCgnY2lyY2xlJylcblx0XHRcdFx0XHRcdFx0LmF0dHIoJ2NsYXNzJywgJ25vZGUnKVxuXHRcdFx0XHRcdFx0XHQuYXR0cigncicsIGQgPT4gZC5pZCA9PT0gdGhpcy5jZW50cmFsTm9kZS5pZCA/IHRoaXMubm9kZVNpemUgKyAyIDogdGhpcy5ub2RlU2l6ZSlcblx0XHRcdFx0XHRcdFx0LmF0dHIoJ2ZpbGwnLCBkID0+IGQuc2VsZWN0ZWQgPyAnI2YzZWU1ZCcgOiAoZC5ncm91cCA9PT0gJ25vdGUnID8gJyM3Yzg1OTQnIDogJyM5MjZlYzknKSlcblx0XHRcdFx0XHRcdFx0LmF0dHIoJ3N0cm9rZScsIGQgPT4gZC5zZWxlY3RlZCA/ICcjZmYwJyA6IChkLmdyb3VwID09PSAnbm90ZScgPyAnIzdjODU5NCcgOiAnIzkyNmVjOScpKVxuXHRcdFx0XHRcdFx0XHQuYXR0cignc3Ryb2tlLXdpZHRoJywgZCA9PiBkLnNlbGVjdGVkID8gMiA6IDAuMylcblx0XHRcdFx0XHRcdFx0LmF0dHIoJ29wYWNpdHknLCAxKVxuXHRcdFx0XHRcdFx0XHQuYXR0cignY3Vyc29yJywgJ3BvaW50ZXInKVxuXHRcdFx0XHRcdFx0XHQuY2FsbChkMy5kcmFnKClcblx0XHRcdFx0XHRcdFx0XHQub24oJ3N0YXJ0JywgKGV2ZW50LCBkOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghZXZlbnQuYWN0aXZlKSBzaW11bGF0aW9uLmFscGhhVGFyZ2V0KDAuMykucmVzdGFydCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZC5meCA9IGQueDtcblx0XHRcdFx0XHRcdFx0XHRcdGQuZnkgPSBkLnk7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQub24oJ2RyYWcnLCAoZXZlbnQsIGQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZC5meCA9IGV2ZW50Lng7XG5cdFx0XHRcdFx0XHRcdFx0XHRkLmZ5ID0gZXZlbnQueTtcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC5vbignZW5kJywgKGV2ZW50LCBkOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghZXZlbnQuYWN0aXZlKSBzaW11bGF0aW9uLmFscGhhVGFyZ2V0KDApO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0Lm9uKCdjbGljaycsIGZ1bmN0aW9uKGV2ZW50LCBkOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZygnc2VsZWN0IGNsaWNraW5nJyk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCF0aGF0LmlzQ3RybFByZXNzZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCdzZWxlY3QgY2xlYXInKTtcblx0XHRcdFx0XHRcdFx0XHRcdHRoYXQuY2xlYXJTZWxlY3Rpb25zKCk7XG5cdFx0XHRcdFx0XHRcdFx0fSBcblx0XHRcdFx0XHRcdFx0XHRkLnNlbGVjdGVkID0gIWQuc2VsZWN0ZWQ7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coJ3NlbGVjdGluZzogJywgZC5zZWxlY3RlZClcblx0XHRcdFx0XHRcdFx0XHR0aGF0LnVwZGF0ZU5vZGVBcHBlYXJhbmNlKCk7XG5cdFx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZXZlbnQsIGQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuaXNIb3ZlcmluZyA9IHRydWU7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoIWQuc2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChkLmlkICE9PSB0aGF0LmNlbnRyYWxOb2RlLmlkICYmICFkLmhpZ2hsaWdodGVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGQzLnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKS5hdHRyKCdmaWxsJywgJyNkNDZlYmUnKTsgLy8gQW5pbWF0ZSBmaWxsIGNvbG9yIHRvICNkNDZlYmVcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdHRoYXQuaGlnaGxpZ2h0Tm9kZShkKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdGQzLnNlbGVjdCh0aGlzKS5hdHRyKCdzdHJva2UnLCAnI2ZmZicpOyAvLyBDaGFuZ2Ugc3Ryb2tlIGNvbG9yIHRvIHdoaXRlIG9uIGhvdmVyXG5cdFx0XHRcdFx0XHRcdFx0c3ZnR3JvdXAuc2VsZWN0KGB0ZXh0W2RhdGEtaWQ9JyR7ZC5pZH0nXWApLnRyYW5zaXRpb24oKS5kdXJhdGlvbigyNTApLmF0dHIoJ3knLCBkLnkgKyA0KTsgLy8gQW5pbWF0ZSBsYWJlbCBkb3duIDEwIHBpeGVsc1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0dGhhdC5hcHAud29ya3NwYWNlLnRyaWdnZXIoXCJob3Zlci1saW5rXCIsIHtcblx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50LFxuXHRcdFx0XHRcdFx0XHRcdFx0c291cmNlOiAnRDMnLFxuXHRcdFx0XHRcdFx0XHRcdFx0aG92ZXJQYXJlbnQ6IHRoaXMucGFyZW50RWxlbWVudCxcblx0XHRcdFx0XHRcdFx0XHRcdHRhcmdldEVsOiB0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdFx0bGlua3RleHQ6IGQuaWQsXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0pLm9uKCdtb3VzZW91dCcsIGZ1bmN0aW9uKGV2ZW50LCBkOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGF0LmlzSG92ZXJpbmcgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIWQuc2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChkLmlkICE9PSB0aGF0LmNlbnRyYWxOb2RlLmlkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGQzLnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKS5hdHRyKCdmaWxsJywgZC5ncm91cCA9PT0gJ25vdGUnID8gJyM3Yzg1OTQnIDogJyM5MjZlYzknKTsgLy8gQW5pbWF0ZSBmaWxsIGNvbG9yIGJhY2sgdG8gb3JpZ2luYWxcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0dGhhdC51bmhpZ2hsaWdodE5vZGUoKTtcblx0XHRcdFx0XHRcdFx0XHRkMy5zZWxlY3QodGhpcykuYXR0cignc3Ryb2tlJywgZC5zZWxlY3RlZCA/ICcjZmYwJyA6ICd0cmFuc3BhcmVudCcpOyAvLyBDaGFuZ2Ugc3Ryb2tlIGNvbG9yIGJhY2sgdG8gbGVzcyB2aXNpYmxlIG9uIG1vdXNlIG91dFxuXHRcdFx0XHRcdFx0XHRcdHN2Z0dyb3VwLnNlbGVjdChgdGV4dFtkYXRhLWlkPScke2QuaWR9J11gKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oMjUwKS5hdHRyKCd5JywgZC55KTsgLy8gQW5pbWF0ZSBsYWJlbCBiYWNrIHVwIDEwIHBpeGVsc1xuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdHVwZGF0ZSA9PiB1cGRhdGVcblx0XHRcdFx0XHRcdFx0LmF0dHIoJ3InLCBkID0+IGQuaWQgPT09IHRoaXMuY2VudHJhbE5vZGUuaWQgPyB0aGlzLm5vZGVTaXplICsgMiA6IHRoaXMubm9kZVNpemUpXG5cdFx0XHRcdFx0XHRcdC5hdHRyKCdmaWxsJywgZCA9PiBkLnNlbGVjdGVkID8gJyNmM2VlNWQnIDogKGQuZ3JvdXAgPT09ICdub3RlJyA/ICcjN2M4NTk0JyA6ICcjOTI2ZWM5JykpXG5cdFx0XHRcdFx0XHRcdC5hdHRyKCdzdHJva2UnLCBkID0+IGQuc2VsZWN0ZWQgPyAnI2ZmMCcgOiAoZC5ncm91cCA9PT0gJ25vdGUnID8gJyM3Yzg1OTQnIDogJyM5MjZlYzknKSlcblx0XHRcdFx0XHRcdFx0LmF0dHIoJ3N0cm9rZS13aWR0aCcsIGQgPT4gZC5zZWxlY3RlZCA/IDIgOiAwLjMpLFxuXHRcdFx0XHRcdFx0ZXhpdCA9PiBleGl0LnJlbW92ZSgpXG5cdFx0XHRcdFx0KTtcblxuXG5cdFxuXHRcdFx0XHR0aGlzLmxpbmtTZWxlY3Rpb24gPSBzdmdHcm91cC5zZWxlY3QoJ2cubGlua3MnKS5zZWxlY3RBbGwoJ2xpbmUnKVxuXHRcdFx0XHRcdC5kYXRhKHRoaXMudmFsaWRhdGVkTGlua3MsIChkOiBhbnkpID0+IGAke2Quc291cmNlfS0ke2QudGFyZ2V0fWApXG5cdFx0XHRcdFx0LmpvaW4oXG5cdFx0XHRcdFx0XHRlbnRlciA9PiBlbnRlci5hcHBlbmQoJ2xpbmUnKVxuXHRcdFx0XHRcdFx0XHQuYXR0cignY2xhc3MnLCAnbGluaycpXG5cdFx0XHRcdFx0XHRcdC5hdHRyKCdzdHJva2UnLCAnIzRjNzc4NycpIC8vIEFkanVzdGVkIGNvbG9yIHRvIG1hdGNoIHRoZSBibHVlIGh1ZVxuXHRcdFx0XHRcdFx0XHQuYXR0cignc3Ryb2tlLXdpZHRoJywoZDogYW55KSA9PiBkMy5zY2FsZUxpbmVhcigpXG5cdFx0XHRcdFx0XHRcdC5kb21haW4oW3RoaXMubWluU2NvcmUsIHRoaXMubWF4U2NvcmVdKSAvLyBFbnN1cmUgdGhpcyBkb21haW4gbWF0Y2hlcyB5b3VyIHNjb3JlIHJhbmdlXG5cdFx0XHRcdFx0XHRcdC5yYW5nZShbdGhpcy5taW5MaW5rVGhpY2tuZXNzLCB0aGlzLm1heExpbmtUaGlja25lc3NdKShkLnNjb3JlKSkgLy8gVGhpbm5lciBzdHJva2Ugd2lkdGhcblx0XHRcdFx0XHRcdFx0LmF0dHIoJ3N0cm9rZS1vcGFjaXR5JywgMSlcblx0XHRcdFx0XHRcdFx0LmF0dHIoJ29wYWNpdHknLCAxKVxuXHRcdFx0XHRcdFx0XHQub24oJ21vdXNlb3ZlcicsIGZ1bmN0aW9uKGV2ZW50LCBkIDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgW3gsIHldID0gZDMucG9pbnRlcihldmVudCk7XG5cdFx0XHRcdFx0XHRcdFx0dG9vbHRpcC50ZXh0KGBTaWduZmljYW5jZTogJHtkLnNjb3JlLnRvRml4ZWQoMyl9YClcblx0XHRcdFx0XHRcdFx0XHRcdC5zdHlsZSgndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7XG5cdFx0XHRcdFx0XHRcdH0pLm9uKCdtb3VzZW1vdmUnLCBmdW5jdGlvbihldmVudCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IFt4LCB5XSA9IGQzLnBvaW50ZXIoZXZlbnQpO1xuXHRcdFx0XHRcdFx0XHRcdHRvb2x0aXAuc3R5bGUoJ3RvcCcsIGAke3kgKyAxMH1weGApXG5cdFx0XHRcdFx0XHRcdFx0XHQuc3R5bGUoJ2xlZnQnLCBgJHt4fXB4YCk7XG5cdFx0XHRcdFx0XHRcdH0pLm9uKCdtb3VzZW91dCcsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHRvb2x0aXAuc3R5bGUoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG5cdFx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0dXBkYXRlID0+IHVwZGF0ZVxuXHRcdFx0XHRcdFx0XHQuYXR0cignc3Ryb2tlJywgJyM0Yzc3ODcnKVxuXHRcdFx0XHRcdFx0XHQuYXR0cignc3Ryb2tlLXdpZHRoJywoZDogYW55KSA9PiBkMy5zY2FsZUxpbmVhcigpXG5cdFx0XHRcdFx0XHRcdC5kb21haW4oW3RoaXMubWluU2NvcmUsIHRoaXMubWF4U2NvcmVdKSAvLyBFbnN1cmUgdGhpcyBkb21haW4gbWF0Y2hlcyB5b3VyIHNjb3JlIHJhbmdlXG5cdFx0XHRcdFx0XHRcdC5yYW5nZShbdGhpcy5taW5MaW5rVGhpY2tuZXNzLCB0aGlzLm1heExpbmtUaGlja25lc3NdKShkLnNjb3JlKSlcblx0XHRcdFx0XHRcdFx0Lm9uKCdtb3VzZW92ZXInLCBmdW5jdGlvbihldmVudCwgZCA6IGFueSkge1xuXHRcdFx0XHRcdFx0XHR9KS5vbignbW91c2Vtb3ZlJywgZnVuY3Rpb24oZXZlbnQsIGQgOmFueSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIENhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHRvb2x0aXAgcmVsYXRpdmUgdG8gdGhlIFNWRyBjb29yZGluYXRlIHN5c3RlbVxuXHRcdFx0XHRcdFx0XHR9KS5vbignbW91c2VvdXQnLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR0b29sdGlwLnN0eWxlKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xuXHRcdFx0XHRcdFx0XHR9KSwgLy8gVGhpbm5lciBzdHJva2Ugd2lkdGhcblx0XHRcdFx0XHRcdGV4aXQgPT4gZXhpdC5yZW1vdmUoKVxuXHRcdFx0XHRcdCk7XG5cdFxuXHRcdFx0XHR0aGlzLmxhYmVsU2VsZWN0aW9uID0gc3ZnR3JvdXAuc2VsZWN0KCdnLmxhYmVscycpLnNlbGVjdEFsbCgndGV4dCcpXG5cdFx0XHRcdFx0LmRhdGEobm9kZXNEYXRhLCAoZDogYW55KSA9PiBkLmlkKVxuXHRcdFx0XHRcdC5qb2luKFxuXHRcdFx0XHRcdFx0ZW50ZXIgPT4gZW50ZXIuYXBwZW5kKCd0ZXh0Jylcblx0XHRcdFx0XHRcdFx0LmF0dHIoJ2NsYXNzJywgJ2xhYmVsJylcblx0XHRcdFx0XHRcdFx0LmF0dHIoJ2R4JywgMCkgLy8gQ2VudGVyZWQgaG9yaXpvbnRhbGx5XG5cdFx0XHRcdFx0XHRcdC5hdHRyKCdmb250LXNpemUnLCA0KVxuXHRcdFx0XHRcdFx0XHQuYXR0cignZHknLCAxMikgLy8gUG9zaXRpb25lZCByaWdodCB1bmRlcm5lYXRoXG5cdFx0XHRcdFx0XHRcdC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKSAvLyBDZW50ZXIgYWxpZ24gdGV4dFxuXHRcdFx0XHRcdFx0XHQuYXR0cignZmlsbCcsICcjYmJiJylcblx0XHRcdFx0XHRcdFx0LmF0dHIoJ29wYWNpdHknLCAxKSAvLyBTZXQgaW5pdGlhbCBvcGFjaXR5XG5cdFx0XHRcdFx0XHRcdC50ZXh0KChkOiBhbnkpID0+IGZvcm1hdExhYmVsKGQubmFtZSkpLFxuXHRcdFx0XHRcdFx0dXBkYXRlID0+IHVwZGF0ZVxuXHRcdFx0XHRcdFx0XHQuYXR0cignZHgnLCAwKSAvLyBDZW50ZXJlZCBob3Jpem9udGFsbHlcblx0XHRcdFx0XHRcdFx0LmF0dHIoJ2R5JywgMTIpIC8vIFBvc2l0aW9uZWQgcmlnaHQgdW5kZXJuZWF0aFxuXHRcdFx0XHRcdFx0XHQuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJykgLy8gQ2VudGVyIGFsaWduIHRleHRcblx0XHRcdFx0XHRcdFx0LnRleHQoKGQ6IGFueSkgPT4gZm9ybWF0TGFiZWwoZC5uYW1lKSlcblx0XHRcdFx0XHRcdFx0LmF0dHIoJ2ZpbGwnLCAnI2JiYicpXG5cdFx0XHRcdFx0XHRcdC5hdHRyKCdmb250LXNpemUnLCA0KVxuXHRcdFx0XHRcdFx0XHQuYXR0cignb3BhY2l0eScsIDEpLCAvLyBFbnN1cmUgdXBkYXRlZCBvcGFjaXR5IGlzIDFcblx0XHRcdFx0XHRcdGV4aXQgPT4gZXhpdC5yZW1vdmUoKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQuYXR0cigneCcsIChkOiBhbnkpID0+IGQueClcblx0XHRcdFx0XHQuYXR0cigneScsIChkOiBhbnkpID0+IGQueSk7XG5cdFxuXHRcdFx0XHRzaW11bGF0aW9uLm5vZGVzKG5vZGVzRGF0YSk7XG5cdFx0XHRcdChzaW11bGF0aW9uLmZvcmNlKCdsaW5rJykgYXMgYW55KS5saW5rcyh0aGlzLnZhbGlkYXRlZExpbmtzKTtcblx0XG5cdFx0XHRcdHNpbXVsYXRpb24uYWxwaGEoMC4zKS5hbHBoYVRhcmdldCgwLjA1KS5yZXN0YXJ0KCk7XG5cdFx0XHRcdFxuXHRcblx0XHRcdFx0Y2VudGVyTmV0d29yaygpO1xuXHRcblx0XHRcdFx0dXBkYXRlRm9yY2VzKCk7XG5cdFx0XHRcdFxuXHRcdFx0XHRzaW11bGF0aW9uLm9uKCd0aWNrJywgKCkgPT4ge1xuXHRcblx0XHRcdFx0XHRjdXN0b21DZW50ZXJGb3JjZSgwLjEpXHRcblx0XG5cdFx0XHRcdFx0dGhpcy5ub2RlU2VsZWN0aW9uXG5cdFx0XHRcdFx0XHQuYXR0cignY3gnLCAoZDogYW55KSA9PiBkLngpXG5cdFx0XHRcdFx0XHQuYXR0cignY3knLCAoZDogYW55KSA9PiBkLnkpO1xuXHRcblx0XHRcdFx0XHR0aGlzLmxpbmtTZWxlY3Rpb25cblx0XHRcdFx0XHRcdC5hdHRyKCd4MScsIChkOiBhbnkpID0+IGQuc291cmNlLngpXG5cdFx0XHRcdFx0XHQuYXR0cigneTEnLCAoZDogYW55KSA9PiBkLnNvdXJjZS55KVxuXHRcdFx0XHRcdFx0LmF0dHIoJ3gyJywgKGQ6IGFueSkgPT4gZC50YXJnZXQueClcblx0XHRcdFx0XHRcdC5hdHRyKCd5MicsIChkOiBhbnkpID0+IGQudGFyZ2V0LnkpO1xuXHRcblx0XHRcdFx0XHRzdmdHcm91cC5zZWxlY3QoJ2cubGFiZWxzJykuc2VsZWN0QWxsKCd0ZXh0Jylcblx0XHRcdFx0XHRcdC5kYXRhKG5vZGVzRGF0YSwgKGQ6IGFueSkgPT4gZC5pZClcblx0XHRcdFx0XHRcdC5qb2luKFxuXHRcdFx0XHRcdFx0XHRlbnRlciA9PiBlbnRlci5hcHBlbmQoJ3RleHQnKVxuXHRcdFx0XHRcdFx0XHRcdC5hdHRyKCdjbGFzcycsICdsYWJlbCcpXG5cdFx0XHRcdFx0XHRcdFx0LmF0dHIoJ2R4JywgMTIpXG5cdFx0XHRcdFx0XHRcdFx0LmF0dHIoJ2R5JywgJy4zNWVtJylcblx0XHRcdFx0XHRcdFx0XHQuYXR0cignZmlsbCcsICcjYmJiJylcblx0XHRcdFx0XHRcdFx0XHQuYXR0cignZGF0YS1pZCcsIGQgPT4gZC5pZCkgLy8gQWRkIGRhdGEtaWQgYXR0cmlidXRlIGZvciBlYXNpZXIgc2VsZWN0aW9uXG5cdFx0XHRcdFx0XHRcdFx0LnRleHQoKGQ6IGFueSkgPT4gZm9ybWF0TGFiZWwoZC5uYW1lKSksXG5cdFx0XHRcdFx0XHRcdHVwZGF0ZSA9PiB1cGRhdGVcblx0XHRcdFx0XHRcdFx0XHQudGV4dCgoZDogYW55KSA9PiBmb3JtYXRMYWJlbChkLm5hbWUpKVxuXHRcdFx0XHRcdFx0XHRcdC5hdHRyKCdmaWxsJywgJyNiYmInKVxuXHRcdFx0XHRcdFx0XHRcdC5hdHRyKCdkYXRhLWlkJywgZCA9PiBkLmlkKSwgLy8gQWRkIGRhdGEtaWQgYXR0cmlidXRlIGZvciBlYXNpZXIgc2VsZWN0aW9uXG5cdFx0XHRcdFx0XHRcdGV4aXQgPT4gZXhpdC5yZW1vdmUoKVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LmF0dHIoJ3gnLCAoZDogYW55KSA9PiBkLngpXG5cdFx0XHRcdFx0XHQuYXR0cigneScsIChkOiBhbnkpID0+IGQueSk7IC8vIFBvc2l0aW9uIGxhYmVsIGJlbG93IHRoZSBub2RlXG5cdFxuXHRcdFx0XHRcdFx0Ly8gVXBkYXRlIGxhYmVsIG9wYWNpdHkgYmFzZWQgb24gaW5pdGlhbCB6b29tIGxldmVsXG5cdFx0XHRcdFx0XHR1cGRhdGVMYWJlbE9wYWNpdHkoZDMuem9vbVRyYW5zZm9ybShzdmcubm9kZSgpIGFzIEVsZW1lbnQpLmspO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLnVwZGF0aW5nVmlzdWFsaXphdGlvbiA9IHRydWU7IC8vIFNldCB0aGUgZmxhZyB0byB0cnVlXG5cdFxuXHRcdFx0XG5cdFx0XHR9O1xuXHRcblx0XG5cdFx0XHRpZiAoIXRoaXMuc2V0dGluZ3NJbnN0YW50aWF0ZWQpIHtcblx0XG5cdFx0XHRcdC8vIEVuc3VyZSB0aGF0IHRoZSBzZXR0aW5ncyBtZW51IGFuZCBpdHMgZWxlbWVudHMgYXJlIG9ubHkgY3JlYXRlZCBvbmNlXG5cdFx0XHRcdGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2V0dGluZ3MtaWNvbicpKSB7XG5cdFx0XHRcdFx0Y29uc29sZS5sb2coXCJzY29yZSBzZXR0aW5ncyBleGlzdFwiKTtcblx0XHRcdFx0XHQvLyBJZiBzZXR0aW5ncyBtZW51IGlzIGFscmVhZHkgc2V0IHVwLCBza2lwIHNldHVwXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnNvbGUubG9nKFwic2NvcmUgZG9lc250XCIpXG5cdFx0XHRcdH1cblx0XG5cdFx0XHRcdC8vIENyZWF0ZSB0aGUgc2V0dGluZ3MgaWNvblxuXHRcdFx0XHRjb25zdCBzZXR0aW5nc0ljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdFx0c2V0dGluZ3NJY29uLmlubmVySFRNTCA9ICcmIzk4ODE7JzsgLy8gVW5pY29kZSBmb3IgZ2VhciBpY29uXG5cdFx0XHRcdHNldHRpbmdzSWNvbi5jbGFzc0xpc3QuYWRkKCdzZXR0aW5ncy1pY29uJyk7XG5cdFx0XHRcdHRoaXMuY29udGVudEVsLmFwcGVuZENoaWxkKHNldHRpbmdzSWNvbik7XG5cdFxuXHRcdFx0XHQvLyBTVkcgaWNvbiBmb3IgZHJvcGRvd24gYXJyb3dcblx0XHRcdFx0Y29uc3QgZHJvcGRvd25BcnJvdyA9IGBcblx0XHRcdFx0PHN2ZyBjbGFzcz1cImRyb3Bkb3duLWluZGljYXRvclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxuXHRcdFx0XHRcdDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEuNjQ2IDQuNjQ2YS41LjUgMCAwIDEgLjcwOCAwTDggMTAuMjkzbDUuNjQ2LTUuNjQ3YS41LjUgMCAwIDEgLjcwOC43MDhsLTYgNmEuNS41IDAgMCAxLS43MDggMGwtNi02YS41LjUgMCAwIDEgMC0uNzA4elwiLz5cblx0XHRcdFx0PC9zdmc+YDtcblx0XG5cdFx0XHRcdGNvbnN0IHJpZ2h0QXJyb3cgPSBgXG5cdFx0XHRcdDxzdmcgY2xhc3M9XCJkcm9wZG93bi1pbmRpY2F0b3JcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cblx0XHRcdFx0PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNC42NDYgMS42NDZhLjUuNSAwIDAgMSAuNzA4IDBsNiA2YS41LjUgMCAwIDEgMCAuNzA4bC02IDZhLjUuNSAwIDAgMS0uNzA4LS43MDhMMTAuMjkzIDggNC42NDYgMi4zNTRhLjUuNSAwIDAgMSAwLS43MDh6XCIvPlxuXHRcdFx0XHQ8L3N2Zz5gO1xuXHRcblx0XHRcdFx0Ly8gQ3JlYXRlIHRoZSBkcm9wZG93biBtZW51XG5cdFx0XHRcdGNvbnN0IGRyb3Bkb3duTWVudSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0XHRkcm9wZG93bk1lbnUuY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tbWVudScpO1xuXHRcdFx0XHRkcm9wZG93bk1lbnUuaW5uZXJIVE1MID0gYFxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtZW51LWhlYWRlclwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImljb25cIiBpZD1cInJlZnJlc2gtaWNvblwiPiYjODYzNTs8L2Rpdj4gPCEtLSBVbmljb2RlIGZvciByZWZyZXNoIGljb24gLS0+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaWNvblwiIGlkPVwiY2xvc2UtaWNvblwiPiYjMTAwMDU7PC9kaXY+IDwhLS0gVW5pY29kZSBmb3IgWCAoY2xvc2UpIGljb24gLS0+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFjY29yZGlvbi1pdGVtXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlclwiPlxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImFycm93LWljb25cIj4ke3JpZ2h0QXJyb3d9PC9zcGFuPkZpbHRlcnNcblx0XHRcdFx0XHRcdDwvZGl2Plx0XHRcdFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFjY29yZGlvbi1jb250ZW50XCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzbGlkZXItY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGlkPVwic2NvcmVUaHJlc2hvbGRMYWJlbFwiIGZvcj1cInNjb3JlVGhyZXNob2xkXCI+U2lnbmZpY2FuY2UgVGhyZXNob2xkOiAke3RoaXMuc2lnbmlmaWNhbmNlU2NvcmVUaHJlc2hvbGR9PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInJhbmdlXCIgaWQ9XCJzY29yZVRocmVzaG9sZFwiIGNsYXNzPVwic2xpZGVyXCIgbmFtZT1cInNjb3JlVGhyZXNob2xkXCIgbWluPVwiMFwiIG1heD1cIjAuOTlcIiB2YWx1ZT1cIiR7dGhpcy5zaWduaWZpY2FuY2VTY29yZVRocmVzaG9sZH1cIiBzdGVwPVwiMC4wMVwiPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVwic2V0dGluZ3MtaXRlbS1jb250ZW50LWxhYmVsXCI+Q29ubmVjdGlvbiBUeXBlOjwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJyYWRpby1jb250YWluZXJcIj5cblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImNvbm5lY3Rpb25UeXBlXCIgdmFsdWU9XCJibG9ja1wiICR7dGhpcy5jb25uZWN0aW9uVHlwZSA9PT0gJ2Jsb2NrJyA/ICdjaGVja2VkJyA6ICcnfT4gQmxvY2tcblx0XHRcdFx0XHRcdFx0XHQ8L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdDxsYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiY29ubmVjdGlvblR5cGVcIiB2YWx1ZT1cIm5vdGVcIiAke3RoaXMuY29ubmVjdGlvblR5cGUgPT09ICdub3RlJyA/ICdjaGVja2VkJyA6ICcnfT4gTm90ZVxuXHRcdFx0XHRcdFx0XHRcdDwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PCEtLVxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taXRlbVwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIj5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJhcnJvdy1pY29uXCI+JHtyaWdodEFycm93fTwvc3Bhbj5Hcm91cHNcblx0XHRcdFx0XHRcdDwvZGl2Plx0XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cblx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZ3JvdXAxXCIgbmFtZT1cImdyb3VwMVwiIGNoZWNrZWQ+XG5cdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCJncm91cDFcIj5Hcm91cCAxPC9sYWJlbD48YnI+XG5cdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImdyb3VwMlwiIG5hbWU9XCJncm91cDJcIiBjaGVja2VkPlxuXHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiZ3JvdXAyXCI+R3JvdXAgMjwvbGFiZWw+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj4gXG5cdFx0XHRcdFx0LS0hPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taXRlbVwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIj5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJhcnJvdy1pY29uXCI+JHtyaWdodEFycm93fTwvc3Bhbj5EaXNwbGF5XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cdFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFjY29yZGlvbi1jb250ZW50XCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzbGlkZXItY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGlkPVwiZmFkZVRocmVzaG9sZExhYmVsXCIgZm9yPVwiZmFkZVRocmVzaG9sZFwiPiBUZXh0IEZhZGUgVGhyZXNob2xkOiAke3RoaXMudGV4dEZhZGVUaHJlc2hvbGR9PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInJhbmdlXCIgaWQ9XCJmYWRlVGhyZXNob2xkXCIgY2xhc3M9XCJzbGlkZXJcIiBuYW1lPVwiZmFkZVRocmVzaG9sZFwiIG1pbj1cIjAuMVwiIG1heD1cIjEwXCIgdmFsdWU9XCIxLjJcIiBzdGVwPVwiMC4wMVwiPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInNsaWRlci1jb250YWluZXJcIj5cblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgaWQ9XCJub2RlU2l6ZUxhYmVsXCIgZm9yPVwibm9kZVNpemVcIj5Ob2RlIFNpemU6ICR7dGhpcy5ub2RlU2l6ZX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBpZD1cIm5vZGVTaXplXCIgY2xhc3M9XCJzbGlkZXJcIiBuYW1lPVwibm9kZVNpemVcIiBtaW49XCIxXCIgbWF4PVwiMTVcIiB2YWx1ZT1cIiR7dGhpcy5ub2RlU2l6ZX1cIiBzdGVwPVwiMC4wMVwiPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInNsaWRlci1jb250YWluZXJcIj5cblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgaWQ9XCJtaW5MaW5rVGhpY2tuZXNzTGFiZWxcIiBmb3I9XCJtaW5MaW5rVGhpY2tuZXNzXCI+TWluIExpbmsgVGhpY2tuZXNzOiAke3RoaXMubWluTGlua1RoaWNrbmVzc308L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBpZD1cIm1pbkxpbmtUaGlja25lc3NcIiBjbGFzcz1cInNsaWRlclwiIG5hbWU9XCJtaW5MaW5rVGhpY2tuZXNzXCIgbWluPVwiMC4xXCIgbWF4PVwiMTBcIiB2YWx1ZT1cIiR7dGhpcy5taW5MaW5rVGhpY2tuZXNzfVwiIHN0ZXA9XCIwLjAxXCI+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic2xpZGVyLWNvbnRhaW5lclwiPlxuXHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBpZD1cIm1heExpbmtUaGlja25lc3NMYWJlbFwiIGZvcj1cIm1heExpbmtUaGlja25lc3NcIj5NYXggTGluayBUaGlja25lc3M6ICR7dGhpcy5tYXhMaW5rVGhpY2tuZXNzfTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJyYW5nZVwiIGlkPVwibWF4TGlua1RoaWNrbmVzc1wiIGNsYXNzPVwic2xpZGVyXCIgbmFtZT1cIm1heExpbmtUaGlja25lc3NcIiBtaW49XCIwLjFcIiBtYXg9XCIxMFwiIHZhbHVlPVwiJHt0aGlzLm1heExpbmtUaGlja25lc3N9XCIgc3RlcD1cIjAuMDFcIj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDwhLS0gPGRpdiBjbGFzcz1cInNsaWRlci1jb250YWluZXJcIj5cblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgaWQ9XCJsaW5lVGhpY2tuZXNzTGFiZWxcIiBmb3I9XCJsaW5lVGhpY2tuZXNzXCI+TGluZSBUaGlja25lc3M6ICR7dGhpcy5saW5rVGhpY2tuZXNzfTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJyYW5nZVwiIGlkPVwibGluZVRoaWNrbmVzc1wiIGNsYXNzPVwic2xpZGVyXCIgbmFtZT1cImxpbmVUaGlja25lc3NcIiAgbWluPVwiMC4xXCIgbWF4PVwiNVwiIHZhbHVlPVwiJHt0aGlzLmxpbmtUaGlja25lc3N9XCIgc3RlcD1cIjAuMDFcIj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+IC0tIT5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taXRlbVwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIj5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJhcnJvdy1pY29uXCI+JHtyaWdodEFycm93fTwvc3Bhbj5Gb3JjZXNcblx0XHRcdFx0XHRcdDwvZGl2Plx0XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInNsaWRlci1jb250YWluZXJcIj5cblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiY2VudGVyRm9yY2VcIiBpZD1cImNlbnRlckZvcmNlTGFiZWxcIj5DZW50ZXIgRm9yY2U6ICR7dGhpcy5jZW50ZXJGb3JjZX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBpZD1cImNlbnRlckZvcmNlXCIgbmFtZT1cImNlbnRlckZvcmNlXCIgY2xhc3M9XCJzbGlkZXJcIiBtaW49XCIwXCIgbWF4PVwiMVwiIHZhbHVlPVwiJHt0aGlzLmNlbnRlckZvcmNlfVwiIHN0ZXA9XCIwLjAxXCI+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic2xpZGVyLWNvbnRhaW5lclwiPlxuXHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCJyZXBlbEZvcmNlXCIgaWQ9XCJyZXBlbEZvcmNlTGFiZWxcIj5SZXBlbCBGb3JjZTogICR7dGhpcy5yZXBlbEZvcmNlfTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJyYW5nZVwiIGlkPVwicmVwZWxGb3JjZVwiIG5hbWU9XCJyZXBlbEZvcmNlXCIgY2xhc3M9XCJzbGlkZXJcIiBtaW49XCIwXCIgbWF4PVwiMTUwMFwiIHZhbHVlPVwiJHt0aGlzLnJlcGVsRm9yY2V9XCIgc3RlcD1cIjFcIj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzbGlkZXItY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cImxpbmtGb3JjZVwiIGlkPVwibGlua0ZvcmNlTGFiZWxcIj5MaW5rIEZvcmNlOiAgJHt0aGlzLmxpbmtGb3JjZX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBpZD1cImxpbmtGb3JjZVwiIG5hbWU9XCJsaW5rRm9yY2VcIiBjbGFzcz1cInNsaWRlclwiIG1pbj1cIjBcIiBtYXg9XCIxXCIgdmFsdWU9XCIgJHt0aGlzLmxpbmtGb3JjZX1cIiBzdGVwPVwiMC4wMVwiPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwibGlua0Rpc3RhbmNlXCIgaWQ9XCJsaW5rRGlzdGFuY2VMYWJlbFwiPkxpbmsgRGlzdGFuY2U6ICAke3RoaXMubGlua0Rpc3RhbmNlfTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJyYW5nZVwiIGlkPVwibGlua0Rpc3RhbmNlXCIgbmFtZT1cImxpbmtEaXN0YW5jZVwiIGNsYXNzPVwic2xpZGVyXCIgbWluPVwiMTBcIiBtYXg9XCIyMDBcIiB2YWx1ZT1cIiR7dGhpcy5saW5rRGlzdGFuY2V9XCIgc3RlcD1cIjFcIj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRgO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdHRoaXMuY29udGVudEVsLmFwcGVuZENoaWxkKGRyb3Bkb3duTWVudSk7XG5cdFxuXHRcdFx0XHQvLyBUb2dnbGUgZHJvcGRvd24gbWVudSB2aXNpYmlsaXR5IG9uIHNldHRpbmdzIGljb24gY2xpY2tcblx0XHRcdFx0c2V0dGluZ3NJY29uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXHRcdFx0XHRcdGRyb3Bkb3duTWVudS5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7XG5cdFx0XHRcdH0pO1xuXHRcblx0XHRcdFx0Ly8gVG9nZ2xlIGFjY29yZGlvbiBjb250ZW50IHZpc2liaWxpdHkgYW5kIGFycm93IGljb24gb24gaGVhZGVyIGNsaWNrXG5cdFx0XHRcdGNvbnN0IGFjY29yZGlvbkhlYWRlcnMgPSBkcm9wZG93bk1lbnUucXVlcnlTZWxlY3RvckFsbCgnLmFjY29yZGlvbi1oZWFkZXInKTtcblx0XHRcdFx0YWNjb3JkaW9uSGVhZGVycy5mb3JFYWNoKGhlYWRlciA9PiB7XG5cdFx0XHRcdFx0aGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgY29udGVudCA9IGhlYWRlci5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdFx0XHRjb25zdCBhcnJvd0ljb24gPSBoZWFkZXIucXVlcnlTZWxlY3RvcignLmFycm93LWljb24nKTtcblx0XG5cdFx0XHRcdFx0XHRpZiAoY29udGVudCAmJiBhcnJvd0ljb24pIHsgLy8gQWRkIG51bGwgY2hlY2sgZm9yIGFycm93SWNvblxuXHRcdFx0XHRcdFx0XHRjb250ZW50LmNsYXNzTGlzdC50b2dnbGUoJ3Nob3cnKTtcblx0XHRcdFx0XHRcdFx0aWYgKGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcblx0XHRcdFx0XHRcdFx0XHRhcnJvd0ljb24uaW5uZXJIVE1MID0gZHJvcGRvd25BcnJvdztcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRhcnJvd0ljb24uaW5uZXJIVE1MID0gcmlnaHRBcnJvdztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XG5cdFx0XHRcdC8vIE5vdyBxdWVyeSB0aGUgRE9NIGZvciB0aGUgc2xpZGVyIGFuZCBsYWJlbFxuXHRcdFx0XHRjb25zdCBzY29yZVRocmVzaG9sZFNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY29yZVRocmVzaG9sZCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cdFx0XHRcdGNvbnN0IHNjb3JlVGhyZXNob2xkTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2NvcmVUaHJlc2hvbGRMYWJlbCcpO1xuXHRcdFx0XHRjb25zdCBub2RlU2l6ZVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub2RlU2l6ZScpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cdFx0XHRcdGNvbnN0IG5vZGVTaXplTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm9kZVNpemVMYWJlbCcpO1xuXHRcdFx0XHRjb25zdCBsaW5lVGhpY2tuZXNzU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpbmVUaGlja25lc3MnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXHRcdFx0XHRjb25zdCBsaW5lVGhpY2tuZXNzTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGluZVRoaWNrbmVzc0xhYmVsJyk7XG5cdFx0XHRcdGNvbnN0IGNlbnRlckZvcmNlU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NlbnRlckZvcmNlJykgYXMgSFRNTElucHV0RWxlbWVudDtcblx0XHRcdFx0Y29uc3QgY2VudGVyRm9yY2VMYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZW50ZXJGb3JjZUxhYmVsJyk7XG5cdFx0XHRcdGNvbnN0IHJlcGVsRm9yY2VTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVwZWxGb3JjZScpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cdFx0XHRcdGNvbnN0IHJlcGVsRm9yY2VMYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXBlbEZvcmNlTGFiZWwnKTtcblx0XHRcdFx0Y29uc3QgbGlua0ZvcmNlU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpbmtGb3JjZScpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cdFx0XHRcdGNvbnN0IGxpbmtGb3JjZUxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpbmtGb3JjZUxhYmVsJyk7XG5cdFx0XHRcdGNvbnN0IGxpbmtEaXN0YW5jZVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaW5rRGlzdGFuY2UnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXHRcdFx0XHRjb25zdCBsaW5rRGlzdGFuY2VMYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaW5rRGlzdGFuY2VMYWJlbCcpO1xuXHRcdFx0XHRjb25zdCBmYWRlVGhyZXNob2xkU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZhZGVUaHJlc2hvbGQnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXHRcdFx0XHRjb25zdCBmYWRlVGhyZXNob2xkTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmFkZVRocmVzaG9sZExhYmVsJyk7XG5cdFx0XHRcdGNvbnN0IG1pbkxpbmtUaGlja25lc3NTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWluTGlua1RoaWNrbmVzcycpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cdFx0XHRcdGNvbnN0IG1pbkxpbmtUaGlja25lc3NMYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtaW5MaW5rVGhpY2tuZXNzTGFiZWwnKTtcblx0XHRcdFx0Y29uc3QgbWF4TGlua1RoaWNrbmVzc1NsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXhMaW5rVGhpY2tuZXNzJykgYXMgSFRNTElucHV0RWxlbWVudDtcblx0XHRcdFx0Y29uc3QgbWF4TGlua1RoaWNrbmVzc0xhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21heExpbmtUaGlja25lc3NMYWJlbCcpO1xuXHRcdFx0XHRjb25zdCBjb25uZWN0aW9uVHlwZVJhZGlvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9XCJjb25uZWN0aW9uVHlwZVwiXScpO1xuXG5cdFx0XHRcdC8vIEV2ZW50IGxpc3RlbmVyIGZvciBDb25uZWN0aW9uIFR5cGUgUmFkaW9zIHNsaWRlclxuXHRcdFx0XHRpZiAoY29ubmVjdGlvblR5cGVSYWRpb3MpIHtcblx0XHRcdFx0XHRjb25uZWN0aW9uVHlwZVJhZGlvcy5mb3JFYWNoKHJhZGlvID0+IHtcblx0XHRcdFx0XHRcdHJhZGlvLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmNvbm5lY3Rpb25UeXBlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcblx0XHRcdFx0XHRcdFx0dXBkYXRlVmlzdWFsaXphdGlvbigpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cdFxuXG5cdFx0XHRcdC8vIEV2ZW50IGxpc3RlbmVyIGZvciBNaW4gTGluayBUaGlja25lc3Mgc2xpZGVyXG5cdFx0XHRcdGlmIChtaW5MaW5rVGhpY2tuZXNzU2xpZGVyKSB7XG5cdFx0XHRcdFx0bWluTGlua1RoaWNrbmVzc1NsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgbmV3TWluTGlua1RoaWNrbmVzcyA9IHBhcnNlRmxvYXQoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XG5cdFx0XHRcdFx0XHRpZiAobWluTGlua1RoaWNrbmVzc0xhYmVsKSB7XG5cdFx0XHRcdFx0XHRcdG1pbkxpbmtUaGlja25lc3NMYWJlbC50ZXh0Q29udGVudCA9IGBNaW4gTGluayBUaGlja25lc3M6ICR7bmV3TWluTGlua1RoaWNrbmVzc31gO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5taW5MaW5rVGhpY2tuZXNzID0gbmV3TWluTGlua1RoaWNrbmVzcztcblx0XHRcdFx0XHRcdHVwZGF0ZUxpbmtUaGlja25lc3MoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcblx0XHRcdFx0Ly8gRXZlbnQgbGlzdGVuZXIgZm9yIE1heCBMaW5rIFRoaWNrbmVzcyBzbGlkZXJcblx0XHRcdFx0aWYgKG1heExpbmtUaGlja25lc3NTbGlkZXIpIHtcblx0XHRcdFx0XHRtYXhMaW5rVGhpY2tuZXNzU2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXdNYXhMaW5rVGhpY2tuZXNzID0gcGFyc2VGbG9hdCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKTtcblx0XHRcdFx0XHRcdGlmIChtYXhMaW5rVGhpY2tuZXNzTGFiZWwpIHtcblx0XHRcdFx0XHRcdFx0bWF4TGlua1RoaWNrbmVzc0xhYmVsLnRleHRDb250ZW50ID0gYE1heCBMaW5rIFRoaWNrbmVzczogJHtuZXdNYXhMaW5rVGhpY2tuZXNzfWA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLm1heExpbmtUaGlja25lc3MgPSBuZXdNYXhMaW5rVGhpY2tuZXNzO1xuXHRcdFx0XHRcdFx0dXBkYXRlTGlua1RoaWNrbmVzcygpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFxuXHRcdFx0XHQvLyBFdmVudCBsaXN0ZW5lciBmb3IgVGV4dCBGYWRlIFRocmVzaG9sZCBzbGlkZXJcblx0XHRcdFx0aWYgKGZhZGVUaHJlc2hvbGRTbGlkZXIpIHtcblx0XHRcdFx0XHRmYWRlVGhyZXNob2xkU2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXdGYWRlVGhyZXNob2xkID0gcGFyc2VGbG9hdCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKTtcblx0XHRcdFx0XHRcdGlmIChmYWRlVGhyZXNob2xkTGFiZWwpIHtcblx0XHRcdFx0XHRcdFx0ZmFkZVRocmVzaG9sZExhYmVsLnRleHRDb250ZW50ID0gYEZhZGUgVGhyZXNob2xkOiAke25ld0ZhZGVUaHJlc2hvbGR9YDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMudGV4dEZhZGVUaHJlc2hvbGQgPSBuZXdGYWRlVGhyZXNob2xkO1xuXHRcdFx0XHRcdFx0Ly8gVXBkYXRlIHRoZSBsYWJlbCBvcGFjaXR5IGltbWVkaWF0ZWx5IHRvIHJlZmxlY3QgdGhlIG5ldyB0aHJlc2hvbGRcblx0XHRcdFx0XHRcdHVwZGF0ZUxhYmVsT3BhY2l0eShkMy56b29tVHJhbnNmb3JtKHN2Zy5ub2RlKCkgYXMgRWxlbWVudCkuayk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XG5cdFx0XHRcdC8vIEV2ZW50IGxpc3RlbmVyIGZvciBDZW50ZXIgRm9yY2Ugc2xpZGVyXG5cdFx0XHRcdGlmIChjZW50ZXJGb3JjZVNsaWRlcikge1xuXHRcdFx0XHRcdGNlbnRlckZvcmNlU2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXdDZW50ZXJGb3JjZSA9IHBhcnNlRmxvYXQoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XG5cdFx0XHRcdFx0XHRpZiAoY2VudGVyRm9yY2VMYWJlbCkge1xuXHRcdFx0XHRcdFx0XHRjZW50ZXJGb3JjZUxhYmVsLnRleHRDb250ZW50ID0gYENlbnRlciBGb3JjZTogJHtuZXdDZW50ZXJGb3JjZX1gO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dXBkYXRlQ2VudGVyRm9yY2UobmV3Q2VudGVyRm9yY2UpO1xuXHRcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRcblx0XHRcdFx0Ly8gRXZlbnQgbGlzdGVuZXIgZm9yIFJlcGVsIEZvcmNlIHNsaWRlclxuXHRcdFx0XHRpZiAocmVwZWxGb3JjZVNsaWRlcikge1xuXHRcdFx0XHRcdHJlcGVsRm9yY2VTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG5ld1JlcGVsRm9yY2UgPSBwYXJzZUZsb2F0KChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpO1xuXHRcdFx0XHRcdFx0aWYgKHJlcGVsRm9yY2VMYWJlbCkge1xuXHRcdFx0XHRcdFx0XHRyZXBlbEZvcmNlTGFiZWwudGV4dENvbnRlbnQgPSBgUmVwZWwgRm9yY2U6ICR7bmV3UmVwZWxGb3JjZX1gO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dXBkYXRlUmVwZWxGb3JjZShuZXdSZXBlbEZvcmNlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRcblx0XHRcdFx0Ly8gRXZlbnQgbGlzdGVuZXIgZm9yIExpbmsgRm9yY2Ugc2xpZGVyXG5cdFx0XHRcdGlmIChsaW5rRm9yY2VTbGlkZXIpIHtcblx0XHRcdFx0XHRsaW5rRm9yY2VTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG5ld0xpbmtGb3JjZSA9IHBhcnNlRmxvYXQoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XG5cdFx0XHRcdFx0XHRpZiAobGlua0ZvcmNlTGFiZWwpIHtcblx0XHRcdFx0XHRcdFx0bGlua0ZvcmNlTGFiZWwudGV4dENvbnRlbnQgPSBgTGluayBGb3JjZTogJHtuZXdMaW5rRm9yY2V9YDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHVwZGF0ZUxpbmtGb3JjZShuZXdMaW5rRm9yY2UpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFxuXHRcdFx0XHQvLyBFdmVudCBsaXN0ZW5lciBmb3IgTGluayBEaXN0YW5jZSBzbGlkZXJcblx0XHRcdFx0aWYgKGxpbmtEaXN0YW5jZVNsaWRlcikge1xuXHRcdFx0XHRcdGxpbmtEaXN0YW5jZVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgbmV3TGlua0Rpc3RhbmNlID0gcGFyc2VGbG9hdCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKTtcblx0XHRcdFx0XHRcdGlmIChsaW5rRGlzdGFuY2VMYWJlbCkge1xuXHRcdFx0XHRcdFx0XHRsaW5rRGlzdGFuY2VMYWJlbC50ZXh0Q29udGVudCA9IGBMaW5rIERpc3RhbmNlOiAke25ld0xpbmtEaXN0YW5jZX1gO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dXBkYXRlTGlua0Rpc3RhbmNlKG5ld0xpbmtEaXN0YW5jZSk7XG5cdFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFxuXHRcdFx0XHQvLyBGdW5jdGlvbiB0byB1cGRhdGUgY2VudGVyIGZvcmNlIGJhc2VkIG9uIHRoZSBzbGlkZXIgdmFsdWVcblx0XHRcdFx0Y29uc3QgdXBkYXRlQ2VudGVyRm9yY2UgPSAobmV3Q2VudGVyRm9yY2U6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdHNpbXVsYXRpb24uZm9yY2UoJ2NlbnRlcicsIG51bGwpOyAvLyBSZW1vdmUgdGhlIGV4aXN0aW5nIGNlbnRlciBmb3JjZVxuXHRcdFx0XHRcdHNpbXVsYXRpb24uZm9yY2UoJ2NlbnRlcicsIGQzLmZvcmNlQ2VudGVyKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMikuc3RyZW5ndGgobmV3Q2VudGVyRm9yY2UpKTsgLy8gQWRkIHRoZSBuZXcgY2VudGVyIGZvcmNlXG5cdFx0XHRcdFx0c2ltdWxhdGlvbi5hbHBoYVRhcmdldCgwLjMpLnJlc3RhcnQoKTtcblx0XHRcdFx0XHR1cGRhdGVGb3JjZXMoKTtcblx0XG5cdFx0XHRcdH07XG5cdFx0XHRcdFxuXHRcdFx0XHQvLyBGdW5jdGlvbiB0byB1cGRhdGUgcmVwZWwgZm9yY2UgYmFzZWQgb24gdGhlIHNsaWRlciB2YWx1ZVxuXHRcdFx0XHRjb25zdCB1cGRhdGVSZXBlbEZvcmNlID0gKG5ld1JlcGVsRm9yY2U6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdChzaW11bGF0aW9uLmZvcmNlKCdjaGFyZ2UnKSBhcyBhbnkpLnN0cmVuZ3RoKC1uZXdSZXBlbEZvcmNlKTtcblx0XHRcdFx0XHRzaW11bGF0aW9uLmFscGhhVGFyZ2V0KDAuMykucmVzdGFydCgpO1xuXHRcdFx0XHRcdHVwZGF0ZUZvcmNlcygpO1xuXHRcblx0XHRcdFx0fTtcblx0XG5cdFx0XHRcdGNvbnN0IHVwZGF0ZUxpbmtUaGlja25lc3MgPSAoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgbGlua1N0cm9rZVNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuXHRcdFx0XHRcdFx0LmRvbWFpbihbdGhpcy5taW5TY29yZSwgdGhpcy5tYXhTY29yZV0pIC8vIFVwZGF0ZSB0aGlzIHRvIG1hdGNoIHlvdXIgc2NvcmUgcmFuZ2Vcblx0XHRcdFx0XHRcdC5yYW5nZShbdGhpcy5taW5MaW5rVGhpY2tuZXNzLCB0aGlzLm1heExpbmtUaGlja25lc3NdKTtcblx0XHRcdFx0XG5cdFx0XHRcdFx0dGhpcy5saW5rU2VsZWN0aW9uLmF0dHIoJ3N0cm9rZS13aWR0aCcsIChkOiBhbnkpID0+IGxpbmtTdHJva2VTY2FsZShkLnNjb3JlKSk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdFxuXHRcblx0XHRcdFx0Ly8gRnVuY3Rpb24gdG8gdXBkYXRlIGxpbmsgZm9yY2UgYmFzZWQgb24gdGhlIHNsaWRlciB2YWx1ZVxuXHRcdFx0XHRjb25zdCB1cGRhdGVMaW5rRm9yY2UgPSAobmV3TGlua0ZvcmNlOiBudW1iZXIpID0+IHtcblx0XHRcdFx0XHRzaW11bGF0aW9uLmZvcmNlKCdsaW5rJywgbnVsbCk7IC8vIFJlbW92ZSB0aGUgZXhpc3RpbmcgbGluayBmb3JjZVxuXHRcdFx0XHRcdHNpbXVsYXRpb24uZm9yY2UoJ2xpbmsnLCBkMy5mb3JjZUxpbmsodGhpcy52YWxpZGF0ZWRMaW5rcykuaWQoKGQ6IGFueSkgPT4gZC5pZCkuc3RyZW5ndGgobmV3TGlua0ZvcmNlKS5kaXN0YW5jZSh0aGlzLmxpbmtEaXN0YW5jZSkpOyAvLyBBZGQgdGhlIG5ldyBsaW5rIGZvcmNlXG5cdFx0XHRcdFx0c2ltdWxhdGlvbi5hbHBoYVRhcmdldCgwLjMpLnJlc3RhcnQoKTsgLy8gU21vb3RobHkgYWRqdXN0IHdpdGhvdXQgYSBmdWxsIHJlc3RhcnRcblx0XHRcdFx0XHR1cGRhdGVGb3JjZXMoKTtcblx0XG5cdFx0XHRcdH07XG5cdFx0XHRcdFxuXHRcdFx0XHQvLyBGdW5jdGlvbiB0byB1cGRhdGUgbGluayBkaXN0YW5jZSBiYXNlZCBvbiB0aGUgc2xpZGVyIHZhbHVlXG5cdFx0XHRcdGNvbnN0IHVwZGF0ZUxpbmtEaXN0YW5jZSA9IChuZXdMaW5rRGlzdGFuY2U6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdHNpbXVsYXRpb24uZm9yY2UoJ2xpbmsnLCBudWxsKTsgLy8gUmVtb3ZlIHRoZSBleGlzdGluZyBsaW5rIGZvcmNlXG5cdFx0XHRcdFx0c2ltdWxhdGlvbi5mb3JjZSgnbGluaycsIGQzLmZvcmNlTGluayh0aGlzLnZhbGlkYXRlZExpbmtzKS5pZCgoZDogYW55KSA9PiBkLmlkKS5kaXN0YW5jZShuZXdMaW5rRGlzdGFuY2UpLnN0cmVuZ3RoKHRoaXMubGlua0ZvcmNlKSk7IC8vIEFkZCB0aGUgbmV3IGxpbmsgZm9yY2Ugd2l0aCB0aGUgY3VycmVudCBkaXN0YW5jZVxuXHRcdFx0XHRcdHNpbXVsYXRpb24uYWxwaGFUYXJnZXQoMC4zKS5yZXN0YXJ0KCk7IC8vIFNtb290aGx5IGFkanVzdCB3aXRob3V0IGEgZnVsbCByZXN0YXJ0XG5cdFx0XHRcdFx0dXBkYXRlRm9yY2VzKCk7XG5cdFxuXHRcdFx0XHR9O1xuXHRcblx0XHRcdFx0Ly8gRnVuY3Rpb24gdG8gZW5zdXJlIG5ldHdvcmsgc3RvcHMgaW4gY2FzZSBub2RlcyBnZXQgaml0dGVyeVxuXHRcdFx0XHRjb25zdCB1cGRhdGVGb3JjZXMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0c2ltdWxhdGlvbi5hbHBoYSgwLjMpLnJlc3RhcnQoKTsgLy8gUmVzdGFydCB0aGUgc2ltdWxhdGlvbiB3aXRoIGluaXRpYWwgYWxwaGFcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdHNpbXVsYXRpb24uYWxwaGFUYXJnZXQoMCkuc3RvcCgpOyAvLyBTdG9wIHRoZSBzaW11bGF0aW9uIGFmdGVyIDUgc2Vjb25kc1xuXHRcdFx0XHRcdH0sIDIwMDApOyBcblx0XHRcdFx0fTtcblx0XHRcdFx0XG5cdFx0XHRcdC8vIEZ1bmN0aW9uIHRvIHVwZGF0ZSBub2RlIHNpemVzIGJhc2VkIG9uIHRoZSBzbGlkZXIgdmFsdWVcblx0XHRcdFx0Y29uc3QgdXBkYXRlTm9kZVNpemVzID0gKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMubm9kZVNlbGVjdGlvbi5hdHRyKCdyJywgKGQ6IGFueSkgPT4gZC5pZCA9PT0gdGhpcy5jZW50cmFsTm9kZS5pZCA/IHRoaXMubm9kZVNpemUgKyAzIDogdGhpcy5ub2RlU2l6ZSk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdFxuXHRcdFx0XHQvLyBGdW5jdGlvbiB0byBkZWJvdW5jZSBjYWxscyB0byB1cGRhdGVWaXN1YWxpemF0aW9uXG5cdFx0XHRcdGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmM6IEZ1bmN0aW9uLCB3YWl0OiBudW1iZXIpIHtcblx0XHRcdFx0XHRsZXQgdGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbiguLi5hcmdzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHRcdFx0XHRcdFx0dGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGZ1bmMuYXBwbHkodGhpcywgYXJncyksIHdhaXQpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XG5cdFxuXHRcdFx0XHQvLyBFdmVudCBsaXN0ZW5lciBmb3IgU2NvcmUgVGhyZXNob2xkIHNsaWRlclxuXHRcdFx0XHRpZiAoc2NvcmVUaHJlc2hvbGRTbGlkZXIgICYmICF0aGlzLnNldHRpbmdzSW5zdGFudGlhdGVkKSB7XG5cdFx0XHRcdFx0Ly8gSW1tZWRpYXRlIHVwZGF0ZSBvZiBsYWJlbCB0ZXh0XG5cdFx0XHRcdFx0c2NvcmVUaHJlc2hvbGRTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG5ld1Njb3JlVGhyZXNob2xkID0gcGFyc2VGbG9hdCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKTtcblx0XHRcdFx0XHRcdGlmIChzY29yZVRocmVzaG9sZExhYmVsKSB7XG5cdFx0XHRcdFx0XHRcdHNjb3JlVGhyZXNob2xkTGFiZWwudGV4dENvbnRlbnQgPSBgU2lnbmlmaWNhbmNlIFRocmVzaG9sZDogJHtuZXdTY29yZVRocmVzaG9sZH1gO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcblx0XHRcdFx0XHQvLyBEZWJvdW5jZWQgdXBkYXRlVmlzdWFsaXphdGlvbiBmdW5jdGlvblxuXHRcdFx0XHRcdGNvbnN0IGRlYm91bmNlZFVwZGF0ZVZpc3VhbGl6YXRpb24gPSBkZWJvdW5jZSgoZXZlbnQ6IEV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXdTY29yZVRocmVzaG9sZCA9IHBhcnNlRmxvYXQoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XG5cdFx0XHRcdFx0XHR1cGRhdGVWaXN1YWxpemF0aW9uKG5ld1Njb3JlVGhyZXNob2xkKTtcblx0XHRcdFx0XHR9LCA1MDApOyAvLyBBZGp1c3QgdGhlIGRlbGF5ICg1MDBtcykgYXMgbmVlZGVkXG5cdFxuXHRcdFx0XHRcdHNjb3JlVGhyZXNob2xkU2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZGVib3VuY2VkVXBkYXRlVmlzdWFsaXphdGlvbik7XG5cdFxuXHRcdFx0XHRcdHRoaXMuc2V0dGluZ3NJbnN0YW50aWF0ZWQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFxuXHRcdFx0XHQvLyBFdmVudCBsaXN0ZW5lciBmb3IgTm9kZSBTaXplIHNsaWRlclxuXHRcdFx0XHRpZiAobm9kZVNpemVTbGlkZXIpIHtcblx0XHRcdFx0XHRub2RlU2l6ZVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgbmV3Tm9kZVNpemUgPSBwYXJzZUZsb2F0KChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpO1xuXHRcdFx0XHRcdFx0aWYgKG5vZGVTaXplTGFiZWwpIHtcblx0XHRcdFx0XHRcdFx0bm9kZVNpemVMYWJlbC50ZXh0Q29udGVudCA9IGBOb2RlIFNpemU6ICR7bmV3Tm9kZVNpemV9YDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMubm9kZVNpemUgPSBuZXdOb2RlU2l6ZTtcblx0XHRcdFx0XHRcdHVwZGF0ZU5vZGVTaXplcygpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFxuXHRcdFx0XHQvLyBFdmVudCBsaXN0ZW5lciBmb3IgTGluayBUaGlja25lc3Mgc2xpZGVyXG5cdFx0XHRcdGlmIChsaW5lVGhpY2tuZXNzU2xpZGVyKSB7XG5cdFx0XHRcdFx0bGluZVRoaWNrbmVzc1NsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc29sZS5sb2coJ2xpbmUgdGhpY2tpbmcnKTtcblx0XHRcdFx0XHRcdGNvbnN0IG5ld0xpbmVUaGlja25lc3MgPSBwYXJzZUZsb2F0KChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpO1xuXHRcdFx0XHRcdFx0dGhpcy5saW5rVGhpY2tuZXNzID0gbmV3TGluZVRoaWNrbmVzcztcblx0XHRcdFx0XHRcdGlmIChsaW5lVGhpY2tuZXNzTGFiZWwpIHtcblx0XHRcdFx0XHRcdFx0bGluZVRoaWNrbmVzc0xhYmVsLnRleHRDb250ZW50ID0gYExpbmUgVGhpY2tuZXNzOiAke25ld0xpbmVUaGlja25lc3N9YDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHVwZGF0ZUxpbmtUaGlja25lc3MoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcblx0XHRcdFx0Ly8gQ2xvc2UgZHJvcGRvd24gbWVudSBvbiBYIGljb24gY2xpY2tcblx0XHRcdFx0Y29uc3QgY2xvc2VJY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb3NlLWljb24nKTtcblx0XHRcdFx0aWYgKGNsb3NlSWNvbikge1xuXHRcdFx0XHRcdGNsb3NlSWNvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCdDbG9zZSBpY29uIENMSUNLRUQnKTtcblx0XG5cdFx0XHRcdFx0XHRkcm9wZG93bk1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFxuXHRcdFx0XHQvLyBSZWZyZXNoIGZ1bmN0aW9uYWxpdHkgZm9yIHJlZnJlc2ggaWNvbiBjbGljayAob3B0aW9uYWwsIGltcGxlbWVudCBhcyBuZWVkZWQpXG5cdFx0XHRcdGNvbnN0IHJlZnJlc2hJY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZnJlc2gtaWNvbicpO1xuXHRcdFx0XHRpZiAocmVmcmVzaEljb24pIHtcblx0XHRcdFx0XHRyZWZyZXNoSWNvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCdSZWZyZXNoIGljb24gY2xpY2tlZCcpO1xuXHRcdFx0XHRcdFx0cmVzZXRUb0RlZmF1bHQoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIExpc3RlbiBmb3IgY29udHJvbCBrZXkgcHJlc3Ncblx0XHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuXHRcdFx0XHRcdGlmIChldmVudC5rZXkgPT09ICdDb250cm9sJykge1xuXHRcdFx0XHRcdFx0dGhpcy5pc0N0cmxQcmVzc2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHN2Zy5zdHlsZSgnY3Vyc29yJywgJ2Nyb3NzaGFpcicpO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0XG5cdFx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0aWYgKGV2ZW50LmtleSA9PT0gJ0NvbnRyb2wnKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmlzQ3RybFByZXNzZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdHN2Zy5zdHlsZSgnY3Vyc29yJywgJ2RlZmF1bHQnKTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdFxuXHRcblx0XHRcdFx0Ly8gRnVuY3Rpb24gdG8gcmVzZXQgYWxsIHZhcmlhYmxlcyB0byBkZWZhdWx0IHVzaW5nIHRoZSBnbG9iYWwgZGVmYXVsdCBjb25zdGFudFxuXHRcdFx0XHRjb25zdCByZXNldFRvRGVmYXVsdCA9ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLnNpZ25pZmljYW5jZVNjb3JlVGhyZXNob2xkID0gREVGQVVMVF9ORVRXT1JLX1NFVFRJTkdTLnNjb3JlVGhyZXNob2xkO1xuXHRcdFx0XHRcdHRoaXMubm9kZVNpemUgPSBERUZBVUxUX05FVFdPUktfU0VUVElOR1Mubm9kZVNpemU7XG5cdFx0XHRcdFx0dGhpcy5saW5rVGhpY2tuZXNzID0gREVGQVVMVF9ORVRXT1JLX1NFVFRJTkdTLmxpbmtUaGlja25lc3M7XG5cdFx0XHRcdFx0dGhpcy5yZXBlbEZvcmNlID0gREVGQVVMVF9ORVRXT1JLX1NFVFRJTkdTLnJlcGVsRm9yY2U7XG5cdFx0XHRcdFx0dGhpcy5saW5rRm9yY2UgPSBERUZBVUxUX05FVFdPUktfU0VUVElOR1MubGlua0ZvcmNlO1xuXHRcdFx0XHRcdHRoaXMubGlua0Rpc3RhbmNlID0gREVGQVVMVF9ORVRXT1JLX1NFVFRJTkdTLmxpbmtEaXN0YW5jZTtcblx0XHRcdFx0XHR0aGlzLmNlbnRlckZvcmNlID0gREVGQVVMVF9ORVRXT1JLX1NFVFRJTkdTLmNlbnRlckZvcmNlO1xuXHRcblx0XHRcdFx0XHQvLyBVcGRhdGUgc2xpZGVyIHZhbHVlc1xuXHRcdFx0XHRcdGlmIChzY29yZVRocmVzaG9sZFNsaWRlcikgc2NvcmVUaHJlc2hvbGRTbGlkZXIudmFsdWUgPSBgJHt0aGlzLnNpZ25pZmljYW5jZVNjb3JlVGhyZXNob2xkfWA7XG5cdFx0XHRcdFx0aWYgKHNjb3JlVGhyZXNob2xkTGFiZWwpIHNjb3JlVGhyZXNob2xkTGFiZWwudGV4dENvbnRlbnQgPSBgU2lnbmlmaWNhbmNlIFRocmVzaG9sZDogJHt0aGlzLnNpZ25pZmljYW5jZVNjb3JlVGhyZXNob2xkfWA7XG5cdFx0XHRcdFx0aWYgKG5vZGVTaXplU2xpZGVyKSBub2RlU2l6ZVNsaWRlci52YWx1ZSA9IGAke3RoaXMubm9kZVNpemV9YDtcblx0XHRcdFx0XHRpZiAobm9kZVNpemVMYWJlbCkgbm9kZVNpemVMYWJlbC50ZXh0Q29udGVudCA9IGBOb2RlIFNpemU6ICR7dGhpcy5ub2RlU2l6ZX1gO1xuXHRcdFx0XHRcdGlmIChsaW5lVGhpY2tuZXNzU2xpZGVyKSBsaW5lVGhpY2tuZXNzU2xpZGVyLnZhbHVlID0gYCR7dGhpcy5saW5rVGhpY2tuZXNzfWA7XG5cdFx0XHRcdFx0aWYgKGxpbmVUaGlja25lc3NMYWJlbCkgbGluZVRoaWNrbmVzc0xhYmVsLnRleHRDb250ZW50ID0gYExpbmUgVGhpY2tuZXNzOiAke3RoaXMubGlua1RoaWNrbmVzc31gO1xuXHRcdFx0XHRcdGlmIChjZW50ZXJGb3JjZVNsaWRlcikgY2VudGVyRm9yY2VTbGlkZXIudmFsdWUgPSBgJHt0aGlzLmNlbnRlckZvcmNlfWA7XG5cdFx0XHRcdFx0aWYgKGNlbnRlckZvcmNlTGFiZWwpIGNlbnRlckZvcmNlTGFiZWwudGV4dENvbnRlbnQgPSBgQ2VudGVyIEZvcmNlOiAke3RoaXMuY2VudGVyRm9yY2V9YDtcblx0XHRcdFx0XHRpZiAocmVwZWxGb3JjZVNsaWRlcikgcmVwZWxGb3JjZVNsaWRlci52YWx1ZSA9IGAke3RoaXMucmVwZWxGb3JjZX1gO1xuXHRcdFx0XHRcdGlmIChyZXBlbEZvcmNlTGFiZWwpIHJlcGVsRm9yY2VMYWJlbC50ZXh0Q29udGVudCA9IGBSZXBlbCBGb3JjZTogJHt0aGlzLnJlcGVsRm9yY2V9YDtcblx0XHRcdFx0XHRpZiAobGlua0ZvcmNlU2xpZGVyKSBsaW5rRm9yY2VTbGlkZXIudmFsdWUgPSBgJHt0aGlzLmxpbmtGb3JjZX1gO1xuXHRcdFx0XHRcdGlmIChsaW5rRm9yY2VMYWJlbCkgbGlua0ZvcmNlTGFiZWwudGV4dENvbnRlbnQgPSBgTGluayBGb3JjZTogJHt0aGlzLmxpbmtGb3JjZX1gO1xuXHRcdFx0XHRcdGlmIChsaW5rRGlzdGFuY2VTbGlkZXIpIGxpbmtEaXN0YW5jZVNsaWRlci52YWx1ZSA9IGAke3RoaXMubGlua0Rpc3RhbmNlfWA7XG5cdFx0XHRcdFx0aWYgKGxpbmtEaXN0YW5jZUxhYmVsKSBsaW5rRGlzdGFuY2VMYWJlbC50ZXh0Q29udGVudCA9IGBMaW5rIERpc3RhbmNlOiAke3RoaXMubGlua0Rpc3RhbmNlfWA7XG5cdFx0XHRcdFx0aWYgKGZhZGVUaHJlc2hvbGRTbGlkZXIpIGZhZGVUaHJlc2hvbGRTbGlkZXIudmFsdWUgPSBgJHt0aGlzLnRleHRGYWRlVGhyZXNob2xkfWA7XG5cdFx0XHRcdFx0aWYgKGZhZGVUaHJlc2hvbGRMYWJlbCkgZmFkZVRocmVzaG9sZExhYmVsLnRleHRDb250ZW50ID0gYEZhZGUgVGhyZXNob2xkOiAke3RoaXMudGV4dEZhZGVUaHJlc2hvbGR9YDtcblx0XHRcdFx0XHRpZiAobWluTGlua1RoaWNrbmVzc1NsaWRlcikgbWluTGlua1RoaWNrbmVzc1NsaWRlci52YWx1ZSA9IGAke3RoaXMubWluTGlua1RoaWNrbmVzc31gO1xuXHRcdFx0XHRcdGlmIChtaW5MaW5rVGhpY2tuZXNzTGFiZWwpIG1pbkxpbmtUaGlja25lc3NMYWJlbC50ZXh0Q29udGVudCA9IGBNaW4gTGluayBUaGlja25lc3M6ICR7dGhpcy5taW5MaW5rVGhpY2tuZXNzfWA7XG5cdFx0XHRcdFx0aWYgKG1heExpbmtUaGlja25lc3NTbGlkZXIpIG1heExpbmtUaGlja25lc3NTbGlkZXIudmFsdWUgPSBgJHt0aGlzLm1heExpbmtUaGlja25lc3N9YDtcblx0XHRcdFx0XHRpZiAobWF4TGlua1RoaWNrbmVzc0xhYmVsKSBtYXhMaW5rVGhpY2tuZXNzTGFiZWwudGV4dENvbnRlbnQgPSBgTWF4IExpbmsgVGhpY2tuZXNzOiAke3RoaXMubWF4TGlua1RoaWNrbmVzc31gO1xuXG5cdFx0XHRcdFx0Ly8gUmVhcHBseSBzZXR0aW5nc1xuXHRcdFx0XHRcdHVwZGF0ZU5vZGVTaXplcygpO1xuXHRcdFx0XHRcdHVwZGF0ZUxpbmtUaGlja25lc3MoKTtcblx0XG5cdFx0XHRcdFx0Ly8gVXBkYXRlIHRoZSBzaW11bGF0aW9uIGZvcmNlc1xuXHRcdFx0XHRcdHNpbXVsYXRpb25cblx0XHRcdFx0XHRcdC5mb3JjZSgnY2VudGVyJywgZDMuZm9yY2VDZW50ZXIod2lkdGggLyAyLCBoZWlnaHQgLyAyKS5zdHJlbmd0aCh0aGlzLmNlbnRlckZvcmNlKSlcblx0XHRcdFx0XHRcdC5mb3JjZSgnY2hhcmdlJywgZDMuZm9yY2VNYW55Qm9keSgpLnN0cmVuZ3RoKC10aGlzLnJlcGVsRm9yY2UpKVxuXHRcdFx0XHRcdFx0LmZvcmNlKCdsaW5rJywgZDMuZm9yY2VMaW5rKCkuaWQoKGQ6IGFueSkgPT4gZC5pZCkuc3RyZW5ndGgodGhpcy5saW5rRm9yY2UpLmRpc3RhbmNlKHRoaXMubGlua0Rpc3RhbmNlKSk7XG5cdFxuXHRcdFx0XHRcdC8vIFJlc3RhcnQgdGhlIHNpbXVsYXRpb24gd2l0aCB0aGUgbmV3IHNldHRpbmdzXG5cdFx0XHRcdFx0c2ltdWxhdGlvbi5hbHBoYSgwLjMpLmFscGhhVGFyZ2V0KDApLnJlc3RhcnQoKTtcblx0XHRcdFx0XHR1cGRhdGVWaXN1YWxpemF0aW9uKHRoaXMuc2lnbmlmaWNhbmNlU2NvcmVUaHJlc2hvbGQpO1xuXHRcdFx0XHR9O1xuXHRcblx0XG5cdFx0XHR0aGlzLnNldHRpbmdzSW5zdGFudGlhdGVkID0gdHJ1ZTtcblx0XG5cdFx0fVxuXHRcblx0XHRcdC8vIFdhdGNoIGZvciBjaGFuZ2VzIGluIHRoZSBjdXJyZW50bHkgdmlld2VkIG5vdGVcblx0XHRcdHRoaXMuYXBwLndvcmtzcGFjZS5vbignZmlsZS1vcGVuJywgKGZpbGUpID0+IHtcblx0XHRcdFx0aWYgKGZpbGUgJiYgKHRoaXMuY3VycmVudE5vdGVLZXkgIT09IGZpbGUucGF0aCkgJiYgIXRoaXMuaXNIb3ZlcmluZykge1xuXHRcdFx0XHRcdC8vIGlmICghdGhpcy51cGRhdGluZ1Zpc3VhbGl6YXRpb24pIHtcblx0XHRcdFx0XHRcdHRoaXMuY3VycmVudE5vdGVLZXkgPSBmaWxlLnBhdGg7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmxvZygnQ3VycmVudCBOb3RlIEtleTonLCB0aGlzLmN1cnJlbnROb3RlS2V5KTtcblx0XHRcdFx0XHRcdHVwZGF0ZVZpc3VhbGl6YXRpb24oKTtcblx0XHRcdFx0XHQvLyB9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFxuXHRcdFx0Ly8gSW5pdGlhbCBjYWxsIHRvIGNyZWF0ZSB0aGUgdmlzdWFsaXphdGlvblxuXHRcdFx0dXBkYXRlVmlzdWFsaXphdGlvbigpO1xuXHRcblx0XHR9LCAxMDAwKTtcblxuXHR9XG5cbn1cblxuLypcblx0TWFpbiBDb2xvcnNcblx0TWVudSB0ZXh0OiAjYTNhZWNiXG5cdEhvdmVyZWRPdmVyTm9kZTogI2Q0NmViZVxuXHROb3JtYWxOb2RlOiAjOTI2ZWM5XG5cdGNlbnRyYWxOb2RlOiAjN2M4NTk0XG5cdExpbms6ICM0Yzc3ODdcblx0U2xpZGVyS25vYjogI2YzZWU1ZFxuKi9cblx0XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE15UGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgICBzZXR0aW5nczogTXlQbHVnaW5TZXR0aW5ncztcblxuICAgIGFzeW5jIG9ubG9hZCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgbmV3IHZpZXdcbiAgICAgICAgdGhpcy5yZWdpc3RlclZpZXcoXCJNeSBJdGVtIFZpZXdcIiwgKGxlYWY6IFdvcmtzcGFjZUxlYWYpID0+IG5ldyBNeUl0ZW1WaWV3KGxlYWYpKTtcblxuXHRcdCAvLyBSZWdpc3RlciBob3ZlciBsaW5rIHNvdXJjZVxuXHRcdCB0aGlzLnJlZ2lzdGVySG92ZXJMaW5rU291cmNlKCdEMycsIHtcblx0XHRcdGRpc3BsYXk6ICdEMyBIb3ZlciBMaW5rIFNvdXJjZScsXG5cdFx0XHRkZWZhdWx0TW9kOiB0cnVlXG5cdFx0fSk7XG5cbiAgICAgICAgLy8gVGhpcyBjcmVhdGVzIGFuIGljb24gaW4gdGhlIGxlZnQgcmliYm9uLlxuICAgICAgICBjb25zdCByaWJib25JY29uRWwgPSB0aGlzLmFkZFJpYmJvbkljb24oJ2RpY2UnLCAnU21hcnQgR3JhcGgnLCAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGljb24uXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgbGVhZiBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2VcbiAgICAgICAgICAgIGxldCBsZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYodHJ1ZSk7XG4gICAgXG4gICAgICAgICAgICAvLyBTZXQgdGhlIG5ldyBsZWFmJ3MgdmlldyB0byB5b3VyIGN1c3RvbSB2aWV3XG4gICAgICAgICAgICBsZWFmLnNldFZpZXdTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJNeSBJdGVtIFZpZXdcIixcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLy8gUGVyZm9ybSBhZGRpdGlvbmFsIHRoaW5ncyB3aXRoIHRoZSByaWJib25cbiAgICAgICAgcmliYm9uSWNvbkVsLmFkZENsYXNzKCdteS1wbHVnaW4tcmliYm9uLWNsYXNzJyk7XG5cbiAgICAgICAgLy8gVGhpcyBhZGRzIGEgc3RhdHVzIGJhciBpdGVtIHRvIHRoZSBib3R0b20gb2YgdGhlIGFwcC4gRG9lcyBub3Qgd29yayBvbiBtb2JpbGUgYXBwcy5cbiAgICAgICAgY29uc3Qgc3RhdHVzQmFySXRlbUVsID0gdGhpcy5hZGRTdGF0dXNCYXJJdGVtKCk7XG4gICAgICAgIHN0YXR1c0Jhckl0ZW1FbC5zZXRUZXh0KCdTdGF0dXMgQmFyIFRleHQnKTtcblxuICAgICAgICAvLyBUaGlzIGFkZHMgYSBzaW1wbGUgY29tbWFuZCB0aGF0IGNhbiBiZSB0cmlnZ2VyZWQgYW55d2hlcmVcbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiAnb3Blbi1zYW1wbGUtbW9kYWwtc2ltcGxlJyxcbiAgICAgICAgICAgIG5hbWU6ICdPcGVuIHNhbXBsZSBtb2RhbCAoc2ltcGxlKScsXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBsZWFmIGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZVxuICAgICAgICAgICAgICAgIGxldCBsZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYodHJ1ZSk7XG4gICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgbmV3IGxlYWYncyB2aWV3IHRvIHlvdXIgY3VzdG9tIHZpZXdcbiAgICAgICAgICAgICAgICBsZWFmLnNldFZpZXdTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiTXkgSXRlbSBWaWV3XCIsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFRoaXMgYWRkcyBhbiBlZGl0b3IgY29tbWFuZCB0aGF0IGNhbiBwZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG9uIHRoZSBjdXJyZW50IGVkaXRvciBpbnN0YW5jZVxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6ICdzYW1wbGUtZWRpdG9yLWNvbW1hbmQnLFxuICAgICAgICAgICAgbmFtZTogJ1NhbXBsZSBlZGl0b3IgY29tbWFuZCcsXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBsZWFmIGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZVxuICAgICAgICAgICAgICAgIGxldCBsZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYodHJ1ZSk7XG4gICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgbmV3IGxlYWYncyB2aWV3IHRvIHlvdXIgY3VzdG9tIHZpZXdcbiAgICAgICAgICAgICAgICBsZWFmLnNldFZpZXdTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiTXkgSXRlbSBWaWV3XCIsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVGhpcyBhZGRzIGEgY29tcGxleCBjb21tYW5kIHRoYXQgY2FuIGNoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcCBhbGxvd3MgZXhlY3V0aW9uIG9mIHRoZSBjb21tYW5kXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogJ29wZW4tc2FtcGxlLW1vZGFsLWNvbXBsZXgnLFxuICAgICAgICAgICAgbmFtZTogJ09wZW4gc2FtcGxlIG1vZGFsIChjb21wbGV4KScsXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBsZWFmIGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZVxuICAgICAgICAgICAgICAgIGxldCBsZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYodHJ1ZSk7XG4gICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgbmV3IGxlYWYncyB2aWV3IHRvIHlvdXIgY3VzdG9tIHZpZXdcbiAgICAgICAgICAgICAgICBsZWFmLnNldFZpZXdTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiTXkgSXRlbSBWaWV3XCIsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVGhpcyBhZGRzIGEgc2V0dGluZ3MgdGFiIHNvIHRoZSB1c2VyIGNhbiBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBwbHVnaW5cbiAgICAgICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTYW1wbGVTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIHBsdWdpbiBob29rcyB1cCBhbnkgZ2xvYmFsIERPTSBldmVudHMgKG9uIHBhcnRzIG9mIHRoZSBhcHAgdGhhdCBkb2Vzbid0IGJlbG9uZyB0byB0aGlzIHBsdWdpbilcbiAgICAgICAgLy8gVXNpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgcmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lciB3aGVuIHRoaXMgcGx1Z2luIGlzIGRpc2FibGVkLlxuICAgICAgICB0aGlzLnJlZ2lzdGVyRG9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycsIChldnQ6IE1vdXNlRXZlbnQpID0+IHtcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZygnY2xpY2snLCBldnQpO1xuXHRcdFx0XHR9KTtcblxuICAgICAgICAvLyBXaGVuIHJlZ2lzdGVyaW5nIGludGVydmFscywgdGhpcyBmdW5jdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgY2xlYXIgdGhlIGludGVydmFsIHdoZW4gdGhlIHBsdWdpbiBpcyBkaXNhYmxlZC5cbiAgICAgICAgdGhpcy5yZWdpc3RlckludGVydmFsKHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiBjb25zb2xlLmxvZygnc2V0SW50ZXJ2YWwnKSwgNSAqIDYwICogMTAwMCkpO1xuICAgIH1cblxuICAgIG9udW5sb2FkKCkge31cblxuICAgIGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xuICAgIH1cbn1cblxuY2xhc3MgU2FtcGxlU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICAgIHBsdWdpbjogTXlQbHVnaW47XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBNeVBsdWdpbikge1xuICAgICAgICBzdXBlcihhcHAsIHBsdWdpbik7XG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICAgIH1cblxuICAgIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHtjb250YWluZXJFbH0gPSB0aGlzO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnU2V0dGluZyAjMScpXG4gICAgICAgICAgICAuc2V0RGVzYygnSXRcXCdzIGEgc2VjcmV0JylcbiAgICAgICAgICAgIC5hZGRUZXh0KHRleHQgPT4gdGV4dFxuICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcignRW50ZXIgeW91ciBzZWNyZXQuLi4gVGhpcyB3aWxsIGNoYW5nZSBldmVyeXRoaW5nJylcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MubXlTZXR0aW5nKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MubXlTZXR0aW5nID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPT0gbnVsbCB8fCBiID09IG51bGwgPyBOYU4gOiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPT0gbnVsbCB8fCBiID09IG51bGwgPyBOYU5cbiAgICA6IGIgPCBhID8gLTFcbiAgICA6IGIgPiBhID8gMVxuICAgIDogYiA+PSBhID8gMFxuICAgIDogTmFOO1xufVxuIiwgImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nLmpzXCI7XG5pbXBvcnQgZGVzY2VuZGluZyBmcm9tIFwiLi9kZXNjZW5kaW5nLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJpc2VjdG9yKGYpIHtcbiAgbGV0IGNvbXBhcmUxLCBjb21wYXJlMiwgZGVsdGE7XG5cbiAgLy8gSWYgYW4gYWNjZXNzb3IgaXMgc3BlY2lmaWVkLCBwcm9tb3RlIGl0IHRvIGEgY29tcGFyYXRvci4gSW4gdGhpcyBjYXNlIHdlXG4gIC8vIGNhbiB0ZXN0IHdoZXRoZXIgdGhlIHNlYXJjaCB2YWx1ZSBpcyAoc2VsZi0pIGNvbXBhcmFibGUuIFdlIGNhblx1MjAxOXQgZG8gdGhpc1xuICAvLyBmb3IgYSBjb21wYXJhdG9yIChleGNlcHQgZm9yIHNwZWNpZmljLCBrbm93biBjb21wYXJhdG9ycykgYmVjYXVzZSB3ZSBjYW5cdTIwMTl0XG4gIC8vIHRlbGwgaWYgdGhlIGNvbXBhcmF0b3IgaXMgc3ltbWV0cmljLCBhbmQgYW4gYXN5bW1ldHJpYyBjb21wYXJhdG9yIGNhblx1MjAxOXQgYmVcbiAgLy8gdXNlZCB0byB0ZXN0IHdoZXRoZXIgYSBzaW5nbGUgdmFsdWUgaXMgY29tcGFyYWJsZS5cbiAgaWYgKGYubGVuZ3RoICE9PSAyKSB7XG4gICAgY29tcGFyZTEgPSBhc2NlbmRpbmc7XG4gICAgY29tcGFyZTIgPSAoZCwgeCkgPT4gYXNjZW5kaW5nKGYoZCksIHgpO1xuICAgIGRlbHRhID0gKGQsIHgpID0+IGYoZCkgLSB4O1xuICB9IGVsc2Uge1xuICAgIGNvbXBhcmUxID0gZiA9PT0gYXNjZW5kaW5nIHx8IGYgPT09IGRlc2NlbmRpbmcgPyBmIDogemVybztcbiAgICBjb21wYXJlMiA9IGY7XG4gICAgZGVsdGEgPSBmO1xuICB9XG5cbiAgZnVuY3Rpb24gbGVmdChhLCB4LCBsbyA9IDAsIGhpID0gYS5sZW5ndGgpIHtcbiAgICBpZiAobG8gPCBoaSkge1xuICAgICAgaWYgKGNvbXBhcmUxKHgsIHgpICE9PSAwKSByZXR1cm4gaGk7XG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgICAgaWYgKGNvbXBhcmUyKGFbbWlkXSwgeCkgPCAwKSBsbyA9IG1pZCArIDE7XG4gICAgICAgIGVsc2UgaGkgPSBtaWQ7XG4gICAgICB9IHdoaWxlIChsbyA8IGhpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvO1xuICB9XG5cbiAgZnVuY3Rpb24gcmlnaHQoYSwgeCwgbG8gPSAwLCBoaSA9IGEubGVuZ3RoKSB7XG4gICAgaWYgKGxvIDwgaGkpIHtcbiAgICAgIGlmIChjb21wYXJlMSh4LCB4KSAhPT0gMCkgcmV0dXJuIGhpO1xuICAgICAgZG8ge1xuICAgICAgICBjb25zdCBtaWQgPSAobG8gKyBoaSkgPj4+IDE7XG4gICAgICAgIGlmIChjb21wYXJlMihhW21pZF0sIHgpIDw9IDApIGxvID0gbWlkICsgMTtcbiAgICAgICAgZWxzZSBoaSA9IG1pZDtcbiAgICAgIH0gd2hpbGUgKGxvIDwgaGkpO1xuICAgIH1cbiAgICByZXR1cm4gbG87XG4gIH1cblxuICBmdW5jdGlvbiBjZW50ZXIoYSwgeCwgbG8gPSAwLCBoaSA9IGEubGVuZ3RoKSB7XG4gICAgY29uc3QgaSA9IGxlZnQoYSwgeCwgbG8sIGhpIC0gMSk7XG4gICAgcmV0dXJuIGkgPiBsbyAmJiBkZWx0YShhW2kgLSAxXSwgeCkgPiAtZGVsdGEoYVtpXSwgeCkgPyBpIC0gMSA6IGk7XG4gIH1cblxuICByZXR1cm4ge2xlZnQsIGNlbnRlciwgcmlnaHR9O1xufVxuXG5mdW5jdGlvbiB6ZXJvKCkge1xuICByZXR1cm4gMDtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBudW1iZXIoeCkge1xuICByZXR1cm4geCA9PT0gbnVsbCA/IE5hTiA6ICt4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24qIG51bWJlcnModmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkge1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuaW1wb3J0IGJpc2VjdG9yIGZyb20gXCIuL2Jpc2VjdG9yLmpzXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuXG5jb25zdCBhc2NlbmRpbmdCaXNlY3QgPSBiaXNlY3Rvcihhc2NlbmRpbmcpO1xuZXhwb3J0IGNvbnN0IGJpc2VjdFJpZ2h0ID0gYXNjZW5kaW5nQmlzZWN0LnJpZ2h0O1xuZXhwb3J0IGNvbnN0IGJpc2VjdExlZnQgPSBhc2NlbmRpbmdCaXNlY3QubGVmdDtcbmV4cG9ydCBjb25zdCBiaXNlY3RDZW50ZXIgPSBiaXNlY3RvcihudW1iZXIpLmNlbnRlcjtcbmV4cG9ydCBkZWZhdWx0IGJpc2VjdFJpZ2h0O1xuIiwgImNvbnN0IGUxMCA9IE1hdGguc3FydCg1MCksXG4gICAgZTUgPSBNYXRoLnNxcnQoMTApLFxuICAgIGUyID0gTWF0aC5zcXJ0KDIpO1xuXG5mdW5jdGlvbiB0aWNrU3BlYyhzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgY29uc3Qgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLFxuICAgICAgcG93ZXIgPSBNYXRoLmZsb29yKE1hdGgubG9nMTAoc3RlcCkpLFxuICAgICAgZXJyb3IgPSBzdGVwIC8gTWF0aC5wb3coMTAsIHBvd2VyKSxcbiAgICAgIGZhY3RvciA9IGVycm9yID49IGUxMCA/IDEwIDogZXJyb3IgPj0gZTUgPyA1IDogZXJyb3IgPj0gZTIgPyAyIDogMTtcbiAgbGV0IGkxLCBpMiwgaW5jO1xuICBpZiAocG93ZXIgPCAwKSB7XG4gICAgaW5jID0gTWF0aC5wb3coMTAsIC1wb3dlcikgLyBmYWN0b3I7XG4gICAgaTEgPSBNYXRoLnJvdW5kKHN0YXJ0ICogaW5jKTtcbiAgICBpMiA9IE1hdGgucm91bmQoc3RvcCAqIGluYyk7XG4gICAgaWYgKGkxIC8gaW5jIDwgc3RhcnQpICsraTE7XG4gICAgaWYgKGkyIC8gaW5jID4gc3RvcCkgLS1pMjtcbiAgICBpbmMgPSAtaW5jO1xuICB9IGVsc2Uge1xuICAgIGluYyA9IE1hdGgucG93KDEwLCBwb3dlcikgKiBmYWN0b3I7XG4gICAgaTEgPSBNYXRoLnJvdW5kKHN0YXJ0IC8gaW5jKTtcbiAgICBpMiA9IE1hdGgucm91bmQoc3RvcCAvIGluYyk7XG4gICAgaWYgKGkxICogaW5jIDwgc3RhcnQpICsraTE7XG4gICAgaWYgKGkyICogaW5jID4gc3RvcCkgLS1pMjtcbiAgfVxuICBpZiAoaTIgPCBpMSAmJiAwLjUgPD0gY291bnQgJiYgY291bnQgPCAyKSByZXR1cm4gdGlja1NwZWMoc3RhcnQsIHN0b3AsIGNvdW50ICogMik7XG4gIHJldHVybiBbaTEsIGkyLCBpbmNdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0aWNrcyhzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgc3RvcCA9ICtzdG9wLCBzdGFydCA9ICtzdGFydCwgY291bnQgPSArY291bnQ7XG4gIGlmICghKGNvdW50ID4gMCkpIHJldHVybiBbXTtcbiAgaWYgKHN0YXJ0ID09PSBzdG9wKSByZXR1cm4gW3N0YXJ0XTtcbiAgY29uc3QgcmV2ZXJzZSA9IHN0b3AgPCBzdGFydCwgW2kxLCBpMiwgaW5jXSA9IHJldmVyc2UgPyB0aWNrU3BlYyhzdG9wLCBzdGFydCwgY291bnQpIDogdGlja1NwZWMoc3RhcnQsIHN0b3AsIGNvdW50KTtcbiAgaWYgKCEoaTIgPj0gaTEpKSByZXR1cm4gW107XG4gIGNvbnN0IG4gPSBpMiAtIGkxICsgMSwgdGlja3MgPSBuZXcgQXJyYXkobik7XG4gIGlmIChyZXZlcnNlKSB7XG4gICAgaWYgKGluYyA8IDApIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB0aWNrc1tpXSA9IChpMiAtIGkpIC8gLWluYztcbiAgICBlbHNlIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB0aWNrc1tpXSA9IChpMiAtIGkpICogaW5jO1xuICB9IGVsc2Uge1xuICAgIGlmIChpbmMgPCAwKSBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkgdGlja3NbaV0gPSAoaTEgKyBpKSAvIC1pbmM7XG4gICAgZWxzZSBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkgdGlja3NbaV0gPSAoaTEgKyBpKSAqIGluYztcbiAgfVxuICByZXR1cm4gdGlja3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCkge1xuICBzdG9wID0gK3N0b3AsIHN0YXJ0ID0gK3N0YXJ0LCBjb3VudCA9ICtjb3VudDtcbiAgcmV0dXJuIHRpY2tTcGVjKHN0YXJ0LCBzdG9wLCBjb3VudClbMl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWNrU3RlcChzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgc3RvcCA9ICtzdG9wLCBzdGFydCA9ICtzdGFydCwgY291bnQgPSArY291bnQ7XG4gIGNvbnN0IHJldmVyc2UgPSBzdG9wIDwgc3RhcnQsIGluYyA9IHJldmVyc2UgPyB0aWNrSW5jcmVtZW50KHN0b3AsIHN0YXJ0LCBjb3VudCkgOiB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCk7XG4gIHJldHVybiAocmV2ZXJzZSA/IC0xIDogMSkgKiAoaW5jIDwgMCA/IDEgLyAtaW5jIDogaW5jKTtcbn1cbiIsICJ2YXIgbm9vcCA9IHt2YWx1ZTogKCkgPT4ge319O1xuXG5mdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBfID0ge30sIHQ7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgXCJcIikgfHwgKHQgaW4gXykgfHwgL1tcXHMuXS8udGVzdCh0KSkgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCB0eXBlOiBcIiArIHQpO1xuICAgIF9bdF0gPSBbXTtcbiAgfVxuICByZXR1cm4gbmV3IERpc3BhdGNoKF8pO1xufVxuXG5mdW5jdGlvbiBEaXNwYXRjaChfKSB7XG4gIHRoaXMuXyA9IF87XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcywgdHlwZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIGlmICh0ICYmICF0eXBlcy5oYXNPd25Qcm9wZXJ0eSh0KSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHQpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5EaXNwYXRjaC5wcm90b3R5cGUgPSBkaXNwYXRjaC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBEaXNwYXRjaCxcbiAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykge1xuICAgIHZhciBfID0gdGhpcy5fLFxuICAgICAgICBUID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyBcIlwiLCBfKSxcbiAgICAgICAgdCxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gVC5sZW5ndGg7XG5cbiAgICAvLyBJZiBubyBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGNhbGxiYWNrIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUpKSkgcmV0dXJuIHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgYSB0eXBlIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIC8vIE90aGVyd2lzZSwgaWYgYSBudWxsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJlbW92ZSBjYWxsYmFja3Mgb2YgdGhlIGdpdmVuIG5hbWUuXG4gICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2FsbGJhY2s6IFwiICsgY2FsbGJhY2spO1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpZiAodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spO1xuICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNvcHk6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87XG4gICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpO1xuICAgIHJldHVybiBuZXcgRGlzcGF0Y2goY29weSk7XG4gIH0sXG4gIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHtcbiAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbih0eXBlLCB0aGF0LCBhcmdzKSB7XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHZhciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXQodHlwZSwgbmFtZSkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoLCBjOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKChjID0gdHlwZVtpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgcmV0dXJuIGMudmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldCh0eXBlLCBuYW1lLCBjYWxsYmFjaykge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgdHlwZVtpXSA9IG5vb3AsIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkgKyAxKSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHR5cGUucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IGNhbGxiYWNrfSk7XG4gIHJldHVybiB0eXBlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkaXNwYXRjaDtcbiIsICJleHBvcnQgdmFyIHhodG1sID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3ZnOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIHhodG1sOiB4aHRtbCxcbiAgeGxpbms6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICB4bWw6IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCJcbn07XG4iLCAiaW1wb3J0IG5hbWVzcGFjZXMgZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBwcmVmaXggPSBuYW1lICs9IFwiXCIsIGkgPSBwcmVmaXguaW5kZXhPZihcIjpcIik7XG4gIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwgaSkpICE9PSBcInhtbG5zXCIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTtcbiAgcmV0dXJuIG5hbWVzcGFjZXMuaGFzT3duUHJvcGVydHkocHJlZml4KSA/IHtzcGFjZTogbmFtZXNwYWNlc1twcmVmaXhdLCBsb2NhbDogbmFtZX0gOiBuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xufVxuIiwgImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4vbmFtZXNwYWNlLmpzXCI7XG5pbXBvcnQge3hodG1sfSBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCxcbiAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7XG4gICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWxcbiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpXG4gICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiAoZnVsbG5hbWUubG9jYWxcbiAgICAgID8gY3JlYXRvckZpeGVkXG4gICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7XG59XG4iLCAiZnVuY3Rpb24gbm9uZSgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB9O1xufVxuIiwgImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yIGZyb20gXCIuLi9zZWxlY3Rvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsICIvLyBHaXZlbiBzb21ldGhpbmcgYXJyYXkgbGlrZSAob3IgbnVsbCksIHJldHVybnMgc29tZXRoaW5nIHRoYXQgaXMgc3RyaWN0bHkgYW5cbi8vIGFycmF5LiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgYXJyYXktbGlrZSBvYmplY3RzIHBhc3NlZCB0byBkMy5zZWxlY3RBbGxcbi8vIG9yIHNlbGVjdGlvbi5zZWxlY3RBbGwgYXJlIGNvbnZlcnRlZCBpbnRvIHByb3BlciBhcnJheXMgd2hlbiBjcmVhdGluZyBhXG4vLyBzZWxlY3Rpb247IHdlIGRvblx1MjAxOXQgZXZlciB3YW50IHRvIGNyZWF0ZSBhIHNlbGVjdGlvbiBiYWNrZWQgYnkgYSBsaXZlXG4vLyBIVE1MQ29sbGVjdGlvbiBvciBOb2RlTGlzdC4gSG93ZXZlciwgbm90ZSB0aGF0IHNlbGVjdGlvbi5zZWxlY3RBbGwgd2lsbCB1c2UgYVxuLy8gc3RhdGljIE5vZGVMaXN0IGFzIGEgZ3JvdXAsIHNpbmNlIGl0IHNhZmVseSBkZXJpdmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFycmF5KHgpIHtcbiAgcmV0dXJuIHggPT0gbnVsbCA/IFtdIDogQXJyYXkuaXNBcnJheSh4KSA/IHggOiBBcnJheS5mcm9tKHgpO1xufVxuIiwgImZ1bmN0aW9uIGVtcHR5KCkge1xuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgfTtcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBhcnJheSBmcm9tIFwiLi4vYXJyYXkuanNcIjtcbmltcG9ydCBzZWxlY3RvckFsbCBmcm9tIFwiLi4vc2VsZWN0b3JBbGwuanNcIjtcblxuZnVuY3Rpb24gYXJyYXlBbGwoc2VsZWN0KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYXJyYXkoc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgPT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gYXJyYXlBbGwoc2VsZWN0KTtcbiAgZWxzZSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHBhcmVudHMpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaWxkTWF0Y2hlcihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpO1xuICB9O1xufVxuXG4iLCAiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmQ7XG5cbmZ1bmN0aW9uIGNoaWxkRmluZChtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbmQuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNoaWxkRmlyc3QoKSB7XG4gIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QobWF0Y2ggPT0gbnVsbCA/IGNoaWxkRmlyc3RcbiAgICAgIDogY2hpbGRGaW5kKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCAiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaWx0ZXIgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyO1xuXG5mdW5jdGlvbiBjaGlsZHJlbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbik7XG59XG5cbmZ1bmN0aW9uIGNoaWxkcmVuRmlsdGVyKG1hdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3RBbGwobWF0Y2ggPT0gbnVsbCA/IGNoaWxkcmVuXG4gICAgICA6IGNoaWxkcmVuRmlsdGVyKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCAiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgbWF0Y2hlciBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih1cGRhdGUpIHtcbiAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTtcbn1cbiIsICJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRW50ZXJOb2RlKHBhcmVudCwgZGF0dW0pIHtcbiAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7XG4gIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTtcbiAgdGhpcy5fbmV4dCA9IG51bGw7XG4gIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtO1xufVxuXG5FbnRlck5vZGUucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRW50ZXJOb2RlLFxuICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oY2hpbGQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHRoaXMuX25leHQpOyB9LFxuICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSxcbiAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfSxcbiAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfVxufTtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCB7RW50ZXJOb2RlfSBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBiaW5kSW5kZXgocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSkge1xuICB2YXIgaSA9IDAsXG4gICAgICBub2RlLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGZpdCBpbnRvIHVwZGF0ZS5cbiAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuXG4gIC8vIFB1dCBhbnkgcmVtYWluaW5nIGRhdGEgaW50byBlbnRlci5cbiAgZm9yICg7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb25cdTIwMTl0IGZpdCBpbnRvIGV4aXQuXG4gIGZvciAoOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBiaW5kS2V5KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEsIGtleSkge1xuICB2YXIgaSxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlQnlLZXlWYWx1ZSA9IG5ldyBNYXAsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksXG4gICAgICBrZXlWYWx1ZTtcblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS5cbiAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApICsgXCJcIjtcbiAgICAgIGlmIChub2RlQnlLZXlWYWx1ZS5oYXMoa2V5VmFsdWUpKSB7XG4gICAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZUJ5S2V5VmFsdWUuc2V0KGtleVZhbHVlLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uXG4gIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuXG4gIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci5cbiAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGtleVZhbHVlID0ga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKSArIFwiXCI7XG4gICAgaWYgKG5vZGUgPSBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWUpKSB7XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICBub2RlQnlLZXlWYWx1ZS5kZWxldGUoa2V5VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZXNbaV0pID09PSBub2RlKSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRhdHVtKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX19kYXRhX187XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLCBkYXR1bSk7XG5cbiAgdmFyIGJpbmQgPSBrZXkgPyBiaW5kS2V5IDogYmluZEluZGV4LFxuICAgICAgcGFyZW50cyA9IHRoaXMuX3BhcmVudHMsXG4gICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB2YWx1ZSA9IGNvbnN0YW50KHZhbHVlKTtcblxuICBmb3IgKHZhciBtID0gZ3JvdXBzLmxlbmd0aCwgdXBkYXRlID0gbmV3IEFycmF5KG0pLCBlbnRlciA9IG5ldyBBcnJheShtKSwgZXhpdCA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tqXSxcbiAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sXG4gICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgICBkYXRhID0gYXJyYXlsaWtlKHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBwYXJlbnRzKSksXG4gICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICB1cGRhdGVHcm91cCA9IHVwZGF0ZVtqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7XG5cbiAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7XG5cbiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXRcbiAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLFxuICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLlxuICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7XG4gICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkge1xuICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxO1xuICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7XG4gICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTtcbiAgdXBkYXRlLl9lbnRlciA9IGVudGVyO1xuICB1cGRhdGUuX2V4aXQgPSBleGl0O1xuICByZXR1cm4gdXBkYXRlO1xufVxuXG4vLyBHaXZlbiBzb21lIGRhdGEsIHRoaXMgcmV0dXJucyBhbiBhcnJheS1saWtlIHZpZXcgb2YgaXQ6IGFuIG9iamVjdCB0aGF0XG4vLyBleHBvc2VzIGEgbGVuZ3RoIHByb3BlcnR5IGFuZCBhbGxvd3MgbnVtZXJpYyBpbmRleGluZy4gTm90ZSB0aGF0IHVubGlrZVxuLy8gc2VsZWN0QWxsLCB0aGlzIGlzblx1MjAxOXQgd29ycmllZCBhYm91dCBcdTIwMUNsaXZlXHUyMDFEIGNvbGxlY3Rpb25zIGJlY2F1c2UgdGhlIHJlc3VsdGluZ1xuLy8gYXJyYXkgd2lsbCBvbmx5IGJlIHVzZWQgYnJpZWZseSB3aGlsZSBkYXRhIGlzIGJlaW5nIGJvdW5kLiAoSXQgaXMgcG9zc2libGUgdG9cbi8vIGNhdXNlIHRoZSBkYXRhIHRvIGNoYW5nZSB3aGlsZSBpdGVyYXRpbmcgYnkgdXNpbmcgYSBrZXkgZnVuY3Rpb24sIGJ1dCBwbGVhc2Vcbi8vIGRvblx1MjAxOXQ7IHdlXHUyMDE5ZCByYXRoZXIgYXZvaWQgYSBncmF0dWl0b3VzIGNvcHkuKVxuZnVuY3Rpb24gYXJyYXlsaWtlKGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIFwibGVuZ3RoXCIgaW4gZGF0YVxuICAgID8gZGF0YSAvLyBBcnJheSwgVHlwZWRBcnJheSwgTm9kZUxpc3QsIGFycmF5LWxpa2VcbiAgICA6IEFycmF5LmZyb20oZGF0YSk7IC8vIE1hcCwgU2V0LCBpdGVyYWJsZSwgc3RyaW5nLCBvciBhbnl0aGluZyBlbHNlXG59XG4iLCAiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZXhpdCB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9uZW50ZXIsIG9udXBkYXRlLCBvbmV4aXQpIHtcbiAgdmFyIGVudGVyID0gdGhpcy5lbnRlcigpLCB1cGRhdGUgPSB0aGlzLCBleGl0ID0gdGhpcy5leGl0KCk7XG4gIGlmICh0eXBlb2Ygb25lbnRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZW50ZXIgPSBvbmVudGVyKGVudGVyKTtcbiAgICBpZiAoZW50ZXIpIGVudGVyID0gZW50ZXIuc2VsZWN0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgZW50ZXIgPSBlbnRlci5hcHBlbmQob25lbnRlciArIFwiXCIpO1xuICB9XG4gIGlmIChvbnVwZGF0ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTtcbiAgICBpZiAodXBkYXRlKSB1cGRhdGUgPSB1cGRhdGUuc2VsZWN0aW9uKCk7XG4gIH1cbiAgaWYgKG9uZXhpdCA9PSBudWxsKSBleGl0LnJlbW92ZSgpOyBlbHNlIG9uZXhpdChleGl0KTtcbiAgcmV0dXJuIGVudGVyICYmIHVwZGF0ZSA/IGVudGVyLm1lcmdlKHVwZGF0ZSkub3JkZXIoKSA6IHVwZGF0ZTtcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICB2YXIgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dDtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gLTEsIG0gPSBncm91cHMubGVuZ3RoOyArK2ogPCBtOykge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgaWYgKG5leHQgJiYgbm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuZXh0KSBeIDQpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7XG4gICAgICAgIG5leHQgPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwgImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb21wYXJlKSB7XG4gIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFzY2VuZGluZztcblxuICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmUoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc29ydGdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc29ydGdyb3VwW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc29ydGdyb3VwLnNvcnQoY29tcGFyZU5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc29ydGdyb3VwcywgdGhpcy5fcGFyZW50cykub3JkZXIoKTtcbn1cblxuZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07XG4gIGFyZ3VtZW50c1swXSA9IHRoaXM7XG4gIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTtcbiAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykgKytzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiBzaXplO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMubm9kZSgpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwgImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4uL25hbWVzcGFjZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHYpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTtcbiAgICByZXR1cm4gZnVsbG5hbWUubG9jYWxcbiAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbClcbiAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkpKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIHJldHVybiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgLy8gbm9kZSBpcyBhIE5vZGVcbiAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8vIG5vZGUgaXMgYSBXaW5kb3dcbiAgICAgIHx8IG5vZGUuZGVmYXVsdFZpZXc7IC8vIG5vZGUgaXMgYSBEb2N1bWVudFxufVxuIiwgImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHN0eWxlRnVuY3Rpb25cbiAgICAgICAgICAgIDogc3R5bGVDb25zdGFudCkobmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKVxuICAgICAgOiBzdHlsZVZhbHVlKHRoaXMubm9kZSgpLCBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0eWxlVmFsdWUobm9kZSwgbmFtZSkge1xuICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpXG4gICAgICB8fCBkZWZhdWx0Vmlldyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XG59XG4iLCAiZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgZGVsZXRlIHRoaXNbbmFtZV07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgIGVsc2UgdGhpc1tuYW1lXSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHByb3BlcnR5UmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb25cbiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07XG59XG4iLCAiZnVuY3Rpb24gY2xhc3NBcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XFxzKy8pO1xufVxuXG5mdW5jdGlvbiBjbGFzc0xpc3Qobm9kZSkge1xuICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTtcbn1cblxuZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHtcbiAgdGhpcy5fbm9kZSA9IG5vZGU7XG4gIHRoaXMuX25hbWVzID0gY2xhc3NBcnJheShub2RlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpO1xufVxuXG5DbGFzc0xpc3QucHJvdG90eXBlID0ge1xuICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPCAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5fbmFtZXMuc3BsaWNlKGksIDEpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICBjb250YWluczogZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5yZW1vdmUobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkVHJ1ZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZEFkZCh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbihuYW1lcywgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCA6IGNsYXNzZWRSZW1vdmUpKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWVzID0gY2xhc3NBcnJheShuYW1lICsgXCJcIik7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QodGhpcy5ub2RlKCkpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlXG4gICAgICA/IGNsYXNzZWRUcnVlXG4gICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7XG59XG4iLCAiZnVuY3Rpb24gdGV4dFJlbW92ZSgpIHtcbiAgdGhpcy50ZXh0Q29udGVudCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyB0ZXh0UmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0ZXh0RnVuY3Rpb25cbiAgICAgICAgICA6IHRleHRDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS50ZXh0Q29udGVudDtcbn1cbiIsICJmdW5jdGlvbiBodG1sUmVtb3ZlKCkge1xuICB0aGlzLmlubmVySFRNTCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGh0bWxGdW5jdGlvblxuICAgICAgICAgIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDtcbn1cbiIsICJmdW5jdGlvbiByYWlzZSgpIHtcbiAgaWYgKHRoaXMubmV4dFNpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmFpc2UpO1xufVxuIiwgImZ1bmN0aW9uIGxvd2VyKCkge1xuICBpZiAodGhpcy5wcmV2aW91c1NpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChsb3dlcik7XG59XG4iLCAiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQgY3JlYXRvciBmcm9tIFwiLi4vY3JlYXRvci5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yIGZyb20gXCIuLi9zZWxlY3Rvci5qc1wiO1xuXG5mdW5jdGlvbiBjb25zdGFudE51bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCBiZWZvcmUpIHtcbiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogY3JlYXRvcihuYW1lKSxcbiAgICAgIHNlbGVjdCA9IGJlZm9yZSA9PSBudWxsID8gY29uc3RhbnROdWxsIDogdHlwZW9mIGJlZm9yZSA9PT0gXCJmdW5jdGlvblwiID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7XG4gIH0pO1xufVxuIiwgImZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpO1xufVxuIiwgImZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZVNoYWxsb3coKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lRGVlcCgpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUodHJ1ZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGRlZXApIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5wcm9wZXJ0eShcIl9fZGF0YV9fXCIsIHZhbHVlKVxuICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXztcbn1cbiIsICJmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCwgdGhpcy5fX2RhdGFfXyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uUmVtb3ZlKHR5cGVuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb247XG4gICAgaWYgKCFvbikgcmV0dXJuO1xuICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGlmIChvID0gb25bal0sICghdHlwZW5hbWUudHlwZSB8fCBvLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUpICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25bKytpXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgrK2kpIG9uLmxlbmd0aCA9IGk7XG4gICAgZWxzZSBkZWxldGUgdGhpcy5fX29uO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIodmFsdWUpO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8ub3B0aW9ucyA9IG9wdGlvbnMpO1xuICAgICAgICBvLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBvcHRpb25zOiBvcHRpb25zfTtcbiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107XG4gICAgZWxzZSBvbi5wdXNoKG8pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiksIGksIG4gPSB0eXBlbmFtZXMubGVuZ3RoLCB0O1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIG8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7XG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBvcHRpb25zKSk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7XG4gIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSxcbiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50O1xuXG4gIGlmICh0eXBlb2YgZXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGV2ZW50ID0gbmV3IGV2ZW50KHR5cGUsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZGlzcGF0Y2hGdW5jdGlvblxuICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiooKSB7XG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB5aWVsZCBub2RlO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBzZWxlY3Rpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkIGZyb20gXCIuL3NlbGVjdENoaWxkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuIGZyb20gXCIuL3NlbGVjdENoaWxkcmVuLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0YSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VudGVyIGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2V4aXQgZnJvbSBcIi4vZXhpdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9qb2luIGZyb20gXCIuL2pvaW4uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb3JkZXIgZnJvbSBcIi4vb3JkZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc29ydCBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NhbGwgZnJvbSBcIi4vY2FsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlcyBmcm9tIFwiLi9ub2Rlcy5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlIGZyb20gXCIuL25vZGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VtcHR5IGZyb20gXCIuL2VtcHR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VhY2ggZnJvbSBcIi4vZWFjaC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9hdHRyIGZyb20gXCIuL2F0dHIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcHJvcGVydHkgZnJvbSBcIi4vcHJvcGVydHkuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xhc3NlZCBmcm9tIFwiLi9jbGFzc2VkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9odG1sIGZyb20gXCIuL2h0bWwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmFpc2UgZnJvbSBcIi4vcmFpc2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbG93ZXIgZnJvbSBcIi4vbG93ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXBwZW5kIGZyb20gXCIuL2FwcGVuZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnNlcnQgZnJvbSBcIi4vaW5zZXJ0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xvbmUgZnJvbSBcIi4vY2xvbmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0dW0gZnJvbSBcIi4vZGF0dW0uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGlzcGF0Y2ggZnJvbSBcIi4vZGlzcGF0Y2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faXRlcmF0b3IgZnJvbSBcIi4vaXRlcmF0b3IuanNcIjtcblxuZXhwb3J0IHZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0aW9uKGdyb3VwcywgcGFyZW50cykge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0aW9uKCkge1xuICByZXR1cm4gdGhpcztcbn1cblxuU2VsZWN0aW9uLnByb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sXG4gIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsLFxuICBzZWxlY3RDaGlsZDogc2VsZWN0aW9uX3NlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsXG4gIGRhdGE6IHNlbGVjdGlvbl9kYXRhLFxuICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLFxuICBleGl0OiBzZWxlY3Rpb25fZXhpdCxcbiAgam9pbjogc2VsZWN0aW9uX2pvaW4sXG4gIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogc2VsZWN0aW9uX3NlbGVjdGlvbixcbiAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlcixcbiAgc29ydDogc2VsZWN0aW9uX3NvcnQsXG4gIGNhbGw6IHNlbGVjdGlvbl9jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX25vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fbm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3NpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9lYWNoLFxuICBhdHRyOiBzZWxlY3Rpb25fYXR0cixcbiAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSxcbiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSxcbiAgY2xhc3NlZDogc2VsZWN0aW9uX2NsYXNzZWQsXG4gIHRleHQ6IHNlbGVjdGlvbl90ZXh0LFxuICBodG1sOiBzZWxlY3Rpb25faHRtbCxcbiAgcmFpc2U6IHNlbGVjdGlvbl9yYWlzZSxcbiAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlcixcbiAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLFxuICBpbnNlcnQ6IHNlbGVjdGlvbl9pbnNlcnQsXG4gIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSxcbiAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSxcbiAgZGF0dW06IHNlbGVjdGlvbl9kYXR1bSxcbiAgb246IHNlbGVjdGlvbl9vbixcbiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9pdGVyYXRvclxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2VsZWN0aW9uO1xuIiwgImltcG9ydCB7U2VsZWN0aW9uLCByb290fSBmcm9tIFwiLi9zZWxlY3Rpb24vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcildXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pXG4gICAgICA6IG5ldyBTZWxlY3Rpb24oW1tzZWxlY3Rvcl1dLCByb290KTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBsZXQgc291cmNlRXZlbnQ7XG4gIHdoaWxlIChzb3VyY2VFdmVudCA9IGV2ZW50LnNvdXJjZUV2ZW50KSBldmVudCA9IHNvdXJjZUV2ZW50O1xuICByZXR1cm4gZXZlbnQ7XG59XG4iLCAiaW1wb3J0IHNvdXJjZUV2ZW50IGZyb20gXCIuL3NvdXJjZUV2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50LCBub2RlKSB7XG4gIGV2ZW50ID0gc291cmNlRXZlbnQoZXZlbnQpO1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSBub2RlID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgaWYgKG5vZGUpIHtcbiAgICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1lbnQgfHwgbm9kZTtcbiAgICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7XG4gICAgICB2YXIgcG9pbnQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTtcbiAgICAgIHBvaW50LnggPSBldmVudC5jbGllbnRYLCBwb2ludC55ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcbiAgICAgIHJldHVybiBbcG9pbnQueCwgcG9pbnQueV07XG4gICAgfVxuICAgIGlmIChub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIFtldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gbm9kZS5jbGllbnRMZWZ0LCBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBub2RlLmNsaWVudFRvcF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXTtcbn1cbiIsICIvLyBUaGVzZSBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBub2V2ZW50IHRvIGVuc3VyZSB0aGF0IHdlIGNhblxuLy8gcHJldmVudERlZmF1bHQgb24gdGhlIGV2ZW50LlxuZXhwb3J0IGNvbnN0IG5vbnBhc3NpdmUgPSB7cGFzc2l2ZTogZmFsc2V9O1xuZXhwb3J0IGNvbnN0IG5vbnBhc3NpdmVjYXB0dXJlID0ge2NhcHR1cmU6IHRydWUsIHBhc3NpdmU6IGZhbHNlfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcHJvcGFnYXRpb24oZXZlbnQpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuIiwgImltcG9ydCB7c2VsZWN0fSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgbm9ldmVudCwge25vbnBhc3NpdmVjYXB0dXJlfSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZpZXcpIHtcbiAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCh2aWV3KS5vbihcImRyYWdzdGFydC5kcmFnXCIsIG5vZXZlbnQsIG5vbnBhc3NpdmVjYXB0dXJlKTtcbiAgaWYgKFwib25zZWxlY3RzdGFydFwiIGluIHJvb3QpIHtcbiAgICBzZWxlY3Rpb24ub24oXCJzZWxlY3RzdGFydC5kcmFnXCIsIG5vZXZlbnQsIG5vbnBhc3NpdmVjYXB0dXJlKTtcbiAgfSBlbHNlIHtcbiAgICByb290Ll9fbm9zZWxlY3QgPSByb290LnN0eWxlLk1velVzZXJTZWxlY3Q7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gXCJub25lXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHllc2RyYWcodmlldywgbm9jbGljaykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIGlmIChub2NsaWNrKSB7XG4gICAgc2VsZWN0aW9uLm9uKFwiY2xpY2suZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZWN0aW9uLm9uKFwiY2xpY2suZHJhZ1wiLCBudWxsKTsgfSwgMCk7XG4gIH1cbiAgaWYgKFwib25zZWxlY3RzdGFydFwiIGluIHJvb3QpIHtcbiAgICBzZWxlY3Rpb24ub24oXCJzZWxlY3RzdGFydC5kcmFnXCIsIG51bGwpO1xuICB9IGVsc2Uge1xuICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9IHJvb3QuX19ub3NlbGVjdDtcbiAgICBkZWxldGUgcm9vdC5fX25vc2VsZWN0O1xuICB9XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgeCA9PiAoKSA9PiB4O1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERyYWdFdmVudCh0eXBlLCB7XG4gIHNvdXJjZUV2ZW50LFxuICBzdWJqZWN0LFxuICB0YXJnZXQsXG4gIGlkZW50aWZpZXIsXG4gIGFjdGl2ZSxcbiAgeCwgeSwgZHgsIGR5LFxuICBkaXNwYXRjaFxufSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgdHlwZToge3ZhbHVlOiB0eXBlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHNvdXJjZUV2ZW50OiB7dmFsdWU6IHNvdXJjZUV2ZW50LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHN1YmplY3Q6IHt2YWx1ZTogc3ViamVjdCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0YXJnZXQ6IHt2YWx1ZTogdGFyZ2V0LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIGlkZW50aWZpZXI6IHt2YWx1ZTogaWRlbnRpZmllciwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBhY3RpdmU6IHt2YWx1ZTogYWN0aXZlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHg6IHt2YWx1ZTogeCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB5OiB7dmFsdWU6IHksIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgZHg6IHt2YWx1ZTogZHgsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgZHk6IHt2YWx1ZTogZHksIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgXzoge3ZhbHVlOiBkaXNwYXRjaH1cbiAgfSk7XG59XG5cbkRyYWdFdmVudC5wcm90b3R5cGUub24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHZhbHVlID0gdGhpcy5fLm9uLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHZhbHVlID09PSB0aGlzLl8gPyB0aGlzIDogdmFsdWU7XG59O1xuIiwgImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHtzZWxlY3QsIHBvaW50ZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBub2RyYWcsIHt5ZXNkcmFnfSBmcm9tIFwiLi9ub2RyYWcuanNcIjtcbmltcG9ydCBub2V2ZW50LCB7bm9ucGFzc2l2ZSwgbm9ucGFzc2l2ZWNhcHR1cmUsIG5vcHJvcGFnYXRpb259IGZyb20gXCIuL25vZXZlbnQuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IERyYWdFdmVudCBmcm9tIFwiLi9ldmVudC5qc1wiO1xuXG4vLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS5cbmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIoZXZlbnQpIHtcbiAgcmV0dXJuICFldmVudC5jdHJsS2V5ICYmICFldmVudC5idXR0b247XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb250YWluZXIoKSB7XG4gIHJldHVybiB0aGlzLnBhcmVudE5vZGU7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRTdWJqZWN0KGV2ZW50LCBkKSB7XG4gIHJldHVybiBkID09IG51bGwgPyB7eDogZXZlbnQueCwgeTogZXZlbnQueX0gOiBkO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IChcIm9udG91Y2hzdGFydFwiIGluIHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIsXG4gICAgICBjb250YWluZXIgPSBkZWZhdWx0Q29udGFpbmVyLFxuICAgICAgc3ViamVjdCA9IGRlZmF1bHRTdWJqZWN0LFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIGdlc3R1cmVzID0ge30sXG4gICAgICBsaXN0ZW5lcnMgPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiZHJhZ1wiLCBcImVuZFwiKSxcbiAgICAgIGFjdGl2ZSA9IDAsXG4gICAgICBtb3VzZWRvd254LFxuICAgICAgbW91c2Vkb3dueSxcbiAgICAgIG1vdXNlbW92aW5nLFxuICAgICAgdG91Y2hlbmRpbmcsXG4gICAgICBjbGlja0Rpc3RhbmNlMiA9IDA7XG5cbiAgZnVuY3Rpb24gZHJhZyhzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb25cbiAgICAgICAgLm9uKFwibW91c2Vkb3duLmRyYWdcIiwgbW91c2Vkb3duZWQpXG4gICAgICAuZmlsdGVyKHRvdWNoYWJsZSlcbiAgICAgICAgLm9uKFwidG91Y2hzdGFydC5kcmFnXCIsIHRvdWNoc3RhcnRlZClcbiAgICAgICAgLm9uKFwidG91Y2htb3ZlLmRyYWdcIiwgdG91Y2htb3ZlZCwgbm9ucGFzc2l2ZSlcbiAgICAgICAgLm9uKFwidG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnXCIsIHRvdWNoZW5kZWQpXG4gICAgICAgIC5zdHlsZShcInRvdWNoLWFjdGlvblwiLCBcIm5vbmVcIilcbiAgICAgICAgLnN0eWxlKFwiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yXCIsIFwicmdiYSgwLDAsMCwwKVwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNlZG93bmVkKGV2ZW50LCBkKSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nIHx8ICFmaWx0ZXIuY2FsbCh0aGlzLCBldmVudCwgZCkpIHJldHVybjtcbiAgICB2YXIgZ2VzdHVyZSA9IGJlZm9yZXN0YXJ0KHRoaXMsIGNvbnRhaW5lci5jYWxsKHRoaXMsIGV2ZW50LCBkKSwgZXZlbnQsIGQsIFwibW91c2VcIik7XG4gICAgaWYgKCFnZXN0dXJlKSByZXR1cm47XG4gICAgc2VsZWN0KGV2ZW50LnZpZXcpXG4gICAgICAub24oXCJtb3VzZW1vdmUuZHJhZ1wiLCBtb3VzZW1vdmVkLCBub25wYXNzaXZlY2FwdHVyZSlcbiAgICAgIC5vbihcIm1vdXNldXAuZHJhZ1wiLCBtb3VzZXVwcGVkLCBub25wYXNzaXZlY2FwdHVyZSk7XG4gICAgbm9kcmFnKGV2ZW50LnZpZXcpO1xuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIG1vdXNlbW92aW5nID0gZmFsc2U7XG4gICAgbW91c2Vkb3dueCA9IGV2ZW50LmNsaWVudFg7XG4gICAgbW91c2Vkb3dueSA9IGV2ZW50LmNsaWVudFk7XG4gICAgZ2VzdHVyZShcInN0YXJ0XCIsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNlbW92ZWQoZXZlbnQpIHtcbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBpZiAoIW1vdXNlbW92aW5nKSB7XG4gICAgICB2YXIgZHggPSBldmVudC5jbGllbnRYIC0gbW91c2Vkb3dueCwgZHkgPSBldmVudC5jbGllbnRZIC0gbW91c2Vkb3dueTtcbiAgICAgIG1vdXNlbW92aW5nID0gZHggKiBkeCArIGR5ICogZHkgPiBjbGlja0Rpc3RhbmNlMjtcbiAgICB9XG4gICAgZ2VzdHVyZXMubW91c2UoXCJkcmFnXCIsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNldXBwZWQoZXZlbnQpIHtcbiAgICBzZWxlY3QoZXZlbnQudmlldykub24oXCJtb3VzZW1vdmUuZHJhZyBtb3VzZXVwLmRyYWdcIiwgbnVsbCk7XG4gICAgeWVzZHJhZyhldmVudC52aWV3LCBtb3VzZW1vdmluZyk7XG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZ2VzdHVyZXMubW91c2UoXCJlbmRcIiwgZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hzdGFydGVkKGV2ZW50LCBkKSB7XG4gICAgaWYgKCFmaWx0ZXIuY2FsbCh0aGlzLCBldmVudCwgZCkpIHJldHVybjtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBjID0gY29udGFpbmVyLmNhbGwodGhpcywgZXZlbnQsIGQpLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIGdlc3R1cmU7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoZ2VzdHVyZSA9IGJlZm9yZXN0YXJ0KHRoaXMsIGMsIGV2ZW50LCBkLCB0b3VjaGVzW2ldLmlkZW50aWZpZXIsIHRvdWNoZXNbaV0pKSB7XG4gICAgICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgICAgICBnZXN0dXJlKFwic3RhcnRcIiwgZXZlbnQsIHRvdWNoZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNobW92ZWQoZXZlbnQpIHtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIGdlc3R1cmU7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoZ2VzdHVyZSA9IGdlc3R1cmVzW3RvdWNoZXNbaV0uaWRlbnRpZmllcl0pIHtcbiAgICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICAgIGdlc3R1cmUoXCJkcmFnXCIsIGV2ZW50LCB0b3VjaGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKGV2ZW50KSB7XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlO1xuXG4gICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpO1xuICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCA1MDApOyAvLyBHaG9zdCBjbGlja3MgYXJlIGRlbGF5ZWQhXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKGdlc3R1cmUgPSBnZXN0dXJlc1t0b3VjaGVzW2ldLmlkZW50aWZpZXJdKSB7XG4gICAgICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgICAgICBnZXN0dXJlKFwiZW5kXCIsIGV2ZW50LCB0b3VjaGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBiZWZvcmVzdGFydCh0aGF0LCBjb250YWluZXIsIGV2ZW50LCBkLCBpZGVudGlmaWVyLCB0b3VjaCkge1xuICAgIHZhciBkaXNwYXRjaCA9IGxpc3RlbmVycy5jb3B5KCksXG4gICAgICAgIHAgPSBwb2ludGVyKHRvdWNoIHx8IGV2ZW50LCBjb250YWluZXIpLCBkeCwgZHksXG4gICAgICAgIHM7XG5cbiAgICBpZiAoKHMgPSBzdWJqZWN0LmNhbGwodGhhdCwgbmV3IERyYWdFdmVudChcImJlZm9yZXN0YXJ0XCIsIHtcbiAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxuICAgICAgICB0YXJnZXQ6IGRyYWcsXG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIGFjdGl2ZSxcbiAgICAgICAgeDogcFswXSxcbiAgICAgICAgeTogcFsxXSxcbiAgICAgICAgZHg6IDAsXG4gICAgICAgIGR5OiAwLFxuICAgICAgICBkaXNwYXRjaFxuICAgICAgfSksIGQpKSA9PSBudWxsKSByZXR1cm47XG5cbiAgICBkeCA9IHMueCAtIHBbMF0gfHwgMDtcbiAgICBkeSA9IHMueSAtIHBbMV0gfHwgMDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBnZXN0dXJlKHR5cGUsIGV2ZW50LCB0b3VjaCkge1xuICAgICAgdmFyIHAwID0gcCwgbjtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwic3RhcnRcIjogZ2VzdHVyZXNbaWRlbnRpZmllcl0gPSBnZXN0dXJlLCBuID0gYWN0aXZlKys7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiZW5kXCI6IGRlbGV0ZSBnZXN0dXJlc1tpZGVudGlmaWVyXSwgLS1hY3RpdmU7IC8vIGZhbGxzIHRocm91Z2hcbiAgICAgICAgY2FzZSBcImRyYWdcIjogcCA9IHBvaW50ZXIodG91Y2ggfHwgZXZlbnQsIGNvbnRhaW5lciksIG4gPSBhY3RpdmU7IGJyZWFrO1xuICAgICAgfVxuICAgICAgZGlzcGF0Y2guY2FsbChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhhdCxcbiAgICAgICAgbmV3IERyYWdFdmVudCh0eXBlLCB7XG4gICAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgIHN1YmplY3Q6IHMsXG4gICAgICAgICAgdGFyZ2V0OiBkcmFnLFxuICAgICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgICAgYWN0aXZlOiBuLFxuICAgICAgICAgIHg6IHBbMF0gKyBkeCxcbiAgICAgICAgICB5OiBwWzFdICsgZHksXG4gICAgICAgICAgZHg6IHBbMF0gLSBwMFswXSxcbiAgICAgICAgICBkeTogcFsxXSAtIHAwWzFdLFxuICAgICAgICAgIGRpc3BhdGNoXG4gICAgICAgIH0pLFxuICAgICAgICBkXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICBkcmFnLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGRyYWcpIDogZmlsdGVyO1xuICB9O1xuXG4gIGRyYWcuY29udGFpbmVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnRhaW5lciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIGRyYWcpIDogY29udGFpbmVyO1xuICB9O1xuXG4gIGRyYWcuc3ViamVjdCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdWJqZWN0ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChfKSwgZHJhZykgOiBzdWJqZWN0O1xuICB9O1xuXG4gIGRyYWcudG91Y2hhYmxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgZHJhZykgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgZHJhZy5vbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSA9IGxpc3RlbmVycy5vbi5hcHBseShsaXN0ZW5lcnMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyBkcmFnIDogdmFsdWU7XG4gIH07XG5cbiAgZHJhZy5jbGlja0Rpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsaWNrRGlzdGFuY2UyID0gKF8gPSArXykgKiBfLCBkcmFnKSA6IE1hdGguc3FydChjbGlja0Rpc3RhbmNlMik7XG4gIH07XG5cbiAgcmV0dXJuIGRyYWc7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29uc3RydWN0b3IsIGZhY3RvcnksIHByb3RvdHlwZSkge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBmYWN0b3J5LnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgcHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQocGFyZW50LCBkZWZpbml0aW9uKSB7XG4gIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpO1xuICBmb3IgKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgcHJvdG90eXBlW2tleV0gPSBkZWZpbml0aW9uW2tleV07XG4gIHJldHVybiBwcm90b3R5cGU7XG59XG4iLCAiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb2xvcigpIHt9XG5cbmV4cG9ydCB2YXIgZGFya2VyID0gMC43O1xuZXhwb3J0IHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7XG5cbnZhciByZUkgPSBcIlxcXFxzKihbKy1dP1xcXFxkKylcXFxccypcIixcbiAgICByZU4gPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPylcXFxccypcIixcbiAgICByZVAgPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPyklXFxcXHMqXCIsXG4gICAgcmVIZXggPSAvXiMoWzAtOWEtZl17Myw4fSkkLyxcbiAgICByZVJnYkludGVnZXIgPSBuZXcgUmVnRXhwKGBecmdiXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfVxcXFwpJGApLFxuICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JhXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfSwke3JlTn1cXFxcKSRgKSxcbiAgICByZVJnYmFQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYmFcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9LCR7cmVOfVxcXFwpJGApLFxuICAgIHJlSHNsUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xcXFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xhXFxcXCgke3JlTn0sJHtyZVB9LCR7cmVQfSwke3JlTn1cXFxcKSRgKTtcblxudmFyIG5hbWVkID0ge1xuICBhbGljZWJsdWU6IDB4ZjBmOGZmLFxuICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LFxuICBhcXVhOiAweDAwZmZmZixcbiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsXG4gIGF6dXJlOiAweGYwZmZmZixcbiAgYmVpZ2U6IDB4ZjVmNWRjLFxuICBiaXNxdWU6IDB4ZmZlNGM0LFxuICBibGFjazogMHgwMDAwMDAsXG4gIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCxcbiAgYmx1ZTogMHgwMDAwZmYsXG4gIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLFxuICBicm93bjogMHhhNTJhMmEsXG4gIGJ1cmx5d29vZDogMHhkZWI4ODcsXG4gIGNhZGV0Ymx1ZTogMHg1ZjllYTAsXG4gIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLFxuICBjaG9jb2xhdGU6IDB4ZDI2OTFlLFxuICBjb3JhbDogMHhmZjdmNTAsXG4gIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCxcbiAgY29ybnNpbGs6IDB4ZmZmOGRjLFxuICBjcmltc29uOiAweGRjMTQzYyxcbiAgY3lhbjogMHgwMGZmZmYsXG4gIGRhcmtibHVlOiAweDAwMDA4YixcbiAgZGFya2N5YW46IDB4MDA4YjhiLFxuICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYixcbiAgZGFya2dyYXk6IDB4YTlhOWE5LFxuICBkYXJrZ3JlZW46IDB4MDA2NDAwLFxuICBkYXJrZ3JleTogMHhhOWE5YTksXG4gIGRhcmtraGFraTogMHhiZGI3NmIsXG4gIGRhcmttYWdlbnRhOiAweDhiMDA4YixcbiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLFxuICBkYXJrb3JhbmdlOiAweGZmOGMwMCxcbiAgZGFya29yY2hpZDogMHg5OTMyY2MsXG4gIGRhcmtyZWQ6IDB4OGIwMDAwLFxuICBkYXJrc2FsbW9uOiAweGU5OTY3YSxcbiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZixcbiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsXG4gIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLFxuICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZixcbiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsXG4gIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLFxuICBkZWVwcGluazogMHhmZjE0OTMsXG4gIGRlZXBza3libHVlOiAweDAwYmZmZixcbiAgZGltZ3JheTogMHg2OTY5NjksXG4gIGRpbWdyZXk6IDB4Njk2OTY5LFxuICBkb2RnZXJibHVlOiAweDFlOTBmZixcbiAgZmlyZWJyaWNrOiAweGIyMjIyMixcbiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLFxuICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsXG4gIGZ1Y2hzaWE6IDB4ZmYwMGZmLFxuICBnYWluc2Jvcm86IDB4ZGNkY2RjLFxuICBnaG9zdHdoaXRlOiAweGY4ZjhmZixcbiAgZ29sZDogMHhmZmQ3MDAsXG4gIGdvbGRlbnJvZDogMHhkYWE1MjAsXG4gIGdyYXk6IDB4ODA4MDgwLFxuICBncmVlbjogMHgwMDgwMDAsXG4gIGdyZWVueWVsbG93OiAweGFkZmYyZixcbiAgZ3JleTogMHg4MDgwODAsXG4gIGhvbmV5ZGV3OiAweGYwZmZmMCxcbiAgaG90cGluazogMHhmZjY5YjQsXG4gIGluZGlhbnJlZDogMHhjZDVjNWMsXG4gIGluZGlnbzogMHg0YjAwODIsXG4gIGl2b3J5OiAweGZmZmZmMCxcbiAga2hha2k6IDB4ZjBlNjhjLFxuICBsYXZlbmRlcjogMHhlNmU2ZmEsXG4gIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LFxuICBsYXduZ3JlZW46IDB4N2NmYzAwLFxuICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLFxuICBsaWdodGJsdWU6IDB4YWRkOGU2LFxuICBsaWdodGNvcmFsOiAweGYwODA4MCxcbiAgbGlnaHRjeWFuOiAweGUwZmZmZixcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLFxuICBsaWdodGdyYXk6IDB4ZDNkM2QzLFxuICBsaWdodGdyZWVuOiAweDkwZWU5MCxcbiAgbGlnaHRncmV5OiAweGQzZDNkMyxcbiAgbGlnaHRwaW5rOiAweGZmYjZjMSxcbiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLFxuICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSxcbiAgbGlnaHRza3libHVlOiAweDg3Y2VmYSxcbiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LFxuICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksXG4gIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSxcbiAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLFxuICBsaW1lOiAweDAwZmYwMCxcbiAgbGltZWdyZWVuOiAweDMyY2QzMixcbiAgbGluZW46IDB4ZmFmMGU2LFxuICBtYWdlbnRhOiAweGZmMDBmZixcbiAgbWFyb29uOiAweDgwMDAwMCxcbiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsXG4gIG1lZGl1bWJsdWU6IDB4MDAwMGNkLFxuICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLFxuICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLFxuICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsXG4gIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsXG4gIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSxcbiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYyxcbiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSxcbiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCxcbiAgbWludGNyZWFtOiAweGY1ZmZmYSxcbiAgbWlzdHlyb3NlOiAweGZmZTRlMSxcbiAgbW9jY2FzaW46IDB4ZmZlNGI1LFxuICBuYXZham93aGl0ZTogMHhmZmRlYWQsXG4gIG5hdnk6IDB4MDAwMDgwLFxuICBvbGRsYWNlOiAweGZkZjVlNixcbiAgb2xpdmU6IDB4ODA4MDAwLFxuICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLFxuICBvcmFuZ2U6IDB4ZmZhNTAwLFxuICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLFxuICBvcmNoaWQ6IDB4ZGE3MGQ2LFxuICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSxcbiAgcGFsZWdyZWVuOiAweDk4ZmI5OCxcbiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsXG4gIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLFxuICBwYXBheWF3aGlwOiAweGZmZWZkNSxcbiAgcGVhY2hwdWZmOiAweGZmZGFiOSxcbiAgcGVydTogMHhjZDg1M2YsXG4gIHBpbms6IDB4ZmZjMGNiLFxuICBwbHVtOiAweGRkYTBkZCxcbiAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsXG4gIHB1cnBsZTogMHg4MDAwODAsXG4gIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LFxuICByZWQ6IDB4ZmYwMDAwLFxuICByb3N5YnJvd246IDB4YmM4ZjhmLFxuICByb3lhbGJsdWU6IDB4NDE2OWUxLFxuICBzYWRkbGVicm93bjogMHg4YjQ1MTMsXG4gIHNhbG1vbjogMHhmYTgwNzIsXG4gIHNhbmR5YnJvd246IDB4ZjRhNDYwLFxuICBzZWFncmVlbjogMHgyZThiNTcsXG4gIHNlYXNoZWxsOiAweGZmZjVlZSxcbiAgc2llbm5hOiAweGEwNTIyZCxcbiAgc2lsdmVyOiAweGMwYzBjMCxcbiAgc2t5Ymx1ZTogMHg4N2NlZWIsXG4gIHNsYXRlYmx1ZTogMHg2YTVhY2QsXG4gIHNsYXRlZ3JheTogMHg3MDgwOTAsXG4gIHNsYXRlZ3JleTogMHg3MDgwOTAsXG4gIHNub3c6IDB4ZmZmYWZhLFxuICBzcHJpbmdncmVlbjogMHgwMGZmN2YsXG4gIHN0ZWVsYmx1ZTogMHg0NjgyYjQsXG4gIHRhbjogMHhkMmI0OGMsXG4gIHRlYWw6IDB4MDA4MDgwLFxuICB0aGlzdGxlOiAweGQ4YmZkOCxcbiAgdG9tYXRvOiAweGZmNjM0NyxcbiAgdHVycXVvaXNlOiAweDQwZTBkMCxcbiAgdmlvbGV0OiAweGVlODJlZSxcbiAgd2hlYXQ6IDB4ZjVkZWIzLFxuICB3aGl0ZTogMHhmZmZmZmYsXG4gIHdoaXRlc21va2U6IDB4ZjVmNWY1LFxuICB5ZWxsb3c6IDB4ZmZmZjAwLFxuICB5ZWxsb3dncmVlbjogMHg5YWNkMzJcbn07XG5cbmRlZmluZShDb2xvciwgY29sb3IsIHtcbiAgY29weShjaGFubmVscykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7XG4gIH0sXG4gIGhleDogY29sb3JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IGNvbG9yX2Zvcm1hdEhleCxcbiAgZm9ybWF0SGV4ODogY29sb3JfZm9ybWF0SGV4OCxcbiAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsXG4gIGZvcm1hdFJnYjogY29sb3JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiXG59KTtcblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4OCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2woKSB7XG4gIHJldHVybiBoc2xDb252ZXJ0KHRoaXMpLmZvcm1hdEhzbCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRSZ2IoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHtcbiAgdmFyIG0sIGw7XG4gIGZvcm1hdCA9IChmb3JtYXQgKyBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChtID0gcmVIZXguZXhlYyhmb3JtYXQpKSA/IChsID0gbVsxXS5sZW5ndGgsIG0gPSBwYXJzZUludChtWzFdLCAxNiksIGwgPT09IDYgPyByZ2JuKG0pIC8vICNmZjAwMDBcbiAgICAgIDogbCA9PT0gMyA/IG5ldyBSZ2IoKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkgLy8gI2YwMFxuICAgICAgOiBsID09PSA4ID8gcmdiYShtID4+IDI0ICYgMHhmZiwgbSA+PiAxNiAmIDB4ZmYsIG0gPj4gOCAmIDB4ZmYsIChtICYgMHhmZikgLyAweGZmKSAvLyAjZmYwMDAwMDBcbiAgICAgIDogbCA9PT0gNCA/IHJnYmEoKG0gPj4gMTIgJiAweGYpIHwgKG0gPj4gOCAmIDB4ZjApLCAobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSkgLyAweGZmKSAvLyAjZjAwMFxuICAgICAgOiBudWxsKSAvLyBpbnZhbGlkIGhleFxuICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKVxuICAgICAgOiAobSA9IHJlUmdiUGVyY2VudC5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCAxKSAvLyByZ2IoMTAwJSwgMCUsIDAlKVxuICAgICAgOiAobSA9IHJlUmdiYUludGVnZXIuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSwgbVsyXSwgbVszXSwgbVs0XSkgLy8gcmdiYSgyNTUsIDAsIDAsIDEpXG4gICAgICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKVxuICAgICAgOiAobSA9IHJlSHNsUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCAxKSAvLyBoc2woMTIwLCA1MCUsIDUwJSlcbiAgICAgIDogKG0gPSByZUhzbGFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIG1bNF0pIC8vIGhzbGEoMTIwLCA1MCUsIDUwJSwgMSlcbiAgICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIDogZm9ybWF0ID09PSBcInRyYW5zcGFyZW50XCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApXG4gICAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJnYm4obikge1xuICByZXR1cm4gbmV3IFJnYihuID4+IDE2ICYgMHhmZiwgbiA+PiA4ICYgMHhmZiwgbiAmIDB4ZmYsIDEpO1xufVxuXG5mdW5jdGlvbiByZ2JhKHIsIGcsIGIsIGEpIHtcbiAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOO1xuICByZXR1cm4gbmV3IFJnYihyLCBnLCBiLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYkNvbnZlcnQobykge1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBSZ2I7XG4gIG8gPSBvLnJnYigpO1xuICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICB0aGlzLnIgPSArcjtcbiAgdGhpcy5nID0gK2c7XG4gIHRoaXMuYiA9ICtiO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY2xhbXAoKSB7XG4gICAgcmV0dXJuIG5ldyBSZ2IoY2xhbXBpKHRoaXMuciksIGNsYW1waSh0aGlzLmcpLCBjbGFtcGkodGhpcy5iKSwgY2xhbXBhKHRoaXMub3BhY2l0eSkpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmcgJiYgdGhpcy5nIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuYiAmJiB0aGlzLmIgPCAyNTUuNSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgaGV4OiByZ2JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhleDg6IHJnYl9mb3JtYXRIZXg4LFxuICBmb3JtYXRSZ2I6IHJnYl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiXG59KSk7XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfWA7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXg4KCkge1xuICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX0ke2hleCgoaXNOYU4odGhpcy5vcGFjaXR5KSA/IDEgOiB0aGlzLm9wYWNpdHkpICogMjU1KX1gO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0UmdiKCkge1xuICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gIHJldHVybiBgJHthID09PSAxID8gXCJyZ2IoXCIgOiBcInJnYmEoXCJ9JHtjbGFtcGkodGhpcy5yKX0sICR7Y2xhbXBpKHRoaXMuZyl9LCAke2NsYW1waSh0aGlzLmIpfSR7YSA9PT0gMSA/IFwiKVwiIDogYCwgJHthfSlgfWA7XG59XG5cbmZ1bmN0aW9uIGNsYW1wYShvcGFjaXR5KSB7XG4gIHJldHVybiBpc05hTihvcGFjaXR5KSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBvcGFjaXR5KSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1waSh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7XG59XG5cbmZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICB2YWx1ZSA9IGNsYW1waSh2YWx1ZSk7XG4gIHJldHVybiAodmFsdWUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyB2YWx1ZS50b1N0cmluZygxNik7XG59XG5cbmZ1bmN0aW9uIGhzbGEoaCwgcywgbCwgYSkge1xuICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47XG4gIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOO1xuICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbmV3IEhzbChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBIc2w7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbztcbiAgbyA9IG8ucmdiKCk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgaCA9IE5hTixcbiAgICAgIHMgPSBtYXggLSBtaW4sXG4gICAgICBsID0gKG1heCArIG1pbikgLyAyO1xuICBpZiAocykge1xuICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O1xuICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtcbiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7XG4gICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjtcbiAgICBoICo9IDYwO1xuICB9IGVsc2Uge1xuICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoO1xuICB9XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMucyA9ICtzO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCxcbiAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLFxuICAgICAgICBsID0gdGhpcy5sLFxuICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLFxuICAgICAgICBtMSA9IDIgKiBsIC0gbTI7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGgsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH0sXG4gIGNsYW1wKCkge1xuICAgIHJldHVybiBuZXcgSHNsKGNsYW1waCh0aGlzLmgpLCBjbGFtcHQodGhpcy5zKSwgY2xhbXB0KHRoaXMubCksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLmwgJiYgdGhpcy5sIDw9IDEpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGZvcm1hdEhzbCgpIHtcbiAgICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gICAgcmV0dXJuIGAke2EgPT09IDEgPyBcImhzbChcIiA6IFwiaHNsYShcIn0ke2NsYW1waCh0aGlzLmgpfSwgJHtjbGFtcHQodGhpcy5zKSAqIDEwMH0lLCAke2NsYW1wdCh0aGlzLmwpICogMTAwfSUke2EgPT09IDEgPyBcIilcIiA6IGAsICR7YX0pYH1gO1xuICB9XG59KSk7XG5cbmZ1bmN0aW9uIGNsYW1waCh2YWx1ZSkge1xuICB2YWx1ZSA9ICh2YWx1ZSB8fCAwKSAlIDM2MDtcbiAgcmV0dXJuIHZhbHVlIDwgMCA/IHZhbHVlICsgMzYwIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNsYW1wdCh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdmFsdWUgfHwgMCkpO1xufVxuXG4vKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovXG5mdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikge1xuICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwXG4gICAgICA6IGggPCAxODAgPyBtMlxuICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MFxuICAgICAgOiBtMSkgKiAyNTU7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGJhc2lzKHQxLCB2MCwgdjEsIHYyLCB2Mykge1xuICB2YXIgdDIgPSB0MSAqIHQxLCB0MyA9IHQyICogdDE7XG4gIHJldHVybiAoKDEgLSAzICogdDEgKyAzICogdDIgLSB0MykgKiB2MFxuICAgICAgKyAoNCAtIDYgKiB0MiArIDMgKiB0MykgKiB2MVxuICAgICAgKyAoMSArIDMgKiB0MSArIDMgKiB0MiAtIDMgKiB0MykgKiB2MlxuICAgICAgKyB0MyAqIHYzKSAvIDY7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGggLSAxO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdCA8PSAwID8gKHQgPSAwKSA6IHQgPj0gMSA/ICh0ID0gMSwgbiAtIDEpIDogTWF0aC5mbG9vcih0ICogbiksXG4gICAgICAgIHYxID0gdmFsdWVzW2ldLFxuICAgICAgICB2MiA9IHZhbHVlc1tpICsgMV0sXG4gICAgICAgIHYwID0gaSA+IDAgPyB2YWx1ZXNbaSAtIDFdIDogMiAqIHYxIC0gdjIsXG4gICAgICAgIHYzID0gaSA8IG4gLSAxID8gdmFsdWVzW2kgKyAyXSA6IDIgKiB2MiAtIHYxO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn1cbiIsICJpbXBvcnQge2Jhc2lzfSBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gTWF0aC5mbG9vcigoKHQgJT0gMSkgPCAwID8gKyt0IDogdCkgKiBuKSxcbiAgICAgICAgdjAgPSB2YWx1ZXNbKGkgKyBuIC0gMSkgJSBuXSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaSAlIG5dLFxuICAgICAgICB2MiA9IHZhbHVlc1soaSArIDEpICUgbl0sXG4gICAgICAgIHYzID0gdmFsdWVzWyhpICsgMikgJSBuXTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgeCA9PiAoKSA9PiB4O1xuIiwgImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBsaW5lYXIoYSwgZCkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICsgdCAqIGQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4cG9uZW50aWFsKGEsIGIsIHkpIHtcbiAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBodWUoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2FtbWEoeSkge1xuICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hIDogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vZ2FtbWEoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuIiwgImltcG9ydCB7cmdiIGFzIGNvbG9yUmdifSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBiYXNpcyBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuaW1wb3J0IGJhc2lzQ2xvc2VkIGZyb20gXCIuL2Jhc2lzQ2xvc2VkLmpzXCI7XG5pbXBvcnQgbm9nYW1tYSwge2dhbW1hfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gcmdiR2FtbWEoeSkge1xuICB2YXIgY29sb3IgPSBnYW1tYSh5KTtcblxuICBmdW5jdGlvbiByZ2Ioc3RhcnQsIGVuZCkge1xuICAgIHZhciByID0gY29sb3IoKHN0YXJ0ID0gY29sb3JSZ2Ioc3RhcnQpKS5yLCAoZW5kID0gY29sb3JSZ2IoZW5kKSkuciksXG4gICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBlbmQuZyksXG4gICAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksXG4gICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgc3RhcnQuciA9IHIodCk7XG4gICAgICBzdGFydC5nID0gZyh0KTtcbiAgICAgIHN0YXJ0LmIgPSBiKHQpO1xuICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgIH07XG4gIH1cblxuICByZ2IuZ2FtbWEgPSByZ2JHYW1tYTtcblxuICByZXR1cm4gcmdiO1xufSkoMSk7XG5cbmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbG9ycykge1xuICAgIHZhciBuID0gY29sb3JzLmxlbmd0aCxcbiAgICAgICAgciA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgZyA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgaSwgY29sb3I7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgY29sb3IgPSBjb2xvclJnYihjb2xvcnNbaV0pO1xuICAgICAgcltpXSA9IGNvbG9yLnIgfHwgMDtcbiAgICAgIGdbaV0gPSBjb2xvci5nIHx8IDA7XG4gICAgICBiW2ldID0gY29sb3IuYiB8fCAwO1xuICAgIH1cbiAgICByID0gc3BsaW5lKHIpO1xuICAgIGcgPSBzcGxpbmUoZyk7XG4gICAgYiA9IHNwbGluZShiKTtcbiAgICBjb2xvci5vcGFjaXR5ID0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgY29sb3IuciA9IHIodCk7XG4gICAgICBjb2xvci5nID0gZyh0KTtcbiAgICAgIGNvbG9yLmIgPSBiKHQpO1xuICAgICAgcmV0dXJuIGNvbG9yICsgXCJcIjtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIHJnYkJhc2lzID0gcmdiU3BsaW5lKGJhc2lzKTtcbmV4cG9ydCB2YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpO1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgaWYgKCFiKSBiID0gW107XG4gIHZhciBuID0gYSA/IE1hdGgubWluKGIubGVuZ3RoLCBhLmxlbmd0aCkgOiAwLFxuICAgICAgYyA9IGIuc2xpY2UoKSxcbiAgICAgIGk7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY1tpXSA9IGFbaV0gKiAoMSAtIHQpICsgYltpXSAqIHQ7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlckFycmF5KHgpIHtcbiAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh4KSAmJiAhKHggaW5zdGFuY2VvZiBEYXRhVmlldyk7XG59XG4iLCAiaW1wb3J0IHZhbHVlIGZyb20gXCIuL3ZhbHVlLmpzXCI7XG5pbXBvcnQgbnVtYmVyQXJyYXksIHtpc051bWJlckFycmF5fSBmcm9tIFwiLi9udW1iZXJBcnJheS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiAoaXNOdW1iZXJBcnJheShiKSA/IG51bWJlckFycmF5IDogZ2VuZXJpY0FycmF5KShhLCBiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyaWNBcnJheShhLCBiKSB7XG4gIHZhciBuYiA9IGIgPyBiLmxlbmd0aCA6IDAsXG4gICAgICBuYSA9IGEgPyBNYXRoLm1pbihuYiwgYS5sZW5ndGgpIDogMCxcbiAgICAgIHggPSBuZXcgQXJyYXkobmEpLFxuICAgICAgYyA9IG5ldyBBcnJheShuYiksXG4gICAgICBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSB4W2ldID0gdmFsdWUoYVtpXSwgYltpXSk7XG4gIGZvciAoOyBpIDwgbmI7ICsraSkgY1tpXSA9IGJbaV07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbmE7ICsraSkgY1tpXSA9IHhbaV0odCk7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgZCA9IG5ldyBEYXRlO1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gZC5zZXRUaW1lKGEgKiAoMSAtIHQpICsgYiAqIHQpLCBkO1xuICB9O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGEgKiAoMSAtIHQpICsgYiAqIHQ7XG4gIH07XG59XG4iLCAiaW1wb3J0IHZhbHVlIGZyb20gXCIuL3ZhbHVlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGkgPSB7fSxcbiAgICAgIGMgPSB7fSxcbiAgICAgIGs7XG5cbiAgaWYgKGEgPT09IG51bGwgfHwgdHlwZW9mIGEgIT09IFwib2JqZWN0XCIpIGEgPSB7fTtcbiAgaWYgKGIgPT09IG51bGwgfHwgdHlwZW9mIGIgIT09IFwib2JqZWN0XCIpIGIgPSB7fTtcblxuICBmb3IgKGsgaW4gYikge1xuICAgIGlmIChrIGluIGEpIHtcbiAgICAgIGlba10gPSB2YWx1ZShhW2tdLCBiW2tdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY1trXSA9IGJba107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBmb3IgKGsgaW4gaSkgY1trXSA9IGlba10odCk7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59XG4iLCAiaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxudmFyIHJlQSA9IC9bLStdPyg/OlxcZCtcXC4/XFxkKnxcXC4/XFxkKykoPzpbZUVdWy0rXT9cXGQrKT8vZyxcbiAgICByZUIgPSBuZXcgUmVnRXhwKHJlQS5zb3VyY2UsIFwiZ1wiKTtcblxuZnVuY3Rpb24gemVybyhiKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25lKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYih0KSArIFwiXCI7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLCAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiXG4gICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhXG4gICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiXG4gICAgICBicywgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnlcbiAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gc1xuICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcblxuICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuXG4gIGEgPSBhICsgXCJcIiwgYiA9IGIgKyBcIlwiO1xuXG4gIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuXG4gIHdoaWxlICgoYW0gPSByZUEuZXhlYyhhKSlcbiAgICAgICYmIChibSA9IHJlQi5leGVjKGIpKSkge1xuICAgIGlmICgoYnMgPSBibS5pbmRleCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7XG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gICAgfVxuICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgeyAvLyBudW1iZXJzIGluIGEgJiBiIG1hdGNoXG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYm07XG4gICAgfSBlbHNlIHsgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnNcbiAgICAgIHNbKytpXSA9IG51bGw7XG4gICAgICBxLnB1c2goe2k6IGksIHg6IG51bWJlcihhbSwgYm0pfSk7XG4gICAgfVxuICAgIGJpID0gcmVCLmxhc3RJbmRleDtcbiAgfVxuXG4gIC8vIEFkZCByZW1haW5zIG9mIGIuXG4gIGlmIChiaSA8IGIubGVuZ3RoKSB7XG4gICAgYnMgPSBiLnNsaWNlKGJpKTtcbiAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICBlbHNlIHNbKytpXSA9IGJzO1xuICB9XG5cbiAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guXG4gIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuXG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAocVswXVxuICAgICAgPyBvbmUocVswXS54KVxuICAgICAgOiB6ZXJvKGIpKVxuICAgICAgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgICAgICB9KTtcbn1cbiIsICJpbXBvcnQge2NvbG9yfSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCByZ2IgZnJvbSBcIi4vcmdiLmpzXCI7XG5pbXBvcnQge2dlbmVyaWNBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIjtcbmltcG9ydCBkYXRlIGZyb20gXCIuL2RhdGUuanNcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQgb2JqZWN0IGZyb20gXCIuL29iamVjdC5qc1wiO1xuaW1wb3J0IHN0cmluZyBmcm9tIFwiLi9zdHJpbmcuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IG51bWJlckFycmF5LCB7aXNOdW1iZXJBcnJheX0gZnJvbSBcIi4vbnVtYmVyQXJyYXkuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgdCA9IHR5cGVvZiBiLCBjO1xuICByZXR1cm4gYiA9PSBudWxsIHx8IHQgPT09IFwiYm9vbGVhblwiID8gY29uc3RhbnQoYilcbiAgICAgIDogKHQgPT09IFwibnVtYmVyXCIgPyBudW1iZXJcbiAgICAgIDogdCA9PT0gXCJzdHJpbmdcIiA/ICgoYyA9IGNvbG9yKGIpKSA/IChiID0gYywgcmdiKSA6IHN0cmluZylcbiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gcmdiXG4gICAgICA6IGIgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZVxuICAgICAgOiBpc051bWJlckFycmF5KGIpID8gbnVtYmVyQXJyYXlcbiAgICAgIDogQXJyYXkuaXNBcnJheShiKSA/IGdlbmVyaWNBcnJheVxuICAgICAgOiB0eXBlb2YgYi52YWx1ZU9mICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGIudG9TdHJpbmcgIT09IFwiZnVuY3Rpb25cIiB8fCBpc05hTihiKSA/IG9iamVjdFxuICAgICAgOiBudW1iZXIpKGEsIGIpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoYSAqICgxIC0gdCkgKyBiICogdCk7XG4gIH07XG59XG4iLCAidmFyIGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJO1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0ge1xuICB0cmFuc2xhdGVYOiAwLFxuICB0cmFuc2xhdGVZOiAwLFxuICByb3RhdGU6IDAsXG4gIHNrZXdYOiAwLFxuICBzY2FsZVg6IDEsXG4gIHNjYWxlWTogMVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYiwgYywgZCwgZSwgZikge1xuICB2YXIgc2NhbGVYLCBzY2FsZVksIHNrZXdYO1xuICBpZiAoc2NhbGVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpKSBhIC89IHNjYWxlWCwgYiAvPSBzY2FsZVg7XG4gIGlmIChza2V3WCA9IGEgKiBjICsgYiAqIGQpIGMgLT0gYSAqIHNrZXdYLCBkIC09IGIgKiBza2V3WDtcbiAgaWYgKHNjYWxlWSA9IE1hdGguc3FydChjICogYyArIGQgKiBkKSkgYyAvPSBzY2FsZVksIGQgLz0gc2NhbGVZLCBza2V3WCAvPSBzY2FsZVk7XG4gIGlmIChhICogZCA8IGIgKiBjKSBhID0gLWEsIGIgPSAtYiwgc2tld1ggPSAtc2tld1gsIHNjYWxlWCA9IC1zY2FsZVg7XG4gIHJldHVybiB7XG4gICAgdHJhbnNsYXRlWDogZSxcbiAgICB0cmFuc2xhdGVZOiBmLFxuICAgIHJvdGF0ZTogTWF0aC5hdGFuMihiLCBhKSAqIGRlZ3JlZXMsXG4gICAgc2tld1g6IE1hdGguYXRhbihza2V3WCkgKiBkZWdyZWVzLFxuICAgIHNjYWxlWDogc2NhbGVYLFxuICAgIHNjYWxlWTogc2NhbGVZXG4gIH07XG59XG4iLCAiaW1wb3J0IGRlY29tcG9zZSwge2lkZW50aXR5fSBmcm9tIFwiLi9kZWNvbXBvc2UuanNcIjtcblxudmFyIHN2Z05vZGU7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDc3ModmFsdWUpIHtcbiAgY29uc3QgbSA9IG5ldyAodHlwZW9mIERPTU1hdHJpeCA9PT0gXCJmdW5jdGlvblwiID8gRE9NTWF0cml4IDogV2ViS2l0Q1NTTWF0cml4KSh2YWx1ZSArIFwiXCIpO1xuICByZXR1cm4gbS5pc0lkZW50aXR5ID8gaWRlbnRpdHkgOiBkZWNvbXBvc2UobS5hLCBtLmIsIG0uYywgbS5kLCBtLmUsIG0uZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN2Zyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5O1xuICBpZiAoIXN2Z05vZGUpIHN2Z05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gIHN2Z05vZGUuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIHZhbHVlKTtcbiAgaWYgKCEodmFsdWUgPSBzdmdOb2RlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHZhbHVlID0gdmFsdWUubWF0cml4O1xuICByZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsIHZhbHVlLmIsIHZhbHVlLmMsIHZhbHVlLmQsIHZhbHVlLmUsIHZhbHVlLmYpO1xufVxuIiwgImltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlci5qc1wiO1xuaW1wb3J0IHtwYXJzZUNzcywgcGFyc2VTdmd9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikge1xuXG4gIGZ1bmN0aW9uIHBvcChzKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArIFwiIFwiIDogXCJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChcInRyYW5zbGF0ZShcIiwgbnVsbCwgcHhDb21tYSwgbnVsbCwgcHhQYXJlbik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7XG4gICAgICBzLnB1c2goXCJ0cmFuc2xhdGUoXCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aFxuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiArIHhiICsgXCIsXCIgKyB5YiArIFwiKVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG4gICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7XG4gICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7XG4gICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7XG4gICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7XG4gICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpO1xuICAgIGEgPSBiID0gbnVsbDsgLy8gZ2NcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlQ3NzLCBcInB4LCBcIiwgXCJweClcIiwgXCJkZWcpXCIpO1xuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCBcIiwgXCIsIFwiKVwiLCBcIilcIik7XG4iLCAidmFyIGVwc2lsb24yID0gMWUtMTI7XG5cbmZ1bmN0aW9uIGNvc2goeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjtcbn1cblxuZnVuY3Rpb24gc2luaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgLSAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiB0YW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKDIgKiB4KSkgLSAxKSAvICh4ICsgMSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiB6b29tUmhvKHJobywgcmhvMiwgcmhvNCkge1xuXG4gIC8vIHAwID0gW3V4MCwgdXkwLCB3MF1cbiAgLy8gcDEgPSBbdXgxLCB1eTEsIHcxXVxuICBmdW5jdGlvbiB6b29tKHAwLCBwMSkge1xuICAgIHZhciB1eDAgPSBwMFswXSwgdXkwID0gcDBbMV0sIHcwID0gcDBbMl0sXG4gICAgICAgIHV4MSA9IHAxWzBdLCB1eTEgPSBwMVsxXSwgdzEgPSBwMVsyXSxcbiAgICAgICAgZHggPSB1eDEgLSB1eDAsXG4gICAgICAgIGR5ID0gdXkxIC0gdXkwLFxuICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5LFxuICAgICAgICBpLFxuICAgICAgICBTO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIGZvciB1MCBcdTIyNDUgdTEuXG4gICAgaWYgKGQyIDwgZXBzaWxvbjIpIHtcbiAgICAgIFMgPSBNYXRoLmxvZyh3MSAvIHcwKSAvIHJobztcbiAgICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgdXgwICsgdCAqIGR4LFxuICAgICAgICAgIHV5MCArIHQgKiBkeSxcbiAgICAgICAgICB3MCAqIE1hdGguZXhwKHJobyAqIHQgKiBTKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdlbmVyYWwgY2FzZS5cbiAgICBlbHNlIHtcbiAgICAgIHZhciBkMSA9IE1hdGguc3FydChkMiksXG4gICAgICAgICAgYjAgPSAodzEgKiB3MSAtIHcwICogdzAgKyByaG80ICogZDIpIC8gKDIgKiB3MCAqIHJobzIgKiBkMSksXG4gICAgICAgICAgYjEgPSAodzEgKiB3MSAtIHcwICogdzAgLSByaG80ICogZDIpIC8gKDIgKiB3MSAqIHJobzIgKiBkMSksXG4gICAgICAgICAgcjAgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjAgKiBiMCArIDEpIC0gYjApLFxuICAgICAgICAgIHIxID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIxICogYjEgKyAxKSAtIGIxKTtcbiAgICAgIFMgPSAocjEgLSByMCkgLyByaG87XG4gICAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgICB2YXIgcyA9IHQgKiBTLFxuICAgICAgICAgICAgY29zaHIwID0gY29zaChyMCksXG4gICAgICAgICAgICB1ID0gdzAgLyAocmhvMiAqIGQxKSAqIChjb3NocjAgKiB0YW5oKHJobyAqIHMgKyByMCkgLSBzaW5oKHIwKSk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgdXgwICsgdSAqIGR4LFxuICAgICAgICAgIHV5MCArIHUgKiBkeSxcbiAgICAgICAgICB3MCAqIGNvc2hyMCAvIGNvc2gocmhvICogcyArIHIwKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGkuZHVyYXRpb24gPSBTICogMTAwMCAqIHJobyAvIE1hdGguU1FSVDI7XG5cbiAgICByZXR1cm4gaTtcbiAgfVxuXG4gIHpvb20ucmhvID0gZnVuY3Rpb24oXykge1xuICAgIHZhciBfMSA9IE1hdGgubWF4KDFlLTMsICtfKSwgXzIgPSBfMSAqIF8xLCBfNCA9IF8yICogXzI7XG4gICAgcmV0dXJuIHpvb21SaG8oXzEsIF8yLCBfNCk7XG4gIH07XG5cbiAgcmV0dXJuIHpvb207XG59KShNYXRoLlNRUlQyLCAyLCA0KTtcbiIsICJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2VcdTIwMTl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVuXHUyMDE5dCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7XG4gICAgdCA9IHQuX25leHQ7XG4gIH1cbiAgLS1mcmFtZTtcbn1cblxuZnVuY3Rpb24gd2FrZSgpIHtcbiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3O1xuICBmcmFtZSA9IHRpbWVvdXQgPSAwO1xuICB0cnkge1xuICAgIHRpbWVyRmx1c2goKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcmFtZSA9IDA7XG4gICAgbmFwKCk7XG4gICAgY2xvY2tOb3cgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBva2UoKSB7XG4gIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7XG4gIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7XG59XG5cbmZ1bmN0aW9uIG5hcCgpIHtcbiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5O1xuICB3aGlsZSAodDEpIHtcbiAgICBpZiAodDEuX2NhbGwpIHtcbiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTtcbiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDtcbiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjtcbiAgICB9XG4gIH1cbiAgdGFza1RhaWwgPSB0MDtcbiAgc2xlZXAodGltZSk7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHtcbiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuXG4gIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LlxuICBpZiAoZGVsYXkgPiAyNCkge1xuICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAtIGNsb2NrU2tldyk7XG4gICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7XG4gICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTtcbiAgfVxufVxuIiwgImltcG9ydCB7VGltZXJ9IGZyb20gXCIuL3RpbWVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgZGVsYXkgPSBkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheTtcbiAgdC5yZXN0YXJ0KGVsYXBzZWQgPT4ge1xuICAgIHQuc3RvcCgpO1xuICAgIGNhbGxiYWNrKGVsYXBzZWQgKyBkZWxheSk7XG4gIH0sIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG4iLCAiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge3RpbWVyLCB0aW1lb3V0fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGVtcHR5T24gPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiZW5kXCIsIFwiY2FuY2VsXCIsIFwiaW50ZXJydXB0XCIpO1xudmFyIGVtcHR5VHdlZW4gPSBbXTtcblxuZXhwb3J0IHZhciBDUkVBVEVEID0gMDtcbmV4cG9ydCB2YXIgU0NIRURVTEVEID0gMTtcbmV4cG9ydCB2YXIgU1RBUlRJTkcgPSAyO1xuZXhwb3J0IHZhciBTVEFSVEVEID0gMztcbmV4cG9ydCB2YXIgUlVOTklORyA9IDQ7XG5leHBvcnQgdmFyIEVORElORyA9IDU7XG5leHBvcnQgdmFyIEVOREVEID0gNjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSwgaWQsIGluZGV4LCBncm91cCwgdGltaW5nKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZXMpIG5vZGUuX190cmFuc2l0aW9uID0ge307XG4gIGVsc2UgaWYgKGlkIGluIHNjaGVkdWxlcykgcmV0dXJuO1xuICBjcmVhdGUobm9kZSwgaWQsIHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIGluZGV4OiBpbmRleCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLlxuICAgIGdyb3VwOiBncm91cCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLlxuICAgIG9uOiBlbXB0eU9uLFxuICAgIHR3ZWVuOiBlbXB0eVR3ZWVuLFxuICAgIHRpbWU6IHRpbWluZy50aW1lLFxuICAgIGRlbGF5OiB0aW1pbmcuZGVsYXksXG4gICAgZHVyYXRpb246IHRpbWluZy5kdXJhdGlvbixcbiAgICBlYXNlOiB0aW1pbmcuZWFzZSxcbiAgICB0aW1lcjogbnVsbCxcbiAgICBzdGF0ZTogQ1JFQVRFRFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gZ2V0KG5vZGUsIGlkKTtcbiAgaWYgKHNjaGVkdWxlLnN0YXRlID4gQ1JFQVRFRCkgdGhyb3cgbmV3IEVycm9yKFwidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gZ2V0KG5vZGUsIGlkKTtcbiAgaWYgKHNjaGVkdWxlLnN0YXRlID4gU1RBUlRFRCkgdGhyb3cgbmV3IEVycm9yKFwidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZ1wiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uO1xuICBpZiAoIXNjaGVkdWxlIHx8ICEoc2NoZWR1bGUgPSBzY2hlZHVsZVtpZF0pKSB0aHJvdyBuZXcgRXJyb3IoXCJ0cmFuc2l0aW9uIG5vdCBmb3VuZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGUobm9kZSwgaWQsIHNlbGYpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgdHdlZW47XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgc2VsZiB0aW1lciB3aGVuIHRoZSB0cmFuc2l0aW9uIGlzIGNyZWF0ZWQuXG4gIC8vIE5vdGUgdGhlIGFjdHVhbCBkZWxheSBpcyBub3Qga25vd24gdW50aWwgdGhlIGZpcnN0IGNhbGxiYWNrIVxuICBzY2hlZHVsZXNbaWRdID0gc2VsZjtcbiAgc2VsZi50aW1lciA9IHRpbWVyKHNjaGVkdWxlLCAwLCBzZWxmLnRpbWUpO1xuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHtcbiAgICBzZWxmLnN0YXRlID0gU0NIRURVTEVEO1xuICAgIHNlbGYudGltZXIucmVzdGFydChzdGFydCwgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcblxuICAgIC8vIElmIHRoZSBlbGFwc2VkIGRlbGF5IGlzIGxlc3MgdGhhbiBvdXIgZmlyc3Qgc2xlZXAsIHN0YXJ0IGltbWVkaWF0ZWx5LlxuICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHtcbiAgICB2YXIgaSwgaiwgbiwgbztcblxuICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBub3QgU0NIRURVTEVELCB0aGVuIHdlIHByZXZpb3VzbHkgZXJyb3JlZCBvbiBzdGFydC5cbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU0NIRURVTEVEKSByZXR1cm4gc3RvcCgpO1xuXG4gICAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgICAgbyA9IHNjaGVkdWxlc1tpXTtcbiAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7XG5cbiAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsXG4gICAgICAvLyBkZWZlciBzdGFydGluZyBhbiBpbnRlcnJ1cHRpbmcgdHJhbnNpdGlvbiB1bnRpbCB0aGF0IHRyYW5zaXRpb24gaGFzIGFcbiAgICAgIC8vIGNoYW5jZSB0byB0aWNrIChhbmQgcG9zc2libHkgZW5kKTsgc2VlIGQzL2QzLXRyYW5zaXRpb24jNTQhXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCkgcmV0dXJuIHRpbWVvdXQoc3RhcnQpO1xuXG4gICAgICAvLyBJbnRlcnJ1cHQgdGhlIGFjdGl2ZSB0cmFuc2l0aW9uLCBpZiBhbnkuXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gUlVOTklORykge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJpbnRlcnJ1cHRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgcHJlLWVtcHRlZCB0cmFuc2l0aW9ucy5cbiAgICAgIGVsc2UgaWYgKCtpIDwgaWQpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuXG4gICAgLy8gTm90ZSB0aGUgdHJhbnNpdGlvbiBtYXkgYmUgY2FuY2VsZWQgYWZ0ZXIgc3RhcnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGljayFcbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBzY2hlZHVsZWQgYmVmb3JlIHRoZSBzdGFydCBldmVudDsgc2VlIGQzL2QzLXRyYW5zaXRpb24jMTYhXG4gICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLlxuICAgIHRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gU1RBUlRFRCkge1xuICAgICAgICBzZWxmLnN0YXRlID0gUlVOTklORztcbiAgICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHRpY2ssIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG4gICAgICAgIHRpY2soZWxhcHNlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgc3RhcnQgZXZlbnQuXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHR3ZWVuIGFyZSBpbml0aWFsaXplZC5cbiAgICBzZWxmLnN0YXRlID0gU1RBUlRJTkc7XG4gICAgc2VsZi5vbi5jYWxsKFwic3RhcnRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNUQVJUSU5HKSByZXR1cm47IC8vIGludGVycnVwdGVkXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJURUQ7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSB0d2VlbiwgZGVsZXRpbmcgbnVsbCB0d2Vlbi5cbiAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpO1xuICAgIGZvciAoaSA9IDAsIGogPSAtMTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG8gPSBzZWxmLnR3ZWVuW2ldLnZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCkpIHtcbiAgICAgICAgdHdlZW5bKytqXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxO1xuICB9XG5cbiAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7XG4gICAgdmFyIHQgPSBlbGFwc2VkIDwgc2VsZi5kdXJhdGlvbiA/IHNlbGYuZWFzZS5jYWxsKG51bGwsIGVsYXBzZWQgLyBzZWxmLmR1cmF0aW9uKSA6IChzZWxmLnRpbWVyLnJlc3RhcnQoc3RvcCksIHNlbGYuc3RhdGUgPSBFTkRJTkcsIDEpLFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIG4gPSB0d2Vlbi5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgdHdlZW5baV0uY2FsbChub2RlLCB0KTtcbiAgICB9XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50LlxuICAgIGlmIChzZWxmLnN0YXRlID09PSBFTkRJTkcpIHtcbiAgICAgIHNlbGYub24uY2FsbChcImVuZFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICAgIHN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHNlbGYuc3RhdGUgPSBFTkRFRDtcbiAgICBzZWxmLnRpbWVyLnN0b3AoKTtcbiAgICBkZWxldGUgc2NoZWR1bGVzW2lkXTtcbiAgICBmb3IgKHZhciBpIGluIHNjaGVkdWxlcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHtTVEFSVElORywgRU5ESU5HLCBFTkRFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgYWN0aXZlLFxuICAgICAgZW1wdHkgPSB0cnVlLFxuICAgICAgaTtcblxuICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuO1xuXG4gIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG5cbiAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsgZW1wdHkgPSBmYWxzZTsgY29udGludWU7IH1cbiAgICBhY3RpdmUgPSBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HICYmIHNjaGVkdWxlLnN0YXRlIDwgRU5ESU5HO1xuICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7XG4gICAgc2NoZWR1bGUudGltZXIuc3RvcCgpO1xuICAgIHNjaGVkdWxlLm9uLmNhbGwoYWN0aXZlID8gXCJpbnRlcnJ1cHRcIiA6IFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNjaGVkdWxlLmluZGV4LCBzY2hlZHVsZS5ncm91cCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgfVxuXG4gIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xufVxuIiwgImltcG9ydCBpbnRlcnJ1cHQgZnJvbSBcIi4uL2ludGVycnVwdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgaW50ZXJydXB0KHRoaXMsIG5hbWUpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiB0d2VlblJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgdHdlZW4wLCB0d2VlbjE7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2VcdTIwMTlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gdHdlZW4wID0gdHdlZW47XG4gICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xID0gdHdlZW4xLnNsaWNlKCk7XG4gICAgICAgICAgdHdlZW4xLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0d2VlbkZ1bmN0aW9uKGlkLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgdHdlZW4wLCB0d2VlbjE7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdlXHUyMDE5cmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9ICh0d2VlbjAgPSB0d2Vlbikuc2xpY2UoKTtcbiAgICAgIGZvciAodmFyIHQgPSB7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfSwgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMVtpXSA9IHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpID09PSBuKSB0d2VlbjEucHVzaCh0KTtcbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgbmFtZSArPSBcIlwiO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciB0d2VlbiA9IGdldCh0aGlzLm5vZGUoKSwgaWQpLnR3ZWVuO1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4ubGVuZ3RoLCB0OyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKHQgPSB0d2VlbltpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gdC52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gdHdlZW5SZW1vdmUgOiB0d2VlbkZ1bmN0aW9uKShpZCwgbmFtZSwgdmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR3ZWVuVmFsdWUodHJhbnNpdGlvbiwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlkID0gdHJhbnNpdGlvbi5faWQ7XG5cbiAgdHJhbnNpdGlvbi5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCk7XG4gICAgKHNjaGVkdWxlLnZhbHVlIHx8IChzY2hlZHVsZS52YWx1ZSA9IHt9KSlbbmFtZV0gPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBnZXQobm9kZSwgaWQpLnZhbHVlW25hbWVdO1xuICB9O1xufVxuIiwgImltcG9ydCB7Y29sb3J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZU51bWJlciwgaW50ZXJwb2xhdGVSZ2IsIGludGVycG9sYXRlU3RyaW5nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYztcbiAgcmV0dXJuICh0eXBlb2YgYiA9PT0gXCJudW1iZXJcIiA/IGludGVycG9sYXRlTnVtYmVyXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IGludGVycG9sYXRlUmdiXG4gICAgICA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYilcbiAgICAgIDogaW50ZXJwb2xhdGVTdHJpbmcpKGEsIGIpO1xufVxuIiwgImltcG9ydCB7aW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgYXMgaW50ZXJwb2xhdGVUcmFuc2Zvcm19IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpLCBpID0gZnVsbG5hbWUgPT09IFwidHJhbnNmb3JtXCIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybSA6IGludGVycG9sYXRlO1xuICByZXR1cm4gdGhpcy5hdHRyVHdlZW4obmFtZSwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pKGZ1bGxuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwiYXR0ci5cIiArIG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdmFsdWUgPT0gbnVsbCA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpKGZ1bGxuYW1lKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkoZnVsbG5hbWUsIGksIHZhbHVlKSk7XG59XG4iLCAiaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2VlbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGtleSA9IFwiYXR0ci5cIiArIG5hbWU7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsICJpbXBvcnQge2dldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlbGF5Q29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZGVsYXlGdW5jdGlvblxuICAgICAgICAgIDogZGVsYXlDb25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7XG59XG4iLCAiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZHVyYXRpb25GdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGR1cmF0aW9uRnVuY3Rpb25cbiAgICAgICAgICA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmR1cmF0aW9uO1xufVxuIiwgImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKGVhc2VDb25zdGFudChpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5lYXNlO1xufVxuIiwgImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlVmFyeWluZyhpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodHlwZW9mIHYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy5lYWNoKGVhc2VWYXJ5aW5nKHRoaXMuX2lkLCB2YWx1ZSkpO1xufVxuIiwgImltcG9ydCB7bWF0Y2hlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwgImltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHJhbnNpdGlvbikge1xuICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3I7XG5cbiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHRyYW5zaXRpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwgImltcG9ydCB7Z2V0LCBzZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHtcbiAgcmV0dXJuIChuYW1lICsgXCJcIikudHJpbSgpLnNwbGl0KC9efFxccysvKS5ldmVyeShmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiAhdCB8fCB0ID09PSBcInN0YXJ0XCI7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdlXHUyMDE5cmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMlxuICAgICAgPyBnZXQodGhpcy5ub2RlKCksIGlkKS5vbi5vbihuYW1lKVxuICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTtcbn1cbiIsICJmdW5jdGlvbiByZW1vdmVGdW5jdGlvbihpZCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMub24oXCJlbmQucmVtb3ZlXCIsIHJlbW92ZUZ1bmN0aW9uKHRoaXMuX2lkKSk7XG59XG4iLCAiaW1wb3J0IHtzZWxlY3Rvcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgICAgc2NoZWR1bGUoc3ViZ3JvdXBbaV0sIG5hbWUsIGlkLCBpLCBzdWJncm91cCwgZ2V0KG5vZGUsIGlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwgImltcG9ydCB7c2VsZWN0b3JBbGx9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSwgY2hpbGQsIGluaGVyaXQgPSBnZXQobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykge1xuICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7XG4gICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwgImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbnZhciBTZWxlY3Rpb24gPSBzZWxlY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsICJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtQ3NzIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7c3R5bGV9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlTnVsbChuYW1lLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHN0cmluZzEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpLFxuICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHN0cmluZzEgPSB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVNYXliZVJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgb24wLCBvbjEsIGxpc3RlbmVyMCwga2V5ID0gXCJzdHlsZS5cIiArIG5hbWUsIGV2ZW50ID0gXCJlbmQuXCIgKyBrZXksIHJlbW92ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub24sXG4gICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBudWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZShuYW1lKSkgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdlXHUyMDE5cmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgaSA9IChuYW1lICs9IFwiXCIpID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZU51bGwobmFtZSwgaSkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBzdHlsZVJlbW92ZShuYW1lKSlcbiAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVGdW5jdGlvbihuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwic3R5bGUuXCIgKyBuYW1lLCB2YWx1ZSkpKVxuICAgICAgLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpXG4gICAgOiB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUNvbnN0YW50KG5hbWUsIGksIHZhbHVlKSwgcHJpb3JpdHkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBudWxsKTtcbn1cbiIsICJmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIHQsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0ID0gKGkwID0gaSkgJiYgc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSk7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBrZXkgPSBcInN0eWxlLlwiICsgKG5hbWUgKz0gXCJcIik7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSk7XG59XG4iLCAiaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUxID0gdmFsdWUodGhpcyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gXCJcIiA6IHZhbHVlMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMudHdlZW4oXCJ0ZXh0XCIsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHRleHRGdW5jdGlvbih0d2VlblZhbHVlKHRoaXMsIFwidGV4dFwiLCB2YWx1ZSkpXG4gICAgICA6IHRleHRDb25zdGFudCh2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIikpO1xufVxuIiwgImZ1bmN0aW9uIHRleHRJbnRlcnBvbGF0ZShpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IGkuY2FsbCh0aGlzLCB0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dFR3ZWVuKHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgdGV4dEludGVycG9sYXRlKGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJ0ZXh0XCI7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCB0ZXh0VHdlZW4odmFsdWUpKTtcbn1cbiIsICJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQwID0gdGhpcy5faWQsXG4gICAgICBpZDEgPSBuZXdJZCgpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHZhciBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkMCk7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHtcbiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBkZWxheTogMCxcbiAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTtcbn1cbiIsICJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBvbjAsIG9uMSwgdGhhdCA9IHRoaXMsIGlkID0gdGhhdC5faWQsIHNpemUgPSB0aGF0LnNpemUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBjYW5jZWwgPSB7dmFsdWU6IHJlamVjdH0sXG4gICAgICAgIGVuZCA9IHt2YWx1ZTogZnVuY3Rpb24oKSB7IGlmICgtLXNpemUgPT09IDApIHJlc29sdmUoKTsgfX07XG5cbiAgICB0aGF0LmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZVx1MjAxOXJlIGRvbmUhXG4gICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgICBpZiAob24gIT09IG9uMCkge1xuICAgICAgICBvbjEgPSAob24wID0gb24pLmNvcHkoKTtcbiAgICAgICAgb24xLl8uY2FuY2VsLnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uaW50ZXJydXB0LnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uZW5kLnB1c2goZW5kKTtcbiAgICAgIH1cblxuICAgICAgc2NoZWR1bGUub24gPSBvbjE7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgc2VsZWN0aW9uIHdhcyBlbXB0eSwgcmVzb2x2ZSBlbmQgaW1tZWRpYXRlbHlcbiAgICBpZiAoc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9hdHRyVHdlZW4gZnJvbSBcIi4vYXR0clR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9kZWxheSBmcm9tIFwiLi9kZWxheS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2UgZnJvbSBcIi4vZWFzZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZWFzZVZhcnlpbmcgZnJvbSBcIi4vZWFzZVZhcnlpbmcuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9vbiBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0aW9uIGZyb20gXCIuL3NlbGVjdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlVHdlZW4gZnJvbSBcIi4vc3R5bGVUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90ZXh0VHdlZW4gZnJvbSBcIi4vdGV4dFR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3R3ZWVuIGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lbmQgZnJvbSBcIi4vZW5kLmpzXCI7XG5cbnZhciBpZCA9IDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2l0aW9uKGdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbiAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIHRoaXMuX2lkID0gaWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb24obmFtZSkge1xuICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld0lkKCkge1xuICByZXR1cm4gKytpZDtcbn1cblxudmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlO1xuXG5UcmFuc2l0aW9uLnByb3RvdHlwZSA9IHRyYW5zaXRpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNpdGlvbixcbiAgc2VsZWN0OiB0cmFuc2l0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGQsXG4gIHNlbGVjdENoaWxkcmVuOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHRyYW5zaXRpb25fZmlsdGVyLFxuICBtZXJnZTogdHJhbnNpdGlvbl9tZXJnZSxcbiAgc2VsZWN0aW9uOiB0cmFuc2l0aW9uX3NlbGVjdGlvbixcbiAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbl90cmFuc2l0aW9uLFxuICBjYWxsOiBzZWxlY3Rpb25fcHJvdG90eXBlLmNhbGwsXG4gIG5vZGVzOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2l6ZSxcbiAgZW1wdHk6IHNlbGVjdGlvbl9wcm90b3R5cGUuZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9wcm90b3R5cGUuZWFjaCxcbiAgb246IHRyYW5zaXRpb25fb24sXG4gIGF0dHI6IHRyYW5zaXRpb25fYXR0cixcbiAgYXR0clR3ZWVuOiB0cmFuc2l0aW9uX2F0dHJUd2VlbixcbiAgc3R5bGU6IHRyYW5zaXRpb25fc3R5bGUsXG4gIHN0eWxlVHdlZW46IHRyYW5zaXRpb25fc3R5bGVUd2VlbixcbiAgdGV4dDogdHJhbnNpdGlvbl90ZXh0LFxuICB0ZXh0VHdlZW46IHRyYW5zaXRpb25fdGV4dFR3ZWVuLFxuICByZW1vdmU6IHRyYW5zaXRpb25fcmVtb3ZlLFxuICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbixcbiAgZGVsYXk6IHRyYW5zaXRpb25fZGVsYXksXG4gIGR1cmF0aW9uOiB0cmFuc2l0aW9uX2R1cmF0aW9uLFxuICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UsXG4gIGVhc2VWYXJ5aW5nOiB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nLFxuICBlbmQ6IHRyYW5zaXRpb25fZW5kLFxuICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX3Byb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdXG59O1xuIiwgImV4cG9ydCBmdW5jdGlvbiBjdWJpY0luKHQpIHtcbiAgcmV0dXJuIHQgKiB0ICogdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljT3V0KHQpIHtcbiAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyO1xufVxuIiwgImltcG9ydCB7VHJhbnNpdGlvbiwgbmV3SWR9IGZyb20gXCIuLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUgZnJvbSBcIi4uL3RyYW5zaXRpb24vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7ZWFzZUN1YmljSW5PdXR9IGZyb20gXCJkMy1lYXNlXCI7XG5pbXBvcnQge25vd30gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBkZWZhdWx0VGltaW5nID0ge1xuICB0aW1lOiBudWxsLCAvLyBTZXQgb24gdXNlLlxuICBkZWxheTogMCxcbiAgZHVyYXRpb246IDI1MCxcbiAgZWFzZTogZWFzZUN1YmljSW5PdXRcbn07XG5cbmZ1bmN0aW9uIGluaGVyaXQobm9kZSwgaWQpIHtcbiAgdmFyIHRpbWluZztcbiAgd2hpbGUgKCEodGltaW5nID0gbm9kZS5fX3RyYW5zaXRpb24pIHx8ICEodGltaW5nID0gdGltaW5nW2lkXSkpIHtcbiAgICBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0cmFuc2l0aW9uICR7aWR9IG5vdCBmb3VuZGApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGltaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBpZCxcbiAgICAgIHRpbWluZztcblxuICBpZiAobmFtZSBpbnN0YW5jZW9mIFRyYW5zaXRpb24pIHtcbiAgICBpZCA9IG5hbWUuX2lkLCBuYW1lID0gbmFtZS5fbmFtZTtcbiAgfSBlbHNlIHtcbiAgICBpZCA9IG5ld0lkKCksICh0aW1pbmcgPSBkZWZhdWx0VGltaW5nKS50aW1lID0gbm93KCksIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG4gIH1cblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZCwgaSwgZ3JvdXAsIHRpbWluZyB8fCBpbmhlcml0KG5vZGUsIGlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwgImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ludGVycnVwdCBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5cbnNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDtcbnNlbGVjdGlvbi5wcm90b3R5cGUudHJhbnNpdGlvbiA9IHNlbGVjdGlvbl90cmFuc2l0aW9uO1xuIiwgImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHtkcmFnRGlzYWJsZSwgZHJhZ0VuYWJsZX0gZnJvbSBcImQzLWRyYWdcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGV9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtwb2ludGVyLCBzZWxlY3R9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7aW50ZXJydXB0fSBmcm9tIFwiZDMtdHJhbnNpdGlvblwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgQnJ1c2hFdmVudCBmcm9tIFwiLi9ldmVudC5qc1wiO1xuaW1wb3J0IG5vZXZlbnQsIHtub3Byb3BhZ2F0aW9ufSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbnZhciBNT0RFX0RSQUcgPSB7bmFtZTogXCJkcmFnXCJ9LFxuICAgIE1PREVfU1BBQ0UgPSB7bmFtZTogXCJzcGFjZVwifSxcbiAgICBNT0RFX0hBTkRMRSA9IHtuYW1lOiBcImhhbmRsZVwifSxcbiAgICBNT0RFX0NFTlRFUiA9IHtuYW1lOiBcImNlbnRlclwifTtcblxuY29uc3Qge2FicywgbWF4LCBtaW59ID0gTWF0aDtcblxuZnVuY3Rpb24gbnVtYmVyMShlKSB7XG4gIHJldHVybiBbK2VbMF0sICtlWzFdXTtcbn1cblxuZnVuY3Rpb24gbnVtYmVyMihlKSB7XG4gIHJldHVybiBbbnVtYmVyMShlWzBdKSwgbnVtYmVyMShlWzFdKV07XG59XG5cbnZhciBYID0ge1xuICBuYW1lOiBcInhcIixcbiAgaGFuZGxlczogW1wid1wiLCBcImVcIl0ubWFwKHR5cGUpLFxuICBpbnB1dDogZnVuY3Rpb24oeCwgZSkgeyByZXR1cm4geCA9PSBudWxsID8gbnVsbCA6IFtbK3hbMF0sIGVbMF1bMV1dLCBbK3hbMV0sIGVbMV1bMV1dXTsgfSxcbiAgb3V0cHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHkgJiYgW3h5WzBdWzBdLCB4eVsxXVswXV07IH1cbn07XG5cbnZhciBZID0ge1xuICBuYW1lOiBcInlcIixcbiAgaGFuZGxlczogW1wiblwiLCBcInNcIl0ubWFwKHR5cGUpLFxuICBpbnB1dDogZnVuY3Rpb24oeSwgZSkgeyByZXR1cm4geSA9PSBudWxsID8gbnVsbCA6IFtbZVswXVswXSwgK3lbMF1dLCBbZVsxXVswXSwgK3lbMV1dXTsgfSxcbiAgb3V0cHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHkgJiYgW3h5WzBdWzFdLCB4eVsxXVsxXV07IH1cbn07XG5cbnZhciBYWSA9IHtcbiAgbmFtZTogXCJ4eVwiLFxuICBoYW5kbGVzOiBbXCJuXCIsIFwid1wiLCBcImVcIiwgXCJzXCIsIFwibndcIiwgXCJuZVwiLCBcInN3XCIsIFwic2VcIl0ubWFwKHR5cGUpLFxuICBpbnB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5ID09IG51bGwgPyBudWxsIDogbnVtYmVyMih4eSk7IH0sXG4gIG91dHB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5OyB9XG59O1xuXG52YXIgY3Vyc29ycyA9IHtcbiAgb3ZlcmxheTogXCJjcm9zc2hhaXJcIixcbiAgc2VsZWN0aW9uOiBcIm1vdmVcIixcbiAgbjogXCJucy1yZXNpemVcIixcbiAgZTogXCJldy1yZXNpemVcIixcbiAgczogXCJucy1yZXNpemVcIixcbiAgdzogXCJldy1yZXNpemVcIixcbiAgbnc6IFwibndzZS1yZXNpemVcIixcbiAgbmU6IFwibmVzdy1yZXNpemVcIixcbiAgc2U6IFwibndzZS1yZXNpemVcIixcbiAgc3c6IFwibmVzdy1yZXNpemVcIlxufTtcblxudmFyIGZsaXBYID0ge1xuICBlOiBcIndcIixcbiAgdzogXCJlXCIsXG4gIG53OiBcIm5lXCIsXG4gIG5lOiBcIm53XCIsXG4gIHNlOiBcInN3XCIsXG4gIHN3OiBcInNlXCJcbn07XG5cbnZhciBmbGlwWSA9IHtcbiAgbjogXCJzXCIsXG4gIHM6IFwiblwiLFxuICBudzogXCJzd1wiLFxuICBuZTogXCJzZVwiLFxuICBzZTogXCJuZVwiLFxuICBzdzogXCJud1wiXG59O1xuXG52YXIgc2lnbnNYID0ge1xuICBvdmVybGF5OiArMSxcbiAgc2VsZWN0aW9uOiArMSxcbiAgbjogbnVsbCxcbiAgZTogKzEsXG4gIHM6IG51bGwsXG4gIHc6IC0xLFxuICBudzogLTEsXG4gIG5lOiArMSxcbiAgc2U6ICsxLFxuICBzdzogLTFcbn07XG5cbnZhciBzaWduc1kgPSB7XG4gIG92ZXJsYXk6ICsxLFxuICBzZWxlY3Rpb246ICsxLFxuICBuOiAtMSxcbiAgZTogbnVsbCxcbiAgczogKzEsXG4gIHc6IG51bGwsXG4gIG53OiAtMSxcbiAgbmU6IC0xLFxuICBzZTogKzEsXG4gIHN3OiArMVxufTtcblxuZnVuY3Rpb24gdHlwZSh0KSB7XG4gIHJldHVybiB7dHlwZTogdH07XG59XG5cbi8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LlxuZnVuY3Rpb24gZGVmYXVsdEZpbHRlcihldmVudCkge1xuICByZXR1cm4gIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmJ1dHRvbjtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEV4dGVudCgpIHtcbiAgdmFyIHN2ZyA9IHRoaXMub3duZXJTVkdFbGVtZW50IHx8IHRoaXM7XG4gIGlmIChzdmcuaGFzQXR0cmlidXRlKFwidmlld0JveFwiKSkge1xuICAgIHN2ZyA9IHN2Zy52aWV3Qm94LmJhc2VWYWw7XG4gICAgcmV0dXJuIFtbc3ZnLngsIHN2Zy55XSwgW3N2Zy54ICsgc3ZnLndpZHRoLCBzdmcueSArIHN2Zy5oZWlnaHRdXTtcbiAgfVxuICByZXR1cm4gW1swLCAwXSwgW3N2Zy53aWR0aC5iYXNlVmFsLnZhbHVlLCBzdmcuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoXCJvbnRvdWNoc3RhcnRcIiBpbiB0aGlzKTtcbn1cblxuLy8gTGlrZSBkMy5sb2NhbCwgYnV0IHdpdGggdGhlIG5hbWUgXHUyMDFDX19icnVzaFx1MjAxRCByYXRoZXIgdGhhbiBhdXRvLWdlbmVyYXRlZC5cbmZ1bmN0aW9uIGxvY2FsKG5vZGUpIHtcbiAgd2hpbGUgKCFub2RlLl9fYnJ1c2gpIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm47XG4gIHJldHVybiBub2RlLl9fYnJ1c2g7XG59XG5cbmZ1bmN0aW9uIGVtcHR5KGV4dGVudCkge1xuICByZXR1cm4gZXh0ZW50WzBdWzBdID09PSBleHRlbnRbMV1bMF1cbiAgICAgIHx8IGV4dGVudFswXVsxXSA9PT0gZXh0ZW50WzFdWzFdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJ1c2hTZWxlY3Rpb24obm9kZSkge1xuICB2YXIgc3RhdGUgPSBub2RlLl9fYnJ1c2g7XG4gIHJldHVybiBzdGF0ZSA/IHN0YXRlLmRpbS5vdXRwdXQoc3RhdGUuc2VsZWN0aW9uKSA6IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicnVzaFgoKSB7XG4gIHJldHVybiBicnVzaChYKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJydXNoWSgpIHtcbiAgcmV0dXJuIGJydXNoKFkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGJydXNoKFhZKTtcbn1cblxuZnVuY3Rpb24gYnJ1c2goZGltKSB7XG4gIHZhciBleHRlbnQgPSBkZWZhdWx0RXh0ZW50LFxuICAgICAgZmlsdGVyID0gZGVmYXVsdEZpbHRlcixcbiAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUsXG4gICAgICBrZXlzID0gdHJ1ZSxcbiAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJicnVzaFwiLCBcImVuZFwiKSxcbiAgICAgIGhhbmRsZVNpemUgPSA2LFxuICAgICAgdG91Y2hlbmRpbmc7XG5cbiAgZnVuY3Rpb24gYnJ1c2goZ3JvdXApIHtcbiAgICB2YXIgb3ZlcmxheSA9IGdyb3VwXG4gICAgICAgIC5wcm9wZXJ0eShcIl9fYnJ1c2hcIiwgaW5pdGlhbGl6ZSlcbiAgICAgIC5zZWxlY3RBbGwoXCIub3ZlcmxheVwiKVxuICAgICAgLmRhdGEoW3R5cGUoXCJvdmVybGF5XCIpXSk7XG5cbiAgICBvdmVybGF5LmVudGVyKCkuYXBwZW5kKFwicmVjdFwiKVxuICAgICAgICAuYXR0cihcImNsYXNzXCIsIFwib3ZlcmxheVwiKVxuICAgICAgICAuYXR0cihcInBvaW50ZXItZXZlbnRzXCIsIFwiYWxsXCIpXG4gICAgICAgIC5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnMub3ZlcmxheSlcbiAgICAgIC5tZXJnZShvdmVybGF5KVxuICAgICAgICAuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgZXh0ZW50ID0gbG9jYWwodGhpcykuZXh0ZW50O1xuICAgICAgICAgIHNlbGVjdCh0aGlzKVxuICAgICAgICAgICAgICAuYXR0cihcInhcIiwgZXh0ZW50WzBdWzBdKVxuICAgICAgICAgICAgICAuYXR0cihcInlcIiwgZXh0ZW50WzBdWzFdKVxuICAgICAgICAgICAgICAuYXR0cihcIndpZHRoXCIsIGV4dGVudFsxXVswXSAtIGV4dGVudFswXVswXSlcbiAgICAgICAgICAgICAgLmF0dHIoXCJoZWlnaHRcIiwgZXh0ZW50WzFdWzFdIC0gZXh0ZW50WzBdWzFdKTtcbiAgICAgICAgfSk7XG5cbiAgICBncm91cC5zZWxlY3RBbGwoXCIuc2VsZWN0aW9uXCIpXG4gICAgICAuZGF0YShbdHlwZShcInNlbGVjdGlvblwiKV0pXG4gICAgICAuZW50ZXIoKS5hcHBlbmQoXCJyZWN0XCIpXG4gICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJzZWxlY3Rpb25cIilcbiAgICAgICAgLmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29ycy5zZWxlY3Rpb24pXG4gICAgICAgIC5hdHRyKFwiZmlsbFwiLCBcIiM3NzdcIilcbiAgICAgICAgLmF0dHIoXCJmaWxsLW9wYWNpdHlcIiwgMC4zKVxuICAgICAgICAuYXR0cihcInN0cm9rZVwiLCBcIiNmZmZcIilcbiAgICAgICAgLmF0dHIoXCJzaGFwZS1yZW5kZXJpbmdcIiwgXCJjcmlzcEVkZ2VzXCIpO1xuXG4gICAgdmFyIGhhbmRsZSA9IGdyb3VwLnNlbGVjdEFsbChcIi5oYW5kbGVcIilcbiAgICAgIC5kYXRhKGRpbS5oYW5kbGVzLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGU7IH0pO1xuXG4gICAgaGFuZGxlLmV4aXQoKS5yZW1vdmUoKTtcblxuICAgIGhhbmRsZS5lbnRlcigpLmFwcGVuZChcInJlY3RcIilcbiAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBmdW5jdGlvbihkKSB7IHJldHVybiBcImhhbmRsZSBoYW5kbGUtLVwiICsgZC50eXBlOyB9KVxuICAgICAgICAuYXR0cihcImN1cnNvclwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBjdXJzb3JzW2QudHlwZV07IH0pO1xuXG4gICAgZ3JvdXBcbiAgICAgICAgLmVhY2gocmVkcmF3KVxuICAgICAgICAuYXR0cihcImZpbGxcIiwgXCJub25lXCIpXG4gICAgICAgIC5hdHRyKFwicG9pbnRlci1ldmVudHNcIiwgXCJhbGxcIilcbiAgICAgICAgLm9uKFwibW91c2Vkb3duLmJydXNoXCIsIHN0YXJ0ZWQpXG4gICAgICAuZmlsdGVyKHRvdWNoYWJsZSlcbiAgICAgICAgLm9uKFwidG91Y2hzdGFydC5icnVzaFwiLCBzdGFydGVkKVxuICAgICAgICAub24oXCJ0b3VjaG1vdmUuYnJ1c2hcIiwgdG91Y2htb3ZlZClcbiAgICAgICAgLm9uKFwidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2hcIiwgdG91Y2hlbmRlZClcbiAgICAgICAgLnN0eWxlKFwidG91Y2gtYWN0aW9uXCIsIFwibm9uZVwiKVxuICAgICAgICAuc3R5bGUoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIiwgXCJyZ2JhKDAsMCwwLDApXCIpO1xuICB9XG5cbiAgYnJ1c2gubW92ZSA9IGZ1bmN0aW9uKGdyb3VwLCBzZWxlY3Rpb24sIGV2ZW50KSB7XG4gICAgaWYgKGdyb3VwLnR3ZWVuKSB7XG4gICAgICBncm91cFxuICAgICAgICAgIC5vbihcInN0YXJ0LmJydXNoXCIsIGZ1bmN0aW9uKGV2ZW50KSB7IGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpLnN0YXJ0KGV2ZW50KTsgfSlcbiAgICAgICAgICAub24oXCJpbnRlcnJ1cHQuYnJ1c2ggZW5kLmJydXNoXCIsIGZ1bmN0aW9uKGV2ZW50KSB7IGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5lbmQoZXZlbnQpOyB9KVxuICAgICAgICAgIC50d2VlbihcImJydXNoXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIHN0YXRlID0gdGhhdC5fX2JydXNoLFxuICAgICAgICAgICAgICAgIGVtaXQgPSBlbWl0dGVyKHRoYXQsIGFyZ3VtZW50cyksXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uMCA9IHN0YXRlLnNlbGVjdGlvbixcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24xID0gZGltLmlucHV0KHR5cGVvZiBzZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIiA/IHNlbGVjdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogc2VsZWN0aW9uLCBzdGF0ZS5leHRlbnQpLFxuICAgICAgICAgICAgICAgIGkgPSBpbnRlcnBvbGF0ZShzZWxlY3Rpb24wLCBzZWxlY3Rpb24xKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gdHdlZW4odCkge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSB0ID09PSAxICYmIHNlbGVjdGlvbjEgPT09IG51bGwgPyBudWxsIDogaSh0KTtcbiAgICAgICAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7XG4gICAgICAgICAgICAgIGVtaXQuYnJ1c2goKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbjAgIT09IG51bGwgJiYgc2VsZWN0aW9uMSAhPT0gbnVsbCA/IHR3ZWVuIDogdHdlZW4oMSk7XG4gICAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyb3VwXG4gICAgICAgICAgLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgICAgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IHRoYXQuX19icnVzaCxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24xID0gZGltLmlucHV0KHR5cGVvZiBzZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIiA/IHNlbGVjdGlvbi5hcHBseSh0aGF0LCBhcmdzKSA6IHNlbGVjdGlvbiwgc3RhdGUuZXh0ZW50KSxcbiAgICAgICAgICAgICAgICBlbWl0ID0gZW1pdHRlcih0aGF0LCBhcmdzKS5iZWZvcmVzdGFydCgpO1xuXG4gICAgICAgICAgICBpbnRlcnJ1cHQodGhhdCk7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSBzZWxlY3Rpb24xID09PSBudWxsID8gbnVsbCA6IHNlbGVjdGlvbjE7XG4gICAgICAgICAgICByZWRyYXcuY2FsbCh0aGF0KTtcbiAgICAgICAgICAgIGVtaXQuc3RhcnQoZXZlbnQpLmJydXNoKGV2ZW50KS5lbmQoZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBicnVzaC5jbGVhciA9IGZ1bmN0aW9uKGdyb3VwLCBldmVudCkge1xuICAgIGJydXNoLm1vdmUoZ3JvdXAsIG51bGwsIGV2ZW50KTtcbiAgfTtcblxuICBmdW5jdGlvbiByZWRyYXcoKSB7XG4gICAgdmFyIGdyb3VwID0gc2VsZWN0KHRoaXMpLFxuICAgICAgICBzZWxlY3Rpb24gPSBsb2NhbCh0aGlzKS5zZWxlY3Rpb247XG5cbiAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICBncm91cC5zZWxlY3RBbGwoXCIuc2VsZWN0aW9uXCIpXG4gICAgICAgICAgLnN0eWxlKFwiZGlzcGxheVwiLCBudWxsKVxuICAgICAgICAgIC5hdHRyKFwieFwiLCBzZWxlY3Rpb25bMF1bMF0pXG4gICAgICAgICAgLmF0dHIoXCJ5XCIsIHNlbGVjdGlvblswXVsxXSlcbiAgICAgICAgICAuYXR0cihcIndpZHRoXCIsIHNlbGVjdGlvblsxXVswXSAtIHNlbGVjdGlvblswXVswXSlcbiAgICAgICAgICAuYXR0cihcImhlaWdodFwiLCBzZWxlY3Rpb25bMV1bMV0gLSBzZWxlY3Rpb25bMF1bMV0pO1xuXG4gICAgICBncm91cC5zZWxlY3RBbGwoXCIuaGFuZGxlXCIpXG4gICAgICAgICAgLnN0eWxlKFwiZGlzcGxheVwiLCBudWxsKVxuICAgICAgICAgIC5hdHRyKFwieFwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGVbZC50eXBlLmxlbmd0aCAtIDFdID09PSBcImVcIiA/IHNlbGVjdGlvblsxXVswXSAtIGhhbmRsZVNpemUgLyAyIDogc2VsZWN0aW9uWzBdWzBdIC0gaGFuZGxlU2l6ZSAvIDI7IH0pXG4gICAgICAgICAgLmF0dHIoXCJ5XCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZVswXSA9PT0gXCJzXCIgPyBzZWxlY3Rpb25bMV1bMV0gLSBoYW5kbGVTaXplIC8gMiA6IHNlbGVjdGlvblswXVsxXSAtIGhhbmRsZVNpemUgLyAyOyB9KVxuICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlID09PSBcIm5cIiB8fCBkLnR5cGUgPT09IFwic1wiID8gc2VsZWN0aW9uWzFdWzBdIC0gc2VsZWN0aW9uWzBdWzBdICsgaGFuZGxlU2l6ZSA6IGhhbmRsZVNpemU7IH0pXG4gICAgICAgICAgLmF0dHIoXCJoZWlnaHRcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlID09PSBcImVcIiB8fCBkLnR5cGUgPT09IFwid1wiID8gc2VsZWN0aW9uWzFdWzFdIC0gc2VsZWN0aW9uWzBdWzFdICsgaGFuZGxlU2l6ZSA6IGhhbmRsZVNpemU7IH0pO1xuICAgIH1cblxuICAgIGVsc2Uge1xuICAgICAgZ3JvdXAuc2VsZWN0QWxsKFwiLnNlbGVjdGlvbiwuaGFuZGxlXCIpXG4gICAgICAgICAgLnN0eWxlKFwiZGlzcGxheVwiLCBcIm5vbmVcIilcbiAgICAgICAgICAuYXR0cihcInhcIiwgbnVsbClcbiAgICAgICAgICAuYXR0cihcInlcIiwgbnVsbClcbiAgICAgICAgICAuYXR0cihcIndpZHRoXCIsIG51bGwpXG4gICAgICAgICAgLmF0dHIoXCJoZWlnaHRcIiwgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZW1pdHRlcih0aGF0LCBhcmdzLCBjbGVhbikge1xuICAgIHZhciBlbWl0ID0gdGhhdC5fX2JydXNoLmVtaXR0ZXI7XG4gICAgcmV0dXJuIGVtaXQgJiYgKCFjbGVhbiB8fCAhZW1pdC5jbGVhbikgPyBlbWl0IDogbmV3IEVtaXR0ZXIodGhhdCwgYXJncywgY2xlYW4pO1xuICB9XG5cbiAgZnVuY3Rpb24gRW1pdHRlcih0aGF0LCBhcmdzLCBjbGVhbikge1xuICAgIHRoaXMudGhhdCA9IHRoYXQ7XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB0aGlzLnN0YXRlID0gdGhhdC5fX2JydXNoO1xuICAgIHRoaXMuYWN0aXZlID0gMDtcbiAgICB0aGlzLmNsZWFuID0gY2xlYW47XG4gIH1cblxuICBFbWl0dGVyLnByb3RvdHlwZSA9IHtcbiAgICBiZWZvcmVzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoKyt0aGlzLmFjdGl2ZSA9PT0gMSkgdGhpcy5zdGF0ZS5lbWl0dGVyID0gdGhpcywgdGhpcy5zdGFydGluZyA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHN0YXJ0OiBmdW5jdGlvbihldmVudCwgbW9kZSkge1xuICAgICAgaWYgKHRoaXMuc3RhcnRpbmcpIHRoaXMuc3RhcnRpbmcgPSBmYWxzZSwgdGhpcy5lbWl0KFwic3RhcnRcIiwgZXZlbnQsIG1vZGUpO1xuICAgICAgZWxzZSB0aGlzLmVtaXQoXCJicnVzaFwiLCBldmVudCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGJydXNoOiBmdW5jdGlvbihldmVudCwgbW9kZSkge1xuICAgICAgdGhpcy5lbWl0KFwiYnJ1c2hcIiwgZXZlbnQsIG1vZGUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbmQ6IGZ1bmN0aW9uKGV2ZW50LCBtb2RlKSB7XG4gICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkgZGVsZXRlIHRoaXMuc3RhdGUuZW1pdHRlciwgdGhpcy5lbWl0KFwiZW5kXCIsIGV2ZW50LCBtb2RlKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24odHlwZSwgZXZlbnQsIG1vZGUpIHtcbiAgICAgIHZhciBkID0gc2VsZWN0KHRoaXMudGhhdCkuZGF0dW0oKTtcbiAgICAgIGxpc3RlbmVycy5jYWxsKFxuICAgICAgICB0eXBlLFxuICAgICAgICB0aGlzLnRoYXQsXG4gICAgICAgIG5ldyBCcnVzaEV2ZW50KHR5cGUsIHtcbiAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXG4gICAgICAgICAgdGFyZ2V0OiBicnVzaCxcbiAgICAgICAgICBzZWxlY3Rpb246IGRpbS5vdXRwdXQodGhpcy5zdGF0ZS5zZWxlY3Rpb24pLFxuICAgICAgICAgIG1vZGUsXG4gICAgICAgICAgZGlzcGF0Y2g6IGxpc3RlbmVyc1xuICAgICAgICB9KSxcbiAgICAgICAgZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gc3RhcnRlZChldmVudCkge1xuICAgIGlmICh0b3VjaGVuZGluZyAmJiAhZXZlbnQudG91Y2hlcykgcmV0dXJuO1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcblxuICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgdHlwZSA9IGV2ZW50LnRhcmdldC5fX2RhdGFfXy50eXBlLFxuICAgICAgICBtb2RlID0gKGtleXMgJiYgZXZlbnQubWV0YUtleSA/IHR5cGUgPSBcIm92ZXJsYXlcIiA6IHR5cGUpID09PSBcInNlbGVjdGlvblwiID8gTU9ERV9EUkFHIDogKGtleXMgJiYgZXZlbnQuYWx0S2V5ID8gTU9ERV9DRU5URVIgOiBNT0RFX0hBTkRMRSksXG4gICAgICAgIHNpZ25YID0gZGltID09PSBZID8gbnVsbCA6IHNpZ25zWFt0eXBlXSxcbiAgICAgICAgc2lnblkgPSBkaW0gPT09IFggPyBudWxsIDogc2lnbnNZW3R5cGVdLFxuICAgICAgICBzdGF0ZSA9IGxvY2FsKHRoYXQpLFxuICAgICAgICBleHRlbnQgPSBzdGF0ZS5leHRlbnQsXG4gICAgICAgIHNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbixcbiAgICAgICAgVyA9IGV4dGVudFswXVswXSwgdzAsIHcxLFxuICAgICAgICBOID0gZXh0ZW50WzBdWzFdLCBuMCwgbjEsXG4gICAgICAgIEUgPSBleHRlbnRbMV1bMF0sIGUwLCBlMSxcbiAgICAgICAgUyA9IGV4dGVudFsxXVsxXSwgczAsIHMxLFxuICAgICAgICBkeCA9IDAsXG4gICAgICAgIGR5ID0gMCxcbiAgICAgICAgbW92aW5nLFxuICAgICAgICBzaGlmdGluZyA9IHNpZ25YICYmIHNpZ25ZICYmIGtleXMgJiYgZXZlbnQuc2hpZnRLZXksXG4gICAgICAgIGxvY2tYLFxuICAgICAgICBsb2NrWSxcbiAgICAgICAgcG9pbnRzID0gQXJyYXkuZnJvbShldmVudC50b3VjaGVzIHx8IFtldmVudF0sIHQgPT4ge1xuICAgICAgICAgIGNvbnN0IGkgPSB0LmlkZW50aWZpZXI7XG4gICAgICAgICAgdCA9IHBvaW50ZXIodCwgdGhhdCk7XG4gICAgICAgICAgdC5wb2ludDAgPSB0LnNsaWNlKCk7XG4gICAgICAgICAgdC5pZGVudGlmaWVyID0gaTtcbiAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfSk7XG5cbiAgICBpbnRlcnJ1cHQodGhhdCk7XG4gICAgdmFyIGVtaXQgPSBlbWl0dGVyKHRoYXQsIGFyZ3VtZW50cywgdHJ1ZSkuYmVmb3Jlc3RhcnQoKTtcblxuICAgIGlmICh0eXBlID09PSBcIm92ZXJsYXlcIikge1xuICAgICAgaWYgKHNlbGVjdGlvbikgbW92aW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHB0cyA9IFtwb2ludHNbMF0sIHBvaW50c1sxXSB8fCBwb2ludHNbMF1dO1xuICAgICAgc3RhdGUuc2VsZWN0aW9uID0gc2VsZWN0aW9uID0gW1tcbiAgICAgICAgICB3MCA9IGRpbSA9PT0gWSA/IFcgOiBtaW4ocHRzWzBdWzBdLCBwdHNbMV1bMF0pLFxuICAgICAgICAgIG4wID0gZGltID09PSBYID8gTiA6IG1pbihwdHNbMF1bMV0sIHB0c1sxXVsxXSlcbiAgICAgICAgXSwgW1xuICAgICAgICAgIGUwID0gZGltID09PSBZID8gRSA6IG1heChwdHNbMF1bMF0sIHB0c1sxXVswXSksXG4gICAgICAgICAgczAgPSBkaW0gPT09IFggPyBTIDogbWF4KHB0c1swXVsxXSwgcHRzWzFdWzFdKVxuICAgICAgICBdXTtcbiAgICAgIGlmIChwb2ludHMubGVuZ3RoID4gMSkgbW92ZShldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHcwID0gc2VsZWN0aW9uWzBdWzBdO1xuICAgICAgbjAgPSBzZWxlY3Rpb25bMF1bMV07XG4gICAgICBlMCA9IHNlbGVjdGlvblsxXVswXTtcbiAgICAgIHMwID0gc2VsZWN0aW9uWzFdWzFdO1xuICAgIH1cblxuICAgIHcxID0gdzA7XG4gICAgbjEgPSBuMDtcbiAgICBlMSA9IGUwO1xuICAgIHMxID0gczA7XG5cbiAgICB2YXIgZ3JvdXAgPSBzZWxlY3QodGhhdClcbiAgICAgICAgLmF0dHIoXCJwb2ludGVyLWV2ZW50c1wiLCBcIm5vbmVcIik7XG5cbiAgICB2YXIgb3ZlcmxheSA9IGdyb3VwLnNlbGVjdEFsbChcIi5vdmVybGF5XCIpXG4gICAgICAgIC5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnNbdHlwZV0pO1xuXG4gICAgaWYgKGV2ZW50LnRvdWNoZXMpIHtcbiAgICAgIGVtaXQubW92ZWQgPSBtb3ZlZDtcbiAgICAgIGVtaXQuZW5kZWQgPSBlbmRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHZpZXcgPSBzZWxlY3QoZXZlbnQudmlldylcbiAgICAgICAgICAub24oXCJtb3VzZW1vdmUuYnJ1c2hcIiwgbW92ZWQsIHRydWUpXG4gICAgICAgICAgLm9uKFwibW91c2V1cC5icnVzaFwiLCBlbmRlZCwgdHJ1ZSk7XG4gICAgICBpZiAoa2V5cykgdmlld1xuICAgICAgICAgIC5vbihcImtleWRvd24uYnJ1c2hcIiwga2V5ZG93bmVkLCB0cnVlKVxuICAgICAgICAgIC5vbihcImtleXVwLmJydXNoXCIsIGtleXVwcGVkLCB0cnVlKVxuXG4gICAgICBkcmFnRGlzYWJsZShldmVudC52aWV3KTtcbiAgICB9XG5cbiAgICByZWRyYXcuY2FsbCh0aGF0KTtcbiAgICBlbWl0LnN0YXJ0KGV2ZW50LCBtb2RlLm5hbWUpO1xuXG4gICAgZnVuY3Rpb24gbW92ZWQoZXZlbnQpIHtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBldmVudC5jaGFuZ2VkVG91Y2hlcyB8fCBbZXZlbnRdKSB7XG4gICAgICAgIGZvciAoY29uc3QgZCBvZiBwb2ludHMpXG4gICAgICAgICAgaWYgKGQuaWRlbnRpZmllciA9PT0gcC5pZGVudGlmaWVyKSBkLmN1ciA9IHBvaW50ZXIocCwgdGhhdCk7XG4gICAgICB9XG4gICAgICBpZiAoc2hpZnRpbmcgJiYgIWxvY2tYICYmICFsb2NrWSAmJiBwb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzWzBdO1xuICAgICAgICBpZiAoYWJzKHBvaW50LmN1clswXSAtIHBvaW50WzBdKSA+IGFicyhwb2ludC5jdXJbMV0gLSBwb2ludFsxXSkpXG4gICAgICAgICAgbG9ja1kgPSB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgbG9ja1ggPSB0cnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBwb2ludHMpXG4gICAgICAgIGlmIChwb2ludC5jdXIpIHBvaW50WzBdID0gcG9pbnQuY3VyWzBdLCBwb2ludFsxXSA9IHBvaW50LmN1clsxXTtcbiAgICAgIG1vdmluZyA9IHRydWU7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIG1vdmUoZXZlbnQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vdmUoZXZlbnQpIHtcbiAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzWzBdLCBwb2ludDAgPSBwb2ludC5wb2ludDA7XG4gICAgICB2YXIgdDtcblxuICAgICAgZHggPSBwb2ludFswXSAtIHBvaW50MFswXTtcbiAgICAgIGR5ID0gcG9pbnRbMV0gLSBwb2ludDBbMV07XG5cbiAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICBjYXNlIE1PREVfU1BBQ0U6XG4gICAgICAgIGNhc2UgTU9ERV9EUkFHOiB7XG4gICAgICAgICAgaWYgKHNpZ25YKSBkeCA9IG1heChXIC0gdzAsIG1pbihFIC0gZTAsIGR4KSksIHcxID0gdzAgKyBkeCwgZTEgPSBlMCArIGR4O1xuICAgICAgICAgIGlmIChzaWduWSkgZHkgPSBtYXgoTiAtIG4wLCBtaW4oUyAtIHMwLCBkeSkpLCBuMSA9IG4wICsgZHksIHMxID0gczAgKyBkeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIE1PREVfSEFORExFOiB7XG4gICAgICAgICAgaWYgKHBvaW50c1sxXSkge1xuICAgICAgICAgICAgaWYgKHNpZ25YKSB3MSA9IG1heChXLCBtaW4oRSwgcG9pbnRzWzBdWzBdKSksIGUxID0gbWF4KFcsIG1pbihFLCBwb2ludHNbMV1bMF0pKSwgc2lnblggPSAxO1xuICAgICAgICAgICAgaWYgKHNpZ25ZKSBuMSA9IG1heChOLCBtaW4oUywgcG9pbnRzWzBdWzFdKSksIHMxID0gbWF4KE4sIG1pbihTLCBwb2ludHNbMV1bMV0pKSwgc2lnblkgPSAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc2lnblggPCAwKSBkeCA9IG1heChXIC0gdzAsIG1pbihFIC0gdzAsIGR4KSksIHcxID0gdzAgKyBkeCwgZTEgPSBlMDtcbiAgICAgICAgICAgIGVsc2UgaWYgKHNpZ25YID4gMCkgZHggPSBtYXgoVyAtIGUwLCBtaW4oRSAtIGUwLCBkeCkpLCB3MSA9IHcwLCBlMSA9IGUwICsgZHg7XG4gICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBkeSA9IG1heChOIC0gbjAsIG1pbihTIC0gbjAsIGR5KSksIG4xID0gbjAgKyBkeSwgczEgPSBzMDtcbiAgICAgICAgICAgIGVsc2UgaWYgKHNpZ25ZID4gMCkgZHkgPSBtYXgoTiAtIHMwLCBtaW4oUyAtIHMwLCBkeSkpLCBuMSA9IG4wLCBzMSA9IHMwICsgZHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTU9ERV9DRU5URVI6IHtcbiAgICAgICAgICBpZiAoc2lnblgpIHcxID0gbWF4KFcsIG1pbihFLCB3MCAtIGR4ICogc2lnblgpKSwgZTEgPSBtYXgoVywgbWluKEUsIGUwICsgZHggKiBzaWduWCkpO1xuICAgICAgICAgIGlmIChzaWduWSkgbjEgPSBtYXgoTiwgbWluKFMsIG4wIC0gZHkgKiBzaWduWSkpLCBzMSA9IG1heChOLCBtaW4oUywgczAgKyBkeSAqIHNpZ25ZKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGUxIDwgdzEpIHtcbiAgICAgICAgc2lnblggKj0gLTE7XG4gICAgICAgIHQgPSB3MCwgdzAgPSBlMCwgZTAgPSB0O1xuICAgICAgICB0ID0gdzEsIHcxID0gZTEsIGUxID0gdDtcbiAgICAgICAgaWYgKHR5cGUgaW4gZmxpcFgpIG92ZXJsYXkuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzW3R5cGUgPSBmbGlwWFt0eXBlXV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoczEgPCBuMSkge1xuICAgICAgICBzaWduWSAqPSAtMTtcbiAgICAgICAgdCA9IG4wLCBuMCA9IHMwLCBzMCA9IHQ7XG4gICAgICAgIHQgPSBuMSwgbjEgPSBzMSwgczEgPSB0O1xuICAgICAgICBpZiAodHlwZSBpbiBmbGlwWSkgb3ZlcmxheS5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnNbdHlwZSA9IGZsaXBZW3R5cGVdXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24pIHNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbjsgLy8gTWF5IGJlIHNldCBieSBicnVzaC5tb3ZlIVxuICAgICAgaWYgKGxvY2tYKSB3MSA9IHNlbGVjdGlvblswXVswXSwgZTEgPSBzZWxlY3Rpb25bMV1bMF07XG4gICAgICBpZiAobG9ja1kpIG4xID0gc2VsZWN0aW9uWzBdWzFdLCBzMSA9IHNlbGVjdGlvblsxXVsxXTtcblxuICAgICAgaWYgKHNlbGVjdGlvblswXVswXSAhPT0gdzFcbiAgICAgICAgICB8fCBzZWxlY3Rpb25bMF1bMV0gIT09IG4xXG4gICAgICAgICAgfHwgc2VsZWN0aW9uWzFdWzBdICE9PSBlMVxuICAgICAgICAgIHx8IHNlbGVjdGlvblsxXVsxXSAhPT0gczEpIHtcbiAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gW1t3MSwgbjFdLCBbZTEsIHMxXV07XG4gICAgICAgIHJlZHJhdy5jYWxsKHRoYXQpO1xuICAgICAgICBlbWl0LmJydXNoKGV2ZW50LCBtb2RlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZGVkKGV2ZW50KSB7XG4gICAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICAgIGlmIChldmVudC50b3VjaGVzKSB7XG4gICAgICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBpZiAodG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7XG4gICAgICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCA1MDApOyAvLyBHaG9zdCBjbGlja3MgYXJlIGRlbGF5ZWQhXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcmFnRW5hYmxlKGV2ZW50LnZpZXcsIG1vdmluZyk7XG4gICAgICAgIHZpZXcub24oXCJrZXlkb3duLmJydXNoIGtleXVwLmJydXNoIG1vdXNlbW92ZS5icnVzaCBtb3VzZXVwLmJydXNoXCIsIG51bGwpO1xuICAgICAgfVxuICAgICAgZ3JvdXAuYXR0cihcInBvaW50ZXItZXZlbnRzXCIsIFwiYWxsXCIpO1xuICAgICAgb3ZlcmxheS5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnMub3ZlcmxheSk7XG4gICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uKSBzZWxlY3Rpb24gPSBzdGF0ZS5zZWxlY3Rpb247IC8vIE1heSBiZSBzZXQgYnkgYnJ1c2gubW92ZSAob24gc3RhcnQpIVxuICAgICAgaWYgKGVtcHR5KHNlbGVjdGlvbikpIHN0YXRlLnNlbGVjdGlvbiA9IG51bGwsIHJlZHJhdy5jYWxsKHRoYXQpO1xuICAgICAgZW1pdC5lbmQoZXZlbnQsIG1vZGUubmFtZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga2V5ZG93bmVkKGV2ZW50KSB7XG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSAxNjogeyAvLyBTSElGVFxuICAgICAgICAgIHNoaWZ0aW5nID0gc2lnblggJiYgc2lnblk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAxODogeyAvLyBBTFRcbiAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9IQU5ETEUpIHtcbiAgICAgICAgICAgIGlmIChzaWduWCkgZTAgPSBlMSAtIGR4ICogc2lnblgsIHcwID0gdzEgKyBkeCAqIHNpZ25YO1xuICAgICAgICAgICAgaWYgKHNpZ25ZKSBzMCA9IHMxIC0gZHkgKiBzaWduWSwgbjAgPSBuMSArIGR5ICogc2lnblk7XG4gICAgICAgICAgICBtb2RlID0gTU9ERV9DRU5URVI7XG4gICAgICAgICAgICBtb3ZlKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAzMjogeyAvLyBTUEFDRTsgdGFrZXMgcHJpb3JpdHkgb3ZlciBBTFRcbiAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9IQU5ETEUgfHwgbW9kZSA9PT0gTU9ERV9DRU5URVIpIHtcbiAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGUwID0gZTEgLSBkeDsgZWxzZSBpZiAoc2lnblggPiAwKSB3MCA9IHcxIC0gZHg7XG4gICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBzMCA9IHMxIC0gZHk7IGVsc2UgaWYgKHNpZ25ZID4gMCkgbjAgPSBuMSAtIGR5O1xuICAgICAgICAgICAgbW9kZSA9IE1PREVfU1BBQ0U7XG4gICAgICAgICAgICBvdmVybGF5LmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29ycy5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgbW92ZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybjtcbiAgICAgIH1cbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGtleXVwcGVkKGV2ZW50KSB7XG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSAxNjogeyAvLyBTSElGVFxuICAgICAgICAgIGlmIChzaGlmdGluZykge1xuICAgICAgICAgICAgbG9ja1ggPSBsb2NrWSA9IHNoaWZ0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICBtb3ZlKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAxODogeyAvLyBBTFRcbiAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9DRU5URVIpIHtcbiAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGUwID0gZTE7IGVsc2UgaWYgKHNpZ25YID4gMCkgdzAgPSB3MTtcbiAgICAgICAgICAgIGlmIChzaWduWSA8IDApIHMwID0gczE7IGVsc2UgaWYgKHNpZ25ZID4gMCkgbjAgPSBuMTtcbiAgICAgICAgICAgIG1vZGUgPSBNT0RFX0hBTkRMRTtcbiAgICAgICAgICAgIG1vdmUoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDMyOiB7IC8vIFNQQUNFXG4gICAgICAgICAgaWYgKG1vZGUgPT09IE1PREVfU1BBQ0UpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgaWYgKHNpZ25YKSBlMCA9IGUxIC0gZHggKiBzaWduWCwgdzAgPSB3MSArIGR4ICogc2lnblg7XG4gICAgICAgICAgICAgIGlmIChzaWduWSkgczAgPSBzMSAtIGR5ICogc2lnblksIG4wID0gbjEgKyBkeSAqIHNpZ25ZO1xuICAgICAgICAgICAgICBtb2RlID0gTU9ERV9DRU5URVI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoc2lnblggPCAwKSBlMCA9IGUxOyBlbHNlIGlmIChzaWduWCA+IDApIHcwID0gdzE7XG4gICAgICAgICAgICAgIGlmIChzaWduWSA8IDApIHMwID0gczE7IGVsc2UgaWYgKHNpZ25ZID4gMCkgbjAgPSBuMTtcbiAgICAgICAgICAgICAgbW9kZSA9IE1PREVfSEFORExFO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3ZlcmxheS5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnNbdHlwZV0pO1xuICAgICAgICAgICAgbW92ZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybjtcbiAgICAgIH1cbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNobW92ZWQoZXZlbnQpIHtcbiAgICBlbWl0dGVyKHRoaXMsIGFyZ3VtZW50cykubW92ZWQoZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hlbmRlZChldmVudCkge1xuICAgIGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5lbmRlZChldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX19icnVzaCB8fCB7c2VsZWN0aW9uOiBudWxsfTtcbiAgICBzdGF0ZS5leHRlbnQgPSBudW1iZXIyKGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICBzdGF0ZS5kaW0gPSBkaW07XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgYnJ1c2guZXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQobnVtYmVyMihfKSksIGJydXNoKSA6IGV4dGVudDtcbiAgfTtcblxuICBicnVzaC5maWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBicnVzaCkgOiBmaWx0ZXI7XG4gIH07XG5cbiAgYnJ1c2gudG91Y2hhYmxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgYnJ1c2gpIDogdG91Y2hhYmxlO1xuICB9O1xuXG4gIGJydXNoLmhhbmRsZVNpemUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaGFuZGxlU2l6ZSA9ICtfLCBicnVzaCkgOiBoYW5kbGVTaXplO1xuICB9O1xuXG4gIGJydXNoLmtleU1vZGlmaWVycyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrZXlzID0gISFfLCBicnVzaCkgOiBrZXlzO1xuICB9O1xuXG4gIGJydXNoLm9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IGJydXNoIDogdmFsdWU7XG4gIH07XG5cbiAgcmV0dXJuIGJydXNoO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHkpIHtcbiAgdmFyIG5vZGVzLCBzdHJlbmd0aCA9IDE7XG5cbiAgaWYgKHggPT0gbnVsbCkgeCA9IDA7XG4gIGlmICh5ID09IG51bGwpIHkgPSAwO1xuXG4gIGZ1bmN0aW9uIGZvcmNlKCkge1xuICAgIHZhciBpLFxuICAgICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICBub2RlLFxuICAgICAgICBzeCA9IDAsXG4gICAgICAgIHN5ID0gMDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tpXSwgc3ggKz0gbm9kZS54LCBzeSArPSBub2RlLnk7XG4gICAgfVxuXG4gICAgZm9yIChzeCA9IChzeCAvIG4gLSB4KSAqIHN0cmVuZ3RoLCBzeSA9IChzeSAvIG4gLSB5KSAqIHN0cmVuZ3RoLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLnggLT0gc3gsIG5vZGUueSAtPSBzeTtcbiAgICB9XG4gIH1cblxuICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykge1xuICAgIG5vZGVzID0gXztcbiAgfTtcblxuICBmb3JjZS54ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSArXywgZm9yY2UpIDogeDtcbiAgfTtcblxuICBmb3JjZS55ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSArXywgZm9yY2UpIDogeTtcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9ICtfLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICByZXR1cm4gZm9yY2U7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZCkge1xuICBjb25zdCB4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkKSxcbiAgICAgIHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpO1xuICByZXR1cm4gYWRkKHRoaXMuY292ZXIoeCwgeSksIHgsIHksIGQpO1xufVxuXG5mdW5jdGlvbiBhZGQodHJlZSwgeCwgeSwgZCkge1xuICBpZiAoaXNOYU4oeCkgfHwgaXNOYU4oeSkpIHJldHVybiB0cmVlOyAvLyBpZ25vcmUgaW52YWxpZCBwb2ludHNcblxuICB2YXIgcGFyZW50LFxuICAgICAgbm9kZSA9IHRyZWUuX3Jvb3QsXG4gICAgICBsZWFmID0ge2RhdGE6IGR9LFxuICAgICAgeDAgPSB0cmVlLl94MCxcbiAgICAgIHkwID0gdHJlZS5feTAsXG4gICAgICB4MSA9IHRyZWUuX3gxLFxuICAgICAgeTEgPSB0cmVlLl95MSxcbiAgICAgIHhtLFxuICAgICAgeW0sXG4gICAgICB4cCxcbiAgICAgIHlwLFxuICAgICAgcmlnaHQsXG4gICAgICBib3R0b20sXG4gICAgICBpLFxuICAgICAgajtcblxuICAvLyBJZiB0aGUgdHJlZSBpcyBlbXB0eSwgaW5pdGlhbGl6ZSB0aGUgcm9vdCBhcyBhIGxlYWYuXG4gIGlmICghbm9kZSkgcmV0dXJuIHRyZWUuX3Jvb3QgPSBsZWFmLCB0cmVlO1xuXG4gIC8vIEZpbmQgdGhlIGV4aXN0aW5nIGxlYWYgZm9yIHRoZSBuZXcgcG9pbnQsIG9yIGFkZCBpdC5cbiAgd2hpbGUgKG5vZGUubGVuZ3RoKSB7XG4gICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtO1xuICAgIGlmIChib3R0b20gPSB5ID49ICh5bSA9ICh5MCArIHkxKSAvIDIpKSB5MCA9IHltOyBlbHNlIHkxID0geW07XG4gICAgaWYgKHBhcmVudCA9IG5vZGUsICEobm9kZSA9IG5vZGVbaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHRdKSkgcmV0dXJuIHBhcmVudFtpXSA9IGxlYWYsIHRyZWU7XG4gIH1cblxuICAvLyBJcyB0aGUgbmV3IHBvaW50IGlzIGV4YWN0bHkgY29pbmNpZGVudCB3aXRoIHRoZSBleGlzdGluZyBwb2ludD9cbiAgeHAgPSArdHJlZS5feC5jYWxsKG51bGwsIG5vZGUuZGF0YSk7XG4gIHlwID0gK3RyZWUuX3kuY2FsbChudWxsLCBub2RlLmRhdGEpO1xuICBpZiAoeCA9PT0geHAgJiYgeSA9PT0geXApIHJldHVybiBsZWFmLm5leHQgPSBub2RlLCBwYXJlbnQgPyBwYXJlbnRbaV0gPSBsZWFmIDogdHJlZS5fcm9vdCA9IGxlYWYsIHRyZWU7XG5cbiAgLy8gT3RoZXJ3aXNlLCBzcGxpdCB0aGUgbGVhZiBub2RlIHVudGlsIHRoZSBvbGQgYW5kIG5ldyBwb2ludCBhcmUgc2VwYXJhdGVkLlxuICBkbyB7XG4gICAgcGFyZW50ID0gcGFyZW50ID8gcGFyZW50W2ldID0gbmV3IEFycmF5KDQpIDogdHJlZS5fcm9vdCA9IG5ldyBBcnJheSg0KTtcbiAgICBpZiAocmlnaHQgPSB4ID49ICh4bSA9ICh4MCArIHgxKSAvIDIpKSB4MCA9IHhtOyBlbHNlIHgxID0geG07XG4gICAgaWYgKGJvdHRvbSA9IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTtcbiAgfSB3aGlsZSAoKGkgPSBib3R0b20gPDwgMSB8IHJpZ2h0KSA9PT0gKGogPSAoeXAgPj0geW0pIDw8IDEgfCAoeHAgPj0geG0pKSk7XG4gIHJldHVybiBwYXJlbnRbal0gPSBub2RlLCBwYXJlbnRbaV0gPSBsZWFmLCB0cmVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkQWxsKGRhdGEpIHtcbiAgdmFyIGQsIGksIG4gPSBkYXRhLmxlbmd0aCxcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgeHogPSBuZXcgQXJyYXkobiksXG4gICAgICB5eiA9IG5ldyBBcnJheShuKSxcbiAgICAgIHgwID0gSW5maW5pdHksXG4gICAgICB5MCA9IEluZmluaXR5LFxuICAgICAgeDEgPSAtSW5maW5pdHksXG4gICAgICB5MSA9IC1JbmZpbml0eTtcblxuICAvLyBDb21wdXRlIHRoZSBwb2ludHMgYW5kIHRoZWlyIGV4dGVudC5cbiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgIGlmIChpc05hTih4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkID0gZGF0YVtpXSkpIHx8IGlzTmFOKHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpKSkgY29udGludWU7XG4gICAgeHpbaV0gPSB4O1xuICAgIHl6W2ldID0geTtcbiAgICBpZiAoeCA8IHgwKSB4MCA9IHg7XG4gICAgaWYgKHggPiB4MSkgeDEgPSB4O1xuICAgIGlmICh5IDwgeTApIHkwID0geTtcbiAgICBpZiAoeSA+IHkxKSB5MSA9IHk7XG4gIH1cblxuICAvLyBJZiB0aGVyZSB3ZXJlIG5vICh2YWxpZCkgcG9pbnRzLCBhYm9ydC5cbiAgaWYgKHgwID4geDEgfHwgeTAgPiB5MSkgcmV0dXJuIHRoaXM7XG5cbiAgLy8gRXhwYW5kIHRoZSB0cmVlIHRvIGNvdmVyIHRoZSBuZXcgcG9pbnRzLlxuICB0aGlzLmNvdmVyKHgwLCB5MCkuY292ZXIoeDEsIHkxKTtcblxuICAvLyBBZGQgdGhlIG5ldyBwb2ludHMuXG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBhZGQodGhpcywgeHpbaV0sIHl6W2ldLCBkYXRhW2ldKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHkpIHtcbiAgaWYgKGlzTmFOKHggPSAreCkgfHwgaXNOYU4oeSA9ICt5KSkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50c1xuXG4gIHZhciB4MCA9IHRoaXMuX3gwLFxuICAgICAgeTAgPSB0aGlzLl95MCxcbiAgICAgIHgxID0gdGhpcy5feDEsXG4gICAgICB5MSA9IHRoaXMuX3kxO1xuXG4gIC8vIElmIHRoZSBxdWFkdHJlZSBoYXMgbm8gZXh0ZW50LCBpbml0aWFsaXplIHRoZW0uXG4gIC8vIEludGVnZXIgZXh0ZW50IGFyZSBuZWNlc3Nhcnkgc28gdGhhdCBpZiB3ZSBsYXRlciBkb3VibGUgdGhlIGV4dGVudCxcbiAgLy8gdGhlIGV4aXN0aW5nIHF1YWRyYW50IGJvdW5kYXJpZXMgZG9uXHUyMDE5dCBjaGFuZ2UgZHVlIHRvIGZsb2F0aW5nIHBvaW50IGVycm9yIVxuICBpZiAoaXNOYU4oeDApKSB7XG4gICAgeDEgPSAoeDAgPSBNYXRoLmZsb29yKHgpKSArIDE7XG4gICAgeTEgPSAoeTAgPSBNYXRoLmZsb29yKHkpKSArIDE7XG4gIH1cblxuICAvLyBPdGhlcndpc2UsIGRvdWJsZSByZXBlYXRlZGx5IHRvIGNvdmVyLlxuICBlbHNlIHtcbiAgICB2YXIgeiA9IHgxIC0geDAgfHwgMSxcbiAgICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgaTtcblxuICAgIHdoaWxlICh4MCA+IHggfHwgeCA+PSB4MSB8fCB5MCA+IHkgfHwgeSA+PSB5MSkge1xuICAgICAgaSA9ICh5IDwgeTApIDw8IDEgfCAoeCA8IHgwKTtcbiAgICAgIHBhcmVudCA9IG5ldyBBcnJheSg0KSwgcGFyZW50W2ldID0gbm9kZSwgbm9kZSA9IHBhcmVudCwgeiAqPSAyO1xuICAgICAgc3dpdGNoIChpKSB7XG4gICAgICAgIGNhc2UgMDogeDEgPSB4MCArIHosIHkxID0geTAgKyB6OyBicmVhaztcbiAgICAgICAgY2FzZSAxOiB4MCA9IHgxIC0geiwgeTEgPSB5MCArIHo7IGJyZWFrO1xuICAgICAgICBjYXNlIDI6IHgxID0geDAgKyB6LCB5MCA9IHkxIC0gejsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogeDAgPSB4MSAtIHosIHkwID0geTEgLSB6OyBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcm9vdCAmJiB0aGlzLl9yb290Lmxlbmd0aCkgdGhpcy5fcm9vdCA9IG5vZGU7XG4gIH1cblxuICB0aGlzLl94MCA9IHgwO1xuICB0aGlzLl95MCA9IHkwO1xuICB0aGlzLl94MSA9IHgxO1xuICB0aGlzLl95MSA9IHkxO1xuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGRhdGEgPSBbXTtcbiAgdGhpcy52aXNpdChmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKCFub2RlLmxlbmd0aCkgZG8gZGF0YS5wdXNoKG5vZGUuZGF0YSk7IHdoaWxlIChub2RlID0gbm9kZS5uZXh0KVxuICB9KTtcbiAgcmV0dXJuIGRhdGE7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oXykge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmNvdmVyKCtfWzBdWzBdLCArX1swXVsxXSkuY292ZXIoK19bMV1bMF0sICtfWzFdWzFdKVxuICAgICAgOiBpc05hTih0aGlzLl94MCkgPyB1bmRlZmluZWQgOiBbW3RoaXMuX3gwLCB0aGlzLl95MF0sIFt0aGlzLl94MSwgdGhpcy5feTFdXTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCB4MCwgeTAsIHgxLCB5MSkge1xuICB0aGlzLm5vZGUgPSBub2RlO1xuICB0aGlzLngwID0geDA7XG4gIHRoaXMueTAgPSB5MDtcbiAgdGhpcy54MSA9IHgxO1xuICB0aGlzLnkxID0geTE7XG59XG4iLCAiaW1wb3J0IFF1YWQgZnJvbSBcIi4vcXVhZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCB5LCByYWRpdXMpIHtcbiAgdmFyIGRhdGEsXG4gICAgICB4MCA9IHRoaXMuX3gwLFxuICAgICAgeTAgPSB0aGlzLl95MCxcbiAgICAgIHgxLFxuICAgICAgeTEsXG4gICAgICB4MixcbiAgICAgIHkyLFxuICAgICAgeDMgPSB0aGlzLl94MSxcbiAgICAgIHkzID0gdGhpcy5feTEsXG4gICAgICBxdWFkcyA9IFtdLFxuICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsXG4gICAgICBxLFxuICAgICAgaTtcblxuICBpZiAobm9kZSkgcXVhZHMucHVzaChuZXcgUXVhZChub2RlLCB4MCwgeTAsIHgzLCB5MykpO1xuICBpZiAocmFkaXVzID09IG51bGwpIHJhZGl1cyA9IEluZmluaXR5O1xuICBlbHNlIHtcbiAgICB4MCA9IHggLSByYWRpdXMsIHkwID0geSAtIHJhZGl1cztcbiAgICB4MyA9IHggKyByYWRpdXMsIHkzID0geSArIHJhZGl1cztcbiAgICByYWRpdXMgKj0gcmFkaXVzO1xuICB9XG5cbiAgd2hpbGUgKHEgPSBxdWFkcy5wb3AoKSkge1xuXG4gICAgLy8gU3RvcCBzZWFyY2hpbmcgaWYgdGhpcyBxdWFkcmFudCBjYW5cdTIwMTl0IGNvbnRhaW4gYSBjbG9zZXIgbm9kZS5cbiAgICBpZiAoIShub2RlID0gcS5ub2RlKVxuICAgICAgICB8fCAoeDEgPSBxLngwKSA+IHgzXG4gICAgICAgIHx8ICh5MSA9IHEueTApID4geTNcbiAgICAgICAgfHwgKHgyID0gcS54MSkgPCB4MFxuICAgICAgICB8fCAoeTIgPSBxLnkxKSA8IHkwKSBjb250aW51ZTtcblxuICAgIC8vIEJpc2VjdCB0aGUgY3VycmVudCBxdWFkcmFudC5cbiAgICBpZiAobm9kZS5sZW5ndGgpIHtcbiAgICAgIHZhciB4bSA9ICh4MSArIHgyKSAvIDIsXG4gICAgICAgICAgeW0gPSAoeTEgKyB5MikgLyAyO1xuXG4gICAgICBxdWFkcy5wdXNoKFxuICAgICAgICBuZXcgUXVhZChub2RlWzNdLCB4bSwgeW0sIHgyLCB5MiksXG4gICAgICAgIG5ldyBRdWFkKG5vZGVbMl0sIHgxLCB5bSwgeG0sIHkyKSxcbiAgICAgICAgbmV3IFF1YWQobm9kZVsxXSwgeG0sIHkxLCB4MiwgeW0pLFxuICAgICAgICBuZXcgUXVhZChub2RlWzBdLCB4MSwgeTEsIHhtLCB5bSlcbiAgICAgICk7XG5cbiAgICAgIC8vIFZpc2l0IHRoZSBjbG9zZXN0IHF1YWRyYW50IGZpcnN0LlxuICAgICAgaWYgKGkgPSAoeSA+PSB5bSkgPDwgMSB8ICh4ID49IHhtKSkge1xuICAgICAgICBxID0gcXVhZHNbcXVhZHMubGVuZ3RoIC0gMV07XG4gICAgICAgIHF1YWRzW3F1YWRzLmxlbmd0aCAtIDFdID0gcXVhZHNbcXVhZHMubGVuZ3RoIC0gMSAtIGldO1xuICAgICAgICBxdWFkc1txdWFkcy5sZW5ndGggLSAxIC0gaV0gPSBxO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZpc2l0IHRoaXMgcG9pbnQuIChWaXNpdGluZyBjb2luY2lkZW50IHBvaW50cyBpc25cdTIwMTl0IG5lY2Vzc2FyeSEpXG4gICAgZWxzZSB7XG4gICAgICB2YXIgZHggPSB4IC0gK3RoaXMuX3guY2FsbChudWxsLCBub2RlLmRhdGEpLFxuICAgICAgICAgIGR5ID0geSAtICt0aGlzLl95LmNhbGwobnVsbCwgbm9kZS5kYXRhKSxcbiAgICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgICAgaWYgKGQyIDwgcmFkaXVzKSB7XG4gICAgICAgIHZhciBkID0gTWF0aC5zcXJ0KHJhZGl1cyA9IGQyKTtcbiAgICAgICAgeDAgPSB4IC0gZCwgeTAgPSB5IC0gZDtcbiAgICAgICAgeDMgPSB4ICsgZCwgeTMgPSB5ICsgZDtcbiAgICAgICAgZGF0YSA9IG5vZGUuZGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkKSB7XG4gIGlmIChpc05hTih4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkKSkgfHwgaXNOYU4oeSA9ICt0aGlzLl95LmNhbGwobnVsbCwgZCkpKSByZXR1cm4gdGhpczsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRzXG5cbiAgdmFyIHBhcmVudCxcbiAgICAgIG5vZGUgPSB0aGlzLl9yb290LFxuICAgICAgcmV0YWluZXIsXG4gICAgICBwcmV2aW91cyxcbiAgICAgIG5leHQsXG4gICAgICB4MCA9IHRoaXMuX3gwLFxuICAgICAgeTAgPSB0aGlzLl95MCxcbiAgICAgIHgxID0gdGhpcy5feDEsXG4gICAgICB5MSA9IHRoaXMuX3kxLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB4bSxcbiAgICAgIHltLFxuICAgICAgcmlnaHQsXG4gICAgICBib3R0b20sXG4gICAgICBpLFxuICAgICAgajtcblxuICAvLyBJZiB0aGUgdHJlZSBpcyBlbXB0eSwgaW5pdGlhbGl6ZSB0aGUgcm9vdCBhcyBhIGxlYWYuXG4gIGlmICghbm9kZSkgcmV0dXJuIHRoaXM7XG5cbiAgLy8gRmluZCB0aGUgbGVhZiBub2RlIGZvciB0aGUgcG9pbnQuXG4gIC8vIFdoaWxlIGRlc2NlbmRpbmcsIGFsc28gcmV0YWluIHRoZSBkZWVwZXN0IHBhcmVudCB3aXRoIGEgbm9uLXJlbW92ZWQgc2libGluZy5cbiAgaWYgKG5vZGUubGVuZ3RoKSB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChyaWdodCA9IHggPj0gKHhtID0gKHgwICsgeDEpIC8gMikpIHgwID0geG07IGVsc2UgeDEgPSB4bTtcbiAgICBpZiAoYm90dG9tID0geSA+PSAoeW0gPSAoeTAgKyB5MSkgLyAyKSkgeTAgPSB5bTsgZWxzZSB5MSA9IHltO1xuICAgIGlmICghKHBhcmVudCA9IG5vZGUsIG5vZGUgPSBub2RlW2kgPSBib3R0b20gPDwgMSB8IHJpZ2h0XSkpIHJldHVybiB0aGlzO1xuICAgIGlmICghbm9kZS5sZW5ndGgpIGJyZWFrO1xuICAgIGlmIChwYXJlbnRbKGkgKyAxKSAmIDNdIHx8IHBhcmVudFsoaSArIDIpICYgM10gfHwgcGFyZW50WyhpICsgMykgJiAzXSkgcmV0YWluZXIgPSBwYXJlbnQsIGogPSBpO1xuICB9XG5cbiAgLy8gRmluZCB0aGUgcG9pbnQgdG8gcmVtb3ZlLlxuICB3aGlsZSAobm9kZS5kYXRhICE9PSBkKSBpZiAoIShwcmV2aW91cyA9IG5vZGUsIG5vZGUgPSBub2RlLm5leHQpKSByZXR1cm4gdGhpcztcbiAgaWYgKG5leHQgPSBub2RlLm5leHQpIGRlbGV0ZSBub2RlLm5leHQ7XG5cbiAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvaW5jaWRlbnQgcG9pbnRzLCByZW1vdmUganVzdCB0aGUgcG9pbnQuXG4gIGlmIChwcmV2aW91cykgcmV0dXJuIChuZXh0ID8gcHJldmlvdXMubmV4dCA9IG5leHQgOiBkZWxldGUgcHJldmlvdXMubmV4dCksIHRoaXM7XG5cbiAgLy8gSWYgdGhpcyBpcyB0aGUgcm9vdCBwb2ludCwgcmVtb3ZlIGl0LlxuICBpZiAoIXBhcmVudCkgcmV0dXJuIHRoaXMuX3Jvb3QgPSBuZXh0LCB0aGlzO1xuXG4gIC8vIFJlbW92ZSB0aGlzIGxlYWYuXG4gIG5leHQgPyBwYXJlbnRbaV0gPSBuZXh0IDogZGVsZXRlIHBhcmVudFtpXTtcblxuICAvLyBJZiB0aGUgcGFyZW50IG5vdyBjb250YWlucyBleGFjdGx5IG9uZSBsZWFmLCBjb2xsYXBzZSBzdXBlcmZsdW91cyBwYXJlbnRzLlxuICBpZiAoKG5vZGUgPSBwYXJlbnRbMF0gfHwgcGFyZW50WzFdIHx8IHBhcmVudFsyXSB8fCBwYXJlbnRbM10pXG4gICAgICAmJiBub2RlID09PSAocGFyZW50WzNdIHx8IHBhcmVudFsyXSB8fCBwYXJlbnRbMV0gfHwgcGFyZW50WzBdKVxuICAgICAgJiYgIW5vZGUubGVuZ3RoKSB7XG4gICAgaWYgKHJldGFpbmVyKSByZXRhaW5lcltqXSA9IG5vZGU7XG4gICAgZWxzZSB0aGlzLl9yb290ID0gbm9kZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQWxsKGRhdGEpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSBkYXRhLmxlbmd0aDsgaSA8IG47ICsraSkgdGhpcy5yZW1vdmUoZGF0YVtpXSk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fcm9vdDtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHNpemUgPSAwO1xuICB0aGlzLnZpc2l0KGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAoIW5vZGUubGVuZ3RoKSBkbyArK3NpemU7IHdoaWxlIChub2RlID0gbm9kZS5uZXh0KVxuICB9KTtcbiAgcmV0dXJuIHNpemU7XG59XG4iLCAiaW1wb3J0IFF1YWQgZnJvbSBcIi4vcXVhZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuICB2YXIgcXVhZHMgPSBbXSwgcSwgbm9kZSA9IHRoaXMuX3Jvb3QsIGNoaWxkLCB4MCwgeTAsIHgxLCB5MTtcbiAgaWYgKG5vZGUpIHF1YWRzLnB1c2gobmV3IFF1YWQobm9kZSwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpKTtcbiAgd2hpbGUgKHEgPSBxdWFkcy5wb3AoKSkge1xuICAgIGlmICghY2FsbGJhY2sobm9kZSA9IHEubm9kZSwgeDAgPSBxLngwLCB5MCA9IHEueTAsIHgxID0gcS54MSwgeTEgPSBxLnkxKSAmJiBub2RlLmxlbmd0aCkge1xuICAgICAgdmFyIHhtID0gKHgwICsgeDEpIC8gMiwgeW0gPSAoeTAgKyB5MSkgLyAyO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVszXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHltLCB4MSwgeTEpKTtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMl0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5bSwgeG0sIHkxKSk7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzFdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4bSwgeTAsIHgxLCB5bSkpO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVswXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeDAsIHkwLCB4bSwgeW0pKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiaW1wb3J0IFF1YWQgZnJvbSBcIi4vcXVhZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuICB2YXIgcXVhZHMgPSBbXSwgbmV4dCA9IFtdLCBxO1xuICBpZiAodGhpcy5fcm9vdCkgcXVhZHMucHVzaChuZXcgUXVhZCh0aGlzLl9yb290LCB0aGlzLl94MCwgdGhpcy5feTAsIHRoaXMuX3gxLCB0aGlzLl95MSkpO1xuICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7XG4gICAgdmFyIG5vZGUgPSBxLm5vZGU7XG4gICAgaWYgKG5vZGUubGVuZ3RoKSB7XG4gICAgICB2YXIgY2hpbGQsIHgwID0gcS54MCwgeTAgPSBxLnkwLCB4MSA9IHEueDEsIHkxID0gcS55MSwgeG0gPSAoeDAgKyB4MSkgLyAyLCB5bSA9ICh5MCArIHkxKSAvIDI7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzBdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4MCwgeTAsIHhtLCB5bSkpO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVsxXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHkwLCB4MSwgeW0pKTtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMl0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5bSwgeG0sIHkxKSk7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzNdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4bSwgeW0sIHgxLCB5MSkpO1xuICAgIH1cbiAgICBuZXh0LnB1c2gocSk7XG4gIH1cbiAgd2hpbGUgKHEgPSBuZXh0LnBvcCgpKSB7XG4gICAgY2FsbGJhY2socS5ub2RlLCBxLngwLCBxLnkwLCBxLngxLCBxLnkxKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gZGVmYXVsdFgoZCkge1xuICByZXR1cm4gZFswXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oXykge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl94ID0gXywgdGhpcykgOiB0aGlzLl94O1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0WShkKSB7XG4gIHJldHVybiBkWzFdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihfKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3kgPSBfLCB0aGlzKSA6IHRoaXMuX3k7XG59XG4iLCAiaW1wb3J0IHRyZWVfYWRkLCB7YWRkQWxsIGFzIHRyZWVfYWRkQWxsfSBmcm9tIFwiLi9hZGQuanNcIjtcbmltcG9ydCB0cmVlX2NvdmVyIGZyb20gXCIuL2NvdmVyLmpzXCI7XG5pbXBvcnQgdHJlZV9kYXRhIGZyb20gXCIuL2RhdGEuanNcIjtcbmltcG9ydCB0cmVlX2V4dGVudCBmcm9tIFwiLi9leHRlbnQuanNcIjtcbmltcG9ydCB0cmVlX2ZpbmQgZnJvbSBcIi4vZmluZC5qc1wiO1xuaW1wb3J0IHRyZWVfcmVtb3ZlLCB7cmVtb3ZlQWxsIGFzIHRyZWVfcmVtb3ZlQWxsfSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmVlX3Jvb3QgZnJvbSBcIi4vcm9vdC5qc1wiO1xuaW1wb3J0IHRyZWVfc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgdHJlZV92aXNpdCBmcm9tIFwiLi92aXNpdC5qc1wiO1xuaW1wb3J0IHRyZWVfdmlzaXRBZnRlciBmcm9tIFwiLi92aXNpdEFmdGVyLmpzXCI7XG5pbXBvcnQgdHJlZV94LCB7ZGVmYXVsdFh9IGZyb20gXCIuL3guanNcIjtcbmltcG9ydCB0cmVlX3ksIHtkZWZhdWx0WX0gZnJvbSBcIi4veS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFkdHJlZShub2RlcywgeCwgeSkge1xuICB2YXIgdHJlZSA9IG5ldyBRdWFkdHJlZSh4ID09IG51bGwgPyBkZWZhdWx0WCA6IHgsIHkgPT0gbnVsbCA/IGRlZmF1bHRZIDogeSwgTmFOLCBOYU4sIE5hTiwgTmFOKTtcbiAgcmV0dXJuIG5vZGVzID09IG51bGwgPyB0cmVlIDogdHJlZS5hZGRBbGwobm9kZXMpO1xufVxuXG5mdW5jdGlvbiBRdWFkdHJlZSh4LCB5LCB4MCwgeTAsIHgxLCB5MSkge1xuICB0aGlzLl94ID0geDtcbiAgdGhpcy5feSA9IHk7XG4gIHRoaXMuX3gwID0geDA7XG4gIHRoaXMuX3kwID0geTA7XG4gIHRoaXMuX3gxID0geDE7XG4gIHRoaXMuX3kxID0geTE7XG4gIHRoaXMuX3Jvb3QgPSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGxlYWZfY29weShsZWFmKSB7XG4gIHZhciBjb3B5ID0ge2RhdGE6IGxlYWYuZGF0YX0sIG5leHQgPSBjb3B5O1xuICB3aGlsZSAobGVhZiA9IGxlYWYubmV4dCkgbmV4dCA9IG5leHQubmV4dCA9IHtkYXRhOiBsZWFmLmRhdGF9O1xuICByZXR1cm4gY29weTtcbn1cblxudmFyIHRyZWVQcm90byA9IHF1YWR0cmVlLnByb3RvdHlwZSA9IFF1YWR0cmVlLnByb3RvdHlwZTtcblxudHJlZVByb3RvLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNvcHkgPSBuZXcgUXVhZHRyZWUodGhpcy5feCwgdGhpcy5feSwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpLFxuICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsXG4gICAgICBub2RlcyxcbiAgICAgIGNoaWxkO1xuXG4gIGlmICghbm9kZSkgcmV0dXJuIGNvcHk7XG5cbiAgaWYgKCFub2RlLmxlbmd0aCkgcmV0dXJuIGNvcHkuX3Jvb3QgPSBsZWFmX2NvcHkobm9kZSksIGNvcHk7XG5cbiAgbm9kZXMgPSBbe3NvdXJjZTogbm9kZSwgdGFyZ2V0OiBjb3B5Ll9yb290ID0gbmV3IEFycmF5KDQpfV07XG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgaWYgKGNoaWxkID0gbm9kZS5zb3VyY2VbaV0pIHtcbiAgICAgICAgaWYgKGNoaWxkLmxlbmd0aCkgbm9kZXMucHVzaCh7c291cmNlOiBjaGlsZCwgdGFyZ2V0OiBub2RlLnRhcmdldFtpXSA9IG5ldyBBcnJheSg0KX0pO1xuICAgICAgICBlbHNlIG5vZGUudGFyZ2V0W2ldID0gbGVhZl9jb3B5KGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29weTtcbn07XG5cbnRyZWVQcm90by5hZGQgPSB0cmVlX2FkZDtcbnRyZWVQcm90by5hZGRBbGwgPSB0cmVlX2FkZEFsbDtcbnRyZWVQcm90by5jb3ZlciA9IHRyZWVfY292ZXI7XG50cmVlUHJvdG8uZGF0YSA9IHRyZWVfZGF0YTtcbnRyZWVQcm90by5leHRlbnQgPSB0cmVlX2V4dGVudDtcbnRyZWVQcm90by5maW5kID0gdHJlZV9maW5kO1xudHJlZVByb3RvLnJlbW92ZSA9IHRyZWVfcmVtb3ZlO1xudHJlZVByb3RvLnJlbW92ZUFsbCA9IHRyZWVfcmVtb3ZlQWxsO1xudHJlZVByb3RvLnJvb3QgPSB0cmVlX3Jvb3Q7XG50cmVlUHJvdG8uc2l6ZSA9IHRyZWVfc2l6ZTtcbnRyZWVQcm90by52aXNpdCA9IHRyZWVfdmlzaXQ7XG50cmVlUHJvdG8udmlzaXRBZnRlciA9IHRyZWVfdmlzaXRBZnRlcjtcbnRyZWVQcm90by54ID0gdHJlZV94O1xudHJlZVByb3RvLnkgPSB0cmVlX3k7XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocmFuZG9tKSB7XG4gIHJldHVybiAocmFuZG9tKCkgLSAwLjUpICogMWUtNjtcbn1cbiIsICJpbXBvcnQge3F1YWR0cmVlfSBmcm9tIFwiZDMtcXVhZHRyZWVcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IGppZ2dsZSBmcm9tIFwiLi9qaWdnbGUuanNcIjtcblxuZnVuY3Rpb24geChkKSB7XG4gIHJldHVybiBkLnggKyBkLnZ4O1xufVxuXG5mdW5jdGlvbiB5KGQpIHtcbiAgcmV0dXJuIGQueSArIGQudnk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHJhZGl1cykge1xuICB2YXIgbm9kZXMsXG4gICAgICByYWRpaSxcbiAgICAgIHJhbmRvbSxcbiAgICAgIHN0cmVuZ3RoID0gMSxcbiAgICAgIGl0ZXJhdGlvbnMgPSAxO1xuXG4gIGlmICh0eXBlb2YgcmFkaXVzICE9PSBcImZ1bmN0aW9uXCIpIHJhZGl1cyA9IGNvbnN0YW50KHJhZGl1cyA9PSBudWxsID8gMSA6ICtyYWRpdXMpO1xuXG4gIGZ1bmN0aW9uIGZvcmNlKCkge1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICB0cmVlLFxuICAgICAgICBub2RlLFxuICAgICAgICB4aSxcbiAgICAgICAgeWksXG4gICAgICAgIHJpLFxuICAgICAgICByaTI7XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGl0ZXJhdGlvbnM7ICsraykge1xuICAgICAgdHJlZSA9IHF1YWR0cmVlKG5vZGVzLCB4LCB5KS52aXNpdEFmdGVyKHByZXBhcmUpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHJpID0gcmFkaWlbbm9kZS5pbmRleF0sIHJpMiA9IHJpICogcmk7XG4gICAgICAgIHhpID0gbm9kZS54ICsgbm9kZS52eDtcbiAgICAgICAgeWkgPSBub2RlLnkgKyBub2RlLnZ5O1xuICAgICAgICB0cmVlLnZpc2l0KGFwcGx5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBseShxdWFkLCB4MCwgeTAsIHgxLCB5MSkge1xuICAgICAgdmFyIGRhdGEgPSBxdWFkLmRhdGEsIHJqID0gcXVhZC5yLCByID0gcmkgKyByajtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLmluZGV4ID4gbm9kZS5pbmRleCkge1xuICAgICAgICAgIHZhciB4ID0geGkgLSBkYXRhLnggLSBkYXRhLnZ4LFxuICAgICAgICAgICAgICB5ID0geWkgLSBkYXRhLnkgLSBkYXRhLnZ5LFxuICAgICAgICAgICAgICBsID0geCAqIHggKyB5ICogeTtcbiAgICAgICAgICBpZiAobCA8IHIgKiByKSB7XG4gICAgICAgICAgICBpZiAoeCA9PT0gMCkgeCA9IGppZ2dsZShyYW5kb20pLCBsICs9IHggKiB4O1xuICAgICAgICAgICAgaWYgKHkgPT09IDApIHkgPSBqaWdnbGUocmFuZG9tKSwgbCArPSB5ICogeTtcbiAgICAgICAgICAgIGwgPSAociAtIChsID0gTWF0aC5zcXJ0KGwpKSkgLyBsICogc3RyZW5ndGg7XG4gICAgICAgICAgICBub2RlLnZ4ICs9ICh4ICo9IGwpICogKHIgPSAocmogKj0gcmopIC8gKHJpMiArIHJqKSk7XG4gICAgICAgICAgICBub2RlLnZ5ICs9ICh5ICo9IGwpICogcjtcbiAgICAgICAgICAgIGRhdGEudnggLT0geCAqIChyID0gMSAtIHIpO1xuICAgICAgICAgICAgZGF0YS52eSAtPSB5ICogcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHgwID4geGkgKyByIHx8IHgxIDwgeGkgLSByIHx8IHkwID4geWkgKyByIHx8IHkxIDwgeWkgLSByO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXBhcmUocXVhZCkge1xuICAgIGlmIChxdWFkLmRhdGEpIHJldHVybiBxdWFkLnIgPSByYWRpaVtxdWFkLmRhdGEuaW5kZXhdO1xuICAgIGZvciAodmFyIGkgPSBxdWFkLnIgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICBpZiAocXVhZFtpXSAmJiBxdWFkW2ldLnIgPiBxdWFkLnIpIHtcbiAgICAgICAgcXVhZC5yID0gcXVhZFtpXS5yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlO1xuICAgIHJhZGlpID0gbmV3IEFycmF5KG4pO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIG5vZGUgPSBub2Rlc1tpXSwgcmFkaWlbbm9kZS5pbmRleF0gPSArcmFkaXVzKG5vZGUsIGksIG5vZGVzKTtcbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfbm9kZXMsIF9yYW5kb20pIHtcbiAgICBub2RlcyA9IF9ub2RlcztcbiAgICByYW5kb20gPSBfcmFuZG9tO1xuICAgIGluaXRpYWxpemUoKTtcbiAgfTtcblxuICBmb3JjZS5pdGVyYXRpb25zID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGl0ZXJhdGlvbnMgPSArXywgZm9yY2UpIDogaXRlcmF0aW9ucztcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9ICtfLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICBmb3JjZS5yYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGluaXRpYWxpemUoKSwgZm9yY2UpIDogcmFkaXVzO1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsICJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBqaWdnbGUgZnJvbSBcIi4vamlnZ2xlLmpzXCI7XG5cbmZ1bmN0aW9uIGluZGV4KGQpIHtcbiAgcmV0dXJuIGQuaW5kZXg7XG59XG5cbmZ1bmN0aW9uIGZpbmQobm9kZUJ5SWQsIG5vZGVJZCkge1xuICB2YXIgbm9kZSA9IG5vZGVCeUlkLmdldChub2RlSWQpO1xuICBpZiAoIW5vZGUpIHRocm93IG5ldyBFcnJvcihcIm5vZGUgbm90IGZvdW5kOiBcIiArIG5vZGVJZCk7XG4gIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihsaW5rcykge1xuICB2YXIgaWQgPSBpbmRleCxcbiAgICAgIHN0cmVuZ3RoID0gZGVmYXVsdFN0cmVuZ3RoLFxuICAgICAgc3RyZW5ndGhzLFxuICAgICAgZGlzdGFuY2UgPSBjb25zdGFudCgzMCksXG4gICAgICBkaXN0YW5jZXMsXG4gICAgICBub2RlcyxcbiAgICAgIGNvdW50LFxuICAgICAgYmlhcyxcbiAgICAgIHJhbmRvbSxcbiAgICAgIGl0ZXJhdGlvbnMgPSAxO1xuXG4gIGlmIChsaW5rcyA9PSBudWxsKSBsaW5rcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGRlZmF1bHRTdHJlbmd0aChsaW5rKSB7XG4gICAgcmV0dXJuIDEgLyBNYXRoLm1pbihjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0sIGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JjZShhbHBoYSkge1xuICAgIGZvciAodmFyIGsgPSAwLCBuID0gbGlua3MubGVuZ3RoOyBrIDwgaXRlcmF0aW9uczsgKytrKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGluaywgc291cmNlLCB0YXJnZXQsIHgsIHksIGwsIGI7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgbGluayA9IGxpbmtzW2ldLCBzb3VyY2UgPSBsaW5rLnNvdXJjZSwgdGFyZ2V0ID0gbGluay50YXJnZXQ7XG4gICAgICAgIHggPSB0YXJnZXQueCArIHRhcmdldC52eCAtIHNvdXJjZS54IC0gc291cmNlLnZ4IHx8IGppZ2dsZShyYW5kb20pO1xuICAgICAgICB5ID0gdGFyZ2V0LnkgKyB0YXJnZXQudnkgLSBzb3VyY2UueSAtIHNvdXJjZS52eSB8fCBqaWdnbGUocmFuZG9tKTtcbiAgICAgICAgbCA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbiAgICAgICAgbCA9IChsIC0gZGlzdGFuY2VzW2ldKSAvIGwgKiBhbHBoYSAqIHN0cmVuZ3Roc1tpXTtcbiAgICAgICAgeCAqPSBsLCB5ICo9IGw7XG4gICAgICAgIHRhcmdldC52eCAtPSB4ICogKGIgPSBiaWFzW2ldKTtcbiAgICAgICAgdGFyZ2V0LnZ5IC09IHkgKiBiO1xuICAgICAgICBzb3VyY2UudnggKz0geCAqIChiID0gMSAtIGIpO1xuICAgICAgICBzb3VyY2UudnkgKz0geSAqIGI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHtcbiAgICBpZiAoIW5vZGVzKSByZXR1cm47XG5cbiAgICB2YXIgaSxcbiAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgICAgbSA9IGxpbmtzLmxlbmd0aCxcbiAgICAgICAgbm9kZUJ5SWQgPSBuZXcgTWFwKG5vZGVzLm1hcCgoZCwgaSkgPT4gW2lkKGQsIGksIG5vZGVzKSwgZF0pKSxcbiAgICAgICAgbGluaztcblxuICAgIGZvciAoaSA9IDAsIGNvdW50ID0gbmV3IEFycmF5KG4pOyBpIDwgbTsgKytpKSB7XG4gICAgICBsaW5rID0gbGlua3NbaV0sIGxpbmsuaW5kZXggPSBpO1xuICAgICAgaWYgKHR5cGVvZiBsaW5rLnNvdXJjZSAhPT0gXCJvYmplY3RcIikgbGluay5zb3VyY2UgPSBmaW5kKG5vZGVCeUlkLCBsaW5rLnNvdXJjZSk7XG4gICAgICBpZiAodHlwZW9mIGxpbmsudGFyZ2V0ICE9PSBcIm9iamVjdFwiKSBsaW5rLnRhcmdldCA9IGZpbmQobm9kZUJ5SWQsIGxpbmsudGFyZ2V0KTtcbiAgICAgIGNvdW50W2xpbmsuc291cmNlLmluZGV4XSA9IChjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0gfHwgMCkgKyAxO1xuICAgICAgY291bnRbbGluay50YXJnZXQuaW5kZXhdID0gKGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSB8fCAwKSArIDE7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMCwgYmlhcyA9IG5ldyBBcnJheShtKTsgaSA8IG07ICsraSkge1xuICAgICAgbGluayA9IGxpbmtzW2ldLCBiaWFzW2ldID0gY291bnRbbGluay5zb3VyY2UuaW5kZXhdIC8gKGNvdW50W2xpbmsuc291cmNlLmluZGV4XSArIGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSk7XG4gICAgfVxuXG4gICAgc3RyZW5ndGhzID0gbmV3IEFycmF5KG0pLCBpbml0aWFsaXplU3RyZW5ndGgoKTtcbiAgICBkaXN0YW5jZXMgPSBuZXcgQXJyYXkobSksIGluaXRpYWxpemVEaXN0YW5jZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZVN0cmVuZ3RoKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcblxuICAgIGZvciAodmFyIGkgPSAwLCBuID0gbGlua3MubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICBzdHJlbmd0aHNbaV0gPSArc3RyZW5ndGgobGlua3NbaV0sIGksIGxpbmtzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplRGlzdGFuY2UoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSBsaW5rcy5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIGRpc3RhbmNlc1tpXSA9ICtkaXN0YW5jZShsaW5rc1tpXSwgaSwgbGlua3MpO1xuICAgIH1cbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfbm9kZXMsIF9yYW5kb20pIHtcbiAgICBub2RlcyA9IF9ub2RlcztcbiAgICByYW5kb20gPSBfcmFuZG9tO1xuICAgIGluaXRpYWxpemUoKTtcbiAgfTtcblxuICBmb3JjZS5saW5rcyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChsaW5rcyA9IF8sIGluaXRpYWxpemUoKSwgZm9yY2UpIDogbGlua3M7XG4gIH07XG5cbiAgZm9yY2UuaWQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaWQgPSBfLCBmb3JjZSkgOiBpZDtcbiAgfTtcblxuICBmb3JjZS5pdGVyYXRpb25zID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGl0ZXJhdGlvbnMgPSArXywgZm9yY2UpIDogaXRlcmF0aW9ucztcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplU3RyZW5ndGgoKSwgZm9yY2UpIDogc3RyZW5ndGg7XG4gIH07XG5cbiAgZm9yY2UuZGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2UgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZURpc3RhbmNlKCksIGZvcmNlKSA6IGRpc3RhbmNlO1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsICIvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaW5lYXJfY29uZ3J1ZW50aWFsX2dlbmVyYXRvciNQYXJhbWV0ZXJzX2luX2NvbW1vbl91c2VcbmNvbnN0IGEgPSAxNjY0NTI1O1xuY29uc3QgYyA9IDEwMTM5MDQyMjM7XG5jb25zdCBtID0gNDI5NDk2NzI5NjsgLy8gMl4zMlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHMgPSAxO1xuICByZXR1cm4gKCkgPT4gKHMgPSAoYSAqIHMgKyBjKSAlIG0pIC8gbTtcbn1cbiIsICJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7dGltZXJ9IGZyb20gXCJkMy10aW1lclwiO1xuaW1wb3J0IGxjZyBmcm9tIFwiLi9sY2cuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHgoZCkge1xuICByZXR1cm4gZC54O1xufVxuXG5leHBvcnQgZnVuY3Rpb24geShkKSB7XG4gIHJldHVybiBkLnk7XG59XG5cbnZhciBpbml0aWFsUmFkaXVzID0gMTAsXG4gICAgaW5pdGlhbEFuZ2xlID0gTWF0aC5QSSAqICgzIC0gTWF0aC5zcXJ0KDUpKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZXMpIHtcbiAgdmFyIHNpbXVsYXRpb24sXG4gICAgICBhbHBoYSA9IDEsXG4gICAgICBhbHBoYU1pbiA9IDAuMDAxLFxuICAgICAgYWxwaGFEZWNheSA9IDEgLSBNYXRoLnBvdyhhbHBoYU1pbiwgMSAvIDMwMCksXG4gICAgICBhbHBoYVRhcmdldCA9IDAsXG4gICAgICB2ZWxvY2l0eURlY2F5ID0gMC42LFxuICAgICAgZm9yY2VzID0gbmV3IE1hcCgpLFxuICAgICAgc3RlcHBlciA9IHRpbWVyKHN0ZXApLFxuICAgICAgZXZlbnQgPSBkaXNwYXRjaChcInRpY2tcIiwgXCJlbmRcIiksXG4gICAgICByYW5kb20gPSBsY2coKTtcblxuICBpZiAobm9kZXMgPT0gbnVsbCkgbm9kZXMgPSBbXTtcblxuICBmdW5jdGlvbiBzdGVwKCkge1xuICAgIHRpY2soKTtcbiAgICBldmVudC5jYWxsKFwidGlja1wiLCBzaW11bGF0aW9uKTtcbiAgICBpZiAoYWxwaGEgPCBhbHBoYU1pbikge1xuICAgICAgc3RlcHBlci5zdG9wKCk7XG4gICAgICBldmVudC5jYWxsKFwiZW5kXCIsIHNpbXVsYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soaXRlcmF0aW9ucykge1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlO1xuXG4gICAgaWYgKGl0ZXJhdGlvbnMgPT09IHVuZGVmaW5lZCkgaXRlcmF0aW9ucyA9IDE7XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGl0ZXJhdGlvbnM7ICsraykge1xuICAgICAgYWxwaGEgKz0gKGFscGhhVGFyZ2V0IC0gYWxwaGEpICogYWxwaGFEZWNheTtcblxuICAgICAgZm9yY2VzLmZvckVhY2goZnVuY3Rpb24oZm9yY2UpIHtcbiAgICAgICAgZm9yY2UoYWxwaGEpO1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5meCA9PSBudWxsKSBub2RlLnggKz0gbm9kZS52eCAqPSB2ZWxvY2l0eURlY2F5O1xuICAgICAgICBlbHNlIG5vZGUueCA9IG5vZGUuZngsIG5vZGUudnggPSAwO1xuICAgICAgICBpZiAobm9kZS5meSA9PSBudWxsKSBub2RlLnkgKz0gbm9kZS52eSAqPSB2ZWxvY2l0eURlY2F5O1xuICAgICAgICBlbHNlIG5vZGUueSA9IG5vZGUuZnksIG5vZGUudnkgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaW11bGF0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZU5vZGVzKCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUuaW5kZXggPSBpO1xuICAgICAgaWYgKG5vZGUuZnggIT0gbnVsbCkgbm9kZS54ID0gbm9kZS5meDtcbiAgICAgIGlmIChub2RlLmZ5ICE9IG51bGwpIG5vZGUueSA9IG5vZGUuZnk7XG4gICAgICBpZiAoaXNOYU4obm9kZS54KSB8fCBpc05hTihub2RlLnkpKSB7XG4gICAgICAgIHZhciByYWRpdXMgPSBpbml0aWFsUmFkaXVzICogTWF0aC5zcXJ0KDAuNSArIGkpLCBhbmdsZSA9IGkgKiBpbml0aWFsQW5nbGU7XG4gICAgICAgIG5vZGUueCA9IHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlKTtcbiAgICAgICAgbm9kZS55ID0gcmFkaXVzICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgfVxuICAgICAgaWYgKGlzTmFOKG5vZGUudngpIHx8IGlzTmFOKG5vZGUudnkpKSB7XG4gICAgICAgIG5vZGUudnggPSBub2RlLnZ5ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplRm9yY2UoZm9yY2UpIHtcbiAgICBpZiAoZm9yY2UuaW5pdGlhbGl6ZSkgZm9yY2UuaW5pdGlhbGl6ZShub2RlcywgcmFuZG9tKTtcbiAgICByZXR1cm4gZm9yY2U7XG4gIH1cblxuICBpbml0aWFsaXplTm9kZXMoKTtcblxuICByZXR1cm4gc2ltdWxhdGlvbiA9IHtcbiAgICB0aWNrOiB0aWNrLFxuXG4gICAgcmVzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3RlcHBlci5yZXN0YXJ0KHN0ZXApLCBzaW11bGF0aW9uO1xuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzdGVwcGVyLnN0b3AoKSwgc2ltdWxhdGlvbjtcbiAgICB9LFxuXG4gICAgbm9kZXM6IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVzID0gXywgaW5pdGlhbGl6ZU5vZGVzKCksIGZvcmNlcy5mb3JFYWNoKGluaXRpYWxpemVGb3JjZSksIHNpbXVsYXRpb24pIDogbm9kZXM7XG4gICAgfSxcblxuICAgIGFscGhhOiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYSA9ICtfLCBzaW11bGF0aW9uKSA6IGFscGhhO1xuICAgIH0sXG5cbiAgICBhbHBoYU1pbjogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFNaW4gPSArXywgc2ltdWxhdGlvbikgOiBhbHBoYU1pbjtcbiAgICB9LFxuXG4gICAgYWxwaGFEZWNheTogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFEZWNheSA9ICtfLCBzaW11bGF0aW9uKSA6ICthbHBoYURlY2F5O1xuICAgIH0sXG5cbiAgICBhbHBoYVRhcmdldDogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFUYXJnZXQgPSArXywgc2ltdWxhdGlvbikgOiBhbHBoYVRhcmdldDtcbiAgICB9LFxuXG4gICAgdmVsb2NpdHlEZWNheTogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmVsb2NpdHlEZWNheSA9IDEgLSBfLCBzaW11bGF0aW9uKSA6IDEgLSB2ZWxvY2l0eURlY2F5O1xuICAgIH0sXG5cbiAgICByYW5kb21Tb3VyY2U6IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmRvbSA9IF8sIGZvcmNlcy5mb3JFYWNoKGluaXRpYWxpemVGb3JjZSksIHNpbXVsYXRpb24pIDogcmFuZG9tO1xuICAgIH0sXG5cbiAgICBmb3JjZTogZnVuY3Rpb24obmFtZSwgXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gKChfID09IG51bGwgPyBmb3JjZXMuZGVsZXRlKG5hbWUpIDogZm9yY2VzLnNldChuYW1lLCBpbml0aWFsaXplRm9yY2UoXykpKSwgc2ltdWxhdGlvbikgOiBmb3JjZXMuZ2V0KG5hbWUpO1xuICAgIH0sXG5cbiAgICBmaW5kOiBmdW5jdGlvbih4LCB5LCByYWRpdXMpIHtcbiAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICAgIGR4LFxuICAgICAgICAgIGR5LFxuICAgICAgICAgIGQyLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgY2xvc2VzdDtcblxuICAgICAgaWYgKHJhZGl1cyA9PSBudWxsKSByYWRpdXMgPSBJbmZpbml0eTtcbiAgICAgIGVsc2UgcmFkaXVzICo9IHJhZGl1cztcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIGR4ID0geCAtIG5vZGUueDtcbiAgICAgICAgZHkgPSB5IC0gbm9kZS55O1xuICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgICAgICBpZiAoZDIgPCByYWRpdXMpIGNsb3Nlc3QgPSBub2RlLCByYWRpdXMgPSBkMjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNsb3Nlc3Q7XG4gICAgfSxcblxuICAgIG9uOiBmdW5jdGlvbihuYW1lLCBfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAoZXZlbnQub24obmFtZSwgXyksIHNpbXVsYXRpb24pIDogZXZlbnQub24obmFtZSk7XG4gICAgfVxuICB9O1xufVxuIiwgImltcG9ydCB7cXVhZHRyZWV9IGZyb20gXCJkMy1xdWFkdHJlZVwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgamlnZ2xlIGZyb20gXCIuL2ppZ2dsZS5qc1wiO1xuaW1wb3J0IHt4LCB5fSBmcm9tIFwiLi9zaW11bGF0aW9uLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbm9kZXMsXG4gICAgICBub2RlLFxuICAgICAgcmFuZG9tLFxuICAgICAgYWxwaGEsXG4gICAgICBzdHJlbmd0aCA9IGNvbnN0YW50KC0zMCksXG4gICAgICBzdHJlbmd0aHMsXG4gICAgICBkaXN0YW5jZU1pbjIgPSAxLFxuICAgICAgZGlzdGFuY2VNYXgyID0gSW5maW5pdHksXG4gICAgICB0aGV0YTIgPSAwLjgxO1xuXG4gIGZ1bmN0aW9uIGZvcmNlKF8pIHtcbiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgdHJlZSA9IHF1YWR0cmVlKG5vZGVzLCB4LCB5KS52aXNpdEFmdGVyKGFjY3VtdWxhdGUpO1xuICAgIGZvciAoYWxwaGEgPSBfLCBpID0gMDsgaSA8IG47ICsraSkgbm9kZSA9IG5vZGVzW2ldLCB0cmVlLnZpc2l0KGFwcGx5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlO1xuICAgIHN0cmVuZ3RocyA9IG5ldyBBcnJheShuKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBub2RlID0gbm9kZXNbaV0sIHN0cmVuZ3Roc1tub2RlLmluZGV4XSA9ICtzdHJlbmd0aChub2RlLCBpLCBub2Rlcyk7XG4gIH1cblxuICBmdW5jdGlvbiBhY2N1bXVsYXRlKHF1YWQpIHtcbiAgICB2YXIgc3RyZW5ndGggPSAwLCBxLCBjLCB3ZWlnaHQgPSAwLCB4LCB5LCBpO1xuXG4gICAgLy8gRm9yIGludGVybmFsIG5vZGVzLCBhY2N1bXVsYXRlIGZvcmNlcyBmcm9tIGNoaWxkIHF1YWRyYW50cy5cbiAgICBpZiAocXVhZC5sZW5ndGgpIHtcbiAgICAgIGZvciAoeCA9IHkgPSBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICBpZiAoKHEgPSBxdWFkW2ldKSAmJiAoYyA9IE1hdGguYWJzKHEudmFsdWUpKSkge1xuICAgICAgICAgIHN0cmVuZ3RoICs9IHEudmFsdWUsIHdlaWdodCArPSBjLCB4ICs9IGMgKiBxLngsIHkgKz0gYyAqIHEueTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcXVhZC54ID0geCAvIHdlaWdodDtcbiAgICAgIHF1YWQueSA9IHkgLyB3ZWlnaHQ7XG4gICAgfVxuXG4gICAgLy8gRm9yIGxlYWYgbm9kZXMsIGFjY3VtdWxhdGUgZm9yY2VzIGZyb20gY29pbmNpZGVudCBxdWFkcmFudHMuXG4gICAgZWxzZSB7XG4gICAgICBxID0gcXVhZDtcbiAgICAgIHEueCA9IHEuZGF0YS54O1xuICAgICAgcS55ID0gcS5kYXRhLnk7XG4gICAgICBkbyBzdHJlbmd0aCArPSBzdHJlbmd0aHNbcS5kYXRhLmluZGV4XTtcbiAgICAgIHdoaWxlIChxID0gcS5uZXh0KTtcbiAgICB9XG5cbiAgICBxdWFkLnZhbHVlID0gc3RyZW5ndGg7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseShxdWFkLCB4MSwgXywgeDIpIHtcbiAgICBpZiAoIXF1YWQudmFsdWUpIHJldHVybiB0cnVlO1xuXG4gICAgdmFyIHggPSBxdWFkLnggLSBub2RlLngsXG4gICAgICAgIHkgPSBxdWFkLnkgLSBub2RlLnksXG4gICAgICAgIHcgPSB4MiAtIHgxLFxuICAgICAgICBsID0geCAqIHggKyB5ICogeTtcblxuICAgIC8vIEFwcGx5IHRoZSBCYXJuZXMtSHV0IGFwcHJveGltYXRpb24gaWYgcG9zc2libGUuXG4gICAgLy8gTGltaXQgZm9yY2VzIGZvciB2ZXJ5IGNsb3NlIG5vZGVzOyByYW5kb21pemUgZGlyZWN0aW9uIGlmIGNvaW5jaWRlbnQuXG4gICAgaWYgKHcgKiB3IC8gdGhldGEyIDwgbCkge1xuICAgICAgaWYgKGwgPCBkaXN0YW5jZU1heDIpIHtcbiAgICAgICAgaWYgKHggPT09IDApIHggPSBqaWdnbGUocmFuZG9tKSwgbCArPSB4ICogeDtcbiAgICAgICAgaWYgKHkgPT09IDApIHkgPSBqaWdnbGUocmFuZG9tKSwgbCArPSB5ICogeTtcbiAgICAgICAgaWYgKGwgPCBkaXN0YW5jZU1pbjIpIGwgPSBNYXRoLnNxcnQoZGlzdGFuY2VNaW4yICogbCk7XG4gICAgICAgIG5vZGUudnggKz0geCAqIHF1YWQudmFsdWUgKiBhbHBoYSAvIGw7XG4gICAgICAgIG5vZGUudnkgKz0geSAqIHF1YWQudmFsdWUgKiBhbHBoYSAvIGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHByb2Nlc3MgcG9pbnRzIGRpcmVjdGx5LlxuICAgIGVsc2UgaWYgKHF1YWQubGVuZ3RoIHx8IGwgPj0gZGlzdGFuY2VNYXgyKSByZXR1cm47XG5cbiAgICAvLyBMaW1pdCBmb3JjZXMgZm9yIHZlcnkgY2xvc2Ugbm9kZXM7IHJhbmRvbWl6ZSBkaXJlY3Rpb24gaWYgY29pbmNpZGVudC5cbiAgICBpZiAocXVhZC5kYXRhICE9PSBub2RlIHx8IHF1YWQubmV4dCkge1xuICAgICAgaWYgKHggPT09IDApIHggPSBqaWdnbGUocmFuZG9tKSwgbCArPSB4ICogeDtcbiAgICAgIGlmICh5ID09PSAwKSB5ID0gamlnZ2xlKHJhbmRvbSksIGwgKz0geSAqIHk7XG4gICAgICBpZiAobCA8IGRpc3RhbmNlTWluMikgbCA9IE1hdGguc3FydChkaXN0YW5jZU1pbjIgKiBsKTtcbiAgICB9XG5cbiAgICBkbyBpZiAocXVhZC5kYXRhICE9PSBub2RlKSB7XG4gICAgICB3ID0gc3RyZW5ndGhzW3F1YWQuZGF0YS5pbmRleF0gKiBhbHBoYSAvIGw7XG4gICAgICBub2RlLnZ4ICs9IHggKiB3O1xuICAgICAgbm9kZS52eSArPSB5ICogdztcbiAgICB9IHdoaWxlIChxdWFkID0gcXVhZC5uZXh0KTtcbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfbm9kZXMsIF9yYW5kb20pIHtcbiAgICBub2RlcyA9IF9ub2RlcztcbiAgICByYW5kb20gPSBfcmFuZG9tO1xuICAgIGluaXRpYWxpemUoKTtcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHN0cmVuZ3RoO1xuICB9O1xuXG4gIGZvcmNlLmRpc3RhbmNlTWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRpc3RhbmNlTWluMiA9IF8gKiBfLCBmb3JjZSkgOiBNYXRoLnNxcnQoZGlzdGFuY2VNaW4yKTtcbiAgfTtcblxuICBmb3JjZS5kaXN0YW5jZU1heCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkaXN0YW5jZU1heDIgPSBfICogXywgZm9yY2UpIDogTWF0aC5zcXJ0KGRpc3RhbmNlTWF4Mik7XG4gIH07XG5cbiAgZm9yY2UudGhldGEgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhldGEyID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydCh0aGV0YTIpO1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsICJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICB2YXIgc3RyZW5ndGggPSBjb25zdGFudCgwLjEpLFxuICAgICAgbm9kZXMsXG4gICAgICBzdHJlbmd0aHMsXG4gICAgICB4ejtcblxuICBpZiAodHlwZW9mIHggIT09IFwiZnVuY3Rpb25cIikgeCA9IGNvbnN0YW50KHggPT0gbnVsbCA/IDAgOiAreCk7XG5cbiAgZnVuY3Rpb24gZm9yY2UoYWxwaGEpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLnZ4ICs9ICh4eltpXSAtIG5vZGUueCkgKiBzdHJlbmd0aHNbaV0gKiBhbHBoYTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcbiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aDtcbiAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobik7XG4gICAgeHogPSBuZXcgQXJyYXkobik7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgc3RyZW5ndGhzW2ldID0gaXNOYU4oeHpbaV0gPSAreChub2Rlc1tpXSwgaSwgbm9kZXMpKSA/IDAgOiArc3RyZW5ndGgobm9kZXNbaV0sIGksIG5vZGVzKTtcbiAgICB9XG4gIH1cblxuICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykge1xuICAgIG5vZGVzID0gXztcbiAgICBpbml0aWFsaXplKCk7XG4gIH07XG5cbiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICBmb3JjZS54ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiB4O1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsICJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeSkge1xuICB2YXIgc3RyZW5ndGggPSBjb25zdGFudCgwLjEpLFxuICAgICAgbm9kZXMsXG4gICAgICBzdHJlbmd0aHMsXG4gICAgICB5ejtcblxuICBpZiAodHlwZW9mIHkgIT09IFwiZnVuY3Rpb25cIikgeSA9IGNvbnN0YW50KHkgPT0gbnVsbCA/IDAgOiAreSk7XG5cbiAgZnVuY3Rpb24gZm9yY2UoYWxwaGEpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLnZ5ICs9ICh5eltpXSAtIG5vZGUueSkgKiBzdHJlbmd0aHNbaV0gKiBhbHBoYTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcbiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aDtcbiAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobik7XG4gICAgeXogPSBuZXcgQXJyYXkobik7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgc3RyZW5ndGhzW2ldID0gaXNOYU4oeXpbaV0gPSAreShub2Rlc1tpXSwgaSwgbm9kZXMpKSA/IDAgOiArc3RyZW5ndGgobm9kZXNbaV0sIGksIG5vZGVzKTtcbiAgICB9XG4gIH1cblxuICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykge1xuICAgIG5vZGVzID0gXztcbiAgICBpbml0aWFsaXplKCk7XG4gIH07XG5cbiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICBmb3JjZS55ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiB5O1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBNYXRoLmFicyh4ID0gTWF0aC5yb3VuZCh4KSkgPj0gMWUyMVxuICAgICAgPyB4LnRvTG9jYWxlU3RyaW5nKFwiZW5cIikucmVwbGFjZSgvLC9nLCBcIlwiKVxuICAgICAgOiB4LnRvU3RyaW5nKDEwKTtcbn1cblxuLy8gQ29tcHV0ZXMgdGhlIGRlY2ltYWwgY29lZmZpY2llbnQgYW5kIGV4cG9uZW50IG9mIHRoZSBzcGVjaWZpZWQgbnVtYmVyIHggd2l0aFxuLy8gc2lnbmlmaWNhbnQgZGlnaXRzIHAsIHdoZXJlIHggaXMgcG9zaXRpdmUgYW5kIHAgaXMgaW4gWzEsIDIxXSBvciB1bmRlZmluZWQuXG4vLyBGb3IgZXhhbXBsZSwgZm9ybWF0RGVjaW1hbFBhcnRzKDEuMjMpIHJldHVybnMgW1wiMTIzXCIsIDBdLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKSB7XG4gIGlmICgoaSA9ICh4ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZihcImVcIikpIDwgMCkgcmV0dXJuIG51bGw7IC8vIE5hTiwgXHUwMEIxSW5maW5pdHlcbiAgdmFyIGksIGNvZWZmaWNpZW50ID0geC5zbGljZSgwLCBpKTtcblxuICAvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRvRXhwb25lbnRpYWwgZWl0aGVyIGhhcyB0aGUgZm9ybSBcXGRcXC5cXGQrZVstK11cXGQrXG4gIC8vIChlLmcuLCAxLjJlKzMpIG9yIHRoZSBmb3JtIFxcZGVbLStdXFxkKyAoZS5nLiwgMWUrMykuXG4gIHJldHVybiBbXG4gICAgY29lZmZpY2llbnQubGVuZ3RoID4gMSA/IGNvZWZmaWNpZW50WzBdICsgY29lZmZpY2llbnQuc2xpY2UoMikgOiBjb2VmZmljaWVudCxcbiAgICAreC5zbGljZShpICsgMSlcbiAgXTtcbn1cbiIsICJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4ID0gZm9ybWF0RGVjaW1hbFBhcnRzKE1hdGguYWJzKHgpKSwgeCA/IHhbMV0gOiBOYU47XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZ3JvdXBpbmcsIHRob3VzYW5kcykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIHdpZHRoKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5sZW5ndGgsXG4gICAgICAgIHQgPSBbXSxcbiAgICAgICAgaiA9IDAsXG4gICAgICAgIGcgPSBncm91cGluZ1swXSxcbiAgICAgICAgbGVuZ3RoID0gMDtcblxuICAgIHdoaWxlIChpID4gMCAmJiBnID4gMCkge1xuICAgICAgaWYgKGxlbmd0aCArIGcgKyAxID4gd2lkdGgpIGcgPSBNYXRoLm1heCgxLCB3aWR0aCAtIGxlbmd0aCk7XG4gICAgICB0LnB1c2godmFsdWUuc3Vic3RyaW5nKGkgLT0gZywgaSArIGcpKTtcbiAgICAgIGlmICgobGVuZ3RoICs9IGcgKyAxKSA+IHdpZHRoKSBicmVhaztcbiAgICAgIGcgPSBncm91cGluZ1tqID0gKGogKyAxKSAlIGdyb3VwaW5nLmxlbmd0aF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHQucmV2ZXJzZSgpLmpvaW4odGhvdXNhbmRzKTtcbiAgfTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihudW1lcmFscykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWzAtOV0vZywgZnVuY3Rpb24oaSkge1xuICAgICAgcmV0dXJuIG51bWVyYWxzWytpXTtcbiAgICB9KTtcbiAgfTtcbn1cbiIsICIvLyBbW2ZpbGxdYWxpZ25dW3NpZ25dW3N5bWJvbF1bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW35dW3R5cGVdXG52YXIgcmUgPSAvXig/OiguKT8oWzw+PV5dKSk/KFsrXFwtKCBdKT8oWyQjXSk/KDApPyhcXGQrKT8oLCk/KFxcLlxcZCspPyh+KT8oW2EteiVdKT8kL2k7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgaWYgKCEobWF0Y2ggPSByZS5leGVjKHNwZWNpZmllcikpKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGZvcm1hdDogXCIgKyBzcGVjaWZpZXIpO1xuICB2YXIgbWF0Y2g7XG4gIHJldHVybiBuZXcgRm9ybWF0U3BlY2lmaWVyKHtcbiAgICBmaWxsOiBtYXRjaFsxXSxcbiAgICBhbGlnbjogbWF0Y2hbMl0sXG4gICAgc2lnbjogbWF0Y2hbM10sXG4gICAgc3ltYm9sOiBtYXRjaFs0XSxcbiAgICB6ZXJvOiBtYXRjaFs1XSxcbiAgICB3aWR0aDogbWF0Y2hbNl0sXG4gICAgY29tbWE6IG1hdGNoWzddLFxuICAgIHByZWNpc2lvbjogbWF0Y2hbOF0gJiYgbWF0Y2hbOF0uc2xpY2UoMSksXG4gICAgdHJpbTogbWF0Y2hbOV0sXG4gICAgdHlwZTogbWF0Y2hbMTBdXG4gIH0pO1xufVxuXG5mb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlID0gRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZTsgLy8gaW5zdGFuY2VvZlxuXG5leHBvcnQgZnVuY3Rpb24gRm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikge1xuICB0aGlzLmZpbGwgPSBzcGVjaWZpZXIuZmlsbCA9PT0gdW5kZWZpbmVkID8gXCIgXCIgOiBzcGVjaWZpZXIuZmlsbCArIFwiXCI7XG4gIHRoaXMuYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24gPT09IHVuZGVmaW5lZCA/IFwiPlwiIDogc3BlY2lmaWVyLmFsaWduICsgXCJcIjtcbiAgdGhpcy5zaWduID0gc3BlY2lmaWVyLnNpZ24gPT09IHVuZGVmaW5lZCA/IFwiLVwiIDogc3BlY2lmaWVyLnNpZ24gKyBcIlwiO1xuICB0aGlzLnN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBzcGVjaWZpZXIuc3ltYm9sICsgXCJcIjtcbiAgdGhpcy56ZXJvID0gISFzcGVjaWZpZXIuemVybztcbiAgdGhpcy53aWR0aCA9IHNwZWNpZmllci53aWR0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogK3NwZWNpZmllci53aWR0aDtcbiAgdGhpcy5jb21tYSA9ICEhc3BlY2lmaWVyLmNvbW1hO1xuICB0aGlzLnByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIucHJlY2lzaW9uO1xuICB0aGlzLnRyaW0gPSAhIXNwZWNpZmllci50cmltO1xuICB0aGlzLnR5cGUgPSBzcGVjaWZpZXIudHlwZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHNwZWNpZmllci50eXBlICsgXCJcIjtcbn1cblxuRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5maWxsXG4gICAgICArIHRoaXMuYWxpZ25cbiAgICAgICsgdGhpcy5zaWduXG4gICAgICArIHRoaXMuc3ltYm9sXG4gICAgICArICh0aGlzLnplcm8gPyBcIjBcIiA6IFwiXCIpXG4gICAgICArICh0aGlzLndpZHRoID09PSB1bmRlZmluZWQgPyBcIlwiIDogTWF0aC5tYXgoMSwgdGhpcy53aWR0aCB8IDApKVxuICAgICAgKyAodGhpcy5jb21tYSA/IFwiLFwiIDogXCJcIilcbiAgICAgICsgKHRoaXMucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyBcIlwiIDogXCIuXCIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKVxuICAgICAgKyAodGhpcy50cmltID8gXCJ+XCIgOiBcIlwiKVxuICAgICAgKyB0aGlzLnR5cGU7XG59O1xuIiwgIi8vIFRyaW1zIGluc2lnbmlmaWNhbnQgemVyb3MsIGUuZy4sIHJlcGxhY2VzIDEuMjAwMGsgd2l0aCAxLjJrLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocykge1xuICBvdXQ6IGZvciAodmFyIG4gPSBzLmxlbmd0aCwgaSA9IDEsIGkwID0gLTEsIGkxOyBpIDwgbjsgKytpKSB7XG4gICAgc3dpdGNoIChzW2ldKSB7XG4gICAgICBjYXNlIFwiLlwiOiBpMCA9IGkxID0gaTsgYnJlYWs7XG4gICAgICBjYXNlIFwiMFwiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IGlmICghK3NbaV0pIGJyZWFrIG91dDsgaWYgKGkwID4gMCkgaTAgPSAwOyBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGkwID4gMCA/IHMuc2xpY2UoMCwgaTApICsgcy5zbGljZShpMSArIDEpIDogcztcbn1cbiIsICJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgdmFyIHByZWZpeEV4cG9uZW50O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCBwKSB7XG4gIHZhciBkID0gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApO1xuICBpZiAoIWQpIHJldHVybiB4ICsgXCJcIjtcbiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSxcbiAgICAgIGV4cG9uZW50ID0gZFsxXSxcbiAgICAgIGkgPSBleHBvbmVudCAtIChwcmVmaXhFeHBvbmVudCA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50IC8gMykpKSAqIDMpICsgMSxcbiAgICAgIG4gPSBjb2VmZmljaWVudC5sZW5ndGg7XG4gIHJldHVybiBpID09PSBuID8gY29lZmZpY2llbnRcbiAgICAgIDogaSA+IG4gPyBjb2VmZmljaWVudCArIG5ldyBBcnJheShpIC0gbiArIDEpLmpvaW4oXCIwXCIpXG4gICAgICA6IGkgPiAwID8gY29lZmZpY2llbnQuc2xpY2UoMCwgaSkgKyBcIi5cIiArIGNvZWZmaWNpZW50LnNsaWNlKGkpXG4gICAgICA6IFwiMC5cIiArIG5ldyBBcnJheSgxIC0gaSkuam9pbihcIjBcIikgKyBmb3JtYXREZWNpbWFsUGFydHMoeCwgTWF0aC5tYXgoMCwgcCArIGkgLSAxKSlbMF07IC8vIGxlc3MgdGhhbiAxeSFcbn1cbiIsICJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCBwKSB7XG4gIHZhciBkID0gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApO1xuICBpZiAoIWQpIHJldHVybiB4ICsgXCJcIjtcbiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSxcbiAgICAgIGV4cG9uZW50ID0gZFsxXTtcbiAgcmV0dXJuIGV4cG9uZW50IDwgMCA/IFwiMC5cIiArIG5ldyBBcnJheSgtZXhwb25lbnQpLmpvaW4oXCIwXCIpICsgY29lZmZpY2llbnRcbiAgICAgIDogY29lZmZpY2llbnQubGVuZ3RoID4gZXhwb25lbnQgKyAxID8gY29lZmZpY2llbnQuc2xpY2UoMCwgZXhwb25lbnQgKyAxKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoZXhwb25lbnQgKyAxKVxuICAgICAgOiBjb2VmZmljaWVudCArIG5ldyBBcnJheShleHBvbmVudCAtIGNvZWZmaWNpZW50Lmxlbmd0aCArIDIpLmpvaW4oXCIwXCIpO1xufVxuIiwgImltcG9ydCBmb3JtYXREZWNpbWFsIGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcbmltcG9ydCBmb3JtYXRQcmVmaXhBdXRvIGZyb20gXCIuL2Zvcm1hdFByZWZpeEF1dG8uanNcIjtcbmltcG9ydCBmb3JtYXRSb3VuZGVkIGZyb20gXCIuL2Zvcm1hdFJvdW5kZWQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBcIiVcIjogKHgsIHApID0+ICh4ICogMTAwKS50b0ZpeGVkKHApLFxuICBcImJcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMiksXG4gIFwiY1wiOiAoeCkgPT4geCArIFwiXCIsXG4gIFwiZFwiOiBmb3JtYXREZWNpbWFsLFxuICBcImVcIjogKHgsIHApID0+IHgudG9FeHBvbmVudGlhbChwKSxcbiAgXCJmXCI6ICh4LCBwKSA9PiB4LnRvRml4ZWQocCksXG4gIFwiZ1wiOiAoeCwgcCkgPT4geC50b1ByZWNpc2lvbihwKSxcbiAgXCJvXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDgpLFxuICBcInBcIjogKHgsIHApID0+IGZvcm1hdFJvdW5kZWQoeCAqIDEwMCwgcCksXG4gIFwiclwiOiBmb3JtYXRSb3VuZGVkLFxuICBcInNcIjogZm9ybWF0UHJlZml4QXV0byxcbiAgXCJYXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLFxuICBcInhcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpXG59O1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHg7XG59XG4iLCAiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5pbXBvcnQgZm9ybWF0R3JvdXAgZnJvbSBcIi4vZm9ybWF0R3JvdXAuanNcIjtcbmltcG9ydCBmb3JtYXROdW1lcmFscyBmcm9tIFwiLi9mb3JtYXROdW1lcmFscy5qc1wiO1xuaW1wb3J0IGZvcm1hdFNwZWNpZmllciBmcm9tIFwiLi9mb3JtYXRTcGVjaWZpZXIuanNcIjtcbmltcG9ydCBmb3JtYXRUcmltIGZyb20gXCIuL2Zvcm1hdFRyaW0uanNcIjtcbmltcG9ydCBmb3JtYXRUeXBlcyBmcm9tIFwiLi9mb3JtYXRUeXBlcy5qc1wiO1xuaW1wb3J0IHtwcmVmaXhFeHBvbmVudH0gZnJvbSBcIi4vZm9ybWF0UHJlZml4QXV0by5qc1wiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuL2lkZW50aXR5LmpzXCI7XG5cbnZhciBtYXAgPSBBcnJheS5wcm90b3R5cGUubWFwLFxuICAgIHByZWZpeGVzID0gW1wieVwiLFwielwiLFwiYVwiLFwiZlwiLFwicFwiLFwiblwiLFwiXHUwMEI1XCIsXCJtXCIsXCJcIixcImtcIixcIk1cIixcIkdcIixcIlRcIixcIlBcIixcIkVcIixcIlpcIixcIllcIl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGxvY2FsZSkge1xuICB2YXIgZ3JvdXAgPSBsb2NhbGUuZ3JvdXBpbmcgPT09IHVuZGVmaW5lZCB8fCBsb2NhbGUudGhvdXNhbmRzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSA6IGZvcm1hdEdyb3VwKG1hcC5jYWxsKGxvY2FsZS5ncm91cGluZywgTnVtYmVyKSwgbG9jYWxlLnRob3VzYW5kcyArIFwiXCIpLFxuICAgICAgY3VycmVuY3lQcmVmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBsb2NhbGUuY3VycmVuY3lbMF0gKyBcIlwiLFxuICAgICAgY3VycmVuY3lTdWZmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBsb2NhbGUuY3VycmVuY3lbMV0gKyBcIlwiLFxuICAgICAgZGVjaW1hbCA9IGxvY2FsZS5kZWNpbWFsID09PSB1bmRlZmluZWQgPyBcIi5cIiA6IGxvY2FsZS5kZWNpbWFsICsgXCJcIixcbiAgICAgIG51bWVyYWxzID0gbG9jYWxlLm51bWVyYWxzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSA6IGZvcm1hdE51bWVyYWxzKG1hcC5jYWxsKGxvY2FsZS5udW1lcmFscywgU3RyaW5nKSksXG4gICAgICBwZXJjZW50ID0gbG9jYWxlLnBlcmNlbnQgPT09IHVuZGVmaW5lZCA/IFwiJVwiIDogbG9jYWxlLnBlcmNlbnQgKyBcIlwiLFxuICAgICAgbWludXMgPSBsb2NhbGUubWludXMgPT09IHVuZGVmaW5lZCA/IFwiXHUyMjEyXCIgOiBsb2NhbGUubWludXMgKyBcIlwiLFxuICAgICAgbmFuID0gbG9jYWxlLm5hbiA9PT0gdW5kZWZpbmVkID8gXCJOYU5cIiA6IGxvY2FsZS5uYW4gKyBcIlwiO1xuXG4gIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIpIHtcbiAgICBzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKTtcblxuICAgIHZhciBmaWxsID0gc3BlY2lmaWVyLmZpbGwsXG4gICAgICAgIGFsaWduID0gc3BlY2lmaWVyLmFsaWduLFxuICAgICAgICBzaWduID0gc3BlY2lmaWVyLnNpZ24sXG4gICAgICAgIHN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wsXG4gICAgICAgIHplcm8gPSBzcGVjaWZpZXIuemVybyxcbiAgICAgICAgd2lkdGggPSBzcGVjaWZpZXIud2lkdGgsXG4gICAgICAgIGNvbW1hID0gc3BlY2lmaWVyLmNvbW1hLFxuICAgICAgICBwcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uLFxuICAgICAgICB0cmltID0gc3BlY2lmaWVyLnRyaW0sXG4gICAgICAgIHR5cGUgPSBzcGVjaWZpZXIudHlwZTtcblxuICAgIC8vIFRoZSBcIm5cIiB0eXBlIGlzIGFuIGFsaWFzIGZvciBcIixnXCIuXG4gICAgaWYgKHR5cGUgPT09IFwiblwiKSBjb21tYSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIFRoZSBcIlwiIHR5cGUsIGFuZCBhbnkgaW52YWxpZCB0eXBlLCBpcyBhbiBhbGlhcyBmb3IgXCIuMTJ+Z1wiLlxuICAgIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgcHJlY2lzaW9uID09PSB1bmRlZmluZWQgJiYgKHByZWNpc2lvbiA9IDEyKSwgdHJpbSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBhZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLlxuICAgIGlmICh6ZXJvIHx8IChmaWxsID09PSBcIjBcIiAmJiBhbGlnbiA9PT0gXCI9XCIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9IFwiMFwiLCBhbGlnbiA9IFwiPVwiO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgLy8gRm9yIFNJLXByZWZpeCwgdGhlIHN1ZmZpeCBpcyBsYXppbHkgY29tcHV0ZWQuXG4gICAgdmFyIHByZWZpeCA9IHN5bWJvbCA9PT0gXCIkXCIgPyBjdXJyZW5jeVByZWZpeCA6IHN5bWJvbCA9PT0gXCIjXCIgJiYgL1tib3hYXS8udGVzdCh0eXBlKSA/IFwiMFwiICsgdHlwZS50b0xvd2VyQ2FzZSgpIDogXCJcIixcbiAgICAgICAgc3VmZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5U3VmZml4IDogL1slcF0vLnRlc3QodHlwZSkgPyBwZXJjZW50IDogXCJcIjtcblxuICAgIC8vIFdoYXQgZm9ybWF0IGZ1bmN0aW9uIHNob3VsZCB3ZSB1c2U/XG4gICAgLy8gSXMgdGhpcyBhbiBpbnRlZ2VyIHR5cGU/XG4gICAgLy8gQ2FuIHRoaXMgdHlwZSBnZW5lcmF0ZSBleHBvbmVudGlhbCBub3RhdGlvbj9cbiAgICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdFR5cGVzW3R5cGVdLFxuICAgICAgICBtYXliZVN1ZmZpeCA9IC9bZGVmZ3BycyVdLy50ZXN0KHR5cGUpO1xuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0IHByZWNpc2lvbiBpZiBub3Qgc3BlY2lmaWVkLFxuICAgIC8vIG9yIGNsYW1wIHRoZSBzcGVjaWZpZWQgcHJlY2lzaW9uIHRvIHRoZSBzdXBwb3J0ZWQgcmFuZ2UuXG4gICAgLy8gRm9yIHNpZ25pZmljYW50IHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMSwgMjFdLlxuICAgIC8vIEZvciBmaXhlZCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzAsIDIwXS5cbiAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IDZcbiAgICAgICAgOiAvW2dwcnNdLy50ZXN0KHR5cGUpID8gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpXG4gICAgICAgIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpO1xuXG4gICAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlKSB7XG4gICAgICB2YXIgdmFsdWVQcmVmaXggPSBwcmVmaXgsXG4gICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsXG4gICAgICAgICAgaSwgbiwgYztcblxuICAgICAgaWYgKHR5cGUgPT09IFwiY1wiKSB7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gZm9ybWF0VHlwZSh2YWx1ZSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgdmFsdWUgPSBcIlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSArdmFsdWU7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBzaWduLiAtMCBpcyBub3QgbGVzcyB0aGFuIDAsIGJ1dCAxIC8gLTAgaXMhXG4gICAgICAgIHZhciB2YWx1ZU5lZ2F0aXZlID0gdmFsdWUgPCAwIHx8IDEgLyB2YWx1ZSA8IDA7XG5cbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgaW5pdGlhbCBmb3JtYXR0aW5nLlxuICAgICAgICB2YWx1ZSA9IGlzTmFOKHZhbHVlKSA/IG5hbiA6IGZvcm1hdFR5cGUoTWF0aC5hYnModmFsdWUpLCBwcmVjaXNpb24pO1xuXG4gICAgICAgIC8vIFRyaW0gaW5zaWduaWZpY2FudCB6ZXJvcy5cbiAgICAgICAgaWYgKHRyaW0pIHZhbHVlID0gZm9ybWF0VHJpbSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gSWYgYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgdG8gemVybyBhZnRlciBmb3JtYXR0aW5nLCBhbmQgbm8gZXhwbGljaXQgcG9zaXRpdmUgc2lnbiBpcyByZXF1ZXN0ZWQsIGhpZGUgdGhlIHNpZ24uXG4gICAgICAgIGlmICh2YWx1ZU5lZ2F0aXZlICYmICt2YWx1ZSA9PT0gMCAmJiBzaWduICE9PSBcIitcIikgdmFsdWVOZWdhdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICAgICAgICB2YWx1ZVByZWZpeCA9ICh2YWx1ZU5lZ2F0aXZlID8gKHNpZ24gPT09IFwiKFwiID8gc2lnbiA6IG1pbnVzKSA6IHNpZ24gPT09IFwiLVwiIHx8IHNpZ24gPT09IFwiKFwiID8gXCJcIiA6IHNpZ24pICsgdmFsdWVQcmVmaXg7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gKHR5cGUgPT09IFwic1wiID8gcHJlZml4ZXNbOCArIHByZWZpeEV4cG9uZW50IC8gM10gOiBcIlwiKSArIHZhbHVlU3VmZml4ICsgKHZhbHVlTmVnYXRpdmUgJiYgc2lnbiA9PT0gXCIoXCIgPyBcIilcIiA6IFwiXCIpO1xuXG4gICAgICAgIC8vIEJyZWFrIHRoZSBmb3JtYXR0ZWQgdmFsdWUgaW50byB0aGUgaW50ZWdlciBcdTIwMUN2YWx1ZVx1MjAxRCBwYXJ0IHRoYXQgY2FuIGJlXG4gICAgICAgIC8vIGdyb3VwZWQsIGFuZCBmcmFjdGlvbmFsIG9yIGV4cG9uZW50aWFsIFx1MjAxQ3N1ZmZpeFx1MjAxRCBwYXJ0IHRoYXQgaXMgbm90LlxuICAgICAgICBpZiAobWF5YmVTdWZmaXgpIHtcbiAgICAgICAgICBpID0gLTEsIG4gPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICAgIGlmIChjID0gdmFsdWUuY2hhckNvZGVBdChpKSwgNDggPiBjIHx8IGMgPiA1Nykge1xuICAgICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IChjID09PSA0NiA/IGRlY2ltYWwgKyB2YWx1ZS5zbGljZShpICsgMSkgOiB2YWx1ZS5zbGljZShpKSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBub3QgXCIwXCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuXG4gICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTtcblxuICAgICAgLy8gQ29tcHV0ZSB0aGUgcGFkZGluZy5cbiAgICAgIHZhciBsZW5ndGggPSB2YWx1ZVByZWZpeC5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKyB2YWx1ZVN1ZmZpeC5sZW5ndGgsXG4gICAgICAgICAgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6IFwiXCI7XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBcIjBcIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBhZnRlciBwYWRkaW5nLlxuICAgICAgaWYgKGNvbW1hICYmIHplcm8pIHZhbHVlID0gZ3JvdXAocGFkZGluZyArIHZhbHVlLCBwYWRkaW5nLmxlbmd0aCA/IHdpZHRoIC0gdmFsdWVTdWZmaXgubGVuZ3RoIDogSW5maW5pdHkpLCBwYWRkaW5nID0gXCJcIjtcblxuICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuXG4gICAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICAgIGNhc2UgXCI8XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZzsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCI9XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyBwYWRkaW5nICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJeXCI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudW1lcmFscyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9ybWF0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3BlY2lmaWVyICsgXCJcIjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKSB7XG4gICAgdmFyIGYgPSBuZXdGb3JtYXQoKHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpLCBzcGVjaWZpZXIudHlwZSA9IFwiZlwiLCBzcGVjaWZpZXIpKSxcbiAgICAgICAgZSA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50KHZhbHVlKSAvIDMpKSkgKiAzLFxuICAgICAgICBrID0gTWF0aC5wb3coMTAsIC1lKSxcbiAgICAgICAgcHJlZml4ID0gcHJlZml4ZXNbOCArIGUgLyAzXTtcbiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBmKGsgKiB2YWx1ZSkgKyBwcmVmaXg7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0OiBuZXdGb3JtYXQsXG4gICAgZm9ybWF0UHJlZml4OiBmb3JtYXRQcmVmaXhcbiAgfTtcbn1cbiIsICJpbXBvcnQgZm9ybWF0TG9jYWxlIGZyb20gXCIuL2xvY2FsZS5qc1wiO1xuXG52YXIgbG9jYWxlO1xuZXhwb3J0IHZhciBmb3JtYXQ7XG5leHBvcnQgdmFyIGZvcm1hdFByZWZpeDtcblxuZGVmYXVsdExvY2FsZSh7XG4gIHRob3VzYW5kczogXCIsXCIsXG4gIGdyb3VwaW5nOiBbM10sXG4gIGN1cnJlbmN5OiBbXCIkXCIsIFwiXCJdXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7XG4gIGxvY2FsZSA9IGZvcm1hdExvY2FsZShkZWZpbml0aW9uKTtcbiAgZm9ybWF0ID0gbG9jYWxlLmZvcm1hdDtcbiAgZm9ybWF0UHJlZml4ID0gbG9jYWxlLmZvcm1hdFByZWZpeDtcbiAgcmV0dXJuIGxvY2FsZTtcbn1cbiIsICJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RlcCkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgLWV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7XG59XG4iLCAiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0ZXAsIHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCh2YWx1ZSkgLyAzKSkpICogMyAtIGV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7XG59XG4iLCAiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0ZXAsIG1heCkge1xuICBzdGVwID0gTWF0aC5hYnMoc3RlcCksIG1heCA9IE1hdGguYWJzKG1heCkgLSBzdGVwO1xuICByZXR1cm4gTWF0aC5tYXgoMCwgZXhwb25lbnQobWF4KSAtIGV4cG9uZW50KHN0ZXApKSArIDE7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGluaXRSYW5nZShkb21haW4sIHJhbmdlKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogYnJlYWs7XG4gICAgY2FzZSAxOiB0aGlzLnJhbmdlKGRvbWFpbik7IGJyZWFrO1xuICAgIGRlZmF1bHQ6IHRoaXMucmFuZ2UocmFuZ2UpLmRvbWFpbihkb21haW4pOyBicmVhaztcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRJbnRlcnBvbGF0b3IoZG9tYWluLCBpbnRlcnBvbGF0b3IpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiBicmVhaztcbiAgICBjYXNlIDE6IHtcbiAgICAgIGlmICh0eXBlb2YgZG9tYWluID09PSBcImZ1bmN0aW9uXCIpIHRoaXMuaW50ZXJwb2xhdG9yKGRvbWFpbik7XG4gICAgICBlbHNlIHRoaXMucmFuZ2UoZG9tYWluKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aGlzLmRvbWFpbihkb21haW4pO1xuICAgICAgaWYgKHR5cGVvZiBpbnRlcnBvbGF0b3IgPT09IFwiZnVuY3Rpb25cIikgdGhpcy5pbnRlcnBvbGF0b3IoaW50ZXJwb2xhdG9yKTtcbiAgICAgIGVsc2UgdGhpcy5yYW5nZShpbnRlcnBvbGF0b3IpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnN0YW50cyh4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBudW1iZXIoeCkge1xuICByZXR1cm4gK3g7XG59XG4iLCAiaW1wb3J0IHtiaXNlY3R9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZSBhcyBpbnRlcnBvbGF0ZVZhbHVlLCBpbnRlcnBvbGF0ZU51bWJlciwgaW50ZXJwb2xhdGVSb3VuZH0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbnZhciB1bml0ID0gWzAsIDFdO1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkoeCkge1xuICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplKGEsIGIpIHtcbiAgcmV0dXJuIChiIC09IChhID0gK2EpKVxuICAgICAgPyBmdW5jdGlvbih4KSB7IHJldHVybiAoeCAtIGEpIC8gYjsgfVxuICAgICAgOiBjb25zdGFudChpc05hTihiKSA/IE5hTiA6IDAuNSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wZXIoYSwgYikge1xuICB2YXIgdDtcbiAgaWYgKGEgPiBiKSB0ID0gYSwgYSA9IGIsIGIgPSB0O1xuICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5tYXgoYSwgTWF0aC5taW4oYiwgeCkpOyB9O1xufVxuXG4vLyBub3JtYWxpemUoYSwgYikoeCkgdGFrZXMgYSBkb21haW4gdmFsdWUgeCBpbiBbYSxiXSBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIgdCBpbiBbMCwxXS5cbi8vIGludGVycG9sYXRlKGEsIGIpKHQpIHRha2VzIGEgcGFyYW1ldGVyIHQgaW4gWzAsMV0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmFuZ2UgdmFsdWUgeCBpbiBbYSxiXS5cbmZ1bmN0aW9uIGJpbWFwKGRvbWFpbiwgcmFuZ2UsIGludGVycG9sYXRlKSB7XG4gIHZhciBkMCA9IGRvbWFpblswXSwgZDEgPSBkb21haW5bMV0sIHIwID0gcmFuZ2VbMF0sIHIxID0gcmFuZ2VbMV07XG4gIGlmIChkMSA8IGQwKSBkMCA9IG5vcm1hbGl6ZShkMSwgZDApLCByMCA9IGludGVycG9sYXRlKHIxLCByMCk7XG4gIGVsc2UgZDAgPSBub3JtYWxpemUoZDAsIGQxKSwgcjAgPSBpbnRlcnBvbGF0ZShyMCwgcjEpO1xuICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4gcjAoZDAoeCkpOyB9O1xufVxuXG5mdW5jdGlvbiBwb2x5bWFwKGRvbWFpbiwgcmFuZ2UsIGludGVycG9sYXRlKSB7XG4gIHZhciBqID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoKSAtIDEsXG4gICAgICBkID0gbmV3IEFycmF5KGopLFxuICAgICAgciA9IG5ldyBBcnJheShqKSxcbiAgICAgIGkgPSAtMTtcblxuICAvLyBSZXZlcnNlIGRlc2NlbmRpbmcgZG9tYWlucy5cbiAgaWYgKGRvbWFpbltqXSA8IGRvbWFpblswXSkge1xuICAgIGRvbWFpbiA9IGRvbWFpbi5zbGljZSgpLnJldmVyc2UoKTtcbiAgICByYW5nZSA9IHJhbmdlLnNsaWNlKCkucmV2ZXJzZSgpO1xuICB9XG5cbiAgd2hpbGUgKCsraSA8IGopIHtcbiAgICBkW2ldID0gbm9ybWFsaXplKGRvbWFpbltpXSwgZG9tYWluW2kgKyAxXSk7XG4gICAgcltpXSA9IGludGVycG9sYXRlKHJhbmdlW2ldLCByYW5nZVtpICsgMV0pO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcbiAgICB2YXIgaSA9IGJpc2VjdChkb21haW4sIHgsIDEsIGopIC0gMTtcbiAgICByZXR1cm4gcltpXShkW2ldKHgpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkoc291cmNlLCB0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldFxuICAgICAgLmRvbWFpbihzb3VyY2UuZG9tYWluKCkpXG4gICAgICAucmFuZ2Uoc291cmNlLnJhbmdlKCkpXG4gICAgICAuaW50ZXJwb2xhdGUoc291cmNlLmludGVycG9sYXRlKCkpXG4gICAgICAuY2xhbXAoc291cmNlLmNsYW1wKCkpXG4gICAgICAudW5rbm93bihzb3VyY2UudW5rbm93bigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybWVyKCkge1xuICB2YXIgZG9tYWluID0gdW5pdCxcbiAgICAgIHJhbmdlID0gdW5pdCxcbiAgICAgIGludGVycG9sYXRlID0gaW50ZXJwb2xhdGVWYWx1ZSxcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIHVudHJhbnNmb3JtLFxuICAgICAgdW5rbm93bixcbiAgICAgIGNsYW1wID0gaWRlbnRpdHksXG4gICAgICBwaWVjZXdpc2UsXG4gICAgICBvdXRwdXQsXG4gICAgICBpbnB1dDtcblxuICBmdW5jdGlvbiByZXNjYWxlKCkge1xuICAgIHZhciBuID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoKTtcbiAgICBpZiAoY2xhbXAgIT09IGlkZW50aXR5KSBjbGFtcCA9IGNsYW1wZXIoZG9tYWluWzBdLCBkb21haW5bbiAtIDFdKTtcbiAgICBwaWVjZXdpc2UgPSBuID4gMiA/IHBvbHltYXAgOiBiaW1hcDtcbiAgICBvdXRwdXQgPSBpbnB1dCA9IG51bGw7XG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgIHJldHVybiB4ID09IG51bGwgfHwgaXNOYU4oeCA9ICt4KSA/IHVua25vd24gOiAob3V0cHV0IHx8IChvdXRwdXQgPSBwaWVjZXdpc2UoZG9tYWluLm1hcCh0cmFuc2Zvcm0pLCByYW5nZSwgaW50ZXJwb2xhdGUpKSkodHJhbnNmb3JtKGNsYW1wKHgpKSk7XG4gIH1cblxuICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIGNsYW1wKHVudHJhbnNmb3JtKChpbnB1dCB8fCAoaW5wdXQgPSBwaWVjZXdpc2UocmFuZ2UsIGRvbWFpbi5tYXAodHJhbnNmb3JtKSwgaW50ZXJwb2xhdGVOdW1iZXIpKSkoeSkpKTtcbiAgfTtcblxuICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gQXJyYXkuZnJvbShfLCBudW1iZXIpLCByZXNjYWxlKCkpIDogZG9tYWluLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBBcnJheS5mcm9tKF8pLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTtcbiAgfTtcblxuICBzY2FsZS5yYW5nZVJvdW5kID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiByYW5nZSA9IEFycmF5LmZyb20oXyksIGludGVycG9sYXRlID0gaW50ZXJwb2xhdGVSb3VuZCwgcmVzY2FsZSgpO1xuICB9O1xuXG4gIHNjYWxlLmNsYW1wID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsYW1wID0gXyA/IHRydWUgOiBpZGVudGl0eSwgcmVzY2FsZSgpKSA6IGNsYW1wICE9PSBpZGVudGl0eTtcbiAgfTtcblxuICBzY2FsZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0ZSA9IF8sIHJlc2NhbGUoKSkgOiBpbnRlcnBvbGF0ZTtcbiAgfTtcblxuICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbih0LCB1KSB7XG4gICAgdHJhbnNmb3JtID0gdCwgdW50cmFuc2Zvcm0gPSB1O1xuICAgIHJldHVybiByZXNjYWxlKCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRpbnVvdXMoKSB7XG4gIHJldHVybiB0cmFuc2Zvcm1lcigpKGlkZW50aXR5LCBpZGVudGl0eSk7XG59XG4iLCAiaW1wb3J0IHt0aWNrU3RlcH0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge2Zvcm1hdCwgZm9ybWF0UHJlZml4LCBmb3JtYXRTcGVjaWZpZXIsIHByZWNpc2lvbkZpeGVkLCBwcmVjaXNpb25QcmVmaXgsIHByZWNpc2lvblJvdW5kfSBmcm9tIFwiZDMtZm9ybWF0XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRpY2tGb3JtYXQoc3RhcnQsIHN0b3AsIGNvdW50LCBzcGVjaWZpZXIpIHtcbiAgdmFyIHN0ZXAgPSB0aWNrU3RlcChzdGFydCwgc3RvcCwgY291bnQpLFxuICAgICAgcHJlY2lzaW9uO1xuICBzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyID09IG51bGwgPyBcIixmXCIgOiBzcGVjaWZpZXIpO1xuICBzd2l0Y2ggKHNwZWNpZmllci50eXBlKSB7XG4gICAgY2FzZSBcInNcIjoge1xuICAgICAgdmFyIHZhbHVlID0gTWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLCBNYXRoLmFicyhzdG9wKSk7XG4gICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBwcmVjaXNpb25QcmVmaXgoc3RlcCwgdmFsdWUpKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbjtcbiAgICAgIHJldHVybiBmb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSk7XG4gICAgfVxuICAgIGNhc2UgXCJcIjpcbiAgICBjYXNlIFwiZVwiOlxuICAgIGNhc2UgXCJnXCI6XG4gICAgY2FzZSBcInBcIjpcbiAgICBjYXNlIFwiclwiOiB7XG4gICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBwcmVjaXNpb25Sb3VuZChzdGVwLCBNYXRoLm1heChNYXRoLmFicyhzdGFydCksIE1hdGguYWJzKHN0b3ApKSkpKSBzcGVjaWZpZXIucHJlY2lzaW9uID0gcHJlY2lzaW9uIC0gKHNwZWNpZmllci50eXBlID09PSBcImVcIik7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImZcIjpcbiAgICBjYXNlIFwiJVwiOiB7XG4gICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBwcmVjaXNpb25GaXhlZChzdGVwKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb24gLSAoc3BlY2lmaWVyLnR5cGUgPT09IFwiJVwiKSAqIDI7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZvcm1hdChzcGVjaWZpZXIpO1xufVxuIiwgImltcG9ydCB7dGlja3MsIHRpY2tJbmNyZW1lbnR9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IGNvbnRpbnVvdXMsIHtjb3B5fSBmcm9tIFwiLi9jb250aW51b3VzLmpzXCI7XG5pbXBvcnQge2luaXRSYW5nZX0gZnJvbSBcIi4vaW5pdC5qc1wiO1xuaW1wb3J0IHRpY2tGb3JtYXQgZnJvbSBcIi4vdGlja0Zvcm1hdC5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbGluZWFyaXNoKHNjYWxlKSB7XG4gIHZhciBkb21haW4gPSBzY2FsZS5kb21haW47XG5cbiAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihjb3VudCkge1xuICAgIHZhciBkID0gZG9tYWluKCk7XG4gICAgcmV0dXJuIHRpY2tzKGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgY291bnQgPT0gbnVsbCA/IDEwIDogY291bnQpO1xuICB9O1xuXG4gIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihjb3VudCwgc3BlY2lmaWVyKSB7XG4gICAgdmFyIGQgPSBkb21haW4oKTtcbiAgICByZXR1cm4gdGlja0Zvcm1hdChkWzBdLCBkW2QubGVuZ3RoIC0gMV0sIGNvdW50ID09IG51bGwgPyAxMCA6IGNvdW50LCBzcGVjaWZpZXIpO1xuICB9O1xuXG4gIHNjYWxlLm5pY2UgPSBmdW5jdGlvbihjb3VudCkge1xuICAgIGlmIChjb3VudCA9PSBudWxsKSBjb3VudCA9IDEwO1xuXG4gICAgdmFyIGQgPSBkb21haW4oKTtcbiAgICB2YXIgaTAgPSAwO1xuICAgIHZhciBpMSA9IGQubGVuZ3RoIC0gMTtcbiAgICB2YXIgc3RhcnQgPSBkW2kwXTtcbiAgICB2YXIgc3RvcCA9IGRbaTFdO1xuICAgIHZhciBwcmVzdGVwO1xuICAgIHZhciBzdGVwO1xuICAgIHZhciBtYXhJdGVyID0gMTA7XG5cbiAgICBpZiAoc3RvcCA8IHN0YXJ0KSB7XG4gICAgICBzdGVwID0gc3RhcnQsIHN0YXJ0ID0gc3RvcCwgc3RvcCA9IHN0ZXA7XG4gICAgICBzdGVwID0gaTAsIGkwID0gaTEsIGkxID0gc3RlcDtcbiAgICB9XG4gICAgXG4gICAgd2hpbGUgKG1heEl0ZXItLSA+IDApIHtcbiAgICAgIHN0ZXAgPSB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCk7XG4gICAgICBpZiAoc3RlcCA9PT0gcHJlc3RlcCkge1xuICAgICAgICBkW2kwXSA9IHN0YXJ0XG4gICAgICAgIGRbaTFdID0gc3RvcFxuICAgICAgICByZXR1cm4gZG9tYWluKGQpO1xuICAgICAgfSBlbHNlIGlmIChzdGVwID4gMCkge1xuICAgICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc3RhcnQgLyBzdGVwKSAqIHN0ZXA7XG4gICAgICAgIHN0b3AgPSBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcDtcbiAgICAgIH0gZWxzZSBpZiAoc3RlcCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgKiBzdGVwKSAvIHN0ZXA7XG4gICAgICAgIHN0b3AgPSBNYXRoLmZsb29yKHN0b3AgKiBzdGVwKSAvIHN0ZXA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHByZXN0ZXAgPSBzdGVwO1xuICAgIH1cblxuICAgIHJldHVybiBzY2FsZTtcbiAgfTtcblxuICByZXR1cm4gc2NhbGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpbmVhcigpIHtcbiAgdmFyIHNjYWxlID0gY29udGludW91cygpO1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gY29weShzY2FsZSwgbGluZWFyKCkpO1xuICB9O1xuXG4gIGluaXRSYW5nZS5hcHBseShzY2FsZSwgYXJndW1lbnRzKTtcblxuICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gWm9vbUV2ZW50KHR5cGUsIHtcbiAgc291cmNlRXZlbnQsXG4gIHRhcmdldCxcbiAgdHJhbnNmb3JtLFxuICBkaXNwYXRjaFxufSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgdHlwZToge3ZhbHVlOiB0eXBlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHNvdXJjZUV2ZW50OiB7dmFsdWU6IHNvdXJjZUV2ZW50LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHRhcmdldDoge3ZhbHVlOiB0YXJnZXQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgdHJhbnNmb3JtOiB7dmFsdWU6IHRyYW5zZm9ybSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBfOiB7dmFsdWU6IGRpc3BhdGNofVxuICB9KTtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHtcbiAgdGhpcy5rID0gaztcbiAgdGhpcy54ID0geDtcbiAgdGhpcy55ID0geTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zZm9ybSxcbiAgc2NhbGU6IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gayA9PT0gMSA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuayAqIGssIHRoaXMueCwgdGhpcy55KTtcbiAgfSxcbiAgdHJhbnNsYXRlOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIHggPT09IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rLCB0aGlzLnggKyB0aGlzLmsgKiB4LCB0aGlzLnkgKyB0aGlzLmsgKiB5KTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHBvaW50KSB7XG4gICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldO1xuICB9LFxuICBhcHBseVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geCAqIHRoaXMuayArIHRoaXMueDtcbiAgfSxcbiAgYXBwbHlZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24obG9jYXRpb24pIHtcbiAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdO1xuICB9LFxuICBpbnZlcnRYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuICh4IC0gdGhpcy54KSAvIHRoaXMuaztcbiAgfSxcbiAgaW52ZXJ0WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiAoeSAtIHRoaXMueSkgLyB0aGlzLms7XG4gIH0sXG4gIHJlc2NhbGVYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7XG4gIH0sXG4gIHJlc2NhbGVZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkuY29weSgpLmRvbWFpbih5LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSwgdGhpcykubWFwKHkuaW52ZXJ0LCB5KSk7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyB0aGlzLnggKyBcIixcIiArIHRoaXMueSArIFwiKSBzY2FsZShcIiArIHRoaXMuayArIFwiKVwiO1xuICB9XG59O1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0gbmV3IFRyYW5zZm9ybSgxLCAwLCAwKTtcblxudHJhbnNmb3JtLnByb3RvdHlwZSA9IFRyYW5zZm9ybS5wcm90b3R5cGU7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlKSB7XG4gIHdoaWxlICghbm9kZS5fX3pvb20pIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHJldHVybiBub2RlLl9fem9vbTtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbihldmVudCkge1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG4iLCAiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge2RyYWdEaXNhYmxlLCBkcmFnRW5hYmxlfSBmcm9tIFwiZDMtZHJhZ1wiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZVpvb219IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtzZWxlY3QsIHBvaW50ZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7aW50ZXJydXB0fSBmcm9tIFwiZDMtdHJhbnNpdGlvblwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgWm9vbUV2ZW50IGZyb20gXCIuL2V2ZW50LmpzXCI7XG5pbXBvcnQge1RyYW5zZm9ybSwgaWRlbnRpdHl9IGZyb20gXCIuL3RyYW5zZm9ybS5qc1wiO1xuaW1wb3J0IG5vZXZlbnQsIHtub3Byb3BhZ2F0aW9ufSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbi8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LlxuLy8gZXhjZXB0IGZvciBwaW5jaC10by16b29tLCB3aGljaCBpcyBzZW50IGFzIGEgd2hlZWwrY3RybEtleSBldmVudFxuZnVuY3Rpb24gZGVmYXVsdEZpbHRlcihldmVudCkge1xuICByZXR1cm4gKCFldmVudC5jdHJsS2V5IHx8IGV2ZW50LnR5cGUgPT09ICd3aGVlbCcpICYmICFldmVudC5idXR0b247XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRFeHRlbnQoKSB7XG4gIHZhciBlID0gdGhpcztcbiAgaWYgKGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7XG4gICAgZSA9IGUub3duZXJTVkdFbGVtZW50IHx8IGU7XG4gICAgaWYgKGUuaGFzQXR0cmlidXRlKFwidmlld0JveFwiKSkge1xuICAgICAgZSA9IGUudmlld0JveC5iYXNlVmFsO1xuICAgICAgcmV0dXJuIFtbZS54LCBlLnldLCBbZS54ICsgZS53aWR0aCwgZS55ICsgZS5oZWlnaHRdXTtcbiAgICB9XG4gICAgcmV0dXJuIFtbMCwgMF0sIFtlLndpZHRoLmJhc2VWYWwudmFsdWUsIGUuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTtcbiAgfVxuICByZXR1cm4gW1swLCAwXSwgW2UuY2xpZW50V2lkdGgsIGUuY2xpZW50SGVpZ2h0XV07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUcmFuc2Zvcm0oKSB7XG4gIHJldHVybiB0aGlzLl9fem9vbSB8fCBpZGVudGl0eTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFdoZWVsRGVsdGEoZXZlbnQpIHtcbiAgcmV0dXJuIC1ldmVudC5kZWx0YVkgKiAoZXZlbnQuZGVsdGFNb2RlID09PSAxID8gMC4wNSA6IGV2ZW50LmRlbHRhTW9kZSA/IDEgOiAwLjAwMikgKiAoZXZlbnQuY3RybEtleSA/IDEwIDogMSk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUb3VjaGFibGUoKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgKFwib250b3VjaHN0YXJ0XCIgaW4gdGhpcyk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb25zdHJhaW4odHJhbnNmb3JtLCBleHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkge1xuICB2YXIgZHgwID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzBdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFswXVswXSxcbiAgICAgIGR4MSA9IHRyYW5zZm9ybS5pbnZlcnRYKGV4dGVudFsxXVswXSkgLSB0cmFuc2xhdGVFeHRlbnRbMV1bMF0sXG4gICAgICBkeTAgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMF1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzFdLFxuICAgICAgZHkxID0gdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzFdWzFdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVsxXTtcbiAgcmV0dXJuIHRyYW5zZm9ybS50cmFuc2xhdGUoXG4gICAgZHgxID4gZHgwID8gKGR4MCArIGR4MSkgLyAyIDogTWF0aC5taW4oMCwgZHgwKSB8fCBNYXRoLm1heCgwLCBkeDEpLFxuICAgIGR5MSA+IGR5MCA/IChkeTAgKyBkeTEpIC8gMiA6IE1hdGgubWluKDAsIGR5MCkgfHwgTWF0aC5tYXgoMCwgZHkxKVxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIsXG4gICAgICBleHRlbnQgPSBkZWZhdWx0RXh0ZW50LFxuICAgICAgY29uc3RyYWluID0gZGVmYXVsdENvbnN0cmFpbixcbiAgICAgIHdoZWVsRGVsdGEgPSBkZWZhdWx0V2hlZWxEZWx0YSxcbiAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUsXG4gICAgICBzY2FsZUV4dGVudCA9IFswLCBJbmZpbml0eV0sXG4gICAgICB0cmFuc2xhdGVFeHRlbnQgPSBbWy1JbmZpbml0eSwgLUluZmluaXR5XSwgW0luZmluaXR5LCBJbmZpbml0eV1dLFxuICAgICAgZHVyYXRpb24gPSAyNTAsXG4gICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlWm9vbSxcbiAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJ6b29tXCIsIFwiZW5kXCIpLFxuICAgICAgdG91Y2hzdGFydGluZyxcbiAgICAgIHRvdWNoZmlyc3QsXG4gICAgICB0b3VjaGVuZGluZyxcbiAgICAgIHRvdWNoRGVsYXkgPSA1MDAsXG4gICAgICB3aGVlbERlbGF5ID0gMTUwLFxuICAgICAgY2xpY2tEaXN0YW5jZTIgPSAwLFxuICAgICAgdGFwRGlzdGFuY2UgPSAxMDtcblxuICBmdW5jdGlvbiB6b29tKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvblxuICAgICAgICAucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSlcbiAgICAgICAgLm9uKFwid2hlZWwuem9vbVwiLCB3aGVlbGVkLCB7cGFzc2l2ZTogZmFsc2V9KVxuICAgICAgICAub24oXCJtb3VzZWRvd24uem9vbVwiLCBtb3VzZWRvd25lZClcbiAgICAgICAgLm9uKFwiZGJsY2xpY2suem9vbVwiLCBkYmxjbGlja2VkKVxuICAgICAgLmZpbHRlcih0b3VjaGFibGUpXG4gICAgICAgIC5vbihcInRvdWNoc3RhcnQuem9vbVwiLCB0b3VjaHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS56b29tXCIsIHRvdWNobW92ZWQpXG4gICAgICAgIC5vbihcInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbVwiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIiwgXCJyZ2JhKDAsMCwwLDApXCIpO1xuICB9XG5cbiAgem9vbS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCkge1xuICAgIHZhciBzZWxlY3Rpb24gPSBjb2xsZWN0aW9uLnNlbGVjdGlvbiA/IGNvbGxlY3Rpb24uc2VsZWN0aW9uKCkgOiBjb2xsZWN0aW9uO1xuICAgIHNlbGVjdGlvbi5wcm9wZXJ0eShcIl9fem9vbVwiLCBkZWZhdWx0VHJhbnNmb3JtKTtcbiAgICBpZiAoY29sbGVjdGlvbiAhPT0gc2VsZWN0aW9uKSB7XG4gICAgICBzY2hlZHVsZShjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGlvbi5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICAuZXZlbnQoZXZlbnQpXG4gICAgICAgICAgLnN0YXJ0KClcbiAgICAgICAgICAuem9vbShudWxsLCB0eXBlb2YgdHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIgPyB0cmFuc2Zvcm0uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRyYW5zZm9ybSlcbiAgICAgICAgICAuZW5kKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgem9vbS5zY2FsZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrLCBwLCBldmVudCkge1xuICAgIHpvb20uc2NhbGVUbyhzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGswID0gdGhpcy5fX3pvb20uayxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGswICogazE7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20uc2NhbGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaywgcCwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICB0MCA9IHRoaXMuX196b29tLFxuICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcCA9PT0gXCJmdW5jdGlvblwiID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcCxcbiAgICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gXCJmdW5jdGlvblwiID8gay5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogaztcbiAgICAgIHJldHVybiBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb25zdHJhaW4odGhpcy5fX3pvb20udHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IHkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHlcbiAgICAgICksIGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIG51bGwsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCB4LCB5LCBwLCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHAgPT09IFwiZnVuY3Rpb25cIiA/IHAuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHA7XG4gICAgICByZXR1cm4gY29uc3RyYWluKGlkZW50aXR5LnRyYW5zbGF0ZShwMFswXSwgcDBbMV0pLnNjYWxlKHQuaykudHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8gLXguYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC14LFxuICAgICAgICB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8gLXkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC15XG4gICAgICApLCBlLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICBmdW5jdGlvbiBzY2FsZSh0cmFuc2Zvcm0sIGspIHtcbiAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCBrKSk7XG4gICAgcmV0dXJuIGsgPT09IHRyYW5zZm9ybS5rID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybShrLCB0cmFuc2Zvcm0ueCwgdHJhbnNmb3JtLnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHRyYW5zZm9ybSwgcDAsIHAxKSB7XG4gICAgdmFyIHggPSBwMFswXSAtIHAxWzBdICogdHJhbnNmb3JtLmssIHkgPSBwMFsxXSAtIHAxWzFdICogdHJhbnNmb3JtLms7XG4gICAgcmV0dXJuIHggPT09IHRyYW5zZm9ybS54ICYmIHkgPT09IHRyYW5zZm9ybS55ID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybSh0cmFuc2Zvcm0uaywgeCwgeSk7XG4gIH1cblxuICBmdW5jdGlvbiBjZW50cm9pZChleHRlbnQpIHtcbiAgICByZXR1cm4gWygrZXh0ZW50WzBdWzBdICsgK2V4dGVudFsxXVswXSkgLyAyLCAoK2V4dGVudFswXVsxXSArICtleHRlbnRbMV1bMV0pIC8gMl07XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZSh0cmFuc2l0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCkge1xuICAgIHRyYW5zaXRpb25cbiAgICAgICAgLm9uKFwic3RhcnQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmV2ZW50KGV2ZW50KS5zdGFydCgpOyB9KVxuICAgICAgICAub24oXCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmV2ZW50KGV2ZW50KS5lbmQoKTsgfSlcbiAgICAgICAgLnR3ZWVuKFwiem9vbVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIGcgPSBnZXN0dXJlKHRoYXQsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgICAgICAgZSA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKSxcbiAgICAgICAgICAgICAgcCA9IHBvaW50ID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwb2ludCA9PT0gXCJmdW5jdGlvblwiID8gcG9pbnQuYXBwbHkodGhhdCwgYXJncykgOiBwb2ludCxcbiAgICAgICAgICAgICAgdyA9IE1hdGgubWF4KGVbMV1bMF0gLSBlWzBdWzBdLCBlWzFdWzFdIC0gZVswXVsxXSksXG4gICAgICAgICAgICAgIGEgPSB0aGF0Ll9fem9vbSxcbiAgICAgICAgICAgICAgYiA9IHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGF0LCBhcmdzKSA6IHRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgaSA9IGludGVycG9sYXRlKGEuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYS5rKSwgYi5pbnZlcnQocCkuY29uY2F0KHcgLyBiLmspKTtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgaWYgKHQgPT09IDEpIHQgPSBiOyAvLyBBdm9pZCByb3VuZGluZyBlcnJvciBvbiBlbmQuXG4gICAgICAgICAgICBlbHNlIHsgdmFyIGwgPSBpKHQpLCBrID0gdyAvIGxbMl07IHQgPSBuZXcgVHJhbnNmb3JtKGssIHBbMF0gLSBsWzBdICogaywgcFsxXSAtIGxbMV0gKiBrKTsgfVxuICAgICAgICAgICAgZy56b29tKG51bGwsIHQpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VzdHVyZSh0aGF0LCBhcmdzLCBjbGVhbikge1xuICAgIHJldHVybiAoIWNsZWFuICYmIHRoYXQuX196b29taW5nKSB8fCBuZXcgR2VzdHVyZSh0aGF0LCBhcmdzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEdlc3R1cmUodGhhdCwgYXJncykge1xuICAgIHRoaXMudGhhdCA9IHRoYXQ7XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB0aGlzLmFjdGl2ZSA9IDA7XG4gICAgdGhpcy5zb3VyY2VFdmVudCA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgdGhpcy50YXBzID0gMDtcbiAgfVxuXG4gIEdlc3R1cmUucHJvdG90eXBlID0ge1xuICAgIGV2ZW50OiBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50KSB0aGlzLnNvdXJjZUV2ZW50ID0gZXZlbnQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgrK3RoaXMuYWN0aXZlID09PSAxKSB7XG4gICAgICAgIHRoaXMudGhhdC5fX3pvb21pbmcgPSB0aGlzO1xuICAgICAgICB0aGlzLmVtaXQoXCJzdGFydFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgem9vbTogZnVuY3Rpb24oa2V5LCB0cmFuc2Zvcm0pIHtcbiAgICAgIGlmICh0aGlzLm1vdXNlICYmIGtleSAhPT0gXCJtb3VzZVwiKSB0aGlzLm1vdXNlWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLm1vdXNlWzBdKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoMCAmJiBrZXkgIT09IFwidG91Y2hcIikgdGhpcy50b3VjaDBbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gwWzBdKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoMSAmJiBrZXkgIT09IFwidG91Y2hcIikgdGhpcy50b3VjaDFbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gxWzBdKTtcbiAgICAgIHRoaXMudGhhdC5fX3pvb20gPSB0cmFuc2Zvcm07XG4gICAgICB0aGlzLmVtaXQoXCJ6b29tXCIpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGhpcy5hY3RpdmUgPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMudGhhdC5fX3pvb21pbmc7XG4gICAgICAgIHRoaXMuZW1pdChcImVuZFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24odHlwZSkge1xuICAgICAgdmFyIGQgPSBzZWxlY3QodGhpcy50aGF0KS5kYXR1bSgpO1xuICAgICAgbGlzdGVuZXJzLmNhbGwoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMudGhhdCxcbiAgICAgICAgbmV3IFpvb21FdmVudCh0eXBlLCB7XG4gICAgICAgICAgc291cmNlRXZlbnQ6IHRoaXMuc291cmNlRXZlbnQsXG4gICAgICAgICAgdGFyZ2V0OiB6b29tLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLnRoYXQuX196b29tLFxuICAgICAgICAgIGRpc3BhdGNoOiBsaXN0ZW5lcnNcbiAgICAgICAgfSksXG4gICAgICAgIGRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHdoZWVsZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdCA9IHRoaXMuX196b29tLFxuICAgICAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCB0LmsgKiBNYXRoLnBvdygyLCB3aGVlbERlbHRhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpKSksXG4gICAgICAgIHAgPSBwb2ludGVyKGV2ZW50KTtcblxuICAgIC8vIElmIHRoZSBtb3VzZSBpcyBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBiZWZvcmUsIHJldXNlIGl0LlxuICAgIC8vIElmIHRoZXJlIHdlcmUgcmVjZW50IHdoZWVsIGV2ZW50cywgcmVzZXQgdGhlIHdoZWVsIGlkbGUgdGltZW91dC5cbiAgICBpZiAoZy53aGVlbCkge1xuICAgICAgaWYgKGcubW91c2VbMF1bMF0gIT09IHBbMF0gfHwgZy5tb3VzZVswXVsxXSAhPT0gcFsxXSkge1xuICAgICAgICBnLm1vdXNlWzFdID0gdC5pbnZlcnQoZy5tb3VzZVswXSA9IHApO1xuICAgICAgfVxuICAgICAgY2xlYXJUaW1lb3V0KGcud2hlZWwpO1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgd2hlZWwgZXZlbnQgd29uXHUyMDE5dCB0cmlnZ2VyIGEgdHJhbnNmb3JtIGNoYW5nZSwgaWdub3JlIGl0LlxuICAgIGVsc2UgaWYgKHQuayA9PT0gaykgcmV0dXJuO1xuXG4gICAgLy8gT3RoZXJ3aXNlLCBjYXB0dXJlIHRoZSBtb3VzZSBwb2ludCBhbmQgbG9jYXRpb24gYXQgdGhlIHN0YXJ0LlxuICAgIGVsc2Uge1xuICAgICAgZy5tb3VzZSA9IFtwLCB0LmludmVydChwKV07XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZy53aGVlbCA9IHNldFRpbWVvdXQod2hlZWxpZGxlZCwgd2hlZWxEZWxheSk7XG4gICAgZy56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0LCBrKSwgZy5tb3VzZVswXSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcblxuICAgIGZ1bmN0aW9uIHdoZWVsaWRsZWQoKSB7XG4gICAgICBnLndoZWVsID0gbnVsbDtcbiAgICAgIGcuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbW91c2Vkb3duZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAodG91Y2hlbmRpbmcgfHwgIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzLCB0cnVlKS5ldmVudChldmVudCksXG4gICAgICAgIHYgPSBzZWxlY3QoZXZlbnQudmlldykub24oXCJtb3VzZW1vdmUuem9vbVwiLCBtb3VzZW1vdmVkLCB0cnVlKS5vbihcIm1vdXNldXAuem9vbVwiLCBtb3VzZXVwcGVkLCB0cnVlKSxcbiAgICAgICAgcCA9IHBvaW50ZXIoZXZlbnQsIGN1cnJlbnRUYXJnZXQpLFxuICAgICAgICB4MCA9IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHkwID0gZXZlbnQuY2xpZW50WTtcblxuICAgIGRyYWdEaXNhYmxlKGV2ZW50LnZpZXcpO1xuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGcubW91c2UgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApXTtcbiAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgZy5zdGFydCgpO1xuXG4gICAgZnVuY3Rpb24gbW91c2Vtb3ZlZChldmVudCkge1xuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICBpZiAoIWcubW92ZWQpIHtcbiAgICAgICAgdmFyIGR4ID0gZXZlbnQuY2xpZW50WCAtIHgwLCBkeSA9IGV2ZW50LmNsaWVudFkgLSB5MDtcbiAgICAgICAgZy5tb3ZlZCA9IGR4ICogZHggKyBkeSAqIGR5ID4gY2xpY2tEaXN0YW5jZTI7XG4gICAgICB9XG4gICAgICBnLmV2ZW50KGV2ZW50KVxuICAgICAgIC56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShnLnRoYXQuX196b29tLCBnLm1vdXNlWzBdID0gcG9pbnRlcihldmVudCwgY3VycmVudFRhcmdldCksIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW91c2V1cHBlZChldmVudCkge1xuICAgICAgdi5vbihcIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbVwiLCBudWxsKTtcbiAgICAgIGRyYWdFbmFibGUoZXZlbnQudmlldywgZy5tb3ZlZCk7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIGcuZXZlbnQoZXZlbnQpLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRibGNsaWNrZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgIHAwID0gcG9pbnRlcihldmVudC5jaGFuZ2VkVG91Y2hlcyA/IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdIDogZXZlbnQsIHRoaXMpLFxuICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgIGsxID0gdDAuayAqIChldmVudC5zaGlmdEtleSA/IDAuNSA6IDIpLFxuICAgICAgICB0MSA9IGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3MpLCB0cmFuc2xhdGVFeHRlbnQpO1xuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgaWYgKGR1cmF0aW9uID4gMCkgc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbikuY2FsbChzY2hlZHVsZSwgdDEsIHAwLCBldmVudCk7XG4gICAgZWxzZSBzZWxlY3QodGhpcykuY2FsbCh6b29tLnRyYW5zZm9ybSwgdDEsIHAwLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaHN0YXJ0ZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC50b3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsXG4gICAgICAgIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MsIGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA9PT0gbikuZXZlbnQoZXZlbnQpLFxuICAgICAgICBzdGFydGVkLCBpLCB0LCBwO1xuXG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgcCA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCksIHQuaWRlbnRpZmllcl07XG4gICAgICBpZiAoIWcudG91Y2gwKSBnLnRvdWNoMCA9IHAsIHN0YXJ0ZWQgPSB0cnVlLCBnLnRhcHMgPSAxICsgISF0b3VjaHN0YXJ0aW5nO1xuICAgICAgZWxzZSBpZiAoIWcudG91Y2gxICYmIGcudG91Y2gwWzJdICE9PSBwWzJdKSBnLnRvdWNoMSA9IHAsIGcudGFwcyA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHRvdWNoc3RhcnRpbmcpIHRvdWNoc3RhcnRpbmcgPSBjbGVhclRpbWVvdXQodG91Y2hzdGFydGluZyk7XG5cbiAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgaWYgKGcudGFwcyA8IDIpIHRvdWNoZmlyc3QgPSBwWzBdLCB0b3VjaHN0YXJ0aW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hzdGFydGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpO1xuICAgICAgaW50ZXJydXB0KHRoaXMpO1xuICAgICAgZy5zdGFydCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNobW92ZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQsIHAsIGw7XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDBbMF0gPSBwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDFbMF0gPSBwO1xuICAgIH1cbiAgICB0ID0gZy50aGF0Ll9fem9vbTtcbiAgICBpZiAoZy50b3VjaDEpIHtcbiAgICAgIHZhciBwMCA9IGcudG91Y2gwWzBdLCBsMCA9IGcudG91Y2gwWzFdLFxuICAgICAgICAgIHAxID0gZy50b3VjaDFbMF0sIGwxID0gZy50b3VjaDFbMV0sXG4gICAgICAgICAgZHAgPSAoZHAgPSBwMVswXSAtIHAwWzBdKSAqIGRwICsgKGRwID0gcDFbMV0gLSBwMFsxXSkgKiBkcCxcbiAgICAgICAgICBkbCA9IChkbCA9IGwxWzBdIC0gbDBbMF0pICogZGwgKyAoZGwgPSBsMVsxXSAtIGwwWzFdKSAqIGRsO1xuICAgICAgdCA9IHNjYWxlKHQsIE1hdGguc3FydChkcCAvIGRsKSk7XG4gICAgICBwID0gWyhwMFswXSArIHAxWzBdKSAvIDIsIChwMFsxXSArIHAxWzFdKSAvIDJdO1xuICAgICAgbCA9IFsobDBbMF0gKyBsMVswXSkgLyAyLCAobDBbMV0gKyBsMVsxXSkgLyAyXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZy50b3VjaDApIHAgPSBnLnRvdWNoMFswXSwgbCA9IGcudG91Y2gwWzFdO1xuICAgIGVsc2UgcmV0dXJuO1xuXG4gICAgZy56b29tKFwidG91Y2hcIiwgY29uc3RyYWluKHRyYW5zbGF0ZSh0LCBwLCBsKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hlbmRlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdDtcblxuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV07XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gxO1xuICAgIH1cbiAgICBpZiAoZy50b3VjaDEgJiYgIWcudG91Y2gwKSBnLnRvdWNoMCA9IGcudG91Y2gxLCBkZWxldGUgZy50b3VjaDE7XG4gICAgaWYgKGcudG91Y2gwKSBnLnRvdWNoMFsxXSA9IHRoaXMuX196b29tLmludmVydChnLnRvdWNoMFswXSk7XG4gICAgZWxzZSB7XG4gICAgICBnLmVuZCgpO1xuICAgICAgLy8gSWYgdGhpcyB3YXMgYSBkYmx0YXAsIHJlcm91dGUgdG8gdGhlIChvcHRpb25hbCkgZGJsY2xpY2suem9vbSBoYW5kbGVyLlxuICAgICAgaWYgKGcudGFwcyA9PT0gMikge1xuICAgICAgICB0ID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgICAgaWYgKE1hdGguaHlwb3QodG91Y2hmaXJzdFswXSAtIHRbMF0sIHRvdWNoZmlyc3RbMV0gLSB0WzFdKSA8IHRhcERpc3RhbmNlKSB7XG4gICAgICAgICAgdmFyIHAgPSBzZWxlY3QodGhpcykub24oXCJkYmxjbGljay56b29tXCIpO1xuICAgICAgICAgIGlmIChwKSBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB6b29tLndoZWVsRGVsdGEgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAod2hlZWxEZWx0YSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCB6b29tKSA6IHdoZWVsRGVsdGE7XG4gIH07XG5cbiAgem9vbS5maWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCB6b29tKSA6IGZpbHRlcjtcbiAgfTtcblxuICB6b29tLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b3VjaGFibGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogdG91Y2hhYmxlO1xuICB9O1xuXG4gIHpvb20uZXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoW1srX1swXVswXSwgK19bMF1bMV1dLCBbK19bMV1bMF0sICtfWzFdWzFdXV0pLCB6b29tKSA6IGV4dGVudDtcbiAgfTtcblxuICB6b29tLnNjYWxlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlRXh0ZW50WzBdID0gK19bMF0sIHNjYWxlRXh0ZW50WzFdID0gK19bMV0sIHpvb20pIDogW3NjYWxlRXh0ZW50WzBdLCBzY2FsZUV4dGVudFsxXV07XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNsYXRlRXh0ZW50WzBdWzBdID0gK19bMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVswXSA9ICtfWzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV0gPSArX1swXVsxXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdID0gK19bMV1bMV0sIHpvb20pIDogW1t0cmFuc2xhdGVFeHRlbnRbMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXV0sIFt0cmFuc2xhdGVFeHRlbnRbMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXV1dO1xuICB9O1xuXG4gIHpvb20uY29uc3RyYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnN0cmFpbiA9IF8sIHpvb20pIDogY29uc3RyYWluO1xuICB9O1xuXG4gIHpvb20uZHVyYXRpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHVyYXRpb24gPSArXywgem9vbSkgOiBkdXJhdGlvbjtcbiAgfTtcblxuICB6b29tLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRlID0gXywgem9vbSkgOiBpbnRlcnBvbGF0ZTtcbiAgfTtcblxuICB6b29tLm9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IHpvb20gOiB2YWx1ZTtcbiAgfTtcblxuICB6b29tLmNsaWNrRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIHpvb20pIDogTWF0aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTtcbiAgfTtcblxuICB6b29tLnRhcERpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcERpc3RhbmNlID0gK18sIHpvb20pIDogdGFwRGlzdGFuY2U7XG4gIH07XG5cbiAgcmV0dXJuIHpvb207XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0EsWUFBTUEsSUFBYSxvQkFBSUMs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QSxFQUNaLGNBQWM7QUFBQSxFQUNkLGVBQWU7QUFBQSxFQUNmLGVBQWU7QUFBQSxFQUNmLGVBQWU7QUFBQSxFQUNmLGVBQWU7QUFBQSxFQUNmLFlBQVk7QUFBQSxFQUNaLFVBQVU7QUFBQSxFQUNWLGFBQWE7QUFBQSxFQUNiLFNBQVM7QUFBQSxFQUNULFNBQVM7QUFBQSxFQUNULFlBQVk7QUFBQSxFQUNaLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFBQSxFQUNiLGFBQWE7QUFBQSxFQUNiLFNBQVM7QUFBQSxFQUNULFdBQVc7QUFBQSxFQUNYLFlBQVk7QUFBQSxFQUNaLE1BQU07QUFBQSxFQUNOLFdBQVc7QUFBQSxFQUNYLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQSxFQUNiLE1BQU07QUFBQSxFQUNOLFVBQVU7QUFBQSxFQUNWLFNBQVM7QUFBQSxFQUNULFdBQVc7QUFBQSxFQUNYLFFBQVE7QUFBQSxFQUNSLE9BQU87QUFBQSxFQUNQLE9BQU87QUFBQSxFQUNQLFVBQVU7QUFBQSxFQUNWLGVBQWU7QUFBQSxFQUNmLFdBQVc7QUFBQSxFQUNYLGNBQWM7QUFBQSxFQUNkLFdBQVc7QUFBQSxFQUNYLFlBQVk7QUFBQSxFQUNaLFdBQVc7QUFBQSxFQUNYLHNCQUFzQjtBQUFBLEVBQ3RCLFdBQVc7QUFBQSxFQUNYLFlBQVk7QUFBQSxFQUNaLFdBQVc7QUFBQSxFQUNYLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFBQSxFQUNiLGVBQWU7QUFBQSxFQUNmLGNBQWM7QUFBQSxFQUNkLGdCQUFnQjtBQUFBLEVBQ2hCLGdCQUFnQjtBQUFBLEVBQ2hCLGdCQUFnQjtBQUFBLEVBQ2hCLGFBQWE7QUFBQSxFQUNiLE1BQU07QUFBQSxFQUNOLFdBQVc7QUFBQSxFQUNYLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULFFBQVE7QUFBQSxFQUNSLGtCQUFrQjtBQUFBLEVBQ2xCLFlBQVk7QUFBQSxFQUNaLGNBQWM7QUFBQSxFQUNkLGNBQWM7QUFBQSxFQUNkLGdCQUFnQjtBQUFBLEVBQ2hCLGlCQUFp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QUMsS0FBSyxLQUFLLElBQUcsSUFBSTtBQUV4QixTQUFTLFFBQVEsR0FBRztBQUNsQixTQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RCO0FBRUEsU0FBUyxRQUFRLEdBQUc7QUFDbEIsU0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEM7QUFFQSxJQUFJLElBQUk7QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLFNBQVMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxJQUFJLElBQUk7QUFBQSxFQUM1QixPQUFPLFNBQVNDLElBQUcsR0FBRztBQUFFLFdBQU9BLE1BQUssT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDQSxHQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUNBLEdBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQUEsRUFBRztBQUFBLEVBQ3hGLFFBQVEsU0FBUyxJQUFJO0FBQUUsV0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUFBLEVBQUc7QUFDNUQ7QUFFQSxJQUFJLElBQUk7QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLFNBQVMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxJQUFJLElBQUk7QUFBQSxFQUM1QixPQUFPLFNBQVNDLElBQUcsR0FBRztBQUFFLFdBQU9BLE1BQUssT0FBTyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQ0EsR0FBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDQSxHQUFFLENBQUMsQ0FBQyxDQUFDO0FBQUEsRUFBRztBQUFBLEVBQ3hGLFFBQVEsU0FBUyxJQUFJO0FBQUUsV0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFH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LEVBRUEsTUFBTSxlQUFlO0FBQ2pCLFVBQU0sS0FBSyxTQUFTLEtBQUssUUFBUTtBQUFBLEVBQ3JDO0FBQ0o7QUFFQSxJQUFNLG1CQUFOLGNBQStCLGlDQUFpQjtBQUFBLEVBRzVDLFlBQVksS0FBVSxRQUFrQjtBQUNwQyxVQUFNLEtBQUssTUFBTTtBQUNqQixTQUFLLFNBQVM7QUFBQSxFQUNsQjtBQUFBLEVBRUEsVUFBZ0I7QUFDWixVQUFNLEVBQUMsWUFBVyxJQUFJO0FBRXRCLGdCQUFZLE1BQU07QUFFbEIsUUFBSSx3QkFBUSxXQUFXLEVBQ2xCLFFBQVEsWUFBWSxFQUNwQixRQUFRLGVBQWdCLEVBQ3hCLFFBQVEsVUFBUSxLQUNaLGVBQWUsa0RBQWtELEVBQ2pFLFNBQVMsS0FBSyxPQUFPLFNBQVMsU0FBUyxFQUN2QyxTQUFTLE9BQU8sVUFBVTtBQUN2QixXQUFLLE9BQU8sU0FBUyxZQUFZO0FBQ2pDLFlBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxJQUNuQyxDQUFDLENBQUM7QUFBQSxFQUNkO0FBQ0o7IiwKICAibmFtZXMiOiBbImVsZW1lbnRNYXAiLCAiTWFwIiwgIkRhdGEiLCAic2V0IiwgImVsZW1lbnQiLCAia2V5IiwgImluc3RhbmNlIiwgImhhcyIsICJpbnN0YW5jZU1hcCIsICJnZXQiLCAic2l6ZSIsICJjb25zb2xlIiwgImVycm9yIiwgIkFycmF5IiwgImZyb20iLCAia2V5cyIsICJyZW1vdmUiLCAiZGVsZXRlIiwgIlRSQU5TSVRJT05fRU5EIiwgInBhcnNlU2VsZWN0b3IiLCAic2VsZWN0b3IiLCAid2luZG93IiwgIkNTUyIsICJlc2NhcGUiLCAicmVwbGFjZSIsICJtYXRjaCIsICJpZCIsICJ0cmlnZ2VyVHJhbnNpdGlvbkVuZCIsICJkaXNwYXRjaEV2ZW50IiwgIkV2ZW50IiwgImlzRWxlbWVudCIsICJvYmplY3QiLCAianF1ZXJ5IiwgIm5vZGVUeXBlIiwgImdldEVsZW1lbnQiLCAibGVuZ3RoIiwgImRvY3VtZW50IiwgInF1ZXJ5U2VsZWN0b3IiLCAiaXNWaXNpYmxlIiwgImdldENsaWVudFJlY3RzIiwgImVsZW1lbnRJc1Zpc2libGUiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJnZXRQcm9wZXJ0eVZhbHVlIiwgImNsb3NlZERldGFpbHMiLCAiY2xvc2VzdCIsICJzdW1tYXJ5IiwgInBhcmVudE5vZGUiLCAiaXNEaXNhYmxlZCIsICJOb2RlIiwgIkVMRU1FTlRfTk9ERSIsICJjbGFzc0xpc3QiLCAiY29udGFpbnMiLCAiZGlzYWJsZWQiLCAiaGFzQXR0cmlidXRlIiwgImdldEF0dHJpYnV0ZSIsICJmaW5kU2hhZG93Um9vdCIsICJkb2N1bWVudEVsZW1lbnQiLCAiYXR0YWNoU2hhZG93IiwgImdldFJvb3ROb2RlIiwgInJvb3QiLCAiU2hhZG93Um9vdCIsICJub29wIiwgInJlZmxvdyIsICJvZmZzZXRIZWlnaHQiLCAiZ2V0alF1ZXJ5IiwgImpRdWVyeSIsICJib2R5IiwgIkRPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MiLCAiaXNSVEwiLCAiZGlyIiwgImRlZmluZUpRdWVyeVBsdWdpbiIsICJwbHVnaW4iLCAiY2FsbGJhY2siLCAiJCIsICJuYW1lIiwgIk5BTUUiLCAiSlFVRVJZX05PX0NPTkZMSUNUIiwgImZuIiwgImpRdWVyeUludGVyZmFjZSIsICJDb25zdHJ1Y3RvciIsICJub0NvbmZsaWN0IiwgInJlYWR5U3RhdGUiLCAiYWRkRXZlbnRMaXN0ZW5lciIsICJwdXNoIiwgImV4ZWN1dGUiLCAicG9zc2libGVDYWxsYmFjayIsICJhcmdzIiwgImRlZmF1bHRWYWx1ZSIsICJleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uIiwgInRyYW5zaXRpb25FbGVtZW50IiwgIndhaXRGb3JUcmFuc2l0aW9uIiwgImVtdWxhdGVkRHVyYXRpb24iLCAidHJhbnNpdGlvbkR1cmF0aW9uIiwgInRyYW5zaXRpb25EZWxheSIsICJmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiIsICJOdW1iZXIiLCAicGFyc2VGbG9hdCIsICJmbG9hdFRyYW5zaXRpb25EZWxheSIsICJzcGxpdCIsICJjYWxsZWQiLCAiaGFuZGxlciIsICJ0YXJnZXQiLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciIsICJzZXRUaW1lb3V0IiwgImdldE5leHRBY3RpdmVFbGVtZW50IiwgImxpc3QiLCAiYWN0aXZlRWxlbWVudCIsICJzaG91bGRHZXROZXh0IiwgImlzQ3ljbGVBbGxvd2VkIiwgImxpc3RMZW5ndGgiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJNYXRoIiwgIm1heCIsICJtaW4iLCAibmFtZXNwYWNlUmVnZXgiLCAic3RyaXBOYW1lUmVnZXgiLCAic3RyaXBVaWRSZWdleCIsICJldmVudFJlZ2lzdHJ5IiwgInVpZEV2ZW50IiwgImN1c3RvbUV2ZW50cyIsICJtb3VzZWVudGVyIiwgIm1vdXNlbGVhdmUiLCAibmF0aXZlRXZlbnRzIiwgIlNldCIsICJtYWtlRXZlbnRVaWQiLCAidWlkIiwgImdldEVsZW1lbnRFdmVudHMiLCAiZmluZEhhbmRsZXIiLCAiZXZlbnRzIiwgImNhbGxhYmxlIiwgImRlbGVnYXRpb25TZWxlY3RvciIsICJPYmplY3QiLCAidmFsdWVzIiwgImZpbmQiLCAiZXZlbnQiLCAibm9ybWFsaXplUGFyYW1ldGVycyIsICJvcmlnaW5hbFR5cGVFdmVudCIsICJkZWxlZ2F0aW9uRnVuY3Rpb24iLCAiaXNEZWxlZ2F0ZWQiLCAidHlwZUV2ZW50IiwgImdldFR5cGVFdmVudCIsICJhZGRIYW5kbGVyIiwgIm9uZU9mZiIsICJ3cmFwRnVuY3Rpb24iLCAicmVsYXRlZFRhcmdldCIsICJkZWxlZ2F0ZVRhcmdldCIsICJjYWxsIiwgInRoaXMiLCAiaGFuZGxlcnMiLCAicHJldmlvdXNGdW5jdGlvbiIsICJkb21FbGVtZW50cyIsICJxdWVyeVNlbGVjdG9yQWxsIiwgImRvbUVsZW1lbnQiLCAiaHlkcmF0ZU9iaiIsICJFdmVudEhhbmRsZXIiLCAib2ZmIiwgInR5cGUiLCAiYXBwbHkiLCAicmVtb3ZlSGFuZGxlciIsICJCb29sZWFuIiwgInJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyIsICJuYW1lc3BhY2UiLCAic3RvcmVFbGVtZW50RXZlbnQiLCAiaGFuZGxlcktleSIsICJlbnRyaWVzIiwgImluY2x1ZGVzIiwgIm9uIiwgIm9uZSIsICJpbk5hbWVzcGFjZSIsICJpc05hbWVzcGFjZSIsICJzdGFydHNXaXRoIiwgImVsZW1lbnRFdmVudCIsICJzbGljZSIsICJrZXlIYW5kbGVycyIsICJ0cmlnZ2VyIiwgImpRdWVyeUV2ZW50IiwgImJ1YmJsZXMiLCAibmF0aXZlRGlzcGF0Y2giLCAiZGVmYXVsdFByZXZlbnRlZCIsICJpc1Byb3BhZ2F0aW9uU3RvcHBlZCIsICJpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCIsICJpc0RlZmF1bHRQcmV2ZW50ZWQiLCAiZXZ0IiwgImNhbmNlbGFibGUiLCAicHJldmVudERlZmF1bHQiLCAib2JqIiwgIm1ldGEiLCAidmFsdWUiLCAiX3VudXNlZCIsICJkZWZpbmVQcm9wZXJ0eSIsICJjb25maWd1cmFibGUiLCAibm9ybWFsaXplRGF0YSIsICJ0b1N0cmluZyIsICJKU09OIiwgInBhcnNlIiwgImRlY29kZVVSSUNvbXBvbmVudCIsICJub3JtYWxpemVEYXRhS2V5IiwgImNociIsICJ0b0xvd2VyQ2FzZSIsICJNYW5pcHVsYXRvciIsICJzZXREYXRhQXR0cmlidXRlIiwgInNldEF0dHJpYnV0ZSIsICJyZW1vdmVEYXRhQXR0cmlidXRlIiwgInJlbW92ZUF0dHJpYnV0ZSIsICJnZXREYXRhQXR0cmlidXRlcyIsICJhdHRyaWJ1dGVzIiwgImJzS2V5cyIsICJkYXRhc2V0IiwgImZpbHRlciIsICJwdXJlS2V5IiwgImNoYXJBdCIsICJnZXREYXRhQXR0cmlidXRlIiwgIkNvbmZpZyIsICJEZWZhdWx0IiwgIkRlZmF1bHRUeXBlIiwgIkVycm9yIiwgIl9nZXRDb25maWciLCAiY29uZmlnIiwgIl9tZXJnZUNvbmZpZ09iaiIsICJfY29uZmlnQWZ0ZXJNZXJnZSIsICJfdHlwZUNoZWNrQ29uZmlnIiwgImpzb25Db25maWciLCAiY29uc3RydWN0b3IiLCAiY29uZmlnVHlwZXMiLCAicHJvcGVydHkiLCAiZXhwZWN0ZWRUeXBlcyIsICJ2YWx1ZVR5cGUiLCAicHJvdG90eXBlIiwgIlJlZ0V4cCIsICJ0ZXN0IiwgIlR5cGVFcnJvciIsICJ0b1VwcGVyQ2FzZSIsICJCYXNlQ29tcG9uZW50IiwgInN1cGVyIiwgIl9lbGVtZW50IiwgIl9jb25maWciLCAiREFUQV9LRVkiLCAiZGlzcG9zZSIsICJFVkVOVF9LRVkiLCAicHJvcGVydHlOYW1lIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiX3F1ZXVlQ2FsbGJhY2siLCAiaXNBbmltYXRlZCIsICJnZXRJbnN0YW5jZSIsICJWRVJTSU9OIiwgImdldFNlbGVjdG9yIiwgImhyZWZBdHRyaWJ1dGUiLCAidHJpbSIsICJtYXAiLCAic2VsIiwgImpvaW4iLCAiU2VsZWN0b3JFbmdpbmUiLCAiY29uY2F0IiwgIkVsZW1lbnQiLCAiZmluZE9uZSIsICJjaGlsZHJlbiIsICJjaGlsZCIsICJtYXRjaGVzIiwgInBhcmVudHMiLCAiYW5jZXN0b3IiLCAicHJldiIsICJwcmV2aW91cyIsICJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwgIm5leHQiLCAibmV4dEVsZW1lbnRTaWJsaW5nIiwgImZvY3VzYWJsZUNoaWxkcmVuIiwgImZvY3VzYWJsZXMiLCAiZWwiLCAiZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCIsICJnZXRFbGVtZW50RnJvbVNlbGVjdG9yIiwgImdldE11bHRpcGxlRWxlbWVudHNGcm9tU2VsZWN0b3IiLCAiZW5hYmxlRGlzbWlzc1RyaWdnZXIiLCAiY29tcG9uZW50IiwgIm1ldGhvZCIsICJjbGlja0V2ZW50IiwgInRhZ05hbWUiLCAiZ2V0T3JDcmVhdGVJbnN0YW5jZSIsICJFVkVOVF9DTE9TRSIsICJFVkVOVF9DTE9TRUQiLCAiQWxlcnQiLCAiY2xvc2UiLCAiX2Rlc3Ryb3lFbGVtZW50IiwgImVhY2giLCAiZGF0YSIsICJTRUxFQ1RPUl9EQVRBX1RPR0dMRSIsICJCdXR0b24iLCAidG9nZ2xlIiwgImJ1dHRvbiIsICJFVkVOVF9UT1VDSFNUQVJUIiwgIkVWRU5UX1RPVUNITU9WRSIsICJFVkVOVF9UT1VDSEVORCIsICJFVkVOVF9QT0lOVEVSRE9XTiIsICJFVkVOVF9QT0lOVEVSVVAiLCAiZW5kQ2FsbGJhY2siLCAibGVmdENhbGxiYWNrIiwgInJpZ2h0Q2FsbGJhY2siLCAiU3dpcGUiLCAiaXNTdXBwb3J0ZWQiLCAiX2RlbHRhWCIsICJfc3VwcG9ydFBvaW50ZXJFdmVudHMiLCAiUG9pbnRlckV2ZW50IiwgIl9pbml0RXZlbnRzIiwgIl9zdGFydCIsICJfZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaCIsICJjbGllbnRYIiwgInRvdWNoZXMiLCAiX2VuZCIsICJfaGFuZGxlU3dpcGUiLCAiX21vdmUiLCAiYWJzRGVsdGFYIiwgImFicyIsICJkaXJlY3Rpb24iLCAiYWRkIiwgInBvaW50ZXJUeXBlIiwgIm5hdmlnYXRvciIsICJtYXhUb3VjaFBvaW50cyIsICJEQVRBX0FQSV9LRVkiLCAiT1JERVJfTkVYVCIsICJPUkRFUl9QUkVWIiwgIkRJUkVDVElPTl9MRUZUIiwgIkRJUkVDVElPTl9SSUdIVCIsICJFVkVOVF9TTElERSIsICJFVkVOVF9TTElEIiwgIkVWRU5UX0tFWURPV04iLCAiRVZFTlRfTU9VU0VFTlRFUiIsICJFVkVOVF9NT1VTRUxFQVZFIiwgIkVWRU5UX0RSQUdfU1RBUlQiLCAiRVZFTlRfTE9BRF9EQVRBX0FQSSIsICJFVkVOVF9DTElDS19EQVRBX0FQSSIsICJDTEFTU19OQU1FX0NBUk9VU0VMIiwgIkNMQVNTX05BTUVfQUNUSVZFIiwgIlNFTEVDVE9SX0FDVElWRSIsICJTRUxFQ1RPUl9JVEVNIiwgIlNFTEVDVE9SX0FDVElWRV9JVEVNIiwgIktFWV9UT19ESVJFQ1RJT04iLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiaW50ZXJ2YWwiLCAia2V5Ym9hcmQiLCAicGF1c2UiLCAicmlkZSIsICJ0b3VjaCIsICJ3cmFwIiwgIkNhcm91c2VsIiwgIl9pbnRlcnZhbCIsICJfYWN0aXZlRWxlbWVudCIsICJfaXNTbGlkaW5nIiwgInRvdWNoVGltZW91dCIsICJfc3dpcGVIZWxwZXIiLCAiX2luZGljYXRvcnNFbGVtZW50IiwgIl9hZGRFdmVudExpc3RlbmVycyIsICJjeWNsZSIsICJfc2xpZGUiLCAibmV4dFdoZW5WaXNpYmxlIiwgImhpZGRlbiIsICJfY2xlYXJJbnRlcnZhbCIsICJfdXBkYXRlSW50ZXJ2YWwiLCAic2V0SW50ZXJ2YWwiLCAiX21heWJlRW5hYmxlQ3ljbGUiLCAidG8iLCAiaXRlbXMiLCAiX2dldEl0ZW1zIiwgImFjdGl2ZUluZGV4IiwgIl9nZXRJdGVtSW5kZXgiLCAiX2dldEFjdGl2ZSIsICJvcmRlciIsICJkZWZhdWx0SW50ZXJ2YWwiLCAiX2tleWRvd24iLCAiX2FkZFRvdWNoRXZlbnRMaXN0ZW5lcnMiLCAiaW1nIiwgInN3aXBlQ29uZmlnIiwgIl9kaXJlY3Rpb25Ub09yZGVyIiwgImVuZENhbGxCYWNrIiwgImNsZWFyVGltZW91dCIsICJfc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudCIsICJhY3RpdmVJbmRpY2F0b3IiLCAibmV3QWN0aXZlSW5kaWNhdG9yIiwgImVsZW1lbnRJbnRlcnZhbCIsICJwYXJzZUludCIsICJpc05leHQiLCAibmV4dEVsZW1lbnQiLCAibmV4dEVsZW1lbnRJbmRleCIsICJ0cmlnZ2VyRXZlbnQiLCAiZXZlbnROYW1lIiwgIl9vcmRlclRvRGlyZWN0aW9uIiwgImlzQ3ljbGluZyIsICJkaXJlY3Rpb25hbENsYXNzTmFtZSIsICJvcmRlckNsYXNzTmFtZSIsICJjb21wbGV0ZUNhbGxCYWNrIiwgIl9pc0FuaW1hdGVkIiwgImNsZWFySW50ZXJ2YWwiLCAiY2Fyb3VzZWwiLCAic2xpZGVJbmRleCIsICJjYXJvdXNlbHMiLCAiRVZFTlRfU0hPVyIsICJFVkVOVF9TSE9XTiIsICJFVkVOVF9ISURFIiwgIkVWRU5UX0hJRERFTiIsICJDTEFTU19OQU1FX1NIT1ciLCAiQ0xBU1NfTkFNRV9DT0xMQVBTRSIsICJDTEFTU19OQU1FX0NPTExBUFNJTkciLCAiQ0xBU1NfTkFNRV9ERUVQRVJfQ0hJTERSRU4iLCAicGFyZW50IiwgIkNvbGxhcHNlIiwgIl9pc1RyYW5zaXRpb25pbmciLCAiX3RyaWdnZXJBcnJheSIsICJ0b2dnbGVMaXN0IiwgImVsZW0iLCAiZmlsdGVyRWxlbWVudCIsICJmb3VuZEVsZW1lbnQiLCAiX2luaXRpYWxpemVDaGlsZHJlbiIsICJfYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzIiwgIl9pc1Nob3duIiwgImhpZGUiLCAic2hvdyIsICJhY3RpdmVDaGlsZHJlbiIsICJfZ2V0Rmlyc3RMZXZlbENoaWxkcmVuIiwgImFjdGl2ZUluc3RhbmNlIiwgImRpbWVuc2lvbiIsICJfZ2V0RGltZW5zaW9uIiwgInN0eWxlIiwgInNjcm9sbFNpemUiLCAiY29tcGxldGUiLCAiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwgInNlbGVjdGVkIiwgInRyaWdnZXJBcnJheSIsICJpc09wZW4iLCAidG9wIiwgImJvdHRvbSIsICJyaWdodCIsICJsZWZ0IiwgImF1dG8iLCAiYmFzZVBsYWNlbWVudHMiLCAic3RhcnQiLCAiZW5kIiwgImNsaXBwaW5nUGFyZW50cyIsICJ2aWV3cG9ydCIsICJwb3BwZXIiLCAicmVmZXJlbmNlIiwgInZhcmlhdGlvblBsYWNlbWVudHMiLCAicmVkdWNlIiwgImFjYyIsICJwbGFjZW1lbnQiLCAicGxhY2VtZW50cyIsICJiZWZvcmVSZWFkIiwgInJlYWQiLCAiYWZ0ZXJSZWFkIiwgImJlZm9yZU1haW4iLCAibWFpbiIsICJhZnRlck1haW4iLCAiYmVmb3JlV3JpdGUiLCAid3JpdGUiLCAiYWZ0ZXJXcml0ZSIsICJtb2RpZmllclBoYXNlcyIsICJnZXROb2RlTmFtZSIsICJub2RlTmFtZSIsICJnZXRXaW5kb3ciLCAibm9kZSIsICJvd25lckRvY3VtZW50IiwgImRlZmF1bHRWaWV3IiwgImlzSFRNTEVsZW1lbnQiLCAiSFRNTEVsZW1lbnQiLCAiaXNTaGFkb3dSb290IiwgImFwcGx5U3R5bGVzJDEiLCAiZW5hYmxlZCIsICJwaGFzZSIsICJfcmVmIiwgInN0YXRlIiwgImVsZW1lbnRzIiwgImZvckVhY2giLCAic3R5bGVzIiwgImFzc2lnbiIsICJlZmZlY3QiLCAiX3JlZjIiLCAiaW5pdGlhbFN0eWxlcyIsICJwb3NpdGlvbiIsICJvcHRpb25zIiwgInN0cmF0ZWd5IiwgIm1hcmdpbiIsICJhcnJvdyIsICJoYXNPd25Qcm9wZXJ0eSIsICJhdHRyaWJ1dGUiLCAicmVxdWlyZXMiLCAiZ2V0QmFzZVBsYWNlbWVudCIsICJyb3VuZCIsICJnZXRVQVN0cmluZyIsICJ1YURhdGEiLCAidXNlckFnZW50RGF0YSIsICJicmFuZHMiLCAiaXNBcnJheSIsICJpdGVtIiwgImJyYW5kIiwgInZlcnNpb24iLCAidXNlckFnZW50IiwgImlzTGF5b3V0Vmlld3BvcnQiLCAiaW5jbHVkZVNjYWxlIiwgImlzRml4ZWRTdHJhdGVneSIsICJjbGllbnRSZWN0IiwgInNjYWxlWCIsICJzY2FsZVkiLCAib2Zmc2V0V2lkdGgiLCAid2lkdGgiLCAiaGVpZ2h0IiwgInZpc3VhbFZpZXdwb3J0IiwgImFkZFZpc3VhbE9mZnNldHMiLCAieCIsICJvZmZzZXRMZWZ0IiwgInkiLCAib2Zmc2V0VG9wIiwgImdldExheW91dFJlY3QiLCAicm9vdE5vZGUiLCAiaXNTYW1lTm9kZSIsICJob3N0IiwgImlzVGFibGVFbGVtZW50IiwgImdldERvY3VtZW50RWxlbWVudCIsICJnZXRQYXJlbnROb2RlIiwgImFzc2lnbmVkU2xvdCIsICJnZXRUcnVlT2Zmc2V0UGFyZW50IiwgIm9mZnNldFBhcmVudCIsICJnZXRPZmZzZXRQYXJlbnQiLCAiaXNGaXJlZm94IiwgImN1cnJlbnROb2RlIiwgImNzcyIsICJ0cmFuc2Zvcm0iLCAicGVyc3BlY3RpdmUiLCAiY29udGFpbiIsICJ3aWxsQ2hhbmdlIiwgImdldE1haW5BeGlzRnJvbVBsYWNlbWVudCIsICJ3aXRoaW4iLCAibWF0aE1heCIsICJtYXRoTWluIiwgIm1lcmdlUGFkZGluZ09iamVjdCIsICJwYWRkaW5nT2JqZWN0IiwgImV4cGFuZFRvSGFzaE1hcCIsICJoYXNoTWFwIiwgImFycm93JDEiLCAiX3N0YXRlJG1vZGlmaWVyc0RhdGEkIiwgImFycm93RWxlbWVudCIsICJwb3BwZXJPZmZzZXRzIiwgIm1vZGlmaWVyc0RhdGEiLCAiYmFzZVBsYWNlbWVudCIsICJheGlzIiwgImxlbiIsICJwYWRkaW5nIiwgInJlY3RzIiwgImFycm93UmVjdCIsICJtaW5Qcm9wIiwgIm1heFByb3AiLCAiZW5kRGlmZiIsICJzdGFydERpZmYiLCAiYXJyb3dPZmZzZXRQYXJlbnQiLCAiY2xpZW50U2l6ZSIsICJjbGllbnRIZWlnaHQiLCAiY2xpZW50V2lkdGgiLCAiY2VudGVyVG9SZWZlcmVuY2UiLCAiY2VudGVyIiwgIm9mZnNldCIsICJheGlzUHJvcCIsICJjZW50ZXJPZmZzZXQiLCAiX29wdGlvbnMkZWxlbWVudCIsICJyZXF1aXJlc0lmRXhpc3RzIiwgImdldFZhcmlhdGlvbiIsICJ1bnNldFNpZGVzIiwgIm1hcFRvU3R5bGVzIiwgIl9PYmplY3QkYXNzaWduMiIsICJwb3BwZXJSZWN0IiwgInZhcmlhdGlvbiIsICJvZmZzZXRzIiwgImdwdUFjY2VsZXJhdGlvbiIsICJhZGFwdGl2ZSIsICJyb3VuZE9mZnNldHMiLCAiaXNGaXhlZCIsICJfb2Zmc2V0cyR4IiwgIl9vZmZzZXRzJHkiLCAiX3JlZjMiLCAiaGFzWCIsICJoYXNZIiwgInNpZGVYIiwgInNpZGVZIiwgIndpbiIsICJoZWlnaHRQcm9wIiwgIndpZHRoUHJvcCIsICJfT2JqZWN0JGFzc2lnbiIsICJjb21tb25TdHlsZXMiLCAiX3JlZjQiLCAiZHByIiwgImRldmljZVBpeGVsUmF0aW8iLCAiY29tcHV0ZVN0eWxlcyQxIiwgIl9yZWY1IiwgIl9vcHRpb25zJGdwdUFjY2VsZXJhdCIsICJfb3B0aW9ucyRhZGFwdGl2ZSIsICJfb3B0aW9ucyRyb3VuZE9mZnNldHMiLCAicGFzc2l2ZSIsICJldmVudExpc3RlbmVycyIsICJfb3B0aW9ucyRzY3JvbGwiLCAic2Nyb2xsIiwgIl9vcHRpb25zJHJlc2l6ZSIsICJyZXNpemUiLCAic2Nyb2xsUGFyZW50cyIsICJzY3JvbGxQYXJlbnQiLCAidXBkYXRlIiwgImhhc2giLCAiZ2V0T3Bwb3NpdGVQbGFjZW1lbnQiLCAibWF0Y2hlZCIsICJnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudCIsICJnZXRXaW5kb3dTY3JvbGwiLCAic2Nyb2xsTGVmdCIsICJwYWdlWE9mZnNldCIsICJzY3JvbGxUb3AiLCAicGFnZVlPZmZzZXQiLCAiZ2V0V2luZG93U2Nyb2xsQmFyWCIsICJpc1Njcm9sbFBhcmVudCIsICJfZ2V0Q29tcHV0ZWRTdHlsZSIsICJvdmVyZmxvdyIsICJvdmVyZmxvd1giLCAib3ZlcmZsb3dZIiwgImdldFNjcm9sbFBhcmVudCIsICJsaXN0U2Nyb2xsUGFyZW50cyIsICJfZWxlbWVudCRvd25lckRvY3VtZW4iLCAiaXNCb2R5IiwgInVwZGF0ZWRMaXN0IiwgInJlY3RUb0NsaWVudFJlY3QiLCAicmVjdCIsICJnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZSIsICJjbGlwcGluZ1BhcmVudCIsICJodG1sIiwgImxheW91dFZpZXdwb3J0IiwgImNsaWVudFRvcCIsICJjbGllbnRMZWZ0IiwgIndpblNjcm9sbCIsICJzY3JvbGxXaWR0aCIsICJzY3JvbGxIZWlnaHQiLCAiY29tcHV0ZU9mZnNldHMiLCAiY29tbW9uWCIsICJjb21tb25ZIiwgIm1haW5BeGlzIiwgImRldGVjdE92ZXJmbG93IiwgIl9vcHRpb25zIiwgIl9vcHRpb25zJHBsYWNlbWVudCIsICJfb3B0aW9ucyRzdHJhdGVneSIsICJfb3B0aW9ucyRib3VuZGFyeSIsICJib3VuZGFyeSIsICJfb3B0aW9ucyRyb290Qm91bmRhcnkiLCAicm9vdEJvdW5kYXJ5IiwgIl9vcHRpb25zJGVsZW1lbnRDb250ZSIsICJlbGVtZW50Q29udGV4dCIsICJfb3B0aW9ucyRhbHRCb3VuZGFyeSIsICJhbHRCb3VuZGFyeSIsICJfb3B0aW9ucyRwYWRkaW5nIiwgImFsdENvbnRleHQiLCAiY2xpcHBpbmdDbGllbnRSZWN0IiwgIm1haW5DbGlwcGluZ1BhcmVudHMiLCAiY2xpcHBlckVsZW1lbnQiLCAiZmlyc3RDbGlwcGluZ1BhcmVudCIsICJjbGlwcGluZ1JlY3QiLCAiYWNjUmVjdCIsICJjb250ZXh0RWxlbWVudCIsICJyZWZlcmVuY2VDbGllbnRSZWN0IiwgInBvcHBlckNsaWVudFJlY3QiLCAiZWxlbWVudENsaWVudFJlY3QiLCAib3ZlcmZsb3dPZmZzZXRzIiwgIm9mZnNldERhdGEiLCAibXVsdGlwbHkiLCAiY29tcHV0ZUF1dG9QbGFjZW1lbnQiLCAiZmxpcFZhcmlhdGlvbnMiLCAiX29wdGlvbnMkYWxsb3dlZEF1dG9QIiwgImFsbG93ZWRBdXRvUGxhY2VtZW50cyIsICJhbGxQbGFjZW1lbnRzIiwgImFsbG93ZWRQbGFjZW1lbnRzIiwgIm92ZXJmbG93cyIsICJzb3J0IiwgImEiLCAiYiIsICJmbGlwJDEiLCAiX3NraXAiLCAiX29wdGlvbnMkbWFpbkF4aXMiLCAiY2hlY2tNYWluQXhpcyIsICJfb3B0aW9ucyRhbHRBeGlzIiwgImFsdEF4aXMiLCAiY2hlY2tBbHRBeGlzIiwgInNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyIsICJmYWxsYmFja1BsYWNlbWVudHMiLCAiX29wdGlvbnMkZmxpcFZhcmlhdGlvIiwgInByZWZlcnJlZFBsYWNlbWVudCIsICJvcHBvc2l0ZVBsYWNlbWVudCIsICJyZWZlcmVuY2VSZWN0IiwgImNoZWNrc01hcCIsICJtYWtlRmFsbGJhY2tDaGVja3MiLCAiZmlyc3RGaXR0aW5nUGxhY2VtZW50IiwgImkiLCAiX2Jhc2VQbGFjZW1lbnQiLCAiaXNTdGFydFZhcmlhdGlvbiIsICJpc1ZlcnRpY2FsIiwgIm1haW5WYXJpYXRpb25TaWRlIiwgImFsdFZhcmlhdGlvblNpZGUiLCAiY2hlY2tzIiwgImV2ZXJ5IiwgImNoZWNrIiwgIl9sb29wIiwgIl9pIiwgImZpdHRpbmdQbGFjZW1lbnQiLCAicmVzZXQiLCAiZ2V0U2lkZU9mZnNldHMiLCAicHJldmVudGVkT2Zmc2V0cyIsICJpc0FueVNpZGVGdWxseUNsaXBwZWQiLCAic29tZSIsICJzaWRlIiwgImhpZGUkMSIsICJwcmV2ZW50T3ZlcmZsb3ciLCAicmVmZXJlbmNlT3ZlcmZsb3ciLCAicG9wcGVyQWx0T3ZlcmZsb3ciLCAicmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzIiwgInBvcHBlckVzY2FwZU9mZnNldHMiLCAiaXNSZWZlcmVuY2VIaWRkZW4iLCAiaGFzUG9wcGVyRXNjYXBlZCIsICJvZmZzZXQkMSIsICJfb3B0aW9ucyRvZmZzZXQiLCAiaW52ZXJ0RGlzdGFuY2UiLCAic2tpZGRpbmciLCAiZGlzdGFuY2UiLCAiX2RhdGEkc3RhdGUkcGxhY2VtZW50IiwgInBvcHBlck9mZnNldHMkMSIsICJwcmV2ZW50T3ZlcmZsb3ckMSIsICJfb3B0aW9ucyR0ZXRoZXIiLCAidGV0aGVyIiwgIl9vcHRpb25zJHRldGhlck9mZnNldCIsICJ0ZXRoZXJPZmZzZXQiLCAiaXNCYXNlUGxhY2VtZW50IiwgInRldGhlck9mZnNldFZhbHVlIiwgIm5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZSIsICJvZmZzZXRNb2RpZmllclN0YXRlIiwgIl9vZmZzZXRNb2RpZmllclN0YXRlJCIsICJtYWluU2lkZSIsICJhbHRTaWRlIiwgImFkZGl0aXZlIiwgIm1pbkxlbiIsICJtYXhMZW4iLCAiYXJyb3dQYWRkaW5nT2JqZWN0IiwgImFycm93UGFkZGluZ01pbiIsICJhcnJvd1BhZGRpbmdNYXgiLCAiYXJyb3dMZW4iLCAibWluT2Zmc2V0IiwgIm1heE9mZnNldCIsICJjbGllbnRPZmZzZXQiLCAib2Zmc2V0TW9kaWZpZXJWYWx1ZSIsICJ0ZXRoZXJNYXgiLCAicHJldmVudGVkT2Zmc2V0IiwgIl9vZmZzZXRNb2RpZmllclN0YXRlJDIiLCAiX21haW5TaWRlIiwgIl9hbHRTaWRlIiwgIl9vZmZzZXQiLCAiX2xlbiIsICJfbWluIiwgIl9tYXgiLCAiaXNPcmlnaW5TaWRlIiwgIl9vZmZzZXRNb2RpZmllclZhbHVlIiwgIl90ZXRoZXJNaW4iLCAiX3RldGhlck1heCIsICJfcHJldmVudGVkT2Zmc2V0IiwgInYiLCAiZ2V0Q29tcG9zaXRlUmVjdCIsICJlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCIsICJpc09mZnNldFBhcmVudEFuRWxlbWVudCIsICJvZmZzZXRQYXJlbnRJc1NjYWxlZCIsICJtb2RpZmllcnMiLCAidmlzaXRlZCIsICJyZXN1bHQiLCAibW9kaWZpZXIiLCAiZGVwIiwgImRlcE1vZGlmaWVyIiwgIkRFRkFVTFRfT1BUSU9OUyIsICJhcmVWYWxpZEVsZW1lbnRzIiwgImFyZ3VtZW50cyIsICJfa2V5IiwgInBvcHBlckdlbmVyYXRvciIsICJnZW5lcmF0b3JPcHRpb25zIiwgIl9nZW5lcmF0b3JPcHRpb25zIiwgIl9nZW5lcmF0b3JPcHRpb25zJGRlZiIsICJkZWZhdWx0TW9kaWZpZXJzIiwgIl9nZW5lcmF0b3JPcHRpb25zJGRlZjIiLCAiZGVmYXVsdE9wdGlvbnMiLCAicGVuZGluZyIsICJvcmRlcmVkTW9kaWZpZXJzIiwgImVmZmVjdENsZWFudXBGbnMiLCAiaXNEZXN0cm95ZWQiLCAic2V0T3B0aW9ucyIsICJzZXRPcHRpb25zQWN0aW9uIiwgImNsZWFudXBNb2RpZmllckVmZmVjdHMiLCAibWVyZ2VkIiwgImN1cnJlbnQiLCAiZXhpc3RpbmciLCAibSIsICJfcmVmJG9wdGlvbnMiLCAiY2xlYW51cEZuIiwgImZvcmNlVXBkYXRlIiwgIl9zdGF0ZSRlbGVtZW50cyIsICJfc3RhdGUkb3JkZXJlZE1vZGlmaWUiLCAiX3N0YXRlJG9yZGVyZWRNb2RpZmllMiIsICJQcm9taXNlIiwgInJlc29sdmUiLCAidGhlbiIsICJkZXN0cm95IiwgIm9uRmlyc3RVcGRhdGUiLCAiY3JlYXRlUG9wcGVyIiwgImNvbXB1dGVTdHlsZXMiLCAiYXBwbHlTdHlsZXMiLCAiZmxpcCIsICJBUlJPV19VUF9LRVkiLCAiQVJST1dfRE9XTl9LRVkiLCAiRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSIsICJFVkVOVF9LRVlVUF9EQVRBX0FQSSIsICJTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TSE9XTiIsICJTRUxFQ1RPUl9NRU5VIiwgIlBMQUNFTUVOVF9UT1AiLCAiUExBQ0VNRU5UX1RPUEVORCIsICJQTEFDRU1FTlRfQk9UVE9NIiwgIlBMQUNFTUVOVF9CT1RUT01FTkQiLCAiUExBQ0VNRU5UX1JJR0hUIiwgIlBMQUNFTUVOVF9MRUZUIiwgImF1dG9DbG9zZSIsICJkaXNwbGF5IiwgInBvcHBlckNvbmZpZyIsICJEcm9wZG93biIsICJfcG9wcGVyIiwgIl9wYXJlbnQiLCAiX21lbnUiLCAiX2luTmF2YmFyIiwgIl9kZXRlY3ROYXZiYXIiLCAiX2NyZWF0ZVBvcHBlciIsICJmb2N1cyIsICJfY29tcGxldGVIaWRlIiwgIlBvcHBlciIsICJyZWZlcmVuY2VFbGVtZW50IiwgIl9nZXRQb3BwZXJDb25maWciLCAiX2dldFBsYWNlbWVudCIsICJwYXJlbnREcm9wZG93biIsICJpc0VuZCIsICJfZ2V0T2Zmc2V0IiwgInBvcHBlckRhdGEiLCAiZGVmYXVsdEJzUG9wcGVyQ29uZmlnIiwgIl9zZWxlY3RNZW51SXRlbSIsICJvcGVuVG9nZ2xlcyIsICJjb250ZXh0IiwgImNvbXBvc2VkUGF0aCIsICJpc01lbnVUYXJnZXQiLCAiaXNJbnB1dCIsICJpc0VzY2FwZUV2ZW50IiwgImlzVXBPckRvd25FdmVudCIsICJnZXRUb2dnbGVCdXR0b24iLCAic3RvcFByb3BhZ2F0aW9uIiwgImRhdGFBcGlLZXlkb3duSGFuZGxlciIsICJjbGVhck1lbnVzIiwgIkVWRU5UX01PVVNFRE9XTiIsICJjbGFzc05hbWUiLCAiY2xpY2tDYWxsYmFjayIsICJyb290RWxlbWVudCIsICJCYWNrZHJvcCIsICJfaXNBcHBlbmRlZCIsICJfYXBwZW5kIiwgIl9nZXRFbGVtZW50IiwgIl9lbXVsYXRlQW5pbWF0aW9uIiwgImJhY2tkcm9wIiwgImNyZWF0ZUVsZW1lbnQiLCAiYXBwZW5kIiwgIkVWRU5UX0ZPQ1VTSU4iLCAiRVZFTlRfS0VZRE9XTl9UQUIiLCAiVEFCX05BVl9CQUNLV0FSRCIsICJhdXRvZm9jdXMiLCAidHJhcEVsZW1lbnQiLCAiRm9jdXNUcmFwIiwgIl9pc0FjdGl2ZSIsICJfbGFzdFRhYk5hdkRpcmVjdGlvbiIsICJhY3RpdmF0ZSIsICJfaGFuZGxlRm9jdXNpbiIsICJfaGFuZGxlS2V5ZG93biIsICJkZWFjdGl2YXRlIiwgInNoaWZ0S2V5IiwgIlNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQiLCAiU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQiLCAiUFJPUEVSVFlfUEFERElORyIsICJQUk9QRVJUWV9NQVJHSU4iLCAiU2Nyb2xsQmFySGVscGVyIiwgImdldFdpZHRoIiwgImRvY3VtZW50V2lkdGgiLCAiaW5uZXJXaWR0aCIsICJfZGlzYWJsZU92ZXJGbG93IiwgIl9zZXRFbGVtZW50QXR0cmlidXRlcyIsICJjYWxjdWxhdGVkVmFsdWUiLCAiX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMiLCAiaXNPdmVyZmxvd2luZyIsICJfc2F2ZUluaXRpYWxBdHRyaWJ1dGUiLCAic3R5bGVQcm9wZXJ0eSIsICJzY3JvbGxiYXJXaWR0aCIsICJfYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayIsICJzZXRQcm9wZXJ0eSIsICJhY3R1YWxWYWx1ZSIsICJyZW1vdmVQcm9wZXJ0eSIsICJjYWxsQmFjayIsICJFVkVOVF9ISURFX1BSRVZFTlRFRCIsICJFVkVOVF9SRVNJWkUiLCAiRVZFTlRfQ0xJQ0tfRElTTUlTUyIsICJFVkVOVF9NT1VTRURPV05fRElTTUlTUyIsICJFVkVOVF9LRVlET1dOX0RJU01JU1MiLCAiQ0xBU1NfTkFNRV9PUEVOIiwgIkNMQVNTX05BTUVfU1RBVElDIiwgIk1vZGFsIiwgIl9kaWFsb2ciLCAiX2JhY2tkcm9wIiwgIl9pbml0aWFsaXplQmFja0Ryb3AiLCAiX2ZvY3VzdHJhcCIsICJfaW5pdGlhbGl6ZUZvY3VzVHJhcCIsICJfc2Nyb2xsQmFyIiwgIl9hZGp1c3REaWFsb2ciLCAiX3Nob3dFbGVtZW50IiwgIl9oaWRlTW9kYWwiLCAiaGFuZGxlVXBkYXRlIiwgIm1vZGFsQm9keSIsICJ0cmFuc2l0aW9uQ29tcGxldGUiLCAiX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24iLCAiZXZlbnQyIiwgIl9yZXNldEFkanVzdG1lbnRzIiwgImlzTW9kYWxPdmVyZmxvd2luZyIsICJpbml0aWFsT3ZlcmZsb3dZIiwgImlzQm9keU92ZXJmbG93aW5nIiwgInBhZGRpbmdMZWZ0IiwgInBhZGRpbmdSaWdodCIsICJzaG93RXZlbnQiLCAiYWxyZWFkeU9wZW4iLCAiQ0xBU1NfTkFNRV9TSE9XSU5HIiwgIkNMQVNTX05BTUVfSElESU5HIiwgIk9QRU5fU0VMRUNUT1IiLCAiT2ZmY2FudmFzIiwgImJsdXIiLCAiY29tcGxldGVDYWxsYmFjayIsICJEZWZhdWx0QWxsb3dsaXN0IiwgImFyZWEiLCAiYnIiLCAiY29sIiwgImNvZGUiLCAiZGQiLCAiZGl2IiwgImRsIiwgImR0IiwgImVtIiwgImhyIiwgImgxIiwgImgyIiwgImgzIiwgImg0IiwgImg1IiwgImg2IiwgImxpIiwgIm9sIiwgInAiLCAicHJlIiwgInMiLCAic21hbGwiLCAic3BhbiIsICJzdWIiLCAic3VwIiwgInN0cm9uZyIsICJ1IiwgInVsIiwgInVyaUF0dHJpYnV0ZXMiLCAiU0FGRV9VUkxfUEFUVEVSTiIsICJhbGxvd2VkQXR0cmlidXRlIiwgImFsbG93ZWRBdHRyaWJ1dGVMaXN0IiwgImF0dHJpYnV0ZU5hbWUiLCAibm9kZVZhbHVlIiwgImF0dHJpYnV0ZVJlZ2V4IiwgInJlZ2V4IiwgImFsbG93TGlzdCIsICJjb250ZW50IiwgImV4dHJhQ2xhc3MiLCAic2FuaXRpemUiLCAic2FuaXRpemVGbiIsICJ0ZW1wbGF0ZSIsICJEZWZhdWx0Q29udGVudFR5cGUiLCAiZW50cnkiLCAiVGVtcGxhdGVGYWN0b3J5IiwgImdldENvbnRlbnQiLCAiX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uIiwgImhhc0NvbnRlbnQiLCAiY2hhbmdlQ29udGVudCIsICJfY2hlY2tDb250ZW50IiwgInRvSHRtbCIsICJ0ZW1wbGF0ZVdyYXBwZXIiLCAiaW5uZXJIVE1MIiwgIl9tYXliZVNhbml0aXplIiwgInRleHQiLCAiX3NldENvbnRlbnQiLCAiYXJnIiwgInRlbXBsYXRlRWxlbWVudCIsICJfcHV0RWxlbWVudEluVGVtcGxhdGUiLCAidGV4dENvbnRlbnQiLCAidW5zYWZlSHRtbCIsICJzYW5pdGl6ZUZ1bmN0aW9uIiwgImNyZWF0ZWREb2N1bWVudCIsICJET01QYXJzZXIiLCAicGFyc2VGcm9tU3RyaW5nIiwgImVsZW1lbnROYW1lIiwgImF0dHJpYnV0ZUxpc3QiLCAiYWxsb3dlZEF0dHJpYnV0ZXMiLCAiRElTQUxMT1dFRF9BVFRSSUJVVEVTIiwgIkNMQVNTX05BTUVfRkFERSIsICJTRUxFQ1RPUl9NT0RBTCIsICJFVkVOVF9NT0RBTF9ISURFIiwgIlRSSUdHRVJfSE9WRVIiLCAiVFJJR0dFUl9GT0NVUyIsICJBdHRhY2htZW50TWFwIiwgIkFVVE8iLCAiVE9QIiwgIlJJR0hUIiwgIkJPVFRPTSIsICJMRUZUIiwgImFuaW1hdGlvbiIsICJjb250YWluZXIiLCAiY3VzdG9tQ2xhc3MiLCAiZGVsYXkiLCAidGl0bGUiLCAiVG9vbHRpcCIsICJfaXNFbmFibGVkIiwgIl90aW1lb3V0IiwgIl9pc0hvdmVyZWQiLCAiX2FjdGl2ZVRyaWdnZXIiLCAiX3RlbXBsYXRlRmFjdG9yeSIsICJfbmV3Q29udGVudCIsICJ0aXAiLCAiX3NldExpc3RlbmVycyIsICJfZml4VGl0bGUiLCAiZW5hYmxlIiwgImRpc2FibGUiLCAidG9nZ2xlRW5hYmxlZCIsICJjbGljayIsICJfbGVhdmUiLCAiX2VudGVyIiwgIl9oaWRlTW9kYWxIYW5kbGVyIiwgIl9kaXNwb3NlUG9wcGVyIiwgIl9pc1dpdGhDb250ZW50IiwgImlzSW5UaGVEb20iLCAiX2dldFRpcEVsZW1lbnQiLCAiX2lzV2l0aEFjdGl2ZVRyaWdnZXIiLCAiX2dldFRpdGxlIiwgIl9jcmVhdGVUaXBFbGVtZW50IiwgIl9nZXRDb250ZW50Rm9yVGVtcGxhdGUiLCAiX2dldFRlbXBsYXRlRmFjdG9yeSIsICJ0aXBJZCIsICJwcmVmaXgiLCAiZmxvb3IiLCAicmFuZG9tIiwgImdldEVsZW1lbnRCeUlkIiwgInNldENvbnRlbnQiLCAiX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldCIsICJfZ2V0RGVsZWdhdGVDb25maWciLCAiYXR0YWNobWVudCIsICJ0cmlnZ2VycyIsICJldmVudEluIiwgImV2ZW50T3V0IiwgIl9zZXRUaW1lb3V0IiwgInRpbWVvdXQiLCAiZGF0YUF0dHJpYnV0ZXMiLCAiZGF0YUF0dHJpYnV0ZSIsICJQb3BvdmVyIiwgIl9nZXRDb250ZW50IiwgIkVWRU5UX0FDVElWQVRFIiwgIkVWRU5UX0NMSUNLIiwgIlNFTEVDVE9SX1RBUkdFVF9MSU5LUyIsICJTRUxFQ1RPUl9OQVZfTElOS1MiLCAiU0VMRUNUT1JfTElOS19JVEVNUyIsICJyb290TWFyZ2luIiwgInNtb290aFNjcm9sbCIsICJ0aHJlc2hvbGQiLCAiU2Nyb2xsU3B5IiwgIl90YXJnZXRMaW5rcyIsICJfb2JzZXJ2YWJsZVNlY3Rpb25zIiwgIl9yb290RWxlbWVudCIsICJfYWN0aXZlVGFyZ2V0IiwgIl9vYnNlcnZlciIsICJfcHJldmlvdXNTY3JvbGxEYXRhIiwgInZpc2libGVFbnRyeVRvcCIsICJwYXJlbnRTY3JvbGxUb3AiLCAicmVmcmVzaCIsICJfaW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcyIsICJfbWF5YmVFbmFibGVTbW9vdGhTY3JvbGwiLCAiZGlzY29ubmVjdCIsICJfZ2V0TmV3T2JzZXJ2ZXIiLCAic2VjdGlvbiIsICJvYnNlcnZlIiwgIm9ic2VydmFibGVTZWN0aW9uIiwgInNjcm9sbFRvIiwgImJlaGF2aW9yIiwgIkludGVyc2VjdGlvbk9ic2VydmVyIiwgIl9vYnNlcnZlckNhbGxiYWNrIiwgInRhcmdldEVsZW1lbnQiLCAiX3Byb2Nlc3MiLCAidXNlclNjcm9sbHNEb3duIiwgImlzSW50ZXJzZWN0aW5nIiwgIl9jbGVhckFjdGl2ZUNsYXNzIiwgImVudHJ5SXNMb3dlclRoYW5QcmV2aW91cyIsICJ0YXJnZXRMaW5rcyIsICJhbmNob3IiLCAiZGVjb2RlVVJJIiwgIl9hY3RpdmF0ZVBhcmVudHMiLCAibGlzdEdyb3VwIiwgImFjdGl2ZU5vZGVzIiwgInNweSIsICJBUlJPV19MRUZUX0tFWSIsICJBUlJPV19SSUdIVF9LRVkiLCAiSE9NRV9LRVkiLCAiRU5EX0tFWSIsICJTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUiLCAiTk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRSIsICJTRUxFQ1RPUl9JTk5FUl9FTEVNIiwgIlNFTEVDVE9SX0RBVEFfVE9HR0xFX0FDVElWRSIsICJUYWIiLCAiX3NldEluaXRpYWxBdHRyaWJ1dGVzIiwgIl9nZXRDaGlsZHJlbiIsICJpbm5lckVsZW0iLCAiX2VsZW1Jc0FjdGl2ZSIsICJhY3RpdmUiLCAiX2dldEFjdGl2ZUVsZW0iLCAiaGlkZUV2ZW50IiwgIl9kZWFjdGl2YXRlIiwgIl9hY3RpdmF0ZSIsICJyZWxhdGVkRWxlbSIsICJfdG9nZ2xlRHJvcERvd24iLCAibmV4dEFjdGl2ZUVsZW1lbnQiLCAicHJldmVudFNjcm9sbCIsICJfc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMiLCAiX3NldEluaXRpYWxBdHRyaWJ1dGVzT25DaGlsZCIsICJfZ2V0SW5uZXJFbGVtZW50IiwgImlzQWN0aXZlIiwgIm91dGVyRWxlbSIsICJfZ2V0T3V0ZXJFbGVtZW50IiwgIl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwiLCAib3BlbiIsICJFVkVOVF9NT1VTRU9WRVIiLCAiRVZFTlRfTU9VU0VPVVQiLCAiRVZFTlRfRk9DVVNPVVQiLCAiQ0xBU1NfTkFNRV9ISURFIiwgImF1dG9oaWRlIiwgIlRvYXN0IiwgIl9oYXNNb3VzZUludGVyYWN0aW9uIiwgIl9oYXNLZXlib2FyZEludGVyYWN0aW9uIiwgIl9jbGVhclRpbWVvdXQiLCAiX21heWJlU2NoZWR1bGVIaWRlIiwgImlzU2hvd24iLCAiX29uSW50ZXJhY3Rpb24iLCAiaXNJbnRlcmFjdGluZyIsICJhIiwgImEiLCAieCIsICJhIiwgIngiLCAic3RhcnQiLCAidGlja3MiLCAiY29weSIsICJ0eXBlIiwgImMiLCAiZG9jdW1lbnQiLCAibSIsICJ4IiwgIm0iLCAibSIsICJkYXR1bSIsICJ4IiwgIm0iLCAic2VsZWN0aW9uIiwgIm0iLCAibSIsICJhc2NlbmRpbmciLCAiYSIsICJtIiwgIm0iLCAibSIsICJjcmVhdGUiLCAiY3JlYXRlIiwgInBhcnNlVHlwZW5hbWVzIiwgIm0iLCAidHlwZSIsICJ3aW5kb3ciLCAiZGlzcGF0Y2hfZGVmYXVsdCIsICJtIiwgImRpc3BhdGNoX2RlZmF1bHQiLCAic2VsZWN0X2RlZmF1bHQiLCAicm9vdCIsICJzZWxlY3Rpb24iLCAic2VsZWN0X2RlZmF1bHQiLCAiY29uc3RhbnRfZGVmYXVsdCIsICJ4IiwgInR5cGUiLCAieCIsICJ5IiwgImRpc3BhdGNoIiwgImZpbHRlciIsICJzZWxlY3Rpb24iLCAic2VsZWN0X2RlZmF1bHQiLCAiYyIsICJjb250YWluZXIiLCAiZGlzcGF0Y2giLCAidHlwZSIsICJldmVudCIsICJ0b3VjaCIsICJjb25zdGFudF9kZWZhdWx0IiwgImZvcm1hdCIsICJtIiwgImEiLCAibWluIiwgIm1heCIsICJjb25zdGFudF9kZWZhdWx0IiwgIngiLCAiYSIsICJ5IiwgInkiLCAiYSIsICJjb25zdGFudF9kZWZhdWx0IiwgInkiLCAiY29sb3IiLCAicmdiIiwgInN0YXJ0IiwgImEiLCAiYyIsICJ4IiwgImEiLCAieCIsICJjIiwgImEiLCAiYSIsICJhIiwgImMiLCAiemVybyIsICJhIiwgImkiLCAiYSIsICJjIiwgImNvbnN0YW50X2RlZmF1bHQiLCAiYSIsICJhIiwgImMiLCAibSIsICJhIiwgIngiLCAibm93IiwgImlkIiwgImluZGV4IiwgImdldCIsICJzZXQiLCAic2VsZiIsICJzdGFydCIsICJlbXB0eSIsICJpbnRlcnJ1cHRfZGVmYXVsdCIsICJpZCIsICJzZXQiLCAiZ2V0IiwgInRyYW5zaXRpb24iLCAiYSIsICJjIiwgImF0dHJSZW1vdmUiLCAiYXR0clJlbW92ZU5TIiwgImF0dHJDb25zdGFudCIsICJhdHRyQ29uc3RhbnROUyIsICJhdHRyRnVuY3Rpb24iLCAiYXR0ckZ1bmN0aW9uTlMiLCAiYXR0cl9kZWZhdWx0IiwgImlkIiwgImdldCIsICJpZCIsICJzZXQiLCAiZ2V0IiwgImlkIiwgInNldCIsICJnZXQiLCAiaWQiLCAic2V0IiwgImZpbHRlcl9kZWZhdWx0IiwgIm0iLCAibWVyZ2VfZGVmYXVsdCIsICJ0cmFuc2l0aW9uIiwgIm0iLCAiaWQiLCAic2V0IiwgIm9uX2RlZmF1bHQiLCAiZ2V0IiwgImlkIiwgInJlbW92ZV9kZWZhdWx0IiwgInNlbGVjdF9kZWZhdWx0IiwgImlkIiwgIm0iLCAiZ2V0IiwgInNlbGVjdEFsbF9kZWZhdWx0IiwgImlkIiwgIm0iLCAiY2hpbGRyZW4iLCAiaW5oZXJpdCIsICJnZXQiLCAiU2VsZWN0aW9uIiwgInNlbGVjdGlvbl9kZWZhdWx0IiwgInN0eWxlUmVtb3ZlIiwgInN0eWxlQ29uc3RhbnQiLCAic3R5bGVGdW5jdGlvbiIsICJpZCIsICJyZW1vdmUiLCAic2V0IiwgInN0eWxlX2RlZmF1bHQiLCAidGV4dENvbnN0YW50IiwgInRleHRGdW5jdGlvbiIsICJ0ZXh0X2RlZmF1bHQiLCAibSIsICJpbmhlcml0IiwgImdldCIsICJpZCIsICJzZXQiLCAiaWQiLCAic2VsZWN0X2RlZmF1bHQiLCAic2VsZWN0QWxsX2RlZmF1bHQiLCAiZmlsdGVyX2RlZmF1bHQiLCAibWVyZ2VfZGVmYXVsdCIsICJzZWxlY3Rpb25fZGVmYXVsdCIsICJvbl9kZWZhdWx0IiwgImF0dHJfZGVmYXVsdCIsICJzdHlsZV9kZWZhdWx0IiwgInRleHRfZGVmYXVsdCIsICJyZW1vdmVfZGVmYXVsdCIsICJpZCIsICJ0cmFuc2l0aW9uX2RlZmF1bHQiLCAibSIsICJpbnRlcnJ1cHRfZGVmYXVsdCIsICJ0cmFuc2l0aW9uX2RlZmF1bHQiLCAieCIsICJ5IiwgIngiLCAieSIsICJ4IiwgInkiLCAieCIsICJ5IiwgImRhdGFfZGVmYXVsdCIsICJ4IiwgInkiLCAieDIiLCAieTIiLCAieDMiLCAieTMiLCAicmVtb3ZlX2RlZmF1bHQiLCAieCIsICJ5IiwgInNpemVfZGVmYXVsdCIsICJ4IiwgInkiLCAiY29weSIsICJkYXRhX2RlZmF1bHQiLCAicmVtb3ZlX2RlZmF1bHQiLCAic2l6ZV9kZWZhdWx0IiwgImNvbnN0YW50X2RlZmF1bHQiLCAieCIsICJjb25zdGFudF9kZWZhdWx0IiwgIngiLCAieSIsICJmaW5kIiwgImlkIiwgImNvbnN0YW50X2RlZmF1bHQiLCAieCIsICJ5IiwgIm0iLCAiaSIsICJ4IiwgInkiLCAiY29uc3RhbnRfZGVmYXVsdCIsICJ4IiwgInkiLCAibm9kZSIsICJzdHJlbmd0aCIsICJjIiwgIngyIiwgInhfZGVmYXVsdCIsICJ4IiwgImNvbnN0YW50X2RlZmF1bHQiLCAieV9kZWZhdWx0IiwgInkiLCAiY29uc3RhbnRfZGVmYXVsdCIsICJ4IiwgIngiLCAieCIsICJ4IiwgIngiLCAieCIsICJsb2NhbGUiLCAiemVybyIsICJ0eXBlIiwgImZvcm1hdCIsICJjIiwgImZvcm1hdFByZWZpeCIsICJ2YWx1ZSIsICJtYXgiLCAieCIsICJudW1iZXIiLCAieCIsICJpZGVudGl0eSIsICJ4IiwgImEiLCAiaSIsICJ0cmFuc2Zvcm0iLCAieSIsICJudW1iZXIiLCAic3RhcnQiLCAic3RhcnQiLCAibGluZWFyIiwgImNvbnN0YW50X2RlZmF1bHQiLCAieCIsICJ0eXBlIiwgInRyYW5zZm9ybSIsICJkaXNwYXRjaCIsICJ4IiwgInkiLCAiaWRlbnRpdHkiLCAibm9wcm9wYWdhdGlvbiIsICJub2V2ZW50X2RlZmF1bHQiLCAiZGVmYXVsdEZpbHRlciIsICJpZGVudGl0eSIsICJkZWZhdWx0VG91Y2hhYmxlIiwgInRyYW5zZm9ybSIsICJ6b29tX2RlZmF1bHQiLCAiZmlsdGVyIiwgInNlbGVjdGlvbiIsICJ4IiwgInkiLCAiZXh0ZW50IiwgInRyYW5zaXRpb24iLCAiYSIsICJ0eXBlIiwgInNlbGVjdF9kZWZhdWx0IiwgIm5vZXZlbnRfZGVmYXVsdCIsICJub3Byb3BhZ2F0aW9uIiwgImV2ZW50IiwgImNvbnN0YW50X2RlZmF1bHQiLCAibm9kZXMiLCAibGlua3MiLCAibm9kZSIsICJsaW5rIiwgImluZGV4IiwgInNlbGVjdF9kZWZhdWx0IiwgInpvb21fZGVmYXVsdCIsICJ4IiwgInkiLCAieF9kZWZhdWx0IiwgInlfZGVmYXVsdCIsICJpZCIsICJsaW5lYXIiLCAidGltZW91dCJdCn0K
|