@getopenpay/openpay-js
Version:
Accept payments through OpenPay, right on your site
1,013 lines • 182 kB
JavaScript
import { z as Ar, p as g, _ as X, s as Pr, l as Sr, j as Ir, q as vr, y as yr, dK as hr, h as gr, dL as mr, n as Cr, r as Nr, i as Mr, m as Ur, o as Br, t as br, u as Dr } from "./url-UQ0zRf8J.js";
import { i as G, s as Q, u as Xr } from "./suppress-tracing-BllHYdAl.js";
import { d as c } from "./diag-api-CWQhqUTV.js";
import { h as q, E as Gr } from "./ExportResult-BacsqwKA.js";
import { f as u, t as N, i as k, T as M, c as wr, b as Vr, a as K } from "./index-B_XmW797.js";
import { a as jr, bm as Hr } from "./sdk-info-ChuKu8zW.js";
var l;
(function(r) {
r[r.NOT_RECORD = 0] = "NOT_RECORD", r[r.RECORD = 1] = "RECORD", r[r.RECORD_AND_SAMPLED = 2] = "RECORD_AND_SAMPLED";
})(l || (l = {}));
var xr = "=", U = ";", I = ",", m = "baggage", Fr = 180, Kr = 4096, Yr = 8192, zr = function(r, e) {
var t = typeof Symbol == "function" && r[Symbol.iterator];
if (!t) return r;
var n = t.call(r), a, i = [], o;
try {
for (; (e === void 0 || e-- > 0) && !(a = n.next()).done; ) i.push(a.value);
} catch (_) {
o = { error: _ };
} finally {
try {
a && !a.done && (t = n.return) && t.call(n);
} finally {
if (o) throw o.error;
}
}
return i;
};
function rr(r) {
return r.reduce(function(e, t) {
var n = "" + e + (e !== "" ? I : "") + t;
return n.length > Yr ? e : n;
}, "");
}
function er(r) {
return r.getAllEntries().map(function(e) {
var t = zr(e, 2), n = t[0], a = t[1], i = encodeURIComponent(n) + "=" + encodeURIComponent(a.value);
return a.metadata !== void 0 && (i += U + a.metadata.toString()), i;
});
}
function w(r) {
var e = r.split(U);
if (!(e.length <= 0)) {
var t = e.shift();
if (t) {
var n = t.indexOf(xr);
if (!(n <= 0)) {
var a = decodeURIComponent(t.substring(0, n).trim()), i = decodeURIComponent(t.substring(n + 1).trim()), o;
return e.length > 0 && (o = Ar(e.join(U))), { key: a, value: i, metadata: o };
}
}
}
}
function Wr(r) {
return typeof r != "string" || r.length === 0 ? {} : r.split(I).map(function(e) {
return w(e);
}).filter(function(e) {
return e !== void 0 && e.value.length > 0;
}).reduce(function(e, t) {
return e[t.key] = t.value, e;
}, {});
}
var Zr = (
/** @class */
(function() {
function r() {
}
return r.prototype.inject = function(e, t, n) {
var a = g.getBaggage(e);
if (!(!a || G(e))) {
var i = er(a).filter(function(_) {
return _.length <= Kr;
}).slice(0, Fr), o = rr(i);
o.length > 0 && n.set(t, m, o);
}
}, r.prototype.extract = function(e, t, n) {
var a = n.get(t, m), i = Array.isArray(a) ? a.join(I) : a;
if (!i)
return e;
var o = {};
if (i.length === 0)
return e;
var _ = i.split(I);
return _.forEach(function(E) {
var T = w(E);
if (T) {
var s = { value: T.value };
T.metadata && (s.metadata = T.metadata), o[T.key] = s;
}
}), Object.entries(o).length === 0 ? e : g.setBaggage(e, g.createBaggage(o));
}, r.prototype.fields = function() {
return [m];
}, r;
})()
), $r = (
/** @class */
(function() {
function r(e, t) {
this._monotonicClock = t, this._epochMillis = e.now(), this._performanceMillis = t.now();
}
return r.prototype.now = function() {
var e = this._monotonicClock.now() - this._performanceMillis;
return this._epochMillis + e;
}, r;
})()
), tr = function(r) {
var e = typeof Symbol == "function" && Symbol.iterator, t = e && r[e], n = 0;
if (t) return t.call(r);
if (r && typeof r.length == "number") return {
next: function() {
return r && n >= r.length && (r = void 0), { value: r && r[n++], done: !r };
}
};
throw new TypeError(e ? "Object is not iterable." : "Symbol.iterator is not defined.");
}, Jr = function(r, e) {
var t = typeof Symbol == "function" && r[Symbol.iterator];
if (!t) return r;
var n = t.call(r), a, i = [], o;
try {
for (; (e === void 0 || e-- > 0) && !(a = n.next()).done; ) i.push(a.value);
} catch (_) {
o = { error: _ };
} finally {
try {
a && !a.done && (t = n.return) && t.call(n);
} finally {
if (o) throw o.error;
}
}
return i;
};
function Qr(r) {
var e, t, n = {};
if (typeof r != "object" || r == null)
return n;
try {
for (var a = tr(Object.entries(r)), i = a.next(); !i.done; i = a.next()) {
var o = Jr(i.value, 2), _ = o[0], E = o[1];
if (!nr(_)) {
c.warn("Invalid attribute key: " + _);
continue;
}
if (!ar(E)) {
c.warn("Invalid attribute value set for key: " + _);
continue;
}
Array.isArray(E) ? n[_] = E.slice() : n[_] = E;
}
} catch (T) {
e = { error: T };
} finally {
try {
i && !i.done && (t = a.return) && t.call(a);
} finally {
if (e) throw e.error;
}
}
return n;
}
function nr(r) {
return typeof r == "string" && r.length > 0;
}
function ar(r) {
return r == null ? !0 : Array.isArray(r) ? qr(r) : ir(r);
}
function qr(r) {
var e, t, n;
try {
for (var a = tr(r), i = a.next(); !i.done; i = a.next()) {
var o = i.value;
if (o != null) {
if (!n) {
if (ir(o)) {
n = typeof o;
continue;
}
return !1;
}
if (typeof o !== n)
return !1;
}
}
} catch (_) {
e = { error: _ };
} finally {
try {
i && !i.done && (t = a.return) && t.call(a);
} finally {
if (e) throw e.error;
}
}
return !0;
}
function ir(r) {
switch (typeof r) {
case "number":
case "boolean":
case "string":
return !0;
}
return !1;
}
function or() {
return function(r) {
c.error(kr(r));
};
}
function kr(r) {
return typeof r == "string" ? r : JSON.stringify(re(r));
}
function re(r) {
for (var e = {}, t = r; t !== null; )
Object.getOwnPropertyNames(t).forEach(function(n) {
if (!e[n]) {
var a = t[n];
a && (e[n] = String(a));
}
}), t = Object.getPrototypeOf(t);
return e;
}
var _r = or();
function ee(r) {
_r = r;
}
function Er(r) {
try {
_r(r);
} catch {
}
}
var v;
(function(r) {
r.AlwaysOff = "always_off", r.AlwaysOn = "always_on", r.ParentBasedAlwaysOff = "parentbased_always_off", r.ParentBasedAlwaysOn = "parentbased_always_on", r.ParentBasedTraceIdRatio = "parentbased_traceidratio", r.TraceIdRatio = "traceidratio";
})(v || (v = {}));
var te = ",", ne = ["OTEL_SDK_DISABLED"];
function ae(r) {
return ne.indexOf(r) > -1;
}
var ie = [
"OTEL_BSP_EXPORT_TIMEOUT",
"OTEL_BSP_MAX_EXPORT_BATCH_SIZE",
"OTEL_BSP_MAX_QUEUE_SIZE",
"OTEL_BSP_SCHEDULE_DELAY",
"OTEL_BLRP_EXPORT_TIMEOUT",
"OTEL_BLRP_MAX_EXPORT_BATCH_SIZE",
"OTEL_BLRP_MAX_QUEUE_SIZE",
"OTEL_BLRP_SCHEDULE_DELAY",
"OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT",
"OTEL_ATTRIBUTE_COUNT_LIMIT",
"OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT",
"OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT",
"OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT",
"OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT",
"OTEL_SPAN_EVENT_COUNT_LIMIT",
"OTEL_SPAN_LINK_COUNT_LIMIT",
"OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT",
"OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT",
"OTEL_EXPORTER_OTLP_TIMEOUT",
"OTEL_EXPORTER_OTLP_TRACES_TIMEOUT",
"OTEL_EXPORTER_OTLP_METRICS_TIMEOUT",
"OTEL_EXPORTER_OTLP_LOGS_TIMEOUT",
"OTEL_EXPORTER_JAEGER_AGENT_PORT"
];
function oe(r) {
return ie.indexOf(r) > -1;
}
var _e = [
"OTEL_NO_PATCH_MODULES",
"OTEL_PROPAGATORS",
"OTEL_SEMCONV_STABILITY_OPT_IN"
];
function Ee(r) {
return _e.indexOf(r) > -1;
}
var p = 1 / 0, d = 128, Tr = 128, ur = 128, V = {
OTEL_SDK_DISABLED: !1,
CONTAINER_NAME: "",
ECS_CONTAINER_METADATA_URI_V4: "",
ECS_CONTAINER_METADATA_URI: "",
HOSTNAME: "",
KUBERNETES_SERVICE_HOST: "",
NAMESPACE: "",
OTEL_BSP_EXPORT_TIMEOUT: 3e4,
OTEL_BSP_MAX_EXPORT_BATCH_SIZE: 512,
OTEL_BSP_MAX_QUEUE_SIZE: 2048,
OTEL_BSP_SCHEDULE_DELAY: 5e3,
OTEL_BLRP_EXPORT_TIMEOUT: 3e4,
OTEL_BLRP_MAX_EXPORT_BATCH_SIZE: 512,
OTEL_BLRP_MAX_QUEUE_SIZE: 2048,
OTEL_BLRP_SCHEDULE_DELAY: 5e3,
OTEL_EXPORTER_JAEGER_AGENT_HOST: "",
OTEL_EXPORTER_JAEGER_AGENT_PORT: 6832,
OTEL_EXPORTER_JAEGER_ENDPOINT: "",
OTEL_EXPORTER_JAEGER_PASSWORD: "",
OTEL_EXPORTER_JAEGER_USER: "",
OTEL_EXPORTER_OTLP_ENDPOINT: "",
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: "",
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT: "",
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT: "",
OTEL_EXPORTER_OTLP_HEADERS: "",
OTEL_EXPORTER_OTLP_TRACES_HEADERS: "",
OTEL_EXPORTER_OTLP_METRICS_HEADERS: "",
OTEL_EXPORTER_OTLP_LOGS_HEADERS: "",
OTEL_EXPORTER_OTLP_TIMEOUT: 1e4,
OTEL_EXPORTER_OTLP_TRACES_TIMEOUT: 1e4,
OTEL_EXPORTER_OTLP_METRICS_TIMEOUT: 1e4,
OTEL_EXPORTER_OTLP_LOGS_TIMEOUT: 1e4,
OTEL_EXPORTER_ZIPKIN_ENDPOINT: "http://localhost:9411/api/v2/spans",
OTEL_LOG_LEVEL: u.INFO,
OTEL_NO_PATCH_MODULES: [],
OTEL_PROPAGATORS: ["tracecontext", "baggage"],
OTEL_RESOURCE_ATTRIBUTES: "",
OTEL_SERVICE_NAME: "",
OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT: p,
OTEL_ATTRIBUTE_COUNT_LIMIT: d,
OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT: p,
OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT: d,
OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT: p,
OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT: d,
OTEL_SPAN_EVENT_COUNT_LIMIT: 128,
OTEL_SPAN_LINK_COUNT_LIMIT: 128,
OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT: Tr,
OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT: ur,
OTEL_TRACES_EXPORTER: "",
OTEL_TRACES_SAMPLER: v.ParentBasedAlwaysOn,
OTEL_TRACES_SAMPLER_ARG: "",
OTEL_LOGS_EXPORTER: "",
OTEL_EXPORTER_OTLP_INSECURE: "",
OTEL_EXPORTER_OTLP_TRACES_INSECURE: "",
OTEL_EXPORTER_OTLP_METRICS_INSECURE: "",
OTEL_EXPORTER_OTLP_LOGS_INSECURE: "",
OTEL_EXPORTER_OTLP_CERTIFICATE: "",
OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE: "",
OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE: "",
OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE: "",
OTEL_EXPORTER_OTLP_COMPRESSION: "",
OTEL_EXPORTER_OTLP_TRACES_COMPRESSION: "",
OTEL_EXPORTER_OTLP_METRICS_COMPRESSION: "",
OTEL_EXPORTER_OTLP_LOGS_COMPRESSION: "",
OTEL_EXPORTER_OTLP_CLIENT_KEY: "",
OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY: "",
OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY: "",
OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY: "",
OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE: "",
OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE: "",
OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE: "",
OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE: "",
OTEL_EXPORTER_OTLP_PROTOCOL: "http/protobuf",
OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: "http/protobuf",
OTEL_EXPORTER_OTLP_METRICS_PROTOCOL: "http/protobuf",
OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: "http/protobuf",
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE: "cumulative",
OTEL_SEMCONV_STABILITY_OPT_IN: []
};
function Te(r, e, t) {
if (!(typeof t[r] > "u")) {
var n = String(t[r]);
e[r] = n.toLowerCase() === "true";
}
}
function ue(r, e, t, n, a) {
if (n === void 0 && (n = -1 / 0), a === void 0 && (a = 1 / 0), typeof t[r] < "u") {
var i = Number(t[r]);
isNaN(i) || (i < n ? e[r] = n : i > a ? e[r] = a : e[r] = i);
}
}
function fe(r, e, t, n) {
n === void 0 && (n = te);
var a = t[r];
typeof a == "string" && (e[r] = a.split(n).map(function(i) {
return i.trim();
}));
}
var se = {
ALL: u.ALL,
VERBOSE: u.VERBOSE,
DEBUG: u.DEBUG,
INFO: u.INFO,
WARN: u.WARN,
ERROR: u.ERROR,
NONE: u.NONE
};
function le(r, e, t) {
var n = t[r];
if (typeof n == "string") {
var a = se[n.toUpperCase()];
a != null && (e[r] = a);
}
}
function j(r) {
var e = {};
for (var t in V) {
var n = t;
switch (n) {
case "OTEL_LOG_LEVEL":
le(n, e, r);
break;
default:
if (ae(n))
Te(n, e, r);
else if (oe(n))
ue(n, e, r);
else if (Ee(n))
fe(n, e, r);
else {
var a = r[n];
typeof a < "u" && a !== null && (e[n] = String(a));
}
}
}
return e;
}
function Oe() {
var r = j(X);
return Object.assign({}, V, r);
}
function ce() {
return j(X);
}
var Re = function(r, e) {
var t = typeof Symbol == "function" && r[Symbol.iterator];
if (!t) return r;
var n = t.call(r), a, i = [], o;
try {
for (; (e === void 0 || e-- > 0) && !(a = n.next()).done; ) i.push(a.value);
} catch (_) {
o = { error: _ };
} finally {
try {
a && !a.done && (t = n.return) && t.call(n);
} finally {
if (o) throw o.error;
}
}
return i;
}, pe = function(r, e, t) {
if (t || arguments.length === 2) for (var n = 0, a = e.length, i; n < a; n++)
(i || !(n in e)) && (i || (i = Array.prototype.slice.call(e, 0, n)), i[n] = e[n]);
return r.concat(i || Array.prototype.slice.call(e));
};
function de(r) {
return btoa(String.fromCharCode.apply(String, pe([], Re(q(r)), !1)));
}
var Le = 8, Ae = 16, Pe = (
/** @class */
/* @__PURE__ */ (function() {
function r() {
this.generateTraceId = Y(Ae), this.generateSpanId = Y(Le);
}
return r;
})()
), R = Array(32);
function Y(r) {
return function() {
for (var t = 0; t < r * 2; t++)
R[t] = Math.floor(Math.random() * 16) + 48, R[t] >= 58 && (R[t] += 39);
return String.fromCharCode.apply(null, R.slice(0, r * 2));
};
}
function Se(r) {
}
var Ie = function(r) {
var e = typeof Symbol == "function" && Symbol.iterator, t = e && r[e], n = 0;
if (t) return t.call(r);
if (r && typeof r.length == "number") return {
next: function() {
return r && n >= r.length && (r = void 0), { value: r && r[n++], done: !r };
}
};
throw new TypeError(e ? "Object is not iterable." : "Symbol.iterator is not defined.");
}, ve = (
/** @class */
(function() {
function r(e) {
e === void 0 && (e = {});
var t;
this._propagators = (t = e.propagators) !== null && t !== void 0 ? t : [], this._fields = Array.from(new Set(this._propagators.map(function(n) {
return typeof n.fields == "function" ? n.fields() : [];
}).reduce(function(n, a) {
return n.concat(a);
}, [])));
}
return r.prototype.inject = function(e, t, n) {
var a, i;
try {
for (var o = Ie(this._propagators), _ = o.next(); !_.done; _ = o.next()) {
var E = _.value;
try {
E.inject(e, t, n);
} catch (T) {
c.warn("Failed to inject with " + E.constructor.name + ". Err: " + T.message);
}
}
} catch (T) {
a = { error: T };
} finally {
try {
_ && !_.done && (i = o.return) && i.call(o);
} finally {
if (a) throw a.error;
}
}
}, r.prototype.extract = function(e, t, n) {
return this._propagators.reduce(function(a, i) {
try {
return i.extract(a, t, n);
} catch (o) {
c.warn("Failed to extract with " + i.constructor.name + ". Err: " + o.message);
}
return a;
}, e);
}, r.prototype.fields = function() {
return this._fields.slice();
}, r;
})()
), B = "[_0-9a-z-*/]", ye = "[a-z]" + B + "{0,255}", he = "[a-z0-9]" + B + "{0,240}@[a-z]" + B + "{0,13}", ge = new RegExp("^(?:" + ye + "|" + he + ")$"), me = /^[ -~]{0,255}[!-~]$/, Ce = /,|=/;
function Ne(r) {
return ge.test(r);
}
function Me(r) {
return me.test(r) && !Ce.test(r);
}
var z = 32, Ue = 512, W = ",", Z = "=", fr = (
/** @class */
(function() {
function r(e) {
this._internalState = /* @__PURE__ */ new Map(), e && this._parse(e);
}
return r.prototype.set = function(e, t) {
var n = this._clone();
return n._internalState.has(e) && n._internalState.delete(e), n._internalState.set(e, t), n;
}, r.prototype.unset = function(e) {
var t = this._clone();
return t._internalState.delete(e), t;
}, r.prototype.get = function(e) {
return this._internalState.get(e);
}, r.prototype.serialize = function() {
var e = this;
return this._keys().reduce(function(t, n) {
return t.push(n + Z + e.get(n)), t;
}, []).join(W);
}, r.prototype._parse = function(e) {
e.length > Ue || (this._internalState = e.split(W).reverse().reduce(function(t, n) {
var a = n.trim(), i = a.indexOf(Z);
if (i !== -1) {
var o = a.slice(0, i), _ = a.slice(i + 1, n.length);
Ne(o) && Me(_) && t.set(o, _);
}
return t;
}, /* @__PURE__ */ new Map()), this._internalState.size > z && (this._internalState = new Map(Array.from(this._internalState.entries()).reverse().slice(0, z))));
}, r.prototype._keys = function() {
return Array.from(this._internalState.keys()).reverse();
}, r.prototype._clone = function() {
var e = new r();
return e._internalState = new Map(this._internalState), e;
}, r;
})()
), L = "traceparent", A = "tracestate", Be = "00", be = "(?!ff)[\\da-f]{2}", De = "(?![0]{32})[\\da-f]{32}", Xe = "(?![0]{16})[\\da-f]{16}", Ge = "[\\da-f]{2}", we = new RegExp("^\\s?(" + be + ")-(" + De + ")-(" + Xe + ")-(" + Ge + ")(-.*)?\\s?$");
function sr(r) {
var e = we.exec(r);
return !e || e[1] === "00" && e[5] ? null : {
traceId: e[2],
spanId: e[3],
traceFlags: parseInt(e[4], 16)
};
}
var Ve = (
/** @class */
(function() {
function r() {
}
return r.prototype.inject = function(e, t, n) {
var a = N.getSpanContext(e);
if (!(!a || G(e) || !k(a))) {
var i = Be + "-" + a.traceId + "-" + a.spanId + "-0" + Number(a.traceFlags || M.NONE).toString(16);
n.set(t, L, i), a.traceState && n.set(t, A, a.traceState.serialize());
}
}, r.prototype.extract = function(e, t, n) {
var a = n.get(t, L);
if (!a)
return e;
var i = Array.isArray(a) ? a[0] : a;
if (typeof i != "string")
return e;
var o = sr(i);
if (!o)
return e;
o.isRemote = !0;
var _ = n.get(t, A);
if (_) {
var E = Array.isArray(_) ? _.join(",") : _;
o.traceState = new fr(typeof E == "string" ? E : void 0);
}
return N.setSpanContext(e, o);
}, r.prototype.fields = function() {
return [L, A];
}, r;
})()
), H = wr("OpenTelemetry SDK Context Key RPC_METADATA"), b;
(function(r) {
r.HTTP = "http";
})(b || (b = {}));
function je(r, e) {
return r.setValue(H, e);
}
function He(r) {
return r.deleteValue(H);
}
function xe(r) {
return r.getValue(H);
}
var D = (
/** @class */
(function() {
function r() {
}
return r.prototype.shouldSample = function() {
return {
decision: l.NOT_RECORD
};
}, r.prototype.toString = function() {
return "AlwaysOffSampler";
}, r;
})()
), P = (
/** @class */
(function() {
function r() {
}
return r.prototype.shouldSample = function() {
return {
decision: l.RECORD_AND_SAMPLED
};
}, r.prototype.toString = function() {
return "AlwaysOnSampler";
}, r;
})()
), Fe = (
/** @class */
(function() {
function r(e) {
var t, n, a, i;
this._root = e.root, this._root || (Er(new Error("ParentBasedSampler must have a root sampler configured")), this._root = new P()), this._remoteParentSampled = (t = e.remoteParentSampled) !== null && t !== void 0 ? t : new P(), this._remoteParentNotSampled = (n = e.remoteParentNotSampled) !== null && n !== void 0 ? n : new D(), this._localParentSampled = (a = e.localParentSampled) !== null && a !== void 0 ? a : new P(), this._localParentNotSampled = (i = e.localParentNotSampled) !== null && i !== void 0 ? i : new D();
}
return r.prototype.shouldSample = function(e, t, n, a, i, o) {
var _ = N.getSpanContext(e);
return !_ || !k(_) ? this._root.shouldSample(e, t, n, a, i, o) : _.isRemote ? _.traceFlags & M.SAMPLED ? this._remoteParentSampled.shouldSample(e, t, n, a, i, o) : this._remoteParentNotSampled.shouldSample(e, t, n, a, i, o) : _.traceFlags & M.SAMPLED ? this._localParentSampled.shouldSample(e, t, n, a, i, o) : this._localParentNotSampled.shouldSample(e, t, n, a, i, o);
}, r.prototype.toString = function() {
return "ParentBased{root=" + this._root.toString() + ", remoteParentSampled=" + this._remoteParentSampled.toString() + ", remoteParentNotSampled=" + this._remoteParentNotSampled.toString() + ", localParentSampled=" + this._localParentSampled.toString() + ", localParentNotSampled=" + this._localParentNotSampled.toString() + "}";
}, r;
})()
), Ke = (
/** @class */
(function() {
function r(e) {
e === void 0 && (e = 0), this._ratio = e, this._ratio = this._normalize(e), this._upperBound = Math.floor(this._ratio * 4294967295);
}
return r.prototype.shouldSample = function(e, t) {
return {
decision: Vr(t) && this._accumulate(t) < this._upperBound ? l.RECORD_AND_SAMPLED : l.NOT_RECORD
};
}, r.prototype.toString = function() {
return "TraceIdRatioBased{" + this._ratio + "}";
}, r.prototype._normalize = function(e) {
return typeof e != "number" || isNaN(e) ? 0 : e >= 1 ? 1 : e <= 0 ? 0 : e;
}, r.prototype._accumulate = function(e) {
for (var t = 0, n = 0; n < e.length / 8; n++) {
var a = n * 8, i = parseInt(e.slice(a, a + 8), 16);
t = (t ^ i) >>> 0;
}
return t;
}, r;
})()
), Ye = "[object Object]", ze = "[object Null]", We = "[object Undefined]", Ze = Function.prototype, lr = Ze.toString, $e = lr.call(Object), Je = Qe(Object.getPrototypeOf, Object), Or = Object.prototype, cr = Or.hasOwnProperty, f = Symbol ? Symbol.toStringTag : void 0, Rr = Or.toString;
function Qe(r, e) {
return function(t) {
return r(e(t));
};
}
function $(r) {
if (!qe(r) || ke(r) !== Ye)
return !1;
var e = Je(r);
if (e === null)
return !0;
var t = cr.call(e, "constructor") && e.constructor;
return typeof t == "function" && t instanceof t && lr.call(t) === $e;
}
function qe(r) {
return r != null && typeof r == "object";
}
function ke(r) {
return r == null ? r === void 0 ? We : ze : f && f in Object(r) ? rt(r) : et(r);
}
function rt(r) {
var e = cr.call(r, f), t = r[f], n = !1;
try {
r[f] = void 0, n = !0;
} catch {
}
var a = Rr.call(r);
return n && (e ? r[f] = t : delete r[f]), a;
}
function et(r) {
return Rr.call(r);
}
var tt = 20;
function nt() {
for (var r = [], e = 0; e < arguments.length; e++)
r[e] = arguments[e];
for (var t = r.shift(), n = /* @__PURE__ */ new WeakMap(); r.length > 0; )
t = pr(t, r.shift(), 0, n);
return t;
}
function C(r) {
return y(r) ? r.slice() : r;
}
function pr(r, e, t, n) {
t === void 0 && (t = 0);
var a;
if (!(t > tt)) {
if (t++, S(r) || S(e) || dr(e))
a = C(e);
else if (y(r)) {
if (a = r.slice(), y(e))
for (var i = 0, o = e.length; i < o; i++)
a.push(C(e[i]));
else if (O(e))
for (var _ = Object.keys(e), i = 0, o = _.length; i < o; i++) {
var E = _[i];
a[E] = C(e[E]);
}
} else if (O(r))
if (O(e)) {
if (!at(r, e))
return e;
a = Object.assign({}, r);
for (var _ = Object.keys(e), i = 0, o = _.length; i < o; i++) {
var E = _[i], T = e[E];
if (S(T))
typeof T > "u" ? delete a[E] : a[E] = T;
else {
var s = a[E], h = T;
if (J(r, E, n) || J(e, E, n))
delete a[E];
else {
if (O(s) && O(h)) {
var x = n.get(s) || [], F = n.get(h) || [];
x.push({ obj: r, key: E }), F.push({ obj: e, key: E }), n.set(s, x), n.set(h, F);
}
a[E] = pr(a[E], T, t, n);
}
}
}
} else
a = e;
return a;
}
}
function J(r, e, t) {
for (var n = t.get(r[e]) || [], a = 0, i = n.length; a < i; a++) {
var o = n[a];
if (o.key === e && o.obj === r)
return !0;
}
return !1;
}
function y(r) {
return Array.isArray(r);
}
function dr(r) {
return typeof r == "function";
}
function O(r) {
return !S(r) && !y(r) && !dr(r) && typeof r == "object";
}
function S(r) {
return typeof r == "string" || typeof r == "number" || typeof r == "boolean" || typeof r > "u" || r instanceof Date || r instanceof RegExp || r === null;
}
function at(r, e) {
return !(!$(r) || !$(e));
}
var it = /* @__PURE__ */ (function() {
var r = function(e, t) {
return r = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(n, a) {
n.__proto__ = a;
} || function(n, a) {
for (var i in a) Object.prototype.hasOwnProperty.call(a, i) && (n[i] = a[i]);
}, r(e, t);
};
return function(e, t) {
if (typeof t != "function" && t !== null)
throw new TypeError("Class extends value " + String(t) + " is not a constructor or null");
r(e, t);
function n() {
this.constructor = e;
}
e.prototype = t === null ? Object.create(t) : (n.prototype = t.prototype, new n());
};
})(), Lr = (
/** @class */
(function(r) {
it(e, r);
function e(t) {
var n = r.call(this, t) || this;
return Object.setPrototypeOf(n, e.prototype), n;
}
return e;
})(Error)
);
function ot(r, e) {
var t, n = new Promise(function(i, o) {
t = setTimeout(function() {
o(new Lr("Operation timed out."));
}, e);
});
return Promise.race([r, n]).then(function(a) {
return clearTimeout(t), a;
}, function(a) {
throw clearTimeout(t), a;
});
}
function _t(r) {
return typeof r == "function" && typeof r.__original == "function" && typeof r.__unwrap == "function" && r.__wrapped === !0;
}
var Et = (
/** @class */
(function() {
function r() {
var e = this;
this._promise = new Promise(function(t, n) {
e._resolve = t, e._reject = n;
});
}
return Object.defineProperty(r.prototype, "promise", {
get: function() {
return this._promise;
},
enumerable: !1,
configurable: !0
}), r.prototype.resolve = function(e) {
this._resolve(e);
}, r.prototype.reject = function(e) {
this._reject(e);
}, r;
})()
), Tt = function(r, e) {
var t = typeof Symbol == "function" && r[Symbol.iterator];
if (!t) return r;
var n = t.call(r), a, i = [], o;
try {
for (; (e === void 0 || e-- > 0) && !(a = n.next()).done; ) i.push(a.value);
} catch (_) {
o = { error: _ };
} finally {
try {
a && !a.done && (t = n.return) && t.call(n);
} finally {
if (o) throw o.error;
}
}
return i;
}, ut = function(r, e, t) {
if (t || arguments.length === 2) for (var n = 0, a = e.length, i; n < a; n++)
(i || !(n in e)) && (i || (i = Array.prototype.slice.call(e, 0, n)), i[n] = e[n]);
return r.concat(i || Array.prototype.slice.call(e));
}, ft = (
/** @class */
(function() {
function r(e, t) {
this._callback = e, this._that = t, this._isCalled = !1, this._deferred = new Et();
}
return Object.defineProperty(r.prototype, "isCalled", {
get: function() {
return this._isCalled;
},
enumerable: !1,
configurable: !0
}), Object.defineProperty(r.prototype, "promise", {
get: function() {
return this._deferred.promise;
},
enumerable: !1,
configurable: !0
}), r.prototype.call = function() {
for (var e, t = this, n = [], a = 0; a < arguments.length; a++)
n[a] = arguments[a];
if (!this._isCalled) {
this._isCalled = !0;
try {
Promise.resolve((e = this._callback).call.apply(e, ut([this._that], Tt(n), !1))).then(function(i) {
return t._deferred.resolve(i);
}, function(i) {
return t._deferred.reject(i);
});
} catch (i) {
this._deferred.reject(i);
}
}
return this._deferred.promise;
}, r;
})()
);
function st(r, e) {
return new Promise(function(t) {
K.with(Q(K.active()), function() {
r.export(e, function(n) {
t(n);
});
});
});
}
var lt = {
getKeyPairs: er,
serializeKeyPairs: rr,
parseKeyPairsIntoRecord: Wr,
parsePairKeyValue: w
}, Ot = {
_export: st
};
const Pt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
AlwaysOffSampler: D,
AlwaysOnSampler: P,
AnchoredClock: $r,
BindOnceFuture: ft,
CompositePropagator: ve,
DEFAULT_ATTRIBUTE_COUNT_LIMIT: d,
DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT: p,
DEFAULT_ENVIRONMENT: V,
DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT: Tr,
DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT: ur,
get ExportResultCode() {
return Gr;
},
ParentBasedSampler: Fe,
get RPCType() {
return b;
},
RandomIdGenerator: Pe,
SDK_INFO: jr,
TRACE_PARENT_HEADER: L,
TRACE_STATE_HEADER: A,
TimeoutError: Lr,
TraceIdRatioBasedSampler: Ke,
TraceState: fr,
get TracesSamplerValues() {
return v;
},
VERSION: Hr,
W3CBaggagePropagator: Zr,
W3CTraceContextPropagator: Ve,
_globalThis: X,
addHrTimes: Pr,
baggageUtils: lt,
callWithTimeout: ot,
deleteRPCMetadata: He,
getEnv: Oe,
getEnvWithoutDefaults: ce,
getRPCMetadata: xe,
getTimeOrigin: Sr,
globalErrorHandler: Er,
hexToBase64: de,
hexToBinary: q,
hrTime: Ir,
hrTimeDuration: vr,
hrTimeToMicroseconds: yr,
hrTimeToMilliseconds: hr,
hrTimeToNanoseconds: gr,
hrTimeToTimeStamp: mr,
internal: Ot,
isAttributeKey: nr,
isAttributeValue: ar,
isTimeInput: Cr,
isTimeInputHrTime: Nr,
isTracingSuppressed: G,
isUrlIgnored: Mr,
isWrapped: _t,
loggingErrorHandler: or,
merge: nt,
millisToHrTime: Ur,
otperformance: Br,
parseEnvironment: j,
parseTraceParent: sr,
sanitizeAttributes: Qr,
setGlobalErrorHandler: ee,
setRPCMetadata: je,
suppressTracing: Q,
timeInputToHrTime: br,
unrefTimer: Se,
unsuppressTracing: Xr,
urlMatches: Dr
}, Symbol.toStringTag, { value: "Module" }));
export {
ft as B,
ve as C,
d as D,
l as S,
v as T,
Ve as W,
Oe as a,
ce as b,
p as c,
Zr as d,
Ot as e,
Pt as f,
Er as g,
ar as i,
nt as m,
Qr as s,
Se as u
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgtIX57MDBtfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHogYXMgYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nLCBwIGFzIHByb3BhZ2F0aW9uLCBfIGFzIF9nbG9iYWxUaGlzLCBzIGFzIGFkZEhyVGltZXMsIGwgYXMgZ2V0VGltZU9yaWdpbiwgaiBhcyBoclRpbWUsIHEgYXMgaHJUaW1lRHVyYXRpb24sIHkgYXMgaHJUaW1lVG9NaWNyb3NlY29uZHMsIGRLIGFzIGhyVGltZVRvTWlsbGlzZWNvbmRzLCBoIGFzIGhyVGltZVRvTmFub3NlY29uZHMsIGRMIGFzIGhyVGltZVRvVGltZVN0YW1wLCBuIGFzIGlzVGltZUlucHV0LCByIGFzIGlzVGltZUlucHV0SHJUaW1lLCBpIGFzIGlzVXJsSWdub3JlZCwgbSBhcyBtaWxsaXNUb0hyVGltZSwgbyBhcyBvdHBlcmZvcm1hbmNlLCB0IGFzIHRpbWVJbnB1dFRvSHJUaW1lLCB1IGFzIHVybE1hdGNoZXMgfSBmcm9tICcuL3VybC0hfnswMGR9fi5qcyc7XG5pbXBvcnQgeyBpIGFzIGlzVHJhY2luZ1N1cHByZXNzZWQsIHMgYXMgc3VwcHJlc3NUcmFjaW5nLCB1IGFzIHVuc3VwcHJlc3NUcmFjaW5nIH0gZnJvbSAnLi9zdXBwcmVzcy10cmFjaW5nLSF+ezAwYX1+LmpzJztcbmltcG9ydCB7IGQgYXMgZGlhZyB9IGZyb20gJy4vZGlhZy1hcGktIX57MDA4fX4uanMnO1xuaW1wb3J0IHsgaCBhcyBoZXhUb0JpbmFyeSwgRSBhcyBFeHBvcnRSZXN1bHRDb2RlIH0gZnJvbSAnLi9FeHBvcnRSZXN1bHQtIX57MDBpfX4uanMnO1xuaW1wb3J0IHsgZiBhcyBEaWFnTG9nTGV2ZWwsIHQgYXMgdHJhY2UsIGkgYXMgaXNTcGFuQ29udGV4dFZhbGlkLCBUIGFzIFRyYWNlRmxhZ3MsIGMgYXMgY3JlYXRlQ29udGV4dEtleSwgYiBhcyBpc1ZhbGlkVHJhY2VJZCwgYSBhcyBjb250ZXh0IH0gZnJvbSAnLi9pbmRleC0hfnswMDl9fi5qcyc7XG5pbXBvcnQgeyBhIGFzIFNES19JTkZPLCBibSBhcyBWRVJTSU9OJDEgfSBmcm9tICcuL3Nkay1pbmZvLSF+ezAwaH1+LmpzJztcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBvbmUgZGVjbGFyZWQgaW4gQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2UgaW5zdGVhZC5cbiAqIEEgc2FtcGxpbmcgZGVjaXNpb24gdGhhdCBkZXRlcm1pbmVzIGhvdyBhIHtAbGluayBTcGFufSB3aWxsIGJlIHJlY29yZGVkXG4gKiBhbmQgY29sbGVjdGVkLlxuICovXG52YXIgU2FtcGxpbmdEZWNpc2lvbjtcbihmdW5jdGlvbiAoU2FtcGxpbmdEZWNpc2lvbikge1xuICAgIC8qKlxuICAgICAqIGBTcGFuLmlzUmVjb3JkaW5nKCkgPT09IGZhbHNlYCwgc3BhbiB3aWxsIG5vdCBiZSByZWNvcmRlZCBhbmQgYWxsIGV2ZW50c1xuICAgICAqIGFuZCBhdHRyaWJ1dGVzIHdpbGwgYmUgZHJvcHBlZC5cbiAgICAgKi9cbiAgICBTYW1wbGluZ0RlY2lzaW9uW1NhbXBsaW5nRGVjaXNpb25bXCJOT1RfUkVDT1JEXCJdID0gMF0gPSBcIk5PVF9SRUNPUkRcIjtcbiAgICAvKipcbiAgICAgKiBgU3Bhbi5pc1JlY29yZGluZygpID09PSB0cnVlYCwgYnV0IGBTYW1wbGVkYCBmbGFnIGluIHtAbGluayBUcmFjZUZsYWdzfVxuICAgICAqIE1VU1QgTk9UIGJlIHNldC5cbiAgICAgKi9cbiAgICBTYW1wbGluZ0RlY2lzaW9uW1NhbXBsaW5nRGVjaXNpb25bXCJSRUNPUkRcIl0gPSAxXSA9IFwiUkVDT1JEXCI7XG4gICAgLyoqXG4gICAgICogYFNwYW4uaXNSZWNvcmRpbmcoKSA9PT0gdHJ1ZWAgQU5EIGBTYW1wbGVkYCBmbGFnIGluIHtAbGluayBUcmFjZUZsYWdzfVxuICAgICAqIE1VU1QgYmUgc2V0LlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIlJFQ09SRF9BTkRfU0FNUExFRFwiXSA9IDJdID0gXCJSRUNPUkRfQU5EX1NBTVBMRURcIjtcbn0pKFNhbXBsaW5nRGVjaXNpb24gfHwgKFNhbXBsaW5nRGVjaXNpb24gPSB7fSkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIEJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SID0gJz0nO1xudmFyIEJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IgPSAnOyc7XG52YXIgQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IgPSAnLCc7XG4vLyBOYW1lIG9mIHRoZSBodHRwIGhlYWRlciB1c2VkIHRvIHByb3BhZ2F0ZSB0aGUgYmFnZ2FnZVxudmFyIEJBR0dBR0VfSEVBREVSID0gJ2JhZ2dhZ2UnO1xuLy8gTWF4aW11bSBudW1iZXIgb2YgbmFtZS12YWx1ZSBwYWlycyBhbGxvd2VkIGJ5IHczYyBzcGVjXG52YXIgQkFHR0FHRV9NQVhfTkFNRV9WQUxVRV9QQUlSUyA9IDE4MDtcbi8vIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHBlciBhIHNpbmdsZSBuYW1lLXZhbHVlIHBhaXIgYWxsb3dlZCBieSB3M2Mgc3BlY1xudmFyIEJBR0dBR0VfTUFYX1BFUl9OQU1FX1ZBTFVFX1BBSVJTID0gNDA5Njtcbi8vIE1heGltdW0gdG90YWwgbGVuZ3RoIG9mIGFsbCBuYW1lLXZhbHVlIHBhaXJzIGFsbG93ZWQgYnkgdzNjIHNwZWNcbnZhciBCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEggPSA4MTkyO1xuXG52YXIgX19yZWFkJDMgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG5mdW5jdGlvbiBzZXJpYWxpemVLZXlQYWlycyhrZXlQYWlycykge1xuICAgIHJldHVybiBrZXlQYWlycy5yZWR1Y2UoZnVuY3Rpb24gKGhWYWx1ZSwgY3VycmVudCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBcIlwiICsgaFZhbHVlICsgKGhWYWx1ZSAhPT0gJycgPyBCQUdHQUdFX0lURU1TX1NFUEFSQVRPUiA6ICcnKSArIGN1cnJlbnQ7XG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEggPyBoVmFsdWUgOiB2YWx1ZTtcbiAgICB9LCAnJyk7XG59XG5mdW5jdGlvbiBnZXRLZXlQYWlycyhiYWdnYWdlKSB7XG4gICAgcmV0dXJuIGJhZ2dhZ2UuZ2V0QWxsRW50cmllcygpLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIF9iID0gX19yZWFkJDMoX2EsIDIpLCBrZXkgPSBfYlswXSwgdmFsdWUgPSBfYlsxXTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZS52YWx1ZSk7XG4gICAgICAgIC8vIGluY2x1ZGUgb3BhcXVlIG1ldGFkYXRhIGlmIHByb3ZpZGVkXG4gICAgICAgIC8vIE5PVEU6IHdlIGludGVudGlvbmFsbHkgZG9uJ3QgVVJJLWVuY29kZSB0aGUgbWV0YWRhdGEgLSB0aGF0IHJlc3BvbnNpYmlsaXR5IGZhbGxzIG9uIHRoZSBtZXRhZGF0YSBpbXBsZW1lbnRhdGlvblxuICAgICAgICBpZiAodmFsdWUubWV0YWRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZW50cnkgKz0gQkFHR0FHRV9QUk9QRVJUSUVTX1NFUEFSQVRPUiArIHZhbHVlLm1ldGFkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcGFyc2VQYWlyS2V5VmFsdWUoZW50cnkpIHtcbiAgICB2YXIgdmFsdWVQcm9wcyA9IGVudHJ5LnNwbGl0KEJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IpO1xuICAgIGlmICh2YWx1ZVByb3BzLmxlbmd0aCA8PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgdmFyIGtleVBhaXJQYXJ0ID0gdmFsdWVQcm9wcy5zaGlmdCgpO1xuICAgIGlmICgha2V5UGFpclBhcnQpXG4gICAgICAgIHJldHVybjtcbiAgICB2YXIgc2VwYXJhdG9ySW5kZXggPSBrZXlQYWlyUGFydC5pbmRleE9mKEJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SKTtcbiAgICBpZiAoc2VwYXJhdG9ySW5kZXggPD0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgIHZhciBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5UGFpclBhcnQuc3Vic3RyaW5nKDAsIHNlcGFyYXRvckluZGV4KS50cmltKCkpO1xuICAgIHZhciB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXlQYWlyUGFydC5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXggKyAxKS50cmltKCkpO1xuICAgIHZhciBtZXRhZGF0YTtcbiAgICBpZiAodmFsdWVQcm9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1ldGFkYXRhID0gYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nKHZhbHVlUHJvcHMuam9pbihCQUdHQUdFX1BST1BFUlRJRVNfU0VQQVJBVE9SKSk7XG4gICAgfVxuICAgIHJldHVybiB7IGtleToga2V5LCB2YWx1ZTogdmFsdWUsIG1ldGFkYXRhOiBtZXRhZGF0YSB9O1xufVxuLyoqXG4gKiBQYXJzZSBhIHN0cmluZyBzZXJpYWxpemVkIGluIHRoZSBiYWdnYWdlIEhUVFAgRm9ybWF0ICh3aXRob3V0IG1ldGFkYXRhKTpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS93M2MvYmFnZ2FnZS9ibG9iL21hc3Rlci9iYWdnYWdlL0hUVFBfSEVBREVSX0ZPUk1BVC5tZFxuICovXG5mdW5jdGlvbiBwYXJzZUtleVBhaXJzSW50b1JlY29yZCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAuc3BsaXQoQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiBwYXJzZVBhaXJLZXlWYWx1ZShlbnRyeSk7XG4gICAgfSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoa2V5UGFpcikgeyByZXR1cm4ga2V5UGFpciAhPT0gdW5kZWZpbmVkICYmIGtleVBhaXIudmFsdWUubGVuZ3RoID4gMDsgfSlcbiAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoaGVhZGVycywga2V5UGFpcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBoZWFkZXJzW2tleVBhaXIua2V5XSA9IGtleVBhaXIudmFsdWU7XG4gICAgICAgIHJldHVybiBoZWFkZXJzO1xuICAgIH0sIHt9KTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUHJvcGFnYXRlcyB7QGxpbmsgQmFnZ2FnZX0gdGhyb3VnaCBDb250ZXh0IGZvcm1hdCBwcm9wYWdhdGlvbi5cbiAqXG4gKiBCYXNlZCBvbiB0aGUgQmFnZ2FnZSBzcGVjaWZpY2F0aW9uOlxuICogaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2JhZ2dhZ2UvXG4gKi9cbnZhciBXM0NCYWdnYWdlUHJvcGFnYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBXM0NCYWdnYWdlUHJvcGFnYXRvcigpIHtcbiAgICB9XG4gICAgVzNDQmFnZ2FnZVByb3BhZ2F0b3IucHJvdG90eXBlLmluamVjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBzZXR0ZXIpIHtcbiAgICAgICAgdmFyIGJhZ2dhZ2UgPSBwcm9wYWdhdGlvbi5nZXRCYWdnYWdlKGNvbnRleHQpO1xuICAgICAgICBpZiAoIWJhZ2dhZ2UgfHwgaXNUcmFjaW5nU3VwcHJlc3NlZChjb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGtleVBhaXJzID0gZ2V0S2V5UGFpcnMoYmFnZ2FnZSlcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHBhaXIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYWlyLmxlbmd0aCA8PSBCQUdHQUdFX01BWF9QRVJfTkFNRV9WQUxVRV9QQUlSUztcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5zbGljZSgwLCBCQUdHQUdFX01BWF9OQU1FX1ZBTFVFX1BBSVJTKTtcbiAgICAgICAgdmFyIGhlYWRlclZhbHVlID0gc2VyaWFsaXplS2V5UGFpcnMoa2V5UGFpcnMpO1xuICAgICAgICBpZiAoaGVhZGVyVmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2V0dGVyLnNldChjYXJyaWVyLCBCQUdHQUdFX0hFQURFUiwgaGVhZGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBXM0NCYWdnYWdlUHJvcGFnYXRvci5wcm90b3R5cGUuZXh0cmFjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBnZXR0ZXIpIHtcbiAgICAgICAgdmFyIGhlYWRlclZhbHVlID0gZ2V0dGVyLmdldChjYXJyaWVyLCBCQUdHQUdFX0hFQURFUik7XG4gICAgICAgIHZhciBiYWdnYWdlU3RyaW5nID0gQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSlcbiAgICAgICAgICAgID8gaGVhZGVyVmFsdWUuam9pbihCQUdHQUdFX0lURU1TX1NFUEFSQVRPUilcbiAgICAgICAgICAgIDogaGVhZGVyVmFsdWU7XG4gICAgICAgIGlmICghYmFnZ2FnZVN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB2YXIgYmFnZ2FnZSA9IHt9O1xuICAgICAgICBpZiAoYmFnZ2FnZVN0cmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYWlycyA9IGJhZ2dhZ2VTdHJpbmcuc3BsaXQoQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IpO1xuICAgICAgICBwYWlycy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgdmFyIGtleVBhaXIgPSBwYXJzZVBhaXJLZXlWYWx1ZShlbnRyeSk7XG4gICAgICAgICAgICBpZiAoa2V5UGFpcikge1xuICAgICAgICAgICAgICAgIHZhciBiYWdnYWdlRW50cnkgPSB7IHZhbHVlOiBrZXlQYWlyLnZhbHVlIH07XG4gICAgICAgICAgICAgICAgaWYgKGtleVBhaXIubWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFnZ2FnZUVudHJ5Lm1ldGFkYXRhID0ga2V5UGFpci5tZXRhZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmFnZ2FnZVtrZXlQYWlyLmtleV0gPSBiYWdnYWdlRW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoT2JqZWN0LmVudHJpZXMoYmFnZ2FnZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGFnYXRpb24uc2V0QmFnZ2FnZShjb250ZXh0LCBwcm9wYWdhdGlvbi5jcmVhdGVCYWdnYWdlKGJhZ2dhZ2UpKTtcbiAgICB9O1xuICAgIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yLnByb3RvdHlwZS5maWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBbQkFHR0FHRV9IRUFERVJdO1xuICAgIH07XG4gICAgcmV0dXJuIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSB1dGlsaXR5IGZvciByZXR1cm5pbmcgd2FsbCB0aW1lcyBhbmNob3JlZCB0byBhIGdpdmVuIHBvaW50IGluIHRpbWUuIFdhbGwgdGltZSBtZWFzdXJlbWVudHMgd2lsbFxuICogbm90IGJlIHRha2VuIGZyb20gdGhlIHN5c3RlbSwgYnV0IGluc3RlYWQgYXJlIGNvbXB1dGVkIGJ5IGFkZGluZyBhIG1vbm90b25pYyBjbG9jayB0aW1lXG4gKiB0byB0aGUgYW5jaG9yIHBvaW50LlxuICpcbiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHN5c3RlbSB0aW1lIGNhbiBjaGFuZ2UgYW5kIHJlc3VsdCBpbiB1bmV4cGVjdGVkIHNpdHVhdGlvbnMgbGlrZVxuICogc3BhbnMgZW5kaW5nIGJlZm9yZSB0aGV5IGFyZSBzdGFydGVkLiBDcmVhdGluZyBhbiBhbmNob3JlZCBjbG9jayBmb3IgZWFjaCBsb2NhbCByb290IHNwYW5cbiAqIGVuc3VyZXMgdGhhdCBzcGFuIHRpbWluZ3MgYW5kIGR1cmF0aW9ucyBhcmUgYWNjdXJhdGUgd2hpbGUgcHJldmVudGluZyBzcGFuIHRpbWVzIGZyb20gZHJpZnRpbmdcbiAqIHRvbyBmYXIgZnJvbSB0aGUgc3lzdGVtIGNsb2NrLlxuICpcbiAqIE9ubHkgY3JlYXRpbmcgYW4gYW5jaG9yZWQgY2xvY2sgb25jZSBwZXIgbG9jYWwgdHJhY2UgZW5zdXJlcyBzcGFuIHRpbWVzIGFyZSBjb3JyZWN0IHJlbGF0aXZlXG4gKiB0byBlYWNoIG90aGVyLiBGb3IgZXhhbXBsZSwgYSBjaGlsZCBzcGFuIHdpbGwgbmV2ZXIgaGF2ZSBhIHN0YXJ0IHRpbWUgYmVmb3JlIGl0cyBwYXJlbnQgZXZlblxuICogaWYgdGhlIHN5c3RlbSBjbG9jayBpcyBjb3JyZWN0ZWQgZHVyaW5nIHRoZSBsb2NhbCB0cmFjZS5cbiAqXG4gKiBIZWF2aWx5IGluc3BpcmVkIGJ5IHRoZSBPVGVsIEphdmEgYW5jaG9yZWQgY2xvY2tcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LWphdmEvYmxvYi9tYWluL3Nkay90cmFjZS9zcmMvbWFpbi9qYXZhL2lvL29wZW50ZWxlbWV0cnkvc2RrL3RyYWNlL0FuY2hvcmVkQ2xvY2suamF2YVxuICovXG52YXIgQW5jaG9yZWRDbG9jayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgQW5jaG9yZWRDbG9jayBhbmNob3JlZCB0byB0aGUgY3VycmVudCB0aW1lIHJldHVybmVkIGJ5IHN5c3RlbUNsb2NrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN5c3RlbUNsb2NrIHNob3VsZCBiZSBhIGNsb2NrIHRoYXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEgMTk3MCBzdWNoIGFzIERhdGVcbiAgICAgKiBAcGFyYW0gbW9ub3RvbmljQ2xvY2sgc2hvdWxkIGJlIGEgY2xvY2sgdGhhdCBjb3VudHMgbWlsbGlzZWNvbmRzIG1vbm90b25pY2FsbHkgc3VjaCBhcyB3aW5kb3cucGVyZm9ybWFuY2Ugb3IgcGVyZl9ob29rcy5wZXJmb3JtYW5jZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEFuY2hvcmVkQ2xvY2soc3lzdGVtQ2xvY2ssIG1vbm90b25pY0Nsb2NrKSB7XG4gICAgICAgIHRoaXMuX21vbm90b25pY0Nsb2NrID0gbW9ub3RvbmljQ2xvY2s7XG4gICAgICAgIHRoaXMuX2Vwb2NoTWlsbGlzID0gc3lzdGVtQ2xvY2subm93KCk7XG4gICAgICAgIHRoaXMuX3BlcmZvcm1hbmNlTWlsbGlzID0gbW9ub3RvbmljQ2xvY2subm93KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBieSBhZGRpbmcgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlXG4gICAgICogQW5jaG9yZWRDbG9jayB3YXMgY3JlYXRlZCB0byB0aGUgY3JlYXRpb24gZXBvY2ggdGltZVxuICAgICAqL1xuICAgIEFuY2hvcmVkQ2xvY2sucHJvdG90eXBlLm5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRlbHRhID0gdGhpcy5fbW9ub3RvbmljQ2xvY2subm93KCkgLSB0aGlzLl9wZXJmb3JtYW5jZU1pbGxpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vwb2NoTWlsbGlzICsgZGVsdGE7XG4gICAgfTtcbiAgICByZXR1cm4gQW5jaG9yZWRDbG9jaztcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX192YWx1ZXMkMSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fdmFsdWVzKSB8fCBmdW5jdGlvbihvKSB7XG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn07XG52YXIgX19yZWFkJDIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG5mdW5jdGlvbiBzYW5pdGl6ZUF0dHJpYnV0ZXMoYXR0cmlidXRlcykge1xuICAgIHZhciBlXzEsIF9hO1xuICAgIHZhciBvdXQgPSB7fTtcbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMgIT09ICdvYmplY3QnIHx8IGF0dHJpYnV0ZXMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzJDEoT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgX2QgPSBfX3JlYWQkMihfYy52YWx1ZSwgMiksIGtleSA9IF9kWzBdLCB2YWwgPSBfZFsxXTtcbiAgICAgICAgICAgIGlmICghaXNBdHRyaWJ1dGVLZXkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGRpYWcud2FybihcIkludmFsaWQgYXR0cmlidXRlIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0F0dHJpYnV0ZVZhbHVlKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBkaWFnLndhcm4oXCJJbnZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgZm9yIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgICAgIG91dFtrZXldID0gdmFsLnNsaWNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIGlzQXR0cmlidXRlS2V5KGtleSkge1xuICAgIHJldHVybiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkubGVuZ3RoID4gMDtcbn1cbmZ1bmN0aW9uIGlzQXR0cmlidXRlVmFsdWUodmFsKSB7XG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiBpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheSh2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZFByaW1pdGl2ZUF0dHJpYnV0ZVZhbHVlKHZhbCk7XG59XG5mdW5jdGlvbiBpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheShhcnIpIHtcbiAgICB2YXIgZV8yLCBfYTtcbiAgICB2YXIgdHlwZTtcbiAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBhcnJfMSA9IF9fdmFsdWVzJDEoYXJyKSwgYXJyXzFfMSA9IGFycl8xLm5leHQoKTsgIWFycl8xXzEuZG9uZTsgYXJyXzFfMSA9IGFycl8xLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBhcnJfMV8xLnZhbHVlO1xuICAgICAgICAgICAgLy8gbnVsbC91bmRlZmluZWQgZWxlbWVudHMgYXJlIGFsbG93ZWRcbiAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFByaW1pdGl2ZUF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlb2YgZWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVuY291bnRlcmVkIGFuIGludmFsaWQgcHJpbWl0aXZlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhcnJfMV8xICYmICFhcnJfMV8xLmRvbmUgJiYgKF9hID0gYXJyXzEucmV0dXJuKSkgX2EuY2FsbChhcnJfMSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRQcmltaXRpdmVBdHRyaWJ1dGVWYWx1ZSh2YWwpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBsb2dzIGFuIGVycm9yIHVzaW5nIHRoZSBwcm92aWRlZCBsb2dnZXIsIG9yIGFcbiAqIGNvbnNvbGUgbG9nZ2VyIGlmIG9uZSB3YXMgbm90IHByb3ZpZGVkLlxuICovXG5mdW5jdGlvbiBsb2dnaW5nRXJyb3JIYW5kbGVyKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXgpIHtcbiAgICAgICAgZGlhZy5lcnJvcihzdHJpbmdpZnlFeGNlcHRpb24oZXgpKTtcbiAgICB9O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBleGNlcHRpb24gaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvblxuICogQHBhcmFtIHtFeGNlcHRpb259IGV4XG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeUV4Y2VwdGlvbihleCkge1xuICAgIGlmICh0eXBlb2YgZXggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBleDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShmbGF0dGVuRXhjZXB0aW9uKGV4KSk7XG4gICAgfVxufVxuLyoqXG4gKiBGbGF0dGVucyBhbiBleGNlcHRpb24gaW50byBrZXktdmFsdWUgcGFpcnMgYnkgdHJhdmVyc2luZyB0aGUgcHJvdG90eXBlIGNoYWluXG4gKiBhbmQgY29lcmNpbmcgdmFsdWVzIHRvIHN0cmluZ3MuIER1cGxpY2F0ZSBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIG92ZXJ3cml0dGVuO1xuICogdGhlIGZpcnN0IGluc2VydCB3aW5zLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuRXhjZXB0aW9uKGV4KSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBjdXJyZW50ID0gZXg7XG4gICAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3VycmVudCkuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0W3Byb3BlcnR5TmFtZV0pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gY3VycmVudFtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BlcnR5TmFtZV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBUaGUgZ2xvYmFsIGVycm9yIGhhbmRsZXIgZGVsZWdhdGUgKi9cbnZhciBkZWxlZ2F0ZUhhbmRsZXIgPSBsb2dnaW5nRXJyb3JIYW5kbGVyKCk7XG4vKipcbiAqIFNldCB0aGUgZ2xvYmFsIGVycm9yIGhhbmRsZXJcbiAqIEBwYXJhbSB7RXJyb3JIYW5kbGVyfSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIHNldEdsb2JhbEVycm9ySGFuZGxlcihoYW5kbGVyKSB7XG4gICAgZGVsZWdhdGVIYW5kbGVyID0gaGFuZGxlcjtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBnbG9iYWwgZXJyb3IgaGFuZGxlclxuICogQHBhcmFtIHtFeGNlcHRpb259IGV4XG4gKi9cbmZ1bmN0aW9uIGdsb2JhbEVycm9ySGFuZGxlcihleCkge1xuICAgIHRyeSB7XG4gICAgICAgIGRlbGVnYXRlSGFuZGxlcihleCk7XG4gICAgfVxuICAgIGNhdGNoIChfYSkgeyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBUcmFjZXNTYW1wbGVyVmFsdWVzO1xuKGZ1bmN0aW9uIChUcmFjZXNTYW1wbGVyVmFsdWVzKSB7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIkFsd2F5c09mZlwiXSA9IFwiYWx3YXlzX29mZlwiO1xuICAgIFRyYWNlc1NhbXBsZXJWYWx1ZXNbXCJBbHdheXNPblwiXSA9IFwiYWx3YXlzX29uXCI7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIlBhcmVudEJhc2VkQWx3YXlzT2ZmXCJdID0gXCJwYXJlbnRiYXNlZF9hbHdheXNfb2ZmXCI7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIlBhcmVudEJhc2VkQWx3YXlzT25cIl0gPSBcInBhcmVudGJhc2VkX2Fsd2F5c19vblwiO1xuICAgIFRyYWNlc1NhbXBsZXJWYWx1ZXNbXCJQYXJlbnRCYXNlZFRyYWNlSWRSYXRpb1wiXSA9IFwicGFyZW50YmFzZWRfdHJhY2VpZHJhdGlvXCI7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIlRyYWNlSWRSYXRpb1wiXSA9IFwidHJhY2VpZHJhdGlvXCI7XG59KShUcmFjZXNTYW1wbGVyVmFsdWVzIHx8IChUcmFjZXNTYW1wbGVyVmFsdWVzID0ge30pKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBERUZBVUxUX0xJU1RfU0VQQVJBVE9SID0gJywnO1xuLyoqXG4gKiBFbnZpcm9ubWVudCBpbnRlcmZhY2UgdG8gZGVmaW5lIGFsbCBuYW1lc1xuICovXG52YXIgRU5WSVJPTk1FTlRfQk9PTEVBTl9LRVlTID0gWydPVEVMX1NES19ESVNBQkxFRCddO1xuZnVuY3Rpb24gaXNFbnZWYXJBQm9vbGVhbihrZXkpIHtcbiAgICByZXR1cm4gKEVOVklST05NRU5UX0JPT0xFQU5fS0VZUy5pbmRleE9mKGtleSkgPiAtMSk7XG59XG52YXIgRU5WSVJPTk1FTlRfTlVNQkVSU19LRVlTID0gW1xuICAgICdPVEVMX0JTUF9FWFBPUlRfVElNRU9VVCcsXG4gICAgJ09URUxfQlNQX01BWF9FWFBPUlRfQkFUQ0hfU0laRScsXG4gICAgJ09URUxfQlNQX01BWF9RVUVVRV9TSVpFJyxcbiAgICAnT1RFTF9CU1BfU0NIRURVTEVfREVMQVknLFxuICAgICdPVEVMX0JMUlBfRVhQT1JUX1RJTUVPVVQnLFxuICAgICdPVEVMX0JMUlBfTUFYX0VYUE9SVF9CQVRDSF9TSVpFJyxcbiAgICAnT1RFTF9CTFJQX01BWF9RVUVVRV9TSVpFJyxcbiAgICAnT1RFTF9CTFJQX1NDSEVEVUxFX0RFTEFZJyxcbiAgICAnT1RFTF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUJyxcbiAgICAnT1RFTF9BVFRSSUJVVEVfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCcsXG4gICAgJ09URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX0xPR1JFQ09SRF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUJyxcbiAgICAnT1RFTF9MT0dSRUNPUkRfQVRUUklCVVRFX0NPVU5UX0xJTUlUJyxcbiAgICAnT1RFTF9TUEFOX0VWRU5UX0NPVU5UX0xJTUlUJyxcbiAgICAnT1RFTF9TUEFOX0xJTktfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVCcsXG4gICAgJ09URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX0VYUE9SVEVSX09UTFBfVElNRU9VVCcsXG4gICAgJ09URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfVElNRU9VVCcsXG4gICAgJ09URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX1RJTUVPVVQnLFxuICAgICdPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19USU1FT1VUJyxcbiAgICAnT1RFTF9FWFBPUlRFUl9KQUVHRVJfQUdFTlRfUE9SVCcsXG5dO1xuZnVuY3Rpb24gaXNFbnZWYXJBTnVtYmVyKGtleSkge1xuICAgIHJldHVybiAoRU5WSVJPTk1FTlRfTlVNQkVSU19LRVlTLmluZGV4T2Yoa2V5KSA+IC0xKTtcbn1cbnZhciBFTlZJUk9OTUVOVF9MSVNUU19LRVlTID0gW1xuICAgICdPVEVMX05PX1BBVENIX01PRFVMRVMnLFxuICAgICdPVEVMX1BST1BBR0FUT1JTJyxcbiAgICAnT1RFTF9TRU1DT05WX1NUQUJJTElUWV9PUFRfSU4nLFxuXTtcbmZ1bmN0aW9uIGlzRW52VmFyQUxpc3Qoa2V5KSB7XG4gICAgcmV0dXJuIEVOVklST05NRU5UX0xJU1RTX0tFWVMuaW5kZXhPZihrZXkpID4gLTE7XG59XG52YXIgREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUID0gSW5maW5pdHk7XG52YXIgREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQgPSAxMjg7XG52YXIgREVGQVVMVF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVQgPSAxMjg7XG52YXIgREVGQVVMVF9TUEFOX0FUVFJJQlVURV9QRVJfTElOS19DT1VOVF9MSU1JVCA9IDEyODtcbi8qKlxuICogRGVmYXVsdCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAqL1xudmFyIERFRkFVTFRfRU5WSVJPTk1FTlQgPSB7XG4gICAgT1RFTF9TREtfRElTQUJMRUQ6IGZhbHNlLFxuICAgIENPTlRBSU5FUl9OQU1FOiAnJyxcbiAgICBFQ1NfQ09OVEFJTkVSX01FVEFEQVRBX1VSSV9WNDogJycsXG4gICAgRUNTX0NPTlRBSU5FUl9NRVRBREFUQV9VUkk6ICcnLFxuICAgIEhPU1ROQU1FOiAnJyxcbiAgICBLVUJFUk5FVEVTX1NFUlZJQ0VfSE9TVDogJycsXG4gICAgTkFNRVNQQUNFOiAnJyxcbiAgICBPVEVMX0JTUF9FWFBPUlRfVElNRU9VVDogMzAwMDAsXG4gICAgT1RFTF9CU1BfTUFYX0VYUE9SVF9CQVRDSF9TSVpFOiA1MTIsXG4gICAgT1RFTF9CU1BfTUFYX1FVRVVFX1NJWkU6IDIwNDgsXG4gICAgT1RFTF9CU1BfU0NIRURVTEVfREVMQVk6IDUwMDAsXG4gICAgT1RFTF9CTFJQX0VYUE9SVF9USU1FT1VUOiAzMDAwMCxcbiAgICBPVEVMX0JMUlBfTUFYX0VYUE9SVF9CQVRDSF9TSVpFOiA1MTIsXG4gICAgT1RFTF9CTFJQX01BWF9RVUVVRV9TSVpFOiAyMDQ4LFxuICAgIE9URUxfQkxSUF9TQ0hFRFVMRV9ERUxBWTogNTAwMCxcbiAgICBPVEVMX0VYUE9SVEVSX0pBRUdFUl9BR0VOVF9IT1NUOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX0pBRUdFUl9BR0VOVF9QT1JUOiA2ODMyLFxuICAgIE9URUxfRVhQT1JURVJfSkFFR0VSX0VORFBPSU5UOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX0pBRUdFUl9QQVNTV09SRDogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9KQUVHRVJfVVNFUjogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0VORFBPSU5UOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19FTkRQT0lOVDogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0xPR1NfRU5EUE9JTlQ6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9IRUFERVJTOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0hFQURFUlM6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX0hFQURFUlM6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX0hFQURFUlM6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9USU1FT1VUOiAxMDAwMCxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX1RJTUVPVVQ6IDEwMDAwLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX1RJTUVPVVQ6IDEwMDAwLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX1RJTUVPVVQ6IDEwMDAwLFxuICAgIE9URUxfRVhQT1JURVJfWklQS0lOX0VORFBPSU5UOiAnaHR0cDovL2xvY2FsaG9zdDo5NDExL2FwaS92Mi9zcGFucycsXG4gICAgT1RFTF9MT0dfTEVWRUw6IERpYWdMb2dMZXZlbC5JTkZPLFxuICAgIE9URUxfTk9fUEFUQ0hfTU9EVUxFUzogW10sXG4gICAgT1RFTF9QUk9QQUdBVE9SUzogWyd0cmFjZWNvbnRleHQnLCAnYmFnZ2FnZSddLFxuICAgIE9URUxfUkVTT1VSQ0VfQVRUUklCVVRFUzogJycsXG4gICAgT1RFTF9TRVJWSUNFX05BTUU6ICcnLFxuICAgIE9URUxfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVDogREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULFxuICAgIE9URUxfQVRUUklCVVRFX0NPVU5UX0xJTUlUOiBERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxcbiAgICBPVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVDogREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULFxuICAgIE9URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQ6IERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULFxuICAgIE9URUxfTE9HUkVDT1JEX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQ6IERFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCxcbiAgICBPVEVMX0xPR1JFQ09SRF9BVFRSSUJVVEVfQ09VTlRfTElNSVQ6IERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULFxuICAgIE9URUxfU1BBTl9FVkVOVF9DT1VOVF9MSU1JVDogMTI4LFxuICAgIE9URUxfU1BBTl9MSU5LX0NPVU5UX0xJTUlUOiAxMjgsXG4gICAgT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVQ6IERFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0VWRU5UX0NPVU5UX0xJTUlULFxuICAgIE9URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQ6IERFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQsXG4gICAgT1RFTF9UUkFDRVNfRVhQT1JURVI6ICcnLFxuICAgIE9URUxfVFJBQ0VTX1NBTVBMRVI6IFRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRBbHdheXNPbixcbiAgICBPVEVMX1RSQUNFU19TQU1QTEVSX0FSRzogJycsXG4gICAgT1RFTF9MT0dTX0VYUE9SVEVSOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfSU5TRUNVUkU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfSU5TRUNVUkU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX0lOU0VDVVJFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19JTlNFQ1VSRTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19DRVJUSUZJQ0FURTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0xPR1NfQ0VSVElGSUNBVEU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9DT01QUkVTU0lPTjogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19DT01QUkVTU0lPTjogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfQ09NUFJFU1NJT046ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX0NPTVBSRVNTSU9OOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfQ0xJRU5UX0tFWTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19DTElFTlRfS0VZOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19DTElFTlRfS0VZOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19DTElFTlRfS0VZOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfQ0xJRU5UX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0NMSUVOVF9DRVJUSUZJQ0FURTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfQ0xJRU5UX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19DTElFTlRfQ0VSVElGSUNBVEU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9QUk9UT0NPTDogJ2h0dHAvcHJvdG9idWYnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfUFJPVE9DT0w6ICdodHRwL3Byb3RvYnVmJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19QUk9UT0NPTDogJ2h0dHAvcHJvdG9idWYnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX1BST1RPQ09MOiAnaHR0cC9wcm90b2J1ZicsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfVEVNUE9SQUxJVFlfUFJFRkVSRU5DRTogJ2N1bXVsYXRpdmUnLFxuICAgIE9URUxfU0VNQ09OVl9TVEFCSUxJVFlfT1BUX0lOOiBbXSxcbn07XG4vKipcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBlbnZpcm9ubWVudFxuICogQHBhcmFtIHZhbHVlc1xuICovXG5mdW5jdGlvbiBwYXJzZUJvb2xlYW4oa2V5LCBlbnZpcm9ubWVudCwgdmFsdWVzKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZXNba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdmFsdWUgPSBTdHJpbmcodmFsdWVzW2tleV0pO1xuICAgIC8vIHN1cHBvcnQgY2FzZS1pbnNlbnNpdGl2ZSBcInRydWVcIlxuICAgIGVudmlyb25tZW50W2tleV0gPSB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4vKipcbiAqIFBhcnNlcyBhIHZhcmlhYmxlIGFzIG51bWJlciB3aXRoIG51bWJlciB2YWxpZGF0aW9uXG4gKiBAcGFyYW0gbmFtZVxuICogQHBhcmFtIGVudmlyb25tZW50XG4gKiBAcGFyYW0gdmFsdWVzXG4gKiBAcGFyYW0gbWluXG4gKiBAcGFyYW0gbWF4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKG5hbWUsIGVudmlyb25tZW50LCB2YWx1ZXMsIG1pbiwgbWF4KSB7XG4gICAgaWYgKG1pbiA9PT0gdm9pZCAwKSB7IG1pbiA9IC1JbmZpbml0eTsgfVxuICAgIGlmIChtYXggPT09IHZvaWQgMCkgeyBtYXggPSBJbmZpbml0eTsgfVxuICAgIGlmICh0eXBlb2YgdmFsdWVzW25hbWVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgdmFsdWUgPSBOdW1iZXIodmFsdWVzW25hbWVdKTtcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IG1pbikge1xuICAgICAgICAgICAgICAgIGVudmlyb25tZW50W25hbWVdID0gbWluO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBtYXgpIHtcbiAgICAgICAgICAgICAgICBlbnZpcm9ubWVudFtuYW1lXSA9IG1heDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVudmlyb25tZW50W25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFBhcnNlcyBsaXN0LWxpa2Ugc3RyaW5ncyBmcm9tIGlucHV0IGludG8gb3V0cHV0LlxuICogQHBhcmFtIG5hbWVcbiAqIEBwYXJhbSBlbnZpcm9ubWVudFxuICogQHBhcmFtIHZhbHVlc1xuICogQHBhcmFtIHNlcGFyYXRvclxuICovXG5mdW5jdGlvbiBwYXJzZVN0cmluZ0xpc3QobmFtZSwgb3V0cHV0LCBpbnB1dCwgc2VwYXJhdG9yKSB7XG4gICAgaWYgKHNlcGFyYXRvciA9PT0gdm9pZCAwKSB7IHNlcGFyYXRvciA9IERFRkFVTFRfTElTVF9TRVBBUkFUT1I7IH1cbiAgICB2YXIgZ2l2ZW5WYWx1ZSA9IGlucHV0W25hbWVdO1xuICAgIGlmICh0eXBlb2YgZ2l2ZW5WYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb3V0cHV0W25hbWVdID0gZ2l2ZW5WYWx1ZS5zcGxpdChzZXBhcmF0b3IpLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdi50cmltKCk7IH0pO1xuICAgIH1cbn1cbi8vIFRoZSBzdXBwb3J0IHN0cmluZyAtPiBEaWFnTG9nTGV2ZWwgbWFwcGluZ3NcbnZhciBsb2dMZXZlbE1hcCA9IHtcbiAgICBBTEw6IERpYWdMb2dMZXZlbC5BTEwsXG4gICAgVkVSQk9TRTogRGlhZ0xvZ0xldmVsLlZFUkJPU0UsXG4gICAgREVCVUc6IERpYWdMb2dMZXZlbC5ERUJVRyxcbiAgICBJTkZPOiBEaWFnTG9nTGV2ZWwuSU5GTyxcbiAgICBXQVJOOiBEaWFnTG9nTGV2ZWwuV0FSTixcbiAgICBFUlJPUjogRGlhZ0xvZ0xldmVsLkVSUk9SLFxuICAgIE5PTkU6IERpYWdMb2dMZXZlbC5OT05FLFxufTtcbi8qKlxuICogRW52aXJvbm1lbnRhbGx5IHNldHMgbG9nIGxldmVsIGlmIHZhbGlkIGxvZyBsZXZlbCBzdHJpbmcgaXMgcHJvdmlkZWRcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBlbnZpcm9ubWVudFxuICogQHBhcmFtIHZhbHVlc1xuICovXG5mdW5jdGlvbiBzZXRMb2dMZXZlbEZyb21FbnYoa2V5LCBlbnZpcm9ubWVudCwgdmFsdWVzKSB7XG4gICAgdmFyIHZhbHVlID0gdmFsdWVzW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIHRoZUxldmVsID0gbG9nTGV2ZWxNYXBbdmFsdWUudG9VcHBlckNhc2UoKV07XG4gICAgICAgIGlmICh0aGVMZXZlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICBlbnZpcm9ubWVudFtrZXldID0gdGhlTGV2ZWw7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFBhcnNlcyBlbnZpcm9ubWVudCB2YWx1ZXNcbiAqIEBwYXJhbSB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VFbnZpcm9ubWVudCh2YWx1ZXMpIHtcbiAgICB2YXIgZW52aXJvbm1lbnQgPSB7fTtcbiAgICBmb3IgKHZhciBlbnYgaW4gREVGQVVMVF9FTlZJUk9OTUVOVCkge1xuICAgICAgICB2YXIga2V5ID0gZW52O1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnT1RFTF9MT0dfTEVWRUwnOlxuICAgICAgICAgICAgICAgIHNldExvZ0xldmVsRnJvbUVudihrZXksIGVudmlyb25tZW50LCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAoaXNFbnZWYXJBQm9vbGVhbihrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlQm9vbGVhbihrZXksIGVudmlyb25tZW50LCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0VudlZhckFOdW1iZXIoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZU51bWJlcihrZXksIGVudmlyb25tZW50LCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0VudlZhckFMaXN0KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VTdHJpbmdMaXN0KGtleSwgZW52aXJvbm1lbnQsIHZhbHVlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50W2tleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnZpcm9ubWVudDtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogR2V0cyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gKi9cbmZ1bmN0aW9uIGdldEVudigpIHtcbiAgICB2YXIgZ2xvYmFsRW52ID0gcGFyc2VFbnZpcm9ubWVudChfZ2xvYmFsVGhpcyk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfRU5WSVJPTk1FTlQsIGdsb2JhbEVudik7XG59XG5mdW5jdGlvbiBnZXRFbnZXaXRob3V0RGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIHBhcnNlRW52aXJvbm1lbnQoX2dsb2JhbFRoaXMpO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fcmVhZCQxID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19yZWFkKSB8fCBmdW5jdGlvbiAobywgbikge1xuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgICBpZiAoIW0pIHJldHVybiBvO1xuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICAgIHRyeSB7XG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gYXI7XG59O1xudmFyIF9fc3ByZWFkQXJyYXkkMSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuZnVuY3Rpb24gaGV4VG9CYXNlNjQoaGV4U3RyKSB7XG4gICAgcmV0dXJuIGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIF9fc3ByZWFkQXJyYXkkMShbXSwgX19yZWFkJDEoaGV4VG9CaW5hcnkoaGV4U3RyKSksIGZhbHNlKSkpO1xufVxuXG52YXIgU1BBTl9JRF9CWVRFUyA9IDg7XG52YXIgVFJBQ0VfSURfQllURVMgPSAxNjtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBvbmUgZGVmaW5lZCBpbiBAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZSBpbnN0ZWFkLlxuICovXG52YXIgUmFuZG9tSWRHZW5lcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmFuZG9tSWRHZW5lcmF0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIDE2LWJ5dGUgdHJhY2UgSUQgZm9ybWF0dGVkL2VuY29kZWQgYXMgYSAzMiBsb3dlcmNhc2UgaGV4XG4gICAgICAgICAqIGNoYXJhY3RlcnMgY29ycmVzcG9uZGluZyB0byAxMjggYml0cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVUcmFjZUlkID0gZ2V0SWRHZW5lcmF0b3IoVFJBQ0VfSURfQllURVMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHJhbmRvbSA4LWJ5dGUgc3BhbiBJRCBmb3JtYXR0ZWQvZW5jb2RlZCBhcyBhIDE2IGxvd2VyY2FzZSBoZXhcbiAgICAgICAgICogY2hhcmFjdGVycyBjb3JyZXNwb25kaW5nIHRvIDY0IGJpdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdlbmVyYXRlU3BhbklkID0gZ2V0SWRHZW5lcmF0b3IoU1BBTl9JRF9CWVRFUyk7XG4gICAgfVxuICAgIHJldHVybiBSYW5kb21JZEdlbmVyYXRvcjtcbn0oKSk7XG52YXIgU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVkgPSBBcnJheSgzMik7XG5mdW5jdGlvbiBnZXRJZEdlbmVyYXRvcihieXRlcykge1xuICAgIHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZUlkKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzICogMjsgaSsrKSB7XG4gICAgICAgICAgICBTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2KSArIDQ4O1xuICAgICAgICAgICAgLy8gdmFsaWQgaGV4IGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDQ4LTU3IGFuZCA5Ny0xMDJcbiAgICAgICAgICAgIGlmIChTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSA+PSA1OCkge1xuICAgICAgICAgICAgICAgIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZW2ldICs9IDM5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZLnNsaWNlKDAsIGJ5dGVzICogMikpO1xuICAgIH07XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5mdW5jdGlvbiB1bnJlZlRpbWVyKF90aW1lcikgeyB9XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX192YWx1ZXMgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3ZhbHVlcykgfHwgZnVuY3Rpb24obykge1xuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59O1xuLyoqIENvbWJpbmVzIG11bHRpcGxlIHByb3BhZ2F0b3JzIGludG8gYSBzaW5nbGUgcHJvcGFnYXRvci4gKi9cbnZhciBDb21wb3NpdGVQcm9wYWdhdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIGNvbXBvc2l0ZSBwcm9wYWdhdG9yIGZyb20gYSBsaXN0IG9mIHByb3BhZ2F0b3JzLlxuICAgICAqXG4gICAgICogQHBhcmFtIFtjb25maWddIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBjb21wb3NpdGUgcHJvcGFnYXRvclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIENvbXBvc2l0ZVByb3BhZ2F0b3IoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuX3Byb3BhZ2F0b3JzID0gKF9hID0gY29uZmlnLnByb3BhZ2F0b3JzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgdGhpcy5fZmllbGRzID0gQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMuX3Byb3BhZ2F0b3JzXG4gICAgICAgICAgICAvLyBvbGRlciBwcm9wYWdhdG9ycyBtYXkgbm90IGhhdmUgZmllbGRzIGZ1bmN0aW9uLCBudWxsIGNoZWNrIHRvIGJlIHN1cmVcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHApIHsgcmV0dXJuICh0eXBlb2YgcC5maWVsZHMgPT09ICdmdW5jdGlvbicgPyBwLmZpZWxkcygpIDogW10pOyB9KVxuICAgICAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoeCwgeSkgeyByZXR1cm4geC5jb25jYXQoeSk7IH0sIFtdKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gZWFjaCBvZiB0aGUgY29uZmlndXJlZCBwcm9wYWdhdG9ycyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBjYXJyaWVyLlxuICAgICAqIFByb3BhZ2F0b3JzIGFyZSBydW4gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGNvbmZpZ3VyZWQsIHNvIGlmIG11bHRpcGxlXG4gICAgICogcHJvcGFnYXRvcnMgd3JpdGUgdGhlIHNhbWUgY2FycmllciBrZXksIHRoZSBwcm9wYWdhdG9yIGxhdGVyIGluIHRoZSBsaXN0XG4gICAgICogd2lsbCBcIndpblwiLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBpbmplY3RcbiAgICAgKiBAcGFyYW0gY2FycmllciBDYXJyaWVyIGludG8gd2hpY2ggY29udGV4dCB3aWxsIGJlIGluamVjdGVkXG4gICAgICovXG4gICAgQ29tcG9zaXRlUHJvcGFnYXRvci5wcm90b3R5cGUuaW5qZWN0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGNhcnJpZXIsIHNldHRlcikge1xuICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXModGhpcy5fcHJvcGFnYXRvcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BhZ2F0b3IgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wYWdhdG9yLmluamVjdChjb250ZXh0LCBjYXJyaWVyLCBzZXR0ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpYWcud2FybihcIkZhaWxlZCB0byBpbmplY3Qgd2l0aCBcIiArIHByb3BhZ2F0b3IuY29uc3RydWN0b3IubmFtZSArIFwiLiBFcnI6IFwiICsgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSdW4gZWFjaCBvZiB0aGUgY29uZmlndXJlZCBwcm9wYWdhdG9ycyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBjYXJyaWVyLlxuICAgICAqIFByb3BhZ2F0b3JzIGFyZSBydW4gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGNvbmZpZ3VyZWQsIHNvIGlmIG11bHRpcGxlXG4gICAgICogcHJvcGFnYXRvcnMgd3JpdGUgdGhlIHNhbWUgY29udGV4dCBrZXksIHRoZSBwcm9wYWdhdG9yIGxhdGVyIGluIHRoZSBsaXN0XG4gICAgICogd2lsbCBcIndpblwiLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBhZGQgdmFsdWVzIHRvXG4gICAgICogQHBhcmFtIGNhcnJpZXIgQ2FycmllciBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgY29udGV4dFxuICAgICAqL1xuICAgIENvbXBvc2l0ZVByb3BhZ2F0b3IucHJvdG90eXBlLmV4dHJhY3QgPSBmdW5jdGlvbiAoY29udGV4dCwgY2FycmllciwgZ2V0dGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9wYWdhdG9ycy5yZWR1Y2UoZnVuY3Rpb24gKGN0eCwgcHJvcGFnYXRvcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRvci5leHRyYWN0KGN0eCwgY2FycmllciwgZ2V0dGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBkaWFnLndhcm4oXCJGYWlsZWQgdG8gZXh0cmFjdCB3aXRoIFwiICsgcHJvcGFnYXRvci5jb25zdHJ1Y3Rvci5uYW1lICsgXCIuIEVycjogXCIgKyBlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3R4O1xuICAgICAgICB9LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIENvbXBvc2l0ZVByb3BhZ2F0b3IucHJvdG90eXBlLmZpZWxkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gcmV0dXJuIGEgbmV3IGFycmF5IHNvIG91ciBmaWVsZHMgY2Fubm90IGJlIG1vZGlmaWVkXG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMuc2xpY2UoKTtcbiAgICB9O1xuICAgIHJldHVybiBDb21wb3NpdGVQcm9wYWdhdG9yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBWQUxJRF9LRVlfQ0hBUl9SQU5HRSA9ICdbXzAtOWEtei0qL10nO1xudmFyIFZBTElEX0tFWSA9IFwiW2Etel1cIiArIFZBTElEX0tFWV9DSEFSX1JBTkdFICsgXCJ7MCwyNTV9XCI7XG52YXIgVkFMSURfVkVORE9SX0tFWSA9IFwiW2EtejAtOV1cIiArIFZBTElEX0tFWV9DSEFSX1JBTkdFICsgXCJ7MCwyNDB9QFthLXpdXCIgKyBWQUxJRF9LRVlfQ0hBUl9SQU5HRSArIFwiezAsMTN9XCI7XG52YXIgVkFMSURfS0VZX1JFR0VYID0gbmV3IFJlZ0V4cChcIl4oPzpcIiArIFZBTElEX0tFWSArIFwifFwiICsgVkFMSURfVkVORE9SX0tFWSArIFwiKSRcIik7XG52YXIgVkFMSURfVkFMVUVfQkFTRV9SRUdFWCA9IC9eWyAtfl17MCwyNTV9WyEtfl0kLztcbnZhciBJTlZBTElEX1ZBTFVFX0NPTU1BX0VRVUFMX1JFR0VYID0gLyx8PS87XG4vKipcbiAqIEtleSBpcyBvcGFxdWUgc3RyaW5nIHVwIHRvIDI1NiBjaGFyYWN0ZXJzIHByaW50YWJsZS4gSXQgTVVTVCBiZWdpbiB3aXRoIGFcbiAqIGxvd2VyY2FzZSBsZXR0ZXIsIGFuZCBjYW4gb25seSBjb250YWluIGxvd2VyY2FzZSBsZXR0ZXJzIGEteiwgZGlnaXRzIDAtOSxcbiAqIHVuZGVyc2NvcmVzIF8sIGRhc2hlcyAtLCBhc3Rlcmlza3MgKiwgYW5kIGZvcndhcmQgc2xhc2hlcyAvLlxuICogRm9yIG11bHRpLXRlbmFudCB2ZW5kb3Igc2NlbmFyaW9zLCBhbiBhdCBzaWduIChAKSBjYW4gYmUgdXNlZCB0byBwcmVmaXggdGhlXG4gKiB2ZW5kb3IgbmFtZS4gVmVuZG9ycyBTSE9VTEQgc2V0IHRoZSB0ZW5hbnQgSUQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUga2V5LlxuICogc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi90cmFjZS1jb250ZXh0LyNrZXlcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVLZXkoa2V5KSB7XG4gICAgcmV0dXJuIFZBTElEX0tFWV9SRUdFWC50ZXN0KGtleSk7XG59XG4vKipcbiAqIFZhbHVlIGlzIG9wYXF1ZSBzdHJpbmcgdXAgdG8gMjU2IGNoYXJhY3RlcnMgcHJpbnRhYmxlIEFTQ0lJIFJGQzAwMjBcbiAqIGNoYXJhY3RlcnMgKGkuZS4sIHRoZSByYW5nZSAweDIwIHRvIDB4N0UpIGV4Y2VwdCBjb21tYSAsIGFuZCA9LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIChWQUxJRF9WQUxVRV9CQVNFX1JFR0VYLnRlc3QodmFsdWUpICYmXG4gICAgICAgICFJTlZBTElEX1ZBTFVFX0NPTU1BX0VRVUFMX1JFR0VYLnRlc3QodmFsdWUpKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBNQVhfVFJBQ0VfU1RBVEVfSVRFTVMgPSAzMjtcbnZhciBNQVhfVFJBQ0VfU1RBVEVfTEVOID0gNTEyO1xudmFyIExJU1RfTUVNQkVSU19TRVBBUkFUT1IgPSAnLCc7XG52YXIgTElTVF9NRU1CRVJfS0VZX1ZBTFVFX1NQTElUVEVSID0gJz0nO1xuLyoqXG4gKiBUcmFjZVN0YXRlIG11c3QgYmUgYSBjbGFzcyBhbmQgbm90IGEgc2ltcGxlIG9iamVjdCB0eXBlIGJlY2F1c2Ugb2YgdGhlIHNwZWNcbiAqIHJlcXVpcmVtZW50IChodHRwczovL3d3dy53My5vcmcvVFIvdHJhY2UtY29udGV4dC8jdHJhY2VzdGF0ZS1maWVsZCkuXG4gKlxuICogSGVyZSBpcyB0aGUgbGlzdCBvZiBhbGxvd2VkIG11dGF0aW9uczpcbiAqIC0gTmV3IGtleS12YWx1ZSBwYWlyIHNob3VsZCBiZSBhZGRlZCBpbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RcbiAqIC0gVGhlIHZhbHVlIG9mIGFueSBrZXkgY2FuIGJlIHVwZGF0ZWQuIE1vZGlmaWVkIGtleXMgTVVTVCBiZSBtb3ZlZCB0byB0aGVcbiAqIGJlZ2lubmluZyBvZiB0aGUgbGlzdC5cbiAqL1xudmFyIFRyYWNlU3RhdGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJhY2VTdGF0ZShyYXdUcmFjZVN0YXRlKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFsU3RhdGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIGlmIChyYXdUcmFjZVN0YXRlKVxuICAgICAgICAgICAgdGhpcy5fcGFyc2UocmF3VHJhY2VTdGF0ZSk7XG4gICAgfVxuICAgIFRyYWNlU3RhdGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIC8vIFRPRE86IEJlbmNobWFyayB0aGUgZGlmZmVyZW50IGFwcHJvYWNoZXMobWFwIHZzIGxpc3QpIGFuZFxuICAgICAgICAvLyB1c2UgdGhlIGZhc3RlciBvbmUuXG4gICAgICAgIHZhciB0cmFjZVN0YXRlID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgaWYgKHRyYWNlU3RhdGUuX2ludGVybmFsU3RhdGUuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRyYWNlU3RhdGUuX2ludGVybmFsU3RhdGUuZGVsZXRlKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VTdGF0ZS5faW50ZXJuYWxTdGF0ZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0cmFjZVN0YXRlO1xuICAgIH07XG4gICAgVHJhY2VTdGF0ZS5wcm90b3R5cGUudW5zZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB0cmFjZVN0YXRlID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgdHJhY2VTdGF0ZS5faW50ZXJuYWxTdGF0ZS5kZWxldGUoa2V5KTtcbiAgICAgICAgcmV0dXJuIHRyYWNlU3RhdGU7XG4gICAgfTtcbiAgICBUcmFjZVN0YXRlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbFN0YXRlLmdldChrZXkpO1xuICAgIH07XG4gICAgVHJhY2VTdGF0ZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5cygpXG4gICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhZ2csIGtleSkge1xuICAgICAgICAgICAgYWdnLnB1c2goa2V5ICsgTElTVF9NRU1CRVJfS0VZX1ZBTFVFX1NQTElUVEVSICsgX3RoaXMuZ2V0KGtleSkpO1xuICAgICAgICAgICAgcmV0dXJuIGFnZztcbiAgICAgICAgfSwgW10pXG4gICAgICAgICAgICAuam9pbihMSVNUX01FTUJFUlNfU0VQQVJBVE9SKTtcbiAgICB9O1xuICAgIFRyYWNlU3RhdGUucHJvdG90eXBlLl9wYXJzZSA9IGZ1bmN0aW9uIChyYXdUcmFjZVN0YXRlKSB7XG4gICAgICAgIGlmIChyYXdUcmFjZVN0YXRlLmxlbmd0aCA+IE1BWF9UUkFDRV9TVEFURV9MRU4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX2ludGVybmFsU3RhdGUgPSByYXdUcmFjZVN0YXRlXG4gICAgICAgICAgICAuc3BsaXQoTElTVF9NRU1CRVJTX1NFUEFSQVRPUilcbiAgICAgICAgICAgIC5yZXZlcnNlKCkgLy8gU3RvcmUgaW4gcmV2ZXJzZSBzbyBuZXcga2V5cyAoLnNldCguLi4pKSB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgYmVnaW5uaW5nXG4gICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhZ2csIHBhcnQpIHtcbiAgICAgICAgICAgIHZhciBsaXN0TWVtYmVyID0gcGFydC50cmltKCk7IC8vIE9wdGlvbmFsIFdoaXRlc3BhY2UgKE9XUykgaGFuZGxpbmdcbiAgICAgICAgICAgIHZhciBpID0gbGlzdE1lbWJlci5pbmRleE9mKExJU1RfTUVNQkVSX0tFWV9WQUxVRV9TUExJVFRFUik7XG4gICAgICAgICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gbGlzdE1lbWJlci5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBsaXN0TWVtYmVyLnNsaWNlKGkgKyAxLCBwYXJ0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlS2V5KGtleSkgJiYgdmFsaWRhdGVWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWdnLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWdnO1xuICAgICAgICB9LCBuZXcgTWFwKCkpO1xuICAgICAgICAvLyBCZWNhdXNlIG9mIHRoZSByZXZlcnNlKCkgcmVxdWlyZW1lbnQsIHRydW5jIG11c3QgYmUgZG9uZSBhZnRlciBtYXAgaXMgY3JlYXRlZFxuICAgICAgICBpZiAodGhpcy5faW50ZXJuYWxTdGF0ZS5zaXplID4gTUFYX1RSQUNFX1NUQVRFX0lURU1TKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcm5hbFN0YXRlID0gbmV3IE1hcChBcnJheS5mcm9tKHRoaXMuX2ludGVybmFsU3RhdGUuZW50cmllcygpKVxuICAgICAgICAgICAgICAgIC5yZXZlcnNlKCkgLy8gVXNlIHJldmVyc2Ugc2FtZSBhcyBvcmlnaW5hbCB0cmFjZXN0YXRlIHBhcnNlIGNoYWluXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIE1BWF9UUkFDRV9TVEFURV9JVEVNUykpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUcmFjZVN0YXRlLnByb3RvdHlwZS5fa2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5faW50ZXJuYWxTdGF0ZS5rZXlzKCkpLnJldmVyc2UoKTtcbiAgICB9O1xuICAgIFRyYWNlU3RhdGUucHJvdG90eXBlLl9jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRyYWNlU3RhdGUgPSBuZXcgVHJhY2VTdGF0ZSgpO1xuICAgICAgICB0cmFjZVN0YXRlLl9pbnRlcm5hbFN0YXRlID0gbmV3IE1hcCh0aGlzLl9pbnRlcm5hbFN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRyYWNlU3RhdGU7XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VTdGF0ZTtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgVFJBQ0VfUEFSRU5UX0hFQURFUiA9ICd0cmFjZXBhcmVudCc7XG52YXIgVFJBQ0VfU1RBVEVfSEVBREVSID0gJ3RyYWNlc3RhdGUnO1xudmFyIFZFUlNJT04gPSAnMDAnO1xudmFyIFZFUlNJT05fUEFSVCA9ICcoPyFmZilbXFxcXGRhLWZdezJ9JztcbnZhciBUUkFDRV9JRF9QQVJUID0gJyg/IVswXXszMn0pW1xcXFxkYS1mXXszMn0nO1xudmFyIFBBUkVOVF9JRF9QQVJUID0gJyg/IVswXXsxNn0pW1xcXFxkYS1mXXsxNn0nO1xudmFyIEZMQUdTX1BBUlQgPSAnW1xcXFxkYS1mXXsyfSc7XG52YXIgVFJBQ0VfUEFSRU5UX1JFR0VYID0gbmV3IFJlZ0V4cChcIl5cXFxccz8oXCIgKyBWRVJTSU9OX1BBUlQgKyBcIiktKFwiICsgVFJBQ0VfSURfUEFSVCArIFwiKS0oXCIgKyBQQVJFTlRfSURfUEFSVCArIFwiKS0oXCIgKyBGTEFHU19QQVJUICsgXCIpKC0uKik/XFxcXHM/JFwiKTtcbi8qKlxuICogUGFyc2VzIGluZm9ybWF0aW9uIGZyb20gdGhlIFt0cmFjZXBhcmVudF0gc3BhbiB0YWcgYW5kIGNvbnZlcnRzIGl0IGludG8ge0BsaW5rIFNwYW5Db250ZXh0fVxuICogQHBhcmFtIHRyYWNlUGFyZW50IC0gQSBtZXRhIHByb3BlcnR5IHRoYXQgY29tZXMgZnJvbSBzZXJ2ZXIuXG4gKiAgICAgSXQgc2hvdWxkIGJlIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBzZXJ2ZXIgc2lkZSB0byBoYXZlIHRoZSBzZXJ2ZXIncyByZXF1ZXN0IHRyYWNlIElkLFxuICogICAgIGEgcGFyZW50IHNwYW4gSWQgdGhhdCB3YXMgc2V0IG9uIHRoZSBzZXJ2ZXIncyByZXF1ZXN0IHNwYW4sXG4gKiAgICAgYW5kIHRoZSB0cmFjZSBmbGFncyB0byBpbmRpY2F0ZSB0aGUgc2VydmVyJ3Mgc2FtcGxpbmcgZGVjaXNpb25cbiAqICAgICAoMDEgPSBzYW1wbGVkLCAwMCA9IG5vdCBzYW1wbGVkKS5cbiAqICAgICBmb3IgZXhhbXBsZTogJ3t2ZXJzaW9ufS17dHJhY2VJZH0te3NwYW5JZH0te3NhbXBsZURlY2lzaW9ufSdcbiAqICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUge0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi90cmFjZS1jb250ZXh0L31cbiAqL1xuZnVuY3Rpb24gcGFyc2VUcmFjZVBhcmVudCh0cmFjZVBhcmVudCkge1xuICAgIHZhciBtYXRjaCA9IFRSQUNFX1BBUkVOVF9SRUdFWC5leGVjKHRyYWNlUGFyZW50KTtcbiAgICBpZiAoIW1hdGNoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBjb21wYXRpYmxlXG4gICAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMuIElmIHRoZXJlIGFyZSBtb3JlIHBhcnRzLCB3ZSBvbmx5IHJlamVjdCBpdCBpZiBpdCdzIHVzaW5nIHZlcnNpb24gMDBcbiAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3RyYWNlLWNvbnRleHQvI3ZlcnNpb25pbmctb2YtdHJhY2VwYXJlbnRcbiAgICBpZiAobWF0Y2hbMV0gPT09ICcwMCcgJiYgbWF0Y2hbNV0pXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRyYWNlSWQ6IG1hdGNoWzJdLFxuICAgICAgICBzcGFuSWQ6IG1hdGNoWzNdLFxuICAgICAgICB0cmFjZUZsYWdzOiBwYXJzZUludChtYXRjaFs0XSwgMTYpLFxuICAgIH07XG59XG4vKipcbiAqIFByb3BhZ2F0ZXMge0BsaW5rIFNwYW5Db250ZXh0fSB0aHJvdWdoIFRyYWNlIENvbnRleHQgZm9ybWF0IHByb3BhZ2F0aW9uLlxuICpcbiAqIEJhc2VkIG9uIHRoZSBUcmFjZSBDb250ZXh0IHNwZWNpZmljYXRpb246XG4gKiBodHRwczovL3d3dy53My5vcmcvVFIvdHJhY2UtY29udGV4dC9cbiAqL1xudmFyIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvcigpIHtcbiAgICB9XG4gICAgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvci5wcm90b3R5cGUuaW5qZWN0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGNhcnJpZXIsIHNldHRlcikge1xuICAgICAgICB2YXIgc3BhbkNvbnRleHQgPSB0cmFjZS5nZXRTcGFuQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzcGFuQ29udGV4dCB8fFxuICAgICAgICAgICAgaXNUcmFjaW5nU3VwcHJlc3NlZChjb250ZXh0KSB8fFxuICAgICAgICAgICAgIWlzU3BhbkNvbnRleHRWYWxpZChzcGFuQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciB0cmFjZVBhcmVudCA9IFZFUlNJT04gKyBcIi1cIiArIHNwYW5Db250ZXh0LnRyYWNlSWQgKyBcIi1cIiArIHNwYW5Db250ZXh0LnNwYW5JZCArIFwiLTBcIiArIE51bWJlcihzcGFuQ29udGV4dC50cmFjZUZsYWdzIHx8IFRyYWNlRmxhZ3MuTk9ORSkudG9TdHJpbmcoMTYpO1xuICAgICAgICBzZXR0ZXIuc2V0KGNhcnJpZXIsIFRSQUNFX1BBUkVOVF9IRUFERVIsIHRyYWNlUGFyZW50KTtcbiAgICAgICAgaWYgKHNwYW5Db250ZXh0LnRyYWNlU3RhdGUpIHtcbiAgICAgICAgICAgIHNldHRlci5zZXQoY2FycmllciwgVFJBQ0VfU1RBVEVfSEVBREVSLCBzcGFuQ29udGV4dC50cmFjZVN0YXRlLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvci5wcm90b3R5cGUuZXh0cmFjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBnZXR0ZXIpIHtcbiAgICAgICAgdmFyIHRyYWNlUGFyZW50SGVhZGVyID0gZ2V0dGVyLmdldChjYXJyaWVyLCBUUkFDRV9QQVJFTlRfSEVBREVSKTtcbiAgICAgICAgaWYgKCF0cmFjZVBhcmVudEhlYWRlcilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB2YXIgdHJhY2VQYXJlbnQgPSBBcnJheS5pc0FycmF5KHRyYWNlUGFyZW50SGVhZGVyKVxuICAgICAgICAgICAgPyB0cmFjZVBhcmVudEhlYWRlclswXVxuICAgICAgICAgICAgOiB0cmFjZVBhcmVudEhlYWRlcjtcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFjZVBhcmVudCAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgdmFyIHNwYW5Db250ZXh0ID0gcGFyc2VUcmFjZVBhcmVudCh0cmFjZVBhcmVudCk7XG4gICAgICAgIGlmICghc3BhbkNvbnRleHQpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgc3BhbkNvbnRleHQuaXNSZW1vdGUgPSB0cnVlO1xuICAgICAgICB2YXIgdHJhY2VTdGF0ZUhlYWRlciA9IGdldHRlci5nZXQoY2FycmllciwgVFJBQ0VfU1RBVEVfSEVBREVSKTtcbiAgICAgICAgaWYgKHRyYWNlU3RhdGVIZWFkZXIpIHtcbiAgICAgICAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgYHRyYWNlc3RhdGVgIGhlYWRlciBpcyBmb3VuZCwgd2UgbWVyZ2UgdGhlbSBpbnRvIGFcbiAgICAgICAgICAgIC8vIHNpbmdsZSBoZWFkZXIuXG4gICAgICAgICAgICB2YXIgc3RhdGUgPSBBcnJheS5pc0FycmF5KHRyYWNlU3RhdGVIZWFkZXIpXG4gICAgICAgICAgICAgICAgPyB0cmFjZVN0YXRlSGVhZGVyLmpvaW4oJywnKVxuICAgICAgICAgICAgICAgIDogdHJhY2VTdGF0ZUhlYWRlcjtcbiAgICAgICAgICAgIHNwYW5Db250ZXh0LnRyYWNlU3RhdGUgPSBuZXcgVHJhY2VTdGF0ZSh0eXBlb2Ygc3RhdGUgPT09ICdzdHJpbmcnID8gc3RhdGUgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFjZS5zZXRTcGFuQ29udGV4dChjb250ZXh0LCBzcGFuQ29udGV4dCk7XG4gICAgfTtcbiAgICBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yLnByb3RvdHlwZS5maWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBbVFJBQ0VfUEFSRU5UX0hFQURFUiwgVFJBQ0VfU1RBVEVfSEVBREVSXTtcbiAgICB9O1xuICAgIHJldHVybiBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBSUENfTUVUQURBVEFfS0VZID0gY3JlYXRlQ29udGV4dEtleSgnT3BlblRlbGVtZXRyeSBTREsgQ29udGV4dCBLZXkgUlBDX01FVEFEQVRBJyk7XG52YXIgUlBDVHlwZTtcbihmdW5jdGlvbiAoUlBDVHlwZSkge1xuICAgIFJQQ1R5cGVbXCJIVFRQXCJdID0gXCJodHRwXCI7XG59KShSUENUeXBlIHx8IChSUENUeXBlID0ge30pKTtcbmZ1bmN0aW9uIHNldFJQQ01ldGFkYXRhKGNvbnRleHQsIG1ldGEpIHtcbiAgICByZXR1cm4gY29udGV4dC5zZXRWYWx1ZShSUENfTUVUQURBVEFfS0VZLCBtZXRhKTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZVJQQ01ldGFkYXRhKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dC5kZWxldGVWYWx1ZShSUENfTUVUQURBVEFfS0VZKTtcbn1cbmZ1bmN0aW9uIGdldFJQQ01ldGFkYXRhKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dC5nZXRWYWx1ZShSUENfTUVUQURBVEFfS0VZKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBvbmUgZGVmaW5lZCBpbiBAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZSBpbnN0ZWFkLlxuICogU2FtcGxlciB0aGF0IHNhbXBsZXMgbm8gdHJhY2VzLlxuICovXG52YXIgQWx3YXlzT2ZmU2FtcGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBbHdheXNPZmZTYW1wbGVyKCkge1xuICAgIH1cbiAgICBBbHdheXNPZmZTYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWNpc2lvbjogU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgQWx3YXlzT2ZmU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnQWx3YXlzT2ZmU2FtcGxlcic7XG4gICAgfTtcbiAgICByZXR1cm4gQWx3YXlzT2ZmU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgb25lIGRlZmluZWQgaW4gQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2UgaW5zdGVhZC5cbiAqIFNhbXBsZXIgdGhhdCBzYW1wbGVzIGFsbCB0cmFjZXMuXG4gKi9cbnZhciBBbHdheXNPblNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQWx3YXlzT25TYW1wbGVyKCkge1xuICAgIH1cbiAgICBBbHdheXNPblNhbXBsZXIucHJvdG90eXBlLnNob3VsZFNhbXBsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlY2lzaW9uOiBTYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEFsd2F5c09uU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnQWx3YXlzT25TYW1wbGVyJztcbiAgICB9O1xuICAgIHJldHVybiBBbHdheXNPblNhbXBsZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIG9uZSBkZWZpbmVkIGluIEBvcGVudGVsZW1ldHJ5L3Nkay10cmFjZS1iYXNlIGluc3RlYWQuXG4gKiBBIGNvbXBvc2l0ZSBzYW1wbGVyIHRoYXQgZWl0aGVyIHJlc3BlY3RzIHRoZSBwYXJlbnQgc3BhbidzIHNhbXBsaW5nIGRlY2lzaW9uXG4gKiBvciBkZWxlZ2F0ZXMgdG8gYGRlbGVnYXRlU2FtcGxlcmAgZm9yIHJvb3Qgc3BhbnMuXG4gKi9cbnZhciBQYXJlbnRCYXNlZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFyZW50QmFzZWRTYW1wbGVyKGNvbmZpZykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBjb25maWcucm9vdDtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290KSB7XG4gICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIobmV3IEVycm9yKCdQYXJlbnRCYXNlZFNhbXBsZXIgbXVzdCBoYXZlIGEgcm9vdCBzYW1wbGVyIGNvbmZpZ3VyZWQnKSk7XG4gICAgICAgICAgICB0aGlzLl9yb290ID0gbmV3IEFsd2F5c09uU2FtcGxlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQgPVxuICAgICAgICAgICAgKF9hID0gY29uZmlnLnJlbW90ZVBhcmVudFNhbXBsZWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2IgPSBjb25maWcucmVtb3RlUGFyZW50Tm90U2FtcGxlZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbmV3IEFsd2F5c09mZlNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxQYXJlbnRTYW1wbGVkID1cbiAgICAgICAgICAgIChfYyA9IGNvbmZpZy5sb2NhbFBhcmVudFNhbXBsZWQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkID1cbiAgICAgICAgICAgIChfZCA9IGNvbmZpZy5sb2NhbFBhcmVudE5vdFNhbXBsZWQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IG5ldyBBbHdheXNPZmZTYW1wbGVyKCk7XG4gICAgfVxuICAgIFBhcmVudEJhc2VkU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHRyYWNlSWQsIHNwYW5OYW1lLCBzcGFuS2luZCwgYXR0cmlidXRlcywgbGlua3MpIHtcbiAgICAgICAgdmFyIHBhcmVudENvbnRleHQgPSB0cmFjZS5nZXRTcGFuQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYXJlbnRDb250ZXh0IHx8ICFpc1NwYW5Db250ZXh0VmFsaWQocGFyZW50Q29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb290LnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5pc1JlbW90ZSkge1xuICAgICAgICAgICAgaWYgKHBhcmVudENvbnRleHQudHJhY2VGbGFncyAmIFRyYWNlRmxhZ3MuU0FNUExFRCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW1vdGVQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC50cmFjZUZsYWdzICYgVHJhY2VGbGFncy5TQU1QTEVEKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxQYXJlbnRTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICB9O1xuICAgIFBhcmVudEJhc2VkU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlBhcmVudEJhc2Vke3Jvb3Q9XCIgKyB0aGlzLl9yb290LnRvU3RyaW5nKCkgKyBcIiwgcmVtb3RlUGFyZW50U2FtcGxlZD1cIiArIHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCByZW1vdGVQYXJlbnROb3RTYW1wbGVkPVwiICsgdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpICsgXCIsIGxvY2FsUGFyZW50U2FtcGxlZD1cIiArIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC50b1N0cmluZygpICsgXCIsIGxvY2FsUGFyZW50Tm90U2FtcGxlZD1cIiArIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpICsgXCJ9XCI7XG4gICAgfTtcbiAgICByZXR1cm4gUGFyZW50QmFzZWRTYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBvbmUgZGVmaW5lZCBpbiBAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZSBpbnN0ZWFkLlxuICogU2FtcGxlciB0aGF0IHNhbXBsZXMgYSBnaXZlbiBmcmFjdGlvbiBvZiB0cmFjZXMgYmFzZWQgb2YgdHJhY2UgaWQgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gKi9cbnZhciBUcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyKF9yYXRpbykge1xuICAgICAgICBpZiAoX3JhdGlvID09PSB2b2lkIDApIHsgX3JhdGlvID0gMDsgfVxuICAgICAgICB0aGlzLl9yYXRpbyA9IF9yYXRpbztcbiAgICAgICAgdGhpcy5fcmF0aW8gPSB0aGlzLl9ub3JtYWxpemUoX3JhdGlvKTtcbiAgICAgICAgdGhpcy5fdXBwZXJCb3VuZCA9IE1hdGguZmxvb3IodGhpcy5fcmF0aW8gKiAweGZmZmZmZmZmKTtcbiAgICB9XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoY29udGV4dCwgdHJhY2VJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVjaXNpb246IGlzVmFsaWRUcmFjZUlkKHRyYWNlSWQpICYmIHRoaXMuX2FjY3VtdWxhdGUodHJhY2VJZCkgPCB0aGlzLl91cHBlckJvdW5kXG4gICAgICAgICAgICAgICAgPyBTYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRFxuICAgICAgICAgICAgICAgIDogU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiVHJhY2VJZFJhdGlvQmFzZWR7XCIgKyB0aGlzLl9yYXRpbyArIFwifVwiO1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5fbm9ybWFsaXplID0gZnVuY3Rpb24gKHJhdGlvKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmF0aW8gIT09ICdudW1iZXInIHx8IGlzTmFOKHJhdGlvKSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gcmF0aW8gPj0gMSA/IDEgOiByYXRpbyA8PSAwID8gMCA6IHJhdGlvO1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5fYWNjdW11bGF0ZSA9IGZ1bmN0aW9uICh0cmFjZUlkKSB7XG4gICAgICAgIHZhciBhY2N1bXVsYXRpb24gPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNlSWQubGVuZ3RoIC8gODsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9zID0gaSAqIDg7XG4gICAgICAgICAgICB2YXIgcGFydCA9IHBhcnNlSW50KHRyYWNlSWQuc2xpY2UocG9zLCBwb3MgKyA4KSwgMTYpO1xuICAgICAgICAgICAgYWNjdW11bGF0aW9uID0gKGFjY3VtdWxhdGlvbiBeIHBhcnQpID4+PiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRpb247XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qKlxuICogYmFzZWQgb24gbG9kYXNoIGluIG9yZGVyIHRvIHN1cHBvcnQgZXNtIGJ1aWxkcyB3aXRob3V0IGVzTW9kdWxlSW50ZXJvcC5cbiAqIGxvZGFzaCBpcyB1c2luZyBNSVQgTGljZW5zZS5cbiAqKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nO1xudmFyIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcbi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgICB9O1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPT0gb2JqZWN0VGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09PSBvYmplY3RDdG9yU3RyaW5nKTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgICB9XG4gICAgcmV0dXJuIHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSlcbiAgICAgICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICB2YXIgdW5tYXNrZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgICAgIHVubWFza2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gc2lsZW5jZVxuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgaWYgKHVubWFza2VkKSB7XG4gICAgICAgIGlmIChpc093bikge1xuICAgICAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xudmFyIE1BWF9MRVZFTCA9IDIwO1xuLyoqXG4gKiBNZXJnZXMgb2JqZWN0cyB0b2dldGhlclxuICogQHBhcmFtIGFyZ3MgLSBvYmplY3RzIC8gdmFsdWVzIHRvIGJlIG1lcmdlZFxuICovXG5mdW5jdGlvbiBtZXJnZSgpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGFyZ3Muc2hpZnQoKTtcbiAgICB2YXIgb2JqZWN0cyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgd2hpbGUgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQgPSBtZXJnZVR3b09iamVjdHMocmVzdWx0LCBhcmdzLnNoaWZ0KCksIDAsIG9iamVjdHMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdGFrZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zbGljZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4vKipcbiAqIE1lcmdlcyB0d28gb2JqZWN0c1xuICogQHBhcmFtIG9uZSAtIGZpcnN0IG9iamVjdFxuICogQHBhcmFtIHR3byAtIHNlY29uZCBvYmplY3RcbiAqIEBwYXJhbSBsZXZlbCAtIGN1cnJlbnQgZGVlcCBsZXZlbFxuICogQHBhcmFtIG9iamVjdHMgLSBvYmplY3RzIGhvbGRlciB0aGF0IGhhcyBiZWVuIGFscmVhZHkgcmVmZXJlbmNlZCAtIHRvIHByZXZlbnRcbiAqIGN5Y2xpYyBkZXBlbmRlbmN5XG4gKi9cbmZ1bmN0aW9uIG1lcmdlVHdvT2JqZWN0cyhvbmUsIHR3bywgbGV2ZWwsIG9iamVjdHMpIHtcbiAgICBpZiAobGV2ZWwgPT09IHZvaWQgMCkgeyBsZXZlbCA9IDA7IH1cbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChsZXZlbCA+IE1BWF9MRVZFTCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXZlbCsrO1xuICAgIGlmIChpc1ByaW1pdGl2ZShvbmUpIHx8IGlzUHJpbWl0aXZlKHR3bykgfHwgaXNGdW5jdGlvbih0d28pKSB7XG4gICAgICAgIHJlc3VsdCA9IHRha2VWYWx1ZSh0d28pO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FycmF5KG9uZSkpIHtcbiAgICAgICAgcmVzdWx0ID0gb25lLnNsaWNlKCk7XG4gICAgICAgIGlmIChpc0FycmF5KHR3bykpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gdHdvLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRha2VWYWx1ZSh0d29baV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdCh0d28pKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHR3byk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGtleXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB0YWtlVmFsdWUodHdvW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9uZSkpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHR3bykpIHtcbiAgICAgICAgICAgIGlmICghc2hvdWxkTWVyZ2Uob25lLCB0d28pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR3bztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIG9uZSk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHR3byk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGtleXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgdmFyIHR3b1ZhbHVlID0gdHdvW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKHR3b1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHR3b1ZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0W2tleV0gPSB0YWtlVmFsdWUodHdvVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB0d29WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iajEgPSByZXN1bHRba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iajIgPSB0d29WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhc09iamVjdFJlZmVyZW5jZWQob25lLCBrZXksIG9iamVjdHMpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXNPYmplY3RSZWZlcmVuY2VkKHR3bywga2V5LCBvYmplY3RzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KG9iajEpICYmIGlzT2JqZWN0KG9iajIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFycjEgPSBvYmplY3RzLmdldChvYmoxKSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyMiA9IG9iamVjdHMuZ2V0KG9iajIpIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycjEucHVzaCh7IG9iajogb25lLCBrZXk6IGtleSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIyLnB1c2goeyBvYmo6IHR3bywga2V5OiBrZXkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5zZXQob2JqMSwgYXJyMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5zZXQob2JqMiwgYXJyMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IG1lcmdlVHdvT2JqZWN0cyhyZXN1bHRba2V5XSwgdHdvVmFsdWUsIGxldmVsLCBvYmplY3RzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHR3bztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBGdW5jdGlvbiB0byBjaGVjayBpZiBvYmplY3QgaGFzIGJlZW4gYWxyZWFkeSByZWZlcmVuY2VcbiAqIEBwYXJhbSBvYmpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIHdhc09iamVjdFJlZmVyZW5jZWQob2JqLCBrZXksIG9iamVjdHMpIHtcbiAgICB2YXIgYXJyID0gb2JqZWN0cy5nZXQob2JqW2tleV0pIHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBqID0gYXJyLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICB2YXIgaW5mbyA9IGFycltpXTtcbiAgICAgICAgaWYgKGluZm8ua2V5ID09PSBrZXkgJiYgaW5mby5vYmogPT09IG9iaikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNBcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gKCFpc1ByaW1pdGl2ZSh2YWx1ZSkgJiZcbiAgICAgICAgIWlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICFpc0Z1bmN0aW9uKHZhbHVlKSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKTtcbn1cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgfHxcbiAgICAgICAgdmFsdWUgPT09IG51bGwpO1xufVxuZnVuY3Rpb24gc2hvdWxkTWVyZ2Uob25lLCB0d28pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3Qob25lKSB8fCAhaXNQbGFpbk9iamVjdCh0d28pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19leHRlbmRzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbi8qKlxuICogRXJyb3IgdGhhdCBpcyB0aHJvd24gb24gdGltZW91dHMuXG4gKi9cbnZhciBUaW1lb3V0RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRpbWVvdXRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaW1lb3V0RXJyb3IobWVzc2FnZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtZXNzYWdlKSB8fCB0aGlzO1xuICAgICAgICAvLyBtYW51YWxseSBhZGp1c3QgcHJvdG90eXBlIHRvIHJldGFpbiBgaW5zdGFuY2VvZmAgZnVuY3Rpb25hbGl0eSB3aGVuIHRhcmdldGluZyBFUzUsIHNlZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYWluL0JyZWFraW5nLUNoYW5nZXMubWQjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgVGltZW91dEVycm9yLnByb3RvdHlwZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFRpbWVvdXRFcnJvcjtcbn0oRXJyb3IpKTtcbi8qKlxuICogQWRkcyBhIHRpbWVvdXQgdG8gYSBwcm9taXNlIGFuZCByZWplY3RzIGlmIHRoZSBzcGVjaWZpZWQgdGltZW91dCBoYXMgZWxhcHNlZC4gQWxzbyByZWplY3RzIGlmIHRoZSBzcGVjaWZpZWQgcHJvbWlzZVxuICogcmVqZWN0cywgYW5kIHJlc29sdmVzIGlmIHRoZSBzcGVjaWZpZWQgcHJvbWlzZSByZXNvbHZlcy5cbiAqXG4gKiA8cD4gTk9URTogdGhpcyBvcGVyYXRpb24gd2lsbCBjb250aW51ZSBldmVuIGFmdGVyIGl0IHRocm93cyBhIHtAbGluayBUaW1lb3V0RXJyb3J9LlxuICpcbiAqIEBwYXJhbSBwcm9taXNlIHByb21pc2UgdG8gdXNlIHdpdGggdGltZW91dC5cbiAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB1bnRpbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyByZWplY3RlZC5cbiAqL1xuZnVuY3Rpb24gY2FsbFdpdGhUaW1lb3V0KHByb21pc2UsIHRpbWVvdXQpIHtcbiAgICB2YXIgdGltZW91dEhhbmRsZTtcbiAgICB2YXIgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiB0aW1lb3V0RnVuY3Rpb24oX3Jlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChmdW5jdGlvbiB0aW1lb3V0SGFuZGxlcigpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgVGltZW91dEVycm9yKCdPcGVyYXRpb24gdGltZWQgb3V0LicpKTtcbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIFByb21pc2UucmFjZShbcHJvbWlzZSwgdGltZW91dFByb21pc2VdKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICB0aHJvdyByZWFzb247XG4gICAgfSk7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIENoZWNrcyBpZiBjZXJ0YWluIGZ1bmN0aW9uIGhhcyBiZWVuIGFscmVhZHkgd3JhcHBlZFxuICogQHBhcmFtIGZ1bmNcbiAqL1xuZnVuY3Rpb24gaXNXcmFwcGVkKGZ1bmMpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBmdW5jLl9fb3JpZ2luYWwgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIGZ1bmMuX191bndyYXAgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgZnVuYy5fX3dyYXBwZWQgPT09IHRydWUpO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIERlZmVycmVkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZmVycmVkKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgX3RoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgX3RoaXMuX3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWZlcnJlZC5wcm90b3R5cGUsIFwicHJvbWlzZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBEZWZlcnJlZC5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZSh2YWwpO1xuICAgIH07XG4gICAgRGVmZXJyZWQucHJvdG90eXBlLnJlamVjdCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdGhpcy5fcmVqZWN0KGVycik7XG4gICAgfTtcbiAgICByZXR1cm4gRGVmZXJyZWQ7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fcmVhZCA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG4vKipcbiAqIEJpbmQgdGhlIGNhbGxiYWNrIGFuZCBvbmx5IGludm9rZSB0aGUgY2FsbGJhY2sgb25jZSByZWdhcmRsZXNzIGhvdyBtYW55IHRpbWVzIGBCaW5kT25jZUZ1dHVyZS5jYWxsYCBpcyBpbnZva2VkLlxuICovXG52YXIgQmluZE9uY2VGdXR1cmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmluZE9uY2VGdXR1cmUoX2NhbGxiYWNrLCBfdGhhdCkge1xuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IF9jYWxsYmFjaztcbiAgICAgICAgdGhpcy5fdGhhdCA9IF90aGF0O1xuICAgICAgICB0aGlzLl9pc0NhbGxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9kZWZlcnJlZCA9IG5ldyBEZWZlcnJlZCgpO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQmluZE9uY2VGdXR1cmUucHJvdG90eXBlLCBcImlzQ2FsbGVkXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNDYWxsZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQmluZE9uY2VGdXR1cmUucHJvdG90eXBlLCBcInByb21pc2VcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgQmluZE9uY2VGdXR1cmUucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2lzQ2FsbGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0NhbGxlZCA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgoX2EgPSB0aGlzLl9jYWxsYmFjaykuY2FsbC5hcHBseShfYSwgX19zcHJlYWRBcnJheShbdGhpcy5fdGhhdF0sIF9fcmVhZChhcmdzKSwgZmFsc2UpKSkudGhlbihmdW5jdGlvbiAodmFsKSB7IHJldHVybiBfdGhpcy5fZGVmZXJyZWQucmVzb2x2ZSh2YWwpOyB9LCBmdW5jdGlvbiAoZXJyKSB7IHJldHVybiBfdGhpcy5fZGVmZXJyZWQucmVqZWN0KGVycik7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZlcnJlZC5wcm9taXNlO1xuICAgIH07XG4gICAgcmV0dXJuIEJpbmRPbmNlRnV0dXJlO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGludGVybmFsXG4gKiBTaGFyZWQgZnVuY3Rpb25hbGl0eSB1c2VkIGJ5IEV4cG9ydGVycyB3aGlsZSBleHBvcnRpbmcgZGF0YSwgaW5jbHVkaW5nIHN1cHByZXNzaW9uIG9mIFRyYWNlcy5cbiAqL1xuZnVuY3Rpb24gX2V4cG9ydChleHBvcnRlciwgYXJnKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIC8vIHByZXZlbnQgZG93bnN0cmVhbSBleHBvcnRlciBjYWxscyBmcm9tIGdlbmVyYXRpbmcgc3BhbnNcbiAgICAgICAgY29udGV4dC53aXRoKHN1cHByZXNzVHJhY2luZyhjb250ZXh0LmFjdGl2ZSgpKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwb3J0ZXIuZXhwb3J0KGFyZywgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBiYWdnYWdlVXRpbHMgPSB7XG4gICAgZ2V0S2V5UGFpcnM6IGdldEtleVBhaXJzLFxuICAgIHNlcmlhbGl6ZUtleVBhaXJzOiBzZXJpYWxpemVLZXlQYWlycyxcbiAgICBwYXJzZUtleVBhaXJzSW50b1JlY29yZDogcGFyc2VLZXlQYWlyc0ludG9SZWNvcmQsXG4gICAgcGFyc2VQYWlyS2V5VmFsdWU6IHBhcnNlUGFpcktleVZhbHVlLFxufTtcbnZhciBpbnRlcm5hbCA9IHtcbiAgICBfZXhwb3J0OiBfZXhwb3J0LFxufTtcblxuY29uc3QgZXNtID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoLyojX19QVVJFX18qL09iamVjdC5kZWZpbmVQcm9wZXJ0eSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIEFsd2F5c09mZlNhbXBsZXIsXG4gICAgQWx3YXlzT25TYW1wbGVyLFxuICAgIEFuY2hvcmVkQ2xvY2ssXG4gICAgQmluZE9uY2VGdXR1cmUsXG4gICAgQ29tcG9zaXRlUHJvcGFnYXRvcixcbiAgICBERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxcbiAgICBERUZBVUxUX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQsXG4gICAgREVGQVVMVF9FTlZJUk9OTUVOVCxcbiAgICBERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVCxcbiAgICBERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9MSU5LX0NPVU5UX0xJTUlULFxuICAgIGdldCBFeHBvcnRSZXN1bHRDb2RlICgpIHsgcmV0dXJuIEV4cG9ydFJlc3VsdENvZGU7IH0sXG4gICAgUGFyZW50QmFzZWRTYW1wbGVyLFxuICAgIGdldCBSUENUeXBlICgpIHsgcmV0dXJuIFJQQ1R5cGU7IH0sXG4gICAgUmFuZG9tSWRHZW5lcmF0b3IsXG4gICAgU0RLX0lORk8sXG4gICAgVFJBQ0VfUEFSRU5UX0hFQURFUixcbiAgICBUUkFDRV9TVEFURV9IRUFERVIsXG4gICAgVGltZW91dEVycm9yLFxuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcixcbiAgICBUcmFjZVN0YXRlLFxuICAgIGdldCBUcmFjZXNTYW1wbGVyVmFsdWVzICgpIHsgcmV0dXJuIFRyYWNlc1NhbXBsZXJWYWx1ZXM7IH0sXG4gICAgVkVSU0lPTjogVkVSU0lPTiQxLFxuICAgIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yLFxuICAgIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IsXG4gICAgX2dsb2JhbFRoaXMsXG4gICAgYWRkSHJUaW1lcyxcbiAgICBiYWdnYWdlVXRpbHMsXG4gICAgY2FsbFdpdGhUaW1lb3V0LFxuICAgIGRlbGV0ZVJQQ01ldGFkYXRhLFxuICAgIGdldEVudixcbiAgICBnZXRFbnZXaXRob3V0RGVmYXVsdHMsXG4gICAgZ2V0UlBDTWV0YWRhdGEsXG4gICAgZ2V0VGltZU9yaWdpbixcbiAgICBnbG9iYWxFcnJvckhhbmRsZXIsXG4gICAgaGV4VG9CYXNlNjQsXG4gICAgaGV4VG9CaW5hcnksXG4gICAgaHJUaW1lLFxuICAgIGhyVGltZUR1cmF0aW9uLFxuICAgIGhyVGltZVRvTWljcm9zZWNvbmRzLFxuICAgIGhyVGltZVRvTWlsbGlzZWNvbmRzLFxuICAgIGhyVGltZVRvTmFub3NlY29uZHMsXG4gICAgaHJUaW1lVG9UaW1lU3RhbXAsXG4gICAgaW50ZXJuYWwsXG4gICAgaXNBdHRyaWJ1dGVLZXksXG4gICAgaXNBdHRyaWJ1dGVWYWx1ZSxcbiAgICBpc1RpbWVJbnB1dCxcbiAgICBpc1RpbWVJbnB1dEhyVGltZSxcbiAgICBpc1RyYWNpbmdTdXBwcmVzc2VkLFxuICAgIGlzVXJsSWdub3JlZCxcbiAgICBpc1dyYXBwZWQsXG4gICAgbG9nZ2luZ0Vycm9ySGFuZGxlcixcbiAgICBtZXJnZSxcbiAgICBtaWxsaXNUb0hyVGltZSxcbiAgICBvdHBlcmZvcm1hbmNlLFxuICAgIHBhcnNlRW52aXJvbm1lbnQsXG4gICAgcGFyc2VUcmFjZVBhcmVudCxcbiAgICBzYW5pdGl6ZUF0dHJpYnV0ZXMsXG4gICAgc2V0R2xvYmFsRXJyb3JIYW5kbGVyLFxuICAgIHNldFJQQ01ldGFkYXRhLFxuICAgIHN1cHByZXNzVHJhY2luZyxcbiAgICB0aW1lSW5wdXRUb0hyVGltZSxcbiAgICB1bnJlZlRpbWVyLFxuICAgIHVuc3VwcHJlc3NUcmFjaW5nLFxuICAgIHVybE1hdGNoZXNcbn0sIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSkpO1xuXG5leHBvcnQgeyBCaW5kT25jZUZ1dHVyZSBhcyBCLCBDb21wb3NpdGVQcm9wYWdhdG9yIGFzIEMsIERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlUIGFzIEQsIFNhbXBsaW5nRGVjaXNpb24gYXMgUywgVHJhY2VzU2FtcGxlclZhbHVlcyBhcyBULCBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yIGFzIFcsIGdldEVudiBhcyBhLCBnZXRFbnZXaXRob3V0RGVmYXVsdHMgYXMgYiwgREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIGFzIGMsIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yIGFzIGQsIGludGVybmFsIGFzIGUsIGVzbSBhcyBmLCBnbG9iYWxFcnJvckhhbmRsZXIgYXMgZywgaXNBdHRyaWJ1dGVWYWx1ZSBhcyBpLCBtZXJnZSBhcyBtLCBzYW5pdGl6ZUF0dHJpYnV0ZXMgYXMgcywgdW5yZWZUaW1lciBhcyB1IH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFLQSxJQUFnQyxLQUFLQyxHQUFhLEtBQUtDLEdBQWEsS0FBS0MsSUFBWSxLQUFLQyxJQUFlLEtBQUtDLElBQVEsS0FBS0MsSUFBZ0IsS0FBS0MsSUFBc0IsTUFBTUMsSUFBc0IsS0FBS0MsSUFBcUIsTUFBTUMsSUFBbUIsS0FBS0MsSUFBYSxLQUFLQyxJQUFtQixLQUFLQyxJQUFjLEtB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O0FBQUEsRUFDQSxxQkFBQUM7QUFBQSxFQUNBLG1CQUFBQztBQUFBLEVBQ0EsVUFBQXNTO0FBQUEsRUFDQSxnQkFBQXBOO0FBQUEsRUFDQSxrQkFBQUM7QUFBQSxFQUNBLGFBQUFsRjtBQUFBLEVBQ0EsbUJBQUFDO0FBQUEsRUFDQSxxQkFBQU07QUFBQSxFQUNBLGNBQUFMO0FBQUEsRUFDQSxXQUFBd1I7QUFBQSxFQUNBLHFCQUFBN0w7QUFBQSxFQUNBLE9BQUFxSjtBQUFBLEVBQ0EsZ0JBQUEvTztBQUFBLEVBQ0EsZUFBQUM7QUFBQSxFQUNBLGtCQUFBZ0k7QUFBQSxFQUNBLGtCQUFBeUQ7QUFBQSxFQUNBLG9CQUFBbkg7QUFBQSxFQUNBLHVCQUFBMEI7QUFBQSxFQUNBLGdCQUFBbUc7QUFBQSxFQUNBLGlCQUFBL0w7QUFBQSxFQUNBLG1CQUFBSDtBQUFBLEVBQ0EsWUFBQWtKO0FBQUEsRUFDQSxtQkFBQTlJO0FBQUEsRUFDQSxZQUFBSDtBQUNKLEdBQUcsT0FBTyxhQUFhLEVBQUUsT0FBTyxTQUFTLENBQUMsQ0FBQzsiLAogICJuYW1lcyI6IFsiYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nIiwgInByb3BhZ2F0aW9uIiwgIl9nbG9iYWxUaGlzIiwgImFkZEhyVGltZXMiLCAiZ2V0VGltZU9yaWdpbiIsICJoclRpbWUiLCAiaHJUaW1lRHVyYXRpb24iLCAiaHJUaW1lVG9NaWNyb3NlY29uZHMiLCAiaHJUaW1lVG9NaWxsaXNlY29uZHMiLCAiaHJUaW1lVG9OYW5vc2Vjb25kcyIsICJoclRpbWVUb1RpbWVTdGFtcCIsICJpc1RpbWVJbnB1dCIsICJpc1RpbWVJbnB1dEhyVGltZSIsICJpc1VybElnbm9yZWQiLCAibWlsbGlzVG9IclRpbWUiLCAib3RwZXJmb3JtYW5jZSIsICJ0aW1lSW5wdXRUb0hyVGltZSIsICJ1cmxNYXRjaGVzIiwgImlzVHJhY2luZ1N1cHByZXNzZWQiLCAic3VwcHJlc3NUcmFjaW5nIiwgInVuc3VwcHJlc3NUcmFjaW5nIiwgImRpYWciLCAiaGV4VG9CaW5hcnkiLCAiRXhwb3J0UmVzdWx0Q29kZSIsICJEaWFnTG9nTGV2ZWwiLCAidHJhY2UiLCAiaXNTcGFuQ29udGV4dFZhbGlkIiwgIlRyYWNlRmxhZ3MiLCAiY3JlYXRlQ29udGV4dEtleSIsICJpc1ZhbGlkVHJhY2VJZCIsICJjb250ZXh0IiwgIlNES19JTkZPIiwgIlZFUlNJT04kMSIsICJTYW1wbGluZ0RlY2lzaW9uIiwgIkJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SIiwgIkJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IiLCAiQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IiLCAiQkFHR0FHRV9IRUFERVIiLCAiQkFHR0FHRV9NQVhfTkFNRV9WQUxVRV9QQUlSUyIsICJCQUdHQUdFX01BWF9QRVJfTkFNRV9WQUxVRV9QQUlSUyIsICJCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEgiLCAiX19yZWFkJDMiLCAibyIsICJuIiwgIm0iLCAiaSIsICJyIiwgImFyIiwgImUiLCAiZXJyb3IiLCAic2VyaWFsaXplS2V5UGFpcnMiLCAia2V5UGFpcnMiLCAiaFZhbHVlIiwgImN1cnJlbnQiLCAidmFsdWUiLCAiZ2V0S2V5UGFpcnMiLCAiYmFnZ2FnZSIsICJfYSIsICJfYiIsICJrZXkiLCAiZW50cnkiLCAicGFyc2VQYWlyS2V5VmFsdWUiLCAidmFsdWVQcm9wcyIsICJrZXlQYWlyUGFydCIsICJzZXBhcmF0b3JJbmRleCIsICJtZXRhZGF0YSIsICJwYXJzZUtleVBhaXJzSW50b1JlY29yZCIsICJrZXlQYWlyIiwgImhlYWRlcnMiLCAiVzNDQmFnZ2FnZVByb3BhZ2F0b3IiLCAiY2FycmllciIsICJzZXR0ZXIiLCAicGFpciIsICJoZWFkZXJWYWx1ZSIsICJnZXR0ZXIiLCAiYmFnZ2FnZVN0cmluZyIsICJwYWlycyIsICJiYWdnYWdlRW50cnkiLCAiQW5jaG9yZWRDbG9jayIsICJzeXN0ZW1DbG9jayIsICJtb25vdG9uaWNDbG9jayIsICJkZWx0YSIsICJfX3ZhbHVlcyQxIiwgInMiLCAiX19yZWFkJDIiLCAic2FuaXRpemVBdHRyaWJ1dGVzIiwgImF0dHJpYnV0ZXMiLCAiZV8xIiwgIm91dCIsICJfYyIsICJfZCIsICJ2YWwiLCAiaXNBdHRyaWJ1dGVLZXkiLCAiaXNBdHRyaWJ1dGVWYWx1ZSIsICJlXzFfMSIsICJpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheSIsICJpc1ZhbGlkUHJpbWl0aXZlQXR0cmlidXRlVmFsdWUiLCAiYXJyIiwgImVfMiIsICJ0eXBlIiwgImFycl8xIiwgImFycl8xXzEiLCAiZWxlbWVudCIsICJlXzJfMSIsICJsb2dnaW5nRXJyb3JIYW5kbGVyIiwgImV4IiwgInN0cmluZ2lmeUV4Y2VwdGlvbiIsICJmbGF0dGVuRXhjZXB0aW9uIiwgInJlc3VsdCIsICJwcm9wZXJ0eU5hbWUiLCAiZGVsZWdhdGVIYW5kbGVyIiwgInNldEdsb2JhbEVycm9ySGFuZGxlciIsICJoYW5kbGVyIiwgImdsb2JhbEVycm9ySGFuZGxlciIsICJUcmFjZXNTYW1wbGVyVmFsdWVzIiwgIkRFRkFVTFRfTElTVF9TRVBBUkFUT1IiLCAiRU5WSVJPTk1FTlRfQk9PTEVBTl9LRVlTIiwgImlzRW52VmFyQUJvb2xlYW4iLCAiRU5WSVJPTk1FTlRfTlVNQkVSU19LRVlTIiwgImlzRW52VmFyQU51bWJlciIsICJFTlZJUk9OTUVOVF9MSVNUU19LRVlTIiwgImlzRW52VmFyQUxpc3QiLCAiREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIiwgIkRFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlUIiwgIkRFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0VWRU5UX0NPVU5UX0xJTUlUIiwgIkRFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQiLCAiREVGQVVMVF9FTlZJUk9OTUVOVCIsICJwYXJzZUJvb2xlYW4iLCAiZW52aXJvbm1lbnQiLCAidmFsdWVzIiwgInBhcnNlTnVtYmVyIiwgIm5hbWUiLCAibWluIiwgIm1heCIsICJwYXJzZVN0cmluZ0xpc3QiLCAib3V0cHV0IiwgImlucHV0IiwgInNlcGFyYXRvciIsICJnaXZlblZhbHVlIiwgInYiLCAibG9nTGV2ZWxNYXAiLCAic2V0TG9nTGV2ZWxGcm9tRW52IiwgInRoZUxldmVsIiwgInBhcnNlRW52aXJvbm1lbnQiLCAiZW52IiwgImdldEVudiIsICJnbG9iYWxFbnYiLCAiZ2V0RW52V2l0aG91dERlZmF1bHRzIiwgIl9fcmVhZCQxIiwgIl9fc3ByZWFkQXJyYXkkMSIsICJ0byIsICJmcm9tIiwgInBhY2siLCAibCIsICJoZXhUb0Jhc2U2NCIsICJoZXhTdHIiLCAiU1BBTl9JRF9CWVRFUyIsICJUUkFDRV9JRF9CWVRFUyIsICJSYW5kb21JZEdlbmVyYXRvciIsICJnZXRJZEdlbmVyYXRvciIsICJTSEFSRURfQ0hBUl9DT0RFU19BUlJBWSIsICJieXRlcyIsICJ1bnJlZlRpbWVyIiwgIl90aW1lciIsICJfX3ZhbHVlcyIsICJDb21wb3NpdGVQcm9wYWdhdG9yIiwgImNvbmZpZyIsICJwIiwgIngiLCAieSIsICJwcm9wYWdhdG9yIiwgImVyciIsICJjdHgiLCAiVkFMSURfS0VZX0NIQVJfUkFOR0UiLCAiVkFMSURfS0VZIiwgIlZBTElEX1ZFTkRPUl9LRVkiLCAiVkFMSURfS0VZX1JFR0VYIiwgIlZBTElEX1ZBTFVFX0JBU0VfUkVHRVgiLCAiSU5WQUxJRF9WQUxVRV9DT01NQV9FUVVBTF9SRUdFWCIsICJ2YWxpZGF0ZUtleSIsICJ2YWxpZGF0ZVZhbHVlIiwgIk1BWF9UUkFDRV9TVEFURV9JVEVNUyIsICJNQVhfVFJBQ0VfU1RBVEVfTEVOIiwgIkxJU1RfTUVNQkVSU19TRVBBUkFUT1IiLCAiTElTVF9NRU1CRVJfS0VZX1ZBTFVFX1NQTElUVEVSIiwgIlRyYWNlU3RhdGUiLCAicmF3VHJhY2VTdGF0ZSIsICJ0cmFjZVN0YXRlIiwgIl90aGlzIiwgImFnZyIsICJwYXJ0IiwgImxpc3RNZW1iZXIiLCAiVFJBQ0VfUEFSRU5UX0hFQURFUiIsICJUUkFDRV9TVEFURV9IRUFERVIiLCAiVkVSU0lPTiIsICJWRVJTSU9OX1BBUlQiLCAiVFJBQ0VfSURfUEFSVCIsICJQQVJFTlRfSURfUEFSVCIsICJGTEFHU19QQVJUIiwgIlRSQUNFX1BBUkVOVF9SRUdFWCIsICJwYXJzZVRyYWNlUGFyZW50IiwgInRyYWNlUGFyZW50IiwgIm1hdGNoIiwgIlczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IiLCAic3BhbkNvbnRleHQiLCAidHJhY2VQYXJlbnRIZWFkZXIiLCAidHJhY2VTdGF0ZUhlYWRlciIsICJzdGF0ZSIsICJSUENfTUVUQURBVEFfS0VZIiwgIlJQQ1R5cGUiLCAic2V0UlBDTWV0YWRhdGEiLCAibWV0YSIsICJkZWxldGVSUENNZXRhZGF0YSIsICJnZXRSUENNZXRhZGF0YSIsICJBbHdheXNPZmZTYW1wbGVyIiwgIkFsd2F5c09uU2FtcGxlciIsICJQYXJlbnRCYXNlZFNhbXBsZXIiLCAidHJhY2VJZCIsICJzcGFuTmFtZSIsICJzcGFuS2luZCIsICJsaW5rcyIsICJwYXJlbnRDb250ZXh0IiwgIlRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlciIsICJfcmF0aW8iLCAicmF0aW8iLCAiYWNjdW11bGF0aW9uIiwgInBvcyIsICJvYmplY3RUYWciLCAibnVsbFRhZyIsICJ1bmRlZmluZWRUYWciLCAiZnVuY1Byb3RvIiwgImZ1bmNUb1N0cmluZyIsICJvYmplY3RDdG9yU3RyaW5nIiwgImdldFByb3RvdHlwZSIsICJvdmVyQXJnIiwgIm9iamVjdFByb3RvIiwgImhhc093blByb3BlcnR5IiwgInN5bVRvU3RyaW5nVGFnIiwgIm5hdGl2ZU9iamVjdFRvU3RyaW5nIiwgImZ1bmMiLCAidHJhbnNmb3JtIiwgImFyZyIsICJpc1BsYWluT2JqZWN0IiwgImlzT2JqZWN0TGlrZSIsICJiYXNlR2V0VGFnIiwgInByb3RvIiwgIkN0b3IiLCAiZ2V0UmF3VGFnIiwgIm9iamVjdFRvU3RyaW5nIiwgImlzT3duIiwgInRhZyIsICJ1bm1hc2tlZCIsICJNQVhfTEVWRUwiLCAibWVyZ2UiLCAiYXJncyIsICJfaSIsICJvYmplY3RzIiwgIm1lcmdlVHdvT2JqZWN0cyIsICJ0YWtlVmFsdWUiLCAiaXNBcnJheSIsICJvbmUiLCAidHdvIiwgImxldmVsIiwgImlzUHJpbWl0aXZlIiwgImlzRnVuY3Rpb24iLCAiaiIsICJpc09iamVjdCIsICJrZXlzIiwgInNob3VsZE1lcmdlIiwgInR3b1ZhbHVlIiwgIm9iajEiLCAib2JqMiIsICJ3YXNPYmplY3RSZWZlcmVuY2VkIiwgImFycjEiLCAiYXJyMiIsICJvYmoiLCAiaW5mbyIsICJfX2V4dGVuZHMiLCAiZXh0ZW5kU3RhdGljcyIsICJkIiwgImIiLCAiX18iLCAiVGltZW91dEVycm9yIiwgIl9zdXBlciIsICJtZXNzYWdlIiwgImNhbGxXaXRoVGltZW91dCIsICJwcm9taXNlIiwgInRpbWVvdXQiLCAidGltZW91dEhhbmRsZSIsICJ0aW1lb3V0UHJvbWlzZSIsICJfcmVzb2x2ZSIsICJyZWplY3QiLCAicmVhc29uIiwgImlzV3JhcHBlZCIsICJEZWZlcnJlZCIsICJyZXNvbHZlIiwgIl9fcmVhZCIsICJfX3NwcmVhZEFycmF5IiwgIkJpbmRPbmNlRnV0dXJlIiwgIl9jYWxsYmFjayIsICJfdGhhdCIsICJfZXhwb3J0IiwgImV4cG9ydGVyIiwgImJhZ2dhZ2VVdGlscyIsICJpbnRlcm5hbCIsICJlc20iXQp9Cg==