Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@x-python/core

Package Overview
Dependencies
Maintainers
1
Versions
10
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@x-python/core - npm Package Compare versions

Comparing version 0.0.8 to 0.0.9

1

dist/main.d.ts

@@ -91,2 +91,3 @@ export declare type ActionCallbacks = Callbacks<ActionReturnValue>;

code: string;
options?: Record<string, unknown>;
};

@@ -93,0 +94,0 @@

136

dist/x-python.js

@@ -9,3 +9,3 @@ function h(I, g, C) {

}
function a(I, g) {
function X(I, g) {
var C = Object.keys(I);

@@ -20,8 +20,8 @@ if (Object.getOwnPropertySymbols) {

}
function V(I) {
function a(I) {
for (var g = 1; g < arguments.length; g++) {
var C = arguments[g] != null ? arguments[g] : {};
g % 2 ? a(Object(C), !0).forEach(function(A) {
g % 2 ? X(Object(C), !0).forEach(function(A) {
h(I, A, C[A]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(I, Object.getOwnPropertyDescriptors(C)) : a(Object(C)).forEach(function(A) {
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(I, Object.getOwnPropertyDescriptors(C)) : X(Object(C)).forEach(function(A) {
Object.defineProperty(I, A, Object.getOwnPropertyDescriptor(C, A));

@@ -41,3 +41,3 @@ });

}
function s(I) {
function u(I) {
return function g() {

@@ -47,4 +47,4 @@ for (var C = this, A = arguments.length, i = new Array(A), l = 0; l < A; l++)

return i.length >= I.length ? I.apply(this, i) : function() {
for (var b = arguments.length, c = new Array(b), Z = 0; Z < b; Z++)
c[Z] = arguments[Z];
for (var b = arguments.length, c = new Array(b), G = 0; G < b; G++)
c[G] = arguments[G];
return g.apply(C, [].concat(i, c));

@@ -54,3 +54,3 @@ };

}
function p(I) {
function S(I) {
return {}.toString.call(I).includes("Object");

@@ -61,3 +61,3 @@ }

}
function u(I) {
function n(I) {
return typeof I == "function";

@@ -69,3 +69,3 @@ }

function R(I, g) {
return p(g) || d("changeType"), Object.keys(g).some(function(C) {
return S(g) || d("changeType"), Object.keys(g).some(function(C) {
return !t(I, C);

@@ -75,16 +75,16 @@ }) && d("changeField"), g;

function J(I) {
u(I) || d("selectorType");
n(I) || d("selectorType");
}
function F(I) {
u(I) || p(I) || d("handlerType"), p(I) && Object.values(I).some(function(g) {
return !u(g);
function L(I) {
n(I) || S(I) || d("handlerType"), S(I) && Object.values(I).some(function(g) {
return !n(g);
}) && d("handlersType");
}
function L(I) {
I || d("initialIsRequired"), p(I) || d("initialType"), k(I) && d("initialContent");
function v(I) {
I || d("initialIsRequired"), S(I) || d("initialType"), k(I) && d("initialContent");
}
function v(I, g) {
function F(I, g) {
throw new Error(I[g] || I.default);
}
var r = {
var U = {
initialIsRequired: "initial state is required",

@@ -99,33 +99,33 @@ initialType: "initial state should be an object",

default: "an unknown error accured in `state-local` package"
}, d = s(v)(r), n = {
}, d = u(F)(U), W = {
changes: R,
selector: J,
handler: F,
initial: L
handler: L,
initial: v
};
function N(I) {
function r(I) {
var g = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
n.initial(I), n.handler(g);
W.initial(I), W.handler(g);
var C = {
current: I
}, A = s(z)(C, g), i = s(Q)(C), l = s(n.changes)(I), b = s(U)(C);
}, A = u(z)(C, g), i = u(Q)(C), l = u(W.changes)(I), b = u(N)(C);
function c() {
var G = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : function(S) {
return S;
var Z = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : function(s) {
return s;
};
return n.selector(G), G(C.current);
return W.selector(Z), Z(C.current);
}
function Z(G) {
e(A, i, l, b)(G);
function G(Z) {
e(A, i, l, b)(Z);
}
return [c, Z];
return [c, G];
}
function U(I, g) {
return u(g) ? g(I.current) : g;
function N(I, g) {
return n(g) ? g(I.current) : g;
}
function Q(I, g) {
return I.current = V(V({}, I.current), g), g;
return I.current = a(a({}, I.current), g), g;
}
function z(I, g, C) {
return u(g) ? g(I.current) : Object.keys(C).forEach(function(A) {
return n(g) ? g(I.current) : Object.keys(C).forEach(function(A) {
var i;

@@ -135,30 +135,30 @@ return (i = g[A]) === null || i === void 0 ? void 0 : i.call(g, I.current[A]);

}
var T = {
create: N
var j = {
create: r
};
const f = {
const O = {
loadPyodideOptions: {
indexURL: "https://cdn.jsdelivr.net/pyodide/v0.23.0/full/"
indexURL: "https://cdn.jsdelivr.net/pyodide/v0.23.2/full/"
}
};
var X = /* @__PURE__ */ ((I) => (I[I.READY = 0] = "READY", I))(X || {}), m = /* @__PURE__ */ ((I) => (I[I.EXEC = 0] = "EXEC", I[I.COMPLETE = 1] = "COMPLETE", I[I.INSTALL = 2] = "INSTALL", I[I.FORMAT = 3] = "FORMAT", I[I.JS_FN_CALL = 4] = "JS_FN_CALL", I))(m || {}), H = /* @__PURE__ */ ((I) => (I.FN = "__function__", I))(H || {});
function j(I) {
var H = /* @__PURE__ */ ((I) => (I[I.READY = 0] = "READY", I))(H || {}), m = /* @__PURE__ */ ((I) => (I[I.EXEC = 0] = "EXEC", I[I.COMPLETE = 1] = "COMPLETE", I[I.INSTALL = 2] = "INSTALL", I[I.FORMAT = 3] = "FORMAT", I[I.JS_FN_CALL = 4] = "JS_FN_CALL", I))(m || {}), V = /* @__PURE__ */ ((I) => (I.FN = "__function__", I))(V || {});
function T(I) {
let g;
return () => (g || (g = I()), g);
}
function O(I, g) {
function f(I, g) {
if (!g)
throw new Error(`a wrong id is provided from worker - callback with ${I} id doesn't exist`);
}
function M(I, g) {
function P(I, g) {
const { [g]: C, ...A } = I;
return A;
}
function W(I, g, C) {
function y(I, g, C) {
return { ...I, [g]: C };
}
function P(I, g, C) {
function D(I, g, C) {
return { ...I, [g]: C };
}
const w = "dmFyIGIsIE0sIGssICQsIEIgPSB7IGV4cG9ydHM6IHt9IH07CkIuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgewogIGZ1bmN0aW9uIGUoZCkgewogICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KGQpKSAmJiBpc0Zpbml0ZShkKTsKICB9CiAgZnVuY3Rpb24gdChkKSB7CiAgICByZXR1cm4gZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGQuc3Vic3RyaW5nKDEpOwogIH0KICBmdW5jdGlvbiBpKGQpIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXNbZF07CiAgICB9OwogIH0KICB2YXIgciA9IFsiaXNDb25zdHJ1Y3RvciIsICJpc0V2YWwiLCAiaXNOYXRpdmUiLCAiaXNUb3BsZXZlbCJdLCBuID0gWyJjb2x1bW5OdW1iZXIiLCAibGluZU51bWJlciJdLCBhID0gWyJmaWxlTmFtZSIsICJmdW5jdGlvbk5hbWUiLCAic291cmNlIl0sIGwgPSBbImFyZ3MiXSwgdSA9IFsiZXZhbE9yaWdpbiJdLCBzID0gci5jb25jYXQobiwgYSwgbCwgdSk7CiAgZnVuY3Rpb24gbyhkKSB7CiAgICBpZiAoZCkKICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBzLmxlbmd0aDsgbSsrKQogICAgICAgIGRbc1ttXV0gIT09IHZvaWQgMCAmJiB0aGlzWyJzZXQiICsgdChzW21dKV0oZFtzW21dXSk7CiAgfQogIG8ucHJvdG90eXBlID0geyBnZXRBcmdzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmFyZ3M7CiAgfSwgc2V0QXJnczogZnVuY3Rpb24oZCkgewogICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkKSAhPT0gIltvYmplY3QgQXJyYXldIikKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJncyBtdXN0IGJlIGFuIEFycmF5Iik7CiAgICB0aGlzLmFyZ3MgPSBkOwogIH0sIGdldEV2YWxPcmlnaW46IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZXZhbE9yaWdpbjsKICB9LCBzZXRFdmFsT3JpZ2luOiBmdW5jdGlvbihkKSB7CiAgICBpZiAoZCBpbnN0YW5jZW9mIG8pCiAgICAgIHRoaXMuZXZhbE9yaWdpbiA9IGQ7CiAgICBlbHNlIHsKICAgICAgaWYgKCEoZCBpbnN0YW5jZW9mIE9iamVjdCkpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXZhbCBPcmlnaW4gbXVzdCBiZSBhbiBPYmplY3Qgb3IgU3RhY2tGcmFtZSIpOwogICAgICB0aGlzLmV2YWxPcmlnaW4gPSBuZXcgbyhkKTsKICAgIH0KICB9LCB0b1N0cmluZzogZnVuY3Rpb24oKSB7CiAgICB2YXIgZCA9IHRoaXMuZ2V0RmlsZU5hbWUoKSB8fCAiIiwgbSA9IHRoaXMuZ2V0TGluZU51bWJlcigpIHx8ICIiLCB5ID0gdGhpcy5nZXRDb2x1bW5OdW1iZXIoKSB8fCAiIiwgZyA9IHRoaXMuZ2V0RnVuY3Rpb25OYW1lKCkgfHwgIiI7CiAgICByZXR1cm4gdGhpcy5nZXRJc0V2YWwoKSA/IGQgPyAiW2V2YWxdICgiICsgZCArICI6IiArIG0gKyAiOiIgKyB5ICsgIikiIDogIltldmFsXToiICsgbSArICI6IiArIHkgOiBnID8gZyArICIgKCIgKyBkICsgIjoiICsgbSArICI6IiArIHkgKyAiKSIgOiBkICsgIjoiICsgbSArICI6IiArIHk7CiAgfSB9LCBvLmZyb21TdHJpbmcgPSBmdW5jdGlvbihkKSB7CiAgICB2YXIgbSA9IGQuaW5kZXhPZigiKCIpLCB5ID0gZC5sYXN0SW5kZXhPZigiKSIpLCBnID0gZC5zdWJzdHJpbmcoMCwgbSksIHcgPSBkLnN1YnN0cmluZyhtICsgMSwgeSkuc3BsaXQoIiwiKSwgRiA9IGQuc3Vic3RyaW5nKHkgKyAxKTsKICAgIGlmIChGLmluZGV4T2YoIkAiKSA9PT0gMCkKICAgICAgdmFyIFIgPSAvQCguKz8pKD86OihcZCspKT8oPzo6KFxkKykpPyQvLmV4ZWMoRiwgIiIpLCBLID0gUlsxXSwgUSA9IFJbMl0sIFogPSBSWzNdOwogICAgcmV0dXJuIG5ldyBvKHsgZnVuY3Rpb25OYW1lOiBnLCBhcmdzOiB3IHx8IHZvaWQgMCwgZmlsZU5hbWU6IEssIGxpbmVOdW1iZXI6IFEgfHwgdm9pZCAwLCBjb2x1bW5OdW1iZXI6IFogfHwgdm9pZCAwIH0pOwogIH07CiAgZm9yICh2YXIgYyA9IDA7IGMgPCByLmxlbmd0aDsgYysrKQogICAgby5wcm90b3R5cGVbImdldCIgKyB0KHJbY10pXSA9IGkocltjXSksIG8ucHJvdG90eXBlWyJzZXQiICsgdChyW2NdKV0gPSBmdW5jdGlvbihkKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihtKSB7CiAgICAgICAgdGhpc1tkXSA9IEJvb2xlYW4obSk7CiAgICAgIH07CiAgICB9KHJbY10pOwogIGZvciAodmFyIHAgPSAwOyBwIDwgbi5sZW5ndGg7IHArKykKICAgIG8ucHJvdG90eXBlWyJnZXQiICsgdChuW3BdKV0gPSBpKG5bcF0pLCBvLnByb3RvdHlwZVsic2V0IiArIHQobltwXSldID0gZnVuY3Rpb24oZCkgewogICAgICByZXR1cm4gZnVuY3Rpb24obSkgewogICAgICAgIGlmICghZShtKSkKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZCArICIgbXVzdCBiZSBhIE51bWJlciIpOwogICAgICAgIHRoaXNbZF0gPSBOdW1iZXIobSk7CiAgICAgIH07CiAgICB9KG5bcF0pOwogIGZvciAodmFyIGYgPSAwOyBmIDwgYS5sZW5ndGg7IGYrKykKICAgIG8ucHJvdG90eXBlWyJnZXQiICsgdChhW2ZdKV0gPSBpKGFbZl0pLCBvLnByb3RvdHlwZVsic2V0IiArIHQoYVtmXSldID0gZnVuY3Rpb24oZCkgewogICAgICByZXR1cm4gZnVuY3Rpb24obSkgewogICAgICAgIHRoaXNbZF0gPSBTdHJpbmcobSk7CiAgICAgIH07CiAgICB9KGFbZl0pOwogIHJldHVybiBvOwp9KCk7CnZhciBlZSA9IChiID0gQi5leHBvcnRzLCBNID0gLyhefEApXFMrOlxkKy8sIGsgPSAvXlxzKmF0IC4qKFxTKzpcZCt8XChuYXRpdmVcKSkvbSwgJCA9IC9eKGV2YWxAKT8oXFtuYXRpdmUgY29kZV0pPyQvLCB7IHBhcnNlOiBmdW5jdGlvbihlKSB7CiAgaWYgKGUuc3RhY2t0cmFjZSAhPT0gdm9pZCAwIHx8IGVbIm9wZXJhI3NvdXJjZWxvYyJdICE9PSB2b2lkIDApCiAgICByZXR1cm4gdGhpcy5wYXJzZU9wZXJhKGUpOwogIGlmIChlLnN0YWNrICYmIGUuc3RhY2subWF0Y2goaykpCiAgICByZXR1cm4gdGhpcy5wYXJzZVY4T3JJRShlKTsKICBpZiAoZS5zdGFjaykKICAgIHJldHVybiB0aGlzLnBhcnNlRkZPclNhZmFyaShlKTsKICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwYXJzZSBnaXZlbiBFcnJvciBvYmplY3QiKTsKfSwgZXh0cmFjdExvY2F0aW9uOiBmdW5jdGlvbihlKSB7CiAgaWYgKGUuaW5kZXhPZigiOiIpID09PSAtMSkKICAgIHJldHVybiBbZV07CiAgdmFyIHQgPSAvKC4rPykoPzo6KFxkKykpPyg/OjooXGQrKSk/JC8uZXhlYyhlLnJlcGxhY2UoL1soKV0vZywgIiIpKTsKICByZXR1cm4gW3RbMV0sIHRbMl0gfHwgdm9pZCAwLCB0WzNdIHx8IHZvaWQgMF07Cn0sIHBhcnNlVjhPcklFOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuIGUuc3RhY2suc3BsaXQoYApgKS5maWx0ZXIoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICEhdC5tYXRjaChrKTsKICB9LCB0aGlzKS5tYXAoZnVuY3Rpb24odCkgewogICAgdC5pbmRleE9mKCIoZXZhbCAiKSA+IC0xICYmICh0ID0gdC5yZXBsYWNlKC9ldmFsIGNvZGUvZywgImV2YWwiKS5yZXBsYWNlKC8oXChldmFsIGF0IFteKCldKil8KCwuKiQpL2csICIiKSk7CiAgICB2YXIgaSA9IHQucmVwbGFjZSgvXlxzKy8sICIiKS5yZXBsYWNlKC9cKGV2YWwgY29kZS9nLCAiKCIpLnJlcGxhY2UoL14uKj9ccysvLCAiIiksIHIgPSBpLm1hdGNoKC8gKFwoLitcKSQpLyk7CiAgICBpID0gciA/IGkucmVwbGFjZShyWzBdLCAiIikgOiBpOwogICAgdmFyIG4gPSB0aGlzLmV4dHJhY3RMb2NhdGlvbihyID8gclsxXSA6IGkpLCBhID0gciAmJiBpIHx8IHZvaWQgMCwgbCA9IFsiZXZhbCIsICI8YW5vbnltb3VzPiJdLmluZGV4T2YoblswXSkgPiAtMSA/IHZvaWQgMCA6IG5bMF07CiAgICByZXR1cm4gbmV3IGIoeyBmdW5jdGlvbk5hbWU6IGEsIGZpbGVOYW1lOiBsLCBsaW5lTnVtYmVyOiBuWzFdLCBjb2x1bW5OdW1iZXI6IG5bMl0sIHNvdXJjZTogdCB9KTsKICB9LCB0aGlzKTsKfSwgcGFyc2VGRk9yU2FmYXJpOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuIGUuc3RhY2suc3BsaXQoYApgKS5maWx0ZXIoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICF0Lm1hdGNoKCQpOwogIH0sIHRoaXMpLm1hcChmdW5jdGlvbih0KSB7CiAgICBpZiAodC5pbmRleE9mKCIgPiBldmFsIikgPiAtMSAmJiAodCA9IHQucmVwbGFjZSgvIGxpbmUgKFxkKykoPzogPiBldmFsIGxpbmUgXGQrKSogPiBldmFsOlxkKzpcZCsvZywgIjokMSIpKSwgdC5pbmRleE9mKCJAIikgPT09IC0xICYmIHQuaW5kZXhPZigiOiIpID09PSAtMSkKICAgICAgcmV0dXJuIG5ldyBiKHsgZnVuY3Rpb25OYW1lOiB0IH0pOwogICAgdmFyIGkgPSAvKCguKiIuKyJbXkBdKik/W15AXSopKD86QCkvLCByID0gdC5tYXRjaChpKSwgbiA9IHIgJiYgclsxXSA/IHJbMV0gOiB2b2lkIDAsIGEgPSB0aGlzLmV4dHJhY3RMb2NhdGlvbih0LnJlcGxhY2UoaSwgIiIpKTsKICAgIHJldHVybiBuZXcgYih7IGZ1bmN0aW9uTmFtZTogbiwgZmlsZU5hbWU6IGFbMF0sIGxpbmVOdW1iZXI6IGFbMV0sIGNvbHVtbk51bWJlcjogYVsyXSwgc291cmNlOiB0IH0pOwogIH0sIHRoaXMpOwp9LCBwYXJzZU9wZXJhOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuICFlLnN0YWNrdHJhY2UgfHwgZS5tZXNzYWdlLmluZGV4T2YoYApgKSA+IC0xICYmIGUubWVzc2FnZS5zcGxpdChgCmApLmxlbmd0aCA+IGUuc3RhY2t0cmFjZS5zcGxpdChgCmApLmxlbmd0aCA/IHRoaXMucGFyc2VPcGVyYTkoZSkgOiBlLnN0YWNrID8gdGhpcy5wYXJzZU9wZXJhMTEoZSkgOiB0aGlzLnBhcnNlT3BlcmExMChlKTsKfSwgcGFyc2VPcGVyYTk6IGZ1bmN0aW9uKGUpIHsKICBmb3IgKHZhciB0ID0gL0xpbmUgKFxkKykuKnNjcmlwdCAoPzppbiApPyhcUyspL2ksIGkgPSBlLm1lc3NhZ2Uuc3BsaXQoYApgKSwgciA9IFtdLCBuID0gMiwgYSA9IGkubGVuZ3RoOyBuIDwgYTsgbiArPSAyKSB7CiAgICB2YXIgbCA9IHQuZXhlYyhpW25dKTsKICAgIGwgJiYgci5wdXNoKG5ldyBiKHsgZmlsZU5hbWU6IGxbMl0sIGxpbmVOdW1iZXI6IGxbMV0sIHNvdXJjZTogaVtuXSB9KSk7CiAgfQogIHJldHVybiByOwp9LCBwYXJzZU9wZXJhMTA6IGZ1bmN0aW9uKGUpIHsKICBmb3IgKHZhciB0ID0gL0xpbmUgKFxkKykuKnNjcmlwdCAoPzppbiApPyhcUyspKD86OiBJbiBmdW5jdGlvbiAoXFMrKSk/JC9pLCBpID0gZS5zdGFja3RyYWNlLnNwbGl0KGAKYCksIHIgPSBbXSwgbiA9IDAsIGEgPSBpLmxlbmd0aDsgbiA8IGE7IG4gKz0gMikgewogICAgdmFyIGwgPSB0LmV4ZWMoaVtuXSk7CiAgICBsICYmIHIucHVzaChuZXcgYih7IGZ1bmN0aW9uTmFtZTogbFszXSB8fCB2b2lkIDAsIGZpbGVOYW1lOiBsWzJdLCBsaW5lTnVtYmVyOiBsWzFdLCBzb3VyY2U6IGlbbl0gfSkpOwogIH0KICByZXR1cm4gcjsKfSwgcGFyc2VPcGVyYTExOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuIGUuc3RhY2suc3BsaXQoYApgKS5maWx0ZXIoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICEhdC5tYXRjaChNKSAmJiAhdC5tYXRjaCgvXkVycm9yIGNyZWF0ZWQgYXQvKTsKICB9LCB0aGlzKS5tYXAoZnVuY3Rpb24odCkgewogICAgdmFyIGksIHIgPSB0LnNwbGl0KCJAIiksIG4gPSB0aGlzLmV4dHJhY3RMb2NhdGlvbihyLnBvcCgpKSwgYSA9IHIuc2hpZnQoKSB8fCAiIiwgbCA9IGEucmVwbGFjZSgvPGFub255bW91cyBmdW5jdGlvbig6IChcdyspKT8+LywgIiQyIikucmVwbGFjZSgvXChbXildKlwpL2csICIiKSB8fCB2b2lkIDA7CiAgICBhLm1hdGNoKC9cKChbXildKilcKS8pICYmIChpID0gYS5yZXBsYWNlKC9eW14oXStcKChbXildKilcKSQvLCAiJDEiKSk7CiAgICB2YXIgdSA9IGkgPT09IHZvaWQgMCB8fCBpID09PSAiW2FyZ3VtZW50cyBub3QgYXZhaWxhYmxlXSIgPyB2b2lkIDAgOiBpLnNwbGl0KCIsIik7CiAgICByZXR1cm4gbmV3IGIoeyBmdW5jdGlvbk5hbWU6IGwsIGFyZ3M6IHUsIGZpbGVOYW1lOiBuWzBdLCBsaW5lTnVtYmVyOiBuWzFdLCBjb2x1bW5OdW1iZXI6IG5bMl0sIHNvdXJjZTogdCB9KTsKICB9LCB0aGlzKTsKfSB9KTsKY29uc3QgRSA9IHR5cGVvZiBwcm9jZXNzIDwgInUiICYmIHByb2Nlc3MucmVsZWFzZSAmJiBwcm9jZXNzLnJlbGVhc2UubmFtZSA9PT0gIm5vZGUiICYmIHByb2Nlc3MuYnJvd3NlciA9PT0gdm9pZCAwOwpsZXQgcSwgQywgSSwgWCwgeiwgSiwgVSwgViwgTjsKaWYgKEogPSBFID8gZnVuY3Rpb24oZSwgdCkgewogIHJldHVybiBJLnJlc29sdmUodCB8fCAiLiIsIGUpOwp9IDogZnVuY3Rpb24oZSwgdCkgewogIHJldHVybiB0ID09PSB2b2lkIDAgJiYgKHQgPSBsb2NhdGlvbiksIG5ldyBVUkwoZSwgdCkudG9TdHJpbmcoKTsKfSwgRSB8fCAoVSA9ICIvIiksIFYgPSBFID8gYXN5bmMgZnVuY3Rpb24oZSwgdCkgewogIGlmIChlLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSAmJiAoZSA9IGUuc2xpY2UoNykpLCBlLmluY2x1ZGVzKCI6Ly8iKSkgewogICAgbGV0IGkgPSBhd2FpdCBDKGUpOwogICAgaWYgKCFpLm9rKQogICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkICcke2V9JzogcmVxdWVzdCBmYWlsZWQuYCk7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgaS5hcnJheUJ1ZmZlcigpKTsKICB9CiAgewogICAgY29uc3QgaSA9IGF3YWl0IHoucmVhZEZpbGUoZSk7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaS5idWZmZXIsIGkuYnl0ZU9mZnNldCwgaS5ieXRlTGVuZ3RoKTsKICB9Cn0gOiBhc3luYyBmdW5jdGlvbihlLCB0KSB7CiAgY29uc3QgaSA9IG5ldyBVUkwoZSwgbG9jYXRpb24pOwogIGxldCByID0gdCA/IHsgaW50ZWdyaXR5OiB0IH0gOiB7fSwgbiA9IGF3YWl0IGZldGNoKGksIHIpOwogIGlmICghbi5vaykKICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgJyR7aX0nOiByZXF1ZXN0IGZhaWxlZC5gKTsKICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgbi5hcnJheUJ1ZmZlcigpKTsKfSwgZ2xvYmFsVGhpcy5kb2N1bWVudCkKICBOID0gYXN5bmMgKGUpID0+IGF3YWl0IGltcG9ydCgKICAgIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8KICAgIGUKICApOwplbHNlIGlmIChnbG9iYWxUaGlzLmltcG9ydFNjcmlwdHMpCiAgTiA9IGFzeW5jIChlKSA9PiB7CiAgICB0cnkgewogICAgICBnbG9iYWxUaGlzLmltcG9ydFNjcmlwdHMoZSk7CiAgICB9IGNhdGNoICh0KSB7CiAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBUeXBlRXJyb3IpKQogICAgICAgIHRocm93IHQ7CiAgICAgIGF3YWl0IGltcG9ydCgKICAgICAgICAvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovCiAgICAgICAgZQogICAgICApOwogICAgfQogIH07CmVsc2UgewogIGlmICghRSkKICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGRldGVybWluZSBydW50aW1lIGVudmlyb25tZW50Iik7CiAgTiA9IGFzeW5jIGZ1bmN0aW9uKGUpIHsKICAgIGUuc3RhcnRzV2l0aCgiZmlsZTovLyIpICYmIChlID0gZS5zbGljZSg3KSksIGUuaW5jbHVkZXMoIjovLyIpID8gWC5ydW5JblRoaXNDb250ZXh0KGF3YWl0IChhd2FpdCBDKGUpKS50ZXh0KCkpIDogYXdhaXQgaW1wb3J0KAogICAgICAvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovCiAgICAgIHEucGF0aFRvRmlsZVVSTChlKS5ocmVmCiAgICApOwogIH07Cn0KZnVuY3Rpb24gdGUoZSkgewogIHZhciB0ID0gdHlwZW9mIFN5bWJvbCA9PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5pdGVyYXRvciwgaSA9IHQgJiYgZVt0XSwgciA9IDA7CiAgaWYgKGkpCiAgICByZXR1cm4gaS5jYWxsKGUpOwogIGlmIChlICYmIHR5cGVvZiBlLmxlbmd0aCA9PSAibnVtYmVyIikKICAgIHJldHVybiB7IG5leHQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZSAmJiByID49IGUubGVuZ3RoICYmIChlID0gdm9pZCAwKSwgeyB2YWx1ZTogZSAmJiBlW3IrK10sIGRvbmU6ICFlIH07CiAgICB9IH07CiAgdGhyb3cgbmV3IFR5cGVFcnJvcih0ID8gIk9iamVjdCBpcyBub3QgaXRlcmFibGUuIiA6ICJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIik7Cn0KZnVuY3Rpb24gcmUoZSkgewogIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpCiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKICB2YXIgdCwgaSA9IGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOwogIHJldHVybiBpID8gaS5jYWxsKGUpIDogKGUgPSB0ZShlKSwgdCA9IHt9LCByKCJuZXh0IiksIHIoInRocm93IiksIHIoInJldHVybiIpLCB0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSwgdCk7CiAgZnVuY3Rpb24gcihuKSB7CiAgICB0W25dID0gZVtuXSAmJiBmdW5jdGlvbihhKSB7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihsLCB1KSB7CiAgICAgICAgKGZ1bmN0aW9uKHMsIG8sIGMsIHApIHsKICAgICAgICAgIFByb21pc2UucmVzb2x2ZShwKS50aGVuKGZ1bmN0aW9uKGYpIHsKICAgICAgICAgICAgcyh7IHZhbHVlOiBmLCBkb25lOiBjIH0pOwogICAgICAgICAgfSwgbyk7CiAgICAgICAgfSkobCwgdSwgKGEgPSBlW25dKGEpKS5kb25lLCBhLnZhbHVlKTsKICAgICAgfSk7CiAgICB9OwogIH0KfQpjb25zdCBuZSA9IGFzeW5jIChlKSA9PiB7CiAgY29uc3QgdCA9IFtdOwogIGF3YWl0IGFzeW5jIGZ1bmN0aW9uIHIobikgewogICAgdmFyIGEsIGw7CiAgICB0cnkgewogICAgICBmb3IgKHZhciB1LCBzID0gcmUobi52YWx1ZXMoKSk7ICEodSA9IGF3YWl0IHMubmV4dCgpKS5kb25lOyApIHsKICAgICAgICBjb25zdCBvID0gdS52YWx1ZTsKICAgICAgICB0LnB1c2gobyksIG8ua2luZCA9PT0gImRpcmVjdG9yeSIgJiYgYXdhaXQgcihvKTsKICAgICAgfQogICAgfSBjYXRjaCAobykgewogICAgICBhID0geyBlcnJvcjogbyB9OwogICAgfSBmaW5hbGx5IHsKICAgICAgdHJ5IHsKICAgICAgICB1ICYmICF1LmRvbmUgJiYgKGwgPSBzLnJldHVybikgJiYgYXdhaXQgbC5jYWxsKHMpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGlmIChhKQogICAgICAgICAgdGhyb3cgYS5lcnJvcjsKICAgICAgfQogICAgfQogIH0oZSk7CiAgY29uc3QgaSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgaS5zZXQoIi4iLCBlKTsKICBmb3IgKGNvbnN0IHIgb2YgdCkgewogICAgY29uc3QgbiA9IChhd2FpdCBlLnJlc29sdmUocikpLmpvaW4oIi8iKTsKICAgIGkuc2V0KG4sIHIpOwogIH0KICByZXR1cm4gaTsKfTsKZnVuY3Rpb24gaWUoZSwgdCkgewogIGxldCBpOwogIGkgPSB0LnN0ZExpYlVSTCAhPSBudWxsID8gdC5zdGRMaWJVUkwgOiB0LmluZGV4VVJMICsgInB5dGhvbl9zdGRsaWIuemlwIiwgZnVuY3Rpb24ociwgbikgewogICAgY29uc3QgYSA9IFYobik7CiAgICByLnByZVJ1bi5wdXNoKCgpID0+IHsKICAgICAgY29uc3QgbCA9IHIuX3B5X3ZlcnNpb25fbWFqb3IoKSwgdSA9IHIuX3B5X3ZlcnNpb25fbWlub3IoKTsKICAgICAgci5GUy5ta2RpclRyZWUoIi9saWIiKSwgci5GUy5ta2RpclRyZWUoYC9saWIvcHl0aG9uJHtsfS4ke3V9L3NpdGUtcGFja2FnZXNgKSwgci5hZGRSdW5EZXBlbmRlbmN5KCJpbnN0YWxsLXN0ZGxpYiIpLCBhLnRoZW4oKHMpID0+IHsKICAgICAgICByLkZTLndyaXRlRmlsZShgL2xpYi9weXRob24ke2x9JHt1fS56aXBgLCBzKTsKICAgICAgfSkuY2F0Y2goKHMpID0+IHsKICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBvY2N1cnJlZCB3aGlsZSBpbnN0YWxsaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5OiIpLCBjb25zb2xlLmVycm9yKHMpOwogICAgICB9KS5maW5hbGx5KCgpID0+IHsKICAgICAgICByLnJlbW92ZVJ1bkRlcGVuZGVuY3koImluc3RhbGwtc3RkbGliIik7CiAgICAgIH0pOwogICAgfSk7CiAgfShlLCBpKSwgZnVuY3Rpb24ociwgbikgewogICAgci5wcmVSdW4ucHVzaChmdW5jdGlvbigpIHsKICAgICAgdHJ5IHsKICAgICAgICByLkZTLm1rZGlyVHJlZShuKTsKICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIG9jY3VycmVkIHdoaWxlIG1ha2luZyBhIGhvbWUgZGlyZWN0b3J5ICcke259JzpgKSwgY29uc29sZS5lcnJvcihhKSwgY29uc29sZS5lcnJvcigiVXNpbmcgJy8nIGZvciBhIGhvbWUgZGlyZWN0b3J5IGluc3RlYWQiKSwgbiA9ICIvIjsKICAgICAgfQogICAgICByLkVOVi5IT01FID0gbiwgci5GUy5jaGRpcihuKTsKICAgIH0pOwogIH0oZSwgdC5ob21lZGlyKSwgZnVuY3Rpb24ociwgbikgewogICAgci5wcmVSdW4ucHVzaCgoKSA9PiB7CiAgICAgIGZvciAoY29uc3QgYSBvZiBuKQogICAgICAgIHIuRlMubWtkaXJUcmVlKGEpLCByLkZTLm1vdW50KHIuRlMuZmlsZXN5c3RlbXMuTk9ERUZTLCB7IHJvb3Q6IGEgfSwgYSk7CiAgICB9KTsKICB9KGUsIHQuX25vZGVfbW91bnRzKSwgZS5wcmVSdW4ucHVzaCgoKSA9PiBmdW5jdGlvbihyKSB7CiAgICBjb25zdCBuID0gci5GUywgYSA9IHIuRlMuZmlsZXN5c3RlbXMuTUVNRlMsIGwgPSByLlBBVEgsIHUgPSB7IERJUl9NT0RFOiAxNjg5NSwgRklMRV9NT0RFOiAzMzI3OSwgbW91bnQ6IGZ1bmN0aW9uKHMpIHsKICAgICAgaWYgKCFzLm9wdHMuZmlsZVN5c3RlbUhhbmRsZSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIm9wdHMuZmlsZVN5c3RlbUhhbmRsZSBpcyByZXF1aXJlZCIpOwogICAgICByZXR1cm4gYS5tb3VudC5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgfSwgc3luY2ZzOiBhc3luYyAocywgbywgYykgPT4gewogICAgICB0cnkgewogICAgICAgIGNvbnN0IHAgPSB1LmdldExvY2FsU2V0KHMpLCBmID0gYXdhaXQgdS5nZXRSZW1vdGVTZXQocyksIGQgPSBvID8gZiA6IHAsIG0gPSBvID8gcCA6IGY7CiAgICAgICAgYXdhaXQgdS5yZWNvbmNpbGUocywgZCwgbSksIGMobnVsbCk7CiAgICAgIH0gY2F0Y2ggKHApIHsKICAgICAgICBjKHApOwogICAgICB9CiAgICB9LCBnZXRMb2NhbFNldDogKHMpID0+IHsKICAgICAgbGV0IG8gPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgZnVuY3Rpb24gYyhkKSB7CiAgICAgICAgcmV0dXJuIGQgIT09ICIuIiAmJiBkICE9PSAiLi4iOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHAoZCkgewogICAgICAgIHJldHVybiAobSkgPT4gbC5qb2luMihkLCBtKTsKICAgICAgfQogICAgICBsZXQgZiA9IG4ucmVhZGRpcihzLm1vdW50cG9pbnQpLmZpbHRlcihjKS5tYXAocChzLm1vdW50cG9pbnQpKTsKICAgICAgZm9yICg7IGYubGVuZ3RoOyApIHsKICAgICAgICBsZXQgZCA9IGYucG9wKCksIG0gPSBuLnN0YXQoZCk7CiAgICAgICAgbi5pc0RpcihtLm1vZGUpICYmIGYucHVzaC5hcHBseShmLCBuLnJlYWRkaXIoZCkuZmlsdGVyKGMpLm1hcChwKGQpKSksIG9bZF0gPSB7IHRpbWVzdGFtcDogbS5tdGltZSwgbW9kZTogbS5tb2RlIH07CiAgICAgIH0KICAgICAgcmV0dXJuIHsgdHlwZTogImxvY2FsIiwgZW50cmllczogbyB9OwogICAgfSwgZ2V0UmVtb3RlU2V0OiBhc3luYyAocykgPT4gewogICAgICBjb25zdCBvID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIGMgPSBhd2FpdCBuZShzLm9wdHMuZmlsZVN5c3RlbUhhbmRsZSk7CiAgICAgIGZvciAoY29uc3QgW3AsIGZdIG9mIGMpCiAgICAgICAgcCAhPT0gIi4iICYmIChvW2wuam9pbjIocy5tb3VudHBvaW50LCBwKV0gPSB7IHRpbWVzdGFtcDogZi5raW5kID09PSAiZmlsZSIgPyAoYXdhaXQgZi5nZXRGaWxlKCkpLmxhc3RNb2RpZmllZERhdGUgOiBuZXcgRGF0ZSgpLCBtb2RlOiBmLmtpbmQgPT09ICJmaWxlIiA/IHUuRklMRV9NT0RFIDogdS5ESVJfTU9ERSB9KTsKICAgICAgcmV0dXJuIHsgdHlwZTogInJlbW90ZSIsIGVudHJpZXM6IG8sIGhhbmRsZXM6IGMgfTsKICAgIH0sIGxvYWRMb2NhbEVudHJ5OiAocykgPT4gewogICAgICBjb25zdCBvID0gbi5sb29rdXBQYXRoKHMpLm5vZGUsIGMgPSBuLnN0YXQocyk7CiAgICAgIGlmIChuLmlzRGlyKGMubW9kZSkpCiAgICAgICAgcmV0dXJuIHsgdGltZXN0YW1wOiBjLm10aW1lLCBtb2RlOiBjLm1vZGUgfTsKICAgICAgaWYgKG4uaXNGaWxlKGMubW9kZSkpCiAgICAgICAgcmV0dXJuIG8uY29udGVudHMgPSBhLmdldEZpbGVEYXRhQXNUeXBlZEFycmF5KG8pLCB7IHRpbWVzdGFtcDogYy5tdGltZSwgbW9kZTogYy5tb2RlLCBjb250ZW50czogby5jb250ZW50cyB9OwogICAgICB0aHJvdyBuZXcgRXJyb3IoIm5vZGUgdHlwZSBub3Qgc3VwcG9ydGVkIik7CiAgICB9LCBzdG9yZUxvY2FsRW50cnk6IChzLCBvKSA9PiB7CiAgICAgIGlmIChuLmlzRGlyKG8ubW9kZSkpCiAgICAgICAgbi5ta2RpclRyZWUocywgby5tb2RlKTsKICAgICAgZWxzZSB7CiAgICAgICAgaWYgKCFuLmlzRmlsZShvLm1vZGUpKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJub2RlIHR5cGUgbm90IHN1cHBvcnRlZCIpOwogICAgICAgIG4ud3JpdGVGaWxlKHMsIG8uY29udGVudHMsIHsgY2FuT3duOiAhMCB9KTsKICAgICAgfQogICAgICBuLmNobW9kKHMsIG8ubW9kZSksIG4udXRpbWUocywgby50aW1lc3RhbXAsIG8udGltZXN0YW1wKTsKICAgIH0sIHJlbW92ZUxvY2FsRW50cnk6IChzKSA9PiB7CiAgICAgIHZhciBvID0gbi5zdGF0KHMpOwogICAgICBuLmlzRGlyKG8ubW9kZSkgPyBuLnJtZGlyKHMpIDogbi5pc0ZpbGUoby5tb2RlKSAmJiBuLnVubGluayhzKTsKICAgIH0sIGxvYWRSZW1vdGVFbnRyeTogYXN5bmMgKHMpID0+IHsKICAgICAgaWYgKHMua2luZCA9PT0gImZpbGUiKSB7CiAgICAgICAgY29uc3QgbyA9IGF3YWl0IHMuZ2V0RmlsZSgpOwogICAgICAgIHJldHVybiB7IGNvbnRlbnRzOiBuZXcgVWludDhBcnJheShhd2FpdCBvLmFycmF5QnVmZmVyKCkpLCBtb2RlOiB1LkZJTEVfTU9ERSwgdGltZXN0YW1wOiBvLmxhc3RNb2RpZmllZERhdGUgfTsKICAgICAgfQogICAgICBpZiAocy5raW5kID09PSAiZGlyZWN0b3J5IikKICAgICAgICByZXR1cm4geyBtb2RlOiB1LkRJUl9NT0RFLCB0aW1lc3RhbXA6IG5ldyBEYXRlKCkgfTsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGtpbmQ6ICIgKyBzLmtpbmQpOwogICAgfSwgc3RvcmVSZW1vdGVFbnRyeTogYXN5bmMgKHMsIG8sIGMpID0+IHsKICAgICAgY29uc3QgcCA9IHMuZ2V0KGwuZGlybmFtZShvKSksIGYgPSBuLmlzRmlsZShjLm1vZGUpID8gYXdhaXQgcC5nZXRGaWxlSGFuZGxlKGwuYmFzZW5hbWUobyksIHsgY3JlYXRlOiAhMCB9KSA6IGF3YWl0IHAuZ2V0RGlyZWN0b3J5SGFuZGxlKGwuYmFzZW5hbWUobyksIHsgY3JlYXRlOiAhMCB9KTsKICAgICAgaWYgKGYua2luZCA9PT0gImZpbGUiKSB7CiAgICAgICAgY29uc3QgZCA9IGF3YWl0IGYuY3JlYXRlV3JpdGFibGUoKTsKICAgICAgICBhd2FpdCBkLndyaXRlKGMuY29udGVudHMpLCBhd2FpdCBkLmNsb3NlKCk7CiAgICAgIH0KICAgICAgcy5zZXQobywgZik7CiAgICB9LCByZW1vdmVSZW1vdGVFbnRyeTogYXN5bmMgKHMsIG8pID0+IHsKICAgICAgYXdhaXQgcy5nZXQobC5kaXJuYW1lKG8pKS5yZW1vdmVFbnRyeShsLmJhc2VuYW1lKG8pKSwgcy5kZWxldGUobyk7CiAgICB9LCByZWNvbmNpbGU6IGFzeW5jIChzLCBvLCBjKSA9PiB7CiAgICAgIGxldCBwID0gMDsKICAgICAgY29uc3QgZiA9IFtdOwogICAgICBPYmplY3Qua2V5cyhvLmVudHJpZXMpLmZvckVhY2goZnVuY3Rpb24oeSkgewogICAgICAgIGNvbnN0IGcgPSBvLmVudHJpZXNbeV0sIHcgPSBjLmVudHJpZXNbeV07CiAgICAgICAgKCF3IHx8IG4uaXNGaWxlKGcubW9kZSkgJiYgZy50aW1lc3RhbXAuZ2V0VGltZSgpID4gdy50aW1lc3RhbXAuZ2V0VGltZSgpKSAmJiAoZi5wdXNoKHkpLCBwKyspOwogICAgICB9KSwgZi5zb3J0KCk7CiAgICAgIGNvbnN0IGQgPSBbXTsKICAgICAgaWYgKE9iamVjdC5rZXlzKGMuZW50cmllcykuZm9yRWFjaChmdW5jdGlvbih5KSB7CiAgICAgICAgby5lbnRyaWVzW3ldIHx8IChkLnB1c2goeSksIHArKyk7CiAgICAgIH0pLCBkLnNvcnQoKS5yZXZlcnNlKCksICFwKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgbSA9IG8udHlwZSA9PT0gInJlbW90ZSIgPyBvLmhhbmRsZXMgOiBjLmhhbmRsZXM7CiAgICAgIGZvciAoY29uc3QgeSBvZiBmKSB7CiAgICAgICAgY29uc3QgZyA9IGwubm9ybWFsaXplKHkucmVwbGFjZShzLm1vdW50cG9pbnQsICIvIikpLnN1YnN0cmluZygxKTsKICAgICAgICBpZiAoYy50eXBlID09PSAibG9jYWwiKSB7CiAgICAgICAgICBjb25zdCB3ID0gbS5nZXQoZyksIEYgPSBhd2FpdCB1LmxvYWRSZW1vdGVFbnRyeSh3KTsKICAgICAgICAgIHUuc3RvcmVMb2NhbEVudHJ5KHksIEYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCB3ID0gdS5sb2FkTG9jYWxFbnRyeSh5KTsKICAgICAgICAgIGF3YWl0IHUuc3RvcmVSZW1vdGVFbnRyeShtLCBnLCB3KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChjb25zdCB5IG9mIGQpCiAgICAgICAgaWYgKGMudHlwZSA9PT0gImxvY2FsIikKICAgICAgICAgIHUucmVtb3ZlTG9jYWxFbnRyeSh5KTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGNvbnN0IGcgPSBsLm5vcm1hbGl6ZSh5LnJlcGxhY2Uocy5tb3VudHBvaW50LCAiLyIpKS5zdWJzdHJpbmcoMSk7CiAgICAgICAgICBhd2FpdCB1LnJlbW92ZVJlbW90ZUVudHJ5KG0sIGcpOwogICAgICAgIH0KICAgIH0gfTsKICAgIHIuRlMuZmlsZXN5c3RlbXMuTkFUSVZFRlNfQVNZTkMgPSB1OwogIH0oZSkpOwp9CmZ1bmN0aW9uIG9lKGUsIHQpIHsKICBlLnJ1blB5dGhvbkludGVybmFsX2RpY3QgPSBlLl9weW9kaWRlLl9iYXNlLmV2YWxfY29kZSgie30iKSwgZS5pbXBvcnRsaWIgPSBlLnJ1blB5dGhvbkludGVybmFsKCJpbXBvcnQgaW1wb3J0bGliOyBpbXBvcnRsaWIiKTsKICBsZXQgaSA9IGUuaW1wb3J0bGliLmltcG9ydF9tb2R1bGU7CiAgZS5zeXMgPSBpKCJzeXMiKSwgZS5zeXMucGF0aC5pbnNlcnQoMCwgdC5ob21lZGlyKSwgZS5vcyA9IGkoIm9zIik7CiAgbGV0IHIgPSBlLnJ1blB5dGhvbkludGVybmFsKCJpbXBvcnQgX19tYWluX187IF9fbWFpbl9fLl9fZGljdF9fIiksIG4gPSBlLnJ1blB5dGhvbkludGVybmFsKCJpbXBvcnQgYnVpbHRpbnM7IGJ1aWx0aW5zLl9fZGljdF9fIik7CiAgdmFyIGE7CiAgZS5nbG9iYWxzID0gKGEgPSBuLCBuZXcgUHJveHkociwgeyBnZXQ6IChzLCBvKSA9PiBvID09PSAiZ2V0IiA/IChjKSA9PiB7CiAgICBsZXQgcCA9IHMuZ2V0KGMpOwogICAgcmV0dXJuIHAgPT09IHZvaWQgMCAmJiAocCA9IGEuZ2V0KGMpKSwgcDsKICB9IDogbyA9PT0gImhhcyIgPyAoYykgPT4gcy5oYXMoYykgfHwgYS5oYXMoYykgOiBSZWZsZWN0LmdldChzLCBvKSB9KSk7CiAgbGV0IGwgPSBlLl9weW9kaWRlLl9pbXBvcnRob29rOwogIGwucmVnaXN0ZXJfanNfZmluZGVyKCksIGwucmVnaXN0ZXJfanNfbW9kdWxlKCJqcyIsIHQuanNnbG9iYWxzKTsKICBsZXQgdSA9IGUubWFrZVB1YmxpY0FQSSgpOwogIHJldHVybiBsLnJlZ2lzdGVyX2pzX21vZHVsZSgicHlvZGlkZV9qcyIsIHUpLCBlLnB5b2RpZGVfcHkgPSBpKCJweW9kaWRlIiksIGUucHlvZGlkZV9jb2RlID0gaSgicHlvZGlkZS5jb2RlIiksIGUucHlvZGlkZV9mZmkgPSBpKCJweW9kaWRlLmZmaSIpLCBlLnBhY2thZ2VfbG9hZGVyID0gaSgicHlvZGlkZS5fcGFja2FnZV9sb2FkZXIiKSwgZS5zaXRlcGFja2FnZXMgPSBlLnBhY2thZ2VfbG9hZGVyLlNJVEVfUEFDS0FHRVMuX19zdHJfXygpLCBlLmRzb2RpciA9IGUucGFja2FnZV9sb2FkZXIuRFNPX0RJUi5fX3N0cl9fKCksIGUuZGVmYXVsdExkTGlicmFyeVBhdGggPSBbZS5kc29kaXIsIGUuc2l0ZXBhY2thZ2VzXSwgZS5vcy5lbnZpcm9uLl9fc2V0aXRlbV9fKCJMRF9MSUJSQVJZX1BBVEgiLCBlLmRlZmF1bHRMZExpYnJhcnlQYXRoLmpvaW4oIjoiKSksIHUucHlvZGlkZV9weSA9IGUucHlvZGlkZV9weSwgdS5nbG9iYWxzID0gZS5nbG9iYWxzLCB1Owp9CmFzeW5jIGZ1bmN0aW9uIGFlKGUgPSB7fSkgewogIGF3YWl0IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgaWYgKCFFIHx8IChxID0gKGF3YWl0IGltcG9ydCgiLi9fX3ZpdGUtYnJvd3Nlci1leHRlcm5hbC01MDAzZDI5Yy5qcyIpKS5kZWZhdWx0LCB6ID0gYXdhaXQgaW1wb3J0KCIuL19fdml0ZS1icm93c2VyLWV4dGVybmFsLTUwMDNkMjljLmpzIiksIEMgPSBnbG9iYWxUaGlzLmZldGNoID8gZmV0Y2ggOiAoYXdhaXQgaW1wb3J0KCIuL2luZGV4LTgzODU0MzZmLmpzIikpLmRlZmF1bHQsIFggPSAoYXdhaXQgaW1wb3J0KCIuL19fdml0ZS1icm93c2VyLWV4dGVybmFsLTUwMDNkMjljLmpzIikpLmRlZmF1bHQsIEkgPSBhd2FpdCBpbXBvcnQoIi4vX192aXRlLWJyb3dzZXItZXh0ZXJuYWwtNTAwM2QyOWMuanMiKSwgVSA9IEkuc2VwLCB0eXBlb2YgcmVxdWlyZSA8ICJ1IikpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGMgPSB7IGZzOiBhd2FpdCBpbXBvcnQoIi4vX192aXRlLWJyb3dzZXItZXh0ZXJuYWwtNTAwM2QyOWMuanMiKSwgY3J5cHRvOiBhd2FpdCBpbXBvcnQoIi4vX192aXRlLWJyb3dzZXItZXh0ZXJuYWwtNTAwM2QyOWMuanMiKSwgd3M6IGF3YWl0IGltcG9ydCgiLi9fX3ZpdGUtYnJvd3Nlci1leHRlcm5hbC01MDAzZDI5Yy5qcyIpLCBjaGlsZF9wcm9jZXNzOiBhd2FpdCBpbXBvcnQoIi4vX192aXRlLWJyb3dzZXItZXh0ZXJuYWwtNTAwM2QyOWMuanMiKSB9OwogICAgZ2xvYmFsVGhpcy5yZXF1aXJlID0gZnVuY3Rpb24ocCkgewogICAgICByZXR1cm4gY1twXTsKICAgIH07CiAgfSgpOwogIGxldCB0ID0gZS5pbmRleFVSTCB8fCBmdW5jdGlvbigpIHsKICAgIGlmICh0eXBlb2YgX19kaXJuYW1lID09ICJzdHJpbmciKQogICAgICByZXR1cm4gX19kaXJuYW1lOwogICAgbGV0IGM7CiAgICB0cnkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgIH0gY2F0Y2ggKGQpIHsKICAgICAgYyA9IGQ7CiAgICB9CiAgICBsZXQgcCA9IGVlLnBhcnNlKGMpWzBdLmZpbGVOYW1lOwogICAgY29uc3QgZiA9IHAubGFzdEluZGV4T2YoVSk7CiAgICBpZiAoZiA9PT0gLTEpCiAgICAgIHRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IGV4dHJhY3QgaW5kZXhVUkwgcGF0aCBmcm9tIHB5b2RpZGUgbW9kdWxlIGxvY2F0aW9uIik7CiAgICByZXR1cm4gcC5zbGljZSgwLCBmKTsKICB9KCk7CiAgdCA9IEoodCksIHQuZW5kc1dpdGgoIi8iKSB8fCAodCArPSAiLyIpLCBlLmluZGV4VVJMID0gdDsKICBjb25zdCBpID0geyBmdWxsU3RkTGliOiAhMSwganNnbG9iYWxzOiBnbG9iYWxUaGlzLCBzdGRpbjogZ2xvYmFsVGhpcy5wcm9tcHQgPyBnbG9iYWxUaGlzLnByb21wdCA6IHZvaWQgMCwgaG9tZWRpcjogIi9ob21lL3B5b2RpZGUiLCBsb2NrRmlsZVVSTDogdCArICJyZXBvZGF0YS5qc29uIiwgYXJnczogW10sIF9ub2RlX21vdW50czogW10gfSwgciA9IE9iamVjdC5hc3NpZ24oaSwgZSksIG4gPSBmdW5jdGlvbigpIHsKICAgIGxldCBjID0geyBub0ltYWdlRGVjb2Rpbmc6ICEwLCBub0F1ZGlvRGVjb2Rpbmc6ICEwLCBub1dhc21EZWNvZGluZzogITEsIHByZVJ1bjogW10sIHF1aXQ6IChwLCBmKSA9PiB7CiAgICAgIHRocm93IGMuZXhpdGVkID0geyBzdGF0dXM6IHAsIHRvVGhyb3c6IGYgfSwgZjsKICAgIH0gfTsKICAgIHJldHVybiBjOwogIH0oKTsKICBuLnByaW50ID0gci5zdGRvdXQsIG4ucHJpbnRFcnIgPSByLnN0ZGVyciwgbi5hcmd1bWVudHMgPSByLmFyZ3M7CiAgY29uc3QgYSA9IHsgY29uZmlnOiByIH07CiAgbi5BUEkgPSBhLCBpZShuLCByKTsKICBjb25zdCBsID0gbmV3IFByb21pc2UoKGMpID0+IG4ucG9zdFJ1biA9IGMpOwogIGlmIChuLmxvY2F0ZUZpbGUgPSAoYykgPT4gci5pbmRleFVSTCArIGMsIHR5cGVvZiBfY3JlYXRlUHlvZGlkZU1vZHVsZSAhPSAiZnVuY3Rpb24iKSB7CiAgICBjb25zdCBjID0gYCR7ci5pbmRleFVSTH1weW9kaWRlLmFzbS5qc2A7CiAgICBhd2FpdCBOKGMpOwogIH0KICBpZiAoYXdhaXQgX2NyZWF0ZVB5b2RpZGVNb2R1bGUobiksIGF3YWl0IGwsIG4uZXhpdGVkKQogICAgdGhyb3cgbi5leGl0ZWQudG9UaHJvdzsKICBpZiAoYS52ZXJzaW9uICE9PSAiMC4yMy4wIikKICAgIHRocm93IG5ldyBFcnJvcihgUHlvZGlkZSB2ZXJzaW9uIGRvZXMgbm90IG1hdGNoOiAnMC4yMy4wJyA8PT0+ICcke2EudmVyc2lvbn0nLiBJZiB5b3UgdXBkYXRlZCB0aGUgUHlvZGlkZSB2ZXJzaW9uLCBtYWtlIHN1cmUgeW91IGFsc28gdXBkYXRlZCB0aGUgJ2luZGV4VVJMJyBwYXJhbWV0ZXIgcGFzc2VkIHRvIGxvYWRQeW9kaWRlLmApOwogIG4ubG9jYXRlRmlsZSA9IChjKSA9PiB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkRpZG4ndCBleHBlY3QgdG8gbG9hZCBhbnkgbW9yZSBmaWxlX3BhY2thZ2VyIGZpbGVzISIpOwogIH07CiAgbGV0IFt1LCBzXSA9IGEucmF3UnVuKCJpbXBvcnQgX3B5b2RpZGVfY29yZSIpOwogIHUgJiYgbi5BUEkuZmF0YWxfbG9hZGluZ19lcnJvcihgRmFpbGVkIHRvIGltcG9ydCBfcHlvZGlkZV9jb3JlCmAsIHMpOwogIGNvbnN0IG8gPSBvZShhLCByKTsKICBpZiAoby52ZXJzaW9uLmluY2x1ZGVzKCJkZXYiKSB8fCBhLnNldENkblVybChgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L3B5b2RpZGUvdiR7by52ZXJzaW9ufS9mdWxsL2ApLCBhd2FpdCBhLnBhY2thZ2VJbmRleFJlYWR5LCBhLl9weW9kaWRlLl9pbXBvcnRob29rLnJlZ2lzdGVyX21vZHVsZV9ub3RfZm91bmRfaG9vayhhLl9pbXBvcnRfbmFtZV90b19wYWNrYWdlX25hbWUsIGEucmVwb2RhdGFfdW52ZW5kb3JlZF9zdGRsaWJzX2FuZF90ZXN0KSwgYS5yZXBvZGF0YV9pbmZvLnZlcnNpb24gIT09ICIwLjIzLjAiKQogICAgdGhyb3cgbmV3IEVycm9yKCJMb2NrIGZpbGUgdmVyc2lvbiBkb2Vzbid0IG1hdGNoIFB5b2RpZGUgdmVyc2lvbiIpOwogIHJldHVybiBhLnBhY2thZ2VfbG9hZGVyLmluaXRfbG9hZGVkX3BhY2thZ2VzKCksIHIuZnVsbFN0ZExpYiAmJiBhd2FpdCBvLmxvYWRQYWNrYWdlKGEucmVwb2RhdGFfdW52ZW5kb3JlZF9zdGRsaWJzKSwgYS5pbml0aWFsaXplU3RyZWFtcyhyLnN0ZGluLCByLnN0ZG91dCwgci5zdGRlcnIpLCBvOwp9CmNvbnN0IHNlID0gewogIGxvYWRQeW9kaWRlT3B0aW9uczogewogICAgaW5kZXhVUkw6ICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvcHlvZGlkZS92MC4yMy4wL2Z1bGwvIgogIH0KfTsKdmFyIGNlID0gYCMgcHlyaWdodDogcmVwb3J0TWlzc2luZ0ltcG9ydHM9ZmFsc2UKIyB0eXBlOiBpZ25vcmUKCiMgYmxhY2sKaW1wb3J0IHN5cwppbXBvcnQgbWljcm9waXAKaW1wb3J0IGFzeW5jaW8Kc3lzLm1vZHVsZXNbIl9tdWx0aXByb2Nlc3NpbmciXSA9IG9iamVjdAoKYXdhaXQgbWljcm9waXAuaW5zdGFsbCgiamVkaSIpCmF3YWl0IG1pY3JvcGlwLmluc3RhbGwoImJsYWNrIikKCmltcG9ydCBqZWRpCmZyb20gYmxhY2sgaW1wb3J0IGZvcm1hdF9zdHIsIEZpbGVNb2RlCgoKZGVmIGdldF9hdXRvY29tcGxldGlvbihjb2RlLCBsaW5lLCBjb2x1bW4pOgogICAgcmVzdWx0ID0gamVkaS5JbnRlcnByZXRlcihjb2RlLCBbZ2xvYmFscygpLCBsb2NhbHMoKV0pCgogICAgY29tcGxldGlvbnMgPSByZXN1bHQuY29tcGxldGUobGluZSwgY29sdW1uKQoKICAgIG1hdGNoZXMgPSBbXQogICAgZm9yIGNvbXAgaW4gY29tcGxldGlvbnM6CiAgICAgICAgbWF0Y2hlcy5hcHBlbmQoZGljdCgKICAgICAgICAgICAgbmFtZT1jb21wLm5hbWUsCiAgICAgICAgICAgIHR5cGU9Y29tcC50eXBlLAogICAgICAgICAgICBkZXNjcmlwdGlvbj1jb21wLmRlc2NyaXB0aW9uLAogICAgICAgICAgICBmdWxsX25hbWU9Y29tcC5mdWxsX25hbWUKICAgICAgICApKQoKICAgIHJldHVybiB7CiAgICAgICAgIm1hdGNoZXMiOiBtYXRjaGVzCiAgICB9CgoKYXN5bmMgZGVmIGluc3RhbGxfcGFjYWtnZShwYWNrYWdlKToKICAgIHRyeToKICAgICAgICBhd2FpdCBtaWNyb3BpcC5pbnN0YWxsKHBhY2thZ2UsIGtlZXBfZ29pbmc9VHJ1ZSkKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3VjY2VzcyI6IFRydWUKICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInN1Y2Nlc3MiOiBGYWxzZSwKICAgICAgICAgICAgImVycm9yIjogc3RyKGUpCiAgICAgICAgfQoKCmRlZiBmb3JtYXRfY29kZShjb2RlKToKICAgIHJldHVybiBmb3JtYXRfc3RyKGNvZGUsIG1vZGU9RmlsZU1vZGUoKSkKYDsKZnVuY3Rpb24gbGUoZSwgdCwgaSkgewogIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgdmFsdWU6IGksCiAgICBlbnVtZXJhYmxlOiAhMCwKICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICB3cml0YWJsZTogITAKICB9KSA6IGVbdF0gPSBpLCBlOwp9CmZ1bmN0aW9uIEEoZSwgdCkgewogIHZhciBpID0gT2JqZWN0LmtleXMoZSk7CiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgIHZhciByID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgIHQgJiYgKHIgPSByLmZpbHRlcihmdW5jdGlvbihuKSB7CiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG4pLmVudW1lcmFibGU7CiAgICB9KSksIGkucHVzaC5hcHBseShpLCByKTsKICB9CiAgcmV0dXJuIGk7Cn0KZnVuY3Rpb24gSChlKSB7CiAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgIHZhciBpID0gYXJndW1lbnRzW3RdICE9IG51bGwgPyBhcmd1bWVudHNbdF0gOiB7fTsKICAgIHQgJSAyID8gQShPYmplY3QoaSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpIHsKICAgICAgbGUoZSwgciwgaVtyXSk7CiAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoaSkpIDogQShPYmplY3QoaSkpLmZvckVhY2goZnVuY3Rpb24ocikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLCByKSk7CiAgICB9KTsKICB9CiAgcmV0dXJuIGU7Cn0KZnVuY3Rpb24gdWUoKSB7CiAgZm9yICh2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsIHQgPSBuZXcgQXJyYXkoZSksIGkgPSAwOyBpIDwgZTsgaSsrKQogICAgdFtpXSA9IGFyZ3VtZW50c1tpXTsKICByZXR1cm4gZnVuY3Rpb24ocikgewogICAgcmV0dXJuIHQucmVkdWNlUmlnaHQoZnVuY3Rpb24obiwgYSkgewogICAgICByZXR1cm4gYShuKTsKICAgIH0sIHIpOwogIH07Cn0KZnVuY3Rpb24gTyhlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uIHQoKSB7CiAgICBmb3IgKHZhciBpID0gdGhpcywgciA9IGFyZ3VtZW50cy5sZW5ndGgsIG4gPSBuZXcgQXJyYXkociksIGEgPSAwOyBhIDwgcjsgYSsrKQogICAgICBuW2FdID0gYXJndW1lbnRzW2FdOwogICAgcmV0dXJuIG4ubGVuZ3RoID49IGUubGVuZ3RoID8gZS5hcHBseSh0aGlzLCBuKSA6IGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciBsID0gYXJndW1lbnRzLmxlbmd0aCwgdSA9IG5ldyBBcnJheShsKSwgcyA9IDA7IHMgPCBsOyBzKyspCiAgICAgICAgdVtzXSA9IGFyZ3VtZW50c1tzXTsKICAgICAgcmV0dXJuIHQuYXBwbHkoaSwgW10uY29uY2F0KG4sIHUpKTsKICAgIH07CiAgfTsKfQpmdW5jdGlvbiB4KGUpIHsKICByZXR1cm4ge30udG9TdHJpbmcuY2FsbChlKS5pbmNsdWRlcygiT2JqZWN0Iik7Cn0KZnVuY3Rpb24gZGUoZSkgewogIHJldHVybiAhT2JqZWN0LmtleXMoZSkubGVuZ3RoOwp9CmZ1bmN0aW9uIFMoZSkgewogIHJldHVybiB0eXBlb2YgZSA9PSAiZnVuY3Rpb24iOwp9CmZ1bmN0aW9uIHBlKGUsIHQpIHsKICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHQpOwp9CmZ1bmN0aW9uIGZlKGUsIHQpIHsKICByZXR1cm4geCh0KSB8fCBfKCJjaGFuZ2VUeXBlIiksIE9iamVjdC5rZXlzKHQpLnNvbWUoZnVuY3Rpb24oaSkgewogICAgcmV0dXJuICFwZShlLCBpKTsKICB9KSAmJiBfKCJjaGFuZ2VGaWVsZCIpLCB0Owp9CmZ1bmN0aW9uIG1lKGUpIHsKICBTKGUpIHx8IF8oInNlbGVjdG9yVHlwZSIpOwp9CmZ1bmN0aW9uIHllKGUpIHsKICBTKGUpIHx8IHgoZSkgfHwgXygiaGFuZGxlclR5cGUiKSwgeChlKSAmJiBPYmplY3QudmFsdWVzKGUpLnNvbWUoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICFTKHQpOwogIH0pICYmIF8oImhhbmRsZXJzVHlwZSIpOwp9CmZ1bmN0aW9uIGhlKGUpIHsKICBlIHx8IF8oImluaXRpYWxJc1JlcXVpcmVkIiksIHgoZSkgfHwgXygiaW5pdGlhbFR5cGUiKSwgZGUoZSkgJiYgXygiaW5pdGlhbENvbnRlbnQiKTsKfQpmdW5jdGlvbiBnZShlLCB0KSB7CiAgdGhyb3cgbmV3IEVycm9yKGVbdF0gfHwgZS5kZWZhdWx0KTsKfQp2YXIgd2UgPSB7CiAgaW5pdGlhbElzUmVxdWlyZWQ6ICJpbml0aWFsIHN0YXRlIGlzIHJlcXVpcmVkIiwKICBpbml0aWFsVHlwZTogImluaXRpYWwgc3RhdGUgc2hvdWxkIGJlIGFuIG9iamVjdCIsCiAgaW5pdGlhbENvbnRlbnQ6ICJpbml0aWFsIHN0YXRlIHNob3VsZG4ndCBiZSBhbiBlbXB0eSBvYmplY3QiLAogIGhhbmRsZXJUeXBlOiAiaGFuZGxlciBzaG91bGQgYmUgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24iLAogIGhhbmRsZXJzVHlwZTogImFsbCBoYW5kbGVycyBzaG91bGQgYmUgYSBmdW5jdGlvbnMiLAogIHNlbGVjdG9yVHlwZTogInNlbGVjdG9yIHNob3VsZCBiZSBhIGZ1bmN0aW9uIiwKICBjaGFuZ2VUeXBlOiAicHJvdmlkZWQgdmFsdWUgb2YgY2hhbmdlcyBzaG91bGQgYmUgYW4gb2JqZWN0IiwKICBjaGFuZ2VGaWVsZDogJ2l0IHNlYW1zIHlvdSB3YW50IHRvIGNoYW5nZSBhIGZpZWxkIGluIHRoZSBzdGF0ZSB3aGljaCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSAiaW5pdGlhbCIgc3RhdGUnLAogIGRlZmF1bHQ6ICJhbiB1bmtub3duIGVycm9yIGFjY3VyZWQgaW4gYHN0YXRlLWxvY2FsYCBwYWNrYWdlIgp9LCBfID0gTyhnZSkod2UpLCBMID0gewogIGNoYW5nZXM6IGZlLAogIHNlbGVjdG9yOiBtZSwKICBoYW5kbGVyOiB5ZSwKICBpbml0aWFsOiBoZQp9OwpmdW5jdGlvbiBfZShlKSB7CiAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogIEwuaW5pdGlhbChlKSwgTC5oYW5kbGVyKHQpOwogIHZhciBpID0gewogICAgY3VycmVudDogZQogIH0sIHIgPSBPKEVlKShpLCB0KSwgbiA9IE8odmUpKGkpLCBhID0gTyhMLmNoYW5nZXMpKGUpLCBsID0gTyhiZSkoaSk7CiAgZnVuY3Rpb24gdSgpIHsKICAgIHZhciBvID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMF0gOiBmdW5jdGlvbihjKSB7CiAgICAgIHJldHVybiBjOwogICAgfTsKICAgIHJldHVybiBMLnNlbGVjdG9yKG8pLCBvKGkuY3VycmVudCk7CiAgfQogIGZ1bmN0aW9uIHMobykgewogICAgdWUociwgbiwgYSwgbCkobyk7CiAgfQogIHJldHVybiBbdSwgc107Cn0KZnVuY3Rpb24gYmUoZSwgdCkgewogIHJldHVybiBTKHQpID8gdChlLmN1cnJlbnQpIDogdDsKfQpmdW5jdGlvbiB2ZShlLCB0KSB7CiAgcmV0dXJuIGUuY3VycmVudCA9IEgoSCh7fSwgZS5jdXJyZW50KSwgdCksIHQ7Cn0KZnVuY3Rpb24gRWUoZSwgdCwgaSkgewogIHJldHVybiBTKHQpID8gdChlLmN1cnJlbnQpIDogT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbihyKSB7CiAgICB2YXIgbjsKICAgIHJldHVybiAobiA9IHRbcl0pID09PSBudWxsIHx8IG4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG4uY2FsbCh0LCBlLmN1cnJlbnRbcl0pOwogIH0pLCBpOwp9CnZhciBPZSA9IHsKICBjcmVhdGU6IF9lCn0sIFcgPSAvKiBAX19QVVJFX18gKi8gKChlKSA9PiAoZVtlLlJFQURZID0gMF0gPSAiUkVBRFkiLCBlKSkoVyB8fCB7fSksIGggPSAvKiBAX19QVVJFX18gKi8gKChlKSA9PiAoZVtlLkVYRUMgPSAwXSA9ICJFWEVDIiwgZVtlLkNPTVBMRVRFID0gMV0gPSAiQ09NUExFVEUiLCBlW2UuSU5TVEFMTCA9IDJdID0gIklOU1RBTEwiLCBlW2UuRk9STUFUID0gM10gPSAiRk9STUFUIiwgZVtlLkpTX0ZOX0NBTEwgPSA0XSA9ICJKU19GTl9DQUxMIiwgZSkpKGggfHwge30pLCBZID0gLyogQF9fUFVSRV9fICovICgoZSkgPT4gKGUuRk4gPSAiX19mdW5jdGlvbl9fIiwgZSkpKFkgfHwge30pOwpjb25zdCBHID0gIndyYXBwZXIiOwpmdW5jdGlvbiB2KGUsIHQpIHsKICB2YXIgbjsKICBjb25zdCBpID0gKChuID0gZSA9PSBudWxsID8gdm9pZCAwIDogZS50b0pzKSA9PSBudWxsID8gdm9pZCAwIDogbi5jYWxsKGUsIHsKICAgIGRpY3RfY29udmVydGVyOiBPYmplY3QuZnJvbUVudHJpZXMsCiAgICBjcmVhdGVfcHlwcm94aWVzOiAhMQogIH0pKSB8fCBlLCByID0gdC5pc1B5UHJveHkoaSkgPyBpLnRvU3RyaW5nKCkgOiBpOwogIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcocikpIHsKICAgIGNvbnN0IGEgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocik7CiAgICByZXR1cm4gZS5nZXRCdWZmZXIoKS5yZWxlYXNlKCksIGE7CiAgfQogIHJldHVybiByOwp9CmNvbnN0IFQgPSAvRmlsZSAiPGV4ZWM+IiwgbGluZSAoXGQrKSgkfCwgaW4gPG1vZHVsZT4pJC9tLCBQID0gbmV3IFJlZ0V4cCgKICBgRmlsZSAiPGV4ZWM+IiwgbGluZSAoXFxkKyksIGluICR7R31gLAogICJtIgopLCBTZSA9IC9saW5lIChcZCspL2c7CmZ1bmN0aW9uIGooZSkgewogIHJldHVybiBlLnJlcGxhY2UoU2UsICh0LCBpKSA9PiBgbGluZSAkeytpIC0gMX1gKTsKfQpmdW5jdGlvbiBGZShlKSB7CiAgY29uc3QgdCA9IFQudGVzdChlKSwgaSA9IFAudGVzdChlKTsKICBpZiAoISh0IHx8IGkpKQogICAgcmV0dXJuIGU7CiAgY29uc3QgciA9IGUuc3BsaXQoYApgKSwgbiA9IHIuZmluZEluZGV4KAogICAgKGwpID0+IHQgPyBULnRlc3QobCkgOiBQLnRlc3QobCkKICApOwogIGxldCBhID0gITE7CiAgcmV0dXJuIHIuc2xpY2UobikucmVkdWNlKChsLCB1KSA9PiB7CiAgICBpZiAoYSkKICAgICAgbC5wdXNoKGoodSkpOwogICAgZWxzZSB7CiAgICAgIGlmICh0ICYmICFpICYmIFQudGVzdCh1KSkKICAgICAgICByZXR1cm4gYSA9ICEwLCBsLnB1c2goaih1KS5yZXBsYWNlKCIsIGluIDxtb2R1bGU+IiwgIiIpKSwgbDsKICAgICAgaWYgKGkgJiYgUC50ZXN0KHUpKQogICAgICAgIHJldHVybiBhID0gITAsIGwucHVzaChqKHUpLnJlcGxhY2UoYCwgaW4gJHtHfWAsICIiKSksIGw7CiAgICB9CiAgICByZXR1cm4gbDsKICB9LCBbXSkuam9pbihgCmApOwp9CmZ1bmN0aW9uIExlKGUsIHQsIGkpIHsKICByZXR1cm4geyAuLi5lLCBbdF06IGkgfTsKfQpjb25zdCBbRCwgTmVdID0gT2UuY3JlYXRlKHsKICBjYWxsYmFja3M6IHt9LAogIGNvbW1hbmRVbmlxdWVJZDogMAp9KTsKYXN5bmMgZnVuY3Rpb24geGUoKSB7CiAgY29uc3QgZSA9IGF3YWl0IGFlKHNlLmxvYWRQeW9kaWRlT3B0aW9ucyk7CiAgYXdhaXQgZS5sb2FkUGFja2FnZSgibWljcm9waXAiKSwgYXdhaXQgZS5ydW5QeXRob25Bc3luYyhjZSk7CiAgbGV0IHQ7CiAgc2VsZi5TaGFyZWRBcnJheUJ1ZmZlciAmJiAodCA9IG5ldyBVaW50OEFycmF5KG5ldyBzZWxmLlNoYXJlZEFycmF5QnVmZmVyKDEpKSwgZS5zZXRJbnRlcnJ1cHRCdWZmZXIodCkpLCBwb3N0TWVzc2FnZSh7CiAgICBzdGF0dXM6IFcuUkVBRFksCiAgICBpbnRlcnJ1cHRCdWZmZXI6IHQKICB9KTsKICBjb25zdCBpID0gewogICAgW2guRVhFQ106IGFzeW5jICh7IGNvZGU6IGEsIGNvbnRleHQ6IGwgPSB7fSB9KSA9PiB7CiAgICAgIGNvbnN0IHUgPSBbXTsKICAgICAgT2JqZWN0LmVudHJpZXMobCkuZm9yRWFjaCgoW3MsIG9dKSA9PiB7CiAgICAgICAgKG8gPT0gbnVsbCA/IHZvaWQgMCA6IG8udHlwZSkgPT09IFkuRk4gPyBlLmdsb2JhbHMuc2V0KAogICAgICAgICAgcywKICAgICAgICAgIG4ocywgdSkKICAgICAgICApIDogZS5nbG9iYWxzLnNldChzLCBlLnRvUHkobykpOwogICAgICB9KTsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCBlLmxvYWRQYWNrYWdlc0Zyb21JbXBvcnRzKGEpLCBlLnJ1blB5dGhvbigiaW1wb3J0IHN5cywgaW87IHN5cy5zdGRvdXQgPSBpby5TdHJpbmdJTygpOyBzeXMuc3RkZXJyID0gaW8uU3RyaW5nSU8oKSIpOwogICAgICAgIGNvbnN0IHMgPSBhd2FpdCBlLnJ1blB5dGhvbkFzeW5jKGEpLCBvID0gZS5ydW5QeXRob24oImltcG9ydCBzeXM7IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKSIpLnRyaW0oKSwgYyA9IGUucnVuUHl0aG9uKCJpbXBvcnQgc3lzOyBzeXMuc3RkZXJyLmdldHZhbHVlKCkiKS50cmltKCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJlc3VsdDogdihzLCBlKSwKICAgICAgICAgIHN0ZG91dDogdihvLCBlKSwKICAgICAgICAgIHN0ZGVycjogYywKICAgICAgICAgIGVycm9yOiBudWxsCiAgICAgICAgfTsKICAgICAgfSBjYXRjaCAocykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICByZXN1bHQ6IG51bGwsCiAgICAgICAgICBzdGRvdXQ6IG51bGwsCiAgICAgICAgICBzdGRlcnI6IG51bGwsCiAgICAgICAgICBlcnJvcjogRmUocy5tZXNzYWdlKQogICAgICAgIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHMgfSA9IEQoKTsKICAgICAgICBPYmplY3QuZW50cmllcyhsKS5mb3JFYWNoKChbb10pID0+IHsKICAgICAgICAgIHZhciBjOwogICAgICAgICAgZS5nbG9iYWxzLnNldChvLCAoYyA9IGUudG9QeShudWxsKSkgPT0gbnVsbCA/IHZvaWQgMCA6IGMudG9TdHJpbmcoKSk7CiAgICAgICAgfSksIHUuZm9yRWFjaCgobykgPT4gewogICAgICAgICAgZGVsZXRlIHNbb107CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICBbaC5DT01QTEVURV06IGFzeW5jICh7CiAgICAgIGNvZGU6IGEsCiAgICAgIGxpbmU6IGwsCiAgICAgIGNvbHVtbjogdQogICAgfSkgPT4gewogICAgICBhd2FpdCBlLmxvYWRQYWNrYWdlc0Zyb21JbXBvcnRzKGEpOwogICAgICBjb25zdCBzID0gZS5nbG9iYWxzLmdldCgiZ2V0X2F1dG9jb21wbGV0aW9uIikoYSwgbCwgdSk7CiAgICAgIHJldHVybiB7IHJlc3VsdDogdihzLCBlKSwgZXJyb3I6IG51bGwgfTsKICAgIH0sCiAgICBbaC5JTlNUQUxMXTogYXN5bmMgKHsgcGFja2FnZXM6IGEgfSkgPT4gewogICAgICBjb25zdCBsID0gYXdhaXQgZS5nbG9iYWxzLmdldCgiaW5zdGFsbF9wYWNha2dlIikoYVswXSk7CiAgICAgIHJldHVybiB2KGwsIGUpOwogICAgfSwKICAgIFtoLkZPUk1BVF06IGFzeW5jICh7IGNvZGU6IGEgfSkgPT4gewogICAgICBjb25zdCBsID0gZS5nbG9iYWxzLmdldCgiZm9ybWF0X2NvZGUiKShhKTsKICAgICAgcmV0dXJuIHsgcmVzdWx0OiB2KGwsIGUpLCBlcnJvcjogbnVsbCB9OwogICAgfQogIH07CiAgb25tZXNzYWdlID0gYXN5bmMgZnVuY3Rpb24obCkgewogICAgY29uc3QgeyBpZDogdSwgYWN0aW9uOiBzID0gaC5FWEVDLCBkYXRhOiBvIH0gPSBsLmRhdGE7CiAgICBpZiAocyA9PT0gaC5KU19GTl9DQUxMKQogICAgICByKG8sIHUpOwogICAgZWxzZSB7CiAgICAgIGxldCBjOwogICAgICBzd2l0Y2ggKHMpIHsKICAgICAgICBjYXNlIGguRVhFQzoKICAgICAgICAgIGMgPSBhd2FpdCBpW2guRVhFQ10obyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIGguQ09NUExFVEU6CiAgICAgICAgICBjID0gYXdhaXQgaVtoLkNPTVBMRVRFXShvKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgaC5JTlNUQUxMOgogICAgICAgICAgYyA9IGF3YWl0IGlbaC5JTlNUQUxMXShvKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgaC5GT1JNQVQ6CiAgICAgICAgICBjID0gYXdhaXQgaVtoLkZPUk1BVF0obyk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgZGF0YTogYywKICAgICAgICBpZDogdSwKICAgICAgICBhY3Rpb246IHMKICAgICAgfSk7CiAgICB9CiAgfTsKICBmdW5jdGlvbiByKGEsIGwpIHsKICAgIGNvbnN0IHsgcmVzdWx0OiB1LCBlcnJvcjogcyB9ID0gYSwgeyBjYWxsYmFja3M6IG8gfSA9IEQoKTsKICAgIHMgJiYgb1tsXS5yZWplY3QocyksIG9bbF0ucmVzb2x2ZSh1KTsKICB9CiAgZnVuY3Rpb24gbihhLCBsKSB7CiAgICByZXR1cm4gYXN5bmMgKC4uLnUpID0+IG5ldyBQcm9taXNlKChzLCBvKSA9PiB7CiAgICAgIGNvbnN0IHsgY2FsbGJhY2tzOiBjLCBjb21tYW5kVW5pcXVlSWQ6IHAgfSA9IEQoKTsKICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgIGFjdGlvbjogaC5KU19GTl9DQUxMLAogICAgICAgIGRhdGE6IHsKICAgICAgICAgIGFyZ3M6IHUsCiAgICAgICAgICBuYW1lOiBhCiAgICAgICAgfSwKICAgICAgICBpZDogcAogICAgICB9KSwgbC5wdXNoKHApLCBOZSh7CiAgICAgICAgY2FsbGJhY2tzOiBMZShjLCBwLCB7CiAgICAgICAgICByZXNvbHZlOiBzLAogICAgICAgICAgcmVqZWN0OiBvCiAgICAgICAgfSksCiAgICAgICAgY29tbWFuZFVuaXF1ZUlkOiBwICsgMQogICAgICB9KTsKICAgIH0pOwogIH0KfQp4ZSgpOwo=", Y = typeof window < "u" && window.Blob && new Blob([atob(w)], { type: "text/javascript;charset=utf-8" });
const w = "dmFyIGIsIE0sIGssICQsIEIgPSB7IGV4cG9ydHM6IHt9IH07CkIuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgewogIGZ1bmN0aW9uIGUoZCkgewogICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KGQpKSAmJiBpc0Zpbml0ZShkKTsKICB9CiAgZnVuY3Rpb24gdChkKSB7CiAgICByZXR1cm4gZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGQuc3Vic3RyaW5nKDEpOwogIH0KICBmdW5jdGlvbiBvKGQpIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXNbZF07CiAgICB9OwogIH0KICB2YXIgciA9IFsiaXNDb25zdHJ1Y3RvciIsICJpc0V2YWwiLCAiaXNOYXRpdmUiLCAiaXNUb3BsZXZlbCJdLCBuID0gWyJjb2x1bW5OdW1iZXIiLCAibGluZU51bWJlciJdLCBhID0gWyJmaWxlTmFtZSIsICJmdW5jdGlvbk5hbWUiLCAic291cmNlIl0sIGwgPSBbImFyZ3MiXSwgdSA9IFsiZXZhbE9yaWdpbiJdLCBzID0gci5jb25jYXQobiwgYSwgbCwgdSk7CiAgZnVuY3Rpb24gaShkKSB7CiAgICBpZiAoZCkKICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBzLmxlbmd0aDsgbSsrKQogICAgICAgIGRbc1ttXV0gIT09IHZvaWQgMCAmJiB0aGlzWyJzZXQiICsgdChzW21dKV0oZFtzW21dXSk7CiAgfQogIGkucHJvdG90eXBlID0geyBnZXRBcmdzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmFyZ3M7CiAgfSwgc2V0QXJnczogZnVuY3Rpb24oZCkgewogICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkKSAhPT0gIltvYmplY3QgQXJyYXldIikKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJncyBtdXN0IGJlIGFuIEFycmF5Iik7CiAgICB0aGlzLmFyZ3MgPSBkOwogIH0sIGdldEV2YWxPcmlnaW46IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZXZhbE9yaWdpbjsKICB9LCBzZXRFdmFsT3JpZ2luOiBmdW5jdGlvbihkKSB7CiAgICBpZiAoZCBpbnN0YW5jZW9mIGkpCiAgICAgIHRoaXMuZXZhbE9yaWdpbiA9IGQ7CiAgICBlbHNlIHsKICAgICAgaWYgKCEoZCBpbnN0YW5jZW9mIE9iamVjdCkpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXZhbCBPcmlnaW4gbXVzdCBiZSBhbiBPYmplY3Qgb3IgU3RhY2tGcmFtZSIpOwogICAgICB0aGlzLmV2YWxPcmlnaW4gPSBuZXcgaShkKTsKICAgIH0KICB9LCB0b1N0cmluZzogZnVuY3Rpb24oKSB7CiAgICB2YXIgZCA9IHRoaXMuZ2V0RmlsZU5hbWUoKSB8fCAiIiwgbSA9IHRoaXMuZ2V0TGluZU51bWJlcigpIHx8ICIiLCB5ID0gdGhpcy5nZXRDb2x1bW5OdW1iZXIoKSB8fCAiIiwgZyA9IHRoaXMuZ2V0RnVuY3Rpb25OYW1lKCkgfHwgIiI7CiAgICByZXR1cm4gdGhpcy5nZXRJc0V2YWwoKSA/IGQgPyAiW2V2YWxdICgiICsgZCArICI6IiArIG0gKyAiOiIgKyB5ICsgIikiIDogIltldmFsXToiICsgbSArICI6IiArIHkgOiBnID8gZyArICIgKCIgKyBkICsgIjoiICsgbSArICI6IiArIHkgKyAiKSIgOiBkICsgIjoiICsgbSArICI6IiArIHk7CiAgfSB9LCBpLmZyb21TdHJpbmcgPSBmdW5jdGlvbihkKSB7CiAgICB2YXIgbSA9IGQuaW5kZXhPZigiKCIpLCB5ID0gZC5sYXN0SW5kZXhPZigiKSIpLCBnID0gZC5zdWJzdHJpbmcoMCwgbSksIHcgPSBkLnN1YnN0cmluZyhtICsgMSwgeSkuc3BsaXQoIiwiKSwgRiA9IGQuc3Vic3RyaW5nKHkgKyAxKTsKICAgIGlmIChGLmluZGV4T2YoIkAiKSA9PT0gMCkKICAgICAgdmFyIFIgPSAvQCguKz8pKD86OihcZCspKT8oPzo6KFxkKykpPyQvLmV4ZWMoRiwgIiIpLCBLID0gUlsxXSwgUSA9IFJbMl0sIFogPSBSWzNdOwogICAgcmV0dXJuIG5ldyBpKHsgZnVuY3Rpb25OYW1lOiBnLCBhcmdzOiB3IHx8IHZvaWQgMCwgZmlsZU5hbWU6IEssIGxpbmVOdW1iZXI6IFEgfHwgdm9pZCAwLCBjb2x1bW5OdW1iZXI6IFogfHwgdm9pZCAwIH0pOwogIH07CiAgZm9yICh2YXIgYyA9IDA7IGMgPCByLmxlbmd0aDsgYysrKQogICAgaS5wcm90b3R5cGVbImdldCIgKyB0KHJbY10pXSA9IG8ocltjXSksIGkucHJvdG90eXBlWyJzZXQiICsgdChyW2NdKV0gPSBmdW5jdGlvbihkKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihtKSB7CiAgICAgICAgdGhpc1tkXSA9IEJvb2xlYW4obSk7CiAgICAgIH07CiAgICB9KHJbY10pOwogIGZvciAodmFyIHAgPSAwOyBwIDwgbi5sZW5ndGg7IHArKykKICAgIGkucHJvdG90eXBlWyJnZXQiICsgdChuW3BdKV0gPSBvKG5bcF0pLCBpLnByb3RvdHlwZVsic2V0IiArIHQobltwXSldID0gZnVuY3Rpb24oZCkgewogICAgICByZXR1cm4gZnVuY3Rpb24obSkgewogICAgICAgIGlmICghZShtKSkKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZCArICIgbXVzdCBiZSBhIE51bWJlciIpOwogICAgICAgIHRoaXNbZF0gPSBOdW1iZXIobSk7CiAgICAgIH07CiAgICB9KG5bcF0pOwogIGZvciAodmFyIGYgPSAwOyBmIDwgYS5sZW5ndGg7IGYrKykKICAgIGkucHJvdG90eXBlWyJnZXQiICsgdChhW2ZdKV0gPSBvKGFbZl0pLCBpLnByb3RvdHlwZVsic2V0IiArIHQoYVtmXSldID0gZnVuY3Rpb24oZCkgewogICAgICByZXR1cm4gZnVuY3Rpb24obSkgewogICAgICAgIHRoaXNbZF0gPSBTdHJpbmcobSk7CiAgICAgIH07CiAgICB9KGFbZl0pOwogIHJldHVybiBpOwp9KCk7CnZhciBlZSA9IChiID0gQi5leHBvcnRzLCBNID0gLyhefEApXFMrOlxkKy8sIGsgPSAvXlxzKmF0IC4qKFxTKzpcZCt8XChuYXRpdmVcKSkvbSwgJCA9IC9eKGV2YWxAKT8oXFtuYXRpdmUgY29kZV0pPyQvLCB7IHBhcnNlOiBmdW5jdGlvbihlKSB7CiAgaWYgKGUuc3RhY2t0cmFjZSAhPT0gdm9pZCAwIHx8IGVbIm9wZXJhI3NvdXJjZWxvYyJdICE9PSB2b2lkIDApCiAgICByZXR1cm4gdGhpcy5wYXJzZU9wZXJhKGUpOwogIGlmIChlLnN0YWNrICYmIGUuc3RhY2subWF0Y2goaykpCiAgICByZXR1cm4gdGhpcy5wYXJzZVY4T3JJRShlKTsKICBpZiAoZS5zdGFjaykKICAgIHJldHVybiB0aGlzLnBhcnNlRkZPclNhZmFyaShlKTsKICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwYXJzZSBnaXZlbiBFcnJvciBvYmplY3QiKTsKfSwgZXh0cmFjdExvY2F0aW9uOiBmdW5jdGlvbihlKSB7CiAgaWYgKGUuaW5kZXhPZigiOiIpID09PSAtMSkKICAgIHJldHVybiBbZV07CiAgdmFyIHQgPSAvKC4rPykoPzo6KFxkKykpPyg/OjooXGQrKSk/JC8uZXhlYyhlLnJlcGxhY2UoL1soKV0vZywgIiIpKTsKICByZXR1cm4gW3RbMV0sIHRbMl0gfHwgdm9pZCAwLCB0WzNdIHx8IHZvaWQgMF07Cn0sIHBhcnNlVjhPcklFOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuIGUuc3RhY2suc3BsaXQoYApgKS5maWx0ZXIoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICEhdC5tYXRjaChrKTsKICB9LCB0aGlzKS5tYXAoZnVuY3Rpb24odCkgewogICAgdC5pbmRleE9mKCIoZXZhbCAiKSA+IC0xICYmICh0ID0gdC5yZXBsYWNlKC9ldmFsIGNvZGUvZywgImV2YWwiKS5yZXBsYWNlKC8oXChldmFsIGF0IFteKCldKil8KCwuKiQpL2csICIiKSk7CiAgICB2YXIgbyA9IHQucmVwbGFjZSgvXlxzKy8sICIiKS5yZXBsYWNlKC9cKGV2YWwgY29kZS9nLCAiKCIpLnJlcGxhY2UoL14uKj9ccysvLCAiIiksIHIgPSBvLm1hdGNoKC8gKFwoLitcKSQpLyk7CiAgICBvID0gciA/IG8ucmVwbGFjZShyWzBdLCAiIikgOiBvOwogICAgdmFyIG4gPSB0aGlzLmV4dHJhY3RMb2NhdGlvbihyID8gclsxXSA6IG8pLCBhID0gciAmJiBvIHx8IHZvaWQgMCwgbCA9IFsiZXZhbCIsICI8YW5vbnltb3VzPiJdLmluZGV4T2YoblswXSkgPiAtMSA/IHZvaWQgMCA6IG5bMF07CiAgICByZXR1cm4gbmV3IGIoeyBmdW5jdGlvbk5hbWU6IGEsIGZpbGVOYW1lOiBsLCBsaW5lTnVtYmVyOiBuWzFdLCBjb2x1bW5OdW1iZXI6IG5bMl0sIHNvdXJjZTogdCB9KTsKICB9LCB0aGlzKTsKfSwgcGFyc2VGRk9yU2FmYXJpOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuIGUuc3RhY2suc3BsaXQoYApgKS5maWx0ZXIoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICF0Lm1hdGNoKCQpOwogIH0sIHRoaXMpLm1hcChmdW5jdGlvbih0KSB7CiAgICBpZiAodC5pbmRleE9mKCIgPiBldmFsIikgPiAtMSAmJiAodCA9IHQucmVwbGFjZSgvIGxpbmUgKFxkKykoPzogPiBldmFsIGxpbmUgXGQrKSogPiBldmFsOlxkKzpcZCsvZywgIjokMSIpKSwgdC5pbmRleE9mKCJAIikgPT09IC0xICYmIHQuaW5kZXhPZigiOiIpID09PSAtMSkKICAgICAgcmV0dXJuIG5ldyBiKHsgZnVuY3Rpb25OYW1lOiB0IH0pOwogICAgdmFyIG8gPSAvKCguKiIuKyJbXkBdKik/W15AXSopKD86QCkvLCByID0gdC5tYXRjaChvKSwgbiA9IHIgJiYgclsxXSA/IHJbMV0gOiB2b2lkIDAsIGEgPSB0aGlzLmV4dHJhY3RMb2NhdGlvbih0LnJlcGxhY2UobywgIiIpKTsKICAgIHJldHVybiBuZXcgYih7IGZ1bmN0aW9uTmFtZTogbiwgZmlsZU5hbWU6IGFbMF0sIGxpbmVOdW1iZXI6IGFbMV0sIGNvbHVtbk51bWJlcjogYVsyXSwgc291cmNlOiB0IH0pOwogIH0sIHRoaXMpOwp9LCBwYXJzZU9wZXJhOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuICFlLnN0YWNrdHJhY2UgfHwgZS5tZXNzYWdlLmluZGV4T2YoYApgKSA+IC0xICYmIGUubWVzc2FnZS5zcGxpdChgCmApLmxlbmd0aCA+IGUuc3RhY2t0cmFjZS5zcGxpdChgCmApLmxlbmd0aCA/IHRoaXMucGFyc2VPcGVyYTkoZSkgOiBlLnN0YWNrID8gdGhpcy5wYXJzZU9wZXJhMTEoZSkgOiB0aGlzLnBhcnNlT3BlcmExMChlKTsKfSwgcGFyc2VPcGVyYTk6IGZ1bmN0aW9uKGUpIHsKICBmb3IgKHZhciB0ID0gL0xpbmUgKFxkKykuKnNjcmlwdCAoPzppbiApPyhcUyspL2ksIG8gPSBlLm1lc3NhZ2Uuc3BsaXQoYApgKSwgciA9IFtdLCBuID0gMiwgYSA9IG8ubGVuZ3RoOyBuIDwgYTsgbiArPSAyKSB7CiAgICB2YXIgbCA9IHQuZXhlYyhvW25dKTsKICAgIGwgJiYgci5wdXNoKG5ldyBiKHsgZmlsZU5hbWU6IGxbMl0sIGxpbmVOdW1iZXI6IGxbMV0sIHNvdXJjZTogb1tuXSB9KSk7CiAgfQogIHJldHVybiByOwp9LCBwYXJzZU9wZXJhMTA6IGZ1bmN0aW9uKGUpIHsKICBmb3IgKHZhciB0ID0gL0xpbmUgKFxkKykuKnNjcmlwdCAoPzppbiApPyhcUyspKD86OiBJbiBmdW5jdGlvbiAoXFMrKSk/JC9pLCBvID0gZS5zdGFja3RyYWNlLnNwbGl0KGAKYCksIHIgPSBbXSwgbiA9IDAsIGEgPSBvLmxlbmd0aDsgbiA8IGE7IG4gKz0gMikgewogICAgdmFyIGwgPSB0LmV4ZWMob1tuXSk7CiAgICBsICYmIHIucHVzaChuZXcgYih7IGZ1bmN0aW9uTmFtZTogbFszXSB8fCB2b2lkIDAsIGZpbGVOYW1lOiBsWzJdLCBsaW5lTnVtYmVyOiBsWzFdLCBzb3VyY2U6IG9bbl0gfSkpOwogIH0KICByZXR1cm4gcjsKfSwgcGFyc2VPcGVyYTExOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuIGUuc3RhY2suc3BsaXQoYApgKS5maWx0ZXIoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICEhdC5tYXRjaChNKSAmJiAhdC5tYXRjaCgvXkVycm9yIGNyZWF0ZWQgYXQvKTsKICB9LCB0aGlzKS5tYXAoZnVuY3Rpb24odCkgewogICAgdmFyIG8sIHIgPSB0LnNwbGl0KCJAIiksIG4gPSB0aGlzLmV4dHJhY3RMb2NhdGlvbihyLnBvcCgpKSwgYSA9IHIuc2hpZnQoKSB8fCAiIiwgbCA9IGEucmVwbGFjZSgvPGFub255bW91cyBmdW5jdGlvbig6IChcdyspKT8+LywgIiQyIikucmVwbGFjZSgvXChbXildKlwpL2csICIiKSB8fCB2b2lkIDA7CiAgICBhLm1hdGNoKC9cKChbXildKilcKS8pICYmIChvID0gYS5yZXBsYWNlKC9eW14oXStcKChbXildKilcKSQvLCAiJDEiKSk7CiAgICB2YXIgdSA9IG8gPT09IHZvaWQgMCB8fCBvID09PSAiW2FyZ3VtZW50cyBub3QgYXZhaWxhYmxlXSIgPyB2b2lkIDAgOiBvLnNwbGl0KCIsIik7CiAgICByZXR1cm4gbmV3IGIoeyBmdW5jdGlvbk5hbWU6IGwsIGFyZ3M6IHUsIGZpbGVOYW1lOiBuWzBdLCBsaW5lTnVtYmVyOiBuWzFdLCBjb2x1bW5OdW1iZXI6IG5bMl0sIHNvdXJjZTogdCB9KTsKICB9LCB0aGlzKTsKfSB9KTsKY29uc3QgRSA9IHR5cGVvZiBwcm9jZXNzID09ICJvYmplY3QiICYmIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zID09ICJvYmplY3QiICYmIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgPT0gInN0cmluZyIgJiYgcHJvY2Vzcy5icm93c2VyID09PSB2b2lkIDA7CmxldCBxLCBDLCBJLCBYLCB6LCBKLCBVLCBWLCBOOwppZiAoSiA9IEUgPyBmdW5jdGlvbihlLCB0KSB7CiAgcmV0dXJuIEkucmVzb2x2ZSh0IHx8ICIuIiwgZSk7Cn0gOiBmdW5jdGlvbihlLCB0KSB7CiAgcmV0dXJuIHQgPT09IHZvaWQgMCAmJiAodCA9IGxvY2F0aW9uKSwgbmV3IFVSTChlLCB0KS50b1N0cmluZygpOwp9LCBFIHx8IChVID0gIi8iKSwgViA9IEUgPyBhc3luYyBmdW5jdGlvbihlLCB0KSB7CiAgaWYgKGUuc3RhcnRzV2l0aCgiZmlsZTovLyIpICYmIChlID0gZS5zbGljZSg3KSksIGUuaW5jbHVkZXMoIjovLyIpKSB7CiAgICBsZXQgbyA9IGF3YWl0IEMoZSk7CiAgICBpZiAoIW8ub2spCiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgJyR7ZX0nOiByZXF1ZXN0IGZhaWxlZC5gKTsKICAgIHJldHVybiBuZXcgVWludDhBcnJheShhd2FpdCBvLmFycmF5QnVmZmVyKCkpOwogIH0KICB7CiAgICBjb25zdCBvID0gYXdhaXQgei5yZWFkRmlsZShlKTsKICAgIHJldHVybiBuZXcgVWludDhBcnJheShvLmJ1ZmZlciwgby5ieXRlT2Zmc2V0LCBvLmJ5dGVMZW5ndGgpOwogIH0KfSA6IGFzeW5jIGZ1bmN0aW9uKGUsIHQpIHsKICBjb25zdCBvID0gbmV3IFVSTChlLCBsb2NhdGlvbik7CiAgbGV0IHIgPSB0ID8geyBpbnRlZ3JpdHk6IHQgfSA6IHt9LCBuID0gYXdhaXQgZmV0Y2gobywgcik7CiAgaWYgKCFuLm9rKQogICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCAnJHtvfSc6IHJlcXVlc3QgZmFpbGVkLmApOwogIHJldHVybiBuZXcgVWludDhBcnJheShhd2FpdCBuLmFycmF5QnVmZmVyKCkpOwp9LCBnbG9iYWxUaGlzLmRvY3VtZW50KQogIE4gPSBhc3luYyAoZSkgPT4gYXdhaXQgaW1wb3J0KAogICAgLyogd2VicGFja0lnbm9yZTogdHJ1ZSAqLwogICAgZQogICk7CmVsc2UgaWYgKGdsb2JhbFRoaXMuaW1wb3J0U2NyaXB0cykKICBOID0gYXN5bmMgKGUpID0+IHsKICAgIHRyeSB7CiAgICAgIGdsb2JhbFRoaXMuaW1wb3J0U2NyaXB0cyhlKTsKICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgaWYgKCEodCBpbnN0YW5jZW9mIFR5cGVFcnJvcikpCiAgICAgICAgdGhyb3cgdDsKICAgICAgYXdhaXQgaW1wb3J0KAogICAgICAgIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8KICAgICAgICBlCiAgICAgICk7CiAgICB9CiAgfTsKZWxzZSB7CiAgaWYgKCFFKQogICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZGV0ZXJtaW5lIHJ1bnRpbWUgZW52aXJvbm1lbnQiKTsKICBOID0gYXN5bmMgZnVuY3Rpb24oZSkgewogICAgZS5zdGFydHNXaXRoKCJmaWxlOi8vIikgJiYgKGUgPSBlLnNsaWNlKDcpKSwgZS5pbmNsdWRlcygiOi8vIikgPyBYLnJ1bkluVGhpc0NvbnRleHQoYXdhaXQgKGF3YWl0IEMoZSkpLnRleHQoKSkgOiBhd2FpdCBpbXBvcnQoCiAgICAgIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8KICAgICAgcS5wYXRoVG9GaWxlVVJMKGUpLmhyZWYKICAgICk7CiAgfTsKfQpmdW5jdGlvbiB0ZShlKSB7CiAgdmFyIHQgPSB0eXBlb2YgU3ltYm9sID09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLml0ZXJhdG9yLCBvID0gdCAmJiBlW3RdLCByID0gMDsKICBpZiAobykKICAgIHJldHVybiBvLmNhbGwoZSk7CiAgaWYgKGUgJiYgdHlwZW9mIGUubGVuZ3RoID09ICJudW1iZXIiKQogICAgcmV0dXJuIHsgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBlICYmIHIgPj0gZS5sZW5ndGggJiYgKGUgPSB2b2lkIDApLCB7IHZhbHVlOiBlICYmIGVbcisrXSwgZG9uZTogIWUgfTsKICAgIH0gfTsKICB0aHJvdyBuZXcgVHlwZUVycm9yKHQgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKfQpmdW5jdGlvbiByZShlKSB7CiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwogIHZhciB0LCBvID0gZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl07CiAgcmV0dXJuIG8gPyBvLmNhbGwoZSkgOiAoZSA9IHRlKGUpLCB0ID0ge30sIHIoIm5leHQiKSwgcigidGhyb3ciKSwgcigicmV0dXJuIiksIHRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9LCB0KTsKICBmdW5jdGlvbiByKG4pIHsKICAgIHRbbl0gPSBlW25dICYmIGZ1bmN0aW9uKGEpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGwsIHUpIHsKICAgICAgICAoZnVuY3Rpb24ocywgaSwgYywgcCkgewogICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHApLnRoZW4oZnVuY3Rpb24oZikgewogICAgICAgICAgICBzKHsgdmFsdWU6IGYsIGRvbmU6IGMgfSk7CiAgICAgICAgICB9LCBpKTsKICAgICAgICB9KShsLCB1LCAoYSA9IGVbbl0oYSkpLmRvbmUsIGEudmFsdWUpOwogICAgICB9KTsKICAgIH07CiAgfQp9CmNvbnN0IG5lID0gYXN5bmMgKGUpID0+IHsKICBjb25zdCB0ID0gW107CiAgYXdhaXQgYXN5bmMgZnVuY3Rpb24gcihuKSB7CiAgICB2YXIgYSwgbDsKICAgIHRyeSB7CiAgICAgIGZvciAodmFyIHUsIHMgPSByZShuLnZhbHVlcygpKTsgISh1ID0gYXdhaXQgcy5uZXh0KCkpLmRvbmU7ICkgewogICAgICAgIGNvbnN0IGkgPSB1LnZhbHVlOwogICAgICAgIHQucHVzaChpKSwgaS5raW5kID09PSAiZGlyZWN0b3J5IiAmJiBhd2FpdCByKGkpOwogICAgICB9CiAgICB9IGNhdGNoIChpKSB7CiAgICAgIGEgPSB7IGVycm9yOiBpIH07CiAgICB9IGZpbmFsbHkgewogICAgICB0cnkgewogICAgICAgIHUgJiYgIXUuZG9uZSAmJiAobCA9IHMucmV0dXJuKSAmJiBhd2FpdCBsLmNhbGwocyk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgaWYgKGEpCiAgICAgICAgICB0aHJvdyBhLmVycm9yOwogICAgICB9CiAgICB9CiAgfShlKTsKICBjb25zdCBvID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBvLnNldCgiLiIsIGUpOwogIGZvciAoY29uc3QgciBvZiB0KSB7CiAgICBjb25zdCBuID0gKGF3YWl0IGUucmVzb2x2ZShyKSkuam9pbigiLyIpOwogICAgby5zZXQobiwgcik7CiAgfQogIHJldHVybiBvOwp9OwpmdW5jdGlvbiBvZShlLCB0KSB7CiAgbGV0IG87CiAgbyA9IHQuc3RkTGliVVJMICE9IG51bGwgPyB0LnN0ZExpYlVSTCA6IHQuaW5kZXhVUkwgKyAicHl0aG9uX3N0ZGxpYi56aXAiLCBmdW5jdGlvbihyLCBuKSB7CiAgICBjb25zdCBhID0gVihuKTsKICAgIHIucHJlUnVuLnB1c2goKCkgPT4gewogICAgICBjb25zdCBsID0gci5fcHlfdmVyc2lvbl9tYWpvcigpLCB1ID0gci5fcHlfdmVyc2lvbl9taW5vcigpOwogICAgICByLkZTLm1rZGlyVHJlZSgiL2xpYiIpLCByLkZTLm1rZGlyVHJlZShgL2xpYi9weXRob24ke2x9LiR7dX0vc2l0ZS1wYWNrYWdlc2ApLCByLmFkZFJ1bkRlcGVuZGVuY3koImluc3RhbGwtc3RkbGliIiksIGEudGhlbigocykgPT4gewogICAgICAgIHIuRlMud3JpdGVGaWxlKGAvbGliL3B5dGhvbiR7bH0ke3V9LnppcGAsIHMpOwogICAgICB9KS5jYXRjaCgocykgPT4gewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIG9jY3VycmVkIHdoaWxlIGluc3RhbGxpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnk6IiksIGNvbnNvbGUuZXJyb3Iocyk7CiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gewogICAgICAgIHIucmVtb3ZlUnVuRGVwZW5kZW5jeSgiaW5zdGFsbC1zdGRsaWIiKTsKICAgICAgfSk7CiAgICB9KTsKICB9KGUsIG8pLCBmdW5jdGlvbihyLCBuKSB7CiAgICByLnByZVJ1bi5wdXNoKGZ1bmN0aW9uKCkgewogICAgICB0cnkgewogICAgICAgIHIuRlMubWtkaXJUcmVlKG4pOwogICAgICB9IGNhdGNoIChhKSB7CiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3Igb2NjdXJyZWQgd2hpbGUgbWFraW5nIGEgaG9tZSBkaXJlY3RvcnkgJyR7bn0nOmApLCBjb25zb2xlLmVycm9yKGEpLCBjb25zb2xlLmVycm9yKCJVc2luZyAnLycgZm9yIGEgaG9tZSBkaXJlY3RvcnkgaW5zdGVhZCIpLCBuID0gIi8iOwogICAgICB9CiAgICAgIHIuRU5WLkhPTUUgPSBuLCByLkZTLmNoZGlyKG4pOwogICAgfSk7CiAgfShlLCB0LmhvbWVkaXIpLCBmdW5jdGlvbihyLCBuKSB7CiAgICByLnByZVJ1bi5wdXNoKCgpID0+IHsKICAgICAgZm9yIChjb25zdCBhIG9mIG4pCiAgICAgICAgci5GUy5ta2RpclRyZWUoYSksIHIuRlMubW91bnQoci5GUy5maWxlc3lzdGVtcy5OT0RFRlMsIHsgcm9vdDogYSB9LCBhKTsKICAgIH0pOwogIH0oZSwgdC5fbm9kZV9tb3VudHMpLCBlLnByZVJ1bi5wdXNoKCgpID0+IGZ1bmN0aW9uKHIpIHsKICAgIGNvbnN0IG4gPSByLkZTLCBhID0gci5GUy5maWxlc3lzdGVtcy5NRU1GUywgbCA9IHIuUEFUSCwgdSA9IHsgRElSX01PREU6IDE2ODk1LCBGSUxFX01PREU6IDMzMjc5LCBtb3VudDogZnVuY3Rpb24ocykgewogICAgICBpZiAoIXMub3B0cy5maWxlU3lzdGVtSGFuZGxlKQogICAgICAgIHRocm93IG5ldyBFcnJvcigib3B0cy5maWxlU3lzdGVtSGFuZGxlIGlzIHJlcXVpcmVkIik7CiAgICAgIHJldHVybiBhLm1vdW50LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB9LCBzeW5jZnM6IGFzeW5jIChzLCBpLCBjKSA9PiB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcCA9IHUuZ2V0TG9jYWxTZXQocyksIGYgPSBhd2FpdCB1LmdldFJlbW90ZVNldChzKSwgZCA9IGkgPyBmIDogcCwgbSA9IGkgPyBwIDogZjsKICAgICAgICBhd2FpdCB1LnJlY29uY2lsZShzLCBkLCBtKSwgYyhudWxsKTsKICAgICAgfSBjYXRjaCAocCkgewogICAgICAgIGMocCk7CiAgICAgIH0KICAgIH0sIGdldExvY2FsU2V0OiAocykgPT4gewogICAgICBsZXQgaSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBmdW5jdGlvbiBjKGQpIHsKICAgICAgICByZXR1cm4gZCAhPT0gIi4iICYmIGQgIT09ICIuLiI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcChkKSB7CiAgICAgICAgcmV0dXJuIChtKSA9PiBsLmpvaW4yKGQsIG0pOwogICAgICB9CiAgICAgIGxldCBmID0gbi5yZWFkZGlyKHMubW91bnRwb2ludCkuZmlsdGVyKGMpLm1hcChwKHMubW91bnRwb2ludCkpOwogICAgICBmb3IgKDsgZi5sZW5ndGg7ICkgewogICAgICAgIGxldCBkID0gZi5wb3AoKSwgbSA9IG4uc3RhdChkKTsKICAgICAgICBuLmlzRGlyKG0ubW9kZSkgJiYgZi5wdXNoLmFwcGx5KGYsIG4ucmVhZGRpcihkKS5maWx0ZXIoYykubWFwKHAoZCkpKSwgaVtkXSA9IHsgdGltZXN0YW1wOiBtLm10aW1lLCBtb2RlOiBtLm1vZGUgfTsKICAgICAgfQogICAgICByZXR1cm4geyB0eXBlOiAibG9jYWwiLCBlbnRyaWVzOiBpIH07CiAgICB9LCBnZXRSZW1vdGVTZXQ6IGFzeW5jIChzKSA9PiB7CiAgICAgIGNvbnN0IGkgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgYyA9IGF3YWl0IG5lKHMub3B0cy5maWxlU3lzdGVtSGFuZGxlKTsKICAgICAgZm9yIChjb25zdCBbcCwgZl0gb2YgYykKICAgICAgICBwICE9PSAiLiIgJiYgKGlbbC5qb2luMihzLm1vdW50cG9pbnQsIHApXSA9IHsgdGltZXN0YW1wOiBmLmtpbmQgPT09ICJmaWxlIiA/IChhd2FpdCBmLmdldEZpbGUoKSkubGFzdE1vZGlmaWVkRGF0ZSA6IG5ldyBEYXRlKCksIG1vZGU6IGYua2luZCA9PT0gImZpbGUiID8gdS5GSUxFX01PREUgOiB1LkRJUl9NT0RFIH0pOwogICAgICByZXR1cm4geyB0eXBlOiAicmVtb3RlIiwgZW50cmllczogaSwgaGFuZGxlczogYyB9OwogICAgfSwgbG9hZExvY2FsRW50cnk6IChzKSA9PiB7CiAgICAgIGNvbnN0IGkgPSBuLmxvb2t1cFBhdGgocykubm9kZSwgYyA9IG4uc3RhdChzKTsKICAgICAgaWYgKG4uaXNEaXIoYy5tb2RlKSkKICAgICAgICByZXR1cm4geyB0aW1lc3RhbXA6IGMubXRpbWUsIG1vZGU6IGMubW9kZSB9OwogICAgICBpZiAobi5pc0ZpbGUoYy5tb2RlKSkKICAgICAgICByZXR1cm4gaS5jb250ZW50cyA9IGEuZ2V0RmlsZURhdGFBc1R5cGVkQXJyYXkoaSksIHsgdGltZXN0YW1wOiBjLm10aW1lLCBtb2RlOiBjLm1vZGUsIGNvbnRlbnRzOiBpLmNvbnRlbnRzIH07CiAgICAgIHRocm93IG5ldyBFcnJvcigibm9kZSB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKICAgIH0sIHN0b3JlTG9jYWxFbnRyeTogKHMsIGkpID0+IHsKICAgICAgaWYgKG4uaXNEaXIoaS5tb2RlKSkKICAgICAgICBuLm1rZGlyVHJlZShzLCBpLm1vZGUpOwogICAgICBlbHNlIHsKICAgICAgICBpZiAoIW4uaXNGaWxlKGkubW9kZSkpCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIm5vZGUgdHlwZSBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgbi53cml0ZUZpbGUocywgaS5jb250ZW50cywgeyBjYW5Pd246ICEwIH0pOwogICAgICB9CiAgICAgIG4uY2htb2QocywgaS5tb2RlKSwgbi51dGltZShzLCBpLnRpbWVzdGFtcCwgaS50aW1lc3RhbXApOwogICAgfSwgcmVtb3ZlTG9jYWxFbnRyeTogKHMpID0+IHsKICAgICAgdmFyIGkgPSBuLnN0YXQocyk7CiAgICAgIG4uaXNEaXIoaS5tb2RlKSA/IG4ucm1kaXIocykgOiBuLmlzRmlsZShpLm1vZGUpICYmIG4udW5saW5rKHMpOwogICAgfSwgbG9hZFJlbW90ZUVudHJ5OiBhc3luYyAocykgPT4gewogICAgICBpZiAocy5raW5kID09PSAiZmlsZSIpIHsKICAgICAgICBjb25zdCBpID0gYXdhaXQgcy5nZXRGaWxlKCk7CiAgICAgICAgcmV0dXJuIHsgY29udGVudHM6IG5ldyBVaW50OEFycmF5KGF3YWl0IGkuYXJyYXlCdWZmZXIoKSksIG1vZGU6IHUuRklMRV9NT0RFLCB0aW1lc3RhbXA6IGkubGFzdE1vZGlmaWVkRGF0ZSB9OwogICAgICB9CiAgICAgIGlmIChzLmtpbmQgPT09ICJkaXJlY3RvcnkiKQogICAgICAgIHJldHVybiB7IG1vZGU6IHUuRElSX01PREUsIHRpbWVzdGFtcDogbmV3IERhdGUoKSB9OwogICAgICB0aHJvdyBuZXcgRXJyb3IoInVua25vd24ga2luZDogIiArIHMua2luZCk7CiAgICB9LCBzdG9yZVJlbW90ZUVudHJ5OiBhc3luYyAocywgaSwgYykgPT4gewogICAgICBjb25zdCBwID0gcy5nZXQobC5kaXJuYW1lKGkpKSwgZiA9IG4uaXNGaWxlKGMubW9kZSkgPyBhd2FpdCBwLmdldEZpbGVIYW5kbGUobC5iYXNlbmFtZShpKSwgeyBjcmVhdGU6ICEwIH0pIDogYXdhaXQgcC5nZXREaXJlY3RvcnlIYW5kbGUobC5iYXNlbmFtZShpKSwgeyBjcmVhdGU6ICEwIH0pOwogICAgICBpZiAoZi5raW5kID09PSAiZmlsZSIpIHsKICAgICAgICBjb25zdCBkID0gYXdhaXQgZi5jcmVhdGVXcml0YWJsZSgpOwogICAgICAgIGF3YWl0IGQud3JpdGUoYy5jb250ZW50cyksIGF3YWl0IGQuY2xvc2UoKTsKICAgICAgfQogICAgICBzLnNldChpLCBmKTsKICAgIH0sIHJlbW92ZVJlbW90ZUVudHJ5OiBhc3luYyAocywgaSkgPT4gewogICAgICBhd2FpdCBzLmdldChsLmRpcm5hbWUoaSkpLnJlbW92ZUVudHJ5KGwuYmFzZW5hbWUoaSkpLCBzLmRlbGV0ZShpKTsKICAgIH0sIHJlY29uY2lsZTogYXN5bmMgKHMsIGksIGMpID0+IHsKICAgICAgbGV0IHAgPSAwOwogICAgICBjb25zdCBmID0gW107CiAgICAgIE9iamVjdC5rZXlzKGkuZW50cmllcykuZm9yRWFjaChmdW5jdGlvbih5KSB7CiAgICAgICAgY29uc3QgZyA9IGkuZW50cmllc1t5XSwgdyA9IGMuZW50cmllc1t5XTsKICAgICAgICAoIXcgfHwgbi5pc0ZpbGUoZy5tb2RlKSAmJiBnLnRpbWVzdGFtcC5nZXRUaW1lKCkgPiB3LnRpbWVzdGFtcC5nZXRUaW1lKCkpICYmIChmLnB1c2goeSksIHArKyk7CiAgICAgIH0pLCBmLnNvcnQoKTsKICAgICAgY29uc3QgZCA9IFtdOwogICAgICBpZiAoT2JqZWN0LmtleXMoYy5lbnRyaWVzKS5mb3JFYWNoKGZ1bmN0aW9uKHkpIHsKICAgICAgICBpLmVudHJpZXNbeV0gfHwgKGQucHVzaCh5KSwgcCsrKTsKICAgICAgfSksIGQuc29ydCgpLnJldmVyc2UoKSwgIXApCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBtID0gaS50eXBlID09PSAicmVtb3RlIiA/IGkuaGFuZGxlcyA6IGMuaGFuZGxlczsKICAgICAgZm9yIChjb25zdCB5IG9mIGYpIHsKICAgICAgICBjb25zdCBnID0gbC5ub3JtYWxpemUoeS5yZXBsYWNlKHMubW91bnRwb2ludCwgIi8iKSkuc3Vic3RyaW5nKDEpOwogICAgICAgIGlmIChjLnR5cGUgPT09ICJsb2NhbCIpIHsKICAgICAgICAgIGNvbnN0IHcgPSBtLmdldChnKSwgRiA9IGF3YWl0IHUubG9hZFJlbW90ZUVudHJ5KHcpOwogICAgICAgICAgdS5zdG9yZUxvY2FsRW50cnkoeSwgRik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHcgPSB1LmxvYWRMb2NhbEVudHJ5KHkpOwogICAgICAgICAgYXdhaXQgdS5zdG9yZVJlbW90ZUVudHJ5KG0sIGcsIHcpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGNvbnN0IHkgb2YgZCkKICAgICAgICBpZiAoYy50eXBlID09PSAibG9jYWwiKQogICAgICAgICAgdS5yZW1vdmVMb2NhbEVudHJ5KHkpOwogICAgICAgIGVsc2UgewogICAgICAgICAgY29uc3QgZyA9IGwubm9ybWFsaXplKHkucmVwbGFjZShzLm1vdW50cG9pbnQsICIvIikpLnN1YnN0cmluZygxKTsKICAgICAgICAgIGF3YWl0IHUucmVtb3ZlUmVtb3RlRW50cnkobSwgZyk7CiAgICAgICAgfQogICAgfSB9OwogICAgci5GUy5maWxlc3lzdGVtcy5OQVRJVkVGU19BU1lOQyA9IHU7CiAgfShlKSk7Cn0KZnVuY3Rpb24gaWUoZSwgdCkgewogIGUucnVuUHl0aG9uSW50ZXJuYWxfZGljdCA9IGUuX3B5b2RpZGUuX2Jhc2UuZXZhbF9jb2RlKCJ7fSIpLCBlLmltcG9ydGxpYiA9IGUucnVuUHl0aG9uSW50ZXJuYWwoImltcG9ydCBpbXBvcnRsaWI7IGltcG9ydGxpYiIpOwogIGxldCBvID0gZS5pbXBvcnRsaWIuaW1wb3J0X21vZHVsZTsKICBlLnN5cyA9IG8oInN5cyIpLCBlLnN5cy5wYXRoLmluc2VydCgwLCB0LmhvbWVkaXIpLCBlLm9zID0gbygib3MiKTsKICBsZXQgciA9IGUucnVuUHl0aG9uSW50ZXJuYWwoImltcG9ydCBfX21haW5fXzsgX19tYWluX18uX19kaWN0X18iKSwgbiA9IGUucnVuUHl0aG9uSW50ZXJuYWwoImltcG9ydCBidWlsdGluczsgYnVpbHRpbnMuX19kaWN0X18iKTsKICB2YXIgYTsKICBlLmdsb2JhbHMgPSAoYSA9IG4sIG5ldyBQcm94eShyLCB7IGdldDogKHMsIGkpID0+IGkgPT09ICJnZXQiID8gKGMpID0+IHsKICAgIGxldCBwID0gcy5nZXQoYyk7CiAgICByZXR1cm4gcCA9PT0gdm9pZCAwICYmIChwID0gYS5nZXQoYykpLCBwOwogIH0gOiBpID09PSAiaGFzIiA/IChjKSA9PiBzLmhhcyhjKSB8fCBhLmhhcyhjKSA6IFJlZmxlY3QuZ2V0KHMsIGkpIH0pKTsKICBsZXQgbCA9IGUuX3B5b2RpZGUuX2ltcG9ydGhvb2s7CiAgbC5yZWdpc3Rlcl9qc19maW5kZXIoKSwgbC5yZWdpc3Rlcl9qc19tb2R1bGUoImpzIiwgdC5qc2dsb2JhbHMpOwogIGxldCB1ID0gZS5tYWtlUHVibGljQVBJKCk7CiAgcmV0dXJuIGwucmVnaXN0ZXJfanNfbW9kdWxlKCJweW9kaWRlX2pzIiwgdSksIGUucHlvZGlkZV9weSA9IG8oInB5b2RpZGUiKSwgZS5weW9kaWRlX2NvZGUgPSBvKCJweW9kaWRlLmNvZGUiKSwgZS5weW9kaWRlX2ZmaSA9IG8oInB5b2RpZGUuZmZpIiksIGUucGFja2FnZV9sb2FkZXIgPSBvKCJweW9kaWRlLl9wYWNrYWdlX2xvYWRlciIpLCBlLnNpdGVwYWNrYWdlcyA9IGUucGFja2FnZV9sb2FkZXIuU0lURV9QQUNLQUdFUy5fX3N0cl9fKCksIGUuZHNvZGlyID0gZS5wYWNrYWdlX2xvYWRlci5EU09fRElSLl9fc3RyX18oKSwgZS5kZWZhdWx0TGRMaWJyYXJ5UGF0aCA9IFtlLmRzb2RpciwgZS5zaXRlcGFja2FnZXNdLCBlLm9zLmVudmlyb24uX19zZXRpdGVtX18oIkxEX0xJQlJBUllfUEFUSCIsIGUuZGVmYXVsdExkTGlicmFyeVBhdGguam9pbigiOiIpKSwgdS5weW9kaWRlX3B5ID0gZS5weW9kaWRlX3B5LCB1Lmdsb2JhbHMgPSBlLmdsb2JhbHMsIHU7Cn0KYXN5bmMgZnVuY3Rpb24gYWUoZSA9IHt9KSB7CiAgYXdhaXQgYXN5bmMgZnVuY3Rpb24oKSB7CiAgICBpZiAoIUUgfHwgKHEgPSAoYXdhaXQgaW1wb3J0KCIuL19fdml0ZS1icm93c2VyLWV4dGVybmFsLTUwMDNkMjljLmpzIikpLmRlZmF1bHQsIHogPSBhd2FpdCBpbXBvcnQoIi4vX192aXRlLWJyb3dzZXItZXh0ZXJuYWwtNTAwM2QyOWMuanMiKSwgQyA9IGdsb2JhbFRoaXMuZmV0Y2ggPyBmZXRjaCA6IChhd2FpdCBpbXBvcnQoIi4vaW5kZXgtODM4NTQzNmYuanMiKSkuZGVmYXVsdCwgWCA9IChhd2FpdCBpbXBvcnQoIi4vX192aXRlLWJyb3dzZXItZXh0ZXJuYWwtNTAwM2QyOWMuanMiKSkuZGVmYXVsdCwgSSA9IGF3YWl0IGltcG9ydCgiLi9fX3ZpdGUtYnJvd3Nlci1leHRlcm5hbC01MDAzZDI5Yy5qcyIpLCBVID0gSS5zZXAsIHR5cGVvZiByZXF1aXJlIDwgInUiKSkKICAgICAgcmV0dXJuOwogICAgY29uc3QgYyA9IHsgZnM6IGF3YWl0IGltcG9ydCgiLi9fX3ZpdGUtYnJvd3Nlci1leHRlcm5hbC01MDAzZDI5Yy5qcyIpLCBjcnlwdG86IGF3YWl0IGltcG9ydCgiLi9fX3ZpdGUtYnJvd3Nlci1leHRlcm5hbC01MDAzZDI5Yy5qcyIpLCB3czogYXdhaXQgaW1wb3J0KCIuL19fdml0ZS1icm93c2VyLWV4dGVybmFsLTUwMDNkMjljLmpzIiksIGNoaWxkX3Byb2Nlc3M6IGF3YWl0IGltcG9ydCgiLi9fX3ZpdGUtYnJvd3Nlci1leHRlcm5hbC01MDAzZDI5Yy5qcyIpIH07CiAgICBnbG9iYWxUaGlzLnJlcXVpcmUgPSBmdW5jdGlvbihwKSB7CiAgICAgIHJldHVybiBjW3BdOwogICAgfTsKICB9KCk7CiAgbGV0IHQgPSBlLmluZGV4VVJMIHx8IGZ1bmN0aW9uKCkgewogICAgaWYgKHR5cGVvZiBfX2Rpcm5hbWUgPT0gInN0cmluZyIpCiAgICAgIHJldHVybiBfX2Rpcm5hbWU7CiAgICBsZXQgYzsKICAgIHRyeSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigpOwogICAgfSBjYXRjaCAoZCkgewogICAgICBjID0gZDsKICAgIH0KICAgIGxldCBwID0gZWUucGFyc2UoYylbMF0uZmlsZU5hbWU7CiAgICBjb25zdCBmID0gcC5sYXN0SW5kZXhPZihVKTsKICAgIGlmIChmID09PSAtMSkKICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZXh0cmFjdCBpbmRleFVSTCBwYXRoIGZyb20gcHlvZGlkZSBtb2R1bGUgbG9jYXRpb24iKTsKICAgIHJldHVybiBwLnNsaWNlKDAsIGYpOwogIH0oKTsKICB0ID0gSih0KSwgdC5lbmRzV2l0aCgiLyIpIHx8ICh0ICs9ICIvIiksIGUuaW5kZXhVUkwgPSB0OwogIGNvbnN0IG8gPSB7IGZ1bGxTdGRMaWI6ICExLCBqc2dsb2JhbHM6IGdsb2JhbFRoaXMsIHN0ZGluOiBnbG9iYWxUaGlzLnByb21wdCA/IGdsb2JhbFRoaXMucHJvbXB0IDogdm9pZCAwLCBob21lZGlyOiAiL2hvbWUvcHlvZGlkZSIsIGxvY2tGaWxlVVJMOiB0ICsgInJlcG9kYXRhLmpzb24iLCBhcmdzOiBbXSwgX25vZGVfbW91bnRzOiBbXSB9LCByID0gT2JqZWN0LmFzc2lnbihvLCBlKSwgbiA9IGZ1bmN0aW9uKCkgewogICAgbGV0IGMgPSB7IG5vSW1hZ2VEZWNvZGluZzogITAsIG5vQXVkaW9EZWNvZGluZzogITAsIG5vV2FzbURlY29kaW5nOiAhMSwgcHJlUnVuOiBbXSwgcXVpdDogKHAsIGYpID0+IHsKICAgICAgdGhyb3cgYy5leGl0ZWQgPSB7IHN0YXR1czogcCwgdG9UaHJvdzogZiB9LCBmOwogICAgfSB9OwogICAgcmV0dXJuIGM7CiAgfSgpOwogIG4ucHJpbnQgPSByLnN0ZG91dCwgbi5wcmludEVyciA9IHIuc3RkZXJyLCBuLmFyZ3VtZW50cyA9IHIuYXJnczsKICBjb25zdCBhID0geyBjb25maWc6IHIgfTsKICBuLkFQSSA9IGEsIG9lKG4sIHIpOwogIGNvbnN0IGwgPSBuZXcgUHJvbWlzZSgoYykgPT4gbi5wb3N0UnVuID0gYyk7CiAgaWYgKG4ubG9jYXRlRmlsZSA9IChjKSA9PiByLmluZGV4VVJMICsgYywgdHlwZW9mIF9jcmVhdGVQeW9kaWRlTW9kdWxlICE9ICJmdW5jdGlvbiIpIHsKICAgIGNvbnN0IGMgPSBgJHtyLmluZGV4VVJMfXB5b2RpZGUuYXNtLmpzYDsKICAgIGF3YWl0IE4oYyk7CiAgfQogIGlmIChhd2FpdCBfY3JlYXRlUHlvZGlkZU1vZHVsZShuKSwgYXdhaXQgbCwgbi5leGl0ZWQpCiAgICB0aHJvdyBuLmV4aXRlZC50b1Rocm93OwogIGlmIChhLnZlcnNpb24gIT09ICIwLjIzLjIiKQogICAgdGhyb3cgbmV3IEVycm9yKGBQeW9kaWRlIHZlcnNpb24gZG9lcyBub3QgbWF0Y2g6ICcwLjIzLjInIDw9PT4gJyR7YS52ZXJzaW9ufScuIElmIHlvdSB1cGRhdGVkIHRoZSBQeW9kaWRlIHZlcnNpb24sIG1ha2Ugc3VyZSB5b3UgYWxzbyB1cGRhdGVkIHRoZSAnaW5kZXhVUkwnIHBhcmFtZXRlciBwYXNzZWQgdG8gbG9hZFB5b2RpZGUuYCk7CiAgbi5sb2NhdGVGaWxlID0gKGMpID0+IHsKICAgIHRocm93IG5ldyBFcnJvcigiRGlkbid0IGV4cGVjdCB0byBsb2FkIGFueSBtb3JlIGZpbGVfcGFja2FnZXIgZmlsZXMhIik7CiAgfTsKICBsZXQgW3UsIHNdID0gYS5yYXdSdW4oImltcG9ydCBfcHlvZGlkZV9jb3JlIik7CiAgdSAmJiBuLkFQSS5mYXRhbF9sb2FkaW5nX2Vycm9yKGBGYWlsZWQgdG8gaW1wb3J0IF9weW9kaWRlX2NvcmUKYCwgcyk7CiAgY29uc3QgaSA9IGllKGEsIHIpOwogIGlmIChpLnZlcnNpb24uaW5jbHVkZXMoImRldiIpIHx8IGEuc2V0Q2RuVXJsKGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvcHlvZGlkZS92JHtpLnZlcnNpb259L2Z1bGwvYCksIGF3YWl0IGEucGFja2FnZUluZGV4UmVhZHksIGEuX3B5b2RpZGUuX2ltcG9ydGhvb2sucmVnaXN0ZXJfbW9kdWxlX25vdF9mb3VuZF9ob29rKGEuX2ltcG9ydF9uYW1lX3RvX3BhY2thZ2VfbmFtZSwgYS5yZXBvZGF0YV91bnZlbmRvcmVkX3N0ZGxpYnNfYW5kX3Rlc3QpLCBhLnJlcG9kYXRhX2luZm8udmVyc2lvbiAhPT0gIjAuMjMuMiIpCiAgICB0aHJvdyBuZXcgRXJyb3IoIkxvY2sgZmlsZSB2ZXJzaW9uIGRvZXNuJ3QgbWF0Y2ggUHlvZGlkZSB2ZXJzaW9uIik7CiAgcmV0dXJuIGEucGFja2FnZV9sb2FkZXIuaW5pdF9sb2FkZWRfcGFja2FnZXMoKSwgci5mdWxsU3RkTGliICYmIGF3YWl0IGkubG9hZFBhY2thZ2UoYS5yZXBvZGF0YV91bnZlbmRvcmVkX3N0ZGxpYnMpLCBhLmluaXRpYWxpemVTdHJlYW1zKHIuc3RkaW4sIHIuc3Rkb3V0LCByLnN0ZGVyciksIGk7Cn0KY29uc3Qgc2UgPSB7CiAgbG9hZFB5b2RpZGVPcHRpb25zOiB7CiAgICBpbmRleFVSTDogImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9weW9kaWRlL3YwLjIzLjIvZnVsbC8iCiAgfQp9Owp2YXIgY2UgPSBgIyBweXJpZ2h0OiByZXBvcnRNaXNzaW5nSW1wb3J0cz1mYWxzZQojIHR5cGU6IGlnbm9yZQoKIyBibGFjawppbXBvcnQgc3lzCmltcG9ydCBtaWNyb3BpcAppbXBvcnQgYXN5bmNpbwpzeXMubW9kdWxlc1siX211bHRpcHJvY2Vzc2luZyJdID0gb2JqZWN0Cgphd2FpdCBtaWNyb3BpcC5pbnN0YWxsKCJqZWRpIikKYXdhaXQgbWljcm9waXAuaW5zdGFsbCgiYmxhY2siKQoKaW1wb3J0IGplZGkKZnJvbSBibGFjayBpbXBvcnQgZm9ybWF0X3N0ciwgRmlsZU1vZGUKCgpkZWYgZ2V0X2F1dG9jb21wbGV0aW9uKGNvZGUsIGxpbmUsIGNvbHVtbik6CiAgICByZXN1bHQgPSBqZWRpLkludGVycHJldGVyKGNvZGUsIFtnbG9iYWxzKCksIGxvY2FscygpXSkKCiAgICBjb21wbGV0aW9ucyA9IHJlc3VsdC5jb21wbGV0ZShsaW5lLCBjb2x1bW4pCgogICAgbWF0Y2hlcyA9IFtdCiAgICBmb3IgY29tcCBpbiBjb21wbGV0aW9uczoKICAgICAgICBtYXRjaGVzLmFwcGVuZChkaWN0KAogICAgICAgICAgICBuYW1lPWNvbXAubmFtZSwKICAgICAgICAgICAgdHlwZT1jb21wLnR5cGUsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPWNvbXAuZGVzY3JpcHRpb24sCiAgICAgICAgICAgIGZ1bGxfbmFtZT1jb21wLmZ1bGxfbmFtZQogICAgICAgICkpCgogICAgcmV0dXJuIHsKICAgICAgICAibWF0Y2hlcyI6IG1hdGNoZXMKICAgIH0KCgphc3luYyBkZWYgaW5zdGFsbF9wYWNha2dlKHBhY2thZ2UpOgogICAgdHJ5OgogICAgICAgIGF3YWl0IG1pY3JvcGlwLmluc3RhbGwocGFja2FnZSwga2VlcF9nb2luZz1UcnVlKQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzdWNjZXNzIjogVHJ1ZQogICAgICAgIH0KICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3VjY2VzcyI6IEZhbHNlLAogICAgICAgICAgICAiZXJyb3IiOiBzdHIoZSkKICAgICAgICB9CgoKZGVmIGZvcm1hdF9jb2RlKGNvZGUsIG9wdGlvbnMpOgogICAgaWYgb3B0aW9uczoKICAgICAgICBtb2RlID0gRmlsZU1vZGUoKipvcHRpb25zKQogICAgICAgIHJldHVybiBmb3JtYXRfc3RyKGNvZGUsIG1vZGU9bW9kZSkKICAgIHJldHVybiBmb3JtYXRfc3RyKGNvZGUsIG1vZGU9RmlsZU1vZGUoKSkKYDsKZnVuY3Rpb24gbGUoZSwgdCwgbykgewogIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgdmFsdWU6IG8sCiAgICBlbnVtZXJhYmxlOiAhMCwKICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICB3cml0YWJsZTogITAKICB9KSA6IGVbdF0gPSBvLCBlOwp9CmZ1bmN0aW9uIEEoZSwgdCkgewogIHZhciBvID0gT2JqZWN0LmtleXMoZSk7CiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgIHZhciByID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgIHQgJiYgKHIgPSByLmZpbHRlcihmdW5jdGlvbihuKSB7CiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG4pLmVudW1lcmFibGU7CiAgICB9KSksIG8ucHVzaC5hcHBseShvLCByKTsKICB9CiAgcmV0dXJuIG87Cn0KZnVuY3Rpb24gSChlKSB7CiAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgIHZhciBvID0gYXJndW1lbnRzW3RdICE9IG51bGwgPyBhcmd1bWVudHNbdF0gOiB7fTsKICAgIHQgJSAyID8gQShPYmplY3QobyksICEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpIHsKICAgICAgbGUoZSwgciwgb1tyXSk7CiAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobykpIDogQShPYmplY3QobykpLmZvckVhY2goZnVuY3Rpb24ocikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLCByKSk7CiAgICB9KTsKICB9CiAgcmV0dXJuIGU7Cn0KZnVuY3Rpb24gdWUoKSB7CiAgZm9yICh2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsIHQgPSBuZXcgQXJyYXkoZSksIG8gPSAwOyBvIDwgZTsgbysrKQogICAgdFtvXSA9IGFyZ3VtZW50c1tvXTsKICByZXR1cm4gZnVuY3Rpb24ocikgewogICAgcmV0dXJuIHQucmVkdWNlUmlnaHQoZnVuY3Rpb24obiwgYSkgewogICAgICByZXR1cm4gYShuKTsKICAgIH0sIHIpOwogIH07Cn0KZnVuY3Rpb24gTyhlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uIHQoKSB7CiAgICBmb3IgKHZhciBvID0gdGhpcywgciA9IGFyZ3VtZW50cy5sZW5ndGgsIG4gPSBuZXcgQXJyYXkociksIGEgPSAwOyBhIDwgcjsgYSsrKQogICAgICBuW2FdID0gYXJndW1lbnRzW2FdOwogICAgcmV0dXJuIG4ubGVuZ3RoID49IGUubGVuZ3RoID8gZS5hcHBseSh0aGlzLCBuKSA6IGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciBsID0gYXJndW1lbnRzLmxlbmd0aCwgdSA9IG5ldyBBcnJheShsKSwgcyA9IDA7IHMgPCBsOyBzKyspCiAgICAgICAgdVtzXSA9IGFyZ3VtZW50c1tzXTsKICAgICAgcmV0dXJuIHQuYXBwbHkobywgW10uY29uY2F0KG4sIHUpKTsKICAgIH07CiAgfTsKfQpmdW5jdGlvbiB4KGUpIHsKICByZXR1cm4ge30udG9TdHJpbmcuY2FsbChlKS5pbmNsdWRlcygiT2JqZWN0Iik7Cn0KZnVuY3Rpb24gZGUoZSkgewogIHJldHVybiAhT2JqZWN0LmtleXMoZSkubGVuZ3RoOwp9CmZ1bmN0aW9uIFMoZSkgewogIHJldHVybiB0eXBlb2YgZSA9PSAiZnVuY3Rpb24iOwp9CmZ1bmN0aW9uIHBlKGUsIHQpIHsKICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHQpOwp9CmZ1bmN0aW9uIGZlKGUsIHQpIHsKICByZXR1cm4geCh0KSB8fCBfKCJjaGFuZ2VUeXBlIiksIE9iamVjdC5rZXlzKHQpLnNvbWUoZnVuY3Rpb24obykgewogICAgcmV0dXJuICFwZShlLCBvKTsKICB9KSAmJiBfKCJjaGFuZ2VGaWVsZCIpLCB0Owp9CmZ1bmN0aW9uIG1lKGUpIHsKICBTKGUpIHx8IF8oInNlbGVjdG9yVHlwZSIpOwp9CmZ1bmN0aW9uIHllKGUpIHsKICBTKGUpIHx8IHgoZSkgfHwgXygiaGFuZGxlclR5cGUiKSwgeChlKSAmJiBPYmplY3QudmFsdWVzKGUpLnNvbWUoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICFTKHQpOwogIH0pICYmIF8oImhhbmRsZXJzVHlwZSIpOwp9CmZ1bmN0aW9uIGhlKGUpIHsKICBlIHx8IF8oImluaXRpYWxJc1JlcXVpcmVkIiksIHgoZSkgfHwgXygiaW5pdGlhbFR5cGUiKSwgZGUoZSkgJiYgXygiaW5pdGlhbENvbnRlbnQiKTsKfQpmdW5jdGlvbiBnZShlLCB0KSB7CiAgdGhyb3cgbmV3IEVycm9yKGVbdF0gfHwgZS5kZWZhdWx0KTsKfQp2YXIgd2UgPSB7CiAgaW5pdGlhbElzUmVxdWlyZWQ6ICJpbml0aWFsIHN0YXRlIGlzIHJlcXVpcmVkIiwKICBpbml0aWFsVHlwZTogImluaXRpYWwgc3RhdGUgc2hvdWxkIGJlIGFuIG9iamVjdCIsCiAgaW5pdGlhbENvbnRlbnQ6ICJpbml0aWFsIHN0YXRlIHNob3VsZG4ndCBiZSBhbiBlbXB0eSBvYmplY3QiLAogIGhhbmRsZXJUeXBlOiAiaGFuZGxlciBzaG91bGQgYmUgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24iLAogIGhhbmRsZXJzVHlwZTogImFsbCBoYW5kbGVycyBzaG91bGQgYmUgYSBmdW5jdGlvbnMiLAogIHNlbGVjdG9yVHlwZTogInNlbGVjdG9yIHNob3VsZCBiZSBhIGZ1bmN0aW9uIiwKICBjaGFuZ2VUeXBlOiAicHJvdmlkZWQgdmFsdWUgb2YgY2hhbmdlcyBzaG91bGQgYmUgYW4gb2JqZWN0IiwKICBjaGFuZ2VGaWVsZDogJ2l0IHNlYW1zIHlvdSB3YW50IHRvIGNoYW5nZSBhIGZpZWxkIGluIHRoZSBzdGF0ZSB3aGljaCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSAiaW5pdGlhbCIgc3RhdGUnLAogIGRlZmF1bHQ6ICJhbiB1bmtub3duIGVycm9yIGFjY3VyZWQgaW4gYHN0YXRlLWxvY2FsYCBwYWNrYWdlIgp9LCBfID0gTyhnZSkod2UpLCBMID0gewogIGNoYW5nZXM6IGZlLAogIHNlbGVjdG9yOiBtZSwKICBoYW5kbGVyOiB5ZSwKICBpbml0aWFsOiBoZQp9OwpmdW5jdGlvbiBfZShlKSB7CiAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogIEwuaW5pdGlhbChlKSwgTC5oYW5kbGVyKHQpOwogIHZhciBvID0gewogICAgY3VycmVudDogZQogIH0sIHIgPSBPKEVlKShvLCB0KSwgbiA9IE8odmUpKG8pLCBhID0gTyhMLmNoYW5nZXMpKGUpLCBsID0gTyhiZSkobyk7CiAgZnVuY3Rpb24gdSgpIHsKICAgIHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMF0gOiBmdW5jdGlvbihjKSB7CiAgICAgIHJldHVybiBjOwogICAgfTsKICAgIHJldHVybiBMLnNlbGVjdG9yKGkpLCBpKG8uY3VycmVudCk7CiAgfQogIGZ1bmN0aW9uIHMoaSkgewogICAgdWUociwgbiwgYSwgbCkoaSk7CiAgfQogIHJldHVybiBbdSwgc107Cn0KZnVuY3Rpb24gYmUoZSwgdCkgewogIHJldHVybiBTKHQpID8gdChlLmN1cnJlbnQpIDogdDsKfQpmdW5jdGlvbiB2ZShlLCB0KSB7CiAgcmV0dXJuIGUuY3VycmVudCA9IEgoSCh7fSwgZS5jdXJyZW50KSwgdCksIHQ7Cn0KZnVuY3Rpb24gRWUoZSwgdCwgbykgewogIHJldHVybiBTKHQpID8gdChlLmN1cnJlbnQpIDogT2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbihyKSB7CiAgICB2YXIgbjsKICAgIHJldHVybiAobiA9IHRbcl0pID09PSBudWxsIHx8IG4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG4uY2FsbCh0LCBlLmN1cnJlbnRbcl0pOwogIH0pLCBvOwp9CnZhciBPZSA9IHsKICBjcmVhdGU6IF9lCn0sIFcgPSAvKiBAX19QVVJFX18gKi8gKChlKSA9PiAoZVtlLlJFQURZID0gMF0gPSAiUkVBRFkiLCBlKSkoVyB8fCB7fSksIGggPSAvKiBAX19QVVJFX18gKi8gKChlKSA9PiAoZVtlLkVYRUMgPSAwXSA9ICJFWEVDIiwgZVtlLkNPTVBMRVRFID0gMV0gPSAiQ09NUExFVEUiLCBlW2UuSU5TVEFMTCA9IDJdID0gIklOU1RBTEwiLCBlW2UuRk9STUFUID0gM10gPSAiRk9STUFUIiwgZVtlLkpTX0ZOX0NBTEwgPSA0XSA9ICJKU19GTl9DQUxMIiwgZSkpKGggfHwge30pLCBZID0gLyogQF9fUFVSRV9fICovICgoZSkgPT4gKGUuRk4gPSAiX19mdW5jdGlvbl9fIiwgZSkpKFkgfHwge30pOwpjb25zdCBHID0gIndyYXBwZXIiOwpmdW5jdGlvbiB2KGUsIHQpIHsKICB2YXIgbjsKICBjb25zdCBvID0gKChuID0gZSA9PSBudWxsID8gdm9pZCAwIDogZS50b0pzKSA9PSBudWxsID8gdm9pZCAwIDogbi5jYWxsKGUsIHsKICAgIGRpY3RfY29udmVydGVyOiBPYmplY3QuZnJvbUVudHJpZXMsCiAgICBjcmVhdGVfcHlwcm94aWVzOiAhMQogIH0pKSB8fCBlLCByID0gbyBpbnN0YW5jZW9mIHQuZmZpLlB5UHJveHkgPyBvLnRvU3RyaW5nKCkgOiBvOwogIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcocikpIHsKICAgIGNvbnN0IGEgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocik7CiAgICByZXR1cm4gZS5nZXRCdWZmZXIoKS5yZWxlYXNlKCksIGE7CiAgfQogIHJldHVybiByOwp9CmNvbnN0IFQgPSAvRmlsZSAiPGV4ZWM+IiwgbGluZSAoXGQrKSgkfCwgaW4gPG1vZHVsZT4pJC9tLCBQID0gbmV3IFJlZ0V4cCgKICBgRmlsZSAiPGV4ZWM+IiwgbGluZSAoXFxkKyksIGluICR7R31gLAogICJtIgopLCBTZSA9IC9saW5lIChcZCspL2c7CmZ1bmN0aW9uIGooZSkgewogIHJldHVybiBlLnJlcGxhY2UoU2UsICh0LCBvKSA9PiBgbGluZSAkeytvIC0gMX1gKTsKfQpmdW5jdGlvbiBGZShlKSB7CiAgY29uc3QgdCA9IFQudGVzdChlKSwgbyA9IFAudGVzdChlKTsKICBpZiAoISh0IHx8IG8pKQogICAgcmV0dXJuIGU7CiAgY29uc3QgciA9IGUuc3BsaXQoYApgKSwgbiA9IHIuZmluZEluZGV4KAogICAgKGwpID0+IHQgPyBULnRlc3QobCkgOiBQLnRlc3QobCkKICApOwogIGxldCBhID0gITE7CiAgcmV0dXJuIHIuc2xpY2UobikucmVkdWNlKChsLCB1KSA9PiB7CiAgICBpZiAoYSkKICAgICAgbC5wdXNoKGoodSkpOwogICAgZWxzZSB7CiAgICAgIGlmICh0ICYmICFvICYmIFQudGVzdCh1KSkKICAgICAgICByZXR1cm4gYSA9ICEwLCBsLnB1c2goaih1KS5yZXBsYWNlKCIsIGluIDxtb2R1bGU+IiwgIiIpKSwgbDsKICAgICAgaWYgKG8gJiYgUC50ZXN0KHUpKQogICAgICAgIHJldHVybiBhID0gITAsIGwucHVzaChqKHUpLnJlcGxhY2UoYCwgaW4gJHtHfWAsICIiKSksIGw7CiAgICB9CiAgICByZXR1cm4gbDsKICB9LCBbXSkuam9pbihgCmApOwp9CmZ1bmN0aW9uIExlKGUsIHQsIG8pIHsKICByZXR1cm4geyAuLi5lLCBbdF06IG8gfTsKfQpjb25zdCBbRCwgTmVdID0gT2UuY3JlYXRlKHsKICBjYWxsYmFja3M6IHt9LAogIGNvbW1hbmRVbmlxdWVJZDogMAp9KTsKYXN5bmMgZnVuY3Rpb24geGUoKSB7CiAgY29uc3QgZSA9IGF3YWl0IGFlKHNlLmxvYWRQeW9kaWRlT3B0aW9ucyk7CiAgYXdhaXQgZS5sb2FkUGFja2FnZSgibWljcm9waXAiKSwgYXdhaXQgZS5ydW5QeXRob25Bc3luYyhjZSk7CiAgbGV0IHQ7CiAgc2VsZi5TaGFyZWRBcnJheUJ1ZmZlciAmJiAodCA9IG5ldyBVaW50OEFycmF5KG5ldyBzZWxmLlNoYXJlZEFycmF5QnVmZmVyKDEpKSwgZS5zZXRJbnRlcnJ1cHRCdWZmZXIodCkpLCBwb3N0TWVzc2FnZSh7CiAgICBzdGF0dXM6IFcuUkVBRFksCiAgICBpbnRlcnJ1cHRCdWZmZXI6IHQKICB9KTsKICBjb25zdCBvID0gewogICAgW2guRVhFQ106IGFzeW5jICh7IGNvZGU6IGEsIGNvbnRleHQ6IGwgPSB7fSB9KSA9PiB7CiAgICAgIGNvbnN0IHUgPSBbXTsKICAgICAgT2JqZWN0LmVudHJpZXMobCkuZm9yRWFjaCgoW3MsIGldKSA9PiB7CiAgICAgICAgKGkgPT0gbnVsbCA/IHZvaWQgMCA6IGkudHlwZSkgPT09IFkuRk4gPyBlLmdsb2JhbHMuc2V0KAogICAgICAgICAgcywKICAgICAgICAgIG4ocywgdSkKICAgICAgICApIDogZS5nbG9iYWxzLnNldChzLCBlLnRvUHkoaSkpOwogICAgICB9KTsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCBlLmxvYWRQYWNrYWdlc0Zyb21JbXBvcnRzKGEpLCBlLnJ1blB5dGhvbigiaW1wb3J0IHN5cywgaW87IHN5cy5zdGRvdXQgPSBpby5TdHJpbmdJTygpOyBzeXMuc3RkZXJyID0gaW8uU3RyaW5nSU8oKSIpOwogICAgICAgIGNvbnN0IHMgPSBhd2FpdCBlLnJ1blB5dGhvbkFzeW5jKGEpLCBpID0gZS5ydW5QeXRob24oImltcG9ydCBzeXM7IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKSIpLnRyaW0oKSwgYyA9IGUucnVuUHl0aG9uKCJpbXBvcnQgc3lzOyBzeXMuc3RkZXJyLmdldHZhbHVlKCkiKS50cmltKCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJlc3VsdDogdihzLCBlKSwKICAgICAgICAgIHN0ZG91dDogdihpLCBlKSwKICAgICAgICAgIHN0ZGVycjogYywKICAgICAgICAgIGVycm9yOiBudWxsCiAgICAgICAgfTsKICAgICAgfSBjYXRjaCAocykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICByZXN1bHQ6IG51bGwsCiAgICAgICAgICBzdGRvdXQ6IG51bGwsCiAgICAgICAgICBzdGRlcnI6IG51bGwsCiAgICAgICAgICBlcnJvcjogRmUocy5tZXNzYWdlKQogICAgICAgIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHMgfSA9IEQoKTsKICAgICAgICBPYmplY3QuZW50cmllcyhsKS5mb3JFYWNoKChbaV0pID0+IHsKICAgICAgICAgIHZhciBjOwogICAgICAgICAgZS5nbG9iYWxzLnNldChpLCAoYyA9IGUudG9QeShudWxsKSkgPT0gbnVsbCA/IHZvaWQgMCA6IGMudG9TdHJpbmcoKSk7CiAgICAgICAgfSksIHUuZm9yRWFjaCgoaSkgPT4gewogICAgICAgICAgZGVsZXRlIHNbaV07CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICBbaC5DT01QTEVURV06IGFzeW5jICh7CiAgICAgIGNvZGU6IGEsCiAgICAgIGxpbmU6IGwsCiAgICAgIGNvbHVtbjogdQogICAgfSkgPT4gewogICAgICBhd2FpdCBlLmxvYWRQYWNrYWdlc0Zyb21JbXBvcnRzKGEpOwogICAgICBjb25zdCBzID0gZS5nbG9iYWxzLmdldCgiZ2V0X2F1dG9jb21wbGV0aW9uIikoYSwgbCwgdSk7CiAgICAgIHJldHVybiB7IHJlc3VsdDogdihzLCBlKSwgZXJyb3I6IG51bGwgfTsKICAgIH0sCiAgICBbaC5JTlNUQUxMXTogYXN5bmMgKHsgcGFja2FnZXM6IGEgfSkgPT4gewogICAgICBjb25zdCBsID0gYXdhaXQgZS5nbG9iYWxzLmdldCgiaW5zdGFsbF9wYWNha2dlIikoYVswXSk7CiAgICAgIHJldHVybiB2KGwsIGUpOwogICAgfSwKICAgIFtoLkZPUk1BVF06IGFzeW5jICh7CiAgICAgIGNvZGU6IGEsCiAgICAgIG9wdGlvbnM6IGwgPSB7fQogICAgfSkgPT4gewogICAgICBjb25zdCB1ID0gZS5nbG9iYWxzLmdldCgiZm9ybWF0X2NvZGUiKShhLCBlLnRvUHkobCkpOwogICAgICByZXR1cm4geyByZXN1bHQ6IHYodSwgZSksIGVycm9yOiBudWxsIH07CiAgICB9CiAgfTsKICBvbm1lc3NhZ2UgPSBhc3luYyBmdW5jdGlvbihsKSB7CiAgICBjb25zdCB7IGlkOiB1LCBhY3Rpb246IHMgPSBoLkVYRUMsIGRhdGE6IGkgfSA9IGwuZGF0YTsKICAgIGlmIChzID09PSBoLkpTX0ZOX0NBTEwpCiAgICAgIHIoaSwgdSk7CiAgICBlbHNlIHsKICAgICAgbGV0IGM7CiAgICAgIHN3aXRjaCAocykgewogICAgICAgIGNhc2UgaC5FWEVDOgogICAgICAgICAgYyA9IGF3YWl0IG9baC5FWEVDXShpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgaC5DT01QTEVURToKICAgICAgICAgIGMgPSBhd2FpdCBvW2guQ09NUExFVEVdKGkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBoLklOU1RBTEw6CiAgICAgICAgICBjID0gYXdhaXQgb1toLklOU1RBTExdKGkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBoLkZPUk1BVDoKICAgICAgICAgIGMgPSBhd2FpdCBvW2guRk9STUFUXShpKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICBkYXRhOiBjLAogICAgICAgIGlkOiB1LAogICAgICAgIGFjdGlvbjogcwogICAgICB9KTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIHIoYSwgbCkgewogICAgY29uc3QgeyByZXN1bHQ6IHUsIGVycm9yOiBzIH0gPSBhLCB7IGNhbGxiYWNrczogaSB9ID0gRCgpOwogICAgcyAmJiBpW2xdLnJlamVjdChzKSwgaVtsXS5yZXNvbHZlKHUpOwogIH0KICBmdW5jdGlvbiBuKGEsIGwpIHsKICAgIHJldHVybiBhc3luYyAoLi4udSkgPT4gbmV3IFByb21pc2UoKHMsIGkpID0+IHsKICAgICAgY29uc3QgeyBjYWxsYmFja3M6IGMsIGNvbW1hbmRVbmlxdWVJZDogcCB9ID0gRCgpOwogICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgYWN0aW9uOiBoLkpTX0ZOX0NBTEwsCiAgICAgICAgZGF0YTogewogICAgICAgICAgYXJnczogdSwKICAgICAgICAgIG5hbWU6IGEKICAgICAgICB9LAogICAgICAgIGlkOiBwCiAgICAgIH0pLCBsLnB1c2gocCksIE5lKHsKICAgICAgICBjYWxsYmFja3M6IExlKGMsIHAsIHsKICAgICAgICAgIHJlc29sdmU6IHMsCiAgICAgICAgICByZWplY3Q6IGkKICAgICAgICB9KSwKICAgICAgICBjb21tYW5kVW5pcXVlSWQ6IHAgKyAxCiAgICAgIH0pOwogICAgfSk7CiAgfQp9CnhlKCk7Cg==", Y = typeof window < "u" && window.Blob && new Blob([atob(w)], { type: "text/javascript;charset=utf-8" });
function x() {

@@ -172,4 +172,4 @@ const I = Y && (window.URL || window.webkitURL).createObjectURL(Y);

}
const D = Boolean(globalThis.Worker), [B, o] = T.create({
config: f,
const M = Boolean(globalThis.Worker), [B, o] = j.create({
config: O,
pyodideWorker: null,

@@ -190,5 +190,5 @@ callbacks: {},

}
}, E = j(function() {
}, E = T(function() {
return new Promise((g, C) => {
D || C(new Error(`your browser does
M || C(new Error(`your browser does
t support web workers!`));

@@ -198,10 +198,10 @@ const A = new x();

var b;
((b = l.data) == null ? void 0 : b.status) === X.READY ? (o({ pyodideWorker: A, interruptBuffer: l.data.interruptBuffer }), A.onmessage = function(Z) {
const { action: G, id: S, data: y } = Z.data;
switch (G) {
((b = l.data) == null ? void 0 : b.status) === H.READY ? (o({ pyodideWorker: A, interruptBuffer: l.data.interruptBuffer }), A.onmessage = function(G) {
const { action: Z, id: s, data: p } = G.data;
switch (Z) {
case m.JS_FN_CALL:
_(S, y);
_(s, p);
break;
default:
q(S, y);
q(s, p);
break;

@@ -219,3 +219,3 @@ }

K.command(II(I), m.EXEC), o({
callbacks: W(A, i, { resolve: g, reject: C })
callbacks: y(A, i, { resolve: g, reject: C })
});

@@ -228,7 +228,7 @@ });

const { commandUniqueId: A, callbacks: i } = B(), { code: l, line: b, column: c } = I;
let Z = b, G = c;
b || (Z = l.split(`
`).length), G || (G = l.split(`
`)[Z - 1].length), K.command({ code: l, line: Z, column: G }, m.COMPLETE), o({
callbacks: W(i, A, {
let G = b, Z = c;
b || (G = l.split(`
`).length), Z || (Z = l.split(`
`)[G - 1].length), K.command({ code: l, line: G, column: Z }, m.COMPLETE), o({
callbacks: y(i, A, {
resolve: g,

@@ -245,3 +245,3 @@ reject: C

K.command({ packages: I }, m.INSTALL), o({
callbacks: W(A, i, {
callbacks: y(A, i, {
resolve: g,

@@ -257,3 +257,3 @@ reject: C

K.command(I, m.FORMAT), o({
callbacks: W(A, i, {
callbacks: y(A, i, {
resolve: g,

@@ -276,6 +276,6 @@ reject: C

const { callbacks: C } = B();
O(I, Boolean(C[I]));
f(I, Boolean(C[I]));
const { resolve: A, reject: i } = C[I];
if (o({
callbacks: M(C, I)
callbacks: P(C, I)
}), g.error) {

@@ -301,6 +301,6 @@ i == null || i(g.error);

return Object.entries(I).reduce((C, [A, i]) => (typeof i == "function" ? (C[A] = {
type: H.FN,
type: V.FN,
name: i.name
}, o({
jsFunctions: P(g, i.name, i)
jsFunctions: D(g, i.name, i)
})) : C[A] = i, C), {});

@@ -316,4 +316,4 @@ }

m as ActionType,
X as ChannelSetupStatus,
H as PayloadType,
H as ChannelSetupStatus,
V as PayloadType,
CI as complete,

@@ -320,0 +320,0 @@ gI as exec,

@@ -1,7 +0,7 @@

(function(b,u){typeof exports=="object"&&typeof module<"u"?u(exports):typeof define=="function"&&define.amd?define(["exports"],u):(b=typeof globalThis<"u"?globalThis:b||self,u(b.xPython={}))})(this,function(b){"use strict";function u(I,g,C){return g in I?Object.defineProperty(I,g,{value:C,enumerable:!0,configurable:!0,writable:!0}):I[g]=C,I}function X(I,g){var C=Object.keys(I);if(Object.getOwnPropertySymbols){var A=Object.getOwnPropertySymbols(I);g&&(A=A.filter(function(i){return Object.getOwnPropertyDescriptor(I,i).enumerable})),C.push.apply(C,A)}return C}function H(I){for(var g=1;g<arguments.length;g++){var C=arguments[g]!=null?arguments[g]:{};g%2?X(Object(C),!0).forEach(function(A){u(I,A,C[A])}):Object.getOwnPropertyDescriptors?Object.defineProperties(I,Object.getOwnPropertyDescriptors(C)):X(Object(C)).forEach(function(A){Object.defineProperty(I,A,Object.getOwnPropertyDescriptor(C,A))})}return I}function k(){for(var I=arguments.length,g=new Array(I),C=0;C<I;C++)g[C]=arguments[C];return function(A){return g.reduceRight(function(i,l){return l(i)},A)}}function s(I){return function g(){for(var C=this,A=arguments.length,i=new Array(A),l=0;l<A;l++)i[l]=arguments[l];return i.length>=I.length?I.apply(this,i):function(){for(var Z=arguments.length,d=new Array(Z),G=0;G<Z;G++)d[G]=arguments[G];return g.apply(C,[].concat(i,d))}}}function p(I){return{}.toString.call(I).includes("Object")}function R(I){return!Object.keys(I).length}function S(I){return typeof I=="function"}function J(I,g){return Object.prototype.hasOwnProperty.call(I,g)}function F(I,g){return p(g)||o("changeType"),Object.keys(g).some(function(C){return!J(I,C)})&&o("changeField"),g}function L(I){S(I)||o("selectorType")}function v(I){S(I)||p(I)||o("handlerType"),p(I)&&Object.values(I).some(function(g){return!S(g)})&&o("handlersType")}function r(I){I||o("initialIsRequired"),p(I)||o("initialType"),R(I)&&o("initialContent")}function N(I,g){throw new Error(I[g]||I.default)}var U={initialIsRequired:"initial state is required",initialType:"initial state should be an object",initialContent:"initial state shouldn't be an empty object",handlerType:"handler should be an object or a function",handlersType:"all handlers should be a functions",selectorType:"selector should be a function",changeType:"provided value of changes should be an object",changeField:'it seams you want to change a field in the state which is not specified in the "initial" state',default:"an unknown error accured in `state-local` package"},o=s(N)(U),W={changes:F,selector:L,handler:v,initial:r};function Q(I){var g=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};W.initial(I),W.handler(g);var C={current:I},A=s(T)(C,g),i=s(f)(C),l=s(W.changes)(I),Z=s(z)(C);function d(){var c=arguments.length>0&&arguments[0]!==void 0?arguments[0]:function(a){return a};return W.selector(c),c(C.current)}function G(c){k(A,i,l,Z)(c)}return[d,G]}function z(I,g){return S(g)?g(I.current):g}function f(I,g){return I.current=H(H({},I.current),g),g}function T(I,g,C){return S(g)?g(I.current):Object.keys(C).forEach(function(A){var i;return(i=g[A])===null||i===void 0?void 0:i.call(g,I.current[A])}),C}var j={create:Q};const O={loadPyodideOptions:{indexURL:"https://cdn.jsdelivr.net/pyodide/v0.23.0/full/"}};var V=(I=>(I[I.READY=0]="READY",I))(V||{}),m=(I=>(I[I.EXEC=0]="EXEC",I[I.COMPLETE=1]="COMPLETE",I[I.INSTALL=2]="INSTALL",I[I.FORMAT=3]="FORMAT",I[I.JS_FN_CALL=4]="JS_FN_CALL",I))(m||{}),Y=(I=>(I.FN="__function__",I))(Y||{});function M(I){let g;return()=>(g||(g=I()),g)}function P(I,g){if(!g)throw new Error(`a wrong id is provided from worker - callback with ${I} id doesn't exist`)}function x(I,g){const{[g]:C,...A}=I;return A}function y(I,g,C){return{...I,[g]:C}}function D(I,g,C){return{...I,[g]:C}}const h="dmFyIGIsIE0sIGssICQsIEIgPSB7IGV4cG9ydHM6IHt9IH07CkIuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgewogIGZ1bmN0aW9uIGUoZCkgewogICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KGQpKSAmJiBpc0Zpbml0ZShkKTsKICB9CiAgZnVuY3Rpb24gdChkKSB7CiAgICByZXR1cm4gZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGQuc3Vic3RyaW5nKDEpOwogIH0KICBmdW5jdGlvbiBpKGQpIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXNbZF07CiAgICB9OwogIH0KICB2YXIgciA9IFsiaXNDb25zdHJ1Y3RvciIsICJpc0V2YWwiLCAiaXNOYXRpdmUiLCAiaXNUb3BsZXZlbCJdLCBuID0gWyJjb2x1bW5OdW1iZXIiLCAibGluZU51bWJlciJdLCBhID0gWyJmaWxlTmFtZSIsICJmdW5jdGlvbk5hbWUiLCAic291cmNlIl0sIGwgPSBbImFyZ3MiXSwgdSA9IFsiZXZhbE9yaWdpbiJdLCBzID0gci5jb25jYXQobiwgYSwgbCwgdSk7CiAgZnVuY3Rpb24gbyhkKSB7CiAgICBpZiAoZCkKICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBzLmxlbmd0aDsgbSsrKQogICAgICAgIGRbc1ttXV0gIT09IHZvaWQgMCAmJiB0aGlzWyJzZXQiICsgdChzW21dKV0oZFtzW21dXSk7CiAgfQogIG8ucHJvdG90eXBlID0geyBnZXRBcmdzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmFyZ3M7CiAgfSwgc2V0QXJnczogZnVuY3Rpb24oZCkgewogICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkKSAhPT0gIltvYmplY3QgQXJyYXldIikKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJncyBtdXN0IGJlIGFuIEFycmF5Iik7CiAgICB0aGlzLmFyZ3MgPSBkOwogIH0sIGdldEV2YWxPcmlnaW46IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZXZhbE9yaWdpbjsKICB9LCBzZXRFdmFsT3JpZ2luOiBmdW5jdGlvbihkKSB7CiAgICBpZiAoZCBpbnN0YW5jZW9mIG8pCiAgICAgIHRoaXMuZXZhbE9yaWdpbiA9IGQ7CiAgICBlbHNlIHsKICAgICAgaWYgKCEoZCBpbnN0YW5jZW9mIE9iamVjdCkpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXZhbCBPcmlnaW4gbXVzdCBiZSBhbiBPYmplY3Qgb3IgU3RhY2tGcmFtZSIpOwogICAgICB0aGlzLmV2YWxPcmlnaW4gPSBuZXcgbyhkKTsKICAgIH0KICB9LCB0b1N0cmluZzogZnVuY3Rpb24oKSB7CiAgICB2YXIgZCA9IHRoaXMuZ2V0RmlsZU5hbWUoKSB8fCAiIiwgbSA9IHRoaXMuZ2V0TGluZU51bWJlcigpIHx8ICIiLCB5ID0gdGhpcy5nZXRDb2x1bW5OdW1iZXIoKSB8fCAiIiwgZyA9IHRoaXMuZ2V0RnVuY3Rpb25OYW1lKCkgfHwgIiI7CiAgICByZXR1cm4gdGhpcy5nZXRJc0V2YWwoKSA/IGQgPyAiW2V2YWxdICgiICsgZCArICI6IiArIG0gKyAiOiIgKyB5ICsgIikiIDogIltldmFsXToiICsgbSArICI6IiArIHkgOiBnID8gZyArICIgKCIgKyBkICsgIjoiICsgbSArICI6IiArIHkgKyAiKSIgOiBkICsgIjoiICsgbSArICI6IiArIHk7CiAgfSB9LCBvLmZyb21TdHJpbmcgPSBmdW5jdGlvbihkKSB7CiAgICB2YXIgbSA9IGQuaW5kZXhPZigiKCIpLCB5ID0gZC5sYXN0SW5kZXhPZigiKSIpLCBnID0gZC5zdWJzdHJpbmcoMCwgbSksIHcgPSBkLnN1YnN0cmluZyhtICsgMSwgeSkuc3BsaXQoIiwiKSwgRiA9IGQuc3Vic3RyaW5nKHkgKyAxKTsKICAgIGlmIChGLmluZGV4T2YoIkAiKSA9PT0gMCkKICAgICAgdmFyIFIgPSAvQCguKz8pKD86OihcZCspKT8oPzo6KFxkKykpPyQvLmV4ZWMoRiwgIiIpLCBLID0gUlsxXSwgUSA9IFJbMl0sIFogPSBSWzNdOwogICAgcmV0dXJuIG5ldyBvKHsgZnVuY3Rpb25OYW1lOiBnLCBhcmdzOiB3IHx8IHZvaWQgMCwgZmlsZU5hbWU6IEssIGxpbmVOdW1iZXI6IFEgfHwgdm9pZCAwLCBjb2x1bW5OdW1iZXI6IFogfHwgdm9pZCAwIH0pOwogIH07CiAgZm9yICh2YXIgYyA9IDA7IGMgPCByLmxlbmd0aDsgYysrKQogICAgby5wcm90b3R5cGVbImdldCIgKyB0KHJbY10pXSA9IGkocltjXSksIG8ucHJvdG90eXBlWyJzZXQiICsgdChyW2NdKV0gPSBmdW5jdGlvbihkKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihtKSB7CiAgICAgICAgdGhpc1tkXSA9IEJvb2xlYW4obSk7CiAgICAgIH07CiAgICB9KHJbY10pOwogIGZvciAodmFyIHAgPSAwOyBwIDwgbi5sZW5ndGg7IHArKykKICAgIG8ucHJvdG90eXBlWyJnZXQiICsgdChuW3BdKV0gPSBpKG5bcF0pLCBvLnByb3RvdHlwZVsic2V0IiArIHQobltwXSldID0gZnVuY3Rpb24oZCkgewogICAgICByZXR1cm4gZnVuY3Rpb24obSkgewogICAgICAgIGlmICghZShtKSkKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZCArICIgbXVzdCBiZSBhIE51bWJlciIpOwogICAgICAgIHRoaXNbZF0gPSBOdW1iZXIobSk7CiAgICAgIH07CiAgICB9KG5bcF0pOwogIGZvciAodmFyIGYgPSAwOyBmIDwgYS5sZW5ndGg7IGYrKykKICAgIG8ucHJvdG90eXBlWyJnZXQiICsgdChhW2ZdKV0gPSBpKGFbZl0pLCBvLnByb3RvdHlwZVsic2V0IiArIHQoYVtmXSldID0gZnVuY3Rpb24oZCkgewogICAgICByZXR1cm4gZnVuY3Rpb24obSkgewogICAgICAgIHRoaXNbZF0gPSBTdHJpbmcobSk7CiAgICAgIH07CiAgICB9KGFbZl0pOwogIHJldHVybiBvOwp9KCk7CnZhciBlZSA9IChiID0gQi5leHBvcnRzLCBNID0gLyhefEApXFMrOlxkKy8sIGsgPSAvXlxzKmF0IC4qKFxTKzpcZCt8XChuYXRpdmVcKSkvbSwgJCA9IC9eKGV2YWxAKT8oXFtuYXRpdmUgY29kZV0pPyQvLCB7IHBhcnNlOiBmdW5jdGlvbihlKSB7CiAgaWYgKGUuc3RhY2t0cmFjZSAhPT0gdm9pZCAwIHx8IGVbIm9wZXJhI3NvdXJjZWxvYyJdICE9PSB2b2lkIDApCiAgICByZXR1cm4gdGhpcy5wYXJzZU9wZXJhKGUpOwogIGlmIChlLnN0YWNrICYmIGUuc3RhY2subWF0Y2goaykpCiAgICByZXR1cm4gdGhpcy5wYXJzZVY4T3JJRShlKTsKICBpZiAoZS5zdGFjaykKICAgIHJldHVybiB0aGlzLnBhcnNlRkZPclNhZmFyaShlKTsKICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwYXJzZSBnaXZlbiBFcnJvciBvYmplY3QiKTsKfSwgZXh0cmFjdExvY2F0aW9uOiBmdW5jdGlvbihlKSB7CiAgaWYgKGUuaW5kZXhPZigiOiIpID09PSAtMSkKICAgIHJldHVybiBbZV07CiAgdmFyIHQgPSAvKC4rPykoPzo6KFxkKykpPyg/OjooXGQrKSk/JC8uZXhlYyhlLnJlcGxhY2UoL1soKV0vZywgIiIpKTsKICByZXR1cm4gW3RbMV0sIHRbMl0gfHwgdm9pZCAwLCB0WzNdIHx8IHZvaWQgMF07Cn0sIHBhcnNlVjhPcklFOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuIGUuc3RhY2suc3BsaXQoYApgKS5maWx0ZXIoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICEhdC5tYXRjaChrKTsKICB9LCB0aGlzKS5tYXAoZnVuY3Rpb24odCkgewogICAgdC5pbmRleE9mKCIoZXZhbCAiKSA+IC0xICYmICh0ID0gdC5yZXBsYWNlKC9ldmFsIGNvZGUvZywgImV2YWwiKS5yZXBsYWNlKC8oXChldmFsIGF0IFteKCldKil8KCwuKiQpL2csICIiKSk7CiAgICB2YXIgaSA9IHQucmVwbGFjZSgvXlxzKy8sICIiKS5yZXBsYWNlKC9cKGV2YWwgY29kZS9nLCAiKCIpLnJlcGxhY2UoL14uKj9ccysvLCAiIiksIHIgPSBpLm1hdGNoKC8gKFwoLitcKSQpLyk7CiAgICBpID0gciA/IGkucmVwbGFjZShyWzBdLCAiIikgOiBpOwogICAgdmFyIG4gPSB0aGlzLmV4dHJhY3RMb2NhdGlvbihyID8gclsxXSA6IGkpLCBhID0gciAmJiBpIHx8IHZvaWQgMCwgbCA9IFsiZXZhbCIsICI8YW5vbnltb3VzPiJdLmluZGV4T2YoblswXSkgPiAtMSA/IHZvaWQgMCA6IG5bMF07CiAgICByZXR1cm4gbmV3IGIoeyBmdW5jdGlvbk5hbWU6IGEsIGZpbGVOYW1lOiBsLCBsaW5lTnVtYmVyOiBuWzFdLCBjb2x1bW5OdW1iZXI6IG5bMl0sIHNvdXJjZTogdCB9KTsKICB9LCB0aGlzKTsKfSwgcGFyc2VGRk9yU2FmYXJpOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuIGUuc3RhY2suc3BsaXQoYApgKS5maWx0ZXIoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICF0Lm1hdGNoKCQpOwogIH0sIHRoaXMpLm1hcChmdW5jdGlvbih0KSB7CiAgICBpZiAodC5pbmRleE9mKCIgPiBldmFsIikgPiAtMSAmJiAodCA9IHQucmVwbGFjZSgvIGxpbmUgKFxkKykoPzogPiBldmFsIGxpbmUgXGQrKSogPiBldmFsOlxkKzpcZCsvZywgIjokMSIpKSwgdC5pbmRleE9mKCJAIikgPT09IC0xICYmIHQuaW5kZXhPZigiOiIpID09PSAtMSkKICAgICAgcmV0dXJuIG5ldyBiKHsgZnVuY3Rpb25OYW1lOiB0IH0pOwogICAgdmFyIGkgPSAvKCguKiIuKyJbXkBdKik/W15AXSopKD86QCkvLCByID0gdC5tYXRjaChpKSwgbiA9IHIgJiYgclsxXSA/IHJbMV0gOiB2b2lkIDAsIGEgPSB0aGlzLmV4dHJhY3RMb2NhdGlvbih0LnJlcGxhY2UoaSwgIiIpKTsKICAgIHJldHVybiBuZXcgYih7IGZ1bmN0aW9uTmFtZTogbiwgZmlsZU5hbWU6IGFbMF0sIGxpbmVOdW1iZXI6IGFbMV0sIGNvbHVtbk51bWJlcjogYVsyXSwgc291cmNlOiB0IH0pOwogIH0sIHRoaXMpOwp9LCBwYXJzZU9wZXJhOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuICFlLnN0YWNrdHJhY2UgfHwgZS5tZXNzYWdlLmluZGV4T2YoYApgKSA+IC0xICYmIGUubWVzc2FnZS5zcGxpdChgCmApLmxlbmd0aCA+IGUuc3RhY2t0cmFjZS5zcGxpdChgCmApLmxlbmd0aCA/IHRoaXMucGFyc2VPcGVyYTkoZSkgOiBlLnN0YWNrID8gdGhpcy5wYXJzZU9wZXJhMTEoZSkgOiB0aGlzLnBhcnNlT3BlcmExMChlKTsKfSwgcGFyc2VPcGVyYTk6IGZ1bmN0aW9uKGUpIHsKICBmb3IgKHZhciB0ID0gL0xpbmUgKFxkKykuKnNjcmlwdCAoPzppbiApPyhcUyspL2ksIGkgPSBlLm1lc3NhZ2Uuc3BsaXQoYApgKSwgciA9IFtdLCBuID0gMiwgYSA9IGkubGVuZ3RoOyBuIDwgYTsgbiArPSAyKSB7CiAgICB2YXIgbCA9IHQuZXhlYyhpW25dKTsKICAgIGwgJiYgci5wdXNoKG5ldyBiKHsgZmlsZU5hbWU6IGxbMl0sIGxpbmVOdW1iZXI6IGxbMV0sIHNvdXJjZTogaVtuXSB9KSk7CiAgfQogIHJldHVybiByOwp9LCBwYXJzZU9wZXJhMTA6IGZ1bmN0aW9uKGUpIHsKICBmb3IgKHZhciB0ID0gL0xpbmUgKFxkKykuKnNjcmlwdCAoPzppbiApPyhcUyspKD86OiBJbiBmdW5jdGlvbiAoXFMrKSk/JC9pLCBpID0gZS5zdGFja3RyYWNlLnNwbGl0KGAKYCksIHIgPSBbXSwgbiA9IDAsIGEgPSBpLmxlbmd0aDsgbiA8IGE7IG4gKz0gMikgewogICAgdmFyIGwgPSB0LmV4ZWMoaVtuXSk7CiAgICBsICYmIHIucHVzaChuZXcgYih7IGZ1bmN0aW9uTmFtZTogbFszXSB8fCB2b2lkIDAsIGZpbGVOYW1lOiBsWzJdLCBsaW5lTnVtYmVyOiBsWzFdLCBzb3VyY2U6IGlbbl0gfSkpOwogIH0KICByZXR1cm4gcjsKfSwgcGFyc2VPcGVyYTExOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuIGUuc3RhY2suc3BsaXQoYApgKS5maWx0ZXIoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICEhdC5tYXRjaChNKSAmJiAhdC5tYXRjaCgvXkVycm9yIGNyZWF0ZWQgYXQvKTsKICB9LCB0aGlzKS5tYXAoZnVuY3Rpb24odCkgewogICAgdmFyIGksIHIgPSB0LnNwbGl0KCJAIiksIG4gPSB0aGlzLmV4dHJhY3RMb2NhdGlvbihyLnBvcCgpKSwgYSA9IHIuc2hpZnQoKSB8fCAiIiwgbCA9IGEucmVwbGFjZSgvPGFub255bW91cyBmdW5jdGlvbig6IChcdyspKT8+LywgIiQyIikucmVwbGFjZSgvXChbXildKlwpL2csICIiKSB8fCB2b2lkIDA7CiAgICBhLm1hdGNoKC9cKChbXildKilcKS8pICYmIChpID0gYS5yZXBsYWNlKC9eW14oXStcKChbXildKilcKSQvLCAiJDEiKSk7CiAgICB2YXIgdSA9IGkgPT09IHZvaWQgMCB8fCBpID09PSAiW2FyZ3VtZW50cyBub3QgYXZhaWxhYmxlXSIgPyB2b2lkIDAgOiBpLnNwbGl0KCIsIik7CiAgICByZXR1cm4gbmV3IGIoeyBmdW5jdGlvbk5hbWU6IGwsIGFyZ3M6IHUsIGZpbGVOYW1lOiBuWzBdLCBsaW5lTnVtYmVyOiBuWzFdLCBjb2x1bW5OdW1iZXI6IG5bMl0sIHNvdXJjZTogdCB9KTsKICB9LCB0aGlzKTsKfSB9KTsKY29uc3QgRSA9IHR5cGVvZiBwcm9jZXNzIDwgInUiICYmIHByb2Nlc3MucmVsZWFzZSAmJiBwcm9jZXNzLnJlbGVhc2UubmFtZSA9PT0gIm5vZGUiICYmIHByb2Nlc3MuYnJvd3NlciA9PT0gdm9pZCAwOwpsZXQgcSwgQywgSSwgWCwgeiwgSiwgVSwgViwgTjsKaWYgKEogPSBFID8gZnVuY3Rpb24oZSwgdCkgewogIHJldHVybiBJLnJlc29sdmUodCB8fCAiLiIsIGUpOwp9IDogZnVuY3Rpb24oZSwgdCkgewogIHJldHVybiB0ID09PSB2b2lkIDAgJiYgKHQgPSBsb2NhdGlvbiksIG5ldyBVUkwoZSwgdCkudG9TdHJpbmcoKTsKfSwgRSB8fCAoVSA9ICIvIiksIFYgPSBFID8gYXN5bmMgZnVuY3Rpb24oZSwgdCkgewogIGlmIChlLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSAmJiAoZSA9IGUuc2xpY2UoNykpLCBlLmluY2x1ZGVzKCI6Ly8iKSkgewogICAgbGV0IGkgPSBhd2FpdCBDKGUpOwogICAgaWYgKCFpLm9rKQogICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkICcke2V9JzogcmVxdWVzdCBmYWlsZWQuYCk7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgaS5hcnJheUJ1ZmZlcigpKTsKICB9CiAgewogICAgY29uc3QgaSA9IGF3YWl0IHoucmVhZEZpbGUoZSk7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaS5idWZmZXIsIGkuYnl0ZU9mZnNldCwgaS5ieXRlTGVuZ3RoKTsKICB9Cn0gOiBhc3luYyBmdW5jdGlvbihlLCB0KSB7CiAgY29uc3QgaSA9IG5ldyBVUkwoZSwgbG9jYXRpb24pOwogIGxldCByID0gdCA/IHsgaW50ZWdyaXR5OiB0IH0gOiB7fSwgbiA9IGF3YWl0IGZldGNoKGksIHIpOwogIGlmICghbi5vaykKICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgJyR7aX0nOiByZXF1ZXN0IGZhaWxlZC5gKTsKICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgbi5hcnJheUJ1ZmZlcigpKTsKfSwgZ2xvYmFsVGhpcy5kb2N1bWVudCkKICBOID0gYXN5bmMgKGUpID0+IGF3YWl0IGltcG9ydCgKICAgIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8KICAgIGUKICApOwplbHNlIGlmIChnbG9iYWxUaGlzLmltcG9ydFNjcmlwdHMpCiAgTiA9IGFzeW5jIChlKSA9PiB7CiAgICB0cnkgewogICAgICBnbG9iYWxUaGlzLmltcG9ydFNjcmlwdHMoZSk7CiAgICB9IGNhdGNoICh0KSB7CiAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBUeXBlRXJyb3IpKQogICAgICAgIHRocm93IHQ7CiAgICAgIGF3YWl0IGltcG9ydCgKICAgICAgICAvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovCiAgICAgICAgZQogICAgICApOwogICAgfQogIH07CmVsc2UgewogIGlmICghRSkKICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGRldGVybWluZSBydW50aW1lIGVudmlyb25tZW50Iik7CiAgTiA9IGFzeW5jIGZ1bmN0aW9uKGUpIHsKICAgIGUuc3RhcnRzV2l0aCgiZmlsZTovLyIpICYmIChlID0gZS5zbGljZSg3KSksIGUuaW5jbHVkZXMoIjovLyIpID8gWC5ydW5JblRoaXNDb250ZXh0KGF3YWl0IChhd2FpdCBDKGUpKS50ZXh0KCkpIDogYXdhaXQgaW1wb3J0KAogICAgICAvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovCiAgICAgIHEucGF0aFRvRmlsZVVSTChlKS5ocmVmCiAgICApOwogIH07Cn0KZnVuY3Rpb24gdGUoZSkgewogIHZhciB0ID0gdHlwZW9mIFN5bWJvbCA9PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5pdGVyYXRvciwgaSA9IHQgJiYgZVt0XSwgciA9IDA7CiAgaWYgKGkpCiAgICByZXR1cm4gaS5jYWxsKGUpOwogIGlmIChlICYmIHR5cGVvZiBlLmxlbmd0aCA9PSAibnVtYmVyIikKICAgIHJldHVybiB7IG5leHQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZSAmJiByID49IGUubGVuZ3RoICYmIChlID0gdm9pZCAwKSwgeyB2YWx1ZTogZSAmJiBlW3IrK10sIGRvbmU6ICFlIH07CiAgICB9IH07CiAgdGhyb3cgbmV3IFR5cGVFcnJvcih0ID8gIk9iamVjdCBpcyBub3QgaXRlcmFibGUuIiA6ICJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIik7Cn0KZnVuY3Rpb24gcmUoZSkgewogIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpCiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKICB2YXIgdCwgaSA9IGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOwogIHJldHVybiBpID8gaS5jYWxsKGUpIDogKGUgPSB0ZShlKSwgdCA9IHt9LCByKCJuZXh0IiksIHIoInRocm93IiksIHIoInJldHVybiIpLCB0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSwgdCk7CiAgZnVuY3Rpb24gcihuKSB7CiAgICB0W25dID0gZVtuXSAmJiBmdW5jdGlvbihhKSB7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihsLCB1KSB7CiAgICAgICAgKGZ1bmN0aW9uKHMsIG8sIGMsIHApIHsKICAgICAgICAgIFByb21pc2UucmVzb2x2ZShwKS50aGVuKGZ1bmN0aW9uKGYpIHsKICAgICAgICAgICAgcyh7IHZhbHVlOiBmLCBkb25lOiBjIH0pOwogICAgICAgICAgfSwgbyk7CiAgICAgICAgfSkobCwgdSwgKGEgPSBlW25dKGEpKS5kb25lLCBhLnZhbHVlKTsKICAgICAgfSk7CiAgICB9OwogIH0KfQpjb25zdCBuZSA9IGFzeW5jIChlKSA9PiB7CiAgY29uc3QgdCA9IFtdOwogIGF3YWl0IGFzeW5jIGZ1bmN0aW9uIHIobikgewogICAgdmFyIGEsIGw7CiAgICB0cnkgewogICAgICBmb3IgKHZhciB1LCBzID0gcmUobi52YWx1ZXMoKSk7ICEodSA9IGF3YWl0IHMubmV4dCgpKS5kb25lOyApIHsKICAgICAgICBjb25zdCBvID0gdS52YWx1ZTsKICAgICAgICB0LnB1c2gobyksIG8ua2luZCA9PT0gImRpcmVjdG9yeSIgJiYgYXdhaXQgcihvKTsKICAgICAgfQogICAgfSBjYXRjaCAobykgewogICAgICBhID0geyBlcnJvcjogbyB9OwogICAgfSBmaW5hbGx5IHsKICAgICAgdHJ5IHsKICAgICAgICB1ICYmICF1LmRvbmUgJiYgKGwgPSBzLnJldHVybikgJiYgYXdhaXQgbC5jYWxsKHMpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGlmIChhKQogICAgICAgICAgdGhyb3cgYS5lcnJvcjsKICAgICAgfQogICAgfQogIH0oZSk7CiAgY29uc3QgaSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgaS5zZXQoIi4iLCBlKTsKICBmb3IgKGNvbnN0IHIgb2YgdCkgewogICAgY29uc3QgbiA9IChhd2FpdCBlLnJlc29sdmUocikpLmpvaW4oIi8iKTsKICAgIGkuc2V0KG4sIHIpOwogIH0KICByZXR1cm4gaTsKfTsKZnVuY3Rpb24gaWUoZSwgdCkgewogIGxldCBpOwogIGkgPSB0LnN0ZExpYlVSTCAhPSBudWxsID8gdC5zdGRMaWJVUkwgOiB0LmluZGV4VVJMICsgInB5dGhvbl9zdGRsaWIuemlwIiwgZnVuY3Rpb24ociwgbikgewogICAgY29uc3QgYSA9IFYobik7CiAgICByLnByZVJ1bi5wdXNoKCgpID0+IHsKICAgICAgY29uc3QgbCA9IHIuX3B5X3ZlcnNpb25fbWFqb3IoKSwgdSA9IHIuX3B5X3ZlcnNpb25fbWlub3IoKTsKICAgICAgci5GUy5ta2RpclRyZWUoIi9saWIiKSwgci5GUy5ta2RpclRyZWUoYC9saWIvcHl0aG9uJHtsfS4ke3V9L3NpdGUtcGFja2FnZXNgKSwgci5hZGRSdW5EZXBlbmRlbmN5KCJpbnN0YWxsLXN0ZGxpYiIpLCBhLnRoZW4oKHMpID0+IHsKICAgICAgICByLkZTLndyaXRlRmlsZShgL2xpYi9weXRob24ke2x9JHt1fS56aXBgLCBzKTsKICAgICAgfSkuY2F0Y2goKHMpID0+IHsKICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBvY2N1cnJlZCB3aGlsZSBpbnN0YWxsaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5OiIpLCBjb25zb2xlLmVycm9yKHMpOwogICAgICB9KS5maW5hbGx5KCgpID0+IHsKICAgICAgICByLnJlbW92ZVJ1bkRlcGVuZGVuY3koImluc3RhbGwtc3RkbGliIik7CiAgICAgIH0pOwogICAgfSk7CiAgfShlLCBpKSwgZnVuY3Rpb24ociwgbikgewogICAgci5wcmVSdW4ucHVzaChmdW5jdGlvbigpIHsKICAgICAgdHJ5IHsKICAgICAgICByLkZTLm1rZGlyVHJlZShuKTsKICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIG9jY3VycmVkIHdoaWxlIG1ha2luZyBhIGhvbWUgZGlyZWN0b3J5ICcke259JzpgKSwgY29uc29sZS5lcnJvcihhKSwgY29uc29sZS5lcnJvcigiVXNpbmcgJy8nIGZvciBhIGhvbWUgZGlyZWN0b3J5IGluc3RlYWQiKSwgbiA9ICIvIjsKICAgICAgfQogICAgICByLkVOVi5IT01FID0gbiwgci5GUy5jaGRpcihuKTsKICAgIH0pOwogIH0oZSwgdC5ob21lZGlyKSwgZnVuY3Rpb24ociwgbikgewogICAgci5wcmVSdW4ucHVzaCgoKSA9PiB7CiAgICAgIGZvciAoY29uc3QgYSBvZiBuKQogICAgICAgIHIuRlMubWtkaXJUcmVlKGEpLCByLkZTLm1vdW50KHIuRlMuZmlsZXN5c3RlbXMuTk9ERUZTLCB7IHJvb3Q6IGEgfSwgYSk7CiAgICB9KTsKICB9KGUsIHQuX25vZGVfbW91bnRzKSwgZS5wcmVSdW4ucHVzaCgoKSA9PiBmdW5jdGlvbihyKSB7CiAgICBjb25zdCBuID0gci5GUywgYSA9IHIuRlMuZmlsZXN5c3RlbXMuTUVNRlMsIGwgPSByLlBBVEgsIHUgPSB7IERJUl9NT0RFOiAxNjg5NSwgRklMRV9NT0RFOiAzMzI3OSwgbW91bnQ6IGZ1bmN0aW9uKHMpIHsKICAgICAgaWYgKCFzLm9wdHMuZmlsZVN5c3RlbUhhbmRsZSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIm9wdHMuZmlsZVN5c3RlbUhhbmRsZSBpcyByZXF1aXJlZCIpOwogICAgICByZXR1cm4gYS5tb3VudC5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgfSwgc3luY2ZzOiBhc3luYyAocywgbywgYykgPT4gewogICAgICB0cnkgewogICAgICAgIGNvbnN0IHAgPSB1LmdldExvY2FsU2V0KHMpLCBmID0gYXdhaXQgdS5nZXRSZW1vdGVTZXQocyksIGQgPSBvID8gZiA6IHAsIG0gPSBvID8gcCA6IGY7CiAgICAgICAgYXdhaXQgdS5yZWNvbmNpbGUocywgZCwgbSksIGMobnVsbCk7CiAgICAgIH0gY2F0Y2ggKHApIHsKICAgICAgICBjKHApOwogICAgICB9CiAgICB9LCBnZXRMb2NhbFNldDogKHMpID0+IHsKICAgICAgbGV0IG8gPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgZnVuY3Rpb24gYyhkKSB7CiAgICAgICAgcmV0dXJuIGQgIT09ICIuIiAmJiBkICE9PSAiLi4iOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHAoZCkgewogICAgICAgIHJldHVybiAobSkgPT4gbC5qb2luMihkLCBtKTsKICAgICAgfQogICAgICBsZXQgZiA9IG4ucmVhZGRpcihzLm1vdW50cG9pbnQpLmZpbHRlcihjKS5tYXAocChzLm1vdW50cG9pbnQpKTsKICAgICAgZm9yICg7IGYubGVuZ3RoOyApIHsKICAgICAgICBsZXQgZCA9IGYucG9wKCksIG0gPSBuLnN0YXQoZCk7CiAgICAgICAgbi5pc0RpcihtLm1vZGUpICYmIGYucHVzaC5hcHBseShmLCBuLnJlYWRkaXIoZCkuZmlsdGVyKGMpLm1hcChwKGQpKSksIG9bZF0gPSB7IHRpbWVzdGFtcDogbS5tdGltZSwgbW9kZTogbS5tb2RlIH07CiAgICAgIH0KICAgICAgcmV0dXJuIHsgdHlwZTogImxvY2FsIiwgZW50cmllczogbyB9OwogICAgfSwgZ2V0UmVtb3RlU2V0OiBhc3luYyAocykgPT4gewogICAgICBjb25zdCBvID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIGMgPSBhd2FpdCBuZShzLm9wdHMuZmlsZVN5c3RlbUhhbmRsZSk7CiAgICAgIGZvciAoY29uc3QgW3AsIGZdIG9mIGMpCiAgICAgICAgcCAhPT0gIi4iICYmIChvW2wuam9pbjIocy5tb3VudHBvaW50LCBwKV0gPSB7IHRpbWVzdGFtcDogZi5raW5kID09PSAiZmlsZSIgPyAoYXdhaXQgZi5nZXRGaWxlKCkpLmxhc3RNb2RpZmllZERhdGUgOiBuZXcgRGF0ZSgpLCBtb2RlOiBmLmtpbmQgPT09ICJmaWxlIiA/IHUuRklMRV9NT0RFIDogdS5ESVJfTU9ERSB9KTsKICAgICAgcmV0dXJuIHsgdHlwZTogInJlbW90ZSIsIGVudHJpZXM6IG8sIGhhbmRsZXM6IGMgfTsKICAgIH0sIGxvYWRMb2NhbEVudHJ5OiAocykgPT4gewogICAgICBjb25zdCBvID0gbi5sb29rdXBQYXRoKHMpLm5vZGUsIGMgPSBuLnN0YXQocyk7CiAgICAgIGlmIChuLmlzRGlyKGMubW9kZSkpCiAgICAgICAgcmV0dXJuIHsgdGltZXN0YW1wOiBjLm10aW1lLCBtb2RlOiBjLm1vZGUgfTsKICAgICAgaWYgKG4uaXNGaWxlKGMubW9kZSkpCiAgICAgICAgcmV0dXJuIG8uY29udGVudHMgPSBhLmdldEZpbGVEYXRhQXNUeXBlZEFycmF5KG8pLCB7IHRpbWVzdGFtcDogYy5tdGltZSwgbW9kZTogYy5tb2RlLCBjb250ZW50czogby5jb250ZW50cyB9OwogICAgICB0aHJvdyBuZXcgRXJyb3IoIm5vZGUgdHlwZSBub3Qgc3VwcG9ydGVkIik7CiAgICB9LCBzdG9yZUxvY2FsRW50cnk6IChzLCBvKSA9PiB7CiAgICAgIGlmIChuLmlzRGlyKG8ubW9kZSkpCiAgICAgICAgbi5ta2RpclRyZWUocywgby5tb2RlKTsKICAgICAgZWxzZSB7CiAgICAgICAgaWYgKCFuLmlzRmlsZShvLm1vZGUpKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJub2RlIHR5cGUgbm90IHN1cHBvcnRlZCIpOwogICAgICAgIG4ud3JpdGVGaWxlKHMsIG8uY29udGVudHMsIHsgY2FuT3duOiAhMCB9KTsKICAgICAgfQogICAgICBuLmNobW9kKHMsIG8ubW9kZSksIG4udXRpbWUocywgby50aW1lc3RhbXAsIG8udGltZXN0YW1wKTsKICAgIH0sIHJlbW92ZUxvY2FsRW50cnk6IChzKSA9PiB7CiAgICAgIHZhciBvID0gbi5zdGF0KHMpOwogICAgICBuLmlzRGlyKG8ubW9kZSkgPyBuLnJtZGlyKHMpIDogbi5pc0ZpbGUoby5tb2RlKSAmJiBuLnVubGluayhzKTsKICAgIH0sIGxvYWRSZW1vdGVFbnRyeTogYXN5bmMgKHMpID0+IHsKICAgICAgaWYgKHMua2luZCA9PT0gImZpbGUiKSB7CiAgICAgICAgY29uc3QgbyA9IGF3YWl0IHMuZ2V0RmlsZSgpOwogICAgICAgIHJldHVybiB7IGNvbnRlbnRzOiBuZXcgVWludDhBcnJheShhd2FpdCBvLmFycmF5QnVmZmVyKCkpLCBtb2RlOiB1LkZJTEVfTU9ERSwgdGltZXN0YW1wOiBvLmxhc3RNb2RpZmllZERhdGUgfTsKICAgICAgfQogICAgICBpZiAocy5raW5kID09PSAiZGlyZWN0b3J5IikKICAgICAgICByZXR1cm4geyBtb2RlOiB1LkRJUl9NT0RFLCB0aW1lc3RhbXA6IG5ldyBEYXRlKCkgfTsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGtpbmQ6ICIgKyBzLmtpbmQpOwogICAgfSwgc3RvcmVSZW1vdGVFbnRyeTogYXN5bmMgKHMsIG8sIGMpID0+IHsKICAgICAgY29uc3QgcCA9IHMuZ2V0KGwuZGlybmFtZShvKSksIGYgPSBuLmlzRmlsZShjLm1vZGUpID8gYXdhaXQgcC5nZXRGaWxlSGFuZGxlKGwuYmFzZW5hbWUobyksIHsgY3JlYXRlOiAhMCB9KSA6IGF3YWl0IHAuZ2V0RGlyZWN0b3J5SGFuZGxlKGwuYmFzZW5hbWUobyksIHsgY3JlYXRlOiAhMCB9KTsKICAgICAgaWYgKGYua2luZCA9PT0gImZpbGUiKSB7CiAgICAgICAgY29uc3QgZCA9IGF3YWl0IGYuY3JlYXRlV3JpdGFibGUoKTsKICAgICAgICBhd2FpdCBkLndyaXRlKGMuY29udGVudHMpLCBhd2FpdCBkLmNsb3NlKCk7CiAgICAgIH0KICAgICAgcy5zZXQobywgZik7CiAgICB9LCByZW1vdmVSZW1vdGVFbnRyeTogYXN5bmMgKHMsIG8pID0+IHsKICAgICAgYXdhaXQgcy5nZXQobC5kaXJuYW1lKG8pKS5yZW1vdmVFbnRyeShsLmJhc2VuYW1lKG8pKSwgcy5kZWxldGUobyk7CiAgICB9LCByZWNvbmNpbGU6IGFzeW5jIChzLCBvLCBjKSA9PiB7CiAgICAgIGxldCBwID0gMDsKICAgICAgY29uc3QgZiA9IFtdOwogICAgICBPYmplY3Qua2V5cyhvLmVudHJpZXMpLmZvckVhY2goZnVuY3Rpb24oeSkgewogICAgICAgIGNvbnN0IGcgPSBvLmVudHJpZXNbeV0sIHcgPSBjLmVudHJpZXNbeV07CiAgICAgICAgKCF3IHx8IG4uaXNGaWxlKGcubW9kZSkgJiYgZy50aW1lc3RhbXAuZ2V0VGltZSgpID4gdy50aW1lc3RhbXAuZ2V0VGltZSgpKSAmJiAoZi5wdXNoKHkpLCBwKyspOwogICAgICB9KSwgZi5zb3J0KCk7CiAgICAgIGNvbnN0IGQgPSBbXTsKICAgICAgaWYgKE9iamVjdC5rZXlzKGMuZW50cmllcykuZm9yRWFjaChmdW5jdGlvbih5KSB7CiAgICAgICAgby5lbnRyaWVzW3ldIHx8IChkLnB1c2goeSksIHArKyk7CiAgICAgIH0pLCBkLnNvcnQoKS5yZXZlcnNlKCksICFwKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgbSA9IG8udHlwZSA9PT0gInJlbW90ZSIgPyBvLmhhbmRsZXMgOiBjLmhhbmRsZXM7CiAgICAgIGZvciAoY29uc3QgeSBvZiBmKSB7CiAgICAgICAgY29uc3QgZyA9IGwubm9ybWFsaXplKHkucmVwbGFjZShzLm1vdW50cG9pbnQsICIvIikpLnN1YnN0cmluZygxKTsKICAgICAgICBpZiAoYy50eXBlID09PSAibG9jYWwiKSB7CiAgICAgICAgICBjb25zdCB3ID0gbS5nZXQoZyksIEYgPSBhd2FpdCB1LmxvYWRSZW1vdGVFbnRyeSh3KTsKICAgICAgICAgIHUuc3RvcmVMb2NhbEVudHJ5KHksIEYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCB3ID0gdS5sb2FkTG9jYWxFbnRyeSh5KTsKICAgICAgICAgIGF3YWl0IHUuc3RvcmVSZW1vdGVFbnRyeShtLCBnLCB3KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChjb25zdCB5IG9mIGQpCiAgICAgICAgaWYgKGMudHlwZSA9PT0gImxvY2FsIikKICAgICAgICAgIHUucmVtb3ZlTG9jYWxFbnRyeSh5KTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGNvbnN0IGcgPSBsLm5vcm1hbGl6ZSh5LnJlcGxhY2Uocy5tb3VudHBvaW50LCAiLyIpKS5zdWJzdHJpbmcoMSk7CiAgICAgICAgICBhd2FpdCB1LnJlbW92ZVJlbW90ZUVudHJ5KG0sIGcpOwogICAgICAgIH0KICAgIH0gfTsKICAgIHIuRlMuZmlsZXN5c3RlbXMuTkFUSVZFRlNfQVNZTkMgPSB1OwogIH0oZSkpOwp9CmZ1bmN0aW9uIG9lKGUsIHQpIHsKICBlLnJ1blB5dGhvbkludGVybmFsX2RpY3QgPSBlLl9weW9kaWRlLl9iYXNlLmV2YWxfY29kZSgie30iKSwgZS5pbXBvcnRsaWIgPSBlLnJ1blB5dGhvbkludGVybmFsKCJpbXBvcnQgaW1wb3J0bGliOyBpbXBvcnRsaWIiKTsKICBsZXQgaSA9IGUuaW1wb3J0bGliLmltcG9ydF9tb2R1bGU7CiAgZS5zeXMgPSBpKCJzeXMiKSwgZS5zeXMucGF0aC5pbnNlcnQoMCwgdC5ob21lZGlyKSwgZS5vcyA9IGkoIm9zIik7CiAgbGV0IHIgPSBlLnJ1blB5dGhvbkludGVybmFsKCJpbXBvcnQgX19tYWluX187IF9fbWFpbl9fLl9fZGljdF9fIiksIG4gPSBlLnJ1blB5dGhvbkludGVybmFsKCJpbXBvcnQgYnVpbHRpbnM7IGJ1aWx0aW5zLl9fZGljdF9fIik7CiAgdmFyIGE7CiAgZS5nbG9iYWxzID0gKGEgPSBuLCBuZXcgUHJveHkociwgeyBnZXQ6IChzLCBvKSA9PiBvID09PSAiZ2V0IiA/IChjKSA9PiB7CiAgICBsZXQgcCA9IHMuZ2V0KGMpOwogICAgcmV0dXJuIHAgPT09IHZvaWQgMCAmJiAocCA9IGEuZ2V0KGMpKSwgcDsKICB9IDogbyA9PT0gImhhcyIgPyAoYykgPT4gcy5oYXMoYykgfHwgYS5oYXMoYykgOiBSZWZsZWN0LmdldChzLCBvKSB9KSk7CiAgbGV0IGwgPSBlLl9weW9kaWRlLl9pbXBvcnRob29rOwogIGwucmVnaXN0ZXJfanNfZmluZGVyKCksIGwucmVnaXN0ZXJfanNfbW9kdWxlKCJqcyIsIHQuanNnbG9iYWxzKTsKICBsZXQgdSA9IGUubWFrZVB1YmxpY0FQSSgpOwogIHJldHVybiBsLnJlZ2lzdGVyX2pzX21vZHVsZSgicHlvZGlkZV9qcyIsIHUpLCBlLnB5b2RpZGVfcHkgPSBpKCJweW9kaWRlIiksIGUucHlvZGlkZV9jb2RlID0gaSgicHlvZGlkZS5jb2RlIiksIGUucHlvZGlkZV9mZmkgPSBpKCJweW9kaWRlLmZmaSIpLCBlLnBhY2thZ2VfbG9hZGVyID0gaSgicHlvZGlkZS5fcGFja2FnZV9sb2FkZXIiKSwgZS5zaXRlcGFja2FnZXMgPSBlLnBhY2thZ2VfbG9hZGVyLlNJVEVfUEFDS0FHRVMuX19zdHJfXygpLCBlLmRzb2RpciA9IGUucGFja2FnZV9sb2FkZXIuRFNPX0RJUi5fX3N0cl9fKCksIGUuZGVmYXVsdExkTGlicmFyeVBhdGggPSBbZS5kc29kaXIsIGUuc2l0ZXBhY2thZ2VzXSwgZS5vcy5lbnZpcm9uLl9fc2V0aXRlbV9fKCJMRF9MSUJSQVJZX1BBVEgiLCBlLmRlZmF1bHRMZExpYnJhcnlQYXRoLmpvaW4oIjoiKSksIHUucHlvZGlkZV9weSA9IGUucHlvZGlkZV9weSwgdS5nbG9iYWxzID0gZS5nbG9iYWxzLCB1Owp9CmFzeW5jIGZ1bmN0aW9uIGFlKGUgPSB7fSkgewogIGF3YWl0IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgaWYgKCFFIHx8IChxID0gKGF3YWl0IGltcG9ydCgiLi9fX3ZpdGUtYnJvd3Nlci1leHRlcm5hbC01MDAzZDI5Yy5qcyIpKS5kZWZhdWx0LCB6ID0gYXdhaXQgaW1wb3J0KCIuL19fdml0ZS1icm93c2VyLWV4dGVybmFsLTUwMDNkMjljLmpzIiksIEMgPSBnbG9iYWxUaGlzLmZldGNoID8gZmV0Y2ggOiAoYXdhaXQgaW1wb3J0KCIuL2luZGV4LTgzODU0MzZmLmpzIikpLmRlZmF1bHQsIFggPSAoYXdhaXQgaW1wb3J0KCIuL19fdml0ZS1icm93c2VyLWV4dGVybmFsLTUwMDNkMjljLmpzIikpLmRlZmF1bHQsIEkgPSBhd2FpdCBpbXBvcnQoIi4vX192aXRlLWJyb3dzZXItZXh0ZXJuYWwtNTAwM2QyOWMuanMiKSwgVSA9IEkuc2VwLCB0eXBlb2YgcmVxdWlyZSA8ICJ1IikpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGMgPSB7IGZzOiBhd2FpdCBpbXBvcnQoIi4vX192aXRlLWJyb3dzZXItZXh0ZXJuYWwtNTAwM2QyOWMuanMiKSwgY3J5cHRvOiBhd2FpdCBpbXBvcnQoIi4vX192aXRlLWJyb3dzZXItZXh0ZXJuYWwtNTAwM2QyOWMuanMiKSwgd3M6IGF3YWl0IGltcG9ydCgiLi9fX3ZpdGUtYnJvd3Nlci1leHRlcm5hbC01MDAzZDI5Yy5qcyIpLCBjaGlsZF9wcm9jZXNzOiBhd2FpdCBpbXBvcnQoIi4vX192aXRlLWJyb3dzZXItZXh0ZXJuYWwtNTAwM2QyOWMuanMiKSB9OwogICAgZ2xvYmFsVGhpcy5yZXF1aXJlID0gZnVuY3Rpb24ocCkgewogICAgICByZXR1cm4gY1twXTsKICAgIH07CiAgfSgpOwogIGxldCB0ID0gZS5pbmRleFVSTCB8fCBmdW5jdGlvbigpIHsKICAgIGlmICh0eXBlb2YgX19kaXJuYW1lID09ICJzdHJpbmciKQogICAgICByZXR1cm4gX19kaXJuYW1lOwogICAgbGV0IGM7CiAgICB0cnkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgIH0gY2F0Y2ggKGQpIHsKICAgICAgYyA9IGQ7CiAgICB9CiAgICBsZXQgcCA9IGVlLnBhcnNlKGMpWzBdLmZpbGVOYW1lOwogICAgY29uc3QgZiA9IHAubGFzdEluZGV4T2YoVSk7CiAgICBpZiAoZiA9PT0gLTEpCiAgICAgIHRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IGV4dHJhY3QgaW5kZXhVUkwgcGF0aCBmcm9tIHB5b2RpZGUgbW9kdWxlIGxvY2F0aW9uIik7CiAgICByZXR1cm4gcC5zbGljZSgwLCBmKTsKICB9KCk7CiAgdCA9IEoodCksIHQuZW5kc1dpdGgoIi8iKSB8fCAodCArPSAiLyIpLCBlLmluZGV4VVJMID0gdDsKICBjb25zdCBpID0geyBmdWxsU3RkTGliOiAhMSwganNnbG9iYWxzOiBnbG9iYWxUaGlzLCBzdGRpbjogZ2xvYmFsVGhpcy5wcm9tcHQgPyBnbG9iYWxUaGlzLnByb21wdCA6IHZvaWQgMCwgaG9tZWRpcjogIi9ob21lL3B5b2RpZGUiLCBsb2NrRmlsZVVSTDogdCArICJyZXBvZGF0YS5qc29uIiwgYXJnczogW10sIF9ub2RlX21vdW50czogW10gfSwgciA9IE9iamVjdC5hc3NpZ24oaSwgZSksIG4gPSBmdW5jdGlvbigpIHsKICAgIGxldCBjID0geyBub0ltYWdlRGVjb2Rpbmc6ICEwLCBub0F1ZGlvRGVjb2Rpbmc6ICEwLCBub1dhc21EZWNvZGluZzogITEsIHByZVJ1bjogW10sIHF1aXQ6IChwLCBmKSA9PiB7CiAgICAgIHRocm93IGMuZXhpdGVkID0geyBzdGF0dXM6IHAsIHRvVGhyb3c6IGYgfSwgZjsKICAgIH0gfTsKICAgIHJldHVybiBjOwogIH0oKTsKICBuLnByaW50ID0gci5zdGRvdXQsIG4ucHJpbnRFcnIgPSByLnN0ZGVyciwgbi5hcmd1bWVudHMgPSByLmFyZ3M7CiAgY29uc3QgYSA9IHsgY29uZmlnOiByIH07CiAgbi5BUEkgPSBhLCBpZShuLCByKTsKICBjb25zdCBsID0gbmV3IFByb21pc2UoKGMpID0+IG4ucG9zdFJ1biA9IGMpOwogIGlmIChuLmxvY2F0ZUZpbGUgPSAoYykgPT4gci5pbmRleFVSTCArIGMsIHR5cGVvZiBfY3JlYXRlUHlvZGlkZU1vZHVsZSAhPSAiZnVuY3Rpb24iKSB7CiAgICBjb25zdCBjID0gYCR7ci5pbmRleFVSTH1weW9kaWRlLmFzbS5qc2A7CiAgICBhd2FpdCBOKGMpOwogIH0KICBpZiAoYXdhaXQgX2NyZWF0ZVB5b2RpZGVNb2R1bGUobiksIGF3YWl0IGwsIG4uZXhpdGVkKQogICAgdGhyb3cgbi5leGl0ZWQudG9UaHJvdzsKICBpZiAoYS52ZXJzaW9uICE9PSAiMC4yMy4wIikKICAgIHRocm93IG5ldyBFcnJvcihgUHlvZGlkZSB2ZXJzaW9uIGRvZXMgbm90IG1hdGNoOiAnMC4yMy4wJyA8PT0+ICcke2EudmVyc2lvbn0nLiBJZiB5b3UgdXBkYXRlZCB0aGUgUHlvZGlkZSB2ZXJzaW9uLCBtYWtlIHN1cmUgeW91IGFsc28gdXBkYXRlZCB0aGUgJ2luZGV4VVJMJyBwYXJhbWV0ZXIgcGFzc2VkIHRvIGxvYWRQeW9kaWRlLmApOwogIG4ubG9jYXRlRmlsZSA9IChjKSA9PiB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkRpZG4ndCBleHBlY3QgdG8gbG9hZCBhbnkgbW9yZSBmaWxlX3BhY2thZ2VyIGZpbGVzISIpOwogIH07CiAgbGV0IFt1LCBzXSA9IGEucmF3UnVuKCJpbXBvcnQgX3B5b2RpZGVfY29yZSIpOwogIHUgJiYgbi5BUEkuZmF0YWxfbG9hZGluZ19lcnJvcihgRmFpbGVkIHRvIGltcG9ydCBfcHlvZGlkZV9jb3JlCmAsIHMpOwogIGNvbnN0IG8gPSBvZShhLCByKTsKICBpZiAoby52ZXJzaW9uLmluY2x1ZGVzKCJkZXYiKSB8fCBhLnNldENkblVybChgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L3B5b2RpZGUvdiR7by52ZXJzaW9ufS9mdWxsL2ApLCBhd2FpdCBhLnBhY2thZ2VJbmRleFJlYWR5LCBhLl9weW9kaWRlLl9pbXBvcnRob29rLnJlZ2lzdGVyX21vZHVsZV9ub3RfZm91bmRfaG9vayhhLl9pbXBvcnRfbmFtZV90b19wYWNrYWdlX25hbWUsIGEucmVwb2RhdGFfdW52ZW5kb3JlZF9zdGRsaWJzX2FuZF90ZXN0KSwgYS5yZXBvZGF0YV9pbmZvLnZlcnNpb24gIT09ICIwLjIzLjAiKQogICAgdGhyb3cgbmV3IEVycm9yKCJMb2NrIGZpbGUgdmVyc2lvbiBkb2Vzbid0IG1hdGNoIFB5b2RpZGUgdmVyc2lvbiIpOwogIHJldHVybiBhLnBhY2thZ2VfbG9hZGVyLmluaXRfbG9hZGVkX3BhY2thZ2VzKCksIHIuZnVsbFN0ZExpYiAmJiBhd2FpdCBvLmxvYWRQYWNrYWdlKGEucmVwb2RhdGFfdW52ZW5kb3JlZF9zdGRsaWJzKSwgYS5pbml0aWFsaXplU3RyZWFtcyhyLnN0ZGluLCByLnN0ZG91dCwgci5zdGRlcnIpLCBvOwp9CmNvbnN0IHNlID0gewogIGxvYWRQeW9kaWRlT3B0aW9uczogewogICAgaW5kZXhVUkw6ICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvcHlvZGlkZS92MC4yMy4wL2Z1bGwvIgogIH0KfTsKdmFyIGNlID0gYCMgcHlyaWdodDogcmVwb3J0TWlzc2luZ0ltcG9ydHM9ZmFsc2UKIyB0eXBlOiBpZ25vcmUKCiMgYmxhY2sKaW1wb3J0IHN5cwppbXBvcnQgbWljcm9waXAKaW1wb3J0IGFzeW5jaW8Kc3lzLm1vZHVsZXNbIl9tdWx0aXByb2Nlc3NpbmciXSA9IG9iamVjdAoKYXdhaXQgbWljcm9waXAuaW5zdGFsbCgiamVkaSIpCmF3YWl0IG1pY3JvcGlwLmluc3RhbGwoImJsYWNrIikKCmltcG9ydCBqZWRpCmZyb20gYmxhY2sgaW1wb3J0IGZvcm1hdF9zdHIsIEZpbGVNb2RlCgoKZGVmIGdldF9hdXRvY29tcGxldGlvbihjb2RlLCBsaW5lLCBjb2x1bW4pOgogICAgcmVzdWx0ID0gamVkaS5JbnRlcnByZXRlcihjb2RlLCBbZ2xvYmFscygpLCBsb2NhbHMoKV0pCgogICAgY29tcGxldGlvbnMgPSByZXN1bHQuY29tcGxldGUobGluZSwgY29sdW1uKQoKICAgIG1hdGNoZXMgPSBbXQogICAgZm9yIGNvbXAgaW4gY29tcGxldGlvbnM6CiAgICAgICAgbWF0Y2hlcy5hcHBlbmQoZGljdCgKICAgICAgICAgICAgbmFtZT1jb21wLm5hbWUsCiAgICAgICAgICAgIHR5cGU9Y29tcC50eXBlLAogICAgICAgICAgICBkZXNjcmlwdGlvbj1jb21wLmRlc2NyaXB0aW9uLAogICAgICAgICAgICBmdWxsX25hbWU9Y29tcC5mdWxsX25hbWUKICAgICAgICApKQoKICAgIHJldHVybiB7CiAgICAgICAgIm1hdGNoZXMiOiBtYXRjaGVzCiAgICB9CgoKYXN5bmMgZGVmIGluc3RhbGxfcGFjYWtnZShwYWNrYWdlKToKICAgIHRyeToKICAgICAgICBhd2FpdCBtaWNyb3BpcC5pbnN0YWxsKHBhY2thZ2UsIGtlZXBfZ29pbmc9VHJ1ZSkKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3VjY2VzcyI6IFRydWUKICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInN1Y2Nlc3MiOiBGYWxzZSwKICAgICAgICAgICAgImVycm9yIjogc3RyKGUpCiAgICAgICAgfQoKCmRlZiBmb3JtYXRfY29kZShjb2RlKToKICAgIHJldHVybiBmb3JtYXRfc3RyKGNvZGUsIG1vZGU9RmlsZU1vZGUoKSkKYDsKZnVuY3Rpb24gbGUoZSwgdCwgaSkgewogIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgdmFsdWU6IGksCiAgICBlbnVtZXJhYmxlOiAhMCwKICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICB3cml0YWJsZTogITAKICB9KSA6IGVbdF0gPSBpLCBlOwp9CmZ1bmN0aW9uIEEoZSwgdCkgewogIHZhciBpID0gT2JqZWN0LmtleXMoZSk7CiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgIHZhciByID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgIHQgJiYgKHIgPSByLmZpbHRlcihmdW5jdGlvbihuKSB7CiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG4pLmVudW1lcmFibGU7CiAgICB9KSksIGkucHVzaC5hcHBseShpLCByKTsKICB9CiAgcmV0dXJuIGk7Cn0KZnVuY3Rpb24gSChlKSB7CiAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgIHZhciBpID0gYXJndW1lbnRzW3RdICE9IG51bGwgPyBhcmd1bWVudHNbdF0gOiB7fTsKICAgIHQgJSAyID8gQShPYmplY3QoaSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpIHsKICAgICAgbGUoZSwgciwgaVtyXSk7CiAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoaSkpIDogQShPYmplY3QoaSkpLmZvckVhY2goZnVuY3Rpb24ocikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLCByKSk7CiAgICB9KTsKICB9CiAgcmV0dXJuIGU7Cn0KZnVuY3Rpb24gdWUoKSB7CiAgZm9yICh2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsIHQgPSBuZXcgQXJyYXkoZSksIGkgPSAwOyBpIDwgZTsgaSsrKQogICAgdFtpXSA9IGFyZ3VtZW50c1tpXTsKICByZXR1cm4gZnVuY3Rpb24ocikgewogICAgcmV0dXJuIHQucmVkdWNlUmlnaHQoZnVuY3Rpb24obiwgYSkgewogICAgICByZXR1cm4gYShuKTsKICAgIH0sIHIpOwogIH07Cn0KZnVuY3Rpb24gTyhlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uIHQoKSB7CiAgICBmb3IgKHZhciBpID0gdGhpcywgciA9IGFyZ3VtZW50cy5sZW5ndGgsIG4gPSBuZXcgQXJyYXkociksIGEgPSAwOyBhIDwgcjsgYSsrKQogICAgICBuW2FdID0gYXJndW1lbnRzW2FdOwogICAgcmV0dXJuIG4ubGVuZ3RoID49IGUubGVuZ3RoID8gZS5hcHBseSh0aGlzLCBuKSA6IGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciBsID0gYXJndW1lbnRzLmxlbmd0aCwgdSA9IG5ldyBBcnJheShsKSwgcyA9IDA7IHMgPCBsOyBzKyspCiAgICAgICAgdVtzXSA9IGFyZ3VtZW50c1tzXTsKICAgICAgcmV0dXJuIHQuYXBwbHkoaSwgW10uY29uY2F0KG4sIHUpKTsKICAgIH07CiAgfTsKfQpmdW5jdGlvbiB4KGUpIHsKICByZXR1cm4ge30udG9TdHJpbmcuY2FsbChlKS5pbmNsdWRlcygiT2JqZWN0Iik7Cn0KZnVuY3Rpb24gZGUoZSkgewogIHJldHVybiAhT2JqZWN0LmtleXMoZSkubGVuZ3RoOwp9CmZ1bmN0aW9uIFMoZSkgewogIHJldHVybiB0eXBlb2YgZSA9PSAiZnVuY3Rpb24iOwp9CmZ1bmN0aW9uIHBlKGUsIHQpIHsKICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHQpOwp9CmZ1bmN0aW9uIGZlKGUsIHQpIHsKICByZXR1cm4geCh0KSB8fCBfKCJjaGFuZ2VUeXBlIiksIE9iamVjdC5rZXlzKHQpLnNvbWUoZnVuY3Rpb24oaSkgewogICAgcmV0dXJuICFwZShlLCBpKTsKICB9KSAmJiBfKCJjaGFuZ2VGaWVsZCIpLCB0Owp9CmZ1bmN0aW9uIG1lKGUpIHsKICBTKGUpIHx8IF8oInNlbGVjdG9yVHlwZSIpOwp9CmZ1bmN0aW9uIHllKGUpIHsKICBTKGUpIHx8IHgoZSkgfHwgXygiaGFuZGxlclR5cGUiKSwgeChlKSAmJiBPYmplY3QudmFsdWVzKGUpLnNvbWUoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICFTKHQpOwogIH0pICYmIF8oImhhbmRsZXJzVHlwZSIpOwp9CmZ1bmN0aW9uIGhlKGUpIHsKICBlIHx8IF8oImluaXRpYWxJc1JlcXVpcmVkIiksIHgoZSkgfHwgXygiaW5pdGlhbFR5cGUiKSwgZGUoZSkgJiYgXygiaW5pdGlhbENvbnRlbnQiKTsKfQpmdW5jdGlvbiBnZShlLCB0KSB7CiAgdGhyb3cgbmV3IEVycm9yKGVbdF0gfHwgZS5kZWZhdWx0KTsKfQp2YXIgd2UgPSB7CiAgaW5pdGlhbElzUmVxdWlyZWQ6ICJpbml0aWFsIHN0YXRlIGlzIHJlcXVpcmVkIiwKICBpbml0aWFsVHlwZTogImluaXRpYWwgc3RhdGUgc2hvdWxkIGJlIGFuIG9iamVjdCIsCiAgaW5pdGlhbENvbnRlbnQ6ICJpbml0aWFsIHN0YXRlIHNob3VsZG4ndCBiZSBhbiBlbXB0eSBvYmplY3QiLAogIGhhbmRsZXJUeXBlOiAiaGFuZGxlciBzaG91bGQgYmUgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24iLAogIGhhbmRsZXJzVHlwZTogImFsbCBoYW5kbGVycyBzaG91bGQgYmUgYSBmdW5jdGlvbnMiLAogIHNlbGVjdG9yVHlwZTogInNlbGVjdG9yIHNob3VsZCBiZSBhIGZ1bmN0aW9uIiwKICBjaGFuZ2VUeXBlOiAicHJvdmlkZWQgdmFsdWUgb2YgY2hhbmdlcyBzaG91bGQgYmUgYW4gb2JqZWN0IiwKICBjaGFuZ2VGaWVsZDogJ2l0IHNlYW1zIHlvdSB3YW50IHRvIGNoYW5nZSBhIGZpZWxkIGluIHRoZSBzdGF0ZSB3aGljaCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSAiaW5pdGlhbCIgc3RhdGUnLAogIGRlZmF1bHQ6ICJhbiB1bmtub3duIGVycm9yIGFjY3VyZWQgaW4gYHN0YXRlLWxvY2FsYCBwYWNrYWdlIgp9LCBfID0gTyhnZSkod2UpLCBMID0gewogIGNoYW5nZXM6IGZlLAogIHNlbGVjdG9yOiBtZSwKICBoYW5kbGVyOiB5ZSwKICBpbml0aWFsOiBoZQp9OwpmdW5jdGlvbiBfZShlKSB7CiAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogIEwuaW5pdGlhbChlKSwgTC5oYW5kbGVyKHQpOwogIHZhciBpID0gewogICAgY3VycmVudDogZQogIH0sIHIgPSBPKEVlKShpLCB0KSwgbiA9IE8odmUpKGkpLCBhID0gTyhMLmNoYW5nZXMpKGUpLCBsID0gTyhiZSkoaSk7CiAgZnVuY3Rpb24gdSgpIHsKICAgIHZhciBvID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMF0gOiBmdW5jdGlvbihjKSB7CiAgICAgIHJldHVybiBjOwogICAgfTsKICAgIHJldHVybiBMLnNlbGVjdG9yKG8pLCBvKGkuY3VycmVudCk7CiAgfQogIGZ1bmN0aW9uIHMobykgewogICAgdWUociwgbiwgYSwgbCkobyk7CiAgfQogIHJldHVybiBbdSwgc107Cn0KZnVuY3Rpb24gYmUoZSwgdCkgewogIHJldHVybiBTKHQpID8gdChlLmN1cnJlbnQpIDogdDsKfQpmdW5jdGlvbiB2ZShlLCB0KSB7CiAgcmV0dXJuIGUuY3VycmVudCA9IEgoSCh7fSwgZS5jdXJyZW50KSwgdCksIHQ7Cn0KZnVuY3Rpb24gRWUoZSwgdCwgaSkgewogIHJldHVybiBTKHQpID8gdChlLmN1cnJlbnQpIDogT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbihyKSB7CiAgICB2YXIgbjsKICAgIHJldHVybiAobiA9IHRbcl0pID09PSBudWxsIHx8IG4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG4uY2FsbCh0LCBlLmN1cnJlbnRbcl0pOwogIH0pLCBpOwp9CnZhciBPZSA9IHsKICBjcmVhdGU6IF9lCn0sIFcgPSAvKiBAX19QVVJFX18gKi8gKChlKSA9PiAoZVtlLlJFQURZID0gMF0gPSAiUkVBRFkiLCBlKSkoVyB8fCB7fSksIGggPSAvKiBAX19QVVJFX18gKi8gKChlKSA9PiAoZVtlLkVYRUMgPSAwXSA9ICJFWEVDIiwgZVtlLkNPTVBMRVRFID0gMV0gPSAiQ09NUExFVEUiLCBlW2UuSU5TVEFMTCA9IDJdID0gIklOU1RBTEwiLCBlW2UuRk9STUFUID0gM10gPSAiRk9STUFUIiwgZVtlLkpTX0ZOX0NBTEwgPSA0XSA9ICJKU19GTl9DQUxMIiwgZSkpKGggfHwge30pLCBZID0gLyogQF9fUFVSRV9fICovICgoZSkgPT4gKGUuRk4gPSAiX19mdW5jdGlvbl9fIiwgZSkpKFkgfHwge30pOwpjb25zdCBHID0gIndyYXBwZXIiOwpmdW5jdGlvbiB2KGUsIHQpIHsKICB2YXIgbjsKICBjb25zdCBpID0gKChuID0gZSA9PSBudWxsID8gdm9pZCAwIDogZS50b0pzKSA9PSBudWxsID8gdm9pZCAwIDogbi5jYWxsKGUsIHsKICAgIGRpY3RfY29udmVydGVyOiBPYmplY3QuZnJvbUVudHJpZXMsCiAgICBjcmVhdGVfcHlwcm94aWVzOiAhMQogIH0pKSB8fCBlLCByID0gdC5pc1B5UHJveHkoaSkgPyBpLnRvU3RyaW5nKCkgOiBpOwogIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcocikpIHsKICAgIGNvbnN0IGEgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocik7CiAgICByZXR1cm4gZS5nZXRCdWZmZXIoKS5yZWxlYXNlKCksIGE7CiAgfQogIHJldHVybiByOwp9CmNvbnN0IFQgPSAvRmlsZSAiPGV4ZWM+IiwgbGluZSAoXGQrKSgkfCwgaW4gPG1vZHVsZT4pJC9tLCBQID0gbmV3IFJlZ0V4cCgKICBgRmlsZSAiPGV4ZWM+IiwgbGluZSAoXFxkKyksIGluICR7R31gLAogICJtIgopLCBTZSA9IC9saW5lIChcZCspL2c7CmZ1bmN0aW9uIGooZSkgewogIHJldHVybiBlLnJlcGxhY2UoU2UsICh0LCBpKSA9PiBgbGluZSAkeytpIC0gMX1gKTsKfQpmdW5jdGlvbiBGZShlKSB7CiAgY29uc3QgdCA9IFQudGVzdChlKSwgaSA9IFAudGVzdChlKTsKICBpZiAoISh0IHx8IGkpKQogICAgcmV0dXJuIGU7CiAgY29uc3QgciA9IGUuc3BsaXQoYApgKSwgbiA9IHIuZmluZEluZGV4KAogICAgKGwpID0+IHQgPyBULnRlc3QobCkgOiBQLnRlc3QobCkKICApOwogIGxldCBhID0gITE7CiAgcmV0dXJuIHIuc2xpY2UobikucmVkdWNlKChsLCB1KSA9PiB7CiAgICBpZiAoYSkKICAgICAgbC5wdXNoKGoodSkpOwogICAgZWxzZSB7CiAgICAgIGlmICh0ICYmICFpICYmIFQudGVzdCh1KSkKICAgICAgICByZXR1cm4gYSA9ICEwLCBsLnB1c2goaih1KS5yZXBsYWNlKCIsIGluIDxtb2R1bGU+IiwgIiIpKSwgbDsKICAgICAgaWYgKGkgJiYgUC50ZXN0KHUpKQogICAgICAgIHJldHVybiBhID0gITAsIGwucHVzaChqKHUpLnJlcGxhY2UoYCwgaW4gJHtHfWAsICIiKSksIGw7CiAgICB9CiAgICByZXR1cm4gbDsKICB9LCBbXSkuam9pbihgCmApOwp9CmZ1bmN0aW9uIExlKGUsIHQsIGkpIHsKICByZXR1cm4geyAuLi5lLCBbdF06IGkgfTsKfQpjb25zdCBbRCwgTmVdID0gT2UuY3JlYXRlKHsKICBjYWxsYmFja3M6IHt9LAogIGNvbW1hbmRVbmlxdWVJZDogMAp9KTsKYXN5bmMgZnVuY3Rpb24geGUoKSB7CiAgY29uc3QgZSA9IGF3YWl0IGFlKHNlLmxvYWRQeW9kaWRlT3B0aW9ucyk7CiAgYXdhaXQgZS5sb2FkUGFja2FnZSgibWljcm9waXAiKSwgYXdhaXQgZS5ydW5QeXRob25Bc3luYyhjZSk7CiAgbGV0IHQ7CiAgc2VsZi5TaGFyZWRBcnJheUJ1ZmZlciAmJiAodCA9IG5ldyBVaW50OEFycmF5KG5ldyBzZWxmLlNoYXJlZEFycmF5QnVmZmVyKDEpKSwgZS5zZXRJbnRlcnJ1cHRCdWZmZXIodCkpLCBwb3N0TWVzc2FnZSh7CiAgICBzdGF0dXM6IFcuUkVBRFksCiAgICBpbnRlcnJ1cHRCdWZmZXI6IHQKICB9KTsKICBjb25zdCBpID0gewogICAgW2guRVhFQ106IGFzeW5jICh7IGNvZGU6IGEsIGNvbnRleHQ6IGwgPSB7fSB9KSA9PiB7CiAgICAgIGNvbnN0IHUgPSBbXTsKICAgICAgT2JqZWN0LmVudHJpZXMobCkuZm9yRWFjaCgoW3MsIG9dKSA9PiB7CiAgICAgICAgKG8gPT0gbnVsbCA/IHZvaWQgMCA6IG8udHlwZSkgPT09IFkuRk4gPyBlLmdsb2JhbHMuc2V0KAogICAgICAgICAgcywKICAgICAgICAgIG4ocywgdSkKICAgICAgICApIDogZS5nbG9iYWxzLnNldChzLCBlLnRvUHkobykpOwogICAgICB9KTsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCBlLmxvYWRQYWNrYWdlc0Zyb21JbXBvcnRzKGEpLCBlLnJ1blB5dGhvbigiaW1wb3J0IHN5cywgaW87IHN5cy5zdGRvdXQgPSBpby5TdHJpbmdJTygpOyBzeXMuc3RkZXJyID0gaW8uU3RyaW5nSU8oKSIpOwogICAgICAgIGNvbnN0IHMgPSBhd2FpdCBlLnJ1blB5dGhvbkFzeW5jKGEpLCBvID0gZS5ydW5QeXRob24oImltcG9ydCBzeXM7IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKSIpLnRyaW0oKSwgYyA9IGUucnVuUHl0aG9uKCJpbXBvcnQgc3lzOyBzeXMuc3RkZXJyLmdldHZhbHVlKCkiKS50cmltKCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJlc3VsdDogdihzLCBlKSwKICAgICAgICAgIHN0ZG91dDogdihvLCBlKSwKICAgICAgICAgIHN0ZGVycjogYywKICAgICAgICAgIGVycm9yOiBudWxsCiAgICAgICAgfTsKICAgICAgfSBjYXRjaCAocykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICByZXN1bHQ6IG51bGwsCiAgICAgICAgICBzdGRvdXQ6IG51bGwsCiAgICAgICAgICBzdGRlcnI6IG51bGwsCiAgICAgICAgICBlcnJvcjogRmUocy5tZXNzYWdlKQogICAgICAgIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHMgfSA9IEQoKTsKICAgICAgICBPYmplY3QuZW50cmllcyhsKS5mb3JFYWNoKChbb10pID0+IHsKICAgICAgICAgIHZhciBjOwogICAgICAgICAgZS5nbG9iYWxzLnNldChvLCAoYyA9IGUudG9QeShudWxsKSkgPT0gbnVsbCA/IHZvaWQgMCA6IGMudG9TdHJpbmcoKSk7CiAgICAgICAgfSksIHUuZm9yRWFjaCgobykgPT4gewogICAgICAgICAgZGVsZXRlIHNbb107CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICBbaC5DT01QTEVURV06IGFzeW5jICh7CiAgICAgIGNvZGU6IGEsCiAgICAgIGxpbmU6IGwsCiAgICAgIGNvbHVtbjogdQogICAgfSkgPT4gewogICAgICBhd2FpdCBlLmxvYWRQYWNrYWdlc0Zyb21JbXBvcnRzKGEpOwogICAgICBjb25zdCBzID0gZS5nbG9iYWxzLmdldCgiZ2V0X2F1dG9jb21wbGV0aW9uIikoYSwgbCwgdSk7CiAgICAgIHJldHVybiB7IHJlc3VsdDogdihzLCBlKSwgZXJyb3I6IG51bGwgfTsKICAgIH0sCiAgICBbaC5JTlNUQUxMXTogYXN5bmMgKHsgcGFja2FnZXM6IGEgfSkgPT4gewogICAgICBjb25zdCBsID0gYXdhaXQgZS5nbG9iYWxzLmdldCgiaW5zdGFsbF9wYWNha2dlIikoYVswXSk7CiAgICAgIHJldHVybiB2KGwsIGUpOwogICAgfSwKICAgIFtoLkZPUk1BVF06IGFzeW5jICh7IGNvZGU6IGEgfSkgPT4gewogICAgICBjb25zdCBsID0gZS5nbG9iYWxzLmdldCgiZm9ybWF0X2NvZGUiKShhKTsKICAgICAgcmV0dXJuIHsgcmVzdWx0OiB2KGwsIGUpLCBlcnJvcjogbnVsbCB9OwogICAgfQogIH07CiAgb25tZXNzYWdlID0gYXN5bmMgZnVuY3Rpb24obCkgewogICAgY29uc3QgeyBpZDogdSwgYWN0aW9uOiBzID0gaC5FWEVDLCBkYXRhOiBvIH0gPSBsLmRhdGE7CiAgICBpZiAocyA9PT0gaC5KU19GTl9DQUxMKQogICAgICByKG8sIHUpOwogICAgZWxzZSB7CiAgICAgIGxldCBjOwogICAgICBzd2l0Y2ggKHMpIHsKICAgICAgICBjYXNlIGguRVhFQzoKICAgICAgICAgIGMgPSBhd2FpdCBpW2guRVhFQ10obyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIGguQ09NUExFVEU6CiAgICAgICAgICBjID0gYXdhaXQgaVtoLkNPTVBMRVRFXShvKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgaC5JTlNUQUxMOgogICAgICAgICAgYyA9IGF3YWl0IGlbaC5JTlNUQUxMXShvKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgaC5GT1JNQVQ6CiAgICAgICAgICBjID0gYXdhaXQgaVtoLkZPUk1BVF0obyk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgZGF0YTogYywKICAgICAgICBpZDogdSwKICAgICAgICBhY3Rpb246IHMKICAgICAgfSk7CiAgICB9CiAgfTsKICBmdW5jdGlvbiByKGEsIGwpIHsKICAgIGNvbnN0IHsgcmVzdWx0OiB1LCBlcnJvcjogcyB9ID0gYSwgeyBjYWxsYmFja3M6IG8gfSA9IEQoKTsKICAgIHMgJiYgb1tsXS5yZWplY3QocyksIG9bbF0ucmVzb2x2ZSh1KTsKICB9CiAgZnVuY3Rpb24gbihhLCBsKSB7CiAgICByZXR1cm4gYXN5bmMgKC4uLnUpID0+IG5ldyBQcm9taXNlKChzLCBvKSA9PiB7CiAgICAgIGNvbnN0IHsgY2FsbGJhY2tzOiBjLCBjb21tYW5kVW5pcXVlSWQ6IHAgfSA9IEQoKTsKICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgIGFjdGlvbjogaC5KU19GTl9DQUxMLAogICAgICAgIGRhdGE6IHsKICAgICAgICAgIGFyZ3M6IHUsCiAgICAgICAgICBuYW1lOiBhCiAgICAgICAgfSwKICAgICAgICBpZDogcAogICAgICB9KSwgbC5wdXNoKHApLCBOZSh7CiAgICAgICAgY2FsbGJhY2tzOiBMZShjLCBwLCB7CiAgICAgICAgICByZXNvbHZlOiBzLAogICAgICAgICAgcmVqZWN0OiBvCiAgICAgICAgfSksCiAgICAgICAgY29tbWFuZFVuaXF1ZUlkOiBwICsgMQogICAgICB9KTsKICAgIH0pOwogIH0KfQp4ZSgpOwo=",w=typeof window<"u"&&window.Blob&&new Blob([atob(h)],{type:"text/javascript;charset=utf-8"});function E(){const I=w&&(window.URL||window.webkitURL).createObjectURL(w);try{return I?new Worker(I):new Worker("data:application/javascript;base64,"+h,{type:"module"})}finally{I&&(window.URL||window.webkitURL).revokeObjectURL(I)}}const q=Boolean(globalThis.Worker),[B,K]=j.create({config:O,pyodideWorker:null,callbacks:{},commandUniqueId:0,jsFunctions:{},interruptBuffer:null}),n={async ensureWorkerIsSetup(){const{pyodideWorker:I}=B();I||await e()},async command(I,g,C){await n.ensureWorkerIsSetup();const{commandUniqueId:A,pyodideWorker:i,interruptBuffer:l}=B();l&&(l[0]=0),C||K({commandUniqueId:A+1}),i==null||i.postMessage({data:I,id:C??A,action:g})}},e=M(function(){return new Promise((g,C)=>{q||C(new Error(`your browser does
t support web workers!`));const A=new E;A.onmessage=function(l){var Z;((Z=l.data)==null?void 0:Z.status)===V.READY?(K({pyodideWorker:A,interruptBuffer:l.data.interruptBuffer}),A.onmessage=function(G){const{action:c,id:a,data:t}=G.data;switch(c){case m.JS_FN_CALL:iI(a,t);break;default:AI(a,t);break}},g(A)):C(new Error("unexpected error in setup process"))},A.onerror=function(l){C(l.message)}})});async function _(I){return new Promise((g,C)=>{const{callbacks:A,commandUniqueId:i}=B();n.command(bI(I),m.EXEC),K({callbacks:y(A,i,{resolve:g,reject:C})})})}const $={async repl(I){return new Promise((g,C)=>{const{commandUniqueId:A,callbacks:i}=B(),{code:l,line:Z,column:d}=I;let G=Z,c=d;Z||(G=l.split(`
`).length),c||(c=l.split(`
`)[G-1].length),n.command({code:l,line:G,column:c},m.COMPLETE),K({callbacks:y(i,A,{resolve:g,reject:C})})})}};async function II(I){return new Promise((g,C)=>{const{callbacks:A,commandUniqueId:i}=B();n.command({packages:I},m.INSTALL),K({callbacks:y(A,i,{resolve:g,reject:C})})})}async function gI(I){return new Promise((g,C)=>{const{callbacks:A,commandUniqueId:i}=B();n.command(I,m.FORMAT),K({callbacks:y(A,i,{resolve:g,reject:C})})})}function CI(){const{interruptBuffer:I}=B();if(!globalThis.SharedArrayBuffer)throw new Error(`
(function(b,u){typeof exports=="object"&&typeof module<"u"?u(exports):typeof define=="function"&&define.amd?define(["exports"],u):(b=typeof globalThis<"u"?globalThis:b||self,u(b.xPython={}))})(this,function(b){"use strict";function u(I,g,C){return g in I?Object.defineProperty(I,g,{value:C,enumerable:!0,configurable:!0,writable:!0}):I[g]=C,I}function H(I,g){var C=Object.keys(I);if(Object.getOwnPropertySymbols){var A=Object.getOwnPropertySymbols(I);g&&(A=A.filter(function(i){return Object.getOwnPropertyDescriptor(I,i).enumerable})),C.push.apply(C,A)}return C}function V(I){for(var g=1;g<arguments.length;g++){var C=arguments[g]!=null?arguments[g]:{};g%2?H(Object(C),!0).forEach(function(A){u(I,A,C[A])}):Object.getOwnPropertyDescriptors?Object.defineProperties(I,Object.getOwnPropertyDescriptors(C)):H(Object(C)).forEach(function(A){Object.defineProperty(I,A,Object.getOwnPropertyDescriptor(C,A))})}return I}function t(){for(var I=arguments.length,g=new Array(I),C=0;C<I;C++)g[C]=arguments[C];return function(A){return g.reduceRight(function(i,l){return l(i)},A)}}function s(I){return function g(){for(var C=this,A=arguments.length,i=new Array(A),l=0;l<A;l++)i[l]=arguments[l];return i.length>=I.length?I.apply(this,i):function(){for(var G=arguments.length,d=new Array(G),Z=0;Z<G;Z++)d[Z]=arguments[Z];return g.apply(C,[].concat(i,d))}}}function S(I){return{}.toString.call(I).includes("Object")}function R(I){return!Object.keys(I).length}function W(I){return typeof I=="function"}function J(I,g){return Object.prototype.hasOwnProperty.call(I,g)}function L(I,g){return S(g)||o("changeType"),Object.keys(g).some(function(C){return!J(I,C)})&&o("changeField"),g}function v(I){W(I)||o("selectorType")}function F(I){W(I)||S(I)||o("handlerType"),S(I)&&Object.values(I).some(function(g){return!W(g)})&&o("handlersType")}function U(I){I||o("initialIsRequired"),S(I)||o("initialType"),R(I)&&o("initialContent")}function r(I,g){throw new Error(I[g]||I.default)}var N={initialIsRequired:"initial state is required",initialType:"initial state should be an object",initialContent:"initial state shouldn't be an empty object",handlerType:"handler should be an object or a function",handlersType:"all handlers should be a functions",selectorType:"selector should be a function",changeType:"provided value of changes should be an object",changeField:'it seams you want to change a field in the state which is not specified in the "initial" state',default:"an unknown error accured in `state-local` package"},o=s(r)(N),y={changes:L,selector:v,handler:F,initial:U};function Q(I){var g=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};y.initial(I),y.handler(g);var C={current:I},A=s(T)(C,g),i=s(j)(C),l=s(y.changes)(I),G=s(z)(C);function d(){var B=arguments.length>0&&arguments[0]!==void 0?arguments[0]:function(X){return X};return y.selector(B),B(C.current)}function Z(B){t(A,i,l,G)(B)}return[d,Z]}function z(I,g){return W(g)?g(I.current):g}function j(I,g){return I.current=V(V({},I.current),g),g}function T(I,g,C){return W(g)?g(I.current):Object.keys(C).forEach(function(A){var i;return(i=g[A])===null||i===void 0?void 0:i.call(g,I.current[A])}),C}var f={create:Q};const O={loadPyodideOptions:{indexURL:"https://cdn.jsdelivr.net/pyodide/v0.23.2/full/"}};var a=(I=>(I[I.READY=0]="READY",I))(a||{}),m=(I=>(I[I.EXEC=0]="EXEC",I[I.COMPLETE=1]="COMPLETE",I[I.INSTALL=2]="INSTALL",I[I.FORMAT=3]="FORMAT",I[I.JS_FN_CALL=4]="JS_FN_CALL",I))(m||{}),Y=(I=>(I.FN="__function__",I))(Y||{});function P(I){let g;return()=>(g||(g=I()),g)}function D(I,g){if(!g)throw new Error(`a wrong id is provided from worker - callback with ${I} id doesn't exist`)}function M(I,g){const{[g]:C,...A}=I;return A}function p(I,g,C){return{...I,[g]:C}}function x(I,g,C){return{...I,[g]:C}}const w="dmFyIGIsIE0sIGssICQsIEIgPSB7IGV4cG9ydHM6IHt9IH07CkIuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgewogIGZ1bmN0aW9uIGUoZCkgewogICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KGQpKSAmJiBpc0Zpbml0ZShkKTsKICB9CiAgZnVuY3Rpb24gdChkKSB7CiAgICByZXR1cm4gZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGQuc3Vic3RyaW5nKDEpOwogIH0KICBmdW5jdGlvbiBvKGQpIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXNbZF07CiAgICB9OwogIH0KICB2YXIgciA9IFsiaXNDb25zdHJ1Y3RvciIsICJpc0V2YWwiLCAiaXNOYXRpdmUiLCAiaXNUb3BsZXZlbCJdLCBuID0gWyJjb2x1bW5OdW1iZXIiLCAibGluZU51bWJlciJdLCBhID0gWyJmaWxlTmFtZSIsICJmdW5jdGlvbk5hbWUiLCAic291cmNlIl0sIGwgPSBbImFyZ3MiXSwgdSA9IFsiZXZhbE9yaWdpbiJdLCBzID0gci5jb25jYXQobiwgYSwgbCwgdSk7CiAgZnVuY3Rpb24gaShkKSB7CiAgICBpZiAoZCkKICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBzLmxlbmd0aDsgbSsrKQogICAgICAgIGRbc1ttXV0gIT09IHZvaWQgMCAmJiB0aGlzWyJzZXQiICsgdChzW21dKV0oZFtzW21dXSk7CiAgfQogIGkucHJvdG90eXBlID0geyBnZXRBcmdzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmFyZ3M7CiAgfSwgc2V0QXJnczogZnVuY3Rpb24oZCkgewogICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkKSAhPT0gIltvYmplY3QgQXJyYXldIikKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJncyBtdXN0IGJlIGFuIEFycmF5Iik7CiAgICB0aGlzLmFyZ3MgPSBkOwogIH0sIGdldEV2YWxPcmlnaW46IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZXZhbE9yaWdpbjsKICB9LCBzZXRFdmFsT3JpZ2luOiBmdW5jdGlvbihkKSB7CiAgICBpZiAoZCBpbnN0YW5jZW9mIGkpCiAgICAgIHRoaXMuZXZhbE9yaWdpbiA9IGQ7CiAgICBlbHNlIHsKICAgICAgaWYgKCEoZCBpbnN0YW5jZW9mIE9iamVjdCkpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXZhbCBPcmlnaW4gbXVzdCBiZSBhbiBPYmplY3Qgb3IgU3RhY2tGcmFtZSIpOwogICAgICB0aGlzLmV2YWxPcmlnaW4gPSBuZXcgaShkKTsKICAgIH0KICB9LCB0b1N0cmluZzogZnVuY3Rpb24oKSB7CiAgICB2YXIgZCA9IHRoaXMuZ2V0RmlsZU5hbWUoKSB8fCAiIiwgbSA9IHRoaXMuZ2V0TGluZU51bWJlcigpIHx8ICIiLCB5ID0gdGhpcy5nZXRDb2x1bW5OdW1iZXIoKSB8fCAiIiwgZyA9IHRoaXMuZ2V0RnVuY3Rpb25OYW1lKCkgfHwgIiI7CiAgICByZXR1cm4gdGhpcy5nZXRJc0V2YWwoKSA/IGQgPyAiW2V2YWxdICgiICsgZCArICI6IiArIG0gKyAiOiIgKyB5ICsgIikiIDogIltldmFsXToiICsgbSArICI6IiArIHkgOiBnID8gZyArICIgKCIgKyBkICsgIjoiICsgbSArICI6IiArIHkgKyAiKSIgOiBkICsgIjoiICsgbSArICI6IiArIHk7CiAgfSB9LCBpLmZyb21TdHJpbmcgPSBmdW5jdGlvbihkKSB7CiAgICB2YXIgbSA9IGQuaW5kZXhPZigiKCIpLCB5ID0gZC5sYXN0SW5kZXhPZigiKSIpLCBnID0gZC5zdWJzdHJpbmcoMCwgbSksIHcgPSBkLnN1YnN0cmluZyhtICsgMSwgeSkuc3BsaXQoIiwiKSwgRiA9IGQuc3Vic3RyaW5nKHkgKyAxKTsKICAgIGlmIChGLmluZGV4T2YoIkAiKSA9PT0gMCkKICAgICAgdmFyIFIgPSAvQCguKz8pKD86OihcZCspKT8oPzo6KFxkKykpPyQvLmV4ZWMoRiwgIiIpLCBLID0gUlsxXSwgUSA9IFJbMl0sIFogPSBSWzNdOwogICAgcmV0dXJuIG5ldyBpKHsgZnVuY3Rpb25OYW1lOiBnLCBhcmdzOiB3IHx8IHZvaWQgMCwgZmlsZU5hbWU6IEssIGxpbmVOdW1iZXI6IFEgfHwgdm9pZCAwLCBjb2x1bW5OdW1iZXI6IFogfHwgdm9pZCAwIH0pOwogIH07CiAgZm9yICh2YXIgYyA9IDA7IGMgPCByLmxlbmd0aDsgYysrKQogICAgaS5wcm90b3R5cGVbImdldCIgKyB0KHJbY10pXSA9IG8ocltjXSksIGkucHJvdG90eXBlWyJzZXQiICsgdChyW2NdKV0gPSBmdW5jdGlvbihkKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihtKSB7CiAgICAgICAgdGhpc1tkXSA9IEJvb2xlYW4obSk7CiAgICAgIH07CiAgICB9KHJbY10pOwogIGZvciAodmFyIHAgPSAwOyBwIDwgbi5sZW5ndGg7IHArKykKICAgIGkucHJvdG90eXBlWyJnZXQiICsgdChuW3BdKV0gPSBvKG5bcF0pLCBpLnByb3RvdHlwZVsic2V0IiArIHQobltwXSldID0gZnVuY3Rpb24oZCkgewogICAgICByZXR1cm4gZnVuY3Rpb24obSkgewogICAgICAgIGlmICghZShtKSkKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZCArICIgbXVzdCBiZSBhIE51bWJlciIpOwogICAgICAgIHRoaXNbZF0gPSBOdW1iZXIobSk7CiAgICAgIH07CiAgICB9KG5bcF0pOwogIGZvciAodmFyIGYgPSAwOyBmIDwgYS5sZW5ndGg7IGYrKykKICAgIGkucHJvdG90eXBlWyJnZXQiICsgdChhW2ZdKV0gPSBvKGFbZl0pLCBpLnByb3RvdHlwZVsic2V0IiArIHQoYVtmXSldID0gZnVuY3Rpb24oZCkgewogICAgICByZXR1cm4gZnVuY3Rpb24obSkgewogICAgICAgIHRoaXNbZF0gPSBTdHJpbmcobSk7CiAgICAgIH07CiAgICB9KGFbZl0pOwogIHJldHVybiBpOwp9KCk7CnZhciBlZSA9IChiID0gQi5leHBvcnRzLCBNID0gLyhefEApXFMrOlxkKy8sIGsgPSAvXlxzKmF0IC4qKFxTKzpcZCt8XChuYXRpdmVcKSkvbSwgJCA9IC9eKGV2YWxAKT8oXFtuYXRpdmUgY29kZV0pPyQvLCB7IHBhcnNlOiBmdW5jdGlvbihlKSB7CiAgaWYgKGUuc3RhY2t0cmFjZSAhPT0gdm9pZCAwIHx8IGVbIm9wZXJhI3NvdXJjZWxvYyJdICE9PSB2b2lkIDApCiAgICByZXR1cm4gdGhpcy5wYXJzZU9wZXJhKGUpOwogIGlmIChlLnN0YWNrICYmIGUuc3RhY2subWF0Y2goaykpCiAgICByZXR1cm4gdGhpcy5wYXJzZVY4T3JJRShlKTsKICBpZiAoZS5zdGFjaykKICAgIHJldHVybiB0aGlzLnBhcnNlRkZPclNhZmFyaShlKTsKICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwYXJzZSBnaXZlbiBFcnJvciBvYmplY3QiKTsKfSwgZXh0cmFjdExvY2F0aW9uOiBmdW5jdGlvbihlKSB7CiAgaWYgKGUuaW5kZXhPZigiOiIpID09PSAtMSkKICAgIHJldHVybiBbZV07CiAgdmFyIHQgPSAvKC4rPykoPzo6KFxkKykpPyg/OjooXGQrKSk/JC8uZXhlYyhlLnJlcGxhY2UoL1soKV0vZywgIiIpKTsKICByZXR1cm4gW3RbMV0sIHRbMl0gfHwgdm9pZCAwLCB0WzNdIHx8IHZvaWQgMF07Cn0sIHBhcnNlVjhPcklFOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuIGUuc3RhY2suc3BsaXQoYApgKS5maWx0ZXIoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICEhdC5tYXRjaChrKTsKICB9LCB0aGlzKS5tYXAoZnVuY3Rpb24odCkgewogICAgdC5pbmRleE9mKCIoZXZhbCAiKSA+IC0xICYmICh0ID0gdC5yZXBsYWNlKC9ldmFsIGNvZGUvZywgImV2YWwiKS5yZXBsYWNlKC8oXChldmFsIGF0IFteKCldKil8KCwuKiQpL2csICIiKSk7CiAgICB2YXIgbyA9IHQucmVwbGFjZSgvXlxzKy8sICIiKS5yZXBsYWNlKC9cKGV2YWwgY29kZS9nLCAiKCIpLnJlcGxhY2UoL14uKj9ccysvLCAiIiksIHIgPSBvLm1hdGNoKC8gKFwoLitcKSQpLyk7CiAgICBvID0gciA/IG8ucmVwbGFjZShyWzBdLCAiIikgOiBvOwogICAgdmFyIG4gPSB0aGlzLmV4dHJhY3RMb2NhdGlvbihyID8gclsxXSA6IG8pLCBhID0gciAmJiBvIHx8IHZvaWQgMCwgbCA9IFsiZXZhbCIsICI8YW5vbnltb3VzPiJdLmluZGV4T2YoblswXSkgPiAtMSA/IHZvaWQgMCA6IG5bMF07CiAgICByZXR1cm4gbmV3IGIoeyBmdW5jdGlvbk5hbWU6IGEsIGZpbGVOYW1lOiBsLCBsaW5lTnVtYmVyOiBuWzFdLCBjb2x1bW5OdW1iZXI6IG5bMl0sIHNvdXJjZTogdCB9KTsKICB9LCB0aGlzKTsKfSwgcGFyc2VGRk9yU2FmYXJpOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuIGUuc3RhY2suc3BsaXQoYApgKS5maWx0ZXIoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICF0Lm1hdGNoKCQpOwogIH0sIHRoaXMpLm1hcChmdW5jdGlvbih0KSB7CiAgICBpZiAodC5pbmRleE9mKCIgPiBldmFsIikgPiAtMSAmJiAodCA9IHQucmVwbGFjZSgvIGxpbmUgKFxkKykoPzogPiBldmFsIGxpbmUgXGQrKSogPiBldmFsOlxkKzpcZCsvZywgIjokMSIpKSwgdC5pbmRleE9mKCJAIikgPT09IC0xICYmIHQuaW5kZXhPZigiOiIpID09PSAtMSkKICAgICAgcmV0dXJuIG5ldyBiKHsgZnVuY3Rpb25OYW1lOiB0IH0pOwogICAgdmFyIG8gPSAvKCguKiIuKyJbXkBdKik/W15AXSopKD86QCkvLCByID0gdC5tYXRjaChvKSwgbiA9IHIgJiYgclsxXSA/IHJbMV0gOiB2b2lkIDAsIGEgPSB0aGlzLmV4dHJhY3RMb2NhdGlvbih0LnJlcGxhY2UobywgIiIpKTsKICAgIHJldHVybiBuZXcgYih7IGZ1bmN0aW9uTmFtZTogbiwgZmlsZU5hbWU6IGFbMF0sIGxpbmVOdW1iZXI6IGFbMV0sIGNvbHVtbk51bWJlcjogYVsyXSwgc291cmNlOiB0IH0pOwogIH0sIHRoaXMpOwp9LCBwYXJzZU9wZXJhOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuICFlLnN0YWNrdHJhY2UgfHwgZS5tZXNzYWdlLmluZGV4T2YoYApgKSA+IC0xICYmIGUubWVzc2FnZS5zcGxpdChgCmApLmxlbmd0aCA+IGUuc3RhY2t0cmFjZS5zcGxpdChgCmApLmxlbmd0aCA/IHRoaXMucGFyc2VPcGVyYTkoZSkgOiBlLnN0YWNrID8gdGhpcy5wYXJzZU9wZXJhMTEoZSkgOiB0aGlzLnBhcnNlT3BlcmExMChlKTsKfSwgcGFyc2VPcGVyYTk6IGZ1bmN0aW9uKGUpIHsKICBmb3IgKHZhciB0ID0gL0xpbmUgKFxkKykuKnNjcmlwdCAoPzppbiApPyhcUyspL2ksIG8gPSBlLm1lc3NhZ2Uuc3BsaXQoYApgKSwgciA9IFtdLCBuID0gMiwgYSA9IG8ubGVuZ3RoOyBuIDwgYTsgbiArPSAyKSB7CiAgICB2YXIgbCA9IHQuZXhlYyhvW25dKTsKICAgIGwgJiYgci5wdXNoKG5ldyBiKHsgZmlsZU5hbWU6IGxbMl0sIGxpbmVOdW1iZXI6IGxbMV0sIHNvdXJjZTogb1tuXSB9KSk7CiAgfQogIHJldHVybiByOwp9LCBwYXJzZU9wZXJhMTA6IGZ1bmN0aW9uKGUpIHsKICBmb3IgKHZhciB0ID0gL0xpbmUgKFxkKykuKnNjcmlwdCAoPzppbiApPyhcUyspKD86OiBJbiBmdW5jdGlvbiAoXFMrKSk/JC9pLCBvID0gZS5zdGFja3RyYWNlLnNwbGl0KGAKYCksIHIgPSBbXSwgbiA9IDAsIGEgPSBvLmxlbmd0aDsgbiA8IGE7IG4gKz0gMikgewogICAgdmFyIGwgPSB0LmV4ZWMob1tuXSk7CiAgICBsICYmIHIucHVzaChuZXcgYih7IGZ1bmN0aW9uTmFtZTogbFszXSB8fCB2b2lkIDAsIGZpbGVOYW1lOiBsWzJdLCBsaW5lTnVtYmVyOiBsWzFdLCBzb3VyY2U6IG9bbl0gfSkpOwogIH0KICByZXR1cm4gcjsKfSwgcGFyc2VPcGVyYTExOiBmdW5jdGlvbihlKSB7CiAgcmV0dXJuIGUuc3RhY2suc3BsaXQoYApgKS5maWx0ZXIoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICEhdC5tYXRjaChNKSAmJiAhdC5tYXRjaCgvXkVycm9yIGNyZWF0ZWQgYXQvKTsKICB9LCB0aGlzKS5tYXAoZnVuY3Rpb24odCkgewogICAgdmFyIG8sIHIgPSB0LnNwbGl0KCJAIiksIG4gPSB0aGlzLmV4dHJhY3RMb2NhdGlvbihyLnBvcCgpKSwgYSA9IHIuc2hpZnQoKSB8fCAiIiwgbCA9IGEucmVwbGFjZSgvPGFub255bW91cyBmdW5jdGlvbig6IChcdyspKT8+LywgIiQyIikucmVwbGFjZSgvXChbXildKlwpL2csICIiKSB8fCB2b2lkIDA7CiAgICBhLm1hdGNoKC9cKChbXildKilcKS8pICYmIChvID0gYS5yZXBsYWNlKC9eW14oXStcKChbXildKilcKSQvLCAiJDEiKSk7CiAgICB2YXIgdSA9IG8gPT09IHZvaWQgMCB8fCBvID09PSAiW2FyZ3VtZW50cyBub3QgYXZhaWxhYmxlXSIgPyB2b2lkIDAgOiBvLnNwbGl0KCIsIik7CiAgICByZXR1cm4gbmV3IGIoeyBmdW5jdGlvbk5hbWU6IGwsIGFyZ3M6IHUsIGZpbGVOYW1lOiBuWzBdLCBsaW5lTnVtYmVyOiBuWzFdLCBjb2x1bW5OdW1iZXI6IG5bMl0sIHNvdXJjZTogdCB9KTsKICB9LCB0aGlzKTsKfSB9KTsKY29uc3QgRSA9IHR5cGVvZiBwcm9jZXNzID09ICJvYmplY3QiICYmIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zID09ICJvYmplY3QiICYmIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgPT0gInN0cmluZyIgJiYgcHJvY2Vzcy5icm93c2VyID09PSB2b2lkIDA7CmxldCBxLCBDLCBJLCBYLCB6LCBKLCBVLCBWLCBOOwppZiAoSiA9IEUgPyBmdW5jdGlvbihlLCB0KSB7CiAgcmV0dXJuIEkucmVzb2x2ZSh0IHx8ICIuIiwgZSk7Cn0gOiBmdW5jdGlvbihlLCB0KSB7CiAgcmV0dXJuIHQgPT09IHZvaWQgMCAmJiAodCA9IGxvY2F0aW9uKSwgbmV3IFVSTChlLCB0KS50b1N0cmluZygpOwp9LCBFIHx8IChVID0gIi8iKSwgViA9IEUgPyBhc3luYyBmdW5jdGlvbihlLCB0KSB7CiAgaWYgKGUuc3RhcnRzV2l0aCgiZmlsZTovLyIpICYmIChlID0gZS5zbGljZSg3KSksIGUuaW5jbHVkZXMoIjovLyIpKSB7CiAgICBsZXQgbyA9IGF3YWl0IEMoZSk7CiAgICBpZiAoIW8ub2spCiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgJyR7ZX0nOiByZXF1ZXN0IGZhaWxlZC5gKTsKICAgIHJldHVybiBuZXcgVWludDhBcnJheShhd2FpdCBvLmFycmF5QnVmZmVyKCkpOwogIH0KICB7CiAgICBjb25zdCBvID0gYXdhaXQgei5yZWFkRmlsZShlKTsKICAgIHJldHVybiBuZXcgVWludDhBcnJheShvLmJ1ZmZlciwgby5ieXRlT2Zmc2V0LCBvLmJ5dGVMZW5ndGgpOwogIH0KfSA6IGFzeW5jIGZ1bmN0aW9uKGUsIHQpIHsKICBjb25zdCBvID0gbmV3IFVSTChlLCBsb2NhdGlvbik7CiAgbGV0IHIgPSB0ID8geyBpbnRlZ3JpdHk6IHQgfSA6IHt9LCBuID0gYXdhaXQgZmV0Y2gobywgcik7CiAgaWYgKCFuLm9rKQogICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCAnJHtvfSc6IHJlcXVlc3QgZmFpbGVkLmApOwogIHJldHVybiBuZXcgVWludDhBcnJheShhd2FpdCBuLmFycmF5QnVmZmVyKCkpOwp9LCBnbG9iYWxUaGlzLmRvY3VtZW50KQogIE4gPSBhc3luYyAoZSkgPT4gYXdhaXQgaW1wb3J0KAogICAgLyogd2VicGFja0lnbm9yZTogdHJ1ZSAqLwogICAgZQogICk7CmVsc2UgaWYgKGdsb2JhbFRoaXMuaW1wb3J0U2NyaXB0cykKICBOID0gYXN5bmMgKGUpID0+IHsKICAgIHRyeSB7CiAgICAgIGdsb2JhbFRoaXMuaW1wb3J0U2NyaXB0cyhlKTsKICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgaWYgKCEodCBpbnN0YW5jZW9mIFR5cGVFcnJvcikpCiAgICAgICAgdGhyb3cgdDsKICAgICAgYXdhaXQgaW1wb3J0KAogICAgICAgIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8KICAgICAgICBlCiAgICAgICk7CiAgICB9CiAgfTsKZWxzZSB7CiAgaWYgKCFFKQogICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZGV0ZXJtaW5lIHJ1bnRpbWUgZW52aXJvbm1lbnQiKTsKICBOID0gYXN5bmMgZnVuY3Rpb24oZSkgewogICAgZS5zdGFydHNXaXRoKCJmaWxlOi8vIikgJiYgKGUgPSBlLnNsaWNlKDcpKSwgZS5pbmNsdWRlcygiOi8vIikgPyBYLnJ1bkluVGhpc0NvbnRleHQoYXdhaXQgKGF3YWl0IEMoZSkpLnRleHQoKSkgOiBhd2FpdCBpbXBvcnQoCiAgICAgIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8KICAgICAgcS5wYXRoVG9GaWxlVVJMKGUpLmhyZWYKICAgICk7CiAgfTsKfQpmdW5jdGlvbiB0ZShlKSB7CiAgdmFyIHQgPSB0eXBlb2YgU3ltYm9sID09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLml0ZXJhdG9yLCBvID0gdCAmJiBlW3RdLCByID0gMDsKICBpZiAobykKICAgIHJldHVybiBvLmNhbGwoZSk7CiAgaWYgKGUgJiYgdHlwZW9mIGUubGVuZ3RoID09ICJudW1iZXIiKQogICAgcmV0dXJuIHsgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBlICYmIHIgPj0gZS5sZW5ndGggJiYgKGUgPSB2b2lkIDApLCB7IHZhbHVlOiBlICYmIGVbcisrXSwgZG9uZTogIWUgfTsKICAgIH0gfTsKICB0aHJvdyBuZXcgVHlwZUVycm9yKHQgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKfQpmdW5jdGlvbiByZShlKSB7CiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwogIHZhciB0LCBvID0gZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl07CiAgcmV0dXJuIG8gPyBvLmNhbGwoZSkgOiAoZSA9IHRlKGUpLCB0ID0ge30sIHIoIm5leHQiKSwgcigidGhyb3ciKSwgcigicmV0dXJuIiksIHRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9LCB0KTsKICBmdW5jdGlvbiByKG4pIHsKICAgIHRbbl0gPSBlW25dICYmIGZ1bmN0aW9uKGEpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGwsIHUpIHsKICAgICAgICAoZnVuY3Rpb24ocywgaSwgYywgcCkgewogICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHApLnRoZW4oZnVuY3Rpb24oZikgewogICAgICAgICAgICBzKHsgdmFsdWU6IGYsIGRvbmU6IGMgfSk7CiAgICAgICAgICB9LCBpKTsKICAgICAgICB9KShsLCB1LCAoYSA9IGVbbl0oYSkpLmRvbmUsIGEudmFsdWUpOwogICAgICB9KTsKICAgIH07CiAgfQp9CmNvbnN0IG5lID0gYXN5bmMgKGUpID0+IHsKICBjb25zdCB0ID0gW107CiAgYXdhaXQgYXN5bmMgZnVuY3Rpb24gcihuKSB7CiAgICB2YXIgYSwgbDsKICAgIHRyeSB7CiAgICAgIGZvciAodmFyIHUsIHMgPSByZShuLnZhbHVlcygpKTsgISh1ID0gYXdhaXQgcy5uZXh0KCkpLmRvbmU7ICkgewogICAgICAgIGNvbnN0IGkgPSB1LnZhbHVlOwogICAgICAgIHQucHVzaChpKSwgaS5raW5kID09PSAiZGlyZWN0b3J5IiAmJiBhd2FpdCByKGkpOwogICAgICB9CiAgICB9IGNhdGNoIChpKSB7CiAgICAgIGEgPSB7IGVycm9yOiBpIH07CiAgICB9IGZpbmFsbHkgewogICAgICB0cnkgewogICAgICAgIHUgJiYgIXUuZG9uZSAmJiAobCA9IHMucmV0dXJuKSAmJiBhd2FpdCBsLmNhbGwocyk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgaWYgKGEpCiAgICAgICAgICB0aHJvdyBhLmVycm9yOwogICAgICB9CiAgICB9CiAgfShlKTsKICBjb25zdCBvID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBvLnNldCgiLiIsIGUpOwogIGZvciAoY29uc3QgciBvZiB0KSB7CiAgICBjb25zdCBuID0gKGF3YWl0IGUucmVzb2x2ZShyKSkuam9pbigiLyIpOwogICAgby5zZXQobiwgcik7CiAgfQogIHJldHVybiBvOwp9OwpmdW5jdGlvbiBvZShlLCB0KSB7CiAgbGV0IG87CiAgbyA9IHQuc3RkTGliVVJMICE9IG51bGwgPyB0LnN0ZExpYlVSTCA6IHQuaW5kZXhVUkwgKyAicHl0aG9uX3N0ZGxpYi56aXAiLCBmdW5jdGlvbihyLCBuKSB7CiAgICBjb25zdCBhID0gVihuKTsKICAgIHIucHJlUnVuLnB1c2goKCkgPT4gewogICAgICBjb25zdCBsID0gci5fcHlfdmVyc2lvbl9tYWpvcigpLCB1ID0gci5fcHlfdmVyc2lvbl9taW5vcigpOwogICAgICByLkZTLm1rZGlyVHJlZSgiL2xpYiIpLCByLkZTLm1rZGlyVHJlZShgL2xpYi9weXRob24ke2x9LiR7dX0vc2l0ZS1wYWNrYWdlc2ApLCByLmFkZFJ1bkRlcGVuZGVuY3koImluc3RhbGwtc3RkbGliIiksIGEudGhlbigocykgPT4gewogICAgICAgIHIuRlMud3JpdGVGaWxlKGAvbGliL3B5dGhvbiR7bH0ke3V9LnppcGAsIHMpOwogICAgICB9KS5jYXRjaCgocykgPT4gewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIG9jY3VycmVkIHdoaWxlIGluc3RhbGxpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnk6IiksIGNvbnNvbGUuZXJyb3Iocyk7CiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gewogICAgICAgIHIucmVtb3ZlUnVuRGVwZW5kZW5jeSgiaW5zdGFsbC1zdGRsaWIiKTsKICAgICAgfSk7CiAgICB9KTsKICB9KGUsIG8pLCBmdW5jdGlvbihyLCBuKSB7CiAgICByLnByZVJ1bi5wdXNoKGZ1bmN0aW9uKCkgewogICAgICB0cnkgewogICAgICAgIHIuRlMubWtkaXJUcmVlKG4pOwogICAgICB9IGNhdGNoIChhKSB7CiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3Igb2NjdXJyZWQgd2hpbGUgbWFraW5nIGEgaG9tZSBkaXJlY3RvcnkgJyR7bn0nOmApLCBjb25zb2xlLmVycm9yKGEpLCBjb25zb2xlLmVycm9yKCJVc2luZyAnLycgZm9yIGEgaG9tZSBkaXJlY3RvcnkgaW5zdGVhZCIpLCBuID0gIi8iOwogICAgICB9CiAgICAgIHIuRU5WLkhPTUUgPSBuLCByLkZTLmNoZGlyKG4pOwogICAgfSk7CiAgfShlLCB0LmhvbWVkaXIpLCBmdW5jdGlvbihyLCBuKSB7CiAgICByLnByZVJ1bi5wdXNoKCgpID0+IHsKICAgICAgZm9yIChjb25zdCBhIG9mIG4pCiAgICAgICAgci5GUy5ta2RpclRyZWUoYSksIHIuRlMubW91bnQoci5GUy5maWxlc3lzdGVtcy5OT0RFRlMsIHsgcm9vdDogYSB9LCBhKTsKICAgIH0pOwogIH0oZSwgdC5fbm9kZV9tb3VudHMpLCBlLnByZVJ1bi5wdXNoKCgpID0+IGZ1bmN0aW9uKHIpIHsKICAgIGNvbnN0IG4gPSByLkZTLCBhID0gci5GUy5maWxlc3lzdGVtcy5NRU1GUywgbCA9IHIuUEFUSCwgdSA9IHsgRElSX01PREU6IDE2ODk1LCBGSUxFX01PREU6IDMzMjc5LCBtb3VudDogZnVuY3Rpb24ocykgewogICAgICBpZiAoIXMub3B0cy5maWxlU3lzdGVtSGFuZGxlKQogICAgICAgIHRocm93IG5ldyBFcnJvcigib3B0cy5maWxlU3lzdGVtSGFuZGxlIGlzIHJlcXVpcmVkIik7CiAgICAgIHJldHVybiBhLm1vdW50LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB9LCBzeW5jZnM6IGFzeW5jIChzLCBpLCBjKSA9PiB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcCA9IHUuZ2V0TG9jYWxTZXQocyksIGYgPSBhd2FpdCB1LmdldFJlbW90ZVNldChzKSwgZCA9IGkgPyBmIDogcCwgbSA9IGkgPyBwIDogZjsKICAgICAgICBhd2FpdCB1LnJlY29uY2lsZShzLCBkLCBtKSwgYyhudWxsKTsKICAgICAgfSBjYXRjaCAocCkgewogICAgICAgIGMocCk7CiAgICAgIH0KICAgIH0sIGdldExvY2FsU2V0OiAocykgPT4gewogICAgICBsZXQgaSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBmdW5jdGlvbiBjKGQpIHsKICAgICAgICByZXR1cm4gZCAhPT0gIi4iICYmIGQgIT09ICIuLiI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcChkKSB7CiAgICAgICAgcmV0dXJuIChtKSA9PiBsLmpvaW4yKGQsIG0pOwogICAgICB9CiAgICAgIGxldCBmID0gbi5yZWFkZGlyKHMubW91bnRwb2ludCkuZmlsdGVyKGMpLm1hcChwKHMubW91bnRwb2ludCkpOwogICAgICBmb3IgKDsgZi5sZW5ndGg7ICkgewogICAgICAgIGxldCBkID0gZi5wb3AoKSwgbSA9IG4uc3RhdChkKTsKICAgICAgICBuLmlzRGlyKG0ubW9kZSkgJiYgZi5wdXNoLmFwcGx5KGYsIG4ucmVhZGRpcihkKS5maWx0ZXIoYykubWFwKHAoZCkpKSwgaVtkXSA9IHsgdGltZXN0YW1wOiBtLm10aW1lLCBtb2RlOiBtLm1vZGUgfTsKICAgICAgfQogICAgICByZXR1cm4geyB0eXBlOiAibG9jYWwiLCBlbnRyaWVzOiBpIH07CiAgICB9LCBnZXRSZW1vdGVTZXQ6IGFzeW5jIChzKSA9PiB7CiAgICAgIGNvbnN0IGkgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgYyA9IGF3YWl0IG5lKHMub3B0cy5maWxlU3lzdGVtSGFuZGxlKTsKICAgICAgZm9yIChjb25zdCBbcCwgZl0gb2YgYykKICAgICAgICBwICE9PSAiLiIgJiYgKGlbbC5qb2luMihzLm1vdW50cG9pbnQsIHApXSA9IHsgdGltZXN0YW1wOiBmLmtpbmQgPT09ICJmaWxlIiA/IChhd2FpdCBmLmdldEZpbGUoKSkubGFzdE1vZGlmaWVkRGF0ZSA6IG5ldyBEYXRlKCksIG1vZGU6IGYua2luZCA9PT0gImZpbGUiID8gdS5GSUxFX01PREUgOiB1LkRJUl9NT0RFIH0pOwogICAgICByZXR1cm4geyB0eXBlOiAicmVtb3RlIiwgZW50cmllczogaSwgaGFuZGxlczogYyB9OwogICAgfSwgbG9hZExvY2FsRW50cnk6IChzKSA9PiB7CiAgICAgIGNvbnN0IGkgPSBuLmxvb2t1cFBhdGgocykubm9kZSwgYyA9IG4uc3RhdChzKTsKICAgICAgaWYgKG4uaXNEaXIoYy5tb2RlKSkKICAgICAgICByZXR1cm4geyB0aW1lc3RhbXA6IGMubXRpbWUsIG1vZGU6IGMubW9kZSB9OwogICAgICBpZiAobi5pc0ZpbGUoYy5tb2RlKSkKICAgICAgICByZXR1cm4gaS5jb250ZW50cyA9IGEuZ2V0RmlsZURhdGFBc1R5cGVkQXJyYXkoaSksIHsgdGltZXN0YW1wOiBjLm10aW1lLCBtb2RlOiBjLm1vZGUsIGNvbnRlbnRzOiBpLmNvbnRlbnRzIH07CiAgICAgIHRocm93IG5ldyBFcnJvcigibm9kZSB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKICAgIH0sIHN0b3JlTG9jYWxFbnRyeTogKHMsIGkpID0+IHsKICAgICAgaWYgKG4uaXNEaXIoaS5tb2RlKSkKICAgICAgICBuLm1rZGlyVHJlZShzLCBpLm1vZGUpOwogICAgICBlbHNlIHsKICAgICAgICBpZiAoIW4uaXNGaWxlKGkubW9kZSkpCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIm5vZGUgdHlwZSBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgbi53cml0ZUZpbGUocywgaS5jb250ZW50cywgeyBjYW5Pd246ICEwIH0pOwogICAgICB9CiAgICAgIG4uY2htb2QocywgaS5tb2RlKSwgbi51dGltZShzLCBpLnRpbWVzdGFtcCwgaS50aW1lc3RhbXApOwogICAgfSwgcmVtb3ZlTG9jYWxFbnRyeTogKHMpID0+IHsKICAgICAgdmFyIGkgPSBuLnN0YXQocyk7CiAgICAgIG4uaXNEaXIoaS5tb2RlKSA/IG4ucm1kaXIocykgOiBuLmlzRmlsZShpLm1vZGUpICYmIG4udW5saW5rKHMpOwogICAgfSwgbG9hZFJlbW90ZUVudHJ5OiBhc3luYyAocykgPT4gewogICAgICBpZiAocy5raW5kID09PSAiZmlsZSIpIHsKICAgICAgICBjb25zdCBpID0gYXdhaXQgcy5nZXRGaWxlKCk7CiAgICAgICAgcmV0dXJuIHsgY29udGVudHM6IG5ldyBVaW50OEFycmF5KGF3YWl0IGkuYXJyYXlCdWZmZXIoKSksIG1vZGU6IHUuRklMRV9NT0RFLCB0aW1lc3RhbXA6IGkubGFzdE1vZGlmaWVkRGF0ZSB9OwogICAgICB9CiAgICAgIGlmIChzLmtpbmQgPT09ICJkaXJlY3RvcnkiKQogICAgICAgIHJldHVybiB7IG1vZGU6IHUuRElSX01PREUsIHRpbWVzdGFtcDogbmV3IERhdGUoKSB9OwogICAgICB0aHJvdyBuZXcgRXJyb3IoInVua25vd24ga2luZDogIiArIHMua2luZCk7CiAgICB9LCBzdG9yZVJlbW90ZUVudHJ5OiBhc3luYyAocywgaSwgYykgPT4gewogICAgICBjb25zdCBwID0gcy5nZXQobC5kaXJuYW1lKGkpKSwgZiA9IG4uaXNGaWxlKGMubW9kZSkgPyBhd2FpdCBwLmdldEZpbGVIYW5kbGUobC5iYXNlbmFtZShpKSwgeyBjcmVhdGU6ICEwIH0pIDogYXdhaXQgcC5nZXREaXJlY3RvcnlIYW5kbGUobC5iYXNlbmFtZShpKSwgeyBjcmVhdGU6ICEwIH0pOwogICAgICBpZiAoZi5raW5kID09PSAiZmlsZSIpIHsKICAgICAgICBjb25zdCBkID0gYXdhaXQgZi5jcmVhdGVXcml0YWJsZSgpOwogICAgICAgIGF3YWl0IGQud3JpdGUoYy5jb250ZW50cyksIGF3YWl0IGQuY2xvc2UoKTsKICAgICAgfQogICAgICBzLnNldChpLCBmKTsKICAgIH0sIHJlbW92ZVJlbW90ZUVudHJ5OiBhc3luYyAocywgaSkgPT4gewogICAgICBhd2FpdCBzLmdldChsLmRpcm5hbWUoaSkpLnJlbW92ZUVudHJ5KGwuYmFzZW5hbWUoaSkpLCBzLmRlbGV0ZShpKTsKICAgIH0sIHJlY29uY2lsZTogYXN5bmMgKHMsIGksIGMpID0+IHsKICAgICAgbGV0IHAgPSAwOwogICAgICBjb25zdCBmID0gW107CiAgICAgIE9iamVjdC5rZXlzKGkuZW50cmllcykuZm9yRWFjaChmdW5jdGlvbih5KSB7CiAgICAgICAgY29uc3QgZyA9IGkuZW50cmllc1t5XSwgdyA9IGMuZW50cmllc1t5XTsKICAgICAgICAoIXcgfHwgbi5pc0ZpbGUoZy5tb2RlKSAmJiBnLnRpbWVzdGFtcC5nZXRUaW1lKCkgPiB3LnRpbWVzdGFtcC5nZXRUaW1lKCkpICYmIChmLnB1c2goeSksIHArKyk7CiAgICAgIH0pLCBmLnNvcnQoKTsKICAgICAgY29uc3QgZCA9IFtdOwogICAgICBpZiAoT2JqZWN0LmtleXMoYy5lbnRyaWVzKS5mb3JFYWNoKGZ1bmN0aW9uKHkpIHsKICAgICAgICBpLmVudHJpZXNbeV0gfHwgKGQucHVzaCh5KSwgcCsrKTsKICAgICAgfSksIGQuc29ydCgpLnJldmVyc2UoKSwgIXApCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBtID0gaS50eXBlID09PSAicmVtb3RlIiA/IGkuaGFuZGxlcyA6IGMuaGFuZGxlczsKICAgICAgZm9yIChjb25zdCB5IG9mIGYpIHsKICAgICAgICBjb25zdCBnID0gbC5ub3JtYWxpemUoeS5yZXBsYWNlKHMubW91bnRwb2ludCwgIi8iKSkuc3Vic3RyaW5nKDEpOwogICAgICAgIGlmIChjLnR5cGUgPT09ICJsb2NhbCIpIHsKICAgICAgICAgIGNvbnN0IHcgPSBtLmdldChnKSwgRiA9IGF3YWl0IHUubG9hZFJlbW90ZUVudHJ5KHcpOwogICAgICAgICAgdS5zdG9yZUxvY2FsRW50cnkoeSwgRik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHcgPSB1LmxvYWRMb2NhbEVudHJ5KHkpOwogICAgICAgICAgYXdhaXQgdS5zdG9yZVJlbW90ZUVudHJ5KG0sIGcsIHcpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGNvbnN0IHkgb2YgZCkKICAgICAgICBpZiAoYy50eXBlID09PSAibG9jYWwiKQogICAgICAgICAgdS5yZW1vdmVMb2NhbEVudHJ5KHkpOwogICAgICAgIGVsc2UgewogICAgICAgICAgY29uc3QgZyA9IGwubm9ybWFsaXplKHkucmVwbGFjZShzLm1vdW50cG9pbnQsICIvIikpLnN1YnN0cmluZygxKTsKICAgICAgICAgIGF3YWl0IHUucmVtb3ZlUmVtb3RlRW50cnkobSwgZyk7CiAgICAgICAgfQogICAgfSB9OwogICAgci5GUy5maWxlc3lzdGVtcy5OQVRJVkVGU19BU1lOQyA9IHU7CiAgfShlKSk7Cn0KZnVuY3Rpb24gaWUoZSwgdCkgewogIGUucnVuUHl0aG9uSW50ZXJuYWxfZGljdCA9IGUuX3B5b2RpZGUuX2Jhc2UuZXZhbF9jb2RlKCJ7fSIpLCBlLmltcG9ydGxpYiA9IGUucnVuUHl0aG9uSW50ZXJuYWwoImltcG9ydCBpbXBvcnRsaWI7IGltcG9ydGxpYiIpOwogIGxldCBvID0gZS5pbXBvcnRsaWIuaW1wb3J0X21vZHVsZTsKICBlLnN5cyA9IG8oInN5cyIpLCBlLnN5cy5wYXRoLmluc2VydCgwLCB0LmhvbWVkaXIpLCBlLm9zID0gbygib3MiKTsKICBsZXQgciA9IGUucnVuUHl0aG9uSW50ZXJuYWwoImltcG9ydCBfX21haW5fXzsgX19tYWluX18uX19kaWN0X18iKSwgbiA9IGUucnVuUHl0aG9uSW50ZXJuYWwoImltcG9ydCBidWlsdGluczsgYnVpbHRpbnMuX19kaWN0X18iKTsKICB2YXIgYTsKICBlLmdsb2JhbHMgPSAoYSA9IG4sIG5ldyBQcm94eShyLCB7IGdldDogKHMsIGkpID0+IGkgPT09ICJnZXQiID8gKGMpID0+IHsKICAgIGxldCBwID0gcy5nZXQoYyk7CiAgICByZXR1cm4gcCA9PT0gdm9pZCAwICYmIChwID0gYS5nZXQoYykpLCBwOwogIH0gOiBpID09PSAiaGFzIiA/IChjKSA9PiBzLmhhcyhjKSB8fCBhLmhhcyhjKSA6IFJlZmxlY3QuZ2V0KHMsIGkpIH0pKTsKICBsZXQgbCA9IGUuX3B5b2RpZGUuX2ltcG9ydGhvb2s7CiAgbC5yZWdpc3Rlcl9qc19maW5kZXIoKSwgbC5yZWdpc3Rlcl9qc19tb2R1bGUoImpzIiwgdC5qc2dsb2JhbHMpOwogIGxldCB1ID0gZS5tYWtlUHVibGljQVBJKCk7CiAgcmV0dXJuIGwucmVnaXN0ZXJfanNfbW9kdWxlKCJweW9kaWRlX2pzIiwgdSksIGUucHlvZGlkZV9weSA9IG8oInB5b2RpZGUiKSwgZS5weW9kaWRlX2NvZGUgPSBvKCJweW9kaWRlLmNvZGUiKSwgZS5weW9kaWRlX2ZmaSA9IG8oInB5b2RpZGUuZmZpIiksIGUucGFja2FnZV9sb2FkZXIgPSBvKCJweW9kaWRlLl9wYWNrYWdlX2xvYWRlciIpLCBlLnNpdGVwYWNrYWdlcyA9IGUucGFja2FnZV9sb2FkZXIuU0lURV9QQUNLQUdFUy5fX3N0cl9fKCksIGUuZHNvZGlyID0gZS5wYWNrYWdlX2xvYWRlci5EU09fRElSLl9fc3RyX18oKSwgZS5kZWZhdWx0TGRMaWJyYXJ5UGF0aCA9IFtlLmRzb2RpciwgZS5zaXRlcGFja2FnZXNdLCBlLm9zLmVudmlyb24uX19zZXRpdGVtX18oIkxEX0xJQlJBUllfUEFUSCIsIGUuZGVmYXVsdExkTGlicmFyeVBhdGguam9pbigiOiIpKSwgdS5weW9kaWRlX3B5ID0gZS5weW9kaWRlX3B5LCB1Lmdsb2JhbHMgPSBlLmdsb2JhbHMsIHU7Cn0KYXN5bmMgZnVuY3Rpb24gYWUoZSA9IHt9KSB7CiAgYXdhaXQgYXN5bmMgZnVuY3Rpb24oKSB7CiAgICBpZiAoIUUgfHwgKHEgPSAoYXdhaXQgaW1wb3J0KCIuL19fdml0ZS1icm93c2VyLWV4dGVybmFsLTUwMDNkMjljLmpzIikpLmRlZmF1bHQsIHogPSBhd2FpdCBpbXBvcnQoIi4vX192aXRlLWJyb3dzZXItZXh0ZXJuYWwtNTAwM2QyOWMuanMiKSwgQyA9IGdsb2JhbFRoaXMuZmV0Y2ggPyBmZXRjaCA6IChhd2FpdCBpbXBvcnQoIi4vaW5kZXgtODM4NTQzNmYuanMiKSkuZGVmYXVsdCwgWCA9IChhd2FpdCBpbXBvcnQoIi4vX192aXRlLWJyb3dzZXItZXh0ZXJuYWwtNTAwM2QyOWMuanMiKSkuZGVmYXVsdCwgSSA9IGF3YWl0IGltcG9ydCgiLi9fX3ZpdGUtYnJvd3Nlci1leHRlcm5hbC01MDAzZDI5Yy5qcyIpLCBVID0gSS5zZXAsIHR5cGVvZiByZXF1aXJlIDwgInUiKSkKICAgICAgcmV0dXJuOwogICAgY29uc3QgYyA9IHsgZnM6IGF3YWl0IGltcG9ydCgiLi9fX3ZpdGUtYnJvd3Nlci1leHRlcm5hbC01MDAzZDI5Yy5qcyIpLCBjcnlwdG86IGF3YWl0IGltcG9ydCgiLi9fX3ZpdGUtYnJvd3Nlci1leHRlcm5hbC01MDAzZDI5Yy5qcyIpLCB3czogYXdhaXQgaW1wb3J0KCIuL19fdml0ZS1icm93c2VyLWV4dGVybmFsLTUwMDNkMjljLmpzIiksIGNoaWxkX3Byb2Nlc3M6IGF3YWl0IGltcG9ydCgiLi9fX3ZpdGUtYnJvd3Nlci1leHRlcm5hbC01MDAzZDI5Yy5qcyIpIH07CiAgICBnbG9iYWxUaGlzLnJlcXVpcmUgPSBmdW5jdGlvbihwKSB7CiAgICAgIHJldHVybiBjW3BdOwogICAgfTsKICB9KCk7CiAgbGV0IHQgPSBlLmluZGV4VVJMIHx8IGZ1bmN0aW9uKCkgewogICAgaWYgKHR5cGVvZiBfX2Rpcm5hbWUgPT0gInN0cmluZyIpCiAgICAgIHJldHVybiBfX2Rpcm5hbWU7CiAgICBsZXQgYzsKICAgIHRyeSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigpOwogICAgfSBjYXRjaCAoZCkgewogICAgICBjID0gZDsKICAgIH0KICAgIGxldCBwID0gZWUucGFyc2UoYylbMF0uZmlsZU5hbWU7CiAgICBjb25zdCBmID0gcC5sYXN0SW5kZXhPZihVKTsKICAgIGlmIChmID09PSAtMSkKICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZXh0cmFjdCBpbmRleFVSTCBwYXRoIGZyb20gcHlvZGlkZSBtb2R1bGUgbG9jYXRpb24iKTsKICAgIHJldHVybiBwLnNsaWNlKDAsIGYpOwogIH0oKTsKICB0ID0gSih0KSwgdC5lbmRzV2l0aCgiLyIpIHx8ICh0ICs9ICIvIiksIGUuaW5kZXhVUkwgPSB0OwogIGNvbnN0IG8gPSB7IGZ1bGxTdGRMaWI6ICExLCBqc2dsb2JhbHM6IGdsb2JhbFRoaXMsIHN0ZGluOiBnbG9iYWxUaGlzLnByb21wdCA/IGdsb2JhbFRoaXMucHJvbXB0IDogdm9pZCAwLCBob21lZGlyOiAiL2hvbWUvcHlvZGlkZSIsIGxvY2tGaWxlVVJMOiB0ICsgInJlcG9kYXRhLmpzb24iLCBhcmdzOiBbXSwgX25vZGVfbW91bnRzOiBbXSB9LCByID0gT2JqZWN0LmFzc2lnbihvLCBlKSwgbiA9IGZ1bmN0aW9uKCkgewogICAgbGV0IGMgPSB7IG5vSW1hZ2VEZWNvZGluZzogITAsIG5vQXVkaW9EZWNvZGluZzogITAsIG5vV2FzbURlY29kaW5nOiAhMSwgcHJlUnVuOiBbXSwgcXVpdDogKHAsIGYpID0+IHsKICAgICAgdGhyb3cgYy5leGl0ZWQgPSB7IHN0YXR1czogcCwgdG9UaHJvdzogZiB9LCBmOwogICAgfSB9OwogICAgcmV0dXJuIGM7CiAgfSgpOwogIG4ucHJpbnQgPSByLnN0ZG91dCwgbi5wcmludEVyciA9IHIuc3RkZXJyLCBuLmFyZ3VtZW50cyA9IHIuYXJnczsKICBjb25zdCBhID0geyBjb25maWc6IHIgfTsKICBuLkFQSSA9IGEsIG9lKG4sIHIpOwogIGNvbnN0IGwgPSBuZXcgUHJvbWlzZSgoYykgPT4gbi5wb3N0UnVuID0gYyk7CiAgaWYgKG4ubG9jYXRlRmlsZSA9IChjKSA9PiByLmluZGV4VVJMICsgYywgdHlwZW9mIF9jcmVhdGVQeW9kaWRlTW9kdWxlICE9ICJmdW5jdGlvbiIpIHsKICAgIGNvbnN0IGMgPSBgJHtyLmluZGV4VVJMfXB5b2RpZGUuYXNtLmpzYDsKICAgIGF3YWl0IE4oYyk7CiAgfQogIGlmIChhd2FpdCBfY3JlYXRlUHlvZGlkZU1vZHVsZShuKSwgYXdhaXQgbCwgbi5leGl0ZWQpCiAgICB0aHJvdyBuLmV4aXRlZC50b1Rocm93OwogIGlmIChhLnZlcnNpb24gIT09ICIwLjIzLjIiKQogICAgdGhyb3cgbmV3IEVycm9yKGBQeW9kaWRlIHZlcnNpb24gZG9lcyBub3QgbWF0Y2g6ICcwLjIzLjInIDw9PT4gJyR7YS52ZXJzaW9ufScuIElmIHlvdSB1cGRhdGVkIHRoZSBQeW9kaWRlIHZlcnNpb24sIG1ha2Ugc3VyZSB5b3UgYWxzbyB1cGRhdGVkIHRoZSAnaW5kZXhVUkwnIHBhcmFtZXRlciBwYXNzZWQgdG8gbG9hZFB5b2RpZGUuYCk7CiAgbi5sb2NhdGVGaWxlID0gKGMpID0+IHsKICAgIHRocm93IG5ldyBFcnJvcigiRGlkbid0IGV4cGVjdCB0byBsb2FkIGFueSBtb3JlIGZpbGVfcGFja2FnZXIgZmlsZXMhIik7CiAgfTsKICBsZXQgW3UsIHNdID0gYS5yYXdSdW4oImltcG9ydCBfcHlvZGlkZV9jb3JlIik7CiAgdSAmJiBuLkFQSS5mYXRhbF9sb2FkaW5nX2Vycm9yKGBGYWlsZWQgdG8gaW1wb3J0IF9weW9kaWRlX2NvcmUKYCwgcyk7CiAgY29uc3QgaSA9IGllKGEsIHIpOwogIGlmIChpLnZlcnNpb24uaW5jbHVkZXMoImRldiIpIHx8IGEuc2V0Q2RuVXJsKGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvcHlvZGlkZS92JHtpLnZlcnNpb259L2Z1bGwvYCksIGF3YWl0IGEucGFja2FnZUluZGV4UmVhZHksIGEuX3B5b2RpZGUuX2ltcG9ydGhvb2sucmVnaXN0ZXJfbW9kdWxlX25vdF9mb3VuZF9ob29rKGEuX2ltcG9ydF9uYW1lX3RvX3BhY2thZ2VfbmFtZSwgYS5yZXBvZGF0YV91bnZlbmRvcmVkX3N0ZGxpYnNfYW5kX3Rlc3QpLCBhLnJlcG9kYXRhX2luZm8udmVyc2lvbiAhPT0gIjAuMjMuMiIpCiAgICB0aHJvdyBuZXcgRXJyb3IoIkxvY2sgZmlsZSB2ZXJzaW9uIGRvZXNuJ3QgbWF0Y2ggUHlvZGlkZSB2ZXJzaW9uIik7CiAgcmV0dXJuIGEucGFja2FnZV9sb2FkZXIuaW5pdF9sb2FkZWRfcGFja2FnZXMoKSwgci5mdWxsU3RkTGliICYmIGF3YWl0IGkubG9hZFBhY2thZ2UoYS5yZXBvZGF0YV91bnZlbmRvcmVkX3N0ZGxpYnMpLCBhLmluaXRpYWxpemVTdHJlYW1zKHIuc3RkaW4sIHIuc3Rkb3V0LCByLnN0ZGVyciksIGk7Cn0KY29uc3Qgc2UgPSB7CiAgbG9hZFB5b2RpZGVPcHRpb25zOiB7CiAgICBpbmRleFVSTDogImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9weW9kaWRlL3YwLjIzLjIvZnVsbC8iCiAgfQp9Owp2YXIgY2UgPSBgIyBweXJpZ2h0OiByZXBvcnRNaXNzaW5nSW1wb3J0cz1mYWxzZQojIHR5cGU6IGlnbm9yZQoKIyBibGFjawppbXBvcnQgc3lzCmltcG9ydCBtaWNyb3BpcAppbXBvcnQgYXN5bmNpbwpzeXMubW9kdWxlc1siX211bHRpcHJvY2Vzc2luZyJdID0gb2JqZWN0Cgphd2FpdCBtaWNyb3BpcC5pbnN0YWxsKCJqZWRpIikKYXdhaXQgbWljcm9waXAuaW5zdGFsbCgiYmxhY2siKQoKaW1wb3J0IGplZGkKZnJvbSBibGFjayBpbXBvcnQgZm9ybWF0X3N0ciwgRmlsZU1vZGUKCgpkZWYgZ2V0X2F1dG9jb21wbGV0aW9uKGNvZGUsIGxpbmUsIGNvbHVtbik6CiAgICByZXN1bHQgPSBqZWRpLkludGVycHJldGVyKGNvZGUsIFtnbG9iYWxzKCksIGxvY2FscygpXSkKCiAgICBjb21wbGV0aW9ucyA9IHJlc3VsdC5jb21wbGV0ZShsaW5lLCBjb2x1bW4pCgogICAgbWF0Y2hlcyA9IFtdCiAgICBmb3IgY29tcCBpbiBjb21wbGV0aW9uczoKICAgICAgICBtYXRjaGVzLmFwcGVuZChkaWN0KAogICAgICAgICAgICBuYW1lPWNvbXAubmFtZSwKICAgICAgICAgICAgdHlwZT1jb21wLnR5cGUsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPWNvbXAuZGVzY3JpcHRpb24sCiAgICAgICAgICAgIGZ1bGxfbmFtZT1jb21wLmZ1bGxfbmFtZQogICAgICAgICkpCgogICAgcmV0dXJuIHsKICAgICAgICAibWF0Y2hlcyI6IG1hdGNoZXMKICAgIH0KCgphc3luYyBkZWYgaW5zdGFsbF9wYWNha2dlKHBhY2thZ2UpOgogICAgdHJ5OgogICAgICAgIGF3YWl0IG1pY3JvcGlwLmluc3RhbGwocGFja2FnZSwga2VlcF9nb2luZz1UcnVlKQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzdWNjZXNzIjogVHJ1ZQogICAgICAgIH0KICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3VjY2VzcyI6IEZhbHNlLAogICAgICAgICAgICAiZXJyb3IiOiBzdHIoZSkKICAgICAgICB9CgoKZGVmIGZvcm1hdF9jb2RlKGNvZGUsIG9wdGlvbnMpOgogICAgaWYgb3B0aW9uczoKICAgICAgICBtb2RlID0gRmlsZU1vZGUoKipvcHRpb25zKQogICAgICAgIHJldHVybiBmb3JtYXRfc3RyKGNvZGUsIG1vZGU9bW9kZSkKICAgIHJldHVybiBmb3JtYXRfc3RyKGNvZGUsIG1vZGU9RmlsZU1vZGUoKSkKYDsKZnVuY3Rpb24gbGUoZSwgdCwgbykgewogIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgdmFsdWU6IG8sCiAgICBlbnVtZXJhYmxlOiAhMCwKICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICB3cml0YWJsZTogITAKICB9KSA6IGVbdF0gPSBvLCBlOwp9CmZ1bmN0aW9uIEEoZSwgdCkgewogIHZhciBvID0gT2JqZWN0LmtleXMoZSk7CiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgIHZhciByID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgIHQgJiYgKHIgPSByLmZpbHRlcihmdW5jdGlvbihuKSB7CiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG4pLmVudW1lcmFibGU7CiAgICB9KSksIG8ucHVzaC5hcHBseShvLCByKTsKICB9CiAgcmV0dXJuIG87Cn0KZnVuY3Rpb24gSChlKSB7CiAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgIHZhciBvID0gYXJndW1lbnRzW3RdICE9IG51bGwgPyBhcmd1bWVudHNbdF0gOiB7fTsKICAgIHQgJSAyID8gQShPYmplY3QobyksICEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpIHsKICAgICAgbGUoZSwgciwgb1tyXSk7CiAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobykpIDogQShPYmplY3QobykpLmZvckVhY2goZnVuY3Rpb24ocikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLCByKSk7CiAgICB9KTsKICB9CiAgcmV0dXJuIGU7Cn0KZnVuY3Rpb24gdWUoKSB7CiAgZm9yICh2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsIHQgPSBuZXcgQXJyYXkoZSksIG8gPSAwOyBvIDwgZTsgbysrKQogICAgdFtvXSA9IGFyZ3VtZW50c1tvXTsKICByZXR1cm4gZnVuY3Rpb24ocikgewogICAgcmV0dXJuIHQucmVkdWNlUmlnaHQoZnVuY3Rpb24obiwgYSkgewogICAgICByZXR1cm4gYShuKTsKICAgIH0sIHIpOwogIH07Cn0KZnVuY3Rpb24gTyhlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uIHQoKSB7CiAgICBmb3IgKHZhciBvID0gdGhpcywgciA9IGFyZ3VtZW50cy5sZW5ndGgsIG4gPSBuZXcgQXJyYXkociksIGEgPSAwOyBhIDwgcjsgYSsrKQogICAgICBuW2FdID0gYXJndW1lbnRzW2FdOwogICAgcmV0dXJuIG4ubGVuZ3RoID49IGUubGVuZ3RoID8gZS5hcHBseSh0aGlzLCBuKSA6IGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciBsID0gYXJndW1lbnRzLmxlbmd0aCwgdSA9IG5ldyBBcnJheShsKSwgcyA9IDA7IHMgPCBsOyBzKyspCiAgICAgICAgdVtzXSA9IGFyZ3VtZW50c1tzXTsKICAgICAgcmV0dXJuIHQuYXBwbHkobywgW10uY29uY2F0KG4sIHUpKTsKICAgIH07CiAgfTsKfQpmdW5jdGlvbiB4KGUpIHsKICByZXR1cm4ge30udG9TdHJpbmcuY2FsbChlKS5pbmNsdWRlcygiT2JqZWN0Iik7Cn0KZnVuY3Rpb24gZGUoZSkgewogIHJldHVybiAhT2JqZWN0LmtleXMoZSkubGVuZ3RoOwp9CmZ1bmN0aW9uIFMoZSkgewogIHJldHVybiB0eXBlb2YgZSA9PSAiZnVuY3Rpb24iOwp9CmZ1bmN0aW9uIHBlKGUsIHQpIHsKICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHQpOwp9CmZ1bmN0aW9uIGZlKGUsIHQpIHsKICByZXR1cm4geCh0KSB8fCBfKCJjaGFuZ2VUeXBlIiksIE9iamVjdC5rZXlzKHQpLnNvbWUoZnVuY3Rpb24obykgewogICAgcmV0dXJuICFwZShlLCBvKTsKICB9KSAmJiBfKCJjaGFuZ2VGaWVsZCIpLCB0Owp9CmZ1bmN0aW9uIG1lKGUpIHsKICBTKGUpIHx8IF8oInNlbGVjdG9yVHlwZSIpOwp9CmZ1bmN0aW9uIHllKGUpIHsKICBTKGUpIHx8IHgoZSkgfHwgXygiaGFuZGxlclR5cGUiKSwgeChlKSAmJiBPYmplY3QudmFsdWVzKGUpLnNvbWUoZnVuY3Rpb24odCkgewogICAgcmV0dXJuICFTKHQpOwogIH0pICYmIF8oImhhbmRsZXJzVHlwZSIpOwp9CmZ1bmN0aW9uIGhlKGUpIHsKICBlIHx8IF8oImluaXRpYWxJc1JlcXVpcmVkIiksIHgoZSkgfHwgXygiaW5pdGlhbFR5cGUiKSwgZGUoZSkgJiYgXygiaW5pdGlhbENvbnRlbnQiKTsKfQpmdW5jdGlvbiBnZShlLCB0KSB7CiAgdGhyb3cgbmV3IEVycm9yKGVbdF0gfHwgZS5kZWZhdWx0KTsKfQp2YXIgd2UgPSB7CiAgaW5pdGlhbElzUmVxdWlyZWQ6ICJpbml0aWFsIHN0YXRlIGlzIHJlcXVpcmVkIiwKICBpbml0aWFsVHlwZTogImluaXRpYWwgc3RhdGUgc2hvdWxkIGJlIGFuIG9iamVjdCIsCiAgaW5pdGlhbENvbnRlbnQ6ICJpbml0aWFsIHN0YXRlIHNob3VsZG4ndCBiZSBhbiBlbXB0eSBvYmplY3QiLAogIGhhbmRsZXJUeXBlOiAiaGFuZGxlciBzaG91bGQgYmUgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24iLAogIGhhbmRsZXJzVHlwZTogImFsbCBoYW5kbGVycyBzaG91bGQgYmUgYSBmdW5jdGlvbnMiLAogIHNlbGVjdG9yVHlwZTogInNlbGVjdG9yIHNob3VsZCBiZSBhIGZ1bmN0aW9uIiwKICBjaGFuZ2VUeXBlOiAicHJvdmlkZWQgdmFsdWUgb2YgY2hhbmdlcyBzaG91bGQgYmUgYW4gb2JqZWN0IiwKICBjaGFuZ2VGaWVsZDogJ2l0IHNlYW1zIHlvdSB3YW50IHRvIGNoYW5nZSBhIGZpZWxkIGluIHRoZSBzdGF0ZSB3aGljaCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSAiaW5pdGlhbCIgc3RhdGUnLAogIGRlZmF1bHQ6ICJhbiB1bmtub3duIGVycm9yIGFjY3VyZWQgaW4gYHN0YXRlLWxvY2FsYCBwYWNrYWdlIgp9LCBfID0gTyhnZSkod2UpLCBMID0gewogIGNoYW5nZXM6IGZlLAogIHNlbGVjdG9yOiBtZSwKICBoYW5kbGVyOiB5ZSwKICBpbml0aWFsOiBoZQp9OwpmdW5jdGlvbiBfZShlKSB7CiAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogIEwuaW5pdGlhbChlKSwgTC5oYW5kbGVyKHQpOwogIHZhciBvID0gewogICAgY3VycmVudDogZQogIH0sIHIgPSBPKEVlKShvLCB0KSwgbiA9IE8odmUpKG8pLCBhID0gTyhMLmNoYW5nZXMpKGUpLCBsID0gTyhiZSkobyk7CiAgZnVuY3Rpb24gdSgpIHsKICAgIHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMF0gOiBmdW5jdGlvbihjKSB7CiAgICAgIHJldHVybiBjOwogICAgfTsKICAgIHJldHVybiBMLnNlbGVjdG9yKGkpLCBpKG8uY3VycmVudCk7CiAgfQogIGZ1bmN0aW9uIHMoaSkgewogICAgdWUociwgbiwgYSwgbCkoaSk7CiAgfQogIHJldHVybiBbdSwgc107Cn0KZnVuY3Rpb24gYmUoZSwgdCkgewogIHJldHVybiBTKHQpID8gdChlLmN1cnJlbnQpIDogdDsKfQpmdW5jdGlvbiB2ZShlLCB0KSB7CiAgcmV0dXJuIGUuY3VycmVudCA9IEgoSCh7fSwgZS5jdXJyZW50KSwgdCksIHQ7Cn0KZnVuY3Rpb24gRWUoZSwgdCwgbykgewogIHJldHVybiBTKHQpID8gdChlLmN1cnJlbnQpIDogT2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbihyKSB7CiAgICB2YXIgbjsKICAgIHJldHVybiAobiA9IHRbcl0pID09PSBudWxsIHx8IG4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG4uY2FsbCh0LCBlLmN1cnJlbnRbcl0pOwogIH0pLCBvOwp9CnZhciBPZSA9IHsKICBjcmVhdGU6IF9lCn0sIFcgPSAvKiBAX19QVVJFX18gKi8gKChlKSA9PiAoZVtlLlJFQURZID0gMF0gPSAiUkVBRFkiLCBlKSkoVyB8fCB7fSksIGggPSAvKiBAX19QVVJFX18gKi8gKChlKSA9PiAoZVtlLkVYRUMgPSAwXSA9ICJFWEVDIiwgZVtlLkNPTVBMRVRFID0gMV0gPSAiQ09NUExFVEUiLCBlW2UuSU5TVEFMTCA9IDJdID0gIklOU1RBTEwiLCBlW2UuRk9STUFUID0gM10gPSAiRk9STUFUIiwgZVtlLkpTX0ZOX0NBTEwgPSA0XSA9ICJKU19GTl9DQUxMIiwgZSkpKGggfHwge30pLCBZID0gLyogQF9fUFVSRV9fICovICgoZSkgPT4gKGUuRk4gPSAiX19mdW5jdGlvbl9fIiwgZSkpKFkgfHwge30pOwpjb25zdCBHID0gIndyYXBwZXIiOwpmdW5jdGlvbiB2KGUsIHQpIHsKICB2YXIgbjsKICBjb25zdCBvID0gKChuID0gZSA9PSBudWxsID8gdm9pZCAwIDogZS50b0pzKSA9PSBudWxsID8gdm9pZCAwIDogbi5jYWxsKGUsIHsKICAgIGRpY3RfY29udmVydGVyOiBPYmplY3QuZnJvbUVudHJpZXMsCiAgICBjcmVhdGVfcHlwcm94aWVzOiAhMQogIH0pKSB8fCBlLCByID0gbyBpbnN0YW5jZW9mIHQuZmZpLlB5UHJveHkgPyBvLnRvU3RyaW5nKCkgOiBvOwogIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcocikpIHsKICAgIGNvbnN0IGEgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocik7CiAgICByZXR1cm4gZS5nZXRCdWZmZXIoKS5yZWxlYXNlKCksIGE7CiAgfQogIHJldHVybiByOwp9CmNvbnN0IFQgPSAvRmlsZSAiPGV4ZWM+IiwgbGluZSAoXGQrKSgkfCwgaW4gPG1vZHVsZT4pJC9tLCBQID0gbmV3IFJlZ0V4cCgKICBgRmlsZSAiPGV4ZWM+IiwgbGluZSAoXFxkKyksIGluICR7R31gLAogICJtIgopLCBTZSA9IC9saW5lIChcZCspL2c7CmZ1bmN0aW9uIGooZSkgewogIHJldHVybiBlLnJlcGxhY2UoU2UsICh0LCBvKSA9PiBgbGluZSAkeytvIC0gMX1gKTsKfQpmdW5jdGlvbiBGZShlKSB7CiAgY29uc3QgdCA9IFQudGVzdChlKSwgbyA9IFAudGVzdChlKTsKICBpZiAoISh0IHx8IG8pKQogICAgcmV0dXJuIGU7CiAgY29uc3QgciA9IGUuc3BsaXQoYApgKSwgbiA9IHIuZmluZEluZGV4KAogICAgKGwpID0+IHQgPyBULnRlc3QobCkgOiBQLnRlc3QobCkKICApOwogIGxldCBhID0gITE7CiAgcmV0dXJuIHIuc2xpY2UobikucmVkdWNlKChsLCB1KSA9PiB7CiAgICBpZiAoYSkKICAgICAgbC5wdXNoKGoodSkpOwogICAgZWxzZSB7CiAgICAgIGlmICh0ICYmICFvICYmIFQudGVzdCh1KSkKICAgICAgICByZXR1cm4gYSA9ICEwLCBsLnB1c2goaih1KS5yZXBsYWNlKCIsIGluIDxtb2R1bGU+IiwgIiIpKSwgbDsKICAgICAgaWYgKG8gJiYgUC50ZXN0KHUpKQogICAgICAgIHJldHVybiBhID0gITAsIGwucHVzaChqKHUpLnJlcGxhY2UoYCwgaW4gJHtHfWAsICIiKSksIGw7CiAgICB9CiAgICByZXR1cm4gbDsKICB9LCBbXSkuam9pbihgCmApOwp9CmZ1bmN0aW9uIExlKGUsIHQsIG8pIHsKICByZXR1cm4geyAuLi5lLCBbdF06IG8gfTsKfQpjb25zdCBbRCwgTmVdID0gT2UuY3JlYXRlKHsKICBjYWxsYmFja3M6IHt9LAogIGNvbW1hbmRVbmlxdWVJZDogMAp9KTsKYXN5bmMgZnVuY3Rpb24geGUoKSB7CiAgY29uc3QgZSA9IGF3YWl0IGFlKHNlLmxvYWRQeW9kaWRlT3B0aW9ucyk7CiAgYXdhaXQgZS5sb2FkUGFja2FnZSgibWljcm9waXAiKSwgYXdhaXQgZS5ydW5QeXRob25Bc3luYyhjZSk7CiAgbGV0IHQ7CiAgc2VsZi5TaGFyZWRBcnJheUJ1ZmZlciAmJiAodCA9IG5ldyBVaW50OEFycmF5KG5ldyBzZWxmLlNoYXJlZEFycmF5QnVmZmVyKDEpKSwgZS5zZXRJbnRlcnJ1cHRCdWZmZXIodCkpLCBwb3N0TWVzc2FnZSh7CiAgICBzdGF0dXM6IFcuUkVBRFksCiAgICBpbnRlcnJ1cHRCdWZmZXI6IHQKICB9KTsKICBjb25zdCBvID0gewogICAgW2guRVhFQ106IGFzeW5jICh7IGNvZGU6IGEsIGNvbnRleHQ6IGwgPSB7fSB9KSA9PiB7CiAgICAgIGNvbnN0IHUgPSBbXTsKICAgICAgT2JqZWN0LmVudHJpZXMobCkuZm9yRWFjaCgoW3MsIGldKSA9PiB7CiAgICAgICAgKGkgPT0gbnVsbCA/IHZvaWQgMCA6IGkudHlwZSkgPT09IFkuRk4gPyBlLmdsb2JhbHMuc2V0KAogICAgICAgICAgcywKICAgICAgICAgIG4ocywgdSkKICAgICAgICApIDogZS5nbG9iYWxzLnNldChzLCBlLnRvUHkoaSkpOwogICAgICB9KTsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCBlLmxvYWRQYWNrYWdlc0Zyb21JbXBvcnRzKGEpLCBlLnJ1blB5dGhvbigiaW1wb3J0IHN5cywgaW87IHN5cy5zdGRvdXQgPSBpby5TdHJpbmdJTygpOyBzeXMuc3RkZXJyID0gaW8uU3RyaW5nSU8oKSIpOwogICAgICAgIGNvbnN0IHMgPSBhd2FpdCBlLnJ1blB5dGhvbkFzeW5jKGEpLCBpID0gZS5ydW5QeXRob24oImltcG9ydCBzeXM7IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKSIpLnRyaW0oKSwgYyA9IGUucnVuUHl0aG9uKCJpbXBvcnQgc3lzOyBzeXMuc3RkZXJyLmdldHZhbHVlKCkiKS50cmltKCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJlc3VsdDogdihzLCBlKSwKICAgICAgICAgIHN0ZG91dDogdihpLCBlKSwKICAgICAgICAgIHN0ZGVycjogYywKICAgICAgICAgIGVycm9yOiBudWxsCiAgICAgICAgfTsKICAgICAgfSBjYXRjaCAocykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICByZXN1bHQ6IG51bGwsCiAgICAgICAgICBzdGRvdXQ6IG51bGwsCiAgICAgICAgICBzdGRlcnI6IG51bGwsCiAgICAgICAgICBlcnJvcjogRmUocy5tZXNzYWdlKQogICAgICAgIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHMgfSA9IEQoKTsKICAgICAgICBPYmplY3QuZW50cmllcyhsKS5mb3JFYWNoKChbaV0pID0+IHsKICAgICAgICAgIHZhciBjOwogICAgICAgICAgZS5nbG9iYWxzLnNldChpLCAoYyA9IGUudG9QeShudWxsKSkgPT0gbnVsbCA/IHZvaWQgMCA6IGMudG9TdHJpbmcoKSk7CiAgICAgICAgfSksIHUuZm9yRWFjaCgoaSkgPT4gewogICAgICAgICAgZGVsZXRlIHNbaV07CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICBbaC5DT01QTEVURV06IGFzeW5jICh7CiAgICAgIGNvZGU6IGEsCiAgICAgIGxpbmU6IGwsCiAgICAgIGNvbHVtbjogdQogICAgfSkgPT4gewogICAgICBhd2FpdCBlLmxvYWRQYWNrYWdlc0Zyb21JbXBvcnRzKGEpOwogICAgICBjb25zdCBzID0gZS5nbG9iYWxzLmdldCgiZ2V0X2F1dG9jb21wbGV0aW9uIikoYSwgbCwgdSk7CiAgICAgIHJldHVybiB7IHJlc3VsdDogdihzLCBlKSwgZXJyb3I6IG51bGwgfTsKICAgIH0sCiAgICBbaC5JTlNUQUxMXTogYXN5bmMgKHsgcGFja2FnZXM6IGEgfSkgPT4gewogICAgICBjb25zdCBsID0gYXdhaXQgZS5nbG9iYWxzLmdldCgiaW5zdGFsbF9wYWNha2dlIikoYVswXSk7CiAgICAgIHJldHVybiB2KGwsIGUpOwogICAgfSwKICAgIFtoLkZPUk1BVF06IGFzeW5jICh7CiAgICAgIGNvZGU6IGEsCiAgICAgIG9wdGlvbnM6IGwgPSB7fQogICAgfSkgPT4gewogICAgICBjb25zdCB1ID0gZS5nbG9iYWxzLmdldCgiZm9ybWF0X2NvZGUiKShhLCBlLnRvUHkobCkpOwogICAgICByZXR1cm4geyByZXN1bHQ6IHYodSwgZSksIGVycm9yOiBudWxsIH07CiAgICB9CiAgfTsKICBvbm1lc3NhZ2UgPSBhc3luYyBmdW5jdGlvbihsKSB7CiAgICBjb25zdCB7IGlkOiB1LCBhY3Rpb246IHMgPSBoLkVYRUMsIGRhdGE6IGkgfSA9IGwuZGF0YTsKICAgIGlmIChzID09PSBoLkpTX0ZOX0NBTEwpCiAgICAgIHIoaSwgdSk7CiAgICBlbHNlIHsKICAgICAgbGV0IGM7CiAgICAgIHN3aXRjaCAocykgewogICAgICAgIGNhc2UgaC5FWEVDOgogICAgICAgICAgYyA9IGF3YWl0IG9baC5FWEVDXShpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgaC5DT01QTEVURToKICAgICAgICAgIGMgPSBhd2FpdCBvW2guQ09NUExFVEVdKGkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBoLklOU1RBTEw6CiAgICAgICAgICBjID0gYXdhaXQgb1toLklOU1RBTExdKGkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBoLkZPUk1BVDoKICAgICAgICAgIGMgPSBhd2FpdCBvW2guRk9STUFUXShpKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICBkYXRhOiBjLAogICAgICAgIGlkOiB1LAogICAgICAgIGFjdGlvbjogcwogICAgICB9KTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIHIoYSwgbCkgewogICAgY29uc3QgeyByZXN1bHQ6IHUsIGVycm9yOiBzIH0gPSBhLCB7IGNhbGxiYWNrczogaSB9ID0gRCgpOwogICAgcyAmJiBpW2xdLnJlamVjdChzKSwgaVtsXS5yZXNvbHZlKHUpOwogIH0KICBmdW5jdGlvbiBuKGEsIGwpIHsKICAgIHJldHVybiBhc3luYyAoLi4udSkgPT4gbmV3IFByb21pc2UoKHMsIGkpID0+IHsKICAgICAgY29uc3QgeyBjYWxsYmFja3M6IGMsIGNvbW1hbmRVbmlxdWVJZDogcCB9ID0gRCgpOwogICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgYWN0aW9uOiBoLkpTX0ZOX0NBTEwsCiAgICAgICAgZGF0YTogewogICAgICAgICAgYXJnczogdSwKICAgICAgICAgIG5hbWU6IGEKICAgICAgICB9LAogICAgICAgIGlkOiBwCiAgICAgIH0pLCBsLnB1c2gocCksIE5lKHsKICAgICAgICBjYWxsYmFja3M6IExlKGMsIHAsIHsKICAgICAgICAgIHJlc29sdmU6IHMsCiAgICAgICAgICByZWplY3Q6IGkKICAgICAgICB9KSwKICAgICAgICBjb21tYW5kVW5pcXVlSWQ6IHAgKyAxCiAgICAgIH0pOwogICAgfSk7CiAgfQp9CnhlKCk7Cg==",h=typeof window<"u"&&window.Blob&&new Blob([atob(w)],{type:"text/javascript;charset=utf-8"});function E(){const I=h&&(window.URL||window.webkitURL).createObjectURL(h);try{return I?new Worker(I):new Worker("data:application/javascript;base64,"+w,{type:"module"})}finally{I&&(window.URL||window.webkitURL).revokeObjectURL(I)}}const q=Boolean(globalThis.Worker),[c,K]=f.create({config:O,pyodideWorker:null,callbacks:{},commandUniqueId:0,jsFunctions:{},interruptBuffer:null}),n={async ensureWorkerIsSetup(){const{pyodideWorker:I}=c();I||await e()},async command(I,g,C){await n.ensureWorkerIsSetup();const{commandUniqueId:A,pyodideWorker:i,interruptBuffer:l}=c();l&&(l[0]=0),C||K({commandUniqueId:A+1}),i==null||i.postMessage({data:I,id:C??A,action:g})}},e=P(function(){return new Promise((g,C)=>{q||C(new Error(`your browser does
t support web workers!`));const A=new E;A.onmessage=function(l){var G;((G=l.data)==null?void 0:G.status)===a.READY?(K({pyodideWorker:A,interruptBuffer:l.data.interruptBuffer}),A.onmessage=function(Z){const{action:B,id:X,data:k}=Z.data;switch(B){case m.JS_FN_CALL:iI(X,k);break;default:AI(X,k);break}},g(A)):C(new Error("unexpected error in setup process"))},A.onerror=function(l){C(l.message)}})});async function _(I){return new Promise((g,C)=>{const{callbacks:A,commandUniqueId:i}=c();n.command(bI(I),m.EXEC),K({callbacks:p(A,i,{resolve:g,reject:C})})})}const $={async repl(I){return new Promise((g,C)=>{const{commandUniqueId:A,callbacks:i}=c(),{code:l,line:G,column:d}=I;let Z=G,B=d;G||(Z=l.split(`
`).length),B||(B=l.split(`
`)[Z-1].length),n.command({code:l,line:Z,column:B},m.COMPLETE),K({callbacks:p(i,A,{resolve:g,reject:C})})})}};async function II(I){return new Promise((g,C)=>{const{callbacks:A,commandUniqueId:i}=c();n.command({packages:I},m.INSTALL),K({callbacks:p(A,i,{resolve:g,reject:C})})})}async function gI(I){return new Promise((g,C)=>{const{callbacks:A,commandUniqueId:i}=c();n.command(I,m.FORMAT),K({callbacks:p(A,i,{resolve:g,reject:C})})})}function CI(){const{interruptBuffer:I}=c();if(!globalThis.SharedArrayBuffer)throw new Error(`
\`.interrupt\` method uses SharedArrayBuffer which requires "cross-origin-isolation" to be enabled.
To enable "cross-origin-isolation" check this article - https://web.dev/cross-origin-isolation-guide/#enable-cross-origin-isolation
`);I&&(I[0]=2)}function AI(I,g){const{callbacks:C}=B();P(I,Boolean(C[I]));const{resolve:A,reject:i}=C[I];if(K({callbacks:x(C,I)}),g.error){i==null||i(g.error);return}A(g)}async function iI(I,{args:g,name:C}){var Z;const{jsFunctions:A}=B();let i,l;try{i=await((Z=A[C])==null?void 0:Z.call(A,...g))}catch(d){l=d}n.command({result:i,error:l},m.JS_FN_CALL,I)}function lI(I){const{jsFunctions:g}=B();return Object.entries(I).reduce((C,[A,i])=>(typeof i=="function"?(C[A]={type:Y.FN,name:i.name},K({jsFunctions:D(g,i.name,i)})):C[A]=i,C),{})}function bI(I){return I.context?{...I,context:lI(I.context)}:I}b.ActionType=m,b.ChannelSetupStatus=V,b.PayloadType=Y,b.complete=$,b.exec=_,b.format=gI,b.init=e,b.install=II,b.interrupt=CI,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})});
`);I&&(I[0]=2)}function AI(I,g){const{callbacks:C}=c();D(I,Boolean(C[I]));const{resolve:A,reject:i}=C[I];if(K({callbacks:M(C,I)}),g.error){i==null||i(g.error);return}A(g)}async function iI(I,{args:g,name:C}){var G;const{jsFunctions:A}=c();let i,l;try{i=await((G=A[C])==null?void 0:G.call(A,...g))}catch(d){l=d}n.command({result:i,error:l},m.JS_FN_CALL,I)}function lI(I){const{jsFunctions:g}=c();return Object.entries(I).reduce((C,[A,i])=>(typeof i=="function"?(C[A]={type:Y.FN,name:i.name},K({jsFunctions:x(g,i.name,i)})):C[A]=i,C),{})}function bI(I){return I.context?{...I,context:lI(I.context)}:I}b.ActionType=m,b.ChannelSetupStatus=a,b.PayloadType=Y,b.complete=$,b.exec=_,b.format=gI,b.init=e,b.install=II,b.interrupt=CI,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})});
{
"name": "@x-python/core",
"version": "0.0.8",
"version": "0.0.9",
"type": "module",

@@ -54,3 +54,3 @@ "license": "MIT",

"dependencies": {
"pyodide": "^0.23.0",
"pyodide": "^0.23.2",
"state-local": "^1.0.7"

@@ -57,0 +57,0 @@ },

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc