18298 lines
2.1 MiB
18298 lines
2.1 MiB
// @bun
|
|
var __create = Object.create;
|
|
var __getProtoOf = Object.getPrototypeOf;
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __toESM = (mod, isNodeMode, target) => {
|
|
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
for (let key of __getOwnPropNames(mod))
|
|
if (!__hasOwnProp.call(to, key))
|
|
__defProp(to, key, {
|
|
get: () => mod[key],
|
|
enumerable: true
|
|
});
|
|
return to;
|
|
};
|
|
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
var __require = import.meta.require;
|
|
|
|
// ../eve/node_modules/safe-buffer/index.js
|
|
var require_safe_buffer = __commonJS((exports, module) => {
|
|
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
|
var buffer = __require("buffer");
|
|
var Buffer2 = buffer.Buffer;
|
|
function copyProps(src, dst) {
|
|
for (var key in src) {
|
|
dst[key] = src[key];
|
|
}
|
|
}
|
|
if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) {
|
|
module.exports = buffer;
|
|
} else {
|
|
copyProps(buffer, exports);
|
|
exports.Buffer = SafeBuffer;
|
|
}
|
|
function SafeBuffer(arg, encodingOrOffset, length) {
|
|
return Buffer2(arg, encodingOrOffset, length);
|
|
}
|
|
SafeBuffer.prototype = Object.create(Buffer2.prototype);
|
|
copyProps(Buffer2, SafeBuffer);
|
|
SafeBuffer.from = function(arg, encodingOrOffset, length) {
|
|
if (typeof arg === "number") {
|
|
throw new TypeError("Argument must not be a number");
|
|
}
|
|
return Buffer2(arg, encodingOrOffset, length);
|
|
};
|
|
SafeBuffer.alloc = function(size, fill, encoding) {
|
|
if (typeof size !== "number") {
|
|
throw new TypeError("Argument must be a number");
|
|
}
|
|
var buf = Buffer2(size);
|
|
if (fill !== undefined) {
|
|
if (typeof encoding === "string") {
|
|
buf.fill(fill, encoding);
|
|
} else {
|
|
buf.fill(fill);
|
|
}
|
|
} else {
|
|
buf.fill(0);
|
|
}
|
|
return buf;
|
|
};
|
|
SafeBuffer.allocUnsafe = function(size) {
|
|
if (typeof size !== "number") {
|
|
throw new TypeError("Argument must be a number");
|
|
}
|
|
return Buffer2(size);
|
|
};
|
|
SafeBuffer.allocUnsafeSlow = function(size) {
|
|
if (typeof size !== "number") {
|
|
throw new TypeError("Argument must be a number");
|
|
}
|
|
return buffer.SlowBuffer(size);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jws/lib/data-stream.js
|
|
var require_data_stream = __commonJS((exports, module) => {
|
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
var Stream = __require("stream");
|
|
var util = __require("util");
|
|
function DataStream(data) {
|
|
this.buffer = null;
|
|
this.writable = true;
|
|
this.readable = true;
|
|
if (!data) {
|
|
this.buffer = Buffer2.alloc(0);
|
|
return this;
|
|
}
|
|
if (typeof data.pipe === "function") {
|
|
this.buffer = Buffer2.alloc(0);
|
|
data.pipe(this);
|
|
return this;
|
|
}
|
|
if (data.length || typeof data === "object") {
|
|
this.buffer = data;
|
|
this.writable = false;
|
|
process.nextTick(function() {
|
|
this.emit("end", data);
|
|
this.readable = false;
|
|
this.emit("close");
|
|
}.bind(this));
|
|
return this;
|
|
}
|
|
throw new TypeError("Unexpected data type (" + typeof data + ")");
|
|
}
|
|
util.inherits(DataStream, Stream);
|
|
DataStream.prototype.write = function write(data) {
|
|
this.buffer = Buffer2.concat([this.buffer, Buffer2.from(data)]);
|
|
this.emit("data", data);
|
|
};
|
|
DataStream.prototype.end = function end(data) {
|
|
if (data)
|
|
this.write(data);
|
|
this.emit("end", data);
|
|
this.emit("close");
|
|
this.writable = false;
|
|
this.readable = false;
|
|
};
|
|
module.exports = DataStream;
|
|
});
|
|
|
|
// ../eve/node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js
|
|
var require_param_bytes_for_alg = __commonJS((exports, module) => {
|
|
function getParamSize(keySize) {
|
|
var result = (keySize / 8 | 0) + (keySize % 8 === 0 ? 0 : 1);
|
|
return result;
|
|
}
|
|
var paramBytesForAlg = {
|
|
ES256: getParamSize(256),
|
|
ES384: getParamSize(384),
|
|
ES512: getParamSize(521)
|
|
};
|
|
function getParamBytesForAlg(alg) {
|
|
var paramBytes = paramBytesForAlg[alg];
|
|
if (paramBytes) {
|
|
return paramBytes;
|
|
}
|
|
throw new Error('Unknown algorithm "' + alg + '"');
|
|
}
|
|
module.exports = getParamBytesForAlg;
|
|
});
|
|
|
|
// ../eve/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js
|
|
var require_ecdsa_sig_formatter = __commonJS((exports, module) => {
|
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
var getParamBytesForAlg = require_param_bytes_for_alg();
|
|
var MAX_OCTET = 128;
|
|
var CLASS_UNIVERSAL = 0;
|
|
var PRIMITIVE_BIT = 32;
|
|
var TAG_SEQ = 16;
|
|
var TAG_INT = 2;
|
|
var ENCODED_TAG_SEQ = TAG_SEQ | PRIMITIVE_BIT | CLASS_UNIVERSAL << 6;
|
|
var ENCODED_TAG_INT = TAG_INT | CLASS_UNIVERSAL << 6;
|
|
function base64Url(base64) {
|
|
return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
}
|
|
function signatureAsBuffer(signature) {
|
|
if (Buffer2.isBuffer(signature)) {
|
|
return signature;
|
|
} else if (typeof signature === "string") {
|
|
return Buffer2.from(signature, "base64");
|
|
}
|
|
throw new TypeError("ECDSA signature must be a Base64 string or a Buffer");
|
|
}
|
|
function derToJose(signature, alg) {
|
|
signature = signatureAsBuffer(signature);
|
|
var paramBytes = getParamBytesForAlg(alg);
|
|
var maxEncodedParamLength = paramBytes + 1;
|
|
var inputLength = signature.length;
|
|
var offset = 0;
|
|
if (signature[offset++] !== ENCODED_TAG_SEQ) {
|
|
throw new Error('Could not find expected "seq"');
|
|
}
|
|
var seqLength = signature[offset++];
|
|
if (seqLength === (MAX_OCTET | 1)) {
|
|
seqLength = signature[offset++];
|
|
}
|
|
if (inputLength - offset < seqLength) {
|
|
throw new Error('"seq" specified length of "' + seqLength + '", only "' + (inputLength - offset) + '" remaining');
|
|
}
|
|
if (signature[offset++] !== ENCODED_TAG_INT) {
|
|
throw new Error('Could not find expected "int" for "r"');
|
|
}
|
|
var rLength = signature[offset++];
|
|
if (inputLength - offset - 2 < rLength) {
|
|
throw new Error('"r" specified length of "' + rLength + '", only "' + (inputLength - offset - 2) + '" available');
|
|
}
|
|
if (maxEncodedParamLength < rLength) {
|
|
throw new Error('"r" specified length of "' + rLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
|
|
}
|
|
var rOffset = offset;
|
|
offset += rLength;
|
|
if (signature[offset++] !== ENCODED_TAG_INT) {
|
|
throw new Error('Could not find expected "int" for "s"');
|
|
}
|
|
var sLength = signature[offset++];
|
|
if (inputLength - offset !== sLength) {
|
|
throw new Error('"s" specified length of "' + sLength + '", expected "' + (inputLength - offset) + '"');
|
|
}
|
|
if (maxEncodedParamLength < sLength) {
|
|
throw new Error('"s" specified length of "' + sLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
|
|
}
|
|
var sOffset = offset;
|
|
offset += sLength;
|
|
if (offset !== inputLength) {
|
|
throw new Error('Expected to consume entire buffer, but "' + (inputLength - offset) + '" bytes remain');
|
|
}
|
|
var rPadding = paramBytes - rLength, sPadding = paramBytes - sLength;
|
|
var dst = Buffer2.allocUnsafe(rPadding + rLength + sPadding + sLength);
|
|
for (offset = 0;offset < rPadding; ++offset) {
|
|
dst[offset] = 0;
|
|
}
|
|
signature.copy(dst, offset, rOffset + Math.max(-rPadding, 0), rOffset + rLength);
|
|
offset = paramBytes;
|
|
for (var o = offset;offset < o + sPadding; ++offset) {
|
|
dst[offset] = 0;
|
|
}
|
|
signature.copy(dst, offset, sOffset + Math.max(-sPadding, 0), sOffset + sLength);
|
|
dst = dst.toString("base64");
|
|
dst = base64Url(dst);
|
|
return dst;
|
|
}
|
|
function countPadding(buf, start, stop) {
|
|
var padding = 0;
|
|
while (start + padding < stop && buf[start + padding] === 0) {
|
|
++padding;
|
|
}
|
|
var needsSign = buf[start + padding] >= MAX_OCTET;
|
|
if (needsSign) {
|
|
--padding;
|
|
}
|
|
return padding;
|
|
}
|
|
function joseToDer(signature, alg) {
|
|
signature = signatureAsBuffer(signature);
|
|
var paramBytes = getParamBytesForAlg(alg);
|
|
var signatureBytes = signature.length;
|
|
if (signatureBytes !== paramBytes * 2) {
|
|
throw new TypeError('"' + alg + '" signatures must be "' + paramBytes * 2 + '" bytes, saw "' + signatureBytes + '"');
|
|
}
|
|
var rPadding = countPadding(signature, 0, paramBytes);
|
|
var sPadding = countPadding(signature, paramBytes, signature.length);
|
|
var rLength = paramBytes - rPadding;
|
|
var sLength = paramBytes - sPadding;
|
|
var rsBytes = 1 + 1 + rLength + 1 + 1 + sLength;
|
|
var shortLength = rsBytes < MAX_OCTET;
|
|
var dst = Buffer2.allocUnsafe((shortLength ? 2 : 3) + rsBytes);
|
|
var offset = 0;
|
|
dst[offset++] = ENCODED_TAG_SEQ;
|
|
if (shortLength) {
|
|
dst[offset++] = rsBytes;
|
|
} else {
|
|
dst[offset++] = MAX_OCTET | 1;
|
|
dst[offset++] = rsBytes & 255;
|
|
}
|
|
dst[offset++] = ENCODED_TAG_INT;
|
|
dst[offset++] = rLength;
|
|
if (rPadding < 0) {
|
|
dst[offset++] = 0;
|
|
offset += signature.copy(dst, offset, 0, paramBytes);
|
|
} else {
|
|
offset += signature.copy(dst, offset, rPadding, paramBytes);
|
|
}
|
|
dst[offset++] = ENCODED_TAG_INT;
|
|
dst[offset++] = sLength;
|
|
if (sPadding < 0) {
|
|
dst[offset++] = 0;
|
|
signature.copy(dst, offset, paramBytes);
|
|
} else {
|
|
signature.copy(dst, offset, paramBytes + sPadding);
|
|
}
|
|
return dst;
|
|
}
|
|
module.exports = {
|
|
derToJose,
|
|
joseToDer
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/buffer-equal-constant-time/index.js
|
|
var require_buffer_equal_constant_time = __commonJS((exports, module) => {
|
|
var Buffer2 = __require("buffer").Buffer;
|
|
var SlowBuffer = __require("buffer").SlowBuffer;
|
|
module.exports = bufferEq;
|
|
function bufferEq(a, b) {
|
|
if (!Buffer2.isBuffer(a) || !Buffer2.isBuffer(b)) {
|
|
return false;
|
|
}
|
|
if (a.length !== b.length) {
|
|
return false;
|
|
}
|
|
var c = 0;
|
|
for (var i = 0;i < a.length; i++) {
|
|
c |= a[i] ^ b[i];
|
|
}
|
|
return c === 0;
|
|
}
|
|
bufferEq.install = function() {
|
|
Buffer2.prototype.equal = SlowBuffer.prototype.equal = function equal(that) {
|
|
return bufferEq(this, that);
|
|
};
|
|
};
|
|
var origBufEqual = Buffer2.prototype.equal;
|
|
var origSlowBufEqual = SlowBuffer.prototype.equal;
|
|
bufferEq.restore = function() {
|
|
Buffer2.prototype.equal = origBufEqual;
|
|
SlowBuffer.prototype.equal = origSlowBufEqual;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jwa/index.js
|
|
var require_jwa = __commonJS((exports, module) => {
|
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
var crypto2 = __require("crypto");
|
|
var formatEcdsa = require_ecdsa_sig_formatter();
|
|
var util = __require("util");
|
|
var MSG_INVALID_ALGORITHM = `"%s" is not a valid algorithm.
|
|
Supported algorithms are:
|
|
"HS256", "HS384", "HS512", "RS256", "RS384", "RS512", "PS256", "PS384", "PS512", "ES256", "ES384", "ES512" and "none".`;
|
|
var MSG_INVALID_SECRET = "secret must be a string or buffer";
|
|
var MSG_INVALID_VERIFIER_KEY = "key must be a string or a buffer";
|
|
var MSG_INVALID_SIGNER_KEY = "key must be a string, a buffer or an object";
|
|
var supportsKeyObjects = typeof crypto2.createPublicKey === "function";
|
|
if (supportsKeyObjects) {
|
|
MSG_INVALID_VERIFIER_KEY += " or a KeyObject";
|
|
MSG_INVALID_SECRET += "or a KeyObject";
|
|
}
|
|
function checkIsPublicKey(key) {
|
|
if (Buffer2.isBuffer(key)) {
|
|
return;
|
|
}
|
|
if (typeof key === "string") {
|
|
return;
|
|
}
|
|
if (!supportsKeyObjects) {
|
|
throw typeError(MSG_INVALID_VERIFIER_KEY);
|
|
}
|
|
if (typeof key !== "object") {
|
|
throw typeError(MSG_INVALID_VERIFIER_KEY);
|
|
}
|
|
if (typeof key.type !== "string") {
|
|
throw typeError(MSG_INVALID_VERIFIER_KEY);
|
|
}
|
|
if (typeof key.asymmetricKeyType !== "string") {
|
|
throw typeError(MSG_INVALID_VERIFIER_KEY);
|
|
}
|
|
if (typeof key.export !== "function") {
|
|
throw typeError(MSG_INVALID_VERIFIER_KEY);
|
|
}
|
|
}
|
|
function checkIsPrivateKey(key) {
|
|
if (Buffer2.isBuffer(key)) {
|
|
return;
|
|
}
|
|
if (typeof key === "string") {
|
|
return;
|
|
}
|
|
if (typeof key === "object") {
|
|
return;
|
|
}
|
|
throw typeError(MSG_INVALID_SIGNER_KEY);
|
|
}
|
|
function checkIsSecretKey(key) {
|
|
if (Buffer2.isBuffer(key)) {
|
|
return;
|
|
}
|
|
if (typeof key === "string") {
|
|
return key;
|
|
}
|
|
if (!supportsKeyObjects) {
|
|
throw typeError(MSG_INVALID_SECRET);
|
|
}
|
|
if (typeof key !== "object") {
|
|
throw typeError(MSG_INVALID_SECRET);
|
|
}
|
|
if (key.type !== "secret") {
|
|
throw typeError(MSG_INVALID_SECRET);
|
|
}
|
|
if (typeof key.export !== "function") {
|
|
throw typeError(MSG_INVALID_SECRET);
|
|
}
|
|
}
|
|
function fromBase64(base64) {
|
|
return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
}
|
|
function toBase64(base64url) {
|
|
base64url = base64url.toString();
|
|
var padding = 4 - base64url.length % 4;
|
|
if (padding !== 4) {
|
|
for (var i = 0;i < padding; ++i) {
|
|
base64url += "=";
|
|
}
|
|
}
|
|
return base64url.replace(/\-/g, "+").replace(/_/g, "/");
|
|
}
|
|
function typeError(template) {
|
|
var args = [].slice.call(arguments, 1);
|
|
var errMsg = util.format.bind(util, template).apply(null, args);
|
|
return new TypeError(errMsg);
|
|
}
|
|
function bufferOrString(obj) {
|
|
return Buffer2.isBuffer(obj) || typeof obj === "string";
|
|
}
|
|
function normalizeInput(thing) {
|
|
if (!bufferOrString(thing))
|
|
thing = JSON.stringify(thing);
|
|
return thing;
|
|
}
|
|
function createHmacSigner(bits) {
|
|
return function sign(thing, secret) {
|
|
checkIsSecretKey(secret);
|
|
thing = normalizeInput(thing);
|
|
var hmac = crypto2.createHmac("sha" + bits, secret);
|
|
var sig = (hmac.update(thing), hmac.digest("base64"));
|
|
return fromBase64(sig);
|
|
};
|
|
}
|
|
var bufferEqual;
|
|
var timingSafeEqual = "timingSafeEqual" in crypto2 ? function timingSafeEqual(a, b) {
|
|
if (a.byteLength !== b.byteLength) {
|
|
return false;
|
|
}
|
|
return crypto2.timingSafeEqual(a, b);
|
|
} : function timingSafeEqual(a, b) {
|
|
if (!bufferEqual) {
|
|
bufferEqual = require_buffer_equal_constant_time();
|
|
}
|
|
return bufferEqual(a, b);
|
|
};
|
|
function createHmacVerifier(bits) {
|
|
return function verify(thing, signature, secret) {
|
|
var computedSig = createHmacSigner(bits)(thing, secret);
|
|
return timingSafeEqual(Buffer2.from(signature), Buffer2.from(computedSig));
|
|
};
|
|
}
|
|
function createKeySigner(bits) {
|
|
return function sign(thing, privateKey) {
|
|
checkIsPrivateKey(privateKey);
|
|
thing = normalizeInput(thing);
|
|
var signer = crypto2.createSign("RSA-SHA" + bits);
|
|
var sig = (signer.update(thing), signer.sign(privateKey, "base64"));
|
|
return fromBase64(sig);
|
|
};
|
|
}
|
|
function createKeyVerifier(bits) {
|
|
return function verify(thing, signature, publicKey) {
|
|
checkIsPublicKey(publicKey);
|
|
thing = normalizeInput(thing);
|
|
signature = toBase64(signature);
|
|
var verifier = crypto2.createVerify("RSA-SHA" + bits);
|
|
verifier.update(thing);
|
|
return verifier.verify(publicKey, signature, "base64");
|
|
};
|
|
}
|
|
function createPSSKeySigner(bits) {
|
|
return function sign(thing, privateKey) {
|
|
checkIsPrivateKey(privateKey);
|
|
thing = normalizeInput(thing);
|
|
var signer = crypto2.createSign("RSA-SHA" + bits);
|
|
var sig = (signer.update(thing), signer.sign({
|
|
key: privateKey,
|
|
padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
|
|
saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
|
|
}, "base64"));
|
|
return fromBase64(sig);
|
|
};
|
|
}
|
|
function createPSSKeyVerifier(bits) {
|
|
return function verify(thing, signature, publicKey) {
|
|
checkIsPublicKey(publicKey);
|
|
thing = normalizeInput(thing);
|
|
signature = toBase64(signature);
|
|
var verifier = crypto2.createVerify("RSA-SHA" + bits);
|
|
verifier.update(thing);
|
|
return verifier.verify({
|
|
key: publicKey,
|
|
padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
|
|
saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
|
|
}, signature, "base64");
|
|
};
|
|
}
|
|
function createECDSASigner(bits) {
|
|
var inner = createKeySigner(bits);
|
|
return function sign() {
|
|
var signature = inner.apply(null, arguments);
|
|
signature = formatEcdsa.derToJose(signature, "ES" + bits);
|
|
return signature;
|
|
};
|
|
}
|
|
function createECDSAVerifer(bits) {
|
|
var inner = createKeyVerifier(bits);
|
|
return function verify(thing, signature, publicKey) {
|
|
signature = formatEcdsa.joseToDer(signature, "ES" + bits).toString("base64");
|
|
var result = inner(thing, signature, publicKey);
|
|
return result;
|
|
};
|
|
}
|
|
function createNoneSigner() {
|
|
return function sign() {
|
|
return "";
|
|
};
|
|
}
|
|
function createNoneVerifier() {
|
|
return function verify(thing, signature) {
|
|
return signature === "";
|
|
};
|
|
}
|
|
module.exports = function jwa(algorithm) {
|
|
var signerFactories = {
|
|
hs: createHmacSigner,
|
|
rs: createKeySigner,
|
|
ps: createPSSKeySigner,
|
|
es: createECDSASigner,
|
|
none: createNoneSigner
|
|
};
|
|
var verifierFactories = {
|
|
hs: createHmacVerifier,
|
|
rs: createKeyVerifier,
|
|
ps: createPSSKeyVerifier,
|
|
es: createECDSAVerifer,
|
|
none: createNoneVerifier
|
|
};
|
|
var match = algorithm.match(/^(RS|PS|ES|HS)(256|384|512)$|^(none)$/i);
|
|
if (!match)
|
|
throw typeError(MSG_INVALID_ALGORITHM, algorithm);
|
|
var algo = (match[1] || match[3]).toLowerCase();
|
|
var bits = match[2];
|
|
return {
|
|
sign: signerFactories[algo](bits),
|
|
verify: verifierFactories[algo](bits)
|
|
};
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jws/lib/tostring.js
|
|
var require_tostring = __commonJS((exports, module) => {
|
|
var Buffer2 = __require("buffer").Buffer;
|
|
module.exports = function toString(obj) {
|
|
if (typeof obj === "string")
|
|
return obj;
|
|
if (typeof obj === "number" || Buffer2.isBuffer(obj))
|
|
return obj.toString();
|
|
return JSON.stringify(obj);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jws/lib/sign-stream.js
|
|
var require_sign_stream = __commonJS((exports, module) => {
|
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
var DataStream = require_data_stream();
|
|
var jwa = require_jwa();
|
|
var Stream = __require("stream");
|
|
var toString = require_tostring();
|
|
var util = __require("util");
|
|
function base64url(string, encoding) {
|
|
return Buffer2.from(string, encoding).toString("base64").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
}
|
|
function jwsSecuredInput(header, payload, encoding) {
|
|
encoding = encoding || "utf8";
|
|
var encodedHeader = base64url(toString(header), "binary");
|
|
var encodedPayload = base64url(toString(payload), encoding);
|
|
return util.format("%s.%s", encodedHeader, encodedPayload);
|
|
}
|
|
function jwsSign(opts) {
|
|
var header = opts.header;
|
|
var payload = opts.payload;
|
|
var secretOrKey = opts.secret || opts.privateKey;
|
|
var encoding = opts.encoding;
|
|
var algo = jwa(header.alg);
|
|
var securedInput = jwsSecuredInput(header, payload, encoding);
|
|
var signature = algo.sign(securedInput, secretOrKey);
|
|
return util.format("%s.%s", securedInput, signature);
|
|
}
|
|
function SignStream(opts) {
|
|
var secret = opts.secret || opts.privateKey || opts.key;
|
|
var secretStream = new DataStream(secret);
|
|
this.readable = true;
|
|
this.header = opts.header;
|
|
this.encoding = opts.encoding;
|
|
this.secret = this.privateKey = this.key = secretStream;
|
|
this.payload = new DataStream(opts.payload);
|
|
this.secret.once("close", function() {
|
|
if (!this.payload.writable && this.readable)
|
|
this.sign();
|
|
}.bind(this));
|
|
this.payload.once("close", function() {
|
|
if (!this.secret.writable && this.readable)
|
|
this.sign();
|
|
}.bind(this));
|
|
}
|
|
util.inherits(SignStream, Stream);
|
|
SignStream.prototype.sign = function sign() {
|
|
try {
|
|
var signature = jwsSign({
|
|
header: this.header,
|
|
payload: this.payload.buffer,
|
|
secret: this.secret.buffer,
|
|
encoding: this.encoding
|
|
});
|
|
this.emit("done", signature);
|
|
this.emit("data", signature);
|
|
this.emit("end");
|
|
this.readable = false;
|
|
return signature;
|
|
} catch (e) {
|
|
this.readable = false;
|
|
this.emit("error", e);
|
|
this.emit("close");
|
|
}
|
|
};
|
|
SignStream.sign = jwsSign;
|
|
module.exports = SignStream;
|
|
});
|
|
|
|
// ../eve/node_modules/jws/lib/verify-stream.js
|
|
var require_verify_stream = __commonJS((exports, module) => {
|
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
var DataStream = require_data_stream();
|
|
var jwa = require_jwa();
|
|
var Stream = __require("stream");
|
|
var toString = require_tostring();
|
|
var util = __require("util");
|
|
var JWS_REGEX = /^[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.([a-zA-Z0-9\-_]+)?$/;
|
|
function isObject(thing) {
|
|
return Object.prototype.toString.call(thing) === "[object Object]";
|
|
}
|
|
function safeJsonParse(thing) {
|
|
if (isObject(thing))
|
|
return thing;
|
|
try {
|
|
return JSON.parse(thing);
|
|
} catch (e) {
|
|
return;
|
|
}
|
|
}
|
|
function headerFromJWS(jwsSig) {
|
|
var encodedHeader = jwsSig.split(".", 1)[0];
|
|
return safeJsonParse(Buffer2.from(encodedHeader, "base64").toString("binary"));
|
|
}
|
|
function securedInputFromJWS(jwsSig) {
|
|
return jwsSig.split(".", 2).join(".");
|
|
}
|
|
function signatureFromJWS(jwsSig) {
|
|
return jwsSig.split(".")[2];
|
|
}
|
|
function payloadFromJWS(jwsSig, encoding) {
|
|
encoding = encoding || "utf8";
|
|
var payload = jwsSig.split(".")[1];
|
|
return Buffer2.from(payload, "base64").toString(encoding);
|
|
}
|
|
function isValidJws(string) {
|
|
return JWS_REGEX.test(string) && !!headerFromJWS(string);
|
|
}
|
|
function jwsVerify(jwsSig, algorithm, secretOrKey) {
|
|
if (!algorithm) {
|
|
var err = new Error("Missing algorithm parameter for jws.verify");
|
|
err.code = "MISSING_ALGORITHM";
|
|
throw err;
|
|
}
|
|
jwsSig = toString(jwsSig);
|
|
var signature = signatureFromJWS(jwsSig);
|
|
var securedInput = securedInputFromJWS(jwsSig);
|
|
var algo = jwa(algorithm);
|
|
return algo.verify(securedInput, signature, secretOrKey);
|
|
}
|
|
function jwsDecode(jwsSig, opts) {
|
|
opts = opts || {};
|
|
jwsSig = toString(jwsSig);
|
|
if (!isValidJws(jwsSig))
|
|
return null;
|
|
var header = headerFromJWS(jwsSig);
|
|
if (!header)
|
|
return null;
|
|
var payload = payloadFromJWS(jwsSig);
|
|
if (header.typ === "JWT" || opts.json)
|
|
payload = JSON.parse(payload, opts.encoding);
|
|
return {
|
|
header,
|
|
payload,
|
|
signature: signatureFromJWS(jwsSig)
|
|
};
|
|
}
|
|
function VerifyStream(opts) {
|
|
opts = opts || {};
|
|
var secretOrKey = opts.secret || opts.publicKey || opts.key;
|
|
var secretStream = new DataStream(secretOrKey);
|
|
this.readable = true;
|
|
this.algorithm = opts.algorithm;
|
|
this.encoding = opts.encoding;
|
|
this.secret = this.publicKey = this.key = secretStream;
|
|
this.signature = new DataStream(opts.signature);
|
|
this.secret.once("close", function() {
|
|
if (!this.signature.writable && this.readable)
|
|
this.verify();
|
|
}.bind(this));
|
|
this.signature.once("close", function() {
|
|
if (!this.secret.writable && this.readable)
|
|
this.verify();
|
|
}.bind(this));
|
|
}
|
|
util.inherits(VerifyStream, Stream);
|
|
VerifyStream.prototype.verify = function verify() {
|
|
try {
|
|
var valid = jwsVerify(this.signature.buffer, this.algorithm, this.key.buffer);
|
|
var obj = jwsDecode(this.signature.buffer, this.encoding);
|
|
this.emit("done", valid, obj);
|
|
this.emit("data", valid);
|
|
this.emit("end");
|
|
this.readable = false;
|
|
return valid;
|
|
} catch (e) {
|
|
this.readable = false;
|
|
this.emit("error", e);
|
|
this.emit("close");
|
|
}
|
|
};
|
|
VerifyStream.decode = jwsDecode;
|
|
VerifyStream.isValid = isValidJws;
|
|
VerifyStream.verify = jwsVerify;
|
|
module.exports = VerifyStream;
|
|
});
|
|
|
|
// ../eve/node_modules/jws/index.js
|
|
var require_jws = __commonJS((exports) => {
|
|
var SignStream = require_sign_stream();
|
|
var VerifyStream = require_verify_stream();
|
|
var ALGORITHMS = [
|
|
"HS256",
|
|
"HS384",
|
|
"HS512",
|
|
"RS256",
|
|
"RS384",
|
|
"RS512",
|
|
"PS256",
|
|
"PS384",
|
|
"PS512",
|
|
"ES256",
|
|
"ES384",
|
|
"ES512"
|
|
];
|
|
exports.ALGORITHMS = ALGORITHMS;
|
|
exports.sign = SignStream.sign;
|
|
exports.verify = VerifyStream.verify;
|
|
exports.decode = VerifyStream.decode;
|
|
exports.isValid = VerifyStream.isValid;
|
|
exports.createSign = function createSign(opts) {
|
|
return new SignStream(opts);
|
|
};
|
|
exports.createVerify = function createVerify(opts) {
|
|
return new VerifyStream(opts);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/decode.js
|
|
var require_decode = __commonJS((exports, module) => {
|
|
var jws = require_jws();
|
|
module.exports = function(jwt, options2) {
|
|
options2 = options2 || {};
|
|
var decoded = jws.decode(jwt, options2);
|
|
if (!decoded) {
|
|
return null;
|
|
}
|
|
var payload = decoded.payload;
|
|
if (typeof payload === "string") {
|
|
try {
|
|
var obj = JSON.parse(payload);
|
|
if (obj !== null && typeof obj === "object") {
|
|
payload = obj;
|
|
}
|
|
} catch (e) {}
|
|
}
|
|
if (options2.complete === true) {
|
|
return {
|
|
header: decoded.header,
|
|
payload,
|
|
signature: decoded.signature
|
|
};
|
|
}
|
|
return payload;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/JsonWebTokenError.js
|
|
var require_JsonWebTokenError = __commonJS((exports, module) => {
|
|
var JsonWebTokenError = function(message, error) {
|
|
Error.call(this, message);
|
|
if (Error.captureStackTrace) {
|
|
Error.captureStackTrace(this, this.constructor);
|
|
}
|
|
this.name = "JsonWebTokenError";
|
|
this.message = message;
|
|
if (error)
|
|
this.inner = error;
|
|
};
|
|
JsonWebTokenError.prototype = Object.create(Error.prototype);
|
|
JsonWebTokenError.prototype.constructor = JsonWebTokenError;
|
|
module.exports = JsonWebTokenError;
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/NotBeforeError.js
|
|
var require_NotBeforeError = __commonJS((exports, module) => {
|
|
var JsonWebTokenError = require_JsonWebTokenError();
|
|
var NotBeforeError = function(message, date) {
|
|
JsonWebTokenError.call(this, message);
|
|
this.name = "NotBeforeError";
|
|
this.date = date;
|
|
};
|
|
NotBeforeError.prototype = Object.create(JsonWebTokenError.prototype);
|
|
NotBeforeError.prototype.constructor = NotBeforeError;
|
|
module.exports = NotBeforeError;
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/TokenExpiredError.js
|
|
var require_TokenExpiredError = __commonJS((exports, module) => {
|
|
var JsonWebTokenError = require_JsonWebTokenError();
|
|
var TokenExpiredError = function(message, expiredAt) {
|
|
JsonWebTokenError.call(this, message);
|
|
this.name = "TokenExpiredError";
|
|
this.expiredAt = expiredAt;
|
|
};
|
|
TokenExpiredError.prototype = Object.create(JsonWebTokenError.prototype);
|
|
TokenExpiredError.prototype.constructor = TokenExpiredError;
|
|
module.exports = TokenExpiredError;
|
|
});
|
|
|
|
// ../eve/node_modules/ms/index.js
|
|
var require_ms = __commonJS((exports, module) => {
|
|
var s = 1000;
|
|
var m = s * 60;
|
|
var h = m * 60;
|
|
var d = h * 24;
|
|
var w = d * 7;
|
|
var y = d * 365.25;
|
|
module.exports = function(val, options2) {
|
|
options2 = options2 || {};
|
|
var type = typeof val;
|
|
if (type === "string" && val.length > 0) {
|
|
return parse(val);
|
|
} else if (type === "number" && isFinite(val)) {
|
|
return options2.long ? fmtLong(val) : fmtShort(val);
|
|
}
|
|
throw new Error("val is not a non-empty string or a valid number. val=" + JSON.stringify(val));
|
|
};
|
|
function parse(str) {
|
|
str = String(str);
|
|
if (str.length > 100) {
|
|
return;
|
|
}
|
|
var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
|
|
if (!match) {
|
|
return;
|
|
}
|
|
var n = parseFloat(match[1]);
|
|
var type = (match[2] || "ms").toLowerCase();
|
|
switch (type) {
|
|
case "years":
|
|
case "year":
|
|
case "yrs":
|
|
case "yr":
|
|
case "y":
|
|
return n * y;
|
|
case "weeks":
|
|
case "week":
|
|
case "w":
|
|
return n * w;
|
|
case "days":
|
|
case "day":
|
|
case "d":
|
|
return n * d;
|
|
case "hours":
|
|
case "hour":
|
|
case "hrs":
|
|
case "hr":
|
|
case "h":
|
|
return n * h;
|
|
case "minutes":
|
|
case "minute":
|
|
case "mins":
|
|
case "min":
|
|
case "m":
|
|
return n * m;
|
|
case "seconds":
|
|
case "second":
|
|
case "secs":
|
|
case "sec":
|
|
case "s":
|
|
return n * s;
|
|
case "milliseconds":
|
|
case "millisecond":
|
|
case "msecs":
|
|
case "msec":
|
|
case "ms":
|
|
return n;
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
function fmtShort(ms) {
|
|
var msAbs = Math.abs(ms);
|
|
if (msAbs >= d) {
|
|
return Math.round(ms / d) + "d";
|
|
}
|
|
if (msAbs >= h) {
|
|
return Math.round(ms / h) + "h";
|
|
}
|
|
if (msAbs >= m) {
|
|
return Math.round(ms / m) + "m";
|
|
}
|
|
if (msAbs >= s) {
|
|
return Math.round(ms / s) + "s";
|
|
}
|
|
return ms + "ms";
|
|
}
|
|
function fmtLong(ms) {
|
|
var msAbs = Math.abs(ms);
|
|
if (msAbs >= d) {
|
|
return plural(ms, msAbs, d, "day");
|
|
}
|
|
if (msAbs >= h) {
|
|
return plural(ms, msAbs, h, "hour");
|
|
}
|
|
if (msAbs >= m) {
|
|
return plural(ms, msAbs, m, "minute");
|
|
}
|
|
if (msAbs >= s) {
|
|
return plural(ms, msAbs, s, "second");
|
|
}
|
|
return ms + " ms";
|
|
}
|
|
function plural(ms, msAbs, n, name) {
|
|
var isPlural = msAbs >= n * 1.5;
|
|
return Math.round(ms / n) + " " + name + (isPlural ? "s" : "");
|
|
}
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/timespan.js
|
|
var require_timespan = __commonJS((exports, module) => {
|
|
var ms = require_ms();
|
|
module.exports = function(time, iat) {
|
|
var timestamp = iat || Math.floor(Date.now() / 1000);
|
|
if (typeof time === "string") {
|
|
var milliseconds = ms(time);
|
|
if (typeof milliseconds === "undefined") {
|
|
return;
|
|
}
|
|
return Math.floor(timestamp + milliseconds / 1000);
|
|
} else if (typeof time === "number") {
|
|
return timestamp + time;
|
|
} else {
|
|
return;
|
|
}
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/semver/internal/constants.js
|
|
var require_constants = __commonJS((exports, module) => {
|
|
var SEMVER_SPEC_VERSION = "2.0.0";
|
|
var MAX_LENGTH = 256;
|
|
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
|
|
var MAX_SAFE_COMPONENT_LENGTH = 16;
|
|
var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6;
|
|
var RELEASE_TYPES = [
|
|
"major",
|
|
"premajor",
|
|
"minor",
|
|
"preminor",
|
|
"patch",
|
|
"prepatch",
|
|
"prerelease"
|
|
];
|
|
module.exports = {
|
|
MAX_LENGTH,
|
|
MAX_SAFE_COMPONENT_LENGTH,
|
|
MAX_SAFE_BUILD_LENGTH,
|
|
MAX_SAFE_INTEGER,
|
|
RELEASE_TYPES,
|
|
SEMVER_SPEC_VERSION,
|
|
FLAG_INCLUDE_PRERELEASE: 1,
|
|
FLAG_LOOSE: 2
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/semver/internal/debug.js
|
|
var require_debug = __commonJS((exports, module) => {
|
|
var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {};
|
|
module.exports = debug;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/internal/re.js
|
|
var require_re = __commonJS((exports, module) => {
|
|
var {
|
|
MAX_SAFE_COMPONENT_LENGTH,
|
|
MAX_SAFE_BUILD_LENGTH,
|
|
MAX_LENGTH
|
|
} = require_constants();
|
|
var debug = require_debug();
|
|
exports = module.exports = {};
|
|
var re = exports.re = [];
|
|
var safeRe = exports.safeRe = [];
|
|
var src = exports.src = [];
|
|
var safeSrc = exports.safeSrc = [];
|
|
var t = exports.t = {};
|
|
var R = 0;
|
|
var LETTERDASHNUMBER = "[a-zA-Z0-9-]";
|
|
var safeRegexReplacements = [
|
|
["\\s", 1],
|
|
["\\d", MAX_LENGTH],
|
|
[LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH]
|
|
];
|
|
var makeSafeRegex = (value) => {
|
|
for (const [token, max] of safeRegexReplacements) {
|
|
value = value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);
|
|
}
|
|
return value;
|
|
};
|
|
var createToken = (name, value, isGlobal) => {
|
|
const safe = makeSafeRegex(value);
|
|
const index2 = R++;
|
|
debug(name, index2, value);
|
|
t[name] = index2;
|
|
src[index2] = value;
|
|
safeSrc[index2] = safe;
|
|
re[index2] = new RegExp(value, isGlobal ? "g" : undefined);
|
|
safeRe[index2] = new RegExp(safe, isGlobal ? "g" : undefined);
|
|
};
|
|
createToken("NUMERICIDENTIFIER", "0|[1-9]\\d*");
|
|
createToken("NUMERICIDENTIFIERLOOSE", "\\d+");
|
|
createToken("NONNUMERICIDENTIFIER", `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);
|
|
createToken("MAINVERSION", `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})`);
|
|
createToken("MAINVERSIONLOOSE", `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})`);
|
|
createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`);
|
|
createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`);
|
|
createToken("PRERELEASE", `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);
|
|
createToken("PRERELEASELOOSE", `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);
|
|
createToken("BUILDIDENTIFIER", `${LETTERDASHNUMBER}+`);
|
|
createToken("BUILD", `(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);
|
|
createToken("FULLPLAIN", `v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);
|
|
createToken("FULL", `^${src[t.FULLPLAIN]}$`);
|
|
createToken("LOOSEPLAIN", `[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);
|
|
createToken("LOOSE", `^${src[t.LOOSEPLAIN]}$`);
|
|
createToken("GTLT", "((?:<|>)?=?)");
|
|
createToken("XRANGEIDENTIFIERLOOSE", `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
|
|
createToken("XRANGEIDENTIFIER", `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);
|
|
createToken("XRANGEPLAIN", `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?` + `)?)?`);
|
|
createToken("XRANGEPLAINLOOSE", `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?` + `)?)?`);
|
|
createToken("XRANGE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);
|
|
createToken("XRANGELOOSE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);
|
|
createToken("COERCEPLAIN", `${"(^|[^\\d])" + "(\\d{1,"}${MAX_SAFE_COMPONENT_LENGTH}})` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);
|
|
createToken("COERCE", `${src[t.COERCEPLAIN]}(?:$|[^\\d])`);
|
|
createToken("COERCEFULL", src[t.COERCEPLAIN] + `(?:${src[t.PRERELEASE]})?` + `(?:${src[t.BUILD]})?` + `(?:$|[^\\d])`);
|
|
createToken("COERCERTL", src[t.COERCE], true);
|
|
createToken("COERCERTLFULL", src[t.COERCEFULL], true);
|
|
createToken("LONETILDE", "(?:~>?)");
|
|
createToken("TILDETRIM", `(\\s*)${src[t.LONETILDE]}\\s+`, true);
|
|
exports.tildeTrimReplace = "$1~";
|
|
createToken("TILDE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
|
|
createToken("TILDELOOSE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
|
|
createToken("LONECARET", "(?:\\^)");
|
|
createToken("CARETTRIM", `(\\s*)${src[t.LONECARET]}\\s+`, true);
|
|
exports.caretTrimReplace = "$1^";
|
|
createToken("CARET", `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
|
|
createToken("CARETLOOSE", `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
|
|
createToken("COMPARATORLOOSE", `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
|
|
createToken("COMPARATOR", `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
|
|
createToken("COMPARATORTRIM", `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
|
|
exports.comparatorTrimReplace = "$1$2$3";
|
|
createToken("HYPHENRANGE", `^\\s*(${src[t.XRANGEPLAIN]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAIN]})` + `\\s*$`);
|
|
createToken("HYPHENRANGELOOSE", `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAINLOOSE]})` + `\\s*$`);
|
|
createToken("STAR", "(<|>)?=?\\s*\\*");
|
|
createToken("GTE0", "^\\s*>=\\s*0\\.0\\.0\\s*$");
|
|
createToken("GTE0PRE", "^\\s*>=\\s*0\\.0\\.0-0\\s*$");
|
|
});
|
|
|
|
// ../eve/node_modules/semver/internal/parse-options.js
|
|
var require_parse_options = __commonJS((exports, module) => {
|
|
var looseOption = Object.freeze({ loose: true });
|
|
var emptyOpts = Object.freeze({});
|
|
var parseOptions = (options2) => {
|
|
if (!options2) {
|
|
return emptyOpts;
|
|
}
|
|
if (typeof options2 !== "object") {
|
|
return looseOption;
|
|
}
|
|
return options2;
|
|
};
|
|
module.exports = parseOptions;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/internal/identifiers.js
|
|
var require_identifiers = __commonJS((exports, module) => {
|
|
var numeric2 = /^[0-9]+$/;
|
|
var compareIdentifiers = (a, b) => {
|
|
const anum = numeric2.test(a);
|
|
const bnum = numeric2.test(b);
|
|
if (anum && bnum) {
|
|
a = +a;
|
|
b = +b;
|
|
}
|
|
return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
|
|
};
|
|
var rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);
|
|
module.exports = {
|
|
compareIdentifiers,
|
|
rcompareIdentifiers
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/semver/classes/semver.js
|
|
var require_semver = __commonJS((exports, module) => {
|
|
var debug = require_debug();
|
|
var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants();
|
|
var { safeRe: re, t } = require_re();
|
|
var parseOptions = require_parse_options();
|
|
var { compareIdentifiers } = require_identifiers();
|
|
|
|
class SemVer {
|
|
constructor(version2, options2) {
|
|
options2 = parseOptions(options2);
|
|
if (version2 instanceof SemVer) {
|
|
if (version2.loose === !!options2.loose && version2.includePrerelease === !!options2.includePrerelease) {
|
|
return version2;
|
|
} else {
|
|
version2 = version2.version;
|
|
}
|
|
} else if (typeof version2 !== "string") {
|
|
throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`);
|
|
}
|
|
if (version2.length > MAX_LENGTH) {
|
|
throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);
|
|
}
|
|
debug("SemVer", version2, options2);
|
|
this.options = options2;
|
|
this.loose = !!options2.loose;
|
|
this.includePrerelease = !!options2.includePrerelease;
|
|
const m = version2.trim().match(options2.loose ? re[t.LOOSE] : re[t.FULL]);
|
|
if (!m) {
|
|
throw new TypeError(`Invalid Version: ${version2}`);
|
|
}
|
|
this.raw = version2;
|
|
this.major = +m[1];
|
|
this.minor = +m[2];
|
|
this.patch = +m[3];
|
|
if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
|
|
throw new TypeError("Invalid major version");
|
|
}
|
|
if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
|
|
throw new TypeError("Invalid minor version");
|
|
}
|
|
if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
|
|
throw new TypeError("Invalid patch version");
|
|
}
|
|
if (!m[4]) {
|
|
this.prerelease = [];
|
|
} else {
|
|
this.prerelease = m[4].split(".").map((id) => {
|
|
if (/^[0-9]+$/.test(id)) {
|
|
const num = +id;
|
|
if (num >= 0 && num < MAX_SAFE_INTEGER) {
|
|
return num;
|
|
}
|
|
}
|
|
return id;
|
|
});
|
|
}
|
|
this.build = m[5] ? m[5].split(".") : [];
|
|
this.format();
|
|
}
|
|
format() {
|
|
this.version = `${this.major}.${this.minor}.${this.patch}`;
|
|
if (this.prerelease.length) {
|
|
this.version += `-${this.prerelease.join(".")}`;
|
|
}
|
|
return this.version;
|
|
}
|
|
toString() {
|
|
return this.version;
|
|
}
|
|
compare(other) {
|
|
debug("SemVer.compare", this.version, this.options, other);
|
|
if (!(other instanceof SemVer)) {
|
|
if (typeof other === "string" && other === this.version) {
|
|
return 0;
|
|
}
|
|
other = new SemVer(other, this.options);
|
|
}
|
|
if (other.version === this.version) {
|
|
return 0;
|
|
}
|
|
return this.compareMain(other) || this.comparePre(other);
|
|
}
|
|
compareMain(other) {
|
|
if (!(other instanceof SemVer)) {
|
|
other = new SemVer(other, this.options);
|
|
}
|
|
return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);
|
|
}
|
|
comparePre(other) {
|
|
if (!(other instanceof SemVer)) {
|
|
other = new SemVer(other, this.options);
|
|
}
|
|
if (this.prerelease.length && !other.prerelease.length) {
|
|
return -1;
|
|
} else if (!this.prerelease.length && other.prerelease.length) {
|
|
return 1;
|
|
} else if (!this.prerelease.length && !other.prerelease.length) {
|
|
return 0;
|
|
}
|
|
let i = 0;
|
|
do {
|
|
const a = this.prerelease[i];
|
|
const b = other.prerelease[i];
|
|
debug("prerelease compare", i, a, b);
|
|
if (a === undefined && b === undefined) {
|
|
return 0;
|
|
} else if (b === undefined) {
|
|
return 1;
|
|
} else if (a === undefined) {
|
|
return -1;
|
|
} else if (a === b) {
|
|
continue;
|
|
} else {
|
|
return compareIdentifiers(a, b);
|
|
}
|
|
} while (++i);
|
|
}
|
|
compareBuild(other) {
|
|
if (!(other instanceof SemVer)) {
|
|
other = new SemVer(other, this.options);
|
|
}
|
|
let i = 0;
|
|
do {
|
|
const a = this.build[i];
|
|
const b = other.build[i];
|
|
debug("build compare", i, a, b);
|
|
if (a === undefined && b === undefined) {
|
|
return 0;
|
|
} else if (b === undefined) {
|
|
return 1;
|
|
} else if (a === undefined) {
|
|
return -1;
|
|
} else if (a === b) {
|
|
continue;
|
|
} else {
|
|
return compareIdentifiers(a, b);
|
|
}
|
|
} while (++i);
|
|
}
|
|
inc(release, identifier, identifierBase) {
|
|
if (release.startsWith("pre")) {
|
|
if (!identifier && identifierBase === false) {
|
|
throw new Error("invalid increment argument: identifier is empty");
|
|
}
|
|
if (identifier) {
|
|
const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]);
|
|
if (!match || match[1] !== identifier) {
|
|
throw new Error(`invalid identifier: ${identifier}`);
|
|
}
|
|
}
|
|
}
|
|
switch (release) {
|
|
case "premajor":
|
|
this.prerelease.length = 0;
|
|
this.patch = 0;
|
|
this.minor = 0;
|
|
this.major++;
|
|
this.inc("pre", identifier, identifierBase);
|
|
break;
|
|
case "preminor":
|
|
this.prerelease.length = 0;
|
|
this.patch = 0;
|
|
this.minor++;
|
|
this.inc("pre", identifier, identifierBase);
|
|
break;
|
|
case "prepatch":
|
|
this.prerelease.length = 0;
|
|
this.inc("patch", identifier, identifierBase);
|
|
this.inc("pre", identifier, identifierBase);
|
|
break;
|
|
case "prerelease":
|
|
if (this.prerelease.length === 0) {
|
|
this.inc("patch", identifier, identifierBase);
|
|
}
|
|
this.inc("pre", identifier, identifierBase);
|
|
break;
|
|
case "release":
|
|
if (this.prerelease.length === 0) {
|
|
throw new Error(`version ${this.raw} is not a prerelease`);
|
|
}
|
|
this.prerelease.length = 0;
|
|
break;
|
|
case "major":
|
|
if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) {
|
|
this.major++;
|
|
}
|
|
this.minor = 0;
|
|
this.patch = 0;
|
|
this.prerelease = [];
|
|
break;
|
|
case "minor":
|
|
if (this.patch !== 0 || this.prerelease.length === 0) {
|
|
this.minor++;
|
|
}
|
|
this.patch = 0;
|
|
this.prerelease = [];
|
|
break;
|
|
case "patch":
|
|
if (this.prerelease.length === 0) {
|
|
this.patch++;
|
|
}
|
|
this.prerelease = [];
|
|
break;
|
|
case "pre": {
|
|
const base = Number(identifierBase) ? 1 : 0;
|
|
if (this.prerelease.length === 0) {
|
|
this.prerelease = [base];
|
|
} else {
|
|
let i = this.prerelease.length;
|
|
while (--i >= 0) {
|
|
if (typeof this.prerelease[i] === "number") {
|
|
this.prerelease[i]++;
|
|
i = -2;
|
|
}
|
|
}
|
|
if (i === -1) {
|
|
if (identifier === this.prerelease.join(".") && identifierBase === false) {
|
|
throw new Error("invalid increment argument: identifier already exists");
|
|
}
|
|
this.prerelease.push(base);
|
|
}
|
|
}
|
|
if (identifier) {
|
|
let prerelease = [identifier, base];
|
|
if (identifierBase === false) {
|
|
prerelease = [identifier];
|
|
}
|
|
if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
|
|
if (isNaN(this.prerelease[1])) {
|
|
this.prerelease = prerelease;
|
|
}
|
|
} else {
|
|
this.prerelease = prerelease;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
throw new Error(`invalid increment argument: ${release}`);
|
|
}
|
|
this.raw = this.format();
|
|
if (this.build.length) {
|
|
this.raw += `+${this.build.join(".")}`;
|
|
}
|
|
return this;
|
|
}
|
|
}
|
|
module.exports = SemVer;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/parse.js
|
|
var require_parse = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var parse = (version2, options2, throwErrors = false) => {
|
|
if (version2 instanceof SemVer) {
|
|
return version2;
|
|
}
|
|
try {
|
|
return new SemVer(version2, options2);
|
|
} catch (er) {
|
|
if (!throwErrors) {
|
|
return null;
|
|
}
|
|
throw er;
|
|
}
|
|
};
|
|
module.exports = parse;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/valid.js
|
|
var require_valid = __commonJS((exports, module) => {
|
|
var parse = require_parse();
|
|
var valid = (version2, options2) => {
|
|
const v = parse(version2, options2);
|
|
return v ? v.version : null;
|
|
};
|
|
module.exports = valid;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/clean.js
|
|
var require_clean = __commonJS((exports, module) => {
|
|
var parse = require_parse();
|
|
var clean = (version2, options2) => {
|
|
const s = parse(version2.trim().replace(/^[=v]+/, ""), options2);
|
|
return s ? s.version : null;
|
|
};
|
|
module.exports = clean;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/inc.js
|
|
var require_inc = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var inc = (version2, release, options2, identifier, identifierBase) => {
|
|
if (typeof options2 === "string") {
|
|
identifierBase = identifier;
|
|
identifier = options2;
|
|
options2 = undefined;
|
|
}
|
|
try {
|
|
return new SemVer(version2 instanceof SemVer ? version2.version : version2, options2).inc(release, identifier, identifierBase).version;
|
|
} catch (er) {
|
|
return null;
|
|
}
|
|
};
|
|
module.exports = inc;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/diff.js
|
|
var require_diff = __commonJS((exports, module) => {
|
|
var parse = require_parse();
|
|
var diff = (version1, version2) => {
|
|
const v1 = parse(version1, null, true);
|
|
const v2 = parse(version2, null, true);
|
|
const comparison = v1.compare(v2);
|
|
if (comparison === 0) {
|
|
return null;
|
|
}
|
|
const v1Higher = comparison > 0;
|
|
const highVersion = v1Higher ? v1 : v2;
|
|
const lowVersion = v1Higher ? v2 : v1;
|
|
const highHasPre = !!highVersion.prerelease.length;
|
|
const lowHasPre = !!lowVersion.prerelease.length;
|
|
if (lowHasPre && !highHasPre) {
|
|
if (!lowVersion.patch && !lowVersion.minor) {
|
|
return "major";
|
|
}
|
|
if (lowVersion.compareMain(highVersion) === 0) {
|
|
if (lowVersion.minor && !lowVersion.patch) {
|
|
return "minor";
|
|
}
|
|
return "patch";
|
|
}
|
|
}
|
|
const prefix = highHasPre ? "pre" : "";
|
|
if (v1.major !== v2.major) {
|
|
return prefix + "major";
|
|
}
|
|
if (v1.minor !== v2.minor) {
|
|
return prefix + "minor";
|
|
}
|
|
if (v1.patch !== v2.patch) {
|
|
return prefix + "patch";
|
|
}
|
|
return "prerelease";
|
|
};
|
|
module.exports = diff;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/major.js
|
|
var require_major = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var major = (a, loose) => new SemVer(a, loose).major;
|
|
module.exports = major;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/minor.js
|
|
var require_minor = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var minor = (a, loose) => new SemVer(a, loose).minor;
|
|
module.exports = minor;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/patch.js
|
|
var require_patch = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var patch = (a, loose) => new SemVer(a, loose).patch;
|
|
module.exports = patch;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/prerelease.js
|
|
var require_prerelease = __commonJS((exports, module) => {
|
|
var parse = require_parse();
|
|
var prerelease = (version2, options2) => {
|
|
const parsed = parse(version2, options2);
|
|
return parsed && parsed.prerelease.length ? parsed.prerelease : null;
|
|
};
|
|
module.exports = prerelease;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/compare.js
|
|
var require_compare = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
|
|
module.exports = compare;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/rcompare.js
|
|
var require_rcompare = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var rcompare = (a, b, loose) => compare(b, a, loose);
|
|
module.exports = rcompare;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/compare-loose.js
|
|
var require_compare_loose = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var compareLoose = (a, b) => compare(a, b, true);
|
|
module.exports = compareLoose;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/compare-build.js
|
|
var require_compare_build = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var compareBuild = (a, b, loose) => {
|
|
const versionA = new SemVer(a, loose);
|
|
const versionB = new SemVer(b, loose);
|
|
return versionA.compare(versionB) || versionA.compareBuild(versionB);
|
|
};
|
|
module.exports = compareBuild;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/sort.js
|
|
var require_sort = __commonJS((exports, module) => {
|
|
var compareBuild = require_compare_build();
|
|
var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
|
|
module.exports = sort;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/rsort.js
|
|
var require_rsort = __commonJS((exports, module) => {
|
|
var compareBuild = require_compare_build();
|
|
var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
|
|
module.exports = rsort;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/gt.js
|
|
var require_gt = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var gt2 = (a, b, loose) => compare(a, b, loose) > 0;
|
|
module.exports = gt2;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/lt.js
|
|
var require_lt = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var lt2 = (a, b, loose) => compare(a, b, loose) < 0;
|
|
module.exports = lt2;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/eq.js
|
|
var require_eq = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var eq2 = (a, b, loose) => compare(a, b, loose) === 0;
|
|
module.exports = eq2;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/neq.js
|
|
var require_neq = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var neq = (a, b, loose) => compare(a, b, loose) !== 0;
|
|
module.exports = neq;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/gte.js
|
|
var require_gte = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var gte2 = (a, b, loose) => compare(a, b, loose) >= 0;
|
|
module.exports = gte2;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/lte.js
|
|
var require_lte = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var lte2 = (a, b, loose) => compare(a, b, loose) <= 0;
|
|
module.exports = lte2;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/cmp.js
|
|
var require_cmp = __commonJS((exports, module) => {
|
|
var eq2 = require_eq();
|
|
var neq = require_neq();
|
|
var gt2 = require_gt();
|
|
var gte2 = require_gte();
|
|
var lt2 = require_lt();
|
|
var lte2 = require_lte();
|
|
var cmp = (a, op, b, loose) => {
|
|
switch (op) {
|
|
case "===":
|
|
if (typeof a === "object") {
|
|
a = a.version;
|
|
}
|
|
if (typeof b === "object") {
|
|
b = b.version;
|
|
}
|
|
return a === b;
|
|
case "!==":
|
|
if (typeof a === "object") {
|
|
a = a.version;
|
|
}
|
|
if (typeof b === "object") {
|
|
b = b.version;
|
|
}
|
|
return a !== b;
|
|
case "":
|
|
case "=":
|
|
case "==":
|
|
return eq2(a, b, loose);
|
|
case "!=":
|
|
return neq(a, b, loose);
|
|
case ">":
|
|
return gt2(a, b, loose);
|
|
case ">=":
|
|
return gte2(a, b, loose);
|
|
case "<":
|
|
return lt2(a, b, loose);
|
|
case "<=":
|
|
return lte2(a, b, loose);
|
|
default:
|
|
throw new TypeError(`Invalid operator: ${op}`);
|
|
}
|
|
};
|
|
module.exports = cmp;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/coerce.js
|
|
var require_coerce = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var parse = require_parse();
|
|
var { safeRe: re, t } = require_re();
|
|
var coerce = (version2, options2) => {
|
|
if (version2 instanceof SemVer) {
|
|
return version2;
|
|
}
|
|
if (typeof version2 === "number") {
|
|
version2 = String(version2);
|
|
}
|
|
if (typeof version2 !== "string") {
|
|
return null;
|
|
}
|
|
options2 = options2 || {};
|
|
let match = null;
|
|
if (!options2.rtl) {
|
|
match = version2.match(options2.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]);
|
|
} else {
|
|
const coerceRtlRegex = options2.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL];
|
|
let next;
|
|
while ((next = coerceRtlRegex.exec(version2)) && (!match || match.index + match[0].length !== version2.length)) {
|
|
if (!match || next.index + next[0].length !== match.index + match[0].length) {
|
|
match = next;
|
|
}
|
|
coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length;
|
|
}
|
|
coerceRtlRegex.lastIndex = -1;
|
|
}
|
|
if (match === null) {
|
|
return null;
|
|
}
|
|
const major = match[2];
|
|
const minor = match[3] || "0";
|
|
const patch = match[4] || "0";
|
|
const prerelease = options2.includePrerelease && match[5] ? `-${match[5]}` : "";
|
|
const build = options2.includePrerelease && match[6] ? `+${match[6]}` : "";
|
|
return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options2);
|
|
};
|
|
module.exports = coerce;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/internal/lrucache.js
|
|
var require_lrucache = __commonJS((exports, module) => {
|
|
class LRUCache {
|
|
constructor() {
|
|
this.max = 1000;
|
|
this.map = new Map;
|
|
}
|
|
get(key) {
|
|
const value = this.map.get(key);
|
|
if (value === undefined) {
|
|
return;
|
|
} else {
|
|
this.map.delete(key);
|
|
this.map.set(key, value);
|
|
return value;
|
|
}
|
|
}
|
|
delete(key) {
|
|
return this.map.delete(key);
|
|
}
|
|
set(key, value) {
|
|
const deleted = this.delete(key);
|
|
if (!deleted && value !== undefined) {
|
|
if (this.map.size >= this.max) {
|
|
const firstKey = this.map.keys().next().value;
|
|
this.delete(firstKey);
|
|
}
|
|
this.map.set(key, value);
|
|
}
|
|
return this;
|
|
}
|
|
}
|
|
module.exports = LRUCache;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/classes/range.js
|
|
var require_range = __commonJS((exports, module) => {
|
|
var SPACE_CHARACTERS = /\s+/g;
|
|
|
|
class Range {
|
|
constructor(range, options2) {
|
|
options2 = parseOptions(options2);
|
|
if (range instanceof Range) {
|
|
if (range.loose === !!options2.loose && range.includePrerelease === !!options2.includePrerelease) {
|
|
return range;
|
|
} else {
|
|
return new Range(range.raw, options2);
|
|
}
|
|
}
|
|
if (range instanceof Comparator) {
|
|
this.raw = range.value;
|
|
this.set = [[range]];
|
|
this.formatted = undefined;
|
|
return this;
|
|
}
|
|
this.options = options2;
|
|
this.loose = !!options2.loose;
|
|
this.includePrerelease = !!options2.includePrerelease;
|
|
this.raw = range.trim().replace(SPACE_CHARACTERS, " ");
|
|
this.set = this.raw.split("||").map((r) => this.parseRange(r.trim())).filter((c) => c.length);
|
|
if (!this.set.length) {
|
|
throw new TypeError(`Invalid SemVer Range: ${this.raw}`);
|
|
}
|
|
if (this.set.length > 1) {
|
|
const first = this.set[0];
|
|
this.set = this.set.filter((c) => !isNullSet(c[0]));
|
|
if (this.set.length === 0) {
|
|
this.set = [first];
|
|
} else if (this.set.length > 1) {
|
|
for (const c of this.set) {
|
|
if (c.length === 1 && isAny(c[0])) {
|
|
this.set = [c];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
this.formatted = undefined;
|
|
}
|
|
get range() {
|
|
if (this.formatted === undefined) {
|
|
this.formatted = "";
|
|
for (let i = 0;i < this.set.length; i++) {
|
|
if (i > 0) {
|
|
this.formatted += "||";
|
|
}
|
|
const comps = this.set[i];
|
|
for (let k = 0;k < comps.length; k++) {
|
|
if (k > 0) {
|
|
this.formatted += " ";
|
|
}
|
|
this.formatted += comps[k].toString().trim();
|
|
}
|
|
}
|
|
}
|
|
return this.formatted;
|
|
}
|
|
format() {
|
|
return this.range;
|
|
}
|
|
toString() {
|
|
return this.range;
|
|
}
|
|
parseRange(range) {
|
|
const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE);
|
|
const memoKey = memoOpts + ":" + range;
|
|
const cached = cache.get(memoKey);
|
|
if (cached) {
|
|
return cached;
|
|
}
|
|
const loose = this.options.loose;
|
|
const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
|
|
range = range.replace(hr, hyphenReplace(this.options.includePrerelease));
|
|
debug("hyphen replace", range);
|
|
range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
|
|
debug("comparator trim", range);
|
|
range = range.replace(re[t.TILDETRIM], tildeTrimReplace);
|
|
debug("tilde trim", range);
|
|
range = range.replace(re[t.CARETTRIM], caretTrimReplace);
|
|
debug("caret trim", range);
|
|
let rangeList = range.split(" ").map((comp) => parseComparator(comp, this.options)).join(" ").split(/\s+/).map((comp) => replaceGTE0(comp, this.options));
|
|
if (loose) {
|
|
rangeList = rangeList.filter((comp) => {
|
|
debug("loose invalid filter", comp, this.options);
|
|
return !!comp.match(re[t.COMPARATORLOOSE]);
|
|
});
|
|
}
|
|
debug("range list", rangeList);
|
|
const rangeMap = new Map;
|
|
const comparators = rangeList.map((comp) => new Comparator(comp, this.options));
|
|
for (const comp of comparators) {
|
|
if (isNullSet(comp)) {
|
|
return [comp];
|
|
}
|
|
rangeMap.set(comp.value, comp);
|
|
}
|
|
if (rangeMap.size > 1 && rangeMap.has("")) {
|
|
rangeMap.delete("");
|
|
}
|
|
const result = [...rangeMap.values()];
|
|
cache.set(memoKey, result);
|
|
return result;
|
|
}
|
|
intersects(range, options2) {
|
|
if (!(range instanceof Range)) {
|
|
throw new TypeError("a Range is required");
|
|
}
|
|
return this.set.some((thisComparators) => {
|
|
return isSatisfiable(thisComparators, options2) && range.set.some((rangeComparators) => {
|
|
return isSatisfiable(rangeComparators, options2) && thisComparators.every((thisComparator) => {
|
|
return rangeComparators.every((rangeComparator) => {
|
|
return thisComparator.intersects(rangeComparator, options2);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}
|
|
test(version2) {
|
|
if (!version2) {
|
|
return false;
|
|
}
|
|
if (typeof version2 === "string") {
|
|
try {
|
|
version2 = new SemVer(version2, this.options);
|
|
} catch (er) {
|
|
return false;
|
|
}
|
|
}
|
|
for (let i = 0;i < this.set.length; i++) {
|
|
if (testSet(this.set[i], version2, this.options)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
module.exports = Range;
|
|
var LRU = require_lrucache();
|
|
var cache = new LRU;
|
|
var parseOptions = require_parse_options();
|
|
var Comparator = require_comparator();
|
|
var debug = require_debug();
|
|
var SemVer = require_semver();
|
|
var {
|
|
safeRe: re,
|
|
t,
|
|
comparatorTrimReplace,
|
|
tildeTrimReplace,
|
|
caretTrimReplace
|
|
} = require_re();
|
|
var { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require_constants();
|
|
var isNullSet = (c) => c.value === "<0.0.0-0";
|
|
var isAny = (c) => c.value === "";
|
|
var isSatisfiable = (comparators, options2) => {
|
|
let result = true;
|
|
const remainingComparators = comparators.slice();
|
|
let testComparator = remainingComparators.pop();
|
|
while (result && remainingComparators.length) {
|
|
result = remainingComparators.every((otherComparator) => {
|
|
return testComparator.intersects(otherComparator, options2);
|
|
});
|
|
testComparator = remainingComparators.pop();
|
|
}
|
|
return result;
|
|
};
|
|
var parseComparator = (comp, options2) => {
|
|
debug("comp", comp, options2);
|
|
comp = replaceCarets(comp, options2);
|
|
debug("caret", comp);
|
|
comp = replaceTildes(comp, options2);
|
|
debug("tildes", comp);
|
|
comp = replaceXRanges(comp, options2);
|
|
debug("xrange", comp);
|
|
comp = replaceStars(comp, options2);
|
|
debug("stars", comp);
|
|
return comp;
|
|
};
|
|
var isX = (id) => !id || id.toLowerCase() === "x" || id === "*";
|
|
var replaceTildes = (comp, options2) => {
|
|
return comp.trim().split(/\s+/).map((c) => replaceTilde(c, options2)).join(" ");
|
|
};
|
|
var replaceTilde = (comp, options2) => {
|
|
const r = options2.loose ? re[t.TILDELOOSE] : re[t.TILDE];
|
|
return comp.replace(r, (_, M, m, p, pr) => {
|
|
debug("tilde", comp, _, M, m, p, pr);
|
|
let ret;
|
|
if (isX(M)) {
|
|
ret = "";
|
|
} else if (isX(m)) {
|
|
ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
|
|
} else if (isX(p)) {
|
|
ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
|
|
} else if (pr) {
|
|
debug("replaceTilde pr", pr);
|
|
ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
|
|
} else {
|
|
ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`;
|
|
}
|
|
debug("tilde return", ret);
|
|
return ret;
|
|
});
|
|
};
|
|
var replaceCarets = (comp, options2) => {
|
|
return comp.trim().split(/\s+/).map((c) => replaceCaret(c, options2)).join(" ");
|
|
};
|
|
var replaceCaret = (comp, options2) => {
|
|
debug("caret", comp, options2);
|
|
const r = options2.loose ? re[t.CARETLOOSE] : re[t.CARET];
|
|
const z = options2.includePrerelease ? "-0" : "";
|
|
return comp.replace(r, (_, M, m, p, pr) => {
|
|
debug("caret", comp, _, M, m, p, pr);
|
|
let ret;
|
|
if (isX(M)) {
|
|
ret = "";
|
|
} else if (isX(m)) {
|
|
ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
|
|
} else if (isX(p)) {
|
|
if (M === "0") {
|
|
ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
|
|
} else {
|
|
ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`;
|
|
}
|
|
} else if (pr) {
|
|
debug("replaceCaret pr", pr);
|
|
if (M === "0") {
|
|
if (m === "0") {
|
|
ret = `>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p + 1}-0`;
|
|
} else {
|
|
ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
|
|
}
|
|
} else {
|
|
ret = `>=${M}.${m}.${p}-${pr} <${+M + 1}.0.0-0`;
|
|
}
|
|
} else {
|
|
debug("no pr");
|
|
if (M === "0") {
|
|
if (m === "0") {
|
|
ret = `>=${M}.${m}.${p}${z} <${M}.${m}.${+p + 1}-0`;
|
|
} else {
|
|
ret = `>=${M}.${m}.${p}${z} <${M}.${+m + 1}.0-0`;
|
|
}
|
|
} else {
|
|
ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
|
|
}
|
|
}
|
|
debug("caret return", ret);
|
|
return ret;
|
|
});
|
|
};
|
|
var replaceXRanges = (comp, options2) => {
|
|
debug("replaceXRanges", comp, options2);
|
|
return comp.split(/\s+/).map((c) => replaceXRange(c, options2)).join(" ");
|
|
};
|
|
var replaceXRange = (comp, options2) => {
|
|
comp = comp.trim();
|
|
const r = options2.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
|
|
return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
|
|
debug("xRange", comp, ret, gtlt, M, m, p, pr);
|
|
const xM = isX(M);
|
|
const xm = xM || isX(m);
|
|
const xp = xm || isX(p);
|
|
const anyX = xp;
|
|
if (gtlt === "=" && anyX) {
|
|
gtlt = "";
|
|
}
|
|
pr = options2.includePrerelease ? "-0" : "";
|
|
if (xM) {
|
|
if (gtlt === ">" || gtlt === "<") {
|
|
ret = "<0.0.0-0";
|
|
} else {
|
|
ret = "*";
|
|
}
|
|
} else if (gtlt && anyX) {
|
|
if (xm) {
|
|
m = 0;
|
|
}
|
|
p = 0;
|
|
if (gtlt === ">") {
|
|
gtlt = ">=";
|
|
if (xm) {
|
|
M = +M + 1;
|
|
m = 0;
|
|
p = 0;
|
|
} else {
|
|
m = +m + 1;
|
|
p = 0;
|
|
}
|
|
} else if (gtlt === "<=") {
|
|
gtlt = "<";
|
|
if (xm) {
|
|
M = +M + 1;
|
|
} else {
|
|
m = +m + 1;
|
|
}
|
|
}
|
|
if (gtlt === "<") {
|
|
pr = "-0";
|
|
}
|
|
ret = `${gtlt + M}.${m}.${p}${pr}`;
|
|
} else if (xm) {
|
|
ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`;
|
|
} else if (xp) {
|
|
ret = `>=${M}.${m}.0${pr} <${M}.${+m + 1}.0-0`;
|
|
}
|
|
debug("xRange return", ret);
|
|
return ret;
|
|
});
|
|
};
|
|
var replaceStars = (comp, options2) => {
|
|
debug("replaceStars", comp, options2);
|
|
return comp.trim().replace(re[t.STAR], "");
|
|
};
|
|
var replaceGTE0 = (comp, options2) => {
|
|
debug("replaceGTE0", comp, options2);
|
|
return comp.trim().replace(re[options2.includePrerelease ? t.GTE0PRE : t.GTE0], "");
|
|
};
|
|
var hyphenReplace = (incPr) => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr) => {
|
|
if (isX(fM)) {
|
|
from = "";
|
|
} else if (isX(fm)) {
|
|
from = `>=${fM}.0.0${incPr ? "-0" : ""}`;
|
|
} else if (isX(fp)) {
|
|
from = `>=${fM}.${fm}.0${incPr ? "-0" : ""}`;
|
|
} else if (fpr) {
|
|
from = `>=${from}`;
|
|
} else {
|
|
from = `>=${from}${incPr ? "-0" : ""}`;
|
|
}
|
|
if (isX(tM)) {
|
|
to = "";
|
|
} else if (isX(tm)) {
|
|
to = `<${+tM + 1}.0.0-0`;
|
|
} else if (isX(tp)) {
|
|
to = `<${tM}.${+tm + 1}.0-0`;
|
|
} else if (tpr) {
|
|
to = `<=${tM}.${tm}.${tp}-${tpr}`;
|
|
} else if (incPr) {
|
|
to = `<${tM}.${tm}.${+tp + 1}-0`;
|
|
} else {
|
|
to = `<=${to}`;
|
|
}
|
|
return `${from} ${to}`.trim();
|
|
};
|
|
var testSet = (set, version2, options2) => {
|
|
for (let i = 0;i < set.length; i++) {
|
|
if (!set[i].test(version2)) {
|
|
return false;
|
|
}
|
|
}
|
|
if (version2.prerelease.length && !options2.includePrerelease) {
|
|
for (let i = 0;i < set.length; i++) {
|
|
debug(set[i].semver);
|
|
if (set[i].semver === Comparator.ANY) {
|
|
continue;
|
|
}
|
|
if (set[i].semver.prerelease.length > 0) {
|
|
const allowed = set[i].semver;
|
|
if (allowed.major === version2.major && allowed.minor === version2.minor && allowed.patch === version2.patch) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/semver/classes/comparator.js
|
|
var require_comparator = __commonJS((exports, module) => {
|
|
var ANY = Symbol("SemVer ANY");
|
|
|
|
class Comparator {
|
|
static get ANY() {
|
|
return ANY;
|
|
}
|
|
constructor(comp, options2) {
|
|
options2 = parseOptions(options2);
|
|
if (comp instanceof Comparator) {
|
|
if (comp.loose === !!options2.loose) {
|
|
return comp;
|
|
} else {
|
|
comp = comp.value;
|
|
}
|
|
}
|
|
comp = comp.trim().split(/\s+/).join(" ");
|
|
debug("comparator", comp, options2);
|
|
this.options = options2;
|
|
this.loose = !!options2.loose;
|
|
this.parse(comp);
|
|
if (this.semver === ANY) {
|
|
this.value = "";
|
|
} else {
|
|
this.value = this.operator + this.semver.version;
|
|
}
|
|
debug("comp", this);
|
|
}
|
|
parse(comp) {
|
|
const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];
|
|
const m = comp.match(r);
|
|
if (!m) {
|
|
throw new TypeError(`Invalid comparator: ${comp}`);
|
|
}
|
|
this.operator = m[1] !== undefined ? m[1] : "";
|
|
if (this.operator === "=") {
|
|
this.operator = "";
|
|
}
|
|
if (!m[2]) {
|
|
this.semver = ANY;
|
|
} else {
|
|
this.semver = new SemVer(m[2], this.options.loose);
|
|
}
|
|
}
|
|
toString() {
|
|
return this.value;
|
|
}
|
|
test(version2) {
|
|
debug("Comparator.test", version2, this.options.loose);
|
|
if (this.semver === ANY || version2 === ANY) {
|
|
return true;
|
|
}
|
|
if (typeof version2 === "string") {
|
|
try {
|
|
version2 = new SemVer(version2, this.options);
|
|
} catch (er) {
|
|
return false;
|
|
}
|
|
}
|
|
return cmp(version2, this.operator, this.semver, this.options);
|
|
}
|
|
intersects(comp, options2) {
|
|
if (!(comp instanceof Comparator)) {
|
|
throw new TypeError("a Comparator is required");
|
|
}
|
|
if (this.operator === "") {
|
|
if (this.value === "") {
|
|
return true;
|
|
}
|
|
return new Range(comp.value, options2).test(this.value);
|
|
} else if (comp.operator === "") {
|
|
if (comp.value === "") {
|
|
return true;
|
|
}
|
|
return new Range(this.value, options2).test(comp.semver);
|
|
}
|
|
options2 = parseOptions(options2);
|
|
if (options2.includePrerelease && (this.value === "<0.0.0-0" || comp.value === "<0.0.0-0")) {
|
|
return false;
|
|
}
|
|
if (!options2.includePrerelease && (this.value.startsWith("<0.0.0") || comp.value.startsWith("<0.0.0"))) {
|
|
return false;
|
|
}
|
|
if (this.operator.startsWith(">") && comp.operator.startsWith(">")) {
|
|
return true;
|
|
}
|
|
if (this.operator.startsWith("<") && comp.operator.startsWith("<")) {
|
|
return true;
|
|
}
|
|
if (this.semver.version === comp.semver.version && this.operator.includes("=") && comp.operator.includes("=")) {
|
|
return true;
|
|
}
|
|
if (cmp(this.semver, "<", comp.semver, options2) && this.operator.startsWith(">") && comp.operator.startsWith("<")) {
|
|
return true;
|
|
}
|
|
if (cmp(this.semver, ">", comp.semver, options2) && this.operator.startsWith("<") && comp.operator.startsWith(">")) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
module.exports = Comparator;
|
|
var parseOptions = require_parse_options();
|
|
var { safeRe: re, t } = require_re();
|
|
var cmp = require_cmp();
|
|
var debug = require_debug();
|
|
var SemVer = require_semver();
|
|
var Range = require_range();
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/satisfies.js
|
|
var require_satisfies = __commonJS((exports, module) => {
|
|
var Range = require_range();
|
|
var satisfies = (version2, range, options2) => {
|
|
try {
|
|
range = new Range(range, options2);
|
|
} catch (er) {
|
|
return false;
|
|
}
|
|
return range.test(version2);
|
|
};
|
|
module.exports = satisfies;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/to-comparators.js
|
|
var require_to_comparators = __commonJS((exports, module) => {
|
|
var Range = require_range();
|
|
var toComparators = (range, options2) => new Range(range, options2).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" "));
|
|
module.exports = toComparators;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/max-satisfying.js
|
|
var require_max_satisfying = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var Range = require_range();
|
|
var maxSatisfying = (versions, range, options2) => {
|
|
let max = null;
|
|
let maxSV = null;
|
|
let rangeObj = null;
|
|
try {
|
|
rangeObj = new Range(range, options2);
|
|
} catch (er) {
|
|
return null;
|
|
}
|
|
versions.forEach((v) => {
|
|
if (rangeObj.test(v)) {
|
|
if (!max || maxSV.compare(v) === -1) {
|
|
max = v;
|
|
maxSV = new SemVer(max, options2);
|
|
}
|
|
}
|
|
});
|
|
return max;
|
|
};
|
|
module.exports = maxSatisfying;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/min-satisfying.js
|
|
var require_min_satisfying = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var Range = require_range();
|
|
var minSatisfying = (versions, range, options2) => {
|
|
let min = null;
|
|
let minSV = null;
|
|
let rangeObj = null;
|
|
try {
|
|
rangeObj = new Range(range, options2);
|
|
} catch (er) {
|
|
return null;
|
|
}
|
|
versions.forEach((v) => {
|
|
if (rangeObj.test(v)) {
|
|
if (!min || minSV.compare(v) === 1) {
|
|
min = v;
|
|
minSV = new SemVer(min, options2);
|
|
}
|
|
}
|
|
});
|
|
return min;
|
|
};
|
|
module.exports = minSatisfying;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/min-version.js
|
|
var require_min_version = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var Range = require_range();
|
|
var gt2 = require_gt();
|
|
var minVersion = (range, loose) => {
|
|
range = new Range(range, loose);
|
|
let minver = new SemVer("0.0.0");
|
|
if (range.test(minver)) {
|
|
return minver;
|
|
}
|
|
minver = new SemVer("0.0.0-0");
|
|
if (range.test(minver)) {
|
|
return minver;
|
|
}
|
|
minver = null;
|
|
for (let i = 0;i < range.set.length; ++i) {
|
|
const comparators = range.set[i];
|
|
let setMin = null;
|
|
comparators.forEach((comparator) => {
|
|
const compver = new SemVer(comparator.semver.version);
|
|
switch (comparator.operator) {
|
|
case ">":
|
|
if (compver.prerelease.length === 0) {
|
|
compver.patch++;
|
|
} else {
|
|
compver.prerelease.push(0);
|
|
}
|
|
compver.raw = compver.format();
|
|
case "":
|
|
case ">=":
|
|
if (!setMin || gt2(compver, setMin)) {
|
|
setMin = compver;
|
|
}
|
|
break;
|
|
case "<":
|
|
case "<=":
|
|
break;
|
|
default:
|
|
throw new Error(`Unexpected operation: ${comparator.operator}`);
|
|
}
|
|
});
|
|
if (setMin && (!minver || gt2(minver, setMin))) {
|
|
minver = setMin;
|
|
}
|
|
}
|
|
if (minver && range.test(minver)) {
|
|
return minver;
|
|
}
|
|
return null;
|
|
};
|
|
module.exports = minVersion;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/valid.js
|
|
var require_valid2 = __commonJS((exports, module) => {
|
|
var Range = require_range();
|
|
var validRange = (range, options2) => {
|
|
try {
|
|
return new Range(range, options2).range || "*";
|
|
} catch (er) {
|
|
return null;
|
|
}
|
|
};
|
|
module.exports = validRange;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/outside.js
|
|
var require_outside = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var Comparator = require_comparator();
|
|
var { ANY } = Comparator;
|
|
var Range = require_range();
|
|
var satisfies = require_satisfies();
|
|
var gt2 = require_gt();
|
|
var lt2 = require_lt();
|
|
var lte2 = require_lte();
|
|
var gte2 = require_gte();
|
|
var outside = (version2, range, hilo, options2) => {
|
|
version2 = new SemVer(version2, options2);
|
|
range = new Range(range, options2);
|
|
let gtfn, ltefn, ltfn, comp, ecomp;
|
|
switch (hilo) {
|
|
case ">":
|
|
gtfn = gt2;
|
|
ltefn = lte2;
|
|
ltfn = lt2;
|
|
comp = ">";
|
|
ecomp = ">=";
|
|
break;
|
|
case "<":
|
|
gtfn = lt2;
|
|
ltefn = gte2;
|
|
ltfn = gt2;
|
|
comp = "<";
|
|
ecomp = "<=";
|
|
break;
|
|
default:
|
|
throw new TypeError('Must provide a hilo val of "<" or ">"');
|
|
}
|
|
if (satisfies(version2, range, options2)) {
|
|
return false;
|
|
}
|
|
for (let i = 0;i < range.set.length; ++i) {
|
|
const comparators = range.set[i];
|
|
let high = null;
|
|
let low = null;
|
|
comparators.forEach((comparator) => {
|
|
if (comparator.semver === ANY) {
|
|
comparator = new Comparator(">=0.0.0");
|
|
}
|
|
high = high || comparator;
|
|
low = low || comparator;
|
|
if (gtfn(comparator.semver, high.semver, options2)) {
|
|
high = comparator;
|
|
} else if (ltfn(comparator.semver, low.semver, options2)) {
|
|
low = comparator;
|
|
}
|
|
});
|
|
if (high.operator === comp || high.operator === ecomp) {
|
|
return false;
|
|
}
|
|
if ((!low.operator || low.operator === comp) && ltefn(version2, low.semver)) {
|
|
return false;
|
|
} else if (low.operator === ecomp && ltfn(version2, low.semver)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
module.exports = outside;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/gtr.js
|
|
var require_gtr = __commonJS((exports, module) => {
|
|
var outside = require_outside();
|
|
var gtr = (version2, range, options2) => outside(version2, range, ">", options2);
|
|
module.exports = gtr;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/ltr.js
|
|
var require_ltr = __commonJS((exports, module) => {
|
|
var outside = require_outside();
|
|
var ltr = (version2, range, options2) => outside(version2, range, "<", options2);
|
|
module.exports = ltr;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/intersects.js
|
|
var require_intersects = __commonJS((exports, module) => {
|
|
var Range = require_range();
|
|
var intersects = (r1, r2, options2) => {
|
|
r1 = new Range(r1, options2);
|
|
r2 = new Range(r2, options2);
|
|
return r1.intersects(r2, options2);
|
|
};
|
|
module.exports = intersects;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/simplify.js
|
|
var require_simplify = __commonJS((exports, module) => {
|
|
var satisfies = require_satisfies();
|
|
var compare = require_compare();
|
|
module.exports = (versions, range, options2) => {
|
|
const set = [];
|
|
let first = null;
|
|
let prev = null;
|
|
const v = versions.sort((a, b) => compare(a, b, options2));
|
|
for (const version2 of v) {
|
|
const included = satisfies(version2, range, options2);
|
|
if (included) {
|
|
prev = version2;
|
|
if (!first) {
|
|
first = version2;
|
|
}
|
|
} else {
|
|
if (prev) {
|
|
set.push([first, prev]);
|
|
}
|
|
prev = null;
|
|
first = null;
|
|
}
|
|
}
|
|
if (first) {
|
|
set.push([first, null]);
|
|
}
|
|
const ranges = [];
|
|
for (const [min, max] of set) {
|
|
if (min === max) {
|
|
ranges.push(min);
|
|
} else if (!max && min === v[0]) {
|
|
ranges.push("*");
|
|
} else if (!max) {
|
|
ranges.push(`>=${min}`);
|
|
} else if (min === v[0]) {
|
|
ranges.push(`<=${max}`);
|
|
} else {
|
|
ranges.push(`${min} - ${max}`);
|
|
}
|
|
}
|
|
const simplified = ranges.join(" || ");
|
|
const original = typeof range.raw === "string" ? range.raw : String(range);
|
|
return simplified.length < original.length ? simplified : range;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/subset.js
|
|
var require_subset = __commonJS((exports, module) => {
|
|
var Range = require_range();
|
|
var Comparator = require_comparator();
|
|
var { ANY } = Comparator;
|
|
var satisfies = require_satisfies();
|
|
var compare = require_compare();
|
|
var subset = (sub, dom, options2 = {}) => {
|
|
if (sub === dom) {
|
|
return true;
|
|
}
|
|
sub = new Range(sub, options2);
|
|
dom = new Range(dom, options2);
|
|
let sawNonNull = false;
|
|
OUTER:
|
|
for (const simpleSub of sub.set) {
|
|
for (const simpleDom of dom.set) {
|
|
const isSub = simpleSubset(simpleSub, simpleDom, options2);
|
|
sawNonNull = sawNonNull || isSub !== null;
|
|
if (isSub) {
|
|
continue OUTER;
|
|
}
|
|
}
|
|
if (sawNonNull) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
var minimumVersionWithPreRelease = [new Comparator(">=0.0.0-0")];
|
|
var minimumVersion = [new Comparator(">=0.0.0")];
|
|
var simpleSubset = (sub, dom, options2) => {
|
|
if (sub === dom) {
|
|
return true;
|
|
}
|
|
if (sub.length === 1 && sub[0].semver === ANY) {
|
|
if (dom.length === 1 && dom[0].semver === ANY) {
|
|
return true;
|
|
} else if (options2.includePrerelease) {
|
|
sub = minimumVersionWithPreRelease;
|
|
} else {
|
|
sub = minimumVersion;
|
|
}
|
|
}
|
|
if (dom.length === 1 && dom[0].semver === ANY) {
|
|
if (options2.includePrerelease) {
|
|
return true;
|
|
} else {
|
|
dom = minimumVersion;
|
|
}
|
|
}
|
|
const eqSet = new Set;
|
|
let gt2, lt2;
|
|
for (const c of sub) {
|
|
if (c.operator === ">" || c.operator === ">=") {
|
|
gt2 = higherGT(gt2, c, options2);
|
|
} else if (c.operator === "<" || c.operator === "<=") {
|
|
lt2 = lowerLT(lt2, c, options2);
|
|
} else {
|
|
eqSet.add(c.semver);
|
|
}
|
|
}
|
|
if (eqSet.size > 1) {
|
|
return null;
|
|
}
|
|
let gtltComp;
|
|
if (gt2 && lt2) {
|
|
gtltComp = compare(gt2.semver, lt2.semver, options2);
|
|
if (gtltComp > 0) {
|
|
return null;
|
|
} else if (gtltComp === 0 && (gt2.operator !== ">=" || lt2.operator !== "<=")) {
|
|
return null;
|
|
}
|
|
}
|
|
for (const eq2 of eqSet) {
|
|
if (gt2 && !satisfies(eq2, String(gt2), options2)) {
|
|
return null;
|
|
}
|
|
if (lt2 && !satisfies(eq2, String(lt2), options2)) {
|
|
return null;
|
|
}
|
|
for (const c of dom) {
|
|
if (!satisfies(eq2, String(c), options2)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
let higher, lower;
|
|
let hasDomLT, hasDomGT;
|
|
let needDomLTPre = lt2 && !options2.includePrerelease && lt2.semver.prerelease.length ? lt2.semver : false;
|
|
let needDomGTPre = gt2 && !options2.includePrerelease && gt2.semver.prerelease.length ? gt2.semver : false;
|
|
if (needDomLTPre && needDomLTPre.prerelease.length === 1 && lt2.operator === "<" && needDomLTPre.prerelease[0] === 0) {
|
|
needDomLTPre = false;
|
|
}
|
|
for (const c of dom) {
|
|
hasDomGT = hasDomGT || c.operator === ">" || c.operator === ">=";
|
|
hasDomLT = hasDomLT || c.operator === "<" || c.operator === "<=";
|
|
if (gt2) {
|
|
if (needDomGTPre) {
|
|
if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomGTPre.major && c.semver.minor === needDomGTPre.minor && c.semver.patch === needDomGTPre.patch) {
|
|
needDomGTPre = false;
|
|
}
|
|
}
|
|
if (c.operator === ">" || c.operator === ">=") {
|
|
higher = higherGT(gt2, c, options2);
|
|
if (higher === c && higher !== gt2) {
|
|
return false;
|
|
}
|
|
} else if (gt2.operator === ">=" && !satisfies(gt2.semver, String(c), options2)) {
|
|
return false;
|
|
}
|
|
}
|
|
if (lt2) {
|
|
if (needDomLTPre) {
|
|
if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomLTPre.major && c.semver.minor === needDomLTPre.minor && c.semver.patch === needDomLTPre.patch) {
|
|
needDomLTPre = false;
|
|
}
|
|
}
|
|
if (c.operator === "<" || c.operator === "<=") {
|
|
lower = lowerLT(lt2, c, options2);
|
|
if (lower === c && lower !== lt2) {
|
|
return false;
|
|
}
|
|
} else if (lt2.operator === "<=" && !satisfies(lt2.semver, String(c), options2)) {
|
|
return false;
|
|
}
|
|
}
|
|
if (!c.operator && (lt2 || gt2) && gtltComp !== 0) {
|
|
return false;
|
|
}
|
|
}
|
|
if (gt2 && hasDomLT && !lt2 && gtltComp !== 0) {
|
|
return false;
|
|
}
|
|
if (lt2 && hasDomGT && !gt2 && gtltComp !== 0) {
|
|
return false;
|
|
}
|
|
if (needDomGTPre || needDomLTPre) {
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
var higherGT = (a, b, options2) => {
|
|
if (!a) {
|
|
return b;
|
|
}
|
|
const comp = compare(a.semver, b.semver, options2);
|
|
return comp > 0 ? a : comp < 0 ? b : b.operator === ">" && a.operator === ">=" ? b : a;
|
|
};
|
|
var lowerLT = (a, b, options2) => {
|
|
if (!a) {
|
|
return b;
|
|
}
|
|
const comp = compare(a.semver, b.semver, options2);
|
|
return comp < 0 ? a : comp > 0 ? b : b.operator === "<" && a.operator === "<=" ? b : a;
|
|
};
|
|
module.exports = subset;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/index.js
|
|
var require_semver2 = __commonJS((exports, module) => {
|
|
var internalRe = require_re();
|
|
var constants = require_constants();
|
|
var SemVer = require_semver();
|
|
var identifiers = require_identifiers();
|
|
var parse = require_parse();
|
|
var valid = require_valid();
|
|
var clean = require_clean();
|
|
var inc = require_inc();
|
|
var diff = require_diff();
|
|
var major = require_major();
|
|
var minor = require_minor();
|
|
var patch = require_patch();
|
|
var prerelease = require_prerelease();
|
|
var compare = require_compare();
|
|
var rcompare = require_rcompare();
|
|
var compareLoose = require_compare_loose();
|
|
var compareBuild = require_compare_build();
|
|
var sort = require_sort();
|
|
var rsort = require_rsort();
|
|
var gt2 = require_gt();
|
|
var lt2 = require_lt();
|
|
var eq2 = require_eq();
|
|
var neq = require_neq();
|
|
var gte2 = require_gte();
|
|
var lte2 = require_lte();
|
|
var cmp = require_cmp();
|
|
var coerce = require_coerce();
|
|
var Comparator = require_comparator();
|
|
var Range = require_range();
|
|
var satisfies = require_satisfies();
|
|
var toComparators = require_to_comparators();
|
|
var maxSatisfying = require_max_satisfying();
|
|
var minSatisfying = require_min_satisfying();
|
|
var minVersion = require_min_version();
|
|
var validRange = require_valid2();
|
|
var outside = require_outside();
|
|
var gtr = require_gtr();
|
|
var ltr = require_ltr();
|
|
var intersects = require_intersects();
|
|
var simplifyRange = require_simplify();
|
|
var subset = require_subset();
|
|
module.exports = {
|
|
parse,
|
|
valid,
|
|
clean,
|
|
inc,
|
|
diff,
|
|
major,
|
|
minor,
|
|
patch,
|
|
prerelease,
|
|
compare,
|
|
rcompare,
|
|
compareLoose,
|
|
compareBuild,
|
|
sort,
|
|
rsort,
|
|
gt: gt2,
|
|
lt: lt2,
|
|
eq: eq2,
|
|
neq,
|
|
gte: gte2,
|
|
lte: lte2,
|
|
cmp,
|
|
coerce,
|
|
Comparator,
|
|
Range,
|
|
satisfies,
|
|
toComparators,
|
|
maxSatisfying,
|
|
minSatisfying,
|
|
minVersion,
|
|
validRange,
|
|
outside,
|
|
gtr,
|
|
ltr,
|
|
intersects,
|
|
simplifyRange,
|
|
subset,
|
|
SemVer,
|
|
re: internalRe.re,
|
|
src: internalRe.src,
|
|
tokens: internalRe.t,
|
|
SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,
|
|
RELEASE_TYPES: constants.RELEASE_TYPES,
|
|
compareIdentifiers: identifiers.compareIdentifiers,
|
|
rcompareIdentifiers: identifiers.rcompareIdentifiers
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/asymmetricKeyDetailsSupported.js
|
|
var require_asymmetricKeyDetailsSupported = __commonJS((exports, module) => {
|
|
var semver = require_semver2();
|
|
module.exports = semver.satisfies(process.version, ">=15.7.0");
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/rsaPssKeyDetailsSupported.js
|
|
var require_rsaPssKeyDetailsSupported = __commonJS((exports, module) => {
|
|
var semver = require_semver2();
|
|
module.exports = semver.satisfies(process.version, ">=16.9.0");
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/validateAsymmetricKey.js
|
|
var require_validateAsymmetricKey = __commonJS((exports, module) => {
|
|
var ASYMMETRIC_KEY_DETAILS_SUPPORTED = require_asymmetricKeyDetailsSupported();
|
|
var RSA_PSS_KEY_DETAILS_SUPPORTED = require_rsaPssKeyDetailsSupported();
|
|
var allowedAlgorithmsForKeys = {
|
|
ec: ["ES256", "ES384", "ES512"],
|
|
rsa: ["RS256", "PS256", "RS384", "PS384", "RS512", "PS512"],
|
|
"rsa-pss": ["PS256", "PS384", "PS512"]
|
|
};
|
|
var allowedCurves = {
|
|
ES256: "prime256v1",
|
|
ES384: "secp384r1",
|
|
ES512: "secp521r1"
|
|
};
|
|
module.exports = function(algorithm, key) {
|
|
if (!algorithm || !key)
|
|
return;
|
|
const keyType = key.asymmetricKeyType;
|
|
if (!keyType)
|
|
return;
|
|
const allowedAlgorithms = allowedAlgorithmsForKeys[keyType];
|
|
if (!allowedAlgorithms) {
|
|
throw new Error(`Unknown key type "${keyType}".`);
|
|
}
|
|
if (!allowedAlgorithms.includes(algorithm)) {
|
|
throw new Error(`"alg" parameter for "${keyType}" key type must be one of: ${allowedAlgorithms.join(", ")}.`);
|
|
}
|
|
if (ASYMMETRIC_KEY_DETAILS_SUPPORTED) {
|
|
switch (keyType) {
|
|
case "ec":
|
|
const keyCurve = key.asymmetricKeyDetails.namedCurve;
|
|
const allowedCurve = allowedCurves[algorithm];
|
|
if (keyCurve !== allowedCurve) {
|
|
throw new Error(`"alg" parameter "${algorithm}" requires curve "${allowedCurve}".`);
|
|
}
|
|
break;
|
|
case "rsa-pss":
|
|
if (RSA_PSS_KEY_DETAILS_SUPPORTED) {
|
|
const length = parseInt(algorithm.slice(-3), 10);
|
|
const { hashAlgorithm, mgf1HashAlgorithm, saltLength } = key.asymmetricKeyDetails;
|
|
if (hashAlgorithm !== `sha${length}` || mgf1HashAlgorithm !== hashAlgorithm) {
|
|
throw new Error(`Invalid key for this operation, its RSA-PSS parameters do not meet the requirements of "alg" ${algorithm}.`);
|
|
}
|
|
if (saltLength !== undefined && saltLength > length >> 3) {
|
|
throw new Error(`Invalid key for this operation, its RSA-PSS parameter saltLength does not meet the requirements of "alg" ${algorithm}.`);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/psSupported.js
|
|
var require_psSupported = __commonJS((exports, module) => {
|
|
var semver = require_semver2();
|
|
module.exports = semver.satisfies(process.version, "^6.12.0 || >=8.0.0");
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/verify.js
|
|
var require_verify = __commonJS((exports, module) => {
|
|
var JsonWebTokenError = require_JsonWebTokenError();
|
|
var NotBeforeError = require_NotBeforeError();
|
|
var TokenExpiredError = require_TokenExpiredError();
|
|
var decode = require_decode();
|
|
var timespan = require_timespan();
|
|
var validateAsymmetricKey = require_validateAsymmetricKey();
|
|
var PS_SUPPORTED = require_psSupported();
|
|
var jws = require_jws();
|
|
var { KeyObject, createSecretKey, createPublicKey } = __require("crypto");
|
|
var PUB_KEY_ALGS = ["RS256", "RS384", "RS512"];
|
|
var EC_KEY_ALGS = ["ES256", "ES384", "ES512"];
|
|
var RSA_KEY_ALGS = ["RS256", "RS384", "RS512"];
|
|
var HS_ALGS = ["HS256", "HS384", "HS512"];
|
|
if (PS_SUPPORTED) {
|
|
PUB_KEY_ALGS.splice(PUB_KEY_ALGS.length, 0, "PS256", "PS384", "PS512");
|
|
RSA_KEY_ALGS.splice(RSA_KEY_ALGS.length, 0, "PS256", "PS384", "PS512");
|
|
}
|
|
module.exports = function(jwtString, secretOrPublicKey, options2, callback) {
|
|
if (typeof options2 === "function" && !callback) {
|
|
callback = options2;
|
|
options2 = {};
|
|
}
|
|
if (!options2) {
|
|
options2 = {};
|
|
}
|
|
options2 = Object.assign({}, options2);
|
|
let done;
|
|
if (callback) {
|
|
done = callback;
|
|
} else {
|
|
done = function(err, data) {
|
|
if (err)
|
|
throw err;
|
|
return data;
|
|
};
|
|
}
|
|
if (options2.clockTimestamp && typeof options2.clockTimestamp !== "number") {
|
|
return done(new JsonWebTokenError("clockTimestamp must be a number"));
|
|
}
|
|
if (options2.nonce !== undefined && (typeof options2.nonce !== "string" || options2.nonce.trim() === "")) {
|
|
return done(new JsonWebTokenError("nonce must be a non-empty string"));
|
|
}
|
|
if (options2.allowInvalidAsymmetricKeyTypes !== undefined && typeof options2.allowInvalidAsymmetricKeyTypes !== "boolean") {
|
|
return done(new JsonWebTokenError("allowInvalidAsymmetricKeyTypes must be a boolean"));
|
|
}
|
|
const clockTimestamp = options2.clockTimestamp || Math.floor(Date.now() / 1000);
|
|
if (!jwtString) {
|
|
return done(new JsonWebTokenError("jwt must be provided"));
|
|
}
|
|
if (typeof jwtString !== "string") {
|
|
return done(new JsonWebTokenError("jwt must be a string"));
|
|
}
|
|
const parts = jwtString.split(".");
|
|
if (parts.length !== 3) {
|
|
return done(new JsonWebTokenError("jwt malformed"));
|
|
}
|
|
let decodedToken;
|
|
try {
|
|
decodedToken = decode(jwtString, { complete: true });
|
|
} catch (err) {
|
|
return done(err);
|
|
}
|
|
if (!decodedToken) {
|
|
return done(new JsonWebTokenError("invalid token"));
|
|
}
|
|
const header = decodedToken.header;
|
|
let getSecret;
|
|
if (typeof secretOrPublicKey === "function") {
|
|
if (!callback) {
|
|
return done(new JsonWebTokenError("verify must be called asynchronous if secret or public key is provided as a callback"));
|
|
}
|
|
getSecret = secretOrPublicKey;
|
|
} else {
|
|
getSecret = function(header2, secretCallback) {
|
|
return secretCallback(null, secretOrPublicKey);
|
|
};
|
|
}
|
|
return getSecret(header, function(err, secretOrPublicKey2) {
|
|
if (err) {
|
|
return done(new JsonWebTokenError("error in secret or public key callback: " + err.message));
|
|
}
|
|
const hasSignature = parts[2].trim() !== "";
|
|
if (!hasSignature && secretOrPublicKey2) {
|
|
return done(new JsonWebTokenError("jwt signature is required"));
|
|
}
|
|
if (hasSignature && !secretOrPublicKey2) {
|
|
return done(new JsonWebTokenError("secret or public key must be provided"));
|
|
}
|
|
if (!hasSignature && !options2.algorithms) {
|
|
return done(new JsonWebTokenError('please specify "none" in "algorithms" to verify unsigned tokens'));
|
|
}
|
|
if (secretOrPublicKey2 != null && !(secretOrPublicKey2 instanceof KeyObject)) {
|
|
try {
|
|
secretOrPublicKey2 = createPublicKey(secretOrPublicKey2);
|
|
} catch (_) {
|
|
try {
|
|
secretOrPublicKey2 = createSecretKey(typeof secretOrPublicKey2 === "string" ? Buffer.from(secretOrPublicKey2) : secretOrPublicKey2);
|
|
} catch (_2) {
|
|
return done(new JsonWebTokenError("secretOrPublicKey is not valid key material"));
|
|
}
|
|
}
|
|
}
|
|
if (!options2.algorithms) {
|
|
if (secretOrPublicKey2.type === "secret") {
|
|
options2.algorithms = HS_ALGS;
|
|
} else if (["rsa", "rsa-pss"].includes(secretOrPublicKey2.asymmetricKeyType)) {
|
|
options2.algorithms = RSA_KEY_ALGS;
|
|
} else if (secretOrPublicKey2.asymmetricKeyType === "ec") {
|
|
options2.algorithms = EC_KEY_ALGS;
|
|
} else {
|
|
options2.algorithms = PUB_KEY_ALGS;
|
|
}
|
|
}
|
|
if (options2.algorithms.indexOf(decodedToken.header.alg) === -1) {
|
|
return done(new JsonWebTokenError("invalid algorithm"));
|
|
}
|
|
if (header.alg.startsWith("HS") && secretOrPublicKey2.type !== "secret") {
|
|
return done(new JsonWebTokenError(`secretOrPublicKey must be a symmetric key when using ${header.alg}`));
|
|
} else if (/^(?:RS|PS|ES)/.test(header.alg) && secretOrPublicKey2.type !== "public") {
|
|
return done(new JsonWebTokenError(`secretOrPublicKey must be an asymmetric key when using ${header.alg}`));
|
|
}
|
|
if (!options2.allowInvalidAsymmetricKeyTypes) {
|
|
try {
|
|
validateAsymmetricKey(header.alg, secretOrPublicKey2);
|
|
} catch (e) {
|
|
return done(e);
|
|
}
|
|
}
|
|
let valid;
|
|
try {
|
|
valid = jws.verify(jwtString, decodedToken.header.alg, secretOrPublicKey2);
|
|
} catch (e) {
|
|
return done(e);
|
|
}
|
|
if (!valid) {
|
|
return done(new JsonWebTokenError("invalid signature"));
|
|
}
|
|
const payload = decodedToken.payload;
|
|
if (typeof payload.nbf !== "undefined" && !options2.ignoreNotBefore) {
|
|
if (typeof payload.nbf !== "number") {
|
|
return done(new JsonWebTokenError("invalid nbf value"));
|
|
}
|
|
if (payload.nbf > clockTimestamp + (options2.clockTolerance || 0)) {
|
|
return done(new NotBeforeError("jwt not active", new Date(payload.nbf * 1000)));
|
|
}
|
|
}
|
|
if (typeof payload.exp !== "undefined" && !options2.ignoreExpiration) {
|
|
if (typeof payload.exp !== "number") {
|
|
return done(new JsonWebTokenError("invalid exp value"));
|
|
}
|
|
if (clockTimestamp >= payload.exp + (options2.clockTolerance || 0)) {
|
|
return done(new TokenExpiredError("jwt expired", new Date(payload.exp * 1000)));
|
|
}
|
|
}
|
|
if (options2.audience) {
|
|
const audiences = Array.isArray(options2.audience) ? options2.audience : [options2.audience];
|
|
const target = Array.isArray(payload.aud) ? payload.aud : [payload.aud];
|
|
const match = target.some(function(targetAudience) {
|
|
return audiences.some(function(audience) {
|
|
return audience instanceof RegExp ? audience.test(targetAudience) : audience === targetAudience;
|
|
});
|
|
});
|
|
if (!match) {
|
|
return done(new JsonWebTokenError("jwt audience invalid. expected: " + audiences.join(" or ")));
|
|
}
|
|
}
|
|
if (options2.issuer) {
|
|
const invalid_issuer = typeof options2.issuer === "string" && payload.iss !== options2.issuer || Array.isArray(options2.issuer) && options2.issuer.indexOf(payload.iss) === -1;
|
|
if (invalid_issuer) {
|
|
return done(new JsonWebTokenError("jwt issuer invalid. expected: " + options2.issuer));
|
|
}
|
|
}
|
|
if (options2.subject) {
|
|
if (payload.sub !== options2.subject) {
|
|
return done(new JsonWebTokenError("jwt subject invalid. expected: " + options2.subject));
|
|
}
|
|
}
|
|
if (options2.jwtid) {
|
|
if (payload.jti !== options2.jwtid) {
|
|
return done(new JsonWebTokenError("jwt jwtid invalid. expected: " + options2.jwtid));
|
|
}
|
|
}
|
|
if (options2.nonce) {
|
|
if (payload.nonce !== options2.nonce) {
|
|
return done(new JsonWebTokenError("jwt nonce invalid. expected: " + options2.nonce));
|
|
}
|
|
}
|
|
if (options2.maxAge) {
|
|
if (typeof payload.iat !== "number") {
|
|
return done(new JsonWebTokenError("iat required when maxAge is specified"));
|
|
}
|
|
const maxAgeTimestamp = timespan(options2.maxAge, payload.iat);
|
|
if (typeof maxAgeTimestamp === "undefined") {
|
|
return done(new JsonWebTokenError('"maxAge" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
|
|
}
|
|
if (clockTimestamp >= maxAgeTimestamp + (options2.clockTolerance || 0)) {
|
|
return done(new TokenExpiredError("maxAge exceeded", new Date(maxAgeTimestamp * 1000)));
|
|
}
|
|
}
|
|
if (options2.complete === true) {
|
|
const signature = decodedToken.signature;
|
|
return done(null, {
|
|
header,
|
|
payload,
|
|
signature
|
|
});
|
|
}
|
|
return done(null, payload);
|
|
});
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/lodash.includes/index.js
|
|
var require_lodash = __commonJS((exports, module) => {
|
|
var INFINITY = 1 / 0;
|
|
var MAX_SAFE_INTEGER = 9007199254740991;
|
|
var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
|
var NAN = 0 / 0;
|
|
var argsTag = "[object Arguments]";
|
|
var funcTag = "[object Function]";
|
|
var genTag = "[object GeneratorFunction]";
|
|
var stringTag = "[object String]";
|
|
var symbolTag = "[object Symbol]";
|
|
var reTrim = /^\s+|\s+$/g;
|
|
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
|
|
var reIsBinary = /^0b[01]+$/i;
|
|
var reIsOctal = /^0o[0-7]+$/i;
|
|
var reIsUint = /^(?:0|[1-9]\d*)$/;
|
|
var freeParseInt = parseInt;
|
|
function arrayMap(array, iteratee) {
|
|
var index2 = -1, length = array ? array.length : 0, result = Array(length);
|
|
while (++index2 < length) {
|
|
result[index2] = iteratee(array[index2], index2, array);
|
|
}
|
|
return result;
|
|
}
|
|
function baseFindIndex(array, predicate, fromIndex, fromRight) {
|
|
var length = array.length, index2 = fromIndex + (fromRight ? 1 : -1);
|
|
while (fromRight ? index2-- : ++index2 < length) {
|
|
if (predicate(array[index2], index2, array)) {
|
|
return index2;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function baseIndexOf(array, value, fromIndex) {
|
|
if (value !== value) {
|
|
return baseFindIndex(array, baseIsNaN, fromIndex);
|
|
}
|
|
var index2 = fromIndex - 1, length = array.length;
|
|
while (++index2 < length) {
|
|
if (array[index2] === value) {
|
|
return index2;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function baseIsNaN(value) {
|
|
return value !== value;
|
|
}
|
|
function baseTimes(n, iteratee) {
|
|
var index2 = -1, result = Array(n);
|
|
while (++index2 < n) {
|
|
result[index2] = iteratee(index2);
|
|
}
|
|
return result;
|
|
}
|
|
function baseValues(object, props) {
|
|
return arrayMap(props, function(key) {
|
|
return object[key];
|
|
});
|
|
}
|
|
function overArg(func, transform) {
|
|
return function(arg) {
|
|
return func(transform(arg));
|
|
};
|
|
}
|
|
var objectProto = Object.prototype;
|
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|
var objectToString = objectProto.toString;
|
|
var propertyIsEnumerable = objectProto.propertyIsEnumerable;
|
|
var nativeKeys = overArg(Object.keys, Object);
|
|
var nativeMax = Math.max;
|
|
function arrayLikeKeys(value, inherited) {
|
|
var result = isArray(value) || isArguments(value) ? baseTimes(value.length, String) : [];
|
|
var length = result.length, skipIndexes = !!length;
|
|
for (var key in value) {
|
|
if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == "length" || isIndex(key, length)))) {
|
|
result.push(key);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function baseKeys(object) {
|
|
if (!isPrototype(object)) {
|
|
return nativeKeys(object);
|
|
}
|
|
var result = [];
|
|
for (var key in Object(object)) {
|
|
if (hasOwnProperty.call(object, key) && key != "constructor") {
|
|
result.push(key);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function isIndex(value, length) {
|
|
length = length == null ? MAX_SAFE_INTEGER : length;
|
|
return !!length && (typeof value == "number" || reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
|
|
}
|
|
function isPrototype(value) {
|
|
var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto;
|
|
return value === proto;
|
|
}
|
|
function includes(collection, value, fromIndex, guard) {
|
|
collection = isArrayLike(collection) ? collection : values(collection);
|
|
fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;
|
|
var length = collection.length;
|
|
if (fromIndex < 0) {
|
|
fromIndex = nativeMax(length + fromIndex, 0);
|
|
}
|
|
return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
|
|
}
|
|
function isArguments(value) {
|
|
return isArrayLikeObject(value) && hasOwnProperty.call(value, "callee") && (!propertyIsEnumerable.call(value, "callee") || objectToString.call(value) == argsTag);
|
|
}
|
|
var isArray = Array.isArray;
|
|
function isArrayLike(value) {
|
|
return value != null && isLength(value.length) && !isFunction(value);
|
|
}
|
|
function isArrayLikeObject(value) {
|
|
return isObjectLike(value) && isArrayLike(value);
|
|
}
|
|
function isFunction(value) {
|
|
var tag = isObject(value) ? objectToString.call(value) : "";
|
|
return tag == funcTag || tag == genTag;
|
|
}
|
|
function isLength(value) {
|
|
return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
|
|
}
|
|
function isObject(value) {
|
|
var type = typeof value;
|
|
return !!value && (type == "object" || type == "function");
|
|
}
|
|
function isObjectLike(value) {
|
|
return !!value && typeof value == "object";
|
|
}
|
|
function isString(value) {
|
|
return typeof value == "string" || !isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag;
|
|
}
|
|
function isSymbol(value) {
|
|
return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
|
|
}
|
|
function toFinite(value) {
|
|
if (!value) {
|
|
return value === 0 ? value : 0;
|
|
}
|
|
value = toNumber(value);
|
|
if (value === INFINITY || value === -INFINITY) {
|
|
var sign = value < 0 ? -1 : 1;
|
|
return sign * MAX_INTEGER;
|
|
}
|
|
return value === value ? value : 0;
|
|
}
|
|
function toInteger(value) {
|
|
var result = toFinite(value), remainder = result % 1;
|
|
return result === result ? remainder ? result - remainder : result : 0;
|
|
}
|
|
function toNumber(value) {
|
|
if (typeof value == "number") {
|
|
return value;
|
|
}
|
|
if (isSymbol(value)) {
|
|
return NAN;
|
|
}
|
|
if (isObject(value)) {
|
|
var other = typeof value.valueOf == "function" ? value.valueOf() : value;
|
|
value = isObject(other) ? other + "" : other;
|
|
}
|
|
if (typeof value != "string") {
|
|
return value === 0 ? value : +value;
|
|
}
|
|
value = value.replace(reTrim, "");
|
|
var isBinary = reIsBinary.test(value);
|
|
return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
|
|
}
|
|
function keys(object) {
|
|
return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
|
|
}
|
|
function values(object) {
|
|
return object ? baseValues(object, keys(object)) : [];
|
|
}
|
|
module.exports = includes;
|
|
});
|
|
|
|
// ../eve/node_modules/lodash.isboolean/index.js
|
|
var require_lodash2 = __commonJS((exports, module) => {
|
|
var boolTag = "[object Boolean]";
|
|
var objectProto = Object.prototype;
|
|
var objectToString = objectProto.toString;
|
|
function isBoolean(value) {
|
|
return value === true || value === false || isObjectLike(value) && objectToString.call(value) == boolTag;
|
|
}
|
|
function isObjectLike(value) {
|
|
return !!value && typeof value == "object";
|
|
}
|
|
module.exports = isBoolean;
|
|
});
|
|
|
|
// ../eve/node_modules/lodash.isinteger/index.js
|
|
var require_lodash3 = __commonJS((exports, module) => {
|
|
var INFINITY = 1 / 0;
|
|
var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
|
var NAN = 0 / 0;
|
|
var symbolTag = "[object Symbol]";
|
|
var reTrim = /^\s+|\s+$/g;
|
|
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
|
|
var reIsBinary = /^0b[01]+$/i;
|
|
var reIsOctal = /^0o[0-7]+$/i;
|
|
var freeParseInt = parseInt;
|
|
var objectProto = Object.prototype;
|
|
var objectToString = objectProto.toString;
|
|
function isInteger(value) {
|
|
return typeof value == "number" && value == toInteger(value);
|
|
}
|
|
function isObject(value) {
|
|
var type = typeof value;
|
|
return !!value && (type == "object" || type == "function");
|
|
}
|
|
function isObjectLike(value) {
|
|
return !!value && typeof value == "object";
|
|
}
|
|
function isSymbol(value) {
|
|
return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
|
|
}
|
|
function toFinite(value) {
|
|
if (!value) {
|
|
return value === 0 ? value : 0;
|
|
}
|
|
value = toNumber(value);
|
|
if (value === INFINITY || value === -INFINITY) {
|
|
var sign = value < 0 ? -1 : 1;
|
|
return sign * MAX_INTEGER;
|
|
}
|
|
return value === value ? value : 0;
|
|
}
|
|
function toInteger(value) {
|
|
var result = toFinite(value), remainder = result % 1;
|
|
return result === result ? remainder ? result - remainder : result : 0;
|
|
}
|
|
function toNumber(value) {
|
|
if (typeof value == "number") {
|
|
return value;
|
|
}
|
|
if (isSymbol(value)) {
|
|
return NAN;
|
|
}
|
|
if (isObject(value)) {
|
|
var other = typeof value.valueOf == "function" ? value.valueOf() : value;
|
|
value = isObject(other) ? other + "" : other;
|
|
}
|
|
if (typeof value != "string") {
|
|
return value === 0 ? value : +value;
|
|
}
|
|
value = value.replace(reTrim, "");
|
|
var isBinary = reIsBinary.test(value);
|
|
return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
|
|
}
|
|
module.exports = isInteger;
|
|
});
|
|
|
|
// ../eve/node_modules/lodash.isnumber/index.js
|
|
var require_lodash4 = __commonJS((exports, module) => {
|
|
var numberTag = "[object Number]";
|
|
var objectProto = Object.prototype;
|
|
var objectToString = objectProto.toString;
|
|
function isObjectLike(value) {
|
|
return !!value && typeof value == "object";
|
|
}
|
|
function isNumber(value) {
|
|
return typeof value == "number" || isObjectLike(value) && objectToString.call(value) == numberTag;
|
|
}
|
|
module.exports = isNumber;
|
|
});
|
|
|
|
// ../eve/node_modules/lodash.isplainobject/index.js
|
|
var require_lodash5 = __commonJS((exports, module) => {
|
|
var objectTag = "[object Object]";
|
|
function isHostObject(value) {
|
|
var result = false;
|
|
if (value != null && typeof value.toString != "function") {
|
|
try {
|
|
result = !!(value + "");
|
|
} catch (e) {}
|
|
}
|
|
return result;
|
|
}
|
|
function overArg(func, transform) {
|
|
return function(arg) {
|
|
return func(transform(arg));
|
|
};
|
|
}
|
|
var funcProto = Function.prototype;
|
|
var objectProto = Object.prototype;
|
|
var funcToString = funcProto.toString;
|
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|
var objectCtorString = funcToString.call(Object);
|
|
var objectToString = objectProto.toString;
|
|
var getPrototype = overArg(Object.getPrototypeOf, Object);
|
|
function isObjectLike(value) {
|
|
return !!value && typeof value == "object";
|
|
}
|
|
function isPlainObject(value) {
|
|
if (!isObjectLike(value) || objectToString.call(value) != objectTag || isHostObject(value)) {
|
|
return false;
|
|
}
|
|
var proto = getPrototype(value);
|
|
if (proto === null) {
|
|
return true;
|
|
}
|
|
var Ctor = hasOwnProperty.call(proto, "constructor") && proto.constructor;
|
|
return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
|
|
}
|
|
module.exports = isPlainObject;
|
|
});
|
|
|
|
// ../eve/node_modules/lodash.isstring/index.js
|
|
var require_lodash6 = __commonJS((exports, module) => {
|
|
var stringTag = "[object String]";
|
|
var objectProto = Object.prototype;
|
|
var objectToString = objectProto.toString;
|
|
var isArray = Array.isArray;
|
|
function isObjectLike(value) {
|
|
return !!value && typeof value == "object";
|
|
}
|
|
function isString(value) {
|
|
return typeof value == "string" || !isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag;
|
|
}
|
|
module.exports = isString;
|
|
});
|
|
|
|
// ../eve/node_modules/lodash.once/index.js
|
|
var require_lodash7 = __commonJS((exports, module) => {
|
|
var FUNC_ERROR_TEXT = "Expected a function";
|
|
var INFINITY = 1 / 0;
|
|
var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
|
var NAN = 0 / 0;
|
|
var symbolTag = "[object Symbol]";
|
|
var reTrim = /^\s+|\s+$/g;
|
|
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
|
|
var reIsBinary = /^0b[01]+$/i;
|
|
var reIsOctal = /^0o[0-7]+$/i;
|
|
var freeParseInt = parseInt;
|
|
var objectProto = Object.prototype;
|
|
var objectToString = objectProto.toString;
|
|
function before(n, func) {
|
|
var result;
|
|
if (typeof func != "function") {
|
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|
}
|
|
n = toInteger(n);
|
|
return function() {
|
|
if (--n > 0) {
|
|
result = func.apply(this, arguments);
|
|
}
|
|
if (n <= 1) {
|
|
func = undefined;
|
|
}
|
|
return result;
|
|
};
|
|
}
|
|
function once(func) {
|
|
return before(2, func);
|
|
}
|
|
function isObject(value) {
|
|
var type = typeof value;
|
|
return !!value && (type == "object" || type == "function");
|
|
}
|
|
function isObjectLike(value) {
|
|
return !!value && typeof value == "object";
|
|
}
|
|
function isSymbol(value) {
|
|
return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
|
|
}
|
|
function toFinite(value) {
|
|
if (!value) {
|
|
return value === 0 ? value : 0;
|
|
}
|
|
value = toNumber(value);
|
|
if (value === INFINITY || value === -INFINITY) {
|
|
var sign = value < 0 ? -1 : 1;
|
|
return sign * MAX_INTEGER;
|
|
}
|
|
return value === value ? value : 0;
|
|
}
|
|
function toInteger(value) {
|
|
var result = toFinite(value), remainder = result % 1;
|
|
return result === result ? remainder ? result - remainder : result : 0;
|
|
}
|
|
function toNumber(value) {
|
|
if (typeof value == "number") {
|
|
return value;
|
|
}
|
|
if (isSymbol(value)) {
|
|
return NAN;
|
|
}
|
|
if (isObject(value)) {
|
|
var other = typeof value.valueOf == "function" ? value.valueOf() : value;
|
|
value = isObject(other) ? other + "" : other;
|
|
}
|
|
if (typeof value != "string") {
|
|
return value === 0 ? value : +value;
|
|
}
|
|
value = value.replace(reTrim, "");
|
|
var isBinary = reIsBinary.test(value);
|
|
return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
|
|
}
|
|
module.exports = once;
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/sign.js
|
|
var require_sign = __commonJS((exports, module) => {
|
|
var timespan = require_timespan();
|
|
var PS_SUPPORTED = require_psSupported();
|
|
var validateAsymmetricKey = require_validateAsymmetricKey();
|
|
var jws = require_jws();
|
|
var includes = require_lodash();
|
|
var isBoolean = require_lodash2();
|
|
var isInteger = require_lodash3();
|
|
var isNumber = require_lodash4();
|
|
var isPlainObject = require_lodash5();
|
|
var isString = require_lodash6();
|
|
var once = require_lodash7();
|
|
var { KeyObject, createSecretKey, createPrivateKey } = __require("crypto");
|
|
var SUPPORTED_ALGS = ["RS256", "RS384", "RS512", "ES256", "ES384", "ES512", "HS256", "HS384", "HS512", "none"];
|
|
if (PS_SUPPORTED) {
|
|
SUPPORTED_ALGS.splice(3, 0, "PS256", "PS384", "PS512");
|
|
}
|
|
var sign_options_schema = {
|
|
expiresIn: { isValid: function(value) {
|
|
return isInteger(value) || isString(value) && value;
|
|
}, message: '"expiresIn" should be a number of seconds or string representing a timespan' },
|
|
notBefore: { isValid: function(value) {
|
|
return isInteger(value) || isString(value) && value;
|
|
}, message: '"notBefore" should be a number of seconds or string representing a timespan' },
|
|
audience: { isValid: function(value) {
|
|
return isString(value) || Array.isArray(value);
|
|
}, message: '"audience" must be a string or array' },
|
|
algorithm: { isValid: includes.bind(null, SUPPORTED_ALGS), message: '"algorithm" must be a valid string enum value' },
|
|
header: { isValid: isPlainObject, message: '"header" must be an object' },
|
|
encoding: { isValid: isString, message: '"encoding" must be a string' },
|
|
issuer: { isValid: isString, message: '"issuer" must be a string' },
|
|
subject: { isValid: isString, message: '"subject" must be a string' },
|
|
jwtid: { isValid: isString, message: '"jwtid" must be a string' },
|
|
noTimestamp: { isValid: isBoolean, message: '"noTimestamp" must be a boolean' },
|
|
keyid: { isValid: isString, message: '"keyid" must be a string' },
|
|
mutatePayload: { isValid: isBoolean, message: '"mutatePayload" must be a boolean' },
|
|
allowInsecureKeySizes: { isValid: isBoolean, message: '"allowInsecureKeySizes" must be a boolean' },
|
|
allowInvalidAsymmetricKeyTypes: { isValid: isBoolean, message: '"allowInvalidAsymmetricKeyTypes" must be a boolean' }
|
|
};
|
|
var registered_claims_schema = {
|
|
iat: { isValid: isNumber, message: '"iat" should be a number of seconds' },
|
|
exp: { isValid: isNumber, message: '"exp" should be a number of seconds' },
|
|
nbf: { isValid: isNumber, message: '"nbf" should be a number of seconds' }
|
|
};
|
|
function validate(schema, allowUnknown, object, parameterName) {
|
|
if (!isPlainObject(object)) {
|
|
throw new Error('Expected "' + parameterName + '" to be a plain object.');
|
|
}
|
|
Object.keys(object).forEach(function(key) {
|
|
const validator = schema[key];
|
|
if (!validator) {
|
|
if (!allowUnknown) {
|
|
throw new Error('"' + key + '" is not allowed in "' + parameterName + '"');
|
|
}
|
|
return;
|
|
}
|
|
if (!validator.isValid(object[key])) {
|
|
throw new Error(validator.message);
|
|
}
|
|
});
|
|
}
|
|
function validateOptions(options2) {
|
|
return validate(sign_options_schema, false, options2, "options");
|
|
}
|
|
function validatePayload(payload) {
|
|
return validate(registered_claims_schema, true, payload, "payload");
|
|
}
|
|
var options_to_payload = {
|
|
audience: "aud",
|
|
issuer: "iss",
|
|
subject: "sub",
|
|
jwtid: "jti"
|
|
};
|
|
var options_for_objects = [
|
|
"expiresIn",
|
|
"notBefore",
|
|
"noTimestamp",
|
|
"audience",
|
|
"issuer",
|
|
"subject",
|
|
"jwtid"
|
|
];
|
|
module.exports = function(payload, secretOrPrivateKey, options2, callback) {
|
|
if (typeof options2 === "function") {
|
|
callback = options2;
|
|
options2 = {};
|
|
} else {
|
|
options2 = options2 || {};
|
|
}
|
|
const isObjectPayload = typeof payload === "object" && !Buffer.isBuffer(payload);
|
|
const header = Object.assign({
|
|
alg: options2.algorithm || "HS256",
|
|
typ: isObjectPayload ? "JWT" : undefined,
|
|
kid: options2.keyid
|
|
}, options2.header);
|
|
function failure(err) {
|
|
if (callback) {
|
|
return callback(err);
|
|
}
|
|
throw err;
|
|
}
|
|
if (!secretOrPrivateKey && options2.algorithm !== "none") {
|
|
return failure(new Error("secretOrPrivateKey must have a value"));
|
|
}
|
|
if (secretOrPrivateKey != null && !(secretOrPrivateKey instanceof KeyObject)) {
|
|
try {
|
|
secretOrPrivateKey = createPrivateKey(secretOrPrivateKey);
|
|
} catch (_) {
|
|
try {
|
|
secretOrPrivateKey = createSecretKey(typeof secretOrPrivateKey === "string" ? Buffer.from(secretOrPrivateKey) : secretOrPrivateKey);
|
|
} catch (_2) {
|
|
return failure(new Error("secretOrPrivateKey is not valid key material"));
|
|
}
|
|
}
|
|
}
|
|
if (header.alg.startsWith("HS") && secretOrPrivateKey.type !== "secret") {
|
|
return failure(new Error(`secretOrPrivateKey must be a symmetric key when using ${header.alg}`));
|
|
} else if (/^(?:RS|PS|ES)/.test(header.alg)) {
|
|
if (secretOrPrivateKey.type !== "private") {
|
|
return failure(new Error(`secretOrPrivateKey must be an asymmetric key when using ${header.alg}`));
|
|
}
|
|
if (!options2.allowInsecureKeySizes && !header.alg.startsWith("ES") && secretOrPrivateKey.asymmetricKeyDetails !== undefined && secretOrPrivateKey.asymmetricKeyDetails.modulusLength < 2048) {
|
|
return failure(new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`));
|
|
}
|
|
}
|
|
if (typeof payload === "undefined") {
|
|
return failure(new Error("payload is required"));
|
|
} else if (isObjectPayload) {
|
|
try {
|
|
validatePayload(payload);
|
|
} catch (error) {
|
|
return failure(error);
|
|
}
|
|
if (!options2.mutatePayload) {
|
|
payload = Object.assign({}, payload);
|
|
}
|
|
} else {
|
|
const invalid_options = options_for_objects.filter(function(opt) {
|
|
return typeof options2[opt] !== "undefined";
|
|
});
|
|
if (invalid_options.length > 0) {
|
|
return failure(new Error("invalid " + invalid_options.join(",") + " option for " + typeof payload + " payload"));
|
|
}
|
|
}
|
|
if (typeof payload.exp !== "undefined" && typeof options2.expiresIn !== "undefined") {
|
|
return failure(new Error('Bad "options.expiresIn" option the payload already has an "exp" property.'));
|
|
}
|
|
if (typeof payload.nbf !== "undefined" && typeof options2.notBefore !== "undefined") {
|
|
return failure(new Error('Bad "options.notBefore" option the payload already has an "nbf" property.'));
|
|
}
|
|
try {
|
|
validateOptions(options2);
|
|
} catch (error) {
|
|
return failure(error);
|
|
}
|
|
if (!options2.allowInvalidAsymmetricKeyTypes) {
|
|
try {
|
|
validateAsymmetricKey(header.alg, secretOrPrivateKey);
|
|
} catch (error) {
|
|
return failure(error);
|
|
}
|
|
}
|
|
const timestamp = payload.iat || Math.floor(Date.now() / 1000);
|
|
if (options2.noTimestamp) {
|
|
delete payload.iat;
|
|
} else if (isObjectPayload) {
|
|
payload.iat = timestamp;
|
|
}
|
|
if (typeof options2.notBefore !== "undefined") {
|
|
try {
|
|
payload.nbf = timespan(options2.notBefore, timestamp);
|
|
} catch (err) {
|
|
return failure(err);
|
|
}
|
|
if (typeof payload.nbf === "undefined") {
|
|
return failure(new Error('"notBefore" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
|
|
}
|
|
}
|
|
if (typeof options2.expiresIn !== "undefined" && typeof payload === "object") {
|
|
try {
|
|
payload.exp = timespan(options2.expiresIn, timestamp);
|
|
} catch (err) {
|
|
return failure(err);
|
|
}
|
|
if (typeof payload.exp === "undefined") {
|
|
return failure(new Error('"expiresIn" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
|
|
}
|
|
}
|
|
Object.keys(options_to_payload).forEach(function(key) {
|
|
const claim = options_to_payload[key];
|
|
if (typeof options2[key] !== "undefined") {
|
|
if (typeof payload[claim] !== "undefined") {
|
|
return failure(new Error('Bad "options.' + key + '" option. The payload already has an "' + claim + '" property.'));
|
|
}
|
|
payload[claim] = options2[key];
|
|
}
|
|
});
|
|
const encoding = options2.encoding || "utf8";
|
|
if (typeof callback === "function") {
|
|
callback = callback && once(callback);
|
|
jws.createSign({
|
|
header,
|
|
privateKey: secretOrPrivateKey,
|
|
payload,
|
|
encoding
|
|
}).once("error", callback).once("done", function(signature) {
|
|
if (!options2.allowInsecureKeySizes && /^(?:RS|PS)/.test(header.alg) && signature.length < 256) {
|
|
return callback(new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`));
|
|
}
|
|
callback(null, signature);
|
|
});
|
|
} else {
|
|
let signature = jws.sign({ header, payload, secret: secretOrPrivateKey, encoding });
|
|
if (!options2.allowInsecureKeySizes && /^(?:RS|PS)/.test(header.alg) && signature.length < 256) {
|
|
throw new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`);
|
|
}
|
|
return signature;
|
|
}
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/index.js
|
|
var require_jsonwebtoken = __commonJS((exports, module) => {
|
|
module.exports = {
|
|
decode: require_decode(),
|
|
verify: require_verify(),
|
|
sign: require_sign(),
|
|
JsonWebTokenError: require_JsonWebTokenError(),
|
|
NotBeforeError: require_NotBeforeError(),
|
|
TokenExpiredError: require_TokenExpiredError()
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/bn.js/lib/bn.js
|
|
var require_bn = __commonJS((exports, module) => {
|
|
(function(module2, exports2) {
|
|
function assert(val, msg) {
|
|
if (!val)
|
|
throw new Error(msg || "Assertion failed");
|
|
}
|
|
function inherits(ctor, superCtor) {
|
|
ctor.super_ = superCtor;
|
|
var TempCtor = function() {};
|
|
TempCtor.prototype = superCtor.prototype;
|
|
ctor.prototype = new TempCtor;
|
|
ctor.prototype.constructor = ctor;
|
|
}
|
|
function BN(number, base, endian) {
|
|
if (BN.isBN(number)) {
|
|
return number;
|
|
}
|
|
this.negative = 0;
|
|
this.words = null;
|
|
this.length = 0;
|
|
this.red = null;
|
|
if (number !== null) {
|
|
if (base === "le" || base === "be") {
|
|
endian = base;
|
|
base = 10;
|
|
}
|
|
this._init(number || 0, base || 10, endian || "be");
|
|
}
|
|
}
|
|
if (typeof module2 === "object") {
|
|
module2.exports = BN;
|
|
} else {
|
|
exports2.BN = BN;
|
|
}
|
|
BN.BN = BN;
|
|
BN.wordSize = 26;
|
|
var Buffer2;
|
|
try {
|
|
if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") {
|
|
Buffer2 = window.Buffer;
|
|
} else {
|
|
Buffer2 = __require("buffer").Buffer;
|
|
}
|
|
} catch (e) {}
|
|
BN.isBN = function isBN(num) {
|
|
if (num instanceof BN) {
|
|
return true;
|
|
}
|
|
return num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
|
|
};
|
|
BN.max = function max(left, right) {
|
|
if (left.cmp(right) > 0)
|
|
return left;
|
|
return right;
|
|
};
|
|
BN.min = function min(left, right) {
|
|
if (left.cmp(right) < 0)
|
|
return left;
|
|
return right;
|
|
};
|
|
BN.prototype._init = function init(number, base, endian) {
|
|
if (typeof number === "number") {
|
|
return this._initNumber(number, base, endian);
|
|
}
|
|
if (typeof number === "object") {
|
|
return this._initArray(number, base, endian);
|
|
}
|
|
if (base === "hex") {
|
|
base = 16;
|
|
}
|
|
assert(base === (base | 0) && base >= 2 && base <= 36);
|
|
number = number.toString().replace(/\s+/g, "");
|
|
var start = 0;
|
|
if (number[0] === "-") {
|
|
start++;
|
|
this.negative = 1;
|
|
}
|
|
if (start < number.length) {
|
|
if (base === 16) {
|
|
this._parseHex(number, start, endian);
|
|
} else {
|
|
this._parseBase(number, base, start);
|
|
if (endian === "le") {
|
|
this._initArray(this.toArray(), base, endian);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
BN.prototype._initNumber = function _initNumber(number, base, endian) {
|
|
if (number < 0) {
|
|
this.negative = 1;
|
|
number = -number;
|
|
}
|
|
if (number < 67108864) {
|
|
this.words = [number & 67108863];
|
|
this.length = 1;
|
|
} else if (number < 4503599627370496) {
|
|
this.words = [
|
|
number & 67108863,
|
|
number / 67108864 & 67108863
|
|
];
|
|
this.length = 2;
|
|
} else {
|
|
assert(number < 9007199254740992);
|
|
this.words = [
|
|
number & 67108863,
|
|
number / 67108864 & 67108863,
|
|
1
|
|
];
|
|
this.length = 3;
|
|
}
|
|
if (endian !== "le")
|
|
return;
|
|
this._initArray(this.toArray(), base, endian);
|
|
};
|
|
BN.prototype._initArray = function _initArray(number, base, endian) {
|
|
assert(typeof number.length === "number");
|
|
if (number.length <= 0) {
|
|
this.words = [0];
|
|
this.length = 1;
|
|
return this;
|
|
}
|
|
this.length = Math.ceil(number.length / 3);
|
|
this.words = new Array(this.length);
|
|
for (var i = 0;i < this.length; i++) {
|
|
this.words[i] = 0;
|
|
}
|
|
var j, w;
|
|
var off = 0;
|
|
if (endian === "be") {
|
|
for (i = number.length - 1, j = 0;i >= 0; i -= 3) {
|
|
w = number[i] | number[i - 1] << 8 | number[i - 2] << 16;
|
|
this.words[j] |= w << off & 67108863;
|
|
this.words[j + 1] = w >>> 26 - off & 67108863;
|
|
off += 24;
|
|
if (off >= 26) {
|
|
off -= 26;
|
|
j++;
|
|
}
|
|
}
|
|
} else if (endian === "le") {
|
|
for (i = 0, j = 0;i < number.length; i += 3) {
|
|
w = number[i] | number[i + 1] << 8 | number[i + 2] << 16;
|
|
this.words[j] |= w << off & 67108863;
|
|
this.words[j + 1] = w >>> 26 - off & 67108863;
|
|
off += 24;
|
|
if (off >= 26) {
|
|
off -= 26;
|
|
j++;
|
|
}
|
|
}
|
|
}
|
|
return this.strip();
|
|
};
|
|
function parseHex4Bits(string, index2) {
|
|
var c = string.charCodeAt(index2);
|
|
if (c >= 65 && c <= 70) {
|
|
return c - 55;
|
|
} else if (c >= 97 && c <= 102) {
|
|
return c - 87;
|
|
} else {
|
|
return c - 48 & 15;
|
|
}
|
|
}
|
|
function parseHexByte(string, lowerBound, index2) {
|
|
var r = parseHex4Bits(string, index2);
|
|
if (index2 - 1 >= lowerBound) {
|
|
r |= parseHex4Bits(string, index2 - 1) << 4;
|
|
}
|
|
return r;
|
|
}
|
|
BN.prototype._parseHex = function _parseHex(number, start, endian) {
|
|
this.length = Math.ceil((number.length - start) / 6);
|
|
this.words = new Array(this.length);
|
|
for (var i = 0;i < this.length; i++) {
|
|
this.words[i] = 0;
|
|
}
|
|
var off = 0;
|
|
var j = 0;
|
|
var w;
|
|
if (endian === "be") {
|
|
for (i = number.length - 1;i >= start; i -= 2) {
|
|
w = parseHexByte(number, start, i) << off;
|
|
this.words[j] |= w & 67108863;
|
|
if (off >= 18) {
|
|
off -= 18;
|
|
j += 1;
|
|
this.words[j] |= w >>> 26;
|
|
} else {
|
|
off += 8;
|
|
}
|
|
}
|
|
} else {
|
|
var parseLength = number.length - start;
|
|
for (i = parseLength % 2 === 0 ? start + 1 : start;i < number.length; i += 2) {
|
|
w = parseHexByte(number, start, i) << off;
|
|
this.words[j] |= w & 67108863;
|
|
if (off >= 18) {
|
|
off -= 18;
|
|
j += 1;
|
|
this.words[j] |= w >>> 26;
|
|
} else {
|
|
off += 8;
|
|
}
|
|
}
|
|
}
|
|
this.strip();
|
|
};
|
|
function parseBase(str, start, end, mul) {
|
|
var r = 0;
|
|
var len = Math.min(str.length, end);
|
|
for (var i = start;i < len; i++) {
|
|
var c = str.charCodeAt(i) - 48;
|
|
r *= mul;
|
|
if (c >= 49) {
|
|
r += c - 49 + 10;
|
|
} else if (c >= 17) {
|
|
r += c - 17 + 10;
|
|
} else {
|
|
r += c;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
BN.prototype._parseBase = function _parseBase(number, base, start) {
|
|
this.words = [0];
|
|
this.length = 1;
|
|
for (var limbLen = 0, limbPow = 1;limbPow <= 67108863; limbPow *= base) {
|
|
limbLen++;
|
|
}
|
|
limbLen--;
|
|
limbPow = limbPow / base | 0;
|
|
var total = number.length - start;
|
|
var mod = total % limbLen;
|
|
var end = Math.min(total, total - mod) + start;
|
|
var word = 0;
|
|
for (var i = start;i < end; i += limbLen) {
|
|
word = parseBase(number, i, i + limbLen, base);
|
|
this.imuln(limbPow);
|
|
if (this.words[0] + word < 67108864) {
|
|
this.words[0] += word;
|
|
} else {
|
|
this._iaddn(word);
|
|
}
|
|
}
|
|
if (mod !== 0) {
|
|
var pow = 1;
|
|
word = parseBase(number, i, number.length, base);
|
|
for (i = 0;i < mod; i++) {
|
|
pow *= base;
|
|
}
|
|
this.imuln(pow);
|
|
if (this.words[0] + word < 67108864) {
|
|
this.words[0] += word;
|
|
} else {
|
|
this._iaddn(word);
|
|
}
|
|
}
|
|
this.strip();
|
|
};
|
|
BN.prototype.copy = function copy(dest) {
|
|
dest.words = new Array(this.length);
|
|
for (var i = 0;i < this.length; i++) {
|
|
dest.words[i] = this.words[i];
|
|
}
|
|
dest.length = this.length;
|
|
dest.negative = this.negative;
|
|
dest.red = this.red;
|
|
};
|
|
BN.prototype.clone = function clone() {
|
|
var r = new BN(null);
|
|
this.copy(r);
|
|
return r;
|
|
};
|
|
BN.prototype._expand = function _expand(size) {
|
|
while (this.length < size) {
|
|
this.words[this.length++] = 0;
|
|
}
|
|
return this;
|
|
};
|
|
BN.prototype.strip = function strip() {
|
|
while (this.length > 1 && this.words[this.length - 1] === 0) {
|
|
this.length--;
|
|
}
|
|
return this._normSign();
|
|
};
|
|
BN.prototype._normSign = function _normSign() {
|
|
if (this.length === 1 && this.words[0] === 0) {
|
|
this.negative = 0;
|
|
}
|
|
return this;
|
|
};
|
|
BN.prototype.inspect = function inspect() {
|
|
return (this.red ? "<BN-R: " : "<BN: ") + this.toString(16) + ">";
|
|
};
|
|
var zeros = [
|
|
"",
|
|
"0",
|
|
"00",
|
|
"000",
|
|
"0000",
|
|
"00000",
|
|
"000000",
|
|
"0000000",
|
|
"00000000",
|
|
"000000000",
|
|
"0000000000",
|
|
"00000000000",
|
|
"000000000000",
|
|
"0000000000000",
|
|
"00000000000000",
|
|
"000000000000000",
|
|
"0000000000000000",
|
|
"00000000000000000",
|
|
"000000000000000000",
|
|
"0000000000000000000",
|
|
"00000000000000000000",
|
|
"000000000000000000000",
|
|
"0000000000000000000000",
|
|
"00000000000000000000000",
|
|
"000000000000000000000000",
|
|
"0000000000000000000000000"
|
|
];
|
|
var groupSizes = [
|
|
0,
|
|
0,
|
|
25,
|
|
16,
|
|
12,
|
|
11,
|
|
10,
|
|
9,
|
|
8,
|
|
8,
|
|
7,
|
|
7,
|
|
7,
|
|
7,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5
|
|
];
|
|
var groupBases = [
|
|
0,
|
|
0,
|
|
33554432,
|
|
43046721,
|
|
16777216,
|
|
48828125,
|
|
60466176,
|
|
40353607,
|
|
16777216,
|
|
43046721,
|
|
1e7,
|
|
19487171,
|
|
35831808,
|
|
62748517,
|
|
7529536,
|
|
11390625,
|
|
16777216,
|
|
24137569,
|
|
34012224,
|
|
47045881,
|
|
64000000,
|
|
4084101,
|
|
5153632,
|
|
6436343,
|
|
7962624,
|
|
9765625,
|
|
11881376,
|
|
14348907,
|
|
17210368,
|
|
20511149,
|
|
24300000,
|
|
28629151,
|
|
33554432,
|
|
39135393,
|
|
45435424,
|
|
52521875,
|
|
60466176
|
|
];
|
|
BN.prototype.toString = function toString(base, padding) {
|
|
base = base || 10;
|
|
padding = padding | 0 || 1;
|
|
var out;
|
|
if (base === 16 || base === "hex") {
|
|
out = "";
|
|
var off = 0;
|
|
var carry = 0;
|
|
for (var i = 0;i < this.length; i++) {
|
|
var w = this.words[i];
|
|
var word = ((w << off | carry) & 16777215).toString(16);
|
|
carry = w >>> 24 - off & 16777215;
|
|
off += 2;
|
|
if (off >= 26) {
|
|
off -= 26;
|
|
i--;
|
|
}
|
|
if (carry !== 0 || i !== this.length - 1) {
|
|
out = zeros[6 - word.length] + word + out;
|
|
} else {
|
|
out = word + out;
|
|
}
|
|
}
|
|
if (carry !== 0) {
|
|
out = carry.toString(16) + out;
|
|
}
|
|
while (out.length % padding !== 0) {
|
|
out = "0" + out;
|
|
}
|
|
if (this.negative !== 0) {
|
|
out = "-" + out;
|
|
}
|
|
return out;
|
|
}
|
|
if (base === (base | 0) && base >= 2 && base <= 36) {
|
|
var groupSize = groupSizes[base];
|
|
var groupBase = groupBases[base];
|
|
out = "";
|
|
var c = this.clone();
|
|
c.negative = 0;
|
|
while (!c.isZero()) {
|
|
var r = c.modn(groupBase).toString(base);
|
|
c = c.idivn(groupBase);
|
|
if (!c.isZero()) {
|
|
out = zeros[groupSize - r.length] + r + out;
|
|
} else {
|
|
out = r + out;
|
|
}
|
|
}
|
|
if (this.isZero()) {
|
|
out = "0" + out;
|
|
}
|
|
while (out.length % padding !== 0) {
|
|
out = "0" + out;
|
|
}
|
|
if (this.negative !== 0) {
|
|
out = "-" + out;
|
|
}
|
|
return out;
|
|
}
|
|
assert(false, "Base should be between 2 and 36");
|
|
};
|
|
BN.prototype.toNumber = function toNumber() {
|
|
var ret = this.words[0];
|
|
if (this.length === 2) {
|
|
ret += this.words[1] * 67108864;
|
|
} else if (this.length === 3 && this.words[2] === 1) {
|
|
ret += 4503599627370496 + this.words[1] * 67108864;
|
|
} else if (this.length > 2) {
|
|
assert(false, "Number can only safely store up to 53 bits");
|
|
}
|
|
return this.negative !== 0 ? -ret : ret;
|
|
};
|
|
BN.prototype.toJSON = function toJSON() {
|
|
return this.toString(16);
|
|
};
|
|
BN.prototype.toBuffer = function toBuffer(endian, length) {
|
|
assert(typeof Buffer2 !== "undefined");
|
|
return this.toArrayLike(Buffer2, endian, length);
|
|
};
|
|
BN.prototype.toArray = function toArray(endian, length) {
|
|
return this.toArrayLike(Array, endian, length);
|
|
};
|
|
BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) {
|
|
var byteLength = this.byteLength();
|
|
var reqLength = length || Math.max(1, byteLength);
|
|
assert(byteLength <= reqLength, "byte array longer than desired length");
|
|
assert(reqLength > 0, "Requested array length <= 0");
|
|
this.strip();
|
|
var littleEndian = endian === "le";
|
|
var res = new ArrayType(reqLength);
|
|
var b, i;
|
|
var q = this.clone();
|
|
if (!littleEndian) {
|
|
for (i = 0;i < reqLength - byteLength; i++) {
|
|
res[i] = 0;
|
|
}
|
|
for (i = 0;!q.isZero(); i++) {
|
|
b = q.andln(255);
|
|
q.iushrn(8);
|
|
res[reqLength - i - 1] = b;
|
|
}
|
|
} else {
|
|
for (i = 0;!q.isZero(); i++) {
|
|
b = q.andln(255);
|
|
q.iushrn(8);
|
|
res[i] = b;
|
|
}
|
|
for (;i < reqLength; i++) {
|
|
res[i] = 0;
|
|
}
|
|
}
|
|
return res;
|
|
};
|
|
if (Math.clz32) {
|
|
BN.prototype._countBits = function _countBits(w) {
|
|
return 32 - Math.clz32(w);
|
|
};
|
|
} else {
|
|
BN.prototype._countBits = function _countBits(w) {
|
|
var t = w;
|
|
var r = 0;
|
|
if (t >= 4096) {
|
|
r += 13;
|
|
t >>>= 13;
|
|
}
|
|
if (t >= 64) {
|
|
r += 7;
|
|
t >>>= 7;
|
|
}
|
|
if (t >= 8) {
|
|
r += 4;
|
|
t >>>= 4;
|
|
}
|
|
if (t >= 2) {
|
|
r += 2;
|
|
t >>>= 2;
|
|
}
|
|
return r + t;
|
|
};
|
|
}
|
|
BN.prototype._zeroBits = function _zeroBits(w) {
|
|
if (w === 0)
|
|
return 26;
|
|
var t = w;
|
|
var r = 0;
|
|
if ((t & 8191) === 0) {
|
|
r += 13;
|
|
t >>>= 13;
|
|
}
|
|
if ((t & 127) === 0) {
|
|
r += 7;
|
|
t >>>= 7;
|
|
}
|
|
if ((t & 15) === 0) {
|
|
r += 4;
|
|
t >>>= 4;
|
|
}
|
|
if ((t & 3) === 0) {
|
|
r += 2;
|
|
t >>>= 2;
|
|
}
|
|
if ((t & 1) === 0) {
|
|
r++;
|
|
}
|
|
return r;
|
|
};
|
|
BN.prototype.bitLength = function bitLength() {
|
|
var w = this.words[this.length - 1];
|
|
var hi = this._countBits(w);
|
|
return (this.length - 1) * 26 + hi;
|
|
};
|
|
function toBitArray(num) {
|
|
var w = new Array(num.bitLength());
|
|
for (var bit = 0;bit < w.length; bit++) {
|
|
var off = bit / 26 | 0;
|
|
var wbit = bit % 26;
|
|
w[bit] = (num.words[off] & 1 << wbit) >>> wbit;
|
|
}
|
|
return w;
|
|
}
|
|
BN.prototype.zeroBits = function zeroBits() {
|
|
if (this.isZero())
|
|
return 0;
|
|
var r = 0;
|
|
for (var i = 0;i < this.length; i++) {
|
|
var b = this._zeroBits(this.words[i]);
|
|
r += b;
|
|
if (b !== 26)
|
|
break;
|
|
}
|
|
return r;
|
|
};
|
|
BN.prototype.byteLength = function byteLength() {
|
|
return Math.ceil(this.bitLength() / 8);
|
|
};
|
|
BN.prototype.toTwos = function toTwos(width) {
|
|
if (this.negative !== 0) {
|
|
return this.abs().inotn(width).iaddn(1);
|
|
}
|
|
return this.clone();
|
|
};
|
|
BN.prototype.fromTwos = function fromTwos(width) {
|
|
if (this.testn(width - 1)) {
|
|
return this.notn(width).iaddn(1).ineg();
|
|
}
|
|
return this.clone();
|
|
};
|
|
BN.prototype.isNeg = function isNeg() {
|
|
return this.negative !== 0;
|
|
};
|
|
BN.prototype.neg = function neg() {
|
|
return this.clone().ineg();
|
|
};
|
|
BN.prototype.ineg = function ineg() {
|
|
if (!this.isZero()) {
|
|
this.negative ^= 1;
|
|
}
|
|
return this;
|
|
};
|
|
BN.prototype.iuor = function iuor(num) {
|
|
while (this.length < num.length) {
|
|
this.words[this.length++] = 0;
|
|
}
|
|
for (var i = 0;i < num.length; i++) {
|
|
this.words[i] = this.words[i] | num.words[i];
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.ior = function ior(num) {
|
|
assert((this.negative | num.negative) === 0);
|
|
return this.iuor(num);
|
|
};
|
|
BN.prototype.or = function or(num) {
|
|
if (this.length > num.length)
|
|
return this.clone().ior(num);
|
|
return num.clone().ior(this);
|
|
};
|
|
BN.prototype.uor = function uor(num) {
|
|
if (this.length > num.length)
|
|
return this.clone().iuor(num);
|
|
return num.clone().iuor(this);
|
|
};
|
|
BN.prototype.iuand = function iuand(num) {
|
|
var b;
|
|
if (this.length > num.length) {
|
|
b = num;
|
|
} else {
|
|
b = this;
|
|
}
|
|
for (var i = 0;i < b.length; i++) {
|
|
this.words[i] = this.words[i] & num.words[i];
|
|
}
|
|
this.length = b.length;
|
|
return this.strip();
|
|
};
|
|
BN.prototype.iand = function iand(num) {
|
|
assert((this.negative | num.negative) === 0);
|
|
return this.iuand(num);
|
|
};
|
|
BN.prototype.and = function and(num) {
|
|
if (this.length > num.length)
|
|
return this.clone().iand(num);
|
|
return num.clone().iand(this);
|
|
};
|
|
BN.prototype.uand = function uand(num) {
|
|
if (this.length > num.length)
|
|
return this.clone().iuand(num);
|
|
return num.clone().iuand(this);
|
|
};
|
|
BN.prototype.iuxor = function iuxor(num) {
|
|
var a;
|
|
var b;
|
|
if (this.length > num.length) {
|
|
a = this;
|
|
b = num;
|
|
} else {
|
|
a = num;
|
|
b = this;
|
|
}
|
|
for (var i = 0;i < b.length; i++) {
|
|
this.words[i] = a.words[i] ^ b.words[i];
|
|
}
|
|
if (this !== a) {
|
|
for (;i < a.length; i++) {
|
|
this.words[i] = a.words[i];
|
|
}
|
|
}
|
|
this.length = a.length;
|
|
return this.strip();
|
|
};
|
|
BN.prototype.ixor = function ixor(num) {
|
|
assert((this.negative | num.negative) === 0);
|
|
return this.iuxor(num);
|
|
};
|
|
BN.prototype.xor = function xor(num) {
|
|
if (this.length > num.length)
|
|
return this.clone().ixor(num);
|
|
return num.clone().ixor(this);
|
|
};
|
|
BN.prototype.uxor = function uxor(num) {
|
|
if (this.length > num.length)
|
|
return this.clone().iuxor(num);
|
|
return num.clone().iuxor(this);
|
|
};
|
|
BN.prototype.inotn = function inotn(width) {
|
|
assert(typeof width === "number" && width >= 0);
|
|
var bytesNeeded = Math.ceil(width / 26) | 0;
|
|
var bitsLeft = width % 26;
|
|
this._expand(bytesNeeded);
|
|
if (bitsLeft > 0) {
|
|
bytesNeeded--;
|
|
}
|
|
for (var i = 0;i < bytesNeeded; i++) {
|
|
this.words[i] = ~this.words[i] & 67108863;
|
|
}
|
|
if (bitsLeft > 0) {
|
|
this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft;
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.notn = function notn(width) {
|
|
return this.clone().inotn(width);
|
|
};
|
|
BN.prototype.setn = function setn(bit, val) {
|
|
assert(typeof bit === "number" && bit >= 0);
|
|
var off = bit / 26 | 0;
|
|
var wbit = bit % 26;
|
|
this._expand(off + 1);
|
|
if (val) {
|
|
this.words[off] = this.words[off] | 1 << wbit;
|
|
} else {
|
|
this.words[off] = this.words[off] & ~(1 << wbit);
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.iadd = function iadd(num) {
|
|
var r;
|
|
if (this.negative !== 0 && num.negative === 0) {
|
|
this.negative = 0;
|
|
r = this.isub(num);
|
|
this.negative ^= 1;
|
|
return this._normSign();
|
|
} else if (this.negative === 0 && num.negative !== 0) {
|
|
num.negative = 0;
|
|
r = this.isub(num);
|
|
num.negative = 1;
|
|
return r._normSign();
|
|
}
|
|
var a, b;
|
|
if (this.length > num.length) {
|
|
a = this;
|
|
b = num;
|
|
} else {
|
|
a = num;
|
|
b = this;
|
|
}
|
|
var carry = 0;
|
|
for (var i = 0;i < b.length; i++) {
|
|
r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
|
|
this.words[i] = r & 67108863;
|
|
carry = r >>> 26;
|
|
}
|
|
for (;carry !== 0 && i < a.length; i++) {
|
|
r = (a.words[i] | 0) + carry;
|
|
this.words[i] = r & 67108863;
|
|
carry = r >>> 26;
|
|
}
|
|
this.length = a.length;
|
|
if (carry !== 0) {
|
|
this.words[this.length] = carry;
|
|
this.length++;
|
|
} else if (a !== this) {
|
|
for (;i < a.length; i++) {
|
|
this.words[i] = a.words[i];
|
|
}
|
|
}
|
|
return this;
|
|
};
|
|
BN.prototype.add = function add(num) {
|
|
var res;
|
|
if (num.negative !== 0 && this.negative === 0) {
|
|
num.negative = 0;
|
|
res = this.sub(num);
|
|
num.negative ^= 1;
|
|
return res;
|
|
} else if (num.negative === 0 && this.negative !== 0) {
|
|
this.negative = 0;
|
|
res = num.sub(this);
|
|
this.negative = 1;
|
|
return res;
|
|
}
|
|
if (this.length > num.length)
|
|
return this.clone().iadd(num);
|
|
return num.clone().iadd(this);
|
|
};
|
|
BN.prototype.isub = function isub(num) {
|
|
if (num.negative !== 0) {
|
|
num.negative = 0;
|
|
var r = this.iadd(num);
|
|
num.negative = 1;
|
|
return r._normSign();
|
|
} else if (this.negative !== 0) {
|
|
this.negative = 0;
|
|
this.iadd(num);
|
|
this.negative = 1;
|
|
return this._normSign();
|
|
}
|
|
var cmp = this.cmp(num);
|
|
if (cmp === 0) {
|
|
this.negative = 0;
|
|
this.length = 1;
|
|
this.words[0] = 0;
|
|
return this;
|
|
}
|
|
var a, b;
|
|
if (cmp > 0) {
|
|
a = this;
|
|
b = num;
|
|
} else {
|
|
a = num;
|
|
b = this;
|
|
}
|
|
var carry = 0;
|
|
for (var i = 0;i < b.length; i++) {
|
|
r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
|
|
carry = r >> 26;
|
|
this.words[i] = r & 67108863;
|
|
}
|
|
for (;carry !== 0 && i < a.length; i++) {
|
|
r = (a.words[i] | 0) + carry;
|
|
carry = r >> 26;
|
|
this.words[i] = r & 67108863;
|
|
}
|
|
if (carry === 0 && i < a.length && a !== this) {
|
|
for (;i < a.length; i++) {
|
|
this.words[i] = a.words[i];
|
|
}
|
|
}
|
|
this.length = Math.max(this.length, i);
|
|
if (a !== this) {
|
|
this.negative = 1;
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.sub = function sub(num) {
|
|
return this.clone().isub(num);
|
|
};
|
|
function smallMulTo(self2, num, out) {
|
|
out.negative = num.negative ^ self2.negative;
|
|
var len = self2.length + num.length | 0;
|
|
out.length = len;
|
|
len = len - 1 | 0;
|
|
var a = self2.words[0] | 0;
|
|
var b = num.words[0] | 0;
|
|
var r = a * b;
|
|
var lo = r & 67108863;
|
|
var carry = r / 67108864 | 0;
|
|
out.words[0] = lo;
|
|
for (var k = 1;k < len; k++) {
|
|
var ncarry = carry >>> 26;
|
|
var rword = carry & 67108863;
|
|
var maxJ = Math.min(k, num.length - 1);
|
|
for (var j = Math.max(0, k - self2.length + 1);j <= maxJ; j++) {
|
|
var i = k - j | 0;
|
|
a = self2.words[i] | 0;
|
|
b = num.words[j] | 0;
|
|
r = a * b + rword;
|
|
ncarry += r / 67108864 | 0;
|
|
rword = r & 67108863;
|
|
}
|
|
out.words[k] = rword | 0;
|
|
carry = ncarry | 0;
|
|
}
|
|
if (carry !== 0) {
|
|
out.words[k] = carry | 0;
|
|
} else {
|
|
out.length--;
|
|
}
|
|
return out.strip();
|
|
}
|
|
var comb10MulTo = function comb10MulTo(self2, num, out) {
|
|
var a = self2.words;
|
|
var b = num.words;
|
|
var o = out.words;
|
|
var c = 0;
|
|
var lo;
|
|
var mid;
|
|
var hi;
|
|
var a0 = a[0] | 0;
|
|
var al0 = a0 & 8191;
|
|
var ah0 = a0 >>> 13;
|
|
var a1 = a[1] | 0;
|
|
var al1 = a1 & 8191;
|
|
var ah1 = a1 >>> 13;
|
|
var a2 = a[2] | 0;
|
|
var al2 = a2 & 8191;
|
|
var ah2 = a2 >>> 13;
|
|
var a3 = a[3] | 0;
|
|
var al3 = a3 & 8191;
|
|
var ah3 = a3 >>> 13;
|
|
var a4 = a[4] | 0;
|
|
var al4 = a4 & 8191;
|
|
var ah4 = a4 >>> 13;
|
|
var a5 = a[5] | 0;
|
|
var al5 = a5 & 8191;
|
|
var ah5 = a5 >>> 13;
|
|
var a6 = a[6] | 0;
|
|
var al6 = a6 & 8191;
|
|
var ah6 = a6 >>> 13;
|
|
var a7 = a[7] | 0;
|
|
var al7 = a7 & 8191;
|
|
var ah7 = a7 >>> 13;
|
|
var a8 = a[8] | 0;
|
|
var al8 = a8 & 8191;
|
|
var ah8 = a8 >>> 13;
|
|
var a9 = a[9] | 0;
|
|
var al9 = a9 & 8191;
|
|
var ah9 = a9 >>> 13;
|
|
var b0 = b[0] | 0;
|
|
var bl0 = b0 & 8191;
|
|
var bh0 = b0 >>> 13;
|
|
var b1 = b[1] | 0;
|
|
var bl1 = b1 & 8191;
|
|
var bh1 = b1 >>> 13;
|
|
var b2 = b[2] | 0;
|
|
var bl2 = b2 & 8191;
|
|
var bh2 = b2 >>> 13;
|
|
var b3 = b[3] | 0;
|
|
var bl3 = b3 & 8191;
|
|
var bh3 = b3 >>> 13;
|
|
var b4 = b[4] | 0;
|
|
var bl4 = b4 & 8191;
|
|
var bh4 = b4 >>> 13;
|
|
var b5 = b[5] | 0;
|
|
var bl5 = b5 & 8191;
|
|
var bh5 = b5 >>> 13;
|
|
var b6 = b[6] | 0;
|
|
var bl6 = b6 & 8191;
|
|
var bh6 = b6 >>> 13;
|
|
var b7 = b[7] | 0;
|
|
var bl7 = b7 & 8191;
|
|
var bh7 = b7 >>> 13;
|
|
var b8 = b[8] | 0;
|
|
var bl8 = b8 & 8191;
|
|
var bh8 = b8 >>> 13;
|
|
var b9 = b[9] | 0;
|
|
var bl9 = b9 & 8191;
|
|
var bh9 = b9 >>> 13;
|
|
out.negative = self2.negative ^ num.negative;
|
|
out.length = 19;
|
|
lo = Math.imul(al0, bl0);
|
|
mid = Math.imul(al0, bh0);
|
|
mid = mid + Math.imul(ah0, bl0) | 0;
|
|
hi = Math.imul(ah0, bh0);
|
|
var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0;
|
|
w0 &= 67108863;
|
|
lo = Math.imul(al1, bl0);
|
|
mid = Math.imul(al1, bh0);
|
|
mid = mid + Math.imul(ah1, bl0) | 0;
|
|
hi = Math.imul(ah1, bh0);
|
|
lo = lo + Math.imul(al0, bl1) | 0;
|
|
mid = mid + Math.imul(al0, bh1) | 0;
|
|
mid = mid + Math.imul(ah0, bl1) | 0;
|
|
hi = hi + Math.imul(ah0, bh1) | 0;
|
|
var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0;
|
|
w1 &= 67108863;
|
|
lo = Math.imul(al2, bl0);
|
|
mid = Math.imul(al2, bh0);
|
|
mid = mid + Math.imul(ah2, bl0) | 0;
|
|
hi = Math.imul(ah2, bh0);
|
|
lo = lo + Math.imul(al1, bl1) | 0;
|
|
mid = mid + Math.imul(al1, bh1) | 0;
|
|
mid = mid + Math.imul(ah1, bl1) | 0;
|
|
hi = hi + Math.imul(ah1, bh1) | 0;
|
|
lo = lo + Math.imul(al0, bl2) | 0;
|
|
mid = mid + Math.imul(al0, bh2) | 0;
|
|
mid = mid + Math.imul(ah0, bl2) | 0;
|
|
hi = hi + Math.imul(ah0, bh2) | 0;
|
|
var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0;
|
|
w2 &= 67108863;
|
|
lo = Math.imul(al3, bl0);
|
|
mid = Math.imul(al3, bh0);
|
|
mid = mid + Math.imul(ah3, bl0) | 0;
|
|
hi = Math.imul(ah3, bh0);
|
|
lo = lo + Math.imul(al2, bl1) | 0;
|
|
mid = mid + Math.imul(al2, bh1) | 0;
|
|
mid = mid + Math.imul(ah2, bl1) | 0;
|
|
hi = hi + Math.imul(ah2, bh1) | 0;
|
|
lo = lo + Math.imul(al1, bl2) | 0;
|
|
mid = mid + Math.imul(al1, bh2) | 0;
|
|
mid = mid + Math.imul(ah1, bl2) | 0;
|
|
hi = hi + Math.imul(ah1, bh2) | 0;
|
|
lo = lo + Math.imul(al0, bl3) | 0;
|
|
mid = mid + Math.imul(al0, bh3) | 0;
|
|
mid = mid + Math.imul(ah0, bl3) | 0;
|
|
hi = hi + Math.imul(ah0, bh3) | 0;
|
|
var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0;
|
|
w3 &= 67108863;
|
|
lo = Math.imul(al4, bl0);
|
|
mid = Math.imul(al4, bh0);
|
|
mid = mid + Math.imul(ah4, bl0) | 0;
|
|
hi = Math.imul(ah4, bh0);
|
|
lo = lo + Math.imul(al3, bl1) | 0;
|
|
mid = mid + Math.imul(al3, bh1) | 0;
|
|
mid = mid + Math.imul(ah3, bl1) | 0;
|
|
hi = hi + Math.imul(ah3, bh1) | 0;
|
|
lo = lo + Math.imul(al2, bl2) | 0;
|
|
mid = mid + Math.imul(al2, bh2) | 0;
|
|
mid = mid + Math.imul(ah2, bl2) | 0;
|
|
hi = hi + Math.imul(ah2, bh2) | 0;
|
|
lo = lo + Math.imul(al1, bl3) | 0;
|
|
mid = mid + Math.imul(al1, bh3) | 0;
|
|
mid = mid + Math.imul(ah1, bl3) | 0;
|
|
hi = hi + Math.imul(ah1, bh3) | 0;
|
|
lo = lo + Math.imul(al0, bl4) | 0;
|
|
mid = mid + Math.imul(al0, bh4) | 0;
|
|
mid = mid + Math.imul(ah0, bl4) | 0;
|
|
hi = hi + Math.imul(ah0, bh4) | 0;
|
|
var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0;
|
|
w4 &= 67108863;
|
|
lo = Math.imul(al5, bl0);
|
|
mid = Math.imul(al5, bh0);
|
|
mid = mid + Math.imul(ah5, bl0) | 0;
|
|
hi = Math.imul(ah5, bh0);
|
|
lo = lo + Math.imul(al4, bl1) | 0;
|
|
mid = mid + Math.imul(al4, bh1) | 0;
|
|
mid = mid + Math.imul(ah4, bl1) | 0;
|
|
hi = hi + Math.imul(ah4, bh1) | 0;
|
|
lo = lo + Math.imul(al3, bl2) | 0;
|
|
mid = mid + Math.imul(al3, bh2) | 0;
|
|
mid = mid + Math.imul(ah3, bl2) | 0;
|
|
hi = hi + Math.imul(ah3, bh2) | 0;
|
|
lo = lo + Math.imul(al2, bl3) | 0;
|
|
mid = mid + Math.imul(al2, bh3) | 0;
|
|
mid = mid + Math.imul(ah2, bl3) | 0;
|
|
hi = hi + Math.imul(ah2, bh3) | 0;
|
|
lo = lo + Math.imul(al1, bl4) | 0;
|
|
mid = mid + Math.imul(al1, bh4) | 0;
|
|
mid = mid + Math.imul(ah1, bl4) | 0;
|
|
hi = hi + Math.imul(ah1, bh4) | 0;
|
|
lo = lo + Math.imul(al0, bl5) | 0;
|
|
mid = mid + Math.imul(al0, bh5) | 0;
|
|
mid = mid + Math.imul(ah0, bl5) | 0;
|
|
hi = hi + Math.imul(ah0, bh5) | 0;
|
|
var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0;
|
|
w5 &= 67108863;
|
|
lo = Math.imul(al6, bl0);
|
|
mid = Math.imul(al6, bh0);
|
|
mid = mid + Math.imul(ah6, bl0) | 0;
|
|
hi = Math.imul(ah6, bh0);
|
|
lo = lo + Math.imul(al5, bl1) | 0;
|
|
mid = mid + Math.imul(al5, bh1) | 0;
|
|
mid = mid + Math.imul(ah5, bl1) | 0;
|
|
hi = hi + Math.imul(ah5, bh1) | 0;
|
|
lo = lo + Math.imul(al4, bl2) | 0;
|
|
mid = mid + Math.imul(al4, bh2) | 0;
|
|
mid = mid + Math.imul(ah4, bl2) | 0;
|
|
hi = hi + Math.imul(ah4, bh2) | 0;
|
|
lo = lo + Math.imul(al3, bl3) | 0;
|
|
mid = mid + Math.imul(al3, bh3) | 0;
|
|
mid = mid + Math.imul(ah3, bl3) | 0;
|
|
hi = hi + Math.imul(ah3, bh3) | 0;
|
|
lo = lo + Math.imul(al2, bl4) | 0;
|
|
mid = mid + Math.imul(al2, bh4) | 0;
|
|
mid = mid + Math.imul(ah2, bl4) | 0;
|
|
hi = hi + Math.imul(ah2, bh4) | 0;
|
|
lo = lo + Math.imul(al1, bl5) | 0;
|
|
mid = mid + Math.imul(al1, bh5) | 0;
|
|
mid = mid + Math.imul(ah1, bl5) | 0;
|
|
hi = hi + Math.imul(ah1, bh5) | 0;
|
|
lo = lo + Math.imul(al0, bl6) | 0;
|
|
mid = mid + Math.imul(al0, bh6) | 0;
|
|
mid = mid + Math.imul(ah0, bl6) | 0;
|
|
hi = hi + Math.imul(ah0, bh6) | 0;
|
|
var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0;
|
|
w6 &= 67108863;
|
|
lo = Math.imul(al7, bl0);
|
|
mid = Math.imul(al7, bh0);
|
|
mid = mid + Math.imul(ah7, bl0) | 0;
|
|
hi = Math.imul(ah7, bh0);
|
|
lo = lo + Math.imul(al6, bl1) | 0;
|
|
mid = mid + Math.imul(al6, bh1) | 0;
|
|
mid = mid + Math.imul(ah6, bl1) | 0;
|
|
hi = hi + Math.imul(ah6, bh1) | 0;
|
|
lo = lo + Math.imul(al5, bl2) | 0;
|
|
mid = mid + Math.imul(al5, bh2) | 0;
|
|
mid = mid + Math.imul(ah5, bl2) | 0;
|
|
hi = hi + Math.imul(ah5, bh2) | 0;
|
|
lo = lo + Math.imul(al4, bl3) | 0;
|
|
mid = mid + Math.imul(al4, bh3) | 0;
|
|
mid = mid + Math.imul(ah4, bl3) | 0;
|
|
hi = hi + Math.imul(ah4, bh3) | 0;
|
|
lo = lo + Math.imul(al3, bl4) | 0;
|
|
mid = mid + Math.imul(al3, bh4) | 0;
|
|
mid = mid + Math.imul(ah3, bl4) | 0;
|
|
hi = hi + Math.imul(ah3, bh4) | 0;
|
|
lo = lo + Math.imul(al2, bl5) | 0;
|
|
mid = mid + Math.imul(al2, bh5) | 0;
|
|
mid = mid + Math.imul(ah2, bl5) | 0;
|
|
hi = hi + Math.imul(ah2, bh5) | 0;
|
|
lo = lo + Math.imul(al1, bl6) | 0;
|
|
mid = mid + Math.imul(al1, bh6) | 0;
|
|
mid = mid + Math.imul(ah1, bl6) | 0;
|
|
hi = hi + Math.imul(ah1, bh6) | 0;
|
|
lo = lo + Math.imul(al0, bl7) | 0;
|
|
mid = mid + Math.imul(al0, bh7) | 0;
|
|
mid = mid + Math.imul(ah0, bl7) | 0;
|
|
hi = hi + Math.imul(ah0, bh7) | 0;
|
|
var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0;
|
|
w7 &= 67108863;
|
|
lo = Math.imul(al8, bl0);
|
|
mid = Math.imul(al8, bh0);
|
|
mid = mid + Math.imul(ah8, bl0) | 0;
|
|
hi = Math.imul(ah8, bh0);
|
|
lo = lo + Math.imul(al7, bl1) | 0;
|
|
mid = mid + Math.imul(al7, bh1) | 0;
|
|
mid = mid + Math.imul(ah7, bl1) | 0;
|
|
hi = hi + Math.imul(ah7, bh1) | 0;
|
|
lo = lo + Math.imul(al6, bl2) | 0;
|
|
mid = mid + Math.imul(al6, bh2) | 0;
|
|
mid = mid + Math.imul(ah6, bl2) | 0;
|
|
hi = hi + Math.imul(ah6, bh2) | 0;
|
|
lo = lo + Math.imul(al5, bl3) | 0;
|
|
mid = mid + Math.imul(al5, bh3) | 0;
|
|
mid = mid + Math.imul(ah5, bl3) | 0;
|
|
hi = hi + Math.imul(ah5, bh3) | 0;
|
|
lo = lo + Math.imul(al4, bl4) | 0;
|
|
mid = mid + Math.imul(al4, bh4) | 0;
|
|
mid = mid + Math.imul(ah4, bl4) | 0;
|
|
hi = hi + Math.imul(ah4, bh4) | 0;
|
|
lo = lo + Math.imul(al3, bl5) | 0;
|
|
mid = mid + Math.imul(al3, bh5) | 0;
|
|
mid = mid + Math.imul(ah3, bl5) | 0;
|
|
hi = hi + Math.imul(ah3, bh5) | 0;
|
|
lo = lo + Math.imul(al2, bl6) | 0;
|
|
mid = mid + Math.imul(al2, bh6) | 0;
|
|
mid = mid + Math.imul(ah2, bl6) | 0;
|
|
hi = hi + Math.imul(ah2, bh6) | 0;
|
|
lo = lo + Math.imul(al1, bl7) | 0;
|
|
mid = mid + Math.imul(al1, bh7) | 0;
|
|
mid = mid + Math.imul(ah1, bl7) | 0;
|
|
hi = hi + Math.imul(ah1, bh7) | 0;
|
|
lo = lo + Math.imul(al0, bl8) | 0;
|
|
mid = mid + Math.imul(al0, bh8) | 0;
|
|
mid = mid + Math.imul(ah0, bl8) | 0;
|
|
hi = hi + Math.imul(ah0, bh8) | 0;
|
|
var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0;
|
|
w8 &= 67108863;
|
|
lo = Math.imul(al9, bl0);
|
|
mid = Math.imul(al9, bh0);
|
|
mid = mid + Math.imul(ah9, bl0) | 0;
|
|
hi = Math.imul(ah9, bh0);
|
|
lo = lo + Math.imul(al8, bl1) | 0;
|
|
mid = mid + Math.imul(al8, bh1) | 0;
|
|
mid = mid + Math.imul(ah8, bl1) | 0;
|
|
hi = hi + Math.imul(ah8, bh1) | 0;
|
|
lo = lo + Math.imul(al7, bl2) | 0;
|
|
mid = mid + Math.imul(al7, bh2) | 0;
|
|
mid = mid + Math.imul(ah7, bl2) | 0;
|
|
hi = hi + Math.imul(ah7, bh2) | 0;
|
|
lo = lo + Math.imul(al6, bl3) | 0;
|
|
mid = mid + Math.imul(al6, bh3) | 0;
|
|
mid = mid + Math.imul(ah6, bl3) | 0;
|
|
hi = hi + Math.imul(ah6, bh3) | 0;
|
|
lo = lo + Math.imul(al5, bl4) | 0;
|
|
mid = mid + Math.imul(al5, bh4) | 0;
|
|
mid = mid + Math.imul(ah5, bl4) | 0;
|
|
hi = hi + Math.imul(ah5, bh4) | 0;
|
|
lo = lo + Math.imul(al4, bl5) | 0;
|
|
mid = mid + Math.imul(al4, bh5) | 0;
|
|
mid = mid + Math.imul(ah4, bl5) | 0;
|
|
hi = hi + Math.imul(ah4, bh5) | 0;
|
|
lo = lo + Math.imul(al3, bl6) | 0;
|
|
mid = mid + Math.imul(al3, bh6) | 0;
|
|
mid = mid + Math.imul(ah3, bl6) | 0;
|
|
hi = hi + Math.imul(ah3, bh6) | 0;
|
|
lo = lo + Math.imul(al2, bl7) | 0;
|
|
mid = mid + Math.imul(al2, bh7) | 0;
|
|
mid = mid + Math.imul(ah2, bl7) | 0;
|
|
hi = hi + Math.imul(ah2, bh7) | 0;
|
|
lo = lo + Math.imul(al1, bl8) | 0;
|
|
mid = mid + Math.imul(al1, bh8) | 0;
|
|
mid = mid + Math.imul(ah1, bl8) | 0;
|
|
hi = hi + Math.imul(ah1, bh8) | 0;
|
|
lo = lo + Math.imul(al0, bl9) | 0;
|
|
mid = mid + Math.imul(al0, bh9) | 0;
|
|
mid = mid + Math.imul(ah0, bl9) | 0;
|
|
hi = hi + Math.imul(ah0, bh9) | 0;
|
|
var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0;
|
|
w9 &= 67108863;
|
|
lo = Math.imul(al9, bl1);
|
|
mid = Math.imul(al9, bh1);
|
|
mid = mid + Math.imul(ah9, bl1) | 0;
|
|
hi = Math.imul(ah9, bh1);
|
|
lo = lo + Math.imul(al8, bl2) | 0;
|
|
mid = mid + Math.imul(al8, bh2) | 0;
|
|
mid = mid + Math.imul(ah8, bl2) | 0;
|
|
hi = hi + Math.imul(ah8, bh2) | 0;
|
|
lo = lo + Math.imul(al7, bl3) | 0;
|
|
mid = mid + Math.imul(al7, bh3) | 0;
|
|
mid = mid + Math.imul(ah7, bl3) | 0;
|
|
hi = hi + Math.imul(ah7, bh3) | 0;
|
|
lo = lo + Math.imul(al6, bl4) | 0;
|
|
mid = mid + Math.imul(al6, bh4) | 0;
|
|
mid = mid + Math.imul(ah6, bl4) | 0;
|
|
hi = hi + Math.imul(ah6, bh4) | 0;
|
|
lo = lo + Math.imul(al5, bl5) | 0;
|
|
mid = mid + Math.imul(al5, bh5) | 0;
|
|
mid = mid + Math.imul(ah5, bl5) | 0;
|
|
hi = hi + Math.imul(ah5, bh5) | 0;
|
|
lo = lo + Math.imul(al4, bl6) | 0;
|
|
mid = mid + Math.imul(al4, bh6) | 0;
|
|
mid = mid + Math.imul(ah4, bl6) | 0;
|
|
hi = hi + Math.imul(ah4, bh6) | 0;
|
|
lo = lo + Math.imul(al3, bl7) | 0;
|
|
mid = mid + Math.imul(al3, bh7) | 0;
|
|
mid = mid + Math.imul(ah3, bl7) | 0;
|
|
hi = hi + Math.imul(ah3, bh7) | 0;
|
|
lo = lo + Math.imul(al2, bl8) | 0;
|
|
mid = mid + Math.imul(al2, bh8) | 0;
|
|
mid = mid + Math.imul(ah2, bl8) | 0;
|
|
hi = hi + Math.imul(ah2, bh8) | 0;
|
|
lo = lo + Math.imul(al1, bl9) | 0;
|
|
mid = mid + Math.imul(al1, bh9) | 0;
|
|
mid = mid + Math.imul(ah1, bl9) | 0;
|
|
hi = hi + Math.imul(ah1, bh9) | 0;
|
|
var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0;
|
|
w10 &= 67108863;
|
|
lo = Math.imul(al9, bl2);
|
|
mid = Math.imul(al9, bh2);
|
|
mid = mid + Math.imul(ah9, bl2) | 0;
|
|
hi = Math.imul(ah9, bh2);
|
|
lo = lo + Math.imul(al8, bl3) | 0;
|
|
mid = mid + Math.imul(al8, bh3) | 0;
|
|
mid = mid + Math.imul(ah8, bl3) | 0;
|
|
hi = hi + Math.imul(ah8, bh3) | 0;
|
|
lo = lo + Math.imul(al7, bl4) | 0;
|
|
mid = mid + Math.imul(al7, bh4) | 0;
|
|
mid = mid + Math.imul(ah7, bl4) | 0;
|
|
hi = hi + Math.imul(ah7, bh4) | 0;
|
|
lo = lo + Math.imul(al6, bl5) | 0;
|
|
mid = mid + Math.imul(al6, bh5) | 0;
|
|
mid = mid + Math.imul(ah6, bl5) | 0;
|
|
hi = hi + Math.imul(ah6, bh5) | 0;
|
|
lo = lo + Math.imul(al5, bl6) | 0;
|
|
mid = mid + Math.imul(al5, bh6) | 0;
|
|
mid = mid + Math.imul(ah5, bl6) | 0;
|
|
hi = hi + Math.imul(ah5, bh6) | 0;
|
|
lo = lo + Math.imul(al4, bl7) | 0;
|
|
mid = mid + Math.imul(al4, bh7) | 0;
|
|
mid = mid + Math.imul(ah4, bl7) | 0;
|
|
hi = hi + Math.imul(ah4, bh7) | 0;
|
|
lo = lo + Math.imul(al3, bl8) | 0;
|
|
mid = mid + Math.imul(al3, bh8) | 0;
|
|
mid = mid + Math.imul(ah3, bl8) | 0;
|
|
hi = hi + Math.imul(ah3, bh8) | 0;
|
|
lo = lo + Math.imul(al2, bl9) | 0;
|
|
mid = mid + Math.imul(al2, bh9) | 0;
|
|
mid = mid + Math.imul(ah2, bl9) | 0;
|
|
hi = hi + Math.imul(ah2, bh9) | 0;
|
|
var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0;
|
|
w11 &= 67108863;
|
|
lo = Math.imul(al9, bl3);
|
|
mid = Math.imul(al9, bh3);
|
|
mid = mid + Math.imul(ah9, bl3) | 0;
|
|
hi = Math.imul(ah9, bh3);
|
|
lo = lo + Math.imul(al8, bl4) | 0;
|
|
mid = mid + Math.imul(al8, bh4) | 0;
|
|
mid = mid + Math.imul(ah8, bl4) | 0;
|
|
hi = hi + Math.imul(ah8, bh4) | 0;
|
|
lo = lo + Math.imul(al7, bl5) | 0;
|
|
mid = mid + Math.imul(al7, bh5) | 0;
|
|
mid = mid + Math.imul(ah7, bl5) | 0;
|
|
hi = hi + Math.imul(ah7, bh5) | 0;
|
|
lo = lo + Math.imul(al6, bl6) | 0;
|
|
mid = mid + Math.imul(al6, bh6) | 0;
|
|
mid = mid + Math.imul(ah6, bl6) | 0;
|
|
hi = hi + Math.imul(ah6, bh6) | 0;
|
|
lo = lo + Math.imul(al5, bl7) | 0;
|
|
mid = mid + Math.imul(al5, bh7) | 0;
|
|
mid = mid + Math.imul(ah5, bl7) | 0;
|
|
hi = hi + Math.imul(ah5, bh7) | 0;
|
|
lo = lo + Math.imul(al4, bl8) | 0;
|
|
mid = mid + Math.imul(al4, bh8) | 0;
|
|
mid = mid + Math.imul(ah4, bl8) | 0;
|
|
hi = hi + Math.imul(ah4, bh8) | 0;
|
|
lo = lo + Math.imul(al3, bl9) | 0;
|
|
mid = mid + Math.imul(al3, bh9) | 0;
|
|
mid = mid + Math.imul(ah3, bl9) | 0;
|
|
hi = hi + Math.imul(ah3, bh9) | 0;
|
|
var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0;
|
|
w12 &= 67108863;
|
|
lo = Math.imul(al9, bl4);
|
|
mid = Math.imul(al9, bh4);
|
|
mid = mid + Math.imul(ah9, bl4) | 0;
|
|
hi = Math.imul(ah9, bh4);
|
|
lo = lo + Math.imul(al8, bl5) | 0;
|
|
mid = mid + Math.imul(al8, bh5) | 0;
|
|
mid = mid + Math.imul(ah8, bl5) | 0;
|
|
hi = hi + Math.imul(ah8, bh5) | 0;
|
|
lo = lo + Math.imul(al7, bl6) | 0;
|
|
mid = mid + Math.imul(al7, bh6) | 0;
|
|
mid = mid + Math.imul(ah7, bl6) | 0;
|
|
hi = hi + Math.imul(ah7, bh6) | 0;
|
|
lo = lo + Math.imul(al6, bl7) | 0;
|
|
mid = mid + Math.imul(al6, bh7) | 0;
|
|
mid = mid + Math.imul(ah6, bl7) | 0;
|
|
hi = hi + Math.imul(ah6, bh7) | 0;
|
|
lo = lo + Math.imul(al5, bl8) | 0;
|
|
mid = mid + Math.imul(al5, bh8) | 0;
|
|
mid = mid + Math.imul(ah5, bl8) | 0;
|
|
hi = hi + Math.imul(ah5, bh8) | 0;
|
|
lo = lo + Math.imul(al4, bl9) | 0;
|
|
mid = mid + Math.imul(al4, bh9) | 0;
|
|
mid = mid + Math.imul(ah4, bl9) | 0;
|
|
hi = hi + Math.imul(ah4, bh9) | 0;
|
|
var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0;
|
|
w13 &= 67108863;
|
|
lo = Math.imul(al9, bl5);
|
|
mid = Math.imul(al9, bh5);
|
|
mid = mid + Math.imul(ah9, bl5) | 0;
|
|
hi = Math.imul(ah9, bh5);
|
|
lo = lo + Math.imul(al8, bl6) | 0;
|
|
mid = mid + Math.imul(al8, bh6) | 0;
|
|
mid = mid + Math.imul(ah8, bl6) | 0;
|
|
hi = hi + Math.imul(ah8, bh6) | 0;
|
|
lo = lo + Math.imul(al7, bl7) | 0;
|
|
mid = mid + Math.imul(al7, bh7) | 0;
|
|
mid = mid + Math.imul(ah7, bl7) | 0;
|
|
hi = hi + Math.imul(ah7, bh7) | 0;
|
|
lo = lo + Math.imul(al6, bl8) | 0;
|
|
mid = mid + Math.imul(al6, bh8) | 0;
|
|
mid = mid + Math.imul(ah6, bl8) | 0;
|
|
hi = hi + Math.imul(ah6, bh8) | 0;
|
|
lo = lo + Math.imul(al5, bl9) | 0;
|
|
mid = mid + Math.imul(al5, bh9) | 0;
|
|
mid = mid + Math.imul(ah5, bl9) | 0;
|
|
hi = hi + Math.imul(ah5, bh9) | 0;
|
|
var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0;
|
|
w14 &= 67108863;
|
|
lo = Math.imul(al9, bl6);
|
|
mid = Math.imul(al9, bh6);
|
|
mid = mid + Math.imul(ah9, bl6) | 0;
|
|
hi = Math.imul(ah9, bh6);
|
|
lo = lo + Math.imul(al8, bl7) | 0;
|
|
mid = mid + Math.imul(al8, bh7) | 0;
|
|
mid = mid + Math.imul(ah8, bl7) | 0;
|
|
hi = hi + Math.imul(ah8, bh7) | 0;
|
|
lo = lo + Math.imul(al7, bl8) | 0;
|
|
mid = mid + Math.imul(al7, bh8) | 0;
|
|
mid = mid + Math.imul(ah7, bl8) | 0;
|
|
hi = hi + Math.imul(ah7, bh8) | 0;
|
|
lo = lo + Math.imul(al6, bl9) | 0;
|
|
mid = mid + Math.imul(al6, bh9) | 0;
|
|
mid = mid + Math.imul(ah6, bl9) | 0;
|
|
hi = hi + Math.imul(ah6, bh9) | 0;
|
|
var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0;
|
|
w15 &= 67108863;
|
|
lo = Math.imul(al9, bl7);
|
|
mid = Math.imul(al9, bh7);
|
|
mid = mid + Math.imul(ah9, bl7) | 0;
|
|
hi = Math.imul(ah9, bh7);
|
|
lo = lo + Math.imul(al8, bl8) | 0;
|
|
mid = mid + Math.imul(al8, bh8) | 0;
|
|
mid = mid + Math.imul(ah8, bl8) | 0;
|
|
hi = hi + Math.imul(ah8, bh8) | 0;
|
|
lo = lo + Math.imul(al7, bl9) | 0;
|
|
mid = mid + Math.imul(al7, bh9) | 0;
|
|
mid = mid + Math.imul(ah7, bl9) | 0;
|
|
hi = hi + Math.imul(ah7, bh9) | 0;
|
|
var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0;
|
|
w16 &= 67108863;
|
|
lo = Math.imul(al9, bl8);
|
|
mid = Math.imul(al9, bh8);
|
|
mid = mid + Math.imul(ah9, bl8) | 0;
|
|
hi = Math.imul(ah9, bh8);
|
|
lo = lo + Math.imul(al8, bl9) | 0;
|
|
mid = mid + Math.imul(al8, bh9) | 0;
|
|
mid = mid + Math.imul(ah8, bl9) | 0;
|
|
hi = hi + Math.imul(ah8, bh9) | 0;
|
|
var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0;
|
|
w17 &= 67108863;
|
|
lo = Math.imul(al9, bl9);
|
|
mid = Math.imul(al9, bh9);
|
|
mid = mid + Math.imul(ah9, bl9) | 0;
|
|
hi = Math.imul(ah9, bh9);
|
|
var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0;
|
|
w18 &= 67108863;
|
|
o[0] = w0;
|
|
o[1] = w1;
|
|
o[2] = w2;
|
|
o[3] = w3;
|
|
o[4] = w4;
|
|
o[5] = w5;
|
|
o[6] = w6;
|
|
o[7] = w7;
|
|
o[8] = w8;
|
|
o[9] = w9;
|
|
o[10] = w10;
|
|
o[11] = w11;
|
|
o[12] = w12;
|
|
o[13] = w13;
|
|
o[14] = w14;
|
|
o[15] = w15;
|
|
o[16] = w16;
|
|
o[17] = w17;
|
|
o[18] = w18;
|
|
if (c !== 0) {
|
|
o[19] = c;
|
|
out.length++;
|
|
}
|
|
return out;
|
|
};
|
|
if (!Math.imul) {
|
|
comb10MulTo = smallMulTo;
|
|
}
|
|
function bigMulTo(self2, num, out) {
|
|
out.negative = num.negative ^ self2.negative;
|
|
out.length = self2.length + num.length;
|
|
var carry = 0;
|
|
var hncarry = 0;
|
|
for (var k = 0;k < out.length - 1; k++) {
|
|
var ncarry = hncarry;
|
|
hncarry = 0;
|
|
var rword = carry & 67108863;
|
|
var maxJ = Math.min(k, num.length - 1);
|
|
for (var j = Math.max(0, k - self2.length + 1);j <= maxJ; j++) {
|
|
var i = k - j;
|
|
var a = self2.words[i] | 0;
|
|
var b = num.words[j] | 0;
|
|
var r = a * b;
|
|
var lo = r & 67108863;
|
|
ncarry = ncarry + (r / 67108864 | 0) | 0;
|
|
lo = lo + rword | 0;
|
|
rword = lo & 67108863;
|
|
ncarry = ncarry + (lo >>> 26) | 0;
|
|
hncarry += ncarry >>> 26;
|
|
ncarry &= 67108863;
|
|
}
|
|
out.words[k] = rword;
|
|
carry = ncarry;
|
|
ncarry = hncarry;
|
|
}
|
|
if (carry !== 0) {
|
|
out.words[k] = carry;
|
|
} else {
|
|
out.length--;
|
|
}
|
|
return out.strip();
|
|
}
|
|
function jumboMulTo(self2, num, out) {
|
|
var fftm = new FFTM;
|
|
return fftm.mulp(self2, num, out);
|
|
}
|
|
BN.prototype.mulTo = function mulTo(num, out) {
|
|
var res;
|
|
var len = this.length + num.length;
|
|
if (this.length === 10 && num.length === 10) {
|
|
res = comb10MulTo(this, num, out);
|
|
} else if (len < 63) {
|
|
res = smallMulTo(this, num, out);
|
|
} else if (len < 1024) {
|
|
res = bigMulTo(this, num, out);
|
|
} else {
|
|
res = jumboMulTo(this, num, out);
|
|
}
|
|
return res;
|
|
};
|
|
function FFTM(x, y) {
|
|
this.x = x;
|
|
this.y = y;
|
|
}
|
|
FFTM.prototype.makeRBT = function makeRBT(N) {
|
|
var t = new Array(N);
|
|
var l = BN.prototype._countBits(N) - 1;
|
|
for (var i = 0;i < N; i++) {
|
|
t[i] = this.revBin(i, l, N);
|
|
}
|
|
return t;
|
|
};
|
|
FFTM.prototype.revBin = function revBin(x, l, N) {
|
|
if (x === 0 || x === N - 1)
|
|
return x;
|
|
var rb = 0;
|
|
for (var i = 0;i < l; i++) {
|
|
rb |= (x & 1) << l - i - 1;
|
|
x >>= 1;
|
|
}
|
|
return rb;
|
|
};
|
|
FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) {
|
|
for (var i = 0;i < N; i++) {
|
|
rtws[i] = rws[rbt[i]];
|
|
itws[i] = iws[rbt[i]];
|
|
}
|
|
};
|
|
FFTM.prototype.transform = function transform(rws, iws, rtws, itws, N, rbt) {
|
|
this.permute(rbt, rws, iws, rtws, itws, N);
|
|
for (var s = 1;s < N; s <<= 1) {
|
|
var l = s << 1;
|
|
var rtwdf = Math.cos(2 * Math.PI / l);
|
|
var itwdf = Math.sin(2 * Math.PI / l);
|
|
for (var p = 0;p < N; p += l) {
|
|
var rtwdf_ = rtwdf;
|
|
var itwdf_ = itwdf;
|
|
for (var j = 0;j < s; j++) {
|
|
var re = rtws[p + j];
|
|
var ie = itws[p + j];
|
|
var ro = rtws[p + j + s];
|
|
var io = itws[p + j + s];
|
|
var rx = rtwdf_ * ro - itwdf_ * io;
|
|
io = rtwdf_ * io + itwdf_ * ro;
|
|
ro = rx;
|
|
rtws[p + j] = re + ro;
|
|
itws[p + j] = ie + io;
|
|
rtws[p + j + s] = re - ro;
|
|
itws[p + j + s] = ie - io;
|
|
if (j !== l) {
|
|
rx = rtwdf * rtwdf_ - itwdf * itwdf_;
|
|
itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
|
|
rtwdf_ = rx;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
FFTM.prototype.guessLen13b = function guessLen13b(n, m) {
|
|
var N = Math.max(m, n) | 1;
|
|
var odd = N & 1;
|
|
var i = 0;
|
|
for (N = N / 2 | 0;N; N = N >>> 1) {
|
|
i++;
|
|
}
|
|
return 1 << i + 1 + odd;
|
|
};
|
|
FFTM.prototype.conjugate = function conjugate(rws, iws, N) {
|
|
if (N <= 1)
|
|
return;
|
|
for (var i = 0;i < N / 2; i++) {
|
|
var t = rws[i];
|
|
rws[i] = rws[N - i - 1];
|
|
rws[N - i - 1] = t;
|
|
t = iws[i];
|
|
iws[i] = -iws[N - i - 1];
|
|
iws[N - i - 1] = -t;
|
|
}
|
|
};
|
|
FFTM.prototype.normalize13b = function normalize13b(ws, N) {
|
|
var carry = 0;
|
|
for (var i = 0;i < N / 2; i++) {
|
|
var w = Math.round(ws[2 * i + 1] / N) * 8192 + Math.round(ws[2 * i] / N) + carry;
|
|
ws[i] = w & 67108863;
|
|
if (w < 67108864) {
|
|
carry = 0;
|
|
} else {
|
|
carry = w / 67108864 | 0;
|
|
}
|
|
}
|
|
return ws;
|
|
};
|
|
FFTM.prototype.convert13b = function convert13b(ws, len, rws, N) {
|
|
var carry = 0;
|
|
for (var i = 0;i < len; i++) {
|
|
carry = carry + (ws[i] | 0);
|
|
rws[2 * i] = carry & 8191;
|
|
carry = carry >>> 13;
|
|
rws[2 * i + 1] = carry & 8191;
|
|
carry = carry >>> 13;
|
|
}
|
|
for (i = 2 * len;i < N; ++i) {
|
|
rws[i] = 0;
|
|
}
|
|
assert(carry === 0);
|
|
assert((carry & ~8191) === 0);
|
|
};
|
|
FFTM.prototype.stub = function stub(N) {
|
|
var ph = new Array(N);
|
|
for (var i = 0;i < N; i++) {
|
|
ph[i] = 0;
|
|
}
|
|
return ph;
|
|
};
|
|
FFTM.prototype.mulp = function mulp(x, y, out) {
|
|
var N = 2 * this.guessLen13b(x.length, y.length);
|
|
var rbt = this.makeRBT(N);
|
|
var _ = this.stub(N);
|
|
var rws = new Array(N);
|
|
var rwst = new Array(N);
|
|
var iwst = new Array(N);
|
|
var nrws = new Array(N);
|
|
var nrwst = new Array(N);
|
|
var niwst = new Array(N);
|
|
var rmws = out.words;
|
|
rmws.length = N;
|
|
this.convert13b(x.words, x.length, rws, N);
|
|
this.convert13b(y.words, y.length, nrws, N);
|
|
this.transform(rws, _, rwst, iwst, N, rbt);
|
|
this.transform(nrws, _, nrwst, niwst, N, rbt);
|
|
for (var i = 0;i < N; i++) {
|
|
var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
|
|
iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
|
|
rwst[i] = rx;
|
|
}
|
|
this.conjugate(rwst, iwst, N);
|
|
this.transform(rwst, iwst, rmws, _, N, rbt);
|
|
this.conjugate(rmws, _, N);
|
|
this.normalize13b(rmws, N);
|
|
out.negative = x.negative ^ y.negative;
|
|
out.length = x.length + y.length;
|
|
return out.strip();
|
|
};
|
|
BN.prototype.mul = function mul(num) {
|
|
var out = new BN(null);
|
|
out.words = new Array(this.length + num.length);
|
|
return this.mulTo(num, out);
|
|
};
|
|
BN.prototype.mulf = function mulf(num) {
|
|
var out = new BN(null);
|
|
out.words = new Array(this.length + num.length);
|
|
return jumboMulTo(this, num, out);
|
|
};
|
|
BN.prototype.imul = function imul(num) {
|
|
return this.clone().mulTo(num, this);
|
|
};
|
|
BN.prototype.imuln = function imuln(num) {
|
|
assert(typeof num === "number");
|
|
assert(num < 67108864);
|
|
var carry = 0;
|
|
for (var i = 0;i < this.length; i++) {
|
|
var w = (this.words[i] | 0) * num;
|
|
var lo = (w & 67108863) + (carry & 67108863);
|
|
carry >>= 26;
|
|
carry += w / 67108864 | 0;
|
|
carry += lo >>> 26;
|
|
this.words[i] = lo & 67108863;
|
|
}
|
|
if (carry !== 0) {
|
|
this.words[i] = carry;
|
|
this.length++;
|
|
}
|
|
this.length = num === 0 ? 1 : this.length;
|
|
return this;
|
|
};
|
|
BN.prototype.muln = function muln(num) {
|
|
return this.clone().imuln(num);
|
|
};
|
|
BN.prototype.sqr = function sqr() {
|
|
return this.mul(this);
|
|
};
|
|
BN.prototype.isqr = function isqr() {
|
|
return this.imul(this.clone());
|
|
};
|
|
BN.prototype.pow = function pow(num) {
|
|
var w = toBitArray(num);
|
|
if (w.length === 0)
|
|
return new BN(1);
|
|
var res = this;
|
|
for (var i = 0;i < w.length; i++, res = res.sqr()) {
|
|
if (w[i] !== 0)
|
|
break;
|
|
}
|
|
if (++i < w.length) {
|
|
for (var q = res.sqr();i < w.length; i++, q = q.sqr()) {
|
|
if (w[i] === 0)
|
|
continue;
|
|
res = res.mul(q);
|
|
}
|
|
}
|
|
return res;
|
|
};
|
|
BN.prototype.iushln = function iushln(bits) {
|
|
assert(typeof bits === "number" && bits >= 0);
|
|
var r = bits % 26;
|
|
var s = (bits - r) / 26;
|
|
var carryMask = 67108863 >>> 26 - r << 26 - r;
|
|
var i;
|
|
if (r !== 0) {
|
|
var carry = 0;
|
|
for (i = 0;i < this.length; i++) {
|
|
var newCarry = this.words[i] & carryMask;
|
|
var c = (this.words[i] | 0) - newCarry << r;
|
|
this.words[i] = c | carry;
|
|
carry = newCarry >>> 26 - r;
|
|
}
|
|
if (carry) {
|
|
this.words[i] = carry;
|
|
this.length++;
|
|
}
|
|
}
|
|
if (s !== 0) {
|
|
for (i = this.length - 1;i >= 0; i--) {
|
|
this.words[i + s] = this.words[i];
|
|
}
|
|
for (i = 0;i < s; i++) {
|
|
this.words[i] = 0;
|
|
}
|
|
this.length += s;
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.ishln = function ishln(bits) {
|
|
assert(this.negative === 0);
|
|
return this.iushln(bits);
|
|
};
|
|
BN.prototype.iushrn = function iushrn(bits, hint, extended) {
|
|
assert(typeof bits === "number" && bits >= 0);
|
|
var h;
|
|
if (hint) {
|
|
h = (hint - hint % 26) / 26;
|
|
} else {
|
|
h = 0;
|
|
}
|
|
var r = bits % 26;
|
|
var s = Math.min((bits - r) / 26, this.length);
|
|
var mask = 67108863 ^ 67108863 >>> r << r;
|
|
var maskedWords = extended;
|
|
h -= s;
|
|
h = Math.max(0, h);
|
|
if (maskedWords) {
|
|
for (var i = 0;i < s; i++) {
|
|
maskedWords.words[i] = this.words[i];
|
|
}
|
|
maskedWords.length = s;
|
|
}
|
|
if (s === 0) {} else if (this.length > s) {
|
|
this.length -= s;
|
|
for (i = 0;i < this.length; i++) {
|
|
this.words[i] = this.words[i + s];
|
|
}
|
|
} else {
|
|
this.words[0] = 0;
|
|
this.length = 1;
|
|
}
|
|
var carry = 0;
|
|
for (i = this.length - 1;i >= 0 && (carry !== 0 || i >= h); i--) {
|
|
var word = this.words[i] | 0;
|
|
this.words[i] = carry << 26 - r | word >>> r;
|
|
carry = word & mask;
|
|
}
|
|
if (maskedWords && carry !== 0) {
|
|
maskedWords.words[maskedWords.length++] = carry;
|
|
}
|
|
if (this.length === 0) {
|
|
this.words[0] = 0;
|
|
this.length = 1;
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.ishrn = function ishrn(bits, hint, extended) {
|
|
assert(this.negative === 0);
|
|
return this.iushrn(bits, hint, extended);
|
|
};
|
|
BN.prototype.shln = function shln(bits) {
|
|
return this.clone().ishln(bits);
|
|
};
|
|
BN.prototype.ushln = function ushln(bits) {
|
|
return this.clone().iushln(bits);
|
|
};
|
|
BN.prototype.shrn = function shrn(bits) {
|
|
return this.clone().ishrn(bits);
|
|
};
|
|
BN.prototype.ushrn = function ushrn(bits) {
|
|
return this.clone().iushrn(bits);
|
|
};
|
|
BN.prototype.testn = function testn(bit) {
|
|
assert(typeof bit === "number" && bit >= 0);
|
|
var r = bit % 26;
|
|
var s = (bit - r) / 26;
|
|
var q = 1 << r;
|
|
if (this.length <= s)
|
|
return false;
|
|
var w = this.words[s];
|
|
return !!(w & q);
|
|
};
|
|
BN.prototype.imaskn = function imaskn(bits) {
|
|
assert(typeof bits === "number" && bits >= 0);
|
|
var r = bits % 26;
|
|
var s = (bits - r) / 26;
|
|
assert(this.negative === 0, "imaskn works only with positive numbers");
|
|
if (this.length <= s) {
|
|
return this;
|
|
}
|
|
if (r !== 0) {
|
|
s++;
|
|
}
|
|
this.length = Math.min(s, this.length);
|
|
if (r !== 0) {
|
|
var mask = 67108863 ^ 67108863 >>> r << r;
|
|
this.words[this.length - 1] &= mask;
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.maskn = function maskn(bits) {
|
|
return this.clone().imaskn(bits);
|
|
};
|
|
BN.prototype.iaddn = function iaddn(num) {
|
|
assert(typeof num === "number");
|
|
assert(num < 67108864);
|
|
if (num < 0)
|
|
return this.isubn(-num);
|
|
if (this.negative !== 0) {
|
|
if (this.length === 1 && (this.words[0] | 0) < num) {
|
|
this.words[0] = num - (this.words[0] | 0);
|
|
this.negative = 0;
|
|
return this;
|
|
}
|
|
this.negative = 0;
|
|
this.isubn(num);
|
|
this.negative = 1;
|
|
return this;
|
|
}
|
|
return this._iaddn(num);
|
|
};
|
|
BN.prototype._iaddn = function _iaddn(num) {
|
|
this.words[0] += num;
|
|
for (var i = 0;i < this.length && this.words[i] >= 67108864; i++) {
|
|
this.words[i] -= 67108864;
|
|
if (i === this.length - 1) {
|
|
this.words[i + 1] = 1;
|
|
} else {
|
|
this.words[i + 1]++;
|
|
}
|
|
}
|
|
this.length = Math.max(this.length, i + 1);
|
|
return this;
|
|
};
|
|
BN.prototype.isubn = function isubn(num) {
|
|
assert(typeof num === "number");
|
|
assert(num < 67108864);
|
|
if (num < 0)
|
|
return this.iaddn(-num);
|
|
if (this.negative !== 0) {
|
|
this.negative = 0;
|
|
this.iaddn(num);
|
|
this.negative = 1;
|
|
return this;
|
|
}
|
|
this.words[0] -= num;
|
|
if (this.length === 1 && this.words[0] < 0) {
|
|
this.words[0] = -this.words[0];
|
|
this.negative = 1;
|
|
} else {
|
|
for (var i = 0;i < this.length && this.words[i] < 0; i++) {
|
|
this.words[i] += 67108864;
|
|
this.words[i + 1] -= 1;
|
|
}
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.addn = function addn(num) {
|
|
return this.clone().iaddn(num);
|
|
};
|
|
BN.prototype.subn = function subn(num) {
|
|
return this.clone().isubn(num);
|
|
};
|
|
BN.prototype.iabs = function iabs() {
|
|
this.negative = 0;
|
|
return this;
|
|
};
|
|
BN.prototype.abs = function abs() {
|
|
return this.clone().iabs();
|
|
};
|
|
BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) {
|
|
var len = num.length + shift;
|
|
var i;
|
|
this._expand(len);
|
|
var w;
|
|
var carry = 0;
|
|
for (i = 0;i < num.length; i++) {
|
|
w = (this.words[i + shift] | 0) + carry;
|
|
var right = (num.words[i] | 0) * mul;
|
|
w -= right & 67108863;
|
|
carry = (w >> 26) - (right / 67108864 | 0);
|
|
this.words[i + shift] = w & 67108863;
|
|
}
|
|
for (;i < this.length - shift; i++) {
|
|
w = (this.words[i + shift] | 0) + carry;
|
|
carry = w >> 26;
|
|
this.words[i + shift] = w & 67108863;
|
|
}
|
|
if (carry === 0)
|
|
return this.strip();
|
|
assert(carry === -1);
|
|
carry = 0;
|
|
for (i = 0;i < this.length; i++) {
|
|
w = -(this.words[i] | 0) + carry;
|
|
carry = w >> 26;
|
|
this.words[i] = w & 67108863;
|
|
}
|
|
this.negative = 1;
|
|
return this.strip();
|
|
};
|
|
BN.prototype._wordDiv = function _wordDiv(num, mode) {
|
|
var shift = this.length - num.length;
|
|
var a = this.clone();
|
|
var b = num;
|
|
var bhi = b.words[b.length - 1] | 0;
|
|
var bhiBits = this._countBits(bhi);
|
|
shift = 26 - bhiBits;
|
|
if (shift !== 0) {
|
|
b = b.ushln(shift);
|
|
a.iushln(shift);
|
|
bhi = b.words[b.length - 1] | 0;
|
|
}
|
|
var m = a.length - b.length;
|
|
var q;
|
|
if (mode !== "mod") {
|
|
q = new BN(null);
|
|
q.length = m + 1;
|
|
q.words = new Array(q.length);
|
|
for (var i = 0;i < q.length; i++) {
|
|
q.words[i] = 0;
|
|
}
|
|
}
|
|
var diff = a.clone()._ishlnsubmul(b, 1, m);
|
|
if (diff.negative === 0) {
|
|
a = diff;
|
|
if (q) {
|
|
q.words[m] = 1;
|
|
}
|
|
}
|
|
for (var j = m - 1;j >= 0; j--) {
|
|
var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0);
|
|
qj = Math.min(qj / bhi | 0, 67108863);
|
|
a._ishlnsubmul(b, qj, j);
|
|
while (a.negative !== 0) {
|
|
qj--;
|
|
a.negative = 0;
|
|
a._ishlnsubmul(b, 1, j);
|
|
if (!a.isZero()) {
|
|
a.negative ^= 1;
|
|
}
|
|
}
|
|
if (q) {
|
|
q.words[j] = qj;
|
|
}
|
|
}
|
|
if (q) {
|
|
q.strip();
|
|
}
|
|
a.strip();
|
|
if (mode !== "div" && shift !== 0) {
|
|
a.iushrn(shift);
|
|
}
|
|
return {
|
|
div: q || null,
|
|
mod: a
|
|
};
|
|
};
|
|
BN.prototype.divmod = function divmod(num, mode, positive) {
|
|
assert(!num.isZero());
|
|
if (this.isZero()) {
|
|
return {
|
|
div: new BN(0),
|
|
mod: new BN(0)
|
|
};
|
|
}
|
|
var div, mod, res;
|
|
if (this.negative !== 0 && num.negative === 0) {
|
|
res = this.neg().divmod(num, mode);
|
|
if (mode !== "mod") {
|
|
div = res.div.neg();
|
|
}
|
|
if (mode !== "div") {
|
|
mod = res.mod.neg();
|
|
if (positive && mod.negative !== 0) {
|
|
mod.iadd(num);
|
|
}
|
|
}
|
|
return {
|
|
div,
|
|
mod
|
|
};
|
|
}
|
|
if (this.negative === 0 && num.negative !== 0) {
|
|
res = this.divmod(num.neg(), mode);
|
|
if (mode !== "mod") {
|
|
div = res.div.neg();
|
|
}
|
|
return {
|
|
div,
|
|
mod: res.mod
|
|
};
|
|
}
|
|
if ((this.negative & num.negative) !== 0) {
|
|
res = this.neg().divmod(num.neg(), mode);
|
|
if (mode !== "div") {
|
|
mod = res.mod.neg();
|
|
if (positive && mod.negative !== 0) {
|
|
mod.isub(num);
|
|
}
|
|
}
|
|
return {
|
|
div: res.div,
|
|
mod
|
|
};
|
|
}
|
|
if (num.length > this.length || this.cmp(num) < 0) {
|
|
return {
|
|
div: new BN(0),
|
|
mod: this
|
|
};
|
|
}
|
|
if (num.length === 1) {
|
|
if (mode === "div") {
|
|
return {
|
|
div: this.divn(num.words[0]),
|
|
mod: null
|
|
};
|
|
}
|
|
if (mode === "mod") {
|
|
return {
|
|
div: null,
|
|
mod: new BN(this.modn(num.words[0]))
|
|
};
|
|
}
|
|
return {
|
|
div: this.divn(num.words[0]),
|
|
mod: new BN(this.modn(num.words[0]))
|
|
};
|
|
}
|
|
return this._wordDiv(num, mode);
|
|
};
|
|
BN.prototype.div = function div(num) {
|
|
return this.divmod(num, "div", false).div;
|
|
};
|
|
BN.prototype.mod = function mod(num) {
|
|
return this.divmod(num, "mod", false).mod;
|
|
};
|
|
BN.prototype.umod = function umod(num) {
|
|
return this.divmod(num, "mod", true).mod;
|
|
};
|
|
BN.prototype.divRound = function divRound(num) {
|
|
var dm = this.divmod(num);
|
|
if (dm.mod.isZero())
|
|
return dm.div;
|
|
var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
|
|
var half = num.ushrn(1);
|
|
var r2 = num.andln(1);
|
|
var cmp = mod.cmp(half);
|
|
if (cmp < 0 || r2 === 1 && cmp === 0)
|
|
return dm.div;
|
|
return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
|
|
};
|
|
BN.prototype.modn = function modn(num) {
|
|
assert(num <= 67108863);
|
|
var p = (1 << 26) % num;
|
|
var acc = 0;
|
|
for (var i = this.length - 1;i >= 0; i--) {
|
|
acc = (p * acc + (this.words[i] | 0)) % num;
|
|
}
|
|
return acc;
|
|
};
|
|
BN.prototype.idivn = function idivn(num) {
|
|
assert(num <= 67108863);
|
|
var carry = 0;
|
|
for (var i = this.length - 1;i >= 0; i--) {
|
|
var w = (this.words[i] | 0) + carry * 67108864;
|
|
this.words[i] = w / num | 0;
|
|
carry = w % num;
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.divn = function divn(num) {
|
|
return this.clone().idivn(num);
|
|
};
|
|
BN.prototype.egcd = function egcd(p) {
|
|
assert(p.negative === 0);
|
|
assert(!p.isZero());
|
|
var x = this;
|
|
var y = p.clone();
|
|
if (x.negative !== 0) {
|
|
x = x.umod(p);
|
|
} else {
|
|
x = x.clone();
|
|
}
|
|
var A = new BN(1);
|
|
var B = new BN(0);
|
|
var C = new BN(0);
|
|
var D = new BN(1);
|
|
var g = 0;
|
|
while (x.isEven() && y.isEven()) {
|
|
x.iushrn(1);
|
|
y.iushrn(1);
|
|
++g;
|
|
}
|
|
var yp = y.clone();
|
|
var xp = x.clone();
|
|
while (!x.isZero()) {
|
|
for (var i = 0, im = 1;(x.words[0] & im) === 0 && i < 26; ++i, im <<= 1)
|
|
;
|
|
if (i > 0) {
|
|
x.iushrn(i);
|
|
while (i-- > 0) {
|
|
if (A.isOdd() || B.isOdd()) {
|
|
A.iadd(yp);
|
|
B.isub(xp);
|
|
}
|
|
A.iushrn(1);
|
|
B.iushrn(1);
|
|
}
|
|
}
|
|
for (var j = 0, jm = 1;(y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1)
|
|
;
|
|
if (j > 0) {
|
|
y.iushrn(j);
|
|
while (j-- > 0) {
|
|
if (C.isOdd() || D.isOdd()) {
|
|
C.iadd(yp);
|
|
D.isub(xp);
|
|
}
|
|
C.iushrn(1);
|
|
D.iushrn(1);
|
|
}
|
|
}
|
|
if (x.cmp(y) >= 0) {
|
|
x.isub(y);
|
|
A.isub(C);
|
|
B.isub(D);
|
|
} else {
|
|
y.isub(x);
|
|
C.isub(A);
|
|
D.isub(B);
|
|
}
|
|
}
|
|
return {
|
|
a: C,
|
|
b: D,
|
|
gcd: y.iushln(g)
|
|
};
|
|
};
|
|
BN.prototype._invmp = function _invmp(p) {
|
|
assert(p.negative === 0);
|
|
assert(!p.isZero());
|
|
var a = this;
|
|
var b = p.clone();
|
|
if (a.negative !== 0) {
|
|
a = a.umod(p);
|
|
} else {
|
|
a = a.clone();
|
|
}
|
|
var x1 = new BN(1);
|
|
var x2 = new BN(0);
|
|
var delta = b.clone();
|
|
while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
|
|
for (var i = 0, im = 1;(a.words[0] & im) === 0 && i < 26; ++i, im <<= 1)
|
|
;
|
|
if (i > 0) {
|
|
a.iushrn(i);
|
|
while (i-- > 0) {
|
|
if (x1.isOdd()) {
|
|
x1.iadd(delta);
|
|
}
|
|
x1.iushrn(1);
|
|
}
|
|
}
|
|
for (var j = 0, jm = 1;(b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1)
|
|
;
|
|
if (j > 0) {
|
|
b.iushrn(j);
|
|
while (j-- > 0) {
|
|
if (x2.isOdd()) {
|
|
x2.iadd(delta);
|
|
}
|
|
x2.iushrn(1);
|
|
}
|
|
}
|
|
if (a.cmp(b) >= 0) {
|
|
a.isub(b);
|
|
x1.isub(x2);
|
|
} else {
|
|
b.isub(a);
|
|
x2.isub(x1);
|
|
}
|
|
}
|
|
var res;
|
|
if (a.cmpn(1) === 0) {
|
|
res = x1;
|
|
} else {
|
|
res = x2;
|
|
}
|
|
if (res.cmpn(0) < 0) {
|
|
res.iadd(p);
|
|
}
|
|
return res;
|
|
};
|
|
BN.prototype.gcd = function gcd(num) {
|
|
if (this.isZero())
|
|
return num.abs();
|
|
if (num.isZero())
|
|
return this.abs();
|
|
var a = this.clone();
|
|
var b = num.clone();
|
|
a.negative = 0;
|
|
b.negative = 0;
|
|
for (var shift = 0;a.isEven() && b.isEven(); shift++) {
|
|
a.iushrn(1);
|
|
b.iushrn(1);
|
|
}
|
|
do {
|
|
while (a.isEven()) {
|
|
a.iushrn(1);
|
|
}
|
|
while (b.isEven()) {
|
|
b.iushrn(1);
|
|
}
|
|
var r = a.cmp(b);
|
|
if (r < 0) {
|
|
var t = a;
|
|
a = b;
|
|
b = t;
|
|
} else if (r === 0 || b.cmpn(1) === 0) {
|
|
break;
|
|
}
|
|
a.isub(b);
|
|
} while (true);
|
|
return b.iushln(shift);
|
|
};
|
|
BN.prototype.invm = function invm(num) {
|
|
return this.egcd(num).a.umod(num);
|
|
};
|
|
BN.prototype.isEven = function isEven() {
|
|
return (this.words[0] & 1) === 0;
|
|
};
|
|
BN.prototype.isOdd = function isOdd() {
|
|
return (this.words[0] & 1) === 1;
|
|
};
|
|
BN.prototype.andln = function andln(num) {
|
|
return this.words[0] & num;
|
|
};
|
|
BN.prototype.bincn = function bincn(bit) {
|
|
assert(typeof bit === "number");
|
|
var r = bit % 26;
|
|
var s = (bit - r) / 26;
|
|
var q = 1 << r;
|
|
if (this.length <= s) {
|
|
this._expand(s + 1);
|
|
this.words[s] |= q;
|
|
return this;
|
|
}
|
|
var carry = q;
|
|
for (var i = s;carry !== 0 && i < this.length; i++) {
|
|
var w = this.words[i] | 0;
|
|
w += carry;
|
|
carry = w >>> 26;
|
|
w &= 67108863;
|
|
this.words[i] = w;
|
|
}
|
|
if (carry !== 0) {
|
|
this.words[i] = carry;
|
|
this.length++;
|
|
}
|
|
return this;
|
|
};
|
|
BN.prototype.isZero = function isZero() {
|
|
return this.length === 1 && this.words[0] === 0;
|
|
};
|
|
BN.prototype.cmpn = function cmpn(num) {
|
|
var negative = num < 0;
|
|
if (this.negative !== 0 && !negative)
|
|
return -1;
|
|
if (this.negative === 0 && negative)
|
|
return 1;
|
|
this.strip();
|
|
var res;
|
|
if (this.length > 1) {
|
|
res = 1;
|
|
} else {
|
|
if (negative) {
|
|
num = -num;
|
|
}
|
|
assert(num <= 67108863, "Number is too big");
|
|
var w = this.words[0] | 0;
|
|
res = w === num ? 0 : w < num ? -1 : 1;
|
|
}
|
|
if (this.negative !== 0)
|
|
return -res | 0;
|
|
return res;
|
|
};
|
|
BN.prototype.cmp = function cmp(num) {
|
|
if (this.negative !== 0 && num.negative === 0)
|
|
return -1;
|
|
if (this.negative === 0 && num.negative !== 0)
|
|
return 1;
|
|
var res = this.ucmp(num);
|
|
if (this.negative !== 0)
|
|
return -res | 0;
|
|
return res;
|
|
};
|
|
BN.prototype.ucmp = function ucmp(num) {
|
|
if (this.length > num.length)
|
|
return 1;
|
|
if (this.length < num.length)
|
|
return -1;
|
|
var res = 0;
|
|
for (var i = this.length - 1;i >= 0; i--) {
|
|
var a = this.words[i] | 0;
|
|
var b = num.words[i] | 0;
|
|
if (a === b)
|
|
continue;
|
|
if (a < b) {
|
|
res = -1;
|
|
} else if (a > b) {
|
|
res = 1;
|
|
}
|
|
break;
|
|
}
|
|
return res;
|
|
};
|
|
BN.prototype.gtn = function gtn(num) {
|
|
return this.cmpn(num) === 1;
|
|
};
|
|
BN.prototype.gt = function gt(num) {
|
|
return this.cmp(num) === 1;
|
|
};
|
|
BN.prototype.gten = function gten(num) {
|
|
return this.cmpn(num) >= 0;
|
|
};
|
|
BN.prototype.gte = function gte(num) {
|
|
return this.cmp(num) >= 0;
|
|
};
|
|
BN.prototype.ltn = function ltn(num) {
|
|
return this.cmpn(num) === -1;
|
|
};
|
|
BN.prototype.lt = function lt(num) {
|
|
return this.cmp(num) === -1;
|
|
};
|
|
BN.prototype.lten = function lten(num) {
|
|
return this.cmpn(num) <= 0;
|
|
};
|
|
BN.prototype.lte = function lte(num) {
|
|
return this.cmp(num) <= 0;
|
|
};
|
|
BN.prototype.eqn = function eqn(num) {
|
|
return this.cmpn(num) === 0;
|
|
};
|
|
BN.prototype.eq = function eq(num) {
|
|
return this.cmp(num) === 0;
|
|
};
|
|
BN.red = function red(num) {
|
|
return new Red(num);
|
|
};
|
|
BN.prototype.toRed = function toRed(ctx) {
|
|
assert(!this.red, "Already a number in reduction context");
|
|
assert(this.negative === 0, "red works only with positives");
|
|
return ctx.convertTo(this)._forceRed(ctx);
|
|
};
|
|
BN.prototype.fromRed = function fromRed() {
|
|
assert(this.red, "fromRed works only with numbers in reduction context");
|
|
return this.red.convertFrom(this);
|
|
};
|
|
BN.prototype._forceRed = function _forceRed(ctx) {
|
|
this.red = ctx;
|
|
return this;
|
|
};
|
|
BN.prototype.forceRed = function forceRed(ctx) {
|
|
assert(!this.red, "Already a number in reduction context");
|
|
return this._forceRed(ctx);
|
|
};
|
|
BN.prototype.redAdd = function redAdd(num) {
|
|
assert(this.red, "redAdd works only with red numbers");
|
|
return this.red.add(this, num);
|
|
};
|
|
BN.prototype.redIAdd = function redIAdd(num) {
|
|
assert(this.red, "redIAdd works only with red numbers");
|
|
return this.red.iadd(this, num);
|
|
};
|
|
BN.prototype.redSub = function redSub(num) {
|
|
assert(this.red, "redSub works only with red numbers");
|
|
return this.red.sub(this, num);
|
|
};
|
|
BN.prototype.redISub = function redISub(num) {
|
|
assert(this.red, "redISub works only with red numbers");
|
|
return this.red.isub(this, num);
|
|
};
|
|
BN.prototype.redShl = function redShl(num) {
|
|
assert(this.red, "redShl works only with red numbers");
|
|
return this.red.shl(this, num);
|
|
};
|
|
BN.prototype.redMul = function redMul(num) {
|
|
assert(this.red, "redMul works only with red numbers");
|
|
this.red._verify2(this, num);
|
|
return this.red.mul(this, num);
|
|
};
|
|
BN.prototype.redIMul = function redIMul(num) {
|
|
assert(this.red, "redMul works only with red numbers");
|
|
this.red._verify2(this, num);
|
|
return this.red.imul(this, num);
|
|
};
|
|
BN.prototype.redSqr = function redSqr() {
|
|
assert(this.red, "redSqr works only with red numbers");
|
|
this.red._verify1(this);
|
|
return this.red.sqr(this);
|
|
};
|
|
BN.prototype.redISqr = function redISqr() {
|
|
assert(this.red, "redISqr works only with red numbers");
|
|
this.red._verify1(this);
|
|
return this.red.isqr(this);
|
|
};
|
|
BN.prototype.redSqrt = function redSqrt() {
|
|
assert(this.red, "redSqrt works only with red numbers");
|
|
this.red._verify1(this);
|
|
return this.red.sqrt(this);
|
|
};
|
|
BN.prototype.redInvm = function redInvm() {
|
|
assert(this.red, "redInvm works only with red numbers");
|
|
this.red._verify1(this);
|
|
return this.red.invm(this);
|
|
};
|
|
BN.prototype.redNeg = function redNeg() {
|
|
assert(this.red, "redNeg works only with red numbers");
|
|
this.red._verify1(this);
|
|
return this.red.neg(this);
|
|
};
|
|
BN.prototype.redPow = function redPow(num) {
|
|
assert(this.red && !num.red, "redPow(normalNum)");
|
|
this.red._verify1(this);
|
|
return this.red.pow(this, num);
|
|
};
|
|
var primes = {
|
|
k256: null,
|
|
p224: null,
|
|
p192: null,
|
|
p25519: null
|
|
};
|
|
function MPrime(name, p) {
|
|
this.name = name;
|
|
this.p = new BN(p, 16);
|
|
this.n = this.p.bitLength();
|
|
this.k = new BN(1).iushln(this.n).isub(this.p);
|
|
this.tmp = this._tmp();
|
|
}
|
|
MPrime.prototype._tmp = function _tmp() {
|
|
var tmp = new BN(null);
|
|
tmp.words = new Array(Math.ceil(this.n / 13));
|
|
return tmp;
|
|
};
|
|
MPrime.prototype.ireduce = function ireduce(num) {
|
|
var r = num;
|
|
var rlen;
|
|
do {
|
|
this.split(r, this.tmp);
|
|
r = this.imulK(r);
|
|
r = r.iadd(this.tmp);
|
|
rlen = r.bitLength();
|
|
} while (rlen > this.n);
|
|
var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
|
|
if (cmp === 0) {
|
|
r.words[0] = 0;
|
|
r.length = 1;
|
|
} else if (cmp > 0) {
|
|
r.isub(this.p);
|
|
} else {
|
|
if (r.strip !== undefined) {
|
|
r.strip();
|
|
} else {
|
|
r._strip();
|
|
}
|
|
}
|
|
return r;
|
|
};
|
|
MPrime.prototype.split = function split(input, out) {
|
|
input.iushrn(this.n, 0, out);
|
|
};
|
|
MPrime.prototype.imulK = function imulK(num) {
|
|
return num.imul(this.k);
|
|
};
|
|
function K256() {
|
|
MPrime.call(this, "k256", "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f");
|
|
}
|
|
inherits(K256, MPrime);
|
|
K256.prototype.split = function split(input, output) {
|
|
var mask = 4194303;
|
|
var outLen = Math.min(input.length, 9);
|
|
for (var i = 0;i < outLen; i++) {
|
|
output.words[i] = input.words[i];
|
|
}
|
|
output.length = outLen;
|
|
if (input.length <= 9) {
|
|
input.words[0] = 0;
|
|
input.length = 1;
|
|
return;
|
|
}
|
|
var prev = input.words[9];
|
|
output.words[output.length++] = prev & mask;
|
|
for (i = 10;i < input.length; i++) {
|
|
var next = input.words[i] | 0;
|
|
input.words[i - 10] = (next & mask) << 4 | prev >>> 22;
|
|
prev = next;
|
|
}
|
|
prev >>>= 22;
|
|
input.words[i - 10] = prev;
|
|
if (prev === 0 && input.length > 10) {
|
|
input.length -= 10;
|
|
} else {
|
|
input.length -= 9;
|
|
}
|
|
};
|
|
K256.prototype.imulK = function imulK(num) {
|
|
num.words[num.length] = 0;
|
|
num.words[num.length + 1] = 0;
|
|
num.length += 2;
|
|
var lo = 0;
|
|
for (var i = 0;i < num.length; i++) {
|
|
var w = num.words[i] | 0;
|
|
lo += w * 977;
|
|
num.words[i] = lo & 67108863;
|
|
lo = w * 64 + (lo / 67108864 | 0);
|
|
}
|
|
if (num.words[num.length - 1] === 0) {
|
|
num.length--;
|
|
if (num.words[num.length - 1] === 0) {
|
|
num.length--;
|
|
}
|
|
}
|
|
return num;
|
|
};
|
|
function P224() {
|
|
MPrime.call(this, "p224", "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001");
|
|
}
|
|
inherits(P224, MPrime);
|
|
function P192() {
|
|
MPrime.call(this, "p192", "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff");
|
|
}
|
|
inherits(P192, MPrime);
|
|
function P25519() {
|
|
MPrime.call(this, "25519", "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed");
|
|
}
|
|
inherits(P25519, MPrime);
|
|
P25519.prototype.imulK = function imulK(num) {
|
|
var carry = 0;
|
|
for (var i = 0;i < num.length; i++) {
|
|
var hi = (num.words[i] | 0) * 19 + carry;
|
|
var lo = hi & 67108863;
|
|
hi >>>= 26;
|
|
num.words[i] = lo;
|
|
carry = hi;
|
|
}
|
|
if (carry !== 0) {
|
|
num.words[num.length++] = carry;
|
|
}
|
|
return num;
|
|
};
|
|
BN._prime = function prime(name) {
|
|
if (primes[name])
|
|
return primes[name];
|
|
var prime;
|
|
if (name === "k256") {
|
|
prime = new K256;
|
|
} else if (name === "p224") {
|
|
prime = new P224;
|
|
} else if (name === "p192") {
|
|
prime = new P192;
|
|
} else if (name === "p25519") {
|
|
prime = new P25519;
|
|
} else {
|
|
throw new Error("Unknown prime " + name);
|
|
}
|
|
primes[name] = prime;
|
|
return prime;
|
|
};
|
|
function Red(m) {
|
|
if (typeof m === "string") {
|
|
var prime = BN._prime(m);
|
|
this.m = prime.p;
|
|
this.prime = prime;
|
|
} else {
|
|
assert(m.gtn(1), "modulus must be greater than 1");
|
|
this.m = m;
|
|
this.prime = null;
|
|
}
|
|
}
|
|
Red.prototype._verify1 = function _verify1(a) {
|
|
assert(a.negative === 0, "red works only with positives");
|
|
assert(a.red, "red works only with red numbers");
|
|
};
|
|
Red.prototype._verify2 = function _verify2(a, b) {
|
|
assert((a.negative | b.negative) === 0, "red works only with positives");
|
|
assert(a.red && a.red === b.red, "red works only with red numbers");
|
|
};
|
|
Red.prototype.imod = function imod(a) {
|
|
if (this.prime)
|
|
return this.prime.ireduce(a)._forceRed(this);
|
|
return a.umod(this.m)._forceRed(this);
|
|
};
|
|
Red.prototype.neg = function neg(a) {
|
|
if (a.isZero()) {
|
|
return a.clone();
|
|
}
|
|
return this.m.sub(a)._forceRed(this);
|
|
};
|
|
Red.prototype.add = function add(a, b) {
|
|
this._verify2(a, b);
|
|
var res = a.add(b);
|
|
if (res.cmp(this.m) >= 0) {
|
|
res.isub(this.m);
|
|
}
|
|
return res._forceRed(this);
|
|
};
|
|
Red.prototype.iadd = function iadd(a, b) {
|
|
this._verify2(a, b);
|
|
var res = a.iadd(b);
|
|
if (res.cmp(this.m) >= 0) {
|
|
res.isub(this.m);
|
|
}
|
|
return res;
|
|
};
|
|
Red.prototype.sub = function sub(a, b) {
|
|
this._verify2(a, b);
|
|
var res = a.sub(b);
|
|
if (res.cmpn(0) < 0) {
|
|
res.iadd(this.m);
|
|
}
|
|
return res._forceRed(this);
|
|
};
|
|
Red.prototype.isub = function isub(a, b) {
|
|
this._verify2(a, b);
|
|
var res = a.isub(b);
|
|
if (res.cmpn(0) < 0) {
|
|
res.iadd(this.m);
|
|
}
|
|
return res;
|
|
};
|
|
Red.prototype.shl = function shl(a, num) {
|
|
this._verify1(a);
|
|
return this.imod(a.ushln(num));
|
|
};
|
|
Red.prototype.imul = function imul(a, b) {
|
|
this._verify2(a, b);
|
|
return this.imod(a.imul(b));
|
|
};
|
|
Red.prototype.mul = function mul(a, b) {
|
|
this._verify2(a, b);
|
|
return this.imod(a.mul(b));
|
|
};
|
|
Red.prototype.isqr = function isqr(a) {
|
|
return this.imul(a, a.clone());
|
|
};
|
|
Red.prototype.sqr = function sqr(a) {
|
|
return this.mul(a, a);
|
|
};
|
|
Red.prototype.sqrt = function sqrt(a) {
|
|
if (a.isZero())
|
|
return a.clone();
|
|
var mod3 = this.m.andln(3);
|
|
assert(mod3 % 2 === 1);
|
|
if (mod3 === 3) {
|
|
var pow = this.m.add(new BN(1)).iushrn(2);
|
|
return this.pow(a, pow);
|
|
}
|
|
var q = this.m.subn(1);
|
|
var s = 0;
|
|
while (!q.isZero() && q.andln(1) === 0) {
|
|
s++;
|
|
q.iushrn(1);
|
|
}
|
|
assert(!q.isZero());
|
|
var one = new BN(1).toRed(this);
|
|
var nOne = one.redNeg();
|
|
var lpow = this.m.subn(1).iushrn(1);
|
|
var z = this.m.bitLength();
|
|
z = new BN(2 * z * z).toRed(this);
|
|
while (this.pow(z, lpow).cmp(nOne) !== 0) {
|
|
z.redIAdd(nOne);
|
|
}
|
|
var c = this.pow(z, q);
|
|
var r = this.pow(a, q.addn(1).iushrn(1));
|
|
var t = this.pow(a, q);
|
|
var m = s;
|
|
while (t.cmp(one) !== 0) {
|
|
var tmp = t;
|
|
for (var i = 0;tmp.cmp(one) !== 0; i++) {
|
|
tmp = tmp.redSqr();
|
|
}
|
|
assert(i < m);
|
|
var b = this.pow(c, new BN(1).iushln(m - i - 1));
|
|
r = r.redMul(b);
|
|
c = b.redSqr();
|
|
t = t.redMul(c);
|
|
m = i;
|
|
}
|
|
return r;
|
|
};
|
|
Red.prototype.invm = function invm(a) {
|
|
var inv = a._invmp(this.m);
|
|
if (inv.negative !== 0) {
|
|
inv.negative = 0;
|
|
return this.imod(inv).redNeg();
|
|
} else {
|
|
return this.imod(inv);
|
|
}
|
|
};
|
|
Red.prototype.pow = function pow(a, num) {
|
|
if (num.isZero())
|
|
return new BN(1).toRed(this);
|
|
if (num.cmpn(1) === 0)
|
|
return a.clone();
|
|
var windowSize = 4;
|
|
var wnd = new Array(1 << windowSize);
|
|
wnd[0] = new BN(1).toRed(this);
|
|
wnd[1] = a;
|
|
for (var i = 2;i < wnd.length; i++) {
|
|
wnd[i] = this.mul(wnd[i - 1], a);
|
|
}
|
|
var res = wnd[0];
|
|
var current = 0;
|
|
var currentLen = 0;
|
|
var start = num.bitLength() % 26;
|
|
if (start === 0) {
|
|
start = 26;
|
|
}
|
|
for (i = num.length - 1;i >= 0; i--) {
|
|
var word = num.words[i];
|
|
for (var j = start - 1;j >= 0; j--) {
|
|
var bit = word >> j & 1;
|
|
if (res !== wnd[0]) {
|
|
res = this.sqr(res);
|
|
}
|
|
if (bit === 0 && current === 0) {
|
|
currentLen = 0;
|
|
continue;
|
|
}
|
|
current <<= 1;
|
|
current |= bit;
|
|
currentLen++;
|
|
if (currentLen !== windowSize && (i !== 0 || j !== 0))
|
|
continue;
|
|
res = this.mul(res, wnd[current]);
|
|
currentLen = 0;
|
|
current = 0;
|
|
}
|
|
start = 26;
|
|
}
|
|
return res;
|
|
};
|
|
Red.prototype.convertTo = function convertTo(num) {
|
|
var r = num.umod(this.m);
|
|
return r === num ? r.clone() : r;
|
|
};
|
|
Red.prototype.convertFrom = function convertFrom(num) {
|
|
var res = num.clone();
|
|
res.red = null;
|
|
return res;
|
|
};
|
|
BN.mont = function mont(num) {
|
|
return new Mont(num);
|
|
};
|
|
function Mont(m) {
|
|
Red.call(this, m);
|
|
this.shift = this.m.bitLength();
|
|
if (this.shift % 26 !== 0) {
|
|
this.shift += 26 - this.shift % 26;
|
|
}
|
|
this.r = new BN(1).iushln(this.shift);
|
|
this.r2 = this.imod(this.r.sqr());
|
|
this.rinv = this.r._invmp(this.m);
|
|
this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
|
|
this.minv = this.minv.umod(this.r);
|
|
this.minv = this.r.sub(this.minv);
|
|
}
|
|
inherits(Mont, Red);
|
|
Mont.prototype.convertTo = function convertTo(num) {
|
|
return this.imod(num.ushln(this.shift));
|
|
};
|
|
Mont.prototype.convertFrom = function convertFrom(num) {
|
|
var r = this.imod(num.mul(this.rinv));
|
|
r.red = null;
|
|
return r;
|
|
};
|
|
Mont.prototype.imul = function imul(a, b) {
|
|
if (a.isZero() || b.isZero()) {
|
|
a.words[0] = 0;
|
|
a.length = 1;
|
|
return a;
|
|
}
|
|
var t = a.imul(b);
|
|
var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
|
|
var u = t.isub(c).iushrn(this.shift);
|
|
var res = u;
|
|
if (u.cmp(this.m) >= 0) {
|
|
res = u.isub(this.m);
|
|
} else if (u.cmpn(0) < 0) {
|
|
res = u.iadd(this.m);
|
|
}
|
|
return res._forceRed(this);
|
|
};
|
|
Mont.prototype.mul = function mul(a, b) {
|
|
if (a.isZero() || b.isZero())
|
|
return new BN(0)._forceRed(this);
|
|
var t = a.mul(b);
|
|
var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
|
|
var u = t.isub(c).iushrn(this.shift);
|
|
var res = u;
|
|
if (u.cmp(this.m) >= 0) {
|
|
res = u.isub(this.m);
|
|
} else if (u.cmpn(0) < 0) {
|
|
res = u.iadd(this.m);
|
|
}
|
|
return res._forceRed(this);
|
|
};
|
|
Mont.prototype.invm = function invm(a) {
|
|
var res = this.imod(a._invmp(this.m).mul(this.r2));
|
|
return res._forceRed(this);
|
|
};
|
|
})(typeof module === "undefined" || module, exports);
|
|
});
|
|
|
|
// ../eve/node_modules/inherits/inherits_browser.js
|
|
var require_inherits_browser = __commonJS((exports, module) => {
|
|
if (typeof Object.create === "function") {
|
|
module.exports = function inherits(ctor, superCtor) {
|
|
if (superCtor) {
|
|
ctor.super_ = superCtor;
|
|
ctor.prototype = Object.create(superCtor.prototype, {
|
|
constructor: {
|
|
value: ctor,
|
|
enumerable: false,
|
|
writable: true,
|
|
configurable: true
|
|
}
|
|
});
|
|
}
|
|
};
|
|
} else {
|
|
module.exports = function inherits(ctor, superCtor) {
|
|
if (superCtor) {
|
|
ctor.super_ = superCtor;
|
|
var TempCtor = function() {};
|
|
TempCtor.prototype = superCtor.prototype;
|
|
ctor.prototype = new TempCtor;
|
|
ctor.prototype.constructor = ctor;
|
|
}
|
|
};
|
|
}
|
|
});
|
|
|
|
// ../eve/node_modules/inherits/inherits.js
|
|
var require_inherits = __commonJS((exports, module) => {
|
|
try {
|
|
util = __require("util");
|
|
if (typeof util.inherits !== "function")
|
|
throw "";
|
|
module.exports = util.inherits;
|
|
} catch (e) {
|
|
module.exports = require_inherits_browser();
|
|
}
|
|
var util;
|
|
});
|
|
|
|
// ../eve/node_modules/safer-buffer/safer.js
|
|
var require_safer = __commonJS((exports, module) => {
|
|
var buffer = __require("buffer");
|
|
var Buffer2 = buffer.Buffer;
|
|
var safer = {};
|
|
var key;
|
|
for (key in buffer) {
|
|
if (!buffer.hasOwnProperty(key))
|
|
continue;
|
|
if (key === "SlowBuffer" || key === "Buffer")
|
|
continue;
|
|
safer[key] = buffer[key];
|
|
}
|
|
var Safer = safer.Buffer = {};
|
|
for (key in Buffer2) {
|
|
if (!Buffer2.hasOwnProperty(key))
|
|
continue;
|
|
if (key === "allocUnsafe" || key === "allocUnsafeSlow")
|
|
continue;
|
|
Safer[key] = Buffer2[key];
|
|
}
|
|
safer.Buffer.prototype = Buffer2.prototype;
|
|
if (!Safer.from || Safer.from === Uint8Array.from) {
|
|
Safer.from = function(value, encodingOrOffset, length) {
|
|
if (typeof value === "number") {
|
|
throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value);
|
|
}
|
|
if (value && typeof value.length === "undefined") {
|
|
throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value);
|
|
}
|
|
return Buffer2(value, encodingOrOffset, length);
|
|
};
|
|
}
|
|
if (!Safer.alloc) {
|
|
Safer.alloc = function(size, fill, encoding) {
|
|
if (typeof size !== "number") {
|
|
throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size);
|
|
}
|
|
if (size < 0 || size >= 2 * (1 << 30)) {
|
|
throw new RangeError('The value "' + size + '" is invalid for option "size"');
|
|
}
|
|
var buf = Buffer2(size);
|
|
if (!fill || fill.length === 0) {
|
|
buf.fill(0);
|
|
} else if (typeof encoding === "string") {
|
|
buf.fill(fill, encoding);
|
|
} else {
|
|
buf.fill(fill);
|
|
}
|
|
return buf;
|
|
};
|
|
}
|
|
if (!safer.kStringMaxLength) {
|
|
try {
|
|
safer.kStringMaxLength = process.binding("buffer").kStringMaxLength;
|
|
} catch (e) {}
|
|
}
|
|
if (!safer.constants) {
|
|
safer.constants = {
|
|
MAX_LENGTH: safer.kMaxLength
|
|
};
|
|
if (safer.kStringMaxLength) {
|
|
safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength;
|
|
}
|
|
}
|
|
module.exports = safer;
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/base/reporter.js
|
|
var require_reporter = __commonJS((exports) => {
|
|
var inherits = require_inherits();
|
|
function Reporter(options2) {
|
|
this._reporterState = {
|
|
obj: null,
|
|
path: [],
|
|
options: options2 || {},
|
|
errors: []
|
|
};
|
|
}
|
|
exports.Reporter = Reporter;
|
|
Reporter.prototype.isError = function isError(obj) {
|
|
return obj instanceof ReporterError;
|
|
};
|
|
Reporter.prototype.save = function save() {
|
|
const state = this._reporterState;
|
|
return { obj: state.obj, pathLen: state.path.length };
|
|
};
|
|
Reporter.prototype.restore = function restore(data) {
|
|
const state = this._reporterState;
|
|
state.obj = data.obj;
|
|
state.path = state.path.slice(0, data.pathLen);
|
|
};
|
|
Reporter.prototype.enterKey = function enterKey(key) {
|
|
return this._reporterState.path.push(key);
|
|
};
|
|
Reporter.prototype.exitKey = function exitKey(index2) {
|
|
const state = this._reporterState;
|
|
state.path = state.path.slice(0, index2 - 1);
|
|
};
|
|
Reporter.prototype.leaveKey = function leaveKey(index2, key, value) {
|
|
const state = this._reporterState;
|
|
this.exitKey(index2);
|
|
if (state.obj !== null)
|
|
state.obj[key] = value;
|
|
};
|
|
Reporter.prototype.path = function path() {
|
|
return this._reporterState.path.join("/");
|
|
};
|
|
Reporter.prototype.enterObject = function enterObject() {
|
|
const state = this._reporterState;
|
|
const prev = state.obj;
|
|
state.obj = {};
|
|
return prev;
|
|
};
|
|
Reporter.prototype.leaveObject = function leaveObject(prev) {
|
|
const state = this._reporterState;
|
|
const now = state.obj;
|
|
state.obj = prev;
|
|
return now;
|
|
};
|
|
Reporter.prototype.error = function error(msg) {
|
|
let err;
|
|
const state = this._reporterState;
|
|
const inherited = msg instanceof ReporterError;
|
|
if (inherited) {
|
|
err = msg;
|
|
} else {
|
|
err = new ReporterError(state.path.map(function(elem) {
|
|
return "[" + JSON.stringify(elem) + "]";
|
|
}).join(""), msg.message || msg, msg.stack);
|
|
}
|
|
if (!state.options.partial)
|
|
throw err;
|
|
if (!inherited)
|
|
state.errors.push(err);
|
|
return err;
|
|
};
|
|
Reporter.prototype.wrapResult = function wrapResult(result) {
|
|
const state = this._reporterState;
|
|
if (!state.options.partial)
|
|
return result;
|
|
return {
|
|
result: this.isError(result) ? null : result,
|
|
errors: state.errors
|
|
};
|
|
};
|
|
function ReporterError(path, msg) {
|
|
this.path = path;
|
|
this.rethrow(msg);
|
|
}
|
|
inherits(ReporterError, Error);
|
|
ReporterError.prototype.rethrow = function rethrow(msg) {
|
|
this.message = msg + " at: " + (this.path || "(shallow)");
|
|
if (Error.captureStackTrace)
|
|
Error.captureStackTrace(this, ReporterError);
|
|
if (!this.stack) {
|
|
try {
|
|
throw new Error(this.message);
|
|
} catch (e) {
|
|
this.stack = e.stack;
|
|
}
|
|
}
|
|
return this;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/base/buffer.js
|
|
var require_buffer = __commonJS((exports) => {
|
|
var inherits = require_inherits();
|
|
var Reporter = require_reporter().Reporter;
|
|
var Buffer2 = require_safer().Buffer;
|
|
function DecoderBuffer(base, options2) {
|
|
Reporter.call(this, options2);
|
|
if (!Buffer2.isBuffer(base)) {
|
|
this.error("Input not Buffer");
|
|
return;
|
|
}
|
|
this.base = base;
|
|
this.offset = 0;
|
|
this.length = base.length;
|
|
}
|
|
inherits(DecoderBuffer, Reporter);
|
|
exports.DecoderBuffer = DecoderBuffer;
|
|
DecoderBuffer.isDecoderBuffer = function isDecoderBuffer(data) {
|
|
if (data instanceof DecoderBuffer) {
|
|
return true;
|
|
}
|
|
const isCompatible = typeof data === "object" && Buffer2.isBuffer(data.base) && data.constructor.name === "DecoderBuffer" && typeof data.offset === "number" && typeof data.length === "number" && typeof data.save === "function" && typeof data.restore === "function" && typeof data.isEmpty === "function" && typeof data.readUInt8 === "function" && typeof data.skip === "function" && typeof data.raw === "function";
|
|
return isCompatible;
|
|
};
|
|
DecoderBuffer.prototype.save = function save() {
|
|
return { offset: this.offset, reporter: Reporter.prototype.save.call(this) };
|
|
};
|
|
DecoderBuffer.prototype.restore = function restore(save) {
|
|
const res = new DecoderBuffer(this.base);
|
|
res.offset = save.offset;
|
|
res.length = this.offset;
|
|
this.offset = save.offset;
|
|
Reporter.prototype.restore.call(this, save.reporter);
|
|
return res;
|
|
};
|
|
DecoderBuffer.prototype.isEmpty = function isEmpty() {
|
|
return this.offset === this.length;
|
|
};
|
|
DecoderBuffer.prototype.readUInt8 = function readUInt8(fail) {
|
|
if (this.offset + 1 <= this.length)
|
|
return this.base.readUInt8(this.offset++, true);
|
|
else
|
|
return this.error(fail || "DecoderBuffer overrun");
|
|
};
|
|
DecoderBuffer.prototype.skip = function skip(bytes, fail) {
|
|
if (!(this.offset + bytes <= this.length))
|
|
return this.error(fail || "DecoderBuffer overrun");
|
|
const res = new DecoderBuffer(this.base);
|
|
res._reporterState = this._reporterState;
|
|
res.offset = this.offset;
|
|
res.length = this.offset + bytes;
|
|
this.offset += bytes;
|
|
return res;
|
|
};
|
|
DecoderBuffer.prototype.raw = function raw(save) {
|
|
return this.base.slice(save ? save.offset : this.offset, this.length);
|
|
};
|
|
function EncoderBuffer(value, reporter) {
|
|
if (Array.isArray(value)) {
|
|
this.length = 0;
|
|
this.value = value.map(function(item) {
|
|
if (!EncoderBuffer.isEncoderBuffer(item))
|
|
item = new EncoderBuffer(item, reporter);
|
|
this.length += item.length;
|
|
return item;
|
|
}, this);
|
|
} else if (typeof value === "number") {
|
|
if (!(0 <= value && value <= 255))
|
|
return reporter.error("non-byte EncoderBuffer value");
|
|
this.value = value;
|
|
this.length = 1;
|
|
} else if (typeof value === "string") {
|
|
this.value = value;
|
|
this.length = Buffer2.byteLength(value);
|
|
} else if (Buffer2.isBuffer(value)) {
|
|
this.value = value;
|
|
this.length = value.length;
|
|
} else {
|
|
return reporter.error("Unsupported type: " + typeof value);
|
|
}
|
|
}
|
|
exports.EncoderBuffer = EncoderBuffer;
|
|
EncoderBuffer.isEncoderBuffer = function isEncoderBuffer(data) {
|
|
if (data instanceof EncoderBuffer) {
|
|
return true;
|
|
}
|
|
const isCompatible = typeof data === "object" && data.constructor.name === "EncoderBuffer" && typeof data.length === "number" && typeof data.join === "function";
|
|
return isCompatible;
|
|
};
|
|
EncoderBuffer.prototype.join = function join(out, offset) {
|
|
if (!out)
|
|
out = Buffer2.alloc(this.length);
|
|
if (!offset)
|
|
offset = 0;
|
|
if (this.length === 0)
|
|
return out;
|
|
if (Array.isArray(this.value)) {
|
|
this.value.forEach(function(item) {
|
|
item.join(out, offset);
|
|
offset += item.length;
|
|
});
|
|
} else {
|
|
if (typeof this.value === "number")
|
|
out[offset] = this.value;
|
|
else if (typeof this.value === "string")
|
|
out.write(this.value, offset);
|
|
else if (Buffer2.isBuffer(this.value))
|
|
this.value.copy(out, offset);
|
|
offset += this.length;
|
|
}
|
|
return out;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/minimalistic-assert/index.js
|
|
var require_minimalistic_assert = __commonJS((exports, module) => {
|
|
module.exports = assert;
|
|
function assert(val, msg) {
|
|
if (!val)
|
|
throw new Error(msg || "Assertion failed");
|
|
}
|
|
assert.equal = function assertEqual(l, r, msg) {
|
|
if (l != r)
|
|
throw new Error(msg || "Assertion failed: " + l + " != " + r);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/base/node.js
|
|
var require_node = __commonJS((exports, module) => {
|
|
var Reporter = require_reporter().Reporter;
|
|
var EncoderBuffer = require_buffer().EncoderBuffer;
|
|
var DecoderBuffer = require_buffer().DecoderBuffer;
|
|
var assert = require_minimalistic_assert();
|
|
var tags = [
|
|
"seq",
|
|
"seqof",
|
|
"set",
|
|
"setof",
|
|
"objid",
|
|
"bool",
|
|
"gentime",
|
|
"utctime",
|
|
"null_",
|
|
"enum",
|
|
"int",
|
|
"objDesc",
|
|
"bitstr",
|
|
"bmpstr",
|
|
"charstr",
|
|
"genstr",
|
|
"graphstr",
|
|
"ia5str",
|
|
"iso646str",
|
|
"numstr",
|
|
"octstr",
|
|
"printstr",
|
|
"t61str",
|
|
"unistr",
|
|
"utf8str",
|
|
"videostr"
|
|
];
|
|
var methods = [
|
|
"key",
|
|
"obj",
|
|
"use",
|
|
"optional",
|
|
"explicit",
|
|
"implicit",
|
|
"def",
|
|
"choice",
|
|
"any",
|
|
"contains"
|
|
].concat(tags);
|
|
var overrided = [
|
|
"_peekTag",
|
|
"_decodeTag",
|
|
"_use",
|
|
"_decodeStr",
|
|
"_decodeObjid",
|
|
"_decodeTime",
|
|
"_decodeNull",
|
|
"_decodeInt",
|
|
"_decodeBool",
|
|
"_decodeList",
|
|
"_encodeComposite",
|
|
"_encodeStr",
|
|
"_encodeObjid",
|
|
"_encodeTime",
|
|
"_encodeNull",
|
|
"_encodeInt",
|
|
"_encodeBool"
|
|
];
|
|
function Node(enc, parent, name) {
|
|
const state = {};
|
|
this._baseState = state;
|
|
state.name = name;
|
|
state.enc = enc;
|
|
state.parent = parent || null;
|
|
state.children = null;
|
|
state.tag = null;
|
|
state.args = null;
|
|
state.reverseArgs = null;
|
|
state.choice = null;
|
|
state.optional = false;
|
|
state.any = false;
|
|
state.obj = false;
|
|
state.use = null;
|
|
state.useDecoder = null;
|
|
state.key = null;
|
|
state["default"] = null;
|
|
state.explicit = null;
|
|
state.implicit = null;
|
|
state.contains = null;
|
|
if (!state.parent) {
|
|
state.children = [];
|
|
this._wrap();
|
|
}
|
|
}
|
|
module.exports = Node;
|
|
var stateProps = [
|
|
"enc",
|
|
"parent",
|
|
"children",
|
|
"tag",
|
|
"args",
|
|
"reverseArgs",
|
|
"choice",
|
|
"optional",
|
|
"any",
|
|
"obj",
|
|
"use",
|
|
"alteredUse",
|
|
"key",
|
|
"default",
|
|
"explicit",
|
|
"implicit",
|
|
"contains"
|
|
];
|
|
Node.prototype.clone = function clone() {
|
|
const state = this._baseState;
|
|
const cstate = {};
|
|
stateProps.forEach(function(prop) {
|
|
cstate[prop] = state[prop];
|
|
});
|
|
const res = new this.constructor(cstate.parent);
|
|
res._baseState = cstate;
|
|
return res;
|
|
};
|
|
Node.prototype._wrap = function wrap() {
|
|
const state = this._baseState;
|
|
methods.forEach(function(method) {
|
|
this[method] = function _wrappedMethod() {
|
|
const clone = new this.constructor(this);
|
|
state.children.push(clone);
|
|
return clone[method].apply(clone, arguments);
|
|
};
|
|
}, this);
|
|
};
|
|
Node.prototype._init = function init(body) {
|
|
const state = this._baseState;
|
|
assert(state.parent === null);
|
|
body.call(this);
|
|
state.children = state.children.filter(function(child) {
|
|
return child._baseState.parent === this;
|
|
}, this);
|
|
assert.equal(state.children.length, 1, "Root node can have only one child");
|
|
};
|
|
Node.prototype._useArgs = function useArgs(args) {
|
|
const state = this._baseState;
|
|
const children = args.filter(function(arg) {
|
|
return arg instanceof this.constructor;
|
|
}, this);
|
|
args = args.filter(function(arg) {
|
|
return !(arg instanceof this.constructor);
|
|
}, this);
|
|
if (children.length !== 0) {
|
|
assert(state.children === null);
|
|
state.children = children;
|
|
children.forEach(function(child) {
|
|
child._baseState.parent = this;
|
|
}, this);
|
|
}
|
|
if (args.length !== 0) {
|
|
assert(state.args === null);
|
|
state.args = args;
|
|
state.reverseArgs = args.map(function(arg) {
|
|
if (typeof arg !== "object" || arg.constructor !== Object)
|
|
return arg;
|
|
const res = {};
|
|
Object.keys(arg).forEach(function(key) {
|
|
if (key == (key | 0))
|
|
key |= 0;
|
|
const value = arg[key];
|
|
res[value] = key;
|
|
});
|
|
return res;
|
|
});
|
|
}
|
|
};
|
|
overrided.forEach(function(method) {
|
|
Node.prototype[method] = function _overrided() {
|
|
const state = this._baseState;
|
|
throw new Error(method + " not implemented for encoding: " + state.enc);
|
|
};
|
|
});
|
|
tags.forEach(function(tag) {
|
|
Node.prototype[tag] = function _tagMethod() {
|
|
const state = this._baseState;
|
|
const args = Array.prototype.slice.call(arguments);
|
|
assert(state.tag === null);
|
|
state.tag = tag;
|
|
this._useArgs(args);
|
|
return this;
|
|
};
|
|
});
|
|
Node.prototype.use = function use(item) {
|
|
assert(item);
|
|
const state = this._baseState;
|
|
assert(state.use === null);
|
|
state.use = item;
|
|
return this;
|
|
};
|
|
Node.prototype.optional = function optional() {
|
|
const state = this._baseState;
|
|
state.optional = true;
|
|
return this;
|
|
};
|
|
Node.prototype.def = function def(val) {
|
|
const state = this._baseState;
|
|
assert(state["default"] === null);
|
|
state["default"] = val;
|
|
state.optional = true;
|
|
return this;
|
|
};
|
|
Node.prototype.explicit = function explicit(num) {
|
|
const state = this._baseState;
|
|
assert(state.explicit === null && state.implicit === null);
|
|
state.explicit = num;
|
|
return this;
|
|
};
|
|
Node.prototype.implicit = function implicit(num) {
|
|
const state = this._baseState;
|
|
assert(state.explicit === null && state.implicit === null);
|
|
state.implicit = num;
|
|
return this;
|
|
};
|
|
Node.prototype.obj = function obj() {
|
|
const state = this._baseState;
|
|
const args = Array.prototype.slice.call(arguments);
|
|
state.obj = true;
|
|
if (args.length !== 0)
|
|
this._useArgs(args);
|
|
return this;
|
|
};
|
|
Node.prototype.key = function key(newKey) {
|
|
const state = this._baseState;
|
|
assert(state.key === null);
|
|
state.key = newKey;
|
|
return this;
|
|
};
|
|
Node.prototype.any = function any() {
|
|
const state = this._baseState;
|
|
state.any = true;
|
|
return this;
|
|
};
|
|
Node.prototype.choice = function choice(obj) {
|
|
const state = this._baseState;
|
|
assert(state.choice === null);
|
|
state.choice = obj;
|
|
this._useArgs(Object.keys(obj).map(function(key) {
|
|
return obj[key];
|
|
}));
|
|
return this;
|
|
};
|
|
Node.prototype.contains = function contains(item) {
|
|
const state = this._baseState;
|
|
assert(state.use === null);
|
|
state.contains = item;
|
|
return this;
|
|
};
|
|
Node.prototype._decode = function decode(input, options2) {
|
|
const state = this._baseState;
|
|
if (state.parent === null)
|
|
return input.wrapResult(state.children[0]._decode(input, options2));
|
|
let result = state["default"];
|
|
let present = true;
|
|
let prevKey = null;
|
|
if (state.key !== null)
|
|
prevKey = input.enterKey(state.key);
|
|
if (state.optional) {
|
|
let tag = null;
|
|
if (state.explicit !== null)
|
|
tag = state.explicit;
|
|
else if (state.implicit !== null)
|
|
tag = state.implicit;
|
|
else if (state.tag !== null)
|
|
tag = state.tag;
|
|
if (tag === null && !state.any) {
|
|
const save = input.save();
|
|
try {
|
|
if (state.choice === null)
|
|
this._decodeGeneric(state.tag, input, options2);
|
|
else
|
|
this._decodeChoice(input, options2);
|
|
present = true;
|
|
} catch (e) {
|
|
present = false;
|
|
}
|
|
input.restore(save);
|
|
} else {
|
|
present = this._peekTag(input, tag, state.any);
|
|
if (input.isError(present))
|
|
return present;
|
|
}
|
|
}
|
|
let prevObj;
|
|
if (state.obj && present)
|
|
prevObj = input.enterObject();
|
|
if (present) {
|
|
if (state.explicit !== null) {
|
|
const explicit = this._decodeTag(input, state.explicit);
|
|
if (input.isError(explicit))
|
|
return explicit;
|
|
input = explicit;
|
|
}
|
|
const start = input.offset;
|
|
if (state.use === null && state.choice === null) {
|
|
let save;
|
|
if (state.any)
|
|
save = input.save();
|
|
const body = this._decodeTag(input, state.implicit !== null ? state.implicit : state.tag, state.any);
|
|
if (input.isError(body))
|
|
return body;
|
|
if (state.any)
|
|
result = input.raw(save);
|
|
else
|
|
input = body;
|
|
}
|
|
if (options2 && options2.track && state.tag !== null)
|
|
options2.track(input.path(), start, input.length, "tagged");
|
|
if (options2 && options2.track && state.tag !== null)
|
|
options2.track(input.path(), input.offset, input.length, "content");
|
|
if (state.any) {} else if (state.choice === null) {
|
|
result = this._decodeGeneric(state.tag, input, options2);
|
|
} else {
|
|
result = this._decodeChoice(input, options2);
|
|
}
|
|
if (input.isError(result))
|
|
return result;
|
|
if (!state.any && state.choice === null && state.children !== null) {
|
|
state.children.forEach(function decodeChildren(child) {
|
|
child._decode(input, options2);
|
|
});
|
|
}
|
|
if (state.contains && (state.tag === "octstr" || state.tag === "bitstr")) {
|
|
const data = new DecoderBuffer(result);
|
|
result = this._getUse(state.contains, input._reporterState.obj)._decode(data, options2);
|
|
}
|
|
}
|
|
if (state.obj && present)
|
|
result = input.leaveObject(prevObj);
|
|
if (state.key !== null && (result !== null || present === true))
|
|
input.leaveKey(prevKey, state.key, result);
|
|
else if (prevKey !== null)
|
|
input.exitKey(prevKey);
|
|
return result;
|
|
};
|
|
Node.prototype._decodeGeneric = function decodeGeneric(tag, input, options2) {
|
|
const state = this._baseState;
|
|
if (tag === "seq" || tag === "set")
|
|
return null;
|
|
if (tag === "seqof" || tag === "setof")
|
|
return this._decodeList(input, tag, state.args[0], options2);
|
|
else if (/str$/.test(tag))
|
|
return this._decodeStr(input, tag, options2);
|
|
else if (tag === "objid" && state.args)
|
|
return this._decodeObjid(input, state.args[0], state.args[1], options2);
|
|
else if (tag === "objid")
|
|
return this._decodeObjid(input, null, null, options2);
|
|
else if (tag === "gentime" || tag === "utctime")
|
|
return this._decodeTime(input, tag, options2);
|
|
else if (tag === "null_")
|
|
return this._decodeNull(input, options2);
|
|
else if (tag === "bool")
|
|
return this._decodeBool(input, options2);
|
|
else if (tag === "objDesc")
|
|
return this._decodeStr(input, tag, options2);
|
|
else if (tag === "int" || tag === "enum")
|
|
return this._decodeInt(input, state.args && state.args[0], options2);
|
|
if (state.use !== null) {
|
|
return this._getUse(state.use, input._reporterState.obj)._decode(input, options2);
|
|
} else {
|
|
return input.error("unknown tag: " + tag);
|
|
}
|
|
};
|
|
Node.prototype._getUse = function _getUse(entity, obj) {
|
|
const state = this._baseState;
|
|
state.useDecoder = this._use(entity, obj);
|
|
assert(state.useDecoder._baseState.parent === null);
|
|
state.useDecoder = state.useDecoder._baseState.children[0];
|
|
if (state.implicit !== state.useDecoder._baseState.implicit) {
|
|
state.useDecoder = state.useDecoder.clone();
|
|
state.useDecoder._baseState.implicit = state.implicit;
|
|
}
|
|
return state.useDecoder;
|
|
};
|
|
Node.prototype._decodeChoice = function decodeChoice(input, options2) {
|
|
const state = this._baseState;
|
|
let result = null;
|
|
let match = false;
|
|
Object.keys(state.choice).some(function(key) {
|
|
const save = input.save();
|
|
const node = state.choice[key];
|
|
try {
|
|
const value = node._decode(input, options2);
|
|
if (input.isError(value))
|
|
return false;
|
|
result = { type: key, value };
|
|
match = true;
|
|
} catch (e) {
|
|
input.restore(save);
|
|
return false;
|
|
}
|
|
return true;
|
|
}, this);
|
|
if (!match)
|
|
return input.error("Choice not matched");
|
|
return result;
|
|
};
|
|
Node.prototype._createEncoderBuffer = function createEncoderBuffer(data) {
|
|
return new EncoderBuffer(data, this.reporter);
|
|
};
|
|
Node.prototype._encode = function encode(data, reporter, parent) {
|
|
const state = this._baseState;
|
|
if (state["default"] !== null && state["default"] === data)
|
|
return;
|
|
const result = this._encodeValue(data, reporter, parent);
|
|
if (result === undefined)
|
|
return;
|
|
if (this._skipDefault(result, reporter, parent))
|
|
return;
|
|
return result;
|
|
};
|
|
Node.prototype._encodeValue = function encode(data, reporter, parent) {
|
|
const state = this._baseState;
|
|
if (state.parent === null)
|
|
return state.children[0]._encode(data, reporter || new Reporter);
|
|
let result = null;
|
|
this.reporter = reporter;
|
|
if (state.optional && data === undefined) {
|
|
if (state["default"] !== null)
|
|
data = state["default"];
|
|
else
|
|
return;
|
|
}
|
|
let content = null;
|
|
let primitive = false;
|
|
if (state.any) {
|
|
result = this._createEncoderBuffer(data);
|
|
} else if (state.choice) {
|
|
result = this._encodeChoice(data, reporter);
|
|
} else if (state.contains) {
|
|
content = this._getUse(state.contains, parent)._encode(data, reporter);
|
|
primitive = true;
|
|
} else if (state.children) {
|
|
content = state.children.map(function(child) {
|
|
if (child._baseState.tag === "null_")
|
|
return child._encode(null, reporter, data);
|
|
if (child._baseState.key === null)
|
|
return reporter.error("Child should have a key");
|
|
const prevKey = reporter.enterKey(child._baseState.key);
|
|
if (typeof data !== "object")
|
|
return reporter.error("Child expected, but input is not object");
|
|
const res = child._encode(data[child._baseState.key], reporter, data);
|
|
reporter.leaveKey(prevKey);
|
|
return res;
|
|
}, this).filter(function(child) {
|
|
return child;
|
|
});
|
|
content = this._createEncoderBuffer(content);
|
|
} else {
|
|
if (state.tag === "seqof" || state.tag === "setof") {
|
|
if (!(state.args && state.args.length === 1))
|
|
return reporter.error("Too many args for : " + state.tag);
|
|
if (!Array.isArray(data))
|
|
return reporter.error("seqof/setof, but data is not Array");
|
|
const child = this.clone();
|
|
child._baseState.implicit = null;
|
|
content = this._createEncoderBuffer(data.map(function(item) {
|
|
const state2 = this._baseState;
|
|
return this._getUse(state2.args[0], data)._encode(item, reporter);
|
|
}, child));
|
|
} else if (state.use !== null) {
|
|
result = this._getUse(state.use, parent)._encode(data, reporter);
|
|
} else {
|
|
content = this._encodePrimitive(state.tag, data);
|
|
primitive = true;
|
|
}
|
|
}
|
|
if (!state.any && state.choice === null) {
|
|
const tag = state.implicit !== null ? state.implicit : state.tag;
|
|
const cls = state.implicit === null ? "universal" : "context";
|
|
if (tag === null) {
|
|
if (state.use === null)
|
|
reporter.error("Tag could be omitted only for .use()");
|
|
} else {
|
|
if (state.use === null)
|
|
result = this._encodeComposite(tag, primitive, cls, content);
|
|
}
|
|
}
|
|
if (state.explicit !== null)
|
|
result = this._encodeComposite(state.explicit, false, "context", result);
|
|
return result;
|
|
};
|
|
Node.prototype._encodeChoice = function encodeChoice(data, reporter) {
|
|
const state = this._baseState;
|
|
const node = state.choice[data.type];
|
|
if (!node) {
|
|
assert(false, data.type + " not found in " + JSON.stringify(Object.keys(state.choice)));
|
|
}
|
|
return node._encode(data.value, reporter);
|
|
};
|
|
Node.prototype._encodePrimitive = function encodePrimitive(tag, data) {
|
|
const state = this._baseState;
|
|
if (/str$/.test(tag))
|
|
return this._encodeStr(data, tag);
|
|
else if (tag === "objid" && state.args)
|
|
return this._encodeObjid(data, state.reverseArgs[0], state.args[1]);
|
|
else if (tag === "objid")
|
|
return this._encodeObjid(data, null, null);
|
|
else if (tag === "gentime" || tag === "utctime")
|
|
return this._encodeTime(data, tag);
|
|
else if (tag === "null_")
|
|
return this._encodeNull();
|
|
else if (tag === "int" || tag === "enum")
|
|
return this._encodeInt(data, state.args && state.reverseArgs[0]);
|
|
else if (tag === "bool")
|
|
return this._encodeBool(data);
|
|
else if (tag === "objDesc")
|
|
return this._encodeStr(data, tag);
|
|
else
|
|
throw new Error("Unsupported tag: " + tag);
|
|
};
|
|
Node.prototype._isNumstr = function isNumstr(str) {
|
|
return /^[0-9 ]*$/.test(str);
|
|
};
|
|
Node.prototype._isPrintstr = function isPrintstr(str) {
|
|
return /^[A-Za-z0-9 '()+,-./:=?]*$/.test(str);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/constants/der.js
|
|
var require_der = __commonJS((exports) => {
|
|
function reverse(map) {
|
|
const res = {};
|
|
Object.keys(map).forEach(function(key) {
|
|
if ((key | 0) == key)
|
|
key = key | 0;
|
|
const value = map[key];
|
|
res[value] = key;
|
|
});
|
|
return res;
|
|
}
|
|
exports.tagClass = {
|
|
0: "universal",
|
|
1: "application",
|
|
2: "context",
|
|
3: "private"
|
|
};
|
|
exports.tagClassByName = reverse(exports.tagClass);
|
|
exports.tag = {
|
|
0: "end",
|
|
1: "bool",
|
|
2: "int",
|
|
3: "bitstr",
|
|
4: "octstr",
|
|
5: "null_",
|
|
6: "objid",
|
|
7: "objDesc",
|
|
8: "external",
|
|
9: "real",
|
|
10: "enum",
|
|
11: "embed",
|
|
12: "utf8str",
|
|
13: "relativeOid",
|
|
16: "seq",
|
|
17: "set",
|
|
18: "numstr",
|
|
19: "printstr",
|
|
20: "t61str",
|
|
21: "videostr",
|
|
22: "ia5str",
|
|
23: "utctime",
|
|
24: "gentime",
|
|
25: "graphstr",
|
|
26: "iso646str",
|
|
27: "genstr",
|
|
28: "unistr",
|
|
29: "charstr",
|
|
30: "bmpstr"
|
|
};
|
|
exports.tagByName = reverse(exports.tag);
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/encoders/der.js
|
|
var require_der2 = __commonJS((exports, module) => {
|
|
var inherits = require_inherits();
|
|
var Buffer2 = require_safer().Buffer;
|
|
var Node = require_node();
|
|
var der = require_der();
|
|
function DEREncoder(entity) {
|
|
this.enc = "der";
|
|
this.name = entity.name;
|
|
this.entity = entity;
|
|
this.tree = new DERNode;
|
|
this.tree._init(entity.body);
|
|
}
|
|
module.exports = DEREncoder;
|
|
DEREncoder.prototype.encode = function encode(data, reporter) {
|
|
return this.tree._encode(data, reporter).join();
|
|
};
|
|
function DERNode(parent) {
|
|
Node.call(this, "der", parent);
|
|
}
|
|
inherits(DERNode, Node);
|
|
DERNode.prototype._encodeComposite = function encodeComposite(tag, primitive, cls, content) {
|
|
const encodedTag = encodeTag(tag, primitive, cls, this.reporter);
|
|
if (content.length < 128) {
|
|
const header2 = Buffer2.alloc(2);
|
|
header2[0] = encodedTag;
|
|
header2[1] = content.length;
|
|
return this._createEncoderBuffer([header2, content]);
|
|
}
|
|
let lenOctets = 1;
|
|
for (let i = content.length;i >= 256; i >>= 8)
|
|
lenOctets++;
|
|
const header = Buffer2.alloc(1 + 1 + lenOctets);
|
|
header[0] = encodedTag;
|
|
header[1] = 128 | lenOctets;
|
|
for (let i = 1 + lenOctets, j = content.length;j > 0; i--, j >>= 8)
|
|
header[i] = j & 255;
|
|
return this._createEncoderBuffer([header, content]);
|
|
};
|
|
DERNode.prototype._encodeStr = function encodeStr(str, tag) {
|
|
if (tag === "bitstr") {
|
|
return this._createEncoderBuffer([str.unused | 0, str.data]);
|
|
} else if (tag === "bmpstr") {
|
|
const buf = Buffer2.alloc(str.length * 2);
|
|
for (let i = 0;i < str.length; i++) {
|
|
buf.writeUInt16BE(str.charCodeAt(i), i * 2);
|
|
}
|
|
return this._createEncoderBuffer(buf);
|
|
} else if (tag === "numstr") {
|
|
if (!this._isNumstr(str)) {
|
|
return this.reporter.error("Encoding of string type: numstr supports " + "only digits and space");
|
|
}
|
|
return this._createEncoderBuffer(str);
|
|
} else if (tag === "printstr") {
|
|
if (!this._isPrintstr(str)) {
|
|
return this.reporter.error("Encoding of string type: printstr supports " + "only latin upper and lower case letters, " + "digits, space, apostrophe, left and rigth " + "parenthesis, plus sign, comma, hyphen, " + "dot, slash, colon, equal sign, " + "question mark");
|
|
}
|
|
return this._createEncoderBuffer(str);
|
|
} else if (/str$/.test(tag)) {
|
|
return this._createEncoderBuffer(str);
|
|
} else if (tag === "objDesc") {
|
|
return this._createEncoderBuffer(str);
|
|
} else {
|
|
return this.reporter.error("Encoding of string type: " + tag + " unsupported");
|
|
}
|
|
};
|
|
DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) {
|
|
if (typeof id === "string") {
|
|
if (!values)
|
|
return this.reporter.error("string objid given, but no values map found");
|
|
if (!values.hasOwnProperty(id))
|
|
return this.reporter.error("objid not found in values map");
|
|
id = values[id].split(/[\s.]+/g);
|
|
for (let i = 0;i < id.length; i++)
|
|
id[i] |= 0;
|
|
} else if (Array.isArray(id)) {
|
|
id = id.slice();
|
|
for (let i = 0;i < id.length; i++)
|
|
id[i] |= 0;
|
|
}
|
|
if (!Array.isArray(id)) {
|
|
return this.reporter.error("objid() should be either array or string, " + "got: " + JSON.stringify(id));
|
|
}
|
|
if (!relative) {
|
|
if (id[1] >= 40)
|
|
return this.reporter.error("Second objid identifier OOB");
|
|
id.splice(0, 2, id[0] * 40 + id[1]);
|
|
}
|
|
let size = 0;
|
|
for (let i = 0;i < id.length; i++) {
|
|
let ident = id[i];
|
|
for (size++;ident >= 128; ident >>= 7)
|
|
size++;
|
|
}
|
|
const objid = Buffer2.alloc(size);
|
|
let offset = objid.length - 1;
|
|
for (let i = id.length - 1;i >= 0; i--) {
|
|
let ident = id[i];
|
|
objid[offset--] = ident & 127;
|
|
while ((ident >>= 7) > 0)
|
|
objid[offset--] = 128 | ident & 127;
|
|
}
|
|
return this._createEncoderBuffer(objid);
|
|
};
|
|
function two(num) {
|
|
if (num < 10)
|
|
return "0" + num;
|
|
else
|
|
return num;
|
|
}
|
|
DERNode.prototype._encodeTime = function encodeTime(time, tag) {
|
|
let str;
|
|
const date = new Date(time);
|
|
if (tag === "gentime") {
|
|
str = [
|
|
two(date.getUTCFullYear()),
|
|
two(date.getUTCMonth() + 1),
|
|
two(date.getUTCDate()),
|
|
two(date.getUTCHours()),
|
|
two(date.getUTCMinutes()),
|
|
two(date.getUTCSeconds()),
|
|
"Z"
|
|
].join("");
|
|
} else if (tag === "utctime") {
|
|
str = [
|
|
two(date.getUTCFullYear() % 100),
|
|
two(date.getUTCMonth() + 1),
|
|
two(date.getUTCDate()),
|
|
two(date.getUTCHours()),
|
|
two(date.getUTCMinutes()),
|
|
two(date.getUTCSeconds()),
|
|
"Z"
|
|
].join("");
|
|
} else {
|
|
this.reporter.error("Encoding " + tag + " time is not supported yet");
|
|
}
|
|
return this._encodeStr(str, "octstr");
|
|
};
|
|
DERNode.prototype._encodeNull = function encodeNull() {
|
|
return this._createEncoderBuffer("");
|
|
};
|
|
DERNode.prototype._encodeInt = function encodeInt(num, values) {
|
|
if (typeof num === "string") {
|
|
if (!values)
|
|
return this.reporter.error("String int or enum given, but no values map");
|
|
if (!values.hasOwnProperty(num)) {
|
|
return this.reporter.error("Values map doesn't contain: " + JSON.stringify(num));
|
|
}
|
|
num = values[num];
|
|
}
|
|
if (typeof num !== "number" && !Buffer2.isBuffer(num)) {
|
|
const numArray = num.toArray();
|
|
if (!num.sign && numArray[0] & 128) {
|
|
numArray.unshift(0);
|
|
}
|
|
num = Buffer2.from(numArray);
|
|
}
|
|
if (Buffer2.isBuffer(num)) {
|
|
let size2 = num.length;
|
|
if (num.length === 0)
|
|
size2++;
|
|
const out2 = Buffer2.alloc(size2);
|
|
num.copy(out2);
|
|
if (num.length === 0)
|
|
out2[0] = 0;
|
|
return this._createEncoderBuffer(out2);
|
|
}
|
|
if (num < 128)
|
|
return this._createEncoderBuffer(num);
|
|
if (num < 256)
|
|
return this._createEncoderBuffer([0, num]);
|
|
let size = 1;
|
|
for (let i = num;i >= 256; i >>= 8)
|
|
size++;
|
|
const out = new Array(size);
|
|
for (let i = out.length - 1;i >= 0; i--) {
|
|
out[i] = num & 255;
|
|
num >>= 8;
|
|
}
|
|
if (out[0] & 128) {
|
|
out.unshift(0);
|
|
}
|
|
return this._createEncoderBuffer(Buffer2.from(out));
|
|
};
|
|
DERNode.prototype._encodeBool = function encodeBool(value) {
|
|
return this._createEncoderBuffer(value ? 255 : 0);
|
|
};
|
|
DERNode.prototype._use = function use(entity, obj) {
|
|
if (typeof entity === "function")
|
|
entity = entity(obj);
|
|
return entity._getEncoder("der").tree;
|
|
};
|
|
DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) {
|
|
const state = this._baseState;
|
|
let i;
|
|
if (state["default"] === null)
|
|
return false;
|
|
const data = dataBuffer.join();
|
|
if (state.defaultBuffer === undefined)
|
|
state.defaultBuffer = this._encodeValue(state["default"], reporter, parent).join();
|
|
if (data.length !== state.defaultBuffer.length)
|
|
return false;
|
|
for (i = 0;i < data.length; i++)
|
|
if (data[i] !== state.defaultBuffer[i])
|
|
return false;
|
|
return true;
|
|
};
|
|
function encodeTag(tag, primitive, cls, reporter) {
|
|
let res;
|
|
if (tag === "seqof")
|
|
tag = "seq";
|
|
else if (tag === "setof")
|
|
tag = "set";
|
|
if (der.tagByName.hasOwnProperty(tag))
|
|
res = der.tagByName[tag];
|
|
else if (typeof tag === "number" && (tag | 0) === tag)
|
|
res = tag;
|
|
else
|
|
return reporter.error("Unknown tag: " + tag);
|
|
if (res >= 31)
|
|
return reporter.error("Multi-octet tag encoding unsupported");
|
|
if (!primitive)
|
|
res |= 32;
|
|
res |= der.tagClassByName[cls || "universal"] << 6;
|
|
return res;
|
|
}
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/encoders/pem.js
|
|
var require_pem = __commonJS((exports, module) => {
|
|
var inherits = require_inherits();
|
|
var DEREncoder = require_der2();
|
|
function PEMEncoder(entity) {
|
|
DEREncoder.call(this, entity);
|
|
this.enc = "pem";
|
|
}
|
|
inherits(PEMEncoder, DEREncoder);
|
|
module.exports = PEMEncoder;
|
|
PEMEncoder.prototype.encode = function encode(data, options2) {
|
|
const buf = DEREncoder.prototype.encode.call(this, data);
|
|
const p = buf.toString("base64");
|
|
const out = ["-----BEGIN " + options2.label + "-----"];
|
|
for (let i = 0;i < p.length; i += 64)
|
|
out.push(p.slice(i, i + 64));
|
|
out.push("-----END " + options2.label + "-----");
|
|
return out.join(`
|
|
`);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/encoders/index.js
|
|
var require_encoders = __commonJS((exports) => {
|
|
var encoders = exports;
|
|
encoders.der = require_der2();
|
|
encoders.pem = require_pem();
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/decoders/der.js
|
|
var require_der3 = __commonJS((exports, module) => {
|
|
var inherits = require_inherits();
|
|
var bignum = require_bn();
|
|
var DecoderBuffer = require_buffer().DecoderBuffer;
|
|
var Node = require_node();
|
|
var der = require_der();
|
|
function DERDecoder(entity) {
|
|
this.enc = "der";
|
|
this.name = entity.name;
|
|
this.entity = entity;
|
|
this.tree = new DERNode;
|
|
this.tree._init(entity.body);
|
|
}
|
|
module.exports = DERDecoder;
|
|
DERDecoder.prototype.decode = function decode(data, options2) {
|
|
if (!DecoderBuffer.isDecoderBuffer(data)) {
|
|
data = new DecoderBuffer(data, options2);
|
|
}
|
|
return this.tree._decode(data, options2);
|
|
};
|
|
function DERNode(parent) {
|
|
Node.call(this, "der", parent);
|
|
}
|
|
inherits(DERNode, Node);
|
|
DERNode.prototype._peekTag = function peekTag(buffer, tag, any) {
|
|
if (buffer.isEmpty())
|
|
return false;
|
|
const state = buffer.save();
|
|
const decodedTag = derDecodeTag(buffer, 'Failed to peek tag: "' + tag + '"');
|
|
if (buffer.isError(decodedTag))
|
|
return decodedTag;
|
|
buffer.restore(state);
|
|
return decodedTag.tag === tag || decodedTag.tagStr === tag || decodedTag.tagStr + "of" === tag || any;
|
|
};
|
|
DERNode.prototype._decodeTag = function decodeTag(buffer, tag, any) {
|
|
const decodedTag = derDecodeTag(buffer, 'Failed to decode tag of "' + tag + '"');
|
|
if (buffer.isError(decodedTag))
|
|
return decodedTag;
|
|
let len = derDecodeLen(buffer, decodedTag.primitive, 'Failed to get length of "' + tag + '"');
|
|
if (buffer.isError(len))
|
|
return len;
|
|
if (!any && decodedTag.tag !== tag && decodedTag.tagStr !== tag && decodedTag.tagStr + "of" !== tag) {
|
|
return buffer.error('Failed to match tag: "' + tag + '"');
|
|
}
|
|
if (decodedTag.primitive || len !== null)
|
|
return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
|
|
const state = buffer.save();
|
|
const res = this._skipUntilEnd(buffer, 'Failed to skip indefinite length body: "' + this.tag + '"');
|
|
if (buffer.isError(res))
|
|
return res;
|
|
len = buffer.offset - state.offset;
|
|
buffer.restore(state);
|
|
return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
|
|
};
|
|
DERNode.prototype._skipUntilEnd = function skipUntilEnd(buffer, fail) {
|
|
for (;; ) {
|
|
const tag = derDecodeTag(buffer, fail);
|
|
if (buffer.isError(tag))
|
|
return tag;
|
|
const len = derDecodeLen(buffer, tag.primitive, fail);
|
|
if (buffer.isError(len))
|
|
return len;
|
|
let res;
|
|
if (tag.primitive || len !== null)
|
|
res = buffer.skip(len);
|
|
else
|
|
res = this._skipUntilEnd(buffer, fail);
|
|
if (buffer.isError(res))
|
|
return res;
|
|
if (tag.tagStr === "end")
|
|
break;
|
|
}
|
|
};
|
|
DERNode.prototype._decodeList = function decodeList(buffer, tag, decoder, options2) {
|
|
const result = [];
|
|
while (!buffer.isEmpty()) {
|
|
const possibleEnd = this._peekTag(buffer, "end");
|
|
if (buffer.isError(possibleEnd))
|
|
return possibleEnd;
|
|
const res = decoder.decode(buffer, "der", options2);
|
|
if (buffer.isError(res) && possibleEnd)
|
|
break;
|
|
result.push(res);
|
|
}
|
|
return result;
|
|
};
|
|
DERNode.prototype._decodeStr = function decodeStr(buffer, tag) {
|
|
if (tag === "bitstr") {
|
|
const unused = buffer.readUInt8();
|
|
if (buffer.isError(unused))
|
|
return unused;
|
|
return { unused, data: buffer.raw() };
|
|
} else if (tag === "bmpstr") {
|
|
const raw = buffer.raw();
|
|
if (raw.length % 2 === 1)
|
|
return buffer.error("Decoding of string type: bmpstr length mismatch");
|
|
let str = "";
|
|
for (let i = 0;i < raw.length / 2; i++) {
|
|
str += String.fromCharCode(raw.readUInt16BE(i * 2));
|
|
}
|
|
return str;
|
|
} else if (tag === "numstr") {
|
|
const numstr = buffer.raw().toString("ascii");
|
|
if (!this._isNumstr(numstr)) {
|
|
return buffer.error("Decoding of string type: " + "numstr unsupported characters");
|
|
}
|
|
return numstr;
|
|
} else if (tag === "octstr") {
|
|
return buffer.raw();
|
|
} else if (tag === "objDesc") {
|
|
return buffer.raw();
|
|
} else if (tag === "printstr") {
|
|
const printstr = buffer.raw().toString("ascii");
|
|
if (!this._isPrintstr(printstr)) {
|
|
return buffer.error("Decoding of string type: " + "printstr unsupported characters");
|
|
}
|
|
return printstr;
|
|
} else if (/str$/.test(tag)) {
|
|
return buffer.raw().toString();
|
|
} else {
|
|
return buffer.error("Decoding of string type: " + tag + " unsupported");
|
|
}
|
|
};
|
|
DERNode.prototype._decodeObjid = function decodeObjid(buffer, values, relative) {
|
|
let result;
|
|
const identifiers = [];
|
|
let ident = 0;
|
|
let subident = 0;
|
|
while (!buffer.isEmpty()) {
|
|
subident = buffer.readUInt8();
|
|
ident <<= 7;
|
|
ident |= subident & 127;
|
|
if ((subident & 128) === 0) {
|
|
identifiers.push(ident);
|
|
ident = 0;
|
|
}
|
|
}
|
|
if (subident & 128)
|
|
identifiers.push(ident);
|
|
const first = identifiers[0] / 40 | 0;
|
|
const second = identifiers[0] % 40;
|
|
if (relative)
|
|
result = identifiers;
|
|
else
|
|
result = [first, second].concat(identifiers.slice(1));
|
|
if (values) {
|
|
let tmp = values[result.join(" ")];
|
|
if (tmp === undefined)
|
|
tmp = values[result.join(".")];
|
|
if (tmp !== undefined)
|
|
result = tmp;
|
|
}
|
|
return result;
|
|
};
|
|
DERNode.prototype._decodeTime = function decodeTime(buffer, tag) {
|
|
const str = buffer.raw().toString();
|
|
let year;
|
|
let mon;
|
|
let day;
|
|
let hour;
|
|
let min;
|
|
let sec;
|
|
if (tag === "gentime") {
|
|
year = str.slice(0, 4) | 0;
|
|
mon = str.slice(4, 6) | 0;
|
|
day = str.slice(6, 8) | 0;
|
|
hour = str.slice(8, 10) | 0;
|
|
min = str.slice(10, 12) | 0;
|
|
sec = str.slice(12, 14) | 0;
|
|
} else if (tag === "utctime") {
|
|
year = str.slice(0, 2) | 0;
|
|
mon = str.slice(2, 4) | 0;
|
|
day = str.slice(4, 6) | 0;
|
|
hour = str.slice(6, 8) | 0;
|
|
min = str.slice(8, 10) | 0;
|
|
sec = str.slice(10, 12) | 0;
|
|
if (year < 70)
|
|
year = 2000 + year;
|
|
else
|
|
year = 1900 + year;
|
|
} else {
|
|
return buffer.error("Decoding " + tag + " time is not supported yet");
|
|
}
|
|
return Date.UTC(year, mon - 1, day, hour, min, sec, 0);
|
|
};
|
|
DERNode.prototype._decodeNull = function decodeNull() {
|
|
return null;
|
|
};
|
|
DERNode.prototype._decodeBool = function decodeBool(buffer) {
|
|
const res = buffer.readUInt8();
|
|
if (buffer.isError(res))
|
|
return res;
|
|
else
|
|
return res !== 0;
|
|
};
|
|
DERNode.prototype._decodeInt = function decodeInt(buffer, values) {
|
|
const raw = buffer.raw();
|
|
let res = new bignum(raw);
|
|
if (values)
|
|
res = values[res.toString(10)] || res;
|
|
return res;
|
|
};
|
|
DERNode.prototype._use = function use(entity, obj) {
|
|
if (typeof entity === "function")
|
|
entity = entity(obj);
|
|
return entity._getDecoder("der").tree;
|
|
};
|
|
function derDecodeTag(buf, fail) {
|
|
let tag = buf.readUInt8(fail);
|
|
if (buf.isError(tag))
|
|
return tag;
|
|
const cls = der.tagClass[tag >> 6];
|
|
const primitive = (tag & 32) === 0;
|
|
if ((tag & 31) === 31) {
|
|
let oct = tag;
|
|
tag = 0;
|
|
while ((oct & 128) === 128) {
|
|
oct = buf.readUInt8(fail);
|
|
if (buf.isError(oct))
|
|
return oct;
|
|
tag <<= 7;
|
|
tag |= oct & 127;
|
|
}
|
|
} else {
|
|
tag &= 31;
|
|
}
|
|
const tagStr = der.tag[tag];
|
|
return {
|
|
cls,
|
|
primitive,
|
|
tag,
|
|
tagStr
|
|
};
|
|
}
|
|
function derDecodeLen(buf, primitive, fail) {
|
|
let len = buf.readUInt8(fail);
|
|
if (buf.isError(len))
|
|
return len;
|
|
if (!primitive && len === 128)
|
|
return null;
|
|
if ((len & 128) === 0) {
|
|
return len;
|
|
}
|
|
const num = len & 127;
|
|
if (num > 4)
|
|
return buf.error("length octect is too long");
|
|
len = 0;
|
|
for (let i = 0;i < num; i++) {
|
|
len <<= 8;
|
|
const j = buf.readUInt8(fail);
|
|
if (buf.isError(j))
|
|
return j;
|
|
len |= j;
|
|
}
|
|
return len;
|
|
}
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/decoders/pem.js
|
|
var require_pem2 = __commonJS((exports, module) => {
|
|
var inherits = require_inherits();
|
|
var Buffer2 = require_safer().Buffer;
|
|
var DERDecoder = require_der3();
|
|
function PEMDecoder(entity) {
|
|
DERDecoder.call(this, entity);
|
|
this.enc = "pem";
|
|
}
|
|
inherits(PEMDecoder, DERDecoder);
|
|
module.exports = PEMDecoder;
|
|
PEMDecoder.prototype.decode = function decode(data, options2) {
|
|
const lines = data.toString().split(/[\r\n]+/g);
|
|
const label = options2.label.toUpperCase();
|
|
const re = /^-----(BEGIN|END) ([^-]+)-----$/;
|
|
let start = -1;
|
|
let end = -1;
|
|
for (let i = 0;i < lines.length; i++) {
|
|
const match = lines[i].match(re);
|
|
if (match === null)
|
|
continue;
|
|
if (match[2] !== label)
|
|
continue;
|
|
if (start === -1) {
|
|
if (match[1] !== "BEGIN")
|
|
break;
|
|
start = i;
|
|
} else {
|
|
if (match[1] !== "END")
|
|
break;
|
|
end = i;
|
|
break;
|
|
}
|
|
}
|
|
if (start === -1 || end === -1)
|
|
throw new Error("PEM section not found for: " + label);
|
|
const base64 = lines.slice(start + 1, end).join("");
|
|
base64.replace(/[^a-z0-9+/=]+/gi, "");
|
|
const input = Buffer2.from(base64, "base64");
|
|
return DERDecoder.prototype.decode.call(this, input, options2);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/decoders/index.js
|
|
var require_decoders = __commonJS((exports) => {
|
|
var decoders = exports;
|
|
decoders.der = require_der3();
|
|
decoders.pem = require_pem2();
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/api.js
|
|
var require_api = __commonJS((exports) => {
|
|
var encoders = require_encoders();
|
|
var decoders = require_decoders();
|
|
var inherits = require_inherits();
|
|
var api = exports;
|
|
api.define = function define(name, body) {
|
|
return new Entity(name, body);
|
|
};
|
|
function Entity(name, body) {
|
|
this.name = name;
|
|
this.body = body;
|
|
this.decoders = {};
|
|
this.encoders = {};
|
|
}
|
|
Entity.prototype._createNamed = function createNamed(Base) {
|
|
const name = this.name;
|
|
function Generated(entity) {
|
|
this._initNamed(entity, name);
|
|
}
|
|
inherits(Generated, Base);
|
|
Generated.prototype._initNamed = function _initNamed(entity, name2) {
|
|
Base.call(this, entity, name2);
|
|
};
|
|
return new Generated(this);
|
|
};
|
|
Entity.prototype._getDecoder = function _getDecoder(enc) {
|
|
enc = enc || "der";
|
|
if (!this.decoders.hasOwnProperty(enc))
|
|
this.decoders[enc] = this._createNamed(decoders[enc]);
|
|
return this.decoders[enc];
|
|
};
|
|
Entity.prototype.decode = function decode(data, enc, options2) {
|
|
return this._getDecoder(enc).decode(data, options2);
|
|
};
|
|
Entity.prototype._getEncoder = function _getEncoder(enc) {
|
|
enc = enc || "der";
|
|
if (!this.encoders.hasOwnProperty(enc))
|
|
this.encoders[enc] = this._createNamed(encoders[enc]);
|
|
return this.encoders[enc];
|
|
};
|
|
Entity.prototype.encode = function encode(data, enc, reporter) {
|
|
return this._getEncoder(enc).encode(data, reporter);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/base/index.js
|
|
var require_base = __commonJS((exports) => {
|
|
var base = exports;
|
|
base.Reporter = require_reporter().Reporter;
|
|
base.DecoderBuffer = require_buffer().DecoderBuffer;
|
|
base.EncoderBuffer = require_buffer().EncoderBuffer;
|
|
base.Node = require_node();
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/constants/index.js
|
|
var require_constants2 = __commonJS((exports) => {
|
|
var constants = exports;
|
|
constants._reverse = function reverse(map) {
|
|
const res = {};
|
|
Object.keys(map).forEach(function(key) {
|
|
if ((key | 0) == key)
|
|
key = key | 0;
|
|
const value = map[key];
|
|
res[value] = key;
|
|
});
|
|
return res;
|
|
};
|
|
constants.der = require_der();
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1.js
|
|
var require_asn1 = __commonJS((exports) => {
|
|
var asn1 = exports;
|
|
asn1.bignum = require_bn();
|
|
asn1.define = require_api().define;
|
|
asn1.base = require_base();
|
|
asn1.constants = require_constants2();
|
|
asn1.decoders = require_decoders();
|
|
asn1.encoders = require_encoders();
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/package.json
|
|
var require_package = __commonJS((exports, module) => {
|
|
module.exports = {
|
|
name: "elliptic",
|
|
version: "6.6.1",
|
|
description: "EC cryptography",
|
|
main: "lib/elliptic.js",
|
|
files: [
|
|
"lib"
|
|
],
|
|
scripts: {
|
|
lint: "eslint lib test",
|
|
"lint:fix": "npm run lint -- --fix",
|
|
unit: "istanbul test _mocha --reporter=spec test/index.js",
|
|
test: "npm run lint && npm run unit",
|
|
version: "grunt dist && git add dist/"
|
|
},
|
|
repository: {
|
|
type: "git",
|
|
url: "git@github.com:indutny/elliptic"
|
|
},
|
|
keywords: [
|
|
"EC",
|
|
"Elliptic",
|
|
"curve",
|
|
"Cryptography"
|
|
],
|
|
author: "Fedor Indutny <fedor@indutny.com>",
|
|
license: "MIT",
|
|
bugs: {
|
|
url: "https://github.com/indutny/elliptic/issues"
|
|
},
|
|
homepage: "https://github.com/indutny/elliptic",
|
|
devDependencies: {
|
|
brfs: "^2.0.2",
|
|
coveralls: "^3.1.0",
|
|
eslint: "^7.6.0",
|
|
grunt: "^1.2.1",
|
|
"grunt-browserify": "^5.3.0",
|
|
"grunt-cli": "^1.3.2",
|
|
"grunt-contrib-connect": "^3.0.0",
|
|
"grunt-contrib-copy": "^1.0.0",
|
|
"grunt-contrib-uglify": "^5.0.0",
|
|
"grunt-mocha-istanbul": "^5.0.2",
|
|
"grunt-saucelabs": "^9.0.1",
|
|
istanbul: "^0.4.5",
|
|
mocha: "^8.0.1"
|
|
},
|
|
dependencies: {
|
|
"bn.js": "^4.11.9",
|
|
brorand: "^1.1.0",
|
|
"hash.js": "^1.0.0",
|
|
"hmac-drbg": "^1.0.1",
|
|
inherits: "^2.0.4",
|
|
"minimalistic-assert": "^1.0.1",
|
|
"minimalistic-crypto-utils": "^1.0.1"
|
|
}
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/minimalistic-crypto-utils/lib/utils.js
|
|
var require_utils = __commonJS((exports) => {
|
|
var utils = exports;
|
|
function toArray(msg, enc) {
|
|
if (Array.isArray(msg))
|
|
return msg.slice();
|
|
if (!msg)
|
|
return [];
|
|
var res = [];
|
|
if (typeof msg !== "string") {
|
|
for (var i = 0;i < msg.length; i++)
|
|
res[i] = msg[i] | 0;
|
|
return res;
|
|
}
|
|
if (enc === "hex") {
|
|
msg = msg.replace(/[^a-z0-9]+/ig, "");
|
|
if (msg.length % 2 !== 0)
|
|
msg = "0" + msg;
|
|
for (var i = 0;i < msg.length; i += 2)
|
|
res.push(parseInt(msg[i] + msg[i + 1], 16));
|
|
} else {
|
|
for (var i = 0;i < msg.length; i++) {
|
|
var c = msg.charCodeAt(i);
|
|
var hi = c >> 8;
|
|
var lo = c & 255;
|
|
if (hi)
|
|
res.push(hi, lo);
|
|
else
|
|
res.push(lo);
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
utils.toArray = toArray;
|
|
function zero2(word) {
|
|
if (word.length === 1)
|
|
return "0" + word;
|
|
else
|
|
return word;
|
|
}
|
|
utils.zero2 = zero2;
|
|
function toHex(msg) {
|
|
var res = "";
|
|
for (var i = 0;i < msg.length; i++)
|
|
res += zero2(msg[i].toString(16));
|
|
return res;
|
|
}
|
|
utils.toHex = toHex;
|
|
utils.encode = function encode(arr, enc) {
|
|
if (enc === "hex")
|
|
return toHex(arr);
|
|
else
|
|
return arr;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/utils.js
|
|
var require_utils2 = __commonJS((exports) => {
|
|
var utils = exports;
|
|
var BN = require_bn();
|
|
var minAssert = require_minimalistic_assert();
|
|
var minUtils = require_utils();
|
|
utils.assert = minAssert;
|
|
utils.toArray = minUtils.toArray;
|
|
utils.zero2 = minUtils.zero2;
|
|
utils.toHex = minUtils.toHex;
|
|
utils.encode = minUtils.encode;
|
|
function getNAF(num, w, bits) {
|
|
var naf = new Array(Math.max(num.bitLength(), bits) + 1);
|
|
var i;
|
|
for (i = 0;i < naf.length; i += 1) {
|
|
naf[i] = 0;
|
|
}
|
|
var ws = 1 << w + 1;
|
|
var k = num.clone();
|
|
for (i = 0;i < naf.length; i++) {
|
|
var z;
|
|
var mod = k.andln(ws - 1);
|
|
if (k.isOdd()) {
|
|
if (mod > (ws >> 1) - 1)
|
|
z = (ws >> 1) - mod;
|
|
else
|
|
z = mod;
|
|
k.isubn(z);
|
|
} else {
|
|
z = 0;
|
|
}
|
|
naf[i] = z;
|
|
k.iushrn(1);
|
|
}
|
|
return naf;
|
|
}
|
|
utils.getNAF = getNAF;
|
|
function getJSF(k1, k2) {
|
|
var jsf = [
|
|
[],
|
|
[]
|
|
];
|
|
k1 = k1.clone();
|
|
k2 = k2.clone();
|
|
var d1 = 0;
|
|
var d2 = 0;
|
|
var m8;
|
|
while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {
|
|
var m14 = k1.andln(3) + d1 & 3;
|
|
var m24 = k2.andln(3) + d2 & 3;
|
|
if (m14 === 3)
|
|
m14 = -1;
|
|
if (m24 === 3)
|
|
m24 = -1;
|
|
var u1;
|
|
if ((m14 & 1) === 0) {
|
|
u1 = 0;
|
|
} else {
|
|
m8 = k1.andln(7) + d1 & 7;
|
|
if ((m8 === 3 || m8 === 5) && m24 === 2)
|
|
u1 = -m14;
|
|
else
|
|
u1 = m14;
|
|
}
|
|
jsf[0].push(u1);
|
|
var u2;
|
|
if ((m24 & 1) === 0) {
|
|
u2 = 0;
|
|
} else {
|
|
m8 = k2.andln(7) + d2 & 7;
|
|
if ((m8 === 3 || m8 === 5) && m14 === 2)
|
|
u2 = -m24;
|
|
else
|
|
u2 = m24;
|
|
}
|
|
jsf[1].push(u2);
|
|
if (2 * d1 === u1 + 1)
|
|
d1 = 1 - d1;
|
|
if (2 * d2 === u2 + 1)
|
|
d2 = 1 - d2;
|
|
k1.iushrn(1);
|
|
k2.iushrn(1);
|
|
}
|
|
return jsf;
|
|
}
|
|
utils.getJSF = getJSF;
|
|
function cachedProperty(obj, name, computer) {
|
|
var key = "_" + name;
|
|
obj.prototype[name] = function cachedProperty() {
|
|
return this[key] !== undefined ? this[key] : this[key] = computer.call(this);
|
|
};
|
|
}
|
|
utils.cachedProperty = cachedProperty;
|
|
function parseBytes(bytes) {
|
|
return typeof bytes === "string" ? utils.toArray(bytes, "hex") : bytes;
|
|
}
|
|
utils.parseBytes = parseBytes;
|
|
function intFromLE(bytes) {
|
|
return new BN(bytes, "hex", "le");
|
|
}
|
|
utils.intFromLE = intFromLE;
|
|
});
|
|
|
|
// ../eve/node_modules/brorand/index.js
|
|
var require_brorand = __commonJS((exports, module) => {
|
|
var r;
|
|
module.exports = function rand(len) {
|
|
if (!r)
|
|
r = new Rand(null);
|
|
return r.generate(len);
|
|
};
|
|
function Rand(rand) {
|
|
this.rand = rand;
|
|
}
|
|
module.exports.Rand = Rand;
|
|
Rand.prototype.generate = function generate(len) {
|
|
return this._rand(len);
|
|
};
|
|
Rand.prototype._rand = function _rand(n) {
|
|
if (this.rand.getBytes)
|
|
return this.rand.getBytes(n);
|
|
var res = new Uint8Array(n);
|
|
for (var i = 0;i < res.length; i++)
|
|
res[i] = this.rand.getByte();
|
|
return res;
|
|
};
|
|
if (typeof self === "object") {
|
|
if (self.crypto && self.crypto.getRandomValues) {
|
|
Rand.prototype._rand = function _rand(n) {
|
|
var arr = new Uint8Array(n);
|
|
self.crypto.getRandomValues(arr);
|
|
return arr;
|
|
};
|
|
} else if (self.msCrypto && self.msCrypto.getRandomValues) {
|
|
Rand.prototype._rand = function _rand(n) {
|
|
var arr = new Uint8Array(n);
|
|
self.msCrypto.getRandomValues(arr);
|
|
return arr;
|
|
};
|
|
} else if (typeof window === "object") {
|
|
Rand.prototype._rand = function() {
|
|
throw new Error("Not implemented yet");
|
|
};
|
|
}
|
|
} else {
|
|
try {
|
|
crypto2 = __require("crypto");
|
|
if (typeof crypto2.randomBytes !== "function")
|
|
throw new Error("Not supported");
|
|
Rand.prototype._rand = function _rand(n) {
|
|
return crypto2.randomBytes(n);
|
|
};
|
|
} catch (e) {}
|
|
}
|
|
var crypto2;
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/curve/base.js
|
|
var require_base2 = __commonJS((exports, module) => {
|
|
var BN = require_bn();
|
|
var utils = require_utils2();
|
|
var getNAF = utils.getNAF;
|
|
var getJSF = utils.getJSF;
|
|
var assert = utils.assert;
|
|
function BaseCurve(type, conf) {
|
|
this.type = type;
|
|
this.p = new BN(conf.p, 16);
|
|
this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);
|
|
this.zero = new BN(0).toRed(this.red);
|
|
this.one = new BN(1).toRed(this.red);
|
|
this.two = new BN(2).toRed(this.red);
|
|
this.n = conf.n && new BN(conf.n, 16);
|
|
this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);
|
|
this._wnafT1 = new Array(4);
|
|
this._wnafT2 = new Array(4);
|
|
this._wnafT3 = new Array(4);
|
|
this._wnafT4 = new Array(4);
|
|
this._bitLength = this.n ? this.n.bitLength() : 0;
|
|
var adjustCount = this.n && this.p.div(this.n);
|
|
if (!adjustCount || adjustCount.cmpn(100) > 0) {
|
|
this.redN = null;
|
|
} else {
|
|
this._maxwellTrick = true;
|
|
this.redN = this.n.toRed(this.red);
|
|
}
|
|
}
|
|
module.exports = BaseCurve;
|
|
BaseCurve.prototype.point = function point() {
|
|
throw new Error("Not implemented");
|
|
};
|
|
BaseCurve.prototype.validate = function validate() {
|
|
throw new Error("Not implemented");
|
|
};
|
|
BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {
|
|
assert(p.precomputed);
|
|
var doubles = p._getDoubles();
|
|
var naf = getNAF(k, 1, this._bitLength);
|
|
var I = (1 << doubles.step + 1) - (doubles.step % 2 === 0 ? 2 : 1);
|
|
I /= 3;
|
|
var repr = [];
|
|
var j;
|
|
var nafW;
|
|
for (j = 0;j < naf.length; j += doubles.step) {
|
|
nafW = 0;
|
|
for (var l = j + doubles.step - 1;l >= j; l--)
|
|
nafW = (nafW << 1) + naf[l];
|
|
repr.push(nafW);
|
|
}
|
|
var a = this.jpoint(null, null, null);
|
|
var b = this.jpoint(null, null, null);
|
|
for (var i = I;i > 0; i--) {
|
|
for (j = 0;j < repr.length; j++) {
|
|
nafW = repr[j];
|
|
if (nafW === i)
|
|
b = b.mixedAdd(doubles.points[j]);
|
|
else if (nafW === -i)
|
|
b = b.mixedAdd(doubles.points[j].neg());
|
|
}
|
|
a = a.add(b);
|
|
}
|
|
return a.toP();
|
|
};
|
|
BaseCurve.prototype._wnafMul = function _wnafMul(p, k) {
|
|
var w = 4;
|
|
var nafPoints = p._getNAFPoints(w);
|
|
w = nafPoints.wnd;
|
|
var wnd = nafPoints.points;
|
|
var naf = getNAF(k, w, this._bitLength);
|
|
var acc = this.jpoint(null, null, null);
|
|
for (var i = naf.length - 1;i >= 0; i--) {
|
|
for (var l = 0;i >= 0 && naf[i] === 0; i--)
|
|
l++;
|
|
if (i >= 0)
|
|
l++;
|
|
acc = acc.dblp(l);
|
|
if (i < 0)
|
|
break;
|
|
var z = naf[i];
|
|
assert(z !== 0);
|
|
if (p.type === "affine") {
|
|
if (z > 0)
|
|
acc = acc.mixedAdd(wnd[z - 1 >> 1]);
|
|
else
|
|
acc = acc.mixedAdd(wnd[-z - 1 >> 1].neg());
|
|
} else {
|
|
if (z > 0)
|
|
acc = acc.add(wnd[z - 1 >> 1]);
|
|
else
|
|
acc = acc.add(wnd[-z - 1 >> 1].neg());
|
|
}
|
|
}
|
|
return p.type === "affine" ? acc.toP() : acc;
|
|
};
|
|
BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len, jacobianResult) {
|
|
var wndWidth = this._wnafT1;
|
|
var wnd = this._wnafT2;
|
|
var naf = this._wnafT3;
|
|
var max = 0;
|
|
var i;
|
|
var j;
|
|
var p;
|
|
for (i = 0;i < len; i++) {
|
|
p = points[i];
|
|
var nafPoints = p._getNAFPoints(defW);
|
|
wndWidth[i] = nafPoints.wnd;
|
|
wnd[i] = nafPoints.points;
|
|
}
|
|
for (i = len - 1;i >= 1; i -= 2) {
|
|
var a = i - 1;
|
|
var b = i;
|
|
if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {
|
|
naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);
|
|
naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);
|
|
max = Math.max(naf[a].length, max);
|
|
max = Math.max(naf[b].length, max);
|
|
continue;
|
|
}
|
|
var comb = [
|
|
points[a],
|
|
null,
|
|
null,
|
|
points[b]
|
|
];
|
|
if (points[a].y.cmp(points[b].y) === 0) {
|
|
comb[1] = points[a].add(points[b]);
|
|
comb[2] = points[a].toJ().mixedAdd(points[b].neg());
|
|
} else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {
|
|
comb[1] = points[a].toJ().mixedAdd(points[b]);
|
|
comb[2] = points[a].add(points[b].neg());
|
|
} else {
|
|
comb[1] = points[a].toJ().mixedAdd(points[b]);
|
|
comb[2] = points[a].toJ().mixedAdd(points[b].neg());
|
|
}
|
|
var index2 = [
|
|
-3,
|
|
-1,
|
|
-5,
|
|
-7,
|
|
0,
|
|
7,
|
|
5,
|
|
1,
|
|
3
|
|
];
|
|
var jsf = getJSF(coeffs[a], coeffs[b]);
|
|
max = Math.max(jsf[0].length, max);
|
|
naf[a] = new Array(max);
|
|
naf[b] = new Array(max);
|
|
for (j = 0;j < max; j++) {
|
|
var ja = jsf[0][j] | 0;
|
|
var jb = jsf[1][j] | 0;
|
|
naf[a][j] = index2[(ja + 1) * 3 + (jb + 1)];
|
|
naf[b][j] = 0;
|
|
wnd[a] = comb;
|
|
}
|
|
}
|
|
var acc = this.jpoint(null, null, null);
|
|
var tmp = this._wnafT4;
|
|
for (i = max;i >= 0; i--) {
|
|
var k = 0;
|
|
while (i >= 0) {
|
|
var zero = true;
|
|
for (j = 0;j < len; j++) {
|
|
tmp[j] = naf[j][i] | 0;
|
|
if (tmp[j] !== 0)
|
|
zero = false;
|
|
}
|
|
if (!zero)
|
|
break;
|
|
k++;
|
|
i--;
|
|
}
|
|
if (i >= 0)
|
|
k++;
|
|
acc = acc.dblp(k);
|
|
if (i < 0)
|
|
break;
|
|
for (j = 0;j < len; j++) {
|
|
var z = tmp[j];
|
|
if (z === 0)
|
|
continue;
|
|
else if (z > 0)
|
|
p = wnd[j][z - 1 >> 1];
|
|
else if (z < 0)
|
|
p = wnd[j][-z - 1 >> 1].neg();
|
|
if (p.type === "affine")
|
|
acc = acc.mixedAdd(p);
|
|
else
|
|
acc = acc.add(p);
|
|
}
|
|
}
|
|
for (i = 0;i < len; i++)
|
|
wnd[i] = null;
|
|
if (jacobianResult)
|
|
return acc;
|
|
else
|
|
return acc.toP();
|
|
};
|
|
function BasePoint(curve, type) {
|
|
this.curve = curve;
|
|
this.type = type;
|
|
this.precomputed = null;
|
|
}
|
|
BaseCurve.BasePoint = BasePoint;
|
|
BasePoint.prototype.eq = function eq() {
|
|
throw new Error("Not implemented");
|
|
};
|
|
BasePoint.prototype.validate = function validate() {
|
|
return this.curve.validate(this);
|
|
};
|
|
BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
|
|
bytes = utils.toArray(bytes, enc);
|
|
var len = this.p.byteLength();
|
|
if ((bytes[0] === 4 || bytes[0] === 6 || bytes[0] === 7) && bytes.length - 1 === 2 * len) {
|
|
if (bytes[0] === 6)
|
|
assert(bytes[bytes.length - 1] % 2 === 0);
|
|
else if (bytes[0] === 7)
|
|
assert(bytes[bytes.length - 1] % 2 === 1);
|
|
var res = this.point(bytes.slice(1, 1 + len), bytes.slice(1 + len, 1 + 2 * len));
|
|
return res;
|
|
} else if ((bytes[0] === 2 || bytes[0] === 3) && bytes.length - 1 === len) {
|
|
return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 3);
|
|
}
|
|
throw new Error("Unknown point format");
|
|
};
|
|
BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {
|
|
return this.encode(enc, true);
|
|
};
|
|
BasePoint.prototype._encode = function _encode(compact) {
|
|
var len = this.curve.p.byteLength();
|
|
var x = this.getX().toArray("be", len);
|
|
if (compact)
|
|
return [this.getY().isEven() ? 2 : 3].concat(x);
|
|
return [4].concat(x, this.getY().toArray("be", len));
|
|
};
|
|
BasePoint.prototype.encode = function encode(enc, compact) {
|
|
return utils.encode(this._encode(compact), enc);
|
|
};
|
|
BasePoint.prototype.precompute = function precompute(power) {
|
|
if (this.precomputed)
|
|
return this;
|
|
var precomputed = {
|
|
doubles: null,
|
|
naf: null,
|
|
beta: null
|
|
};
|
|
precomputed.naf = this._getNAFPoints(8);
|
|
precomputed.doubles = this._getDoubles(4, power);
|
|
precomputed.beta = this._getBeta();
|
|
this.precomputed = precomputed;
|
|
return this;
|
|
};
|
|
BasePoint.prototype._hasDoubles = function _hasDoubles(k) {
|
|
if (!this.precomputed)
|
|
return false;
|
|
var doubles = this.precomputed.doubles;
|
|
if (!doubles)
|
|
return false;
|
|
return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);
|
|
};
|
|
BasePoint.prototype._getDoubles = function _getDoubles(step, power) {
|
|
if (this.precomputed && this.precomputed.doubles)
|
|
return this.precomputed.doubles;
|
|
var doubles = [this];
|
|
var acc = this;
|
|
for (var i = 0;i < power; i += step) {
|
|
for (var j = 0;j < step; j++)
|
|
acc = acc.dbl();
|
|
doubles.push(acc);
|
|
}
|
|
return {
|
|
step,
|
|
points: doubles
|
|
};
|
|
};
|
|
BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {
|
|
if (this.precomputed && this.precomputed.naf)
|
|
return this.precomputed.naf;
|
|
var res = [this];
|
|
var max = (1 << wnd) - 1;
|
|
var dbl = max === 1 ? null : this.dbl();
|
|
for (var i = 1;i < max; i++)
|
|
res[i] = res[i - 1].add(dbl);
|
|
return {
|
|
wnd,
|
|
points: res
|
|
};
|
|
};
|
|
BasePoint.prototype._getBeta = function _getBeta() {
|
|
return null;
|
|
};
|
|
BasePoint.prototype.dblp = function dblp(k) {
|
|
var r = this;
|
|
for (var i = 0;i < k; i++)
|
|
r = r.dbl();
|
|
return r;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/curve/short.js
|
|
var require_short = __commonJS((exports, module) => {
|
|
var utils = require_utils2();
|
|
var BN = require_bn();
|
|
var inherits = require_inherits();
|
|
var Base = require_base2();
|
|
var assert = utils.assert;
|
|
function ShortCurve(conf) {
|
|
Base.call(this, "short", conf);
|
|
this.a = new BN(conf.a, 16).toRed(this.red);
|
|
this.b = new BN(conf.b, 16).toRed(this.red);
|
|
this.tinv = this.two.redInvm();
|
|
this.zeroA = this.a.fromRed().cmpn(0) === 0;
|
|
this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;
|
|
this.endo = this._getEndomorphism(conf);
|
|
this._endoWnafT1 = new Array(4);
|
|
this._endoWnafT2 = new Array(4);
|
|
}
|
|
inherits(ShortCurve, Base);
|
|
module.exports = ShortCurve;
|
|
ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {
|
|
if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)
|
|
return;
|
|
var beta;
|
|
var lambda;
|
|
if (conf.beta) {
|
|
beta = new BN(conf.beta, 16).toRed(this.red);
|
|
} else {
|
|
var betas = this._getEndoRoots(this.p);
|
|
beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];
|
|
beta = beta.toRed(this.red);
|
|
}
|
|
if (conf.lambda) {
|
|
lambda = new BN(conf.lambda, 16);
|
|
} else {
|
|
var lambdas = this._getEndoRoots(this.n);
|
|
if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {
|
|
lambda = lambdas[0];
|
|
} else {
|
|
lambda = lambdas[1];
|
|
assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);
|
|
}
|
|
}
|
|
var basis;
|
|
if (conf.basis) {
|
|
basis = conf.basis.map(function(vec) {
|
|
return {
|
|
a: new BN(vec.a, 16),
|
|
b: new BN(vec.b, 16)
|
|
};
|
|
});
|
|
} else {
|
|
basis = this._getEndoBasis(lambda);
|
|
}
|
|
return {
|
|
beta,
|
|
lambda,
|
|
basis
|
|
};
|
|
};
|
|
ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {
|
|
var red = num === this.p ? this.red : BN.mont(num);
|
|
var tinv = new BN(2).toRed(red).redInvm();
|
|
var ntinv = tinv.redNeg();
|
|
var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);
|
|
var l1 = ntinv.redAdd(s).fromRed();
|
|
var l2 = ntinv.redSub(s).fromRed();
|
|
return [l1, l2];
|
|
};
|
|
ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {
|
|
var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));
|
|
var u = lambda;
|
|
var v = this.n.clone();
|
|
var x1 = new BN(1);
|
|
var y1 = new BN(0);
|
|
var x2 = new BN(0);
|
|
var y2 = new BN(1);
|
|
var a0;
|
|
var b0;
|
|
var a1;
|
|
var b1;
|
|
var a2;
|
|
var b2;
|
|
var prevR;
|
|
var i = 0;
|
|
var r;
|
|
var x;
|
|
while (u.cmpn(0) !== 0) {
|
|
var q = v.div(u);
|
|
r = v.sub(q.mul(u));
|
|
x = x2.sub(q.mul(x1));
|
|
var y = y2.sub(q.mul(y1));
|
|
if (!a1 && r.cmp(aprxSqrt) < 0) {
|
|
a0 = prevR.neg();
|
|
b0 = x1;
|
|
a1 = r.neg();
|
|
b1 = x;
|
|
} else if (a1 && ++i === 2) {
|
|
break;
|
|
}
|
|
prevR = r;
|
|
v = u;
|
|
u = r;
|
|
x2 = x1;
|
|
x1 = x;
|
|
y2 = y1;
|
|
y1 = y;
|
|
}
|
|
a2 = r.neg();
|
|
b2 = x;
|
|
var len1 = a1.sqr().add(b1.sqr());
|
|
var len2 = a2.sqr().add(b2.sqr());
|
|
if (len2.cmp(len1) >= 0) {
|
|
a2 = a0;
|
|
b2 = b0;
|
|
}
|
|
if (a1.negative) {
|
|
a1 = a1.neg();
|
|
b1 = b1.neg();
|
|
}
|
|
if (a2.negative) {
|
|
a2 = a2.neg();
|
|
b2 = b2.neg();
|
|
}
|
|
return [
|
|
{ a: a1, b: b1 },
|
|
{ a: a2, b: b2 }
|
|
];
|
|
};
|
|
ShortCurve.prototype._endoSplit = function _endoSplit(k) {
|
|
var basis = this.endo.basis;
|
|
var v1 = basis[0];
|
|
var v2 = basis[1];
|
|
var c1 = v2.b.mul(k).divRound(this.n);
|
|
var c2 = v1.b.neg().mul(k).divRound(this.n);
|
|
var p1 = c1.mul(v1.a);
|
|
var p2 = c2.mul(v2.a);
|
|
var q1 = c1.mul(v1.b);
|
|
var q2 = c2.mul(v2.b);
|
|
var k1 = k.sub(p1).sub(p2);
|
|
var k2 = q1.add(q2).neg();
|
|
return { k1, k2 };
|
|
};
|
|
ShortCurve.prototype.pointFromX = function pointFromX(x, odd) {
|
|
x = new BN(x, 16);
|
|
if (!x.red)
|
|
x = x.toRed(this.red);
|
|
var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);
|
|
var y = y2.redSqrt();
|
|
if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
|
|
throw new Error("invalid point");
|
|
var isOdd = y.fromRed().isOdd();
|
|
if (odd && !isOdd || !odd && isOdd)
|
|
y = y.redNeg();
|
|
return this.point(x, y);
|
|
};
|
|
ShortCurve.prototype.validate = function validate(point) {
|
|
if (point.inf)
|
|
return true;
|
|
var x = point.x;
|
|
var y = point.y;
|
|
var ax = this.a.redMul(x);
|
|
var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);
|
|
return y.redSqr().redISub(rhs).cmpn(0) === 0;
|
|
};
|
|
ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs, jacobianResult) {
|
|
var npoints = this._endoWnafT1;
|
|
var ncoeffs = this._endoWnafT2;
|
|
for (var i = 0;i < points.length; i++) {
|
|
var split = this._endoSplit(coeffs[i]);
|
|
var p = points[i];
|
|
var beta = p._getBeta();
|
|
if (split.k1.negative) {
|
|
split.k1.ineg();
|
|
p = p.neg(true);
|
|
}
|
|
if (split.k2.negative) {
|
|
split.k2.ineg();
|
|
beta = beta.neg(true);
|
|
}
|
|
npoints[i * 2] = p;
|
|
npoints[i * 2 + 1] = beta;
|
|
ncoeffs[i * 2] = split.k1;
|
|
ncoeffs[i * 2 + 1] = split.k2;
|
|
}
|
|
var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);
|
|
for (var j = 0;j < i * 2; j++) {
|
|
npoints[j] = null;
|
|
ncoeffs[j] = null;
|
|
}
|
|
return res;
|
|
};
|
|
function Point(curve, x, y, isRed) {
|
|
Base.BasePoint.call(this, curve, "affine");
|
|
if (x === null && y === null) {
|
|
this.x = null;
|
|
this.y = null;
|
|
this.inf = true;
|
|
} else {
|
|
this.x = new BN(x, 16);
|
|
this.y = new BN(y, 16);
|
|
if (isRed) {
|
|
this.x.forceRed(this.curve.red);
|
|
this.y.forceRed(this.curve.red);
|
|
}
|
|
if (!this.x.red)
|
|
this.x = this.x.toRed(this.curve.red);
|
|
if (!this.y.red)
|
|
this.y = this.y.toRed(this.curve.red);
|
|
this.inf = false;
|
|
}
|
|
}
|
|
inherits(Point, Base.BasePoint);
|
|
ShortCurve.prototype.point = function point(x, y, isRed) {
|
|
return new Point(this, x, y, isRed);
|
|
};
|
|
ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {
|
|
return Point.fromJSON(this, obj, red);
|
|
};
|
|
Point.prototype._getBeta = function _getBeta() {
|
|
if (!this.curve.endo)
|
|
return;
|
|
var pre = this.precomputed;
|
|
if (pre && pre.beta)
|
|
return pre.beta;
|
|
var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);
|
|
if (pre) {
|
|
var curve = this.curve;
|
|
var endoMul = function(p) {
|
|
return curve.point(p.x.redMul(curve.endo.beta), p.y);
|
|
};
|
|
pre.beta = beta;
|
|
beta.precomputed = {
|
|
beta: null,
|
|
naf: pre.naf && {
|
|
wnd: pre.naf.wnd,
|
|
points: pre.naf.points.map(endoMul)
|
|
},
|
|
doubles: pre.doubles && {
|
|
step: pre.doubles.step,
|
|
points: pre.doubles.points.map(endoMul)
|
|
}
|
|
};
|
|
}
|
|
return beta;
|
|
};
|
|
Point.prototype.toJSON = function toJSON() {
|
|
if (!this.precomputed)
|
|
return [this.x, this.y];
|
|
return [this.x, this.y, this.precomputed && {
|
|
doubles: this.precomputed.doubles && {
|
|
step: this.precomputed.doubles.step,
|
|
points: this.precomputed.doubles.points.slice(1)
|
|
},
|
|
naf: this.precomputed.naf && {
|
|
wnd: this.precomputed.naf.wnd,
|
|
points: this.precomputed.naf.points.slice(1)
|
|
}
|
|
}];
|
|
};
|
|
Point.fromJSON = function fromJSON(curve, obj, red) {
|
|
if (typeof obj === "string")
|
|
obj = JSON.parse(obj);
|
|
var res = curve.point(obj[0], obj[1], red);
|
|
if (!obj[2])
|
|
return res;
|
|
function obj2point(obj2) {
|
|
return curve.point(obj2[0], obj2[1], red);
|
|
}
|
|
var pre = obj[2];
|
|
res.precomputed = {
|
|
beta: null,
|
|
doubles: pre.doubles && {
|
|
step: pre.doubles.step,
|
|
points: [res].concat(pre.doubles.points.map(obj2point))
|
|
},
|
|
naf: pre.naf && {
|
|
wnd: pre.naf.wnd,
|
|
points: [res].concat(pre.naf.points.map(obj2point))
|
|
}
|
|
};
|
|
return res;
|
|
};
|
|
Point.prototype.inspect = function inspect() {
|
|
if (this.isInfinity())
|
|
return "<EC Point Infinity>";
|
|
return "<EC Point x: " + this.x.fromRed().toString(16, 2) + " y: " + this.y.fromRed().toString(16, 2) + ">";
|
|
};
|
|
Point.prototype.isInfinity = function isInfinity() {
|
|
return this.inf;
|
|
};
|
|
Point.prototype.add = function add(p) {
|
|
if (this.inf)
|
|
return p;
|
|
if (p.inf)
|
|
return this;
|
|
if (this.eq(p))
|
|
return this.dbl();
|
|
if (this.neg().eq(p))
|
|
return this.curve.point(null, null);
|
|
if (this.x.cmp(p.x) === 0)
|
|
return this.curve.point(null, null);
|
|
var c = this.y.redSub(p.y);
|
|
if (c.cmpn(0) !== 0)
|
|
c = c.redMul(this.x.redSub(p.x).redInvm());
|
|
var nx = c.redSqr().redISub(this.x).redISub(p.x);
|
|
var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
|
|
return this.curve.point(nx, ny);
|
|
};
|
|
Point.prototype.dbl = function dbl() {
|
|
if (this.inf)
|
|
return this;
|
|
var ys1 = this.y.redAdd(this.y);
|
|
if (ys1.cmpn(0) === 0)
|
|
return this.curve.point(null, null);
|
|
var a = this.curve.a;
|
|
var x2 = this.x.redSqr();
|
|
var dyinv = ys1.redInvm();
|
|
var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);
|
|
var nx = c.redSqr().redISub(this.x.redAdd(this.x));
|
|
var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
|
|
return this.curve.point(nx, ny);
|
|
};
|
|
Point.prototype.getX = function getX() {
|
|
return this.x.fromRed();
|
|
};
|
|
Point.prototype.getY = function getY() {
|
|
return this.y.fromRed();
|
|
};
|
|
Point.prototype.mul = function mul(k) {
|
|
k = new BN(k, 16);
|
|
if (this.isInfinity())
|
|
return this;
|
|
else if (this._hasDoubles(k))
|
|
return this.curve._fixedNafMul(this, k);
|
|
else if (this.curve.endo)
|
|
return this.curve._endoWnafMulAdd([this], [k]);
|
|
else
|
|
return this.curve._wnafMul(this, k);
|
|
};
|
|
Point.prototype.mulAdd = function mulAdd(k1, p2, k2) {
|
|
var points = [this, p2];
|
|
var coeffs = [k1, k2];
|
|
if (this.curve.endo)
|
|
return this.curve._endoWnafMulAdd(points, coeffs);
|
|
else
|
|
return this.curve._wnafMulAdd(1, points, coeffs, 2);
|
|
};
|
|
Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {
|
|
var points = [this, p2];
|
|
var coeffs = [k1, k2];
|
|
if (this.curve.endo)
|
|
return this.curve._endoWnafMulAdd(points, coeffs, true);
|
|
else
|
|
return this.curve._wnafMulAdd(1, points, coeffs, 2, true);
|
|
};
|
|
Point.prototype.eq = function eq(p) {
|
|
return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);
|
|
};
|
|
Point.prototype.neg = function neg(_precompute) {
|
|
if (this.inf)
|
|
return this;
|
|
var res = this.curve.point(this.x, this.y.redNeg());
|
|
if (_precompute && this.precomputed) {
|
|
var pre = this.precomputed;
|
|
var negate = function(p) {
|
|
return p.neg();
|
|
};
|
|
res.precomputed = {
|
|
naf: pre.naf && {
|
|
wnd: pre.naf.wnd,
|
|
points: pre.naf.points.map(negate)
|
|
},
|
|
doubles: pre.doubles && {
|
|
step: pre.doubles.step,
|
|
points: pre.doubles.points.map(negate)
|
|
}
|
|
};
|
|
}
|
|
return res;
|
|
};
|
|
Point.prototype.toJ = function toJ() {
|
|
if (this.inf)
|
|
return this.curve.jpoint(null, null, null);
|
|
var res = this.curve.jpoint(this.x, this.y, this.curve.one);
|
|
return res;
|
|
};
|
|
function JPoint(curve, x, y, z) {
|
|
Base.BasePoint.call(this, curve, "jacobian");
|
|
if (x === null && y === null && z === null) {
|
|
this.x = this.curve.one;
|
|
this.y = this.curve.one;
|
|
this.z = new BN(0);
|
|
} else {
|
|
this.x = new BN(x, 16);
|
|
this.y = new BN(y, 16);
|
|
this.z = new BN(z, 16);
|
|
}
|
|
if (!this.x.red)
|
|
this.x = this.x.toRed(this.curve.red);
|
|
if (!this.y.red)
|
|
this.y = this.y.toRed(this.curve.red);
|
|
if (!this.z.red)
|
|
this.z = this.z.toRed(this.curve.red);
|
|
this.zOne = this.z === this.curve.one;
|
|
}
|
|
inherits(JPoint, Base.BasePoint);
|
|
ShortCurve.prototype.jpoint = function jpoint(x, y, z) {
|
|
return new JPoint(this, x, y, z);
|
|
};
|
|
JPoint.prototype.toP = function toP() {
|
|
if (this.isInfinity())
|
|
return this.curve.point(null, null);
|
|
var zinv = this.z.redInvm();
|
|
var zinv2 = zinv.redSqr();
|
|
var ax = this.x.redMul(zinv2);
|
|
var ay = this.y.redMul(zinv2).redMul(zinv);
|
|
return this.curve.point(ax, ay);
|
|
};
|
|
JPoint.prototype.neg = function neg() {
|
|
return this.curve.jpoint(this.x, this.y.redNeg(), this.z);
|
|
};
|
|
JPoint.prototype.add = function add(p) {
|
|
if (this.isInfinity())
|
|
return p;
|
|
if (p.isInfinity())
|
|
return this;
|
|
var pz2 = p.z.redSqr();
|
|
var z2 = this.z.redSqr();
|
|
var u1 = this.x.redMul(pz2);
|
|
var u2 = p.x.redMul(z2);
|
|
var s1 = this.y.redMul(pz2.redMul(p.z));
|
|
var s2 = p.y.redMul(z2.redMul(this.z));
|
|
var h = u1.redSub(u2);
|
|
var r = s1.redSub(s2);
|
|
if (h.cmpn(0) === 0) {
|
|
if (r.cmpn(0) !== 0)
|
|
return this.curve.jpoint(null, null, null);
|
|
else
|
|
return this.dbl();
|
|
}
|
|
var h2 = h.redSqr();
|
|
var h3 = h2.redMul(h);
|
|
var v = u1.redMul(h2);
|
|
var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
|
|
var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
|
|
var nz = this.z.redMul(p.z).redMul(h);
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
JPoint.prototype.mixedAdd = function mixedAdd(p) {
|
|
if (this.isInfinity())
|
|
return p.toJ();
|
|
if (p.isInfinity())
|
|
return this;
|
|
var z2 = this.z.redSqr();
|
|
var u1 = this.x;
|
|
var u2 = p.x.redMul(z2);
|
|
var s1 = this.y;
|
|
var s2 = p.y.redMul(z2).redMul(this.z);
|
|
var h = u1.redSub(u2);
|
|
var r = s1.redSub(s2);
|
|
if (h.cmpn(0) === 0) {
|
|
if (r.cmpn(0) !== 0)
|
|
return this.curve.jpoint(null, null, null);
|
|
else
|
|
return this.dbl();
|
|
}
|
|
var h2 = h.redSqr();
|
|
var h3 = h2.redMul(h);
|
|
var v = u1.redMul(h2);
|
|
var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
|
|
var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
|
|
var nz = this.z.redMul(h);
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
JPoint.prototype.dblp = function dblp(pow) {
|
|
if (pow === 0)
|
|
return this;
|
|
if (this.isInfinity())
|
|
return this;
|
|
if (!pow)
|
|
return this.dbl();
|
|
var i;
|
|
if (this.curve.zeroA || this.curve.threeA) {
|
|
var r = this;
|
|
for (i = 0;i < pow; i++)
|
|
r = r.dbl();
|
|
return r;
|
|
}
|
|
var a = this.curve.a;
|
|
var tinv = this.curve.tinv;
|
|
var jx = this.x;
|
|
var jy = this.y;
|
|
var jz = this.z;
|
|
var jz4 = jz.redSqr().redSqr();
|
|
var jyd = jy.redAdd(jy);
|
|
for (i = 0;i < pow; i++) {
|
|
var jx2 = jx.redSqr();
|
|
var jyd2 = jyd.redSqr();
|
|
var jyd4 = jyd2.redSqr();
|
|
var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
|
|
var t1 = jx.redMul(jyd2);
|
|
var nx = c.redSqr().redISub(t1.redAdd(t1));
|
|
var t2 = t1.redISub(nx);
|
|
var dny = c.redMul(t2);
|
|
dny = dny.redIAdd(dny).redISub(jyd4);
|
|
var nz = jyd.redMul(jz);
|
|
if (i + 1 < pow)
|
|
jz4 = jz4.redMul(jyd4);
|
|
jx = nx;
|
|
jz = nz;
|
|
jyd = dny;
|
|
}
|
|
return this.curve.jpoint(jx, jyd.redMul(tinv), jz);
|
|
};
|
|
JPoint.prototype.dbl = function dbl() {
|
|
if (this.isInfinity())
|
|
return this;
|
|
if (this.curve.zeroA)
|
|
return this._zeroDbl();
|
|
else if (this.curve.threeA)
|
|
return this._threeDbl();
|
|
else
|
|
return this._dbl();
|
|
};
|
|
JPoint.prototype._zeroDbl = function _zeroDbl() {
|
|
var nx;
|
|
var ny;
|
|
var nz;
|
|
if (this.zOne) {
|
|
var xx = this.x.redSqr();
|
|
var yy = this.y.redSqr();
|
|
var yyyy = yy.redSqr();
|
|
var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
|
|
s = s.redIAdd(s);
|
|
var m = xx.redAdd(xx).redIAdd(xx);
|
|
var t = m.redSqr().redISub(s).redISub(s);
|
|
var yyyy8 = yyyy.redIAdd(yyyy);
|
|
yyyy8 = yyyy8.redIAdd(yyyy8);
|
|
yyyy8 = yyyy8.redIAdd(yyyy8);
|
|
nx = t;
|
|
ny = m.redMul(s.redISub(t)).redISub(yyyy8);
|
|
nz = this.y.redAdd(this.y);
|
|
} else {
|
|
var a = this.x.redSqr();
|
|
var b = this.y.redSqr();
|
|
var c = b.redSqr();
|
|
var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);
|
|
d = d.redIAdd(d);
|
|
var e = a.redAdd(a).redIAdd(a);
|
|
var f = e.redSqr();
|
|
var c8 = c.redIAdd(c);
|
|
c8 = c8.redIAdd(c8);
|
|
c8 = c8.redIAdd(c8);
|
|
nx = f.redISub(d).redISub(d);
|
|
ny = e.redMul(d.redISub(nx)).redISub(c8);
|
|
nz = this.y.redMul(this.z);
|
|
nz = nz.redIAdd(nz);
|
|
}
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
JPoint.prototype._threeDbl = function _threeDbl() {
|
|
var nx;
|
|
var ny;
|
|
var nz;
|
|
if (this.zOne) {
|
|
var xx = this.x.redSqr();
|
|
var yy = this.y.redSqr();
|
|
var yyyy = yy.redSqr();
|
|
var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
|
|
s = s.redIAdd(s);
|
|
var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);
|
|
var t = m.redSqr().redISub(s).redISub(s);
|
|
nx = t;
|
|
var yyyy8 = yyyy.redIAdd(yyyy);
|
|
yyyy8 = yyyy8.redIAdd(yyyy8);
|
|
yyyy8 = yyyy8.redIAdd(yyyy8);
|
|
ny = m.redMul(s.redISub(t)).redISub(yyyy8);
|
|
nz = this.y.redAdd(this.y);
|
|
} else {
|
|
var delta = this.z.redSqr();
|
|
var gamma = this.y.redSqr();
|
|
var beta = this.x.redMul(gamma);
|
|
var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));
|
|
alpha = alpha.redAdd(alpha).redIAdd(alpha);
|
|
var beta4 = beta.redIAdd(beta);
|
|
beta4 = beta4.redIAdd(beta4);
|
|
var beta8 = beta4.redAdd(beta4);
|
|
nx = alpha.redSqr().redISub(beta8);
|
|
nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);
|
|
var ggamma8 = gamma.redSqr();
|
|
ggamma8 = ggamma8.redIAdd(ggamma8);
|
|
ggamma8 = ggamma8.redIAdd(ggamma8);
|
|
ggamma8 = ggamma8.redIAdd(ggamma8);
|
|
ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);
|
|
}
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
JPoint.prototype._dbl = function _dbl() {
|
|
var a = this.curve.a;
|
|
var jx = this.x;
|
|
var jy = this.y;
|
|
var jz = this.z;
|
|
var jz4 = jz.redSqr().redSqr();
|
|
var jx2 = jx.redSqr();
|
|
var jy2 = jy.redSqr();
|
|
var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
|
|
var jxd4 = jx.redAdd(jx);
|
|
jxd4 = jxd4.redIAdd(jxd4);
|
|
var t1 = jxd4.redMul(jy2);
|
|
var nx = c.redSqr().redISub(t1.redAdd(t1));
|
|
var t2 = t1.redISub(nx);
|
|
var jyd8 = jy2.redSqr();
|
|
jyd8 = jyd8.redIAdd(jyd8);
|
|
jyd8 = jyd8.redIAdd(jyd8);
|
|
jyd8 = jyd8.redIAdd(jyd8);
|
|
var ny = c.redMul(t2).redISub(jyd8);
|
|
var nz = jy.redAdd(jy).redMul(jz);
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
JPoint.prototype.trpl = function trpl() {
|
|
if (!this.curve.zeroA)
|
|
return this.dbl().add(this);
|
|
var xx = this.x.redSqr();
|
|
var yy = this.y.redSqr();
|
|
var zz = this.z.redSqr();
|
|
var yyyy = yy.redSqr();
|
|
var m = xx.redAdd(xx).redIAdd(xx);
|
|
var mm = m.redSqr();
|
|
var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
|
|
e = e.redIAdd(e);
|
|
e = e.redAdd(e).redIAdd(e);
|
|
e = e.redISub(mm);
|
|
var ee = e.redSqr();
|
|
var t = yyyy.redIAdd(yyyy);
|
|
t = t.redIAdd(t);
|
|
t = t.redIAdd(t);
|
|
t = t.redIAdd(t);
|
|
var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);
|
|
var yyu4 = yy.redMul(u);
|
|
yyu4 = yyu4.redIAdd(yyu4);
|
|
yyu4 = yyu4.redIAdd(yyu4);
|
|
var nx = this.x.redMul(ee).redISub(yyu4);
|
|
nx = nx.redIAdd(nx);
|
|
nx = nx.redIAdd(nx);
|
|
var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));
|
|
ny = ny.redIAdd(ny);
|
|
ny = ny.redIAdd(ny);
|
|
ny = ny.redIAdd(ny);
|
|
var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
JPoint.prototype.mul = function mul(k, kbase) {
|
|
k = new BN(k, kbase);
|
|
return this.curve._wnafMul(this, k);
|
|
};
|
|
JPoint.prototype.eq = function eq(p) {
|
|
if (p.type === "affine")
|
|
return this.eq(p.toJ());
|
|
if (this === p)
|
|
return true;
|
|
var z2 = this.z.redSqr();
|
|
var pz2 = p.z.redSqr();
|
|
if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)
|
|
return false;
|
|
var z3 = z2.redMul(this.z);
|
|
var pz3 = pz2.redMul(p.z);
|
|
return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;
|
|
};
|
|
JPoint.prototype.eqXToP = function eqXToP(x) {
|
|
var zs = this.z.redSqr();
|
|
var rx = x.toRed(this.curve.red).redMul(zs);
|
|
if (this.x.cmp(rx) === 0)
|
|
return true;
|
|
var xc = x.clone();
|
|
var t = this.curve.redN.redMul(zs);
|
|
for (;; ) {
|
|
xc.iadd(this.curve.n);
|
|
if (xc.cmp(this.curve.p) >= 0)
|
|
return false;
|
|
rx.redIAdd(t);
|
|
if (this.x.cmp(rx) === 0)
|
|
return true;
|
|
}
|
|
};
|
|
JPoint.prototype.inspect = function inspect() {
|
|
if (this.isInfinity())
|
|
return "<EC JPoint Infinity>";
|
|
return "<EC JPoint x: " + this.x.toString(16, 2) + " y: " + this.y.toString(16, 2) + " z: " + this.z.toString(16, 2) + ">";
|
|
};
|
|
JPoint.prototype.isInfinity = function isInfinity() {
|
|
return this.z.cmpn(0) === 0;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/curve/mont.js
|
|
var require_mont = __commonJS((exports, module) => {
|
|
var BN = require_bn();
|
|
var inherits = require_inherits();
|
|
var Base = require_base2();
|
|
var utils = require_utils2();
|
|
function MontCurve(conf) {
|
|
Base.call(this, "mont", conf);
|
|
this.a = new BN(conf.a, 16).toRed(this.red);
|
|
this.b = new BN(conf.b, 16).toRed(this.red);
|
|
this.i4 = new BN(4).toRed(this.red).redInvm();
|
|
this.two = new BN(2).toRed(this.red);
|
|
this.a24 = this.i4.redMul(this.a.redAdd(this.two));
|
|
}
|
|
inherits(MontCurve, Base);
|
|
module.exports = MontCurve;
|
|
MontCurve.prototype.validate = function validate(point) {
|
|
var x = point.normalize().x;
|
|
var x2 = x.redSqr();
|
|
var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);
|
|
var y = rhs.redSqrt();
|
|
return y.redSqr().cmp(rhs) === 0;
|
|
};
|
|
function Point(curve, x, z) {
|
|
Base.BasePoint.call(this, curve, "projective");
|
|
if (x === null && z === null) {
|
|
this.x = this.curve.one;
|
|
this.z = this.curve.zero;
|
|
} else {
|
|
this.x = new BN(x, 16);
|
|
this.z = new BN(z, 16);
|
|
if (!this.x.red)
|
|
this.x = this.x.toRed(this.curve.red);
|
|
if (!this.z.red)
|
|
this.z = this.z.toRed(this.curve.red);
|
|
}
|
|
}
|
|
inherits(Point, Base.BasePoint);
|
|
MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
|
|
return this.point(utils.toArray(bytes, enc), 1);
|
|
};
|
|
MontCurve.prototype.point = function point(x, z) {
|
|
return new Point(this, x, z);
|
|
};
|
|
MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
|
|
return Point.fromJSON(this, obj);
|
|
};
|
|
Point.prototype.precompute = function precompute() {};
|
|
Point.prototype._encode = function _encode() {
|
|
return this.getX().toArray("be", this.curve.p.byteLength());
|
|
};
|
|
Point.fromJSON = function fromJSON(curve, obj) {
|
|
return new Point(curve, obj[0], obj[1] || curve.one);
|
|
};
|
|
Point.prototype.inspect = function inspect() {
|
|
if (this.isInfinity())
|
|
return "<EC Point Infinity>";
|
|
return "<EC Point x: " + this.x.fromRed().toString(16, 2) + " z: " + this.z.fromRed().toString(16, 2) + ">";
|
|
};
|
|
Point.prototype.isInfinity = function isInfinity() {
|
|
return this.z.cmpn(0) === 0;
|
|
};
|
|
Point.prototype.dbl = function dbl() {
|
|
var a = this.x.redAdd(this.z);
|
|
var aa = a.redSqr();
|
|
var b = this.x.redSub(this.z);
|
|
var bb = b.redSqr();
|
|
var c = aa.redSub(bb);
|
|
var nx = aa.redMul(bb);
|
|
var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));
|
|
return this.curve.point(nx, nz);
|
|
};
|
|
Point.prototype.add = function add() {
|
|
throw new Error("Not supported on Montgomery curve");
|
|
};
|
|
Point.prototype.diffAdd = function diffAdd(p, diff) {
|
|
var a = this.x.redAdd(this.z);
|
|
var b = this.x.redSub(this.z);
|
|
var c = p.x.redAdd(p.z);
|
|
var d = p.x.redSub(p.z);
|
|
var da = d.redMul(a);
|
|
var cb = c.redMul(b);
|
|
var nx = diff.z.redMul(da.redAdd(cb).redSqr());
|
|
var nz = diff.x.redMul(da.redISub(cb).redSqr());
|
|
return this.curve.point(nx, nz);
|
|
};
|
|
Point.prototype.mul = function mul(k) {
|
|
var t = k.clone();
|
|
var a = this;
|
|
var b = this.curve.point(null, null);
|
|
var c = this;
|
|
for (var bits = [];t.cmpn(0) !== 0; t.iushrn(1))
|
|
bits.push(t.andln(1));
|
|
for (var i = bits.length - 1;i >= 0; i--) {
|
|
if (bits[i] === 0) {
|
|
a = a.diffAdd(b, c);
|
|
b = b.dbl();
|
|
} else {
|
|
b = a.diffAdd(b, c);
|
|
a = a.dbl();
|
|
}
|
|
}
|
|
return b;
|
|
};
|
|
Point.prototype.mulAdd = function mulAdd() {
|
|
throw new Error("Not supported on Montgomery curve");
|
|
};
|
|
Point.prototype.jumlAdd = function jumlAdd() {
|
|
throw new Error("Not supported on Montgomery curve");
|
|
};
|
|
Point.prototype.eq = function eq(other) {
|
|
return this.getX().cmp(other.getX()) === 0;
|
|
};
|
|
Point.prototype.normalize = function normalize() {
|
|
this.x = this.x.redMul(this.z.redInvm());
|
|
this.z = this.curve.one;
|
|
return this;
|
|
};
|
|
Point.prototype.getX = function getX() {
|
|
this.normalize();
|
|
return this.x.fromRed();
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/curve/edwards.js
|
|
var require_edwards = __commonJS((exports, module) => {
|
|
var utils = require_utils2();
|
|
var BN = require_bn();
|
|
var inherits = require_inherits();
|
|
var Base = require_base2();
|
|
var assert = utils.assert;
|
|
function EdwardsCurve(conf) {
|
|
this.twisted = (conf.a | 0) !== 1;
|
|
this.mOneA = this.twisted && (conf.a | 0) === -1;
|
|
this.extended = this.mOneA;
|
|
Base.call(this, "edwards", conf);
|
|
this.a = new BN(conf.a, 16).umod(this.red.m);
|
|
this.a = this.a.toRed(this.red);
|
|
this.c = new BN(conf.c, 16).toRed(this.red);
|
|
this.c2 = this.c.redSqr();
|
|
this.d = new BN(conf.d, 16).toRed(this.red);
|
|
this.dd = this.d.redAdd(this.d);
|
|
assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);
|
|
this.oneC = (conf.c | 0) === 1;
|
|
}
|
|
inherits(EdwardsCurve, Base);
|
|
module.exports = EdwardsCurve;
|
|
EdwardsCurve.prototype._mulA = function _mulA(num) {
|
|
if (this.mOneA)
|
|
return num.redNeg();
|
|
else
|
|
return this.a.redMul(num);
|
|
};
|
|
EdwardsCurve.prototype._mulC = function _mulC(num) {
|
|
if (this.oneC)
|
|
return num;
|
|
else
|
|
return this.c.redMul(num);
|
|
};
|
|
EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {
|
|
return this.point(x, y, z, t);
|
|
};
|
|
EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {
|
|
x = new BN(x, 16);
|
|
if (!x.red)
|
|
x = x.toRed(this.red);
|
|
var x2 = x.redSqr();
|
|
var rhs = this.c2.redSub(this.a.redMul(x2));
|
|
var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));
|
|
var y2 = rhs.redMul(lhs.redInvm());
|
|
var y = y2.redSqrt();
|
|
if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
|
|
throw new Error("invalid point");
|
|
var isOdd = y.fromRed().isOdd();
|
|
if (odd && !isOdd || !odd && isOdd)
|
|
y = y.redNeg();
|
|
return this.point(x, y);
|
|
};
|
|
EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {
|
|
y = new BN(y, 16);
|
|
if (!y.red)
|
|
y = y.toRed(this.red);
|
|
var y2 = y.redSqr();
|
|
var lhs = y2.redSub(this.c2);
|
|
var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);
|
|
var x2 = lhs.redMul(rhs.redInvm());
|
|
if (x2.cmp(this.zero) === 0) {
|
|
if (odd)
|
|
throw new Error("invalid point");
|
|
else
|
|
return this.point(this.zero, y);
|
|
}
|
|
var x = x2.redSqrt();
|
|
if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)
|
|
throw new Error("invalid point");
|
|
if (x.fromRed().isOdd() !== odd)
|
|
x = x.redNeg();
|
|
return this.point(x, y);
|
|
};
|
|
EdwardsCurve.prototype.validate = function validate(point) {
|
|
if (point.isInfinity())
|
|
return true;
|
|
point.normalize();
|
|
var x2 = point.x.redSqr();
|
|
var y2 = point.y.redSqr();
|
|
var lhs = x2.redMul(this.a).redAdd(y2);
|
|
var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));
|
|
return lhs.cmp(rhs) === 0;
|
|
};
|
|
function Point(curve, x, y, z, t) {
|
|
Base.BasePoint.call(this, curve, "projective");
|
|
if (x === null && y === null && z === null) {
|
|
this.x = this.curve.zero;
|
|
this.y = this.curve.one;
|
|
this.z = this.curve.one;
|
|
this.t = this.curve.zero;
|
|
this.zOne = true;
|
|
} else {
|
|
this.x = new BN(x, 16);
|
|
this.y = new BN(y, 16);
|
|
this.z = z ? new BN(z, 16) : this.curve.one;
|
|
this.t = t && new BN(t, 16);
|
|
if (!this.x.red)
|
|
this.x = this.x.toRed(this.curve.red);
|
|
if (!this.y.red)
|
|
this.y = this.y.toRed(this.curve.red);
|
|
if (!this.z.red)
|
|
this.z = this.z.toRed(this.curve.red);
|
|
if (this.t && !this.t.red)
|
|
this.t = this.t.toRed(this.curve.red);
|
|
this.zOne = this.z === this.curve.one;
|
|
if (this.curve.extended && !this.t) {
|
|
this.t = this.x.redMul(this.y);
|
|
if (!this.zOne)
|
|
this.t = this.t.redMul(this.z.redInvm());
|
|
}
|
|
}
|
|
}
|
|
inherits(Point, Base.BasePoint);
|
|
EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
|
|
return Point.fromJSON(this, obj);
|
|
};
|
|
EdwardsCurve.prototype.point = function point(x, y, z, t) {
|
|
return new Point(this, x, y, z, t);
|
|
};
|
|
Point.fromJSON = function fromJSON(curve, obj) {
|
|
return new Point(curve, obj[0], obj[1], obj[2]);
|
|
};
|
|
Point.prototype.inspect = function inspect() {
|
|
if (this.isInfinity())
|
|
return "<EC Point Infinity>";
|
|
return "<EC Point x: " + this.x.fromRed().toString(16, 2) + " y: " + this.y.fromRed().toString(16, 2) + " z: " + this.z.fromRed().toString(16, 2) + ">";
|
|
};
|
|
Point.prototype.isInfinity = function isInfinity() {
|
|
return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || this.zOne && this.y.cmp(this.curve.c) === 0);
|
|
};
|
|
Point.prototype._extDbl = function _extDbl() {
|
|
var a = this.x.redSqr();
|
|
var b = this.y.redSqr();
|
|
var c = this.z.redSqr();
|
|
c = c.redIAdd(c);
|
|
var d = this.curve._mulA(a);
|
|
var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);
|
|
var g = d.redAdd(b);
|
|
var f = g.redSub(c);
|
|
var h = d.redSub(b);
|
|
var nx = e.redMul(f);
|
|
var ny = g.redMul(h);
|
|
var nt = e.redMul(h);
|
|
var nz = f.redMul(g);
|
|
return this.curve.point(nx, ny, nz, nt);
|
|
};
|
|
Point.prototype._projDbl = function _projDbl() {
|
|
var b = this.x.redAdd(this.y).redSqr();
|
|
var c = this.x.redSqr();
|
|
var d = this.y.redSqr();
|
|
var nx;
|
|
var ny;
|
|
var nz;
|
|
var e;
|
|
var h;
|
|
var j;
|
|
if (this.curve.twisted) {
|
|
e = this.curve._mulA(c);
|
|
var f = e.redAdd(d);
|
|
if (this.zOne) {
|
|
nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));
|
|
ny = f.redMul(e.redSub(d));
|
|
nz = f.redSqr().redSub(f).redSub(f);
|
|
} else {
|
|
h = this.z.redSqr();
|
|
j = f.redSub(h).redISub(h);
|
|
nx = b.redSub(c).redISub(d).redMul(j);
|
|
ny = f.redMul(e.redSub(d));
|
|
nz = f.redMul(j);
|
|
}
|
|
} else {
|
|
e = c.redAdd(d);
|
|
h = this.curve._mulC(this.z).redSqr();
|
|
j = e.redSub(h).redSub(h);
|
|
nx = this.curve._mulC(b.redISub(e)).redMul(j);
|
|
ny = this.curve._mulC(e).redMul(c.redISub(d));
|
|
nz = e.redMul(j);
|
|
}
|
|
return this.curve.point(nx, ny, nz);
|
|
};
|
|
Point.prototype.dbl = function dbl() {
|
|
if (this.isInfinity())
|
|
return this;
|
|
if (this.curve.extended)
|
|
return this._extDbl();
|
|
else
|
|
return this._projDbl();
|
|
};
|
|
Point.prototype._extAdd = function _extAdd(p) {
|
|
var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));
|
|
var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));
|
|
var c = this.t.redMul(this.curve.dd).redMul(p.t);
|
|
var d = this.z.redMul(p.z.redAdd(p.z));
|
|
var e = b.redSub(a);
|
|
var f = d.redSub(c);
|
|
var g = d.redAdd(c);
|
|
var h = b.redAdd(a);
|
|
var nx = e.redMul(f);
|
|
var ny = g.redMul(h);
|
|
var nt = e.redMul(h);
|
|
var nz = f.redMul(g);
|
|
return this.curve.point(nx, ny, nz, nt);
|
|
};
|
|
Point.prototype._projAdd = function _projAdd(p) {
|
|
var a = this.z.redMul(p.z);
|
|
var b = a.redSqr();
|
|
var c = this.x.redMul(p.x);
|
|
var d = this.y.redMul(p.y);
|
|
var e = this.curve.d.redMul(c).redMul(d);
|
|
var f = b.redSub(e);
|
|
var g = b.redAdd(e);
|
|
var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);
|
|
var nx = a.redMul(f).redMul(tmp);
|
|
var ny;
|
|
var nz;
|
|
if (this.curve.twisted) {
|
|
ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));
|
|
nz = f.redMul(g);
|
|
} else {
|
|
ny = a.redMul(g).redMul(d.redSub(c));
|
|
nz = this.curve._mulC(f).redMul(g);
|
|
}
|
|
return this.curve.point(nx, ny, nz);
|
|
};
|
|
Point.prototype.add = function add(p) {
|
|
if (this.isInfinity())
|
|
return p;
|
|
if (p.isInfinity())
|
|
return this;
|
|
if (this.curve.extended)
|
|
return this._extAdd(p);
|
|
else
|
|
return this._projAdd(p);
|
|
};
|
|
Point.prototype.mul = function mul(k) {
|
|
if (this._hasDoubles(k))
|
|
return this.curve._fixedNafMul(this, k);
|
|
else
|
|
return this.curve._wnafMul(this, k);
|
|
};
|
|
Point.prototype.mulAdd = function mulAdd(k1, p, k2) {
|
|
return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, false);
|
|
};
|
|
Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) {
|
|
return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, true);
|
|
};
|
|
Point.prototype.normalize = function normalize() {
|
|
if (this.zOne)
|
|
return this;
|
|
var zi = this.z.redInvm();
|
|
this.x = this.x.redMul(zi);
|
|
this.y = this.y.redMul(zi);
|
|
if (this.t)
|
|
this.t = this.t.redMul(zi);
|
|
this.z = this.curve.one;
|
|
this.zOne = true;
|
|
return this;
|
|
};
|
|
Point.prototype.neg = function neg() {
|
|
return this.curve.point(this.x.redNeg(), this.y, this.z, this.t && this.t.redNeg());
|
|
};
|
|
Point.prototype.getX = function getX() {
|
|
this.normalize();
|
|
return this.x.fromRed();
|
|
};
|
|
Point.prototype.getY = function getY() {
|
|
this.normalize();
|
|
return this.y.fromRed();
|
|
};
|
|
Point.prototype.eq = function eq(other) {
|
|
return this === other || this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0;
|
|
};
|
|
Point.prototype.eqXToP = function eqXToP(x) {
|
|
var rx = x.toRed(this.curve.red).redMul(this.z);
|
|
if (this.x.cmp(rx) === 0)
|
|
return true;
|
|
var xc = x.clone();
|
|
var t = this.curve.redN.redMul(this.z);
|
|
for (;; ) {
|
|
xc.iadd(this.curve.n);
|
|
if (xc.cmp(this.curve.p) >= 0)
|
|
return false;
|
|
rx.redIAdd(t);
|
|
if (this.x.cmp(rx) === 0)
|
|
return true;
|
|
}
|
|
};
|
|
Point.prototype.toP = Point.prototype.normalize;
|
|
Point.prototype.mixedAdd = Point.prototype.add;
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/curve/index.js
|
|
var require_curve = __commonJS((exports) => {
|
|
var curve = exports;
|
|
curve.base = require_base2();
|
|
curve.short = require_short();
|
|
curve.mont = require_mont();
|
|
curve.edwards = require_edwards();
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/utils.js
|
|
var require_utils3 = __commonJS((exports) => {
|
|
var assert = require_minimalistic_assert();
|
|
var inherits = require_inherits();
|
|
exports.inherits = inherits;
|
|
function isSurrogatePair(msg, i) {
|
|
if ((msg.charCodeAt(i) & 64512) !== 55296) {
|
|
return false;
|
|
}
|
|
if (i < 0 || i + 1 >= msg.length) {
|
|
return false;
|
|
}
|
|
return (msg.charCodeAt(i + 1) & 64512) === 56320;
|
|
}
|
|
function toArray(msg, enc) {
|
|
if (Array.isArray(msg))
|
|
return msg.slice();
|
|
if (!msg)
|
|
return [];
|
|
var res = [];
|
|
if (typeof msg === "string") {
|
|
if (!enc) {
|
|
var p = 0;
|
|
for (var i = 0;i < msg.length; i++) {
|
|
var c = msg.charCodeAt(i);
|
|
if (c < 128) {
|
|
res[p++] = c;
|
|
} else if (c < 2048) {
|
|
res[p++] = c >> 6 | 192;
|
|
res[p++] = c & 63 | 128;
|
|
} else if (isSurrogatePair(msg, i)) {
|
|
c = 65536 + ((c & 1023) << 10) + (msg.charCodeAt(++i) & 1023);
|
|
res[p++] = c >> 18 | 240;
|
|
res[p++] = c >> 12 & 63 | 128;
|
|
res[p++] = c >> 6 & 63 | 128;
|
|
res[p++] = c & 63 | 128;
|
|
} else {
|
|
res[p++] = c >> 12 | 224;
|
|
res[p++] = c >> 6 & 63 | 128;
|
|
res[p++] = c & 63 | 128;
|
|
}
|
|
}
|
|
} else if (enc === "hex") {
|
|
msg = msg.replace(/[^a-z0-9]+/ig, "");
|
|
if (msg.length % 2 !== 0)
|
|
msg = "0" + msg;
|
|
for (i = 0;i < msg.length; i += 2)
|
|
res.push(parseInt(msg[i] + msg[i + 1], 16));
|
|
}
|
|
} else {
|
|
for (i = 0;i < msg.length; i++)
|
|
res[i] = msg[i] | 0;
|
|
}
|
|
return res;
|
|
}
|
|
exports.toArray = toArray;
|
|
function toHex(msg) {
|
|
var res = "";
|
|
for (var i = 0;i < msg.length; i++)
|
|
res += zero2(msg[i].toString(16));
|
|
return res;
|
|
}
|
|
exports.toHex = toHex;
|
|
function htonl(w) {
|
|
var res = w >>> 24 | w >>> 8 & 65280 | w << 8 & 16711680 | (w & 255) << 24;
|
|
return res >>> 0;
|
|
}
|
|
exports.htonl = htonl;
|
|
function toHex32(msg, endian) {
|
|
var res = "";
|
|
for (var i = 0;i < msg.length; i++) {
|
|
var w = msg[i];
|
|
if (endian === "little")
|
|
w = htonl(w);
|
|
res += zero8(w.toString(16));
|
|
}
|
|
return res;
|
|
}
|
|
exports.toHex32 = toHex32;
|
|
function zero2(word) {
|
|
if (word.length === 1)
|
|
return "0" + word;
|
|
else
|
|
return word;
|
|
}
|
|
exports.zero2 = zero2;
|
|
function zero8(word) {
|
|
if (word.length === 7)
|
|
return "0" + word;
|
|
else if (word.length === 6)
|
|
return "00" + word;
|
|
else if (word.length === 5)
|
|
return "000" + word;
|
|
else if (word.length === 4)
|
|
return "0000" + word;
|
|
else if (word.length === 3)
|
|
return "00000" + word;
|
|
else if (word.length === 2)
|
|
return "000000" + word;
|
|
else if (word.length === 1)
|
|
return "0000000" + word;
|
|
else
|
|
return word;
|
|
}
|
|
exports.zero8 = zero8;
|
|
function join32(msg, start, end, endian) {
|
|
var len = end - start;
|
|
assert(len % 4 === 0);
|
|
var res = new Array(len / 4);
|
|
for (var i = 0, k = start;i < res.length; i++, k += 4) {
|
|
var w;
|
|
if (endian === "big")
|
|
w = msg[k] << 24 | msg[k + 1] << 16 | msg[k + 2] << 8 | msg[k + 3];
|
|
else
|
|
w = msg[k + 3] << 24 | msg[k + 2] << 16 | msg[k + 1] << 8 | msg[k];
|
|
res[i] = w >>> 0;
|
|
}
|
|
return res;
|
|
}
|
|
exports.join32 = join32;
|
|
function split32(msg, endian) {
|
|
var res = new Array(msg.length * 4);
|
|
for (var i = 0, k = 0;i < msg.length; i++, k += 4) {
|
|
var m = msg[i];
|
|
if (endian === "big") {
|
|
res[k] = m >>> 24;
|
|
res[k + 1] = m >>> 16 & 255;
|
|
res[k + 2] = m >>> 8 & 255;
|
|
res[k + 3] = m & 255;
|
|
} else {
|
|
res[k + 3] = m >>> 24;
|
|
res[k + 2] = m >>> 16 & 255;
|
|
res[k + 1] = m >>> 8 & 255;
|
|
res[k] = m & 255;
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
exports.split32 = split32;
|
|
function rotr32(w, b) {
|
|
return w >>> b | w << 32 - b;
|
|
}
|
|
exports.rotr32 = rotr32;
|
|
function rotl32(w, b) {
|
|
return w << b | w >>> 32 - b;
|
|
}
|
|
exports.rotl32 = rotl32;
|
|
function sum32(a, b) {
|
|
return a + b >>> 0;
|
|
}
|
|
exports.sum32 = sum32;
|
|
function sum32_3(a, b, c) {
|
|
return a + b + c >>> 0;
|
|
}
|
|
exports.sum32_3 = sum32_3;
|
|
function sum32_4(a, b, c, d) {
|
|
return a + b + c + d >>> 0;
|
|
}
|
|
exports.sum32_4 = sum32_4;
|
|
function sum32_5(a, b, c, d, e) {
|
|
return a + b + c + d + e >>> 0;
|
|
}
|
|
exports.sum32_5 = sum32_5;
|
|
function sum64(buf, pos, ah, al) {
|
|
var bh = buf[pos];
|
|
var bl = buf[pos + 1];
|
|
var lo = al + bl >>> 0;
|
|
var hi = (lo < al ? 1 : 0) + ah + bh;
|
|
buf[pos] = hi >>> 0;
|
|
buf[pos + 1] = lo;
|
|
}
|
|
exports.sum64 = sum64;
|
|
function sum64_hi(ah, al, bh, bl) {
|
|
var lo = al + bl >>> 0;
|
|
var hi = (lo < al ? 1 : 0) + ah + bh;
|
|
return hi >>> 0;
|
|
}
|
|
exports.sum64_hi = sum64_hi;
|
|
function sum64_lo(ah, al, bh, bl) {
|
|
var lo = al + bl;
|
|
return lo >>> 0;
|
|
}
|
|
exports.sum64_lo = sum64_lo;
|
|
function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {
|
|
var carry = 0;
|
|
var lo = al;
|
|
lo = lo + bl >>> 0;
|
|
carry += lo < al ? 1 : 0;
|
|
lo = lo + cl >>> 0;
|
|
carry += lo < cl ? 1 : 0;
|
|
lo = lo + dl >>> 0;
|
|
carry += lo < dl ? 1 : 0;
|
|
var hi = ah + bh + ch + dh + carry;
|
|
return hi >>> 0;
|
|
}
|
|
exports.sum64_4_hi = sum64_4_hi;
|
|
function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {
|
|
var lo = al + bl + cl + dl;
|
|
return lo >>> 0;
|
|
}
|
|
exports.sum64_4_lo = sum64_4_lo;
|
|
function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
|
|
var carry = 0;
|
|
var lo = al;
|
|
lo = lo + bl >>> 0;
|
|
carry += lo < al ? 1 : 0;
|
|
lo = lo + cl >>> 0;
|
|
carry += lo < cl ? 1 : 0;
|
|
lo = lo + dl >>> 0;
|
|
carry += lo < dl ? 1 : 0;
|
|
lo = lo + el >>> 0;
|
|
carry += lo < el ? 1 : 0;
|
|
var hi = ah + bh + ch + dh + eh + carry;
|
|
return hi >>> 0;
|
|
}
|
|
exports.sum64_5_hi = sum64_5_hi;
|
|
function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
|
|
var lo = al + bl + cl + dl + el;
|
|
return lo >>> 0;
|
|
}
|
|
exports.sum64_5_lo = sum64_5_lo;
|
|
function rotr64_hi(ah, al, num) {
|
|
var r = al << 32 - num | ah >>> num;
|
|
return r >>> 0;
|
|
}
|
|
exports.rotr64_hi = rotr64_hi;
|
|
function rotr64_lo(ah, al, num) {
|
|
var r = ah << 32 - num | al >>> num;
|
|
return r >>> 0;
|
|
}
|
|
exports.rotr64_lo = rotr64_lo;
|
|
function shr64_hi(ah, al, num) {
|
|
return ah >>> num;
|
|
}
|
|
exports.shr64_hi = shr64_hi;
|
|
function shr64_lo(ah, al, num) {
|
|
var r = ah << 32 - num | al >>> num;
|
|
return r >>> 0;
|
|
}
|
|
exports.shr64_lo = shr64_lo;
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/common.js
|
|
var require_common = __commonJS((exports) => {
|
|
var utils = require_utils3();
|
|
var assert = require_minimalistic_assert();
|
|
function BlockHash() {
|
|
this.pending = null;
|
|
this.pendingTotal = 0;
|
|
this.blockSize = this.constructor.blockSize;
|
|
this.outSize = this.constructor.outSize;
|
|
this.hmacStrength = this.constructor.hmacStrength;
|
|
this.padLength = this.constructor.padLength / 8;
|
|
this.endian = "big";
|
|
this._delta8 = this.blockSize / 8;
|
|
this._delta32 = this.blockSize / 32;
|
|
}
|
|
exports.BlockHash = BlockHash;
|
|
BlockHash.prototype.update = function update(msg, enc) {
|
|
msg = utils.toArray(msg, enc);
|
|
if (!this.pending)
|
|
this.pending = msg;
|
|
else
|
|
this.pending = this.pending.concat(msg);
|
|
this.pendingTotal += msg.length;
|
|
if (this.pending.length >= this._delta8) {
|
|
msg = this.pending;
|
|
var r = msg.length % this._delta8;
|
|
this.pending = msg.slice(msg.length - r, msg.length);
|
|
if (this.pending.length === 0)
|
|
this.pending = null;
|
|
msg = utils.join32(msg, 0, msg.length - r, this.endian);
|
|
for (var i = 0;i < msg.length; i += this._delta32)
|
|
this._update(msg, i, i + this._delta32);
|
|
}
|
|
return this;
|
|
};
|
|
BlockHash.prototype.digest = function digest(enc) {
|
|
this.update(this._pad());
|
|
assert(this.pending === null);
|
|
return this._digest(enc);
|
|
};
|
|
BlockHash.prototype._pad = function pad() {
|
|
var len = this.pendingTotal;
|
|
var bytes = this._delta8;
|
|
var k = bytes - (len + this.padLength) % bytes;
|
|
var res = new Array(k + this.padLength);
|
|
res[0] = 128;
|
|
for (var i = 1;i < k; i++)
|
|
res[i] = 0;
|
|
len <<= 3;
|
|
if (this.endian === "big") {
|
|
for (var t = 8;t < this.padLength; t++)
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = len >>> 24 & 255;
|
|
res[i++] = len >>> 16 & 255;
|
|
res[i++] = len >>> 8 & 255;
|
|
res[i++] = len & 255;
|
|
} else {
|
|
res[i++] = len & 255;
|
|
res[i++] = len >>> 8 & 255;
|
|
res[i++] = len >>> 16 & 255;
|
|
res[i++] = len >>> 24 & 255;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
for (t = 8;t < this.padLength; t++)
|
|
res[i++] = 0;
|
|
}
|
|
return res;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/sha/common.js
|
|
var require_common2 = __commonJS((exports) => {
|
|
var utils = require_utils3();
|
|
var rotr32 = utils.rotr32;
|
|
function ft_1(s, x, y, z) {
|
|
if (s === 0)
|
|
return ch32(x, y, z);
|
|
if (s === 1 || s === 3)
|
|
return p32(x, y, z);
|
|
if (s === 2)
|
|
return maj32(x, y, z);
|
|
}
|
|
exports.ft_1 = ft_1;
|
|
function ch32(x, y, z) {
|
|
return x & y ^ ~x & z;
|
|
}
|
|
exports.ch32 = ch32;
|
|
function maj32(x, y, z) {
|
|
return x & y ^ x & z ^ y & z;
|
|
}
|
|
exports.maj32 = maj32;
|
|
function p32(x, y, z) {
|
|
return x ^ y ^ z;
|
|
}
|
|
exports.p32 = p32;
|
|
function s0_256(x) {
|
|
return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);
|
|
}
|
|
exports.s0_256 = s0_256;
|
|
function s1_256(x) {
|
|
return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);
|
|
}
|
|
exports.s1_256 = s1_256;
|
|
function g0_256(x) {
|
|
return rotr32(x, 7) ^ rotr32(x, 18) ^ x >>> 3;
|
|
}
|
|
exports.g0_256 = g0_256;
|
|
function g1_256(x) {
|
|
return rotr32(x, 17) ^ rotr32(x, 19) ^ x >>> 10;
|
|
}
|
|
exports.g1_256 = g1_256;
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/sha/1.js
|
|
var require_1 = __commonJS((exports, module) => {
|
|
var utils = require_utils3();
|
|
var common = require_common();
|
|
var shaCommon = require_common2();
|
|
var rotl32 = utils.rotl32;
|
|
var sum32 = utils.sum32;
|
|
var sum32_5 = utils.sum32_5;
|
|
var ft_1 = shaCommon.ft_1;
|
|
var BlockHash = common.BlockHash;
|
|
var sha1_K = [
|
|
1518500249,
|
|
1859775393,
|
|
2400959708,
|
|
3395469782
|
|
];
|
|
function SHA1() {
|
|
if (!(this instanceof SHA1))
|
|
return new SHA1;
|
|
BlockHash.call(this);
|
|
this.h = [
|
|
1732584193,
|
|
4023233417,
|
|
2562383102,
|
|
271733878,
|
|
3285377520
|
|
];
|
|
this.W = new Array(80);
|
|
}
|
|
utils.inherits(SHA1, BlockHash);
|
|
module.exports = SHA1;
|
|
SHA1.blockSize = 512;
|
|
SHA1.outSize = 160;
|
|
SHA1.hmacStrength = 80;
|
|
SHA1.padLength = 64;
|
|
SHA1.prototype._update = function _update(msg, start) {
|
|
var W = this.W;
|
|
for (var i = 0;i < 16; i++)
|
|
W[i] = msg[start + i];
|
|
for (;i < W.length; i++)
|
|
W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
|
|
var a = this.h[0];
|
|
var b = this.h[1];
|
|
var c = this.h[2];
|
|
var d = this.h[3];
|
|
var e = this.h[4];
|
|
for (i = 0;i < W.length; i++) {
|
|
var s = ~~(i / 20);
|
|
var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);
|
|
e = d;
|
|
d = c;
|
|
c = rotl32(b, 30);
|
|
b = a;
|
|
a = t;
|
|
}
|
|
this.h[0] = sum32(this.h[0], a);
|
|
this.h[1] = sum32(this.h[1], b);
|
|
this.h[2] = sum32(this.h[2], c);
|
|
this.h[3] = sum32(this.h[3], d);
|
|
this.h[4] = sum32(this.h[4], e);
|
|
};
|
|
SHA1.prototype._digest = function digest(enc) {
|
|
if (enc === "hex")
|
|
return utils.toHex32(this.h, "big");
|
|
else
|
|
return utils.split32(this.h, "big");
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/sha/256.js
|
|
var require_256 = __commonJS((exports, module) => {
|
|
var utils = require_utils3();
|
|
var common = require_common();
|
|
var shaCommon = require_common2();
|
|
var assert = require_minimalistic_assert();
|
|
var sum32 = utils.sum32;
|
|
var sum32_4 = utils.sum32_4;
|
|
var sum32_5 = utils.sum32_5;
|
|
var ch32 = shaCommon.ch32;
|
|
var maj32 = shaCommon.maj32;
|
|
var s0_256 = shaCommon.s0_256;
|
|
var s1_256 = shaCommon.s1_256;
|
|
var g0_256 = shaCommon.g0_256;
|
|
var g1_256 = shaCommon.g1_256;
|
|
var BlockHash = common.BlockHash;
|
|
var sha256_K = [
|
|
1116352408,
|
|
1899447441,
|
|
3049323471,
|
|
3921009573,
|
|
961987163,
|
|
1508970993,
|
|
2453635748,
|
|
2870763221,
|
|
3624381080,
|
|
310598401,
|
|
607225278,
|
|
1426881987,
|
|
1925078388,
|
|
2162078206,
|
|
2614888103,
|
|
3248222580,
|
|
3835390401,
|
|
4022224774,
|
|
264347078,
|
|
604807628,
|
|
770255983,
|
|
1249150122,
|
|
1555081692,
|
|
1996064986,
|
|
2554220882,
|
|
2821834349,
|
|
2952996808,
|
|
3210313671,
|
|
3336571891,
|
|
3584528711,
|
|
113926993,
|
|
338241895,
|
|
666307205,
|
|
773529912,
|
|
1294757372,
|
|
1396182291,
|
|
1695183700,
|
|
1986661051,
|
|
2177026350,
|
|
2456956037,
|
|
2730485921,
|
|
2820302411,
|
|
3259730800,
|
|
3345764771,
|
|
3516065817,
|
|
3600352804,
|
|
4094571909,
|
|
275423344,
|
|
430227734,
|
|
506948616,
|
|
659060556,
|
|
883997877,
|
|
958139571,
|
|
1322822218,
|
|
1537002063,
|
|
1747873779,
|
|
1955562222,
|
|
2024104815,
|
|
2227730452,
|
|
2361852424,
|
|
2428436474,
|
|
2756734187,
|
|
3204031479,
|
|
3329325298
|
|
];
|
|
function SHA256() {
|
|
if (!(this instanceof SHA256))
|
|
return new SHA256;
|
|
BlockHash.call(this);
|
|
this.h = [
|
|
1779033703,
|
|
3144134277,
|
|
1013904242,
|
|
2773480762,
|
|
1359893119,
|
|
2600822924,
|
|
528734635,
|
|
1541459225
|
|
];
|
|
this.k = sha256_K;
|
|
this.W = new Array(64);
|
|
}
|
|
utils.inherits(SHA256, BlockHash);
|
|
module.exports = SHA256;
|
|
SHA256.blockSize = 512;
|
|
SHA256.outSize = 256;
|
|
SHA256.hmacStrength = 192;
|
|
SHA256.padLength = 64;
|
|
SHA256.prototype._update = function _update(msg, start) {
|
|
var W = this.W;
|
|
for (var i = 0;i < 16; i++)
|
|
W[i] = msg[start + i];
|
|
for (;i < W.length; i++)
|
|
W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);
|
|
var a = this.h[0];
|
|
var b = this.h[1];
|
|
var c = this.h[2];
|
|
var d = this.h[3];
|
|
var e = this.h[4];
|
|
var f = this.h[5];
|
|
var g = this.h[6];
|
|
var h = this.h[7];
|
|
assert(this.k.length === W.length);
|
|
for (i = 0;i < W.length; i++) {
|
|
var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);
|
|
var T2 = sum32(s0_256(a), maj32(a, b, c));
|
|
h = g;
|
|
g = f;
|
|
f = e;
|
|
e = sum32(d, T1);
|
|
d = c;
|
|
c = b;
|
|
b = a;
|
|
a = sum32(T1, T2);
|
|
}
|
|
this.h[0] = sum32(this.h[0], a);
|
|
this.h[1] = sum32(this.h[1], b);
|
|
this.h[2] = sum32(this.h[2], c);
|
|
this.h[3] = sum32(this.h[3], d);
|
|
this.h[4] = sum32(this.h[4], e);
|
|
this.h[5] = sum32(this.h[5], f);
|
|
this.h[6] = sum32(this.h[6], g);
|
|
this.h[7] = sum32(this.h[7], h);
|
|
};
|
|
SHA256.prototype._digest = function digest(enc) {
|
|
if (enc === "hex")
|
|
return utils.toHex32(this.h, "big");
|
|
else
|
|
return utils.split32(this.h, "big");
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/sha/224.js
|
|
var require_224 = __commonJS((exports, module) => {
|
|
var utils = require_utils3();
|
|
var SHA256 = require_256();
|
|
function SHA224() {
|
|
if (!(this instanceof SHA224))
|
|
return new SHA224;
|
|
SHA256.call(this);
|
|
this.h = [
|
|
3238371032,
|
|
914150663,
|
|
812702999,
|
|
4144912697,
|
|
4290775857,
|
|
1750603025,
|
|
1694076839,
|
|
3204075428
|
|
];
|
|
}
|
|
utils.inherits(SHA224, SHA256);
|
|
module.exports = SHA224;
|
|
SHA224.blockSize = 512;
|
|
SHA224.outSize = 224;
|
|
SHA224.hmacStrength = 192;
|
|
SHA224.padLength = 64;
|
|
SHA224.prototype._digest = function digest(enc) {
|
|
if (enc === "hex")
|
|
return utils.toHex32(this.h.slice(0, 7), "big");
|
|
else
|
|
return utils.split32(this.h.slice(0, 7), "big");
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/sha/512.js
|
|
var require_512 = __commonJS((exports, module) => {
|
|
var utils = require_utils3();
|
|
var common = require_common();
|
|
var assert = require_minimalistic_assert();
|
|
var rotr64_hi = utils.rotr64_hi;
|
|
var rotr64_lo = utils.rotr64_lo;
|
|
var shr64_hi = utils.shr64_hi;
|
|
var shr64_lo = utils.shr64_lo;
|
|
var sum64 = utils.sum64;
|
|
var sum64_hi = utils.sum64_hi;
|
|
var sum64_lo = utils.sum64_lo;
|
|
var sum64_4_hi = utils.sum64_4_hi;
|
|
var sum64_4_lo = utils.sum64_4_lo;
|
|
var sum64_5_hi = utils.sum64_5_hi;
|
|
var sum64_5_lo = utils.sum64_5_lo;
|
|
var BlockHash = common.BlockHash;
|
|
var sha512_K = [
|
|
1116352408,
|
|
3609767458,
|
|
1899447441,
|
|
602891725,
|
|
3049323471,
|
|
3964484399,
|
|
3921009573,
|
|
2173295548,
|
|
961987163,
|
|
4081628472,
|
|
1508970993,
|
|
3053834265,
|
|
2453635748,
|
|
2937671579,
|
|
2870763221,
|
|
3664609560,
|
|
3624381080,
|
|
2734883394,
|
|
310598401,
|
|
1164996542,
|
|
607225278,
|
|
1323610764,
|
|
1426881987,
|
|
3590304994,
|
|
1925078388,
|
|
4068182383,
|
|
2162078206,
|
|
991336113,
|
|
2614888103,
|
|
633803317,
|
|
3248222580,
|
|
3479774868,
|
|
3835390401,
|
|
2666613458,
|
|
4022224774,
|
|
944711139,
|
|
264347078,
|
|
2341262773,
|
|
604807628,
|
|
2007800933,
|
|
770255983,
|
|
1495990901,
|
|
1249150122,
|
|
1856431235,
|
|
1555081692,
|
|
3175218132,
|
|
1996064986,
|
|
2198950837,
|
|
2554220882,
|
|
3999719339,
|
|
2821834349,
|
|
766784016,
|
|
2952996808,
|
|
2566594879,
|
|
3210313671,
|
|
3203337956,
|
|
3336571891,
|
|
1034457026,
|
|
3584528711,
|
|
2466948901,
|
|
113926993,
|
|
3758326383,
|
|
338241895,
|
|
168717936,
|
|
666307205,
|
|
1188179964,
|
|
773529912,
|
|
1546045734,
|
|
1294757372,
|
|
1522805485,
|
|
1396182291,
|
|
2643833823,
|
|
1695183700,
|
|
2343527390,
|
|
1986661051,
|
|
1014477480,
|
|
2177026350,
|
|
1206759142,
|
|
2456956037,
|
|
344077627,
|
|
2730485921,
|
|
1290863460,
|
|
2820302411,
|
|
3158454273,
|
|
3259730800,
|
|
3505952657,
|
|
3345764771,
|
|
106217008,
|
|
3516065817,
|
|
3606008344,
|
|
3600352804,
|
|
1432725776,
|
|
4094571909,
|
|
1467031594,
|
|
275423344,
|
|
851169720,
|
|
430227734,
|
|
3100823752,
|
|
506948616,
|
|
1363258195,
|
|
659060556,
|
|
3750685593,
|
|
883997877,
|
|
3785050280,
|
|
958139571,
|
|
3318307427,
|
|
1322822218,
|
|
3812723403,
|
|
1537002063,
|
|
2003034995,
|
|
1747873779,
|
|
3602036899,
|
|
1955562222,
|
|
1575990012,
|
|
2024104815,
|
|
1125592928,
|
|
2227730452,
|
|
2716904306,
|
|
2361852424,
|
|
442776044,
|
|
2428436474,
|
|
593698344,
|
|
2756734187,
|
|
3733110249,
|
|
3204031479,
|
|
2999351573,
|
|
3329325298,
|
|
3815920427,
|
|
3391569614,
|
|
3928383900,
|
|
3515267271,
|
|
566280711,
|
|
3940187606,
|
|
3454069534,
|
|
4118630271,
|
|
4000239992,
|
|
116418474,
|
|
1914138554,
|
|
174292421,
|
|
2731055270,
|
|
289380356,
|
|
3203993006,
|
|
460393269,
|
|
320620315,
|
|
685471733,
|
|
587496836,
|
|
852142971,
|
|
1086792851,
|
|
1017036298,
|
|
365543100,
|
|
1126000580,
|
|
2618297676,
|
|
1288033470,
|
|
3409855158,
|
|
1501505948,
|
|
4234509866,
|
|
1607167915,
|
|
987167468,
|
|
1816402316,
|
|
1246189591
|
|
];
|
|
function SHA512() {
|
|
if (!(this instanceof SHA512))
|
|
return new SHA512;
|
|
BlockHash.call(this);
|
|
this.h = [
|
|
1779033703,
|
|
4089235720,
|
|
3144134277,
|
|
2227873595,
|
|
1013904242,
|
|
4271175723,
|
|
2773480762,
|
|
1595750129,
|
|
1359893119,
|
|
2917565137,
|
|
2600822924,
|
|
725511199,
|
|
528734635,
|
|
4215389547,
|
|
1541459225,
|
|
327033209
|
|
];
|
|
this.k = sha512_K;
|
|
this.W = new Array(160);
|
|
}
|
|
utils.inherits(SHA512, BlockHash);
|
|
module.exports = SHA512;
|
|
SHA512.blockSize = 1024;
|
|
SHA512.outSize = 512;
|
|
SHA512.hmacStrength = 192;
|
|
SHA512.padLength = 128;
|
|
SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {
|
|
var W = this.W;
|
|
for (var i = 0;i < 32; i++)
|
|
W[i] = msg[start + i];
|
|
for (;i < W.length; i += 2) {
|
|
var c0_hi = g1_512_hi(W[i - 4], W[i - 3]);
|
|
var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);
|
|
var c1_hi = W[i - 14];
|
|
var c1_lo = W[i - 13];
|
|
var c2_hi = g0_512_hi(W[i - 30], W[i - 29]);
|
|
var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);
|
|
var c3_hi = W[i - 32];
|
|
var c3_lo = W[i - 31];
|
|
W[i] = sum64_4_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo);
|
|
W[i + 1] = sum64_4_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo);
|
|
}
|
|
};
|
|
SHA512.prototype._update = function _update(msg, start) {
|
|
this._prepareBlock(msg, start);
|
|
var W = this.W;
|
|
var ah = this.h[0];
|
|
var al = this.h[1];
|
|
var bh = this.h[2];
|
|
var bl = this.h[3];
|
|
var ch = this.h[4];
|
|
var cl = this.h[5];
|
|
var dh = this.h[6];
|
|
var dl = this.h[7];
|
|
var eh = this.h[8];
|
|
var el = this.h[9];
|
|
var fh = this.h[10];
|
|
var fl = this.h[11];
|
|
var gh = this.h[12];
|
|
var gl = this.h[13];
|
|
var hh = this.h[14];
|
|
var hl = this.h[15];
|
|
assert(this.k.length === W.length);
|
|
for (var i = 0;i < W.length; i += 2) {
|
|
var c0_hi = hh;
|
|
var c0_lo = hl;
|
|
var c1_hi = s1_512_hi(eh, el);
|
|
var c1_lo = s1_512_lo(eh, el);
|
|
var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);
|
|
var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);
|
|
var c3_hi = this.k[i];
|
|
var c3_lo = this.k[i + 1];
|
|
var c4_hi = W[i];
|
|
var c4_lo = W[i + 1];
|
|
var T1_hi = sum64_5_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo);
|
|
var T1_lo = sum64_5_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo);
|
|
c0_hi = s0_512_hi(ah, al);
|
|
c0_lo = s0_512_lo(ah, al);
|
|
c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);
|
|
c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);
|
|
var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);
|
|
var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);
|
|
hh = gh;
|
|
hl = gl;
|
|
gh = fh;
|
|
gl = fl;
|
|
fh = eh;
|
|
fl = el;
|
|
eh = sum64_hi(dh, dl, T1_hi, T1_lo);
|
|
el = sum64_lo(dl, dl, T1_hi, T1_lo);
|
|
dh = ch;
|
|
dl = cl;
|
|
ch = bh;
|
|
cl = bl;
|
|
bh = ah;
|
|
bl = al;
|
|
ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);
|
|
al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);
|
|
}
|
|
sum64(this.h, 0, ah, al);
|
|
sum64(this.h, 2, bh, bl);
|
|
sum64(this.h, 4, ch, cl);
|
|
sum64(this.h, 6, dh, dl);
|
|
sum64(this.h, 8, eh, el);
|
|
sum64(this.h, 10, fh, fl);
|
|
sum64(this.h, 12, gh, gl);
|
|
sum64(this.h, 14, hh, hl);
|
|
};
|
|
SHA512.prototype._digest = function digest(enc) {
|
|
if (enc === "hex")
|
|
return utils.toHex32(this.h, "big");
|
|
else
|
|
return utils.split32(this.h, "big");
|
|
};
|
|
function ch64_hi(xh, xl, yh, yl, zh) {
|
|
var r = xh & yh ^ ~xh & zh;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function ch64_lo(xh, xl, yh, yl, zh, zl) {
|
|
var r = xl & yl ^ ~xl & zl;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function maj64_hi(xh, xl, yh, yl, zh) {
|
|
var r = xh & yh ^ xh & zh ^ yh & zh;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function maj64_lo(xh, xl, yh, yl, zh, zl) {
|
|
var r = xl & yl ^ xl & zl ^ yl & zl;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function s0_512_hi(xh, xl) {
|
|
var c0_hi = rotr64_hi(xh, xl, 28);
|
|
var c1_hi = rotr64_hi(xl, xh, 2);
|
|
var c2_hi = rotr64_hi(xl, xh, 7);
|
|
var r = c0_hi ^ c1_hi ^ c2_hi;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function s0_512_lo(xh, xl) {
|
|
var c0_lo = rotr64_lo(xh, xl, 28);
|
|
var c1_lo = rotr64_lo(xl, xh, 2);
|
|
var c2_lo = rotr64_lo(xl, xh, 7);
|
|
var r = c0_lo ^ c1_lo ^ c2_lo;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function s1_512_hi(xh, xl) {
|
|
var c0_hi = rotr64_hi(xh, xl, 14);
|
|
var c1_hi = rotr64_hi(xh, xl, 18);
|
|
var c2_hi = rotr64_hi(xl, xh, 9);
|
|
var r = c0_hi ^ c1_hi ^ c2_hi;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function s1_512_lo(xh, xl) {
|
|
var c0_lo = rotr64_lo(xh, xl, 14);
|
|
var c1_lo = rotr64_lo(xh, xl, 18);
|
|
var c2_lo = rotr64_lo(xl, xh, 9);
|
|
var r = c0_lo ^ c1_lo ^ c2_lo;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function g0_512_hi(xh, xl) {
|
|
var c0_hi = rotr64_hi(xh, xl, 1);
|
|
var c1_hi = rotr64_hi(xh, xl, 8);
|
|
var c2_hi = shr64_hi(xh, xl, 7);
|
|
var r = c0_hi ^ c1_hi ^ c2_hi;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function g0_512_lo(xh, xl) {
|
|
var c0_lo = rotr64_lo(xh, xl, 1);
|
|
var c1_lo = rotr64_lo(xh, xl, 8);
|
|
var c2_lo = shr64_lo(xh, xl, 7);
|
|
var r = c0_lo ^ c1_lo ^ c2_lo;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function g1_512_hi(xh, xl) {
|
|
var c0_hi = rotr64_hi(xh, xl, 19);
|
|
var c1_hi = rotr64_hi(xl, xh, 29);
|
|
var c2_hi = shr64_hi(xh, xl, 6);
|
|
var r = c0_hi ^ c1_hi ^ c2_hi;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function g1_512_lo(xh, xl) {
|
|
var c0_lo = rotr64_lo(xh, xl, 19);
|
|
var c1_lo = rotr64_lo(xl, xh, 29);
|
|
var c2_lo = shr64_lo(xh, xl, 6);
|
|
var r = c0_lo ^ c1_lo ^ c2_lo;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/sha/384.js
|
|
var require_384 = __commonJS((exports, module) => {
|
|
var utils = require_utils3();
|
|
var SHA512 = require_512();
|
|
function SHA384() {
|
|
if (!(this instanceof SHA384))
|
|
return new SHA384;
|
|
SHA512.call(this);
|
|
this.h = [
|
|
3418070365,
|
|
3238371032,
|
|
1654270250,
|
|
914150663,
|
|
2438529370,
|
|
812702999,
|
|
355462360,
|
|
4144912697,
|
|
1731405415,
|
|
4290775857,
|
|
2394180231,
|
|
1750603025,
|
|
3675008525,
|
|
1694076839,
|
|
1203062813,
|
|
3204075428
|
|
];
|
|
}
|
|
utils.inherits(SHA384, SHA512);
|
|
module.exports = SHA384;
|
|
SHA384.blockSize = 1024;
|
|
SHA384.outSize = 384;
|
|
SHA384.hmacStrength = 192;
|
|
SHA384.padLength = 128;
|
|
SHA384.prototype._digest = function digest(enc) {
|
|
if (enc === "hex")
|
|
return utils.toHex32(this.h.slice(0, 12), "big");
|
|
else
|
|
return utils.split32(this.h.slice(0, 12), "big");
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/sha.js
|
|
var require_sha = __commonJS((exports) => {
|
|
exports.sha1 = require_1();
|
|
exports.sha224 = require_224();
|
|
exports.sha256 = require_256();
|
|
exports.sha384 = require_384();
|
|
exports.sha512 = require_512();
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/ripemd.js
|
|
var require_ripemd = __commonJS((exports) => {
|
|
var utils = require_utils3();
|
|
var common = require_common();
|
|
var rotl32 = utils.rotl32;
|
|
var sum32 = utils.sum32;
|
|
var sum32_3 = utils.sum32_3;
|
|
var sum32_4 = utils.sum32_4;
|
|
var BlockHash = common.BlockHash;
|
|
function RIPEMD160() {
|
|
if (!(this instanceof RIPEMD160))
|
|
return new RIPEMD160;
|
|
BlockHash.call(this);
|
|
this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];
|
|
this.endian = "little";
|
|
}
|
|
utils.inherits(RIPEMD160, BlockHash);
|
|
exports.ripemd160 = RIPEMD160;
|
|
RIPEMD160.blockSize = 512;
|
|
RIPEMD160.outSize = 160;
|
|
RIPEMD160.hmacStrength = 192;
|
|
RIPEMD160.padLength = 64;
|
|
RIPEMD160.prototype._update = function update(msg, start) {
|
|
var A = this.h[0];
|
|
var B = this.h[1];
|
|
var C = this.h[2];
|
|
var D = this.h[3];
|
|
var E = this.h[4];
|
|
var Ah = A;
|
|
var Bh = B;
|
|
var Ch = C;
|
|
var Dh = D;
|
|
var Eh = E;
|
|
for (var j = 0;j < 80; j++) {
|
|
var T = sum32(rotl32(sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), s[j]), E);
|
|
A = E;
|
|
E = D;
|
|
D = rotl32(C, 10);
|
|
C = B;
|
|
B = T;
|
|
T = sum32(rotl32(sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), sh[j]), Eh);
|
|
Ah = Eh;
|
|
Eh = Dh;
|
|
Dh = rotl32(Ch, 10);
|
|
Ch = Bh;
|
|
Bh = T;
|
|
}
|
|
T = sum32_3(this.h[1], C, Dh);
|
|
this.h[1] = sum32_3(this.h[2], D, Eh);
|
|
this.h[2] = sum32_3(this.h[3], E, Ah);
|
|
this.h[3] = sum32_3(this.h[4], A, Bh);
|
|
this.h[4] = sum32_3(this.h[0], B, Ch);
|
|
this.h[0] = T;
|
|
};
|
|
RIPEMD160.prototype._digest = function digest(enc) {
|
|
if (enc === "hex")
|
|
return utils.toHex32(this.h, "little");
|
|
else
|
|
return utils.split32(this.h, "little");
|
|
};
|
|
function f(j, x, y, z) {
|
|
if (j <= 15)
|
|
return x ^ y ^ z;
|
|
else if (j <= 31)
|
|
return x & y | ~x & z;
|
|
else if (j <= 47)
|
|
return (x | ~y) ^ z;
|
|
else if (j <= 63)
|
|
return x & z | y & ~z;
|
|
else
|
|
return x ^ (y | ~z);
|
|
}
|
|
function K(j) {
|
|
if (j <= 15)
|
|
return 0;
|
|
else if (j <= 31)
|
|
return 1518500249;
|
|
else if (j <= 47)
|
|
return 1859775393;
|
|
else if (j <= 63)
|
|
return 2400959708;
|
|
else
|
|
return 2840853838;
|
|
}
|
|
function Kh(j) {
|
|
if (j <= 15)
|
|
return 1352829926;
|
|
else if (j <= 31)
|
|
return 1548603684;
|
|
else if (j <= 47)
|
|
return 1836072691;
|
|
else if (j <= 63)
|
|
return 2053994217;
|
|
else
|
|
return 0;
|
|
}
|
|
var r = [
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
7,
|
|
4,
|
|
13,
|
|
1,
|
|
10,
|
|
6,
|
|
15,
|
|
3,
|
|
12,
|
|
0,
|
|
9,
|
|
5,
|
|
2,
|
|
14,
|
|
11,
|
|
8,
|
|
3,
|
|
10,
|
|
14,
|
|
4,
|
|
9,
|
|
15,
|
|
8,
|
|
1,
|
|
2,
|
|
7,
|
|
0,
|
|
6,
|
|
13,
|
|
11,
|
|
5,
|
|
12,
|
|
1,
|
|
9,
|
|
11,
|
|
10,
|
|
0,
|
|
8,
|
|
12,
|
|
4,
|
|
13,
|
|
3,
|
|
7,
|
|
15,
|
|
14,
|
|
5,
|
|
6,
|
|
2,
|
|
4,
|
|
0,
|
|
5,
|
|
9,
|
|
7,
|
|
12,
|
|
2,
|
|
10,
|
|
14,
|
|
1,
|
|
3,
|
|
8,
|
|
11,
|
|
6,
|
|
15,
|
|
13
|
|
];
|
|
var rh = [
|
|
5,
|
|
14,
|
|
7,
|
|
0,
|
|
9,
|
|
2,
|
|
11,
|
|
4,
|
|
13,
|
|
6,
|
|
15,
|
|
8,
|
|
1,
|
|
10,
|
|
3,
|
|
12,
|
|
6,
|
|
11,
|
|
3,
|
|
7,
|
|
0,
|
|
13,
|
|
5,
|
|
10,
|
|
14,
|
|
15,
|
|
8,
|
|
12,
|
|
4,
|
|
9,
|
|
1,
|
|
2,
|
|
15,
|
|
5,
|
|
1,
|
|
3,
|
|
7,
|
|
14,
|
|
6,
|
|
9,
|
|
11,
|
|
8,
|
|
12,
|
|
2,
|
|
10,
|
|
0,
|
|
4,
|
|
13,
|
|
8,
|
|
6,
|
|
4,
|
|
1,
|
|
3,
|
|
11,
|
|
15,
|
|
0,
|
|
5,
|
|
12,
|
|
2,
|
|
13,
|
|
9,
|
|
7,
|
|
10,
|
|
14,
|
|
12,
|
|
15,
|
|
10,
|
|
4,
|
|
1,
|
|
5,
|
|
8,
|
|
7,
|
|
6,
|
|
2,
|
|
13,
|
|
14,
|
|
0,
|
|
3,
|
|
9,
|
|
11
|
|
];
|
|
var s = [
|
|
11,
|
|
14,
|
|
15,
|
|
12,
|
|
5,
|
|
8,
|
|
7,
|
|
9,
|
|
11,
|
|
13,
|
|
14,
|
|
15,
|
|
6,
|
|
7,
|
|
9,
|
|
8,
|
|
7,
|
|
6,
|
|
8,
|
|
13,
|
|
11,
|
|
9,
|
|
7,
|
|
15,
|
|
7,
|
|
12,
|
|
15,
|
|
9,
|
|
11,
|
|
7,
|
|
13,
|
|
12,
|
|
11,
|
|
13,
|
|
6,
|
|
7,
|
|
14,
|
|
9,
|
|
13,
|
|
15,
|
|
14,
|
|
8,
|
|
13,
|
|
6,
|
|
5,
|
|
12,
|
|
7,
|
|
5,
|
|
11,
|
|
12,
|
|
14,
|
|
15,
|
|
14,
|
|
15,
|
|
9,
|
|
8,
|
|
9,
|
|
14,
|
|
5,
|
|
6,
|
|
8,
|
|
6,
|
|
5,
|
|
12,
|
|
9,
|
|
15,
|
|
5,
|
|
11,
|
|
6,
|
|
8,
|
|
13,
|
|
12,
|
|
5,
|
|
12,
|
|
13,
|
|
14,
|
|
11,
|
|
8,
|
|
5,
|
|
6
|
|
];
|
|
var sh = [
|
|
8,
|
|
9,
|
|
9,
|
|
11,
|
|
13,
|
|
15,
|
|
15,
|
|
5,
|
|
7,
|
|
7,
|
|
8,
|
|
11,
|
|
14,
|
|
14,
|
|
12,
|
|
6,
|
|
9,
|
|
13,
|
|
15,
|
|
7,
|
|
12,
|
|
8,
|
|
9,
|
|
11,
|
|
7,
|
|
7,
|
|
12,
|
|
7,
|
|
6,
|
|
15,
|
|
13,
|
|
11,
|
|
9,
|
|
7,
|
|
15,
|
|
11,
|
|
8,
|
|
6,
|
|
6,
|
|
14,
|
|
12,
|
|
13,
|
|
5,
|
|
14,
|
|
13,
|
|
13,
|
|
7,
|
|
5,
|
|
15,
|
|
5,
|
|
8,
|
|
11,
|
|
14,
|
|
14,
|
|
6,
|
|
14,
|
|
6,
|
|
9,
|
|
12,
|
|
9,
|
|
12,
|
|
5,
|
|
15,
|
|
8,
|
|
8,
|
|
5,
|
|
12,
|
|
9,
|
|
12,
|
|
5,
|
|
14,
|
|
6,
|
|
8,
|
|
13,
|
|
6,
|
|
5,
|
|
15,
|
|
13,
|
|
11,
|
|
11
|
|
];
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/hmac.js
|
|
var require_hmac = __commonJS((exports, module) => {
|
|
var utils = require_utils3();
|
|
var assert = require_minimalistic_assert();
|
|
function Hmac(hash, key, enc) {
|
|
if (!(this instanceof Hmac))
|
|
return new Hmac(hash, key, enc);
|
|
this.Hash = hash;
|
|
this.blockSize = hash.blockSize / 8;
|
|
this.outSize = hash.outSize / 8;
|
|
this.inner = null;
|
|
this.outer = null;
|
|
this._init(utils.toArray(key, enc));
|
|
}
|
|
module.exports = Hmac;
|
|
Hmac.prototype._init = function init(key) {
|
|
if (key.length > this.blockSize)
|
|
key = new this.Hash().update(key).digest();
|
|
assert(key.length <= this.blockSize);
|
|
for (var i = key.length;i < this.blockSize; i++)
|
|
key.push(0);
|
|
for (i = 0;i < key.length; i++)
|
|
key[i] ^= 54;
|
|
this.inner = new this.Hash().update(key);
|
|
for (i = 0;i < key.length; i++)
|
|
key[i] ^= 106;
|
|
this.outer = new this.Hash().update(key);
|
|
};
|
|
Hmac.prototype.update = function update(msg, enc) {
|
|
this.inner.update(msg, enc);
|
|
return this;
|
|
};
|
|
Hmac.prototype.digest = function digest(enc) {
|
|
this.outer.update(this.inner.digest());
|
|
return this.outer.digest(enc);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash.js
|
|
var require_hash = __commonJS((exports) => {
|
|
var hash = exports;
|
|
hash.utils = require_utils3();
|
|
hash.common = require_common();
|
|
hash.sha = require_sha();
|
|
hash.ripemd = require_ripemd();
|
|
hash.hmac = require_hmac();
|
|
hash.sha1 = hash.sha.sha1;
|
|
hash.sha256 = hash.sha.sha256;
|
|
hash.sha224 = hash.sha.sha224;
|
|
hash.sha384 = hash.sha.sha384;
|
|
hash.sha512 = hash.sha.sha512;
|
|
hash.ripemd160 = hash.ripemd.ripemd160;
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js
|
|
var require_secp256k1 = __commonJS((exports, module) => {
|
|
module.exports = {
|
|
doubles: {
|
|
step: 4,
|
|
points: [
|
|
[
|
|
"e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a",
|
|
"f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821"
|
|
],
|
|
[
|
|
"8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508",
|
|
"11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"
|
|
],
|
|
[
|
|
"175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739",
|
|
"d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695"
|
|
],
|
|
[
|
|
"363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640",
|
|
"4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9"
|
|
],
|
|
[
|
|
"8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c",
|
|
"4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36"
|
|
],
|
|
[
|
|
"723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda",
|
|
"96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f"
|
|
],
|
|
[
|
|
"eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa",
|
|
"5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999"
|
|
],
|
|
[
|
|
"100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0",
|
|
"cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09"
|
|
],
|
|
[
|
|
"e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d",
|
|
"9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d"
|
|
],
|
|
[
|
|
"feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d",
|
|
"e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088"
|
|
],
|
|
[
|
|
"da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1",
|
|
"9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d"
|
|
],
|
|
[
|
|
"53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0",
|
|
"5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8"
|
|
],
|
|
[
|
|
"8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047",
|
|
"10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a"
|
|
],
|
|
[
|
|
"385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862",
|
|
"283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453"
|
|
],
|
|
[
|
|
"6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7",
|
|
"7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160"
|
|
],
|
|
[
|
|
"3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd",
|
|
"56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0"
|
|
],
|
|
[
|
|
"85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83",
|
|
"7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6"
|
|
],
|
|
[
|
|
"948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a",
|
|
"53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589"
|
|
],
|
|
[
|
|
"6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8",
|
|
"bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17"
|
|
],
|
|
[
|
|
"e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d",
|
|
"4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda"
|
|
],
|
|
[
|
|
"e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725",
|
|
"7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd"
|
|
],
|
|
[
|
|
"213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754",
|
|
"4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2"
|
|
],
|
|
[
|
|
"4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c",
|
|
"17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6"
|
|
],
|
|
[
|
|
"fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6",
|
|
"6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f"
|
|
],
|
|
[
|
|
"76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39",
|
|
"c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01"
|
|
],
|
|
[
|
|
"c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891",
|
|
"893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3"
|
|
],
|
|
[
|
|
"d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b",
|
|
"febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f"
|
|
],
|
|
[
|
|
"b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03",
|
|
"2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7"
|
|
],
|
|
[
|
|
"e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d",
|
|
"eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78"
|
|
],
|
|
[
|
|
"a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070",
|
|
"7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1"
|
|
],
|
|
[
|
|
"90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4",
|
|
"e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150"
|
|
],
|
|
[
|
|
"8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da",
|
|
"662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82"
|
|
],
|
|
[
|
|
"e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11",
|
|
"1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc"
|
|
],
|
|
[
|
|
"8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e",
|
|
"efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b"
|
|
],
|
|
[
|
|
"e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41",
|
|
"2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51"
|
|
],
|
|
[
|
|
"b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef",
|
|
"67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45"
|
|
],
|
|
[
|
|
"d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8",
|
|
"db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120"
|
|
],
|
|
[
|
|
"324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d",
|
|
"648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84"
|
|
],
|
|
[
|
|
"4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96",
|
|
"35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d"
|
|
],
|
|
[
|
|
"9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd",
|
|
"ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d"
|
|
],
|
|
[
|
|
"6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5",
|
|
"9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8"
|
|
],
|
|
[
|
|
"a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266",
|
|
"40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8"
|
|
],
|
|
[
|
|
"7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71",
|
|
"34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac"
|
|
],
|
|
[
|
|
"928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac",
|
|
"c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f"
|
|
],
|
|
[
|
|
"85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751",
|
|
"1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962"
|
|
],
|
|
[
|
|
"ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e",
|
|
"493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907"
|
|
],
|
|
[
|
|
"827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241",
|
|
"c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec"
|
|
],
|
|
[
|
|
"eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3",
|
|
"be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d"
|
|
],
|
|
[
|
|
"e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f",
|
|
"4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414"
|
|
],
|
|
[
|
|
"1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19",
|
|
"aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd"
|
|
],
|
|
[
|
|
"146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be",
|
|
"b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0"
|
|
],
|
|
[
|
|
"fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9",
|
|
"6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811"
|
|
],
|
|
[
|
|
"da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2",
|
|
"8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1"
|
|
],
|
|
[
|
|
"a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13",
|
|
"7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c"
|
|
],
|
|
[
|
|
"174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c",
|
|
"ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73"
|
|
],
|
|
[
|
|
"959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba",
|
|
"2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd"
|
|
],
|
|
[
|
|
"d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151",
|
|
"e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405"
|
|
],
|
|
[
|
|
"64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073",
|
|
"d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589"
|
|
],
|
|
[
|
|
"8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458",
|
|
"38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e"
|
|
],
|
|
[
|
|
"13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b",
|
|
"69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27"
|
|
],
|
|
[
|
|
"bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366",
|
|
"d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1"
|
|
],
|
|
[
|
|
"8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa",
|
|
"40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482"
|
|
],
|
|
[
|
|
"8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0",
|
|
"620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945"
|
|
],
|
|
[
|
|
"dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787",
|
|
"7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573"
|
|
],
|
|
[
|
|
"f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e",
|
|
"ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82"
|
|
]
|
|
]
|
|
},
|
|
naf: {
|
|
wnd: 7,
|
|
points: [
|
|
[
|
|
"f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9",
|
|
"388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672"
|
|
],
|
|
[
|
|
"2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4",
|
|
"d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6"
|
|
],
|
|
[
|
|
"5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc",
|
|
"6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da"
|
|
],
|
|
[
|
|
"acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe",
|
|
"cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37"
|
|
],
|
|
[
|
|
"774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb",
|
|
"d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b"
|
|
],
|
|
[
|
|
"f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8",
|
|
"ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81"
|
|
],
|
|
[
|
|
"d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e",
|
|
"581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58"
|
|
],
|
|
[
|
|
"defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34",
|
|
"4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77"
|
|
],
|
|
[
|
|
"2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c",
|
|
"85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a"
|
|
],
|
|
[
|
|
"352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5",
|
|
"321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c"
|
|
],
|
|
[
|
|
"2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f",
|
|
"2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67"
|
|
],
|
|
[
|
|
"9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714",
|
|
"73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402"
|
|
],
|
|
[
|
|
"daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729",
|
|
"a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55"
|
|
],
|
|
[
|
|
"c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db",
|
|
"2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482"
|
|
],
|
|
[
|
|
"6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4",
|
|
"e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82"
|
|
],
|
|
[
|
|
"1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5",
|
|
"b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396"
|
|
],
|
|
[
|
|
"605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479",
|
|
"2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49"
|
|
],
|
|
[
|
|
"62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d",
|
|
"80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf"
|
|
],
|
|
[
|
|
"80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f",
|
|
"1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a"
|
|
],
|
|
[
|
|
"7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb",
|
|
"d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7"
|
|
],
|
|
[
|
|
"d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9",
|
|
"eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933"
|
|
],
|
|
[
|
|
"49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963",
|
|
"758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a"
|
|
],
|
|
[
|
|
"77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74",
|
|
"958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6"
|
|
],
|
|
[
|
|
"f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530",
|
|
"e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37"
|
|
],
|
|
[
|
|
"463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b",
|
|
"5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e"
|
|
],
|
|
[
|
|
"f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247",
|
|
"cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6"
|
|
],
|
|
[
|
|
"caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1",
|
|
"cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476"
|
|
],
|
|
[
|
|
"2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120",
|
|
"4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40"
|
|
],
|
|
[
|
|
"7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435",
|
|
"91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61"
|
|
],
|
|
[
|
|
"754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18",
|
|
"673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683"
|
|
],
|
|
[
|
|
"e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8",
|
|
"59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5"
|
|
],
|
|
[
|
|
"186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb",
|
|
"3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b"
|
|
],
|
|
[
|
|
"df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f",
|
|
"55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417"
|
|
],
|
|
[
|
|
"5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143",
|
|
"efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868"
|
|
],
|
|
[
|
|
"290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba",
|
|
"e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a"
|
|
],
|
|
[
|
|
"af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45",
|
|
"f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6"
|
|
],
|
|
[
|
|
"766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a",
|
|
"744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996"
|
|
],
|
|
[
|
|
"59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e",
|
|
"c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e"
|
|
],
|
|
[
|
|
"f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8",
|
|
"e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d"
|
|
],
|
|
[
|
|
"7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c",
|
|
"30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2"
|
|
],
|
|
[
|
|
"948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519",
|
|
"e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e"
|
|
],
|
|
[
|
|
"7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab",
|
|
"100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437"
|
|
],
|
|
[
|
|
"3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca",
|
|
"ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311"
|
|
],
|
|
[
|
|
"d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf",
|
|
"8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4"
|
|
],
|
|
[
|
|
"1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610",
|
|
"68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575"
|
|
],
|
|
[
|
|
"733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4",
|
|
"f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d"
|
|
],
|
|
[
|
|
"15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c",
|
|
"d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d"
|
|
],
|
|
[
|
|
"a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940",
|
|
"edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629"
|
|
],
|
|
[
|
|
"e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980",
|
|
"a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06"
|
|
],
|
|
[
|
|
"311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3",
|
|
"66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374"
|
|
],
|
|
[
|
|
"34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf",
|
|
"9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee"
|
|
],
|
|
[
|
|
"f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63",
|
|
"4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1"
|
|
],
|
|
[
|
|
"d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448",
|
|
"fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b"
|
|
],
|
|
[
|
|
"32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf",
|
|
"5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661"
|
|
],
|
|
[
|
|
"7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5",
|
|
"8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6"
|
|
],
|
|
[
|
|
"ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6",
|
|
"8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e"
|
|
],
|
|
[
|
|
"16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5",
|
|
"5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d"
|
|
],
|
|
[
|
|
"eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99",
|
|
"f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc"
|
|
],
|
|
[
|
|
"78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51",
|
|
"f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4"
|
|
],
|
|
[
|
|
"494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5",
|
|
"42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c"
|
|
],
|
|
[
|
|
"a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5",
|
|
"204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b"
|
|
],
|
|
[
|
|
"c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997",
|
|
"4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913"
|
|
],
|
|
[
|
|
"841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881",
|
|
"73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154"
|
|
],
|
|
[
|
|
"5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5",
|
|
"39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865"
|
|
],
|
|
[
|
|
"36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66",
|
|
"d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc"
|
|
],
|
|
[
|
|
"336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726",
|
|
"ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224"
|
|
],
|
|
[
|
|
"8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede",
|
|
"6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e"
|
|
],
|
|
[
|
|
"1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94",
|
|
"60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6"
|
|
],
|
|
[
|
|
"85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31",
|
|
"3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511"
|
|
],
|
|
[
|
|
"29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51",
|
|
"b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b"
|
|
],
|
|
[
|
|
"a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252",
|
|
"ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2"
|
|
],
|
|
[
|
|
"4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5",
|
|
"cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c"
|
|
],
|
|
[
|
|
"d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b",
|
|
"6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3"
|
|
],
|
|
[
|
|
"ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4",
|
|
"322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d"
|
|
],
|
|
[
|
|
"af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f",
|
|
"6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700"
|
|
],
|
|
[
|
|
"e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889",
|
|
"2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4"
|
|
],
|
|
[
|
|
"591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246",
|
|
"b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196"
|
|
],
|
|
[
|
|
"11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984",
|
|
"998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4"
|
|
],
|
|
[
|
|
"3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a",
|
|
"b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257"
|
|
],
|
|
[
|
|
"cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030",
|
|
"bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13"
|
|
],
|
|
[
|
|
"c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197",
|
|
"6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096"
|
|
],
|
|
[
|
|
"c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593",
|
|
"c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38"
|
|
],
|
|
[
|
|
"a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef",
|
|
"21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f"
|
|
],
|
|
[
|
|
"347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38",
|
|
"60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448"
|
|
],
|
|
[
|
|
"da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a",
|
|
"49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a"
|
|
],
|
|
[
|
|
"c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111",
|
|
"5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4"
|
|
],
|
|
[
|
|
"4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502",
|
|
"7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437"
|
|
],
|
|
[
|
|
"3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea",
|
|
"be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7"
|
|
],
|
|
[
|
|
"cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26",
|
|
"8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d"
|
|
],
|
|
[
|
|
"b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986",
|
|
"39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a"
|
|
],
|
|
[
|
|
"d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e",
|
|
"62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54"
|
|
],
|
|
[
|
|
"48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4",
|
|
"25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77"
|
|
],
|
|
[
|
|
"dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda",
|
|
"ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517"
|
|
],
|
|
[
|
|
"6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859",
|
|
"cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10"
|
|
],
|
|
[
|
|
"e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f",
|
|
"f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125"
|
|
],
|
|
[
|
|
"eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c",
|
|
"6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e"
|
|
],
|
|
[
|
|
"13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942",
|
|
"fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1"
|
|
],
|
|
[
|
|
"ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a",
|
|
"1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2"
|
|
],
|
|
[
|
|
"b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80",
|
|
"5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423"
|
|
],
|
|
[
|
|
"ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d",
|
|
"438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8"
|
|
],
|
|
[
|
|
"8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1",
|
|
"cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758"
|
|
],
|
|
[
|
|
"52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63",
|
|
"c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375"
|
|
],
|
|
[
|
|
"e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352",
|
|
"6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d"
|
|
],
|
|
[
|
|
"7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193",
|
|
"ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec"
|
|
],
|
|
[
|
|
"5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00",
|
|
"9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0"
|
|
],
|
|
[
|
|
"32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58",
|
|
"ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c"
|
|
],
|
|
[
|
|
"e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7",
|
|
"d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4"
|
|
],
|
|
[
|
|
"8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8",
|
|
"c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f"
|
|
],
|
|
[
|
|
"4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e",
|
|
"67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649"
|
|
],
|
|
[
|
|
"3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d",
|
|
"cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826"
|
|
],
|
|
[
|
|
"674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b",
|
|
"299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5"
|
|
],
|
|
[
|
|
"d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f",
|
|
"f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87"
|
|
],
|
|
[
|
|
"30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6",
|
|
"462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b"
|
|
],
|
|
[
|
|
"be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297",
|
|
"62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc"
|
|
],
|
|
[
|
|
"93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a",
|
|
"7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c"
|
|
],
|
|
[
|
|
"b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c",
|
|
"ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f"
|
|
],
|
|
[
|
|
"d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52",
|
|
"4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a"
|
|
],
|
|
[
|
|
"d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb",
|
|
"bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46"
|
|
],
|
|
[
|
|
"463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065",
|
|
"bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f"
|
|
],
|
|
[
|
|
"7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917",
|
|
"603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03"
|
|
],
|
|
[
|
|
"74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9",
|
|
"cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08"
|
|
],
|
|
[
|
|
"30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3",
|
|
"553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8"
|
|
],
|
|
[
|
|
"9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57",
|
|
"712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373"
|
|
],
|
|
[
|
|
"176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66",
|
|
"ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3"
|
|
],
|
|
[
|
|
"75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8",
|
|
"9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8"
|
|
],
|
|
[
|
|
"809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721",
|
|
"9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1"
|
|
],
|
|
[
|
|
"1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180",
|
|
"4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9"
|
|
]
|
|
]
|
|
}
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/curves.js
|
|
var require_curves = __commonJS((exports) => {
|
|
var curves = exports;
|
|
var hash = require_hash();
|
|
var curve = require_curve();
|
|
var utils = require_utils2();
|
|
var assert = utils.assert;
|
|
function PresetCurve(options2) {
|
|
if (options2.type === "short")
|
|
this.curve = new curve.short(options2);
|
|
else if (options2.type === "edwards")
|
|
this.curve = new curve.edwards(options2);
|
|
else
|
|
this.curve = new curve.mont(options2);
|
|
this.g = this.curve.g;
|
|
this.n = this.curve.n;
|
|
this.hash = options2.hash;
|
|
assert(this.g.validate(), "Invalid curve");
|
|
assert(this.g.mul(this.n).isInfinity(), "Invalid curve, G*N != O");
|
|
}
|
|
curves.PresetCurve = PresetCurve;
|
|
function defineCurve(name, options2) {
|
|
Object.defineProperty(curves, name, {
|
|
configurable: true,
|
|
enumerable: true,
|
|
get: function() {
|
|
var curve2 = new PresetCurve(options2);
|
|
Object.defineProperty(curves, name, {
|
|
configurable: true,
|
|
enumerable: true,
|
|
value: curve2
|
|
});
|
|
return curve2;
|
|
}
|
|
});
|
|
}
|
|
defineCurve("p192", {
|
|
type: "short",
|
|
prime: "p192",
|
|
p: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",
|
|
a: "ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",
|
|
b: "64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",
|
|
n: "ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
"188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012",
|
|
"07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"
|
|
]
|
|
});
|
|
defineCurve("p224", {
|
|
type: "short",
|
|
prime: "p224",
|
|
p: "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",
|
|
a: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",
|
|
b: "b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",
|
|
n: "ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
"b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21",
|
|
"bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"
|
|
]
|
|
});
|
|
defineCurve("p256", {
|
|
type: "short",
|
|
prime: null,
|
|
p: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",
|
|
a: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",
|
|
b: "5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",
|
|
n: "ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
"6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296",
|
|
"4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"
|
|
]
|
|
});
|
|
defineCurve("p384", {
|
|
type: "short",
|
|
prime: null,
|
|
p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "fffffffe ffffffff 00000000 00000000 ffffffff",
|
|
a: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "fffffffe ffffffff 00000000 00000000 fffffffc",
|
|
b: "b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f " + "5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",
|
|
n: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 " + "f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",
|
|
hash: hash.sha384,
|
|
gRed: false,
|
|
g: [
|
|
"aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 " + "5502f25d bf55296c 3a545e38 72760ab7",
|
|
"3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 " + "0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"
|
|
]
|
|
});
|
|
defineCurve("p521", {
|
|
type: "short",
|
|
prime: null,
|
|
p: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff",
|
|
a: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff fffffffc",
|
|
b: "00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b " + "99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd " + "3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",
|
|
n: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 " + "f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",
|
|
hash: hash.sha512,
|
|
gRed: false,
|
|
g: [
|
|
"000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 " + "053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 " + "a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66",
|
|
"00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 " + "579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 " + "3fad0761 353c7086 a272c240 88be9476 9fd16650"
|
|
]
|
|
});
|
|
defineCurve("curve25519", {
|
|
type: "mont",
|
|
prime: "p25519",
|
|
p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",
|
|
a: "76d06",
|
|
b: "1",
|
|
n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
"9"
|
|
]
|
|
});
|
|
defineCurve("ed25519", {
|
|
type: "edwards",
|
|
prime: "p25519",
|
|
p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",
|
|
a: "-1",
|
|
c: "1",
|
|
d: "52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",
|
|
n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
"216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a",
|
|
"6666666666666666666666666666666666666666666666666666666666666658"
|
|
]
|
|
});
|
|
var pre;
|
|
try {
|
|
pre = require_secp256k1();
|
|
} catch (e) {
|
|
pre = undefined;
|
|
}
|
|
defineCurve("secp256k1", {
|
|
type: "short",
|
|
prime: "k256",
|
|
p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",
|
|
a: "0",
|
|
b: "7",
|
|
n: "ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",
|
|
h: "1",
|
|
hash: hash.sha256,
|
|
beta: "7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",
|
|
lambda: "5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",
|
|
basis: [
|
|
{
|
|
a: "3086d221a7d46bcde86c90e49284eb15",
|
|
b: "-e4437ed6010e88286f547fa90abfe4c3"
|
|
},
|
|
{
|
|
a: "114ca50f7a8e2f3f657c1108d9d44cfd8",
|
|
b: "3086d221a7d46bcde86c90e49284eb15"
|
|
}
|
|
],
|
|
gRed: false,
|
|
g: [
|
|
"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
|
|
"483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
|
|
pre
|
|
]
|
|
});
|
|
});
|
|
|
|
// ../eve/node_modules/hmac-drbg/lib/hmac-drbg.js
|
|
var require_hmac_drbg = __commonJS((exports, module) => {
|
|
var hash = require_hash();
|
|
var utils = require_utils();
|
|
var assert = require_minimalistic_assert();
|
|
function HmacDRBG(options2) {
|
|
if (!(this instanceof HmacDRBG))
|
|
return new HmacDRBG(options2);
|
|
this.hash = options2.hash;
|
|
this.predResist = !!options2.predResist;
|
|
this.outLen = this.hash.outSize;
|
|
this.minEntropy = options2.minEntropy || this.hash.hmacStrength;
|
|
this._reseed = null;
|
|
this.reseedInterval = null;
|
|
this.K = null;
|
|
this.V = null;
|
|
var entropy = utils.toArray(options2.entropy, options2.entropyEnc || "hex");
|
|
var nonce = utils.toArray(options2.nonce, options2.nonceEnc || "hex");
|
|
var pers = utils.toArray(options2.pers, options2.persEnc || "hex");
|
|
assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits");
|
|
this._init(entropy, nonce, pers);
|
|
}
|
|
module.exports = HmacDRBG;
|
|
HmacDRBG.prototype._init = function init(entropy, nonce, pers) {
|
|
var seed = entropy.concat(nonce).concat(pers);
|
|
this.K = new Array(this.outLen / 8);
|
|
this.V = new Array(this.outLen / 8);
|
|
for (var i = 0;i < this.V.length; i++) {
|
|
this.K[i] = 0;
|
|
this.V[i] = 1;
|
|
}
|
|
this._update(seed);
|
|
this._reseed = 1;
|
|
this.reseedInterval = 281474976710656;
|
|
};
|
|
HmacDRBG.prototype._hmac = function hmac() {
|
|
return new hash.hmac(this.hash, this.K);
|
|
};
|
|
HmacDRBG.prototype._update = function update(seed) {
|
|
var kmac = this._hmac().update(this.V).update([0]);
|
|
if (seed)
|
|
kmac = kmac.update(seed);
|
|
this.K = kmac.digest();
|
|
this.V = this._hmac().update(this.V).digest();
|
|
if (!seed)
|
|
return;
|
|
this.K = this._hmac().update(this.V).update([1]).update(seed).digest();
|
|
this.V = this._hmac().update(this.V).digest();
|
|
};
|
|
HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {
|
|
if (typeof entropyEnc !== "string") {
|
|
addEnc = add;
|
|
add = entropyEnc;
|
|
entropyEnc = null;
|
|
}
|
|
entropy = utils.toArray(entropy, entropyEnc);
|
|
add = utils.toArray(add, addEnc);
|
|
assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits");
|
|
this._update(entropy.concat(add || []));
|
|
this._reseed = 1;
|
|
};
|
|
HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {
|
|
if (this._reseed > this.reseedInterval)
|
|
throw new Error("Reseed is required");
|
|
if (typeof enc !== "string") {
|
|
addEnc = add;
|
|
add = enc;
|
|
enc = null;
|
|
}
|
|
if (add) {
|
|
add = utils.toArray(add, addEnc || "hex");
|
|
this._update(add);
|
|
}
|
|
var temp = [];
|
|
while (temp.length < len) {
|
|
this.V = this._hmac().update(this.V).digest();
|
|
temp = temp.concat(this.V);
|
|
}
|
|
var res = temp.slice(0, len);
|
|
this._update(add);
|
|
this._reseed++;
|
|
return utils.encode(res, enc);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/ec/key.js
|
|
var require_key = __commonJS((exports, module) => {
|
|
var BN = require_bn();
|
|
var utils = require_utils2();
|
|
var assert = utils.assert;
|
|
function KeyPair(ec, options2) {
|
|
this.ec = ec;
|
|
this.priv = null;
|
|
this.pub = null;
|
|
if (options2.priv)
|
|
this._importPrivate(options2.priv, options2.privEnc);
|
|
if (options2.pub)
|
|
this._importPublic(options2.pub, options2.pubEnc);
|
|
}
|
|
module.exports = KeyPair;
|
|
KeyPair.fromPublic = function fromPublic(ec, pub, enc) {
|
|
if (pub instanceof KeyPair)
|
|
return pub;
|
|
return new KeyPair(ec, {
|
|
pub,
|
|
pubEnc: enc
|
|
});
|
|
};
|
|
KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {
|
|
if (priv instanceof KeyPair)
|
|
return priv;
|
|
return new KeyPair(ec, {
|
|
priv,
|
|
privEnc: enc
|
|
});
|
|
};
|
|
KeyPair.prototype.validate = function validate() {
|
|
var pub = this.getPublic();
|
|
if (pub.isInfinity())
|
|
return { result: false, reason: "Invalid public key" };
|
|
if (!pub.validate())
|
|
return { result: false, reason: "Public key is not a point" };
|
|
if (!pub.mul(this.ec.curve.n).isInfinity())
|
|
return { result: false, reason: "Public key * N != O" };
|
|
return { result: true, reason: null };
|
|
};
|
|
KeyPair.prototype.getPublic = function getPublic(compact, enc) {
|
|
if (typeof compact === "string") {
|
|
enc = compact;
|
|
compact = null;
|
|
}
|
|
if (!this.pub)
|
|
this.pub = this.ec.g.mul(this.priv);
|
|
if (!enc)
|
|
return this.pub;
|
|
return this.pub.encode(enc, compact);
|
|
};
|
|
KeyPair.prototype.getPrivate = function getPrivate(enc) {
|
|
if (enc === "hex")
|
|
return this.priv.toString(16, 2);
|
|
else
|
|
return this.priv;
|
|
};
|
|
KeyPair.prototype._importPrivate = function _importPrivate(key, enc) {
|
|
this.priv = new BN(key, enc || 16);
|
|
this.priv = this.priv.umod(this.ec.curve.n);
|
|
};
|
|
KeyPair.prototype._importPublic = function _importPublic(key, enc) {
|
|
if (key.x || key.y) {
|
|
if (this.ec.curve.type === "mont") {
|
|
assert(key.x, "Need x coordinate");
|
|
} else if (this.ec.curve.type === "short" || this.ec.curve.type === "edwards") {
|
|
assert(key.x && key.y, "Need both x and y coordinate");
|
|
}
|
|
this.pub = this.ec.curve.point(key.x, key.y);
|
|
return;
|
|
}
|
|
this.pub = this.ec.curve.decodePoint(key, enc);
|
|
};
|
|
KeyPair.prototype.derive = function derive(pub) {
|
|
if (!pub.validate()) {
|
|
assert(pub.validate(), "public point not validated");
|
|
}
|
|
return pub.mul(this.priv).getX();
|
|
};
|
|
KeyPair.prototype.sign = function sign(msg, enc, options2) {
|
|
return this.ec.sign(msg, this, enc, options2);
|
|
};
|
|
KeyPair.prototype.verify = function verify(msg, signature, options2) {
|
|
return this.ec.verify(msg, signature, this, undefined, options2);
|
|
};
|
|
KeyPair.prototype.inspect = function inspect() {
|
|
return "<Key priv: " + (this.priv && this.priv.toString(16, 2)) + " pub: " + (this.pub && this.pub.inspect()) + " >";
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/ec/signature.js
|
|
var require_signature = __commonJS((exports, module) => {
|
|
var BN = require_bn();
|
|
var utils = require_utils2();
|
|
var assert = utils.assert;
|
|
function Signature(options2, enc) {
|
|
if (options2 instanceof Signature)
|
|
return options2;
|
|
if (this._importDER(options2, enc))
|
|
return;
|
|
assert(options2.r && options2.s, "Signature without r or s");
|
|
this.r = new BN(options2.r, 16);
|
|
this.s = new BN(options2.s, 16);
|
|
if (options2.recoveryParam === undefined)
|
|
this.recoveryParam = null;
|
|
else
|
|
this.recoveryParam = options2.recoveryParam;
|
|
}
|
|
module.exports = Signature;
|
|
function Position() {
|
|
this.place = 0;
|
|
}
|
|
function getLength(buf, p) {
|
|
var initial = buf[p.place++];
|
|
if (!(initial & 128)) {
|
|
return initial;
|
|
}
|
|
var octetLen = initial & 15;
|
|
if (octetLen === 0 || octetLen > 4) {
|
|
return false;
|
|
}
|
|
if (buf[p.place] === 0) {
|
|
return false;
|
|
}
|
|
var val = 0;
|
|
for (var i = 0, off = p.place;i < octetLen; i++, off++) {
|
|
val <<= 8;
|
|
val |= buf[off];
|
|
val >>>= 0;
|
|
}
|
|
if (val <= 127) {
|
|
return false;
|
|
}
|
|
p.place = off;
|
|
return val;
|
|
}
|
|
function rmPadding(buf) {
|
|
var i = 0;
|
|
var len = buf.length - 1;
|
|
while (!buf[i] && !(buf[i + 1] & 128) && i < len) {
|
|
i++;
|
|
}
|
|
if (i === 0) {
|
|
return buf;
|
|
}
|
|
return buf.slice(i);
|
|
}
|
|
Signature.prototype._importDER = function _importDER(data, enc) {
|
|
data = utils.toArray(data, enc);
|
|
var p = new Position;
|
|
if (data[p.place++] !== 48) {
|
|
return false;
|
|
}
|
|
var len = getLength(data, p);
|
|
if (len === false) {
|
|
return false;
|
|
}
|
|
if (len + p.place !== data.length) {
|
|
return false;
|
|
}
|
|
if (data[p.place++] !== 2) {
|
|
return false;
|
|
}
|
|
var rlen = getLength(data, p);
|
|
if (rlen === false) {
|
|
return false;
|
|
}
|
|
if ((data[p.place] & 128) !== 0) {
|
|
return false;
|
|
}
|
|
var r = data.slice(p.place, rlen + p.place);
|
|
p.place += rlen;
|
|
if (data[p.place++] !== 2) {
|
|
return false;
|
|
}
|
|
var slen = getLength(data, p);
|
|
if (slen === false) {
|
|
return false;
|
|
}
|
|
if (data.length !== slen + p.place) {
|
|
return false;
|
|
}
|
|
if ((data[p.place] & 128) !== 0) {
|
|
return false;
|
|
}
|
|
var s = data.slice(p.place, slen + p.place);
|
|
if (r[0] === 0) {
|
|
if (r[1] & 128) {
|
|
r = r.slice(1);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
if (s[0] === 0) {
|
|
if (s[1] & 128) {
|
|
s = s.slice(1);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
this.r = new BN(r);
|
|
this.s = new BN(s);
|
|
this.recoveryParam = null;
|
|
return true;
|
|
};
|
|
function constructLength(arr, len) {
|
|
if (len < 128) {
|
|
arr.push(len);
|
|
return;
|
|
}
|
|
var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);
|
|
arr.push(octets | 128);
|
|
while (--octets) {
|
|
arr.push(len >>> (octets << 3) & 255);
|
|
}
|
|
arr.push(len);
|
|
}
|
|
Signature.prototype.toDER = function toDER(enc) {
|
|
var r = this.r.toArray();
|
|
var s = this.s.toArray();
|
|
if (r[0] & 128)
|
|
r = [0].concat(r);
|
|
if (s[0] & 128)
|
|
s = [0].concat(s);
|
|
r = rmPadding(r);
|
|
s = rmPadding(s);
|
|
while (!s[0] && !(s[1] & 128)) {
|
|
s = s.slice(1);
|
|
}
|
|
var arr = [2];
|
|
constructLength(arr, r.length);
|
|
arr = arr.concat(r);
|
|
arr.push(2);
|
|
constructLength(arr, s.length);
|
|
var backHalf = arr.concat(s);
|
|
var res = [48];
|
|
constructLength(res, backHalf.length);
|
|
res = res.concat(backHalf);
|
|
return utils.encode(res, enc);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/ec/index.js
|
|
var require_ec = __commonJS((exports, module) => {
|
|
var BN = require_bn();
|
|
var HmacDRBG = require_hmac_drbg();
|
|
var utils = require_utils2();
|
|
var curves = require_curves();
|
|
var rand = require_brorand();
|
|
var assert = utils.assert;
|
|
var KeyPair = require_key();
|
|
var Signature = require_signature();
|
|
function EC(options2) {
|
|
if (!(this instanceof EC))
|
|
return new EC(options2);
|
|
if (typeof options2 === "string") {
|
|
assert(Object.prototype.hasOwnProperty.call(curves, options2), "Unknown curve " + options2);
|
|
options2 = curves[options2];
|
|
}
|
|
if (options2 instanceof curves.PresetCurve)
|
|
options2 = { curve: options2 };
|
|
this.curve = options2.curve.curve;
|
|
this.n = this.curve.n;
|
|
this.nh = this.n.ushrn(1);
|
|
this.g = this.curve.g;
|
|
this.g = options2.curve.g;
|
|
this.g.precompute(options2.curve.n.bitLength() + 1);
|
|
this.hash = options2.hash || options2.curve.hash;
|
|
}
|
|
module.exports = EC;
|
|
EC.prototype.keyPair = function keyPair(options2) {
|
|
return new KeyPair(this, options2);
|
|
};
|
|
EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {
|
|
return KeyPair.fromPrivate(this, priv, enc);
|
|
};
|
|
EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {
|
|
return KeyPair.fromPublic(this, pub, enc);
|
|
};
|
|
EC.prototype.genKeyPair = function genKeyPair(options2) {
|
|
if (!options2)
|
|
options2 = {};
|
|
var drbg = new HmacDRBG({
|
|
hash: this.hash,
|
|
pers: options2.pers,
|
|
persEnc: options2.persEnc || "utf8",
|
|
entropy: options2.entropy || rand(this.hash.hmacStrength),
|
|
entropyEnc: options2.entropy && options2.entropyEnc || "utf8",
|
|
nonce: this.n.toArray()
|
|
});
|
|
var bytes = this.n.byteLength();
|
|
var ns2 = this.n.sub(new BN(2));
|
|
for (;; ) {
|
|
var priv = new BN(drbg.generate(bytes));
|
|
if (priv.cmp(ns2) > 0)
|
|
continue;
|
|
priv.iaddn(1);
|
|
return this.keyFromPrivate(priv);
|
|
}
|
|
};
|
|
EC.prototype._truncateToN = function _truncateToN(msg, truncOnly, bitLength) {
|
|
var byteLength;
|
|
if (BN.isBN(msg) || typeof msg === "number") {
|
|
msg = new BN(msg, 16);
|
|
byteLength = msg.byteLength();
|
|
} else if (typeof msg === "object") {
|
|
byteLength = msg.length;
|
|
msg = new BN(msg, 16);
|
|
} else {
|
|
var str = msg.toString();
|
|
byteLength = str.length + 1 >>> 1;
|
|
msg = new BN(str, 16);
|
|
}
|
|
if (typeof bitLength !== "number") {
|
|
bitLength = byteLength * 8;
|
|
}
|
|
var delta = bitLength - this.n.bitLength();
|
|
if (delta > 0)
|
|
msg = msg.ushrn(delta);
|
|
if (!truncOnly && msg.cmp(this.n) >= 0)
|
|
return msg.sub(this.n);
|
|
else
|
|
return msg;
|
|
};
|
|
EC.prototype.sign = function sign(msg, key, enc, options2) {
|
|
if (typeof enc === "object") {
|
|
options2 = enc;
|
|
enc = null;
|
|
}
|
|
if (!options2)
|
|
options2 = {};
|
|
if (typeof msg !== "string" && typeof msg !== "number" && !BN.isBN(msg)) {
|
|
assert(typeof msg === "object" && msg && typeof msg.length === "number", "Expected message to be an array-like, a hex string, or a BN instance");
|
|
assert(msg.length >>> 0 === msg.length);
|
|
for (var i = 0;i < msg.length; i++)
|
|
assert((msg[i] & 255) === msg[i]);
|
|
}
|
|
key = this.keyFromPrivate(key, enc);
|
|
msg = this._truncateToN(msg, false, options2.msgBitLength);
|
|
assert(!msg.isNeg(), "Can not sign a negative message");
|
|
var bytes = this.n.byteLength();
|
|
var bkey = key.getPrivate().toArray("be", bytes);
|
|
var nonce = msg.toArray("be", bytes);
|
|
assert(new BN(nonce).eq(msg), "Can not sign message");
|
|
var drbg = new HmacDRBG({
|
|
hash: this.hash,
|
|
entropy: bkey,
|
|
nonce,
|
|
pers: options2.pers,
|
|
persEnc: options2.persEnc || "utf8"
|
|
});
|
|
var ns1 = this.n.sub(new BN(1));
|
|
for (var iter = 0;; iter++) {
|
|
var k = options2.k ? options2.k(iter) : new BN(drbg.generate(this.n.byteLength()));
|
|
k = this._truncateToN(k, true);
|
|
if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)
|
|
continue;
|
|
var kp = this.g.mul(k);
|
|
if (kp.isInfinity())
|
|
continue;
|
|
var kpX = kp.getX();
|
|
var r = kpX.umod(this.n);
|
|
if (r.cmpn(0) === 0)
|
|
continue;
|
|
var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));
|
|
s = s.umod(this.n);
|
|
if (s.cmpn(0) === 0)
|
|
continue;
|
|
var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0);
|
|
if (options2.canonical && s.cmp(this.nh) > 0) {
|
|
s = this.n.sub(s);
|
|
recoveryParam ^= 1;
|
|
}
|
|
return new Signature({ r, s, recoveryParam });
|
|
}
|
|
};
|
|
EC.prototype.verify = function verify(msg, signature, key, enc, options2) {
|
|
if (!options2)
|
|
options2 = {};
|
|
msg = this._truncateToN(msg, false, options2.msgBitLength);
|
|
key = this.keyFromPublic(key, enc);
|
|
signature = new Signature(signature, "hex");
|
|
var r = signature.r;
|
|
var s = signature.s;
|
|
if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)
|
|
return false;
|
|
if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)
|
|
return false;
|
|
var sinv = s.invm(this.n);
|
|
var u1 = sinv.mul(msg).umod(this.n);
|
|
var u2 = sinv.mul(r).umod(this.n);
|
|
var p;
|
|
if (!this.curve._maxwellTrick) {
|
|
p = this.g.mulAdd(u1, key.getPublic(), u2);
|
|
if (p.isInfinity())
|
|
return false;
|
|
return p.getX().umod(this.n).cmp(r) === 0;
|
|
}
|
|
p = this.g.jmulAdd(u1, key.getPublic(), u2);
|
|
if (p.isInfinity())
|
|
return false;
|
|
return p.eqXToP(r);
|
|
};
|
|
EC.prototype.recoverPubKey = function(msg, signature, j, enc) {
|
|
assert((3 & j) === j, "The recovery param is more than two bits");
|
|
signature = new Signature(signature, enc);
|
|
var n = this.n;
|
|
var e = new BN(msg);
|
|
var r = signature.r;
|
|
var s = signature.s;
|
|
var isYOdd = j & 1;
|
|
var isSecondKey = j >> 1;
|
|
if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)
|
|
throw new Error("Unable to find sencond key candinate");
|
|
if (isSecondKey)
|
|
r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);
|
|
else
|
|
r = this.curve.pointFromX(r, isYOdd);
|
|
var rInv = signature.r.invm(n);
|
|
var s1 = n.sub(e).mul(rInv).umod(n);
|
|
var s2 = s.mul(rInv).umod(n);
|
|
return this.g.mulAdd(s1, r, s2);
|
|
};
|
|
EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {
|
|
signature = new Signature(signature, enc);
|
|
if (signature.recoveryParam !== null)
|
|
return signature.recoveryParam;
|
|
for (var i = 0;i < 4; i++) {
|
|
var Qprime;
|
|
try {
|
|
Qprime = this.recoverPubKey(e, signature, i);
|
|
} catch (e2) {
|
|
continue;
|
|
}
|
|
if (Qprime.eq(Q))
|
|
return i;
|
|
}
|
|
throw new Error("Unable to find valid recovery factor");
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/eddsa/key.js
|
|
var require_key2 = __commonJS((exports, module) => {
|
|
var utils = require_utils2();
|
|
var assert = utils.assert;
|
|
var parseBytes = utils.parseBytes;
|
|
var cachedProperty = utils.cachedProperty;
|
|
function KeyPair(eddsa, params) {
|
|
this.eddsa = eddsa;
|
|
this._secret = parseBytes(params.secret);
|
|
if (eddsa.isPoint(params.pub))
|
|
this._pub = params.pub;
|
|
else
|
|
this._pubBytes = parseBytes(params.pub);
|
|
}
|
|
KeyPair.fromPublic = function fromPublic(eddsa, pub) {
|
|
if (pub instanceof KeyPair)
|
|
return pub;
|
|
return new KeyPair(eddsa, { pub });
|
|
};
|
|
KeyPair.fromSecret = function fromSecret(eddsa, secret) {
|
|
if (secret instanceof KeyPair)
|
|
return secret;
|
|
return new KeyPair(eddsa, { secret });
|
|
};
|
|
KeyPair.prototype.secret = function secret() {
|
|
return this._secret;
|
|
};
|
|
cachedProperty(KeyPair, "pubBytes", function pubBytes() {
|
|
return this.eddsa.encodePoint(this.pub());
|
|
});
|
|
cachedProperty(KeyPair, "pub", function pub() {
|
|
if (this._pubBytes)
|
|
return this.eddsa.decodePoint(this._pubBytes);
|
|
return this.eddsa.g.mul(this.priv());
|
|
});
|
|
cachedProperty(KeyPair, "privBytes", function privBytes() {
|
|
var eddsa = this.eddsa;
|
|
var hash = this.hash();
|
|
var lastIx = eddsa.encodingLength - 1;
|
|
var a = hash.slice(0, eddsa.encodingLength);
|
|
a[0] &= 248;
|
|
a[lastIx] &= 127;
|
|
a[lastIx] |= 64;
|
|
return a;
|
|
});
|
|
cachedProperty(KeyPair, "priv", function priv() {
|
|
return this.eddsa.decodeInt(this.privBytes());
|
|
});
|
|
cachedProperty(KeyPair, "hash", function hash() {
|
|
return this.eddsa.hash().update(this.secret()).digest();
|
|
});
|
|
cachedProperty(KeyPair, "messagePrefix", function messagePrefix() {
|
|
return this.hash().slice(this.eddsa.encodingLength);
|
|
});
|
|
KeyPair.prototype.sign = function sign(message) {
|
|
assert(this._secret, "KeyPair can only verify");
|
|
return this.eddsa.sign(message, this);
|
|
};
|
|
KeyPair.prototype.verify = function verify(message, sig) {
|
|
return this.eddsa.verify(message, sig, this);
|
|
};
|
|
KeyPair.prototype.getSecret = function getSecret(enc) {
|
|
assert(this._secret, "KeyPair is public only");
|
|
return utils.encode(this.secret(), enc);
|
|
};
|
|
KeyPair.prototype.getPublic = function getPublic(enc) {
|
|
return utils.encode(this.pubBytes(), enc);
|
|
};
|
|
module.exports = KeyPair;
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/eddsa/signature.js
|
|
var require_signature2 = __commonJS((exports, module) => {
|
|
var BN = require_bn();
|
|
var utils = require_utils2();
|
|
var assert = utils.assert;
|
|
var cachedProperty = utils.cachedProperty;
|
|
var parseBytes = utils.parseBytes;
|
|
function Signature(eddsa, sig) {
|
|
this.eddsa = eddsa;
|
|
if (typeof sig !== "object")
|
|
sig = parseBytes(sig);
|
|
if (Array.isArray(sig)) {
|
|
assert(sig.length === eddsa.encodingLength * 2, "Signature has invalid size");
|
|
sig = {
|
|
R: sig.slice(0, eddsa.encodingLength),
|
|
S: sig.slice(eddsa.encodingLength)
|
|
};
|
|
}
|
|
assert(sig.R && sig.S, "Signature without R or S");
|
|
if (eddsa.isPoint(sig.R))
|
|
this._R = sig.R;
|
|
if (sig.S instanceof BN)
|
|
this._S = sig.S;
|
|
this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;
|
|
this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;
|
|
}
|
|
cachedProperty(Signature, "S", function S() {
|
|
return this.eddsa.decodeInt(this.Sencoded());
|
|
});
|
|
cachedProperty(Signature, "R", function R() {
|
|
return this.eddsa.decodePoint(this.Rencoded());
|
|
});
|
|
cachedProperty(Signature, "Rencoded", function Rencoded() {
|
|
return this.eddsa.encodePoint(this.R());
|
|
});
|
|
cachedProperty(Signature, "Sencoded", function Sencoded() {
|
|
return this.eddsa.encodeInt(this.S());
|
|
});
|
|
Signature.prototype.toBytes = function toBytes() {
|
|
return this.Rencoded().concat(this.Sencoded());
|
|
};
|
|
Signature.prototype.toHex = function toHex() {
|
|
return utils.encode(this.toBytes(), "hex").toUpperCase();
|
|
};
|
|
module.exports = Signature;
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/eddsa/index.js
|
|
var require_eddsa = __commonJS((exports, module) => {
|
|
var hash = require_hash();
|
|
var curves = require_curves();
|
|
var utils = require_utils2();
|
|
var assert = utils.assert;
|
|
var parseBytes = utils.parseBytes;
|
|
var KeyPair = require_key2();
|
|
var Signature = require_signature2();
|
|
function EDDSA(curve) {
|
|
assert(curve === "ed25519", "only tested with ed25519 so far");
|
|
if (!(this instanceof EDDSA))
|
|
return new EDDSA(curve);
|
|
curve = curves[curve].curve;
|
|
this.curve = curve;
|
|
this.g = curve.g;
|
|
this.g.precompute(curve.n.bitLength() + 1);
|
|
this.pointClass = curve.point().constructor;
|
|
this.encodingLength = Math.ceil(curve.n.bitLength() / 8);
|
|
this.hash = hash.sha512;
|
|
}
|
|
module.exports = EDDSA;
|
|
EDDSA.prototype.sign = function sign(message, secret) {
|
|
message = parseBytes(message);
|
|
var key = this.keyFromSecret(secret);
|
|
var r = this.hashInt(key.messagePrefix(), message);
|
|
var R = this.g.mul(r);
|
|
var Rencoded = this.encodePoint(R);
|
|
var s_ = this.hashInt(Rencoded, key.pubBytes(), message).mul(key.priv());
|
|
var S = r.add(s_).umod(this.curve.n);
|
|
return this.makeSignature({ R, S, Rencoded });
|
|
};
|
|
EDDSA.prototype.verify = function verify(message, sig, pub) {
|
|
message = parseBytes(message);
|
|
sig = this.makeSignature(sig);
|
|
if (sig.S().gte(sig.eddsa.curve.n) || sig.S().isNeg()) {
|
|
return false;
|
|
}
|
|
var key = this.keyFromPublic(pub);
|
|
var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);
|
|
var SG = this.g.mul(sig.S());
|
|
var RplusAh = sig.R().add(key.pub().mul(h));
|
|
return RplusAh.eq(SG);
|
|
};
|
|
EDDSA.prototype.hashInt = function hashInt() {
|
|
var hash2 = this.hash();
|
|
for (var i = 0;i < arguments.length; i++)
|
|
hash2.update(arguments[i]);
|
|
return utils.intFromLE(hash2.digest()).umod(this.curve.n);
|
|
};
|
|
EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {
|
|
return KeyPair.fromPublic(this, pub);
|
|
};
|
|
EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {
|
|
return KeyPair.fromSecret(this, secret);
|
|
};
|
|
EDDSA.prototype.makeSignature = function makeSignature(sig) {
|
|
if (sig instanceof Signature)
|
|
return sig;
|
|
return new Signature(this, sig);
|
|
};
|
|
EDDSA.prototype.encodePoint = function encodePoint(point) {
|
|
var enc = point.getY().toArray("le", this.encodingLength);
|
|
enc[this.encodingLength - 1] |= point.getX().isOdd() ? 128 : 0;
|
|
return enc;
|
|
};
|
|
EDDSA.prototype.decodePoint = function decodePoint(bytes) {
|
|
bytes = utils.parseBytes(bytes);
|
|
var lastIx = bytes.length - 1;
|
|
var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~128);
|
|
var xIsOdd = (bytes[lastIx] & 128) !== 0;
|
|
var y = utils.intFromLE(normed);
|
|
return this.curve.pointFromY(y, xIsOdd);
|
|
};
|
|
EDDSA.prototype.encodeInt = function encodeInt(num) {
|
|
return num.toArray("le", this.encodingLength);
|
|
};
|
|
EDDSA.prototype.decodeInt = function decodeInt(bytes) {
|
|
return utils.intFromLE(bytes);
|
|
};
|
|
EDDSA.prototype.isPoint = function isPoint(val) {
|
|
return val instanceof this.pointClass;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic.js
|
|
var require_elliptic = __commonJS((exports) => {
|
|
var elliptic = exports;
|
|
elliptic.version = require_package().version;
|
|
elliptic.utils = require_utils2();
|
|
elliptic.rand = require_brorand();
|
|
elliptic.curve = require_curve();
|
|
elliptic.curves = require_curves();
|
|
elliptic.ec = require_ec();
|
|
elliptic.eddsa = require_eddsa();
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/b64-to-bn.js
|
|
var require_b64_to_bn = __commonJS((exports, module) => {
|
|
var BN = require_asn1().bignum;
|
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
module.exports = function base64ToBigNum(val, zero) {
|
|
var buf = Buffer2.from(val, "base64");
|
|
var bn = val = new BN(buf, 10, "be").iabs();
|
|
if (zero) {
|
|
buf.fill(0);
|
|
}
|
|
return bn;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/asn1/algorithm-identifier.js
|
|
var require_algorithm_identifier = __commonJS((exports, module) => {
|
|
module.exports = require_asn1().define("AlgorithmIdentifer", function() {
|
|
this.seq().obj(this.key("algorithm").objid(), this.key("parameters").optional().any());
|
|
});
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/asn1/public-key-info.js
|
|
var require_public_key_info = __commonJS((exports, module) => {
|
|
var AlgorithmIdentifier = require_algorithm_identifier();
|
|
module.exports = require_asn1().define("PublicKeyInfo", function() {
|
|
this.seq().obj(this.key("algorithm").use(AlgorithmIdentifier), this.key("PublicKey").bitstr());
|
|
});
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/asn1/version.js
|
|
var require_version = __commonJS((exports, module) => {
|
|
module.exports = require_asn1().define("Version", function() {
|
|
this.int();
|
|
});
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/asn1/private-key-info.js
|
|
var require_private_key_info = __commonJS((exports, module) => {
|
|
var AlgorithmIdentifier = require_algorithm_identifier();
|
|
var Version = require_version();
|
|
module.exports = require_asn1().define("PrivateKeyInfo", function() {
|
|
this.seq().obj(this.key("version").use(Version), this.key("privateKeyAlgorithm").use(AlgorithmIdentifier), this.key("privateKey").octstr(), this.key("attributes").optional().any());
|
|
});
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/ec.js
|
|
var require_ec2 = __commonJS((exports, module) => {
|
|
var asn1 = require_asn1();
|
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
var EC = require_elliptic().ec;
|
|
var b64ToBn = require_b64_to_bn();
|
|
var PublicKeyInfo = require_public_key_info();
|
|
var PrivateKeyInfo = require_private_key_info();
|
|
var Version = require_version();
|
|
var ECParameters = asn1.define("ECParameters", function() {
|
|
this.choice({
|
|
namedCurve: this.objid()
|
|
});
|
|
});
|
|
var ecPrivkeyVer1 = 1;
|
|
var ECPrivateKey = asn1.define("ECPrivateKey", function() {
|
|
this.seq().obj(this.key("version").use(Version), this.key("privateKey").octstr(), this.key("parameters").explicit(0).optional().any(), this.key("publicKey").explicit(1).optional().bitstr());
|
|
});
|
|
var curves = {
|
|
"P-256": "p256",
|
|
"P-384": "p384",
|
|
"P-521": "p521"
|
|
};
|
|
var oids = {
|
|
"P-256": [1, 2, 840, 10045, 3, 1, 7],
|
|
"P-384": [1, 3, 132, 0, 34],
|
|
"P-521": [1, 3, 132, 0, 35]
|
|
};
|
|
var parameters = {};
|
|
var algorithms = {};
|
|
Object.keys(oids).forEach(function(crv) {
|
|
parameters[crv] = ECParameters.encode({
|
|
type: "namedCurve",
|
|
value: oids[crv]
|
|
}, "der");
|
|
algorithms[crv] = {
|
|
algorithm: [1, 2, 840, 10045, 2, 1],
|
|
parameters: parameters[crv]
|
|
};
|
|
});
|
|
oids = null;
|
|
function ecJwkToBuffer(jwk, opts) {
|
|
if (typeof jwk.crv !== "string") {
|
|
throw new TypeError('Expected "jwk.crv" to be a String');
|
|
}
|
|
var hasD = typeof jwk.d === "string";
|
|
var xyTypes = hasD ? ["undefined", "string"] : ["string"];
|
|
if (xyTypes.indexOf(typeof jwk.x) === -1) {
|
|
throw new TypeError('Expected "jwk.x" to be a String');
|
|
}
|
|
if (xyTypes.indexOf(typeof jwk.y) === -1) {
|
|
throw new TypeError('Expected "jwk.y" to be a String');
|
|
}
|
|
if (opts.private && !hasD) {
|
|
throw new TypeError('Expected "jwk.d" to be a String');
|
|
}
|
|
var curveName = curves[jwk.crv];
|
|
if (!curveName) {
|
|
throw new Error('Unsupported curve "' + jwk.crv + '"');
|
|
}
|
|
var curve = new EC(curveName);
|
|
var key = {};
|
|
var hasPub = jwk.x && jwk.y;
|
|
if (hasPub) {
|
|
key.pub = {
|
|
x: b64ToBn(jwk.x, false),
|
|
y: b64ToBn(jwk.y, false)
|
|
};
|
|
}
|
|
if (opts.private || !hasPub) {
|
|
key.priv = b64ToBn(jwk.d, true);
|
|
}
|
|
key = curve.keyPair(key);
|
|
var keyValidation = key.validate();
|
|
if (!keyValidation.result) {
|
|
throw new Error('Invalid key for curve: "' + keyValidation.reason + '"');
|
|
}
|
|
var result = keyToPem(jwk.crv, key, opts);
|
|
return result;
|
|
}
|
|
function keyToPem(crv, key, opts) {
|
|
var compact = false;
|
|
var publicKey = key.getPublic(compact, "hex");
|
|
publicKey = Buffer2.from(publicKey, "hex");
|
|
publicKey = {
|
|
unused: 0,
|
|
data: publicKey
|
|
};
|
|
var result;
|
|
if (opts.private) {
|
|
var privateKey = key.getPrivate("hex");
|
|
privateKey = Buffer2.from(privateKey, "hex");
|
|
result = PrivateKeyInfo.encode({
|
|
version: 0,
|
|
privateKeyAlgorithm: algorithms[crv],
|
|
privateKey: ECPrivateKey.encode({
|
|
version: ecPrivkeyVer1,
|
|
privateKey,
|
|
parameters: parameters[crv],
|
|
publicKey
|
|
}, "der")
|
|
}, "pem", {
|
|
label: "PRIVATE KEY"
|
|
});
|
|
privateKey.fill(0);
|
|
} else {
|
|
result = PublicKeyInfo.encode({
|
|
algorithm: algorithms[crv],
|
|
PublicKey: publicKey
|
|
}, "pem", {
|
|
label: "PUBLIC KEY"
|
|
});
|
|
}
|
|
if (result.slice(-1) !== `
|
|
`) {
|
|
result += `
|
|
`;
|
|
}
|
|
return result;
|
|
}
|
|
module.exports = ecJwkToBuffer;
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/rsa.js
|
|
var require_rsa = __commonJS((exports, module) => {
|
|
var asn1 = require_asn1();
|
|
var b64ToBn = require_b64_to_bn();
|
|
var PublicKeyInfo = require_public_key_info();
|
|
var PrivateKeyInfo = require_private_key_info();
|
|
var Version = require_version();
|
|
var RSAPrivateKey = asn1.define("RSAPrivateKey", function() {
|
|
this.seq().obj(this.key("version").use(Version), this.key("modulus").int(), this.key("publicExponent").int(), this.key("privateExponent").int(), this.key("prime1").int(), this.key("prime2").int(), this.key("exponent1").int(), this.key("exponent2").int(), this.key("coefficient").int());
|
|
});
|
|
var RSAPublicKey = asn1.define("RSAPublicKey", function() {
|
|
this.seq().obj(this.key("modulus").int(), this.key("publicExponent").int());
|
|
});
|
|
var algorithm = {
|
|
algorithm: [1, 2, 840, 113549, 1, 1, 1],
|
|
parameters: [5, 0]
|
|
};
|
|
function rsaJwkToBuffer(jwk, opts) {
|
|
if (typeof jwk.e !== "string") {
|
|
throw new TypeError('Expected "jwk.e" to be a String');
|
|
}
|
|
if (typeof jwk.n !== "string") {
|
|
throw new TypeError('Expected "jwk.n" to be a String');
|
|
}
|
|
if (opts.private) {
|
|
if (typeof jwk.d !== "string") {
|
|
throw new TypeError('Expected "jwk.d" to be a String');
|
|
}
|
|
if (typeof jwk.p !== "string") {
|
|
throw new TypeError('Expected "jwk.p" to be a String');
|
|
}
|
|
if (typeof jwk.q !== "string") {
|
|
throw new TypeError('Expected "jwk.q" to be a String');
|
|
}
|
|
if (typeof jwk.dp !== "string") {
|
|
throw new TypeError('Expected "jwk.dp" to be a String');
|
|
}
|
|
if (typeof jwk.dq !== "string") {
|
|
throw new TypeError('Expected "jwk.dq" to be a String');
|
|
}
|
|
if (typeof jwk.qi !== "string") {
|
|
throw new TypeError('Expected "jwk.qi" to be a String');
|
|
}
|
|
}
|
|
var pem;
|
|
if (opts.private) {
|
|
pem = PrivateKeyInfo.encode({
|
|
version: 0,
|
|
privateKeyAlgorithm: algorithm,
|
|
privateKey: RSAPrivateKey.encode({
|
|
version: 0,
|
|
modulus: b64ToBn(jwk.n, false),
|
|
publicExponent: b64ToBn(jwk.e, false),
|
|
privateExponent: b64ToBn(jwk.d, true),
|
|
prime1: b64ToBn(jwk.p, true),
|
|
prime2: b64ToBn(jwk.q, true),
|
|
exponent1: b64ToBn(jwk.dp, true),
|
|
exponent2: b64ToBn(jwk.dq, true),
|
|
coefficient: b64ToBn(jwk.qi, true)
|
|
}, "der")
|
|
}, "pem", {
|
|
label: "PRIVATE KEY"
|
|
});
|
|
} else {
|
|
pem = PublicKeyInfo.encode({
|
|
algorithm,
|
|
PublicKey: {
|
|
unused: 0,
|
|
data: RSAPublicKey.encode({
|
|
modulus: b64ToBn(jwk.n, false),
|
|
publicExponent: b64ToBn(jwk.e, false)
|
|
}, "der")
|
|
}
|
|
}, "pem", {
|
|
label: "PUBLIC KEY"
|
|
});
|
|
}
|
|
if (pem.slice(-1) !== `
|
|
`) {
|
|
pem += `
|
|
`;
|
|
}
|
|
return pem;
|
|
}
|
|
module.exports = rsaJwkToBuffer;
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/jwk-to-pem.js
|
|
var require_jwk_to_pem = __commonJS((exports, module) => {
|
|
var ec = require_ec2();
|
|
var rsa = require_rsa();
|
|
function jwkToBuffer(jwk, opts) {
|
|
if (typeof jwk !== "object" || jwk === null) {
|
|
throw new TypeError('Expected "jwk" to be an Object');
|
|
}
|
|
var kty = jwk.kty;
|
|
if (typeof kty !== "string") {
|
|
throw new TypeError('Expected "jwk.kty" to be a String');
|
|
}
|
|
opts = opts || {};
|
|
opts.private = opts.private === true;
|
|
switch (kty) {
|
|
case "EC": {
|
|
return ec(jwk, opts);
|
|
}
|
|
case "RSA": {
|
|
return rsa(jwk, opts);
|
|
}
|
|
default: {
|
|
throw new Error('Unsupported key type "' + kty + '"');
|
|
}
|
|
}
|
|
}
|
|
module.exports = jwkToBuffer;
|
|
});
|
|
|
|
// ../eve/dist/_virtual/rolldown_runtime.js
|
|
var __defProp2 = Object.defineProperty;
|
|
var __export = (target, all) => {
|
|
for (var name in all)
|
|
__defProp2(target, name, {
|
|
get: all[name],
|
|
enumerable: true
|
|
});
|
|
};
|
|
|
|
// ../eve/node_modules/drizzle-orm/entity.js
|
|
var entityKind = Symbol.for("drizzle:entityKind");
|
|
var hasOwnEntityKind = Symbol.for("drizzle:hasOwnEntityKind");
|
|
function is(value, type) {
|
|
if (!value || typeof value !== "object") {
|
|
return false;
|
|
}
|
|
if (value instanceof type) {
|
|
return true;
|
|
}
|
|
if (!Object.prototype.hasOwnProperty.call(type, entityKind)) {
|
|
throw new Error(`Class "${type.name ?? "<unknown>"}" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`);
|
|
}
|
|
let cls = Object.getPrototypeOf(value).constructor;
|
|
if (cls) {
|
|
while (cls) {
|
|
if (entityKind in cls && cls[entityKind] === type[entityKind]) {
|
|
return true;
|
|
}
|
|
cls = Object.getPrototypeOf(cls);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/column.js
|
|
class Column {
|
|
constructor(table, config) {
|
|
this.table = table;
|
|
this.config = config;
|
|
this.name = config.name;
|
|
this.keyAsName = config.keyAsName;
|
|
this.notNull = config.notNull;
|
|
this.default = config.default;
|
|
this.defaultFn = config.defaultFn;
|
|
this.onUpdateFn = config.onUpdateFn;
|
|
this.hasDefault = config.hasDefault;
|
|
this.primary = config.primaryKey;
|
|
this.isUnique = config.isUnique;
|
|
this.uniqueName = config.uniqueName;
|
|
this.uniqueType = config.uniqueType;
|
|
this.dataType = config.dataType;
|
|
this.columnType = config.columnType;
|
|
this.generated = config.generated;
|
|
this.generatedIdentity = config.generatedIdentity;
|
|
}
|
|
static [entityKind] = "Column";
|
|
name;
|
|
keyAsName;
|
|
primary;
|
|
notNull;
|
|
default;
|
|
defaultFn;
|
|
onUpdateFn;
|
|
hasDefault;
|
|
isUnique;
|
|
uniqueName;
|
|
uniqueType;
|
|
dataType;
|
|
columnType;
|
|
enumValues = undefined;
|
|
generated = undefined;
|
|
generatedIdentity = undefined;
|
|
config;
|
|
mapFromDriverValue(value) {
|
|
return value;
|
|
}
|
|
mapToDriverValue(value) {
|
|
return value;
|
|
}
|
|
shouldDisableInsert() {
|
|
return this.config.generated !== undefined && this.config.generated.type !== "byDefault";
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/column-builder.js
|
|
class ColumnBuilder {
|
|
static [entityKind] = "ColumnBuilder";
|
|
config;
|
|
constructor(name, dataType, columnType) {
|
|
this.config = {
|
|
name,
|
|
keyAsName: name === "",
|
|
notNull: false,
|
|
default: undefined,
|
|
hasDefault: false,
|
|
primaryKey: false,
|
|
isUnique: false,
|
|
uniqueName: undefined,
|
|
uniqueType: undefined,
|
|
dataType,
|
|
columnType,
|
|
generated: undefined
|
|
};
|
|
}
|
|
$type() {
|
|
return this;
|
|
}
|
|
notNull() {
|
|
this.config.notNull = true;
|
|
return this;
|
|
}
|
|
default(value) {
|
|
this.config.default = value;
|
|
this.config.hasDefault = true;
|
|
return this;
|
|
}
|
|
$defaultFn(fn) {
|
|
this.config.defaultFn = fn;
|
|
this.config.hasDefault = true;
|
|
return this;
|
|
}
|
|
$default = this.$defaultFn;
|
|
$onUpdateFn(fn) {
|
|
this.config.onUpdateFn = fn;
|
|
this.config.hasDefault = true;
|
|
return this;
|
|
}
|
|
$onUpdate = this.$onUpdateFn;
|
|
primaryKey() {
|
|
this.config.primaryKey = true;
|
|
this.config.notNull = true;
|
|
return this;
|
|
}
|
|
setName(name) {
|
|
if (this.config.name !== "")
|
|
return;
|
|
this.config.name = name;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/table.utils.js
|
|
var TableName = Symbol.for("drizzle:Name");
|
|
|
|
// ../eve/node_modules/drizzle-orm/tracing-utils.js
|
|
function iife(fn, ...args) {
|
|
return fn(...args);
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/pg-core/unique-constraint.js
|
|
function uniqueKeyName(table, columns) {
|
|
return `${table[TableName]}_${columns.join("_")}_unique`;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/pg-core/columns/common.js
|
|
class PgColumn extends Column {
|
|
constructor(table, config) {
|
|
if (!config.uniqueName) {
|
|
config.uniqueName = uniqueKeyName(table, [config.name]);
|
|
}
|
|
super(table, config);
|
|
this.table = table;
|
|
}
|
|
static [entityKind] = "PgColumn";
|
|
}
|
|
|
|
class ExtraConfigColumn extends PgColumn {
|
|
static [entityKind] = "ExtraConfigColumn";
|
|
getSQLType() {
|
|
return this.getSQLType();
|
|
}
|
|
indexConfig = {
|
|
order: this.config.order ?? "asc",
|
|
nulls: this.config.nulls ?? "last",
|
|
opClass: this.config.opClass
|
|
};
|
|
defaultConfig = {
|
|
order: "asc",
|
|
nulls: "last",
|
|
opClass: undefined
|
|
};
|
|
asc() {
|
|
this.indexConfig.order = "asc";
|
|
return this;
|
|
}
|
|
desc() {
|
|
this.indexConfig.order = "desc";
|
|
return this;
|
|
}
|
|
nullsFirst() {
|
|
this.indexConfig.nulls = "first";
|
|
return this;
|
|
}
|
|
nullsLast() {
|
|
this.indexConfig.nulls = "last";
|
|
return this;
|
|
}
|
|
op(opClass) {
|
|
this.indexConfig.opClass = opClass;
|
|
return this;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/pg-core/columns/enum.js
|
|
class PgEnumObjectColumn extends PgColumn {
|
|
static [entityKind] = "PgEnumObjectColumn";
|
|
enum;
|
|
enumValues = this.config.enum.enumValues;
|
|
constructor(table, config) {
|
|
super(table, config);
|
|
this.enum = config.enum;
|
|
}
|
|
getSQLType() {
|
|
return this.enum.enumName;
|
|
}
|
|
}
|
|
var isPgEnumSym = Symbol.for("drizzle:isPgEnum");
|
|
function isPgEnum(obj) {
|
|
return !!obj && typeof obj === "function" && isPgEnumSym in obj && obj[isPgEnumSym] === true;
|
|
}
|
|
class PgEnumColumn extends PgColumn {
|
|
static [entityKind] = "PgEnumColumn";
|
|
enum = this.config.enum;
|
|
enumValues = this.config.enum.enumValues;
|
|
constructor(table, config) {
|
|
super(table, config);
|
|
this.enum = config.enum;
|
|
}
|
|
getSQLType() {
|
|
return this.enum.enumName;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/subquery.js
|
|
class Subquery {
|
|
static [entityKind] = "Subquery";
|
|
constructor(sql, fields, alias, isWith = false, usedTables = []) {
|
|
this._ = {
|
|
brand: "Subquery",
|
|
sql,
|
|
selectedFields: fields,
|
|
alias,
|
|
isWith,
|
|
usedTables
|
|
};
|
|
}
|
|
}
|
|
|
|
class WithSubquery extends Subquery {
|
|
static [entityKind] = "WithSubquery";
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/version.js
|
|
var version = "0.44.5";
|
|
|
|
// ../eve/node_modules/drizzle-orm/tracing.js
|
|
var otel;
|
|
var rawTracer;
|
|
var tracer = {
|
|
startActiveSpan(name, fn) {
|
|
if (!otel) {
|
|
return fn();
|
|
}
|
|
if (!rawTracer) {
|
|
rawTracer = otel.trace.getTracer("drizzle-orm", version);
|
|
}
|
|
return iife((otel2, rawTracer2) => rawTracer2.startActiveSpan(name, (span) => {
|
|
try {
|
|
return fn(span);
|
|
} catch (e) {
|
|
span.setStatus({
|
|
code: otel2.SpanStatusCode.ERROR,
|
|
message: e instanceof Error ? e.message : "Unknown error"
|
|
});
|
|
throw e;
|
|
} finally {
|
|
span.end();
|
|
}
|
|
}), otel, rawTracer);
|
|
}
|
|
};
|
|
|
|
// ../eve/node_modules/drizzle-orm/view-common.js
|
|
var ViewBaseConfig = Symbol.for("drizzle:ViewBaseConfig");
|
|
|
|
// ../eve/node_modules/drizzle-orm/table.js
|
|
var Schema = Symbol.for("drizzle:Schema");
|
|
var Columns = Symbol.for("drizzle:Columns");
|
|
var ExtraConfigColumns = Symbol.for("drizzle:ExtraConfigColumns");
|
|
var OriginalName = Symbol.for("drizzle:OriginalName");
|
|
var BaseName = Symbol.for("drizzle:BaseName");
|
|
var IsAlias = Symbol.for("drizzle:IsAlias");
|
|
var ExtraConfigBuilder = Symbol.for("drizzle:ExtraConfigBuilder");
|
|
var IsDrizzleTable = Symbol.for("drizzle:IsDrizzleTable");
|
|
|
|
class Table {
|
|
static [entityKind] = "Table";
|
|
static Symbol = {
|
|
Name: TableName,
|
|
Schema,
|
|
OriginalName,
|
|
Columns,
|
|
ExtraConfigColumns,
|
|
BaseName,
|
|
IsAlias,
|
|
ExtraConfigBuilder
|
|
};
|
|
[TableName];
|
|
[OriginalName];
|
|
[Schema];
|
|
[Columns];
|
|
[ExtraConfigColumns];
|
|
[BaseName];
|
|
[IsAlias] = false;
|
|
[IsDrizzleTable] = true;
|
|
[ExtraConfigBuilder] = undefined;
|
|
constructor(name, schema, baseName) {
|
|
this[TableName] = this[OriginalName] = name;
|
|
this[Schema] = schema;
|
|
this[BaseName] = baseName;
|
|
}
|
|
}
|
|
function getTableName(table) {
|
|
return table[TableName];
|
|
}
|
|
function getTableUniqueName(table) {
|
|
return `${table[Schema] ?? "public"}.${table[TableName]}`;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sql/sql.js
|
|
function isSQLWrapper(value) {
|
|
return value !== null && value !== undefined && typeof value.getSQL === "function";
|
|
}
|
|
function mergeQueries(queries) {
|
|
const result = { sql: "", params: [] };
|
|
for (const query of queries) {
|
|
result.sql += query.sql;
|
|
result.params.push(...query.params);
|
|
if (query.typings?.length) {
|
|
if (!result.typings) {
|
|
result.typings = [];
|
|
}
|
|
result.typings.push(...query.typings);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
class StringChunk {
|
|
static [entityKind] = "StringChunk";
|
|
value;
|
|
constructor(value) {
|
|
this.value = Array.isArray(value) ? value : [value];
|
|
}
|
|
getSQL() {
|
|
return new SQL([this]);
|
|
}
|
|
}
|
|
|
|
class SQL {
|
|
constructor(queryChunks) {
|
|
this.queryChunks = queryChunks;
|
|
for (const chunk of queryChunks) {
|
|
if (is(chunk, Table)) {
|
|
const schemaName = chunk[Table.Symbol.Schema];
|
|
this.usedTables.push(schemaName === undefined ? chunk[Table.Symbol.Name] : schemaName + "." + chunk[Table.Symbol.Name]);
|
|
}
|
|
}
|
|
}
|
|
static [entityKind] = "SQL";
|
|
decoder = noopDecoder;
|
|
shouldInlineParams = false;
|
|
usedTables = [];
|
|
append(query) {
|
|
this.queryChunks.push(...query.queryChunks);
|
|
return this;
|
|
}
|
|
toQuery(config) {
|
|
return tracer.startActiveSpan("drizzle.buildSQL", (span) => {
|
|
const query = this.buildQueryFromSourceParams(this.queryChunks, config);
|
|
span?.setAttributes({
|
|
"drizzle.query.text": query.sql,
|
|
"drizzle.query.params": JSON.stringify(query.params)
|
|
});
|
|
return query;
|
|
});
|
|
}
|
|
buildQueryFromSourceParams(chunks, _config) {
|
|
const config = Object.assign({}, _config, {
|
|
inlineParams: _config.inlineParams || this.shouldInlineParams,
|
|
paramStartIndex: _config.paramStartIndex || { value: 0 }
|
|
});
|
|
const {
|
|
casing,
|
|
escapeName,
|
|
escapeParam,
|
|
prepareTyping,
|
|
inlineParams,
|
|
paramStartIndex
|
|
} = config;
|
|
return mergeQueries(chunks.map((chunk) => {
|
|
if (is(chunk, StringChunk)) {
|
|
return { sql: chunk.value.join(""), params: [] };
|
|
}
|
|
if (is(chunk, Name)) {
|
|
return { sql: escapeName(chunk.value), params: [] };
|
|
}
|
|
if (chunk === undefined) {
|
|
return { sql: "", params: [] };
|
|
}
|
|
if (Array.isArray(chunk)) {
|
|
const result = [new StringChunk("(")];
|
|
for (const [i, p] of chunk.entries()) {
|
|
result.push(p);
|
|
if (i < chunk.length - 1) {
|
|
result.push(new StringChunk(", "));
|
|
}
|
|
}
|
|
result.push(new StringChunk(")"));
|
|
return this.buildQueryFromSourceParams(result, config);
|
|
}
|
|
if (is(chunk, SQL)) {
|
|
return this.buildQueryFromSourceParams(chunk.queryChunks, {
|
|
...config,
|
|
inlineParams: inlineParams || chunk.shouldInlineParams
|
|
});
|
|
}
|
|
if (is(chunk, Table)) {
|
|
const schemaName = chunk[Table.Symbol.Schema];
|
|
const tableName = chunk[Table.Symbol.Name];
|
|
return {
|
|
sql: schemaName === undefined || chunk[IsAlias] ? escapeName(tableName) : escapeName(schemaName) + "." + escapeName(tableName),
|
|
params: []
|
|
};
|
|
}
|
|
if (is(chunk, Column)) {
|
|
const columnName = casing.getColumnCasing(chunk);
|
|
if (_config.invokeSource === "indexes") {
|
|
return { sql: escapeName(columnName), params: [] };
|
|
}
|
|
const schemaName = chunk.table[Table.Symbol.Schema];
|
|
return {
|
|
sql: chunk.table[IsAlias] || schemaName === undefined ? escapeName(chunk.table[Table.Symbol.Name]) + "." + escapeName(columnName) : escapeName(schemaName) + "." + escapeName(chunk.table[Table.Symbol.Name]) + "." + escapeName(columnName),
|
|
params: []
|
|
};
|
|
}
|
|
if (is(chunk, View)) {
|
|
const schemaName = chunk[ViewBaseConfig].schema;
|
|
const viewName = chunk[ViewBaseConfig].name;
|
|
return {
|
|
sql: schemaName === undefined || chunk[ViewBaseConfig].isAlias ? escapeName(viewName) : escapeName(schemaName) + "." + escapeName(viewName),
|
|
params: []
|
|
};
|
|
}
|
|
if (is(chunk, Param)) {
|
|
if (is(chunk.value, Placeholder)) {
|
|
return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
|
|
}
|
|
const mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);
|
|
if (is(mappedValue, SQL)) {
|
|
return this.buildQueryFromSourceParams([mappedValue], config);
|
|
}
|
|
if (inlineParams) {
|
|
return { sql: this.mapInlineParam(mappedValue, config), params: [] };
|
|
}
|
|
let typings = ["none"];
|
|
if (prepareTyping) {
|
|
typings = [prepareTyping(chunk.encoder)];
|
|
}
|
|
return { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };
|
|
}
|
|
if (is(chunk, Placeholder)) {
|
|
return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
|
|
}
|
|
if (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {
|
|
return { sql: escapeName(chunk.fieldAlias), params: [] };
|
|
}
|
|
if (is(chunk, Subquery)) {
|
|
if (chunk._.isWith) {
|
|
return { sql: escapeName(chunk._.alias), params: [] };
|
|
}
|
|
return this.buildQueryFromSourceParams([
|
|
new StringChunk("("),
|
|
chunk._.sql,
|
|
new StringChunk(") "),
|
|
new Name(chunk._.alias)
|
|
], config);
|
|
}
|
|
if (isPgEnum(chunk)) {
|
|
if (chunk.schema) {
|
|
return { sql: escapeName(chunk.schema) + "." + escapeName(chunk.enumName), params: [] };
|
|
}
|
|
return { sql: escapeName(chunk.enumName), params: [] };
|
|
}
|
|
if (isSQLWrapper(chunk)) {
|
|
if (chunk.shouldOmitSQLParens?.()) {
|
|
return this.buildQueryFromSourceParams([chunk.getSQL()], config);
|
|
}
|
|
return this.buildQueryFromSourceParams([
|
|
new StringChunk("("),
|
|
chunk.getSQL(),
|
|
new StringChunk(")")
|
|
], config);
|
|
}
|
|
if (inlineParams) {
|
|
return { sql: this.mapInlineParam(chunk, config), params: [] };
|
|
}
|
|
return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
|
|
}));
|
|
}
|
|
mapInlineParam(chunk, { escapeString }) {
|
|
if (chunk === null) {
|
|
return "null";
|
|
}
|
|
if (typeof chunk === "number" || typeof chunk === "boolean") {
|
|
return chunk.toString();
|
|
}
|
|
if (typeof chunk === "string") {
|
|
return escapeString(chunk);
|
|
}
|
|
if (typeof chunk === "object") {
|
|
const mappedValueAsString = chunk.toString();
|
|
if (mappedValueAsString === "[object Object]") {
|
|
return escapeString(JSON.stringify(chunk));
|
|
}
|
|
return escapeString(mappedValueAsString);
|
|
}
|
|
throw new Error("Unexpected param value: " + chunk);
|
|
}
|
|
getSQL() {
|
|
return this;
|
|
}
|
|
as(alias) {
|
|
if (alias === undefined) {
|
|
return this;
|
|
}
|
|
return new SQL.Aliased(this, alias);
|
|
}
|
|
mapWith(decoder) {
|
|
this.decoder = typeof decoder === "function" ? { mapFromDriverValue: decoder } : decoder;
|
|
return this;
|
|
}
|
|
inlineParams() {
|
|
this.shouldInlineParams = true;
|
|
return this;
|
|
}
|
|
if(condition) {
|
|
return condition ? this : undefined;
|
|
}
|
|
}
|
|
|
|
class Name {
|
|
constructor(value) {
|
|
this.value = value;
|
|
}
|
|
static [entityKind] = "Name";
|
|
brand;
|
|
getSQL() {
|
|
return new SQL([this]);
|
|
}
|
|
}
|
|
function isDriverValueEncoder(value) {
|
|
return typeof value === "object" && value !== null && "mapToDriverValue" in value && typeof value.mapToDriverValue === "function";
|
|
}
|
|
var noopDecoder = {
|
|
mapFromDriverValue: (value) => value
|
|
};
|
|
var noopEncoder = {
|
|
mapToDriverValue: (value) => value
|
|
};
|
|
var noopMapper = {
|
|
...noopDecoder,
|
|
...noopEncoder
|
|
};
|
|
|
|
class Param {
|
|
constructor(value, encoder = noopEncoder) {
|
|
this.value = value;
|
|
this.encoder = encoder;
|
|
}
|
|
static [entityKind] = "Param";
|
|
brand;
|
|
getSQL() {
|
|
return new SQL([this]);
|
|
}
|
|
}
|
|
function sql(strings, ...params) {
|
|
const queryChunks = [];
|
|
if (params.length > 0 || strings.length > 0 && strings[0] !== "") {
|
|
queryChunks.push(new StringChunk(strings[0]));
|
|
}
|
|
for (const [paramIndex, param2] of params.entries()) {
|
|
queryChunks.push(param2, new StringChunk(strings[paramIndex + 1]));
|
|
}
|
|
return new SQL(queryChunks);
|
|
}
|
|
((sql2) => {
|
|
function empty() {
|
|
return new SQL([]);
|
|
}
|
|
sql2.empty = empty;
|
|
function fromList(list) {
|
|
return new SQL(list);
|
|
}
|
|
sql2.fromList = fromList;
|
|
function raw(str) {
|
|
return new SQL([new StringChunk(str)]);
|
|
}
|
|
sql2.raw = raw;
|
|
function join(chunks, separator) {
|
|
const result = [];
|
|
for (const [i, chunk] of chunks.entries()) {
|
|
if (i > 0 && separator !== undefined) {
|
|
result.push(separator);
|
|
}
|
|
result.push(chunk);
|
|
}
|
|
return new SQL(result);
|
|
}
|
|
sql2.join = join;
|
|
function identifier(value) {
|
|
return new Name(value);
|
|
}
|
|
sql2.identifier = identifier;
|
|
function placeholder2(name2) {
|
|
return new Placeholder(name2);
|
|
}
|
|
sql2.placeholder = placeholder2;
|
|
function param2(value, encoder) {
|
|
return new Param(value, encoder);
|
|
}
|
|
sql2.param = param2;
|
|
})(sql || (sql = {}));
|
|
((SQL2) => {
|
|
|
|
class Aliased {
|
|
constructor(sql2, fieldAlias) {
|
|
this.sql = sql2;
|
|
this.fieldAlias = fieldAlias;
|
|
}
|
|
static [entityKind] = "SQL.Aliased";
|
|
isSelectionField = false;
|
|
getSQL() {
|
|
return this.sql;
|
|
}
|
|
clone() {
|
|
return new Aliased(this.sql, this.fieldAlias);
|
|
}
|
|
}
|
|
SQL2.Aliased = Aliased;
|
|
})(SQL || (SQL = {}));
|
|
|
|
class Placeholder {
|
|
constructor(name2) {
|
|
this.name = name2;
|
|
}
|
|
static [entityKind] = "Placeholder";
|
|
getSQL() {
|
|
return new SQL([this]);
|
|
}
|
|
}
|
|
function fillPlaceholders(params, values) {
|
|
return params.map((p) => {
|
|
if (is(p, Placeholder)) {
|
|
if (!(p.name in values)) {
|
|
throw new Error(`No value for placeholder "${p.name}" was provided`);
|
|
}
|
|
return values[p.name];
|
|
}
|
|
if (is(p, Param) && is(p.value, Placeholder)) {
|
|
if (!(p.value.name in values)) {
|
|
throw new Error(`No value for placeholder "${p.value.name}" was provided`);
|
|
}
|
|
return p.encoder.mapToDriverValue(values[p.value.name]);
|
|
}
|
|
return p;
|
|
});
|
|
}
|
|
var IsDrizzleView = Symbol.for("drizzle:IsDrizzleView");
|
|
|
|
class View {
|
|
static [entityKind] = "View";
|
|
[ViewBaseConfig];
|
|
[IsDrizzleView] = true;
|
|
constructor({ name: name2, schema, selectedFields, query }) {
|
|
this[ViewBaseConfig] = {
|
|
name: name2,
|
|
originalName: name2,
|
|
schema,
|
|
selectedFields,
|
|
query,
|
|
isExisting: !query,
|
|
isAlias: false
|
|
};
|
|
}
|
|
getSQL() {
|
|
return new SQL([this]);
|
|
}
|
|
}
|
|
Column.prototype.getSQL = function() {
|
|
return new SQL([this]);
|
|
};
|
|
Table.prototype.getSQL = function() {
|
|
return new SQL([this]);
|
|
};
|
|
Subquery.prototype.getSQL = function() {
|
|
return new SQL([this]);
|
|
};
|
|
|
|
// ../eve/node_modules/drizzle-orm/alias.js
|
|
class ColumnAliasProxyHandler {
|
|
constructor(table) {
|
|
this.table = table;
|
|
}
|
|
static [entityKind] = "ColumnAliasProxyHandler";
|
|
get(columnObj, prop) {
|
|
if (prop === "table") {
|
|
return this.table;
|
|
}
|
|
return columnObj[prop];
|
|
}
|
|
}
|
|
|
|
class TableAliasProxyHandler {
|
|
constructor(alias, replaceOriginalName) {
|
|
this.alias = alias;
|
|
this.replaceOriginalName = replaceOriginalName;
|
|
}
|
|
static [entityKind] = "TableAliasProxyHandler";
|
|
get(target, prop) {
|
|
if (prop === Table.Symbol.IsAlias) {
|
|
return true;
|
|
}
|
|
if (prop === Table.Symbol.Name) {
|
|
return this.alias;
|
|
}
|
|
if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {
|
|
return this.alias;
|
|
}
|
|
if (prop === ViewBaseConfig) {
|
|
return {
|
|
...target[ViewBaseConfig],
|
|
name: this.alias,
|
|
isAlias: true
|
|
};
|
|
}
|
|
if (prop === Table.Symbol.Columns) {
|
|
const columns = target[Table.Symbol.Columns];
|
|
if (!columns) {
|
|
return columns;
|
|
}
|
|
const proxiedColumns = {};
|
|
Object.keys(columns).map((key) => {
|
|
proxiedColumns[key] = new Proxy(columns[key], new ColumnAliasProxyHandler(new Proxy(target, this)));
|
|
});
|
|
return proxiedColumns;
|
|
}
|
|
const value = target[prop];
|
|
if (is(value, Column)) {
|
|
return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(target, this)));
|
|
}
|
|
return value;
|
|
}
|
|
}
|
|
function aliasedTable(table, tableAlias) {
|
|
return new Proxy(table, new TableAliasProxyHandler(tableAlias, false));
|
|
}
|
|
function aliasedTableColumn(column, tableAlias) {
|
|
return new Proxy(column, new ColumnAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false))));
|
|
}
|
|
function mapColumnsInAliasedSQLToAlias(query, alias) {
|
|
return new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);
|
|
}
|
|
function mapColumnsInSQLToAlias(query, alias) {
|
|
return sql.join(query.queryChunks.map((c) => {
|
|
if (is(c, Column)) {
|
|
return aliasedTableColumn(c, alias);
|
|
}
|
|
if (is(c, SQL)) {
|
|
return mapColumnsInSQLToAlias(c, alias);
|
|
}
|
|
if (is(c, SQL.Aliased)) {
|
|
return mapColumnsInAliasedSQLToAlias(c, alias);
|
|
}
|
|
return c;
|
|
}));
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/utils.js
|
|
function mapResultRow(columns, row, joinsNotNullableMap) {
|
|
const nullifyMap = {};
|
|
const result = columns.reduce((result2, { path, field }, columnIndex) => {
|
|
let decoder;
|
|
if (is(field, Column)) {
|
|
decoder = field;
|
|
} else if (is(field, SQL)) {
|
|
decoder = field.decoder;
|
|
} else {
|
|
decoder = field.sql.decoder;
|
|
}
|
|
let node = result2;
|
|
for (const [pathChunkIndex, pathChunk] of path.entries()) {
|
|
if (pathChunkIndex < path.length - 1) {
|
|
if (!(pathChunk in node)) {
|
|
node[pathChunk] = {};
|
|
}
|
|
node = node[pathChunk];
|
|
} else {
|
|
const rawValue = row[columnIndex];
|
|
const value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);
|
|
if (joinsNotNullableMap && is(field, Column) && path.length === 2) {
|
|
const objectName = path[0];
|
|
if (!(objectName in nullifyMap)) {
|
|
nullifyMap[objectName] = value === null ? getTableName(field.table) : false;
|
|
} else if (typeof nullifyMap[objectName] === "string" && nullifyMap[objectName] !== getTableName(field.table)) {
|
|
nullifyMap[objectName] = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return result2;
|
|
}, {});
|
|
if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {
|
|
for (const [objectName, tableName] of Object.entries(nullifyMap)) {
|
|
if (typeof tableName === "string" && !joinsNotNullableMap[tableName]) {
|
|
result[objectName] = null;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function orderSelectedFields(fields, pathPrefix) {
|
|
return Object.entries(fields).reduce((result, [name, field]) => {
|
|
if (typeof name !== "string") {
|
|
return result;
|
|
}
|
|
const newPath = pathPrefix ? [...pathPrefix, name] : [name];
|
|
if (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {
|
|
result.push({ path: newPath, field });
|
|
} else if (is(field, Table)) {
|
|
result.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));
|
|
} else {
|
|
result.push(...orderSelectedFields(field, newPath));
|
|
}
|
|
return result;
|
|
}, []);
|
|
}
|
|
function haveSameKeys(left, right) {
|
|
const leftKeys = Object.keys(left);
|
|
const rightKeys = Object.keys(right);
|
|
if (leftKeys.length !== rightKeys.length) {
|
|
return false;
|
|
}
|
|
for (const [index, key] of leftKeys.entries()) {
|
|
if (key !== rightKeys[index]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function mapUpdateSet(table, values) {
|
|
const entries = Object.entries(values).filter(([, value]) => value !== undefined).map(([key, value]) => {
|
|
if (is(value, SQL) || is(value, Column)) {
|
|
return [key, value];
|
|
} else {
|
|
return [key, new Param(value, table[Table.Symbol.Columns][key])];
|
|
}
|
|
});
|
|
if (entries.length === 0) {
|
|
throw new Error("No values to set");
|
|
}
|
|
return Object.fromEntries(entries);
|
|
}
|
|
function applyMixins(baseClass, extendedClasses) {
|
|
for (const extendedClass of extendedClasses) {
|
|
for (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {
|
|
if (name === "constructor")
|
|
continue;
|
|
Object.defineProperty(baseClass.prototype, name, Object.getOwnPropertyDescriptor(extendedClass.prototype, name) || /* @__PURE__ */ Object.create(null));
|
|
}
|
|
}
|
|
}
|
|
function getTableColumns(table) {
|
|
return table[Table.Symbol.Columns];
|
|
}
|
|
function getTableLikeName(table) {
|
|
return is(table, Subquery) ? table._.alias : is(table, View) ? table[ViewBaseConfig].name : is(table, SQL) ? undefined : table[Table.Symbol.IsAlias] ? table[Table.Symbol.Name] : table[Table.Symbol.BaseName];
|
|
}
|
|
function getColumnNameAndConfig(a, b) {
|
|
return {
|
|
name: typeof a === "string" && a.length > 0 ? a : "",
|
|
config: typeof a === "object" ? a : b
|
|
};
|
|
}
|
|
function isConfig(data) {
|
|
if (typeof data !== "object" || data === null)
|
|
return false;
|
|
if (data.constructor.name !== "Object")
|
|
return false;
|
|
if ("logger" in data) {
|
|
const type = typeof data["logger"];
|
|
if (type !== "boolean" && (type !== "object" || typeof data["logger"]["logQuery"] !== "function") && type !== "undefined")
|
|
return false;
|
|
return true;
|
|
}
|
|
if ("schema" in data) {
|
|
const type = typeof data["schema"];
|
|
if (type !== "object" && type !== "undefined")
|
|
return false;
|
|
return true;
|
|
}
|
|
if ("casing" in data) {
|
|
const type = typeof data["casing"];
|
|
if (type !== "string" && type !== "undefined")
|
|
return false;
|
|
return true;
|
|
}
|
|
if ("mode" in data) {
|
|
if (data["mode"] !== "default" || data["mode"] !== "planetscale" || data["mode"] !== undefined)
|
|
return false;
|
|
return true;
|
|
}
|
|
if ("connection" in data) {
|
|
const type = typeof data["connection"];
|
|
if (type !== "string" && type !== "object" && type !== "undefined")
|
|
return false;
|
|
return true;
|
|
}
|
|
if ("client" in data) {
|
|
const type = typeof data["client"];
|
|
if (type !== "object" && type !== "function" && type !== "undefined")
|
|
return false;
|
|
return true;
|
|
}
|
|
if (Object.keys(data).length === 0)
|
|
return true;
|
|
return false;
|
|
}
|
|
var textDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder;
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/foreign-keys.js
|
|
class ForeignKeyBuilder {
|
|
static [entityKind] = "SQLiteForeignKeyBuilder";
|
|
reference;
|
|
_onUpdate;
|
|
_onDelete;
|
|
constructor(config, actions) {
|
|
this.reference = () => {
|
|
const { name, columns, foreignColumns } = config();
|
|
return { name, columns, foreignTable: foreignColumns[0].table, foreignColumns };
|
|
};
|
|
if (actions) {
|
|
this._onUpdate = actions.onUpdate;
|
|
this._onDelete = actions.onDelete;
|
|
}
|
|
}
|
|
onUpdate(action) {
|
|
this._onUpdate = action;
|
|
return this;
|
|
}
|
|
onDelete(action) {
|
|
this._onDelete = action;
|
|
return this;
|
|
}
|
|
build(table) {
|
|
return new ForeignKey(table, this);
|
|
}
|
|
}
|
|
|
|
class ForeignKey {
|
|
constructor(table, builder) {
|
|
this.table = table;
|
|
this.reference = builder.reference;
|
|
this.onUpdate = builder._onUpdate;
|
|
this.onDelete = builder._onDelete;
|
|
}
|
|
static [entityKind] = "SQLiteForeignKey";
|
|
reference;
|
|
onUpdate;
|
|
onDelete;
|
|
getName() {
|
|
const { name, columns, foreignColumns } = this.reference();
|
|
const columnNames = columns.map((column) => column.name);
|
|
const foreignColumnNames = foreignColumns.map((column) => column.name);
|
|
const chunks = [
|
|
this.table[TableName],
|
|
...columnNames,
|
|
foreignColumns[0].table[TableName],
|
|
...foreignColumnNames
|
|
];
|
|
return name ?? `${chunks.join("_")}_fk`;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/unique-constraint.js
|
|
function uniqueKeyName2(table, columns) {
|
|
return `${table[TableName]}_${columns.join("_")}_unique`;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/common.js
|
|
class SQLiteColumnBuilder extends ColumnBuilder {
|
|
static [entityKind] = "SQLiteColumnBuilder";
|
|
foreignKeyConfigs = [];
|
|
references(ref, actions = {}) {
|
|
this.foreignKeyConfigs.push({ ref, actions });
|
|
return this;
|
|
}
|
|
unique(name) {
|
|
this.config.isUnique = true;
|
|
this.config.uniqueName = name;
|
|
return this;
|
|
}
|
|
generatedAlwaysAs(as, config) {
|
|
this.config.generated = {
|
|
as,
|
|
type: "always",
|
|
mode: config?.mode ?? "virtual"
|
|
};
|
|
return this;
|
|
}
|
|
buildForeignKeys(column, table) {
|
|
return this.foreignKeyConfigs.map(({ ref, actions }) => {
|
|
return ((ref2, actions2) => {
|
|
const builder = new ForeignKeyBuilder(() => {
|
|
const foreignColumn = ref2();
|
|
return { columns: [column], foreignColumns: [foreignColumn] };
|
|
});
|
|
if (actions2.onUpdate) {
|
|
builder.onUpdate(actions2.onUpdate);
|
|
}
|
|
if (actions2.onDelete) {
|
|
builder.onDelete(actions2.onDelete);
|
|
}
|
|
return builder.build(table);
|
|
})(ref, actions);
|
|
});
|
|
}
|
|
}
|
|
|
|
class SQLiteColumn extends Column {
|
|
constructor(table, config) {
|
|
if (!config.uniqueName) {
|
|
config.uniqueName = uniqueKeyName2(table, [config.name]);
|
|
}
|
|
super(table, config);
|
|
this.table = table;
|
|
}
|
|
static [entityKind] = "SQLiteColumn";
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/blob.js
|
|
class SQLiteBigIntBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteBigIntBuilder";
|
|
constructor(name) {
|
|
super(name, "bigint", "SQLiteBigInt");
|
|
}
|
|
build(table) {
|
|
return new SQLiteBigInt(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteBigInt extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteBigInt";
|
|
getSQLType() {
|
|
return "blob";
|
|
}
|
|
mapFromDriverValue(value) {
|
|
if (typeof Buffer !== "undefined" && Buffer.from) {
|
|
const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);
|
|
return BigInt(buf.toString("utf8"));
|
|
}
|
|
return BigInt(textDecoder.decode(value));
|
|
}
|
|
mapToDriverValue(value) {
|
|
return Buffer.from(value.toString());
|
|
}
|
|
}
|
|
|
|
class SQLiteBlobJsonBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteBlobJsonBuilder";
|
|
constructor(name) {
|
|
super(name, "json", "SQLiteBlobJson");
|
|
}
|
|
build(table) {
|
|
return new SQLiteBlobJson(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteBlobJson extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteBlobJson";
|
|
getSQLType() {
|
|
return "blob";
|
|
}
|
|
mapFromDriverValue(value) {
|
|
if (typeof Buffer !== "undefined" && Buffer.from) {
|
|
const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);
|
|
return JSON.parse(buf.toString("utf8"));
|
|
}
|
|
return JSON.parse(textDecoder.decode(value));
|
|
}
|
|
mapToDriverValue(value) {
|
|
return Buffer.from(JSON.stringify(value));
|
|
}
|
|
}
|
|
|
|
class SQLiteBlobBufferBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteBlobBufferBuilder";
|
|
constructor(name) {
|
|
super(name, "buffer", "SQLiteBlobBuffer");
|
|
}
|
|
build(table) {
|
|
return new SQLiteBlobBuffer(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteBlobBuffer extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteBlobBuffer";
|
|
mapFromDriverValue(value) {
|
|
if (Buffer.isBuffer(value)) {
|
|
return value;
|
|
}
|
|
return Buffer.from(value);
|
|
}
|
|
getSQLType() {
|
|
return "blob";
|
|
}
|
|
}
|
|
function blob(a, b) {
|
|
const { name, config } = getColumnNameAndConfig(a, b);
|
|
if (config?.mode === "json") {
|
|
return new SQLiteBlobJsonBuilder(name);
|
|
}
|
|
if (config?.mode === "bigint") {
|
|
return new SQLiteBigIntBuilder(name);
|
|
}
|
|
return new SQLiteBlobBufferBuilder(name);
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/custom.js
|
|
class SQLiteCustomColumnBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteCustomColumnBuilder";
|
|
constructor(name, fieldConfig, customTypeParams) {
|
|
super(name, "custom", "SQLiteCustomColumn");
|
|
this.config.fieldConfig = fieldConfig;
|
|
this.config.customTypeParams = customTypeParams;
|
|
}
|
|
build(table) {
|
|
return new SQLiteCustomColumn(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteCustomColumn extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteCustomColumn";
|
|
sqlName;
|
|
mapTo;
|
|
mapFrom;
|
|
constructor(table, config) {
|
|
super(table, config);
|
|
this.sqlName = config.customTypeParams.dataType(config.fieldConfig);
|
|
this.mapTo = config.customTypeParams.toDriver;
|
|
this.mapFrom = config.customTypeParams.fromDriver;
|
|
}
|
|
getSQLType() {
|
|
return this.sqlName;
|
|
}
|
|
mapFromDriverValue(value) {
|
|
return typeof this.mapFrom === "function" ? this.mapFrom(value) : value;
|
|
}
|
|
mapToDriverValue(value) {
|
|
return typeof this.mapTo === "function" ? this.mapTo(value) : value;
|
|
}
|
|
}
|
|
function customType(customTypeParams) {
|
|
return (a, b) => {
|
|
const { name, config } = getColumnNameAndConfig(a, b);
|
|
return new SQLiteCustomColumnBuilder(name, config, customTypeParams);
|
|
};
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/integer.js
|
|
class SQLiteBaseIntegerBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteBaseIntegerBuilder";
|
|
constructor(name, dataType, columnType) {
|
|
super(name, dataType, columnType);
|
|
this.config.autoIncrement = false;
|
|
}
|
|
primaryKey(config) {
|
|
if (config?.autoIncrement) {
|
|
this.config.autoIncrement = true;
|
|
}
|
|
this.config.hasDefault = true;
|
|
return super.primaryKey();
|
|
}
|
|
}
|
|
|
|
class SQLiteBaseInteger extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteBaseInteger";
|
|
autoIncrement = this.config.autoIncrement;
|
|
getSQLType() {
|
|
return "integer";
|
|
}
|
|
}
|
|
|
|
class SQLiteIntegerBuilder extends SQLiteBaseIntegerBuilder {
|
|
static [entityKind] = "SQLiteIntegerBuilder";
|
|
constructor(name) {
|
|
super(name, "number", "SQLiteInteger");
|
|
}
|
|
build(table) {
|
|
return new SQLiteInteger(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteInteger extends SQLiteBaseInteger {
|
|
static [entityKind] = "SQLiteInteger";
|
|
}
|
|
|
|
class SQLiteTimestampBuilder extends SQLiteBaseIntegerBuilder {
|
|
static [entityKind] = "SQLiteTimestampBuilder";
|
|
constructor(name, mode) {
|
|
super(name, "date", "SQLiteTimestamp");
|
|
this.config.mode = mode;
|
|
}
|
|
defaultNow() {
|
|
return this.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`);
|
|
}
|
|
build(table) {
|
|
return new SQLiteTimestamp(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteTimestamp extends SQLiteBaseInteger {
|
|
static [entityKind] = "SQLiteTimestamp";
|
|
mode = this.config.mode;
|
|
mapFromDriverValue(value) {
|
|
if (this.config.mode === "timestamp") {
|
|
return new Date(value * 1000);
|
|
}
|
|
return new Date(value);
|
|
}
|
|
mapToDriverValue(value) {
|
|
const unix = value.getTime();
|
|
if (this.config.mode === "timestamp") {
|
|
return Math.floor(unix / 1000);
|
|
}
|
|
return unix;
|
|
}
|
|
}
|
|
|
|
class SQLiteBooleanBuilder extends SQLiteBaseIntegerBuilder {
|
|
static [entityKind] = "SQLiteBooleanBuilder";
|
|
constructor(name, mode) {
|
|
super(name, "boolean", "SQLiteBoolean");
|
|
this.config.mode = mode;
|
|
}
|
|
build(table) {
|
|
return new SQLiteBoolean(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteBoolean extends SQLiteBaseInteger {
|
|
static [entityKind] = "SQLiteBoolean";
|
|
mode = this.config.mode;
|
|
mapFromDriverValue(value) {
|
|
return Number(value) === 1;
|
|
}
|
|
mapToDriverValue(value) {
|
|
return value ? 1 : 0;
|
|
}
|
|
}
|
|
function integer(a, b) {
|
|
const { name, config } = getColumnNameAndConfig(a, b);
|
|
if (config?.mode === "timestamp" || config?.mode === "timestamp_ms") {
|
|
return new SQLiteTimestampBuilder(name, config.mode);
|
|
}
|
|
if (config?.mode === "boolean") {
|
|
return new SQLiteBooleanBuilder(name, config.mode);
|
|
}
|
|
return new SQLiteIntegerBuilder(name);
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/numeric.js
|
|
class SQLiteNumericBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteNumericBuilder";
|
|
constructor(name) {
|
|
super(name, "string", "SQLiteNumeric");
|
|
}
|
|
build(table) {
|
|
return new SQLiteNumeric(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteNumeric extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteNumeric";
|
|
mapFromDriverValue(value) {
|
|
if (typeof value === "string")
|
|
return value;
|
|
return String(value);
|
|
}
|
|
getSQLType() {
|
|
return "numeric";
|
|
}
|
|
}
|
|
|
|
class SQLiteNumericNumberBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteNumericNumberBuilder";
|
|
constructor(name) {
|
|
super(name, "number", "SQLiteNumericNumber");
|
|
}
|
|
build(table) {
|
|
return new SQLiteNumericNumber(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteNumericNumber extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteNumericNumber";
|
|
mapFromDriverValue(value) {
|
|
if (typeof value === "number")
|
|
return value;
|
|
return Number(value);
|
|
}
|
|
mapToDriverValue = String;
|
|
getSQLType() {
|
|
return "numeric";
|
|
}
|
|
}
|
|
|
|
class SQLiteNumericBigIntBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteNumericBigIntBuilder";
|
|
constructor(name) {
|
|
super(name, "bigint", "SQLiteNumericBigInt");
|
|
}
|
|
build(table) {
|
|
return new SQLiteNumericBigInt(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteNumericBigInt extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteNumericBigInt";
|
|
mapFromDriverValue = BigInt;
|
|
mapToDriverValue = String;
|
|
getSQLType() {
|
|
return "numeric";
|
|
}
|
|
}
|
|
function numeric(a, b) {
|
|
const { name, config } = getColumnNameAndConfig(a, b);
|
|
const mode = config?.mode;
|
|
return mode === "number" ? new SQLiteNumericNumberBuilder(name) : mode === "bigint" ? new SQLiteNumericBigIntBuilder(name) : new SQLiteNumericBuilder(name);
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/real.js
|
|
class SQLiteRealBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteRealBuilder";
|
|
constructor(name) {
|
|
super(name, "number", "SQLiteReal");
|
|
}
|
|
build(table) {
|
|
return new SQLiteReal(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteReal extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteReal";
|
|
getSQLType() {
|
|
return "real";
|
|
}
|
|
}
|
|
function real(name) {
|
|
return new SQLiteRealBuilder(name ?? "");
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/text.js
|
|
class SQLiteTextBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteTextBuilder";
|
|
constructor(name, config) {
|
|
super(name, "string", "SQLiteText");
|
|
this.config.enumValues = config.enum;
|
|
this.config.length = config.length;
|
|
}
|
|
build(table) {
|
|
return new SQLiteText(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteText extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteText";
|
|
enumValues = this.config.enumValues;
|
|
length = this.config.length;
|
|
constructor(table, config) {
|
|
super(table, config);
|
|
}
|
|
getSQLType() {
|
|
return `text${this.config.length ? `(${this.config.length})` : ""}`;
|
|
}
|
|
}
|
|
|
|
class SQLiteTextJsonBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteTextJsonBuilder";
|
|
constructor(name) {
|
|
super(name, "json", "SQLiteTextJson");
|
|
}
|
|
build(table) {
|
|
return new SQLiteTextJson(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteTextJson extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteTextJson";
|
|
getSQLType() {
|
|
return "text";
|
|
}
|
|
mapFromDriverValue(value) {
|
|
return JSON.parse(value);
|
|
}
|
|
mapToDriverValue(value) {
|
|
return JSON.stringify(value);
|
|
}
|
|
}
|
|
function text(a, b = {}) {
|
|
const { name, config } = getColumnNameAndConfig(a, b);
|
|
if (config.mode === "json") {
|
|
return new SQLiteTextJsonBuilder(name);
|
|
}
|
|
return new SQLiteTextBuilder(name, config);
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/selection-proxy.js
|
|
class SelectionProxyHandler {
|
|
static [entityKind] = "SelectionProxyHandler";
|
|
config;
|
|
constructor(config) {
|
|
this.config = { ...config };
|
|
}
|
|
get(subquery, prop) {
|
|
if (prop === "_") {
|
|
return {
|
|
...subquery["_"],
|
|
selectedFields: new Proxy(subquery._.selectedFields, this)
|
|
};
|
|
}
|
|
if (prop === ViewBaseConfig) {
|
|
return {
|
|
...subquery[ViewBaseConfig],
|
|
selectedFields: new Proxy(subquery[ViewBaseConfig].selectedFields, this)
|
|
};
|
|
}
|
|
if (typeof prop === "symbol") {
|
|
return subquery[prop];
|
|
}
|
|
const columns = is(subquery, Subquery) ? subquery._.selectedFields : is(subquery, View) ? subquery[ViewBaseConfig].selectedFields : subquery;
|
|
const value = columns[prop];
|
|
if (is(value, SQL.Aliased)) {
|
|
if (this.config.sqlAliasedBehavior === "sql" && !value.isSelectionField) {
|
|
return value.sql;
|
|
}
|
|
const newValue = value.clone();
|
|
newValue.isSelectionField = true;
|
|
return newValue;
|
|
}
|
|
if (is(value, SQL)) {
|
|
if (this.config.sqlBehavior === "sql") {
|
|
return value;
|
|
}
|
|
throw new Error(`You tried to reference "${prop}" field from a subquery, which is a raw SQL field, but it doesn't have an alias declared. Please add an alias to the field using ".as('alias')" method.`);
|
|
}
|
|
if (is(value, Column)) {
|
|
if (this.config.alias) {
|
|
return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(value.table, new TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false))));
|
|
}
|
|
return value;
|
|
}
|
|
if (typeof value !== "object" || value === null) {
|
|
return value;
|
|
}
|
|
return new Proxy(value, new SelectionProxyHandler(this.config));
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/query-promise.js
|
|
class QueryPromise {
|
|
static [entityKind] = "QueryPromise";
|
|
[Symbol.toStringTag] = "QueryPromise";
|
|
catch(onRejected) {
|
|
return this.then(undefined, onRejected);
|
|
}
|
|
finally(onFinally) {
|
|
return this.then((value) => {
|
|
onFinally?.();
|
|
return value;
|
|
}, (reason) => {
|
|
onFinally?.();
|
|
throw reason;
|
|
});
|
|
}
|
|
then(onFulfilled, onRejected) {
|
|
return this.execute().then(onFulfilled, onRejected);
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/all.js
|
|
function getSQLiteColumnBuilders() {
|
|
return {
|
|
blob,
|
|
customType,
|
|
integer,
|
|
numeric,
|
|
real,
|
|
text
|
|
};
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/table.js
|
|
var InlineForeignKeys = Symbol.for("drizzle:SQLiteInlineForeignKeys");
|
|
|
|
class SQLiteTable extends Table {
|
|
static [entityKind] = "SQLiteTable";
|
|
static Symbol = Object.assign({}, Table.Symbol, {
|
|
InlineForeignKeys
|
|
});
|
|
[Table.Symbol.Columns];
|
|
[InlineForeignKeys] = [];
|
|
[Table.Symbol.ExtraConfigBuilder] = undefined;
|
|
}
|
|
function sqliteTableBase(name, columns, extraConfig, schema, baseName = name) {
|
|
const rawTable = new SQLiteTable(name, schema, baseName);
|
|
const parsedColumns = typeof columns === "function" ? columns(getSQLiteColumnBuilders()) : columns;
|
|
const builtColumns = Object.fromEntries(Object.entries(parsedColumns).map(([name2, colBuilderBase]) => {
|
|
const colBuilder = colBuilderBase;
|
|
colBuilder.setName(name2);
|
|
const column = colBuilder.build(rawTable);
|
|
rawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));
|
|
return [name2, column];
|
|
}));
|
|
const table = Object.assign(rawTable, builtColumns);
|
|
table[Table.Symbol.Columns] = builtColumns;
|
|
table[Table.Symbol.ExtraConfigColumns] = builtColumns;
|
|
if (extraConfig) {
|
|
table[SQLiteTable.Symbol.ExtraConfigBuilder] = extraConfig;
|
|
}
|
|
return table;
|
|
}
|
|
var sqliteTable = (name, columns, extraConfig) => {
|
|
return sqliteTableBase(name, columns, extraConfig);
|
|
};
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/indexes.js
|
|
class IndexBuilderOn {
|
|
constructor(name, unique) {
|
|
this.name = name;
|
|
this.unique = unique;
|
|
}
|
|
static [entityKind] = "SQLiteIndexBuilderOn";
|
|
on(...columns) {
|
|
return new IndexBuilder(this.name, columns, this.unique);
|
|
}
|
|
}
|
|
|
|
class IndexBuilder {
|
|
static [entityKind] = "SQLiteIndexBuilder";
|
|
config;
|
|
constructor(name, columns, unique) {
|
|
this.config = {
|
|
name,
|
|
columns,
|
|
unique,
|
|
where: undefined
|
|
};
|
|
}
|
|
where(condition) {
|
|
this.config.where = condition;
|
|
return this;
|
|
}
|
|
build(table) {
|
|
return new Index(this.config, table);
|
|
}
|
|
}
|
|
|
|
class Index {
|
|
static [entityKind] = "SQLiteIndex";
|
|
config;
|
|
constructor(config, table) {
|
|
this.config = { ...config, table };
|
|
}
|
|
}
|
|
function index(name) {
|
|
return new IndexBuilderOn(name, false);
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/utils.js
|
|
function extractUsedTable(table) {
|
|
if (is(table, SQLiteTable)) {
|
|
return [`${table[Table.Symbol.BaseName]}`];
|
|
}
|
|
if (is(table, Subquery)) {
|
|
return table._.usedTables ?? [];
|
|
}
|
|
if (is(table, SQL)) {
|
|
return table.usedTables ?? [];
|
|
}
|
|
return [];
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js
|
|
class SQLiteDeleteBase extends QueryPromise {
|
|
constructor(table, session, dialect, withList) {
|
|
super();
|
|
this.table = table;
|
|
this.session = session;
|
|
this.dialect = dialect;
|
|
this.config = { table, withList };
|
|
}
|
|
static [entityKind] = "SQLiteDelete";
|
|
config;
|
|
where(where) {
|
|
this.config.where = where;
|
|
return this;
|
|
}
|
|
orderBy(...columns) {
|
|
if (typeof columns[0] === "function") {
|
|
const orderBy = columns[0](new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
|
|
const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
|
|
this.config.orderBy = orderByArray;
|
|
} else {
|
|
const orderByArray = columns;
|
|
this.config.orderBy = orderByArray;
|
|
}
|
|
return this;
|
|
}
|
|
limit(limit) {
|
|
this.config.limit = limit;
|
|
return this;
|
|
}
|
|
returning(fields = this.table[SQLiteTable.Symbol.Columns]) {
|
|
this.config.returning = orderSelectedFields(fields);
|
|
return this;
|
|
}
|
|
getSQL() {
|
|
return this.dialect.buildDeleteQuery(this.config);
|
|
}
|
|
toSQL() {
|
|
const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
|
|
return rest;
|
|
}
|
|
_prepare(isOneTimeQuery = true) {
|
|
return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
|
|
type: "delete",
|
|
tables: extractUsedTable(this.config.table)
|
|
});
|
|
}
|
|
prepare() {
|
|
return this._prepare(false);
|
|
}
|
|
run = (placeholderValues) => {
|
|
return this._prepare().run(placeholderValues);
|
|
};
|
|
all = (placeholderValues) => {
|
|
return this._prepare().all(placeholderValues);
|
|
};
|
|
get = (placeholderValues) => {
|
|
return this._prepare().get(placeholderValues);
|
|
};
|
|
values = (placeholderValues) => {
|
|
return this._prepare().values(placeholderValues);
|
|
};
|
|
async execute(placeholderValues) {
|
|
return this._prepare().execute(placeholderValues);
|
|
}
|
|
$dynamic() {
|
|
return this;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/casing.js
|
|
function toSnakeCase(input) {
|
|
const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
|
|
return words.map((word) => word.toLowerCase()).join("_");
|
|
}
|
|
function toCamelCase(input) {
|
|
const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
|
|
return words.reduce((acc, word, i) => {
|
|
const formattedWord = i === 0 ? word.toLowerCase() : `${word[0].toUpperCase()}${word.slice(1)}`;
|
|
return acc + formattedWord;
|
|
}, "");
|
|
}
|
|
function noopCase(input) {
|
|
return input;
|
|
}
|
|
|
|
class CasingCache {
|
|
static [entityKind] = "CasingCache";
|
|
cache = {};
|
|
cachedTables = {};
|
|
convert;
|
|
constructor(casing) {
|
|
this.convert = casing === "snake_case" ? toSnakeCase : casing === "camelCase" ? toCamelCase : noopCase;
|
|
}
|
|
getColumnCasing(column) {
|
|
if (!column.keyAsName)
|
|
return column.name;
|
|
const schema = column.table[Table.Symbol.Schema] ?? "public";
|
|
const tableName = column.table[Table.Symbol.OriginalName];
|
|
const key = `${schema}.${tableName}.${column.name}`;
|
|
if (!this.cache[key]) {
|
|
this.cacheTable(column.table);
|
|
}
|
|
return this.cache[key];
|
|
}
|
|
cacheTable(table) {
|
|
const schema = table[Table.Symbol.Schema] ?? "public";
|
|
const tableName = table[Table.Symbol.OriginalName];
|
|
const tableKey = `${schema}.${tableName}`;
|
|
if (!this.cachedTables[tableKey]) {
|
|
for (const column of Object.values(table[Table.Symbol.Columns])) {
|
|
const columnKey = `${tableKey}.${column.name}`;
|
|
this.cache[columnKey] = this.convert(column.name);
|
|
}
|
|
this.cachedTables[tableKey] = true;
|
|
}
|
|
}
|
|
clearCache() {
|
|
this.cache = {};
|
|
this.cachedTables = {};
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/errors.js
|
|
class DrizzleError extends Error {
|
|
static [entityKind] = "DrizzleError";
|
|
constructor({ message, cause }) {
|
|
super(message);
|
|
this.name = "DrizzleError";
|
|
this.cause = cause;
|
|
}
|
|
}
|
|
|
|
class DrizzleQueryError extends Error {
|
|
constructor(query, params, cause) {
|
|
super(`Failed query: ${query}
|
|
params: ${params}`);
|
|
this.query = query;
|
|
this.params = params;
|
|
this.cause = cause;
|
|
Error.captureStackTrace(this, DrizzleQueryError);
|
|
if (cause)
|
|
this.cause = cause;
|
|
}
|
|
}
|
|
|
|
class TransactionRollbackError extends DrizzleError {
|
|
static [entityKind] = "TransactionRollbackError";
|
|
constructor() {
|
|
super({ message: "Rollback" });
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/pg-core/table.js
|
|
var InlineForeignKeys2 = Symbol.for("drizzle:PgInlineForeignKeys");
|
|
var EnableRLS = Symbol.for("drizzle:EnableRLS");
|
|
|
|
class PgTable extends Table {
|
|
static [entityKind] = "PgTable";
|
|
static Symbol = Object.assign({}, Table.Symbol, {
|
|
InlineForeignKeys: InlineForeignKeys2,
|
|
EnableRLS
|
|
});
|
|
[InlineForeignKeys2] = [];
|
|
[EnableRLS] = false;
|
|
[Table.Symbol.ExtraConfigBuilder] = undefined;
|
|
[Table.Symbol.ExtraConfigColumns] = {};
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/pg-core/primary-keys.js
|
|
class PrimaryKeyBuilder {
|
|
static [entityKind] = "PgPrimaryKeyBuilder";
|
|
columns;
|
|
name;
|
|
constructor(columns, name) {
|
|
this.columns = columns;
|
|
this.name = name;
|
|
}
|
|
build(table) {
|
|
return new PrimaryKey(table, this.columns, this.name);
|
|
}
|
|
}
|
|
|
|
class PrimaryKey {
|
|
constructor(table, columns, name) {
|
|
this.table = table;
|
|
this.columns = columns;
|
|
this.name = name;
|
|
}
|
|
static [entityKind] = "PgPrimaryKey";
|
|
columns;
|
|
name;
|
|
getName() {
|
|
return this.name ?? `${this.table[PgTable.Symbol.Name]}_${this.columns.map((column) => column.name).join("_")}_pk`;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sql/expressions/conditions.js
|
|
function bindIfParam(value, column) {
|
|
if (isDriverValueEncoder(column) && !isSQLWrapper(value) && !is(value, Param) && !is(value, Placeholder) && !is(value, Column) && !is(value, Table) && !is(value, View)) {
|
|
return new Param(value, column);
|
|
}
|
|
return value;
|
|
}
|
|
var eq = (left, right) => {
|
|
return sql`${left} = ${bindIfParam(right, left)}`;
|
|
};
|
|
var ne = (left, right) => {
|
|
return sql`${left} <> ${bindIfParam(right, left)}`;
|
|
};
|
|
function and(...unfilteredConditions) {
|
|
const conditions = unfilteredConditions.filter((c) => c !== undefined);
|
|
if (conditions.length === 0) {
|
|
return;
|
|
}
|
|
if (conditions.length === 1) {
|
|
return new SQL(conditions);
|
|
}
|
|
return new SQL([
|
|
new StringChunk("("),
|
|
sql.join(conditions, new StringChunk(" and ")),
|
|
new StringChunk(")")
|
|
]);
|
|
}
|
|
function or(...unfilteredConditions) {
|
|
const conditions = unfilteredConditions.filter((c) => c !== undefined);
|
|
if (conditions.length === 0) {
|
|
return;
|
|
}
|
|
if (conditions.length === 1) {
|
|
return new SQL(conditions);
|
|
}
|
|
return new SQL([
|
|
new StringChunk("("),
|
|
sql.join(conditions, new StringChunk(" or ")),
|
|
new StringChunk(")")
|
|
]);
|
|
}
|
|
function not(condition) {
|
|
return sql`not ${condition}`;
|
|
}
|
|
var gt = (left, right) => {
|
|
return sql`${left} > ${bindIfParam(right, left)}`;
|
|
};
|
|
var gte = (left, right) => {
|
|
return sql`${left} >= ${bindIfParam(right, left)}`;
|
|
};
|
|
var lt = (left, right) => {
|
|
return sql`${left} < ${bindIfParam(right, left)}`;
|
|
};
|
|
var lte = (left, right) => {
|
|
return sql`${left} <= ${bindIfParam(right, left)}`;
|
|
};
|
|
function inArray(column, values) {
|
|
if (Array.isArray(values)) {
|
|
if (values.length === 0) {
|
|
return sql`false`;
|
|
}
|
|
return sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;
|
|
}
|
|
return sql`${column} in ${bindIfParam(values, column)}`;
|
|
}
|
|
function notInArray(column, values) {
|
|
if (Array.isArray(values)) {
|
|
if (values.length === 0) {
|
|
return sql`true`;
|
|
}
|
|
return sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;
|
|
}
|
|
return sql`${column} not in ${bindIfParam(values, column)}`;
|
|
}
|
|
function isNull(value) {
|
|
return sql`${value} is null`;
|
|
}
|
|
function isNotNull(value) {
|
|
return sql`${value} is not null`;
|
|
}
|
|
function exists(subquery) {
|
|
return sql`exists ${subquery}`;
|
|
}
|
|
function notExists(subquery) {
|
|
return sql`not exists ${subquery}`;
|
|
}
|
|
function between(column, min, max) {
|
|
return sql`${column} between ${bindIfParam(min, column)} and ${bindIfParam(max, column)}`;
|
|
}
|
|
function notBetween(column, min, max) {
|
|
return sql`${column} not between ${bindIfParam(min, column)} and ${bindIfParam(max, column)}`;
|
|
}
|
|
function like(column, value) {
|
|
return sql`${column} like ${value}`;
|
|
}
|
|
function notLike(column, value) {
|
|
return sql`${column} not like ${value}`;
|
|
}
|
|
function ilike(column, value) {
|
|
return sql`${column} ilike ${value}`;
|
|
}
|
|
function notIlike(column, value) {
|
|
return sql`${column} not ilike ${value}`;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sql/expressions/select.js
|
|
function asc(column) {
|
|
return sql`${column} asc`;
|
|
}
|
|
function desc(column) {
|
|
return sql`${column} desc`;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/relations.js
|
|
class Relation {
|
|
constructor(sourceTable, referencedTable, relationName) {
|
|
this.sourceTable = sourceTable;
|
|
this.referencedTable = referencedTable;
|
|
this.relationName = relationName;
|
|
this.referencedTableName = referencedTable[Table.Symbol.Name];
|
|
}
|
|
static [entityKind] = "Relation";
|
|
referencedTableName;
|
|
fieldName;
|
|
}
|
|
|
|
class Relations {
|
|
constructor(table, config) {
|
|
this.table = table;
|
|
this.config = config;
|
|
}
|
|
static [entityKind] = "Relations";
|
|
}
|
|
|
|
class One extends Relation {
|
|
constructor(sourceTable, referencedTable, config, isNullable) {
|
|
super(sourceTable, referencedTable, config?.relationName);
|
|
this.config = config;
|
|
this.isNullable = isNullable;
|
|
}
|
|
static [entityKind] = "One";
|
|
withFieldName(fieldName) {
|
|
const relation = new One(this.sourceTable, this.referencedTable, this.config, this.isNullable);
|
|
relation.fieldName = fieldName;
|
|
return relation;
|
|
}
|
|
}
|
|
|
|
class Many extends Relation {
|
|
constructor(sourceTable, referencedTable, config) {
|
|
super(sourceTable, referencedTable, config?.relationName);
|
|
this.config = config;
|
|
}
|
|
static [entityKind] = "Many";
|
|
withFieldName(fieldName) {
|
|
const relation = new Many(this.sourceTable, this.referencedTable, this.config);
|
|
relation.fieldName = fieldName;
|
|
return relation;
|
|
}
|
|
}
|
|
function getOperators() {
|
|
return {
|
|
and,
|
|
between,
|
|
eq,
|
|
exists,
|
|
gt,
|
|
gte,
|
|
ilike,
|
|
inArray,
|
|
isNull,
|
|
isNotNull,
|
|
like,
|
|
lt,
|
|
lte,
|
|
ne,
|
|
not,
|
|
notBetween,
|
|
notExists,
|
|
notLike,
|
|
notIlike,
|
|
notInArray,
|
|
or,
|
|
sql
|
|
};
|
|
}
|
|
function getOrderByOperators() {
|
|
return {
|
|
sql,
|
|
asc,
|
|
desc
|
|
};
|
|
}
|
|
function extractTablesRelationalConfig(schema, configHelpers) {
|
|
if (Object.keys(schema).length === 1 && "default" in schema && !is(schema["default"], Table)) {
|
|
schema = schema["default"];
|
|
}
|
|
const tableNamesMap = {};
|
|
const relationsBuffer = {};
|
|
const tablesConfig = {};
|
|
for (const [key, value] of Object.entries(schema)) {
|
|
if (is(value, Table)) {
|
|
const dbName = getTableUniqueName(value);
|
|
const bufferedRelations = relationsBuffer[dbName];
|
|
tableNamesMap[dbName] = key;
|
|
tablesConfig[key] = {
|
|
tsName: key,
|
|
dbName: value[Table.Symbol.Name],
|
|
schema: value[Table.Symbol.Schema],
|
|
columns: value[Table.Symbol.Columns],
|
|
relations: bufferedRelations?.relations ?? {},
|
|
primaryKey: bufferedRelations?.primaryKey ?? []
|
|
};
|
|
for (const column of Object.values(value[Table.Symbol.Columns])) {
|
|
if (column.primary) {
|
|
tablesConfig[key].primaryKey.push(column);
|
|
}
|
|
}
|
|
const extraConfig = value[Table.Symbol.ExtraConfigBuilder]?.(value[Table.Symbol.ExtraConfigColumns]);
|
|
if (extraConfig) {
|
|
for (const configEntry of Object.values(extraConfig)) {
|
|
if (is(configEntry, PrimaryKeyBuilder)) {
|
|
tablesConfig[key].primaryKey.push(...configEntry.columns);
|
|
}
|
|
}
|
|
}
|
|
} else if (is(value, Relations)) {
|
|
const dbName = getTableUniqueName(value.table);
|
|
const tableName = tableNamesMap[dbName];
|
|
const relations2 = value.config(configHelpers(value.table));
|
|
let primaryKey;
|
|
for (const [relationName, relation] of Object.entries(relations2)) {
|
|
if (tableName) {
|
|
const tableConfig = tablesConfig[tableName];
|
|
tableConfig.relations[relationName] = relation;
|
|
if (primaryKey) {
|
|
tableConfig.primaryKey.push(...primaryKey);
|
|
}
|
|
} else {
|
|
if (!(dbName in relationsBuffer)) {
|
|
relationsBuffer[dbName] = {
|
|
relations: {},
|
|
primaryKey
|
|
};
|
|
}
|
|
relationsBuffer[dbName].relations[relationName] = relation;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return { tables: tablesConfig, tableNamesMap };
|
|
}
|
|
function relations(table, relations2) {
|
|
return new Relations(table, (helpers) => Object.fromEntries(Object.entries(relations2(helpers)).map(([key, value]) => [
|
|
key,
|
|
value.withFieldName(key)
|
|
])));
|
|
}
|
|
function createOne(sourceTable) {
|
|
return function one(table, config) {
|
|
return new One(sourceTable, table, config, config?.fields.reduce((res, f) => res && f.notNull, true) ?? false);
|
|
};
|
|
}
|
|
function createMany(sourceTable) {
|
|
return function many(referencedTable, config) {
|
|
return new Many(sourceTable, referencedTable, config);
|
|
};
|
|
}
|
|
function normalizeRelation(schema, tableNamesMap, relation) {
|
|
if (is(relation, One) && relation.config) {
|
|
return {
|
|
fields: relation.config.fields,
|
|
references: relation.config.references
|
|
};
|
|
}
|
|
const referencedTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)];
|
|
if (!referencedTableTsName) {
|
|
throw new Error(`Table "${relation.referencedTable[Table.Symbol.Name]}" not found in schema`);
|
|
}
|
|
const referencedTableConfig = schema[referencedTableTsName];
|
|
if (!referencedTableConfig) {
|
|
throw new Error(`Table "${referencedTableTsName}" not found in schema`);
|
|
}
|
|
const sourceTable = relation.sourceTable;
|
|
const sourceTableTsName = tableNamesMap[getTableUniqueName(sourceTable)];
|
|
if (!sourceTableTsName) {
|
|
throw new Error(`Table "${sourceTable[Table.Symbol.Name]}" not found in schema`);
|
|
}
|
|
const reverseRelations = [];
|
|
for (const referencedTableRelation of Object.values(referencedTableConfig.relations)) {
|
|
if (relation.relationName && relation !== referencedTableRelation && referencedTableRelation.relationName === relation.relationName || !relation.relationName && referencedTableRelation.referencedTable === relation.sourceTable) {
|
|
reverseRelations.push(referencedTableRelation);
|
|
}
|
|
}
|
|
if (reverseRelations.length > 1) {
|
|
throw relation.relationName ? new Error(`There are multiple relations with name "${relation.relationName}" in table "${referencedTableTsName}"`) : new Error(`There are multiple relations between "${referencedTableTsName}" and "${relation.sourceTable[Table.Symbol.Name]}". Please specify relation name`);
|
|
}
|
|
if (reverseRelations[0] && is(reverseRelations[0], One) && reverseRelations[0].config) {
|
|
return {
|
|
fields: reverseRelations[0].config.references,
|
|
references: reverseRelations[0].config.fields
|
|
};
|
|
}
|
|
throw new Error(`There is not enough information to infer relation "${sourceTableTsName}.${relation.fieldName}"`);
|
|
}
|
|
function createTableRelationsHelpers(sourceTable) {
|
|
return {
|
|
one: createOne(sourceTable),
|
|
many: createMany(sourceTable)
|
|
};
|
|
}
|
|
function mapRelationalRow(tablesConfig, tableConfig, row, buildQueryResultSelection, mapColumnValue = (value) => value) {
|
|
const result = {};
|
|
for (const [
|
|
selectionItemIndex,
|
|
selectionItem
|
|
] of buildQueryResultSelection.entries()) {
|
|
if (selectionItem.isJson) {
|
|
const relation = tableConfig.relations[selectionItem.tsKey];
|
|
const rawSubRows = row[selectionItemIndex];
|
|
const subRows = typeof rawSubRows === "string" ? JSON.parse(rawSubRows) : rawSubRows;
|
|
result[selectionItem.tsKey] = is(relation, One) ? subRows && mapRelationalRow(tablesConfig, tablesConfig[selectionItem.relationTableTsKey], subRows, selectionItem.selection, mapColumnValue) : subRows.map((subRow) => mapRelationalRow(tablesConfig, tablesConfig[selectionItem.relationTableTsKey], subRow, selectionItem.selection, mapColumnValue));
|
|
} else {
|
|
const value = mapColumnValue(row[selectionItemIndex]);
|
|
const field = selectionItem.field;
|
|
let decoder;
|
|
if (is(field, Column)) {
|
|
decoder = field;
|
|
} else if (is(field, SQL)) {
|
|
decoder = field.decoder;
|
|
} else {
|
|
decoder = field.sql.decoder;
|
|
}
|
|
result[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/view-base.js
|
|
class SQLiteViewBase extends View {
|
|
static [entityKind] = "SQLiteViewBase";
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/dialect.js
|
|
class SQLiteDialect {
|
|
static [entityKind] = "SQLiteDialect";
|
|
casing;
|
|
constructor(config) {
|
|
this.casing = new CasingCache(config?.casing);
|
|
}
|
|
escapeName(name) {
|
|
return `"${name}"`;
|
|
}
|
|
escapeParam(_num) {
|
|
return "?";
|
|
}
|
|
escapeString(str) {
|
|
return `'${str.replace(/'/g, "''")}'`;
|
|
}
|
|
buildWithCTE(queries) {
|
|
if (!queries?.length)
|
|
return;
|
|
const withSqlChunks = [sql`with `];
|
|
for (const [i, w] of queries.entries()) {
|
|
withSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);
|
|
if (i < queries.length - 1) {
|
|
withSqlChunks.push(sql`, `);
|
|
}
|
|
}
|
|
withSqlChunks.push(sql` `);
|
|
return sql.join(withSqlChunks);
|
|
}
|
|
buildDeleteQuery({ table, where, returning, withList, limit, orderBy }) {
|
|
const withSql = this.buildWithCTE(withList);
|
|
const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
|
|
const whereSql = where ? sql` where ${where}` : undefined;
|
|
const orderBySql = this.buildOrderBy(orderBy);
|
|
const limitSql = this.buildLimit(limit);
|
|
return sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;
|
|
}
|
|
buildUpdateSet(table, set) {
|
|
const tableColumns = table[Table.Symbol.Columns];
|
|
const columnNames = Object.keys(tableColumns).filter((colName) => set[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined);
|
|
const setSize = columnNames.length;
|
|
return sql.join(columnNames.flatMap((colName, i) => {
|
|
const col = tableColumns[colName];
|
|
const value = set[colName] ?? sql.param(col.onUpdateFn(), col);
|
|
const res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;
|
|
if (i < setSize - 1) {
|
|
return [res, sql.raw(", ")];
|
|
}
|
|
return [res];
|
|
}));
|
|
}
|
|
buildUpdateQuery({ table, set, where, returning, withList, joins, from, limit, orderBy }) {
|
|
const withSql = this.buildWithCTE(withList);
|
|
const setSql = this.buildUpdateSet(table, set);
|
|
const fromSql = from && sql.join([sql.raw(" from "), this.buildFromTable(from)]);
|
|
const joinsSql = this.buildJoins(joins);
|
|
const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
|
|
const whereSql = where ? sql` where ${where}` : undefined;
|
|
const orderBySql = this.buildOrderBy(orderBy);
|
|
const limitSql = this.buildLimit(limit);
|
|
return sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;
|
|
}
|
|
buildSelection(fields, { isSingleTable = false } = {}) {
|
|
const columnsLen = fields.length;
|
|
const chunks = fields.flatMap(({ field }, i) => {
|
|
const chunk = [];
|
|
if (is(field, SQL.Aliased) && field.isSelectionField) {
|
|
chunk.push(sql.identifier(field.fieldAlias));
|
|
} else if (is(field, SQL.Aliased) || is(field, SQL)) {
|
|
const query = is(field, SQL.Aliased) ? field.sql : field;
|
|
if (isSingleTable) {
|
|
chunk.push(new SQL(query.queryChunks.map((c) => {
|
|
if (is(c, Column)) {
|
|
return sql.identifier(this.casing.getColumnCasing(c));
|
|
}
|
|
return c;
|
|
})));
|
|
} else {
|
|
chunk.push(query);
|
|
}
|
|
if (is(field, SQL.Aliased)) {
|
|
chunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);
|
|
}
|
|
} else if (is(field, Column)) {
|
|
const tableName = field.table[Table.Symbol.Name];
|
|
if (field.columnType === "SQLiteNumericBigInt") {
|
|
if (isSingleTable) {
|
|
chunk.push(sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
|
|
} else {
|
|
chunk.push(sql`cast(${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
|
|
}
|
|
} else {
|
|
if (isSingleTable) {
|
|
chunk.push(sql.identifier(this.casing.getColumnCasing(field)));
|
|
} else {
|
|
chunk.push(sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`);
|
|
}
|
|
}
|
|
}
|
|
if (i < columnsLen - 1) {
|
|
chunk.push(sql`, `);
|
|
}
|
|
return chunk;
|
|
});
|
|
return sql.join(chunks);
|
|
}
|
|
buildJoins(joins) {
|
|
if (!joins || joins.length === 0) {
|
|
return;
|
|
}
|
|
const joinsArray = [];
|
|
if (joins) {
|
|
for (const [index2, joinMeta] of joins.entries()) {
|
|
if (index2 === 0) {
|
|
joinsArray.push(sql` `);
|
|
}
|
|
const table = joinMeta.table;
|
|
const onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;
|
|
if (is(table, SQLiteTable)) {
|
|
const tableName = table[SQLiteTable.Symbol.Name];
|
|
const tableSchema = table[SQLiteTable.Symbol.Schema];
|
|
const origTableName = table[SQLiteTable.Symbol.OriginalName];
|
|
const alias = tableName === origTableName ? undefined : joinMeta.alias;
|
|
joinsArray.push(sql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${sql.identifier(origTableName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`);
|
|
} else {
|
|
joinsArray.push(sql`${sql.raw(joinMeta.joinType)} join ${table}${onSql}`);
|
|
}
|
|
if (index2 < joins.length - 1) {
|
|
joinsArray.push(sql` `);
|
|
}
|
|
}
|
|
}
|
|
return sql.join(joinsArray);
|
|
}
|
|
buildLimit(limit) {
|
|
return typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : undefined;
|
|
}
|
|
buildOrderBy(orderBy) {
|
|
const orderByList = [];
|
|
if (orderBy) {
|
|
for (const [index2, orderByValue] of orderBy.entries()) {
|
|
orderByList.push(orderByValue);
|
|
if (index2 < orderBy.length - 1) {
|
|
orderByList.push(sql`, `);
|
|
}
|
|
}
|
|
}
|
|
return orderByList.length > 0 ? sql` order by ${sql.join(orderByList)}` : undefined;
|
|
}
|
|
buildFromTable(table) {
|
|
if (is(table, Table) && table[Table.Symbol.IsAlias]) {
|
|
return sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? "")}.`.if(table[Table.Symbol.Schema])}${sql.identifier(table[Table.Symbol.OriginalName])} ${sql.identifier(table[Table.Symbol.Name])}`;
|
|
}
|
|
return table;
|
|
}
|
|
buildSelectQuery({
|
|
withList,
|
|
fields,
|
|
fieldsFlat,
|
|
where,
|
|
having,
|
|
table,
|
|
joins,
|
|
orderBy,
|
|
groupBy,
|
|
limit,
|
|
offset,
|
|
distinct,
|
|
setOperators
|
|
}) {
|
|
const fieldsList = fieldsFlat ?? orderSelectedFields(fields);
|
|
for (const f of fieldsList) {
|
|
if (is(f.field, Column) && getTableName(f.field.table) !== (is(table, Subquery) ? table._.alias : is(table, SQLiteViewBase) ? table[ViewBaseConfig].name : is(table, SQL) ? undefined : getTableName(table)) && !((table2) => joins?.some(({ alias }) => alias === (table2[Table.Symbol.IsAlias] ? getTableName(table2) : table2[Table.Symbol.BaseName])))(f.field.table)) {
|
|
const tableName = getTableName(f.field.table);
|
|
throw new Error(`Your "${f.path.join("->")}" field references a column "${tableName}"."${f.field.name}", but the table "${tableName}" is not part of the query! Did you forget to join it?`);
|
|
}
|
|
}
|
|
const isSingleTable = !joins || joins.length === 0;
|
|
const withSql = this.buildWithCTE(withList);
|
|
const distinctSql = distinct ? sql` distinct` : undefined;
|
|
const selection = this.buildSelection(fieldsList, { isSingleTable });
|
|
const tableSql = this.buildFromTable(table);
|
|
const joinsSql = this.buildJoins(joins);
|
|
const whereSql = where ? sql` where ${where}` : undefined;
|
|
const havingSql = having ? sql` having ${having}` : undefined;
|
|
const groupByList = [];
|
|
if (groupBy) {
|
|
for (const [index2, groupByValue] of groupBy.entries()) {
|
|
groupByList.push(groupByValue);
|
|
if (index2 < groupBy.length - 1) {
|
|
groupByList.push(sql`, `);
|
|
}
|
|
}
|
|
}
|
|
const groupBySql = groupByList.length > 0 ? sql` group by ${sql.join(groupByList)}` : undefined;
|
|
const orderBySql = this.buildOrderBy(orderBy);
|
|
const limitSql = this.buildLimit(limit);
|
|
const offsetSql = offset ? sql` offset ${offset}` : undefined;
|
|
const finalQuery = sql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;
|
|
if (setOperators.length > 0) {
|
|
return this.buildSetOperations(finalQuery, setOperators);
|
|
}
|
|
return finalQuery;
|
|
}
|
|
buildSetOperations(leftSelect, setOperators) {
|
|
const [setOperator, ...rest] = setOperators;
|
|
if (!setOperator) {
|
|
throw new Error("Cannot pass undefined values to any set operator");
|
|
}
|
|
if (rest.length === 0) {
|
|
return this.buildSetOperationQuery({ leftSelect, setOperator });
|
|
}
|
|
return this.buildSetOperations(this.buildSetOperationQuery({ leftSelect, setOperator }), rest);
|
|
}
|
|
buildSetOperationQuery({
|
|
leftSelect,
|
|
setOperator: { type, isAll, rightSelect, limit, orderBy, offset }
|
|
}) {
|
|
const leftChunk = sql`${leftSelect.getSQL()} `;
|
|
const rightChunk = sql`${rightSelect.getSQL()}`;
|
|
let orderBySql;
|
|
if (orderBy && orderBy.length > 0) {
|
|
const orderByValues = [];
|
|
for (const singleOrderBy of orderBy) {
|
|
if (is(singleOrderBy, SQLiteColumn)) {
|
|
orderByValues.push(sql.identifier(singleOrderBy.name));
|
|
} else if (is(singleOrderBy, SQL)) {
|
|
for (let i = 0;i < singleOrderBy.queryChunks.length; i++) {
|
|
const chunk = singleOrderBy.queryChunks[i];
|
|
if (is(chunk, SQLiteColumn)) {
|
|
singleOrderBy.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));
|
|
}
|
|
}
|
|
orderByValues.push(sql`${singleOrderBy}`);
|
|
} else {
|
|
orderByValues.push(sql`${singleOrderBy}`);
|
|
}
|
|
}
|
|
orderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;
|
|
}
|
|
const limitSql = typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : undefined;
|
|
const operatorChunk = sql.raw(`${type} ${isAll ? "all " : ""}`);
|
|
const offsetSql = offset ? sql` offset ${offset}` : undefined;
|
|
return sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;
|
|
}
|
|
buildInsertQuery({ table, values: valuesOrSelect, onConflict, returning, withList, select }) {
|
|
const valuesSqlList = [];
|
|
const columns = table[Table.Symbol.Columns];
|
|
const colEntries = Object.entries(columns).filter(([_, col]) => !col.shouldDisableInsert());
|
|
const insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));
|
|
if (select) {
|
|
const select2 = valuesOrSelect;
|
|
if (is(select2, SQL)) {
|
|
valuesSqlList.push(select2);
|
|
} else {
|
|
valuesSqlList.push(select2.getSQL());
|
|
}
|
|
} else {
|
|
const values = valuesOrSelect;
|
|
valuesSqlList.push(sql.raw("values "));
|
|
for (const [valueIndex, value] of values.entries()) {
|
|
const valueList = [];
|
|
for (const [fieldName, col] of colEntries) {
|
|
const colValue = value[fieldName];
|
|
if (colValue === undefined || is(colValue, Param) && colValue.value === undefined) {
|
|
let defaultValue;
|
|
if (col.default !== null && col.default !== undefined) {
|
|
defaultValue = is(col.default, SQL) ? col.default : sql.param(col.default, col);
|
|
} else if (col.defaultFn !== undefined) {
|
|
const defaultFnResult = col.defaultFn();
|
|
defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);
|
|
} else if (!col.default && col.onUpdateFn !== undefined) {
|
|
const onUpdateFnResult = col.onUpdateFn();
|
|
defaultValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);
|
|
} else {
|
|
defaultValue = sql`null`;
|
|
}
|
|
valueList.push(defaultValue);
|
|
} else {
|
|
valueList.push(colValue);
|
|
}
|
|
}
|
|
valuesSqlList.push(valueList);
|
|
if (valueIndex < values.length - 1) {
|
|
valuesSqlList.push(sql`, `);
|
|
}
|
|
}
|
|
}
|
|
const withSql = this.buildWithCTE(withList);
|
|
const valuesSql = sql.join(valuesSqlList);
|
|
const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
|
|
const onConflictSql = onConflict?.length ? sql.join(onConflict) : undefined;
|
|
return sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;
|
|
}
|
|
sqlToQuery(sql2, invokeSource) {
|
|
return sql2.toQuery({
|
|
casing: this.casing,
|
|
escapeName: this.escapeName,
|
|
escapeParam: this.escapeParam,
|
|
escapeString: this.escapeString,
|
|
invokeSource
|
|
});
|
|
}
|
|
buildRelationalQuery({
|
|
fullSchema,
|
|
schema,
|
|
tableNamesMap,
|
|
table,
|
|
tableConfig,
|
|
queryConfig: config,
|
|
tableAlias,
|
|
nestedQueryRelation,
|
|
joinOn
|
|
}) {
|
|
let selection = [];
|
|
let limit, offset, orderBy = [], where;
|
|
const joins = [];
|
|
if (config === true) {
|
|
const selectionEntries = Object.entries(tableConfig.columns);
|
|
selection = selectionEntries.map(([key, value]) => ({
|
|
dbKey: value.name,
|
|
tsKey: key,
|
|
field: aliasedTableColumn(value, tableAlias),
|
|
relationTableTsKey: undefined,
|
|
isJson: false,
|
|
selection: []
|
|
}));
|
|
} else {
|
|
const aliasedColumns = Object.fromEntries(Object.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]));
|
|
if (config.where) {
|
|
const whereSql = typeof config.where === "function" ? config.where(aliasedColumns, getOperators()) : config.where;
|
|
where = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);
|
|
}
|
|
const fieldsSelection = [];
|
|
let selectedColumns = [];
|
|
if (config.columns) {
|
|
let isIncludeMode = false;
|
|
for (const [field, value] of Object.entries(config.columns)) {
|
|
if (value === undefined) {
|
|
continue;
|
|
}
|
|
if (field in tableConfig.columns) {
|
|
if (!isIncludeMode && value === true) {
|
|
isIncludeMode = true;
|
|
}
|
|
selectedColumns.push(field);
|
|
}
|
|
}
|
|
if (selectedColumns.length > 0) {
|
|
selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config.columns?.[c] === true) : Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));
|
|
}
|
|
} else {
|
|
selectedColumns = Object.keys(tableConfig.columns);
|
|
}
|
|
for (const field of selectedColumns) {
|
|
const column = tableConfig.columns[field];
|
|
fieldsSelection.push({ tsKey: field, value: column });
|
|
}
|
|
let selectedRelations = [];
|
|
if (config.with) {
|
|
selectedRelations = Object.entries(config.with).filter((entry) => !!entry[1]).map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey] }));
|
|
}
|
|
let extras;
|
|
if (config.extras) {
|
|
extras = typeof config.extras === "function" ? config.extras(aliasedColumns, { sql }) : config.extras;
|
|
for (const [tsKey, value] of Object.entries(extras)) {
|
|
fieldsSelection.push({
|
|
tsKey,
|
|
value: mapColumnsInAliasedSQLToAlias(value, tableAlias)
|
|
});
|
|
}
|
|
}
|
|
for (const { tsKey, value } of fieldsSelection) {
|
|
selection.push({
|
|
dbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey].name,
|
|
tsKey,
|
|
field: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,
|
|
relationTableTsKey: undefined,
|
|
isJson: false,
|
|
selection: []
|
|
});
|
|
}
|
|
let orderByOrig = typeof config.orderBy === "function" ? config.orderBy(aliasedColumns, getOrderByOperators()) : config.orderBy ?? [];
|
|
if (!Array.isArray(orderByOrig)) {
|
|
orderByOrig = [orderByOrig];
|
|
}
|
|
orderBy = orderByOrig.map((orderByValue) => {
|
|
if (is(orderByValue, Column)) {
|
|
return aliasedTableColumn(orderByValue, tableAlias);
|
|
}
|
|
return mapColumnsInSQLToAlias(orderByValue, tableAlias);
|
|
});
|
|
limit = config.limit;
|
|
offset = config.offset;
|
|
for (const {
|
|
tsKey: selectedRelationTsKey,
|
|
queryConfig: selectedRelationConfigValue,
|
|
relation
|
|
} of selectedRelations) {
|
|
const normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);
|
|
const relationTableName = getTableUniqueName(relation.referencedTable);
|
|
const relationTableTsName = tableNamesMap[relationTableName];
|
|
const relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;
|
|
const joinOn2 = and(...normalizedRelation.fields.map((field2, i) => eq(aliasedTableColumn(normalizedRelation.references[i], relationTableAlias), aliasedTableColumn(field2, tableAlias))));
|
|
const builtRelation = this.buildRelationalQuery({
|
|
fullSchema,
|
|
schema,
|
|
tableNamesMap,
|
|
table: fullSchema[relationTableTsName],
|
|
tableConfig: schema[relationTableTsName],
|
|
queryConfig: is(relation, One) ? selectedRelationConfigValue === true ? { limit: 1 } : { ...selectedRelationConfigValue, limit: 1 } : selectedRelationConfigValue,
|
|
tableAlias: relationTableAlias,
|
|
joinOn: joinOn2,
|
|
nestedQueryRelation: relation
|
|
});
|
|
const field = sql`(${builtRelation.sql})`.as(selectedRelationTsKey);
|
|
selection.push({
|
|
dbKey: selectedRelationTsKey,
|
|
tsKey: selectedRelationTsKey,
|
|
field,
|
|
relationTableTsKey: relationTableTsName,
|
|
isJson: true,
|
|
selection: builtRelation.selection
|
|
});
|
|
}
|
|
}
|
|
if (selection.length === 0) {
|
|
throw new DrizzleError({
|
|
message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}"). You need to have at least one item in "columns", "with" or "extras". If you need to select all columns, omit the "columns" key or set it to undefined.`
|
|
});
|
|
}
|
|
let result;
|
|
where = and(joinOn, where);
|
|
if (nestedQueryRelation) {
|
|
let field = sql`json_array(${sql.join(selection.map(({ field: field2 }) => is(field2, SQLiteColumn) ? sql.identifier(this.casing.getColumnCasing(field2)) : is(field2, SQL.Aliased) ? field2.sql : field2), sql`, `)})`;
|
|
if (is(nestedQueryRelation, Many)) {
|
|
field = sql`coalesce(json_group_array(${field}), json_array())`;
|
|
}
|
|
const nestedSelection = [{
|
|
dbKey: "data",
|
|
tsKey: "data",
|
|
field: field.as("data"),
|
|
isJson: true,
|
|
relationTableTsKey: tableConfig.tsName,
|
|
selection
|
|
}];
|
|
const needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;
|
|
if (needsSubquery) {
|
|
result = this.buildSelectQuery({
|
|
table: aliasedTable(table, tableAlias),
|
|
fields: {},
|
|
fieldsFlat: [
|
|
{
|
|
path: [],
|
|
field: sql.raw("*")
|
|
}
|
|
],
|
|
where,
|
|
limit,
|
|
offset,
|
|
orderBy,
|
|
setOperators: []
|
|
});
|
|
where = undefined;
|
|
limit = undefined;
|
|
offset = undefined;
|
|
orderBy = undefined;
|
|
} else {
|
|
result = aliasedTable(table, tableAlias);
|
|
}
|
|
result = this.buildSelectQuery({
|
|
table: is(result, SQLiteTable) ? result : new Subquery(result, {}, tableAlias),
|
|
fields: {},
|
|
fieldsFlat: nestedSelection.map(({ field: field2 }) => ({
|
|
path: [],
|
|
field: is(field2, Column) ? aliasedTableColumn(field2, tableAlias) : field2
|
|
})),
|
|
joins,
|
|
where,
|
|
limit,
|
|
offset,
|
|
orderBy,
|
|
setOperators: []
|
|
});
|
|
} else {
|
|
result = this.buildSelectQuery({
|
|
table: aliasedTable(table, tableAlias),
|
|
fields: {},
|
|
fieldsFlat: selection.map(({ field }) => ({
|
|
path: [],
|
|
field: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field
|
|
})),
|
|
joins,
|
|
where,
|
|
limit,
|
|
offset,
|
|
orderBy,
|
|
setOperators: []
|
|
});
|
|
}
|
|
return {
|
|
tableTsKey: tableConfig.tsName,
|
|
sql: result,
|
|
selection
|
|
};
|
|
}
|
|
}
|
|
|
|
class SQLiteSyncDialect extends SQLiteDialect {
|
|
static [entityKind] = "SQLiteSyncDialect";
|
|
migrate(migrations, session, config) {
|
|
const migrationsTable = config === undefined ? "__drizzle_migrations" : typeof config === "string" ? "__drizzle_migrations" : config.migrationsTable ?? "__drizzle_migrations";
|
|
const migrationTableCreate = sql`
|
|
CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (
|
|
id SERIAL PRIMARY KEY,
|
|
hash text NOT NULL,
|
|
created_at numeric
|
|
)
|
|
`;
|
|
session.run(migrationTableCreate);
|
|
const dbMigrations = session.values(sql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`);
|
|
const lastDbMigration = dbMigrations[0] ?? undefined;
|
|
session.run(sql`BEGIN`);
|
|
try {
|
|
for (const migration of migrations) {
|
|
if (!lastDbMigration || Number(lastDbMigration[2]) < migration.folderMillis) {
|
|
for (const stmt of migration.sql) {
|
|
session.run(sql.raw(stmt));
|
|
}
|
|
session.run(sql`INSERT INTO ${sql.identifier(migrationsTable)} ("hash", "created_at") VALUES(${migration.hash}, ${migration.folderMillis})`);
|
|
}
|
|
}
|
|
session.run(sql`COMMIT`);
|
|
} catch (e) {
|
|
session.run(sql`ROLLBACK`);
|
|
throw e;
|
|
}
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/query-builders/query-builder.js
|
|
class TypedQueryBuilder {
|
|
static [entityKind] = "TypedQueryBuilder";
|
|
getSelectedFields() {
|
|
return this._.selectedFields;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/select.js
|
|
class SQLiteSelectBuilder {
|
|
static [entityKind] = "SQLiteSelectBuilder";
|
|
fields;
|
|
session;
|
|
dialect;
|
|
withList;
|
|
distinct;
|
|
constructor(config) {
|
|
this.fields = config.fields;
|
|
this.session = config.session;
|
|
this.dialect = config.dialect;
|
|
this.withList = config.withList;
|
|
this.distinct = config.distinct;
|
|
}
|
|
from(source) {
|
|
const isPartialSelect = !!this.fields;
|
|
let fields;
|
|
if (this.fields) {
|
|
fields = this.fields;
|
|
} else if (is(source, Subquery)) {
|
|
fields = Object.fromEntries(Object.keys(source._.selectedFields).map((key) => [key, source[key]]));
|
|
} else if (is(source, SQLiteViewBase)) {
|
|
fields = source[ViewBaseConfig].selectedFields;
|
|
} else if (is(source, SQL)) {
|
|
fields = {};
|
|
} else {
|
|
fields = getTableColumns(source);
|
|
}
|
|
return new SQLiteSelectBase({
|
|
table: source,
|
|
fields,
|
|
isPartialSelect,
|
|
session: this.session,
|
|
dialect: this.dialect,
|
|
withList: this.withList,
|
|
distinct: this.distinct
|
|
});
|
|
}
|
|
}
|
|
|
|
class SQLiteSelectQueryBuilderBase extends TypedQueryBuilder {
|
|
static [entityKind] = "SQLiteSelectQueryBuilder";
|
|
_;
|
|
config;
|
|
joinsNotNullableMap;
|
|
tableName;
|
|
isPartialSelect;
|
|
session;
|
|
dialect;
|
|
cacheConfig = undefined;
|
|
usedTables = /* @__PURE__ */ new Set;
|
|
constructor({ table, fields, isPartialSelect, session, dialect, withList, distinct }) {
|
|
super();
|
|
this.config = {
|
|
withList,
|
|
table,
|
|
fields: { ...fields },
|
|
distinct,
|
|
setOperators: []
|
|
};
|
|
this.isPartialSelect = isPartialSelect;
|
|
this.session = session;
|
|
this.dialect = dialect;
|
|
this._ = {
|
|
selectedFields: fields,
|
|
config: this.config
|
|
};
|
|
this.tableName = getTableLikeName(table);
|
|
this.joinsNotNullableMap = typeof this.tableName === "string" ? { [this.tableName]: true } : {};
|
|
for (const item of extractUsedTable(table))
|
|
this.usedTables.add(item);
|
|
}
|
|
getUsedTables() {
|
|
return [...this.usedTables];
|
|
}
|
|
createJoin(joinType) {
|
|
return (table, on) => {
|
|
const baseTableName = this.tableName;
|
|
const tableName = getTableLikeName(table);
|
|
for (const item of extractUsedTable(table))
|
|
this.usedTables.add(item);
|
|
if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) {
|
|
throw new Error(`Alias "${tableName}" is already used in this query`);
|
|
}
|
|
if (!this.isPartialSelect) {
|
|
if (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === "string") {
|
|
this.config.fields = {
|
|
[baseTableName]: this.config.fields
|
|
};
|
|
}
|
|
if (typeof tableName === "string" && !is(table, SQL)) {
|
|
const selection = is(table, Subquery) ? table._.selectedFields : is(table, View) ? table[ViewBaseConfig].selectedFields : table[Table.Symbol.Columns];
|
|
this.config.fields[tableName] = selection;
|
|
}
|
|
}
|
|
if (typeof on === "function") {
|
|
on = on(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
|
|
}
|
|
if (!this.config.joins) {
|
|
this.config.joins = [];
|
|
}
|
|
this.config.joins.push({ on, table, joinType, alias: tableName });
|
|
if (typeof tableName === "string") {
|
|
switch (joinType) {
|
|
case "left": {
|
|
this.joinsNotNullableMap[tableName] = false;
|
|
break;
|
|
}
|
|
case "right": {
|
|
this.joinsNotNullableMap = Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false]));
|
|
this.joinsNotNullableMap[tableName] = true;
|
|
break;
|
|
}
|
|
case "cross":
|
|
case "inner": {
|
|
this.joinsNotNullableMap[tableName] = true;
|
|
break;
|
|
}
|
|
case "full": {
|
|
this.joinsNotNullableMap = Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false]));
|
|
this.joinsNotNullableMap[tableName] = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return this;
|
|
};
|
|
}
|
|
leftJoin = this.createJoin("left");
|
|
rightJoin = this.createJoin("right");
|
|
innerJoin = this.createJoin("inner");
|
|
fullJoin = this.createJoin("full");
|
|
crossJoin = this.createJoin("cross");
|
|
createSetOperator(type, isAll) {
|
|
return (rightSelection) => {
|
|
const rightSelect = typeof rightSelection === "function" ? rightSelection(getSQLiteSetOperators()) : rightSelection;
|
|
if (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {
|
|
throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");
|
|
}
|
|
this.config.setOperators.push({ type, isAll, rightSelect });
|
|
return this;
|
|
};
|
|
}
|
|
union = this.createSetOperator("union", false);
|
|
unionAll = this.createSetOperator("union", true);
|
|
intersect = this.createSetOperator("intersect", false);
|
|
except = this.createSetOperator("except", false);
|
|
addSetOperators(setOperators) {
|
|
this.config.setOperators.push(...setOperators);
|
|
return this;
|
|
}
|
|
where(where) {
|
|
if (typeof where === "function") {
|
|
where = where(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
|
|
}
|
|
this.config.where = where;
|
|
return this;
|
|
}
|
|
having(having) {
|
|
if (typeof having === "function") {
|
|
having = having(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
|
|
}
|
|
this.config.having = having;
|
|
return this;
|
|
}
|
|
groupBy(...columns) {
|
|
if (typeof columns[0] === "function") {
|
|
const groupBy = columns[0](new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
|
|
this.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];
|
|
} else {
|
|
this.config.groupBy = columns;
|
|
}
|
|
return this;
|
|
}
|
|
orderBy(...columns) {
|
|
if (typeof columns[0] === "function") {
|
|
const orderBy = columns[0](new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
|
|
const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
|
|
if (this.config.setOperators.length > 0) {
|
|
this.config.setOperators.at(-1).orderBy = orderByArray;
|
|
} else {
|
|
this.config.orderBy = orderByArray;
|
|
}
|
|
} else {
|
|
const orderByArray = columns;
|
|
if (this.config.setOperators.length > 0) {
|
|
this.config.setOperators.at(-1).orderBy = orderByArray;
|
|
} else {
|
|
this.config.orderBy = orderByArray;
|
|
}
|
|
}
|
|
return this;
|
|
}
|
|
limit(limit) {
|
|
if (this.config.setOperators.length > 0) {
|
|
this.config.setOperators.at(-1).limit = limit;
|
|
} else {
|
|
this.config.limit = limit;
|
|
}
|
|
return this;
|
|
}
|
|
offset(offset) {
|
|
if (this.config.setOperators.length > 0) {
|
|
this.config.setOperators.at(-1).offset = offset;
|
|
} else {
|
|
this.config.offset = offset;
|
|
}
|
|
return this;
|
|
}
|
|
getSQL() {
|
|
return this.dialect.buildSelectQuery(this.config);
|
|
}
|
|
toSQL() {
|
|
const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
|
|
return rest;
|
|
}
|
|
as(alias) {
|
|
const usedTables = [];
|
|
usedTables.push(...extractUsedTable(this.config.table));
|
|
if (this.config.joins) {
|
|
for (const it of this.config.joins)
|
|
usedTables.push(...extractUsedTable(it.table));
|
|
}
|
|
return new Proxy(new Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
|
|
}
|
|
getSelectedFields() {
|
|
return new Proxy(this.config.fields, new SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
|
|
}
|
|
$dynamic() {
|
|
return this;
|
|
}
|
|
}
|
|
|
|
class SQLiteSelectBase extends SQLiteSelectQueryBuilderBase {
|
|
static [entityKind] = "SQLiteSelect";
|
|
_prepare(isOneTimeQuery = true) {
|
|
if (!this.session) {
|
|
throw new Error("Cannot execute a query on a query builder. Please use a database instance instead.");
|
|
}
|
|
const fieldsList = orderSelectedFields(this.config.fields);
|
|
const query = this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), fieldsList, "all", true, undefined, {
|
|
type: "select",
|
|
tables: [...this.usedTables]
|
|
}, this.cacheConfig);
|
|
query.joinsNotNullableMap = this.joinsNotNullableMap;
|
|
return query;
|
|
}
|
|
$withCache(config) {
|
|
this.cacheConfig = config === undefined ? { config: {}, enable: true, autoInvalidate: true } : config === false ? { enable: false } : { enable: true, autoInvalidate: true, ...config };
|
|
return this;
|
|
}
|
|
prepare() {
|
|
return this._prepare(false);
|
|
}
|
|
run = (placeholderValues) => {
|
|
return this._prepare().run(placeholderValues);
|
|
};
|
|
all = (placeholderValues) => {
|
|
return this._prepare().all(placeholderValues);
|
|
};
|
|
get = (placeholderValues) => {
|
|
return this._prepare().get(placeholderValues);
|
|
};
|
|
values = (placeholderValues) => {
|
|
return this._prepare().values(placeholderValues);
|
|
};
|
|
async execute() {
|
|
return this.all();
|
|
}
|
|
}
|
|
applyMixins(SQLiteSelectBase, [QueryPromise]);
|
|
function createSetOperator(type, isAll) {
|
|
return (leftSelect, rightSelect, ...restSelects) => {
|
|
const setOperators = [rightSelect, ...restSelects].map((select) => ({
|
|
type,
|
|
isAll,
|
|
rightSelect: select
|
|
}));
|
|
for (const setOperator of setOperators) {
|
|
if (!haveSameKeys(leftSelect.getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {
|
|
throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");
|
|
}
|
|
}
|
|
return leftSelect.addSetOperators(setOperators);
|
|
};
|
|
}
|
|
var getSQLiteSetOperators = () => ({
|
|
union,
|
|
unionAll,
|
|
intersect,
|
|
except
|
|
});
|
|
var union = createSetOperator("union", false);
|
|
var unionAll = createSetOperator("union", true);
|
|
var intersect = createSetOperator("intersect", false);
|
|
var except = createSetOperator("except", false);
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js
|
|
class QueryBuilder {
|
|
static [entityKind] = "SQLiteQueryBuilder";
|
|
dialect;
|
|
dialectConfig;
|
|
constructor(dialect) {
|
|
this.dialect = is(dialect, SQLiteDialect) ? dialect : undefined;
|
|
this.dialectConfig = is(dialect, SQLiteDialect) ? undefined : dialect;
|
|
}
|
|
$with = (alias, selection) => {
|
|
const queryBuilder = this;
|
|
const as = (qb) => {
|
|
if (typeof qb === "function") {
|
|
qb = qb(queryBuilder);
|
|
}
|
|
return new Proxy(new WithSubquery(qb.getSQL(), selection ?? ("getSelectedFields" in qb ? qb.getSelectedFields() ?? {} : {}), alias, true), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
|
|
};
|
|
return { as };
|
|
};
|
|
with(...queries) {
|
|
const self2 = this;
|
|
function select(fields) {
|
|
return new SQLiteSelectBuilder({
|
|
fields: fields ?? undefined,
|
|
session: undefined,
|
|
dialect: self2.getDialect(),
|
|
withList: queries
|
|
});
|
|
}
|
|
function selectDistinct(fields) {
|
|
return new SQLiteSelectBuilder({
|
|
fields: fields ?? undefined,
|
|
session: undefined,
|
|
dialect: self2.getDialect(),
|
|
withList: queries,
|
|
distinct: true
|
|
});
|
|
}
|
|
return { select, selectDistinct };
|
|
}
|
|
select(fields) {
|
|
return new SQLiteSelectBuilder({ fields: fields ?? undefined, session: undefined, dialect: this.getDialect() });
|
|
}
|
|
selectDistinct(fields) {
|
|
return new SQLiteSelectBuilder({
|
|
fields: fields ?? undefined,
|
|
session: undefined,
|
|
dialect: this.getDialect(),
|
|
distinct: true
|
|
});
|
|
}
|
|
getDialect() {
|
|
if (!this.dialect) {
|
|
this.dialect = new SQLiteSyncDialect(this.dialectConfig);
|
|
}
|
|
return this.dialect;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js
|
|
class SQLiteInsertBuilder {
|
|
constructor(table, session, dialect, withList) {
|
|
this.table = table;
|
|
this.session = session;
|
|
this.dialect = dialect;
|
|
this.withList = withList;
|
|
}
|
|
static [entityKind] = "SQLiteInsertBuilder";
|
|
values(values) {
|
|
values = Array.isArray(values) ? values : [values];
|
|
if (values.length === 0) {
|
|
throw new Error("values() must be called with at least one value");
|
|
}
|
|
const mappedValues = values.map((entry) => {
|
|
const result = {};
|
|
const cols = this.table[Table.Symbol.Columns];
|
|
for (const colKey of Object.keys(entry)) {
|
|
const colValue = entry[colKey];
|
|
result[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);
|
|
}
|
|
return result;
|
|
});
|
|
return new SQLiteInsertBase(this.table, mappedValues, this.session, this.dialect, this.withList);
|
|
}
|
|
select(selectQuery) {
|
|
const select = typeof selectQuery === "function" ? selectQuery(new QueryBuilder) : selectQuery;
|
|
if (!is(select, SQL) && !haveSameKeys(this.table[Columns], select._.selectedFields)) {
|
|
throw new Error("Insert select error: selected fields are not the same or are in a different order compared to the table definition");
|
|
}
|
|
return new SQLiteInsertBase(this.table, select, this.session, this.dialect, this.withList, true);
|
|
}
|
|
}
|
|
|
|
class SQLiteInsertBase extends QueryPromise {
|
|
constructor(table, values, session, dialect, withList, select) {
|
|
super();
|
|
this.session = session;
|
|
this.dialect = dialect;
|
|
this.config = { table, values, withList, select };
|
|
}
|
|
static [entityKind] = "SQLiteInsert";
|
|
config;
|
|
returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {
|
|
this.config.returning = orderSelectedFields(fields);
|
|
return this;
|
|
}
|
|
onConflictDoNothing(config = {}) {
|
|
if (!this.config.onConflict)
|
|
this.config.onConflict = [];
|
|
if (config.target === undefined) {
|
|
this.config.onConflict.push(sql` on conflict do nothing`);
|
|
} else {
|
|
const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;
|
|
const whereSql = config.where ? sql` where ${config.where}` : sql``;
|
|
this.config.onConflict.push(sql` on conflict ${targetSql} do nothing${whereSql}`);
|
|
}
|
|
return this;
|
|
}
|
|
onConflictDoUpdate(config) {
|
|
if (config.where && (config.targetWhere || config.setWhere)) {
|
|
throw new Error('You cannot use both "where" and "targetWhere"/"setWhere" at the same time - "where" is deprecated, use "targetWhere" or "setWhere" instead.');
|
|
}
|
|
if (!this.config.onConflict)
|
|
this.config.onConflict = [];
|
|
const whereSql = config.where ? sql` where ${config.where}` : undefined;
|
|
const targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : undefined;
|
|
const setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : undefined;
|
|
const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;
|
|
const setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));
|
|
this.config.onConflict.push(sql` on conflict ${targetSql}${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`);
|
|
return this;
|
|
}
|
|
getSQL() {
|
|
return this.dialect.buildInsertQuery(this.config);
|
|
}
|
|
toSQL() {
|
|
const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
|
|
return rest;
|
|
}
|
|
_prepare(isOneTimeQuery = true) {
|
|
return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
|
|
type: "insert",
|
|
tables: extractUsedTable(this.config.table)
|
|
});
|
|
}
|
|
prepare() {
|
|
return this._prepare(false);
|
|
}
|
|
run = (placeholderValues) => {
|
|
return this._prepare().run(placeholderValues);
|
|
};
|
|
all = (placeholderValues) => {
|
|
return this._prepare().all(placeholderValues);
|
|
};
|
|
get = (placeholderValues) => {
|
|
return this._prepare().get(placeholderValues);
|
|
};
|
|
values = (placeholderValues) => {
|
|
return this._prepare().values(placeholderValues);
|
|
};
|
|
async execute() {
|
|
return this.config.returning ? this.all() : this.run();
|
|
}
|
|
$dynamic() {
|
|
return this;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/update.js
|
|
class SQLiteUpdateBuilder {
|
|
constructor(table, session, dialect, withList) {
|
|
this.table = table;
|
|
this.session = session;
|
|
this.dialect = dialect;
|
|
this.withList = withList;
|
|
}
|
|
static [entityKind] = "SQLiteUpdateBuilder";
|
|
set(values) {
|
|
return new SQLiteUpdateBase(this.table, mapUpdateSet(this.table, values), this.session, this.dialect, this.withList);
|
|
}
|
|
}
|
|
|
|
class SQLiteUpdateBase extends QueryPromise {
|
|
constructor(table, set, session, dialect, withList) {
|
|
super();
|
|
this.session = session;
|
|
this.dialect = dialect;
|
|
this.config = { set, table, withList, joins: [] };
|
|
}
|
|
static [entityKind] = "SQLiteUpdate";
|
|
config;
|
|
from(source) {
|
|
this.config.from = source;
|
|
return this;
|
|
}
|
|
createJoin(joinType) {
|
|
return (table, on) => {
|
|
const tableName = getTableLikeName(table);
|
|
if (typeof tableName === "string" && this.config.joins.some((join) => join.alias === tableName)) {
|
|
throw new Error(`Alias "${tableName}" is already used in this query`);
|
|
}
|
|
if (typeof on === "function") {
|
|
const from = this.config.from ? is(table, SQLiteTable) ? table[Table.Symbol.Columns] : is(table, Subquery) ? table._.selectedFields : is(table, SQLiteViewBase) ? table[ViewBaseConfig].selectedFields : undefined : undefined;
|
|
on = on(new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })), from && new Proxy(from, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
|
|
}
|
|
this.config.joins.push({ on, table, joinType, alias: tableName });
|
|
return this;
|
|
};
|
|
}
|
|
leftJoin = this.createJoin("left");
|
|
rightJoin = this.createJoin("right");
|
|
innerJoin = this.createJoin("inner");
|
|
fullJoin = this.createJoin("full");
|
|
where(where) {
|
|
this.config.where = where;
|
|
return this;
|
|
}
|
|
orderBy(...columns) {
|
|
if (typeof columns[0] === "function") {
|
|
const orderBy = columns[0](new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
|
|
const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
|
|
this.config.orderBy = orderByArray;
|
|
} else {
|
|
const orderByArray = columns;
|
|
this.config.orderBy = orderByArray;
|
|
}
|
|
return this;
|
|
}
|
|
limit(limit) {
|
|
this.config.limit = limit;
|
|
return this;
|
|
}
|
|
returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {
|
|
this.config.returning = orderSelectedFields(fields);
|
|
return this;
|
|
}
|
|
getSQL() {
|
|
return this.dialect.buildUpdateQuery(this.config);
|
|
}
|
|
toSQL() {
|
|
const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
|
|
return rest;
|
|
}
|
|
_prepare(isOneTimeQuery = true) {
|
|
return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
|
|
type: "insert",
|
|
tables: extractUsedTable(this.config.table)
|
|
});
|
|
}
|
|
prepare() {
|
|
return this._prepare(false);
|
|
}
|
|
run = (placeholderValues) => {
|
|
return this._prepare().run(placeholderValues);
|
|
};
|
|
all = (placeholderValues) => {
|
|
return this._prepare().all(placeholderValues);
|
|
};
|
|
get = (placeholderValues) => {
|
|
return this._prepare().get(placeholderValues);
|
|
};
|
|
values = (placeholderValues) => {
|
|
return this._prepare().values(placeholderValues);
|
|
};
|
|
async execute() {
|
|
return this.config.returning ? this.all() : this.run();
|
|
}
|
|
$dynamic() {
|
|
return this;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/count.js
|
|
class SQLiteCountBuilder extends SQL {
|
|
constructor(params) {
|
|
super(SQLiteCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);
|
|
this.params = params;
|
|
this.session = params.session;
|
|
this.sql = SQLiteCountBuilder.buildCount(params.source, params.filters);
|
|
}
|
|
sql;
|
|
static [entityKind] = "SQLiteCountBuilderAsync";
|
|
[Symbol.toStringTag] = "SQLiteCountBuilderAsync";
|
|
session;
|
|
static buildEmbeddedCount(source, filters) {
|
|
return sql`(select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters})`;
|
|
}
|
|
static buildCount(source, filters) {
|
|
return sql`select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters}`;
|
|
}
|
|
then(onfulfilled, onrejected) {
|
|
return Promise.resolve(this.session.count(this.sql)).then(onfulfilled, onrejected);
|
|
}
|
|
catch(onRejected) {
|
|
return this.then(undefined, onRejected);
|
|
}
|
|
finally(onFinally) {
|
|
return this.then((value) => {
|
|
onFinally?.();
|
|
return value;
|
|
}, (reason) => {
|
|
onFinally?.();
|
|
throw reason;
|
|
});
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/query.js
|
|
class RelationalQueryBuilder {
|
|
constructor(mode, fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session) {
|
|
this.mode = mode;
|
|
this.fullSchema = fullSchema;
|
|
this.schema = schema;
|
|
this.tableNamesMap = tableNamesMap;
|
|
this.table = table;
|
|
this.tableConfig = tableConfig;
|
|
this.dialect = dialect;
|
|
this.session = session;
|
|
}
|
|
static [entityKind] = "SQLiteAsyncRelationalQueryBuilder";
|
|
findMany(config) {
|
|
return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? config : {}, "many") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? config : {}, "many");
|
|
}
|
|
findFirst(config) {
|
|
return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? { ...config, limit: 1 } : { limit: 1 }, "first") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? { ...config, limit: 1 } : { limit: 1 }, "first");
|
|
}
|
|
}
|
|
|
|
class SQLiteRelationalQuery extends QueryPromise {
|
|
constructor(fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session, config, mode) {
|
|
super();
|
|
this.fullSchema = fullSchema;
|
|
this.schema = schema;
|
|
this.tableNamesMap = tableNamesMap;
|
|
this.table = table;
|
|
this.tableConfig = tableConfig;
|
|
this.dialect = dialect;
|
|
this.session = session;
|
|
this.config = config;
|
|
this.mode = mode;
|
|
}
|
|
static [entityKind] = "SQLiteAsyncRelationalQuery";
|
|
mode;
|
|
getSQL() {
|
|
return this.dialect.buildRelationalQuery({
|
|
fullSchema: this.fullSchema,
|
|
schema: this.schema,
|
|
tableNamesMap: this.tableNamesMap,
|
|
table: this.table,
|
|
tableConfig: this.tableConfig,
|
|
queryConfig: this.config,
|
|
tableAlias: this.tableConfig.tsName
|
|
}).sql;
|
|
}
|
|
_prepare(isOneTimeQuery = false) {
|
|
const { query, builtQuery } = this._toSQL();
|
|
return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](builtQuery, undefined, this.mode === "first" ? "get" : "all", true, (rawRows, mapColumnValue) => {
|
|
const rows = rawRows.map((row) => mapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue));
|
|
if (this.mode === "first") {
|
|
return rows[0];
|
|
}
|
|
return rows;
|
|
});
|
|
}
|
|
prepare() {
|
|
return this._prepare(false);
|
|
}
|
|
_toSQL() {
|
|
const query = this.dialect.buildRelationalQuery({
|
|
fullSchema: this.fullSchema,
|
|
schema: this.schema,
|
|
tableNamesMap: this.tableNamesMap,
|
|
table: this.table,
|
|
tableConfig: this.tableConfig,
|
|
queryConfig: this.config,
|
|
tableAlias: this.tableConfig.tsName
|
|
});
|
|
const builtQuery = this.dialect.sqlToQuery(query.sql);
|
|
return { query, builtQuery };
|
|
}
|
|
toSQL() {
|
|
return this._toSQL().builtQuery;
|
|
}
|
|
executeRaw() {
|
|
if (this.mode === "first") {
|
|
return this._prepare(false).get();
|
|
}
|
|
return this._prepare(false).all();
|
|
}
|
|
async execute() {
|
|
return this.executeRaw();
|
|
}
|
|
}
|
|
|
|
class SQLiteSyncRelationalQuery extends SQLiteRelationalQuery {
|
|
static [entityKind] = "SQLiteSyncRelationalQuery";
|
|
sync() {
|
|
return this.executeRaw();
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js
|
|
class SQLiteRaw extends QueryPromise {
|
|
constructor(execute, getSQL, action, dialect, mapBatchResult) {
|
|
super();
|
|
this.execute = execute;
|
|
this.getSQL = getSQL;
|
|
this.dialect = dialect;
|
|
this.mapBatchResult = mapBatchResult;
|
|
this.config = { action };
|
|
}
|
|
static [entityKind] = "SQLiteRaw";
|
|
config;
|
|
getQuery() {
|
|
return { ...this.dialect.sqlToQuery(this.getSQL()), method: this.config.action };
|
|
}
|
|
mapResult(result, isFromBatch) {
|
|
return isFromBatch ? this.mapBatchResult(result) : result;
|
|
}
|
|
_prepare() {
|
|
return this;
|
|
}
|
|
isResponseInArrayMode() {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/db.js
|
|
class BaseSQLiteDatabase {
|
|
constructor(resultKind, dialect, session, schema) {
|
|
this.resultKind = resultKind;
|
|
this.dialect = dialect;
|
|
this.session = session;
|
|
this._ = schema ? {
|
|
schema: schema.schema,
|
|
fullSchema: schema.fullSchema,
|
|
tableNamesMap: schema.tableNamesMap
|
|
} : {
|
|
schema: undefined,
|
|
fullSchema: {},
|
|
tableNamesMap: {}
|
|
};
|
|
this.query = {};
|
|
const query = this.query;
|
|
if (this._.schema) {
|
|
for (const [tableName, columns] of Object.entries(this._.schema)) {
|
|
query[tableName] = new RelationalQueryBuilder(resultKind, schema.fullSchema, this._.schema, this._.tableNamesMap, schema.fullSchema[tableName], columns, dialect, session);
|
|
}
|
|
}
|
|
this.$cache = { invalidate: async (_params) => {} };
|
|
}
|
|
static [entityKind] = "BaseSQLiteDatabase";
|
|
query;
|
|
$with = (alias, selection) => {
|
|
const self2 = this;
|
|
const as = (qb) => {
|
|
if (typeof qb === "function") {
|
|
qb = qb(new QueryBuilder(self2.dialect));
|
|
}
|
|
return new Proxy(new WithSubquery(qb.getSQL(), selection ?? ("getSelectedFields" in qb ? qb.getSelectedFields() ?? {} : {}), alias, true), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
|
|
};
|
|
return { as };
|
|
};
|
|
$count(source, filters) {
|
|
return new SQLiteCountBuilder({ source, filters, session: this.session });
|
|
}
|
|
with(...queries) {
|
|
const self2 = this;
|
|
function select(fields) {
|
|
return new SQLiteSelectBuilder({
|
|
fields: fields ?? undefined,
|
|
session: self2.session,
|
|
dialect: self2.dialect,
|
|
withList: queries
|
|
});
|
|
}
|
|
function selectDistinct(fields) {
|
|
return new SQLiteSelectBuilder({
|
|
fields: fields ?? undefined,
|
|
session: self2.session,
|
|
dialect: self2.dialect,
|
|
withList: queries,
|
|
distinct: true
|
|
});
|
|
}
|
|
function update(table) {
|
|
return new SQLiteUpdateBuilder(table, self2.session, self2.dialect, queries);
|
|
}
|
|
function insert(into) {
|
|
return new SQLiteInsertBuilder(into, self2.session, self2.dialect, queries);
|
|
}
|
|
function delete_(from) {
|
|
return new SQLiteDeleteBase(from, self2.session, self2.dialect, queries);
|
|
}
|
|
return { select, selectDistinct, update, insert, delete: delete_ };
|
|
}
|
|
select(fields) {
|
|
return new SQLiteSelectBuilder({ fields: fields ?? undefined, session: this.session, dialect: this.dialect });
|
|
}
|
|
selectDistinct(fields) {
|
|
return new SQLiteSelectBuilder({
|
|
fields: fields ?? undefined,
|
|
session: this.session,
|
|
dialect: this.dialect,
|
|
distinct: true
|
|
});
|
|
}
|
|
update(table) {
|
|
return new SQLiteUpdateBuilder(table, this.session, this.dialect);
|
|
}
|
|
$cache;
|
|
insert(into) {
|
|
return new SQLiteInsertBuilder(into, this.session, this.dialect);
|
|
}
|
|
delete(from) {
|
|
return new SQLiteDeleteBase(from, this.session, this.dialect);
|
|
}
|
|
run(query) {
|
|
const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
|
|
if (this.resultKind === "async") {
|
|
return new SQLiteRaw(async () => this.session.run(sequel), () => sequel, "run", this.dialect, this.session.extractRawRunValueFromBatchResult.bind(this.session));
|
|
}
|
|
return this.session.run(sequel);
|
|
}
|
|
all(query) {
|
|
const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
|
|
if (this.resultKind === "async") {
|
|
return new SQLiteRaw(async () => this.session.all(sequel), () => sequel, "all", this.dialect, this.session.extractRawAllValueFromBatchResult.bind(this.session));
|
|
}
|
|
return this.session.all(sequel);
|
|
}
|
|
get(query) {
|
|
const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
|
|
if (this.resultKind === "async") {
|
|
return new SQLiteRaw(async () => this.session.get(sequel), () => sequel, "get", this.dialect, this.session.extractRawGetValueFromBatchResult.bind(this.session));
|
|
}
|
|
return this.session.get(sequel);
|
|
}
|
|
values(query) {
|
|
const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
|
|
if (this.resultKind === "async") {
|
|
return new SQLiteRaw(async () => this.session.values(sequel), () => sequel, "values", this.dialect, this.session.extractRawValuesValueFromBatchResult.bind(this.session));
|
|
}
|
|
return this.session.values(sequel);
|
|
}
|
|
transaction(transaction, config) {
|
|
return this.session.transaction(transaction, config);
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/cache/core/cache.js
|
|
class Cache {
|
|
static [entityKind] = "Cache";
|
|
}
|
|
|
|
class NoopCache extends Cache {
|
|
strategy() {
|
|
return "all";
|
|
}
|
|
static [entityKind] = "NoopCache";
|
|
async get(_key) {
|
|
return;
|
|
}
|
|
async put(_hashedQuery, _response, _tables, _config) {}
|
|
async onMutate(_params) {}
|
|
}
|
|
async function hashQuery(sql2, params) {
|
|
const dataToHash = `${sql2}-${JSON.stringify(params)}`;
|
|
const encoder = new TextEncoder;
|
|
const data = encoder.encode(dataToHash);
|
|
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
|
|
const hashArray = [...new Uint8Array(hashBuffer)];
|
|
const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
return hashHex;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/session.js
|
|
class ExecuteResultSync extends QueryPromise {
|
|
constructor(resultCb) {
|
|
super();
|
|
this.resultCb = resultCb;
|
|
}
|
|
static [entityKind] = "ExecuteResultSync";
|
|
async execute() {
|
|
return this.resultCb();
|
|
}
|
|
sync() {
|
|
return this.resultCb();
|
|
}
|
|
}
|
|
|
|
class SQLitePreparedQuery {
|
|
constructor(mode, executeMethod, query, cache, queryMetadata, cacheConfig) {
|
|
this.mode = mode;
|
|
this.executeMethod = executeMethod;
|
|
this.query = query;
|
|
this.cache = cache;
|
|
this.queryMetadata = queryMetadata;
|
|
this.cacheConfig = cacheConfig;
|
|
if (cache && cache.strategy() === "all" && cacheConfig === undefined) {
|
|
this.cacheConfig = { enable: true, autoInvalidate: true };
|
|
}
|
|
if (!this.cacheConfig?.enable) {
|
|
this.cacheConfig = undefined;
|
|
}
|
|
}
|
|
static [entityKind] = "PreparedQuery";
|
|
joinsNotNullableMap;
|
|
async queryWithCache(queryString, params, query) {
|
|
if (this.cache === undefined || is(this.cache, NoopCache) || this.queryMetadata === undefined) {
|
|
try {
|
|
return await query();
|
|
} catch (e) {
|
|
throw new DrizzleQueryError(queryString, params, e);
|
|
}
|
|
}
|
|
if (this.cacheConfig && !this.cacheConfig.enable) {
|
|
try {
|
|
return await query();
|
|
} catch (e) {
|
|
throw new DrizzleQueryError(queryString, params, e);
|
|
}
|
|
}
|
|
if ((this.queryMetadata.type === "insert" || this.queryMetadata.type === "update" || this.queryMetadata.type === "delete") && this.queryMetadata.tables.length > 0) {
|
|
try {
|
|
const [res] = await Promise.all([
|
|
query(),
|
|
this.cache.onMutate({ tables: this.queryMetadata.tables })
|
|
]);
|
|
return res;
|
|
} catch (e) {
|
|
throw new DrizzleQueryError(queryString, params, e);
|
|
}
|
|
}
|
|
if (!this.cacheConfig) {
|
|
try {
|
|
return await query();
|
|
} catch (e) {
|
|
throw new DrizzleQueryError(queryString, params, e);
|
|
}
|
|
}
|
|
if (this.queryMetadata.type === "select") {
|
|
const fromCache = await this.cache.get(this.cacheConfig.tag ?? await hashQuery(queryString, params), this.queryMetadata.tables, this.cacheConfig.tag !== undefined, this.cacheConfig.autoInvalidate);
|
|
if (fromCache === undefined) {
|
|
let result;
|
|
try {
|
|
result = await query();
|
|
} catch (e) {
|
|
throw new DrizzleQueryError(queryString, params, e);
|
|
}
|
|
await this.cache.put(this.cacheConfig.tag ?? await hashQuery(queryString, params), result, this.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [], this.cacheConfig.tag !== undefined, this.cacheConfig.config);
|
|
return result;
|
|
}
|
|
return fromCache;
|
|
}
|
|
try {
|
|
return await query();
|
|
} catch (e) {
|
|
throw new DrizzleQueryError(queryString, params, e);
|
|
}
|
|
}
|
|
getQuery() {
|
|
return this.query;
|
|
}
|
|
mapRunResult(result, _isFromBatch) {
|
|
return result;
|
|
}
|
|
mapAllResult(_result, _isFromBatch) {
|
|
throw new Error("Not implemented");
|
|
}
|
|
mapGetResult(_result, _isFromBatch) {
|
|
throw new Error("Not implemented");
|
|
}
|
|
execute(placeholderValues) {
|
|
if (this.mode === "async") {
|
|
return this[this.executeMethod](placeholderValues);
|
|
}
|
|
return new ExecuteResultSync(() => this[this.executeMethod](placeholderValues));
|
|
}
|
|
mapResult(response, isFromBatch) {
|
|
switch (this.executeMethod) {
|
|
case "run": {
|
|
return this.mapRunResult(response, isFromBatch);
|
|
}
|
|
case "all": {
|
|
return this.mapAllResult(response, isFromBatch);
|
|
}
|
|
case "get": {
|
|
return this.mapGetResult(response, isFromBatch);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
class SQLiteSession {
|
|
constructor(dialect) {
|
|
this.dialect = dialect;
|
|
}
|
|
static [entityKind] = "SQLiteSession";
|
|
prepareOneTimeQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig) {
|
|
return this.prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig);
|
|
}
|
|
run(query) {
|
|
const staticQuery = this.dialect.sqlToQuery(query);
|
|
try {
|
|
return this.prepareOneTimeQuery(staticQuery, undefined, "run", false).run();
|
|
} catch (err) {
|
|
throw new DrizzleError({ cause: err, message: `Failed to run the query '${staticQuery.sql}'` });
|
|
}
|
|
}
|
|
extractRawRunValueFromBatchResult(result) {
|
|
return result;
|
|
}
|
|
all(query) {
|
|
return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).all();
|
|
}
|
|
extractRawAllValueFromBatchResult(_result) {
|
|
throw new Error("Not implemented");
|
|
}
|
|
get(query) {
|
|
return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).get();
|
|
}
|
|
extractRawGetValueFromBatchResult(_result) {
|
|
throw new Error("Not implemented");
|
|
}
|
|
values(query) {
|
|
return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).values();
|
|
}
|
|
async count(sql2) {
|
|
const result = await this.values(sql2);
|
|
return result[0][0];
|
|
}
|
|
extractRawValuesValueFromBatchResult(_result) {
|
|
throw new Error("Not implemented");
|
|
}
|
|
}
|
|
|
|
class SQLiteTransaction extends BaseSQLiteDatabase {
|
|
constructor(resultType, dialect, session, schema, nestedIndex = 0) {
|
|
super(resultType, dialect, session, schema);
|
|
this.schema = schema;
|
|
this.nestedIndex = nestedIndex;
|
|
}
|
|
static [entityKind] = "SQLiteTransaction";
|
|
rollback() {
|
|
throw new TransactionRollbackError;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/logger.js
|
|
class ConsoleLogWriter {
|
|
static [entityKind] = "ConsoleLogWriter";
|
|
write(message) {
|
|
console.log(message);
|
|
}
|
|
}
|
|
|
|
class DefaultLogger {
|
|
static [entityKind] = "DefaultLogger";
|
|
writer;
|
|
constructor(config) {
|
|
this.writer = config?.writer ?? new ConsoleLogWriter;
|
|
}
|
|
logQuery(query, params) {
|
|
const stringifiedParams = params.map((p) => {
|
|
try {
|
|
return JSON.stringify(p);
|
|
} catch {
|
|
return String(p);
|
|
}
|
|
});
|
|
const paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(", ")}]` : "";
|
|
this.writer.write(`Query: ${query}${paramsStr}`);
|
|
}
|
|
}
|
|
|
|
class NoopLogger {
|
|
static [entityKind] = "NoopLogger";
|
|
logQuery() {}
|
|
}
|
|
|
|
// ../eve/dist/db/schema.js
|
|
var schema_exports = {};
|
|
__export(schema_exports, {
|
|
characters: () => characters,
|
|
charactersRelations: () => charactersRelations,
|
|
miningFleetParticipants: () => miningFleetParticipants,
|
|
miningFleetParticipantsRelations: () => miningFleetParticipantsRelations,
|
|
miningFleets: () => miningFleets,
|
|
miningFleetsRelations: () => miningFleetsRelations,
|
|
resumeCommands: () => resumeCommands,
|
|
shared: () => shared,
|
|
users: () => users,
|
|
usersRelations: () => usersRelations
|
|
});
|
|
var shared = {
|
|
createdAt: integer("created_at").notNull(),
|
|
updatedAt: integer("updated_at")
|
|
};
|
|
var users = sqliteTable("users", {
|
|
id: integer().primaryKey().unique().notNull(),
|
|
discordID: text("discord_id").unique().notNull(),
|
|
mainCharacter: integer("main_character"),
|
|
...shared
|
|
}, (table) => [index("idx_discord_id").on(table.discordID), index("idx_main_character").on(table.mainCharacter)]);
|
|
var usersRelations = relations(users, ({ one, many }) => ({
|
|
characters: many(characters),
|
|
main: one(characters, {
|
|
fields: [users.mainCharacter],
|
|
references: [characters.id]
|
|
})
|
|
}));
|
|
var characters = sqliteTable("characters", {
|
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
|
eveID: integer("eve_id").notNull(),
|
|
userID: integer("user_id").notNull(),
|
|
name: text().notNull(),
|
|
accessToken: text("access_token").notNull(),
|
|
expiresAt: integer("expires_at").notNull(),
|
|
refreshToken: text("refresh_token").notNull(),
|
|
...shared
|
|
}, (table) => [index("idx_user_id").on(table.userID), index("idx_eve_id").on(table.eveID)]);
|
|
var charactersRelations = relations(characters, ({ one }) => ({ user: one(users, {
|
|
fields: [characters.userID],
|
|
references: [users.id]
|
|
}) }));
|
|
var resumeCommands = sqliteTable("resumecommands", {
|
|
id: text().primaryKey(),
|
|
command: text().notNull(),
|
|
params: text().notNull(),
|
|
context: text().notNull(),
|
|
...shared
|
|
});
|
|
var miningFleets = sqliteTable("mining_fleets", {
|
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
|
name: text("name").notNull(),
|
|
description: text("description"),
|
|
creatorDiscordId: text("creator_discord_id").notNull(),
|
|
startTime: integer("start_time").notNull(),
|
|
endTime: integer("end_time"),
|
|
status: text("status", { enum: [
|
|
"configuring",
|
|
"active",
|
|
"ended",
|
|
"generating_report",
|
|
"completed",
|
|
"failed"
|
|
] }).notNull().default("configuring"),
|
|
taxRate: real("tax_rate").notNull().default(0),
|
|
publicMessageId: text("public_message_id").unique(),
|
|
publicChannelId: text("public_channel_id"),
|
|
reportData: text("report_data"),
|
|
creatorEphemeralMessageId: text("creator_ephemeral_message_id"),
|
|
...shared
|
|
}, (table) => [
|
|
index("idx_fleet_creator_discord_id").on(table.creatorDiscordId),
|
|
index("idx_fleet_status").on(table.status),
|
|
index("idx_fleet_public_message_id").on(table.publicMessageId)
|
|
]);
|
|
var miningFleetParticipants = sqliteTable("mining_fleet_participants", {
|
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
|
fleetId: integer("fleet_id").notNull().references(() => miningFleets.id, { onDelete: "cascade" }),
|
|
characterId: integer("character_id").notNull().references(() => characters.id, { onDelete: "cascade" }),
|
|
discordId: text("discord_id").notNull(),
|
|
role: text("role", { enum: [
|
|
"miner",
|
|
"security",
|
|
"hauler"
|
|
] }).notNull(),
|
|
joinTime: integer("join_time").notNull(),
|
|
...shared
|
|
}, (table) => [
|
|
index("idx_participant_fleet_id").on(table.fleetId),
|
|
index("idx_participant_character_id").on(table.characterId),
|
|
index("idx_participant_discord_id").on(table.discordId)
|
|
]);
|
|
var miningFleetsRelations = relations(miningFleets, ({ many }) => ({ participants: many(miningFleetParticipants) }));
|
|
var miningFleetParticipantsRelations = relations(miningFleetParticipants, ({ one }) => ({
|
|
fleet: one(miningFleets, {
|
|
fields: [miningFleetParticipants.fleetId],
|
|
references: [miningFleets.id]
|
|
}),
|
|
character: one(characters, {
|
|
fields: [miningFleetParticipants.characterId],
|
|
references: [characters.id]
|
|
})
|
|
}));
|
|
|
|
// ../eve/dist/esi/options.js
|
|
var CLIENT_ID = process.env.EVE_CLIENT_ID || "";
|
|
var CLIENT_SECRET = process.env.EVE_CLIENT_SECRET || "";
|
|
var CALLBACK_URL = process.env.EVE_CALLBACK_URL || "";
|
|
var USER_AGENT = process.env.ESI_USER_AGENT || "";
|
|
var options = {
|
|
client_id: CLIENT_ID,
|
|
client_secret: CLIENT_SECRET,
|
|
callback_url: CALLBACK_URL,
|
|
user_agent: USER_AGENT
|
|
};
|
|
|
|
// ../eve/node_modules/jwt-decode/build/esm/index.js
|
|
class InvalidTokenError extends Error {
|
|
}
|
|
InvalidTokenError.prototype.name = "InvalidTokenError";
|
|
function b64DecodeUnicode(str) {
|
|
return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {
|
|
let code = p.charCodeAt(0).toString(16).toUpperCase();
|
|
if (code.length < 2) {
|
|
code = "0" + code;
|
|
}
|
|
return "%" + code;
|
|
}));
|
|
}
|
|
function base64UrlDecode(str) {
|
|
let output = str.replace(/-/g, "+").replace(/_/g, "/");
|
|
switch (output.length % 4) {
|
|
case 0:
|
|
break;
|
|
case 2:
|
|
output += "==";
|
|
break;
|
|
case 3:
|
|
output += "=";
|
|
break;
|
|
default:
|
|
throw new Error("base64 string is not of the correct length");
|
|
}
|
|
try {
|
|
return b64DecodeUnicode(output);
|
|
} catch (err) {
|
|
return atob(output);
|
|
}
|
|
}
|
|
function jwtDecode(token, options2) {
|
|
if (typeof token !== "string") {
|
|
throw new InvalidTokenError("Invalid token specified: must be a string");
|
|
}
|
|
options2 || (options2 = {});
|
|
const pos = options2.header === true ? 0 : 1;
|
|
const part = token.split(".")[pos];
|
|
if (typeof part !== "string") {
|
|
throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);
|
|
}
|
|
let decoded;
|
|
try {
|
|
decoded = base64UrlDecode(part);
|
|
} catch (e) {
|
|
throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);
|
|
}
|
|
try {
|
|
return JSON.parse(decoded);
|
|
} catch (e) {
|
|
throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);
|
|
}
|
|
}
|
|
// ../eve/node_modules/@oslojs/encoding/dist/base32.js
|
|
var EncodingPadding;
|
|
(function(EncodingPadding2) {
|
|
EncodingPadding2[EncodingPadding2["Include"] = 0] = "Include";
|
|
EncodingPadding2[EncodingPadding2["None"] = 1] = "None";
|
|
})(EncodingPadding || (EncodingPadding = {}));
|
|
var DecodingPadding;
|
|
(function(DecodingPadding2) {
|
|
DecodingPadding2[DecodingPadding2["Required"] = 0] = "Required";
|
|
DecodingPadding2[DecodingPadding2["Ignore"] = 1] = "Ignore";
|
|
})(DecodingPadding || (DecodingPadding = {}));
|
|
// ../eve/node_modules/@oslojs/encoding/dist/base64.js
|
|
function encodeBase64urlNoPadding(bytes) {
|
|
return encodeBase64_internal(bytes, base64urlAlphabet, EncodingPadding2.None);
|
|
}
|
|
function encodeBase64_internal(bytes, alphabet, padding) {
|
|
let result = "";
|
|
for (let i = 0;i < bytes.byteLength; i += 3) {
|
|
let buffer = 0;
|
|
let bufferBitSize = 0;
|
|
for (let j = 0;j < 3 && i + j < bytes.byteLength; j++) {
|
|
buffer = buffer << 8 | bytes[i + j];
|
|
bufferBitSize += 8;
|
|
}
|
|
for (let j = 0;j < 4; j++) {
|
|
if (bufferBitSize >= 6) {
|
|
result += alphabet[buffer >> bufferBitSize - 6 & 63];
|
|
bufferBitSize -= 6;
|
|
} else if (bufferBitSize > 0) {
|
|
result += alphabet[buffer << 6 - bufferBitSize & 63];
|
|
bufferBitSize = 0;
|
|
} else if (padding === EncodingPadding2.Include) {
|
|
result += "=";
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
var base64urlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
var EncodingPadding2;
|
|
(function(EncodingPadding3) {
|
|
EncodingPadding3[EncodingPadding3["Include"] = 0] = "Include";
|
|
EncodingPadding3[EncodingPadding3["None"] = 1] = "None";
|
|
})(EncodingPadding2 || (EncodingPadding2 = {}));
|
|
var DecodingPadding2;
|
|
(function(DecodingPadding3) {
|
|
DecodingPadding3[DecodingPadding3["Required"] = 0] = "Required";
|
|
DecodingPadding3[DecodingPadding3["Ignore"] = 1] = "Ignore";
|
|
})(DecodingPadding2 || (DecodingPadding2 = {}));
|
|
// ../eve/dist/esi/auth.js
|
|
var import_jsonwebtoken = __toESM(require_jsonwebtoken(), 1);
|
|
var import_jwk_to_pem = __toESM(require_jwk_to_pem(), 1);
|
|
var auth_exports = {};
|
|
__export(auth_exports, {
|
|
characterIdFromToken: () => characterIdFromToken,
|
|
createAuthorizationURL: () => createAuthorizationURL,
|
|
refresh: () => refresh,
|
|
validateAuthorizationCode: () => validateAuthorizationCode,
|
|
validateToken: () => validateToken
|
|
});
|
|
function generateState() {
|
|
const randomValues = new Uint8Array(32);
|
|
crypto.getRandomValues(randomValues);
|
|
return encodeBase64urlNoPadding(randomValues);
|
|
}
|
|
async function createAuthorizationURL(scopes = "publicData") {
|
|
const state = generateState();
|
|
const url = new URL("https://login.eveonline.com/v2/oauth/authorize/");
|
|
url.searchParams.set("response_type", "code");
|
|
url.searchParams.set("redirect_uri", options.callback_url);
|
|
url.searchParams.set("client_id", options.client_id);
|
|
url.searchParams.set("state", state);
|
|
url.searchParams.set("scope", Array.isArray(scopes) ? scopes.join(" ") : scopes);
|
|
return {
|
|
url,
|
|
state
|
|
};
|
|
}
|
|
async function validateAuthorizationCode(code) {
|
|
try {
|
|
const response = await fetch("https://login.eveonline.com/v2/oauth/token", {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
Authorization: `Basic ${Buffer.from(`${options.client_id}:${options.client_secret}`).toString("base64")}`
|
|
},
|
|
body: new URLSearchParams({
|
|
grant_type: "authorization_code",
|
|
code
|
|
})
|
|
});
|
|
return await response.json();
|
|
} catch (error) {
|
|
console.error(`failed to validate EVE authorization code`, error);
|
|
throw `${error}`;
|
|
}
|
|
}
|
|
var eveAuthPublicKey;
|
|
async function validateToken(token) {
|
|
if (!eveAuthPublicKey)
|
|
try {
|
|
const eveJWKS = await (await fetch("https://login.eveonline.com/oauth/jwks")).json();
|
|
eveAuthPublicKey = import_jwk_to_pem.default(eveJWKS.keys[0]);
|
|
} catch (err) {
|
|
console.error(`failed to get EVE Auth public keys`, err);
|
|
}
|
|
try {
|
|
const decoded = import_jsonwebtoken.default.verify(token, eveAuthPublicKey);
|
|
return decoded;
|
|
} catch (err) {
|
|
console.error(`failed to validate EVE token`, err);
|
|
return null;
|
|
}
|
|
}
|
|
async function refresh({ refresh_token }, scopes) {
|
|
const params = {
|
|
grant_type: "refresh_token",
|
|
refresh_token,
|
|
scope: ""
|
|
};
|
|
if (scopes)
|
|
params["scope"] = Array.isArray(scopes) ? scopes.join(" ") : scopes;
|
|
const response = await fetch("https://login.eveonline.com/v2/oauth/token", {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
Authorization: `Basic ${Buffer.from(`${options.client_id}:${options.client_secret}`).toString("base64")}`
|
|
},
|
|
body: new URLSearchParams(params)
|
|
});
|
|
return await response.json();
|
|
}
|
|
function characterIdFromToken(token) {
|
|
const payload = jwtDecode(token);
|
|
return parseInt(payload.sub.split(":")[2]);
|
|
}
|
|
|
|
// ../eve/dist/db/models/character.model.js
|
|
var CharacterHelper = class CharacterHelper2 {
|
|
static hasValidToken(character) {
|
|
return /* @__PURE__ */ new Date < character.expiresAt;
|
|
}
|
|
static getScopes(character) {
|
|
const decoded = jwtDecode(character.accessToken);
|
|
return typeof decoded.scp === "string" ? [decoded.scp] : decoded.scp;
|
|
}
|
|
static hasOnlyPublicScope(character) {
|
|
return this.getScopes(character).length === 1 && this.hasScope(character, "publicData");
|
|
}
|
|
static getTokens(character) {
|
|
return {
|
|
access_token: character.accessToken,
|
|
refresh_token: character.refreshToken,
|
|
expires_in: (character.expiresAt.getTime() - Date.now()) / 1000
|
|
};
|
|
}
|
|
static hasScope(character, scope) {
|
|
return this.getScopes(character).includes(scope);
|
|
}
|
|
static hasAllScopes(character, scopes) {
|
|
const has = this.getScopes(character);
|
|
return scopes.every((scope) => has.includes(scope));
|
|
}
|
|
static find(id) {
|
|
const result = db.select().from(characters).where(eq(characters.id, id)).limit(1).get();
|
|
const c = this.createCharacters(result);
|
|
return c ? c[0] : undefined;
|
|
}
|
|
static findByUser(user) {
|
|
const result = db.select().from(characters).where(eq(characters.userID, user.id)).all();
|
|
return this.createCharacters(result);
|
|
}
|
|
static findByUserAndEveID(userID, eveID) {
|
|
const result = db.select().from(characters).where(and(eq(characters.userID, userID), eq(characters.eveID, eveID))).limit(1).get();
|
|
const c = this.createCharacters(result);
|
|
return c ? c[0] : undefined;
|
|
}
|
|
static findByName(userID, name) {
|
|
const result = db.select().from(characters).where(and(eq(characters.name, name), eq(characters.userID, userID))).limit(1).get();
|
|
const c = this.createCharacters(result);
|
|
return c ? c[0] : undefined;
|
|
}
|
|
static findAll() {
|
|
const result = db.select().from(characters).all();
|
|
return this.createCharacters(result);
|
|
}
|
|
static create(eveID, name, user, tokens) {
|
|
return this.save({
|
|
eveID,
|
|
userID: user.id,
|
|
accessToken: tokens.access_token,
|
|
expiresAt: /* @__PURE__ */ new Date(tokens.expires_in * 1000),
|
|
refreshToken: tokens.refresh_token,
|
|
name,
|
|
createdAt: /* @__PURE__ */ new Date
|
|
});
|
|
}
|
|
static createCharacters(query) {
|
|
if (!query)
|
|
return [];
|
|
if (Array.isArray(query))
|
|
return query.map((character) => {
|
|
return {
|
|
id: character.id,
|
|
eveID: character.eveID,
|
|
userID: character.userID,
|
|
accessToken: character.accessToken,
|
|
expiresAt: new Date(character.expiresAt),
|
|
refreshToken: character.refreshToken,
|
|
name: character.name,
|
|
createdAt: new Date(character.createdAt),
|
|
updatedAt: new Date(character.updatedAt)
|
|
};
|
|
});
|
|
else
|
|
return [{
|
|
id: query.id,
|
|
eveID: query.eveID,
|
|
userID: query.userID,
|
|
accessToken: query.accessToken,
|
|
expiresAt: new Date(query.expiresAt),
|
|
refreshToken: query.refreshToken,
|
|
name: query.name,
|
|
createdAt: new Date(query.createdAt),
|
|
updatedAt: new Date(query.updatedAt)
|
|
}];
|
|
}
|
|
static save(character) {
|
|
db.insert(characters).values({
|
|
id: character.id,
|
|
eveID: character.eveID,
|
|
userID: character.userID,
|
|
name: character.name,
|
|
accessToken: character.accessToken,
|
|
expiresAt: character.expiresAt.getTime(),
|
|
refreshToken: character.refreshToken,
|
|
createdAt: Date.now(),
|
|
updatedAt: Date.now()
|
|
}).onConflictDoUpdate({
|
|
target: characters.id,
|
|
set: {
|
|
eveID: character.eveID,
|
|
userID: character.userID,
|
|
name: character.name,
|
|
accessToken: character.accessToken,
|
|
expiresAt: character.expiresAt.getTime(),
|
|
refreshToken: character.refreshToken,
|
|
updatedAt: Date.now()
|
|
}
|
|
}).run();
|
|
return CharacterHelper2.findByUserAndEveID(character.userID, character.eveID);
|
|
}
|
|
static delete(character) {
|
|
db.delete(characters).where(eq(characters.id, character.id)).run();
|
|
}
|
|
static async refreshTokens(character, scopes) {
|
|
const tokens = await refresh({ refresh_token: character.refreshToken }, scopes);
|
|
const decoded = await validateToken(tokens.access_token);
|
|
if (!decoded) {
|
|
console.error(`Failed to validate token for character ${character.eveID}`);
|
|
return character;
|
|
}
|
|
character.accessToken = tokens.access_token;
|
|
character.expiresAt = new Date(Date.now() + tokens.expires_in * 1000);
|
|
character.refreshToken = tokens.refresh_token;
|
|
this.save(character);
|
|
return character;
|
|
}
|
|
};
|
|
|
|
// ../eve/dist/db/models/user.model.js
|
|
var UserHelper = class {
|
|
static find(id) {
|
|
const result = db.select({
|
|
id: users.id,
|
|
discordID: users.discordID,
|
|
createdAt: users.createdAt,
|
|
updatedAt: users.updatedAt,
|
|
mainCharacterID: users.mainCharacter,
|
|
characterIDsString: sql`json_group_array(characters.id)`
|
|
}).from(users).where(eq(users.id, id)).leftJoin(characters, eq(users.id, characters.userID)).get();
|
|
return this.createFromQuery(result);
|
|
}
|
|
static findByDiscordId(id) {
|
|
const result = db.select({
|
|
id: users.id,
|
|
discordID: users.discordID,
|
|
createdAt: users.createdAt,
|
|
updatedAt: users.updatedAt,
|
|
mainCharacterID: users.mainCharacter,
|
|
characterIDsString: sql`json_group_array(characters.id)`
|
|
}).from(users).where(eq(users.discordID, id)).leftJoin(characters, eq(users.id, characters.userID)).get();
|
|
return this.createFromQuery(result);
|
|
}
|
|
static findAll() {
|
|
const result = db.select({
|
|
id: users.id,
|
|
discordID: users.discordID,
|
|
createdAt: users.createdAt,
|
|
updatedAt: users.updatedAt,
|
|
mainCharacterID: users.mainCharacter,
|
|
characterIDsString: sql`json_group_array(characters.id)`
|
|
}).from(users).leftJoin(characters, eq(users.id, characters.userID)).all();
|
|
return this.createFromQuery(result);
|
|
}
|
|
static findByCharacterId(id) {
|
|
const result = db.select({
|
|
id: users.id,
|
|
discordID: users.discordID,
|
|
createdAt: users.createdAt,
|
|
updatedAt: users.updatedAt,
|
|
mainCharacterID: users.mainCharacter,
|
|
characterIDsString: sql`json_group_array(characters.id)`
|
|
}).from(users).leftJoin(characters, eq(users.id, characters.userID)).where(eq(characters.id, id)).all();
|
|
return this.createFromQuery(result);
|
|
}
|
|
static findByCharacterName(name) {
|
|
const result = db.select({
|
|
id: users.id,
|
|
discordID: users.discordID,
|
|
createdAt: users.createdAt,
|
|
updatedAt: users.updatedAt,
|
|
mainCharacterID: users.mainCharacter,
|
|
characterIDsString: sql`json_group_array(characters.id)`
|
|
}).from(users).leftJoin(characters, eq(users.id, characters.userID)).where(eq(characters.name, name)).all();
|
|
return this.createFromQuery(result);
|
|
}
|
|
static createFromQuery(query) {
|
|
if (!query)
|
|
return [];
|
|
if (Array.isArray(query))
|
|
return query.map((user) => {
|
|
return {
|
|
id: user.id,
|
|
discordID: user.discordID,
|
|
createdAt: new Date(user.createdAt),
|
|
updatedAt: new Date(user.updatedAt),
|
|
characterIDs: user.characterIDsString ? JSON.parse(user.characterIDsString ?? "[]").map((s) => Number(s)).sort() : [],
|
|
mainCharacterID: user.mainCharacterID
|
|
};
|
|
});
|
|
else
|
|
return {
|
|
id: query.id,
|
|
discordID: query.discordID,
|
|
createdAt: new Date(query.createdAt),
|
|
updatedAt: new Date(query.updatedAt),
|
|
characterIDs: query.characterIDsString ? JSON.parse(query.characterIDsString ?? "[]").map((s) => Number(s)).sort() : [],
|
|
mainCharacterID: query.mainCharacterID
|
|
};
|
|
}
|
|
static create(discordID) {
|
|
this.save({
|
|
discordID,
|
|
createdAt: /* @__PURE__ */ new Date,
|
|
updatedAt: /* @__PURE__ */ new Date
|
|
});
|
|
return this.findByDiscordId(discordID);
|
|
}
|
|
static save(user) {
|
|
db.insert(users).values({
|
|
id: user.id,
|
|
discordID: user.discordID,
|
|
mainCharacter: user.mainCharacterID,
|
|
createdAt: user.createdAt.getTime(),
|
|
updatedAt: user.updatedAt.getTime()
|
|
}).onConflictDoUpdate({
|
|
target: users.id,
|
|
set: {
|
|
discordID: user.discordID,
|
|
mainCharacter: user.mainCharacterID,
|
|
updatedAt: user.updatedAt.getTime()
|
|
}
|
|
}).run();
|
|
return user;
|
|
}
|
|
static delete(user) {
|
|
db.delete(users).where(eq(users.id, user.id)).run();
|
|
}
|
|
static getCharacter(user, index2) {
|
|
if (!user.characterIDs)
|
|
return;
|
|
if (index2 >= user.characterIDs.length)
|
|
return;
|
|
return CharacterHelper.find(user.characterIDs[index2]);
|
|
}
|
|
};
|
|
|
|
// ../eve/dist/db/models/resume-command.model.js
|
|
var ResumeCommand = class ResumeCommand2 {
|
|
id;
|
|
command;
|
|
params;
|
|
context;
|
|
created = /* @__PURE__ */ new Date;
|
|
constructor() {
|
|
this.created = /* @__PURE__ */ new Date;
|
|
}
|
|
static find(messageId) {
|
|
const result = db.select().from(resumeCommands).where(eq(resumeCommands.id, messageId)).get();
|
|
return this.createFromQuery(result);
|
|
}
|
|
static create(messageId, command, params = {}, context = {}) {
|
|
const resume = new ResumeCommand2;
|
|
resume.id = messageId;
|
|
resume.command = command;
|
|
resume.params = JSON.stringify(params);
|
|
resume.context = JSON.stringify(context);
|
|
return resume;
|
|
}
|
|
static createFromQuery(query) {
|
|
if (!query)
|
|
return null;
|
|
const resume = new ResumeCommand2;
|
|
resume.id = query.id;
|
|
resume.command = query.command;
|
|
resume.params = query.params;
|
|
resume.context = query.context;
|
|
resume.created = query.created;
|
|
return resume;
|
|
}
|
|
save() {
|
|
db.insert(resumeCommands).values({
|
|
id: this.id,
|
|
command: this.command,
|
|
params: this.params,
|
|
context: this.context,
|
|
createdAt: this.created.getTime()
|
|
}).onConflictDoUpdate({
|
|
target: resumeCommands.id,
|
|
set: {
|
|
command: this.command,
|
|
params: this.params,
|
|
context: this.context
|
|
}
|
|
}).run();
|
|
return this;
|
|
}
|
|
delete() {
|
|
db.delete(resumeCommands).where(eq(resumeCommands.id, this.id)).run();
|
|
}
|
|
static delete(messageId) {
|
|
db.delete(resumeCommands).where(eq(resumeCommands.id, messageId)).run();
|
|
}
|
|
};
|
|
|
|
// ../eve/dist/db/models/index.js
|
|
var models_exports = {};
|
|
__export(models_exports, {
|
|
CharacterHelper: () => CharacterHelper,
|
|
ResumeCommand: () => ResumeCommand,
|
|
UserHelper: () => UserHelper
|
|
});
|
|
|
|
// ../eve/node_modules/drizzle-orm/bun-sqlite/driver.js
|
|
import { Database } from "bun:sqlite";
|
|
|
|
// ../eve/node_modules/drizzle-orm/bun-sqlite/session.js
|
|
class SQLiteBunSession extends SQLiteSession {
|
|
constructor(client, dialect, schema, options2 = {}) {
|
|
super(dialect);
|
|
this.client = client;
|
|
this.schema = schema;
|
|
this.logger = options2.logger ?? new NoopLogger;
|
|
}
|
|
static [entityKind] = "SQLiteBunSession";
|
|
logger;
|
|
exec(query) {
|
|
this.client.exec(query);
|
|
}
|
|
prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper) {
|
|
const stmt = this.client.prepare(query.sql);
|
|
return new PreparedQuery(stmt, query, this.logger, fields, executeMethod, isResponseInArrayMode, customResultMapper);
|
|
}
|
|
transaction(transaction, config = {}) {
|
|
const tx = new SQLiteBunTransaction("sync", this.dialect, this, this.schema);
|
|
let result;
|
|
const nativeTx = this.client.transaction(() => {
|
|
result = transaction(tx);
|
|
});
|
|
nativeTx[config.behavior ?? "deferred"]();
|
|
return result;
|
|
}
|
|
}
|
|
|
|
class SQLiteBunTransaction extends SQLiteTransaction {
|
|
static [entityKind] = "SQLiteBunTransaction";
|
|
transaction(transaction) {
|
|
const savepointName = `sp${this.nestedIndex}`;
|
|
const tx = new SQLiteBunTransaction("sync", this.dialect, this.session, this.schema, this.nestedIndex + 1);
|
|
this.session.run(sql.raw(`savepoint ${savepointName}`));
|
|
try {
|
|
const result = transaction(tx);
|
|
this.session.run(sql.raw(`release savepoint ${savepointName}`));
|
|
return result;
|
|
} catch (err) {
|
|
this.session.run(sql.raw(`rollback to savepoint ${savepointName}`));
|
|
throw err;
|
|
}
|
|
}
|
|
}
|
|
|
|
class PreparedQuery extends SQLitePreparedQuery {
|
|
constructor(stmt, query, logger, fields, executeMethod, _isResponseInArrayMode, customResultMapper) {
|
|
super("sync", executeMethod, query);
|
|
this.stmt = stmt;
|
|
this.logger = logger;
|
|
this.fields = fields;
|
|
this._isResponseInArrayMode = _isResponseInArrayMode;
|
|
this.customResultMapper = customResultMapper;
|
|
}
|
|
static [entityKind] = "SQLiteBunPreparedQuery";
|
|
run(placeholderValues) {
|
|
const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
|
|
this.logger.logQuery(this.query.sql, params);
|
|
return this.stmt.run(...params);
|
|
}
|
|
all(placeholderValues) {
|
|
const { fields, query, logger, joinsNotNullableMap, stmt, customResultMapper } = this;
|
|
if (!fields && !customResultMapper) {
|
|
const params = fillPlaceholders(query.params, placeholderValues ?? {});
|
|
logger.logQuery(query.sql, params);
|
|
return stmt.all(...params);
|
|
}
|
|
const rows = this.values(placeholderValues);
|
|
if (customResultMapper) {
|
|
return customResultMapper(rows);
|
|
}
|
|
return rows.map((row) => mapResultRow(fields, row, joinsNotNullableMap));
|
|
}
|
|
get(placeholderValues) {
|
|
const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
|
|
this.logger.logQuery(this.query.sql, params);
|
|
const row = this.stmt.values(...params)[0];
|
|
if (!row) {
|
|
return;
|
|
}
|
|
const { fields, joinsNotNullableMap, customResultMapper } = this;
|
|
if (!fields && !customResultMapper) {
|
|
return row;
|
|
}
|
|
if (customResultMapper) {
|
|
return customResultMapper([row]);
|
|
}
|
|
return mapResultRow(fields, row, joinsNotNullableMap);
|
|
}
|
|
values(placeholderValues) {
|
|
const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
|
|
this.logger.logQuery(this.query.sql, params);
|
|
return this.stmt.values(...params);
|
|
}
|
|
isResponseInArrayMode() {
|
|
return this._isResponseInArrayMode;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/bun-sqlite/driver.js
|
|
class BunSQLiteDatabase extends BaseSQLiteDatabase {
|
|
static [entityKind] = "BunSQLiteDatabase";
|
|
}
|
|
function construct(client, config = {}) {
|
|
const dialect = new SQLiteSyncDialect({ casing: config.casing });
|
|
let logger;
|
|
if (config.logger === true) {
|
|
logger = new DefaultLogger;
|
|
} else if (config.logger !== false) {
|
|
logger = config.logger;
|
|
}
|
|
let schema;
|
|
if (config.schema) {
|
|
const tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);
|
|
schema = {
|
|
fullSchema: config.schema,
|
|
schema: tablesConfig.tables,
|
|
tableNamesMap: tablesConfig.tableNamesMap
|
|
};
|
|
}
|
|
const session = new SQLiteBunSession(client, dialect, schema, { logger });
|
|
const db2 = new BunSQLiteDatabase("sync", dialect, session, schema);
|
|
db2.$client = client;
|
|
return db2;
|
|
}
|
|
function drizzle(...params) {
|
|
if (params[0] === undefined || typeof params[0] === "string") {
|
|
const instance = params[0] === undefined ? new Database : new Database(params[0]);
|
|
return construct(instance, params[1]);
|
|
}
|
|
if (isConfig(params[0])) {
|
|
const { connection, client, ...drizzleConfig } = params[0];
|
|
if (client)
|
|
return construct(client, drizzleConfig);
|
|
if (typeof connection === "object") {
|
|
const { source, ...opts } = connection;
|
|
const options2 = Object.values(opts).filter((v) => v !== undefined).length ? opts : undefined;
|
|
const instance2 = new Database(source, options2);
|
|
return construct(instance2, drizzleConfig);
|
|
}
|
|
const instance = new Database(connection);
|
|
return construct(instance, drizzleConfig);
|
|
}
|
|
return construct(params[0], params[1]);
|
|
}
|
|
((drizzle2) => {
|
|
function mock(config) {
|
|
return construct({}, config);
|
|
}
|
|
drizzle2.mock = mock;
|
|
})(drizzle || (drizzle = {}));
|
|
|
|
// ../eve/dist/db/index.js
|
|
import { Database as Database2 } from "bun:sqlite";
|
|
import { join } from "path";
|
|
var DB_PATH = process.env.AUTH_DB_PATH || join(process.cwd(), "../../db/kitten.db");
|
|
console.log("Using DB_PATH:", DB_PATH);
|
|
var sqlite = new Database2(DB_PATH);
|
|
var db = drizzle(sqlite, { schema: {
|
|
users,
|
|
characters,
|
|
resumeCommands,
|
|
miningFleets,
|
|
miningFleetParticipants
|
|
} });
|
|
|
|
// ../eve/dist/esi/scopes.js
|
|
var ESI_LATEST_URL = "https://esi.evetech.net/latest";
|
|
function joinScopes(...scopes) {
|
|
return scopes.join(" ");
|
|
}
|
|
var SCOPES = /* @__PURE__ */ function(SCOPES$1) {
|
|
SCOPES$1["PUBLIC_DATA"] = "publicData";
|
|
SCOPES$1["CALENDAR_RESPOND_CALENDAR_EVENTS"] = "esi-calendar.respond_calendar_events.v1";
|
|
SCOPES$1["CALENDAR_READ_CALENDAR_EVENTS"] = "esi-calendar.read_calendar_events.v1";
|
|
SCOPES$1["LOCATION_READ_LOCATION"] = "esi-location.read_location.v1";
|
|
SCOPES$1["LOCATION_READ_SHIP_TYPE"] = "esi-location.read_ship_type.v1";
|
|
SCOPES$1["MAIL_ORGANIZE_MAIL"] = "esi-mail.organize_mail.v1";
|
|
SCOPES$1["MAIL_READ_MAIL"] = "esi-mail.read_mail.v1";
|
|
SCOPES$1["MAIL_SEND_MAIL"] = "esi-mail.send_mail.v1";
|
|
SCOPES$1["SKILLS_READ_SKILLS"] = "esi-skills.read_skills.v1";
|
|
SCOPES$1["SKILLS_READ_SKILLQUEUE"] = "esi-skills.read_skillqueue.v1";
|
|
SCOPES$1["WALLET_READ_CHARACTER_WALLET"] = "esi-wallet.read_character_wallet.v1";
|
|
SCOPES$1["WALLET_READ_CORPORATION_WALLET"] = "esi-wallet.read_corporation_wallet.v1";
|
|
SCOPES$1["SEARCH_SEARCH_STRUCTURES"] = "esi-search.search_structures.v1";
|
|
SCOPES$1["CLONES_READ_CLONES"] = "esi-clones.read_clones.v1";
|
|
SCOPES$1["CHARACTERS_READ_CONTACTS"] = "esi-characters.read_contacts.v1";
|
|
SCOPES$1["UNIVERSE_READ_STRUCTURES"] = "esi-universe.read_structures.v1";
|
|
SCOPES$1["KILLMAILS_READ_KILLMAILS"] = "esi-killmails.read_killmails.v1";
|
|
SCOPES$1["CORPORATIONS_READ_CORPORATION_MEMBERSHIP"] = "esi-corporations.read_corporation_membership.v1";
|
|
SCOPES$1["ASSETS_READ_ASSETS"] = "esi-assets.read_assets.v1";
|
|
SCOPES$1["PLANETS_MANAGE_PLANETS"] = "esi-planets.manage_planets.v1";
|
|
SCOPES$1["FLEETS_READ_FLEET"] = "esi-fleets.read_fleet.v1";
|
|
SCOPES$1["FLEETS_WRITE_FLEET"] = "esi-fleets.write_fleet.v1";
|
|
SCOPES$1["UI_OPEN_WINDOW"] = "esi-ui.open_window.v1";
|
|
SCOPES$1["UI_WRITE_WAYPOINT"] = "esi-ui.write_waypoint.v1";
|
|
SCOPES$1["CHARACTERS_WRITE_CONTACTS"] = "esi-characters.write_contacts.v1";
|
|
SCOPES$1["FITTINGS_READ_FITTINGS"] = "esi-fittings.read_fittings.v1";
|
|
SCOPES$1["FITTINGS_WRITE_FITTINGS"] = "esi-fittings.write_fittings.v1";
|
|
SCOPES$1["MARKETS_STRUCTURE_MARKETS"] = "esi-markets.structure_markets.v1";
|
|
SCOPES$1["CORPORATIONS_READ_STRUCTURES"] = "esi-corporations.read_structures.v1";
|
|
SCOPES$1["CHARACTERS_READ_LOYALTY"] = "esi-characters.read_loyalty.v1";
|
|
SCOPES$1["CHARACTERS_READ_OPPORTUNITIES"] = "esi-characters.read_opportunities.v1";
|
|
SCOPES$1["CHARACTERS_READ_CHAT_CHANNELS"] = "esi-characters.read_chat_channels.v1";
|
|
SCOPES$1["CHARACTERS_READ_MEDALS"] = "esi-characters.read_medals.v1";
|
|
SCOPES$1["CHARACTERS_READ_STANDINGS"] = "esi-characters.read_standings.v1";
|
|
SCOPES$1["CHARACTERS_READ_AGENTS_RESEARCH"] = "esi-characters.read_agents_research.v1";
|
|
SCOPES$1["INDUSTRY_READ_CHARACTER_JOBS"] = "esi-industry.read_character_jobs.v1";
|
|
SCOPES$1["MARKETS_READ_CHARACTER_ORDERS"] = "esi-markets.read_character_orders.v1";
|
|
SCOPES$1["CHARACTERS_READ_BLUEPRINTS"] = "esi-characters.read_blueprints.v1";
|
|
SCOPES$1["CHARACTERS_READ_CORPORATION_ROLES"] = "esi-characters.read_corporation_roles.v1";
|
|
SCOPES$1["LOCATION_READ_ONLINE"] = "esi-location.read_online.v1";
|
|
SCOPES$1["CONTRACTS_READ_CHARACTER_CONTRACTS"] = "esi-contracts.read_character_contracts.v1";
|
|
SCOPES$1["CLONES_READ_IMPLANTS"] = "esi-clones.read_implants.v1";
|
|
SCOPES$1["CHARACTERS_READ_FATIGUE"] = "esi-characters.read_fatigue.v1";
|
|
SCOPES$1["KILLMAILS_READ_CORPORATION_KILLMAILS"] = "esi-killmails.read_corporation_killmails.v1";
|
|
SCOPES$1["CORPORATIONS_TRACK_MEMBERS"] = "esi-corporations.track_members.v1";
|
|
SCOPES$1["WALLET_READ_CORPORATION_WALLETS"] = "esi-wallet.read_corporation_wallets.v1";
|
|
SCOPES$1["CHARACTERS_READ_NOTIFICATIONS"] = "esi-characters.read_notifications.v1";
|
|
SCOPES$1["CORPORATIONS_READ_DIVISIONS"] = "esi-corporations.read_divisions.v1";
|
|
SCOPES$1["CORPORATIONS_READ_CONTACTS"] = "esi-corporations.read_contacts.v1";
|
|
SCOPES$1["ASSETS_READ_CORPORATION_ASSETS"] = "esi-assets.read_corporation_assets.v1";
|
|
SCOPES$1["CORPORATIONS_READ_TITLES"] = "esi-corporations.read_titles.v1";
|
|
SCOPES$1["CORPORATIONS_READ_BLUEPRINTS"] = "esi-corporations.read_blueprints.v1";
|
|
SCOPES$1["CONTRACTS_READ_CORPORATION_CONTRACTS"] = "esi-contracts.read_corporation_contracts.v1";
|
|
SCOPES$1["CORPORATIONS_READ_STANDINGS"] = "esi-corporations.read_standings.v1";
|
|
SCOPES$1["CORPORATIONS_READ_STARBASES"] = "esi-corporations.read_starbases.v1";
|
|
SCOPES$1["INDUSTRY_READ_CORPORATION_JOBS"] = "esi-industry.read_corporation_jobs.v1";
|
|
SCOPES$1["MARKETS_READ_CORPORATION_ORDERS"] = "esi-markets.read_corporation_orders.v1";
|
|
SCOPES$1["CORPORATIONS_READ_CONTAINER_LOGS"] = "esi-corporations.read_container_logs.v1";
|
|
SCOPES$1["INDUSTRY_READ_CHARACTER_MINING"] = "esi-industry.read_character_mining.v1";
|
|
SCOPES$1["INDUSTRY_READ_CORPORATION_MINING"] = "esi-industry.read_corporation_mining.v1";
|
|
SCOPES$1["PLANETS_READ_CUSTOMS_OFFICES"] = "esi-planets.read_customs_offices.v1";
|
|
SCOPES$1["CORPORATIONS_READ_FACILITIES"] = "esi-corporations.read_facilities.v1";
|
|
SCOPES$1["CORPORATIONS_READ_MEDALS"] = "esi-corporations.read_medals.v1";
|
|
SCOPES$1["CHARACTERS_READ_TITLES"] = "esi-characters.read_titles.v1";
|
|
SCOPES$1["ALLIANCES_READ_CONTACTS"] = "esi-alliances.read_contacts.v1";
|
|
SCOPES$1["CHARACTERS_READ_FW_STATS"] = "esi-characters.read_fw_stats.v1";
|
|
SCOPES$1["CORPORATIONS_READ_FW_STATS"] = "esi-corporations.read_fw_stats.v1";
|
|
return SCOPES$1;
|
|
}({});
|
|
|
|
// ../eve/dist/esi/fetch.js
|
|
var cache = /* @__PURE__ */ new Map;
|
|
function cleanCache() {
|
|
const now = Date.now();
|
|
for (const [key, value] of cache)
|
|
if (value.expires < now)
|
|
cache.delete(key);
|
|
}
|
|
setInterval(cleanCache, 1000 * 60 * 15);
|
|
var defaultCacheDuration = 1000 * 60 * 30;
|
|
async function esiFetch(path, character, { method = "GET", body, noCache = false, cacheDuration = defaultCacheDuration } = {}) {
|
|
try {
|
|
const headers = {
|
|
"User-Agent": options.user_agent,
|
|
Accept: "application/json"
|
|
};
|
|
if (character) {
|
|
if (!CharacterHelper.hasValidToken(character)) {
|
|
await CharacterHelper.refreshTokens(character);
|
|
if (!CharacterHelper.hasValidToken(character))
|
|
throw new Error(`Failed to refresh token for character: ${character.eveID}`);
|
|
}
|
|
headers["Authorization"] = `Bearer ${character.accessToken}`;
|
|
}
|
|
const init = {
|
|
headers,
|
|
method: method || "GET",
|
|
body: body || undefined
|
|
};
|
|
const url = new URL(`${ESI_LATEST_URL}${path.startsWith("/") ? path : "/" + path}`);
|
|
url.searchParams.set("datasource", "tranquility");
|
|
if (!noCache && init.method === "GET") {
|
|
const cached = cache.get(url.href);
|
|
if (cached && cached?.expires > Date.now())
|
|
return cached.data;
|
|
}
|
|
const res = await fetch(url, init);
|
|
const data = await res.json();
|
|
if (!res.ok) {
|
|
console.error(`ESI request failure at ${path} | ${res.status}:${res.statusText} => ${JSON.stringify(data)}`);
|
|
return null;
|
|
}
|
|
if (init.method === "GET")
|
|
cache.set(url.href, {
|
|
expires: Math.max(res.headers.get("expires") && new Date(Number(res.headers.get("expires") || "")).getTime() || 0, Date.now() + cacheDuration),
|
|
data
|
|
});
|
|
return data;
|
|
} catch (err) {
|
|
console.error(`ESI request failure at ${path} | ${JSON.stringify(err)}`, err);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// ../eve/dist/esi/character.js
|
|
var character_exports = {};
|
|
__export(character_exports, {
|
|
getCharacterAffiliations: () => getCharacterAffiliations,
|
|
getCharacterAgentResearch: () => getCharacterAgentResearch,
|
|
getCharacterAssetLocations: () => getCharacterAssetLocations,
|
|
getCharacterAssetNames: () => getCharacterAssetNames,
|
|
getCharacterAssets: () => getCharacterAssets,
|
|
getCharacterBlueprints: () => getCharacterBlueprints,
|
|
getCharacterClones: () => getCharacterClones,
|
|
getCharacterContactNotifications: () => getCharacterContactNotifications,
|
|
getCharacterCorporationHistory: () => getCharacterCorporationHistory,
|
|
getCharacterCurrentShip: () => getCharacterCurrentShip,
|
|
getCharacterImplants: () => getCharacterImplants,
|
|
getCharacterJumpFatigue: () => getCharacterJumpFatigue,
|
|
getCharacterLocation: () => getCharacterLocation,
|
|
getCharacterMedals: () => getCharacterMedals,
|
|
getCharacterNotifications: () => getCharacterNotifications,
|
|
getCharacterOnline: () => getCharacterOnline,
|
|
getCharacterPortraits: () => getCharacterPortraits,
|
|
getCharacterPublicData: () => getCharacterPublicData,
|
|
getCharacterRoles: () => getCharacterRoles,
|
|
getCharacterStandings: () => getCharacterStandings,
|
|
getCharacterTitles: () => getCharacterTitles,
|
|
getCharacterWallet: () => getCharacterWallet,
|
|
getCharacterWalletJournal: () => getCharacterWalletJournal,
|
|
getCharacterWalletTransactions: () => getCharacterWalletTransactions,
|
|
getPortraitURL: () => getPortraitURL
|
|
});
|
|
function getCharacterPublicData(id) {
|
|
return esiFetch(`/characters/${id}/`);
|
|
}
|
|
function getCharacterAffiliations(ids) {
|
|
return esiFetch(`/characters/affiliation/`, undefined, {
|
|
method: "POST",
|
|
body: JSON.stringify(ids)
|
|
})[0];
|
|
}
|
|
function getCharacterPortraits(id) {
|
|
return esiFetch(`/characters/${id}/portrait/`);
|
|
}
|
|
function getCharacterCorporationHistory(id) {
|
|
return esiFetch(`/characters/${id}/corporationhistory/`);
|
|
}
|
|
function getPortraitURL(id) {
|
|
return `https://images.evetech.net/characters/${id}/portrait`;
|
|
}
|
|
function getCharacterRoles(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_corporation_roles.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/roles/`, character);
|
|
}
|
|
function getCharacterTitles(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_titles.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/titles/`, character);
|
|
}
|
|
function getCharacterStandings(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_standings.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/standings/`, character);
|
|
}
|
|
function getCharacterNotifications(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_notifications.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/notifications/`, character);
|
|
}
|
|
function getCharacterContactNotifications(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_notifications.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/notifications/contacts`, character);
|
|
}
|
|
function getCharacterMedals(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_medals.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/medals/`, character);
|
|
}
|
|
function getCharacterJumpFatigue(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_fatigue.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/fatigue/`, character);
|
|
}
|
|
function getCharacterBlueprints(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_blueprints.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/blueprints/`, character);
|
|
}
|
|
function getCharacterAgentResearch(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_agents_research.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/agents_research/`, character);
|
|
}
|
|
function getCharacterClones(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-clones.read_clones.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/clones/`, character);
|
|
}
|
|
function getCharacterImplants(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-clones.read_implants.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/implants/`, character);
|
|
}
|
|
function getCharacterAssets(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/assets/`, character);
|
|
}
|
|
function getCharacterAssetLocations(character, ids) {
|
|
if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/assets/locations/`, character, {
|
|
method: "POST",
|
|
body: JSON.stringify(ids)
|
|
});
|
|
}
|
|
function getCharacterAssetNames(character, ids) {
|
|
if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/assets/names/`, character, {
|
|
method: "POST",
|
|
body: JSON.stringify(ids)
|
|
});
|
|
}
|
|
function getCharacterWallet(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/wallet/`, character);
|
|
}
|
|
function getCharacterWalletTransactions(character, fromId) {
|
|
if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/wallet/transactions/`, character, {
|
|
method: "POST",
|
|
body: JSON.stringify(fromId)
|
|
});
|
|
}
|
|
function getCharacterWalletJournal(character, page = 1) {
|
|
if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/wallet/journal/?page=${page}`, character);
|
|
}
|
|
function getCharacterLocation(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-location.read_location.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/location/`, character);
|
|
}
|
|
function getCharacterOnline(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-location.read_online.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/online/`, character);
|
|
}
|
|
function getCharacterCurrentShip(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-location.read_ship_type.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/ship/`, character);
|
|
}
|
|
|
|
// ../eve/dist/esi/corporation.js
|
|
var corporation_exports = {};
|
|
__export(corporation_exports, {
|
|
getCorporationAllianceHistory: () => getCorporationAllianceHistory,
|
|
getCorporationAssetLocations: () => getCorporationAssetLocations,
|
|
getCorporationAssetNames: () => getCorporationAssetNames,
|
|
getCorporationAssets: () => getCorporationAssets,
|
|
getCorporationData: () => getCorporationData,
|
|
getCorporationIcons: () => getCorporationIcons
|
|
});
|
|
async function getCorporationData(id) {
|
|
return await esiFetch(`/corporations/${id}/`);
|
|
}
|
|
async function getCorporationAllianceHistory(id) {
|
|
return await esiFetch(`/corporations/${id}/alliancehistory/`);
|
|
}
|
|
async function getCorporationIcons(id) {
|
|
return await esiFetch(`/corporations/${id}/icons/`);
|
|
}
|
|
async function getCorporationAssets(id, character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
|
|
return null;
|
|
return await esiFetch(`/corporations/${id}/assets/`, character);
|
|
}
|
|
async function getCorporationAssetLocations(id, character, ids) {
|
|
if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
|
|
return null;
|
|
return await esiFetch(`/corporations/${id}/assets/locations/`, character, {
|
|
method: "POST",
|
|
body: JSON.stringify(ids)
|
|
});
|
|
}
|
|
async function getCorporationAssetNames(id, character, ids) {
|
|
if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
|
|
return null;
|
|
return await esiFetch(`/corporations/${id}/assets/names/`, character, {
|
|
method: "POST",
|
|
body: JSON.stringify(ids)
|
|
});
|
|
}
|
|
|
|
// ../eve/dist/esi/alliance.js
|
|
var alliance_exports = {};
|
|
__export(alliance_exports, {
|
|
getAllianceCorporations: () => getAllianceCorporations,
|
|
getAllianceData: () => getAllianceData,
|
|
getAllianceIcons: () => getAllianceIcons
|
|
});
|
|
async function getAllianceData(id) {
|
|
return await esiFetch(`/alliances/${id}/`);
|
|
}
|
|
async function getAllianceCorporations(id) {
|
|
return await esiFetch(`/alliances/${id}/corporations/`);
|
|
}
|
|
async function getAllianceIcons(id) {
|
|
return await esiFetch(`/alliances/${id}/icons/`);
|
|
}
|
|
|
|
// ../eve/dist/esi/skills.js
|
|
function getCharacterSkillQueue(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-skills.read_skillqueue.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/skillqueue`, character);
|
|
}
|
|
function calculateTrainingPercentage(queuedSkill) {
|
|
const trainingStartPosition = (queuedSkill.training_start_sp - queuedSkill.level_start_sp) / queuedSkill.level_end_sp;
|
|
const timePosition = ((/* @__PURE__ */ new Date()).getTime() - new Date(queuedSkill.start_date).getTime()) / (new Date(queuedSkill.finish_date).getTime() - new Date(queuedSkill.start_date).getTime());
|
|
return trainingStartPosition + (1 - trainingStartPosition) * timePosition;
|
|
}
|
|
|
|
// node_modules/brisa/jsx-runtime/index.js
|
|
var n = Symbol.for("isJSX");
|
|
function S(r) {
|
|
return i(null, r);
|
|
}
|
|
function i(r, { children: e, ...o }, s) {
|
|
let a = e;
|
|
if (Array.isArray(e) && !l(e))
|
|
a = e.map((t) => t?.[n] ? t : S({ children: t }));
|
|
return Object.assign([r, { ...o, key: s }, a], { [n]: true });
|
|
}
|
|
function l(r) {
|
|
return Array.isArray(r) && ((n in r) || m(r));
|
|
}
|
|
function m(r) {
|
|
return r?.[0] === "HTML" && typeof r[1]?.html === "string";
|
|
}
|
|
|
|
// src/components/navigation.tsx
|
|
function Nav({ user }) {
|
|
const main = user.mainCharacterID && CharacterHelper.find(user.mainCharacterID);
|
|
return i("div", {
|
|
class: "navbar bg-base-100 shadow-sm",
|
|
children: [i("div", {
|
|
class: "flex-1",
|
|
children: i("a", {
|
|
class: "btn btn-ghost text-xl",
|
|
children: "Star Kitten"
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this), i("div", {
|
|
class: "flex gap-2",
|
|
children: [i("input", {
|
|
type: "text",
|
|
placeholder: "Search",
|
|
class: "input input-bordered w-24 md:w-auto"
|
|
}, undefined, false, undefined, this), i("div", {
|
|
class: "dropdown dropdown-end",
|
|
children: [i("div", {
|
|
tabIndex: 0,
|
|
role: "button",
|
|
class: "btn btn-ghost btn-circle avatar",
|
|
children: i("div", {
|
|
class: "w-10 rounded-full",
|
|
children: i("img", {
|
|
alt: "Tailwind CSS Navbar component",
|
|
src: main && character_exports.getPortraitURL(main.eveID) || ""
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this), i("ul", {
|
|
tabIndex: 0,
|
|
class: "menu menu-sm dropdown-content bg-base-100 rounded-box z-1 mt-3 w-52 p-2 shadow",
|
|
children: [i("li", {
|
|
children: main && main.name
|
|
}, undefined, false, undefined, this), i("li", {
|
|
children: i("a", {
|
|
class: "justify-between",
|
|
children: ["Characters", i("span", {
|
|
class: "badge",
|
|
children: user.characterIDs.length
|
|
}, undefined, false, undefined, this)]
|
|
}, undefined, true, undefined, this)
|
|
}, undefined, false, undefined, this), i("li", {
|
|
children: i("a", {
|
|
children: "Link Character"
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this), i("li", {
|
|
children: i("a", {
|
|
children: "Settings"
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this), i("li", {
|
|
children: i("a", {
|
|
children: "Logout"
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this)]
|
|
}, undefined, true, undefined, this)]
|
|
}, undefined, true, undefined, this)]
|
|
}, undefined, true, undefined, this)]
|
|
}, undefined, true, undefined, this);
|
|
}
|
|
// src/layout/index.tsx
|
|
function Layout({ children }, request) {
|
|
const user = UserHelper.find(1);
|
|
return i("html", {
|
|
lang: "en",
|
|
"data-theme": "dark",
|
|
children: [i("head", {
|
|
children: [i("title", {
|
|
id: "title",
|
|
children: "Brisa"
|
|
}, undefined, false, undefined, this), i("meta", {
|
|
name: "theme-color",
|
|
content: "#ad1457"
|
|
}, undefined, false, undefined, this), i("link", {
|
|
rel: "shortcut icon",
|
|
href: "/brisa.svg"
|
|
}, undefined, false, undefined, this), i("link", {
|
|
rel: "preconnect",
|
|
href: "https://fonts.googleapis.com"
|
|
}, undefined, false, undefined, this), i("link", {
|
|
rel: "preconnect",
|
|
href: "https://fonts.gstatic.com",
|
|
crossorigin: "true"
|
|
}, undefined, false, undefined, this), i("link", {
|
|
href: "https://fonts.googleapis.com/css2?family=Permanent+Marker&display=swap",
|
|
rel: "stylesheet"
|
|
}, undefined, false, undefined, this), i("meta", {
|
|
name: "viewport",
|
|
content: "width=device-width, initial-scale=1"
|
|
}, undefined, false, undefined, this)]
|
|
}, undefined, true, undefined, this), i("body", {
|
|
children: [i("header", {
|
|
children: i(Nav, {
|
|
user
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this), i("main", {
|
|
children
|
|
}, undefined, false, undefined, this)]
|
|
}, undefined, true, undefined, this)]
|
|
}, undefined, true, undefined, this);
|
|
}
|
|
export {
|
|
Layout as default
|
|
};
|
|
|
|
//# debugId=46CBE11B61D6392264756E2164756E21
|
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2FmZS1idWZmZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFxkYXRhLXN0cmVhbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlY2RzYS1zaWctZm9ybWF0dGVyXFxzcmNcXHBhcmFtLWJ5dGVzLWZvci1hbGcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWNkc2Etc2lnLWZvcm1hdHRlclxcc3JjXFxlY2RzYS1zaWctZm9ybWF0dGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJ1ZmZlci1lcXVhbC1jb25zdGFudC10aW1lXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFx0b3N0cmluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd3NcXGxpYlxcc2lnbi1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxsaWJcXHZlcmlmeS1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGRlY29kZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcSnNvbldlYlRva2VuRXJyb3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXE5vdEJlZm9yZUVycm9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxUb2tlbkV4cGlyZWRFcnJvci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtc1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXHRpbWVzcGFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGNvbnN0YW50cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxkZWJ1Zy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxwYXJzZS1vcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGlkZW50aWZpZXJzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcY2xhc3Nlc1xcc2VtdmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxwYXJzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcdmFsaWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNsZWFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxpbmMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGRpZmYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXG1ham9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxtaW5vci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xccGF0Y2guanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHByZXJlbGVhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNvbXBhcmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHJjb21wYXJlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWxvb3NlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWJ1aWxkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxzb3J0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxyc29ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcZ3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxlcS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcbmVxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxndGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0ZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcY21wLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb2VyY2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxpbnRlcm5hbFxcbHJ1Y2FjaGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxjbGFzc2VzXFxyYW5nZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGNsYXNzZXNcXGNvbXBhcmF0b3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHNhdGlzZmllcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcdG8tY29tcGFyYXRvcnMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXG1heC1zYXRpc2Z5aW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxtaW4tc2F0aXNmeWluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcbWluLXZlcnNpb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHZhbGlkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxvdXRzaWRlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxndHIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXGx0ci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcaW50ZXJzZWN0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcc2ltcGxpZnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHN1YnNldC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxhc3ltbWV0cmljS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxccnNhUHNzS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcdmFsaWRhdGVBc3ltbWV0cmljS2V5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxwc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXHZlcmlmeS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxsb2Rhc2guaW5jbHVkZXNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2Jvb2xlYW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2ludGVnZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc251bWJlclxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLmlzcGxhaW5vYmplY3RcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc3N0cmluZ1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLm9uY2VcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcc2lnbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJuLmpzXFxsaWJcXGJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0c19icm93c2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzYWZlci1idWZmZXJcXHNhZmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxccmVwb3J0ZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxidWZmZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbWluaW1hbGlzdGljLWFzc2VydFxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxub2RlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcY29uc3RhbnRzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxlbmNvZGVyc1xcZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZW5jb2RlcnNcXHBlbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGVuY29kZXJzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGRlY29kZXJzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxkZWNvZGVyc1xccGVtLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZGVjb2RlcnNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYXBpLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxjb25zdGFudHNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzXFxsaWJcXHV0aWxzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxicm9yYW5kXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXGJhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxzaG9ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXG1vbnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxlZHdhcmRzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFxjdXJ2ZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcY29tbW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwyNTYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGFcXDIyNC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcNTEyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwzODQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGEuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxyaXBlbWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxobWFjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xccHJlY29tcHV0ZWRcXHNlY3AyNTZrMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhtYWMtZHJiZ1xcbGliXFxobWFjLWRyYmcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxrZXkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxzaWduYXR1cmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGtleS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXHNpZ25hdHVyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYjY0LXRvLWJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxcYWxnb3JpdGhtLWlkZW50aWZpZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFxwdWJsaWMta2V5LWluZm8uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxccHJpdmF0ZS1rZXktaW5mby5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2stdG8tcGVtXFxzcmNcXGVjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xccnNhLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcandrLXRvLXBlbS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcX3ZpcnR1YWxcXHJvbGxkb3duX3J1bnRpbWUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGVudGl0eS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcY29sdW1uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxjb2x1bW4tYnVpbGRlci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUudXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHRyYWNpbmctdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXHVuaXF1ZS1jb25zdHJhaW50LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFxjb2x1bW5zXFxjb21tb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXGNvbHVtbnNcXGVudW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHN1YnF1ZXJ5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx0cmFjaW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2aWV3LWNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbFxcc3FsLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxhbGlhcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxmb3JlaWduLWtleXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1bmlxdWUtY29uc3RyYWludC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGJsb2IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxjdXN0b20uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxpbnRlZ2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcY29sdW1uc1xcbnVtZXJpYy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXHJlYWwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFx0ZXh0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzZWxlY3Rpb24tcHJveHkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LXByb21pc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxhbGwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGluZGV4ZXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxkZWxldGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhc2luZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcZXJyb3JzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxccGctY29yZVxccHJpbWFyeS1rZXlzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxjb25kaXRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxzZWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHJlbGF0aW9ucy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHZpZXctYmFzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGRpYWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXHNlbGVjdC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXGluc2VydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFx1cGRhdGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xcY291bnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccXVlcnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccmF3LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcZGIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhY2hlXFxjb3JlXFxjYWNoZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHNlc3Npb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGxvZ2dlci5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXHNjaGVtYS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxvcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3dC1kZWNvZGVcXGJ1aWxkXFxlc21cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXEBvc2xvanNcXGVuY29kaW5nXFxkaXN0XFxiYXNlMzIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcQG9zbG9qc1xcZW5jb2RpbmdcXGRpc3RcXGJhc2U2NC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxhdXRoLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcbW9kZWxzXFxjaGFyYWN0ZXIubW9kZWwuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxtb2RlbHNcXHVzZXIubW9kZWwuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxtb2RlbHNcXHJlc3VtZS1jb21tYW5kLm1vZGVsLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcbW9kZWxzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcYnVuLXNxbGl0ZVxcZHJpdmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxidW4tc3FsaXRlXFxzZXNzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGVzaVxcc2NvcGVzLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxlc2lcXGZldGNoLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxlc2lcXGNoYXJhY3Rlci5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxjb3Jwb3JhdGlvbi5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxhbGxpYW5jZS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxza2lsbHMuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcYnJpc2FcXGpzeC1ydW50aW1lXFxpbmRleC5qcyIsICIuLlxcc3JjXFxjb21wb25lbnRzXFxuYXZpZ2F0aW9uLnRzeCIsICIuLlxcc3JjXFxsYXlvdXRcXGluZGV4LnRzeCJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKiEgc2FmZS1idWZmZXIuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuU2FmZUJ1ZmZlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEJ1ZmZlci5wcm90b3R5cGUpXG5cbi8vIENvcHkgc3RhdGljIG1ldGhvZHMgZnJvbSBCdWZmZXJcbmNvcHlQcm9wcyhCdWZmZXIsIFNhZmVCdWZmZXIpXG5cblNhZmVCdWZmZXIuZnJvbSA9IGZ1bmN0aW9uIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuU2FmZUJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBidWYuZmlsbCgwKVxuICB9XG4gIHJldHVybiBidWZcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKHNpemUpXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBidWZmZXIuU2xvd0J1ZmZlcihzaXplKVxufVxuIiwKICAgICIvKmdsb2JhbCBtb2R1bGUsIHByb2Nlc3MqL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbmZ1bmN0aW9uIERhdGFTdHJlYW0oZGF0YSkge1xuICB0aGlzLmJ1ZmZlciA9IG51bGw7XG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyBObyBpbnB1dFxuICBpZiAoIWRhdGEpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFN0cmVhbVxuICBpZiAodHlwZW9mIGRhdGEucGlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuICAgIGRhdGEucGlwZSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEJ1ZmZlciBvciBTdHJpbmdcbiAgLy8gb3IgT2JqZWN0IChhc3N1bWVkbHkgYSBwYXNzd29yZGVkIGtleSlcbiAgaWYgKGRhdGEubGVuZ3RoIHx8IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xuICAgIHRoaXMuYnVmZmVyID0gZGF0YTtcbiAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmVtaXQoJ2VuZCcsIGRhdGEpO1xuICAgICAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICAgIH0uYmluZCh0aGlzKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmV4cGVjdGVkIGRhdGEgdHlwZSAoJysgdHlwZW9mIGRhdGEgKyAnKScpO1xufVxudXRpbC5pbmhlcml0cyhEYXRhU3RyZWFtLCBTdHJlYW0pO1xuXG5EYXRhU3RyZWFtLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlKGRhdGEpIHtcbiAgdGhpcy5idWZmZXIgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmJ1ZmZlciwgQnVmZmVyLmZyb20oZGF0YSldKTtcbiAgdGhpcy5lbWl0KCdkYXRhJywgZGF0YSk7XG59O1xuXG5EYXRhU3RyZWFtLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiBlbmQoZGF0YSkge1xuICBpZiAoZGF0YSlcbiAgICB0aGlzLndyaXRlKGRhdGEpO1xuICB0aGlzLmVtaXQoJ2VuZCcsIGRhdGEpO1xuICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XG4gIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYXRhU3RyZWFtO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGdldFBhcmFtU2l6ZShrZXlTaXplKSB7XG5cdHZhciByZXN1bHQgPSAoKGtleVNpemUgLyA4KSB8IDApICsgKGtleVNpemUgJSA4ID09PSAwID8gMCA6IDEpO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG52YXIgcGFyYW1CeXRlc0ZvckFsZyA9IHtcblx0RVMyNTY6IGdldFBhcmFtU2l6ZSgyNTYpLFxuXHRFUzM4NDogZ2V0UGFyYW1TaXplKDM4NCksXG5cdEVTNTEyOiBnZXRQYXJhbVNpemUoNTIxKVxufTtcblxuZnVuY3Rpb24gZ2V0UGFyYW1CeXRlc0ZvckFsZyhhbGcpIHtcblx0dmFyIHBhcmFtQnl0ZXMgPSBwYXJhbUJ5dGVzRm9yQWxnW2FsZ107XG5cdGlmIChwYXJhbUJ5dGVzKSB7XG5cdFx0cmV0dXJuIHBhcmFtQnl0ZXM7XG5cdH1cblxuXHR0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gYWxnb3JpdGhtIFwiJyArIGFsZyArICdcIicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFBhcmFtQnl0ZXNGb3JBbGc7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgZ2V0UGFyYW1CeXRlc0ZvckFsZyA9IHJlcXVpcmUoJy4vcGFyYW0tYnl0ZXMtZm9yLWFsZycpO1xuXG52YXIgTUFYX09DVEVUID0gMHg4MCxcblx0Q0xBU1NfVU5JVkVSU0FMID0gMCxcblx0UFJJTUlUSVZFX0JJVCA9IDB4MjAsXG5cdFRBR19TRVEgPSAweDEwLFxuXHRUQUdfSU5UID0gMHgwMixcblx0RU5DT0RFRF9UQUdfU0VRID0gKFRBR19TRVEgfCBQUklNSVRJVkVfQklUKSB8IChDTEFTU19VTklWRVJTQUwgPDwgNiksXG5cdEVOQ09ERURfVEFHX0lOVCA9IFRBR19JTlQgfCAoQ0xBU1NfVU5JVkVSU0FMIDw8IDYpO1xuXG5mdW5jdGlvbiBiYXNlNjRVcmwoYmFzZTY0KSB7XG5cdHJldHVybiBiYXNlNjRcblx0XHQucmVwbGFjZSgvPS9nLCAnJylcblx0XHQucmVwbGFjZSgvXFwrL2csICctJylcblx0XHQucmVwbGFjZSgvXFwvL2csICdfJyk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hdHVyZUFzQnVmZmVyKHNpZ25hdHVyZSkge1xuXHRpZiAoQnVmZmVyLmlzQnVmZmVyKHNpZ25hdHVyZSkpIHtcblx0XHRyZXR1cm4gc2lnbmF0dXJlO1xuXHR9IGVsc2UgaWYgKCdzdHJpbmcnID09PSB0eXBlb2Ygc2lnbmF0dXJlKSB7XG5cdFx0cmV0dXJuIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSwgJ2Jhc2U2NCcpO1xuXHR9XG5cblx0dGhyb3cgbmV3IFR5cGVFcnJvcignRUNEU0Egc2lnbmF0dXJlIG11c3QgYmUgYSBCYXNlNjQgc3RyaW5nIG9yIGEgQnVmZmVyJyk7XG59XG5cbmZ1bmN0aW9uIGRlclRvSm9zZShzaWduYXR1cmUsIGFsZykge1xuXHRzaWduYXR1cmUgPSBzaWduYXR1cmVBc0J1ZmZlcihzaWduYXR1cmUpO1xuXHR2YXIgcGFyYW1CeXRlcyA9IGdldFBhcmFtQnl0ZXNGb3JBbGcoYWxnKTtcblxuXHQvLyB0aGUgREVSIGVuY29kZWQgcGFyYW0gc2hvdWxkIGF0IG1vc3QgYmUgdGhlIHBhcmFtIHNpemUsIHBsdXMgYSBwYWRkaW5nXG5cdC8vIHplcm8sIHNpbmNlIGR1ZSB0byBiZWluZyBhIHNpZ25lZCBpbnRlZ2VyXG5cdHZhciBtYXhFbmNvZGVkUGFyYW1MZW5ndGggPSBwYXJhbUJ5dGVzICsgMTtcblxuXHR2YXIgaW5wdXRMZW5ndGggPSBzaWduYXR1cmUubGVuZ3RoO1xuXG5cdHZhciBvZmZzZXQgPSAwO1xuXHRpZiAoc2lnbmF0dXJlW29mZnNldCsrXSAhPT0gRU5DT0RFRF9UQUdfU0VRKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBleHBlY3RlZCBcInNlcVwiJyk7XG5cdH1cblxuXHR2YXIgc2VxTGVuZ3RoID0gc2lnbmF0dXJlW29mZnNldCsrXTtcblx0aWYgKHNlcUxlbmd0aCA9PT0gKE1BWF9PQ1RFVCB8IDEpKSB7XG5cdFx0c2VxTGVuZ3RoID0gc2lnbmF0dXJlW29mZnNldCsrXTtcblx0fVxuXG5cdGlmIChpbnB1dExlbmd0aCAtIG9mZnNldCA8IHNlcUxlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJzZXFcIiBzcGVjaWZpZWQgbGVuZ3RoIG9mIFwiJyArIHNlcUxlbmd0aCArICdcIiwgb25seSBcIicgKyAoaW5wdXRMZW5ndGggLSBvZmZzZXQpICsgJ1wiIHJlbWFpbmluZycpO1xuXHR9XG5cblx0aWYgKHNpZ25hdHVyZVtvZmZzZXQrK10gIT09IEVOQ09ERURfVEFHX0lOVCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgZXhwZWN0ZWQgXCJpbnRcIiBmb3IgXCJyXCInKTtcblx0fVxuXG5cdHZhciByTGVuZ3RoID0gc2lnbmF0dXJlW29mZnNldCsrXTtcblxuXHRpZiAoaW5wdXRMZW5ndGggLSBvZmZzZXQgLSAyIDwgckxlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJyXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyByTGVuZ3RoICsgJ1wiLCBvbmx5IFwiJyArIChpbnB1dExlbmd0aCAtIG9mZnNldCAtIDIpICsgJ1wiIGF2YWlsYWJsZScpO1xuXHR9XG5cblx0aWYgKG1heEVuY29kZWRQYXJhbUxlbmd0aCA8IHJMZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1wiclwiIHNwZWNpZmllZCBsZW5ndGggb2YgXCInICsgckxlbmd0aCArICdcIiwgbWF4IG9mIFwiJyArIG1heEVuY29kZWRQYXJhbUxlbmd0aCArICdcIiBpcyBhY2NlcHRhYmxlJyk7XG5cdH1cblxuXHR2YXIgck9mZnNldCA9IG9mZnNldDtcblx0b2Zmc2V0ICs9IHJMZW5ndGg7XG5cblx0aWYgKHNpZ25hdHVyZVtvZmZzZXQrK10gIT09IEVOQ09ERURfVEFHX0lOVCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgZXhwZWN0ZWQgXCJpbnRcIiBmb3IgXCJzXCInKTtcblx0fVxuXG5cdHZhciBzTGVuZ3RoID0gc2lnbmF0dXJlW29mZnNldCsrXTtcblxuXHRpZiAoaW5wdXRMZW5ndGggLSBvZmZzZXQgIT09IHNMZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1wic1wiIHNwZWNpZmllZCBsZW5ndGggb2YgXCInICsgc0xlbmd0aCArICdcIiwgZXhwZWN0ZWQgXCInICsgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0KSArICdcIicpO1xuXHR9XG5cblx0aWYgKG1heEVuY29kZWRQYXJhbUxlbmd0aCA8IHNMZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1wic1wiIHNwZWNpZmllZCBsZW5ndGggb2YgXCInICsgc0xlbmd0aCArICdcIiwgbWF4IG9mIFwiJyArIG1heEVuY29kZWRQYXJhbUxlbmd0aCArICdcIiBpcyBhY2NlcHRhYmxlJyk7XG5cdH1cblxuXHR2YXIgc09mZnNldCA9IG9mZnNldDtcblx0b2Zmc2V0ICs9IHNMZW5ndGg7XG5cblx0aWYgKG9mZnNldCAhPT0gaW5wdXRMZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGNvbnN1bWUgZW50aXJlIGJ1ZmZlciwgYnV0IFwiJyArIChpbnB1dExlbmd0aCAtIG9mZnNldCkgKyAnXCIgYnl0ZXMgcmVtYWluJyk7XG5cdH1cblxuXHR2YXIgclBhZGRpbmcgPSBwYXJhbUJ5dGVzIC0gckxlbmd0aCxcblx0XHRzUGFkZGluZyA9IHBhcmFtQnl0ZXMgLSBzTGVuZ3RoO1xuXG5cdHZhciBkc3QgPSBCdWZmZXIuYWxsb2NVbnNhZmUoclBhZGRpbmcgKyByTGVuZ3RoICsgc1BhZGRpbmcgKyBzTGVuZ3RoKTtcblxuXHRmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IHJQYWRkaW5nOyArK29mZnNldCkge1xuXHRcdGRzdFtvZmZzZXRdID0gMDtcblx0fVxuXHRzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgck9mZnNldCArIE1hdGgubWF4KC1yUGFkZGluZywgMCksIHJPZmZzZXQgKyByTGVuZ3RoKTtcblxuXHRvZmZzZXQgPSBwYXJhbUJ5dGVzO1xuXG5cdGZvciAodmFyIG8gPSBvZmZzZXQ7IG9mZnNldCA8IG8gKyBzUGFkZGluZzsgKytvZmZzZXQpIHtcblx0XHRkc3Rbb2Zmc2V0XSA9IDA7XG5cdH1cblx0c2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIHNPZmZzZXQgKyBNYXRoLm1heCgtc1BhZGRpbmcsIDApLCBzT2Zmc2V0ICsgc0xlbmd0aCk7XG5cblx0ZHN0ID0gZHN0LnRvU3RyaW5nKCdiYXNlNjQnKTtcblx0ZHN0ID0gYmFzZTY0VXJsKGRzdCk7XG5cblx0cmV0dXJuIGRzdDtcbn1cblxuZnVuY3Rpb24gY291bnRQYWRkaW5nKGJ1Ziwgc3RhcnQsIHN0b3ApIHtcblx0dmFyIHBhZGRpbmcgPSAwO1xuXHR3aGlsZSAoc3RhcnQgKyBwYWRkaW5nIDwgc3RvcCAmJiBidWZbc3RhcnQgKyBwYWRkaW5nXSA9PT0gMCkge1xuXHRcdCsrcGFkZGluZztcblx0fVxuXG5cdHZhciBuZWVkc1NpZ24gPSBidWZbc3RhcnQgKyBwYWRkaW5nXSA+PSBNQVhfT0NURVQ7XG5cdGlmIChuZWVkc1NpZ24pIHtcblx0XHQtLXBhZGRpbmc7XG5cdH1cblxuXHRyZXR1cm4gcGFkZGluZztcbn1cblxuZnVuY3Rpb24gam9zZVRvRGVyKHNpZ25hdHVyZSwgYWxnKSB7XG5cdHNpZ25hdHVyZSA9IHNpZ25hdHVyZUFzQnVmZmVyKHNpZ25hdHVyZSk7XG5cdHZhciBwYXJhbUJ5dGVzID0gZ2V0UGFyYW1CeXRlc0ZvckFsZyhhbGcpO1xuXG5cdHZhciBzaWduYXR1cmVCeXRlcyA9IHNpZ25hdHVyZS5sZW5ndGg7XG5cdGlmIChzaWduYXR1cmVCeXRlcyAhPT0gcGFyYW1CeXRlcyAqIDIpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdcIicgKyBhbGcgKyAnXCIgc2lnbmF0dXJlcyBtdXN0IGJlIFwiJyArIHBhcmFtQnl0ZXMgKiAyICsgJ1wiIGJ5dGVzLCBzYXcgXCInICsgc2lnbmF0dXJlQnl0ZXMgKyAnXCInKTtcblx0fVxuXG5cdHZhciByUGFkZGluZyA9IGNvdW50UGFkZGluZyhzaWduYXR1cmUsIDAsIHBhcmFtQnl0ZXMpO1xuXHR2YXIgc1BhZGRpbmcgPSBjb3VudFBhZGRpbmcoc2lnbmF0dXJlLCBwYXJhbUJ5dGVzLCBzaWduYXR1cmUubGVuZ3RoKTtcblx0dmFyIHJMZW5ndGggPSBwYXJhbUJ5dGVzIC0gclBhZGRpbmc7XG5cdHZhciBzTGVuZ3RoID0gcGFyYW1CeXRlcyAtIHNQYWRkaW5nO1xuXG5cdHZhciByc0J5dGVzID0gMSArIDEgKyByTGVuZ3RoICsgMSArIDEgKyBzTGVuZ3RoO1xuXG5cdHZhciBzaG9ydExlbmd0aCA9IHJzQnl0ZXMgPCBNQVhfT0NURVQ7XG5cblx0dmFyIGRzdCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgoc2hvcnRMZW5ndGggPyAyIDogMykgKyByc0J5dGVzKTtcblxuXHR2YXIgb2Zmc2V0ID0gMDtcblx0ZHN0W29mZnNldCsrXSA9IEVOQ09ERURfVEFHX1NFUTtcblx0aWYgKHNob3J0TGVuZ3RoKSB7XG5cdFx0Ly8gQml0IDggaGFzIHZhbHVlIFwiMFwiXG5cdFx0Ly8gYml0cyA3LTEgZ2l2ZSB0aGUgbGVuZ3RoLlxuXHRcdGRzdFtvZmZzZXQrK10gPSByc0J5dGVzO1xuXHR9IGVsc2Uge1xuXHRcdC8vIEJpdCA4IG9mIGZpcnN0IG9jdGV0IGhhcyB2YWx1ZSBcIjFcIlxuXHRcdC8vIGJpdHMgNy0xIGdpdmUgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGxlbmd0aCBvY3RldHMuXG5cdFx0ZHN0W29mZnNldCsrXSA9IE1BWF9PQ1RFVFx0fCAxO1xuXHRcdC8vIGxlbmd0aCwgYmFzZSAyNTZcblx0XHRkc3Rbb2Zmc2V0KytdID0gcnNCeXRlcyAmIDB4ZmY7XG5cdH1cblx0ZHN0W29mZnNldCsrXSA9IEVOQ09ERURfVEFHX0lOVDtcblx0ZHN0W29mZnNldCsrXSA9IHJMZW5ndGg7XG5cdGlmIChyUGFkZGluZyA8IDApIHtcblx0XHRkc3Rbb2Zmc2V0KytdID0gMDtcblx0XHRvZmZzZXQgKz0gc2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIDAsIHBhcmFtQnl0ZXMpO1xuXHR9IGVsc2Uge1xuXHRcdG9mZnNldCArPSBzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgclBhZGRpbmcsIHBhcmFtQnl0ZXMpO1xuXHR9XG5cdGRzdFtvZmZzZXQrK10gPSBFTkNPREVEX1RBR19JTlQ7XG5cdGRzdFtvZmZzZXQrK10gPSBzTGVuZ3RoO1xuXHRpZiAoc1BhZGRpbmcgPCAwKSB7XG5cdFx0ZHN0W29mZnNldCsrXSA9IDA7XG5cdFx0c2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIHBhcmFtQnl0ZXMpO1xuXHR9IGVsc2Uge1xuXHRcdHNpZ25hdHVyZS5jb3B5KGRzdCwgb2Zmc2V0LCBwYXJhbUJ5dGVzICsgc1BhZGRpbmcpO1xuXHR9XG5cblx0cmV0dXJuIGRzdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGRlclRvSm9zZTogZGVyVG9Kb3NlLFxuXHRqb3NlVG9EZXI6IGpvc2VUb0RlclxufTtcbiIsCiAgICAiLypqc2hpbnQgbm9kZTp0cnVlICovXG4ndXNlIHN0cmljdCc7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyOyAvLyBicm93c2VyaWZ5XG52YXIgU2xvd0J1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLlNsb3dCdWZmZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gYnVmZmVyRXE7XG5cbmZ1bmN0aW9uIGJ1ZmZlckVxKGEsIGIpIHtcblxuICAvLyBzaG9ydGN1dHRpbmcgb24gdHlwZSBpcyBuZWNlc3NhcnkgZm9yIGNvcnJlY3RuZXNzXG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBidWZmZXIgc2l6ZXMgc2hvdWxkIGJlIHdlbGwta25vd24gaW5mb3JtYXRpb24sIHNvIGRlc3BpdGUgdGhpc1xuICAvLyBzaG9ydGN1dHRpbmcsIGl0IGRvZXNuJ3QgbGVhayBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlICpjb250ZW50cyogb2YgdGhlXG4gIC8vIGJ1ZmZlcnMuXG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgYyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgIC8qanNoaW50IGJpdHdpc2U6ZmFsc2UgKi9cbiAgICBjIHw9IGFbaV0gXiBiW2ldOyAvLyBYT1JcbiAgfVxuICByZXR1cm4gYyA9PT0gMDtcbn1cblxuYnVmZmVyRXEuaW5zdGFsbCA9IGZ1bmN0aW9uKCkge1xuICBCdWZmZXIucHJvdG90eXBlLmVxdWFsID0gU2xvd0J1ZmZlci5wcm90b3R5cGUuZXF1YWwgPSBmdW5jdGlvbiBlcXVhbCh0aGF0KSB7XG4gICAgcmV0dXJuIGJ1ZmZlckVxKHRoaXMsIHRoYXQpO1xuICB9O1xufTtcblxudmFyIG9yaWdCdWZFcXVhbCA9IEJ1ZmZlci5wcm90b3R5cGUuZXF1YWw7XG52YXIgb3JpZ1Nsb3dCdWZFcXVhbCA9IFNsb3dCdWZmZXIucHJvdG90eXBlLmVxdWFsO1xuYnVmZmVyRXEucmVzdG9yZSA9IGZ1bmN0aW9uKCkge1xuICBCdWZmZXIucHJvdG90eXBlLmVxdWFsID0gb3JpZ0J1ZkVxdWFsO1xuICBTbG93QnVmZmVyLnByb3RvdHlwZS5lcXVhbCA9IG9yaWdTbG93QnVmRXF1YWw7XG59O1xuIiwKICAgICJ2YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG52YXIgZm9ybWF0RWNkc2EgPSByZXF1aXJlKCdlY2RzYS1zaWctZm9ybWF0dGVyJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxudmFyIE1TR19JTlZBTElEX0FMR09SSVRITSA9ICdcIiVzXCIgaXMgbm90IGEgdmFsaWQgYWxnb3JpdGhtLlxcbiAgU3VwcG9ydGVkIGFsZ29yaXRobXMgYXJlOlxcbiAgXCJIUzI1NlwiLCBcIkhTMzg0XCIsIFwiSFM1MTJcIiwgXCJSUzI1NlwiLCBcIlJTMzg0XCIsIFwiUlM1MTJcIiwgXCJQUzI1NlwiLCBcIlBTMzg0XCIsIFwiUFM1MTJcIiwgXCJFUzI1NlwiLCBcIkVTMzg0XCIsIFwiRVM1MTJcIiBhbmQgXCJub25lXCIuJ1xudmFyIE1TR19JTlZBTElEX1NFQ1JFVCA9ICdzZWNyZXQgbXVzdCBiZSBhIHN0cmluZyBvciBidWZmZXInO1xudmFyIE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSA9ICdrZXkgbXVzdCBiZSBhIHN0cmluZyBvciBhIGJ1ZmZlcic7XG52YXIgTVNHX0lOVkFMSURfU0lHTkVSX0tFWSA9ICdrZXkgbXVzdCBiZSBhIHN0cmluZywgYSBidWZmZXIgb3IgYW4gb2JqZWN0JztcblxudmFyIHN1cHBvcnRzS2V5T2JqZWN0cyA9IHR5cGVvZiBjcnlwdG8uY3JlYXRlUHVibGljS2V5ID09PSAnZnVuY3Rpb24nO1xuaWYgKHN1cHBvcnRzS2V5T2JqZWN0cykge1xuICBNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkgKz0gJyBvciBhIEtleU9iamVjdCc7XG4gIE1TR19JTlZBTElEX1NFQ1JFVCArPSAnb3IgYSBLZXlPYmplY3QnO1xufVxuXG5mdW5jdGlvbiBjaGVja0lzUHVibGljS2V5KGtleSkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGtleSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXN1cHBvcnRzS2V5T2JqZWN0cykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleS50eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkuYXN5bW1ldHJpY0tleVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleS5leHBvcnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2hlY2tJc1ByaXZhdGVLZXkoa2V5KSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9TSUdORVJfS0VZKTtcbn07XG5cbmZ1bmN0aW9uIGNoZWNrSXNTZWNyZXRLZXkoa2V5KSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICBpZiAoIXN1cHBvcnRzS2V5T2JqZWN0cykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9TRUNSRVQpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NFQ1JFVCk7XG4gIH1cblxuICBpZiAoa2V5LnR5cGUgIT09ICdzZWNyZXQnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NFQ1JFVCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleS5leHBvcnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfU0VDUkVUKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmcm9tQmFzZTY0KGJhc2U2NCkge1xuICByZXR1cm4gYmFzZTY0XG4gICAgLnJlcGxhY2UoLz0vZywgJycpXG4gICAgLnJlcGxhY2UoL1xcKy9nLCAnLScpXG4gICAgLnJlcGxhY2UoL1xcLy9nLCAnXycpO1xufVxuXG5mdW5jdGlvbiB0b0Jhc2U2NChiYXNlNjR1cmwpIHtcbiAgYmFzZTY0dXJsID0gYmFzZTY0dXJsLnRvU3RyaW5nKCk7XG5cbiAgdmFyIHBhZGRpbmcgPSA0IC0gYmFzZTY0dXJsLmxlbmd0aCAlIDQ7XG4gIGlmIChwYWRkaW5nICE9PSA0KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWRkaW5nOyArK2kpIHtcbiAgICAgIGJhc2U2NHVybCArPSAnPSc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhc2U2NHVybFxuICAgIC5yZXBsYWNlKC9cXC0vZywgJysnKVxuICAgIC5yZXBsYWNlKC9fL2csICcvJyk7XG59XG5cbmZ1bmN0aW9uIHR5cGVFcnJvcih0ZW1wbGF0ZSkge1xuICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgdmFyIGVyck1zZyA9IHV0aWwuZm9ybWF0LmJpbmQodXRpbCwgdGVtcGxhdGUpLmFwcGx5KG51bGwsIGFyZ3MpO1xuICByZXR1cm4gbmV3IFR5cGVFcnJvcihlcnJNc2cpO1xufVxuXG5mdW5jdGlvbiBidWZmZXJPclN0cmluZyhvYmopIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopIHx8IHR5cGVvZiBvYmogPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVJbnB1dCh0aGluZykge1xuICBpZiAoIWJ1ZmZlck9yU3RyaW5nKHRoaW5nKSlcbiAgICB0aGluZyA9IEpTT04uc3RyaW5naWZ5KHRoaW5nKTtcbiAgcmV0dXJuIHRoaW5nO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIbWFjU2lnbmVyKGJpdHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24odGhpbmcsIHNlY3JldCkge1xuICAgIGNoZWNrSXNTZWNyZXRLZXkoc2VjcmV0KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICB2YXIgaG1hYyA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGEnICsgYml0cywgc2VjcmV0KTtcbiAgICB2YXIgc2lnID0gKGhtYWMudXBkYXRlKHRoaW5nKSwgaG1hYy5kaWdlc3QoJ2Jhc2U2NCcpKVxuICAgIHJldHVybiBmcm9tQmFzZTY0KHNpZyk7XG4gIH1cbn1cblxudmFyIGJ1ZmZlckVxdWFsO1xudmFyIHRpbWluZ1NhZmVFcXVhbCA9ICd0aW1pbmdTYWZlRXF1YWwnIGluIGNyeXB0byA/IGZ1bmN0aW9uIHRpbWluZ1NhZmVFcXVhbChhLCBiKSB7XG4gIGlmIChhLmJ5dGVMZW5ndGggIT09IGIuYnl0ZUxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBjcnlwdG8udGltaW5nU2FmZUVxdWFsKGEsIGIpXG59IDogZnVuY3Rpb24gdGltaW5nU2FmZUVxdWFsKGEsIGIpIHtcbiAgaWYgKCFidWZmZXJFcXVhbCkge1xuICAgIGJ1ZmZlckVxdWFsID0gcmVxdWlyZSgnYnVmZmVyLWVxdWFsLWNvbnN0YW50LXRpbWUnKTtcbiAgfVxuXG4gIHJldHVybiBidWZmZXJFcXVhbChhLCBiKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVIbWFjVmVyaWZpZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHNlY3JldCkge1xuICAgIHZhciBjb21wdXRlZFNpZyA9IGNyZWF0ZUhtYWNTaWduZXIoYml0cykodGhpbmcsIHNlY3JldCk7XG4gICAgcmV0dXJuIHRpbWluZ1NhZmVFcXVhbChCdWZmZXIuZnJvbShzaWduYXR1cmUpLCBCdWZmZXIuZnJvbShjb21wdXRlZFNpZykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleVNpZ25lcihiaXRzKSB7XG4gcmV0dXJuIGZ1bmN0aW9uIHNpZ24odGhpbmcsIHByaXZhdGVLZXkpIHtcbiAgICBjaGVja0lzUHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICAvLyBFdmVuIHRob3VnaCB3ZSBhcmUgc3BlY2lmeWluZyBcIlJTQVwiIGhlcmUsIHRoaXMgd29ya3Mgd2l0aCBFQ0RTQVxuICAgIC8vIGtleXMgYXMgd2VsbC5cbiAgICB2YXIgc2lnbmVyID0gY3J5cHRvLmNyZWF0ZVNpZ24oJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmFyIHNpZyA9IChzaWduZXIudXBkYXRlKHRoaW5nKSwgc2lnbmVyLnNpZ24ocHJpdmF0ZUtleSwgJ2Jhc2U2NCcpKTtcbiAgICByZXR1cm4gZnJvbUJhc2U2NChzaWcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleVZlcmlmaWVyKGJpdHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcmlmeSh0aGluZywgc2lnbmF0dXJlLCBwdWJsaWNLZXkpIHtcbiAgICBjaGVja0lzUHVibGljS2V5KHB1YmxpY0tleSk7XG4gICAgdGhpbmcgPSBub3JtYWxpemVJbnB1dCh0aGluZyk7XG4gICAgc2lnbmF0dXJlID0gdG9CYXNlNjQoc2lnbmF0dXJlKTtcbiAgICB2YXIgdmVyaWZpZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KCdSU0EtU0hBJyArIGJpdHMpO1xuICAgIHZlcmlmaWVyLnVwZGF0ZSh0aGluZyk7XG4gICAgcmV0dXJuIHZlcmlmaWVyLnZlcmlmeShwdWJsaWNLZXksIHNpZ25hdHVyZSwgJ2Jhc2U2NCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBTU0tleVNpZ25lcihiaXRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzaWduKHRoaW5nLCBwcml2YXRlS2V5KSB7XG4gICAgY2hlY2tJc1ByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gICAgdGhpbmcgPSBub3JtYWxpemVJbnB1dCh0aGluZyk7XG4gICAgdmFyIHNpZ25lciA9IGNyeXB0by5jcmVhdGVTaWduKCdSU0EtU0hBJyArIGJpdHMpO1xuICAgIHZhciBzaWcgPSAoc2lnbmVyLnVwZGF0ZSh0aGluZyksIHNpZ25lci5zaWduKHtcbiAgICAgIGtleTogcHJpdmF0ZUtleSxcbiAgICAgIHBhZGRpbmc6IGNyeXB0by5jb25zdGFudHMuUlNBX1BLQ1MxX1BTU19QQURESU5HLFxuICAgICAgc2FsdExlbmd0aDogY3J5cHRvLmNvbnN0YW50cy5SU0FfUFNTX1NBTFRMRU5fRElHRVNUXG4gICAgfSwgJ2Jhc2U2NCcpKTtcbiAgICByZXR1cm4gZnJvbUJhc2U2NChzaWcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBTU0tleVZlcmlmaWVyKGJpdHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcmlmeSh0aGluZywgc2lnbmF0dXJlLCBwdWJsaWNLZXkpIHtcbiAgICBjaGVja0lzUHVibGljS2V5KHB1YmxpY0tleSk7XG4gICAgdGhpbmcgPSBub3JtYWxpemVJbnB1dCh0aGluZyk7XG4gICAgc2lnbmF0dXJlID0gdG9CYXNlNjQoc2lnbmF0dXJlKTtcbiAgICB2YXIgdmVyaWZpZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KCdSU0EtU0hBJyArIGJpdHMpO1xuICAgIHZlcmlmaWVyLnVwZGF0ZSh0aGluZyk7XG4gICAgcmV0dXJuIHZlcmlmaWVyLnZlcmlmeSh7XG4gICAgICBrZXk6IHB1YmxpY0tleSxcbiAgICAgIHBhZGRpbmc6IGNyeXB0by5jb25zdGFudHMuUlNBX1BLQ1MxX1BTU19QQURESU5HLFxuICAgICAgc2FsdExlbmd0aDogY3J5cHRvLmNvbnN0YW50cy5SU0FfUFNTX1NBTFRMRU5fRElHRVNUXG4gICAgfSwgc2lnbmF0dXJlLCAnYmFzZTY0Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRUNEU0FTaWduZXIoYml0cykge1xuICB2YXIgaW5uZXIgPSBjcmVhdGVLZXlTaWduZXIoYml0cyk7XG4gIHJldHVybiBmdW5jdGlvbiBzaWduKCkge1xuICAgIHZhciBzaWduYXR1cmUgPSBpbm5lci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIHNpZ25hdHVyZSA9IGZvcm1hdEVjZHNhLmRlclRvSm9zZShzaWduYXR1cmUsICdFUycgKyBiaXRzKTtcbiAgICByZXR1cm4gc2lnbmF0dXJlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFQ0RTQVZlcmlmZXIoYml0cykge1xuICB2YXIgaW5uZXIgPSBjcmVhdGVLZXlWZXJpZmllcihiaXRzKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcmlmeSh0aGluZywgc2lnbmF0dXJlLCBwdWJsaWNLZXkpIHtcbiAgICBzaWduYXR1cmUgPSBmb3JtYXRFY2RzYS5qb3NlVG9EZXIoc2lnbmF0dXJlLCAnRVMnICsgYml0cykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIHZhciByZXN1bHQgPSBpbm5lcih0aGluZywgc2lnbmF0dXJlLCBwdWJsaWNLZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vbmVTaWduZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzaWduKCkge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVOb25lVmVyaWZpZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiB2ZXJpZnkodGhpbmcsIHNpZ25hdHVyZSkge1xuICAgIHJldHVybiBzaWduYXR1cmUgPT09ICcnO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gandhKGFsZ29yaXRobSkge1xuICB2YXIgc2lnbmVyRmFjdG9yaWVzID0ge1xuICAgIGhzOiBjcmVhdGVIbWFjU2lnbmVyLFxuICAgIHJzOiBjcmVhdGVLZXlTaWduZXIsXG4gICAgcHM6IGNyZWF0ZVBTU0tleVNpZ25lcixcbiAgICBlczogY3JlYXRlRUNEU0FTaWduZXIsXG4gICAgbm9uZTogY3JlYXRlTm9uZVNpZ25lcixcbiAgfVxuICB2YXIgdmVyaWZpZXJGYWN0b3JpZXMgPSB7XG4gICAgaHM6IGNyZWF0ZUhtYWNWZXJpZmllcixcbiAgICByczogY3JlYXRlS2V5VmVyaWZpZXIsXG4gICAgcHM6IGNyZWF0ZVBTU0tleVZlcmlmaWVyLFxuICAgIGVzOiBjcmVhdGVFQ0RTQVZlcmlmZXIsXG4gICAgbm9uZTogY3JlYXRlTm9uZVZlcmlmaWVyLFxuICB9XG4gIHZhciBtYXRjaCA9IGFsZ29yaXRobS5tYXRjaCgvXihSU3xQU3xFU3xIUykoMjU2fDM4NHw1MTIpJHxeKG5vbmUpJC9pKTtcbiAgaWYgKCFtYXRjaClcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfQUxHT1JJVEhNLCBhbGdvcml0aG0pO1xuICB2YXIgYWxnbyA9IChtYXRjaFsxXSB8fCBtYXRjaFszXSkudG9Mb3dlckNhc2UoKTtcbiAgdmFyIGJpdHMgPSBtYXRjaFsyXTtcblxuICByZXR1cm4ge1xuICAgIHNpZ246IHNpZ25lckZhY3Rvcmllc1thbGdvXShiaXRzKSxcbiAgICB2ZXJpZnk6IHZlcmlmaWVyRmFjdG9yaWVzW2FsZ29dKGJpdHMpLFxuICB9XG59O1xuIiwKICAgICIvKmdsb2JhbCBtb2R1bGUqL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0b1N0cmluZyhvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKVxuICAgIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCBCdWZmZXIuaXNCdWZmZXIob2JqKSlcbiAgICByZXR1cm4gb2JqLnRvU3RyaW5nKCk7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xufTtcbiIsCiAgICAiLypnbG9iYWwgbW9kdWxlKi9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBEYXRhU3RyZWFtID0gcmVxdWlyZSgnLi9kYXRhLXN0cmVhbScpO1xudmFyIGp3YSA9IHJlcXVpcmUoJ2p3YScpO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b3N0cmluZycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbmZ1bmN0aW9uIGJhc2U2NHVybChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIHJldHVybiBCdWZmZXJcbiAgICAuZnJvbShzdHJpbmcsIGVuY29kaW5nKVxuICAgIC50b1N0cmluZygnYmFzZTY0JylcbiAgICAucmVwbGFjZSgvPS9nLCAnJylcbiAgICAucmVwbGFjZSgvXFwrL2csICctJylcbiAgICAucmVwbGFjZSgvXFwvL2csICdfJyk7XG59XG5cbmZ1bmN0aW9uIGp3c1NlY3VyZWRJbnB1dChoZWFkZXIsIHBheWxvYWQsIGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0ZjgnO1xuICB2YXIgZW5jb2RlZEhlYWRlciA9IGJhc2U2NHVybCh0b1N0cmluZyhoZWFkZXIpLCAnYmluYXJ5Jyk7XG4gIHZhciBlbmNvZGVkUGF5bG9hZCA9IGJhc2U2NHVybCh0b1N0cmluZyhwYXlsb2FkKSwgZW5jb2RpbmcpO1xuICByZXR1cm4gdXRpbC5mb3JtYXQoJyVzLiVzJywgZW5jb2RlZEhlYWRlciwgZW5jb2RlZFBheWxvYWQpO1xufVxuXG5mdW5jdGlvbiBqd3NTaWduKG9wdHMpIHtcbiAgdmFyIGhlYWRlciA9IG9wdHMuaGVhZGVyO1xuICB2YXIgcGF5bG9hZCA9IG9wdHMucGF5bG9hZDtcbiAgdmFyIHNlY3JldE9yS2V5ID0gb3B0cy5zZWNyZXQgfHwgb3B0cy5wcml2YXRlS2V5O1xuICB2YXIgZW5jb2RpbmcgPSBvcHRzLmVuY29kaW5nO1xuICB2YXIgYWxnbyA9IGp3YShoZWFkZXIuYWxnKTtcbiAgdmFyIHNlY3VyZWRJbnB1dCA9IGp3c1NlY3VyZWRJbnB1dChoZWFkZXIsIHBheWxvYWQsIGVuY29kaW5nKTtcbiAgdmFyIHNpZ25hdHVyZSA9IGFsZ28uc2lnbihzZWN1cmVkSW5wdXQsIHNlY3JldE9yS2V5KTtcbiAgcmV0dXJuIHV0aWwuZm9ybWF0KCclcy4lcycsIHNlY3VyZWRJbnB1dCwgc2lnbmF0dXJlKTtcbn1cblxuZnVuY3Rpb24gU2lnblN0cmVhbShvcHRzKSB7XG4gIHZhciBzZWNyZXQgPSBvcHRzLnNlY3JldHx8b3B0cy5wcml2YXRlS2V5fHxvcHRzLmtleTtcbiAgdmFyIHNlY3JldFN0cmVhbSA9IG5ldyBEYXRhU3RyZWFtKHNlY3JldCk7XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuICB0aGlzLmhlYWRlciA9IG9wdHMuaGVhZGVyO1xuICB0aGlzLmVuY29kaW5nID0gb3B0cy5lbmNvZGluZztcbiAgdGhpcy5zZWNyZXQgPSB0aGlzLnByaXZhdGVLZXkgPSB0aGlzLmtleSA9IHNlY3JldFN0cmVhbTtcbiAgdGhpcy5wYXlsb2FkID0gbmV3IERhdGFTdHJlYW0ob3B0cy5wYXlsb2FkKTtcbiAgdGhpcy5zZWNyZXQub25jZSgnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnBheWxvYWQud3JpdGFibGUgJiYgdGhpcy5yZWFkYWJsZSlcbiAgICAgIHRoaXMuc2lnbigpO1xuICB9LmJpbmQodGhpcykpO1xuXG4gIHRoaXMucGF5bG9hZC5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuc2VjcmV0LndyaXRhYmxlICYmIHRoaXMucmVhZGFibGUpXG4gICAgICB0aGlzLnNpZ24oKTtcbiAgfS5iaW5kKHRoaXMpKTtcbn1cbnV0aWwuaW5oZXJpdHMoU2lnblN0cmVhbSwgU3RyZWFtKTtcblxuU2lnblN0cmVhbS5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24oKSB7XG4gIHRyeSB7XG4gICAgdmFyIHNpZ25hdHVyZSA9IGp3c1NpZ24oe1xuICAgICAgaGVhZGVyOiB0aGlzLmhlYWRlcixcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZC5idWZmZXIsXG4gICAgICBzZWNyZXQ6IHRoaXMuc2VjcmV0LmJ1ZmZlcixcbiAgICAgIGVuY29kaW5nOiB0aGlzLmVuY29kaW5nXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0KCdkb25lJywgc2lnbmF0dXJlKTtcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCBzaWduYXR1cmUpO1xuICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHJldHVybiBzaWduYXR1cmU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGUpO1xuICAgIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgfVxufTtcblxuU2lnblN0cmVhbS5zaWduID0gandzU2lnbjtcblxubW9kdWxlLmV4cG9ydHMgPSBTaWduU3RyZWFtO1xuIiwKICAgICIvKmdsb2JhbCBtb2R1bGUqL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIERhdGFTdHJlYW0gPSByZXF1aXJlKCcuL2RhdGEtc3RyZWFtJyk7XG52YXIgandhID0gcmVxdWlyZSgnandhJyk7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3Rvc3RyaW5nJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBKV1NfUkVHRVggPSAvXlthLXpBLVowLTlcXC1fXSs/XFwuW2EtekEtWjAtOVxcLV9dKz9cXC4oW2EtekEtWjAtOVxcLV9dKyk/JC87XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHRoaW5nKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpbmcpID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cblxuZnVuY3Rpb24gc2FmZUpzb25QYXJzZSh0aGluZykge1xuICBpZiAoaXNPYmplY3QodGhpbmcpKVxuICAgIHJldHVybiB0aGluZztcbiAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UodGhpbmcpOyB9XG4gIGNhdGNoIChlKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbn1cblxuZnVuY3Rpb24gaGVhZGVyRnJvbUpXUyhqd3NTaWcpIHtcbiAgdmFyIGVuY29kZWRIZWFkZXIgPSBqd3NTaWcuc3BsaXQoJy4nLCAxKVswXTtcbiAgcmV0dXJuIHNhZmVKc29uUGFyc2UoQnVmZmVyLmZyb20oZW5jb2RlZEhlYWRlciwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdiaW5hcnknKSk7XG59XG5cbmZ1bmN0aW9uIHNlY3VyZWRJbnB1dEZyb21KV1MoandzU2lnKSB7XG4gIHJldHVybiBqd3NTaWcuc3BsaXQoJy4nLCAyKS5qb2luKCcuJyk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hdHVyZUZyb21KV1MoandzU2lnKSB7XG4gIHJldHVybiBqd3NTaWcuc3BsaXQoJy4nKVsyXTtcbn1cblxuZnVuY3Rpb24gcGF5bG9hZEZyb21KV1MoandzU2lnLCBlbmNvZGluZykge1xuICBlbmNvZGluZyA9IGVuY29kaW5nIHx8ICd1dGY4JztcbiAgdmFyIHBheWxvYWQgPSBqd3NTaWcuc3BsaXQoJy4nKVsxXTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHBheWxvYWQsICdiYXNlNjQnKS50b1N0cmluZyhlbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRKd3Moc3RyaW5nKSB7XG4gIHJldHVybiBKV1NfUkVHRVgudGVzdChzdHJpbmcpICYmICEhaGVhZGVyRnJvbUpXUyhzdHJpbmcpO1xufVxuXG5mdW5jdGlvbiBqd3NWZXJpZnkoandzU2lnLCBhbGdvcml0aG0sIHNlY3JldE9yS2V5KSB7XG4gIGlmICghYWxnb3JpdGhtKSB7XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIk1pc3NpbmcgYWxnb3JpdGhtIHBhcmFtZXRlciBmb3IgandzLnZlcmlmeVwiKTtcbiAgICBlcnIuY29kZSA9IFwiTUlTU0lOR19BTEdPUklUSE1cIjtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbiAgandzU2lnID0gdG9TdHJpbmcoandzU2lnKTtcbiAgdmFyIHNpZ25hdHVyZSA9IHNpZ25hdHVyZUZyb21KV1MoandzU2lnKTtcbiAgdmFyIHNlY3VyZWRJbnB1dCA9IHNlY3VyZWRJbnB1dEZyb21KV1MoandzU2lnKTtcbiAgdmFyIGFsZ28gPSBqd2EoYWxnb3JpdGhtKTtcbiAgcmV0dXJuIGFsZ28udmVyaWZ5KHNlY3VyZWRJbnB1dCwgc2lnbmF0dXJlLCBzZWNyZXRPcktleSk7XG59XG5cbmZ1bmN0aW9uIGp3c0RlY29kZShqd3NTaWcsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIGp3c1NpZyA9IHRvU3RyaW5nKGp3c1NpZyk7XG5cbiAgaWYgKCFpc1ZhbGlkSndzKGp3c1NpZykpXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgdmFyIGhlYWRlciA9IGhlYWRlckZyb21KV1MoandzU2lnKTtcblxuICBpZiAoIWhlYWRlcilcbiAgICByZXR1cm4gbnVsbDtcblxuICB2YXIgcGF5bG9hZCA9IHBheWxvYWRGcm9tSldTKGp3c1NpZyk7XG4gIGlmIChoZWFkZXIudHlwID09PSAnSldUJyB8fCBvcHRzLmpzb24pXG4gICAgcGF5bG9hZCA9IEpTT04ucGFyc2UocGF5bG9hZCwgb3B0cy5lbmNvZGluZyk7XG5cbiAgcmV0dXJuIHtcbiAgICBoZWFkZXI6IGhlYWRlcixcbiAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlRnJvbUpXUyhqd3NTaWcpXG4gIH07XG59XG5cbmZ1bmN0aW9uIFZlcmlmeVN0cmVhbShvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICB2YXIgc2VjcmV0T3JLZXkgPSBvcHRzLnNlY3JldHx8b3B0cy5wdWJsaWNLZXl8fG9wdHMua2V5O1xuICB2YXIgc2VjcmV0U3RyZWFtID0gbmV3IERhdGFTdHJlYW0oc2VjcmV0T3JLZXkpO1xuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgdGhpcy5hbGdvcml0aG0gPSBvcHRzLmFsZ29yaXRobTtcbiAgdGhpcy5lbmNvZGluZyA9IG9wdHMuZW5jb2Rpbmc7XG4gIHRoaXMuc2VjcmV0ID0gdGhpcy5wdWJsaWNLZXkgPSB0aGlzLmtleSA9IHNlY3JldFN0cmVhbTtcbiAgdGhpcy5zaWduYXR1cmUgPSBuZXcgRGF0YVN0cmVhbShvcHRzLnNpZ25hdHVyZSk7XG4gIHRoaXMuc2VjcmV0Lm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5zaWduYXR1cmUud3JpdGFibGUgJiYgdGhpcy5yZWFkYWJsZSlcbiAgICAgIHRoaXMudmVyaWZ5KCk7XG4gIH0uYmluZCh0aGlzKSk7XG5cbiAgdGhpcy5zaWduYXR1cmUub25jZSgnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnNlY3JldC53cml0YWJsZSAmJiB0aGlzLnJlYWRhYmxlKVxuICAgICAgdGhpcy52ZXJpZnkoKTtcbiAgfS5iaW5kKHRoaXMpKTtcbn1cbnV0aWwuaW5oZXJpdHMoVmVyaWZ5U3RyZWFtLCBTdHJlYW0pO1xuVmVyaWZ5U3RyZWFtLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHZhbGlkID0gandzVmVyaWZ5KHRoaXMuc2lnbmF0dXJlLmJ1ZmZlciwgdGhpcy5hbGdvcml0aG0sIHRoaXMua2V5LmJ1ZmZlcik7XG4gICAgdmFyIG9iaiA9IGp3c0RlY29kZSh0aGlzLnNpZ25hdHVyZS5idWZmZXIsIHRoaXMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW1pdCgnZG9uZScsIHZhbGlkLCBvYmopO1xuICAgIHRoaXMuZW1pdCgnZGF0YScsIHZhbGlkKTtcbiAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICByZXR1cm4gdmFsaWQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGUpO1xuICAgIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgfVxufTtcblxuVmVyaWZ5U3RyZWFtLmRlY29kZSA9IGp3c0RlY29kZTtcblZlcmlmeVN0cmVhbS5pc1ZhbGlkID0gaXNWYWxpZEp3cztcblZlcmlmeVN0cmVhbS52ZXJpZnkgPSBqd3NWZXJpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVyaWZ5U3RyZWFtO1xuIiwKICAgICIvKmdsb2JhbCBleHBvcnRzKi9cbnZhciBTaWduU3RyZWFtID0gcmVxdWlyZSgnLi9saWIvc2lnbi1zdHJlYW0nKTtcbnZhciBWZXJpZnlTdHJlYW0gPSByZXF1aXJlKCcuL2xpYi92ZXJpZnktc3RyZWFtJyk7XG5cbnZhciBBTEdPUklUSE1TID0gW1xuICAnSFMyNTYnLCAnSFMzODQnLCAnSFM1MTInLFxuICAnUlMyNTYnLCAnUlMzODQnLCAnUlM1MTInLFxuICAnUFMyNTYnLCAnUFMzODQnLCAnUFM1MTInLFxuICAnRVMyNTYnLCAnRVMzODQnLCAnRVM1MTInXG5dO1xuXG5leHBvcnRzLkFMR09SSVRITVMgPSBBTEdPUklUSE1TO1xuZXhwb3J0cy5zaWduID0gU2lnblN0cmVhbS5zaWduO1xuZXhwb3J0cy52ZXJpZnkgPSBWZXJpZnlTdHJlYW0udmVyaWZ5O1xuZXhwb3J0cy5kZWNvZGUgPSBWZXJpZnlTdHJlYW0uZGVjb2RlO1xuZXhwb3J0cy5pc1ZhbGlkID0gVmVyaWZ5U3RyZWFtLmlzVmFsaWQ7XG5leHBvcnRzLmNyZWF0ZVNpZ24gPSBmdW5jdGlvbiBjcmVhdGVTaWduKG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBTaWduU3RyZWFtKG9wdHMpO1xufTtcbmV4cG9ydHMuY3JlYXRlVmVyaWZ5ID0gZnVuY3Rpb24gY3JlYXRlVmVyaWZ5KG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBWZXJpZnlTdHJlYW0ob3B0cyk7XG59O1xuIiwKICAgICJ2YXIgandzID0gcmVxdWlyZSgnandzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGp3dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGRlY29kZWQgPSBqd3MuZGVjb2RlKGp3dCwgb3B0aW9ucyk7XG4gIGlmICghZGVjb2RlZCkgeyByZXR1cm4gbnVsbDsgfVxuICB2YXIgcGF5bG9hZCA9IGRlY29kZWQucGF5bG9hZDtcblxuICAvL3RyeSBwYXJzZSB0aGUgcGF5bG9hZFxuICBpZih0eXBlb2YgcGF5bG9hZCA9PT0gJ3N0cmluZycpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UocGF5bG9hZCk7XG4gICAgICBpZihvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcGF5bG9hZCA9IG9iajtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IH1cbiAgfVxuXG4gIC8vcmV0dXJuIGhlYWRlciBpZiBgY29tcGxldGVgIG9wdGlvbiBpcyBlbmFibGVkLiAgaGVhZGVyIGluY2x1ZGVzIGNsYWltc1xuICAvL3N1Y2ggYXMgYGtpZGAgYW5kIGBhbGdgIHVzZWQgdG8gc2VsZWN0IHRoZSBrZXkgd2l0aGluIGEgSldLUyBuZWVkZWQgdG9cbiAgLy92ZXJpZnkgdGhlIHNpZ25hdHVyZVxuICBpZiAob3B0aW9ucy5jb21wbGV0ZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB7XG4gICAgICBoZWFkZXI6IGRlY29kZWQuaGVhZGVyLFxuICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgIHNpZ25hdHVyZTogZGVjb2RlZC5zaWduYXR1cmVcbiAgICB9O1xuICB9XG4gIHJldHVybiBwYXlsb2FkO1xufTtcbiIsCiAgICAidmFyIEpzb25XZWJUb2tlbkVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGVycm9yKSB7XG4gIEVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gIGlmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbiAgdGhpcy5uYW1lID0gJ0pzb25XZWJUb2tlbkVycm9yJztcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgaWYgKGVycm9yKSB0aGlzLmlubmVyID0gZXJyb3I7XG59O1xuXG5Kc29uV2ViVG9rZW5FcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5Kc29uV2ViVG9rZW5FcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBKc29uV2ViVG9rZW5FcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBKc29uV2ViVG9rZW5FcnJvcjtcbiIsCiAgICAidmFyIEpzb25XZWJUb2tlbkVycm9yID0gcmVxdWlyZSgnLi9Kc29uV2ViVG9rZW5FcnJvcicpO1xuXG52YXIgTm90QmVmb3JlRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSwgZGF0ZSkge1xuICBKc29uV2ViVG9rZW5FcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuICB0aGlzLm5hbWUgPSAnTm90QmVmb3JlRXJyb3InO1xuICB0aGlzLmRhdGUgPSBkYXRlO1xufTtcblxuTm90QmVmb3JlRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShKc29uV2ViVG9rZW5FcnJvci5wcm90b3R5cGUpO1xuXG5Ob3RCZWZvcmVFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBOb3RCZWZvcmVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBOb3RCZWZvcmVFcnJvcjsiLAogICAgInZhciBKc29uV2ViVG9rZW5FcnJvciA9IHJlcXVpcmUoJy4vSnNvbldlYlRva2VuRXJyb3InKTtcblxudmFyIFRva2VuRXhwaXJlZEVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGV4cGlyZWRBdCkge1xuICBKc29uV2ViVG9rZW5FcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuICB0aGlzLm5hbWUgPSAnVG9rZW5FeHBpcmVkRXJyb3InO1xuICB0aGlzLmV4cGlyZWRBdCA9IGV4cGlyZWRBdDtcbn07XG5cblRva2VuRXhwaXJlZEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSnNvbldlYlRva2VuRXJyb3IucHJvdG90eXBlKTtcblxuVG9rZW5FeHBpcmVkRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9rZW5FeHBpcmVkRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gVG9rZW5FeHBpcmVkRXJyb3I7IiwKICAgICIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnd2Vla3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3cnOlxuICAgICAgcmV0dXJuIG4gKiB3O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICB9XG4gIHJldHVybiBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLAogICAgInZhciBtcyA9IHJlcXVpcmUoJ21zJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRpbWUsIGlhdCkge1xuICB2YXIgdGltZXN0YW1wID0gaWF0IHx8IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG4gIGlmICh0eXBlb2YgdGltZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gbXModGltZSk7XG4gICAgaWYgKHR5cGVvZiBtaWxsaXNlY29uZHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmZsb29yKHRpbWVzdGFtcCArIG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB0aW1lID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB0aW1lc3RhbXAgKyB0aW1lO1xuICB9IGVsc2Uge1xuICAgIHJldHVybjtcbiAgfVxuXG59OyIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIE5vdGU6IHRoaXMgaXMgdGhlIHNlbXZlci5vcmcgdmVyc2lvbiBvZiB0aGUgc3BlYyB0aGF0IGl0IGltcGxlbWVudHNcbi8vIE5vdCBuZWNlc3NhcmlseSB0aGUgcGFja2FnZSB2ZXJzaW9uIG9mIHRoaXMgY29kZS5cbmNvbnN0IFNFTVZFUl9TUEVDX1ZFUlNJT04gPSAnMi4wLjAnXG5cbmNvbnN0IE1BWF9MRU5HVEggPSAyNTZcbmNvbnN0IE1BWF9TQUZFX0lOVEVHRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fFxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gOTAwNzE5OTI1NDc0MDk5MVxuXG4vLyBNYXggc2FmZSBzZWdtZW50IGxlbmd0aCBmb3IgY29lcmNpb24uXG5jb25zdCBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIID0gMTZcblxuLy8gTWF4IHNhZmUgbGVuZ3RoIGZvciBhIGJ1aWxkIGlkZW50aWZpZXIuIFRoZSBtYXggbGVuZ3RoIG1pbnVzIDYgY2hhcmFjdGVycyBmb3Jcbi8vIHRoZSBzaG9ydGVzdCB2ZXJzaW9uIHdpdGggYSBidWlsZCAwLjAuMCtCVUlMRC5cbmNvbnN0IE1BWF9TQUZFX0JVSUxEX0xFTkdUSCA9IE1BWF9MRU5HVEggLSA2XG5cbmNvbnN0IFJFTEVBU0VfVFlQRVMgPSBbXG4gICdtYWpvcicsXG4gICdwcmVtYWpvcicsXG4gICdtaW5vcicsXG4gICdwcmVtaW5vcicsXG4gICdwYXRjaCcsXG4gICdwcmVwYXRjaCcsXG4gICdwcmVyZWxlYXNlJyxcbl1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE1BWF9MRU5HVEgsXG4gIE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEgsXG4gIE1BWF9TQUZFX0JVSUxEX0xFTkdUSCxcbiAgTUFYX1NBRkVfSU5URUdFUixcbiAgUkVMRUFTRV9UWVBFUyxcbiAgU0VNVkVSX1NQRUNfVkVSU0lPTixcbiAgRkxBR19JTkNMVURFX1BSRVJFTEVBU0U6IDBiMDAxLFxuICBGTEFHX0xPT1NFOiAwYjAxMCxcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGRlYnVnID0gKFxuICB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgcHJvY2Vzcy5lbnYgJiZcbiAgcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyAmJlxuICAvXFxic2VtdmVyXFxiL2kudGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHKVxuKSA/ICguLi5hcmdzKSA9PiBjb25zb2xlLmVycm9yKCdTRU1WRVInLCAuLi5hcmdzKVxuICA6ICgpID0+IHt9XG5cbm1vZHVsZS5leHBvcnRzID0gZGVidWdcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCxcbiAgTUFYX1NBRkVfQlVJTERfTEVOR1RILFxuICBNQVhfTEVOR1RILFxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi9kZWJ1ZycpXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB7fVxuXG4vLyBUaGUgYWN0dWFsIHJlZ2V4cHMgZ28gb24gZXhwb3J0cy5yZVxuY29uc3QgcmUgPSBleHBvcnRzLnJlID0gW11cbmNvbnN0IHNhZmVSZSA9IGV4cG9ydHMuc2FmZVJlID0gW11cbmNvbnN0IHNyYyA9IGV4cG9ydHMuc3JjID0gW11cbmNvbnN0IHNhZmVTcmMgPSBleHBvcnRzLnNhZmVTcmMgPSBbXVxuY29uc3QgdCA9IGV4cG9ydHMudCA9IHt9XG5sZXQgUiA9IDBcblxuY29uc3QgTEVUVEVSREFTSE5VTUJFUiA9ICdbYS16QS1aMC05LV0nXG5cbi8vIFJlcGxhY2Ugc29tZSBncmVlZHkgcmVnZXggdG9rZW5zIHRvIHByZXZlbnQgcmVnZXggZG9zIGlzc3Vlcy4gVGhlc2UgcmVnZXggYXJlXG4vLyB1c2VkIGludGVybmFsbHkgdmlhIHRoZSBzYWZlUmUgb2JqZWN0IHNpbmNlIGFsbCBpbnB1dHMgaW4gdGhpcyBsaWJyYXJ5IGdldFxuLy8gbm9ybWFsaXplZCBmaXJzdCB0byB0cmltIGFuZCBjb2xsYXBzZSBhbGwgZXh0cmEgd2hpdGVzcGFjZS4gVGhlIG9yaWdpbmFsXG4vLyByZWdleGVzIGFyZSBleHBvcnRlZCBmb3IgdXNlcmxhbmQgY29uc3VtcHRpb24gYW5kIGxvd2VyIGxldmVsIHVzYWdlLiBBXG4vLyBmdXR1cmUgYnJlYWtpbmcgY2hhbmdlIGNvdWxkIGV4cG9ydCB0aGUgc2FmZXIgcmVnZXggb25seSB3aXRoIGEgbm90ZSB0aGF0XG4vLyBhbGwgaW5wdXQgc2hvdWxkIGhhdmUgZXh0cmEgd2hpdGVzcGFjZSByZW1vdmVkLlxuY29uc3Qgc2FmZVJlZ2V4UmVwbGFjZW1lbnRzID0gW1xuICBbJ1xcXFxzJywgMV0sXG4gIFsnXFxcXGQnLCBNQVhfTEVOR1RIXSxcbiAgW0xFVFRFUkRBU0hOVU1CRVIsIE1BWF9TQUZFX0JVSUxEX0xFTkdUSF0sXG5dXG5cbmNvbnN0IG1ha2VTYWZlUmVnZXggPSAodmFsdWUpID0+IHtcbiAgZm9yIChjb25zdCBbdG9rZW4sIG1heF0gb2Ygc2FmZVJlZ2V4UmVwbGFjZW1lbnRzKSB7XG4gICAgdmFsdWUgPSB2YWx1ZVxuICAgICAgLnNwbGl0KGAke3Rva2VufSpgKS5qb2luKGAke3Rva2VufXswLCR7bWF4fX1gKVxuICAgICAgLnNwbGl0KGAke3Rva2VufStgKS5qb2luKGAke3Rva2VufXsxLCR7bWF4fX1gKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG5jb25zdCBjcmVhdGVUb2tlbiA9IChuYW1lLCB2YWx1ZSwgaXNHbG9iYWwpID0+IHtcbiAgY29uc3Qgc2FmZSA9IG1ha2VTYWZlUmVnZXgodmFsdWUpXG4gIGNvbnN0IGluZGV4ID0gUisrXG4gIGRlYnVnKG5hbWUsIGluZGV4LCB2YWx1ZSlcbiAgdFtuYW1lXSA9IGluZGV4XG4gIHNyY1tpbmRleF0gPSB2YWx1ZVxuICBzYWZlU3JjW2luZGV4XSA9IHNhZmVcbiAgcmVbaW5kZXhdID0gbmV3IFJlZ0V4cCh2YWx1ZSwgaXNHbG9iYWwgPyAnZycgOiB1bmRlZmluZWQpXG4gIHNhZmVSZVtpbmRleF0gPSBuZXcgUmVnRXhwKHNhZmUsIGlzR2xvYmFsID8gJ2cnIDogdW5kZWZpbmVkKVxufVxuXG4vLyBUaGUgZm9sbG93aW5nIFJlZ3VsYXIgRXhwcmVzc2lvbnMgY2FuIGJlIHVzZWQgZm9yIHRva2VuaXppbmcsXG4vLyB2YWxpZGF0aW5nLCBhbmQgcGFyc2luZyBTZW1WZXIgdmVyc2lvbiBzdHJpbmdzLlxuXG4vLyAjIyBOdW1lcmljIElkZW50aWZpZXJcbi8vIEEgc2luZ2xlIGAwYCwgb3IgYSBub24temVybyBkaWdpdCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgZGlnaXRzLlxuXG5jcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVInLCAnMHxbMS05XVxcXFxkKicpXG5jcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVJMT09TRScsICdcXFxcZCsnKVxuXG4vLyAjIyBOb24tbnVtZXJpYyBJZGVudGlmaWVyXG4vLyBaZXJvIG9yIG1vcmUgZGlnaXRzLCBmb2xsb3dlZCBieSBhIGxldHRlciBvciBoeXBoZW4sIGFuZCB0aGVuIHplcm8gb3Jcbi8vIG1vcmUgbGV0dGVycywgZGlnaXRzLCBvciBoeXBoZW5zLlxuXG5jcmVhdGVUb2tlbignTk9OTlVNRVJJQ0lERU5USUZJRVInLCBgXFxcXGQqW2EtekEtWi1dJHtMRVRURVJEQVNITlVNQkVSfSpgKVxuXG4vLyAjIyBNYWluIFZlcnNpb25cbi8vIFRocmVlIGRvdC1zZXBhcmF0ZWQgbnVtZXJpYyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ01BSU5WRVJTSU9OJywgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KWApXG5cbmNyZWF0ZVRva2VuKCdNQUlOVkVSU0lPTkxPT1NFJywgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlgKVxuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uIElkZW50aWZpZXJcbi8vIEEgbnVtZXJpYyBpZGVudGlmaWVyLCBvciBhIG5vbi1udW1lcmljIGlkZW50aWZpZXIuXG4vLyBOb24tbnVtYmVyaWMgaWRlbnRpZmllcnMgaW5jbHVkZSBudW1iZXJpYyBpZGVudGlmaWVycyBidXQgY2FuIGJlIGxvbmdlci5cbi8vIFRoZXJlZm9yZSBub24tbnVtYmVyaWMgaWRlbnRpZmllcnMgbXVzdCBnbyBmaXJzdC5cblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VJREVOVElGSUVSJywgYCg/OiR7c3JjW3QuTk9OTlVNRVJJQ0lERU5USUZJRVJdXG59fCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlgKVxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRScsIGAoPzoke3NyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXVxufXwke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlgKVxuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uXG4vLyBIeXBoZW4sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGRvdC1zZXBhcmF0ZWQgcHJlLXJlbGVhc2UgdmVyc2lvblxuLy8gaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFJywgYCg/Oi0oJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUl1cbn0oPzpcXFxcLiR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJdfSkqKSlgKVxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUxPT1NFJywgYCg/Oi0/KCR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV1cbn0oPzpcXFxcLiR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV19KSopKWApXG5cbi8vICMjIEJ1aWxkIE1ldGFkYXRhIElkZW50aWZpZXJcbi8vIEFueSBjb21iaW5hdGlvbiBvZiBkaWdpdHMsIGxldHRlcnMsIG9yIGh5cGhlbnMuXG5cbmNyZWF0ZVRva2VuKCdCVUlMRElERU5USUZJRVInLCBgJHtMRVRURVJEQVNITlVNQkVSfStgKVxuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YVxuLy8gUGx1cyBzaWduLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwZXJpb2Qtc2VwYXJhdGVkIGJ1aWxkIG1ldGFkYXRhXG4vLyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ0JVSUxEJywgYCg/OlxcXFwrKCR7c3JjW3QuQlVJTERJREVOVElGSUVSXVxufSg/OlxcXFwuJHtzcmNbdC5CVUlMRElERU5USUZJRVJdfSkqKSlgKVxuXG4vLyAjIyBGdWxsIFZlcnNpb24gU3RyaW5nXG4vLyBBIG1haW4gdmVyc2lvbiwgZm9sbG93ZWQgb3B0aW9uYWxseSBieSBhIHByZS1yZWxlYXNlIHZlcnNpb24gYW5kXG4vLyBidWlsZCBtZXRhZGF0YS5cblxuLy8gTm90ZSB0aGF0IHRoZSBvbmx5IG1ham9yLCBtaW5vciwgcGF0Y2gsIGFuZCBwcmUtcmVsZWFzZSBzZWN0aW9ucyBvZlxuLy8gdGhlIHZlcnNpb24gc3RyaW5nIGFyZSBjYXB0dXJpbmcgZ3JvdXBzLiAgVGhlIGJ1aWxkIG1ldGFkYXRhIGlzIG5vdCBhXG4vLyBjYXB0dXJpbmcgZ3JvdXAsIGJlY2F1c2UgaXQgc2hvdWxkIG5vdCBldmVyIGJlIHVzZWQgaW4gdmVyc2lvblxuLy8gY29tcGFyaXNvbi5cblxuY3JlYXRlVG9rZW4oJ0ZVTExQTEFJTicsIGB2PyR7c3JjW3QuTUFJTlZFUlNJT05dXG59JHtzcmNbdC5QUkVSRUxFQVNFXX0/JHtcbiAgc3JjW3QuQlVJTERdfT9gKVxuXG5jcmVhdGVUb2tlbignRlVMTCcsIGBeJHtzcmNbdC5GVUxMUExBSU5dfSRgKVxuXG4vLyBsaWtlIGZ1bGwsIGJ1dCBhbGxvd3MgdjEuMi4zIGFuZCA9MS4yLjMsIHdoaWNoIHBlb3BsZSBkbyBzb21ldGltZXMuXG4vLyBhbHNvLCAxLjAuMGFscGhhMSAocHJlcmVsZWFzZSB3aXRob3V0IHRoZSBoeXBoZW4pIHdoaWNoIGlzIHByZXR0eVxuLy8gY29tbW9uIGluIHRoZSBucG0gcmVnaXN0cnkuXG5jcmVhdGVUb2tlbignTE9PU0VQTEFJTicsIGBbdj1cXFxcc10qJHtzcmNbdC5NQUlOVkVSU0lPTkxPT1NFXVxufSR7c3JjW3QuUFJFUkVMRUFTRUxPT1NFXX0/JHtcbiAgc3JjW3QuQlVJTERdfT9gKVxuXG5jcmVhdGVUb2tlbignTE9PU0UnLCBgXiR7c3JjW3QuTE9PU0VQTEFJTl19JGApXG5cbmNyZWF0ZVRva2VuKCdHVExUJywgJygoPzo8fD4pPz0/KScpXG5cbi8vIFNvbWV0aGluZyBsaWtlIFwiMi4qXCIgb3IgXCIxLjIueFwiLlxuLy8gTm90ZSB0aGF0IFwieC54XCIgaXMgYSB2YWxpZCB4UmFuZ2UgaWRlbnRpZmVyLCBtZWFuaW5nIFwiYW55IHZlcnNpb25cIlxuLy8gT25seSB0aGUgZmlyc3QgaXRlbSBpcyBzdHJpY3RseSByZXF1aXJlZC5cbmNyZWF0ZVRva2VuKCdYUkFOR0VJREVOVElGSUVSTE9PU0UnLCBgJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX18eHxYfFxcXFwqYClcbmNyZWF0ZVRva2VuKCdYUkFOR0VJREVOVElGSUVSJywgYCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfXx4fFh8XFxcXCpgKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFUExBSU4nLCBgW3Y9XFxcXHNdKigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VdfSk/JHtcbiAgICAgICAgICAgICAgICAgICAgIHNyY1t0LkJVSUxEXX0/YCArXG4gICAgICAgICAgICAgICAgICAgYCk/KT9gKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFUExBSU5MT09TRScsIGBbdj1cXFxcc10qKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRUxPT1NFXX0pPyR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1t0LkJVSUxEXX0/YCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKT8pP2ApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqJHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignWFJBTkdFTE9PU0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQ29lcmNpb24uXG4vLyBFeHRyYWN0IGFueXRoaW5nIHRoYXQgY291bGQgY29uY2VpdmFibHkgYmUgYSBwYXJ0IG9mIGEgdmFsaWQgc2VtdmVyXG5jcmVhdGVUb2tlbignQ09FUkNFUExBSU4nLCBgJHsnKF58W15cXFxcZF0pJyArXG4gICAgICAgICAgICAgICcoXFxcXGR7MSwnfSR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KWAgK1xuICAgICAgICAgICAgICBgKD86XFxcXC4oXFxcXGR7MSwke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSkpP2AgK1xuICAgICAgICAgICAgICBgKD86XFxcXC4oXFxcXGR7MSwke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSkpP2ApXG5jcmVhdGVUb2tlbignQ09FUkNFJywgYCR7c3JjW3QuQ09FUkNFUExBSU5dfSg/OiR8W15cXFxcZF0pYClcbmNyZWF0ZVRva2VuKCdDT0VSQ0VGVUxMJywgc3JjW3QuQ09FUkNFUExBSU5dICtcbiAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRV19KT9gICtcbiAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuQlVJTERdfSk/YCArXG4gICAgICAgICAgICAgIGAoPzokfFteXFxcXGRdKWApXG5jcmVhdGVUb2tlbignQ09FUkNFUlRMJywgc3JjW3QuQ09FUkNFXSwgdHJ1ZSlcbmNyZWF0ZVRva2VuKCdDT0VSQ0VSVExGVUxMJywgc3JjW3QuQ09FUkNFRlVMTF0sIHRydWUpXG5cbi8vIFRpbGRlIHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJyZWFzb25hYmx5IGF0IG9yIGdyZWF0ZXIgdGhhblwiXG5jcmVhdGVUb2tlbignTE9ORVRJTERFJywgJyg/On4+PyknKVxuXG5jcmVhdGVUb2tlbignVElMREVUUklNJywgYChcXFxccyopJHtzcmNbdC5MT05FVElMREVdfVxcXFxzK2AsIHRydWUpXG5leHBvcnRzLnRpbGRlVHJpbVJlcGxhY2UgPSAnJDF+J1xuXG5jcmVhdGVUb2tlbignVElMREUnLCBgXiR7c3JjW3QuTE9ORVRJTERFXX0ke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdUSUxERUxPT1NFJywgYF4ke3NyY1t0LkxPTkVUSUxERV19JHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQ2FyZXQgcmFuZ2VzLlxuLy8gTWVhbmluZyBpcyBcImF0IGxlYXN0IGFuZCBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoXCJcbmNyZWF0ZVRva2VuKCdMT05FQ0FSRVQnLCAnKD86XFxcXF4pJylcblxuY3JlYXRlVG9rZW4oJ0NBUkVUVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuTE9ORUNBUkVUXX1cXFxccytgLCB0cnVlKVxuZXhwb3J0cy5jYXJldFRyaW1SZXBsYWNlID0gJyQxXidcblxuY3JlYXRlVG9rZW4oJ0NBUkVUJywgYF4ke3NyY1t0LkxPTkVDQVJFVF19JHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignQ0FSRVRMT09TRScsIGBeJHtzcmNbdC5MT05FQ0FSRVRdfSR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIEEgc2ltcGxlIGd0L2x0L2VxIHRoaW5nLCBvciBqdXN0IFwiXCIgdG8gaW5kaWNhdGUgXCJhbnkgdmVyc2lvblwiXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUkxPT1NFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKigke3NyY1t0LkxPT1NFUExBSU5dfSkkfF4kYClcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9SJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKigke3NyY1t0LkZVTExQTEFJTl19KSR8XiRgKVxuXG4vLyBBbiBleHByZXNzaW9uIHRvIHN0cmlwIGFueSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIGd0bHQgYW5kIHRoZSB0aGluZ1xuLy8gaXQgbW9kaWZpZXMsIHNvIHRoYXQgYD4gMS4yLjNgID09PiBgPjEuMi4zYFxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1JUUklNJywgYChcXFxccyopJHtzcmNbdC5HVExUXVxufVxcXFxzKigke3NyY1t0LkxPT1NFUExBSU5dfXwke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCwgdHJ1ZSlcbmV4cG9ydHMuY29tcGFyYXRvclRyaW1SZXBsYWNlID0gJyQxJDIkMydcblxuLy8gU29tZXRoaW5nIGxpa2UgYDEuMi4zIC0gMS4yLjRgXG4vLyBOb3RlIHRoYXQgdGhlc2UgYWxsIHVzZSB0aGUgbG9vc2UgZm9ybSwgYmVjYXVzZSB0aGV5J2xsIGJlXG4vLyBjaGVja2VkIGFnYWluc3QgZWl0aGVyIHRoZSBzdHJpY3Qgb3IgbG9vc2UgY29tcGFyYXRvciBmb3JtXG4vLyBsYXRlci5cbmNyZWF0ZVRva2VuKCdIWVBIRU5SQU5HRScsIGBeXFxcXHMqKCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgICtcbiAgICAgICAgICAgICAgICAgICBgXFxcXHMrLVxcXFxzK2AgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5YUkFOR0VQTEFJTl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGBcXFxccyokYClcblxuY3JlYXRlVG9rZW4oJ0hZUEhFTlJBTkdFTE9PU0UnLCBgXlxcXFxzKigke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBcXFxccystXFxcXHMrYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYFxcXFxzKiRgKVxuXG4vLyBTdGFyIHJhbmdlcyBiYXNpY2FsbHkganVzdCBhbGxvdyBhbnl0aGluZyBhdCBhbGwuXG5jcmVhdGVUb2tlbignU1RBUicsICcoPHw+KT89P1xcXFxzKlxcXFwqJylcbi8vID49MC4wLjAgaXMgbGlrZSBhIHN0YXJcbmNyZWF0ZVRva2VuKCdHVEUwJywgJ15cXFxccyo+PVxcXFxzKjBcXFxcLjBcXFxcLjBcXFxccyokJylcbmNyZWF0ZVRva2VuKCdHVEUwUFJFJywgJ15cXFxccyo+PVxcXFxzKjBcXFxcLjBcXFxcLjAtMFxcXFxzKiQnKVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuLy8gcGFyc2Ugb3V0IGp1c3QgdGhlIG9wdGlvbnMgd2UgY2FyZSBhYm91dFxuY29uc3QgbG9vc2VPcHRpb24gPSBPYmplY3QuZnJlZXplKHsgbG9vc2U6IHRydWUgfSlcbmNvbnN0IGVtcHR5T3B0cyA9IE9iamVjdC5mcmVlemUoeyB9KVxuY29uc3QgcGFyc2VPcHRpb25zID0gb3B0aW9ucyA9PiB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIHJldHVybiBlbXB0eU9wdHNcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbG9vc2VPcHRpb25cbiAgfVxuXG4gIHJldHVybiBvcHRpb25zXG59XG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlT3B0aW9uc1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgbnVtZXJpYyA9IC9eWzAtOV0rJC9cbmNvbnN0IGNvbXBhcmVJZGVudGlmaWVycyA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IGFudW0gPSBudW1lcmljLnRlc3QoYSlcbiAgY29uc3QgYm51bSA9IG51bWVyaWMudGVzdChiKVxuXG4gIGlmIChhbnVtICYmIGJudW0pIHtcbiAgICBhID0gK2FcbiAgICBiID0gK2JcbiAgfVxuXG4gIHJldHVybiBhID09PSBiID8gMFxuICAgIDogKGFudW0gJiYgIWJudW0pID8gLTFcbiAgICA6IChibnVtICYmICFhbnVtKSA/IDFcbiAgICA6IGEgPCBiID8gLTFcbiAgICA6IDFcbn1cblxuY29uc3QgcmNvbXBhcmVJZGVudGlmaWVycyA9IChhLCBiKSA9PiBjb21wYXJlSWRlbnRpZmllcnMoYiwgYSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbXBhcmVJZGVudGlmaWVycyxcbiAgcmNvbXBhcmVJZGVudGlmaWVycyxcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvZGVidWcnKVxuY29uc3QgeyBNQVhfTEVOR1RILCBNQVhfU0FGRV9JTlRFR0VSIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9jb25zdGFudHMnKVxuY29uc3QgeyBzYWZlUmU6IHJlLCB0IH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgeyBjb21wYXJlSWRlbnRpZmllcnMgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lkZW50aWZpZXJzJylcbmNsYXNzIFNlbVZlciB7XG4gIGNvbnN0cnVjdG9yICh2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICAgIGlmICh2ZXJzaW9uLmxvb3NlID09PSAhIW9wdGlvbnMubG9vc2UgJiZcbiAgICAgICAgdmVyc2lvbi5pbmNsdWRlUHJlcmVsZWFzZSA9PT0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi52ZXJzaW9uXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgdmVyc2lvbi4gTXVzdCBiZSBhIHN0cmluZy4gR290IHR5cGUgXCIke3R5cGVvZiB2ZXJzaW9ufVwiLmApXG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24ubGVuZ3RoID4gTUFYX0xFTkdUSCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYHZlcnNpb24gaXMgbG9uZ2VyIHRoYW4gJHtNQVhfTEVOR1RIfSBjaGFyYWN0ZXJzYFxuICAgICAgKVxuICAgIH1cblxuICAgIGRlYnVnKCdTZW1WZXInLCB2ZXJzaW9uLCBvcHRpb25zKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgLy8gdGhpcyBpc24ndCBhY3R1YWxseSByZWxldmFudCBmb3IgdmVyc2lvbnMsIGJ1dCBrZWVwIGl0IHNvIHRoYXQgd2VcbiAgICAvLyBkb24ndCBydW4gaW50byB0cm91YmxlIHBhc3NpbmcgdGhpcy5vcHRpb25zIGFyb3VuZC5cbiAgICB0aGlzLmluY2x1ZGVQcmVyZWxlYXNlID0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG5cbiAgICBjb25zdCBtID0gdmVyc2lvbi50cmltKCkubWF0Y2gob3B0aW9ucy5sb29zZSA/IHJlW3QuTE9PU0VdIDogcmVbdC5GVUxMXSlcblxuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBWZXJzaW9uOiAke3ZlcnNpb259YClcbiAgICB9XG5cbiAgICB0aGlzLnJhdyA9IHZlcnNpb25cblxuICAgIC8vIHRoZXNlIGFyZSBhY3R1YWxseSBudW1iZXJzXG4gICAgdGhpcy5tYWpvciA9ICttWzFdXG4gICAgdGhpcy5taW5vciA9ICttWzJdXG4gICAgdGhpcy5wYXRjaCA9ICttWzNdXG5cbiAgICBpZiAodGhpcy5tYWpvciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5tYWpvciA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWFqb3IgdmVyc2lvbicpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWlub3IgPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMubWlub3IgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1pbm9yIHZlcnNpb24nKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBhdGNoID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLnBhdGNoIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBwYXRjaCB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICAvLyBudW1iZXJpZnkgYW55IHByZXJlbGVhc2UgbnVtZXJpYyBpZHNcbiAgICBpZiAoIW1bNF0pIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IG1bNF0uc3BsaXQoJy4nKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgIGlmICgvXlswLTldKyQvLnRlc3QoaWQpKSB7XG4gICAgICAgICAgY29uc3QgbnVtID0gK2lkXG4gICAgICAgICAgaWYgKG51bSA+PSAwICYmIG51bSA8IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuYnVpbGQgPSBtWzVdID8gbVs1XS5zcGxpdCgnLicpIDogW11cbiAgICB0aGlzLmZvcm1hdCgpXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHRoaXMudmVyc2lvbiA9IGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLnBhdGNofWBcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgdGhpcy52ZXJzaW9uICs9IGAtJHt0aGlzLnByZXJlbGVhc2Uuam9pbignLicpfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvblxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnZlcnNpb25cbiAgfVxuXG4gIGNvbXBhcmUgKG90aGVyKSB7XG4gICAgZGVidWcoJ1NlbVZlci5jb21wYXJlJywgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMsIG90aGVyKVxuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gJ3N0cmluZycgJiYgb3RoZXIgPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgaWYgKG90aGVyLnZlcnNpb24gPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21wYXJlTWFpbihvdGhlcikgfHwgdGhpcy5jb21wYXJlUHJlKG90aGVyKVxuICB9XG5cbiAgY29tcGFyZU1haW4gKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWFqb3IsIG90aGVyLm1ham9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWlub3IsIG90aGVyLm1pbm9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucGF0Y2gsIG90aGVyLnBhdGNoKVxuICAgIClcbiAgfVxuXG4gIGNvbXBhcmVQcmUgKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICAvLyBOT1QgaGF2aW5nIGEgcHJlcmVsZWFzZSBpcyA+IGhhdmluZyBvbmVcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH0gZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAxXG4gICAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgbGV0IGkgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYSA9IHRoaXMucHJlcmVsZWFzZVtpXVxuICAgICAgY29uc3QgYiA9IG90aGVyLnByZXJlbGVhc2VbaV1cbiAgICAgIGRlYnVnKCdwcmVyZWxlYXNlIGNvbXBhcmUnLCBpLCBhLCBiKVxuICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCsraSlcbiAgfVxuXG4gIGNvbXBhcmVCdWlsZCAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIGxldCBpID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmJ1aWxkW2ldXG4gICAgICBjb25zdCBiID0gb3RoZXIuYnVpbGRbaV1cbiAgICAgIGRlYnVnKCdidWlsZCBjb21wYXJlJywgaSwgYSwgYilcbiAgICAgIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9IGVsc2UgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfSBlbHNlIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlSWRlbnRpZmllcnMoYSwgYilcbiAgICAgIH1cbiAgICB9IHdoaWxlICgrK2kpXG4gIH1cblxuICAvLyBwcmVtaW5vciB3aWxsIGJ1bXAgdGhlIHZlcnNpb24gdXAgdG8gdGhlIG5leHQgbWlub3IgcmVsZWFzZSwgYW5kIGltbWVkaWF0ZWx5XG4gIC8vIGRvd24gdG8gcHJlLXJlbGVhc2UuIHByZW1ham9yIGFuZCBwcmVwYXRjaCB3b3JrIHRoZSBzYW1lIHdheS5cbiAgaW5jIChyZWxlYXNlLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkge1xuICAgIGlmIChyZWxlYXNlLnN0YXJ0c1dpdGgoJ3ByZScpKSB7XG4gICAgICBpZiAoIWlkZW50aWZpZXIgJiYgaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6IGlkZW50aWZpZXIgaXMgZW1wdHknKVxuICAgICAgfVxuICAgICAgLy8gQXZvaWQgYW4gaW52YWxpZCBzZW12ZXIgcmVzdWx0c1xuICAgICAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBgLSR7aWRlbnRpZmllcn1gLm1hdGNoKHRoaXMub3B0aW9ucy5sb29zZSA/IHJlW3QuUFJFUkVMRUFTRUxPT1NFXSA6IHJlW3QuUFJFUkVMRUFTRV0pXG4gICAgICAgIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gIT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaWRlbnRpZmllcjogJHtpZGVudGlmaWVyfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJlbGVhc2UpIHtcbiAgICAgIGNhc2UgJ3ByZW1ham9yJzpcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5taW5vciA9IDBcbiAgICAgICAgdGhpcy5tYWpvcisrXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3ByZW1pbm9yJzpcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5taW5vcisrXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3ByZXBhdGNoJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbHJlYWR5IGEgcHJlcmVsZWFzZSwgaXQgd2lsbCBidW1wIHRvIHRoZSBuZXh0IHZlcnNpb25cbiAgICAgICAgLy8gZHJvcCBhbnkgcHJlcmVsZWFzZXMgdGhhdCBtaWdodCBhbHJlYWR5IGV4aXN0LCBzaW5jZSB0aGV5IGFyZSBub3RcbiAgICAgICAgLy8gcmVsZXZhbnQgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhIG5vbi1wcmVyZWxlYXNlIHZlcnNpb24sIHRoaXMgYWN0cyB0aGUgc2FtZSBhc1xuICAgICAgLy8gcHJlcGF0Y2guXG4gICAgICBjYXNlICdwcmVyZWxlYXNlJzpcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdyZWxlYXNlJzpcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHZlcnNpb24gJHt0aGlzLnJhd30gaXMgbm90IGEgcHJlcmVsZWFzZWApXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnbWFqb3InOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1ham9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWFqb3IgdmVyc2lvbi5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtYWpvci5cbiAgICAgICAgLy8gMS4wLjAtNSBidW1wcyB0byAxLjAuMFxuICAgICAgICAvLyAxLjEuMCBidW1wcyB0byAyLjAuMFxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5taW5vciAhPT0gMCB8fFxuICAgICAgICAgIHRoaXMucGF0Y2ggIT09IDAgfHxcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMubWFqb3IrK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWlub3IgPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdtaW5vcic6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWlub3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtaW5vciB2ZXJzaW9uLlxuICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1pbm9yLlxuICAgICAgICAvLyAxLjIuMC01IGJ1bXBzIHRvIDEuMi4wXG4gICAgICAgIC8vIDEuMi4xIGJ1bXBzIHRvIDEuMy4wXG4gICAgICAgIGlmICh0aGlzLnBhdGNoICE9PSAwIHx8IHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLm1pbm9yKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncGF0Y2gnOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHByZS1yZWxlYXNlIHZlcnNpb24sIGl0IHdpbGwgaW5jcmVtZW50IHRoZSBwYXRjaC5cbiAgICAgICAgLy8gSWYgaXQgaXMgYSBwcmUtcmVsZWFzZSBpdCB3aWxsIGJ1bXAgdXAgdG8gdGhlIHNhbWUgcGF0Y2ggdmVyc2lvbi5cbiAgICAgICAgLy8gMS4yLjAtNSBwYXRjaGVzIHRvIDEuMi4wXG4gICAgICAgIC8vIDEuMi4wIHBhdGNoZXMgdG8gMS4yLjFcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnBhdGNoKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgLy8gVGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgYmUgdXNlZCBwdWJsaWNseS5cbiAgICAgIC8vIDEuMC4wICdwcmUnIHdvdWxkIGJlY29tZSAxLjAuMC0wIHdoaWNoIGlzIHRoZSB3cm9uZyBkaXJlY3Rpb24uXG4gICAgICBjYXNlICdwcmUnOiB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBOdW1iZXIoaWRlbnRpZmllckJhc2UpID8gMSA6IDBcblxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtiYXNlXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBpID0gdGhpcy5wcmVyZWxlYXNlLmxlbmd0aFxuICAgICAgICAgIHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZXJlbGVhc2VbaV0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZVtpXSsrXG4gICAgICAgICAgICAgIGkgPSAtMlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGRpZG4ndCBpbmNyZW1lbnQgYW55dGhpbmdcbiAgICAgICAgICAgIGlmIChpZGVudGlmaWVyID09PSB0aGlzLnByZXJlbGVhc2Uuam9pbignLicpICYmIGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiBpZGVudGlmaWVyIGFscmVhZHkgZXhpc3RzJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5wdXNoKGJhc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpZGVudGlmaWVyKSB7XG4gICAgICAgICAgLy8gMS4yLjAtYmV0YS4xIGJ1bXBzIHRvIDEuMi4wLWJldGEuMixcbiAgICAgICAgICAvLyAxLjIuMC1iZXRhLmZvb2JseiBvciAxLjIuMC1iZXRhIGJ1bXBzIHRvIDEuMi4wLWJldGEuMFxuICAgICAgICAgIGxldCBwcmVyZWxlYXNlID0gW2lkZW50aWZpZXIsIGJhc2VdXG4gICAgICAgICAgaWYgKGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcHJlcmVsZWFzZSA9IFtpZGVudGlmaWVyXVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucHJlcmVsZWFzZVswXSwgaWRlbnRpZmllcikgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChpc05hTih0aGlzLnByZXJlbGVhc2VbMV0pKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IHByZXJlbGVhc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gcHJlcmVsZWFzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogJHtyZWxlYXNlfWApXG4gICAgfVxuICAgIHRoaXMucmF3ID0gdGhpcy5mb3JtYXQoKVxuICAgIGlmICh0aGlzLmJ1aWxkLmxlbmd0aCkge1xuICAgICAgdGhpcy5yYXcgKz0gYCske3RoaXMuYnVpbGQuam9pbignLicpfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNlbVZlclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGFyc2UgPSAodmVyc2lvbiwgb3B0aW9ucywgdGhyb3dFcnJvcnMgPSBmYWxzZSkgPT4ge1xuICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgIHJldHVybiB2ZXJzaW9uXG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcih2ZXJzaW9uLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIGlmICghdGhyb3dFcnJvcnMpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHRocm93IGVyXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHZhbGlkID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgdiA9IHBhcnNlKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJldHVybiB2ID8gdi52ZXJzaW9uIDogbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSB2YWxpZFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IGNsZWFuID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgcyA9IHBhcnNlKHZlcnNpb24udHJpbSgpLnJlcGxhY2UoL15bPXZdKy8sICcnKSwgb3B0aW9ucylcbiAgcmV0dXJuIHMgPyBzLnZlcnNpb24gOiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IGNsZWFuXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5cbmNvbnN0IGluYyA9ICh2ZXJzaW9uLCByZWxlYXNlLCBvcHRpb25zLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkgPT4ge1xuICBpZiAodHlwZW9mIChvcHRpb25zKSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZGVudGlmaWVyQmFzZSA9IGlkZW50aWZpZXJcbiAgICBpZGVudGlmaWVyID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSB1bmRlZmluZWRcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBTZW1WZXIoXG4gICAgICB2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyID8gdmVyc2lvbi52ZXJzaW9uIDogdmVyc2lvbixcbiAgICAgIG9wdGlvbnNcbiAgICApLmluYyhyZWxlYXNlLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkudmVyc2lvblxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gaW5jXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UuanMnKVxuXG5jb25zdCBkaWZmID0gKHZlcnNpb24xLCB2ZXJzaW9uMikgPT4ge1xuICBjb25zdCB2MSA9IHBhcnNlKHZlcnNpb24xLCBudWxsLCB0cnVlKVxuICBjb25zdCB2MiA9IHBhcnNlKHZlcnNpb24yLCBudWxsLCB0cnVlKVxuICBjb25zdCBjb21wYXJpc29uID0gdjEuY29tcGFyZSh2MilcblxuICBpZiAoY29tcGFyaXNvbiA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCB2MUhpZ2hlciA9IGNvbXBhcmlzb24gPiAwXG4gIGNvbnN0IGhpZ2hWZXJzaW9uID0gdjFIaWdoZXIgPyB2MSA6IHYyXG4gIGNvbnN0IGxvd1ZlcnNpb24gPSB2MUhpZ2hlciA/IHYyIDogdjFcbiAgY29uc3QgaGlnaEhhc1ByZSA9ICEhaGlnaFZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGhcbiAgY29uc3QgbG93SGFzUHJlID0gISFsb3dWZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoXG5cbiAgaWYgKGxvd0hhc1ByZSAmJiAhaGlnaEhhc1ByZSkge1xuICAgIC8vIEdvaW5nIGZyb20gcHJlcmVsZWFzZSAtPiBubyBwcmVyZWxlYXNlIHJlcXVpcmVzIHNvbWUgc3BlY2lhbCBjYXNpbmdcblxuICAgIC8vIElmIHRoZSBsb3cgdmVyc2lvbiBoYXMgb25seSBhIG1ham9yLCB0aGVuIGl0IHdpbGwgYWx3YXlzIGJlIGEgbWFqb3JcbiAgICAvLyBTb21lIGV4YW1wbGVzOlxuICAgIC8vIDEuMC4wLTEgLT4gMS4wLjBcbiAgICAvLyAxLjAuMC0xIC0+IDEuMS4xXG4gICAgLy8gMS4wLjAtMSAtPiAyLjAuMFxuICAgIGlmICghbG93VmVyc2lvbi5wYXRjaCAmJiAhbG93VmVyc2lvbi5taW5vcikge1xuICAgICAgcmV0dXJuICdtYWpvcidcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbWFpbiBwYXJ0IGhhcyBubyBkaWZmZXJlbmNlXG4gICAgaWYgKGxvd1ZlcnNpb24uY29tcGFyZU1haW4oaGlnaFZlcnNpb24pID09PSAwKSB7XG4gICAgICBpZiAobG93VmVyc2lvbi5taW5vciAmJiAhbG93VmVyc2lvbi5wYXRjaCkge1xuICAgICAgICByZXR1cm4gJ21pbm9yJ1xuICAgICAgfVxuICAgICAgcmV0dXJuICdwYXRjaCdcbiAgICB9XG4gIH1cblxuICAvLyBhZGQgdGhlIGBwcmVgIHByZWZpeCBpZiB3ZSBhcmUgZ29pbmcgdG8gYSBwcmVyZWxlYXNlIHZlcnNpb25cbiAgY29uc3QgcHJlZml4ID0gaGlnaEhhc1ByZSA/ICdwcmUnIDogJydcblxuICBpZiAodjEubWFqb3IgIT09IHYyLm1ham9yKSB7XG4gICAgcmV0dXJuIHByZWZpeCArICdtYWpvcidcbiAgfVxuXG4gIGlmICh2MS5taW5vciAhPT0gdjIubWlub3IpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgJ21pbm9yJ1xuICB9XG5cbiAgaWYgKHYxLnBhdGNoICE9PSB2Mi5wYXRjaCkge1xuICAgIHJldHVybiBwcmVmaXggKyAncGF0Y2gnXG4gIH1cblxuICAvLyBoaWdoIGFuZCBsb3cgYXJlIHByZWxlYXNlc1xuICByZXR1cm4gJ3ByZXJlbGVhc2UnXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGlmZlxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgbWFqb3IgPSAoYSwgbG9vc2UpID0+IG5ldyBTZW1WZXIoYSwgbG9vc2UpLm1ham9yXG5tb2R1bGUuZXhwb3J0cyA9IG1ham9yXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBtaW5vciA9IChhLCBsb29zZSkgPT4gbmV3IFNlbVZlcihhLCBsb29zZSkubWlub3Jcbm1vZHVsZS5leHBvcnRzID0gbWlub3JcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhdGNoID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5wYXRjaFxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHByZXJlbGVhc2UgPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZSh2ZXJzaW9uLCBvcHRpb25zKVxuICByZXR1cm4gKHBhcnNlZCAmJiBwYXJzZWQucHJlcmVsZWFzZS5sZW5ndGgpID8gcGFyc2VkLnByZXJlbGVhc2UgOiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IHByZXJlbGVhc2VcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGNvbXBhcmUgPSAoYSwgYiwgbG9vc2UpID0+XG4gIG5ldyBTZW1WZXIoYSwgbG9vc2UpLmNvbXBhcmUobmV3IFNlbVZlcihiLCBsb29zZSkpXG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCByY29tcGFyZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShiLCBhLCBsb29zZSlcbm1vZHVsZS5leHBvcnRzID0gcmNvbXBhcmVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgY29tcGFyZUxvb3NlID0gKGEsIGIpID0+IGNvbXBhcmUoYSwgYiwgdHJ1ZSlcbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUxvb3NlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBjb21wYXJlQnVpbGQgPSAoYSwgYiwgbG9vc2UpID0+IHtcbiAgY29uc3QgdmVyc2lvbkEgPSBuZXcgU2VtVmVyKGEsIGxvb3NlKVxuICBjb25zdCB2ZXJzaW9uQiA9IG5ldyBTZW1WZXIoYiwgbG9vc2UpXG4gIHJldHVybiB2ZXJzaW9uQS5jb21wYXJlKHZlcnNpb25CKSB8fCB2ZXJzaW9uQS5jb21wYXJlQnVpbGQodmVyc2lvbkIpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVCdWlsZFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9jb21wYXJlLWJ1aWxkJylcbmNvbnN0IHNvcnQgPSAobGlzdCwgbG9vc2UpID0+IGxpc3Quc29ydCgoYSwgYikgPT4gY29tcGFyZUJ1aWxkKGEsIGIsIGxvb3NlKSlcbm1vZHVsZS5leHBvcnRzID0gc29ydFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9jb21wYXJlLWJ1aWxkJylcbmNvbnN0IHJzb3J0ID0gKGxpc3QsIGxvb3NlKSA9PiBsaXN0LnNvcnQoKGEsIGIpID0+IGNvbXBhcmVCdWlsZChiLCBhLCBsb29zZSkpXG5tb2R1bGUuZXhwb3J0cyA9IHJzb3J0XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGd0ID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA+IDBcbm1vZHVsZS5leHBvcnRzID0gZ3RcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbHQgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpIDwgMFxubW9kdWxlLmV4cG9ydHMgPSBsdFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBlcSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPT09IDBcbm1vZHVsZS5leHBvcnRzID0gZXFcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbmVxID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSAhPT0gMFxubW9kdWxlLmV4cG9ydHMgPSBuZXFcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgZ3RlID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA+PSAwXG5tb2R1bGUuZXhwb3J0cyA9IGd0ZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBsdGUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpIDw9IDBcbm1vZHVsZS5leHBvcnRzID0gbHRlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBlcSA9IHJlcXVpcmUoJy4vZXEnKVxuY29uc3QgbmVxID0gcmVxdWlyZSgnLi9uZXEnKVxuY29uc3QgZ3QgPSByZXF1aXJlKCcuL2d0JylcbmNvbnN0IGd0ZSA9IHJlcXVpcmUoJy4vZ3RlJylcbmNvbnN0IGx0ID0gcmVxdWlyZSgnLi9sdCcpXG5jb25zdCBsdGUgPSByZXF1aXJlKCcuL2x0ZScpXG5cbmNvbnN0IGNtcCA9IChhLCBvcCwgYiwgbG9vc2UpID0+IHtcbiAgc3dpdGNoIChvcCkge1xuICAgIGNhc2UgJz09PSc6XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGEgPSBhLnZlcnNpb25cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYiA9IGIudmVyc2lvblxuICAgICAgfVxuICAgICAgcmV0dXJuIGEgPT09IGJcblxuICAgIGNhc2UgJyE9PSc6XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGEgPSBhLnZlcnNpb25cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYiA9IGIudmVyc2lvblxuICAgICAgfVxuICAgICAgcmV0dXJuIGEgIT09IGJcblxuICAgIGNhc2UgJyc6XG4gICAgY2FzZSAnPSc6XG4gICAgY2FzZSAnPT0nOlxuICAgICAgcmV0dXJuIGVxKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnIT0nOlxuICAgICAgcmV0dXJuIG5lcShhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJz4nOlxuICAgICAgcmV0dXJuIGd0KGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPj0nOlxuICAgICAgcmV0dXJuIGd0ZShhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJzwnOlxuICAgICAgcmV0dXJuIGx0KGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPD0nOlxuICAgICAgcmV0dXJuIGx0ZShhLCBiLCBsb29zZSlcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIG9wZXJhdG9yOiAke29wfWApXG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gY21wXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgeyBzYWZlUmU6IHJlLCB0IH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5cbmNvbnN0IGNvZXJjZSA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgcmV0dXJuIHZlcnNpb25cbiAgfVxuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ251bWJlcicpIHtcbiAgICB2ZXJzaW9uID0gU3RyaW5nKHZlcnNpb24pXG4gIH1cblxuICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgbGV0IG1hdGNoID0gbnVsbFxuICBpZiAoIW9wdGlvbnMucnRsKSB7XG4gICAgbWF0Y2ggPSB2ZXJzaW9uLm1hdGNoKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyByZVt0LkNPRVJDRUZVTExdIDogcmVbdC5DT0VSQ0VdKVxuICB9IGVsc2Uge1xuICAgIC8vIEZpbmQgdGhlIHJpZ2h0LW1vc3QgY29lcmNpYmxlIHN0cmluZyB0aGF0IGRvZXMgbm90IHNoYXJlXG4gICAgLy8gYSB0ZXJtaW51cyB3aXRoIGEgbW9yZSBsZWZ0LXdhcmQgY29lcmNpYmxlIHN0cmluZy5cbiAgICAvLyBFZywgJzEuMi4zLjQnIHdhbnRzIHRvIGNvZXJjZSAnMi4zLjQnLCBub3QgJzMuNCcgb3IgJzQnXG4gICAgLy8gV2l0aCBpbmNsdWRlUHJlcmVsZWFzZSBvcHRpb24gc2V0LCAnMS4yLjMuNC1yYycgd2FudHMgdG8gY29lcmNlICcyLjMuNC1yYycsIG5vdCAnMi4zLjQnXG4gICAgLy9cbiAgICAvLyBXYWxrIHRocm91Z2ggdGhlIHN0cmluZyBjaGVja2luZyB3aXRoIGEgL2cgcmVnZXhwXG4gICAgLy8gTWFudWFsbHkgc2V0IHRoZSBpbmRleCBzbyBhcyB0byBwaWNrIHVwIG92ZXJsYXBwaW5nIG1hdGNoZXMuXG4gICAgLy8gU3RvcCB3aGVuIHdlIGdldCBhIG1hdGNoIHRoYXQgZW5kcyBhdCB0aGUgc3RyaW5nIGVuZCwgc2luY2Ugbm9cbiAgICAvLyBjb2VyY2libGUgc3RyaW5nIGNhbiBiZSBtb3JlIHJpZ2h0LXdhcmQgd2l0aG91dCB0aGUgc2FtZSB0ZXJtaW51cy5cbiAgICBjb25zdCBjb2VyY2VSdGxSZWdleCA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyByZVt0LkNPRVJDRVJUTEZVTExdIDogcmVbdC5DT0VSQ0VSVExdXG4gICAgbGV0IG5leHRcbiAgICB3aGlsZSAoKG5leHQgPSBjb2VyY2VSdGxSZWdleC5leGVjKHZlcnNpb24pKSAmJlxuICAgICAgICAoIW1hdGNoIHx8IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoICE9PSB2ZXJzaW9uLmxlbmd0aClcbiAgICApIHtcbiAgICAgIGlmICghbWF0Y2ggfHxcbiAgICAgICAgICAgIG5leHQuaW5kZXggKyBuZXh0WzBdLmxlbmd0aCAhPT0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpIHtcbiAgICAgICAgbWF0Y2ggPSBuZXh0XG4gICAgICB9XG4gICAgICBjb2VyY2VSdGxSZWdleC5sYXN0SW5kZXggPSBuZXh0LmluZGV4ICsgbmV4dFsxXS5sZW5ndGggKyBuZXh0WzJdLmxlbmd0aFxuICAgIH1cbiAgICAvLyBsZWF2ZSBpdCBpbiBhIGNsZWFuIHN0YXRlXG4gICAgY29lcmNlUnRsUmVnZXgubGFzdEluZGV4ID0gLTFcbiAgfVxuXG4gIGlmIChtYXRjaCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBtYWpvciA9IG1hdGNoWzJdXG4gIGNvbnN0IG1pbm9yID0gbWF0Y2hbM10gfHwgJzAnXG4gIGNvbnN0IHBhdGNoID0gbWF0Y2hbNF0gfHwgJzAnXG4gIGNvbnN0IHByZXJlbGVhc2UgPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmIG1hdGNoWzVdID8gYC0ke21hdGNoWzVdfWAgOiAnJ1xuICBjb25zdCBidWlsZCA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgbWF0Y2hbNl0gPyBgKyR7bWF0Y2hbNl19YCA6ICcnXG5cbiAgcmV0dXJuIHBhcnNlKGAke21ham9yfS4ke21pbm9yfS4ke3BhdGNofSR7cHJlcmVsZWFzZX0ke2J1aWxkfWAsIG9wdGlvbnMpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGNvZXJjZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY2xhc3MgTFJVQ2FjaGUge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5tYXggPSAxMDAwXG4gICAgdGhpcy5tYXAgPSBuZXcgTWFwKClcbiAgfVxuXG4gIGdldCAoa2V5KSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1hcC5nZXQoa2V5KVxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUga2V5IGZyb20gdGhlIG1hcCBhbmQgYWRkIGl0IHRvIHRoZSBlbmRcbiAgICAgIHRoaXMubWFwLmRlbGV0ZShrZXkpXG4gICAgICB0aGlzLm1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZSAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmRlbGV0ZShrZXkpXG4gIH1cblxuICBzZXQgKGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy5kZWxldGUoa2V5KVxuXG4gICAgaWYgKCFkZWxldGVkICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIElmIGNhY2hlIGlzIGZ1bGwsIGRlbGV0ZSB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtXG4gICAgICBpZiAodGhpcy5tYXAuc2l6ZSA+PSB0aGlzLm1heCkge1xuICAgICAgICBjb25zdCBmaXJzdEtleSA9IHRoaXMubWFwLmtleXMoKS5uZXh0KCkudmFsdWVcbiAgICAgICAgdGhpcy5kZWxldGUoZmlyc3RLZXkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFwLnNldChrZXksIHZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMUlVDYWNoZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU1BBQ0VfQ0hBUkFDVEVSUyA9IC9cXHMrL2dcblxuLy8gaG9pc3RlZCBjbGFzcyBmb3IgY3ljbGljIGRlcGVuZGVuY3lcbmNsYXNzIFJhbmdlIHtcbiAgY29uc3RydWN0b3IgKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcmFuZ2UubG9vc2UgPT09ICEhb3B0aW9ucy5sb29zZSAmJlxuICAgICAgICByYW5nZS5pbmNsdWRlUHJlcmVsZWFzZSA9PT0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLnJhdywgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgICAvLyBqdXN0IHB1dCBpdCBpbiB0aGUgc2V0IGFuZCByZXR1cm5cbiAgICAgIHRoaXMucmF3ID0gcmFuZ2UudmFsdWVcbiAgICAgIHRoaXMuc2V0ID0gW1tyYW5nZV1dXG4gICAgICB0aGlzLmZvcm1hdHRlZCA9IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIHRoaXMuaW5jbHVkZVByZXJlbGVhc2UgPSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcblxuICAgIC8vIEZpcnN0IHJlZHVjZSBhbGwgd2hpdGVzcGFjZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHNvIHdlIGRvIG5vdCBoYXZlIHRvIHJlbHlcbiAgICAvLyBvbiBwb3RlbnRpYWxseSBzbG93IHJlZ2V4ZXMgbGlrZSBcXHMqLiBUaGlzIGlzIHRoZW4gc3RvcmVkIGFuZCB1c2VkIGZvclxuICAgIC8vIGZ1dHVyZSBlcnJvciBtZXNzYWdlcyBhcyB3ZWxsLlxuICAgIHRoaXMucmF3ID0gcmFuZ2UudHJpbSgpLnJlcGxhY2UoU1BBQ0VfQ0hBUkFDVEVSUywgJyAnKVxuXG4gICAgLy8gRmlyc3QsIHNwbGl0IG9uIHx8XG4gICAgdGhpcy5zZXQgPSB0aGlzLnJhd1xuICAgICAgLnNwbGl0KCd8fCcpXG4gICAgICAvLyBtYXAgdGhlIHJhbmdlIHRvIGEgMmQgYXJyYXkgb2YgY29tcGFyYXRvcnNcbiAgICAgIC5tYXAociA9PiB0aGlzLnBhcnNlUmFuZ2Uoci50cmltKCkpKVxuICAgICAgLy8gdGhyb3cgb3V0IGFueSBjb21wYXJhdG9yIGxpc3RzIHRoYXQgYXJlIGVtcHR5XG4gICAgICAvLyB0aGlzIGdlbmVyYWxseSBtZWFucyB0aGF0IGl0IHdhcyBub3QgYSB2YWxpZCByYW5nZSwgd2hpY2ggaXMgYWxsb3dlZFxuICAgICAgLy8gaW4gbG9vc2UgbW9kZSwgYnV0IHdpbGwgc3RpbGwgdGhyb3cgaWYgdGhlIFdIT0xFIHJhbmdlIGlzIGludmFsaWQuXG4gICAgICAuZmlsdGVyKGMgPT4gYy5sZW5ndGgpXG5cbiAgICBpZiAoIXRoaXMuc2V0Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBTZW1WZXIgUmFuZ2U6ICR7dGhpcy5yYXd9YClcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBoYXZlIGFueSB0aGF0IGFyZSBub3QgdGhlIG51bGwgc2V0LCB0aHJvdyBvdXQgbnVsbCBzZXRzLlxuICAgIGlmICh0aGlzLnNldC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBrZWVwIHRoZSBmaXJzdCBvbmUsIGluIGNhc2UgdGhleSdyZSBhbGwgbnVsbCBzZXRzXG4gICAgICBjb25zdCBmaXJzdCA9IHRoaXMuc2V0WzBdXG4gICAgICB0aGlzLnNldCA9IHRoaXMuc2V0LmZpbHRlcihjID0+ICFpc051bGxTZXQoY1swXSkpXG4gICAgICBpZiAodGhpcy5zZXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2V0ID0gW2ZpcnN0XVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNldC5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IHRoYXQgYXJlICosIHRoZW4gdGhlIHJhbmdlIGlzIGp1c3QgKlxuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5zZXQpIHtcbiAgICAgICAgICBpZiAoYy5sZW5ndGggPT09IDEgJiYgaXNBbnkoY1swXSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0ID0gW2NdXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZm9ybWF0dGVkID0gdW5kZWZpbmVkXG4gIH1cblxuICBnZXQgcmFuZ2UgKCkge1xuICAgIGlmICh0aGlzLmZvcm1hdHRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZvcm1hdHRlZCA9ICcnXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgIHRoaXMuZm9ybWF0dGVkICs9ICd8fCdcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wcyA9IHRoaXMuc2V0W2ldXG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY29tcHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICBpZiAoayA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0dGVkICs9ICcgJ1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZvcm1hdHRlZCArPSBjb21wc1trXS50b1N0cmluZygpLnRyaW0oKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZvcm1hdHRlZFxuICB9XG5cbiAgZm9ybWF0ICgpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5nZVxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlXG4gIH1cblxuICBwYXJzZVJhbmdlIChyYW5nZSkge1xuICAgIC8vIG1lbW9pemUgcmFuZ2UgcGFyc2luZyBmb3IgcGVyZm9ybWFuY2UuXG4gICAgLy8gdGhpcyBpcyBhIHZlcnkgaG90IHBhdGgsIGFuZCBmdWxseSBkZXRlcm1pbmlzdGljLlxuICAgIGNvbnN0IG1lbW9PcHRzID1cbiAgICAgICh0aGlzLm9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgRkxBR19JTkNMVURFX1BSRVJFTEVBU0UpIHxcbiAgICAgICh0aGlzLm9wdGlvbnMubG9vc2UgJiYgRkxBR19MT09TRSlcbiAgICBjb25zdCBtZW1vS2V5ID0gbWVtb09wdHMgKyAnOicgKyByYW5nZVxuICAgIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChtZW1vS2V5KVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRcbiAgICB9XG5cbiAgICBjb25zdCBsb29zZSA9IHRoaXMub3B0aW9ucy5sb29zZVxuICAgIC8vIGAxLjIuMyAtIDEuMi40YCA9PiBgPj0xLjIuMyA8PTEuMi40YFxuICAgIGNvbnN0IGhyID0gbG9vc2UgPyByZVt0LkhZUEhFTlJBTkdFTE9PU0VdIDogcmVbdC5IWVBIRU5SQU5HRV1cbiAgICByYW5nZSA9IHJhbmdlLnJlcGxhY2UoaHIsIGh5cGhlblJlcGxhY2UodGhpcy5vcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSlcbiAgICBkZWJ1ZygnaHlwaGVuIHJlcGxhY2UnLCByYW5nZSlcblxuICAgIC8vIGA+IDEuMi4zIDwgMS4yLjVgID0+IGA+MS4yLjMgPDEuMi41YFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LkNPTVBBUkFUT1JUUklNXSwgY29tcGFyYXRvclRyaW1SZXBsYWNlKVxuICAgIGRlYnVnKCdjb21wYXJhdG9yIHRyaW0nLCByYW5nZSlcblxuICAgIC8vIGB+IDEuMi4zYCA9PiBgfjEuMi4zYFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LlRJTERFVFJJTV0sIHRpbGRlVHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ3RpbGRlIHRyaW0nLCByYW5nZSlcblxuICAgIC8vIGBeIDEuMi4zYCA9PiBgXjEuMi4zYFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LkNBUkVUVFJJTV0sIGNhcmV0VHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ2NhcmV0IHRyaW0nLCByYW5nZSlcblxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSByYW5nZSBpcyBjb21wbGV0ZWx5IHRyaW1tZWQgYW5kXG4gICAgLy8gcmVhZHkgdG8gYmUgc3BsaXQgaW50byBjb21wYXJhdG9ycy5cblxuICAgIGxldCByYW5nZUxpc3QgPSByYW5nZVxuICAgICAgLnNwbGl0KCcgJylcbiAgICAgIC5tYXAoY29tcCA9PiBwYXJzZUNvbXBhcmF0b3IoY29tcCwgdGhpcy5vcHRpb25zKSlcbiAgICAgIC5qb2luKCcgJylcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAvLyA+PTAuMC4wIGlzIGVxdWl2YWxlbnQgdG8gKlxuICAgICAgLm1hcChjb21wID0+IHJlcGxhY2VHVEUwKGNvbXAsIHRoaXMub3B0aW9ucykpXG5cbiAgICBpZiAobG9vc2UpIHtcbiAgICAgIC8vIGluIGxvb3NlIG1vZGUsIHRocm93IG91dCBhbnkgdGhhdCBhcmUgbm90IHZhbGlkIGNvbXBhcmF0b3JzXG4gICAgICByYW5nZUxpc3QgPSByYW5nZUxpc3QuZmlsdGVyKGNvbXAgPT4ge1xuICAgICAgICBkZWJ1ZygnbG9vc2UgaW52YWxpZCBmaWx0ZXInLCBjb21wLCB0aGlzLm9wdGlvbnMpXG4gICAgICAgIHJldHVybiAhIWNvbXAubWF0Y2gocmVbdC5DT01QQVJBVE9STE9PU0VdKVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVidWcoJ3JhbmdlIGxpc3QnLCByYW5nZUxpc3QpXG5cbiAgICAvLyBpZiBhbnkgY29tcGFyYXRvcnMgYXJlIHRoZSBudWxsIHNldCwgdGhlbiByZXBsYWNlIHdpdGggSlVTVCBudWxsIHNldFxuICAgIC8vIGlmIG1vcmUgdGhhbiBvbmUgY29tcGFyYXRvciwgcmVtb3ZlIGFueSAqIGNvbXBhcmF0b3JzXG4gICAgLy8gYWxzbywgZG9uJ3QgaW5jbHVkZSB0aGUgc2FtZSBjb21wYXJhdG9yIG1vcmUgdGhhbiBvbmNlXG4gICAgY29uc3QgcmFuZ2VNYXAgPSBuZXcgTWFwKClcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IHJhbmdlTGlzdC5tYXAoY29tcCA9PiBuZXcgQ29tcGFyYXRvcihjb21wLCB0aGlzLm9wdGlvbnMpKVxuICAgIGZvciAoY29uc3QgY29tcCBvZiBjb21wYXJhdG9ycykge1xuICAgICAgaWYgKGlzTnVsbFNldChjb21wKSkge1xuICAgICAgICByZXR1cm4gW2NvbXBdXG4gICAgICB9XG4gICAgICByYW5nZU1hcC5zZXQoY29tcC52YWx1ZSwgY29tcClcbiAgICB9XG4gICAgaWYgKHJhbmdlTWFwLnNpemUgPiAxICYmIHJhbmdlTWFwLmhhcygnJykpIHtcbiAgICAgIHJhbmdlTWFwLmRlbGV0ZSgnJylcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBbLi4ucmFuZ2VNYXAudmFsdWVzKCldXG4gICAgY2FjaGUuc2V0KG1lbW9LZXksIHJlc3VsdClcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBpbnRlcnNlY3RzIChyYW5nZSwgb3B0aW9ucykge1xuICAgIGlmICghKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhIFJhbmdlIGlzIHJlcXVpcmVkJylcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXQuc29tZSgodGhpc0NvbXBhcmF0b3JzKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpc1NhdGlzZmlhYmxlKHRoaXNDb21wYXJhdG9ycywgb3B0aW9ucykgJiZcbiAgICAgICAgcmFuZ2Uuc2V0LnNvbWUoKHJhbmdlQ29tcGFyYXRvcnMpID0+IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaXNTYXRpc2ZpYWJsZShyYW5nZUNvbXBhcmF0b3JzLCBvcHRpb25zKSAmJlxuICAgICAgICAgICAgdGhpc0NvbXBhcmF0b3JzLmV2ZXJ5KCh0aGlzQ29tcGFyYXRvcikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gcmFuZ2VDb21wYXJhdG9ycy5ldmVyeSgocmFuZ2VDb21wYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNDb21wYXJhdG9yLmludGVyc2VjdHMocmFuZ2VDb21wYXJhdG9yLCBvcHRpb25zKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfSlcbiAgfVxuXG4gIC8vIGlmIEFOWSBvZiB0aGUgc2V0cyBtYXRjaCBBTEwgb2YgaXRzIGNvbXBhcmF0b3JzLCB0aGVuIHBhc3NcbiAgdGVzdCAodmVyc2lvbikge1xuICAgIGlmICghdmVyc2lvbikge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgdGhpcy5vcHRpb25zKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNldC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRlc3RTZXQodGhpcy5zZXRbaV0sIHZlcnNpb24sIHRoaXMub3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSYW5nZVxuXG5jb25zdCBMUlUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9scnVjYWNoZScpXG5jb25zdCBjYWNoZSA9IG5ldyBMUlUoKVxuXG5jb25zdCBwYXJzZU9wdGlvbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9wYXJzZS1vcHRpb25zJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuL2NvbXBhcmF0b3InKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL3NlbXZlcicpXG5jb25zdCB7XG4gIHNhZmVSZTogcmUsXG4gIHQsXG4gIGNvbXBhcmF0b3JUcmltUmVwbGFjZSxcbiAgdGlsZGVUcmltUmVwbGFjZSxcbiAgY2FyZXRUcmltUmVwbGFjZSxcbn0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5jb25zdCB7IEZMQUdfSU5DTFVERV9QUkVSRUxFQVNFLCBGTEFHX0xPT1NFIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9jb25zdGFudHMnKVxuXG5jb25zdCBpc051bGxTZXQgPSBjID0+IGMudmFsdWUgPT09ICc8MC4wLjAtMCdcbmNvbnN0IGlzQW55ID0gYyA9PiBjLnZhbHVlID09PSAnJ1xuXG4vLyB0YWtlIGEgc2V0IG9mIGNvbXBhcmF0b3JzIGFuZCBkZXRlcm1pbmUgd2hldGhlciB0aGVyZVxuLy8gZXhpc3RzIGEgdmVyc2lvbiB3aGljaCBjYW4gc2F0aXNmeSBpdFxuY29uc3QgaXNTYXRpc2ZpYWJsZSA9IChjb21wYXJhdG9ycywgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzdWx0ID0gdHJ1ZVxuICBjb25zdCByZW1haW5pbmdDb21wYXJhdG9ycyA9IGNvbXBhcmF0b3JzLnNsaWNlKClcbiAgbGV0IHRlc3RDb21wYXJhdG9yID0gcmVtYWluaW5nQ29tcGFyYXRvcnMucG9wKClcblxuICB3aGlsZSAocmVzdWx0ICYmIHJlbWFpbmluZ0NvbXBhcmF0b3JzLmxlbmd0aCkge1xuICAgIHJlc3VsdCA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLmV2ZXJ5KChvdGhlckNvbXBhcmF0b3IpID0+IHtcbiAgICAgIHJldHVybiB0ZXN0Q29tcGFyYXRvci5pbnRlcnNlY3RzKG90aGVyQ29tcGFyYXRvciwgb3B0aW9ucylcbiAgICB9KVxuXG4gICAgdGVzdENvbXBhcmF0b3IgPSByZW1haW5pbmdDb21wYXJhdG9ycy5wb3AoKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vLyBjb21wcmlzZWQgb2YgeHJhbmdlcywgdGlsZGVzLCBzdGFycywgYW5kIGd0bHQncyBhdCB0aGlzIHBvaW50LlxuLy8gYWxyZWFkeSByZXBsYWNlZCB0aGUgaHlwaGVuIHJhbmdlc1xuLy8gdHVybiBpbnRvIGEgc2V0IG9mIEpVU1QgY29tcGFyYXRvcnMuXG5jb25zdCBwYXJzZUNvbXBhcmF0b3IgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygnY29tcCcsIGNvbXAsIG9wdGlvbnMpXG4gIGNvbXAgPSByZXBsYWNlQ2FyZXRzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCdjYXJldCcsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlVGlsZGVzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCd0aWxkZXMnLCBjb21wKVxuICBjb21wID0gcmVwbGFjZVhSYW5nZXMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3hyYW5nZScsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlU3RhcnMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3N0YXJzJywgY29tcClcbiAgcmV0dXJuIGNvbXBcbn1cblxuY29uc3QgaXNYID0gaWQgPT4gIWlkIHx8IGlkLnRvTG93ZXJDYXNlKCkgPT09ICd4JyB8fCBpZCA9PT0gJyonXG5cbi8vIH4sIH4+IC0tPiAqIChhbnksIGtpbmRhIHNpbGx5KVxuLy8gfjIsIH4yLngsIH4yLngueCwgfj4yLCB+PjIueCB+PjIueC54IC0tPiA+PTIuMC4wIDwzLjAuMC0wXG4vLyB+Mi4wLCB+Mi4wLngsIH4+Mi4wLCB+PjIuMC54IC0tPiA+PTIuMC4wIDwyLjEuMC0wXG4vLyB+MS4yLCB+MS4yLngsIH4+MS4yLCB+PjEuMi54IC0tPiA+PTEuMi4wIDwxLjMuMC0wXG4vLyB+MS4yLjMsIH4+MS4yLjMgLS0+ID49MS4yLjMgPDEuMy4wLTBcbi8vIH4xLjIuMCwgfj4xLjIuMCAtLT4gPj0xLjIuMCA8MS4zLjAtMFxuLy8gfjAuMC4xIC0tPiA+PTAuMC4xIDwwLjEuMC0wXG5jb25zdCByZXBsYWNlVGlsZGVzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgcmV0dXJuIGNvbXBcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChjKSA9PiByZXBsYWNlVGlsZGUoYywgb3B0aW9ucykpXG4gICAgLmpvaW4oJyAnKVxufVxuXG5jb25zdCByZXBsYWNlVGlsZGUgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBjb25zdCByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuVElMREVMT09TRV0gOiByZVt0LlRJTERFXVxuICByZXR1cm4gY29tcC5yZXBsYWNlKHIsIChfLCBNLCBtLCBwLCBwcikgPT4ge1xuICAgIGRlYnVnKCd0aWxkZScsIGNvbXAsIF8sIE0sIG0sIHAsIHByKVxuICAgIGxldCByZXRcblxuICAgIGlmIChpc1goTSkpIHtcbiAgICAgIHJldCA9ICcnXG4gICAgfSBlbHNlIGlmIChpc1gobSkpIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uMC4wIDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmIChpc1gocCkpIHtcbiAgICAgIC8vIH4xLjIgPT0gPj0xLjIuMCA8MS4zLjAtMFxuICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAgPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9IGVsc2UgaWYgKHByKSB7XG4gICAgICBkZWJ1ZygncmVwbGFjZVRpbGRlIHByJywgcHIpXG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIH4xLjIuMyA9PSA+PTEuMi4zIDwxLjMuMC0wXG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwXG4gICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgfVxuXG4gICAgZGVidWcoJ3RpbGRlIHJldHVybicsIHJldClcbiAgICByZXR1cm4gcmV0XG4gIH0pXG59XG5cbi8vIF4gLS0+ICogKGFueSwga2luZGEgc2lsbHkpXG4vLyBeMiwgXjIueCwgXjIueC54IC0tPiA+PTIuMC4wIDwzLjAuMC0wXG4vLyBeMi4wLCBeMi4wLnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIF4xLjIsIF4xLjIueCAtLT4gPj0xLjIuMCA8Mi4wLjAtMFxuLy8gXjEuMi4zIC0tPiA+PTEuMi4zIDwyLjAuMC0wXG4vLyBeMS4yLjAgLS0+ID49MS4yLjAgPDIuMC4wLTBcbi8vIF4wLjAuMSAtLT4gPj0wLjAuMSA8MC4wLjItMFxuLy8gXjAuMS4wIC0tPiA+PTAuMS4wIDwwLjIuMC0wXG5jb25zdCByZXBsYWNlQ2FyZXRzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgcmV0dXJuIGNvbXBcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChjKSA9PiByZXBsYWNlQ2FyZXQoYywgb3B0aW9ucykpXG4gICAgLmpvaW4oJyAnKVxufVxuXG5jb25zdCByZXBsYWNlQ2FyZXQgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygnY2FyZXQnLCBjb21wLCBvcHRpb25zKVxuICBjb25zdCByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuQ0FSRVRMT09TRV0gOiByZVt0LkNBUkVUXVxuICBjb25zdCB6ID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/ICctMCcgOiAnJ1xuICByZXR1cm4gY29tcC5yZXBsYWNlKHIsIChfLCBNLCBtLCBwLCBwcikgPT4ge1xuICAgIGRlYnVnKCdjYXJldCcsIGNvbXAsIF8sIE0sIG0sIHAsIHByKVxuICAgIGxldCByZXRcblxuICAgIGlmIChpc1goTSkpIHtcbiAgICAgIHJldCA9ICcnXG4gICAgfSBlbHNlIGlmIChpc1gobSkpIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uMC4wJHt6fSA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoaXNYKHApKSB7XG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHt6fSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3p9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcikge1xuICAgICAgZGVidWcoJ3JlcGxhY2VDYXJldCBwcicsIHByKVxuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgICAgIH0gPCR7TX0uJHttfS4keytwICsgMX0tMGBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICAgIH0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoJ25vIHByJylcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgaWYgKG0gPT09ICcwJykge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgICAgICB9JHt6fSA8JHtNfS4ke219LiR7K3AgKyAxfS0wYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgICAgICB9JHt6fSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwXG4gICAgICAgIH0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWJ1ZygnY2FyZXQgcmV0dXJuJywgcmV0KVxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuY29uc3QgcmVwbGFjZVhSYW5nZXMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZVhSYW5nZXMnLCBjb21wLCBvcHRpb25zKVxuICByZXR1cm4gY29tcFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoYykgPT4gcmVwbGFjZVhSYW5nZShjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VYUmFuZ2UgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBjb21wID0gY29tcC50cmltKClcbiAgY29uc3QgciA9IG9wdGlvbnMubG9vc2UgPyByZVt0LlhSQU5HRUxPT1NFXSA6IHJlW3QuWFJBTkdFXVxuICByZXR1cm4gY29tcC5yZXBsYWNlKHIsIChyZXQsIGd0bHQsIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ3hSYW5nZScsIGNvbXAsIHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpXG4gICAgY29uc3QgeE0gPSBpc1goTSlcbiAgICBjb25zdCB4bSA9IHhNIHx8IGlzWChtKVxuICAgIGNvbnN0IHhwID0geG0gfHwgaXNYKHApXG4gICAgY29uc3QgYW55WCA9IHhwXG5cbiAgICBpZiAoZ3RsdCA9PT0gJz0nICYmIGFueVgpIHtcbiAgICAgIGd0bHQgPSAnJ1xuICAgIH1cblxuICAgIC8vIGlmIHdlJ3JlIGluY2x1ZGluZyBwcmVyZWxlYXNlcyBpbiB0aGUgbWF0Y2gsIHRoZW4gd2UgbmVlZFxuICAgIC8vIHRvIGZpeCB0aGlzIHRvIC0wLCB0aGUgbG93ZXN0IHBvc3NpYmxlIHByZXJlbGVhc2UgdmFsdWVcbiAgICBwciA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyAnLTAnIDogJydcblxuICAgIGlmICh4TSkge1xuICAgICAgaWYgKGd0bHQgPT09ICc+JyB8fCBndGx0ID09PSAnPCcpIHtcbiAgICAgICAgLy8gbm90aGluZyBpcyBhbGxvd2VkXG4gICAgICAgIHJldCA9ICc8MC4wLjAtMCdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vdGhpbmcgaXMgZm9yYmlkZGVuXG4gICAgICAgIHJldCA9ICcqJ1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZ3RsdCAmJiBhbnlYKSB7XG4gICAgICAvLyB3ZSBrbm93IHBhdGNoIGlzIGFuIHgsIGJlY2F1c2Ugd2UgaGF2ZSBhbnkgeCBhdCBhbGwuXG4gICAgICAvLyByZXBsYWNlIFggd2l0aCAwXG4gICAgICBpZiAoeG0pIHtcbiAgICAgICAgbSA9IDBcbiAgICAgIH1cbiAgICAgIHAgPSAwXG5cbiAgICAgIGlmIChndGx0ID09PSAnPicpIHtcbiAgICAgICAgLy8gPjEgPT4gPj0yLjAuMFxuICAgICAgICAvLyA+MS4yID0+ID49MS4zLjBcbiAgICAgICAgZ3RsdCA9ICc+PSdcbiAgICAgICAgaWYgKHhtKSB7XG4gICAgICAgICAgTSA9ICtNICsgMVxuICAgICAgICAgIG0gPSAwXG4gICAgICAgICAgcCA9IDBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtID0gK20gKyAxXG4gICAgICAgICAgcCA9IDBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChndGx0ID09PSAnPD0nKSB7XG4gICAgICAgIC8vIDw9MC43LnggaXMgYWN0dWFsbHkgPDAuOC4wLCBzaW5jZSBhbnkgMC43Lnggc2hvdWxkXG4gICAgICAgIC8vIHBhc3MuICBTaW1pbGFybHksIDw9Ny54IGlzIGFjdHVhbGx5IDw4LjAuMCwgZXRjLlxuICAgICAgICBndGx0ID0gJzwnXG4gICAgICAgIGlmICh4bSkge1xuICAgICAgICAgIE0gPSArTSArIDFcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtID0gK20gKyAxXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGd0bHQgPT09ICc8Jykge1xuICAgICAgICBwciA9ICctMCdcbiAgICAgIH1cblxuICAgICAgcmV0ID0gYCR7Z3RsdCArIE19LiR7bX0uJHtwfSR7cHJ9YFxuICAgIH0gZWxzZSBpZiAoeG0pIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uMC4wJHtwcn0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKHhwKSB7XG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7cHJcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9XG5cbiAgICBkZWJ1ZygneFJhbmdlIHJldHVybicsIHJldClcblxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuLy8gQmVjYXVzZSAqIGlzIEFORC1lZCB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgY29tcGFyYXRvcixcbi8vIGFuZCAnJyBtZWFucyBcImFueSB2ZXJzaW9uXCIsIGp1c3QgcmVtb3ZlIHRoZSAqcyBlbnRpcmVseS5cbmNvbnN0IHJlcGxhY2VTdGFycyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlU3RhcnMnLCBjb21wLCBvcHRpb25zKVxuICAvLyBMb29zZW5lc3MgaXMgaWdub3JlZCBoZXJlLiAgc3RhciBpcyBhbHdheXMgYXMgbG9vc2UgYXMgaXQgZ2V0cyFcbiAgcmV0dXJuIGNvbXBcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2UocmVbdC5TVEFSXSwgJycpXG59XG5cbmNvbnN0IHJlcGxhY2VHVEUwID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VHVEUwJywgY29tcCwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXBcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2UocmVbb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHQuR1RFMFBSRSA6IHQuR1RFMF0sICcnKVxufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byBzdHJpbmcucmVwbGFjZShyZVt0LkhZUEhFTlJBTkdFXSlcbi8vIE0sIG0sIHBhdGNoLCBwcmVyZWxlYXNlLCBidWlsZFxuLy8gMS4yIC0gMy40LjUgPT4gPj0xLjIuMCA8PTMuNC41XG4vLyAxLjIuMyAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMC0wIEFueSAzLjQueCB3aWxsIGRvXG4vLyAxLjIgLSAzLjQgPT4gPj0xLjIuMCA8My41LjAtMFxuLy8gVE9ETyBidWlsZD9cbmNvbnN0IGh5cGhlblJlcGxhY2UgPSBpbmNQciA9PiAoJDAsXG4gIGZyb20sIGZNLCBmbSwgZnAsIGZwciwgZmIsXG4gIHRvLCB0TSwgdG0sIHRwLCB0cHIpID0+IHtcbiAgaWYgKGlzWChmTSkpIHtcbiAgICBmcm9tID0gJydcbiAgfSBlbHNlIGlmIChpc1goZm0pKSB7XG4gICAgZnJvbSA9IGA+PSR7Zk19LjAuMCR7aW5jUHIgPyAnLTAnIDogJyd9YFxuICB9IGVsc2UgaWYgKGlzWChmcCkpIHtcbiAgICBmcm9tID0gYD49JHtmTX0uJHtmbX0uMCR7aW5jUHIgPyAnLTAnIDogJyd9YFxuICB9IGVsc2UgaWYgKGZwcikge1xuICAgIGZyb20gPSBgPj0ke2Zyb219YFxuICB9IGVsc2Uge1xuICAgIGZyb20gPSBgPj0ke2Zyb219JHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH1cblxuICBpZiAoaXNYKHRNKSkge1xuICAgIHRvID0gJydcbiAgfSBlbHNlIGlmIChpc1godG0pKSB7XG4gICAgdG8gPSBgPCR7K3RNICsgMX0uMC4wLTBgXG4gIH0gZWxzZSBpZiAoaXNYKHRwKSkge1xuICAgIHRvID0gYDwke3RNfS4keyt0bSArIDF9LjAtMGBcbiAgfSBlbHNlIGlmICh0cHIpIHtcbiAgICB0byA9IGA8PSR7dE19LiR7dG19LiR7dHB9LSR7dHByfWBcbiAgfSBlbHNlIGlmIChpbmNQcikge1xuICAgIHRvID0gYDwke3RNfS4ke3RtfS4keyt0cCArIDF9LTBgXG4gIH0gZWxzZSB7XG4gICAgdG8gPSBgPD0ke3RvfWBcbiAgfVxuXG4gIHJldHVybiBgJHtmcm9tfSAke3RvfWAudHJpbSgpXG59XG5cbmNvbnN0IHRlc3RTZXQgPSAoc2V0LCB2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFzZXRbaV0udGVzdCh2ZXJzaW9uKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgaWYgKHZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGggJiYgIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAvLyBGaW5kIHRoZSBzZXQgb2YgdmVyc2lvbnMgdGhhdCBhcmUgYWxsb3dlZCB0byBoYXZlIHByZXJlbGVhc2VzXG4gICAgLy8gRm9yIGV4YW1wbGUsIF4xLjIuMy1wci4xIGRlc3VnYXJzIHRvID49MS4yLjMtcHIuMSA8Mi4wLjBcbiAgICAvLyBUaGF0IHNob3VsZCBhbGxvdyBgMS4yLjMtcHIuMmAgdG8gcGFzcy5cbiAgICAvLyBIb3dldmVyLCBgMS4yLjQtYWxwaGEubm90cmVhZHlgIHNob3VsZCBOT1QgYmUgYWxsb3dlZCxcbiAgICAvLyBldmVuIHRob3VnaCBpdCdzIHdpdGhpbiB0aGUgcmFuZ2Ugc2V0IGJ5IHRoZSBjb21wYXJhdG9ycy5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgZGVidWcoc2V0W2ldLnNlbXZlcilcbiAgICAgIGlmIChzZXRbaV0uc2VtdmVyID09PSBDb21wYXJhdG9yLkFOWSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoc2V0W2ldLnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWxsb3dlZCA9IHNldFtpXS5zZW12ZXJcbiAgICAgICAgaWYgKGFsbG93ZWQubWFqb3IgPT09IHZlcnNpb24ubWFqb3IgJiZcbiAgICAgICAgICAgIGFsbG93ZWQubWlub3IgPT09IHZlcnNpb24ubWlub3IgJiZcbiAgICAgICAgICAgIGFsbG93ZWQucGF0Y2ggPT09IHZlcnNpb24ucGF0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmVyc2lvbiBoYXMgYSAtcHJlLCBidXQgaXQncyBub3Qgb25lIG9mIHRoZSBvbmVzIHdlIGxpa2UuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgQU5ZID0gU3ltYm9sKCdTZW1WZXIgQU5ZJylcbi8vIGhvaXN0ZWQgY2xhc3MgZm9yIGN5Y2xpYyBkZXBlbmRlbmN5XG5jbGFzcyBDb21wYXJhdG9yIHtcbiAgc3RhdGljIGdldCBBTlkgKCkge1xuICAgIHJldHVybiBBTllcbiAgfVxuXG4gIGNvbnN0cnVjdG9yIChjb21wLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgICBpZiAoY29tcC5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlKSB7XG4gICAgICAgIHJldHVybiBjb21wXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wID0gY29tcC52YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXAgPSBjb21wLnRyaW0oKS5zcGxpdCgvXFxzKy8pLmpvaW4oJyAnKVxuICAgIGRlYnVnKCdjb21wYXJhdG9yJywgY29tcCwgb3B0aW9ucylcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIHRoaXMucGFyc2UoY29tcClcblxuICAgIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICB0aGlzLnZhbHVlID0gJydcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMub3BlcmF0b3IgKyB0aGlzLnNlbXZlci52ZXJzaW9uXG4gICAgfVxuXG4gICAgZGVidWcoJ2NvbXAnLCB0aGlzKVxuICB9XG5cbiAgcGFyc2UgKGNvbXApIHtcbiAgICBjb25zdCByID0gdGhpcy5vcHRpb25zLmxvb3NlID8gcmVbdC5DT01QQVJBVE9STE9PU0VdIDogcmVbdC5DT01QQVJBVE9SXVxuICAgIGNvbnN0IG0gPSBjb21wLm1hdGNoKHIpXG5cbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgY29tcGFyYXRvcjogJHtjb21wfWApXG4gICAgfVxuXG4gICAgdGhpcy5vcGVyYXRvciA9IG1bMV0gIT09IHVuZGVmaW5lZCA/IG1bMV0gOiAnJ1xuICAgIGlmICh0aGlzLm9wZXJhdG9yID09PSAnPScpIHtcbiAgICAgIHRoaXMub3BlcmF0b3IgPSAnJ1xuICAgIH1cblxuICAgIC8vIGlmIGl0IGxpdGVyYWxseSBpcyBqdXN0ICc+JyBvciAnJyB0aGVuIGFsbG93IGFueXRoaW5nLlxuICAgIGlmICghbVsyXSkge1xuICAgICAgdGhpcy5zZW12ZXIgPSBBTllcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW12ZXIgPSBuZXcgU2VtVmVyKG1bMl0sIHRoaXMub3B0aW9ucy5sb29zZSlcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVcbiAgfVxuXG4gIHRlc3QgKHZlcnNpb24pIHtcbiAgICBkZWJ1ZygnQ29tcGFyYXRvci50ZXN0JywgdmVyc2lvbiwgdGhpcy5vcHRpb25zLmxvb3NlKVxuXG4gICAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkgfHwgdmVyc2lvbiA9PT0gQU5ZKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIHRoaXMub3B0aW9ucylcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbXAodmVyc2lvbiwgdGhpcy5vcGVyYXRvciwgdGhpcy5zZW12ZXIsIHRoaXMub3B0aW9ucylcbiAgfVxuXG4gIGludGVyc2VjdHMgKGNvbXAsIG9wdGlvbnMpIHtcbiAgICBpZiAoIShjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgQ29tcGFyYXRvciBpcyByZXF1aXJlZCcpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmFuZ2UoY29tcC52YWx1ZSwgb3B0aW9ucykudGVzdCh0aGlzLnZhbHVlKVxuICAgIH0gZWxzZSBpZiAoY29tcC5vcGVyYXRvciA9PT0gJycpIHtcbiAgICAgIGlmIChjb21wLnZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnZhbHVlLCBvcHRpb25zKS50ZXN0KGNvbXAuc2VtdmVyKVxuICAgIH1cblxuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8vIFNwZWNpYWwgY2FzZXMgd2hlcmUgbm90aGluZyBjYW4gcG9zc2libHkgYmUgbG93ZXJcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgICAgKHRoaXMudmFsdWUgPT09ICc8MC4wLjAtMCcgfHwgY29tcC52YWx1ZSA9PT0gJzwwLjAuMC0wJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICAgICh0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoJzwwLjAuMCcpIHx8IGNvbXAudmFsdWUuc3RhcnRzV2l0aCgnPDAuMC4wJykpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBTYW1lIGRpcmVjdGlvbiBpbmNyZWFzaW5nICg+IG9yID49KVxuICAgIGlmICh0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gU2FtZSBkaXJlY3Rpb24gZGVjcmVhc2luZyAoPCBvciA8PSlcbiAgICBpZiAodGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIHNhbWUgU2VtVmVyIGFuZCBib3RoIHNpZGVzIGFyZSBpbmNsdXNpdmUgKDw9IG9yID49KVxuICAgIGlmIChcbiAgICAgICh0aGlzLnNlbXZlci52ZXJzaW9uID09PSBjb21wLnNlbXZlci52ZXJzaW9uKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5pbmNsdWRlcygnPScpICYmIGNvbXAub3BlcmF0b3IuaW5jbHVkZXMoJz0nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gb3Bwb3NpdGUgZGlyZWN0aW9ucyBsZXNzIHRoYW5cbiAgICBpZiAoY21wKHRoaXMuc2VtdmVyLCAnPCcsIGNvbXAuc2VtdmVyLCBvcHRpb25zKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIG9wcG9zaXRlIGRpcmVjdGlvbnMgZ3JlYXRlciB0aGFuXG4gICAgaWYgKGNtcCh0aGlzLnNlbXZlciwgJz4nLCBjb21wLnNlbXZlciwgb3B0aW9ucykgJiZcbiAgICAgIHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBhcmF0b3JcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jbXAnKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2UnKVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHNhdGlzZmllcyA9ICh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiByYW5nZS50ZXN0KHZlcnNpb24pXG59XG5tb2R1bGUuZXhwb3J0cyA9IHNhdGlzZmllc1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcblxuLy8gTW9zdGx5IGp1c3QgZm9yIHRlc3RpbmcgYW5kIGxlZ2FjeSBBUEkgcmVhc29uc1xuY29uc3QgdG9Db21wYXJhdG9ycyA9IChyYW5nZSwgb3B0aW9ucykgPT5cbiAgbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKS5zZXRcbiAgICAubWFwKGNvbXAgPT4gY29tcC5tYXAoYyA9PiBjLnZhbHVlKS5qb2luKCcgJykudHJpbSgpLnNwbGl0KCcgJykpXG5cbm1vZHVsZS5leHBvcnRzID0gdG9Db21wYXJhdG9yc1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcblxuY29uc3QgbWF4U2F0aXNmeWluZyA9ICh2ZXJzaW9ucywgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgbGV0IG1heCA9IG51bGxcbiAgbGV0IG1heFNWID0gbnVsbFxuICBsZXQgcmFuZ2VPYmogPSBudWxsXG4gIHRyeSB7XG4gICAgcmFuZ2VPYmogPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICB2ZXJzaW9ucy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgaWYgKHJhbmdlT2JqLnRlc3QodikpIHtcbiAgICAgIC8vIHNhdGlzZmllcyh2LCByYW5nZSwgb3B0aW9ucylcbiAgICAgIGlmICghbWF4IHx8IG1heFNWLmNvbXBhcmUodikgPT09IC0xKSB7XG4gICAgICAgIC8vIGNvbXBhcmUobWF4LCB2LCB0cnVlKVxuICAgICAgICBtYXggPSB2XG4gICAgICAgIG1heFNWID0gbmV3IFNlbVZlcihtYXgsIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gbWF4XG59XG5tb2R1bGUuZXhwb3J0cyA9IG1heFNhdGlzZnlpbmdcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBtaW5TYXRpc2Z5aW5nID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBsZXQgbWluID0gbnVsbFxuICBsZXQgbWluU1YgPSBudWxsXG4gIGxldCByYW5nZU9iaiA9IG51bGxcbiAgdHJ5IHtcbiAgICByYW5nZU9iaiA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHZlcnNpb25zLmZvckVhY2goKHYpID0+IHtcbiAgICBpZiAocmFuZ2VPYmoudGVzdCh2KSkge1xuICAgICAgLy8gc2F0aXNmaWVzKHYsIHJhbmdlLCBvcHRpb25zKVxuICAgICAgaWYgKCFtaW4gfHwgbWluU1YuY29tcGFyZSh2KSA9PT0gMSkge1xuICAgICAgICAvLyBjb21wYXJlKG1pbiwgdiwgdHJ1ZSlcbiAgICAgICAgbWluID0gdlxuICAgICAgICBtaW5TViA9IG5ldyBTZW1WZXIobWluLCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1pblxufVxubW9kdWxlLmV4cG9ydHMgPSBtaW5TYXRpc2Z5aW5nXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgZ3QgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvZ3QnKVxuXG5jb25zdCBtaW5WZXJzaW9uID0gKHJhbmdlLCBsb29zZSkgPT4ge1xuICByYW5nZSA9IG5ldyBSYW5nZShyYW5nZSwgbG9vc2UpXG5cbiAgbGV0IG1pbnZlciA9IG5ldyBTZW1WZXIoJzAuMC4wJylcbiAgaWYgKHJhbmdlLnRlc3QobWludmVyKSkge1xuICAgIHJldHVybiBtaW52ZXJcbiAgfVxuXG4gIG1pbnZlciA9IG5ldyBTZW1WZXIoJzAuMC4wLTAnKVxuICBpZiAocmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgbWludmVyID0gbnVsbFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlLnNldC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gcmFuZ2Uuc2V0W2ldXG5cbiAgICBsZXQgc2V0TWluID0gbnVsbFxuICAgIGNvbXBhcmF0b3JzLmZvckVhY2goKGNvbXBhcmF0b3IpID0+IHtcbiAgICAgIC8vIENsb25lIHRvIGF2b2lkIG1hbmlwdWxhdGluZyB0aGUgY29tcGFyYXRvcidzIHNlbXZlciBvYmplY3QuXG4gICAgICBjb25zdCBjb21wdmVyID0gbmV3IFNlbVZlcihjb21wYXJhdG9yLnNlbXZlci52ZXJzaW9uKVxuICAgICAgc3dpdGNoIChjb21wYXJhdG9yLm9wZXJhdG9yKSB7XG4gICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgIGlmIChjb21wdmVyLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb21wdmVyLnBhdGNoKytcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcHZlci5wcmVyZWxlYXNlLnB1c2goMClcbiAgICAgICAgICB9XG4gICAgICAgICAgY29tcHZlci5yYXcgPSBjb21wdmVyLmZvcm1hdCgpXG4gICAgICAgICAgLyogZmFsbHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAnJzpcbiAgICAgICAgY2FzZSAnPj0nOlxuICAgICAgICAgIGlmICghc2V0TWluIHx8IGd0KGNvbXB2ZXIsIHNldE1pbikpIHtcbiAgICAgICAgICAgIHNldE1pbiA9IGNvbXB2ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgIGNhc2UgJzw9JzpcbiAgICAgICAgICAvKiBJZ25vcmUgbWF4aW11bSB2ZXJzaW9ucyAqL1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG9wZXJhdGlvbjogJHtjb21wYXJhdG9yLm9wZXJhdG9yfWApXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoc2V0TWluICYmICghbWludmVyIHx8IGd0KG1pbnZlciwgc2V0TWluKSkpIHtcbiAgICAgIG1pbnZlciA9IHNldE1pblxuICAgIH1cbiAgfVxuXG4gIGlmIChtaW52ZXIgJiYgcmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gbWluVmVyc2lvblxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHZhbGlkUmFuZ2UgPSAocmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBSZXR1cm4gJyonIGluc3RlYWQgb2YgJycgc28gdGhhdCB0cnV0aGluZXNzIHdvcmtzLlxuICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBpZiBpdCdzIGludmFsaWQgYW55d2F5XG4gICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucykucmFuZ2UgfHwgJyonXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB2YWxpZFJhbmdlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9jb21wYXJhdG9yJylcbmNvbnN0IHsgQU5ZIH0gPSBDb21wYXJhdG9yXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3Qgc2F0aXNmaWVzID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL3NhdGlzZmllcycpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndCcpXG5jb25zdCBsdCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9sdCcpXG5jb25zdCBsdGUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvbHRlJylcbmNvbnN0IGd0ZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndGUnKVxuXG5jb25zdCBvdXRzaWRlID0gKHZlcnNpb24sIHJhbmdlLCBoaWxvLCBvcHRpb25zKSA9PiB7XG4gIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuXG4gIGxldCBndGZuLCBsdGVmbiwgbHRmbiwgY29tcCwgZWNvbXBcbiAgc3dpdGNoIChoaWxvKSB7XG4gICAgY2FzZSAnPic6XG4gICAgICBndGZuID0gZ3RcbiAgICAgIGx0ZWZuID0gbHRlXG4gICAgICBsdGZuID0gbHRcbiAgICAgIGNvbXAgPSAnPidcbiAgICAgIGVjb21wID0gJz49J1xuICAgICAgYnJlYWtcbiAgICBjYXNlICc8JzpcbiAgICAgIGd0Zm4gPSBsdFxuICAgICAgbHRlZm4gPSBndGVcbiAgICAgIGx0Zm4gPSBndFxuICAgICAgY29tcCA9ICc8J1xuICAgICAgZWNvbXAgPSAnPD0nXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHByb3ZpZGUgYSBoaWxvIHZhbCBvZiBcIjxcIiBvciBcIj5cIicpXG4gIH1cblxuICAvLyBJZiBpdCBzYXRpc2ZpZXMgdGhlIHJhbmdlIGl0IGlzIG5vdCBvdXRzaWRlXG4gIGlmIChzYXRpc2ZpZXModmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBGcm9tIG5vdyBvbiwgdmFyaWFibGUgdGVybXMgYXJlIGFzIGlmIHdlJ3JlIGluIFwiZ3RyXCIgbW9kZS5cbiAgLy8gYnV0IG5vdGUgdGhhdCBldmVyeXRoaW5nIGlzIGZsaXBwZWQgZm9yIHRoZSBcImx0clwiIGZ1bmN0aW9uLlxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZS5zZXRbaV1cblxuICAgIGxldCBoaWdoID0gbnVsbFxuICAgIGxldCBsb3cgPSBudWxsXG5cbiAgICBjb21wYXJhdG9ycy5mb3JFYWNoKChjb21wYXJhdG9yKSA9PiB7XG4gICAgICBpZiAoY29tcGFyYXRvci5zZW12ZXIgPT09IEFOWSkge1xuICAgICAgICBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoJz49MC4wLjAnKVxuICAgICAgfVxuICAgICAgaGlnaCA9IGhpZ2ggfHwgY29tcGFyYXRvclxuICAgICAgbG93ID0gbG93IHx8IGNvbXBhcmF0b3JcbiAgICAgIGlmIChndGZuKGNvbXBhcmF0b3Iuc2VtdmVyLCBoaWdoLnNlbXZlciwgb3B0aW9ucykpIHtcbiAgICAgICAgaGlnaCA9IGNvbXBhcmF0b3JcbiAgICAgIH0gZWxzZSBpZiAobHRmbihjb21wYXJhdG9yLnNlbXZlciwgbG93LnNlbXZlciwgb3B0aW9ucykpIHtcbiAgICAgICAgbG93ID0gY29tcGFyYXRvclxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBJZiB0aGUgZWRnZSB2ZXJzaW9uIGNvbXBhcmF0b3IgaGFzIGEgb3BlcmF0b3IgdGhlbiBvdXIgdmVyc2lvblxuICAgIC8vIGlzbid0IG91dHNpZGUgaXRcbiAgICBpZiAoaGlnaC5vcGVyYXRvciA9PT0gY29tcCB8fCBoaWdoLm9wZXJhdG9yID09PSBlY29tcCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGxvd2VzdCB2ZXJzaW9uIGNvbXBhcmF0b3IgaGFzIGFuIG9wZXJhdG9yIGFuZCBvdXIgdmVyc2lvblxuICAgIC8vIGlzIGxlc3MgdGhhbiBpdCB0aGVuIGl0IGlzbid0IGhpZ2hlciB0aGFuIHRoZSByYW5nZVxuICAgIGlmICgoIWxvdy5vcGVyYXRvciB8fCBsb3cub3BlcmF0b3IgPT09IGNvbXApICYmXG4gICAgICAgIGx0ZWZuKHZlcnNpb24sIGxvdy5zZW12ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKGxvdy5vcGVyYXRvciA9PT0gZWNvbXAgJiYgbHRmbih2ZXJzaW9uLCBsb3cuc2VtdmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3V0c2lkZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuLy8gRGV0ZXJtaW5lIGlmIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIGFsbCB0aGUgdmVyc2lvbnMgcG9zc2libGUgaW4gdGhlIHJhbmdlLlxuY29uc3Qgb3V0c2lkZSA9IHJlcXVpcmUoJy4vb3V0c2lkZScpXG5jb25zdCBndHIgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IG91dHNpZGUodmVyc2lvbiwgcmFuZ2UsICc+Jywgb3B0aW9ucylcbm1vZHVsZS5leHBvcnRzID0gZ3RyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBvdXRzaWRlID0gcmVxdWlyZSgnLi9vdXRzaWRlJylcbi8vIERldGVybWluZSBpZiB2ZXJzaW9uIGlzIGxlc3MgdGhhbiBhbGwgdGhlIHZlcnNpb25zIHBvc3NpYmxlIGluIHRoZSByYW5nZVxuY29uc3QgbHRyID0gKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSA9PiBvdXRzaWRlKHZlcnNpb24sIHJhbmdlLCAnPCcsIG9wdGlvbnMpXG5tb2R1bGUuZXhwb3J0cyA9IGx0clxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IGludGVyc2VjdHMgPSAocjEsIHIyLCBvcHRpb25zKSA9PiB7XG4gIHIxID0gbmV3IFJhbmdlKHIxLCBvcHRpb25zKVxuICByMiA9IG5ldyBSYW5nZShyMiwgb3B0aW9ucylcbiAgcmV0dXJuIHIxLmludGVyc2VjdHMocjIsIG9wdGlvbnMpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGludGVyc2VjdHNcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIGdpdmVuIGEgc2V0IG9mIHZlcnNpb25zIGFuZCBhIHJhbmdlLCBjcmVhdGUgYSBcInNpbXBsaWZpZWRcIiByYW5nZVxuLy8gdGhhdCBpbmNsdWRlcyB0aGUgc2FtZSB2ZXJzaW9ucyB0aGF0IHRoZSBvcmlnaW5hbCByYW5nZSBkb2VzXG4vLyBJZiB0aGUgb3JpZ2luYWwgcmFuZ2UgaXMgc2hvcnRlciB0aGFuIHRoZSBzaW1wbGlmaWVkIG9uZSwgcmV0dXJuIHRoYXQuXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzLmpzJylcbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvY29tcGFyZS5qcycpXG5tb2R1bGUuZXhwb3J0cyA9ICh2ZXJzaW9ucywgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qgc2V0ID0gW11cbiAgbGV0IGZpcnN0ID0gbnVsbFxuICBsZXQgcHJldiA9IG51bGxcbiAgY29uc3QgdiA9IHZlcnNpb25zLnNvcnQoKGEsIGIpID0+IGNvbXBhcmUoYSwgYiwgb3B0aW9ucykpXG4gIGZvciAoY29uc3QgdmVyc2lvbiBvZiB2KSB7XG4gICAgY29uc3QgaW5jbHVkZWQgPSBzYXRpc2ZpZXModmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgaWYgKGluY2x1ZGVkKSB7XG4gICAgICBwcmV2ID0gdmVyc2lvblxuICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICBmaXJzdCA9IHZlcnNpb25cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgc2V0LnB1c2goW2ZpcnN0LCBwcmV2XSlcbiAgICAgIH1cbiAgICAgIHByZXYgPSBudWxsXG4gICAgICBmaXJzdCA9IG51bGxcbiAgICB9XG4gIH1cbiAgaWYgKGZpcnN0KSB7XG4gICAgc2V0LnB1c2goW2ZpcnN0LCBudWxsXSlcbiAgfVxuXG4gIGNvbnN0IHJhbmdlcyA9IFtdXG4gIGZvciAoY29uc3QgW21pbiwgbWF4XSBvZiBzZXQpIHtcbiAgICBpZiAobWluID09PSBtYXgpIHtcbiAgICAgIHJhbmdlcy5wdXNoKG1pbilcbiAgICB9IGVsc2UgaWYgKCFtYXggJiYgbWluID09PSB2WzBdKSB7XG4gICAgICByYW5nZXMucHVzaCgnKicpXG4gICAgfSBlbHNlIGlmICghbWF4KSB7XG4gICAgICByYW5nZXMucHVzaChgPj0ke21pbn1gKVxuICAgIH0gZWxzZSBpZiAobWluID09PSB2WzBdKSB7XG4gICAgICByYW5nZXMucHVzaChgPD0ke21heH1gKVxuICAgIH0gZWxzZSB7XG4gICAgICByYW5nZXMucHVzaChgJHttaW59IC0gJHttYXh9YClcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2ltcGxpZmllZCA9IHJhbmdlcy5qb2luKCcgfHwgJylcbiAgY29uc3Qgb3JpZ2luYWwgPSB0eXBlb2YgcmFuZ2UucmF3ID09PSAnc3RyaW5nJyA/IHJhbmdlLnJhdyA6IFN0cmluZyhyYW5nZSlcbiAgcmV0dXJuIHNpbXBsaWZpZWQubGVuZ3RoIDwgb3JpZ2luYWwubGVuZ3RoID8gc2ltcGxpZmllZCA6IHJhbmdlXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UuanMnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvY29tcGFyYXRvci5qcycpXG5jb25zdCB7IEFOWSB9ID0gQ29tcGFyYXRvclxuY29uc3Qgc2F0aXNmaWVzID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL3NhdGlzZmllcy5qcycpXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2NvbXBhcmUuanMnKVxuXG4vLyBDb21wbGV4IHJhbmdlIGByMSB8fCByMiB8fCAuLi5gIGlzIGEgc3Vic2V0IG9mIGBSMSB8fCBSMiB8fCAuLi5gIGlmZjpcbi8vIC0gRXZlcnkgc2ltcGxlIHJhbmdlIGByMSwgcjIsIC4uLmAgaXMgYSBudWxsIHNldCwgT1Jcbi8vIC0gRXZlcnkgc2ltcGxlIHJhbmdlIGByMSwgcjIsIC4uLmAgd2hpY2ggaXMgbm90IGEgbnVsbCBzZXQgaXMgYSBzdWJzZXQgb2Zcbi8vICAgc29tZSBgUjEsIFIyLCAuLi5gXG4vL1xuLy8gU2ltcGxlIHJhbmdlIGBjMSBjMiAuLi5gIGlzIGEgc3Vic2V0IG9mIHNpbXBsZSByYW5nZSBgQzEgQzIgLi4uYCBpZmY6XG4vLyAtIElmIGMgaXMgb25seSB0aGUgQU5ZIGNvbXBhcmF0b3Jcbi8vICAgLSBJZiBDIGlzIG9ubHkgdGhlIEFOWSBjb21wYXJhdG9yLCByZXR1cm4gdHJ1ZVxuLy8gICAtIEVsc2UgaWYgaW4gcHJlcmVsZWFzZSBtb2RlLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBlbHNlIHJlcGxhY2UgYyB3aXRoIGBbPj0wLjAuMF1gXG4vLyAtIElmIEMgaXMgb25seSB0aGUgQU5ZIGNvbXBhcmF0b3Jcbi8vICAgLSBpZiBpbiBwcmVyZWxlYXNlIG1vZGUsIHJldHVybiB0cnVlXG4vLyAgIC0gZWxzZSByZXBsYWNlIEMgd2l0aCBgWz49MC4wLjBdYFxuLy8gLSBMZXQgRVEgYmUgdGhlIHNldCBvZiA9IGNvbXBhcmF0b3JzIGluIGNcbi8vIC0gSWYgRVEgaXMgbW9yZSB0aGFuIG9uZSwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gLSBMZXQgR1QgYmUgdGhlIGhpZ2hlc3QgPiBvciA+PSBjb21wYXJhdG9yIGluIGNcbi8vIC0gTGV0IExUIGJlIHRoZSBsb3dlc3QgPCBvciA8PSBjb21wYXJhdG9yIGluIGNcbi8vIC0gSWYgR1QgYW5kIExULCBhbmQgR1Quc2VtdmVyID4gTFQuc2VtdmVyLCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAtIElmIGFueSBDIGlzIGEgPSByYW5nZSwgYW5kIEdUIG9yIExUIGFyZSBzZXQsIHJldHVybiBmYWxzZVxuLy8gLSBJZiBFUVxuLy8gICAtIElmIEdULCBhbmQgRVEgZG9lcyBub3Qgc2F0aXNmeSBHVCwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gICAtIElmIExULCBhbmQgRVEgZG9lcyBub3Qgc2F0aXNmeSBMVCwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gICAtIElmIEVRIHNhdGlzZmllcyBldmVyeSBDLCByZXR1cm4gdHJ1ZVxuLy8gICAtIEVsc2UgcmV0dXJuIGZhbHNlXG4vLyAtIElmIEdUXG4vLyAgIC0gSWYgR1Quc2VtdmVyIGlzIGxvd2VyIHRoYW4gYW55ID4gb3IgPj0gY29tcCBpbiBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBHVCBpcyA+PSwgYW5kIEdULnNlbXZlciBkb2VzIG5vdCBzYXRpc2Z5IGV2ZXJ5IEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdULnNlbXZlciBoYXMgYSBwcmVyZWxlYXNlLCBhbmQgbm90IGluIHByZXJlbGVhc2UgbW9kZVxuLy8gICAgIC0gSWYgbm8gQyBoYXMgYSBwcmVyZWxlYXNlIGFuZCB0aGUgR1Quc2VtdmVyIHR1cGxlLCByZXR1cm4gZmFsc2Vcbi8vIC0gSWYgTFRcbi8vICAgLSBJZiBMVC5zZW12ZXIgaXMgZ3JlYXRlciB0aGFuIGFueSA8IG9yIDw9IGNvbXAgaW4gQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgTFQgaXMgPD0sIGFuZCBMVC5zZW12ZXIgZG9lcyBub3Qgc2F0aXNmeSBldmVyeSBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBHVC5zZW12ZXIgaGFzIGEgcHJlcmVsZWFzZSwgYW5kIG5vdCBpbiBwcmVyZWxlYXNlIG1vZGVcbi8vICAgICAtIElmIG5vIEMgaGFzIGEgcHJlcmVsZWFzZSBhbmQgdGhlIExULnNlbXZlciB0dXBsZSwgcmV0dXJuIGZhbHNlXG4vLyAtIEVsc2UgcmV0dXJuIHRydWVcblxuY29uc3Qgc3Vic2V0ID0gKHN1YiwgZG9tLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKHN1YiA9PT0gZG9tKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHN1YiA9IG5ldyBSYW5nZShzdWIsIG9wdGlvbnMpXG4gIGRvbSA9IG5ldyBSYW5nZShkb20sIG9wdGlvbnMpXG4gIGxldCBzYXdOb25OdWxsID0gZmFsc2VcblxuICBPVVRFUjogZm9yIChjb25zdCBzaW1wbGVTdWIgb2Ygc3ViLnNldCkge1xuICAgIGZvciAoY29uc3Qgc2ltcGxlRG9tIG9mIGRvbS5zZXQpIHtcbiAgICAgIGNvbnN0IGlzU3ViID0gc2ltcGxlU3Vic2V0KHNpbXBsZVN1Yiwgc2ltcGxlRG9tLCBvcHRpb25zKVxuICAgICAgc2F3Tm9uTnVsbCA9IHNhd05vbk51bGwgfHwgaXNTdWIgIT09IG51bGxcbiAgICAgIGlmIChpc1N1Yikge1xuICAgICAgICBjb250aW51ZSBPVVRFUlxuICAgICAgfVxuICAgIH1cbiAgICAvLyB0aGUgbnVsbCBzZXQgaXMgYSBzdWJzZXQgb2YgZXZlcnl0aGluZywgYnV0IG51bGwgc2ltcGxlIHJhbmdlcyBpblxuICAgIC8vIGEgY29tcGxleCByYW5nZSBzaG91bGQgYmUgaWdub3JlZC4gIHNvIGlmIHdlIHNhdyBhIG5vbi1udWxsIHJhbmdlLFxuICAgIC8vIHRoZW4gd2Uga25vdyB0aGlzIGlzbid0IGEgc3Vic2V0LCBidXQgaWYgRVZFUlkgc2ltcGxlIHJhbmdlIHdhcyBudWxsLFxuICAgIC8vIHRoZW4gaXQgaXMgYSBzdWJzZXQuXG4gICAgaWYgKHNhd05vbk51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5jb25zdCBtaW5pbXVtVmVyc2lvbldpdGhQcmVSZWxlYXNlID0gW25ldyBDb21wYXJhdG9yKCc+PTAuMC4wLTAnKV1cbmNvbnN0IG1pbmltdW1WZXJzaW9uID0gW25ldyBDb21wYXJhdG9yKCc+PTAuMC4wJyldXG5cbmNvbnN0IHNpbXBsZVN1YnNldCA9IChzdWIsIGRvbSwgb3B0aW9ucykgPT4ge1xuICBpZiAoc3ViID09PSBkb20pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHN1Yi5sZW5ndGggPT09IDEgJiYgc3ViWzBdLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgaWYgKGRvbS5sZW5ndGggPT09IDEgJiYgZG9tWzBdLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgICAgc3ViID0gbWluaW11bVZlcnNpb25XaXRoUHJlUmVsZWFzZVxuICAgIH0gZWxzZSB7XG4gICAgICBzdWIgPSBtaW5pbXVtVmVyc2lvblxuICAgIH1cbiAgfVxuXG4gIGlmIChkb20ubGVuZ3RoID09PSAxICYmIGRvbVswXS5zZW12ZXIgPT09IEFOWSkge1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICBkb20gPSBtaW5pbXVtVmVyc2lvblxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGVxU2V0ID0gbmV3IFNldCgpXG4gIGxldCBndCwgbHRcbiAgZm9yIChjb25zdCBjIG9mIHN1Yikge1xuICAgIGlmIChjLm9wZXJhdG9yID09PSAnPicgfHwgYy5vcGVyYXRvciA9PT0gJz49Jykge1xuICAgICAgZ3QgPSBoaWdoZXJHVChndCwgYywgb3B0aW9ucylcbiAgICB9IGVsc2UgaWYgKGMub3BlcmF0b3IgPT09ICc8JyB8fCBjLm9wZXJhdG9yID09PSAnPD0nKSB7XG4gICAgICBsdCA9IGxvd2VyTFQobHQsIGMsIG9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVxU2V0LmFkZChjLnNlbXZlcilcbiAgICB9XG4gIH1cblxuICBpZiAoZXFTZXQuc2l6ZSA+IDEpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgbGV0IGd0bHRDb21wXG4gIGlmIChndCAmJiBsdCkge1xuICAgIGd0bHRDb21wID0gY29tcGFyZShndC5zZW12ZXIsIGx0LnNlbXZlciwgb3B0aW9ucylcbiAgICBpZiAoZ3RsdENvbXAgPiAwKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0gZWxzZSBpZiAoZ3RsdENvbXAgPT09IDAgJiYgKGd0Lm9wZXJhdG9yICE9PSAnPj0nIHx8IGx0Lm9wZXJhdG9yICE9PSAnPD0nKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvLyB3aWxsIGl0ZXJhdGUgb25lIG9yIHplcm8gdGltZXNcbiAgZm9yIChjb25zdCBlcSBvZiBlcVNldCkge1xuICAgIGlmIChndCAmJiAhc2F0aXNmaWVzKGVxLCBTdHJpbmcoZ3QpLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAobHQgJiYgIXNhdGlzZmllcyhlcSwgU3RyaW5nKGx0KSwgb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjIG9mIGRvbSkge1xuICAgICAgaWYgKCFzYXRpc2ZpZXMoZXEsIFN0cmluZyhjKSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGxldCBoaWdoZXIsIGxvd2VyXG4gIGxldCBoYXNEb21MVCwgaGFzRG9tR1RcbiAgLy8gaWYgdGhlIHN1YnNldCBoYXMgYSBwcmVyZWxlYXNlLCB3ZSBuZWVkIGEgY29tcGFyYXRvciBpbiB0aGUgc3VwZXJzZXRcbiAgLy8gd2l0aCB0aGUgc2FtZSB0dXBsZSBhbmQgYSBwcmVyZWxlYXNlLCBvciBpdCdzIG5vdCBhIHN1YnNldFxuICBsZXQgbmVlZERvbUxUUHJlID0gbHQgJiZcbiAgICAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgIGx0LnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCA/IGx0LnNlbXZlciA6IGZhbHNlXG4gIGxldCBuZWVkRG9tR1RQcmUgPSBndCAmJlxuICAgICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgZ3Quc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID8gZ3Quc2VtdmVyIDogZmFsc2VcbiAgLy8gZXhjZXB0aW9uOiA8MS4yLjMtMCBpcyB0aGUgc2FtZSBhcyA8MS4yLjNcbiAgaWYgKG5lZWREb21MVFByZSAmJiBuZWVkRG9tTFRQcmUucHJlcmVsZWFzZS5sZW5ndGggPT09IDEgJiZcbiAgICAgIGx0Lm9wZXJhdG9yID09PSAnPCcgJiYgbmVlZERvbUxUUHJlLnByZXJlbGVhc2VbMF0gPT09IDApIHtcbiAgICBuZWVkRG9tTFRQcmUgPSBmYWxzZVxuICB9XG5cbiAgZm9yIChjb25zdCBjIG9mIGRvbSkge1xuICAgIGhhc0RvbUdUID0gaGFzRG9tR1QgfHwgYy5vcGVyYXRvciA9PT0gJz4nIHx8IGMub3BlcmF0b3IgPT09ICc+PSdcbiAgICBoYXNEb21MVCA9IGhhc0RvbUxUIHx8IGMub3BlcmF0b3IgPT09ICc8JyB8fCBjLm9wZXJhdG9yID09PSAnPD0nXG4gICAgaWYgKGd0KSB7XG4gICAgICBpZiAobmVlZERvbUdUUHJlKSB7XG4gICAgICAgIGlmIChjLnNlbXZlci5wcmVyZWxlYXNlICYmIGMuc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoICYmXG4gICAgICAgICAgICBjLnNlbXZlci5tYWpvciA9PT0gbmVlZERvbUdUUHJlLm1ham9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5taW5vciA9PT0gbmVlZERvbUdUUHJlLm1pbm9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5wYXRjaCA9PT0gbmVlZERvbUdUUHJlLnBhdGNoKSB7XG4gICAgICAgICAgbmVlZERvbUdUUHJlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGMub3BlcmF0b3IgPT09ICc+JyB8fCBjLm9wZXJhdG9yID09PSAnPj0nKSB7XG4gICAgICAgIGhpZ2hlciA9IGhpZ2hlckdUKGd0LCBjLCBvcHRpb25zKVxuICAgICAgICBpZiAoaGlnaGVyID09PSBjICYmIGhpZ2hlciAhPT0gZ3QpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChndC5vcGVyYXRvciA9PT0gJz49JyAmJiAhc2F0aXNmaWVzKGd0LnNlbXZlciwgU3RyaW5nKGMpLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGx0KSB7XG4gICAgICBpZiAobmVlZERvbUxUUHJlKSB7XG4gICAgICAgIGlmIChjLnNlbXZlci5wcmVyZWxlYXNlICYmIGMuc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoICYmXG4gICAgICAgICAgICBjLnNlbXZlci5tYWpvciA9PT0gbmVlZERvbUxUUHJlLm1ham9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5taW5vciA9PT0gbmVlZERvbUxUUHJlLm1pbm9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5wYXRjaCA9PT0gbmVlZERvbUxUUHJlLnBhdGNoKSB7XG4gICAgICAgICAgbmVlZERvbUxUUHJlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGMub3BlcmF0b3IgPT09ICc8JyB8fCBjLm9wZXJhdG9yID09PSAnPD0nKSB7XG4gICAgICAgIGxvd2VyID0gbG93ZXJMVChsdCwgYywgb3B0aW9ucylcbiAgICAgICAgaWYgKGxvd2VyID09PSBjICYmIGxvd2VyICE9PSBsdCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGx0Lm9wZXJhdG9yID09PSAnPD0nICYmICFzYXRpc2ZpZXMobHQuc2VtdmVyLCBTdHJpbmcoYyksIG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWMub3BlcmF0b3IgJiYgKGx0IHx8IGd0KSAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlcmUgd2FzIGEgPCBvciA+LCBhbmQgbm90aGluZyBpbiB0aGUgZG9tLCB0aGVuIG11c3QgYmUgZmFsc2VcbiAgLy8gVU5MRVNTIGl0IHdhcyBsaW1pdGVkIGJ5IGFub3RoZXIgcmFuZ2UgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAgLy8gRWcsID4xLjAuMCA8MS4wLjEgaXMgc3RpbGwgYSBzdWJzZXQgb2YgPDIuMC4wXG4gIGlmIChndCAmJiBoYXNEb21MVCAmJiAhbHQgJiYgZ3RsdENvbXAgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChsdCAmJiBoYXNEb21HVCAmJiAhZ3QgJiYgZ3RsdENvbXAgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIHdlIG5lZWRlZCBhIHByZXJlbGVhc2UgcmFuZ2UgaW4gYSBzcGVjaWZpYyB0dXBsZSwgYnV0IGRpZG4ndCBnZXQgb25lXG4gIC8vIHRoZW4gdGhpcyBpc24ndCBhIHN1YnNldC4gIGVnID49MS4yLjMtcHJlIGlzIG5vdCBhIHN1YnNldCBvZiA+PTEuMC4wLFxuICAvLyBiZWNhdXNlIGl0IGluY2x1ZGVzIHByZXJlbGVhc2VzIGluIHRoZSAxLjIuMyB0dXBsZVxuICBpZiAobmVlZERvbUdUUHJlIHx8IG5lZWREb21MVFByZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLy8gPj0xLjIuMyBpcyBsb3dlciB0aGFuID4xLjIuM1xuY29uc3QgaGlnaGVyR1QgPSAoYSwgYiwgb3B0aW9ucykgPT4ge1xuICBpZiAoIWEpIHtcbiAgICByZXR1cm4gYlxuICB9XG4gIGNvbnN0IGNvbXAgPSBjb21wYXJlKGEuc2VtdmVyLCBiLnNlbXZlciwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXAgPiAwID8gYVxuICAgIDogY29tcCA8IDAgPyBiXG4gICAgOiBiLm9wZXJhdG9yID09PSAnPicgJiYgYS5vcGVyYXRvciA9PT0gJz49JyA/IGJcbiAgICA6IGFcbn1cblxuLy8gPD0xLjIuMyBpcyBoaWdoZXIgdGhhbiA8MS4yLjNcbmNvbnN0IGxvd2VyTFQgPSAoYSwgYiwgb3B0aW9ucykgPT4ge1xuICBpZiAoIWEpIHtcbiAgICByZXR1cm4gYlxuICB9XG4gIGNvbnN0IGNvbXAgPSBjb21wYXJlKGEuc2VtdmVyLCBiLnNlbXZlciwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXAgPCAwID8gYVxuICAgIDogY29tcCA+IDAgPyBiXG4gICAgOiBiLm9wZXJhdG9yID09PSAnPCcgJiYgYS5vcGVyYXRvciA9PT0gJzw9JyA/IGJcbiAgICA6IGFcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdWJzZXRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIGp1c3QgcHJlLWxvYWQgYWxsIHRoZSBzdHVmZiB0aGF0IGluZGV4LmpzIGxhemlseSBleHBvcnRzXG5jb25zdCBpbnRlcm5hbFJlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9yZScpXG5jb25zdCBjb25zdGFudHMgPSByZXF1aXJlKCcuL2ludGVybmFsL2NvbnN0YW50cycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGlkZW50aWZpZXJzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9pZGVudGlmaWVycycpXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3BhcnNlJylcbmNvbnN0IHZhbGlkID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvdmFsaWQnKVxuY29uc3QgY2xlYW4gPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jbGVhbicpXG5jb25zdCBpbmMgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9pbmMnKVxuY29uc3QgZGlmZiA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2RpZmYnKVxuY29uc3QgbWFqb3IgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9tYWpvcicpXG5jb25zdCBtaW5vciA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL21pbm9yJylcbmNvbnN0IHBhdGNoID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcGF0Y2gnKVxuY29uc3QgcHJlcmVsZWFzZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3ByZXJlbGVhc2UnKVxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUnKVxuY29uc3QgcmNvbXBhcmUgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9yY29tcGFyZScpXG5jb25zdCBjb21wYXJlTG9vc2UgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jb21wYXJlLWxvb3NlJylcbmNvbnN0IGNvbXBhcmVCdWlsZCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUtYnVpbGQnKVxuY29uc3Qgc29ydCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3NvcnQnKVxuY29uc3QgcnNvcnQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9yc29ydCcpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2d0JylcbmNvbnN0IGx0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbHQnKVxuY29uc3QgZXEgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9lcScpXG5jb25zdCBuZXEgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9uZXEnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZ3RlJylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2x0ZScpXG5jb25zdCBjbXAgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jbXAnKVxuY29uc3QgY29lcmNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29lcmNlJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuL2NsYXNzZXMvY29tcGFyYXRvcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9zYXRpc2ZpZXMnKVxuY29uc3QgdG9Db21wYXJhdG9ycyA9IHJlcXVpcmUoJy4vcmFuZ2VzL3RvLWNvbXBhcmF0b3JzJylcbmNvbnN0IG1heFNhdGlzZnlpbmcgPSByZXF1aXJlKCcuL3Jhbmdlcy9tYXgtc2F0aXNmeWluZycpXG5jb25zdCBtaW5TYXRpc2Z5aW5nID0gcmVxdWlyZSgnLi9yYW5nZXMvbWluLXNhdGlzZnlpbmcnKVxuY29uc3QgbWluVmVyc2lvbiA9IHJlcXVpcmUoJy4vcmFuZ2VzL21pbi12ZXJzaW9uJylcbmNvbnN0IHZhbGlkUmFuZ2UgPSByZXF1aXJlKCcuL3Jhbmdlcy92YWxpZCcpXG5jb25zdCBvdXRzaWRlID0gcmVxdWlyZSgnLi9yYW5nZXMvb3V0c2lkZScpXG5jb25zdCBndHIgPSByZXF1aXJlKCcuL3Jhbmdlcy9ndHInKVxuY29uc3QgbHRyID0gcmVxdWlyZSgnLi9yYW5nZXMvbHRyJylcbmNvbnN0IGludGVyc2VjdHMgPSByZXF1aXJlKCcuL3Jhbmdlcy9pbnRlcnNlY3RzJylcbmNvbnN0IHNpbXBsaWZ5UmFuZ2UgPSByZXF1aXJlKCcuL3Jhbmdlcy9zaW1wbGlmeScpXG5jb25zdCBzdWJzZXQgPSByZXF1aXJlKCcuL3Jhbmdlcy9zdWJzZXQnKVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBhcnNlLFxuICB2YWxpZCxcbiAgY2xlYW4sXG4gIGluYyxcbiAgZGlmZixcbiAgbWFqb3IsXG4gIG1pbm9yLFxuICBwYXRjaCxcbiAgcHJlcmVsZWFzZSxcbiAgY29tcGFyZSxcbiAgcmNvbXBhcmUsXG4gIGNvbXBhcmVMb29zZSxcbiAgY29tcGFyZUJ1aWxkLFxuICBzb3J0LFxuICByc29ydCxcbiAgZ3QsXG4gIGx0LFxuICBlcSxcbiAgbmVxLFxuICBndGUsXG4gIGx0ZSxcbiAgY21wLFxuICBjb2VyY2UsXG4gIENvbXBhcmF0b3IsXG4gIFJhbmdlLFxuICBzYXRpc2ZpZXMsXG4gIHRvQ29tcGFyYXRvcnMsXG4gIG1heFNhdGlzZnlpbmcsXG4gIG1pblNhdGlzZnlpbmcsXG4gIG1pblZlcnNpb24sXG4gIHZhbGlkUmFuZ2UsXG4gIG91dHNpZGUsXG4gIGd0cixcbiAgbHRyLFxuICBpbnRlcnNlY3RzLFxuICBzaW1wbGlmeVJhbmdlLFxuICBzdWJzZXQsXG4gIFNlbVZlcixcbiAgcmU6IGludGVybmFsUmUucmUsXG4gIHNyYzogaW50ZXJuYWxSZS5zcmMsXG4gIHRva2VuczogaW50ZXJuYWxSZS50LFxuICBTRU1WRVJfU1BFQ19WRVJTSU9OOiBjb25zdGFudHMuU0VNVkVSX1NQRUNfVkVSU0lPTixcbiAgUkVMRUFTRV9UWVBFUzogY29uc3RhbnRzLlJFTEVBU0VfVFlQRVMsXG4gIGNvbXBhcmVJZGVudGlmaWVyczogaWRlbnRpZmllcnMuY29tcGFyZUlkZW50aWZpZXJzLFxuICByY29tcGFyZUlkZW50aWZpZXJzOiBpZGVudGlmaWVycy5yY29tcGFyZUlkZW50aWZpZXJzLFxufVxuIiwKICAgICJjb25zdCBzZW12ZXIgPSByZXF1aXJlKCdzZW12ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZW12ZXIuc2F0aXNmaWVzKHByb2Nlc3MudmVyc2lvbiwgJz49MTUuNy4wJyk7XG4iLAogICAgImNvbnN0IHNlbXZlciA9IHJlcXVpcmUoJ3NlbXZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbXZlci5zYXRpc2ZpZXMocHJvY2Vzcy52ZXJzaW9uLCAnPj0xNi45LjAnKTtcbiIsCiAgICAiY29uc3QgQVNZTU1FVFJJQ19LRVlfREVUQUlMU19TVVBQT1JURUQgPSByZXF1aXJlKCcuL2FzeW1tZXRyaWNLZXlEZXRhaWxzU3VwcG9ydGVkJyk7XG5jb25zdCBSU0FfUFNTX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCA9IHJlcXVpcmUoJy4vcnNhUHNzS2V5RGV0YWlsc1N1cHBvcnRlZCcpO1xuXG5jb25zdCBhbGxvd2VkQWxnb3JpdGhtc0ZvcktleXMgPSB7XG4gICdlYyc6IFsnRVMyNTYnLCAnRVMzODQnLCAnRVM1MTInXSxcbiAgJ3JzYSc6IFsnUlMyNTYnLCAnUFMyNTYnLCAnUlMzODQnLCAnUFMzODQnLCAnUlM1MTInLCAnUFM1MTInXSxcbiAgJ3JzYS1wc3MnOiBbJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJ11cbn07XG5cbmNvbnN0IGFsbG93ZWRDdXJ2ZXMgPSB7XG4gIEVTMjU2OiAncHJpbWUyNTZ2MScsXG4gIEVTMzg0OiAnc2VjcDM4NHIxJyxcbiAgRVM1MTI6ICdzZWNwNTIxcjEnLFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihhbGdvcml0aG0sIGtleSkge1xuICBpZiAoIWFsZ29yaXRobSB8fCAha2V5KSByZXR1cm47XG5cbiAgY29uc3Qga2V5VHlwZSA9IGtleS5hc3ltbWV0cmljS2V5VHlwZTtcbiAgaWYgKCFrZXlUeXBlKSByZXR1cm47XG5cbiAgY29uc3QgYWxsb3dlZEFsZ29yaXRobXMgPSBhbGxvd2VkQWxnb3JpdGhtc0ZvcktleXNba2V5VHlwZV07XG5cbiAgaWYgKCFhbGxvd2VkQWxnb3JpdGhtcykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBrZXkgdHlwZSBcIiR7a2V5VHlwZX1cIi5gKTtcbiAgfVxuXG4gIGlmICghYWxsb3dlZEFsZ29yaXRobXMuaW5jbHVkZXMoYWxnb3JpdGhtKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgXCJhbGdcIiBwYXJhbWV0ZXIgZm9yIFwiJHtrZXlUeXBlfVwiIGtleSB0eXBlIG11c3QgYmUgb25lIG9mOiAke2FsbG93ZWRBbGdvcml0aG1zLmpvaW4oJywgJyl9LmApXG4gIH1cblxuICAvKlxuICAgKiBJZ25vcmUgdGhlIG5leHQgYmxvY2sgZnJvbSB0ZXN0IGNvdmVyYWdlIGJlY2F1c2UgaXQgZ2V0cyBleGVjdXRlZFxuICAgKiBjb25kaXRpb25hbGx5IGRlcGVuZGluZyBvbiB0aGUgTm9kZSB2ZXJzaW9uLiBOb3QgaWdub3JpbmcgaXQgd291bGRcbiAgICogcHJldmVudCB1cyBmcm9tIHJlYWNoaW5nIHRoZSB0YXJnZXQgJSBvZiBjb3ZlcmFnZSBmb3IgdmVyc2lvbnMgb2ZcbiAgICogTm9kZSB1bmRlciAxNS43LjAuXG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoQVNZTU1FVFJJQ19LRVlfREVUQUlMU19TVVBQT1JURUQpIHtcbiAgICBzd2l0Y2ggKGtleVR5cGUpIHtcbiAgICBjYXNlICdlYyc6XG4gICAgICBjb25zdCBrZXlDdXJ2ZSA9IGtleS5hc3ltbWV0cmljS2V5RGV0YWlscy5uYW1lZEN1cnZlO1xuICAgICAgY29uc3QgYWxsb3dlZEN1cnZlID0gYWxsb3dlZEN1cnZlc1thbGdvcml0aG1dO1xuXG4gICAgICBpZiAoa2V5Q3VydmUgIT09IGFsbG93ZWRDdXJ2ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwiYWxnXCIgcGFyYW1ldGVyIFwiJHthbGdvcml0aG19XCIgcmVxdWlyZXMgY3VydmUgXCIke2FsbG93ZWRDdXJ2ZX1cIi5gKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncnNhLXBzcyc6XG4gICAgICBpZiAoUlNBX1BTU19LRVlfREVUQUlMU19TVVBQT1JURUQpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gcGFyc2VJbnQoYWxnb3JpdGhtLnNsaWNlKC0zKSwgMTApO1xuICAgICAgICBjb25zdCB7IGhhc2hBbGdvcml0aG0sIG1nZjFIYXNoQWxnb3JpdGhtLCBzYWx0TGVuZ3RoIH0gPSBrZXkuYXN5bW1ldHJpY0tleURldGFpbHM7XG5cbiAgICAgICAgaWYgKGhhc2hBbGdvcml0aG0gIT09IGBzaGEke2xlbmd0aH1gIHx8IG1nZjFIYXNoQWxnb3JpdGhtICE9PSBoYXNoQWxnb3JpdGhtKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleSBmb3IgdGhpcyBvcGVyYXRpb24sIGl0cyBSU0EtUFNTIHBhcmFtZXRlcnMgZG8gbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBvZiBcImFsZ1wiICR7YWxnb3JpdGhtfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzYWx0TGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgc2FsdExlbmd0aCA+IGxlbmd0aCA+PiAzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleSBmb3IgdGhpcyBvcGVyYXRpb24sIGl0cyBSU0EtUFNTIHBhcmFtZXRlciBzYWx0TGVuZ3RoIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBvZiBcImFsZ1wiICR7YWxnb3JpdGhtfS5gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAidmFyIHNlbXZlciA9IHJlcXVpcmUoJ3NlbXZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbXZlci5zYXRpc2ZpZXMocHJvY2Vzcy52ZXJzaW9uLCAnXjYuMTIuMCB8fCA+PTguMC4wJyk7XG4iLAogICAgImNvbnN0IEpzb25XZWJUb2tlbkVycm9yID0gcmVxdWlyZSgnLi9saWIvSnNvbldlYlRva2VuRXJyb3InKTtcbmNvbnN0IE5vdEJlZm9yZUVycm9yID0gcmVxdWlyZSgnLi9saWIvTm90QmVmb3JlRXJyb3InKTtcbmNvbnN0IFRva2VuRXhwaXJlZEVycm9yID0gcmVxdWlyZSgnLi9saWIvVG9rZW5FeHBpcmVkRXJyb3InKTtcbmNvbnN0IGRlY29kZSA9IHJlcXVpcmUoJy4vZGVjb2RlJyk7XG5jb25zdCB0aW1lc3BhbiA9IHJlcXVpcmUoJy4vbGliL3RpbWVzcGFuJyk7XG5jb25zdCB2YWxpZGF0ZUFzeW1tZXRyaWNLZXkgPSByZXF1aXJlKCcuL2xpYi92YWxpZGF0ZUFzeW1tZXRyaWNLZXknKTtcbmNvbnN0IFBTX1NVUFBPUlRFRCA9IHJlcXVpcmUoJy4vbGliL3BzU3VwcG9ydGVkJyk7XG5jb25zdCBqd3MgPSByZXF1aXJlKCdqd3MnKTtcbmNvbnN0IHtLZXlPYmplY3QsIGNyZWF0ZVNlY3JldEtleSwgY3JlYXRlUHVibGljS2V5fSA9IHJlcXVpcmUoXCJjcnlwdG9cIik7XG5cbmNvbnN0IFBVQl9LRVlfQUxHUyA9IFsnUlMyNTYnLCAnUlMzODQnLCAnUlM1MTInXTtcbmNvbnN0IEVDX0tFWV9BTEdTID0gWydFUzI1NicsICdFUzM4NCcsICdFUzUxMiddO1xuY29uc3QgUlNBX0tFWV9BTEdTID0gWydSUzI1NicsICdSUzM4NCcsICdSUzUxMiddO1xuY29uc3QgSFNfQUxHUyA9IFsnSFMyNTYnLCAnSFMzODQnLCAnSFM1MTInXTtcblxuaWYgKFBTX1NVUFBPUlRFRCkge1xuICBQVUJfS0VZX0FMR1Muc3BsaWNlKFBVQl9LRVlfQUxHUy5sZW5ndGgsIDAsICdQUzI1NicsICdQUzM4NCcsICdQUzUxMicpO1xuICBSU0FfS0VZX0FMR1Muc3BsaWNlKFJTQV9LRVlfQUxHUy5sZW5ndGgsIDAsICdQUzI1NicsICdQUzM4NCcsICdQUzUxMicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChqd3RTdHJpbmcsIHNlY3JldE9yUHVibGljS2V5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAoKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSAmJiAhY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgLy9jbG9uZSB0aGlzIG9iamVjdCBzaW5jZSB3ZSBhcmUgZ29pbmcgdG8gbXV0YXRlIGl0LlxuICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG5cbiAgbGV0IGRvbmU7XG5cbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgZG9uZSA9IGNhbGxiYWNrO1xuICB9IGVsc2Uge1xuICAgIGRvbmUgPSBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHRocm93IGVycjtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH07XG4gIH1cblxuICBpZiAob3B0aW9ucy5jbG9ja1RpbWVzdGFtcCAmJiB0eXBlb2Ygb3B0aW9ucy5jbG9ja1RpbWVzdGFtcCAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2Nsb2NrVGltZXN0YW1wIG11c3QgYmUgYSBudW1iZXInKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5ub25jZSAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2Ygb3B0aW9ucy5ub25jZSAhPT0gJ3N0cmluZycgfHwgb3B0aW9ucy5ub25jZS50cmltKCkgPT09ICcnKSkge1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignbm9uY2UgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5hbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5hbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXMgIT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignYWxsb3dJbnZhbGlkQXN5bW1ldHJpY0tleVR5cGVzIG11c3QgYmUgYSBib29sZWFuJykpO1xuICB9XG5cbiAgY29uc3QgY2xvY2tUaW1lc3RhbXAgPSBvcHRpb25zLmNsb2NrVGltZXN0YW1wIHx8IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG4gIGlmICghand0U3RyaW5nKXtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBtdXN0IGJlIHByb3ZpZGVkJykpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBqd3RTdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3QgbXVzdCBiZSBhIHN0cmluZycpKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gand0U3RyaW5nLnNwbGl0KCcuJyk7XG5cbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMyl7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3QgbWFsZm9ybWVkJykpO1xuICB9XG5cbiAgbGV0IGRlY29kZWRUb2tlbjtcblxuICB0cnkge1xuICAgIGRlY29kZWRUb2tlbiA9IGRlY29kZShqd3RTdHJpbmcsIHsgY29tcGxldGU6IHRydWUgfSk7XG4gIH0gY2F0Y2goZXJyKSB7XG4gICAgcmV0dXJuIGRvbmUoZXJyKTtcbiAgfVxuXG4gIGlmICghZGVjb2RlZFRva2VuKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIHRva2VuJykpO1xuICB9XG5cbiAgY29uc3QgaGVhZGVyID0gZGVjb2RlZFRva2VuLmhlYWRlcjtcbiAgbGV0IGdldFNlY3JldDtcblxuICBpZih0eXBlb2Ygc2VjcmV0T3JQdWJsaWNLZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZighY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcigndmVyaWZ5IG11c3QgYmUgY2FsbGVkIGFzeW5jaHJvbm91cyBpZiBzZWNyZXQgb3IgcHVibGljIGtleSBpcyBwcm92aWRlZCBhcyBhIGNhbGxiYWNrJykpO1xuICAgIH1cblxuICAgIGdldFNlY3JldCA9IHNlY3JldE9yUHVibGljS2V5O1xuICB9XG4gIGVsc2Uge1xuICAgIGdldFNlY3JldCA9IGZ1bmN0aW9uKGhlYWRlciwgc2VjcmV0Q2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBzZWNyZXRDYWxsYmFjayhudWxsLCBzZWNyZXRPclB1YmxpY0tleSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBnZXRTZWNyZXQoaGVhZGVyLCBmdW5jdGlvbihlcnIsIHNlY3JldE9yUHVibGljS2V5KSB7XG4gICAgaWYoZXJyKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2Vycm9yIGluIHNlY3JldCBvciBwdWJsaWMga2V5IGNhbGxiYWNrOiAnICsgZXJyLm1lc3NhZ2UpKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNTaWduYXR1cmUgPSBwYXJ0c1syXS50cmltKCkgIT09ICcnO1xuXG4gICAgaWYgKCFoYXNTaWduYXR1cmUgJiYgc2VjcmV0T3JQdWJsaWNLZXkpe1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3Qgc2lnbmF0dXJlIGlzIHJlcXVpcmVkJykpO1xuICAgIH1cblxuICAgIGlmIChoYXNTaWduYXR1cmUgJiYgIXNlY3JldE9yUHVibGljS2V5KSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ3NlY3JldCBvciBwdWJsaWMga2V5IG11c3QgYmUgcHJvdmlkZWQnKSk7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNTaWduYXR1cmUgJiYgIW9wdGlvbnMuYWxnb3JpdGhtcykge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdwbGVhc2Ugc3BlY2lmeSBcIm5vbmVcIiBpbiBcImFsZ29yaXRobXNcIiB0byB2ZXJpZnkgdW5zaWduZWQgdG9rZW5zJykpO1xuICAgIH1cblxuICAgIGlmIChzZWNyZXRPclB1YmxpY0tleSAhPSBudWxsICYmICEoc2VjcmV0T3JQdWJsaWNLZXkgaW5zdGFuY2VvZiBLZXlPYmplY3QpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZWNyZXRPclB1YmxpY0tleSA9IGNyZWF0ZVB1YmxpY0tleShzZWNyZXRPclB1YmxpY0tleSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2VjcmV0T3JQdWJsaWNLZXkgPSBjcmVhdGVTZWNyZXRLZXkodHlwZW9mIHNlY3JldE9yUHVibGljS2V5ID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKHNlY3JldE9yUHVibGljS2V5KSA6IHNlY3JldE9yUHVibGljS2V5KTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignc2VjcmV0T3JQdWJsaWNLZXkgaXMgbm90IHZhbGlkIGtleSBtYXRlcmlhbCcpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmFsZ29yaXRobXMpIHtcbiAgICAgIGlmIChzZWNyZXRPclB1YmxpY0tleS50eXBlID09PSAnc2VjcmV0Jykge1xuICAgICAgICBvcHRpb25zLmFsZ29yaXRobXMgPSBIU19BTEdTO1xuICAgICAgfSBlbHNlIGlmIChbJ3JzYScsICdyc2EtcHNzJ10uaW5jbHVkZXMoc2VjcmV0T3JQdWJsaWNLZXkuYXN5bW1ldHJpY0tleVR5cGUpKSB7XG4gICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtcyA9IFJTQV9LRVlfQUxHU1xuICAgICAgfSBlbHNlIGlmIChzZWNyZXRPclB1YmxpY0tleS5hc3ltbWV0cmljS2V5VHlwZSA9PT0gJ2VjJykge1xuICAgICAgICBvcHRpb25zLmFsZ29yaXRobXMgPSBFQ19LRVlfQUxHU1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5hbGdvcml0aG1zID0gUFVCX0tFWV9BTEdTXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYWxnb3JpdGhtcy5pbmRleE9mKGRlY29kZWRUb2tlbi5oZWFkZXIuYWxnKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaW52YWxpZCBhbGdvcml0aG0nKSk7XG4gICAgfVxuXG4gICAgaWYgKGhlYWRlci5hbGcuc3RhcnRzV2l0aCgnSFMnKSAmJiBzZWNyZXRPclB1YmxpY0tleS50eXBlICE9PSAnc2VjcmV0Jykge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKChgc2VjcmV0T3JQdWJsaWNLZXkgbXVzdCBiZSBhIHN5bW1ldHJpYyBrZXkgd2hlbiB1c2luZyAke2hlYWRlci5hbGd9YCkpKVxuICAgIH0gZWxzZSBpZiAoL14oPzpSU3xQU3xFUykvLnRlc3QoaGVhZGVyLmFsZykgJiYgc2VjcmV0T3JQdWJsaWNLZXkudHlwZSAhPT0gJ3B1YmxpYycpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcigoYHNlY3JldE9yUHVibGljS2V5IG11c3QgYmUgYW4gYXN5bW1ldHJpYyBrZXkgd2hlbiB1c2luZyAke2hlYWRlci5hbGd9YCkpKVxuICAgIH1cblxuICAgIGlmICghb3B0aW9ucy5hbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbGlkYXRlQXN5bW1ldHJpY0tleShoZWFkZXIuYWxnLCBzZWNyZXRPclB1YmxpY0tleSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBkb25lKGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB2YWxpZDtcblxuICAgIHRyeSB7XG4gICAgICB2YWxpZCA9IGp3cy52ZXJpZnkoand0U3RyaW5nLCBkZWNvZGVkVG9rZW4uaGVhZGVyLmFsZywgc2VjcmV0T3JQdWJsaWNLZXkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBkb25lKGUpO1xuICAgIH1cblxuICAgIGlmICghdmFsaWQpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaW52YWxpZCBzaWduYXR1cmUnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IGRlY29kZWRUb2tlbi5wYXlsb2FkO1xuXG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLm5iZiAhPT0gJ3VuZGVmaW5lZCcgJiYgIW9wdGlvbnMuaWdub3JlTm90QmVmb3JlKSB7XG4gICAgICBpZiAodHlwZW9mIHBheWxvYWQubmJmICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2ludmFsaWQgbmJmIHZhbHVlJykpO1xuICAgICAgfVxuICAgICAgaWYgKHBheWxvYWQubmJmID4gY2xvY2tUaW1lc3RhbXAgKyAob3B0aW9ucy5jbG9ja1RvbGVyYW5jZSB8fCAwKSkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgTm90QmVmb3JlRXJyb3IoJ2p3dCBub3QgYWN0aXZlJywgbmV3IERhdGUocGF5bG9hZC5uYmYgKiAxMDAwKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcGF5bG9hZC5leHAgIT09ICd1bmRlZmluZWQnICYmICFvcHRpb25zLmlnbm9yZUV4cGlyYXRpb24pIHtcbiAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC5leHAgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaW52YWxpZCBleHAgdmFsdWUnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY2xvY2tUaW1lc3RhbXAgPj0gcGF5bG9hZC5leHAgKyAob3B0aW9ucy5jbG9ja1RvbGVyYW5jZSB8fCAwKSkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgVG9rZW5FeHBpcmVkRXJyb3IoJ2p3dCBleHBpcmVkJywgbmV3IERhdGUocGF5bG9hZC5leHAgKiAxMDAwKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmF1ZGllbmNlKSB7XG4gICAgICBjb25zdCBhdWRpZW5jZXMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuYXVkaWVuY2UpID8gb3B0aW9ucy5hdWRpZW5jZSA6IFtvcHRpb25zLmF1ZGllbmNlXTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5hdWQpID8gcGF5bG9hZC5hdWQgOiBbcGF5bG9hZC5hdWRdO1xuXG4gICAgICBjb25zdCBtYXRjaCA9IHRhcmdldC5zb21lKGZ1bmN0aW9uICh0YXJnZXRBdWRpZW5jZSkge1xuICAgICAgICByZXR1cm4gYXVkaWVuY2VzLnNvbWUoZnVuY3Rpb24gKGF1ZGllbmNlKSB7XG4gICAgICAgICAgcmV0dXJuIGF1ZGllbmNlIGluc3RhbmNlb2YgUmVnRXhwID8gYXVkaWVuY2UudGVzdCh0YXJnZXRBdWRpZW5jZSkgOiBhdWRpZW5jZSA9PT0gdGFyZ2V0QXVkaWVuY2U7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3QgYXVkaWVuY2UgaW52YWxpZC4gZXhwZWN0ZWQ6ICcgKyBhdWRpZW5jZXMuam9pbignIG9yICcpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaXNzdWVyKSB7XG4gICAgICBjb25zdCBpbnZhbGlkX2lzc3VlciA9XG4gICAgICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucy5pc3N1ZXIgPT09ICdzdHJpbmcnICYmIHBheWxvYWQuaXNzICE9PSBvcHRpb25zLmlzc3VlcikgfHxcbiAgICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5pc3N1ZXIpICYmIG9wdGlvbnMuaXNzdWVyLmluZGV4T2YocGF5bG9hZC5pc3MpID09PSAtMSk7XG5cbiAgICAgIGlmIChpbnZhbGlkX2lzc3Vlcikge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBpc3N1ZXIgaW52YWxpZC4gZXhwZWN0ZWQ6ICcgKyBvcHRpb25zLmlzc3VlcikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN1YmplY3QpIHtcbiAgICAgIGlmIChwYXlsb2FkLnN1YiAhPT0gb3B0aW9ucy5zdWJqZWN0KSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IHN1YmplY3QgaW52YWxpZC4gZXhwZWN0ZWQ6ICcgKyBvcHRpb25zLnN1YmplY3QpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5qd3RpZCkge1xuICAgICAgaWYgKHBheWxvYWQuanRpICE9PSBvcHRpb25zLmp3dGlkKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IGp3dGlkIGludmFsaWQuIGV4cGVjdGVkOiAnICsgb3B0aW9ucy5qd3RpZCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm5vbmNlKSB7XG4gICAgICBpZiAocGF5bG9hZC5ub25jZSAhPT0gb3B0aW9ucy5ub25jZSkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBub25jZSBpbnZhbGlkLiBleHBlY3RlZDogJyArIG9wdGlvbnMubm9uY2UpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5tYXhBZ2UpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC5pYXQgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaWF0IHJlcXVpcmVkIHdoZW4gbWF4QWdlIGlzIHNwZWNpZmllZCcpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF4QWdlVGltZXN0YW1wID0gdGltZXNwYW4ob3B0aW9ucy5tYXhBZ2UsIHBheWxvYWQuaWF0KTtcbiAgICAgIGlmICh0eXBlb2YgbWF4QWdlVGltZXN0YW1wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ1wibWF4QWdlXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMgb3Igc3RyaW5nIHJlcHJlc2VudGluZyBhIHRpbWVzcGFuIGVnOiBcIjFkXCIsIFwiMjBoXCIsIDYwJykpO1xuICAgICAgfVxuICAgICAgaWYgKGNsb2NrVGltZXN0YW1wID49IG1heEFnZVRpbWVzdGFtcCArIChvcHRpb25zLmNsb2NrVG9sZXJhbmNlIHx8IDApKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBUb2tlbkV4cGlyZWRFcnJvcignbWF4QWdlIGV4Y2VlZGVkJywgbmV3IERhdGUobWF4QWdlVGltZXN0YW1wICogMTAwMCkpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5jb21wbGV0ZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZGVjb2RlZFRva2VuLnNpZ25hdHVyZTtcblxuICAgICAgcmV0dXJuIGRvbmUobnVsbCwge1xuICAgICAgICBoZWFkZXI6IGhlYWRlcixcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduYXR1cmVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkb25lKG51bGwsIHBheWxvYWQpO1xuICB9KTtcbn07XG4iLAogICAgIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxLFxuICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgTkFOID0gMCAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4LCBmcm9tUmlnaHQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIGlmICh2YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xuICB9XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYU5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbnVtYmVyIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogb2YgYHByb3BzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KSxcbiAgICBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIC8vIFNhZmFyaSA4LjEgbWFrZXMgYGFyZ3VtZW50cy5jYWxsZWVgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIC8vIFNhZmFyaSA5IG1ha2VzIGBhcmd1bWVudHMubGVuZ3RoYCBlbnVtZXJhYmxlIGluIHN0cmljdCBtb2RlLlxuICB2YXIgcmVzdWx0ID0gKGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSlcbiAgICA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZylcbiAgICA6IFtdO1xuXG4gIHZhciBsZW5ndGggPSByZXN1bHQubGVuZ3RoLFxuICAgICAgc2tpcEluZGV4ZXMgPSAhIWxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChrZXkgPT0gJ2xlbmd0aCcgfHwgaXNJbmRleChrZXksIGxlbmd0aCkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHwgcmVJc1VpbnQudGVzdCh2YWx1ZSkpICYmXG4gICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gYGNvbGxlY3Rpb25gLiBJZiBgY29sbGVjdGlvbmAgaXMgYSBzdHJpbmcsIGl0J3NcbiAqIGNoZWNrZWQgZm9yIGEgc3Vic3RyaW5nIG9mIGB2YWx1ZWAsIG90aGVyd2lzZVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGlzIHVzZWQgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzXG4gKiB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgY29sbGVjdGlvbmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLnJlZHVjZWAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEsIDIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmluY2x1ZGVzKHsgJ2EnOiAxLCAnYic6IDIgfSwgMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pbmNsdWRlcygnYWJjZCcsICdiYycpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpbmNsdWRlcyhjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4LCBndWFyZCkge1xuICBjb2xsZWN0aW9uID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdmFsdWVzKGNvbGxlY3Rpb24pO1xuICBmcm9tSW5kZXggPSAoZnJvbUluZGV4ICYmICFndWFyZCkgPyB0b0ludGVnZXIoZnJvbUluZGV4KSA6IDA7XG5cbiAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBmcm9tSW5kZXgsIDApO1xuICB9XG4gIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKVxuICAgID8gKGZyb21JbmRleCA8PSBsZW5ndGggJiYgY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpXG4gICAgOiAoISFsZW5ndGggJiYgYmFzZUluZGV4T2YoY29sbGVjdGlvbiwgdmFsdWUsIGZyb21JbmRleCkgPiAtMSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIC8vIFNhZmFyaSA4LjEgbWFrZXMgYGFyZ3VtZW50cy5jYWxsZWVgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgKCFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgfHwgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gYXJnc1RhZyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gKiBpcyBhbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDgtOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheSBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gaXNPYmplY3QodmFsdWUpID8gb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N0cmluZygnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N0cmluZygxKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8udmFsdWVzKG5ldyBGb28pO1xuICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy52YWx1ZXMoJ2hpJyk7XG4gKiAvLyA9PiBbJ2gnLCAnaSddXG4gKi9cbmZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCA/IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzKG9iamVjdCkpIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5jbHVkZXM7XG4iLAogICAgIi8qKlxuICogbG9kYXNoIDMuMC4zIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgMjAxMi0yMDE2IFRoZSBEb2pvIEZvdW5kYXRpb24gPGh0dHA6Ly9kb2pvZm91bmRhdGlvbi5vcmcvPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCAyMDA5LTIwMTYgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqIEF2YWlsYWJsZSB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKi9cblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGJvb2xlYW4gcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Jvb2xlYW4oZmFsc2UpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNCb29sZWFuKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2UgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBib29sVGFnKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQm9vbGVhbjtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gKiBbYE51bWJlci5pc0ludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNJbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBpbnRlZ2VyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNJbnRlZ2VyKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNJbnRlZ2VyKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PSB0b0ludGVnZXIodmFsdWUpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEyLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0Zpbml0ZSgzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9GaW5pdGUoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvRmluaXRlKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICB9XG4gIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDAgPyAtMSA6IDEpO1xuICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gIH1cbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0ludGVnZXIoMy4yKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSW50ZWdlcjtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggMy4wLjMgKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCAyMDEyLTIwMTYgVGhlIERvam8gRm91bmRhdGlvbiA8aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IDIwMDktMjAxNiBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE51bWJlcmAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmUgY2xhc3NpZmllZFxuICogYXMgbnVtYmVycywgdXNlIHRoZSBgXy5pc0Zpbml0ZWAgbWV0aG9kLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTnVtYmVyKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcignMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IG51bWJlclRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNOdW1iZXI7XG4iLAogICAgIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBob3N0IG9iamVjdCBpbiBJRSA8IDkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBob3N0IG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0hvc3RPYmplY3QodmFsdWUpIHtcbiAgLy8gTWFueSBob3N0IG9iamVjdHMgYXJlIGBPYmplY3RgIG9iamVjdHMgdGhhdCBjYW4gY29lcmNlIHRvIHN0cmluZ3NcbiAgLy8gZGVzcGl0ZSBoYXZpbmcgaW1wcm9wZXJseSBkZWZpbmVkIGB0b1N0cmluZ2AgbWV0aG9kcy5cbiAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuICBpZiAodmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSAhISh2YWx1ZSArICcnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuOC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiB9XG4gKlxuICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fFxuICAgICAgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgIT0gb2JqZWN0VGFnIHx8IGlzSG9zdE9iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmXG4gICAgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiYgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdDtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggNC4wLjEgKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCAyMDEyLTIwMTYgVGhlIERvam8gRm91bmRhdGlvbiA8aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IDIwMDktMjAxNiBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHR5cGUgRnVuY3Rpb25cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N0cmluZygnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N0cmluZygxKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N0cmluZztcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgTkFOID0gMCAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50c1xuICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBjYWxscyBhdCB3aGljaCBgZnVuY2AgaXMgbm8gbG9uZ2VyIGludm9rZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gKiAvLyA9PiBBbGxvd3MgYWRkaW5nIHVwIHRvIDQgY29udGFjdHMgdG8gdGhlIGxpc3QuXG4gKi9cbmZ1bmN0aW9uIGJlZm9yZShuLCBmdW5jKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIG4gPSB0b0ludGVnZXIobik7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpZiAoLS1uID4gMCkge1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgICBpZiAobiA8PSAxKSB7XG4gICAgICBmdW5jID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIHJlc3RyaWN0ZWQgdG8gaW52b2tpbmcgYGZ1bmNgIG9uY2UuIFJlcGVhdCBjYWxsc1xuICogdG8gdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludm9jYXRpb24uIFRoZSBgZnVuY2AgaXNcbiAqIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGluaXRpYWxpemUgPSBfLm9uY2UoY3JlYXRlQXBwbGljYXRpb24pO1xuICogaW5pdGlhbGl6ZSgpO1xuICogaW5pdGlhbGl6ZSgpO1xuICogLy8gPT4gYGNyZWF0ZUFwcGxpY2F0aW9uYCBpcyBpbnZva2VkIG9uY2VcbiAqL1xuZnVuY3Rpb24gb25jZShmdW5jKSB7XG4gIHJldHVybiBiZWZvcmUoMiwgZnVuYyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb25jZTtcbiIsCiAgICAiY29uc3QgdGltZXNwYW4gPSByZXF1aXJlKCcuL2xpYi90aW1lc3BhbicpO1xuY29uc3QgUFNfU1VQUE9SVEVEID0gcmVxdWlyZSgnLi9saWIvcHNTdXBwb3J0ZWQnKTtcbmNvbnN0IHZhbGlkYXRlQXN5bW1ldHJpY0tleSA9IHJlcXVpcmUoJy4vbGliL3ZhbGlkYXRlQXN5bW1ldHJpY0tleScpO1xuY29uc3QgandzID0gcmVxdWlyZSgnandzJyk7XG5jb25zdCBpbmNsdWRlcyA9IHJlcXVpcmUoJ2xvZGFzaC5pbmNsdWRlcycpO1xuY29uc3QgaXNCb29sZWFuID0gcmVxdWlyZSgnbG9kYXNoLmlzYm9vbGVhbicpO1xuY29uc3QgaXNJbnRlZ2VyID0gcmVxdWlyZSgnbG9kYXNoLmlzaW50ZWdlcicpO1xuY29uc3QgaXNOdW1iZXIgPSByZXF1aXJlKCdsb2Rhc2guaXNudW1iZXInKTtcbmNvbnN0IGlzUGxhaW5PYmplY3QgPSByZXF1aXJlKCdsb2Rhc2guaXNwbGFpbm9iamVjdCcpO1xuY29uc3QgaXNTdHJpbmcgPSByZXF1aXJlKCdsb2Rhc2guaXNzdHJpbmcnKTtcbmNvbnN0IG9uY2UgPSByZXF1aXJlKCdsb2Rhc2gub25jZScpO1xuY29uc3QgeyBLZXlPYmplY3QsIGNyZWF0ZVNlY3JldEtleSwgY3JlYXRlUHJpdmF0ZUtleSB9ID0gcmVxdWlyZSgnY3J5cHRvJylcblxuY29uc3QgU1VQUE9SVEVEX0FMR1MgPSBbJ1JTMjU2JywgJ1JTMzg0JywgJ1JTNTEyJywgJ0VTMjU2JywgJ0VTMzg0JywgJ0VTNTEyJywgJ0hTMjU2JywgJ0hTMzg0JywgJ0hTNTEyJywgJ25vbmUnXTtcbmlmIChQU19TVVBQT1JURUQpIHtcbiAgU1VQUE9SVEVEX0FMR1Muc3BsaWNlKDMsIDAsICdQUzI1NicsICdQUzM4NCcsICdQUzUxMicpO1xufVxuXG5jb25zdCBzaWduX29wdGlvbnNfc2NoZW1hID0ge1xuICBleHBpcmVzSW46IHsgaXNWYWxpZDogZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkgfHwgKGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZSk7IH0sIG1lc3NhZ2U6ICdcImV4cGlyZXNJblwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzIG9yIHN0cmluZyByZXByZXNlbnRpbmcgYSB0aW1lc3BhbicgfSxcbiAgbm90QmVmb3JlOiB7IGlzVmFsaWQ6IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiBpc0ludGVnZXIodmFsdWUpIHx8IChpc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUpOyB9LCBtZXNzYWdlOiAnXCJub3RCZWZvcmVcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4nIH0sXG4gIGF1ZGllbmNlOiB7IGlzVmFsaWQ6IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiBpc1N0cmluZyh2YWx1ZSkgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSk7IH0sIG1lc3NhZ2U6ICdcImF1ZGllbmNlXCIgbXVzdCBiZSBhIHN0cmluZyBvciBhcnJheScgfSxcbiAgYWxnb3JpdGhtOiB7IGlzVmFsaWQ6IGluY2x1ZGVzLmJpbmQobnVsbCwgU1VQUE9SVEVEX0FMR1MpLCBtZXNzYWdlOiAnXCJhbGdvcml0aG1cIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVudW0gdmFsdWUnIH0sXG4gIGhlYWRlcjogeyBpc1ZhbGlkOiBpc1BsYWluT2JqZWN0LCBtZXNzYWdlOiAnXCJoZWFkZXJcIiBtdXN0IGJlIGFuIG9iamVjdCcgfSxcbiAgZW5jb2Rpbmc6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHN0cmluZycgfSxcbiAgaXNzdWVyOiB7IGlzVmFsaWQ6IGlzU3RyaW5nLCBtZXNzYWdlOiAnXCJpc3N1ZXJcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBzdWJqZWN0OiB7IGlzVmFsaWQ6IGlzU3RyaW5nLCBtZXNzYWdlOiAnXCJzdWJqZWN0XCIgbXVzdCBiZSBhIHN0cmluZycgfSxcbiAgand0aWQ6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcImp3dGlkXCIgbXVzdCBiZSBhIHN0cmluZycgfSxcbiAgbm9UaW1lc3RhbXA6IHsgaXNWYWxpZDogaXNCb29sZWFuLCBtZXNzYWdlOiAnXCJub1RpbWVzdGFtcFwiIG11c3QgYmUgYSBib29sZWFuJyB9LFxuICBrZXlpZDogeyBpc1ZhbGlkOiBpc1N0cmluZywgbWVzc2FnZTogJ1wia2V5aWRcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBtdXRhdGVQYXlsb2FkOiB7IGlzVmFsaWQ6IGlzQm9vbGVhbiwgbWVzc2FnZTogJ1wibXV0YXRlUGF5bG9hZFwiIG11c3QgYmUgYSBib29sZWFuJyB9LFxuICBhbGxvd0luc2VjdXJlS2V5U2l6ZXM6IHsgaXNWYWxpZDogaXNCb29sZWFuLCBtZXNzYWdlOiAnXCJhbGxvd0luc2VjdXJlS2V5U2l6ZXNcIiBtdXN0IGJlIGEgYm9vbGVhbid9LFxuICBhbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXM6IHsgaXNWYWxpZDogaXNCb29sZWFuLCBtZXNzYWdlOiAnXCJhbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXNcIiBtdXN0IGJlIGEgYm9vbGVhbid9XG59O1xuXG5jb25zdCByZWdpc3RlcmVkX2NsYWltc19zY2hlbWEgPSB7XG4gIGlhdDogeyBpc1ZhbGlkOiBpc051bWJlciwgbWVzc2FnZTogJ1wiaWF0XCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMnIH0sXG4gIGV4cDogeyBpc1ZhbGlkOiBpc051bWJlciwgbWVzc2FnZTogJ1wiZXhwXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMnIH0sXG4gIG5iZjogeyBpc1ZhbGlkOiBpc051bWJlciwgbWVzc2FnZTogJ1wibmJmXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMnIH1cbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlKHNjaGVtYSwgYWxsb3dVbmtub3duLCBvYmplY3QsIHBhcmFtZXRlck5hbWUpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KG9iamVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIFwiJyArIHBhcmFtZXRlck5hbWUgKyAnXCIgdG8gYmUgYSBwbGFpbiBvYmplY3QuJyk7XG4gIH1cbiAgT2JqZWN0LmtleXMob2JqZWN0KVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gc2NoZW1hW2tleV07XG4gICAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgICBpZiAoIWFsbG93VW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsga2V5ICsgJ1wiIGlzIG5vdCBhbGxvd2VkIGluIFwiJyArIHBhcmFtZXRlck5hbWUgKyAnXCInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXZhbGlkYXRvci5pc1ZhbGlkKG9iamVjdFtrZXldKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodmFsaWRhdG9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucykge1xuICByZXR1cm4gdmFsaWRhdGUoc2lnbl9vcHRpb25zX3NjaGVtYSwgZmFsc2UsIG9wdGlvbnMsICdvcHRpb25zJyk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUGF5bG9hZChwYXlsb2FkKSB7XG4gIHJldHVybiB2YWxpZGF0ZShyZWdpc3RlcmVkX2NsYWltc19zY2hlbWEsIHRydWUsIHBheWxvYWQsICdwYXlsb2FkJyk7XG59XG5cbmNvbnN0IG9wdGlvbnNfdG9fcGF5bG9hZCA9IHtcbiAgJ2F1ZGllbmNlJzogJ2F1ZCcsXG4gICdpc3N1ZXInOiAnaXNzJyxcbiAgJ3N1YmplY3QnOiAnc3ViJyxcbiAgJ2p3dGlkJzogJ2p0aSdcbn07XG5cbmNvbnN0IG9wdGlvbnNfZm9yX29iamVjdHMgPSBbXG4gICdleHBpcmVzSW4nLFxuICAnbm90QmVmb3JlJyxcbiAgJ25vVGltZXN0YW1wJyxcbiAgJ2F1ZGllbmNlJyxcbiAgJ2lzc3VlcicsXG4gICdzdWJqZWN0JyxcbiAgJ2p3dGlkJyxcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHBheWxvYWQsIHNlY3JldE9yUHJpdmF0ZUtleSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgfVxuXG4gIGNvbnN0IGlzT2JqZWN0UGF5bG9hZCA9IHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIUJ1ZmZlci5pc0J1ZmZlcihwYXlsb2FkKTtcblxuICBjb25zdCBoZWFkZXIgPSBPYmplY3QuYXNzaWduKHtcbiAgICBhbGc6IG9wdGlvbnMuYWxnb3JpdGhtIHx8ICdIUzI1NicsXG4gICAgdHlwOiBpc09iamVjdFBheWxvYWQgPyAnSldUJyA6IHVuZGVmaW5lZCxcbiAgICBraWQ6IG9wdGlvbnMua2V5aWRcbiAgfSwgb3B0aW9ucy5oZWFkZXIpO1xuXG4gIGZ1bmN0aW9uIGZhaWx1cmUoZXJyKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgaWYgKCFzZWNyZXRPclByaXZhdGVLZXkgJiYgb3B0aW9ucy5hbGdvcml0aG0gIT09ICdub25lJykge1xuICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignc2VjcmV0T3JQcml2YXRlS2V5IG11c3QgaGF2ZSBhIHZhbHVlJykpO1xuICB9XG5cbiAgaWYgKHNlY3JldE9yUHJpdmF0ZUtleSAhPSBudWxsICYmICEoc2VjcmV0T3JQcml2YXRlS2V5IGluc3RhbmNlb2YgS2V5T2JqZWN0KSkge1xuICAgIHRyeSB7XG4gICAgICBzZWNyZXRPclByaXZhdGVLZXkgPSBjcmVhdGVQcml2YXRlS2V5KHNlY3JldE9yUHJpdmF0ZUtleSlcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZWNyZXRPclByaXZhdGVLZXkgPSBjcmVhdGVTZWNyZXRLZXkodHlwZW9mIHNlY3JldE9yUHJpdmF0ZUtleSA9PT0gJ3N0cmluZycgPyBCdWZmZXIuZnJvbShzZWNyZXRPclByaXZhdGVLZXkpIDogc2VjcmV0T3JQcml2YXRlS2V5KVxuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ3NlY3JldE9yUHJpdmF0ZUtleSBpcyBub3QgdmFsaWQga2V5IG1hdGVyaWFsJykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChoZWFkZXIuYWxnLnN0YXJ0c1dpdGgoJ0hTJykgJiYgc2VjcmV0T3JQcml2YXRlS2V5LnR5cGUgIT09ICdzZWNyZXQnKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKChgc2VjcmV0T3JQcml2YXRlS2V5IG11c3QgYmUgYSBzeW1tZXRyaWMga2V5IHdoZW4gdXNpbmcgJHtoZWFkZXIuYWxnfWApKSlcbiAgfSBlbHNlIGlmICgvXig/OlJTfFBTfEVTKS8udGVzdChoZWFkZXIuYWxnKSkge1xuICAgIGlmIChzZWNyZXRPclByaXZhdGVLZXkudHlwZSAhPT0gJ3ByaXZhdGUnKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoKGBzZWNyZXRPclByaXZhdGVLZXkgbXVzdCBiZSBhbiBhc3ltbWV0cmljIGtleSB3aGVuIHVzaW5nICR7aGVhZGVyLmFsZ31gKSkpXG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5hbGxvd0luc2VjdXJlS2V5U2l6ZXMgJiZcbiAgICAgICFoZWFkZXIuYWxnLnN0YXJ0c1dpdGgoJ0VTJykgJiZcbiAgICAgIHNlY3JldE9yUHJpdmF0ZUtleS5hc3ltbWV0cmljS2V5RGV0YWlscyAhPT0gdW5kZWZpbmVkICYmIC8vS2V5T2JqZWN0LmFzeW1tZXRyaWNLZXlEZXRhaWxzIGlzIHN1cHBvcnRlZCBpbiBOb2RlIDE1K1xuICAgICAgc2VjcmV0T3JQcml2YXRlS2V5LmFzeW1tZXRyaWNLZXlEZXRhaWxzLm1vZHVsdXNMZW5ndGggPCAyMDQ4KSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoYHNlY3JldE9yUHJpdmF0ZUtleSBoYXMgYSBtaW5pbXVtIGtleSBzaXplIG9mIDIwNDggYml0cyBmb3IgJHtoZWFkZXIuYWxnfWApKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdwYXlsb2FkIGlzIHJlcXVpcmVkJykpO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0UGF5bG9hZCkge1xuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZVBheWxvYWQocGF5bG9hZCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhaWx1cmUoZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMubXV0YXRlUGF5bG9hZCkge1xuICAgICAgcGF5bG9hZCA9IE9iamVjdC5hc3NpZ24oe30scGF5bG9hZCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGludmFsaWRfb3B0aW9ucyA9IG9wdGlvbnNfZm9yX29iamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChvcHQpIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb3B0aW9uc1tvcHRdICE9PSAndW5kZWZpbmVkJztcbiAgICB9KTtcblxuICAgIGlmIChpbnZhbGlkX29wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdpbnZhbGlkICcgKyBpbnZhbGlkX29wdGlvbnMuam9pbignLCcpICsgJyBvcHRpb24gZm9yICcgKyAodHlwZW9mIHBheWxvYWQgKSArICcgcGF5bG9hZCcpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHBheWxvYWQuZXhwICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0aW9ucy5leHBpcmVzSW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdCYWQgXCJvcHRpb25zLmV4cGlyZXNJblwiIG9wdGlvbiB0aGUgcGF5bG9hZCBhbHJlYWR5IGhhcyBhbiBcImV4cFwiIHByb3BlcnR5LicpKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF5bG9hZC5uYmYgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLm5vdEJlZm9yZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ0JhZCBcIm9wdGlvbnMubm90QmVmb3JlXCIgb3B0aW9uIHRoZSBwYXlsb2FkIGFscmVhZHkgaGFzIGFuIFwibmJmXCIgcHJvcGVydHkuJykpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUoZXJyb3IpO1xuICB9XG5cbiAgaWYgKCFvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcykge1xuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZUFzeW1tZXRyaWNLZXkoaGVhZGVyLmFsZywgc2VjcmV0T3JQcml2YXRlS2V5KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhaWx1cmUoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRpbWVzdGFtcCA9IHBheWxvYWQuaWF0IHx8IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG4gIGlmIChvcHRpb25zLm5vVGltZXN0YW1wKSB7XG4gICAgZGVsZXRlIHBheWxvYWQuaWF0O1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0UGF5bG9hZCkge1xuICAgIHBheWxvYWQuaWF0ID0gdGltZXN0YW1wO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLm5vdEJlZm9yZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkge1xuICAgICAgcGF5bG9hZC5uYmYgPSB0aW1lc3BhbihvcHRpb25zLm5vdEJlZm9yZSwgdGltZXN0YW1wKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIGZhaWx1cmUoZXJyKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLm5iZiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignXCJub3RCZWZvcmVcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4gZWc6IFwiMWRcIiwgXCIyMGhcIiwgNjAnKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmV4cGlyZXNJbiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBheWxvYWQuZXhwID0gdGltZXNwYW4ob3B0aW9ucy5leHBpcmVzSW4sIHRpbWVzdGFtcCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKGVycik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGF5bG9hZC5leHAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ1wiZXhwaXJlc0luXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMgb3Igc3RyaW5nIHJlcHJlc2VudGluZyBhIHRpbWVzcGFuIGVnOiBcIjFkXCIsIFwiMjBoXCIsIDYwJykpO1xuICAgIH1cbiAgfVxuXG4gIE9iamVjdC5rZXlzKG9wdGlvbnNfdG9fcGF5bG9hZCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgY29uc3QgY2xhaW0gPSBvcHRpb25zX3RvX3BheWxvYWRba2V5XTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF5bG9hZFtjbGFpbV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignQmFkIFwib3B0aW9ucy4nICsga2V5ICsgJ1wiIG9wdGlvbi4gVGhlIHBheWxvYWQgYWxyZWFkeSBoYXMgYW4gXCInICsgY2xhaW0gKyAnXCIgcHJvcGVydHkuJykpO1xuICAgICAgfVxuICAgICAgcGF5bG9hZFtjbGFpbV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBlbmNvZGluZyA9IG9wdGlvbnMuZW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrICYmIG9uY2UoY2FsbGJhY2spO1xuXG4gICAgandzLmNyZWF0ZVNpZ24oe1xuICAgICAgaGVhZGVyOiBoZWFkZXIsXG4gICAgICBwcml2YXRlS2V5OiBzZWNyZXRPclByaXZhdGVLZXksXG4gICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nXG4gICAgfSkub25jZSgnZXJyb3InLCBjYWxsYmFjaylcbiAgICAgIC5vbmNlKCdkb25lJywgZnVuY3Rpb24gKHNpZ25hdHVyZSkge1xuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgaW4gZmF2b3Igb2YgdGhlIG1vZHVsdXMgbGVuZ3RoIGNoZWNrIGJlZm9yZSBzaWduaW5nIG9uY2Ugbm9kZSAxNSsgaXMgdGhlIG1pbmltdW0gc3VwcG9ydGVkIHZlcnNpb25cbiAgICAgICAgaWYoIW9wdGlvbnMuYWxsb3dJbnNlY3VyZUtleVNpemVzICYmIC9eKD86UlN8UFMpLy50ZXN0KGhlYWRlci5hbGcpICYmIHNpZ25hdHVyZS5sZW5ndGggPCAyNTYpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBzZWNyZXRPclByaXZhdGVLZXkgaGFzIGEgbWluaW11bSBrZXkgc2l6ZSBvZiAyMDQ4IGJpdHMgZm9yICR7aGVhZGVyLmFsZ31gKSlcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhudWxsLCBzaWduYXR1cmUpO1xuICAgICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHNpZ25hdHVyZSA9IGp3cy5zaWduKHtoZWFkZXI6IGhlYWRlciwgcGF5bG9hZDogcGF5bG9hZCwgc2VjcmV0OiBzZWNyZXRPclByaXZhdGVLZXksIGVuY29kaW5nOiBlbmNvZGluZ30pO1xuICAgIC8vIFRPRE86IFJlbW92ZSBpbiBmYXZvciBvZiB0aGUgbW9kdWx1cyBsZW5ndGggY2hlY2sgYmVmb3JlIHNpZ25pbmcgb25jZSBub2RlIDE1KyBpcyB0aGUgbWluaW11bSBzdXBwb3J0ZWQgdmVyc2lvblxuICAgIGlmKCFvcHRpb25zLmFsbG93SW5zZWN1cmVLZXlTaXplcyAmJiAvXig/OlJTfFBTKS8udGVzdChoZWFkZXIuYWxnKSAmJiBzaWduYXR1cmUubGVuZ3RoIDwgMjU2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHNlY3JldE9yUHJpdmF0ZUtleSBoYXMgYSBtaW5pbXVtIGtleSBzaXplIG9mIDIwNDggYml0cyBmb3IgJHtoZWFkZXIuYWxnfWApXG4gICAgfVxuICAgIHJldHVybiBzaWduYXR1cmVcbiAgfVxufTtcbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlY29kZTogcmVxdWlyZSgnLi9kZWNvZGUnKSxcbiAgdmVyaWZ5OiByZXF1aXJlKCcuL3ZlcmlmeScpLFxuICBzaWduOiByZXF1aXJlKCcuL3NpZ24nKSxcbiAgSnNvbldlYlRva2VuRXJyb3I6IHJlcXVpcmUoJy4vbGliL0pzb25XZWJUb2tlbkVycm9yJyksXG4gIE5vdEJlZm9yZUVycm9yOiByZXF1aXJlKCcuL2xpYi9Ob3RCZWZvcmVFcnJvcicpLFxuICBUb2tlbkV4cGlyZWRFcnJvcjogcmVxdWlyZSgnLi9saWIvVG9rZW5FeHBpcmVkRXJyb3InKSxcbn07XG4iLAogICAgIihmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBVdGlsc1xuICBmdW5jdGlvbiBhc3NlcnQgKHZhbCwgbXNnKSB7XG4gICAgaWYgKCF2YWwpIHRocm93IG5ldyBFcnJvcihtc2cgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnKTtcbiAgfVxuXG4gIC8vIENvdWxkIHVzZSBgaW5oZXJpdHNgIG1vZHVsZSwgYnV0IGRvbid0IHdhbnQgdG8gbW92ZSBmcm9tIHNpbmdsZSBmaWxlXG4gIC8vIGFyY2hpdGVjdHVyZSB5ZXQuXG4gIGZ1bmN0aW9uIGluaGVyaXRzIChjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjtcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlO1xuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKCk7XG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yO1xuICB9XG5cbiAgLy8gQk5cblxuICBmdW5jdGlvbiBCTiAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICBpZiAoQk4uaXNCTihudW1iZXIpKSB7XG4gICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH1cblxuICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgIHRoaXMud29yZHMgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIC8vIFJlZHVjdGlvbiBjb250ZXh0XG4gICAgdGhpcy5yZWQgPSBudWxsO1xuXG4gICAgaWYgKG51bWJlciAhPT0gbnVsbCkge1xuICAgICAgaWYgKGJhc2UgPT09ICdsZScgfHwgYmFzZSA9PT0gJ2JlJykge1xuICAgICAgICBlbmRpYW4gPSBiYXNlO1xuICAgICAgICBiYXNlID0gMTA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2luaXQobnVtYmVyIHx8IDAsIGJhc2UgfHwgMTAsIGVuZGlhbiB8fCAnYmUnKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBCTjtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJOID0gQk47XG4gIH1cblxuICBCTi5CTiA9IEJOO1xuICBCTi53b3JkU2l6ZSA9IDI2O1xuXG4gIHZhciBCdWZmZXI7XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuQnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgQnVmZmVyID0gd2luZG93LkJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICB9XG5cbiAgQk4uaXNCTiA9IGZ1bmN0aW9uIGlzQk4gKG51bSkge1xuICAgIGlmIChudW0gaW5zdGFuY2VvZiBCTikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bSAhPT0gbnVsbCAmJiB0eXBlb2YgbnVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgbnVtLmNvbnN0cnVjdG9yLndvcmRTaXplID09PSBCTi53b3JkU2l6ZSAmJiBBcnJheS5pc0FycmF5KG51bS53b3Jkcyk7XG4gIH07XG5cbiAgQk4ubWF4ID0gZnVuY3Rpb24gbWF4IChsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0LmNtcChyaWdodCkgPiAwKSByZXR1cm4gbGVmdDtcbiAgICByZXR1cm4gcmlnaHQ7XG4gIH07XG5cbiAgQk4ubWluID0gZnVuY3Rpb24gbWluIChsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0LmNtcChyaWdodCkgPCAwKSByZXR1cm4gbGVmdDtcbiAgICByZXR1cm4gcmlnaHQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdCAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0TnVtYmVyKG51bWJlciwgYmFzZSwgZW5kaWFuKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0QXJyYXkobnVtYmVyLCBiYXNlLCBlbmRpYW4pO1xuICAgIH1cblxuICAgIGlmIChiYXNlID09PSAnaGV4Jykge1xuICAgICAgYmFzZSA9IDE2O1xuICAgIH1cbiAgICBhc3NlcnQoYmFzZSA9PT0gKGJhc2UgfCAwKSAmJiBiYXNlID49IDIgJiYgYmFzZSA8PSAzNik7XG5cbiAgICBudW1iZXIgPSBudW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHMrL2csICcnKTtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGlmIChudW1iZXJbMF0gPT09ICctJykge1xuICAgICAgc3RhcnQrKztcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA8IG51bWJlci5sZW5ndGgpIHtcbiAgICAgIGlmIChiYXNlID09PSAxNikge1xuICAgICAgICB0aGlzLl9wYXJzZUhleChudW1iZXIsIHN0YXJ0LCBlbmRpYW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcGFyc2VCYXNlKG51bWJlciwgYmFzZSwgc3RhcnQpO1xuICAgICAgICBpZiAoZW5kaWFuID09PSAnbGUnKSB7XG4gICAgICAgICAgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCBiYXNlLCBlbmRpYW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faW5pdE51bWJlciA9IGZ1bmN0aW9uIF9pbml0TnVtYmVyIChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIG51bWJlciA9IC1udW1iZXI7XG4gICAgfVxuICAgIGlmIChudW1iZXIgPCAweDQwMDAwMDApIHtcbiAgICAgIHRoaXMud29yZHMgPSBbIG51bWJlciAmIDB4M2ZmZmZmZiBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgMHgxMDAwMDAwMDAwMDAwMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFtcbiAgICAgICAgbnVtYmVyICYgMHgzZmZmZmZmLFxuICAgICAgICAobnVtYmVyIC8gMHg0MDAwMDAwKSAmIDB4M2ZmZmZmZlxuICAgICAgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KG51bWJlciA8IDB4MjAwMDAwMDAwMDAwMDApOyAvLyAyIF4gNTMgKHVuc2FmZSlcbiAgICAgIHRoaXMud29yZHMgPSBbXG4gICAgICAgIG51bWJlciAmIDB4M2ZmZmZmZixcbiAgICAgICAgKG51bWJlciAvIDB4NDAwMDAwMCkgJiAweDNmZmZmZmYsXG4gICAgICAgIDFcbiAgICAgIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDM7XG4gICAgfVxuXG4gICAgaWYgKGVuZGlhbiAhPT0gJ2xlJykgcmV0dXJuO1xuXG4gICAgLy8gUmV2ZXJzZSB0aGUgYnl0ZXNcbiAgICB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGJhc2UsIGVuZGlhbik7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0QXJyYXkgPSBmdW5jdGlvbiBfaW5pdEFycmF5IChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIC8vIFBlcmhhcHMgYSBVaW50OEFycmF5XG4gICAgYXNzZXJ0KHR5cGVvZiBudW1iZXIubGVuZ3RoID09PSAnbnVtYmVyJyk7XG4gICAgaWYgKG51bWJlci5sZW5ndGggPD0gMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFsgMCBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwobnVtYmVyLmxlbmd0aCAvIDMpO1xuICAgIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgfVxuXG4gICAgdmFyIGosIHc7XG4gICAgdmFyIG9mZiA9IDA7XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JlJykge1xuICAgICAgZm9yIChpID0gbnVtYmVyLmxlbmd0aCAtIDEsIGogPSAwOyBpID49IDA7IGkgLT0gMykge1xuICAgICAgICB3ID0gbnVtYmVyW2ldIHwgKG51bWJlcltpIC0gMV0gPDwgOCkgfCAobnVtYmVyW2kgLSAyXSA8PCAxNik7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqICsgMV0gPSAodyA+Pj4gKDI2IC0gb2ZmKSkgJiAweDNmZmZmZmY7XG4gICAgICAgIG9mZiArPSAyNDtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVuZGlhbiA9PT0gJ2xlJykge1xuICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBudW1iZXIubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgdyA9IG51bWJlcltpXSB8IChudW1iZXJbaSArIDFdIDw8IDgpIHwgKG51bWJlcltpICsgMl0gPDwgMTYpO1xuICAgICAgICB0aGlzLndvcmRzW2pdIHw9ICh3IDw8IG9mZikgJiAweDNmZmZmZmY7XG4gICAgICAgIHRoaXMud29yZHNbaiArIDFdID0gKHcgPj4+ICgyNiAtIG9mZikpICYgMHgzZmZmZmZmO1xuICAgICAgICBvZmYgKz0gMjQ7XG4gICAgICAgIGlmIChvZmYgPj0gMjYpIHtcbiAgICAgICAgICBvZmYgLT0gMjY7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcGFyc2VIZXg0Qml0cyAoc3RyaW5nLCBpbmRleCkge1xuICAgIHZhciBjID0gc3RyaW5nLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgIC8vICdBJyAtICdGJ1xuICAgIGlmIChjID49IDY1ICYmIGMgPD0gNzApIHtcbiAgICAgIHJldHVybiBjIC0gNTU7XG4gICAgLy8gJ2EnIC0gJ2YnXG4gICAgfSBlbHNlIGlmIChjID49IDk3ICYmIGMgPD0gMTAyKSB7XG4gICAgICByZXR1cm4gYyAtIDg3O1xuICAgIC8vICcwJyAtICc5J1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKGMgLSA0OCkgJiAweGY7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VIZXhCeXRlIChzdHJpbmcsIGxvd2VyQm91bmQsIGluZGV4KSB7XG4gICAgdmFyIHIgPSBwYXJzZUhleDRCaXRzKHN0cmluZywgaW5kZXgpO1xuICAgIGlmIChpbmRleCAtIDEgPj0gbG93ZXJCb3VuZCkge1xuICAgICAgciB8PSBwYXJzZUhleDRCaXRzKHN0cmluZywgaW5kZXggLSAxKSA8PCA0O1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5fcGFyc2VIZXggPSBmdW5jdGlvbiBfcGFyc2VIZXggKG51bWJlciwgc3RhcnQsIGVuZGlhbikge1xuICAgIC8vIENyZWF0ZSBwb3NzaWJseSBiaWdnZXIgYXJyYXkgdG8gZW5zdXJlIHRoYXQgaXQgZml0cyB0aGUgbnVtYmVyXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwoKG51bWJlci5sZW5ndGggLSBzdGFydCkgLyA2KTtcbiAgICB0aGlzLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAwO1xuICAgIH1cblxuICAgIC8vIDI0LWJpdHMgY2h1bmtzXG4gICAgdmFyIG9mZiA9IDA7XG4gICAgdmFyIGogPSAwO1xuXG4gICAgdmFyIHc7XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JlJykge1xuICAgICAgZm9yIChpID0gbnVtYmVyLmxlbmd0aCAtIDE7IGkgPj0gc3RhcnQ7IGkgLT0gMikge1xuICAgICAgICB3ID0gcGFyc2VIZXhCeXRlKG51bWJlciwgc3RhcnQsIGkpIDw8IG9mZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSB3ICYgMHgzZmZmZmZmO1xuICAgICAgICBpZiAob2ZmID49IDE4KSB7XG4gICAgICAgICAgb2ZmIC09IDE4O1xuICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgICB0aGlzLndvcmRzW2pdIHw9IHcgPj4+IDI2O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9mZiArPSA4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwYXJzZUxlbmd0aCA9IG51bWJlci5sZW5ndGggLSBzdGFydDtcbiAgICAgIGZvciAoaSA9IHBhcnNlTGVuZ3RoICUgMiA9PT0gMCA/IHN0YXJ0ICsgMSA6IHN0YXJ0OyBpIDwgbnVtYmVyLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHcgPSBwYXJzZUhleEJ5dGUobnVtYmVyLCBzdGFydCwgaSkgPDwgb2ZmO1xuICAgICAgICB0aGlzLndvcmRzW2pdIHw9IHcgJiAweDNmZmZmZmY7XG4gICAgICAgIGlmIChvZmYgPj0gMTgpIHtcbiAgICAgICAgICBvZmYgLT0gMTg7XG4gICAgICAgICAgaiArPSAxO1xuICAgICAgICAgIHRoaXMud29yZHNbal0gfD0gdyA+Pj4gMjY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2ZmICs9IDg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcGFyc2VCYXNlIChzdHIsIHN0YXJ0LCBlbmQsIG11bCkge1xuICAgIHZhciByID0gMDtcbiAgICB2YXIgbGVuID0gTWF0aC5taW4oc3RyLmxlbmd0aCwgZW5kKTtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKSAtIDQ4O1xuXG4gICAgICByICo9IG11bDtcblxuICAgICAgLy8gJ2EnXG4gICAgICBpZiAoYyA+PSA0OSkge1xuICAgICAgICByICs9IGMgLSA0OSArIDB4YTtcblxuICAgICAgLy8gJ0EnXG4gICAgICB9IGVsc2UgaWYgKGMgPj0gMTcpIHtcbiAgICAgICAgciArPSBjIC0gMTcgKyAweGE7XG5cbiAgICAgIC8vICcwJyAtICc5J1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgciArPSBjO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5fcGFyc2VCYXNlID0gZnVuY3Rpb24gX3BhcnNlQmFzZSAobnVtYmVyLCBiYXNlLCBzdGFydCkge1xuICAgIC8vIEluaXRpYWxpemUgYXMgemVyb1xuICAgIHRoaXMud29yZHMgPSBbIDAgXTtcbiAgICB0aGlzLmxlbmd0aCA9IDE7XG5cbiAgICAvLyBGaW5kIGxlbmd0aCBvZiBsaW1iIGluIGJhc2VcbiAgICBmb3IgKHZhciBsaW1iTGVuID0gMCwgbGltYlBvdyA9IDE7IGxpbWJQb3cgPD0gMHgzZmZmZmZmOyBsaW1iUG93ICo9IGJhc2UpIHtcbiAgICAgIGxpbWJMZW4rKztcbiAgICB9XG4gICAgbGltYkxlbi0tO1xuICAgIGxpbWJQb3cgPSAobGltYlBvdyAvIGJhc2UpIHwgMDtcblxuICAgIHZhciB0b3RhbCA9IG51bWJlci5sZW5ndGggLSBzdGFydDtcbiAgICB2YXIgbW9kID0gdG90YWwgJSBsaW1iTGVuO1xuICAgIHZhciBlbmQgPSBNYXRoLm1pbih0b3RhbCwgdG90YWwgLSBtb2QpICsgc3RhcnQ7XG5cbiAgICB2YXIgd29yZCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGxpbWJMZW4pIHtcbiAgICAgIHdvcmQgPSBwYXJzZUJhc2UobnVtYmVyLCBpLCBpICsgbGltYkxlbiwgYmFzZSk7XG5cbiAgICAgIHRoaXMuaW11bG4obGltYlBvdyk7XG4gICAgICBpZiAodGhpcy53b3Jkc1swXSArIHdvcmQgPCAweDQwMDAwMDApIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSArPSB3b3JkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faWFkZG4od29yZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vZCAhPT0gMCkge1xuICAgICAgdmFyIHBvdyA9IDE7XG4gICAgICB3b3JkID0gcGFyc2VCYXNlKG51bWJlciwgaSwgbnVtYmVyLmxlbmd0aCwgYmFzZSk7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBtb2Q7IGkrKykge1xuICAgICAgICBwb3cgKj0gYmFzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbXVsbihwb3cpO1xuICAgICAgaWYgKHRoaXMud29yZHNbMF0gKyB3b3JkIDwgMHg0MDAwMDAwKSB7XG4gICAgICAgIHRoaXMud29yZHNbMF0gKz0gd29yZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2lhZGRuKHdvcmQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKGRlc3QpIHtcbiAgICBkZXN0LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlc3Qud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldO1xuICAgIH1cbiAgICBkZXN0Lmxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIGRlc3QubmVnYXRpdmUgPSB0aGlzLm5lZ2F0aXZlO1xuICAgIGRlc3QucmVkID0gdGhpcy5yZWQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUgKCkge1xuICAgIHZhciByID0gbmV3IEJOKG51bGwpO1xuICAgIHRoaXMuY29weShyKTtcbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2V4cGFuZCA9IGZ1bmN0aW9uIF9leHBhbmQgKHNpemUpIHtcbiAgICB3aGlsZSAodGhpcy5sZW5ndGggPCBzaXplKSB7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gUmVtb3ZlIGxlYWRpbmcgYDBgIGZyb20gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zdHJpcCA9IGZ1bmN0aW9uIHN0cmlwICgpIHtcbiAgICB3aGlsZSAodGhpcy5sZW5ndGggPiAxICYmIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSA9PT0gMCkge1xuICAgICAgdGhpcy5sZW5ndGgtLTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9ub3JtU2lnbiA9IGZ1bmN0aW9uIF9ub3JtU2lnbiAoKSB7XG4gICAgLy8gLTAgPSAwXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICAgIHJldHVybiAodGhpcy5yZWQgPyAnPEJOLVI6ICcgOiAnPEJOOiAnKSArIHRoaXMudG9TdHJpbmcoMTYpICsgJz4nO1xuICB9O1xuXG4gIC8qXG5cbiAgdmFyIHplcm9zID0gW107XG4gIHZhciBncm91cFNpemVzID0gW107XG4gIHZhciBncm91cEJhc2VzID0gW107XG5cbiAgdmFyIHMgPSAnJztcbiAgdmFyIGkgPSAtMTtcbiAgd2hpbGUgKCsraSA8IEJOLndvcmRTaXplKSB7XG4gICAgemVyb3NbaV0gPSBzO1xuICAgIHMgKz0gJzAnO1xuICB9XG4gIGdyb3VwU2l6ZXNbMF0gPSAwO1xuICBncm91cFNpemVzWzFdID0gMDtcbiAgZ3JvdXBCYXNlc1swXSA9IDA7XG4gIGdyb3VwQmFzZXNbMV0gPSAwO1xuICB2YXIgYmFzZSA9IDIgLSAxO1xuICB3aGlsZSAoKytiYXNlIDwgMzYgKyAxKSB7XG4gICAgdmFyIGdyb3VwU2l6ZSA9IDA7XG4gICAgdmFyIGdyb3VwQmFzZSA9IDE7XG4gICAgd2hpbGUgKGdyb3VwQmFzZSA8ICgxIDw8IEJOLndvcmRTaXplKSAvIGJhc2UpIHtcbiAgICAgIGdyb3VwQmFzZSAqPSBiYXNlO1xuICAgICAgZ3JvdXBTaXplICs9IDE7XG4gICAgfVxuICAgIGdyb3VwU2l6ZXNbYmFzZV0gPSBncm91cFNpemU7XG4gICAgZ3JvdXBCYXNlc1tiYXNlXSA9IGdyb3VwQmFzZTtcbiAgfVxuXG4gICovXG5cbiAgdmFyIHplcm9zID0gW1xuICAgICcnLFxuICAgICcwJyxcbiAgICAnMDAnLFxuICAgICcwMDAnLFxuICAgICcwMDAwJyxcbiAgICAnMDAwMDAnLFxuICAgICcwMDAwMDAnLFxuICAgICcwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICBdO1xuXG4gIHZhciBncm91cFNpemVzID0gW1xuICAgIDAsIDAsXG4gICAgMjUsIDE2LCAxMiwgMTEsIDEwLCA5LCA4LFxuICAgIDgsIDcsIDcsIDcsIDcsIDYsIDYsXG4gICAgNiwgNiwgNiwgNiwgNiwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LFxuICAgIDUsIDUsIDUsIDUsIDUsIDUsIDVcbiAgXTtcblxuICB2YXIgZ3JvdXBCYXNlcyA9IFtcbiAgICAwLCAwLFxuICAgIDMzNTU0NDMyLCA0MzA0NjcyMSwgMTY3NzcyMTYsIDQ4ODI4MTI1LCA2MDQ2NjE3NiwgNDAzNTM2MDcsIDE2Nzc3MjE2LFxuICAgIDQzMDQ2NzIxLCAxMDAwMDAwMCwgMTk0ODcxNzEsIDM1ODMxODA4LCA2Mjc0ODUxNywgNzUyOTUzNiwgMTEzOTA2MjUsXG4gICAgMTY3NzcyMTYsIDI0MTM3NTY5LCAzNDAxMjIyNCwgNDcwNDU4ODEsIDY0MDAwMDAwLCA0MDg0MTAxLCA1MTUzNjMyLFxuICAgIDY0MzYzNDMsIDc5NjI2MjQsIDk3NjU2MjUsIDExODgxMzc2LCAxNDM0ODkwNywgMTcyMTAzNjgsIDIwNTExMTQ5LFxuICAgIDI0MzAwMDAwLCAyODYyOTE1MSwgMzM1NTQ0MzIsIDM5MTM1MzkzLCA0NTQzNTQyNCwgNTI1MjE4NzUsIDYwNDY2MTc2XG4gIF07XG5cbiAgQk4ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKGJhc2UsIHBhZGRpbmcpIHtcbiAgICBiYXNlID0gYmFzZSB8fCAxMDtcbiAgICBwYWRkaW5nID0gcGFkZGluZyB8IDAgfHwgMTtcblxuICAgIHZhciBvdXQ7XG4gICAgaWYgKGJhc2UgPT09IDE2IHx8IGJhc2UgPT09ICdoZXgnKSB7XG4gICAgICBvdXQgPSAnJztcbiAgICAgIHZhciBvZmYgPSAwO1xuICAgICAgdmFyIGNhcnJ5ID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdyA9IHRoaXMud29yZHNbaV07XG4gICAgICAgIHZhciB3b3JkID0gKCgodyA8PCBvZmYpIHwgY2FycnkpICYgMHhmZmZmZmYpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgY2FycnkgPSAodyA+Pj4gKDI0IC0gb2ZmKSkgJiAweGZmZmZmZjtcbiAgICAgICAgb2ZmICs9IDI7XG4gICAgICAgIGlmIChvZmYgPj0gMjYpIHtcbiAgICAgICAgICBvZmYgLT0gMjY7XG4gICAgICAgICAgaS0tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXJyeSAhPT0gMCB8fCBpICE9PSB0aGlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBvdXQgPSB6ZXJvc1s2IC0gd29yZC5sZW5ndGhdICsgd29yZCArIG91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgPSB3b3JkICsgb3V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgICAgb3V0ID0gY2FycnkudG9TdHJpbmcoMTYpICsgb3V0O1xuICAgICAgfVxuICAgICAgd2hpbGUgKG91dC5sZW5ndGggJSBwYWRkaW5nICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICctJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgaWYgKGJhc2UgPT09IChiYXNlIHwgMCkgJiYgYmFzZSA+PSAyICYmIGJhc2UgPD0gMzYpIHtcbiAgICAgIC8vIHZhciBncm91cFNpemUgPSBNYXRoLmZsb29yKEJOLndvcmRTaXplICogTWF0aC5MTjIgLyBNYXRoLmxvZyhiYXNlKSk7XG4gICAgICB2YXIgZ3JvdXBTaXplID0gZ3JvdXBTaXplc1tiYXNlXTtcbiAgICAgIC8vIHZhciBncm91cEJhc2UgPSBNYXRoLnBvdyhiYXNlLCBncm91cFNpemUpO1xuICAgICAgdmFyIGdyb3VwQmFzZSA9IGdyb3VwQmFzZXNbYmFzZV07XG4gICAgICBvdXQgPSAnJztcbiAgICAgIHZhciBjID0gdGhpcy5jbG9uZSgpO1xuICAgICAgYy5uZWdhdGl2ZSA9IDA7XG4gICAgICB3aGlsZSAoIWMuaXNaZXJvKCkpIHtcbiAgICAgICAgdmFyIHIgPSBjLm1vZG4oZ3JvdXBCYXNlKS50b1N0cmluZyhiYXNlKTtcbiAgICAgICAgYyA9IGMuaWRpdm4oZ3JvdXBCYXNlKTtcblxuICAgICAgICBpZiAoIWMuaXNaZXJvKCkpIHtcbiAgICAgICAgICBvdXQgPSB6ZXJvc1tncm91cFNpemUgLSByLmxlbmd0aF0gKyByICsgb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCA9IHIgKyBvdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzWmVybygpKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChvdXQubGVuZ3RoICUgcGFkZGluZyAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnMCcgKyBvdXQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnLScgKyBvdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGFzc2VydChmYWxzZSwgJ0Jhc2Ugc2hvdWxkIGJlIGJldHdlZW4gMiBhbmQgMzYnKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbiB0b051bWJlciAoKSB7XG4gICAgdmFyIHJldCA9IHRoaXMud29yZHNbMF07XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAyKSB7XG4gICAgICByZXQgKz0gdGhpcy53b3Jkc1sxXSAqIDB4NDAwMDAwMDtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGVuZ3RoID09PSAzICYmIHRoaXMud29yZHNbMl0gPT09IDB4MDEpIHtcbiAgICAgIC8vIE5PVEU6IGF0IHRoaXMgc3RhZ2UgaXQgaXMga25vd24gdGhhdCB0aGUgdG9wIGJpdCBpcyBzZXRcbiAgICAgIHJldCArPSAweDEwMDAwMDAwMDAwMDAwICsgKHRoaXMud29yZHNbMV0gKiAweDQwMDAwMDApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sZW5ndGggPiAyKSB7XG4gICAgICBhc3NlcnQoZmFsc2UsICdOdW1iZXIgY2FuIG9ubHkgc2FmZWx5IHN0b3JlIHVwIHRvIDUzIGJpdHMnKTtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLm5lZ2F0aXZlICE9PSAwKSA/IC1yZXQgOiByZXQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoMTYpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0J1ZmZlciA9IGZ1bmN0aW9uIHRvQnVmZmVyIChlbmRpYW4sIGxlbmd0aCkge1xuICAgIGFzc2VydCh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyk7XG4gICAgcmV0dXJuIHRoaXMudG9BcnJheUxpa2UoQnVmZmVyLCBlbmRpYW4sIGxlbmd0aCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiB0b0FycmF5IChlbmRpYW4sIGxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLnRvQXJyYXlMaWtlKEFycmF5LCBlbmRpYW4sIGxlbmd0aCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvQXJyYXlMaWtlID0gZnVuY3Rpb24gdG9BcnJheUxpa2UgKEFycmF5VHlwZSwgZW5kaWFuLCBsZW5ndGgpIHtcbiAgICB2YXIgYnl0ZUxlbmd0aCA9IHRoaXMuYnl0ZUxlbmd0aCgpO1xuICAgIHZhciByZXFMZW5ndGggPSBsZW5ndGggfHwgTWF0aC5tYXgoMSwgYnl0ZUxlbmd0aCk7XG4gICAgYXNzZXJ0KGJ5dGVMZW5ndGggPD0gcmVxTGVuZ3RoLCAnYnl0ZSBhcnJheSBsb25nZXIgdGhhbiBkZXNpcmVkIGxlbmd0aCcpO1xuICAgIGFzc2VydChyZXFMZW5ndGggPiAwLCAnUmVxdWVzdGVkIGFycmF5IGxlbmd0aCA8PSAwJyk7XG5cbiAgICB0aGlzLnN0cmlwKCk7XG4gICAgdmFyIGxpdHRsZUVuZGlhbiA9IGVuZGlhbiA9PT0gJ2xlJztcbiAgICB2YXIgcmVzID0gbmV3IEFycmF5VHlwZShyZXFMZW5ndGgpO1xuXG4gICAgdmFyIGIsIGk7XG4gICAgdmFyIHEgPSB0aGlzLmNsb25lKCk7XG4gICAgaWYgKCFsaXR0bGVFbmRpYW4pIHtcbiAgICAgIC8vIEFzc3VtZSBiaWctZW5kaWFuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgcmVxTGVuZ3RoIC0gYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc1tpXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGZvciAoaSA9IDA7ICFxLmlzWmVybygpOyBpKyspIHtcbiAgICAgICAgYiA9IHEuYW5kbG4oMHhmZik7XG4gICAgICAgIHEuaXVzaHJuKDgpO1xuXG4gICAgICAgIHJlc1tyZXFMZW5ndGggLSBpIC0gMV0gPSBiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGkgPSAwOyAhcS5pc1plcm8oKTsgaSsrKSB7XG4gICAgICAgIGIgPSBxLmFuZGxuKDB4ZmYpO1xuICAgICAgICBxLml1c2hybig4KTtcblxuICAgICAgICByZXNbaV0gPSBiO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgaSA8IHJlcUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc1tpXSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBpZiAoTWF0aC5jbHozMikge1xuICAgIEJOLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24gX2NvdW50Qml0cyAodykge1xuICAgICAgcmV0dXJuIDMyIC0gTWF0aC5jbHozMih3KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIEJOLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24gX2NvdW50Qml0cyAodykge1xuICAgICAgdmFyIHQgPSB3O1xuICAgICAgdmFyIHIgPSAwO1xuICAgICAgaWYgKHQgPj0gMHgxMDAwKSB7XG4gICAgICAgIHIgKz0gMTM7XG4gICAgICAgIHQgPj4+PSAxMztcbiAgICAgIH1cbiAgICAgIGlmICh0ID49IDB4NDApIHtcbiAgICAgICAgciArPSA3O1xuICAgICAgICB0ID4+Pj0gNztcbiAgICAgIH1cbiAgICAgIGlmICh0ID49IDB4OCkge1xuICAgICAgICByICs9IDQ7XG4gICAgICAgIHQgPj4+PSA0O1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHgwMikge1xuICAgICAgICByICs9IDI7XG4gICAgICAgIHQgPj4+PSAyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHIgKyB0O1xuICAgIH07XG4gIH1cblxuICBCTi5wcm90b3R5cGUuX3plcm9CaXRzID0gZnVuY3Rpb24gX3plcm9CaXRzICh3KSB7XG4gICAgLy8gU2hvcnQtY3V0XG4gICAgaWYgKHcgPT09IDApIHJldHVybiAyNjtcblxuICAgIHZhciB0ID0gdztcbiAgICB2YXIgciA9IDA7XG4gICAgaWYgKCh0ICYgMHgxZmZmKSA9PT0gMCkge1xuICAgICAgciArPSAxMztcbiAgICAgIHQgPj4+PSAxMztcbiAgICB9XG4gICAgaWYgKCh0ICYgMHg3ZikgPT09IDApIHtcbiAgICAgIHIgKz0gNztcbiAgICAgIHQgPj4+PSA3O1xuICAgIH1cbiAgICBpZiAoKHQgJiAweGYpID09PSAwKSB7XG4gICAgICByICs9IDQ7XG4gICAgICB0ID4+Pj0gNDtcbiAgICB9XG4gICAgaWYgKCh0ICYgMHgzKSA9PT0gMCkge1xuICAgICAgciArPSAyO1xuICAgICAgdCA+Pj49IDI7XG4gICAgfVxuICAgIGlmICgodCAmIDB4MSkgPT09IDApIHtcbiAgICAgIHIrKztcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG51bWJlciBvZiB1c2VkIGJpdHMgaW4gYSBCTlxuICBCTi5wcm90b3R5cGUuYml0TGVuZ3RoID0gZnVuY3Rpb24gYml0TGVuZ3RoICgpIHtcbiAgICB2YXIgdyA9IHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXTtcbiAgICB2YXIgaGkgPSB0aGlzLl9jb3VudEJpdHModyk7XG4gICAgcmV0dXJuICh0aGlzLmxlbmd0aCAtIDEpICogMjYgKyBoaTtcbiAgfTtcblxuICBmdW5jdGlvbiB0b0JpdEFycmF5IChudW0pIHtcbiAgICB2YXIgdyA9IG5ldyBBcnJheShudW0uYml0TGVuZ3RoKCkpO1xuXG4gICAgZm9yICh2YXIgYml0ID0gMDsgYml0IDwgdy5sZW5ndGg7IGJpdCsrKSB7XG4gICAgICB2YXIgb2ZmID0gKGJpdCAvIDI2KSB8IDA7XG4gICAgICB2YXIgd2JpdCA9IGJpdCAlIDI2O1xuXG4gICAgICB3W2JpdF0gPSAobnVtLndvcmRzW29mZl0gJiAoMSA8PCB3Yml0KSkgPj4+IHdiaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHc7XG4gIH1cblxuICAvLyBOdW1iZXIgb2YgdHJhaWxpbmcgemVybyBiaXRzXG4gIEJOLnByb3RvdHlwZS56ZXJvQml0cyA9IGZ1bmN0aW9uIHplcm9CaXRzICgpIHtcbiAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIDA7XG5cbiAgICB2YXIgciA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYiA9IHRoaXMuX3plcm9CaXRzKHRoaXMud29yZHNbaV0pO1xuICAgICAgciArPSBiO1xuICAgICAgaWYgKGIgIT09IDI2KSBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmJ5dGVMZW5ndGggPSBmdW5jdGlvbiBieXRlTGVuZ3RoICgpIHtcbiAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuYml0TGVuZ3RoKCkgLyA4KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9Ud29zID0gZnVuY3Rpb24gdG9Ud29zICh3aWR0aCkge1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5hYnMoKS5pbm90bih3aWR0aCkuaWFkZG4oMSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmZyb21Ud29zID0gZnVuY3Rpb24gZnJvbVR3b3MgKHdpZHRoKSB7XG4gICAgaWYgKHRoaXMudGVzdG4od2lkdGggLSAxKSkge1xuICAgICAgcmV0dXJuIHRoaXMubm90bih3aWR0aCkuaWFkZG4oMSkuaW5lZygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc05lZyA9IGZ1bmN0aW9uIGlzTmVnICgpIHtcbiAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMDtcbiAgfTtcblxuICAvLyBSZXR1cm4gbmVnYXRpdmUgY2xvbmUgb2YgYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcgKCkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW5lZygpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbmVnID0gZnVuY3Rpb24gaW5lZyAoKSB7XG4gICAgaWYgKCF0aGlzLmlzWmVybygpKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlIF49IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gT3IgYG51bWAgd2l0aCBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1b3IgPSBmdW5jdGlvbiBpdW9yIChudW0pIHtcbiAgICB3aGlsZSAodGhpcy5sZW5ndGggPCBudW0ubGVuZ3RoKSB7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV0gfCBudW0ud29yZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW9yID0gZnVuY3Rpb24gaW9yIChudW0pIHtcbiAgICBhc3NlcnQoKHRoaXMubmVnYXRpdmUgfCBudW0ubmVnYXRpdmUpID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdW9yKG51bSk7XG4gIH07XG5cbiAgLy8gT3IgYG51bWAgd2l0aCBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaW9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLmlvcih0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudW9yID0gZnVuY3Rpb24gdW9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml1b3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXVvcih0aGlzKTtcbiAgfTtcblxuICAvLyBBbmQgYG51bWAgd2l0aCBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1YW5kID0gZnVuY3Rpb24gaXVhbmQgKG51bSkge1xuICAgIC8vIGIgPSBtaW4tbGVuZ3RoKG51bSwgdGhpcylcbiAgICB2YXIgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldICYgbnVtLndvcmRzW2ldO1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYi5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pYW5kID0gZnVuY3Rpb24gaWFuZCAobnVtKSB7XG4gICAgYXNzZXJ0KCh0aGlzLm5lZ2F0aXZlIHwgbnVtLm5lZ2F0aXZlKSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVhbmQobnVtKTtcbiAgfTtcblxuICAvLyBBbmQgYG51bWAgd2l0aCBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uIGFuZCAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYW5kKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLmlhbmQodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVhbmQgPSBmdW5jdGlvbiB1YW5kIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml1YW5kKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml1YW5kKHRoaXMpO1xuICB9O1xuXG4gIC8vIFhvciBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXV4b3IgPSBmdW5jdGlvbiBpdXhvciAobnVtKSB7XG4gICAgLy8gYS5sZW5ndGggPiBiLmxlbmd0aFxuICAgIHZhciBhO1xuICAgIHZhciBiO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHtcbiAgICAgIGEgPSB0aGlzO1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IG51bTtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV0gXiBiLndvcmRzW2ldO1xuICAgIH1cblxuICAgIGlmICh0aGlzICE9PSBhKSB7XG4gICAgICBmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBhLmxlbmd0aDtcblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLml4b3IgPSBmdW5jdGlvbiBpeG9yIChudW0pIHtcbiAgICBhc3NlcnQoKHRoaXMubmVnYXRpdmUgfCBudW0ubmVnYXRpdmUpID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdXhvcihudW0pO1xuICB9O1xuXG4gIC8vIFhvciBgbnVtYCB3aXRoIGB0aGlzYFxuICBCTi5wcm90b3R5cGUueG9yID0gZnVuY3Rpb24geG9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml4b3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXhvcih0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudXhvciA9IGZ1bmN0aW9uIHV4b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXV4b3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXV4b3IodGhpcyk7XG4gIH07XG5cbiAgLy8gTm90IGBgdGhpc2BgIHdpdGggYGB3aWR0aGBgIGJpdHdpZHRoXG4gIEJOLnByb3RvdHlwZS5pbm90biA9IGZ1bmN0aW9uIGlub3RuICh3aWR0aCkge1xuICAgIGFzc2VydCh0eXBlb2Ygd2lkdGggPT09ICdudW1iZXInICYmIHdpZHRoID49IDApO1xuXG4gICAgdmFyIGJ5dGVzTmVlZGVkID0gTWF0aC5jZWlsKHdpZHRoIC8gMjYpIHwgMDtcbiAgICB2YXIgYml0c0xlZnQgPSB3aWR0aCAlIDI2O1xuXG4gICAgLy8gRXh0ZW5kIHRoZSBidWZmZXIgd2l0aCBsZWFkaW5nIHplcm9lc1xuICAgIHRoaXMuX2V4cGFuZChieXRlc05lZWRlZCk7XG5cbiAgICBpZiAoYml0c0xlZnQgPiAwKSB7XG4gICAgICBieXRlc05lZWRlZC0tO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBjb21wbGV0ZSB3b3Jkc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXNOZWVkZWQ7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IH50aGlzLndvcmRzW2ldICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgcmVzaWR1ZVxuICAgIGlmIChiaXRzTGVmdCA+IDApIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB+dGhpcy53b3Jkc1tpXSAmICgweDNmZmZmZmYgPj4gKDI2IC0gYml0c0xlZnQpKTtcbiAgICB9XG5cbiAgICAvLyBBbmQgcmVtb3ZlIGxlYWRpbmcgemVyb2VzXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubm90biA9IGZ1bmN0aW9uIG5vdG4gKHdpZHRoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbm90bih3aWR0aCk7XG4gIH07XG5cbiAgLy8gU2V0IGBiaXRgIG9mIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc2V0biA9IGZ1bmN0aW9uIHNldG4gKGJpdCwgdmFsKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXQgPT09ICdudW1iZXInICYmIGJpdCA+PSAwKTtcblxuICAgIHZhciBvZmYgPSAoYml0IC8gMjYpIHwgMDtcbiAgICB2YXIgd2JpdCA9IGJpdCAlIDI2O1xuXG4gICAgdGhpcy5fZXhwYW5kKG9mZiArIDEpO1xuXG4gICAgaWYgKHZhbCkge1xuICAgICAgdGhpcy53b3Jkc1tvZmZdID0gdGhpcy53b3Jkc1tvZmZdIHwgKDEgPDwgd2JpdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud29yZHNbb2ZmXSA9IHRoaXMud29yZHNbb2ZmXSAmIH4oMSA8PCB3Yml0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIEFkZCBgbnVtYCB0byBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLmlhZGQgPSBmdW5jdGlvbiBpYWRkIChudW0pIHtcbiAgICB2YXIgcjtcblxuICAgIC8vIG5lZ2F0aXZlICsgcG9zaXRpdmVcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBudW0ubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgciA9IHRoaXMuaXN1YihudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSBePSAxO1xuICAgICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7XG5cbiAgICAvLyBwb3NpdGl2ZSArIG5lZ2F0aXZlXG4gICAgfSBlbHNlIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG51bS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMDtcbiAgICAgIHIgPSB0aGlzLmlzdWIobnVtKTtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gci5fbm9ybVNpZ24oKTtcbiAgICB9XG5cbiAgICAvLyBhLmxlbmd0aCA+IGIubGVuZ3RoXG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkge1xuICAgICAgYSA9IHRoaXM7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gbnVtO1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApICsgKGIud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgICBjYXJyeSA9IHIgPj4+IDI2O1xuICAgIH1cbiAgICBmb3IgKDsgY2FycnkgIT09IDAgJiYgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgIGNhcnJ5ID0gciA+Pj4gMjY7XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBhLmxlbmd0aDtcbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGhdID0gY2Fycnk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIC8vIENvcHkgdGhlIHJlc3Qgb2YgdGhlIHdvcmRzXG4gICAgfSBlbHNlIGlmIChhICE9PSB0aGlzKSB7XG4gICAgICBmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gQWRkIGBudW1gIHRvIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkIChudW0pIHtcbiAgICB2YXIgcmVzO1xuICAgIGlmIChudW0ubmVnYXRpdmUgIT09IDAgJiYgdGhpcy5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMDtcbiAgICAgIHJlcyA9IHRoaXMuc3ViKG51bSk7XG4gICAgICBudW0ubmVnYXRpdmUgXj0gMTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSBlbHNlIGlmIChudW0ubmVnYXRpdmUgPT09IDAgJiYgdGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXMgPSBudW0uc3ViKHRoaXMpO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaWFkZChudW0pO1xuXG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLmlhZGQodGhpcyk7XG4gIH07XG5cbiAgLy8gU3VidHJhY3QgYG51bWAgZnJvbSBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbiBpc3ViIChudW0pIHtcbiAgICAvLyB0aGlzIC0gKC1udW0pID0gdGhpcyArIG51bVxuICAgIGlmIChudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDA7XG4gICAgICB2YXIgciA9IHRoaXMuaWFkZChudW0pO1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiByLl9ub3JtU2lnbigpO1xuXG4gICAgLy8gLXRoaXMgLSBudW0gPSAtKHRoaXMgKyBudW0pXG4gICAgfSBlbHNlIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMuaWFkZChudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcbiAgICB9XG5cbiAgICAvLyBBdCB0aGlzIHBvaW50IGJvdGggbnVtYmVycyBhcmUgcG9zaXRpdmVcbiAgICB2YXIgY21wID0gdGhpcy5jbXAobnVtKTtcblxuICAgIC8vIE9wdGltaXphdGlvbiAtIHplcm9pZnlcbiAgICBpZiAoY21wID09PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAwO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gYSA+IGJcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAoY21wID4gMCkge1xuICAgICAgYSA9IHRoaXM7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gbnVtO1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApIC0gKGIud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSByID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgfVxuICAgIGZvciAoOyBjYXJyeSAhPT0gMCAmJiBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gciA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIC8vIENvcHkgcmVzdCBvZiB0aGUgd29yZHNcbiAgICBpZiAoY2FycnkgPT09IDAgJiYgaSA8IGEubGVuZ3RoICYmIGEgIT09IHRoaXMpIHtcbiAgICAgIGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoLCBpKTtcblxuICAgIGlmIChhICE9PSB0aGlzKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIFN1YnRyYWN0IGBudW1gIGZyb20gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbiBzdWIgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1YihudW0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHNtYWxsTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgb3V0Lm5lZ2F0aXZlID0gbnVtLm5lZ2F0aXZlIF4gc2VsZi5uZWdhdGl2ZTtcbiAgICB2YXIgbGVuID0gKHNlbGYubGVuZ3RoICsgbnVtLmxlbmd0aCkgfCAwO1xuICAgIG91dC5sZW5ndGggPSBsZW47XG4gICAgbGVuID0gKGxlbiAtIDEpIHwgMDtcblxuICAgIC8vIFBlZWwgb25lIGl0ZXJhdGlvbiAoY29tcGlsZXIgY2FuJ3QgZG8gaXQsIGJlY2F1c2Ugb2YgY29kZSBjb21wbGV4aXR5KVxuICAgIHZhciBhID0gc2VsZi53b3Jkc1swXSB8IDA7XG4gICAgdmFyIGIgPSBudW0ud29yZHNbMF0gfCAwO1xuICAgIHZhciByID0gYSAqIGI7XG5cbiAgICB2YXIgbG8gPSByICYgMHgzZmZmZmZmO1xuICAgIHZhciBjYXJyeSA9IChyIC8gMHg0MDAwMDAwKSB8IDA7XG4gICAgb3V0LndvcmRzWzBdID0gbG87XG5cbiAgICBmb3IgKHZhciBrID0gMTsgayA8IGxlbjsgaysrKSB7XG4gICAgICAvLyBTdW0gYWxsIHdvcmRzIHdpdGggdGhlIHNhbWUgYGkgKyBqID0ga2AgYW5kIGFjY3VtdWxhdGUgYG5jYXJyeWAsXG4gICAgICAvLyBub3RlIHRoYXQgbmNhcnJ5IGNvdWxkIGJlID49IDB4M2ZmZmZmZlxuICAgICAgdmFyIG5jYXJyeSA9IGNhcnJ5ID4+PiAyNjtcbiAgICAgIHZhciByd29yZCA9IGNhcnJ5ICYgMHgzZmZmZmZmO1xuICAgICAgdmFyIG1heEogPSBNYXRoLm1pbihrLCBudW0ubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBqID0gTWF0aC5tYXgoMCwgayAtIHNlbGYubGVuZ3RoICsgMSk7IGogPD0gbWF4SjsgaisrKSB7XG4gICAgICAgIHZhciBpID0gKGsgLSBqKSB8IDA7XG4gICAgICAgIGEgPSBzZWxmLndvcmRzW2ldIHwgMDtcbiAgICAgICAgYiA9IG51bS53b3Jkc1tqXSB8IDA7XG4gICAgICAgIHIgPSBhICogYiArIHJ3b3JkO1xuICAgICAgICBuY2FycnkgKz0gKHIgLyAweDQwMDAwMDApIHwgMDtcbiAgICAgICAgcndvcmQgPSByICYgMHgzZmZmZmZmO1xuICAgICAgfVxuICAgICAgb3V0LndvcmRzW2tdID0gcndvcmQgfCAwO1xuICAgICAgY2FycnkgPSBuY2FycnkgfCAwO1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIG91dC53b3Jkc1trXSA9IGNhcnJ5IHwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lmxlbmd0aC0tO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQuc3RyaXAoKTtcbiAgfVxuXG4gIC8vIFRPRE8oaW5kdXRueSk6IGl0IG1heSBiZSByZWFzb25hYmxlIHRvIG9taXQgaXQgZm9yIHVzZXJzIHdobyBkb24ndCBuZWVkXG4gIC8vIHRvIHdvcmsgd2l0aCAyNTYtYml0IG51bWJlcnMsIG90aGVyd2lzZSBpdCBnaXZlcyAyMCUgaW1wcm92ZW1lbnQgZm9yIDI1Ni1iaXRcbiAgLy8gbXVsdGlwbGljYXRpb24gKGxpa2UgZWxsaXB0aWMgc2VjcDI1NmsxKS5cbiAgdmFyIGNvbWIxME11bFRvID0gZnVuY3Rpb24gY29tYjEwTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgdmFyIGEgPSBzZWxmLndvcmRzO1xuICAgIHZhciBiID0gbnVtLndvcmRzO1xuICAgIHZhciBvID0gb3V0LndvcmRzO1xuICAgIHZhciBjID0gMDtcbiAgICB2YXIgbG87XG4gICAgdmFyIG1pZDtcbiAgICB2YXIgaGk7XG4gICAgdmFyIGEwID0gYVswXSB8IDA7XG4gICAgdmFyIGFsMCA9IGEwICYgMHgxZmZmO1xuICAgIHZhciBhaDAgPSBhMCA+Pj4gMTM7XG4gICAgdmFyIGExID0gYVsxXSB8IDA7XG4gICAgdmFyIGFsMSA9IGExICYgMHgxZmZmO1xuICAgIHZhciBhaDEgPSBhMSA+Pj4gMTM7XG4gICAgdmFyIGEyID0gYVsyXSB8IDA7XG4gICAgdmFyIGFsMiA9IGEyICYgMHgxZmZmO1xuICAgIHZhciBhaDIgPSBhMiA+Pj4gMTM7XG4gICAgdmFyIGEzID0gYVszXSB8IDA7XG4gICAgdmFyIGFsMyA9IGEzICYgMHgxZmZmO1xuICAgIHZhciBhaDMgPSBhMyA+Pj4gMTM7XG4gICAgdmFyIGE0ID0gYVs0XSB8IDA7XG4gICAgdmFyIGFsNCA9IGE0ICYgMHgxZmZmO1xuICAgIHZhciBhaDQgPSBhNCA+Pj4gMTM7XG4gICAgdmFyIGE1ID0gYVs1XSB8IDA7XG4gICAgdmFyIGFsNSA9IGE1ICYgMHgxZmZmO1xuICAgIHZhciBhaDUgPSBhNSA+Pj4gMTM7XG4gICAgdmFyIGE2ID0gYVs2XSB8IDA7XG4gICAgdmFyIGFsNiA9IGE2ICYgMHgxZmZmO1xuICAgIHZhciBhaDYgPSBhNiA+Pj4gMTM7XG4gICAgdmFyIGE3ID0gYVs3XSB8IDA7XG4gICAgdmFyIGFsNyA9IGE3ICYgMHgxZmZmO1xuICAgIHZhciBhaDcgPSBhNyA+Pj4gMTM7XG4gICAgdmFyIGE4ID0gYVs4XSB8IDA7XG4gICAgdmFyIGFsOCA9IGE4ICYgMHgxZmZmO1xuICAgIHZhciBhaDggPSBhOCA+Pj4gMTM7XG4gICAgdmFyIGE5ID0gYVs5XSB8IDA7XG4gICAgdmFyIGFsOSA9IGE5ICYgMHgxZmZmO1xuICAgIHZhciBhaDkgPSBhOSA+Pj4gMTM7XG4gICAgdmFyIGIwID0gYlswXSB8IDA7XG4gICAgdmFyIGJsMCA9IGIwICYgMHgxZmZmO1xuICAgIHZhciBiaDAgPSBiMCA+Pj4gMTM7XG4gICAgdmFyIGIxID0gYlsxXSB8IDA7XG4gICAgdmFyIGJsMSA9IGIxICYgMHgxZmZmO1xuICAgIHZhciBiaDEgPSBiMSA+Pj4gMTM7XG4gICAgdmFyIGIyID0gYlsyXSB8IDA7XG4gICAgdmFyIGJsMiA9IGIyICYgMHgxZmZmO1xuICAgIHZhciBiaDIgPSBiMiA+Pj4gMTM7XG4gICAgdmFyIGIzID0gYlszXSB8IDA7XG4gICAgdmFyIGJsMyA9IGIzICYgMHgxZmZmO1xuICAgIHZhciBiaDMgPSBiMyA+Pj4gMTM7XG4gICAgdmFyIGI0ID0gYls0XSB8IDA7XG4gICAgdmFyIGJsNCA9IGI0ICYgMHgxZmZmO1xuICAgIHZhciBiaDQgPSBiNCA+Pj4gMTM7XG4gICAgdmFyIGI1ID0gYls1XSB8IDA7XG4gICAgdmFyIGJsNSA9IGI1ICYgMHgxZmZmO1xuICAgIHZhciBiaDUgPSBiNSA+Pj4gMTM7XG4gICAgdmFyIGI2ID0gYls2XSB8IDA7XG4gICAgdmFyIGJsNiA9IGI2ICYgMHgxZmZmO1xuICAgIHZhciBiaDYgPSBiNiA+Pj4gMTM7XG4gICAgdmFyIGI3ID0gYls3XSB8IDA7XG4gICAgdmFyIGJsNyA9IGI3ICYgMHgxZmZmO1xuICAgIHZhciBiaDcgPSBiNyA+Pj4gMTM7XG4gICAgdmFyIGI4ID0gYls4XSB8IDA7XG4gICAgdmFyIGJsOCA9IGI4ICYgMHgxZmZmO1xuICAgIHZhciBiaDggPSBiOCA+Pj4gMTM7XG4gICAgdmFyIGI5ID0gYls5XSB8IDA7XG4gICAgdmFyIGJsOSA9IGI5ICYgMHgxZmZmO1xuICAgIHZhciBiaDkgPSBiOSA+Pj4gMTM7XG5cbiAgICBvdXQubmVnYXRpdmUgPSBzZWxmLm5lZ2F0aXZlIF4gbnVtLm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSAxOTtcbiAgICAvKiBrID0gMCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwwLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgwLCBiaDApO1xuICAgIHZhciB3MCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzAgPj4+IDI2KSkgfCAwO1xuICAgIHcwICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwxLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgxLCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoMSkpIHwgMDtcbiAgICB2YXIgdzEgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxID4+PiAyNikpIHwgMDtcbiAgICB3MSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDIgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDIsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMiwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMiwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmgyKSkgfCAwO1xuICAgIHZhciB3MiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzIgPj4+IDI2KSkgfCAwO1xuICAgIHcyICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMywgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwzLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgzLCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmgzKSkgfCAwO1xuICAgIHZhciB3MyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzMgPj4+IDI2KSkgfCAwO1xuICAgIHczICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw0LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg0LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNCkpIHwgMDtcbiAgICB2YXIgdzQgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc0ID4+PiAyNikpIHwgMDtcbiAgICB3NCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDUgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDUsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNSwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNSwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg1KSkgfCAwO1xuICAgIHZhciB3NSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzUgPj4+IDI2KSkgfCAwO1xuICAgIHc1ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNiwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw2LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg2LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg2KSkgfCAwO1xuICAgIHZhciB3NiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzYgPj4+IDI2KSkgfCAwO1xuICAgIHc2ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNywgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw3LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg3LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNykpIHwgMDtcbiAgICB2YXIgdzcgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc3ID4+PiAyNikpIHwgMDtcbiAgICB3NyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDggKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDgsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOCwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOCwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg4KSkgfCAwO1xuICAgIHZhciB3OCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzggPj4+IDI2KSkgfCAwO1xuICAgIHc4ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gOSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg5KSkgfCAwO1xuICAgIHZhciB3OSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzkgPj4+IDI2KSkgfCAwO1xuICAgIHc5ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTAgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMSk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgxKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwxKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgxKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTAgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMCA+Pj4gMjYpKSB8IDA7XG4gICAgdzEwICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTEgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMik7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgyKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwyKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgyKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzExID4+PiAyNikpIHwgMDtcbiAgICB3MTEgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwzKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDMpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDMpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDMpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg5KSkgfCAwO1xuICAgIHZhciB3MTIgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMiA+Pj4gMjYpKSB8IDA7XG4gICAgdzEyICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTMgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg0KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw0KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg0KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTMgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMyA+Pj4gMjYpKSB8IDA7XG4gICAgdzEzICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTQgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNSk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg1KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw1KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg1KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE0ID4+PiAyNikpIHwgMDtcbiAgICB3MTQgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw2KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDYpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDYpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDYpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTUgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNSA+Pj4gMjYpKSB8IDA7XG4gICAgdzE1ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTYgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNyk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg3KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw3KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg3KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg5KSkgfCAwO1xuICAgIHZhciB3MTYgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNiA+Pj4gMjYpKSB8IDA7XG4gICAgdzE2ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTcgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsOCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg4KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw4KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg4KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE3ID4+PiAyNikpIHwgMDtcbiAgICB3MTcgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxOCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw5KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDkpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDkpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDkpO1xuICAgIHZhciB3MTggPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxOCA+Pj4gMjYpKSB8IDA7XG4gICAgdzE4ICY9IDB4M2ZmZmZmZjtcbiAgICBvWzBdID0gdzA7XG4gICAgb1sxXSA9IHcxO1xuICAgIG9bMl0gPSB3MjtcbiAgICBvWzNdID0gdzM7XG4gICAgb1s0XSA9IHc0O1xuICAgIG9bNV0gPSB3NTtcbiAgICBvWzZdID0gdzY7XG4gICAgb1s3XSA9IHc3O1xuICAgIG9bOF0gPSB3ODtcbiAgICBvWzldID0gdzk7XG4gICAgb1sxMF0gPSB3MTA7XG4gICAgb1sxMV0gPSB3MTE7XG4gICAgb1sxMl0gPSB3MTI7XG4gICAgb1sxM10gPSB3MTM7XG4gICAgb1sxNF0gPSB3MTQ7XG4gICAgb1sxNV0gPSB3MTU7XG4gICAgb1sxNl0gPSB3MTY7XG4gICAgb1sxN10gPSB3MTc7XG4gICAgb1sxOF0gPSB3MTg7XG4gICAgaWYgKGMgIT09IDApIHtcbiAgICAgIG9bMTldID0gYztcbiAgICAgIG91dC5sZW5ndGgrKztcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcblxuICAvLyBQb2x5ZmlsbCBjb21iXG4gIGlmICghTWF0aC5pbXVsKSB7XG4gICAgY29tYjEwTXVsVG8gPSBzbWFsbE11bFRvO1xuICB9XG5cbiAgZnVuY3Rpb24gYmlnTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgb3V0Lm5lZ2F0aXZlID0gbnVtLm5lZ2F0aXZlIF4gc2VsZi5uZWdhdGl2ZTtcbiAgICBvdXQubGVuZ3RoID0gc2VsZi5sZW5ndGggKyBudW0ubGVuZ3RoO1xuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICB2YXIgaG5jYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBvdXQubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICAvLyBTdW0gYWxsIHdvcmRzIHdpdGggdGhlIHNhbWUgYGkgKyBqID0ga2AgYW5kIGFjY3VtdWxhdGUgYG5jYXJyeWAsXG4gICAgICAvLyBub3RlIHRoYXQgbmNhcnJ5IGNvdWxkIGJlID49IDB4M2ZmZmZmZlxuICAgICAgdmFyIG5jYXJyeSA9IGhuY2Fycnk7XG4gICAgICBobmNhcnJ5ID0gMDtcbiAgICAgIHZhciByd29yZCA9IGNhcnJ5ICYgMHgzZmZmZmZmO1xuICAgICAgdmFyIG1heEogPSBNYXRoLm1pbihrLCBudW0ubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBqID0gTWF0aC5tYXgoMCwgayAtIHNlbGYubGVuZ3RoICsgMSk7IGogPD0gbWF4SjsgaisrKSB7XG4gICAgICAgIHZhciBpID0gayAtIGo7XG4gICAgICAgIHZhciBhID0gc2VsZi53b3Jkc1tpXSB8IDA7XG4gICAgICAgIHZhciBiID0gbnVtLndvcmRzW2pdIHwgMDtcbiAgICAgICAgdmFyIHIgPSBhICogYjtcblxuICAgICAgICB2YXIgbG8gPSByICYgMHgzZmZmZmZmO1xuICAgICAgICBuY2FycnkgPSAobmNhcnJ5ICsgKChyIC8gMHg0MDAwMDAwKSB8IDApKSB8IDA7XG4gICAgICAgIGxvID0gKGxvICsgcndvcmQpIHwgMDtcbiAgICAgICAgcndvcmQgPSBsbyAmIDB4M2ZmZmZmZjtcbiAgICAgICAgbmNhcnJ5ID0gKG5jYXJyeSArIChsbyA+Pj4gMjYpKSB8IDA7XG5cbiAgICAgICAgaG5jYXJyeSArPSBuY2FycnkgPj4+IDI2O1xuICAgICAgICBuY2FycnkgJj0gMHgzZmZmZmZmO1xuICAgICAgfVxuICAgICAgb3V0LndvcmRzW2tdID0gcndvcmQ7XG4gICAgICBjYXJyeSA9IG5jYXJyeTtcbiAgICAgIG5jYXJyeSA9IGhuY2Fycnk7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgb3V0LndvcmRzW2tdID0gY2Fycnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5sZW5ndGgtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0LnN0cmlwKCk7XG4gIH1cblxuICBmdW5jdGlvbiBqdW1ib011bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIHZhciBmZnRtID0gbmV3IEZGVE0oKTtcbiAgICByZXR1cm4gZmZ0bS5tdWxwKHNlbGYsIG51bSwgb3V0KTtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5tdWxUbyA9IGZ1bmN0aW9uIG11bFRvIChudW0sIG91dCkge1xuICAgIHZhciByZXM7XG4gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoICsgbnVtLmxlbmd0aDtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEwICYmIG51bS5sZW5ndGggPT09IDEwKSB7XG4gICAgICByZXMgPSBjb21iMTBNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIGlmIChsZW4gPCA2Mykge1xuICAgICAgcmVzID0gc21hbGxNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIGlmIChsZW4gPCAxMDI0KSB7XG4gICAgICByZXMgPSBiaWdNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IGp1bWJvTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gQ29vbGV5LVR1a2V5IGFsZ29yaXRobSBmb3IgRkZUXG4gIC8vIHNsaWdodGx5IHJldmlzaXRlZCB0byByZWx5IG9uIGxvb3BpbmcgaW5zdGVhZCBvZiByZWN1cnNpb25cblxuICBmdW5jdGlvbiBGRlRNICh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9XG5cbiAgRkZUTS5wcm90b3R5cGUubWFrZVJCVCA9IGZ1bmN0aW9uIG1ha2VSQlQgKE4pIHtcbiAgICB2YXIgdCA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgbCA9IEJOLnByb3RvdHlwZS5fY291bnRCaXRzKE4pIC0gMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgdFtpXSA9IHRoaXMucmV2QmluKGksIGwsIE4pO1xuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYmluYXJ5LXJldmVyc2VkIHJlcHJlc2VudGF0aW9uIG9mIGB4YFxuICBGRlRNLnByb3RvdHlwZS5yZXZCaW4gPSBmdW5jdGlvbiByZXZCaW4gKHgsIGwsIE4pIHtcbiAgICBpZiAoeCA9PT0gMCB8fCB4ID09PSBOIC0gMSkgcmV0dXJuIHg7XG5cbiAgICB2YXIgcmIgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICByYiB8PSAoeCAmIDEpIDw8IChsIC0gaSAtIDEpO1xuICAgICAgeCA+Pj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmI7XG4gIH07XG5cbiAgLy8gUGVyZm9ybXMgXCJ0d2VlZGxpbmdcIiBwaGFzZSwgdGhlcmVmb3JlICdlbXVsYXRpbmcnXG4gIC8vIGJlaGF2aW91ciBvZiB0aGUgcmVjdXJzaXZlIGFsZ29yaXRobVxuICBGRlRNLnByb3RvdHlwZS5wZXJtdXRlID0gZnVuY3Rpb24gcGVybXV0ZSAocmJ0LCByd3MsIGl3cywgcnR3cywgaXR3cywgTikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICBydHdzW2ldID0gcndzW3JidFtpXV07XG4gICAgICBpdHdzW2ldID0gaXdzW3JidFtpXV07XG4gICAgfVxuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIHRyYW5zZm9ybSAocndzLCBpd3MsIHJ0d3MsIGl0d3MsIE4sIHJidCkge1xuICAgIHRoaXMucGVybXV0ZShyYnQsIHJ3cywgaXdzLCBydHdzLCBpdHdzLCBOKTtcblxuICAgIGZvciAodmFyIHMgPSAxOyBzIDwgTjsgcyA8PD0gMSkge1xuICAgICAgdmFyIGwgPSBzIDw8IDE7XG5cbiAgICAgIHZhciBydHdkZiA9IE1hdGguY29zKDIgKiBNYXRoLlBJIC8gbCk7XG4gICAgICB2YXIgaXR3ZGYgPSBNYXRoLnNpbigyICogTWF0aC5QSSAvIGwpO1xuXG4gICAgICBmb3IgKHZhciBwID0gMDsgcCA8IE47IHAgKz0gbCkge1xuICAgICAgICB2YXIgcnR3ZGZfID0gcnR3ZGY7XG4gICAgICAgIHZhciBpdHdkZl8gPSBpdHdkZjtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHM7IGorKykge1xuICAgICAgICAgIHZhciByZSA9IHJ0d3NbcCArIGpdO1xuICAgICAgICAgIHZhciBpZSA9IGl0d3NbcCArIGpdO1xuXG4gICAgICAgICAgdmFyIHJvID0gcnR3c1twICsgaiArIHNdO1xuICAgICAgICAgIHZhciBpbyA9IGl0d3NbcCArIGogKyBzXTtcblxuICAgICAgICAgIHZhciByeCA9IHJ0d2RmXyAqIHJvIC0gaXR3ZGZfICogaW87XG5cbiAgICAgICAgICBpbyA9IHJ0d2RmXyAqIGlvICsgaXR3ZGZfICogcm87XG4gICAgICAgICAgcm8gPSByeDtcblxuICAgICAgICAgIHJ0d3NbcCArIGpdID0gcmUgKyBybztcbiAgICAgICAgICBpdHdzW3AgKyBqXSA9IGllICsgaW87XG5cbiAgICAgICAgICBydHdzW3AgKyBqICsgc10gPSByZSAtIHJvO1xuICAgICAgICAgIGl0d3NbcCArIGogKyBzXSA9IGllIC0gaW87XG5cbiAgICAgICAgICAvKiBqc2hpbnQgbWF4ZGVwdGggOiBmYWxzZSAqL1xuICAgICAgICAgIGlmIChqICE9PSBsKSB7XG4gICAgICAgICAgICByeCA9IHJ0d2RmICogcnR3ZGZfIC0gaXR3ZGYgKiBpdHdkZl87XG5cbiAgICAgICAgICAgIGl0d2RmXyA9IHJ0d2RmICogaXR3ZGZfICsgaXR3ZGYgKiBydHdkZl87XG4gICAgICAgICAgICBydHdkZl8gPSByeDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuZ3Vlc3NMZW4xM2IgPSBmdW5jdGlvbiBndWVzc0xlbjEzYiAobiwgbSkge1xuICAgIHZhciBOID0gTWF0aC5tYXgobSwgbikgfCAxO1xuICAgIHZhciBvZGQgPSBOICYgMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yIChOID0gTiAvIDIgfCAwOyBOOyBOID0gTiA+Pj4gMSkge1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiAxIDw8IGkgKyAxICsgb2RkO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLmNvbmp1Z2F0ZSA9IGZ1bmN0aW9uIGNvbmp1Z2F0ZSAocndzLCBpd3MsIE4pIHtcbiAgICBpZiAoTiA8PSAxKSByZXR1cm47XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE4gLyAyOyBpKyspIHtcbiAgICAgIHZhciB0ID0gcndzW2ldO1xuXG4gICAgICByd3NbaV0gPSByd3NbTiAtIGkgLSAxXTtcbiAgICAgIHJ3c1tOIC0gaSAtIDFdID0gdDtcblxuICAgICAgdCA9IGl3c1tpXTtcblxuICAgICAgaXdzW2ldID0gLWl3c1tOIC0gaSAtIDFdO1xuICAgICAgaXdzW04gLSBpIC0gMV0gPSAtdDtcbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUubm9ybWFsaXplMTNiID0gZnVuY3Rpb24gbm9ybWFsaXplMTNiICh3cywgTikge1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOIC8gMjsgaSsrKSB7XG4gICAgICB2YXIgdyA9IE1hdGgucm91bmQod3NbMiAqIGkgKyAxXSAvIE4pICogMHgyMDAwICtcbiAgICAgICAgTWF0aC5yb3VuZCh3c1syICogaV0gLyBOKSArXG4gICAgICAgIGNhcnJ5O1xuXG4gICAgICB3c1tpXSA9IHcgJiAweDNmZmZmZmY7XG5cbiAgICAgIGlmICh3IDwgMHg0MDAwMDAwKSB7XG4gICAgICAgIGNhcnJ5ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhcnJ5ID0gdyAvIDB4NDAwMDAwMCB8IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHdzO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLmNvbnZlcnQxM2IgPSBmdW5jdGlvbiBjb252ZXJ0MTNiICh3cywgbGVuLCByd3MsIE4pIHtcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNhcnJ5ID0gY2FycnkgKyAod3NbaV0gfCAwKTtcblxuICAgICAgcndzWzIgKiBpXSA9IGNhcnJ5ICYgMHgxZmZmOyBjYXJyeSA9IGNhcnJ5ID4+PiAxMztcbiAgICAgIHJ3c1syICogaSArIDFdID0gY2FycnkgJiAweDFmZmY7IGNhcnJ5ID0gY2FycnkgPj4+IDEzO1xuICAgIH1cblxuICAgIC8vIFBhZCB3aXRoIHplcm9lc1xuICAgIGZvciAoaSA9IDIgKiBsZW47IGkgPCBOOyArK2kpIHtcbiAgICAgIHJ3c1tpXSA9IDA7XG4gICAgfVxuXG4gICAgYXNzZXJ0KGNhcnJ5ID09PSAwKTtcbiAgICBhc3NlcnQoKGNhcnJ5ICYgfjB4MWZmZikgPT09IDApO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLnN0dWIgPSBmdW5jdGlvbiBzdHViIChOKSB7XG4gICAgdmFyIHBoID0gbmV3IEFycmF5KE4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICBwaFtpXSA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBoO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLm11bHAgPSBmdW5jdGlvbiBtdWxwICh4LCB5LCBvdXQpIHtcbiAgICB2YXIgTiA9IDIgKiB0aGlzLmd1ZXNzTGVuMTNiKHgubGVuZ3RoLCB5Lmxlbmd0aCk7XG5cbiAgICB2YXIgcmJ0ID0gdGhpcy5tYWtlUkJUKE4pO1xuXG4gICAgdmFyIF8gPSB0aGlzLnN0dWIoTik7XG5cbiAgICB2YXIgcndzID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciByd3N0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBpd3N0ID0gbmV3IEFycmF5KE4pO1xuXG4gICAgdmFyIG5yd3MgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIG5yd3N0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBuaXdzdCA9IG5ldyBBcnJheShOKTtcblxuICAgIHZhciBybXdzID0gb3V0LndvcmRzO1xuICAgIHJtd3MubGVuZ3RoID0gTjtcblxuICAgIHRoaXMuY29udmVydDEzYih4LndvcmRzLCB4Lmxlbmd0aCwgcndzLCBOKTtcbiAgICB0aGlzLmNvbnZlcnQxM2IoeS53b3JkcywgeS5sZW5ndGgsIG5yd3MsIE4pO1xuXG4gICAgdGhpcy50cmFuc2Zvcm0ocndzLCBfLCByd3N0LCBpd3N0LCBOLCByYnQpO1xuICAgIHRoaXMudHJhbnNmb3JtKG5yd3MsIF8sIG5yd3N0LCBuaXdzdCwgTiwgcmJ0KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICB2YXIgcnggPSByd3N0W2ldICogbnJ3c3RbaV0gLSBpd3N0W2ldICogbml3c3RbaV07XG4gICAgICBpd3N0W2ldID0gcndzdFtpXSAqIG5pd3N0W2ldICsgaXdzdFtpXSAqIG5yd3N0W2ldO1xuICAgICAgcndzdFtpXSA9IHJ4O1xuICAgIH1cblxuICAgIHRoaXMuY29uanVnYXRlKHJ3c3QsIGl3c3QsIE4pO1xuICAgIHRoaXMudHJhbnNmb3JtKHJ3c3QsIGl3c3QsIHJtd3MsIF8sIE4sIHJidCk7XG4gICAgdGhpcy5jb25qdWdhdGUocm13cywgXywgTik7XG4gICAgdGhpcy5ub3JtYWxpemUxM2Iocm13cywgTik7XG5cbiAgICBvdXQubmVnYXRpdmUgPSB4Lm5lZ2F0aXZlIF4geS5uZWdhdGl2ZTtcbiAgICBvdXQubGVuZ3RoID0geC5sZW5ndGggKyB5Lmxlbmd0aDtcbiAgICByZXR1cm4gb3V0LnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gTXVsdGlwbHkgYHRoaXNgIGJ5IGBudW1gXG4gIEJOLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwgKG51bSkge1xuICAgIHZhciBvdXQgPSBuZXcgQk4obnVsbCk7XG4gICAgb3V0LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgbnVtLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXMubXVsVG8obnVtLCBvdXQpO1xuICB9O1xuXG4gIC8vIE11bHRpcGx5IGVtcGxveWluZyBGRlRcbiAgQk4ucHJvdG90eXBlLm11bGYgPSBmdW5jdGlvbiBtdWxmIChudW0pIHtcbiAgICB2YXIgb3V0ID0gbmV3IEJOKG51bGwpO1xuICAgIG91dC53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCArIG51bS5sZW5ndGgpO1xuICAgIHJldHVybiBqdW1ib011bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgfTtcblxuICAvLyBJbi1wbGFjZSBNdWx0aXBsaWNhdGlvblxuICBCTi5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkubXVsVG8obnVtLCB0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW11bG4gPSBmdW5jdGlvbiBpbXVsbiAobnVtKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBudW0gPT09ICdudW1iZXInKTtcbiAgICBhc3NlcnQobnVtIDwgMHg0MDAwMDAwKTtcblxuICAgIC8vIENhcnJ5XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gKHRoaXMud29yZHNbaV0gfCAwKSAqIG51bTtcbiAgICAgIHZhciBsbyA9ICh3ICYgMHgzZmZmZmZmKSArIChjYXJyeSAmIDB4M2ZmZmZmZik7XG4gICAgICBjYXJyeSA+Pj0gMjY7XG4gICAgICBjYXJyeSArPSAodyAvIDB4NDAwMDAwMCkgfCAwO1xuICAgICAgLy8gTk9URTogbG8gaXMgMjdiaXQgbWF4aW11bVxuICAgICAgY2FycnkgKz0gbG8gPj4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGxvICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBudW0gPT09IDAgPyAxIDogdGhpcy5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubXVsbiA9IGZ1bmN0aW9uIG11bG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW11bG4obnVtKTtcbiAgfTtcblxuICAvLyBgdGhpc2AgKiBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uIHNxciAoKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsKHRoaXMpO1xuICB9O1xuXG4gIC8vIGB0aGlzYCAqIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXNxciA9IGZ1bmN0aW9uIGlzcXIgKCkge1xuICAgIHJldHVybiB0aGlzLmltdWwodGhpcy5jbG9uZSgpKTtcbiAgfTtcblxuICAvLyBNYXRoLnBvdyhgdGhpc2AsIGBudW1gKVxuICBCTi5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24gcG93IChudW0pIHtcbiAgICB2YXIgdyA9IHRvQml0QXJyYXkobnVtKTtcbiAgICBpZiAody5sZW5ndGggPT09IDApIHJldHVybiBuZXcgQk4oMSk7XG5cbiAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzXG4gICAgdmFyIHJlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3Lmxlbmd0aDsgaSsrLCByZXMgPSByZXMuc3FyKCkpIHtcbiAgICAgIGlmICh3W2ldICE9PSAwKSBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoKytpIDwgdy5sZW5ndGgpIHtcbiAgICAgIGZvciAodmFyIHEgPSByZXMuc3FyKCk7IGkgPCB3Lmxlbmd0aDsgaSsrLCBxID0gcS5zcXIoKSkge1xuICAgICAgICBpZiAod1tpXSA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgcmVzID0gcmVzLm11bChxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIFNoaWZ0LWxlZnQgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1c2hsbiA9IGZ1bmN0aW9uIGl1c2hsbiAoYml0cykge1xuICAgIGFzc2VydCh0eXBlb2YgYml0cyA9PT0gJ251bWJlcicgJiYgYml0cyA+PSAwKTtcbiAgICB2YXIgciA9IGJpdHMgJSAyNjtcbiAgICB2YXIgcyA9IChiaXRzIC0gcikgLyAyNjtcbiAgICB2YXIgY2FycnlNYXNrID0gKDB4M2ZmZmZmZiA+Pj4gKDI2IC0gcikpIDw8ICgyNiAtIHIpO1xuICAgIHZhciBpO1xuXG4gICAgaWYgKHIgIT09IDApIHtcbiAgICAgIHZhciBjYXJyeSA9IDA7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBuZXdDYXJyeSA9IHRoaXMud29yZHNbaV0gJiBjYXJyeU1hc2s7XG4gICAgICAgIHZhciBjID0gKCh0aGlzLndvcmRzW2ldIHwgMCkgLSBuZXdDYXJyeSkgPDwgcjtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGMgfCBjYXJyeTtcbiAgICAgICAgY2FycnkgPSBuZXdDYXJyeSA+Pj4gKDI2IC0gcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChjYXJyeSkge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gY2Fycnk7XG4gICAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHMgIT09IDApIHtcbiAgICAgIGZvciAoaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgc10gPSB0aGlzLndvcmRzW2ldO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSAwO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxlbmd0aCArPSBzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzaGxuID0gZnVuY3Rpb24gaXNobG4gKGJpdHMpIHtcbiAgICAvLyBUT0RPKGluZHV0bnkpOiBpbXBsZW1lbnQgbWVcbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVzaGxuKGJpdHMpO1xuICB9O1xuXG4gIC8vIFNoaWZ0LXJpZ2h0IGluLXBsYWNlXG4gIC8vIE5PVEU6IGBoaW50YCBpcyBhIGxvd2VzdCBiaXQgYmVmb3JlIHRyYWlsaW5nIHplcm9lc1xuICAvLyBOT1RFOiBpZiBgZXh0ZW5kZWRgIGlzIHByZXNlbnQgLSBpdCB3aWxsIGJlIGZpbGxlZCB3aXRoIGRlc3Ryb3llZCBiaXRzXG4gIEJOLnByb3RvdHlwZS5pdXNocm4gPSBmdW5jdGlvbiBpdXNocm4gKGJpdHMsIGhpbnQsIGV4dGVuZGVkKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJyAmJiBiaXRzID49IDApO1xuICAgIHZhciBoO1xuICAgIGlmIChoaW50KSB7XG4gICAgICBoID0gKGhpbnQgLSAoaGludCAlIDI2KSkgLyAyNjtcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IDA7XG4gICAgfVxuXG4gICAgdmFyIHIgPSBiaXRzICUgMjY7XG4gICAgdmFyIHMgPSBNYXRoLm1pbigoYml0cyAtIHIpIC8gMjYsIHRoaXMubGVuZ3RoKTtcbiAgICB2YXIgbWFzayA9IDB4M2ZmZmZmZiBeICgoMHgzZmZmZmZmID4+PiByKSA8PCByKTtcbiAgICB2YXIgbWFza2VkV29yZHMgPSBleHRlbmRlZDtcblxuICAgIGggLT0gcztcbiAgICBoID0gTWF0aC5tYXgoMCwgaCk7XG5cbiAgICAvLyBFeHRlbmRlZCBtb2RlLCBjb3B5IG1hc2tlZCBwYXJ0XG4gICAgaWYgKG1hc2tlZFdvcmRzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgICAgICBtYXNrZWRXb3Jkcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV07XG4gICAgICB9XG4gICAgICBtYXNrZWRXb3Jkcy5sZW5ndGggPSBzO1xuICAgIH1cblxuICAgIGlmIChzID09PSAwKSB7XG4gICAgICAvLyBOby1vcCwgd2Ugc2hvdWxkIG5vdCBtb3ZlIGFueXRoaW5nIGF0IGFsbFxuICAgIH0gZWxzZSBpZiAodGhpcy5sZW5ndGggPiBzKSB7XG4gICAgICB0aGlzLmxlbmd0aCAtPSBzO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaSArIHNdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndvcmRzWzBdID0gMDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICB9XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAoaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwICYmIChjYXJyeSAhPT0gMCB8fCBpID49IGgpOyBpLS0pIHtcbiAgICAgIHZhciB3b3JkID0gdGhpcy53b3Jkc1tpXSB8IDA7XG4gICAgICB0aGlzLndvcmRzW2ldID0gKGNhcnJ5IDw8ICgyNiAtIHIpKSB8ICh3b3JkID4+PiByKTtcbiAgICAgIGNhcnJ5ID0gd29yZCAmIG1hc2s7XG4gICAgfVxuXG4gICAgLy8gUHVzaCBjYXJyaWVkIGJpdHMgYXMgYSBtYXNrXG4gICAgaWYgKG1hc2tlZFdvcmRzICYmIGNhcnJ5ICE9PSAwKSB7XG4gICAgICBtYXNrZWRXb3Jkcy53b3Jkc1ttYXNrZWRXb3Jkcy5sZW5ndGgrK10gPSBjYXJyeTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzaHJuID0gZnVuY3Rpb24gaXNocm4gKGJpdHMsIGhpbnQsIGV4dGVuZGVkKSB7XG4gICAgLy8gVE9ETyhpbmR1dG55KTogaW1wbGVtZW50IG1lXG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1c2hybihiaXRzLCBoaW50LCBleHRlbmRlZCk7XG4gIH07XG5cbiAgLy8gU2hpZnQtbGVmdFxuICBCTi5wcm90b3R5cGUuc2hsbiA9IGZ1bmN0aW9uIHNobG4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaGxuKGJpdHMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51c2hsbiA9IGZ1bmN0aW9uIHVzaGxuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNobG4oYml0cyk7XG4gIH07XG5cbiAgLy8gU2hpZnQtcmlnaHRcbiAgQk4ucHJvdG90eXBlLnNocm4gPSBmdW5jdGlvbiBzaHJuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hybihiaXRzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudXNocm4gPSBmdW5jdGlvbiB1c2hybiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaHJuKGJpdHMpO1xuICB9O1xuXG4gIC8vIFRlc3QgaWYgbiBiaXQgaXMgc2V0XG4gIEJOLnByb3RvdHlwZS50ZXN0biA9IGZ1bmN0aW9uIHRlc3RuIChiaXQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicgJiYgYml0ID49IDApO1xuICAgIHZhciByID0gYml0ICUgMjY7XG4gICAgdmFyIHMgPSAoYml0IC0gcikgLyAyNjtcbiAgICB2YXIgcSA9IDEgPDwgcjtcblxuICAgIC8vIEZhc3QgY2FzZTogYml0IGlzIG11Y2ggaGlnaGVyIHRoYW4gYWxsIGV4aXN0aW5nIHdvcmRzXG4gICAgaWYgKHRoaXMubGVuZ3RoIDw9IHMpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIENoZWNrIGJpdCBhbmQgcmV0dXJuXG4gICAgdmFyIHcgPSB0aGlzLndvcmRzW3NdO1xuXG4gICAgcmV0dXJuICEhKHcgJiBxKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gb25seSBsb3dlcnMgYml0cyBvZiBudW1iZXIgKGluLXBsYWNlKVxuICBCTi5wcm90b3R5cGUuaW1hc2tuID0gZnVuY3Rpb24gaW1hc2tuIChiaXRzKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJyAmJiBiaXRzID49IDApO1xuICAgIHZhciByID0gYml0cyAlIDI2O1xuICAgIHZhciBzID0gKGJpdHMgLSByKSAvIDI2O1xuXG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDAsICdpbWFza24gd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlIG51bWJlcnMnKTtcblxuICAgIGlmICh0aGlzLmxlbmd0aCA8PSBzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgcysrO1xuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWluKHMsIHRoaXMubGVuZ3RoKTtcblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICB2YXIgbWFzayA9IDB4M2ZmZmZmZiBeICgoMHgzZmZmZmZmID4+PiByKSA8PCByKTtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSAmPSBtYXNrO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG9ubHkgbG93ZXJzIGJpdHMgb2YgbnVtYmVyXG4gIEJOLnByb3RvdHlwZS5tYXNrbiA9IGZ1bmN0aW9uIG1hc2tuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24oYml0cyk7XG4gIH07XG5cbiAgLy8gQWRkIHBsYWluIG51bWJlciBgbnVtYCB0byBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmlhZGRuID0gZnVuY3Rpb24gaWFkZG4gKG51bSkge1xuICAgIGFzc2VydCh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyk7XG4gICAgYXNzZXJ0KG51bSA8IDB4NDAwMDAwMCk7XG4gICAgaWYgKG51bSA8IDApIHJldHVybiB0aGlzLmlzdWJuKC1udW0pO1xuXG4gICAgLy8gUG9zc2libGUgc2lnbiBjaGFuZ2VcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmICh0aGlzLndvcmRzWzBdIHwgMCkgPCBudW0pIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSA9IG51bSAtICh0aGlzLndvcmRzWzBdIHwgMCk7XG4gICAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlzdWJuKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCB3aXRob3V0IGNoZWNrc1xuICAgIHJldHVybiB0aGlzLl9pYWRkbihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faWFkZG4gPSBmdW5jdGlvbiBfaWFkZG4gKG51bSkge1xuICAgIHRoaXMud29yZHNbMF0gKz0gbnVtO1xuXG4gICAgLy8gQ2FycnlcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbaV0gPj0gMHg0MDAwMDAwOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gLT0gMHg0MDAwMDAwO1xuICAgICAgaWYgKGkgPT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyAxXSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyAxXSsrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoLCBpICsgMSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBTdWJ0cmFjdCBwbGFpbiBudW1iZXIgYG51bWAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmlzdWJuID0gZnVuY3Rpb24gaXN1Ym4gKG51bSkge1xuICAgIGFzc2VydCh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyk7XG4gICAgYXNzZXJ0KG51bSA8IDB4NDAwMDAwMCk7XG4gICAgaWYgKG51bSA8IDApIHJldHVybiB0aGlzLmlhZGRuKC1udW0pO1xuXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5pYWRkbihudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLndvcmRzWzBdIC09IG51bTtcblxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdIDwgMCkge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IC10aGlzLndvcmRzWzBdO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhcnJ5XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbaV0gPCAwOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSArPSAweDQwMDAwMDA7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdIC09IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYWRkbiA9IGZ1bmN0aW9uIGFkZG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFkZG4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuc3VibiA9IGZ1bmN0aW9uIHN1Ym4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1Ym4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaWFicyA9IGZ1bmN0aW9uIGlhYnMgKCkge1xuICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmFicyA9IGZ1bmN0aW9uIGFicyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWJzKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pc2hsbnN1Ym11bCA9IGZ1bmN0aW9uIF9pc2hsbnN1Ym11bCAobnVtLCBtdWwsIHNoaWZ0KSB7XG4gICAgdmFyIGxlbiA9IG51bS5sZW5ndGggKyBzaGlmdDtcbiAgICB2YXIgaTtcblxuICAgIHRoaXMuX2V4cGFuZChsZW4pO1xuXG4gICAgdmFyIHc7XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3ID0gKHRoaXMud29yZHNbaSArIHNoaWZ0XSB8IDApICsgY2Fycnk7XG4gICAgICB2YXIgcmlnaHQgPSAobnVtLndvcmRzW2ldIHwgMCkgKiBtdWw7XG4gICAgICB3IC09IHJpZ2h0ICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSAodyA+PiAyNikgLSAoKHJpZ2h0IC8gMHg0MDAwMDAwKSB8IDApO1xuICAgICAgdGhpcy53b3Jkc1tpICsgc2hpZnRdID0gdyAmIDB4M2ZmZmZmZjtcbiAgICB9XG4gICAgZm9yICg7IGkgPCB0aGlzLmxlbmd0aCAtIHNoaWZ0OyBpKyspIHtcbiAgICAgIHcgPSAodGhpcy53b3Jkc1tpICsgc2hpZnRdIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaSArIHNoaWZ0XSA9IHcgJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgaWYgKGNhcnJ5ID09PSAwKSByZXR1cm4gdGhpcy5zdHJpcCgpO1xuXG4gICAgLy8gU3VidHJhY3Rpb24gb3ZlcmZsb3dcbiAgICBhc3NlcnQoY2FycnkgPT09IC0xKTtcbiAgICBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHcgPSAtKHRoaXMud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSB3ID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHcgJiAweDNmZmZmZmY7XG4gICAgfVxuICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX3dvcmREaXYgPSBmdW5jdGlvbiBfd29yZERpdiAobnVtLCBtb2RlKSB7XG4gICAgdmFyIHNoaWZ0ID0gdGhpcy5sZW5ndGggLSBudW0ubGVuZ3RoO1xuXG4gICAgdmFyIGEgPSB0aGlzLmNsb25lKCk7XG4gICAgdmFyIGIgPSBudW07XG5cbiAgICAvLyBOb3JtYWxpemVcbiAgICB2YXIgYmhpID0gYi53b3Jkc1tiLmxlbmd0aCAtIDFdIHwgMDtcbiAgICB2YXIgYmhpQml0cyA9IHRoaXMuX2NvdW50Qml0cyhiaGkpO1xuICAgIHNoaWZ0ID0gMjYgLSBiaGlCaXRzO1xuICAgIGlmIChzaGlmdCAhPT0gMCkge1xuICAgICAgYiA9IGIudXNobG4oc2hpZnQpO1xuICAgICAgYS5pdXNobG4oc2hpZnQpO1xuICAgICAgYmhpID0gYi53b3Jkc1tiLmxlbmd0aCAtIDFdIHwgMDtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHF1b3RpZW50XG4gICAgdmFyIG0gPSBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICAgIHZhciBxO1xuXG4gICAgaWYgKG1vZGUgIT09ICdtb2QnKSB7XG4gICAgICBxID0gbmV3IEJOKG51bGwpO1xuICAgICAgcS5sZW5ndGggPSBtICsgMTtcbiAgICAgIHEud29yZHMgPSBuZXcgQXJyYXkocS5sZW5ndGgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHEud29yZHNbaV0gPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkaWZmID0gYS5jbG9uZSgpLl9pc2hsbnN1Ym11bChiLCAxLCBtKTtcbiAgICBpZiAoZGlmZi5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgYSA9IGRpZmY7XG4gICAgICBpZiAocSkge1xuICAgICAgICBxLndvcmRzW21dID0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBqID0gbSAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICB2YXIgcWogPSAoYS53b3Jkc1tiLmxlbmd0aCArIGpdIHwgMCkgKiAweDQwMDAwMDAgK1xuICAgICAgICAoYS53b3Jkc1tiLmxlbmd0aCArIGogLSAxXSB8IDApO1xuXG4gICAgICAvLyBOT1RFOiAocWogLyBiaGkpIGlzICgweDNmZmZmZmYgKiAweDQwMDAwMDAgKyAweDNmZmZmZmYpIC8gMHgyMDAwMDAwIG1heFxuICAgICAgLy8gKDB4N2ZmZmZmZilcbiAgICAgIHFqID0gTWF0aC5taW4oKHFqIC8gYmhpKSB8IDAsIDB4M2ZmZmZmZik7XG5cbiAgICAgIGEuX2lzaGxuc3VibXVsKGIsIHFqLCBqKTtcbiAgICAgIHdoaWxlIChhLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgIHFqLS07XG4gICAgICAgIGEubmVnYXRpdmUgPSAwO1xuICAgICAgICBhLl9pc2hsbnN1Ym11bChiLCAxLCBqKTtcbiAgICAgICAgaWYgKCFhLmlzWmVybygpKSB7XG4gICAgICAgICAgYS5uZWdhdGl2ZSBePSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocSkge1xuICAgICAgICBxLndvcmRzW2pdID0gcWo7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChxKSB7XG4gICAgICBxLnN0cmlwKCk7XG4gICAgfVxuICAgIGEuc3RyaXAoKTtcblxuICAgIC8vIERlbm9ybWFsaXplXG4gICAgaWYgKG1vZGUgIT09ICdkaXYnICYmIHNoaWZ0ICE9PSAwKSB7XG4gICAgICBhLml1c2hybihzaGlmdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpdjogcSB8fCBudWxsLFxuICAgICAgbW9kOiBhXG4gICAgfTtcbiAgfTtcblxuICAvLyBOT1RFOiAxKSBgbW9kZWAgY2FuIGJlIHNldCB0byBgbW9kYCB0byByZXF1ZXN0IG1vZCBvbmx5LFxuICAvLyAgICAgICB0byBgZGl2YCB0byByZXF1ZXN0IGRpdiBvbmx5LCBvciBiZSBhYnNlbnQgdG9cbiAgLy8gICAgICAgcmVxdWVzdCBib3RoIGRpdiAmIG1vZFxuICAvLyAgICAgICAyKSBgcG9zaXRpdmVgIGlzIHRydWUgaWYgdW5zaWduZWQgbW9kIGlzIHJlcXVlc3RlZFxuICBCTi5wcm90b3R5cGUuZGl2bW9kID0gZnVuY3Rpb24gZGl2bW9kIChudW0sIG1vZGUsIHBvc2l0aXZlKSB7XG4gICAgYXNzZXJ0KCFudW0uaXNaZXJvKCkpO1xuXG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogbmV3IEJOKDApLFxuICAgICAgICBtb2Q6IG5ldyBCTigwKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgZGl2LCBtb2QsIHJlcztcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBudW0ubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMubmVnKCkuZGl2bW9kKG51bSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgICBkaXYgPSByZXMuZGl2Lm5lZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kZSAhPT0gJ2RpdicpIHtcbiAgICAgICAgbW9kID0gcmVzLm1vZC5uZWcoKTtcbiAgICAgICAgaWYgKHBvc2l0aXZlICYmIG1vZC5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICAgIG1vZC5pYWRkKG51bSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBkaXYsXG4gICAgICAgIG1vZDogbW9kXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG51bS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgcmVzID0gdGhpcy5kaXZtb2QobnVtLm5lZygpLCBtb2RlKTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdtb2QnKSB7XG4gICAgICAgIGRpdiA9IHJlcy5kaXYubmVnKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogZGl2LFxuICAgICAgICBtb2Q6IHJlcy5tb2RcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCh0aGlzLm5lZ2F0aXZlICYgbnVtLm5lZ2F0aXZlKSAhPT0gMCkge1xuICAgICAgcmVzID0gdGhpcy5uZWcoKS5kaXZtb2QobnVtLm5lZygpLCBtb2RlKTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdkaXYnKSB7XG4gICAgICAgIG1vZCA9IHJlcy5tb2QubmVnKCk7XG4gICAgICAgIGlmIChwb3NpdGl2ZSAmJiBtb2QubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgICBtb2QuaXN1YihudW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogcmVzLmRpdixcbiAgICAgICAgbW9kOiBtb2RcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQm90aCBudW1iZXJzIGFyZSBwb3NpdGl2ZSBhdCB0aGlzIHBvaW50XG5cbiAgICAvLyBTdHJpcCBib3RoIG51bWJlcnMgdG8gYXBwcm94aW1hdGUgc2hpZnQgdmFsdWVcbiAgICBpZiAobnVtLmxlbmd0aCA+IHRoaXMubGVuZ3RoIHx8IHRoaXMuY21wKG51bSkgPCAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IG5ldyBCTigwKSxcbiAgICAgICAgbW9kOiB0aGlzXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFZlcnkgc2hvcnQgcmVkdWN0aW9uXG4gICAgaWYgKG51bS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChtb2RlID09PSAnZGl2Jykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRpdjogdGhpcy5kaXZuKG51bS53b3Jkc1swXSksXG4gICAgICAgICAgbW9kOiBudWxsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RlID09PSAnbW9kJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRpdjogbnVsbCxcbiAgICAgICAgICBtb2Q6IG5ldyBCTih0aGlzLm1vZG4obnVtLndvcmRzWzBdKSlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiB0aGlzLmRpdm4obnVtLndvcmRzWzBdKSxcbiAgICAgICAgbW9kOiBuZXcgQk4odGhpcy5tb2RuKG51bS53b3Jkc1swXSkpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3JkRGl2KG51bSwgbW9kZSk7XG4gIH07XG5cbiAgLy8gRmluZCBgdGhpc2AgLyBgbnVtYFxuICBCTi5wcm90b3R5cGUuZGl2ID0gZnVuY3Rpb24gZGl2IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXZtb2QobnVtLCAnZGl2JywgZmFsc2UpLmRpdjtcbiAgfTtcblxuICAvLyBGaW5kIGB0aGlzYCAlIGBudW1gXG4gIEJOLnByb3RvdHlwZS5tb2QgPSBmdW5jdGlvbiBtb2QgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmRpdm1vZChudW0sICdtb2QnLCBmYWxzZSkubW9kO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51bW9kID0gZnVuY3Rpb24gdW1vZCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2bW9kKG51bSwgJ21vZCcsIHRydWUpLm1vZDtcbiAgfTtcblxuICAvLyBGaW5kIFJvdW5kKGB0aGlzYCAvIGBudW1gKVxuICBCTi5wcm90b3R5cGUuZGl2Um91bmQgPSBmdW5jdGlvbiBkaXZSb3VuZCAobnVtKSB7XG4gICAgdmFyIGRtID0gdGhpcy5kaXZtb2QobnVtKTtcblxuICAgIC8vIEZhc3QgY2FzZSAtIGV4YWN0IGRpdmlzaW9uXG4gICAgaWYgKGRtLm1vZC5pc1plcm8oKSkgcmV0dXJuIGRtLmRpdjtcblxuICAgIHZhciBtb2QgPSBkbS5kaXYubmVnYXRpdmUgIT09IDAgPyBkbS5tb2QuaXN1YihudW0pIDogZG0ubW9kO1xuXG4gICAgdmFyIGhhbGYgPSBudW0udXNocm4oMSk7XG4gICAgdmFyIHIyID0gbnVtLmFuZGxuKDEpO1xuICAgIHZhciBjbXAgPSBtb2QuY21wKGhhbGYpO1xuXG4gICAgLy8gUm91bmQgZG93blxuICAgIGlmIChjbXAgPCAwIHx8IHIyID09PSAxICYmIGNtcCA9PT0gMCkgcmV0dXJuIGRtLmRpdjtcblxuICAgIC8vIFJvdW5kIHVwXG4gICAgcmV0dXJuIGRtLmRpdi5uZWdhdGl2ZSAhPT0gMCA/IGRtLmRpdi5pc3VibigxKSA6IGRtLmRpdi5pYWRkbigxKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubW9kbiA9IGZ1bmN0aW9uIG1vZG4gKG51bSkge1xuICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmKTtcbiAgICB2YXIgcCA9ICgxIDw8IDI2KSAlIG51bTtcblxuICAgIHZhciBhY2MgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBhY2MgPSAocCAqIGFjYyArICh0aGlzLndvcmRzW2ldIHwgMCkpICUgbnVtO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH07XG5cbiAgLy8gSW4tcGxhY2UgZGl2aXNpb24gYnkgbnVtYmVyXG4gIEJOLnByb3RvdHlwZS5pZGl2biA9IGZ1bmN0aW9uIGlkaXZuIChudW0pIHtcbiAgICBhc3NlcnQobnVtIDw9IDB4M2ZmZmZmZik7XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgdyA9ICh0aGlzLndvcmRzW2ldIHwgMCkgKyBjYXJyeSAqIDB4NDAwMDAwMDtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAodyAvIG51bSkgfCAwO1xuICAgICAgY2FycnkgPSB3ICUgbnVtO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmRpdm4gPSBmdW5jdGlvbiBkaXZuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlkaXZuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVnY2QgPSBmdW5jdGlvbiBlZ2NkIChwKSB7XG4gICAgYXNzZXJ0KHAubmVnYXRpdmUgPT09IDApO1xuICAgIGFzc2VydCghcC5pc1plcm8oKSk7XG5cbiAgICB2YXIgeCA9IHRoaXM7XG4gICAgdmFyIHkgPSBwLmNsb25lKCk7XG5cbiAgICBpZiAoeC5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgeCA9IHgudW1vZChwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHguY2xvbmUoKTtcbiAgICB9XG5cbiAgICAvLyBBICogeCArIEIgKiB5ID0geFxuICAgIHZhciBBID0gbmV3IEJOKDEpO1xuICAgIHZhciBCID0gbmV3IEJOKDApO1xuXG4gICAgLy8gQyAqIHggKyBEICogeSA9IHlcbiAgICB2YXIgQyA9IG5ldyBCTigwKTtcbiAgICB2YXIgRCA9IG5ldyBCTigxKTtcblxuICAgIHZhciBnID0gMDtcblxuICAgIHdoaWxlICh4LmlzRXZlbigpICYmIHkuaXNFdmVuKCkpIHtcbiAgICAgIHguaXVzaHJuKDEpO1xuICAgICAgeS5pdXNocm4oMSk7XG4gICAgICArK2c7XG4gICAgfVxuXG4gICAgdmFyIHlwID0geS5jbG9uZSgpO1xuICAgIHZhciB4cCA9IHguY2xvbmUoKTtcblxuICAgIHdoaWxlICgheC5pc1plcm8oKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGltID0gMTsgKHgud29yZHNbMF0gJiBpbSkgPT09IDAgJiYgaSA8IDI2OyArK2ksIGltIDw8PSAxKTtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICB4Lml1c2hybihpKTtcbiAgICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgICBpZiAoQS5pc09kZCgpIHx8IEIuaXNPZGQoKSkge1xuICAgICAgICAgICAgQS5pYWRkKHlwKTtcbiAgICAgICAgICAgIEIuaXN1Yih4cCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQS5pdXNocm4oMSk7XG4gICAgICAgICAgQi5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDAsIGptID0gMTsgKHkud29yZHNbMF0gJiBqbSkgPT09IDAgJiYgaiA8IDI2OyArK2osIGptIDw8PSAxKTtcbiAgICAgIGlmIChqID4gMCkge1xuICAgICAgICB5Lml1c2hybihqKTtcbiAgICAgICAgd2hpbGUgKGotLSA+IDApIHtcbiAgICAgICAgICBpZiAoQy5pc09kZCgpIHx8IEQuaXNPZGQoKSkge1xuICAgICAgICAgICAgQy5pYWRkKHlwKTtcbiAgICAgICAgICAgIEQuaXN1Yih4cCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQy5pdXNocm4oMSk7XG4gICAgICAgICAgRC5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHguY21wKHkpID49IDApIHtcbiAgICAgICAgeC5pc3ViKHkpO1xuICAgICAgICBBLmlzdWIoQyk7XG4gICAgICAgIEIuaXN1YihEKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHkuaXN1Yih4KTtcbiAgICAgICAgQy5pc3ViKEEpO1xuICAgICAgICBELmlzdWIoQik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGE6IEMsXG4gICAgICBiOiBELFxuICAgICAgZ2NkOiB5Lml1c2hsbihnKVxuICAgIH07XG4gIH07XG5cbiAgLy8gVGhpcyBpcyByZWR1Y2VkIGluY2FybmF0aW9uIG9mIHRoZSBiaW5hcnkgRUVBXG4gIC8vIGFib3ZlLCBkZXNpZ25hdGVkIHRvIGludmVydCBtZW1iZXJzIG9mIHRoZVxuICAvLyBfcHJpbWVfIGZpZWxkcyBGKHApIGF0IGEgbWF4aW1hbCBzcGVlZFxuICBCTi5wcm90b3R5cGUuX2ludm1wID0gZnVuY3Rpb24gX2ludm1wIChwKSB7XG4gICAgYXNzZXJ0KHAubmVnYXRpdmUgPT09IDApO1xuICAgIGFzc2VydCghcC5pc1plcm8oKSk7XG5cbiAgICB2YXIgYSA9IHRoaXM7XG4gICAgdmFyIGIgPSBwLmNsb25lKCk7XG5cbiAgICBpZiAoYS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgYSA9IGEudW1vZChwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IGEuY2xvbmUoKTtcbiAgICB9XG5cbiAgICB2YXIgeDEgPSBuZXcgQk4oMSk7XG4gICAgdmFyIHgyID0gbmV3IEJOKDApO1xuXG4gICAgdmFyIGRlbHRhID0gYi5jbG9uZSgpO1xuXG4gICAgd2hpbGUgKGEuY21wbigxKSA+IDAgJiYgYi5jbXBuKDEpID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGltID0gMTsgKGEud29yZHNbMF0gJiBpbSkgPT09IDAgJiYgaSA8IDI2OyArK2ksIGltIDw8PSAxKTtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBhLml1c2hybihpKTtcbiAgICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgICBpZiAoeDEuaXNPZGQoKSkge1xuICAgICAgICAgICAgeDEuaWFkZChkZWx0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgeDEuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGogPSAwLCBqbSA9IDE7IChiLndvcmRzWzBdICYgam0pID09PSAwICYmIGogPCAyNjsgKytqLCBqbSA8PD0gMSk7XG4gICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgYi5pdXNocm4oaik7XG4gICAgICAgIHdoaWxlIChqLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKHgyLmlzT2RkKCkpIHtcbiAgICAgICAgICAgIHgyLmlhZGQoZGVsdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHgyLml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYS5jbXAoYikgPj0gMCkge1xuICAgICAgICBhLmlzdWIoYik7XG4gICAgICAgIHgxLmlzdWIoeDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYi5pc3ViKGEpO1xuICAgICAgICB4Mi5pc3ViKHgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzO1xuICAgIGlmIChhLmNtcG4oMSkgPT09IDApIHtcbiAgICAgIHJlcyA9IHgxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSB4MjtcbiAgICB9XG5cbiAgICBpZiAocmVzLmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMuaWFkZChwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5nY2QgPSBmdW5jdGlvbiBnY2QgKG51bSkge1xuICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gbnVtLmFicygpO1xuICAgIGlmIChudW0uaXNaZXJvKCkpIHJldHVybiB0aGlzLmFicygpO1xuXG4gICAgdmFyIGEgPSB0aGlzLmNsb25lKCk7XG4gICAgdmFyIGIgPSBudW0uY2xvbmUoKTtcbiAgICBhLm5lZ2F0aXZlID0gMDtcbiAgICBiLm5lZ2F0aXZlID0gMDtcblxuICAgIC8vIFJlbW92ZSBjb21tb24gZmFjdG9yIG9mIHR3b1xuICAgIGZvciAodmFyIHNoaWZ0ID0gMDsgYS5pc0V2ZW4oKSAmJiBiLmlzRXZlbigpOyBzaGlmdCsrKSB7XG4gICAgICBhLml1c2hybigxKTtcbiAgICAgIGIuaXVzaHJuKDEpO1xuICAgIH1cblxuICAgIGRvIHtcbiAgICAgIHdoaWxlIChhLmlzRXZlbigpKSB7XG4gICAgICAgIGEuaXVzaHJuKDEpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGIuaXNFdmVuKCkpIHtcbiAgICAgICAgYi5pdXNocm4oMSk7XG4gICAgICB9XG5cbiAgICAgIHZhciByID0gYS5jbXAoYik7XG4gICAgICBpZiAociA8IDApIHtcbiAgICAgICAgLy8gU3dhcCBgYWAgYW5kIGBiYCB0byBtYWtlIGBhYCBhbHdheXMgYmlnZ2VyIHRoYW4gYGJgXG4gICAgICAgIHZhciB0ID0gYTtcbiAgICAgICAgYSA9IGI7XG4gICAgICAgIGIgPSB0O1xuICAgICAgfSBlbHNlIGlmIChyID09PSAwIHx8IGIuY21wbigxKSA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgYS5pc3ViKGIpO1xuICAgIH0gd2hpbGUgKHRydWUpO1xuXG4gICAgcmV0dXJuIGIuaXVzaGxuKHNoaWZ0KTtcbiAgfTtcblxuICAvLyBJbnZlcnQgbnVtYmVyIGluIHRoZSBmaWVsZCBGKG51bSlcbiAgQk4ucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbiBpbnZtIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5lZ2NkKG51bSkuYS51bW9kKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzRXZlbiA9IGZ1bmN0aW9uIGlzRXZlbiAoKSB7XG4gICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzT2RkID0gZnVuY3Rpb24gaXNPZGQgKCkge1xuICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAxO1xuICB9O1xuXG4gIC8vIEFuZCBmaXJzdCB3b3JkIGFuZCBudW1cbiAgQk4ucHJvdG90eXBlLmFuZGxuID0gZnVuY3Rpb24gYW5kbG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLndvcmRzWzBdICYgbnVtO1xuICB9O1xuXG4gIC8vIEluY3JlbWVudCBhdCB0aGUgYml0IHBvc2l0aW9uIGluLWxpbmVcbiAgQk4ucHJvdG90eXBlLmJpbmNuID0gZnVuY3Rpb24gYmluY24gKGJpdCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0ID09PSAnbnVtYmVyJyk7XG4gICAgdmFyIHIgPSBiaXQgJSAyNjtcbiAgICB2YXIgcyA9IChiaXQgLSByKSAvIDI2O1xuICAgIHZhciBxID0gMSA8PCByO1xuXG4gICAgLy8gRmFzdCBjYXNlOiBiaXQgaXMgbXVjaCBoaWdoZXIgdGhhbiBhbGwgZXhpc3Rpbmcgd29yZHNcbiAgICBpZiAodGhpcy5sZW5ndGggPD0gcykge1xuICAgICAgdGhpcy5fZXhwYW5kKHMgKyAxKTtcbiAgICAgIHRoaXMud29yZHNbc10gfD0gcTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBiaXQgYW5kIHByb3BhZ2F0ZSwgaWYgbmVlZGVkXG4gICAgdmFyIGNhcnJ5ID0gcTtcbiAgICBmb3IgKHZhciBpID0gczsgY2FycnkgIT09IDAgJiYgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1tpXSB8IDA7XG4gICAgICB3ICs9IGNhcnJ5O1xuICAgICAgY2FycnkgPSB3ID4+PiAyNjtcbiAgICAgIHcgJj0gMHgzZmZmZmZmO1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHc7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmNtcG4gPSBmdW5jdGlvbiBjbXBuIChudW0pIHtcbiAgICB2YXIgbmVnYXRpdmUgPSBudW0gPCAwO1xuXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgIW5lZ2F0aXZlKSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbmVnYXRpdmUpIHJldHVybiAxO1xuXG4gICAgdGhpcy5zdHJpcCgpO1xuXG4gICAgdmFyIHJlcztcbiAgICBpZiAodGhpcy5sZW5ndGggPiAxKSB7XG4gICAgICByZXMgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmVnYXRpdmUpIHtcbiAgICAgICAgbnVtID0gLW51bTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0KG51bSA8PSAweDNmZmZmZmYsICdOdW1iZXIgaXMgdG9vIGJpZycpO1xuXG4gICAgICB2YXIgdyA9IHRoaXMud29yZHNbMF0gfCAwO1xuICAgICAgcmVzID0gdyA9PT0gbnVtID8gMCA6IHcgPCBudW0gPyAtMSA6IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gLXJlcyB8IDA7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBDb21wYXJlIHR3byBudW1iZXJzIGFuZCByZXR1cm46XG4gIC8vIDEgLSBpZiBgdGhpc2AgPiBgbnVtYFxuICAvLyAwIC0gaWYgYHRoaXNgID09IGBudW1gXG4gIC8vIC0xIC0gaWYgYHRoaXNgIDwgYG51bWBcbiAgQk4ucHJvdG90eXBlLmNtcCA9IGZ1bmN0aW9uIGNtcCAobnVtKSB7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbnVtLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gMTtcblxuICAgIHZhciByZXMgPSB0aGlzLnVjbXAobnVtKTtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIC1yZXMgfCAwO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gVW5zaWduZWQgY29tcGFyaXNvblxuICBCTi5wcm90b3R5cGUudWNtcCA9IGZ1bmN0aW9uIHVjbXAgKG51bSkge1xuICAgIC8vIEF0IHRoaXMgcG9pbnQgYm90aCBudW1iZXJzIGhhdmUgdGhlIHNhbWUgc2lnblxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiAxO1xuICAgIGlmICh0aGlzLmxlbmd0aCA8IG51bS5sZW5ndGgpIHJldHVybiAtMTtcblxuICAgIHZhciByZXMgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgYSA9IHRoaXMud29yZHNbaV0gfCAwO1xuICAgICAgdmFyIGIgPSBudW0ud29yZHNbaV0gfCAwO1xuXG4gICAgICBpZiAoYSA9PT0gYikgY29udGludWU7XG4gICAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgcmVzID0gLTE7XG4gICAgICB9IGVsc2UgaWYgKGEgPiBiKSB7XG4gICAgICAgIHJlcyA9IDE7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3RuID0gZnVuY3Rpb24gZ3RuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPT09IDE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0ID0gZnVuY3Rpb24gZ3QgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID09PSAxO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndGVuID0gZnVuY3Rpb24gZ3RlbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID49IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0ZSA9IGZ1bmN0aW9uIGd0ZSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPj0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHRuID0gZnVuY3Rpb24gbHRuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPT09IC0xO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdCA9IGZ1bmN0aW9uIGx0IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA9PT0gLTE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0ZW4gPSBmdW5jdGlvbiBsdGVuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPD0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHRlID0gZnVuY3Rpb24gbHRlIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA8PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5lcW4gPSBmdW5jdGlvbiBlcW4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA9PT0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPT09IDA7XG4gIH07XG5cbiAgLy9cbiAgLy8gQSByZWR1Y2UgY29udGV4dCwgY291bGQgYmUgdXNpbmcgbW9udGdvbWVyeSBvciBzb21ldGhpbmcgYmV0dGVyLCBkZXBlbmRpbmdcbiAgLy8gb24gdGhlIGBtYCBpdHNlbGYuXG4gIC8vXG4gIEJOLnJlZCA9IGZ1bmN0aW9uIHJlZCAobnVtKSB7XG4gICAgcmV0dXJuIG5ldyBSZWQobnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9SZWQgPSBmdW5jdGlvbiB0b1JlZCAoY3R4KSB7XG4gICAgYXNzZXJ0KCF0aGlzLnJlZCwgJ0FscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQnKTtcbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCwgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzJyk7XG4gICAgcmV0dXJuIGN0eC5jb252ZXJ0VG8odGhpcykuX2ZvcmNlUmVkKGN0eCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmZyb21SZWQgPSBmdW5jdGlvbiBmcm9tUmVkICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdmcm9tUmVkIHdvcmtzIG9ubHkgd2l0aCBudW1iZXJzIGluIHJlZHVjdGlvbiBjb250ZXh0Jyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fZm9yY2VSZWQgPSBmdW5jdGlvbiBfZm9yY2VSZWQgKGN0eCkge1xuICAgIHRoaXMucmVkID0gY3R4O1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5mb3JjZVJlZCA9IGZ1bmN0aW9uIGZvcmNlUmVkIChjdHgpIHtcbiAgICBhc3NlcnQoIXRoaXMucmVkLCAnQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCcpO1xuICAgIHJldHVybiB0aGlzLl9mb3JjZVJlZChjdHgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRBZGQgPSBmdW5jdGlvbiByZWRBZGQgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZEFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuYWRkKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElBZGQgPSBmdW5jdGlvbiByZWRJQWRkIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pYWRkKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFN1YiA9IGZ1bmN0aW9uIHJlZFN1YiAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zdWIodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSVN1YiA9IGZ1bmN0aW9uIHJlZElTdWIgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmlzdWIodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkU2hsID0gZnVuY3Rpb24gcmVkU2hsIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTaGwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnNobCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRNdWwgPSBmdW5jdGlvbiByZWRNdWwgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLCBudW0pO1xuICAgIHJldHVybiB0aGlzLnJlZC5tdWwodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSU11bCA9IGZ1bmN0aW9uIHJlZElNdWwgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLCBudW0pO1xuICAgIHJldHVybiB0aGlzLnJlZC5pbXVsKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFNxciA9IGZ1bmN0aW9uIHJlZFNxciAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zcXIodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElTcXIgPSBmdW5jdGlvbiByZWRJU3FyICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pc3FyKHRoaXMpO1xuICB9O1xuXG4gIC8vIFNxdWFyZSByb290IG92ZXIgcFxuICBCTi5wcm90b3R5cGUucmVkU3FydCA9IGZ1bmN0aW9uIHJlZFNxcnQgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFNxcnQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnNxcnQodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZEludm0gPSBmdW5jdGlvbiByZWRJbnZtICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJbnZtIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pbnZtKHRoaXMpO1xuICB9O1xuXG4gIC8vIFJldHVybiBuZWdhdGl2ZSBjbG9uZSBvZiBgdGhpc2AgJSBgcmVkIG1vZHVsb2BcbiAgQk4ucHJvdG90eXBlLnJlZE5lZyA9IGZ1bmN0aW9uIHJlZE5lZyAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkTmVnIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5uZWcodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFBvdyA9IGZ1bmN0aW9uIHJlZFBvdyAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkICYmICFudW0ucmVkLCAncmVkUG93KG5vcm1hbE51bSknKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQucG93KHRoaXMsIG51bSk7XG4gIH07XG5cbiAgLy8gUHJpbWUgbnVtYmVycyB3aXRoIGVmZmljaWVudCByZWR1Y3Rpb25cbiAgdmFyIHByaW1lcyA9IHtcbiAgICBrMjU2OiBudWxsLFxuICAgIHAyMjQ6IG51bGwsXG4gICAgcDE5MjogbnVsbCxcbiAgICBwMjU1MTk6IG51bGxcbiAgfTtcblxuICAvLyBQc2V1ZG8tTWVyc2VubmUgcHJpbWVcbiAgZnVuY3Rpb24gTVByaW1lIChuYW1lLCBwKSB7XG4gICAgLy8gUCA9IDIgXiBOIC0gS1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5wID0gbmV3IEJOKHAsIDE2KTtcbiAgICB0aGlzLm4gPSB0aGlzLnAuYml0TGVuZ3RoKCk7XG4gICAgdGhpcy5rID0gbmV3IEJOKDEpLml1c2hsbih0aGlzLm4pLmlzdWIodGhpcy5wKTtcblxuICAgIHRoaXMudG1wID0gdGhpcy5fdG1wKCk7XG4gIH1cblxuICBNUHJpbWUucHJvdG90eXBlLl90bXAgPSBmdW5jdGlvbiBfdG1wICgpIHtcbiAgICB2YXIgdG1wID0gbmV3IEJOKG51bGwpO1xuICAgIHRtcC53b3JkcyA9IG5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5uIC8gMTMpKTtcbiAgICByZXR1cm4gdG1wO1xuICB9O1xuXG4gIE1QcmltZS5wcm90b3R5cGUuaXJlZHVjZSA9IGZ1bmN0aW9uIGlyZWR1Y2UgKG51bSkge1xuICAgIC8vIEFzc3VtZXMgdGhhdCBgbnVtYCBpcyBsZXNzIHRoYW4gYFBeMmBcbiAgICAvLyBudW0gPSBISSAqICgyIF4gTiAtIEspICsgSEkgKiBLICsgTE8gPSBISSAqIEsgKyBMTyAobW9kIFApXG4gICAgdmFyIHIgPSBudW07XG4gICAgdmFyIHJsZW47XG5cbiAgICBkbyB7XG4gICAgICB0aGlzLnNwbGl0KHIsIHRoaXMudG1wKTtcbiAgICAgIHIgPSB0aGlzLmltdWxLKHIpO1xuICAgICAgciA9IHIuaWFkZCh0aGlzLnRtcCk7XG4gICAgICBybGVuID0gci5iaXRMZW5ndGgoKTtcbiAgICB9IHdoaWxlIChybGVuID4gdGhpcy5uKTtcblxuICAgIHZhciBjbXAgPSBybGVuIDwgdGhpcy5uID8gLTEgOiByLnVjbXAodGhpcy5wKTtcbiAgICBpZiAoY21wID09PSAwKSB7XG4gICAgICByLndvcmRzWzBdID0gMDtcbiAgICAgIHIubGVuZ3RoID0gMTtcbiAgICB9IGVsc2UgaWYgKGNtcCA+IDApIHtcbiAgICAgIHIuaXN1Yih0aGlzLnApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoci5zdHJpcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHIgaXMgQk4gdjQgaW5zdGFuY2VcbiAgICAgICAgci5zdHJpcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gciBpcyBCTiB2NSBpbnN0YW5jZVxuICAgICAgICByLl9zdHJpcCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIE1QcmltZS5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiBzcGxpdCAoaW5wdXQsIG91dCkge1xuICAgIGlucHV0Lml1c2hybih0aGlzLm4sIDAsIG91dCk7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICByZXR1cm4gbnVtLmltdWwodGhpcy5rKTtcbiAgfTtcblxuICBmdW5jdGlvbiBLMjU2ICgpIHtcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAnazI1NicsXG4gICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYnKTtcbiAgfVxuICBpbmhlcml0cyhLMjU2LCBNUHJpbWUpO1xuXG4gIEsyNTYucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24gc3BsaXQgKGlucHV0LCBvdXRwdXQpIHtcbiAgICAvLyAyNTYgPSA5ICogMjYgKyAyMlxuICAgIHZhciBtYXNrID0gMHgzZmZmZmY7XG5cbiAgICB2YXIgb3V0TGVuID0gTWF0aC5taW4oaW5wdXQubGVuZ3RoLCA5KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG91dExlbjsgaSsrKSB7XG4gICAgICBvdXRwdXQud29yZHNbaV0gPSBpbnB1dC53b3Jkc1tpXTtcbiAgICB9XG4gICAgb3V0cHV0Lmxlbmd0aCA9IG91dExlbjtcblxuICAgIGlmIChpbnB1dC5sZW5ndGggPD0gOSkge1xuICAgICAgaW5wdXQud29yZHNbMF0gPSAwO1xuICAgICAgaW5wdXQubGVuZ3RoID0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTaGlmdCBieSA5IGxpbWJzXG4gICAgdmFyIHByZXYgPSBpbnB1dC53b3Jkc1s5XTtcbiAgICBvdXRwdXQud29yZHNbb3V0cHV0Lmxlbmd0aCsrXSA9IHByZXYgJiBtYXNrO1xuXG4gICAgZm9yIChpID0gMTA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5leHQgPSBpbnB1dC53b3Jkc1tpXSB8IDA7XG4gICAgICBpbnB1dC53b3Jkc1tpIC0gMTBdID0gKChuZXh0ICYgbWFzaykgPDwgNCkgfCAocHJldiA+Pj4gMjIpO1xuICAgICAgcHJldiA9IG5leHQ7XG4gICAgfVxuICAgIHByZXYgPj4+PSAyMjtcbiAgICBpbnB1dC53b3Jkc1tpIC0gMTBdID0gcHJldjtcbiAgICBpZiAocHJldiA9PT0gMCAmJiBpbnB1dC5sZW5ndGggPiAxMCkge1xuICAgICAgaW5wdXQubGVuZ3RoIC09IDEwO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnB1dC5sZW5ndGggLT0gOTtcbiAgICB9XG4gIH07XG5cbiAgSzI1Ni5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbiBpbXVsSyAobnVtKSB7XG4gICAgLy8gSyA9IDB4MTAwMDAwM2QxID0gWyAweDQwLCAweDNkMSBdXG4gICAgbnVtLndvcmRzW251bS5sZW5ndGhdID0gMDtcbiAgICBudW0ud29yZHNbbnVtLmxlbmd0aCArIDFdID0gMDtcbiAgICBudW0ubGVuZ3RoICs9IDI7XG5cbiAgICAvLyBib3VuZGVkIGF0OiAweDQwICogMHgzZmZmZmZmICsgMHgzZDAgPSAweDEwMDAwMDM5MFxuICAgIHZhciBsbyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gbnVtLndvcmRzW2ldIHwgMDtcbiAgICAgIGxvICs9IHcgKiAweDNkMTtcbiAgICAgIG51bS53b3Jkc1tpXSA9IGxvICYgMHgzZmZmZmZmO1xuICAgICAgbG8gPSB3ICogMHg0MCArICgobG8gLyAweDQwMDAwMDApIHwgMCk7XG4gICAgfVxuXG4gICAgLy8gRmFzdCBsZW5ndGggcmVkdWN0aW9uXG4gICAgaWYgKG51bS53b3Jkc1tudW0ubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgIG51bS5sZW5ndGgtLTtcbiAgICAgIGlmIChudW0ud29yZHNbbnVtLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICAgIG51bS5sZW5ndGgtLTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbiAgfTtcblxuICBmdW5jdGlvbiBQMjI0ICgpIHtcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAncDIyNCcsXG4gICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEnKTtcbiAgfVxuICBpbmhlcml0cyhQMjI0LCBNUHJpbWUpO1xuXG4gIGZ1bmN0aW9uIFAxOTIgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdwMTkyJyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZicpO1xuICB9XG4gIGluaGVyaXRzKFAxOTIsIE1QcmltZSk7XG5cbiAgZnVuY3Rpb24gUDI1NTE5ICgpIHtcbiAgICAvLyAyIF4gMjU1IC0gMTlcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAnMjU1MTknLFxuICAgICAgJzdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQnKTtcbiAgfVxuICBpbmhlcml0cyhQMjU1MTksIE1QcmltZSk7XG5cbiAgUDI1NTE5LnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICAvLyBLID0gMHgxM1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoaSA9IChudW0ud29yZHNbaV0gfCAwKSAqIDB4MTMgKyBjYXJyeTtcbiAgICAgIHZhciBsbyA9IGhpICYgMHgzZmZmZmZmO1xuICAgICAgaGkgPj4+PSAyNjtcblxuICAgICAgbnVtLndvcmRzW2ldID0gbG87XG4gICAgICBjYXJyeSA9IGhpO1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIG51bS53b3Jkc1tudW0ubGVuZ3RoKytdID0gY2Fycnk7XG4gICAgfVxuICAgIHJldHVybiBudW07XG4gIH07XG5cbiAgLy8gRXhwb3J0ZWQgbW9zdGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB1c2UgcGxhaW4gbmFtZSBpbnN0ZWFkXG4gIEJOLl9wcmltZSA9IGZ1bmN0aW9uIHByaW1lIChuYW1lKSB7XG4gICAgLy8gQ2FjaGVkIHZlcnNpb24gb2YgcHJpbWVcbiAgICBpZiAocHJpbWVzW25hbWVdKSByZXR1cm4gcHJpbWVzW25hbWVdO1xuXG4gICAgdmFyIHByaW1lO1xuICAgIGlmIChuYW1lID09PSAnazI1NicpIHtcbiAgICAgIHByaW1lID0gbmV3IEsyNTYoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwMjI0Jykge1xuICAgICAgcHJpbWUgPSBuZXcgUDIyNCgpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3AxOTInKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMTkyKCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAncDI1NTE5Jykge1xuICAgICAgcHJpbWUgPSBuZXcgUDI1NTE5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBwcmltZSAnICsgbmFtZSk7XG4gICAgfVxuICAgIHByaW1lc1tuYW1lXSA9IHByaW1lO1xuXG4gICAgcmV0dXJuIHByaW1lO1xuICB9O1xuXG4gIC8vXG4gIC8vIEJhc2UgcmVkdWN0aW9uIGVuZ2luZVxuICAvL1xuICBmdW5jdGlvbiBSZWQgKG0pIHtcbiAgICBpZiAodHlwZW9mIG0gPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgcHJpbWUgPSBCTi5fcHJpbWUobSk7XG4gICAgICB0aGlzLm0gPSBwcmltZS5wO1xuICAgICAgdGhpcy5wcmltZSA9IHByaW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQobS5ndG4oMSksICdtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEnKTtcbiAgICAgIHRoaXMubSA9IG07XG4gICAgICB0aGlzLnByaW1lID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBSZWQucHJvdG90eXBlLl92ZXJpZnkxID0gZnVuY3Rpb24gX3ZlcmlmeTEgKGEpIHtcbiAgICBhc3NlcnQoYS5uZWdhdGl2ZSA9PT0gMCwgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzJyk7XG4gICAgYXNzZXJ0KGEucmVkLCAncmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuX3ZlcmlmeTIgPSBmdW5jdGlvbiBfdmVyaWZ5MiAoYSwgYikge1xuICAgIGFzc2VydCgoYS5uZWdhdGl2ZSB8IGIubmVnYXRpdmUpID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICBhc3NlcnQoYS5yZWQgJiYgYS5yZWQgPT09IGIucmVkLFxuICAgICAgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmltb2QgPSBmdW5jdGlvbiBpbW9kIChhKSB7XG4gICAgaWYgKHRoaXMucHJpbWUpIHJldHVybiB0aGlzLnByaW1lLmlyZWR1Y2UoYSkuX2ZvcmNlUmVkKHRoaXMpO1xuICAgIHJldHVybiBhLnVtb2QodGhpcy5tKS5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcgKGEpIHtcbiAgICBpZiAoYS5pc1plcm8oKSkge1xuICAgICAgcmV0dXJuIGEuY2xvbmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tLnN1YihhKS5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuXG4gICAgdmFyIHJlcyA9IGEuYWRkKGIpO1xuICAgIGlmIChyZXMuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzLmlzdWIodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24gaWFkZCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5pYWRkKGIpO1xuICAgIGlmIChyZXMuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzLmlzdWIodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uIHN1YiAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5zdWIoYik7XG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24gaXN1YiAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5pc3ViKGIpO1xuICAgIGlmIChyZXMuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcy5pYWRkKHRoaXMubSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5zaGwgPSBmdW5jdGlvbiBzaGwgKGEsIG51bSkge1xuICAgIHRoaXMuX3ZlcmlmeTEoYSk7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLnVzaGxuKG51bSkpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuICAgIHJldHVybiB0aGlzLmltb2QoYS5pbXVsKGIpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLm11bChiKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24gaXNxciAoYSkge1xuICAgIHJldHVybiB0aGlzLmltdWwoYSwgYS5jbG9uZSgpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uIHNxciAoYSkge1xuICAgIHJldHVybiB0aGlzLm11bChhLCBhKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNxcnQgPSBmdW5jdGlvbiBzcXJ0IChhKSB7XG4gICAgaWYgKGEuaXNaZXJvKCkpIHJldHVybiBhLmNsb25lKCk7XG5cbiAgICB2YXIgbW9kMyA9IHRoaXMubS5hbmRsbigzKTtcbiAgICBhc3NlcnQobW9kMyAlIDIgPT09IDEpO1xuXG4gICAgLy8gRmFzdCBjYXNlXG4gICAgaWYgKG1vZDMgPT09IDMpIHtcbiAgICAgIHZhciBwb3cgPSB0aGlzLm0uYWRkKG5ldyBCTigxKSkuaXVzaHJuKDIpO1xuICAgICAgcmV0dXJuIHRoaXMucG93KGEsIHBvdyk7XG4gICAgfVxuXG4gICAgLy8gVG9uZWxsaS1TaGFua3MgYWxnb3JpdGhtIChUb3RhbGx5IHVub3B0aW1pemVkIGFuZCBzbG93KVxuICAgIC8vXG4gICAgLy8gRmluZCBRIGFuZCBTLCB0aGF0IFEgKiAyIF4gUyA9IChQIC0gMSlcbiAgICB2YXIgcSA9IHRoaXMubS5zdWJuKDEpO1xuICAgIHZhciBzID0gMDtcbiAgICB3aGlsZSAoIXEuaXNaZXJvKCkgJiYgcS5hbmRsbigxKSA9PT0gMCkge1xuICAgICAgcysrO1xuICAgICAgcS5pdXNocm4oMSk7XG4gICAgfVxuICAgIGFzc2VydCghcS5pc1plcm8oKSk7XG5cbiAgICB2YXIgb25lID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIHZhciBuT25lID0gb25lLnJlZE5lZygpO1xuXG4gICAgLy8gRmluZCBxdWFkcmF0aWMgbm9uLXJlc2lkdWVcbiAgICAvLyBOT1RFOiBNYXggaXMgc3VjaCBiZWNhdXNlIG9mIGdlbmVyYWxpemVkIFJpZW1hbm4gaHlwb3RoZXNpcy5cbiAgICB2YXIgbHBvdyA9IHRoaXMubS5zdWJuKDEpLml1c2hybigxKTtcbiAgICB2YXIgeiA9IHRoaXMubS5iaXRMZW5ndGgoKTtcbiAgICB6ID0gbmV3IEJOKDIgKiB6ICogeikudG9SZWQodGhpcyk7XG5cbiAgICB3aGlsZSAodGhpcy5wb3coeiwgbHBvdykuY21wKG5PbmUpICE9PSAwKSB7XG4gICAgICB6LnJlZElBZGQobk9uZSk7XG4gICAgfVxuXG4gICAgdmFyIGMgPSB0aGlzLnBvdyh6LCBxKTtcbiAgICB2YXIgciA9IHRoaXMucG93KGEsIHEuYWRkbigxKS5pdXNocm4oMSkpO1xuICAgIHZhciB0ID0gdGhpcy5wb3coYSwgcSk7XG4gICAgdmFyIG0gPSBzO1xuICAgIHdoaWxlICh0LmNtcChvbmUpICE9PSAwKSB7XG4gICAgICB2YXIgdG1wID0gdDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyB0bXAuY21wKG9uZSkgIT09IDA7IGkrKykge1xuICAgICAgICB0bXAgPSB0bXAucmVkU3FyKCk7XG4gICAgICB9XG4gICAgICBhc3NlcnQoaSA8IG0pO1xuICAgICAgdmFyIGIgPSB0aGlzLnBvdyhjLCBuZXcgQk4oMSkuaXVzaGxuKG0gLSBpIC0gMSkpO1xuXG4gICAgICByID0gci5yZWRNdWwoYik7XG4gICAgICBjID0gYi5yZWRTcXIoKTtcbiAgICAgIHQgPSB0LnJlZE11bChjKTtcbiAgICAgIG0gPSBpO1xuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uIGludm0gKGEpIHtcbiAgICB2YXIgaW52ID0gYS5faW52bXAodGhpcy5tKTtcbiAgICBpZiAoaW52Lm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBpbnYubmVnYXRpdmUgPSAwO1xuICAgICAgcmV0dXJuIHRoaXMuaW1vZChpbnYpLnJlZE5lZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5pbW9kKGludik7XG4gICAgfVxuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24gcG93IChhLCBudW0pIHtcbiAgICBpZiAobnVtLmlzWmVybygpKSByZXR1cm4gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIGlmIChudW0uY21wbigxKSA9PT0gMCkgcmV0dXJuIGEuY2xvbmUoKTtcblxuICAgIHZhciB3aW5kb3dTaXplID0gNDtcbiAgICB2YXIgd25kID0gbmV3IEFycmF5KDEgPDwgd2luZG93U2l6ZSk7XG4gICAgd25kWzBdID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIHduZFsxXSA9IGE7XG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCB3bmQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHduZFtpXSA9IHRoaXMubXVsKHduZFtpIC0gMV0sIGEpO1xuICAgIH1cblxuICAgIHZhciByZXMgPSB3bmRbMF07XG4gICAgdmFyIGN1cnJlbnQgPSAwO1xuICAgIHZhciBjdXJyZW50TGVuID0gMDtcbiAgICB2YXIgc3RhcnQgPSBudW0uYml0TGVuZ3RoKCkgJSAyNjtcbiAgICBpZiAoc3RhcnQgPT09IDApIHtcbiAgICAgIHN0YXJ0ID0gMjY7XG4gICAgfVxuXG4gICAgZm9yIChpID0gbnVtLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgd29yZCA9IG51bS53b3Jkc1tpXTtcbiAgICAgIGZvciAodmFyIGogPSBzdGFydCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHZhciBiaXQgPSAod29yZCA+PiBqKSAmIDE7XG4gICAgICAgIGlmIChyZXMgIT09IHduZFswXSkge1xuICAgICAgICAgIHJlcyA9IHRoaXMuc3FyKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYml0ID09PSAwICYmIGN1cnJlbnQgPT09IDApIHtcbiAgICAgICAgICBjdXJyZW50TGVuID0gMDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnQgPDw9IDE7XG4gICAgICAgIGN1cnJlbnQgfD0gYml0O1xuICAgICAgICBjdXJyZW50TGVuKys7XG4gICAgICAgIGlmIChjdXJyZW50TGVuICE9PSB3aW5kb3dTaXplICYmIChpICE9PSAwIHx8IGogIT09IDApKSBjb250aW51ZTtcblxuICAgICAgICByZXMgPSB0aGlzLm11bChyZXMsIHduZFtjdXJyZW50XSk7XG4gICAgICAgIGN1cnJlbnRMZW4gPSAwO1xuICAgICAgICBjdXJyZW50ID0gMDtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gMjY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uIGNvbnZlcnRUbyAobnVtKSB7XG4gICAgdmFyIHIgPSBudW0udW1vZCh0aGlzLm0pO1xuXG4gICAgcmV0dXJuIHIgPT09IG51bSA/IHIuY2xvbmUoKSA6IHI7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uIGNvbnZlcnRGcm9tIChudW0pIHtcbiAgICB2YXIgcmVzID0gbnVtLmNsb25lKCk7XG4gICAgcmVzLnJlZCA9IG51bGw7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvL1xuICAvLyBNb250Z29tZXJ5IG1ldGhvZCBlbmdpbmVcbiAgLy9cblxuICBCTi5tb250ID0gZnVuY3Rpb24gbW9udCAobnVtKSB7XG4gICAgcmV0dXJuIG5ldyBNb250KG51bSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gTW9udCAobSkge1xuICAgIFJlZC5jYWxsKHRoaXMsIG0pO1xuXG4gICAgdGhpcy5zaGlmdCA9IHRoaXMubS5iaXRMZW5ndGgoKTtcbiAgICBpZiAodGhpcy5zaGlmdCAlIDI2ICE9PSAwKSB7XG4gICAgICB0aGlzLnNoaWZ0ICs9IDI2IC0gKHRoaXMuc2hpZnQgJSAyNik7XG4gICAgfVxuXG4gICAgdGhpcy5yID0gbmV3IEJOKDEpLml1c2hsbih0aGlzLnNoaWZ0KTtcbiAgICB0aGlzLnIyID0gdGhpcy5pbW9kKHRoaXMuci5zcXIoKSk7XG4gICAgdGhpcy5yaW52ID0gdGhpcy5yLl9pbnZtcCh0aGlzLm0pO1xuXG4gICAgdGhpcy5taW52ID0gdGhpcy5yaW52Lm11bCh0aGlzLnIpLmlzdWJuKDEpLmRpdih0aGlzLm0pO1xuICAgIHRoaXMubWludiA9IHRoaXMubWludi51bW9kKHRoaXMucik7XG4gICAgdGhpcy5taW52ID0gdGhpcy5yLnN1Yih0aGlzLm1pbnYpO1xuICB9XG4gIGluaGVyaXRzKE1vbnQsIFJlZCk7XG5cbiAgTW9udC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24gY29udmVydFRvIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5pbW9kKG51bS51c2hsbih0aGlzLnNoaWZ0KSk7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUuY29udmVydEZyb20gPSBmdW5jdGlvbiBjb252ZXJ0RnJvbSAobnVtKSB7XG4gICAgdmFyIHIgPSB0aGlzLmltb2QobnVtLm11bCh0aGlzLnJpbnYpKTtcbiAgICByLnJlZCA9IG51bGw7XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKGEsIGIpIHtcbiAgICBpZiAoYS5pc1plcm8oKSB8fCBiLmlzWmVybygpKSB7XG4gICAgICBhLndvcmRzWzBdID0gMDtcbiAgICAgIGEubGVuZ3RoID0gMTtcbiAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIHZhciB0ID0gYS5pbXVsKGIpO1xuICAgIHZhciBjID0gdC5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSk7XG4gICAgdmFyIHUgPSB0LmlzdWIoYykuaXVzaHJuKHRoaXMuc2hpZnQpO1xuICAgIHZhciByZXMgPSB1O1xuXG4gICAgaWYgKHUuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzID0gdS5pc3ViKHRoaXMubSk7XG4gICAgfSBlbHNlIGlmICh1LmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMgPSB1LmlhZGQodGhpcy5tKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwgKGEsIGIpIHtcbiAgICBpZiAoYS5pc1plcm8oKSB8fCBiLmlzWmVybygpKSByZXR1cm4gbmV3IEJOKDApLl9mb3JjZVJlZCh0aGlzKTtcblxuICAgIHZhciB0ID0gYS5tdWwoYik7XG4gICAgdmFyIGMgPSB0Lm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKTtcbiAgICB2YXIgdSA9IHQuaXN1YihjKS5pdXNocm4odGhpcy5zaGlmdCk7XG4gICAgdmFyIHJlcyA9IHU7XG4gICAgaWYgKHUuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzID0gdS5pc3ViKHRoaXMubSk7XG4gICAgfSBlbHNlIGlmICh1LmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMgPSB1LmlhZGQodGhpcy5tKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAoYSkge1xuICAgIC8vIChBUileLTEgKiBSXjIgPSAoQV4tMSAqIFJeLTEpICogUl4yID0gQV4tMSAqIFJcbiAgICB2YXIgcmVzID0gdGhpcy5pbW9kKGEuX2ludm1wKHRoaXMubSkubXVsKHRoaXMucjIpKTtcbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcbn0pKHR5cGVvZiBtb2R1bGUgPT09ICd1bmRlZmluZWQnIHx8IG1vZHVsZSwgdGhpcyk7XG4iLAogICAgImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAidHJ5IHtcbiAgdmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICh0eXBlb2YgdXRpbC5pbmhlcml0cyAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgJyc7XG4gIG1vZHVsZS5leHBvcnRzID0gdXRpbC5pbmhlcml0cztcbn0gY2F0Y2ggKGUpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2luaGVyaXRzX2Jyb3dzZXIuanMnKTtcbn1cbiIsCiAgICAiLyogZXNsaW50LWRpc2FibGUgbm9kZS9uby1kZXByZWNhdGVkLWFwaSAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpXG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlclxuXG52YXIgc2FmZXIgPSB7fVxuXG52YXIga2V5XG5cbmZvciAoa2V5IGluIGJ1ZmZlcikge1xuICBpZiAoIWJ1ZmZlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZVxuICBpZiAoa2V5ID09PSAnU2xvd0J1ZmZlcicgfHwga2V5ID09PSAnQnVmZmVyJykgY29udGludWVcbiAgc2FmZXJba2V5XSA9IGJ1ZmZlcltrZXldXG59XG5cbnZhciBTYWZlciA9IHNhZmVyLkJ1ZmZlciA9IHt9XG5mb3IgKGtleSBpbiBCdWZmZXIpIHtcbiAgaWYgKCFCdWZmZXIuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWVcbiAgaWYgKGtleSA9PT0gJ2FsbG9jVW5zYWZlJyB8fCBrZXkgPT09ICdhbGxvY1Vuc2FmZVNsb3cnKSBjb250aW51ZVxuICBTYWZlcltrZXldID0gQnVmZmVyW2tleV1cbn1cblxuc2FmZXIuQnVmZmVyLnByb3RvdHlwZSA9IEJ1ZmZlci5wcm90b3R5cGVcblxuaWYgKCFTYWZlci5mcm9tIHx8IFNhZmVyLmZyb20gPT09IFVpbnQ4QXJyYXkuZnJvbSkge1xuICBTYWZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHZhbHVlKVxuICAgIH1cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdmFsdWUpXG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxufVxuXG5pZiAoIVNhZmVyLmFsbG9jKSB7XG4gIFNhZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzaXplKVxuICAgIH1cbiAgICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+PSAyICogKDEgPDwgMzApKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIHNpemUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgICB9XG4gICAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKVxuICAgIGlmICghZmlsbCB8fCBmaWxsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYnVmLmZpbGwoMClcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKVxuICAgIH1cbiAgICByZXR1cm4gYnVmXG4gIH1cbn1cblxuaWYgKCFzYWZlci5rU3RyaW5nTWF4TGVuZ3RoKSB7XG4gIHRyeSB7XG4gICAgc2FmZXIua1N0cmluZ01heExlbmd0aCA9IHByb2Nlc3MuYmluZGluZygnYnVmZmVyJykua1N0cmluZ01heExlbmd0aFxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gd2UgY2FuJ3QgZGV0ZXJtaW5lIGtTdHJpbmdNYXhMZW5ndGggaW4gZW52aXJvbm1lbnRzIHdoZXJlIHByb2Nlc3MuYmluZGluZ1xuICAgIC8vIGlzIHVuc3VwcG9ydGVkLCBzbyBsZXQncyBub3Qgc2V0IGl0XG4gIH1cbn1cblxuaWYgKCFzYWZlci5jb25zdGFudHMpIHtcbiAgc2FmZXIuY29uc3RhbnRzID0ge1xuICAgIE1BWF9MRU5HVEg6IHNhZmVyLmtNYXhMZW5ndGhcbiAgfVxuICBpZiAoc2FmZXIua1N0cmluZ01heExlbmd0aCkge1xuICAgIHNhZmVyLmNvbnN0YW50cy5NQVhfU1RSSU5HX0xFTkdUSCA9IHNhZmVyLmtTdHJpbmdNYXhMZW5ndGhcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNhZmVyXG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5mdW5jdGlvbiBSZXBvcnRlcihvcHRpb25zKSB7XG4gIHRoaXMuX3JlcG9ydGVyU3RhdGUgPSB7XG4gICAgb2JqOiBudWxsLFxuICAgIHBhdGg6IFtdLFxuICAgIG9wdGlvbnM6IG9wdGlvbnMgfHwge30sXG4gICAgZXJyb3JzOiBbXVxuICB9O1xufVxuZXhwb3J0cy5SZXBvcnRlciA9IFJlcG9ydGVyO1xuXG5SZXBvcnRlci5wcm90b3R5cGUuaXNFcnJvciA9IGZ1bmN0aW9uIGlzRXJyb3Iob2JqKSB7XG4gIHJldHVybiBvYmogaW5zdGFuY2VvZiBSZXBvcnRlckVycm9yO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiBzYXZlKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgcmV0dXJuIHsgb2JqOiBzdGF0ZS5vYmosIHBhdGhMZW46IHN0YXRlLnBhdGgubGVuZ3RoIH07XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUucmVzdG9yZSA9IGZ1bmN0aW9uIHJlc3RvcmUoZGF0YSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgc3RhdGUub2JqID0gZGF0YS5vYmo7XG4gIHN0YXRlLnBhdGggPSBzdGF0ZS5wYXRoLnNsaWNlKDAsIGRhdGEucGF0aExlbik7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZW50ZXJLZXkgPSBmdW5jdGlvbiBlbnRlcktleShrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX3JlcG9ydGVyU3RhdGUucGF0aC5wdXNoKGtleSk7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZXhpdEtleSA9IGZ1bmN0aW9uIGV4aXRLZXkoaW5kZXgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIHN0YXRlLnBhdGggPSBzdGF0ZS5wYXRoLnNsaWNlKDAsIGluZGV4IC0gMSk7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUubGVhdmVLZXkgPSBmdW5jdGlvbiBsZWF2ZUtleShpbmRleCwga2V5LCB2YWx1ZSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgdGhpcy5leGl0S2V5KGluZGV4KTtcbiAgaWYgKHN0YXRlLm9iaiAhPT0gbnVsbClcbiAgICBzdGF0ZS5vYmpba2V5XSA9IHZhbHVlO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLnBhdGggPSBmdW5jdGlvbiBwYXRoKCkge1xuICByZXR1cm4gdGhpcy5fcmVwb3J0ZXJTdGF0ZS5wYXRoLmpvaW4oJy8nKTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5lbnRlck9iamVjdCA9IGZ1bmN0aW9uIGVudGVyT2JqZWN0KCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgY29uc3QgcHJldiA9IHN0YXRlLm9iajtcbiAgc3RhdGUub2JqID0ge307XG4gIHJldHVybiBwcmV2O1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmxlYXZlT2JqZWN0ID0gZnVuY3Rpb24gbGVhdmVPYmplY3QocHJldikge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgY29uc3Qgbm93ID0gc3RhdGUub2JqO1xuICBzdGF0ZS5vYmogPSBwcmV2O1xuICByZXR1cm4gbm93O1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gZXJyb3IobXNnKSB7XG4gIGxldCBlcnI7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBjb25zdCBpbmhlcml0ZWQgPSBtc2cgaW5zdGFuY2VvZiBSZXBvcnRlckVycm9yO1xuICBpZiAoaW5oZXJpdGVkKSB7XG4gICAgZXJyID0gbXNnO1xuICB9IGVsc2Uge1xuICAgIGVyciA9IG5ldyBSZXBvcnRlckVycm9yKHN0YXRlLnBhdGgubWFwKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgIHJldHVybiAnWycgKyBKU09OLnN0cmluZ2lmeShlbGVtKSArICddJztcbiAgICB9KS5qb2luKCcnKSwgbXNnLm1lc3NhZ2UgfHwgbXNnLCBtc2cuc3RhY2spO1xuICB9XG5cbiAgaWYgKCFzdGF0ZS5vcHRpb25zLnBhcnRpYWwpXG4gICAgdGhyb3cgZXJyO1xuXG4gIGlmICghaW5oZXJpdGVkKVxuICAgIHN0YXRlLmVycm9ycy5wdXNoKGVycik7XG5cbiAgcmV0dXJuIGVycjtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS53cmFwUmVzdWx0ID0gZnVuY3Rpb24gd3JhcFJlc3VsdChyZXN1bHQpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuICBpZiAoIXN0YXRlLm9wdGlvbnMucGFydGlhbClcbiAgICByZXR1cm4gcmVzdWx0O1xuXG4gIHJldHVybiB7XG4gICAgcmVzdWx0OiB0aGlzLmlzRXJyb3IocmVzdWx0KSA/IG51bGwgOiByZXN1bHQsXG4gICAgZXJyb3JzOiBzdGF0ZS5lcnJvcnNcbiAgfTtcbn07XG5cbmZ1bmN0aW9uIFJlcG9ydGVyRXJyb3IocGF0aCwgbXNnKSB7XG4gIHRoaXMucGF0aCA9IHBhdGg7XG4gIHRoaXMucmV0aHJvdyhtc2cpO1xufVxuaW5oZXJpdHMoUmVwb3J0ZXJFcnJvciwgRXJyb3IpO1xuXG5SZXBvcnRlckVycm9yLnByb3RvdHlwZS5yZXRocm93ID0gZnVuY3Rpb24gcmV0aHJvdyhtc2cpIHtcbiAgdGhpcy5tZXNzYWdlID0gbXNnICsgJyBhdDogJyArICh0aGlzLnBhdGggfHwgJyhzaGFsbG93KScpO1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgUmVwb3J0ZXJFcnJvcik7XG5cbiAgaWYgKCF0aGlzLnN0YWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIElFIG9ubHkgYWRkcyBzdGFjayB3aGVuIHRocm93blxuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMubWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5zdGFjayA9IGUuc3RhY2s7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5jb25zdCBSZXBvcnRlciA9IHJlcXVpcmUoJy4uL2Jhc2UvcmVwb3J0ZXInKS5SZXBvcnRlcjtcbmNvbnN0IEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcblxuZnVuY3Rpb24gRGVjb2RlckJ1ZmZlcihiYXNlLCBvcHRpb25zKSB7XG4gIFJlcG9ydGVyLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJhc2UpKSB7XG4gICAgdGhpcy5lcnJvcignSW5wdXQgbm90IEJ1ZmZlcicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuYmFzZSA9IGJhc2U7XG4gIHRoaXMub2Zmc2V0ID0gMDtcbiAgdGhpcy5sZW5ndGggPSBiYXNlLmxlbmd0aDtcbn1cbmluaGVyaXRzKERlY29kZXJCdWZmZXIsIFJlcG9ydGVyKTtcbmV4cG9ydHMuRGVjb2RlckJ1ZmZlciA9IERlY29kZXJCdWZmZXI7XG5cbkRlY29kZXJCdWZmZXIuaXNEZWNvZGVyQnVmZmVyID0gZnVuY3Rpb24gaXNEZWNvZGVyQnVmZmVyKGRhdGEpIHtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBEZWNvZGVyQnVmZmVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBPciBhY2NlcHQgY29tcGF0aWJsZSBBUElcbiAgY29uc3QgaXNDb21wYXRpYmxlID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgQnVmZmVyLmlzQnVmZmVyKGRhdGEuYmFzZSkgJiZcbiAgICBkYXRhLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdEZWNvZGVyQnVmZmVyJyAmJlxuICAgIHR5cGVvZiBkYXRhLm9mZnNldCA9PT0gJ251bWJlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5sZW5ndGggPT09ICdudW1iZXInICYmXG4gICAgdHlwZW9mIGRhdGEuc2F2ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBkYXRhLnJlc3RvcmUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGF0YS5pc0VtcHR5ID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEuc2tpcCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBkYXRhLnJhdyA9PT0gJ2Z1bmN0aW9uJztcblxuICByZXR1cm4gaXNDb21wYXRpYmxlO1xufTtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIHNhdmUoKSB7XG4gIHJldHVybiB7IG9mZnNldDogdGhpcy5vZmZzZXQsIHJlcG9ydGVyOiBSZXBvcnRlci5wcm90b3R5cGUuc2F2ZS5jYWxsKHRoaXMpIH07XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZShzYXZlKSB7XG4gIC8vIFJldHVybiBza2lwcGVkIGRhdGFcbiAgY29uc3QgcmVzID0gbmV3IERlY29kZXJCdWZmZXIodGhpcy5iYXNlKTtcbiAgcmVzLm9mZnNldCA9IHNhdmUub2Zmc2V0O1xuICByZXMubGVuZ3RoID0gdGhpcy5vZmZzZXQ7XG5cbiAgdGhpcy5vZmZzZXQgPSBzYXZlLm9mZnNldDtcbiAgUmVwb3J0ZXIucHJvdG90eXBlLnJlc3RvcmUuY2FsbCh0aGlzLCBzYXZlLnJlcG9ydGVyKTtcblxuICByZXR1cm4gcmVzO1xufTtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uIGlzRW1wdHkoKSB7XG4gIHJldHVybiB0aGlzLm9mZnNldCA9PT0gdGhpcy5sZW5ndGg7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDgoZmFpbCkge1xuICBpZiAodGhpcy5vZmZzZXQgKyAxIDw9IHRoaXMubGVuZ3RoKVxuICAgIHJldHVybiB0aGlzLmJhc2UucmVhZFVJbnQ4KHRoaXMub2Zmc2V0KyssIHRydWUpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuZXJyb3IoZmFpbCB8fCAnRGVjb2RlckJ1ZmZlciBvdmVycnVuJyk7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24gc2tpcChieXRlcywgZmFpbCkge1xuICBpZiAoISh0aGlzLm9mZnNldCArIGJ5dGVzIDw9IHRoaXMubGVuZ3RoKSlcbiAgICByZXR1cm4gdGhpcy5lcnJvcihmYWlsIHx8ICdEZWNvZGVyQnVmZmVyIG92ZXJydW4nKTtcblxuICBjb25zdCByZXMgPSBuZXcgRGVjb2RlckJ1ZmZlcih0aGlzLmJhc2UpO1xuXG4gIC8vIFNoYXJlIHJlcG9ydGVyIHN0YXRlXG4gIHJlcy5fcmVwb3J0ZXJTdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgcmVzLm9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICByZXMubGVuZ3RoID0gdGhpcy5vZmZzZXQgKyBieXRlcztcbiAgdGhpcy5vZmZzZXQgKz0gYnl0ZXM7XG4gIHJldHVybiByZXM7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5yYXcgPSBmdW5jdGlvbiByYXcoc2F2ZSkge1xuICByZXR1cm4gdGhpcy5iYXNlLnNsaWNlKHNhdmUgPyBzYXZlLm9mZnNldCA6IHRoaXMub2Zmc2V0LCB0aGlzLmxlbmd0aCk7XG59O1xuXG5mdW5jdGlvbiBFbmNvZGVyQnVmZmVyKHZhbHVlLCByZXBvcnRlcikge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICBpZiAoIUVuY29kZXJCdWZmZXIuaXNFbmNvZGVyQnVmZmVyKGl0ZW0pKVxuICAgICAgICBpdGVtID0gbmV3IEVuY29kZXJCdWZmZXIoaXRlbSwgcmVwb3J0ZXIpO1xuICAgICAgdGhpcy5sZW5ndGggKz0gaXRlbS5sZW5ndGg7XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9LCB0aGlzKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCEoMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAweGZmKSlcbiAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignbm9uLWJ5dGUgRW5jb2RlckJ1ZmZlciB2YWx1ZScpO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmxlbmd0aCA9IDE7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlKTtcbiAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXBvcnRlci5lcnJvcignVW5zdXBwb3J0ZWQgdHlwZTogJyArIHR5cGVvZiB2YWx1ZSk7XG4gIH1cbn1cbmV4cG9ydHMuRW5jb2RlckJ1ZmZlciA9IEVuY29kZXJCdWZmZXI7XG5cbkVuY29kZXJCdWZmZXIuaXNFbmNvZGVyQnVmZmVyID0gZnVuY3Rpb24gaXNFbmNvZGVyQnVmZmVyKGRhdGEpIHtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBFbmNvZGVyQnVmZmVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBPciBhY2NlcHQgY29tcGF0aWJsZSBBUElcbiAgY29uc3QgaXNDb21wYXRpYmxlID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgZGF0YS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnRW5jb2RlckJ1ZmZlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5sZW5ndGggPT09ICdudW1iZXInICYmXG4gICAgdHlwZW9mIGRhdGEuam9pbiA9PT0gJ2Z1bmN0aW9uJztcblxuICByZXR1cm4gaXNDb21wYXRpYmxlO1xufTtcblxuRW5jb2RlckJ1ZmZlci5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIGpvaW4ob3V0LCBvZmZzZXQpIHtcbiAgaWYgKCFvdXQpXG4gICAgb3V0ID0gQnVmZmVyLmFsbG9jKHRoaXMubGVuZ3RoKTtcbiAgaWYgKCFvZmZzZXQpXG4gICAgb2Zmc2V0ID0gMDtcblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIG91dDtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgIHRoaXMudmFsdWUuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgICBpdGVtLmpvaW4ob3V0LCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IGl0ZW0ubGVuZ3RoO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgICBvdXRbb2Zmc2V0XSA9IHRoaXMudmFsdWU7XG4gICAgZWxzZSBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgb3V0LndyaXRlKHRoaXMudmFsdWUsIG9mZnNldCk7XG4gICAgZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKHRoaXMudmFsdWUpKVxuICAgICAgdGhpcy52YWx1ZS5jb3B5KG91dCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gdGhpcy5sZW5ndGg7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufTtcbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSBhc3NlcnQ7XG5cbmZ1bmN0aW9uIGFzc2VydCh2YWwsIG1zZykge1xuICBpZiAoIXZhbClcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnIHx8ICdBc3NlcnRpb24gZmFpbGVkJyk7XG59XG5cbmFzc2VydC5lcXVhbCA9IGZ1bmN0aW9uIGFzc2VydEVxdWFsKGwsIHIsIG1zZykge1xuICBpZiAobCAhPSByKVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cgfHwgKCdBc3NlcnRpb24gZmFpbGVkOiAnICsgbCArICcgIT0gJyArIHIpKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgUmVwb3J0ZXIgPSByZXF1aXJlKCcuLi9iYXNlL3JlcG9ydGVyJykuUmVwb3J0ZXI7XG5jb25zdCBFbmNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi4vYmFzZS9idWZmZXInKS5FbmNvZGVyQnVmZmVyO1xuY29uc3QgRGVjb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4uL2Jhc2UvYnVmZmVyJykuRGVjb2RlckJ1ZmZlcjtcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuLy8gU3VwcG9ydGVkIHRhZ3NcbmNvbnN0IHRhZ3MgPSBbXG4gICdzZXEnLCAnc2Vxb2YnLCAnc2V0JywgJ3NldG9mJywgJ29iamlkJywgJ2Jvb2wnLFxuICAnZ2VudGltZScsICd1dGN0aW1lJywgJ251bGxfJywgJ2VudW0nLCAnaW50JywgJ29iakRlc2MnLFxuICAnYml0c3RyJywgJ2JtcHN0cicsICdjaGFyc3RyJywgJ2dlbnN0cicsICdncmFwaHN0cicsICdpYTVzdHInLCAnaXNvNjQ2c3RyJyxcbiAgJ251bXN0cicsICdvY3RzdHInLCAncHJpbnRzdHInLCAndDYxc3RyJywgJ3VuaXN0cicsICd1dGY4c3RyJywgJ3ZpZGVvc3RyJ1xuXTtcblxuLy8gUHVibGljIG1ldGhvZHMgbGlzdFxuY29uc3QgbWV0aG9kcyA9IFtcbiAgJ2tleScsICdvYmonLCAndXNlJywgJ29wdGlvbmFsJywgJ2V4cGxpY2l0JywgJ2ltcGxpY2l0JywgJ2RlZicsICdjaG9pY2UnLFxuICAnYW55JywgJ2NvbnRhaW5zJ1xuXS5jb25jYXQodGFncyk7XG5cbi8vIE92ZXJyaWRlZCBtZXRob2RzIGxpc3RcbmNvbnN0IG92ZXJyaWRlZCA9IFtcbiAgJ19wZWVrVGFnJywgJ19kZWNvZGVUYWcnLCAnX3VzZScsXG4gICdfZGVjb2RlU3RyJywgJ19kZWNvZGVPYmppZCcsICdfZGVjb2RlVGltZScsXG4gICdfZGVjb2RlTnVsbCcsICdfZGVjb2RlSW50JywgJ19kZWNvZGVCb29sJywgJ19kZWNvZGVMaXN0JyxcblxuICAnX2VuY29kZUNvbXBvc2l0ZScsICdfZW5jb2RlU3RyJywgJ19lbmNvZGVPYmppZCcsICdfZW5jb2RlVGltZScsXG4gICdfZW5jb2RlTnVsbCcsICdfZW5jb2RlSW50JywgJ19lbmNvZGVCb29sJ1xuXTtcblxuZnVuY3Rpb24gTm9kZShlbmMsIHBhcmVudCwgbmFtZSkge1xuICBjb25zdCBzdGF0ZSA9IHt9O1xuICB0aGlzLl9iYXNlU3RhdGUgPSBzdGF0ZTtcblxuICBzdGF0ZS5uYW1lID0gbmFtZTtcbiAgc3RhdGUuZW5jID0gZW5jO1xuXG4gIHN0YXRlLnBhcmVudCA9IHBhcmVudCB8fCBudWxsO1xuICBzdGF0ZS5jaGlsZHJlbiA9IG51bGw7XG5cbiAgLy8gU3RhdGVcbiAgc3RhdGUudGFnID0gbnVsbDtcbiAgc3RhdGUuYXJncyA9IG51bGw7XG4gIHN0YXRlLnJldmVyc2VBcmdzID0gbnVsbDtcbiAgc3RhdGUuY2hvaWNlID0gbnVsbDtcbiAgc3RhdGUub3B0aW9uYWwgPSBmYWxzZTtcbiAgc3RhdGUuYW55ID0gZmFsc2U7XG4gIHN0YXRlLm9iaiA9IGZhbHNlO1xuICBzdGF0ZS51c2UgPSBudWxsO1xuICBzdGF0ZS51c2VEZWNvZGVyID0gbnVsbDtcbiAgc3RhdGUua2V5ID0gbnVsbDtcbiAgc3RhdGVbJ2RlZmF1bHQnXSA9IG51bGw7XG4gIHN0YXRlLmV4cGxpY2l0ID0gbnVsbDtcbiAgc3RhdGUuaW1wbGljaXQgPSBudWxsO1xuICBzdGF0ZS5jb250YWlucyA9IG51bGw7XG5cbiAgLy8gU2hvdWxkIGNyZWF0ZSBuZXcgaW5zdGFuY2Ugb24gZWFjaCBtZXRob2RcbiAgaWYgKCFzdGF0ZS5wYXJlbnQpIHtcbiAgICBzdGF0ZS5jaGlsZHJlbiA9IFtdO1xuICAgIHRoaXMuX3dyYXAoKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBOb2RlO1xuXG5jb25zdCBzdGF0ZVByb3BzID0gW1xuICAnZW5jJywgJ3BhcmVudCcsICdjaGlsZHJlbicsICd0YWcnLCAnYXJncycsICdyZXZlcnNlQXJncycsICdjaG9pY2UnLFxuICAnb3B0aW9uYWwnLCAnYW55JywgJ29iaicsICd1c2UnLCAnYWx0ZXJlZFVzZScsICdrZXknLCAnZGVmYXVsdCcsICdleHBsaWNpdCcsXG4gICdpbXBsaWNpdCcsICdjb250YWlucydcbl07XG5cbk5vZGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBjb25zdCBjc3RhdGUgPSB7fTtcbiAgc3RhdGVQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICBjc3RhdGVbcHJvcF0gPSBzdGF0ZVtwcm9wXTtcbiAgfSk7XG4gIGNvbnN0IHJlcyA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGNzdGF0ZS5wYXJlbnQpO1xuICByZXMuX2Jhc2VTdGF0ZSA9IGNzdGF0ZTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbk5vZGUucHJvdG90eXBlLl93cmFwID0gZnVuY3Rpb24gd3JhcCgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIG1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICB0aGlzW21ldGhvZF0gPSBmdW5jdGlvbiBfd3JhcHBlZE1ldGhvZCgpIHtcbiAgICAgIGNvbnN0IGNsb25lID0gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyk7XG4gICAgICBzdGF0ZS5jaGlsZHJlbi5wdXNoKGNsb25lKTtcbiAgICAgIHJldHVybiBjbG9uZVttZXRob2RdLmFwcGx5KGNsb25lLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0sIHRoaXMpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0KGJvZHkpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLnBhcmVudCA9PT0gbnVsbCk7XG4gIGJvZHkuY2FsbCh0aGlzKTtcblxuICAvLyBGaWx0ZXIgY2hpbGRyZW5cbiAgc3RhdGUuY2hpbGRyZW4gPSBzdGF0ZS5jaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQuX2Jhc2VTdGF0ZS5wYXJlbnQgPT09IHRoaXM7XG4gIH0sIHRoaXMpO1xuICBhc3NlcnQuZXF1YWwoc3RhdGUuY2hpbGRyZW4ubGVuZ3RoLCAxLCAnUm9vdCBub2RlIGNhbiBoYXZlIG9ubHkgb25lIGNoaWxkJyk7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fdXNlQXJncyA9IGZ1bmN0aW9uIHVzZUFyZ3MoYXJncykge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAvLyBGaWx0ZXIgY2hpbGRyZW4gYW5kIGFyZ3NcbiAgY29uc3QgY2hpbGRyZW4gPSBhcmdzLmZpbHRlcihmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3RvcjtcbiAgfSwgdGhpcyk7XG4gIGFyZ3MgPSBhcmdzLmZpbHRlcihmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gIShhcmcgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfSwgdGhpcyk7XG5cbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCAhPT0gMCkge1xuICAgIGFzc2VydChzdGF0ZS5jaGlsZHJlbiA9PT0gbnVsbCk7XG4gICAgc3RhdGUuY2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgIC8vIFJlcGxhY2UgcGFyZW50IHRvIG1haW50YWluIGJhY2t3YXJkIGxpbmtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5fYmFzZVN0YXRlLnBhcmVudCA9IHRoaXM7XG4gICAgfSwgdGhpcyk7XG4gIH1cbiAgaWYgKGFyZ3MubGVuZ3RoICE9PSAwKSB7XG4gICAgYXNzZXJ0KHN0YXRlLmFyZ3MgPT09IG51bGwpO1xuICAgIHN0YXRlLmFyZ3MgPSBhcmdzO1xuICAgIHN0YXRlLnJldmVyc2VBcmdzID0gYXJncy5tYXAoZnVuY3Rpb24oYXJnKSB7XG4gICAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ29iamVjdCcgfHwgYXJnLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpXG4gICAgICAgIHJldHVybiBhcmc7XG5cbiAgICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMoYXJnKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoa2V5ID09IChrZXkgfCAwKSlcbiAgICAgICAgICBrZXkgfD0gMDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdba2V5XTtcbiAgICAgICAgcmVzW3ZhbHVlXSA9IGtleTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbiAgfVxufTtcblxuLy9cbi8vIE92ZXJyaWRlZCBtZXRob2RzXG4vL1xuXG5vdmVycmlkZWQuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgTm9kZS5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIF9vdmVycmlkZWQoKSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1ldGhvZCArICcgbm90IGltcGxlbWVudGVkIGZvciBlbmNvZGluZzogJyArIHN0YXRlLmVuYyk7XG4gIH07XG59KTtcblxuLy9cbi8vIFB1YmxpYyBtZXRob2RzXG4vL1xuXG50YWdzLmZvckVhY2goZnVuY3Rpb24odGFnKSB7XG4gIE5vZGUucHJvdG90eXBlW3RhZ10gPSBmdW5jdGlvbiBfdGFnTWV0aG9kKCkge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgYXNzZXJ0KHN0YXRlLnRhZyA9PT0gbnVsbCk7XG4gICAgc3RhdGUudGFnID0gdGFnO1xuXG4gICAgdGhpcy5fdXNlQXJncyhhcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufSk7XG5cbk5vZGUucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIHVzZShpdGVtKSB7XG4gIGFzc2VydChpdGVtKTtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLnVzZSA9PT0gbnVsbCk7XG4gIHN0YXRlLnVzZSA9IGl0ZW07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5vcHRpb25hbCA9IGZ1bmN0aW9uIG9wdGlvbmFsKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBzdGF0ZS5vcHRpb25hbCA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5kZWYgPSBmdW5jdGlvbiBkZWYodmFsKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZVsnZGVmYXVsdCddID09PSBudWxsKTtcbiAgc3RhdGVbJ2RlZmF1bHQnXSA9IHZhbDtcbiAgc3RhdGUub3B0aW9uYWwgPSB0cnVlO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuZXhwbGljaXQgPSBmdW5jdGlvbiBleHBsaWNpdChudW0pIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmV4cGxpY2l0ID09PSBudWxsICYmIHN0YXRlLmltcGxpY2l0ID09PSBudWxsKTtcbiAgc3RhdGUuZXhwbGljaXQgPSBudW07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5pbXBsaWNpdCA9IGZ1bmN0aW9uIGltcGxpY2l0KG51bSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUuZXhwbGljaXQgPT09IG51bGwgJiYgc3RhdGUuaW1wbGljaXQgPT09IG51bGwpO1xuICBzdGF0ZS5pbXBsaWNpdCA9IG51bTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLm9iaiA9IGZ1bmN0aW9uIG9iaigpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gIHN0YXRlLm9iaiA9IHRydWU7XG5cbiAgaWYgKGFyZ3MubGVuZ3RoICE9PSAwKVxuICAgIHRoaXMuX3VzZUFyZ3MoYXJncyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5rZXkgPSBmdW5jdGlvbiBrZXkobmV3S2V5KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5rZXkgPT09IG51bGwpO1xuICBzdGF0ZS5rZXkgPSBuZXdLZXk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5hbnkgPSBmdW5jdGlvbiBhbnkoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIHN0YXRlLmFueSA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5jaG9pY2UgPSBmdW5jdGlvbiBjaG9pY2Uob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5jaG9pY2UgPT09IG51bGwpO1xuICBzdGF0ZS5jaG9pY2UgPSBvYmo7XG4gIHRoaXMuX3VzZUFyZ3MoT2JqZWN0LmtleXMob2JqKS5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIG9ialtrZXldO1xuICB9KSk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIGNvbnRhaW5zKGl0ZW0pIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLnVzZSA9PT0gbnVsbCk7XG4gIHN0YXRlLmNvbnRhaW5zID0gaXRlbTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vXG4vLyBEZWNvZGluZ1xuLy9cblxuTm9kZS5wcm90b3R5cGUuX2RlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgb3B0aW9ucykge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAvLyBEZWNvZGUgcm9vdCBub2RlXG4gIGlmIChzdGF0ZS5wYXJlbnQgPT09IG51bGwpXG4gICAgcmV0dXJuIGlucHV0LndyYXBSZXN1bHQoc3RhdGUuY2hpbGRyZW5bMF0uX2RlY29kZShpbnB1dCwgb3B0aW9ucykpO1xuXG4gIGxldCByZXN1bHQgPSBzdGF0ZVsnZGVmYXVsdCddO1xuICBsZXQgcHJlc2VudCA9IHRydWU7XG5cbiAgbGV0IHByZXZLZXkgPSBudWxsO1xuICBpZiAoc3RhdGUua2V5ICE9PSBudWxsKVxuICAgIHByZXZLZXkgPSBpbnB1dC5lbnRlcktleShzdGF0ZS5rZXkpO1xuXG4gIC8vIENoZWNrIGlmIHRhZyBpcyB0aGVyZVxuICBpZiAoc3RhdGUub3B0aW9uYWwpIHtcbiAgICBsZXQgdGFnID0gbnVsbDtcbiAgICBpZiAoc3RhdGUuZXhwbGljaXQgIT09IG51bGwpXG4gICAgICB0YWcgPSBzdGF0ZS5leHBsaWNpdDtcbiAgICBlbHNlIGlmIChzdGF0ZS5pbXBsaWNpdCAhPT0gbnVsbClcbiAgICAgIHRhZyA9IHN0YXRlLmltcGxpY2l0O1xuICAgIGVsc2UgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbClcbiAgICAgIHRhZyA9IHN0YXRlLnRhZztcblxuICAgIGlmICh0YWcgPT09IG51bGwgJiYgIXN0YXRlLmFueSkge1xuICAgICAgLy8gVHJpYWwgYW5kIEVycm9yXG4gICAgICBjb25zdCBzYXZlID0gaW5wdXQuc2F2ZSgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHN0YXRlLmNob2ljZSA9PT0gbnVsbClcbiAgICAgICAgICB0aGlzLl9kZWNvZGVHZW5lcmljKHN0YXRlLnRhZywgaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpcy5fZGVjb2RlQ2hvaWNlKGlucHV0LCBvcHRpb25zKTtcbiAgICAgICAgcHJlc2VudCA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHByZXNlbnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlucHV0LnJlc3RvcmUoc2F2ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZXNlbnQgPSB0aGlzLl9wZWVrVGFnKGlucHV0LCB0YWcsIHN0YXRlLmFueSk7XG5cbiAgICAgIGlmIChpbnB1dC5pc0Vycm9yKHByZXNlbnQpKVxuICAgICAgICByZXR1cm4gcHJlc2VudDtcbiAgICB9XG4gIH1cblxuICAvLyBQdXNoIG9iamVjdCBvbiBzdGFja1xuICBsZXQgcHJldk9iajtcbiAgaWYgKHN0YXRlLm9iaiAmJiBwcmVzZW50KVxuICAgIHByZXZPYmogPSBpbnB1dC5lbnRlck9iamVjdCgpO1xuXG4gIGlmIChwcmVzZW50KSB7XG4gICAgLy8gVW53cmFwIGV4cGxpY2l0IHZhbHVlc1xuICAgIGlmIChzdGF0ZS5leHBsaWNpdCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgZXhwbGljaXQgPSB0aGlzLl9kZWNvZGVUYWcoaW5wdXQsIHN0YXRlLmV4cGxpY2l0KTtcbiAgICAgIGlmIChpbnB1dC5pc0Vycm9yKGV4cGxpY2l0KSlcbiAgICAgICAgcmV0dXJuIGV4cGxpY2l0O1xuICAgICAgaW5wdXQgPSBleHBsaWNpdDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydCA9IGlucHV0Lm9mZnNldDtcblxuICAgIC8vIFVud3JhcCBpbXBsaWNpdCBhbmQgbm9ybWFsIHZhbHVlc1xuICAgIGlmIChzdGF0ZS51c2UgPT09IG51bGwgJiYgc3RhdGUuY2hvaWNlID09PSBudWxsKSB7XG4gICAgICBsZXQgc2F2ZTtcbiAgICAgIGlmIChzdGF0ZS5hbnkpXG4gICAgICAgIHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgICBjb25zdCBib2R5ID0gdGhpcy5fZGVjb2RlVGFnKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgc3RhdGUuaW1wbGljaXQgIT09IG51bGwgPyBzdGF0ZS5pbXBsaWNpdCA6IHN0YXRlLnRhZyxcbiAgICAgICAgc3RhdGUuYW55XG4gICAgICApO1xuICAgICAgaWYgKGlucHV0LmlzRXJyb3IoYm9keSkpXG4gICAgICAgIHJldHVybiBib2R5O1xuXG4gICAgICBpZiAoc3RhdGUuYW55KVxuICAgICAgICByZXN1bHQgPSBpbnB1dC5yYXcoc2F2ZSk7XG4gICAgICBlbHNlXG4gICAgICAgIGlucHV0ID0gYm9keTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyYWNrICYmIHN0YXRlLnRhZyAhPT0gbnVsbClcbiAgICAgIG9wdGlvbnMudHJhY2soaW5wdXQucGF0aCgpLCBzdGFydCwgaW5wdXQubGVuZ3RoLCAndGFnZ2VkJyk7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyYWNrICYmIHN0YXRlLnRhZyAhPT0gbnVsbClcbiAgICAgIG9wdGlvbnMudHJhY2soaW5wdXQucGF0aCgpLCBpbnB1dC5vZmZzZXQsIGlucHV0Lmxlbmd0aCwgJ2NvbnRlbnQnKTtcblxuICAgIC8vIFNlbGVjdCBwcm9wZXIgbWV0aG9kIGZvciB0YWdcbiAgICBpZiAoc3RhdGUuYW55KSB7XG4gICAgICAvLyBuby1vcFxuICAgIH0gZWxzZSBpZiAoc3RhdGUuY2hvaWNlID09PSBudWxsKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLl9kZWNvZGVHZW5lcmljKHN0YXRlLnRhZywgaW5wdXQsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLl9kZWNvZGVDaG9pY2UoaW5wdXQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC5pc0Vycm9yKHJlc3VsdCkpXG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgLy8gRGVjb2RlIGNoaWxkcmVuXG4gICAgaWYgKCFzdGF0ZS5hbnkgJiYgc3RhdGUuY2hvaWNlID09PSBudWxsICYmIHN0YXRlLmNoaWxkcmVuICE9PSBudWxsKSB7XG4gICAgICBzdGF0ZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIGRlY29kZUNoaWxkcmVuKGNoaWxkKSB7XG4gICAgICAgIC8vIE5PVEU6IFdlIGFyZSBpZ25vcmluZyBlcnJvcnMgaGVyZSwgdG8gbGV0IHBhcnNlciBjb250aW51ZSB3aXRoIG90aGVyXG4gICAgICAgIC8vIHBhcnRzIG9mIGVuY29kZWQgZGF0YVxuICAgICAgICBjaGlsZC5fZGVjb2RlKGlucHV0LCBvcHRpb25zKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERlY29kZSBjb250YWluZWQvZW5jb2RlZCBieSBzY2hlbWEsIG9ubHkgaW4gYml0IG9yIG9jdGV0IHN0cmluZ3NcbiAgICBpZiAoc3RhdGUuY29udGFpbnMgJiYgKHN0YXRlLnRhZyA9PT0gJ29jdHN0cicgfHwgc3RhdGUudGFnID09PSAnYml0c3RyJykpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgRGVjb2RlckJ1ZmZlcihyZXN1bHQpO1xuICAgICAgcmVzdWx0ID0gdGhpcy5fZ2V0VXNlKHN0YXRlLmNvbnRhaW5zLCBpbnB1dC5fcmVwb3J0ZXJTdGF0ZS5vYmopXG4gICAgICAgIC5fZGVjb2RlKGRhdGEsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBvcCBvYmplY3RcbiAgaWYgKHN0YXRlLm9iaiAmJiBwcmVzZW50KVxuICAgIHJlc3VsdCA9IGlucHV0LmxlYXZlT2JqZWN0KHByZXZPYmopO1xuXG4gIC8vIFNldCBrZXlcbiAgaWYgKHN0YXRlLmtleSAhPT0gbnVsbCAmJiAocmVzdWx0ICE9PSBudWxsIHx8IHByZXNlbnQgPT09IHRydWUpKVxuICAgIGlucHV0LmxlYXZlS2V5KHByZXZLZXksIHN0YXRlLmtleSwgcmVzdWx0KTtcbiAgZWxzZSBpZiAocHJldktleSAhPT0gbnVsbClcbiAgICBpbnB1dC5leGl0S2V5KHByZXZLZXkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZGVjb2RlR2VuZXJpYyA9IGZ1bmN0aW9uIGRlY29kZUdlbmVyaWModGFnLCBpbnB1dCwgb3B0aW9ucykge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBpZiAodGFnID09PSAnc2VxJyB8fCB0YWcgPT09ICdzZXQnKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAodGFnID09PSAnc2Vxb2YnIHx8IHRhZyA9PT0gJ3NldG9mJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlTGlzdChpbnB1dCwgdGFnLCBzdGF0ZS5hcmdzWzBdLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAoL3N0ciQvLnRlc3QodGFnKSlcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlU3RyKGlucHV0LCB0YWcsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmppZCcgJiYgc3RhdGUuYXJncylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlT2JqaWQoaW5wdXQsIHN0YXRlLmFyZ3NbMF0sIHN0YXRlLmFyZ3NbMV0sIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmppZCcpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZU9iamlkKGlucHV0LCBudWxsLCBudWxsLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnZ2VudGltZScgfHwgdGFnID09PSAndXRjdGltZScpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZVRpbWUoaW5wdXQsIHRhZywgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ251bGxfJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlTnVsbChpbnB1dCwgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2Jvb2wnKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVCb29sKGlucHV0LCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqRGVzYycpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZVN0cihpbnB1dCwgdGFnLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnaW50JyB8fCB0YWcgPT09ICdlbnVtJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlSW50KGlucHV0LCBzdGF0ZS5hcmdzICYmIHN0YXRlLmFyZ3NbMF0sIG9wdGlvbnMpO1xuXG4gIGlmIChzdGF0ZS51c2UgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VXNlKHN0YXRlLnVzZSwgaW5wdXQuX3JlcG9ydGVyU3RhdGUub2JqKVxuICAgICAgLl9kZWNvZGUoaW5wdXQsIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpbnB1dC5lcnJvcigndW5rbm93biB0YWc6ICcgKyB0YWcpO1xuICB9XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZ2V0VXNlID0gZnVuY3Rpb24gX2dldFVzZShlbnRpdHksIG9iaikge1xuXG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICAvLyBDcmVhdGUgYWx0ZXJlZCB1c2UgZGVjb2RlciBpZiBpbXBsaWNpdCBpcyBzZXRcbiAgc3RhdGUudXNlRGVjb2RlciA9IHRoaXMuX3VzZShlbnRpdHksIG9iaik7XG4gIGFzc2VydChzdGF0ZS51c2VEZWNvZGVyLl9iYXNlU3RhdGUucGFyZW50ID09PSBudWxsKTtcbiAgc3RhdGUudXNlRGVjb2RlciA9IHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5jaGlsZHJlblswXTtcbiAgaWYgKHN0YXRlLmltcGxpY2l0ICE9PSBzdGF0ZS51c2VEZWNvZGVyLl9iYXNlU3RhdGUuaW1wbGljaXQpIHtcbiAgICBzdGF0ZS51c2VEZWNvZGVyID0gc3RhdGUudXNlRGVjb2Rlci5jbG9uZSgpO1xuICAgIHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5pbXBsaWNpdCA9IHN0YXRlLmltcGxpY2l0O1xuICB9XG4gIHJldHVybiBzdGF0ZS51c2VEZWNvZGVyO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2RlY29kZUNob2ljZSA9IGZ1bmN0aW9uIGRlY29kZUNob2ljZShpbnB1dCwgb3B0aW9ucykge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgbGV0IHJlc3VsdCA9IG51bGw7XG4gIGxldCBtYXRjaCA9IGZhbHNlO1xuXG4gIE9iamVjdC5rZXlzKHN0YXRlLmNob2ljZSkuc29tZShmdW5jdGlvbihrZXkpIHtcbiAgICBjb25zdCBzYXZlID0gaW5wdXQuc2F2ZSgpO1xuICAgIGNvbnN0IG5vZGUgPSBzdGF0ZS5jaG9pY2Vba2V5XTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsdWUgPSBub2RlLl9kZWNvZGUoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgaWYgKGlucHV0LmlzRXJyb3IodmFsdWUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJlc3VsdCA9IHsgdHlwZToga2V5LCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgIG1hdGNoID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpbnB1dC5yZXN0b3JlKHNhdmUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSwgdGhpcyk7XG5cbiAgaWYgKCFtYXRjaClcbiAgICByZXR1cm4gaW5wdXQuZXJyb3IoJ0Nob2ljZSBub3QgbWF0Y2hlZCcpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vL1xuLy8gRW5jb2Rpbmdcbi8vXG5cbk5vZGUucHJvdG90eXBlLl9jcmVhdGVFbmNvZGVyQnVmZmVyID0gZnVuY3Rpb24gY3JlYXRlRW5jb2RlckJ1ZmZlcihkYXRhKSB7XG4gIHJldHVybiBuZXcgRW5jb2RlckJ1ZmZlcihkYXRhLCB0aGlzLnJlcG9ydGVyKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgcmVwb3J0ZXIsIHBhcmVudCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgaWYgKHN0YXRlWydkZWZhdWx0J10gIT09IG51bGwgJiYgc3RhdGVbJ2RlZmF1bHQnXSA9PT0gZGF0YSlcbiAgICByZXR1cm47XG5cbiAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZW5jb2RlVmFsdWUoZGF0YSwgcmVwb3J0ZXIsIHBhcmVudCk7XG4gIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm47XG5cbiAgaWYgKHRoaXMuX3NraXBEZWZhdWx0KHJlc3VsdCwgcmVwb3J0ZXIsIHBhcmVudCkpXG4gICAgcmV0dXJuO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlVmFsdWUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgcmVwb3J0ZXIsIHBhcmVudCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAvLyBEZWNvZGUgcm9vdCBub2RlXG4gIGlmIChzdGF0ZS5wYXJlbnQgPT09IG51bGwpXG4gICAgcmV0dXJuIHN0YXRlLmNoaWxkcmVuWzBdLl9lbmNvZGUoZGF0YSwgcmVwb3J0ZXIgfHwgbmV3IFJlcG9ydGVyKCkpO1xuXG4gIGxldCByZXN1bHQgPSBudWxsO1xuXG4gIC8vIFNldCByZXBvcnRlciB0byBzaGFyZSBpdCB3aXRoIGEgY2hpbGQgY2xhc3NcbiAgdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyO1xuXG4gIC8vIENoZWNrIGlmIGRhdGEgaXMgdGhlcmVcbiAgaWYgKHN0YXRlLm9wdGlvbmFsICYmIGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0ZVsnZGVmYXVsdCddICE9PSBudWxsKVxuICAgICAgZGF0YSA9IHN0YXRlWydkZWZhdWx0J107XG4gICAgZWxzZVxuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRW5jb2RlIGNoaWxkcmVuIGZpcnN0XG4gIGxldCBjb250ZW50ID0gbnVsbDtcbiAgbGV0IHByaW1pdGl2ZSA9IGZhbHNlO1xuICBpZiAoc3RhdGUuYW55KSB7XG4gICAgLy8gQW55dGhpbmcgdGhhdCB3YXMgZ2l2ZW4gaXMgdHJhbnNsYXRlZCB0byBidWZmZXJcbiAgICByZXN1bHQgPSB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGRhdGEpO1xuICB9IGVsc2UgaWYgKHN0YXRlLmNob2ljZSkge1xuICAgIHJlc3VsdCA9IHRoaXMuX2VuY29kZUNob2ljZShkYXRhLCByZXBvcnRlcik7XG4gIH0gZWxzZSBpZiAoc3RhdGUuY29udGFpbnMpIHtcbiAgICBjb250ZW50ID0gdGhpcy5fZ2V0VXNlKHN0YXRlLmNvbnRhaW5zLCBwYXJlbnQpLl9lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpO1xuICAgIHByaW1pdGl2ZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoc3RhdGUuY2hpbGRyZW4pIHtcbiAgICBjb250ZW50ID0gc3RhdGUuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQuX2Jhc2VTdGF0ZS50YWcgPT09ICdudWxsXycpXG4gICAgICAgIHJldHVybiBjaGlsZC5fZW5jb2RlKG51bGwsIHJlcG9ydGVyLCBkYXRhKTtcblxuICAgICAgaWYgKGNoaWxkLl9iYXNlU3RhdGUua2V5ID09PSBudWxsKVxuICAgICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ0NoaWxkIHNob3VsZCBoYXZlIGEga2V5Jyk7XG4gICAgICBjb25zdCBwcmV2S2V5ID0gcmVwb3J0ZXIuZW50ZXJLZXkoY2hpbGQuX2Jhc2VTdGF0ZS5rZXkpO1xuXG4gICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKVxuICAgICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ0NoaWxkIGV4cGVjdGVkLCBidXQgaW5wdXQgaXMgbm90IG9iamVjdCcpO1xuXG4gICAgICBjb25zdCByZXMgPSBjaGlsZC5fZW5jb2RlKGRhdGFbY2hpbGQuX2Jhc2VTdGF0ZS5rZXldLCByZXBvcnRlciwgZGF0YSk7XG4gICAgICByZXBvcnRlci5sZWF2ZUtleShwcmV2S2V5KTtcblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCB0aGlzKS5maWx0ZXIoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9KTtcbiAgICBjb250ZW50ID0gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihjb250ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoc3RhdGUudGFnID09PSAnc2Vxb2YnIHx8IHN0YXRlLnRhZyA9PT0gJ3NldG9mJykge1xuICAgICAgLy8gVE9ETyhpbmR1dG55KTogdGhpcyBzaG91bGQgYmUgdGhyb3duIG9uIERTTCBsZXZlbFxuICAgICAgaWYgKCEoc3RhdGUuYXJncyAmJiBzdGF0ZS5hcmdzLmxlbmd0aCA9PT0gMSkpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignVG9vIG1hbnkgYXJncyBmb3IgOiAnICsgc3RhdGUudGFnKTtcblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKVxuICAgICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ3NlcW9mL3NldG9mLCBidXQgZGF0YSBpcyBub3QgQXJyYXknKTtcblxuICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLmNsb25lKCk7XG4gICAgICBjaGlsZC5fYmFzZVN0YXRlLmltcGxpY2l0ID0gbnVsbDtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGRhdGEubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFVzZShzdGF0ZS5hcmdzWzBdLCBkYXRhKS5fZW5jb2RlKGl0ZW0sIHJlcG9ydGVyKTtcbiAgICAgIH0sIGNoaWxkKSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS51c2UgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2dldFVzZShzdGF0ZS51c2UsIHBhcmVudCkuX2VuY29kZShkYXRhLCByZXBvcnRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLl9lbmNvZGVQcmltaXRpdmUoc3RhdGUudGFnLCBkYXRhKTtcbiAgICAgIHByaW1pdGl2ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gRW5jb2RlIGRhdGEgaXRzZWxmXG4gIGlmICghc3RhdGUuYW55ICYmIHN0YXRlLmNob2ljZSA9PT0gbnVsbCkge1xuICAgIGNvbnN0IHRhZyA9IHN0YXRlLmltcGxpY2l0ICE9PSBudWxsID8gc3RhdGUuaW1wbGljaXQgOiBzdGF0ZS50YWc7XG4gICAgY29uc3QgY2xzID0gc3RhdGUuaW1wbGljaXQgPT09IG51bGwgPyAndW5pdmVyc2FsJyA6ICdjb250ZXh0JztcblxuICAgIGlmICh0YWcgPT09IG51bGwpIHtcbiAgICAgIGlmIChzdGF0ZS51c2UgPT09IG51bGwpXG4gICAgICAgIHJlcG9ydGVyLmVycm9yKCdUYWcgY291bGQgYmUgb21pdHRlZCBvbmx5IGZvciAudXNlKCknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRlLnVzZSA9PT0gbnVsbClcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZW5jb2RlQ29tcG9zaXRlKHRhZywgcHJpbWl0aXZlLCBjbHMsIGNvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdyYXAgaW4gZXhwbGljaXRcbiAgaWYgKHN0YXRlLmV4cGxpY2l0ICE9PSBudWxsKVxuICAgIHJlc3VsdCA9IHRoaXMuX2VuY29kZUNvbXBvc2l0ZShzdGF0ZS5leHBsaWNpdCwgZmFsc2UsICdjb250ZXh0JywgcmVzdWx0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2VuY29kZUNob2ljZSA9IGZ1bmN0aW9uIGVuY29kZUNob2ljZShkYXRhLCByZXBvcnRlcikge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBjb25zdCBub2RlID0gc3RhdGUuY2hvaWNlW2RhdGEudHlwZV07XG4gIGlmICghbm9kZSkge1xuICAgIGFzc2VydChcbiAgICAgIGZhbHNlLFxuICAgICAgZGF0YS50eXBlICsgJyBub3QgZm91bmQgaW4gJyArXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhzdGF0ZS5jaG9pY2UpKSk7XG4gIH1cbiAgcmV0dXJuIG5vZGUuX2VuY29kZShkYXRhLnZhbHVlLCByZXBvcnRlcik7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlUHJpbWl0aXZlID0gZnVuY3Rpb24gZW5jb2RlUHJpbWl0aXZlKHRhZywgZGF0YSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBpZiAoL3N0ciQvLnRlc3QodGFnKSlcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlU3RyKGRhdGEsIHRhZyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJyAmJiBzdGF0ZS5hcmdzKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVPYmppZChkYXRhLCBzdGF0ZS5yZXZlcnNlQXJnc1swXSwgc3RhdGUuYXJnc1sxXSk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlT2JqaWQoZGF0YSwgbnVsbCwgbnVsbCk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2dlbnRpbWUnIHx8IHRhZyA9PT0gJ3V0Y3RpbWUnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVUaW1lKGRhdGEsIHRhZyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ251bGxfJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlTnVsbCgpO1xuICBlbHNlIGlmICh0YWcgPT09ICdpbnQnIHx8IHRhZyA9PT0gJ2VudW0nKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVJbnQoZGF0YSwgc3RhdGUuYXJncyAmJiBzdGF0ZS5yZXZlcnNlQXJnc1swXSk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2Jvb2wnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVCb29sKGRhdGEpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmpEZXNjJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlU3RyKGRhdGEsIHRhZyk7XG4gIGVsc2VcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHRhZzogJyArIHRhZyk7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5faXNOdW1zdHIgPSBmdW5jdGlvbiBpc051bXN0cihzdHIpIHtcbiAgcmV0dXJuIC9eWzAtOSBdKiQvLnRlc3Qoc3RyKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9pc1ByaW50c3RyID0gZnVuY3Rpb24gaXNQcmludHN0cihzdHIpIHtcbiAgcmV0dXJuIC9eW0EtWmEtejAtOSAnKCkrLC0uLzo9P10qJC8udGVzdChzdHIpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG4vLyBIZWxwZXJcbmZ1bmN0aW9uIHJldmVyc2UobWFwKSB7XG4gIGNvbnN0IHJlcyA9IHt9O1xuXG4gIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAvLyBDb252ZXJ0IGtleSB0byBpbnRlZ2VyIGlmIGl0IGlzIHN0cmluZ2lmaWVkXG4gICAgaWYgKChrZXkgfCAwKSA9PSBrZXkpXG4gICAgICBrZXkgPSBrZXkgfCAwO1xuXG4gICAgY29uc3QgdmFsdWUgPSBtYXBba2V5XTtcbiAgICByZXNbdmFsdWVdID0ga2V5O1xuICB9KTtcblxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnRzLnRhZ0NsYXNzID0ge1xuICAwOiAndW5pdmVyc2FsJyxcbiAgMTogJ2FwcGxpY2F0aW9uJyxcbiAgMjogJ2NvbnRleHQnLFxuICAzOiAncHJpdmF0ZSdcbn07XG5leHBvcnRzLnRhZ0NsYXNzQnlOYW1lID0gcmV2ZXJzZShleHBvcnRzLnRhZ0NsYXNzKTtcblxuZXhwb3J0cy50YWcgPSB7XG4gIDB4MDA6ICdlbmQnLFxuICAweDAxOiAnYm9vbCcsXG4gIDB4MDI6ICdpbnQnLFxuICAweDAzOiAnYml0c3RyJyxcbiAgMHgwNDogJ29jdHN0cicsXG4gIDB4MDU6ICdudWxsXycsXG4gIDB4MDY6ICdvYmppZCcsXG4gIDB4MDc6ICdvYmpEZXNjJyxcbiAgMHgwODogJ2V4dGVybmFsJyxcbiAgMHgwOTogJ3JlYWwnLFxuICAweDBhOiAnZW51bScsXG4gIDB4MGI6ICdlbWJlZCcsXG4gIDB4MGM6ICd1dGY4c3RyJyxcbiAgMHgwZDogJ3JlbGF0aXZlT2lkJyxcbiAgMHgxMDogJ3NlcScsXG4gIDB4MTE6ICdzZXQnLFxuICAweDEyOiAnbnVtc3RyJyxcbiAgMHgxMzogJ3ByaW50c3RyJyxcbiAgMHgxNDogJ3Q2MXN0cicsXG4gIDB4MTU6ICd2aWRlb3N0cicsXG4gIDB4MTY6ICdpYTVzdHInLFxuICAweDE3OiAndXRjdGltZScsXG4gIDB4MTg6ICdnZW50aW1lJyxcbiAgMHgxOTogJ2dyYXBoc3RyJyxcbiAgMHgxYTogJ2lzbzY0NnN0cicsXG4gIDB4MWI6ICdnZW5zdHInLFxuICAweDFjOiAndW5pc3RyJyxcbiAgMHgxZDogJ2NoYXJzdHInLFxuICAweDFlOiAnYm1wc3RyJ1xufTtcbmV4cG9ydHMudGFnQnlOYW1lID0gcmV2ZXJzZShleHBvcnRzLnRhZyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xuY29uc3QgTm9kZSA9IHJlcXVpcmUoJy4uL2Jhc2Uvbm9kZScpO1xuXG4vLyBJbXBvcnQgREVSIGNvbnN0YW50c1xuY29uc3QgZGVyID0gcmVxdWlyZSgnLi4vY29uc3RhbnRzL2RlcicpO1xuXG5mdW5jdGlvbiBERVJFbmNvZGVyKGVudGl0eSkge1xuICB0aGlzLmVuYyA9ICdkZXInO1xuICB0aGlzLm5hbWUgPSBlbnRpdHkubmFtZTtcbiAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG5cbiAgLy8gQ29uc3RydWN0IGJhc2UgdHJlZVxuICB0aGlzLnRyZWUgPSBuZXcgREVSTm9kZSgpO1xuICB0aGlzLnRyZWUuX2luaXQoZW50aXR5LmJvZHkpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBERVJFbmNvZGVyO1xuXG5ERVJFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgcmVwb3J0ZXIpIHtcbiAgcmV0dXJuIHRoaXMudHJlZS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyKS5qb2luKCk7XG59O1xuXG4vLyBUcmVlIG1ldGhvZHNcblxuZnVuY3Rpb24gREVSTm9kZShwYXJlbnQpIHtcbiAgTm9kZS5jYWxsKHRoaXMsICdkZXInLCBwYXJlbnQpO1xufVxuaW5oZXJpdHMoREVSTm9kZSwgTm9kZSk7XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVDb21wb3NpdGUgPSBmdW5jdGlvbiBlbmNvZGVDb21wb3NpdGUodGFnLFxuICBwcmltaXRpdmUsXG4gIGNscyxcbiAgY29udGVudCkge1xuICBjb25zdCBlbmNvZGVkVGFnID0gZW5jb2RlVGFnKHRhZywgcHJpbWl0aXZlLCBjbHMsIHRoaXMucmVwb3J0ZXIpO1xuXG4gIC8vIFNob3J0IGZvcm1cbiAgaWYgKGNvbnRlbnQubGVuZ3RoIDwgMHg4MCkge1xuICAgIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyKTtcbiAgICBoZWFkZXJbMF0gPSBlbmNvZGVkVGFnO1xuICAgIGhlYWRlclsxXSA9IGNvbnRlbnQubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFsgaGVhZGVyLCBjb250ZW50IF0pO1xuICB9XG5cbiAgLy8gTG9uZyBmb3JtXG4gIC8vIENvdW50IG9jdGV0cyByZXF1aXJlZCB0byBzdG9yZSBsZW5ndGhcbiAgbGV0IGxlbk9jdGV0cyA9IDE7XG4gIGZvciAobGV0IGkgPSBjb250ZW50Lmxlbmd0aDsgaSA+PSAweDEwMDsgaSA+Pj0gOClcbiAgICBsZW5PY3RldHMrKztcblxuICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMSArIDEgKyBsZW5PY3RldHMpO1xuICBoZWFkZXJbMF0gPSBlbmNvZGVkVGFnO1xuICBoZWFkZXJbMV0gPSAweDgwIHwgbGVuT2N0ZXRzO1xuXG4gIGZvciAobGV0IGkgPSAxICsgbGVuT2N0ZXRzLCBqID0gY29udGVudC5sZW5ndGg7IGogPiAwOyBpLS0sIGogPj49IDgpXG4gICAgaGVhZGVyW2ldID0gaiAmIDB4ZmY7XG5cbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWyBoZWFkZXIsIGNvbnRlbnQgXSk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlU3RyID0gZnVuY3Rpb24gZW5jb2RlU3RyKHN0ciwgdGFnKSB7XG4gIGlmICh0YWcgPT09ICdiaXRzdHInKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWyBzdHIudW51c2VkIHwgMCwgc3RyLmRhdGEgXSk7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnYm1wc3RyJykge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5hbGxvYyhzdHIubGVuZ3RoICogMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGJ1Zi53cml0ZVVJbnQxNkJFKHN0ci5jaGFyQ29kZUF0KGkpLCBpICogMik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGJ1Zik7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnbnVtc3RyJykge1xuICAgIGlmICghdGhpcy5faXNOdW1zdHIoc3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nIG9mIHN0cmluZyB0eXBlOiBudW1zdHIgc3VwcG9ydHMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25seSBkaWdpdHMgYW5kIHNwYWNlJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSBpZiAodGFnID09PSAncHJpbnRzdHInKSB7XG4gICAgaWYgKCF0aGlzLl9pc1ByaW50c3RyKHN0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogcHJpbnRzdHIgc3VwcG9ydHMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25seSBsYXRpbiB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXJzLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaWdpdHMsIHNwYWNlLCBhcG9zdHJvcGhlLCBsZWZ0IGFuZCByaWd0aCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJlbnRoZXNpcywgcGx1cyBzaWduLCBjb21tYSwgaHlwaGVuLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb3QsIHNsYXNoLCBjb2xvbiwgZXF1YWwgc2lnbiwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXVlc3Rpb24gbWFyaycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2UgaWYgKC9zdHIkLy50ZXN0KHRhZykpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ29iakRlc2MnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoc3RyKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICcgKyB0YWcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgdW5zdXBwb3J0ZWQnKTtcbiAgfVxufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZU9iamlkID0gZnVuY3Rpb24gZW5jb2RlT2JqaWQoaWQsIHZhbHVlcywgcmVsYXRpdmUpIHtcbiAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXZhbHVlcylcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdzdHJpbmcgb2JqaWQgZ2l2ZW4sIGJ1dCBubyB2YWx1ZXMgbWFwIGZvdW5kJyk7XG4gICAgaWYgKCF2YWx1ZXMuaGFzT3duUHJvcGVydHkoaWQpKVxuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ29iamlkIG5vdCBmb3VuZCBpbiB2YWx1ZXMgbWFwJyk7XG4gICAgaWQgPSB2YWx1ZXNbaWRdLnNwbGl0KC9bXFxzLl0rL2cpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpKyspXG4gICAgICBpZFtpXSB8PSAwO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgaWQgPSBpZC5zbGljZSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpKyspXG4gICAgICBpZFtpXSB8PSAwO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGlkKSkge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdvYmppZCgpIHNob3VsZCBiZSBlaXRoZXIgYXJyYXkgb3Igc3RyaW5nLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ290OiAnICsgSlNPTi5zdHJpbmdpZnkoaWQpKTtcbiAgfVxuXG4gIGlmICghcmVsYXRpdmUpIHtcbiAgICBpZiAoaWRbMV0gPj0gNDApXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignU2Vjb25kIG9iamlkIGlkZW50aWZpZXIgT09CJyk7XG4gICAgaWQuc3BsaWNlKDAsIDIsIGlkWzBdICogNDAgKyBpZFsxXSk7XG4gIH1cblxuICAvLyBDb3VudCBudW1iZXIgb2Ygb2N0ZXRzXG4gIGxldCBzaXplID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKykge1xuICAgIGxldCBpZGVudCA9IGlkW2ldO1xuICAgIGZvciAoc2l6ZSsrOyBpZGVudCA+PSAweDgwOyBpZGVudCA+Pj0gNylcbiAgICAgIHNpemUrKztcbiAgfVxuXG4gIGNvbnN0IG9iamlkID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICBsZXQgb2Zmc2V0ID0gb2JqaWQubGVuZ3RoIC0gMTtcbiAgZm9yIChsZXQgaSA9IGlkLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGV0IGlkZW50ID0gaWRbaV07XG4gICAgb2JqaWRbb2Zmc2V0LS1dID0gaWRlbnQgJiAweDdmO1xuICAgIHdoaWxlICgoaWRlbnQgPj49IDcpID4gMClcbiAgICAgIG9iamlkW29mZnNldC0tXSA9IDB4ODAgfCAoaWRlbnQgJiAweDdmKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG9iamlkKTtcbn07XG5cbmZ1bmN0aW9uIHR3byhudW0pIHtcbiAgaWYgKG51bSA8IDEwKVxuICAgIHJldHVybiAnMCcgKyBudW07XG4gIGVsc2VcbiAgICByZXR1cm4gbnVtO1xufVxuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlVGltZSA9IGZ1bmN0aW9uIGVuY29kZVRpbWUodGltZSwgdGFnKSB7XG4gIGxldCBzdHI7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aW1lKTtcblxuICBpZiAodGFnID09PSAnZ2VudGltZScpIHtcbiAgICBzdHIgPSBbXG4gICAgICB0d28oZGF0ZS5nZXRVVENGdWxsWWVhcigpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0RhdGUoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENIb3VycygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ01pbnV0ZXMoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENTZWNvbmRzKCkpLFxuICAgICAgJ1onXG4gICAgXS5qb2luKCcnKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICd1dGN0aW1lJykge1xuICAgIHN0ciA9IFtcbiAgICAgIHR3byhkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgJSAxMDApLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDRGF0ZSgpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0hvdXJzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTWludXRlcygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ1NlY29uZHMoKSksXG4gICAgICAnWidcbiAgICBdLmpvaW4oJycpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nICcgKyB0YWcgKyAnIHRpbWUgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9lbmNvZGVTdHIoc3RyLCAnb2N0c3RyJyk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlTnVsbCA9IGZ1bmN0aW9uIGVuY29kZU51bGwoKSB7XG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKCcnKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVJbnQgPSBmdW5jdGlvbiBlbmNvZGVJbnQobnVtLCB2YWx1ZXMpIHtcbiAgaWYgKHR5cGVvZiBudW0gPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCF2YWx1ZXMpXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignU3RyaW5nIGludCBvciBlbnVtIGdpdmVuLCBidXQgbm8gdmFsdWVzIG1hcCcpO1xuICAgIGlmICghdmFsdWVzLmhhc093blByb3BlcnR5KG51bSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdWYWx1ZXMgbWFwIGRvZXNuXFwndCBjb250YWluOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG51bSkpO1xuICAgIH1cbiAgICBudW0gPSB2YWx1ZXNbbnVtXTtcbiAgfVxuXG4gIC8vIEJpZ251bSwgYXNzdW1lIGJpZyBlbmRpYW5cbiAgaWYgKHR5cGVvZiBudW0gIT09ICdudW1iZXInICYmICFCdWZmZXIuaXNCdWZmZXIobnVtKSkge1xuICAgIGNvbnN0IG51bUFycmF5ID0gbnVtLnRvQXJyYXkoKTtcbiAgICBpZiAoIW51bS5zaWduICYmIG51bUFycmF5WzBdICYgMHg4MCkge1xuICAgICAgbnVtQXJyYXkudW5zaGlmdCgwKTtcbiAgICB9XG4gICAgbnVtID0gQnVmZmVyLmZyb20obnVtQXJyYXkpO1xuICB9XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihudW0pKSB7XG4gICAgbGV0IHNpemUgPSBudW0ubGVuZ3RoO1xuICAgIGlmIChudW0ubGVuZ3RoID09PSAwKVxuICAgICAgc2l6ZSsrO1xuXG4gICAgY29uc3Qgb3V0ID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICAgIG51bS5jb3B5KG91dCk7XG4gICAgaWYgKG51bS5sZW5ndGggPT09IDApXG4gICAgICBvdXRbMF0gPSAwO1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG91dCk7XG4gIH1cblxuICBpZiAobnVtIDwgMHg4MClcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihudW0pO1xuXG4gIGlmIChudW0gPCAweDEwMClcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbMCwgbnVtXSk7XG5cbiAgbGV0IHNpemUgPSAxO1xuICBmb3IgKGxldCBpID0gbnVtOyBpID49IDB4MTAwOyBpID4+PSA4KVxuICAgIHNpemUrKztcblxuICBjb25zdCBvdXQgPSBuZXcgQXJyYXkoc2l6ZSk7XG4gIGZvciAobGV0IGkgPSBvdXQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBvdXRbaV0gPSBudW0gJiAweGZmO1xuICAgIG51bSA+Pj0gODtcbiAgfVxuICBpZihvdXRbMF0gJiAweDgwKSB7XG4gICAgb3V0LnVuc2hpZnQoMCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihCdWZmZXIuZnJvbShvdXQpKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVCb29sID0gZnVuY3Rpb24gZW5jb2RlQm9vbCh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcih2YWx1ZSA/IDB4ZmYgOiAwKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl91c2UgPSBmdW5jdGlvbiB1c2UoZW50aXR5LCBvYmopIHtcbiAgaWYgKHR5cGVvZiBlbnRpdHkgPT09ICdmdW5jdGlvbicpXG4gICAgZW50aXR5ID0gZW50aXR5KG9iaik7XG4gIHJldHVybiBlbnRpdHkuX2dldEVuY29kZXIoJ2RlcicpLnRyZWU7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fc2tpcERlZmF1bHQgPSBmdW5jdGlvbiBza2lwRGVmYXVsdChkYXRhQnVmZmVyLCByZXBvcnRlciwgcGFyZW50KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBsZXQgaTtcbiAgaWYgKHN0YXRlWydkZWZhdWx0J10gPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGRhdGEgPSBkYXRhQnVmZmVyLmpvaW4oKTtcbiAgaWYgKHN0YXRlLmRlZmF1bHRCdWZmZXIgPT09IHVuZGVmaW5lZClcbiAgICBzdGF0ZS5kZWZhdWx0QnVmZmVyID0gdGhpcy5fZW5jb2RlVmFsdWUoc3RhdGVbJ2RlZmF1bHQnXSwgcmVwb3J0ZXIsIHBhcmVudCkuam9pbigpO1xuXG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gc3RhdGUuZGVmYXVsdEJ1ZmZlci5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGZvciAoaT0wOyBpIDwgZGF0YS5sZW5ndGg7IGkrKylcbiAgICBpZiAoZGF0YVtpXSAhPT0gc3RhdGUuZGVmYXVsdEJ1ZmZlcltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIFV0aWxpdHkgbWV0aG9kc1xuXG5mdW5jdGlvbiBlbmNvZGVUYWcodGFnLCBwcmltaXRpdmUsIGNscywgcmVwb3J0ZXIpIHtcbiAgbGV0IHJlcztcblxuICBpZiAodGFnID09PSAnc2Vxb2YnKVxuICAgIHRhZyA9ICdzZXEnO1xuICBlbHNlIGlmICh0YWcgPT09ICdzZXRvZicpXG4gICAgdGFnID0gJ3NldCc7XG5cbiAgaWYgKGRlci50YWdCeU5hbWUuaGFzT3duUHJvcGVydHkodGFnKSlcbiAgICByZXMgPSBkZXIudGFnQnlOYW1lW3RhZ107XG4gIGVsc2UgaWYgKHR5cGVvZiB0YWcgPT09ICdudW1iZXInICYmICh0YWcgfCAwKSA9PT0gdGFnKVxuICAgIHJlcyA9IHRhZztcbiAgZWxzZVxuICAgIHJldHVybiByZXBvcnRlci5lcnJvcignVW5rbm93biB0YWc6ICcgKyB0YWcpO1xuXG4gIGlmIChyZXMgPj0gMHgxZilcbiAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ011bHRpLW9jdGV0IHRhZyBlbmNvZGluZyB1bnN1cHBvcnRlZCcpO1xuXG4gIGlmICghcHJpbWl0aXZlKVxuICAgIHJlcyB8PSAweDIwO1xuXG4gIHJlcyB8PSAoZGVyLnRhZ0NsYXNzQnlOYW1lW2NscyB8fCAndW5pdmVyc2FsJ10gPDwgNik7XG5cbiAgcmV0dXJuIHJlcztcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmNvbnN0IERFUkVuY29kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuXG5mdW5jdGlvbiBQRU1FbmNvZGVyKGVudGl0eSkge1xuICBERVJFbmNvZGVyLmNhbGwodGhpcywgZW50aXR5KTtcbiAgdGhpcy5lbmMgPSAncGVtJztcbn1cbmluaGVyaXRzKFBFTUVuY29kZXIsIERFUkVuY29kZXIpO1xubW9kdWxlLmV4cG9ydHMgPSBQRU1FbmNvZGVyO1xuXG5QRU1FbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgb3B0aW9ucykge1xuICBjb25zdCBidWYgPSBERVJFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUuY2FsbCh0aGlzLCBkYXRhKTtcblxuICBjb25zdCBwID0gYnVmLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgY29uc3Qgb3V0ID0gWyAnLS0tLS1CRUdJTiAnICsgb3B0aW9ucy5sYWJlbCArICctLS0tLScgXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwLmxlbmd0aDsgaSArPSA2NClcbiAgICBvdXQucHVzaChwLnNsaWNlKGksIGkgKyA2NCkpO1xuICBvdXQucHVzaCgnLS0tLS1FTkQgJyArIG9wdGlvbnMubGFiZWwgKyAnLS0tLS0nKTtcbiAgcmV0dXJuIG91dC5qb2luKCdcXG4nKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZW5jb2RlcnMgPSBleHBvcnRzO1xuXG5lbmNvZGVycy5kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuZW5jb2RlcnMucGVtID0gcmVxdWlyZSgnLi9wZW0nKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmNvbnN0IGJpZ251bSA9IHJlcXVpcmUoJ2JuLmpzJyk7XG5jb25zdCBEZWNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi4vYmFzZS9idWZmZXInKS5EZWNvZGVyQnVmZmVyO1xuY29uc3QgTm9kZSA9IHJlcXVpcmUoJy4uL2Jhc2Uvbm9kZScpO1xuXG4vLyBJbXBvcnQgREVSIGNvbnN0YW50c1xuY29uc3QgZGVyID0gcmVxdWlyZSgnLi4vY29uc3RhbnRzL2RlcicpO1xuXG5mdW5jdGlvbiBERVJEZWNvZGVyKGVudGl0eSkge1xuICB0aGlzLmVuYyA9ICdkZXInO1xuICB0aGlzLm5hbWUgPSBlbnRpdHkubmFtZTtcbiAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG5cbiAgLy8gQ29uc3RydWN0IGJhc2UgdHJlZVxuICB0aGlzLnRyZWUgPSBuZXcgREVSTm9kZSgpO1xuICB0aGlzLnRyZWUuX2luaXQoZW50aXR5LmJvZHkpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBERVJEZWNvZGVyO1xuXG5ERVJEZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoZGF0YSwgb3B0aW9ucykge1xuICBpZiAoIURlY29kZXJCdWZmZXIuaXNEZWNvZGVyQnVmZmVyKGRhdGEpKSB7XG4gICAgZGF0YSA9IG5ldyBEZWNvZGVyQnVmZmVyKGRhdGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMudHJlZS5fZGVjb2RlKGRhdGEsIG9wdGlvbnMpO1xufTtcblxuLy8gVHJlZSBtZXRob2RzXG5cbmZ1bmN0aW9uIERFUk5vZGUocGFyZW50KSB7XG4gIE5vZGUuY2FsbCh0aGlzLCAnZGVyJywgcGFyZW50KTtcbn1cbmluaGVyaXRzKERFUk5vZGUsIE5vZGUpO1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fcGVla1RhZyA9IGZ1bmN0aW9uIHBlZWtUYWcoYnVmZmVyLCB0YWcsIGFueSkge1xuICBpZiAoYnVmZmVyLmlzRW1wdHkoKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3Qgc3RhdGUgPSBidWZmZXIuc2F2ZSgpO1xuICBjb25zdCBkZWNvZGVkVGFnID0gZGVyRGVjb2RlVGFnKGJ1ZmZlciwgJ0ZhaWxlZCB0byBwZWVrIHRhZzogXCInICsgdGFnICsgJ1wiJyk7XG4gIGlmIChidWZmZXIuaXNFcnJvcihkZWNvZGVkVGFnKSlcbiAgICByZXR1cm4gZGVjb2RlZFRhZztcblxuICBidWZmZXIucmVzdG9yZShzdGF0ZSk7XG5cbiAgcmV0dXJuIGRlY29kZWRUYWcudGFnID09PSB0YWcgfHwgZGVjb2RlZFRhZy50YWdTdHIgPT09IHRhZyB8fFxuICAgIChkZWNvZGVkVGFnLnRhZ1N0ciArICdvZicpID09PSB0YWcgfHwgYW55O1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVRhZyA9IGZ1bmN0aW9uIGRlY29kZVRhZyhidWZmZXIsIHRhZywgYW55KSB7XG4gIGNvbnN0IGRlY29kZWRUYWcgPSBkZXJEZWNvZGVUYWcoYnVmZmVyLFxuICAgICdGYWlsZWQgdG8gZGVjb2RlIHRhZyBvZiBcIicgKyB0YWcgKyAnXCInKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKGRlY29kZWRUYWcpKVxuICAgIHJldHVybiBkZWNvZGVkVGFnO1xuXG4gIGxldCBsZW4gPSBkZXJEZWNvZGVMZW4oYnVmZmVyLFxuICAgIGRlY29kZWRUYWcucHJpbWl0aXZlLFxuICAgICdGYWlsZWQgdG8gZ2V0IGxlbmd0aCBvZiBcIicgKyB0YWcgKyAnXCInKTtcblxuICAvLyBGYWlsdXJlXG4gIGlmIChidWZmZXIuaXNFcnJvcihsZW4pKVxuICAgIHJldHVybiBsZW47XG5cbiAgaWYgKCFhbnkgJiZcbiAgICAgIGRlY29kZWRUYWcudGFnICE9PSB0YWcgJiZcbiAgICAgIGRlY29kZWRUYWcudGFnU3RyICE9PSB0YWcgJiZcbiAgICAgIGRlY29kZWRUYWcudGFnU3RyICsgJ29mJyAhPT0gdGFnKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRmFpbGVkIHRvIG1hdGNoIHRhZzogXCInICsgdGFnICsgJ1wiJyk7XG4gIH1cblxuICBpZiAoZGVjb2RlZFRhZy5wcmltaXRpdmUgfHwgbGVuICE9PSBudWxsKVxuICAgIHJldHVybiBidWZmZXIuc2tpcChsZW4sICdGYWlsZWQgdG8gbWF0Y2ggYm9keSBvZjogXCInICsgdGFnICsgJ1wiJyk7XG5cbiAgLy8gSW5kZWZpbml0ZSBsZW5ndGguLi4gZmluZCBFTkQgdGFnXG4gIGNvbnN0IHN0YXRlID0gYnVmZmVyLnNhdmUoKTtcbiAgY29uc3QgcmVzID0gdGhpcy5fc2tpcFVudGlsRW5kKFxuICAgIGJ1ZmZlcixcbiAgICAnRmFpbGVkIHRvIHNraXAgaW5kZWZpbml0ZSBsZW5ndGggYm9keTogXCInICsgdGhpcy50YWcgKyAnXCInKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKHJlcykpXG4gICAgcmV0dXJuIHJlcztcblxuICBsZW4gPSBidWZmZXIub2Zmc2V0IC0gc3RhdGUub2Zmc2V0O1xuICBidWZmZXIucmVzdG9yZShzdGF0ZSk7XG4gIHJldHVybiBidWZmZXIuc2tpcChsZW4sICdGYWlsZWQgdG8gbWF0Y2ggYm9keSBvZjogXCInICsgdGFnICsgJ1wiJyk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fc2tpcFVudGlsRW5kID0gZnVuY3Rpb24gc2tpcFVudGlsRW5kKGJ1ZmZlciwgZmFpbCkge1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgdGFnID0gZGVyRGVjb2RlVGFnKGJ1ZmZlciwgZmFpbCk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHRhZykpXG4gICAgICByZXR1cm4gdGFnO1xuICAgIGNvbnN0IGxlbiA9IGRlckRlY29kZUxlbihidWZmZXIsIHRhZy5wcmltaXRpdmUsIGZhaWwpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcihsZW4pKVxuICAgICAgcmV0dXJuIGxlbjtcblxuICAgIGxldCByZXM7XG4gICAgaWYgKHRhZy5wcmltaXRpdmUgfHwgbGVuICE9PSBudWxsKVxuICAgICAgcmVzID0gYnVmZmVyLnNraXAobGVuKTtcbiAgICBlbHNlXG4gICAgICByZXMgPSB0aGlzLl9za2lwVW50aWxFbmQoYnVmZmVyLCBmYWlsKTtcblxuICAgIC8vIEZhaWx1cmVcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSlcbiAgICAgIHJldHVybiByZXM7XG5cbiAgICBpZiAodGFnLnRhZ1N0ciA9PT0gJ2VuZCcpXG4gICAgICBicmVhaztcbiAgfVxufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZUxpc3QgPSBmdW5jdGlvbiBkZWNvZGVMaXN0KGJ1ZmZlciwgdGFnLCBkZWNvZGVyLFxuICBvcHRpb25zKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICB3aGlsZSAoIWJ1ZmZlci5pc0VtcHR5KCkpIHtcbiAgICBjb25zdCBwb3NzaWJsZUVuZCA9IHRoaXMuX3BlZWtUYWcoYnVmZmVyLCAnZW5kJyk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHBvc3NpYmxlRW5kKSlcbiAgICAgIHJldHVybiBwb3NzaWJsZUVuZDtcblxuICAgIGNvbnN0IHJlcyA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlciwgJ2RlcicsIG9wdGlvbnMpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcihyZXMpICYmIHBvc3NpYmxlRW5kKVxuICAgICAgYnJlYWs7XG4gICAgcmVzdWx0LnB1c2gocmVzKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVN0ciA9IGZ1bmN0aW9uIGRlY29kZVN0cihidWZmZXIsIHRhZykge1xuICBpZiAodGFnID09PSAnYml0c3RyJykge1xuICAgIGNvbnN0IHVudXNlZCA9IGJ1ZmZlci5yZWFkVUludDgoKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IodW51c2VkKSlcbiAgICAgIHJldHVybiB1bnVzZWQ7XG4gICAgcmV0dXJuIHsgdW51c2VkOiB1bnVzZWQsIGRhdGE6IGJ1ZmZlci5yYXcoKSB9O1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ2JtcHN0cicpIHtcbiAgICBjb25zdCByYXcgPSBidWZmZXIucmF3KCk7XG4gICAgaWYgKHJhdy5sZW5ndGggJSAyID09PSAxKVxuICAgICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IGJtcHN0ciBsZW5ndGggbWlzbWF0Y2gnKTtcblxuICAgIGxldCBzdHIgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhdy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHJhdy5yZWFkVUludDE2QkUoaSAqIDIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdudW1zdHInKSB7XG4gICAgY29uc3QgbnVtc3RyID0gYnVmZmVyLnJhdygpLnRvU3RyaW5nKCdhc2NpaScpO1xuICAgIGlmICghdGhpcy5faXNOdW1zdHIobnVtc3RyKSkge1xuICAgICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnbnVtc3RyIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMnKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bXN0cjtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdvY3RzdHInKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5yYXcoKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdvYmpEZXNjJykge1xuICAgIHJldHVybiBidWZmZXIucmF3KCk7XG4gIH0gZWxzZSBpZiAodGFnID09PSAncHJpbnRzdHInKSB7XG4gICAgY29uc3QgcHJpbnRzdHIgPSBidWZmZXIucmF3KCkudG9TdHJpbmcoJ2FzY2lpJyk7XG4gICAgaWYgKCF0aGlzLl9pc1ByaW50c3RyKHByaW50c3RyKSkge1xuICAgICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAncHJpbnRzdHIgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgICByZXR1cm4gcHJpbnRzdHI7XG4gIH0gZWxzZSBpZiAoL3N0ciQvLnRlc3QodGFnKSkge1xuICAgIHJldHVybiBidWZmZXIucmF3KCkudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArIHRhZyArICcgdW5zdXBwb3J0ZWQnKTtcbiAgfVxufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZU9iamlkID0gZnVuY3Rpb24gZGVjb2RlT2JqaWQoYnVmZmVyLCB2YWx1ZXMsIHJlbGF0aXZlKSB7XG4gIGxldCByZXN1bHQ7XG4gIGNvbnN0IGlkZW50aWZpZXJzID0gW107XG4gIGxldCBpZGVudCA9IDA7XG4gIGxldCBzdWJpZGVudCA9IDA7XG4gIHdoaWxlICghYnVmZmVyLmlzRW1wdHkoKSkge1xuICAgIHN1YmlkZW50ID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICAgIGlkZW50IDw8PSA3O1xuICAgIGlkZW50IHw9IHN1YmlkZW50ICYgMHg3ZjtcbiAgICBpZiAoKHN1YmlkZW50ICYgMHg4MCkgPT09IDApIHtcbiAgICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnQpO1xuICAgICAgaWRlbnQgPSAwO1xuICAgIH1cbiAgfVxuICBpZiAoc3ViaWRlbnQgJiAweDgwKVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnQpO1xuXG4gIGNvbnN0IGZpcnN0ID0gKGlkZW50aWZpZXJzWzBdIC8gNDApIHwgMDtcbiAgY29uc3Qgc2Vjb25kID0gaWRlbnRpZmllcnNbMF0gJSA0MDtcblxuICBpZiAocmVsYXRpdmUpXG4gICAgcmVzdWx0ID0gaWRlbnRpZmllcnM7XG4gIGVsc2VcbiAgICByZXN1bHQgPSBbZmlyc3QsIHNlY29uZF0uY29uY2F0KGlkZW50aWZpZXJzLnNsaWNlKDEpKTtcblxuICBpZiAodmFsdWVzKSB7XG4gICAgbGV0IHRtcCA9IHZhbHVlc1tyZXN1bHQuam9pbignICcpXTtcbiAgICBpZiAodG1wID09PSB1bmRlZmluZWQpXG4gICAgICB0bXAgPSB2YWx1ZXNbcmVzdWx0LmpvaW4oJy4nKV07XG4gICAgaWYgKHRtcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmVzdWx0ID0gdG1wO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVUaW1lID0gZnVuY3Rpb24gZGVjb2RlVGltZShidWZmZXIsIHRhZykge1xuICBjb25zdCBzdHIgPSBidWZmZXIucmF3KCkudG9TdHJpbmcoKTtcblxuICBsZXQgeWVhcjtcbiAgbGV0IG1vbjtcbiAgbGV0IGRheTtcbiAgbGV0IGhvdXI7XG4gIGxldCBtaW47XG4gIGxldCBzZWM7XG4gIGlmICh0YWcgPT09ICdnZW50aW1lJykge1xuICAgIHllYXIgPSBzdHIuc2xpY2UoMCwgNCkgfCAwO1xuICAgIG1vbiA9IHN0ci5zbGljZSg0LCA2KSB8IDA7XG4gICAgZGF5ID0gc3RyLnNsaWNlKDYsIDgpIHwgMDtcbiAgICBob3VyID0gc3RyLnNsaWNlKDgsIDEwKSB8IDA7XG4gICAgbWluID0gc3RyLnNsaWNlKDEwLCAxMikgfCAwO1xuICAgIHNlYyA9IHN0ci5zbGljZSgxMiwgMTQpIHwgMDtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICd1dGN0aW1lJykge1xuICAgIHllYXIgPSBzdHIuc2xpY2UoMCwgMikgfCAwO1xuICAgIG1vbiA9IHN0ci5zbGljZSgyLCA0KSB8IDA7XG4gICAgZGF5ID0gc3RyLnNsaWNlKDQsIDYpIHwgMDtcbiAgICBob3VyID0gc3RyLnNsaWNlKDYsIDgpIHwgMDtcbiAgICBtaW4gPSBzdHIuc2xpY2UoOCwgMTApIHwgMDtcbiAgICBzZWMgPSBzdHIuc2xpY2UoMTAsIDEyKSB8IDA7XG4gICAgaWYgKHllYXIgPCA3MClcbiAgICAgIHllYXIgPSAyMDAwICsgeWVhcjtcbiAgICBlbHNlXG4gICAgICB5ZWFyID0gMTkwMCArIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2RpbmcgJyArIHRhZyArICcgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCcpO1xuICB9XG5cbiAgcmV0dXJuIERhdGUuVVRDKHllYXIsIG1vbiAtIDEsIGRheSwgaG91ciwgbWluLCBzZWMsIDApO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZU51bGwgPSBmdW5jdGlvbiBkZWNvZGVOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVCb29sID0gZnVuY3Rpb24gZGVjb2RlQm9vbChidWZmZXIpIHtcbiAgY29uc3QgcmVzID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSlcbiAgICByZXR1cm4gcmVzO1xuICBlbHNlXG4gICAgcmV0dXJuIHJlcyAhPT0gMDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVJbnQgPSBmdW5jdGlvbiBkZWNvZGVJbnQoYnVmZmVyLCB2YWx1ZXMpIHtcbiAgLy8gQmlnaW50LCByZXR1cm4gYXMgaXQgaXMgKGFzc3VtZSBiaWcgZW5kaWFuKVxuICBjb25zdCByYXcgPSBidWZmZXIucmF3KCk7XG4gIGxldCByZXMgPSBuZXcgYmlnbnVtKHJhdyk7XG5cbiAgaWYgKHZhbHVlcylcbiAgICByZXMgPSB2YWx1ZXNbcmVzLnRvU3RyaW5nKDEwKV0gfHwgcmVzO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fdXNlID0gZnVuY3Rpb24gdXNlKGVudGl0eSwgb2JqKSB7XG4gIGlmICh0eXBlb2YgZW50aXR5ID09PSAnZnVuY3Rpb24nKVxuICAgIGVudGl0eSA9IGVudGl0eShvYmopO1xuICByZXR1cm4gZW50aXR5Ll9nZXREZWNvZGVyKCdkZXInKS50cmVlO1xufTtcblxuLy8gVXRpbGl0eSBtZXRob2RzXG5cbmZ1bmN0aW9uIGRlckRlY29kZVRhZyhidWYsIGZhaWwpIHtcbiAgbGV0IHRhZyA9IGJ1Zi5yZWFkVUludDgoZmFpbCk7XG4gIGlmIChidWYuaXNFcnJvcih0YWcpKVxuICAgIHJldHVybiB0YWc7XG5cbiAgY29uc3QgY2xzID0gZGVyLnRhZ0NsYXNzW3RhZyA+PiA2XTtcbiAgY29uc3QgcHJpbWl0aXZlID0gKHRhZyAmIDB4MjApID09PSAwO1xuXG4gIC8vIE11bHRpLW9jdGV0IHRhZyAtIGxvYWRcbiAgaWYgKCh0YWcgJiAweDFmKSA9PT0gMHgxZikge1xuICAgIGxldCBvY3QgPSB0YWc7XG4gICAgdGFnID0gMDtcbiAgICB3aGlsZSAoKG9jdCAmIDB4ODApID09PSAweDgwKSB7XG4gICAgICBvY3QgPSBidWYucmVhZFVJbnQ4KGZhaWwpO1xuICAgICAgaWYgKGJ1Zi5pc0Vycm9yKG9jdCkpXG4gICAgICAgIHJldHVybiBvY3Q7XG5cbiAgICAgIHRhZyA8PD0gNztcbiAgICAgIHRhZyB8PSBvY3QgJiAweDdmO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0YWcgJj0gMHgxZjtcbiAgfVxuICBjb25zdCB0YWdTdHIgPSBkZXIudGFnW3RhZ107XG5cbiAgcmV0dXJuIHtcbiAgICBjbHM6IGNscyxcbiAgICBwcmltaXRpdmU6IHByaW1pdGl2ZSxcbiAgICB0YWc6IHRhZyxcbiAgICB0YWdTdHI6IHRhZ1N0clxuICB9O1xufVxuXG5mdW5jdGlvbiBkZXJEZWNvZGVMZW4oYnVmLCBwcmltaXRpdmUsIGZhaWwpIHtcbiAgbGV0IGxlbiA9IGJ1Zi5yZWFkVUludDgoZmFpbCk7XG4gIGlmIChidWYuaXNFcnJvcihsZW4pKVxuICAgIHJldHVybiBsZW47XG5cbiAgLy8gSW5kZWZpbml0ZSBmb3JtXG4gIGlmICghcHJpbWl0aXZlICYmIGxlbiA9PT0gMHg4MClcbiAgICByZXR1cm4gbnVsbDtcblxuICAvLyBEZWZpbml0ZSBmb3JtXG4gIGlmICgobGVuICYgMHg4MCkgPT09IDApIHtcbiAgICAvLyBTaG9ydCBmb3JtXG4gICAgcmV0dXJuIGxlbjtcbiAgfVxuXG4gIC8vIExvbmcgZm9ybVxuICBjb25zdCBudW0gPSBsZW4gJiAweDdmO1xuICBpZiAobnVtID4gNClcbiAgICByZXR1cm4gYnVmLmVycm9yKCdsZW5ndGggb2N0ZWN0IGlzIHRvbyBsb25nJyk7XG5cbiAgbGVuID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW07IGkrKykge1xuICAgIGxlbiA8PD0gODtcbiAgICBjb25zdCBqID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgICBpZiAoYnVmLmlzRXJyb3IoaikpXG4gICAgICByZXR1cm4gajtcbiAgICBsZW4gfD0gajtcbiAgfVxuXG4gIHJldHVybiBsZW47XG59XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xuXG5jb25zdCBERVJEZWNvZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcblxuZnVuY3Rpb24gUEVNRGVjb2RlcihlbnRpdHkpIHtcbiAgREVSRGVjb2Rlci5jYWxsKHRoaXMsIGVudGl0eSk7XG4gIHRoaXMuZW5jID0gJ3BlbSc7XG59XG5pbmhlcml0cyhQRU1EZWNvZGVyLCBERVJEZWNvZGVyKTtcbm1vZHVsZS5leHBvcnRzID0gUEVNRGVjb2RlcjtcblxuUEVNRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGRhdGEsIG9wdGlvbnMpIHtcbiAgY29uc3QgbGluZXMgPSBkYXRhLnRvU3RyaW5nKCkuc3BsaXQoL1tcXHJcXG5dKy9nKTtcblxuICBjb25zdCBsYWJlbCA9IG9wdGlvbnMubGFiZWwudG9VcHBlckNhc2UoKTtcblxuICBjb25zdCByZSA9IC9eLS0tLS0oQkVHSU58RU5EKSAoW14tXSspLS0tLS0kLztcbiAgbGV0IHN0YXJ0ID0gLTE7XG4gIGxldCBlbmQgPSAtMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG1hdGNoID0gbGluZXNbaV0ubWF0Y2gocmUpO1xuICAgIGlmIChtYXRjaCA9PT0gbnVsbClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgaWYgKG1hdGNoWzJdICE9PSBsYWJlbClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgaWYgKHN0YXJ0ID09PSAtMSkge1xuICAgICAgaWYgKG1hdGNoWzFdICE9PSAnQkVHSU4nKVxuICAgICAgICBicmVhaztcbiAgICAgIHN0YXJ0ID0gaTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1hdGNoWzFdICE9PSAnRU5EJylcbiAgICAgICAgYnJlYWs7XG4gICAgICBlbmQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChzdGFydCA9PT0gLTEgfHwgZW5kID09PSAtMSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BFTSBzZWN0aW9uIG5vdCBmb3VuZCBmb3I6ICcgKyBsYWJlbCk7XG5cbiAgY29uc3QgYmFzZTY0ID0gbGluZXMuc2xpY2Uoc3RhcnQgKyAxLCBlbmQpLmpvaW4oJycpO1xuICAvLyBSZW1vdmUgZXhjZXNzaXZlIHN5bWJvbHNcbiAgYmFzZTY0LnJlcGxhY2UoL1teYS16MC05Ky89XSsvZ2ksICcnKTtcblxuICBjb25zdCBpbnB1dCA9IEJ1ZmZlci5mcm9tKGJhc2U2NCwgJ2Jhc2U2NCcpO1xuICByZXR1cm4gREVSRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlLmNhbGwodGhpcywgaW5wdXQsIG9wdGlvbnMpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBkZWNvZGVycyA9IGV4cG9ydHM7XG5cbmRlY29kZXJzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5kZWNvZGVycy5wZW0gPSByZXF1aXJlKCcuL3BlbScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGVuY29kZXJzID0gcmVxdWlyZSgnLi9lbmNvZGVycycpO1xuY29uc3QgZGVjb2RlcnMgPSByZXF1aXJlKCcuL2RlY29kZXJzJyk7XG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmNvbnN0IGFwaSA9IGV4cG9ydHM7XG5cbmFwaS5kZWZpbmUgPSBmdW5jdGlvbiBkZWZpbmUobmFtZSwgYm9keSkge1xuICByZXR1cm4gbmV3IEVudGl0eShuYW1lLCBib2R5KTtcbn07XG5cbmZ1bmN0aW9uIEVudGl0eShuYW1lLCBib2R5KSB7XG4gIHRoaXMubmFtZSA9IG5hbWU7XG4gIHRoaXMuYm9keSA9IGJvZHk7XG5cbiAgdGhpcy5kZWNvZGVycyA9IHt9O1xuICB0aGlzLmVuY29kZXJzID0ge307XG59XG5cbkVudGl0eS5wcm90b3R5cGUuX2NyZWF0ZU5hbWVkID0gZnVuY3Rpb24gY3JlYXRlTmFtZWQoQmFzZSkge1xuICBjb25zdCBuYW1lID0gdGhpcy5uYW1lO1xuXG4gIGZ1bmN0aW9uIEdlbmVyYXRlZChlbnRpdHkpIHtcbiAgICB0aGlzLl9pbml0TmFtZWQoZW50aXR5LCBuYW1lKTtcbiAgfVxuICBpbmhlcml0cyhHZW5lcmF0ZWQsIEJhc2UpO1xuICBHZW5lcmF0ZWQucHJvdG90eXBlLl9pbml0TmFtZWQgPSBmdW5jdGlvbiBfaW5pdE5hbWVkKGVudGl0eSwgbmFtZSkge1xuICAgIEJhc2UuY2FsbCh0aGlzLCBlbnRpdHksIG5hbWUpO1xuICB9O1xuXG4gIHJldHVybiBuZXcgR2VuZXJhdGVkKHRoaXMpO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5fZ2V0RGVjb2RlciA9IGZ1bmN0aW9uIF9nZXREZWNvZGVyKGVuYykge1xuICBlbmMgPSBlbmMgfHwgJ2Rlcic7XG4gIC8vIExhemlseSBjcmVhdGUgZGVjb2RlclxuICBpZiAoIXRoaXMuZGVjb2RlcnMuaGFzT3duUHJvcGVydHkoZW5jKSlcbiAgICB0aGlzLmRlY29kZXJzW2VuY10gPSB0aGlzLl9jcmVhdGVOYW1lZChkZWNvZGVyc1tlbmNdKTtcbiAgcmV0dXJuIHRoaXMuZGVjb2RlcnNbZW5jXTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGRhdGEsIGVuYywgb3B0aW9ucykge1xuICByZXR1cm4gdGhpcy5fZ2V0RGVjb2RlcihlbmMpLmRlY29kZShkYXRhLCBvcHRpb25zKTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuX2dldEVuY29kZXIgPSBmdW5jdGlvbiBfZ2V0RW5jb2RlcihlbmMpIHtcbiAgZW5jID0gZW5jIHx8ICdkZXInO1xuICAvLyBMYXppbHkgY3JlYXRlIGVuY29kZXJcbiAgaWYgKCF0aGlzLmVuY29kZXJzLmhhc093blByb3BlcnR5KGVuYykpXG4gICAgdGhpcy5lbmNvZGVyc1tlbmNdID0gdGhpcy5fY3JlYXRlTmFtZWQoZW5jb2RlcnNbZW5jXSk7XG4gIHJldHVybiB0aGlzLmVuY29kZXJzW2VuY107XG59O1xuXG5FbnRpdHkucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCBlbmMsIC8qIGludGVybmFsICovIHJlcG9ydGVyKSB7XG4gIHJldHVybiB0aGlzLl9nZXRFbmNvZGVyKGVuYykuZW5jb2RlKGRhdGEsIHJlcG9ydGVyKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYmFzZSA9IGV4cG9ydHM7XG5cbmJhc2UuUmVwb3J0ZXIgPSByZXF1aXJlKCcuL3JlcG9ydGVyJykuUmVwb3J0ZXI7XG5iYXNlLkRlY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpLkRlY29kZXJCdWZmZXI7XG5iYXNlLkVuY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpLkVuY29kZXJCdWZmZXI7XG5iYXNlLk5vZGUgPSByZXF1aXJlKCcuL25vZGUnKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjb25zdGFudHMgPSBleHBvcnRzO1xuXG4vLyBIZWxwZXJcbmNvbnN0YW50cy5fcmV2ZXJzZSA9IGZ1bmN0aW9uIHJldmVyc2UobWFwKSB7XG4gIGNvbnN0IHJlcyA9IHt9O1xuXG4gIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAvLyBDb252ZXJ0IGtleSB0byBpbnRlZ2VyIGlmIGl0IGlzIHN0cmluZ2lmaWVkXG4gICAgaWYgKChrZXkgfCAwKSA9PSBrZXkpXG4gICAgICBrZXkgPSBrZXkgfCAwO1xuXG4gICAgY29uc3QgdmFsdWUgPSBtYXBba2V5XTtcbiAgICByZXNbdmFsdWVdID0ga2V5O1xuICB9KTtcblxuICByZXR1cm4gcmVzO1xufTtcblxuY29uc3RhbnRzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYXNuMSA9IGV4cG9ydHM7XG5cbmFzbjEuYmlnbnVtID0gcmVxdWlyZSgnYm4uanMnKTtcblxuYXNuMS5kZWZpbmUgPSByZXF1aXJlKCcuL2FzbjEvYXBpJykuZGVmaW5lO1xuYXNuMS5iYXNlID0gcmVxdWlyZSgnLi9hc24xL2Jhc2UnKTtcbmFzbjEuY29uc3RhbnRzID0gcmVxdWlyZSgnLi9hc24xL2NvbnN0YW50cycpO1xuYXNuMS5kZWNvZGVycyA9IHJlcXVpcmUoJy4vYXNuMS9kZWNvZGVycycpO1xuYXNuMS5lbmNvZGVycyA9IHJlcXVpcmUoJy4vYXNuMS9lbmNvZGVycycpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IGV4cG9ydHM7XG5cbmZ1bmN0aW9uIHRvQXJyYXkobXNnLCBlbmMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobXNnKSlcbiAgICByZXR1cm4gbXNnLnNsaWNlKCk7XG4gIGlmICghbXNnKVxuICAgIHJldHVybiBbXTtcbiAgdmFyIHJlcyA9IFtdO1xuICBpZiAodHlwZW9mIG1zZyAhPT0gJ3N0cmluZycpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICAgIHJlc1tpXSA9IG1zZ1tpXSB8IDA7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZiAoZW5jID09PSAnaGV4Jykge1xuICAgIG1zZyA9IG1zZy5yZXBsYWNlKC9bXmEtejAtOV0rL2lnLCAnJyk7XG4gICAgaWYgKG1zZy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgbXNnID0gJzAnICsgbXNnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAyKVxuICAgICAgcmVzLnB1c2gocGFyc2VJbnQobXNnW2ldICsgbXNnW2kgKyAxXSwgMTYpKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICAgIHZhciBoaSA9IGMgPj4gODtcbiAgICAgIHZhciBsbyA9IGMgJiAweGZmO1xuICAgICAgaWYgKGhpKVxuICAgICAgICByZXMucHVzaChoaSwgbG8pO1xuICAgICAgZWxzZVxuICAgICAgICByZXMucHVzaChsbyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG51dGlscy50b0FycmF5ID0gdG9BcnJheTtcblxuZnVuY3Rpb24gemVybzIod29yZCkge1xuICBpZiAod29yZC5sZW5ndGggPT09IDEpXG4gICAgcmV0dXJuICcwJyArIHdvcmQ7XG4gIGVsc2VcbiAgICByZXR1cm4gd29yZDtcbn1cbnV0aWxzLnplcm8yID0gemVybzI7XG5cbmZ1bmN0aW9uIHRvSGV4KG1zZykge1xuICB2YXIgcmVzID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgIHJlcyArPSB6ZXJvMihtc2dbaV0udG9TdHJpbmcoMTYpKTtcbiAgcmV0dXJuIHJlcztcbn1cbnV0aWxzLnRvSGV4ID0gdG9IZXg7XG5cbnV0aWxzLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShhcnIsIGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdG9IZXgoYXJyKTtcbiAgZWxzZVxuICAgIHJldHVybiBhcnI7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IGV4cG9ydHM7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIG1pbkFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcbnZhciBtaW5VdGlscyA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1jcnlwdG8tdXRpbHMnKTtcblxudXRpbHMuYXNzZXJ0ID0gbWluQXNzZXJ0O1xudXRpbHMudG9BcnJheSA9IG1pblV0aWxzLnRvQXJyYXk7XG51dGlscy56ZXJvMiA9IG1pblV0aWxzLnplcm8yO1xudXRpbHMudG9IZXggPSBtaW5VdGlscy50b0hleDtcbnV0aWxzLmVuY29kZSA9IG1pblV0aWxzLmVuY29kZTtcblxuLy8gUmVwcmVzZW50IG51bSBpbiBhIHctTkFGIGZvcm1cbmZ1bmN0aW9uIGdldE5BRihudW0sIHcsIGJpdHMpIHtcbiAgdmFyIG5hZiA9IG5ldyBBcnJheShNYXRoLm1heChudW0uYml0TGVuZ3RoKCksIGJpdHMpICsgMSk7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgbmFmLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbmFmW2ldID0gMDtcbiAgfVxuXG4gIHZhciB3cyA9IDEgPDwgKHcgKyAxKTtcbiAgdmFyIGsgPSBudW0uY2xvbmUoKTtcblxuICBmb3IgKGkgPSAwOyBpIDwgbmFmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHo7XG4gICAgdmFyIG1vZCA9IGsuYW5kbG4od3MgLSAxKTtcbiAgICBpZiAoay5pc09kZCgpKSB7XG4gICAgICBpZiAobW9kID4gKHdzID4+IDEpIC0gMSlcbiAgICAgICAgeiA9ICh3cyA+PiAxKSAtIG1vZDtcbiAgICAgIGVsc2VcbiAgICAgICAgeiA9IG1vZDtcbiAgICAgIGsuaXN1Ym4oeik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHogPSAwO1xuICAgIH1cblxuICAgIG5hZltpXSA9IHo7XG4gICAgay5pdXNocm4oMSk7XG4gIH1cblxuICByZXR1cm4gbmFmO1xufVxudXRpbHMuZ2V0TkFGID0gZ2V0TkFGO1xuXG4vLyBSZXByZXNlbnQgazEsIGsyIGluIGEgSm9pbnQgU3BhcnNlIEZvcm1cbmZ1bmN0aW9uIGdldEpTRihrMSwgazIpIHtcbiAgdmFyIGpzZiA9IFtcbiAgICBbXSxcbiAgICBbXSxcbiAgXTtcblxuICBrMSA9IGsxLmNsb25lKCk7XG4gIGsyID0gazIuY2xvbmUoKTtcbiAgdmFyIGQxID0gMDtcbiAgdmFyIGQyID0gMDtcbiAgdmFyIG04O1xuICB3aGlsZSAoazEuY21wbigtZDEpID4gMCB8fCBrMi5jbXBuKC1kMikgPiAwKSB7XG4gICAgLy8gRmlyc3QgcGhhc2VcbiAgICB2YXIgbTE0ID0gKGsxLmFuZGxuKDMpICsgZDEpICYgMztcbiAgICB2YXIgbTI0ID0gKGsyLmFuZGxuKDMpICsgZDIpICYgMztcbiAgICBpZiAobTE0ID09PSAzKVxuICAgICAgbTE0ID0gLTE7XG4gICAgaWYgKG0yNCA9PT0gMylcbiAgICAgIG0yNCA9IC0xO1xuICAgIHZhciB1MTtcbiAgICBpZiAoKG0xNCAmIDEpID09PSAwKSB7XG4gICAgICB1MSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG04ID0gKGsxLmFuZGxuKDcpICsgZDEpICYgNztcbiAgICAgIGlmICgobTggPT09IDMgfHwgbTggPT09IDUpICYmIG0yNCA9PT0gMilcbiAgICAgICAgdTEgPSAtbTE0O1xuICAgICAgZWxzZVxuICAgICAgICB1MSA9IG0xNDtcbiAgICB9XG4gICAganNmWzBdLnB1c2godTEpO1xuXG4gICAgdmFyIHUyO1xuICAgIGlmICgobTI0ICYgMSkgPT09IDApIHtcbiAgICAgIHUyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgbTggPSAoazIuYW5kbG4oNykgKyBkMikgJiA3O1xuICAgICAgaWYgKChtOCA9PT0gMyB8fCBtOCA9PT0gNSkgJiYgbTE0ID09PSAyKVxuICAgICAgICB1MiA9IC1tMjQ7XG4gICAgICBlbHNlXG4gICAgICAgIHUyID0gbTI0O1xuICAgIH1cbiAgICBqc2ZbMV0ucHVzaCh1Mik7XG5cbiAgICAvLyBTZWNvbmQgcGhhc2VcbiAgICBpZiAoMiAqIGQxID09PSB1MSArIDEpXG4gICAgICBkMSA9IDEgLSBkMTtcbiAgICBpZiAoMiAqIGQyID09PSB1MiArIDEpXG4gICAgICBkMiA9IDEgLSBkMjtcbiAgICBrMS5pdXNocm4oMSk7XG4gICAgazIuaXVzaHJuKDEpO1xuICB9XG5cbiAgcmV0dXJuIGpzZjtcbn1cbnV0aWxzLmdldEpTRiA9IGdldEpTRjtcblxuZnVuY3Rpb24gY2FjaGVkUHJvcGVydHkob2JqLCBuYW1lLCBjb21wdXRlcikge1xuICB2YXIga2V5ID0gJ18nICsgbmFtZTtcbiAgb2JqLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIGNhY2hlZFByb3BlcnR5KCkge1xuICAgIHJldHVybiB0aGlzW2tleV0gIT09IHVuZGVmaW5lZCA/IHRoaXNba2V5XSA6XG4gICAgICB0aGlzW2tleV0gPSBjb21wdXRlci5jYWxsKHRoaXMpO1xuICB9O1xufVxudXRpbHMuY2FjaGVkUHJvcGVydHkgPSBjYWNoZWRQcm9wZXJ0eTtcblxuZnVuY3Rpb24gcGFyc2VCeXRlcyhieXRlcykge1xuICByZXR1cm4gdHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJyA/IHV0aWxzLnRvQXJyYXkoYnl0ZXMsICdoZXgnKSA6XG4gICAgYnl0ZXM7XG59XG51dGlscy5wYXJzZUJ5dGVzID0gcGFyc2VCeXRlcztcblxuZnVuY3Rpb24gaW50RnJvbUxFKGJ5dGVzKSB7XG4gIHJldHVybiBuZXcgQk4oYnl0ZXMsICdoZXgnLCAnbGUnKTtcbn1cbnV0aWxzLmludEZyb21MRSA9IGludEZyb21MRTtcblxuIiwKICAgICJ2YXIgcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByYW5kKGxlbikge1xuICBpZiAoIXIpXG4gICAgciA9IG5ldyBSYW5kKG51bGwpO1xuXG4gIHJldHVybiByLmdlbmVyYXRlKGxlbik7XG59O1xuXG5mdW5jdGlvbiBSYW5kKHJhbmQpIHtcbiAgdGhpcy5yYW5kID0gcmFuZDtcbn1cbm1vZHVsZS5leHBvcnRzLlJhbmQgPSBSYW5kO1xuXG5SYW5kLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uIGdlbmVyYXRlKGxlbikge1xuICByZXR1cm4gdGhpcy5fcmFuZChsZW4pO1xufTtcblxuLy8gRW11bGF0ZSBjcnlwdG8gQVBJIHVzaW5nIHJhbmR5XG5SYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgaWYgKHRoaXMucmFuZC5nZXRCeXRlcylcbiAgICByZXR1cm4gdGhpcy5yYW5kLmdldEJ5dGVzKG4pO1xuXG4gIHZhciByZXMgPSBuZXcgVWludDhBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspXG4gICAgcmVzW2ldID0gdGhpcy5yYW5kLmdldEJ5dGUoKTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbmlmICh0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcpIHtcbiAgaWYgKHNlbGYuY3J5cHRvICYmIHNlbGYuY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIE1vZGVybiBicm93c2Vyc1xuICAgIFJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICAgICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xuICAgICAgc2VsZi5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH07XG4gIH0gZWxzZSBpZiAoc2VsZi5tc0NyeXB0byAmJiBzZWxmLm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIElFXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbiBfcmFuZChuKSB7XG4gICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICBzZWxmLm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnIpO1xuICAgICAgcmV0dXJuIGFycjtcbiAgICB9O1xuXG4gIC8vIFNhZmFyaSdzIFdlYldvcmtlcnMgZG8gbm90IGhhdmUgYGNyeXB0b2BcbiAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0Jykge1xuICAgIC8vIE9sZCBqdW5rXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkIHlldCcpO1xuICAgIH07XG4gIH1cbn0gZWxzZSB7XG4gIC8vIE5vZGUuanMgb3IgV2ViIHdvcmtlciB3aXRoIG5vIGNyeXB0byBzdXBwb3J0XG4gIHRyeSB7XG4gICAgdmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuICAgIGlmICh0eXBlb2YgY3J5cHRvLnJhbmRvbUJ5dGVzICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkJyk7XG5cbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tQnl0ZXMobik7XG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICB9XG59XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgZ2V0TkFGID0gdXRpbHMuZ2V0TkFGO1xudmFyIGdldEpTRiA9IHV0aWxzLmdldEpTRjtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEJhc2VDdXJ2ZSh0eXBlLCBjb25mKSB7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMucCA9IG5ldyBCTihjb25mLnAsIDE2KTtcblxuICAvLyBVc2UgTW9udGdvbWVyeSwgd2hlbiB0aGVyZSBpcyBubyBmYXN0IHJlZHVjdGlvbiBmb3IgdGhlIHByaW1lXG4gIHRoaXMucmVkID0gY29uZi5wcmltZSA/IEJOLnJlZChjb25mLnByaW1lKSA6IEJOLm1vbnQodGhpcy5wKTtcblxuICAvLyBVc2VmdWwgZm9yIG1hbnkgY3VydmVzXG4gIHRoaXMuemVybyA9IG5ldyBCTigwKS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMub25lID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy50d28gPSBuZXcgQk4oMikudG9SZWQodGhpcy5yZWQpO1xuXG4gIC8vIEN1cnZlIGNvbmZpZ3VyYXRpb24sIG9wdGlvbmFsXG4gIHRoaXMubiA9IGNvbmYubiAmJiBuZXcgQk4oY29uZi5uLCAxNik7XG4gIHRoaXMuZyA9IGNvbmYuZyAmJiB0aGlzLnBvaW50RnJvbUpTT04oY29uZi5nLCBjb25mLmdSZWQpO1xuXG4gIC8vIFRlbXBvcmFyeSBhcnJheXNcbiAgdGhpcy5fd25hZlQxID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl93bmFmVDIgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX3duYWZUMyA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fd25hZlQ0ID0gbmV3IEFycmF5KDQpO1xuXG4gIHRoaXMuX2JpdExlbmd0aCA9IHRoaXMubiA/IHRoaXMubi5iaXRMZW5ndGgoKSA6IDA7XG5cbiAgLy8gR2VuZXJhbGl6ZWQgR3JlZyBNYXh3ZWxsJ3MgdHJpY2tcbiAgdmFyIGFkanVzdENvdW50ID0gdGhpcy5uICYmIHRoaXMucC5kaXYodGhpcy5uKTtcbiAgaWYgKCFhZGp1c3RDb3VudCB8fCBhZGp1c3RDb3VudC5jbXBuKDEwMCkgPiAwKSB7XG4gICAgdGhpcy5yZWROID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9tYXh3ZWxsVHJpY2sgPSB0cnVlO1xuICAgIHRoaXMucmVkTiA9IHRoaXMubi50b1JlZCh0aGlzLnJlZCk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gQmFzZUN1cnZlO1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl9maXhlZE5hZk11bCA9IGZ1bmN0aW9uIF9maXhlZE5hZk11bChwLCBrKSB7XG4gIGFzc2VydChwLnByZWNvbXB1dGVkKTtcbiAgdmFyIGRvdWJsZXMgPSBwLl9nZXREb3VibGVzKCk7XG5cbiAgdmFyIG5hZiA9IGdldE5BRihrLCAxLCB0aGlzLl9iaXRMZW5ndGgpO1xuICB2YXIgSSA9ICgxIDw8IChkb3VibGVzLnN0ZXAgKyAxKSkgLSAoZG91Ymxlcy5zdGVwICUgMiA9PT0gMCA/IDIgOiAxKTtcbiAgSSAvPSAzO1xuXG4gIC8vIFRyYW5zbGF0ZSBpbnRvIG1vcmUgd2luZG93ZWQgZm9ybVxuICB2YXIgcmVwciA9IFtdO1xuICB2YXIgajtcbiAgdmFyIG5hZlc7XG4gIGZvciAoaiA9IDA7IGogPCBuYWYubGVuZ3RoOyBqICs9IGRvdWJsZXMuc3RlcCkge1xuICAgIG5hZlcgPSAwO1xuICAgIGZvciAodmFyIGwgPSBqICsgZG91Ymxlcy5zdGVwIC0gMTsgbCA+PSBqOyBsLS0pXG4gICAgICBuYWZXID0gKG5hZlcgPDwgMSkgKyBuYWZbbF07XG4gICAgcmVwci5wdXNoKG5hZlcpO1xuICB9XG5cbiAgdmFyIGEgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgdmFyIGIgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgZm9yICh2YXIgaSA9IEk7IGkgPiAwOyBpLS0pIHtcbiAgICBmb3IgKGogPSAwOyBqIDwgcmVwci5sZW5ndGg7IGorKykge1xuICAgICAgbmFmVyA9IHJlcHJbal07XG4gICAgICBpZiAobmFmVyA9PT0gaSlcbiAgICAgICAgYiA9IGIubWl4ZWRBZGQoZG91Ymxlcy5wb2ludHNbal0pO1xuICAgICAgZWxzZSBpZiAobmFmVyA9PT0gLWkpXG4gICAgICAgIGIgPSBiLm1peGVkQWRkKGRvdWJsZXMucG9pbnRzW2pdLm5lZygpKTtcbiAgICB9XG4gICAgYSA9IGEuYWRkKGIpO1xuICB9XG4gIHJldHVybiBhLnRvUCgpO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5fd25hZk11bCA9IGZ1bmN0aW9uIF93bmFmTXVsKHAsIGspIHtcbiAgdmFyIHcgPSA0O1xuXG4gIC8vIFByZWNvbXB1dGUgd2luZG93XG4gIHZhciBuYWZQb2ludHMgPSBwLl9nZXROQUZQb2ludHModyk7XG4gIHcgPSBuYWZQb2ludHMud25kO1xuICB2YXIgd25kID0gbmFmUG9pbnRzLnBvaW50cztcblxuICAvLyBHZXQgTkFGIGZvcm1cbiAgdmFyIG5hZiA9IGdldE5BRihrLCB3LCB0aGlzLl9iaXRMZW5ndGgpO1xuXG4gIC8vIEFkZCBgdGhpc2AqKE4rMSkgZm9yIGV2ZXJ5IHctTkFGIGluZGV4XG4gIHZhciBhY2MgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgZm9yICh2YXIgaSA9IG5hZi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIC8vIENvdW50IHplcm9lc1xuICAgIGZvciAodmFyIGwgPSAwOyBpID49IDAgJiYgbmFmW2ldID09PSAwOyBpLS0pXG4gICAgICBsKys7XG4gICAgaWYgKGkgPj0gMClcbiAgICAgIGwrKztcbiAgICBhY2MgPSBhY2MuZGJscChsKTtcblxuICAgIGlmIChpIDwgMClcbiAgICAgIGJyZWFrO1xuICAgIHZhciB6ID0gbmFmW2ldO1xuICAgIGFzc2VydCh6ICE9PSAwKTtcbiAgICBpZiAocC50eXBlID09PSAnYWZmaW5lJykge1xuICAgICAgLy8gSiArLSBQXG4gICAgICBpZiAoeiA+IDApXG4gICAgICAgIGFjYyA9IGFjYy5taXhlZEFkZCh3bmRbKHogLSAxKSA+PiAxXSk7XG4gICAgICBlbHNlXG4gICAgICAgIGFjYyA9IGFjYy5taXhlZEFkZCh3bmRbKC16IC0gMSkgPj4gMV0ubmVnKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBKICstIEpcbiAgICAgIGlmICh6ID4gMClcbiAgICAgICAgYWNjID0gYWNjLmFkZCh3bmRbKHogLSAxKSA+PiAxXSk7XG4gICAgICBlbHNlXG4gICAgICAgIGFjYyA9IGFjYy5hZGQod25kWygteiAtIDEpID4+IDFdLm5lZygpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHAudHlwZSA9PT0gJ2FmZmluZScgPyBhY2MudG9QKCkgOiBhY2M7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl93bmFmTXVsQWRkID0gZnVuY3Rpb24gX3duYWZNdWxBZGQoZGVmVyxcbiAgcG9pbnRzLFxuICBjb2VmZnMsXG4gIGxlbixcbiAgamFjb2JpYW5SZXN1bHQpIHtcbiAgdmFyIHduZFdpZHRoID0gdGhpcy5fd25hZlQxO1xuICB2YXIgd25kID0gdGhpcy5fd25hZlQyO1xuICB2YXIgbmFmID0gdGhpcy5fd25hZlQzO1xuXG4gIC8vIEZpbGwgYWxsIGFycmF5c1xuICB2YXIgbWF4ID0gMDtcbiAgdmFyIGk7XG4gIHZhciBqO1xuICB2YXIgcDtcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgcCA9IHBvaW50c1tpXTtcbiAgICB2YXIgbmFmUG9pbnRzID0gcC5fZ2V0TkFGUG9pbnRzKGRlZlcpO1xuICAgIHduZFdpZHRoW2ldID0gbmFmUG9pbnRzLnduZDtcbiAgICB3bmRbaV0gPSBuYWZQb2ludHMucG9pbnRzO1xuICB9XG5cbiAgLy8gQ29tYiBzbWFsbCB3aW5kb3cgTkFGc1xuICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDE7IGkgLT0gMikge1xuICAgIHZhciBhID0gaSAtIDE7XG4gICAgdmFyIGIgPSBpO1xuICAgIGlmICh3bmRXaWR0aFthXSAhPT0gMSB8fCB3bmRXaWR0aFtiXSAhPT0gMSkge1xuICAgICAgbmFmW2FdID0gZ2V0TkFGKGNvZWZmc1thXSwgd25kV2lkdGhbYV0sIHRoaXMuX2JpdExlbmd0aCk7XG4gICAgICBuYWZbYl0gPSBnZXROQUYoY29lZmZzW2JdLCB3bmRXaWR0aFtiXSwgdGhpcy5fYml0TGVuZ3RoKTtcbiAgICAgIG1heCA9IE1hdGgubWF4KG5hZlthXS5sZW5ndGgsIG1heCk7XG4gICAgICBtYXggPSBNYXRoLm1heChuYWZbYl0ubGVuZ3RoLCBtYXgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGNvbWIgPSBbXG4gICAgICBwb2ludHNbYV0sIC8qIDEgKi9cbiAgICAgIG51bGwsIC8qIDMgKi9cbiAgICAgIG51bGwsIC8qIDUgKi9cbiAgICAgIHBvaW50c1tiXSwgLyogNyAqL1xuICAgIF07XG5cbiAgICAvLyBUcnkgdG8gYXZvaWQgUHJvamVjdGl2ZSBwb2ludHMsIGlmIHBvc3NpYmxlXG4gICAgaWYgKHBvaW50c1thXS55LmNtcChwb2ludHNbYl0ueSkgPT09IDApIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0uYWRkKHBvaW50c1tiXSk7XG4gICAgICBjb21iWzJdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXS5uZWcoKSk7XG4gICAgfSBlbHNlIGlmIChwb2ludHNbYV0ueS5jbXAocG9pbnRzW2JdLnkucmVkTmVnKCkpID09PSAwKSB7XG4gICAgICBjb21iWzFdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXSk7XG4gICAgICBjb21iWzJdID0gcG9pbnRzW2FdLmFkZChwb2ludHNbYl0ubmVnKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21iWzFdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXSk7XG4gICAgICBjb21iWzJdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXS5uZWcoKSk7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gW1xuICAgICAgLTMsIC8qIC0xIC0xICovXG4gICAgICAtMSwgLyogLTEgMCAqL1xuICAgICAgLTUsIC8qIC0xIDEgKi9cbiAgICAgIC03LCAvKiAwIC0xICovXG4gICAgICAwLCAvKiAwIDAgKi9cbiAgICAgIDcsIC8qIDAgMSAqL1xuICAgICAgNSwgLyogMSAtMSAqL1xuICAgICAgMSwgLyogMSAwICovXG4gICAgICAzLCAgLyogMSAxICovXG4gICAgXTtcblxuICAgIHZhciBqc2YgPSBnZXRKU0YoY29lZmZzW2FdLCBjb2VmZnNbYl0pO1xuICAgIG1heCA9IE1hdGgubWF4KGpzZlswXS5sZW5ndGgsIG1heCk7XG4gICAgbmFmW2FdID0gbmV3IEFycmF5KG1heCk7XG4gICAgbmFmW2JdID0gbmV3IEFycmF5KG1heCk7XG4gICAgZm9yIChqID0gMDsgaiA8IG1heDsgaisrKSB7XG4gICAgICB2YXIgamEgPSBqc2ZbMF1bal0gfCAwO1xuICAgICAgdmFyIGpiID0ganNmWzFdW2pdIHwgMDtcblxuICAgICAgbmFmW2FdW2pdID0gaW5kZXhbKGphICsgMSkgKiAzICsgKGpiICsgMSldO1xuICAgICAgbmFmW2JdW2pdID0gMDtcbiAgICAgIHduZFthXSA9IGNvbWI7XG4gICAgfVxuICB9XG5cbiAgdmFyIGFjYyA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICB2YXIgdG1wID0gdGhpcy5fd25hZlQ0O1xuICBmb3IgKGkgPSBtYXg7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGsgPSAwO1xuXG4gICAgd2hpbGUgKGkgPj0gMCkge1xuICAgICAgdmFyIHplcm8gPSB0cnVlO1xuICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgIHRtcFtqXSA9IG5hZltqXVtpXSB8IDA7XG4gICAgICAgIGlmICh0bXBbal0gIT09IDApXG4gICAgICAgICAgemVybyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCF6ZXJvKVxuICAgICAgICBicmVhaztcbiAgICAgIGsrKztcbiAgICAgIGktLTtcbiAgICB9XG4gICAgaWYgKGkgPj0gMClcbiAgICAgIGsrKztcbiAgICBhY2MgPSBhY2MuZGJscChrKTtcbiAgICBpZiAoaSA8IDApXG4gICAgICBicmVhaztcblxuICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykge1xuICAgICAgdmFyIHogPSB0bXBbal07XG4gICAgICBwO1xuICAgICAgaWYgKHogPT09IDApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgZWxzZSBpZiAoeiA+IDApXG4gICAgICAgIHAgPSB3bmRbal1bKHogLSAxKSA+PiAxXTtcbiAgICAgIGVsc2UgaWYgKHogPCAwKVxuICAgICAgICBwID0gd25kW2pdWygteiAtIDEpID4+IDFdLm5lZygpO1xuXG4gICAgICBpZiAocC50eXBlID09PSAnYWZmaW5lJylcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHApO1xuICAgICAgZWxzZVxuICAgICAgICBhY2MgPSBhY2MuYWRkKHApO1xuICAgIH1cbiAgfVxuICAvLyBaZXJvaWZ5IHJlZmVyZW5jZXNcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgIHduZFtpXSA9IG51bGw7XG5cbiAgaWYgKGphY29iaWFuUmVzdWx0KVxuICAgIHJldHVybiBhY2M7XG4gIGVsc2VcbiAgICByZXR1cm4gYWNjLnRvUCgpO1xufTtcblxuZnVuY3Rpb24gQmFzZVBvaW50KGN1cnZlLCB0eXBlKSB7XG4gIHRoaXMuY3VydmUgPSBjdXJ2ZTtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5wcmVjb21wdXRlZCA9IG51bGw7XG59XG5CYXNlQ3VydmUuQmFzZVBvaW50ID0gQmFzZVBvaW50O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEoLypvdGhlciovKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLnZhbGlkYXRlKHRoaXMpO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5kZWNvZGVQb2ludCA9IGZ1bmN0aW9uIGRlY29kZVBvaW50KGJ5dGVzLCBlbmMpIHtcbiAgYnl0ZXMgPSB1dGlscy50b0FycmF5KGJ5dGVzLCBlbmMpO1xuXG4gIHZhciBsZW4gPSB0aGlzLnAuYnl0ZUxlbmd0aCgpO1xuXG4gIC8vIHVuY29tcHJlc3NlZCwgaHlicmlkLW9kZCwgaHlicmlkLWV2ZW5cbiAgaWYgKChieXRlc1swXSA9PT0gMHgwNCB8fCBieXRlc1swXSA9PT0gMHgwNiB8fCBieXRlc1swXSA9PT0gMHgwNykgJiZcbiAgICAgIGJ5dGVzLmxlbmd0aCAtIDEgPT09IDIgKiBsZW4pIHtcbiAgICBpZiAoYnl0ZXNbMF0gPT09IDB4MDYpXG4gICAgICBhc3NlcnQoYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gMV0gJSAyID09PSAwKTtcbiAgICBlbHNlIGlmIChieXRlc1swXSA9PT0gMHgwNylcbiAgICAgIGFzc2VydChieXRlc1tieXRlcy5sZW5ndGggLSAxXSAlIDIgPT09IDEpO1xuXG4gICAgdmFyIHJlcyA9ICB0aGlzLnBvaW50KGJ5dGVzLnNsaWNlKDEsIDEgKyBsZW4pLFxuICAgICAgYnl0ZXMuc2xpY2UoMSArIGxlbiwgMSArIDIgKiBsZW4pKTtcblxuICAgIHJldHVybiByZXM7XG4gIH0gZWxzZSBpZiAoKGJ5dGVzWzBdID09PSAweDAyIHx8IGJ5dGVzWzBdID09PSAweDAzKSAmJlxuICAgICAgICAgICAgICBieXRlcy5sZW5ndGggLSAxID09PSBsZW4pIHtcbiAgICByZXR1cm4gdGhpcy5wb2ludEZyb21YKGJ5dGVzLnNsaWNlKDEsIDEgKyBsZW4pLCBieXRlc1swXSA9PT0gMHgwMyk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHBvaW50IGZvcm1hdCcpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5lbmNvZGVDb21wcmVzc2VkID0gZnVuY3Rpb24gZW5jb2RlQ29tcHJlc3NlZChlbmMpIHtcbiAgcmV0dXJuIHRoaXMuZW5jb2RlKGVuYywgdHJ1ZSk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBfZW5jb2RlKGNvbXBhY3QpIHtcbiAgdmFyIGxlbiA9IHRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCk7XG4gIHZhciB4ID0gdGhpcy5nZXRYKCkudG9BcnJheSgnYmUnLCBsZW4pO1xuXG4gIGlmIChjb21wYWN0KVxuICAgIHJldHVybiBbIHRoaXMuZ2V0WSgpLmlzRXZlbigpID8gMHgwMiA6IDB4MDMgXS5jb25jYXQoeCk7XG5cbiAgcmV0dXJuIFsgMHgwNCBdLmNvbmNhdCh4LCB0aGlzLmdldFkoKS50b0FycmF5KCdiZScsIGxlbikpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZW5jLCBjb21wYWN0KSB7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy5fZW5jb2RlKGNvbXBhY3QpLCBlbmMpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5wcmVjb21wdXRlID0gZnVuY3Rpb24gcHJlY29tcHV0ZShwb3dlcikge1xuICBpZiAodGhpcy5wcmVjb21wdXRlZClcbiAgICByZXR1cm4gdGhpcztcblxuICB2YXIgcHJlY29tcHV0ZWQgPSB7XG4gICAgZG91YmxlczogbnVsbCxcbiAgICBuYWY6IG51bGwsXG4gICAgYmV0YTogbnVsbCxcbiAgfTtcbiAgcHJlY29tcHV0ZWQubmFmID0gdGhpcy5fZ2V0TkFGUG9pbnRzKDgpO1xuICBwcmVjb21wdXRlZC5kb3VibGVzID0gdGhpcy5fZ2V0RG91Ymxlcyg0LCBwb3dlcik7XG4gIHByZWNvbXB1dGVkLmJldGEgPSB0aGlzLl9nZXRCZXRhKCk7XG4gIHRoaXMucHJlY29tcHV0ZWQgPSBwcmVjb21wdXRlZDtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2hhc0RvdWJsZXMgPSBmdW5jdGlvbiBfaGFzRG91YmxlcyhrKSB7XG4gIGlmICghdGhpcy5wcmVjb21wdXRlZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGRvdWJsZXMgPSB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7XG4gIGlmICghZG91YmxlcylcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGRvdWJsZXMucG9pbnRzLmxlbmd0aCA+PSBNYXRoLmNlaWwoKGsuYml0TGVuZ3RoKCkgKyAxKSAvIGRvdWJsZXMuc3RlcCk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9nZXREb3VibGVzID0gZnVuY3Rpb24gX2dldERvdWJsZXMoc3RlcCwgcG93ZXIpIHtcbiAgaWYgKHRoaXMucHJlY29tcHV0ZWQgJiYgdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzKVxuICAgIHJldHVybiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7XG5cbiAgdmFyIGRvdWJsZXMgPSBbIHRoaXMgXTtcbiAgdmFyIGFjYyA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG93ZXI7IGkgKz0gc3RlcCkge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3RlcDsgaisrKVxuICAgICAgYWNjID0gYWNjLmRibCgpO1xuICAgIGRvdWJsZXMucHVzaChhY2MpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RlcDogc3RlcCxcbiAgICBwb2ludHM6IGRvdWJsZXMsXG4gIH07XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9nZXROQUZQb2ludHMgPSBmdW5jdGlvbiBfZ2V0TkFGUG9pbnRzKHduZCkge1xuICBpZiAodGhpcy5wcmVjb21wdXRlZCAmJiB0aGlzLnByZWNvbXB1dGVkLm5hZilcbiAgICByZXR1cm4gdGhpcy5wcmVjb21wdXRlZC5uYWY7XG5cbiAgdmFyIHJlcyA9IFsgdGhpcyBdO1xuICB2YXIgbWF4ID0gKDEgPDwgd25kKSAtIDE7XG4gIHZhciBkYmwgPSBtYXggPT09IDEgPyBudWxsIDogdGhpcy5kYmwoKTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBtYXg7IGkrKylcbiAgICByZXNbaV0gPSByZXNbaSAtIDFdLmFkZChkYmwpO1xuICByZXR1cm4ge1xuICAgIHduZDogd25kLFxuICAgIHBvaW50czogcmVzLFxuICB9O1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5fZ2V0QmV0YSA9IGZ1bmN0aW9uIF9nZXRCZXRhKCkge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZGJscCA9IGZ1bmN0aW9uIGRibHAoaykge1xuICB2YXIgciA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgazsgaSsrKVxuICAgIHIgPSByLmRibCgpO1xuICByZXR1cm4gcjtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcblxudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gU2hvcnRDdXJ2ZShjb25mKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnc2hvcnQnLCBjb25mKTtcblxuICB0aGlzLmEgPSBuZXcgQk4oY29uZi5hLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmIgPSBuZXcgQk4oY29uZi5iLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLnRpbnYgPSB0aGlzLnR3by5yZWRJbnZtKCk7XG5cbiAgdGhpcy56ZXJvQSA9IHRoaXMuYS5mcm9tUmVkKCkuY21wbigwKSA9PT0gMDtcbiAgdGhpcy50aHJlZUEgPSB0aGlzLmEuZnJvbVJlZCgpLnN1Yih0aGlzLnApLmNtcG4oLTMpID09PSAwO1xuXG4gIC8vIElmIHRoZSBjdXJ2ZSBpcyBlbmRvbW9ycGhpYywgcHJlY2FsY3VsYXRlIGJldGEgYW5kIGxhbWJkYVxuICB0aGlzLmVuZG8gPSB0aGlzLl9nZXRFbmRvbW9ycGhpc20oY29uZik7XG4gIHRoaXMuX2VuZG9XbmFmVDEgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX2VuZG9XbmFmVDIgPSBuZXcgQXJyYXkoNCk7XG59XG5pbmhlcml0cyhTaG9ydEN1cnZlLCBCYXNlKTtcbm1vZHVsZS5leHBvcnRzID0gU2hvcnRDdXJ2ZTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9tb3JwaGlzbSA9IGZ1bmN0aW9uIF9nZXRFbmRvbW9ycGhpc20oY29uZikge1xuICAvLyBObyBlZmZpY2llbnQgZW5kb21vcnBoaXNtXG4gIGlmICghdGhpcy56ZXJvQSB8fCAhdGhpcy5nIHx8ICF0aGlzLm4gfHwgdGhpcy5wLm1vZG4oMykgIT09IDEpXG4gICAgcmV0dXJuO1xuXG4gIC8vIENvbXB1dGUgYmV0YSBhbmQgbGFtYmRhLCB0aGF0IGxhbWJkYSAqIFAgPSAoYmV0YSAqIFB4OyBQeSlcbiAgdmFyIGJldGE7XG4gIHZhciBsYW1iZGE7XG4gIGlmIChjb25mLmJldGEpIHtcbiAgICBiZXRhID0gbmV3IEJOKGNvbmYuYmV0YSwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYmV0YXMgPSB0aGlzLl9nZXRFbmRvUm9vdHModGhpcy5wKTtcbiAgICAvLyBDaG9vc2UgdGhlIHNtYWxsZXN0IGJldGFcbiAgICBiZXRhID0gYmV0YXNbMF0uY21wKGJldGFzWzFdKSA8IDAgPyBiZXRhc1swXSA6IGJldGFzWzFdO1xuICAgIGJldGEgPSBiZXRhLnRvUmVkKHRoaXMucmVkKTtcbiAgfVxuICBpZiAoY29uZi5sYW1iZGEpIHtcbiAgICBsYW1iZGEgPSBuZXcgQk4oY29uZi5sYW1iZGEsIDE2KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDaG9vc2UgdGhlIGxhbWJkYSB0aGF0IGlzIG1hdGNoaW5nIHNlbGVjdGVkIGJldGFcbiAgICB2YXIgbGFtYmRhcyA9IHRoaXMuX2dldEVuZG9Sb290cyh0aGlzLm4pO1xuICAgIGlmICh0aGlzLmcubXVsKGxhbWJkYXNbMF0pLnguY21wKHRoaXMuZy54LnJlZE11bChiZXRhKSkgPT09IDApIHtcbiAgICAgIGxhbWJkYSA9IGxhbWJkYXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhbWJkYSA9IGxhbWJkYXNbMV07XG4gICAgICBhc3NlcnQodGhpcy5nLm11bChsYW1iZGEpLnguY21wKHRoaXMuZy54LnJlZE11bChiZXRhKSkgPT09IDApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBiYXNpcyB2ZWN0b3JzLCB1c2VkIGZvciBiYWxhbmNlZCBsZW5ndGgtdHdvIHJlcHJlc2VudGF0aW9uXG4gIHZhciBiYXNpcztcbiAgaWYgKGNvbmYuYmFzaXMpIHtcbiAgICBiYXNpcyA9IGNvbmYuYmFzaXMubWFwKGZ1bmN0aW9uKHZlYykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYTogbmV3IEJOKHZlYy5hLCAxNiksXG4gICAgICAgIGI6IG5ldyBCTih2ZWMuYiwgMTYpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBiYXNpcyA9IHRoaXMuX2dldEVuZG9CYXNpcyhsYW1iZGEpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBiZXRhOiBiZXRhLFxuICAgIGxhbWJkYTogbGFtYmRhLFxuICAgIGJhc2lzOiBiYXNpcyxcbiAgfTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9nZXRFbmRvUm9vdHMgPSBmdW5jdGlvbiBfZ2V0RW5kb1Jvb3RzKG51bSkge1xuICAvLyBGaW5kIHJvb3RzIG9mIGZvciB4XjIgKyB4ICsgMSBpbiBGXG4gIC8vIFJvb3QgPSAoLTEgKy0gU3FydCgtMykpIC8gMlxuICAvL1xuICB2YXIgcmVkID0gbnVtID09PSB0aGlzLnAgPyB0aGlzLnJlZCA6IEJOLm1vbnQobnVtKTtcbiAgdmFyIHRpbnYgPSBuZXcgQk4oMikudG9SZWQocmVkKS5yZWRJbnZtKCk7XG4gIHZhciBudGludiA9IHRpbnYucmVkTmVnKCk7XG5cbiAgdmFyIHMgPSBuZXcgQk4oMykudG9SZWQocmVkKS5yZWROZWcoKS5yZWRTcXJ0KCkucmVkTXVsKHRpbnYpO1xuXG4gIHZhciBsMSA9IG50aW52LnJlZEFkZChzKS5mcm9tUmVkKCk7XG4gIHZhciBsMiA9IG50aW52LnJlZFN1YihzKS5mcm9tUmVkKCk7XG4gIHJldHVybiBbIGwxLCBsMiBdO1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9CYXNpcyA9IGZ1bmN0aW9uIF9nZXRFbmRvQmFzaXMobGFtYmRhKSB7XG4gIC8vIGFwcnhTcXJ0ID49IHNxcnQodGhpcy5uKVxuICB2YXIgYXByeFNxcnQgPSB0aGlzLm4udXNocm4oTWF0aC5mbG9vcih0aGlzLm4uYml0TGVuZ3RoKCkgLyAyKSk7XG5cbiAgLy8gMy43NFxuICAvLyBSdW4gRUdDRCwgdW50aWwgcihMICsgMSkgPCBhcHJ4U3FydFxuICB2YXIgdSA9IGxhbWJkYTtcbiAgdmFyIHYgPSB0aGlzLm4uY2xvbmUoKTtcbiAgdmFyIHgxID0gbmV3IEJOKDEpO1xuICB2YXIgeTEgPSBuZXcgQk4oMCk7XG4gIHZhciB4MiA9IG5ldyBCTigwKTtcbiAgdmFyIHkyID0gbmV3IEJOKDEpO1xuXG4gIC8vIE5PVEU6IGFsbCB2ZWN0b3JzIGFyZSByb290cyBvZjogYSArIGIgKiBsYW1iZGEgPSAwIChtb2QgbilcbiAgdmFyIGEwO1xuICB2YXIgYjA7XG4gIC8vIEZpcnN0IHZlY3RvclxuICB2YXIgYTE7XG4gIHZhciBiMTtcbiAgLy8gU2Vjb25kIHZlY3RvclxuICB2YXIgYTI7XG4gIHZhciBiMjtcblxuICB2YXIgcHJldlI7XG4gIHZhciBpID0gMDtcbiAgdmFyIHI7XG4gIHZhciB4O1xuICB3aGlsZSAodS5jbXBuKDApICE9PSAwKSB7XG4gICAgdmFyIHEgPSB2LmRpdih1KTtcbiAgICByID0gdi5zdWIocS5tdWwodSkpO1xuICAgIHggPSB4Mi5zdWIocS5tdWwoeDEpKTtcbiAgICB2YXIgeSA9IHkyLnN1YihxLm11bCh5MSkpO1xuXG4gICAgaWYgKCFhMSAmJiByLmNtcChhcHJ4U3FydCkgPCAwKSB7XG4gICAgICBhMCA9IHByZXZSLm5lZygpO1xuICAgICAgYjAgPSB4MTtcbiAgICAgIGExID0gci5uZWcoKTtcbiAgICAgIGIxID0geDtcbiAgICB9IGVsc2UgaWYgKGExICYmICsraSA9PT0gMikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHByZXZSID0gcjtcblxuICAgIHYgPSB1O1xuICAgIHUgPSByO1xuICAgIHgyID0geDE7XG4gICAgeDEgPSB4O1xuICAgIHkyID0geTE7XG4gICAgeTEgPSB5O1xuICB9XG4gIGEyID0gci5uZWcoKTtcbiAgYjIgPSB4O1xuXG4gIHZhciBsZW4xID0gYTEuc3FyKCkuYWRkKGIxLnNxcigpKTtcbiAgdmFyIGxlbjIgPSBhMi5zcXIoKS5hZGQoYjIuc3FyKCkpO1xuICBpZiAobGVuMi5jbXAobGVuMSkgPj0gMCkge1xuICAgIGEyID0gYTA7XG4gICAgYjIgPSBiMDtcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBzaWduc1xuICBpZiAoYTEubmVnYXRpdmUpIHtcbiAgICBhMSA9IGExLm5lZygpO1xuICAgIGIxID0gYjEubmVnKCk7XG4gIH1cbiAgaWYgKGEyLm5lZ2F0aXZlKSB7XG4gICAgYTIgPSBhMi5uZWcoKTtcbiAgICBiMiA9IGIyLm5lZygpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICB7IGE6IGExLCBiOiBiMSB9LFxuICAgIHsgYTogYTIsIGI6IGIyIH0sXG4gIF07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZW5kb1NwbGl0ID0gZnVuY3Rpb24gX2VuZG9TcGxpdChrKSB7XG4gIHZhciBiYXNpcyA9IHRoaXMuZW5kby5iYXNpcztcbiAgdmFyIHYxID0gYmFzaXNbMF07XG4gIHZhciB2MiA9IGJhc2lzWzFdO1xuXG4gIHZhciBjMSA9IHYyLmIubXVsKGspLmRpdlJvdW5kKHRoaXMubik7XG4gIHZhciBjMiA9IHYxLmIubmVnKCkubXVsKGspLmRpdlJvdW5kKHRoaXMubik7XG5cbiAgdmFyIHAxID0gYzEubXVsKHYxLmEpO1xuICB2YXIgcDIgPSBjMi5tdWwodjIuYSk7XG4gIHZhciBxMSA9IGMxLm11bCh2MS5iKTtcbiAgdmFyIHEyID0gYzIubXVsKHYyLmIpO1xuXG4gIC8vIENhbGN1bGF0ZSBhbnN3ZXJcbiAgdmFyIGsxID0gay5zdWIocDEpLnN1YihwMik7XG4gIHZhciBrMiA9IHExLmFkZChxMikubmVnKCk7XG4gIHJldHVybiB7IGsxOiBrMSwgazI6IGsyIH07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludEZyb21YID0gZnVuY3Rpb24gcG9pbnRGcm9tWCh4LCBvZGQpIHtcbiAgeCA9IG5ldyBCTih4LCAxNik7XG4gIGlmICgheC5yZWQpXG4gICAgeCA9IHgudG9SZWQodGhpcy5yZWQpO1xuXG4gIHZhciB5MiA9IHgucmVkU3FyKCkucmVkTXVsKHgpLnJlZElBZGQoeC5yZWRNdWwodGhpcy5hKSkucmVkSUFkZCh0aGlzLmIpO1xuICB2YXIgeSA9IHkyLnJlZFNxcnQoKTtcbiAgaWYgKHkucmVkU3FyKCkucmVkU3ViKHkyKS5jbXAodGhpcy56ZXJvKSAhPT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcG9pbnQnKTtcblxuICAvLyBYWFggSXMgdGhlcmUgYW55IHdheSB0byB0ZWxsIGlmIHRoZSBudW1iZXIgaXMgb2RkIHdpdGhvdXQgY29udmVydGluZyBpdFxuICAvLyB0byBub24tcmVkIGZvcm0/XG4gIHZhciBpc09kZCA9IHkuZnJvbVJlZCgpLmlzT2RkKCk7XG4gIGlmIChvZGQgJiYgIWlzT2RkIHx8ICFvZGQgJiYgaXNPZGQpXG4gICAgeSA9IHkucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHBvaW50KSB7XG4gIGlmIChwb2ludC5pbmYpXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgdmFyIHggPSBwb2ludC54O1xuICB2YXIgeSA9IHBvaW50Lnk7XG5cbiAgdmFyIGF4ID0gdGhpcy5hLnJlZE11bCh4KTtcbiAgdmFyIHJocyA9IHgucmVkU3FyKCkucmVkTXVsKHgpLnJlZElBZGQoYXgpLnJlZElBZGQodGhpcy5iKTtcbiAgcmV0dXJuIHkucmVkU3FyKCkucmVkSVN1YihyaHMpLmNtcG4oMCkgPT09IDA7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZW5kb1duYWZNdWxBZGQgPVxuICAgIGZ1bmN0aW9uIF9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcywgamFjb2JpYW5SZXN1bHQpIHtcbiAgICAgIHZhciBucG9pbnRzID0gdGhpcy5fZW5kb1duYWZUMTtcbiAgICAgIHZhciBuY29lZmZzID0gdGhpcy5fZW5kb1duYWZUMjtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzcGxpdCA9IHRoaXMuX2VuZG9TcGxpdChjb2VmZnNbaV0pO1xuICAgICAgICB2YXIgcCA9IHBvaW50c1tpXTtcbiAgICAgICAgdmFyIGJldGEgPSBwLl9nZXRCZXRhKCk7XG5cbiAgICAgICAgaWYgKHNwbGl0LmsxLm5lZ2F0aXZlKSB7XG4gICAgICAgICAgc3BsaXQuazEuaW5lZygpO1xuICAgICAgICAgIHAgPSBwLm5lZyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BsaXQuazIubmVnYXRpdmUpIHtcbiAgICAgICAgICBzcGxpdC5rMi5pbmVnKCk7XG4gICAgICAgICAgYmV0YSA9IGJldGEubmVnKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbnBvaW50c1tpICogMl0gPSBwO1xuICAgICAgICBucG9pbnRzW2kgKiAyICsgMV0gPSBiZXRhO1xuICAgICAgICBuY29lZmZzW2kgKiAyXSA9IHNwbGl0LmsxO1xuICAgICAgICBuY29lZmZzW2kgKiAyICsgMV0gPSBzcGxpdC5rMjtcbiAgICAgIH1cbiAgICAgIHZhciByZXMgPSB0aGlzLl93bmFmTXVsQWRkKDEsIG5wb2ludHMsIG5jb2VmZnMsIGkgKiAyLCBqYWNvYmlhblJlc3VsdCk7XG5cbiAgICAgIC8vIENsZWFuLXVwIHJlZmVyZW5jZXMgdG8gcG9pbnRzIGFuZCBjb2VmZmljaWVudHNcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaSAqIDI7IGorKykge1xuICAgICAgICBucG9pbnRzW2pdID0gbnVsbDtcbiAgICAgICAgbmNvZWZmc1tqXSA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG5cbmZ1bmN0aW9uIFBvaW50KGN1cnZlLCB4LCB5LCBpc1JlZCkge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAnYWZmaW5lJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHkgPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSBudWxsO1xuICAgIHRoaXMueSA9IG51bGw7XG4gICAgdGhpcy5pbmYgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy55ID0gbmV3IEJOKHksIDE2KTtcbiAgICAvLyBGb3JjZSByZWRnb21lcnkgcmVwcmVzZW50YXRpb24gd2hlbiBsb2FkaW5nIGZyb20gSlNPTlxuICAgIGlmIChpc1JlZCkge1xuICAgICAgdGhpcy54LmZvcmNlUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICAgIHRoaXMueS5mb3JjZVJlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgfVxuICAgIGlmICghdGhpcy54LnJlZClcbiAgICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnkucmVkKVxuICAgICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICB0aGlzLmluZiA9IGZhbHNlO1xuICB9XG59XG5pbmhlcml0cyhQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHksIGlzUmVkKSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcywgeCwgeSwgaXNSZWQpO1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqLCByZWQpIHtcbiAgcmV0dXJuIFBvaW50LmZyb21KU09OKHRoaXMsIG9iaiwgcmVkKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZ2V0QmV0YSA9IGZ1bmN0aW9uIF9nZXRCZXRhKCkge1xuICBpZiAoIXRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm47XG5cbiAgdmFyIHByZSA9IHRoaXMucHJlY29tcHV0ZWQ7XG4gIGlmIChwcmUgJiYgcHJlLmJldGEpXG4gICAgcmV0dXJuIHByZS5iZXRhO1xuXG4gIHZhciBiZXRhID0gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTXVsKHRoaXMuY3VydmUuZW5kby5iZXRhKSwgdGhpcy55KTtcbiAgaWYgKHByZSkge1xuICAgIHZhciBjdXJ2ZSA9IHRoaXMuY3VydmU7XG4gICAgdmFyIGVuZG9NdWwgPSBmdW5jdGlvbihwKSB7XG4gICAgICByZXR1cm4gY3VydmUucG9pbnQocC54LnJlZE11bChjdXJ2ZS5lbmRvLmJldGEpLCBwLnkpO1xuICAgIH07XG4gICAgcHJlLmJldGEgPSBiZXRhO1xuICAgIGJldGEucHJlY29tcHV0ZWQgPSB7XG4gICAgICBiZXRhOiBudWxsLFxuICAgICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgICAgd25kOiBwcmUubmFmLnduZCxcbiAgICAgICAgcG9pbnRzOiBwcmUubmFmLnBvaW50cy5tYXAoZW5kb011bCksXG4gICAgICB9LFxuICAgICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgICBzdGVwOiBwcmUuZG91Ymxlcy5zdGVwLFxuICAgICAgICBwb2ludHM6IHByZS5kb3VibGVzLnBvaW50cy5tYXAoZW5kb011bCksXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGJldGE7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICBpZiAoIXRoaXMucHJlY29tcHV0ZWQpXG4gICAgcmV0dXJuIFsgdGhpcy54LCB0aGlzLnkgXTtcblxuICByZXR1cm4gWyB0aGlzLngsIHRoaXMueSwgdGhpcy5wcmVjb21wdXRlZCAmJiB7XG4gICAgZG91YmxlczogdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzICYmIHtcbiAgICAgIHN0ZXA6IHRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5zdGVwLFxuICAgICAgcG9pbnRzOiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMucG9pbnRzLnNsaWNlKDEpLFxuICAgIH0sXG4gICAgbmFmOiB0aGlzLnByZWNvbXB1dGVkLm5hZiAmJiB7XG4gICAgICB3bmQ6IHRoaXMucHJlY29tcHV0ZWQubmFmLnduZCxcbiAgICAgIHBvaW50czogdGhpcy5wcmVjb21wdXRlZC5uYWYucG9pbnRzLnNsaWNlKDEpLFxuICAgIH0sXG4gIH0gXTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaiwgcmVkKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJylcbiAgICBvYmogPSBKU09OLnBhcnNlKG9iaik7XG4gIHZhciByZXMgPSBjdXJ2ZS5wb2ludChvYmpbMF0sIG9ialsxXSwgcmVkKTtcbiAgaWYgKCFvYmpbMl0pXG4gICAgcmV0dXJuIHJlcztcblxuICBmdW5jdGlvbiBvYmoycG9pbnQob2JqKSB7XG4gICAgcmV0dXJuIGN1cnZlLnBvaW50KG9ialswXSwgb2JqWzFdLCByZWQpO1xuICB9XG5cbiAgdmFyIHByZSA9IG9ialsyXTtcbiAgcmVzLnByZWNvbXB1dGVkID0ge1xuICAgIGJldGE6IG51bGwsXG4gICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgc3RlcDogcHJlLmRvdWJsZXMuc3RlcCxcbiAgICAgIHBvaW50czogWyByZXMgXS5jb25jYXQocHJlLmRvdWJsZXMucG9pbnRzLm1hcChvYmoycG9pbnQpKSxcbiAgICB9LFxuICAgIG5hZjogcHJlLm5hZiAmJiB7XG4gICAgICB3bmQ6IHByZS5uYWYud25kLFxuICAgICAgcG9pbnRzOiBbIHJlcyBdLmNvbmNhdChwcmUubmFmLnBvaW50cy5tYXAob2JqMnBvaW50KSksXG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIHJlcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgcmV0dXJuIHRoaXMuaW5mO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHA7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBQICsgUCA9IDJQXG4gIGlmICh0aGlzLmVxKHApKVxuICAgIHJldHVybiB0aGlzLmRibCgpO1xuXG4gIC8vIFAgKyAoLVApID0gT1xuICBpZiAodGhpcy5uZWcoKS5lcShwKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICAvLyBQICsgUSA9IE9cbiAgaWYgKHRoaXMueC5jbXAocC54KSA9PT0gMClcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICB2YXIgYyA9IHRoaXMueS5yZWRTdWIocC55KTtcbiAgaWYgKGMuY21wbigwKSAhPT0gMClcbiAgICBjID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihwLngpLnJlZEludm0oKSk7XG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0aGlzLngpLnJlZElTdWIocC54KTtcbiAgdmFyIG55ID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihueCkpLnJlZElTdWIodGhpcy55KTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyAyUCA9IE9cbiAgdmFyIHlzMSA9IHRoaXMueS5yZWRBZGQodGhpcy55KTtcbiAgaWYgKHlzMS5jbXBuKDApID09PSAwKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciBhID0gdGhpcy5jdXJ2ZS5hO1xuXG4gIHZhciB4MiA9IHRoaXMueC5yZWRTcXIoKTtcbiAgdmFyIGR5aW52ID0geXMxLnJlZEludm0oKTtcbiAgdmFyIGMgPSB4Mi5yZWRBZGQoeDIpLnJlZElBZGQoeDIpLnJlZElBZGQoYSkucmVkTXVsKGR5aW52KTtcblxuICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodGhpcy54LnJlZEFkZCh0aGlzLngpKTtcbiAgdmFyIG55ID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihueCkpLnJlZElTdWIodGhpcy55KTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uIGdldFkoKSB7XG4gIHJldHVybiB0aGlzLnkuZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIGsgPSBuZXcgQk4oaywgMTYpO1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG4gIGVsc2UgaWYgKHRoaXMuX2hhc0RvdWJsZXMoaykpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2ZpeGVkTmFmTXVsKHRoaXMsIGspO1xuICBlbHNlIGlmICh0aGlzLmN1cnZlLmVuZG8pXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKFsgdGhpcyBdLCBbIGsgXSk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bCh0aGlzLCBrKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWxBZGQgPSBmdW5jdGlvbiBtdWxBZGQoazEsIHAyLCBrMikge1xuICB2YXIgcG9pbnRzID0gWyB0aGlzLCBwMiBdO1xuICB2YXIgY29lZmZzID0gWyBrMSwgazIgXTtcbiAgaWYgKHRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQocG9pbnRzLCBjb2VmZnMpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgcG9pbnRzLCBjb2VmZnMsIDIpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmptdWxBZGQgPSBmdW5jdGlvbiBqbXVsQWRkKGsxLCBwMiwgazIpIHtcbiAgdmFyIHBvaW50cyA9IFsgdGhpcywgcDIgXTtcbiAgdmFyIGNvZWZmcyA9IFsgazEsIGsyIF07XG4gIGlmICh0aGlzLmN1cnZlLmVuZG8pXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKHBvaW50cywgY29lZmZzLCB0cnVlKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsIHBvaW50cywgY29lZmZzLCAyLCB0cnVlKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKHApIHtcbiAgcmV0dXJuIHRoaXMgPT09IHAgfHxcbiAgICAgICAgIHRoaXMuaW5mID09PSBwLmluZiAmJlxuICAgICAgICAgICAgICh0aGlzLmluZiB8fCB0aGlzLnguY21wKHAueCkgPT09IDAgJiYgdGhpcy55LmNtcChwLnkpID09PSAwKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcoX3ByZWNvbXB1dGUpIHtcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIHZhciByZXMgPSB0aGlzLmN1cnZlLnBvaW50KHRoaXMueCwgdGhpcy55LnJlZE5lZygpKTtcbiAgaWYgKF9wcmVjb21wdXRlICYmIHRoaXMucHJlY29tcHV0ZWQpIHtcbiAgICB2YXIgcHJlID0gdGhpcy5wcmVjb21wdXRlZDtcbiAgICB2YXIgbmVnYXRlID0gZnVuY3Rpb24ocCkge1xuICAgICAgcmV0dXJuIHAubmVnKCk7XG4gICAgfTtcbiAgICByZXMucHJlY29tcHV0ZWQgPSB7XG4gICAgICBuYWY6IHByZS5uYWYgJiYge1xuICAgICAgICB3bmQ6IHByZS5uYWYud25kLFxuICAgICAgICBwb2ludHM6IHByZS5uYWYucG9pbnRzLm1hcChuZWdhdGUpLFxuICAgICAgfSxcbiAgICAgIGRvdWJsZXM6IHByZS5kb3VibGVzICYmIHtcbiAgICAgICAgc3RlcDogcHJlLmRvdWJsZXMuc3RlcCxcbiAgICAgICAgcG9pbnRzOiBwcmUuZG91Ymxlcy5wb2ludHMubWFwKG5lZ2F0ZSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cblBvaW50LnByb3RvdHlwZS50b0ogPSBmdW5jdGlvbiB0b0ooKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG5cbiAgdmFyIHJlcyA9IHRoaXMuY3VydmUuanBvaW50KHRoaXMueCwgdGhpcy55LCB0aGlzLmN1cnZlLm9uZSk7XG4gIHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBKUG9pbnQoY3VydmUsIHgsIHksIHopIHtcbiAgQmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLCBjdXJ2ZSwgJ2phY29iaWFuJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHkgPT09IG51bGwgJiYgeiA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueSA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueiA9IG5ldyBCTigwKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueSA9IG5ldyBCTih5LCAxNik7XG4gICAgdGhpcy56ID0gbmV3IEJOKHosIDE2KTtcbiAgfVxuICBpZiAoIXRoaXMueC5yZWQpXG4gICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgaWYgKCF0aGlzLnkucmVkKVxuICAgIHRoaXMueSA9IHRoaXMueS50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gIGlmICghdGhpcy56LnJlZClcbiAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuXG4gIHRoaXMuek9uZSA9IHRoaXMueiA9PT0gdGhpcy5jdXJ2ZS5vbmU7XG59XG5pbmhlcml0cyhKUG9pbnQsIEJhc2UuQmFzZVBvaW50KTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuanBvaW50ID0gZnVuY3Rpb24ganBvaW50KHgsIHksIHopIHtcbiAgcmV0dXJuIG5ldyBKUG9pbnQodGhpcywgeCwgeSwgeik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLnRvUCA9IGZ1bmN0aW9uIHRvUCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciB6aW52ID0gdGhpcy56LnJlZEludm0oKTtcbiAgdmFyIHppbnYyID0gemludi5yZWRTcXIoKTtcbiAgdmFyIGF4ID0gdGhpcy54LnJlZE11bCh6aW52Mik7XG4gIHZhciBheSA9IHRoaXMueS5yZWRNdWwoemludjIpLnJlZE11bCh6aW52KTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChheCwgYXkpO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcoKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludCh0aGlzLngsIHRoaXMueS5yZWROZWcoKSwgdGhpcy56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgLy8gTyArIFAgPSBQXG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gcDtcblxuICAvLyBQICsgTyA9IFBcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIDEyTSArIDRTICsgN0FcbiAgdmFyIHB6MiA9IHAuei5yZWRTcXIoKTtcbiAgdmFyIHoyID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgdTEgPSB0aGlzLngucmVkTXVsKHB6Mik7XG4gIHZhciB1MiA9IHAueC5yZWRNdWwoejIpO1xuICB2YXIgczEgPSB0aGlzLnkucmVkTXVsKHB6Mi5yZWRNdWwocC56KSk7XG4gIHZhciBzMiA9IHAueS5yZWRNdWwoejIucmVkTXVsKHRoaXMueikpO1xuXG4gIHZhciBoID0gdTEucmVkU3ViKHUyKTtcbiAgdmFyIHIgPSBzMS5yZWRTdWIoczIpO1xuICBpZiAoaC5jbXBuKDApID09PSAwKSB7XG4gICAgaWYgKHIuY21wbigwKSAhPT0gMClcbiAgICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5kYmwoKTtcbiAgfVxuXG4gIHZhciBoMiA9IGgucmVkU3FyKCk7XG4gIHZhciBoMyA9IGgyLnJlZE11bChoKTtcbiAgdmFyIHYgPSB1MS5yZWRNdWwoaDIpO1xuXG4gIHZhciBueCA9IHIucmVkU3FyKCkucmVkSUFkZChoMykucmVkSVN1Yih2KS5yZWRJU3ViKHYpO1xuICB2YXIgbnkgPSByLnJlZE11bCh2LnJlZElTdWIobngpKS5yZWRJU3ViKHMxLnJlZE11bChoMykpO1xuICB2YXIgbnogPSB0aGlzLnoucmVkTXVsKHAueikucmVkTXVsKGgpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubWl4ZWRBZGQgPSBmdW5jdGlvbiBtaXhlZEFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHAudG9KKCk7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyA4TSArIDNTICsgN0FcbiAgdmFyIHoyID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgdTEgPSB0aGlzLng7XG4gIHZhciB1MiA9IHAueC5yZWRNdWwoejIpO1xuICB2YXIgczEgPSB0aGlzLnk7XG4gIHZhciBzMiA9IHAueS5yZWRNdWwoejIpLnJlZE11bCh0aGlzLnopO1xuXG4gIHZhciBoID0gdTEucmVkU3ViKHUyKTtcbiAgdmFyIHIgPSBzMS5yZWRTdWIoczIpO1xuICBpZiAoaC5jbXBuKDApID09PSAwKSB7XG4gICAgaWYgKHIuY21wbigwKSAhPT0gMClcbiAgICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5kYmwoKTtcbiAgfVxuXG4gIHZhciBoMiA9IGgucmVkU3FyKCk7XG4gIHZhciBoMyA9IGgyLnJlZE11bChoKTtcbiAgdmFyIHYgPSB1MS5yZWRNdWwoaDIpO1xuXG4gIHZhciBueCA9IHIucmVkU3FyKCkucmVkSUFkZChoMykucmVkSVN1Yih2KS5yZWRJU3ViKHYpO1xuICB2YXIgbnkgPSByLnJlZE11bCh2LnJlZElTdWIobngpKS5yZWRJU3ViKHMxLnJlZE11bChoMykpO1xuICB2YXIgbnogPSB0aGlzLnoucmVkTXVsKGgpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZGJscCA9IGZ1bmN0aW9uIGRibHAocG93KSB7XG4gIGlmIChwb3cgPT09IDApXG4gICAgcmV0dXJuIHRoaXM7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcbiAgaWYgKCFwb3cpXG4gICAgcmV0dXJuIHRoaXMuZGJsKCk7XG5cbiAgdmFyIGk7XG4gIGlmICh0aGlzLmN1cnZlLnplcm9BIHx8IHRoaXMuY3VydmUudGhyZWVBKSB7XG4gICAgdmFyIHIgPSB0aGlzO1xuICAgIGZvciAoaSA9IDA7IGkgPCBwb3c7IGkrKylcbiAgICAgIHIgPSByLmRibCgpO1xuICAgIHJldHVybiByO1xuICB9XG5cbiAgLy8gMU0gKyAyUyArIDFBICsgTiAqICg0UyArIDVNICsgOEEpXG4gIC8vIE4gPSAxID0+IDZNICsgNlMgKyA5QVxuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcbiAgdmFyIHRpbnYgPSB0aGlzLmN1cnZlLnRpbnY7XG5cbiAgdmFyIGp4ID0gdGhpcy54O1xuICB2YXIgankgPSB0aGlzLnk7XG4gIHZhciBqeiA9IHRoaXMuejtcbiAgdmFyIGp6NCA9IGp6LnJlZFNxcigpLnJlZFNxcigpO1xuXG4gIC8vIFJldXNlIHJlc3VsdHNcbiAgdmFyIGp5ZCA9IGp5LnJlZEFkZChqeSk7XG4gIGZvciAoaSA9IDA7IGkgPCBwb3c7IGkrKykge1xuICAgIHZhciBqeDIgPSBqeC5yZWRTcXIoKTtcbiAgICB2YXIganlkMiA9IGp5ZC5yZWRTcXIoKTtcbiAgICB2YXIganlkNCA9IGp5ZDIucmVkU3FyKCk7XG4gICAgdmFyIGMgPSBqeDIucmVkQWRkKGp4MikucmVkSUFkZChqeDIpLnJlZElBZGQoYS5yZWRNdWwoano0KSk7XG5cbiAgICB2YXIgdDEgPSBqeC5yZWRNdWwoanlkMik7XG4gICAgdmFyIG54ID0gYy5yZWRTcXIoKS5yZWRJU3ViKHQxLnJlZEFkZCh0MSkpO1xuICAgIHZhciB0MiA9IHQxLnJlZElTdWIobngpO1xuICAgIHZhciBkbnkgPSBjLnJlZE11bCh0Mik7XG4gICAgZG55ID0gZG55LnJlZElBZGQoZG55KS5yZWRJU3ViKGp5ZDQpO1xuICAgIHZhciBueiA9IGp5ZC5yZWRNdWwoanopO1xuICAgIGlmIChpICsgMSA8IHBvdylcbiAgICAgIGp6NCA9IGp6NC5yZWRNdWwoanlkNCk7XG5cbiAgICBqeCA9IG54O1xuICAgIGp6ID0gbno7XG4gICAganlkID0gZG55O1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGp4LCBqeWQucmVkTXVsKHRpbnYpLCBqeik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGlmICh0aGlzLmN1cnZlLnplcm9BKVxuICAgIHJldHVybiB0aGlzLl96ZXJvRGJsKCk7XG4gIGVsc2UgaWYgKHRoaXMuY3VydmUudGhyZWVBKVxuICAgIHJldHVybiB0aGlzLl90aHJlZURibCgpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX2RibCgpO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5femVyb0RibCA9IGZ1bmN0aW9uIF96ZXJvRGJsKCkge1xuICB2YXIgbng7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICAvLyBaID0gMVxuICBpZiAodGhpcy56T25lKSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0wLmh0bWxcbiAgICAvLyAgICAgI2RvdWJsaW5nLW1kYmwtMjAwNy1ibFxuICAgIC8vIDFNICsgNVMgKyAxNEFcblxuICAgIC8vIFhYID0gWDFeMlxuICAgIHZhciB4eCA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBZWSA9IFkxXjJcbiAgICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gWVlZWSA9IFlZXjJcbiAgICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAgIC8vIFMgPSAyICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKVxuICAgIHZhciBzID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgICBzID0gcy5yZWRJQWRkKHMpO1xuICAgIC8vIE0gPSAzICogWFggKyBhOyBhID0gMFxuICAgIHZhciBtID0geHgucmVkQWRkKHh4KS5yZWRJQWRkKHh4KTtcbiAgICAvLyBUID0gTSBeIDIgLSAyKlNcbiAgICB2YXIgdCA9IG0ucmVkU3FyKCkucmVkSVN1YihzKS5yZWRJU3ViKHMpO1xuXG4gICAgLy8gOCAqIFlZWVlcbiAgICB2YXIgeXl5eTggPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuXG4gICAgLy8gWDMgPSBUXG4gICAgbnggPSB0O1xuICAgIC8vIFkzID0gTSAqIChTIC0gVCkgLSA4ICogWVlZWVxuICAgIG55ID0gbS5yZWRNdWwocy5yZWRJU3ViKHQpKS5yZWRJU3ViKHl5eXk4KTtcbiAgICAvLyBaMyA9IDIqWTFcbiAgICBueiA9IHRoaXMueS5yZWRBZGQodGhpcy55KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbFxuICAgIC8vICAgICAjZG91YmxpbmctZGJsLTIwMDktbFxuICAgIC8vIDJNICsgNVMgKyAxM0FcblxuICAgIC8vIEEgPSBYMV4yXG4gICAgdmFyIGEgPSB0aGlzLngucmVkU3FyKCk7XG4gICAgLy8gQiA9IFkxXjJcbiAgICB2YXIgYiA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBDID0gQl4yXG4gICAgdmFyIGMgPSBiLnJlZFNxcigpO1xuICAgIC8vIEQgPSAyICogKChYMSArIEIpXjIgLSBBIC0gQylcbiAgICB2YXIgZCA9IHRoaXMueC5yZWRBZGQoYikucmVkU3FyKCkucmVkSVN1YihhKS5yZWRJU3ViKGMpO1xuICAgIGQgPSBkLnJlZElBZGQoZCk7XG4gICAgLy8gRSA9IDMgKiBBXG4gICAgdmFyIGUgPSBhLnJlZEFkZChhKS5yZWRJQWRkKGEpO1xuICAgIC8vIEYgPSBFXjJcbiAgICB2YXIgZiA9IGUucmVkU3FyKCk7XG5cbiAgICAvLyA4ICogQ1xuICAgIHZhciBjOCA9IGMucmVkSUFkZChjKTtcbiAgICBjOCA9IGM4LnJlZElBZGQoYzgpO1xuICAgIGM4ID0gYzgucmVkSUFkZChjOCk7XG5cbiAgICAvLyBYMyA9IEYgLSAyICogRFxuICAgIG54ID0gZi5yZWRJU3ViKGQpLnJlZElTdWIoZCk7XG4gICAgLy8gWTMgPSBFICogKEQgLSBYMykgLSA4ICogQ1xuICAgIG55ID0gZS5yZWRNdWwoZC5yZWRJU3ViKG54KSkucmVkSVN1YihjOCk7XG4gICAgLy8gWjMgPSAyICogWTEgKiBaMVxuICAgIG56ID0gdGhpcy55LnJlZE11bCh0aGlzLnopO1xuICAgIG56ID0gbnoucmVkSUFkZChueik7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl90aHJlZURibCA9IGZ1bmN0aW9uIF90aHJlZURibCgpIHtcbiAgdmFyIG54O1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgLy8gWiA9IDFcbiAgaWYgKHRoaXMuek9uZSkge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMy5odG1sXG4gICAgLy8gICAgICNkb3VibGluZy1tZGJsLTIwMDctYmxcbiAgICAvLyAxTSArIDVTICsgMTVBXG5cbiAgICAvLyBYWCA9IFgxXjJcbiAgICB2YXIgeHggPSB0aGlzLngucmVkU3FyKCk7XG4gICAgLy8gWVkgPSBZMV4yXG4gICAgdmFyIHl5ID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIFlZWVkgPSBZWV4yXG4gICAgdmFyIHl5eXkgPSB5eS5yZWRTcXIoKTtcbiAgICAvLyBTID0gMiAqICgoWDEgKyBZWSleMiAtIFhYIC0gWVlZWSlcbiAgICB2YXIgcyA9IHRoaXMueC5yZWRBZGQoeXkpLnJlZFNxcigpLnJlZElTdWIoeHgpLnJlZElTdWIoeXl5eSk7XG4gICAgcyA9IHMucmVkSUFkZChzKTtcbiAgICAvLyBNID0gMyAqIFhYICsgYVxuICAgIHZhciBtID0geHgucmVkQWRkKHh4KS5yZWRJQWRkKHh4KS5yZWRJQWRkKHRoaXMuY3VydmUuYSk7XG4gICAgLy8gVCA9IE1eMiAtIDIgKiBTXG4gICAgdmFyIHQgPSBtLnJlZFNxcigpLnJlZElTdWIocykucmVkSVN1YihzKTtcbiAgICAvLyBYMyA9IFRcbiAgICBueCA9IHQ7XG4gICAgLy8gWTMgPSBNICogKFMgLSBUKSAtIDggKiBZWVlZXG4gICAgdmFyIHl5eXk4ID0geXl5eS5yZWRJQWRkKHl5eXkpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICBueSA9IG0ucmVkTXVsKHMucmVkSVN1Yih0KSkucmVkSVN1Yih5eXl5OCk7XG4gICAgLy8gWjMgPSAyICogWTFcbiAgICBueiA9IHRoaXMueS5yZWRBZGQodGhpcy55KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTMuaHRtbCNkb3VibGluZy1kYmwtMjAwMS1iXG4gICAgLy8gM00gKyA1U1xuXG4gICAgLy8gZGVsdGEgPSBaMV4yXG4gICAgdmFyIGRlbHRhID0gdGhpcy56LnJlZFNxcigpO1xuICAgIC8vIGdhbW1hID0gWTFeMlxuICAgIHZhciBnYW1tYSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBiZXRhID0gWDEgKiBnYW1tYVxuICAgIHZhciBiZXRhID0gdGhpcy54LnJlZE11bChnYW1tYSk7XG4gICAgLy8gYWxwaGEgPSAzICogKFgxIC0gZGVsdGEpICogKFgxICsgZGVsdGEpXG4gICAgdmFyIGFscGhhID0gdGhpcy54LnJlZFN1YihkZWx0YSkucmVkTXVsKHRoaXMueC5yZWRBZGQoZGVsdGEpKTtcbiAgICBhbHBoYSA9IGFscGhhLnJlZEFkZChhbHBoYSkucmVkSUFkZChhbHBoYSk7XG4gICAgLy8gWDMgPSBhbHBoYV4yIC0gOCAqIGJldGFcbiAgICB2YXIgYmV0YTQgPSBiZXRhLnJlZElBZGQoYmV0YSk7XG4gICAgYmV0YTQgPSBiZXRhNC5yZWRJQWRkKGJldGE0KTtcbiAgICB2YXIgYmV0YTggPSBiZXRhNC5yZWRBZGQoYmV0YTQpO1xuICAgIG54ID0gYWxwaGEucmVkU3FyKCkucmVkSVN1YihiZXRhOCk7XG4gICAgLy8gWjMgPSAoWTEgKyBaMSleMiAtIGdhbW1hIC0gZGVsdGFcbiAgICBueiA9IHRoaXMueS5yZWRBZGQodGhpcy56KS5yZWRTcXIoKS5yZWRJU3ViKGdhbW1hKS5yZWRJU3ViKGRlbHRhKTtcbiAgICAvLyBZMyA9IGFscGhhICogKDQgKiBiZXRhIC0gWDMpIC0gOCAqIGdhbW1hXjJcbiAgICB2YXIgZ2dhbW1hOCA9IGdhbW1hLnJlZFNxcigpO1xuICAgIGdnYW1tYTggPSBnZ2FtbWE4LnJlZElBZGQoZ2dhbW1hOCk7XG4gICAgZ2dhbW1hOCA9IGdnYW1tYTgucmVkSUFkZChnZ2FtbWE4KTtcbiAgICBnZ2FtbWE4ID0gZ2dhbW1hOC5yZWRJQWRkKGdnYW1tYTgpO1xuICAgIG55ID0gYWxwaGEucmVkTXVsKGJldGE0LnJlZElTdWIobngpKS5yZWRJU3ViKGdnYW1tYTgpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5fZGJsID0gZnVuY3Rpb24gX2RibCgpIHtcbiAgdmFyIGEgPSB0aGlzLmN1cnZlLmE7XG5cbiAgLy8gNE0gKyA2UyArIDEwQVxuICB2YXIganggPSB0aGlzLng7XG4gIHZhciBqeSA9IHRoaXMueTtcbiAgdmFyIGp6ID0gdGhpcy56O1xuICB2YXIgano0ID0ganoucmVkU3FyKCkucmVkU3FyKCk7XG5cbiAgdmFyIGp4MiA9IGp4LnJlZFNxcigpO1xuICB2YXIgankyID0gankucmVkU3FyKCk7XG5cbiAgdmFyIGMgPSBqeDIucmVkQWRkKGp4MikucmVkSUFkZChqeDIpLnJlZElBZGQoYS5yZWRNdWwoano0KSk7XG5cbiAgdmFyIGp4ZDQgPSBqeC5yZWRBZGQoangpO1xuICBqeGQ0ID0ganhkNC5yZWRJQWRkKGp4ZDQpO1xuICB2YXIgdDEgPSBqeGQ0LnJlZE11bChqeTIpO1xuICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodDEucmVkQWRkKHQxKSk7XG4gIHZhciB0MiA9IHQxLnJlZElTdWIobngpO1xuXG4gIHZhciBqeWQ4ID0gankyLnJlZFNxcigpO1xuICBqeWQ4ID0ganlkOC5yZWRJQWRkKGp5ZDgpO1xuICBqeWQ4ID0ganlkOC5yZWRJQWRkKGp5ZDgpO1xuICBqeWQ4ID0ganlkOC5yZWRJQWRkKGp5ZDgpO1xuICB2YXIgbnkgPSBjLnJlZE11bCh0MikucmVkSVN1YihqeWQ4KTtcbiAgdmFyIG56ID0gankucmVkQWRkKGp5KS5yZWRNdWwoanopO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUudHJwbCA9IGZ1bmN0aW9uIHRycGwoKSB7XG4gIGlmICghdGhpcy5jdXJ2ZS56ZXJvQSlcbiAgICByZXR1cm4gdGhpcy5kYmwoKS5hZGQodGhpcyk7XG5cbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0wLmh0bWwjdHJpcGxpbmctdHBsLTIwMDctYmxcbiAgLy8gNU0gKyAxMFMgKyAuLi5cblxuICAvLyBYWCA9IFgxXjJcbiAgdmFyIHh4ID0gdGhpcy54LnJlZFNxcigpO1xuICAvLyBZWSA9IFkxXjJcbiAgdmFyIHl5ID0gdGhpcy55LnJlZFNxcigpO1xuICAvLyBaWiA9IFoxXjJcbiAgdmFyIHp6ID0gdGhpcy56LnJlZFNxcigpO1xuICAvLyBZWVlZID0gWVleMlxuICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAvLyBNID0gMyAqIFhYICsgYSAqIFpaMjsgYSA9IDBcbiAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpO1xuICAvLyBNTSA9IE1eMlxuICB2YXIgbW0gPSBtLnJlZFNxcigpO1xuICAvLyBFID0gNiAqICgoWDEgKyBZWSleMiAtIFhYIC0gWVlZWSkgLSBNTVxuICB2YXIgZSA9IHRoaXMueC5yZWRBZGQoeXkpLnJlZFNxcigpLnJlZElTdWIoeHgpLnJlZElTdWIoeXl5eSk7XG4gIGUgPSBlLnJlZElBZGQoZSk7XG4gIGUgPSBlLnJlZEFkZChlKS5yZWRJQWRkKGUpO1xuICBlID0gZS5yZWRJU3ViKG1tKTtcbiAgLy8gRUUgPSBFXjJcbiAgdmFyIGVlID0gZS5yZWRTcXIoKTtcbiAgLy8gVCA9IDE2KllZWVlcbiAgdmFyIHQgPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gIHQgPSB0LnJlZElBZGQodCk7XG4gIHQgPSB0LnJlZElBZGQodCk7XG4gIHQgPSB0LnJlZElBZGQodCk7XG4gIC8vIFUgPSAoTSArIEUpXjIgLSBNTSAtIEVFIC0gVFxuICB2YXIgdSA9IG0ucmVkSUFkZChlKS5yZWRTcXIoKS5yZWRJU3ViKG1tKS5yZWRJU3ViKGVlKS5yZWRJU3ViKHQpO1xuICAvLyBYMyA9IDQgKiAoWDEgKiBFRSAtIDQgKiBZWSAqIFUpXG4gIHZhciB5eXU0ID0geXkucmVkTXVsKHUpO1xuICB5eXU0ID0geXl1NC5yZWRJQWRkKHl5dTQpO1xuICB5eXU0ID0geXl1NC5yZWRJQWRkKHl5dTQpO1xuICB2YXIgbnggPSB0aGlzLngucmVkTXVsKGVlKS5yZWRJU3ViKHl5dTQpO1xuICBueCA9IG54LnJlZElBZGQobngpO1xuICBueCA9IG54LnJlZElBZGQobngpO1xuICAvLyBZMyA9IDggKiBZMSAqIChVICogKFQgLSBVKSAtIEUgKiBFRSlcbiAgdmFyIG55ID0gdGhpcy55LnJlZE11bCh1LnJlZE11bCh0LnJlZElTdWIodSkpLnJlZElTdWIoZS5yZWRNdWwoZWUpKSk7XG4gIG55ID0gbnkucmVkSUFkZChueSk7XG4gIG55ID0gbnkucmVkSUFkZChueSk7XG4gIG55ID0gbnkucmVkSUFkZChueSk7XG4gIC8vIFozID0gKFoxICsgRSleMiAtIFpaIC0gRUVcbiAgdmFyIG56ID0gdGhpcy56LnJlZEFkZChlKS5yZWRTcXIoKS5yZWRJU3ViKHp6KS5yZWRJU3ViKGVlKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrLCBrYmFzZSkge1xuICBrID0gbmV3IEJOKGssIGtiYXNlKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bCh0aGlzLCBrKTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShwKSB7XG4gIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKVxuICAgIHJldHVybiB0aGlzLmVxKHAudG9KKCkpO1xuXG4gIGlmICh0aGlzID09PSBwKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIC8vIHgxICogejJeMiA9PSB4MiAqIHoxXjJcbiAgdmFyIHoyID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgcHoyID0gcC56LnJlZFNxcigpO1xuICBpZiAodGhpcy54LnJlZE11bChwejIpLnJlZElTdWIocC54LnJlZE11bCh6MikpLmNtcG4oMCkgIT09IDApXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIHkxICogejJeMyA9PSB5MiAqIHoxXjNcbiAgdmFyIHozID0gejIucmVkTXVsKHRoaXMueik7XG4gIHZhciBwejMgPSBwejIucmVkTXVsKHAueik7XG4gIHJldHVybiB0aGlzLnkucmVkTXVsKHB6MykucmVkSVN1YihwLnkucmVkTXVsKHozKSkuY21wbigwKSA9PT0gMDtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZXFYVG9QID0gZnVuY3Rpb24gZXFYVG9QKHgpIHtcbiAgdmFyIHpzID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgcnggPSB4LnRvUmVkKHRoaXMuY3VydmUucmVkKS5yZWRNdWwoenMpO1xuICBpZiAodGhpcy54LmNtcChyeCkgPT09IDApXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgdmFyIHhjID0geC5jbG9uZSgpO1xuICB2YXIgdCA9IHRoaXMuY3VydmUucmVkTi5yZWRNdWwoenMpO1xuICBmb3IgKDs7KSB7XG4gICAgeGMuaWFkZCh0aGlzLmN1cnZlLm4pO1xuICAgIGlmICh4Yy5jbXAodGhpcy5jdXJ2ZS5wKSA+PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcngucmVkSUFkZCh0KTtcbiAgICBpZiAodGhpcy54LmNtcChyeCkgPT09IDApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuSlBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIEpQb2ludCBJbmZpbml0eT4nO1xuICByZXR1cm4gJzxFQyBKUG9pbnQgeDogJyArIHRoaXMueC50b1N0cmluZygxNiwgMikgK1xuICAgICAgJyB5OiAnICsgdGhpcy55LnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnoudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMuei5jbXBuKDApID09PSAwO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIE1vbnRDdXJ2ZShjb25mKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnbW9udCcsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYiA9IG5ldyBCTihjb25mLmIsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuaTQgPSBuZXcgQk4oNCkudG9SZWQodGhpcy5yZWQpLnJlZEludm0oKTtcbiAgdGhpcy50d28gPSBuZXcgQk4oMikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmEyNCA9IHRoaXMuaTQucmVkTXVsKHRoaXMuYS5yZWRBZGQodGhpcy50d28pKTtcbn1cbmluaGVyaXRzKE1vbnRDdXJ2ZSwgQmFzZSk7XG5tb2R1bGUuZXhwb3J0cyA9IE1vbnRDdXJ2ZTtcblxuTW9udEN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHBvaW50KSB7XG4gIHZhciB4ID0gcG9pbnQubm9ybWFsaXplKCkueDtcbiAgdmFyIHgyID0geC5yZWRTcXIoKTtcbiAgdmFyIHJocyA9IHgyLnJlZE11bCh4KS5yZWRBZGQoeDIucmVkTXVsKHRoaXMuYSkpLnJlZEFkZCh4KTtcbiAgdmFyIHkgPSByaHMucmVkU3FydCgpO1xuXG4gIHJldHVybiB5LnJlZFNxcigpLmNtcChyaHMpID09PSAwO1xufTtcblxuZnVuY3Rpb24gUG9pbnQoY3VydmUsIHgsIHopIHtcbiAgQmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLCBjdXJ2ZSwgJ3Byb2plY3RpdmUnKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeiA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueiA9IHRoaXMuY3VydmUuemVybztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueiA9IG5ldyBCTih6LCAxNik7XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMuei5yZWQpXG4gICAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICB9XG59XG5pbmhlcml0cyhQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5Nb250Q3VydmUucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24gZGVjb2RlUG9pbnQoYnl0ZXMsIGVuYykge1xuICByZXR1cm4gdGhpcy5wb2ludCh1dGlscy50b0FycmF5KGJ5dGVzLCBlbmMpLCAxKTtcbn07XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCh4LCB6KSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcywgeCwgeik7XG59O1xuXG5Nb250Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbUpTT04gPSBmdW5jdGlvbiBwb2ludEZyb21KU09OKG9iaikge1xuICByZXR1cm4gUG9pbnQuZnJvbUpTT04odGhpcywgb2JqKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5wcmVjb21wdXRlID0gZnVuY3Rpb24gcHJlY29tcHV0ZSgpIHtcbiAgLy8gTm8tb3Bcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZW5jb2RlID0gZnVuY3Rpb24gX2VuY29kZSgpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0WCgpLnRvQXJyYXkoJ2JlJywgdGhpcy5jdXJ2ZS5wLmJ5dGVMZW5ndGgoKSk7XG59O1xuXG5Qb2ludC5mcm9tSlNPTiA9IGZ1bmN0aW9uIGZyb21KU09OKGN1cnZlLCBvYmopIHtcbiAgcmV0dXJuIG5ldyBQb2ludChjdXJ2ZSwgb2JqWzBdLCBvYmpbMV0gfHwgY3VydmUub25lKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMuei5jbXBuKDApID09PSAwO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgLy8gaHR0cDovL2h5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1tb250Z29tLXh6Lmh0bWwjZG91YmxpbmctZGJsLTE5ODctbS0zXG4gIC8vIDJNICsgMlMgKyA0QVxuXG4gIC8vIEEgPSBYMSArIFoxXG4gIHZhciBhID0gdGhpcy54LnJlZEFkZCh0aGlzLnopO1xuICAvLyBBQSA9IEFeMlxuICB2YXIgYWEgPSBhLnJlZFNxcigpO1xuICAvLyBCID0gWDEgLSBaMVxuICB2YXIgYiA9IHRoaXMueC5yZWRTdWIodGhpcy56KTtcbiAgLy8gQkIgPSBCXjJcbiAgdmFyIGJiID0gYi5yZWRTcXIoKTtcbiAgLy8gQyA9IEFBIC0gQkJcbiAgdmFyIGMgPSBhYS5yZWRTdWIoYmIpO1xuICAvLyBYMyA9IEFBICogQkJcbiAgdmFyIG54ID0gYWEucmVkTXVsKGJiKTtcbiAgLy8gWjMgPSBDICogKEJCICsgQTI0ICogQylcbiAgdmFyIG56ID0gYy5yZWRNdWwoYmIucmVkQWRkKHRoaXMuY3VydmUuYTI0LnJlZE11bChjKSkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kaWZmQWRkID0gZnVuY3Rpb24gZGlmZkFkZChwLCBkaWZmKSB7XG4gIC8vIGh0dHA6Ly9oeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tbW9udGdvbS14ei5odG1sI2RpZmZhZGQtZGFkZC0xOTg3LW0tM1xuICAvLyA0TSArIDJTICsgNkFcblxuICAvLyBBID0gWDIgKyBaMlxuICB2YXIgYSA9IHRoaXMueC5yZWRBZGQodGhpcy56KTtcbiAgLy8gQiA9IFgyIC0gWjJcbiAgdmFyIGIgPSB0aGlzLngucmVkU3ViKHRoaXMueik7XG4gIC8vIEMgPSBYMyArIFozXG4gIHZhciBjID0gcC54LnJlZEFkZChwLnopO1xuICAvLyBEID0gWDMgLSBaM1xuICB2YXIgZCA9IHAueC5yZWRTdWIocC56KTtcbiAgLy8gREEgPSBEICogQVxuICB2YXIgZGEgPSBkLnJlZE11bChhKTtcbiAgLy8gQ0IgPSBDICogQlxuICB2YXIgY2IgPSBjLnJlZE11bChiKTtcbiAgLy8gWDUgPSBaMSAqIChEQSArIENCKV4yXG4gIHZhciBueCA9IGRpZmYuei5yZWRNdWwoZGEucmVkQWRkKGNiKS5yZWRTcXIoKSk7XG4gIC8vIFo1ID0gWDEgKiAoREEgLSBDQileMlxuICB2YXIgbnogPSBkaWZmLngucmVkTXVsKGRhLnJlZElTdWIoY2IpLnJlZFNxcigpKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwoaykge1xuICB2YXIgdCA9IGsuY2xvbmUoKTtcbiAgdmFyIGEgPSB0aGlzOyAvLyAoTiAvIDIpICogUSArIFFcbiAgdmFyIGIgPSB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpOyAvLyAoTiAvIDIpICogUVxuICB2YXIgYyA9IHRoaXM7IC8vIFFcblxuICBmb3IgKHZhciBiaXRzID0gW107IHQuY21wbigwKSAhPT0gMDsgdC5pdXNocm4oMSkpXG4gICAgYml0cy5wdXNoKHQuYW5kbG4oMSkpO1xuXG4gIGZvciAodmFyIGkgPSBiaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGJpdHNbaV0gPT09IDApIHtcbiAgICAgIC8vIE4gKiBRICsgUSA9ICgoTiAvIDIpICogUSArIFEpKSArIChOIC8gMikgKiBRXG4gICAgICBhID0gYS5kaWZmQWRkKGIsIGMpO1xuICAgICAgLy8gTiAqIFEgPSAyICogKChOIC8gMikgKiBRICsgUSkpXG4gICAgICBiID0gYi5kYmwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTiAqIFEgPSAoKE4gLyAyKSAqIFEgKyBRKSArICgoTiAvIDIpICogUSlcbiAgICAgIGIgPSBhLmRpZmZBZGQoYiwgYyk7XG4gICAgICAvLyBOICogUSArIFEgPSAyICogKChOIC8gMikgKiBRICsgUSlcbiAgICAgIGEgPSBhLmRibCgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYjtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWxBZGQgPSBmdW5jdGlvbiBtdWxBZGQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlJyk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuanVtbEFkZCA9IGZ1bmN0aW9uIGp1bWxBZGQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlJyk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShvdGhlcikge1xuICByZXR1cm4gdGhpcy5nZXRYKCkuY21wKG90aGVyLmdldFgoKSkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICB0aGlzLnggPSB0aGlzLngucmVkTXVsKHRoaXMuei5yZWRJbnZtKCkpO1xuICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uIGdldFgoKSB7XG4gIC8vIE5vcm1hbGl6ZSBjb29yZGluYXRlc1xuICB0aGlzLm5vcm1hbGl6ZSgpO1xuXG4gIHJldHVybiB0aGlzLnguZnJvbVJlZCgpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuXG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBFZHdhcmRzQ3VydmUoY29uZikge1xuICAvLyBOT1RFOiBJbXBvcnRhbnQgYXMgd2UgYXJlIGNyZWF0aW5nIHBvaW50IGluIEJhc2UuY2FsbCgpXG4gIHRoaXMudHdpc3RlZCA9IChjb25mLmEgfCAwKSAhPT0gMTtcbiAgdGhpcy5tT25lQSA9IHRoaXMudHdpc3RlZCAmJiAoY29uZi5hIHwgMCkgPT09IC0xO1xuICB0aGlzLmV4dGVuZGVkID0gdGhpcy5tT25lQTtcblxuICBCYXNlLmNhbGwodGhpcywgJ2Vkd2FyZHMnLCBjb25mKTtcblxuICB0aGlzLmEgPSBuZXcgQk4oY29uZi5hLCAxNikudW1vZCh0aGlzLnJlZC5tKTtcbiAgdGhpcy5hID0gdGhpcy5hLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5jID0gbmV3IEJOKGNvbmYuYywgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5jMiA9IHRoaXMuYy5yZWRTcXIoKTtcbiAgdGhpcy5kID0gbmV3IEJOKGNvbmYuZCwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5kZCA9IHRoaXMuZC5yZWRBZGQodGhpcy5kKTtcblxuICBhc3NlcnQoIXRoaXMudHdpc3RlZCB8fCB0aGlzLmMuZnJvbVJlZCgpLmNtcG4oMSkgPT09IDApO1xuICB0aGlzLm9uZUMgPSAoY29uZi5jIHwgMCkgPT09IDE7XG59XG5pbmhlcml0cyhFZHdhcmRzQ3VydmUsIEJhc2UpO1xubW9kdWxlLmV4cG9ydHMgPSBFZHdhcmRzQ3VydmU7XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuX211bEEgPSBmdW5jdGlvbiBfbXVsQShudW0pIHtcbiAgaWYgKHRoaXMubU9uZUEpXG4gICAgcmV0dXJuIG51bS5yZWROZWcoKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmEucmVkTXVsKG51bSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLl9tdWxDID0gZnVuY3Rpb24gX211bEMobnVtKSB7XG4gIGlmICh0aGlzLm9uZUMpXG4gICAgcmV0dXJuIG51bTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmMucmVkTXVsKG51bSk7XG59O1xuXG4vLyBKdXN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggU2hvcnQgY3VydmVcbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuanBvaW50ID0gZnVuY3Rpb24ganBvaW50KHgsIHksIHosIHQpIHtcbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSwgeiwgdCk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbVggPSBmdW5jdGlvbiBwb2ludEZyb21YKHgsIG9kZCkge1xuICB4ID0gbmV3IEJOKHgsIDE2KTtcbiAgaWYgKCF4LnJlZClcbiAgICB4ID0geC50b1JlZCh0aGlzLnJlZCk7XG5cbiAgdmFyIHgyID0geC5yZWRTcXIoKTtcbiAgdmFyIHJocyA9IHRoaXMuYzIucmVkU3ViKHRoaXMuYS5yZWRNdWwoeDIpKTtcbiAgdmFyIGxocyA9IHRoaXMub25lLnJlZFN1Yih0aGlzLmMyLnJlZE11bCh0aGlzLmQpLnJlZE11bCh4MikpO1xuXG4gIHZhciB5MiA9IHJocy5yZWRNdWwobGhzLnJlZEludm0oKSk7XG4gIHZhciB5ID0geTIucmVkU3FydCgpO1xuICBpZiAoeS5yZWRTcXIoKS5yZWRTdWIoeTIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIHZhciBpc09kZCA9IHkuZnJvbVJlZCgpLmlzT2RkKCk7XG4gIGlmIChvZGQgJiYgIWlzT2RkIHx8ICFvZGQgJiYgaXNPZGQpXG4gICAgeSA9IHkucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbVkgPSBmdW5jdGlvbiBwb2ludEZyb21ZKHksIG9kZCkge1xuICB5ID0gbmV3IEJOKHksIDE2KTtcbiAgaWYgKCF5LnJlZClcbiAgICB5ID0geS50b1JlZCh0aGlzLnJlZCk7XG5cbiAgLy8geF4yID0gKHleMiAtIGNeMikgLyAoY14yIGQgeV4yIC0gYSlcbiAgdmFyIHkyID0geS5yZWRTcXIoKTtcbiAgdmFyIGxocyA9IHkyLnJlZFN1Yih0aGlzLmMyKTtcbiAgdmFyIHJocyA9IHkyLnJlZE11bCh0aGlzLmQpLnJlZE11bCh0aGlzLmMyKS5yZWRTdWIodGhpcy5hKTtcbiAgdmFyIHgyID0gbGhzLnJlZE11bChyaHMucmVkSW52bSgpKTtcblxuICBpZiAoeDIuY21wKHRoaXMuemVybykgPT09IDApIHtcbiAgICBpZiAob2RkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMucG9pbnQodGhpcy56ZXJvLCB5KTtcbiAgfVxuXG4gIHZhciB4ID0geDIucmVkU3FydCgpO1xuICBpZiAoeC5yZWRTcXIoKS5yZWRTdWIoeDIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIGlmICh4LmZyb21SZWQoKS5pc09kZCgpICE9PSBvZGQpXG4gICAgeCA9IHgucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgaWYgKHBvaW50LmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdHJ1ZTtcblxuICAvLyBDdXJ2ZTogQSAqIFheMiArIFleMiA9IENeMiAqICgxICsgRCAqIFheMiAqIFleMilcbiAgcG9pbnQubm9ybWFsaXplKCk7XG5cbiAgdmFyIHgyID0gcG9pbnQueC5yZWRTcXIoKTtcbiAgdmFyIHkyID0gcG9pbnQueS5yZWRTcXIoKTtcbiAgdmFyIGxocyA9IHgyLnJlZE11bCh0aGlzLmEpLnJlZEFkZCh5Mik7XG4gIHZhciByaHMgPSB0aGlzLmMyLnJlZE11bCh0aGlzLm9uZS5yZWRBZGQodGhpcy5kLnJlZE11bCh4MikucmVkTXVsKHkyKSkpO1xuXG4gIHJldHVybiBsaHMuY21wKHJocykgPT09IDA7XG59O1xuXG5mdW5jdGlvbiBQb2ludChjdXJ2ZSwgeCwgeSwgeiwgdCkge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAncHJvamVjdGl2ZScpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB5ID09PSBudWxsICYmIHogPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSB0aGlzLmN1cnZlLnplcm87XG4gICAgdGhpcy55ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy50ID0gdGhpcy5jdXJ2ZS56ZXJvO1xuICAgIHRoaXMuek9uZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIHRoaXMueiA9IHogPyBuZXcgQk4oeiwgMTYpIDogdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy50ID0gdCAmJiBuZXcgQk4odCwgMTYpO1xuICAgIGlmICghdGhpcy54LnJlZClcbiAgICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnkucmVkKVxuICAgICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMuei5yZWQpXG4gICAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICh0aGlzLnQgJiYgIXRoaXMudC5yZWQpXG4gICAgICB0aGlzLnQgPSB0aGlzLnQudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIHRoaXMuek9uZSA9IHRoaXMueiA9PT0gdGhpcy5jdXJ2ZS5vbmU7XG5cbiAgICAvLyBVc2UgZXh0ZW5kZWQgY29vcmRpbmF0ZXNcbiAgICBpZiAodGhpcy5jdXJ2ZS5leHRlbmRlZCAmJiAhdGhpcy50KSB7XG4gICAgICB0aGlzLnQgPSB0aGlzLngucmVkTXVsKHRoaXMueSk7XG4gICAgICBpZiAoIXRoaXMuek9uZSlcbiAgICAgICAgdGhpcy50ID0gdGhpcy50LnJlZE11bCh0aGlzLnoucmVkSW52bSgpKTtcbiAgICB9XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqKSB7XG4gIHJldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLCBvYmopO1xufTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHksIHosIHQpIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB5LCB6LCB0KTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaikge1xuICByZXR1cm4gbmV3IFBvaW50KGN1cnZlLCBvYmpbMF0sIG9ialsxXSwgb2JqWzJdKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMueC5jbXBuKDApID09PSAwICYmXG4gICAgKHRoaXMueS5jbXAodGhpcy56KSA9PT0gMCB8fFxuICAgICh0aGlzLnpPbmUgJiYgdGhpcy55LmNtcCh0aGlzLmN1cnZlLmMpID09PSAwKSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX2V4dERibCA9IGZ1bmN0aW9uIF9leHREYmwoKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA4LWh3Y2RcbiAgLy8gNE0gKyA0U1xuXG4gIC8vIEEgPSBYMV4yXG4gIHZhciBhID0gdGhpcy54LnJlZFNxcigpO1xuICAvLyBCID0gWTFeMlxuICB2YXIgYiA9IHRoaXMueS5yZWRTcXIoKTtcbiAgLy8gQyA9IDIgKiBaMV4yXG4gIHZhciBjID0gdGhpcy56LnJlZFNxcigpO1xuICBjID0gYy5yZWRJQWRkKGMpO1xuICAvLyBEID0gYSAqIEFcbiAgdmFyIGQgPSB0aGlzLmN1cnZlLl9tdWxBKGEpO1xuICAvLyBFID0gKFgxICsgWTEpXjIgLSBBIC0gQlxuICB2YXIgZSA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKS5yZWRJU3ViKGEpLnJlZElTdWIoYik7XG4gIC8vIEcgPSBEICsgQlxuICB2YXIgZyA9IGQucmVkQWRkKGIpO1xuICAvLyBGID0gRyAtIENcbiAgdmFyIGYgPSBnLnJlZFN1YihjKTtcbiAgLy8gSCA9IEQgLSBCXG4gIHZhciBoID0gZC5yZWRTdWIoYik7XG4gIC8vIFgzID0gRSAqIEZcbiAgdmFyIG54ID0gZS5yZWRNdWwoZik7XG4gIC8vIFkzID0gRyAqIEhcbiAgdmFyIG55ID0gZy5yZWRNdWwoaCk7XG4gIC8vIFQzID0gRSAqIEhcbiAgdmFyIG50ID0gZS5yZWRNdWwoaCk7XG4gIC8vIFozID0gRiAqIEdcbiAgdmFyIG56ID0gZi5yZWRNdWwoZyk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnosIG50KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fcHJvakRibCA9IGZ1bmN0aW9uIF9wcm9qRGJsKCkge1xuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1wcm9qZWN0aXZlLmh0bWxcbiAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOC1iYmpscFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA3LWJsXG4gIC8vIGFuZCBvdGhlcnNcbiAgLy8gR2VuZXJhbGx5IDNNICsgNFMgb3IgMk0gKyA0U1xuXG4gIC8vIEIgPSAoWDEgKyBZMSleMlxuICB2YXIgYiA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKTtcbiAgLy8gQyA9IFgxXjJcbiAgdmFyIGMgPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIEQgPSBZMV4yXG4gIHZhciBkID0gdGhpcy55LnJlZFNxcigpO1xuXG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIHZhciBlO1xuICB2YXIgaDtcbiAgdmFyIGo7XG4gIGlmICh0aGlzLmN1cnZlLnR3aXN0ZWQpIHtcbiAgICAvLyBFID0gYSAqIENcbiAgICBlID0gdGhpcy5jdXJ2ZS5fbXVsQShjKTtcbiAgICAvLyBGID0gRSArIERcbiAgICB2YXIgZiA9IGUucmVkQWRkKGQpO1xuICAgIGlmICh0aGlzLnpPbmUpIHtcbiAgICAgIC8vIFgzID0gKEIgLSBDIC0gRCkgKiAoRiAtIDIpXG4gICAgICBueCA9IGIucmVkU3ViKGMpLnJlZFN1YihkKS5yZWRNdWwoZi5yZWRTdWIodGhpcy5jdXJ2ZS50d28pKTtcbiAgICAgIC8vIFkzID0gRiAqIChFIC0gRClcbiAgICAgIG55ID0gZi5yZWRNdWwoZS5yZWRTdWIoZCkpO1xuICAgICAgLy8gWjMgPSBGXjIgLSAyICogRlxuICAgICAgbnogPSBmLnJlZFNxcigpLnJlZFN1YihmKS5yZWRTdWIoZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEggPSBaMV4yXG4gICAgICBoID0gdGhpcy56LnJlZFNxcigpO1xuICAgICAgLy8gSiA9IEYgLSAyICogSFxuICAgICAgaiA9IGYucmVkU3ViKGgpLnJlZElTdWIoaCk7XG4gICAgICAvLyBYMyA9IChCLUMtRCkqSlxuICAgICAgbnggPSBiLnJlZFN1YihjKS5yZWRJU3ViKGQpLnJlZE11bChqKTtcbiAgICAgIC8vIFkzID0gRiAqIChFIC0gRClcbiAgICAgIG55ID0gZi5yZWRNdWwoZS5yZWRTdWIoZCkpO1xuICAgICAgLy8gWjMgPSBGICogSlxuICAgICAgbnogPSBmLnJlZE11bChqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRSA9IEMgKyBEXG4gICAgZSA9IGMucmVkQWRkKGQpO1xuICAgIC8vIEggPSAoYyAqIFoxKV4yXG4gICAgaCA9IHRoaXMuY3VydmUuX211bEModGhpcy56KS5yZWRTcXIoKTtcbiAgICAvLyBKID0gRSAtIDIgKiBIXG4gICAgaiA9IGUucmVkU3ViKGgpLnJlZFN1YihoKTtcbiAgICAvLyBYMyA9IGMgKiAoQiAtIEUpICogSlxuICAgIG54ID0gdGhpcy5jdXJ2ZS5fbXVsQyhiLnJlZElTdWIoZSkpLnJlZE11bChqKTtcbiAgICAvLyBZMyA9IGMgKiBFICogKEMgLSBEKVxuICAgIG55ID0gdGhpcy5jdXJ2ZS5fbXVsQyhlKS5yZWRNdWwoYy5yZWRJU3ViKGQpKTtcbiAgICAvLyBaMyA9IEUgKiBKXG4gICAgbnogPSBlLnJlZE11bChqKTtcbiAgfVxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnksIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBEb3VibGUgaW4gZXh0ZW5kZWQgY29vcmRpbmF0ZXNcbiAgaWYgKHRoaXMuY3VydmUuZXh0ZW5kZWQpXG4gICAgcmV0dXJuIHRoaXMuX2V4dERibCgpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX3Byb2pEYmwoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZXh0QWRkID0gZnVuY3Rpb24gX2V4dEFkZChwKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbFxuICAvLyAgICAgI2FkZGl0aW9uLWFkZC0yMDA4LWh3Y2QtM1xuICAvLyA4TVxuXG4gIC8vIEEgPSAoWTEgLSBYMSkgKiAoWTIgLSBYMilcbiAgdmFyIGEgPSB0aGlzLnkucmVkU3ViKHRoaXMueCkucmVkTXVsKHAueS5yZWRTdWIocC54KSk7XG4gIC8vIEIgPSAoWTEgKyBYMSkgKiAoWTIgKyBYMilcbiAgdmFyIGIgPSB0aGlzLnkucmVkQWRkKHRoaXMueCkucmVkTXVsKHAueS5yZWRBZGQocC54KSk7XG4gIC8vIEMgPSBUMSAqIGsgKiBUMlxuICB2YXIgYyA9IHRoaXMudC5yZWRNdWwodGhpcy5jdXJ2ZS5kZCkucmVkTXVsKHAudCk7XG4gIC8vIEQgPSBaMSAqIDIgKiBaMlxuICB2YXIgZCA9IHRoaXMuei5yZWRNdWwocC56LnJlZEFkZChwLnopKTtcbiAgLy8gRSA9IEIgLSBBXG4gIHZhciBlID0gYi5yZWRTdWIoYSk7XG4gIC8vIEYgPSBEIC0gQ1xuICB2YXIgZiA9IGQucmVkU3ViKGMpO1xuICAvLyBHID0gRCArIENcbiAgdmFyIGcgPSBkLnJlZEFkZChjKTtcbiAgLy8gSCA9IEIgKyBBXG4gIHZhciBoID0gYi5yZWRBZGQoYSk7XG4gIC8vIFgzID0gRSAqIEZcbiAgdmFyIG54ID0gZS5yZWRNdWwoZik7XG4gIC8vIFkzID0gRyAqIEhcbiAgdmFyIG55ID0gZy5yZWRNdWwoaCk7XG4gIC8vIFQzID0gRSAqIEhcbiAgdmFyIG50ID0gZS5yZWRNdWwoaCk7XG4gIC8vIFozID0gRiAqIEdcbiAgdmFyIG56ID0gZi5yZWRNdWwoZyk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnosIG50KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fcHJvakFkZCA9IGZ1bmN0aW9uIF9wcm9qQWRkKHApIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtcHJvamVjdGl2ZS5odG1sXG4gIC8vICAgICAjYWRkaXRpb24tYWRkLTIwMDgtYmJqbHBcbiAgLy8gICAgICNhZGRpdGlvbi1hZGQtMjAwNy1ibFxuICAvLyAxME0gKyAxU1xuXG4gIC8vIEEgPSBaMSAqIFoyXG4gIHZhciBhID0gdGhpcy56LnJlZE11bChwLnopO1xuICAvLyBCID0gQV4yXG4gIHZhciBiID0gYS5yZWRTcXIoKTtcbiAgLy8gQyA9IFgxICogWDJcbiAgdmFyIGMgPSB0aGlzLngucmVkTXVsKHAueCk7XG4gIC8vIEQgPSBZMSAqIFkyXG4gIHZhciBkID0gdGhpcy55LnJlZE11bChwLnkpO1xuICAvLyBFID0gZCAqIEMgKiBEXG4gIHZhciBlID0gdGhpcy5jdXJ2ZS5kLnJlZE11bChjKS5yZWRNdWwoZCk7XG4gIC8vIEYgPSBCIC0gRVxuICB2YXIgZiA9IGIucmVkU3ViKGUpO1xuICAvLyBHID0gQiArIEVcbiAgdmFyIGcgPSBiLnJlZEFkZChlKTtcbiAgLy8gWDMgPSBBICogRiAqICgoWDEgKyBZMSkgKiAoWDIgKyBZMikgLSBDIC0gRClcbiAgdmFyIHRtcCA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRNdWwocC54LnJlZEFkZChwLnkpKS5yZWRJU3ViKGMpLnJlZElTdWIoZCk7XG4gIHZhciBueCA9IGEucmVkTXVsKGYpLnJlZE11bCh0bXApO1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgaWYgKHRoaXMuY3VydmUudHdpc3RlZCkge1xuICAgIC8vIFkzID0gQSAqIEcgKiAoRCAtIGEgKiBDKVxuICAgIG55ID0gYS5yZWRNdWwoZykucmVkTXVsKGQucmVkU3ViKHRoaXMuY3VydmUuX211bEEoYykpKTtcbiAgICAvLyBaMyA9IEYgKiBHXG4gICAgbnogPSBmLnJlZE11bChnKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBZMyA9IEEgKiBHICogKEQgLSBDKVxuICAgIG55ID0gYS5yZWRNdWwoZykucmVkTXVsKGQucmVkU3ViKGMpKTtcbiAgICAvLyBaMyA9IGMgKiBGICogR1xuICAgIG56ID0gdGhpcy5jdXJ2ZS5fbXVsQyhmKS5yZWRNdWwoZyk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBwO1xuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKHRoaXMuY3VydmUuZXh0ZW5kZWQpXG4gICAgcmV0dXJuIHRoaXMuX2V4dEFkZChwKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLl9wcm9qQWRkKHApO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIGlmICh0aGlzLl9oYXNEb3VibGVzKGspKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9maXhlZE5hZk11bCh0aGlzLCBrKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZChrMSwgcCwgazIpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgWyB0aGlzLCBwIF0sIFsgazEsIGsyIF0sIDIsIGZhbHNlKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5qbXVsQWRkID0gZnVuY3Rpb24gam11bEFkZChrMSwgcCwgazIpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgWyB0aGlzLCBwIF0sIFsgazEsIGsyIF0sIDIsIHRydWUpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZSgpIHtcbiAgaWYgKHRoaXMuek9uZSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBOb3JtYWxpemUgY29vcmRpbmF0ZXNcbiAgdmFyIHppID0gdGhpcy56LnJlZEludm0oKTtcbiAgdGhpcy54ID0gdGhpcy54LnJlZE11bCh6aSk7XG4gIHRoaXMueSA9IHRoaXMueS5yZWRNdWwoemkpO1xuICBpZiAodGhpcy50KVxuICAgIHRoaXMudCA9IHRoaXMudC5yZWRNdWwoemkpO1xuICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgdGhpcy56T25lID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKCkge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTmVnKCksXG4gICAgdGhpcy55LFxuICAgIHRoaXMueixcbiAgICB0aGlzLnQgJiYgdGhpcy50LnJlZE5lZygpKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgdGhpcy5ub3JtYWxpemUoKTtcbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uIGdldFkoKSB7XG4gIHRoaXMubm9ybWFsaXplKCk7XG4gIHJldHVybiB0aGlzLnkuZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXMgPT09IG90aGVyIHx8XG4gICAgICAgICB0aGlzLmdldFgoKS5jbXAob3RoZXIuZ2V0WCgpKSA9PT0gMCAmJlxuICAgICAgICAgdGhpcy5nZXRZKCkuY21wKG90aGVyLmdldFkoKSkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXFYVG9QID0gZnVuY3Rpb24gZXFYVG9QKHgpIHtcbiAgdmFyIHJ4ID0geC50b1JlZCh0aGlzLmN1cnZlLnJlZCkucmVkTXVsKHRoaXMueik7XG4gIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeGMgPSB4LmNsb25lKCk7XG4gIHZhciB0ID0gdGhpcy5jdXJ2ZS5yZWROLnJlZE11bCh0aGlzLnopO1xuICBmb3IgKDs7KSB7XG4gICAgeGMuaWFkZCh0aGlzLmN1cnZlLm4pO1xuICAgIGlmICh4Yy5jbXAodGhpcy5jdXJ2ZS5wKSA+PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcngucmVkSUFkZCh0KTtcbiAgICBpZiAodGhpcy54LmNtcChyeCkgPT09IDApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuLy8gQ29tcGF0aWJpbGl0eSB3aXRoIEJhc2VDdXJ2ZVxuUG9pbnQucHJvdG90eXBlLnRvUCA9IFBvaW50LnByb3RvdHlwZS5ub3JtYWxpemU7XG5Qb2ludC5wcm90b3R5cGUubWl4ZWRBZGQgPSBQb2ludC5wcm90b3R5cGUuYWRkO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBjdXJ2ZSA9IGV4cG9ydHM7XG5cbmN1cnZlLmJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcbmN1cnZlLnNob3J0ID0gcmVxdWlyZSgnLi9zaG9ydCcpO1xuY3VydmUubW9udCA9IHJlcXVpcmUoJy4vbW9udCcpO1xuY3VydmUuZWR3YXJkcyA9IHJlcXVpcmUoJy4vZWR3YXJkcycpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLmluaGVyaXRzID0gaW5oZXJpdHM7XG5cbmZ1bmN0aW9uIGlzU3Vycm9nYXRlUGFpcihtc2csIGkpIHtcbiAgaWYgKChtc2cuY2hhckNvZGVBdChpKSAmIDB4RkMwMCkgIT09IDB4RDgwMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoaSA8IDAgfHwgaSArIDEgPj0gbXNnLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKG1zZy5jaGFyQ29kZUF0KGkgKyAxKSAmIDB4RkMwMCkgPT09IDB4REMwMDtcbn1cblxuZnVuY3Rpb24gdG9BcnJheShtc2csIGVuYykge1xuICBpZiAoQXJyYXkuaXNBcnJheShtc2cpKVxuICAgIHJldHVybiBtc2cuc2xpY2UoKTtcbiAgaWYgKCFtc2cpXG4gICAgcmV0dXJuIFtdO1xuICB2YXIgcmVzID0gW107XG4gIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJykge1xuICAgIGlmICghZW5jKSB7XG4gICAgICAvLyBJbnNwaXJlZCBieSBzdHJpbmdUb1V0ZjhCeXRlQXJyYXkoKSBpbiBjbG9zdXJlLWxpYnJhcnkgYnkgR29vZ2xlXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtbGlicmFyeS9ibG9iLzg1OThkODcyNDJhZjU5YWFjMjMzMjcwNzQyYzg5ODRlMmIyYmRiZTAvY2xvc3VyZS9nb29nL2NyeXB0L2NyeXB0LmpzI0wxMTctTDE0M1xuICAgICAgLy8gQXBhY2hlIExpY2Vuc2UgMi4wXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtbGlicmFyeS9ibG9iL21hc3Rlci9MSUNFTlNFXG4gICAgICB2YXIgcCA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYyA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoYyA8IDEyOCkge1xuICAgICAgICAgIHJlc1twKytdID0gYztcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMjA0OCkge1xuICAgICAgICAgIHJlc1twKytdID0gKGMgPj4gNikgfCAxOTI7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICAgICAgfSBlbHNlIGlmIChpc1N1cnJvZ2F0ZVBhaXIobXNnLCBpKSkge1xuICAgICAgICAgIGMgPSAweDEwMDAwICsgKChjICYgMHgwM0ZGKSA8PCAxMCkgKyAobXNnLmNoYXJDb2RlQXQoKytpKSAmIDB4MDNGRik7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyA+PiAxOCkgfCAyNDA7XG4gICAgICAgICAgcmVzW3ArK10gPSAoKGMgPj4gMTIpICYgNjMpIHwgMTI4O1xuICAgICAgICAgIHJlc1twKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xuICAgICAgICAgIHJlc1twKytdID0gKGMgJiA2MykgfCAxMjg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyA+PiAxMikgfCAyMjQ7XG4gICAgICAgICAgcmVzW3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5jID09PSAnaGV4Jykge1xuICAgICAgbXNnID0gbXNnLnJlcGxhY2UoL1teYS16MC05XSsvaWcsICcnKTtcbiAgICAgIGlmIChtc2cubGVuZ3RoICUgMiAhPT0gMClcbiAgICAgICAgbXNnID0gJzAnICsgbXNnO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgcmVzLnB1c2gocGFyc2VJbnQobXNnW2ldICsgbXNnW2kgKyAxXSwgMTYpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICAgIHJlc1tpXSA9IG1zZ1tpXSB8IDA7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9BcnJheSA9IHRvQXJyYXk7XG5cbmZ1bmN0aW9uIHRvSGV4KG1zZykge1xuICB2YXIgcmVzID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgIHJlcyArPSB6ZXJvMihtc2dbaV0udG9TdHJpbmcoMTYpKTtcbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9IZXggPSB0b0hleDtcblxuZnVuY3Rpb24gaHRvbmwodykge1xuICB2YXIgcmVzID0gKHcgPj4+IDI0KSB8XG4gICAgICAgICAgICAoKHcgPj4+IDgpICYgMHhmZjAwKSB8XG4gICAgICAgICAgICAoKHcgPDwgOCkgJiAweGZmMDAwMCkgfFxuICAgICAgICAgICAgKCh3ICYgMHhmZikgPDwgMjQpO1xuICByZXR1cm4gcmVzID4+PiAwO1xufVxuZXhwb3J0cy5odG9ubCA9IGh0b25sO1xuXG5mdW5jdGlvbiB0b0hleDMyKG1zZywgZW5kaWFuKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdyA9IG1zZ1tpXTtcbiAgICBpZiAoZW5kaWFuID09PSAnbGl0dGxlJylcbiAgICAgIHcgPSBodG9ubCh3KTtcbiAgICByZXMgKz0gemVybzgody50b1N0cmluZygxNikpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5leHBvcnRzLnRvSGV4MzIgPSB0b0hleDMyO1xuXG5mdW5jdGlvbiB6ZXJvMih3b3JkKSB7XG4gIGlmICh3b3JkLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gJzAnICsgd29yZDtcbiAgZWxzZVxuICAgIHJldHVybiB3b3JkO1xufVxuZXhwb3J0cy56ZXJvMiA9IHplcm8yO1xuXG5mdW5jdGlvbiB6ZXJvOCh3b3JkKSB7XG4gIGlmICh3b3JkLmxlbmd0aCA9PT0gNylcbiAgICByZXR1cm4gJzAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDYpXG4gICAgcmV0dXJuICcwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNSlcbiAgICByZXR1cm4gJzAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNClcbiAgICByZXR1cm4gJzAwMDAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDMpXG4gICAgcmV0dXJuICcwMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMilcbiAgICByZXR1cm4gJzAwMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gJzAwMDAwMDAnICsgd29yZDtcbiAgZWxzZVxuICAgIHJldHVybiB3b3JkO1xufVxuZXhwb3J0cy56ZXJvOCA9IHplcm84O1xuXG5mdW5jdGlvbiBqb2luMzIobXNnLCBzdGFydCwgZW5kLCBlbmRpYW4pIHtcbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0O1xuICBhc3NlcnQobGVuICUgNCA9PT0gMCk7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobGVuIC8gNCk7XG4gIGZvciAodmFyIGkgPSAwLCBrID0gc3RhcnQ7IGkgPCByZXMubGVuZ3RoOyBpKyssIGsgKz0gNCkge1xuICAgIHZhciB3O1xuICAgIGlmIChlbmRpYW4gPT09ICdiaWcnKVxuICAgICAgdyA9IChtc2dba10gPDwgMjQpIHwgKG1zZ1trICsgMV0gPDwgMTYpIHwgKG1zZ1trICsgMl0gPDwgOCkgfCBtc2dbayArIDNdO1xuICAgIGVsc2VcbiAgICAgIHcgPSAobXNnW2sgKyAzXSA8PCAyNCkgfCAobXNnW2sgKyAyXSA8PCAxNikgfCAobXNnW2sgKyAxXSA8PCA4KSB8IG1zZ1trXTtcbiAgICByZXNbaV0gPSB3ID4+PiAwO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5leHBvcnRzLmpvaW4zMiA9IGpvaW4zMjtcblxuZnVuY3Rpb24gc3BsaXQzMihtc2csIGVuZGlhbikge1xuICB2YXIgcmVzID0gbmV3IEFycmF5KG1zZy5sZW5ndGggKiA0KTtcbiAgZm9yICh2YXIgaSA9IDAsIGsgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrLCBrICs9IDQpIHtcbiAgICB2YXIgbSA9IG1zZ1tpXTtcbiAgICBpZiAoZW5kaWFuID09PSAnYmlnJykge1xuICAgICAgcmVzW2tdID0gbSA+Pj4gMjQ7XG4gICAgICByZXNbayArIDFdID0gKG0gPj4+IDE2KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDJdID0gKG0gPj4+IDgpICYgMHhmZjtcbiAgICAgIHJlc1trICsgM10gPSBtICYgMHhmZjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzW2sgKyAzXSA9IG0gPj4+IDI0O1xuICAgICAgcmVzW2sgKyAyXSA9IChtID4+PiAxNikgJiAweGZmO1xuICAgICAgcmVzW2sgKyAxXSA9IChtID4+PiA4KSAmIDB4ZmY7XG4gICAgICByZXNba10gPSBtICYgMHhmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuc3BsaXQzMiA9IHNwbGl0MzI7XG5cbmZ1bmN0aW9uIHJvdHIzMih3LCBiKSB7XG4gIHJldHVybiAodyA+Pj4gYikgfCAodyA8PCAoMzIgLSBiKSk7XG59XG5leHBvcnRzLnJvdHIzMiA9IHJvdHIzMjtcblxuZnVuY3Rpb24gcm90bDMyKHcsIGIpIHtcbiAgcmV0dXJuICh3IDw8IGIpIHwgKHcgPj4+ICgzMiAtIGIpKTtcbn1cbmV4cG9ydHMucm90bDMyID0gcm90bDMyO1xuXG5mdW5jdGlvbiBzdW0zMihhLCBiKSB7XG4gIHJldHVybiAoYSArIGIpID4+PiAwO1xufVxuZXhwb3J0cy5zdW0zMiA9IHN1bTMyO1xuXG5mdW5jdGlvbiBzdW0zMl8zKGEsIGIsIGMpIHtcbiAgcmV0dXJuIChhICsgYiArIGMpID4+PiAwO1xufVxuZXhwb3J0cy5zdW0zMl8zID0gc3VtMzJfMztcblxuZnVuY3Rpb24gc3VtMzJfNChhLCBiLCBjLCBkKSB7XG4gIHJldHVybiAoYSArIGIgKyBjICsgZCkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzQgPSBzdW0zMl80O1xuXG5mdW5jdGlvbiBzdW0zMl81KGEsIGIsIGMsIGQsIGUpIHtcbiAgcmV0dXJuIChhICsgYiArIGMgKyBkICsgZSkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzUgPSBzdW0zMl81O1xuXG5mdW5jdGlvbiBzdW02NChidWYsIHBvcywgYWgsIGFsKSB7XG4gIHZhciBiaCA9IGJ1Zltwb3NdO1xuICB2YXIgYmwgPSBidWZbcG9zICsgMV07XG5cbiAgdmFyIGxvID0gKGFsICsgYmwpID4+PiAwO1xuICB2YXIgaGkgPSAobG8gPCBhbCA/IDEgOiAwKSArIGFoICsgYmg7XG4gIGJ1Zltwb3NdID0gaGkgPj4+IDA7XG4gIGJ1Zltwb3MgKyAxXSA9IGxvO1xufVxuZXhwb3J0cy5zdW02NCA9IHN1bTY0O1xuXG5mdW5jdGlvbiBzdW02NF9oaShhaCwgYWwsIGJoLCBibCkge1xuICB2YXIgbG8gPSAoYWwgKyBibCkgPj4+IDA7XG4gIHZhciBoaSA9IChsbyA8IGFsID8gMSA6IDApICsgYWggKyBiaDtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF9oaSA9IHN1bTY0X2hpO1xuXG5mdW5jdGlvbiBzdW02NF9sbyhhaCwgYWwsIGJoLCBibCkge1xuICB2YXIgbG8gPSBhbCArIGJsO1xuICByZXR1cm4gbG8gPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0X2xvID0gc3VtNjRfbG87XG5cbmZ1bmN0aW9uIHN1bTY0XzRfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIHZhciBsbyA9IGFsO1xuICBsbyA9IChsbyArIGJsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBhbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGNsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBjbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGRsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBkbCA/IDEgOiAwO1xuXG4gIHZhciBoaSA9IGFoICsgYmggKyBjaCArIGRoICsgY2Fycnk7XG4gIHJldHVybiBoaSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNF9oaSA9IHN1bTY0XzRfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0XzRfbG8oYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsKSB7XG4gIHZhciBsbyA9IGFsICsgYmwgKyBjbCArIGRsO1xuICByZXR1cm4gbG8gPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzRfbG8gPSBzdW02NF80X2xvO1xuXG5mdW5jdGlvbiBzdW02NF81X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCwgZWgsIGVsKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIHZhciBsbyA9IGFsO1xuICBsbyA9IChsbyArIGJsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBhbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGNsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBjbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGRsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBkbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGVsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBlbCA/IDEgOiAwO1xuXG4gIHZhciBoaSA9IGFoICsgYmggKyBjaCArIGRoICsgZWggKyBjYXJyeTtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF81X2hpID0gc3VtNjRfNV9oaTtcblxuZnVuY3Rpb24gc3VtNjRfNV9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwsIGVoLCBlbCkge1xuICB2YXIgbG8gPSBhbCArIGJsICsgY2wgKyBkbCArIGVsO1xuXG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNV9sbyA9IHN1bTY0XzVfbG87XG5cbmZ1bmN0aW9uIHJvdHI2NF9oaShhaCwgYWwsIG51bSkge1xuICB2YXIgciA9IChhbCA8PCAoMzIgLSBudW0pKSB8IChhaCA+Pj4gbnVtKTtcbiAgcmV0dXJuIHIgPj4+IDA7XG59XG5leHBvcnRzLnJvdHI2NF9oaSA9IHJvdHI2NF9oaTtcblxuZnVuY3Rpb24gcm90cjY0X2xvKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFoIDw8ICgzMiAtIG51bSkpIHwgKGFsID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn1cbmV4cG9ydHMucm90cjY0X2xvID0gcm90cjY0X2xvO1xuXG5mdW5jdGlvbiBzaHI2NF9oaShhaCwgYWwsIG51bSkge1xuICByZXR1cm4gYWggPj4+IG51bTtcbn1cbmV4cG9ydHMuc2hyNjRfaGkgPSBzaHI2NF9oaTtcblxuZnVuY3Rpb24gc2hyNjRfbG8oYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWggPDwgKDMyIC0gbnVtKSkgfCAoYWwgPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufVxuZXhwb3J0cy5zaHI2NF9sbyA9IHNocjY0X2xvO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbmZ1bmN0aW9uIEJsb2NrSGFzaCgpIHtcbiAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nVG90YWwgPSAwO1xuICB0aGlzLmJsb2NrU2l6ZSA9IHRoaXMuY29uc3RydWN0b3IuYmxvY2tTaXplO1xuICB0aGlzLm91dFNpemUgPSB0aGlzLmNvbnN0cnVjdG9yLm91dFNpemU7XG4gIHRoaXMuaG1hY1N0cmVuZ3RoID0gdGhpcy5jb25zdHJ1Y3Rvci5obWFjU3RyZW5ndGg7XG4gIHRoaXMucGFkTGVuZ3RoID0gdGhpcy5jb25zdHJ1Y3Rvci5wYWRMZW5ndGggLyA4O1xuICB0aGlzLmVuZGlhbiA9ICdiaWcnO1xuXG4gIHRoaXMuX2RlbHRhOCA9IHRoaXMuYmxvY2tTaXplIC8gODtcbiAgdGhpcy5fZGVsdGEzMiA9IHRoaXMuYmxvY2tTaXplIC8gMzI7XG59XG5leHBvcnRzLkJsb2NrSGFzaCA9IEJsb2NrSGFzaDtcblxuQmxvY2tIYXNoLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUobXNnLCBlbmMpIHtcbiAgLy8gQ29udmVydCBtZXNzYWdlIHRvIGFycmF5LCBwYWQgaXQsIGFuZCBqb2luIGludG8gMzJiaXQgYmxvY2tzXG4gIG1zZyA9IHV0aWxzLnRvQXJyYXkobXNnLCBlbmMpO1xuICBpZiAoIXRoaXMucGVuZGluZylcbiAgICB0aGlzLnBlbmRpbmcgPSBtc2c7XG4gIGVsc2VcbiAgICB0aGlzLnBlbmRpbmcgPSB0aGlzLnBlbmRpbmcuY29uY2F0KG1zZyk7XG4gIHRoaXMucGVuZGluZ1RvdGFsICs9IG1zZy5sZW5ndGg7XG5cbiAgLy8gRW5vdWdoIGRhdGEsIHRyeSB1cGRhdGluZ1xuICBpZiAodGhpcy5wZW5kaW5nLmxlbmd0aCA+PSB0aGlzLl9kZWx0YTgpIHtcbiAgICBtc2cgPSB0aGlzLnBlbmRpbmc7XG5cbiAgICAvLyBQcm9jZXNzIHBlbmRpbmcgZGF0YSBpbiBibG9ja3NcbiAgICB2YXIgciA9IG1zZy5sZW5ndGggJSB0aGlzLl9kZWx0YTg7XG4gICAgdGhpcy5wZW5kaW5nID0gbXNnLnNsaWNlKG1zZy5sZW5ndGggLSByLCBtc2cubGVuZ3RoKTtcbiAgICBpZiAodGhpcy5wZW5kaW5nLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG5cbiAgICBtc2cgPSB1dGlscy5qb2luMzIobXNnLCAwLCBtc2cubGVuZ3RoIC0gciwgdGhpcy5lbmRpYW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSB0aGlzLl9kZWx0YTMyKVxuICAgICAgdGhpcy5fdXBkYXRlKG1zZywgaSwgaSArIHRoaXMuX2RlbHRhMzIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5CbG9ja0hhc2gucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgdGhpcy51cGRhdGUodGhpcy5fcGFkKCkpO1xuICBhc3NlcnQodGhpcy5wZW5kaW5nID09PSBudWxsKTtcblxuICByZXR1cm4gdGhpcy5fZGlnZXN0KGVuYyk7XG59O1xuXG5CbG9ja0hhc2gucHJvdG90eXBlLl9wYWQgPSBmdW5jdGlvbiBwYWQoKSB7XG4gIHZhciBsZW4gPSB0aGlzLnBlbmRpbmdUb3RhbDtcbiAgdmFyIGJ5dGVzID0gdGhpcy5fZGVsdGE4O1xuICB2YXIgayA9IGJ5dGVzIC0gKChsZW4gKyB0aGlzLnBhZExlbmd0aCkgJSBieXRlcyk7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkoayArIHRoaXMucGFkTGVuZ3RoKTtcbiAgcmVzWzBdID0gMHg4MDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBrOyBpKyspXG4gICAgcmVzW2ldID0gMDtcblxuICAvLyBBcHBlbmQgbGVuZ3RoXG4gIGxlbiA8PD0gMztcbiAgaWYgKHRoaXMuZW5kaWFuID09PSAnYmlnJykge1xuICAgIGZvciAodmFyIHQgPSA4OyB0IDwgdGhpcy5wYWRMZW5ndGg7IHQrKylcbiAgICAgIHJlc1tpKytdID0gMDtcblxuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDI0KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAxNikgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gOCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gbGVuICYgMHhmZjtcbiAgfSBlbHNlIHtcbiAgICByZXNbaSsrXSA9IGxlbiAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiA4KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAxNikgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMjQpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG5cbiAgICBmb3IgKHQgPSA4OyB0IDwgdGhpcy5wYWRMZW5ndGg7IHQrKylcbiAgICAgIHJlc1tpKytdID0gMDtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgcm90cjMyID0gdXRpbHMucm90cjMyO1xuXG5mdW5jdGlvbiBmdF8xKHMsIHgsIHksIHopIHtcbiAgaWYgKHMgPT09IDApXG4gICAgcmV0dXJuIGNoMzIoeCwgeSwgeik7XG4gIGlmIChzID09PSAxIHx8IHMgPT09IDMpXG4gICAgcmV0dXJuIHAzMih4LCB5LCB6KTtcbiAgaWYgKHMgPT09IDIpXG4gICAgcmV0dXJuIG1hajMyKHgsIHksIHopO1xufVxuZXhwb3J0cy5mdF8xID0gZnRfMTtcblxuZnVuY3Rpb24gY2gzMih4LCB5LCB6KSB7XG4gIHJldHVybiAoeCAmIHkpIF4gKCh+eCkgJiB6KTtcbn1cbmV4cG9ydHMuY2gzMiA9IGNoMzI7XG5cbmZ1bmN0aW9uIG1hajMyKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgXiAoeCAmIHopIF4gKHkgJiB6KTtcbn1cbmV4cG9ydHMubWFqMzIgPSBtYWozMjtcblxuZnVuY3Rpb24gcDMyKHgsIHksIHopIHtcbiAgcmV0dXJuIHggXiB5IF4gejtcbn1cbmV4cG9ydHMucDMyID0gcDMyO1xuXG5mdW5jdGlvbiBzMF8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDIpIF4gcm90cjMyKHgsIDEzKSBeIHJvdHIzMih4LCAyMik7XG59XG5leHBvcnRzLnMwXzI1NiA9IHMwXzI1NjtcblxuZnVuY3Rpb24gczFfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCA2KSBeIHJvdHIzMih4LCAxMSkgXiByb3RyMzIoeCwgMjUpO1xufVxuZXhwb3J0cy5zMV8yNTYgPSBzMV8yNTY7XG5cbmZ1bmN0aW9uIGcwXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgNykgXiByb3RyMzIoeCwgMTgpIF4gKHggPj4+IDMpO1xufVxuZXhwb3J0cy5nMF8yNTYgPSBnMF8yNTY7XG5cbmZ1bmN0aW9uIGcxXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgMTcpIF4gcm90cjMyKHgsIDE5KSBeICh4ID4+PiAxMCk7XG59XG5leHBvcnRzLmcxXzI1NiA9IGcxXzI1NjtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIHNoYUNvbW1vbiA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cbnZhciByb3RsMzIgPSB1dGlscy5yb3RsMzI7XG52YXIgc3VtMzIgPSB1dGlscy5zdW0zMjtcbnZhciBzdW0zMl81ID0gdXRpbHMuc3VtMzJfNTtcbnZhciBmdF8xID0gc2hhQ29tbW9uLmZ0XzE7XG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxudmFyIHNoYTFfSyA9IFtcbiAgMHg1QTgyNzk5OSwgMHg2RUQ5RUJBMSxcbiAgMHg4RjFCQkNEQywgMHhDQTYyQzFENlxuXTtcblxuZnVuY3Rpb24gU0hBMSgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTEpKVxuICAgIHJldHVybiBuZXcgU0hBMSgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSxcbiAgICAweDEwMzI1NDc2LCAweGMzZDJlMWYwIF07XG4gIHRoaXMuVyA9IG5ldyBBcnJheSg4MCk7XG59XG5cbnV0aWxzLmluaGVyaXRzKFNIQTEsIEJsb2NrSGFzaCk7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTE7XG5cblNIQTEuYmxvY2tTaXplID0gNTEyO1xuU0hBMS5vdXRTaXplID0gMTYwO1xuU0hBMS5obWFjU3RyZW5ndGggPSA4MDtcblNIQTEucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcblxuICBmb3IoOyBpIDwgVy5sZW5ndGg7IGkrKylcbiAgICBXW2ldID0gcm90bDMyKFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl0sIDEpO1xuXG4gIHZhciBhID0gdGhpcy5oWzBdO1xuICB2YXIgYiA9IHRoaXMuaFsxXTtcbiAgdmFyIGMgPSB0aGlzLmhbMl07XG4gIHZhciBkID0gdGhpcy5oWzNdO1xuICB2YXIgZSA9IHRoaXMuaFs0XTtcblxuICBmb3IgKGkgPSAwOyBpIDwgVy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzID0gfn4oaSAvIDIwKTtcbiAgICB2YXIgdCA9IHN1bTMyXzUocm90bDMyKGEsIDUpLCBmdF8xKHMsIGIsIGMsIGQpLCBlLCBXW2ldLCBzaGExX0tbc10pO1xuICAgIGUgPSBkO1xuICAgIGQgPSBjO1xuICAgIGMgPSByb3RsMzIoYiwgMzApO1xuICAgIGIgPSBhO1xuICAgIGEgPSB0O1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbn07XG5cblNIQTEucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgc2hhQ29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbnZhciBzdW0zMiA9IHV0aWxzLnN1bTMyO1xudmFyIHN1bTMyXzQgPSB1dGlscy5zdW0zMl80O1xudmFyIHN1bTMyXzUgPSB1dGlscy5zdW0zMl81O1xudmFyIGNoMzIgPSBzaGFDb21tb24uY2gzMjtcbnZhciBtYWozMiA9IHNoYUNvbW1vbi5tYWozMjtcbnZhciBzMF8yNTYgPSBzaGFDb21tb24uczBfMjU2O1xudmFyIHMxXzI1NiA9IHNoYUNvbW1vbi5zMV8yNTY7XG52YXIgZzBfMjU2ID0gc2hhQ29tbW9uLmcwXzI1NjtcbnZhciBnMV8yNTYgPSBzaGFDb21tb24uZzFfMjU2O1xuXG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxudmFyIHNoYTI1Nl9LID0gW1xuICAweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1LFxuICAweDM5NTZjMjViLCAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LFxuICAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLFxuICAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0LFxuICAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LCAweDBmYzE5ZGM2LCAweDI0MGNhMWNjLFxuICAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAweDc2Zjk4OGRhLFxuICAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LFxuICAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LCAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LFxuICAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLFxuICAweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1LFxuICAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLFxuICAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLFxuICAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LFxuICAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLFxuICAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0Yzg3ODE0LCAweDhjYzcwMjA4LFxuICAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyXG5dO1xuXG5mdW5jdGlvbiBTSEEyNTYoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEyNTYpKVxuICAgIHJldHVybiBuZXcgU0hBMjU2KCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweDZhMDllNjY3LCAweGJiNjdhZTg1LCAweDNjNmVmMzcyLCAweGE1NGZmNTNhLFxuICAgIDB4NTEwZTUyN2YsIDB4OWIwNTY4OGMsIDB4MWY4M2Q5YWIsIDB4NWJlMGNkMTlcbiAgXTtcbiAgdGhpcy5rID0gc2hhMjU2X0s7XG4gIHRoaXMuVyA9IG5ldyBBcnJheSg2NCk7XG59XG51dGlscy5pbmhlcml0cyhTSEEyNTYsIEJsb2NrSGFzaCk7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTI1NjtcblxuU0hBMjU2LmJsb2NrU2l6ZSA9IDUxMjtcblNIQTI1Ni5vdXRTaXplID0gMjU2O1xuU0hBMjU2LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTI1Ni5wYWRMZW5ndGggPSA2NDtcblxuU0hBMjU2LnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBXID0gdGhpcy5XO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG4gIGZvciAoOyBpIDwgVy5sZW5ndGg7IGkrKylcbiAgICBXW2ldID0gc3VtMzJfNChnMV8yNTYoV1tpIC0gMl0pLCBXW2kgLSA3XSwgZzBfMjU2KFdbaSAtIDE1XSksIFdbaSAtIDE2XSk7XG5cbiAgdmFyIGEgPSB0aGlzLmhbMF07XG4gIHZhciBiID0gdGhpcy5oWzFdO1xuICB2YXIgYyA9IHRoaXMuaFsyXTtcbiAgdmFyIGQgPSB0aGlzLmhbM107XG4gIHZhciBlID0gdGhpcy5oWzRdO1xuICB2YXIgZiA9IHRoaXMuaFs1XTtcbiAgdmFyIGcgPSB0aGlzLmhbNl07XG4gIHZhciBoID0gdGhpcy5oWzddO1xuXG4gIGFzc2VydCh0aGlzLmsubGVuZ3RoID09PSBXLmxlbmd0aCk7XG4gIGZvciAoaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIFQxID0gc3VtMzJfNShoLCBzMV8yNTYoZSksIGNoMzIoZSwgZiwgZyksIHRoaXMua1tpXSwgV1tpXSk7XG4gICAgdmFyIFQyID0gc3VtMzIoczBfMjU2KGEpLCBtYWozMihhLCBiLCBjKSk7XG4gICAgaCA9IGc7XG4gICAgZyA9IGY7XG4gICAgZiA9IGU7XG4gICAgZSA9IHN1bTMyKGQsIFQxKTtcbiAgICBkID0gYztcbiAgICBjID0gYjtcbiAgICBiID0gYTtcbiAgICBhID0gc3VtMzIoVDEsIFQyKTtcbiAgfVxuXG4gIHRoaXMuaFswXSA9IHN1bTMyKHRoaXMuaFswXSwgYSk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyKHRoaXMuaFsxXSwgYik7XG4gIHRoaXMuaFsyXSA9IHN1bTMyKHRoaXMuaFsyXSwgYyk7XG4gIHRoaXMuaFszXSA9IHN1bTMyKHRoaXMuaFszXSwgZCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyKHRoaXMuaFs0XSwgZSk7XG4gIHRoaXMuaFs1XSA9IHN1bTMyKHRoaXMuaFs1XSwgZik7XG4gIHRoaXMuaFs2XSA9IHN1bTMyKHRoaXMuaFs2XSwgZyk7XG4gIHRoaXMuaFs3XSA9IHN1bTMyKHRoaXMuaFs3XSwgaCk7XG59O1xuXG5TSEEyNTYucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgU0hBMjU2ID0gcmVxdWlyZSgnLi8yNTYnKTtcblxuZnVuY3Rpb24gU0hBMjI0KCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBMjI0KSlcbiAgICByZXR1cm4gbmV3IFNIQTIyNCgpO1xuXG4gIFNIQTI1Ni5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHhjMTA1OWVkOCwgMHgzNjdjZDUwNywgMHgzMDcwZGQxNywgMHhmNzBlNTkzOSxcbiAgICAweGZmYzAwYjMxLCAweDY4NTgxNTExLCAweDY0Zjk4ZmE3LCAweGJlZmE0ZmE0IF07XG59XG51dGlscy5pbmhlcml0cyhTSEEyMjQsIFNIQTI1Nik7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTIyNDtcblxuU0hBMjI0LmJsb2NrU2l6ZSA9IDUxMjtcblNIQTIyNC5vdXRTaXplID0gMjI0O1xuU0hBMjI0LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTIyNC5wYWRMZW5ndGggPSA2NDtcblxuU0hBMjI0LnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICAvLyBKdXN0IHRydW5jYXRlIG91dHB1dFxuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmguc2xpY2UoMCwgNyksICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaC5zbGljZSgwLCA3KSwgJ2JpZycpO1xufTtcblxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG52YXIgcm90cjY0X2hpID0gdXRpbHMucm90cjY0X2hpO1xudmFyIHJvdHI2NF9sbyA9IHV0aWxzLnJvdHI2NF9sbztcbnZhciBzaHI2NF9oaSA9IHV0aWxzLnNocjY0X2hpO1xudmFyIHNocjY0X2xvID0gdXRpbHMuc2hyNjRfbG87XG52YXIgc3VtNjQgPSB1dGlscy5zdW02NDtcbnZhciBzdW02NF9oaSA9IHV0aWxzLnN1bTY0X2hpO1xudmFyIHN1bTY0X2xvID0gdXRpbHMuc3VtNjRfbG87XG52YXIgc3VtNjRfNF9oaSA9IHV0aWxzLnN1bTY0XzRfaGk7XG52YXIgc3VtNjRfNF9sbyA9IHV0aWxzLnN1bTY0XzRfbG87XG52YXIgc3VtNjRfNV9oaSA9IHV0aWxzLnN1bTY0XzVfaGk7XG52YXIgc3VtNjRfNV9sbyA9IHV0aWxzLnN1bTY0XzVfbG87XG5cbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG52YXIgc2hhNTEyX0sgPSBbXG4gIDB4NDI4YTJmOTgsIDB4ZDcyOGFlMjIsIDB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2QsXG4gIDB4YjVjMGZiY2YsIDB4ZWM0ZDNiMmYsIDB4ZTliNWRiYTUsIDB4ODE4OWRiYmMsXG4gIDB4Mzk1NmMyNWIsIDB4ZjM0OGI1MzgsIDB4NTlmMTExZjEsIDB4YjYwNWQwMTksXG4gIDB4OTIzZjgyYTQsIDB4YWYxOTRmOWIsIDB4YWIxYzVlZDUsIDB4ZGE2ZDgxMTgsXG4gIDB4ZDgwN2FhOTgsIDB4YTMwMzAyNDIsIDB4MTI4MzViMDEsIDB4NDU3MDZmYmUsXG4gIDB4MjQzMTg1YmUsIDB4NGVlNGIyOGMsIDB4NTUwYzdkYzMsIDB4ZDVmZmI0ZTIsXG4gIDB4NzJiZTVkNzQsIDB4ZjI3Yjg5NmYsIDB4ODBkZWIxZmUsIDB4M2IxNjk2YjEsXG4gIDB4OWJkYzA2YTcsIDB4MjVjNzEyMzUsIDB4YzE5YmYxNzQsIDB4Y2Y2OTI2OTQsXG4gIDB4ZTQ5YjY5YzEsIDB4OWVmMTRhZDIsIDB4ZWZiZTQ3ODYsIDB4Mzg0ZjI1ZTMsXG4gIDB4MGZjMTlkYzYsIDB4OGI4Y2Q1YjUsIDB4MjQwY2ExY2MsIDB4NzdhYzljNjUsXG4gIDB4MmRlOTJjNmYsIDB4NTkyYjAyNzUsIDB4NGE3NDg0YWEsIDB4NmVhNmU0ODMsXG4gIDB4NWNiMGE5ZGMsIDB4YmQ0MWZiZDQsIDB4NzZmOTg4ZGEsIDB4ODMxMTUzYjUsXG4gIDB4OTgzZTUxNTIsIDB4ZWU2NmRmYWIsIDB4YTgzMWM2NmQsIDB4MmRiNDMyMTAsXG4gIDB4YjAwMzI3YzgsIDB4OThmYjIxM2YsIDB4YmY1OTdmYzcsIDB4YmVlZjBlZTQsXG4gIDB4YzZlMDBiZjMsIDB4M2RhODhmYzIsIDB4ZDVhNzkxNDcsIDB4OTMwYWE3MjUsXG4gIDB4MDZjYTYzNTEsIDB4ZTAwMzgyNmYsIDB4MTQyOTI5NjcsIDB4MGEwZTZlNzAsXG4gIDB4MjdiNzBhODUsIDB4NDZkMjJmZmMsIDB4MmUxYjIxMzgsIDB4NWMyNmM5MjYsXG4gIDB4NGQyYzZkZmMsIDB4NWFjNDJhZWQsIDB4NTMzODBkMTMsIDB4OWQ5NWIzZGYsXG4gIDB4NjUwYTczNTQsIDB4OGJhZjYzZGUsIDB4NzY2YTBhYmIsIDB4M2M3N2IyYTgsXG4gIDB4ODFjMmM5MmUsIDB4NDdlZGFlZTYsIDB4OTI3MjJjODUsIDB4MTQ4MjM1M2IsXG4gIDB4YTJiZmU4YTEsIDB4NGNmMTAzNjQsIDB4YTgxYTY2NGIsIDB4YmM0MjMwMDEsXG4gIDB4YzI0YjhiNzAsIDB4ZDBmODk3OTEsIDB4Yzc2YzUxYTMsIDB4MDY1NGJlMzAsXG4gIDB4ZDE5MmU4MTksIDB4ZDZlZjUyMTgsIDB4ZDY5OTA2MjQsIDB4NTU2NWE5MTAsXG4gIDB4ZjQwZTM1ODUsIDB4NTc3MTIwMmEsIDB4MTA2YWEwNzAsIDB4MzJiYmQxYjgsXG4gIDB4MTlhNGMxMTYsIDB4YjhkMmQwYzgsIDB4MWUzNzZjMDgsIDB4NTE0MWFiNTMsXG4gIDB4Mjc0ODc3NGMsIDB4ZGY4ZWViOTksIDB4MzRiMGJjYjUsIDB4ZTE5YjQ4YTgsXG4gIDB4MzkxYzBjYjMsIDB4YzVjOTVhNjMsIDB4NGVkOGFhNGEsIDB4ZTM0MThhY2IsXG4gIDB4NWI5Y2NhNGYsIDB4Nzc2M2UzNzMsIDB4NjgyZTZmZjMsIDB4ZDZiMmI4YTMsXG4gIDB4NzQ4ZjgyZWUsIDB4NWRlZmIyZmMsIDB4NzhhNTYzNmYsIDB4NDMxNzJmNjAsXG4gIDB4ODRjODc4MTQsIDB4YTFmMGFiNzIsIDB4OGNjNzAyMDgsIDB4MWE2NDM5ZWMsXG4gIDB4OTBiZWZmZmEsIDB4MjM2MzFlMjgsIDB4YTQ1MDZjZWIsIDB4ZGU4MmJkZTksXG4gIDB4YmVmOWEzZjcsIDB4YjJjNjc5MTUsIDB4YzY3MTc4ZjIsIDB4ZTM3MjUzMmIsXG4gIDB4Y2EyNzNlY2UsIDB4ZWEyNjYxOWMsIDB4ZDE4NmI4YzcsIDB4MjFjMGMyMDcsXG4gIDB4ZWFkYTdkZDYsIDB4Y2RlMGViMWUsIDB4ZjU3ZDRmN2YsIDB4ZWU2ZWQxNzgsXG4gIDB4MDZmMDY3YWEsIDB4NzIxNzZmYmEsIDB4MGE2MzdkYzUsIDB4YTJjODk4YTYsXG4gIDB4MTEzZjk4MDQsIDB4YmVmOTBkYWUsIDB4MWI3MTBiMzUsIDB4MTMxYzQ3MWIsXG4gIDB4MjhkYjc3ZjUsIDB4MjMwNDdkODQsIDB4MzJjYWFiN2IsIDB4NDBjNzI0OTMsXG4gIDB4M2M5ZWJlMGEsIDB4MTVjOWJlYmMsIDB4NDMxZDY3YzQsIDB4OWMxMDBkNGMsXG4gIDB4NGNjNWQ0YmUsIDB4Y2IzZTQyYjYsIDB4NTk3ZjI5OWMsIDB4ZmM2NTdlMmEsXG4gIDB4NWZjYjZmYWIsIDB4M2FkNmZhZWMsIDB4NmM0NDE5OGMsIDB4NGE0NzU4MTdcbl07XG5cbmZ1bmN0aW9uIFNIQTUxMigpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTUxMikpXG4gICAgcmV0dXJuIG5ldyBTSEE1MTIoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4NmEwOWU2NjcsIDB4ZjNiY2M5MDgsXG4gICAgMHhiYjY3YWU4NSwgMHg4NGNhYTczYixcbiAgICAweDNjNmVmMzcyLCAweGZlOTRmODJiLFxuICAgIDB4YTU0ZmY1M2EsIDB4NWYxZDM2ZjEsXG4gICAgMHg1MTBlNTI3ZiwgMHhhZGU2ODJkMSxcbiAgICAweDliMDU2ODhjLCAweDJiM2U2YzFmLFxuICAgIDB4MWY4M2Q5YWIsIDB4ZmI0MWJkNmIsXG4gICAgMHg1YmUwY2QxOSwgMHgxMzdlMjE3OSBdO1xuICB0aGlzLmsgPSBzaGE1MTJfSztcbiAgdGhpcy5XID0gbmV3IEFycmF5KDE2MCk7XG59XG51dGlscy5pbmhlcml0cyhTSEE1MTIsIEJsb2NrSGFzaCk7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTUxMjtcblxuU0hBNTEyLmJsb2NrU2l6ZSA9IDEwMjQ7XG5TSEE1MTIub3V0U2l6ZSA9IDUxMjtcblNIQTUxMi5obWFjU3RyZW5ndGggPSAxOTI7XG5TSEE1MTIucGFkTGVuZ3RoID0gMTI4O1xuXG5TSEE1MTIucHJvdG90eXBlLl9wcmVwYXJlQmxvY2sgPSBmdW5jdGlvbiBfcHJlcGFyZUJsb2NrKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgLy8gMzIgeCAzMmJpdCB3b3Jkc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDMyOyBpKyspXG4gICAgV1tpXSA9IG1zZ1tzdGFydCArIGldO1xuICBmb3IgKDsgaSA8IFcubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgYzBfaGkgPSBnMV81MTJfaGkoV1tpIC0gNF0sIFdbaSAtIDNdKTsgIC8vIGkgLSAyXG4gICAgdmFyIGMwX2xvID0gZzFfNTEyX2xvKFdbaSAtIDRdLCBXW2kgLSAzXSk7XG4gICAgdmFyIGMxX2hpID0gV1tpIC0gMTRdOyAgLy8gaSAtIDdcbiAgICB2YXIgYzFfbG8gPSBXW2kgLSAxM107XG4gICAgdmFyIGMyX2hpID0gZzBfNTEyX2hpKFdbaSAtIDMwXSwgV1tpIC0gMjldKTsgIC8vIGkgLSAxNVxuICAgIHZhciBjMl9sbyA9IGcwXzUxMl9sbyhXW2kgLSAzMF0sIFdbaSAtIDI5XSk7XG4gICAgdmFyIGMzX2hpID0gV1tpIC0gMzJdOyAgLy8gaSAtIDE2XG4gICAgdmFyIGMzX2xvID0gV1tpIC0gMzFdO1xuXG4gICAgV1tpXSA9IHN1bTY0XzRfaGkoXG4gICAgICBjMF9oaSwgYzBfbG8sXG4gICAgICBjMV9oaSwgYzFfbG8sXG4gICAgICBjMl9oaSwgYzJfbG8sXG4gICAgICBjM19oaSwgYzNfbG8pO1xuICAgIFdbaSArIDFdID0gc3VtNjRfNF9sbyhcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyk7XG4gIH1cbn07XG5cblNIQTUxMi5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUobXNnLCBzdGFydCkge1xuICB0aGlzLl9wcmVwYXJlQmxvY2sobXNnLCBzdGFydCk7XG5cbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgdmFyIGFoID0gdGhpcy5oWzBdO1xuICB2YXIgYWwgPSB0aGlzLmhbMV07XG4gIHZhciBiaCA9IHRoaXMuaFsyXTtcbiAgdmFyIGJsID0gdGhpcy5oWzNdO1xuICB2YXIgY2ggPSB0aGlzLmhbNF07XG4gIHZhciBjbCA9IHRoaXMuaFs1XTtcbiAgdmFyIGRoID0gdGhpcy5oWzZdO1xuICB2YXIgZGwgPSB0aGlzLmhbN107XG4gIHZhciBlaCA9IHRoaXMuaFs4XTtcbiAgdmFyIGVsID0gdGhpcy5oWzldO1xuICB2YXIgZmggPSB0aGlzLmhbMTBdO1xuICB2YXIgZmwgPSB0aGlzLmhbMTFdO1xuICB2YXIgZ2ggPSB0aGlzLmhbMTJdO1xuICB2YXIgZ2wgPSB0aGlzLmhbMTNdO1xuICB2YXIgaGggPSB0aGlzLmhbMTRdO1xuICB2YXIgaGwgPSB0aGlzLmhbMTVdO1xuXG4gIGFzc2VydCh0aGlzLmsubGVuZ3RoID09PSBXLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgVy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBjMF9oaSA9IGhoO1xuICAgIHZhciBjMF9sbyA9IGhsO1xuICAgIHZhciBjMV9oaSA9IHMxXzUxMl9oaShlaCwgZWwpO1xuICAgIHZhciBjMV9sbyA9IHMxXzUxMl9sbyhlaCwgZWwpO1xuICAgIHZhciBjMl9oaSA9IGNoNjRfaGkoZWgsIGVsLCBmaCwgZmwsIGdoLCBnbCk7XG4gICAgdmFyIGMyX2xvID0gY2g2NF9sbyhlaCwgZWwsIGZoLCBmbCwgZ2gsIGdsKTtcbiAgICB2YXIgYzNfaGkgPSB0aGlzLmtbaV07XG4gICAgdmFyIGMzX2xvID0gdGhpcy5rW2kgKyAxXTtcbiAgICB2YXIgYzRfaGkgPSBXW2ldO1xuICAgIHZhciBjNF9sbyA9IFdbaSArIDFdO1xuXG4gICAgdmFyIFQxX2hpID0gc3VtNjRfNV9oaShcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyxcbiAgICAgIGM0X2hpLCBjNF9sbyk7XG4gICAgdmFyIFQxX2xvID0gc3VtNjRfNV9sbyhcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyxcbiAgICAgIGM0X2hpLCBjNF9sbyk7XG5cbiAgICBjMF9oaSA9IHMwXzUxMl9oaShhaCwgYWwpO1xuICAgIGMwX2xvID0gczBfNTEyX2xvKGFoLCBhbCk7XG4gICAgYzFfaGkgPSBtYWo2NF9oaShhaCwgYWwsIGJoLCBibCwgY2gsIGNsKTtcbiAgICBjMV9sbyA9IG1hajY0X2xvKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wpO1xuXG4gICAgdmFyIFQyX2hpID0gc3VtNjRfaGkoYzBfaGksIGMwX2xvLCBjMV9oaSwgYzFfbG8pO1xuICAgIHZhciBUMl9sbyA9IHN1bTY0X2xvKGMwX2hpLCBjMF9sbywgYzFfaGksIGMxX2xvKTtcblxuICAgIGhoID0gZ2g7XG4gICAgaGwgPSBnbDtcblxuICAgIGdoID0gZmg7XG4gICAgZ2wgPSBmbDtcblxuICAgIGZoID0gZWg7XG4gICAgZmwgPSBlbDtcblxuICAgIGVoID0gc3VtNjRfaGkoZGgsIGRsLCBUMV9oaSwgVDFfbG8pO1xuICAgIGVsID0gc3VtNjRfbG8oZGwsIGRsLCBUMV9oaSwgVDFfbG8pO1xuXG4gICAgZGggPSBjaDtcbiAgICBkbCA9IGNsO1xuXG4gICAgY2ggPSBiaDtcbiAgICBjbCA9IGJsO1xuXG4gICAgYmggPSBhaDtcbiAgICBibCA9IGFsO1xuXG4gICAgYWggPSBzdW02NF9oaShUMV9oaSwgVDFfbG8sIFQyX2hpLCBUMl9sbyk7XG4gICAgYWwgPSBzdW02NF9sbyhUMV9oaSwgVDFfbG8sIFQyX2hpLCBUMl9sbyk7XG4gIH1cblxuICBzdW02NCh0aGlzLmgsIDAsIGFoLCBhbCk7XG4gIHN1bTY0KHRoaXMuaCwgMiwgYmgsIGJsKTtcbiAgc3VtNjQodGhpcy5oLCA0LCBjaCwgY2wpO1xuICBzdW02NCh0aGlzLmgsIDYsIGRoLCBkbCk7XG4gIHN1bTY0KHRoaXMuaCwgOCwgZWgsIGVsKTtcbiAgc3VtNjQodGhpcy5oLCAxMCwgZmgsIGZsKTtcbiAgc3VtNjQodGhpcy5oLCAxMiwgZ2gsIGdsKTtcbiAgc3VtNjQodGhpcy5oLCAxNCwgaGgsIGhsKTtcbn07XG5cblNIQTUxMi5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG5cbmZ1bmN0aW9uIGNoNjRfaGkoeGgsIHhsLCB5aCwgeWwsIHpoKSB7XG4gIHZhciByID0gKHhoICYgeWgpIF4gKCh+eGgpICYgemgpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGNoNjRfbG8oeGgsIHhsLCB5aCwgeWwsIHpoLCB6bCkge1xuICB2YXIgciA9ICh4bCAmIHlsKSBeICgofnhsKSAmIHpsKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBtYWo2NF9oaSh4aCwgeGwsIHloLCB5bCwgemgpIHtcbiAgdmFyIHIgPSAoeGggJiB5aCkgXiAoeGggJiB6aCkgXiAoeWggJiB6aCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gbWFqNjRfbG8oeGgsIHhsLCB5aCwgeWwsIHpoLCB6bCkge1xuICB2YXIgciA9ICh4bCAmIHlsKSBeICh4bCAmIHpsKSBeICh5bCAmIHpsKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMF81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDI4KTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgMik7ICAvLyAzNFxuICB2YXIgYzJfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCA3KTsgIC8vIDM5XG5cbiAgdmFyIHIgPSBjMF9oaSBeIGMxX2hpIF4gYzJfaGk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczBfNTEyX2xvKHhoLCB4bCkge1xuICB2YXIgYzBfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAyOCk7XG4gIHZhciBjMV9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDIpOyAgLy8gMzRcbiAgdmFyIGMyX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgNyk7ICAvLyAzOVxuXG4gIHZhciByID0gYzBfbG8gXiBjMV9sbyBeIGMyX2xvO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMxXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMTQpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxOCk7XG4gIHZhciBjMl9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDkpOyAgLy8gNDFcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMV81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDE0KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMTgpO1xuICB2YXIgYzJfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCA5KTsgIC8vIDQxXG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gZzBfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxKTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgOCk7XG4gIHZhciBjMl9oaSA9IHNocjY0X2hpKHhoLCB4bCwgNyk7XG5cbiAgdmFyIHIgPSBjMF9oaSBeIGMxX2hpIF4gYzJfaGk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gZzBfNTEyX2xvKHhoLCB4bCkge1xuICB2YXIgYzBfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxKTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgOCk7XG4gIHZhciBjMl9sbyA9IHNocjY0X2xvKHhoLCB4bCwgNyk7XG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gZzFfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxOSk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDI5KTsgIC8vIDYxXG4gIHZhciBjMl9oaSA9IHNocjY0X2hpKHhoLCB4bCwgNik7XG5cbiAgdmFyIHIgPSBjMF9oaSBeIGMxX2hpIF4gYzJfaGk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gZzFfNTEyX2xvKHhoLCB4bCkge1xuICB2YXIgYzBfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxOSk7XG4gIHZhciBjMV9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDI5KTsgIC8vIDYxXG4gIHZhciBjMl9sbyA9IHNocjY0X2xvKHhoLCB4bCwgNik7XG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG52YXIgU0hBNTEyID0gcmVxdWlyZSgnLi81MTInKTtcblxuZnVuY3Rpb24gU0hBMzg0KCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBMzg0KSlcbiAgICByZXR1cm4gbmV3IFNIQTM4NCgpO1xuXG4gIFNIQTUxMi5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHhjYmJiOWQ1ZCwgMHhjMTA1OWVkOCxcbiAgICAweDYyOWEyOTJhLCAweDM2N2NkNTA3LFxuICAgIDB4OTE1OTAxNWEsIDB4MzA3MGRkMTcsXG4gICAgMHgxNTJmZWNkOCwgMHhmNzBlNTkzOSxcbiAgICAweDY3MzMyNjY3LCAweGZmYzAwYjMxLFxuICAgIDB4OGViNDRhODcsIDB4Njg1ODE1MTEsXG4gICAgMHhkYjBjMmUwZCwgMHg2NGY5OGZhNyxcbiAgICAweDQ3YjU0ODFkLCAweGJlZmE0ZmE0IF07XG59XG51dGlscy5pbmhlcml0cyhTSEEzODQsIFNIQTUxMik7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTM4NDtcblxuU0hBMzg0LmJsb2NrU2l6ZSA9IDEwMjQ7XG5TSEEzODQub3V0U2l6ZSA9IDM4NDtcblNIQTM4NC5obWFjU3RyZW5ndGggPSAxOTI7XG5TSEEzODQucGFkTGVuZ3RoID0gMTI4O1xuXG5TSEEzODQucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaC5zbGljZSgwLCAxMiksICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaC5zbGljZSgwLCAxMiksICdiaWcnKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5zaGExID0gcmVxdWlyZSgnLi9zaGEvMScpO1xuZXhwb3J0cy5zaGEyMjQgPSByZXF1aXJlKCcuL3NoYS8yMjQnKTtcbmV4cG9ydHMuc2hhMjU2ID0gcmVxdWlyZSgnLi9zaGEvMjU2Jyk7XG5leHBvcnRzLnNoYTM4NCA9IHJlcXVpcmUoJy4vc2hhLzM4NCcpO1xuZXhwb3J0cy5zaGE1MTIgPSByZXF1aXJlKCcuL3NoYS81MTInKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxudmFyIHJvdGwzMiA9IHV0aWxzLnJvdGwzMjtcbnZhciBzdW0zMiA9IHV0aWxzLnN1bTMyO1xudmFyIHN1bTMyXzMgPSB1dGlscy5zdW0zMl8zO1xudmFyIHN1bTMyXzQgPSB1dGlscy5zdW0zMl80O1xudmFyIEJsb2NrSGFzaCA9IGNvbW1vbi5CbG9ja0hhc2g7XG5cbmZ1bmN0aW9uIFJJUEVNRDE2MCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJJUEVNRDE2MCkpXG4gICAgcmV0dXJuIG5ldyBSSVBFTUQxNjAoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcblxuICB0aGlzLmggPSBbIDB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjAgXTtcbiAgdGhpcy5lbmRpYW4gPSAnbGl0dGxlJztcbn1cbnV0aWxzLmluaGVyaXRzKFJJUEVNRDE2MCwgQmxvY2tIYXNoKTtcbmV4cG9ydHMucmlwZW1kMTYwID0gUklQRU1EMTYwO1xuXG5SSVBFTUQxNjAuYmxvY2tTaXplID0gNTEyO1xuUklQRU1EMTYwLm91dFNpemUgPSAxNjA7XG5SSVBFTUQxNjAuaG1hY1N0cmVuZ3RoID0gMTkyO1xuUklQRU1EMTYwLnBhZExlbmd0aCA9IDY0O1xuXG5SSVBFTUQxNjAucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUobXNnLCBzdGFydCkge1xuICB2YXIgQSA9IHRoaXMuaFswXTtcbiAgdmFyIEIgPSB0aGlzLmhbMV07XG4gIHZhciBDID0gdGhpcy5oWzJdO1xuICB2YXIgRCA9IHRoaXMuaFszXTtcbiAgdmFyIEUgPSB0aGlzLmhbNF07XG4gIHZhciBBaCA9IEE7XG4gIHZhciBCaCA9IEI7XG4gIHZhciBDaCA9IEM7XG4gIHZhciBEaCA9IEQ7XG4gIHZhciBFaCA9IEU7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgODA7IGorKykge1xuICAgIHZhciBUID0gc3VtMzIoXG4gICAgICByb3RsMzIoXG4gICAgICAgIHN1bTMyXzQoQSwgZihqLCBCLCBDLCBEKSwgbXNnW3Jbal0gKyBzdGFydF0sIEsoaikpLFxuICAgICAgICBzW2pdKSxcbiAgICAgIEUpO1xuICAgIEEgPSBFO1xuICAgIEUgPSBEO1xuICAgIEQgPSByb3RsMzIoQywgMTApO1xuICAgIEMgPSBCO1xuICAgIEIgPSBUO1xuICAgIFQgPSBzdW0zMihcbiAgICAgIHJvdGwzMihcbiAgICAgICAgc3VtMzJfNChBaCwgZig3OSAtIGosIEJoLCBDaCwgRGgpLCBtc2dbcmhbal0gKyBzdGFydF0sIEtoKGopKSxcbiAgICAgICAgc2hbal0pLFxuICAgICAgRWgpO1xuICAgIEFoID0gRWg7XG4gICAgRWggPSBEaDtcbiAgICBEaCA9IHJvdGwzMihDaCwgMTApO1xuICAgIENoID0gQmg7XG4gICAgQmggPSBUO1xuICB9XG4gIFQgPSBzdW0zMl8zKHRoaXMuaFsxXSwgQywgRGgpO1xuICB0aGlzLmhbMV0gPSBzdW0zMl8zKHRoaXMuaFsyXSwgRCwgRWgpO1xuICB0aGlzLmhbMl0gPSBzdW0zMl8zKHRoaXMuaFszXSwgRSwgQWgpO1xuICB0aGlzLmhbM10gPSBzdW0zMl8zKHRoaXMuaFs0XSwgQSwgQmgpO1xuICB0aGlzLmhbNF0gPSBzdW0zMl8zKHRoaXMuaFswXSwgQiwgQ2gpO1xuICB0aGlzLmhbMF0gPSBUO1xufTtcblxuUklQRU1EMTYwLnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdsaXR0bGUnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2xpdHRsZScpO1xufTtcblxuZnVuY3Rpb24gZihqLCB4LCB5LCB6KSB7XG4gIGlmIChqIDw9IDE1KVxuICAgIHJldHVybiB4IF4geSBeIHo7XG4gIGVsc2UgaWYgKGogPD0gMzEpXG4gICAgcmV0dXJuICh4ICYgeSkgfCAoKH54KSAmIHopO1xuICBlbHNlIGlmIChqIDw9IDQ3KVxuICAgIHJldHVybiAoeCB8ICh+eSkpIF4gejtcbiAgZWxzZSBpZiAoaiA8PSA2MylcbiAgICByZXR1cm4gKHggJiB6KSB8ICh5ICYgKH56KSk7XG4gIGVsc2VcbiAgICByZXR1cm4geCBeICh5IHwgKH56KSk7XG59XG5cbmZ1bmN0aW9uIEsoaikge1xuICBpZiAoaiA8PSAxNSlcbiAgICByZXR1cm4gMHgwMDAwMDAwMDtcbiAgZWxzZSBpZiAoaiA8PSAzMSlcbiAgICByZXR1cm4gMHg1YTgyNzk5OTtcbiAgZWxzZSBpZiAoaiA8PSA0NylcbiAgICByZXR1cm4gMHg2ZWQ5ZWJhMTtcbiAgZWxzZSBpZiAoaiA8PSA2MylcbiAgICByZXR1cm4gMHg4ZjFiYmNkYztcbiAgZWxzZVxuICAgIHJldHVybiAweGE5NTNmZDRlO1xufVxuXG5mdW5jdGlvbiBLaChqKSB7XG4gIGlmIChqIDw9IDE1KVxuICAgIHJldHVybiAweDUwYTI4YmU2O1xuICBlbHNlIGlmIChqIDw9IDMxKVxuICAgIHJldHVybiAweDVjNGRkMTI0O1xuICBlbHNlIGlmIChqIDw9IDQ3KVxuICAgIHJldHVybiAweDZkNzAzZWYzO1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAweDdhNmQ3NmU5O1xuICBlbHNlXG4gICAgcmV0dXJuIDB4MDAwMDAwMDA7XG59XG5cbnZhciByID0gW1xuICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LFxuICA3LCA0LCAxMywgMSwgMTAsIDYsIDE1LCAzLCAxMiwgMCwgOSwgNSwgMiwgMTQsIDExLCA4LFxuICAzLCAxMCwgMTQsIDQsIDksIDE1LCA4LCAxLCAyLCA3LCAwLCA2LCAxMywgMTEsIDUsIDEyLFxuICAxLCA5LCAxMSwgMTAsIDAsIDgsIDEyLCA0LCAxMywgMywgNywgMTUsIDE0LCA1LCA2LCAyLFxuICA0LCAwLCA1LCA5LCA3LCAxMiwgMiwgMTAsIDE0LCAxLCAzLCA4LCAxMSwgNiwgMTUsIDEzXG5dO1xuXG52YXIgcmggPSBbXG4gIDUsIDE0LCA3LCAwLCA5LCAyLCAxMSwgNCwgMTMsIDYsIDE1LCA4LCAxLCAxMCwgMywgMTIsXG4gIDYsIDExLCAzLCA3LCAwLCAxMywgNSwgMTAsIDE0LCAxNSwgOCwgMTIsIDQsIDksIDEsIDIsXG4gIDE1LCA1LCAxLCAzLCA3LCAxNCwgNiwgOSwgMTEsIDgsIDEyLCAyLCAxMCwgMCwgNCwgMTMsXG4gIDgsIDYsIDQsIDEsIDMsIDExLCAxNSwgMCwgNSwgMTIsIDIsIDEzLCA5LCA3LCAxMCwgMTQsXG4gIDEyLCAxNSwgMTAsIDQsIDEsIDUsIDgsIDcsIDYsIDIsIDEzLCAxNCwgMCwgMywgOSwgMTFcbl07XG5cbnZhciBzID0gW1xuICAxMSwgMTQsIDE1LCAxMiwgNSwgOCwgNywgOSwgMTEsIDEzLCAxNCwgMTUsIDYsIDcsIDksIDgsXG4gIDcsIDYsIDgsIDEzLCAxMSwgOSwgNywgMTUsIDcsIDEyLCAxNSwgOSwgMTEsIDcsIDEzLCAxMixcbiAgMTEsIDEzLCA2LCA3LCAxNCwgOSwgMTMsIDE1LCAxNCwgOCwgMTMsIDYsIDUsIDEyLCA3LCA1LFxuICAxMSwgMTIsIDE0LCAxNSwgMTQsIDE1LCA5LCA4LCA5LCAxNCwgNSwgNiwgOCwgNiwgNSwgMTIsXG4gIDksIDE1LCA1LCAxMSwgNiwgOCwgMTMsIDEyLCA1LCAxMiwgMTMsIDE0LCAxMSwgOCwgNSwgNlxuXTtcblxudmFyIHNoID0gW1xuICA4LCA5LCA5LCAxMSwgMTMsIDE1LCAxNSwgNSwgNywgNywgOCwgMTEsIDE0LCAxNCwgMTIsIDYsXG4gIDksIDEzLCAxNSwgNywgMTIsIDgsIDksIDExLCA3LCA3LCAxMiwgNywgNiwgMTUsIDEzLCAxMSxcbiAgOSwgNywgMTUsIDExLCA4LCA2LCA2LCAxNCwgMTIsIDEzLCA1LCAxNCwgMTMsIDEzLCA3LCA1LFxuICAxNSwgNSwgOCwgMTEsIDE0LCAxNCwgNiwgMTQsIDYsIDksIDEyLCA5LCAxMiwgNSwgMTUsIDgsXG4gIDgsIDUsIDEyLCA5LCAxMiwgNSwgMTQsIDYsIDgsIDEzLCA2LCA1LCAxNSwgMTMsIDExLCAxMVxuXTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG5mdW5jdGlvbiBIbWFjKGhhc2gsIGtleSwgZW5jKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBIbWFjKSlcbiAgICByZXR1cm4gbmV3IEhtYWMoaGFzaCwga2V5LCBlbmMpO1xuICB0aGlzLkhhc2ggPSBoYXNoO1xuICB0aGlzLmJsb2NrU2l6ZSA9IGhhc2guYmxvY2tTaXplIC8gODtcbiAgdGhpcy5vdXRTaXplID0gaGFzaC5vdXRTaXplIC8gODtcbiAgdGhpcy5pbm5lciA9IG51bGw7XG4gIHRoaXMub3V0ZXIgPSBudWxsO1xuXG4gIHRoaXMuX2luaXQodXRpbHMudG9BcnJheShrZXksIGVuYykpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBIbWFjO1xuXG5IbWFjLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQoa2V5KSB7XG4gIC8vIFNob3J0ZW4ga2V5LCBpZiBuZWVkZWRcbiAgaWYgKGtleS5sZW5ndGggPiB0aGlzLmJsb2NrU2l6ZSlcbiAgICBrZXkgPSBuZXcgdGhpcy5IYXNoKCkudXBkYXRlKGtleSkuZGlnZXN0KCk7XG4gIGFzc2VydChrZXkubGVuZ3RoIDw9IHRoaXMuYmxvY2tTaXplKTtcblxuICAvLyBBZGQgcGFkZGluZyB0byBrZXlcbiAgZm9yICh2YXIgaSA9IGtleS5sZW5ndGg7IGkgPCB0aGlzLmJsb2NrU2l6ZTsgaSsrKVxuICAgIGtleS5wdXNoKDApO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXG4gICAga2V5W2ldIF49IDB4MzY7XG4gIHRoaXMuaW5uZXIgPSBuZXcgdGhpcy5IYXNoKCkudXBkYXRlKGtleSk7XG5cbiAgLy8gMHgzNiBeIDB4NWMgPSAweDZhXG4gIGZvciAoaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXG4gICAga2V5W2ldIF49IDB4NmE7XG4gIHRoaXMub3V0ZXIgPSBuZXcgdGhpcy5IYXNoKCkudXBkYXRlKGtleSk7XG59O1xuXG5IbWFjLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUobXNnLCBlbmMpIHtcbiAgdGhpcy5pbm5lci51cGRhdGUobXNnLCBlbmMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkhtYWMucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgdGhpcy5vdXRlci51cGRhdGUodGhpcy5pbm5lci5kaWdlc3QoKSk7XG4gIHJldHVybiB0aGlzLm91dGVyLmRpZ2VzdChlbmMpO1xufTtcbiIsCiAgICAidmFyIGhhc2ggPSBleHBvcnRzO1xuXG5oYXNoLnV0aWxzID0gcmVxdWlyZSgnLi9oYXNoL3V0aWxzJyk7XG5oYXNoLmNvbW1vbiA9IHJlcXVpcmUoJy4vaGFzaC9jb21tb24nKTtcbmhhc2guc2hhID0gcmVxdWlyZSgnLi9oYXNoL3NoYScpO1xuaGFzaC5yaXBlbWQgPSByZXF1aXJlKCcuL2hhc2gvcmlwZW1kJyk7XG5oYXNoLmhtYWMgPSByZXF1aXJlKCcuL2hhc2gvaG1hYycpO1xuXG4vLyBQcm94eSBoYXNoIGZ1bmN0aW9ucyB0byB0aGUgbWFpbiBvYmplY3Rcbmhhc2guc2hhMSA9IGhhc2guc2hhLnNoYTE7XG5oYXNoLnNoYTI1NiA9IGhhc2guc2hhLnNoYTI1Njtcbmhhc2guc2hhMjI0ID0gaGFzaC5zaGEuc2hhMjI0O1xuaGFzaC5zaGEzODQgPSBoYXNoLnNoYS5zaGEzODQ7XG5oYXNoLnNoYTUxMiA9IGhhc2guc2hhLnNoYTUxMjtcbmhhc2gucmlwZW1kMTYwID0gaGFzaC5yaXBlbWQucmlwZW1kMTYwO1xuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgZG91Ymxlczoge1xuICAgIHN0ZXA6IDQsXG4gICAgcG9pbnRzOiBbXG4gICAgICBbXG4gICAgICAgICdlNjBmY2U5M2I1OWU5ZWM1MzAxMWFhYmMyMWMyM2U5N2IyYTMxMzY5Yjg3YTVhZTljNDRlZTg5ZTJhNmRlYzBhJyxcbiAgICAgICAgJ2Y3ZTM1MDczOTllNTk1OTI5ZGI5OWYzNGY1NzkzNzEwMTI5Njg5MWU0NGQyM2YwYmUxZjMyY2NlNjk2MTY4MjEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgyODIyNjMyMTJjNjA5ZDllYTJhNmUzZTE3MmRlMjM4ZDhjMzljYWJkNWFjMWNhMTA2NDZlMjNmZDVmNTE1MDgnLFxuICAgICAgICAnMTFmOGE4MDk4NTU3ZGZlNDVlODI1NmU4MzBiNjBhY2U2MmQ2MTNhYzJmN2IxN2JlZDMxYjZlYWZmNmUyNmNhZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTc1ZTE1OWY3MjhiODY1YTcyZjk5Y2M2YzZmYzg0NmRlMGI5MzgzM2ZkMjIyMmVkNzNmY2U1YjU1MWU1YjczOScsXG4gICAgICAgICdkMzUwNmUwZDllM2M3OWViYTRlZjk3YTUxZmY3MWY1ZWFjYjU5NTVhZGQyNDM0NWM2ZWZhNmZmZWU5ZmVkNjk1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNjNkOTBkNDQ3YjAwYzljOTljZWFjMDViNjI2MmVlMDUzNDQxYzdlNTU1NTJmZmU1MjZiYWQ4ZjgzZmY0NjQwJyxcbiAgICAgICAgJzRlMjczYWRmYzczMjIyMTk1M2I0NDUzOTdmMzM2MzE0NWI5YTg5MDA4MTk5ZWNiNjIwMDNjN2YzYmVlOWRlOScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGI0YjVmMTY1ZGYzYzJiZThjNjI0NGI1Yjc0NTYzODg0M2U0YTc4MWExNWJjZDFiNjlmNzlhNTVkZmZkZjgwYycsXG4gICAgICAgICc0YWFkMGE2ZjY4ZDMwOGI0YjNmYmQ3ODEzYWIwZGEwNGY5ZTMzNjU0NjE2MmVlNTZiM2VmZjBjNjVmZDRmZDM2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3MjNjYmFhNmU1ZGI5OTZkNmJmNzcxYzAwYmQ1NDhjN2I3MDBkYmZmYTZjMGU3N2JjYjYxMTU5MjUyMzJmY2RhJyxcbiAgICAgICAgJzk2ZTg2N2I1NTk1Y2M0OThhOTIxMTM3NDg4ODI0ZDZlMjY2MGEwNjUzNzc5NDk0ODAxZGMwNjlkOWViMzlmNWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VlYmZhNGQ0OTNiZWJmOThiYTVmZWVjODEyYzJkM2I1MDk0Nzk2MTIzN2E5MTk4MzlhNTMzZWNhMGU3ZGQ3ZmEnLFxuICAgICAgICAnNWQ5YThjYTM5NzBlZjBmMjY5ZWU3ZWRhZjE3ODA4OWQ5YWU0Y2RjM2E3MTFmNzEyZGRmZDRmZGFlMWRlODk5OScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTAwZjQ0ZGE2OTZlNzE2NzI3OTFkMGEwOWI3YmRlNDU5ZjEyMTVhMjliM2MwM2JmZWZkNzgzNWIzOWE0OGRiMCcsXG4gICAgICAgICdjZGQ5ZTEzMTkyYTAwYjc3MmVjOGYzMzAwYzA5MDY2NmI3ZmY0YTE4ZmY1MTk1YWMwZmJkNWNkNjJiYzY1YTA5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMTAzMWJlMjYyYzdlZDFiMWRjOTIyN2E0YTA0YzAxN2E3N2Y4ZDQ0NjRmM2IzODUyYzhhY2RlNmU1MzRmZDJkJyxcbiAgICAgICAgJzlkNzA2MTkyODk0MDQwNWU2YmI2YTQxNzY1OTc1MzVhZjI5MmRkNDE5ZTFjZWQ3OWE0NGYxOGYyOTQ1NmEwMGQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ZlZWE2Y2FlNDZkNTViNTMwYWMyODM5ZjE0M2JkN2VjNWNmOGIyNjZhNDFkNmFmNTJkNWU2ODhkOTA5NDY5NmQnLFxuICAgICAgICAnZTU3YzZiNmM5N2RjZTFiYWIwNmU0ZTEyYmYzZWNkNWM5ODFjODk1N2NjNDE0NDJkMzE1NWRlYmYxODA5MDA4OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGE2N2E5MWQ5MTA0OWNkY2IzNjdiZTRiZTZmZmNhM2NmZWVkNjU3ZDgwODU4M2RlMzNmYTk3OGJjMWVjNmNiMScsXG4gICAgICAgICc5YmFjYWEzNTQ4MTY0MmJjNDFmNDYzZjdlYzk3ODBlNWRlYzdhZGM1MDhmNzQwYTE3ZTllYThlMjdhNjhiZTFkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1MzkwNGZhYTBiMzM0Y2RkYTZlMDAwOTM1ZWYyMjE1MWVjMDhkMGY3YmIxMTA2OWY1NzU0NWNjYzFhMzdiN2MwJyxcbiAgICAgICAgJzViYzA4N2QwYmM4MDEwNmQ4OGM5ZWNjYWMyMGQzYzFjMTM5OTk5ODFlMTQ0MzQ2OTlkY2IwOTZiMDIyNzcxYzgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhlN2JjZDBiZDM1OTgzYTc3MTljY2E3NzY0Y2E5MDY3NzliNTNhMDQzYTliOGJjYWVmZjk1OWY0M2FkODYwNDcnLFxuICAgICAgICAnMTBiNzc3MGIyYTNkYTRiMzk0MDMxMDQyMGNhOTUxNDU3OWU4OGUyZTQ3ZmQ2OGIzZWExMDA0N2U4NDYwMzcyYScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzg1ZWVkMzRjMWNkZmYyMWU2ZDA4MTg2ODliODFiZGU3MWE3ZjRmMTgzOTdlNjY5MGE4NDFlMTU5OWM0Mzg2MicsXG4gICAgICAgICcyODNiZWJjM2U4ZWEyM2Y1NjcwMWRlMTllOWViZjQ1NzZiMzA0ZWVjMjA4NmRjOGNjMDQ1OGZlNTU0MmU1NDUzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2ZjlkOWI4MDNlY2YxOTE2MzdjNzNhNDQxM2RmYTE4MGZkZGY4NGE1OTQ3ZmJjOWM2MDZlZDg2YzNmYWMzYTcnLFxuICAgICAgICAnN2M4MGM2OGU2MDMwNTliYTY5YjhlMmEzMGU0NWM0ZDQ3ZWE0ZGQyZjVjMjgxMDAyZDg2ODkwNjAzYTg0MjE2MCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzMyMmQ0MDEyNDNjNGUyNTgyYTIxNDdjMTA0ZDZlY2JmNzc0ZDE2M2RiMGY1ZTUzMTNiN2UwZTc0MmQwZTZiZCcsXG4gICAgICAgICc1NmU3MDc5N2U5NjY0ZWY1YmZiMDE5YmM0ZGRhZjliNzI4MDVmNjNlYTI4NzNhZjYyNGYzYTJlOTZjMjhiMmEwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NTY3MmM3ZDJkZTBiN2RhMmJkMTc3MGQ4OTY2NTg2ODc0MWIzZjlhZjc2NDMzOTc3MjFkNzRkMjgxMzRhYjgzJyxcbiAgICAgICAgJzdjNDgxYjliNWI0M2IyZWI2Mzc0MDQ5YmZhNjJjMmU1ZTc3ZjE3ZmNjNTI5OGY0NGM4ZTMwOTRmNzkwMzEzYTYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk0OGJmODA5YjE5ODhhNDZiMDZjOWYxOTE5NDEzYjEwZjkyMjZjNjBmNjY4ODMyZmZkOTU5YWY2MGM4MmEwYScsXG4gICAgICAgICc1M2E1NjI4NTZkY2I2NjQ2ZGM2Yjc0YzVkMWMzNDE4YzZkNGRmZjA4Yzk3Y2QyYmVkNGNiN2Y4OGQ4YzhlNTg5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MjYwY2U3ZjQ2MTgwMWMzNGYwNjdjZTBmMDI4NzNhOGYxYjBlNDRkZmM2OTc1MmFjY2VjZDgxOWYzOGZkOGU4JyxcbiAgICAgICAgJ2JjMmRhODJiNmZhNWI1NzFhN2YwOTA0OTc3NmExZWY3ZWNkMjkyMjM4MDUxYzE5OGMxYTg0ZTk1YjJiNGFlMTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U1MDM3ZGUwYWZjMWQ4ZDQzZDgzNDg0MTRiYmY0MTAzMDQzZWM4ZjU3NWJmZGM0MzI5NTNjYzhkMjAzN2ZhMmQnLFxuICAgICAgICAnNDU3MTUzNGJhYTk0ZDNiNWY5Zjk4ZDA5ZmI5OTBiZGRiZDVmNWIwM2VjNDgxZjEwZTBlNWRjODQxZDc1NWJkYScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTA2MzcyYjBmNGEyMDdhZGY1ZWE5MDVlOGYxNzcxYjRlN2U4ZGJkMWM2YTZjNWI3MjU4NjZhMGFlNGZjZTcyNScsXG4gICAgICAgICc3YTkwODk3NGJjZTE4Y2ZlMTJhMjdiYjJhZDVhNDg4Y2Q3NDg0YTc3ODcxMDQ4NzBiMjcwMzRmOTRlZWUzMWRkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyMTNjN2E3MTVjZDVkNDUzNThkMGJiZjlkYzBjZTAyMjA0YjEwYmRkZTJhM2Y1ODU0MGFkNjkwOGQwNTU5NzU0JyxcbiAgICAgICAgJzRiNmRhZDBiNWFlNDYyNTA3MDEzYWQwNjI0NWJhMTkwYmI0ODUwZjVmMzZhN2VlZGRmZjJjMjc1MzRiNDU4ZjInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRlN2MyNzJhN2FmNGIzNGU4ZGJiOTM1MmE1NDE5YTg3ZTI4MzhjNzBhZGM2MmNkZGYwY2MzYTNiMDhmYmQ1M2MnLFxuICAgICAgICAnMTc3NDljNzY2YzlkMGIxOGUxNmZkMDlmNmRlZjY4MWI1MzBiOTYxNGJmZjdkZDMzZTBiMzk0MTgxN2RjYWFlNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmVhNzRlM2RiZTc3OGIxYjEwZjIzOGFkNjE2ODZhYTVjNzZlM2RiMmJlNDMwNTc2MzI0MjdlMjg0MGZiMjdiNicsXG4gICAgICAgICc2ZTA1NjhkYjliMGIxMzI5N2NmNjc0ZGVjY2I2YWY5MzEyNmI1OTZiOTczZjdiNzc3MDFkM2RiN2YyM2NiOTZmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NmU2NDExM2Y2NzdjZjBlMTBhMjU3MGQ1OTk5NjhkMzE1NDRlMTc5Yjc2MDQzMjk1MmMwMmE0NDE3YmRkZTM5JyxcbiAgICAgICAgJ2M5MGRkZjhkZWU0ZTk1Y2Y1NzcwNjZkNzA2ODFmMGQzNWUyYTMzZDJiNTZkMjAzMmI0YjE3NTJkMTkwMWFjMDEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M3MzhjNTZiMDNiMmFiZTFlODI4MWJhYTc0M2Y4ZjlhOGY3Y2M2NDNkZjI2Y2JlZTNhYjE1MDI0MmJjYmI4OTEnLFxuICAgICAgICAnODkzZmI1Nzg5NTFhZDI1MzdmNzE4ZjJlYWNiZmJiYmI4MjMxNGVlZjc4ODBjZmU5MTdlNzM1ZDk2OTlhODRjMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDg5NTYyNjU0OGI2NWI4MWUyNjRjNzYzN2M5NzI4NzdkMWQ3MmU1ZjNhOTI1MDE0MzcyZTlmNjU4OGY2YzE0YicsXG4gICAgICAgICdmZWJmYWEzOGYyYmM3ZWFlNzI4ZWM2MDgxOGMzNDBlYjAzNDI4ZDYzMmJiMDY3ZTE3OTM2M2VkNzVkN2Q5OTFmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiOGRhOTQwMzJhOTU3NTE4ZWIwZjY0MzM1NzFlODc2MWNlZmZjNzM2OTNlODRlZGQ0OTE1MGE1NjRmNjc2ZTAzJyxcbiAgICAgICAgJzI4MDRkZmE0NDgwNWExZTRkN2M5OWNjOTc2MjgwOGIwOTJjYzU4NGQ5NWZmM2I1MTE0ODhlNGU3NGVmZGY2ZTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U4MGZlYTE0NDQxZmIzM2E3ZDhhZGFiOTQ3NWQ3ZmFiMjAxOWVmZmI1MTU2YTc5MmYxYTExNzc4ZTNjMGRmNWQnLFxuICAgICAgICAnZWVkMWRlN2Y2MzhlMDA3NzFlODk3NjhjYTNjYTk0NDcyZDE1NWU4MGFmMzIyZWE5ZmNiNDI5MWI2YWM5ZWM3OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTMwMTY5N2JkZmNkNzA0MzEzYmE0OGU1MWQ1Njc1NDNmMmExODIwMzFlZmQ2OTE1ZGRjMDdiYmNjNGUxNjA3MCcsXG4gICAgICAgICc3MzcwZjkxY2ZiNjdlNGY1MDgxODA5ZmEyNWQ0MGY5YjE3MzVkYmY3YzBhMTFhMTMwYzBkMWEwNDFlMTc3ZWExJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5MGFkODViMzg5ZDZiOTM2NDYzZjlkMDUxMjY3OGRlMjA4Y2MzMzBiMTEzMDdmZmZhYjdhYzYzZTNmYjA0ZWQ0JyxcbiAgICAgICAgJ2U1MDdhMzYyMGEzODI2MWFmZmRjYmQ5NDI3MjIyYjgzOWFlZmFiZTE1ODI4OTRkOTkxZDRkNDhjYjZlZjE1MCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGY2OGI5ZDJmNjNiNWYzMzkyMzljMWFkOTgxZjE2MmVlODhjNTY3ODcyM2VhMzM1MWI3YjQ0NGM5ZWM0YzBkYScsXG4gICAgICAgICc2NjJhOWYyZGJhMDYzOTg2ZGUxZDkwYzJiNmJlMjE1ZGJiZWEyY2ZlOTU1MTBiZmRmMjNjYmY3OTUwMWZmZjgyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNGYzZmIwMTc2YWY4NWQ2NWZmOTlmZjkxOThjMzYwOTFmNDhlODY1MDM2ODFlM2U2Njg2ZmQ1MDUzMjMxZTExJyxcbiAgICAgICAgJzFlNjM2MzNhZDBlZjRmMWMxNjYxYTZkMGVhMDJiNzI4NmNjN2U3NGVjOTUxZDFjOTgyMmMzODU3NmZlYjczYmMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhjMDBmYTliMThlYmYzMzFlYjk2MTUzN2E0NWE0MjY2YzcwMzRmMmYwZDRlMWQwNzE2ZmI2ZWFlMjBlYWUyOWUnLFxuICAgICAgICAnZWZhNDcyNjdmZWE1MjFhMWE5ZGMzNDNhMzczNmM5NzRjMmZhZGFmYTgxZTM2YzU0ZTdkMmE0YzY2NzAyNDE0YicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTdhMjZjZTY5ZGQ0ODI5ZjNlMTBjZWMwYTllOThlZDMxNDNkMDg0ZjMwOGI5MmMwOTk3ZmRkZmM2MGNiM2U0MScsXG4gICAgICAgICcyYTc1OGUzMDBmYTc5ODRiNDcxYjAwNmExYWFmYmIxOGQwYTZiMmMwNDIwZTgzZTIwZThhOTQyMWNmMmNmZDUxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiNjQ1OWUwZWUzNjYyZWM4ZDIzNTQwYzIyM2JjYmRjNTcxY2JjYjk2N2Q3OTQyNGYzY2YyOWViM2RlNmI4MGVmJyxcbiAgICAgICAgJzY3Yzg3NmQwNmYzZTA2ZGUxZGFkZjE2ZTU2NjFkYjNjNGIzYWU2ZDQ4ZTM1YjJmZjMwYmYwYjYxYTcxYmE0NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDY4YTgwYzgyODBiYjg0MDc5MzIzNGFhMTE4ZjA2MjMxZDZmMWZjNjdlNzNjNWE1ZGVkYTBmNWI0OTY5NDNlOCcsXG4gICAgICAgICdkYjhiYTlmZmY0YjU4NmQwMGM0YjFmOTE3N2IwZTI4YjViMGU3YjhmNzg0NTI5NWEyOTRjODQyNjZiMTMzMTIwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMjRhZWQ3ZGY2NWM4MDQyNTJkYzAyNzA5MDdhMzBiMDk2MTJhZWI5NzM0NDljZWE0MDk1OTgwZmMyOGQzZDVkJyxcbiAgICAgICAgJzY0OGEzNjU3NzRiNjFmMmZmMTMwYzBjMzVhZWMxZjRmMTkyMTNiMGM3ZTMzMjg0Mzk2NzIyNGFmOTZhYjdjODQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRkZjljMTQ5MTljZGU2MWY2ZDUxZGZkYmU1ZmVlNWRjZWVjNDE0M2JhOGQxY2E4ODhlOGJkMzczZmQwNTRjOTYnLFxuICAgICAgICAnMzVlYzUxMDkyZDg3MjgwNTA5NzRjMjNhMWQ4NWQ0YjVkNTA2Y2RjMjg4NDkwMTkyZWJhYzA2Y2FkMTBkNWQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzljMzkxOWE4NGE0NzQ4NzBmYWVkOGE5YzFjYzY2MDIxNTIzNDg5MDU0ZDdmMDMwOGNiZmM5OWM4YWMxZjk4Y2QnLFxuICAgICAgICAnZGRiODRmMGY0YTRkZGQ1NzU4NGYwNDRiZjI2MGU2NDE5MDUzMjZmNzZjNjRjOGU2YmU3ZTVlMDNkNGZjNTk5ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjA1NzE3MGIxZGQxMmZkZjhkZTA1ZjI4MWQ4ZTA2YmI5MWUxNDkzYThiOTFkNGNjNWEyMTM4MjEyMGE5NTllNScsXG4gICAgICAgICc5YTFhZjBiMjZhNmE0ODA3YWRkOWEyZGFmNzFkZjI2MjQ2NTE1MmJjM2VlMjRjNjVlODk5YmU5MzIzODVhMmE4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhNTc2ZGY4ZTIzYTA4NDExNDIxNDM5YTQ1MThkYTMxODgwY2VmMGZiYTdkNGRmMTJiMWE2OTczZWVjYjk0MjY2JyxcbiAgICAgICAgJzQwYTZiZjIwZTc2NjQwYjJjOTJiOTdhZmU1OGNkODJjNDMyZTEwYTdmNTE0ZDlmM2VlOGJlMTFhZTFiMjhlYzgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NzhhNzhjMjhkZWMzZTMwYTA1ZmU5NjI5ZGU4YzM4YmIzMGQxZjVjZjlhM2EyMDhmNzYzODg5YmU1OGFkNzEnLFxuICAgICAgICAnMzQ2MjZkOWFiNWE1YjIyZmY3MDk4ZTEyZjJmZjU4MDA4N2IzODQxMWZmMjRhYzU2M2I1MTNmYzFmZDlmNDNhYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTI4OTU1ZWU2MzdhODQ0NjM3MjlmZDMwZTdhZmQyZWQ1Zjk2Mjc0ZTVhZDdlNWNiMDllZGE5YzA2ZDkwM2FjJyxcbiAgICAgICAgJ2MyNTYyMTAwM2QzZjQyYTgyN2I3OGExMzA5M2E5NWVlYWMzZDI2ZWZhOGE4ZDgzZmM1MTgwZTkzNWJjZDA5MWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1ZDBmZWYzZWM2ZGIxMDkzOTkwNjRmM2EwZTNiMjg1NTY0NWI0YTkwN2FkMzU0NTI3YWFlNzUxNjNkODI3NTEnLFxuICAgICAgICAnMWYwMzY0ODQxM2EzOGMwYmUyOWQ0OTZlNTgyY2Y1NjYzZTg3NTFlOTY4NzczMzE1ODJjMjM3YTI0ZWIxZjk2MicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmYyYjBkY2U5N2VlY2U5N2MxYzliNjA0MTc5OGI4NWRmZGZiNmQ4ODgyZGEyMDMwOGY1NDA0ODI0NTI2MDg3ZScsXG4gICAgICAgICc0OTNkMTNmZWY1MjRiYTE4OGFmNGM0ZGM1NGQwNzkzNmM3YjdlZDZmYjkwZTJjZWIyYzk1MWUwMWYwYzI5OTA3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4MjdmYmJlNGIxZTg4MGVhOWVkMmIyZTYzMDFiMjEyYjU3ZjFlZTE0OGNkNmRkMjg3ODBlNWUyY2Y4NTZlMjQxJyxcbiAgICAgICAgJ2M2MGY5YzkyM2M3MjdiMGI3MWJlZjJjNjdkMWQxMjY4N2ZmN2E2MzE4NjkwMzE2NmQ2MDViNjhiYWVjMjkzZWMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VhYTY0OWYyMWY1MWJkYmFlN2JlNGFlMzRjZTZlNTIxN2E1OGZkY2U3ZjQ3ZjlhYTdmM2I1OGZhMjEyMGUyYjMnLFxuICAgICAgICAnYmUzMjc5ZWQ1YmJiYjAzYWM2OWE4MGY4OTg3OWFhNWEwMWE2Yjk2NWYxM2Y3ZTU5ZDQ3YTUzMDViYTVhZDkzZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTRhNDJkNDNjNWNmMTY5ZDkzOTFkZjZkZWNmNDJlZTU0MWI2ZDhmMGM5YTEzNzQwMWUyMzYzMmRkYTM0ZDI0ZicsXG4gICAgICAgICc0ZDlmOTJlNzE2ZDFjNzM1MjZmYzk5Y2NmYjhhZDM0Y2U4ODZlZWRmYThkOGU0ZjEzYTdmNzEzMWRlYmE5NDE0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxZWM4MGZlZjM2MGNiZGQ5NTQxNjBmYWRhYjM1MmI2YjkyYjUzNTc2YTg4ZmVhNDk0NzE3M2I5ZDQzMDBiZjE5JyxcbiAgICAgICAgJ2FlZWZlOTM3NTZiNTM0MGQyZjNhNDk1OGE3YWJiZjVlMDE0NmU3N2Y2Mjk1YTA3YjY3MWNkYzFjYzEwN2NlZmQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE0NmE3NzhjMDQ2NzBjMmY5MWIwMGFmNDY4MGRmYThiY2UzNDkwNzE3ZDU4YmE4ODlkZGI1OTI4MzY2NjQyYmUnLFxuICAgICAgICAnYjMxOGUwZWMzMzU0MDI4YWRkNjY5ODI3ZjlkNGIyODcwYWFhOTcxZDJmN2U1ZWQxZDBiMjk3NDgzZDgzZWZkMCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmE1MGMwZjYxZDIyZTVmMDdlM2FjZWJiMWFhMDdiMTI4ZDAwMTIyMDlhMjhiOTc3NmQ3NmE4NzkzMTgwZWVmOScsXG4gICAgICAgICc2Yjg0YzY5MjIzOTdlYmE5YjcyY2QyODcyMjgxYTY4YTVlNjgzMjkzYTU3YTIxM2IzOGNkOGQ3ZDNmNGYyODExJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYTFkNjFkMGNhNzIxYTExYjFhNWJmNmI3ZDg4ZTg0MjFhMjg4YWI1ZDViYmE1MjIwZTUzZDMyYjVmMDY3ZWMyJyxcbiAgICAgICAgJzgxNTdmNTVhN2M5OTMwNmM3OWMwNzY2MTYxYzkxZTI5NjZhNzM4OTlkMjc5YjQ4YTY1NWZiYTBmMWFkODM2ZjEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E4ZTI4MmZmMGM5NzA2OTA3MjE1ZmY5OGU4ZmQ0MTY2MTUzMTFkZTA0NDZmMWUwNjJhNzNiMDYxMGQwNjRlMTMnLFxuICAgICAgICAnN2Y5NzM1NWI4ZGI4MWMwOWFiZmI3ZjNjNWIyNTE1ODg4YjY3OWEzZTUwZGQ2YmQ2Y2VmN2M3MzExMWY0Y2MwYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTc0YTUzYjljOWEyODU4NzJkMzllNTZlNjkxM2NhYjE1ZDU5YjFmYTUxMjUwOGMwMjJmMzgyZGU4MzE5NDk3YycsXG4gICAgICAgICdjY2M5ZGMzN2FiZmM5YzE2NTdiNDE1NWYyYzQ3ZjllNjY0NmIzYTFkOGNiOTg1NDM4M2RhMTNhYzA3OWFmYTczJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5NTkzOTY5ODE5NDM3ODVjM2QzZTU3ZWRmNTAxOGNkYmUwMzllNzMwZTQ5MThiM2Q4ODRmZGZmMDk0NzViN2JhJyxcbiAgICAgICAgJzJlN2U1NTI4ODhjMzMxZGQ4YmEwMzg2YTRiOWNkNjg0OWM2NTNmNjRjODcwOTM4NWU5YjhhYmY4NzUyNGYyZmQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QyYTYzYTUwYWU0MDFlNTZkNjQ1YTExNTNiMTA5YThmY2NhMGE0M2Q1NjFmYmEyZGJiNTEzNDBjOWQ4MmIxNTEnLFxuICAgICAgICAnZTgyZDg2ZmI2NDQzZmNiNzU2NWFlZTU4YjI5NDgyMjBhNzBmNzUwYWY0ODRjYTUyZDQxNDIxNzRkY2Y4OTQwNScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjQ1ODdlMjMzNTQ3MWViODkwZWU3ODk2ZDdjZmRjODY2YmFjYmRiZDM4MzkzMTdiMzQzNmY5YjQ1NjE3ZTA3MycsXG4gICAgICAgICdkOTlmY2RkNWJmNjkwMmUyYWU5NmRkNjQ0N2MyOTlhMTg1YjkwYTM5MTMzYWVhYjM1ODI5OWU1ZTlmYWY2NTg5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NDgxYmRlMGU0ZTRkODg1YjNhNTQ2ZDNlNTQ5ZGUwNDJmMGFhNmNlYTI1MGU3ZmQzNThkNmM4NmRkNDVlNDU4JyxcbiAgICAgICAgJzM4ZWU3YjhjYmE1NDA0ZGQ4NGEyNWJmMzljZWNiMmNhOTAwYTc5YzQyYjI2MmU1NTZkNjRiMWI1OTc3OTA1N2UnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzEzNDY0YTU3YTc4MTAyYWE2MmI2OTc5YWU4MTdmNDYzN2ZmY2ZlZDNjNGIxY2UzMGJjZDYzMDNmNmNhZjY2NmInLFxuICAgICAgICAnNjliZTE1OTAwNDYxNDU4MGVmN2U0MzM0NTNjY2IwY2E0OGYzMDBhODFkMDk0MmUxM2Y0OTVhOTA3ZjZlY2MyNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYmM0YTlkZjViNzEzZmUyZTlhZWY0MzBiY2MxZGM5N2EwY2Q5Y2NlZGUyZjI4NTg4Y2FkYTNhMGQyZDgzZjM2NicsXG4gICAgICAgICdkM2E4MWNhNmU3ODVjMDYzODM5MzdhZGY0Yjc5OGNhYTZlOGE5ZmJmYTU0N2IxNmQ3NThkNjY2NTgxZjMzYzEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhjMjhhOTdiZjgyOThiYzBkMjNkOGM3NDk0NTJhMzJlNjk0YjY1ZTMwYTk0NzJhMzk1NGFiMzBmZTUzMjRjYWEnLFxuICAgICAgICAnNDBhMzA0NjNhMzMwNTE5MzM3OGZlZGYzMWY3Y2MwZWI3YWU3ODRmMDQ1MWNiOTQ1OWU3MWRjNzNjYmVmOTQ4MicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGVhOTY2NjEzOTUyN2E4YzFkZDk0Y2U0ZjA3MWZkMjNjOGIzNTBjNWE0YmIzMzc0OGM0YmExMTFmYWNjYWUwJyxcbiAgICAgICAgJzYyMGVmYWJiYzhlZTI3ODJlMjRlN2MwY2ZiOTVjNWQ3MzViNzgzYmU5Y2YwZjhlOTU1YWYzNGEzMGU2MmI5NDUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RkMzYyNWZhZWY1YmEwNjA3NDY2OTcxNmJiZDM3ODhkODliZGRlODE1OTU5OTY4MDkyZjc2Y2M0ZWI5YTk3ODcnLFxuICAgICAgICAnN2ExODhmYTM1MjBlMzBkNDYxZGEyNTAxMDQ1NzMxY2E5NDE0NjE5ODI4ODMzOTU5MzdmNjhkMDBjNjQ0YTU3MycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjcxMGQ3OWQ5ZWI5NjIyOTdlNGY2MjMyYjQwZThmN2ZlYjJiYzYzODE0NjE0ZDY5MmMxMmRlNzUyNDA4MjIxZScsXG4gICAgICAgICdlYTk4ZTY3MjMyZDNiMzI5NWQzYjUzNTUzMjExNWNjYWM4NjEyYzcyMTg1MTYxNzUyNmFlNDdhOWM3N2JmYzgyJyxcbiAgICAgIF0sXG4gICAgXSxcbiAgfSxcbiAgbmFmOiB7XG4gICAgd25kOiA3LFxuICAgIHBvaW50czogW1xuICAgICAgW1xuICAgICAgICAnZjkzMDhhMDE5MjU4YzMxMDQ5MzQ0Zjg1Zjg5ZDUyMjliNTMxYzg0NTgzNmY5OWIwODYwMWYxMTNiY2UwMzZmOScsXG4gICAgICAgICczODhmN2IwZjYzMmRlODE0MGZlMzM3ZTYyYTM3ZjM1NjY1MDBhOTk5MzRjMjIzMWI2Y2I5ZmQ3NTg0YjhlNjcyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyZjhiZGU0ZDFhMDcyMDkzNTViNGE3MjUwYTVjNTEyOGU4OGI4NGJkZGM2MTlhYjdjYmE4ZDU2OWIyNDBlZmU0JyxcbiAgICAgICAgJ2Q4YWMyMjI2MzZlNWUzZDZkNGRiYTlkZGE2YzljNDI2Zjc4ODI3MWJhYjBkNjg0MGRjYTg3ZDNhYTZhYzYyZDYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzVjYmRmMDY0NmU1ZGI0ZWFhMzk4ZjM2NWYyZWE3YTBlM2Q0MTliN2UwMzMwZTM5Y2U5MmJkZGVkY2FjNGY5YmMnLFxuICAgICAgICAnNmFlYmNhNDBiYTI1NTk2MGEzMTc4ZDZkODYxYTU0ZGJhODEzZDBiODEzZmRlN2I1YTUwODI2MjgwODcyNjRkYScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYWNkNDg0ZTJmMGM3ZjY1MzA5YWQxNzhhOWY1NTlhYmRlMDk3OTY5NzRjNTdlNzE0YzM1ZjExMGRmYzI3Y2NiZScsXG4gICAgICAgICdjYzMzODkyMWIwYTdkOWZkNjQzODA5NzE3NjNiNjFlOWFkZDg4OGE0Mzc1ZjhlMGYwNWNjMjYyYWM2NGY5YzM3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NzRhZTdmODU4YTk0MTFlNWVmNDI0NmI3MGM2NWFhYzU2NDk5ODBiZTVjMTc4OTFiYmVjMTc4OTVkYTAwOGNiJyxcbiAgICAgICAgJ2Q5ODRhMDMyZWI2YjVlMTkwMjQzZGQ1NmQ3YjdiMzY1MzcyZGIxZTJkZmY5ZDZhODMwMWQ3NGM5Yzk1M2M2MWInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YyODc3M2MyZDk3NTI4OGJjN2QxZDIwNWMzNzQ4NjUxYjA3NWZiYzY2MTBlNThjZGRlZWRkZjhmMTk0MDVhYTgnLFxuICAgICAgICAnYWIwOTAyZThkODgwYTg5NzU4MjEyZWI2NWNkYWY0NzNhMWEwNmRhNTIxZmE5MWYyOWI1Y2I1MmRiMDNlZDgxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNzkyNGQ0ZjdkNDNlYTk2NWE0NjVhZTMwOTVmZjQxMTMxZTU5NDZmM2M4NWY3OWU0NGFkYmNmOGUyN2UwODBlJyxcbiAgICAgICAgJzU4MWUyODcyYTg2YzcyYTY4Mzg0MmVjMjI4Y2M2ZGVmZWE0MGFmMmJkODk2ZDNhNWM1MDRkYzlmZjZhMjZiNTgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RlZmRlYTRjZGI2Nzc3NTBhNDIwZmVlODA3ZWFjZjIxZWI5ODk4YWU3OWI5NzY4NzY2ZTRmYWEwNGEyZDRhMzQnLFxuICAgICAgICAnNDIxMWFiMDY5NDYzNTE2OGU5OTdiMGVhZDJhOTNkYWVjZWQxZjRhMDRhOTVjMGY2Y2ZiMTk5ZjY5ZTU2ZWI3NycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMmI0ZWEwYTc5N2E0NDNkMjkzZWY1Y2ZmNDQ0ZjQ5NzlmMDZhY2ZlYmQ3ZTg2ZDI3NzQ3NTY1NjEzODM4NWI2YycsXG4gICAgICAgICc4NWU4OWJjMDM3OTQ1ZDkzYjM0MzA4M2I1YTFjODYxMzFhMDFmNjBjNTAyNjk3NjNiNTcwYzg1NGU1YzA5YjdhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNTJiYmY0YTRjZGQxMjU2NGY5M2ZhMzMyY2UzMzMzMDFkOWFkNDAyNzFmODEwNzE4MTM0MGFlZjI1YmU1OWQ1JyxcbiAgICAgICAgJzMyMWViNDA3NTM0OGY1MzRkNTljMTgyNTlkZGEzZTFmNGExYjNiMmU3MWIxMDM5YzY3YmQzZDhiY2Y4MTk5OGMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzJmYTIxMDRkNmIzOGQxMWIwMjMwMDEwNTU5ODc5MTI0ZTQyYWI4ZGZlZmY1ZmYyOWRjOWNkYWRkNGVjYWNjM2YnLFxuICAgICAgICAnMmRlMTA2ODI5NWRkODY1YjY0NTY5MzM1YmQ1ZGQ4MDE4MWQ3MGVjZmM4ODI2NDg0MjNiYTc2YjUzMmI3ZDY3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5MjQ4Mjc5YjA5YjRkNjhkYWIyMWE5YjA2NmVkZGE4MzI2M2MzZDg0ZTA5NTcyZTI2OWNhMGNkN2Y1NDUzNzE0JyxcbiAgICAgICAgJzczMDE2ZjdiZjIzNGFhZGU1ZDFhYTcxYmRlYTJiMWZmM2ZjMGRlMmE4ODc5MTJmZmU1NGEzMmNlOTdjYjM0MDInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhZWQ0ZjJiZTNhOGJmMjc4ZTcwMTMyZmIwYmViNzUyMmY1NzBlMTQ0YmY2MTVjMDdlOTk2ZDQ0M2RlZTg3MjknLFxuICAgICAgICAnYTY5ZGNlNGE3ZDZjOThlOGQ0YTFhY2E4N2VmOGQ3MDAzZjgzYzIzMGYzYWZhNzI2YWI0MGU1MjI5MGJlMWM1NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzQ0ZDEyYzcwNjVkODEyZThhY2YyOGQ3Y2JiMTlmOTAxMWVjZDllOWZkZjI4MWIwZTZhM2I1ZTg3ZDIyZTdkYicsXG4gICAgICAgICcyMTE5YTQ2MGNlMzI2Y2RjNzZjNDU5MjZjOTgyZmRhYzBlMTA2ZTg2MWVkZjYxYzVhMDM5MDYzZjBlMGU2NDgyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2YTI0NWJmNmRjNjk4NTA0Yzg5YTIwY2ZkZWQ2MDg1MzE1MmI2OTUzMzZjMjgwNjNiNjFjNjVjYmQyNjllNmI0JyxcbiAgICAgICAgJ2UwMjJjZjQyYzJiZDRhNzA4YjNmNTEyNmYxNmEyNGFkOGIzM2JhNDhkMDQyM2I2ZWZkNWU2MzQ4MTAwZDhhODInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE2OTdmZmE2ZmQ5ZGU2MjdjMDc3ZTNkMmZlNTQxMDg0Y2UxMzMwMGIwYmVjMTE0NmY5NWFlNTdmMGQwYmQ2YTUnLFxuICAgICAgICAnYjljMzk4ZjE4NjgwNmY1ZDI3NTYxNTA2ZTQ1NTc0MzNhMmNmMTUwMDllNDk4YWU3YWRlZTlkNjNkMDFiMjM5NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjA1YmRiMDE5OTgxNzE4Yjk4NmQwZjA3ZTgzNGNiMGQ5ZGViODM2MGZmYjdmNjFkZjk4MjM0NWVmMjdhNzQ3OScsXG4gICAgICAgICcyOTcyZDJkZTRmOGQyMDY4MWE3OGQ5M2VjOTZmZTIzYzI2YmZhZTg0ZmIxNGRiNDNiMDFlMWU5MDU2YjhjNDknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYyZDE0ZGFiNDE1MGJmNDk3NDAyZmRjNDVhMjE1ZTEwZGNiMDFjMzU0OTU5YjEwY2ZlMzFjN2U5ZDg3ZmYzM2QnLFxuICAgICAgICAnODBmYzA2YmQ4Y2M1YjAxMDk4MDg4YTE5NTBlZWQwZGIwMWFhMTMyOTY3YWI0NzIyMzVmNTY0MjQ4M2IyNWVhZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODBjNjBhZDAwNDBmMjdkYWRlNWI0YjA2YzQwOGU1NmIyYzUwZTlmNTZiOWI4YjQyNWU1NTVjMmY4NjMwOGI2ZicsXG4gICAgICAgICcxYzM4MzAzZjFjYzVjMzBmMjZlNjZiYWQ3ZmU3MmY3MGE2NWVlZDRjYmU3MDI0ZWIxYWEwMWY1NjQzMGJkNTdhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3YTkzNzVhZDYxNjdhZDU0YWE3NGM2MzQ4Y2M1NGQzNDRjYzVkYzk0ODdkODQ3MDQ5ZDVlYWJiMGZhMDNjOGZiJyxcbiAgICAgICAgJ2QwZTNmYTllY2E4NzI2OTA5NTU5ZTBkNzkyNjkwNDZiZGM1OWVhMTBjNzBjZTJiMDJkNDk5ZWMyMjRkYzdmNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDUyOGVjZDliNjk2YjU0YzkwN2E5ZWQwNDU0NDdhNzliYjQwOGVjMzliNjhkZjUwNGJiNTFmNDU5YmMzZmZjOScsXG4gICAgICAgICdlZWNmNDEyNTMxMzZlNWY5OTk2NmYyMTg4MWZkNjU2ZWJjNDM0NTQwNWM1MjBkYmMwNjM0NjViNTIxNDA5OTMzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0OTM3MGE0YjVmNDM0MTJlYTI1ZjUxNGU4ZWNkYWQwNTI2NjExNWU0YTdlY2IxMzg3MjMxODA4ZjhiNDU5NjMnLFxuICAgICAgICAnNzU4ZjNmNDFhZmQ2ZWQ0MjhiMzA4MWIwNTEyZmQ2MmE1NGMzZjNhZmJiNWI2NzY0YjY1MzA1MmExMjk0OWM5YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzdmMjMwOTM2ZWU4OGNiYmQ3M2RmOTMwZDY0NzAyZWY4ODFkODExZTBlMTQ5OGUyZjFjMTNlYjFmYzM0NWQ3NCcsXG4gICAgICAgICc5NThlZjQyYTc4ODZiNjQwMGEwODI2NmU5YmExYjM3ODk2Yzk1MzMwZDk3MDc3Y2JiZThlYjNjNzY3MWM2MGQ2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMmRhYzk5MWNjNGNlNGI5ZWE0NDg4N2U1YzdjMGJjZTU4YzgwMDc0YWI5ZDRkYmFlYjI4NTMxYjc3MzlmNTMwJyxcbiAgICAgICAgJ2UwZGVkYzliM2IyZjhkYWQ0ZGExZjMyZGVjMjUzMWRmOWViNWZiZWIwNTk4ZTRmZDFhMTE3ZGJhNzAzYTNjMzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ2M2IzZDlmNjYyNjIxZmIxYjRiZThmYmJlMjUyMDEyNWEyMTZjZGZjOWRhZTNkZWJjYmE0ODUwYzY5MGQ0NWInLFxuICAgICAgICAnNWVkNDMwZDc4YzI5NmMzNTQzMTE0MzA2ZGQ4NjIyZDdjNjIyZTI3Yzk3MGExZGUzMWNiMzc3YjAxYWY3MzA3ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjE2ZjgwNDI0NGU0NmUyYTA5MjMyZDRhZmYzYjU5OTc2Yjk4ZmFjMTQzMjhhMmQxYTMyNDk2YjQ5OTk4ZjI0NycsXG4gICAgICAgICdjZWRhYmQ5YjgyMjAzZjdlMTNkMjA2ZmNkZjRlMzNkOTJhNmM1M2MyNmU1Y2NlMjZkNjU3OTk2MmM0ZTMxZGY2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjYWY3NTQyNzJkYzg0NTYzYjAzNTJiN2ExNDMxMWFmNTVkMjQ1MzE1YWNlMjdjNjUzNjllMTVmNzE1MWQ0MWQxJyxcbiAgICAgICAgJ2NiNDc0NjYwZWYzNWY1ZjJhNDFiNjQzZmE1ZTQ2MDU3NWY0ZmE5Yjc5NjIyMzJhNWMzMmY5MDgzMThhMDQ0NzYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzI2MDBjYTRiMjgyY2I5ODZmODVkMGYxNzA5OTc5ZDhiNDRhMDljMDdjYjg2ZDdjMTI0NDk3YmM4NmYwODIxMjAnLFxuICAgICAgICAnNDExOWI4ODc1M2MxNWJkNmE2OTNiMDNmY2RkYmI0NWQ1YWM2YmU3NGFiNWYwZWY0NGIwYmU5NDc1YTdlNGI0MCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzYzNWNhNzJkN2U4NDMyYzMzOGVjNTNjZDEyMjIwYmMwMWM0ODY4NWUyNGY3ZGM4YzYwMmE3NzQ2OTk4ZTQzNScsXG4gICAgICAgICc5MWI2NDk2MDk0ODlkNjEzZDFkNWU1OTBmNzhlNmQ3NGVjZmMwNjFkNTcwNDhiYWQ5ZTc2ZjMwMmM1YjljNjEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc1NGUzMjM5ZjMyNTU3MGNkYmJmNGE4N2RlZWU4YTY2YjdmMmIzMzQ3OWQ0NjhmYmMxYTUwNzQzYmY1NmNjMTgnLFxuICAgICAgICAnNjczZmI4NmU1YmRhMzBmYjNjZDBlZDMwNGVhNDlhMDIzZWUzM2QwMTk3YTY5NWQwYzVkOTgwOTNjNTM2NjgzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlM2U2YmQxMDcxYTFlOTZhZmY1Nzg1OWM4MmQ1NzBmMDMzMDgwMDY2MWQxYzk1MmY5ZmUyNjk0NjkxZDliOWU4JyxcbiAgICAgICAgJzU5YzllMGJiYTM5NGU3NmY0MGMwYWE1ODM3OWEzY2I2YTVhMjI4Mzk5M2U5MGM0MTY3MDAyYWY0OTIwZTM3ZjUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE4NmI0ODNkMDU2YTAzMzgyNmFlNzNkODhmNzMyOTg1YzRjY2IxZjMyYmEzNWY0YjRjYzQ3ZmRjZjA0YWE2ZWInLFxuICAgICAgICAnM2I5NTJkMzJjNjdjZjc3ZTJlMTc0NDZlMjA0MTgwYWIyMWZiODA5MDg5NTEzOGI0YTRhNzk3Zjg2ZTgwODg4YicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGY5ZDcwYTZiOTg3NmNlNTQ0Yzk4NTYxZjRiZTRmNzI1NDQyZTZkMmI3MzdkOWM5MWE4MzIxNzI0Y2UwOTYzZicsXG4gICAgICAgICc1NWViMmRhZmQ4NGQ2Y2NkNWY4NjJiNzg1ZGMzOWQ0YWIxNTcyMjI3MjBlZjlkYTIxN2I4YzQ1Y2YyYmEyNDE3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1ZWRkNWNjMjNjNTFlODdhNDk3Y2E4MTVkNWRjZTBmOGFiNTI1NTRmODQ5ZWQ4OTk1ZGU2NGM1ZjM0Y2U3MTQzJyxcbiAgICAgICAgJ2VmYWU5YzhkYmMxNDEzMDY2MWU4Y2VjMDMwYzg5YWQwYzEzYzY2YzBkMTdhMjkwNWNkYzcwNmFiNzM5OWE4NjgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzI5MDc5OGMyYjY0NzY4MzBkYTEyZmUwMjI4N2U5ZTc3N2FhM2ZiYTFjMzU1YjE3YTcyMmQzNjJmODQ2MTRmYmEnLFxuICAgICAgICAnZTM4ZGE3NmRjZDQ0MDYyMTk4OGQwMGJjZjc5YWYyNWQ1YjI5YzA5NGRiMmEyMzE0NmQwMDNhZmQ0MTk0M2U3YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYWYzYzQyM2E5NWQ5ZjViMzA1NDc1NGVmYTE1MGFjMzljZDI5NTUyZmUzNjAyNTczNjJkZmRlY2VmNDA1M2I0NScsXG4gICAgICAgICdmOThhM2ZkODMxZWIyYjc0OWE5M2IwZTZmMzVjZmI0MGM4Y2Q1YWE2NjdhMTU1ODFiYzJmZWRlZDQ5OGZkOWM2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NjZkYmIyNGQxMzRlNzQ1Y2NjYWEyOGM5OWJmMjc0OTA2YmI2NmIyNmRjZjk4ZGY4ZDJmZWQ1MGQ4ODQyNDlhJyxcbiAgICAgICAgJzc0NGIxMTUyZWFjYmU1ZTM4ZGNjODg3OTgwZGEzOGI4OTc1ODRhNjVmYTA2Y2VkZDJjOTI0Zjk3Y2JhYzU5OTYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzU5ZGJmNDZmOGM5NDc1OWJhMjEyNzdjMzM3ODRmNDE2NDVmN2I0NGY2YzU5NmE1OGNlOTJlNjY2MTkxYWJlM2UnLFxuICAgICAgICAnYzUzNGFkNDQxNzVmYmMzMDBmNGVhNmNlNjQ4MzA5YTA0MmNlNzM5YTc5MTk3OThjZDg1ZTIxNmM0YTMwN2Y2ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjEzYWRhOTUxMDNjNDUzNzMwNWU2OTFlNzRlOWE0YThkZDY0N2U3MTFhOTVlNzNjYjYyZGM2MDE4Y2ZkODdiOCcsXG4gICAgICAgICdlMTM4MTdiNDRlZTE0ZGU2NjNiZjRiYzgwODM0MWYzMjY5NDllMjFhNmE3NWMyNTcwNzc4NDE5YmRhZjU3MzNkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NzU0YjRmYTBlOGFjZWQwNmQ0MTY3YTJjNTljY2E0Y2RhMTg2OWMwNmViYWRmYjY0ODg1NTAwMTVhODg1MjJjJyxcbiAgICAgICAgJzMwZTkzZTg2NGU2NjlkODIyMjRiOTY3YzMwMjBiOGZhOGQxZTRlMzUwYjZjYmNjNTM3YTQ4YjU3ODQxMTYzYTInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk0OGRjYWRmNTk5MGUwNDhhYTM4NzRkNDZhYmVmOWQ3MDE4NThmOTVkZTgwNDFkMmE2ODI4Yzk5ZTIyNjI1MTknLFxuICAgICAgICAnZTQ5MWE0MjUzN2Y2ZTU5N2Q1ZDI4YTMyMjRiMWJjMjVkZjkxNTRlZmJkMmVmMWQyY2JiYTJjYWU1MzQ3ZDU3ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzk2MjQxNDQ1MGM3NmMxNjg5YzdiNDhmODIwMmVjMzdmYjIyNGNmNWFjMGJmYTE1NzAzMjhhOGEzZDdjNzdhYicsXG4gICAgICAgICcxMDBiNjEwZWM0ZmZiNDc2MGQ1YzFmYzEzM2VmNmY2YjEyNTA3YTA1MWYwNGFjNTc2MGFmYTViMjlkYjgzNDM3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNTE0MDg3ODM0OTY0YjU0YjE1YjE2MDY0NGQ5MTU0ODVhMTY5NzcyMjViODg0N2JiMGRkMDg1MTM3ZWM0N2NhJyxcbiAgICAgICAgJ2VmMGFmYmIyMDU2MjA1NDQ4ZTE2NTJjNDhlODEyN2ZjNjAzOWU3N2MxNWMyMzc4YjdlN2QxNWEwZGUyOTMzMTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QzY2MzMGFkNmI0ODNlNGJjNzljZTJjOWRkOGJjNTQ5OTNlOTQ3ZWI4ZGY3ODdiNDQyOTQzZDNmN2I1MjdlYWYnLFxuICAgICAgICAnOGIzNzhhMjJkODI3Mjc4ZDg5YzVlOWJlOGY5NTA4YWUzYzJhZDQ2MjkwMzU4NjMwYWZiMzRkYjA0ZWVkZTBhNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTYyNGQ4NDc4MDczMjg2MGNlMWM3OGZjYmZlZmUwOGIyYjI5ODIzZGI5MTNmNjQ5Mzk3NWJhMGZmNDg0NzYxMCcsXG4gICAgICAgICc2ODY1MWNmOWI2ZGE5MDNlMDkxNDQ0OGM2Y2Q5ZDRjYTg5Njg3OGY1MjgyYmU0YzhjYzA2ZTJhNDA0MDc4NTc1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3MzNjZTgwZGE5NTVhOGEyNjkwMmM5NTYzM2U2MmE5ODUxOTI0NzRiNWFmMjA3ZGE2ZGY3YjRmZDVmYzYxY2Q0JyxcbiAgICAgICAgJ2Y1NDM1YTJiZDJiYWRmN2Q0ODVhNGQ4YjhkYjlmY2NlM2UxZWY4ZTAyMDFlNDU3OGM1NDY3M2JjMWRjNWVhMWQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE1ZDk0NDEyNTQ5NDUwNjRjZjFhMWMzM2JiZDNiNDlmODk2NmM1MDkyMTcxZTY5OWVmMjU4ZGZhYjgxYzA0NWMnLFxuICAgICAgICAnZDU2ZWIzMGI2OTQ2M2U3MjM0ZjUxMzdiNzNiODQxNzc0MzQ4MDBiYWNlYmZjNjg1ZmMzN2JiZTllZmU0MDcwZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTFkMGZjZjJlYzlkZTY3NWI2MTIxMzZlNWNlNzBkMjcxYzIxNDE3YzlkMmI4YWFhYWMxMzg1OTlkMDcxNzk0MCcsXG4gICAgICAgICdlZGQ3N2Y1MGJjYjVhM2NhYjJlOTA3MzczMDk2NjdmMjY0MTQ2MmE1NDA3MGYzZDUxOTIxMmQzOWMxOTdhNjI5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMjJmYmUxNWMwYWY4Y2NjNTc4MGMwNzM1Zjg0ZGJlOWE3OTBiYWRlZTgyNDVjMDZjN2NhMzczMzFjYjM2OTgwJyxcbiAgICAgICAgJ2E4NTViYWJhZDVjZDYwYzg4YjQzMGE2OWY1M2ExYTdhMzgyODkxNTQ5NjQ3OTliZTQzZDA2ZDc3ZDMxZGEwNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzExMDkxZGQ5ODYwZThlMjBlZTEzNDczYzExNTVmNWY2OTYzNWUzOTQ3MDRlYWE3NDAwOTQ1MjI0NmNmYTliMycsXG4gICAgICAgICc2NmRiNjU2Zjg3ZDFmMDRmZmZkMWYwNDc4OGMwNjgzMDg3MWVjNWE2NGZlZWU2ODViZDgwZjBiMTI4NmQ4Mzc0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNGMxZmQwNGQzMDFiZTg5YjMxYzA0NDJkM2U2YWMyNDg4MzkyOGI0NWE5MzQwNzgxODY3ZDQyMzJlYzJkYmRmJyxcbiAgICAgICAgJzk0MTQ2ODVlOTdiMWI1OTU0YmQ0NmY3MzAxNzQxMzZkNTdmMWNlZWI0ODc0NDNkYzUzMjE4NTdiYTczYWJlZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjIxOWVhNWQ2YjU0NzAxYzFjMTRkZTViNTU3ZWI0MmE4ZDEzZjNhYmJjZDA4YWZmY2MyYTVlNmIwNDliOGQ2MycsXG4gICAgICAgICc0Y2I5NTk1N2U4M2Q0MGIwZjczYWY0NTQ0Y2NjZjZiMWY0YjA4ZDNjMDdiMjdmYjhkOGMyOTYyYTQwMDc2NmQxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkN2I4NzQwZjc0YThmYmFhYjFmNjgzZGI4ZjQ1ZGUyNjU0M2E1NDkwYmNhNjI3MDg3MjM2OTEyNDY5YTBiNDQ4JyxcbiAgICAgICAgJ2ZhNzc5NjgxMjhkOWM5MmVlMTAxMGYzMzdhZDQ3MTdlZmYxNWRiNWVkM2MwNDliMzQxMWUwMzE1ZWFhNDU5M2InLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyZDMxYzIyMmY4ZjZmMGVmODZmN2M5OGQzYTMzMzVlYWQ1YmNkMzJhYmRkOTQyODlmZTRkMzA5MWFhODI0YmYnLFxuICAgICAgICAnNWYzMDMyZjU4OTIxNTZlMzljY2QzZDc5MTViOWUxZGEyZTZkYWM5ZTZmMjZlOTYxMTE4ZDE0Yjg0NjJlMTY2MScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzQ2MWYzNzE5MTRhYjMyNjcxMDQ1YTE1NWQ5ODMxZWE4NzkzZDc3Y2Q1OTU5MmM0MzQwZjg2Y2JjMTgzNDdiNScsXG4gICAgICAgICc4ZWMwYmEyMzhiOTZiZWMwY2JkZGRjYWUwYWE0NDI1NDJlZWUxZmY1MGM5ODZlYTZiMzk4NDdiM2NjMDkyZmY2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlZTA3OWFkYjFkZjE4NjAwNzQzNTZhMjVhYTM4MjA2YTZkNzE2YjJjM2U2NzQ1M2QyODc2OThiYWQ3YjJiMmQ2JyxcbiAgICAgICAgJzhkYzI0MTJhYWZlM2JlNWM0YzVmMzdlMGVjYzVmOWY2YTQ0Njk4OWFmMDRjNGUyNWViYWFjNDc5ZWMxYzhjMWUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE2ZWM5M2U0NDdlYzgzZjA0NjdiMTgzMDJlZTYyMGY3ZTY1ZGUzMzE4NzRjOWRjNzJiZmQ4NjE2YmE5ZGE2YjUnLFxuICAgICAgICAnNWU0NjMxMTUwZTYyZmI0MGQwZThjMmE3Y2E1ODA0YTM5ZDU4MTg2YTUwZTQ5NzEzOTYyNjc3OGUyNWIwNjc0ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWFhNWY5ODBjMjQ1ZjZmMDM4OTc4MjkwYWZhNzBiNmJkODg1NTg5N2Y5OGI2YWE0ODViOTYwNjVkNTM3YmQ5OScsXG4gICAgICAgICdmNjVmNWQzZTI5MmMyZTA4MTlhNTI4MzkxYzk5NDYyNGQ3ODQ4NjlkN2U2ZWE2N2ZiMTgwNDEwMjRlZGMwN2RjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OGM5NDA3NTQ0YWMxMzI2OTJlZTE5MTBhMDI0Mzk5NThhZTA0ODc3MTUxMzQyZWE5NmM0YjZiMzVhNDlmNTEnLFxuICAgICAgICAnZjNlMDMxOTE2OWViOWI4NWQ1NDA0Nzk1NTM5YTVlNjhmYTFmYmQ1ODNjMDY0ZDI0NjJiNjc1ZjE5NGEzZGRiNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDk0ZjRiZTIxOWExYTc3MDE2ZGNkODM4NDMxYWVhMDAwMWNkYzhhZTdhNmZjNjg4NzI2NTc4ZDk3MDI4NTdhNScsXG4gICAgICAgICc0MjI0MmE5NjkyODNhNWYzMzliYTdmMDc1ZTM2YmEyYWY5MjVjZTMwZDc2N2VkNmU1NWY0YjAzMTg4MGQ1NjJjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhNTk4YTgwMzBkYTZkODZjNmJjN2YyZjUxNDRlYTU0OWQyODIxMWVhNThmYWE3MGViZjRjMWU2NjVjMWZlOWI1JyxcbiAgICAgICAgJzIwNGI1ZDZmODQ4MjJjMzA3ZTRiNGE3MTQwNzM3YWVjMjNmYzYzYjY1YjM1Zjg2YTEwMDI2ZGJkMmQ4NjRlNmInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M0MTkxNjM2NWFiYjJiNWQwOTE5MmY1ZjJkYmVhZmVjMjA4ZjAyMGYxMjU3MGExODRkYmFkYzNlNTg1OTU5OTcnLFxuICAgICAgICAnNGYxNDM1MWQwMDg3ZWZhNDlkMjQ1YjMyODk4NDk4OWQ1Y2FmOTQ1MGYzNGJmYzBlZDE2ZTk2YjU4ZmE5OTEzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NDFkNjA2M2E1ODZmYTQ3NWE3MjQ2MDRkYTAzYmM1YjkyYTJlMGQyZTBhMzZhY2ZlNGM3M2E1NTE0NzQyODgxJyxcbiAgICAgICAgJzczODY3ZjU5YzA2NTllODE5MDRmOWExYzc1NDM2OThlNjI1NjJkNjc0NGMxNjljZTdhMzZkZTAxYThkNjE1NCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNWU5NWJiMzk5YTY5NzFkMzc2MDI2OTQ3Zjg5YmRlMmYyODJiMzM4MTA5MjhiZTRkZWQxMTJhYzRkNzBlMjBkNScsXG4gICAgICAgICczOWYyM2YzNjY4MDkwODViZWViZmM3MTE4MTMxMzc3NWE5OWM5YWVkN2Q4YmEzOGIxNjEzODRjNzQ2MDEyODY1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNmU0NjQxYTUzOTQ4ZmQ0NzZjMzlmOGE5OWZkOTc0ZTVlYzA3NTY0YjUzMTVkOGJmOTk0NzFiY2EwZWYyZjY2JyxcbiAgICAgICAgJ2QyNDI0YjFiMWFiZTRlYjgxNjQyMjdiMDg1YzlhYTk0NTZlYTEzNDkzZmQ1NjNlMDZmZDUxY2Y1Njk0Yzc4ZmMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMzNjU4MWVhN2JmYmJiMjkwYzE5MWEyZjUwN2E0MWNmNTY0Mzg0MjE3MGU5MTRmYWVhYjI3YzJjNTc5ZjcyNicsXG4gICAgICAgICdlYWQxMjE2ODU5NWZlMWJlOTkyNTIxMjliNmU1NmIzMzkxZjdhYjE0MTBjZDFlMGVmM2RjZGNhYmQyZmRhMjI0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4YWI4OTgxNmRhZGZkNmI2YTFmMjYzNGZjZjAwZWM4NDAzNzgxMDI1ZWQ2ODkwYzQ4NDk3NDI3MDZiZDQzZWRlJyxcbiAgICAgICAgJzZmZGNlZjA5ZjJmNmQwYTA0NGU2NTRhZWY2MjQxMzZmNTAzZDQ1OWMzZTg5ODQ1ODU4YTQ3YTkxMjljZGQyNGUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzFlMzNmMWE3NDZjOWM1Nzc4MTMzMzQ0ZDkyOTlmY2FhMjBiMDkzOGU4YWNmZjI1NDRiYjQwMjg0YjhjNWZiOTQnLFxuICAgICAgICAnNjA2NjAyNTdkZDExYjNhYTljOGVkNjE4ZDI0ZWRmZjIzMDZkMzIwZjFkMDMwMTBlMzNhN2QyMDU3ZjNiM2I2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NWI3YzFkY2IzY2VjMWI3ZWU3ZjMwZGVkNzlkZDIwYTBlZDFmNGNjMThjYmNmY2ZhNDEwMzYxZmQ4ZjA4ZjMxJyxcbiAgICAgICAgJzNkOThhOWNkZDAyNmRkNDNmMzkwNDhmMjVhODg0N2Y0ZmNhZmFkMTg5NWQ3YTYzM2M2ZmVkM2MzNWU5OTk1MTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzI5ZGY5ZmJkOGQ5ZTQ2NTA5Mjc1ZjRiMTI1ZDZkNDVkN2ZiZTlhM2I4NzhhN2FmODcyYTI4MDA2NjFhYzVmNTEnLFxuICAgICAgICAnYjRjNGZlOTljNzc1YTYwNmUyZDg4NjIxNzkxMzlmZmRhNjFkYzg2MWMwMTllNTVjZDI4NzZlYjJhMjdkODRiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMGIxY2FlMDZiMGE4NDdhM2ZlYTZlNjcxYWFmOGFkZmRmZTU4Y2EyZjc2ODEwNWM4MDgyYjJlNDQ5ZmNlMjUyJyxcbiAgICAgICAgJ2FlNDM0MTAyZWRkZTA5NThlYzRiMTlkOTE3YTZhMjhlNmI3MmRhMTgzNGFmZjBlNjUwZjA0OTUwM2EyOTZjZjInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRlOGNlYWZiOWIzZTlhMTM2ZGM3ZmY2N2U4NDAyOTViNDk5ZGZiM2IyMTMzZTRiYTExM2YyZTRjMGUxMjFlNScsXG4gICAgICAgICdjZjIxNzQxMThjOGI2ZDdhNGI0OGY2ZDUzNGNlNWM3OTQyMmMwODZhNjM0NjA1MDJiODI3Y2U2MmEzMjY2ODNjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkMjRhNDRlMDQ3ZTE5YjZmNWFmYjgxYzdjYTJmNjkwODBhNTA3NjY4OWEwMTA5MTlmNDI3MjVjMmI3ODlhMzNiJyxcbiAgICAgICAgJzZmYjhkNTU5MWI0NjZmOGZjNjNkYjUwZjFjMGYxYzY5MDEzZjk5Njg4N2I4MjQ0ZDJjZGVjNDE3YWZlYThmYTMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VhMDE2MDZhN2E2YzljZGQyNDlmZGZjZmFjYjk5NTg0MDAxZWRkMjhhYmJhYjc3YjUxMDRlOThlOGUzYjM1ZDQnLFxuICAgICAgICAnMzIyYWY0OTA4YzczMTJiMGNmYmZlMzY5ZjdhN2IzY2RiN2Q0NDk0YmMyODIzNzAwY2ZkNjUyMTg4YTNlYTk4ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYWY4YWRkYmYyYjY2MWM4YTZjNjMyODY1NWViOTY2NTEyNTIwMDdkOGM1ZWEzMWJlNGFkMTk2ZGU4Y2UyMTMxZicsXG4gICAgICAgICc2NzQ5ZTY3YzAyOWI4NWY1MmEwMzRlYWZkMDk2ODM2YjI1MjA4MTg2ODBlMjZhYzhmM2RmYmNkYjcxNzQ5NzAwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlM2FlMTk3NDU2NmNhMDZjYzUxNmQ0N2UwZmIxNjVhNjc0YTNkYWJjZmNhMTVlNzIyZjBlMzQ1MGY0NTg4OScsXG4gICAgICAgICcyYWVhYmU3ZTQ1MzE1MTAxMTYyMTdmMDdiZjRkMDczMDBkZTk3ZTQ4NzRmODFmNTMzNDIwYTcyZWViMGJkNmE0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1OTFlZTM1NTMxM2Q5OTcyMWNmNjk5M2ZmZWQxZTNlMzAxOTkzZmYzZWQyNTg4MDIwNzVlYThjZWQzOTdlMjQ2JyxcbiAgICAgICAgJ2IwZWE1NThhMTEzYzMwYmVhNjBmYzQ3NzU0NjBjNzkwMWZmMGIwNTNkMjVjYTJiZGVlZTk4ZjFhNGJlNWQxOTYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzExMzk2ZDU1ZmRhNTRjNDlmMTlhYTk3MzE4ZDhkYTYxZmE4NTg0ZTQ3YjA4NDk0NTA3N2NmMDMyNTViNTI5ODQnLFxuICAgICAgICAnOTk4Yzc0YThjZDQ1YWMwMTI4OWQ1ODMzYTdiZWI0NzQ0ZmY1MzZiMDFiMjU3YmU0YzU3NjdiZWE5M2VhNTdhNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnM2M1ZDJhMWJhMzljNWExNzkwMDAwNzM4YzllMGM0MGI4ZGNkZmQ1NDY4NzU0YjY0MDU1NDAxNTdlMDE3YWE3YScsXG4gICAgICAgICdiMjI4NDI3OTk5NWEzNGUyZjlkNGRlNzM5NmZjMThiODBmOWI4YjlmZGQyNzBmNjY2MWY3OWNhNGM4MWJkMjU3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjYzg3MDRiOGE2MGEwZGVmYTNhOTlhNzI5OWYyZTljM2ZiYzM5NWFmYjA0YWMwNzg0MjVlZjhhMTc5M2NjMDMwJyxcbiAgICAgICAgJ2JkZDQ2MDM5ZmVlZDE3ODgxZDFlMDg2MmRiMzQ3ZjhjZjM5NWI3NGZjNGJjZGM0ZTk0MGI3NGUzYWMxZjFiMTMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M1MzNlNGY3ZWE4NTU1YWFjZDk3NzdhYzVjYWQyOWI5N2RkNGRlZmNjYzUzZWU3ZWEyMDQxMTliMjg4OWIxOTcnLFxuICAgICAgICAnNmYwYTI1NmJjNWVmZGY0MjlhMmZiNjI0MmYxYTQzYTJkOWI5MjViYjRhNGIzYTI2YmI4ZTBmNDVlYjU5NjA5NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzE0ZjhmMmNjYjI3ZDZmMTA5ZjZkMDhkMDNjYzk2YTY5YmE4YzM0ZWVjMDdiYmNmNTY2ZDQ4ZTMzZGE2NTkzJyxcbiAgICAgICAgJ2MzNTlkNjkyM2JiMzk4ZjdmZDQ0NzNlMTZmZTFjMjg0NzViNzQwZGQwOTgwNzVlNmMwZTg2NDkxMTNkYzNhMzgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E2Y2JjMzA0NmJjNmE0NTBiYWMyNDc4OWZhMTcxMTVhNGM5NzM5ZWQ3NWY4ZjIxY2U0NDFmNzJlMGI5MGU2ZWYnLFxuICAgICAgICAnMjFhZTdmNDY4MGU4ODliYjEzMDYxOWUyYzBmOTVhMzYwY2ViNTczYzcwNjAzMTM5ODYyYWZkNjE3ZmE5YjlmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNDdkNmQ5YTAyYzQ4OTI3ZWJmYjg2YzEzNTliMWNhZjEzMGEzYzAyNjdkMTFjZTYzNDRiMzlmOTlkNDNjYzM4JyxcbiAgICAgICAgJzYwZWE3ZjYxYTM1MzUyNGQxYzk4N2Y2ZWNlYzkyZjA4NmQ1NjVhYjY4Nzg3MGNiMTI2ODlmZjFlMzFjNzQ0NDgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhNjU0NWQyMTgxZGI4ZDk4M2Y3ZGNiMzc1ZWY1ODY2ZDQ3YzY3YjFiZjMxYzhjZjg1NWVmNzQzN2I3MjY1NmEnLFxuICAgICAgICAnNDliOTY3MTVhYjY4NzhhNzllNzhmMDdjZTU2ODBjNWQ2NjczMDUxYjQ5MzViZDg5N2ZlYTgyNGI3N2RjMjA4YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzQwNzQ3Y2M5ZDAxMmNiMWExM2I4MTQ4MzA5YzZkZTdlYzI1ZDY5NDVkNjU3MTQ2YjlkNTk5NGI4ZmViMTExMScsXG4gICAgICAgICc1Y2E1NjA3NTNiZTJhMTJmYzZkZTZjYWYyY2I0ODk1NjVkYjkzNjE1NmI5NTE0ZTFiYjVlODMwMzdlMGZhMmQ0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ZTQyYzhlYzgyYzk5Nzk4Y2NmM2E2MTBiZTg3MGU3ODMzOGM3ZjcxMzM0OGJkMzRjODIwM2VmNDAzN2YzNTAyJyxcbiAgICAgICAgJzc1NzFkNzRlZTVlMGZiOTJhN2E4YjMzYTA3NzgzMzQxYTU0OTIxNDRjYzU0YmNjNDBhOTQ0NzM2OTM2MDY0MzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM3NzVhYjcwODliYzZhZjgyM2FiYTJlMWFmNzBiMjM2ZDI1MWNhZGIwYzg2NzQzMjg3NTIyYTFiM2IwZGVkZWEnLFxuICAgICAgICAnYmU1MmQxMDdiY2ZhMDlkOGJjYjk3MzZhODI4Y2ZhN2ZhYzhkYjE3YmY3YTc2YTJjNDJhZDk2MTQwOTAxOGNmNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnY2VlMzFjYmY3ZTM0ZWMzNzlkOTRmYjgxNGQzZDc3NWFkOTU0NTk1ZDEzMTRiYTg4NDY5NTllM2U4MmY3NGUyNicsXG4gICAgICAgICc4ZmQ2NGExNGMwNmI1ODljMjZiOTQ3YWUyYmNmNmJmYTAxNDllZjBiZTE0ZWQ0ZDgwZjQ0OGEwMWM0M2IxYzZkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiNGY5ZWFlYTA5YjY5MTc2MTlmNmVhNmE0ZWI1NDY0ZWZkZGI1OGZkNDViMWViZWZjZGMxYTAxZDA4YjQ3OTg2JyxcbiAgICAgICAgJzM5ZTVjOTkyNWI1YTU0YjA3NDMzYTRmMThjNjE3MjZmOGJiMTMxYzAxMmNhNTQyZWIyNGE4YWMwNzIwMDY4MmEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q0MjYzZGZjM2QyZGY5MjNhMDE3OWE0ODk2NmQzMGNlODRlMjUxNWFmYzNkY2NjMWI3NzkwNzc5MmViY2M2MGUnLFxuICAgICAgICAnNjJkZmFmMDdhMGY3OGZlYjMwZTMwZDYyOTU4NTNjZTE4OWUxMjc3NjBhZDZjZjdmYWUxNjRlMTIyYTIwOGQ1NCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDg0NTc1MjQ4MjBmYTY1YTRmOGQzNWViNjkzMDg1N2MwMDMyYWNjMGE0YTJkZTQyMjIzM2VlZGE4OTc2MTJjNCcsXG4gICAgICAgICcyNWE3NDhhYjM2Nzk3OWQ5ODczM2MzOGExZmExYzJlN2RjNmNjMDdkYjJkNjBhOWFlN2E3NmFhYTQ5YmQwZjc3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZmVlZWYxODgxMTAxZjJjYjExNjQ0ZjNhMmFmZGZjMjA0NWUxOTkxOTE1MjkyM2YzNjdhMTc2N2MxMWNjZWRhJyxcbiAgICAgICAgJ2VjZmI3MDU2Y2YxZGUwNDJmOTQyMGJhYjM5Njc5M2MwYzM5MGJkZTc0YjRiYmRmZjE2YTgzYWUwOWE5YTc1MTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzZkN2VmNmIxNzU0M2Y4MzczYzU3M2Y0NGUxZjM4OTgzNWQ4OWJjYmM2MDYyY2VkMzZjODJkZjgzYjhmYWU4NTknLFxuICAgICAgICAnY2Q0NTBlYzMzNTQzODk4NmRmZWZhMTBjNTdmZWE5YmNjNTIxYTA5NTliMmQ4MGJiZjc0YjE5MGRjYTcxMmQxMCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTc1NjA1ZDU5MTAyYTVhMjY4NDUwMGQzYjk5MWYyZTNmM2M4OGI5MzIyNTU0NzAzNWFmMjVhZjY2ZTA0NTQxZicsXG4gICAgICAgICdmNWM1NDc1NGE4ZjcxZWU1NDBiOWI0ODcyODQ3M2UzMTRmNzI5YWM1MzA4YjA2OTM4MzYwOTkwZTJiZmFkMTI1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYjk4NjYwZjRjNGRmYWEwNmEyYmU0NTNkNTAyMGJjOTlhMGMyZTYwYWJlMzg4NDU3ZGQ0M2ZlZmIxZWQ2MjBjJyxcbiAgICAgICAgJzZjYjlhODg3NmQ5Y2I4NTIwNjA5YWYzYWRkMjZjZDIwYTBhN2NkOGE5NDExMTMxY2U4NWY0NDEwMDA5OTIyM2UnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzEzZTg3YjAyN2Q4NTE0ZDM1OTM5ZjJlNjg5MmIxOTkyMjE1NDU5Njk0MTg4ODMzNmRjMzU2M2UzYjhkYmE5NDInLFxuICAgICAgICAnZmVmNWEzYzY4MDU5YTZkZWM1ZDYyNDExNGJmMWU5MWFhYzJiOWRhNTY4ZDZhYmViMjU3MGQ1NTY0NmI4YWRmMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWUxNjMwMjZlOWZkNmZlMDE3YzM4ZjA2YTViZTZmYzEyNTQyNGIzNzFjZTI3MDhlN2JmNDQ5MTY5MWU1NzY0YScsXG4gICAgICAgICcxYWNiMjUwZjI1NWRkNjFjNDNkOTRjY2M2NzBkMGY1OGY0OWFlM2ZhMTViOTY2MjNlNTQzMGRhMGFkNmM2MmIyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiMjY4ZjVlZjlhZDUxZTRkNzhkZTNhNzUwYzJkYzg5YjFlNjI2ZDQzNTA1ODY3OTk5OTMyZTVkYjMzYWYzZDgwJyxcbiAgICAgICAgJzVmMzEwZDRiM2M5OWI5ZWJiMTlmNzdkNDFjMWRlZTAxOGNmMGQzNGZkNDE5MTYxNDAwM2U5NDVhMTIxNmU0MjMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ZmMDdmMzExOGE5ZGYwMzVlOWZhZDg1ZWI2YzdiZmU0MmIwMmYwMWNhOTljZWVhM2JmN2ZmZGJhOTNjNDc1MGQnLFxuICAgICAgICAnNDM4MTM2ZDYwM2U4NThhM2E1YzQ0MGMzOGVjY2JhZGRjMWQyOTQyMTE0ZTJlZGRkNDc0MGQwOThjZWQxZjBkOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGQ4Yjk4NTVjN2MwNTJhMzQxNDZmZDIwZmZiNjU4YmVhNGI5ZjY5ZTBkODI1ZWJlYzE2ZThjM2NlMmI1MjZhMScsXG4gICAgICAgICdjZGI1NTllZWRjMmQ3OWY5MjZiYWY0NGZiODRlYTRkNDRiY2Y1MGZlZTUxZDdjZWIzMGUyZTdmNDYzMDM2NzU4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1MmRiMGI1Mzg0ZGZiZjA1YmZhOWQ0NzJkN2FlMjZkZmU0Yjg1MWNlY2E5MWIxZWJhNTQyNjMxODBkYTMyYjYzJyxcbiAgICAgICAgJ2MzYjk5N2QwNTBlZTVkNDIzZWJhZjY2YTZkYjlmNTdiMzE4MGM5MDI4NzU2NzlkZTkyNGI2OWQ4NGE3YjM3NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTYyZjk0OTBkM2Q1MWRhNjM5NWVmZDI0ZTgwOTE5Y2M3ZDBmMjljM2YzZmE0OGM2ZmZmNTQzYmVjYmQ0MzM1MicsXG4gICAgICAgICc2ZDg5YWQ3YmE0ODc2YjBiMjJjMmNhMjgwYzY4Mjg2MmYzNDJjODU5MWYxZGFmNTE3MGUwN2JmZDljY2FmYTdkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3ZjMwZWEyNDc2YjM5OWI0OTU3NTA5Yzg4Zjc3ZDAxOTFhZmEyZmY1Y2I3YjE0ZmQ2ZDhlN2Q2NWFhYWIxMTkzJyxcbiAgICAgICAgJ2NhNWVmN2Q0YjIzMWM5NGMzYjE1Mzg5YTVmNjMxMWU5ZGFmZjdiYjY3YjEwM2U5ODgwZWY0YmZmNjM3YWNhZWMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUwOThmZjFlMWQ5ZjE0ZmI0NmEyMTBmYWRhNmM5MDNmZWYwZmI3YjRhMWRkMWQ5YWM2MGEwMzYxODAwYjdhMDAnLFxuICAgICAgICAnOTczMTE0MWQ4MWZjOGY4MDg0ZDM3YzZlNzU0MjAwNmIzZWUxYjQwZDYwZGZlNTM2MmE1YjEzMmZkMTdkZGMwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMmI3OGM3ZGU5ZWU1MTJhNzI4OTViZTZiOWNiZWZhNmUyZjNjNGNjY2U0NDVjOTZiOWYyYzgxZTI3NzhhZDU4JyxcbiAgICAgICAgJ2VlMTg0OWY1MTNkZjcxZTMyZWZjMzg5NmVlMjgyNjBjNzNiYjgwNTQ3YWUyMjc1YmE0OTcyMzc3OTRjODc1M2MnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UyY2I3NGZkZGM4ZTlmYmNkMDc2ZWVmMmE3YzcyYjBjZTM3ZDUwZjA4MjY5ZGZjMDc0YjU4MTU1MDU0N2E0ZjcnLFxuICAgICAgICAnZDNhYTJlZDcxYzlkZDIyNDdhNjJkZjA2MjczNmViMGJhZGRlYTllMzYxMjJkMmJlODY0MWFiY2IwMDVjYzRhNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODQzODQ0NzU2NmQ0ZDdiZWRhZGMyOTk0OTZhYjM1NzQyNjAwOWEzNWYyMzVjYjE0MWJlMGQ5OWNkMTBhZTNhOCcsXG4gICAgICAgICdjNGUxMDIwOTE2OTgwYTRkYTVkMDFhYzVlNmFkMzMwNzM0ZWYwZDc5MDY2MzFjNGYyMzkwNDI2YjJlZGQ3OTFmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0MTYyZDQ4OGI4OTQwMjAzOWI1ODRjNmZjNmMzMDg4NzA1ODdkOWM0NmY2NjBiODc4YWI2NWM4MmM3MTFkNjdlJyxcbiAgICAgICAgJzY3MTYzZTkwMzIzNjI4OWY3NzZmMjJjMjVmYjhhM2FmYzE3MzJmMmI4NGI0ZTk1ZGJkYTQ3YWU1YTA4NTI2NDknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzNmYWQzZmE4NGNhZjBmMzRmMGY4OWJmZDJkY2Y1NGZjMTc1ZDc2N2FlYzNlNTA2ODRmM2JhNGE0YmY1ZjY4M2QnLFxuICAgICAgICAnY2QxYmM3Y2I2Y2M0MDdiYjJmMGNhNjQ3YzcxOGE3MzBjZjcxODcyZTdkMGQyYTUzZmEyMGVmY2RmZTYxODI2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2NzRmMjYwMGEzMDA3YTAwNTY4YzFhN2NlMDVkMDgxNmMxZmI4NGJmMTM3MDc5OGYxYzY5NTMyZmFlYjFhODZiJyxcbiAgICAgICAgJzI5OWQyMWY5NDEzZjMzYjNlZGY0M2IyNTcwMDQ1ODBiNzBkYjU3ZGEwYjE4MjI1OWUwOWVlY2M2OWUwZDM4YTUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QzMmY0ZGE1NGFkZTc0YWJiODFiODE1YWQxZmIzYjI2M2Q4MmQ2YzY5MjcxNGJjZmY4N2QyOWJkNWVlOWYwOGYnLFxuICAgICAgICAnZjk0MjllNzM4YjhlNTNiOTY4ZTk5MDE2YzA1OTcwNzc4MmUxNGY0NTM1MzU5ZDU4MmZjNDE2OTEwYjNlZWE4NycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzBlNGU2NzA0MzUzODU1NTZlNTkzNjU3MTM1ODQ1ZDM2ZmJiNjkzMWY3MmIwOGNiMWVkOTU0ZjFlM2NlM2ZmNicsXG4gICAgICAgICc0NjJmOWJjZTYxOTg5ODYzODQ5OTM1MDExM2JiYzliMTBhODc4ZDM1ZGE3MDc0MGRjNjk1YTU1OWViODhkYjdiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiZTIwNjIwMDNjNTFjYzMwMDQ2ODI5MDQzMzBlNGRlZTdmM2RjZDEwYjAxZTU4MGJmMTk3MWIwNGQ0Y2FkMjk3JyxcbiAgICAgICAgJzYyMTg4YmM0OWQ2MWU1NDI4NTczZDQ4YTc0ZTFjNjU1YjFjNjEwOTA5MDU2ODJhMGQ1NTU4ZWQ3MmRjY2I5YmMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkzMTQ0NDIzYWNlMzQ1MWVkMjllMGZiOWFjMmFmMjExY2I2ZTg0YTYwMWRmNTk5M2M0MTk4NTlmZmY1ZGYwNGEnLFxuICAgICAgICAnN2MxMGRmYjE2NGMzNDI1ZjVjNzFhM2Y5ZDc5OTIwMzhmMTA2NTIyNGY3MmJiOWQxZDkwMmE2ZDEzMDM3YjQ3YycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYjAxNWY4MDQ0ZjVmY2JkY2YyMWNhMjZkNmMzNGZiODE5NzgyOTIwNWM3YjdkMmE3Y2I2NjQxOGMxNTdiMTEyYycsXG4gICAgICAgICdhYjhjMWUwODZkMDRlODEzNzQ0YTY1NWIyZGY4ZDVmODNiM2NkYzZmYWEzMDg4YzFkM2FlYTE0NTRlM2ExZDVmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNWU5ZTFkYTY0OWQ5N2Q4OWU0ODY4MTE3YTQ2NWEzYTRmOGExOGRlNTdhMTQwZDM2YjNmMmFmMzQxYTIxYjUyJyxcbiAgICAgICAgJzRjYjA0NDM3ZjM5MWVkNzMxMTFhMTNjYzFkNGRkMGRiMTY5MzQ2NWMyMjQwNDgwZDg5NTVlODU5MmYyNzQ0N2EnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QzYWU0MTA0N2RkN2NhMDY1ZGJmOGVkNzdiOTkyNDM5OTgzMDA1Y2Q3MmUxNmQ2Zjk5NmE1MzE2ZDM2OTY2YmInLFxuICAgICAgICAnYmQxYWViMjFhZDIyZWJiMjJhMTBmMDMwMzQxN2M2ZDk2NGY4Y2RkN2RmMGFjYTYxNGIxMGRjMTRkMTI1YWM0NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDYzZTI3NjNkODg1Zjk1OGZjNjZjZGQyMjgwMGYwYTQ4NzE5N2QwYTgyZTM3N2I0OWY4MGFmODdjODk3YjA2NScsXG4gICAgICAgICdiZmVmYWNkYjBlNWQwZmQ3ZGYzYTMxMWE5NGRlMDYyYjI2YjgwYzYxZmJjOTc1MDhiNzk5OTI2NzFlZjdjYTdmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OTg1ZmRmZDEyN2MwNTY3YzZmNTNlYzFiYjYzZWMzMTU4ZTU5N2M0MGJmZTc0N2M4M2NkZGZjOTEwNjQxOTE3JyxcbiAgICAgICAgJzYwM2MxMmRhZjNkOTg2MmVmMmIyNWZlMWRlMjg5YWVkMjRlZDI5MWUwZWM2NzA4NzAzYTViZDU2N2YzMmVkMDMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc0YTFhZDZiNWY3NmUzOWRiMmRkMjQ5NDEwZWFjN2Y5OWU3NGM1OWNiODNkMmQwZWQ1ZmYxNTQzZGE3NzAzZTknLFxuICAgICAgICAnY2M2MTU3ZWYxOGM5YzYzY2Q2MTkzZDgzNjMxYmJlYTAwOTNlMDk2ODk0MmU4YzMzZDU3MzdmZDc5MGUwZGIwOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzA2ODJhNTA3MDMzNzVmNjAyZDQxNjY2NGJhMTliN2ZjOWJhYjQyYzcyNzQ3NDYzYTcxZDA4OTZiMjJmNmRhMycsXG4gICAgICAgICc1NTNlMDRmNmIwMThiNGZhNmM4ZjM5ZTdmMzExZDMxNzYyOTBkMGUwZjE5Y2E3M2YxNzcxNGQ5OTc3YTIyZmY4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5ZTIxNThmMGQ3YzBkNWYyNmMzNzkxZWZlZmE3OTU5NzY1NGU3YTJiMjQ2NGY1MmIxZWU2YzEzNDc3NjllZjU3JyxcbiAgICAgICAgJzcxMmZjZGQxYjkwNTNmMDkwMDNhMzQ4MWZhNzc2MmU5ZmZkN2M4ZWYzNWEzODUwOWUyZmJmMjYyOTAwODM3MycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTc2ZTI2OTg5YTQzYzljZmViYTQwMjljMjAyNTM4YzI4MTcyZTU2NmUzYzRmY2U3MzIyODU3ZjNiZTMyN2Q2NicsXG4gICAgICAgICdlZDhjYzlkMDRiMjllYjg3N2QyNzBiNDg3OGRjNDNjMTlhZWZkMzFmNGVlZTA5ZWU3YjQ3ODM0YzFmYTRiMWMzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NWQ0NmVmZWEzNzcxZTZlNjhhYmI4OWExM2FkNzQ3ZWNmMTg5MjM5M2RmYzRmMWI3MDA0Nzg4YzUwMzc0ZGE4JyxcbiAgICAgICAgJzk4NTIzOTBhOTk1MDc2NzlmZDBiODZmZDJiMzlhODY4ZDdlZmMyMjE1MTM0NmUxYTNjYTQ3MjY1ODZhNmJlZDgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgwOWEyMGM2N2Q2NDkwMGZmYjY5OGM0YzgyNWY2ZDVmMjMxMGZiMDQ1MWM4NjkzNDViNzMxOWY2NDU2MDU3MjEnLFxuICAgICAgICAnOWU5OTQ5ODBkOTkxN2UyMmI3NmIwNjE5MjdmYTA0MTQzZDA5NmNjYzU0OTYzZTZhNWViZmE1ZjNmOGUyODZjMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMWIzODkwM2E0M2Y3ZjExNGVkNDUwMGI0ZWFjNzA4M2ZkZWZlY2UxY2YyOWM2MzUyOGQ1NjM0NDZmOTcyYzE4MCcsXG4gICAgICAgICc0MDM2ZWRjOTMxYTYwYWU4ODkzNTNmNzdmZDUzZGU0YTI3MDhiMjZiNmY1ZGE3MmFkMzM5NDExOWRhZjQwOGY5JyxcbiAgICAgIF0sXG4gICAgXSxcbiAgfSxcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGN1cnZlcyA9IGV4cG9ydHM7XG5cbnZhciBoYXNoID0gcmVxdWlyZSgnaGFzaC5qcycpO1xudmFyIGN1cnZlID0gcmVxdWlyZSgnLi9jdXJ2ZScpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBQcmVzZXRDdXJ2ZShvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdzaG9ydCcpXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBjdXJ2ZS5zaG9ydChvcHRpb25zKTtcbiAgZWxzZSBpZiAob3B0aW9ucy50eXBlID09PSAnZWR3YXJkcycpXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBjdXJ2ZS5lZHdhcmRzKG9wdGlvbnMpO1xuICBlbHNlXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBjdXJ2ZS5tb250KG9wdGlvbnMpO1xuICB0aGlzLmcgPSB0aGlzLmN1cnZlLmc7XG4gIHRoaXMubiA9IHRoaXMuY3VydmUubjtcbiAgdGhpcy5oYXNoID0gb3B0aW9ucy5oYXNoO1xuXG4gIGFzc2VydCh0aGlzLmcudmFsaWRhdGUoKSwgJ0ludmFsaWQgY3VydmUnKTtcbiAgYXNzZXJ0KHRoaXMuZy5tdWwodGhpcy5uKS5pc0luZmluaXR5KCksICdJbnZhbGlkIGN1cnZlLCBHKk4gIT0gTycpO1xufVxuY3VydmVzLlByZXNldEN1cnZlID0gUHJlc2V0Q3VydmU7XG5cbmZ1bmN0aW9uIGRlZmluZUN1cnZlKG5hbWUsIG9wdGlvbnMpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1cnZlcywgbmFtZSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY3VydmUgPSBuZXcgUHJlc2V0Q3VydmUob3B0aW9ucyk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VydmVzLCBuYW1lLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGN1cnZlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gY3VydmU7XG4gICAgfSxcbiAgfSk7XG59XG5cbmRlZmluZUN1cnZlKCdwMTkyJywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogJ3AxOTInLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYnLFxuICBhOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmMnLFxuICBiOiAnNjQyMTA1MTkgZTU5YzgwZTcgMGZhN2U5YWIgNzIyNDMwNDkgZmViOGRlZWMgYzE0NmI5YjEnLFxuICBuOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgOTlkZWY4MzYgMTQ2YmM5YjEgYjRkMjI4MzEnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnMTg4ZGE4MGUgYjAzMDkwZjYgN2NiZjIwZWIgNDNhMTg4MDAgZjRmZjBhZmQgODJmZjEwMTInLFxuICAgICcwNzE5MmI5NSBmZmM4ZGE3OCA2MzEwMTFlZCA2YjI0Y2RkNSA3M2Y5NzdhMSAxZTc5NDgxMScsXG4gIF0sXG59KTtcblxuZGVmaW5lQ3VydmUoJ3AyMjQnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiAncDIyNCcsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMScsXG4gIGE6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZScsXG4gIGI6ICdiNDA1MGE4NSAwYzA0YjNhYiBmNTQxMzI1NiA1MDQ0YjBiNyBkN2JmZDhiYSAyNzBiMzk0MyAyMzU1ZmZiNCcsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmMTZhMiBlMGI4ZjAzZSAxM2RkMjk0NSA1YzVjMmEzZCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICdiNzBlMGNiZCA2YmI0YmY3ZiAzMjEzOTBiOSA0YTAzYzFkMyA1NmMyMTEyMiAzNDMyODBkNiAxMTVjMWQyMScsXG4gICAgJ2JkMzc2Mzg4IGI1ZjcyM2ZiIDRjMjJkZmU2IGNkNDM3NWEwIDVhMDc0NzY0IDQ0ZDU4MTk5IDg1MDA3ZTM0JyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDI1NicsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICdmZmZmZmZmZiAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZicsXG4gIGE6ICdmZmZmZmZmZiAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYycsXG4gIGI6ICc1YWM2MzVkOCBhYTNhOTNlNyBiM2ViYmQ1NSA3Njk4ODZiYyA2NTFkMDZiMCBjYzUzYjBmNiAzYmNlM2MzZSAyN2QyNjA0YicsXG4gIG46ICdmZmZmZmZmZiAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBiY2U2ZmFhZCBhNzE3OWU4NCBmM2I5Y2FjMiBmYzYzMjU1MScsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc2YjE3ZDFmMiBlMTJjNDI0NyBmOGJjZTZlNSA2M2E0NDBmMiA3NzAzN2Q4MSAyZGViMzNhMCBmNGExMzk0NSBkODk4YzI5NicsXG4gICAgJzRmZTM0MmUyIGZlMWE3ZjliIDhlZTdlYjRhIDdjMGY5ZTE2IDJiY2UzMzU3IDZiMzE1ZWNlIGNiYjY0MDY4IDM3YmY1MWY1JyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDM4NCcsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZlIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmJyxcbiAgYTogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmUgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmMnLFxuICBiOiAnYjMzMTJmYTcgZTIzZWU3ZTQgOTg4ZTA1NmIgZTNmODJkMTkgMTgxZDljNmUgZmU4MTQxMTIgMDMxNDA4OGYgJyArXG4gICAgICc1MDEzODc1YSBjNjU2Mzk4ZCA4YTJlZDE5ZCAyYTg1YzhlZCBkM2VjMmFlZicsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBjNzYzNGQ4MSAnICtcbiAgICAgJ2Y0MzcyZGRmIDU4MWEwZGIyIDQ4YjBhNzdhIGVjZWMxOTZhIGNjYzUyOTczJyxcbiAgaGFzaDogaGFzaC5zaGEzODQsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJ2FhODdjYTIyIGJlOGIwNTM3IDhlYjFjNzFlIGYzMjBhZDc0IDZlMWQzYjYyIDhiYTc5Yjk4IDU5Zjc0MWUwIDgyNTQyYTM4ICcgK1xuICAgICc1NTAyZjI1ZCBiZjU1Mjk2YyAzYTU0NWUzOCA3Mjc2MGFiNycsXG4gICAgJzM2MTdkZTRhIDk2MjYyYzZmIDVkOWU5OGJmIDkyOTJkYzI5IGY4ZjQxZGJkIDI4OWExNDdjIGU5ZGEzMTEzIGI1ZjBiOGMwICcgK1xuICAgICcwYTYwYjFjZSAxZDdlODE5ZCA3YTQzMWQ3YyA5MGVhMGU1ZicsXG4gIF0sXG59KTtcblxuZGVmaW5lQ3VydmUoJ3A1MjEnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiBudWxsLFxuICBwOiAnMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmJyxcbiAgYTogJzAwMDAwMWZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYycsXG4gIGI6ICcwMDAwMDA1MSA5NTNlYjk2MSA4ZTFjOWExZiA5MjlhMjFhMCBiNjg1NDBlZSBhMmRhNzI1YiAnICtcbiAgICAgJzk5YjMxNWYzIGI4YjQ4OTkxIDhlZjEwOWUxIDU2MTkzOTUxIGVjN2U5MzdiIDE2NTJjMGJkICcgK1xuICAgICAnM2JiMWJmMDcgMzU3M2RmODggM2QyYzM0ZjEgZWY0NTFmZDQgNmI1MDNmMDAnLFxuICBuOiAnMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYSA1MTg2ODc4MyBiZjJmOTY2YiA3ZmNjMDE0OCAnICtcbiAgICAgJ2Y3MDlhNWQwIDNiYjVjOWI4IDg5OWM0N2FlIGJiNmZiNzFlIDkxMzg2NDA5JyxcbiAgaGFzaDogaGFzaC5zaGE1MTIsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzAwMDAwMGM2IDg1OGUwNmI3IDA0MDRlOWNkIDllM2VjYjY2IDIzOTViNDQyIDljNjQ4MTM5ICcgK1xuICAgICcwNTNmYjUyMSBmODI4YWY2MCA2YjRkM2RiYSBhMTRiNWU3NyBlZmU3NTkyOCBmZTFkYzEyNyAnICtcbiAgICAnYTJmZmE4ZGUgMzM0OGIzYzEgODU2YTQyOWIgZjk3ZTdlMzEgYzJlNWJkNjYnLFxuICAgICcwMDAwMDExOCAzOTI5NmE3OCA5YTNiYzAwNCA1YzhhNWZiNCAyYzdkMWJkOSA5OGY1NDQ0OSAnICtcbiAgICAnNTc5YjQ0NjggMTdhZmJkMTcgMjczZTY2MmMgOTdlZTcyOTkgNWVmNDI2NDAgYzU1MGI5MDEgJyArXG4gICAgJzNmYWQwNzYxIDM1M2M3MDg2IGEyNzJjMjQwIDg4YmU5NDc2IDlmZDE2NjUwJyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgnY3VydmUyNTUxOScsIHtcbiAgdHlwZTogJ21vbnQnLFxuICBwcmltZTogJ3AyNTUxOScsXG4gIHA6ICc3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkJyxcbiAgYTogJzc2ZDA2JyxcbiAgYjogJzEnLFxuICBuOiAnMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDE0ZGVmOWRlYTJmNzljZDYgNTgxMjYzMWE1Y2Y1ZDNlZCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc5JyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgnZWQyNTUxOScsIHtcbiAgdHlwZTogJ2Vkd2FyZHMnLFxuICBwcmltZTogJ3AyNTUxOScsXG4gIHA6ICc3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkJyxcbiAgYTogJy0xJyxcbiAgYzogJzEnLFxuICAvLyAtMTIxNjY1ICogKDEyMTY2Nl4oLTEpKSAobW9kIFApXG4gIGQ6ICc1MjAzNmNlZTJiNmZmZTczIDhjYzc0MDc5Nzc3OWU4OTggMDA3MDBhNGQ0MTQxZDhhYiA3NWViNGRjYTEzNTk3OGEzJyxcbiAgbjogJzEwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAxNGRlZjlkZWEyZjc5Y2Q2IDU4MTI2MzFhNWNmNWQzZWQnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnMjE2OTM2ZDNjZDZlNTNmZWMwYTRlMjMxZmRkNmRjNWM2OTJjYzc2MDk1MjVhN2IyYzk1NjJkNjA4ZjI1ZDUxYScsXG5cbiAgICAvLyA0LzVcbiAgICAnNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY1OCcsXG4gIF0sXG59KTtcblxudmFyIHByZTtcbnRyeSB7XG4gIHByZSA9IHJlcXVpcmUoJy4vcHJlY29tcHV0ZWQvc2VjcDI1NmsxJyk7XG59IGNhdGNoIChlKSB7XG4gIHByZSA9IHVuZGVmaW5lZDtcbn1cblxuZGVmaW5lQ3VydmUoJ3NlY3AyNTZrMScsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdrMjU2JyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmJyxcbiAgYTogJzAnLFxuICBiOiAnNycsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBiYWFlZGNlNiBhZjQ4YTAzYiBiZmQyNWU4YyBkMDM2NDE0MScsXG4gIGg6ICcxJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG5cbiAgLy8gUHJlY29tcHV0ZWQgZW5kb21vcnBoaXNtXG4gIGJldGE6ICc3YWU5NmEyYjY1N2MwNzEwNmU2NDQ3OWVhYzM0MzRlOTljZjA0OTc1MTJmNTg5OTVjMTM5NmMyODcxOTUwMWVlJyxcbiAgbGFtYmRhOiAnNTM2M2FkNGNjMDVjMzBlMGE1MjYxYzAyODgxMjY0NWExMjJlMjJlYTIwODE2Njc4ZGYwMjk2N2MxYjIzYmQ3MicsXG4gIGJhc2lzOiBbXG4gICAge1xuICAgICAgYTogJzMwODZkMjIxYTdkNDZiY2RlODZjOTBlNDkyODRlYjE1JyxcbiAgICAgIGI6ICctZTQ0MzdlZDYwMTBlODgyODZmNTQ3ZmE5MGFiZmU0YzMnLFxuICAgIH0sXG4gICAge1xuICAgICAgYTogJzExNGNhNTBmN2E4ZTJmM2Y2NTdjMTEwOGQ5ZDQ0Y2ZkOCcsXG4gICAgICBiOiAnMzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTUnLFxuICAgIH0sXG4gIF0sXG5cbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnNzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OCcsXG4gICAgJzQ4M2FkYTc3MjZhM2M0NjU1ZGE0ZmJmYzBlMTEwOGE4ZmQxN2I0NDhhNjg1NTQxOTljNDdkMDhmZmIxMGQ0YjgnLFxuICAgIHByZSxcbiAgXSxcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNoID0gcmVxdWlyZSgnaGFzaC5qcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWNyeXB0by11dGlscycpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuZnVuY3Rpb24gSG1hY0RSQkcob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSG1hY0RSQkcpKVxuICAgIHJldHVybiBuZXcgSG1hY0RSQkcob3B0aW9ucyk7XG4gIHRoaXMuaGFzaCA9IG9wdGlvbnMuaGFzaDtcbiAgdGhpcy5wcmVkUmVzaXN0ID0gISFvcHRpb25zLnByZWRSZXNpc3Q7XG5cbiAgdGhpcy5vdXRMZW4gPSB0aGlzLmhhc2gub3V0U2l6ZTtcbiAgdGhpcy5taW5FbnRyb3B5ID0gb3B0aW9ucy5taW5FbnRyb3B5IHx8IHRoaXMuaGFzaC5obWFjU3RyZW5ndGg7XG5cbiAgdGhpcy5fcmVzZWVkID0gbnVsbDtcbiAgdGhpcy5yZXNlZWRJbnRlcnZhbCA9IG51bGw7XG4gIHRoaXMuSyA9IG51bGw7XG4gIHRoaXMuViA9IG51bGw7XG5cbiAgdmFyIGVudHJvcHkgPSB1dGlscy50b0FycmF5KG9wdGlvbnMuZW50cm9weSwgb3B0aW9ucy5lbnRyb3B5RW5jIHx8ICdoZXgnKTtcbiAgdmFyIG5vbmNlID0gdXRpbHMudG9BcnJheShvcHRpb25zLm5vbmNlLCBvcHRpb25zLm5vbmNlRW5jIHx8ICdoZXgnKTtcbiAgdmFyIHBlcnMgPSB1dGlscy50b0FycmF5KG9wdGlvbnMucGVycywgb3B0aW9ucy5wZXJzRW5jIHx8ICdoZXgnKTtcbiAgYXNzZXJ0KGVudHJvcHkubGVuZ3RoID49ICh0aGlzLm1pbkVudHJvcHkgLyA4KSxcbiAgICAgICAgICdOb3QgZW5vdWdoIGVudHJvcHkuIE1pbmltdW0gaXM6ICcgKyB0aGlzLm1pbkVudHJvcHkgKyAnIGJpdHMnKTtcbiAgdGhpcy5faW5pdChlbnRyb3B5LCBub25jZSwgcGVycyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEhtYWNEUkJHO1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0KGVudHJvcHksIG5vbmNlLCBwZXJzKSB7XG4gIHZhciBzZWVkID0gZW50cm9weS5jb25jYXQobm9uY2UpLmNvbmNhdChwZXJzKTtcblxuICB0aGlzLksgPSBuZXcgQXJyYXkodGhpcy5vdXRMZW4gLyA4KTtcbiAgdGhpcy5WID0gbmV3IEFycmF5KHRoaXMub3V0TGVuIC8gOCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5WLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5LW2ldID0gMHgwMDtcbiAgICB0aGlzLlZbaV0gPSAweDAxO1xuICB9XG5cbiAgdGhpcy5fdXBkYXRlKHNlZWQpO1xuICB0aGlzLl9yZXNlZWQgPSAxO1xuICB0aGlzLnJlc2VlZEludGVydmFsID0gMHgxMDAwMDAwMDAwMDAwOyAgLy8gMl40OFxufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLl9obWFjID0gZnVuY3Rpb24gaG1hYygpIHtcbiAgcmV0dXJuIG5ldyBoYXNoLmhtYWModGhpcy5oYXNoLCB0aGlzLkspO1xufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoc2VlZCkge1xuICB2YXIga21hYyA9IHRoaXMuX2htYWMoKVxuICAgICAgICAgICAgICAgICAudXBkYXRlKHRoaXMuVilcbiAgICAgICAgICAgICAgICAgLnVwZGF0ZShbIDB4MDAgXSk7XG4gIGlmIChzZWVkKVxuICAgIGttYWMgPSBrbWFjLnVwZGF0ZShzZWVkKTtcbiAgdGhpcy5LID0ga21hYy5kaWdlc3QoKTtcbiAgdGhpcy5WID0gdGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpO1xuICBpZiAoIXNlZWQpXG4gICAgcmV0dXJuO1xuXG4gIHRoaXMuSyA9IHRoaXMuX2htYWMoKVxuICAgICAgICAgICAgICAgLnVwZGF0ZSh0aGlzLlYpXG4gICAgICAgICAgICAgICAudXBkYXRlKFsgMHgwMSBdKVxuICAgICAgICAgICAgICAgLnVwZGF0ZShzZWVkKVxuICAgICAgICAgICAgICAgLmRpZ2VzdCgpO1xuICB0aGlzLlYgPSB0aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCk7XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUucmVzZWVkID0gZnVuY3Rpb24gcmVzZWVkKGVudHJvcHksIGVudHJvcHlFbmMsIGFkZCwgYWRkRW5jKSB7XG4gIC8vIE9wdGlvbmFsIGVudHJvcHkgZW5jXG4gIGlmICh0eXBlb2YgZW50cm9weUVuYyAhPT0gJ3N0cmluZycpIHtcbiAgICBhZGRFbmMgPSBhZGQ7XG4gICAgYWRkID0gZW50cm9weUVuYztcbiAgICBlbnRyb3B5RW5jID0gbnVsbDtcbiAgfVxuXG4gIGVudHJvcHkgPSB1dGlscy50b0FycmF5KGVudHJvcHksIGVudHJvcHlFbmMpO1xuICBhZGQgPSB1dGlscy50b0FycmF5KGFkZCwgYWRkRW5jKTtcblxuICBhc3NlcnQoZW50cm9weS5sZW5ndGggPj0gKHRoaXMubWluRW50cm9weSAvIDgpLFxuICAgICAgICAgJ05vdCBlbm91Z2ggZW50cm9weS4gTWluaW11bSBpczogJyArIHRoaXMubWluRW50cm9weSArICcgYml0cycpO1xuXG4gIHRoaXMuX3VwZGF0ZShlbnRyb3B5LmNvbmNhdChhZGQgfHwgW10pKTtcbiAgdGhpcy5fcmVzZWVkID0gMTtcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uIGdlbmVyYXRlKGxlbiwgZW5jLCBhZGQsIGFkZEVuYykge1xuICBpZiAodGhpcy5fcmVzZWVkID4gdGhpcy5yZXNlZWRJbnRlcnZhbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc2VlZCBpcyByZXF1aXJlZCcpO1xuXG4gIC8vIE9wdGlvbmFsIGVuY29kaW5nXG4gIGlmICh0eXBlb2YgZW5jICE9PSAnc3RyaW5nJykge1xuICAgIGFkZEVuYyA9IGFkZDtcbiAgICBhZGQgPSBlbmM7XG4gICAgZW5jID0gbnVsbDtcbiAgfVxuXG4gIC8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgZGF0YVxuICBpZiAoYWRkKSB7XG4gICAgYWRkID0gdXRpbHMudG9BcnJheShhZGQsIGFkZEVuYyB8fCAnaGV4Jyk7XG4gICAgdGhpcy5fdXBkYXRlKGFkZCk7XG4gIH1cblxuICB2YXIgdGVtcCA9IFtdO1xuICB3aGlsZSAodGVtcC5sZW5ndGggPCBsZW4pIHtcbiAgICB0aGlzLlYgPSB0aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCk7XG4gICAgdGVtcCA9IHRlbXAuY29uY2F0KHRoaXMuVik7XG4gIH1cblxuICB2YXIgcmVzID0gdGVtcC5zbGljZSgwLCBsZW4pO1xuICB0aGlzLl91cGRhdGUoYWRkKTtcbiAgdGhpcy5fcmVzZWVkKys7XG4gIHJldHVybiB1dGlscy5lbmNvZGUocmVzLCBlbmMpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEtleVBhaXIoZWMsIG9wdGlvbnMpIHtcbiAgdGhpcy5lYyA9IGVjO1xuICB0aGlzLnByaXYgPSBudWxsO1xuICB0aGlzLnB1YiA9IG51bGw7XG5cbiAgLy8gS2V5UGFpcihlYywgeyBwcml2OiAuLi4sIHB1YjogLi4uIH0pXG4gIGlmIChvcHRpb25zLnByaXYpXG4gICAgdGhpcy5faW1wb3J0UHJpdmF0ZShvcHRpb25zLnByaXYsIG9wdGlvbnMucHJpdkVuYyk7XG4gIGlmIChvcHRpb25zLnB1YilcbiAgICB0aGlzLl9pbXBvcnRQdWJsaWMob3B0aW9ucy5wdWIsIG9wdGlvbnMucHViRW5jKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gS2V5UGFpcjtcblxuS2V5UGFpci5mcm9tUHVibGljID0gZnVuY3Rpb24gZnJvbVB1YmxpYyhlYywgcHViLCBlbmMpIHtcbiAgaWYgKHB1YiBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHB1YjtcblxuICByZXR1cm4gbmV3IEtleVBhaXIoZWMsIHtcbiAgICBwdWI6IHB1YixcbiAgICBwdWJFbmM6IGVuYyxcbiAgfSk7XG59O1xuXG5LZXlQYWlyLmZyb21Qcml2YXRlID0gZnVuY3Rpb24gZnJvbVByaXZhdGUoZWMsIHByaXYsIGVuYykge1xuICBpZiAocHJpdiBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHByaXY7XG5cbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVjLCB7XG4gICAgcHJpdjogcHJpdixcbiAgICBwcml2RW5jOiBlbmMsXG4gIH0pO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgdmFyIHB1YiA9IHRoaXMuZ2V0UHVibGljKCk7XG5cbiAgaWYgKHB1Yi5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAnSW52YWxpZCBwdWJsaWMga2V5JyB9O1xuICBpZiAoIXB1Yi52YWxpZGF0ZSgpKVxuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIHJlYXNvbjogJ1B1YmxpYyBrZXkgaXMgbm90IGEgcG9pbnQnIH07XG4gIGlmICghcHViLm11bCh0aGlzLmVjLmN1cnZlLm4pLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCByZWFzb246ICdQdWJsaWMga2V5ICogTiAhPSBPJyB9O1xuXG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSwgcmVhc29uOiBudWxsIH07XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRQdWJsaWMgPSBmdW5jdGlvbiBnZXRQdWJsaWMoY29tcGFjdCwgZW5jKSB7XG4gIC8vIGNvbXBhY3QgaXMgb3B0aW9uYWwgYXJndW1lbnRcbiAgaWYgKHR5cGVvZiBjb21wYWN0ID09PSAnc3RyaW5nJykge1xuICAgIGVuYyA9IGNvbXBhY3Q7XG4gICAgY29tcGFjdCA9IG51bGw7XG4gIH1cblxuICBpZiAoIXRoaXMucHViKVxuICAgIHRoaXMucHViID0gdGhpcy5lYy5nLm11bCh0aGlzLnByaXYpO1xuXG4gIGlmICghZW5jKVxuICAgIHJldHVybiB0aGlzLnB1YjtcblxuICByZXR1cm4gdGhpcy5wdWIuZW5jb2RlKGVuYywgY29tcGFjdCk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRQcml2YXRlID0gZnVuY3Rpb24gZ2V0UHJpdmF0ZShlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHRoaXMucHJpdi50b1N0cmluZygxNiwgMik7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5wcml2O1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuX2ltcG9ydFByaXZhdGUgPSBmdW5jdGlvbiBfaW1wb3J0UHJpdmF0ZShrZXksIGVuYykge1xuICB0aGlzLnByaXYgPSBuZXcgQk4oa2V5LCBlbmMgfHwgMTYpO1xuXG4gIC8vIEVuc3VyZSB0aGF0IHRoZSBwcml2IHdvbid0IGJlIGJpZ2dlciB0aGFuIG4sIG90aGVyd2lzZSB3ZSBtYXkgZmFpbFxuICAvLyBpbiBmaXhlZCBtdWx0aXBsaWNhdGlvbiBtZXRob2RcbiAgdGhpcy5wcml2ID0gdGhpcy5wcml2LnVtb2QodGhpcy5lYy5jdXJ2ZS5uKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLl9pbXBvcnRQdWJsaWMgPSBmdW5jdGlvbiBfaW1wb3J0UHVibGljKGtleSwgZW5jKSB7XG4gIGlmIChrZXkueCB8fCBrZXkueSkge1xuICAgIC8vIE1vbnRnb21lcnkgcG9pbnRzIG9ubHkgaGF2ZSBhbiBgeGAgY29vcmRpbmF0ZS5cbiAgICAvLyBXZWllcnN0cmFzcy9FZHdhcmRzIHBvaW50cyBvbiB0aGUgb3RoZXIgaGFuZCBoYXZlIGJvdGggYHhgIGFuZFxuICAgIC8vIGB5YCBjb29yZGluYXRlcy5cbiAgICBpZiAodGhpcy5lYy5jdXJ2ZS50eXBlID09PSAnbW9udCcpIHtcbiAgICAgIGFzc2VydChrZXkueCwgJ05lZWQgeCBjb29yZGluYXRlJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmVjLmN1cnZlLnR5cGUgPT09ICdzaG9ydCcgfHxcbiAgICAgICAgICAgICAgIHRoaXMuZWMuY3VydmUudHlwZSA9PT0gJ2Vkd2FyZHMnKSB7XG4gICAgICBhc3NlcnQoa2V5LnggJiYga2V5LnksICdOZWVkIGJvdGggeCBhbmQgeSBjb29yZGluYXRlJyk7XG4gICAgfVxuICAgIHRoaXMucHViID0gdGhpcy5lYy5jdXJ2ZS5wb2ludChrZXkueCwga2V5LnkpO1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnB1YiA9IHRoaXMuZWMuY3VydmUuZGVjb2RlUG9pbnQoa2V5LCBlbmMpO1xufTtcblxuLy8gRUNESFxuS2V5UGFpci5wcm90b3R5cGUuZGVyaXZlID0gZnVuY3Rpb24gZGVyaXZlKHB1Yikge1xuICBpZighcHViLnZhbGlkYXRlKCkpIHtcbiAgICBhc3NlcnQocHViLnZhbGlkYXRlKCksICdwdWJsaWMgcG9pbnQgbm90IHZhbGlkYXRlZCcpO1xuICB9XG4gIHJldHVybiBwdWIubXVsKHRoaXMucHJpdikuZ2V0WCgpO1xufTtcblxuLy8gRUNEU0FcbktleVBhaXIucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1zZywgZW5jLCBvcHRpb25zKSB7XG4gIHJldHVybiB0aGlzLmVjLnNpZ24obXNnLCB0aGlzLCBlbmMsIG9wdGlvbnMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1zZywgc2lnbmF0dXJlLCBvcHRpb25zKSB7XG4gIHJldHVybiB0aGlzLmVjLnZlcmlmeShtc2csIHNpZ25hdHVyZSwgdGhpcywgdW5kZWZpbmVkLCBvcHRpb25zKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICByZXR1cm4gJzxLZXkgcHJpdjogJyArICh0aGlzLnByaXYgJiYgdGhpcy5wcml2LnRvU3RyaW5nKDE2LCAyKSkgK1xuICAgICAgICAgJyBwdWI6ICcgKyAodGhpcy5wdWIgJiYgdGhpcy5wdWIuaW5zcGVjdCgpKSArICcgPic7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBTaWduYXR1cmUob3B0aW9ucywgZW5jKSB7XG4gIGlmIChvcHRpb25zIGluc3RhbmNlb2YgU2lnbmF0dXJlKVxuICAgIHJldHVybiBvcHRpb25zO1xuXG4gIGlmICh0aGlzLl9pbXBvcnRERVIob3B0aW9ucywgZW5jKSlcbiAgICByZXR1cm47XG5cbiAgYXNzZXJ0KG9wdGlvbnMuciAmJiBvcHRpb25zLnMsICdTaWduYXR1cmUgd2l0aG91dCByIG9yIHMnKTtcbiAgdGhpcy5yID0gbmV3IEJOKG9wdGlvbnMuciwgMTYpO1xuICB0aGlzLnMgPSBuZXcgQk4ob3B0aW9ucy5zLCAxNik7XG4gIGlmIChvcHRpb25zLnJlY292ZXJ5UGFyYW0gPT09IHVuZGVmaW5lZClcbiAgICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBudWxsO1xuICBlbHNlXG4gICAgdGhpcy5yZWNvdmVyeVBhcmFtID0gb3B0aW9ucy5yZWNvdmVyeVBhcmFtO1xufVxubW9kdWxlLmV4cG9ydHMgPSBTaWduYXR1cmU7XG5cbmZ1bmN0aW9uIFBvc2l0aW9uKCkge1xuICB0aGlzLnBsYWNlID0gMDtcbn1cblxuZnVuY3Rpb24gZ2V0TGVuZ3RoKGJ1ZiwgcCkge1xuICB2YXIgaW5pdGlhbCA9IGJ1ZltwLnBsYWNlKytdO1xuICBpZiAoIShpbml0aWFsICYgMHg4MCkpIHtcbiAgICByZXR1cm4gaW5pdGlhbDtcbiAgfVxuICB2YXIgb2N0ZXRMZW4gPSBpbml0aWFsICYgMHhmO1xuXG4gIC8vIEluZGVmaW5pdGUgbGVuZ3RoIG9yIG92ZXJmbG93XG4gIGlmIChvY3RldExlbiA9PT0gMCB8fCBvY3RldExlbiA+IDQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZihidWZbcC5wbGFjZV0gPT09IDB4MDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdmFsID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIG9mZiA9IHAucGxhY2U7IGkgPCBvY3RldExlbjsgaSsrLCBvZmYrKykge1xuICAgIHZhbCA8PD0gODtcbiAgICB2YWwgfD0gYnVmW29mZl07XG4gICAgdmFsID4+Pj0gMDtcbiAgfVxuXG4gIC8vIExlYWRpbmcgemVyb2VzXG4gIGlmICh2YWwgPD0gMHg3Zikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHAucGxhY2UgPSBvZmY7XG4gIHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIHJtUGFkZGluZyhidWYpIHtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aCAtIDE7XG4gIHdoaWxlICghYnVmW2ldICYmICEoYnVmW2kgKyAxXSAmIDB4ODApICYmIGkgPCBsZW4pIHtcbiAgICBpKys7XG4gIH1cbiAgaWYgKGkgPT09IDApIHtcbiAgICByZXR1cm4gYnVmO1xuICB9XG4gIHJldHVybiBidWYuc2xpY2UoaSk7XG59XG5cblNpZ25hdHVyZS5wcm90b3R5cGUuX2ltcG9ydERFUiA9IGZ1bmN0aW9uIF9pbXBvcnRERVIoZGF0YSwgZW5jKSB7XG4gIGRhdGEgPSB1dGlscy50b0FycmF5KGRhdGEsIGVuYyk7XG4gIHZhciBwID0gbmV3IFBvc2l0aW9uKCk7XG4gIGlmIChkYXRhW3AucGxhY2UrK10gIT09IDB4MzApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxlbiA9IGdldExlbmd0aChkYXRhLCBwKTtcbiAgaWYgKGxlbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKChsZW4gKyBwLnBsYWNlKSAhPT0gZGF0YS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGRhdGFbcC5wbGFjZSsrXSAhPT0gMHgwMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcmxlbiA9IGdldExlbmd0aChkYXRhLCBwKTtcbiAgaWYgKHJsZW4gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgoZGF0YVtwLnBsYWNlXSAmIDEyOCkgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHIgPSBkYXRhLnNsaWNlKHAucGxhY2UsIHJsZW4gKyBwLnBsYWNlKTtcbiAgcC5wbGFjZSArPSBybGVuO1xuICBpZiAoZGF0YVtwLnBsYWNlKytdICE9PSAweDAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBzbGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICBpZiAoc2xlbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGRhdGEubGVuZ3RoICE9PSBzbGVuICsgcC5wbGFjZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoKGRhdGFbcC5wbGFjZV0gJiAxMjgpICE9PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBzID0gZGF0YS5zbGljZShwLnBsYWNlLCBzbGVuICsgcC5wbGFjZSk7XG4gIGlmIChyWzBdID09PSAwKSB7XG4gICAgaWYgKHJbMV0gJiAweDgwKSB7XG4gICAgICByID0gci5zbGljZSgxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGVhZGluZyB6ZXJvZXNcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKHNbMF0gPT09IDApIHtcbiAgICBpZiAoc1sxXSAmIDB4ODApIHtcbiAgICAgIHMgPSBzLnNsaWNlKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMZWFkaW5nIHplcm9lc1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuciA9IG5ldyBCTihyKTtcbiAgdGhpcy5zID0gbmV3IEJOKHMpO1xuICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBudWxsO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gY29uc3RydWN0TGVuZ3RoKGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPCAweDgwKSB7XG4gICAgYXJyLnB1c2gobGVuKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG9jdGV0cyA9IDEgKyAoTWF0aC5sb2cobGVuKSAvIE1hdGguTE4yID4+PiAzKTtcbiAgYXJyLnB1c2gob2N0ZXRzIHwgMHg4MCk7XG4gIHdoaWxlICgtLW9jdGV0cykge1xuICAgIGFyci5wdXNoKChsZW4gPj4+IChvY3RldHMgPDwgMykpICYgMHhmZik7XG4gIH1cbiAgYXJyLnB1c2gobGVuKTtcbn1cblxuU2lnbmF0dXJlLnByb3RvdHlwZS50b0RFUiA9IGZ1bmN0aW9uIHRvREVSKGVuYykge1xuICB2YXIgciA9IHRoaXMuci50b0FycmF5KCk7XG4gIHZhciBzID0gdGhpcy5zLnRvQXJyYXkoKTtcblxuICAvLyBQYWQgdmFsdWVzXG4gIGlmIChyWzBdICYgMHg4MClcbiAgICByID0gWyAwIF0uY29uY2F0KHIpO1xuICAvLyBQYWQgdmFsdWVzXG4gIGlmIChzWzBdICYgMHg4MClcbiAgICBzID0gWyAwIF0uY29uY2F0KHMpO1xuXG4gIHIgPSBybVBhZGRpbmcocik7XG4gIHMgPSBybVBhZGRpbmcocyk7XG5cbiAgd2hpbGUgKCFzWzBdICYmICEoc1sxXSAmIDB4ODApKSB7XG4gICAgcyA9IHMuc2xpY2UoMSk7XG4gIH1cbiAgdmFyIGFyciA9IFsgMHgwMiBdO1xuICBjb25zdHJ1Y3RMZW5ndGgoYXJyLCByLmxlbmd0aCk7XG4gIGFyciA9IGFyci5jb25jYXQocik7XG4gIGFyci5wdXNoKDB4MDIpO1xuICBjb25zdHJ1Y3RMZW5ndGgoYXJyLCBzLmxlbmd0aCk7XG4gIHZhciBiYWNrSGFsZiA9IGFyci5jb25jYXQocyk7XG4gIHZhciByZXMgPSBbIDB4MzAgXTtcbiAgY29uc3RydWN0TGVuZ3RoKHJlcywgYmFja0hhbGYubGVuZ3RoKTtcbiAgcmVzID0gcmVzLmNvbmNhdChiYWNrSGFsZik7XG4gIHJldHVybiB1dGlscy5lbmNvZGUocmVzLCBlbmMpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIEhtYWNEUkJHID0gcmVxdWlyZSgnaG1hYy1kcmJnJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGN1cnZlcyA9IHJlcXVpcmUoJy4uL2N1cnZlcycpO1xudmFyIHJhbmQgPSByZXF1aXJlKCdicm9yYW5kJyk7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG52YXIgS2V5UGFpciA9IHJlcXVpcmUoJy4va2V5Jyk7XG52YXIgU2lnbmF0dXJlID0gcmVxdWlyZSgnLi9zaWduYXR1cmUnKTtcblxuZnVuY3Rpb24gRUMob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRUMpKVxuICAgIHJldHVybiBuZXcgRUMob3B0aW9ucyk7XG5cbiAgLy8gU2hvcnRjdXQgYGVsbGlwdGljLmVjKGN1cnZlLW5hbWUpYFxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgYXNzZXJ0KE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJ2ZXMsIG9wdGlvbnMpLFxuICAgICAgJ1Vua25vd24gY3VydmUgJyArIG9wdGlvbnMpO1xuXG4gICAgb3B0aW9ucyA9IGN1cnZlc1tvcHRpb25zXTtcbiAgfVxuXG4gIC8vIFNob3J0Y3V0IGZvciBgZWxsaXB0aWMuZWMoZWxsaXB0aWMuY3VydmVzLmN1cnZlTmFtZSlgXG4gIGlmIChvcHRpb25zIGluc3RhbmNlb2YgY3VydmVzLlByZXNldEN1cnZlKVxuICAgIG9wdGlvbnMgPSB7IGN1cnZlOiBvcHRpb25zIH07XG5cbiAgdGhpcy5jdXJ2ZSA9IG9wdGlvbnMuY3VydmUuY3VydmU7XG4gIHRoaXMubiA9IHRoaXMuY3VydmUubjtcbiAgdGhpcy5uaCA9IHRoaXMubi51c2hybigxKTtcbiAgdGhpcy5nID0gdGhpcy5jdXJ2ZS5nO1xuXG4gIC8vIFBvaW50IG9uIGN1cnZlXG4gIHRoaXMuZyA9IG9wdGlvbnMuY3VydmUuZztcbiAgdGhpcy5nLnByZWNvbXB1dGUob3B0aW9ucy5jdXJ2ZS5uLmJpdExlbmd0aCgpICsgMSk7XG5cbiAgLy8gSGFzaCBmb3IgZnVuY3Rpb24gZm9yIERSQkdcbiAgdGhpcy5oYXNoID0gb3B0aW9ucy5oYXNoIHx8IG9wdGlvbnMuY3VydmUuaGFzaDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRUM7XG5cbkVDLnByb3RvdHlwZS5rZXlQYWlyID0gZnVuY3Rpb24ga2V5UGFpcihvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgS2V5UGFpcih0aGlzLCBvcHRpb25zKTtcbn07XG5cbkVDLnByb3RvdHlwZS5rZXlGcm9tUHJpdmF0ZSA9IGZ1bmN0aW9uIGtleUZyb21Qcml2YXRlKHByaXYsIGVuYykge1xuICByZXR1cm4gS2V5UGFpci5mcm9tUHJpdmF0ZSh0aGlzLCBwcml2LCBlbmMpO1xufTtcblxuRUMucHJvdG90eXBlLmtleUZyb21QdWJsaWMgPSBmdW5jdGlvbiBrZXlGcm9tUHVibGljKHB1YiwgZW5jKSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21QdWJsaWModGhpcywgcHViLCBlbmMpO1xufTtcblxuRUMucHJvdG90eXBlLmdlbktleVBhaXIgPSBmdW5jdGlvbiBnZW5LZXlQYWlyKG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICAvLyBJbnN0YW50aWF0ZSBIbWFjX0RSQkdcbiAgdmFyIGRyYmcgPSBuZXcgSG1hY0RSQkcoe1xuICAgIGhhc2g6IHRoaXMuaGFzaCxcbiAgICBwZXJzOiBvcHRpb25zLnBlcnMsXG4gICAgcGVyc0VuYzogb3B0aW9ucy5wZXJzRW5jIHx8ICd1dGY4JyxcbiAgICBlbnRyb3B5OiBvcHRpb25zLmVudHJvcHkgfHwgcmFuZCh0aGlzLmhhc2guaG1hY1N0cmVuZ3RoKSxcbiAgICBlbnRyb3B5RW5jOiBvcHRpb25zLmVudHJvcHkgJiYgb3B0aW9ucy5lbnRyb3B5RW5jIHx8ICd1dGY4JyxcbiAgICBub25jZTogdGhpcy5uLnRvQXJyYXkoKSxcbiAgfSk7XG5cbiAgdmFyIGJ5dGVzID0gdGhpcy5uLmJ5dGVMZW5ndGgoKTtcbiAgdmFyIG5zMiA9IHRoaXMubi5zdWIobmV3IEJOKDIpKTtcbiAgZm9yICg7Oykge1xuICAgIHZhciBwcml2ID0gbmV3IEJOKGRyYmcuZ2VuZXJhdGUoYnl0ZXMpKTtcbiAgICBpZiAocHJpdi5jbXAobnMyKSA+IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHByaXYuaWFkZG4oMSk7XG4gICAgcmV0dXJuIHRoaXMua2V5RnJvbVByaXZhdGUocHJpdik7XG4gIH1cbn07XG5cbkVDLnByb3RvdHlwZS5fdHJ1bmNhdGVUb04gPSBmdW5jdGlvbiBfdHJ1bmNhdGVUb04obXNnLCB0cnVuY09ubHksIGJpdExlbmd0aCkge1xuICB2YXIgYnl0ZUxlbmd0aDtcbiAgaWYgKEJOLmlzQk4obXNnKSB8fCB0eXBlb2YgbXNnID09PSAnbnVtYmVyJykge1xuICAgIG1zZyA9IG5ldyBCTihtc2csIDE2KTtcbiAgICBieXRlTGVuZ3RoID0gbXNnLmJ5dGVMZW5ndGgoKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbXNnID09PSAnb2JqZWN0Jykge1xuICAgIC8vIEJOIGFzc3VtZXMgYW4gYXJyYXktbGlrZSBpbnB1dCBhbmQgYXNzZXJ0cyBsZW5ndGhcbiAgICBieXRlTGVuZ3RoID0gbXNnLmxlbmd0aDtcbiAgICBtc2cgPSBuZXcgQk4obXNnLCAxNik7XG4gIH0gZWxzZSB7XG4gICAgLy8gQk4gY29udmVydHMgdGhlIHZhbHVlIHRvIHN0cmluZ1xuICAgIHZhciBzdHIgPSBtc2cudG9TdHJpbmcoKTtcbiAgICAvLyBIRVggZW5jb2RpbmdcbiAgICBieXRlTGVuZ3RoID0gKHN0ci5sZW5ndGggKyAxKSA+Pj4gMTtcbiAgICBtc2cgPSBuZXcgQk4oc3RyLCAxNik7XG4gIH1cbiAgLy8gQWxsb3cgb3ZlcnJpZGluZ1xuICBpZiAodHlwZW9mIGJpdExlbmd0aCAhPT0gJ251bWJlcicpIHtcbiAgICBiaXRMZW5ndGggPSBieXRlTGVuZ3RoICogODtcbiAgfVxuICB2YXIgZGVsdGEgPSBiaXRMZW5ndGggLSB0aGlzLm4uYml0TGVuZ3RoKCk7XG4gIGlmIChkZWx0YSA+IDApXG4gICAgbXNnID0gbXNnLnVzaHJuKGRlbHRhKTtcbiAgaWYgKCF0cnVuY09ubHkgJiYgbXNnLmNtcCh0aGlzLm4pID49IDApXG4gICAgcmV0dXJuIG1zZy5zdWIodGhpcy5uKTtcbiAgZWxzZVxuICAgIHJldHVybiBtc2c7XG59O1xuXG5FQy5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obXNnLCBrZXksIGVuYywgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGVuYyA9PT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zID0gZW5jO1xuICAgIGVuYyA9IG51bGw7XG4gIH1cbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICBpZiAodHlwZW9mIG1zZyAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIG1zZyAhPT0gJ251bWJlcicgJiYgIUJOLmlzQk4obXNnKSkge1xuICAgIGFzc2VydCh0eXBlb2YgbXNnID09PSAnb2JqZWN0JyAmJiBtc2cgJiYgdHlwZW9mIG1zZy5sZW5ndGggPT09ICdudW1iZXInLFxuICAgICAgJ0V4cGVjdGVkIG1lc3NhZ2UgdG8gYmUgYW4gYXJyYXktbGlrZSwgYSBoZXggc3RyaW5nLCBvciBhIEJOIGluc3RhbmNlJyk7XG4gICAgYXNzZXJ0KChtc2cubGVuZ3RoID4+PiAwKSA9PT0gbXNnLmxlbmd0aCk7IC8vIG5vbi1uZWdhdGl2ZSAzMi1iaXQgaW50ZWdlclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSBhc3NlcnQoKG1zZ1tpXSAmIDI1NSkgPT09IG1zZ1tpXSk7XG4gIH1cblxuICBrZXkgPSB0aGlzLmtleUZyb21Qcml2YXRlKGtleSwgZW5jKTtcbiAgbXNnID0gdGhpcy5fdHJ1bmNhdGVUb04obXNnLCBmYWxzZSwgb3B0aW9ucy5tc2dCaXRMZW5ndGgpO1xuXG4gIC8vIFdvdWxkIGZhaWwgZnVydGhlciBjaGVja3MsIGJ1dCBsZXQncyBtYWtlIHRoZSBlcnJvciBtZXNzYWdlIGNsZWFyXG4gIGFzc2VydCghbXNnLmlzTmVnKCksICdDYW4gbm90IHNpZ24gYSBuZWdhdGl2ZSBtZXNzYWdlJyk7XG5cbiAgLy8gWmVyby1leHRlbmQga2V5IHRvIHByb3ZpZGUgZW5vdWdoIGVudHJvcHlcbiAgdmFyIGJ5dGVzID0gdGhpcy5uLmJ5dGVMZW5ndGgoKTtcbiAgdmFyIGJrZXkgPSBrZXkuZ2V0UHJpdmF0ZSgpLnRvQXJyYXkoJ2JlJywgYnl0ZXMpO1xuXG4gIC8vIFplcm8tZXh0ZW5kIG5vbmNlIHRvIGhhdmUgdGhlIHNhbWUgYnl0ZSBzaXplIGFzIE5cbiAgdmFyIG5vbmNlID0gbXNnLnRvQXJyYXkoJ2JlJywgYnl0ZXMpO1xuXG4gIC8vIFJlY2hlY2sgbm9uY2UgdG8gYmUgYmlqZWN0aXZlIHRvIG1zZ1xuICBhc3NlcnQoKG5ldyBCTihub25jZSkpLmVxKG1zZyksICdDYW4gbm90IHNpZ24gbWVzc2FnZScpO1xuXG4gIC8vIEluc3RhbnRpYXRlIEhtYWNfRFJCR1xuICB2YXIgZHJiZyA9IG5ldyBIbWFjRFJCRyh7XG4gICAgaGFzaDogdGhpcy5oYXNoLFxuICAgIGVudHJvcHk6IGJrZXksXG4gICAgbm9uY2U6IG5vbmNlLFxuICAgIHBlcnM6IG9wdGlvbnMucGVycyxcbiAgICBwZXJzRW5jOiBvcHRpb25zLnBlcnNFbmMgfHwgJ3V0ZjgnLFxuICB9KTtcblxuICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2VuZXJhdGVcbiAgdmFyIG5zMSA9IHRoaXMubi5zdWIobmV3IEJOKDEpKTtcblxuICBmb3IgKHZhciBpdGVyID0gMDsgOyBpdGVyKyspIHtcbiAgICB2YXIgayA9IG9wdGlvbnMuayA/XG4gICAgICBvcHRpb25zLmsoaXRlcikgOlxuICAgICAgbmV3IEJOKGRyYmcuZ2VuZXJhdGUodGhpcy5uLmJ5dGVMZW5ndGgoKSkpO1xuICAgIGsgPSB0aGlzLl90cnVuY2F0ZVRvTihrLCB0cnVlKTtcbiAgICBpZiAoay5jbXBuKDEpIDw9IDAgfHwgay5jbXAobnMxKSA+PSAwKVxuICAgICAgY29udGludWU7XG5cbiAgICB2YXIga3AgPSB0aGlzLmcubXVsKGspO1xuICAgIGlmIChrcC5pc0luZmluaXR5KCkpXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBrcFggPSBrcC5nZXRYKCk7XG4gICAgdmFyIHIgPSBrcFgudW1vZCh0aGlzLm4pO1xuICAgIGlmIChyLmNtcG4oMCkgPT09IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBzID0gay5pbnZtKHRoaXMubikubXVsKHIubXVsKGtleS5nZXRQcml2YXRlKCkpLmlhZGQobXNnKSk7XG4gICAgcyA9IHMudW1vZCh0aGlzLm4pO1xuICAgIGlmIChzLmNtcG4oMCkgPT09IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciByZWNvdmVyeVBhcmFtID0gKGtwLmdldFkoKS5pc09kZCgpID8gMSA6IDApIHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChrcFguY21wKHIpICE9PSAwID8gMiA6IDApO1xuXG4gICAgLy8gVXNlIGNvbXBsZW1lbnQgb2YgYHNgLCBpZiBpdCBpcyA+IGBuIC8gMmBcbiAgICBpZiAob3B0aW9ucy5jYW5vbmljYWwgJiYgcy5jbXAodGhpcy5uaCkgPiAwKSB7XG4gICAgICBzID0gdGhpcy5uLnN1YihzKTtcbiAgICAgIHJlY292ZXJ5UGFyYW0gXj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFNpZ25hdHVyZSh7IHI6IHIsIHM6IHMsIHJlY292ZXJ5UGFyYW06IHJlY292ZXJ5UGFyYW0gfSk7XG4gIH1cbn07XG5cbkVDLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobXNnLCBzaWduYXR1cmUsIGtleSwgZW5jLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucylcbiAgICBvcHRpb25zID0ge307XG5cbiAgbXNnID0gdGhpcy5fdHJ1bmNhdGVUb04obXNnLCBmYWxzZSwgb3B0aW9ucy5tc2dCaXRMZW5ndGgpO1xuICBrZXkgPSB0aGlzLmtleUZyb21QdWJsaWMoa2V5LCBlbmMpO1xuICBzaWduYXR1cmUgPSBuZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwgJ2hleCcpO1xuXG4gIC8vIFBlcmZvcm0gcHJpbWl0aXZlIHZhbHVlcyB2YWxpZGF0aW9uXG4gIHZhciByID0gc2lnbmF0dXJlLnI7XG4gIHZhciBzID0gc2lnbmF0dXJlLnM7XG4gIGlmIChyLmNtcG4oMSkgPCAwIHx8IHIuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChzLmNtcG4oMSkgPCAwIHx8IHMuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gVmFsaWRhdGUgc2lnbmF0dXJlXG4gIHZhciBzaW52ID0gcy5pbnZtKHRoaXMubik7XG4gIHZhciB1MSA9IHNpbnYubXVsKG1zZykudW1vZCh0aGlzLm4pO1xuICB2YXIgdTIgPSBzaW52Lm11bChyKS51bW9kKHRoaXMubik7XG4gIHZhciBwO1xuXG4gIGlmICghdGhpcy5jdXJ2ZS5fbWF4d2VsbFRyaWNrKSB7XG4gICAgcCA9IHRoaXMuZy5tdWxBZGQodTEsIGtleS5nZXRQdWJsaWMoKSwgdTIpO1xuICAgIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBwLmdldFgoKS51bW9kKHRoaXMubikuY21wKHIpID09PSAwO1xuICB9XG5cbiAgLy8gTk9URTogR3JlZyBNYXh3ZWxsJ3MgdHJpY2ssIGluc3BpcmVkIGJ5OlxuICAvLyBodHRwczovL2dpdC5pby92YWQzS1xuXG4gIHAgPSB0aGlzLmcuam11bEFkZCh1MSwga2V5LmdldFB1YmxpYygpLCB1Mik7XG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gQ29tcGFyZSBgcC54YCBvZiBKYWNvYmlhbiBwb2ludCB3aXRoIGByYCxcbiAgLy8gdGhpcyB3aWxsIGRvIGBwLnggPT0gciAqIHAuel4yYCBpbnN0ZWFkIG9mIG11bHRpcGx5aW5nIGBwLnhgIGJ5IHRoZVxuICAvLyBpbnZlcnNlIG9mIGBwLnpeMmBcbiAgcmV0dXJuIHAuZXFYVG9QKHIpO1xufTtcblxuRUMucHJvdG90eXBlLnJlY292ZXJQdWJLZXkgPSBmdW5jdGlvbihtc2csIHNpZ25hdHVyZSwgaiwgZW5jKSB7XG4gIGFzc2VydCgoMyAmIGopID09PSBqLCAnVGhlIHJlY292ZXJ5IHBhcmFtIGlzIG1vcmUgdGhhbiB0d28gYml0cycpO1xuICBzaWduYXR1cmUgPSBuZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwgZW5jKTtcblxuICB2YXIgbiA9IHRoaXMubjtcbiAgdmFyIGUgPSBuZXcgQk4obXNnKTtcbiAgdmFyIHIgPSBzaWduYXR1cmUucjtcbiAgdmFyIHMgPSBzaWduYXR1cmUucztcblxuICAvLyBBIHNldCBMU0Igc2lnbmlmaWVzIHRoYXQgdGhlIHktY29vcmRpbmF0ZSBpcyBvZGRcbiAgdmFyIGlzWU9kZCA9IGogJiAxO1xuICB2YXIgaXNTZWNvbmRLZXkgPSBqID4+IDE7XG4gIGlmIChyLmNtcCh0aGlzLmN1cnZlLnAudW1vZCh0aGlzLmN1cnZlLm4pKSA+PSAwICYmIGlzU2Vjb25kS2V5KVxuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgc2VuY29uZCBrZXkgY2FuZGluYXRlJyk7XG5cbiAgLy8gMS4xLiBMZXQgeCA9IHIgKyBqbi5cbiAgaWYgKGlzU2Vjb25kS2V5KVxuICAgIHIgPSB0aGlzLmN1cnZlLnBvaW50RnJvbVgoci5hZGQodGhpcy5jdXJ2ZS5uKSwgaXNZT2RkKTtcbiAgZWxzZVxuICAgIHIgPSB0aGlzLmN1cnZlLnBvaW50RnJvbVgociwgaXNZT2RkKTtcblxuICB2YXIgckludiA9IHNpZ25hdHVyZS5yLmludm0obik7XG4gIHZhciBzMSA9IG4uc3ViKGUpLm11bChySW52KS51bW9kKG4pO1xuICB2YXIgczIgPSBzLm11bChySW52KS51bW9kKG4pO1xuXG4gIC8vIDEuNi4xIENvbXB1dGUgUSA9IHJeLTEgKHNSIC0gIGVHKVxuICAvLyAgICAgICAgICAgICAgIFEgPSByXi0xIChzUiArIC1lRylcbiAgcmV0dXJuIHRoaXMuZy5tdWxBZGQoczEsIHIsIHMyKTtcbn07XG5cbkVDLnByb3RvdHlwZS5nZXRLZXlSZWNvdmVyeVBhcmFtID0gZnVuY3Rpb24oZSwgc2lnbmF0dXJlLCBRLCBlbmMpIHtcbiAgc2lnbmF0dXJlID0gbmV3IFNpZ25hdHVyZShzaWduYXR1cmUsIGVuYyk7XG4gIGlmIChzaWduYXR1cmUucmVjb3ZlcnlQYXJhbSAhPT0gbnVsbClcbiAgICByZXR1cm4gc2lnbmF0dXJlLnJlY292ZXJ5UGFyYW07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICB2YXIgUXByaW1lO1xuICAgIHRyeSB7XG4gICAgICBRcHJpbWUgPSB0aGlzLnJlY292ZXJQdWJLZXkoZSwgc2lnbmF0dXJlLCBpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoUXByaW1lLmVxKFEpKVxuICAgICAgcmV0dXJuIGk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCB2YWxpZCByZWNvdmVyeSBmYWN0b3InKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG52YXIgY2FjaGVkUHJvcGVydHkgPSB1dGlscy5jYWNoZWRQcm9wZXJ0eTtcblxuLyoqXG4qIEBwYXJhbSB7RUREU0F9IGVkZHNhIC0gaW5zdGFuY2VcbiogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHB1YmxpYy9wcml2YXRlIGtleSBwYXJhbWV0ZXJzXG4qXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZT59IFtwYXJhbXMuc2VjcmV0XSAtIHNlY3JldCBzZWVkIGJ5dGVzXG4qIEBwYXJhbSB7UG9pbnR9IFtwYXJhbXMucHViXSAtIHB1YmxpYyBrZXkgcG9pbnQgKGFrYSBgQWAgaW4gZWRkc2EgdGVybXMpXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZT59IFtwYXJhbXMucHViXSAtIHB1YmxpYyBrZXkgcG9pbnQgZW5jb2RlZCBhcyBieXRlc1xuKlxuKi9cbmZ1bmN0aW9uIEtleVBhaXIoZWRkc2EsIHBhcmFtcykge1xuICB0aGlzLmVkZHNhID0gZWRkc2E7XG4gIHRoaXMuX3NlY3JldCA9IHBhcnNlQnl0ZXMocGFyYW1zLnNlY3JldCk7XG4gIGlmIChlZGRzYS5pc1BvaW50KHBhcmFtcy5wdWIpKVxuICAgIHRoaXMuX3B1YiA9IHBhcmFtcy5wdWI7XG4gIGVsc2VcbiAgICB0aGlzLl9wdWJCeXRlcyA9IHBhcnNlQnl0ZXMocGFyYW1zLnB1Yik7XG59XG5cbktleVBhaXIuZnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGZyb21QdWJsaWMoZWRkc2EsIHB1Yikge1xuICBpZiAocHViIGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHViO1xuICByZXR1cm4gbmV3IEtleVBhaXIoZWRkc2EsIHsgcHViOiBwdWIgfSk7XG59O1xuXG5LZXlQYWlyLmZyb21TZWNyZXQgPSBmdW5jdGlvbiBmcm9tU2VjcmV0KGVkZHNhLCBzZWNyZXQpIHtcbiAgaWYgKHNlY3JldCBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHNlY3JldDtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVkZHNhLCB7IHNlY3JldDogc2VjcmV0IH0pO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuc2VjcmV0ID0gZnVuY3Rpb24gc2VjcmV0KCkge1xuICByZXR1cm4gdGhpcy5fc2VjcmV0O1xufTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ3B1YkJ5dGVzJywgZnVuY3Rpb24gcHViQnl0ZXMoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmVuY29kZVBvaW50KHRoaXMucHViKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdwdWInLCBmdW5jdGlvbiBwdWIoKSB7XG4gIGlmICh0aGlzLl9wdWJCeXRlcylcbiAgICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLl9wdWJCeXRlcyk7XG4gIHJldHVybiB0aGlzLmVkZHNhLmcubXVsKHRoaXMucHJpdigpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHJpdkJ5dGVzJywgZnVuY3Rpb24gcHJpdkJ5dGVzKCkge1xuICB2YXIgZWRkc2EgPSB0aGlzLmVkZHNhO1xuICB2YXIgaGFzaCA9IHRoaXMuaGFzaCgpO1xuICB2YXIgbGFzdEl4ID0gZWRkc2EuZW5jb2RpbmdMZW5ndGggLSAxO1xuXG4gIHZhciBhID0gaGFzaC5zbGljZSgwLCBlZGRzYS5lbmNvZGluZ0xlbmd0aCk7XG4gIGFbMF0gJj0gMjQ4O1xuICBhW2xhc3RJeF0gJj0gMTI3O1xuICBhW2xhc3RJeF0gfD0gNjQ7XG5cbiAgcmV0dXJuIGE7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ3ByaXYnLCBmdW5jdGlvbiBwcml2KCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVJbnQodGhpcy5wcml2Qnl0ZXMoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ2hhc2gnLCBmdW5jdGlvbiBoYXNoKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5oYXNoKCkudXBkYXRlKHRoaXMuc2VjcmV0KCkpLmRpZ2VzdCgpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdtZXNzYWdlUHJlZml4JywgZnVuY3Rpb24gbWVzc2FnZVByZWZpeCgpIHtcbiAgcmV0dXJuIHRoaXMuaGFzaCgpLnNsaWNlKHRoaXMuZWRkc2EuZW5jb2RpbmdMZW5ndGgpO1xufSk7XG5cbktleVBhaXIucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1lc3NhZ2UpIHtcbiAgYXNzZXJ0KHRoaXMuX3NlY3JldCwgJ0tleVBhaXIgY2FuIG9ubHkgdmVyaWZ5Jyk7XG4gIHJldHVybiB0aGlzLmVkZHNhLnNpZ24obWVzc2FnZSwgdGhpcyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobWVzc2FnZSwgc2lnKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLnZlcmlmeShtZXNzYWdlLCBzaWcsIHRoaXMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuZ2V0U2VjcmV0ID0gZnVuY3Rpb24gZ2V0U2VjcmV0KGVuYykge1xuICBhc3NlcnQodGhpcy5fc2VjcmV0LCAnS2V5UGFpciBpcyBwdWJsaWMgb25seScpO1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHRoaXMuc2VjcmV0KCksIGVuYyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRQdWJsaWMgPSBmdW5jdGlvbiBnZXRQdWJsaWMoZW5jKSB7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy5wdWJCeXRlcygpLCBlbmMpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBLZXlQYWlyO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcbnZhciBjYWNoZWRQcm9wZXJ0eSA9IHV0aWxzLmNhY2hlZFByb3BlcnR5O1xudmFyIHBhcnNlQnl0ZXMgPSB1dGlscy5wYXJzZUJ5dGVzO1xuXG4vKipcbiogQHBhcmFtIHtFRERTQX0gZWRkc2EgLSBlZGRzYSBpbnN0YW5jZVxuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPnxPYmplY3R9IHNpZyAtXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fFBvaW50fSBbc2lnLlJdIC0gUiBwb2ludCBhcyBQb2ludCBvciBieXRlc1xuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPnxibn0gW3NpZy5TXSAtIFMgc2NhbGFyIGFzIGJuIG9yIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fSBbc2lnLlJlbmNvZGVkXSAtIFIgcG9pbnQgZW5jb2RlZFxuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPn0gW3NpZy5TZW5jb2RlZF0gLSBTIHNjYWxhciBlbmNvZGVkXG4qL1xuZnVuY3Rpb24gU2lnbmF0dXJlKGVkZHNhLCBzaWcpIHtcbiAgdGhpcy5lZGRzYSA9IGVkZHNhO1xuXG4gIGlmICh0eXBlb2Ygc2lnICE9PSAnb2JqZWN0JylcbiAgICBzaWcgPSBwYXJzZUJ5dGVzKHNpZyk7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc2lnKSkge1xuICAgIGFzc2VydChzaWcubGVuZ3RoID09PSBlZGRzYS5lbmNvZGluZ0xlbmd0aCAqIDIsICdTaWduYXR1cmUgaGFzIGludmFsaWQgc2l6ZScpO1xuICAgIHNpZyA9IHtcbiAgICAgIFI6IHNpZy5zbGljZSgwLCBlZGRzYS5lbmNvZGluZ0xlbmd0aCksXG4gICAgICBTOiBzaWcuc2xpY2UoZWRkc2EuZW5jb2RpbmdMZW5ndGgpLFxuICAgIH07XG4gIH1cblxuICBhc3NlcnQoc2lnLlIgJiYgc2lnLlMsICdTaWduYXR1cmUgd2l0aG91dCBSIG9yIFMnKTtcblxuICBpZiAoZWRkc2EuaXNQb2ludChzaWcuUikpXG4gICAgdGhpcy5fUiA9IHNpZy5SO1xuICBpZiAoc2lnLlMgaW5zdGFuY2VvZiBCTilcbiAgICB0aGlzLl9TID0gc2lnLlM7XG5cbiAgdGhpcy5fUmVuY29kZWQgPSBBcnJheS5pc0FycmF5KHNpZy5SKSA/IHNpZy5SIDogc2lnLlJlbmNvZGVkO1xuICB0aGlzLl9TZW5jb2RlZCA9IEFycmF5LmlzQXJyYXkoc2lnLlMpID8gc2lnLlMgOiBzaWcuU2VuY29kZWQ7XG59XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgJ1MnLCBmdW5jdGlvbiBTKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVJbnQodGhpcy5TZW5jb2RlZCgpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsICdSJywgZnVuY3Rpb24gUigpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlUG9pbnQodGhpcy5SZW5jb2RlZCgpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsICdSZW5jb2RlZCcsIGZ1bmN0aW9uIFJlbmNvZGVkKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVQb2ludCh0aGlzLlIoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCAnU2VuY29kZWQnLCBmdW5jdGlvbiBTZW5jb2RlZCgpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlSW50KHRoaXMuUygpKTtcbn0pO1xuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvQnl0ZXMgPSBmdW5jdGlvbiB0b0J5dGVzKCkge1xuICByZXR1cm4gdGhpcy5SZW5jb2RlZCgpLmNvbmNhdCh0aGlzLlNlbmNvZGVkKCkpO1xufTtcblxuU2lnbmF0dXJlLnByb3RvdHlwZS50b0hleCA9IGZ1bmN0aW9uIHRvSGV4KCkge1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHRoaXMudG9CeXRlcygpLCAnaGV4JykudG9VcHBlckNhc2UoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gU2lnbmF0dXJlO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNoID0gcmVxdWlyZSgnaGFzaC5qcycpO1xudmFyIGN1cnZlcyA9IHJlcXVpcmUoJy4uL2N1cnZlcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG52YXIgS2V5UGFpciA9IHJlcXVpcmUoJy4va2V5Jyk7XG52YXIgU2lnbmF0dXJlID0gcmVxdWlyZSgnLi9zaWduYXR1cmUnKTtcblxuZnVuY3Rpb24gRUREU0EoY3VydmUpIHtcbiAgYXNzZXJ0KGN1cnZlID09PSAnZWQyNTUxOScsICdvbmx5IHRlc3RlZCB3aXRoIGVkMjU1MTkgc28gZmFyJyk7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEVERFNBKSlcbiAgICByZXR1cm4gbmV3IEVERFNBKGN1cnZlKTtcblxuICBjdXJ2ZSA9IGN1cnZlc1tjdXJ2ZV0uY3VydmU7XG4gIHRoaXMuY3VydmUgPSBjdXJ2ZTtcbiAgdGhpcy5nID0gY3VydmUuZztcbiAgdGhpcy5nLnByZWNvbXB1dGUoY3VydmUubi5iaXRMZW5ndGgoKSArIDEpO1xuXG4gIHRoaXMucG9pbnRDbGFzcyA9IGN1cnZlLnBvaW50KCkuY29uc3RydWN0b3I7XG4gIHRoaXMuZW5jb2RpbmdMZW5ndGggPSBNYXRoLmNlaWwoY3VydmUubi5iaXRMZW5ndGgoKSAvIDgpO1xuICB0aGlzLmhhc2ggPSBoYXNoLnNoYTUxMjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFRERTQTtcblxuLyoqXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBtZXNzYWdlIC0gbWVzc2FnZSBieXRlc1xuKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xLZXlQYWlyfSBzZWNyZXQgLSBzZWNyZXQgYnl0ZXMgb3IgYSBrZXlwYWlyXG4qIEByZXR1cm5zIHtTaWduYXR1cmV9IC0gc2lnbmF0dXJlXG4qL1xuRUREU0EucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1lc3NhZ2UsIHNlY3JldCkge1xuICBtZXNzYWdlID0gcGFyc2VCeXRlcyhtZXNzYWdlKTtcbiAgdmFyIGtleSA9IHRoaXMua2V5RnJvbVNlY3JldChzZWNyZXQpO1xuICB2YXIgciA9IHRoaXMuaGFzaEludChrZXkubWVzc2FnZVByZWZpeCgpLCBtZXNzYWdlKTtcbiAgdmFyIFIgPSB0aGlzLmcubXVsKHIpO1xuICB2YXIgUmVuY29kZWQgPSB0aGlzLmVuY29kZVBvaW50KFIpO1xuICB2YXIgc18gPSB0aGlzLmhhc2hJbnQoUmVuY29kZWQsIGtleS5wdWJCeXRlcygpLCBtZXNzYWdlKVxuICAgIC5tdWwoa2V5LnByaXYoKSk7XG4gIHZhciBTID0gci5hZGQoc18pLnVtb2QodGhpcy5jdXJ2ZS5uKTtcbiAgcmV0dXJuIHRoaXMubWFrZVNpZ25hdHVyZSh7IFI6IFIsIFM6IFMsIFJlbmNvZGVkOiBSZW5jb2RlZCB9KTtcbn07XG5cbi8qKlxuKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlIC0gbWVzc2FnZSBieXRlc1xuKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xTaWduYXR1cmV9IHNpZyAtIHNpZyBieXRlc1xuKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xQb2ludHxLZXlQYWlyfSBwdWIgLSBwdWJsaWMga2V5XG4qIEByZXR1cm5zIHtCb29sZWFufSAtIHRydWUgaWYgcHVibGljIGtleSBtYXRjaGVzIHNpZyBvZiBtZXNzYWdlXG4qL1xuRUREU0EucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtZXNzYWdlLCBzaWcsIHB1Yikge1xuICBtZXNzYWdlID0gcGFyc2VCeXRlcyhtZXNzYWdlKTtcbiAgc2lnID0gdGhpcy5tYWtlU2lnbmF0dXJlKHNpZyk7XG4gIGlmIChzaWcuUygpLmd0ZShzaWcuZWRkc2EuY3VydmUubikgfHwgc2lnLlMoKS5pc05lZygpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBrZXkgPSB0aGlzLmtleUZyb21QdWJsaWMocHViKTtcbiAgdmFyIGggPSB0aGlzLmhhc2hJbnQoc2lnLlJlbmNvZGVkKCksIGtleS5wdWJCeXRlcygpLCBtZXNzYWdlKTtcbiAgdmFyIFNHID0gdGhpcy5nLm11bChzaWcuUygpKTtcbiAgdmFyIFJwbHVzQWggPSBzaWcuUigpLmFkZChrZXkucHViKCkubXVsKGgpKTtcbiAgcmV0dXJuIFJwbHVzQWguZXEoU0cpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmhhc2hJbnQgPSBmdW5jdGlvbiBoYXNoSW50KCkge1xuICB2YXIgaGFzaCA9IHRoaXMuaGFzaCgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICBoYXNoLnVwZGF0ZShhcmd1bWVudHNbaV0pO1xuICByZXR1cm4gdXRpbHMuaW50RnJvbUxFKGhhc2guZGlnZXN0KCkpLnVtb2QodGhpcy5jdXJ2ZS5uKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5rZXlGcm9tUHVibGljID0gZnVuY3Rpb24ga2V5RnJvbVB1YmxpYyhwdWIpIHtcbiAgcmV0dXJuIEtleVBhaXIuZnJvbVB1YmxpYyh0aGlzLCBwdWIpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmtleUZyb21TZWNyZXQgPSBmdW5jdGlvbiBrZXlGcm9tU2VjcmV0KHNlY3JldCkge1xuICByZXR1cm4gS2V5UGFpci5mcm9tU2VjcmV0KHRoaXMsIHNlY3JldCk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUubWFrZVNpZ25hdHVyZSA9IGZ1bmN0aW9uIG1ha2VTaWduYXR1cmUoc2lnKSB7XG4gIGlmIChzaWcgaW5zdGFuY2VvZiBTaWduYXR1cmUpXG4gICAgcmV0dXJuIHNpZztcbiAgcmV0dXJuIG5ldyBTaWduYXR1cmUodGhpcywgc2lnKTtcbn07XG5cbi8qKlxuKiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1qb3NlZnNzb24tZWRkc2EtZWQyNTUxOS0wMyNzZWN0aW9uLTUuMlxuKlxuKiBFRERTQSBkZWZpbmVzIG1ldGhvZHMgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZyBwb2ludHMgYW5kIGludGVnZXJzLiBUaGVzZSBhcmVcbiogaGVscGVyIGNvbnZlbmllbmNlIG1ldGhvZHMsIHRoYXQgcGFzcyBhbG9uZyB0byB1dGlsaXR5IGZ1bmN0aW9ucyBpbXBsaWVkXG4qIHBhcmFtZXRlcnMuXG4qXG4qL1xuRUREU0EucHJvdG90eXBlLmVuY29kZVBvaW50ID0gZnVuY3Rpb24gZW5jb2RlUG9pbnQocG9pbnQpIHtcbiAgdmFyIGVuYyA9IHBvaW50LmdldFkoKS50b0FycmF5KCdsZScsIHRoaXMuZW5jb2RpbmdMZW5ndGgpO1xuICBlbmNbdGhpcy5lbmNvZGluZ0xlbmd0aCAtIDFdIHw9IHBvaW50LmdldFgoKS5pc09kZCgpID8gMHg4MCA6IDA7XG4gIHJldHVybiBlbmM7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZGVjb2RlUG9pbnQgPSBmdW5jdGlvbiBkZWNvZGVQb2ludChieXRlcykge1xuICBieXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXMoYnl0ZXMpO1xuXG4gIHZhciBsYXN0SXggPSBieXRlcy5sZW5ndGggLSAxO1xuICB2YXIgbm9ybWVkID0gYnl0ZXMuc2xpY2UoMCwgbGFzdEl4KS5jb25jYXQoYnl0ZXNbbGFzdEl4XSAmIH4weDgwKTtcbiAgdmFyIHhJc09kZCA9IChieXRlc1tsYXN0SXhdICYgMHg4MCkgIT09IDA7XG5cbiAgdmFyIHkgPSB1dGlscy5pbnRGcm9tTEUobm9ybWVkKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnRGcm9tWSh5LCB4SXNPZGQpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmVuY29kZUludCA9IGZ1bmN0aW9uIGVuY29kZUludChudW0pIHtcbiAgcmV0dXJuIG51bS50b0FycmF5KCdsZScsIHRoaXMuZW5jb2RpbmdMZW5ndGgpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmRlY29kZUludCA9IGZ1bmN0aW9uIGRlY29kZUludChieXRlcykge1xuICByZXR1cm4gdXRpbHMuaW50RnJvbUxFKGJ5dGVzKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5pc1BvaW50ID0gZnVuY3Rpb24gaXNQb2ludCh2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIHRoaXMucG9pbnRDbGFzcztcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGVsbGlwdGljID0gZXhwb3J0cztcblxuZWxsaXB0aWMudmVyc2lvbiA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpLnZlcnNpb247XG5lbGxpcHRpYy51dGlscyA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvdXRpbHMnKTtcbmVsbGlwdGljLnJhbmQgPSByZXF1aXJlKCdicm9yYW5kJyk7XG5lbGxpcHRpYy5jdXJ2ZSA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvY3VydmUnKTtcbmVsbGlwdGljLmN1cnZlcyA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvY3VydmVzJyk7XG5cbi8vIFByb3RvY29sc1xuZWxsaXB0aWMuZWMgPSByZXF1aXJlKCcuL2VsbGlwdGljL2VjJyk7XG5lbGxpcHRpYy5lZGRzYSA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvZWRkc2EnKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdhc24xLmpzJykuYmlnbnVtLFxuXHRCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiYXNlNjRUb0JpZ051bSh2YWwsIHplcm8pIHtcblx0dmFyIGJ1ZiA9IEJ1ZmZlci5mcm9tKHZhbCwgJ2Jhc2U2NCcpO1xuXHR2YXIgYm4gPSB2YWwgPSBuZXcgQk4oYnVmLCAxMCwgJ2JlJykuaWFicygpO1xuXHRpZiAoemVybykge1xuXHRcdGJ1Zi5maWxsKDApO1xuXHR9XG5cdHJldHVybiBibjtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdhc24xLmpzJykuZGVmaW5lKCdBbGdvcml0aG1JZGVudGlmZXInLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ2FsZ29yaXRobScpLm9iamlkKCksXG5cdFx0dGhpcy5rZXkoJ3BhcmFtZXRlcnMnKS5vcHRpb25hbCgpLmFueSgpXG5cdCk7XG59KTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQWxnb3JpdGhtSWRlbnRpZmllciA9IHJlcXVpcmUoJy4vYWxnb3JpdGhtLWlkZW50aWZpZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdhc24xLmpzJykuZGVmaW5lKCdQdWJsaWNLZXlJbmZvJywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCdhbGdvcml0aG0nKS51c2UoQWxnb3JpdGhtSWRlbnRpZmllciksXG5cdFx0dGhpcy5rZXkoJ1B1YmxpY0tleScpLmJpdHN0cigpXG5cdCk7XG59KTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ1ZlcnNpb24nLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5pbnQoKTtcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBBbGdvcml0aG1JZGVudGlmaWVyID0gcmVxdWlyZSgnLi9hbGdvcml0aG0taWRlbnRpZmllcicpO1xudmFyIFZlcnNpb24gPSByZXF1aXJlKCcuL3ZlcnNpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdhc24xLmpzJykuZGVmaW5lKCdQcml2YXRlS2V5SW5mbycsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNlcSgpLm9iaihcblx0XHR0aGlzLmtleSgndmVyc2lvbicpLnVzZShWZXJzaW9uKSxcblx0XHR0aGlzLmtleSgncHJpdmF0ZUtleUFsZ29yaXRobScpLnVzZShBbGdvcml0aG1JZGVudGlmaWVyKSxcblx0XHR0aGlzLmtleSgncHJpdmF0ZUtleScpLm9jdHN0cigpLFxuXHRcdHRoaXMua2V5KCdhdHRyaWJ1dGVzJykub3B0aW9uYWwoKS5hbnkoKVxuXHQpO1xufSk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGFzbjEgPSByZXF1aXJlKCdhc24xLmpzJyksXG5cdEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyLFxuXHRFQyA9IHJlcXVpcmUoJ2VsbGlwdGljJykuZWM7XG5cbnZhciBiNjRUb0JuID0gcmVxdWlyZSgnLi9iNjQtdG8tYm4nKTtcblxudmFyIFB1YmxpY0tleUluZm8gPSByZXF1aXJlKCcuL2FzbjEvcHVibGljLWtleS1pbmZvJyksXG5cdFByaXZhdGVLZXlJbmZvID0gcmVxdWlyZSgnLi9hc24xL3ByaXZhdGUta2V5LWluZm8nKSxcblx0VmVyc2lvbiA9IHJlcXVpcmUoJy4vYXNuMS92ZXJzaW9uJyk7XG5cbnZhciBFQ1BhcmFtZXRlcnMgPSBhc24xLmRlZmluZSgnRUNQYXJhbWV0ZXJzJywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuY2hvaWNlKHtcblx0XHRuYW1lZEN1cnZlOiB0aGlzLm9iamlkKClcblx0fSk7XG59KTtcblxudmFyIGVjUHJpdmtleVZlcjEgPSAxO1xuXG52YXIgRUNQcml2YXRlS2V5ID0gYXNuMS5kZWZpbmUoJ0VDUHJpdmF0ZUtleScsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNlcSgpLm9iaihcblx0XHR0aGlzLmtleSgndmVyc2lvbicpLnVzZShWZXJzaW9uKSxcblx0XHR0aGlzLmtleSgncHJpdmF0ZUtleScpLm9jdHN0cigpLFxuXHRcdHRoaXMua2V5KCdwYXJhbWV0ZXJzJykuZXhwbGljaXQoMCkub3B0aW9uYWwoKS5hbnkoKSxcblx0XHR0aGlzLmtleSgncHVibGljS2V5JykuZXhwbGljaXQoMSkub3B0aW9uYWwoKS5iaXRzdHIoKVxuXHQpO1xufSk7XG5cbnZhciBjdXJ2ZXMgPSB7XG5cdCdQLTI1Nic6ICdwMjU2Jyxcblx0J1AtMzg0JzogJ3AzODQnLFxuXHQnUC01MjEnOiAncDUyMSdcbn07XG5cbnZhciBvaWRzID0ge1xuXHQnUC0yNTYnOiBbMSwgMiwgODQwLCAxMDA0NSwgMywgMSwgN10sXG5cdCdQLTM4NCc6IFsxLCAzLCAxMzIsIDAsIDM0XSxcblx0J1AtNTIxJzogWzEsIDMsIDEzMiwgMCwgMzVdXG59O1xudmFyIHBhcmFtZXRlcnMgPSB7fTtcbnZhciBhbGdvcml0aG1zID0ge307XG5PYmplY3Qua2V5cyhvaWRzKS5mb3JFYWNoKGZ1bmN0aW9uKGNydikge1xuXHRwYXJhbWV0ZXJzW2Nydl0gPSBFQ1BhcmFtZXRlcnMuZW5jb2RlKHtcblx0XHR0eXBlOiAnbmFtZWRDdXJ2ZScsXG5cdFx0dmFsdWU6IG9pZHNbY3J2XVxuXHR9LCAnZGVyJyk7XG5cdGFsZ29yaXRobXNbY3J2XSA9IHtcblx0XHRhbGdvcml0aG06ICBbMSwgMiwgODQwLCAxMDA0NSwgMiwgMV0sXG5cdFx0cGFyYW1ldGVyczogcGFyYW1ldGVyc1tjcnZdXG5cdH07XG59KTtcbm9pZHMgPSBudWxsO1xuXG5mdW5jdGlvbiBlY0p3a1RvQnVmZmVyKGp3aywgb3B0cykge1xuXHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2suY3J2KSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suY3J2XCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdHZhciBoYXNEID0gJ3N0cmluZycgPT09IHR5cGVvZiBqd2suZDtcblx0dmFyIHh5VHlwZXMgPSBoYXNEXG5cdFx0PyBbJ3VuZGVmaW5lZCcsICdzdHJpbmcnXVxuXHRcdDogWydzdHJpbmcnXTtcblxuXHRpZiAoLTEgPT09IHh5VHlwZXMuaW5kZXhPZih0eXBlb2YgandrLngpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sueFwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHRpZiAoLTEgPT09IHh5VHlwZXMuaW5kZXhPZih0eXBlb2YgandrLnkpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sueVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHRpZiAob3B0cy5wcml2YXRlICYmICFoYXNEKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suZFwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHR2YXIgY3VydmVOYW1lID0gY3VydmVzW2p3ay5jcnZdO1xuXHRpZiAoIWN1cnZlTmFtZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY3VydmUgXCInICsgandrLmNydiArICdcIicpO1xuXHR9XG5cblx0dmFyIGN1cnZlID0gbmV3IEVDKGN1cnZlTmFtZSk7XG5cblx0dmFyIGtleSA9IHt9O1xuXG5cdHZhciBoYXNQdWIgPSBqd2sueCAmJiBqd2sueTtcblx0aWYgKGhhc1B1Yikge1xuXHRcdGtleS5wdWIgPSB7XG5cdFx0XHR4OiBiNjRUb0JuKGp3ay54LCBmYWxzZSksXG5cdFx0XHR5OiBiNjRUb0JuKGp3ay55LCBmYWxzZSlcblx0XHR9O1xuXHR9XG5cblx0aWYgKG9wdHMucHJpdmF0ZSB8fCAhaGFzUHViKSB7XG5cdFx0a2V5LnByaXYgPSBiNjRUb0JuKGp3ay5kLCB0cnVlKTtcblx0fVxuXG5cdGtleSA9IGN1cnZlLmtleVBhaXIoa2V5KTtcblxuXHR2YXIga2V5VmFsaWRhdGlvbiA9IGtleS52YWxpZGF0ZSgpO1xuXHRpZiAoIWtleVZhbGlkYXRpb24ucmVzdWx0KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleSBmb3IgY3VydmU6IFwiJyArIGtleVZhbGlkYXRpb24ucmVhc29uICsgJ1wiJyk7XG5cdH1cblxuXHR2YXIgcmVzdWx0ID0ga2V5VG9QZW0oandrLmNydiwga2V5LCBvcHRzKTtcblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBrZXlUb1BlbShjcnYsIGtleSwgb3B0cykge1xuXHR2YXIgY29tcGFjdCA9IGZhbHNlO1xuXHR2YXIgcHVibGljS2V5ID0ga2V5LmdldFB1YmxpYyhjb21wYWN0LCAnaGV4Jyk7XG5cdHB1YmxpY0tleSA9IEJ1ZmZlci5mcm9tKHB1YmxpY0tleSwgJ2hleCcpO1xuXHRwdWJsaWNLZXkgPSB7XG5cdFx0dW51c2VkOiAwLFxuXHRcdGRhdGE6IHB1YmxpY0tleVxuXHR9O1xuXG5cdHZhciByZXN1bHQ7XG5cdGlmIChvcHRzLnByaXZhdGUpIHtcblx0XHR2YXIgcHJpdmF0ZUtleSA9IGtleS5nZXRQcml2YXRlKCdoZXgnKTtcblx0XHRwcml2YXRlS2V5ID0gQnVmZmVyLmZyb20ocHJpdmF0ZUtleSwgJ2hleCcpO1xuXG5cdFx0cmVzdWx0ID0gUHJpdmF0ZUtleUluZm8uZW5jb2RlKHtcblx0XHRcdHZlcnNpb246IDAsXG5cdFx0XHRwcml2YXRlS2V5QWxnb3JpdGhtOiBhbGdvcml0aG1zW2Nydl0sXG5cdFx0XHRwcml2YXRlS2V5OiBFQ1ByaXZhdGVLZXkuZW5jb2RlKHtcblx0XHRcdFx0dmVyc2lvbjogZWNQcml2a2V5VmVyMSxcblx0XHRcdFx0cHJpdmF0ZUtleTogcHJpdmF0ZUtleSxcblx0XHRcdFx0cGFyYW1ldGVyczogcGFyYW1ldGVyc1tjcnZdLFxuXHRcdFx0XHRwdWJsaWNLZXk6IHB1YmxpY0tleVxuXHRcdFx0fSwgJ2RlcicpXG5cdFx0fSwgJ3BlbScsIHtcblx0XHRcdGxhYmVsOiAnUFJJVkFURSBLRVknXG5cdFx0fSk7XG5cblx0XHRwcml2YXRlS2V5LmZpbGwoMCk7XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gUHVibGljS2V5SW5mby5lbmNvZGUoe1xuXHRcdFx0YWxnb3JpdGhtOiBhbGdvcml0aG1zW2Nydl0sXG5cdFx0XHRQdWJsaWNLZXk6IHB1YmxpY0tleVxuXHRcdH0sICdwZW0nLCB7XG5cdFx0XHRsYWJlbDogJ1BVQkxJQyBLRVknXG5cdFx0fSk7XG5cdH1cblxuXHQvLyBUaGlzIGlzIGluIGFuIGlmIGluY2FzZSBhc24xLmpzIGFkZHMgYSB0cmFpbGluZyBcXG5cblx0Ly8gaXN0YW5idWwgaWdub3JlIGVsc2Vcblx0aWYgKCdcXG4nICE9PSByZXN1bHQuc2xpY2UoLTEpKSB7XG5cdFx0cmVzdWx0ICs9ICdcXG4nO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlY0p3a1RvQnVmZmVyO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBhc24xID0gcmVxdWlyZSgnYXNuMS5qcycpO1xuXG52YXIgYjY0VG9CbiA9IHJlcXVpcmUoJy4vYjY0LXRvLWJuJyk7XG5cbnZhciBQdWJsaWNLZXlJbmZvID0gcmVxdWlyZSgnLi9hc24xL3B1YmxpYy1rZXktaW5mbycpLFxuXHRQcml2YXRlS2V5SW5mbyA9IHJlcXVpcmUoJy4vYXNuMS9wcml2YXRlLWtleS1pbmZvJyksXG5cdFZlcnNpb24gPSByZXF1aXJlKCcuL2FzbjEvdmVyc2lvbicpO1xuXG52YXIgUlNBUHJpdmF0ZUtleSA9IGFzbjEuZGVmaW5lKCdSU0FQcml2YXRlS2V5JywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCd2ZXJzaW9uJykudXNlKFZlcnNpb24pLFxuXHRcdHRoaXMua2V5KCdtb2R1bHVzJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ3B1YmxpY0V4cG9uZW50JykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ3ByaXZhdGVFeHBvbmVudCcpLmludCgpLFxuXHRcdHRoaXMua2V5KCdwcmltZTEnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHJpbWUyJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ2V4cG9uZW50MScpLmludCgpLFxuXHRcdHRoaXMua2V5KCdleHBvbmVudDInKS5pbnQoKSxcblx0XHR0aGlzLmtleSgnY29lZmZpY2llbnQnKS5pbnQoKVxuXHQpO1xufSk7XG5cbnZhciBSU0FQdWJsaWNLZXkgPSBhc24xLmRlZmluZSgnUlNBUHVibGljS2V5JywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCdtb2R1bHVzJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ3B1YmxpY0V4cG9uZW50JykuaW50KClcblx0KTtcbn0pO1xuXG52YXIgYWxnb3JpdGhtID0ge1xuXHRhbGdvcml0aG06IFsxLCAyLCA4NDAsIDExMzU0OSwgMSwgMSwgMV0sXG5cdHBhcmFtZXRlcnM6IFs1LCAwXVxufTtcblxuZnVuY3Rpb24gcnNhSndrVG9CdWZmZXIoandrLCBvcHRzKSB7XG5cdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5lKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suZVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2subikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLm5cIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0aWYgKG9wdHMucHJpdmF0ZSkge1xuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5kKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cblx0XHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2sucCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sucFwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLnEpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLnFcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5kcCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suZHBcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5kcSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suZHFcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5xaSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sucWlcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblx0fVxuXG5cdHZhciBwZW07XG5cdGlmIChvcHRzLnByaXZhdGUpIHtcblx0XHRwZW0gPSBQcml2YXRlS2V5SW5mby5lbmNvZGUoe1xuXHRcdFx0dmVyc2lvbjogMCxcblx0XHRcdHByaXZhdGVLZXlBbGdvcml0aG06IGFsZ29yaXRobSxcblx0XHRcdHByaXZhdGVLZXk6IFJTQVByaXZhdGVLZXkuZW5jb2RlKHtcblx0XHRcdFx0dmVyc2lvbjogMCxcblx0XHRcdFx0bW9kdWx1czogYjY0VG9Cbihqd2subiwgZmFsc2UpLFxuXHRcdFx0XHRwdWJsaWNFeHBvbmVudDogYjY0VG9Cbihqd2suZSwgZmFsc2UpLFxuXHRcdFx0XHRwcml2YXRlRXhwb25lbnQ6IGI2NFRvQm4oandrLmQsIHRydWUpLFxuXHRcdFx0XHRwcmltZTE6IGI2NFRvQm4oandrLnAsIHRydWUpLFxuXHRcdFx0XHRwcmltZTI6IGI2NFRvQm4oandrLnEsIHRydWUpLFxuXHRcdFx0XHRleHBvbmVudDE6IGI2NFRvQm4oandrLmRwLCB0cnVlKSxcblx0XHRcdFx0ZXhwb25lbnQyOiBiNjRUb0JuKGp3ay5kcSwgdHJ1ZSksXG5cdFx0XHRcdGNvZWZmaWNpZW50OiBiNjRUb0JuKGp3ay5xaSwgdHJ1ZSlcblx0XHRcdH0sICdkZXInKVxuXHRcdH0sICdwZW0nLCB7XG5cdFx0XHRsYWJlbDogJ1BSSVZBVEUgS0VZJ1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHBlbSA9IFB1YmxpY0tleUluZm8uZW5jb2RlKHtcblx0XHRcdGFsZ29yaXRobTogYWxnb3JpdGhtLFxuXHRcdFx0UHVibGljS2V5OiB7XG5cdFx0XHRcdHVudXNlZDogMCxcblx0XHRcdFx0ZGF0YTogUlNBUHVibGljS2V5LmVuY29kZSh7XG5cdFx0XHRcdFx0bW9kdWx1czogYjY0VG9Cbihqd2subiwgZmFsc2UpLFxuXHRcdFx0XHRcdHB1YmxpY0V4cG9uZW50OiBiNjRUb0JuKGp3ay5lLCBmYWxzZSlcblx0XHRcdFx0fSwgJ2RlcicpXG5cdFx0XHR9XG5cdFx0fSwgJ3BlbScsIHtcblx0XHRcdGxhYmVsOiAnUFVCTElDIEtFWSdcblx0XHR9KTtcblx0fVxuXG5cdC8vIFRoaXMgaXMgaW4gYW4gaWYgaW5jYXNlIGFzbjEuanMgYWRkcyBhIHRyYWlsaW5nIFxcblxuXHQvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuXHRpZiAoJ1xcbicgIT09IHBlbS5zbGljZSgtMSkpIHtcblx0XHRwZW0gKz0gJ1xcbic7XG5cdH1cblxuXHRyZXR1cm4gcGVtO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJzYUp3a1RvQnVmZmVyO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBlYyA9IHJlcXVpcmUoJy4vZWMnKSxcblx0cnNhID0gcmVxdWlyZSgnLi9yc2EnKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHt7a3R5OidFQycsIGNydjpzdHJpbmcsIGQ6c3RyaW5nLCB4PzpzdHJpbmcsIHk/OnN0cmluZ30gfCB7a3R5OidFQycsIGNydjpzdHJpbmcsIHg6c3RyaW5nLCB5OnN0cmluZ30gfCB7a3R5OidSU0EnLCBlOnN0cmluZywgbjpzdHJpbmcsIGQ/OnN0cmluZywgcD86c3RyaW5nLCBxPzpzdHJpbmcsIGRwPzpzdHJpbmcsIGRxPzpzdHJpbmcsIHFpPzpzdHJpbmd9fSBqd2tcbiAqIEBwYXJhbSB7e3ByaXZhdGU6Ym9vbGVhbn09fSBvcHRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBqd2tUb0J1ZmZlcihqd2ssIG9wdHMpIHtcblx0aWYgKCdvYmplY3QnICE9PSB0eXBlb2YgandrIHx8IG51bGwgPT09IGp3aykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrXCIgdG8gYmUgYW4gT2JqZWN0Jyk7XG5cdH1cblxuXHR2YXIga3R5ID0gandrLmt0eTtcblx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2Yga3R5KSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sua3R5XCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdG9wdHMgPSBvcHRzIHx8IHt9O1xuXHRvcHRzLnByaXZhdGUgPSBvcHRzLnByaXZhdGUgPT09IHRydWU7XG5cblx0c3dpdGNoIChrdHkpIHtcblx0XHRjYXNlICdFQyc6IHtcblx0XHRcdHJldHVybiBlYyhqd2ssIG9wdHMpO1xuXHRcdH1cblx0XHRjYXNlICdSU0EnOiB7XG5cdFx0XHRyZXR1cm4gcnNhKGp3aywgb3B0cyk7XG5cdFx0fVxuXHRcdGRlZmF1bHQ6IHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQga2V5IHR5cGUgXCInICsga3R5ICsgJ1wiJyk7XG5cdFx0fVxuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gandrVG9CdWZmZXI7XG4iLAogICAgIi8vI3JlZ2lvbiByb2xsZG93bjpydW50aW1lXG52YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7XG5cdGZvciAodmFyIG5hbWUgaW4gYWxsKSBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7XG5cdFx0Z2V0OiBhbGxbbmFtZV0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgX19leHBvcnQgfTsiLAogICAgImNvbnN0IGVudGl0eUtpbmQgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTplbnRpdHlLaW5kXCIpO1xuY29uc3QgaGFzT3duRW50aXR5S2luZCA9IFN5bWJvbC5mb3IoXCJkcml6emxlOmhhc093bkVudGl0eUtpbmRcIik7XG5mdW5jdGlvbiBpcyh2YWx1ZSwgdHlwZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiB0eXBlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodHlwZSwgZW50aXR5S2luZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2xhc3MgXCIke3R5cGUubmFtZSA/PyBcIjx1bmtub3duPlwifVwiIGRvZXNuJ3QgbG9vayBsaWtlIGEgRHJpenpsZSBlbnRpdHkuIElmIHRoaXMgaXMgaW5jb3JyZWN0IGFuZCB0aGUgY2xhc3MgaXMgcHJvdmlkZWQgYnkgRHJpenpsZSwgcGxlYXNlIHJlcG9ydCB0aGlzIGFzIGEgYnVnLmBcbiAgICApO1xuICB9XG4gIGxldCBjbHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpLmNvbnN0cnVjdG9yO1xuICBpZiAoY2xzKSB7XG4gICAgd2hpbGUgKGNscykge1xuICAgICAgaWYgKGVudGl0eUtpbmQgaW4gY2xzICYmIGNsc1tlbnRpdHlLaW5kXSA9PT0gdHlwZVtlbnRpdHlLaW5kXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNscyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjbHMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQge1xuICBlbnRpdHlLaW5kLFxuICBoYXNPd25FbnRpdHlLaW5kLFxuICBpc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVudGl0eS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIENvbHVtbiB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5rZXlBc05hbWUgPSBjb25maWcua2V5QXNOYW1lO1xuICAgIHRoaXMubm90TnVsbCA9IGNvbmZpZy5ub3ROdWxsO1xuICAgIHRoaXMuZGVmYXVsdCA9IGNvbmZpZy5kZWZhdWx0O1xuICAgIHRoaXMuZGVmYXVsdEZuID0gY29uZmlnLmRlZmF1bHRGbjtcbiAgICB0aGlzLm9uVXBkYXRlRm4gPSBjb25maWcub25VcGRhdGVGbjtcbiAgICB0aGlzLmhhc0RlZmF1bHQgPSBjb25maWcuaGFzRGVmYXVsdDtcbiAgICB0aGlzLnByaW1hcnkgPSBjb25maWcucHJpbWFyeUtleTtcbiAgICB0aGlzLmlzVW5pcXVlID0gY29uZmlnLmlzVW5pcXVlO1xuICAgIHRoaXMudW5pcXVlTmFtZSA9IGNvbmZpZy51bmlxdWVOYW1lO1xuICAgIHRoaXMudW5pcXVlVHlwZSA9IGNvbmZpZy51bmlxdWVUeXBlO1xuICAgIHRoaXMuZGF0YVR5cGUgPSBjb25maWcuZGF0YVR5cGU7XG4gICAgdGhpcy5jb2x1bW5UeXBlID0gY29uZmlnLmNvbHVtblR5cGU7XG4gICAgdGhpcy5nZW5lcmF0ZWQgPSBjb25maWcuZ2VuZXJhdGVkO1xuICAgIHRoaXMuZ2VuZXJhdGVkSWRlbnRpdHkgPSBjb25maWcuZ2VuZXJhdGVkSWRlbnRpdHk7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ29sdW1uXCI7XG4gIG5hbWU7XG4gIGtleUFzTmFtZTtcbiAgcHJpbWFyeTtcbiAgbm90TnVsbDtcbiAgZGVmYXVsdDtcbiAgZGVmYXVsdEZuO1xuICBvblVwZGF0ZUZuO1xuICBoYXNEZWZhdWx0O1xuICBpc1VuaXF1ZTtcbiAgdW5pcXVlTmFtZTtcbiAgdW5pcXVlVHlwZTtcbiAgZGF0YVR5cGU7XG4gIGNvbHVtblR5cGU7XG4gIGVudW1WYWx1ZXMgPSB2b2lkIDA7XG4gIGdlbmVyYXRlZCA9IHZvaWQgMDtcbiAgZ2VuZXJhdGVkSWRlbnRpdHkgPSB2b2lkIDA7XG4gIGNvbmZpZztcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgLy8gKiogQGludGVybmFsICovXG4gIHNob3VsZERpc2FibGVJbnNlcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdlbmVyYXRlZCAhPT0gdm9pZCAwICYmIHRoaXMuY29uZmlnLmdlbmVyYXRlZC50eXBlICE9PSBcImJ5RGVmYXVsdFwiO1xuICB9XG59XG5leHBvcnQge1xuICBDb2x1bW5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb2x1bW4uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ29sdW1uQnVpbGRlclwiO1xuICBjb25maWc7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRhdGFUeXBlLCBjb2x1bW5UeXBlKSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBuYW1lLFxuICAgICAga2V5QXNOYW1lOiBuYW1lID09PSBcIlwiLFxuICAgICAgbm90TnVsbDogZmFsc2UsXG4gICAgICBkZWZhdWx0OiB2b2lkIDAsXG4gICAgICBoYXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgIHByaW1hcnlLZXk6IGZhbHNlLFxuICAgICAgaXNVbmlxdWU6IGZhbHNlLFxuICAgICAgdW5pcXVlTmFtZTogdm9pZCAwLFxuICAgICAgdW5pcXVlVHlwZTogdm9pZCAwLFxuICAgICAgZGF0YVR5cGUsXG4gICAgICBjb2x1bW5UeXBlLFxuICAgICAgZ2VuZXJhdGVkOiB2b2lkIDBcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBDaGFuZ2VzIHRoZSBkYXRhIHR5cGUgb2YgdGhlIGNvbHVtbi4gQ29tbW9ubHkgdXNlZCB3aXRoIGBqc29uYCBjb2x1bW5zLiBBbHNvLCB1c2VmdWwgZm9yIGJyYW5kZWQgdHlwZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IHVzZXJzID0gcGdUYWJsZSgndXNlcnMnLCB7XG4gICAqIFx0aWQ6IGludGVnZXIoJ2lkJykuJHR5cGU8VXNlcklkPigpLnByaW1hcnlLZXkoKSxcbiAgICogXHRkZXRhaWxzOiBqc29uKCdkZXRhaWxzJykuJHR5cGU8VXNlckRldGFpbHM+KCkubm90TnVsbCgpLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAkdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGBub3QgbnVsbGAgY2xhdXNlIHRvIHRoZSBjb2x1bW4gZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQWZmZWN0cyB0aGUgYHNlbGVjdGAgbW9kZWwgb2YgdGhlIHRhYmxlIC0gY29sdW1ucyAqd2l0aG91dCogYG5vdCBudWxsYCB3aWxsIGJlIG51bGxhYmxlIG9uIHNlbGVjdC5cbiAgICovXG4gIG5vdE51bGwoKSB7XG4gICAgdGhpcy5jb25maWcubm90TnVsbCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBgZGVmYXVsdCA8dmFsdWU+YCBjbGF1c2UgdG8gdGhlIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBBZmZlY3RzIHRoZSBgaW5zZXJ0YCBtb2RlbCBvZiB0aGUgdGFibGUgLSBjb2x1bW5zICp3aXRoKiBgZGVmYXVsdGAgYXJlIG9wdGlvbmFsIG9uIGluc2VydC5cbiAgICpcbiAgICogSWYgeW91IG5lZWQgdG8gc2V0IGEgZHluYW1pYyBkZWZhdWx0IHZhbHVlLCB1c2Uge0BsaW5rICRkZWZhdWx0Rm59IGluc3RlYWQuXG4gICAqL1xuICBkZWZhdWx0KHZhbHVlKSB7XG4gICAgdGhpcy5jb25maWcuZGVmYXVsdCA9IHZhbHVlO1xuICAgIHRoaXMuY29uZmlnLmhhc0RlZmF1bHQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgZHluYW1pYyBkZWZhdWx0IHZhbHVlIHRvIHRoZSBjb2x1bW4uXG4gICAqIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByb3cgaXMgaW5zZXJ0ZWQsIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb2x1bW4gdmFsdWUuXG4gICAqXG4gICAqICoqTm90ZToqKiBUaGlzIHZhbHVlIGRvZXMgbm90IGFmZmVjdCB0aGUgYGRyaXp6bGUta2l0YCBiZWhhdmlvciwgaXQgaXMgb25seSB1c2VkIGF0IHJ1bnRpbWUgaW4gYGRyaXp6bGUtb3JtYC5cbiAgICovXG4gICRkZWZhdWx0Rm4oZm4pIHtcbiAgICB0aGlzLmNvbmZpZy5kZWZhdWx0Rm4gPSBmbjtcbiAgICB0aGlzLmNvbmZpZy5oYXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWxpYXMgZm9yIHtAbGluayAkZGVmYXVsdEZufS5cbiAgICovXG4gICRkZWZhdWx0ID0gdGhpcy4kZGVmYXVsdEZuO1xuICAvKipcbiAgICogQWRkcyBhIGR5bmFtaWMgdXBkYXRlIHZhbHVlIHRvIHRoZSBjb2x1bW4uXG4gICAqIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByb3cgaXMgdXBkYXRlZCwgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbHVtbiB2YWx1ZSBpZiBub25lIGlzIHByb3ZpZGVkLlxuICAgKiBJZiBubyBgZGVmYXVsdGAgKG9yIGAkZGVmYXVsdEZuYCkgdmFsdWUgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByb3cgaXMgaW5zZXJ0ZWQgYXMgd2VsbCwgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbHVtbiB2YWx1ZS5cbiAgICpcbiAgICogKipOb3RlOioqIFRoaXMgdmFsdWUgZG9lcyBub3QgYWZmZWN0IHRoZSBgZHJpenpsZS1raXRgIGJlaGF2aW9yLCBpdCBpcyBvbmx5IHVzZWQgYXQgcnVudGltZSBpbiBgZHJpenpsZS1vcm1gLlxuICAgKi9cbiAgJG9uVXBkYXRlRm4oZm4pIHtcbiAgICB0aGlzLmNvbmZpZy5vblVwZGF0ZUZuID0gZm47XG4gICAgdGhpcy5jb25maWcuaGFzRGVmYXVsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFsaWFzIGZvciB7QGxpbmsgJG9uVXBkYXRlRm59LlxuICAgKi9cbiAgJG9uVXBkYXRlID0gdGhpcy4kb25VcGRhdGVGbjtcbiAgLyoqXG4gICAqIEFkZHMgYSBgcHJpbWFyeSBrZXlgIGNsYXVzZSB0byB0aGUgY29sdW1uIGRlZmluaXRpb24uIFRoaXMgaW1wbGljaXRseSBtYWtlcyB0aGUgY29sdW1uIGBub3QgbnVsbGAuXG4gICAqXG4gICAqIEluIFNRTGl0ZSwgYGludGVnZXIgcHJpbWFyeSBrZXlgIGltcGxpY2l0bHkgbWFrZXMgdGhlIGNvbHVtbiBhdXRvLWluY3JlbWVudGluZy5cbiAgICovXG4gIHByaW1hcnlLZXkoKSB7XG4gICAgdGhpcy5jb25maWcucHJpbWFyeUtleSA9IHRydWU7XG4gICAgdGhpcy5jb25maWcubm90TnVsbCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCBTZXRzIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdGhlIGtleSB3aXRoaW4gdGhlIHRhYmxlIGRlZmluaXRpb24gaWYgYSBuYW1lIHdhcyBub3QgZ2l2ZW4uICovXG4gIHNldE5hbWUobmFtZSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5uYW1lICE9PSBcIlwiKSByZXR1cm47XG4gICAgdGhpcy5jb25maWcubmFtZSA9IG5hbWU7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIENvbHVtbkJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb2x1bW4tYnVpbGRlci5qcy5tYXAiLAogICAgImNvbnN0IFRhYmxlTmFtZSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOk5hbWVcIik7XG5leHBvcnQge1xuICBUYWJsZU5hbWVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWJsZS51dGlscy5qcy5tYXAiLAogICAgImZ1bmN0aW9uIGlpZmUoZm4sIC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xufVxuZXhwb3J0IHtcbiAgaWlmZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNpbmctdXRpbHMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGVOYW1lIH0gZnJvbSBcIi4uL3RhYmxlLnV0aWxzLmpzXCI7XG5mdW5jdGlvbiB1bmlxdWUobmFtZSkge1xuICByZXR1cm4gbmV3IFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIobmFtZSk7XG59XG5mdW5jdGlvbiB1bmlxdWVLZXlOYW1lKHRhYmxlLCBjb2x1bW5zKSB7XG4gIHJldHVybiBgJHt0YWJsZVtUYWJsZU5hbWVdfV8ke2NvbHVtbnMuam9pbihcIl9cIil9X3VuaXF1ZWA7XG59XG5jbGFzcyBVbmlxdWVDb25zdHJhaW50QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbHVtbnMsIG5hbWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdVbmlxdWVDb25zdHJhaW50QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbHVtbnM7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbnVsbHNOb3REaXN0aW5jdENvbmZpZyA9IGZhbHNlO1xuICBudWxsc05vdERpc3RpbmN0KCkge1xuICAgIHRoaXMubnVsbHNOb3REaXN0aW5jdENvbmZpZyA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludCh0YWJsZSwgdGhpcy5jb2x1bW5zLCB0aGlzLm51bGxzTm90RGlzdGluY3RDb25maWcsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1VuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBuYW1lO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuICBvbiguLi5jb2x1bW5zKSB7XG4gICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50QnVpbGRlcihjb2x1bW5zLCB0aGlzLm5hbWUpO1xuICB9XG59XG5jbGFzcyBVbmlxdWVDb25zdHJhaW50IHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbHVtbnMsIG51bGxzTm90RGlzdGluY3QsIG5hbWUpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICB0aGlzLm5hbWUgPSBuYW1lID8/IHVuaXF1ZUtleU5hbWUodGhpcy50YWJsZSwgdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSkpO1xuICAgIHRoaXMubnVsbHNOb3REaXN0aW5jdCA9IG51bGxzTm90RGlzdGluY3Q7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdVbmlxdWVDb25zdHJhaW50XCI7XG4gIGNvbHVtbnM7XG4gIG5hbWU7XG4gIG51bGxzTm90RGlzdGluY3QgPSBmYWxzZTtcbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG59XG5leHBvcnQge1xuICBVbmlxdWVDb25zdHJhaW50LFxuICBVbmlxdWVDb25zdHJhaW50QnVpbGRlcixcbiAgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlcixcbiAgdW5pcXVlLFxuICB1bmlxdWVLZXlOYW1lXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5pcXVlLWNvbnN0cmFpbnQuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4uLy4uL2NvbHVtbi1idWlsZGVyLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi4vLi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IEZvcmVpZ25LZXlCdWlsZGVyIH0gZnJvbSBcIi4uL2ZvcmVpZ24ta2V5cy5qc1wiO1xuaW1wb3J0IHsgaWlmZSB9IGZyb20gXCIuLi8uLi90cmFjaW5nLXV0aWxzLmpzXCI7XG5pbXBvcnQgeyB1bmlxdWVLZXlOYW1lIH0gZnJvbSBcIi4uL3VuaXF1ZS1jb25zdHJhaW50LmpzXCI7XG5pbXBvcnQgeyBtYWtlUGdBcnJheSwgcGFyc2VQZ0FycmF5IH0gZnJvbSBcIi4uL3V0aWxzL2FycmF5LmpzXCI7XG5jbGFzcyBQZ0NvbHVtbkJ1aWxkZXIgZXh0ZW5kcyBDb2x1bW5CdWlsZGVyIHtcbiAgZm9yZWlnbktleUNvbmZpZ3MgPSBbXTtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdDb2x1bW5CdWlsZGVyXCI7XG4gIGFycmF5KHNpemUpIHtcbiAgICByZXR1cm4gbmV3IFBnQXJyYXlCdWlsZGVyKHRoaXMuY29uZmlnLm5hbWUsIHRoaXMsIHNpemUpO1xuICB9XG4gIHJlZmVyZW5jZXMocmVmLCBhY3Rpb25zID0ge30pIHtcbiAgICB0aGlzLmZvcmVpZ25LZXlDb25maWdzLnB1c2goeyByZWYsIGFjdGlvbnMgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdW5pcXVlKG5hbWUsIGNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnLmlzVW5pcXVlID0gdHJ1ZTtcbiAgICB0aGlzLmNvbmZpZy51bmlxdWVOYW1lID0gbmFtZTtcbiAgICB0aGlzLmNvbmZpZy51bmlxdWVUeXBlID0gY29uZmlnPy5udWxscztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZW5lcmF0ZWRBbHdheXNBcyhhcykge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZCA9IHtcbiAgICAgIGFzLFxuICAgICAgdHlwZTogXCJhbHdheXNcIixcbiAgICAgIG1vZGU6IFwic3RvcmVkXCJcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGRGb3JlaWduS2V5cyhjb2x1bW4sIHRhYmxlKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yZWlnbktleUNvbmZpZ3MubWFwKCh7IHJlZiwgYWN0aW9ucyB9KSA9PiB7XG4gICAgICByZXR1cm4gaWlmZShcbiAgICAgICAgKHJlZjIsIGFjdGlvbnMyKSA9PiB7XG4gICAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBGb3JlaWduS2V5QnVpbGRlcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3JlaWduQ29sdW1uID0gcmVmMigpO1xuICAgICAgICAgICAgcmV0dXJuIHsgY29sdW1uczogW2NvbHVtbl0sIGZvcmVpZ25Db2x1bW5zOiBbZm9yZWlnbkNvbHVtbl0gfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoYWN0aW9uczIub25VcGRhdGUpIHtcbiAgICAgICAgICAgIGJ1aWxkZXIub25VcGRhdGUoYWN0aW9uczIub25VcGRhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYWN0aW9uczIub25EZWxldGUpIHtcbiAgICAgICAgICAgIGJ1aWxkZXIub25EZWxldGUoYWN0aW9uczIub25EZWxldGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCh0YWJsZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZixcbiAgICAgICAgYWN0aW9uc1xuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkRXh0cmFDb25maWdDb2x1bW4odGFibGUpIHtcbiAgICByZXR1cm4gbmV3IEV4dHJhQ29uZmlnQ29sdW1uKHRhYmxlLCB0aGlzLmNvbmZpZyk7XG4gIH1cbn1cbmNsYXNzIFBnQ29sdW1uIGV4dGVuZHMgQ29sdW1uIHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIGlmICghY29uZmlnLnVuaXF1ZU5hbWUpIHtcbiAgICAgIGNvbmZpZy51bmlxdWVOYW1lID0gdW5pcXVlS2V5TmFtZSh0YWJsZSwgW2NvbmZpZy5uYW1lXSk7XG4gICAgfVxuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0NvbHVtblwiO1xufVxuY2xhc3MgRXh0cmFDb25maWdDb2x1bW4gZXh0ZW5kcyBQZ0NvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkV4dHJhQ29uZmlnQ29sdW1uXCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U1FMVHlwZSgpO1xuICB9XG4gIGluZGV4Q29uZmlnID0ge1xuICAgIG9yZGVyOiB0aGlzLmNvbmZpZy5vcmRlciA/PyBcImFzY1wiLFxuICAgIG51bGxzOiB0aGlzLmNvbmZpZy5udWxscyA/PyBcImxhc3RcIixcbiAgICBvcENsYXNzOiB0aGlzLmNvbmZpZy5vcENsYXNzXG4gIH07XG4gIGRlZmF1bHRDb25maWcgPSB7XG4gICAgb3JkZXI6IFwiYXNjXCIsXG4gICAgbnVsbHM6IFwibGFzdFwiLFxuICAgIG9wQ2xhc3M6IHZvaWQgMFxuICB9O1xuICBhc2MoKSB7XG4gICAgdGhpcy5pbmRleENvbmZpZy5vcmRlciA9IFwiYXNjXCI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZGVzYygpIHtcbiAgICB0aGlzLmluZGV4Q29uZmlnLm9yZGVyID0gXCJkZXNjXCI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgbnVsbHNGaXJzdCgpIHtcbiAgICB0aGlzLmluZGV4Q29uZmlnLm51bGxzID0gXCJmaXJzdFwiO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG51bGxzTGFzdCgpIHtcbiAgICB0aGlzLmluZGV4Q29uZmlnLm51bGxzID0gXCJsYXN0XCI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqICMjIyBQb3N0Z3JlU1FMIGRvY3VtZW50YXRpb24gcXVvdGVcbiAgICpcbiAgICogPiBBbiBvcGVyYXRvciBjbGFzcyB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnMgY2FuIGJlIHNwZWNpZmllZCBmb3IgZWFjaCBjb2x1bW4gb2YgYW4gaW5kZXguXG4gICAqIFRoZSBvcGVyYXRvciBjbGFzcyBpZGVudGlmaWVzIHRoZSBvcGVyYXRvcnMgdG8gYmUgdXNlZCBieSB0aGUgaW5kZXggZm9yIHRoYXQgY29sdW1uLlxuICAgKiBGb3IgZXhhbXBsZSwgYSBCLXRyZWUgaW5kZXggb24gZm91ci1ieXRlIGludGVnZXJzIHdvdWxkIHVzZSB0aGUgaW50NF9vcHMgY2xhc3M7XG4gICAqIHRoaXMgb3BlcmF0b3IgY2xhc3MgaW5jbHVkZXMgY29tcGFyaXNvbiBmdW5jdGlvbnMgZm9yIGZvdXItYnl0ZSBpbnRlZ2Vycy5cbiAgICogSW4gcHJhY3RpY2UgdGhlIGRlZmF1bHQgb3BlcmF0b3IgY2xhc3MgZm9yIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUgaXMgdXN1YWxseSBzdWZmaWNpZW50LlxuICAgKiBUaGUgbWFpbiBwb2ludCBvZiBoYXZpbmcgb3BlcmF0b3IgY2xhc3NlcyBpcyB0aGF0IGZvciBzb21lIGRhdGEgdHlwZXMsIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgbWVhbmluZ2Z1bCBvcmRlcmluZy5cbiAgICogRm9yIGV4YW1wbGUsIHdlIG1pZ2h0IHdhbnQgdG8gc29ydCBhIGNvbXBsZXgtbnVtYmVyIGRhdGEgdHlwZSBlaXRoZXIgYnkgYWJzb2x1dGUgdmFsdWUgb3IgYnkgcmVhbCBwYXJ0LlxuICAgKiBXZSBjb3VsZCBkbyB0aGlzIGJ5IGRlZmluaW5nIHR3byBvcGVyYXRvciBjbGFzc2VzIGZvciB0aGUgZGF0YSB0eXBlIGFuZCB0aGVuIHNlbGVjdGluZyB0aGUgcHJvcGVyIGNsYXNzIHdoZW4gY3JlYXRpbmcgYW4gaW5kZXguXG4gICAqIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3BlcmF0b3IgY2xhc3NlcyBjaGVjazpcbiAgICpcbiAgICogIyMjIFVzZWZ1bCBsaW5rc1xuICAgKiBodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzL2N1cnJlbnQvc3FsLWNyZWF0ZWluZGV4Lmh0bWxcbiAgICpcbiAgICogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy9jdXJyZW50L2luZGV4ZXMtb3BjbGFzcy5odG1sXG4gICAqXG4gICAqIGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC94aW5kZXguaHRtbFxuICAgKlxuICAgKiAjIyMgQWRkaXRpb25hbCB0eXBlc1xuICAgKiBJZiB5b3UgaGF2ZSB0aGUgYHBnX3ZlY3RvcmAgZXh0ZW5zaW9uIGluc3RhbGxlZCBpbiB5b3VyIGRhdGFiYXNlLCB5b3UgY2FuIHVzZSB0aGVcbiAgICogYHZlY3Rvcl9sMl9vcHNgLCBgdmVjdG9yX2lwX29wc2AsIGB2ZWN0b3JfY29zaW5lX29wc2AsIGB2ZWN0b3JfbDFfb3BzYCwgYGJpdF9oYW1taW5nX29wc2AsIGBiaXRfamFjY2FyZF9vcHNgLCBgaGFsZnZlY19sMl9vcHNgLCBgc3BhcnNldmVjX2wyX29wc2Agb3B0aW9ucywgd2hpY2ggYXJlIHByZWRlZmluZWQgdHlwZXMuXG4gICAqXG4gICAqICoqWW91IGNhbiBhbHdheXMgc3BlY2lmeSBhbnkgc3RyaW5nIHlvdSB3YW50IGluIHRoZSBvcGVyYXRvciBjbGFzcywgaW4gY2FzZSBEcml6emxlIGRvZXNuJ3QgaGF2ZSBpdCBuYXRpdmVseSBpbiBpdHMgdHlwZXMqKlxuICAgKlxuICAgKiBAcGFyYW0gb3BDbGFzc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgb3Aob3BDbGFzcykge1xuICAgIHRoaXMuaW5kZXhDb25maWcub3BDbGFzcyA9IG9wQ2xhc3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmNsYXNzIEluZGV4ZWRDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJJbmRleGVkQ29sdW1uXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGtleUFzTmFtZSwgdHlwZSwgaW5kZXhDb25maWcpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMua2V5QXNOYW1lID0ga2V5QXNOYW1lO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5pbmRleENvbmZpZyA9IGluZGV4Q29uZmlnO1xuICB9XG4gIG5hbWU7XG4gIGtleUFzTmFtZTtcbiAgdHlwZTtcbiAgaW5kZXhDb25maWc7XG59XG5jbGFzcyBQZ0FycmF5QnVpbGRlciBleHRlbmRzIFBnQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnQXJyYXlCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGJhc2VCdWlsZGVyLCBzaXplKSB7XG4gICAgc3VwZXIobmFtZSwgXCJhcnJheVwiLCBcIlBnQXJyYXlcIik7XG4gICAgdGhpcy5jb25maWcuYmFzZUJ1aWxkZXIgPSBiYXNlQnVpbGRlcjtcbiAgICB0aGlzLmNvbmZpZy5zaXplID0gc2l6ZTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgY29uc3QgYmFzZUNvbHVtbiA9IHRoaXMuY29uZmlnLmJhc2VCdWlsZGVyLmJ1aWxkKHRhYmxlKTtcbiAgICByZXR1cm4gbmV3IFBnQXJyYXkoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgYmFzZUNvbHVtblxuICAgICk7XG4gIH1cbn1cbmNsYXNzIFBnQXJyYXkgZXh0ZW5kcyBQZ0NvbHVtbiB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcsIGJhc2VDb2x1bW4sIHJhbmdlKSB7XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy5iYXNlQ29sdW1uID0gYmFzZUNvbHVtbjtcbiAgICB0aGlzLnJhbmdlID0gcmFuZ2U7XG4gICAgdGhpcy5zaXplID0gY29uZmlnLnNpemU7XG4gIH1cbiAgc2l6ZTtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdBcnJheVwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmJhc2VDb2x1bW4uZ2V0U1FMVHlwZSgpfVske3R5cGVvZiB0aGlzLnNpemUgPT09IFwibnVtYmVyXCIgPyB0aGlzLnNpemUgOiBcIlwifV1gO1xuICB9XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhbHVlID0gcGFyc2VQZ0FycmF5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLm1hcCgodikgPT4gdGhpcy5iYXNlQ29sdW1uLm1hcEZyb21Ecml2ZXJWYWx1ZSh2KSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSwgaXNOZXN0ZWRBcnJheSA9IGZhbHNlKSB7XG4gICAgY29uc3QgYSA9IHZhbHVlLm1hcChcbiAgICAgICh2KSA9PiB2ID09PSBudWxsID8gbnVsbCA6IGlzKHRoaXMuYmFzZUNvbHVtbiwgUGdBcnJheSkgPyB0aGlzLmJhc2VDb2x1bW4ubWFwVG9Ecml2ZXJWYWx1ZSh2LCB0cnVlKSA6IHRoaXMuYmFzZUNvbHVtbi5tYXBUb0RyaXZlclZhbHVlKHYpXG4gICAgKTtcbiAgICBpZiAoaXNOZXN0ZWRBcnJheSkgcmV0dXJuIGE7XG4gICAgcmV0dXJuIG1ha2VQZ0FycmF5KGEpO1xuICB9XG59XG5leHBvcnQge1xuICBFeHRyYUNvbmZpZ0NvbHVtbixcbiAgSW5kZXhlZENvbHVtbixcbiAgUGdBcnJheSxcbiAgUGdBcnJheUJ1aWxkZXIsXG4gIFBnQ29sdW1uLFxuICBQZ0NvbHVtbkJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21tb24uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUGdDb2x1bW4sIFBnQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgUGdFbnVtT2JqZWN0Q29sdW1uQnVpbGRlciBleHRlbmRzIFBnQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnRW51bU9iamVjdENvbHVtbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgZW51bUluc3RhbmNlKSB7XG4gICAgc3VwZXIobmFtZSwgXCJzdHJpbmdcIiwgXCJQZ0VudW1PYmplY3RDb2x1bW5cIik7XG4gICAgdGhpcy5jb25maWcuZW51bSA9IGVudW1JbnN0YW5jZTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBQZ0VudW1PYmplY3RDb2x1bW4oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgUGdFbnVtT2JqZWN0Q29sdW1uIGV4dGVuZHMgUGdDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0VudW1PYmplY3RDb2x1bW5cIjtcbiAgZW51bTtcbiAgZW51bVZhbHVlcyA9IHRoaXMuY29uZmlnLmVudW0uZW51bVZhbHVlcztcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMuZW51bSA9IGNvbmZpZy5lbnVtO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW51bS5lbnVtTmFtZTtcbiAgfVxufVxuY29uc3QgaXNQZ0VudW1TeW0gPSBTeW1ib2wuZm9yKFwiZHJpenpsZTppc1BnRW51bVwiKTtcbmZ1bmN0aW9uIGlzUGdFbnVtKG9iaikge1xuICByZXR1cm4gISFvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiICYmIGlzUGdFbnVtU3ltIGluIG9iaiAmJiBvYmpbaXNQZ0VudW1TeW1dID09PSB0cnVlO1xufVxuY2xhc3MgUGdFbnVtQ29sdW1uQnVpbGRlciBleHRlbmRzIFBnQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnRW51bUNvbHVtbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgZW51bUluc3RhbmNlKSB7XG4gICAgc3VwZXIobmFtZSwgXCJzdHJpbmdcIiwgXCJQZ0VudW1Db2x1bW5cIik7XG4gICAgdGhpcy5jb25maWcuZW51bSA9IGVudW1JbnN0YW5jZTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBQZ0VudW1Db2x1bW4oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgUGdFbnVtQ29sdW1uIGV4dGVuZHMgUGdDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0VudW1Db2x1bW5cIjtcbiAgZW51bSA9IHRoaXMuY29uZmlnLmVudW07XG4gIGVudW1WYWx1ZXMgPSB0aGlzLmNvbmZpZy5lbnVtLmVudW1WYWx1ZXM7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLmVudW0gPSBjb25maWcuZW51bTtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmVudW0uZW51bU5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHBnRW51bShlbnVtTmFtZSwgaW5wdXQpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpID8gcGdFbnVtV2l0aFNjaGVtYShlbnVtTmFtZSwgWy4uLmlucHV0XSwgdm9pZCAwKSA6IHBnRW51bU9iamVjdFdpdGhTY2hlbWEoZW51bU5hbWUsIGlucHV0LCB2b2lkIDApO1xufVxuZnVuY3Rpb24gcGdFbnVtV2l0aFNjaGVtYShlbnVtTmFtZSwgdmFsdWVzLCBzY2hlbWEpIHtcbiAgY29uc3QgZW51bUluc3RhbmNlID0gT2JqZWN0LmFzc2lnbihcbiAgICAobmFtZSkgPT4gbmV3IFBnRW51bUNvbHVtbkJ1aWxkZXIobmFtZSA/PyBcIlwiLCBlbnVtSW5zdGFuY2UpLFxuICAgIHtcbiAgICAgIGVudW1OYW1lLFxuICAgICAgZW51bVZhbHVlczogdmFsdWVzLFxuICAgICAgc2NoZW1hLFxuICAgICAgW2lzUGdFbnVtU3ltXTogdHJ1ZVxuICAgIH1cbiAgKTtcbiAgcmV0dXJuIGVudW1JbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHBnRW51bU9iamVjdFdpdGhTY2hlbWEoZW51bU5hbWUsIHZhbHVlcywgc2NoZW1hKSB7XG4gIGNvbnN0IGVudW1JbnN0YW5jZSA9IE9iamVjdC5hc3NpZ24oXG4gICAgKG5hbWUpID0+IG5ldyBQZ0VudW1PYmplY3RDb2x1bW5CdWlsZGVyKG5hbWUgPz8gXCJcIiwgZW51bUluc3RhbmNlKSxcbiAgICB7XG4gICAgICBlbnVtTmFtZSxcbiAgICAgIGVudW1WYWx1ZXM6IE9iamVjdC52YWx1ZXModmFsdWVzKSxcbiAgICAgIHNjaGVtYSxcbiAgICAgIFtpc1BnRW51bVN5bV06IHRydWVcbiAgICB9XG4gICk7XG4gIHJldHVybiBlbnVtSW5zdGFuY2U7XG59XG5leHBvcnQge1xuICBQZ0VudW1Db2x1bW4sXG4gIFBnRW51bUNvbHVtbkJ1aWxkZXIsXG4gIFBnRW51bU9iamVjdENvbHVtbixcbiAgUGdFbnVtT2JqZWN0Q29sdW1uQnVpbGRlcixcbiAgaXNQZ0VudW0sXG4gIHBnRW51bSxcbiAgcGdFbnVtT2JqZWN0V2l0aFNjaGVtYSxcbiAgcGdFbnVtV2l0aFNjaGVtYVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVudW0uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBTdWJxdWVyeSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlN1YnF1ZXJ5XCI7XG4gIGNvbnN0cnVjdG9yKHNxbCwgZmllbGRzLCBhbGlhcywgaXNXaXRoID0gZmFsc2UsIHVzZWRUYWJsZXMgPSBbXSkge1xuICAgIHRoaXMuXyA9IHtcbiAgICAgIGJyYW5kOiBcIlN1YnF1ZXJ5XCIsXG4gICAgICBzcWwsXG4gICAgICBzZWxlY3RlZEZpZWxkczogZmllbGRzLFxuICAgICAgYWxpYXMsXG4gICAgICBpc1dpdGgsXG4gICAgICB1c2VkVGFibGVzXG4gICAgfTtcbiAgfVxuICAvLyBnZXRTUUwoKTogU1FMPHVua25vd24+IHtcbiAgLy8gXHRyZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICAvLyB9XG59XG5jbGFzcyBXaXRoU3VicXVlcnkgZXh0ZW5kcyBTdWJxdWVyeSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIldpdGhTdWJxdWVyeVwiO1xufVxuZXhwb3J0IHtcbiAgU3VicXVlcnksXG4gIFdpdGhTdWJxdWVyeVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1YnF1ZXJ5LmpzLm1hcCIsCiAgICAiLy8gcGFja2FnZS5qc29uXG52YXIgdmVyc2lvbiA9IFwiMC40NC41XCI7XG5cbi8vIHNyYy92ZXJzaW9uLnRzXG52YXIgY29tcGF0aWJpbGl0eVZlcnNpb24gPSAxMDtcbmV4cG9ydCB7XG4gIGNvbXBhdGliaWxpdHlWZXJzaW9uLFxuICB2ZXJzaW9uIGFzIG5wbVZlcnNpb25cbn07XG4iLAogICAgImltcG9ydCB7IGlpZmUgfSBmcm9tIFwiLi90cmFjaW5nLXV0aWxzLmpzXCI7XG5pbXBvcnQgeyBucG1WZXJzaW9uIH0gZnJvbSBcIi4vdmVyc2lvbi5qc1wiO1xubGV0IG90ZWw7XG5sZXQgcmF3VHJhY2VyO1xuY29uc3QgdHJhY2VyID0ge1xuICBzdGFydEFjdGl2ZVNwYW4obmFtZSwgZm4pIHtcbiAgICBpZiAoIW90ZWwpIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cbiAgICBpZiAoIXJhd1RyYWNlcikge1xuICAgICAgcmF3VHJhY2VyID0gb3RlbC50cmFjZS5nZXRUcmFjZXIoXCJkcml6emxlLW9ybVwiLCBucG1WZXJzaW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGlpZmUoXG4gICAgICAob3RlbDIsIHJhd1RyYWNlcjIpID0+IHJhd1RyYWNlcjIuc3RhcnRBY3RpdmVTcGFuKFxuICAgICAgICBuYW1lLFxuICAgICAgICAoc3BhbikgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZm4oc3Bhbik7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICBjb2RlOiBvdGVsMi5TcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCJcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1pbnN0YW5jZW9mL25vLWluc3RhbmNlb2ZcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBvdGVsLFxuICAgICAgcmF3VHJhY2VyXG4gICAgKTtcbiAgfVxufTtcbmV4cG9ydCB7XG4gIHRyYWNlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNpbmcuanMubWFwIiwKICAgICJjb25zdCBWaWV3QmFzZUNvbmZpZyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOlZpZXdCYXNlQ29uZmlnXCIpO1xuZXhwb3J0IHtcbiAgVmlld0Jhc2VDb25maWdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD12aWV3LWNvbW1vbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlTmFtZSB9IGZyb20gXCIuL3RhYmxlLnV0aWxzLmpzXCI7XG5jb25zdCBTY2hlbWEgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpTY2hlbWFcIik7XG5jb25zdCBDb2x1bW5zID0gU3ltYm9sLmZvcihcImRyaXp6bGU6Q29sdW1uc1wiKTtcbmNvbnN0IEV4dHJhQ29uZmlnQ29sdW1ucyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOkV4dHJhQ29uZmlnQ29sdW1uc1wiKTtcbmNvbnN0IE9yaWdpbmFsTmFtZSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOk9yaWdpbmFsTmFtZVwiKTtcbmNvbnN0IEJhc2VOYW1lID0gU3ltYm9sLmZvcihcImRyaXp6bGU6QmFzZU5hbWVcIik7XG5jb25zdCBJc0FsaWFzID0gU3ltYm9sLmZvcihcImRyaXp6bGU6SXNBbGlhc1wiKTtcbmNvbnN0IEV4dHJhQ29uZmlnQnVpbGRlciA9IFN5bWJvbC5mb3IoXCJkcml6emxlOkV4dHJhQ29uZmlnQnVpbGRlclwiKTtcbmNvbnN0IElzRHJpenpsZVRhYmxlID0gU3ltYm9sLmZvcihcImRyaXp6bGU6SXNEcml6emxlVGFibGVcIik7XG5jbGFzcyBUYWJsZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlRhYmxlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIFN5bWJvbCA9IHtcbiAgICBOYW1lOiBUYWJsZU5hbWUsXG4gICAgU2NoZW1hLFxuICAgIE9yaWdpbmFsTmFtZSxcbiAgICBDb2x1bW5zLFxuICAgIEV4dHJhQ29uZmlnQ29sdW1ucyxcbiAgICBCYXNlTmFtZSxcbiAgICBJc0FsaWFzLFxuICAgIEV4dHJhQ29uZmlnQnVpbGRlclxuICB9O1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIENhbiBiZSBjaGFuZ2VkIGlmIHRoZSB0YWJsZSBpcyBhbGlhc2VkLlxuICAgKi9cbiAgW1RhYmxlTmFtZV07XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogVXNlZCB0byBzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBvZiB0aGUgdGFibGUsIGJlZm9yZSBhbnkgYWxpYXNpbmcuXG4gICAqL1xuICBbT3JpZ2luYWxOYW1lXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbU2NoZW1hXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbQ29sdW1uc107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0V4dHJhQ29uZmlnQ29sdW1uc107XG4gIC8qKlxuICAgKiAgQGludGVybmFsXG4gICAqIFVzZWQgdG8gc3RvcmUgdGhlIHRhYmxlIG5hbWUgYmVmb3JlIHRoZSB0cmFuc2Zvcm1hdGlvbiB2aWEgdGhlIGB0YWJsZUNyZWF0b3JgIGZ1bmN0aW9ucy5cbiAgICovXG4gIFtCYXNlTmFtZV07XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0lzQWxpYXNdID0gZmFsc2U7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0lzRHJpenpsZVRhYmxlXSA9IHRydWU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0V4dHJhQ29uZmlnQnVpbGRlcl0gPSB2b2lkIDA7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIHNjaGVtYSwgYmFzZU5hbWUpIHtcbiAgICB0aGlzW1RhYmxlTmFtZV0gPSB0aGlzW09yaWdpbmFsTmFtZV0gPSBuYW1lO1xuICAgIHRoaXNbU2NoZW1hXSA9IHNjaGVtYTtcbiAgICB0aGlzW0Jhc2VOYW1lXSA9IGJhc2VOYW1lO1xuICB9XG59XG5mdW5jdGlvbiBpc1RhYmxlKHRhYmxlKSB7XG4gIHJldHVybiB0eXBlb2YgdGFibGUgPT09IFwib2JqZWN0XCIgJiYgdGFibGUgIT09IG51bGwgJiYgSXNEcml6emxlVGFibGUgaW4gdGFibGU7XG59XG5mdW5jdGlvbiBnZXRUYWJsZU5hbWUodGFibGUpIHtcbiAgcmV0dXJuIHRhYmxlW1RhYmxlTmFtZV07XG59XG5mdW5jdGlvbiBnZXRUYWJsZVVuaXF1ZU5hbWUodGFibGUpIHtcbiAgcmV0dXJuIGAke3RhYmxlW1NjaGVtYV0gPz8gXCJwdWJsaWNcIn0uJHt0YWJsZVtUYWJsZU5hbWVdfWA7XG59XG5leHBvcnQge1xuICBCYXNlTmFtZSxcbiAgQ29sdW1ucyxcbiAgRXh0cmFDb25maWdCdWlsZGVyLFxuICBFeHRyYUNvbmZpZ0NvbHVtbnMsXG4gIElzQWxpYXMsXG4gIE9yaWdpbmFsTmFtZSxcbiAgU2NoZW1hLFxuICBUYWJsZSxcbiAgZ2V0VGFibGVOYW1lLFxuICBnZXRUYWJsZVVuaXF1ZU5hbWUsXG4gIGlzVGFibGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWJsZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgaXNQZ0VudW0gfSBmcm9tIFwiLi4vcGctY29yZS9jb2x1bW5zL2VudW0uanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyB0cmFjZXIgfSBmcm9tIFwiLi4vdHJhY2luZy5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IElzQWxpYXMsIFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5jbGFzcyBGYWtlUHJpbWl0aXZlUGFyYW0ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJGYWtlUHJpbWl0aXZlUGFyYW1cIjtcbn1cbmZ1bmN0aW9uIGlzU1FMV3JhcHBlcih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCAmJiB0eXBlb2YgdmFsdWUuZ2V0U1FMID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBtZXJnZVF1ZXJpZXMocXVlcmllcykge1xuICBjb25zdCByZXN1bHQgPSB7IHNxbDogXCJcIiwgcGFyYW1zOiBbXSB9O1xuICBmb3IgKGNvbnN0IHF1ZXJ5IG9mIHF1ZXJpZXMpIHtcbiAgICByZXN1bHQuc3FsICs9IHF1ZXJ5LnNxbDtcbiAgICByZXN1bHQucGFyYW1zLnB1c2goLi4ucXVlcnkucGFyYW1zKTtcbiAgICBpZiAocXVlcnkudHlwaW5ncz8ubGVuZ3RoKSB7XG4gICAgICBpZiAoIXJlc3VsdC50eXBpbmdzKSB7XG4gICAgICAgIHJlc3VsdC50eXBpbmdzID0gW107XG4gICAgICB9XG4gICAgICByZXN1bHQudHlwaW5ncy5wdXNoKC4uLnF1ZXJ5LnR5cGluZ3MpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuY2xhc3MgU3RyaW5nQ2h1bmsge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTdHJpbmdDaHVua1wiO1xuICB2YWx1ZTtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gIH1cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIH1cbn1cbmNsYXNzIFNRTCB7XG4gIGNvbnN0cnVjdG9yKHF1ZXJ5Q2h1bmtzKSB7XG4gICAgdGhpcy5xdWVyeUNodW5rcyA9IHF1ZXJ5Q2h1bmtzO1xuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgcXVlcnlDaHVua3MpIHtcbiAgICAgIGlmIChpcyhjaHVuaywgVGFibGUpKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBjaHVua1tUYWJsZS5TeW1ib2wuU2NoZW1hXTtcbiAgICAgICAgdGhpcy51c2VkVGFibGVzLnB1c2goXG4gICAgICAgICAgc2NoZW1hTmFtZSA9PT0gdm9pZCAwID8gY2h1bmtbVGFibGUuU3ltYm9sLk5hbWVdIDogc2NoZW1hTmFtZSArIFwiLlwiICsgY2h1bmtbVGFibGUuU3ltYm9sLk5hbWVdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTFwiO1xuICAvKiogQGludGVybmFsICovXG4gIGRlY29kZXIgPSBub29wRGVjb2RlcjtcbiAgc2hvdWxkSW5saW5lUGFyYW1zID0gZmFsc2U7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgdXNlZFRhYmxlcyA9IFtdO1xuICBhcHBlbmQocXVlcnkpIHtcbiAgICB0aGlzLnF1ZXJ5Q2h1bmtzLnB1c2goLi4ucXVlcnkucXVlcnlDaHVua3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRvUXVlcnkoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRyYWNlci5zdGFydEFjdGl2ZVNwYW4oXCJkcml6emxlLmJ1aWxkU1FMXCIsIChzcGFuKSA9PiB7XG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXModGhpcy5xdWVyeUNodW5rcywgY29uZmlnKTtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICBcImRyaXp6bGUucXVlcnkudGV4dFwiOiBxdWVyeS5zcWwsXG4gICAgICAgIFwiZHJpenpsZS5xdWVyeS5wYXJhbXNcIjogSlNPTi5zdHJpbmdpZnkocXVlcnkucGFyYW1zKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcXVlcnk7XG4gICAgfSk7XG4gIH1cbiAgYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoY2h1bmtzLCBfY29uZmlnKSB7XG4gICAgY29uc3QgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgX2NvbmZpZywge1xuICAgICAgaW5saW5lUGFyYW1zOiBfY29uZmlnLmlubGluZVBhcmFtcyB8fCB0aGlzLnNob3VsZElubGluZVBhcmFtcyxcbiAgICAgIHBhcmFtU3RhcnRJbmRleDogX2NvbmZpZy5wYXJhbVN0YXJ0SW5kZXggfHwgeyB2YWx1ZTogMCB9XG4gICAgfSk7XG4gICAgY29uc3Qge1xuICAgICAgY2FzaW5nLFxuICAgICAgZXNjYXBlTmFtZSxcbiAgICAgIGVzY2FwZVBhcmFtLFxuICAgICAgcHJlcGFyZVR5cGluZyxcbiAgICAgIGlubGluZVBhcmFtcyxcbiAgICAgIHBhcmFtU3RhcnRJbmRleFxuICAgIH0gPSBjb25maWc7XG4gICAgcmV0dXJuIG1lcmdlUXVlcmllcyhjaHVua3MubWFwKChjaHVuaykgPT4ge1xuICAgICAgaWYgKGlzKGNodW5rLCBTdHJpbmdDaHVuaykpIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiBjaHVuay52YWx1ZS5qb2luKFwiXCIpLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIE5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay52YWx1ZSksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIGlmIChjaHVuayA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogXCJcIiwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2h1bmspKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtuZXcgU3RyaW5nQ2h1bmsoXCIoXCIpXTtcbiAgICAgICAgZm9yIChjb25zdCBbaSwgcF0gb2YgY2h1bmsuZW50cmllcygpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2gocCk7XG4gICAgICAgICAgaWYgKGkgPCBjaHVuay5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChuZXcgU3RyaW5nQ2h1bmsoXCIsIFwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKG5ldyBTdHJpbmdDaHVuayhcIilcIikpO1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhyZXN1bHQsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFNRTCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoY2h1bmsucXVlcnlDaHVua3MsIHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgaW5saW5lUGFyYW1zOiBpbmxpbmVQYXJhbXMgfHwgY2h1bmsuc2hvdWxkSW5saW5lUGFyYW1zXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBUYWJsZSkpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGNodW5rW1RhYmxlLlN5bWJvbC5TY2hlbWFdO1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBjaHVua1tUYWJsZS5TeW1ib2wuTmFtZV07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3FsOiBzY2hlbWFOYW1lID09PSB2b2lkIDAgfHwgY2h1bmtbSXNBbGlhc10gPyBlc2NhcGVOYW1lKHRhYmxlTmFtZSkgOiBlc2NhcGVOYW1lKHNjaGVtYU5hbWUpICsgXCIuXCIgKyBlc2NhcGVOYW1lKHRhYmxlTmFtZSksXG4gICAgICAgICAgcGFyYW1zOiBbXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBDb2x1bW4pKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBjYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGNodW5rKTtcbiAgICAgICAgaWYgKF9jb25maWcuaW52b2tlU291cmNlID09PSBcImluZGV4ZXNcIikge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjb2x1bW5OYW1lKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBjaHVuay50YWJsZVtUYWJsZS5TeW1ib2wuU2NoZW1hXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcWw6IGNodW5rLnRhYmxlW0lzQWxpYXNdIHx8IHNjaGVtYU5hbWUgPT09IHZvaWQgMCA/IGVzY2FwZU5hbWUoY2h1bmsudGFibGVbVGFibGUuU3ltYm9sLk5hbWVdKSArIFwiLlwiICsgZXNjYXBlTmFtZShjb2x1bW5OYW1lKSA6IGVzY2FwZU5hbWUoc2NoZW1hTmFtZSkgKyBcIi5cIiArIGVzY2FwZU5hbWUoY2h1bmsudGFibGVbVGFibGUuU3ltYm9sLk5hbWVdKSArIFwiLlwiICsgZXNjYXBlTmFtZShjb2x1bW5OYW1lKSxcbiAgICAgICAgICBwYXJhbXM6IFtdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFZpZXcpKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBjaHVua1tWaWV3QmFzZUNvbmZpZ10uc2NoZW1hO1xuICAgICAgICBjb25zdCB2aWV3TmFtZSA9IGNodW5rW1ZpZXdCYXNlQ29uZmlnXS5uYW1lO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNxbDogc2NoZW1hTmFtZSA9PT0gdm9pZCAwIHx8IGNodW5rW1ZpZXdCYXNlQ29uZmlnXS5pc0FsaWFzID8gZXNjYXBlTmFtZSh2aWV3TmFtZSkgOiBlc2NhcGVOYW1lKHNjaGVtYU5hbWUpICsgXCIuXCIgKyBlc2NhcGVOYW1lKHZpZXdOYW1lKSxcbiAgICAgICAgICBwYXJhbXM6IFtdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFBhcmFtKSkge1xuICAgICAgICBpZiAoaXMoY2h1bmsudmFsdWUsIFBsYWNlaG9sZGVyKSkge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlUGFyYW0ocGFyYW1TdGFydEluZGV4LnZhbHVlKyssIGNodW5rKSwgcGFyYW1zOiBbY2h1bmtdLCB0eXBpbmdzOiBbXCJub25lXCJdIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBjaHVuay52YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBjaHVuay5lbmNvZGVyLm1hcFRvRHJpdmVyVmFsdWUoY2h1bmsudmFsdWUpO1xuICAgICAgICBpZiAoaXMobWFwcGVkVmFsdWUsIFNRTCkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhbbWFwcGVkVmFsdWVdLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmxpbmVQYXJhbXMpIHtcbiAgICAgICAgICByZXR1cm4geyBzcWw6IHRoaXMubWFwSW5saW5lUGFyYW0obWFwcGVkVmFsdWUsIGNvbmZpZyksIHBhcmFtczogW10gfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHlwaW5ncyA9IFtcIm5vbmVcIl07XG4gICAgICAgIGlmIChwcmVwYXJlVHlwaW5nKSB7XG4gICAgICAgICAgdHlwaW5ncyA9IFtwcmVwYXJlVHlwaW5nKGNodW5rLmVuY29kZXIpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZVBhcmFtKHBhcmFtU3RhcnRJbmRleC52YWx1ZSsrLCBtYXBwZWRWYWx1ZSksIHBhcmFtczogW21hcHBlZFZhbHVlXSwgdHlwaW5ncyB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBQbGFjZWhvbGRlcikpIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVQYXJhbShwYXJhbVN0YXJ0SW5kZXgudmFsdWUrKywgY2h1bmspLCBwYXJhbXM6IFtjaHVua10sIHR5cGluZ3M6IFtcIm5vbmVcIl0gfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgU1FMLkFsaWFzZWQpICYmIGNodW5rLmZpZWxkQWxpYXMgIT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY2h1bmsuZmllbGRBbGlhcyksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgU3VicXVlcnkpKSB7XG4gICAgICAgIGlmIChjaHVuay5fLmlzV2l0aCkge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay5fLmFsaWFzKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKFtcbiAgICAgICAgICBuZXcgU3RyaW5nQ2h1bmsoXCIoXCIpLFxuICAgICAgICAgIGNodW5rLl8uc3FsLFxuICAgICAgICAgIG5ldyBTdHJpbmdDaHVuayhcIikgXCIpLFxuICAgICAgICAgIG5ldyBOYW1lKGNodW5rLl8uYWxpYXMpXG4gICAgICAgIF0sIGNvbmZpZyk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQZ0VudW0oY2h1bmspKSB7XG4gICAgICAgIGlmIChjaHVuay5zY2hlbWEpIHtcbiAgICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY2h1bmsuc2NoZW1hKSArIFwiLlwiICsgZXNjYXBlTmFtZShjaHVuay5lbnVtTmFtZSksIHBhcmFtczogW10gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY2h1bmsuZW51bU5hbWUpLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAoaXNTUUxXcmFwcGVyKGNodW5rKSkge1xuICAgICAgICBpZiAoY2h1bmsuc2hvdWxkT21pdFNRTFBhcmVucz8uKCkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhbY2h1bmsuZ2V0U1FMKCldLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKFtcbiAgICAgICAgICBuZXcgU3RyaW5nQ2h1bmsoXCIoXCIpLFxuICAgICAgICAgIGNodW5rLmdldFNRTCgpLFxuICAgICAgICAgIG5ldyBTdHJpbmdDaHVuayhcIilcIilcbiAgICAgICAgXSwgY29uZmlnKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbmxpbmVQYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiB0aGlzLm1hcElubGluZVBhcmFtKGNodW5rLCBjb25maWcpLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBzcWw6IGVzY2FwZVBhcmFtKHBhcmFtU3RhcnRJbmRleC52YWx1ZSsrLCBjaHVuayksIHBhcmFtczogW2NodW5rXSwgdHlwaW5nczogW1wibm9uZVwiXSB9O1xuICAgIH0pKTtcbiAgfVxuICBtYXBJbmxpbmVQYXJhbShjaHVuaywgeyBlc2NhcGVTdHJpbmcgfSkge1xuICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiBjaHVuayA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBjaHVuay50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZXNjYXBlU3RyaW5nKGNodW5rKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWVBc1N0cmluZyA9IGNodW5rLnRvU3RyaW5nKCk7XG4gICAgICBpZiAobWFwcGVkVmFsdWVBc1N0cmluZyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgICAgICByZXR1cm4gZXNjYXBlU3RyaW5nKEpTT04uc3RyaW5naWZ5KGNodW5rKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXNjYXBlU3RyaW5nKG1hcHBlZFZhbHVlQXNTdHJpbmcpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIHBhcmFtIHZhbHVlOiBcIiArIGNodW5rKTtcbiAgfVxuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgYXMoYWxpYXMpIHtcbiAgICBpZiAoYWxpYXMgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU1FMLkFsaWFzZWQodGhpcywgYWxpYXMpO1xuICB9XG4gIG1hcFdpdGgoZGVjb2Rlcikge1xuICAgIHRoaXMuZGVjb2RlciA9IHR5cGVvZiBkZWNvZGVyID09PSBcImZ1bmN0aW9uXCIgPyB7IG1hcEZyb21Ecml2ZXJWYWx1ZTogZGVjb2RlciB9IDogZGVjb2RlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBpbmxpbmVQYXJhbXMoKSB7XG4gICAgdGhpcy5zaG91bGRJbmxpbmVQYXJhbXMgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgaW5jbHVkZSBhIHBhcnQgb2YgdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0gY29uZGl0aW9uIC0gQ29uZGl0aW9uIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIGl0c2VsZiBpZiB0aGUgY29uZGl0aW9uIGlzIGB0cnVlYCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgXG4gICAqL1xuICBpZihjb25kaXRpb24pIHtcbiAgICByZXR1cm4gY29uZGl0aW9uID8gdGhpcyA6IHZvaWQgMDtcbiAgfVxufVxuY2xhc3MgTmFtZSB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIk5hbWVcIjtcbiAgYnJhbmQ7XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICB9XG59XG5mdW5jdGlvbiBuYW1lKHZhbHVlKSB7XG4gIHJldHVybiBuZXcgTmFtZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiBpc0RyaXZlclZhbHVlRW5jb2Rlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIFwibWFwVG9Ecml2ZXJWYWx1ZVwiIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5tYXBUb0RyaXZlclZhbHVlID09PSBcImZ1bmN0aW9uXCI7XG59XG5jb25zdCBub29wRGVjb2RlciA9IHtcbiAgbWFwRnJvbURyaXZlclZhbHVlOiAodmFsdWUpID0+IHZhbHVlXG59O1xuY29uc3Qgbm9vcEVuY29kZXIgPSB7XG4gIG1hcFRvRHJpdmVyVmFsdWU6ICh2YWx1ZSkgPT4gdmFsdWVcbn07XG5jb25zdCBub29wTWFwcGVyID0ge1xuICAuLi5ub29wRGVjb2RlcixcbiAgLi4ubm9vcEVuY29kZXJcbn07XG5jbGFzcyBQYXJhbSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBQYXJhbWV0ZXIgdmFsdWVcbiAgICogQHBhcmFtIGVuY29kZXIgLSBFbmNvZGVyIHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgZHJpdmVyIHBhcmFtZXRlclxuICAgKi9cbiAgY29uc3RydWN0b3IodmFsdWUsIGVuY29kZXIgPSBub29wRW5jb2Rlcikge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmVuY29kZXIgPSBlbmNvZGVyO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBhcmFtXCI7XG4gIGJyYW5kO1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgfVxufVxuZnVuY3Rpb24gcGFyYW0odmFsdWUsIGVuY29kZXIpIHtcbiAgcmV0dXJuIG5ldyBQYXJhbSh2YWx1ZSwgZW5jb2Rlcik7XG59XG5mdW5jdGlvbiBzcWwoc3RyaW5ncywgLi4ucGFyYW1zKSB7XG4gIGNvbnN0IHF1ZXJ5Q2h1bmtzID0gW107XG4gIGlmIChwYXJhbXMubGVuZ3RoID4gMCB8fCBzdHJpbmdzLmxlbmd0aCA+IDAgJiYgc3RyaW5nc1swXSAhPT0gXCJcIikge1xuICAgIHF1ZXJ5Q2h1bmtzLnB1c2gobmV3IFN0cmluZ0NodW5rKHN0cmluZ3NbMF0pKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtwYXJhbUluZGV4LCBwYXJhbTJdIG9mIHBhcmFtcy5lbnRyaWVzKCkpIHtcbiAgICBxdWVyeUNodW5rcy5wdXNoKHBhcmFtMiwgbmV3IFN0cmluZ0NodW5rKHN0cmluZ3NbcGFyYW1JbmRleCArIDFdKSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUwocXVlcnlDaHVua3MpO1xufVxuKChzcWwyKSA9PiB7XG4gIGZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiBuZXcgU1FMKFtdKTtcbiAgfVxuICBzcWwyLmVtcHR5ID0gZW1wdHk7XG4gIGZ1bmN0aW9uIGZyb21MaXN0KGxpc3QpIHtcbiAgICByZXR1cm4gbmV3IFNRTChsaXN0KTtcbiAgfVxuICBzcWwyLmZyb21MaXN0ID0gZnJvbUxpc3Q7XG4gIGZ1bmN0aW9uIHJhdyhzdHIpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbbmV3IFN0cmluZ0NodW5rKHN0cildKTtcbiAgfVxuICBzcWwyLnJhdyA9IHJhdztcbiAgZnVuY3Rpb24gam9pbihjaHVua3MsIHNlcGFyYXRvcikge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAoY29uc3QgW2ksIGNodW5rXSBvZiBjaHVua3MuZW50cmllcygpKSB7XG4gICAgICBpZiAoaSA+IDAgJiYgc2VwYXJhdG9yICE9PSB2b2lkIDApIHtcbiAgICAgICAgcmVzdWx0LnB1c2goc2VwYXJhdG9yKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGNodW5rKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTUUwocmVzdWx0KTtcbiAgfVxuICBzcWwyLmpvaW4gPSBqb2luO1xuICBmdW5jdGlvbiBpZGVudGlmaWVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBOYW1lKHZhbHVlKTtcbiAgfVxuICBzcWwyLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICBmdW5jdGlvbiBwbGFjZWhvbGRlcjIobmFtZTIpIHtcbiAgICByZXR1cm4gbmV3IFBsYWNlaG9sZGVyKG5hbWUyKTtcbiAgfVxuICBzcWwyLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXIyO1xuICBmdW5jdGlvbiBwYXJhbTIodmFsdWUsIGVuY29kZXIpIHtcbiAgICByZXR1cm4gbmV3IFBhcmFtKHZhbHVlLCBlbmNvZGVyKTtcbiAgfVxuICBzcWwyLnBhcmFtID0gcGFyYW0yO1xufSkoc3FsIHx8IChzcWwgPSB7fSkpO1xuKChTUUwyKSA9PiB7XG4gIGNsYXNzIEFsaWFzZWQge1xuICAgIGNvbnN0cnVjdG9yKHNxbDIsIGZpZWxkQWxpYXMpIHtcbiAgICAgIHRoaXMuc3FsID0gc3FsMjtcbiAgICAgIHRoaXMuZmllbGRBbGlhcyA9IGZpZWxkQWxpYXM7XG4gICAgfVxuICAgIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTC5BbGlhc2VkXCI7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGlzU2VsZWN0aW9uRmllbGQgPSBmYWxzZTtcbiAgICBnZXRTUUwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcWw7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBjbG9uZSgpIHtcbiAgICAgIHJldHVybiBuZXcgQWxpYXNlZCh0aGlzLnNxbCwgdGhpcy5maWVsZEFsaWFzKTtcbiAgICB9XG4gIH1cbiAgU1FMMi5BbGlhc2VkID0gQWxpYXNlZDtcbn0pKFNRTCB8fCAoU1FMID0ge30pKTtcbmNsYXNzIFBsYWNlaG9sZGVyIHtcbiAgY29uc3RydWN0b3IobmFtZTIpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lMjtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQbGFjZWhvbGRlclwiO1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgfVxufVxuZnVuY3Rpb24gcGxhY2Vob2xkZXIobmFtZTIpIHtcbiAgcmV0dXJuIG5ldyBQbGFjZWhvbGRlcihuYW1lMik7XG59XG5mdW5jdGlvbiBmaWxsUGxhY2Vob2xkZXJzKHBhcmFtcywgdmFsdWVzKSB7XG4gIHJldHVybiBwYXJhbXMubWFwKChwKSA9PiB7XG4gICAgaWYgKGlzKHAsIFBsYWNlaG9sZGVyKSkge1xuICAgICAgaWYgKCEocC5uYW1lIGluIHZhbHVlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB2YWx1ZSBmb3IgcGxhY2Vob2xkZXIgXCIke3AubmFtZX1cIiB3YXMgcHJvdmlkZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZXNbcC5uYW1lXTtcbiAgICB9XG4gICAgaWYgKGlzKHAsIFBhcmFtKSAmJiBpcyhwLnZhbHVlLCBQbGFjZWhvbGRlcikpIHtcbiAgICAgIGlmICghKHAudmFsdWUubmFtZSBpbiB2YWx1ZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdmFsdWUgZm9yIHBsYWNlaG9sZGVyIFwiJHtwLnZhbHVlLm5hbWV9XCIgd2FzIHByb3ZpZGVkYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcC5lbmNvZGVyLm1hcFRvRHJpdmVyVmFsdWUodmFsdWVzW3AudmFsdWUubmFtZV0pO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSk7XG59XG5jb25zdCBJc0RyaXp6bGVWaWV3ID0gU3ltYm9sLmZvcihcImRyaXp6bGU6SXNEcml6emxlVmlld1wiKTtcbmNsYXNzIFZpZXcge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJWaWV3XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1ZpZXdCYXNlQ29uZmlnXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbSXNEcml6emxlVmlld10gPSB0cnVlO1xuICBjb25zdHJ1Y3Rvcih7IG5hbWU6IG5hbWUyLCBzY2hlbWEsIHNlbGVjdGVkRmllbGRzLCBxdWVyeSB9KSB7XG4gICAgdGhpc1tWaWV3QmFzZUNvbmZpZ10gPSB7XG4gICAgICBuYW1lOiBuYW1lMixcbiAgICAgIG9yaWdpbmFsTmFtZTogbmFtZTIsXG4gICAgICBzY2hlbWEsXG4gICAgICBzZWxlY3RlZEZpZWxkcyxcbiAgICAgIHF1ZXJ5LFxuICAgICAgaXNFeGlzdGluZzogIXF1ZXJ5LFxuICAgICAgaXNBbGlhczogZmFsc2VcbiAgICB9O1xuICB9XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICB9XG59XG5mdW5jdGlvbiBpc1ZpZXcodmlldykge1xuICByZXR1cm4gdHlwZW9mIHZpZXcgPT09IFwib2JqZWN0XCIgJiYgdmlldyAhPT0gbnVsbCAmJiBJc0RyaXp6bGVWaWV3IGluIHZpZXc7XG59XG5mdW5jdGlvbiBnZXRWaWV3TmFtZSh2aWV3KSB7XG4gIHJldHVybiB2aWV3W1ZpZXdCYXNlQ29uZmlnXS5uYW1lO1xufVxuQ29sdW1uLnByb3RvdHlwZS5nZXRTUUwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbn07XG5UYWJsZS5wcm90b3R5cGUuZ2V0U1FMID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG59O1xuU3VicXVlcnkucHJvdG90eXBlLmdldFNRTCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xufTtcbmV4cG9ydCB7XG4gIEZha2VQcmltaXRpdmVQYXJhbSxcbiAgTmFtZSxcbiAgUGFyYW0sXG4gIFBsYWNlaG9sZGVyLFxuICBTUUwsXG4gIFN0cmluZ0NodW5rLFxuICBWaWV3LFxuICBmaWxsUGxhY2Vob2xkZXJzLFxuICBnZXRWaWV3TmFtZSxcbiAgaXNEcml2ZXJWYWx1ZUVuY29kZXIsXG4gIGlzU1FMV3JhcHBlcixcbiAgaXNWaWV3LFxuICBuYW1lLFxuICBub29wRGVjb2RlcixcbiAgbm9vcEVuY29kZXIsXG4gIG5vb3BNYXBwZXIsXG4gIHBhcmFtLFxuICBwbGFjZWhvbGRlcixcbiAgc3FsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3FsLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU1FMLCBzcWwgfSBmcm9tIFwiLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuL3ZpZXctY29tbW9uLmpzXCI7XG5jbGFzcyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNvbHVtbkFsaWFzUHJveHlIYW5kbGVyXCI7XG4gIGdldChjb2x1bW5PYmosIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gXCJ0YWJsZVwiKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWJsZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbk9ialtwcm9wXTtcbiAgfVxufVxuY2xhc3MgVGFibGVBbGlhc1Byb3h5SGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKGFsaWFzLCByZXBsYWNlT3JpZ2luYWxOYW1lKSB7XG4gICAgdGhpcy5hbGlhcyA9IGFsaWFzO1xuICAgIHRoaXMucmVwbGFjZU9yaWdpbmFsTmFtZSA9IHJlcGxhY2VPcmlnaW5hbE5hbWU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiVGFibGVBbGlhc1Byb3h5SGFuZGxlclwiO1xuICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IFRhYmxlLlN5bWJvbC5Jc0FsaWFzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByb3AgPT09IFRhYmxlLlN5bWJvbC5OYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5hbGlhcztcbiAgICB9XG4gICAgaWYgKHRoaXMucmVwbGFjZU9yaWdpbmFsTmFtZSAmJiBwcm9wID09PSBUYWJsZS5TeW1ib2wuT3JpZ2luYWxOYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5hbGlhcztcbiAgICB9XG4gICAgaWYgKHByb3AgPT09IFZpZXdCYXNlQ29uZmlnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50YXJnZXRbVmlld0Jhc2VDb25maWddLFxuICAgICAgICBuYW1lOiB0aGlzLmFsaWFzLFxuICAgICAgICBpc0FsaWFzOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAocHJvcCA9PT0gVGFibGUuU3ltYm9sLkNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSB0YXJnZXRbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAgICAgaWYgKCFjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgICAgfVxuICAgICAgY29uc3QgcHJveGllZENvbHVtbnMgPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKGNvbHVtbnMpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgIHByb3hpZWRDb2x1bW5zW2tleV0gPSBuZXcgUHJveHkoXG4gICAgICAgICAgY29sdW1uc1trZXldLFxuICAgICAgICAgIG5ldyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlcihuZXcgUHJveHkodGFyZ2V0LCB0aGlzKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHByb3hpZWRDb2x1bW5zO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHRhcmdldFtwcm9wXTtcbiAgICBpZiAoaXModmFsdWUsIENvbHVtbikpIHtcbiAgICAgIHJldHVybiBuZXcgUHJveHkodmFsdWUsIG5ldyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlcihuZXcgUHJveHkodGFyZ2V0LCB0aGlzKSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbmNsYXNzIFJlbGF0aW9uVGFibGVBbGlhc1Byb3h5SGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKGFsaWFzKSB7XG4gICAgdGhpcy5hbGlhcyA9IGFsaWFzO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlJlbGF0aW9uVGFibGVBbGlhc1Byb3h5SGFuZGxlclwiO1xuICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IFwic291cmNlVGFibGVcIikge1xuICAgICAgcmV0dXJuIGFsaWFzZWRUYWJsZSh0YXJnZXQuc291cmNlVGFibGUsIHRoaXMuYWxpYXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICB9XG59XG5mdW5jdGlvbiBhbGlhc2VkVGFibGUodGFibGUsIHRhYmxlQWxpYXMpIHtcbiAgcmV0dXJuIG5ldyBQcm94eSh0YWJsZSwgbmV3IFRhYmxlQWxpYXNQcm94eUhhbmRsZXIodGFibGVBbGlhcywgZmFsc2UpKTtcbn1cbmZ1bmN0aW9uIGFsaWFzZWRSZWxhdGlvbihyZWxhdGlvbiwgdGFibGVBbGlhcykge1xuICByZXR1cm4gbmV3IFByb3h5KHJlbGF0aW9uLCBuZXcgUmVsYXRpb25UYWJsZUFsaWFzUHJveHlIYW5kbGVyKHRhYmxlQWxpYXMpKTtcbn1cbmZ1bmN0aW9uIGFsaWFzZWRUYWJsZUNvbHVtbihjb2x1bW4sIHRhYmxlQWxpYXMpIHtcbiAgcmV0dXJuIG5ldyBQcm94eShcbiAgICBjb2x1bW4sXG4gICAgbmV3IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyKG5ldyBQcm94eShjb2x1bW4udGFibGUsIG5ldyBUYWJsZUFsaWFzUHJveHlIYW5kbGVyKHRhYmxlQWxpYXMsIGZhbHNlKSkpXG4gICk7XG59XG5mdW5jdGlvbiBtYXBDb2x1bW5zSW5BbGlhc2VkU1FMVG9BbGlhcyhxdWVyeSwgYWxpYXMpIHtcbiAgcmV0dXJuIG5ldyBTUUwuQWxpYXNlZChtYXBDb2x1bW5zSW5TUUxUb0FsaWFzKHF1ZXJ5LnNxbCwgYWxpYXMpLCBxdWVyeS5maWVsZEFsaWFzKTtcbn1cbmZ1bmN0aW9uIG1hcENvbHVtbnNJblNRTFRvQWxpYXMocXVlcnksIGFsaWFzKSB7XG4gIHJldHVybiBzcWwuam9pbihxdWVyeS5xdWVyeUNodW5rcy5tYXAoKGMpID0+IHtcbiAgICBpZiAoaXMoYywgQ29sdW1uKSkge1xuICAgICAgcmV0dXJuIGFsaWFzZWRUYWJsZUNvbHVtbihjLCBhbGlhcyk7XG4gICAgfVxuICAgIGlmIChpcyhjLCBTUUwpKSB7XG4gICAgICByZXR1cm4gbWFwQ29sdW1uc0luU1FMVG9BbGlhcyhjLCBhbGlhcyk7XG4gICAgfVxuICAgIGlmIChpcyhjLCBTUUwuQWxpYXNlZCkpIHtcbiAgICAgIHJldHVybiBtYXBDb2x1bW5zSW5BbGlhc2VkU1FMVG9BbGlhcyhjLCBhbGlhcyk7XG4gICAgfVxuICAgIHJldHVybiBjO1xuICB9KSk7XG59XG5leHBvcnQge1xuICBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlcixcbiAgUmVsYXRpb25UYWJsZUFsaWFzUHJveHlIYW5kbGVyLFxuICBUYWJsZUFsaWFzUHJveHlIYW5kbGVyLFxuICBhbGlhc2VkUmVsYXRpb24sXG4gIGFsaWFzZWRUYWJsZSxcbiAgYWxpYXNlZFRhYmxlQ29sdW1uLFxuICBtYXBDb2x1bW5zSW5BbGlhc2VkU1FMVG9BbGlhcyxcbiAgbWFwQ29sdW1uc0luU1FMVG9BbGlhc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFsaWFzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBpcyB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUGFyYW0sIFNRTCwgVmlldyB9IGZyb20gXCIuL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IGdldFRhYmxlTmFtZSwgVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi92aWV3LWNvbW1vbi5qc1wiO1xuZnVuY3Rpb24gbWFwUmVzdWx0Um93KGNvbHVtbnMsIHJvdywgam9pbnNOb3ROdWxsYWJsZU1hcCkge1xuICBjb25zdCBudWxsaWZ5TWFwID0ge307XG4gIGNvbnN0IHJlc3VsdCA9IGNvbHVtbnMucmVkdWNlKFxuICAgIChyZXN1bHQyLCB7IHBhdGgsIGZpZWxkIH0sIGNvbHVtbkluZGV4KSA9PiB7XG4gICAgICBsZXQgZGVjb2RlcjtcbiAgICAgIGlmIChpcyhmaWVsZCwgQ29sdW1uKSkge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQ7XG4gICAgICB9IGVsc2UgaWYgKGlzKGZpZWxkLCBTUUwpKSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZC5kZWNvZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkLnNxbC5kZWNvZGVyO1xuICAgICAgfVxuICAgICAgbGV0IG5vZGUgPSByZXN1bHQyO1xuICAgICAgZm9yIChjb25zdCBbcGF0aENodW5rSW5kZXgsIHBhdGhDaHVua10gb2YgcGF0aC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKHBhdGhDaHVua0luZGV4IDwgcGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgaWYgKCEocGF0aENodW5rIGluIG5vZGUpKSB7XG4gICAgICAgICAgICBub2RlW3BhdGhDaHVua10gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZSA9IG5vZGVbcGF0aENodW5rXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHJvd1tjb2x1bW5JbmRleF07XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBub2RlW3BhdGhDaHVua10gPSByYXdWYWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBkZWNvZGVyLm1hcEZyb21Ecml2ZXJWYWx1ZShyYXdWYWx1ZSk7XG4gICAgICAgICAgaWYgKGpvaW5zTm90TnVsbGFibGVNYXAgJiYgaXMoZmllbGQsIENvbHVtbikgJiYgcGF0aC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdE5hbWUgPSBwYXRoWzBdO1xuICAgICAgICAgICAgaWYgKCEob2JqZWN0TmFtZSBpbiBudWxsaWZ5TWFwKSkge1xuICAgICAgICAgICAgICBudWxsaWZ5TWFwW29iamVjdE5hbWVdID0gdmFsdWUgPT09IG51bGwgPyBnZXRUYWJsZU5hbWUoZmllbGQudGFibGUpIDogZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudWxsaWZ5TWFwW29iamVjdE5hbWVdID09PSBcInN0cmluZ1wiICYmIG51bGxpZnlNYXBbb2JqZWN0TmFtZV0gIT09IGdldFRhYmxlTmFtZShmaWVsZC50YWJsZSkpIHtcbiAgICAgICAgICAgICAgbnVsbGlmeU1hcFtvYmplY3ROYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDI7XG4gICAgfSxcbiAgICB7fVxuICApO1xuICBpZiAoam9pbnNOb3ROdWxsYWJsZU1hcCAmJiBPYmplY3Qua2V5cyhudWxsaWZ5TWFwKS5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBbb2JqZWN0TmFtZSwgdGFibGVOYW1lXSBvZiBPYmplY3QuZW50cmllcyhudWxsaWZ5TWFwKSkge1xuICAgICAgaWYgKHR5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgJiYgIWpvaW5zTm90TnVsbGFibGVNYXBbdGFibGVOYW1lXSkge1xuICAgICAgICByZXN1bHRbb2JqZWN0TmFtZV0gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMsIHBhdGhQcmVmaXgpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGZpZWxkcykucmVkdWNlKChyZXN1bHQsIFtuYW1lLCBmaWVsZF0pID0+IHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IG5ld1BhdGggPSBwYXRoUHJlZml4ID8gWy4uLnBhdGhQcmVmaXgsIG5hbWVdIDogW25hbWVdO1xuICAgIGlmIChpcyhmaWVsZCwgQ29sdW1uKSB8fCBpcyhmaWVsZCwgU1FMKSB8fCBpcyhmaWVsZCwgU1FMLkFsaWFzZWQpKSB7XG4gICAgICByZXN1bHQucHVzaCh7IHBhdGg6IG5ld1BhdGgsIGZpZWxkIH0pO1xuICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIFRhYmxlKSkge1xuICAgICAgcmVzdWx0LnB1c2goLi4ub3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZFtUYWJsZS5TeW1ib2wuQ29sdW1uc10sIG5ld1BhdGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goLi4ub3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZCwgbmV3UGF0aCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCBbXSk7XG59XG5mdW5jdGlvbiBoYXZlU2FtZUtleXMobGVmdCwgcmlnaHQpIHtcbiAgY29uc3QgbGVmdEtleXMgPSBPYmplY3Qua2V5cyhsZWZ0KTtcbiAgY29uc3QgcmlnaHRLZXlzID0gT2JqZWN0LmtleXMocmlnaHQpO1xuICBpZiAobGVmdEtleXMubGVuZ3RoICE9PSByaWdodEtleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3QgW2luZGV4LCBrZXldIG9mIGxlZnRLZXlzLmVudHJpZXMoKSkge1xuICAgIGlmIChrZXkgIT09IHJpZ2h0S2V5c1tpbmRleF0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBtYXBVcGRhdGVTZXQodGFibGUsIHZhbHVlcykge1xuICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModmFsdWVzKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHZvaWQgMCkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBpZiAoaXModmFsdWUsIFNRTCkgfHwgaXModmFsdWUsIENvbHVtbikpIHtcbiAgICAgIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBba2V5LCBuZXcgUGFyYW0odmFsdWUsIHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXVtrZXldKV07XG4gICAgfVxuICB9KTtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdmFsdWVzIHRvIHNldFwiKTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpO1xufVxuZnVuY3Rpb24gYXBwbHlNaXhpbnMoYmFzZUNsYXNzLCBleHRlbmRlZENsYXNzZXMpIHtcbiAgZm9yIChjb25zdCBleHRlbmRlZENsYXNzIG9mIGV4dGVuZGVkQ2xhc3Nlcykge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhleHRlbmRlZENsYXNzLnByb3RvdHlwZSkpIHtcbiAgICAgIGlmIChuYW1lID09PSBcImNvbnN0cnVjdG9yXCIpIGNvbnRpbnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICBiYXNlQ2xhc3MucHJvdG90eXBlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGV4dGVuZGVkQ2xhc3MucHJvdG90eXBlLCBuYW1lKSB8fCAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRhYmxlQ29sdW1ucyh0YWJsZSkge1xuICByZXR1cm4gdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xufVxuZnVuY3Rpb24gZ2V0Vmlld1NlbGVjdGVkRmllbGRzKHZpZXcpIHtcbiAgcmV0dXJuIHZpZXdbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzO1xufVxuZnVuY3Rpb24gZ2V0VGFibGVMaWtlTmFtZSh0YWJsZSkge1xuICByZXR1cm4gaXModGFibGUsIFN1YnF1ZXJ5KSA/IHRhYmxlLl8uYWxpYXMgOiBpcyh0YWJsZSwgVmlldykgPyB0YWJsZVtWaWV3QmFzZUNvbmZpZ10ubmFtZSA6IGlzKHRhYmxlLCBTUUwpID8gdm9pZCAwIDogdGFibGVbVGFibGUuU3ltYm9sLklzQWxpYXNdID8gdGFibGVbVGFibGUuU3ltYm9sLk5hbWVdIDogdGFibGVbVGFibGUuU3ltYm9sLkJhc2VOYW1lXTtcbn1cbmZ1bmN0aW9uIGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYikge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IHR5cGVvZiBhID09PSBcInN0cmluZ1wiICYmIGEubGVuZ3RoID4gMCA/IGEgOiBcIlwiLFxuICAgIGNvbmZpZzogdHlwZW9mIGEgPT09IFwib2JqZWN0XCIgPyBhIDogYlxuICB9O1xufVxuY29uc3QgXyA9IHt9O1xuY29uc3QgX18gPSB7fTtcbmZ1bmN0aW9uIGlzQ29uZmlnKGRhdGEpIHtcbiAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGRhdGEuY29uc3RydWN0b3IubmFtZSAhPT0gXCJPYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICBpZiAoXCJsb2dnZXJcIiBpbiBkYXRhKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhW1wibG9nZ2VyXCJdO1xuICAgIGlmICh0eXBlICE9PSBcImJvb2xlYW5cIiAmJiAodHlwZSAhPT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZGF0YVtcImxvZ2dlclwiXVtcImxvZ1F1ZXJ5XCJdICE9PSBcImZ1bmN0aW9uXCIpICYmIHR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXCJzY2hlbWFcIiBpbiBkYXRhKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhW1wic2NoZW1hXCJdO1xuICAgIGlmICh0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXCJjYXNpbmdcIiBpbiBkYXRhKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhW1wiY2FzaW5nXCJdO1xuICAgIGlmICh0eXBlICE9PSBcInN0cmluZ1wiICYmIHR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXCJtb2RlXCIgaW4gZGF0YSkge1xuICAgIGlmIChkYXRhW1wibW9kZVwiXSAhPT0gXCJkZWZhdWx0XCIgfHwgZGF0YVtcIm1vZGVcIl0gIT09IFwicGxhbmV0c2NhbGVcIiB8fCBkYXRhW1wibW9kZVwiXSAhPT0gdm9pZCAwKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKFwiY29ubmVjdGlvblwiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJjb25uZWN0aW9uXCJdO1xuICAgIGlmICh0eXBlICE9PSBcInN0cmluZ1wiICYmIHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChcImNsaWVudFwiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJjbGllbnRcIl07XG4gICAgaWYgKHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuY29uc3QgdGV4dERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgPT09IFwidW5kZWZpbmVkXCIgPyBudWxsIDogbmV3IFRleHREZWNvZGVyKCk7XG5leHBvcnQge1xuICBhcHBseU1peGlucyxcbiAgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyxcbiAgZ2V0VGFibGVDb2x1bW5zLFxuICBnZXRUYWJsZUxpa2VOYW1lLFxuICBnZXRWaWV3U2VsZWN0ZWRGaWVsZHMsXG4gIGhhdmVTYW1lS2V5cyxcbiAgaXNDb25maWcsXG4gIG1hcFJlc3VsdFJvdyxcbiAgbWFwVXBkYXRlU2V0LFxuICBvcmRlclNlbGVjdGVkRmllbGRzLFxuICB0ZXh0RGVjb2RlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlTmFtZSB9IGZyb20gXCIuLi90YWJsZS51dGlscy5qc1wiO1xuY2xhc3MgRm9yZWlnbktleUJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVGb3JlaWduS2V5QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIHJlZmVyZW5jZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfb25VcGRhdGU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX29uRGVsZXRlO1xuICBjb25zdHJ1Y3Rvcihjb25maWcsIGFjdGlvbnMpIHtcbiAgICB0aGlzLnJlZmVyZW5jZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgY29sdW1ucywgZm9yZWlnbkNvbHVtbnMgfSA9IGNvbmZpZygpO1xuICAgICAgcmV0dXJuIHsgbmFtZSwgY29sdW1ucywgZm9yZWlnblRhYmxlOiBmb3JlaWduQ29sdW1uc1swXS50YWJsZSwgZm9yZWlnbkNvbHVtbnMgfTtcbiAgICB9O1xuICAgIGlmIChhY3Rpb25zKSB7XG4gICAgICB0aGlzLl9vblVwZGF0ZSA9IGFjdGlvbnMub25VcGRhdGU7XG4gICAgICB0aGlzLl9vbkRlbGV0ZSA9IGFjdGlvbnMub25EZWxldGU7XG4gICAgfVxuICB9XG4gIG9uVXBkYXRlKGFjdGlvbikge1xuICAgIHRoaXMuX29uVXBkYXRlID0gYWN0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9uRGVsZXRlKGFjdGlvbikge1xuICAgIHRoaXMuX29uRGVsZXRlID0gYWN0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXkodGFibGUsIHRoaXMpO1xuICB9XG59XG5jbGFzcyBGb3JlaWduS2V5IHtcbiAgY29uc3RydWN0b3IodGFibGUsIGJ1aWxkZXIpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5yZWZlcmVuY2UgPSBidWlsZGVyLnJlZmVyZW5jZTtcbiAgICB0aGlzLm9uVXBkYXRlID0gYnVpbGRlci5fb25VcGRhdGU7XG4gICAgdGhpcy5vbkRlbGV0ZSA9IGJ1aWxkZXIuX29uRGVsZXRlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUZvcmVpZ25LZXlcIjtcbiAgcmVmZXJlbmNlO1xuICBvblVwZGF0ZTtcbiAgb25EZWxldGU7XG4gIGdldE5hbWUoKSB7XG4gICAgY29uc3QgeyBuYW1lLCBjb2x1bW5zLCBmb3JlaWduQ29sdW1ucyB9ID0gdGhpcy5yZWZlcmVuY2UoKTtcbiAgICBjb25zdCBjb2x1bW5OYW1lcyA9IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKTtcbiAgICBjb25zdCBmb3JlaWduQ29sdW1uTmFtZXMgPSBmb3JlaWduQ29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpO1xuICAgIGNvbnN0IGNodW5rcyA9IFtcbiAgICAgIHRoaXMudGFibGVbVGFibGVOYW1lXSxcbiAgICAgIC4uLmNvbHVtbk5hbWVzLFxuICAgICAgZm9yZWlnbkNvbHVtbnNbMF0udGFibGVbVGFibGVOYW1lXSxcbiAgICAgIC4uLmZvcmVpZ25Db2x1bW5OYW1lc1xuICAgIF07XG4gICAgcmV0dXJuIG5hbWUgPz8gYCR7Y2h1bmtzLmpvaW4oXCJfXCIpfV9ma2A7XG4gIH1cbn1cbmZ1bmN0aW9uIGZvcmVpZ25LZXkoY29uZmlnKSB7XG4gIGZ1bmN0aW9uIG1hcHBlZENvbmZpZygpIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCB7IG5hbWUsIGNvbHVtbnMsIGZvcmVpZ25Db2x1bW5zIH0gPSBjb25maWcoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNvbHVtbnMsXG4gICAgICAgIGZvcmVpZ25Db2x1bW5zXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIHJldHVybiBuZXcgRm9yZWlnbktleUJ1aWxkZXIobWFwcGVkQ29uZmlnKTtcbn1cbmV4cG9ydCB7XG4gIEZvcmVpZ25LZXksXG4gIEZvcmVpZ25LZXlCdWlsZGVyLFxuICBmb3JlaWduS2V5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9yZWlnbi1rZXlzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlTmFtZSB9IGZyb20gXCIuLi90YWJsZS51dGlscy5qc1wiO1xuZnVuY3Rpb24gdW5pcXVlS2V5TmFtZSh0YWJsZSwgY29sdW1ucykge1xuICByZXR1cm4gYCR7dGFibGVbVGFibGVOYW1lXX1fJHtjb2x1bW5zLmpvaW4oXCJfXCIpfV91bmlxdWVgO1xufVxuZnVuY3Rpb24gdW5pcXVlKG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyKG5hbWUpO1xufVxuY2xhc3MgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcihjb2x1bW5zLCBuYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29sdW1ucztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludCh0YWJsZSwgdGhpcy5jb2x1bW5zLCB0aGlzLm5hbWUpO1xuICB9XG59XG5jbGFzcyBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVW5pcXVlT25Db25zdHJhaW50QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIG5hbWU7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG4gIG9uKC4uLmNvbHVtbnMpIHtcbiAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyKGNvbHVtbnMsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFVuaXF1ZUNvbnN0cmFpbnQge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29sdW1ucywgbmFtZSkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHRoaXMubmFtZSA9IG5hbWUgPz8gdW5pcXVlS2V5TmFtZSh0aGlzLnRhYmxlLCB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKSk7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVW5pcXVlQ29uc3RyYWludFwiO1xuICBjb2x1bW5zO1xuICBuYW1lO1xuICBnZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFVuaXF1ZUNvbnN0cmFpbnQsXG4gIFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyLFxuICBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyLFxuICB1bmlxdWUsXG4gIHVuaXF1ZUtleU5hbWVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmlxdWUtY29uc3RyYWludC5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi4vLi4vY29sdW1uLWJ1aWxkZXIuanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi8uLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBGb3JlaWduS2V5QnVpbGRlciB9IGZyb20gXCIuLi9mb3JlaWduLWtleXMuanNcIjtcbmltcG9ydCB7IHVuaXF1ZUtleU5hbWUgfSBmcm9tIFwiLi4vdW5pcXVlLWNvbnN0cmFpbnQuanNcIjtcbmNsYXNzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgZXh0ZW5kcyBDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQ29sdW1uQnVpbGRlclwiO1xuICBmb3JlaWduS2V5Q29uZmlncyA9IFtdO1xuICByZWZlcmVuY2VzKHJlZiwgYWN0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5mb3JlaWduS2V5Q29uZmlncy5wdXNoKHsgcmVmLCBhY3Rpb25zIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHVuaXF1ZShuYW1lKSB7XG4gICAgdGhpcy5jb25maWcuaXNVbmlxdWUgPSB0cnVlO1xuICAgIHRoaXMuY29uZmlnLnVuaXF1ZU5hbWUgPSBuYW1lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdlbmVyYXRlZEFsd2F5c0FzKGFzLCBjb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQgPSB7XG4gICAgICBhcyxcbiAgICAgIHR5cGU6IFwiYWx3YXlzXCIsXG4gICAgICBtb2RlOiBjb25maWc/Lm1vZGUgPz8gXCJ2aXJ0dWFsXCJcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGRGb3JlaWduS2V5cyhjb2x1bW4sIHRhYmxlKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yZWlnbktleUNvbmZpZ3MubWFwKCh7IHJlZiwgYWN0aW9ucyB9KSA9PiB7XG4gICAgICByZXR1cm4gKChyZWYyLCBhY3Rpb25zMikgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IEZvcmVpZ25LZXlCdWlsZGVyKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBmb3JlaWduQ29sdW1uID0gcmVmMigpO1xuICAgICAgICAgIHJldHVybiB7IGNvbHVtbnM6IFtjb2x1bW5dLCBmb3JlaWduQ29sdW1uczogW2ZvcmVpZ25Db2x1bW5dIH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYWN0aW9uczIub25VcGRhdGUpIHtcbiAgICAgICAgICBidWlsZGVyLm9uVXBkYXRlKGFjdGlvbnMyLm9uVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aW9uczIub25EZWxldGUpIHtcbiAgICAgICAgICBidWlsZGVyLm9uRGVsZXRlKGFjdGlvbnMyLm9uRGVsZXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCh0YWJsZSk7XG4gICAgICB9KShyZWYsIGFjdGlvbnMpO1xuICAgIH0pO1xuICB9XG59XG5jbGFzcyBTUUxpdGVDb2x1bW4gZXh0ZW5kcyBDb2x1bW4ge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgaWYgKCFjb25maWcudW5pcXVlTmFtZSkge1xuICAgICAgY29uZmlnLnVuaXF1ZU5hbWUgPSB1bmlxdWVLZXlOYW1lKHRhYmxlLCBbY29uZmlnLm5hbWVdKTtcbiAgICB9XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUNvbHVtblwiO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlQ29sdW1uLFxuICBTUUxpdGVDb2x1bW5CdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbW9uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWVBbmRDb25maWcsIHRleHREZWNvZGVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZUJpZ0ludEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmlnSW50QnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJiaWdpbnRcIiwgXCJTUUxpdGVCaWdJbnRcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQmlnSW50KHRhYmxlLCB0aGlzLmNvbmZpZyk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJpZ0ludCBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJpZ0ludFwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcImJsb2JcIjtcbiAgfVxuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBCdWZmZXIuZnJvbSkge1xuICAgICAgY29uc3QgYnVmID0gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSA/IHZhbHVlIDogdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IEJ1ZmZlci5mcm9tKHZhbHVlKSA6IHZhbHVlLmJ1ZmZlciA/IEJ1ZmZlci5mcm9tKHZhbHVlLmJ1ZmZlciwgdmFsdWUuYnl0ZU9mZnNldCwgdmFsdWUuYnl0ZUxlbmd0aCkgOiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gICAgICByZXR1cm4gQmlnSW50KGJ1Zi50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgIH1cbiAgICByZXR1cm4gQmlnSW50KHRleHREZWNvZGVyLmRlY29kZSh2YWx1ZSkpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUudG9TdHJpbmcoKSk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJsb2JKc29uQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCbG9iSnNvbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwianNvblwiLCBcIlNRTGl0ZUJsb2JKc29uXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJsb2JKc29uKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJsb2JKc29uIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmxvYkpzb25cIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJibG9iXCI7XG4gIH1cbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgQnVmZmVyLmZyb20pIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBCdWZmZXIuZnJvbSh2YWx1ZSkgOiB2YWx1ZS5idWZmZXIgPyBCdWZmZXIuZnJvbSh2YWx1ZS5idWZmZXIsIHZhbHVlLmJ5dGVPZmZzZXQsIHZhbHVlLmJ5dGVMZW5ndGgpIDogQnVmZmVyLmZyb20odmFsdWUpO1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoYnVmLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHREZWNvZGVyLmRlY29kZSh2YWx1ZSkpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmxvYkJ1ZmZlckJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmxvYkJ1ZmZlckJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiYnVmZmVyXCIsIFwiU1FMaXRlQmxvYkJ1ZmZlclwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCbG9iQnVmZmVyKHRhYmxlLCB0aGlzLmNvbmZpZyk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJsb2JCdWZmZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCbG9iQnVmZmVyXCI7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJibG9iXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIGJsb2IoYSwgYikge1xuICBjb25zdCB7IG5hbWUsIGNvbmZpZyB9ID0gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKTtcbiAgaWYgKGNvbmZpZz8ubW9kZSA9PT0gXCJqc29uXCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJsb2JKc29uQnVpbGRlcihuYW1lKTtcbiAgfVxuICBpZiAoY29uZmlnPy5tb2RlID09PSBcImJpZ2ludFwiKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCaWdJbnRCdWlsZGVyKG5hbWUpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMaXRlQmxvYkJ1ZmZlckJ1aWxkZXIobmFtZSk7XG59XG5leHBvcnQge1xuICBTUUxpdGVCaWdJbnQsXG4gIFNRTGl0ZUJpZ0ludEJ1aWxkZXIsXG4gIFNRTGl0ZUJsb2JCdWZmZXIsXG4gIFNRTGl0ZUJsb2JCdWZmZXJCdWlsZGVyLFxuICBTUUxpdGVCbG9iSnNvbixcbiAgU1FMaXRlQmxvYkpzb25CdWlsZGVyLFxuICBibG9iXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmxvYi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZUN1c3RvbUNvbHVtbkJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQ3VzdG9tQ29sdW1uQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBmaWVsZENvbmZpZywgY3VzdG9tVHlwZVBhcmFtcykge1xuICAgIHN1cGVyKG5hbWUsIFwiY3VzdG9tXCIsIFwiU1FMaXRlQ3VzdG9tQ29sdW1uXCIpO1xuICAgIHRoaXMuY29uZmlnLmZpZWxkQ29uZmlnID0gZmllbGRDb25maWc7XG4gICAgdGhpcy5jb25maWcuY3VzdG9tVHlwZVBhcmFtcyA9IGN1c3RvbVR5cGVQYXJhbXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQ3VzdG9tQ29sdW1uKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUN1c3RvbUNvbHVtbiBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUN1c3RvbUNvbHVtblwiO1xuICBzcWxOYW1lO1xuICBtYXBUbztcbiAgbWFwRnJvbTtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMuc3FsTmFtZSA9IGNvbmZpZy5jdXN0b21UeXBlUGFyYW1zLmRhdGFUeXBlKGNvbmZpZy5maWVsZENvbmZpZyk7XG4gICAgdGhpcy5tYXBUbyA9IGNvbmZpZy5jdXN0b21UeXBlUGFyYW1zLnRvRHJpdmVyO1xuICAgIHRoaXMubWFwRnJvbSA9IGNvbmZpZy5jdXN0b21UeXBlUGFyYW1zLmZyb21Ecml2ZXI7XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zcWxOYW1lO1xuICB9XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5tYXBGcm9tID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLm1hcEZyb20odmFsdWUpIDogdmFsdWU7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5tYXBUbyA9PT0gXCJmdW5jdGlvblwiID8gdGhpcy5tYXBUbyh2YWx1ZSkgOiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gY3VzdG9tVHlwZShjdXN0b21UeXBlUGFyYW1zKSB7XG4gIHJldHVybiAoYSwgYikgPT4ge1xuICAgIGNvbnN0IHsgbmFtZSwgY29uZmlnIH0gPSBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpO1xuICAgIHJldHVybiBuZXcgU1FMaXRlQ3VzdG9tQ29sdW1uQnVpbGRlcihcbiAgICAgIG5hbWUsXG4gICAgICBjb25maWcsXG4gICAgICBjdXN0b21UeXBlUGFyYW1zXG4gICAgKTtcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUN1c3RvbUNvbHVtbixcbiAgU1FMaXRlQ3VzdG9tQ29sdW1uQnVpbGRlcixcbiAgY3VzdG9tVHlwZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWN1c3RvbS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBzcWwgfSBmcm9tIFwiLi4vLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmFzZUludGVnZXJCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRhdGFUeXBlLCBjb2x1bW5UeXBlKSB7XG4gICAgc3VwZXIobmFtZSwgZGF0YVR5cGUsIGNvbHVtblR5cGUpO1xuICAgIHRoaXMuY29uZmlnLmF1dG9JbmNyZW1lbnQgPSBmYWxzZTtcbiAgfVxuICBwcmltYXJ5S2V5KGNvbmZpZykge1xuICAgIGlmIChjb25maWc/LmF1dG9JbmNyZW1lbnQpIHtcbiAgICAgIHRoaXMuY29uZmlnLmF1dG9JbmNyZW1lbnQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy5oYXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICByZXR1cm4gc3VwZXIucHJpbWFyeUtleSgpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCYXNlSW50ZWdlciBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJhc2VJbnRlZ2VyXCI7XG4gIGF1dG9JbmNyZW1lbnQgPSB0aGlzLmNvbmZpZy5hdXRvSW5jcmVtZW50O1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcImludGVnZXJcIjtcbiAgfVxufVxuY2xhc3MgU1FMaXRlSW50ZWdlckJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbnRlZ2VyQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJudW1iZXJcIiwgXCJTUUxpdGVJbnRlZ2VyXCIpO1xuICB9XG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVJbnRlZ2VyKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUludGVnZXIgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUludGVnZXJcIjtcbn1cbmNsYXNzIFNRTGl0ZVRpbWVzdGFtcEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUaW1lc3RhbXBCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIG1vZGUpIHtcbiAgICBzdXBlcihuYW1lLCBcImRhdGVcIiwgXCJTUUxpdGVUaW1lc3RhbXBcIik7XG4gICAgdGhpcy5jb25maWcubW9kZSA9IG1vZGU7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgZGVmYXVsdCgpYCB3aXRoIHlvdXIgb3duIGV4cHJlc3Npb24gaW5zdGVhZC5cbiAgICpcbiAgICogQWRkcyBgREVGQVVMVCAoY2FzdCgoanVsaWFuZGF5KCdub3cnKSAtIDI0NDA1ODcuNSkqODY0MDAwMDAgYXMgaW50ZWdlcikpYCB0byB0aGUgY29sdW1uLCB3aGljaCBpcyB0aGUgY3VycmVudCBlcG9jaCB0aW1lc3RhbXAgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgZGVmYXVsdE5vdygpIHtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0KHNxbGAoY2FzdCgoanVsaWFuZGF5KCdub3cnKSAtIDI0NDA1ODcuNSkqODY0MDAwMDAgYXMgaW50ZWdlcikpYCk7XG4gIH1cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRpbWVzdGFtcChcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUaW1lc3RhbXAgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRpbWVzdGFtcFwiO1xuICBtb2RlID0gdGhpcy5jb25maWcubW9kZTtcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm1vZGUgPT09IFwidGltZXN0YW1wXCIpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSAqIDFlMyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGNvbnN0IHVuaXggPSB2YWx1ZS5nZXRUaW1lKCk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm1vZGUgPT09IFwidGltZXN0YW1wXCIpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKHVuaXggLyAxZTMpO1xuICAgIH1cbiAgICByZXR1cm4gdW5peDtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQm9vbGVhbkJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCb29sZWFuQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBtb2RlKSB7XG4gICAgc3VwZXIobmFtZSwgXCJib29sZWFuXCIsIFwiU1FMaXRlQm9vbGVhblwiKTtcbiAgICB0aGlzLmNvbmZpZy5tb2RlID0gbW9kZTtcbiAgfVxuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQm9vbGVhbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCb29sZWFuIGV4dGVuZHMgU1FMaXRlQmFzZUludGVnZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCb29sZWFuXCI7XG4gIG1vZGUgPSB0aGlzLmNvbmZpZy5tb2RlO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKSA9PT0gMTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID8gMSA6IDA7XG4gIH1cbn1cbmZ1bmN0aW9uIGludGVnZXIoYSwgYikge1xuICBjb25zdCB7IG5hbWUsIGNvbmZpZyB9ID0gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKTtcbiAgaWYgKGNvbmZpZz8ubW9kZSA9PT0gXCJ0aW1lc3RhbXBcIiB8fCBjb25maWc/Lm1vZGUgPT09IFwidGltZXN0YW1wX21zXCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRpbWVzdGFtcEJ1aWxkZXIobmFtZSwgY29uZmlnLm1vZGUpO1xuICB9XG4gIGlmIChjb25maWc/Lm1vZGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCb29sZWFuQnVpbGRlcihuYW1lLCBjb25maWcubW9kZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUxpdGVJbnRlZ2VyQnVpbGRlcihuYW1lKTtcbn1cbmNvbnN0IGludCA9IGludGVnZXI7XG5leHBvcnQge1xuICBTUUxpdGVCYXNlSW50ZWdlcixcbiAgU1FMaXRlQmFzZUludGVnZXJCdWlsZGVyLFxuICBTUUxpdGVCb29sZWFuLFxuICBTUUxpdGVCb29sZWFuQnVpbGRlcixcbiAgU1FMaXRlSW50ZWdlcixcbiAgU1FMaXRlSW50ZWdlckJ1aWxkZXIsXG4gIFNRTGl0ZVRpbWVzdGFtcCxcbiAgU1FMaXRlVGltZXN0YW1wQnVpbGRlcixcbiAgaW50LFxuICBpbnRlZ2VyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZWdlci5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZU51bWVyaWNCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcInN0cmluZ1wiLCBcIlNRTGl0ZU51bWVyaWNcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlTnVtZXJpYyhcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVOdW1lcmljIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY1wiO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJudW1lcmljXCI7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWNOdW1iZXJCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNOdW1iZXJCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcIm51bWJlclwiLCBcIlNRTGl0ZU51bWVyaWNOdW1iZXJcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlTnVtZXJpY051bWJlcihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVOdW1lcmljTnVtYmVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY051bWJlclwiO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSA9IFN0cmluZztcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJudW1lcmljXCI7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWNCaWdJbnRCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNCaWdJbnRCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcImJpZ2ludFwiLCBcIlNRTGl0ZU51bWVyaWNCaWdJbnRcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlTnVtZXJpY0JpZ0ludChcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVOdW1lcmljQmlnSW50IGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY0JpZ0ludFwiO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUgPSBCaWdJbnQ7XG4gIG1hcFRvRHJpdmVyVmFsdWUgPSBTdHJpbmc7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwibnVtZXJpY1wiO1xuICB9XG59XG5mdW5jdGlvbiBudW1lcmljKGEsIGIpIHtcbiAgY29uc3QgeyBuYW1lLCBjb25maWcgfSA9IGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYik7XG4gIGNvbnN0IG1vZGUgPSBjb25maWc/Lm1vZGU7XG4gIHJldHVybiBtb2RlID09PSBcIm51bWJlclwiID8gbmV3IFNRTGl0ZU51bWVyaWNOdW1iZXJCdWlsZGVyKG5hbWUpIDogbW9kZSA9PT0gXCJiaWdpbnRcIiA/IG5ldyBTUUxpdGVOdW1lcmljQmlnSW50QnVpbGRlcihuYW1lKSA6IG5ldyBTUUxpdGVOdW1lcmljQnVpbGRlcihuYW1lKTtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZU51bWVyaWMsXG4gIFNRTGl0ZU51bWVyaWNCaWdJbnQsXG4gIFNRTGl0ZU51bWVyaWNCaWdJbnRCdWlsZGVyLFxuICBTUUxpdGVOdW1lcmljQnVpbGRlcixcbiAgU1FMaXRlTnVtZXJpY051bWJlcixcbiAgU1FMaXRlTnVtZXJpY051bWJlckJ1aWxkZXIsXG4gIG51bWVyaWNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1udW1lcmljLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlUmVhbEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlUmVhbEJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwibnVtYmVyXCIsIFwiU1FMaXRlUmVhbFwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVSZWFsKHRhYmxlLCB0aGlzLmNvbmZpZyk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVJlYWwgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVSZWFsXCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwicmVhbFwiO1xuICB9XG59XG5mdW5jdGlvbiByZWFsKG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBTUUxpdGVSZWFsQnVpbGRlcihuYW1lID8/IFwiXCIpO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlUmVhbCxcbiAgU1FMaXRlUmVhbEJ1aWxkZXIsXG4gIHJlYWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWFsLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWVBbmRDb25maWcgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlVGV4dEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGV4dEJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgY29uZmlnKSB7XG4gICAgc3VwZXIobmFtZSwgXCJzdHJpbmdcIiwgXCJTUUxpdGVUZXh0XCIpO1xuICAgIHRoaXMuY29uZmlnLmVudW1WYWx1ZXMgPSBjb25maWcuZW51bTtcbiAgICB0aGlzLmNvbmZpZy5sZW5ndGggPSBjb25maWcubGVuZ3RoO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRleHQoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVGV4dCBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRleHRcIjtcbiAgZW51bVZhbHVlcyA9IHRoaXMuY29uZmlnLmVudW1WYWx1ZXM7XG4gIGxlbmd0aCA9IHRoaXMuY29uZmlnLmxlbmd0aDtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIGB0ZXh0JHt0aGlzLmNvbmZpZy5sZW5ndGggPyBgKCR7dGhpcy5jb25maWcubGVuZ3RofSlgIDogXCJcIn1gO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUZXh0SnNvbkJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGV4dEpzb25CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcImpzb25cIiwgXCJTUUxpdGVUZXh0SnNvblwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVUZXh0SnNvbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUZXh0SnNvbiBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRleHRKc29uXCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwidGV4dFwiO1xuICB9XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gdGV4dChhLCBiID0ge30pIHtcbiAgY29uc3QgeyBuYW1lLCBjb25maWcgfSA9IGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYik7XG4gIGlmIChjb25maWcubW9kZSA9PT0gXCJqc29uXCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRleHRKc29uQnVpbGRlcihuYW1lKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTGl0ZVRleHRCdWlsZGVyKG5hbWUsIGNvbmZpZyk7XG59XG5leHBvcnQge1xuICBTUUxpdGVUZXh0LFxuICBTUUxpdGVUZXh0QnVpbGRlcixcbiAgU1FMaXRlVGV4dEpzb24sXG4gIFNRTGl0ZVRleHRKc29uQnVpbGRlcixcbiAgdGV4dFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRleHQuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlciwgVGFibGVBbGlhc1Byb3h5SGFuZGxlciB9IGZyb20gXCIuL2FsaWFzLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTUUwsIFZpZXcgfSBmcm9tIFwiLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuL3ZpZXctY29tbW9uLmpzXCI7XG5jbGFzcyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTZWxlY3Rpb25Qcm94eUhhbmRsZXJcIjtcbiAgY29uZmlnO1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uY29uZmlnIH07XG4gIH1cbiAgZ2V0KHN1YnF1ZXJ5LCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IFwiX1wiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdWJxdWVyeVtcIl9cIl0sXG4gICAgICAgIHNlbGVjdGVkRmllbGRzOiBuZXcgUHJveHkoXG4gICAgICAgICAgc3VicXVlcnkuXy5zZWxlY3RlZEZpZWxkcyxcbiAgICAgICAgICB0aGlzXG4gICAgICAgIClcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChwcm9wID09PSBWaWV3QmFzZUNvbmZpZykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3VicXVlcnlbVmlld0Jhc2VDb25maWddLFxuICAgICAgICBzZWxlY3RlZEZpZWxkczogbmV3IFByb3h5KFxuICAgICAgICAgIHN1YnF1ZXJ5W1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcyxcbiAgICAgICAgICB0aGlzXG4gICAgICAgIClcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgcmV0dXJuIHN1YnF1ZXJ5W3Byb3BdO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW5zID0gaXMoc3VicXVlcnksIFN1YnF1ZXJ5KSA/IHN1YnF1ZXJ5Ll8uc2VsZWN0ZWRGaWVsZHMgOiBpcyhzdWJxdWVyeSwgVmlldykgPyBzdWJxdWVyeVtWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHMgOiBzdWJxdWVyeTtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbHVtbnNbcHJvcF07XG4gICAgaWYgKGlzKHZhbHVlLCBTUUwuQWxpYXNlZCkpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zcWxBbGlhc2VkQmVoYXZpb3IgPT09IFwic3FsXCIgJiYgIXZhbHVlLmlzU2VsZWN0aW9uRmllbGQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNxbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUuY2xvbmUoKTtcbiAgICAgIG5ld1ZhbHVlLmlzU2VsZWN0aW9uRmllbGQgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXModmFsdWUsIFNRTCkpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zcWxCZWhhdmlvciA9PT0gXCJzcWxcIikge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBZb3UgdHJpZWQgdG8gcmVmZXJlbmNlIFwiJHtwcm9wfVwiIGZpZWxkIGZyb20gYSBzdWJxdWVyeSwgd2hpY2ggaXMgYSByYXcgU1FMIGZpZWxkLCBidXQgaXQgZG9lc24ndCBoYXZlIGFuIGFsaWFzIGRlY2xhcmVkLiBQbGVhc2UgYWRkIGFuIGFsaWFzIHRvIHRoZSBmaWVsZCB1c2luZyBcIi5hcygnYWxpYXMnKVwiIG1ldGhvZC5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaXModmFsdWUsIENvbHVtbikpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5hbGlhcykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIG5ldyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlcihcbiAgICAgICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICAgICAgdmFsdWUudGFibGUsXG4gICAgICAgICAgICAgIG5ldyBUYWJsZUFsaWFzUHJveHlIYW5kbGVyKHRoaXMuY29uZmlnLmFsaWFzLCB0aGlzLmNvbmZpZy5yZXBsYWNlT3JpZ2luYWxOYW1lID8/IGZhbHNlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb3h5KHZhbHVlLCBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHRoaXMuY29uZmlnKSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNlbGVjdGlvblByb3h5SGFuZGxlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbGVjdGlvbi1wcm94eS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIFF1ZXJ5UHJvbWlzZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlF1ZXJ5UHJvbWlzZVwiO1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9IFwiUXVlcnlQcm9taXNlXCI7XG4gIGNhdGNoKG9uUmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKHZvaWQgMCwgb25SZWplY3RlZCk7XG4gIH1cbiAgZmluYWxseShvbkZpbmFsbHkpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgIG9uRmluYWxseT8uKCk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICAocmVhc29uKSA9PiB7XG4gICAgICAgIG9uRmluYWxseT8uKCk7XG4gICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKCkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFF1ZXJ5UHJvbWlzZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXJ5LXByb21pc2UuanMubWFwIiwKICAgICJpbXBvcnQgeyBibG9iIH0gZnJvbSBcIi4vYmxvYi5qc1wiO1xuaW1wb3J0IHsgY3VzdG9tVHlwZSB9IGZyb20gXCIuL2N1c3RvbS5qc1wiO1xuaW1wb3J0IHsgaW50ZWdlciB9IGZyb20gXCIuL2ludGVnZXIuanNcIjtcbmltcG9ydCB7IG51bWVyaWMgfSBmcm9tIFwiLi9udW1lcmljLmpzXCI7XG5pbXBvcnQgeyByZWFsIH0gZnJvbSBcIi4vcmVhbC5qc1wiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuL3RleHQuanNcIjtcbmZ1bmN0aW9uIGdldFNRTGl0ZUNvbHVtbkJ1aWxkZXJzKCkge1xuICByZXR1cm4ge1xuICAgIGJsb2IsXG4gICAgY3VzdG9tVHlwZSxcbiAgICBpbnRlZ2VyLFxuICAgIG51bWVyaWMsXG4gICAgcmVhbCxcbiAgICB0ZXh0XG4gIH07XG59XG5leHBvcnQge1xuICBnZXRTUUxpdGVDb2x1bW5CdWlsZGVyc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFsbC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgZ2V0U1FMaXRlQ29sdW1uQnVpbGRlcnMgfSBmcm9tIFwiLi9jb2x1bW5zL2FsbC5qc1wiO1xuY29uc3QgSW5saW5lRm9yZWlnbktleXMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpTUUxpdGVJbmxpbmVGb3JlaWduS2V5c1wiKTtcbmNsYXNzIFNRTGl0ZVRhYmxlIGV4dGVuZHMgVGFibGUge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUYWJsZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBTeW1ib2wgPSBPYmplY3QuYXNzaWduKHt9LCBUYWJsZS5TeW1ib2wsIHtcbiAgICBJbmxpbmVGb3JlaWduS2V5c1xuICB9KTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAvKiogQGludGVybmFsICovXG4gIFtJbmxpbmVGb3JlaWduS2V5c10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl0gPSB2b2lkIDA7XG59XG5mdW5jdGlvbiBzcWxpdGVUYWJsZUJhc2UobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcsIHNjaGVtYSwgYmFzZU5hbWUgPSBuYW1lKSB7XG4gIGNvbnN0IHJhd1RhYmxlID0gbmV3IFNRTGl0ZVRhYmxlKG5hbWUsIHNjaGVtYSwgYmFzZU5hbWUpO1xuICBjb25zdCBwYXJzZWRDb2x1bW5zID0gdHlwZW9mIGNvbHVtbnMgPT09IFwiZnVuY3Rpb25cIiA/IGNvbHVtbnMoZ2V0U1FMaXRlQ29sdW1uQnVpbGRlcnMoKSkgOiBjb2x1bW5zO1xuICBjb25zdCBidWlsdENvbHVtbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocGFyc2VkQ29sdW1ucykubWFwKChbbmFtZTIsIGNvbEJ1aWxkZXJCYXNlXSkgPT4ge1xuICAgICAgY29uc3QgY29sQnVpbGRlciA9IGNvbEJ1aWxkZXJCYXNlO1xuICAgICAgY29sQnVpbGRlci5zZXROYW1lKG5hbWUyKTtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbEJ1aWxkZXIuYnVpbGQocmF3VGFibGUpO1xuICAgICAgcmF3VGFibGVbSW5saW5lRm9yZWlnbktleXNdLnB1c2goLi4uY29sQnVpbGRlci5idWlsZEZvcmVpZ25LZXlzKGNvbHVtbiwgcmF3VGFibGUpKTtcbiAgICAgIHJldHVybiBbbmFtZTIsIGNvbHVtbl07XG4gICAgfSlcbiAgKTtcbiAgY29uc3QgdGFibGUgPSBPYmplY3QuYXNzaWduKHJhd1RhYmxlLCBidWlsdENvbHVtbnMpO1xuICB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10gPSBidWlsdENvbHVtbnM7XG4gIHRhYmxlW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0NvbHVtbnNdID0gYnVpbHRDb2x1bW5zO1xuICBpZiAoZXh0cmFDb25maWcpIHtcbiAgICB0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXSA9IGV4dHJhQ29uZmlnO1xuICB9XG4gIHJldHVybiB0YWJsZTtcbn1cbmNvbnN0IHNxbGl0ZVRhYmxlID0gKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnKSA9PiB7XG4gIHJldHVybiBzcWxpdGVUYWJsZUJhc2UobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcpO1xufTtcbmZ1bmN0aW9uIHNxbGl0ZVRhYmxlQ3JlYXRvcihjdXN0b21pemVUYWJsZU5hbWUpIHtcbiAgcmV0dXJuIChuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZykgPT4ge1xuICAgIHJldHVybiBzcWxpdGVUYWJsZUJhc2UoY3VzdG9taXplVGFibGVOYW1lKG5hbWUpLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgdm9pZCAwLCBuYW1lKTtcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIElubGluZUZvcmVpZ25LZXlzLFxuICBTUUxpdGVUYWJsZSxcbiAgc3FsaXRlVGFibGUsXG4gIHNxbGl0ZVRhYmxlQ3JlYXRvclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhYmxlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmNsYXNzIEluZGV4QnVpbGRlck9uIHtcbiAgY29uc3RydWN0b3IobmFtZSwgdW5pcXVlKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnVuaXF1ZSA9IHVuaXF1ZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbmRleEJ1aWxkZXJPblwiO1xuICBvbiguLi5jb2x1bW5zKSB7XG4gICAgcmV0dXJuIG5ldyBJbmRleEJ1aWxkZXIodGhpcy5uYW1lLCBjb2x1bW5zLCB0aGlzLnVuaXF1ZSk7XG4gIH1cbn1cbmNsYXNzIEluZGV4QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUluZGV4QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgY29uc3RydWN0b3IobmFtZSwgY29sdW1ucywgdW5pcXVlKSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBuYW1lLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHVuaXF1ZSxcbiAgICAgIHdoZXJlOiB2b2lkIDBcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBDb25kaXRpb24gZm9yIHBhcnRpYWwgaW5kZXguXG4gICAqL1xuICB3aGVyZShjb25kaXRpb24pIHtcbiAgICB0aGlzLmNvbmZpZy53aGVyZSA9IGNvbmRpdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBJbmRleCh0aGlzLmNvbmZpZywgdGFibGUpO1xuICB9XG59XG5jbGFzcyBJbmRleCB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUluZGV4XCI7XG4gIGNvbmZpZztcbiAgY29uc3RydWN0b3IoY29uZmlnLCB0YWJsZSkge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi5jb25maWcsIHRhYmxlIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGluZGV4KG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBJbmRleEJ1aWxkZXJPbihuYW1lLCBmYWxzZSk7XG59XG5mdW5jdGlvbiB1bmlxdWVJbmRleChuYW1lKSB7XG4gIHJldHVybiBuZXcgSW5kZXhCdWlsZGVyT24obmFtZSwgdHJ1ZSk7XG59XG5leHBvcnQge1xuICBJbmRleCxcbiAgSW5kZXhCdWlsZGVyLFxuICBJbmRleEJ1aWxkZXJPbixcbiAgaW5kZXgsXG4gIHVuaXF1ZUluZGV4XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXhlcy5qcy5tYXAiLAogICAgImltcG9ydCB7IGlzIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU1FMIH0gZnJvbSBcIi4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IENoZWNrQnVpbGRlciB9IGZyb20gXCIuL2NoZWNrcy5qc1wiO1xuaW1wb3J0IHsgRm9yZWlnbktleUJ1aWxkZXIgfSBmcm9tIFwiLi9mb3JlaWduLWtleXMuanNcIjtcbmltcG9ydCB7IEluZGV4QnVpbGRlciB9IGZyb20gXCIuL2luZGV4ZXMuanNcIjtcbmltcG9ydCB7IFByaW1hcnlLZXlCdWlsZGVyIH0gZnJvbSBcIi4vcHJpbWFyeS1rZXlzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBVbmlxdWVDb25zdHJhaW50QnVpbGRlciB9IGZyb20gXCIuL3VuaXF1ZS1jb25zdHJhaW50LmpzXCI7XG5mdW5jdGlvbiBnZXRUYWJsZUNvbmZpZyh0YWJsZSkge1xuICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LnZhbHVlcyh0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuQ29sdW1uc10pO1xuICBjb25zdCBpbmRleGVzID0gW107XG4gIGNvbnN0IGNoZWNrcyA9IFtdO1xuICBjb25zdCBwcmltYXJ5S2V5cyA9IFtdO1xuICBjb25zdCB1bmlxdWVDb25zdHJhaW50cyA9IFtdO1xuICBjb25zdCBmb3JlaWduS2V5cyA9IE9iamVjdC52YWx1ZXModGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLklubGluZUZvcmVpZ25LZXlzXSk7XG4gIGNvbnN0IG5hbWUgPSB0YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV07XG4gIGNvbnN0IGV4dHJhQ29uZmlnQnVpbGRlciA9IHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdO1xuICBpZiAoZXh0cmFDb25maWdCdWlsZGVyICE9PSB2b2lkIDApIHtcbiAgICBjb25zdCBleHRyYUNvbmZpZyA9IGV4dHJhQ29uZmlnQnVpbGRlcih0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuQ29sdW1uc10pO1xuICAgIGNvbnN0IGV4dHJhVmFsdWVzID0gQXJyYXkuaXNBcnJheShleHRyYUNvbmZpZykgPyBleHRyYUNvbmZpZy5mbGF0KDEpIDogT2JqZWN0LnZhbHVlcyhleHRyYUNvbmZpZyk7XG4gICAgZm9yIChjb25zdCBidWlsZGVyIG9mIE9iamVjdC52YWx1ZXMoZXh0cmFWYWx1ZXMpKSB7XG4gICAgICBpZiAoaXMoYnVpbGRlciwgSW5kZXhCdWlsZGVyKSkge1xuICAgICAgICBpbmRleGVzLnB1c2goYnVpbGRlci5idWlsZCh0YWJsZSkpO1xuICAgICAgfSBlbHNlIGlmIChpcyhidWlsZGVyLCBDaGVja0J1aWxkZXIpKSB7XG4gICAgICAgIGNoZWNrcy5wdXNoKGJ1aWxkZXIuYnVpbGQodGFibGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXMoYnVpbGRlciwgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIpKSB7XG4gICAgICAgIHVuaXF1ZUNvbnN0cmFpbnRzLnB1c2goYnVpbGRlci5idWlsZCh0YWJsZSkpO1xuICAgICAgfSBlbHNlIGlmIChpcyhidWlsZGVyLCBQcmltYXJ5S2V5QnVpbGRlcikpIHtcbiAgICAgICAgcHJpbWFyeUtleXMucHVzaChidWlsZGVyLmJ1aWxkKHRhYmxlKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzKGJ1aWxkZXIsIEZvcmVpZ25LZXlCdWlsZGVyKSkge1xuICAgICAgICBmb3JlaWduS2V5cy5wdXNoKGJ1aWxkZXIuYnVpbGQodGFibGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb2x1bW5zLFxuICAgIGluZGV4ZXMsXG4gICAgZm9yZWlnbktleXMsXG4gICAgY2hlY2tzLFxuICAgIHByaW1hcnlLZXlzLFxuICAgIHVuaXF1ZUNvbnN0cmFpbnRzLFxuICAgIG5hbWVcbiAgfTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RVc2VkVGFibGUodGFibGUpIHtcbiAgaWYgKGlzKHRhYmxlLCBTUUxpdGVUYWJsZSkpIHtcbiAgICByZXR1cm4gW2Ake3RhYmxlW1RhYmxlLlN5bWJvbC5CYXNlTmFtZV19YF07XG4gIH1cbiAgaWYgKGlzKHRhYmxlLCBTdWJxdWVyeSkpIHtcbiAgICByZXR1cm4gdGFibGUuXy51c2VkVGFibGVzID8/IFtdO1xuICB9XG4gIGlmIChpcyh0YWJsZSwgU1FMKSkge1xuICAgIHJldHVybiB0YWJsZS51c2VkVGFibGVzID8/IFtdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cbmZ1bmN0aW9uIGdldFZpZXdDb25maWcodmlldykge1xuICByZXR1cm4ge1xuICAgIC4uLnZpZXdbVmlld0Jhc2VDb25maWddXG4gICAgLy8gLi4udmlld1tTUUxpdGVWaWV3Q29uZmlnXSxcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIGV4dHJhY3RVc2VkVGFibGUsXG4gIGdldFRhYmxlQ29uZmlnLFxuICBnZXRWaWV3Q29uZmlnXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblByb3h5SGFuZGxlciB9IGZyb20gXCIuLi8uLi9zZWxlY3Rpb24tcHJveHkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgb3JkZXJTZWxlY3RlZEZpZWxkcyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdFVzZWRUYWJsZSB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuY2xhc3MgU1FMaXRlRGVsZXRlQmFzZSBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLmNvbmZpZyA9IHsgdGFibGUsIHdpdGhMaXN0IH07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlRGVsZXRlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICAvKipcbiAgICogQWRkcyBhIGB3aGVyZWAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGRlbGV0ZSBvbmx5IHRob3NlIHJvd3MgdGhhdCBmdWxmaWxsIGEgc3BlY2lmaWVkIGNvbmRpdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9kZWxldGV9XG4gICAqXG4gICAqIEBwYXJhbSB3aGVyZSB0aGUgYHdoZXJlYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFlvdSBjYW4gdXNlIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyBhbmQgYHNxbCBmdW5jdGlvbmAgdG8gZmlsdGVyIHRoZSByb3dzIHRvIGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIERlbGV0ZSBhbGwgY2FycyB3aXRoIGdyZWVuIGNvbG9yXG4gICAqIGRiLmRlbGV0ZShjYXJzKS53aGVyZShlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSk7XG4gICAqIC8vIG9yXG4gICAqIGRiLmRlbGV0ZShjYXJzKS53aGVyZShzcWxgJHtjYXJzLmNvbG9yfSA9ICdncmVlbidgKVxuICAgKiBgYGBcbiAgICpcbiAgICogWW91IGNhbiBsb2dpY2FsbHkgY29tYmluZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgd2l0aCBgYW5kKClgIGFuZCBgb3IoKWAgb3BlcmF0b3JzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBEZWxldGUgYWxsIEJNVyBjYXJzIHdpdGggYSBncmVlbiBjb2xvclxuICAgKiBkYi5kZWxldGUoY2Fycykud2hlcmUoYW5kKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmJyYW5kLCAnQk1XJykpKTtcbiAgICpcbiAgICogLy8gRGVsZXRlIGFsbCBjYXJzIHdpdGggdGhlIGdyZWVuIG9yIGJsdWUgY29sb3JcbiAgICogZGIuZGVsZXRlKGNhcnMpLndoZXJlKG9yKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmNvbG9yLCAnYmx1ZScpKSk7XG4gICAqIGBgYFxuICAgKi9cbiAgd2hlcmUod2hlcmUpIHtcbiAgICB0aGlzLmNvbmZpZy53aGVyZSA9IHdoZXJlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yZGVyQnkoLi4uY29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgY29sdW1uc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmRlckJ5ID0gY29sdW1uc1swXShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLnRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBBcnJheS5pc0FycmF5KG9yZGVyQnkpID8gb3JkZXJCeSA6IFtvcmRlckJ5XTtcbiAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IGNvbHVtbnM7XG4gICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBsaW1pdChsaW1pdCkge1xuICAgIHRoaXMuY29uZmlnLmxpbWl0ID0gbGltaXQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgcmV0dXJuaW5nKGZpZWxkcyA9IHRoaXMudGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkNvbHVtbnNdKSB7XG4gICAgdGhpcy5jb25maWcucmV0dXJuaW5nID0gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGREZWxldGVRdWVyeSh0aGlzLmNvbmZpZyk7XG4gIH1cbiAgdG9TUUwoKSB7XG4gICAgY29uc3QgeyB0eXBpbmdzOiBfdHlwaW5ncywgLi4ucmVzdCB9ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSk7XG4gICAgcmV0dXJuIHJlc3Q7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uW2lzT25lVGltZVF1ZXJ5ID8gXCJwcmVwYXJlT25lVGltZVF1ZXJ5XCIgOiBcInByZXBhcmVRdWVyeVwiXShcbiAgICAgIHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nID8gXCJhbGxcIiA6IFwicnVuXCIsXG4gICAgICB0cnVlLFxuICAgICAgdm9pZCAwLFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImRlbGV0ZVwiLFxuICAgICAgICB0YWJsZXM6IGV4dHJhY3RVc2VkVGFibGUodGhpcy5jb25maWcudGFibGUpXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKTtcbiAgfVxuICBydW4gPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnJ1bihwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFsbCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuYWxsKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgZ2V0ID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5nZXQocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICB2YWx1ZXMgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFzeW5jIGV4ZWN1dGUocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmV4ZWN1dGUocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9XG4gICRkeW5hbWljKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVEZWxldGVCYXNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVsZXRlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuZnVuY3Rpb24gdG9TbmFrZUNhc2UoaW5wdXQpIHtcbiAgY29uc3Qgd29yZHMgPSBpbnB1dC5yZXBsYWNlKC9bJ1xcdTIwMTldL2csIFwiXCIpLm1hdGNoKC9bXFxkYS16XSt8W0EtWl0rKD8hW2Etel0pfFtBLVpdW1xcZGEtel0rL2cpID8/IFtdO1xuICByZXR1cm4gd29yZHMubWFwKCh3b3JkKSA9PiB3b3JkLnRvTG93ZXJDYXNlKCkpLmpvaW4oXCJfXCIpO1xufVxuZnVuY3Rpb24gdG9DYW1lbENhc2UoaW5wdXQpIHtcbiAgY29uc3Qgd29yZHMgPSBpbnB1dC5yZXBsYWNlKC9bJ1xcdTIwMTldL2csIFwiXCIpLm1hdGNoKC9bXFxkYS16XSt8W0EtWl0rKD8hW2Etel0pfFtBLVpdW1xcZGEtel0rL2cpID8/IFtdO1xuICByZXR1cm4gd29yZHMucmVkdWNlKChhY2MsIHdvcmQsIGkpID0+IHtcbiAgICBjb25zdCBmb3JtYXR0ZWRXb3JkID0gaSA9PT0gMCA/IHdvcmQudG9Mb3dlckNhc2UoKSA6IGAke3dvcmRbMF0udG9VcHBlckNhc2UoKX0ke3dvcmQuc2xpY2UoMSl9YDtcbiAgICByZXR1cm4gYWNjICsgZm9ybWF0dGVkV29yZDtcbiAgfSwgXCJcIik7XG59XG5mdW5jdGlvbiBub29wQ2FzZShpbnB1dCkge1xuICByZXR1cm4gaW5wdXQ7XG59XG5jbGFzcyBDYXNpbmdDYWNoZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNhc2luZ0NhY2hlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY2FjaGUgPSB7fTtcbiAgY2FjaGVkVGFibGVzID0ge307XG4gIGNvbnZlcnQ7XG4gIGNvbnN0cnVjdG9yKGNhc2luZykge1xuICAgIHRoaXMuY29udmVydCA9IGNhc2luZyA9PT0gXCJzbmFrZV9jYXNlXCIgPyB0b1NuYWtlQ2FzZSA6IGNhc2luZyA9PT0gXCJjYW1lbENhc2VcIiA/IHRvQ2FtZWxDYXNlIDogbm9vcENhc2U7XG4gIH1cbiAgZ2V0Q29sdW1uQ2FzaW5nKGNvbHVtbikge1xuICAgIGlmICghY29sdW1uLmtleUFzTmFtZSkgcmV0dXJuIGNvbHVtbi5uYW1lO1xuICAgIGNvbnN0IHNjaGVtYSA9IGNvbHVtbi50YWJsZVtUYWJsZS5TeW1ib2wuU2NoZW1hXSA/PyBcInB1YmxpY1wiO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IGNvbHVtbi50YWJsZVtUYWJsZS5TeW1ib2wuT3JpZ2luYWxOYW1lXTtcbiAgICBjb25zdCBrZXkgPSBgJHtzY2hlbWF9LiR7dGFibGVOYW1lfS4ke2NvbHVtbi5uYW1lfWA7XG4gICAgaWYgKCF0aGlzLmNhY2hlW2tleV0pIHtcbiAgICAgIHRoaXMuY2FjaGVUYWJsZShjb2x1bW4udGFibGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xuICB9XG4gIGNhY2hlVGFibGUodGFibGUpIHtcbiAgICBjb25zdCBzY2hlbWEgPSB0YWJsZVtUYWJsZS5TeW1ib2wuU2NoZW1hXSA/PyBcInB1YmxpY1wiO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRhYmxlW1RhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWVdO1xuICAgIGNvbnN0IHRhYmxlS2V5ID0gYCR7c2NoZW1hfS4ke3RhYmxlTmFtZX1gO1xuICAgIGlmICghdGhpcy5jYWNoZWRUYWJsZXNbdGFibGVLZXldKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBPYmplY3QudmFsdWVzKHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSkpIHtcbiAgICAgICAgY29uc3QgY29sdW1uS2V5ID0gYCR7dGFibGVLZXl9LiR7Y29sdW1uLm5hbWV9YDtcbiAgICAgICAgdGhpcy5jYWNoZVtjb2x1bW5LZXldID0gdGhpcy5jb252ZXJ0KGNvbHVtbi5uYW1lKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FjaGVkVGFibGVzW3RhYmxlS2V5XSA9IHRydWU7XG4gICAgfVxuICB9XG4gIGNsZWFyQ2FjaGUoKSB7XG4gICAgdGhpcy5jYWNoZSA9IHt9O1xuICAgIHRoaXMuY2FjaGVkVGFibGVzID0ge307XG4gIH1cbn1cbmV4cG9ydCB7XG4gIENhc2luZ0NhY2hlLFxuICB0b0NhbWVsQ2FzZSxcbiAgdG9TbmFrZUNhc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYXNpbmcuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBEcml6emxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkRyaXp6bGVFcnJvclwiO1xuICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2UsIGNhdXNlIH0pIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkRyaXp6bGVFcnJvclwiO1xuICAgIHRoaXMuY2F1c2UgPSBjYXVzZTtcbiAgfVxufVxuY2xhc3MgRHJpenpsZVF1ZXJ5RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHF1ZXJ5LCBwYXJhbXMsIGNhdXNlKSB7XG4gICAgc3VwZXIoYEZhaWxlZCBxdWVyeTogJHtxdWVyeX1cbnBhcmFtczogJHtwYXJhbXN9YCk7XG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5O1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMuY2F1c2UgPSBjYXVzZTtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBEcml6emxlUXVlcnlFcnJvcik7XG4gICAgaWYgKGNhdXNlKSB0aGlzLmNhdXNlID0gY2F1c2U7XG4gIH1cbn1cbmNsYXNzIFRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvciBleHRlbmRzIERyaXp6bGVFcnJvciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvclwiO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7IG1lc3NhZ2U6IFwiUm9sbGJhY2tcIiB9KTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgRHJpenpsZUVycm9yLFxuICBEcml6emxlUXVlcnlFcnJvcixcbiAgVHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBnZXRQZ0NvbHVtbkJ1aWxkZXJzIH0gZnJvbSBcIi4vY29sdW1ucy9hbGwuanNcIjtcbmNvbnN0IElubGluZUZvcmVpZ25LZXlzID0gU3ltYm9sLmZvcihcImRyaXp6bGU6UGdJbmxpbmVGb3JlaWduS2V5c1wiKTtcbmNvbnN0IEVuYWJsZVJMUyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOkVuYWJsZVJMU1wiKTtcbmNsYXNzIFBnVGFibGUgZXh0ZW5kcyBUYWJsZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnVGFibGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgU3ltYm9sID0gT2JqZWN0LmFzc2lnbih7fSwgVGFibGUuU3ltYm9sLCB7XG4gICAgSW5saW5lRm9yZWlnbktleXMsXG4gICAgRW5hYmxlUkxTXG4gIH0pO1xuICAvKipAaW50ZXJuYWwgKi9cbiAgW0lubGluZUZvcmVpZ25LZXlzXSA9IFtdO1xuICAvKiogQGludGVybmFsICovXG4gIFtFbmFibGVSTFNdID0gZmFsc2U7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdID0gdm9pZCAwO1xuICAvKiogQGludGVybmFsICovXG4gIFtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdDb2x1bW5zXSA9IHt9O1xufVxuZnVuY3Rpb24gcGdUYWJsZVdpdGhTY2hlbWEobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcsIHNjaGVtYSwgYmFzZU5hbWUgPSBuYW1lKSB7XG4gIGNvbnN0IHJhd1RhYmxlID0gbmV3IFBnVGFibGUobmFtZSwgc2NoZW1hLCBiYXNlTmFtZSk7XG4gIGNvbnN0IHBhcnNlZENvbHVtbnMgPSB0eXBlb2YgY29sdW1ucyA9PT0gXCJmdW5jdGlvblwiID8gY29sdW1ucyhnZXRQZ0NvbHVtbkJ1aWxkZXJzKCkpIDogY29sdW1ucztcbiAgY29uc3QgYnVpbHRDb2x1bW5zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHBhcnNlZENvbHVtbnMpLm1hcCgoW25hbWUyLCBjb2xCdWlsZGVyQmFzZV0pID0+IHtcbiAgICAgIGNvbnN0IGNvbEJ1aWxkZXIgPSBjb2xCdWlsZGVyQmFzZTtcbiAgICAgIGNvbEJ1aWxkZXIuc2V0TmFtZShuYW1lMik7XG4gICAgICBjb25zdCBjb2x1bW4gPSBjb2xCdWlsZGVyLmJ1aWxkKHJhd1RhYmxlKTtcbiAgICAgIHJhd1RhYmxlW0lubGluZUZvcmVpZ25LZXlzXS5wdXNoKC4uLmNvbEJ1aWxkZXIuYnVpbGRGb3JlaWduS2V5cyhjb2x1bW4sIHJhd1RhYmxlKSk7XG4gICAgICByZXR1cm4gW25hbWUyLCBjb2x1bW5dO1xuICAgIH0pXG4gICk7XG4gIGNvbnN0IGJ1aWx0Q29sdW1uc0ZvckV4dHJhQ29uZmlnID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHBhcnNlZENvbHVtbnMpLm1hcCgoW25hbWUyLCBjb2xCdWlsZGVyQmFzZV0pID0+IHtcbiAgICAgIGNvbnN0IGNvbEJ1aWxkZXIgPSBjb2xCdWlsZGVyQmFzZTtcbiAgICAgIGNvbEJ1aWxkZXIuc2V0TmFtZShuYW1lMik7XG4gICAgICBjb25zdCBjb2x1bW4gPSBjb2xCdWlsZGVyLmJ1aWxkRXh0cmFDb25maWdDb2x1bW4ocmF3VGFibGUpO1xuICAgICAgcmV0dXJuIFtuYW1lMiwgY29sdW1uXTtcbiAgICB9KVxuICApO1xuICBjb25zdCB0YWJsZSA9IE9iamVjdC5hc3NpZ24ocmF3VGFibGUsIGJ1aWx0Q29sdW1ucyk7XG4gIHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSA9IGJ1aWx0Q29sdW1ucztcbiAgdGFibGVbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQ29sdW1uc10gPSBidWlsdENvbHVtbnNGb3JFeHRyYUNvbmZpZztcbiAgaWYgKGV4dHJhQ29uZmlnKSB7XG4gICAgdGFibGVbUGdUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXSA9IGV4dHJhQ29uZmlnO1xuICB9XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHRhYmxlLCB7XG4gICAgZW5hYmxlUkxTOiAoKSA9PiB7XG4gICAgICB0YWJsZVtQZ1RhYmxlLlN5bWJvbC5FbmFibGVSTFNdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG4gIH0pO1xufVxuY29uc3QgcGdUYWJsZSA9IChuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZykgPT4ge1xuICByZXR1cm4gcGdUYWJsZVdpdGhTY2hlbWEobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcsIHZvaWQgMCk7XG59O1xuZnVuY3Rpb24gcGdUYWJsZUNyZWF0b3IoY3VzdG9taXplVGFibGVOYW1lKSB7XG4gIHJldHVybiAobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcpID0+IHtcbiAgICByZXR1cm4gcGdUYWJsZVdpdGhTY2hlbWEoY3VzdG9taXplVGFibGVOYW1lKG5hbWUpLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgdm9pZCAwLCBuYW1lKTtcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIEVuYWJsZVJMUyxcbiAgSW5saW5lRm9yZWlnbktleXMsXG4gIFBnVGFibGUsXG4gIHBnVGFibGUsXG4gIHBnVGFibGVDcmVhdG9yLFxuICBwZ1RhYmxlV2l0aFNjaGVtYVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhYmxlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFBnVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuZnVuY3Rpb24gcHJpbWFyeUtleSguLi5jb25maWcpIHtcbiAgaWYgKGNvbmZpZ1swXS5jb2x1bW5zKSB7XG4gICAgcmV0dXJuIG5ldyBQcmltYXJ5S2V5QnVpbGRlcihjb25maWdbMF0uY29sdW1ucywgY29uZmlnWzBdLm5hbWUpO1xuICB9XG4gIHJldHVybiBuZXcgUHJpbWFyeUtleUJ1aWxkZXIoY29uZmlnKTtcbn1cbmNsYXNzIFByaW1hcnlLZXlCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdQcmltYXJ5S2V5QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbHVtbnM7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbmFtZTtcbiAgY29uc3RydWN0b3IoY29sdW1ucywgbmFtZSkge1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBQcmltYXJ5S2V5KHRhYmxlLCB0aGlzLmNvbHVtbnMsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFByaW1hcnlLZXkge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29sdW1ucywgbmFtZSkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdQcmltYXJ5S2V5XCI7XG4gIGNvbHVtbnM7XG4gIG5hbWU7XG4gIGdldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZSA/PyBgJHt0aGlzLnRhYmxlW1BnVGFibGUuU3ltYm9sLk5hbWVdfV8ke3RoaXMuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpLmpvaW4oXCJfXCIpfV9wa2A7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFByaW1hcnlLZXksXG4gIFByaW1hcnlLZXlCdWlsZGVyLFxuICBwcmltYXJ5S2V5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJpbWFyeS1rZXlzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uLy4uL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS5qc1wiO1xuaW1wb3J0IHtcbiAgaXNEcml2ZXJWYWx1ZUVuY29kZXIsXG4gIGlzU1FMV3JhcHBlcixcbiAgUGFyYW0sXG4gIFBsYWNlaG9sZGVyLFxuICBTUUwsXG4gIHNxbCxcbiAgU3RyaW5nQ2h1bmssXG4gIFZpZXdcbn0gZnJvbSBcIi4uL3NxbC5qc1wiO1xuZnVuY3Rpb24gYmluZElmUGFyYW0odmFsdWUsIGNvbHVtbikge1xuICBpZiAoaXNEcml2ZXJWYWx1ZUVuY29kZXIoY29sdW1uKSAmJiAhaXNTUUxXcmFwcGVyKHZhbHVlKSAmJiAhaXModmFsdWUsIFBhcmFtKSAmJiAhaXModmFsdWUsIFBsYWNlaG9sZGVyKSAmJiAhaXModmFsdWUsIENvbHVtbikgJiYgIWlzKHZhbHVlLCBUYWJsZSkgJiYgIWlzKHZhbHVlLCBWaWV3KSkge1xuICAgIHJldHVybiBuZXcgUGFyYW0odmFsdWUsIGNvbHVtbik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuY29uc3QgZXEgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9ID0gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5jb25zdCBuZSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPD4gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5mdW5jdGlvbiBhbmQoLi4udW5maWx0ZXJlZENvbmRpdGlvbnMpIHtcbiAgY29uc3QgY29uZGl0aW9ucyA9IHVuZmlsdGVyZWRDb25kaXRpb25zLmZpbHRlcihcbiAgICAoYykgPT4gYyAhPT0gdm9pZCAwXG4gICk7XG4gIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoY29uZGl0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUwoW1xuICAgIG5ldyBTdHJpbmdDaHVuayhcIihcIiksXG4gICAgc3FsLmpvaW4oY29uZGl0aW9ucywgbmV3IFN0cmluZ0NodW5rKFwiIGFuZCBcIikpLFxuICAgIG5ldyBTdHJpbmdDaHVuayhcIilcIilcbiAgXSk7XG59XG5mdW5jdGlvbiBvciguLi51bmZpbHRlcmVkQ29uZGl0aW9ucykge1xuICBjb25zdCBjb25kaXRpb25zID0gdW5maWx0ZXJlZENvbmRpdGlvbnMuZmlsdGVyKFxuICAgIChjKSA9PiBjICE9PSB2b2lkIDBcbiAgKTtcbiAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gbmV3IFNRTChjb25kaXRpb25zKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTChbXG4gICAgbmV3IFN0cmluZ0NodW5rKFwiKFwiKSxcbiAgICBzcWwuam9pbihjb25kaXRpb25zLCBuZXcgU3RyaW5nQ2h1bmsoXCIgb3IgXCIpKSxcbiAgICBuZXcgU3RyaW5nQ2h1bmsoXCIpXCIpXG4gIF0pO1xufVxuZnVuY3Rpb24gbm90KGNvbmRpdGlvbikge1xuICByZXR1cm4gc3FsYG5vdCAke2NvbmRpdGlvbn1gO1xufVxuY29uc3QgZ3QgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9ID4gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5jb25zdCBndGUgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9ID49ICR7YmluZElmUGFyYW0ocmlnaHQsIGxlZnQpfWA7XG59O1xuY29uc3QgbHQgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9IDwgJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5jb25zdCBsdGUgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9IDw9ICR7YmluZElmUGFyYW0ocmlnaHQsIGxlZnQpfWA7XG59O1xuZnVuY3Rpb24gaW5BcnJheShjb2x1bW4sIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBzcWxgZmFsc2VgO1xuICAgIH1cbiAgICByZXR1cm4gc3FsYCR7Y29sdW1ufSBpbiAke3ZhbHVlcy5tYXAoKHYpID0+IGJpbmRJZlBhcmFtKHYsIGNvbHVtbikpfWA7XG4gIH1cbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gaW4gJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbn1cbmZ1bmN0aW9uIG5vdEluQXJyYXkoY29sdW1uLCB2YWx1ZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gc3FsYHRydWVgO1xuICAgIH1cbiAgICByZXR1cm4gc3FsYCR7Y29sdW1ufSBub3QgaW4gJHt2YWx1ZXMubWFwKCh2KSA9PiBiaW5kSWZQYXJhbSh2LCBjb2x1bW4pKX1gO1xuICB9XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IG5vdCBpbiAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xufVxuZnVuY3Rpb24gaXNOdWxsKHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHt2YWx1ZX0gaXMgbnVsbGA7XG59XG5mdW5jdGlvbiBpc05vdE51bGwodmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke3ZhbHVlfSBpcyBub3QgbnVsbGA7XG59XG5mdW5jdGlvbiBleGlzdHMoc3VicXVlcnkpIHtcbiAgcmV0dXJuIHNxbGBleGlzdHMgJHtzdWJxdWVyeX1gO1xufVxuZnVuY3Rpb24gbm90RXhpc3RzKHN1YnF1ZXJ5KSB7XG4gIHJldHVybiBzcWxgbm90IGV4aXN0cyAke3N1YnF1ZXJ5fWA7XG59XG5mdW5jdGlvbiBiZXR3ZWVuKGNvbHVtbiwgbWluLCBtYXgpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gYmV0d2VlbiAke2JpbmRJZlBhcmFtKG1pbiwgY29sdW1uKX0gYW5kICR7YmluZElmUGFyYW0oXG4gICAgbWF4LFxuICAgIGNvbHVtblxuICApfWA7XG59XG5mdW5jdGlvbiBub3RCZXR3ZWVuKGNvbHVtbiwgbWluLCBtYXgpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbm90IGJldHdlZW4gJHtiaW5kSWZQYXJhbShcbiAgICBtaW4sXG4gICAgY29sdW1uXG4gICl9IGFuZCAke2JpbmRJZlBhcmFtKG1heCwgY29sdW1uKX1gO1xufVxuZnVuY3Rpb24gbGlrZShjb2x1bW4sIHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGxpa2UgJHt2YWx1ZX1gO1xufVxuZnVuY3Rpb24gbm90TGlrZShjb2x1bW4sIHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IG5vdCBsaWtlICR7dmFsdWV9YDtcbn1cbmZ1bmN0aW9uIGlsaWtlKGNvbHVtbiwgdmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gaWxpa2UgJHt2YWx1ZX1gO1xufVxuZnVuY3Rpb24gbm90SWxpa2UoY29sdW1uLCB2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBub3QgaWxpa2UgJHt2YWx1ZX1gO1xufVxuZnVuY3Rpb24gYXJyYXlDb250YWlucyhjb2x1bW4sIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5Q29udGFpbnMgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHZhbHVlXCIpO1xuICAgIH1cbiAgICBjb25zdCBhcnJheSA9IHNxbGAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xuICAgIHJldHVybiBzcWxgJHtjb2x1bW59IEA+ICR7YXJyYXl9YDtcbiAgfVxuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBAPiAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xufVxuZnVuY3Rpb24gYXJyYXlDb250YWluZWQoY29sdW1uLCB2YWx1ZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcnJheUNvbnRhaW5lZCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWVcIik7XG4gICAgfVxuICAgIGNvbnN0IGFycmF5ID0gc3FsYCR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG4gICAgcmV0dXJuIHNxbGAke2NvbHVtbn0gPEAgJHthcnJheX1gO1xuICB9XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IDxAICR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG59XG5mdW5jdGlvbiBhcnJheU92ZXJsYXBzKGNvbHVtbiwgdmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXJyYXlPdmVybGFwcyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWVcIik7XG4gICAgfVxuICAgIGNvbnN0IGFycmF5ID0gc3FsYCR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG4gICAgcmV0dXJuIHNxbGAke2NvbHVtbn0gJiYgJHthcnJheX1gO1xuICB9XG4gIHJldHVybiBzcWxgJHtjb2x1bW59ICYmICR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG59XG5leHBvcnQge1xuICBhbmQsXG4gIGFycmF5Q29udGFpbmVkLFxuICBhcnJheUNvbnRhaW5zLFxuICBhcnJheU92ZXJsYXBzLFxuICBiZXR3ZWVuLFxuICBiaW5kSWZQYXJhbSxcbiAgZXEsXG4gIGV4aXN0cyxcbiAgZ3QsXG4gIGd0ZSxcbiAgaWxpa2UsXG4gIGluQXJyYXksXG4gIGlzTm90TnVsbCxcbiAgaXNOdWxsLFxuICBsaWtlLFxuICBsdCxcbiAgbHRlLFxuICBuZSxcbiAgbm90LFxuICBub3RCZXR3ZWVuLFxuICBub3RFeGlzdHMsXG4gIG5vdElsaWtlLFxuICBub3RJbkFycmF5LFxuICBub3RMaWtlLFxuICBvclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmRpdGlvbnMuanMubWFwIiwKICAgICJpbXBvcnQgeyBzcWwgfSBmcm9tIFwiLi4vc3FsLmpzXCI7XG5mdW5jdGlvbiBhc2MoY29sdW1uKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGFzY2A7XG59XG5mdW5jdGlvbiBkZXNjKGNvbHVtbikge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBkZXNjYDtcbn1cbmV4cG9ydCB7XG4gIGFzYyxcbiAgZGVzY1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbGVjdC5qcy5tYXAiLAogICAgImltcG9ydCB7IGdldFRhYmxlVW5pcXVlTmFtZSwgVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUHJpbWFyeUtleUJ1aWxkZXIgfSBmcm9tIFwiLi9wZy1jb3JlL3ByaW1hcnkta2V5cy5qc1wiO1xuaW1wb3J0IHtcbiAgYW5kLFxuICBhc2MsXG4gIGJldHdlZW4sXG4gIGRlc2MsXG4gIGVxLFxuICBleGlzdHMsXG4gIGd0LFxuICBndGUsXG4gIGlsaWtlLFxuICBpbkFycmF5LFxuICBpc05vdE51bGwsXG4gIGlzTnVsbCxcbiAgbGlrZSxcbiAgbHQsXG4gIGx0ZSxcbiAgbmUsXG4gIG5vdCxcbiAgbm90QmV0d2VlbixcbiAgbm90RXhpc3RzLFxuICBub3RJbGlrZSxcbiAgbm90SW5BcnJheSxcbiAgbm90TGlrZSxcbiAgb3Jcbn0gZnJvbSBcIi4vc3FsL2V4cHJlc3Npb25zL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTUUwsIHNxbCB9IGZyb20gXCIuL3NxbC9zcWwuanNcIjtcbmNsYXNzIFJlbGF0aW9uIHtcbiAgY29uc3RydWN0b3Ioc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgcmVsYXRpb25OYW1lKSB7XG4gICAgdGhpcy5zb3VyY2VUYWJsZSA9IHNvdXJjZVRhYmxlO1xuICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlID0gcmVmZXJlbmNlZFRhYmxlO1xuICAgIHRoaXMucmVsYXRpb25OYW1lID0gcmVsYXRpb25OYW1lO1xuICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZVtUYWJsZS5TeW1ib2wuTmFtZV07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUmVsYXRpb25cIjtcbiAgcmVmZXJlbmNlZFRhYmxlTmFtZTtcbiAgZmllbGROYW1lO1xufVxuY2xhc3MgUmVsYXRpb25zIHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJSZWxhdGlvbnNcIjtcbn1cbmNsYXNzIE9uZSBleHRlbmRzIFJlbGF0aW9uIHtcbiAgY29uc3RydWN0b3Ioc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnLCBpc051bGxhYmxlKSB7XG4gICAgc3VwZXIoc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnPy5yZWxhdGlvbk5hbWUpO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuaXNOdWxsYWJsZSA9IGlzTnVsbGFibGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiT25lXCI7XG4gIHdpdGhGaWVsZE5hbWUoZmllbGROYW1lKSB7XG4gICAgY29uc3QgcmVsYXRpb24gPSBuZXcgT25lKFxuICAgICAgdGhpcy5zb3VyY2VUYWJsZSxcbiAgICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICB0aGlzLmlzTnVsbGFibGVcbiAgICApO1xuICAgIHJlbGF0aW9uLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTtcbiAgICByZXR1cm4gcmVsYXRpb247XG4gIH1cbn1cbmNsYXNzIE1hbnkgZXh0ZW5kcyBSZWxhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIGNvbmZpZz8ucmVsYXRpb25OYW1lKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJNYW55XCI7XG4gIHdpdGhGaWVsZE5hbWUoZmllbGROYW1lKSB7XG4gICAgY29uc3QgcmVsYXRpb24gPSBuZXcgTWFueShcbiAgICAgIHRoaXMuc291cmNlVGFibGUsXG4gICAgICB0aGlzLnJlZmVyZW5jZWRUYWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgICByZWxhdGlvbi5maWVsZE5hbWUgPSBmaWVsZE5hbWU7XG4gICAgcmV0dXJuIHJlbGF0aW9uO1xuICB9XG59XG5mdW5jdGlvbiBnZXRPcGVyYXRvcnMoKSB7XG4gIHJldHVybiB7XG4gICAgYW5kLFxuICAgIGJldHdlZW4sXG4gICAgZXEsXG4gICAgZXhpc3RzLFxuICAgIGd0LFxuICAgIGd0ZSxcbiAgICBpbGlrZSxcbiAgICBpbkFycmF5LFxuICAgIGlzTnVsbCxcbiAgICBpc05vdE51bGwsXG4gICAgbGlrZSxcbiAgICBsdCxcbiAgICBsdGUsXG4gICAgbmUsXG4gICAgbm90LFxuICAgIG5vdEJldHdlZW4sXG4gICAgbm90RXhpc3RzLFxuICAgIG5vdExpa2UsXG4gICAgbm90SWxpa2UsXG4gICAgbm90SW5BcnJheSxcbiAgICBvcixcbiAgICBzcWxcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldE9yZGVyQnlPcGVyYXRvcnMoKSB7XG4gIHJldHVybiB7XG4gICAgc3FsLFxuICAgIGFzYyxcbiAgICBkZXNjXG4gIH07XG59XG5mdW5jdGlvbiBleHRyYWN0VGFibGVzUmVsYXRpb25hbENvbmZpZyhzY2hlbWEsIGNvbmZpZ0hlbHBlcnMpIHtcbiAgaWYgKE9iamVjdC5rZXlzKHNjaGVtYSkubGVuZ3RoID09PSAxICYmIFwiZGVmYXVsdFwiIGluIHNjaGVtYSAmJiAhaXMoc2NoZW1hW1wiZGVmYXVsdFwiXSwgVGFibGUpKSB7XG4gICAgc2NoZW1hID0gc2NoZW1hW1wiZGVmYXVsdFwiXTtcbiAgfVxuICBjb25zdCB0YWJsZU5hbWVzTWFwID0ge307XG4gIGNvbnN0IHJlbGF0aW9uc0J1ZmZlciA9IHt9O1xuICBjb25zdCB0YWJsZXNDb25maWcgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgIGlmIChpcyh2YWx1ZSwgVGFibGUpKSB7XG4gICAgICBjb25zdCBkYk5hbWUgPSBnZXRUYWJsZVVuaXF1ZU5hbWUodmFsdWUpO1xuICAgICAgY29uc3QgYnVmZmVyZWRSZWxhdGlvbnMgPSByZWxhdGlvbnNCdWZmZXJbZGJOYW1lXTtcbiAgICAgIHRhYmxlTmFtZXNNYXBbZGJOYW1lXSA9IGtleTtcbiAgICAgIHRhYmxlc0NvbmZpZ1trZXldID0ge1xuICAgICAgICB0c05hbWU6IGtleSxcbiAgICAgICAgZGJOYW1lOiB2YWx1ZVtUYWJsZS5TeW1ib2wuTmFtZV0sXG4gICAgICAgIHNjaGVtYTogdmFsdWVbVGFibGUuU3ltYm9sLlNjaGVtYV0sXG4gICAgICAgIGNvbHVtbnM6IHZhbHVlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSxcbiAgICAgICAgcmVsYXRpb25zOiBidWZmZXJlZFJlbGF0aW9ucz8ucmVsYXRpb25zID8/IHt9LFxuICAgICAgICBwcmltYXJ5S2V5OiBidWZmZXJlZFJlbGF0aW9ucz8ucHJpbWFyeUtleSA/PyBbXVxuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIE9iamVjdC52YWx1ZXMoXG4gICAgICAgIHZhbHVlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXVxuICAgICAgKSkge1xuICAgICAgICBpZiAoY29sdW1uLnByaW1hcnkpIHtcbiAgICAgICAgICB0YWJsZXNDb25maWdba2V5XS5wcmltYXJ5S2V5LnB1c2goY29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZXh0cmFDb25maWcgPSB2YWx1ZVtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXT8uKHZhbHVlW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0NvbHVtbnNdKTtcbiAgICAgIGlmIChleHRyYUNvbmZpZykge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbmZpZ0VudHJ5IG9mIE9iamVjdC52YWx1ZXMoZXh0cmFDb25maWcpKSB7XG4gICAgICAgICAgaWYgKGlzKGNvbmZpZ0VudHJ5LCBQcmltYXJ5S2V5QnVpbGRlcikpIHtcbiAgICAgICAgICAgIHRhYmxlc0NvbmZpZ1trZXldLnByaW1hcnlLZXkucHVzaCguLi5jb25maWdFbnRyeS5jb2x1bW5zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzKHZhbHVlLCBSZWxhdGlvbnMpKSB7XG4gICAgICBjb25zdCBkYk5hbWUgPSBnZXRUYWJsZVVuaXF1ZU5hbWUodmFsdWUudGFibGUpO1xuICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVOYW1lc01hcFtkYk5hbWVdO1xuICAgICAgY29uc3QgcmVsYXRpb25zMiA9IHZhbHVlLmNvbmZpZyhcbiAgICAgICAgY29uZmlnSGVscGVycyh2YWx1ZS50YWJsZSlcbiAgICAgICk7XG4gICAgICBsZXQgcHJpbWFyeUtleTtcbiAgICAgIGZvciAoY29uc3QgW3JlbGF0aW9uTmFtZSwgcmVsYXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKHJlbGF0aW9uczIpKSB7XG4gICAgICAgIGlmICh0YWJsZU5hbWUpIHtcbiAgICAgICAgICBjb25zdCB0YWJsZUNvbmZpZyA9IHRhYmxlc0NvbmZpZ1t0YWJsZU5hbWVdO1xuICAgICAgICAgIHRhYmxlQ29uZmlnLnJlbGF0aW9uc1tyZWxhdGlvbk5hbWVdID0gcmVsYXRpb247XG4gICAgICAgICAgaWYgKHByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgIHRhYmxlQ29uZmlnLnByaW1hcnlLZXkucHVzaCguLi5wcmltYXJ5S2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCEoZGJOYW1lIGluIHJlbGF0aW9uc0J1ZmZlcikpIHtcbiAgICAgICAgICAgIHJlbGF0aW9uc0J1ZmZlcltkYk5hbWVdID0ge1xuICAgICAgICAgICAgICByZWxhdGlvbnM6IHt9LFxuICAgICAgICAgICAgICBwcmltYXJ5S2V5XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWxhdGlvbnNCdWZmZXJbZGJOYW1lXS5yZWxhdGlvbnNbcmVsYXRpb25OYW1lXSA9IHJlbGF0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHRhYmxlczogdGFibGVzQ29uZmlnLCB0YWJsZU5hbWVzTWFwIH07XG59XG5mdW5jdGlvbiByZWxhdGlvbnModGFibGUsIHJlbGF0aW9uczIpIHtcbiAgcmV0dXJuIG5ldyBSZWxhdGlvbnMoXG4gICAgdGFibGUsXG4gICAgKGhlbHBlcnMpID0+IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJlbGF0aW9uczIoaGVscGVycykpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWUud2l0aEZpZWxkTmFtZShrZXkpXG4gICAgICBdKVxuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU9uZShzb3VyY2VUYWJsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gb25lKHRhYmxlLCBjb25maWcpIHtcbiAgICByZXR1cm4gbmV3IE9uZShcbiAgICAgIHNvdXJjZVRhYmxlLFxuICAgICAgdGFibGUsXG4gICAgICBjb25maWcsXG4gICAgICBjb25maWc/LmZpZWxkcy5yZWR1Y2UoKHJlcywgZikgPT4gcmVzICYmIGYubm90TnVsbCwgdHJ1ZSkgPz8gZmFsc2VcbiAgICApO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlTWFueShzb3VyY2VUYWJsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gbWFueShyZWZlcmVuY2VkVGFibGUsIGNvbmZpZykge1xuICAgIHJldHVybiBuZXcgTWFueShzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCBjb25maWcpO1xuICB9O1xufVxuZnVuY3Rpb24gbm9ybWFsaXplUmVsYXRpb24oc2NoZW1hLCB0YWJsZU5hbWVzTWFwLCByZWxhdGlvbikge1xuICBpZiAoaXMocmVsYXRpb24sIE9uZSkgJiYgcmVsYXRpb24uY29uZmlnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpZWxkczogcmVsYXRpb24uY29uZmlnLmZpZWxkcyxcbiAgICAgIHJlZmVyZW5jZXM6IHJlbGF0aW9uLmNvbmZpZy5yZWZlcmVuY2VzXG4gICAgfTtcbiAgfVxuICBjb25zdCByZWZlcmVuY2VkVGFibGVUc05hbWUgPSB0YWJsZU5hbWVzTWFwW2dldFRhYmxlVW5pcXVlTmFtZShyZWxhdGlvbi5yZWZlcmVuY2VkVGFibGUpXTtcbiAgaWYgKCFyZWZlcmVuY2VkVGFibGVUc05hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGFibGUgXCIke3JlbGF0aW9uLnJlZmVyZW5jZWRUYWJsZVtUYWJsZS5TeW1ib2wuTmFtZV19XCIgbm90IGZvdW5kIGluIHNjaGVtYWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHJlZmVyZW5jZWRUYWJsZUNvbmZpZyA9IHNjaGVtYVtyZWZlcmVuY2VkVGFibGVUc05hbWVdO1xuICBpZiAoIXJlZmVyZW5jZWRUYWJsZUNvbmZpZykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3JlZmVyZW5jZWRUYWJsZVRzTmFtZX1cIiBub3QgZm91bmQgaW4gc2NoZW1hYCk7XG4gIH1cbiAgY29uc3Qgc291cmNlVGFibGUgPSByZWxhdGlvbi5zb3VyY2VUYWJsZTtcbiAgY29uc3Qgc291cmNlVGFibGVUc05hbWUgPSB0YWJsZU5hbWVzTWFwW2dldFRhYmxlVW5pcXVlTmFtZShzb3VyY2VUYWJsZSldO1xuICBpZiAoIXNvdXJjZVRhYmxlVHNOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRhYmxlIFwiJHtzb3VyY2VUYWJsZVtUYWJsZS5TeW1ib2wuTmFtZV19XCIgbm90IGZvdW5kIGluIHNjaGVtYWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHJldmVyc2VSZWxhdGlvbnMgPSBbXTtcbiAgZm9yIChjb25zdCByZWZlcmVuY2VkVGFibGVSZWxhdGlvbiBvZiBPYmplY3QudmFsdWVzKFxuICAgIHJlZmVyZW5jZWRUYWJsZUNvbmZpZy5yZWxhdGlvbnNcbiAgKSkge1xuICAgIGlmIChyZWxhdGlvbi5yZWxhdGlvbk5hbWUgJiYgcmVsYXRpb24gIT09IHJlZmVyZW5jZWRUYWJsZVJlbGF0aW9uICYmIHJlZmVyZW5jZWRUYWJsZVJlbGF0aW9uLnJlbGF0aW9uTmFtZSA9PT0gcmVsYXRpb24ucmVsYXRpb25OYW1lIHx8ICFyZWxhdGlvbi5yZWxhdGlvbk5hbWUgJiYgcmVmZXJlbmNlZFRhYmxlUmVsYXRpb24ucmVmZXJlbmNlZFRhYmxlID09PSByZWxhdGlvbi5zb3VyY2VUYWJsZSkge1xuICAgICAgcmV2ZXJzZVJlbGF0aW9ucy5wdXNoKHJlZmVyZW5jZWRUYWJsZVJlbGF0aW9uKTtcbiAgICB9XG4gIH1cbiAgaWYgKHJldmVyc2VSZWxhdGlvbnMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IHJlbGF0aW9uLnJlbGF0aW9uTmFtZSA/IG5ldyBFcnJvcihcbiAgICAgIGBUaGVyZSBhcmUgbXVsdGlwbGUgcmVsYXRpb25zIHdpdGggbmFtZSBcIiR7cmVsYXRpb24ucmVsYXRpb25OYW1lfVwiIGluIHRhYmxlIFwiJHtyZWZlcmVuY2VkVGFibGVUc05hbWV9XCJgXG4gICAgKSA6IG5ldyBFcnJvcihcbiAgICAgIGBUaGVyZSBhcmUgbXVsdGlwbGUgcmVsYXRpb25zIGJldHdlZW4gXCIke3JlZmVyZW5jZWRUYWJsZVRzTmFtZX1cIiBhbmQgXCIke3JlbGF0aW9uLnNvdXJjZVRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXX1cIi4gUGxlYXNlIHNwZWNpZnkgcmVsYXRpb24gbmFtZWBcbiAgICApO1xuICB9XG4gIGlmIChyZXZlcnNlUmVsYXRpb25zWzBdICYmIGlzKHJldmVyc2VSZWxhdGlvbnNbMF0sIE9uZSkgJiYgcmV2ZXJzZVJlbGF0aW9uc1swXS5jb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmllbGRzOiByZXZlcnNlUmVsYXRpb25zWzBdLmNvbmZpZy5yZWZlcmVuY2VzLFxuICAgICAgcmVmZXJlbmNlczogcmV2ZXJzZVJlbGF0aW9uc1swXS5jb25maWcuZmllbGRzXG4gICAgfTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFRoZXJlIGlzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gaW5mZXIgcmVsYXRpb24gXCIke3NvdXJjZVRhYmxlVHNOYW1lfS4ke3JlbGF0aW9uLmZpZWxkTmFtZX1cImBcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRhYmxlUmVsYXRpb25zSGVscGVycyhzb3VyY2VUYWJsZSkge1xuICByZXR1cm4ge1xuICAgIG9uZTogY3JlYXRlT25lKHNvdXJjZVRhYmxlKSxcbiAgICBtYW55OiBjcmVhdGVNYW55KHNvdXJjZVRhYmxlKVxuICB9O1xufVxuZnVuY3Rpb24gbWFwUmVsYXRpb25hbFJvdyh0YWJsZXNDb25maWcsIHRhYmxlQ29uZmlnLCByb3csIGJ1aWxkUXVlcnlSZXN1bHRTZWxlY3Rpb24sIG1hcENvbHVtblZhbHVlID0gKHZhbHVlKSA9PiB2YWx1ZSkge1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBbXG4gICAgc2VsZWN0aW9uSXRlbUluZGV4LFxuICAgIHNlbGVjdGlvbkl0ZW1cbiAgXSBvZiBidWlsZFF1ZXJ5UmVzdWx0U2VsZWN0aW9uLmVudHJpZXMoKSkge1xuICAgIGlmIChzZWxlY3Rpb25JdGVtLmlzSnNvbikge1xuICAgICAgY29uc3QgcmVsYXRpb24gPSB0YWJsZUNvbmZpZy5yZWxhdGlvbnNbc2VsZWN0aW9uSXRlbS50c0tleV07XG4gICAgICBjb25zdCByYXdTdWJSb3dzID0gcm93W3NlbGVjdGlvbkl0ZW1JbmRleF07XG4gICAgICBjb25zdCBzdWJSb3dzID0gdHlwZW9mIHJhd1N1YlJvd3MgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHJhd1N1YlJvd3MpIDogcmF3U3ViUm93cztcbiAgICAgIHJlc3VsdFtzZWxlY3Rpb25JdGVtLnRzS2V5XSA9IGlzKHJlbGF0aW9uLCBPbmUpID8gc3ViUm93cyAmJiBtYXBSZWxhdGlvbmFsUm93KFxuICAgICAgICB0YWJsZXNDb25maWcsXG4gICAgICAgIHRhYmxlc0NvbmZpZ1tzZWxlY3Rpb25JdGVtLnJlbGF0aW9uVGFibGVUc0tleV0sXG4gICAgICAgIHN1YlJvd3MsXG4gICAgICAgIHNlbGVjdGlvbkl0ZW0uc2VsZWN0aW9uLFxuICAgICAgICBtYXBDb2x1bW5WYWx1ZVxuICAgICAgKSA6IHN1YlJvd3MubWFwKFxuICAgICAgICAoc3ViUm93KSA9PiBtYXBSZWxhdGlvbmFsUm93KFxuICAgICAgICAgIHRhYmxlc0NvbmZpZyxcbiAgICAgICAgICB0YWJsZXNDb25maWdbc2VsZWN0aW9uSXRlbS5yZWxhdGlvblRhYmxlVHNLZXldLFxuICAgICAgICAgIHN1YlJvdyxcbiAgICAgICAgICBzZWxlY3Rpb25JdGVtLnNlbGVjdGlvbixcbiAgICAgICAgICBtYXBDb2x1bW5WYWx1ZVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG1hcENvbHVtblZhbHVlKHJvd1tzZWxlY3Rpb25JdGVtSW5kZXhdKTtcbiAgICAgIGNvbnN0IGZpZWxkID0gc2VsZWN0aW9uSXRlbS5maWVsZDtcbiAgICAgIGxldCBkZWNvZGVyO1xuICAgICAgaWYgKGlzKGZpZWxkLCBDb2x1bW4pKSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZDtcbiAgICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIFNRTCkpIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkLmRlY29kZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQuc3FsLmRlY29kZXI7XG4gICAgICB9XG4gICAgICByZXN1bHRbc2VsZWN0aW9uSXRlbS50c0tleV0gPSB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBkZWNvZGVyLm1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQge1xuICBNYW55LFxuICBPbmUsXG4gIFJlbGF0aW9uLFxuICBSZWxhdGlvbnMsXG4gIGNyZWF0ZU1hbnksXG4gIGNyZWF0ZU9uZSxcbiAgY3JlYXRlVGFibGVSZWxhdGlvbnNIZWxwZXJzLFxuICBleHRyYWN0VGFibGVzUmVsYXRpb25hbENvbmZpZyxcbiAgZ2V0T3BlcmF0b3JzLFxuICBnZXRPcmRlckJ5T3BlcmF0b3JzLFxuICBtYXBSZWxhdGlvbmFsUm93LFxuICBub3JtYWxpemVSZWxhdGlvbixcbiAgcmVsYXRpb25zXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVsYXRpb25zLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFZpZXcgfSBmcm9tIFwiLi4vc3FsL3NxbC5qc1wiO1xuY2xhc3MgU1FMaXRlVmlld0Jhc2UgZXh0ZW5kcyBWaWV3IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVmlld0Jhc2VcIjtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZVZpZXdCYXNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmlldy1iYXNlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgYWxpYXNlZFRhYmxlLCBhbGlhc2VkVGFibGVDb2x1bW4sIG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzLCBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzIH0gZnJvbSBcIi4uL2FsaWFzLmpzXCI7XG5pbXBvcnQgeyBDYXNpbmdDYWNoZSB9IGZyb20gXCIuLi9jYXNpbmcuanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgRHJpenpsZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0T3BlcmF0b3JzLFxuICBnZXRPcmRlckJ5T3BlcmF0b3JzLFxuICBNYW55LFxuICBub3JtYWxpemVSZWxhdGlvbixcbiAgT25lXG59IGZyb20gXCIuLi9yZWxhdGlvbnMuanNcIjtcbmltcG9ydCB7IGFuZCwgZXEgfSBmcm9tIFwiLi4vc3FsL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBQYXJhbSwgU1FMLCBzcWwgfSBmcm9tIFwiLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1ucy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IGdldFRhYmxlTmFtZSwgZ2V0VGFibGVVbmlxdWVOYW1lLCBUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgb3JkZXJTZWxlY3RlZEZpZWxkcyB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IFNRTGl0ZVZpZXdCYXNlIH0gZnJvbSBcIi4vdmlldy1iYXNlLmpzXCI7XG5jbGFzcyBTUUxpdGVEaWFsZWN0IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlRGlhbGVjdFwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNhc2luZztcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5jYXNpbmcgPSBuZXcgQ2FzaW5nQ2FjaGUoY29uZmlnPy5jYXNpbmcpO1xuICB9XG4gIGVzY2FwZU5hbWUobmFtZSkge1xuICAgIHJldHVybiBgXCIke25hbWV9XCJgO1xuICB9XG4gIGVzY2FwZVBhcmFtKF9udW0pIHtcbiAgICByZXR1cm4gXCI/XCI7XG4gIH1cbiAgZXNjYXBlU3RyaW5nKHN0cikge1xuICAgIHJldHVybiBgJyR7c3RyLnJlcGxhY2UoLycvZywgXCInJ1wiKX0nYDtcbiAgfVxuICBidWlsZFdpdGhDVEUocXVlcmllcykge1xuICAgIGlmICghcXVlcmllcz8ubGVuZ3RoKSByZXR1cm4gdm9pZCAwO1xuICAgIGNvbnN0IHdpdGhTcWxDaHVua3MgPSBbc3FsYHdpdGggYF07XG4gICAgZm9yIChjb25zdCBbaSwgd10gb2YgcXVlcmllcy5lbnRyaWVzKCkpIHtcbiAgICAgIHdpdGhTcWxDaHVua3MucHVzaChzcWxgJHtzcWwuaWRlbnRpZmllcih3Ll8uYWxpYXMpfSBhcyAoJHt3Ll8uc3FsfSlgKTtcbiAgICAgIGlmIChpIDwgcXVlcmllcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHdpdGhTcWxDaHVua3MucHVzaChzcWxgLCBgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2l0aFNxbENodW5rcy5wdXNoKHNxbGAgYCk7XG4gICAgcmV0dXJuIHNxbC5qb2luKHdpdGhTcWxDaHVua3MpO1xuICB9XG4gIGJ1aWxkRGVsZXRlUXVlcnkoeyB0YWJsZSwgd2hlcmUsIHJldHVybmluZywgd2l0aExpc3QsIGxpbWl0LCBvcmRlckJ5IH0pIHtcbiAgICBjb25zdCB3aXRoU3FsID0gdGhpcy5idWlsZFdpdGhDVEUod2l0aExpc3QpO1xuICAgIGNvbnN0IHJldHVybmluZ1NxbCA9IHJldHVybmluZyA/IHNxbGAgcmV0dXJuaW5nICR7dGhpcy5idWlsZFNlbGVjdGlvbihyZXR1cm5pbmcsIHsgaXNTaW5nbGVUYWJsZTogdHJ1ZSB9KX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IHdoZXJlU3FsID0gd2hlcmUgPyBzcWxgIHdoZXJlICR7d2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBvcmRlckJ5U3FsID0gdGhpcy5idWlsZE9yZGVyQnkob3JkZXJCeSk7XG4gICAgY29uc3QgbGltaXRTcWwgPSB0aGlzLmJ1aWxkTGltaXQobGltaXQpO1xuICAgIHJldHVybiBzcWxgJHt3aXRoU3FsfWRlbGV0ZSBmcm9tICR7dGFibGV9JHt3aGVyZVNxbH0ke3JldHVybmluZ1NxbH0ke29yZGVyQnlTcWx9JHtsaW1pdFNxbH1gO1xuICB9XG4gIGJ1aWxkVXBkYXRlU2V0KHRhYmxlLCBzZXQpIHtcbiAgICBjb25zdCB0YWJsZUNvbHVtbnMgPSB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gICAgY29uc3QgY29sdW1uTmFtZXMgPSBPYmplY3Qua2V5cyh0YWJsZUNvbHVtbnMpLmZpbHRlcihcbiAgICAgIChjb2xOYW1lKSA9PiBzZXRbY29sTmFtZV0gIT09IHZvaWQgMCB8fCB0YWJsZUNvbHVtbnNbY29sTmFtZV0/Lm9uVXBkYXRlRm4gIT09IHZvaWQgMFxuICAgICk7XG4gICAgY29uc3Qgc2V0U2l6ZSA9IGNvbHVtbk5hbWVzLmxlbmd0aDtcbiAgICByZXR1cm4gc3FsLmpvaW4oY29sdW1uTmFtZXMuZmxhdE1hcCgoY29sTmFtZSwgaSkgPT4ge1xuICAgICAgY29uc3QgY29sID0gdGFibGVDb2x1bW5zW2NvbE5hbWVdO1xuICAgICAgY29uc3QgdmFsdWUgPSBzZXRbY29sTmFtZV0gPz8gc3FsLnBhcmFtKGNvbC5vblVwZGF0ZUZuKCksIGNvbCk7XG4gICAgICBjb25zdCByZXMgPSBzcWxgJHtzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoY29sKSl9ID0gJHt2YWx1ZX1gO1xuICAgICAgaWYgKGkgPCBzZXRTaXplIC0gMSkge1xuICAgICAgICByZXR1cm4gW3Jlcywgc3FsLnJhdyhcIiwgXCIpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbcmVzXTtcbiAgICB9KSk7XG4gIH1cbiAgYnVpbGRVcGRhdGVRdWVyeSh7IHRhYmxlLCBzZXQsIHdoZXJlLCByZXR1cm5pbmcsIHdpdGhMaXN0LCBqb2lucywgZnJvbSwgbGltaXQsIG9yZGVyQnkgfSkge1xuICAgIGNvbnN0IHdpdGhTcWwgPSB0aGlzLmJ1aWxkV2l0aENURSh3aXRoTGlzdCk7XG4gICAgY29uc3Qgc2V0U3FsID0gdGhpcy5idWlsZFVwZGF0ZVNldCh0YWJsZSwgc2V0KTtcbiAgICBjb25zdCBmcm9tU3FsID0gZnJvbSAmJiBzcWwuam9pbihbc3FsLnJhdyhcIiBmcm9tIFwiKSwgdGhpcy5idWlsZEZyb21UYWJsZShmcm9tKV0pO1xuICAgIGNvbnN0IGpvaW5zU3FsID0gdGhpcy5idWlsZEpvaW5zKGpvaW5zKTtcbiAgICBjb25zdCByZXR1cm5pbmdTcWwgPSByZXR1cm5pbmcgPyBzcWxgIHJldHVybmluZyAke3RoaXMuYnVpbGRTZWxlY3Rpb24ocmV0dXJuaW5nLCB7IGlzU2luZ2xlVGFibGU6IHRydWUgfSl9YCA6IHZvaWQgMDtcbiAgICBjb25zdCB3aGVyZVNxbCA9IHdoZXJlID8gc3FsYCB3aGVyZSAke3doZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgb3JkZXJCeVNxbCA9IHRoaXMuYnVpbGRPcmRlckJ5KG9yZGVyQnkpO1xuICAgIGNvbnN0IGxpbWl0U3FsID0gdGhpcy5idWlsZExpbWl0KGxpbWl0KTtcbiAgICByZXR1cm4gc3FsYCR7d2l0aFNxbH11cGRhdGUgJHt0YWJsZX0gc2V0ICR7c2V0U3FsfSR7ZnJvbVNxbH0ke2pvaW5zU3FsfSR7d2hlcmVTcWx9JHtyZXR1cm5pbmdTcWx9JHtvcmRlckJ5U3FsfSR7bGltaXRTcWx9YDtcbiAgfVxuICAvKipcbiAgICogQnVpbGRzIHNlbGVjdGlvbiBTUUwgd2l0aCBwcm92aWRlZCBmaWVsZHMvZXhwcmVzc2lvbnNcbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqXG4gICAqIGBzZWxlY3QgPHNlbGVjdGlvbj4gZnJvbWBcbiAgICpcbiAgICogYGluc2VydCAuLi4gcmV0dXJuaW5nIDxzZWxlY3Rpb24+YFxuICAgKlxuICAgKiBJZiBgaXNTaW5nbGVUYWJsZWAgaXMgdHJ1ZSwgdGhlbiBjb2x1bW5zIHdvbid0IGJlIHByZWZpeGVkIHdpdGggdGFibGUgbmFtZVxuICAgKi9cbiAgYnVpbGRTZWxlY3Rpb24oZmllbGRzLCB7IGlzU2luZ2xlVGFibGUgPSBmYWxzZSB9ID0ge30pIHtcbiAgICBjb25zdCBjb2x1bW5zTGVuID0gZmllbGRzLmxlbmd0aDtcbiAgICBjb25zdCBjaHVua3MgPSBmaWVsZHMuZmxhdE1hcCgoeyBmaWVsZCB9LCBpKSA9PiB7XG4gICAgICBjb25zdCBjaHVuayA9IFtdO1xuICAgICAgaWYgKGlzKGZpZWxkLCBTUUwuQWxpYXNlZCkgJiYgZmllbGQuaXNTZWxlY3Rpb25GaWVsZCkge1xuICAgICAgICBjaHVuay5wdXNoKHNxbC5pZGVudGlmaWVyKGZpZWxkLmZpZWxkQWxpYXMpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIFNRTC5BbGlhc2VkKSB8fCBpcyhmaWVsZCwgU1FMKSkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGlzKGZpZWxkLCBTUUwuQWxpYXNlZCkgPyBmaWVsZC5zcWwgOiBmaWVsZDtcbiAgICAgICAgaWYgKGlzU2luZ2xlVGFibGUpIHtcbiAgICAgICAgICBjaHVuay5wdXNoKFxuICAgICAgICAgICAgbmV3IFNRTChcbiAgICAgICAgICAgICAgcXVlcnkucXVlcnlDaHVua3MubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzKGMsIENvbHVtbikpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoYykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNodW5rLnB1c2gocXVlcnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpcyhmaWVsZCwgU1FMLkFsaWFzZWQpKSB7XG4gICAgICAgICAgY2h1bmsucHVzaChzcWxgIGFzICR7c3FsLmlkZW50aWZpZXIoZmllbGQuZmllbGRBbGlhcyl9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIENvbHVtbikpIHtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID0gZmllbGQudGFibGVbVGFibGUuU3ltYm9sLk5hbWVdO1xuICAgICAgICBpZiAoZmllbGQuY29sdW1uVHlwZSA9PT0gXCJTUUxpdGVOdW1lcmljQmlnSW50XCIpIHtcbiAgICAgICAgICBpZiAoaXNTaW5nbGVUYWJsZSkge1xuICAgICAgICAgICAgY2h1bmsucHVzaChzcWxgY2FzdCgke3NxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhmaWVsZCkpfSBhcyB0ZXh0KWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaHVuay5wdXNoKFxuICAgICAgICAgICAgICBzcWxgY2FzdCgke3NxbC5pZGVudGlmaWVyKHRhYmxlTmFtZSl9LiR7c3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkKSl9IGFzIHRleHQpYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGlzU2luZ2xlVGFibGUpIHtcbiAgICAgICAgICAgIGNodW5rLnB1c2goc3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkKSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaHVuay5wdXNoKHNxbGAke3NxbC5pZGVudGlmaWVyKHRhYmxlTmFtZSl9LiR7c3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkKSl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA8IGNvbHVtbnNMZW4gLSAxKSB7XG4gICAgICAgIGNodW5rLnB1c2goc3FsYCwgYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2h1bms7XG4gICAgfSk7XG4gICAgcmV0dXJuIHNxbC5qb2luKGNodW5rcyk7XG4gIH1cbiAgYnVpbGRKb2lucyhqb2lucykge1xuICAgIGlmICgham9pbnMgfHwgam9pbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBjb25zdCBqb2luc0FycmF5ID0gW107XG4gICAgaWYgKGpvaW5zKSB7XG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgam9pbk1ldGFdIG9mIGpvaW5zLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICBqb2luc0FycmF5LnB1c2goc3FsYCBgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZSA9IGpvaW5NZXRhLnRhYmxlO1xuICAgICAgICBjb25zdCBvblNxbCA9IGpvaW5NZXRhLm9uID8gc3FsYCBvbiAke2pvaW5NZXRhLm9ufWAgOiB2b2lkIDA7XG4gICAgICAgIGlmIChpcyh0YWJsZSwgU1FMaXRlVGFibGUpKSB7XG4gICAgICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLk5hbWVdO1xuICAgICAgICAgIGNvbnN0IHRhYmxlU2NoZW1hID0gdGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLlNjaGVtYV07XG4gICAgICAgICAgY29uc3Qgb3JpZ1RhYmxlTmFtZSA9IHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWVdO1xuICAgICAgICAgIGNvbnN0IGFsaWFzID0gdGFibGVOYW1lID09PSBvcmlnVGFibGVOYW1lID8gdm9pZCAwIDogam9pbk1ldGEuYWxpYXM7XG4gICAgICAgICAgam9pbnNBcnJheS5wdXNoKFxuICAgICAgICAgICAgc3FsYCR7c3FsLnJhdyhqb2luTWV0YS5qb2luVHlwZSl9IGpvaW4gJHt0YWJsZVNjaGVtYSA/IHNxbGAke3NxbC5pZGVudGlmaWVyKHRhYmxlU2NoZW1hKX0uYCA6IHZvaWQgMH0ke3NxbC5pZGVudGlmaWVyKG9yaWdUYWJsZU5hbWUpfSR7YWxpYXMgJiYgc3FsYCAke3NxbC5pZGVudGlmaWVyKGFsaWFzKX1gfSR7b25TcWx9YFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgam9pbnNBcnJheS5wdXNoKFxuICAgICAgICAgICAgc3FsYCR7c3FsLnJhdyhqb2luTWV0YS5qb2luVHlwZSl9IGpvaW4gJHt0YWJsZX0ke29uU3FsfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA8IGpvaW5zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBqb2luc0FycmF5LnB1c2goc3FsYCBgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3FsLmpvaW4oam9pbnNBcnJheSk7XG4gIH1cbiAgYnVpbGRMaW1pdChsaW1pdCkge1xuICAgIHJldHVybiB0eXBlb2YgbGltaXQgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGxpbWl0ID09PSBcIm51bWJlclwiICYmIGxpbWl0ID49IDAgPyBzcWxgIGxpbWl0ICR7bGltaXR9YCA6IHZvaWQgMDtcbiAgfVxuICBidWlsZE9yZGVyQnkob3JkZXJCeSkge1xuICAgIGNvbnN0IG9yZGVyQnlMaXN0ID0gW107XG4gICAgaWYgKG9yZGVyQnkpIHtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBvcmRlckJ5VmFsdWVdIG9mIG9yZGVyQnkuZW50cmllcygpKSB7XG4gICAgICAgIG9yZGVyQnlMaXN0LnB1c2gob3JkZXJCeVZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgb3JkZXJCeS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgb3JkZXJCeUxpc3QucHVzaChzcWxgLCBgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3JkZXJCeUxpc3QubGVuZ3RoID4gMCA/IHNxbGAgb3JkZXIgYnkgJHtzcWwuam9pbihvcmRlckJ5TGlzdCl9YCA6IHZvaWQgMDtcbiAgfVxuICBidWlsZEZyb21UYWJsZSh0YWJsZSkge1xuICAgIGlmIChpcyh0YWJsZSwgVGFibGUpICYmIHRhYmxlW1RhYmxlLlN5bWJvbC5Jc0FsaWFzXSkge1xuICAgICAgcmV0dXJuIHNxbGAke3NxbGAke3NxbC5pZGVudGlmaWVyKHRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdID8/IFwiXCIpfS5gLmlmKHRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdKX0ke3NxbC5pZGVudGlmaWVyKHRhYmxlW1RhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWVdKX0gJHtzcWwuaWRlbnRpZmllcih0YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV0pfWA7XG4gICAgfVxuICAgIHJldHVybiB0YWJsZTtcbiAgfVxuICBidWlsZFNlbGVjdFF1ZXJ5KHtcbiAgICB3aXRoTGlzdCxcbiAgICBmaWVsZHMsXG4gICAgZmllbGRzRmxhdCxcbiAgICB3aGVyZSxcbiAgICBoYXZpbmcsXG4gICAgdGFibGUsXG4gICAgam9pbnMsXG4gICAgb3JkZXJCeSxcbiAgICBncm91cEJ5LFxuICAgIGxpbWl0LFxuICAgIG9mZnNldCxcbiAgICBkaXN0aW5jdCxcbiAgICBzZXRPcGVyYXRvcnNcbiAgfSkge1xuICAgIGNvbnN0IGZpZWxkc0xpc3QgPSBmaWVsZHNGbGF0ID8/IG9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGRzKTtcbiAgICBmb3IgKGNvbnN0IGYgb2YgZmllbGRzTGlzdCkge1xuICAgICAgaWYgKGlzKGYuZmllbGQsIENvbHVtbikgJiYgZ2V0VGFibGVOYW1lKGYuZmllbGQudGFibGUpICE9PSAoaXModGFibGUsIFN1YnF1ZXJ5KSA/IHRhYmxlLl8uYWxpYXMgOiBpcyh0YWJsZSwgU1FMaXRlVmlld0Jhc2UpID8gdGFibGVbVmlld0Jhc2VDb25maWddLm5hbWUgOiBpcyh0YWJsZSwgU1FMKSA/IHZvaWQgMCA6IGdldFRhYmxlTmFtZSh0YWJsZSkpICYmICEoKHRhYmxlMikgPT4gam9pbnM/LnNvbWUoXG4gICAgICAgICh7IGFsaWFzIH0pID0+IGFsaWFzID09PSAodGFibGUyW1RhYmxlLlN5bWJvbC5Jc0FsaWFzXSA/IGdldFRhYmxlTmFtZSh0YWJsZTIpIDogdGFibGUyW1RhYmxlLlN5bWJvbC5CYXNlTmFtZV0pXG4gICAgICApKShmLmZpZWxkLnRhYmxlKSkge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBnZXRUYWJsZU5hbWUoZi5maWVsZC50YWJsZSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgWW91ciBcIiR7Zi5wYXRoLmpvaW4oXCItPlwiKX1cIiBmaWVsZCByZWZlcmVuY2VzIGEgY29sdW1uIFwiJHt0YWJsZU5hbWV9XCIuXCIke2YuZmllbGQubmFtZX1cIiwgYnV0IHRoZSB0YWJsZSBcIiR7dGFibGVOYW1lfVwiIGlzIG5vdCBwYXJ0IG9mIHRoZSBxdWVyeSEgRGlkIHlvdSBmb3JnZXQgdG8gam9pbiBpdD9gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzU2luZ2xlVGFibGUgPSAham9pbnMgfHwgam9pbnMubGVuZ3RoID09PSAwO1xuICAgIGNvbnN0IHdpdGhTcWwgPSB0aGlzLmJ1aWxkV2l0aENURSh3aXRoTGlzdCk7XG4gICAgY29uc3QgZGlzdGluY3RTcWwgPSBkaXN0aW5jdCA/IHNxbGAgZGlzdGluY3RgIDogdm9pZCAwO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuYnVpbGRTZWxlY3Rpb24oZmllbGRzTGlzdCwgeyBpc1NpbmdsZVRhYmxlIH0pO1xuICAgIGNvbnN0IHRhYmxlU3FsID0gdGhpcy5idWlsZEZyb21UYWJsZSh0YWJsZSk7XG4gICAgY29uc3Qgam9pbnNTcWwgPSB0aGlzLmJ1aWxkSm9pbnMoam9pbnMpO1xuICAgIGNvbnN0IHdoZXJlU3FsID0gd2hlcmUgPyBzcWxgIHdoZXJlICR7d2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBoYXZpbmdTcWwgPSBoYXZpbmcgPyBzcWxgIGhhdmluZyAke2hhdmluZ31gIDogdm9pZCAwO1xuICAgIGNvbnN0IGdyb3VwQnlMaXN0ID0gW107XG4gICAgaWYgKGdyb3VwQnkpIHtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBncm91cEJ5VmFsdWVdIG9mIGdyb3VwQnkuZW50cmllcygpKSB7XG4gICAgICAgIGdyb3VwQnlMaXN0LnB1c2goZ3JvdXBCeVZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgZ3JvdXBCeS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgZ3JvdXBCeUxpc3QucHVzaChzcWxgLCBgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBncm91cEJ5U3FsID0gZ3JvdXBCeUxpc3QubGVuZ3RoID4gMCA/IHNxbGAgZ3JvdXAgYnkgJHtzcWwuam9pbihncm91cEJ5TGlzdCl9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBvcmRlckJ5U3FsID0gdGhpcy5idWlsZE9yZGVyQnkob3JkZXJCeSk7XG4gICAgY29uc3QgbGltaXRTcWwgPSB0aGlzLmJ1aWxkTGltaXQobGltaXQpO1xuICAgIGNvbnN0IG9mZnNldFNxbCA9IG9mZnNldCA/IHNxbGAgb2Zmc2V0ICR7b2Zmc2V0fWAgOiB2b2lkIDA7XG4gICAgY29uc3QgZmluYWxRdWVyeSA9IHNxbGAke3dpdGhTcWx9c2VsZWN0JHtkaXN0aW5jdFNxbH0gJHtzZWxlY3Rpb259IGZyb20gJHt0YWJsZVNxbH0ke2pvaW5zU3FsfSR7d2hlcmVTcWx9JHtncm91cEJ5U3FsfSR7aGF2aW5nU3FsfSR7b3JkZXJCeVNxbH0ke2xpbWl0U3FsfSR7b2Zmc2V0U3FsfWA7XG4gICAgaWYgKHNldE9wZXJhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZFNldE9wZXJhdGlvbnMoZmluYWxRdWVyeSwgc2V0T3BlcmF0b3JzKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbmFsUXVlcnk7XG4gIH1cbiAgYnVpbGRTZXRPcGVyYXRpb25zKGxlZnRTZWxlY3QsIHNldE9wZXJhdG9ycykge1xuICAgIGNvbnN0IFtzZXRPcGVyYXRvciwgLi4ucmVzdF0gPSBzZXRPcGVyYXRvcnM7XG4gICAgaWYgKCFzZXRPcGVyYXRvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHBhc3MgdW5kZWZpbmVkIHZhbHVlcyB0byBhbnkgc2V0IG9wZXJhdG9yXCIpO1xuICAgIH1cbiAgICBpZiAocmVzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkU2V0T3BlcmF0aW9uUXVlcnkoeyBsZWZ0U2VsZWN0LCBzZXRPcGVyYXRvciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRTZXRPcGVyYXRpb25zKFxuICAgICAgdGhpcy5idWlsZFNldE9wZXJhdGlvblF1ZXJ5KHsgbGVmdFNlbGVjdCwgc2V0T3BlcmF0b3IgfSksXG4gICAgICByZXN0XG4gICAgKTtcbiAgfVxuICBidWlsZFNldE9wZXJhdGlvblF1ZXJ5KHtcbiAgICBsZWZ0U2VsZWN0LFxuICAgIHNldE9wZXJhdG9yOiB7IHR5cGUsIGlzQWxsLCByaWdodFNlbGVjdCwgbGltaXQsIG9yZGVyQnksIG9mZnNldCB9XG4gIH0pIHtcbiAgICBjb25zdCBsZWZ0Q2h1bmsgPSBzcWxgJHtsZWZ0U2VsZWN0LmdldFNRTCgpfSBgO1xuICAgIGNvbnN0IHJpZ2h0Q2h1bmsgPSBzcWxgJHtyaWdodFNlbGVjdC5nZXRTUUwoKX1gO1xuICAgIGxldCBvcmRlckJ5U3FsO1xuICAgIGlmIChvcmRlckJ5ICYmIG9yZGVyQnkubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgb3JkZXJCeVZhbHVlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBzaW5nbGVPcmRlckJ5IG9mIG9yZGVyQnkpIHtcbiAgICAgICAgaWYgKGlzKHNpbmdsZU9yZGVyQnksIFNRTGl0ZUNvbHVtbikpIHtcbiAgICAgICAgICBvcmRlckJ5VmFsdWVzLnB1c2goc3FsLmlkZW50aWZpZXIoc2luZ2xlT3JkZXJCeS5uYW1lKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXMoc2luZ2xlT3JkZXJCeSwgU1FMKSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2luZ2xlT3JkZXJCeS5xdWVyeUNodW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBzaW5nbGVPcmRlckJ5LnF1ZXJ5Q2h1bmtzW2ldO1xuICAgICAgICAgICAgaWYgKGlzKGNodW5rLCBTUUxpdGVDb2x1bW4pKSB7XG4gICAgICAgICAgICAgIHNpbmdsZU9yZGVyQnkucXVlcnlDaHVua3NbaV0gPSBzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoY2h1bmspKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgb3JkZXJCeVZhbHVlcy5wdXNoKHNxbGAke3NpbmdsZU9yZGVyQnl9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3JkZXJCeVZhbHVlcy5wdXNoKHNxbGAke3NpbmdsZU9yZGVyQnl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9yZGVyQnlTcWwgPSBzcWxgIG9yZGVyIGJ5ICR7c3FsLmpvaW4ob3JkZXJCeVZhbHVlcywgc3FsYCwgYCl9YDtcbiAgICB9XG4gICAgY29uc3QgbGltaXRTcWwgPSB0eXBlb2YgbGltaXQgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGxpbWl0ID09PSBcIm51bWJlclwiICYmIGxpbWl0ID49IDAgPyBzcWxgIGxpbWl0ICR7bGltaXR9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBvcGVyYXRvckNodW5rID0gc3FsLnJhdyhgJHt0eXBlfSAke2lzQWxsID8gXCJhbGwgXCIgOiBcIlwifWApO1xuICAgIGNvbnN0IG9mZnNldFNxbCA9IG9mZnNldCA/IHNxbGAgb2Zmc2V0ICR7b2Zmc2V0fWAgOiB2b2lkIDA7XG4gICAgcmV0dXJuIHNxbGAke2xlZnRDaHVua30ke29wZXJhdG9yQ2h1bmt9JHtyaWdodENodW5rfSR7b3JkZXJCeVNxbH0ke2xpbWl0U3FsfSR7b2Zmc2V0U3FsfWA7XG4gIH1cbiAgYnVpbGRJbnNlcnRRdWVyeSh7IHRhYmxlLCB2YWx1ZXM6IHZhbHVlc09yU2VsZWN0LCBvbkNvbmZsaWN0LCByZXR1cm5pbmcsIHdpdGhMaXN0LCBzZWxlY3QgfSkge1xuICAgIGNvbnN0IHZhbHVlc1NxbExpc3QgPSBbXTtcbiAgICBjb25zdCBjb2x1bW5zID0gdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAgIGNvbnN0IGNvbEVudHJpZXMgPSBPYmplY3QuZW50cmllcyhjb2x1bW5zKS5maWx0ZXIoXG4gICAgICAoW18sIGNvbF0pID0+ICFjb2wuc2hvdWxkRGlzYWJsZUluc2VydCgpXG4gICAgKTtcbiAgICBjb25zdCBpbnNlcnRPcmRlciA9IGNvbEVudHJpZXMubWFwKChbLCBjb2x1bW5dKSA9PiBzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoY29sdW1uKSkpO1xuICAgIGlmIChzZWxlY3QpIHtcbiAgICAgIGNvbnN0IHNlbGVjdDIgPSB2YWx1ZXNPclNlbGVjdDtcbiAgICAgIGlmIChpcyhzZWxlY3QyLCBTUUwpKSB7XG4gICAgICAgIHZhbHVlc1NxbExpc3QucHVzaChzZWxlY3QyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlc1NxbExpc3QucHVzaChzZWxlY3QyLmdldFNRTCgpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmFsdWVzID0gdmFsdWVzT3JTZWxlY3Q7XG4gICAgICB2YWx1ZXNTcWxMaXN0LnB1c2goc3FsLnJhdyhcInZhbHVlcyBcIikpO1xuICAgICAgZm9yIChjb25zdCBbdmFsdWVJbmRleCwgdmFsdWVdIG9mIHZhbHVlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWVMaXN0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZSwgY29sXSBvZiBjb2xFbnRyaWVzKSB7XG4gICAgICAgICAgY29uc3QgY29sVmFsdWUgPSB2YWx1ZVtmaWVsZE5hbWVdO1xuICAgICAgICAgIGlmIChjb2xWYWx1ZSA9PT0gdm9pZCAwIHx8IGlzKGNvbFZhbHVlLCBQYXJhbSkgJiYgY29sVmFsdWUudmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIGlmIChjb2wuZGVmYXVsdCAhPT0gbnVsbCAmJiBjb2wuZGVmYXVsdCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGlzKGNvbC5kZWZhdWx0LCBTUUwpID8gY29sLmRlZmF1bHQgOiBzcWwucGFyYW0oY29sLmRlZmF1bHQsIGNvbCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbC5kZWZhdWx0Rm4gIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0Rm5SZXN1bHQgPSBjb2wuZGVmYXVsdEZuKCk7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGlzKGRlZmF1bHRGblJlc3VsdCwgU1FMKSA/IGRlZmF1bHRGblJlc3VsdCA6IHNxbC5wYXJhbShkZWZhdWx0Rm5SZXN1bHQsIGNvbCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFjb2wuZGVmYXVsdCAmJiBjb2wub25VcGRhdGVGbiAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9uVXBkYXRlRm5SZXN1bHQgPSBjb2wub25VcGRhdGVGbigpO1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBpcyhvblVwZGF0ZUZuUmVzdWx0LCBTUUwpID8gb25VcGRhdGVGblJlc3VsdCA6IHNxbC5wYXJhbShvblVwZGF0ZUZuUmVzdWx0LCBjb2wpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gc3FsYG51bGxgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWVMaXN0LnB1c2goZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVMaXN0LnB1c2goY29sVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YWx1ZXNTcWxMaXN0LnB1c2godmFsdWVMaXN0KTtcbiAgICAgICAgaWYgKHZhbHVlSW5kZXggPCB2YWx1ZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHZhbHVlc1NxbExpc3QucHVzaChzcWxgLCBgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB3aXRoU3FsID0gdGhpcy5idWlsZFdpdGhDVEUod2l0aExpc3QpO1xuICAgIGNvbnN0IHZhbHVlc1NxbCA9IHNxbC5qb2luKHZhbHVlc1NxbExpc3QpO1xuICAgIGNvbnN0IHJldHVybmluZ1NxbCA9IHJldHVybmluZyA/IHNxbGAgcmV0dXJuaW5nICR7dGhpcy5idWlsZFNlbGVjdGlvbihyZXR1cm5pbmcsIHsgaXNTaW5nbGVUYWJsZTogdHJ1ZSB9KX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IG9uQ29uZmxpY3RTcWwgPSBvbkNvbmZsaWN0Py5sZW5ndGggPyBzcWwuam9pbihvbkNvbmZsaWN0KSA6IHZvaWQgMDtcbiAgICByZXR1cm4gc3FsYCR7d2l0aFNxbH1pbnNlcnQgaW50byAke3RhYmxlfSAke2luc2VydE9yZGVyfSAke3ZhbHVlc1NxbH0ke29uQ29uZmxpY3RTcWx9JHtyZXR1cm5pbmdTcWx9YDtcbiAgfVxuICBzcWxUb1F1ZXJ5KHNxbDIsIGludm9rZVNvdXJjZSkge1xuICAgIHJldHVybiBzcWwyLnRvUXVlcnkoe1xuICAgICAgY2FzaW5nOiB0aGlzLmNhc2luZyxcbiAgICAgIGVzY2FwZU5hbWU6IHRoaXMuZXNjYXBlTmFtZSxcbiAgICAgIGVzY2FwZVBhcmFtOiB0aGlzLmVzY2FwZVBhcmFtLFxuICAgICAgZXNjYXBlU3RyaW5nOiB0aGlzLmVzY2FwZVN0cmluZyxcbiAgICAgIGludm9rZVNvdXJjZVxuICAgIH0pO1xuICB9XG4gIGJ1aWxkUmVsYXRpb25hbFF1ZXJ5KHtcbiAgICBmdWxsU2NoZW1hLFxuICAgIHNjaGVtYSxcbiAgICB0YWJsZU5hbWVzTWFwLFxuICAgIHRhYmxlLFxuICAgIHRhYmxlQ29uZmlnLFxuICAgIHF1ZXJ5Q29uZmlnOiBjb25maWcsXG4gICAgdGFibGVBbGlhcyxcbiAgICBuZXN0ZWRRdWVyeVJlbGF0aW9uLFxuICAgIGpvaW5PblxuICB9KSB7XG4gICAgbGV0IHNlbGVjdGlvbiA9IFtdO1xuICAgIGxldCBsaW1pdCwgb2Zmc2V0LCBvcmRlckJ5ID0gW10sIHdoZXJlO1xuICAgIGNvbnN0IGpvaW5zID0gW107XG4gICAgaWYgKGNvbmZpZyA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRhYmxlQ29uZmlnLmNvbHVtbnMpO1xuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uRW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgZGJLZXk6IHZhbHVlLm5hbWUsXG4gICAgICAgIHRzS2V5OiBrZXksXG4gICAgICAgIGZpZWxkOiBhbGlhc2VkVGFibGVDb2x1bW4odmFsdWUsIHRhYmxlQWxpYXMpLFxuICAgICAgICByZWxhdGlvblRhYmxlVHNLZXk6IHZvaWQgMCxcbiAgICAgICAgaXNKc29uOiBmYWxzZSxcbiAgICAgICAgc2VsZWN0aW9uOiBbXVxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhbGlhc2VkQ29sdW1ucyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXModGFibGVDb25maWcuY29sdW1ucykubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIGFsaWFzZWRUYWJsZUNvbHVtbih2YWx1ZSwgdGFibGVBbGlhcyldKVxuICAgICAgKTtcbiAgICAgIGlmIChjb25maWcud2hlcmUpIHtcbiAgICAgICAgY29uc3Qgd2hlcmVTcWwgPSB0eXBlb2YgY29uZmlnLndoZXJlID09PSBcImZ1bmN0aW9uXCIgPyBjb25maWcud2hlcmUoYWxpYXNlZENvbHVtbnMsIGdldE9wZXJhdG9ycygpKSA6IGNvbmZpZy53aGVyZTtcbiAgICAgICAgd2hlcmUgPSB3aGVyZVNxbCAmJiBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzKHdoZXJlU3FsLCB0YWJsZUFsaWFzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpZWxkc1NlbGVjdGlvbiA9IFtdO1xuICAgICAgbGV0IHNlbGVjdGVkQ29sdW1ucyA9IFtdO1xuICAgICAgaWYgKGNvbmZpZy5jb2x1bW5zKSB7XG4gICAgICAgIGxldCBpc0luY2x1ZGVNb2RlID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgW2ZpZWxkLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmNvbHVtbnMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmllbGQgaW4gdGFibGVDb25maWcuY29sdW1ucykge1xuICAgICAgICAgICAgaWYgKCFpc0luY2x1ZGVNb2RlICYmIHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIGlzSW5jbHVkZU1vZGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZWN0ZWRDb2x1bW5zLnB1c2goZmllbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZWN0ZWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZWxlY3RlZENvbHVtbnMgPSBpc0luY2x1ZGVNb2RlID8gc2VsZWN0ZWRDb2x1bW5zLmZpbHRlcigoYykgPT4gY29uZmlnLmNvbHVtbnM/LltjXSA9PT0gdHJ1ZSkgOiBPYmplY3Qua2V5cyh0YWJsZUNvbmZpZy5jb2x1bW5zKS5maWx0ZXIoKGtleSkgPT4gIXNlbGVjdGVkQ29sdW1ucy5pbmNsdWRlcyhrZXkpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWRDb2x1bW5zID0gT2JqZWN0LmtleXModGFibGVDb25maWcuY29sdW1ucyk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNlbGVjdGVkQ29sdW1ucykge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0YWJsZUNvbmZpZy5jb2x1bW5zW2ZpZWxkXTtcbiAgICAgICAgZmllbGRzU2VsZWN0aW9uLnB1c2goeyB0c0tleTogZmllbGQsIHZhbHVlOiBjb2x1bW4gfSk7XG4gICAgICB9XG4gICAgICBsZXQgc2VsZWN0ZWRSZWxhdGlvbnMgPSBbXTtcbiAgICAgIGlmIChjb25maWcud2l0aCkge1xuICAgICAgICBzZWxlY3RlZFJlbGF0aW9ucyA9IE9iamVjdC5lbnRyaWVzKGNvbmZpZy53aXRoKS5maWx0ZXIoKGVudHJ5KSA9PiAhIWVudHJ5WzFdKS5tYXAoKFt0c0tleSwgcXVlcnlDb25maWddKSA9PiAoeyB0c0tleSwgcXVlcnlDb25maWcsIHJlbGF0aW9uOiB0YWJsZUNvbmZpZy5yZWxhdGlvbnNbdHNLZXldIH0pKTtcbiAgICAgIH1cbiAgICAgIGxldCBleHRyYXM7XG4gICAgICBpZiAoY29uZmlnLmV4dHJhcykge1xuICAgICAgICBleHRyYXMgPSB0eXBlb2YgY29uZmlnLmV4dHJhcyA9PT0gXCJmdW5jdGlvblwiID8gY29uZmlnLmV4dHJhcyhhbGlhc2VkQ29sdW1ucywgeyBzcWwgfSkgOiBjb25maWcuZXh0cmFzO1xuICAgICAgICBmb3IgKGNvbnN0IFt0c0tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4dHJhcykpIHtcbiAgICAgICAgICBmaWVsZHNTZWxlY3Rpb24ucHVzaCh7XG4gICAgICAgICAgICB0c0tleSxcbiAgICAgICAgICAgIHZhbHVlOiBtYXBDb2x1bW5zSW5BbGlhc2VkU1FMVG9BbGlhcyh2YWx1ZSwgdGFibGVBbGlhcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB7IHRzS2V5LCB2YWx1ZSB9IG9mIGZpZWxkc1NlbGVjdGlvbikge1xuICAgICAgICBzZWxlY3Rpb24ucHVzaCh7XG4gICAgICAgICAgZGJLZXk6IGlzKHZhbHVlLCBTUUwuQWxpYXNlZCkgPyB2YWx1ZS5maWVsZEFsaWFzIDogdGFibGVDb25maWcuY29sdW1uc1t0c0tleV0ubmFtZSxcbiAgICAgICAgICB0c0tleSxcbiAgICAgICAgICBmaWVsZDogaXModmFsdWUsIENvbHVtbikgPyBhbGlhc2VkVGFibGVDb2x1bW4odmFsdWUsIHRhYmxlQWxpYXMpIDogdmFsdWUsXG4gICAgICAgICAgcmVsYXRpb25UYWJsZVRzS2V5OiB2b2lkIDAsXG4gICAgICAgICAgaXNKc29uOiBmYWxzZSxcbiAgICAgICAgICBzZWxlY3Rpb246IFtdXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgbGV0IG9yZGVyQnlPcmlnID0gdHlwZW9mIGNvbmZpZy5vcmRlckJ5ID09PSBcImZ1bmN0aW9uXCIgPyBjb25maWcub3JkZXJCeShhbGlhc2VkQ29sdW1ucywgZ2V0T3JkZXJCeU9wZXJhdG9ycygpKSA6IGNvbmZpZy5vcmRlckJ5ID8/IFtdO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9yZGVyQnlPcmlnKSkge1xuICAgICAgICBvcmRlckJ5T3JpZyA9IFtvcmRlckJ5T3JpZ107XG4gICAgICB9XG4gICAgICBvcmRlckJ5ID0gb3JkZXJCeU9yaWcubWFwKChvcmRlckJ5VmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGlzKG9yZGVyQnlWYWx1ZSwgQ29sdW1uKSkge1xuICAgICAgICAgIHJldHVybiBhbGlhc2VkVGFibGVDb2x1bW4ob3JkZXJCeVZhbHVlLCB0YWJsZUFsaWFzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwQ29sdW1uc0luU1FMVG9BbGlhcyhvcmRlckJ5VmFsdWUsIHRhYmxlQWxpYXMpO1xuICAgICAgfSk7XG4gICAgICBsaW1pdCA9IGNvbmZpZy5saW1pdDtcbiAgICAgIG9mZnNldCA9IGNvbmZpZy5vZmZzZXQ7XG4gICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgdHNLZXk6IHNlbGVjdGVkUmVsYXRpb25Uc0tleSxcbiAgICAgICAgcXVlcnlDb25maWc6IHNlbGVjdGVkUmVsYXRpb25Db25maWdWYWx1ZSxcbiAgICAgICAgcmVsYXRpb25cbiAgICAgIH0gb2Ygc2VsZWN0ZWRSZWxhdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFJlbGF0aW9uID0gbm9ybWFsaXplUmVsYXRpb24oc2NoZW1hLCB0YWJsZU5hbWVzTWFwLCByZWxhdGlvbik7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uVGFibGVOYW1lID0gZ2V0VGFibGVVbmlxdWVOYW1lKHJlbGF0aW9uLnJlZmVyZW5jZWRUYWJsZSk7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uVGFibGVUc05hbWUgPSB0YWJsZU5hbWVzTWFwW3JlbGF0aW9uVGFibGVOYW1lXTtcbiAgICAgICAgY29uc3QgcmVsYXRpb25UYWJsZUFsaWFzID0gYCR7dGFibGVBbGlhc31fJHtzZWxlY3RlZFJlbGF0aW9uVHNLZXl9YDtcbiAgICAgICAgY29uc3Qgam9pbk9uMiA9IGFuZChcbiAgICAgICAgICAuLi5ub3JtYWxpemVkUmVsYXRpb24uZmllbGRzLm1hcChcbiAgICAgICAgICAgIChmaWVsZDIsIGkpID0+IGVxKFxuICAgICAgICAgICAgICBhbGlhc2VkVGFibGVDb2x1bW4obm9ybWFsaXplZFJlbGF0aW9uLnJlZmVyZW5jZXNbaV0sIHJlbGF0aW9uVGFibGVBbGlhcyksXG4gICAgICAgICAgICAgIGFsaWFzZWRUYWJsZUNvbHVtbihmaWVsZDIsIHRhYmxlQWxpYXMpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBidWlsdFJlbGF0aW9uID0gdGhpcy5idWlsZFJlbGF0aW9uYWxRdWVyeSh7XG4gICAgICAgICAgZnVsbFNjaGVtYSxcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgdGFibGVOYW1lc01hcCxcbiAgICAgICAgICB0YWJsZTogZnVsbFNjaGVtYVtyZWxhdGlvblRhYmxlVHNOYW1lXSxcbiAgICAgICAgICB0YWJsZUNvbmZpZzogc2NoZW1hW3JlbGF0aW9uVGFibGVUc05hbWVdLFxuICAgICAgICAgIHF1ZXJ5Q29uZmlnOiBpcyhyZWxhdGlvbiwgT25lKSA/IHNlbGVjdGVkUmVsYXRpb25Db25maWdWYWx1ZSA9PT0gdHJ1ZSA/IHsgbGltaXQ6IDEgfSA6IHsgLi4uc2VsZWN0ZWRSZWxhdGlvbkNvbmZpZ1ZhbHVlLCBsaW1pdDogMSB9IDogc2VsZWN0ZWRSZWxhdGlvbkNvbmZpZ1ZhbHVlLFxuICAgICAgICAgIHRhYmxlQWxpYXM6IHJlbGF0aW9uVGFibGVBbGlhcyxcbiAgICAgICAgICBqb2luT246IGpvaW5PbjIsXG4gICAgICAgICAgbmVzdGVkUXVlcnlSZWxhdGlvbjogcmVsYXRpb25cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gc3FsYCgke2J1aWx0UmVsYXRpb24uc3FsfSlgLmFzKHNlbGVjdGVkUmVsYXRpb25Uc0tleSk7XG4gICAgICAgIHNlbGVjdGlvbi5wdXNoKHtcbiAgICAgICAgICBkYktleTogc2VsZWN0ZWRSZWxhdGlvblRzS2V5LFxuICAgICAgICAgIHRzS2V5OiBzZWxlY3RlZFJlbGF0aW9uVHNLZXksXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgcmVsYXRpb25UYWJsZVRzS2V5OiByZWxhdGlvblRhYmxlVHNOYW1lLFxuICAgICAgICAgIGlzSnNvbjogdHJ1ZSxcbiAgICAgICAgICBzZWxlY3Rpb246IGJ1aWx0UmVsYXRpb24uc2VsZWN0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IERyaXp6bGVFcnJvcih7XG4gICAgICAgIG1lc3NhZ2U6IGBObyBmaWVsZHMgc2VsZWN0ZWQgZm9yIHRhYmxlIFwiJHt0YWJsZUNvbmZpZy50c05hbWV9XCIgKFwiJHt0YWJsZUFsaWFzfVwiKS4gWW91IG5lZWQgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgaXRlbSBpbiBcImNvbHVtbnNcIiwgXCJ3aXRoXCIgb3IgXCJleHRyYXNcIi4gSWYgeW91IG5lZWQgdG8gc2VsZWN0IGFsbCBjb2x1bW5zLCBvbWl0IHRoZSBcImNvbHVtbnNcIiBrZXkgb3Igc2V0IGl0IHRvIHVuZGVmaW5lZC5gXG4gICAgICB9KTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDtcbiAgICB3aGVyZSA9IGFuZChqb2luT24sIHdoZXJlKTtcbiAgICBpZiAobmVzdGVkUXVlcnlSZWxhdGlvbikge1xuICAgICAgbGV0IGZpZWxkID0gc3FsYGpzb25fYXJyYXkoJHtzcWwuam9pbihcbiAgICAgICAgc2VsZWN0aW9uLm1hcChcbiAgICAgICAgICAoeyBmaWVsZDogZmllbGQyIH0pID0+IGlzKGZpZWxkMiwgU1FMaXRlQ29sdW1uKSA/IHNxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhmaWVsZDIpKSA6IGlzKGZpZWxkMiwgU1FMLkFsaWFzZWQpID8gZmllbGQyLnNxbCA6IGZpZWxkMlxuICAgICAgICApLFxuICAgICAgICBzcWxgLCBgXG4gICAgICApfSlgO1xuICAgICAgaWYgKGlzKG5lc3RlZFF1ZXJ5UmVsYXRpb24sIE1hbnkpKSB7XG4gICAgICAgIGZpZWxkID0gc3FsYGNvYWxlc2NlKGpzb25fZ3JvdXBfYXJyYXkoJHtmaWVsZH0pLCBqc29uX2FycmF5KCkpYDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5lc3RlZFNlbGVjdGlvbiA9IFt7XG4gICAgICAgIGRiS2V5OiBcImRhdGFcIixcbiAgICAgICAgdHNLZXk6IFwiZGF0YVwiLFxuICAgICAgICBmaWVsZDogZmllbGQuYXMoXCJkYXRhXCIpLFxuICAgICAgICBpc0pzb246IHRydWUsXG4gICAgICAgIHJlbGF0aW9uVGFibGVUc0tleTogdGFibGVDb25maWcudHNOYW1lLFxuICAgICAgICBzZWxlY3Rpb25cbiAgICAgIH1dO1xuICAgICAgY29uc3QgbmVlZHNTdWJxdWVyeSA9IGxpbWl0ICE9PSB2b2lkIDAgfHwgb2Zmc2V0ICE9PSB2b2lkIDAgfHwgb3JkZXJCeS5sZW5ndGggPiAwO1xuICAgICAgaWYgKG5lZWRzU3VicXVlcnkpIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5idWlsZFNlbGVjdFF1ZXJ5KHtcbiAgICAgICAgICB0YWJsZTogYWxpYXNlZFRhYmxlKHRhYmxlLCB0YWJsZUFsaWFzKSxcbiAgICAgICAgICBmaWVsZHM6IHt9LFxuICAgICAgICAgIGZpZWxkc0ZsYXQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGF0aDogW10sXG4gICAgICAgICAgICAgIGZpZWxkOiBzcWwucmF3KFwiKlwiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgd2hlcmUsXG4gICAgICAgICAgbGltaXQsXG4gICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgIG9yZGVyQnksXG4gICAgICAgICAgc2V0T3BlcmF0b3JzOiBbXVxuICAgICAgICB9KTtcbiAgICAgICAgd2hlcmUgPSB2b2lkIDA7XG4gICAgICAgIGxpbWl0ID0gdm9pZCAwO1xuICAgICAgICBvZmZzZXQgPSB2b2lkIDA7XG4gICAgICAgIG9yZGVyQnkgPSB2b2lkIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBhbGlhc2VkVGFibGUodGFibGUsIHRhYmxlQWxpYXMpO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gdGhpcy5idWlsZFNlbGVjdFF1ZXJ5KHtcbiAgICAgICAgdGFibGU6IGlzKHJlc3VsdCwgU1FMaXRlVGFibGUpID8gcmVzdWx0IDogbmV3IFN1YnF1ZXJ5KHJlc3VsdCwge30sIHRhYmxlQWxpYXMpLFxuICAgICAgICBmaWVsZHM6IHt9LFxuICAgICAgICBmaWVsZHNGbGF0OiBuZXN0ZWRTZWxlY3Rpb24ubWFwKCh7IGZpZWxkOiBmaWVsZDIgfSkgPT4gKHtcbiAgICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgICBmaWVsZDogaXMoZmllbGQyLCBDb2x1bW4pID8gYWxpYXNlZFRhYmxlQ29sdW1uKGZpZWxkMiwgdGFibGVBbGlhcykgOiBmaWVsZDJcbiAgICAgICAgfSkpLFxuICAgICAgICBqb2lucyxcbiAgICAgICAgd2hlcmUsXG4gICAgICAgIGxpbWl0LFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIG9yZGVyQnksXG4gICAgICAgIHNldE9wZXJhdG9yczogW11cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmJ1aWxkU2VsZWN0UXVlcnkoe1xuICAgICAgICB0YWJsZTogYWxpYXNlZFRhYmxlKHRhYmxlLCB0YWJsZUFsaWFzKSxcbiAgICAgICAgZmllbGRzOiB7fSxcbiAgICAgICAgZmllbGRzRmxhdDogc2VsZWN0aW9uLm1hcCgoeyBmaWVsZCB9KSA9PiAoe1xuICAgICAgICAgIHBhdGg6IFtdLFxuICAgICAgICAgIGZpZWxkOiBpcyhmaWVsZCwgQ29sdW1uKSA/IGFsaWFzZWRUYWJsZUNvbHVtbihmaWVsZCwgdGFibGVBbGlhcykgOiBmaWVsZFxuICAgICAgICB9KSksXG4gICAgICAgIGpvaW5zLFxuICAgICAgICB3aGVyZSxcbiAgICAgICAgbGltaXQsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgb3JkZXJCeSxcbiAgICAgICAgc2V0T3BlcmF0b3JzOiBbXVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0YWJsZVRzS2V5OiB0YWJsZUNvbmZpZy50c05hbWUsXG4gICAgICBzcWw6IHJlc3VsdCxcbiAgICAgIHNlbGVjdGlvblxuICAgIH07XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVN5bmNEaWFsZWN0IGV4dGVuZHMgU1FMaXRlRGlhbGVjdCB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVN5bmNEaWFsZWN0XCI7XG4gIG1pZ3JhdGUobWlncmF0aW9ucywgc2Vzc2lvbiwgY29uZmlnKSB7XG4gICAgY29uc3QgbWlncmF0aW9uc1RhYmxlID0gY29uZmlnID09PSB2b2lkIDAgPyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCIgOiB0eXBlb2YgY29uZmlnID09PSBcInN0cmluZ1wiID8gXCJfX2RyaXp6bGVfbWlncmF0aW9uc1wiIDogY29uZmlnLm1pZ3JhdGlvbnNUYWJsZSA/PyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCI7XG4gICAgY29uc3QgbWlncmF0aW9uVGFibGVDcmVhdGUgPSBzcWxgXG5cdFx0XHRDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IChcblx0XHRcdFx0aWQgU0VSSUFMIFBSSU1BUlkgS0VZLFxuXHRcdFx0XHRoYXNoIHRleHQgTk9UIE5VTEwsXG5cdFx0XHRcdGNyZWF0ZWRfYXQgbnVtZXJpY1xuXHRcdFx0KVxuXHRcdGA7XG4gICAgc2Vzc2lvbi5ydW4obWlncmF0aW9uVGFibGVDcmVhdGUpO1xuICAgIGNvbnN0IGRiTWlncmF0aW9ucyA9IHNlc3Npb24udmFsdWVzKFxuICAgICAgc3FsYFNFTEVDVCBpZCwgaGFzaCwgY3JlYXRlZF9hdCBGUk9NICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gT1JERVIgQlkgY3JlYXRlZF9hdCBERVNDIExJTUlUIDFgXG4gICAgKTtcbiAgICBjb25zdCBsYXN0RGJNaWdyYXRpb24gPSBkYk1pZ3JhdGlvbnNbMF0gPz8gdm9pZCAwO1xuICAgIHNlc3Npb24ucnVuKHNxbGBCRUdJTmApO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IG1pZ3JhdGlvbiBvZiBtaWdyYXRpb25zKSB7XG4gICAgICAgIGlmICghbGFzdERiTWlncmF0aW9uIHx8IE51bWJlcihsYXN0RGJNaWdyYXRpb25bMl0pIDwgbWlncmF0aW9uLmZvbGRlck1pbGxpcykge1xuICAgICAgICAgIGZvciAoY29uc3Qgc3RtdCBvZiBtaWdyYXRpb24uc3FsKSB7XG4gICAgICAgICAgICBzZXNzaW9uLnJ1bihzcWwucmF3KHN0bXQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2Vzc2lvbi5ydW4oXG4gICAgICAgICAgICBzcWxgSU5TRVJUIElOVE8gJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSAoXCJoYXNoXCIsIFwiY3JlYXRlZF9hdFwiKSBWQUxVRVMoJHttaWdyYXRpb24uaGFzaH0sICR7bWlncmF0aW9uLmZvbGRlck1pbGxpc30pYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNlc3Npb24ucnVuKHNxbGBDT01NSVRgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZXNzaW9uLnJ1bihzcWxgUk9MTEJBQ0tgKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59XG5jbGFzcyBTUUxpdGVBc3luY0RpYWxlY3QgZXh0ZW5kcyBTUUxpdGVEaWFsZWN0IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQXN5bmNEaWFsZWN0XCI7XG4gIGFzeW5jIG1pZ3JhdGUobWlncmF0aW9ucywgc2Vzc2lvbiwgY29uZmlnKSB7XG4gICAgY29uc3QgbWlncmF0aW9uc1RhYmxlID0gY29uZmlnID09PSB2b2lkIDAgPyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCIgOiB0eXBlb2YgY29uZmlnID09PSBcInN0cmluZ1wiID8gXCJfX2RyaXp6bGVfbWlncmF0aW9uc1wiIDogY29uZmlnLm1pZ3JhdGlvbnNUYWJsZSA/PyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCI7XG4gICAgY29uc3QgbWlncmF0aW9uVGFibGVDcmVhdGUgPSBzcWxgXG5cdFx0XHRDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IChcblx0XHRcdFx0aWQgU0VSSUFMIFBSSU1BUlkgS0VZLFxuXHRcdFx0XHRoYXNoIHRleHQgTk9UIE5VTEwsXG5cdFx0XHRcdGNyZWF0ZWRfYXQgbnVtZXJpY1xuXHRcdFx0KVxuXHRcdGA7XG4gICAgYXdhaXQgc2Vzc2lvbi5ydW4obWlncmF0aW9uVGFibGVDcmVhdGUpO1xuICAgIGNvbnN0IGRiTWlncmF0aW9ucyA9IGF3YWl0IHNlc3Npb24udmFsdWVzKFxuICAgICAgc3FsYFNFTEVDVCBpZCwgaGFzaCwgY3JlYXRlZF9hdCBGUk9NICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gT1JERVIgQlkgY3JlYXRlZF9hdCBERVNDIExJTUlUIDFgXG4gICAgKTtcbiAgICBjb25zdCBsYXN0RGJNaWdyYXRpb24gPSBkYk1pZ3JhdGlvbnNbMF0gPz8gdm9pZCAwO1xuICAgIGF3YWl0IHNlc3Npb24udHJhbnNhY3Rpb24oYXN5bmMgKHR4KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG1pZ3JhdGlvbiBvZiBtaWdyYXRpb25zKSB7XG4gICAgICAgIGlmICghbGFzdERiTWlncmF0aW9uIHx8IE51bWJlcihsYXN0RGJNaWdyYXRpb25bMl0pIDwgbWlncmF0aW9uLmZvbGRlck1pbGxpcykge1xuICAgICAgICAgIGZvciAoY29uc3Qgc3RtdCBvZiBtaWdyYXRpb24uc3FsKSB7XG4gICAgICAgICAgICBhd2FpdCB0eC5ydW4oc3FsLnJhdyhzdG10KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHR4LnJ1bihcbiAgICAgICAgICAgIHNxbGBJTlNFUlQgSU5UTyAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IChcImhhc2hcIiwgXCJjcmVhdGVkX2F0XCIpIFZBTFVFUygke21pZ3JhdGlvbi5oYXNofSwgJHttaWdyYXRpb24uZm9sZGVyTWlsbGlzfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVBc3luY0RpYWxlY3QsXG4gIFNRTGl0ZURpYWxlY3QsXG4gIFNRTGl0ZVN5bmNEaWFsZWN0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlhbGVjdC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5jbGFzcyBUeXBlZFF1ZXJ5QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlR5cGVkUXVlcnlCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U2VsZWN0ZWRGaWVsZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuXy5zZWxlY3RlZEZpZWxkcztcbiAgfVxufVxuZXhwb3J0IHtcbiAgVHlwZWRRdWVyeUJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWVyeS1idWlsZGVyLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUeXBlZFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuLi8uLi9xdWVyeS1idWlsZGVycy9xdWVyeS1idWlsZGVyLmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHsgU2VsZWN0aW9uUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL3NlbGVjdGlvbi1wcm94eS5qc1wiO1xuaW1wb3J0IHsgU1FMLCBWaWV3IH0gZnJvbSBcIi4uLy4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4uLy4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS5qc1wiO1xuaW1wb3J0IHtcbiAgYXBwbHlNaXhpbnMsXG4gIGdldFRhYmxlQ29sdW1ucyxcbiAgZ2V0VGFibGVMaWtlTmFtZSxcbiAgaGF2ZVNhbWVLZXlzLFxuICBvcmRlclNlbGVjdGVkRmllbGRzXG59IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IGV4dHJhY3RVc2VkVGFibGUgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVZpZXdCYXNlIH0gZnJvbSBcIi4uL3ZpZXctYmFzZS5qc1wiO1xuY2xhc3MgU1FMaXRlU2VsZWN0QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVNlbGVjdEJ1aWxkZXJcIjtcbiAgZmllbGRzO1xuICBzZXNzaW9uO1xuICBkaWFsZWN0O1xuICB3aXRoTGlzdDtcbiAgZGlzdGluY3Q7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMuZmllbGRzID0gY29uZmlnLmZpZWxkcztcbiAgICB0aGlzLnNlc3Npb24gPSBjb25maWcuc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBjb25maWcuZGlhbGVjdDtcbiAgICB0aGlzLndpdGhMaXN0ID0gY29uZmlnLndpdGhMaXN0O1xuICAgIHRoaXMuZGlzdGluY3QgPSBjb25maWcuZGlzdGluY3Q7XG4gIH1cbiAgZnJvbShzb3VyY2UpIHtcbiAgICBjb25zdCBpc1BhcnRpYWxTZWxlY3QgPSAhIXRoaXMuZmllbGRzO1xuICAgIGxldCBmaWVsZHM7XG4gICAgaWYgKHRoaXMuZmllbGRzKSB7XG4gICAgICBmaWVsZHMgPSB0aGlzLmZpZWxkcztcbiAgICB9IGVsc2UgaWYgKGlzKHNvdXJjZSwgU3VicXVlcnkpKSB7XG4gICAgICBmaWVsZHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5rZXlzKHNvdXJjZS5fLnNlbGVjdGVkRmllbGRzKS5tYXAoKGtleSkgPT4gW2tleSwgc291cmNlW2tleV1dKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzKHNvdXJjZSwgU1FMaXRlVmlld0Jhc2UpKSB7XG4gICAgICBmaWVsZHMgPSBzb3VyY2VbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzO1xuICAgIH0gZWxzZSBpZiAoaXMoc291cmNlLCBTUUwpKSB7XG4gICAgICBmaWVsZHMgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmllbGRzID0gZ2V0VGFibGVDb2x1bW5zKHNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QmFzZSh7XG4gICAgICB0YWJsZTogc291cmNlLFxuICAgICAgZmllbGRzLFxuICAgICAgaXNQYXJ0aWFsU2VsZWN0LFxuICAgICAgc2Vzc2lvbjogdGhpcy5zZXNzaW9uLFxuICAgICAgZGlhbGVjdDogdGhpcy5kaWFsZWN0LFxuICAgICAgd2l0aExpc3Q6IHRoaXMud2l0aExpc3QsXG4gICAgICBkaXN0aW5jdDogdGhpcy5kaXN0aW5jdFxuICAgIH0pO1xuICB9XG59XG5jbGFzcyBTUUxpdGVTZWxlY3RRdWVyeUJ1aWxkZXJCYXNlIGV4dGVuZHMgVHlwZWRRdWVyeUJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTZWxlY3RRdWVyeUJ1aWxkZXJcIjtcbiAgXztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIGpvaW5zTm90TnVsbGFibGVNYXA7XG4gIHRhYmxlTmFtZTtcbiAgaXNQYXJ0aWFsU2VsZWN0O1xuICBzZXNzaW9uO1xuICBkaWFsZWN0O1xuICBjYWNoZUNvbmZpZyA9IHZvaWQgMDtcbiAgdXNlZFRhYmxlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGNvbnN0cnVjdG9yKHsgdGFibGUsIGZpZWxkcywgaXNQYXJ0aWFsU2VsZWN0LCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCwgZGlzdGluY3QgfSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICB3aXRoTGlzdCxcbiAgICAgIHRhYmxlLFxuICAgICAgZmllbGRzOiB7IC4uLmZpZWxkcyB9LFxuICAgICAgZGlzdGluY3QsXG4gICAgICBzZXRPcGVyYXRvcnM6IFtdXG4gICAgfTtcbiAgICB0aGlzLmlzUGFydGlhbFNlbGVjdCA9IGlzUGFydGlhbFNlbGVjdDtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5fID0ge1xuICAgICAgc2VsZWN0ZWRGaWVsZHM6IGZpZWxkcyxcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWdcbiAgICB9O1xuICAgIHRoaXMudGFibGVOYW1lID0gZ2V0VGFibGVMaWtlTmFtZSh0YWJsZSk7XG4gICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwID0gdHlwZW9mIHRoaXMudGFibGVOYW1lID09PSBcInN0cmluZ1wiID8geyBbdGhpcy50YWJsZU5hbWVdOiB0cnVlIH0gOiB7fTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXh0cmFjdFVzZWRUYWJsZSh0YWJsZSkpIHRoaXMudXNlZFRhYmxlcy5hZGQoaXRlbSk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRVc2VkVGFibGVzKCkge1xuICAgIHJldHVybiBbLi4udGhpcy51c2VkVGFibGVzXTtcbiAgfVxuICBjcmVhdGVKb2luKGpvaW5UeXBlKSB7XG4gICAgcmV0dXJuICh0YWJsZSwgb24pID0+IHtcbiAgICAgIGNvbnN0IGJhc2VUYWJsZU5hbWUgPSB0aGlzLnRhYmxlTmFtZTtcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGdldFRhYmxlTGlrZU5hbWUodGFibGUpO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGV4dHJhY3RVc2VkVGFibGUodGFibGUpKSB0aGlzLnVzZWRUYWJsZXMuYWRkKGl0ZW0pO1xuICAgICAgaWYgKHR5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5jb25maWcuam9pbnM/LnNvbWUoKGpvaW4pID0+IGpvaW4uYWxpYXMgPT09IHRhYmxlTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbGlhcyBcIiR7dGFibGVOYW1lfVwiIGlzIGFscmVhZHkgdXNlZCBpbiB0aGlzIHF1ZXJ5YCk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNQYXJ0aWFsU2VsZWN0KSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmpvaW5zTm90TnVsbGFibGVNYXApLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYmFzZVRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyA9IHtcbiAgICAgICAgICAgIFtiYXNlVGFibGVOYW1lXTogdGhpcy5jb25maWcuZmllbGRzXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiAhaXModGFibGUsIFNRTCkpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBpcyh0YWJsZSwgU3VicXVlcnkpID8gdGFibGUuXy5zZWxlY3RlZEZpZWxkcyA6IGlzKHRhYmxlLCBWaWV3KSA/IHRhYmxlW1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcyA6IHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHNbdGFibGVOYW1lXSA9IHNlbGVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG9uID0gb24oXG4gICAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJzcWxcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY29uZmlnLmpvaW5zKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLmpvaW5zID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmZpZy5qb2lucy5wdXNoKHsgb24sIHRhYmxlLCBqb2luVHlwZSwgYWxpYXM6IHRhYmxlTmFtZSB9KTtcbiAgICAgIGlmICh0eXBlb2YgdGFibGVOYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHN3aXRjaCAoam9pblR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwibGVmdFwiOiB7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXBbdGFibGVOYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJyaWdodFwiOiB7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXAgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCkubWFwKChba2V5XSkgPT4gW2tleSwgZmFsc2VdKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcFt0YWJsZU5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiY3Jvc3NcIjpcbiAgICAgICAgICBjYXNlIFwiaW5uZXJcIjoge1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwW3RhYmxlTmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJmdWxsXCI6IHtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5qb2luc05vdE51bGxhYmxlTWFwKS5tYXAoKFtrZXldKSA9PiBba2V5LCBmYWxzZV0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwW3RhYmxlTmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBgbGVmdCBqb2luYCBvcGVyYXRpb24gYnkgYWRkaW5nIGFub3RoZXIgdGFibGUgdG8gdGhlIGN1cnJlbnQgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgYXNzb2NpYXRlcyBlYWNoIHJvdyBvZiB0aGUgdGFibGUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyByb3cgZnJvbSB0aGUgam9pbmVkIHRhYmxlLCBpZiBhIG1hdGNoIGlzIGZvdW5kLiBJZiBubyBtYXRjaGluZyByb3cgZXhpc3RzLCBpdCBzZXRzIGFsbCBjb2x1bW5zIG9mIHRoZSBqb2luZWQgdGFibGUgdG8gbnVsbC5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNsZWZ0LWpvaW59XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gam9pbi5cbiAgICogQHBhcmFtIG9uIHRoZSBgb25gIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1c2VycyBhbmQgdGhlaXIgcGV0c1xuICAgKiBjb25zdCB1c2Vyc1dpdGhQZXRzOiB7IHVzZXI6IFVzZXI7IHBldHM6IFBldCB8IG51bGw7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCgpXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmxlZnRKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKlxuICAgKiAvLyBTZWxlY3QgdXNlcklkIGFuZCBwZXRJZFxuICAgKiBjb25zdCB1c2Vyc0lkc0FuZFBldElkczogeyB1c2VySWQ6IG51bWJlcjsgcGV0SWQ6IG51bWJlciB8IG51bGw7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqICAgdXNlcklkOiB1c2Vycy5pZCxcbiAgICogICBwZXRJZDogcGV0cy5pZCxcbiAgICogfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAubGVmdEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqIGBgYFxuICAgKi9cbiAgbGVmdEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJsZWZ0XCIpO1xuICAvKipcbiAgICogRXhlY3V0ZXMgYSBgcmlnaHQgam9pbmAgb3BlcmF0aW9uIGJ5IGFkZGluZyBhbm90aGVyIHRhYmxlIHRvIHRoZSBjdXJyZW50IHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGFzc29jaWF0ZXMgZWFjaCByb3cgb2YgdGhlIGpvaW5lZCB0YWJsZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHJvdyBmcm9tIHRoZSBtYWluIHRhYmxlLCBpZiBhIG1hdGNoIGlzIGZvdW5kLiBJZiBubyBtYXRjaGluZyByb3cgZXhpc3RzLCBpdCBzZXRzIGFsbCBjb2x1bW5zIG9mIHRoZSBtYWluIHRhYmxlIHRvIG51bGwuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvam9pbnMjcmlnaHQtam9pbn1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBqb2luLlxuICAgKiBAcGFyYW0gb24gdGhlIGBvbmAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVzZXJzIGFuZCB0aGVpciBwZXRzXG4gICAqIGNvbnN0IHVzZXJzV2l0aFBldHM6IHsgdXNlcjogVXNlciB8IG51bGw7IHBldHM6IFBldDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KClcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAucmlnaHRKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKlxuICAgKiAvLyBTZWxlY3QgdXNlcklkIGFuZCBwZXRJZFxuICAgKiBjb25zdCB1c2Vyc0lkc0FuZFBldElkczogeyB1c2VySWQ6IG51bWJlciB8IG51bGw7IHBldElkOiBudW1iZXI7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqICAgdXNlcklkOiB1c2Vycy5pZCxcbiAgICogICBwZXRJZDogcGV0cy5pZCxcbiAgICogfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAucmlnaHRKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKiBgYGBcbiAgICovXG4gIHJpZ2h0Sm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcInJpZ2h0XCIpO1xuICAvKipcbiAgICogRXhlY3V0ZXMgYW4gYGlubmVyIGpvaW5gIG9wZXJhdGlvbiwgY3JlYXRpbmcgYSBuZXcgdGFibGUgYnkgY29tYmluaW5nIHJvd3MgZnJvbSB0d28gdGFibGVzIHRoYXQgaGF2ZSBtYXRjaGluZyB2YWx1ZXMuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgcmV0cmlldmVzIHJvd3MgdGhhdCBoYXZlIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiBib3RoIGpvaW5lZCB0YWJsZXMuIFJvd3Mgd2l0aG91dCBtYXRjaGluZyBlbnRyaWVzIGluIGVpdGhlciB0YWJsZSBhcmUgZXhjbHVkZWQsIHJlc3VsdGluZyBpbiBhIHRhYmxlIHRoYXQgaW5jbHVkZXMgb25seSBtYXRjaGluZyBwYWlycy5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNpbm5lci1qb2lufVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIGpvaW4uXG4gICAqIEBwYXJhbSBvbiB0aGUgYG9uYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdXNlcnMgYW5kIHRoZWlyIHBldHNcbiAgICogY29uc3QgdXNlcnNXaXRoUGV0czogeyB1c2VyOiBVc2VyOyBwZXRzOiBQZXQ7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCgpXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmlubmVySm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICpcbiAgICogLy8gU2VsZWN0IHVzZXJJZCBhbmQgcGV0SWRcbiAgICogY29uc3QgdXNlcnNJZHNBbmRQZXRJZHM6IHsgdXNlcklkOiBudW1iZXI7IHBldElkOiBudW1iZXI7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqICAgdXNlcklkOiB1c2Vycy5pZCxcbiAgICogICBwZXRJZDogcGV0cy5pZCxcbiAgICogfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuaW5uZXJKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKiBgYGBcbiAgICovXG4gIGlubmVySm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImlubmVyXCIpO1xuICAvKipcbiAgICogRXhlY3V0ZXMgYSBgZnVsbCBqb2luYCBvcGVyYXRpb24gYnkgY29tYmluaW5nIHJvd3MgZnJvbSB0d28gdGFibGVzIGludG8gYSBuZXcgdGFibGUuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgcmV0cmlldmVzIGFsbCByb3dzIGZyb20gYm90aCBtYWluIGFuZCBqb2luZWQgdGFibGVzLCBtZXJnaW5nIHJvd3Mgd2l0aCBtYXRjaGluZyB2YWx1ZXMgYW5kIGZpbGxpbmcgaW4gYG51bGxgIGZvciBub24tbWF0Y2hpbmcgY29sdW1ucy5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNmdWxsLWpvaW59XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gam9pbi5cbiAgICogQHBhcmFtIG9uIHRoZSBgb25gIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1c2VycyBhbmQgdGhlaXIgcGV0c1xuICAgKiBjb25zdCB1c2Vyc1dpdGhQZXRzOiB7IHVzZXI6IFVzZXIgfCBudWxsOyBwZXRzOiBQZXQgfCBudWxsOyB9W10gPSBhd2FpdCBkYi5zZWxlY3QoKVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5mdWxsSm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICpcbiAgICogLy8gU2VsZWN0IHVzZXJJZCBhbmQgcGV0SWRcbiAgICogY29uc3QgdXNlcnNJZHNBbmRQZXRJZHM6IHsgdXNlcklkOiBudW1iZXIgfCBudWxsOyBwZXRJZDogbnVtYmVyIHwgbnVsbDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogICB1c2VySWQ6IHVzZXJzLmlkLFxuICAgKiAgIHBldElkOiBwZXRzLmlkLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5mdWxsSm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICogYGBgXG4gICAqL1xuICBmdWxsSm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImZ1bGxcIik7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGBjcm9zcyBqb2luYCBvcGVyYXRpb24gYnkgY29tYmluaW5nIHJvd3MgZnJvbSB0d28gdGFibGVzIGludG8gYSBuZXcgdGFibGUuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgcmV0cmlldmVzIGFsbCByb3dzIGZyb20gYm90aCBtYWluIGFuZCBqb2luZWQgdGFibGVzLCBtZXJnaW5nIGFsbCByb3dzIGZyb20gZWFjaCB0YWJsZS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNjcm9zcy1qb2lufVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIGpvaW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdXNlcnMsIGVhY2ggdXNlciB3aXRoIGV2ZXJ5IHBldFxuICAgKiBjb25zdCB1c2Vyc1dpdGhQZXRzOiB7IHVzZXI6IFVzZXI7IHBldHM6IFBldDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KClcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuY3Jvc3NKb2luKHBldHMpXG4gICAqXG4gICAqIC8vIFNlbGVjdCB1c2VySWQgYW5kIHBldElkXG4gICAqIGNvbnN0IHVzZXJzSWRzQW5kUGV0SWRzOiB7IHVzZXJJZDogbnVtYmVyOyBwZXRJZDogbnVtYmVyOyB9W10gPSBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiAgIHVzZXJJZDogdXNlcnMuaWQsXG4gICAqICAgcGV0SWQ6IHBldHMuaWQsXG4gICAqIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmNyb3NzSm9pbihwZXRzKVxuICAgKiBgYGBcbiAgICovXG4gIGNyb3NzSm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImNyb3NzXCIpO1xuICBjcmVhdGVTZXRPcGVyYXRvcih0eXBlLCBpc0FsbCkge1xuICAgIHJldHVybiAocmlnaHRTZWxlY3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IHJpZ2h0U2VsZWN0ID0gdHlwZW9mIHJpZ2h0U2VsZWN0aW9uID09PSBcImZ1bmN0aW9uXCIgPyByaWdodFNlbGVjdGlvbihnZXRTUUxpdGVTZXRPcGVyYXRvcnMoKSkgOiByaWdodFNlbGVjdGlvbjtcbiAgICAgIGlmICghaGF2ZVNhbWVLZXlzKHRoaXMuZ2V0U2VsZWN0ZWRGaWVsZHMoKSwgcmlnaHRTZWxlY3QuZ2V0U2VsZWN0ZWRGaWVsZHMoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiU2V0IG9wZXJhdG9yIGVycm9yICh1bmlvbiAvIGludGVyc2VjdCAvIGV4Y2VwdCk6IHNlbGVjdGVkIGZpZWxkcyBhcmUgbm90IHRoZSBzYW1lIG9yIGFyZSBpbiBhIGRpZmZlcmVudCBvcmRlclwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMucHVzaCh7IHR5cGUsIGlzQWxsLCByaWdodFNlbGVjdCB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYHVuaW9uYCBzZXQgb3BlcmF0b3IgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgY29tYmluZSB0aGUgcmVzdWx0IHNldHMgb2YgdGhlIGBzZWxlY3RgIHN0YXRlbWVudHMgYW5kIHJlbW92ZSBhbnkgZHVwbGljYXRlIHJvd3MgdGhhdCBhcHBlYXIgYWNyb3NzIHRoZW0uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2V0LW9wZXJhdGlvbnMjdW5pb259XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdW5pcXVlIG5hbWVzIGZyb20gY3VzdG9tZXJzIGFuZCB1c2VycyB0YWJsZXNcbiAgICogYXdhaXQgZGIuc2VsZWN0KHsgbmFtZTogdXNlcnMubmFtZSB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC51bmlvbihcbiAgICogICAgIGRiLnNlbGVjdCh7IG5hbWU6IGN1c3RvbWVycy5uYW1lIH0pLmZyb20oY3VzdG9tZXJzKVxuICAgKiAgICk7XG4gICAqIC8vIG9yXG4gICAqIGltcG9ydCB7IHVuaW9uIH0gZnJvbSAnZHJpenpsZS1vcm0vc3FsaXRlLWNvcmUnXG4gICAqXG4gICAqIGF3YWl0IHVuaW9uKFxuICAgKiAgIGRiLnNlbGVjdCh7IG5hbWU6IHVzZXJzLm5hbWUgfSkuZnJvbSh1c2VycyksXG4gICAqICAgZGIuc2VsZWN0KHsgbmFtZTogY3VzdG9tZXJzLm5hbWUgfSkuZnJvbShjdXN0b21lcnMpXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgdW5pb24gPSB0aGlzLmNyZWF0ZVNldE9wZXJhdG9yKFwidW5pb25cIiwgZmFsc2UpO1xuICAvKipcbiAgICogQWRkcyBgdW5pb24gYWxsYCBzZXQgb3BlcmF0b3IgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgY29tYmluZSB0aGUgcmVzdWx0LXNldCBvZiB0aGUgYHNlbGVjdGAgc3RhdGVtZW50cyBhbmQga2VlcCBhbGwgZHVwbGljYXRlIHJvd3MgdGhhdCBhcHBlYXIgYWNyb3NzIHRoZW0uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2V0LW9wZXJhdGlvbnMjdW5pb24tYWxsfVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHRyYW5zYWN0aW9uIGlkcyBmcm9tIGJvdGggb25saW5lIGFuZCBpbi1zdG9yZSBzYWxlc1xuICAgKiBhd2FpdCBkYi5zZWxlY3QoeyB0cmFuc2FjdGlvbjogb25saW5lU2FsZXMudHJhbnNhY3Rpb25JZCB9KVxuICAgKiAgIC5mcm9tKG9ubGluZVNhbGVzKVxuICAgKiAgIC51bmlvbkFsbChcbiAgICogICAgIGRiLnNlbGVjdCh7IHRyYW5zYWN0aW9uOiBpblN0b3JlU2FsZXMudHJhbnNhY3Rpb25JZCB9KS5mcm9tKGluU3RvcmVTYWxlcylcbiAgICogICApO1xuICAgKiAvLyBvclxuICAgKiBpbXBvcnQgeyB1bmlvbkFsbCB9IGZyb20gJ2RyaXp6bGUtb3JtL3NxbGl0ZS1jb3JlJ1xuICAgKlxuICAgKiBhd2FpdCB1bmlvbkFsbChcbiAgICogICBkYi5zZWxlY3QoeyB0cmFuc2FjdGlvbjogb25saW5lU2FsZXMudHJhbnNhY3Rpb25JZCB9KS5mcm9tKG9ubGluZVNhbGVzKSxcbiAgICogICBkYi5zZWxlY3QoeyB0cmFuc2FjdGlvbjogaW5TdG9yZVNhbGVzLnRyYW5zYWN0aW9uSWQgfSkuZnJvbShpblN0b3JlU2FsZXMpXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgdW5pb25BbGwgPSB0aGlzLmNyZWF0ZVNldE9wZXJhdG9yKFwidW5pb25cIiwgdHJ1ZSk7XG4gIC8qKlxuICAgKiBBZGRzIGBpbnRlcnNlY3RgIHNldCBvcGVyYXRvciB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCByZXRhaW4gb25seSB0aGUgcm93cyB0aGF0IGFyZSBwcmVzZW50IGluIGJvdGggcmVzdWx0IHNldHMgYW5kIGVsaW1pbmF0ZSBkdXBsaWNhdGVzLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NldC1vcGVyYXRpb25zI2ludGVyc2VjdH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGNvdXJzZSBuYW1lcyB0aGF0IGFyZSBvZmZlcmVkIGluIGJvdGggZGVwYXJ0bWVudHMgQSBhbmQgQlxuICAgKiBhd2FpdCBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBBLmNvdXJzZU5hbWUgfSlcbiAgICogICAuZnJvbShkZXBBKVxuICAgKiAgIC5pbnRlcnNlY3QoXG4gICAqICAgICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBCLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBCKVxuICAgKiAgICk7XG4gICAqIC8vIG9yXG4gICAqIGltcG9ydCB7IGludGVyc2VjdCB9IGZyb20gJ2RyaXp6bGUtb3JtL3NxbGl0ZS1jb3JlJ1xuICAgKlxuICAgKiBhd2FpdCBpbnRlcnNlY3QoXG4gICAqICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQS5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQSksXG4gICAqICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQi5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQilcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBpbnRlcnNlY3QgPSB0aGlzLmNyZWF0ZVNldE9wZXJhdG9yKFwiaW50ZXJzZWN0XCIsIGZhbHNlKTtcbiAgLyoqXG4gICAqIEFkZHMgYGV4Y2VwdGAgc2V0IG9wZXJhdG9yIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIGFsbCB1bmlxdWUgcm93cyBmcm9tIHRoZSBsZWZ0IHF1ZXJ5LCBleGNlcHQgZm9yIHRoZSByb3dzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIHJlc3VsdCBzZXQgb2YgdGhlIHJpZ2h0IHF1ZXJ5LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NldC1vcGVyYXRpb25zI2V4Y2VwdH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCBjb3Vyc2VzIG9mZmVyZWQgaW4gZGVwYXJ0bWVudCBBIGJ1dCBub3QgaW4gZGVwYXJ0bWVudCBCXG4gICAqIGF3YWl0IGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEEuY291cnNlTmFtZSB9KVxuICAgKiAgIC5mcm9tKGRlcEEpXG4gICAqICAgLmV4Y2VwdChcbiAgICogICAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEIuY291cnNlTmFtZSB9KS5mcm9tKGRlcEIpXG4gICAqICAgKTtcbiAgICogLy8gb3JcbiAgICogaW1wb3J0IHsgZXhjZXB0IH0gZnJvbSAnZHJpenpsZS1vcm0vc3FsaXRlLWNvcmUnXG4gICAqXG4gICAqIGF3YWl0IGV4Y2VwdChcbiAgICogICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBBLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBBKSxcbiAgICogICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBCLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBCKVxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIGV4Y2VwdCA9IHRoaXMuY3JlYXRlU2V0T3BlcmF0b3IoXCJleGNlcHRcIiwgZmFsc2UpO1xuICAvKiogQGludGVybmFsICovXG4gIGFkZFNldE9wZXJhdG9ycyhzZXRPcGVyYXRvcnMpIHtcbiAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMucHVzaCguLi5zZXRPcGVyYXRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgYHdoZXJlYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgc2VsZWN0IG9ubHkgdGhvc2Ugcm93cyB0aGF0IGZ1bGZpbGwgYSBzcGVjaWZpZWQgY29uZGl0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCNmaWx0ZXJpbmd9XG4gICAqXG4gICAqIEBwYXJhbSB3aGVyZSB0aGUgYHdoZXJlYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFlvdSBjYW4gdXNlIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyBhbmQgYHNxbCBmdW5jdGlvbmAgdG8gZmlsdGVyIHRoZSByb3dzIHRvIGJlIHNlbGVjdGVkLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIGNhcnMgd2l0aCBncmVlbiBjb2xvclxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKGNhcnMpLndoZXJlKGVxKGNhcnMuY29sb3IsICdncmVlbicpKTtcbiAgICogLy8gb3JcbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShjYXJzKS53aGVyZShzcWxgJHtjYXJzLmNvbG9yfSA9ICdncmVlbidgKVxuICAgKiBgYGBcbiAgICpcbiAgICogWW91IGNhbiBsb2dpY2FsbHkgY29tYmluZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgd2l0aCBgYW5kKClgIGFuZCBgb3IoKWAgb3BlcmF0b3JzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIEJNVyBjYXJzIHdpdGggYSBncmVlbiBjb2xvclxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKGNhcnMpLndoZXJlKGFuZChlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5icmFuZCwgJ0JNVycpKSk7XG4gICAqXG4gICAqIC8vIFNlbGVjdCBhbGwgY2FycyB3aXRoIHRoZSBncmVlbiBvciBibHVlIGNvbG9yXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oY2Fycykud2hlcmUob3IoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuY29sb3IsICdibHVlJykpKTtcbiAgICogYGBgXG4gICAqL1xuICB3aGVyZSh3aGVyZSkge1xuICAgIGlmICh0eXBlb2Ygd2hlcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgd2hlcmUgPSB3aGVyZShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcInNxbFwiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy53aGVyZSA9IHdoZXJlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgYGhhdmluZ2AgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHNlbGVjdCBvbmx5IHRob3NlIHJvd3MgdGhhdCBmdWxmaWxsIGEgc3BlY2lmaWVkIGNvbmRpdGlvbi4gSXQgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCBhZ2dyZWdhdGUgZnVuY3Rpb25zIHRvIGZpbHRlciB0aGUgYWdncmVnYXRlZCBkYXRhIGJhc2VkIG9uIGEgc3BlY2lmaWVkIGNvbmRpdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3QjYWdncmVnYXRpb25zfVxuICAgKlxuICAgKiBAcGFyYW0gaGF2aW5nIHRoZSBgaGF2aW5nYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgYnJhbmRzIHdpdGggbW9yZSB0aGFuIG9uZSBjYXJcbiAgICogYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogXHRicmFuZDogY2Fycy5icmFuZCxcbiAgICogXHRjb3VudDogc3FsPG51bWJlcj5gY2FzdChjb3VudCgke2NhcnMuaWR9KSBhcyBpbnQpYCxcbiAgICogfSlcbiAgICogICAuZnJvbShjYXJzKVxuICAgKiAgIC5ncm91cEJ5KGNhcnMuYnJhbmQpXG4gICAqICAgLmhhdmluZygoeyBjb3VudCB9KSA9PiBndChjb3VudCwgMSkpO1xuICAgKiBgYGBcbiAgICovXG4gIGhhdmluZyhoYXZpbmcpIHtcbiAgICBpZiAodHlwZW9mIGhhdmluZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBoYXZpbmcgPSBoYXZpbmcoXG4gICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJzcWxcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcuaGF2aW5nID0gaGF2aW5nO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdyb3VwQnkoLi4uY29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgY29sdW1uc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBncm91cEJ5ID0gY29sdW1uc1swXShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5ncm91cEJ5ID0gQXJyYXkuaXNBcnJheShncm91cEJ5KSA/IGdyb3VwQnkgOiBbZ3JvdXBCeV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnLmdyb3VwQnkgPSBjb2x1bW5zO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcmRlckJ5KC4uLmNvbHVtbnMpIHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbnNbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JkZXJCeSA9IGNvbHVtbnNbMF0oXG4gICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gQXJyYXkuaXNBcnJheShvcmRlckJ5KSA/IG9yZGVyQnkgOiBbb3JkZXJCeV07XG4gICAgICBpZiAodGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmF0KC0xKS5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gY29sdW1ucztcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMuYXQoLTEpLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGBsaW1pdGAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhpcyBxdWVyeS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3QjbGltaXQtLW9mZnNldH1cbiAgICpcbiAgICogQHBhcmFtIGxpbWl0IHRoZSBgbGltaXRgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gR2V0IHRoZSBmaXJzdCAxMCBwZW9wbGUgZnJvbSB0aGlzIHF1ZXJ5LlxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKHBlb3BsZSkubGltaXQoMTApO1xuICAgKiBgYGBcbiAgICovXG4gIGxpbWl0KGxpbWl0KSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMuYXQoLTEpLmxpbWl0ID0gbGltaXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnLmxpbWl0ID0gbGltaXQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGFuIGBvZmZzZXRgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBza2lwIGEgbnVtYmVyIG9mIHJvd3Mgd2hlbiByZXR1cm5pbmcgcmVzdWx0cyBmcm9tIHRoaXMgcXVlcnkuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I2xpbWl0LS1vZmZzZXR9XG4gICAqXG4gICAqIEBwYXJhbSBvZmZzZXQgdGhlIGBvZmZzZXRgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gR2V0IHRoZSAxMHRoLTIwdGggcGVvcGxlIGZyb20gdGhpcyBxdWVyeS5cbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShwZW9wbGUpLm9mZnNldCgxMCkubGltaXQoMTApO1xuICAgKiBgYGBcbiAgICovXG4gIG9mZnNldChvZmZzZXQpIHtcbiAgICBpZiAodGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5hdCgtMSkub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmZpZy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGRTZWxlY3RRdWVyeSh0aGlzLmNvbmZpZyk7XG4gIH1cbiAgdG9TUUwoKSB7XG4gICAgY29uc3QgeyB0eXBpbmdzOiBfdHlwaW5ncywgLi4ucmVzdCB9ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSk7XG4gICAgcmV0dXJuIHJlc3Q7XG4gIH1cbiAgYXMoYWxpYXMpIHtcbiAgICBjb25zdCB1c2VkVGFibGVzID0gW107XG4gICAgdXNlZFRhYmxlcy5wdXNoKC4uLmV4dHJhY3RVc2VkVGFibGUodGhpcy5jb25maWcudGFibGUpKTtcbiAgICBpZiAodGhpcy5jb25maWcuam9pbnMpIHtcbiAgICAgIGZvciAoY29uc3QgaXQgb2YgdGhpcy5jb25maWcuam9pbnMpIHVzZWRUYWJsZXMucHVzaCguLi5leHRyYWN0VXNlZFRhYmxlKGl0LnRhYmxlKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICBuZXcgU3VicXVlcnkodGhpcy5nZXRTUUwoKSwgdGhpcy5jb25maWcuZmllbGRzLCBhbGlhcywgZmFsc2UsIFsuLi5uZXcgU2V0KHVzZWRUYWJsZXMpXSksXG4gICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgYWxpYXMsIHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJlcnJvclwiIH0pXG4gICAgKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFNlbGVjdGVkRmllbGRzKCkge1xuICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgYWxpYXM6IHRoaXMudGFibGVOYW1lLCBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwiZXJyb3JcIiB9KVxuICAgICk7XG4gIH1cbiAgJGR5bmFtaWMoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVNlbGVjdEJhc2UgZXh0ZW5kcyBTUUxpdGVTZWxlY3RRdWVyeUJ1aWxkZXJCYXNlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU2VsZWN0XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXBhcmUoaXNPbmVUaW1lUXVlcnkgPSB0cnVlKSB7XG4gICAgaWYgKCF0aGlzLnNlc3Npb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBleGVjdXRlIGEgcXVlcnkgb24gYSBxdWVyeSBidWlsZGVyLiBQbGVhc2UgdXNlIGEgZGF0YWJhc2UgaW5zdGFuY2UgaW5zdGVhZC5cIik7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkc0xpc3QgPSBvcmRlclNlbGVjdGVkRmllbGRzKHRoaXMuY29uZmlnLmZpZWxkcyk7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNlc3Npb25baXNPbmVUaW1lUXVlcnkgPyBcInByZXBhcmVPbmVUaW1lUXVlcnlcIiA6IFwicHJlcGFyZVF1ZXJ5XCJdKFxuICAgICAgdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSksXG4gICAgICBmaWVsZHNMaXN0LFxuICAgICAgXCJhbGxcIixcbiAgICAgIHRydWUsXG4gICAgICB2b2lkIDAsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0XCIsXG4gICAgICAgIHRhYmxlczogWy4uLnRoaXMudXNlZFRhYmxlc11cbiAgICAgIH0sXG4gICAgICB0aGlzLmNhY2hlQ29uZmlnXG4gICAgKTtcbiAgICBxdWVyeS5qb2luc05vdE51bGxhYmxlTWFwID0gdGhpcy5qb2luc05vdE51bGxhYmxlTWFwO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuICAkd2l0aENhY2hlKGNvbmZpZykge1xuICAgIHRoaXMuY2FjaGVDb25maWcgPSBjb25maWcgPT09IHZvaWQgMCA/IHsgY29uZmlnOiB7fSwgZW5hYmxlOiB0cnVlLCBhdXRvSW52YWxpZGF0ZTogdHJ1ZSB9IDogY29uZmlnID09PSBmYWxzZSA/IHsgZW5hYmxlOiBmYWxzZSB9IDogeyBlbmFibGU6IHRydWUsIGF1dG9JbnZhbGlkYXRlOiB0cnVlLCAuLi5jb25maWcgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBwcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKTtcbiAgfVxuICBydW4gPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnJ1bihwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFsbCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuYWxsKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgZ2V0ID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5nZXQocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICB2YWx1ZXMgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWxsKCk7XG4gIH1cbn1cbmFwcGx5TWl4aW5zKFNRTGl0ZVNlbGVjdEJhc2UsIFtRdWVyeVByb21pc2VdKTtcbmZ1bmN0aW9uIGNyZWF0ZVNldE9wZXJhdG9yKHR5cGUsIGlzQWxsKSB7XG4gIHJldHVybiAobGVmdFNlbGVjdCwgcmlnaHRTZWxlY3QsIC4uLnJlc3RTZWxlY3RzKSA9PiB7XG4gICAgY29uc3Qgc2V0T3BlcmF0b3JzID0gW3JpZ2h0U2VsZWN0LCAuLi5yZXN0U2VsZWN0c10ubWFwKChzZWxlY3QpID0+ICh7XG4gICAgICB0eXBlLFxuICAgICAgaXNBbGwsXG4gICAgICByaWdodFNlbGVjdDogc2VsZWN0XG4gICAgfSkpO1xuICAgIGZvciAoY29uc3Qgc2V0T3BlcmF0b3Igb2Ygc2V0T3BlcmF0b3JzKSB7XG4gICAgICBpZiAoIWhhdmVTYW1lS2V5cyhsZWZ0U2VsZWN0LmdldFNlbGVjdGVkRmllbGRzKCksIHNldE9wZXJhdG9yLnJpZ2h0U2VsZWN0LmdldFNlbGVjdGVkRmllbGRzKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIlNldCBvcGVyYXRvciBlcnJvciAodW5pb24gLyBpbnRlcnNlY3QgLyBleGNlcHQpOiBzZWxlY3RlZCBmaWVsZHMgYXJlIG5vdCB0aGUgc2FtZSBvciBhcmUgaW4gYSBkaWZmZXJlbnQgb3JkZXJcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGVmdFNlbGVjdC5hZGRTZXRPcGVyYXRvcnMoc2V0T3BlcmF0b3JzKTtcbiAgfTtcbn1cbmNvbnN0IGdldFNRTGl0ZVNldE9wZXJhdG9ycyA9ICgpID0+ICh7XG4gIHVuaW9uLFxuICB1bmlvbkFsbCxcbiAgaW50ZXJzZWN0LFxuICBleGNlcHRcbn0pO1xuY29uc3QgdW5pb24gPSBjcmVhdGVTZXRPcGVyYXRvcihcInVuaW9uXCIsIGZhbHNlKTtcbmNvbnN0IHVuaW9uQWxsID0gY3JlYXRlU2V0T3BlcmF0b3IoXCJ1bmlvblwiLCB0cnVlKTtcbmNvbnN0IGludGVyc2VjdCA9IGNyZWF0ZVNldE9wZXJhdG9yKFwiaW50ZXJzZWN0XCIsIGZhbHNlKTtcbmNvbnN0IGV4Y2VwdCA9IGNyZWF0ZVNldE9wZXJhdG9yKFwiZXhjZXB0XCIsIGZhbHNlKTtcbmV4cG9ydCB7XG4gIFNRTGl0ZVNlbGVjdEJhc2UsXG4gIFNRTGl0ZVNlbGVjdEJ1aWxkZXIsXG4gIFNRTGl0ZVNlbGVjdFF1ZXJ5QnVpbGRlckJhc2UsXG4gIGV4Y2VwdCxcbiAgaW50ZXJzZWN0LFxuICB1bmlvbixcbiAgdW5pb25BbGxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWxlY3QuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblByb3h5SGFuZGxlciB9IGZyb20gXCIuLi8uLi9zZWxlY3Rpb24tcHJveHkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZURpYWxlY3QsIFNRTGl0ZVN5bmNEaWFsZWN0IH0gZnJvbSBcIi4uL2RpYWxlY3QuanNcIjtcbmltcG9ydCB7IFdpdGhTdWJxdWVyeSB9IGZyb20gXCIuLi8uLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlU2VsZWN0QnVpbGRlciB9IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuY2xhc3MgUXVlcnlCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlUXVlcnlCdWlsZGVyXCI7XG4gIGRpYWxlY3Q7XG4gIGRpYWxlY3RDb25maWc7XG4gIGNvbnN0cnVjdG9yKGRpYWxlY3QpIHtcbiAgICB0aGlzLmRpYWxlY3QgPSBpcyhkaWFsZWN0LCBTUUxpdGVEaWFsZWN0KSA/IGRpYWxlY3QgOiB2b2lkIDA7XG4gICAgdGhpcy5kaWFsZWN0Q29uZmlnID0gaXMoZGlhbGVjdCwgU1FMaXRlRGlhbGVjdCkgPyB2b2lkIDAgOiBkaWFsZWN0O1xuICB9XG4gICR3aXRoID0gKGFsaWFzLCBzZWxlY3Rpb24pID0+IHtcbiAgICBjb25zdCBxdWVyeUJ1aWxkZXIgPSB0aGlzO1xuICAgIGNvbnN0IGFzID0gKHFiKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHFiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcWIgPSBxYihxdWVyeUJ1aWxkZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgICAgbmV3IFdpdGhTdWJxdWVyeShcbiAgICAgICAgICBxYi5nZXRTUUwoKSxcbiAgICAgICAgICBzZWxlY3Rpb24gPz8gKFwiZ2V0U2VsZWN0ZWRGaWVsZHNcIiBpbiBxYiA/IHFiLmdldFNlbGVjdGVkRmllbGRzKCkgPz8ge30gOiB7fSksXG4gICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApLFxuICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgYWxpYXMsIHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJlcnJvclwiIH0pXG4gICAgICApO1xuICAgIH07XG4gICAgcmV0dXJuIHsgYXMgfTtcbiAgfTtcbiAgd2l0aCguLi5xdWVyaWVzKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgZnVuY3Rpb24gc2VsZWN0KGZpZWxkcykge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgICBzZXNzaW9uOiB2b2lkIDAsXG4gICAgICAgIGRpYWxlY3Q6IHNlbGYuZ2V0RGlhbGVjdCgpLFxuICAgICAgICB3aXRoTGlzdDogcXVlcmllc1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNlbGVjdERpc3RpbmN0KGZpZWxkcykge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgICBzZXNzaW9uOiB2b2lkIDAsXG4gICAgICAgIGRpYWxlY3Q6IHNlbGYuZ2V0RGlhbGVjdCgpLFxuICAgICAgICB3aXRoTGlzdDogcXVlcmllcyxcbiAgICAgICAgZGlzdGluY3Q6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4geyBzZWxlY3QsIHNlbGVjdERpc3RpbmN0IH07XG4gIH1cbiAgc2VsZWN0KGZpZWxkcykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7IGZpZWxkczogZmllbGRzID8/IHZvaWQgMCwgc2Vzc2lvbjogdm9pZCAwLCBkaWFsZWN0OiB0aGlzLmdldERpYWxlY3QoKSB9KTtcbiAgfVxuICBzZWxlY3REaXN0aW5jdChmaWVsZHMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgc2Vzc2lvbjogdm9pZCAwLFxuICAgICAgZGlhbGVjdDogdGhpcy5nZXREaWFsZWN0KCksXG4gICAgICBkaXN0aW5jdDogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIC8vIExhenkgbG9hZCBkaWFsZWN0IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3lcbiAgZ2V0RGlhbGVjdCgpIHtcbiAgICBpZiAoIXRoaXMuZGlhbGVjdCkge1xuICAgICAgdGhpcy5kaWFsZWN0ID0gbmV3IFNRTGl0ZVN5bmNEaWFsZWN0KHRoaXMuZGlhbGVjdENvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpYWxlY3Q7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFF1ZXJ5QnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXJ5LWJ1aWxkZXIuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQgeyBQYXJhbSwgU1FMLCBzcWwgfSBmcm9tIFwiLi4vLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IENvbHVtbnMsIFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBoYXZlU2FtZUtleXMsIG1hcFVwZGF0ZVNldCwgb3JkZXJTZWxlY3RlZEZpZWxkcyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdFVzZWRUYWJsZSB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlci5qc1wiO1xuY2xhc3MgU1FMaXRlSW5zZXJ0QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy53aXRoTGlzdCA9IHdpdGhMaXN0O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUluc2VydEJ1aWxkZXJcIjtcbiAgdmFsdWVzKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWVzKSA/IHZhbHVlcyA6IFt2YWx1ZXNdO1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ2YWx1ZXMoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIGF0IGxlYXN0IG9uZSB2YWx1ZVwiKTtcbiAgICB9XG4gICAgY29uc3QgbWFwcGVkVmFsdWVzID0gdmFsdWVzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgY29uc3QgY29scyA9IHRoaXMudGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAgICAgZm9yIChjb25zdCBjb2xLZXkgb2YgT2JqZWN0LmtleXMoZW50cnkpKSB7XG4gICAgICAgIGNvbnN0IGNvbFZhbHVlID0gZW50cnlbY29sS2V5XTtcbiAgICAgICAgcmVzdWx0W2NvbEtleV0gPSBpcyhjb2xWYWx1ZSwgU1FMKSA/IGNvbFZhbHVlIDogbmV3IFBhcmFtKGNvbFZhbHVlLCBjb2xzW2NvbEtleV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUluc2VydEJhc2UodGhpcy50YWJsZSwgbWFwcGVkVmFsdWVzLCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCwgdGhpcy53aXRoTGlzdCk7XG4gIH1cbiAgc2VsZWN0KHNlbGVjdFF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VsZWN0ID0gdHlwZW9mIHNlbGVjdFF1ZXJ5ID09PSBcImZ1bmN0aW9uXCIgPyBzZWxlY3RRdWVyeShuZXcgUXVlcnlCdWlsZGVyKCkpIDogc2VsZWN0UXVlcnk7XG4gICAgaWYgKCFpcyhzZWxlY3QsIFNRTCkgJiYgIWhhdmVTYW1lS2V5cyh0aGlzLnRhYmxlW0NvbHVtbnNdLCBzZWxlY3QuXy5zZWxlY3RlZEZpZWxkcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJJbnNlcnQgc2VsZWN0IGVycm9yOiBzZWxlY3RlZCBmaWVsZHMgYXJlIG5vdCB0aGUgc2FtZSBvciBhcmUgaW4gYSBkaWZmZXJlbnQgb3JkZXIgY29tcGFyZWQgdG8gdGhlIHRhYmxlIGRlZmluaXRpb25cIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVJbnNlcnRCYXNlKHRoaXMudGFibGUsIHNlbGVjdCwgdGhpcy5zZXNzaW9uLCB0aGlzLmRpYWxlY3QsIHRoaXMud2l0aExpc3QsIHRydWUpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVJbnNlcnRCYXNlIGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IodGFibGUsIHZhbHVlcywgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QsIHNlbGVjdCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuY29uZmlnID0geyB0YWJsZSwgdmFsdWVzLCB3aXRoTGlzdCwgc2VsZWN0IH07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW5zZXJ0XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICByZXR1cm5pbmcoZmllbGRzID0gdGhpcy5jb25maWcudGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkNvbHVtbnNdKSB7XG4gICAgdGhpcy5jb25maWcucmV0dXJuaW5nID0gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGFuIGBvbiBjb25mbGljdCBkbyBub3RoaW5nYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHNpbXBseSBhdm9pZHMgaW5zZXJ0aW5nIGEgcm93IGFzIGl0cyBhbHRlcm5hdGl2ZSBhY3Rpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvaW5zZXJ0I29uLWNvbmZsaWN0LWRvLW5vdGhpbmd9XG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIGB0YXJnZXRgIGFuZCBgd2hlcmVgIGNsYXVzZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIC8vIEluc2VydCBvbmUgcm93IGFuZCBjYW5jZWwgdGhlIGluc2VydCBpZiB0aGVyZSdzIGEgY29uZmxpY3RcbiAgICogYXdhaXQgZGIuaW5zZXJ0KGNhcnMpXG4gICAqICAgLnZhbHVlcyh7IGlkOiAxLCBicmFuZDogJ0JNVycgfSlcbiAgICogICAub25Db25mbGljdERvTm90aGluZygpO1xuICAgKlxuICAgKiAvLyBFeHBsaWNpdGx5IHNwZWNpZnkgY29uZmxpY3QgdGFyZ2V0XG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKVxuICAgKiAgIC52YWx1ZXMoeyBpZDogMSwgYnJhbmQ6ICdCTVcnIH0pXG4gICAqICAgLm9uQ29uZmxpY3REb05vdGhpbmcoeyB0YXJnZXQ6IGNhcnMuaWQgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgb25Db25mbGljdERvTm90aGluZyhjb25maWcgPSB7fSkge1xuICAgIGlmICghdGhpcy5jb25maWcub25Db25mbGljdCkgdGhpcy5jb25maWcub25Db25mbGljdCA9IFtdO1xuICAgIGlmIChjb25maWcudGFyZ2V0ID09PSB2b2lkIDApIHtcbiAgICAgIHRoaXMuY29uZmlnLm9uQ29uZmxpY3QucHVzaChzcWxgIG9uIGNvbmZsaWN0IGRvIG5vdGhpbmdgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0U3FsID0gQXJyYXkuaXNBcnJheShjb25maWcudGFyZ2V0KSA/IHNxbGAke2NvbmZpZy50YXJnZXR9YCA6IHNxbGAke1tjb25maWcudGFyZ2V0XX1gO1xuICAgICAgY29uc3Qgd2hlcmVTcWwgPSBjb25maWcud2hlcmUgPyBzcWxgIHdoZXJlICR7Y29uZmlnLndoZXJlfWAgOiBzcWxgYDtcbiAgICAgIHRoaXMuY29uZmlnLm9uQ29uZmxpY3QucHVzaChzcWxgIG9uIGNvbmZsaWN0ICR7dGFyZ2V0U3FsfSBkbyBub3RoaW5nJHt3aGVyZVNxbH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYW4gYG9uIGNvbmZsaWN0IGRvIHVwZGF0ZWAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGUgZXhpc3Rpbmcgcm93IHRoYXQgY29uZmxpY3RzIHdpdGggdGhlIHJvdyBwcm9wb3NlZCBmb3IgaW5zZXJ0aW9uIGFzIGl0cyBhbHRlcm5hdGl2ZSBhY3Rpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvaW5zZXJ0I3Vwc2VydHMtYW5kLWNvbmZsaWN0c31cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyBUaGUgYHRhcmdldGAsIGBzZXRgIGFuZCBgd2hlcmVgIGNsYXVzZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIC8vIFVwZGF0ZSB0aGUgcm93IGlmIHRoZXJlJ3MgYSBjb25mbGljdFxuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycylcbiAgICogICAudmFsdWVzKHsgaWQ6IDEsIGJyYW5kOiAnQk1XJyB9KVxuICAgKiAgIC5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgKiAgICAgdGFyZ2V0OiBjYXJzLmlkLFxuICAgKiAgICAgc2V0OiB7IGJyYW5kOiAnUG9yc2NoZScgfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiAvLyBVcHNlcnQgd2l0aCAnd2hlcmUnIGNsYXVzZVxuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycylcbiAgICogICAudmFsdWVzKHsgaWQ6IDEsIGJyYW5kOiAnQk1XJyB9KVxuICAgKiAgIC5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgKiAgICAgdGFyZ2V0OiBjYXJzLmlkLFxuICAgKiAgICAgc2V0OiB7IGJyYW5kOiAnbmV3Qk1XJyB9LFxuICAgKiAgICAgd2hlcmU6IHNxbGAke2NhcnMuY3JlYXRlZEF0fSA+ICcyMDIzLTAxLTAxJzo6ZGF0ZWAsXG4gICAqICAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgb25Db25mbGljdERvVXBkYXRlKGNvbmZpZykge1xuICAgIGlmIChjb25maWcud2hlcmUgJiYgKGNvbmZpZy50YXJnZXRXaGVyZSB8fCBjb25maWcuc2V0V2hlcmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdZb3UgY2Fubm90IHVzZSBib3RoIFwid2hlcmVcIiBhbmQgXCJ0YXJnZXRXaGVyZVwiL1wic2V0V2hlcmVcIiBhdCB0aGUgc2FtZSB0aW1lIC0gXCJ3aGVyZVwiIGlzIGRlcHJlY2F0ZWQsIHVzZSBcInRhcmdldFdoZXJlXCIgb3IgXCJzZXRXaGVyZVwiIGluc3RlYWQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5vbkNvbmZsaWN0KSB0aGlzLmNvbmZpZy5vbkNvbmZsaWN0ID0gW107XG4gICAgY29uc3Qgd2hlcmVTcWwgPSBjb25maWcud2hlcmUgPyBzcWxgIHdoZXJlICR7Y29uZmlnLndoZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3QgdGFyZ2V0V2hlcmVTcWwgPSBjb25maWcudGFyZ2V0V2hlcmUgPyBzcWxgIHdoZXJlICR7Y29uZmlnLnRhcmdldFdoZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgc2V0V2hlcmVTcWwgPSBjb25maWcuc2V0V2hlcmUgPyBzcWxgIHdoZXJlICR7Y29uZmlnLnNldFdoZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3QgdGFyZ2V0U3FsID0gQXJyYXkuaXNBcnJheShjb25maWcudGFyZ2V0KSA/IHNxbGAke2NvbmZpZy50YXJnZXR9YCA6IHNxbGAke1tjb25maWcudGFyZ2V0XX1gO1xuICAgIGNvbnN0IHNldFNxbCA9IHRoaXMuZGlhbGVjdC5idWlsZFVwZGF0ZVNldCh0aGlzLmNvbmZpZy50YWJsZSwgbWFwVXBkYXRlU2V0KHRoaXMuY29uZmlnLnRhYmxlLCBjb25maWcuc2V0KSk7XG4gICAgdGhpcy5jb25maWcub25Db25mbGljdC5wdXNoKFxuICAgICAgc3FsYCBvbiBjb25mbGljdCAke3RhcmdldFNxbH0ke3RhcmdldFdoZXJlU3FsfSBkbyB1cGRhdGUgc2V0ICR7c2V0U3FsfSR7d2hlcmVTcWx9JHtzZXRXaGVyZVNxbH1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0LmJ1aWxkSW5zZXJ0UXVlcnkodGhpcy5jb25maWcpO1xuICB9XG4gIHRvU1FMKCkge1xuICAgIGNvbnN0IHsgdHlwaW5nczogX3R5cGluZ3MsIC4uLnJlc3QgfSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpO1xuICAgIHJldHVybiByZXN0O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXBhcmUoaXNPbmVUaW1lUXVlcnkgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbltpc09uZVRpbWVRdWVyeSA/IFwicHJlcGFyZU9uZVRpbWVRdWVyeVwiIDogXCJwcmVwYXJlUXVlcnlcIl0oXG4gICAgICB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKSxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA/IFwiYWxsXCIgOiBcInJ1blwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJpbnNlcnRcIixcbiAgICAgICAgdGFibGVzOiBleHRyYWN0VXNlZFRhYmxlKHRoaXMuY29uZmlnLnRhYmxlKVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSk7XG4gIH1cbiAgcnVuID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5ydW4ocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhbGwgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmFsbChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGdldCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuZ2V0KHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgdmFsdWVzID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS52YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPyB0aGlzLmFsbCgpIDogdGhpcy5ydW4oKTtcbiAgfVxuICAkZHluYW1pYygpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlSW5zZXJ0QmFzZSxcbiAgU1FMaXRlSW5zZXJ0QnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluc2VydC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblByb3h5SGFuZGxlciB9IGZyb20gXCIuLi8uLi9zZWxlY3Rpb24tcHJveHkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuLi8uLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUuanNcIjtcbmltcG9ydCB7XG4gIGdldFRhYmxlTGlrZU5hbWUsXG4gIG1hcFVwZGF0ZVNldCxcbiAgb3JkZXJTZWxlY3RlZEZpZWxkc1xufSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3ZpZXctY29tbW9uLmpzXCI7XG5pbXBvcnQgeyBleHRyYWN0VXNlZFRhYmxlIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVWaWV3QmFzZSB9IGZyb20gXCIuLi92aWV3LWJhc2UuanNcIjtcbmNsYXNzIFNRTGl0ZVVwZGF0ZUJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMud2l0aExpc3QgPSB3aXRoTGlzdDtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVVcGRhdGVCdWlsZGVyXCI7XG4gIHNldCh2YWx1ZXMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVVwZGF0ZUJhc2UoXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgbWFwVXBkYXRlU2V0KHRoaXMudGFibGUsIHZhbHVlcyksXG4gICAgICB0aGlzLnNlc3Npb24sXG4gICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICB0aGlzLndpdGhMaXN0XG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVXBkYXRlQmFzZSBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBzZXQsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5jb25maWcgPSB7IHNldCwgdGFibGUsIHdpdGhMaXN0LCBqb2luczogW10gfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVVcGRhdGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIGZyb20oc291cmNlKSB7XG4gICAgdGhpcy5jb25maWcuZnJvbSA9IHNvdXJjZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBjcmVhdGVKb2luKGpvaW5UeXBlKSB7XG4gICAgcmV0dXJuICh0YWJsZSwgb24pID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGdldFRhYmxlTGlrZU5hbWUodGFibGUpO1xuICAgICAgaWYgKHR5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5jb25maWcuam9pbnMuc29tZSgoam9pbikgPT4gam9pbi5hbGlhcyA9PT0gdGFibGVOYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFsaWFzIFwiJHt0YWJsZU5hbWV9XCIgaXMgYWxyZWFkeSB1c2VkIGluIHRoaXMgcXVlcnlgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCBmcm9tID0gdGhpcy5jb25maWcuZnJvbSA/IGlzKHRhYmxlLCBTUUxpdGVUYWJsZSkgPyB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10gOiBpcyh0YWJsZSwgU3VicXVlcnkpID8gdGFibGUuXy5zZWxlY3RlZEZpZWxkcyA6IGlzKHRhYmxlLCBTUUxpdGVWaWV3QmFzZSkgPyB0YWJsZVtWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHMgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICAgIG9uID0gb24oXG4gICAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgICAgdGhpcy5jb25maWcudGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdLFxuICAgICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJzcWxcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgICApLFxuICAgICAgICAgIGZyb20gJiYgbmV3IFByb3h5KFxuICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwic3FsXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25maWcuam9pbnMucHVzaCh7IG9uLCB0YWJsZSwgam9pblR5cGUsIGFsaWFzOiB0YWJsZU5hbWUgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9XG4gIGxlZnRKb2luID0gdGhpcy5jcmVhdGVKb2luKFwibGVmdFwiKTtcbiAgcmlnaHRKb2luID0gdGhpcy5jcmVhdGVKb2luKFwicmlnaHRcIik7XG4gIGlubmVySm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImlubmVyXCIpO1xuICBmdWxsSm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImZ1bGxcIik7XG4gIC8qKlxuICAgKiBBZGRzIGEgJ3doZXJlJyBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIG9ubHkgdGhvc2Ugcm93cyB0aGF0IGZ1bGZpbGwgYSBzcGVjaWZpZWQgY29uZGl0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3VwZGF0ZX1cbiAgICpcbiAgICogQHBhcmFtIHdoZXJlIHRoZSAnd2hlcmUnIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogWW91IGNhbiB1c2UgY29uZGl0aW9uYWwgb3BlcmF0b3JzIGFuZCBgc3FsIGZ1bmN0aW9uYCB0byBmaWx0ZXIgdGhlIHJvd3MgdG8gYmUgdXBkYXRlZC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gVXBkYXRlIGFsbCBjYXJzIHdpdGggZ3JlZW4gY29sb3JcbiAgICogZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KVxuICAgKiAgIC53aGVyZShlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSk7XG4gICAqIC8vIG9yXG4gICAqIGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSlcbiAgICogICAud2hlcmUoc3FsYCR7Y2Fycy5jb2xvcn0gPSAnZ3JlZW4nYClcbiAgICogYGBgXG4gICAqXG4gICAqIFlvdSBjYW4gbG9naWNhbGx5IGNvbWJpbmUgY29uZGl0aW9uYWwgb3BlcmF0b3JzIHdpdGggYGFuZCgpYCBhbmQgYG9yKClgIG9wZXJhdG9yczpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gVXBkYXRlIGFsbCBCTVcgY2FycyB3aXRoIGEgZ3JlZW4gY29sb3JcbiAgICogZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KVxuICAgKiAgIC53aGVyZShhbmQoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuYnJhbmQsICdCTVcnKSkpO1xuICAgKlxuICAgKiAvLyBVcGRhdGUgYWxsIGNhcnMgd2l0aCB0aGUgZ3JlZW4gb3IgYmx1ZSBjb2xvclxuICAgKiBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pXG4gICAqICAgLndoZXJlKG9yKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmNvbG9yLCAnYmx1ZScpKSk7XG4gICAqIGBgYFxuICAgKi9cbiAgd2hlcmUod2hlcmUpIHtcbiAgICB0aGlzLmNvbmZpZy53aGVyZSA9IHdoZXJlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yZGVyQnkoLi4uY29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgY29sdW1uc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmRlckJ5ID0gY29sdW1uc1swXShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLnRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBBcnJheS5pc0FycmF5KG9yZGVyQnkpID8gb3JkZXJCeSA6IFtvcmRlckJ5XTtcbiAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IGNvbHVtbnM7XG4gICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBsaW1pdChsaW1pdCkge1xuICAgIHRoaXMuY29uZmlnLmxpbWl0ID0gbGltaXQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgcmV0dXJuaW5nKGZpZWxkcyA9IHRoaXMuY29uZmlnLnRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5Db2x1bW5zXSkge1xuICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA9IG9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGRzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0LmJ1aWxkVXBkYXRlUXVlcnkodGhpcy5jb25maWcpO1xuICB9XG4gIHRvU1FMKCkge1xuICAgIGNvbnN0IHsgdHlwaW5nczogX3R5cGluZ3MsIC4uLnJlc3QgfSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpO1xuICAgIHJldHVybiByZXN0O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXBhcmUoaXNPbmVUaW1lUXVlcnkgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbltpc09uZVRpbWVRdWVyeSA/IFwicHJlcGFyZU9uZVRpbWVRdWVyeVwiIDogXCJwcmVwYXJlUXVlcnlcIl0oXG4gICAgICB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKSxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA/IFwiYWxsXCIgOiBcInJ1blwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJpbnNlcnRcIixcbiAgICAgICAgdGFibGVzOiBleHRyYWN0VXNlZFRhYmxlKHRoaXMuY29uZmlnLnRhYmxlKVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSk7XG4gIH1cbiAgcnVuID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5ydW4ocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhbGwgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmFsbChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGdldCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuZ2V0KHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgdmFsdWVzID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS52YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPyB0aGlzLmFsbCgpIDogdGhpcy5ydW4oKTtcbiAgfVxuICAkZHluYW1pYygpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlVXBkYXRlQmFzZSxcbiAgU1FMaXRlVXBkYXRlQnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVwZGF0ZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTUUwsIHNxbCB9IGZyb20gXCIuLi8uLi9zcWwvc3FsLmpzXCI7XG5jbGFzcyBTUUxpdGVDb3VudEJ1aWxkZXIgZXh0ZW5kcyBTUUwge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcihTUUxpdGVDb3VudEJ1aWxkZXIuYnVpbGRFbWJlZGRlZENvdW50KHBhcmFtcy5zb3VyY2UsIHBhcmFtcy5maWx0ZXJzKS5xdWVyeUNodW5rcyk7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5zZXNzaW9uID0gcGFyYW1zLnNlc3Npb247XG4gICAgdGhpcy5zcWwgPSBTUUxpdGVDb3VudEJ1aWxkZXIuYnVpbGRDb3VudChcbiAgICAgIHBhcmFtcy5zb3VyY2UsXG4gICAgICBwYXJhbXMuZmlsdGVyc1xuICAgICk7XG4gIH1cbiAgc3FsO1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVDb3VudEJ1aWxkZXJBc3luY1wiO1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9IFwiU1FMaXRlQ291bnRCdWlsZGVyQXN5bmNcIjtcbiAgc2Vzc2lvbjtcbiAgc3RhdGljIGJ1aWxkRW1iZWRkZWRDb3VudChzb3VyY2UsIGZpbHRlcnMpIHtcbiAgICByZXR1cm4gc3FsYChzZWxlY3QgY291bnQoKikgZnJvbSAke3NvdXJjZX0ke3NxbC5yYXcoXCIgd2hlcmUgXCIpLmlmKGZpbHRlcnMpfSR7ZmlsdGVyc30pYDtcbiAgfVxuICBzdGF0aWMgYnVpbGRDb3VudChzb3VyY2UsIGZpbHRlcnMpIHtcbiAgICByZXR1cm4gc3FsYHNlbGVjdCBjb3VudCgqKSBmcm9tICR7c291cmNlfSR7c3FsLnJhdyhcIiB3aGVyZSBcIikuaWYoZmlsdGVycyl9JHtmaWx0ZXJzfWA7XG4gIH1cbiAgdGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5zZXNzaW9uLmNvdW50KHRoaXMuc3FsKSkudGhlbihcbiAgICAgIG9uZnVsZmlsbGVkLFxuICAgICAgb25yZWplY3RlZFxuICAgICk7XG4gIH1cbiAgY2F0Y2gob25SZWplY3RlZCkge1xuICAgIHJldHVybiB0aGlzLnRoZW4odm9pZCAwLCBvblJlamVjdGVkKTtcbiAgfVxuICBmaW5hbGx5KG9uRmluYWxseSkge1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgb25GaW5hbGx5Py4oKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcbiAgICAgIChyZWFzb24pID0+IHtcbiAgICAgICAgb25GaW5hbGx5Py4oKTtcbiAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUNvdW50QnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvdW50LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQge1xuICBtYXBSZWxhdGlvbmFsUm93XG59IGZyb20gXCIuLi8uLi9yZWxhdGlvbnMuanNcIjtcbmNsYXNzIFJlbGF0aW9uYWxRdWVyeUJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcihtb2RlLCBmdWxsU2NoZW1hLCBzY2hlbWEsIHRhYmxlTmFtZXNNYXAsIHRhYmxlLCB0YWJsZUNvbmZpZywgZGlhbGVjdCwgc2Vzc2lvbikge1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgdGhpcy5mdWxsU2NoZW1hID0gZnVsbFNjaGVtYTtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLnRhYmxlTmFtZXNNYXAgPSB0YWJsZU5hbWVzTWFwO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnRhYmxlQ29uZmlnID0gdGFibGVDb25maWc7XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUFzeW5jUmVsYXRpb25hbFF1ZXJ5QnVpbGRlclwiO1xuICBmaW5kTWFueShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBcInN5bmNcIiA/IG5ldyBTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5KFxuICAgICAgdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIGNvbmZpZyA/IGNvbmZpZyA6IHt9LFxuICAgICAgXCJtYW55XCJcbiAgICApIDogbmV3IFNRTGl0ZVJlbGF0aW9uYWxRdWVyeShcbiAgICAgIHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGhpcy50YWJsZSxcbiAgICAgIHRoaXMudGFibGVDb25maWcsXG4gICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICB0aGlzLnNlc3Npb24sXG4gICAgICBjb25maWcgPyBjb25maWcgOiB7fSxcbiAgICAgIFwibWFueVwiXG4gICAgKTtcbiAgfVxuICBmaW5kRmlyc3QoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gXCJzeW5jXCIgPyBuZXcgU1FMaXRlU3luY1JlbGF0aW9uYWxRdWVyeShcbiAgICAgIHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGhpcy50YWJsZSxcbiAgICAgIHRoaXMudGFibGVDb25maWcsXG4gICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICB0aGlzLnNlc3Npb24sXG4gICAgICBjb25maWcgPyB7IC4uLmNvbmZpZywgbGltaXQ6IDEgfSA6IHsgbGltaXQ6IDEgfSxcbiAgICAgIFwiZmlyc3RcIlxuICAgICkgOiBuZXcgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5KFxuICAgICAgdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIGNvbmZpZyA/IHsgLi4uY29uZmlnLCBsaW1pdDogMSB9IDogeyBsaW1pdDogMSB9LFxuICAgICAgXCJmaXJzdFwiXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5IGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IoZnVsbFNjaGVtYSwgc2NoZW1hLCB0YWJsZU5hbWVzTWFwLCB0YWJsZSwgdGFibGVDb25maWcsIGRpYWxlY3QsIHNlc3Npb24sIGNvbmZpZywgbW9kZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5mdWxsU2NoZW1hID0gZnVsbFNjaGVtYTtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLnRhYmxlTmFtZXNNYXAgPSB0YWJsZU5hbWVzTWFwO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnRhYmxlQ29uZmlnID0gdGFibGVDb25maWc7XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQXN5bmNSZWxhdGlvbmFsUXVlcnlcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBtb2RlO1xuICAvKiogQGludGVybmFsICovXG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0LmJ1aWxkUmVsYXRpb25hbFF1ZXJ5KHtcbiAgICAgIGZ1bGxTY2hlbWE6IHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICB0YWJsZU5hbWVzTWFwOiB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0YWJsZTogdGhpcy50YWJsZSxcbiAgICAgIHRhYmxlQ29uZmlnOiB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgcXVlcnlDb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgdGFibGVBbGlhczogdGhpcy50YWJsZUNvbmZpZy50c05hbWVcbiAgICB9KS5zcWw7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyBxdWVyeSwgYnVpbHRRdWVyeSB9ID0gdGhpcy5fdG9TUUwoKTtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uW2lzT25lVGltZVF1ZXJ5ID8gXCJwcmVwYXJlT25lVGltZVF1ZXJ5XCIgOiBcInByZXBhcmVRdWVyeVwiXShcbiAgICAgIGJ1aWx0UXVlcnksXG4gICAgICB2b2lkIDAsXG4gICAgICB0aGlzLm1vZGUgPT09IFwiZmlyc3RcIiA/IFwiZ2V0XCIgOiBcImFsbFwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIChyYXdSb3dzLCBtYXBDb2x1bW5WYWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCByb3dzID0gcmF3Um93cy5tYXAoXG4gICAgICAgICAgKHJvdykgPT4gbWFwUmVsYXRpb25hbFJvdyh0aGlzLnNjaGVtYSwgdGhpcy50YWJsZUNvbmZpZywgcm93LCBxdWVyeS5zZWxlY3Rpb24sIG1hcENvbHVtblZhbHVlKVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSBcImZpcnN0XCIpIHtcbiAgICAgICAgICByZXR1cm4gcm93c1swXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93cztcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpO1xuICB9XG4gIF90b1NRTCgpIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuZGlhbGVjdC5idWlsZFJlbGF0aW9uYWxRdWVyeSh7XG4gICAgICBmdWxsU2NoZW1hOiB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgdGFibGVOYW1lc01hcDogdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGFibGU6IHRoaXMudGFibGUsXG4gICAgICB0YWJsZUNvbmZpZzogdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHF1ZXJ5Q29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIHRhYmxlQWxpYXM6IHRoaXMudGFibGVDb25maWcudHNOYW1lXG4gICAgfSk7XG4gICAgY29uc3QgYnVpbHRRdWVyeSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHF1ZXJ5LnNxbCk7XG4gICAgcmV0dXJuIHsgcXVlcnksIGJ1aWx0UXVlcnkgfTtcbiAgfVxuICB0b1NRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdG9TUUwoKS5idWlsdFF1ZXJ5O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZXhlY3V0ZVJhdygpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSBcImZpcnN0XCIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKS5nZXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpLmFsbCgpO1xuICB9XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJhdygpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5IGV4dGVuZHMgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU3luY1JlbGF0aW9uYWxRdWVyeVwiO1xuICBzeW5jKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSYXcoKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUmVsYXRpb25hbFF1ZXJ5QnVpbGRlcixcbiAgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5LFxuICBTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnkuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmNsYXNzIFNRTGl0ZVJhdyBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKGV4ZWN1dGUsIGdldFNRTCwgYWN0aW9uLCBkaWFsZWN0LCBtYXBCYXRjaFJlc3VsdCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5leGVjdXRlID0gZXhlY3V0ZTtcbiAgICB0aGlzLmdldFNRTCA9IGdldFNRTDtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMubWFwQmF0Y2hSZXN1bHQgPSBtYXBCYXRjaFJlc3VsdDtcbiAgICB0aGlzLmNvbmZpZyA9IHsgYWN0aW9uIH07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlUmF3XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICBnZXRRdWVyeSgpIHtcbiAgICByZXR1cm4geyAuLi50aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKSwgbWV0aG9kOiB0aGlzLmNvbmZpZy5hY3Rpb24gfTtcbiAgfVxuICBtYXBSZXN1bHQocmVzdWx0LCBpc0Zyb21CYXRjaCkge1xuICAgIHJldHVybiBpc0Zyb21CYXRjaCA/IHRoaXMubWFwQmF0Y2hSZXN1bHQocmVzdWx0KSA6IHJlc3VsdDtcbiAgfVxuICBfcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGlzUmVzcG9uc2VJbkFycmF5TW9kZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZVJhd1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJhdy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIgfSBmcm9tIFwiLi4vc2VsZWN0aW9uLXByb3h5LmpzXCI7XG5pbXBvcnQgeyBzcWwgfSBmcm9tIFwiLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHtcbiAgUXVlcnlCdWlsZGVyLFxuICBTUUxpdGVEZWxldGVCYXNlLFxuICBTUUxpdGVJbnNlcnRCdWlsZGVyLFxuICBTUUxpdGVTZWxlY3RCdWlsZGVyLFxuICBTUUxpdGVVcGRhdGVCdWlsZGVyXG59IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXJzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBXaXRoU3VicXVlcnkgfSBmcm9tIFwiLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvdW50QnVpbGRlciB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXJzL2NvdW50LmpzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbmFsUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlcnMvcXVlcnkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVJhdyB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXJzL3Jhdy5qc1wiO1xuY2xhc3MgQmFzZVNRTGl0ZURhdGFiYXNlIHtcbiAgY29uc3RydWN0b3IocmVzdWx0S2luZCwgZGlhbGVjdCwgc2Vzc2lvbiwgc2NoZW1hKSB7XG4gICAgdGhpcy5yZXN1bHRLaW5kID0gcmVzdWx0S2luZDtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5fID0gc2NoZW1hID8ge1xuICAgICAgc2NoZW1hOiBzY2hlbWEuc2NoZW1hLFxuICAgICAgZnVsbFNjaGVtYTogc2NoZW1hLmZ1bGxTY2hlbWEsXG4gICAgICB0YWJsZU5hbWVzTWFwOiBzY2hlbWEudGFibGVOYW1lc01hcFxuICAgIH0gOiB7XG4gICAgICBzY2hlbWE6IHZvaWQgMCxcbiAgICAgIGZ1bGxTY2hlbWE6IHt9LFxuICAgICAgdGFibGVOYW1lc01hcDoge31cbiAgICB9O1xuICAgIHRoaXMucXVlcnkgPSB7fTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcnk7XG4gICAgaWYgKHRoaXMuXy5zY2hlbWEpIHtcbiAgICAgIGZvciAoY29uc3QgW3RhYmxlTmFtZSwgY29sdW1uc10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fLnNjaGVtYSkpIHtcbiAgICAgICAgcXVlcnlbdGFibGVOYW1lXSA9IG5ldyBSZWxhdGlvbmFsUXVlcnlCdWlsZGVyKFxuICAgICAgICAgIHJlc3VsdEtpbmQsXG4gICAgICAgICAgc2NoZW1hLmZ1bGxTY2hlbWEsXG4gICAgICAgICAgdGhpcy5fLnNjaGVtYSxcbiAgICAgICAgICB0aGlzLl8udGFibGVOYW1lc01hcCxcbiAgICAgICAgICBzY2hlbWEuZnVsbFNjaGVtYVt0YWJsZU5hbWVdLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgZGlhbGVjdCxcbiAgICAgICAgICBzZXNzaW9uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuJGNhY2hlID0geyBpbnZhbGlkYXRlOiBhc3luYyAoX3BhcmFtcykgPT4ge1xuICAgIH0gfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJCYXNlU1FMaXRlRGF0YWJhc2VcIjtcbiAgcXVlcnk7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc3VicXVlcnkgdGhhdCBkZWZpbmVzIGEgdGVtcG9yYXJ5IG5hbWVkIHJlc3VsdCBzZXQgYXMgYSBDVEUuXG4gICAqXG4gICAqIEl0IGlzIHVzZWZ1bCBmb3IgYnJlYWtpbmcgZG93biBjb21wbGV4IHF1ZXJpZXMgaW50byBzaW1wbGVyIHBhcnRzIGFuZCBmb3IgcmV1c2luZyB0aGUgcmVzdWx0IHNldCBpbiBzdWJzZXF1ZW50IHBhcnRzIG9mIHRoZSBxdWVyeS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3Qjd2l0aC1jbGF1c2V9XG4gICAqXG4gICAqIEBwYXJhbSBhbGlhcyBUaGUgYWxpYXMgZm9yIHRoZSBzdWJxdWVyeS5cbiAgICpcbiAgICogRmFpbHVyZSB0byBwcm92aWRlIGFuIGFsaWFzIHdpbGwgcmVzdWx0IGluIGEgRHJpenpsZVR5cGVFcnJvciwgcHJldmVudGluZyB0aGUgc3VicXVlcnkgZnJvbSBiZWluZyByZWZlcmVuY2VkIGluIG90aGVyIHF1ZXJpZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIENyZWF0ZSBhIHN1YnF1ZXJ5IHdpdGggYWxpYXMgJ3NxJyBhbmQgdXNlIGl0IGluIHRoZSBzZWxlY3QgcXVlcnlcbiAgICogY29uc3Qgc3EgPSBkYi4kd2l0aCgnc3EnKS5hcyhkYi5zZWxlY3QoKS5mcm9tKHVzZXJzKS53aGVyZShlcSh1c2Vycy5pZCwgNDIpKSk7XG4gICAqXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLndpdGgoc3EpLnNlbGVjdCgpLmZyb20oc3EpO1xuICAgKiBgYGBcbiAgICpcbiAgICogVG8gc2VsZWN0IGFyYml0cmFyeSBTUUwgdmFsdWVzIGFzIGZpZWxkcyBpbiBhIENURSBhbmQgcmVmZXJlbmNlIHRoZW0gaW4gb3RoZXIgQ1RFcyBvciBpbiB0aGUgbWFpbiBxdWVyeSwgeW91IG5lZWQgdG8gYWRkIGFsaWFzZXMgdG8gdGhlbTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFuIGFyYml0cmFyeSBTUUwgdmFsdWUgYXMgYSBmaWVsZCBpbiBhIENURSBhbmQgcmVmZXJlbmNlIGl0IGluIHRoZSBtYWluIHF1ZXJ5XG4gICAqIGNvbnN0IHNxID0gZGIuJHdpdGgoJ3NxJykuYXMoZGIuc2VsZWN0KHtcbiAgICogICBuYW1lOiBzcWw8c3RyaW5nPmB1cHBlcigke3VzZXJzLm5hbWV9KWAuYXMoJ25hbWUnKSxcbiAgICogfSlcbiAgICogLmZyb20odXNlcnMpKTtcbiAgICpcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIud2l0aChzcSkuc2VsZWN0KHsgbmFtZTogc3EubmFtZSB9KS5mcm9tKHNxKTtcbiAgICogYGBgXG4gICAqL1xuICAkd2l0aCA9IChhbGlhcywgc2VsZWN0aW9uKSA9PiB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgYXMgPSAocWIpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcWIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBxYiA9IHFiKG5ldyBRdWVyeUJ1aWxkZXIoc2VsZi5kaWFsZWN0KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgICBuZXcgV2l0aFN1YnF1ZXJ5KFxuICAgICAgICAgIHFiLmdldFNRTCgpLFxuICAgICAgICAgIHNlbGVjdGlvbiA/PyAoXCJnZXRTZWxlY3RlZEZpZWxkc1wiIGluIHFiID8gcWIuZ2V0U2VsZWN0ZWRGaWVsZHMoKSA/PyB7fSA6IHt9KSxcbiAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICksXG4gICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBhbGlhcywgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcImVycm9yXCIgfSlcbiAgICAgICk7XG4gICAgfTtcbiAgICByZXR1cm4geyBhcyB9O1xuICB9O1xuICAkY291bnQoc291cmNlLCBmaWx0ZXJzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVDb3VudEJ1aWxkZXIoeyBzb3VyY2UsIGZpbHRlcnMsIHNlc3Npb246IHRoaXMuc2Vzc2lvbiB9KTtcbiAgfVxuICAvKipcbiAgICogSW5jb3Jwb3JhdGVzIGEgcHJldmlvdXNseSBkZWZpbmVkIENURSAodXNpbmcgYCR3aXRoYCkgaW50byB0aGUgbWFpbiBxdWVyeS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgYWxsb3dzIHRoZSBtYWluIHF1ZXJ5IHRvIHJlZmVyZW5jZSBhIHRlbXBvcmFyeSBuYW1lZCByZXN1bHQgc2V0LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCN3aXRoLWNsYXVzZX1cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJpZXMgVGhlIENURXMgdG8gaW5jb3Jwb3JhdGUgaW50byB0aGUgbWFpbiBxdWVyeS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRGVmaW5lIGEgc3VicXVlcnkgJ3NxJyBhcyBhIENURSB1c2luZyAkd2l0aFxuICAgKiBjb25zdCBzcSA9IGRiLiR3aXRoKCdzcScpLmFzKGRiLnNlbGVjdCgpLmZyb20odXNlcnMpLndoZXJlKGVxKHVzZXJzLmlkLCA0MikpKTtcbiAgICpcbiAgICogLy8gSW5jb3Jwb3JhdGUgdGhlIENURSAnc3EnIGludG8gdGhlIG1haW4gcXVlcnkgYW5kIHNlbGVjdCBmcm9tIGl0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLndpdGgoc3EpLnNlbGVjdCgpLmZyb20oc3EpO1xuICAgKiBgYGBcbiAgICovXG4gIHdpdGgoLi4ucXVlcmllcykge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGZ1bmN0aW9uIHNlbGVjdChmaWVsZHMpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgICAgc2Vzc2lvbjogc2VsZi5zZXNzaW9uLFxuICAgICAgICBkaWFsZWN0OiBzZWxmLmRpYWxlY3QsXG4gICAgICAgIHdpdGhMaXN0OiBxdWVyaWVzXG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2VsZWN0RGlzdGluY3QoZmllbGRzKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICAgIHNlc3Npb246IHNlbGYuc2Vzc2lvbixcbiAgICAgICAgZGlhbGVjdDogc2VsZi5kaWFsZWN0LFxuICAgICAgICB3aXRoTGlzdDogcXVlcmllcyxcbiAgICAgICAgZGlzdGluY3Q6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGUodGFibGUpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlVXBkYXRlQnVpbGRlcih0YWJsZSwgc2VsZi5zZXNzaW9uLCBzZWxmLmRpYWxlY3QsIHF1ZXJpZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbnNlcnQoaW50bykge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVJbnNlcnRCdWlsZGVyKGludG8sIHNlbGYuc2Vzc2lvbiwgc2VsZi5kaWFsZWN0LCBxdWVyaWVzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVsZXRlXyhmcm9tKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZURlbGV0ZUJhc2UoZnJvbSwgc2VsZi5zZXNzaW9uLCBzZWxmLmRpYWxlY3QsIHF1ZXJpZXMpO1xuICAgIH1cbiAgICByZXR1cm4geyBzZWxlY3QsIHNlbGVjdERpc3RpbmN0LCB1cGRhdGUsIGluc2VydCwgZGVsZXRlOiBkZWxldGVfIH07XG4gIH1cbiAgc2VsZWN0KGZpZWxkcykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7IGZpZWxkczogZmllbGRzID8/IHZvaWQgMCwgc2Vzc2lvbjogdGhpcy5zZXNzaW9uLCBkaWFsZWN0OiB0aGlzLmRpYWxlY3QgfSk7XG4gIH1cbiAgc2VsZWN0RGlzdGluY3QoZmllbGRzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgIHNlc3Npb246IHRoaXMuc2Vzc2lvbixcbiAgICAgIGRpYWxlY3Q6IHRoaXMuZGlhbGVjdCxcbiAgICAgIGRpc3RpbmN0OiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gdXBkYXRlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGhvdXQgYC53aGVyZSgpYCBjbGF1c2Ugd2lsbCB1cGRhdGUgYWxsIHJvd3MgaW4gYSB0YWJsZS4gVGhlIGAud2hlcmUoKWAgY2xhdXNlIHNwZWNpZmllcyB3aGljaCByb3dzIHNob3VsZCBiZSB1cGRhdGVkLlxuICAgKlxuICAgKiBVc2UgYC5zZXQoKWAgbWV0aG9kIHRvIHNwZWNpZnkgd2hpY2ggdmFsdWVzIHRvIHVwZGF0ZS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy91cGRhdGV9XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdG8gdXBkYXRlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBVcGRhdGUgYWxsIHJvd3MgaW4gdGhlICdjYXJzJyB0YWJsZVxuICAgKiBhd2FpdCBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pO1xuICAgKlxuICAgKiAvLyBVcGRhdGUgcm93cyB3aXRoIGZpbHRlcnMgYW5kIGNvbmRpdGlvbnNcbiAgICogYXdhaXQgZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KS53aGVyZShlcShjYXJzLmJyYW5kLCAnQk1XJykpO1xuICAgKlxuICAgKiAvLyBVcGRhdGUgd2l0aCByZXR1cm5pbmcgY2xhdXNlXG4gICAqIGNvbnN0IHVwZGF0ZWRDYXI6IENhcltdID0gYXdhaXQgZGIudXBkYXRlKGNhcnMpXG4gICAqICAgLnNldCh7IGNvbG9yOiAncmVkJyB9KVxuICAgKiAgIC53aGVyZShlcShjYXJzLmlkLCAxKSlcbiAgICogICAucmV0dXJuaW5nKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgdXBkYXRlKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVVcGRhdGVCdWlsZGVyKHRhYmxlLCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCk7XG4gIH1cbiAgJGNhY2hlO1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnNlcnQgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgbmV3IHJvd3MgaW4gYSB0YWJsZS4gVXNlIGAudmFsdWVzKClgIG1ldGhvZCB0byBzcGVjaWZ5IHdoaWNoIHZhbHVlcyB0byBpbnNlcnQuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvaW5zZXJ0fVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHRvIGluc2VydCBpbnRvLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBJbnNlcnQgb25lIHJvd1xuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycykudmFsdWVzKHsgYnJhbmQ6ICdCTVcnIH0pO1xuICAgKlxuICAgKiAvLyBJbnNlcnQgbXVsdGlwbGUgcm93c1xuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycykudmFsdWVzKFt7IGJyYW5kOiAnQk1XJyB9LCB7IGJyYW5kOiAnUG9yc2NoZScgfV0pO1xuICAgKlxuICAgKiAvLyBJbnNlcnQgd2l0aCByZXR1cm5pbmcgY2xhdXNlXG4gICAqIGNvbnN0IGluc2VydGVkQ2FyOiBDYXJbXSA9IGF3YWl0IGRiLmluc2VydChjYXJzKVxuICAgKiAgIC52YWx1ZXMoeyBicmFuZDogJ0JNVycgfSlcbiAgICogICAucmV0dXJuaW5nKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgaW5zZXJ0KGludG8pIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUluc2VydEJ1aWxkZXIoaW50bywgdGhpcy5zZXNzaW9uLCB0aGlzLmRpYWxlY3QpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGVsZXRlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGhvdXQgYC53aGVyZSgpYCBjbGF1c2Ugd2lsbCBkZWxldGUgYWxsIHJvd3MgaW4gYSB0YWJsZS4gVGhlIGAud2hlcmUoKWAgY2xhdXNlIHNwZWNpZmllcyB3aGljaCByb3dzIHNob3VsZCBiZSBkZWxldGVkLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2RlbGV0ZX1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB0byBkZWxldGUgZnJvbS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRGVsZXRlIGFsbCByb3dzIGluIHRoZSAnY2FycycgdGFibGVcbiAgICogYXdhaXQgZGIuZGVsZXRlKGNhcnMpO1xuICAgKlxuICAgKiAvLyBEZWxldGUgcm93cyB3aXRoIGZpbHRlcnMgYW5kIGNvbmRpdGlvbnNcbiAgICogYXdhaXQgZGIuZGVsZXRlKGNhcnMpLndoZXJlKGVxKGNhcnMuY29sb3IsICdncmVlbicpKTtcbiAgICpcbiAgICogLy8gRGVsZXRlIHdpdGggcmV0dXJuaW5nIGNsYXVzZVxuICAgKiBjb25zdCBkZWxldGVkQ2FyOiBDYXJbXSA9IGF3YWl0IGRiLmRlbGV0ZShjYXJzKVxuICAgKiAgIC53aGVyZShlcShjYXJzLmlkLCAxKSlcbiAgICogICAucmV0dXJuaW5nKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZGVsZXRlKGZyb20pIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZURlbGV0ZUJhc2UoZnJvbSwgdGhpcy5zZXNzaW9uLCB0aGlzLmRpYWxlY3QpO1xuICB9XG4gIHJ1bihxdWVyeSkge1xuICAgIGNvbnN0IHNlcXVlbCA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IHNxbC5yYXcocXVlcnkpIDogcXVlcnkuZ2V0U1FMKCk7XG4gICAgaWYgKHRoaXMucmVzdWx0S2luZCA9PT0gXCJhc3luY1wiKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVJhdyhcbiAgICAgICAgYXN5bmMgKCkgPT4gdGhpcy5zZXNzaW9uLnJ1bihzZXF1ZWwpLFxuICAgICAgICAoKSA9PiBzZXF1ZWwsXG4gICAgICAgIFwicnVuXCIsXG4gICAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgICAgdGhpcy5zZXNzaW9uLmV4dHJhY3RSYXdSdW5WYWx1ZUZyb21CYXRjaFJlc3VsdC5iaW5kKHRoaXMuc2Vzc2lvbilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlc3Npb24ucnVuKHNlcXVlbCk7XG4gIH1cbiAgYWxsKHF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VxdWVsID0gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiID8gc3FsLnJhdyhxdWVyeSkgOiBxdWVyeS5nZXRTUUwoKTtcbiAgICBpZiAodGhpcy5yZXN1bHRLaW5kID09PSBcImFzeW5jXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlUmF3KFxuICAgICAgICBhc3luYyAoKSA9PiB0aGlzLnNlc3Npb24uYWxsKHNlcXVlbCksXG4gICAgICAgICgpID0+IHNlcXVlbCxcbiAgICAgICAgXCJhbGxcIixcbiAgICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgICB0aGlzLnNlc3Npb24uZXh0cmFjdFJhd0FsbFZhbHVlRnJvbUJhdGNoUmVzdWx0LmJpbmQodGhpcy5zZXNzaW9uKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5hbGwoc2VxdWVsKTtcbiAgfVxuICBnZXQocXVlcnkpIHtcbiAgICBjb25zdCBzZXF1ZWwgPSB0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgPyBzcWwucmF3KHF1ZXJ5KSA6IHF1ZXJ5LmdldFNRTCgpO1xuICAgIGlmICh0aGlzLnJlc3VsdEtpbmQgPT09IFwiYXN5bmNcIikge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVSYXcoXG4gICAgICAgIGFzeW5jICgpID0+IHRoaXMuc2Vzc2lvbi5nZXQoc2VxdWVsKSxcbiAgICAgICAgKCkgPT4gc2VxdWVsLFxuICAgICAgICBcImdldFwiLFxuICAgICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICAgIHRoaXMuc2Vzc2lvbi5leHRyYWN0UmF3R2V0VmFsdWVGcm9tQmF0Y2hSZXN1bHQuYmluZCh0aGlzLnNlc3Npb24pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmdldChzZXF1ZWwpO1xuICB9XG4gIHZhbHVlcyhxdWVyeSkge1xuICAgIGNvbnN0IHNlcXVlbCA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IHNxbC5yYXcocXVlcnkpIDogcXVlcnkuZ2V0U1FMKCk7XG4gICAgaWYgKHRoaXMucmVzdWx0S2luZCA9PT0gXCJhc3luY1wiKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVJhdyhcbiAgICAgICAgYXN5bmMgKCkgPT4gdGhpcy5zZXNzaW9uLnZhbHVlcyhzZXF1ZWwpLFxuICAgICAgICAoKSA9PiBzZXF1ZWwsXG4gICAgICAgIFwidmFsdWVzXCIsXG4gICAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgICAgdGhpcy5zZXNzaW9uLmV4dHJhY3RSYXdWYWx1ZXNWYWx1ZUZyb21CYXRjaFJlc3VsdC5iaW5kKHRoaXMuc2Vzc2lvbilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlc3Npb24udmFsdWVzKHNlcXVlbCk7XG4gIH1cbiAgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb24sIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb24udHJhbnNhY3Rpb24odHJhbnNhY3Rpb24sIGNvbmZpZyk7XG4gIH1cbn1cbmNvbnN0IHdpdGhSZXBsaWNhcyA9IChwcmltYXJ5LCByZXBsaWNhcywgZ2V0UmVwbGljYSA9ICgpID0+IHJlcGxpY2FzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHJlcGxpY2FzLmxlbmd0aCldKSA9PiB7XG4gIGNvbnN0IHNlbGVjdCA9ICguLi5hcmdzKSA9PiBnZXRSZXBsaWNhKHJlcGxpY2FzKS5zZWxlY3QoLi4uYXJncyk7XG4gIGNvbnN0IHNlbGVjdERpc3RpbmN0ID0gKC4uLmFyZ3MpID0+IGdldFJlcGxpY2EocmVwbGljYXMpLnNlbGVjdERpc3RpbmN0KC4uLmFyZ3MpO1xuICBjb25zdCAkY291bnQgPSAoLi4uYXJncykgPT4gZ2V0UmVwbGljYShyZXBsaWNhcykuJGNvdW50KC4uLmFyZ3MpO1xuICBjb25zdCAkd2l0aCA9ICguLi5hcmdzKSA9PiBnZXRSZXBsaWNhKHJlcGxpY2FzKS53aXRoKC4uLmFyZ3MpO1xuICBjb25zdCB1cGRhdGUgPSAoLi4uYXJncykgPT4gcHJpbWFyeS51cGRhdGUoLi4uYXJncyk7XG4gIGNvbnN0IGluc2VydCA9ICguLi5hcmdzKSA9PiBwcmltYXJ5Lmluc2VydCguLi5hcmdzKTtcbiAgY29uc3QgJGRlbGV0ZSA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LmRlbGV0ZSguLi5hcmdzKTtcbiAgY29uc3QgcnVuID0gKC4uLmFyZ3MpID0+IHByaW1hcnkucnVuKC4uLmFyZ3MpO1xuICBjb25zdCBhbGwgPSAoLi4uYXJncykgPT4gcHJpbWFyeS5hbGwoLi4uYXJncyk7XG4gIGNvbnN0IGdldCA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LmdldCguLi5hcmdzKTtcbiAgY29uc3QgdmFsdWVzID0gKC4uLmFyZ3MpID0+IHByaW1hcnkudmFsdWVzKC4uLmFyZ3MpO1xuICBjb25zdCB0cmFuc2FjdGlvbiA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LnRyYW5zYWN0aW9uKC4uLmFyZ3MpO1xuICByZXR1cm4ge1xuICAgIC4uLnByaW1hcnksXG4gICAgdXBkYXRlLFxuICAgIGluc2VydCxcbiAgICBkZWxldGU6ICRkZWxldGUsXG4gICAgcnVuLFxuICAgIGFsbCxcbiAgICBnZXQsXG4gICAgdmFsdWVzLFxuICAgIHRyYW5zYWN0aW9uLFxuICAgICRwcmltYXJ5OiBwcmltYXJ5LFxuICAgIHNlbGVjdCxcbiAgICBzZWxlY3REaXN0aW5jdCxcbiAgICAkY291bnQsXG4gICAgd2l0aDogJHdpdGgsXG4gICAgZ2V0IHF1ZXJ5KCkge1xuICAgICAgcmV0dXJuIGdldFJlcGxpY2EocmVwbGljYXMpLnF1ZXJ5O1xuICAgIH1cbiAgfTtcbn07XG5leHBvcnQge1xuICBCYXNlU1FMaXRlRGF0YWJhc2UsXG4gIHdpdGhSZXBsaWNhc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRiLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmNsYXNzIENhY2hlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ2FjaGVcIjtcbn1cbmNsYXNzIE5vb3BDYWNoZSBleHRlbmRzIENhY2hlIHtcbiAgc3RyYXRlZ3koKSB7XG4gICAgcmV0dXJuIFwiYWxsXCI7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiTm9vcENhY2hlXCI7XG4gIGFzeW5jIGdldChfa2V5KSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBhc3luYyBwdXQoX2hhc2hlZFF1ZXJ5LCBfcmVzcG9uc2UsIF90YWJsZXMsIF9jb25maWcpIHtcbiAgfVxuICBhc3luYyBvbk11dGF0ZShfcGFyYW1zKSB7XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGhhc2hRdWVyeShzcWwsIHBhcmFtcykge1xuICBjb25zdCBkYXRhVG9IYXNoID0gYCR7c3FsfS0ke0pTT04uc3RyaW5naWZ5KHBhcmFtcyl9YDtcbiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICBjb25zdCBkYXRhID0gZW5jb2Rlci5lbmNvZGUoZGF0YVRvSGFzaCk7XG4gIGNvbnN0IGhhc2hCdWZmZXIgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdChcIlNIQS0yNTZcIiwgZGF0YSk7XG4gIGNvbnN0IGhhc2hBcnJheSA9IFsuLi5uZXcgVWludDhBcnJheShoYXNoQnVmZmVyKV07XG4gIGNvbnN0IGhhc2hIZXggPSBoYXNoQXJyYXkubWFwKChiKSA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpLmpvaW4oXCJcIik7XG4gIHJldHVybiBoYXNoSGV4O1xufVxuZXhwb3J0IHtcbiAgQ2FjaGUsXG4gIE5vb3BDYWNoZSxcbiAgaGFzaFF1ZXJ5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2FjaGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBoYXNoUXVlcnksIE5vb3BDYWNoZSB9IGZyb20gXCIuLi9jYWNoZS9jb3JlL2NhY2hlLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IERyaXp6bGVFcnJvciwgRHJpenpsZVF1ZXJ5RXJyb3IsIFRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQgeyBCYXNlU1FMaXRlRGF0YWJhc2UgfSBmcm9tIFwiLi9kYi5qc1wiO1xuY2xhc3MgRXhlY3V0ZVJlc3VsdFN5bmMgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3RvcihyZXN1bHRDYikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZXN1bHRDYiA9IHJlc3VsdENiO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkV4ZWN1dGVSZXN1bHRTeW5jXCI7XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0Q2IoKTtcbiAgfVxuICBzeW5jKCkge1xuICAgIHJldHVybiB0aGlzLnJlc3VsdENiKCk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVByZXBhcmVkUXVlcnkge1xuICBjb25zdHJ1Y3Rvcihtb2RlLCBleGVjdXRlTWV0aG9kLCBxdWVyeSwgY2FjaGUsIHF1ZXJ5TWV0YWRhdGEsIGNhY2hlQ29uZmlnKSB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLmV4ZWN1dGVNZXRob2QgPSBleGVjdXRlTWV0aG9kO1xuICAgIHRoaXMucXVlcnkgPSBxdWVyeTtcbiAgICB0aGlzLmNhY2hlID0gY2FjaGU7XG4gICAgdGhpcy5xdWVyeU1ldGFkYXRhID0gcXVlcnlNZXRhZGF0YTtcbiAgICB0aGlzLmNhY2hlQ29uZmlnID0gY2FjaGVDb25maWc7XG4gICAgaWYgKGNhY2hlICYmIGNhY2hlLnN0cmF0ZWd5KCkgPT09IFwiYWxsXCIgJiYgY2FjaGVDb25maWcgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5jYWNoZUNvbmZpZyA9IHsgZW5hYmxlOiB0cnVlLCBhdXRvSW52YWxpZGF0ZTogdHJ1ZSB9O1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2FjaGVDb25maWc/LmVuYWJsZSkge1xuICAgICAgdGhpcy5jYWNoZUNvbmZpZyA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUHJlcGFyZWRRdWVyeVwiO1xuICAvKiogQGludGVybmFsICovXG4gIGpvaW5zTm90TnVsbGFibGVNYXA7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYXN5bmMgcXVlcnlXaXRoQ2FjaGUocXVlcnlTdHJpbmcsIHBhcmFtcywgcXVlcnkpIHtcbiAgICBpZiAodGhpcy5jYWNoZSA9PT0gdm9pZCAwIHx8IGlzKHRoaXMuY2FjaGUsIE5vb3BDYWNoZSkgfHwgdGhpcy5xdWVyeU1ldGFkYXRhID09PSB2b2lkIDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmNhY2hlQ29uZmlnICYmICF0aGlzLmNhY2hlQ29uZmlnLmVuYWJsZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCh0aGlzLnF1ZXJ5TWV0YWRhdGEudHlwZSA9PT0gXCJpbnNlcnRcIiB8fCB0aGlzLnF1ZXJ5TWV0YWRhdGEudHlwZSA9PT0gXCJ1cGRhdGVcIiB8fCB0aGlzLnF1ZXJ5TWV0YWRhdGEudHlwZSA9PT0gXCJkZWxldGVcIikgJiYgdGhpcy5xdWVyeU1ldGFkYXRhLnRhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBbcmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBxdWVyeSgpLFxuICAgICAgICAgIHRoaXMuY2FjaGUub25NdXRhdGUoeyB0YWJsZXM6IHRoaXMucXVlcnlNZXRhZGF0YS50YWJsZXMgfSlcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0aGlzLmNhY2hlQ29uZmlnKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcXVlcnkoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5xdWVyeU1ldGFkYXRhLnR5cGUgPT09IFwic2VsZWN0XCIpIHtcbiAgICAgIGNvbnN0IGZyb21DYWNoZSA9IGF3YWl0IHRoaXMuY2FjaGUuZ2V0KFxuICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLnRhZyA/PyAoYXdhaXQgaGFzaFF1ZXJ5KHF1ZXJ5U3RyaW5nLCBwYXJhbXMpKSxcbiAgICAgICAgdGhpcy5xdWVyeU1ldGFkYXRhLnRhYmxlcyxcbiAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy50YWcgIT09IHZvaWQgMCxcbiAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy5hdXRvSW52YWxpZGF0ZVxuICAgICAgKTtcbiAgICAgIGlmIChmcm9tQ2FjaGUgPT09IHZvaWQgMCkge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHF1ZXJ5KCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5jYWNoZS5wdXQoXG4gICAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy50YWcgPz8gKGF3YWl0IGhhc2hRdWVyeShxdWVyeVN0cmluZywgcGFyYW1zKSksXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBzZW5kIHRhYmxlcyB0aGF0IHdlcmUgdXNlZCBpbiBhIHF1ZXJ5IG9ubHkgaWYgdXNlciB3YW50cyB0byBpbnZhbGlkYXRlIGl0IG9uIGVhY2ggd3JpdGVcbiAgICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLmF1dG9JbnZhbGlkYXRlID8gdGhpcy5xdWVyeU1ldGFkYXRhLnRhYmxlcyA6IFtdLFxuICAgICAgICAgIHRoaXMuY2FjaGVDb25maWcudGFnICE9PSB2b2lkIDAsXG4gICAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy5jb25maWdcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQ2FjaGU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcXVlcnkoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgfVxuICB9XG4gIGdldFF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5O1xuICB9XG4gIG1hcFJ1blJlc3VsdChyZXN1bHQsIF9pc0Zyb21CYXRjaCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgbWFwQWxsUmVzdWx0KF9yZXN1bHQsIF9pc0Zyb21CYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICBtYXBHZXRSZXN1bHQoX3Jlc3VsdCwgX2lzRnJvbUJhdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIGV4ZWN1dGUocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSBcImFzeW5jXCIpIHtcbiAgICAgIHJldHVybiB0aGlzW3RoaXMuZXhlY3V0ZU1ldGhvZF0ocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEV4ZWN1dGVSZXN1bHRTeW5jKCgpID0+IHRoaXNbdGhpcy5leGVjdXRlTWV0aG9kXShwbGFjZWhvbGRlclZhbHVlcykpO1xuICB9XG4gIG1hcFJlc3VsdChyZXNwb25zZSwgaXNGcm9tQmF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRoaXMuZXhlY3V0ZU1ldGhvZCkge1xuICAgICAgY2FzZSBcInJ1blwiOiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcFJ1blJlc3VsdChyZXNwb25zZSwgaXNGcm9tQmF0Y2gpO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFsbFwiOiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcEFsbFJlc3VsdChyZXNwb25zZSwgaXNGcm9tQmF0Y2gpO1xuICAgICAgfVxuICAgICAgY2FzZSBcImdldFwiOiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcEdldFJlc3VsdChyZXNwb25zZSwgaXNGcm9tQmF0Y2gpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuY2xhc3MgU1FMaXRlU2Vzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGRpYWxlY3QpIHtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVNlc3Npb25cIjtcbiAgcHJlcGFyZU9uZVRpbWVRdWVyeShxdWVyeSwgZmllbGRzLCBleGVjdXRlTWV0aG9kLCBpc1Jlc3BvbnNlSW5BcnJheU1vZGUsIGN1c3RvbVJlc3VsdE1hcHBlciwgcXVlcnlNZXRhZGF0YSwgY2FjaGVDb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlUXVlcnkoXG4gICAgICBxdWVyeSxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGV4ZWN1dGVNZXRob2QsXG4gICAgICBpc1Jlc3BvbnNlSW5BcnJheU1vZGUsXG4gICAgICBjdXN0b21SZXN1bHRNYXBwZXIsXG4gICAgICBxdWVyeU1ldGFkYXRhLFxuICAgICAgY2FjaGVDb25maWdcbiAgICApO1xuICB9XG4gIHJ1bihxdWVyeSkge1xuICAgIGNvbnN0IHN0YXRpY1F1ZXJ5ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmVwYXJlT25lVGltZVF1ZXJ5KHN0YXRpY1F1ZXJ5LCB2b2lkIDAsIFwicnVuXCIsIGZhbHNlKS5ydW4oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBEcml6emxlRXJyb3IoeyBjYXVzZTogZXJyLCBtZXNzYWdlOiBgRmFpbGVkIHRvIHJ1biB0aGUgcXVlcnkgJyR7c3RhdGljUXVlcnkuc3FsfSdgIH0pO1xuICAgIH1cbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGV4dHJhY3RSYXdSdW5WYWx1ZUZyb21CYXRjaFJlc3VsdChyZXN1bHQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGFsbChxdWVyeSkge1xuICAgIHJldHVybiB0aGlzLnByZXBhcmVPbmVUaW1lUXVlcnkodGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkpLCB2b2lkIDAsIFwicnVuXCIsIGZhbHNlKS5hbGwoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGV4dHJhY3RSYXdBbGxWYWx1ZUZyb21CYXRjaFJlc3VsdChfcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIGdldChxdWVyeSkge1xuICAgIHJldHVybiB0aGlzLnByZXBhcmVPbmVUaW1lUXVlcnkodGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkpLCB2b2lkIDAsIFwicnVuXCIsIGZhbHNlKS5nZXQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGV4dHJhY3RSYXdHZXRWYWx1ZUZyb21CYXRjaFJlc3VsdChfcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHZhbHVlcyhxdWVyeSkge1xuICAgIHJldHVybiB0aGlzLnByZXBhcmVPbmVUaW1lUXVlcnkodGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkpLCB2b2lkIDAsIFwicnVuXCIsIGZhbHNlKS52YWx1ZXMoKTtcbiAgfVxuICBhc3luYyBjb3VudChzcWwpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnZhbHVlcyhzcWwpO1xuICAgIHJldHVybiByZXN1bHRbMF1bMF07XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBleHRyYWN0UmF3VmFsdWVzVmFsdWVGcm9tQmF0Y2hSZXN1bHQoX3Jlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlU1FMaXRlRGF0YWJhc2Uge1xuICBjb25zdHJ1Y3RvcihyZXN1bHRUeXBlLCBkaWFsZWN0LCBzZXNzaW9uLCBzY2hlbWEsIG5lc3RlZEluZGV4ID0gMCkge1xuICAgIHN1cGVyKHJlc3VsdFR5cGUsIGRpYWxlY3QsIHNlc3Npb24sIHNjaGVtYSk7XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5uZXN0ZWRJbmRleCA9IG5lc3RlZEluZGV4O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRyYW5zYWN0aW9uXCI7XG4gIHJvbGxiYWNrKCkge1xuICAgIHRocm93IG5ldyBUcmFuc2FjdGlvblJvbGxiYWNrRXJyb3IoKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgRXhlY3V0ZVJlc3VsdFN5bmMsXG4gIFNRTGl0ZVByZXBhcmVkUXVlcnksXG4gIFNRTGl0ZVNlc3Npb24sXG4gIFNRTGl0ZVRyYW5zYWN0aW9uXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2Vzc2lvbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIENvbnNvbGVMb2dXcml0ZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDb25zb2xlTG9nV3JpdGVyXCI7XG4gIHdyaXRlKG1lc3NhZ2UpIHtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgfVxufVxuY2xhc3MgRGVmYXVsdExvZ2dlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkRlZmF1bHRMb2dnZXJcIjtcbiAgd3JpdGVyO1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLndyaXRlciA9IGNvbmZpZz8ud3JpdGVyID8/IG5ldyBDb25zb2xlTG9nV3JpdGVyKCk7XG4gIH1cbiAgbG9nUXVlcnkocXVlcnksIHBhcmFtcykge1xuICAgIGNvbnN0IHN0cmluZ2lmaWVkUGFyYW1zID0gcGFyYW1zLm1hcCgocCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBTdHJpbmcocCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcGFyYW1zU3RyID0gc3RyaW5naWZpZWRQYXJhbXMubGVuZ3RoID8gYCAtLSBwYXJhbXM6IFske3N0cmluZ2lmaWVkUGFyYW1zLmpvaW4oXCIsIFwiKX1dYCA6IFwiXCI7XG4gICAgdGhpcy53cml0ZXIud3JpdGUoYFF1ZXJ5OiAke3F1ZXJ5fSR7cGFyYW1zU3RyfWApO1xuICB9XG59XG5jbGFzcyBOb29wTG9nZ2VyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiTm9vcExvZ2dlclwiO1xuICBsb2dRdWVyeSgpIHtcbiAgfVxufVxuZXhwb3J0IHtcbiAgQ29uc29sZUxvZ1dyaXRlcixcbiAgRGVmYXVsdExvZ2dlcixcbiAgTm9vcExvZ2dlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2dlci5qcy5tYXAiLAogICAgImltcG9ydCB7IF9fZXhwb3J0IH0gZnJvbSBcIi4uL192aXJ0dWFsL3JvbGxkb3duX3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IGluZGV4LCBpbnRlZ2VyLCByZWFsLCBzcWxpdGVUYWJsZSwgdGV4dCB9IGZyb20gXCJkcml6emxlLW9ybS9zcWxpdGUtY29yZVwiO1xuaW1wb3J0IHsgcmVsYXRpb25zIH0gZnJvbSBcImRyaXp6bGUtb3JtXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvc2NoZW1hLnRzXG52YXIgc2NoZW1hX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KHNjaGVtYV9leHBvcnRzLCB7XG5cdGNoYXJhY3RlcnM6ICgpID0+IGNoYXJhY3RlcnMsXG5cdGNoYXJhY3RlcnNSZWxhdGlvbnM6ICgpID0+IGNoYXJhY3RlcnNSZWxhdGlvbnMsXG5cdG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzOiAoKSA9PiBtaW5pbmdGbGVldFBhcnRpY2lwYW50cyxcblx0bWluaW5nRmxlZXRQYXJ0aWNpcGFudHNSZWxhdGlvbnM6ICgpID0+IG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzUmVsYXRpb25zLFxuXHRtaW5pbmdGbGVldHM6ICgpID0+IG1pbmluZ0ZsZWV0cyxcblx0bWluaW5nRmxlZXRzUmVsYXRpb25zOiAoKSA9PiBtaW5pbmdGbGVldHNSZWxhdGlvbnMsXG5cdHJlc3VtZUNvbW1hbmRzOiAoKSA9PiByZXN1bWVDb21tYW5kcyxcblx0c2hhcmVkOiAoKSA9PiBzaGFyZWQsXG5cdHVzZXJzOiAoKSA9PiB1c2Vycyxcblx0dXNlcnNSZWxhdGlvbnM6ICgpID0+IHVzZXJzUmVsYXRpb25zXG59KTtcbmNvbnN0IHNoYXJlZCA9IHtcblx0Y3JlYXRlZEF0OiBpbnRlZ2VyKFwiY3JlYXRlZF9hdFwiKS5ub3ROdWxsKCksXG5cdHVwZGF0ZWRBdDogaW50ZWdlcihcInVwZGF0ZWRfYXRcIilcbn07XG5jb25zdCB1c2VycyA9IHNxbGl0ZVRhYmxlKFwidXNlcnNcIiwge1xuXHRpZDogaW50ZWdlcigpLnByaW1hcnlLZXkoKS51bmlxdWUoKS5ub3ROdWxsKCksXG5cdGRpc2NvcmRJRDogdGV4dChcImRpc2NvcmRfaWRcIikudW5pcXVlKCkubm90TnVsbCgpLFxuXHRtYWluQ2hhcmFjdGVyOiBpbnRlZ2VyKFwibWFpbl9jaGFyYWN0ZXJcIiksXG5cdC4uLnNoYXJlZFxufSwgKHRhYmxlKSA9PiBbaW5kZXgoXCJpZHhfZGlzY29yZF9pZFwiKS5vbih0YWJsZS5kaXNjb3JkSUQpLCBpbmRleChcImlkeF9tYWluX2NoYXJhY3RlclwiKS5vbih0YWJsZS5tYWluQ2hhcmFjdGVyKV0pO1xuY29uc3QgdXNlcnNSZWxhdGlvbnMgPSByZWxhdGlvbnModXNlcnMsICh7IG9uZSwgbWFueSB9KSA9PiAoe1xuXHRjaGFyYWN0ZXJzOiBtYW55KGNoYXJhY3RlcnMpLFxuXHRtYWluOiBvbmUoY2hhcmFjdGVycywge1xuXHRcdGZpZWxkczogW3VzZXJzLm1haW5DaGFyYWN0ZXJdLFxuXHRcdHJlZmVyZW5jZXM6IFtjaGFyYWN0ZXJzLmlkXVxuXHR9KVxufSkpO1xuY29uc3QgY2hhcmFjdGVycyA9IHNxbGl0ZVRhYmxlKFwiY2hhcmFjdGVyc1wiLCB7XG5cdGlkOiBpbnRlZ2VyKFwiaWRcIikucHJpbWFyeUtleSh7IGF1dG9JbmNyZW1lbnQ6IHRydWUgfSksXG5cdGV2ZUlEOiBpbnRlZ2VyKFwiZXZlX2lkXCIpLm5vdE51bGwoKSxcblx0dXNlcklEOiBpbnRlZ2VyKFwidXNlcl9pZFwiKS5ub3ROdWxsKCksXG5cdG5hbWU6IHRleHQoKS5ub3ROdWxsKCksXG5cdGFjY2Vzc1Rva2VuOiB0ZXh0KFwiYWNjZXNzX3Rva2VuXCIpLm5vdE51bGwoKSxcblx0ZXhwaXJlc0F0OiBpbnRlZ2VyKFwiZXhwaXJlc19hdFwiKS5ub3ROdWxsKCksXG5cdHJlZnJlc2hUb2tlbjogdGV4dChcInJlZnJlc2hfdG9rZW5cIikubm90TnVsbCgpLFxuXHQuLi5zaGFyZWRcbn0sICh0YWJsZSkgPT4gW2luZGV4KFwiaWR4X3VzZXJfaWRcIikub24odGFibGUudXNlcklEKSwgaW5kZXgoXCJpZHhfZXZlX2lkXCIpLm9uKHRhYmxlLmV2ZUlEKV0pO1xuY29uc3QgY2hhcmFjdGVyc1JlbGF0aW9ucyA9IHJlbGF0aW9ucyhjaGFyYWN0ZXJzLCAoeyBvbmUgfSkgPT4gKHsgdXNlcjogb25lKHVzZXJzLCB7XG5cdGZpZWxkczogW2NoYXJhY3RlcnMudXNlcklEXSxcblx0cmVmZXJlbmNlczogW3VzZXJzLmlkXVxufSkgfSkpO1xuY29uc3QgcmVzdW1lQ29tbWFuZHMgPSBzcWxpdGVUYWJsZShcInJlc3VtZWNvbW1hbmRzXCIsIHtcblx0aWQ6IHRleHQoKS5wcmltYXJ5S2V5KCksXG5cdGNvbW1hbmQ6IHRleHQoKS5ub3ROdWxsKCksXG5cdHBhcmFtczogdGV4dCgpLm5vdE51bGwoKSxcblx0Y29udGV4dDogdGV4dCgpLm5vdE51bGwoKSxcblx0Li4uc2hhcmVkXG59KTtcbmNvbnN0IG1pbmluZ0ZsZWV0cyA9IHNxbGl0ZVRhYmxlKFwibWluaW5nX2ZsZWV0c1wiLCB7XG5cdGlkOiBpbnRlZ2VyKFwiaWRcIikucHJpbWFyeUtleSh7IGF1dG9JbmNyZW1lbnQ6IHRydWUgfSksXG5cdG5hbWU6IHRleHQoXCJuYW1lXCIpLm5vdE51bGwoKSxcblx0ZGVzY3JpcHRpb246IHRleHQoXCJkZXNjcmlwdGlvblwiKSxcblx0Y3JlYXRvckRpc2NvcmRJZDogdGV4dChcImNyZWF0b3JfZGlzY29yZF9pZFwiKS5ub3ROdWxsKCksXG5cdHN0YXJ0VGltZTogaW50ZWdlcihcInN0YXJ0X3RpbWVcIikubm90TnVsbCgpLFxuXHRlbmRUaW1lOiBpbnRlZ2VyKFwiZW5kX3RpbWVcIiksXG5cdHN0YXR1czogdGV4dChcInN0YXR1c1wiLCB7IGVudW06IFtcblx0XHRcImNvbmZpZ3VyaW5nXCIsXG5cdFx0XCJhY3RpdmVcIixcblx0XHRcImVuZGVkXCIsXG5cdFx0XCJnZW5lcmF0aW5nX3JlcG9ydFwiLFxuXHRcdFwiY29tcGxldGVkXCIsXG5cdFx0XCJmYWlsZWRcIlxuXHRdIH0pLm5vdE51bGwoKS5kZWZhdWx0KFwiY29uZmlndXJpbmdcIiksXG5cdHRheFJhdGU6IHJlYWwoXCJ0YXhfcmF0ZVwiKS5ub3ROdWxsKCkuZGVmYXVsdCgwKSxcblx0cHVibGljTWVzc2FnZUlkOiB0ZXh0KFwicHVibGljX21lc3NhZ2VfaWRcIikudW5pcXVlKCksXG5cdHB1YmxpY0NoYW5uZWxJZDogdGV4dChcInB1YmxpY19jaGFubmVsX2lkXCIpLFxuXHRyZXBvcnREYXRhOiB0ZXh0KFwicmVwb3J0X2RhdGFcIiksXG5cdGNyZWF0b3JFcGhlbWVyYWxNZXNzYWdlSWQ6IHRleHQoXCJjcmVhdG9yX2VwaGVtZXJhbF9tZXNzYWdlX2lkXCIpLFxuXHQuLi5zaGFyZWRcbn0sICh0YWJsZSkgPT4gW1xuXHRpbmRleChcImlkeF9mbGVldF9jcmVhdG9yX2Rpc2NvcmRfaWRcIikub24odGFibGUuY3JlYXRvckRpc2NvcmRJZCksXG5cdGluZGV4KFwiaWR4X2ZsZWV0X3N0YXR1c1wiKS5vbih0YWJsZS5zdGF0dXMpLFxuXHRpbmRleChcImlkeF9mbGVldF9wdWJsaWNfbWVzc2FnZV9pZFwiKS5vbih0YWJsZS5wdWJsaWNNZXNzYWdlSWQpXG5dKTtcbmNvbnN0IG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzID0gc3FsaXRlVGFibGUoXCJtaW5pbmdfZmxlZXRfcGFydGljaXBhbnRzXCIsIHtcblx0aWQ6IGludGVnZXIoXCJpZFwiKS5wcmltYXJ5S2V5KHsgYXV0b0luY3JlbWVudDogdHJ1ZSB9KSxcblx0ZmxlZXRJZDogaW50ZWdlcihcImZsZWV0X2lkXCIpLm5vdE51bGwoKS5yZWZlcmVuY2VzKCgpID0+IG1pbmluZ0ZsZWV0cy5pZCwgeyBvbkRlbGV0ZTogXCJjYXNjYWRlXCIgfSksXG5cdGNoYXJhY3RlcklkOiBpbnRlZ2VyKFwiY2hhcmFjdGVyX2lkXCIpLm5vdE51bGwoKS5yZWZlcmVuY2VzKCgpID0+IGNoYXJhY3RlcnMuaWQsIHsgb25EZWxldGU6IFwiY2FzY2FkZVwiIH0pLFxuXHRkaXNjb3JkSWQ6IHRleHQoXCJkaXNjb3JkX2lkXCIpLm5vdE51bGwoKSxcblx0cm9sZTogdGV4dChcInJvbGVcIiwgeyBlbnVtOiBbXG5cdFx0XCJtaW5lclwiLFxuXHRcdFwic2VjdXJpdHlcIixcblx0XHRcImhhdWxlclwiXG5cdF0gfSkubm90TnVsbCgpLFxuXHRqb2luVGltZTogaW50ZWdlcihcImpvaW5fdGltZVwiKS5ub3ROdWxsKCksXG5cdC4uLnNoYXJlZFxufSwgKHRhYmxlKSA9PiBbXG5cdGluZGV4KFwiaWR4X3BhcnRpY2lwYW50X2ZsZWV0X2lkXCIpLm9uKHRhYmxlLmZsZWV0SWQpLFxuXHRpbmRleChcImlkeF9wYXJ0aWNpcGFudF9jaGFyYWN0ZXJfaWRcIikub24odGFibGUuY2hhcmFjdGVySWQpLFxuXHRpbmRleChcImlkeF9wYXJ0aWNpcGFudF9kaXNjb3JkX2lkXCIpLm9uKHRhYmxlLmRpc2NvcmRJZClcbl0pO1xuY29uc3QgbWluaW5nRmxlZXRzUmVsYXRpb25zID0gcmVsYXRpb25zKG1pbmluZ0ZsZWV0cywgKHsgbWFueSB9KSA9PiAoeyBwYXJ0aWNpcGFudHM6IG1hbnkobWluaW5nRmxlZXRQYXJ0aWNpcGFudHMpIH0pKTtcbmNvbnN0IG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzUmVsYXRpb25zID0gcmVsYXRpb25zKG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzLCAoeyBvbmUgfSkgPT4gKHtcblx0ZmxlZXQ6IG9uZShtaW5pbmdGbGVldHMsIHtcblx0XHRmaWVsZHM6IFttaW5pbmdGbGVldFBhcnRpY2lwYW50cy5mbGVldElkXSxcblx0XHRyZWZlcmVuY2VzOiBbbWluaW5nRmxlZXRzLmlkXVxuXHR9KSxcblx0Y2hhcmFjdGVyOiBvbmUoY2hhcmFjdGVycywge1xuXHRcdGZpZWxkczogW21pbmluZ0ZsZWV0UGFydGljaXBhbnRzLmNoYXJhY3RlcklkXSxcblx0XHRyZWZlcmVuY2VzOiBbY2hhcmFjdGVycy5pZF1cblx0fSlcbn0pKTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBjaGFyYWN0ZXJzLCBtaW5pbmdGbGVldFBhcnRpY2lwYW50cywgbWluaW5nRmxlZXRzLCByZXN1bWVDb21tYW5kcywgc2NoZW1hX2V4cG9ydHMsIHVzZXJzIH07IiwKICAgICIvLyNyZWdpb24gc3JjL2VzaS9vcHRpb25zLnRzXG5jb25zdCBDTElFTlRfSUQgPSBwcm9jZXNzLmVudi5FVkVfQ0xJRU5UX0lEIHx8IFwiXCI7XG5jb25zdCBDTElFTlRfU0VDUkVUID0gcHJvY2Vzcy5lbnYuRVZFX0NMSUVOVF9TRUNSRVQgfHwgXCJcIjtcbmNvbnN0IENBTExCQUNLX1VSTCA9IHByb2Nlc3MuZW52LkVWRV9DQUxMQkFDS19VUkwgfHwgXCJcIjtcbmNvbnN0IFVTRVJfQUdFTlQgPSBwcm9jZXNzLmVudi5FU0lfVVNFUl9BR0VOVCB8fCBcIlwiO1xuY29uc3Qgb3B0aW9ucyA9IHtcblx0Y2xpZW50X2lkOiBDTElFTlRfSUQsXG5cdGNsaWVudF9zZWNyZXQ6IENMSUVOVF9TRUNSRVQsXG5cdGNhbGxiYWNrX3VybDogQ0FMTEJBQ0tfVVJMLFxuXHR1c2VyX2FnZW50OiBVU0VSX0FHRU5UXG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IG9wdGlvbnMgfTsiLAogICAgImV4cG9ydCBjbGFzcyBJbnZhbGlkVG9rZW5FcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbkludmFsaWRUb2tlbkVycm9yLnByb3RvdHlwZS5uYW1lID0gXCJJbnZhbGlkVG9rZW5FcnJvclwiO1xuZnVuY3Rpb24gYjY0RGVjb2RlVW5pY29kZShzdHIpIHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGF0b2Ioc3RyKS5yZXBsYWNlKC8oLikvZywgKG0sIHApID0+IHtcbiAgICAgICAgbGV0IGNvZGUgPSBwLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGlmIChjb2RlLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIGNvZGUgPSBcIjBcIiArIGNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiJVwiICsgY29kZTtcbiAgICB9KSk7XG59XG5mdW5jdGlvbiBiYXNlNjRVcmxEZWNvZGUoc3RyKSB7XG4gICAgbGV0IG91dHB1dCA9IHN0ci5yZXBsYWNlKC8tL2csIFwiK1wiKS5yZXBsYWNlKC9fL2csIFwiL1wiKTtcbiAgICBzd2l0Y2ggKG91dHB1dC5sZW5ndGggJSA0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBvdXRwdXQgKz0gXCI9PVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIG91dHB1dCArPSBcIj1cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFzZTY0IHN0cmluZyBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgbGVuZ3RoXCIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYjY0RGVjb2RlVW5pY29kZShvdXRwdXQpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBhdG9iKG91dHB1dCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGp3dERlY29kZSh0b2tlbiwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgdG9rZW4gIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkVycm9yKFwiSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IG11c3QgYmUgYSBzdHJpbmdcIik7XG4gICAgfVxuICAgIG9wdGlvbnMgfHwgKG9wdGlvbnMgPSB7fSk7XG4gICAgY29uc3QgcG9zID0gb3B0aW9ucy5oZWFkZXIgPT09IHRydWUgPyAwIDogMTtcbiAgICBjb25zdCBwYXJ0ID0gdG9rZW4uc3BsaXQoXCIuXCIpW3Bvc107XG4gICAgaWYgKHR5cGVvZiBwYXJ0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihgSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IG1pc3NpbmcgcGFydCAjJHtwb3MgKyAxfWApO1xuICAgIH1cbiAgICBsZXQgZGVjb2RlZDtcbiAgICB0cnkge1xuICAgICAgICBkZWNvZGVkID0gYmFzZTY0VXJsRGVjb2RlKHBhcnQpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBpbnZhbGlkIGJhc2U2NCBmb3IgcGFydCAjJHtwb3MgKyAxfSAoJHtlLm1lc3NhZ2V9KWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVkKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkVycm9yKGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogaW52YWxpZCBqc29uIGZvciBwYXJ0ICMke3BvcyArIDF9ICgke2UubWVzc2FnZX0pYCk7XG4gICAgfVxufVxuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTMyVXBwZXJDYXNlKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2UzMl9pbnRlcm5hbChieXRlcywgYmFzZTMyVXBwZXJDYXNlQWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5JbmNsdWRlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzJVcHBlckNhc2VOb1BhZGRpbmcoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyX2ludGVybmFsKGJ5dGVzLCBiYXNlMzJVcHBlckNhc2VBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLk5vbmUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMkxvd2VyQ2FzZShieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJfaW50ZXJuYWwoYnl0ZXMsIGJhc2UzMkxvd2VyQ2FzZUFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTMyTG93ZXJDYXNlTm9QYWRkaW5nKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2UzMl9pbnRlcm5hbChieXRlcywgYmFzZTMyTG93ZXJDYXNlQWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5Ob25lKTtcbn1cbi8qKiBSZXBsYWNlZDogVXNlIGVuY29kZUJhc2UzMlVwcGVyQ2FzZSgpIGluc3RlYWQuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTMyKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2UzMlVwcGVyQ2FzZShieXRlcyk7XG59XG4vKiogUmVwbGFjZWQ6IFVzZSBlbmNvZGVCYXNlMzJVcHBlckNhc2VOb1BhZGRpbmcoKSBpbnN0ZWFkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMk5vUGFkZGluZyhieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJVcHBlckNhc2VOb1BhZGRpbmcoYnl0ZXMpO1xufVxuZnVuY3Rpb24gZW5jb2RlQmFzZTMyX2ludGVybmFsKGJ5dGVzLCBhbHBoYWJldCwgcGFkZGluZykge1xuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaSArPSA1KSB7XG4gICAgICAgIGxldCBidWZmZXIgPSAwbjtcbiAgICAgICAgbGV0IGJ1ZmZlckJpdFNpemUgPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDUgJiYgaSArIGogPCBieXRlcy5ieXRlTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IChidWZmZXIgPDwgOG4pIHwgQmlnSW50KGJ5dGVzW2kgKyBqXSk7XG4gICAgICAgICAgICBidWZmZXJCaXRTaXplICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1ZmZlckJpdFNpemUgJSA1ICE9PSAwKSB7XG4gICAgICAgICAgICBidWZmZXIgPSBidWZmZXIgPDwgQmlnSW50KDUgLSAoYnVmZmVyQml0U2l6ZSAlIDUpKTtcbiAgICAgICAgICAgIGJ1ZmZlckJpdFNpemUgKz0gNSAtIChidWZmZXJCaXRTaXplICUgNSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA4OyBqKyspIHtcbiAgICAgICAgICAgIGlmIChidWZmZXJCaXRTaXplID49IDUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYWxwaGFiZXRbTnVtYmVyKChidWZmZXIgPj4gQmlnSW50KGJ1ZmZlckJpdFNpemUgLSA1KSkgJiAweDFmbildO1xuICAgICAgICAgICAgICAgIGJ1ZmZlckJpdFNpemUgLT0gNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJ1ZmZlckJpdFNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFscGhhYmV0W051bWJlcigoYnVmZmVyIDw8IEJpZ0ludCg2IC0gYnVmZmVyQml0U2l6ZSkpICYgMHgzZm4pXTtcbiAgICAgICAgICAgICAgICBidWZmZXJCaXRTaXplID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhZGRpbmcgPT09IEVuY29kaW5nUGFkZGluZy5JbmNsdWRlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiPVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTMyKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTMyX2ludGVybmFsKGVuY29kZWQsIGJhc2UzMkRlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlMzJJZ25vcmVQYWRkaW5nKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTMyX2ludGVybmFsKGVuY29kZWQsIGJhc2UzMkRlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLklnbm9yZSk7XG59XG5mdW5jdGlvbiBkZWNvZGVCYXNlMzJfaW50ZXJuYWwoZW5jb2RlZCwgZGVjb2RlTWFwLCBwYWRkaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGVuY29kZWQubGVuZ3RoIC8gOCkgKiA1KTtcbiAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbmNvZGVkLmxlbmd0aDsgaSArPSA4KSB7XG4gICAgICAgIGxldCBjaHVuayA9IDBuO1xuICAgICAgICBsZXQgYml0c1JlYWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDg7IGorKykge1xuICAgICAgICAgICAgaWYgKHBhZGRpbmcgPT09IERlY29kaW5nUGFkZGluZy5SZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgIGlmIChlbmNvZGVkW2kgKyBqXSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpICsgaiA+PSBlbmNvZGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhZGRpbmcgPT09IERlY29kaW5nUGFkZGluZy5JZ25vcmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSArIGogPj0gZW5jb2RlZC5sZW5ndGggfHwgZW5jb2RlZFtpICsgal0gPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqID4gMCAmJiBlbmNvZGVkW2kgKyBqIC0gMV0gPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoZW5jb2RlZFtpICsgal0gaW4gZGVjb2RlTWFwKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2hhcmFjdGVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2h1bmsgfD0gQmlnSW50KGRlY29kZU1hcFtlbmNvZGVkW2kgKyBqXV0pIDw8IEJpZ0ludCgoNyAtIGopICogNSk7XG4gICAgICAgICAgICBiaXRzUmVhZCArPSA1O1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaXRzUmVhZCA8IDQwKSB7XG4gICAgICAgICAgICBsZXQgdW51c2VkO1xuICAgICAgICAgICAgaWYgKGJpdHNSZWFkID09PSAxMCkge1xuICAgICAgICAgICAgICAgIHVudXNlZCA9IGNodW5rICYgMHhmZmZmZmZmZm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaXRzUmVhZCA9PT0gMjApIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZmZmZmbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJpdHNSZWFkID09PSAyNSkge1xuICAgICAgICAgICAgICAgIHVudXNlZCA9IGNodW5rICYgMHhmZmZmbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJpdHNSZWFkID09PSAzNSkge1xuICAgICAgICAgICAgICAgIHVudXNlZCA9IGNodW5rICYgMHhmZm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodW51c2VkICE9PSAwbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieXRlTGVuZ3RoID0gTWF0aC5mbG9vcihiaXRzUmVhZCAvIDgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0W3RvdGFsQnl0ZXNdID0gTnVtYmVyKChjaHVuayA+PiBCaWdJbnQoMzIgLSBpICogOCkpICYgMHhmZm4pO1xuICAgICAgICAgICAgdG90YWxCeXRlcysrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc2xpY2UoMCwgdG90YWxCeXRlcyk7XG59XG5jb25zdCBiYXNlMzJVcHBlckNhc2VBbHBoYWJldCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoyMzQ1NjdcIjtcbmNvbnN0IGJhc2UzMkxvd2VyQ2FzZUFscGhhYmV0ID0gXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejIzNDU2N1wiO1xuY29uc3QgYmFzZTMyRGVjb2RlTWFwID0ge1xuICAgIEE6IDAsXG4gICAgQjogMSxcbiAgICBDOiAyLFxuICAgIEQ6IDMsXG4gICAgRTogNCxcbiAgICBGOiA1LFxuICAgIEc6IDYsXG4gICAgSDogNyxcbiAgICBJOiA4LFxuICAgIEo6IDksXG4gICAgSzogMTAsXG4gICAgTDogMTEsXG4gICAgTTogMTIsXG4gICAgTjogMTMsXG4gICAgTzogMTQsXG4gICAgUDogMTUsXG4gICAgUTogMTYsXG4gICAgUjogMTcsXG4gICAgUzogMTgsXG4gICAgVDogMTksXG4gICAgVTogMjAsXG4gICAgVjogMjEsXG4gICAgVzogMjIsXG4gICAgWDogMjMsXG4gICAgWTogMjQsXG4gICAgWjogMjUsXG4gICAgYTogMCxcbiAgICBiOiAxLFxuICAgIGM6IDIsXG4gICAgZDogMyxcbiAgICBlOiA0LFxuICAgIGY6IDUsXG4gICAgZzogNixcbiAgICBoOiA3LFxuICAgIGk6IDgsXG4gICAgajogOSxcbiAgICBrOiAxMCxcbiAgICBsOiAxMSxcbiAgICBtOiAxMixcbiAgICBuOiAxMyxcbiAgICBvOiAxNCxcbiAgICBwOiAxNSxcbiAgICBxOiAxNixcbiAgICByOiAxNyxcbiAgICBzOiAxOCxcbiAgICB0OiAxOSxcbiAgICB1OiAyMCxcbiAgICB2OiAyMSxcbiAgICB3OiAyMixcbiAgICB4OiAyMyxcbiAgICB5OiAyNCxcbiAgICB6OiAyNSxcbiAgICBcIjJcIjogMjYsXG4gICAgXCIzXCI6IDI3LFxuICAgIFwiNFwiOiAyOCxcbiAgICBcIjVcIjogMjksXG4gICAgXCI2XCI6IDMwLFxuICAgIFwiN1wiOiAzMVxufTtcbnZhciBFbmNvZGluZ1BhZGRpbmc7XG4oZnVuY3Rpb24gKEVuY29kaW5nUGFkZGluZykge1xuICAgIEVuY29kaW5nUGFkZGluZ1tFbmNvZGluZ1BhZGRpbmdbXCJJbmNsdWRlXCJdID0gMF0gPSBcIkluY2x1ZGVcIjtcbiAgICBFbmNvZGluZ1BhZGRpbmdbRW5jb2RpbmdQYWRkaW5nW1wiTm9uZVwiXSA9IDFdID0gXCJOb25lXCI7XG59KShFbmNvZGluZ1BhZGRpbmcgfHwgKEVuY29kaW5nUGFkZGluZyA9IHt9KSk7XG52YXIgRGVjb2RpbmdQYWRkaW5nO1xuKGZ1bmN0aW9uIChEZWNvZGluZ1BhZGRpbmcpIHtcbiAgICBEZWNvZGluZ1BhZGRpbmdbRGVjb2RpbmdQYWRkaW5nW1wiUmVxdWlyZWRcIl0gPSAwXSA9IFwiUmVxdWlyZWRcIjtcbiAgICBEZWNvZGluZ1BhZGRpbmdbRGVjb2RpbmdQYWRkaW5nW1wiSWdub3JlXCJdID0gMV0gPSBcIklnbm9yZVwiO1xufSkoRGVjb2RpbmdQYWRkaW5nIHx8IChEZWNvZGluZ1BhZGRpbmcgPSB7fSkpO1xuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTY0KGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2U2NF9pbnRlcm5hbChieXRlcywgYmFzZTY0QWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5JbmNsdWRlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlNjROb1BhZGRpbmcoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTY0X2ludGVybmFsKGJ5dGVzLCBiYXNlNjRBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLk5vbmUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2U2NHVybChieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGJhc2U2NHVybEFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTY0dXJsTm9QYWRkaW5nKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2U2NF9pbnRlcm5hbChieXRlcywgYmFzZTY0dXJsQWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5Ob25lKTtcbn1cbmZ1bmN0aW9uIGVuY29kZUJhc2U2NF9pbnRlcm5hbChieXRlcywgYWxwaGFiZXQsIHBhZGRpbmcpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGkgKz0gMykge1xuICAgICAgICBsZXQgYnVmZmVyID0gMDtcbiAgICAgICAgbGV0IGJ1ZmZlckJpdFNpemUgPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDMgJiYgaSArIGogPCBieXRlcy5ieXRlTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IChidWZmZXIgPDwgOCkgfCBieXRlc1tpICsgal07XG4gICAgICAgICAgICBidWZmZXJCaXRTaXplICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICAgIGlmIChidWZmZXJCaXRTaXplID49IDYpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYWxwaGFiZXRbKGJ1ZmZlciA+PiAoYnVmZmVyQml0U2l6ZSAtIDYpKSAmIDB4M2ZdO1xuICAgICAgICAgICAgICAgIGJ1ZmZlckJpdFNpemUgLT0gNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJ1ZmZlckJpdFNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFscGhhYmV0WyhidWZmZXIgPDwgKDYgLSBidWZmZXJCaXRTaXplKSkgJiAweDNmXTtcbiAgICAgICAgICAgICAgICBidWZmZXJCaXRTaXplID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhZGRpbmcgPT09IEVuY29kaW5nUGFkZGluZy5JbmNsdWRlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiPVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBiYXNlNjRBbHBoYWJldCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiO1xuY29uc3QgYmFzZTY0dXJsQWxwaGFiZXQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV9cIjtcbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNjQoZW5jb2RlZCkge1xuICAgIHJldHVybiBkZWNvZGVCYXNlNjRfaW50ZXJuYWwoZW5jb2RlZCwgYmFzZTY0RGVjb2RlTWFwLCBEZWNvZGluZ1BhZGRpbmcuUmVxdWlyZWQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2U2NElnbm9yZVBhZGRpbmcoZW5jb2RlZCkge1xuICAgIHJldHVybiBkZWNvZGVCYXNlNjRfaW50ZXJuYWwoZW5jb2RlZCwgYmFzZTY0RGVjb2RlTWFwLCBEZWNvZGluZ1BhZGRpbmcuSWdub3JlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNjR1cmwoZW5jb2RlZCkge1xuICAgIHJldHVybiBkZWNvZGVCYXNlNjRfaW50ZXJuYWwoZW5jb2RlZCwgYmFzZTY0dXJsRGVjb2RlTWFwLCBEZWNvZGluZ1BhZGRpbmcuUmVxdWlyZWQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2U2NHVybElnbm9yZVBhZGRpbmcoZW5jb2RlZCkge1xuICAgIHJldHVybiBkZWNvZGVCYXNlNjRfaW50ZXJuYWwoZW5jb2RlZCwgYmFzZTY0dXJsRGVjb2RlTWFwLCBEZWNvZGluZ1BhZGRpbmcuSWdub3JlKTtcbn1cbmZ1bmN0aW9uIGRlY29kZUJhc2U2NF9pbnRlcm5hbChlbmNvZGVkLCBkZWNvZGVNYXAsIHBhZGRpbmcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShNYXRoLmNlaWwoZW5jb2RlZC5sZW5ndGggLyA0KSAqIDMpO1xuICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kZWQubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgbGV0IGNodW5rID0gMDtcbiAgICAgICAgbGV0IGJpdHNSZWFkID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYWRkaW5nID09PSBEZWNvZGluZ1BhZGRpbmcuUmVxdWlyZWQgJiYgZW5jb2RlZFtpICsgal0gPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFkZGluZyA9PT0gRGVjb2RpbmdQYWRkaW5nLklnbm9yZSAmJlxuICAgICAgICAgICAgICAgIChpICsgaiA+PSBlbmNvZGVkLmxlbmd0aCB8fCBlbmNvZGVkW2kgKyBqXSA9PT0gXCI9XCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaiA+IDAgJiYgZW5jb2RlZFtpICsgaiAtIDFdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKGVuY29kZWRbaSArIGpdIGluIGRlY29kZU1hcCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNoYXJhY3RlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNodW5rIHw9IGRlY29kZU1hcFtlbmNvZGVkW2kgKyBqXV0gPDwgKCgzIC0gaikgKiA2KTtcbiAgICAgICAgICAgIGJpdHNSZWFkICs9IDY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJpdHNSZWFkIDwgMjQpIHtcbiAgICAgICAgICAgIGxldCB1bnVzZWQ7XG4gICAgICAgICAgICBpZiAoYml0c1JlYWQgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaXRzUmVhZCA9PT0gMTgpIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodW51c2VkICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ5dGVMZW5ndGggPSBNYXRoLmZsb29yKGJpdHNSZWFkIC8gOCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHRbdG90YWxCeXRlc10gPSAoY2h1bmsgPj4gKDE2IC0gaSAqIDgpKSAmIDB4ZmY7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zbGljZSgwLCB0b3RhbEJ5dGVzKTtcbn1cbnZhciBFbmNvZGluZ1BhZGRpbmc7XG4oZnVuY3Rpb24gKEVuY29kaW5nUGFkZGluZykge1xuICAgIEVuY29kaW5nUGFkZGluZ1tFbmNvZGluZ1BhZGRpbmdbXCJJbmNsdWRlXCJdID0gMF0gPSBcIkluY2x1ZGVcIjtcbiAgICBFbmNvZGluZ1BhZGRpbmdbRW5jb2RpbmdQYWRkaW5nW1wiTm9uZVwiXSA9IDFdID0gXCJOb25lXCI7XG59KShFbmNvZGluZ1BhZGRpbmcgfHwgKEVuY29kaW5nUGFkZGluZyA9IHt9KSk7XG52YXIgRGVjb2RpbmdQYWRkaW5nO1xuKGZ1bmN0aW9uIChEZWNvZGluZ1BhZGRpbmcpIHtcbiAgICBEZWNvZGluZ1BhZGRpbmdbRGVjb2RpbmdQYWRkaW5nW1wiUmVxdWlyZWRcIl0gPSAwXSA9IFwiUmVxdWlyZWRcIjtcbiAgICBEZWNvZGluZ1BhZGRpbmdbRGVjb2RpbmdQYWRkaW5nW1wiSWdub3JlXCJdID0gMV0gPSBcIklnbm9yZVwiO1xufSkoRGVjb2RpbmdQYWRkaW5nIHx8IChEZWNvZGluZ1BhZGRpbmcgPSB7fSkpO1xuY29uc3QgYmFzZTY0RGVjb2RlTWFwID0ge1xuICAgIFwiMFwiOiA1MixcbiAgICBcIjFcIjogNTMsXG4gICAgXCIyXCI6IDU0LFxuICAgIFwiM1wiOiA1NSxcbiAgICBcIjRcIjogNTYsXG4gICAgXCI1XCI6IDU3LFxuICAgIFwiNlwiOiA1OCxcbiAgICBcIjdcIjogNTksXG4gICAgXCI4XCI6IDYwLFxuICAgIFwiOVwiOiA2MSxcbiAgICBBOiAwLFxuICAgIEI6IDEsXG4gICAgQzogMixcbiAgICBEOiAzLFxuICAgIEU6IDQsXG4gICAgRjogNSxcbiAgICBHOiA2LFxuICAgIEg6IDcsXG4gICAgSTogOCxcbiAgICBKOiA5LFxuICAgIEs6IDEwLFxuICAgIEw6IDExLFxuICAgIE06IDEyLFxuICAgIE46IDEzLFxuICAgIE86IDE0LFxuICAgIFA6IDE1LFxuICAgIFE6IDE2LFxuICAgIFI6IDE3LFxuICAgIFM6IDE4LFxuICAgIFQ6IDE5LFxuICAgIFU6IDIwLFxuICAgIFY6IDIxLFxuICAgIFc6IDIyLFxuICAgIFg6IDIzLFxuICAgIFk6IDI0LFxuICAgIFo6IDI1LFxuICAgIGE6IDI2LFxuICAgIGI6IDI3LFxuICAgIGM6IDI4LFxuICAgIGQ6IDI5LFxuICAgIGU6IDMwLFxuICAgIGY6IDMxLFxuICAgIGc6IDMyLFxuICAgIGg6IDMzLFxuICAgIGk6IDM0LFxuICAgIGo6IDM1LFxuICAgIGs6IDM2LFxuICAgIGw6IDM3LFxuICAgIG06IDM4LFxuICAgIG46IDM5LFxuICAgIG86IDQwLFxuICAgIHA6IDQxLFxuICAgIHE6IDQyLFxuICAgIHI6IDQzLFxuICAgIHM6IDQ0LFxuICAgIHQ6IDQ1LFxuICAgIHU6IDQ2LFxuICAgIHY6IDQ3LFxuICAgIHc6IDQ4LFxuICAgIHg6IDQ5LFxuICAgIHk6IDUwLFxuICAgIHo6IDUxLFxuICAgIFwiK1wiOiA2MixcbiAgICBcIi9cIjogNjNcbn07XG5jb25zdCBiYXNlNjR1cmxEZWNvZGVNYXAgPSB7XG4gICAgXCIwXCI6IDUyLFxuICAgIFwiMVwiOiA1MyxcbiAgICBcIjJcIjogNTQsXG4gICAgXCIzXCI6IDU1LFxuICAgIFwiNFwiOiA1NixcbiAgICBcIjVcIjogNTcsXG4gICAgXCI2XCI6IDU4LFxuICAgIFwiN1wiOiA1OSxcbiAgICBcIjhcIjogNjAsXG4gICAgXCI5XCI6IDYxLFxuICAgIEE6IDAsXG4gICAgQjogMSxcbiAgICBDOiAyLFxuICAgIEQ6IDMsXG4gICAgRTogNCxcbiAgICBGOiA1LFxuICAgIEc6IDYsXG4gICAgSDogNyxcbiAgICBJOiA4LFxuICAgIEo6IDksXG4gICAgSzogMTAsXG4gICAgTDogMTEsXG4gICAgTTogMTIsXG4gICAgTjogMTMsXG4gICAgTzogMTQsXG4gICAgUDogMTUsXG4gICAgUTogMTYsXG4gICAgUjogMTcsXG4gICAgUzogMTgsXG4gICAgVDogMTksXG4gICAgVTogMjAsXG4gICAgVjogMjEsXG4gICAgVzogMjIsXG4gICAgWDogMjMsXG4gICAgWTogMjQsXG4gICAgWjogMjUsXG4gICAgYTogMjYsXG4gICAgYjogMjcsXG4gICAgYzogMjgsXG4gICAgZDogMjksXG4gICAgZTogMzAsXG4gICAgZjogMzEsXG4gICAgZzogMzIsXG4gICAgaDogMzMsXG4gICAgaTogMzQsXG4gICAgajogMzUsXG4gICAgazogMzYsXG4gICAgbDogMzcsXG4gICAgbTogMzgsXG4gICAgbjogMzksXG4gICAgbzogNDAsXG4gICAgcDogNDEsXG4gICAgcTogNDIsXG4gICAgcjogNDMsXG4gICAgczogNDQsXG4gICAgdDogNDUsXG4gICAgdTogNDYsXG4gICAgdjogNDcsXG4gICAgdzogNDgsXG4gICAgeDogNDksXG4gICAgeTogNTAsXG4gICAgejogNTEsXG4gICAgXCItXCI6IDYyLFxuICAgIF86IDYzXG59O1xuIiwKICAgICJpbXBvcnQgeyBfX2V4cG9ydCB9IGZyb20gXCIuLi9fdmlydHVhbC9yb2xsZG93bl9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSBcIi4vb3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSBcImp3dC1kZWNvZGVcIjtcbmltcG9ydCB7IGVuY29kZUJhc2U2NHVybE5vUGFkZGluZyB9IGZyb20gXCJAb3Nsb2pzL2VuY29kaW5nXCI7XG5pbXBvcnQgand0IGZyb20gXCJqc29ud2VidG9rZW5cIjtcbmltcG9ydCBqd2tUb1BlbSBmcm9tIFwiandrLXRvLXBlbVwiO1xuXG4vLyNyZWdpb24gc3JjL2VzaS9hdXRoLnRzXG52YXIgYXV0aF9leHBvcnRzID0ge307XG5fX2V4cG9ydChhdXRoX2V4cG9ydHMsIHtcblx0Y2hhcmFjdGVySWRGcm9tVG9rZW46ICgpID0+IGNoYXJhY3RlcklkRnJvbVRva2VuLFxuXHRjcmVhdGVBdXRob3JpemF0aW9uVVJMOiAoKSA9PiBjcmVhdGVBdXRob3JpemF0aW9uVVJMLFxuXHRyZWZyZXNoOiAoKSA9PiByZWZyZXNoLFxuXHR2YWxpZGF0ZUF1dGhvcml6YXRpb25Db2RlOiAoKSA9PiB2YWxpZGF0ZUF1dGhvcml6YXRpb25Db2RlLFxuXHR2YWxpZGF0ZVRva2VuOiAoKSA9PiB2YWxpZGF0ZVRva2VuXG59KTtcbmZ1bmN0aW9uIGdlbmVyYXRlU3RhdGUoKSB7XG5cdGNvbnN0IHJhbmRvbVZhbHVlcyA9IG5ldyBVaW50OEFycmF5KDMyKTtcblx0Y3J5cHRvLmdldFJhbmRvbVZhbHVlcyhyYW5kb21WYWx1ZXMpO1xuXHRyZXR1cm4gZW5jb2RlQmFzZTY0dXJsTm9QYWRkaW5nKHJhbmRvbVZhbHVlcyk7XG59XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBdXRob3JpemF0aW9uVVJMKHNjb3BlcyA9IFwicHVibGljRGF0YVwiKSB7XG5cdGNvbnN0IHN0YXRlID0gZ2VuZXJhdGVTdGF0ZSgpO1xuXHRjb25zdCB1cmwgPSBuZXcgVVJMKFwiaHR0cHM6Ly9sb2dpbi5ldmVvbmxpbmUuY29tL3YyL29hdXRoL2F1dGhvcml6ZS9cIik7XG5cdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwicmVzcG9uc2VfdHlwZVwiLCBcImNvZGVcIik7XG5cdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwicmVkaXJlY3RfdXJpXCIsIG9wdGlvbnMuY2FsbGJhY2tfdXJsKTtcblx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJjbGllbnRfaWRcIiwgb3B0aW9ucy5jbGllbnRfaWQpO1xuXHR1cmwuc2VhcmNoUGFyYW1zLnNldChcInN0YXRlXCIsIHN0YXRlKTtcblx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJzY29wZVwiLCBBcnJheS5pc0FycmF5KHNjb3BlcykgPyBzY29wZXMuam9pbihcIiBcIikgOiBzY29wZXMpO1xuXHRyZXR1cm4ge1xuXHRcdHVybCxcblx0XHRzdGF0ZVxuXHR9O1xufVxuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVBdXRob3JpemF0aW9uQ29kZShjb2RlKSB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS92Mi9vYXV0aC90b2tlblwiLCB7XG5cdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiLFxuXHRcdFx0XHRBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtvcHRpb25zLmNsaWVudF9pZH06JHtvcHRpb25zLmNsaWVudF9zZWNyZXR9YCkudG9TdHJpbmcoXCJiYXNlNjRcIil9YFxuXHRcdFx0fSxcblx0XHRcdGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuXHRcdFx0XHRncmFudF90eXBlOiBcImF1dGhvcml6YXRpb25fY29kZVwiLFxuXHRcdFx0XHRjb2RlXG5cdFx0XHR9KVxuXHRcdH0pO1xuXHRcdHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Y29uc29sZS5lcnJvcihgZmFpbGVkIHRvIHZhbGlkYXRlIEVWRSBhdXRob3JpemF0aW9uIGNvZGVgLCBlcnJvcik7XG5cdFx0dGhyb3cgYCR7ZXJyb3J9YDtcblx0fVxufVxubGV0IGV2ZUF1dGhQdWJsaWNLZXk7XG5hc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVRva2VuKHRva2VuKSB7XG5cdGlmICghZXZlQXV0aFB1YmxpY0tleSkgdHJ5IHtcblx0XHRjb25zdCBldmVKV0tTID0gYXdhaXQgKGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9sb2dpbi5ldmVvbmxpbmUuY29tL29hdXRoL2p3a3NcIikpLmpzb24oKTtcblx0XHRldmVBdXRoUHVibGljS2V5ID0gandrVG9QZW0oZXZlSldLUy5rZXlzWzBdKTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Y29uc29sZS5lcnJvcihgZmFpbGVkIHRvIGdldCBFVkUgQXV0aCBwdWJsaWMga2V5c2AsIGVycik7XG5cdH1cblx0dHJ5IHtcblx0XHRjb25zdCBkZWNvZGVkID0gand0LnZlcmlmeSh0b2tlbiwgZXZlQXV0aFB1YmxpY0tleSk7XG5cdFx0cmV0dXJuIGRlY29kZWQ7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYGZhaWxlZCB0byB2YWxpZGF0ZSBFVkUgdG9rZW5gLCBlcnIpO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG59XG5hc3luYyBmdW5jdGlvbiByZWZyZXNoKHsgcmVmcmVzaF90b2tlbiB9LCBzY29wZXMpIHtcblx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdGdyYW50X3R5cGU6IFwicmVmcmVzaF90b2tlblwiLFxuXHRcdHJlZnJlc2hfdG9rZW4sXG5cdFx0c2NvcGU6IFwiXCJcblx0fTtcblx0aWYgKHNjb3BlcykgcGFyYW1zW1wic2NvcGVcIl0gPSBBcnJheS5pc0FycmF5KHNjb3BlcykgPyBzY29wZXMuam9pbihcIiBcIikgOiBzY29wZXM7XG5cdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2xvZ2luLmV2ZW9ubGluZS5jb20vdjIvb2F1dGgvdG9rZW5cIiwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0aGVhZGVyczoge1xuXHRcdFx0XCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIixcblx0XHRcdEF1dGhvcml6YXRpb246IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke29wdGlvbnMuY2xpZW50X2lkfToke29wdGlvbnMuY2xpZW50X3NlY3JldH1gKS50b1N0cmluZyhcImJhc2U2NFwiKX1gXG5cdFx0fSxcblx0XHRib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtcylcblx0fSk7XG5cdHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCk7XG59XG5mdW5jdGlvbiBjaGFyYWN0ZXJJZEZyb21Ub2tlbih0b2tlbikge1xuXHRjb25zdCBwYXlsb2FkID0gand0RGVjb2RlKHRva2VuKTtcblx0cmV0dXJuIHBhcnNlSW50KHBheWxvYWQuc3ViLnNwbGl0KFwiOlwiKVsyXSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgYXV0aF9leHBvcnRzLCBjaGFyYWN0ZXJJZEZyb21Ub2tlbiwgY3JlYXRlQXV0aG9yaXphdGlvblVSTCwgcmVmcmVzaCwgdmFsaWRhdGVBdXRob3JpemF0aW9uQ29kZSwgdmFsaWRhdGVUb2tlbiB9OyIsCiAgICAiaW1wb3J0IHsgY2hhcmFjdGVycyB9IGZyb20gXCIuLi9zY2hlbWEuanNcIjtcbmltcG9ydCB7IHJlZnJlc2gsIHZhbGlkYXRlVG9rZW4gfSBmcm9tIFwiLi4vLi4vZXNpL2F1dGguanNcIjtcbmltcG9ydCB7IGRiIH0gZnJvbSBcIi4uL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBhbmQsIGVxIH0gZnJvbSBcImRyaXp6bGUtb3JtXCI7XG5pbXBvcnQgeyBqd3REZWNvZGUgfSBmcm9tIFwiand0LWRlY29kZVwiO1xuXG4vLyNyZWdpb24gc3JjL2RiL21vZGVscy9jaGFyYWN0ZXIubW9kZWwudHNcbnZhciBDaGFyYWN0ZXJIZWxwZXIgPSBjbGFzcyBDaGFyYWN0ZXJIZWxwZXIge1xuXHRzdGF0aWMgaGFzVmFsaWRUb2tlbihjaGFyYWN0ZXIpIHtcblx0XHRyZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkgPCBjaGFyYWN0ZXIuZXhwaXJlc0F0O1xuXHR9XG5cdHN0YXRpYyBnZXRTY29wZXMoY2hhcmFjdGVyKSB7XG5cdFx0Y29uc3QgZGVjb2RlZCA9IGp3dERlY29kZShjaGFyYWN0ZXIuYWNjZXNzVG9rZW4pO1xuXHRcdHJldHVybiB0eXBlb2YgZGVjb2RlZC5zY3AgPT09IFwic3RyaW5nXCIgPyBbZGVjb2RlZC5zY3BdIDogZGVjb2RlZC5zY3A7XG5cdH1cblx0c3RhdGljIGhhc09ubHlQdWJsaWNTY29wZShjaGFyYWN0ZXIpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRTY29wZXMoY2hhcmFjdGVyKS5sZW5ndGggPT09IDEgJiYgdGhpcy5oYXNTY29wZShjaGFyYWN0ZXIsIFwicHVibGljRGF0YVwiKTtcblx0fVxuXHRzdGF0aWMgZ2V0VG9rZW5zKGNoYXJhY3Rlcikge1xuXHRcdHJldHVybiB7XG5cdFx0XHRhY2Nlc3NfdG9rZW46IGNoYXJhY3Rlci5hY2Nlc3NUb2tlbixcblx0XHRcdHJlZnJlc2hfdG9rZW46IGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4sXG5cdFx0XHRleHBpcmVzX2luOiAoY2hhcmFjdGVyLmV4cGlyZXNBdC5nZXRUaW1lKCkgLSBEYXRlLm5vdygpKSAvIDFlM1xuXHRcdH07XG5cdH1cblx0c3RhdGljIGhhc1Njb3BlKGNoYXJhY3Rlciwgc2NvcGUpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRTY29wZXMoY2hhcmFjdGVyKS5pbmNsdWRlcyhzY29wZSk7XG5cdH1cblx0c3RhdGljIGhhc0FsbFNjb3BlcyhjaGFyYWN0ZXIsIHNjb3Blcykge1xuXHRcdGNvbnN0IGhhcyA9IHRoaXMuZ2V0U2NvcGVzKGNoYXJhY3Rlcik7XG5cdFx0cmV0dXJuIHNjb3Blcy5ldmVyeSgoc2NvcGUpID0+IGhhcy5pbmNsdWRlcyhzY29wZSkpO1xuXHR9XG5cdHN0YXRpYyBmaW5kKGlkKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KCkuZnJvbShjaGFyYWN0ZXJzKS53aGVyZShlcShjaGFyYWN0ZXJzLmlkLCBpZCkpLmxpbWl0KDEpLmdldCgpO1xuXHRcdGNvbnN0IGMgPSB0aGlzLmNyZWF0ZUNoYXJhY3RlcnMocmVzdWx0KTtcblx0XHRyZXR1cm4gYyA/IGNbMF0gOiB2b2lkIDA7XG5cdH1cblx0c3RhdGljIGZpbmRCeVVzZXIodXNlcikge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykud2hlcmUoZXEoY2hhcmFjdGVycy51c2VySUQsIHVzZXIuaWQpKS5hbGwoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDaGFyYWN0ZXJzKHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGZpbmRCeVVzZXJBbmRFdmVJRCh1c2VySUQsIGV2ZUlEKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KCkuZnJvbShjaGFyYWN0ZXJzKS53aGVyZShhbmQoZXEoY2hhcmFjdGVycy51c2VySUQsIHVzZXJJRCksIGVxKGNoYXJhY3RlcnMuZXZlSUQsIGV2ZUlEKSkpLmxpbWl0KDEpLmdldCgpO1xuXHRcdGNvbnN0IGMgPSB0aGlzLmNyZWF0ZUNoYXJhY3RlcnMocmVzdWx0KTtcblx0XHRyZXR1cm4gYyA/IGNbMF0gOiB2b2lkIDA7XG5cdH1cblx0c3RhdGljIGZpbmRCeU5hbWUodXNlcklELCBuYW1lKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KCkuZnJvbShjaGFyYWN0ZXJzKS53aGVyZShhbmQoZXEoY2hhcmFjdGVycy5uYW1lLCBuYW1lKSwgZXEoY2hhcmFjdGVycy51c2VySUQsIHVzZXJJRCkpKS5saW1pdCgxKS5nZXQoKTtcblx0XHRjb25zdCBjID0gdGhpcy5jcmVhdGVDaGFyYWN0ZXJzKHJlc3VsdCk7XG5cdFx0cmV0dXJuIGMgPyBjWzBdIDogdm9pZCAwO1xuXHR9XG5cdHN0YXRpYyBmaW5kQWxsKCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykuYWxsKCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ2hhcmFjdGVycyhyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBjcmVhdGUoZXZlSUQsIG5hbWUsIHVzZXIsIHRva2Vucykge1xuXHRcdHJldHVybiB0aGlzLnNhdmUoe1xuXHRcdFx0ZXZlSUQsXG5cdFx0XHR1c2VySUQ6IHVzZXIuaWQsXG5cdFx0XHRhY2Nlc3NUb2tlbjogdG9rZW5zLmFjY2Vzc190b2tlbixcblx0XHRcdGV4cGlyZXNBdDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKHRva2Vucy5leHBpcmVzX2luICogMWUzKSxcblx0XHRcdHJlZnJlc2hUb2tlbjogdG9rZW5zLnJlZnJlc2hfdG9rZW4sXG5cdFx0XHRuYW1lLFxuXHRcdFx0Y3JlYXRlZEF0OiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKVxuXHRcdH0pO1xuXHR9XG5cdHN0YXRpYyBjcmVhdGVDaGFyYWN0ZXJzKHF1ZXJ5KSB7XG5cdFx0aWYgKCFxdWVyeSkgcmV0dXJuIFtdO1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5KSkgcmV0dXJuIHF1ZXJ5Lm1hcCgoY2hhcmFjdGVyKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRpZDogY2hhcmFjdGVyLmlkLFxuXHRcdFx0XHRldmVJRDogY2hhcmFjdGVyLmV2ZUlELFxuXHRcdFx0XHR1c2VySUQ6IGNoYXJhY3Rlci51c2VySUQsXG5cdFx0XHRcdGFjY2Vzc1Rva2VuOiBjaGFyYWN0ZXIuYWNjZXNzVG9rZW4sXG5cdFx0XHRcdGV4cGlyZXNBdDogbmV3IERhdGUoY2hhcmFjdGVyLmV4cGlyZXNBdCksXG5cdFx0XHRcdHJlZnJlc2hUb2tlbjogY2hhcmFjdGVyLnJlZnJlc2hUb2tlbixcblx0XHRcdFx0bmFtZTogY2hhcmFjdGVyLm5hbWUsXG5cdFx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUoY2hhcmFjdGVyLmNyZWF0ZWRBdCksXG5cdFx0XHRcdHVwZGF0ZWRBdDogbmV3IERhdGUoY2hhcmFjdGVyLnVwZGF0ZWRBdClcblx0XHRcdH07XG5cdFx0fSk7XG5cdFx0ZWxzZSByZXR1cm4gW3tcblx0XHRcdGlkOiBxdWVyeS5pZCxcblx0XHRcdGV2ZUlEOiBxdWVyeS5ldmVJRCxcblx0XHRcdHVzZXJJRDogcXVlcnkudXNlcklELFxuXHRcdFx0YWNjZXNzVG9rZW46IHF1ZXJ5LmFjY2Vzc1Rva2VuLFxuXHRcdFx0ZXhwaXJlc0F0OiBuZXcgRGF0ZShxdWVyeS5leHBpcmVzQXQpLFxuXHRcdFx0cmVmcmVzaFRva2VuOiBxdWVyeS5yZWZyZXNoVG9rZW4sXG5cdFx0XHRuYW1lOiBxdWVyeS5uYW1lLFxuXHRcdFx0Y3JlYXRlZEF0OiBuZXcgRGF0ZShxdWVyeS5jcmVhdGVkQXQpLFxuXHRcdFx0dXBkYXRlZEF0OiBuZXcgRGF0ZShxdWVyeS51cGRhdGVkQXQpXG5cdFx0fV07XG5cdH1cblx0c3RhdGljIHNhdmUoY2hhcmFjdGVyKSB7XG5cdFx0ZGIuaW5zZXJ0KGNoYXJhY3RlcnMpLnZhbHVlcyh7XG5cdFx0XHRpZDogY2hhcmFjdGVyLmlkLFxuXHRcdFx0ZXZlSUQ6IGNoYXJhY3Rlci5ldmVJRCxcblx0XHRcdHVzZXJJRDogY2hhcmFjdGVyLnVzZXJJRCxcblx0XHRcdG5hbWU6IGNoYXJhY3Rlci5uYW1lLFxuXHRcdFx0YWNjZXNzVG9rZW46IGNoYXJhY3Rlci5hY2Nlc3NUb2tlbixcblx0XHRcdGV4cGlyZXNBdDogY2hhcmFjdGVyLmV4cGlyZXNBdC5nZXRUaW1lKCksXG5cdFx0XHRyZWZyZXNoVG9rZW46IGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4sXG5cdFx0XHRjcmVhdGVkQXQ6IERhdGUubm93KCksXG5cdFx0XHR1cGRhdGVkQXQ6IERhdGUubm93KClcblx0XHR9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuXHRcdFx0dGFyZ2V0OiBjaGFyYWN0ZXJzLmlkLFxuXHRcdFx0c2V0OiB7XG5cdFx0XHRcdGV2ZUlEOiBjaGFyYWN0ZXIuZXZlSUQsXG5cdFx0XHRcdHVzZXJJRDogY2hhcmFjdGVyLnVzZXJJRCxcblx0XHRcdFx0bmFtZTogY2hhcmFjdGVyLm5hbWUsXG5cdFx0XHRcdGFjY2Vzc1Rva2VuOiBjaGFyYWN0ZXIuYWNjZXNzVG9rZW4sXG5cdFx0XHRcdGV4cGlyZXNBdDogY2hhcmFjdGVyLmV4cGlyZXNBdC5nZXRUaW1lKCksXG5cdFx0XHRcdHJlZnJlc2hUb2tlbjogY2hhcmFjdGVyLnJlZnJlc2hUb2tlbixcblx0XHRcdFx0dXBkYXRlZEF0OiBEYXRlLm5vdygpXG5cdFx0XHR9XG5cdFx0fSkucnVuKCk7XG5cdFx0cmV0dXJuIENoYXJhY3RlckhlbHBlci5maW5kQnlVc2VyQW5kRXZlSUQoY2hhcmFjdGVyLnVzZXJJRCwgY2hhcmFjdGVyLmV2ZUlEKTtcblx0fVxuXHRzdGF0aWMgZGVsZXRlKGNoYXJhY3Rlcikge1xuXHRcdGRiLmRlbGV0ZShjaGFyYWN0ZXJzKS53aGVyZShlcShjaGFyYWN0ZXJzLmlkLCBjaGFyYWN0ZXIuaWQpKS5ydW4oKTtcblx0fVxuXHRzdGF0aWMgYXN5bmMgcmVmcmVzaFRva2VucyhjaGFyYWN0ZXIsIHNjb3Blcykge1xuXHRcdGNvbnN0IHRva2VucyA9IGF3YWl0IHJlZnJlc2goeyByZWZyZXNoX3Rva2VuOiBjaGFyYWN0ZXIucmVmcmVzaFRva2VuIH0sIHNjb3Blcyk7XG5cdFx0Y29uc3QgZGVjb2RlZCA9IGF3YWl0IHZhbGlkYXRlVG9rZW4odG9rZW5zLmFjY2Vzc190b2tlbik7XG5cdFx0aWYgKCFkZWNvZGVkKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gdmFsaWRhdGUgdG9rZW4gZm9yIGNoYXJhY3RlciAke2NoYXJhY3Rlci5ldmVJRH1gKTtcblx0XHRcdHJldHVybiBjaGFyYWN0ZXI7XG5cdFx0fVxuXHRcdGNoYXJhY3Rlci5hY2Nlc3NUb2tlbiA9IHRva2Vucy5hY2Nlc3NfdG9rZW47XG5cdFx0Y2hhcmFjdGVyLmV4cGlyZXNBdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyB0b2tlbnMuZXhwaXJlc19pbiAqIDFlMyk7XG5cdFx0Y2hhcmFjdGVyLnJlZnJlc2hUb2tlbiA9IHRva2Vucy5yZWZyZXNoX3Rva2VuO1xuXHRcdHRoaXMuc2F2ZShjaGFyYWN0ZXIpO1xuXHRcdHJldHVybiBjaGFyYWN0ZXI7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgQ2hhcmFjdGVySGVscGVyIH07IiwKICAgICJpbXBvcnQgeyBjaGFyYWN0ZXJzLCB1c2VycyB9IGZyb20gXCIuLi9zY2hlbWEuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuL2NoYXJhY3Rlci5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgZGIgfSBmcm9tIFwiLi4vaW5kZXguanNcIjtcbmltcG9ydCB7IGVxLCBzcWwgfSBmcm9tIFwiZHJpenpsZS1vcm1cIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9tb2RlbHMvdXNlci5tb2RlbC50c1xudmFyIFVzZXJIZWxwZXIgPSBjbGFzcyB7XG5cdHN0YXRpYyBmaW5kKGlkKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KHtcblx0XHRcdGlkOiB1c2Vycy5pZCxcblx0XHRcdGRpc2NvcmRJRDogdXNlcnMuZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2Vycy5jcmVhdGVkQXQsXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXJzLnVwZGF0ZWRBdCxcblx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlcnMubWFpbkNoYXJhY3Rlcixcblx0XHRcdGNoYXJhY3RlcklEc1N0cmluZzogc3FsYGpzb25fZ3JvdXBfYXJyYXkoY2hhcmFjdGVycy5pZClgXG5cdFx0fSkuZnJvbSh1c2Vycykud2hlcmUoZXEodXNlcnMuaWQsIGlkKSkubGVmdEpvaW4oY2hhcmFjdGVycywgZXEodXNlcnMuaWQsIGNoYXJhY3RlcnMudXNlcklEKSkuZ2V0KCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRnJvbVF1ZXJ5KHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGZpbmRCeURpc2NvcmRJZChpZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCh7XG5cdFx0XHRpZDogdXNlcnMuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXJzLmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlcnMuY3JlYXRlZEF0LFxuXHRcdFx0dXBkYXRlZEF0OiB1c2Vycy51cGRhdGVkQXQsXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXJzLm1haW5DaGFyYWN0ZXIsXG5cdFx0XHRjaGFyYWN0ZXJJRHNTdHJpbmc6IHNxbGBqc29uX2dyb3VwX2FycmF5KGNoYXJhY3RlcnMuaWQpYFxuXHRcdH0pLmZyb20odXNlcnMpLndoZXJlKGVxKHVzZXJzLmRpc2NvcmRJRCwgaWQpKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS5nZXQoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgZmluZEFsbCgpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3Qoe1xuXHRcdFx0aWQ6IHVzZXJzLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2Vycy5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXJzLmNyZWF0ZWRBdCxcblx0XHRcdHVwZGF0ZWRBdDogdXNlcnMudXBkYXRlZEF0LFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2Vycy5tYWluQ2hhcmFjdGVyLFxuXHRcdFx0Y2hhcmFjdGVySURzU3RyaW5nOiBzcWxganNvbl9ncm91cF9hcnJheShjaGFyYWN0ZXJzLmlkKWBcblx0XHR9KS5mcm9tKHVzZXJzKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS5hbGwoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgZmluZEJ5Q2hhcmFjdGVySWQoaWQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3Qoe1xuXHRcdFx0aWQ6IHVzZXJzLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2Vycy5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXJzLmNyZWF0ZWRBdCxcblx0XHRcdHVwZGF0ZWRBdDogdXNlcnMudXBkYXRlZEF0LFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2Vycy5tYWluQ2hhcmFjdGVyLFxuXHRcdFx0Y2hhcmFjdGVySURzU3RyaW5nOiBzcWxganNvbl9ncm91cF9hcnJheShjaGFyYWN0ZXJzLmlkKWBcblx0XHR9KS5mcm9tKHVzZXJzKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS53aGVyZShlcShjaGFyYWN0ZXJzLmlkLCBpZCkpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlDaGFyYWN0ZXJOYW1lKG5hbWUpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3Qoe1xuXHRcdFx0aWQ6IHVzZXJzLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2Vycy5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXJzLmNyZWF0ZWRBdCxcblx0XHRcdHVwZGF0ZWRBdDogdXNlcnMudXBkYXRlZEF0LFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2Vycy5tYWluQ2hhcmFjdGVyLFxuXHRcdFx0Y2hhcmFjdGVySURzU3RyaW5nOiBzcWxganNvbl9ncm91cF9hcnJheShjaGFyYWN0ZXJzLmlkKWBcblx0XHR9KS5mcm9tKHVzZXJzKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS53aGVyZShlcShjaGFyYWN0ZXJzLm5hbWUsIG5hbWUpKS5hbGwoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlRnJvbVF1ZXJ5KHF1ZXJ5KSB7XG5cdFx0aWYgKCFxdWVyeSkgcmV0dXJuIFtdO1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5KSkgcmV0dXJuIHF1ZXJ5Lm1hcCgodXNlcikgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aWQ6IHVzZXIuaWQsXG5cdFx0XHRcdGRpc2NvcmRJRDogdXNlci5kaXNjb3JkSUQsXG5cdFx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUodXNlci5jcmVhdGVkQXQpLFxuXHRcdFx0XHR1cGRhdGVkQXQ6IG5ldyBEYXRlKHVzZXIudXBkYXRlZEF0KSxcblx0XHRcdFx0Y2hhcmFjdGVySURzOiB1c2VyLmNoYXJhY3RlcklEc1N0cmluZyA/IEpTT04ucGFyc2UodXNlci5jaGFyYWN0ZXJJRHNTdHJpbmcgPz8gXCJbXVwiKS5tYXAoKHMpID0+IE51bWJlcihzKSkuc29ydCgpIDogW10sXG5cdFx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlci5tYWluQ2hhcmFjdGVySURcblx0XHRcdH07XG5cdFx0fSk7XG5cdFx0ZWxzZSByZXR1cm4ge1xuXHRcdFx0aWQ6IHF1ZXJ5LmlkLFxuXHRcdFx0ZGlzY29yZElEOiBxdWVyeS5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKHF1ZXJ5LmNyZWF0ZWRBdCksXG5cdFx0XHR1cGRhdGVkQXQ6IG5ldyBEYXRlKHF1ZXJ5LnVwZGF0ZWRBdCksXG5cdFx0XHRjaGFyYWN0ZXJJRHM6IHF1ZXJ5LmNoYXJhY3RlcklEc1N0cmluZyA/IEpTT04ucGFyc2UocXVlcnkuY2hhcmFjdGVySURzU3RyaW5nID8/IFwiW11cIikubWFwKChzKSA9PiBOdW1iZXIocykpLnNvcnQoKSA6IFtdLFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiBxdWVyeS5tYWluQ2hhcmFjdGVySURcblx0XHR9O1xuXHR9XG5cdHN0YXRpYyBjcmVhdGUoZGlzY29yZElEKSB7XG5cdFx0dGhpcy5zYXZlKHtcblx0XHRcdGRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksXG5cdFx0XHR1cGRhdGVkQXQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpXG5cdFx0fSk7XG5cdFx0cmV0dXJuIHRoaXMuZmluZEJ5RGlzY29yZElkKGRpc2NvcmRJRCk7XG5cdH1cblx0c3RhdGljIHNhdmUodXNlcikge1xuXHRcdGRiLmluc2VydCh1c2VycykudmFsdWVzKHtcblx0XHRcdGlkOiB1c2VyLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2VyLmRpc2NvcmRJRCxcblx0XHRcdG1haW5DaGFyYWN0ZXI6IHVzZXIubWFpbkNoYXJhY3RlcklELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2VyLmNyZWF0ZWRBdC5nZXRUaW1lKCksXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXIudXBkYXRlZEF0LmdldFRpbWUoKVxuXHRcdH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG5cdFx0XHR0YXJnZXQ6IHVzZXJzLmlkLFxuXHRcdFx0c2V0OiB7XG5cdFx0XHRcdGRpc2NvcmRJRDogdXNlci5kaXNjb3JkSUQsXG5cdFx0XHRcdG1haW5DaGFyYWN0ZXI6IHVzZXIubWFpbkNoYXJhY3RlcklELFxuXHRcdFx0XHR1cGRhdGVkQXQ6IHVzZXIudXBkYXRlZEF0LmdldFRpbWUoKVxuXHRcdFx0fVxuXHRcdH0pLnJ1bigpO1xuXHRcdHJldHVybiB1c2VyO1xuXHR9XG5cdHN0YXRpYyBkZWxldGUodXNlcikge1xuXHRcdGRiLmRlbGV0ZSh1c2Vycykud2hlcmUoZXEodXNlcnMuaWQsIHVzZXIuaWQpKS5ydW4oKTtcblx0fVxuXHRzdGF0aWMgZ2V0Q2hhcmFjdGVyKHVzZXIsIGluZGV4KSB7XG5cdFx0aWYgKCF1c2VyLmNoYXJhY3RlcklEcykgcmV0dXJuIHZvaWQgMDtcblx0XHRpZiAoaW5kZXggPj0gdXNlci5jaGFyYWN0ZXJJRHMubGVuZ3RoKSByZXR1cm4gdm9pZCAwO1xuXHRcdHJldHVybiBDaGFyYWN0ZXJIZWxwZXIuZmluZCh1c2VyLmNoYXJhY3RlcklEc1tpbmRleF0pO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IFVzZXJIZWxwZXIgfTsiLAogICAgImltcG9ydCB7IHJlc3VtZUNvbW1hbmRzIH0gZnJvbSBcIi4uL3NjaGVtYS5qc1wiO1xuaW1wb3J0IHsgZGIgfSBmcm9tIFwiLi4vaW5kZXguanNcIjtcbmltcG9ydCB7IGVxIH0gZnJvbSBcImRyaXp6bGUtb3JtXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvbW9kZWxzL3Jlc3VtZS1jb21tYW5kLm1vZGVsLnRzXG52YXIgUmVzdW1lQ29tbWFuZCA9IGNsYXNzIFJlc3VtZUNvbW1hbmQge1xuXHRpZDtcblx0Y29tbWFuZDtcblx0cGFyYW1zO1xuXHRjb250ZXh0O1xuXHRjcmVhdGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7XG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXMuY3JlYXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpO1xuXHR9XG5cdHN0YXRpYyBmaW5kKG1lc3NhZ2VJZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20ocmVzdW1lQ29tbWFuZHMpLndoZXJlKGVxKHJlc3VtZUNvbW1hbmRzLmlkLCBtZXNzYWdlSWQpKS5nZXQoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlKG1lc3NhZ2VJZCwgY29tbWFuZCwgcGFyYW1zID0ge30sIGNvbnRleHQgPSB7fSkge1xuXHRcdGNvbnN0IHJlc3VtZSA9IG5ldyBSZXN1bWVDb21tYW5kKCk7XG5cdFx0cmVzdW1lLmlkID0gbWVzc2FnZUlkO1xuXHRcdHJlc3VtZS5jb21tYW5kID0gY29tbWFuZDtcblx0XHRyZXN1bWUucGFyYW1zID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcblx0XHRyZXN1bWUuY29udGV4dCA9IEpTT04uc3RyaW5naWZ5KGNvbnRleHQpO1xuXHRcdHJldHVybiByZXN1bWU7XG5cdH1cblx0c3RhdGljIGNyZWF0ZUZyb21RdWVyeShxdWVyeSkge1xuXHRcdGlmICghcXVlcnkpIHJldHVybiBudWxsO1xuXHRcdGNvbnN0IHJlc3VtZSA9IG5ldyBSZXN1bWVDb21tYW5kKCk7XG5cdFx0cmVzdW1lLmlkID0gcXVlcnkuaWQ7XG5cdFx0cmVzdW1lLmNvbW1hbmQgPSBxdWVyeS5jb21tYW5kO1xuXHRcdHJlc3VtZS5wYXJhbXMgPSBxdWVyeS5wYXJhbXM7XG5cdFx0cmVzdW1lLmNvbnRleHQgPSBxdWVyeS5jb250ZXh0O1xuXHRcdHJlc3VtZS5jcmVhdGVkID0gcXVlcnkuY3JlYXRlZDtcblx0XHRyZXR1cm4gcmVzdW1lO1xuXHR9XG5cdHNhdmUoKSB7XG5cdFx0ZGIuaW5zZXJ0KHJlc3VtZUNvbW1hbmRzKS52YWx1ZXMoe1xuXHRcdFx0aWQ6IHRoaXMuaWQsXG5cdFx0XHRjb21tYW5kOiB0aGlzLmNvbW1hbmQsXG5cdFx0XHRwYXJhbXM6IHRoaXMucGFyYW1zLFxuXHRcdFx0Y29udGV4dDogdGhpcy5jb250ZXh0LFxuXHRcdFx0Y3JlYXRlZEF0OiB0aGlzLmNyZWF0ZWQuZ2V0VGltZSgpXG5cdFx0fSkub25Db25mbGljdERvVXBkYXRlKHtcblx0XHRcdHRhcmdldDogcmVzdW1lQ29tbWFuZHMuaWQsXG5cdFx0XHRzZXQ6IHtcblx0XHRcdFx0Y29tbWFuZDogdGhpcy5jb21tYW5kLFxuXHRcdFx0XHRwYXJhbXM6IHRoaXMucGFyYW1zLFxuXHRcdFx0XHRjb250ZXh0OiB0aGlzLmNvbnRleHRcblx0XHRcdH1cblx0XHR9KS5ydW4oKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHRkZWxldGUoKSB7XG5cdFx0ZGIuZGVsZXRlKHJlc3VtZUNvbW1hbmRzKS53aGVyZShlcShyZXN1bWVDb21tYW5kcy5pZCwgdGhpcy5pZCkpLnJ1bigpO1xuXHR9XG5cdHN0YXRpYyBkZWxldGUobWVzc2FnZUlkKSB7XG5cdFx0ZGIuZGVsZXRlKHJlc3VtZUNvbW1hbmRzKS53aGVyZShlcShyZXN1bWVDb21tYW5kcy5pZCwgbWVzc2FnZUlkKSkucnVuKCk7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgUmVzdW1lQ29tbWFuZCB9OyIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4vY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBVc2VySGVscGVyIH0gZnJvbSBcIi4vdXNlci5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgUmVzdW1lQ29tbWFuZCB9IGZyb20gXCIuL3Jlc3VtZS1jb21tYW5kLm1vZGVsLmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvbW9kZWxzL2luZGV4LnRzXG52YXIgbW9kZWxzX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KG1vZGVsc19leHBvcnRzLCB7XG5cdENoYXJhY3RlckhlbHBlcjogKCkgPT4gQ2hhcmFjdGVySGVscGVyLFxuXHRSZXN1bWVDb21tYW5kOiAoKSA9PiBSZXN1bWVDb21tYW5kLFxuXHRVc2VySGVscGVyOiAoKSA9PiBVc2VySGVscGVyXG59KTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBtb2RlbHNfZXhwb3J0cyB9OyIsCiAgICAiaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tIFwiYnVuOnNxbGl0ZVwiO1xuaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IERlZmF1bHRMb2dnZXIgfSBmcm9tIFwiLi4vbG9nZ2VyLmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVUYWJsZVJlbGF0aW9uc0hlbHBlcnMsXG4gIGV4dHJhY3RUYWJsZXNSZWxhdGlvbmFsQ29uZmlnXG59IGZyb20gXCIuLi9yZWxhdGlvbnMuanNcIjtcbmltcG9ydCB7IEJhc2VTUUxpdGVEYXRhYmFzZSB9IGZyb20gXCIuLi9zcWxpdGUtY29yZS9kYi5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlU3luY0RpYWxlY3QgfSBmcm9tIFwiLi4vc3FsaXRlLWNvcmUvZGlhbGVjdC5qc1wiO1xuaW1wb3J0IHsgaXNDb25maWcgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUJ1blNlc3Npb24gfSBmcm9tIFwiLi9zZXNzaW9uLmpzXCI7XG5jbGFzcyBCdW5TUUxpdGVEYXRhYmFzZSBleHRlbmRzIEJhc2VTUUxpdGVEYXRhYmFzZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkJ1blNRTGl0ZURhdGFiYXNlXCI7XG59XG5mdW5jdGlvbiBjb25zdHJ1Y3QoY2xpZW50LCBjb25maWcgPSB7fSkge1xuICBjb25zdCBkaWFsZWN0ID0gbmV3IFNRTGl0ZVN5bmNEaWFsZWN0KHsgY2FzaW5nOiBjb25maWcuY2FzaW5nIH0pO1xuICBsZXQgbG9nZ2VyO1xuICBpZiAoY29uZmlnLmxvZ2dlciA9PT0gdHJ1ZSkge1xuICAgIGxvZ2dlciA9IG5ldyBEZWZhdWx0TG9nZ2VyKCk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmxvZ2dlciAhPT0gZmFsc2UpIHtcbiAgICBsb2dnZXIgPSBjb25maWcubG9nZ2VyO1xuICB9XG4gIGxldCBzY2hlbWE7XG4gIGlmIChjb25maWcuc2NoZW1hKSB7XG4gICAgY29uc3QgdGFibGVzQ29uZmlnID0gZXh0cmFjdFRhYmxlc1JlbGF0aW9uYWxDb25maWcoXG4gICAgICBjb25maWcuc2NoZW1hLFxuICAgICAgY3JlYXRlVGFibGVSZWxhdGlvbnNIZWxwZXJzXG4gICAgKTtcbiAgICBzY2hlbWEgPSB7XG4gICAgICBmdWxsU2NoZW1hOiBjb25maWcuc2NoZW1hLFxuICAgICAgc2NoZW1hOiB0YWJsZXNDb25maWcudGFibGVzLFxuICAgICAgdGFibGVOYW1lc01hcDogdGFibGVzQ29uZmlnLnRhYmxlTmFtZXNNYXBcbiAgICB9O1xuICB9XG4gIGNvbnN0IHNlc3Npb24gPSBuZXcgU1FMaXRlQnVuU2Vzc2lvbihjbGllbnQsIGRpYWxlY3QsIHNjaGVtYSwgeyBsb2dnZXIgfSk7XG4gIGNvbnN0IGRiID0gbmV3IEJ1blNRTGl0ZURhdGFiYXNlKFwic3luY1wiLCBkaWFsZWN0LCBzZXNzaW9uLCBzY2hlbWEpO1xuICBkYi4kY2xpZW50ID0gY2xpZW50O1xuICByZXR1cm4gZGI7XG59XG5mdW5jdGlvbiBkcml6emxlKC4uLnBhcmFtcykge1xuICBpZiAocGFyYW1zWzBdID09PSB2b2lkIDAgfHwgdHlwZW9mIHBhcmFtc1swXSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGluc3RhbmNlID0gcGFyYW1zWzBdID09PSB2b2lkIDAgPyBuZXcgRGF0YWJhc2UoKSA6IG5ldyBEYXRhYmFzZShwYXJhbXNbMF0pO1xuICAgIHJldHVybiBjb25zdHJ1Y3QoaW5zdGFuY2UsIHBhcmFtc1sxXSk7XG4gIH1cbiAgaWYgKGlzQ29uZmlnKHBhcmFtc1swXSkpIHtcbiAgICBjb25zdCB7IGNvbm5lY3Rpb24sIGNsaWVudCwgLi4uZHJpenpsZUNvbmZpZyB9ID0gcGFyYW1zWzBdO1xuICAgIGlmIChjbGllbnQpIHJldHVybiBjb25zdHJ1Y3QoY2xpZW50LCBkcml6emxlQ29uZmlnKTtcbiAgICBpZiAodHlwZW9mIGNvbm5lY3Rpb24gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHsgc291cmNlLCAuLi5vcHRzIH0gPSBjb25uZWN0aW9uO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC52YWx1ZXMob3B0cykuZmlsdGVyKCh2KSA9PiB2ICE9PSB2b2lkIDApLmxlbmd0aCA/IG9wdHMgOiB2b2lkIDA7XG4gICAgICBjb25zdCBpbnN0YW5jZTIgPSBuZXcgRGF0YWJhc2Uoc291cmNlLCBvcHRpb25zKTtcbiAgICAgIHJldHVybiBjb25zdHJ1Y3QoaW5zdGFuY2UyLCBkcml6emxlQ29uZmlnKTtcbiAgICB9XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRGF0YWJhc2UoY29ubmVjdGlvbik7XG4gICAgcmV0dXJuIGNvbnN0cnVjdChpbnN0YW5jZSwgZHJpenpsZUNvbmZpZyk7XG4gIH1cbiAgcmV0dXJuIGNvbnN0cnVjdChwYXJhbXNbMF0sIHBhcmFtc1sxXSk7XG59XG4oKGRyaXp6bGUyKSA9PiB7XG4gIGZ1bmN0aW9uIG1vY2soY29uZmlnKSB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdCh7fSwgY29uZmlnKTtcbiAgfVxuICBkcml6emxlMi5tb2NrID0gbW9jaztcbn0pKGRyaXp6bGUgfHwgKGRyaXp6bGUgPSB7fSkpO1xuZXhwb3J0IHtcbiAgQnVuU1FMaXRlRGF0YWJhc2UsXG4gIGRyaXp6bGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kcml2ZXIuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgTm9vcExvZ2dlciB9IGZyb20gXCIuLi9sb2dnZXIuanNcIjtcbmltcG9ydCB7IGZpbGxQbGFjZWhvbGRlcnMsIHNxbCB9IGZyb20gXCIuLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUcmFuc2FjdGlvbiB9IGZyb20gXCIuLi9zcWxpdGUtY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlUHJlcGFyZWRRdWVyeSBhcyBQcmVwYXJlZFF1ZXJ5QmFzZSwgU1FMaXRlU2Vzc2lvbiB9IGZyb20gXCIuLi9zcWxpdGUtY29yZS9zZXNzaW9uLmpzXCI7XG5pbXBvcnQgeyBtYXBSZXN1bHRSb3cgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmNsYXNzIFNRTGl0ZUJ1blNlc3Npb24gZXh0ZW5kcyBTUUxpdGVTZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoY2xpZW50LCBkaWFsZWN0LCBzY2hlbWEsIG9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGRpYWxlY3QpO1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgPz8gbmV3IE5vb3BMb2dnZXIoKTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCdW5TZXNzaW9uXCI7XG4gIGxvZ2dlcjtcbiAgZXhlYyhxdWVyeSkge1xuICAgIHRoaXMuY2xpZW50LmV4ZWMocXVlcnkpO1xuICB9XG4gIHByZXBhcmVRdWVyeShxdWVyeSwgZmllbGRzLCBleGVjdXRlTWV0aG9kLCBpc1Jlc3BvbnNlSW5BcnJheU1vZGUsIGN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgIGNvbnN0IHN0bXQgPSB0aGlzLmNsaWVudC5wcmVwYXJlKHF1ZXJ5LnNxbCk7XG4gICAgcmV0dXJuIG5ldyBQcmVwYXJlZFF1ZXJ5KFxuICAgICAgc3RtdCxcbiAgICAgIHF1ZXJ5LFxuICAgICAgdGhpcy5sb2dnZXIsXG4gICAgICBmaWVsZHMsXG4gICAgICBleGVjdXRlTWV0aG9kLFxuICAgICAgaXNSZXNwb25zZUluQXJyYXlNb2RlLFxuICAgICAgY3VzdG9tUmVzdWx0TWFwcGVyXG4gICAgKTtcbiAgfVxuICB0cmFuc2FjdGlvbih0cmFuc2FjdGlvbiwgY29uZmlnID0ge30pIHtcbiAgICBjb25zdCB0eCA9IG5ldyBTUUxpdGVCdW5UcmFuc2FjdGlvbihcInN5bmNcIiwgdGhpcy5kaWFsZWN0LCB0aGlzLCB0aGlzLnNjaGVtYSk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBjb25zdCBuYXRpdmVUeCA9IHRoaXMuY2xpZW50LnRyYW5zYWN0aW9uKCgpID0+IHtcbiAgICAgIHJlc3VsdCA9IHRyYW5zYWN0aW9uKHR4KTtcbiAgICB9KTtcbiAgICBuYXRpdmVUeFtjb25maWcuYmVoYXZpb3IgPz8gXCJkZWZlcnJlZFwiXSgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJ1blRyYW5zYWN0aW9uIGV4dGVuZHMgU1FMaXRlVHJhbnNhY3Rpb24ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCdW5UcmFuc2FjdGlvblwiO1xuICB0cmFuc2FjdGlvbih0cmFuc2FjdGlvbikge1xuICAgIGNvbnN0IHNhdmVwb2ludE5hbWUgPSBgc3Ake3RoaXMubmVzdGVkSW5kZXh9YDtcbiAgICBjb25zdCB0eCA9IG5ldyBTUUxpdGVCdW5UcmFuc2FjdGlvbihcInN5bmNcIiwgdGhpcy5kaWFsZWN0LCB0aGlzLnNlc3Npb24sIHRoaXMuc2NoZW1hLCB0aGlzLm5lc3RlZEluZGV4ICsgMSk7XG4gICAgdGhpcy5zZXNzaW9uLnJ1bihzcWwucmF3KGBzYXZlcG9pbnQgJHtzYXZlcG9pbnROYW1lfWApKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdHJhbnNhY3Rpb24odHgpO1xuICAgICAgdGhpcy5zZXNzaW9uLnJ1bihzcWwucmF3KGByZWxlYXNlIHNhdmVwb2ludCAke3NhdmVwb2ludE5hbWV9YCkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc2Vzc2lvbi5ydW4oc3FsLnJhdyhgcm9sbGJhY2sgdG8gc2F2ZXBvaW50ICR7c2F2ZXBvaW50TmFtZX1gKSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG59XG5jbGFzcyBQcmVwYXJlZFF1ZXJ5IGV4dGVuZHMgUHJlcGFyZWRRdWVyeUJhc2Uge1xuICBjb25zdHJ1Y3RvcihzdG10LCBxdWVyeSwgbG9nZ2VyLCBmaWVsZHMsIGV4ZWN1dGVNZXRob2QsIF9pc1Jlc3BvbnNlSW5BcnJheU1vZGUsIGN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgIHN1cGVyKFwic3luY1wiLCBleGVjdXRlTWV0aG9kLCBxdWVyeSk7XG4gICAgdGhpcy5zdG10ID0gc3RtdDtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICB0aGlzLl9pc1Jlc3BvbnNlSW5BcnJheU1vZGUgPSBfaXNSZXNwb25zZUluQXJyYXlNb2RlO1xuICAgIHRoaXMuY3VzdG9tUmVzdWx0TWFwcGVyID0gY3VzdG9tUmVzdWx0TWFwcGVyO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJ1blByZXBhcmVkUXVlcnlcIjtcbiAgcnVuKHBsYWNlaG9sZGVyVmFsdWVzKSB7XG4gICAgY29uc3QgcGFyYW1zID0gZmlsbFBsYWNlaG9sZGVycyh0aGlzLnF1ZXJ5LnBhcmFtcywgcGxhY2Vob2xkZXJWYWx1ZXMgPz8ge30pO1xuICAgIHRoaXMubG9nZ2VyLmxvZ1F1ZXJ5KHRoaXMucXVlcnkuc3FsLCBwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzLnN0bXQucnVuKC4uLnBhcmFtcyk7XG4gIH1cbiAgYWxsKHBsYWNlaG9sZGVyVmFsdWVzKSB7XG4gICAgY29uc3QgeyBmaWVsZHMsIHF1ZXJ5LCBsb2dnZXIsIGpvaW5zTm90TnVsbGFibGVNYXAsIHN0bXQsIGN1c3RvbVJlc3VsdE1hcHBlciB9ID0gdGhpcztcbiAgICBpZiAoIWZpZWxkcyAmJiAhY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBmaWxsUGxhY2Vob2xkZXJzKHF1ZXJ5LnBhcmFtcywgcGxhY2Vob2xkZXJWYWx1ZXMgPz8ge30pO1xuICAgICAgbG9nZ2VyLmxvZ1F1ZXJ5KHF1ZXJ5LnNxbCwgcGFyYW1zKTtcbiAgICAgIHJldHVybiBzdG10LmFsbCguLi5wYXJhbXMpO1xuICAgIH1cbiAgICBjb25zdCByb3dzID0gdGhpcy52YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICAgIGlmIChjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICAgIHJldHVybiBjdXN0b21SZXN1bHRNYXBwZXIocm93cyk7XG4gICAgfVxuICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiBtYXBSZXN1bHRSb3coZmllbGRzLCByb3csIGpvaW5zTm90TnVsbGFibGVNYXApKTtcbiAgfVxuICBnZXQocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBmaWxsUGxhY2Vob2xkZXJzKHRoaXMucXVlcnkucGFyYW1zLCBwbGFjZWhvbGRlclZhbHVlcyA/PyB7fSk7XG4gICAgdGhpcy5sb2dnZXIubG9nUXVlcnkodGhpcy5xdWVyeS5zcWwsIHBhcmFtcyk7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5zdG10LnZhbHVlcyguLi5wYXJhbXMpWzBdO1xuICAgIGlmICghcm93KSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBjb25zdCB7IGZpZWxkcywgam9pbnNOb3ROdWxsYWJsZU1hcCwgY3VzdG9tUmVzdWx0TWFwcGVyIH0gPSB0aGlzO1xuICAgIGlmICghZmllbGRzICYmICFjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICAgIHJldHVybiByb3c7XG4gICAgfVxuICAgIGlmIChjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICAgIHJldHVybiBjdXN0b21SZXN1bHRNYXBwZXIoW3Jvd10pO1xuICAgIH1cbiAgICByZXR1cm4gbWFwUmVzdWx0Um93KGZpZWxkcywgcm93LCBqb2luc05vdE51bGxhYmxlTWFwKTtcbiAgfVxuICB2YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBmaWxsUGxhY2Vob2xkZXJzKHRoaXMucXVlcnkucGFyYW1zLCBwbGFjZWhvbGRlclZhbHVlcyA/PyB7fSk7XG4gICAgdGhpcy5sb2dnZXIubG9nUXVlcnkodGhpcy5xdWVyeS5zcWwsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMuc3RtdC52YWx1ZXMoLi4ucGFyYW1zKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGlzUmVzcG9uc2VJbkFycmF5TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZXNwb25zZUluQXJyYXlNb2RlO1xuICB9XG59XG5leHBvcnQge1xuICBQcmVwYXJlZFF1ZXJ5LFxuICBTUUxpdGVCdW5TZXNzaW9uLFxuICBTUUxpdGVCdW5UcmFuc2FjdGlvblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlc3Npb24uanMubWFwIiwKICAgICJpbXBvcnQgeyBjaGFyYWN0ZXJzLCBtaW5pbmdGbGVldFBhcnRpY2lwYW50cywgbWluaW5nRmxlZXRzLCByZXN1bWVDb21tYW5kcywgc2NoZW1hX2V4cG9ydHMsIHVzZXJzIH0gZnJvbSBcIi4vc2NoZW1hLmpzXCI7XG5pbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIgfSBmcm9tIFwiLi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBVc2VySGVscGVyIH0gZnJvbSBcIi4vbW9kZWxzL3VzZXIubW9kZWwuanNcIjtcbmltcG9ydCB7IFJlc3VtZUNvbW1hbmQgfSBmcm9tIFwiLi9tb2RlbHMvcmVzdW1lLWNvbW1hbmQubW9kZWwuanNcIjtcbmltcG9ydCB7IG1vZGVsc19leHBvcnRzIH0gZnJvbSBcIi4vbW9kZWxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBkcml6emxlIH0gZnJvbSBcImRyaXp6bGUtb3JtL2J1bi1zcWxpdGVcIjtcbmltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSBcImJ1bjpzcWxpdGVcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvaW5kZXgudHNcbmNvbnN0IERCX1BBVEggPSBwcm9jZXNzLmVudi5BVVRIX0RCX1BBVEggfHwgam9pbihwcm9jZXNzLmN3ZCgpLCBcIi4uLy4uL2RiL2tpdHRlbi5kYlwiKTtcbmNvbnNvbGUubG9nKFwiVXNpbmcgREJfUEFUSDpcIiwgREJfUEFUSCk7XG5jb25zdCBzcWxpdGUgPSBuZXcgRGF0YWJhc2UoREJfUEFUSCk7XG5jb25zdCBkYiA9IGRyaXp6bGUoc3FsaXRlLCB7IHNjaGVtYToge1xuXHR1c2Vycyxcblx0Y2hhcmFjdGVycyxcblx0cmVzdW1lQ29tbWFuZHMsXG5cdG1pbmluZ0ZsZWV0cyxcblx0bWluaW5nRmxlZXRQYXJ0aWNpcGFudHNcbn0gfSk7XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgQ2hhcmFjdGVySGVscGVyLCBEQl9QQVRILCBSZXN1bWVDb21tYW5kLCBVc2VySGVscGVyLCBkYiwgbW9kZWxzX2V4cG9ydHMgYXMgbW9kZWxzLCBzY2hlbWFfZXhwb3J0cyBhcyBzY2hlbWEgfTsiLAogICAgImltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gXCJqd3QtZGVjb2RlXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL3Njb3Blcy50c1xuY29uc3QgRVZFX0pXS1NfVVJMID0gXCJodHRwczovL2xvZ2luLmV2ZW9ubGluZS5jb20vb2F1dGgvandrc1wiO1xuY29uc3QgRVZFX0lTU1VFUiA9IFwibG9naW4uZXZlb25saW5lLmNvbVwiO1xuY29uc3QgRVZFX0FVRElFTkNFID0gXCJldmVvbmxpbmVcIjtcbmNvbnN0IEVTSV9MQVRFU1RfVVJMID0gXCJodHRwczovL2VzaS5ldmV0ZWNoLm5ldC9sYXRlc3RcIjtcbmNvbnN0IERBVEFfU09VUkNFID0gXCJ0cmFucXVpbGl0eVwiO1xuZnVuY3Rpb24gam9pblNjb3BlcyguLi5zY29wZXMpIHtcblx0cmV0dXJuIHNjb3Blcy5qb2luKFwiIFwiKTtcbn1cbmxldCBTQ09QRVMgPSAvKiBAX19QVVJFX18gKi8gZnVuY3Rpb24oU0NPUEVTJDEpIHtcblx0U0NPUEVTJDFbXCJQVUJMSUNfREFUQVwiXSA9IFwicHVibGljRGF0YVwiO1xuXHRTQ09QRVMkMVtcIkNBTEVOREFSX1JFU1BPTkRfQ0FMRU5EQVJfRVZFTlRTXCJdID0gXCJlc2ktY2FsZW5kYXIucmVzcG9uZF9jYWxlbmRhcl9ldmVudHMudjFcIjtcblx0U0NPUEVTJDFbXCJDQUxFTkRBUl9SRUFEX0NBTEVOREFSX0VWRU5UU1wiXSA9IFwiZXNpLWNhbGVuZGFyLnJlYWRfY2FsZW5kYXJfZXZlbnRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiTE9DQVRJT05fUkVBRF9MT0NBVElPTlwiXSA9IFwiZXNpLWxvY2F0aW9uLnJlYWRfbG9jYXRpb24udjFcIjtcblx0U0NPUEVTJDFbXCJMT0NBVElPTl9SRUFEX1NISVBfVFlQRVwiXSA9IFwiZXNpLWxvY2F0aW9uLnJlYWRfc2hpcF90eXBlLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFJTF9PUkdBTklaRV9NQUlMXCJdID0gXCJlc2ktbWFpbC5vcmdhbml6ZV9tYWlsLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFJTF9SRUFEX01BSUxcIl0gPSBcImVzaS1tYWlsLnJlYWRfbWFpbC52MVwiO1xuXHRTQ09QRVMkMVtcIk1BSUxfU0VORF9NQUlMXCJdID0gXCJlc2ktbWFpbC5zZW5kX21haWwudjFcIjtcblx0U0NPUEVTJDFbXCJTS0lMTFNfUkVBRF9TS0lMTFNcIl0gPSBcImVzaS1za2lsbHMucmVhZF9za2lsbHMudjFcIjtcblx0U0NPUEVTJDFbXCJTS0lMTFNfUkVBRF9TS0lMTFFVRVVFXCJdID0gXCJlc2ktc2tpbGxzLnJlYWRfc2tpbGxxdWV1ZS52MVwiO1xuXHRTQ09QRVMkMVtcIldBTExFVF9SRUFEX0NIQVJBQ1RFUl9XQUxMRVRcIl0gPSBcImVzaS13YWxsZXQucmVhZF9jaGFyYWN0ZXJfd2FsbGV0LnYxXCI7XG5cdFNDT1BFUyQxW1wiV0FMTEVUX1JFQURfQ09SUE9SQVRJT05fV0FMTEVUXCJdID0gXCJlc2ktd2FsbGV0LnJlYWRfY29ycG9yYXRpb25fd2FsbGV0LnYxXCI7XG5cdFNDT1BFUyQxW1wiU0VBUkNIX1NFQVJDSF9TVFJVQ1RVUkVTXCJdID0gXCJlc2ktc2VhcmNoLnNlYXJjaF9zdHJ1Y3R1cmVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0xPTkVTX1JFQURfQ0xPTkVTXCJdID0gXCJlc2ktY2xvbmVzLnJlYWRfY2xvbmVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0NPTlRBQ1RTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2NvbnRhY3RzLnYxXCI7XG5cdFNDT1BFUyQxW1wiVU5JVkVSU0VfUkVBRF9TVFJVQ1RVUkVTXCJdID0gXCJlc2ktdW5pdmVyc2UucmVhZF9zdHJ1Y3R1cmVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiS0lMTE1BSUxTX1JFQURfS0lMTE1BSUxTXCJdID0gXCJlc2kta2lsbG1haWxzLnJlYWRfa2lsbG1haWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfQ09SUE9SQVRJT05fTUVNQkVSU0hJUFwiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX2NvcnBvcmF0aW9uX21lbWJlcnNoaXAudjFcIjtcblx0U0NPUEVTJDFbXCJBU1NFVFNfUkVBRF9BU1NFVFNcIl0gPSBcImVzaS1hc3NldHMucmVhZF9hc3NldHMudjFcIjtcblx0U0NPUEVTJDFbXCJQTEFORVRTX01BTkFHRV9QTEFORVRTXCJdID0gXCJlc2ktcGxhbmV0cy5tYW5hZ2VfcGxhbmV0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkZMRUVUU19SRUFEX0ZMRUVUXCJdID0gXCJlc2ktZmxlZXRzLnJlYWRfZmxlZXQudjFcIjtcblx0U0NPUEVTJDFbXCJGTEVFVFNfV1JJVEVfRkxFRVRcIl0gPSBcImVzaS1mbGVldHMud3JpdGVfZmxlZXQudjFcIjtcblx0U0NPUEVTJDFbXCJVSV9PUEVOX1dJTkRPV1wiXSA9IFwiZXNpLXVpLm9wZW5fd2luZG93LnYxXCI7XG5cdFNDT1BFUyQxW1wiVUlfV1JJVEVfV0FZUE9JTlRcIl0gPSBcImVzaS11aS53cml0ZV93YXlwb2ludC52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfV1JJVEVfQ09OVEFDVFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLndyaXRlX2NvbnRhY3RzLnYxXCI7XG5cdFNDT1BFUyQxW1wiRklUVElOR1NfUkVBRF9GSVRUSU5HU1wiXSA9IFwiZXNpLWZpdHRpbmdzLnJlYWRfZml0dGluZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJGSVRUSU5HU19XUklURV9GSVRUSU5HU1wiXSA9IFwiZXNpLWZpdHRpbmdzLndyaXRlX2ZpdHRpbmdzLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFSS0VUU19TVFJVQ1RVUkVfTUFSS0VUU1wiXSA9IFwiZXNpLW1hcmtldHMuc3RydWN0dXJlX21hcmtldHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9TVFJVQ1RVUkVTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfc3RydWN0dXJlcy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9MT1lBTFRZXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2xveWFsdHkudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfT1BQT1JUVU5JVElFU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9vcHBvcnR1bml0aWVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0NIQVRfQ0hBTk5FTFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfY2hhdF9jaGFubmVscy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9NRURBTFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbWVkYWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX1NUQU5ESU5HU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9zdGFuZGluZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfQUdFTlRTX1JFU0VBUkNIXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2FnZW50c19yZXNlYXJjaC52MVwiO1xuXHRTQ09QRVMkMVtcIklORFVTVFJZX1JFQURfQ0hBUkFDVEVSX0pPQlNcIl0gPSBcImVzaS1pbmR1c3RyeS5yZWFkX2NoYXJhY3Rlcl9qb2JzLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFSS0VUU19SRUFEX0NIQVJBQ1RFUl9PUkRFUlNcIl0gPSBcImVzaS1tYXJrZXRzLnJlYWRfY2hhcmFjdGVyX29yZGVycy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9CTFVFUFJJTlRTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2JsdWVwcmludHMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfQ09SUE9SQVRJT05fUk9MRVNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfY29ycG9yYXRpb25fcm9sZXMudjFcIjtcblx0U0NPUEVTJDFbXCJMT0NBVElPTl9SRUFEX09OTElORVwiXSA9IFwiZXNpLWxvY2F0aW9uLnJlYWRfb25saW5lLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09OVFJBQ1RTX1JFQURfQ0hBUkFDVEVSX0NPTlRSQUNUU1wiXSA9IFwiZXNpLWNvbnRyYWN0cy5yZWFkX2NoYXJhY3Rlcl9jb250cmFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJDTE9ORVNfUkVBRF9JTVBMQU5UU1wiXSA9IFwiZXNpLWNsb25lcy5yZWFkX2ltcGxhbnRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0ZBVElHVUVcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfZmF0aWd1ZS52MVwiO1xuXHRTQ09QRVMkMVtcIktJTExNQUlMU19SRUFEX0NPUlBPUkFUSU9OX0tJTExNQUlMU1wiXSA9IFwiZXNpLWtpbGxtYWlscy5yZWFkX2NvcnBvcmF0aW9uX2tpbGxtYWlscy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19UUkFDS19NRU1CRVJTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnRyYWNrX21lbWJlcnMudjFcIjtcblx0U0NPUEVTJDFbXCJXQUxMRVRfUkVBRF9DT1JQT1JBVElPTl9XQUxMRVRTXCJdID0gXCJlc2ktd2FsbGV0LnJlYWRfY29ycG9yYXRpb25fd2FsbGV0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9OT1RJRklDQVRJT05TXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX25vdGlmaWNhdGlvbnMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9ESVZJU0lPTlNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9kaXZpc2lvbnMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9DT05UQUNUU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX2NvbnRhY3RzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQVNTRVRTX1JFQURfQ09SUE9SQVRJT05fQVNTRVRTXCJdID0gXCJlc2ktYXNzZXRzLnJlYWRfY29ycG9yYXRpb25fYXNzZXRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfVElUTEVTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfdGl0bGVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfQkxVRVBSSU5UU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX2JsdWVwcmludHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT05UUkFDVFNfUkVBRF9DT1JQT1JBVElPTl9DT05UUkFDVFNcIl0gPSBcImVzaS1jb250cmFjdHMucmVhZF9jb3Jwb3JhdGlvbl9jb250cmFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9TVEFORElOR1NcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9zdGFuZGluZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9TVEFSQkFTRVNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9zdGFyYmFzZXMudjFcIjtcblx0U0NPUEVTJDFbXCJJTkRVU1RSWV9SRUFEX0NPUlBPUkFUSU9OX0pPQlNcIl0gPSBcImVzaS1pbmR1c3RyeS5yZWFkX2NvcnBvcmF0aW9uX2pvYnMudjFcIjtcblx0U0NPUEVTJDFbXCJNQVJLRVRTX1JFQURfQ09SUE9SQVRJT05fT1JERVJTXCJdID0gXCJlc2ktbWFya2V0cy5yZWFkX2NvcnBvcmF0aW9uX29yZGVycy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0NPTlRBSU5FUl9MT0dTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfY29udGFpbmVyX2xvZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJJTkRVU1RSWV9SRUFEX0NIQVJBQ1RFUl9NSU5JTkdcIl0gPSBcImVzaS1pbmR1c3RyeS5yZWFkX2NoYXJhY3Rlcl9taW5pbmcudjFcIjtcblx0U0NPUEVTJDFbXCJJTkRVU1RSWV9SRUFEX0NPUlBPUkFUSU9OX01JTklOR1wiXSA9IFwiZXNpLWluZHVzdHJ5LnJlYWRfY29ycG9yYXRpb25fbWluaW5nLnYxXCI7XG5cdFNDT1BFUyQxW1wiUExBTkVUU19SRUFEX0NVU1RPTVNfT0ZGSUNFU1wiXSA9IFwiZXNpLXBsYW5ldHMucmVhZF9jdXN0b21zX29mZmljZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9GQUNJTElUSUVTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfZmFjaWxpdGllcy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX01FREFMU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX21lZGFscy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9USVRMRVNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfdGl0bGVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQUxMSUFOQ0VTX1JFQURfQ09OVEFDVFNcIl0gPSBcImVzaS1hbGxpYW5jZXMucmVhZF9jb250YWN0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9GV19TVEFUU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9md19zdGF0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0ZXX1NUQVRTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfZndfc3RhdHMudjFcIjtcblx0cmV0dXJuIFNDT1BFUyQxO1xufSh7fSk7XG5mdW5jdGlvbiB0b2tlbkhhc1Njb3BlcyhhY2Nlc3NfdG9rZW4sIC4uLnNjb3Blcykge1xuXHRsZXQgdG9rZW5TY29wZXMgPSBnZXRTY29wZXNGcm9tVG9rZW4oYWNjZXNzX3Rva2VuKTtcblx0cmV0dXJuIHNjb3Blcy5ldmVyeSgoc2NvcGUpID0+IHRva2VuU2NvcGVzLmluY2x1ZGVzKHNjb3BlKSk7XG59XG5mdW5jdGlvbiBnZXRTY29wZXNGcm9tVG9rZW4oYWNjZXNzX3Rva2VuKSB7XG5cdGNvbnN0IGRlY29kZWQgPSBqd3REZWNvZGUoYWNjZXNzX3Rva2VuKTtcblx0cmV0dXJuIHR5cGVvZiBkZWNvZGVkLnNjcCA9PT0gXCJzdHJpbmdcIiA/IFtkZWNvZGVkLnNjcF0gOiBkZWNvZGVkLnNjcDtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBEQVRBX1NPVVJDRSwgRVNJX0xBVEVTVF9VUkwsIEVWRV9BVURJRU5DRSwgRVZFX0lTU1VFUiwgRVZFX0pXS1NfVVJMLCBTQ09QRVMsIGdldFNjb3Blc0Zyb21Ub2tlbiwgam9pblNjb3BlcywgdG9rZW5IYXNTY29wZXMgfTsiLAogICAgImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tIFwiLi9vcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIgfSBmcm9tIFwiLi4vZGIvbW9kZWxzL2NoYXJhY3Rlci5tb2RlbC5qc1wiO1xuaW1wb3J0IFwiLi4vZGIvbW9kZWxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBFU0lfTEFURVNUX1VSTCB9IGZyb20gXCIuL3Njb3Blcy5qc1wiO1xuXG4vLyNyZWdpb24gc3JjL2VzaS9mZXRjaC50c1xuY29uc3QgY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuZnVuY3Rpb24gY2xlYW5DYWNoZSgpIHtcblx0Y29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgY2FjaGUpIGlmICh2YWx1ZS5leHBpcmVzIDwgbm93KSBjYWNoZS5kZWxldGUoa2V5KTtcbn1cbnNldEludGVydmFsKGNsZWFuQ2FjaGUsIDFlMyAqIDYwICogMTUpO1xuY29uc3QgZGVmYXVsdENhY2hlRHVyYXRpb24gPSAxZTMgKiA2MCAqIDMwO1xuYXN5bmMgZnVuY3Rpb24gZXNpRmV0Y2gocGF0aCwgY2hhcmFjdGVyLCB7IG1ldGhvZCA9IFwiR0VUXCIsIGJvZHksIG5vQ2FjaGUgPSBmYWxzZSwgY2FjaGVEdXJhdGlvbiA9IGRlZmF1bHRDYWNoZUR1cmF0aW9uIH0gPSB7fSkge1xuXHR0cnkge1xuXHRcdGNvbnN0IGhlYWRlcnMgPSB7XG5cdFx0XHRcIlVzZXItQWdlbnRcIjogb3B0aW9ucy51c2VyX2FnZW50LFxuXHRcdFx0XCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcblx0XHR9O1xuXHRcdGlmIChjaGFyYWN0ZXIpIHtcblx0XHRcdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1ZhbGlkVG9rZW4oY2hhcmFjdGVyKSkge1xuXHRcdFx0XHRhd2FpdCBDaGFyYWN0ZXJIZWxwZXIucmVmcmVzaFRva2VucyhjaGFyYWN0ZXIpO1xuXHRcdFx0XHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNWYWxpZFRva2VuKGNoYXJhY3RlcikpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggdG9rZW4gZm9yIGNoYXJhY3RlcjogJHtjaGFyYWN0ZXIuZXZlSUR9YCk7XG5cdFx0XHR9XG5cdFx0XHRoZWFkZXJzW1wiQXV0aG9yaXphdGlvblwiXSA9IGBCZWFyZXIgJHtjaGFyYWN0ZXIuYWNjZXNzVG9rZW59YDtcblx0XHR9XG5cdFx0Y29uc3QgaW5pdCA9IHtcblx0XHRcdGhlYWRlcnMsXG5cdFx0XHRtZXRob2Q6IG1ldGhvZCB8fCBcIkdFVFwiLFxuXHRcdFx0Ym9keTogYm9keSB8fCB2b2lkIDBcblx0XHR9O1xuXHRcdGNvbnN0IHVybCA9IG5ldyBVUkwoYCR7RVNJX0xBVEVTVF9VUkx9JHtwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IFwiL1wiICsgcGF0aH1gKTtcblx0XHR1cmwuc2VhcmNoUGFyYW1zLnNldChcImRhdGFzb3VyY2VcIiwgXCJ0cmFucXVpbGl0eVwiKTtcblx0XHRpZiAoIW5vQ2FjaGUgJiYgaW5pdC5tZXRob2QgPT09IFwiR0VUXCIpIHtcblx0XHRcdGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldCh1cmwuaHJlZik7XG5cdFx0XHRpZiAoY2FjaGVkICYmIGNhY2hlZD8uZXhwaXJlcyA+IERhdGUubm93KCkpIHJldHVybiBjYWNoZWQuZGF0YTtcblx0XHR9XG5cdFx0Y29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCBpbml0KTtcblx0XHRjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblx0XHRpZiAoIXJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgRVNJIHJlcXVlc3QgZmFpbHVyZSBhdCAke3BhdGh9IHwgJHtyZXMuc3RhdHVzfToke3Jlcy5zdGF0dXNUZXh0fSA9PiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWApO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGlmIChpbml0Lm1ldGhvZCA9PT0gXCJHRVRcIikgY2FjaGUuc2V0KHVybC5ocmVmLCB7XG5cdFx0XHRleHBpcmVzOiBNYXRoLm1heChyZXMuaGVhZGVycy5nZXQoXCJleHBpcmVzXCIpICYmIG5ldyBEYXRlKE51bWJlcihyZXMuaGVhZGVycy5nZXQoXCJleHBpcmVzXCIpIHx8IFwiXCIpKS5nZXRUaW1lKCkgfHwgMCwgRGF0ZS5ub3coKSArIGNhY2hlRHVyYXRpb24pLFxuXHRcdFx0ZGF0YVxuXHRcdH0pO1xuXHRcdHJldHVybiBkYXRhO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRjb25zb2xlLmVycm9yKGBFU0kgcmVxdWVzdCBmYWlsdXJlIGF0ICR7cGF0aH0gfCAke0pTT04uc3RyaW5naWZ5KGVycil9YCwgZXJyKTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGVzaUZldGNoIH07IiwKICAgICJpbXBvcnQgeyBfX2V4cG9ydCB9IGZyb20gXCIuLi9fdmlydHVhbC9yb2xsZG93bl9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIgfSBmcm9tIFwiLi4vZGIvbW9kZWxzL2NoYXJhY3Rlci5tb2RlbC5qc1wiO1xuaW1wb3J0IFwiLi4vZGIvaW5kZXguanNcIjtcbmltcG9ydCBcIi4vc2NvcGVzLmpzXCI7XG5pbXBvcnQgeyBlc2lGZXRjaCB9IGZyb20gXCIuL2ZldGNoLmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL2NoYXJhY3Rlci50c1xudmFyIGNoYXJhY3Rlcl9leHBvcnRzID0ge307XG5fX2V4cG9ydChjaGFyYWN0ZXJfZXhwb3J0cywge1xuXHRnZXRDaGFyYWN0ZXJBZmZpbGlhdGlvbnM6ICgpID0+IGdldENoYXJhY3RlckFmZmlsaWF0aW9ucyxcblx0Z2V0Q2hhcmFjdGVyQWdlbnRSZXNlYXJjaDogKCkgPT4gZ2V0Q2hhcmFjdGVyQWdlbnRSZXNlYXJjaCxcblx0Z2V0Q2hhcmFjdGVyQXNzZXRMb2NhdGlvbnM6ICgpID0+IGdldENoYXJhY3RlckFzc2V0TG9jYXRpb25zLFxuXHRnZXRDaGFyYWN0ZXJBc3NldE5hbWVzOiAoKSA9PiBnZXRDaGFyYWN0ZXJBc3NldE5hbWVzLFxuXHRnZXRDaGFyYWN0ZXJBc3NldHM6ICgpID0+IGdldENoYXJhY3RlckFzc2V0cyxcblx0Z2V0Q2hhcmFjdGVyQmx1ZXByaW50czogKCkgPT4gZ2V0Q2hhcmFjdGVyQmx1ZXByaW50cyxcblx0Z2V0Q2hhcmFjdGVyQ2xvbmVzOiAoKSA9PiBnZXRDaGFyYWN0ZXJDbG9uZXMsXG5cdGdldENoYXJhY3RlckNvbnRhY3ROb3RpZmljYXRpb25zOiAoKSA9PiBnZXRDaGFyYWN0ZXJDb250YWN0Tm90aWZpY2F0aW9ucyxcblx0Z2V0Q2hhcmFjdGVyQ29ycG9yYXRpb25IaXN0b3J5OiAoKSA9PiBnZXRDaGFyYWN0ZXJDb3Jwb3JhdGlvbkhpc3RvcnksXG5cdGdldENoYXJhY3RlckN1cnJlbnRTaGlwOiAoKSA9PiBnZXRDaGFyYWN0ZXJDdXJyZW50U2hpcCxcblx0Z2V0Q2hhcmFjdGVySW1wbGFudHM6ICgpID0+IGdldENoYXJhY3RlckltcGxhbnRzLFxuXHRnZXRDaGFyYWN0ZXJKdW1wRmF0aWd1ZTogKCkgPT4gZ2V0Q2hhcmFjdGVySnVtcEZhdGlndWUsXG5cdGdldENoYXJhY3RlckxvY2F0aW9uOiAoKSA9PiBnZXRDaGFyYWN0ZXJMb2NhdGlvbixcblx0Z2V0Q2hhcmFjdGVyTWVkYWxzOiAoKSA9PiBnZXRDaGFyYWN0ZXJNZWRhbHMsXG5cdGdldENoYXJhY3Rlck5vdGlmaWNhdGlvbnM6ICgpID0+IGdldENoYXJhY3Rlck5vdGlmaWNhdGlvbnMsXG5cdGdldENoYXJhY3Rlck9ubGluZTogKCkgPT4gZ2V0Q2hhcmFjdGVyT25saW5lLFxuXHRnZXRDaGFyYWN0ZXJQb3J0cmFpdHM6ICgpID0+IGdldENoYXJhY3RlclBvcnRyYWl0cyxcblx0Z2V0Q2hhcmFjdGVyUHVibGljRGF0YTogKCkgPT4gZ2V0Q2hhcmFjdGVyUHVibGljRGF0YSxcblx0Z2V0Q2hhcmFjdGVyUm9sZXM6ICgpID0+IGdldENoYXJhY3RlclJvbGVzLFxuXHRnZXRDaGFyYWN0ZXJTdGFuZGluZ3M6ICgpID0+IGdldENoYXJhY3RlclN0YW5kaW5ncyxcblx0Z2V0Q2hhcmFjdGVyVGl0bGVzOiAoKSA9PiBnZXRDaGFyYWN0ZXJUaXRsZXMsXG5cdGdldENoYXJhY3RlcldhbGxldDogKCkgPT4gZ2V0Q2hhcmFjdGVyV2FsbGV0LFxuXHRnZXRDaGFyYWN0ZXJXYWxsZXRKb3VybmFsOiAoKSA9PiBnZXRDaGFyYWN0ZXJXYWxsZXRKb3VybmFsLFxuXHRnZXRDaGFyYWN0ZXJXYWxsZXRUcmFuc2FjdGlvbnM6ICgpID0+IGdldENoYXJhY3RlcldhbGxldFRyYW5zYWN0aW9ucyxcblx0Z2V0UG9ydHJhaXRVUkw6ICgpID0+IGdldFBvcnRyYWl0VVJMXG59KTtcbmZ1bmN0aW9uIGdldENoYXJhY3RlclB1YmxpY0RhdGEoaWQpIHtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2lkfS9gKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckFmZmlsaWF0aW9ucyhpZHMpIHtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy9hZmZpbGlhdGlvbi9gLCB2b2lkIDAsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KGlkcylcblx0fSlbMF07XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJQb3J0cmFpdHMoaWQpIHtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2lkfS9wb3J0cmFpdC9gKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckNvcnBvcmF0aW9uSGlzdG9yeShpZCkge1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7aWR9L2NvcnBvcmF0aW9uaGlzdG9yeS9gKTtcbn1cbmZ1bmN0aW9uIGdldFBvcnRyYWl0VVJMKGlkKSB7XG5cdHJldHVybiBgaHR0cHM6Ly9pbWFnZXMuZXZldGVjaC5uZXQvY2hhcmFjdGVycy8ke2lkfS9wb3J0cmFpdGA7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJSb2xlcyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfY29ycG9yYXRpb25fcm9sZXMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9yb2xlcy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyVGl0bGVzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF90aXRsZXMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS90aXRsZXMvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlclN0YW5kaW5ncyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfc3RhbmRpbmdzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vc3RhbmRpbmdzL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJOb3RpZmljYXRpb25zKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9ub3RpZmljYXRpb25zLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vbm90aWZpY2F0aW9ucy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQ29udGFjdE5vdGlmaWNhdGlvbnMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX25vdGlmaWNhdGlvbnMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9ub3RpZmljYXRpb25zL2NvbnRhY3RzYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3Rlck1lZGFscyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbWVkYWxzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vbWVkYWxzL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJKdW1wRmF0aWd1ZShjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfZmF0aWd1ZS52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2ZhdGlndWUvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckJsdWVwcmludHMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX2JsdWVwcmludHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9ibHVlcHJpbnRzL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJBZ2VudFJlc2VhcmNoKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9hZ2VudHNfcmVzZWFyY2gudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9hZ2VudHNfcmVzZWFyY2gvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckNsb25lcyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jbG9uZXMucmVhZF9jbG9uZXMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9jbG9uZXMvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckltcGxhbnRzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNsb25lcy5yZWFkX2ltcGxhbnRzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vaW1wbGFudHMvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckFzc2V0cyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9hc3NldHMvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckFzc2V0TG9jYXRpb25zKGNoYXJhY3RlciwgaWRzKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktYXNzZXRzLnJlYWRfYXNzZXRzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vYXNzZXRzL2xvY2F0aW9ucy9gLCBjaGFyYWN0ZXIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KGlkcylcblx0fSk7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJBc3NldE5hbWVzKGNoYXJhY3RlciwgaWRzKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktYXNzZXRzLnJlYWRfYXNzZXRzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vYXNzZXRzL25hbWVzL2AsIGNoYXJhY3Rlciwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoaWRzKVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlcldhbGxldChjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS13YWxsZXQucmVhZF9jaGFyYWN0ZXJfd2FsbGV0LnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vd2FsbGV0L2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJXYWxsZXRUcmFuc2FjdGlvbnMoY2hhcmFjdGVyLCBmcm9tSWQpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS13YWxsZXQucmVhZF9jaGFyYWN0ZXJfd2FsbGV0LnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vd2FsbGV0L3RyYW5zYWN0aW9ucy9gLCBjaGFyYWN0ZXIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KGZyb21JZClcblx0fSk7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJXYWxsZXRKb3VybmFsKGNoYXJhY3RlciwgcGFnZSA9IDEpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS13YWxsZXQucmVhZF9jaGFyYWN0ZXJfd2FsbGV0LnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vd2FsbGV0L2pvdXJuYWwvP3BhZ2U9JHtwYWdlfWAsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJMb2NhdGlvbihjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1sb2NhdGlvbi5yZWFkX2xvY2F0aW9uLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vbG9jYXRpb24vYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3Rlck9ubGluZShjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1sb2NhdGlvbi5yZWFkX29ubGluZS52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L29ubGluZS9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQ3VycmVudFNoaXAoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktbG9jYXRpb24ucmVhZF9zaGlwX3R5cGUudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9zaGlwL2AsIGNoYXJhY3Rlcik7XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgY2hhcmFjdGVyX2V4cG9ydHMsIGdldENoYXJhY3RlckFmZmlsaWF0aW9ucywgZ2V0Q2hhcmFjdGVyQWdlbnRSZXNlYXJjaCwgZ2V0Q2hhcmFjdGVyQXNzZXRMb2NhdGlvbnMsIGdldENoYXJhY3RlckFzc2V0TmFtZXMsIGdldENoYXJhY3RlckFzc2V0cywgZ2V0Q2hhcmFjdGVyQmx1ZXByaW50cywgZ2V0Q2hhcmFjdGVyQ2xvbmVzLCBnZXRDaGFyYWN0ZXJDb250YWN0Tm90aWZpY2F0aW9ucywgZ2V0Q2hhcmFjdGVyQ29ycG9yYXRpb25IaXN0b3J5LCBnZXRDaGFyYWN0ZXJDdXJyZW50U2hpcCwgZ2V0Q2hhcmFjdGVySW1wbGFudHMsIGdldENoYXJhY3Rlckp1bXBGYXRpZ3VlLCBnZXRDaGFyYWN0ZXJMb2NhdGlvbiwgZ2V0Q2hhcmFjdGVyTWVkYWxzLCBnZXRDaGFyYWN0ZXJOb3RpZmljYXRpb25zLCBnZXRDaGFyYWN0ZXJPbmxpbmUsIGdldENoYXJhY3RlclBvcnRyYWl0cywgZ2V0Q2hhcmFjdGVyUHVibGljRGF0YSwgZ2V0Q2hhcmFjdGVyUm9sZXMsIGdldENoYXJhY3RlclN0YW5kaW5ncywgZ2V0Q2hhcmFjdGVyVGl0bGVzLCBnZXRDaGFyYWN0ZXJXYWxsZXQsIGdldENoYXJhY3RlcldhbGxldEpvdXJuYWwsIGdldENoYXJhY3RlcldhbGxldFRyYW5zYWN0aW9ucywgZ2V0UG9ydHJhaXRVUkwgfTsiLAogICAgImltcG9ydCB7IF9fZXhwb3J0IH0gZnJvbSBcIi4uL192aXJ0dWFsL3JvbGxkb3duX3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuLi9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgXCIuLi9kYi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZXNpRmV0Y2ggfSBmcm9tIFwiLi9mZXRjaC5qc1wiO1xuXG4vLyNyZWdpb24gc3JjL2VzaS9jb3Jwb3JhdGlvbi50c1xudmFyIGNvcnBvcmF0aW9uX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGNvcnBvcmF0aW9uX2V4cG9ydHMsIHtcblx0Z2V0Q29ycG9yYXRpb25BbGxpYW5jZUhpc3Rvcnk6ICgpID0+IGdldENvcnBvcmF0aW9uQWxsaWFuY2VIaXN0b3J5LFxuXHRnZXRDb3Jwb3JhdGlvbkFzc2V0TG9jYXRpb25zOiAoKSA9PiBnZXRDb3Jwb3JhdGlvbkFzc2V0TG9jYXRpb25zLFxuXHRnZXRDb3Jwb3JhdGlvbkFzc2V0TmFtZXM6ICgpID0+IGdldENvcnBvcmF0aW9uQXNzZXROYW1lcyxcblx0Z2V0Q29ycG9yYXRpb25Bc3NldHM6ICgpID0+IGdldENvcnBvcmF0aW9uQXNzZXRzLFxuXHRnZXRDb3Jwb3JhdGlvbkRhdGE6ICgpID0+IGdldENvcnBvcmF0aW9uRGF0YSxcblx0Z2V0Q29ycG9yYXRpb25JY29uczogKCkgPT4gZ2V0Q29ycG9yYXRpb25JY29uc1xufSk7XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkRhdGEoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvY29ycG9yYXRpb25zLyR7aWR9L2ApO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ycG9yYXRpb25BbGxpYW5jZUhpc3RvcnkoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvY29ycG9yYXRpb25zLyR7aWR9L2FsbGlhbmNlaGlzdG9yeS9gKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldENvcnBvcmF0aW9uSWNvbnMoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvY29ycG9yYXRpb25zLyR7aWR9L2ljb25zL2ApO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ycG9yYXRpb25Bc3NldHMoaWQsIGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWFzc2V0cy5yZWFkX2NvcnBvcmF0aW9uX2Fzc2V0cy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBhd2FpdCBlc2lGZXRjaChgL2NvcnBvcmF0aW9ucy8ke2lkfS9hc3NldHMvYCwgY2hhcmFjdGVyKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldENvcnBvcmF0aW9uQXNzZXRMb2NhdGlvbnMoaWQsIGNoYXJhY3RlciwgaWRzKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktYXNzZXRzLnJlYWRfY29ycG9yYXRpb25fYXNzZXRzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvY29ycG9yYXRpb25zLyR7aWR9L2Fzc2V0cy9sb2NhdGlvbnMvYCwgY2hhcmFjdGVyLCB7XG5cdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRib2R5OiBKU09OLnN0cmluZ2lmeShpZHMpXG5cdH0pO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ycG9yYXRpb25Bc3NldE5hbWVzKGlkLCBjaGFyYWN0ZXIsIGlkcykge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWFzc2V0cy5yZWFkX2NvcnBvcmF0aW9uX2Fzc2V0cy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBhd2FpdCBlc2lGZXRjaChgL2NvcnBvcmF0aW9ucy8ke2lkfS9hc3NldHMvbmFtZXMvYCwgY2hhcmFjdGVyLCB7XG5cdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRib2R5OiBKU09OLnN0cmluZ2lmeShpZHMpXG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGNvcnBvcmF0aW9uX2V4cG9ydHMgfTsiLAogICAgImltcG9ydCB7IF9fZXhwb3J0IH0gZnJvbSBcIi4uL192aXJ0dWFsL3JvbGxkb3duX3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IGVzaUZldGNoIH0gZnJvbSBcIi4vZmV0Y2guanNcIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvYWxsaWFuY2UudHNcbnZhciBhbGxpYW5jZV9leHBvcnRzID0ge307XG5fX2V4cG9ydChhbGxpYW5jZV9leHBvcnRzLCB7XG5cdGdldEFsbGlhbmNlQ29ycG9yYXRpb25zOiAoKSA9PiBnZXRBbGxpYW5jZUNvcnBvcmF0aW9ucyxcblx0Z2V0QWxsaWFuY2VEYXRhOiAoKSA9PiBnZXRBbGxpYW5jZURhdGEsXG5cdGdldEFsbGlhbmNlSWNvbnM6ICgpID0+IGdldEFsbGlhbmNlSWNvbnNcbn0pO1xuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsaWFuY2VEYXRhKGlkKSB7XG5cdHJldHVybiBhd2FpdCBlc2lGZXRjaChgL2FsbGlhbmNlcy8ke2lkfS9gKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbGlhbmNlQ29ycG9yYXRpb25zKGlkKSB7XG5cdHJldHVybiBhd2FpdCBlc2lGZXRjaChgL2FsbGlhbmNlcy8ke2lkfS9jb3Jwb3JhdGlvbnMvYCk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRBbGxpYW5jZUljb25zKGlkKSB7XG5cdHJldHVybiBhd2FpdCBlc2lGZXRjaChgL2FsbGlhbmNlcy8ke2lkfS9pY29ucy9gKTtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBhbGxpYW5jZV9leHBvcnRzLCBnZXRBbGxpYW5jZUNvcnBvcmF0aW9ucywgZ2V0QWxsaWFuY2VEYXRhLCBnZXRBbGxpYW5jZUljb25zIH07IiwKICAgICJpbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIgfSBmcm9tIFwiLi4vZGIvbW9kZWxzL2NoYXJhY3Rlci5tb2RlbC5qc1wiO1xuaW1wb3J0IFwiLi4vZGIvbW9kZWxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBlc2lGZXRjaCB9IGZyb20gXCIuL2ZldGNoLmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL3NraWxscy50c1xuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQXR0cmlidXRlcyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1za2lsbHMucmVhZF9za2lsbHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9hdHRyaWJ1dGVzYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlclNraWxsUXVldWUoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktc2tpbGxzLnJlYWRfc2tpbGxxdWV1ZS52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3NraWxscXVldWVgLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyU2tpbGxzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXNraWxscy5yZWFkX3NraWxscy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3NraWxsc2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVUcmFpbmluZ1BlcmNlbnRhZ2UocXVldWVkU2tpbGwpIHtcblx0Y29uc3QgdHJhaW5pbmdTdGFydFBvc2l0aW9uID0gKHF1ZXVlZFNraWxsLnRyYWluaW5nX3N0YXJ0X3NwIC0gcXVldWVkU2tpbGwubGV2ZWxfc3RhcnRfc3ApIC8gcXVldWVkU2tpbGwubGV2ZWxfZW5kX3NwO1xuXHRjb25zdCB0aW1lUG9zaXRpb24gPSAoKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShxdWV1ZWRTa2lsbC5zdGFydF9kYXRlKS5nZXRUaW1lKCkpIC8gKG5ldyBEYXRlKHF1ZXVlZFNraWxsLmZpbmlzaF9kYXRlKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShxdWV1ZWRTa2lsbC5zdGFydF9kYXRlKS5nZXRUaW1lKCkpO1xuXHRyZXR1cm4gdHJhaW5pbmdTdGFydFBvc2l0aW9uICsgKDEgLSB0cmFpbmluZ1N0YXJ0UG9zaXRpb24pICogdGltZVBvc2l0aW9uO1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGNhbGN1bGF0ZVRyYWluaW5nUGVyY2VudGFnZSwgZ2V0Q2hhcmFjdGVyQXR0cmlidXRlcywgZ2V0Q2hhcmFjdGVyU2tpbGxRdWV1ZSwgZ2V0Q2hhcmFjdGVyU2tpbGxzIH07IiwKICAgICIvLyBAYnVuXG52YXIgbj1TeW1ib2wuZm9yKFwiaXNKU1hcIik7ZnVuY3Rpb24gUyhyKXtyZXR1cm4gaShudWxsLHIpfWZ1bmN0aW9uIGkocix7Y2hpbGRyZW46ZSwuLi5vfSxzKXtsZXQgYT1lO2lmKEFycmF5LmlzQXJyYXkoZSkmJiFsKGUpKWE9ZS5tYXAoKHQpPT50Py5bbl0/dDpTKHtjaGlsZHJlbjp0fSkpO3JldHVybiBPYmplY3QuYXNzaWduKFtyLHsuLi5vLGtleTpzfSxhXSx7W25dOiEwfSl9ZnVuY3Rpb24gbChyKXtyZXR1cm4gQXJyYXkuaXNBcnJheShyKSYmKChuIGluIHIpfHxtKHIpKX1mdW5jdGlvbiBtKHIpe3JldHVybiByPy5bMF09PT1cIkhUTUxcIiYmdHlwZW9mIHJbMV0/Lmh0bWw9PT1cInN0cmluZ1wifWV4cG9ydHtpIGFzIGpzeHMsaSBhcyBqc3hERVYsaSBhcyBqc3gsbSBhcyBpc0RhbmdlckhUTUwsbCBhcyBpc0FycmF3T2ZKU1hDb250ZW50LFMgYXMgRnJhZ21lbnR9O1xuIiwKICAgICJpbXBvcnQge0NoYXJhY3RlckhlbHBlcn0gZnJvbSBcIkBzdGFyLWtpdHRlbi9ldmUvZGJcIjtcbmltcG9ydCB7Q2hhcmFjdGVyQVBJfSBmcm9tIFwiQHN0YXIta2l0dGVuL2V2ZS9lc2lcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE5hdih7dXNlcn0pIHtcbiAgY29uc3QgbWFpbiA9IHVzZXIubWFpbkNoYXJhY3RlcklEICYmIENoYXJhY3RlckhlbHBlci5maW5kKHVzZXIubWFpbkNoYXJhY3RlcklEKTtcbiAgcmV0dXJuIGpzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgY2xhc3M6IFwibmF2YmFyIGJnLWJhc2UtMTAwIHNoYWRvdy1zbVwiLFxuICAgIGNoaWxkcmVuOiBbanN4REVWXzd4ODFoMGtuKFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBcImZsZXgtMVwiLFxuICAgICAgY2hpbGRyZW46IGpzeERFVl83eDgxaDBrbihcImFcIiwge1xuICAgICAgICBjbGFzczogXCJidG4gYnRuLWdob3N0IHRleHQteGxcIixcbiAgICAgICAgY2hpbGRyZW46IFwiU3RhciBLaXR0ZW5cIlxuICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKVxuICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcyksIGpzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgICBjbGFzczogXCJmbGV4IGdhcC0yXCIsXG4gICAgICBjaGlsZHJlbjogW2pzeERFVl83eDgxaDBrbihcImlucHV0XCIsIHtcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIlNlYXJjaFwiLFxuICAgICAgICBjbGFzczogXCJpbnB1dCBpbnB1dC1ib3JkZXJlZCB3LTI0IG1kOnctYXV0b1wiXG4gICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgICAgICBjbGFzczogXCJkcm9wZG93biBkcm9wZG93bi1lbmRcIixcbiAgICAgICAgY2hpbGRyZW46IFtqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICAgIHJvbGU6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgY2xhc3M6IFwiYnRuIGJ0bi1naG9zdCBidG4tY2lyY2xlIGF2YXRhclwiLFxuICAgICAgICAgIGNoaWxkcmVuOiBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3M6IFwidy0xMCByb3VuZGVkLWZ1bGxcIixcbiAgICAgICAgICAgIGNoaWxkcmVuOiBqc3hERVZfN3g4MWgwa24oXCJpbWdcIiwge1xuICAgICAgICAgICAgICBhbHQ6IFwiVGFpbHdpbmQgQ1NTIE5hdmJhciBjb21wb25lbnRcIixcbiAgICAgICAgICAgICAgc3JjOiBtYWluICYmIENoYXJhY3RlckFQSS5nZXRQb3J0cmFpdFVSTChtYWluLmV2ZUlEKSB8fCBcIlwiXG4gICAgICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpXG4gICAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKVxuICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJ1bFwiLCB7XG4gICAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgICAgY2xhc3M6IFwibWVudSBtZW51LXNtIGRyb3Bkb3duLWNvbnRlbnQgYmctYmFzZS0xMDAgcm91bmRlZC1ib3ggei0xIG10LTMgdy01MiBwLTIgc2hhZG93XCIsXG4gICAgICAgICAgY2hpbGRyZW46IFtqc3hERVZfN3g4MWgwa24oXCJsaVwiLCB7XG4gICAgICAgICAgICBjaGlsZHJlbjogbWFpbiAmJiBtYWluLm5hbWVcbiAgICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJsaVwiLCB7XG4gICAgICAgICAgICBjaGlsZHJlbjoganN4REVWXzd4ODFoMGtuKFwiYVwiLCB7XG4gICAgICAgICAgICAgIGNsYXNzOiBcImp1c3RpZnktYmV0d2VlblwiLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogW1wiQ2hhcmFjdGVyc1wiLCBqc3hERVZfN3g4MWgwa24oXCJzcGFuXCIsIHtcbiAgICAgICAgICAgICAgICBjbGFzczogXCJiYWRnZVwiLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiB1c2VyLmNoYXJhY3RlcklEcy5sZW5ndGhcbiAgICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKV1cbiAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdW5kZWZpbmVkLCB0aGlzKVxuICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcyksIGpzeERFVl83eDgxaDBrbihcImxpXCIsIHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBqc3hERVZfN3g4MWgwa24oXCJhXCIsIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFwiTGluayBDaGFyYWN0ZXJcIlxuICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKVxuICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcyksIGpzeERFVl83eDgxaDBrbihcImxpXCIsIHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBqc3hERVZfN3g4MWgwa24oXCJhXCIsIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFwiU2V0dGluZ3NcIlxuICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKVxuICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcyksIGpzeERFVl83eDgxaDBrbihcImxpXCIsIHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBqc3hERVZfN3g4MWgwa24oXCJhXCIsIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFwiTG9nb3V0XCJcbiAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcylcbiAgICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpXVxuICAgICAgICB9LCB1bmRlZmluZWQsIHRydWUsIHVuZGVmaW5lZCwgdGhpcyldXG4gICAgICB9LCB1bmRlZmluZWQsIHRydWUsIHVuZGVmaW5lZCwgdGhpcyldXG4gICAgfSwgdW5kZWZpbmVkLCB0cnVlLCB1bmRlZmluZWQsIHRoaXMpXVxuICB9LCB1bmRlZmluZWQsIHRydWUsIHVuZGVmaW5lZCwgdGhpcyk7XG59XG5pbXBvcnQgeyBqc3ggYXMganN4X3c3N3lhZnM0LCBqc3hzIGFzIGpzeHNfZWg2Yzc4bmosIGpzeERFViBhcyBqc3hERVZfN3g4MWgwa24sIEZyYWdtZW50IGFzIEZyYWdtZW50Xzh2Zzl4M3NxIH0gZnJvbSAnYnJpc2EvanN4LXJ1bnRpbWUnO1xuIiwKICAgICJpbXBvcnQgTmF2IGZyb20gXCJAL2NvbXBvbmVudHMvbmF2aWdhdGlvblwiO1xuaW1wb3J0IEZvb3RlciBmcm9tIFwiQC9jb21wb25lbnRzL2Zvb3RlclwiO1xuaW1wb3J0IFwiQC9zdHlsZXMvc3R5bGUuY3NzXCI7XG5pbXBvcnQgXCJAL3N0eWxlcy9uYXYuY3NzXCI7XG5pbXBvcnQgXCJAL3N0eWxlcy9mb290ZXIuY3NzXCI7XG5pbXBvcnQge1VzZXJIZWxwZXJ9IGZyb20gXCJAc3Rhci1raXR0ZW4vZXZlL2RiXCI7XG5pbXBvcnQge2dldENvb2tpZXN9IGZyb20gXCJAL3V0aWxzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBMYXlvdXQoe2NoaWxkcmVufSwgcmVxdWVzdCkge1xuICBjb25zdCB1c2VyID0gVXNlckhlbHBlci5maW5kKDEpO1xuICByZXR1cm4ganN4REVWXzd4ODFoMGtuKFwiaHRtbFwiLCB7XG4gICAgbGFuZzogXCJlblwiLFxuICAgIFwiZGF0YS10aGVtZVwiOiBcImRhcmtcIixcbiAgICBjaGlsZHJlbjogW2pzeERFVl83eDgxaDBrbihcImhlYWRcIiwge1xuICAgICAgY2hpbGRyZW46IFtqc3hERVZfN3g4MWgwa24oXCJ0aXRsZVwiLCB7XG4gICAgICAgIGlkOiBcInRpdGxlXCIsXG4gICAgICAgIGNoaWxkcmVuOiBcIkJyaXNhXCJcbiAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcyksIGpzeERFVl83eDgxaDBrbihcIm1ldGFcIiwge1xuICAgICAgICBuYW1lOiBcInRoZW1lLWNvbG9yXCIsXG4gICAgICAgIGNvbnRlbnQ6IFwiI2FkMTQ1N1wiXG4gICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJsaW5rXCIsIHtcbiAgICAgICAgcmVsOiBcInNob3J0Y3V0IGljb25cIixcbiAgICAgICAgaHJlZjogXCIvYnJpc2Euc3ZnXCJcbiAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcyksIGpzeERFVl83eDgxaDBrbihcImxpbmtcIiwge1xuICAgICAgICByZWw6IFwicHJlY29ubmVjdFwiLFxuICAgICAgICBocmVmOiBcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb21cIlxuICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKSwganN4REVWXzd4ODFoMGtuKFwibGlua1wiLCB7XG4gICAgICAgIHJlbDogXCJwcmVjb25uZWN0XCIsXG4gICAgICAgIGhyZWY6IFwiaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbVwiLFxuICAgICAgICBjcm9zc29yaWdpbjogXCJ0cnVlXCJcbiAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcyksIGpzeERFVl83eDgxaDBrbihcImxpbmtcIiwge1xuICAgICAgICBocmVmOiBcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9UGVybWFuZW50K01hcmtlciZkaXNwbGF5PXN3YXBcIixcbiAgICAgICAgcmVsOiBcInN0eWxlc2hlZXRcIlxuICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKSwganN4REVWXzd4ODFoMGtuKFwibWV0YVwiLCB7XG4gICAgICAgIG5hbWU6IFwidmlld3BvcnRcIixcbiAgICAgICAgY29udGVudDogXCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiXG4gICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpXVxuICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdW5kZWZpbmVkLCB0aGlzKSwganN4REVWXzd4ODFoMGtuKFwiYm9keVwiLCB7XG4gICAgICBjaGlsZHJlbjogW2pzeERFVl83eDgxaDBrbihcImhlYWRlclwiLCB7XG4gICAgICAgIGNoaWxkcmVuOiBqc3hERVZfN3g4MWgwa24oTmF2LCB7XG4gICAgICAgICAgdXNlclxuICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpXG4gICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJtYWluXCIsIHtcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcyldXG4gICAgfSwgdW5kZWZpbmVkLCB0cnVlLCB1bmRlZmluZWQsIHRoaXMpXVxuICB9LCB1bmRlZmluZWQsIHRydWUsIHVuZGVmaW5lZCwgdGhpcyk7XG59XG5pbXBvcnQgeyBqc3ggYXMganN4X3c3N3lhZnM0LCBqc3hzIGFzIGpzeHNfZWg2Yzc4bmosIGpzeERFViBhcyBqc3hERVZfN3g4MWgwa24sIEZyYWdtZW50IGFzIEZyYWdtZW50Xzh2Zzl4M3NxIH0gZnJvbSAnYnJpc2EvanN4LXJ1bnRpbWUnO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFFQSxJQUFJO0FBQUEsRUFDSixJQUFJLFVBQVMsT0FBTztBQUFBLEVBR3BCLFNBQVMsU0FBVSxDQUFDLEtBQUssS0FBSztBQUFBLElBQzVCLFNBQVMsT0FBTyxLQUFLO0FBQUEsTUFDbkIsSUFBSSxPQUFPLElBQUk7QUFBQSxJQUNqQjtBQUFBO0FBQUEsRUFFRixJQUFJLFFBQU8sUUFBUSxRQUFPLFNBQVMsUUFBTyxlQUFlLFFBQU8saUJBQWlCO0FBQUEsSUFDL0UsT0FBTyxVQUFVO0FBQUEsRUFDbkIsRUFBTztBQUFBLElBRUwsVUFBVSxRQUFRLE9BQU87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O0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUVBLElBQUksYUFBYTtBQUFBLE1BQ2Y7QUFBQSxNQUFHO0FBQUEsTUFDSDtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBRztBQUFBLE1BQ3ZCO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFDbEI7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUNsQjtBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQ2xCO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsSUFDcEI7QUFBQSxJQUVBLElBQUksYUFBYTtBQUFBLE1BQ2Y7QUFBQSxNQUFHO0FBQUEsTUFDSDtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQzVEO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFTO0FBQUEsTUFDM0Q7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVM7QUFBQSxNQUMzRDtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQ3pEO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsSUFDOUQ7QUFBQSxJQUVBLEdBQUcsVUFBVSxXQUFXLFNBQVMsUUFBUyxDQUFDLE1BQU0sU0FBUztBQUFBLE1BQ3hELE9BQU8sUUFBUTtBQUFBLE1BQ2YsVUFBVSxVQUFVLEtBQUs7QUFBQSxNQUV6QixJQUFJO0FBQUEsTUFDSixJQUFJLFNBQVMsTUFBTSxTQUFTLE9BQU87QUFBQSxRQUNqQyxNQUFNO0FBQUEsUUFDTixJQUFJLE1BQU07QUFBQSxRQUNWLElBQUksUUFBUTtBQUFBLFFBQ1osU0FBUyxJQUFJLEVBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztBQUFBLFVBQ3BDLElBQUksSUFBSSxLQUFLLE1BQU07QUFBQSxVQUNuQixJQUFJLFNBQVUsS0FBSyxNQUFPLFNBQVMsVUFBVSxTQUFTLEVBQUU7QUFBQSxVQUN4RCxRQUFTLE1BQU8sS0FBSyxNQUFRO0FBQUEsVUFDN0IsT0FBTztBQUFBLFVBQ1AsSUFBSSxPQUFPLElBQUk7QUFBQSxZQUNiLE9BQU87QUFBQSxZQUNQO0FBQUEsVUFDRjtBQUFBLFVBQ0EsSUFBSSxVQUFVLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRztBQUFBLFlBQ3hDLE1BQU0sTUFBTSxJQUFJLEtBQUssVUFBVSxPQUFPO0FBQUEsVUFDeEMsRUFBTztBQUFBLFlBQ0wsTUFBTSxPQUFPO0FBQUE7QUFBQSxRQUVqQjtBQUFBLFFBQ0EsSUFBSSxVQUFVLEdBQUc7QUFBQSxVQUNmLE1BQU0sTUFBTSxTQUFTLEVBQUUsSUFBSTtBQUFBLFFBQzdCO0FBQUEsUUFDQSxPQUFPLElBQUksU0FBUyxZQUFZLEdBQUc7QUFBQSxVQUNqQyxNQUFNLE1BQU07QUFBQSxRQUNkO0FBQUEsUUFDQSxJQUFJLEtBQUssYUFBYSxHQUFHO0FBQUEsVUFDdkIsTUFBTSxNQUFNO0FBQUEsUUFDZDtBQUFBLFFBQ0EsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUVBLElBQUksVUFBVSxPQUFPLE1BQU0sUUFBUSxLQUFLLFFBQVEsSUFBSTtBQUFBLFFBRWxELElBQUksWUFBWSxXQUFXO0FBQUEsUUFFM0IsSUFBSSxZQUFZLFdBQVc7QUFBQSxRQUMzQixNQUFNO0FBQUEsUUFDTixJQUFJLElBQUksS0FBSyxNQUFNO0FBQUEsUUFDbkIsRUFBRSxXQUFXO0FBQUEsUUFDYixRQUFRLEVBQUUsT0FBTyxHQUFHO0FBQUEsVUFDbEIsSUFBSSxJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUUsU0FBUyxJQUFJO0FBQUEsVUFDdkMsSUFBSSxFQUFFLE1BQU0sU0FBUztBQUFBLFVBRXJCLEtBQUssRUFBRSxPQUFPLEdBQUc7QUFBQSxZQUNmLE1BQU0sTUFBTSxZQUFZLEVBQUUsVUFBVSxJQUFJO0FBQUEsVUFDMUMsRUFBTztBQUFBLFlBQ0wsTUFBTSxJQUFJO0FBQUE7QUFBQSxRQUVkO0FBQUEsUUFDQSxJQUFJLEtBQUssT0FBTyxHQUFHO0FBQUEsVUFDakIsTUFBTSxNQUFNO0FBQUEsUUFDZDtBQUFBLFFBQ0EsT0FBTyxJQUFJLFNBQVMsWUFBWSxHQUFHO0FBQUEsVUFDakMsTUFBTSxNQUFNO0FBQUEsUUFDZDtBQUFBLFFBQ0EsSUFBSSxLQUFLLGFBQWEsR0FBRztBQUFBLFVBQ3ZCLE1BQU0sTUFBTTtBQUFBLFFBQ2Q7QUFBQSxRQUNBLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFFQSxPQUFPLE9BQU8saUNBQWlDO0FBQUE7QUFBQSxJQUdqRCxHQUFHLFVBQVUsV0FBVyxTQUFTLFFBQVMsR0FBRztBQUFBLE1BQzNDLElBQUksTUFBTSxLQUFLLE1BQU07QUFBQSxNQUNyQixJQUFJLEtBQUssV0FBVyxHQUFHO0FBQUEsUUFDckIsT0FBTyxLQUFLLE1BQU0sS0FBSztBQUFBLE1BQ3pCLEVBQU8sU0FBSSxLQUFLLFdBQVcsS0FBSyxLQUFLLE1BQU0sT0FBTyxHQUFNO0FBQUEsUUFFdEQsT0FBTyxtQkFBb0IsS0FBSyxNQUFNLEtBQUs7QUFBQSxNQUM3QyxFQUFPLFNBQUksS0FBSyxTQUFTLEdBQUc7QUFBQSxRQUMxQixPQUFPLE9BQU8sNENBQTRDO0FBQUEsTUFDNUQ7QUFBQSxNQUNBLE9BQVEsS0FBSyxhQUFhLEtBQU0sTUFBTTtBQUFBO0FBQUEsSUFHeEMsR0FBRyxVQUFVLFNBQVMsU0FBUyxNQUFPLEdBQUc7QUFBQSxNQUN2QyxPQUFPLEtBQUssU0FBUyxFQUFFO0FBQUE7QUFBQSxJQUd6QixHQUFHLFVBQVUsV0FBVyxTQUFTLFFBQVMsQ0FBQyxRQUFRLFFBQVE7QUFBQSxNQUN6RCxPQUFPLE9BQU8sWUFBVyxXQUFXO0FBQUEsTUFDcEMsT0FBTyxLQUFLLFlBQVksU0FBUSxRQUFRLE1BQU07QUFBQTtBQUFBLElBR2hELEdBQUcsVUFBVSxVQUFVLFNBQVMsT0FBUSxDQUFDLFFBQVEsUUFBUTtBQUFBLE1BQ3ZELE9BQU8sS0FBSyxZQUFZLE9BQU8sUUFBUSxNQUFNO0FBQUE7QUFBQSxJQUcvQyxHQUFHLFVBQVUsY0FBYyxTQUFTLFdBQVksQ0FBQyxXQUFXLFFBQVEsUUFBUTtBQUFBLE1BQzFFLElBQUksYUFBYSxLQUFLLFdBQVc7QUFBQSxNQUNqQyxJQUFJLFlBQVksVUFBVSxLQUFLLElBQUksR0FBRyxVQUFVO0FBQUEsTUFDaEQsT0FBTyxjQUFjLFdBQVcsdUNBQXVDO0FBQUEsTUFDdkUsT0FBTyxZQUFZLEdBQUcsNkJBQTZCO0FBQUEsTUFFbkQsS0FBSyxNQUFNO0FBQUEsTUFDWCxJQUFJLGVBQWUsV0FBVztBQUFBLE1BQzlCLElBQUksTUFBTSxJQUFJLFVBQVUsU0FBUztBQUFBLE1BRWpDLElBQUksR0FBRztBQUFBLE1BQ1AsSUFBSSxJQUFJLEtBQUssTUFBTTtBQUFBLE1BQ25CLEtBQUssY0FBYztBQUFBLFFBRWpCLEtBQUssSUFBSSxFQUFHLElBQUksWUFBWSxZQUFZLEtBQUs7QUFBQSxVQUMzQyxJQUFJLEtBQUs7QUFBQSxRQUNYO0FBQUEsUUFFQSxLQUFLLElBQUksR0FBSSxFQUFFLE9BQU8sR0FBRyxLQUFLO0FBQUEsVUFDNUIsSUFBSSxFQUFFLE1BQU0sR0FBSTtBQUFBLFVBQ2hCLEVBQUUsT0FBTyxDQUFDO0FBQUEsVUFFVixJQUFJLFlBQVksSUFBSSxLQUFLO0FBQUEsUUFDM0I7QUFBQSxNQUNGLEVBQU87QUFBQSxRQUNMLEtBQUssSUFBSSxHQUFJLEVBQUUsT0FBTyxHQUFHLEtBQUs7QUFBQSxVQUM1QixJQUFJLEVBQUUsTUFBTSxHQUFJO0FBQUEsVUFDaEIsRUFBRSxPQUFPLENBQUM7QUFBQSxVQUVWLElBQUksS0FBSztBQUFBLFFBQ1g7QUFBQSxRQUVBLE1BQU8sSUFBSSxXQUFXLEtBQUs7QUFBQSxVQUN6QixJQUFJLEtBQUs7QUFBQSxRQUNYO0FBQUE7QUFBQSxNQUdGLE9BQU87QUFBQTtBQUFBLElBR1QsSUFBSSxLQUFLLE9BQU87QUFBQSxNQUNkLEdBQUcsVUFBVSxhQUFhLFNBQVMsVUFBVyxDQUFDLEdBQUc7QUFBQSxRQUNoRCxPQUFPLEtBQUssS0FBSyxNQUFNLENBQUM7QUFBQTtBQUFBLElBRTVCLEVBQU87QUFBQSxNQUNMLEdBQUcsVUFBVSxhQUFhLFNBQVMsVUFBVyxDQUFDLEdBQUc7QUFBQSxRQUNoRCxJQUFJLElBQUk7QUFBQSxRQUNSLElBQUksSUFBSTtBQUFBLFFBQ1IsSUFBSSxLQUFLLE1BQVE7QUFBQSxVQUNmLEtBQUs7QUFBQSxVQUNMLE9BQU87QUFBQSxRQUNUO0FBQUEsUUFDQSxJQUFJLEtBQUssSUFBTTtBQUFBLFVBQ2IsS0FBSztBQUFBLFVBQ0wsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUNBLElBQUksS0FBSyxHQUFLO0FBQUEsVUFDWixLQUFLO0FBQUEsVUFDTCxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0EsSUFBSSxLQUFLLEdBQU07QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLE9BQU87QUFBQSxRQUNUO0FBQUEsUUFDQSxPQUFPLElBQUk7QUFBQTtBQUFBO0FBQUEsSUFJZixHQUFHLFVBQVUsWUFBWSxTQUFTLFNBQVUsQ0FBQyxHQUFHO0FBQUEsTUFFOUMsSUFBSSxNQUFNO0FBQUEsUUFBRyxPQUFPO0FBQUEsTUFFcEIsSUFBSSxJQUFJO0FBQUEsTUFDUixJQUFJLElBQUk7QUFBQSxNQUNSLEtBQUssSUFBSSxVQUFZLEdBQUc7QUFBQSxRQUN0QixLQUFLO0FBQUEsUUFDTCxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0EsS0FBSyxJQUFJLFNBQVUsR0FBRztBQUFBLFFBQ3BCLEtBQUs7QUFBQSxRQUNMLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFDQSxLQUFLLElBQUksUUFBUyxHQUFHO0FBQUEsUUFDbkIsS0FBSztBQUFBLFFBQ0wsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUNBLEtBQUssSUFBSSxPQUFTLEdBQUc7QUFBQSxRQUNuQixLQUFLO0FBQUEsUUFDTCxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0EsS0FBSyxJQUFJLE9BQVMsR0FBRztBQUFBLFFBQ25CO0FBQUEsTUFDRjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsSUFJVCxHQUFHLFVBQVUsWUFBWSxTQUFTLFNBQVUsR0FBRztBQUFBLE1BQzdDLElBQUksSUFBSSxLQUFLLE1BQU0sS0FBSyxTQUFTO0FBQUEsTUFDakMsSUFBSSxLQUFLLEtBQUssV0FBVyxDQUFDO0FBQUEsTUFDMUIsUUFBUSxLQUFLLFNBQVMsS0FBSyxLQUFLO0FBQUE7QUFBQSxJQUdsQyxTQUFTLFVBQVcsQ0FBQyxLQUFLO0FBQUEsTUFDeEIsSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLFVBQVUsQ0FBQztBQUFBLE1BRWpDLFNBQVMsTUFBTSxFQUFHLE1BQU0sRUFBRSxRQUFRLE9BQU87QUFBQSxRQUN2QyxJQUFJLE1BQU8sTUFBTSxLQUFNO0FBQUEsUUFDdkIsSUFBSSxPQUFPLE1BQU07QUFBQSxRQUVqQixFQUFFLFFBQVEsSUFBSSxNQUFNLE9BQVEsS0FBSyxVQUFXO0FBQUEsTUFDOUM7QUFBQSxNQUVBLE9BQU87QUFBQTtBQUFBLElBSVQsR0FBRyxVQUFVLFdBQVcsU0FBUyxRQUFTLEdBQUc7QUFBQSxNQUMzQyxJQUFJLEtBQUssT0FBTztBQUFBLFFBQUcsT0FBTztBQUFBLE1BRTFCLElBQUksSUFBSTtBQUFBLE1BQ1IsU0FBUyxJQUFJLEVBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztBQUFBLFFBQ3BDLElBQUksSUFBSSxLQUFLLFVBQVUsS0FBSyxNQUFNLEVBQUU7QUFBQSxRQUNwQyxLQUFLO0FBQUEsUUFDTCxJQUFJLE1BQU07QUFBQSxVQUFJO0FBQUEsTUFDaEI7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLElBR1QsR0FBRyxVQUFVLGFBQWEsU0FBUyxVQUFXLEdBQUc7QUFBQSxNQUMvQyxPQUFPLEtBQUssS0FBSyxLQUFLLFVBQVUsSUFBSSxDQUFDO0FBQUE7QUFBQSxJQUd2QyxHQUFHLFVBQVUsU0FBUyxTQUFTLE1BQU8sQ0FBQyxPQUFPO0FBQUEsTUFDNUMsSUFBSSxLQUFLLGFBQWEsR0FBRztBQUFBLFFBQ3ZCLE9BQU8sS0FBSyxJQUFJLEVBQUUsTUFBTSxLQUFLLEVBQUUsTUFBTSxDQUFDO0FBQUEsTUFDeEM7QUFBQSxNQUNBLE9BQU8sS0FBSyxNQUFNO0FBQUE7QUFBQSxJQUdwQixHQUFHLFVBQVUsV0FBVyxTQUFTLFFBQVMsQ0FBQyxPQUFPO0FBQUEsTUFDaEQsSUFBSSxLQUFLLE1BQU0sUUFBUSxDQUFDLEdBQUc7QUFBQSxRQUN6QixPQUFPLEtBQUssS0FBSyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsS0FBSztBQUFBLE1BQ3hDO0FBQUEsTUFDQSxPQUFPLEtBQUssTUFBTTtBQUFBO0FBQUEsSUFHcEIsR0FBRyxVQUFVLFFBQVEsU0FBUyxLQUFNLEdBQUc7QUFBQSxNQUNyQyxPQUFPLEtBQUssYUFBYTtBQUFBO0FBQUEsSUFJM0IsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLEdBQUc7QUFBQSxNQUNqQyxPQUFPLEtBQUssTUFBTSxFQUFFLEtBQUs7QUFBQTtBQUFBLElBRzNCLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxHQUFHO0FBQUEsTUFDbkMsS0FBSyxLQUFLLE9BQU8sR0FBRztBQUFBLFFBQ2xCLEtBQUssWUFBWTtBQUFBLE1BQ25CO0FBQUEsTUFFQSxPQUFPO0FBQUE7QUFBQSxJQUlULEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLEtBQUs7QUFBQSxNQUN0QyxPQUFPLEtBQUssU0FBUyxJQUFJLFFBQVE7QUFBQSxRQUMvQixLQUFLLE1BQU0sS0FBSyxZQUFZO0FBQUEsTUFDOUI7QUFBQSxNQUVBLFNBQVMsSUFBSSxFQUFHLElBQUksSUFBSSxRQUFRLEtBQUs7QUFBQSxRQUNuQyxLQUFLLE1BQU0sS0FBSyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU07QUFBQSxNQUM1QztBQUFBLE1BRUEsT0FBTyxLQUFLLE1BQU07QUFBQTtBQUFBLElBR3BCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxRQUFRLEtBQUssV0FBVyxJQUFJLGNBQWMsQ0FBQztBQUFBLE1BQzNDLE9BQU8sS0FBSyxLQUFLLEdBQUc7QUFBQTtBQUFBLElBSXRCLEdBQUcsVUFBVSxLQUFLLFNBQVMsRUFBRyxDQUFDLEtBQUs7QUFBQSxNQUNsQyxJQUFJLEtBQUssU0FBUyxJQUFJO0FBQUEsUUFBUSxPQUFPLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRztBQUFBLE1BQ3pELE9BQU8sSUFBSSxNQUFNLEVBQUUsSUFBSSxJQUFJO0FBQUE7QUFBQSxJQUc3QixHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsSUFBSSxLQUFLLFNBQVMsSUFBSTtBQUFBLFFBQVEsT0FBTyxLQUFLLE1BQU0sRUFBRSxLQUFLLEdBQUc7QUFBQSxNQUMxRCxPQUFPLElBQUksTUFBTSxFQUFFLEtBQUssSUFBSTtBQUFBO0FBQUEsSUFJOUIsR0FBRyxVQUFVLFFBQVEsU0FBUyxLQUFNLENBQUMsS0FBSztBQUFBLE1BRXhDLElBQUk7QUFBQSxNQUNKLElBQUksS0FBSyxTQUFTLElBQUksUUFBUTtBQUFBLFFBQzVCLElBQUk7QUFBQSxNQUNOLEVBQU87QUFBQSxRQUNMLElBQUk7QUFBQTtBQUFBLE1BR04sU0FBUyxJQUFJLEVBQUcsSUFBSSxFQUFFLFFBQVEsS0FBSztBQUFBLFFBQ2pDLEtBQUssTUFBTSxLQUFLLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTTtBQUFBLE1BQzVDO0FBQUEsTUFFQSxLQUFLLFNBQVMsRUFBRTtBQUFBLE1BRWhCLE9BQU8sS0FBSyxNQUFNO0FBQUE7QUFBQSxJQUdwQixHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssQ0FBQyxLQUFLO0FBQUEsTUFDdEMsUUFBUSxLQUFLLFdBQVcsSUFBSSxjQUFjLENBQUM7QUFBQSxNQUMzQyxPQUFPLEtBQUssTUFBTSxHQUFHO0FBQUE7QUFBQSxJQUl2QixHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsSUFBSSxLQUFLLFNBQVMsSUFBSTtBQUFBLFFBQVEsT0FBTyxLQUFLLE1BQU0sRUFBRSxLQUFLLEdBQUc7QUFBQSxNQUMxRCxPQUFPLElBQUksTUFBTSxFQUFFLEtBQUssSUFBSTtBQUFBO0FBQUEsSUFHOUIsR0FBRyxVQUFVLE9BQU8sU0FBUyxJQUFLLENBQUMsS0FBSztBQUFBLE1BQ3RDLElBQUksS0FBSyxTQUFTLElBQUk7QUFBQSxRQUFRLE9BQU8sS0FBSyxNQUFNLEVBQUUsTUFBTSxHQUFHO0FBQUEsTUFDM0QsT0FBTyxJQUFJLE1BQU0sRUFBRSxNQUFNLElBQUk7QUFBQTtBQUFBLElBSS9CLEdBQUcsVUFBVSxRQUFRLFNBQVMsS0FBTSxDQUFDLEtBQUs7QUFBQSxNQUV4QyxJQUFJO0FBQUEsTUFDSixJQUFJO0FBQUEsTUFDSixJQUFJLEtBQUssU0FBUyxJQUFJLFFBQVE7QUFBQSxRQUM1QixJQUFJO0FBQUEsUUFDSixJQUFJO0FBQUEsTUFDTixFQUFPO0FBQUEsUUFDTCxJQUFJO0FBQUEsUUFDSixJQUFJO0FBQUE7QUFBQSxNQUdOLFNBQVMsSUFBSSxFQUFHLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxRQUNqQyxLQUFLLE1BQU0sS0FBSyxFQUFFLE1BQU0sS0FBSyxFQUFFLE1BQU07QUFBQSxNQUN2QztBQUFBLE1BRUEsSUFBSSxTQUFTLEdBQUc7QUFBQSxRQUNkLE1BQU8sSUFBSSxFQUFFLFFBQVEsS0FBSztBQUFBLFVBQ3hCLEtBQUssTUFBTSxLQUFLLEVBQUUsTUFBTTtBQUFBLFFBQzFCO0FBQUEsTUFDRjtBQUFBLE1BRUEsS0FBSyxTQUFTLEVBQUU7QUFBQSxNQUVoQixPQUFPLEtBQUssTUFBTTtBQUFBO0FBQUEsSUFHcEIsR0FBRyxVQUFVLE9BQU8sU0FBUyxJQUFLLENBQUMsS0FBSztBQUFBLE1BQ3RDLFFBQVEsS0FBSyxXQUFXLElBQUksY0FBYyxDQUFDO0FBQUEsTUFDM0MsT0FBTyxLQUFLLE1BQU0sR0FBRztBQUFBO0FBQUEsSUFJdkIsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLElBQUksS0FBSyxTQUFTLElBQUk7QUFBQSxRQUFRLE9BQU8sS0FBSyxNQUFNLEVBQUUsS0FBSyxHQUFHO0FBQUEsTUFDMUQsT0FBTyxJQUFJLE1BQU0sRUFBRSxLQUFLLElBQUk7QUFBQTtBQUFBLElBRzlCLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLEtBQUs7QUFBQSxNQUN0QyxJQUFJLEtBQUssU0FBUyxJQUFJO0FBQUEsUUFBUSxPQUFPLEtBQUssTUFBTSxFQUFFLE1BQU0sR0FBRztBQUFBLE1BQzNELE9BQU8sSUFBSSxNQUFNLEVBQUUsTUFBTSxJQUFJO0FBQUE7QUFBQSxJQUkvQixHQUFHLFVBQVUsUUFBUSxTQUFTLEtBQU0sQ0FBQyxPQUFPO0FBQUEsTUFDMUMsT0FBTyxPQUFPLFVBQVUsWUFBWSxTQUFTLENBQUM7QUFBQSxNQUU5QyxJQUFJLGNBQWMsS0FBSyxLQUFLLFFBQVEsRUFBRSxJQUFJO0FBQUEsTUFDMUMsSUFBSSxXQUFXLFFBQVE7QUFBQSxNQUd2QixLQUFLLFFBQVEsV0FBVztBQUFBLE1BRXhCLElBQUksV0FBVyxHQUFHO0FBQUEsUUFDaEI7QUFBQSxNQUNGO0FBQUEsTUFHQSxTQUFTLElBQUksRUFBRyxJQUFJLGFBQWEsS0FBSztBQUFBLFFBQ3BDLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxLQUFLO0FBQUEsTUFDbkM7QUFBQSxNQUdBLElBQUksV0FBVyxHQUFHO0FBQUEsUUFDaEIsS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLEtBQU0sWUFBYyxLQUFLO0FBQUEsTUFDdkQ7QUFBQSxNQUdBLE9BQU8sS0FBSyxNQUFNO0FBQUE7QUFBQSxJQUdwQixHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssQ0FBQyxPQUFPO0FBQUEsTUFDeEMsT0FBTyxLQUFLLE1BQU0sRUFBRSxNQUFNLEtBQUs7QUFBQTtBQUFBLElBSWpDLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLEtBQUssS0FBSztBQUFBLE1BQzNDLE9BQU8sT0FBTyxRQUFRLFlBQVksT0FBTyxDQUFDO0FBQUEsTUFFMUMsSUFBSSxNQUFPLE1BQU0sS0FBTTtBQUFBLE1BQ3ZCLElBQUksT0FBTyxNQUFNO0FBQUEsTUFFakIsS0FBSyxRQUFRLE1BQU0sQ0FBQztBQUFBLE1BRXBCLElBQUksS0FBSztBQUFBLFFBQ1AsS0FBSyxNQUFNLE9BQU8sS0FBSyxNQUFNLE9BQVEsS0FBSztBQUFBLE1BQzVDLEVBQU87QUFBQSxRQUNMLEtBQUssTUFBTSxPQUFPLEtBQUssTUFBTSxTQUFTLEtBQUs7QUFBQTtBQUFBLE1BRzdDLE9BQU8sS0FBSyxNQUFNO0FBQUE7QUFBQSxJQUlwQixHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssQ0FBQyxLQUFLO0FBQUEsTUFDdEMsSUFBSTtBQUFBLE1BR0osSUFBSSxLQUFLLGFBQWEsS0FBSyxJQUFJLGFBQWEsR0FBRztBQUFBLFFBQzdDLEtBQUssV0FBVztBQUFBLFFBQ2hCLElBQUksS0FBSyxLQUFLLEdBQUc7QUFBQSxRQUNqQixLQUFLLFlBQVk7QUFBQSxRQUNqQixPQUFPLEtBQUssVUFBVTtBQUFBLE1BR3hCLEVBQU8sU0FBSSxLQUFLLGFBQWEsS0FBSyxJQUFJLGFBQWEsR0FBRztBQUFBLFFBQ3BELElBQUksV0FBVztBQUFBLFFBQ2YsSUFBSSxLQUFLLEtBQUssR0FBRztBQUFBLFFBQ2pCLElBQUksV0FBVztBQUFBLFFBQ2YsT0FBTyxFQUFFLFVBQVU7QUFBQSxNQUNyQjtBQUFBLE1BR0EsSUFBSSxHQUFHO0FBQUEsTUFDUCxJQUFJLEtBQUssU0FBUyxJQUFJLFFBQVE7QUFBQSxRQUM1QixJQUFJO0FBQUEsUUFDSixJQUFJO0FBQUEsTUFDTixFQUFPO0FBQUEsUUFDTCxJQUFJO0FBQUEsUUFDSixJQUFJO0FBQUE7QUFBQSxNQUdOLElBQUksUUFBUTtBQUFBLE1BQ1osU0FBUyxJQUFJLEVBQUcsSUFBSSxFQUFFLFFBQVEsS0FBSztBQUFBLFFBQ2pDLEtBQUssRUFBRSxNQUFNLEtBQUssTUFBTSxFQUFFLE1BQU0sS0FBSyxLQUFLO0FBQUEsUUFDMUMsS0FBSyxNQUFNLEtBQUssSUFBSTtBQUFBLFFBQ3BCLFFBQVEsTUFBTTtBQUFBLE1BQ2hCO0FBQUEsTUFDQSxNQUFPLFVBQVUsS0FBSyxJQUFJLEVBQUUsUUFBUSxLQUFLO0FBQUEsUUFDdkMsS0FBSyxFQUFFLE1BQU0sS0FBSyxLQUFLO0FBQUEsUUFDdkIsS0FBSyxNQUFNLEtBQUssSUFBSTtBQUFBLFFBQ3BCLFFBQVEsTUFBTTtBQUFBLE1BQ2hCO0FBQUEsTUFFQSxLQUFLLFNBQVMsRUFBRTtBQUFBLE1BQ2hCLElBQUksVUFBVSxHQUFHO0FBQUEsUUFDZixLQUFLLE1BQU0sS0FBSyxVQUFVO0FBQUEsUUFDMUIsS0FBSztBQUFBLE1BRVAsRUFBTyxTQUFJLE1BQU0sTUFBTTtBQUFBLFFBQ3JCLE1BQU8sSUFBSSxFQUFFLFFBQVEsS0FBSztBQUFBLFVBQ3hCLEtBQUssTUFBTSxLQUFLLEVBQUUsTUFBTTtBQUFBLFFBQzFCO0FBQUEsTUFDRjtBQUFBLE1BRUEsT0FBTztBQUFBO0FBQUEsSUFJVCxHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsSUFBSTtBQUFBLE1BQ0osSUFBSSxJQUFJLGFBQWEsS0FBSyxLQUFLLGFBQWEsR0FBRztBQUFBLFFBQzdDLElBQUksV0FBVztBQUFBLFFBQ2YsTUFBTSxLQUFLLElBQUksR0FBRztBQUFBLFFBQ2xCLElBQUksWUFBWTtBQUFBLFFBQ2hCLE9BQU87QUFBQSxNQUNULEVBQU8sU0FBSSxJQUFJLGFBQWEsS0FBSyxLQUFLLGFBQWEsR0FBRztBQUFBLFFBQ3BELEtBQUssV0FBVztBQUFBLFFBQ2hCLE1BQU0sSUFBSSxJQUFJLElBQUk7QUFBQSxRQUNsQixLQUFLLFdBQVc7QUFBQSxRQUNoQixPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsSUFBSSxLQUFLLFNBQVMsSUFBSTtBQUFBLFFBQVEsT0FBTyxLQUFLLE1BQU0sRUFBRSxLQUFLLEdBQUc7QUFBQSxNQUUxRCxPQUFPLElBQUksTUFBTSxFQUFFLEtBQUssSUFBSTtBQUFBO0FBQUEsSUFJOUIsR0FBRyxVQUFVLE9BQU8sU0FBUyxJQUFLLENBQUMsS0FBSztBQUFBLE1BRXRDLElBQUksSUFBSSxhQUFhLEdBQUc7QUFBQSxRQUN0QixJQUFJLFdBQVc7QUFBQSxRQUNmLElBQUksSUFBSSxLQUFLLEtBQUssR0FBRztBQUFBLFFBQ3JCLElBQUksV0FBVztBQUFBLFFBQ2YsT0FBTyxFQUFFLFVBQVU7QUFBQSxNQUdyQixFQUFPLFNBQUksS0FBSyxhQUFhLEdBQUc7QUFBQSxRQUM5QixLQUFLLFdBQVc7QUFBQSxRQUNoQixLQUFLLEtBQUssR0FBRztBQUFBLFFBQ2IsS0FBSyxXQUFXO0FBQUEsUUFDaEIsT0FBTyxLQUFLLFVBQVU7QUFBQSxNQUN4QjtBQUFBLE1BR0EsSUFBSSxNQUFNLEtBQUssSUFBSSxHQUFHO0FBQUEsTUFHdEIsSUFBSSxRQUFRLEdBQUc7QUFBQSxRQUNiLEtBQUssV0FBVztBQUFBLFFBQ2hCLEtBQUssU0FBUztBQUFBLFFBQ2QsS0FBSyxNQUFNLEtBQUs7QUFBQSxRQUNoQixPQUFPO0FBQUEsTUFDVDtBQUFBLE1BR0EsSUFBSSxHQUFHO0FBQUEsTUFDUCxJQUFJLE1BQU0sR0FBRztBQUFBLFFBQ1gsSUFBSTtBQUFBLFFBQ0osSUFBSTtBQUFBLE1BQ04sRUFBTztBQUFBLFFBQ0wsSUFBSTtBQUFBLFFBQ0osSUFBSTtBQUFBO0FBQUEsTUFHTixJQUFJLFFBQVE7QUFBQSxNQUNaLFNBQVMsSUFBSSxFQUFHLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxRQUNqQyxLQUFLLEVBQUUsTUFBTSxLQUFLLE1BQU0sRUFBRSxNQUFNLEtBQUssS0FBSztBQUFBLFFBQzFDLFFBQVEsS0FBSztBQUFBLFFBQ2IsS0FBSyxNQUFNLEtBQUssSUFBSTtBQUFBLE1BQ3RCO0FBQUEsTUFDQSxNQUFPLFVBQVUsS0FBSyxJQUFJLEVBQUUsUUFBUSxLQUFLO0FBQUEsUUFDdkMsS0FBSyxFQUFFLE1BQU0sS0FBSyxLQUFLO0FBQUEsUUFDdkIsUUFBUSxLQUFLO0FBQUEsUUFDYixLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQUEsTUFDdEI7QUFBQSxNQUdBLElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxVQUFVLE1BQU0sTUFBTTtBQUFBLFFBQzdDLE1BQU8sSUFBSSxFQUFFLFFBQVEsS0FBSztBQUFBLFVBQ3hCLEtBQUssTUFBTSxLQUFLLEVBQUUsTUFBTTtBQUFBLFFBQzFCO0FBQUEsTUFDRjtBQUFBLE1BRUEsS0FBSyxTQUFTLEtBQUssSUFBSSxLQUFLLFFBQVEsQ0FBQztBQUFBLE1BRXJDLElBQUksTUFBTSxNQUFNO0FBQUEsUUFDZCxLQUFLLFdBQVc7QUFBQSxNQUNsQjtBQUFBLE1BRUEsT0FBTyxLQUFLLE1BQU07QUFBQTtBQUFBLElBSXBCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssTUFBTSxFQUFFLEtBQUssR0FBRztBQUFBO0FBQUEsSUFHOUIsU0FBUyxVQUFXLENBQUMsT0FBTSxLQUFLLEtBQUs7QUFBQSxNQUNuQyxJQUFJLFdBQVcsSUFBSSxXQUFXLE1BQUs7QUFBQSxNQUNuQyxJQUFJLE1BQU8sTUFBSyxTQUFTLElBQUksU0FBVTtBQUFBLE1BQ3ZDLElBQUksU0FBUztBQUFBLE1BQ2IsTUFBTyxNQUFNLElBQUs7QUFBQSxNQUdsQixJQUFJLElBQUksTUFBSyxNQUFNLEtBQUs7QUFBQSxNQUN4QixJQUFJLElBQUksSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUN2QixJQUFJLElBQUksSUFBSTtBQUFBLE1BRVosSUFBSSxLQUFLLElBQUk7QUFBQSxNQUNiLElBQUksUUFBUyxJQUFJLFdBQWE7QUFBQSxNQUM5QixJQUFJLE1BQU0sS0FBSztBQUFBLE1BRWYsU0FBUyxJQUFJLEVBQUcsSUFBSSxLQUFLLEtBQUs7QUFBQSxRQUc1QixJQUFJLFNBQVMsVUFBVTtBQUFBLFFBQ3ZCLElBQUksUUFBUSxRQUFRO0FBQUEsUUFDcEIsSUFBSSxPQUFPLEtBQUssSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDO0FBQUEsUUFDckMsU0FBUyxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksTUFBSyxTQUFTLENBQUMsRUFBRyxLQUFLLE1BQU0sS0FBSztBQUFBLFVBQzdELElBQUksSUFBSyxJQUFJLElBQUs7QUFBQSxVQUNsQixJQUFJLE1BQUssTUFBTSxLQUFLO0FBQUEsVUFDcEIsSUFBSSxJQUFJLE1BQU0sS0FBSztBQUFBLFVBQ25CLElBQUksSUFBSSxJQUFJO0FBQUEsVUFDWixVQUFXLElBQUksV0FBYTtBQUFBLFVBQzVCLFFBQVEsSUFBSTtBQUFBLFFBQ2Q7QUFBQSxRQUNBLElBQUksTUFBTSxLQUFLLFFBQVE7QUFBQSxRQUN2QixRQUFRLFNBQVM7QUFBQSxNQUNuQjtBQUFBLE1BQ0EsSUFBSSxVQUFVLEdBQUc7QUFBQSxRQUNmLElBQUksTUFBTSxLQUFLLFFBQVE7QUFBQSxNQUN6QixFQUFPO0FBQUEsUUFDTCxJQUFJO0FBQUE7QUFBQSxNQUdOLE9BQU8sSUFBSSxNQUFNO0FBQUE7QUFBQSxJQU1uQixJQUFJLGNBQWMsU0FBUyxXQUFZLENBQUMsT0FBTSxLQUFLLEtBQUs7QUFBQSxNQUN0RCxJQUFJLElBQUksTUFBSztBQUFBLE1BQ2IsSUFBSSxJQUFJLElBQUk7QUFBQSxNQUNaLElBQUksSUFBSSxJQUFJO0FBQUEsTUFDWixJQUFJLElBQUk7QUFBQSxNQUNSLElBQUk7QUFBQSxNQUNKLElBQUk7QUFBQSxNQUNKLElBQUk7QUFBQSxNQUNKLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFFakIsSUFBSSxXQUFXLE1BQUssV0FBVyxJQUFJO0FBQUEsTUFDbkMsSUFBSSxTQUFTO0FBQUEsTUFFYixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxPQUFTLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDdEQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLFFBQVEsTUFBTztBQUFBLE1BQ2pELE9BQU87QUFBQSxNQUVQLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxPQUFTLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDdEQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLFFBQVEsTUFBTztBQUFBLE1BQ2pELE9BQU87QUFBQSxNQUVQLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsSUFBSSxPQUFTLElBQUksS0FBTSxP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LEdBQUc7QUFBQSxVQUNULE1BQU07QUFBQSxRQUNSLEVBQU8sU0FBSSxJQUFJLEdBQUc7QUFBQSxVQUNoQixNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsTUFDQSxPQUFPO0FBQUE7QUFBQSxJQUdULEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssS0FBSyxHQUFHLE1BQU07QUFBQTtBQUFBLElBRzVCLEdBQUcsVUFBVSxLQUFLLFNBQVMsRUFBRyxDQUFDLEtBQUs7QUFBQSxNQUNsQyxPQUFPLEtBQUssSUFBSSxHQUFHLE1BQU07QUFBQTtBQUFBLElBRzNCLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLEtBQUs7QUFBQSxNQUN0QyxPQUFPLEtBQUssS0FBSyxHQUFHLEtBQUs7QUFBQTtBQUFBLElBRzNCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssSUFBSSxHQUFHLEtBQUs7QUFBQTtBQUFBLElBRzFCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssS0FBSyxHQUFHLE1BQU07QUFBQTtBQUFBLElBRzVCLEdBQUcsVUFBVSxLQUFLLFNBQVMsRUFBRyxDQUFDLEtBQUs7QUFBQSxNQUNsQyxPQUFPLEtBQUssSUFBSSxHQUFHLE1BQU07QUFBQTtBQUFBLElBRzNCLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLEtBQUs7QUFBQSxNQUN0QyxPQUFPLEtBQUssS0FBSyxHQUFHLEtBQUs7QUFBQTtBQUFBLElBRzNCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssSUFBSSxHQUFHLEtBQUs7QUFBQTtBQUFBLElBRzFCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssS0FBSyxHQUFHLE1BQU07QUFBQTtB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QUksS0FBSyxLQUFLLEVBQUUsT0FBTztBQUFBLE1BRXZCLElBQUksS0FBSyxLQUFLLEVBQUUsT0FBTztBQUFBLE1BRXZCLElBQUksT0FBTyxHQUFHLE9BQU87QUFBQSxNQUVyQixJQUFJLElBQUksS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLElBQUk7QUFBQSxNQUMzRCxJQUFJLEVBQUUsUUFBUSxDQUFDO0FBQUEsTUFFZixJQUFJLElBQUksR0FBRyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEtBQUssTUFBTSxDQUFDO0FBQUEsTUFFdEQsSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQztBQUFBLE1BRXZDLEtBQUs7QUFBQSxNQUVMLElBQUksUUFBUSxLQUFLLFFBQVEsSUFBSTtBQUFBLE1BQzdCLFFBQVEsTUFBTSxRQUFRLEtBQUs7QUFBQSxNQUMzQixRQUFRLE1BQU0sUUFBUSxLQUFLO0FBQUEsTUFDM0IsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsS0FBSztBQUFBLE1BRXpDLEtBQUssS0FBSyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQUEsSUFDM0IsRUFBTztBQUFBLE1BS0wsSUFBSSxRQUFRLEtBQUssRUFBRSxPQUFPO0FBQUEsTUFFMUIsSUFBSSxRQUFRLEtBQUssRUFBRSxPQUFPO0FBQUEsTUFFMUIsSUFBSSxPQUFPLEtBQUssRUFBRSxPQUFPLEtBQUs7QUFBQSxNQUU5QixJQUFJLFFBQVEsS0FBSyxFQUFFLE9BQU8sS0FBSyxFQUFFLE9BQU8sS0FBSyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQUEsTUFDNUQsUUFBUSxNQUFNLE9BQU8sS0FBSyxFQUFFLFFBQVEsS0FBSztBQUFBLE1BRXpDLElBQUksUUFBUSxLQUFLLFFBQVEsSUFBSTtBQUFBLE1BQzdCLFFBQVEsTUFBTSxRQUFRLEtBQUs7QUFBQSxNQUMzQixJQUFJLFFBQVEsTUFBTSxPQUFP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QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsRUFDdEM7QUFBQSxFQUVBLFNBQVMsTUFBTSxHQUFHO0FBQUEsSUFDaEIsTUFBTSxnQkFBZ0I7QUFBQSxNQUNwQixPQUFPLElBQUk7QUFBQSxJQUViLFVBQVUsS0FBSyxJQUFJO0FBQUEsSUFDbkIsS0FBSyxJQUFJO0FBQUEsTUFDUDtBQUFBLE1BQVk7QUFBQSxNQUFZO0FBQUEsTUFBWTtBQUFBLE1BQ3BDO0FBQUEsTUFBWTtBQUFBLE1BQVk7QUFBQSxNQUFZO0FBQUEsSUFDdEM7QUFBQSxJQUNBLEtBQUssSUFBSTtBQUFBLElBQ1QsS0FBSyxJQUFJLElBQUksTUFBTSxFQUFFO0FBQUE7QUFBQSxFQUV2QixNQUFNLFNBQVMsUUFBUSxTQUFTO0FBQUEsRUFDaEMsT0FBTyxVQUFVO0FBQUEsRUFFakIsT0FBTyxZQUFZO0FBQUEsRUFDbkIsT0FBTyxVQUFVO0FBQUEsRUFDakIsT0FBTyxlQUFlO0FBQUEs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QUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFB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QUFLO0FBQUEsSUFFYixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFFaEIsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU07QUFBQSxJQUNqQyxTQUFTLElBQUksRUFBRyxJQUFJLEVBQUUsUUFBUSxLQUFLLEdBQUc7QUFBQSxNQUNwQyxJQUFJLFFBQVE7QUFBQSxNQUNaLElBQUksUUFBUTtBQUFBLE1BQ1osSUFBSSxRQUFRLFVBQVUsSUFBSSxFQUFFO0FBQUEsTUFDNUIsSUFBSSxRQUFRLFVBQVUsSUFBSSxFQUFFO0FBQUEsTUFDNUIsSUFBSSxRQUFRLFFBQVEsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7QUFBQSxNQUMxQyxJQUFJLFFBQVEsUUFBUSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtBQUFBLE1BQzFDLElBQUksUUFBUSxLQUFLLEVBQUU7QUFBQSxNQUNuQixJQUFJLFFBQVEsS0FBSyxFQUFFLElBQUk7QUFBQSxNQUN2QixJQUFJLFFB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QUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFDbkQ7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUNsRDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ25EO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsRUFDcEQ7QUFBQSxFQUVBLElBQUksS0FBSztBQUFBLElBQ1A7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUNsRDtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ25EO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDbEQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUNsRDtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLEVBQ3BEO0FBQUEsRUFFQSxJQUFJLElBQUk7QUFBQSxJQUNOO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDckQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUNwRDtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQ3JEO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDcEQ7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxFQUN2RDtBQUFBLEVBRUEsSUFBSSxLQUFLO0FBQUEsSUFDUDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQ3JEO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFDcEQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJ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RTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxLQUFLO0FBQUEsTUFDSCxLQUFLO0FBQUEsTUFDTCxRQUFRO0FBQUEsUUFDTjtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBOzs7O0VDendCQSxJQUFJLFNBQVM7QUFBQSxFQUViLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVKLElBQUksU0FBUyxNQUFNO0FBQUEsRUFFbkIsU0FBUyxXQUFXLENBQUMsVUFBUztBQUFBLElBQzVCLElBQUksU0FBUSxTQUFTO0FBQUEsTUFDbkIsS0FBSyxRQUFRLElBQUksTUFBTSxNQUFNLFFBQU87QUFBQSxJQUNqQyxTQUFJLFNBQVEsU0FBUztBQUFBLE1BQ3hCLEtBQUssUUFBUSxJQUFJLE1BQU0sUUFBUSxRQUFPO0FBQUEsSUFFdEM7QUFBQSxXQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssUUFBTztBQUFBLElBQ3JDLEtBQUssSUFBSSxLQUFLLE1BQU07QUFBQSxJQUNwQixLQUFLLElBQUksS0FBSyxNQUFNO0FBQUEsSUFDcEIsS0FBSyxPQUFPLFNBQVE7QUFBQSxJQUVwQixPQUFPLEtBQUssRUFBRSxTQUFTLEdBQUcsZUFBZTtBQUFBLElBQ3pDLE9BQU8sS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLEVBQUUsV0FBVyxHQUFHLHlCQUF5QjtBQUFBO0FBQUEsRUFFbkUsT0FBTyxjQUFjO0FBQUEsRUFFckIsU0FBUyxXQUFXLENBQUMsTUFBTSxVQUFTO0FBQUEsSUFDbEMsT0FBTyxlQUFlLFFBQVEsTUFBTTtBQUFBLE1BQ2xDLGNBQWM7QUFBQSxNQUNkLFlBQVk7QUFBQSxNQUNaLEtBQUssUUFBUSxHQUFHO0FBQUEsUUFDZCxJQUFJLFNBQVEsSUFBSSxZQUFZLFFBQU87QUFBQSxRQUNuQyxPQUFPLGVBQWUsUUFBUSxNQUFNO0FBQUEsVUFDbEMsY0FBYztBQUFBLFVBQ2QsWUFBWTtBQUFBLFVBQ1osT0FBTztBQUFBLFFBQ1QsQ0FBQztBQUFBLFFBQ0QsT0FBTztBQUFBO0FBQUEsSUFFWCxDQUFDO0FBQUE7QUFBQSxFQUdILFlBQVksUUFBUTtBQUFBLElBQ2xCLE1BQU07QUFBQSxJQUNOLE9BQU87QUFBQSxJQUNQLEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILE1BQU0sS0FBSztBQUFBLElBQ1gsTUFBTTtBQUFBLElBQ04sR0FBRztBQUFBLE1BQ0Q7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUFBLEVBRUQsWUFBWSxRQUFRO0FBQUEsSUFDbEIsTUFBTTtBQUFBLElBQ04sT0FBTztBQUFBLElBQ1AsR0FBRztBQUFBLElBQ0gsR0FBRztBQUFBLElBQ0gsR0FBRztBQUFBLElBQ0gsR0FBRztBQUFBLElBQ0gsTUFBTSxLQUFLO0FBQUEsSUFDWCxNQUFNO0FBQUEsSUFDTixHQUFHO0FBQUEsTUFDRDtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBQUEsRUFFRCxZQUFZLFFBQVE7QUFBQSxJQUNsQixNQUFNO0FBQUEsSUFDTixPQUFPO0FBQUEsSUFDUCxHQUFHO0FBQUEsSUFDSCxHQUFHO0FBQUEsSUFDSCxHQUFHO0FBQUEsSUFDSCxHQUFHO0FBQUEsSUFDSCxNQUFNLEtBQUs7QUFBQSxJQUNYLE1BQU07QUFBQSxJQUNOLEdBQUc7QUFBQSxNQUNEO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFBQSxFQUVELFlBQVksUUFBUTtBQUFBLElBQ2xCLE1BQU07QUFBQSxJQUNOLE9BQU87QUFBQSxJQUNQLEdBQUcsb0VBQ0E7QUFBQSxJQUNILEdBQUcsb0VBQ0E7QUFBQSxJQUNILEdBQUcsb0VBQ0E7QUFBQSxJQUNILEdBQUcsb0VBQ0E7QUFBQSxJQUNILE1BQU0sS0FBSztBQUFBLElBQ1gsTUFBTTtBQUFBLElBQ04sR0FBRztBQUFBLE1BQ0QsNkVBQ0E7QUFBQSxNQUNBLDZFQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUFBLEVBRUQsWUFBWSxRQUFRO0FBQUEsSUFDbEIsTUFBTTtBQUFBLElBQ04sT0FBTztBQUFBLElBQ1AsR0FBRywyREFDQSwyREFDQTtBQUFBLElBQ0gsR0FBRywyREFDQSwyREFDQTtBQUFBLElBQ0gsR0FBRywyREFDQSwyREFDQTtBQUFBLElBQ0gsR0FBRywyREFDQSwyREFDQTtBQUFBLElBQ0gsTUFBTSxLQUFLO0FBQUEsSUFDWCxNQUFNO0FBQUEsSUFDTixHQUFHO0FBQUEsTUFDRCwyREFDQSwyREFDQTtBQUFBLE1BQ0EsMkRBQ0EsMkRBQ0E7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBQUEsRUFFRCxZQUFZLGNBQWM7QUFBQSxJQUN4QixNQUFNO0FBQUEsSUFDTixPQUFPO0FBQUEsSUFDUCxHQUFHO0FBQUEsSUFDSCxHQUFHO0FBQUEsSUFDSCxHQUFHO0FBQUEsSUFDSCxHQUFHO0FBQUEsSUFDSCxNQUFNLEtBQUs7QUFBQSxJQUNYLE1BQU07QUFBQSxJQUNOLEdBQUc7QUFBQSxNQUNEO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUFBLEVBRUQsWUFBWSxXQUFXO0FBQUEsSUFDckIsTUFBTTtBQUFBLElBQ04sT0FBTztBQUFBLElBQ1AsR0FBRztBQUFBLElBQ0gsR0FBRztBQUFBLElBQ0gsR0FBRztBQUFBLElBRUgsR0FBRztBQUFBLElBQ0gsR0FBRztBQUFBLElBQ0gsTUFBTSxLQUFLO0FBQUEsSUFDWCxNQUFNO0FBQUEsSUFDTixHQUFHO0FBQUEsTUFDRDtBQUFBLE1BR0E7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBQUEsRUFFRCxJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTyxHQUFHO0FBQUEsSUFDVixNQUFNO0FBQUE7QUFBQSxFQUdSLFlBQVksYUFBYTtBQUFBLElBQ3ZCLE1BQU07QUFBQSxJQUNOLE9BQU87QUFBQSxJQUNQLEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILE1BQU0sS0FBSztBQUFBLElBR1gsTUFBTTtBQUFBLElBQ04sUUFBUTtBQUFBLElBQ1IsT0FBTztBQUFBLE1BQ0w7QUFBQSxRQUNFLEdBQUc7QUFBQSxRQUNILEdBQUc7QUFBQSxNQUNMO0FBQUEsTUFDQTtBQUFBLFFBQ0UsR0FBRztBQUFBLFFBQ0gsR0FBRztBQUFBLE1BQ0w7QUFBQSxJQUNGO0FBQUEsSUFFQSxNQUFNO0FBQUEsSUFDTixHQUFHO0FBQUEsTUFDRDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUFBOzs7O0VDM01ELElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVKLFNBQVMsUUFBUSxDQUFDLFVBQVM7QUFBQSxJQUN6QixNQUFNLGdCQUFnQjtBQUFBLE1BQ3BCLE9BQU8sSUFBSSxTQUFTLFFBQU87QUFBQSxJQUM3QixLQUFLLE9BQU8sU0FBUTtBQUFBLElBQ3BCLEtBQUssZUFBZSxTQUFRO0FBQUEsSUFFNUIsS0FBSyxTQUFTLEtBQUssS0FBSztBQUFBLElBQ3hCLEtBQUssYUFBYSxTQUFRLGNBQWMsS0FBSyxLQUFLO0FBQUEsSUFFbEQsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLGlCQUFpQjtBQUFBLElBQ3RCLEtBQUssSUFBSTtBQUFBLElBQ1QsS0FBSyxJQUFJO0FBQUEsSUFFVCxJQUFJLFVBQVUsTUFBTSxRQUFRLFNBQVEsU0FBUyxTQUFRLGNBQWMsS0FBSztBQUFBLElBQ3hFLElBQUksUUFBUSxNQUFNLFFBQVEsU0FBUSxPQUFPLFNBQVEsWUFBWSxLQUFLO0FBQUEsSUFDbEUsSUFBSSxPQUFPLE1BQU0sUUFBUSxTQUFRLE1BQU0sU0FBUSxXQUFXLEtBQUs7QUFBQSxJQUMvRCxPQUFPLFFBQVEsVUFBVyxLQUFLLGFBQWEsR0FDckMscUNBQXFDLEtBQUssYUFBYSxPQUFPO0FBQUEsSUFDckUsS0FBSyxNQUFNLFNBQVMsT0FBTyxJQUFJO0FBQUE7QUFBQSxFQUVqQyxPQUFPLFVBQVU7QUFBQSxFQUVqQixTQUFTLFVBQVUsUUFBUSxTQUFTLElBQUksQ0FBQyxTQUFTLE9BQU8sTUFBTTtBQUFBLElBQzdELElBQUksT0FBTyxRQUFRLE9BQU8sS0FBSyxFQUFFLE9BQU8sSUFBSTtBQUFBLElBRTVDLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTLENBQUM7QUFBQSxJQUNsQyxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDbEMsU0FBUyxJQUFJLEVBQUcsSUFBSSxLQUFLLEVBQUUsUUFBUSxLQUFLO0FBQUEsTUFDdEMsS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNaLEtBQUssRUFBRSxLQUFLO0FBQUEsSUFDZDtBQUFBLElBRUEsS0FBSyxRQUFRLElBQUk7QUFBQSxJQUNqQixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssaUJBQWlCO0FBQUE7QUFBQSxFQUd4QixTQUFTLFVBQVUsUUFBUSxTQUFTLElBQUksR0FBRztBQUFBLElBQ3pDLE9BQU8sSUFBSSxLQUFLLEtBQUssS0FBSyxNQUFNLEtBQUssQ0FBQztBQUFBO0FBQUEsRUFHeEMsU0FBUyxVQUFVLFVBQVUsU0FBUyxNQUFNLENBQUMsTUFBTTtBQUFBLElBQ2pELElBQUksT0FBTyxLQUFLLE1BQU0sRUFDTixPQUFPLEtBQUssQ0FBQyxFQUNiLE9BQU8sQ0FBRSxDQUFLLENBQUM7QUFBQSxJQUMvQixJQUFJO0FBQUEsTUFDRixPQUFPLEtBQUssT0FBTyxJQUFJO0FBQUEsSUFDekIsS0FBSyxJQUFJLEtBQUssT0FBTztBQUFBLElBQ3JCLEtBQUssSUFBSSxLQUFLLE1BQU0sRUFBRSxPQUFPLEtBQUssQ0FBQyxFQUFFLE9BQU87QUFBQSxJQUM1QyxLQUFLO0FBQUEsTUFDSDtBQUFBLElBRUYsS0FBSyxJQUFJLEtBQUssTUFBTSxFQUNOLE9BQU8sS0FBSyxDQUFDLEVBQ2IsT0FBTyxDQUFFLENBQUssQ0FBQyxFQUNmLE9BQU8sSUFBSSxFQUNYLE9BQU87QUFBQSxJQUNyQixLQUFLLElBQUksS0FBSyxNQUFNLEVBQUUsT0FBTyxLQUFLLENBQUMsRUFBRSxPQUFPO0FBQUE7QUFBQSxFQUc5QyxTQUFTLFVBQVUsU0FBUyxTQUFTLE1BQU0sQ0FBQyxTQUFTLFlBQVksS0FBSyxRQUFRO0FBQUEsSUFFNUUsSUFBSSxPQUFPLGVBQWUsVUFBVTtBQUFBLE1BQ2xDLFNBQVM7QUFBQSxNQUNULE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFFQSxVQUFVLE1BQU0sUUFBUSxTQUFTLFVBQVU7QUFBQSxJQUMzQyxNQUFNLE1BQU0sUUFBUSxLQUFLLE1BQU07QUFBQSxJQUUvQixPQUFPLFFBQVEsVUFBVyxLQUFLLGFBQWEsR0FDckMscUNBQXFDLEtBQUssYUFBYSxPQUFPO0FBQUEsSUFFckUsS0FBSyxRQUFRLFFBQVEsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQUEsSUFDdEMsS0FBSyxVQUFVO0FBQUE7QUFBQSxFQUdqQixTQUFTLFVBQVUsV0FBVyxTQUFTLFFBQVEsQ0FBQyxLQUFLLEtBQUssS0FBSyxRQUFRO0FBQUEsSUFDckUsSUFBSSxLQUFLLFVBQVUsS0FBSztBQUFBLE1BQ3RCLE1BQU0sSUFBSSxNQUFNLG9CQUFvQjtBQUFBLElBR3RDLElBQUksT0FBTyxRQUFRLFVBQVU7QUFBQSxNQUMzQixTQUFTO0FBQUEsTUFDVCxNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsSUFDUjtBQUFBLElBR0EsSUFBSSxLQUFLO0FBQUEsTUFDUCxNQUFNLE1BQU0sUUFBUSxLQUFLLFVBQVUsS0FBSztBQUFBLE1BQ3hDLEtBQUssUUFBUSxHQUFHO0FBQUEsSUFDbEI7QUFBQSxJQUVBLElBQUksT0FBTyxDQUFDO0FBQUEsSUFDWixPQUFPLEtBQUssU0FBUyxLQUFLO0FBQUEsTUFDeEIsS0FBSyxJQUFJLEtBQUssTUFBTSxFQUFFLE9BQU8sS0FBSyxDQUFDLEVBQUUsT0FBTztBQUFBLE1BQzVDLE9BQU8sS0FBSyxPQUFPLEtBQUssQ0FBQztBQUFBLElBQzNCO0FBQUEsSUFFQSxJQUFJLE1BQU0sS0FBSyxNQUFNLEdBQUcsR0FBRztBQUFBLElBQzNCLEtBQUssUUFBUSxHQUFHO0FBQUEsSUFDaEIsS0FBSztBQUFBLElBQ0wsT0FBTyxNQUFNLE9BQU8sS0FBSyxHQUFHO0FBQUE7QUFBQTs7OztFQzdHOUIsSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSSxTQUFTLE1BQU07QUFBQSxFQUVuQixTQUFTLE9BQU8sQ0FBQyxJQUFJLFVBQVM7QUFBQSxJQUM1QixLQUFLLEtBQUs7QUFBQSxJQUNWLEtBQUssT0FBTztBQUFBLElBQ1osS0FBSyxNQUFNO0FBQUEsSUFHWCxJQUFJLFNBQVE7QUFBQSxNQUNWLEtBQUssZUFBZSxTQUFRLE1BQU0sU0FBUSxPQUFPO0FBQUEsSUFDbkQsSUFBSSxTQUFRO0FBQUEsTUFDVixLQUFLLGNBQWMsU0FBUSxLQUFLLFNBQVEsTUFBTTtBQUFBO0FBQUEsRUFFbEQsT0FBTyxVQUFVO0FBQUEsRUFFakIsUUFBUSxhQUFhLFNBQVMsVUFBVSxDQUFDLElBQUksS0FBSyxLQUFLO0FBQUEsSUFDckQsSUFBSSxlQUFlO0FBQUEsTUFDakIsT0FBTztBQUFBLElBRVQsT0FBTyxJQUFJLFFBQVEsSUFBSTtBQUFBLE1BQ3JCO0FBQUEsTUFDQSxRQUFRO0FBQUEsSUFDVixDQUFDO0FBQUE7QUFBQSxFQUdILFFBQVEsY0FBYyxTQUFTLFdBQVcsQ0FBQyxJQUFJLE1BQU0sS0FBSztBQUFBLElBQ3hELElBQUksZ0JBQWdCO0FBQUEsTUFDbEIsT0FBTztBQUFBLElBRVQsT0FBTyxJQUFJLFFBQVEsSUFBSTtBQUFBLE1BQ3JCO0FBQUEsTUFDQSxTQUFTO0FBQUEsSUFDWCxDQUFDO0FBQUE7QUFBQSxFQUdILFFBQVEsVUFBVSxXQUFXLFNBQVMsUUFBUSxHQUFHO0FBQUEsSUFDL0MsSUFBSSxNQUFNLEtBQUssVUFBVTtBQUFBLElBRXpCLElBQUksSUFBSSxXQUFXO0FBQUEsTUFDakIsT0FBTyxFQUFFLFFBQVEsT0FBTyxRQUFRLHFCQUFxQjtBQUFBLElBQ3ZELEtBQUssSUFBSSxTQUFTO0FBQUEsTUFDaEIsT0FBTyxFQUFFLFFBQVEsT0FBTyxRQUFRLDRCQUE0QjtBQUFBLElBQzlELEtBQUssSUFBSSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxXQUFXO0FBQUEsTUFDdkMsT0FBTyxFQUFFLFFBQVEsT0FBTyxRQUFRLHNCQUFzQjtBQUFBLElBRXhELE9BQU8sRUFBRSxRQUFRLE1BQU0sUUFBUSxLQUFLO0FBQUE7QUFBQSxFQUd0QyxRQUFRLFVBQVUsWUFBWSxTQUFTLFNBQVMsQ0FBQyxTQUFTLEtBQUs7QUFBQSxJQUU3RCxJQUFJLE9BQU8sWUFBWSxVQUFVO0FBQUEsTUFDL0IsTUFBTTtBQUFBLE1BQ04sVUFBVTtBQUFBLElBQ1o7QUFBQSxJQUVBLEtBQUssS0FBSztBQUFBLE1BQ1IsS0FBSyxNQUFNLEtBQUssR0FBRyxFQUFFLElBQUksS0FBSyxJQUFJO0FBQUEsSUFFcEMsS0FBSztBQUFBLE1BQ0gsT0FBTyxLQUFLO0FBQUEsSUFFZCxPQUFPLEtBQUssSUFBSSxPQUFPLEtBQUssT0FBTztBQUFBO0FBQUEsRUFHckMsUUFBUSxVQUFVLGFBQWEsU0FBUyxVQUFVLENBQUMsS0FBSztBQUFBLElBQ3RELElBQUksUUFBUTtBQUFBLE1BQ1YsT0FBTyxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUM7QUFBQSxJQUUvQjtBQUFBLGFBQU8sS0FBSztBQUFBO0FBQUEsRUFHaEIsUUFBUSxVQUFVLGlCQUFpQixTQUFTLGNBQWMsQ0FBQyxLQUFLLEtBQUs7QUFBQSxJQUNuRSxLQUFLLE9BQU8sSUFBSSxHQUFHLEtBQUssT0FBTyxFQUFFO0FBQUEsSUFJakMsS0FBSyxPQUFPLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxNQUFNLENBQUM7QUFBQTtBQUFBLEVBRzVDLFFBQVEsVUFBVSxnQkFBZ0IsU0FBUyxhQUFhLENBQUMsS0FBSyxLQUFLO0FBQUEsSUFDakUsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHO0FBQUEsTUFJbEIsSUFBSSxLQUFLLEdBQUcsTUFBTSxTQUFTLFFBQVE7QUFBQSxRQUNqQyxPQUFPLElBQUksR0FBRyxtQkFBbUI7QUFBQSxNQUNuQyxFQUFPLFNBQUksS0FBSyxHQUFHLE1BQU0sU0FBUyxXQUN2QixLQUFLLEdBQUcsTUFBTSxTQUFTLFdBQVc7QUFBQSxRQUMzQyxPQUFPLElBQUksS0FBSyxJQUFJLEdBQUcsOEJBQThCO0FBQUEsTUFDdkQ7QUFBQSxNQUNBLEtBQUssTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7QUFBQSxNQUMzQztBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUssTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLEtBQUssR0FBRztBQUFBO0FBQUEsRUFJL0MsUUFBUSxVQUFVLFNBQVMsU0FBUyxNQUFNLENBQUMsS0FBSztBQUFBLElBQzlDLEtBQUksSUFBSSxTQUFTLEdBQUc7QUFBQSxNQUNsQixPQUFPLElBQUksU0FBUyxHQUFHLDRCQUE0QjtBQUFBLElBQ3JEO0FBQUEsSUFDQSxPQUFPLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxLQUFLO0FBQUE7QUFBQSxFQUlqQyxRQUFRLFVBQVUsT0FBTyxTQUFTLElBQUksQ0FBQyxLQUFLLEtBQUssVUFBUztBQUFBLElBQ3hELE9BQU8sS0FBSyxHQUFHLEtBQUssS0FBSyxNQUFNLEtBQUssUUFBTztBQUFBO0FBQUEsRUFHN0MsUUFBUSxVQUFVLFNBQVMsU0FBUyxNQUFNLENBQUMsS0FBSyxXQUFXLFVBQVM7QUFBQSxJQUNsRSxPQUFPLEtBQUssR0FBRyxPQUFPLEtBQUssV0FBVyxNQUFNLFdBQVcsUUFBTztBQUFBO0FBQUEsRUFHaEUsUUFBUSxVQUFVLFVBQVUsU0FBUyxPQUFPLEdBQUc7QUFBQSxJQUM3QyxPQUFPLGlCQUFpQixLQUFLLFFBQVEsS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQ3RELFlBQVksS0FBSyxPQUFPLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQTtBQUFBOzs7O0VDckh2RCxJQUFJO0FBQUEsRUFFSixJQUFJO0FBQUEsRUFDSixJQUFJLFNBQVMsTUFBTTtBQUFBLEVBRW5CLFNBQVMsU0FBUyxDQUFDLFVBQVMsS0FBSztBQUFBLElBQy9CLElBQUksb0JBQW1CO0FBQUEsTUFDckIsT0FBTztBQUFBLElBRVQsSUFBSSxLQUFLLFdBQVcsVUFBUyxHQUFHO0FBQUEsTUFDOUI7QUFBQSxJQUVGLE9BQU8sU0FBUSxLQUFLLFNBQVEsR0FBRywwQkFBMEI7QUFBQSxJQUN6RCxLQUFLLElBQUksSUFBSSxHQUFHLFNBQVEsR0FBRyxFQUFFO0FBQUEsSUFDN0IsS0FBSyxJQUFJLElBQUksR0FBRyxTQUFRLEdBQUcsRUFBRTtBQUFBLElBQzdCLElBQUksU0FBUSxrQkFBa0I7QUFBQSxNQUM1QixLQUFLLGdCQUFnQjtBQUFBLElBRXJCO0FBQUEsV0FBSyxnQkFBZ0IsU0FBUTtBQUFBO0FBQUEsRUFFakMsT0FBTyxVQUFVO0FBQUEsRUFFakIsU0FBUyxRQUFRLEdBQUc7QUFBQSxJQUNsQixLQUFLLFFBQVE7QUFBQTtBQUFBLEVBR2YsU0FBUyxTQUFTLENBQUMsS0FBSyxHQUFHO0FBQUEsSUFDekIsSUFBSSxVQUFVLElBQUksRUFBRTtBQUFBLElBQ3BCLE1BQU0sVUFBVSxNQUFPO0FBQUEsTUFDckIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLElBQUksV0FBVyxVQUFVO0FBQUEsSUFHekIsSUFBSSxhQUFhLEtBQUssV0FBVyxHQUFHO0FBQUEsTUFDbEMsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLElBQUcsSUFBSSxFQUFFLFdBQVcsR0FBTTtBQUFBLE1BQ3hCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxJQUFJLE1BQU07QUFBQSxJQUNWLFNBQVMsSUFBSSxHQUFHLE1BQU0sRUFBRSxNQUFPLElBQUksVUFBVSxLQUFLLE9BQU87QUFBQSxNQUN2RCxRQUFRO0FBQUEsTUFDUixPQUFPLElBQUk7QUFBQSxNQUNYLFNBQVM7QUFBQSxJQUNYO0FBQUEsSUFHQSxJQUFJLE9BQU8sS0FBTTtBQUFBLE1BQ2YsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLEVBQUUsUUFBUTtBQUFBLElBQ1YsT0FBTztBQUFBO0FBQUEsRUFHVCxTQUFTLFNBQVMsQ0FBQyxLQUFLO0FBQUEsSUFDdEIsSUFBSSxJQUFJO0FBQUEsSUFDUixJQUFJLE1BQU0sSUFBSSxTQUFTO0FBQUEsSUFDdkIsUUFBUSxJQUFJLFFBQVEsSUFBSSxJQUFJLEtBQUssUUFBUyxJQUFJLEtBQUs7QUFBQSxNQUNqRDtBQUFBLElBQ0Y7QUFBQSxJQUNBLElBQUksTUFBTSxHQUFHO0FBQUEsTUFDWCxPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsT0FBTyxJQUFJLE1BQU0sQ0FBQztBQUFBO0FBQUEsRUFHcEIsVUFBVSxVQUFVLGFBQWEsU0FBUyxVQUFVLENBQUMsTUFBTSxLQUFLO0FBQUEsSUFDOUQsT0FBTyxNQUFNLFFBQVEsTUFBTSxHQUFHO0FBQUEsSUFDOUIsSUFBSSxJQUFJLElBQUk7QUFBQSxJQUNaLElBQUksS0FBSyxFQUFFLGFBQWEsSUFBTTtBQUFBLE1BQzVCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLE1BQU0sVUFBVSxNQUFNLENBQUM7QUFBQSxJQUMzQixJQUFJLFFBQVEsT0FBTztBQUFBLE1BQ2pCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFLLE1BQU0sRUFBRSxVQUFXLEtBQUssUUFBUTtBQUFBLE1BQ25DLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLEtBQUssRUFBRSxhQUFhLEdBQU07QUFBQSxNQUM1QixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsSUFBSSxPQUFPLFVBQVUsTUFBTSxDQUFDO0FBQUEsSUFDNUIsSUFBSSxTQUFTLE9BQU87QUFBQSxNQUNsQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsS0FBSyxLQUFLLEVBQUUsU0FBUyxTQUFTLEdBQUc7QUFBQSxNQUMvQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFLE9BQU8sT0FBTyxFQUFFLEtBQUs7QUFBQSxJQUMxQyxFQUFFLFNBQVM7QUFBQSxJQUNYLElBQUksS0FBSyxFQUFFLGFBQWEsR0FBTTtBQUFBLE1BQzVCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLE9BQU8sVUFBVSxNQUFNLENBQUM7QUFBQSxJQUM1QixJQUFJLFNBQVMsT0FBTztBQUFBLE1BQ2xCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLEtBQUssV0FBVyxPQUFPLEVBQUUsT0FBTztBQUFBLE1BQ2xDLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxLQUFLLEtBQUssRUFBRSxTQUFTLFNBQVMsR0FBRztBQUFBLE1BQy9CLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLElBQUksS0FBSyxNQUFNLEVBQUUsT0FBTyxPQUFPLEVBQUUsS0FBSztBQUFBLElBQzFDLElBQUksRUFBRSxPQUFPLEdBQUc7QUFBQSxNQUNkLElBQUksRUFBRSxLQUFLLEtBQU07QUFBQSxRQUNmLElBQUksRUFBRSxNQUFNLENBQUM7QUFBQSxNQUNmLEVBQU87QUFBQSxRQUVMLE9BQU87QUFBQTtBQUFBLElBRVg7QUFBQSxJQUNBLElBQUksRUFBRSxPQUFPLEdBQUc7QUFBQSxNQUNkLElBQUksRUFBRSxLQUFLLEtBQU07QUFBQSxRQUNmLElBQUksRUFBRSxNQUFNLENBQUM7QUFBQSxNQUNmLEVBQU87QUFBQSxRQUVMLE9BQU87QUFBQTtBQUFBLElBRVg7QUFBQSxJQUVBLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQztBQUFBLElBQ2pCLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQztBQUFBLElBQ2pCLEtBQUssZ0JBQWdCO0FBQUEsSUFFckIsT0FBTztBQUFBO0FBQUEsRUFHVCxTQUFTLGVBQWUsQ0FBQyxLQUFLLEtBQUs7QUFBQSxJQUNqQyxJQUFJLE1BQU0sS0FBTTtBQUFBLE1BQ2QsSUFBSSxLQUFLLEdBQUc7QUFBQSxNQUNaO0FBQUEsSUFDRjtBQUFBLElBQ0EsSUFBSSxTQUFTLEtBQUssS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVE7QUFBQSxJQUMvQyxJQUFJLEtBQUssU0FBUyxHQUFJO0FBQUEsSUFDdEIsU0FBUyxRQUFRO0FBQUEsTUFDZixJQUFJLEtBQU0sU0FBUyxVQUFVLEtBQU0sR0FBSTtBQUFBLElBQ3pDO0FBQUEsSUFDQSxJQUFJLEtBQUssR0FBRztBQUFBO0FBQUEsRUFHZCxVQUFVLFVBQVUsUUFBUSxTQUFTLEtBQUssQ0FBQyxLQUFLO0FBQUEsSUFDOUMsSUFBSSxJQUFJLEtBQUssRUFBRSxRQUFRO0FBQUEsSUFDdkIsSUFBSSxJQUFJLEtBQUssRUFBRSxRQUFRO0FBQUEsSUFHdkIsSUFBSSxFQUFFLEtBQUs7QUFBQSxNQUNULElBQUksQ0FBRSxDQUFFLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFFcEIsSUFBSSxFQUFFLEtBQUs7QUFBQSxNQUNULElBQUksQ0FBRSxDQUFFLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFFcEIsSUFBSSxVQUFVLENBQUM7QUFBQSxJQUNmLElBQUksVUFBVSxDQUFDO0FBQUEsSUFFZixRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssTUFBTztBQUFBLE1BQzlCLElBQUksRUFBRSxNQUFNLENBQUM7QUFBQSxJQUNmO0FBQUEsSUFDQSxJQUFJLE1BQU0sQ0FBRSxDQUFLO0FBQUEsSUFDakIsZ0JBQWdCLEtBQUssRUFBRSxNQUFNO0FBQUEsSUFDN0IsTUFBTSxJQUFJLE9BQU8sQ0FBQztBQUFBLElBQ2xCLElBQUksS0FBSyxDQUFJO0FBQUEsSUFDYixnQkFBZ0IsS0FBSyxFQUFFLE1BQU07QUFBQSxJQUM3QixJQUFJLFdBQVcsSUFBSSxPQUFPLENBQUM7QUFBQSxJQUMzQixJQUFJLE1BQU0sQ0FBRSxFQUFLO0FBQUEsSUFDakIsZ0JBQWdCLEtBQUssU0FBUyxNQUFNO0FBQUEsSUFDcEMsTUFBTSxJQUFJLE9BQU8sUUFBUTtBQUFBLElBQ3pCLE9BQU8sTUFBTSxPQUFPLEtBQUssR0FBRztBQUFBO0FBQUE7Ozs7RUM1SzlCLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUksU0FBUyxNQUFNO0FBQUEsRUFFbkIsSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBRUosU0FBUyxFQUFFLENBQUMsVUFBUztBQUFBLElBQ25CLE1BQU0sZ0JBQWdCO0FBQUEsTUFDcEIsT0FBTyxJQUFJLEdBQUcsUUFBTztBQUFBLElBR3ZCLElBQUksT0FBTyxhQUFZLFVBQVU7QUFBQSxNQUMvQixPQUFPLE9BQU8sVUFBVSxlQUFlLEtBQUssUUFBUSxRQUFPLEdBQ3pELG1CQUFtQixRQUFPO0FBQUEsTUFFNUIsV0FBVSxPQUFPO0FBQUEsSUFDbkI7QUFBQSxJQUdBLElBQUksb0JBQW1CLE9BQU87QUFBQSxNQUM1QixXQUFVLEVBQUUsT0FBTyxTQUFRO0FBQUEsSUFFN0IsS0FBSyxRQUFRLFNBQVEsTUFBTTtBQUFBLElBQzNCLEtBQUssSUFBSSxLQUFLLE1BQU07QUFBQSxJQUNwQixLQUFLLEtBQUssS0FBSyxFQUFFLE1BQU0sQ0FBQztBQUFBLElBQ3hCLEtBQUssSUFBSSxLQUFLLE1BQU07QUFBQSxJQUdwQixLQUFLLElBQUksU0FBUSxNQUFNO0FBQUEsSUFDdkIsS0FBSyxFQUFFLFdBQVcsU0FBUSxNQUFNLEVBQUUsVUFBVSxJQUFJLENBQUM7QUFBQSxJQUdqRCxLQUFLLE9BQU8sU0FBUSxRQUFRLFNBQVEsTUFBTTtBQUFBO0FBQUEsRUFFNUMsT0FBTyxVQUFVO0FBQUEsRUFFakIsR0FBRyxVQUFVLFVBQVUsU0FBUyxPQUFPLENBQUMsVUFBUztBQUFBLElBQy9DLE9BQU8sSUFBSSxRQUFRLE1BQU0sUUFBTztBQUFBO0FBQUEsRUFHbEMsR0FBRyxVQUFVLGlCQUFpQixTQUFTLGNBQWMsQ0FBQyxNQUFNLEtBQUs7QUFBQSxJQUMvRCxPQUFPLFFBQVEsWUFBWSxNQUFNLE1BQU0sR0FBRztBQUFBO0FBQUEsRUFHNUMsR0FBRyxVQUFVLGdCQUFnQixTQUFTLGFBQWEsQ0FBQyxLQUFLLEtBQUs7QUFBQSxJQUM1RCxPQUFPLFFBQVEsV0FBVyxNQUFNLEtBQUssR0FBRztBQUFBO0FBQUEsRUFHMUMsR0FBRyxVQUFVLGFBQWEsU0FBUyxVQUFVLENBQUMsVUFBUztBQUFBLElBQ3JELEtBQUs7QUFBQSxNQUNILFdBQVUsQ0FBQztBQUFBLElBR2IsSUFBSSxPQUFPLElBQUksU0FBUztBQUFBLE1BQ3RCLE1BQU0sS0FBSztBQUFBLE1BQ1gsTUFBTSxTQUFRO0FBQUEsTUFDZCxTQUFTLFNBQVEsV0FBVztBQUFBLE1BQzVCLFNBQVMsU0FBUSxXQUFXLEtBQUssS0FBSyxLQUFLLFlBQVk7QUFBQSxNQUN2RCxZQUFZLFNBQVEsV0FBVyxTQUFRLGNBQWM7QUFBQSxNQUNyRCxPQUFPLEtBQUssRUFBRSxRQUFRO0FBQUEsSUFDeEIsQ0FBQztBQUFBLElBRUQsSUFBSSxRQUFRLEtBQUssRUFBRSxXQUFXO0FBQUEsSUFDOUIsSUFBSSxNQUFNLEtBQUssRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7QUFBQSxJQUM5QixVQUFTO0FBQUEsTUFDUCxJQUFJLE9BQU8sSUFBSSxHQUFHLEtBQUssU0FBUyxLQUFLLENBQUM7QUFBQSxNQUN0QyxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUk7QUFBQSxRQUNsQjtBQUFBLE1BRUYsS0FBSyxNQUFNLENBQUM7QUFBQSxNQUNaLE9BQU8sS0FBSyxlQUFlLElBQUk7QUFBQSxJQUNqQztBQUFBO0FBQUEsRUFHRixHQUFHLFVBQVUsZUFBZSxTQUFTLFlBQVksQ0FBQyxLQUFLLFdBQVcsV0FBVztBQUFBLElBQzNFLElBQUk7QUFBQSxJQUNKLElBQUksR0FBRyxLQUFLLEdBQUcsS0FBSyxPQUFPLFFBQVEsVUFBVTtBQUFBLE1BQzNDLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRTtBQUFBLE1BQ3BCLGFBQWEsSUFBSSxXQUFXO0FBQUEsSUFDOUIsRUFBTyxTQUFJLE9BQU8sUUFBUSxVQUFVO0FBQUEsTUFFbEMsYUFBYSxJQUFJO0FBQUEsTUFDakIsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFO0FBQUEsSUFDdEIsRUFBTztBQUFBLE1BRUwsSUFBSSxNQUFNLElBQUksU0FBUztBQUFBLE1BRXZCLGFBQWMsSUFBSSxTQUFTLE1BQU87QUFBQSxNQUNsQyxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUU7QUFBQTtBQUFBLElBR3RCLElBQUksT0FBTyxjQUFjLFVBQVU7QUFBQSxNQUNqQyxZQUFZLGFBQWE7QUFBQSxJQUMzQjtBQUFBLElBQ0EsSUFBSSxRQUFRLFlBQVksS0FBSyxFQUFFLFVBQVU7QUFBQSxJQUN6QyxJQUFJLFFBQVE7QUFBQSxNQUNWLE1BQU0sSUFBSSxNQUFNLEtBQUs7QUFBQSxJQUN2QixLQUFLLGFBQWEsSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLO0FBQUEsTUFDbkMsT0FBTyxJQUFJLElBQUksS0FBSyxDQUFDO0FBQUEsSUFFckI7QUFBQSxhQUFPO0FBQUE7QUFBQSxFQUdYLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLFVBQVM7QUFBQSxJQUN4RCxJQUFJLE9BQU8sUUFBUSxVQUFVO0FBQUEsTUFDM0IsV0FBVTtBQUFBLE1BQ1YsTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBLEtBQUs7QUFBQSxNQUNILFdBQVUsQ0FBQztBQUFBLElBRWIsSUFBSSxPQUFPLFFBQVEsWUFBWSxPQUFPLFFBQVEsYUFBYSxHQUFHLEtBQUssR0FBRyxHQUFHO0FBQUEsTUFDdkUsT0FBTyxPQUFPLFFBQVEsWUFBWSxPQUFPLE9BQU8sSUFBSSxXQUFXLFVBQzdELHNFQUFzRTtBQUFBLE1BQ3hFLE9BQVEsSUFBSSxXQUFXLE1BQU8sSUFBSSxNQUFNO0FBQUEsTUFDeEMsU0FBUyxJQUFJLEVBQUcsSUFBSSxJQUFJLFFBQVE7QUFBQSxRQUFLLFFBQVEsSUFBSSxLQUFLLFNBQVMsSUFBSSxFQUFFO0FBQUEsSUFDdkU7QUFBQSxJQUVBLE1BQU0sS0FBSyxlQUFlLEtBQUssR0FBRztBQUFBLElBQ2xDLE1BQU0sS0FBSyxhQUFhLEtBQUssT0FBTyxTQUFRLFlBQVk7QUFBQSxJQUd4RCxRQUFRLElBQUksTUFBTSxHQUFHLGlDQUFpQztBQUFBLElBR3RELElBQUksUUFBUSxLQUFLLEVBQUUsV0FBVztBQUFBLElBQzlCLElBQUksT0FBTyxJQUFJLFdBQVcsRUFBRSxRQUFRLE1BQU0sS0FBSztBQUFBLElBRy9DLElBQUksUUFBUSxJQUFJLFFBQVEsTUFBTSxLQUFLO0FBQUEsSUFHbkMsT0FBUSxJQUFJLEdBQUcsS0FBSyxFQUFHLEdBQUcsR0FBRyxHQUFHLHNCQUFzQjtBQUFBLElBR3RELElBQUksT0FBTyxJQUFJLFNBQVM7QUFBQSxNQUN0QixNQUFNLEtBQUs7QUFBQSxNQUNYLFNBQVM7QUFBQSxNQUNUO0FBQUEsTUFDQSxNQUFNLFNBQVE7QUFBQSxNQUNkLFNBQVMsU0FBUSxXQUFXO0FBQUEsSUFDOUIsQ0FBQztBQUFBLElBR0QsSUFBSSxNQUFNLEtBQUssRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7QUFBQSxJQUU5QixTQUFTLE9BQU8sSUFBSyxRQUFRO0FBQUEsTUFDM0IsSUFBSSxJQUFJLFNBQVEsSUFDZCxTQUFRLEVBQUUsSUFBSSxJQUNkLElBQUksR0FBRyxLQUFLLFNBQVMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQUEsTUFDM0MsSUFBSSxLQUFLLGFBQWEsR0FBRyxJQUFJO0FBQUEsTUFDN0IsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRSxJQUFJLEdBQUcsS0FBSztBQUFBLFFBQ2xDO0FBQUEsTUFFRixJQUFJLEtBQUssS0FBSyxFQUFFLElBQUksQ0FBQztBQUFBLE1BQ3JCLElBQUksR0FBRyxXQUFXO0FBQUEsUUFDaEI7QUFBQSxNQUVGLElBQUksTUFBTSxHQUFHLEtBQUs7QUFBQSxNQUNsQixJQUFJLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQztBQUFBLE1BQ3ZCLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTTtBQUFBLFFBQ2hCO0FBQUEsTUFFRixJQUFJLElBQUksRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksV0FBVyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUM7QUFBQSxNQUM1RCxJQUFJLEVBQUUsS0FBSyxLQUFLLENBQUM7QUFBQSxNQUNqQixJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU07QUFBQSxRQUNoQjtBQUFBLE1BRUYsSUFBSSxpQkFBaUIsR0FBRyxLQUFLLEVBQUUsTUFBTSxJQUFJLElBQUksTUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUk7QUFBQSxNQUc1QyxJQUFJLFNBQVEsYUFBYSxFQUFFLElBQUksS0FBSyxFQUFFLElBQUksR0FBRztBQUFBLFFBQzNDLElBQUksS0FBSyxFQUFFLElBQUksQ0FBQztBQUFBLFFBQ2hCLGlCQUFpQjtBQUFBLE1BQ25CO0FBQUEsTUFFQSxPQUFPLElBQUksVUFBVSxFQUFFLEdBQU0sR0FBTSxjQUE2QixDQUFDO0FBQUEsSUFDbkU7QUFBQTtBQUFBLEVBR0YsR0FBRyxVQUFVLFNBQVMsU0FBUyxNQUFNLENBQUMsS0FBSyxXQUFXLEtBQUssS0FBSyxVQUFTO0FBQUEsSUFDdkUsS0FBSztBQUFBLE1BQ0gsV0FBVSxDQUFDO0FBQUEsSUFFYixNQUFNLEtBQUssYUFBYSxLQUFLLE9BQU8sU0FBUSxZQUFZO0FBQUEsSUFDeEQsTUFBTSxLQUFLLGNBQWMsS0FBSyxHQUFHO0FBQUEsSUFDakMsWUFBWSxJQUFJLFVBQVUsV0FBVyxLQUFLO0FBQUEsSUFHMUMsSUFBSSxJQUFJLFVBQVU7QUFBQSxJQUNsQixJQUFJLElBQUksVUFBVTtBQUFBLElBQ2xCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSztBQUFBLE1BQ3BDLE9BQU87QUFBQSxJQUNULElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSztBQUFBLE1BQ3BDLE9BQU87QUFBQSxJQUdULElBQUksT0FBTyxFQUFFLEtBQUssS0FBSyxDQUFDO0FBQUEsSUFDeEIsSUFBSSxLQUFLLEtBQUssSUFBSSxHQUFHLEVBQUUsS0FBSyxLQUFLLENBQUM7QUFBQSxJQUNsQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQztBQUFBLElBQ2hDLElBQUk7QUFBQSxJQUVKLEtBQUssS0FBSyxNQUFNLGVBQWU7QUFBQSxNQUM3QixJQUFJLEtBQUssRUFBRSxPQUFPLElBQUksSUFBSSxVQUFVLEdBQUcsRUFBRTtBQUFBLE1BQ3pDLElBQUksRUFBRSxXQUFXO0FBQUEsUUFDZixPQUFPO0FBQUEsTUFFVCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU07QUFBQSxJQUMxQztBQUFBLElBS0EsSUFBSSxLQUFLLEVBQUUsUUFBUSxJQUFJLElBQUksVUFBVSxHQUFHLEVBQUU7QUFBQSxJQUMxQyxJQUFJLEVBQUUsV0FBVztBQUFBLE1BQ2YsT0FBTztBQUFBLElBS1QsT0FBTyxFQUFFLE9BQU8sQ0FBQztBQUFBO0FBQUEsRUFHbkIsR0FBRyxVQUFVLGdCQUFnQixRQUFRLENBQUMsS0FBSyxXQUFXLEdBQUcsS0FBSztBQUFBLElBQzVELFFBQVEsSUFBSSxPQUFPLEdBQUcsMENBQTBDO0FBQUEsSUFDaEUsWUFBWSxJQUFJLFVBQVUsV0FBVyxHQUFHO0FBQUEsSUFFeEMsSUFBSSxJQUFJLEtBQUs7QUFBQSxJQUNiLElBQUksSUFBSSxJQUFJLEdBQUcsR0FBRztBQUFBLElBQ2xCLElBQUksSUFBSSxVQUFVO0FBQUEsSUFDbEIsSUFBSSxJQUFJLFVBQVU7QUFBQSxJQUdsQixJQUFJLFNBQVMsSUFBSTtBQUFBLElBQ2pCLElBQUksY0FBYyxLQUFLO0FBQUEsSUFDdkIsSUFBSSxFQUFFLElBQUksS0FBSyxNQUFNLEVBQUUsS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEtBQUssS0FBSztBQUFBLE1BQ2pELE1BQU0sSUFBSSxNQUFNLHNDQUFzQztBQUFBLElBR3hELElBQUk7QUFBQSxNQUNGLElBQUksS0FBSyxNQUFNLFdBQVcsRUFBRSxJQUFJLEtBQUssTUFBTSxDQUFDLEdBQUcsTUFBTTtBQUFBLElBRXJEO0FBQUEsVUFBSSxLQUFLLE1BQU0sV0FBVyxHQUFHLE1BQU07QUFBQSxJQUVyQyxJQUFJLE9BQU8sVUFBVSxFQUFFLEtBQUssQ0FBQztBQUFBLElBQzdCLElBQUksS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQztBQUFBLElBQ2xDLElBQUksS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQztBQUFBLElBSTNCLE9BQU8sS0FBSyxFQUFFLE9BQU8sSUFBSSxHQUFHLEVBQUU7QUFBQTtBQUFBLEVBR2hDLEdBQUcsVUFBVSxzQkFBc0IsUUFBUSxDQUFDLEdBQUcsV0FBVyxHQUFHLEtBQUs7QUFBQSxJQUNoRSxZQUFZLElBQUksVUFBVSxXQUFXLEdBQUc7QUFBQSxJQUN4QyxJQUFJLFVBQVUsa0JBQWtCO0FBQUEsTUFDOUIsT0FBTyxVQUFVO0FBQUEsSUFFbkIsU0FBUyxJQUFJLEVBQUcsSUFBSSxHQUFHLEtBQUs7QUFBQSxNQUMxQixJQUFJO0FBQUEsTUFDSixJQUFJO0FBQUEsUUFDRixTQUFTLEtBQUssY0FBYyxHQUFHLFdBQVcsQ0FBQztBQUFBLFFBQzNDLE9BQU8sSUFBRztBQUFBLFFBQ1Y7QUFBQTtBQUFBLE1BR0YsSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUFBLFFBQ2IsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLE1BQU0sSUFBSSxNQUFNLHNDQUFzQztBQUFBO0FBQUE7Ozs7RUNsUnhELElBQUk7QUFBQSxFQUNKLElBQUksU0FBUyxNQUFNO0FBQUEsRUFDbkIsSUFBSSxhQUFhLE1BQU07QUFBQSxFQUN2QixJQUFJLGlCQUFpQixNQUFNO0FBQUEsRUFXM0IsU0FBUyxPQUFPLENBQUMsT0FBTyxRQUFRO0FBQUEsSUFDOUIsS0FBSyxRQUFRO0FBQUEsSUFDYixLQUFLLFVBQVUsV0FBVyxPQUFPLE1BQU07QUFBQSxJQUN2QyxJQUFJLE1BQU0sUUFBUSxPQUFPLEdBQUc7QUFBQSxNQUMxQixLQUFLLE9BQU8sT0FBTztBQUFBLElBRW5CO0FBQUEsV0FBSyxZQUFZLFdBQVcsT0FBTyxHQUFHO0FBQUE7QUFBQSxFQUcxQyxRQUFRLGFBQWEsU0FBUyxVQUFVLENBQUMsT0FBTyxLQUFLO0FBQUEsSUFDbkQsSUFBSSxlQUFlO0FBQUEsTUFDakIsT0FBTztBQUFBLElBQ1QsT0FBTyxJQUFJLFFBQVEsT0FBTyxFQUFFLElBQVMsQ0FBQztBQUFBO0FBQUEsRUFHeEMsUUFBUSxhQUFhLFNBQVMsVUFBVSxDQUFDLE9BQU8sUUFBUTtBQUFBLElBQ3RELElBQUksa0JBQWtCO0FBQUEsTUFDcEIsT0FBTztBQUFBLElBQ1QsT0FBTyxJQUFJLFFBQVEsT0FBTyxFQUFFLE9BQWUsQ0FBQztBQUFBO0FBQUEsRUFHOUMsUUFBUSxVQUFVLFNBQVMsU0FBUyxNQUFNLEdBQUc7QUFBQSxJQUMzQyxPQUFPLEtBQUs7QUFBQTtBQUFBLEVBR2QsZUFBZSxTQUFTLFlBQVksU0FBUyxRQUFRLEdBQUc7QUFBQSxJQUN0RCxPQUFPLEtBQUssTUFBTSxZQUFZLEtBQUssSUFBSSxDQUFDO0FBQUEsR0FDekM7QUFBQSxFQUVELGVBQWUsU0FBUyxPQUFPLFNBQVMsR0FBRyxHQUFHO0FBQUEsSUFDNUMsSUFBSSxLQUFLO0FBQUEsTUFDUCxPQUFPLEtBQUssTUFBTSxZQUFZLEtBQUssU0FBUztBQUFBLElBQzlDLE9BQU8sS0FBSyxNQUFNLEVBQUUsSUFBSSxLQUFLLEtBQUssQ0FBQztBQUFBLEdBQ3BDO0FBQUEsRUFFRCxlQUFlLFNBQVMsYUFBYSxTQUFTLFNBQVMsR0FBRztBQUFBLElBQ3hELElBQUksUUFBUSxLQUFLO0FBQUEsSUFDakIsSUFBSSxPQUFPLEtBQUssS0FBSztBQUFBLElBQ3JCLElBQUksU0FBUyxNQUFNLGlCQUFpQjtBQUFBLElBRXBDLElBQUksSUFBSSxLQUFLLE1BQU0sR0FBRyxNQUFNLGNBQWM7QUFBQSxJQUMxQyxFQUFFLE1BQU07QUFBQSxJQUNSLEVBQUUsV0FBVztBQUFBLElBQ2IsRUFBRSxXQUFXO0FBQUEsSUFFYixPQUFPO0FBQUEsR0FDUjtBQUFBLEVBRUQsZUFBZSxTQUFTLFFBQVEsU0FBUyxJQUFJLEdBQUc7QUFBQSxJQUM5QyxPQUFPLEtBQUssTUFBTSxVQUFVLEtBQUssVUFBVSxDQUFDO0FBQUEsR0FDN0M7QUFBQSxFQUVELGVBQWUsU0FBUyxRQUFRLFNBQVMsSUFBSSxHQUFHO0FBQUEsSUFDOUMsT0FBTyxLQUFLLE1BQU0sS0FBSyxFQUFFLE9BQU8sS0FBSyxPQUFPLENBQUMsRUFBRSxPQUFPO0FBQUEsR0FDdkQ7QUFBQSxFQUVELGVBQWUsU0FBUyxpQkFBaUIsU0FBUyxhQUFhLEdBQUc7QUFBQSxJQUNoRSxPQUFPLEtBQUssS0FBSyxFQUFFLE1BQU0sS0FBSyxNQUFNLGNBQWM7QUFBQSxHQUNuRDtBQUFBLEVBRUQsUUFBUSxVQUFVLE9BQU8sU0FBUyxJQUFJLENBQUMsU0FBUztBQUFBLElBQzlDLE9BQU8sS0FBSyxTQUFTLHlCQUF5QjtBQUFBLElBQzlDLE9BQU8sS0FBSyxNQUFNLEtBQUssU0FBUyxJQUFJO0FBQUE7QUFBQSxFQUd0QyxRQUFRLFVBQVUsU0FBUyxTQUFTLE1BQU0sQ0FBQyxTQUFTLEtBQUs7QUFBQSxJQUN2RCxPQUFPLEtBQUssTUFBTSxPQUFPLFNBQVMsS0FBSyxJQUFJO0FBQUE7QUFBQSxFQUc3QyxRQUFRLFVBQVUsWUFBWSxTQUFTLFNBQVMsQ0FBQyxLQUFLO0FBQUEsSUFDcEQsT0FBTyxLQUFLLFNBQVMsd0JBQXdCO0FBQUEsSUFDN0MsT0FBTyxNQUFNLE9BQU8sS0FBSyxPQUFPLEdBQUcsR0FBRztBQUFBO0FBQUEsRUFHeEMsUUFBUSxVQUFVLFlBQVksU0FBUyxTQUFTLENBQUMsS0FBSztBQUFBLElBQ3BELE9BQU8sTUFBTSxPQUFPLEtBQUssU0FBUyxHQUFHLEdBQUc7QUFBQTtBQUFBLEVBRzFDLE9BQU8sVUFBVTtBQUFBOzs7O0VDNUZqQixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJLFNBQVMsTUFBTTtBQUFBLEVBQ25CLElBQUksaUJBQWlCLE1BQU07QUFBQSxFQUMzQixJQUFJLGFBQWEsTUFBTTtBQUFBLEVBVXZCLFNBQVMsU0FBUyxDQUFDLE9BQU8sS0FBSztBQUFBLElBQzdCLEtBQUssUUFBUTtBQUFBLElBRWIsSUFBSSxPQUFPLFFBQVE7QUFBQSxNQUNqQixNQUFNLFdBQVcsR0FBRztBQUFBLElBRXRCLElBQUksTUFBTSxRQUFRLEdBQUcsR0FBRztBQUFBLE1BQ3RCLE9BQU8sSUFBSSxXQUFXLE1BQU0saUJBQWlCLEdBQUcsNEJBQTRCO0FBQUEsTUFDNUUsTUFBTTtBQUFBLFFBQ0osR0FBRyxJQUFJLE1BQU0sR0FBRyxNQUFNLGNBQWM7QUFBQSxRQUNwQyxHQUFHLElBQUksTUFBTSxNQUFNLGNBQWM7QUFBQSxNQUNuQztBQUFBLElBQ0Y7QUFBQSxJQUVBLE9BQU8sSUFBSSxLQUFLLElBQUksR0FBRywwQkFBMEI7QUFBQSxJQUVqRCxJQUFJLE1BQU0sUUFBUSxJQUFJLENBQUM7QUFBQSxNQUNyQixLQUFLLEtBQUssSUFBSTtBQUFBLElBQ2hCLElBQUksSUFBSSxhQUFhO0FBQUEsTUFDbkIsS0FBSyxLQUFLLElBQUk7QUFBQSxJQUVoQixLQUFLLFlBQVksTUFBTSxRQUFRLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJO0FBQUEsSUFDcEQsS0FBSyxZQUFZLE1BQU0sUUFBUSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSTtBQUFBO0FBQUEsRUFHdEQsZUFBZSxXQUFXLEtBQUssU0FBUyxDQUFDLEdBQUc7QUFBQSxJQUMxQyxPQUFPLEtBQUssTUFBTSxVQUFVLEtBQUssU0FBUyxDQUFDO0FBQUEsR0FDNUM7QUFBQSxFQUVELGVBQWUsV0FBVyxLQUFLLFNBQVMsQ0FBQyxHQUFHO0FBQUEsSUFDMUMsT0FBTyxLQUFLLE1BQU0sWUFBWSxLQUFLLFNBQVMsQ0FBQztBQUFBLEdBQzlDO0FBQUEsRUFFRCxlQUFlLFdBQVcsWUFBWSxTQUFTLFFBQVEsR0FBRztBQUFBLElBQ3hELE9BQU8sS0FBSyxNQUFNLFlBQVksS0FBSyxFQUFFLENBQUM7QUFBQSxHQUN2QztBQUFBLEVBRUQsZUFBZSxXQUFXLFlBQVksU0FBUyxRQUFRLEdBQUc7QUFBQSxJQUN4RCxPQUFPLEtBQUssTUFBTSxVQUFVLEtBQUssRUFBRSxDQUFDO0FBQUEsR0FDckM7QUFBQSxFQUVELFVBQVUsVUFBVSxVQUFVLFNBQVMsT0FBTyxHQUFHO0FBQUEsSUFDL0MsT0FBTyxLQUFLLFNBQVMsRUFBRSxPQUFPLEtBQUssU0FBUyxDQUFDO0FBQUE7QUFBQSxFQUcvQyxVQUFVLFVBQVUsUUFBUSxTQUFTLEtBQUssR0FBRztBQUFBLElBQzNDLE9BQU8sTUFBTSxPQUFPLEtBQUssUUFBUSxHQUFHLEtBQUssRUFBRSxZQUFZO0FBQUE7QUFBQSxFQUd6RCxPQUFPLFVBQVU7QUFBQTs7OztFQy9EakIsSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSSxTQUFTLE1BQU07QUFBQSxFQUNuQixJQUFJLGFBQWEsTUFBTTtBQUFBLEVBQ3ZCLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVKLFNBQVMsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNwQixPQUFPLFVBQVUsV0FBVyxpQ0FBaUM7QUFBQSxJQUU3RCxNQUFNLGdCQUFnQjtBQUFBLE1BQ3BCLE9BQU8sSUFBSSxNQUFNLEtBQUs7QUFBQSxJQUV4QixRQUFRLE9BQU8sT0FBTztBQUFBLElBQ3RCLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxJQUFJLE1BQU07QUFBQSxJQUNmLEtBQUssRUFBRSxXQUFXLE1BQU0sRUFBRSxVQUFVLElBQUksQ0FBQztBQUFBLElBRXpDLEtBQUssYUFBYSxNQUFNLE1BQU0sRUFBRTtBQUFBLElBQ2hDLEtBQUssaUJBQWlCLEtBQUssS0FBSyxNQUFNLEVBQUUsVUFBVSxJQUFJLENBQUM7QUFBQSxJQUN2RCxLQUFLLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFHbkIsT0FBTyxVQUFVO0FBQUEsRUFPakIsTUFBTSxVQUFVLE9BQU8sU0FBUyxJQUFJLENBQUMsU0FBUyxRQUFRO0FBQUEsSUFDcEQsVUFBVSxXQUFXLE9BQU87QUFBQSxJQUM1QixJQUFJLE1BQU0sS0FBSyxjQUFjLE1BQU07QUFBQSxJQUNuQyxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksY0FBYyxHQUFHLE9BQU87QUFBQSxJQUNqRCxJQUFJLElBQUksS0FBSyxFQUFFLElBQUksQ0FBQztBQUFBLElBQ3BCLElBQUksV0FBVyxLQUFLLFlBQVksQ0FBQztBQUFBLElBQ2pDLElBQUksS0FBSyxLQUFLLFFBQVEsVUFBVSxJQUFJLFNBQVMsR0FBRyxPQUFPLEVBQ3BELElBQUksSUFBSSxLQUFLLENBQUM7QUFBQSxJQUNqQixJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEtBQUssTUFBTSxDQUFDO0FBQUEsSUFDbkMsT0FBTyxLQUFLLGNBQWMsRUFBRSxHQUFNLEdBQU0sU0FBbUIsQ0FBQztBQUFBO0FBQUEsRUFTOUQsTUFBTSxVQUFVLFNBQVMsU0FBUyxNQUFNLENBQUMsU0FBUyxLQUFLLEtBQUs7QUFBQSxJQUMxRCxVQUFVLFdBQVcsT0FBTztBQUFBLElBQzVCLE1BQU0sS0FBSyxjQUFjLEdBQUc7QUFBQSxJQUM1QixJQUFJLElBQUksRUFBRSxFQUFFLElBQUksSUFBSSxNQUFNLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLE1BQU0sR0FBRztBQUFBLE1BQ3JELE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLE1BQU0sS0FBSyxjQUFjLEdBQUc7QUFBQSxJQUNoQyxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksU0FBUyxHQUFHLElBQUksU0FBUyxHQUFHLE9BQU87QUFBQSxJQUM1RCxJQUFJLEtBQUssS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7QUFBQSxJQUMzQixJQUFJLFVBQVUsSUFBSSxFQUFFLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUFBLElBQzFDLE9BQU8sUUFBUSxHQUFHLEVBQUU7QUFBQTtBQUFBLEVBR3RCLE1BQU0sVUFBVSxVQUFVLFNBQVMsT0FBTyxHQUFHO0FBQUEsSUFDM0MsSUFBSSxRQUFPLEtBQUssS0FBSztBQUFBLElBQ3JCLFNBQVMsSUFBSSxFQUFHLElBQUksVUFBVSxRQUFRO0FBQUEsTUFDcEMsTUFBSyxPQUFPLFVBQVUsRUFBRTtBQUFBLElBQzFCLE9BQU8sTUFBTSxVQUFVLE1BQUssT0FBTyxDQUFDLEVBQUUsS0FBSyxLQUFLLE1BQU0sQ0FBQztBQUFBO0FBQUEsRUFHekQsTUFBTSxVQUFVLGdCQUFnQixTQUFTLGFBQWEsQ0FBQyxLQUFLO0FBQUEsSUFDMUQsT0FBTyxRQUFRLFdBQVcsTUFBTSxHQUFHO0FBQUE7QUFBQSxFQUdyQyxNQUFNLFVBQVUsZ0JBQWdCLFNBQVMsYUFBYSxDQUFDLFFBQVE7QUFBQSxJQUM3RCxPQUFPLFFBQVEsV0FBVyxNQUFNLE1BQU07QUFBQTtBQUFBLEVBR3hDLE1BQU0sVUFBVSxnQkFBZ0IsU0FBUyxhQUFhLENBQUMsS0FBSztBQUFBLElBQzFELElBQUksZUFBZTtBQUFBLE1BQ2pCLE9BQU87QUFBQSxJQUNULE9BQU8sSUFBSSxVQUFVLE1BQU0sR0FBRztBQUFBO0FBQUEsRUFXaEMsTUFBTSxVQUFVLGNBQWMsU0FBUyxXQUFXLENBQUMsT0FBTztBQUFBLElBQ3hELElBQUksTUFBTSxNQUFNLEtBQUssRUFBRSxRQUFRLE1BQU0sS0FBSyxjQUFjO0FBQUEsSUFDeEQsSUFBSSxLQUFLLGlCQUFpQixNQUFNLE1BQU0sS0FBSyxFQUFFLE1BQU0sSUFBSSxNQUFPO0FBQUEsSUFDOUQsT0FBTztBQUFBO0FBQUEsRUFHVCxNQUFNLFVBQVUsY0FBYyxTQUFTLFdBQVcsQ0FBQyxPQUFPO0FBQUEsSUFDeEQsUUFBUSxNQUFNLFdBQVcsS0FBSztBQUFBLElBRTlCLElBQUksU0FBUyxNQUFNLFNBQVM7QUFBQSxJQUM1QixJQUFJLFNBQVMsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLE9BQU8sTUFBTSxXQUFXLEdBQUk7QUFBQSxJQUNoRSxJQUFJLFVBQVUsTUFBTSxVQUFVLFNBQVU7QUFBQSxJQUV4QyxJQUFJLElBQUksTUFBTSxVQUFVLE1BQU07QUFBQSxJQUM5QixPQUFPLEtBQUssTUFBTSxXQUFXLEdBQUcsTUFBTTtBQUFBO0FBQUEsRUFHeEMsTUFBTSxVQUFVLFlBQVksU0FBUyxTQUFTLENBQUMsS0FBSztBQUFBLElBQ2xELE9BQU8sSUFBSSxRQUFRLE1BQU0sS0FBSyxjQUFjO0FBQUE7QUFBQSxFQUc5QyxNQUFNLFVBQVUsWUFBWSxTQUFTLFNBQVMsQ0FBQyxPQUFPO0FBQUEsSUFDcEQsT0FBTyxNQUFNLFVBQVUsS0FBSztBQUFBO0FBQUEsRUFHOUIsTUFBTSxVQUFVLFVBQVUsU0FBUyxPQUFPLENBQUMsS0FBSztBQUFBLElBQzlDLE9BQU8sZUFBZSxLQUFLO0FBQUE7QUFBQTs7OztFQ3JIN0IsSUFBSSxXQUFXO0FBQUEsRUFFZixTQUFTLDRCQUFxQztBQUFBLEVBQzlDLFNBQVM7QUFBQSxFQUNULFNBQVM7QUFBQSxFQUNULFNBQVM7QUFBQSxFQUNULFNBQVM7QUFBQSxFQUdULFNBQVM7QUFBQSxFQUNULFNBQVM7QUFBQTs7OztFQ1ZULElBQUksb0JBQXdCO0FBQUEsRUFBNUIsSUFDQyxnQ0FBZ0M7QUFBQSxFQUVqQyxPQUFPLFVBQVUsU0FBUyxjQUFjLENBQUMsS0FBSyxNQUFNO0FBQUEsSUFDbkQsSUFBSSxNQUFNLFFBQU8sS0FBSyxLQUFLLFFBQVE7QUFBQSxJQUNuQyxJQUFJLEtBQUssTUFBTSxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksRUFBRSxLQUFLO0FBQUEsSUFDMUMsSUFBSSxNQUFNO0FBQUEsTUFDVCxJQUFJLEtBQUssQ0FBQztBQUFBLElBQ1g7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBOzs7O0VDVFIsT0FBTyx5QkFBNkIsT0FBTyxzQkFBa0MsUUFBUSxHQUFHO0FBQUEsSUFDdkYsS0FBSyxJQUFJLEVBQUUsSUFDVixLQUFLLElBQUksV0FBVyxFQUFFLE1BQU0sR0FDNUIsS0FBSyxJQUFJLFlBQVksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUN2QztBQUFBLEdBQ0E7QUFBQTs7OztFQ0xELElBQUk7QUFBQSxFQUVKLE9BQU8seUJBQTZCLE9BQU8saUJBQTZCLFFBQVEsR0FBRztBQUFBLElBQ2xGLEtBQUssSUFBSSxFQUFFLElBQ1YsS0FBSyxJQUFJLFdBQVcsRUFBRSxJQUFJLG1CQUFtQixHQUM3QyxLQUFLLElBQUksV0FBVyxFQUFFLE9BQU8sQ0FDOUI7QUFBQSxHQUNBO0FBQUE7Ozs7RUNQRCxPQUFPLHlCQUE2QixPQUFPLFdBQXVCLFFBQVEsR0FBRztBQUFBLElBQzVFLEtBQUssSUFBSTtBQUFBLEdBQ1Q7QUFBQTs7OztFQ0ZELElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVKLE9BQU8seUJBQTZCLE9BQU8sa0JBQThCLFFBQVEsR0FBRztBQUFBLElBQ25GLEtBQUssSUFBSSxFQUFFLElBQ1YsS0FBSyxJQUFJLFNBQVMsRUFBRSxJQUFJLE9BQU8sR0FDL0IsS0FBSyxJQUFJLHFCQUFxQixFQUFFLElBQUksbUJBQW1CLEdBQ3ZELEtBQUssSUFBSSxZQUFZLEVBQUUsT0FBTyxHQUM5QixLQUFLLElBQUksWUFBWSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQ3ZDO0FBQUEsR0FDQTtBQUFBOzs7O0VDVkQsSUFBSTtBQUFBLEVBQUosSUFDQyxnQ0FBZ0M7QUFBQSxFQURqQyxJQUVDLHdCQUF5QjtBQUFBLEVBRTFCLElBQUk7QUFBQSxFQUVKLElBQUk7QUFBQSxFQUFKLElBQ0M7QUFBQSxFQURELElBRUM7QUFBQSxFQUVELElBQUksZUFBZSxLQUFLLE9BQU8sZ0JBQTRCLFFBQVEsR0FBRztBQUFBLElBQ3JFLEtBQUssT0FBTztBQUFBLE1BQ1gsWUFBWSxLQUFLLE1BQU07QUFBQSxJQUN4QixDQUFDO0FBQUEsR0FDRDtBQUFBLEVBRUQsSUFBSSxnQkFBZ0I7QUFBQSxFQUVwQixJQUFJLGVBQWUsS0FBSyxPQUFPLGdCQUE0QixRQUFRLEdBQUc7QUFBQSxJQUNyRSxLQUFLLElBQUksRUFBRSxJQUNWLEtBQUssSUFBSSxTQUFTLEVBQUUsSUFBSSxPQUFPLEdBQy9CLEtBQUssSUFBSSxZQUFZLEVBQUUsT0FBTyxHQUM5QixLQUFLLElBQUksWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEdBQ2xELEtBQUssSUFBSSxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDckQ7QUFBQSxHQUNBO0FBQUEsRUFFRCxJQUFJLFNBQVM7QUFBQSxJQUNaLFNBQVM7QUFBQSxJQUNULFNBQVM7QUFBQSxJQUNULFNBQVM7QUFBQSxFQUNWO0FBQUEsRUFFQSxJQUFJLE9BQU87QUFBQSxJQUNWLFNBQVMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQUEsSUFDbkMsU0FBUyxDQUFDLEdBQUcsR0FBRyxLQUFLLEdBQUcsRUFBRTtBQUFBLElBQzFCLFNBQVMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEVBQUU7QUFBQSxFQUMzQjtBQUFBLEVBQ0EsSUFBSSxhQUFhLENBQUM7QUFBQSxFQUNsQixJQUFJLGFBQWEsQ0FBQztBQUFBLEVBQ2xCLE9BQU8sS0FBSyxJQUFJLEVBQUUsUUFBUSxRQUFRLENBQUMsS0FBSztBQUFBLElBQ3ZDLFdBQVcsT0FBTyxhQUFhLE9BQU87QUFBQSxNQUNyQyxNQUFNO0FBQUEsTUFDTixPQUFPLEtBQUs7QUFBQSxJQUNiLEdBQUcsS0FBSztBQUFBLElBQ1IsV0FBVyxPQUFPO0FBQUEsTUFDakIsV0FBWSxDQUFDLEdBQUcsR0FBRyxLQUFLLE9BQU8sR0FBRyxDQUFDO0FBQUEsTUFDbkMsWUFBWSxXQUFXO0FBQUEsSUFDeEI7QUFBQSxHQUNBO0FBQUEsRUFDRCxPQUFPO0FBQUEsRUFFUCxTQUFTLGFBQWEsQ0FBQyxLQUFLLE1BQU07QUFBQSxJQUNqQyxJQUFpQixPQUFPLElBQUksUUFBeEIsVUFBNkI7QUFBQSxNQUNoQyxNQUFNLElBQUksVUFBVSxtQ0FBbUM7QUFBQSxJQUN4RDtBQUFBLElBRUEsSUFBSSxPQUFvQixPQUFPLElBQUksTUFBeEI7QUFBQSxJQUNYLElBQUksVUFBVSxPQUNYLENBQUMsYUFBYSxRQUFRLElBQ3RCLENBQUMsUUFBUTtBQUFBLElBRVosSUFBVyxRQUFRLFFBQVEsT0FBTyxJQUFJLENBQUMsTUFBbkMsSUFBc0M7QUFBQSxNQUN6QyxNQUFNLElBQUksVUFBVSxpQ0FBaUM7QUFBQSxJQUN0RDtBQUFBLElBRUEsSUFBVyxRQUFRLFFBQVEsT0FBTyxJQUFJLENBQUMsTUFBbkMsSUFBc0M7QUFBQSxNQUN6QyxNQUFNLElBQUksVUFBVSxpQ0FBaUM7QUFBQSxJQUN0RDtBQUFBLElBRUEsSUFBSSxLQUFLLFlBQVksTUFBTTtBQUFBLE1BQzFCLE1BQU0sSUFBSSxVQUFVLGlDQUFpQztBQUFBLElBQ3REO0FBQUEsSUFFQSxJQUFJLFlBQVksT0FBTyxJQUFJO0FBQUEsSUFDM0IsS0FBSyxXQUFXO0FBQUEsTUFDZixNQUFNLElBQUksTUFBTSx3QkFBd0IsSUFBSSxNQUFNLEdBQUc7QUFBQSxJQUN0RDtBQUFBLElBRUEsSUFBSSxRQUFRLElBQUksR0FBRyxTQUFTO0FBQUEsSUFFNUIsSUFBSSxNQUFNLENBQUM7QUFBQSxJQUVYLElBQUksU0FBUyxJQUFJLEtBQUssSUFBSTtBQUFBLElBQzFCLElBQUksUUFBUTtBQUFBLE1BQ1gsSUFBSSxNQUFNO0FBQUEsUUFDVCxHQUFHLFFBQVEsSUFBSSxHQUFHLEtBQUs7QUFBQSxRQUN2QixHQUFHLFFBQVEsSUFBSSxHQUFHLEtBQUs7QUFBQSxNQUN4QjtBQUFBLElBQ0Q7QUFBQSxJQUVBLElBQUksS0FBSyxZQUFZLFFBQVE7QUFBQSxNQUM1QixJQUFJLE9BQU8sUUFBUSxJQUFJLEdBQUcsSUFBSTtBQUFBLElBQy9CO0FBQUEsSUFFQSxNQUFNLE1BQU0sUUFBUSxHQUFHO0FBQUEsSUFFdkIsSUFBSSxnQkFBZ0IsSUFBSSxTQUFTO0FBQUEsSUFDakMsS0FBSyxjQUFjLFFBQVE7QUFBQSxNQUMxQixNQUFNLElBQUksTUFBTSw2QkFBNkIsY0FBYyxTQUFTLEdBQUc7QUFBQSxJQUN4RTtBQUFBLElBRUEsSUFBSSxTQUFTLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSTtBQUFBLElBRXhDLE9BQU87QUFBQTtBQUFBLEVBR1IsU0FBUyxRQUFRLENBQUMsS0FBSyxLQUFLLE1BQU07QUFBQSxJQUNqQyxJQUFJLFVBQVU7QUFBQSxJQUNkLElBQUksWUFBWSxJQUFJLFVBQVUsU0FBUyxLQUFLO0FBQUEsSUFDNUMsWUFBWSxRQUFPLEtBQUssV0FBVyxLQUFLO0FBQUEsSUFDeEMsWUFBWTtBQUFBLE1BQ1gsUUFBUTtBQUFBLE1BQ1IsTUFBTTtBQUFBLElBQ1A7QUFBQSxJQUVBLElBQUk7QUFBQSxJQUNKLElBQUksS0FBSyxTQUFTO0FBQUEsTUFDakIsSUFBSSxhQUFhLElBQUksV0FBVyxLQUFLO0FBQUEsTUFDckMsYUFBYSxRQUFPLEtBQUssWUFBWSxLQUFLO0FBQUEsTUFFMUMsU0FBUyxlQUFlLE9BQU87QUFBQSxRQUM5QixTQUFTO0FBQUEsUUFDVCxxQkFBcUIsV0FBVztBQUFBLFFBQ2hDLFlBQVksYUFBYSxPQUFPO0FBQUEsVUFDL0IsU0FBUztBQUFBLFVBQ1Q7QUFBQSxVQUNBLFlBQVksV0FBVztBQUFBLFVBQ3ZCO0FBQUEsUUFDRCxHQUFHLEtBQUs7QUFBQSxNQUNULEdBQUcsT0FBTztBQUFBLFFBQ1QsT0FBTztBQUFBLE1BQ1IsQ0FBQztBQUFBLE1BRUQsV0FBVyxLQUFLLENBQUM7QUFBQSxJQUNsQixFQUFPO0FBQUEsTUFDTixTQUFTLGNBQWMsT0FBTztBQUFBLFFBQzdCLFdBQVcsV0FBVztBQUFBLFFBQ3RCLFdBQVc7QUFBQSxNQUNaLEdBQUcsT0FBTztBQUFBLFFBQ1QsT0FBTztBQUFBLE1BQ1IsQ0FBQztBQUFBO0FBQUEsSUFLRixJQUFhLE9BQU8sTUFBTSxFQUFFLE1BQXhCO0FBQUEsR0FBMkI7QUFBQSxNQUM5QixVQUFVO0FBQUE7QUFBQSxJQUNYO0FBQUEsSUFFQSxPQUFPO0FBQUE7QUFBQSxFQUdSLE9BQU8sVUFBVTtBQUFBOzs7O0VDekpqQixJQUFJO0FBQUEsRUFFSixJQUFJO0FBQUEsRUFFSixJQUFJO0FBQUEsRUFBSixJQUNDO0FBQUEsRUFERCxJQUVDO0FBQUEsRUFFRCxJQUFJLGdCQUFnQixLQUFLLE9BQU8saUJBQTZCLFFBQVEsR0FBRztBQUFBLElBQ3ZFLEtBQUssSUFBSSxFQUFFLElBQ1YsS0FBSyxJQUFJLFNBQVMsRUFBRSxJQUFJLE9BQU8sR0FDL0IsS0FBSyxJQUFJLFNBQVMsRUFBRSxJQUFJLEdBQ3hCLEtBQUssSUFBSSxnQkFBZ0IsRUFBRSxJQUFJLEdBQy9CLEtBQUssSUFBSSxpQkFBaUIsRUFBRSxJQUFJLEdBQ2hDLEtBQUssSUFBSSxRQUFRLEVBQUUsSUFBSSxHQUN2QixLQUFLLElBQUksUUFBUSxFQUFFLElBQUksR0FDdkIsS0FBSyxJQUFJLFdBQVcsRUFBRSxJQUFJLEdBQzFCLEtBQUssSUFBSSxXQUFXLEVBQUUsSUFBSSxHQUMxQixLQUFLLElBQUksYUFBYSxFQUFFLElBQUksQ0FDN0I7QUFBQSxHQUNBO0FBQUEsRUFFRCxJQUFJLGVBQWUsS0FBSyxPQUFPLGdCQUE0QixRQUFRLEdBQUc7QUFBQSxJQUNyRSxLQUFLLElBQUksRUFBRSxJQUNWLEtBQUssSUFBSSxTQUFTLEVBQUUsSUFBSSxHQUN4QixLQUFLLElBQUksZ0JBQWdCLEVBQUUsSUFBSSxDQUNoQztBQUFBLEdBQ0E7QUFBQSxFQUVELElBQUksWUFBWTtBQUFBLElBQ2YsV0FBVyxDQUFDLEdBQUcsR0FBRyxLQUFLLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFBQSxJQUN0QyxZQUFZLENBQUMsR0FBRyxDQUFDO0FBQUEsRUFDbEI7QUFBQSxFQUVBLFNBQVMsY0FBYyxDQUFDLEtBQUssTUFBTTtBQUFBLElBQ2xDLElBQWlCLE9BQU8sSUFBSSxNQUF4QixVQUEyQjtBQUFBLE1BQzlCLE1BQU0sSUFBSSxVQUFVLGlDQUFpQztBQUFBLElBQ3REO0FBQUEsSUFFQSxJQUFpQixPQUFPLElBQUksTUFBeEIsVUFBMkI7QUFBQSxNQUM5QixNQUFNLElBQUksVUFBVSxpQ0FBaUM7QUFBQSxJQUN0RDtBQUFBLElBRUEsSUFBSSxLQUFLLFNBQVM7QUFBQSxNQUNqQixJQUFpQixPQUFPLElBQUksTUFBeEIsVUFBMkI7QUFBQSxRQUM5QixNQUFNLElBQUksVUFBVSxpQ0FBaUM7QUFBQSxNQUN0RDtBQUFBLE1BRUEsSUFBaUIsT0FBTyxJQUFJLE1BQXhCLFVBQTJCO0FBQUEsUUFDOUIsTUFBTSxJQUFJLFVBQVUsaUNBQWlDO0FBQUEsTUFDdEQ7QUFBQSxNQUVBLElBQWlCLE9BQU8sSUFBSSxNQUF4QixVQUEyQjtBQUFBLFFBQzlCLE1BQU0sSUFBSSxVQUFVLGlDQUFpQztBQUFBLE1BQ3REO0FBQUEsTUFFQSxJQUFpQixPQUFPLElBQUksT0FBeEIsVUFBNEI7QUFBQSxRQUMvQixNQUFNLElBQUksVUFBVSxrQ0FBa0M7QUFBQSxNQUN2RDtBQUFBLE1BRUEsSUFBaUIsT0FBTyxJQUFJLE9BQXhCLFVBQTRCO0FBQUEsUUFDL0IsTUFBTSxJQUFJLFVBQVUsa0NBQWtDO0FBQUEsTUFDdkQ7QUFBQSxNQUVBLElBQWlCLE9BQU8sSUFBSSxPQUF4QixVQUE0QjtBQUFBLFFBQy9CLE1BQU0sSUFBSSxVQUFVLGtDQUFrQztBQUFBLE1BQ3ZEO0FBQUEsSUFDRDtBQUFBLElBRUEsSUFBSTtBQUFBLElBQ0osSUFBSSxLQUFLLFNBQVM7QUFBQSxNQUNqQixNQUFNLGVBQWUsT0FBTztBQUFBLFFBQzNCLFNBQVM7QUFBQSxRQUNULHFCQUFxQjtBQUFBLFFBQ3JCLFlBQVksY0FBYyxPQUFPO0FBQUEsVUFDaEMsU0FBUztBQUFBLFVBQ1QsU0FBUyxRQUFRLElBQUksR0FBRyxLQUFLO0FBQUEsVUFDN0IsZ0JBQWdCLFFBQVEsSUFBSSxHQUFHLEtBQUs7QUFBQSxVQUNwQyxpQkFBaUIsUUFBUSxJQUFJLEdBQUcsSUFBSTtBQUFBLFVBQ3BDLFFBQVEsUUFBUSxJQUFJLEdBQUcsSUFBSTtBQUFBLFVBQzNCLFFBQVEsUUFBUSxJQUFJLEdBQUcsSUFBSTtBQUFBLFVBQzNCLFdBQVcsUUFBUSxJQUFJLElBQUksSUFBSTtBQUFBLFVBQy9CLFdBQVcsUUFBUSxJQUFJLElBQUksSUFBSTtBQUFBLFVBQy9CLGFBQWEsUUFBUSxJQUFJLElBQUksSUFBSTtBQUFBLFFBQ2xDLEdBQUcsS0FBSztBQUFBLE1BQ1QsR0FBRyxPQUFPO0FBQUEsUUFDVCxPQUFPO0FBQUEsTUFDUixDQUFDO0FBQUEsSUFDRixFQUFPO0FBQUEsTUFDTixNQUFNLGNBQWMsT0FBTztBQUFBLFFBQzFCO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDVixRQUFRO0FBQUEsVUFDUixNQUFNLGFBQWEsT0FBTztBQUFBLFlBQ3pCLFNBQVMsUUFBUSxJQUFJLEdBQUcsS0FBSztBQUFBLFlBQzdCLGdCQUFnQixRQUFRLElBQUksR0FBRyxLQUFLO0FBQUEsVUFDckMsR0FBRyxLQUFLO0FBQUEsUUFDVDtBQUFBLE1BQ0QsR0FBRyxPQUFPO0FBQUEsUUFDVCxPQUFPO0FBQUEsTUFDUixDQUFDO0FBQUE7QUFBQSxJQUtGLElBQWEsSUFBSSxNQUFNLEVBQUUsTUFBckI7QUFBQSxHQUF3QjtBQUFBLE1BQzNCLE9BQU87QUFBQTtBQUFBLElBQ1I7QUFBQSxJQUVBLE9BQU87QUFBQTtBQUFBLEVBR1IsT0FBTyxVQUFVO0FBQUE7Ozs7RUNoSGpCLElBQUk7QUFBQSxFQUFKLElBQ0M7QUFBQSxFQVFELFNBQVMsV0FBVyxDQUFDLEtBQUssTUFBTTtBQUFBLElBQy9CLElBQWlCLE9BQU8sUUFBcEIsWUFBb0MsUUFBVCxNQUFjO0FBQUEsTUFDNUMsTUFBTSxJQUFJLFVBQVUsZ0NBQWdDO0FBQUEsSUFDckQ7QUFBQSxJQUVBLElBQUksTUFBTSxJQUFJO0FBQUEsSUFDZCxJQUFpQixPQUFPLFFBQXBCLFVBQXlCO0FBQUEsTUFDNUIsTUFBTSxJQUFJLFVBQVUsbUNBQW1DO0FBQUEsSUFDeEQ7QUFBQSxJQUVBLE9BQU8sUUFBUSxDQUFDO0FBQUEsSUFDaEIsS0FBSyxVQUFVLEtBQUssWUFBWTtBQUFBLElBRWhDLFFBQVE7QUFBQSxXQUNGLE1BQU07QUFBQSxRQUNWLE9BQU8sR0FBRyxLQUFLLElBQUk7QUFBQSxNQUNwQjtBQUFBLFdBQ0ssT0FBTztBQUFBLFFBQ1gsT0FBTyxJQUFJLEtBQUssSUFBSTtBQUFBLE1BQ3JCO0FBQUEsZUFDUztBQUFBLFFBQ1IsTUFBTSxJQUFJLE1BQU0sMkJBQTJCLE1BQU0sR0FBRztBQUFBLE1BQ3JEO0FBQUE7QUFBQTtBQUFBLEVBSUYsT0FBTyxVQUFVO0FBQUE7OztBQ3BDakIsSUFBSSxhQUFZLE9BQU87QUFDdkIsSUFBSSxXQUFXLENBQUMsUUFBUSxRQUFRO0FBQUEsRUFDL0IsU0FBUyxRQUFRO0FBQUEsSUFBSyxXQUFVLFFBQVEsTUFBTTtBQUFBLE1BQzdDLEtBQUssSUFBSTtBQUFBLE1BQ1QsWUFBWTtBQUFBLElBQ2IsQ0FBQztBQUFBOzs7QUNORixJQUFNLGFBQWEsT0FBTyxJQUFJLG9CQUFvQjtBQUNsRCxJQUFNLG1CQUFtQixPQUFPLElBQUksMEJBQTBCO0FBQzlELFNBQVMsRUFBRSxDQUFDLE9BQU8sTUFBTTtBQUFBLEVBQ3ZCLEtBQUssU0FBUyxPQUFPLFVBQVUsVUFBVTtBQUFBLElBQ3ZDLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxJQUFJLGlCQUFpQixNQUFNO0FBQUEsSUFDekIsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLEtBQUssT0FBTyxVQUFVLGVBQWUsS0FBSyxNQUFNLFVBQVUsR0FBRztBQUFBLElBQzNELE1BQU0sSUFBSSxNQUNSLFVBQVUsS0FBSyxRQUFRLDBJQUN6QjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLElBQUksTUFBTSxPQUFPLGVBQWUsS0FBSyxFQUFFO0FBQUEsRUFDdkMsSUFBSSxLQUFLO0FBQUEsSUFDUCxPQUFPLEtBQUs7QUFBQSxNQUNWLElBQUksY0FBYyxPQUFPLElBQUksZ0JBQWdCLEtBQUssYUFBYTtBQUFBLFFBQzdELE9BQU87QUFBQSxNQUNUO0FBQUEsTUFDQSxNQUFNLE9BQU8sZUFBZSxHQUFHO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBQUEsRUFDQSxPQUFPO0FBQUE7OztBQ3RCVCxNQUFNLE9BQU87QUFBQSxFQUNYLFdBQVcsQ0FBQyxPQUFPLFFBQVE7QUFBQSxJQUN6QixLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxPQUFPLE9BQU87QUFBQSxJQUNuQixLQUFLLFlBQVksT0FBTztBQUFBLElBQ3hCLEtBQUssVUFBVSxPQUFPO0FBQUEsSUFDdEIsS0FBSyxVQUFVLE9BQU87QUFBQSxJQUN0QixLQUFLLFlBQVksT0FBTztBQUFBLElBQ3hCLEtBQUssYUFBYSxPQUFPO0FBQUEsSUFDekIsS0FBSyxhQUFhLE9BQU87QUFBQSxJQUN6QixLQUFLLFVBQVUsT0FBTztBQUFBLElBQ3RCLEtBQUssV0FBVyxPQUFPO0FBQUEsSUFDdkIsS0FBSyxhQUFhLE9BQU87QUFBQSxJQUN6QixLQUFLLGFBQWEsT0FBTztBQUFBLElBQ3pCLEtBQUssV0FBVyxPQUFPO0FBQUEsSUFDdkIsS0FBSyxhQUFhLE9BQU87QUFBQSxJQUN6QixLQUFLLFlBQVksT0FBTztBQUFBLElBQ3hCLEtBQUssb0JBQW9CLE9BQU87QUFBQTtBQUFBLFVBRTFCLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsYUFBa0I7QUFBQSxFQUNsQixZQUFpQjtBQUFBLEVBQ2pCLG9CQUF5QjtBQUFBLEVBQ3pCO0FBQUEsRUFDQSxrQkFBa0IsQ0FBQyxPQUFPO0FBQUEsSUFDeEIsT0FBTztBQUFBO0FBQUEsRUFFVCxnQkFBZ0IsQ0FBQyxPQUFPO0FBQUEsSUFDdEIsT0FBTztBQUFBO0FBQUEsRUFHVCxtQkFBbUIsR0FBRztBQUFBLElBQ3BCLE9BQU8sS0FBSyxPQUFPLGNBQW1CLGFBQUssS0FBSyxPQUFPLFVBQVUsU0FBUztBQUFBO0FBRTlFOzs7QUNoREEsTUFBTSxjQUFjO0FBQUEsVUFDVixjQUFjO0FBQUEsRUFDdEI7QUFBQSxFQUNBLFdBQVcsQ0FBQyxNQUFNLFVBQVUsWUFBWTtBQUFBLElBQ3RDLEtBQUssU0FBUztBQUFBLE1BQ1o7QUFBQSxNQUNBLFdBQVcsU0FBUztBQUFBLE1BQ3BCLFNBQVM7QUFBQSxNQUNULFNBQWM7QUFBQSxNQUNkLFlBQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxNQUNaLFVBQVU7QUFBQSxNQUNWLFlBQWlCO0FBQUEsTUFDakIsWUFBaUI7QUFBQSxNQUNqQjtBQUFBLE1BQ0E7QUFBQSxNQUNBLFdBQWdCO0FBQUEsSUFDbEI7QUFBQTtBQUFBLEVBYUYsS0FBSyxHQUFHO0FBQUEsSUFDTixPQUFPO0FBQUE7QUFBQSxFQU9ULE9BQU8sR0FBRztBQUFBLElBQ1IsS0FBSyxPQUFPLFVBQVU7QUFBQSxJQUN0QixPQUFPO0FBQUE7QUFBQSxFQVNULE9BQU8sQ0FBQyxPQUFPO0FBQUEsSUFDYixLQUFLLE9BQU8sVUFBVTtBQUFBLElBQ3RCLEtBQUssT0FBTyxhQUFhO0FBQUEsSUFDekIsT0FBTztBQUFBO0FBQUEsRUFRVCxVQUFVLENBQUMsSUFBSTtBQUFBLElBQ2IsS0FBSyxPQUFPLFlBQVk7QUFBQSxJQUN4QixLQUFLLE9BQU8sYUFBYTtBQUFBLElBQ3pCLE9BQU87QUFBQTtBQUFBLEVBS1QsV0FBVyxLQUFLO0FBQUEsRUFRaEIsV0FBVyxDQUFDLElBQUk7QUFBQSxJQUNkLEtBQUssT0FBTyxhQUFhO0FBQUEsSUFDekIsS0FBSyxPQUFPLGFBQWE7QUFBQSxJQUN6QixPQUFPO0FBQUE7QUFBQSxFQUtULFlBQVksS0FBSztBQUFBLEVBTWpCLFVBQVUsR0FBRztBQUFBLElBQ1gsS0FBSyxPQUFPLGFBQWE7QUFBQSxJQUN6QixLQUFLLE9BQU8sVUFBVTtBQUFBLElBQ3RCLE9BQU87QUFBQTtBQUFBLEVBR1QsT0FBTyxDQUFDLE1BQU07QUFBQSxJQUNaLElBQUksS0FBSyxPQUFPLFNBQVM7QUFBQSxNQUFJO0FBQUEsSUFDN0IsS0FBSyxPQUFPLE9BQU87QUFBQTtBQUV2Qjs7O0FDckdBLElBQU0sWUFBWSxPQUFPLElBQUksY0FBYzs7O0FDQTNDLFNBQVMsSUFBSSxDQUFDLE9BQU8sTUFBTTtBQUFBLEVBQ3pCLE9BQU8sR0FBRyxHQUFHLElBQUk7QUFBQTs7O0FDSW5CLFNBQVMsYUFBYSxDQUFDLE9BQU8sU0FBUztBQUFBLEVBQ3JDLE9BQU8sR0FBRyxNQUFNLGNBQWMsUUFBUSxLQUFLLEdBQUc7QUFBQTs7O0FDb0RoRCxNQUFNLGlCQUFpQixPQUFPO0FBQUEsRUFDNUIsV0FBVyxDQUFDLE9BQU8sUUFBUTtBQUFBLElBQ3pCLEtBQUssT0FBTyxZQUFZO0FBQUEsTUFDdEIsT0FBTyxhQUFhLGNBQWMsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDO0FBQUEsSUFDeEQ7QUFBQSxJQUNBLE1BQU0sT0FBTyxNQUFNO0FBQUEsSUFDbkIsS0FBSyxRQUFRO0FBQUE7QUFBQSxVQUVQLGNBQWM7QUFDeEI7QUFBQTtBQUNBLE1BQU0sMEJBQTBCLFNBQVM7QUFBQSxVQUMvQixjQUFjO0FBQUEsRUFDdEIsVUFBVSxHQUFHO0FBQUEsSUFDWCxPQUFPLEtBQUssV0FBVztBQUFBO0FBQUEsRUFFekIsY0FBYztBQUFBLElBQ1osT0FBTyxLQUFLLE9BQU8sU0FBUztBQUFBLElBQzVCLE9BQU8sS0FBSyxPQUFPLFNBQVM7QUFBQSxJQUM1QixTQUFTLEtBQUssT0FBTztBQUFBLEVBQ3ZCO0FBQUEsRUFDQSxnQkFBZ0I7QUFBQSxJQUNkLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLFNBQWM7QUFBQSxFQUNoQjtBQUFBLEVBQ0EsR0FBRyxHQUFHO0FBQUEsSUFDSixLQUFLLFlBQVksUUFBUTtBQUFBLElBQ3pCLE9BQU87QUFBQTtBQUFBLEVBRVQsSUFBSSxHQUFHO0FBQUEsSUFDTCxLQUFLLFlBQVksUUFBUTtBQUFBLElBQ3pCLE9BQU87QUFBQTtBQUFBLEVBRVQsVUFBVSxHQUFHO0FBQUEsSUFDWCxLQUFLLFlBQVksUUFBUTtBQUFBLElBQ3pCLE9BQU87QUFBQTtBQUFBLEVBRVQsU0FBUyxHQUFHO0FBQUEsSUFDVixLQUFLLFlBQVksUUFBUTtBQUFBLElBQ3pCLE9BQU87QUFBQTtBQUFBLEVBK0JULEVBQUUsQ0FBQyxTQUFTO0FBQUEsSUFDVixLQUFLLFlBQVksVUFBVTtBQUFBLElBQzNCLE9BQU87QUFBQTtBQUVYOzs7QUNwSEEsTUFBTSwyQkFBMkIsU0FBUztBQUFBLFVBQ2hDLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsYUFBYSxLQUFLLE9BQU8sS0FBSztBQUFBLEVBQzlCLFdBQVcsQ0FBQyxPQUFPLFFBQVE7QUFBQSxJQUN6QixNQUFNLE9BQU8sTUFBTTtBQUFBLElBQ25CLEtBQUssT0FBTyxPQUFPO0FBQUE7QUFBQSxFQUVyQixVQUFVLEdBQUc7QUFBQSxJQUNYLE9BQU8sS0FBSyxLQUFLO0FBQUE7QUFFckI7QUFDQSxJQUFNLGNBQWMsT0FBTyxJQUFJLGtCQUFrQjtBQUNqRCxTQUFTLFFBQVEsQ0FBQyxLQUFLO0FBQUEsRUFDckIsU0FBUyxPQUFPLE9BQU8sUUFBUSxjQUFjLGVBQWUsT0FBTyxJQUFJLGlCQUFpQjtBQUFBO0FBZ0IxRixNQUFNLHFCQUFxQixTQUFTO0FBQUEsVUFDMUIsY0FBYztBQUFBLEVBQ3RCLE9BQU8sS0FBSyxPQUFPO0FBQUEsRUFDbkIsYUFBYSxLQUFLLE9BQU8sS0FBSztBQUFBLEVBQzlCLFdBQVcsQ0FBQyxPQUFPLFFBQVE7QUFBQSxJQUN6QixNQUFNLE9BQU8sTUFBTTtBQUFBLElBQ25CLEtBQUssT0FBTyxPQUFPO0FBQUE7QUFBQSxFQUVyQixVQUFVLEdBQUc7QUFBQSxJQUNYLE9BQU8sS0FBSyxLQUFLO0FBQUE7QUFFckI7OztBQ3hEQSxNQUFNLFNBQVM7QUFBQSxVQUNMLGNBQWM7QUFBQSxFQUN0QixXQUFXLENBQUMsS0FBSyxRQUFRLE9BQU8sU0FBUyxPQUFPLGFBQWEsQ0FBQyxHQUFHO0FBQUEsSUFDL0QsS0FBSyxJQUFJO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUDtBQUFBLE1BQ0EsZ0JBQWdCO0FBQUEsTUFDaEI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQTtBQUtKO0FBQUE7QUFDQSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsVUFDMUIsY0FBYztBQUN4Qjs7O0FDbEJBLElBQUksVUFBVTs7O0FDQ2QsSUFBSTtBQUNKLElBQUk7QUFDSixJQUFNLFNBQVM7QUFBQSxFQUNiLGVBQWUsQ0FBQyxNQUFNLElBQUk7QUFBQSxJQUN4QixLQUFLLE1BQU07QUFBQSxNQUNULE9BQU8sR0FBRztBQUFBLElBQ1o7QUFBQSxJQUNBLEtBQUssV0FBVztBQUFBLE1BQ2QsWUFBWSxLQUFLLE1BQU0sVUFBVSxlQUFlLE9BQVU7QUFBQSxJQUM1RDtBQUFBLElBQ0EsT0FBTyxLQUNMLENBQUMsT0FBTyxlQUFlLFdBQVcsZ0JBQ2hDLE1BQ0EsQ0FBQyxTQUFTO0FBQUEsTUFDUixJQUFJO0FBQUEsUUFDRixPQUFPLEdBQUcsSUFBSTtBQUFBLFFBQ2QsT0FBTyxHQUFHO0FBQUEsUUFDVixLQUFLLFVBQVU7QUFBQSxVQUNiLE1BQU0sTUFBTSxlQUFlO0FBQUEsVUFDM0IsU0FBUyxhQUFhLFFBQVEsRUFBRSxVQUFVO0FBQUEsUUFFNUMsQ0FBQztBQUFBLFFBQ0QsTUFBTTtBQUFBLGdCQUNOO0FBQUEsUUFDQSxLQUFLLElBQUk7QUFBQTtBQUFBLEtBR2YsR0FDQSxNQUNBLFNBQ0Y7QUFBQTtBQUVKOzs7QUNsQ0EsSUFBTSxpQkFBaUIsT0FBTyxJQUFJLHdCQUF3Qjs7O0FDRTFELElBQU0sU0FBUyxPQUFPLElBQUksZ0JBQWdCO0FBQzFDLElBQU0sVUFBVSxPQUFPLElBQUksaUJBQWlCO0FBQzVDLElBQU0scUJBQXFCLE9BQU8sSUFBSSw0QkFBNEI7QUFDbEUsSUFBTSxlQUFlLE9BQU8sSUFBSSxzQkFBc0I7QUFDdEQsSUFBTSxXQUFXLE9BQU8sSUFBSSxrQkFBa0I7QUFDOUMsSUFBTSxVQUFVLE9BQU8sSUFBSSxpQkFBaUI7QUFDNUMsSUFBTSxxQkFBcUIsT0FBTyxJQUFJLDRCQUE0QjtBQUNsRSxJQUFNLGlCQUFpQixPQUFPLElBQUksd0JBQXdCO0FBQUE7QUFDMUQsTUFBTSxNQUFNO0FBQUEsVUFDRixjQUFjO0FBQUEsU0FFZixTQUFTO0FBQUEsSUFDZCxNQUFNO0FBQUEsSUFDTjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQSxHQUtDO0FBQUEsR0FLQTtBQUFBLEdBRUE7QUFBQSxHQUVBO0FBQUEsR0FFQTtBQUFBLEdBS0E7QUFBQSxHQUVBLFdBQVc7QUFBQSxHQUVYLGtCQUFrQjtBQUFBLEdBRWxCLHNCQUEyQjtBQUFBLEVBQzVCLFdBQVcsQ0FBQyxNQUFNLFFBQVEsVUFBVTtBQUFBLElBQ2xDLEtBQUssYUFBYSxLQUFLLGdCQUFnQjtBQUFBLElBQ3ZDLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxZQUFZO0FBQUE7QUFFckI7QUFJQSxTQUFTLFlBQVksQ0FBQyxPQUFPO0FBQUEsRUFDM0IsT0FBTyxNQUFNO0FBQUE7QUFFZixTQUFTLGtCQUFrQixDQUFDLE9BQU87QUFBQSxFQUNqQyxPQUFPLEdBQUcsTUFBTSxXQUFXLFlBQVksTUFBTTtBQUFBOzs7QUNyRC9DLFNBQVMsWUFBWSxDQUFDLE9BQU87QUFBQSxFQUMzQixPQUFPLFVBQVUsUUFBUSxVQUFlLGFBQUssT0FBTyxNQUFNLFdBQVc7QUFBQTtBQUV2RSxTQUFTLFlBQVksQ0FBQyxTQUFTO0FBQUEsRUFDN0IsTUFBTSxTQUFTLEVBQUUsS0FBSyxJQUFJLFFBQVEsQ0FBQyxFQUFFO0FBQUEsRUFDckMsV0FBVyxTQUFTLFNBQVM7QUFBQSxJQUMzQixPQUFPLE9BQU8sTUFBTTtBQUFBLElBQ3BCLE9BQU8sT0FBTyxLQUFLLEdBQUcsTUFBTSxNQUFNO0FBQUEsSUFDbEMsSUFBSSxNQUFNLFNBQVMsUUFBUTtBQUFBLE1BQ3pCLEtBQUssT0FBTyxTQUFTO0FBQUEsUUFDbkIsT0FBTyxVQUFVLENBQUM7QUFBQSxNQUNwQjtBQUFBLE1BQ0EsT0FBTyxRQUFRLEtBQUssR0FBRyxNQUFNLE9BQU87QUFBQSxJQUN0QztBQUFBLEVBQ0Y7QUFBQSxFQUNBLE9BQU87QUFBQTtBQUFBO0FBRVQsTUFBTSxZQUFZO0FBQUEsVUFDUixjQUFjO0FBQUEsRUFDdEI7QUFBQSxFQUNBLFdBQVcsQ0FBQyxPQUFPO0FBQUEsSUFDakIsS0FBSyxRQUFRLE1BQU0sUUFBUSxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUs7QUFBQTtBQUFBLEVBRXBELE1BQU0sR0FBRztBQUFBLElBQ1AsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7QUFBQTtBQUV6QjtBQUFBO0FBQ0EsTUFBTSxJQUFJO0FBQUEsRUFDUixXQUFXLENBQUMsYUFBYTtBQUFBLElBQ3ZCLEtBQUssY0FBYztBQUFBLElBQ25CLFdBQVcsU0FBUyxhQUFhO0FBQUEsTUFDL0IsSUFBSSxHQUFHLE9BQU8sS0FBSyxHQUFHO0FBQUEsUUFDcEIsTUFBTSxhQUFhLE1BQU0sTUFBTSxPQUFPO0FBQUEsUUFDdEMsS0FBSyxXQUFXLEtBQ2QsZUFBb0IsWUFBSSxNQUFNLE1BQU0sT0FBTyxRQUFRLGFBQWEsTUFBTSxNQUFNLE1BQU0sT0FBTyxLQUMzRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUE7QUFBQSxVQUVNLGNBQWM7QUFBQSxFQUV0QixVQUFVO0FBQUEsRUFDVixxQkFBcUI7QUFBQSxFQUVyQixhQUFhLENBQUM7QUFBQSxFQUNkLE1BQU0sQ0FBQyxPQUFPO0FBQUEsSUFDWixLQUFLLFlBQVksS0FBSyxHQUFHLE1BQU0sV0FBVztBQUFBLElBQzFDLE9BQU87QUFBQTtBQUFBLEVBRVQsT0FBTyxDQUFDLFFBQVE7QUFBQSxJQUNkLE9BQU8sT0FBTyxnQkFBZ0Isb0JBQW9CLENBQUMsU0FBUztBQUFBLE1BQzFELE1BQU0sUUFBUSxLQUFLLDJCQUEyQixLQUFLLGFBQWEsTUFBTTtBQUFBLE1BQ3RFLE1BQU0sY0FBYztBQUFBLFFBQ2xCLHNCQUFzQixNQUFNO0FBQUEsUUFDNUIsd0JBQXdCLEtBQUssVUFBVSxNQUFNLE1BQU07QUFBQSxNQUNyRCxDQUFDO0FBQUEsTUFDRCxPQUFPO0FBQUEsS0FDUjtBQUFBO0FBQUEsRUFFSCwwQkFBMEIsQ0FBQyxRQUFRLFNBQVM7QUFBQSxJQUMxQyxNQUFNLFNBQVMsT0FBTyxPQUFPLENBQUMsR0FBRyxTQUFTO0FBQUEsTUFDeEMsY0FBYyxRQUFRLGdCQUFnQixLQUFLO0FBQUEsTUFDM0MsaUJBQWlCLFFBQVEsbUJBQW1CLEVBQUUsT0FBTyxFQUFFO0FBQUEsSUFDekQsQ0FBQztBQUFBLElBQ0Q7QUFBQSxNQUNFO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxRQUNFO0FBQUEsSUFDSixPQUFPLGFBQWEsT0FBTyxJQUFJLENBQUMsVUFBVTtBQUFBLE1BQ3hDLElBQUksR0FBRyxPQUFPLFdBQVcsR0FBRztBQUFBLFFBQzFCLE9BQU8sRUFBRSxLQUFLLE1BQU0sTUFBTSxLQUFLLEVBQUUsR0FBRyxRQUFRLENBQUMsRUFBRTtBQUFBLE1BQ2pEO0FBQUEsTUFDQSxJQUFJLEdBQUcsT0FBTyxJQUFJLEdBQUc7QUFBQSxRQUNuQixPQUFPLEVBQUUsS0FBSyxXQUFXLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxFQUFFO0FBQUEsTUFDcEQ7QUFBQSxNQUNBLElBQUksVUFBZSxXQUFHO0FBQUEsUUFDcEIsT0FBTyxFQUFFLEtBQUssSUFBSSxRQUFRLENBQUMsRUFBRTtBQUFBLE1BQy9CO0FBQUEsTUFDQSxJQUFJLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFBQSxRQUN4QixNQUFNLFNBQVMsQ0FBQyxJQUFJLFlBQVksR0FBRyxDQUFDO0FBQUEsUUFDcEMsWUFBWSxHQUFHLE1BQU0sTUFBTSxRQUFRLEdBQUc7QUFBQSxVQUNwQyxPQUFPLEtBQUssQ0FBQztBQUFBLFVBQ2IsSUFBSSxJQUFJLE1BQU0sU0FBUyxHQUFHO0FBQUEsWUFDeEIsT0FBTyxLQUFLLElBQUksWUFBWSxJQUFJLENBQUM7QUFBQSxVQUNuQztBQUFBLFFBQ0Y7QUFBQSxRQUNBLE9BQU8sS0FBSyxJQUFJLFlBQVksR0FBRyxDQUFDO0FBQUEsUUFDaEMsT0FBTyxLQUFLLDJCQUEyQixRQUFRLE1BQU07QUFBQSxNQUN2RDtBQUFBLE1BQ0EsSUFBSSxHQUFHLE9BQU8sR0FBRyxHQUFHO0FBQUEsUUFDbEIsT0FBTyxLQUFLLDJCQUEyQixNQUFNLGFBQWE7QUFBQSxhQUNyRDtBQUFBLFVBQ0gsY0FBYyxnQkFBZ0IsTUFBTTtBQUFBLFFBQ3RDLENBQUM7QUFBQSxNQUNIO0FBQUEsTUFDQSxJQUFJLEdBQUcsT0FBTyxLQUFLLEdBQUc7QUFBQSxRQUNwQixNQUFNLGFBQWEsTUFBTSxNQUFNLE9BQU87QUFBQSxRQUN0QyxNQUFNLFlBQVksTUFBTSxNQUFNLE9BQU87QUFBQSxRQUNyQyxPQUFPO0FBQUEsVUFDTCxLQUFLLGVBQW9CLGFBQUssTUFBTSxXQUFXLFdBQVcsU0FBUyxJQUFJLFdBQVcsVUFBVSxJQUFJLE1BQU0sV0FBVyxTQUFTO0FBQUEsVUFDMUgsUUFBUSxDQUFDO0FBQUEsUUFDWDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLElBQUksR0FBRyxPQUFPLE1BQU0sR0FBRztBQUFBLFFBQ3JCLE1BQU0sYUFBYSxPQUFPLGdCQUFnQixLQUFLO0FBQUEsUUFDL0MsSUFBSSxRQUFRLGlCQUFpQixXQUFXO0FBQUEsVUFDdEMsT0FBTyxFQUFFLEtBQUssV0FBVyxVQUFVLEdBQUcsUUFBUSxDQUFDLEVBQUU7QUFBQSxRQUNuRDtBQUFBLFFBQ0EsTUFBTSxhQUFhLE1BQU0sTUFBTSxNQUFNLE9BQU87QUFBQSxRQUM1QyxPQUFPO0FBQUEsVUFDTCxLQUFLLE1BQU0sTUFBTSxZQUFZLGVBQW9CLFlBQUksV0FBVyxNQUFNLE1BQU0sTUFBTSxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsVUFBVSxJQUFJLFdBQVcsVUFBVSxJQUFJLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsVUFBVTtBQUFBLFVBQ3hPLFFBQVEsQ0FBQztBQUFBLFFBQ1g7QUFBQSxNQUNGO0FBQUEsTUFDQSxJQUFJLEdBQUcsT0FBTyxJQUFJLEdBQUc7QUFBQSxRQUNuQixNQUFNLGFBQWEsTUFBTSxnQkFBZ0I7QUFBQSxRQUN6QyxNQUFNLFdBQVcsTUFBTSxnQkFBZ0I7QUFBQSxRQUN2QyxPQUFPO0FBQUEsVUFDTCxLQUFLLGVBQW9CLGFBQUssTUFBTSxnQkFBZ0IsVUFBVSxXQUFXLFFBQVEsSUFBSSxXQUFXLFVBQVUsSUFBSSxNQUFNLFdBQVcsUUFBUTtBQUFBLFVBQ3ZJLFFBQVEsQ0FBQztBQUFBLFFBQ1g7QUFBQSxNQUNGO0FBQUEsTUFDQSxJQUFJLEdBQUcsT0FBTyxLQUFLLEdBQUc7QUFBQSxRQUNwQixJQUFJLEdBQUcsTUFBTSxPQUFPLFdBQVcsR0FBRztBQUFBLFVBQ2hDLE9BQU8sRUFBRSxLQUFLLFlBQVksZ0JBQWdCLFNBQVMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRTtBQUFBLFFBQ2hHO0FBQUEsUUFDQSxNQUFNLGNBQWMsTUFBTSxVQUFVLE9BQU8sT0FBTyxNQUFNLFFBQVEsaUJBQWlCLE1BQU0sS0FBSztBQUFBLFFBQzVGLElBQUksR0FBRyxhQUFhLEdBQUcsR0FBRztBQUFBLFVBQ3hCLE9BQU8sS0FBSywyQkFBMkIsQ0FBQyxXQUFXLEdBQUcsTUFBTTtBQUFBLFFBQzlEO0FBQUEsUUFDQSxJQUFJLGNBQWM7QUFBQSxVQUNoQixPQUFPLEVBQUUsS0FBSyxLQUFLLGVBQWUsYUFBYSxNQUFNLEdBQUcsUUFBUSxDQUFDLEVBQUU7QUFBQSxRQUNyRTtBQUFBLFFBQ0EsSUFBSSxVQUFVLENBQUMsTUFBTTtBQUFBLFFBQ3JCLElBQUksZUFBZTtBQUFBLFVBQ2pCLFVBQVUsQ0FBQyxjQUFjLE1BQU0sT0FBTyxDQUFDO0FBQUEsUUFDekM7QUFBQSxRQUNBLE9BQU8sRUFBRSxLQUFLLFlBQVksZ0JBQWdCLFNBQVMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUcsUUFBUTtBQUFBLE1BQ2xHO0FBQUEsTUFDQSxJQUFJLEdBQUcsT0FBTyxXQUFXLEdBQUc7QUFBQSxRQUMxQixPQUFPLEVBQUUsS0FBSyxZQUFZLGdCQUFnQixTQUFTLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUU7QUFBQSxNQUNoRztBQUFBLE1BQ0EsSUFBSSxHQUFHLE9BQU8sSUFBSSxPQUFPLEtBQUssTUFBTSxlQUFvQixXQUFHO0FBQUEsUUFDekQsT0FBTyxFQUFFLEtBQUssV0FBVyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsRUFBRTtBQUFBLE1BQ3pEO0FBQUEsTUFDQSxJQUFJLEdBQUcsT0FBTyxRQUFRLEdBQUc7QUFBQSxRQUN2QixJQUFJLE1BQU0sRUFBRSxRQUFRO0FBQUEsVUFDbEIsT0FBTyxFQUFFLEtBQUssV0FBVyxNQUFNLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxFQUFFO0FBQUEsUUFDdEQ7QUFBQSxRQUNBLE9BQU8sS0FBSywyQkFBMkI7QUFBQSxVQUNyQyxJQUFJLFlBQVksR0FBRztBQUFBLFVBQ25CLE1BQU0sRUFBRTtBQUFBLFVBQ1IsSUFBSSxZQUFZLElBQUk7QUFBQSxVQUNwQixJQUFJLEtBQUssTUFBTSxFQUFFLEtBQUs7QUFBQSxRQUN4QixHQUFHLE1BQU07QUFBQSxNQUNYO0FBQUEsTUFDQSxJQUFJLFNBQVMsS0FBSyxHQUFHO0FBQUEsUUFDbkIsSUFBSSxNQUFNLFFBQVE7QUFBQSxVQUNoQixPQUFPLEVBQUUsS0FBSyxXQUFXLE1BQU0sTUFBTSxJQUFJLE1BQU0sV0FBVyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsRUFBRTtBQUFBLFFBQ3hGO0FBQUEsUUFDQSxPQUFPLEVBQUUsS0FBSyxXQUFXLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxFQUFFO0FBQUEsTUFDdkQ7QUFBQSxNQUNBLElBQUksYUFBYSxLQUFLLEdBQUc7QUFBQSxRQUN2QixJQUFJLE1BQU0sc0JBQXNCLEdBQUc7QUFBQSxVQUNqQyxPQUFPLEtBQUssMkJBQTJCLENBQUMsTUFBTSxPQUFPLENBQUMsR0FBRyxNQUFNO0FBQUEsUUFDakU7QUFBQSxRQUNBLE9BQU8sS0FBSywyQkFBMkI7QUFBQSxVQUNyQyxJQUFJLFlBQVksR0FBRztBQUFBLFVBQ25CLE1BQU0sT0FBTztBQUFBLFVBQ2IsSUFBSSxZQUFZLEdBQUc7QUFBQSxRQUNyQixHQUFHLE1BQU07QUFBQSxNQUNYO0FBQUEsTUFDQSxJQUFJLGNBQWM7QUFBQSxRQUNoQixPQUFPLEVBQUUsS0FBSyxLQUFLLGVBQWUsT0FBTyxNQUFNLEdBQUcsUUFBUSxDQUFDLEVBQUU7QUFBQSxNQUMvRDtBQUFBLE1BQ0EsT0FBTyxFQUFFLEtBQUssWUFBWSxnQkFBZ0IsU0FBUyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFO0FBQUEsS0FDL0YsQ0FBQztBQUFBO0FBQUEsRUFFSixjQUFjLENBQUMsU0FBUyxnQkFBZ0I7QUFBQSxJQUN0QyxJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLE9BQU8sVUFBVSxZQUFZLE9BQU8sVUFBVSxXQUFXO0FBQUEsTUFDM0QsT0FBTyxNQUFNLFNBQVM7QUFBQSxJQUN4QjtBQUFBLElBQ0EsSUFBSSxPQUFPLFVBQVUsVUFBVTtBQUFBLE1BQzdCLE9BQU8sYUFBYSxLQUFLO0FBQUEsSUFDM0I7QUFBQSxJQUNBLElBQUksT0FBTyxVQUFVLFVBQVU7QUFBQSxNQUM3QixNQUFNLHNCQUFzQixNQUFNLFNBQVM7QUFBQSxNQUMzQyxJQUFJLHdCQUF3QixtQkFBbUI7QUFBQSxRQUM3QyxPQUFPLGFBQWEsS0FBSyxVQUFVLEtBQUssQ0FBQztBQUFBLE1BQzNDO0FBQUEsTUFDQSxPQUFPLGFBQWEsbUJBQW1CO0FBQUEsSUFDekM7QUFBQSxJQUNBLE1BQU0sSUFBSSxNQUFNLDZCQUE2QixLQUFLO0FBQUE7QUFBQSxFQUVwRCxNQUFNLEdBQUc7QUFBQSxJQUNQLE9BQU87QUFBQTtBQUFBLEVBRVQsRUFBRSxDQUFDLE9BQU87QUFBQSxJQUNSLElBQUksVUFBZSxXQUFHO0FBQUEsTUFDcEIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLE9BQU8sSUFBSSxJQUFJLFFBQVEsTUFBTSxLQUFLO0FBQUE7QUFBQSxFQUVwQyxPQUFPLENBQUMsU0FBUztBQUFBLElBQ2YsS0FBSyxVQUFVLE9BQU8sWUFBWSxhQUFhLEVBQUUsb0JBQW9CLFFBQVEsSUFBSTtBQUFBLElBQ2pGLE9BQU87QUFBQTtBQUFBLEVBRVQsWUFBWSxHQUFHO0FBQUEsSUFDYixLQUFLLHFCQUFxQjtBQUFBLElBQzFCLE9BQU87QUFBQTtBQUFBLEVBUVQsRUFBRSxDQUFDLFdBQVc7QUFBQSxJQUNaLE9BQU8sWUFBWSxPQUFZO0FBQUE7QUFFbkM7QUFBQTtBQUNBLE1BQU0sS0FBSztBQUFBLEVBQ1QsV0FBVyxDQUFDLE9BQU87QUFBQSxJQUNqQixLQUFLLFFBQVE7QUFBQTtBQUFBLFVBRVAsY0FBYztBQUFBLEVBQ3RCO0FBQUEsRUFDQSxNQUFNLEdBQUc7QUFBQSxJQUNQLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUE7QUFFekI7QUFJQSxTQUFTLG9CQUFvQixDQUFDLE9BQU87QUFBQSxFQUNuQyxPQUFPLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxzQkFBc0IsU0FBUyxPQUFPLE1BQU0scUJBQXFCO0FBQUE7QUFFekgsSUFBTSxjQUFjO0FBQUEsRUFDbEIsb0JBQW9CLENBQUMsVUFBVTtBQUNqQztBQUNBLElBQU0sY0FBYztBQUFBLEVBQ2xCLGtCQUFrQixDQUFDLFVBQVU7QUFDL0I7QUFDQSxJQUFNLGFBQWE7QUFBQSxLQUNkO0FBQUEsS0FDQTtBQUNMO0FBQUE7QUFDQSxNQUFNLE1BQU07QUFBQSxFQUtWLFdBQVcsQ0FBQyxPQUFPLFVBQVUsYUFBYTtBQUFBLElBQ3hDLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxVQUFVO0FBQUE7QUFBQSxVQUVULGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsTUFBTSxHQUFHO0FBQUEsSUFDUCxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztBQUFBO0FBRXpCO0FBSUEsU0FBUyxHQUFHLENBQUMsWUFBWSxRQUFRO0FBQUEsRUFDL0IsTUFBTSxjQUFjLENBQUM7QUFBQSxFQUNyQixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsU0FBUyxLQUFLLFFBQVEsT0FBTyxJQUFJO0FBQUEsSUFDaEUsWUFBWSxLQUFLLElBQUksWUFBWSxRQUFRLEVBQUUsQ0FBQztBQUFBLEVBQzlDO0FBQUEsRUFDQSxZQUFZLFlBQVksV0FBVyxPQUFPLFFBQVEsR0FBRztBQUFBLElBQ25ELFlBQVksS0FBSyxRQUFRLElBQUksWUFBWSxRQUFRLGFBQWEsRUFBRSxDQUFDO0FBQUEsRUFDbkU7QUFBQSxFQUNBLE9BQU8sSUFBSSxJQUFJLFdBQVc7QUFBQTtBQUFBLENBRTNCLENBQUMsU0FBUztBQUFBLEVBQ1QsU0FBUyxLQUFLLEdBQUc7QUFBQSxJQUNmLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQztBQUFBO0FBQUEsRUFFbkIsS0FBSyxRQUFRO0FBQUEsRUFDYixTQUFTLFFBQVEsQ0FBQyxNQUFNO0FBQUEsSUFDdEIsT0FBTyxJQUFJLElBQUksSUFBSTtBQUFBO0FBQUEsRUFFckIsS0FBSyxXQUFXO0FBQUEsRUFDaEIsU0FBUyxHQUFHLENBQUMsS0FBSztBQUFBLElBQ2hCLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBQUE7QUFBQSxFQUV2QyxLQUFLLE1BQU07QUFBQSxFQUNYLFNBQVMsSUFBSSxDQUFDLFFBQVEsV0FBVztBQUFBLElBQy9CLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDaEIsWUFBWSxHQUFHLFVBQVUsT0FBTyxRQUFRLEdBQUc7QUFBQSxNQUN6QyxJQUFJLElBQUksS0FBSyxjQUFtQixXQUFHO0FBQUEsUUFDakMsT0FBTyxLQUFLLFNBQVM7QUFBQSxNQUN2QjtBQUFBLE1BQ0EsT0FBTyxLQUFLLEtBQUs7QUFBQSxJQUNuQjtBQUFBLElBQ0EsT0FBTyxJQUFJLElBQUksTUFBTTtBQUFBO0FBQUEsRUFFdkIsS0FBSyxPQUFPO0FBQUEsRUFDWixTQUFTLFVBQVUsQ0FBQyxPQUFPO0FBQUEsSUFDekIsT0FBTyxJQUFJLEtBQUssS0FBSztBQUFBO0FBQUEsRUFFdkIsS0FBSyxhQUFhO0FBQUEsRUFDbEIsU0FBUyxZQUFZLENBQUMsT0FBTztBQUFBLElBQzNCLE9BQU8sSUFBSSxZQUFZLEtBQUs7QUFBQTtBQUFBLEVBRTlCLEtBQUssY0FBYztBQUFBLEVBQ25CLFNBQVMsTUFBTSxDQUFDLE9BQU8sU0FBUztBQUFBLElBQzlCLE9BQU8sSUFBSSxNQUFNLE9BQU8sT0FBTztBQUFBO0FBQUEsRUFFakMsS0FBSyxRQUFRO0FBQUEsR0FDWixRQUFRLE1BQU0sQ0FBQyxFQUFFO0FBQUEsQ0FDbkIsQ0FBQyxTQUFTO0FBQUE7QUFBQSxFQUNULE1BQU0sUUFBUTtBQUFBLElBQ1osV0FBVyxDQUFDLE1BQU0sWUFBWTtBQUFBLE1BQzVCLEtBQUssTUFBTTtBQUFBLE1BQ1gsS0FBSyxhQUFhO0FBQUE7QUFBQSxZQUVaLGNBQWM7QUFBQSxJQUV0QixtQkFBbUI7QUFBQSxJQUNuQixNQUFNLEdBQUc7QUFBQSxNQUNQLE9BQU8sS0FBSztBQUFBO0FBQUEsSUFHZCxLQUFLLEdBQUc7QUFBQSxNQUNOLE9BQU8sSUFBSSxRQUFRLEtBQUssS0FBSyxLQUFLLFVBQVU7QUFBQTtBQUFBLEVBRWhEO0FBQUEsRUFDQSxLQUFLLFVBQVU7QUFBQSxHQUNkLFFBQVEsTUFBTSxDQUFDLEVBQUU7QUFBQTtBQUNwQixNQUFNLFlBQVk7QUFBQSxFQUNoQixXQUFXLENBQUMsT0FBTztBQUFBLElBQ2pCLEtBQUssT0FBTztBQUFBO0FBQUEsVUFFTixjQUFjO0FBQUEsRUFDdEIsTUFBTSxHQUFHO0FBQUEsSUFDUCxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztBQUFBO0FBRXpCO0FBSUEsU0FBUyxnQkFBZ0IsQ0FBQyxRQUFRLFFBQVE7QUFBQSxFQUN4QyxPQUFPLE9BQU8sSUFBSSxDQUFDLE1BQU07QUFBQSxJQUN2QixJQUFJLEdBQUcsR0FBRyxXQUFXLEdBQUc7QUFBQSxNQUN0QixNQUFNLEVBQUUsUUFBUSxTQUFTO0FBQUEsUUFDdkIsTUFBTSxJQUFJLE1BQU0sNkJBQTZCLEVBQUUsb0JBQW9CO0FBQUEsTUFDckU7QUFBQSxNQUNBLE9BQU8sT0FBTyxFQUFFO0FBQUEsSUFDbEI7QUFBQSxJQUNBLElBQUksR0FBRyxHQUFHLEtBQUssS0FBSyxHQUFHLEVBQUUsT0FBTyxXQUFXLEdBQUc7QUFBQSxNQUM1QyxNQUFNLEVBQUUsTUFBTSxRQUFRLFNBQVM7QUFBQSxRQUM3QixNQUFNLElBQUksTUFBTSw2QkFBNkIsRUFBRSxNQUFNLG9CQUFvQjtBQUFBLE1BQzNFO0FBQUEsTUFDQSxPQUFPLEVBQUUsUUFBUSxpQkFBaUIsT0FBTyxFQUFFLE1BQU0sS0FBSztBQUFBLElBQ3hEO0FBQUEsSUFDQSxPQUFPO0FBQUEsR0FDUjtBQUFBO0FBRUgsSUFBTSxnQkFBZ0IsT0FBTyxJQUFJLHVCQUF1QjtBQUFBO0FBQ3hELE1BQU0sS0FBSztBQUFBLFVBQ0QsY0FBYztBQUFBLEdBRXJCO0FBQUEsR0FFQSxpQkFBaUI7QUFBQSxFQUNsQixXQUFXLEdBQUcsTUFBTSxPQUFPLFFBQVEsZ0JBQWdCLFNBQVM7QUFBQSxJQUMxRCxLQUFLLGtCQUFrQjtBQUFBLE1BQ3JCLE1BQU07QUFBQSxNQUNOLGNBQWM7QUFBQSxNQUNkO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBLGFBQWE7QUFBQSxNQUNiLFNBQVM7QUFBQSxJQUNYO0FBQUE7QUFBQSxFQUVGLE1BQU0sR0FBRztBQUFBLElBQ1AsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7QUFBQTtBQUV6QjtBQU9BLE9BQU8sVUFBVSxTQUFTLFFBQVEsR0FBRztBQUFBLEVBQ25DLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUE7QUFFdkIsTUFBTSxVQUFVLFNBQVMsUUFBUSxHQUFHO0FBQUEsRUFDbEMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7QUFBQTtBQUV2QixTQUFTLFVBQVUsU0FBUyxRQUFRLEdBQUc7QUFBQSxFQUNyQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztBQUFBOzs7QUN2WnZCLE1BQU0sd0JBQXdCO0FBQUEsRUFDNUIsV0FBVyxDQUFDLE9BQU87QUFBQSxJQUNqQixLQUFLLFFBQVE7QUFBQTtBQUFBLFVBRVAsY0FBYztBQUFBLEVBQ3RCLEdBQUcsQ0FBQyxXQUFXLE1BQU07QUFBQSxJQUNuQixJQUFJLFNBQVMsU0FBUztBQUFBLE1BQ3BCLE9BQU8sS0FBSztBQUFBLElBQ2Q7QUFBQSxJQUNBLE9BQU8sVUFBVTtBQUFBO0FBRXJCO0FBQUE7QUFDQSxNQUFNLHVCQUF1QjtBQUFBLEVBQzNCLFdBQVcsQ0FBQyxPQUFPLHFCQUFxQjtBQUFBLElBQ3RDLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxzQkFBc0I7QUFBQTtBQUFBLFVBRXJCLGNBQWM7QUFBQSxFQUN0QixHQUFHLENBQUMsUUFBUSxNQUFNO0FBQUEsSUFDaEIsSUFBSSxTQUFTLE1BQU0sT0FBTyxTQUFTO0FBQUEsTUFDakMsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLElBQUksU0FBUyxNQUFNLE9BQU8sTUFBTTtBQUFBLE1BQzlCLE9BQU8sS0FBSztBQUFBLElBQ2Q7QUFBQSxJQUNBLElBQUksS0FBSyx1QkFBdUIsU0FBUyxNQUFNLE9BQU8sY0FBYztBQUFBLE1BQ2xFLE9BQU8sS0FBSztBQUFBLElBQ2Q7QUFBQSxJQUNBLElBQUksU0FBUyxnQkFBZ0I7QUFBQSxNQUMzQixPQUFPO0FBQUEsV0FDRixPQUFPO0FBQUEsUUFDVixNQUFNLEtBQUs7QUFBQSxRQUNYLFNBQVM7QUFBQSxNQUNYO0FBQUEsSUFDRjtBQUFBLElBQ0EsSUFBSSxTQUFTLE1BQU0sT0FBTyxTQUFTO0FBQUEsTUFDakMsTUFBTSxVQUFVLE9BQU8sTUFBTSxPQUFPO0FBQUEsTUFDcEMsS0FBSyxTQUFTO0FBQUEsUUFDWixPQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0EsTUFBTSxpQkFBaUIsQ0FBQztBQUFBLE1BQ3hCLE9BQU8sS0FBSyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVE7QUFBQSxRQUNoQyxlQUFlLE9BQU8sSUFBSSxNQUN4QixRQUFRLE1BQ1IsSUFBSSx3QkFBd0IsSUFBSSxNQUFNLFFBQVEsSUFBSSxDQUFDLENBQ3JEO0FBQUEsT0FDRDtBQUFBLE1BQ0QsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLE1BQU0sUUFBUSxPQUFPO0FBQUEsSUFDckIsSUFBSSxHQUFHLE9BQU8sTUFBTSxHQUFHO0FBQUEsTUFDckIsT0FBTyxJQUFJLE1BQU0sT0FBTyxJQUFJLHdCQUF3QixJQUFJLE1BQU0sUUFBUSxJQUFJLENBQUMsQ0FBQztBQUFBLElBQzlFO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFFWDtBQWFBLFNBQVMsWUFBWSxDQUFDLE9BQU8sWUFBWTtBQUFBLEVBQ3ZDLE9BQU8sSUFBSSxNQUFNLE9BQU8sSUFBSSx1QkFBdUIsWUFBWSxLQUFLLENBQUM7QUFBQTtBQUt2RSxTQUFTLGtCQUFrQixDQUFDLFFBQVEsWUFBWTtBQUFBLEVBQzlDLE9BQU8sSUFBSSxNQUNULFFBQ0EsSUFBSSx3QkFBd0IsSUFBSSxNQUFNLE9BQU8sT0FBTyxJQUFJLHVCQUF1QixZQUFZLEtBQUssQ0FBQyxDQUFDLENBQ3BHO0FBQUE7QUFFRixTQUFTLDZCQUE2QixDQUFDLE9BQU8sT0FBTztBQUFBLEVBQ25ELE9BQU8sSUFBSSxJQUFJLFFBQVEsdUJBQXVCLE1BQU0sS0FBSyxLQUFLLEdBQUcsTUFBTSxVQUFVO0FBQUE7QUFFbkYsU0FBUyxzQkFBc0IsQ0FBQyxPQUFPLE9BQU87QUFBQSxFQUM1QyxPQUFPLElBQUksS0FBSyxNQUFNLFlBQVksSUFBSSxDQUFDLE1BQU07QUFBQSxJQUMzQyxJQUFJLEdBQUcsR0FBRyxNQUFNLEdBQUc7QUFBQSxNQUNqQixPQUFPLG1CQUFtQixHQUFHLEtBQUs7QUFBQSxJQUNwQztBQUFBLElBQ0EsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBQUEsTUFDZCxPQUFPLHVCQUF1QixHQUFHLEtBQUs7QUFBQSxJQUN4QztBQUFBLElBQ0EsSUFBSSxHQUFHLEdBQUcsSUFBSSxPQUFPLEdBQUc7QUFBQSxNQUN0QixPQUFPLDhCQUE4QixHQUFHLEtBQUs7QUFBQSxJQUMvQztBQUFBLElBQ0EsT0FBTztBQUFBLEdBQ1IsQ0FBQztBQUFBOzs7QUM5RkosU0FBUyxZQUFZLENBQUMsU0FBUyxLQUFLLHFCQUFxQjtBQUFBLEVBQ3ZELE1BQU0sYUFBYSxDQUFDO0FBQUEsRUFDcEIsTUFBTSxTQUFTLFFBQVEsT0FDckIsQ0FBQyxXQUFXLE1BQU0sU0FBUyxnQkFBZ0I7QUFBQSxJQUN6QyxJQUFJO0FBQUEsSUFDSixJQUFJLEdBQUcsT0FBTyxNQUFNLEdBQUc7QUFBQSxNQUNyQixVQUFVO0FBQUEsSUFDWixFQUFPLFNBQUksR0FBRyxPQUFPLEdBQUcsR0FBRztBQUFBLE1BQ3pCLFVBQVUsTUFBTTtBQUFBLElBQ2xCLEVBQU87QUFBQSxNQUNMLFVBQVUsTUFBTSxJQUFJO0FBQUE7QUFBQSxJQUV0QixJQUFJLE9BQU87QUFBQSxJQUNYLFlBQVksZ0JBQWdCLGNBQWMsS0FBSyxRQUFRLEdBQUc7QUFBQSxNQUN4RCxJQUFJLGlCQUFpQixLQUFLLFNBQVMsR0FBRztBQUFBLFFBQ3BDLE1BQU0sYUFBYSxPQUFPO0FBQUEsVUFDeEIsS0FBSyxhQUFhLENBQUM7QUFBQSxRQUNyQjtBQUFBLFFBQ0EsT0FBTyxLQUFLO0FBQUEsTUFDZCxFQUFPO0FBQUEsUUFDTCxNQUFNLFdBQVcsSUFBSTtBQUFBLFFBQ3JCLE1BQU0sUUFBUSxLQUFLLGFBQWEsYUFBYSxPQUFPLE9BQU8sUUFBUSxtQkFBbUIsUUFBUTtBQUFBLFFBQzlGLElBQUksdUJBQXVCLEdBQUcsT0FBTyxNQUFNLEtBQUssS0FBSyxXQUFXLEdBQUc7QUFBQSxVQUNqRSxNQUFNLGFBQWEsS0FBSztBQUFBLFVBQ3hCLE1BQU0sY0FBYyxhQUFhO0FBQUEsWUFDL0IsV0FBVyxjQUFjLFVBQVUsT0FBTyxhQUFhLE1BQU0sS0FBSyxJQUFJO0FBQUEsVUFDeEUsRUFBTyxTQUFJLE9BQU8sV0FBVyxnQkFBZ0IsWUFBWSxXQUFXLGdCQUFnQixhQUFhLE1BQU0sS0FBSyxHQUFHO0FBQUEsWUFDN0csV0FBVyxjQUFjO0FBQUEsVUFDM0I7QUFBQSxRQUNGO0FBQUE7QUFBQSxJQUVKO0FBQUEsSUFDQSxPQUFPO0FBQUEsS0FFVCxDQUFDLENBQ0g7QUFBQSxFQUNBLElBQUksdUJBQXVCLE9BQU8sS0FBSyxVQUFVLEVBQUUsU0FBUyxHQUFHO0FBQUEsSUFDN0QsWUFBWSxZQUFZLGNBQWMsT0FBTyxRQUFRLFVBQVUsR0FBRztBQUFBLE1BQ2hFLElBQUksT0FBTyxjQUFjLGFBQWEsb0JBQW9CLFlBQVk7QUFBQSxRQUNwRSxPQUFPLGNBQWM7QUFBQSxNQUN2QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxPQUFPO0FBQUE7QUFFVCxTQUFTLG1CQUFtQixDQUFDLFFBQVEsWUFBWTtBQUFBLEVBQy9DLE9BQU8sT0FBTyxRQUFRLE1BQU0sRUFBRSxPQUFPLENBQUMsU0FBUyxNQUFNLFdBQVc7QUFBQSxJQUM5RCxJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsTUFDNUIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBRyxZQUFZLElBQUksSUFBSSxDQUFDLElBQUk7QUFBQSxJQUMxRCxJQUFJLEdBQUcsT0FBTyxNQUFNLEtBQUssR0FBRyxPQUFPLEdBQUcsS0FBSyxHQUFHLE9BQU8sSUFBSSxPQUFPLEdBQUc7QUFBQSxNQUNqRSxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsTUFBTSxDQUFDO0FBQUEsSUFDdEMsRUFBTyxTQUFJLEdBQUcsT0FBTyxLQUFLLEdBQUc7QUFBQSxNQUMzQixPQUFPLEtBQUssR0FBRyxvQkFBb0IsTUFBTSxNQUFNLE9BQU8sVUFBVSxPQUFPLENBQUM7QUFBQSxJQUMxRSxFQUFPO0FBQUEsTUFDTCxPQUFPLEtBQUssR0FBRyxvQkFBb0IsT0FBTyxPQUFPLENBQUM7QUFBQTtBQUFBLElBRXBELE9BQU87QUFBQSxLQUNOLENBQUMsQ0FBQztBQUFBO0FBRVAsU0FBUyxZQUFZLENBQUMsTUFBTSxPQUFPO0FBQUEsRUFDakMsTUFBTSxXQUFXLE9BQU8sS0FBSyxJQUFJO0FBQUEsRUFDakMsTUFBTSxZQUFZLE9BQU8sS0FBSyxLQUFLO0FBQUEsRUFDbkMsSUFBSSxTQUFTLFdBQVcsVUFBVSxRQUFRO0FBQUEsSUFDeEMsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLFlBQVksT0FBTyxRQUFRLFNBQVMsUUFBUSxHQUFHO0FBQUEsSUFDN0MsSUFBSSxRQUFRLFVBQVUsUUFBUTtBQUFBLE1BQzVCLE9BQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBRVQsU0FBUyxZQUFZLENBQUMsT0FBTyxRQUFRO0FBQUEsRUFDbkMsTUFBTSxVQUFVLE9BQU8sUUFBUSxNQUFNLEVBQUUsT0FBTyxJQUFJLFdBQVcsVUFBZSxTQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssV0FBVztBQUFBLElBQ25HLElBQUksR0FBRyxPQUFPLEdBQUcsS0FBSyxHQUFHLE9BQU8sTUFBTSxHQUFHO0FBQUEsTUFDdkMsT0FBTyxDQUFDLEtBQUssS0FBSztBQUFBLElBQ3BCLEVBQU87QUFBQSxNQUNMLE9BQU8sQ0FBQyxLQUFLLElBQUksTUFBTSxPQUFPLE1BQU0sTUFBTSxPQUFPLFNBQVMsSUFBSSxDQUFDO0FBQUE7QUFBQSxHQUVsRTtBQUFBLEVBQ0QsSUFBSSxRQUFRLFdBQVcsR0FBRztBQUFBLElBQ3hCLE1BQU0sSUFBSSxNQUFNLGtCQUFrQjtBQUFBLEVBQ3BDO0FBQUEsRUFDQSxPQUFPLE9BQU8sWUFBWSxPQUFPO0FBQUE7QUFFbkMsU0FBUyxXQUFXLENBQUMsV0FBVyxpQkFBaUI7QUFBQSxFQUMvQyxXQUFXLGlCQUFpQixpQkFBaUI7QUFBQSxJQUMzQyxXQUFXLFFBQVEsT0FBTyxvQkFBb0IsY0FBYyxTQUFTLEdBQUc7QUFBQSxNQUN0RSxJQUFJLFNBQVM7QUFBQSxRQUFlO0FBQUEsTUFDNUIsT0FBTyxlQUNMLFVBQVUsV0FDVixNQUNBLE9BQU8seUJBQXlCLGNBQWMsV0FBVyxJQUFJLHFCQUFxQixPQUFPLE9BQU8sSUFBSSxDQUN0RztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUE7QUFFRixTQUFTLGVBQWUsQ0FBQyxPQUFPO0FBQUEsRUFDOUIsT0FBTyxNQUFNLE1BQU0sT0FBTztBQUFBO0FBSzVCLFNBQVMsZ0JBQWdCLENBQUMsT0FBTztBQUFBLEVBQy9CLE9BQU8sR0FBRyxPQUFPLFFBQVEsSUFBSSxNQUFNLEVBQUUsUUFBUSxHQUFHLE9BQU8sSUFBSSxJQUFJLE1BQU0sZ0JBQWdCLE9BQU8sR0FBRyxPQUFPLEdBQUcsSUFBUyxZQUFJLE1BQU0sTUFBTSxPQUFPLFdBQVcsTUFBTSxNQUFNLE9BQU8sUUFBUSxNQUFNLE1BQU0sT0FBTztBQUFBO0FBRXBNLFNBQVMsc0JBQXNCLENBQUMsR0FBRyxHQUFHO0FBQUEsRUFDcEMsT0FBTztBQUFBLElBQ0wsTUFBTSxPQUFPLE1BQU0sWUFBWSxFQUFFLFNBQVMsSUFBSSxJQUFJO0FBQUEsSUFDbEQsUUFBUSxPQUFPLE1BQU0sV0FBVyxJQUFJO0FBQUEsRUFDdEM7QUFBQTtBQUlGLFNBQVMsUUFBUSxDQUFDLE1BQU07QUFBQSxFQUN0QixJQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVM7QUFBQSxJQUFNLE9BQU87QUFBQSxFQUN0RCxJQUFJLEtBQUssWUFBWSxTQUFTO0FBQUEsSUFBVSxPQUFPO0FBQUEsRUFDL0MsSUFBSSxZQUFZLE1BQU07QUFBQSxJQUNwQixNQUFNLE9BQU8sT0FBTyxLQUFLO0FBQUEsSUFDekIsSUFBSSxTQUFTLGNBQWMsU0FBUyxZQUFZLE9BQU8sS0FBSyxVQUFVLGdCQUFnQixlQUFlLFNBQVM7QUFBQSxNQUFhLE9BQU87QUFBQSxJQUNsSSxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ0EsSUFBSSxZQUFZLE1BQU07QUFBQSxJQUNwQixNQUFNLE9BQU8sT0FBTyxLQUFLO0FBQUEsSUFDekIsSUFBSSxTQUFTLFlBQVksU0FBUztBQUFBLE1BQWEsT0FBTztBQUFBLElBQ3RELE9BQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxJQUFJLFlBQVksTUFBTTtBQUFBLElBQ3BCLE1BQU0sT0FBTyxPQUFPLEtBQUs7QUFBQSxJQUN6QixJQUFJLFNBQVMsWUFBWSxTQUFTO0FBQUEsTUFBYSxPQUFPO0FBQUEsSUFDdEQsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLElBQUksVUFBVSxNQUFNO0FBQUEsSUFDbEIsSUFBSSxLQUFLLFlBQVksYUFBYSxLQUFLLFlBQVksaUJBQWlCLEtBQUssWUFBaUI7QUFBQSxNQUFHLE9BQU87QUFBQSxJQUNwRyxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ0EsSUFBSSxnQkFBZ0IsTUFBTTtBQUFBLElBQ3hCLE1BQU0sT0FBTyxPQUFPLEtBQUs7QUFBQSxJQUN6QixJQUFJLFNBQVMsWUFBWSxTQUFTLFlBQVksU0FBUztBQUFBLE1BQWEsT0FBTztBQUFBLElBQzNFLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxJQUFJLFlBQVksTUFBTTtBQUFBLElBQ3BCLE1BQU0sT0FBTyxPQUFPLEtBQUs7QUFBQSxJQUN6QixJQUFJLFNBQVMsWUFBWSxTQUFTLGNBQWMsU0FBUztBQUFBLE1BQWEsT0FBTztBQUFBLElBQzdFLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUUsV0FBVztBQUFBLElBQUcsT0FBTztBQUFBLEVBQzNDLE9BQU87QUFBQTtBQUVULElBQU0sY0FBYyxPQUFPLGdCQUFnQixjQUFjLE9BQU8sSUFBSTs7O0FDM0pwRSxNQUFNLGtCQUFrQjtBQUFBLFVBQ2QsY0FBYztBQUFBLEVBRXRCO0FBQUEsRUFFQTtBQUFBLEVBRUE7QUFBQSxFQUNBLFdBQVcsQ0FBQyxRQUFRLFNBQVM7QUFBQSxJQUMzQixLQUFLLFlBQVksTUFBTTtBQUFBLE1BQ3JCLFFBQVEsTUFBTSxTQUFTLG1CQUFtQixPQUFPO0FBQUEsTUFDakQsT0FBTyxFQUFFLE1BQU0sU0FBUyxjQUFjLGVBQWUsR0FBRyxPQUFPLGVBQWU7QUFBQTtBQUFBLElBRWhGLElBQUksU0FBUztBQUFBLE1BQ1gsS0FBSyxZQUFZLFFBQVE7QUFBQSxNQUN6QixLQUFLLFlBQVksUUFBUTtBQUFBLElBQzNCO0FBQUE7QUFBQSxFQUVGLFFBQVEsQ0FBQyxRQUFRO0FBQUEsSUFDZixLQUFLLFlBQVk7QUFBQSxJQUNqQixPQUFPO0FBQUE7QUFBQSxFQUVULFFBQVEsQ0FBQyxRQUFRO0FBQUEsSUFDZixLQUFLLFlBQVk7QUFBQSxJQUNqQixPQUFPO0FBQUE7QUFBQSxFQUdULEtBQUssQ0FBQyxPQUFPO0FBQUEsSUFDWCxPQUFPLElBQUksV0FBVyxPQUFPLElBQUk7QUFBQTtBQUVyQztBQUFBO0FBQ0EsTUFBTSxXQUFXO0FBQUEsRUFDZixXQUFXLENBQUMsT0FBTyxTQUFTO0FBQUEsSUFDMUIsS0FBSyxRQUFRO0FBQUEsSUFDYixLQUFLLFlBQVksUUFBUTtBQUFBLElBQ3pCLEtBQUssV0FBVyxRQUFRO0FBQUEsSUFDeEIsS0FBSyxXQUFXLFFBQVE7QUFBQTtBQUFBLFVBRWxCLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxPQUFPLEdBQUc7QUFBQSxJQUNSLFFBQVEsTUFBTSxTQUFTLG1CQUFtQixLQUFLLFVBQVU7QUFBQSxJQUN6RCxNQUFNLGNBQWMsUUFBUSxJQUFJLENBQUMsV0FBVyxPQUFPLElBQUk7QUFBQSxJQUN2RCxNQUFNLHFCQUFxQixlQUFlLElBQUksQ0FBQyxXQUFXLE9BQU8sSUFBSTtBQUFBLElBQ3JFLE1BQU0sU0FBUztBQUFBLE1BQ2IsS0FBSyxNQUFNO0FBQUEsTUFDWCxHQUFHO0FBQUEsTUFDSCxlQUFlLEdBQUcsTUFBTTtBQUFBLE1BQ3hCLEdBQUc7QUFBQSxJQUNMO0FBQUEsSUFDQSxPQUFPLFFBQVEsR0FBRyxPQUFPLEtBQUssR0FBRztBQUFBO0FBRXJDOzs7QUN0REEsU0FBUyxjQUFhLENBQUMsT0FBTyxTQUFTO0FBQUEsRUFDckMsT0FBTyxHQUFHLE1BQU0sY0FBYyxRQUFRLEtBQUssR0FBRztBQUFBOzs7QUNFaEQsTUFBTSw0QkFBNEIsY0FBYztBQUFBLFVBQ3RDLGNBQWM7QUFBQSxFQUN0QixvQkFBb0IsQ0FBQztBQUFBLEVBQ3JCLFVBQVUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxHQUFHO0FBQUEsSUFDNUIsS0FBSyxrQkFBa0IsS0FBSyxFQUFFLEtBQUssUUFBUSxDQUFDO0FBQUEsSUFDNUMsT0FBTztBQUFBO0FBQUEsRUFFVCxNQUFNLENBQUMsTUFBTTtBQUFBLElBQ1gsS0FBSyxPQUFPLFdBQVc7QUFBQSxJQUN2QixLQUFLLE9BQU8sYUFBYTtBQUFBLElBQ3pCLE9BQU87QUFBQTtBQUFBLEVBRVQsaUJBQWlCLENBQUMsSUFBSSxRQUFRO0FBQUEsSUFDNUIsS0FBSyxPQUFPLFlBQVk7QUFBQSxNQUN0QjtBQUFBLE1BQ0EsTUFBTTtBQUFBLE1BQ04sTUFBTSxRQUFRLFFBQVE7QUFBQSxJQUN4QjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFHVCxnQkFBZ0IsQ0FBQyxRQUFRLE9BQU87QUFBQSxJQUM5QixPQUFPLEtBQUssa0JBQWtCLElBQUksR0FBRyxLQUFLLGNBQWM7QUFBQSxNQUN0RCxRQUFRLENBQUMsTUFBTSxhQUFhO0FBQUEsUUFDMUIsTUFBTSxVQUFVLElBQUksa0JBQWtCLE1BQU07QUFBQSxVQUMxQyxNQUFNLGdCQUFnQixLQUFLO0FBQUEsVUFDM0IsT0FBTyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxFQUFFO0FBQUEsU0FDN0Q7QUFBQSxRQUNELElBQUksU0FBUyxVQUFVO0FBQUEsVUFDckIsUUFBUSxTQUFTLFNBQVMsUUFBUTtBQUFBLFFBQ3BDO0FBQUEsUUFDQSxJQUFJLFNBQVMsVUFBVTtBQUFBLFVBQ3JCLFFBQVEsU0FBUyxTQUFTLFFBQVE7QUFBQSxRQUNwQztBQUFBLFFBQ0EsT0FBTyxRQUFRLE1BQU0sS0FBSztBQUFBLFNBQ3pCLEtBQUssT0FBTztBQUFBLEtBQ2hCO0FBQUE7QUFFTDtBQUFBO0FBQ0EsTUFBTSxxQkFBcUIsT0FBTztBQUFBLEVBQ2hDLFdBQVcsQ0FBQyxPQUFPLFFBQVE7QUFBQSxJQUN6QixLQUFLLE9BQU8sWUFBWTtBQUFBLE1BQ3RCLE9BQU8sYUFBYSxlQUFjLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQztBQUFBLElBQ3hEO0FBQUEsSUFDQSxNQUFNLE9BQU8sTUFBTTtBQUFBLElBQ25CLEtBQUssUUFBUTtBQUFBO0FBQUEsVUFFUCxjQUFjO0FBQ3hCOzs7QUNsREEsTUFBTSw0QkFBNEIsb0JBQW9CO0FBQUEsVUFDNUMsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNO0FBQUEsSUFDaEIsTUFBTSxNQUFNLFVBQVUsY0FBYztBQUFBO0FBQUEsRUFHdEMsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLE9BQU8sSUFBSSxhQUFhLE9BQU8sS0FBSyxNQUFNO0FBQUE7QUFFOUM7QUFBQTtBQUNBLE1BQU0scUJBQXFCLGFBQWE7QUFBQSxVQUM5QixjQUFjO0FBQUEsRUFDdEIsVUFBVSxHQUFHO0FBQUEsSUFDWCxPQUFPO0FBQUE7QUFBQSxFQUVULGtCQUFrQixDQUFDLE9BQU87QUFBQSxJQUN4QixJQUFJLE9BQU8sV0FBVyxlQUFlLE9BQU8sTUFBTTtBQUFBLE1BQ2hELE1BQU0sTUFBTSxPQUFPLFNBQVMsS0FBSyxJQUFJLFFBQVEsaUJBQWlCLGNBQWMsT0FBTyxLQUFLLEtBQUssSUFBSSxNQUFNLFNBQVMsT0FBTyxLQUFLLE1BQU0sUUFBUSxNQUFNLFlBQVksTUFBTSxVQUFVLElBQUksT0FBTyxLQUFLLEtBQUs7QUFBQSxNQUNqTSxPQUFPLE9BQU8sSUFBSSxTQUFTLE1BQU0sQ0FBQztBQUFBLElBQ3BDO0FBQUEsSUFDQSxPQUFPLE9BQU8sWUFBWSxPQUFPLEtBQUssQ0FBQztBQUFBO0FBQUEsRUFFekMsZ0JBQWdCLENBQUMsT0FBTztBQUFBLElBQ3RCLE9BQU8sT0FBTyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBQUE7QUFFdkM7QUFBQTtBQUNBLE1BQU0sOEJBQThCLG9CQUFvQjtBQUFBLFVBQzlDLGNBQWM7QUFBQSxFQUN0QixXQUFXLENBQUMsTUFBTTtBQUFBLElBQ2hCLE1BQU0sTUFBTSxRQUFRLGdCQUFnQjtBQUFBO0FBQUEsRUFHdEMsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLE9BQU8sSUFBSSxlQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSx1QkFBdUIsYUFBYTtBQUFBLFVBQ2hDLGNBQWM7QUFBQSxFQUN0QixVQUFVLEdBQUc7QUFBQSxJQUNYLE9BQU87QUFBQTtBQUFBLEVBRVQsa0JBQWtCLENBQUMsT0FBTztBQUFBLElBQ3hCLElBQUksT0FBTyxXQUFXLGVBQWUsT0FBTyxNQUFNO0FBQUEsTUFDaEQsTUFBTSxNQUFNLE9BQU8sU0FBUyxLQUFLLElBQUksUUFBUSxpQkFBaUIsY0FBYyxPQUFPLEtBQUssS0FBSyxJQUFJLE1BQU0sU0FBUyxPQUFPLEtBQUssTUFBTSxRQUFRLE1BQU0sWUFBWSxNQUFNLFVBQVUsSUFBSSxPQUFPLEtBQUssS0FBSztBQUFBLE1BQ2pNLE9BQU8sS0FBSyxNQUFNLElBQUksU0FBUyxNQUFNLENBQUM7QUFBQSxJQUN4QztBQUFBLElBQ0EsT0FBTyxLQUFLLE1BQU0sWUFBWSxPQUFPLEtBQUssQ0FBQztBQUFBO0FBQUEsRUFFN0MsZ0JBQWdCLENBQUMsT0FBTztBQUFBLElBQ3RCLE9BQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxLQUFLLENBQUM7QUFBQTtBQUU1QztBQUFBO0FBQ0EsTUFBTSxnQ0FBZ0Msb0JBQW9CO0FBQUEsVUFDaEQsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNO0FBQUEsSUFDaEIsTUFBTSxNQUFNLFVBQVUsa0JBQWtCO0FBQUE7QUFBQSxFQUcxQyxLQUFLLENBQUMsT0FBTztBQUFBLElBQ1gsT0FBTyxJQUFJLGlCQUFpQixPQUFPLEtBQUssTUFBTTtBQUFBO0FBRWxEO0FBQUE7QUFDQSxNQUFNLHlCQUF5QixhQUFhO0FBQUEsVUFDbEMsY0FBYztBQUFBLEVBQ3RCLGtCQUFrQixDQUFDLE9BQU87QUFBQSxJQUN4QixJQUFJLE9BQU8sU0FBUyxLQUFLLEdBQUc7QUFBQSxNQUMxQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsT0FBTyxPQUFPLEtBQUssS0FBSztBQUFBO0FBQUEsRUFFMUIsVUFBVSxHQUFHO0FBQUEsSUFDWCxPQUFPO0FBQUE7QUFFWDtBQUNBLFNBQVMsSUFBSSxDQUFDLEdBQUcsR0FBRztBQUFBLEVBQ2xCLFFBQVEsTUFBTSxXQUFXLHVCQUF1QixHQUFHLENBQUM7QUFBQSxFQUNwRCxJQUFJLFFBQVEsU0FBUyxRQUFRO0FBQUEsSUFDM0IsT0FBTyxJQUFJLHNCQUFzQixJQUFJO0FBQUEsRUFDdkM7QUFBQSxFQUNBLElBQUksUUFBUSxTQUFTLFVBQVU7QUFBQSxJQUM3QixPQUFPLElBQUksb0JBQW9CLElBQUk7QUFBQSxFQUNyQztBQUFBLEVBQ0EsT0FBTyxJQUFJLHdCQUF3QixJQUFJO0FBQUE7OztBQ3JGekMsTUFBTSxrQ0FBa0Msb0JBQW9CO0FBQUEsVUFDbEQsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNLGFBQWEsa0JBQWtCO0FBQUEsSUFDL0MsTUFBTSxNQUFNLFVBQVUsb0JBQW9CO0FBQUEsSUFDMUMsS0FBSyxPQUFPLGNBQWM7QUFBQSxJQUMxQixLQUFLLE9BQU8sbUJBQW1CO0FBQUE7QUFBQSxFQUdqQyxLQUFLLENBQUMsT0FBTztBQUFBLElBQ1gsT0FBTyxJQUFJLG1CQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSwyQkFBMkIsYUFBYTtBQUFBLFVBQ3BDLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxXQUFXLENBQUMsT0FBTyxRQUFRO0FBQUEsSUFDekIsTUFBTSxPQUFPLE1BQU07QUFBQSxJQUNuQixLQUFLLFVBQVUsT0FBTyxpQkFBaUIsU0FBUyxPQUFPLFdBQVc7QUFBQSxJQUNsRSxLQUFLLFFBQVEsT0FBTyxpQkFBaUI7QUFBQSxJQUNyQyxLQUFLLFVBQVUsT0FBTyxpQkFBaUI7QUFBQTtBQUFBLEVBRXpDLFVBQVUsR0FBRztBQUFBLElBQ1gsT0FBTyxLQUFLO0FBQUE7QUFBQSxFQUVkLGtCQUFrQixDQUFDLE9BQU87QUFBQSxJQUN4QixPQUFPLE9BQU8sS0FBSyxZQUFZLGFBQWEsS0FBSyxRQUFRLEtBQUssSUFBSTtBQUFBO0FBQUEsRUFFcEUsZ0JBQWdCLENBQUMsT0FBTztBQUFBLElBQ3RCLE9BQU8sT0FBTyxLQUFLLFVBQVUsYUFBYSxLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQUE7QUFFbEU7QUFDQSxTQUFTLFVBQVUsQ0FBQyxrQkFBa0I7QUFBQSxFQUNwQyxPQUFPLENBQUMsR0FBRyxNQUFNO0FBQUEsSUFDZixRQUFRLE1BQU0sV0FBVyx1QkFBdUIsR0FBRyxDQUFDO0FBQUEsSUFDcEQsT0FBTyxJQUFJLDBCQUNULE1BQ0EsUUFDQSxnQkFDRjtBQUFBO0FBQUE7OztBQzFDSixNQUFNLGlDQUFpQyxvQkFBb0I7QUFBQSxVQUNqRCxjQUFjO0FBQUEsRUFDdEIsV0FBVyxDQUFDLE1BQU0sVUFBVSxZQUFZO0FBQUEsSUFDdEMsTUFBTSxNQUFNLFVBQVUsVUFBVTtBQUFBLElBQ2hDLEtBQUssT0FBTyxnQkFBZ0I7QUFBQTtBQUFBLEVBRTlCLFVBQVUsQ0FBQyxRQUFRO0FBQUEsSUFDakIsSUFBSSxRQUFRLGVBQWU7QUFBQSxNQUN6QixLQUFLLE9BQU8sZ0JBQWdCO0FBQUEsSUFDOUI7QUFBQSxJQUNBLEtBQUssT0FBTyxhQUFhO0FBQUEsSUFDekIsT0FBTyxNQUFNLFdBQVc7QUFBQTtBQUU1QjtBQUFBO0FBQ0EsTUFBTSwwQkFBMEIsYUFBYTtBQUFBLFVBQ25DLGNBQWM7QUFBQSxFQUN0QixnQkFBZ0IsS0FBSyxPQUFPO0FBQUEsRUFDNUIsVUFBVSxHQUFHO0FBQUEsSUFDWCxPQUFPO0FBQUE7QUFFWDtBQUFBO0FBQ0EsTUFBTSw2QkFBNkIseUJBQXlCO0FBQUEsVUFDbEQsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNO0FBQUEsSUFDaEIsTUFBTSxNQUFNLFVBQVUsZUFBZTtBQUFBO0FBQUEsRUFFdkMsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLE9BQU8sSUFBSSxjQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSxzQkFBc0Isa0JBQWtCO0FBQUEsVUFDcEMsY0FBYztBQUN4QjtBQUFBO0FBQ0EsTUFBTSwrQkFBK0IseUJBQXlCO0FBQUEsVUFDcEQsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNLE1BQU07QUFBQSxJQUN0QixNQUFNLE1BQU0sUUFBUSxpQkFBaUI7QUFBQSxJQUNyQyxLQUFLLE9BQU8sT0FBTztBQUFBO0FBQUEsRUFPckIsVUFBVSxHQUFHO0FBQUEsSUFDWCxPQUFPLEtBQUssUUFBUSwrREFBK0Q7QUFBQTtBQUFBLEVBRXJGLEtBQUssQ0FBQyxPQUFPO0FBQUEsSUFDWCxPQUFPLElBQUksZ0JBQ1QsT0FDQSxLQUFLLE1BQ1A7QUFBQTtBQUVKO0FBQUE7QUFDQSxNQUFNLHdCQUF3QixrQkFBa0I7QUFBQSxVQUN0QyxjQUFjO0FBQUEsRUFDdEIsT0FBTyxLQUFLLE9BQU87QUFBQSxFQUNuQixrQkFBa0IsQ0FBQyxPQUFPO0FBQUEsSUFDeEIsSUFBSSxLQUFLLE9BQU8sU0FBUyxhQUFhO0FBQUEsTUFDcEMsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFHO0FBQUEsSUFDN0I7QUFBQSxJQUNBLE9BQU8sSUFBSSxLQUFLLEtBQUs7QUFBQTtBQUFBLEVBRXZCLGdCQUFnQixDQUFDLE9BQU87QUFBQSxJQUN0QixNQUFNLE9BQU8sTUFBTSxRQUFRO0FBQUEsSUFDM0IsSUFBSSxLQUFLLE9BQU8sU0FBUyxhQUFhO0FBQUEsTUFDcEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxJQUFHO0FBQUEsSUFDOUI7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUVYO0FBQUE7QUFDQSxNQUFNLDZCQUE2Qix5QkFBeUI7QUFBQSxVQUNsRCxjQUFjO0FBQUEsRUFDdEIsV0FBVyxDQUFDLE1BQU0sTUFBTTtBQUFBLElBQ3RCLE1BQU0sTUFBTSxXQUFXLGVBQWU7QUFBQSxJQUN0QyxLQUFLLE9BQU8sT0FBTztBQUFBO0FBQUEsRUFFckIsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLE9BQU8sSUFBSSxjQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSxzQkFBc0Isa0JBQWtCO0FBQUEsVUFDcEMsY0FBYztBQUFBLEVBQ3RCLE9BQU8sS0FBSyxPQUFPO0FBQUEsRUFDbkIsa0JBQWtCLENBQUMsT0FBTztBQUFBLElBQ3hCLE9BQU8sT0FBTyxLQUFLLE1BQU07QUFBQTtBQUFBLEVBRTNCLGdCQUFnQixDQUFDLE9BQU87QUFBQSxJQUN0QixPQUFPLFFBQVEsSUFBSTtBQUFBO0FBRXZCO0FBQ0EsU0FBUyxPQUFPLENBQUMsR0FBRyxHQUFHO0FBQUEsRUFDckIsUUFBUSxNQUFNLFdBQVcsdUJBQXVCLEdBQUcsQ0FBQztBQUFBLEVBQ3BELElBQUksUUFBUSxTQUFTLGVBQWUsUUFBUSxTQUFTLGdCQUFnQjtBQUFBLElBQ25FLE9BQU8sSUFBSSx1QkFBdUIsTUFBTSxPQUFPLElBQUk7QUFBQSxFQUNyRDtBQUFBLEVBQ0EsSUFBSSxRQUFRLFNBQVMsV0FBVztBQUFBLElBQzlCLE9BQU8sSUFBSSxxQkFBcUIsTUFBTSxPQUFPLElBQUk7QUFBQSxFQUNuRDtBQUFBLEVBQ0EsT0FBTyxJQUFJLHFCQUFxQixJQUFJO0FBQUE7OztBQzFHdEMsTUFBTSw2QkFBNkIsb0JBQW9CO0FBQUEsVUFDN0MsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNO0FBQUEsSUFDaEIsTUFBTSxNQUFNLFVBQVUsZUFBZTtBQUFBO0FBQUEsRUFHdkMsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLE9BQU8sSUFBSSxjQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSxzQkFBc0IsYUFBYTtBQUFBLFVBQy9CLGNBQWM7QUFBQSxFQUN0QixrQkFBa0IsQ0FBQyxPQUFPO0FBQUEsSUFDeEIsSUFBSSxPQUFPLFVBQVU7QUFBQSxNQUFVLE9BQU87QUFBQSxJQUN0QyxPQUFPLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFFckIsVUFBVSxHQUFHO0FBQUEsSUFDWCxPQUFPO0FBQUE7QUFFWDtBQUFBO0FBQ0EsTUFBTSxtQ0FBbUMsb0JBQW9CO0FBQUEsVUFDbkQsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNO0FBQUEsSUFDaEIsTUFBTSxNQUFNLFVBQVUscUJBQXFCO0FBQUE7QUFBQSxFQUc3QyxLQUFLLENBQUMsT0FBTztBQUFBLElBQ1gsT0FBTyxJQUFJLG9CQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSw0QkFBNEIsYUFBYTtBQUFBLFVBQ3JDLGNBQWM7QUFBQSxFQUN0QixrQkFBa0IsQ0FBQyxPQUFPO0FBQUEsSUFDeEIsSUFBSSxPQUFPLFVBQVU7QUFBQSxNQUFVLE9BQU87QUFBQSxJQUN0QyxPQUFPLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFFckIsbUJBQW1CO0FBQUEsRUFDbkIsVUFBVSxHQUFHO0FBQUEsSUFDWCxPQUFPO0FBQUE7QUFFWDtBQUFBO0FBQ0EsTUFBTSxtQ0FBbUMsb0JBQW9CO0FBQUEsVUFDbkQsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNO0FBQUEsSUFDaEIsTUFBTSxNQUFNLFVBQVUscUJBQXFCO0FBQUE7QUFBQSxFQUc3QyxLQUFLLENBQUMsT0FBTztBQUFBLElBQ1gsT0FBTyxJQUFJLG9CQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSw0QkFBNEIsYUFBYTtBQUFBLFVBQ3JDLGNBQWM7QUFBQSxFQUN0QixxQkFBcUI7QUFBQSxFQUNyQixtQkFBbUI7QUFBQSxFQUNuQixVQUFVLEdBQUc7QUFBQSxJQUNYLE9BQU87QUFBQTtBQUVYO0FBQ0EsU0FBUyxPQUFPLENBQUMsR0FBRyxHQUFHO0FBQUEsRUFDckIsUUFBUSxNQUFNLFdBQVcsdUJBQXVCLEdBQUcsQ0FBQztBQUFBLEVBQ3BELE1BQU0sT0FBTyxRQUFRO0FBQUEsRUFDckIsT0FBTyxTQUFTLFdBQVcsSUFBSSwyQkFBMkIsSUFBSSxJQUFJLFNBQVMsV0FBVyxJQUFJLDJCQUEyQixJQUFJLElBQUksSUFBSSxxQkFBcUIsSUFBSTtBQUFBOzs7QUN4RTVKLE1BQU0sMEJBQTBCLG9CQUFvQjtBQUFBLFVBQzFDLGNBQWM7QUFBQSxFQUN0QixXQUFXLENBQUMsTUFBTTtBQUFBLElBQ2hCLE1BQU0sTUFBTSxVQUFVLFlBQVk7QUFBQTtBQUFBLEVBR3BDLEtBQUssQ0FBQyxPQUFPO0FBQUEsSUFDWCxPQUFPLElBQUksV0FBVyxPQUFPLEtBQUssTUFBTTtBQUFBO0FBRTVDO0FBQUE7QUFDQSxNQUFNLG1CQUFtQixhQUFhO0FBQUEsVUFDNUIsY0FBYztBQUFBLEVBQ3RCLFVBQVUsR0FBRztBQUFBLElBQ1gsT0FBTztBQUFBO0FBRVg7QUFDQSxTQUFTLElBQUksQ0FBQyxNQUFNO0FBQUEsRUFDbEIsT0FBTyxJQUFJLGtCQUFrQixRQUFRLEVBQUU7QUFBQTs7O0FDaEJ6QyxNQUFNLDBCQUEwQixvQkFBb0I7QUFBQSxVQUMxQyxjQUFjO0FBQUEsRUFDdEIsV0FBVyxDQUFDLE1BQU0sUUFBUTtBQUFBLElBQ3hCLE1BQU0sTUFBTSxVQUFVLFlBQVk7QUFBQSxJQUNsQyxLQUFLLE9BQU8sYUFBYSxPQUFPO0FBQUEsSUFDaEMsS0FBSyxPQUFPLFNBQVMsT0FBTztBQUFBO0FBQUEsRUFHOUIsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLE9BQU8sSUFBSSxXQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSxtQkFBbUIsYUFBYTtBQUFBLFVBQzVCLGNBQWM7QUFBQSxFQUN0QixhQUFhLEtBQUssT0FBTztBQUFBLEVBQ3pCLFNBQVMsS0FBSyxPQUFPO0FBQUEsRUFDckIsV0FBVyxDQUFDLE9BQU8sUUFBUTtBQUFBLElBQ3pCLE1BQU0sT0FBTyxNQUFNO0FBQUE7QUFBQSxFQUVyQixVQUFVLEdBQUc7QUFBQSxJQUNYLE9BQU8sT0FBTyxLQUFLLE9BQU8sU0FBUyxJQUFJLEtBQUssT0FBTyxZQUFZO0FBQUE7QUFFbkU7QUFBQTtBQUNBLE1BQU0sOEJBQThCLG9CQUFvQjtBQUFBLFVBQzlDLGNBQWM7QUFBQSxFQUN0QixXQUFXLENBQUMsTUFBTTtBQUFBLElBQ2hCLE1BQU0sTUFBTSxRQUFRLGdCQUFnQjtBQUFBO0FBQUEsRUFHdEMsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLE9BQU8sSUFBSSxlQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSx1QkFBdUIsYUFBYTtBQUFBLFVBQ2hDLGNBQWM7QUFBQSxFQUN0QixVQUFVLEdBQUc7QUFBQSxJQUNYLE9BQU87QUFBQTtBQUFBLEVBRVQsa0JBQWtCLENBQUMsT0FBTztBQUFBLElBQ3hCLE9BQU8sS0FBSyxNQUFNLEtBQUs7QUFBQTtBQUFBLEVBRXpCLGdCQUFnQixDQUFDLE9BQU87QUFBQSxJQUN0QixPQUFPLEtBQUssVUFBVSxLQUFLO0FBQUE7QUFFL0I7QUFDQSxTQUFTLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHO0FBQUEsRUFDdkIsUUFBUSxNQUFNLFdBQVcsdUJBQXVCLEdBQUcsQ0FBQztBQUFBLEVBQ3BELElBQUksT0FBTyxTQUFTLFFBQVE7QUFBQSxJQUMxQixPQUFPLElBQUksc0JBQXNCLElBQUk7QUFBQSxFQUN2QztBQUFBLEVBQ0EsT0FBTyxJQUFJLGtCQUFrQixNQUFNLE1BQU07QUFBQTs7O0FDckQzQyxNQUFNLHNCQUFzQjtBQUFBLFVBQ2xCLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsV0FBVyxDQUFDLFFBQVE7QUFBQSxJQUNsQixLQUFLLFNBQVMsS0FBSyxPQUFPO0FBQUE7QUFBQSxFQUU1QixHQUFHLENBQUMsVUFBVSxNQUFNO0FBQUEsSUFDbEIsSUFBSSxTQUFTLEtBQUs7QUFBQSxNQUNoQixPQUFPO0FBQUEsV0FDRixTQUFTO0FBQUEsUUFDWixnQkFBZ0IsSUFBSSxNQUNsQixTQUFTLEVBQUUsZ0JBQ1gsSUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxJQUFJLFNBQVMsZ0JBQWdCO0FBQUEsTUFDM0IsT0FBTztBQUFBLFdBQ0YsU0FBUztBQUFBLFFBQ1osZ0JBQWdCLElBQUksTUFDbEIsU0FBUyxnQkFBZ0IsZ0JBQ3pCLElBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsSUFBSSxPQUFPLFNBQVMsVUFBVTtBQUFBLE1BQzVCLE9BQU8sU0FBUztBQUFBLElBQ2xCO0FBQUEsSUFDQSxNQUFNLFVBQVUsR0FBRyxVQUFVLFFBQVEsSUFBSSxTQUFTLEVBQUUsaUJBQWlCLEdBQUcsVUFBVSxJQUFJLElBQUksU0FBUyxnQkFBZ0IsaUJBQWlCO0FBQUEsSUFDcEksTUFBTSxRQUFRLFFBQVE7QUFBQSxJQUN0QixJQUFJLEdBQUcsT0FBTyxJQUFJLE9BQU8sR0FBRztBQUFBLE1BQzFCLElBQUksS0FBSyxPQUFPLHVCQUF1QixVQUFVLE1BQU0sa0JBQWtCO0FBQUEsUUFDdkUsT0FBTyxNQUFNO0FBQUEsTUFDZjtBQUFBLE1BQ0EsTUFBTSxXQUFXLE1BQU0sTUFBTTtBQUFBLE1BQzdCLFNBQVMsbUJBQW1CO0FBQUEsTUFDNUIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLElBQUksR0FBRyxPQUFPLEdBQUcsR0FBRztBQUFBLE1BQ2xCLElBQUksS0FBSyxPQUFPLGdCQUFnQixPQUFPO0FBQUEsUUFDckMsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUNBLE1BQU0sSUFBSSxNQUNSLDJCQUEyQiw2SkFDN0I7QUFBQSxJQUNGO0FBQUEsSUFDQSxJQUFJLEdBQUcsT0FBTyxNQUFNLEdBQUc7QUFBQSxNQUNyQixJQUFJLEtBQUssT0FBTyxPQUFPO0FBQUEsUUFDckIsT0FBTyxJQUFJLE1BQ1QsT0FDQSxJQUFJLHdCQUNGLElBQUksTUFDRixNQUFNLE9BQ04sSUFBSSx1QkFBdUIsS0FBSyxPQUFPLE9BQU8sS0FBSyxPQUFPLHVCQUF1QixLQUFLLENBQ3hGLENBQ0YsQ0FDRjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsTUFBTTtBQUFBLE1BQy9DLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxPQUFPLElBQUksTUFBTSxPQUFPLElBQUksc0JBQXNCLEtBQUssTUFBTSxDQUFDO0FBQUE7QUFFbEU7OztBQ3RFQSxNQUFNLGFBQWE7QUFBQSxVQUNULGNBQWM7QUFBQSxHQUNyQixPQUFPLGVBQWU7QUFBQSxFQUN2QixLQUFLLENBQUMsWUFBWTtBQUFBLElBQ2hCLE9BQU8sS0FBSyxLQUFVLFdBQUcsVUFBVTtBQUFBO0FBQUEsRUFFckMsT0FBTyxDQUFDLFdBQVc7QUFBQSxJQUNqQixPQUFPLEtBQUssS0FDVixDQUFDLFVBQVU7QUFBQSxNQUNULFlBQVk7QUFBQSxNQUNaLE9BQU87QUFBQSxPQUVULENBQUMsV0FBVztBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osTUFBTTtBQUFBLEtBRVY7QUFBQTtBQUFBLEVBRUYsSUFBSSxDQUFDLGFBQWEsWUFBWTtBQUFBLElBQzVCLE9BQU8sS0FBSyxRQUFRLEVBQUUsS0FBSyxhQUFhLFVBQVU7QUFBQTtBQUV0RDs7O0FDaEJBLFNBQVMsdUJBQXVCLEdBQUc7QUFBQSxFQUNqQyxPQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBOzs7QUNYRixJQUFNLG9CQUFvQixPQUFPLElBQUksaUNBQWlDO0FBQUE7QUFDdEUsTUFBTSxvQkFBb0IsTUFBTTtBQUFBLFVBQ3RCLGNBQWM7QUFBQSxTQUVmLFNBQVMsT0FBTyxPQUFPLENBQUMsR0FBRyxNQUFNLFFBQVE7QUFBQSxJQUM5QztBQUFBLEVBQ0YsQ0FBQztBQUFBLEdBRUEsTUFBTSxPQUFPO0FBQUEsR0FFYixxQkFBcUIsQ0FBQztBQUFBLEdBRXRCLE1BQU0sT0FBTyxzQkFBMkI7QUFDM0M7QUFDQSxTQUFTLGVBQWUsQ0FBQyxNQUFNLFNBQVMsYUFBYSxRQUFRLFdBQVcsTUFBTTtBQUFBLEVBQzVFLE1BQU0sV0FBVyxJQUFJLFlBQVksTUFBTSxRQUFRLFFBQVE7QUFBQSxFQUN2RCxNQUFNLGdCQUFnQixPQUFPLFlBQVksYUFBYSxRQUFRLHdCQUF3QixDQUFDLElBQUk7QUFBQSxFQUMzRixNQUFNLGVBQWUsT0FBTyxZQUMxQixPQUFPLFFBQVEsYUFBYSxFQUFFLElBQUksRUFBRSxPQUFPLG9CQUFvQjtBQUFBLElBQzdELE1BQU0sYUFBYTtBQUFBLElBQ25CLFdBQVcsUUFBUSxLQUFLO0FBQUEsSUFDeEIsTUFBTSxTQUFTLFdBQVcsTUFBTSxRQUFRO0FBQUEsSUFDeEMsU0FBUyxtQkFBbUIsS0FBSyxHQUFHLFdBQVcsaUJBQWlCLFFBQVEsUUFBUSxDQUFDO0FBQUEsSUFDakYsT0FBTyxDQUFDLE9BQU8sTUFBTTtBQUFBLEdBQ3RCLENBQ0g7QUFBQSxFQUNBLE1BQU0sUUFBUSxPQUFPLE9BQU8sVUFBVSxZQUFZO0FBQUEsRUFDbEQsTUFBTSxNQUFNLE9BQU8sV0FBVztBQUFBLEVBQzlCLE1BQU0sTUFBTSxPQUFPLHNCQUFzQjtBQUFBLEVBQ3pDLElBQUksYUFBYTtBQUFBLElBQ2YsTUFBTSxZQUFZLE9BQU8sc0JBQXNCO0FBQUEsRUFDakQ7QUFBQSxFQUNBLE9BQU87QUFBQTtBQUVULElBQU0sY0FBYyxDQUFDLE1BQU0sU0FBUyxnQkFBZ0I7QUFBQSxFQUNsRCxPQUFPLGdCQUFnQixNQUFNLFNBQVMsV0FBVztBQUFBOzs7QUNyQ25ELE1BQU0sZUFBZTtBQUFBLEVBQ25CLFdBQVcsQ0FBQyxNQUFNLFFBQVE7QUFBQSxJQUN4QixLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssU0FBUztBQUFBO0FBQUEsVUFFUixjQUFjO0FBQUEsRUFDdEIsRUFBRSxJQUFJLFNBQVM7QUFBQSxJQUNiLE9BQU8sSUFBSSxhQUFhLEtBQUssTUFBTSxTQUFTLEtBQUssTUFBTTtBQUFBO0FBRTNEO0FBQUE7QUFDQSxNQUFNLGFBQWE7QUFBQSxVQUNULGNBQWM7QUFBQSxFQUV0QjtBQUFBLEVBQ0EsV0FBVyxDQUFDLE1BQU0sU0FBUyxRQUFRO0FBQUEsSUFDakMsS0FBSyxTQUFTO0FBQUEsTUFDWjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxPQUFZO0FBQUEsSUFDZDtBQUFBO0FBQUEsRUFLRixLQUFLLENBQUMsV0FBVztBQUFBLElBQ2YsS0FBSyxPQUFPLFFBQVE7QUFBQSxJQUNwQixPQUFPO0FBQUE7QUFBQSxFQUdULEtBQUssQ0FBQyxPQUFPO0FBQUEsSUFDWCxPQUFPLElBQUksTUFBTSxLQUFLLFFBQVEsS0FBSztBQUFBO0FBRXZDO0FBQUE7QUFDQSxNQUFNLE1BQU07QUFBQSxVQUNGLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsV0FBVyxDQUFDLFFBQVEsT0FBTztBQUFBLElBQ3pCLEtBQUssU0FBUyxLQUFLLFFBQVEsTUFBTTtBQUFBO0FBRXJDO0FBQ0EsU0FBUyxLQUFLLENBQUMsTUFBTTtBQUFBLEVBQ25CLE9BQU8sSUFBSSxlQUFlLE1BQU0sS0FBSztBQUFBOzs7QUNJdkMsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFPO0FBQUEsRUFDL0IsSUFBSSxHQUFHLE9BQU8sV0FBVyxHQUFHO0FBQUEsSUFDMUIsT0FBTyxDQUFDLEdBQUcsTUFBTSxNQUFNLE9BQU8sV0FBVztBQUFBLEVBQzNDO0FBQUEsRUFDQSxJQUFJLEdBQUcsT0FBTyxRQUFRLEdBQUc7QUFBQSxJQUN2QixPQUFPLE1BQU0sRUFBRSxjQUFjLENBQUM7QUFBQSxFQUNoQztBQUFBLEVBQ0EsSUFBSSxHQUFHLE9BQU8sR0FBRyxHQUFHO0FBQUEsSUFDbEIsT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUFBLEVBQzlCO0FBQUEsRUFDQSxPQUFPLENBQUM7QUFBQTs7O0FDbERWLE1BQU0seUJBQXlCLGFBQWE7QUFBQSxFQUMxQyxXQUFXLENBQUMsT0FBTyxTQUFTLFNBQVMsVUFBVTtBQUFBLElBQzdDLE1BQU07QUFBQSxJQUNOLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssU0FBUyxFQUFFLE9BQU8sU0FBUztBQUFBO0FBQUEsVUFFMUIsY0FBYztBQUFBLEVBRXRCO0FBQUEsRUE4QkEsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLEtBQUssT0FBTyxRQUFRO0FBQUEsSUFDcEIsT0FBTztBQUFBO0FBQUEsRUFFVCxPQUFPLElBQUksU0FBUztBQUFBLElBQ2xCLElBQUksT0FBTyxRQUFRLE9BQU8sWUFBWTtBQUFBLE1BQ3BDLE1BQU0sVUFBVSxRQUFRLEdBQ3RCLElBQUksTUFDRixLQUFLLE9BQU8sTUFBTSxNQUFNLE9BQU8sVUFDL0IsSUFBSSxzQkFBc0IsRUFBRSxvQkFBb0IsU0FBUyxhQUFhLE1BQU0sQ0FBQyxDQUMvRSxDQUNGO0FBQUEsTUFDQSxNQUFNLGVBQWUsTUFBTSxRQUFRLE9BQU8sSUFBSSxVQUFVLENBQUMsT0FBTztBQUFBLE1BQ2hFLEtBQUssT0FBTyxVQUFVO0FBQUEsSUFDeEIsRUFBTztBQUFBLE1BQ0wsTUFBTSxlQUFlO0FBQUEsTUFDckIsS0FBSyxPQUFPLFVBQVU7QUFBQTtBQUFBLElBRXhCLE9BQU87QUFBQTtBQUFBLEVBRVQsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLEtBQUssT0FBTyxRQUFRO0FBQUEsSUFDcEIsT0FBTztBQUFBO0FBQUEsRUFFVCxTQUFTLENBQUMsU0FBUyxLQUFLLE1BQU0sWUFBWSxPQUFPLFVBQVU7QUFBQSxJQUN6RCxLQUFLLE9BQU8sWUFBWSxvQkFBb0IsTUFBTTtBQUFBLElBQ2xELE9BQU87QUFBQTtBQUFBLEVBR1QsTUFBTSxHQUFHO0FBQUEsSUFDUCxPQUFPLEtBQUssUUFBUSxpQkFBaUIsS0FBSyxNQUFNO0FBQUE7QUFBQSxFQUVsRCxLQUFLLEdBQUc7QUFBQSxJQUNOLFFBQVEsU0FBUyxhQUFhLFNBQVMsS0FBSyxRQUFRLFdBQVcsS0FBSyxPQUFPLENBQUM7QUFBQSxJQUM1RSxPQUFPO0FBQUE7QUFBQSxFQUdULFFBQVEsQ0FBQyxpQkFBaUIsTUFBTTtBQUFBLElBQzlCLE9BQU8sS0FBSyxRQUFRLGlCQUFpQix3QkFBd0IsZ0JBQzNELEtBQUssUUFBUSxXQUFXLEtBQUssT0FBTyxDQUFDLEdBQ3JDLEtBQUssT0FBTyxXQUNaLEtBQUssT0FBTyxZQUFZLFFBQVEsT0FDaEMsTUFDSyxXQUNMO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixRQUFRLGlCQUFpQixLQUFLLE9BQU8sS0FBSztBQUFBLElBQzVDLENBQ0Y7QUFBQTtBQUFBLEVBRUYsT0FBTyxHQUFHO0FBQUEsSUFDUixPQUFPLEtBQUssU0FBUyxLQUFLO0FBQUE7QUFBQSxFQUU1QixNQUFNLENBQUMsc0JBQXNCO0FBQUEsSUFDM0IsT0FBTyxLQUFLLFNBQVMsRUFBRSxJQUFJLGlCQUFpQjtBQUFBO0FBQUEsRUFFOUMsTUFBTSxDQUFDLHNCQUFzQjtBQUFBLElBQzNCLE9BQU8sS0FBSyxTQUFTLEVBQUUsSUFBSSxpQkFBaUI7QUFBQTtBQUFBLEVBRTlDLE1BQU0sQ0FBQyxzQkFBc0I7QUFBQSxJQUMzQixPQUFPLEtBQUssU0FBUyxFQUFFLElBQUksaUJBQWlCO0FBQUE7QUFBQSxFQUU5QyxTQUFTLENBQUMsc0JBQXNCO0FBQUEsSUFDOUIsT0FBTyxLQUFLLFNBQVMsRUFBRSxPQUFPLGlCQUFpQjtBQUFBO0FBQUEsT0FFM0MsUUFBTyxDQUFDLG1CQUFtQjtBQUFBLElBQy9CLE9BQU8sS0FBSyxTQUFTLEVBQUUsUUFBUSxpQkFBaUI7QUFBQTtBQUFBLEVBRWxELFFBQVEsR0FBRztBQUFBLElBQ1QsT0FBTztBQUFBO0FBRVg7OztBQ3BIQSxTQUFTLFdBQVcsQ0FBQyxPQUFPO0FBQUEsRUFDMUIsTUFBTSxRQUFRLE1BQU0sUUFBUSxjQUFjLEVBQUUsRUFBRSxNQUFNLHlDQUF5QyxLQUFLLENBQUM7QUFBQSxFQUNuRyxPQUFPLE1BQU0sSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFBQTtBQUV6RCxTQUFTLFdBQVcsQ0FBQyxPQUFPO0FBQUEsRUFDMUIsTUFBTSxRQUFRLE1BQU0sUUFBUSxjQUFjLEVBQUUsRUFBRSxNQUFNLHlDQUF5QyxLQUFLLENBQUM7QUFBQSxFQUNuRyxPQUFPLE1BQU0sT0FBTyxDQUFDLEtBQUssTUFBTSxNQUFNO0FBQUEsSUFDcEMsTUFBTSxnQkFBZ0IsTUFBTSxJQUFJLEtBQUssWUFBWSxJQUFJLEdBQUcsS0FBSyxHQUFHLFlBQVksSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUFBLElBQzVGLE9BQU8sTUFBTTtBQUFBLEtBQ1osRUFBRTtBQUFBO0FBRVAsU0FBUyxRQUFRLENBQUMsT0FBTztBQUFBLEVBQ3ZCLE9BQU87QUFBQTtBQUFBO0FBRVQsTUFBTSxZQUFZO0FBQUEsVUFDUixjQUFjO0FBQUEsRUFFdEIsUUFBUSxDQUFDO0FBQUEsRUFDVCxlQUFlLENBQUM7QUFBQSxFQUNoQjtBQUFBLEVBQ0EsV0FBVyxDQUFDLFFBQVE7QUFBQSxJQUNsQixLQUFLLFVBQVUsV0FBVyxlQUFlLGNBQWMsV0FBVyxjQUFjLGNBQWM7QUFBQTtBQUFBLEVBRWhHLGVBQWUsQ0FBQyxRQUFRO0FBQUEsSUFDdEIsS0FBSyxPQUFPO0FBQUEsTUFBVyxPQUFPLE9BQU87QUFBQSxJQUNyQyxNQUFNLFNBQVMsT0FBTyxNQUFNLE1BQU0sT0FBTyxXQUFXO0FBQUEsSUFDcEQsTUFBTSxZQUFZLE9BQU8sTUFBTSxNQUFNLE9BQU87QUFBQSxJQUM1QyxNQUFNLE1BQU0sR0FBRyxVQUFVLGFBQWEsT0FBTztBQUFBLElBQzdDLEtBQUssS0FBSyxNQUFNLE1BQU07QUFBQSxNQUNwQixLQUFLLFdBQVcsT0FBTyxLQUFLO0FBQUEsSUFDOUI7QUFBQSxJQUNBLE9BQU8sS0FBSyxNQUFNO0FBQUE7QUFBQSxFQUVwQixVQUFVLENBQUMsT0FBTztBQUFBLElBQ2hCLE1BQU0sU0FBUyxNQUFNLE1BQU0sT0FBTyxXQUFXO0FBQUEsSUFDN0MsTUFBTSxZQUFZLE1BQU0sTUFBTSxPQUFPO0FBQUEsSUFDckMsTUFBTSxXQUFXLEdBQUcsVUFBVTtBQUFBLElBQzlCLEtBQUssS0FBSyxhQUFhLFdBQVc7QUFBQSxNQUNoQyxXQUFXLFVBQVUsT0FBTyxPQUFPLE1BQU0sTUFBTSxPQUFPLFFBQVEsR0FBRztBQUFBLFFBQy9ELE1BQU0sWUFBWSxHQUFHLFlBQVksT0FBTztBQUFBLFFBQ3hDLEtBQUssTUFBTSxhQUFhLEtBQUssUUFBUSxPQUFPLElBQUk7QUFBQSxNQUNsRDtBQUFBLE1BQ0EsS0FBSyxhQUFhLFlBQVk7QUFBQSxJQUNoQztBQUFBO0FBQUEsRUFFRixVQUFVLEdBQUc7QUFBQSxJQUNYLEtBQUssUUFBUSxDQUFDO0FBQUEsSUFDZCxLQUFLLGVBQWUsQ0FBQztBQUFBO0FBRXpCOzs7QUNsREEsTUFBTSxxQkFBcUIsTUFBTTtBQUFBLFVBQ3ZCLGNBQWM7QUFBQSxFQUN0QixXQUFXLEdBQUcsU0FBUyxTQUFTO0FBQUEsSUFDOUIsTUFBTSxPQUFPO0FBQUEsSUFDYixLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssUUFBUTtBQUFBO0FBRWpCO0FBQUE7QUFDQSxNQUFNLDBCQUEwQixNQUFNO0FBQUEsRUFDcEMsV0FBVyxDQUFDLE9BQU8sUUFBUSxPQUFPO0FBQUEsSUFDaEMsTUFBTSxpQkFBaUI7QUFBQSxVQUNqQixRQUFRO0FBQUEsSUFDZCxLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxRQUFRO0FBQUEsSUFDYixNQUFNLGtCQUFrQixNQUFNLGlCQUFpQjtBQUFBLElBQy9DLElBQUk7QUFBQSxNQUFPLEtBQUssUUFBUTtBQUFBO0FBRTVCO0FBQUE7QUFDQSxNQUFNLGlDQUFpQyxhQUFhO0FBQUEsVUFDMUMsY0FBYztBQUFBLEVBQ3RCLFdBQVcsR0FBRztBQUFBLElBQ1osTUFBTSxFQUFFLFNBQVMsV0FBVyxDQUFDO0FBQUE7QUFFakM7OztBQ3RCQSxJQUFNLHFCQUFvQixPQUFPLElBQUksNkJBQTZCO0FBQ2xFLElBQU0sWUFBWSxPQUFPLElBQUksbUJBQW1CO0FBQUE7QUFDaEQsTUFBTSxnQkFBZ0IsTUFBTTtBQUFBLFVBQ2xCLGNBQWM7QUFBQSxTQUVmLFNBQVMsT0FBTyxPQUFPLENBQUMsR0FBRyxNQUFNLFFBQVE7QUFBQSxJQUM5QztBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFBQSxHQUVBLHNCQUFxQixDQUFDO0FBQUEsR0FFdEIsYUFBYTtBQUFBLEdBRWIsTUFBTSxPQUFPLHNCQUEyQjtBQUFBLEdBRXhDLE1BQU0sT0FBTyxzQkFBc0IsQ0FBQztBQUN2Qzs7O0FDWkEsTUFBTSxrQkFBa0I7QUFBQSxVQUNkLGNBQWM7QUFBQSxFQUV0QjtBQUFBLEVBRUE7QUFBQSxFQUNBLFdBQVcsQ0FBQyxTQUFTLE1BQU07QUFBQSxJQUN6QixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssT0FBTztBQUFBO0FBQUEsRUFHZCxLQUFLLENBQUMsT0FBTztBQUFBLElBQ1gsT0FBTyxJQUFJLFdBQVcsT0FBTyxLQUFLLFNBQVMsS0FBSyxJQUFJO0FBQUE7QUFFeEQ7QUFBQTtBQUNBLE1BQU0sV0FBVztBQUFBLEVBQ2YsV0FBVyxDQUFDLE9BQU8sU0FBUyxNQUFNO0FBQUEsSUFDaEMsS0FBSyxRQUFRO0FBQUEsSUFDYixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssT0FBTztBQUFBO0FBQUEsVUFFTixjQUFjO0FBQUEsRUFDdEI7QUFBQSxFQUNBO0FBQUEsRUFDQSxPQUFPLEdBQUc7QUFBQSxJQUNSLE9BQU8sS0FBSyxRQUFRLEdBQUcsS0FBSyxNQUFNLFFBQVEsT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLENBQUMsV0FBVyxPQUFPLElBQUksRUFBRSxLQUFLLEdBQUc7QUFBQTtBQUVoSDs7O0FDdEJBLFNBQVMsV0FBVyxDQUFDLE9BQU8sUUFBUTtBQUFBLEVBQ2xDLElBQUkscUJBQXFCLE1BQU0sTUFBTSxhQUFhLEtBQUssTUFBTSxHQUFHLE9BQU8sS0FBSyxNQUFNLEdBQUcsT0FBTyxXQUFXLE1BQU0sR0FBRyxPQUFPLE1BQU0sTUFBTSxHQUFHLE9BQU8sS0FBSyxNQUFNLEdBQUcsT0FBTyxJQUFJLEdBQUc7QUFBQSxJQUN2SyxPQUFPLElBQUksTUFBTSxPQUFPLE1BQU07QUFBQSxFQUNoQztBQUFBLEVBQ0EsT0FBTztBQUFBO0FBRVQsSUFBTSxLQUFLLENBQUMsTUFBTSxVQUFVO0FBQUEsRUFDMUIsT0FBTyxNQUFNLFVBQVUsWUFBWSxPQUFPLElBQUk7QUFBQTtBQUVoRCxJQUFNLEtBQUssQ0FBQyxNQUFNLFVBQVU7QUFBQSxFQUMxQixPQUFPLE1BQU0sV0FBVyxZQUFZLE9BQU8sSUFBSTtBQUFBO0FBRWpELFNBQVMsR0FBRyxJQUFJLHNCQUFzQjtBQUFBLEVBQ3BDLE1BQU0sYUFBYSxxQkFBcUIsT0FDdEMsQ0FBQyxNQUFNLE1BQVcsU0FDcEI7QUFBQSxFQUNBLElBQUksV0FBVyxXQUFXLEdBQUc7QUFBQSxJQUMzQjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLElBQUksV0FBVyxXQUFXLEdBQUc7QUFBQSxJQUMzQixPQUFPLElBQUksSUFBSSxVQUFVO0FBQUEsRUFDM0I7QUFBQSxFQUNBLE9BQU8sSUFBSSxJQUFJO0FBQUEsSUFDYixJQUFJLFlBQVksR0FBRztBQUFBLElBQ25CLElBQUksS0FBSyxZQUFZLElBQUksWUFBWSxPQUFPLENBQUM7QUFBQSxJQUM3QyxJQUFJLFlBQVksR0FBRztBQUFBLEVBQ3JCLENBQUM7QUFBQTtBQUVILFNBQVMsRUFBRSxJQUFJLHNCQUFzQjtBQUFBLEVBQ25DLE1BQU0sYUFBYSxxQkFBcUIsT0FDdEMsQ0FBQyxNQUFNLE1BQVcsU0FDcEI7QUFBQSxFQUNBLElBQUksV0FBVyxXQUFXLEdBQUc7QUFBQSxJQUMzQjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLElBQUksV0FBVyxXQUFXLEdBQUc7QUFBQSxJQUMzQixPQUFPLElBQUksSUFBSSxVQUFVO0FBQUEsRUFDM0I7QUFBQSxFQUNBLE9BQU8sSUFBSSxJQUFJO0FBQUEsSUFDYixJQUFJLFlBQVksR0FBRztBQUFBLElBQ25CLElBQUksS0FBSyxZQUFZLElBQUksWUFBWSxNQUFNLENBQUM7QUFBQSxJQUM1QyxJQUFJLFlBQVksR0FBRztBQUFBLEVBQ3JCLENBQUM7QUFBQTtBQUVILFNBQVMsR0FBRyxDQUFDLFdBQVc7QUFBQSxFQUN0QixPQUFPLFVBQVU7QUFBQTtBQUVuQixJQUFNLEtBQUssQ0FBQyxNQUFNLFVBQVU7QUFBQSxFQUMxQixPQUFPLE1BQU0sVUFBVSxZQUFZLE9BQU8sSUFBSTtBQUFBO0FBRWhELElBQU0sTUFBTSxDQUFDLE1BQU0sVUFBVTtBQUFBLEVBQzNCLE9BQU8sTUFBTSxXQUFXLFlBQVksT0FBTyxJQUFJO0FBQUE7QUFFakQsSUFBTSxLQUFLLENBQUMsTUFBTSxVQUFVO0FBQUEsRUFDMUIsT0FBTyxNQUFNLFVBQVUsWUFBWSxPQUFPLElBQUk7QUFBQTtBQUVoRCxJQUFNLE1BQU0sQ0FBQyxNQUFNLFVBQVU7QUFBQSxFQUMzQixPQUFPLE1BQU0sV0FBVyxZQUFZLE9BQU8sSUFBSTtBQUFBO0FBRWpELFNBQVMsT0FBTyxDQUFDLFFBQVEsUUFBUTtBQUFBLEVBQy9CLElBQUksTUFBTSxRQUFRLE1BQU0sR0FBRztBQUFBLElBQ3pCLElBQUksT0FBTyxXQUFXLEdBQUc7QUFBQSxNQUN2QixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsT0FBTyxNQUFNLGFBQWEsT0FBTyxJQUFJLENBQUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDO0FBQUEsRUFDcEU7QUFBQSxFQUNBLE9BQU8sTUFBTSxhQUFhLFlBQVksUUFBUSxNQUFNO0FBQUE7QUFFdEQsU0FBUyxVQUFVLENBQUMsUUFBUSxRQUFRO0FBQUEsRUFDbEMsSUFBSSxNQUFNLFFBQVEsTUFBTSxHQUFHO0FBQUEsSUFDekIsSUFBSSxPQUFPLFdBQVcsR0FBRztBQUFBLE1BQ3ZCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxPQUFPLE1BQU0saUJBQWlCLE9BQU8sSUFBSSxDQUFDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztBQUFBLEVBQ3hFO0FBQUEsRUFDQSxPQUFPLE1BQU0saUJBQWlCLFlBQVksUUFBUSxNQUFNO0FBQUE7QUFFMUQsU0FBUyxNQUFNLENBQUMsT0FBTztBQUFBLEVBQ3JCLE9BQU8sTUFBTTtBQUFBO0FBRWYsU0FBUyxTQUFTLENBQUMsT0FBTztBQUFBLEVBQ3hCLE9BQU8sTUFBTTtBQUFBO0FBRWYsU0FBUyxNQUFNLENBQUMsVUFBVTtBQUFBLEVBQ3hCLE9BQU8sYUFBYTtBQUFBO0FBRXRCLFNBQVMsU0FBUyxDQUFDLFVBQVU7QUFBQSxFQUMzQixPQUFPLGlCQUFpQjtBQUFBO0FBRTFCLFNBQVMsT0FBTyxDQUFDLFFBQVEsS0FBSyxLQUFLO0FBQUEsRUFDakMsT0FBTyxNQUFNLGtCQUFrQixZQUFZLEtBQUssTUFBTSxTQUFTLFlBQzdELEtBQ0EsTUFDRjtBQUFBO0FBRUYsU0FBUyxVQUFVLENBQUMsUUFBUSxLQUFLLEtBQUs7QUFBQSxFQUNwQyxPQUFPLE1BQU0sc0JBQXNCLFlBQ2pDLEtBQ0EsTUFDRixTQUFTLFlBQVksS0FBSyxNQUFNO0FBQUE7QUFFbEMsU0FBUyxJQUFJLENBQUMsUUFBUSxPQUFPO0FBQUEsRUFDM0IsT0FBTyxNQUFNLGVBQWU7QUFBQTtBQUU5QixTQUFTLE9BQU8sQ0FBQyxRQUFRLE9BQU87QUFBQSxFQUM5QixPQUFPLE1BQU0sbUJBQW1CO0FBQUE7QUFFbEMsU0FBUyxLQUFLLENBQUMsUUFBUSxPQUFPO0FBQUEsRUFDNUIsT0FBTyxNQUFNLGdCQUFnQjtBQUFBO0FBRS9CLFNBQVMsUUFBUSxDQUFDLFFBQVEsT0FBTztBQUFBLEVBQy9CLE9BQU8sTUFBTSxvQkFBb0I7QUFBQTs7O0FDM0huQyxTQUFTLEdBQUcsQ0FBQyxRQUFRO0FBQUEsRUFDbkIsT0FBTyxNQUFNO0FBQUE7QUFFZixTQUFTLElBQUksQ0FBQyxRQUFRO0FBQUEsRUFDcEIsT0FBTyxNQUFNO0FBQUE7OztBQ3lCZixNQUFNLFNBQVM7QUFBQSxFQUNiLFdBQVcsQ0FBQyxhQUFhLGlCQUFpQixjQUFjO0FBQUEsSUFDdEQsS0FBSyxjQUFjO0FBQUEsSUFDbkIsS0FBSyxrQkFBa0I7QUFBQSxJQUN2QixLQUFLLGVBQWU7QUFBQSxJQUNwQixLQUFLLHNCQUFzQixnQkFBZ0IsTUFBTSxPQUFPO0FBQUE7QUFBQSxVQUVsRCxjQUFjO0FBQUEsRUFDdEI7QUFBQSxFQUNBO0FBQ0Y7QUFBQTtBQUNBLE1BQU0sVUFBVTtBQUFBLEVBQ2QsV0FBVyxDQUFDLE9BQU8sUUFBUTtBQUFBLElBQ3pCLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxTQUFTO0FBQUE7QUFBQSxVQUVSLGNBQWM7QUFDeEI7QUFBQTtBQUNBLE1BQU0sWUFBWSxTQUFTO0FBQUEsRUFDekIsV0FBVyxDQUFDLGFBQWEsaUJBQWlCLFFBQVEsWUFBWTtBQUFBLElBQzVELE1BQU0sYUFBYSxpQkFBaUIsUUFBUSxZQUFZO0FBQUEsSUFDeEQsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLGFBQWE7QUFBQTtBQUFBLFVBRVosY0FBYztBQUFBLEVBQ3RCLGFBQWEsQ0FBQyxXQUFXO0FBQUEsSUFDdkIsTUFBTSxXQUFXLElBQUksSUFDbkIsS0FBSyxhQUNMLEtBQUssaUJBQ0wsS0FBSyxRQUNMLEtBQUssVUFDUDtBQUFBLElBQ0EsU0FBUyxZQUFZO0FBQUEsSUFDckIsT0FBTztBQUFBO0FBRVg7QUFBQTtBQUNBLE1BQU0sYUFBYSxTQUFTO0FBQUEsRUFDMUIsV0FBVyxDQUFDLGFBQWEsaUJBQWlCLFFBQVE7QUFBQSxJQUNoRCxNQUFNLGFBQWEsaUJBQWlCLFFBQVEsWUFBWTtBQUFBLElBQ3hELEtBQUssU0FBUztBQUFBO0FBQUEsVUFFUixjQUFjO0FBQUEsRUFDdEIsYUFBYSxDQUFDLFdBQVc7QUFBQSxJQUN2QixNQUFNLFdBQVcsSUFBSSxLQUNuQixLQUFLLGFBQ0wsS0FBSyxpQkFDTCxLQUFLLE1BQ1A7QUFBQSxJQUNBLFNBQVMsWUFBWTtBQUFBLElBQ3JCLE9BQU87QUFBQTtBQUVYO0FBQ0EsU0FBUyxZQUFZLEdBQUc7QUFBQSxFQUN0QixPQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQTtBQUVGLFNBQVMsbUJBQW1CLEdBQUc7QUFBQSxFQUM3QixPQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBO0FBRUYsU0FBUyw2QkFBNkIsQ0FBQyxRQUFRLGVBQWU7QUFBQSxFQUM1RCxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUUsV0FBVyxLQUFLLGFBQWEsV0FBVyxHQUFHLE9BQU8sWUFBWSxLQUFLLEdBQUc7QUFBQSxJQUM1RixTQUFTLE9BQU87QUFBQSxFQUNsQjtBQUFBLEVBQ0EsTUFBTSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ3ZCLE1BQU0sa0JBQWtCLENBQUM7QUFBQSxFQUN6QixNQUFNLGVBQWUsQ0FBQztBQUFBLEVBQ3RCLFlBQVksS0FBSyxVQUFVLE9BQU8sUUFBUSxNQUFNLEdBQUc7QUFBQSxJQUNqRCxJQUFJLEdBQUcsT0FBTyxLQUFLLEdBQUc7QUFBQSxNQUNwQixNQUFNLFNBQVMsbUJBQW1CLEtBQUs7QUFBQSxNQUN2QyxNQUFNLG9CQUFvQixnQkFBZ0I7QUFBQSxNQUMxQyxjQUFjLFVBQVU7QUFBQSxNQUN4QixhQUFhLE9BQU87QUFBQSxRQUNsQixRQUFRO0FBQUEsUUFDUixRQUFRLE1BQU0sTUFBTSxPQUFPO0FBQUEsUUFDM0IsUUFBUSxNQUFNLE1BQU0sT0FBTztBQUFBLFFBQzNCLFNBQVMsTUFBTSxNQUFNLE9BQU87QUFBQSxRQUM1QixXQUFXLG1CQUFtQixhQUFhLENBQUM7QUFBQSxRQUM1QyxZQUFZLG1CQUFtQixjQUFjLENBQUM7QUFBQSxNQUNoRDtBQUFBLE1BQ0EsV0FBVyxVQUFVLE9BQU8sT0FDMUIsTUFBTSxNQUFNLE9BQU8sUUFDckIsR0FBRztBQUFBLFFBQ0QsSUFBSSxPQUFPLFNBQVM7QUFBQSxVQUNsQixhQUFhLEtBQUssV0FBVyxLQUFLLE1BQU07QUFBQSxRQUMxQztBQUFBLE1BQ0Y7QUFBQSxNQUNBLE1BQU0sY0FBYyxNQUFNLE1BQU0sT0FBTyxzQkFBc0IsTUFBTSxNQUFNLE9BQU8sbUJBQW1CO0FBQUEsTUFDbkcsSUFBSSxhQUFhO0FBQUEsUUFDZixXQUFXLGVBQWUsT0FBTyxPQUFPLFdBQVcsR0FBRztBQUFBLFVBQ3BELElBQUksR0FBRyxhQUFhLGlCQUFpQixHQUFHO0FBQUEsWUFDdEMsYUFBYSxLQUFLLFdBQVcsS0FBSyxHQUFHLFlBQVksT0FBTztBQUFBLFVBQzFEO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGLEVBQU8sU0FBSSxHQUFHLE9BQU8sU0FBUyxHQUFHO0FBQUEsTUFDL0IsTUFBTSxTQUFTLG1CQUFtQixNQUFNLEtBQUs7QUFBQSxNQUM3QyxNQUFNLFlBQVksY0FBYztBQUFBLE1BQ2hDLE1BQU0sYUFBYSxNQUFNLE9BQ3ZCLGNBQWMsTUFBTSxLQUFLLENBQzNCO0FBQUEsTUFDQSxJQUFJO0FBQUEsTUFDSixZQUFZLGNBQWMsYUFBYSxPQUFPLFFBQVEsVUFBVSxHQUFHO0FBQUEsUUFDakUsSUFBSSxXQUFXO0FBQUEsVUFDYixNQUFNLGNBQWMsYUFBYTtBQUFBLFVBQ2pDLFlBQVksVUFBVSxnQkFBZ0I7QUFBQSxVQUN0QyxJQUFJLFlBQVk7QUFBQSxZQUNkLFlBQVksV0FBVyxLQUFLLEdBQUcsVUFBVTtBQUFBLFVBQzNDO0FBQUEsUUFDRixFQUFPO0FBQUEsVUFDTCxNQUFNLFVBQVUsa0JBQWtCO0FBQUEsWUFDaEMsZ0JBQWdCLFVBQVU7QUFBQSxjQUN4QixXQUFXLENBQUM7QUFBQSxjQUNaO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxVQUNBLGdCQUFnQixRQUFRLFVBQVUsZ0JBQWdCO0FBQUE7QUFBQSxNQUV0RDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxPQUFPLEVBQUUsUUFBUSxjQUFjLGNBQWM7QUFBQTtBQUUvQyxTQUFTLFNBQVMsQ0FBQyxPQUFPLFlBQVk7QUFBQSxFQUNwQyxPQUFPLElBQUksVUFDVCxPQUNBLENBQUMsWUFBWSxPQUFPLFlBQ2xCLE9BQU8sUUFBUSxXQUFXLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLFdBQVc7QUFBQSxJQUN4RDtBQUFBLElBQ0EsTUFBTSxjQUFjLEdBQUc7QUFBQSxFQUN6QixDQUFDLENBQ0gsQ0FDRjtBQUFBO0FBRUYsU0FBUyxTQUFTLENBQUMsYUFBYTtBQUFBLEVBQzlCLE9BQU8sU0FBUyxHQUFHLENBQUMsT0FBTyxRQUFRO0FBQUEsSUFDakMsT0FBTyxJQUFJLElBQ1QsYUFDQSxPQUNBLFFBQ0EsUUFBUSxPQUFPLE9BQU8sQ0FBQyxLQUFLLE1BQU0sT0FBTyxFQUFFLFNBQVMsSUFBSSxLQUFLLEtBQy9EO0FBQUE7QUFBQTtBQUdKLFNBQVMsVUFBVSxDQUFDLGFBQWE7QUFBQSxFQUMvQixPQUFPLFNBQVMsSUFBSSxDQUFDLGlCQUFpQixRQUFRO0FBQUEsSUFDNUMsT0FBTyxJQUFJLEtBQUssYUFBYSxpQkFBaUIsTUFBTTtBQUFBO0FBQUE7QUFHeEQsU0FBUyxpQkFBaUIsQ0FBQyxRQUFRLGVBQWUsVUFBVTtBQUFBLEVBQzFELElBQUksR0FBRyxVQUFVLEdBQUcsS0FBSyxTQUFTLFFBQVE7QUFBQSxJQUN4QyxPQUFPO0FBQUEsTUFDTCxRQUFRLFNBQVMsT0FBTztBQUFBLE1BQ3hCLFlBQVksU0FBUyxPQUFPO0FBQUEsSUFDOUI7QUFBQSxFQUNGO0FBQUEsRUFDQSxNQUFNLHdCQUF3QixjQUFjLG1CQUFtQixTQUFTLGVBQWU7QUFBQSxFQUN2RixLQUFLLHVCQUF1QjtBQUFBLElBQzFCLE1BQU0sSUFBSSxNQUNSLFVBQVUsU0FBUyxnQkFBZ0IsTUFBTSxPQUFPLDRCQUNsRDtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE1BQU0sd0JBQXdCLE9BQU87QUFBQSxFQUNyQyxLQUFLLHVCQUF1QjtBQUFBLElBQzFCLE1BQU0sSUFBSSxNQUFNLFVBQVUsNENBQTRDO0FBQUEsRUFDeEU7QUFBQSxFQUNBLE1BQU0sY0FBYyxTQUFTO0FBQUEsRUFDN0IsTUFBTSxvQkFBb0IsY0FBYyxtQkFBbUIsV0FBVztBQUFBLEVBQ3RFLEtBQUssbUJBQW1CO0FBQUEsSUFDdEIsTUFBTSxJQUFJLE1BQ1IsVUFBVSxZQUFZLE1BQU0sT0FBTyw0QkFDckM7QUFBQSxFQUNGO0FBQUEsRUFDQSxNQUFNLG1CQUFtQixDQUFDO0FBQUEsRUFDMUIsV0FBVywyQkFBMkIsT0FBTyxPQUMzQyxzQkFBc0IsU0FDeEIsR0FBRztBQUFBLElBQ0QsSUFBSSxTQUFTLGdCQUFnQixhQUFhLDJCQUEyQix3QkFBd0IsaUJBQWlCLFNBQVMsaUJBQWlCLFNBQVMsZ0JBQWdCLHdCQUF3QixvQkFBb0IsU0FBUyxhQUFhO0FBQUEsTUFDak8saUJBQWlCLEtBQUssdUJBQXVCO0FBQUEsSUFDL0M7QUFBQSxFQUNGO0FBQUEsRUFDQSxJQUFJLGlCQUFpQixTQUFTLEdBQUc7QUFBQSxJQUMvQixNQUFNLFNBQVMsZUFBZSxJQUFJLE1BQ2hDLDJDQUEyQyxTQUFTLDJCQUEyQix3QkFDakYsSUFBSSxJQUFJLE1BQ04seUNBQXlDLCtCQUErQixTQUFTLFlBQVksTUFBTSxPQUFPLHNDQUM1RztBQUFBLEVBQ0Y7QUFBQSxFQUNBLElBQUksaUJBQWlCLE1BQU0sR0FBRyxpQkFBaUIsSUFBSSxHQUFHLEtBQUssaUJBQWlCLEdBQUcsUUFBUTtBQUFBLElBQ3JGLE9BQU87QUFBQSxNQUNMLFFBQVEsaUJBQWlCLEdBQUcsT0FBTztBQUFBLE1BQ25DLFlBQVksaUJBQWlCLEdBQUcsT0FBTztBQUFBLElBQ3pDO0FBQUEsRUFDRjtBQUFBLEVBQ0EsTUFBTSxJQUFJLE1BQ1Isc0RBQXNELHFCQUFxQixTQUFTLFlBQ3RGO0FBQUE7QUFFRixTQUFTLDJCQUEyQixDQUFDLGFBQWE7QUFBQSxFQUNoRCxPQUFPO0FBQUEsSUFDTCxLQUFLLFVBQVUsV0FBVztBQUFBLElBQzFCLE1BQU0sV0FBVyxXQUFXO0FBQUEsRUFDOUI7QUFBQTtBQUVGLFNBQVMsZ0JBQWdCLENBQUMsY0FBYyxhQUFhLEtBQUssMkJBQTJCLGlCQUFpQixDQUFDLFVBQVUsT0FBTztBQUFBLEVBQ3RILE1BQU0sU0FBUyxDQUFDO0FBQUEsRUFDaEI7QUFBQSxJQUNFO0FBQUEsSUFDQTtBQUFBLE9BQ0csMEJBQTBCLFFBQVEsR0FBRztBQUFBLElBQ3hDLElBQUksY0FBYyxRQUFRO0FBQUEsTUFDeEIsTUFBTSxXQUFXLFlBQVksVUFBVSxjQUFjO0FBQUEsTUFDckQsTUFBTSxhQUFhLElBQUk7QUFBQSxNQUN2QixNQUFNLFVBQVUsT0FBTyxlQUFlLFdBQVcsS0FBSyxNQUFNLFVBQVUsSUFBSTtBQUFBLE1BQzFFLE9BQU8sY0FBYyxTQUFTLEdBQUcsVUFBVSxHQUFHLElBQUksV0FBVyxpQkFDM0QsY0FDQSxhQUFhLGNBQWMscUJBQzNCLFNBQ0EsY0FBYyxXQUNkLGNBQ0YsSUFBSSxRQUFRLElBQ1YsQ0FBQyxXQUFXLGlCQUNWLGNBQ0EsYUFBYSxjQUFjLHFCQUMzQixRQUNBLGNBQWMsV0FDZCxjQUNGLENBQ0Y7QUFBQSxJQUNGLEVBQU87QUFBQSxNQUNMLE1BQU0sUUFBUSxlQUFlLElBQUksbUJBQW1CO0FBQUEsTUFDcEQsTUFBTSxRQUFRLGNBQWM7QUFBQSxNQUM1QixJQUFJO0FBQUEsTUFDSixJQUFJLEdBQUcsT0FBTyxNQUFNLEdBQUc7QUFBQSxRQUNyQixVQUFVO0FBQUEsTUFDWixFQUFPLFNBQUksR0FBRyxPQUFPLEdBQUcsR0FBRztBQUFBLFFBQ3pCLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLEVBQU87QUFBQSxRQUNMLFVBQVUsTUFBTSxJQUFJO0FBQUE7QUFBQSxNQUV0QixPQUFPLGNBQWMsU0FBUyxVQUFVLE9BQU8sT0FBTyxRQUFRLG1CQUFtQixLQUFLO0FBQUE7QUFBQSxFQUUxRjtBQUFBLEVBQ0EsT0FBTztBQUFBOzs7QUN4U1QsTUFBTSx1QkFBdUIsS0FBSztBQUFBLFVBQ3hCLGNBQWM7QUFDeEI7OztBQ2lCQSxNQUFNLGNBQWM7QUFBQSxVQUNWLGNBQWM7QUFBQSxFQUV0QjtBQUFBLEVBQ0EsV0FBVyxDQUFDLFFBQVE7QUFBQSxJQUNsQixLQUFLLFNBQVMsSUFBSSxZQUFZLFFBQVEsTUFBTTtBQUFBO0FBQUEsRUFFOUMsVUFBVSxDQUFDLE1BQU07QUFBQSxJQUNmLE9BQU8sSUFBSTtBQUFBO0FBQUEsRUFFYixXQUFXLENBQUMsTUFBTTtBQUFBLElBQ2hCLE9BQU87QUFBQTtBQUFBLEVBRVQsWUFBWSxDQUFDLEtBQUs7QUFBQSxJQUNoQixPQUFPLElBQUksSUFBSSxRQUFRLE1BQU0sSUFBSTtBQUFBO0FBQUEsRUFFbkMsWUFBWSxDQUFDLFNBQVM7QUFBQSxJQUNwQixLQUFLLFNBQVM7QUFBQSxNQUFRO0FBQUEsSUFDdEIsTUFBTSxnQkFBZ0IsQ0FBQyxVQUFVO0FBQUEsSUFDakMsWUFBWSxHQUFHLE1BQU0sUUFBUSxRQUFRLEdBQUc7QUFBQSxNQUN0QyxjQUFjLEtBQUssTUFBTSxJQUFJLFdBQVcsRUFBRSxFQUFFLEtBQUssU0FBUyxFQUFFLEVBQUUsTUFBTTtBQUFBLE1BQ3BFLElBQUksSUFBSSxRQUFRLFNBQVMsR0FBRztBQUFBLFFBQzFCLGNBQWMsS0FBSyxPQUFPO0FBQUEsTUFDNUI7QUFBQSxJQUNGO0FBQUEsSUFDQSxjQUFjLEtBQUssTUFBTTtBQUFBLElBQ3pCLE9BQU8sSUFBSSxLQUFLLGFBQWE7QUFBQTtBQUFBLEVBRS9CLGdCQUFnQixHQUFHLE9BQU8sT0FBTyxXQUFXLFVBQVUsT0FBTyxXQUFXO0FBQUEsSUFDdEUsTUFBTSxVQUFVLEtBQUssYUFBYSxRQUFRO0FBQUEsSUFDMUMsTUFBTSxlQUFlLFlBQVksaUJBQWlCLEtBQUssZUFBZSxXQUFXLEVBQUUsZUFBZSxLQUFLLENBQUMsTUFBVztBQUFBLElBQ25ILE1BQU0sV0FBVyxRQUFRLGFBQWEsVUFBZTtBQUFBLElBQ3JELE1BQU0sYUFBYSxLQUFLLGFBQWEsT0FBTztBQUFBLElBQzVDLE1BQU0sV0FBVyxLQUFLLFdBQVcsS0FBSztBQUFBLElBQ3RDLE9BQU8sTUFBTSxzQkFBc0IsUUFBUSxXQUFXLGVBQWUsYUFBYTtBQUFBO0FBQUEsRUFFcEYsY0FBYyxDQUFDLE9BQU8sS0FBSztBQUFBLElBQ3pCLE1BQU0sZUFBZSxNQUFNLE1BQU0sT0FBTztBQUFBLElBQ3hDLE1BQU0sY0FBYyxPQUFPLEtBQUssWUFBWSxFQUFFLE9BQzVDLENBQUMsWUFBWSxJQUFJLGFBQWtCLGFBQUssYUFBYSxVQUFVLGVBQW9CLFNBQ3JGO0FBQUEsSUFDQSxNQUFNLFVBQVUsWUFBWTtBQUFBLElBQzVCLE9BQU8sSUFBSSxLQUFLLFlBQVksUUFBUSxDQUFDLFNBQVMsTUFBTTtBQUFBLE1BQ2xELE1BQU0sTUFBTSxhQUFhO0FBQUEsTUFDekIsTUFBTSxRQUFRLElBQUksWUFBWSxJQUFJLE1BQU0sSUFBSSxXQUFXLEdBQUcsR0FBRztBQUFBLE1BQzdELE1BQU0sTUFBTSxNQUFNLElBQUksV0FBVyxLQUFLLE9BQU8sZ0JBQWdCLEdBQUcsQ0FBQyxPQUFPO0FBQUEsTUFDeEUsSUFBSSxJQUFJLFVBQVUsR0FBRztBQUFBLFFBQ25CLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUM7QUFBQSxNQUM1QjtBQUFBLE1BQ0EsT0FBTyxDQUFDLEdBQUc7QUFBQSxLQUNaLENBQUM7QUFBQTtBQUFBLEVBRUosZ0JBQWdCLEdBQUcsT0FBTyxLQUFLLE9BQU8sV0FBVyxVQUFVLE9BQU8sTUFBTSxPQUFPLFdBQVc7QUFBQSxJQUN4RixNQUFNLFVBQVUsS0FBSyxhQUFhLFFBQVE7QUFBQSxJQUMxQyxNQUFNLFNBQVMsS0FBSyxlQUFlLE9BQU8sR0FBRztBQUFBLElBQzdDLE1BQU0sVUFBVSxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxRQUFRLEdBQUcsS0FBSyxlQUFlLElBQUksQ0FBQyxDQUFDO0FBQUEsSUFDL0UsTUFBTSxXQUFXLEtBQUssV0FBVyxLQUFLO0FBQUEsSUFDdEMsTUFBTSxlQUFlLFlBQVksaUJBQWlCLEtBQUssZUFBZSxXQUFXLEVBQUUsZUFBZSxLQUFLLENBQUMsTUFBVztBQUFBLElBQ25ILE1BQU0sV0FBVyxRQUFRLGFBQWEsVUFBZTtBQUFBLElBQ3JELE1BQU0sYUFBYSxLQUFLLGFBQWEsT0FBTztBQUFBLElBQzVDLE1BQU0sV0FBVyxLQUFLLFdBQVcsS0FBSztBQUFBLElBQ3RDLE9BQU8sTUFBTSxpQkFBaUIsYUFBYSxTQUFTLFVBQVUsV0FBVyxXQUFXLGVBQWUsYUFBYTtBQUFBO0FBQUEsRUFhbEgsY0FBYyxDQUFDLFVBQVUsZ0JBQWdCLFVBQVUsQ0FBQyxHQUFHO0FBQUEsSUFDckQsTUFBTSxhQUFhLE9BQU87QUFBQSxJQUMxQixNQUFNLFNBQVMsT0FBTyxRQUFRLEdBQUcsU0FBUyxNQUFNO0FBQUEsTUFDOUMsTUFBTSxRQUFRLENBQUM7QUFBQSxNQUNmLElBQUksR0FBRyxPQUFPLElBQUksT0FBTyxLQUFLLE1BQU0sa0JBQWtCO0FBQUEsUUFDcEQsTUFBTSxLQUFLLElBQUksV0FBVyxNQUFNLFVBQVUsQ0FBQztBQUFBLE1BQzdDLEVBQU8sU0FBSSxHQUFHLE9BQU8sSUFBSSxPQUFPLEtBQUssR0FBRyxPQUFPLEdBQUcsR0FBRztBQUFBLFFBQ25ELE1BQU0sUUFBUSxHQUFHLE9BQU8sSUFBSSxPQUFPLElBQUksTUFBTSxNQUFNO0FBQUEsUUFDbkQsSUFBSSxlQUFlO0FBQUEsVUFDakIsTUFBTSxLQUNKLElBQUksSUFDRixNQUFNLFlBQVksSUFBSSxDQUFDLE1BQU07QUFBQSxZQUMzQixJQUFJLEdBQUcsR0FBRyxNQUFNLEdBQUc7QUFBQSxjQUNqQixPQUFPLElBQUksV0FBVyxLQUFLLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQztBQUFBLFlBQ3REO0FBQUEsWUFDQSxPQUFPO0FBQUEsV0FDUixDQUNILENBQ0Y7QUFBQSxRQUNGLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxLQUFLO0FBQUE7QUFBQSxRQUVsQixJQUFJLEdBQUcsT0FBTyxJQUFJLE9BQU8sR0FBRztBQUFBLFVBQzFCLE1BQU0sS0FBSyxVQUFVLElBQUksV0FBVyxNQUFNLFVBQVUsR0FBRztBQUFBLFFBQ3pEO0FBQUEsTUFDRixFQUFPLFNBQUksR0FBRyxPQUFPLE1BQU0sR0FBRztBQUFBLFFBQzVCLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxPQUFPO0FBQUEsUUFDM0MsSUFBSSxNQUFNLGVBQWUsdUJBQXVCO0FBQUEsVUFDOUMsSUFBSSxlQUFlO0FBQUEsWUFDakIsTUFBTSxLQUFLLFdBQVcsSUFBSSxXQUFXLEtBQUssT0FBTyxnQkFBZ0IsS0FBSyxDQUFDLFlBQVk7QUFBQSxVQUNyRixFQUFPO0FBQUEsWUFDTCxNQUFNLEtBQ0osV0FBVyxJQUFJLFdBQVcsU0FBUyxLQUFLLElBQUksV0FBVyxLQUFLLE9BQU8sZ0JBQWdCLEtBQUssQ0FBQyxZQUMzRjtBQUFBO0FBQUEsUUFFSixFQUFPO0FBQUEsVUFDTCxJQUFJLGVBQWU7QUFBQSxZQUNqQixNQUFNLEtBQUssSUFBSSxXQUFXLEtBQUssT0FBTyxnQkFBZ0IsS0FBSyxDQUFDLENBQUM7QUFBQSxVQUMvRCxFQUFPO0FBQUEsWUFDTCxNQUFNLEtBQUssTUFBTSxJQUFJLFdBQVcsU0FBUyxLQUFLLElBQUksV0FBVyxLQUFLLE9BQU8sZ0JBQWdCLEtBQUssQ0FBQyxHQUFHO0FBQUE7QUFBQTtBQUFBLE1BR3hHO0FBQUEsTUFDQSxJQUFJLElBQUksYUFBYSxHQUFHO0FBQUEsUUFDdEIsTUFBTSxLQUFLLE9BQU87QUFBQSxNQUNwQjtBQUFBLE1BQ0EsT0FBTztBQUFBLEtBQ1I7QUFBQSxJQUNELE9BQU8sSUFBSSxLQUFLLE1BQU07QUFBQTtBQUFBLEVBRXhCLFVBQVUsQ0FBQyxPQUFPO0FBQUEsSUFDaEIsS0FBSyxTQUFTLE1BQU0sV0FBVyxHQUFHO0FBQUEsTUFDaEM7QUFBQSxJQUNGO0FBQUEsSUFDQSxNQUFNLGFBQWEsQ0FBQztBQUFBLElBQ3BCLElBQUksT0FBTztBQUFBLE1BQ1QsWUFBWSxRQUFPLGFBQWEsTUFBTSxRQUFRLEdBQUc7QUFBQSxRQUMvQyxJQUFJLFdBQVUsR0FBRztBQUFBLFVBQ2YsV0FBVyxLQUFLLE1BQU07QUFBQSxRQUN4QjtBQUFBLFFBQ0EsTUFBTSxRQUFRLFNBQVM7QUFBQSxRQUN2QixNQUFNLFFBQVEsU0FBUyxLQUFLLFVBQVUsU0FBUyxPQUFZO0FBQUEsUUFDM0QsSUFBSSxHQUFHLE9BQU8sV0FBVyxHQUFHO0FBQUEsVUFDMUIsTUFBTSxZQUFZLE1BQU0sWUFBWSxPQUFPO0FBQUEsVUFDM0MsTUFBTSxjQUFjLE1BQU0sWUFBWSxPQUFPO0FBQUEsVUFDN0MsTUFBTSxnQkFBZ0IsTUFBTSxZQUFZLE9BQU87QUFBQSxVQUMvQyxNQUFNLFFBQVEsY0FBYyxnQkFBcUIsWUFBSSxTQUFTO0FBQUEsVUFDOUQsV0FBVyxLQUNULE1BQU0sSUFBSSxJQUFJLFNBQVMsUUFBUSxVQUFVLGNBQWMsTUFBTSxJQUFJLFdBQVcsV0FBVyxPQUFZLFlBQUksSUFBSSxXQUFXLGFBQWEsSUFBSSxTQUFTLE9BQU8sSUFBSSxXQUFXLEtBQUssTUFBTSxPQUNuTDtBQUFBLFFBQ0YsRUFBTztBQUFBLFVBQ0wsV0FBVyxLQUNULE1BQU0sSUFBSSxJQUFJLFNBQVMsUUFBUSxVQUFVLFFBQVEsT0FDbkQ7QUFBQTtBQUFBLFFBRUYsSUFBSSxTQUFRLE1BQU0sU0FBUyxHQUFHO0FBQUEsVUFDNUIsV0FBVyxLQUFLLE1BQU07QUFBQSxRQUN4QjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPLElBQUksS0FBSyxVQUFVO0FBQUE7QUFBQSxFQUU1QixVQUFVLENBQUMsT0FBTztBQUFBLElBQ2hCLE9BQU8sT0FBTyxVQUFVLFlBQVksT0FBTyxVQUFVLFlBQVksU0FBUyxJQUFJLGFBQWEsVUFBZTtBQUFBO0FBQUEsRUFFNUcsWUFBWSxDQUFDLFNBQVM7QUFBQSxJQUNwQixNQUFNLGNBQWMsQ0FBQztBQUFBLElBQ3JCLElBQUksU0FBUztBQUFBLE1BQ1gsWUFBWSxRQUFPLGlCQUFpQixRQUFRLFFBQVEsR0FBRztBQUFBLFFBQ3JELFlBQVksS0FBSyxZQUFZO0FBQUEsUUFDN0IsSUFBSSxTQUFRLFFBQVEsU0FBUyxHQUFHO0FBQUEsVUFDOUIsWUFBWSxLQUFLLE9BQU87QUFBQSxRQUMxQjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPLFlBQVksU0FBUyxJQUFJLGdCQUFnQixJQUFJLEtBQUssV0FBVyxNQUFXO0FBQUE7QUFBQSxFQUVqRixjQUFjLENBQUMsT0FBTztBQUFBLElBQ3BCLElBQUksR0FBRyxPQUFPLEtBQUssS0FBSyxNQUFNLE1BQU0sT0FBTyxVQUFVO0FBQUEsTUFDbkQsT0FBTyxNQUFNLE1BQU0sSUFBSSxXQUFXLE1BQU0sTUFBTSxPQUFPLFdBQVcsRUFBRSxLQUFLLEdBQUcsTUFBTSxNQUFNLE9BQU8sT0FBTyxJQUFJLElBQUksV0FBVyxNQUFNLE1BQU0sT0FBTyxhQUFhLEtBQUssSUFBSSxXQUFXLE1BQU0sTUFBTSxPQUFPLEtBQUs7QUFBQSxJQUNyTTtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFFVCxnQkFBZ0I7QUFBQSxJQUNkO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsS0FDQztBQUFBLElBQ0QsTUFBTSxhQUFhLGNBQWMsb0JBQW9CLE1BQU07QUFBQSxJQUMzRCxXQUFXLEtBQUssWUFBWTtBQUFBLE1BQzFCLElBQUksR0FBRyxFQUFFLE9BQU8sTUFBTSxLQUFLLGFBQWEsRUFBRSxNQUFNLEtBQUssT0FBTyxHQUFHLE9BQU8sUUFBUSxJQUFJLE1BQU0sRUFBRSxRQUFRLEdBQUcsT0FBTyxjQUFjLElBQUksTUFBTSxnQkFBZ0IsT0FBTyxHQUFHLE9BQU8sR0FBRyxJQUFTLFlBQUksYUFBYSxLQUFLLFFBQVEsQ0FBQyxXQUFXLE9BQU8sS0FDaE8sR0FBRyxZQUFZLFdBQVcsT0FBTyxNQUFNLE9BQU8sV0FBVyxhQUFhLE1BQU0sSUFBSSxPQUFPLE1BQU0sT0FBTyxVQUN0RyxHQUFHLEVBQUUsTUFBTSxLQUFLLEdBQUc7QUFBQSxRQUNqQixNQUFNLFlBQVksYUFBYSxFQUFFLE1BQU0sS0FBSztBQUFBLFFBQzVDLE1BQU0sSUFBSSxNQUNSLFNBQVMsRUFBRSxLQUFLLEtBQUssSUFBSSxpQ0FBaUMsZUFBZSxFQUFFLE1BQU0seUJBQXlCLGlFQUM1RztBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxNQUFNLGlCQUFpQixTQUFTLE1BQU0sV0FBVztBQUFBLElBQ2pELE1BQU0sVUFBVSxLQUFLLGFBQWEsUUFBUTtBQUFBLElBQzFDLE1BQU0sY0FBYyxXQUFXLGlCQUFzQjtBQUFBLElBQ3JELE1BQU0sWUFBWSxLQUFLLGVBQWUsWUFBWSxFQUFFLGNBQWMsQ0FBQztBQUFBLElBQ25FLE1BQU0sV0FBVyxLQUFLLGVBQWUsS0FBSztBQUFBLElBQzFDLE1BQU0sV0FBVyxLQUFLLFdBQVcsS0FBSztBQUFBLElBQ3RDLE1BQU0sV0FBVyxRQUFRLGFBQWEsVUFBZTtBQUFBLElBQ3JELE1BQU0sWUFBWSxTQUFTLGNBQWMsV0FBZ0I7QUFBQSxJQUN6RCxNQUFNLGNBQWMsQ0FBQztBQUFBLElBQ3JCLElBQUksU0FBUztBQUFBLE1BQ1gsWUFBWSxRQUFPLGlCQUFpQixRQUFRLFFBQVEsR0FBRztBQUFBLFFBQ3JELFlBQVksS0FBSyxZQUFZO0FBQUEsUUFDN0IsSUFBSSxTQUFRLFFBQVEsU0FBUyxHQUFHO0FBQUEsVUFDOUIsWUFBWSxLQUFLLE9BQU87QUFBQSxRQUMxQjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxNQUFNLGFBQWEsWUFBWSxTQUFTLElBQUksZ0JBQWdCLElBQUksS0FBSyxXQUFXLE1BQVc7QUFBQSxJQUMzRixNQUFNLGFBQWEsS0FBSyxhQUFhLE9BQU87QUFBQSxJQUM1QyxNQUFNLFdBQVcsS0FBSyxXQUFXLEtBQUs7QUFBQSxJQUN0QyxNQUFNLFlBQVksU0FBUyxjQUFjLFdBQWdCO0FBQUEsSUFDekQsTUFBTSxhQUFhLE1BQU0sZ0JBQWdCLGVBQWUsa0JBQWtCLFdBQVcsV0FBVyxXQUFXLGFBQWEsWUFBWSxhQUFhLFdBQVc7QUFBQSxJQUM1SixJQUFJLGFBQWEsU0FBUyxHQUFHO0FBQUEsTUFDM0IsT0FBTyxLQUFLLG1CQUFtQixZQUFZLFlBQVk7QUFBQSxJQUN6RDtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFFVCxrQkFBa0IsQ0FBQyxZQUFZLGNBQWM7QUFBQSxJQUMzQyxPQUFPLGdCQUFnQixRQUFRO0FBQUEsSUFDL0IsS0FBSyxhQUFhO0FBQUEsTUFDaEIsTUFBTSxJQUFJLE1BQU0sa0RBQWtEO0FBQUEsSUFDcEU7QUFBQSxJQUNBLElBQUksS0FBSyxXQUFXLEdBQUc7QUFBQSxNQUNyQixPQUFPLEtBQUssdUJBQXVCLEVBQUUsWUFBWSxZQUFZLENBQUM7QUFBQSxJQUNoRTtBQUFBLElBQ0EsT0FBTyxLQUFLLG1CQUNWLEtBQUssdUJBQXVCLEVBQUUsWUFBWSxZQUFZLENBQUMsR0FDdkQsSUFDRjtBQUFBO0FBQUEsRUFFRixzQkFBc0I7QUFBQSxJQUNwQjtBQUFBLElBQ0EsZUFBZSxNQUFNLE9BQU8sYUFBYSxPQUFPLFNBQVM7QUFBQSxLQUN4RDtBQUFBLElBQ0QsTUFBTSxZQUFZLE1BQU0sV0FBVyxPQUFPO0FBQUEsSUFDMUMsTUFBTSxhQUFhLE1BQU0sWUFBWSxPQUFPO0FBQUEsSUFDNUMsSUFBSTtBQUFBLElBQ0osSUFBSSxXQUFXLFFBQVEsU0FBUyxHQUFHO0FBQUEsTUFDakMsTUFBTSxnQkFBZ0IsQ0FBQztBQUFBLE1BQ3ZCLFdBQVcsaUJBQWlCLFNBQVM7QUFBQSxRQUNuQyxJQUFJLEdBQUcsZUFBZSxZQUFZLEdBQUc7QUFBQSxVQUNuQyxjQUFjLEtBQUssSUFBSSxXQUFXLGNBQWMsSUFBSSxDQUFDO0FBQUEsUUFDdkQsRUFBTyxTQUFJLEdBQUcsZUFBZSxHQUFHLEdBQUc7QUFBQSxVQUNqQyxTQUFTLElBQUksRUFBRyxJQUFJLGNBQWMsWUFBWSxRQUFRLEtBQUs7QUFBQSxZQUN6RCxNQUFNLFFBQVEsY0FBYyxZQUFZO0FBQUEsWUFDeEMsSUFBSSxHQUFHLE9BQU8sWUFBWSxHQUFHO0FBQUEsY0FDM0IsY0FBYyxZQUFZLEtBQUssSUFBSSxXQUFXLEtBQUssT0FBTyxnQkFBZ0IsS0FBSyxDQUFDO0FBQUEsWUFDbEY7QUFBQSxVQUNGO0FBQUEsVUFDQSxjQUFjLEtBQUssTUFBTSxlQUFlO0FBQUEsUUFDMUMsRUFBTztBQUFBLFVBQ0wsY0FBYyxLQUFLLE1BQU0sZUFBZTtBQUFBO0FBQUEsTUFFNUM7QUFBQSxNQUNBLGFBQWEsZ0JBQWdCLElBQUksS0FBSyxlQUFlLE9BQU87QUFBQSxJQUM5RDtBQUFBLElBQ0EsTUFBTSxXQUFXLE9BQU8sVUFBVSxZQUFZLE9BQU8sVUFBVSxZQUFZLFNBQVMsSUFBSSxhQUFhLFVBQWU7QUFBQSxJQUNwSCxNQUFNLGdCQUFnQixJQUFJLElBQUksR0FBRyxRQUFRLFFBQVEsU0FBUyxJQUFJO0FBQUEsSUFDOUQsTUFBTSxZQUFZLFNBQVMsY0FBYyxXQUFnQjtBQUFBLElBQ3pELE9BQU8sTUFBTSxZQUFZLGdCQUFnQixhQUFhLGFBQWEsV0FBVztBQUFBO0FBQUEsRUFFaEYsZ0JBQWdCLEdBQUcsT0FBTyxRQUFRLGdCQUFnQixZQUFZLFdBQVcsVUFBVSxVQUFVO0FBQUEsSUFDM0YsTUFBTSxnQkFBZ0IsQ0FBQztBQUFBLElBQ3ZCLE1BQU0sVUFBVSxNQUFNLE1BQU0sT0FBTztBQUFBLElBQ25DLE1BQU0sYUFBYSxPQUFPLFFBQVEsT0FBTyxFQUFFLE9BQ3pDLEVBQUUsR0FBRyxVQUFVLElBQUksb0JBQW9CLENBQ3pDO0FBQUEsSUFDQSxNQUFNLGNBQWMsV0FBVyxJQUFJLElBQUksWUFBWSxJQUFJLFdBQVcsS0FBSyxPQUFPLGdCQUFnQixNQUFNLENBQUMsQ0FBQztBQUFBLElBQ3RHLElBQUksUUFBUTtBQUFBLE1BQ1YsTUFBTSxVQUFVO0FBQUEsTUFDaEIsSUFBSSxHQUFHLFNBQVMsR0FBRyxHQUFHO0FBQUEsUUFDcEIsY0FBYyxLQUFLLE9BQU87QUFBQSxNQUM1QixFQUFPO0FBQUEsUUFDTCxjQUFjLEtBQUssUUFBUSxPQUFPLENBQUM7QUFBQTtBQUFBLElBRXZDLEVBQU87QUFBQSxNQUNMLE1BQU0sU0FBUztBQUFBLE1BQ2YsY0FBYyxLQUFLLElBQUksSUFBSSxTQUFTLENBQUM7QUFBQSxNQUNyQyxZQUFZLFlBQVksVUFBVSxPQUFPLFFBQVEsR0FBRztBQUFBLFFBQ2xELE1BQU0sWUFBWSxDQUFDO0FBQUEsUUFDbkIsWUFBWSxXQUFXLFFBQVEsWUFBWTtBQUFBLFVBQ3pDLE1BQU0sV0FBVyxNQUFNO0FBQUEsVUFDdkIsSUFBSSxhQUFrQixhQUFLLEdBQUcsVUFBVSxLQUFLLEtBQUssU0FBUyxVQUFlLFdBQUc7QUFBQSxZQUMzRSxJQUFJO0FBQUEsWUFDSixJQUFJLElBQUksWUFBWSxRQUFRLElBQUksWUFBaUIsV0FBRztBQUFBLGNBQ2xELGVBQWUsR0FBRyxJQUFJLFNBQVMsR0FBRyxJQUFJLElBQUksVUFBVSxJQUFJLE1BQU0sSUFBSSxTQUFTLEdBQUc7QUFBQSxZQUNoRixFQUFPLFNBQUksSUFBSSxjQUFtQixXQUFHO0FBQUEsY0FDbkMsTUFBTSxrQkFBa0IsSUFBSSxVQUFVO0FBQUEsY0FDdEMsZUFBZSxHQUFHLGlCQUFpQixHQUFHLElBQUksa0JBQWtCLElBQUksTUFBTSxpQkFBaUIsR0FBRztBQUFBLFlBQzVGLEVBQU8sVUFBSyxJQUFJLFdBQVcsSUFBSSxlQUFvQixXQUFHO0FBQUEsY0FDcEQsTUFBTSxtQkFBbUIsSUFBSSxXQUFXO0FBQUEsY0FDeEMsZUFBZSxHQUFHLGtCQUFrQixHQUFHLElBQUksbUJBQW1CLElBQUksTUFBTSxrQkFBa0IsR0FBRztBQUFBLFlBQy9GLEVBQU87QUFBQSxjQUNMLGVBQWU7QUFBQTtBQUFBLFlBRWpCLFVBQVUsS0FBSyxZQUFZO0FBQUEsVUFDN0IsRUFBTztBQUFBLFlBQ0wsVUFBVSxLQUFLLFFBQVE7QUFBQTtBQUFBLFFBRTNCO0FBQUEsUUFDQSxjQUFjLEtBQUssU0FBUztBQUFBLFFBQzVCLElBQUksYUFBYSxPQUFPLFNBQVMsR0FBRztBQUFBLFVBQ2xDLGNBQWMsS0FBSyxPQUFPO0FBQUEsUUFDNUI7QUFBQSxNQUNGO0FBQUE7QUFBQSxJQUVGLE1BQU0sVUFBVSxLQUFLLGFBQWEsUUFBUTtBQUFBLElBQzFDLE1BQU0sWUFBWSxJQUFJLEtBQUssYUFBYTtBQUFBLElBQ3hDLE1BQU0sZUFBZSxZQUFZLGlCQUFpQixLQUFLLGVBQWUsV0FBVyxFQUFFLGVBQWUsS0FBSyxDQUFDLE1BQVc7QUFBQSxJQUNuSCxNQUFNLGdCQUFnQixZQUFZLFNBQVMsSUFBSSxLQUFLLFVBQVUsSUFBUztBQUFBLElBQ3ZFLE9BQU8sTUFBTSxzQkFBc0IsU0FBUyxlQUFlLFlBQVksZ0JBQWdCO0FBQUE7QUFBQSxFQUV6RixVQUFVLENBQUMsTUFBTSxjQUFjO0FBQUEsSUFDN0IsT0FBTyxLQUFLLFFBQVE7QUFBQSxNQUNsQixRQUFRLEtBQUs7QUFBQSxNQUNiLFlBQVksS0FBSztBQUFBLE1BQ2pCLGFBQWEsS0FBSztBQUFBLE1BQ2xCLGNBQWMsS0FBSztBQUFBLE1BQ25CO0FBQUEsSUFDRixDQUFDO0FBQUE7QUFBQSxFQUVILG9CQUFvQjtBQUFBLElBQ2xCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsYUFBYTtBQUFBLElBQ2I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEtBQ0M7QUFBQSxJQUNELElBQUksWUFBWSxDQUFDO0FBQUEsSUFDakIsSUFBSSxPQUFPLFFBQVEsVUFBVSxDQUFDLEdBQUc7QUFBQSxJQUNqQyxNQUFNLFFBQVEsQ0FBQztBQUFBLElBQ2YsSUFBSSxXQUFXLE1BQU07QUFBQSxNQUNuQixNQUFNLG1CQUFtQixPQUFPLFFBQVEsWUFBWSxPQUFPO0FBQUEsTUFDM0QsWUFBWSxpQkFBaUIsSUFBSSxFQUFFLEtBQUssWUFBWTtBQUFBLFFBQ2xELE9BQU8sTUFBTTtBQUFBLFFBQ2IsT0FBTztBQUFBLFFBQ1AsT0FBTyxtQkFBbUIsT0FBTyxVQUFVO0FBQUEsUUFDM0Msb0JBQXlCO0FBQUEsUUFDekIsUUFBUTtBQUFBLFFBQ1IsV0FBVyxDQUFDO0FBQUEsTUFDZCxFQUFFO0FBQUEsSUFDSixFQUFPO0FBQUEsTUFDTCxNQUFNLGlCQUFpQixPQUFPLFlBQzVCLE9BQU8sUUFBUSxZQUFZLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxXQUFXLENBQUMsS0FBSyxtQkFBbUIsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUN4RztBQUFBLE1BQ0EsSUFBSSxPQUFPLE9BQU87QUFBQSxRQUNoQixNQUFNLFdBQVcsT0FBTyxPQUFPLFVBQVUsYUFBYSxPQUFPLE1BQU0sZ0JBQWdCLGFBQWEsQ0FBQyxJQUFJLE9BQU87QUFBQSxRQUM1RyxRQUFRLFlBQVksdUJBQXVCLFVBQVUsVUFBVTtBQUFBLE1BQ2pFO0FBQUEsTUFDQSxNQUFNLGtCQUFrQixDQUFDO0FBQUEsTUFDekIsSUFBSSxrQkFBa0IsQ0FBQztBQUFBLE1BQ3ZCLElBQUksT0FBTyxTQUFTO0FBQUEsUUFDbEIsSUFBSSxnQkFBZ0I7QUFBQSxRQUNwQixZQUFZLE9BQU8sVUFBVSxPQUFPLFFBQVEsT0FBTyxPQUFPLEdBQUc7QUFBQSxVQUMzRCxJQUFJLFVBQWUsV0FBRztBQUFBLFlBQ3BCO0FBQUEsVUFDRjtBQUFBLFVBQ0EsSUFBSSxTQUFTLFlBQVksU0FBUztBQUFBLFlBQ2hDLEtBQUssaUJBQWlCLFVBQVUsTUFBTTtBQUFBLGNBQ3BDLGdCQUFnQjtBQUFBLFlBQ2xCO0FBQUEsWUFDQSxnQkFBZ0IsS0FBSyxLQUFLO0FBQUEsVUFDNUI7QUFBQSxRQUNGO0FBQUEsUUFDQSxJQUFJLGdCQUFnQixTQUFTLEdBQUc7QUFBQSxVQUM5QixrQkFBa0IsZ0JBQWdCLGdCQUFnQixPQUFPLENBQUMsTUFBTSxPQUFPLFVBQVUsT0FBTyxJQUFJLElBQUksT0FBTyxLQUFLLFlBQVksT0FBTyxFQUFFLE9BQU8sQ0FBQyxTQUFTLGdCQUFnQixTQUFTLEdBQUcsQ0FBQztBQUFBLFFBQ2pMO0FBQUEsTUFDRixFQUFPO0FBQUEsUUFDTCxrQkFBa0IsT0FBTyxLQUFLLFlBQVksT0FBTztBQUFBO0FBQUEsTUFFbkQsV0FBVyxTQUFTLGlCQUFpQjtBQUFBLFFBQ25DLE1BQU0sU0FBUyxZQUFZLFFBQVE7QUFBQSxRQUNuQyxnQkFBZ0IsS0FBSyxFQUFFLE9BQU8sT0FBTyxPQUFPLE9BQU8sQ0FBQztBQUFBLE1BQ3REO0FBQUEsTUFDQSxJQUFJLG9CQUFvQixDQUFDO0FBQUEsTUFDekIsSUFBSSxPQUFPLE1BQU07QUFBQSxRQUNmLG9CQUFvQixPQUFPLFFBQVEsT0FBTyxJQUFJLEVBQUUsT0FBTyxDQUFDLFlBQVksTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sa0JBQWtCLEVBQUUsT0FBTyxhQUFhLFVBQVUsWUFBWSxVQUFVLE9BQU8sRUFBRTtBQUFBLE1BQzlLO0FBQUEsTUFDQSxJQUFJO0FBQUEsTUFDSixJQUFJLE9BQU8sUUFBUTtBQUFBLFFBQ2pCLFNBQVMsT0FBTyxPQUFPLFdBQVcsYUFBYSxPQUFPLE9BQU8sZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksT0FBTztBQUFBLFFBQy9GLFlBQVksT0FBTyxVQUFVLE9BQU8sUUFBUSxNQUFNLEdBQUc7QUFBQSxVQUNuRCxnQkFBZ0IsS0FBSztBQUFBLFlBQ25CO0FBQUEsWUFDQSxPQUFPLDhCQUE4QixPQUFPLFVBQVU7QUFBQSxVQUN4RCxDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLGFBQWEsT0FBTyxXQUFXLGlCQUFpQjtBQUFBLFFBQzlDLFVBQVUsS0FBSztBQUFBLFVBQ2IsT0FBTyxHQUFHLE9BQU8sSUFBSSxPQUFPLElBQUksTUFBTSxhQUFhLFlBQVksUUFBUSxPQUFPO0FBQUEsVUFDOUU7QUFBQSxVQUNBLE9BQU8sR0FBRyxPQUFPLE1BQU0sSUFBSSxtQkFBbUIsT0FBTyxVQUFVLElBQUk7QUFBQSxVQUNuRSxvQkFBeUI7QUFBQSxVQUN6QixRQUFRO0FBQUEsVUFDUixXQUFXLENBQUM7QUFBQSxRQUNkLENBQUM7QUFBQSxNQUNIO0FBQUEsTUFDQSxJQUFJLGNBQWMsT0FBTyxPQUFPLFlBQVksYUFBYSxPQUFPLFFBQVEsZ0JBQWdCLG9CQUFvQixDQUFDLElBQUksT0FBTyxXQUFXLENBQUM7QUFBQSxNQUNwSSxLQUFLLE1BQU0sUUFBUSxXQUFXLEdBQUc7QUFBQSxRQUMvQixjQUFjLENBQUMsV0FBVztBQUFBLE1BQzVCO0FBQUEsTUFDQSxVQUFVLFlBQVksSUFBSSxDQUFDLGlCQUFpQjtBQUFBLFFBQzFDLElBQUksR0FBRyxjQUFjLE1BQU0sR0FBRztBQUFBLFVBQzVCLE9BQU8sbUJBQW1CLGNBQWMsVUFBVTtBQUFBLFFBQ3BEO0FBQUEsUUFDQSxPQUFPLHVCQUF1QixjQUFjLFVBQVU7QUFBQSxPQUN2RDtBQUFBLE1BQ0QsUUFBUSxPQUFPO0FBQUEsTUFDZixTQUFTLE9BQU87QUFBQSxNQUNoQjtBQUFBLFFBQ0UsT0FBTztBQUFBLFFBQ1AsYUFBYTtBQUFBLFFBQ2I7QUFBQSxXQUNHLG1CQUFtQjtBQUFBLFFBQ3RCLE1BQU0scUJBQXFCLGtCQUFrQixRQUFRLGVBQWUsUUFBUTtBQUFBLFFBQzVFLE1BQU0sb0JBQW9CLG1CQUFtQixTQUFTLGVBQWU7QUFBQSxRQUNyRSxNQUFNLHNCQUFzQixjQUFjO0FBQUEsUUFDMUMsTUFBTSxxQkFBcUIsR0FBRyxjQUFjO0FBQUEsUUFDNUMsTUFBTSxVQUFVLElBQ2QsR0FBRyxtQkFBbUIsT0FBTyxJQUMzQixDQUFDLFFBQVEsTUFBTSxHQUNiLG1CQUFtQixtQkFBbUIsV0FBVyxJQUFJLGtCQUFrQixHQUN2RSxtQkFBbUIsUUFBUSxVQUFVLENBQ3ZDLENBQ0YsQ0FDRjtBQUFBLFFBQ0EsTUFBTSxnQkFBZ0IsS0FBSyxxQkFBcUI7QUFBQSxVQUM5QztBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQSxPQUFPLFdBQVc7QUFBQSxVQUNsQixhQUFhLE9BQU87QUFBQSxVQUNwQixhQUFhLEdBQUcsVUFBVSxHQUFHLElBQUksZ0NBQWdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxLQUFLLDZCQUE2QixPQUFPLEVBQUUsSUFBSTtBQUFBLFVBQ3RJLFlBQVk7QUFBQSxVQUNaLFFBQVE7QUFBQSxVQUNSLHFCQUFxQjtBQUFBLFFBQ3ZCLENBQUM7QUFBQSxRQUNELE1BQU0sUUFBUSxPQUFPLGNBQWMsT0FBTyxHQUFHLHFCQUFxQjtBQUFBLFFBQ2xFLFVBQVUsS0FBSztBQUFBLFVBQ2IsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1A7QUFBQSxVQUNBLG9CQUFvQjtBQUFBLFVBQ3BCLFFBQVE7QUFBQSxVQUNSLFdBQVcsY0FBYztBQUFBLFFBQzNCLENBQUM7QUFBQSxNQUNIO0FBQUE7QUFBQSxJQUVGLElBQUksVUFBVSxXQUFXLEdBQUc7QUFBQSxNQUMxQixNQUFNLElBQUksYUFBYTtBQUFBLFFBQ3JCLFNBQVMsaUNBQWlDLFlBQVksYUFBYTtBQUFBLE1BQ3JFLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFDQSxJQUFJO0FBQUEsSUFDSixRQUFRLElBQUksUUFBUSxLQUFLO0FBQUEsSUFDekIsSUFBSSxxQkFBcUI7QUFBQSxNQUN2QixJQUFJLFFBQVEsaUJBQWlCLElBQUksS0FDL0IsVUFBVSxJQUNSLEdBQUcsT0FBTyxhQUFhLEdBQUcsUUFBUSxZQUFZLElBQUksSUFBSSxXQUFXLEtBQUssT0FBTyxnQkFBZ0IsTUFBTSxDQUFDLElBQUksR0FBRyxRQUFRLElBQUksT0FBTyxJQUFJLE9BQU8sTUFBTSxNQUNqSixHQUNBLE9BQ0Y7QUFBQSxNQUNBLElBQUksR0FBRyxxQkFBcUIsSUFBSSxHQUFHO0FBQUEsUUFDakMsUUFBUSxnQ0FBZ0M7QUFBQSxNQUMxQztBQUFBLE1BQ0EsTUFBTSxrQkFBa0IsQ0FBQztBQUFBLFFBQ3ZCLE9BQU87QUFBQSxRQUNQLE9BQU87QUFBQSxRQUNQLE9BQU8sTUFBTSxHQUFHLE1BQU07QUFBQSxRQUN0QixRQUFRO0FBQUEsUUFDUixvQkFBb0IsWUFBWTtBQUFBLFFBQ2hDO0FBQUEsTUFDRixDQUFDO0FBQUEsTUFDRCxNQUFNLGdCQUFnQixVQUFlLGFBQUssV0FBZ0IsYUFBSyxRQUFRLFNBQVM7QUFBQSxNQUNoRixJQUFJLGVBQWU7QUFBQSxRQUNqQixTQUFTLEtBQUssaUJBQWlCO0FBQUEsVUFDN0IsT0FBTyxhQUFhLE9BQU8sVUFBVTtBQUFBLFVBQ3JDLFFBQVEsQ0FBQztBQUFBLFVBQ1QsWUFBWTtBQUFBLFlBQ1Y7QUFBQSxjQUNFLE1BQU0sQ0FBQztBQUFBLGNBQ1AsT0FBTyxJQUFJLElBQUksR0FBRztBQUFBLFlBQ3BCO0FBQUEsVUFDRjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBLGNBQWMsQ0FBQztBQUFBLFFBQ2pCLENBQUM7QUFBQSxRQUNELFFBQWE7QUFBQSxRQUNiLFFBQWE7QUFBQSxRQUNiLFNBQWM7QUFBQSxRQUNkLFVBQWU7QUFBQSxNQUNqQixFQUFPO0FBQUEsUUFDTCxTQUFTLGFBQWEsT0FBTyxVQUFVO0FBQUE7QUFBQSxNQUV6QyxTQUFTLEtBQUssaUJBQWlCO0FBQUEsUUFDN0IsT0FBTyxHQUFHLFFBQVEsV0FBVyxJQUFJLFNBQVMsSUFBSSxTQUFTLFFBQVEsQ0FBQyxHQUFHLFVBQVU7QUFBQSxRQUM3RSxRQUFRLENBQUM7QUFBQSxRQUNULFlBQVksZ0JBQWdCLElBQUksR0FBRyxPQUFPLGNBQWM7QUFBQSxVQUN0RCxNQUFNLENBQUM7QUFBQSxVQUNQLE9BQU8sR0FBRyxRQUFRLE1BQU0sSUFBSSxtQkFBbUIsUUFBUSxVQUFVLElBQUk7QUFBQSxRQUN2RSxFQUFFO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBLGNBQWMsQ0FBQztBQUFBLE1BQ2pCLENBQUM7QUFBQSxJQUNILEVBQU87QUFBQSxNQUNMLFNBQVMsS0FBSyxpQkFBaUI7QUFBQSxRQUM3QixPQUFPLGFBQWEsT0FBTyxVQUFVO0FBQUEsUUFDckMsUUFBUSxDQUFDO0FBQUEsUUFDVCxZQUFZLFVBQVUsSUFBSSxHQUFHLGFBQWE7QUFBQSxVQUN4QyxNQUFNLENBQUM7QUFBQSxVQUNQLE9BQU8sR0FBRyxPQUFPLE1BQU0sSUFBSSxtQkFBbUIsT0FBTyxVQUFVLElBQUk7QUFBQSxRQUNyRSxFQUFFO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBLGNBQWMsQ0FBQztBQUFBLE1BQ2pCLENBQUM7QUFBQTtBQUFBLElBRUgsT0FBTztBQUFBLE1BQ0wsWUFBWSxZQUFZO0FBQUEsTUFDeEIsS0FBSztBQUFBLE1BQ0w7QUFBQSxJQUNGO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSwwQkFBMEIsY0FBYztBQUFBLFVBQ3BDLGNBQWM7QUFBQSxFQUN0QixPQUFPLENBQUMsWUFBWSxTQUFTLFFBQVE7QUFBQSxJQUNuQyxNQUFNLGtCQUFrQixXQUFnQixZQUFJLHlCQUF5QixPQUFPLFdBQVcsV0FBVyx5QkFBeUIsT0FBTyxtQkFBbUI7QUFBQSxJQUNySixNQUFNLHVCQUF1QjtBQUFBLGdDQUNELElBQUksV0FBVyxlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTTFELFFBQVEsSUFBSSxvQkFBb0I7QUFBQSxJQUNoQyxNQUFNLGVBQWUsUUFBUSxPQUMzQix1Q0FBdUMsSUFBSSxXQUFXLGVBQWUsb0NBQ3ZFO0FBQUEsSUFDQSxNQUFNLGtCQUFrQixhQUFhLE1BQVc7QUFBQSxJQUNoRCxRQUFRLElBQUksVUFBVTtBQUFBLElBQ3RCLElBQUk7QUFBQSxNQUNGLFdBQVcsYUFBYSxZQUFZO0FBQUEsUUFDbEMsS0FBSyxtQkFBbUIsT0FBTyxnQkFBZ0IsRUFBRSxJQUFJLFVBQVUsY0FBYztBQUFBLFVBQzNFLFdBQVcsUUFBUSxVQUFVLEtBQUs7QUFBQSxZQUNoQyxRQUFRLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQztBQUFBLFVBQzNCO0FBQUEsVUFDQSxRQUFRLElBQ04sa0JBQWtCLElBQUksV0FBVyxlQUFlLG1DQUFtQyxVQUFVLFNBQVMsVUFBVSxlQUNsSDtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFDQSxRQUFRLElBQUksV0FBVztBQUFBLE1BQ3ZCLE9BQU8sR0FBRztBQUFBLE1BQ1YsUUFBUSxJQUFJLGFBQWE7QUFBQSxNQUN6QixNQUFNO0FBQUE7QUFBQTtBQUdaOzs7QUM5bEJBLE1BQU0sa0JBQWtCO0FBQUEsVUFDZCxjQUFjO0FBQUEsRUFFdEIsaUJBQWlCLEdBQUc7QUFBQSxJQUNsQixPQUFPLEtBQUssRUFBRTtBQUFBO0FBRWxCOzs7QUNVQSxNQUFNLG9CQUFvQjtBQUFBLFVBQ2hCLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBLFdBQVcsQ0FBQyxRQUFRO0FBQUEsSUFDbEIsS0FBSyxTQUFTLE9BQU87QUFBQSxJQUNyQixLQUFLLFVBQVUsT0FBTztBQUFBLElBQ3RCLEtBQUssVUFBVSxPQUFPO0FBQUEsSUFDdEIsS0FBSyxXQUFXLE9BQU87QUFBQSxJQUN2QixLQUFLLFdBQVcsT0FBTztBQUFBO0FBQUEsRUFFekIsSUFBSSxDQUFDLFFBQVE7QUFBQSxJQUNYLE1BQU0sb0JBQW9CLEtBQUs7QUFBQSxJQUMvQixJQUFJO0FBQUEsSUFDSixJQUFJLEtBQUssUUFBUTtBQUFBLE1BQ2YsU0FBUyxLQUFLO0FBQUEsSUFDaEIsRUFBTyxTQUFJLEdBQUcsUUFBUSxRQUFRLEdBQUc7QUFBQSxNQUMvQixTQUFTLE9BQU8sWUFDZCxPQUFPLEtBQUssT0FBTyxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FDdEU7QUFBQSxJQUNGLEVBQU8sU0FBSSxHQUFHLFFBQVEsY0FBYyxHQUFHO0FBQUEsTUFDckMsU0FBUyxPQUFPLGdCQUFnQjtBQUFBLElBQ2xDLEVBQU8sU0FBSSxHQUFHLFFBQVEsR0FBRyxHQUFHO0FBQUEsTUFDMUIsU0FBUyxDQUFDO0FBQUEsSUFDWixFQUFPO0FBQUEsTUFDTCxTQUFTLGdCQUFnQixNQUFNO0FBQUE7QUFBQSxJQUVqQyxPQUFPLElBQUksaUJBQWlCO0FBQUEsTUFDMUIsT0FBTztBQUFBLE1BQ1A7QUFBQSxNQUNBO0FBQUEsTUFDQSxTQUFTLEtBQUs7QUFBQSxNQUNkLFNBQVMsS0FBSztBQUFBLE1BQ2QsVUFBVSxLQUFLO0FBQUEsTUFDZixVQUFVLEtBQUs7QUFBQSxJQUNqQixDQUFDO0FBQUE7QUFFTDtBQUFBO0FBQ0EsTUFBTSxxQ0FBcUMsa0JBQWtCO0FBQUEsVUFDbkQsY0FBYztBQUFBLEVBQ3RCO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxjQUFtQjtBQUFBLEVBQ25CLDZCQUE2QixJQUFJO0FBQUEsRUFDakMsV0FBVyxHQUFHLE9BQU8sUUFBUSxpQkFBaUIsU0FBUyxTQUFTLFVBQVUsWUFBWTtBQUFBLElBQ3BGLE1BQU07QUFBQSxJQUNOLEtBQUssU0FBUztBQUFBLE1BQ1o7QUFBQSxNQUNBO0FBQUEsTUFDQSxRQUFRLEtBQUssT0FBTztBQUFBLE1BQ3BCO0FBQUEsTUFDQSxjQUFjLENBQUM7QUFBQSxJQUNqQjtBQUFBLElBQ0EsS0FBSyxrQkFBa0I7QUFBQSxJQUN2QixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxJQUFJO0FBQUEsTUFDUCxnQkFBZ0I7QUFBQSxNQUNoQixRQUFRLEtBQUs7QUFBQSxJQUNmO0FBQUEsSUFDQSxLQUFLLFlBQVksaUJBQWlCLEtBQUs7QUFBQSxJQUN2QyxLQUFLLHNCQUFzQixPQUFPLEtBQUssY0FBYyxXQUFXLEdBQUcsS0FBSyxZQUFZLEtBQUssSUFBSSxDQUFDO0FBQUEsSUFDOUYsV0FBVyxRQUFRLGlCQUFpQixLQUFLO0FBQUEsTUFBRyxLQUFLLFdBQVcsSUFBSSxJQUFJO0FBQUE7QUFBQSxFQUd0RSxhQUFhLEdBQUc7QUFBQSxJQUNkLE9BQU8sQ0FBQyxHQUFHLEtBQUssVUFBVTtBQUFBO0FBQUEsRUFFNUIsVUFBVSxDQUFDLFVBQVU7QUFBQSxJQUNuQixPQUFPLENBQUMsT0FBTyxPQUFPO0FBQUEsTUFDcEIsTUFBTSxnQkFBZ0IsS0FBSztBQUFBLE1BQzNCLE1BQU0sWUFBWSxpQkFBaUIsS0FBSztBQUFBLE1BQ3hDLFdBQVcsUUFBUSxpQkFBaUIsS0FBSztBQUFBLFFBQUcsS0FBSyxXQUFXLElBQUksSUFBSTtBQUFBLE1BQ3BFLElBQUksT0FBTyxjQUFjLFlBQVksS0FBSyxPQUFPLE9BQU8sS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLFNBQVMsR0FBRztBQUFBLFFBQ2hHLE1BQU0sSUFBSSxNQUFNLFVBQVUsMENBQTBDO0FBQUEsTUFDdEU7QUFBQSxNQUNBLEtBQUssS0FBSyxpQkFBaUI7QUFBQSxRQUN6QixJQUFJLE9BQU8sS0FBSyxLQUFLLG1CQUFtQixFQUFFLFdBQVcsS0FBSyxPQUFPLGtCQUFrQixVQUFVO0FBQUEsVUFDM0YsS0FBSyxPQUFPLFNBQVM7QUFBQSxhQUNsQixnQkFBZ0IsS0FBSyxPQUFPO0FBQUEsVUFDL0I7QUFBQSxRQUNGO0FBQUEsUUFDQSxJQUFJLE9BQU8sY0FBYyxhQUFhLEdBQUcsT0FBTyxHQUFHLEdBQUc7QUFBQSxVQUNwRCxNQUFNLFlBQVksR0FBRyxPQUFPLFFBQVEsSUFBSSxNQUFNLEVBQUUsaUJBQWlCLEdBQUcsT0FBTyxJQUFJLElBQUksTUFBTSxnQkFBZ0IsaUJBQWlCLE1BQU0sTUFBTSxPQUFPO0FBQUEsVUFDN0ksS0FBSyxPQUFPLE9BQU8sYUFBYTtBQUFBLFFBQ2xDO0FBQUEsTUFDRjtBQUFBLE1BQ0EsSUFBSSxPQUFPLE9BQU8sWUFBWTtBQUFBLFFBQzVCLEtBQUssR0FDSCxJQUFJLE1BQ0YsS0FBSyxPQUFPLFFBQ1osSUFBSSxzQkFBc0IsRUFBRSxvQkFBb0IsT0FBTyxhQUFhLE1BQU0sQ0FBQyxDQUM3RSxDQUNGO0FBQUEsTUFDRjtBQUFBLE1BQ0EsS0FBSyxLQUFLLE9BQU8sT0FBTztBQUFBLFFBQ3RCLEtBQUssT0FBTyxRQUFRLENBQUM7QUFBQSxNQUN2QjtBQUFBLE1BQ0EsS0FBSyxPQUFPLE1BQU0sS0FBSyxFQUFFLElBQUksT0FBTyxVQUFVLE9BQU8sVUFBVSxDQUFDO0FBQUEsTUFDaEUsSUFBSSxPQUFPLGNBQWMsVUFBVTtBQUFBLFFBQ2pDLFFBQVE7QUFBQSxlQUNELFFBQVE7QUFBQSxZQUNYLEtBQUssb0JBQW9CLGFBQWE7QUFBQSxZQUN0QztBQUFBLFVBQ0Y7QUFBQSxlQUNLLFNBQVM7QUFBQSxZQUNaLEtBQUssc0JBQXNCLE9BQU8sWUFDaEMsT0FBTyxRQUFRLEtBQUssbUJBQW1CLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUN0RTtBQUFBLFlBQ0EsS0FBSyxvQkFBb0IsYUFBYTtBQUFBLFlBQ3RDO0FBQUEsVUFDRjtBQUFBLGVBQ0s7QUFBQSxlQUNBLFNBQVM7QUFBQSxZQUNaLEtBQUssb0JBQW9CLGFBQWE7QUFBQSxZQUN0QztBQUFBLFVBQ0Y7QUFBQSxlQUNLLFFBQVE7QUFBQSxZQUNYLEtBQUssc0JBQXNCLE9BQU8sWUFDaEMsT0FBTyxRQUFRLEtBQUssbUJBQW1CLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUN0RTtBQUFBLFlBQ0EsS0FBSyxvQkFBb0IsYUFBYTtBQUFBLFlBQ3RDO0FBQUEsVUFDRjtBQUFBO0FBQUEsTUFFSjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUE7QUFBQSxFQThCWCxXQUFXLEtBQUssV0FBVyxNQUFNO0FBQUEsRUE0QmpDLFlBQVksS0FBSyxXQUFXLE9BQU87QUFBQSxFQTRCbkMsWUFBWSxLQUFLLFdBQVcsT0FBTztBQUFBLEVBNEJuQyxXQUFXLEtBQUssV0FBVyxNQUFNO0FBQUEsRUEyQmpDLFlBQVksS0FBSyxXQUFXLE9BQU87QUFBQSxFQUNuQyxpQkFBaUIsQ0FBQyxNQUFNLE9BQU87QUFBQSxJQUM3QixPQUFPLENBQUMsbUJBQW1CO0FBQUEsTUFDekIsTUFBTSxjQUFjLE9BQU8sbUJBQW1CLGFBQWEsZUFBZSxzQkFBc0IsQ0FBQyxJQUFJO0FBQUEsTUFDckcsS0FBSyxhQUFhLEtBQUssa0JBQWtCLEdBQUcsWUFBWSxrQkFBa0IsQ0FBQyxHQUFHO0FBQUEsUUFDNUUsTUFBTSxJQUFJLE1BQ1IsK0dBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFDQSxLQUFLLE9BQU8sYUFBYSxLQUFLLEVBQUUsTUFBTSxPQUFPLFlBQVksQ0FBQztBQUFBLE1BQzFELE9BQU87QUFBQTtBQUFBO0FBQUEsRUE0QlgsUUFBUSxLQUFLLGtCQUFrQixTQUFTLEtBQUs7QUFBQSxFQTBCN0MsV0FBVyxLQUFLLGtCQUFrQixTQUFTLElBQUk7QUFBQSxFQTBCL0MsWUFBWSxLQUFLLGtCQUFrQixhQUFhLEtBQUs7QUFBQSxFQTBCckQsU0FBUyxLQUFLLGtCQUFrQixVQUFVLEtBQUs7QUFBQSxFQUUvQyxlQUFlLENBQUMsY0FBYztBQUFBLElBQzVCLEtBQUssT0FBTyxhQUFhLEtBQUssR0FBRyxZQUFZO0FBQUEsSUFDN0MsT0FBTztBQUFBO0FBQUEsRUErQlQsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLElBQUksT0FBTyxVQUFVLFlBQVk7QUFBQSxNQUMvQixRQUFRLE1BQ04sSUFBSSxNQUNGLEtBQUssT0FBTyxRQUNaLElBQUksc0JBQXNCLEVBQUUsb0JBQW9CLE9BQU8sYUFBYSxNQUFNLENBQUMsQ0FDN0UsQ0FDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUssT0FBTyxRQUFRO0FBQUEsSUFDcEIsT0FBTztBQUFBO0FBQUEsRUF3QlQsTUFBTSxDQUFDLFFBQVE7QUFBQSxJQUNiLElBQUksT0FBTyxXQUFXLFlBQVk7QUFBQSxNQUNoQyxTQUFTLE9BQ1AsSUFBSSxNQUNGLEtBQUssT0FBTyxRQUNaLElBQUksc0JBQXNCLEVBQUUsb0JBQW9CLE9BQU8sYUFBYSxNQUFNLENBQUMsQ0FDN0UsQ0FDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUssT0FBTyxTQUFTO0FBQUEsSUFDckIsT0FBTztBQUFBO0FBQUEsRUFFVCxPQUFPLElBQUksU0FBUztBQUFBLElBQ2xCLElBQUksT0FBTyxRQUFRLE9BQU8sWUFBWTtBQUFBLE1BQ3BDLE1BQU0sVUFBVSxRQUFRLEdBQ3RCLElBQUksTUFDRixLQUFLLE9BQU8sUUFDWixJQUFJLHNCQUFzQixFQUFFLG9CQUFvQixTQUFTLGFBQWEsTUFBTSxDQUFDLENBQy9FLENBQ0Y7QUFBQSxNQUNBLEtBQUssT0FBTyxVQUFVLE1BQU0sUUFBUSxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU87QUFBQSxJQUNuRSxFQUFPO0FBQUEsTUFDTCxLQUFLLE9BQU8sVUFBVTtBQUFBO0FBQUEsSUFFeEIsT0FBTztBQUFBO0FBQUEsRUFFVCxPQUFPLElBQUksU0FBUztBQUFBLElBQ2xCLElBQUksT0FBTyxRQUFRLE9BQU8sWUFBWTtBQUFBLE1BQ3BDLE1BQU0sVUFBVSxRQUFRLEdBQ3RCLElBQUksTUFDRixLQUFLLE9BQU8sUUFDWixJQUFJLHNCQUFzQixFQUFFLG9CQUFvQixTQUFTLGFBQWEsTUFBTSxDQUFDLENBQy9FLENBQ0Y7QUFBQSxNQUNBLE1BQU0sZUFBZSxNQUFNLFFBQVEsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPO0FBQUEsTUFDaEUsSUFBSSxLQUFLLE9BQU8sYUFBYSxTQUFTLEdBQUc7QUFBQSxRQUN2QyxLQUFLLE9BQU8sYUFBYSxHQUFHLEVBQUUsRUFBRSxVQUFVO0FBQUEsTUFDNUMsRUFBTztBQUFBLFFBQ0wsS0FBSyxPQUFPLFVBQVU7QUFBQTtBQUFBLElBRTFCLEVBQU87QUFBQSxNQUNMLE1BQU0sZUFBZTtBQUFBLE1BQ3JCLElBQUksS0FBSyxPQUFPLGFBQWEsU0FBUyxHQUFHO0FBQUEsUUFDdkMsS0FBSyxPQUFPLGFBQWEsR0FBRyxFQUFFLEVBQUUsVUFBVTtBQUFBLE1BQzVDLEVBQU87QUFBQSxRQUNMLEtBQUssT0FBTyxVQUFVO0FBQUE7QUFBQTtBQUFBLElBRzFCLE9BQU87QUFBQTtBQUFBLEVBa0JULEtBQUssQ0FBQyxPQUFPO0FBQUEsSUFDWCxJQUFJLEtBQUssT0FBTyxhQUFhLFNBQVMsR0FBRztBQUFBLE1BQ3ZDLEtBQUssT0FBTyxhQUFhLEdBQUcsRUFBRSxFQUFFLFFBQVE7QUFBQSxJQUMxQyxFQUFPO0FBQUEsTUFDTCxLQUFLLE9BQU8sUUFBUTtBQUFBO0FBQUEsSUFFdEIsT0FBTztBQUFBO0FBQUEsRUFrQlQsTUFBTSxDQUFDLFFBQVE7QUFBQSxJQUNiLElBQUksS0FBSyxPQUFPLGFBQWEsU0FBUyxHQUFHO0FBQUEsTUFDdkMsS0FBSyxPQUFPLGFBQWEsR0FBRyxFQUFFLEVBQUUsU0FBUztBQUFBLElBQzNDLEVBQU87QUFBQSxNQUNMLEtBQUssT0FBTyxTQUFTO0FBQUE7QUFBQSxJQUV2QixPQUFPO0FBQUE7QUFBQSxFQUdULE1BQU0sR0FBRztBQUFBLElBQ1AsT0FBTyxLQUFLLFFBQVEsaUJBQWlCLEtBQUssTUFBTTtBQUFBO0FBQUEsRUFFbEQsS0FBSyxHQUFHO0FBQUEsSUFDTixRQUFRLFNBQVMsYUFBYSxTQUFTLEtBQUssUUFBUSxXQUFXLEtBQUssT0FBTyxDQUFDO0FBQUEsSUFDNUUsT0FBTztBQUFBO0FBQUEsRUFFVCxFQUFFLENBQUMsT0FBTztBQUFBLElBQ1IsTUFBTSxhQUFhLENBQUM7QUFBQSxJQUNwQixXQUFXLEtBQUssR0FBRyxpQkFBaUIsS0FBSyxPQUFPLEtBQUssQ0FBQztBQUFBLElBQ3RELElBQUksS0FBSyxPQUFPLE9BQU87QUFBQSxNQUNyQixXQUFXLE1BQU0sS0FBSyxPQUFPO0FBQUEsUUFBTyxXQUFXLEtBQUssR0FBRyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFBQSxJQUNuRjtBQUFBLElBQ0EsT0FBTyxJQUFJLE1BQ1QsSUFBSSxTQUFTLEtBQUssT0FBTyxHQUFHLEtBQUssT0FBTyxRQUFRLE9BQU8sT0FBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLFVBQVUsQ0FBQyxDQUFDLEdBQ3RGLElBQUksc0JBQXNCLEVBQUUsT0FBTyxvQkFBb0IsU0FBUyxhQUFhLFFBQVEsQ0FBQyxDQUN4RjtBQUFBO0FBQUEsRUFHRixpQkFBaUIsR0FBRztBQUFBLElBQ2xCLE9BQU8sSUFBSSxNQUNULEtBQUssT0FBTyxRQUNaLElBQUksc0JBQXNCLEVBQUUsT0FBTyxLQUFLLFdBQVcsb0JBQW9CLFNBQVMsYUFBYSxRQUFRLENBQUMsQ0FDeEc7QUFBQTtBQUFBLEVBRUYsUUFBUSxHQUFHO0FBQUEsSUFDVCxPQUFPO0FBQUE7QUFFWDtBQUFBO0FBQ0EsTUFBTSx5QkFBeUIsNkJBQTZCO0FBQUEsVUFDbEQsY0FBYztBQUFBLEVBRXRCLFFBQVEsQ0FBQyxpQkFBaUIsTUFBTTtBQUFBLElBQzlCLEtBQUssS0FBSyxTQUFTO0FBQUEsTUFDakIsTUFBTSxJQUFJLE1BQU0sb0ZBQW9GO0FBQUEsSUFDdEc7QUFBQSxJQUNBLE1BQU0sYUFBYSxvQkFBb0IsS0FBSyxPQUFPLE1BQU07QUFBQSxJQUN6RCxNQUFNLFFBQVEsS0FBSyxRQUFRLGlCQUFpQix3QkFBd0IsZ0JBQ2xFLEtBQUssUUFBUSxXQUFXLEtBQUssT0FBTyxDQUFDLEdBQ3JDLFlBQ0EsT0FDQSxNQUNLLFdBQ0w7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLFFBQVEsQ0FBQyxHQUFHLEtBQUssVUFBVTtBQUFBLElBQzdCLEdBQ0EsS0FBSyxXQUNQO0FBQUEsSUFDQSxNQUFNLHNCQUFzQixLQUFLO0FBQUEsSUFDakMsT0FBTztBQUFBO0FBQUEsRUFFVCxVQUFVLENBQUMsUUFBUTtBQUFBLElBQ2pCLEtBQUssY0FBYyxXQUFnQixZQUFJLEVBQUUsUUFBUSxDQUFDLEdBQUcsUUFBUSxNQUFNLGdCQUFnQixLQUFLLElBQUksV0FBVyxRQUFRLEVBQUUsUUFBUSxNQUFNLElBQUksRUFBRSxRQUFRLE1BQU0sZ0JBQWdCLFNBQVMsT0FBTztBQUFBLElBQ25MLE9BQU87QUFBQTtBQUFBLEVBRVQsT0FBTyxHQUFHO0FBQUEsSUFDUixPQUFPLEtBQUssU0FBUyxLQUFLO0FBQUE7QUFBQSxFQUU1QixNQUFNLENBQUMsc0JBQXNCO0FBQUEsSUFDM0IsT0FBTyxLQUFLLFNBQVMsRUFBRSxJQUFJLGlCQUFpQjtBQUFBO0FBQUEsRUFFOUMsTUFBTSxDQUFDLHNCQUFzQjtBQUFBLElBQzNCLE9BQU8sS0FBSyxTQUFTLEVBQUUsSUFBSSxpQkFBaUI7QUFBQTtBQUFBLEVBRTlDLE1BQU0sQ0FBQyxzQkFBc0I7QUFBQSxJQUMzQixPQUFPLEtBQUssU0FBUyxFQUFFLElBQUksaUJBQWlCO0FBQUE7QUFBQSxFQUU5QyxTQUFTLENBQUMsc0JBQXNCO0FBQUEsSUFDOUIsT0FBTyxLQUFLLFNBQVMsRUFBRSxPQUFPLGlCQUFpQjtBQUFBO0FBQUEsT0FFM0MsUUFBTyxHQUFHO0FBQUEsSUFDZCxPQUFPLEtBQUssSUFBSTtBQUFBO0FBRXBCO0FBQ0EsWUFBWSxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7QUFDNUMsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNLE9BQU87QUFBQSxFQUN0QyxPQUFPLENBQUMsWUFBWSxnQkFBZ0IsZ0JBQWdCO0FBQUEsSUFDbEQsTUFBTSxlQUFlLENBQUMsYUFBYSxHQUFHLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWTtBQUFBLE1BQ2xFO0FBQUEsTUFDQTtBQUFBLE1BQ0EsYUFBYTtBQUFBLElBQ2YsRUFBRTtBQUFBLElBQ0YsV0FBVyxlQUFlLGNBQWM7QUFBQSxNQUN0QyxLQUFLLGFBQWEsV0FBVyxrQkFBa0IsR0FBRyxZQUFZLFlBQVksa0JBQWtCLENBQUMsR0FBRztBQUFBLFFBQzlGLE1BQU0sSUFBSSxNQUNSLCtHQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLE9BQU8sV0FBVyxnQkFBZ0IsWUFBWTtBQUFBO0FBQUE7QUFHbEQsSUFBTSx3QkFBd0IsT0FBTztBQUFBLEVBQ25DO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFDQSxJQUFNLFFBQVEsa0JBQWtCLFNBQVMsS0FBSztBQUM5QyxJQUFNLFdBQVcsa0JBQWtCLFNBQVMsSUFBSTtBQUNoRCxJQUFNLFlBQVksa0JBQWtCLGFBQWEsS0FBSztBQUN0RCxJQUFNLFNBQVMsa0JBQWtCLFVBQVUsS0FBSzs7O0FDbHFCaEQsTUFBTSxhQUFhO0FBQUEsVUFDVCxjQUFjO0FBQUEsRUFDdEI7QUFBQSxFQUNBO0FBQUEsRUFDQSxXQUFXLENBQUMsU0FBUztBQUFBLElBQ25CLEtBQUssVUFBVSxHQUFHLFNBQVMsYUFBYSxJQUFJLFVBQWU7QUFBQSxJQUMzRCxLQUFLLGdCQUFnQixHQUFHLFNBQVMsYUFBYSxJQUFTLFlBQUk7QUFBQTtBQUFBLEVBRTdELFFBQVEsQ0FBQyxPQUFPLGNBQWM7QUFBQSxJQUM1QixNQUFNLGVBQWU7QUFBQSxJQUNyQixNQUFNLEtBQUssQ0FBQyxPQUFPO0FBQUEsTUFDakIsSUFBSSxPQUFPLE9BQU8sWUFBWTtBQUFBLFFBQzVCLEtBQUssR0FBRyxZQUFZO0FBQUEsTUFDdEI7QUFBQSxNQUNBLE9BQU8sSUFBSSxNQUNULElBQUksYUFDRixHQUFHLE9BQU8sR0FDVixjQUFjLHVCQUF1QixLQUFLLEdBQUcsa0JBQWtCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFDMUUsT0FDQSxJQUNGLEdBQ0EsSUFBSSxzQkFBc0IsRUFBRSxPQUFPLG9CQUFvQixTQUFTLGFBQWEsUUFBUSxDQUFDLENBQ3hGO0FBQUE7QUFBQSxJQUVGLE9BQU8sRUFBRSxHQUFHO0FBQUE7QUFBQSxFQUVkLElBQUksSUFBSSxTQUFTO0FBQUEsSUFDZixNQUFNLFFBQU87QUFBQSxJQUNiLFNBQVMsTUFBTSxDQUFDLFFBQVE7QUFBQSxNQUN0QixPQUFPLElBQUksb0JBQW9CO0FBQUEsUUFDN0IsUUFBUSxVQUFlO0FBQUEsUUFDdkIsU0FBYztBQUFBLFFBQ2QsU0FBUyxNQUFLLFdBQVc7QUFBQSxRQUN6QixVQUFVO0FBQUEsTUFDWixDQUFDO0FBQUE7QUFBQSxJQUVILFNBQVMsY0FBYyxDQUFDLFFBQVE7QUFBQSxNQUM5QixPQUFPLElBQUksb0JBQW9CO0FBQUEsUUFDN0IsUUFBUSxVQUFlO0FBQUEsUUFDdkIsU0FBYztBQUFBLFFBQ2QsU0FBUyxNQUFLLFdBQVc7QUFBQSxRQUN6QixVQUFVO0FBQUEsUUFDVixVQUFVO0FBQUEsTUFDWixDQUFDO0FBQUE7QUFBQSxJQUVILE9BQU8sRUFBRSxRQUFRLGVBQWU7QUFBQTtBQUFBLEVBRWxDLE1BQU0sQ0FBQyxRQUFRO0FBQUEsSUFDYixPQUFPLElBQUksb0JBQW9CLEVBQUUsUUFBUSxVQUFlLFdBQUcsU0FBYyxXQUFHLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQztBQUFBO0FBQUEsRUFFMUcsY0FBYyxDQUFDLFFBQVE7QUFBQSxJQUNyQixPQUFPLElBQUksb0JBQW9CO0FBQUEsTUFDN0IsUUFBUSxVQUFlO0FBQUEsTUFDdkIsU0FBYztBQUFBLE1BQ2QsU0FBUyxLQUFLLFdBQVc7QUFBQSxNQUN6QixVQUFVO0FBQUEsSUFDWixDQUFDO0FBQUE7QUFBQSxFQUdILFVBQVUsR0FBRztBQUFBLElBQ1gsS0FBSyxLQUFLLFNBQVM7QUFBQSxNQUNqQixLQUFLLFVBQVUsSUFBSSxrQkFBa0IsS0FBSyxhQUFhO0FBQUEsSUFDekQ7QUFBQSxJQUNBLE9BQU8sS0FBSztBQUFBO0FBRWhCOzs7QUM5REEsTUFBTSxvQkFBb0I7QUFBQSxFQUN4QixXQUFXLENBQUMsT0FBTyxTQUFTLFNBQVMsVUFBVTtBQUFBLElBQzdDLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssV0FBVztBQUFBO0FBQUEsVUFFVixjQUFjO0FBQUEsRUFDdEIsTUFBTSxDQUFDLFFBQVE7QUFBQSxJQUNiLFNBQVMsTUFBTSxRQUFRLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTTtBQUFBLElBQ2pELElBQUksT0FBTyxXQUFXLEdBQUc7QUFBQSxNQUN2QixNQUFNLElBQUksTUFBTSxpREFBaUQ7QUFBQSxJQUNuRTtBQUFBLElBQ0EsTUFBTSxlQUFlLE9BQU8sSUFBSSxDQUFDLFVBQVU7QUFBQSxNQUN6QyxNQUFNLFNBQVMsQ0FBQztBQUFBLE1BQ2hCLE1BQU0sT0FBTyxLQUFLLE1BQU0sTUFBTSxPQUFPO0FBQUEsTUFDckMsV0FBVyxVQUFVLE9BQU8sS0FBSyxLQUFLLEdBQUc7QUFBQSxRQUN2QyxNQUFNLFdBQVcsTUFBTTtBQUFBLFFBQ3ZCLE9BQU8sVUFBVSxHQUFHLFVBQVUsR0FBRyxJQUFJLFdBQVcsSUFBSSxNQUFNLFVBQVUsS0FBSyxPQUFPO0FBQUEsTUFDbEY7QUFBQSxNQUNBLE9BQU87QUFBQSxLQUNSO0FBQUEsSUFDRCxPQUFPLElBQUksaUJBQWlCLEtBQUssT0FBTyxjQUFjLEtBQUssU0FBUyxLQUFLLFNBQVMsS0FBSyxRQUFRO0FBQUE7QUFBQSxFQUVqRyxNQUFNLENBQUMsYUFBYTtBQUFBLElBQ2xCLE1BQU0sU0FBUyxPQUFPLGdCQUFnQixhQUFhLFlBQVksSUFBSSxZQUFjLElBQUk7QUFBQSxJQUNyRixLQUFLLEdBQUcsUUFBUSxHQUFHLE1BQU0sYUFBYSxLQUFLLE1BQU0sVUFBVSxPQUFPLEVBQUUsY0FBYyxHQUFHO0FBQUEsTUFDbkYsTUFBTSxJQUFJLE1BQ1Isb0hBQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPLElBQUksaUJBQWlCLEtBQUssT0FBTyxRQUFRLEtBQUssU0FBUyxLQUFLLFNBQVMsS0FBSyxVQUFVLElBQUk7QUFBQTtBQUVuRztBQUFBO0FBQ0EsTUFBTSx5QkFBeUIsYUFBYTtBQUFBLEVBQzFDLFdBQVcsQ0FBQyxPQUFPLFFBQVEsU0FBUyxTQUFTLFVBQVUsUUFBUTtBQUFBLElBQzdELE1BQU07QUFBQSxJQUNOLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFNBQVMsRUFBRSxPQUFPLFFBQVEsVUFBVSxPQUFPO0FBQUE7QUFBQSxVQUUxQyxjQUFjO0FBQUEsRUFFdEI7QUFBQSxFQUNBLFNBQVMsQ0FBQyxTQUFTLEtBQUssT0FBTyxNQUFNLFlBQVksT0FBTyxVQUFVO0FBQUEsSUFDaEUsS0FBSyxPQUFPLFlBQVksb0JBQW9CLE1BQU07QUFBQSxJQUNsRCxPQUFPO0FBQUE7QUFBQSxFQXdCVCxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsR0FBRztBQUFBLElBQy9CLEtBQUssS0FBSyxPQUFPO0FBQUEsTUFBWSxLQUFLLE9BQU8sYUFBYSxDQUFDO0FBQUEsSUFDdkQsSUFBSSxPQUFPLFdBQWdCLFdBQUc7QUFBQSxNQUM1QixLQUFLLE9BQU8sV0FBVyxLQUFLLDRCQUE0QjtBQUFBLElBQzFELEVBQU87QUFBQSxNQUNMLE1BQU0sWUFBWSxNQUFNLFFBQVEsT0FBTyxNQUFNLElBQUksTUFBTSxPQUFPLFdBQVcsTUFBTSxDQUFDLE9BQU8sTUFBTTtBQUFBLE1BQzdGLE1BQU0sV0FBVyxPQUFPLFFBQVEsYUFBYSxPQUFPLFVBQVU7QUFBQSxNQUM5RCxLQUFLLE9BQU8sV0FBVyxLQUFLLG1CQUFtQix1QkFBdUIsVUFBVTtBQUFBO0FBQUEsSUFFbEYsT0FBTztBQUFBO0FBQUEsRUErQlQsa0JBQWtCLENBQUMsUUFBUTtBQUFBLElBQ3pCLElBQUksT0FBTyxVQUFVLE9BQU8sZUFBZSxPQUFPLFdBQVc7QUFBQSxNQUMzRCxNQUFNLElBQUksTUFDUiw2SUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUssS0FBSyxPQUFPO0FBQUEsTUFBWSxLQUFLLE9BQU8sYUFBYSxDQUFDO0FBQUEsSUFDdkQsTUFBTSxXQUFXLE9BQU8sUUFBUSxhQUFhLE9BQU8sVUFBZTtBQUFBLElBQ25FLE1BQU0saUJBQWlCLE9BQU8sY0FBYyxhQUFhLE9BQU8sZ0JBQXFCO0FBQUEsSUFDckYsTUFBTSxjQUFjLE9BQU8sV0FBVyxhQUFhLE9BQU8sYUFBa0I7QUFBQSxJQUM1RSxNQUFNLFlBQVksTUFBTSxRQUFRLE9BQU8sTUFBTSxJQUFJLE1BQU0sT0FBTyxXQUFXLE1BQU0sQ0FBQyxPQUFPLE1BQU07QUFBQSxJQUM3RixNQUFNLFNBQVMsS0FBSyxRQUFRLGVBQWUsS0FBSyxPQUFPLE9BQU8sYUFBYSxLQUFLLE9BQU8sT0FBTyxPQUFPLEdBQUcsQ0FBQztBQUFBLElBQ3pHLEtBQUssT0FBTyxXQUFXLEtBQ3JCLG1CQUFtQixZQUFZLGdDQUFnQyxTQUFTLFdBQVcsYUFDckY7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBR1QsTUFBTSxHQUFHO0FBQUEsSUFDUCxPQUFPLEtBQUssUUFBUSxpQkFBaUIsS0FBSyxNQUFNO0FBQUE7QUFBQSxFQUVsRCxLQUFLLEdBQUc7QUFBQSxJQUNOLFFBQVEsU0FBUyxhQUFhLFNBQVMsS0FBSyxRQUFRLFdBQVcsS0FBSyxPQUFPLENBQUM7QUFBQSxJQUM1RSxPQUFPO0FBQUE7QUFBQSxFQUdULFFBQVEsQ0FBQyxpQkFBaUIsTUFBTTtBQUFBLElBQzlCLE9BQU8sS0FBSyxRQUFRLGlCQUFpQix3QkFBd0IsZ0JBQzNELEtBQUssUUFBUSxXQUFXLEtBQUssT0FBTyxDQUFDLEdBQ3JDLEtBQUssT0FBTyxXQUNaLEtBQUssT0FBTyxZQUFZLFFBQVEsT0FDaEMsTUFDSyxXQUNMO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixRQUFRLGlCQUFpQixLQUFLLE9BQU8sS0FBSztBQUFBLElBQzVDLENBQ0Y7QUFBQTtBQUFBLEVBRUYsT0FBTyxHQUFHO0FBQUEsSUFDUixPQUFPLEtBQUssU0FBUyxLQUFLO0FBQUE7QUFBQSxFQUU1QixNQUFNLENBQUMsc0JBQXNCO0FBQUEsSUFDM0IsT0FBTyxLQUFLLFNBQVMsRUFBRSxJQUFJLGlCQUFpQjtBQUFBO0FBQUEsRUFFOUMsTUFBTSxDQUFDLHNCQUFzQjtBQUFBLElBQzNCLE9BQU8sS0FBSyxTQUFTLEVBQUUsSUFBSSxpQkFBaUI7QUFBQTtBQUFBLEVBRTlDLE1BQU0sQ0FBQyxzQkFBc0I7QUFBQSxJQUMzQixPQUFPLEtBQUssU0FBUyxFQUFFLElBQUksaUJBQWlCO0FBQUE7QUFBQSxFQUU5QyxTQUFTLENBQUMsc0JBQXNCO0FBQUEsSUFDOUIsT0FBTyxLQUFLLFNBQVMsRUFBRSxPQUFPLGlCQUFpQjtBQUFBO0FBQUEsT0FFM0MsUUFBTyxHQUFHO0FBQUEsSUFDZCxPQUFPLEtBQUssT0FBTyxZQUFZLEtBQUssSUFBSSxJQUFJLEtBQUssSUFBSTtBQUFBO0FBQUEsRUFFdkQsUUFBUSxHQUFHO0FBQUEsSUFDVCxPQUFPO0FBQUE7QUFFWDs7O0FDcEtBLE1BQU0sb0JBQW9CO0FBQUEsRUFDeEIsV0FBVyxDQUFDLE9BQU8sU0FBUyxTQUFTLFVBQVU7QUFBQSxJQUM3QyxLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFdBQVc7QUFBQTtBQUFBLFVBRVYsY0FBYztBQUFBLEVBQ3RCLEdBQUcsQ0FBQyxRQUFRO0FBQUEsSUFDVixPQUFPLElBQUksaUJBQ1QsS0FBSyxPQUNMLGFBQWEsS0FBSyxPQUFPLE1BQU0sR0FDL0IsS0FBSyxTQUNMLEtBQUssU0FDTCxLQUFLLFFBQ1A7QUFBQTtBQUVKO0FBQUE7QUFDQSxNQUFNLHlCQUF5QixhQUFhO0FBQUEsRUFDMUMsV0FBVyxDQUFDLE9BQU8sS0FBSyxTQUFTLFNBQVMsVUFBVTtBQUFBLElBQ2xELE1BQU07QUFBQSxJQUNOLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFNBQVMsRUFBRSxLQUFLLE9BQU8sVUFBVSxPQUFPLENBQUMsRUFBRTtBQUFBO0FBQUEsVUFFMUMsY0FBYztBQUFBLEVBRXRCO0FBQUEsRUFDQSxJQUFJLENBQUMsUUFBUTtBQUFBLElBQ1gsS0FBSyxPQUFPLE9BQU87QUFBQSxJQUNuQixPQUFPO0FBQUE7QUFBQSxFQUVULFVBQVUsQ0FBQyxVQUFVO0FBQUEsSUFDbkIsT0FBTyxDQUFDLE9BQU8sT0FBTztBQUFBLE1BQ3BCLE1BQU0sWUFBWSxpQkFBaUIsS0FBSztBQUFBLE1BQ3hDLElBQUksT0FBTyxjQUFjLFlBQVksS0FBSyxPQUFPLE1BQU0sS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLFNBQVMsR0FBRztBQUFBLFFBQy9GLE1BQU0sSUFBSSxNQUFNLFVBQVUsMENBQTBDO0FBQUEsTUFDdEU7QUFBQSxNQUNBLElBQUksT0FBTyxPQUFPLFlBQVk7QUFBQSxRQUM1QixNQUFNLE9BQU8sS0FBSyxPQUFPLE9BQU8sR0FBRyxPQUFPLFdBQVcsSUFBSSxNQUFNLE1BQU0sT0FBTyxXQUFXLEdBQUcsT0FBTyxRQUFRLElBQUksTUFBTSxFQUFFLGlCQUFpQixHQUFHLE9BQU8sY0FBYyxJQUFJLE1BQU0sZ0JBQWdCLGlCQUFzQixZQUFTO0FBQUEsUUFDdk4sS0FBSyxHQUNILElBQUksTUFDRixLQUFLLE9BQU8sTUFBTSxNQUFNLE9BQU8sVUFDL0IsSUFBSSxzQkFBc0IsRUFBRSxvQkFBb0IsT0FBTyxhQUFhLE1BQU0sQ0FBQyxDQUM3RSxHQUNBLFFBQVEsSUFBSSxNQUNWLE1BQ0EsSUFBSSxzQkFBc0IsRUFBRSxvQkFBb0IsT0FBTyxhQUFhLE1BQU0sQ0FBQyxDQUM3RSxDQUNGO0FBQUEsTUFDRjtBQUFBLE1BQ0EsS0FBSyxPQUFPLE1BQU0sS0FBSyxFQUFFLElBQUksT0FBTyxVQUFVLE9BQU8sVUFBVSxDQUFDO0FBQUEsTUFDaEUsT0FBTztBQUFBO0FBQUE7QUFBQSxFQUdYLFdBQVcsS0FBSyxXQUFXLE1BQU07QUFBQSxFQUNqQyxZQUFZLEtBQUssV0FBVyxPQUFPO0FBQUEsRUFDbkMsWUFBWSxLQUFLLFdBQVcsT0FBTztBQUFBLEVBQ25DLFdBQVcsS0FBSyxXQUFXLE1BQU07QUFBQSxFQWtDakMsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLEtBQUssT0FBTyxRQUFRO0FBQUEsSUFDcEIsT0FBTztBQUFBO0FBQUEsRUFFVCxPQUFPLElBQUksU0FBUztBQUFBLElBQ2xCLElBQUksT0FBTyxRQUFRLE9BQU8sWUFBWTtBQUFBLE1BQ3BDLE1BQU0sVUFBVSxRQUFRLEdBQ3RCLElBQUksTUFDRixLQUFLLE9BQU8sTUFBTSxNQUFNLE9BQU8sVUFDL0IsSUFBSSxzQkFBc0IsRUFBRSxvQkFBb0IsU0FBUyxhQUFhLE1BQU0sQ0FBQyxDQUMvRSxDQUNGO0FBQUEsTUFDQSxNQUFNLGVBQWUsTUFBTSxRQUFRLE9BQU8sSUFBSSxVQUFVLENBQUMsT0FBTztBQUFBLE1BQ2hFLEtBQUssT0FBTyxVQUFVO0FBQUEsSUFDeEIsRUFBTztBQUFBLE1BQ0wsTUFBTSxlQUFlO0FBQUEsTUFDckIsS0FBSyxPQUFPLFVBQVU7QUFBQTtBQUFBLElBRXhCLE9BQU87QUFBQTtBQUFBLEVBRVQsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLEtBQUssT0FBTyxRQUFRO0FBQUEsSUFDcEIsT0FBTztBQUFBO0FBQUEsRUFFVCxTQUFTLENBQUMsU0FBUyxLQUFLLE9BQU8sTUFBTSxZQUFZLE9BQU8sVUFBVTtBQUFBLElBQ2hFLEtBQUssT0FBTyxZQUFZLG9CQUFvQixNQUFNO0FBQUEsSUFDbEQsT0FBTztBQUFBO0FBQUEsRUFHVCxNQUFNLEdBQUc7QUFBQSxJQUNQLE9BQU8sS0FBSyxRQUFRLGlCQUFpQixLQUFLLE1BQU07QUFBQTtBQUFBLEVBRWxELEtBQUssR0FBRztBQUFBLElBQ04sUUFBUSxTQUFTLGFBQWEsU0FBUyxLQUFLLFFBQVEsV0FBVyxLQUFLLE9BQU8sQ0FBQztBQUFBLElBQzVFLE9BQU87QUFBQTtBQUFBLEVBR1QsUUFBUSxDQUFDLGlCQUFpQixNQUFNO0FBQUEsSUFDOUIsT0FBTyxLQUFLLFFBQVEsaUJBQWlCLHdCQUF3QixnQkFDM0QsS0FBSyxRQUFRLFdBQVcsS0FBSyxPQUFPLENBQUMsR0FDckMsS0FBSyxPQUFPLFdBQ1osS0FBSyxPQUFPLFlBQVksUUFBUSxPQUNoQyxNQUNLLFdBQ0w7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLFFBQVEsaUJBQWlCLEtBQUssT0FBTyxLQUFLO0FBQUEsSUFDNUMsQ0FDRjtBQUFBO0FBQUEsRUFFRixPQUFPLEdBQUc7QUFBQSxJQUNSLE9BQU8sS0FBSyxTQUFTLEtBQUs7QUFBQTtBQUFBLEVBRTVCLE1BQU0sQ0FBQyxzQkFBc0I7QUFBQSxJQUMzQixPQUFPLEtBQUssU0FBUyxFQUFFLElBQUksaUJBQWlCO0FBQUE7QUFBQSxFQUU5QyxNQUFNLENBQUMsc0JBQXNCO0FBQUEsSUFDM0IsT0FBTyxLQUFLLFNBQVMsRUFBRSxJQUFJLGlCQUFpQjtBQUFBO0FBQUEsRUFFOUMsTUFBTSxDQUFDLHNCQUFzQjtBQUFBLElBQzNCLE9BQU8sS0FBSyxTQUFTLEVBQUUsSUFBSSxpQkFBaUI7QUFBQTtBQUFBLEVBRTlDLFNBQVMsQ0FBQyxzQkFBc0I7QUFBQSxJQUM5QixPQUFPLEtBQUssU0FBUyxFQUFFLE9BQU8saUJBQWlCO0FBQUE7QUFBQSxPQUUzQyxRQUFPLEdBQUc7QUFBQSxJQUNkLE9BQU8sS0FBSyxPQUFPLFlBQVksS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJO0FBQUE7QUFBQSxFQUV2RCxRQUFRLEdBQUc7QUFBQSxJQUNULE9BQU87QUFBQTtBQUVYOzs7QUMvS0EsTUFBTSwyQkFBMkIsSUFBSTtBQUFBLEVBQ25DLFdBQVcsQ0FBQyxRQUFRO0FBQUEsSUFDbEIsTUFBTSxtQkFBbUIsbUJBQW1CLE9BQU8sUUFBUSxPQUFPLE9BQU8sRUFBRSxXQUFXO0FBQUEsSUFDdEYsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLFVBQVUsT0FBTztBQUFBLElBQ3RCLEtBQUssTUFBTSxtQkFBbUIsV0FDNUIsT0FBTyxRQUNQLE9BQU8sT0FDVDtBQUFBO0FBQUEsRUFFRjtBQUFBLFVBQ1EsY0FBYztBQUFBLEdBQ3JCLE9BQU8sZUFBZTtBQUFBLEVBQ3ZCO0FBQUEsU0FDTyxrQkFBa0IsQ0FBQyxRQUFRLFNBQVM7QUFBQSxJQUN6QyxPQUFPLDRCQUE0QixTQUFTLElBQUksSUFBSSxTQUFTLEVBQUUsR0FBRyxPQUFPLElBQUk7QUFBQTtBQUFBLFNBRXhFLFVBQVUsQ0FBQyxRQUFRLFNBQVM7QUFBQSxJQUNqQyxPQUFPLDJCQUEyQixTQUFTLElBQUksSUFBSSxTQUFTLEVBQUUsR0FBRyxPQUFPLElBQUk7QUFBQTtBQUFBLEVBRTlFLElBQUksQ0FBQyxhQUFhLFlBQVk7QUFBQSxJQUM1QixPQUFPLFFBQVEsUUFBUSxLQUFLLFFBQVEsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQ25ELGFBQ0EsVUFDRjtBQUFBO0FBQUEsRUFFRixLQUFLLENBQUMsWUFBWTtBQUFBLElBQ2hCLE9BQU8sS0FBSyxLQUFVLFdBQUcsVUFBVTtBQUFBO0FBQUEsRUFFckMsT0FBTyxDQUFDLFdBQVc7QUFBQSxJQUNqQixPQUFPLEtBQUssS0FDVixDQUFDLFVBQVU7QUFBQSxNQUNULFlBQVk7QUFBQSxNQUNaLE9BQU87QUFBQSxPQUVULENBQUMsV0FBVztBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osTUFBTTtBQUFBLEtBRVY7QUFBQTtBQUVKOzs7QUN0Q0EsTUFBTSx1QkFBdUI7QUFBQSxFQUMzQixXQUFXLENBQUMsTUFBTSxZQUFZLFFBQVEsZUFBZSxPQUFPLGFBQWEsU0FBUyxTQUFTO0FBQUEsSUFDekYsS0FBSyxPQUFPO0FBQUEsSUFDWixLQUFLLGFBQWE7QUFBQSxJQUNsQixLQUFLLFNBQVM7QUFBQSxJQUNkLEtBQUssZ0JBQWdCO0FBQUEsSUFDckIsS0FBSyxRQUFRO0FBQUEsSUFDYixLQUFLLGNBQWM7QUFBQSxJQUNuQixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssVUFBVTtBQUFBO0FBQUEsVUFFVCxjQUFjO0FBQUEsRUFDdEIsUUFBUSxDQUFDLFFBQVE7QUFBQSxJQUNmLE9BQU8sS0FBSyxTQUFTLFNBQVMsSUFBSSwwQkFDaEMsS0FBSyxZQUNMLEtBQUssUUFDTCxLQUFLLGVBQ0wsS0FBSyxPQUNMLEtBQUssYUFDTCxLQUFLLFNBQ0wsS0FBSyxTQUNMLFNBQVMsU0FBUyxDQUFDLEdBQ25CLE1BQ0YsSUFBSSxJQUFJLHNCQUNOLEtBQUssWUFDTCxLQUFLLFFBQ0wsS0FBSyxlQUNMLEtBQUssT0FDTCxLQUFLLGFBQ0wsS0FBSyxTQUNMLEtBQUssU0FDTCxTQUFTLFNBQVMsQ0FBQyxHQUNuQixNQUNGO0FBQUE7QUFBQSxFQUVGLFNBQVMsQ0FBQyxRQUFRO0FBQUEsSUFDaEIsT0FBTyxLQUFLLFNBQVMsU0FBUyxJQUFJLDBCQUNoQyxLQUFLLFlBQ0wsS0FBSyxRQUNMLEtBQUssZUFDTCxLQUFLLE9BQ0wsS0FBSyxhQUNMLEtBQUssU0FDTCxLQUFLLFNBQ0wsU0FBUyxLQUFLLFFBQVEsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FDOUMsT0FDRixJQUFJLElBQUksc0JBQ04sS0FBSyxZQUNMLEtBQUssUUFDTCxLQUFLLGVBQ0wsS0FBSyxPQUNMLEtBQUssYUFDTCxLQUFLLFNBQ0wsS0FBSyxTQUNMLFNBQVMsS0FBSyxRQUFRLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQzlDLE9BQ0Y7QUFBQTtBQUVKO0FBQUE7QUFDQSxNQUFNLDhCQUE4QixhQUFhO0FBQUEsRUFDL0MsV0FBVyxDQUFDLFlBQVksUUFBUSxlQUFlLE9BQU8sYUFBYSxTQUFTLFNBQVMsUUFBUSxNQUFNO0FBQUEsSUFDakcsTUFBTTtBQUFBLElBQ04sS0FBSyxhQUFhO0FBQUEsSUFDbEIsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLGdCQUFnQjtBQUFBLElBQ3JCLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxjQUFjO0FBQUEsSUFDbkIsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxPQUFPO0FBQUE7QUFBQSxVQUVOLGNBQWM7QUFBQSxFQUV0QjtBQUFBLEVBRUEsTUFBTSxHQUFHO0FBQUEsSUFDUCxPQUFPLEtBQUssUUFBUSxxQkFBcUI7QUFBQSxNQUN2QyxZQUFZLEtBQUs7QUFBQSxNQUNqQixRQUFRLEtBQUs7QUFBQSxNQUNiLGVBQWUsS0FBSztBQUFBLE1BQ3BCLE9BQU8sS0FBSztBQUFBLE1BQ1osYUFBYSxLQUFLO0FBQUEsTUFDbEIsYUFBYSxLQUFLO0FBQUEsTUFDbEIsWUFBWSxLQUFLLFlBQVk7QUFBQSxJQUMvQixDQUFDLEVBQUU7QUFBQTtBQUFBLEVBR0wsUUFBUSxDQUFDLGlCQUFpQixPQUFPO0FBQUEsSUFDL0IsUUFBUSxPQUFPLGVBQWUsS0FBSyxPQUFPO0FBQUEsSUFDMUMsT0FBTyxLQUFLLFFBQVEsaUJBQWlCLHdCQUF3QixnQkFDM0QsWUFDSyxXQUNMLEtBQUssU0FBUyxVQUFVLFFBQVEsT0FDaEMsTUFDQSxDQUFDLFNBQVMsbUJBQW1CO0FBQUEsTUFDM0IsTUFBTSxPQUFPLFFBQVEsSUFDbkIsQ0FBQyxRQUFRLGlCQUFpQixLQUFLLFFBQVEsS0FBSyxhQUFhLEtBQUssTUFBTSxXQUFXLGNBQWMsQ0FDL0Y7QUFBQSxNQUNBLElBQUksS0FBSyxTQUFTLFNBQVM7QUFBQSxRQUN6QixPQUFPLEtBQUs7QUFBQSxNQUNkO0FBQUEsTUFDQSxPQUFPO0FBQUEsS0FFWDtBQUFBO0FBQUEsRUFFRixPQUFPLEdBQUc7QUFBQSxJQUNSLE9BQU8sS0FBSyxTQUFTLEtBQUs7QUFBQTtBQUFBLEVBRTVCLE1BQU0sR0FBRztBQUFBLElBQ1AsTUFBTSxRQUFRLEtBQUssUUFBUSxxQkFBcUI7QUFBQSxNQUM5QyxZQUFZLEtBQUs7QUFBQSxNQUNqQixRQUFRLEtBQUs7QUFBQSxNQUNiLGVBQWUsS0FBSztBQUFBLE1BQ3BCLE9BQU8sS0FBSztBQUFBLE1BQ1osYUFBYSxLQUFLO0FBQUEsTUFDbEIsYUFBYSxLQUFLO0FBQUEsTUFDbEIsWUFBWSxLQUFLLFlBQVk7QUFBQSxJQUMvQixDQUFDO0FBQUEsSUFDRCxNQUFNLGFBQWEsS0FBSyxRQUFRLFdBQVcsTUFBTSxHQUFHO0FBQUEsSUFDcEQsT0FBTyxFQUFFLE9BQU8sV0FBVztBQUFBO0FBQUEsRUFFN0IsS0FBSyxHQUFHO0FBQUEsSUFDTixPQUFPLEtBQUssT0FBTyxFQUFFO0FBQUE7QUFBQSxFQUd2QixVQUFVLEdBQUc7QUFBQSxJQUNYLElBQUksS0FBSyxTQUFTLFNBQVM7QUFBQSxNQUN6QixPQUFPLEtBQUssU0FBUyxLQUFLLEVBQUUsSUFBSTtBQUFBLElBQ2xDO0FBQUEsSUFDQSxPQUFPLEtBQUssU0FBUyxLQUFLLEVBQUUsSUFBSTtBQUFBO0FBQUEsT0FFNUIsUUFBTyxHQUFHO0FBQUEsSUFDZCxPQUFPLEtBQUssV0FBVztBQUFBO0FBRTNCO0FBQUE7QUFDQSxNQUFNLGtDQUFrQyxzQkFBc0I7QUFBQSxVQUNwRCxjQUFjO0FBQUEsRUFDdEIsSUFBSSxHQUFHO0FBQUEsSUFDTCxPQUFPLEtBQUssV0FBVztBQUFBO0FBRTNCOzs7QUNoSkEsTUFBTSxrQkFBa0IsYUFBYTtBQUFBLEVBQ25DLFdBQVcsQ0FBQyxTQUFTLFFBQVEsUUFBUSxTQUFTLGdCQUFnQjtBQUFBLElBQzVELE1BQU07QUFBQSxJQUNOLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssaUJBQWlCO0FBQUEsSUFDdEIsS0FBSyxTQUFTLEVBQUUsT0FBTztBQUFBO0FBQUEsVUFFakIsY0FBYztBQUFBLEVBRXRCO0FBQUEsRUFDQSxRQUFRLEdBQUc7QUFBQSxJQUNULE9BQU8sS0FBSyxLQUFLLFFBQVEsV0FBVyxLQUFLLE9BQU8sQ0FBQyxHQUFHLFFBQVEsS0FBSyxPQUFPLE9BQU87QUFBQTtBQUFBLEVBRWpGLFNBQVMsQ0FBQyxRQUFRLGFBQWE7QUFBQSxJQUM3QixPQUFPLGNBQWMsS0FBSyxlQUFlLE1BQU0sSUFBSTtBQUFBO0FBQUEsRUFFckQsUUFBUSxHQUFHO0FBQUEsSUFDVCxPQUFPO0FBQUE7QUFBQSxFQUdULHFCQUFxQixHQUFHO0FBQUEsSUFDdEIsT0FBTztBQUFBO0FBRVg7OztBQ2JBLE1BQU0sbUJBQW1CO0FBQUEsRUFDdkIsV0FBVyxDQUFDLFlBQVksU0FBUyxTQUFTLFFBQVE7QUFBQSxJQUNoRCxLQUFLLGFBQWE7QUFBQSxJQUNsQixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxJQUFJLFNBQVM7QUFBQSxNQUNoQixRQUFRLE9BQU87QUFBQSxNQUNmLFlBQVksT0FBTztBQUFBLE1BQ25CLGVBQWUsT0FBTztBQUFBLElBQ3hCLElBQUk7QUFBQSxNQUNGLFFBQWE7QUFBQSxNQUNiLFlBQVksQ0FBQztBQUFBLE1BQ2IsZUFBZSxDQUFDO0FBQUEsSUFDbEI7QUFBQSxJQUNBLEtBQUssUUFBUSxDQUFDO0FBQUEsSUFDZCxNQUFNLFFBQVEsS0FBSztBQUFBLElBQ25CLElBQUksS0FBSyxFQUFFLFFBQVE7QUFBQSxNQUNqQixZQUFZLFdBQVcsWUFBWSxPQUFPLFFBQVEsS0FBSyxFQUFFLE1BQU0sR0FBRztBQUFBLFFBQ2hFLE1BQU0sYUFBYSxJQUFJLHVCQUNyQixZQUNBLE9BQU8sWUFDUCxLQUFLLEVBQUUsUUFDUCxLQUFLLEVBQUUsZUFDUCxPQUFPLFdBQVcsWUFDbEIsU0FDQSxTQUNBLE9BQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsS0FBSyxTQUFTLEVBQUUsWUFBWSxPQUFPLFlBQVksR0FDN0M7QUFBQTtBQUFBLFVBRUksY0FBYztBQUFBLEVBQ3RCO0FBQUEsRUFpQ0EsUUFBUSxDQUFDLE9BQU8sY0FBYztBQUFBLElBQzVCLE1BQU0sUUFBTztBQUFBLElBQ2IsTUFBTSxLQUFLLENBQUMsT0FBTztBQUFBLE1BQ2pCLElBQUksT0FBTyxPQUFPLFlBQVk7QUFBQSxRQUM1QixLQUFLLEdBQUcsSUFBSSxhQUFhLE1BQUssT0FBTyxDQUFDO0FBQUEsTUFDeEM7QUFBQSxNQUNBLE9BQU8sSUFBSSxNQUNULElBQUksYUFDRixHQUFHLE9BQU8sR0FDVixjQUFjLHVCQUF1QixLQUFLLEdBQUcsa0JBQWtCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFDMUUsT0FDQSxJQUNGLEdBQ0EsSUFBSSxzQkFBc0IsRUFBRSxPQUFPLG9CQUFvQixTQUFTLGFBQWEsUUFBUSxDQUFDLENBQ3hGO0FBQUE7QUFBQSxJQUVGLE9BQU8sRUFBRSxHQUFHO0FBQUE7QUFBQSxFQUVkLE1BQU0sQ0FBQyxRQUFRLFNBQVM7QUFBQSxJQUN0QixPQUFPLElBQUksbUJBQW1CLEVBQUUsUUFBUSxTQUFTLFNBQVMsS0FBSyxRQUFRLENBQUM7QUFBQTtBQUFBLEVBcUIxRSxJQUFJLElBQUksU0FBUztBQUFBLElBQ2YsTUFBTSxRQUFPO0FBQUEsSUFDYixTQUFTLE1BQU0sQ0FBQyxRQUFRO0FBQUEsTUFDdEIsT0FBTyxJQUFJLG9CQUFvQjtBQUFBLFFBQzdCLFFBQVEsVUFBZTtBQUFBLFFBQ3ZCLFNBQVMsTUFBSztBQUFBLFFBQ2QsU0FBUyxNQUFLO0FBQUEsUUFDZCxVQUFVO0FBQUEsTUFDWixDQUFDO0FBQUE7QUFBQSxJQUVILFNBQVMsY0FBYyxDQUFDLFFBQVE7QUFBQSxNQUM5QixPQUFPLElBQUksb0JBQW9CO0FBQUEsUUFDN0IsUUFBUSxVQUFlO0FBQUEsUUFDdkIsU0FBUyxNQUFLO0FBQUEsUUFDZCxTQUFTLE1BQUs7QUFBQSxRQUNkLFVBQVU7QUFBQSxRQUNWLFVBQVU7QUFBQSxNQUNaLENBQUM7QUFBQTtBQUFBLElBRUgsU0FBUyxNQUFNLENBQUMsT0FBTztBQUFBLE1BQ3JCLE9BQU8sSUFBSSxvQkFBb0IsT0FBTyxNQUFLLFNBQVMsTUFBSyxTQUFTLE9BQU87QUFBQTtBQUFBLElBRTNFLFNBQVMsTUFBTSxDQUFDLE1BQU07QUFBQSxNQUNwQixPQUFPLElBQUksb0JBQW9CLE1BQU0sTUFBSyxTQUFTLE1BQUssU0FBUyxPQUFPO0FBQUE7QUFBQSxJQUUxRSxTQUFTLE9BQU8sQ0FBQyxNQUFNO0FBQUEsTUFDckIsT0FBTyxJQUFJLGlCQUFpQixNQUFNLE1BQUssU0FBUyxNQUFLLFNBQVMsT0FBTztBQUFBO0FBQUEsSUFFdkUsT0FBTyxFQUFFLFFBQVEsZ0JBQWdCLFFBQVEsUUFBUSxRQUFRLFFBQVE7QUFBQTtBQUFBLEVBRW5FLE1BQU0sQ0FBQyxRQUFRO0FBQUEsSUFDYixPQUFPLElBQUksb0JBQW9CLEVBQUUsUUFBUSxVQUFlLFdBQUcsU0FBUyxLQUFLLFNBQVMsU0FBUyxLQUFLLFFBQVEsQ0FBQztBQUFBO0FBQUEsRUFFM0csY0FBYyxDQUFDLFFBQVE7QUFBQSxJQUNyQixPQUFPLElBQUksb0JBQW9CO0FBQUEsTUFDN0IsUUFBUSxVQUFlO0FBQUEsTUFDdkIsU0FBUyxLQUFLO0FBQUEsTUFDZCxTQUFTLEtBQUs7QUFBQSxNQUNkLFVBQVU7QUFBQSxJQUNaLENBQUM7QUFBQTtBQUFBLEVBNkJILE1BQU0sQ0FBQyxPQUFPO0FBQUEsSUFDWixPQUFPLElBQUksb0JBQW9CLE9BQU8sS0FBSyxTQUFTLEtBQUssT0FBTztBQUFBO0FBQUEsRUFFbEU7QUFBQSxFQXlCQSxNQUFNLENBQUMsTUFBTTtBQUFBLElBQ1gsT0FBTyxJQUFJLG9CQUFvQixNQUFNLEtBQUssU0FBUyxLQUFLLE9BQU87QUFBQTtBQUFBLEVBMEJqRSxNQUFNLENBQUMsTUFBTTtBQUFBLElBQ1gsT0FBTyxJQUFJLGlCQUFpQixNQUFNLEtBQUssU0FBUyxLQUFLLE9BQU87QUFBQTtBQUFBLEVBRTlELEdBQUcsQ0FBQyxPQUFPO0FBQUEsSUFDVCxNQUFNLFNBQVMsT0FBTyxVQUFVLFdBQVcsSUFBSSxJQUFJLEtBQUssSUFBSSxNQUFNLE9BQU87QUFBQSxJQUN6RSxJQUFJLEtBQUssZUFBZSxTQUFTO0FBQUEsTUFDL0IsT0FBTyxJQUFJLFVBQ1QsWUFBWSxLQUFLLFFBQVEsSUFBSSxNQUFNLEdBQ25DLE1BQU0sUUFDTixPQUNBLEtBQUssU0FDTCxLQUFLLFFBQVEsa0NBQWtDLEtBQUssS0FBSyxPQUFPLENBQ2xFO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTyxLQUFLLFFBQVEsSUFBSSxNQUFNO0FBQUE7QUFBQSxFQUVoQyxHQUFHLENBQUMsT0FBTztBQUFBLElBQ1QsTUFBTSxTQUFTLE9BQU8sVUFBVSxXQUFXLElBQUksSUFBSSxLQUFLLElBQUksTUFBTSxPQUFPO0FBQUEsSUFDekUsSUFBSSxLQUFLLGVBQWUsU0FBUztBQUFBLE1BQy9CLE9BQU8sSUFBSSxVQUNULFlBQVksS0FBSyxRQUFRLElBQUksTUFBTSxHQUNuQyxNQUFNLFFBQ04sT0FDQSxLQUFLLFNBQ0wsS0FBSyxRQUFRLGtDQUFrQyxLQUFLLEtBQUssT0FBTyxDQUNsRTtBQUFBLElBQ0Y7QUFBQSxJQUNBLE9BQU8sS0FBSyxRQUFRLElBQUksTUFBTTtBQUFBO0FBQUEsRUFFaEMsR0FBRyxDQUFDLE9BQU87QUFBQSxJQUNULE1BQU0sU0FBUyxPQUFPLFVBQVUsV0FBVyxJQUFJLElBQUksS0FBSyxJQUFJLE1BQU0sT0FBTztBQUFBLElBQ3pFLElBQUksS0FBSyxlQUFlLFNBQVM7QUFBQSxNQUMvQixPQUFPLElBQUksVUFDVCxZQUFZLEtBQUssUUFBUSxJQUFJLE1BQU0sR0FDbkMsTUFBTSxRQUNOLE9BQ0EsS0FBSyxTQUNMLEtBQUssUUFBUSxrQ0FBa0MsS0FBSyxLQUFLLE9BQU8sQ0FDbEU7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPLEtBQUssUUFBUSxJQUFJLE1BQU07QUFBQTtBQUFBLEVBRWhDLE1BQU0sQ0FBQyxPQUFPO0FBQUEsSUFDWixNQUFNLFNBQVMsT0FBTyxVQUFVLFdBQVcsSUFBSSxJQUFJLEtBQUssSUFBSSxNQUFNLE9BQU87QUFBQSxJQUN6RSxJQUFJLEtBQUssZUFBZSxTQUFTO0FBQUEsTUFDL0IsT0FBTyxJQUFJLFVBQ1QsWUFBWSxLQUFLLFFBQVEsT0FBTyxNQUFNLEdBQ3RDLE1BQU0sUUFDTixVQUNBLEtBQUssU0FDTCxLQUFLLFFBQVEscUNBQXFDLEtBQUssS0FBSyxPQUFPLENBQ3JFO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTyxLQUFLLFFBQVEsT0FBTyxNQUFNO0FBQUE7QUFBQSxFQUVuQyxXQUFXLENBQUMsYUFBYSxRQUFRO0FBQUEsSUFDL0IsT0FBTyxLQUFLLFFBQVEsWUFBWSxhQUFhLE1BQU07QUFBQTtBQUV2RDs7O0FDN1NBLE1BQU0sTUFBTTtBQUFBLFVBQ0YsY0FBYztBQUN4QjtBQUFBO0FBQ0EsTUFBTSxrQkFBa0IsTUFBTTtBQUFBLEVBQzVCLFFBQVEsR0FBRztBQUFBLElBQ1QsT0FBTztBQUFBO0FBQUEsVUFFRCxjQUFjO0FBQUEsT0FDaEIsSUFBRyxDQUFDLE1BQU07QUFBQSxJQUNkO0FBQUE7QUFBQSxPQUVJLElBQUcsQ0FBQyxjQUFjLFdBQVcsU0FBUyxTQUFTO0FBQUEsT0FFL0MsU0FBUSxDQUFDLFNBQVM7QUFFMUI7QUFDQSxlQUFlLFNBQVMsQ0FBQyxNQUFLLFFBQVE7QUFBQSxFQUNwQyxNQUFNLGFBQWEsR0FBRyxRQUFPLEtBQUssVUFBVSxNQUFNO0FBQUEsRUFDbEQsTUFBTSxVQUFVLElBQUk7QUFBQSxFQUNwQixNQUFNLE9BQU8sUUFBUSxPQUFPLFVBQVU7QUFBQSxFQUN0QyxNQUFNLGFBQWEsTUFBTSxPQUFPLE9BQU8sT0FBTyxXQUFXLElBQUk7QUFBQSxFQUM3RCxNQUFNLFlBQVksQ0FBQyxHQUFHLElBQUksV0FBVyxVQUFVLENBQUM7QUFBQSxFQUNoRCxNQUFNLFVBQVUsVUFBVSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLFNBQVMsR0FBRyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFBQSxFQUM3RSxPQUFPO0FBQUE7OztBQ25CVCxNQUFNLDBCQUEwQixhQUFhO0FBQUEsRUFDM0MsV0FBVyxDQUFDLFVBQVU7QUFBQSxJQUNwQixNQUFNO0FBQUEsSUFDTixLQUFLLFdBQVc7QUFBQTtBQUFBLFVBRVYsY0FBYztBQUFBLE9BQ2hCLFFBQU8sR0FBRztBQUFBLElBQ2QsT0FBTyxLQUFLLFNBQVM7QUFBQTtBQUFBLEVBRXZCLElBQUksR0FBRztBQUFBLElBQ0wsT0FBTyxLQUFLLFNBQVM7QUFBQTtBQUV6QjtBQUFBO0FBQ0EsTUFBTSxvQkFBb0I7QUFBQSxFQUN4QixXQUFXLENBQUMsTUFBTSxlQUFlLE9BQU8sT0FBTyxlQUFlLGFBQWE7QUFBQSxJQUN6RSxLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssZ0JBQWdCO0FBQUEsSUFDckIsS0FBSyxRQUFRO0FBQUEsSUFDYixLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssZ0JBQWdCO0FBQUEsSUFDckIsS0FBSyxjQUFjO0FBQUEsSUFDbkIsSUFBSSxTQUFTLE1BQU0sU0FBUyxNQUFNLFNBQVMsZ0JBQXFCLFdBQUc7QUFBQSxNQUNqRSxLQUFLLGNBQWMsRUFBRSxRQUFRLE1BQU0sZ0JBQWdCLEtBQUs7QUFBQSxJQUMxRDtBQUFBLElBQ0EsS0FBSyxLQUFLLGFBQWEsUUFBUTtBQUFBLE1BQzdCLEtBQUssY0FBbUI7QUFBQSxJQUMxQjtBQUFBO0FBQUEsVUFFTSxjQUFjO0FBQUEsRUFFdEI7QUFBQSxPQUVNLGVBQWMsQ0FBQyxhQUFhLFFBQVEsT0FBTztBQUFBLElBQy9DLElBQUksS0FBSyxVQUFlLGFBQUssR0FBRyxLQUFLLE9BQU8sU0FBUyxLQUFLLEtBQUssa0JBQXVCLFdBQUc7QUFBQSxNQUN2RixJQUFJO0FBQUEsUUFDRixPQUFPLE1BQU0sTUFBTTtBQUFBLFFBQ25CLE9BQU8sR0FBRztBQUFBLFFBQ1YsTUFBTSxJQUFJLGtCQUFrQixhQUFhLFFBQVEsQ0FBQztBQUFBO0FBQUEsSUFFdEQ7QUFBQSxJQUNBLElBQUksS0FBSyxnQkFBZ0IsS0FBSyxZQUFZLFFBQVE7QUFBQSxNQUNoRCxJQUFJO0FBQUEsUUFDRixPQUFPLE1BQU0sTUFBTTtBQUFBLFFBQ25CLE9BQU8sR0FBRztBQUFBLFFBQ1YsTUFBTSxJQUFJLGtCQUFrQixhQUFhLFFBQVEsQ0FBQztBQUFBO0FBQUEsSUFFdEQ7QUFBQSxJQUNBLEtBQUssS0FBSyxjQUFjLFNBQVMsWUFBWSxLQUFLLGNBQWMsU0FBUyxZQUFZLEtBQUssY0FBYyxTQUFTLGFBQWEsS0FBSyxjQUFjLE9BQU8sU0FBUyxHQUFHO0FBQUEsTUFDbEssSUFBSTtBQUFBLFFBQ0YsT0FBTyxPQUFPLE1BQU0sUUFBUSxJQUFJO0FBQUEsVUFDOUIsTUFBTTtBQUFBLFVBQ04sS0FBSyxNQUFNLFNBQVMsRUFBRSxRQUFRLEtBQUssY0FBYyxPQUFPLENBQUM7QUFBQSxRQUMzRCxDQUFDO0FBQUEsUUFDRCxPQUFPO0FBQUEsUUFDUCxPQUFPLEdBQUc7QUFBQSxRQUNWLE1BQU0sSUFBSSxrQkFBa0IsYUFBYSxRQUFRLENBQUM7QUFBQTtBQUFBLElBRXREO0FBQUEsSUFDQSxLQUFLLEtBQUssYUFBYTtBQUFBLE1BQ3JCLElBQUk7QUFBQSxRQUNGLE9BQU8sTUFBTSxNQUFNO0FBQUEsUUFDbkIsT0FBTyxHQUFHO0FBQUEsUUFDVixNQUFNLElBQUksa0JBQWtCLGFBQWEsUUFBUSxDQUFDO0FBQUE7QUFBQSxJQUV0RDtBQUFBLElBQ0EsSUFBSSxLQUFLLGNBQWMsU0FBUyxVQUFVO0FBQUEsTUFDeEMsTUFBTSxZQUFZLE1BQU0sS0FBSyxNQUFNLElBQ2pDLEtBQUssWUFBWSxPQUFRLE1BQU0sVUFBVSxhQUFhLE1BQU0sR0FDNUQsS0FBSyxjQUFjLFFBQ25CLEtBQUssWUFBWSxRQUFhLFdBQzlCLEtBQUssWUFBWSxjQUNuQjtBQUFBLE1BQ0EsSUFBSSxjQUFtQixXQUFHO0FBQUEsUUFDeEIsSUFBSTtBQUFBLFFBQ0osSUFBSTtBQUFBLFVBQ0YsU0FBUyxNQUFNLE1BQU07QUFBQSxVQUNyQixPQUFPLEdBQUc7QUFBQSxVQUNWLE1BQU0sSUFBSSxrQkFBa0IsYUFBYSxRQUFRLENBQUM7QUFBQTtBQUFBLFFBRXBELE1BQU0sS0FBSyxNQUFNLElBQ2YsS0FBSyxZQUFZLE9BQVEsTUFBTSxVQUFVLGFBQWEsTUFBTSxHQUM1RCxRQUVBLEtBQUssWUFBWSxpQkFBaUIsS0FBSyxjQUFjLFNBQVMsQ0FBQyxHQUMvRCxLQUFLLFlBQVksUUFBYSxXQUM5QixLQUFLLFlBQVksTUFDbkI7QUFBQSxRQUNBLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFDQSxPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsSUFBSTtBQUFBLE1BQ0YsT0FBTyxNQUFNLE1BQU07QUFBQSxNQUNuQixPQUFPLEdBQUc7QUFBQSxNQUNWLE1BQU0sSUFBSSxrQkFBa0IsYUFBYSxRQUFRLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFHdEQsUUFBUSxHQUFHO0FBQUEsSUFDVCxPQUFPLEtBQUs7QUFBQTtBQUFBLEVBRWQsWUFBWSxDQUFDLFFBQVEsY0FBYztBQUFBLElBQ2pDLE9BQU87QUFBQTtBQUFBLEVBRVQsWUFBWSxDQUFDLFNBQVMsY0FBYztBQUFBLElBQ2xDLE1BQU0sSUFBSSxNQUFNLGlCQUFpQjtBQUFBO0FBQUEsRUFFbkMsWUFBWSxDQUFDLFNBQVMsY0FBYztBQUFBLElBQ2xDLE1BQU0sSUFBSSxNQUFNLGlCQUFpQjtBQUFBO0FBQUEsRUFFbkMsT0FBTyxDQUFDLG1CQUFtQjtBQUFBLElBQ3pCLElBQUksS0FBSyxTQUFTLFNBQVM7QUFBQSxNQUN6QixPQUFPLEtBQUssS0FBSyxlQUFlLGlCQUFpQjtBQUFBLElBQ25EO0FBQUEsSUFDQSxPQUFPLElBQUksa0JBQWtCLE1BQU0sS0FBSyxLQUFLLGVBQWUsaUJBQWlCLENBQUM7QUFBQTtBQUFBLEVBRWhGLFNBQVMsQ0FBQyxVQUFVLGFBQWE7QUFBQSxJQUMvQixRQUFRLEtBQUs7QUFBQSxXQUNOLE9BQU87QUFBQSxRQUNWLE9BQU8sS0FBSyxhQUFhLFVBQVUsV0FBVztBQUFBLE1BQ2hEO0FBQUEsV0FDSyxPQUFPO0FBQUEsUUFDVixPQUFPLEtBQUssYUFBYSxVQUFVLFdBQVc7QUFBQSxNQUNoRDtBQUFBLFdBQ0ssT0FBTztBQUFBLFFBQ1YsT0FBTyxLQUFLLGFBQWEsVUFBVSxXQUFXO0FBQUEsTUFDaEQ7QUFBQTtBQUFBO0FBR047QUFBQTtBQUNBLE1BQU0sY0FBYztBQUFBLEVBQ2xCLFdBQVcsQ0FBQyxTQUFTO0FBQUEsSUFDbkIsS0FBSyxVQUFVO0FBQUE7QUFBQSxVQUVULGNBQWM7QUFBQSxFQUN0QixtQkFBbUIsQ0FBQyxPQUFPLFFBQVEsZUFBZSx1QkFBdUIsb0JBQW9CLGVBQWUsYUFBYTtBQUFBLElBQ3ZILE9BQU8sS0FBSyxhQUNWLE9BQ0EsUUFDQSxlQUNBLHVCQUNBLG9CQUNBLGVBQ0EsV0FDRjtBQUFBO0FBQUEsRUFFRixHQUFHLENBQUMsT0FBTztBQUFBLElBQ1QsTUFBTSxjQUFjLEtBQUssUUFBUSxXQUFXLEtBQUs7QUFBQSxJQUNqRCxJQUFJO0FBQUEsTUFDRixPQUFPLEtBQUssb0JBQW9CLGFBQWtCLFdBQUcsT0FBTyxLQUFLLEVBQUUsSUFBSTtBQUFBLE1BQ3ZFLE9BQU8sS0FBSztBQUFBLE1BQ1osTUFBTSxJQUFJLGFBQWEsRUFBRSxPQUFPLEtBQUssU0FBUyw0QkFBNEIsWUFBWSxPQUFPLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFJbEcsaUNBQWlDLENBQUMsUUFBUTtBQUFBLElBQ3hDLE9BQU87QUFBQTtBQUFBLEVBRVQsR0FBRyxDQUFDLE9BQU87QUFBQSxJQUNULE9BQU8sS0FBSyxvQkFBb0IsS0FBSyxRQUFRLFdBQVcsS0FBSyxHQUFRLFdBQUcsT0FBTyxLQUFLLEVBQUUsSUFBSTtBQUFBO0FBQUEsRUFHNUYsaUNBQWlDLENBQUMsU0FBUztBQUFBLElBQ3pDLE1BQU0sSUFBSSxNQUFNLGlCQUFpQjtBQUFBO0FBQUEsRUFFbkMsR0FBRyxDQUFDLE9BQU87QUFBQSxJQUNULE9BQU8sS0FBSyxvQkFBb0IsS0FBSyxRQUFRLFdBQVcsS0FBSyxHQUFRLFdBQUcsT0FBTyxLQUFLLEVBQUUsSUFBSTtBQUFBO0FBQUEsRUFHNUYsaUNBQWlDLENBQUMsU0FBUztBQUFBLElBQ3pDLE1BQU0sSUFBSSxNQUFNLGlCQUFpQjtBQUFBO0FBQUEsRUFFbkMsTUFBTSxDQUFDLE9BQU87QUFBQSxJQUNaLE9BQU8sS0FBSyxvQkFBb0IsS0FBSyxRQUFRLFdBQVcsS0FBSyxHQUFRLFdBQUcsT0FBTyxLQUFLLEVBQUUsT0FBTztBQUFBO0FBQUEsT0FFekYsTUFBSyxDQUFDLE1BQUs7QUFBQSxJQUNmLE1BQU0sU0FBUyxNQUFNLEtBQUssT0FBTyxJQUFHO0FBQUEsSUFDcEMsT0FBTyxPQUFPLEdBQUc7QUFBQTtBQUFBLEVBR25CLG9DQUFvQyxDQUFDLFNBQVM7QUFBQSxJQUM1QyxNQUFNLElBQUksTUFBTSxpQkFBaUI7QUFBQTtBQUVyQztBQUFBO0FBQ0EsTUFBTSwwQkFBMEIsbUJBQW1CO0FBQUEsRUFDakQsV0FBVyxDQUFDLFlBQVksU0FBUyxTQUFTLFFBQVEsY0FBYyxHQUFHO0FBQUEsSUFDakUsTUFBTSxZQUFZLFNBQVMsU0FBUyxNQUFNO0FBQUEsSUFDMUMsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLGNBQWM7QUFBQTtBQUFBLFVBRWIsY0FBYztBQUFBLEVBQ3RCLFFBQVEsR0FBRztBQUFBLElBQ1QsTUFBTSxJQUFJO0FBQUE7QUFFZDs7O0FDck1BLE1BQU0saUJBQWlCO0FBQUEsVUFDYixjQUFjO0FBQUEsRUFDdEIsS0FBSyxDQUFDLFNBQVM7QUFBQSxJQUNiLFFBQVEsSUFBSSxPQUFPO0FBQUE7QUFFdkI7QUFBQTtBQUNBLE1BQU0sY0FBYztBQUFBLFVBQ1YsY0FBYztBQUFBLEVBQ3RCO0FBQUEsRUFDQSxXQUFXLENBQUMsUUFBUTtBQUFBLElBQ2xCLEtBQUssU0FBUyxRQUFRLFVBQVUsSUFBSTtBQUFBO0FBQUEsRUFFdEMsUUFBUSxDQUFDLE9BQU8sUUFBUTtBQUFBLElBQ3RCLE1BQU0sb0JBQW9CLE9BQU8sSUFBSSxDQUFDLE1BQU07QUFBQSxNQUMxQyxJQUFJO0FBQUEsUUFDRixPQUFPLEtBQUssVUFBVSxDQUFDO0FBQUEsUUFDdkIsTUFBTTtBQUFBLFFBQ04sT0FBTyxPQUFPLENBQUM7QUFBQTtBQUFBLEtBRWxCO0FBQUEsSUFDRCxNQUFNLFlBQVksa0JBQWtCLFNBQVMsZ0JBQWdCLGtCQUFrQixLQUFLLElBQUksT0FBTztBQUFBLElBQy9GLEtBQUssT0FBTyxNQUFNLFVBQVUsUUFBUSxXQUFXO0FBQUE7QUFFbkQ7QUFBQTtBQUNBLE1BQU0sV0FBVztBQUFBLFVBQ1AsY0FBYztBQUFBLEVBQ3RCLFFBQVEsR0FBRztBQUViOzs7QUN4QkEsSUFBSSxpQkFBaUIsQ0FBQztBQUN0QixTQUFTLGdCQUFnQjtBQUFBLEVBQ3hCLFlBQVksTUFBTTtBQUFBLEVBQ2xCLHFCQUFxQixNQUFNO0FBQUEsRUFDM0IseUJBQXlCLE1BQU07QUFBQSxFQUMvQixrQ0FBa0MsTUFBTTtBQUFBLEVBQ3hDLGNBQWMsTUFBTTtBQUFBLEVBQ3BCLHVCQUF1QixNQUFNO0FBQUEsRUFDN0IsZ0JBQWdCLE1BQU07QUFBQSxFQUN0QixRQUFRLE1BQU07QUFBQSxFQUNkLE9BQU8sTUFBTTtBQUFBLEVBQ2IsZ0JBQWdCLE1BQU07QUFDdkIsQ0FBQztBQUNELElBQU0sU0FBUztBQUFBLEVBQ2QsV0FBVyxRQUFRLFlBQVksRUFBRSxRQUFRO0FBQUEsRUFDekMsV0FBVyxRQUFRLFlBQVk7QUFDaEM7QUFDQSxJQUFNLFFBQVEsWUFBWSxTQUFTO0FBQUEsRUFDbEMsSUFBSSxRQUFRLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxRQUFRO0FBQUEsRUFDNUMsV0FBVyxLQUFLLFlBQVksRUFBRSxPQUFPLEVBQUUsUUFBUTtBQUFBLEVBQy9DLGVBQWUsUUFBUSxnQkFBZ0I7QUFBQSxLQUNwQztBQUNKLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxnQkFBZ0IsRUFBRSxHQUFHLE1BQU0sU0FBUyxHQUFHLE1BQU0sb0JBQW9CLEVBQUUsR0FBRyxNQUFNLGFBQWEsQ0FBQyxDQUFDO0FBQ2hILElBQU0saUJBQWlCLFVBQVUsT0FBTyxHQUFHLEtBQUssWUFBWTtBQUFBLEVBQzNELFlBQVksS0FBSyxVQUFVO0FBQUEsRUFDM0IsTUFBTSxJQUFJLFlBQVk7QUFBQSxJQUNyQixRQUFRLENBQUMsTUFBTSxhQUFhO0FBQUEsSUFDNUIsWUFBWSxDQUFDLFdBQVcsRUFBRTtBQUFBLEVBQzNCLENBQUM7QUFDRixFQUFFO0FBQ0YsSUFBTSxhQUFhLFlBQVksY0FBYztBQUFBLEVBQzVDLElBQUksUUFBUSxJQUFJLEVBQUUsV0FBVyxFQUFFLGVBQWUsS0FBSyxDQUFDO0FBQUEsRUFDcEQsT0FBTyxRQUFRLFFBQVEsRUFBRSxRQUFRO0FBQUEsRUFDakMsUUFBUSxRQUFRLFNBQVMsRUFBRSxRQUFRO0FBQUEsRUFDbkMsTUFBTSxLQUFLLEVBQUUsUUFBUTtBQUFBLEVBQ3JCLGFBQWEsS0FBSyxjQUFjLEVBQUUsUUFBUTtBQUFBLEVBQzFDLFdBQVcsUUFBUSxZQUFZLEVBQUUsUUFBUTtBQUFBLEVBQ3pDLGNBQWMsS0FBSyxlQUFlLEVBQUUsUUFBUTtBQUFBLEtBQ3pDO0FBQ0osR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLGFBQWEsRUFBRSxHQUFHLE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsQ0FBQztBQUMxRixJQUFNLHNCQUFzQixVQUFVLFlBQVksR0FBRyxXQUFXLEVBQUUsTUFBTSxJQUFJLE9BQU87QUFBQSxFQUNsRixRQUFRLENBQUMsV0FBVyxNQUFNO0FBQUEsRUFDMUIsWUFBWSxDQUFDLE1BQU0sRUFBRTtBQUN0QixDQUFDLEVBQUUsRUFBRTtBQUNMLElBQU0saUJBQWlCLFlBQVksa0JBQWtCO0FBQUEsRUFDcEQsSUFBSSxLQUFLLEVBQUUsV0FBVztBQUFBLEVBQ3RCLFNBQVMsS0FBSyxFQUFFLFFBQVE7QUFBQSxFQUN4QixRQUFRLEtBQUssRUFBRSxRQUFRO0FBQUEsRUFDdkIsU0FBUyxLQUFLLEVBQUUsUUFBUTtBQUFBLEtBQ3JCO0FBQ0osQ0FBQztBQUNELElBQU0sZUFBZSxZQUFZLGlCQUFpQjtBQUFBLEVBQ2pELElBQUksUUFBUSxJQUFJLEVBQUUsV0FBVyxFQUFFLGVBQWUsS0FBSyxDQUFDO0FBQUEsRUFDcEQsTUFBTSxLQUFLLE1BQU0sRUFBRSxRQUFRO0FBQUEsRUFDM0IsYUFBYSxLQUFLLGFBQWE7QUFBQSxFQUMvQixrQkFBa0IsS0FBSyxvQkFBb0IsRUFBRSxRQUFRO0FBQUEsRUFDckQsV0FBVyxRQUFRLFlBQVksRUFBRSxRQUFRO0FBQUEsRUFDekMsU0FBUyxRQUFRLFVBQVU7QUFBQSxFQUMzQixRQUFRLEtBQUssVUFBVSxFQUFFLE1BQU07QUFBQSxJQUM5QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRCxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxhQUFhO0FBQUEsRUFDcEMsU0FBUyxLQUFLLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO0FBQUEsRUFDN0MsaUJBQWlCLEtBQUssbUJBQW1CLEVBQUUsT0FBTztBQUFBLEVBQ2xELGlCQUFpQixLQUFLLG1CQUFtQjtBQUFBLEVBQ3pDLFlBQVksS0FBSyxhQUFhO0FBQUEsRUFDOUIsMkJBQTJCLEtBQUssOEJBQThCO0FBQUEsS0FDM0Q7QUFDSixHQUFHLENBQUMsVUFBVTtBQUFBLEVBQ2IsTUFBTSw4QkFBOEIsRUFBRSxHQUFHLE1BQU0sZ0JBQWdCO0FBQUEsRUFDL0QsTUFBTSxrQkFBa0IsRUFBRSxHQUFHLE1BQU0sTUFBTTtBQUFBLEVBQ3pDLE1BQU0sNkJBQTZCLEVBQUUsR0FBRyxNQUFNLGVBQWU7QUFDOUQsQ0FBQztBQUNELElBQU0sMEJBQTBCLFlBQVksNkJBQTZCO0FBQUEsRUFDeEUsSUFBSSxRQUFRLElBQUksRUFBRSxXQUFXLEVBQUUsZUFBZSxLQUFLLENBQUM7QUFBQSxFQUNwRCxTQUFTLFFBQVEsVUFBVSxFQUFFLFFBQVEsRUFBRSxXQUFXLE1BQU0sYUFBYSxJQUFJLEVBQUUsVUFBVSxVQUFVLENBQUM7QUFBQSxFQUNoRyxhQUFhLFFBQVEsY0FBYyxFQUFFLFFBQVEsRUFBRSxXQUFXLE1BQU0sV0FBVyxJQUFJLEVBQUUsVUFBVSxVQUFVLENBQUM7QUFBQSxFQUN0RyxXQUFXLEtBQUssWUFBWSxFQUFFLFFBQVE7QUFBQSxFQUN0QyxNQUFNLEtBQUssUUFBUSxFQUFFLE1BQU07QUFBQSxJQUMxQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRCxFQUFFLENBQUMsRUFBRSxRQUFRO0FBQUEsRUFDYixVQUFVLFFBQVEsV0FBVyxFQUFFLFFBQVE7QUFBQSxLQUNwQztBQUNKLEdBQUcsQ0FBQyxVQUFVO0FBQUEsRUFDYixNQUFNLDBCQUEwQixFQUFFLEdBQUcsTUFBTSxPQUFPO0FBQUEsRUFDbEQsTUFBTSw4QkFBOEIsRUFBRSxHQUFHLE1BQU0sV0FBVztBQUFBLEVBQzFELE1BQU0sNEJBQTRCLEVBQUUsR0FBRyxNQUFNLFNBQVM7QUFDdkQsQ0FBQztBQUNELElBQU0sd0JBQXdCLFVBQVUsY0FBYyxHQUFHLFlBQVksRUFBRSxjQUFjLEtBQUssdUJBQXVCLEVBQUUsRUFBRTtBQUNySCxJQUFNLG1DQUFtQyxVQUFVLHlCQUF5QixHQUFHLFdBQVc7QUFBQSxFQUN6RixPQUFPLElBQUksY0FBYztBQUFBLElBQ3hCLFFBQVEsQ0FBQyx3QkFBd0IsT0FBTztBQUFBLElBQ3hDLFlBQVksQ0FBQyxhQUFhLEVBQUU7QUFBQSxFQUM3QixDQUFDO0FBQUEsRUFDRCxXQUFXLElBQUksWUFBWTtBQUFBLElBQzFCLFFBQVEsQ0FBQyx3QkFBd0IsV0FBVztBQUFBLElBQzVDLFlBQVksQ0FBQyxXQUFXLEVBQUU7QUFBQSxFQUMzQixDQUFDO0FBQ0YsRUFBRTs7O0FDNUdGLElBQU0sWUFBWSxRQUFRLElBQUksaUJBQWlCO0FBQy9DLElBQU0sZ0JBQWdCLFFBQVEsSUFBSSxxQkFBcUI7QUFDdkQsSUFBTSxlQUFlLFFBQVEsSUFBSSxvQkFBb0I7QUFDckQsSUFBTSxhQUFhLFFBQVEsSUFBSSxrQkFBa0I7QUFDakQsSUFBTSxVQUFVO0FBQUEsRUFDZixXQUFXO0FBQUEsRUFDWCxlQUFlO0FBQUEsRUFDZixjQUFjO0FBQUEsRUFDZCxZQUFZO0FBQ2I7OztBQ1ZPLE1BQU0sMEJBQTBCLE1BQU07QUFDN0M7QUFDQSxrQkFBa0IsVUFBVSxPQUFPO0FBQ25DLFNBQVMsZ0JBQWdCLENBQUMsS0FBSztBQUFBLEVBQzNCLE9BQU8sbUJBQW1CLEtBQUssR0FBRyxFQUFFLFFBQVEsUUFBUSxDQUFDLEdBQUcsTUFBTTtBQUFBLElBQzFELElBQUksT0FBTyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLFlBQVk7QUFBQSxJQUNwRCxJQUFJLEtBQUssU0FBUyxHQUFHO0FBQUEsTUFDakIsT0FBTyxNQUFNO0FBQUEsSUFDakI7QUFBQSxJQUNBLE9BQU8sTUFBTTtBQUFBLEdBQ2hCLENBQUM7QUFBQTtBQUVOLFNBQVMsZUFBZSxDQUFDLEtBQUs7QUFBQSxFQUMxQixJQUFJLFNBQVMsSUFBSSxRQUFRLE1BQU0sR0FBRyxFQUFFLFFBQVEsTUFBTSxHQUFHO0FBQUEsRUFDckQsUUFBUSxPQUFPLFNBQVM7QUFBQSxTQUNmO0FBQUEsTUFDRDtBQUFBLFNBQ0M7QUFBQSxNQUNELFVBQVU7QUFBQSxNQUNWO0FBQUEsU0FDQztBQUFBLE1BQ0QsVUFBVTtBQUFBLE1BQ1Y7QUFBQTtBQUFBLE1BRUEsTUFBTSxJQUFJLE1BQU0sNENBQTRDO0FBQUE7QUFBQSxFQUVwRSxJQUFJO0FBQUEsSUFDQSxPQUFPLGlCQUFpQixNQUFNO0FBQUEsSUFFbEMsT0FBTyxLQUFLO0FBQUEsSUFDUixPQUFPLEtBQUssTUFBTTtBQUFBO0FBQUE7QUFHbkIsU0FBUyxTQUFTLENBQUMsT0FBTyxVQUFTO0FBQUEsRUFDdEMsSUFBSSxPQUFPLFVBQVUsVUFBVTtBQUFBLElBQzNCLE1BQU0sSUFBSSxrQkFBa0IsMkNBQTJDO0FBQUEsRUFDM0U7QUFBQSxFQUNBLGFBQVksV0FBVSxDQUFDO0FBQUEsRUFDdkIsTUFBTSxNQUFNLFNBQVEsV0FBVyxPQUFPLElBQUk7QUFBQSxFQUMxQyxNQUFNLE9BQU8sTUFBTSxNQUFNLEdBQUcsRUFBRTtBQUFBLEVBQzlCLElBQUksT0FBTyxTQUFTLFVBQVU7QUFBQSxJQUMxQixNQUFNLElBQUksa0JBQWtCLDBDQUEwQyxNQUFNLEdBQUc7QUFBQSxFQUNuRjtBQUFBLEVBQ0EsSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLElBQ0EsVUFBVSxnQkFBZ0IsSUFBSTtBQUFBLElBRWxDLE9BQU8sR0FBRztBQUFBLElBQ04sTUFBTSxJQUFJLGtCQUFrQixxREFBcUQsTUFBTSxNQUFNLEVBQUUsVUFBVTtBQUFBO0FBQUEsRUFFN0csSUFBSTtBQUFBLElBQ0EsT0FBTyxLQUFLLE1BQU0sT0FBTztBQUFBLElBRTdCLE9BQU8sR0FBRztBQUFBLElBQ04sTUFBTSxJQUFJLGtCQUFrQixtREFBbUQsTUFBTSxNQUFNLEVBQUUsVUFBVTtBQUFBO0FBQUE7O0FDeUgvRyxJQUFJO0FBQUEsQ0FDSCxRQUFTLENBQUMsa0JBQWlCO0FBQUEsRUFDeEIsaUJBQWdCLGlCQUFnQixhQUFhLEtBQUs7QUFBQSxFQUNsRCxpQkFBZ0IsaUJBQWdCLFVBQVUsS0FBSztBQUFBLEdBQ2hELG9CQUFvQixrQkFBa0IsQ0FBQyxFQUFFO0FBQzVDLElBQUk7QUFBQSxDQUNILFFBQVMsQ0FBQyxrQkFBaUI7QUFBQSxFQUN4QixpQkFBZ0IsaUJBQWdCLGNBQWMsS0FBSztBQUFBLEVBQ25ELGlCQUFnQixpQkFBZ0IsWUFBWSxLQUFLO0FBQUEsR0FDbEQsb0JBQW9CLGtCQUFrQixDQUFDLEVBQUU7O0FDL0tyQyxTQUFTLHdCQUF3QixDQUFDLE9BQU87QUFBQSxFQUM1QyxPQUFPLHNCQUFzQixPQUFPLG1CQUFtQixpQkFBZ0IsSUFBSTtBQUFBO0FBRS9FLFNBQVMscUJBQXFCLENBQUMsT0FBTyxVQUFVLFNBQVM7QUFBQSxFQUNyRCxJQUFJLFNBQVM7QUFBQSxFQUNiLFNBQVMsSUFBSSxFQUFHLElBQUksTUFBTSxZQUFZLEtBQUssR0FBRztBQUFBLElBQzFDLElBQUksU0FBUztBQUFBLElBQ2IsSUFBSSxnQkFBZ0I7QUFBQSxJQUNwQixTQUFTLElBQUksRUFBRyxJQUFJLEtBQUssSUFBSSxJQUFJLE1BQU0sWUFBWSxLQUFLO0FBQUEsTUFDcEQsU0FBVSxVQUFVLElBQUssTUFBTSxJQUFJO0FBQUEsTUFDbkMsaUJBQWlCO0FBQUEsSUFDckI7QUFBQSxJQUNBLFNBQVMsSUFBSSxFQUFHLElBQUksR0FBRyxLQUFLO0FBQUEsTUFDeEIsSUFBSSxpQkFBaUIsR0FBRztBQUFBLFFBQ3BCLFVBQVUsU0FBVSxVQUFXLGdCQUFnQixJQUFNO0FBQUEsUUFDckQsaUJBQWlCO0FBQUEsTUFDckIsRUFDSyxTQUFJLGdCQUFnQixHQUFHO0FBQUEsUUFDeEIsVUFBVSxTQUFVLFVBQVcsSUFBSSxnQkFBa0I7QUFBQSxRQUNyRCxnQkFBZ0I7QUFBQSxNQUNwQixFQUNLLFNBQUksWUFBWSxpQkFBZ0IsU0FBUztBQUFBLFFBQzFDLFVBQVU7QUFBQSxNQUNkO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUNBLE9BQU87QUFBQTtBQUdYLElBQU0sb0JBQW9CO0FBMkQxQixJQUFJO0FBQUEsQ0FDSCxRQUFTLENBQUMsa0JBQWlCO0FBQUEsRUFDeEIsaUJBQWdCLGlCQUFnQixhQUFhLEtBQUs7QUFBQSxFQUNsRCxpQkFBZ0IsaUJBQWdCLFVBQVUsS0FBSztBQUFBLEdBQ2hELHFCQUFvQixtQkFBa0IsQ0FBQyxFQUFFO0FBQzVDLElBQUk7QUFBQSxDQUNILFFBQVMsQ0FBQyxrQkFBaUI7QUFBQSxFQUN4QixpQkFBZ0IsaUJBQWdCLGNBQWMsS0FBSztBQUFBLEVBQ25ELGlCQUFnQixpQkFBZ0IsWUFBWSxLQUFLO0FBQUEsR0FDbEQscUJBQW9CLG1CQUFrQixDQUFDLEVBQUU7O0FDdEc1QztBQUNBO0FBR0EsSUFBSSxlQUFlLENBQUM7QUFDcEIsU0FBUyxjQUFjO0FBQUEsRUFDdEIsc0JBQXNCLE1BQU07QUFBQSxFQUM1Qix3QkFBd0IsTUFBTTtBQUFBLEVBQzlCLFNBQVMsTUFBTTtBQUFBLEVBQ2YsMkJBQTJCLE1BQU07QUFBQSxFQUNqQyxlQUFlLE1BQU07QUFDdEIsQ0FBQztBQUNELFNBQVMsYUFBYSxHQUFHO0FBQUEsRUFDeEIsTUFBTSxlQUFlLElBQUksV0FBVyxFQUFFO0FBQUEsRUFDdEMsT0FBTyxnQkFBZ0IsWUFBWTtBQUFBLEVBQ25DLE9BQU8seUJBQXlCLFlBQVk7QUFBQTtBQUU3QyxlQUFlLHNCQUFzQixDQUFDLFNBQVMsY0FBYztBQUFBLEVBQzVELE1BQU0sUUFBUSxjQUFjO0FBQUEsRUFDNUIsTUFBTSxNQUFNLElBQUksSUFBSSxpREFBaUQ7QUFBQSxFQUNyRSxJQUFJLGFBQWEsSUFBSSxpQkFBaUIsTUFBTTtBQUFBLEVBQzVDLElBQUksYUFBYSxJQUFJLGdCQUFnQixRQUFRLFlBQVk7QUFBQSxFQUN6RCxJQUFJLGFBQWEsSUFBSSxhQUFhLFFBQVEsU0FBUztBQUFBLEVBQ25ELElBQUksYUFBYSxJQUFJLFNBQVMsS0FBSztBQUFBLEVBQ25DLElBQUksYUFBYSxJQUFJLFNBQVMsTUFBTSxRQUFRLE1BQU0sSUFBSSxPQUFPLEtBQUssR0FBRyxJQUFJLE1BQU07QUFBQSxFQUMvRSxPQUFPO0FBQUEsSUFDTjtBQUFBLElBQ0E7QUFBQSxFQUNEO0FBQUE7QUFFRCxlQUFlLHlCQUF5QixDQUFDLE1BQU07QUFBQSxFQUM5QyxJQUFJO0FBQUEsSUFDSCxNQUFNLFdBQVcsTUFBTSxNQUFNLDhDQUE4QztBQUFBLE1BQzFFLFFBQVE7QUFBQSxNQUNSLFNBQVM7QUFBQSxRQUNSLGdCQUFnQjtBQUFBLFFBQ2hCLGVBQWUsU0FBUyxPQUFPLEtBQUssR0FBRyxRQUFRLGFBQWEsUUFBUSxlQUFlLEVBQUUsU0FBUyxRQUFRO0FBQUEsTUFDdkc7QUFBQSxNQUNBLE1BQU0sSUFBSSxnQkFBZ0I7QUFBQSxRQUN6QixZQUFZO0FBQUEsUUFDWjtBQUFBLE1BQ0QsQ0FBQztBQUFBLElBQ0YsQ0FBQztBQUFBLElBQ0QsT0FBTyxNQUFNLFNBQVMsS0FBSztBQUFBLElBQzFCLE9BQU8sT0FBTztBQUFBLElBQ2YsUUFBUSxNQUFNLDZDQUE2QyxLQUFLO0FBQUEsSUFDaEUsTUFBTSxHQUFHO0FBQUE7QUFBQTtBQUdYLElBQUk7QUFDSixlQUFlLGFBQWEsQ0FBQyxPQUFPO0FBQUEsRUFDbkMsS0FBSztBQUFBLElBQWtCLElBQUk7QUFBQSxNQUMxQixNQUFNLFVBQVUsT0FBTyxNQUFNLE1BQU0sd0NBQXdDLEdBQUcsS0FBSztBQUFBLE1BQ25GLG1CQUFtQiwwQkFBUyxRQUFRLEtBQUssRUFBRTtBQUFBLE1BQzFDLE9BQU8sS0FBSztBQUFBLE1BQ2IsUUFBUSxNQUFNLHNDQUFzQyxHQUFHO0FBQUE7QUFBQSxFQUV4RCxJQUFJO0FBQUEsSUFDSCxNQUFNLFVBQVUsNEJBQUksT0FBTyxPQUFPLGdCQUFnQjtBQUFBLElBQ2xELE9BQU87QUFBQSxJQUNOLE9BQU8sS0FBSztBQUFBLElBQ2IsUUFBUSxNQUFNLGdDQUFnQyxHQUFHO0FBQUEsSUFDakQsT0FBTztBQUFBO0FBQUE7QUFHVCxlQUFlLE9BQU8sR0FBRyxpQkFBaUIsUUFBUTtBQUFBLEVBQ2pELE1BQU0sU0FBUztBQUFBLElBQ2QsWUFBWTtBQUFBLElBQ1o7QUFBQSxJQUNBLE9BQU87QUFBQSxFQUNSO0FBQUEsRUFDQSxJQUFJO0FBQUEsSUFBUSxPQUFPLFdBQVcsTUFBTSxRQUFRLE1BQU0sSUFBSSxPQUFPLEtBQUssR0FBRyxJQUFJO0FBQUEsRUFDekUsTUFBTSxXQUFXLE1BQU0sTUFBTSw4Q0FBOEM7QUFBQSxJQUMxRSxRQUFRO0FBQUEsSUFDUixTQUFTO0FBQUEsTUFDUixnQkFBZ0I7QUFBQSxNQUNoQixlQUFlLFNBQVMsT0FBTyxLQUFLLEdBQUcsUUFBUSxhQUFhLFFBQVEsZUFBZSxFQUFFLFNBQVMsUUFBUTtBQUFBLElBQ3ZHO0FBQUEsSUFDQSxNQUFNLElBQUksZ0JBQWdCLE1BQU07QUFBQSxFQUNqQyxDQUFDO0FBQUEsRUFDRCxPQUFPLE1BQU0sU0FBUyxLQUFLO0FBQUE7QUFFNUIsU0FBUyxvQkFBb0IsQ0FBQyxPQUFPO0FBQUEsRUFDcEMsTUFBTSxVQUFVLFVBQVUsS0FBSztBQUFBLEVBQy9CLE9BQU8sU0FBUyxRQUFRLElBQUksTUFBTSxHQUFHLEVBQUUsRUFBRTtBQUFBOzs7QUNqRjFDLElBQUksa0JBQWtCLE1BQU0saUJBQWdCO0FBQUEsU0FDcEMsYUFBYSxDQUFDLFdBQVc7QUFBQSxJQUMvQix1QkFBdUIsSUFBSSxPQUFTLFVBQVU7QUFBQTtBQUFBLFNBRXhDLFNBQVMsQ0FBQyxXQUFXO0FBQUEsSUFDM0IsTUFBTSxVQUFVLFVBQVUsVUFBVSxXQUFXO0FBQUEsSUFDL0MsT0FBTyxPQUFPLFFBQVEsUUFBUSxXQUFXLENBQUMsUUFBUSxHQUFHLElBQUksUUFBUTtBQUFBO0FBQUEsU0FFM0Qsa0JBQWtCLENBQUMsV0FBVztBQUFBLElBQ3BDLE9BQU8sS0FBSyxVQUFVLFNBQVMsRUFBRSxXQUFXLEtBQUssS0FBSyxTQUFTLFdBQVcsWUFBWTtBQUFBO0FBQUEsU0FFaEYsU0FBUyxDQUFDLFdBQVc7QUFBQSxJQUMzQixPQUFPO0FBQUEsTUFDTixjQUFjLFVBQVU7QUFBQSxNQUN4QixlQUFlLFVBQVU7QUFBQSxNQUN6QixhQUFhLFVBQVUsVUFBVSxRQUFRLElBQUksS0FBSyxJQUFJLEtBQUs7QUFBQSxJQUM1RDtBQUFBO0FBQUEsU0FFTSxRQUFRLENBQUMsV0FBVyxPQUFPO0FBQUEsSUFDakMsT0FBTyxLQUFLLFVBQVUsU0FBUyxFQUFFLFNBQVMsS0FBSztBQUFBO0FBQUEsU0FFekMsWUFBWSxDQUFDLFdBQVcsUUFBUTtBQUFBLElBQ3RDLE1BQU0sTUFBTSxLQUFLLFVBQVUsU0FBUztBQUFBLElBQ3BDLE9BQU8sT0FBTyxNQUFNLENBQUMsVUFBVSxJQUFJLFNBQVMsS0FBSyxDQUFDO0FBQUE7QUFBQSxTQUU1QyxJQUFJLENBQUMsSUFBSTtBQUFBLElBQ2YsTUFBTSxTQUFTLEdBQUcsT0FBTyxFQUFFLEtBQUssVUFBVSxFQUFFLE1BQU0sR0FBRyxXQUFXLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSTtBQUFBLElBQ3RGLE1BQU0sSUFBSSxLQUFLLGlCQUFpQixNQUFNO0FBQUEsSUFDdEMsT0FBTyxJQUFJLEVBQUUsS0FBVTtBQUFBO0FBQUEsU0FFakIsVUFBVSxDQUFDLE1BQU07QUFBQSxJQUN2QixNQUFNLFNBQVMsR0FBRyxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQUUsTUFBTSxHQUFHLFdBQVcsUUFBUSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUk7QUFBQSxJQUN0RixPQUFPLEtBQUssaUJBQWlCLE1BQU07QUFBQTtBQUFBLFNBRTdCLGtCQUFrQixDQUFDLFFBQVEsT0FBTztBQUFBLElBQ3hDLE1BQU0sU0FBUyxHQUFHLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRSxNQUFNLElBQUksR0FBRyxXQUFXLFFBQVEsTUFBTSxHQUFHLEdBQUcsV0FBVyxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSTtBQUFBLElBQ2hJLE1BQU0sSUFBSSxLQUFLLGlCQUFpQixNQUFNO0FBQUEsSUFDdEMsT0FBTyxJQUFJLEVBQUUsS0FBVTtBQUFBO0FBQUEsU0FFakIsVUFBVSxDQUFDLFFBQVEsTUFBTTtBQUFBLElBQy9CLE1BQU0sU0FBUyxHQUFHLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRSxNQUFNLElBQUksR0FBRyxXQUFXLE1BQU0sSUFBSSxHQUFHLEdBQUcsV0FBVyxRQUFRLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSTtBQUFBLElBQzlILE1BQU0sSUFBSSxLQUFLLGlCQUFpQixNQUFNO0FBQUEsSUFDdEMsT0FBTyxJQUFJLEVBQUUsS0FBVTtBQUFBO0FBQUEsU0FFakIsT0FBTyxHQUFHO0FBQUEsSUFDaEIsTUFBTSxTQUFTLEdBQUcsT0FBTyxFQUFFLEtBQUssVUFBVSxFQUFFLElBQUk7QUFBQSxJQUNoRCxPQUFPLEtBQUssaUJBQWlCLE1BQU07QUFBQTtBQUFBLFNBRTdCLE1BQU0sQ0FBQyxPQUFPLE1BQU0sTUFBTSxRQUFRO0FBQUEsSUFDeEMsT0FBTyxLQUFLLEtBQUs7QUFBQSxNQUNoQjtBQUFBLE1BQ0EsUUFBUSxLQUFLO0FBQUEsTUFDYixhQUFhLE9BQU87QUFBQSxNQUNwQiwyQkFBMkIsSUFBSSxLQUFLLE9BQU8sYUFBYSxJQUFHO0FBQUEsTUFDM0QsY0FBYyxPQUFPO0FBQUEsTUFDckI7QUFBQSxNQUNBLDJCQUEyQixJQUFJO0FBQUEsSUFDaEMsQ0FBQztBQUFBO0FBQUEsU0FFSyxnQkFBZ0IsQ0FBQyxPQUFPO0FBQUEsSUFDOUIsS0FBSztBQUFBLE1BQU8sT0FBTyxDQUFDO0FBQUEsSUFDcEIsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUFBLE1BQUcsT0FBTyxNQUFNLElBQUksQ0FBQyxjQUFjO0FBQUEsUUFDekQsT0FBTztBQUFBLFVBQ04sSUFBSSxVQUFVO0FBQUEsVUFDZCxPQUFPLFVBQVU7QUFBQSxVQUNqQixRQUFRLFVBQVU7QUFBQSxVQUNsQixhQUFhLFVBQVU7QUFBQSxVQUN2QixXQUFXLElBQUksS0FBSyxVQUFVLFNBQVM7QUFBQSxVQUN2QyxjQUFjLFVBQVU7QUFBQSxVQUN4QixNQUFNLFVBQVU7QUFBQSxVQUNoQixXQUFXLElBQUksS0FBSyxVQUFVLFNBQVM7QUFBQSxVQUN2QyxXQUFXLElBQUksS0FBSyxVQUFVLFNBQVM7QUFBQSxRQUN4QztBQUFBLE9BQ0E7QUFBQSxJQUNJO0FBQUEsYUFBTyxDQUFDO0FBQUEsUUFDWixJQUFJLE1BQU07QUFBQSxRQUNWLE9BQU8sTUFBTTtBQUFBLFFBQ2IsUUFBUSxNQUFNO0FBQUEsUUFDZCxhQUFhLE1BQU07QUFBQSxRQUNuQixXQUFXLElBQUksS0FBSyxNQUFNLFNBQVM7QUFBQSxRQUNuQyxjQUFjLE1BQU07QUFBQSxRQUNwQixNQUFNLE1BQU07QUFBQSxRQUNaLFdBQVcsSUFBSSxLQUFLLE1BQU0sU0FBUztBQUFBLFFBQ25DLFdBQVcsSUFBSSxLQUFLLE1BQU0sU0FBUztBQUFBLE1BQ3BDLENBQUM7QUFBQTtBQUFBLFNBRUssSUFBSSxDQUFDLFdBQVc7QUFBQSxJQUN0QixHQUFHLE9BQU8sVUFBVSxFQUFFLE9BQU87QUFBQSxNQUM1QixJQUFJLFVBQVU7QUFBQSxNQUNkLE9BQU8sVUFBVTtBQUFBLE1BQ2pCLFFBQVEsVUFBVTtBQUFBLE1BQ2xCLE1BQU0sVUFBVTtBQUFBLE1BQ2hCLGFBQWEsVUFBVTtBQUFBLE1BQ3ZCLFdBQVcsVUFBVSxVQUFVLFFBQVE7QUFBQSxNQUN2QyxjQUFjLFVBQVU7QUFBQSxNQUN4QixXQUFXLEtBQUssSUFBSTtBQUFBLE1BQ3BCLFdBQVcsS0FBSyxJQUFJO0FBQUEsSUFDckIsQ0FBQyxFQUFFLG1CQUFtQjtBQUFBLE1BQ3JCLFFBQVEsV0FBVztBQUFBLE1BQ25CLEtBQUs7QUFBQSxRQUNKLE9BQU8sVUFBVTtBQUFBLFFBQ2pCLFFBQVEsVUFBVTtBQUFBLFFBQ2xCLE1BQU0sVUFBVTtBQUFBLFFBQ2hCLGFBQWEsVUFBVTtBQUFBLFFBQ3ZCLFdBQVcsVUFBVSxVQUFVLFFBQVE7QUFBQSxRQUN2QyxjQUFjLFVBQVU7QUFBQSxRQUN4QixXQUFXLEtBQUssSUFBSTtBQUFBLE1BQ3JCO0FBQUEsSUFDRCxDQUFDLEVBQUUsSUFBSTtBQUFBLElBQ1AsT0FBTyxpQkFBZ0IsbUJBQW1CLFVBQVUsUUFBUSxVQUFVLEtBQUs7QUFBQTtBQUFBLFNBRXJFLE1BQU0sQ0FBQyxXQUFXO0FBQUEsSUFDeEIsR0FBRyxPQUFPLFVBQVUsRUFBRSxNQUFNLEdBQUcsV0FBVyxJQUFJLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUFBO0FBQUEsY0FFckQsY0FBYSxDQUFDLFdBQVcsUUFBUTtBQUFBLElBQzdDLE1BQU0sU0FBUyxNQUFNLFFBQVEsRUFBRSxlQUFlLFVBQVUsYUFBYSxHQUFHLE1BQU07QUFBQSxJQUM5RSxNQUFNLFVBQVUsTUFBTSxjQUFjLE9BQU8sWUFBWTtBQUFBLElBQ3ZELEtBQUssU0FBUztBQUFBLE1BQ2IsUUFBUSxNQUFNLDBDQUEwQyxVQUFVLE9BQU87QUFBQSxNQUN6RSxPQUFPO0FBQUEsSUFDUjtBQUFBLElBQ0EsVUFBVSxjQUFjLE9BQU87QUFBQSxJQUMvQixVQUFVLFlBQVksSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sYUFBYSxJQUFHO0FBQUEsSUFDbkUsVUFBVSxlQUFlLE9BQU87QUFBQSxJQUNoQyxLQUFLLEtBQUssU0FBUztBQUFBLElBQ25CLE9BQU87QUFBQTtBQUVUOzs7QUNoSUEsSUFBSSxhQUFhLE1BQU07QUFBQSxTQUNmLElBQUksQ0FBQyxJQUFJO0FBQUEsSUFDZixNQUFNLFNBQVMsR0FBRyxPQUFPO0FBQUEsTUFDeEIsSUFBSSxNQUFNO0FBQUEsTUFDVixXQUFXLE1BQU07QUFBQSxNQUNqQixXQUFXLE1BQU07QUFBQSxNQUNqQixXQUFXLE1BQU07QUFBQSxNQUNqQixpQkFBaUIsTUFBTTtBQUFBLE1BQ3ZCLG9CQUFvQjtBQUFBLElBQ3JCLENBQUMsRUFBRSxLQUFLLEtBQUssRUFBRSxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsWUFBWSxHQUFHLE1BQU0sSUFBSSxXQUFXLE1BQU0sQ0FBQyxFQUFFLElBQUk7QUFBQSxJQUNqRyxPQUFPLEtBQUssZ0JBQWdCLE1BQU07QUFBQTtBQUFBLFNBRTVCLGVBQWUsQ0FBQyxJQUFJO0FBQUEsSUFDMUIsTUFBTSxTQUFTLEdBQUcsT0FBTztBQUFBLE1BQ3hCLElBQUksTUFBTTtBQUFBLE1BQ1YsV0FBVyxNQUFNO0FBQUEsTUFDakIsV0FBVyxNQUFNO0FBQUEsTUFDakIsV0FBVyxNQUFNO0FBQUEsTUFDakIsaUJBQWlCLE1BQU07QUFBQSxNQUN2QixvQkFBb0I7QUFBQSxJQUNyQixDQUFDLEVBQUUsS0FBSyxLQUFLLEVBQUUsTUFBTSxHQUFHLE1BQU0sV0FBVyxFQUFFLENBQUMsRUFBRSxTQUFTLFlBQVksR0FBRyxNQUFNLElBQUksV0FBVyxNQUFNLENBQUMsRUFBRSxJQUFJO0FBQUEsSUFDeEcsT0FBTyxLQUFLLGdCQUFnQixNQUFNO0FBQUE7QUFBQSxTQUU1QixPQUFPLEdBQUc7QUFBQSxJQUNoQixNQUFNLFNBQVMsR0FBRyxPQUFPO0FBQUEsTUFDeEIsSUFBSSxNQUFNO0FBQUEsTUFDVixXQUFXLE1BQU07QUFBQSxNQUNqQixXQUFXLE1BQU07QUFBQSxNQUNqQixXQUFXLE1BQU07QUFBQSxNQUNqQixpQkFBaUIsTUFBTTtBQUFBLE1BQ3ZCLG9CQUFvQjtBQUFBLElBQ3JCLENBQUMsRUFBRSxLQUFLLEtBQUssRUFBRSxTQUFTLFlBQVksR0FBRyxNQUFNLElBQUksV0FBVyxNQUFNLENBQUMsRUFBRSxJQUFJO0FBQUEsSUFDekUsT0FBTyxLQUFLLGdCQUFnQixNQUFNO0FBQUE7QUFBQSxTQUU1QixpQkFBaUIsQ0FBQyxJQUFJO0FBQUEsSUFDNUIsTUFBTSxTQUFTLEdBQUcsT0FBTztBQUFBLE1BQ3hCLElBQUksTUFBTTtBQUFBLE1BQ1YsV0FBVyxNQUFNO0FBQUEsTUFDakIsV0FBVyxNQUFNO0FBQUEsTUFDakIsV0FBVyxNQUFNO0FBQUEsTUFDakIsaUJBQWlCLE1BQU07QUFBQSxNQUN2QixvQkFBb0I7QUFBQSxJQUNyQixDQUFDLEVBQUUsS0FBSyxLQUFLLEVBQUUsU0FBUyxZQUFZLEdBQUcsTUFBTSxJQUFJLFdBQVcsTUFBTSxDQUFDLEVBQUUsTUFBTSxHQUFHLFdBQVcsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJO0FBQUEsSUFDdEcsT0FBTyxLQUFLLGdCQUFnQixNQUFNO0FBQUE7QUFBQSxTQUU1QixtQkFBbUIsQ0FBQyxNQUFNO0FBQUEsSUFDaEMsTUFBTSxTQUFTLEdBQUcsT0FBTztBQUFBLE1BQ3hCLElBQUksTUFBTTtBQUFBLE1BQ1YsV0FBVyxNQUFNO0FBQUEsTUFDakIsV0FBVyxNQUFNO0FBQUEsTUFDakIsV0FBVyxNQUFNO0FBQUEsTUFDakIsaUJBQWlCLE1BQU07QUFBQSxNQUN2QixvQkFBb0I7QUFBQSxJQUNyQixDQUFDLEVBQUUsS0FBSyxLQUFLLEVBQUUsU0FBUyxZQUFZLEdBQUcsTUFBTSxJQUFJLFdBQVcsTUFBTSxDQUFDLEVBQUUsTUFBTSxHQUFHLFdBQVcsTUFBTSxJQUFJLENBQUMsRUFBRSxJQUFJO0FBQUEsSUFDMUcsT0FBTyxLQUFLLGdCQUFnQixNQUFNO0FBQUE7QUFBQSxTQUU1QixlQUFlLENBQUMsT0FBTztBQUFBLElBQzdCLEtBQUs7QUFBQSxNQUFPLE9BQU8sQ0FBQztBQUFBLElBQ3BCLElBQUksTUFBTSxRQUFRLEtBQUs7QUFBQSxNQUFHLE9BQU8sTUFBTSxJQUFJLENBQUMsU0FBUztBQUFBLFFBQ3BELE9BQU87QUFBQSxVQUNOLElBQUksS0FBSztBQUFBLFVBQ1QsV0FBVyxLQUFLO0FBQUEsVUFDaEIsV0FBVyxJQUFJLEtBQUssS0FBSyxTQUFTO0FBQUEsVUFDbEMsV0FBVyxJQUFJLEtBQUssS0FBSyxTQUFTO0FBQUEsVUFDbEMsY0FBYyxLQUFLLHFCQUFxQixLQUFLLE1BQU0sS0FBSyxzQkFBc0IsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUM7QUFBQSxVQUNwSCxpQkFBaUIsS0FBSztBQUFBLFFBQ3ZCO0FBQUEsT0FDQTtBQUFBLElBQ0k7QUFBQSxhQUFPO0FBQUEsUUFDWCxJQUFJLE1BQU07QUFBQSxRQUNWLFdBQVcsTUFBTTtBQUFBLFFBQ2pCLFdBQVcsSUFBSSxLQUFLLE1BQU0sU0FBUztBQUFBLFFBQ25DLFdBQVcsSUFBSSxLQUFLLE1BQU0sU0FBUztBQUFBLFFBQ25DLGNBQWMsTUFBTSxxQkFBcUIsS0FBSyxNQUFNLE1BQU0sc0JBQXNCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDO0FBQUEsUUFDdEgsaUJBQWlCLE1BQU07QUFBQSxNQUN4QjtBQUFBO0FBQUEsU0FFTSxNQUFNLENBQUMsV0FBVztBQUFBLElBQ3hCLEtBQUssS0FBSztBQUFBLE1BQ1Q7QUFBQSxNQUNBLDJCQUEyQixJQUFJO0FBQUEsTUFDL0IsMkJBQTJCLElBQUk7QUFBQSxJQUNoQyxDQUFDO0FBQUEsSUFDRCxPQUFPLEtBQUssZ0JBQWdCLFNBQVM7QUFBQTtBQUFBLFNBRS9CLElBQUksQ0FBQyxNQUFNO0FBQUEsSUFDakIsR0FBRyxPQUFPLEtBQUssRUFBRSxPQUFPO0FBQUEsTUFDdkIsSUFBSSxLQUFLO0FBQUEsTUFDVCxXQUFXLEtBQUs7QUFBQSxNQUNoQixlQUFlLEtBQUs7QUFBQSxNQUNwQixXQUFXLEtBQUssVUFBVSxRQUFRO0FBQUEsTUFDbEMsV0FBVyxLQUFLLFVBQVUsUUFBUTtBQUFBLElBQ25DLENBQUMsRUFBRSxtQkFBbUI7QUFBQSxNQUNyQixRQUFRLE1BQU07QUFBQSxNQUNkLEtBQUs7QUFBQSxRQUNKLFdBQVcsS0FBSztBQUFBLFFBQ2hCLGVBQWUsS0FBSztBQUFBLFFBQ3BCLFdBQVcsS0FBSyxVQUFVLFFBQVE7QUFBQSxNQUNuQztBQUFBLElBQ0QsQ0FBQyxFQUFFLElBQUk7QUFBQSxJQUNQLE9BQU87QUFBQTtBQUFBLFNBRUQsTUFBTSxDQUFDLE1BQU07QUFBQSxJQUNuQixHQUFHLE9BQU8sS0FBSyxFQUFFLE1BQU0sR0FBRyxNQUFNLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJO0FBQUE7QUFBQSxTQUU1QyxZQUFZLENBQUMsTUFBTSxRQUFPO0FBQUEsSUFDaEMsS0FBSyxLQUFLO0FBQUEsTUFBYztBQUFBLElBQ3hCLElBQUksVUFBUyxLQUFLLGFBQWE7QUFBQSxNQUFRO0FBQUEsSUFDdkMsT0FBTyxnQkFBZ0IsS0FBSyxLQUFLLGFBQWEsT0FBTTtBQUFBO0FBRXREOzs7QUMvR0EsSUFBSSxnQkFBZ0IsTUFBTSxlQUFjO0FBQUEsRUFDdkM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBLDBCQUEwQixJQUFJO0FBQUEsRUFDOUIsV0FBVyxHQUFHO0FBQUEsSUFDYixLQUFLLDBCQUEwQixJQUFJO0FBQUE7QUFBQSxTQUU3QixJQUFJLENBQUMsV0FBVztBQUFBLElBQ3RCLE1BQU0sU0FBUyxHQUFHLE9BQU8sRUFBRSxLQUFLLGNBQWMsRUFBRSxNQUFNLEdBQUcsZUFBZSxJQUFJLFNBQVMsQ0FBQyxFQUFFLElBQUk7QUFBQSxJQUM1RixPQUFPLEtBQUssZ0JBQWdCLE1BQU07QUFBQTtBQUFBLFNBRTVCLE1BQU0sQ0FBQyxXQUFXLFNBQVMsU0FBUyxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUc7QUFBQSxJQUM1RCxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLE9BQU8sS0FBSztBQUFBLElBQ1osT0FBTyxVQUFVO0FBQUEsSUFDakIsT0FBTyxTQUFTLEtBQUssVUFBVSxNQUFNO0FBQUEsSUFDckMsT0FBTyxVQUFVLEtBQUssVUFBVSxPQUFPO0FBQUEsSUFDdkMsT0FBTztBQUFBO0FBQUEsU0FFRCxlQUFlLENBQUMsT0FBTztBQUFBLElBQzdCLEtBQUs7QUFBQSxNQUFPLE9BQU87QUFBQSxJQUNuQixNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLE9BQU8sS0FBSyxNQUFNO0FBQUEsSUFDbEIsT0FBTyxVQUFVLE1BQU07QUFBQSxJQUN2QixPQUFPLFNBQVMsTUFBTTtBQUFBLElBQ3RCLE9BQU8sVUFBVSxNQUFNO0FBQUEsSUFDdkIsT0FBTyxVQUFVLE1BQU07QUFBQSxJQUN2QixPQUFPO0FBQUE7QUFBQSxFQUVSLElBQUksR0FBRztBQUFBLElBQ04sR0FBRyxPQUFPLGNBQWMsRUFBRSxPQUFPO0FBQUEsTUFDaEMsSUFBSSxLQUFLO0FBQUEsTUFDVCxTQUFTLEtBQUs7QUFBQSxNQUNkLFFBQVEsS0FBSztBQUFBLE1BQ2IsU0FBUyxLQUFLO0FBQUEsTUFDZCxXQUFXLEtBQUssUUFBUSxRQUFRO0FBQUEsSUFDakMsQ0FBQyxFQUFFLG1CQUFtQjtBQUFBLE1BQ3JCLFFBQVEsZUFBZTtBQUFBLE1BQ3ZCLEtBQUs7QUFBQSxRQUNKLFNBQVMsS0FBSztBQUFBLFFBQ2QsUUFBUSxLQUFLO0FBQUEsUUFDYixTQUFTLEtBQUs7QUFBQSxNQUNmO0FBQUEsSUFDRCxDQUFDLEVBQUUsSUFBSTtBQUFBLElBQ1AsT0FBTztBQUFBO0FBQUEsRUFFUixNQUFNLEdBQUc7QUFBQSxJQUNSLEdBQUcsT0FBTyxjQUFjLEVBQUUsTUFBTSxHQUFHLGVBQWUsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUk7QUFBQTtBQUFBLFNBRTlELE1BQU0sQ0FBQyxXQUFXO0FBQUEsSUFDeEIsR0FBRyxPQUFPLGNBQWMsRUFBRSxNQUFNLEdBQUcsZUFBZSxJQUFJLFNBQVMsQ0FBQyxFQUFFLElBQUk7QUFBQTtBQUV4RTs7O0FDckRBLElBQUksaUJBQWlCLENBQUM7QUFDdEIsU0FBUyxnQkFBZ0I7QUFBQSxFQUN4QixpQkFBaUIsTUFBTTtBQUFBLEVBQ3ZCLGVBQWUsTUFBTTtBQUFBLEVBQ3JCLFlBQVksTUFBTTtBQUNuQixDQUFDOzs7QUNYRDs7O0FDTUEsTUFBTSx5QkFBeUIsY0FBYztBQUFBLEVBQzNDLFdBQVcsQ0FBQyxRQUFRLFNBQVMsUUFBUSxXQUFVLENBQUMsR0FBRztBQUFBLElBQ2pELE1BQU0sT0FBTztBQUFBLElBQ2IsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLFNBQVM7QUFBQSxJQUNkLEtBQUssU0FBUyxTQUFRLFVBQVUsSUFBSTtBQUFBO0FBQUEsVUFFOUIsY0FBYztBQUFBLEVBQ3RCO0FBQUEsRUFDQSxJQUFJLENBQUMsT0FBTztBQUFBLElBQ1YsS0FBSyxPQUFPLEtBQUssS0FBSztBQUFBO0FBQUEsRUFFeEIsWUFBWSxDQUFDLE9BQU8sUUFBUSxlQUFlLHVCQUF1QixvQkFBb0I7QUFBQSxJQUNwRixNQUFNLE9BQU8sS0FBSyxPQUFPLFFBQVEsTUFBTSxHQUFHO0FBQUEsSUFDMUMsT0FBTyxJQUFJLGNBQ1QsTUFDQSxPQUNBLEtBQUssUUFDTCxRQUNBLGVBQ0EsdUJBQ0Esa0JBQ0Y7QUFBQTtBQUFBLEVBRUYsV0FBVyxDQUFDLGFBQWEsU0FBUyxDQUFDLEdBQUc7QUFBQSxJQUNwQyxNQUFNLEtBQUssSUFBSSxxQkFBcUIsUUFBUSxLQUFLLFNBQVMsTUFBTSxLQUFLLE1BQU07QUFBQSxJQUMzRSxJQUFJO0FBQUEsSUFDSixNQUFNLFdBQVcsS0FBSyxPQUFPLFlBQVksTUFBTTtBQUFBLE1BQzdDLFNBQVMsWUFBWSxFQUFFO0FBQUEsS0FDeEI7QUFBQSxJQUNELFNBQVMsT0FBTyxZQUFZLFlBQVk7QUFBQSxJQUN4QyxPQUFPO0FBQUE7QUFFWDtBQUFBO0FBQ0EsTUFBTSw2QkFBNkIsa0JBQWtCO0FBQUEsVUFDM0MsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxhQUFhO0FBQUEsSUFDdkIsTUFBTSxnQkFBZ0IsS0FBSyxLQUFLO0FBQUEsSUFDaEMsTUFBTSxLQUFLLElBQUkscUJBQXFCLFFBQVEsS0FBSyxTQUFTLEtBQUssU0FBUyxLQUFLLFFBQVEsS0FBSyxjQUFjLENBQUM7QUFBQSxJQUN6RyxLQUFLLFFBQVEsSUFBSSxJQUFJLElBQUksYUFBYSxlQUFlLENBQUM7QUFBQSxJQUN0RCxJQUFJO0FBQUEsTUFDRixNQUFNLFNBQVMsWUFBWSxFQUFFO0FBQUEsTUFDN0IsS0FBSyxRQUFRLElBQUksSUFBSSxJQUFJLHFCQUFxQixlQUFlLENBQUM7QUFBQSxNQUM5RCxPQUFPO0FBQUEsTUFDUCxPQUFPLEtBQUs7QUFBQSxNQUNaLEtBQUssUUFBUSxJQUFJLElBQUksSUFBSSx5QkFBeUIsZUFBZSxDQUFDO0FBQUEsTUFDbEUsTUFBTTtBQUFBO0FBQUE7QUFHWjtBQUFBO0FBQ0EsTUFBTSxzQkFBc0Isb0JBQWtCO0FBQUEsRUFDNUMsV0FBVyxDQUFDLE1BQU0sT0FBTyxRQUFRLFFBQVEsZUFBZSx3QkFBd0Isb0JBQW9CO0FBQUEsSUFDbEcsTUFBTSxRQUFRLGVBQWUsS0FBSztBQUFBLElBQ2xDLEtBQUssT0FBTztBQUFBLElBQ1osS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLFNBQVM7QUFBQSxJQUNkLEtBQUsseUJBQXlCO0FBQUEsSUFDOUIsS0FBSyxxQkFBcUI7QUFBQTtBQUFBLFVBRXBCLGNBQWM7QUFBQSxFQUN0QixHQUFHLENBQUMsbUJBQW1CO0FBQUEsSUFDckIsTUFBTSxTQUFTLGlCQUFpQixLQUFLLE1BQU0sUUFBUSxxQkFBcUIsQ0FBQyxDQUFDO0FBQUEsSUFDMUUsS0FBSyxPQUFPLFNBQVMsS0FBSyxNQUFNLEtBQUssTUFBTTtBQUFBLElBQzNDLE9BQU8sS0FBSyxLQUFLLElBQUksR0FBRyxNQUFNO0FBQUE7QUFBQSxFQUVoQyxHQUFHLENBQUMsbUJBQW1CO0FBQUEsSUFDckIsUUFBUSxRQUFRLE9BQU8sUUFBUSxxQkFBcUIsTUFBTSx1QkFBdUI7QUFBQSxJQUNqRixLQUFLLFdBQVcsb0JBQW9CO0FBQUEsTUFDbEMsTUFBTSxTQUFTLGlCQUFpQixNQUFNLFFBQVEscUJBQXFCLENBQUMsQ0FBQztBQUFBLE1BQ3JFLE9BQU8sU0FBUyxNQUFNLEtBQUssTUFBTTtBQUFBLE1BQ2pDLE9BQU8sS0FBSyxJQUFJLEdBQUcsTUFBTTtBQUFBLElBQzNCO0FBQUEsSUFDQSxNQUFNLE9BQU8sS0FBSyxPQUFPLGlCQUFpQjtBQUFBLElBQzFDLElBQUksb0JBQW9CO0FBQUEsTUFDdEIsT0FBTyxtQkFBbUIsSUFBSTtBQUFBLElBQ2hDO0FBQUEsSUFDQSxPQUFPLEtBQUssSUFBSSxDQUFDLFFBQVEsYUFBYSxRQUFRLEtBQUssbUJBQW1CLENBQUM7QUFBQTtBQUFBLEVBRXpFLEdBQUcsQ0FBQyxtQkFBbUI7QUFBQSxJQUNyQixNQUFNLFNBQVMsaUJBQWlCLEtBQUssTUFBTSxRQUFRLHFCQUFxQixDQUFDLENBQUM7QUFBQSxJQUMxRSxLQUFLLE9BQU8sU0FBUyxLQUFLLE1BQU0sS0FBSyxNQUFNO0FBQUEsSUFDM0MsTUFBTSxNQUFNLEtBQUssS0FBSyxPQUFPLEdBQUcsTUFBTSxFQUFFO0FBQUEsSUFDeEMsS0FBSyxLQUFLO0FBQUEsTUFDUjtBQUFBLElBQ0Y7QUFBQSxJQUNBLFFBQVEsUUFBUSxxQkFBcUIsdUJBQXVCO0FBQUEsSUFDNUQsS0FBSyxXQUFXLG9CQUFvQjtBQUFBLE1BQ2xDLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLG9CQUFvQjtBQUFBLE1BQ3RCLE9BQU8sbUJBQW1CLENBQUMsR0FBRyxDQUFDO0FBQUEsSUFDakM7QUFBQSxJQUNBLE9BQU8sYUFBYSxRQUFRLEtBQUssbUJBQW1CO0FBQUE7QUFBQSxFQUV0RCxNQUFNLENBQUMsbUJBQW1CO0FBQUEsSUFDeEIsTUFBTSxTQUFTLGlCQUFpQixLQUFLLE1BQU0sUUFBUSxxQkFBcUIsQ0FBQyxDQUFDO0FBQUEsSUFDMUUsS0FBSyxPQUFPLFNBQVMsS0FBSyxNQUFNLEtBQUssTUFBTTtBQUFBLElBQzNDLE9BQU8sS0FBSyxLQUFLLE9BQU8sR0FBRyxNQUFNO0FBQUE7QUFBQSxFQUduQyxxQkFBcUIsR0FBRztBQUFBLElBQ3RCLE9BQU8sS0FBSztBQUFBO0FBRWhCOzs7QURsR0EsTUFBTSwwQkFBMEIsbUJBQW1CO0FBQUEsVUFDekMsY0FBYztBQUN4QjtBQUNBLFNBQVMsU0FBUyxDQUFDLFFBQVEsU0FBUyxDQUFDLEdBQUc7QUFBQSxFQUN0QyxNQUFNLFVBQVUsSUFBSSxrQkFBa0IsRUFBRSxRQUFRLE9BQU8sT0FBTyxDQUFDO0FBQUEsRUFDL0QsSUFBSTtBQUFBLEVBQ0osSUFBSSxPQUFPLFdBQVcsTUFBTTtBQUFBLElBQzFCLFNBQVMsSUFBSTtBQUFBLEVBQ2YsRUFBTyxTQUFJLE9BQU8sV0FBVyxPQUFPO0FBQUEsSUFDbEMsU0FBUyxPQUFPO0FBQUEsRUFDbEI7QUFBQSxFQUNBLElBQUk7QUFBQSxFQUNKLElBQUksT0FBTyxRQUFRO0FBQUEsSUFDakIsTUFBTSxlQUFlLDhCQUNuQixPQUFPLFFBQ1AsMkJBQ0Y7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLFlBQVksT0FBTztBQUFBLE1BQ25CLFFBQVEsYUFBYTtBQUFBLE1BQ3JCLGVBQWUsYUFBYTtBQUFBLElBQzlCO0FBQUEsRUFDRjtBQUFBLEVBQ0EsTUFBTSxVQUFVLElBQUksaUJBQWlCLFFBQVEsU0FBUyxRQUFRLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDeEUsTUFBTSxNQUFLLElBQUksa0JBQWtCLFFBQVEsU0FBUyxTQUFTLE1BQU07QUFBQSxFQUNqRSxJQUFHLFVBQVU7QUFBQSxFQUNiLE9BQU87QUFBQTtBQUVULFNBQVMsT0FBTyxJQUFJLFFBQVE7QUFBQSxFQUMxQixJQUFJLE9BQU8sT0FBWSxhQUFLLE9BQU8sT0FBTyxPQUFPLFVBQVU7QUFBQSxJQUN6RCxNQUFNLFdBQVcsT0FBTyxPQUFZLFlBQUksSUFBSSxXQUFhLElBQUksU0FBUyxPQUFPLEVBQUU7QUFBQSxJQUMvRSxPQUFPLFVBQVUsVUFBVSxPQUFPLEVBQUU7QUFBQSxFQUN0QztBQUFBLEVBQ0EsSUFBSSxTQUFTLE9BQU8sRUFBRSxHQUFHO0FBQUEsSUFDdkIsUUFBUSxZQUFZLFdBQVcsa0JBQWtCLE9BQU87QUFBQSxJQUN4RCxJQUFJO0FBQUEsTUFBUSxPQUFPLFVBQVUsUUFBUSxhQUFhO0FBQUEsSUFDbEQsSUFBSSxPQUFPLGVBQWUsVUFBVTtBQUFBLE1BQ2xDLFFBQVEsV0FBVyxTQUFTO0FBQUEsTUFDNUIsTUFBTSxXQUFVLE9BQU8sT0FBTyxJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU0sTUFBVyxTQUFDLEVBQUUsU0FBUyxPQUFZO0FBQUEsTUFDckYsTUFBTSxZQUFZLElBQUksU0FBUyxRQUFRLFFBQU87QUFBQSxNQUM5QyxPQUFPLFVBQVUsV0FBVyxhQUFhO0FBQUEsSUFDM0M7QUFBQSxJQUNBLE1BQU0sV0FBVyxJQUFJLFNBQVMsVUFBVTtBQUFBLElBQ3hDLE9BQU8sVUFBVSxVQUFVLGFBQWE7QUFBQSxFQUMxQztBQUFBLEVBQ0EsT0FBTyxVQUFVLE9BQU8sSUFBSSxPQUFPLEVBQUU7QUFBQTtBQUFBLENBRXRDLENBQUMsYUFBYTtBQUFBLEVBQ2IsU0FBUyxJQUFJLENBQUMsUUFBUTtBQUFBLElBQ3BCLE9BQU8sVUFBVSxDQUFDLEdBQUcsTUFBTTtBQUFBO0FBQUEsRUFFN0IsU0FBUyxPQUFPO0FBQUEsR0FDZixZQUFZLFVBQVUsQ0FBQyxFQUFFOzs7QUV6RDVCLHFCQUFTO0FBQ1Q7QUFHQSxJQUFNLFVBQVUsUUFBUSxJQUFJLGdCQUFnQixLQUFLLFFBQVEsSUFBSSxHQUFHLG9CQUFvQjtBQUNwRixRQUFRLElBQUksa0JBQWtCLE9BQU87QUFDckMsSUFBTSxTQUFTLElBQUksVUFBUyxPQUFPO0FBQ25DLElBQU0sS0FBSyxRQUFRLFFBQVEsRUFBRSxRQUFRO0FBQUEsRUFDcEM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0QsRUFBRSxDQUFDOzs7QUNiSCxJQUFNLGlCQUFpQjtBQUV2QixTQUFTLFVBQVUsSUFBSSxRQUFRO0FBQUEsRUFDOUIsT0FBTyxPQUFPLEtBQUssR0FBRztBQUFBO0FBRXZCLElBQUkseUJBQXlCLFFBQVEsQ0FBQyxVQUFVO0FBQUEsRUFDL0MsU0FBUyxpQkFBaUI7QUFBQSxFQUMxQixTQUFTLHNDQUFzQztBQUFBLEVBQy9DLFNBQVMsbUNBQW1DO0FBQUEsRUFDNUMsU0FBUyw0QkFBNEI7QUFBQSxFQUNyQyxTQUFTLDZCQUE2QjtBQUFBLEVBQ3RDLFNBQVMsd0JBQXdCO0FBQUEsRUFDakMsU0FBUyxvQkFBb0I7QUFBQSxFQUM3QixTQUFTLG9CQUFvQjtBQUFBLEVBQzdCLFNBQVMsd0JBQXdCO0FBQUEsRUFDakMsU0FBUyw0QkFBNEI7QUFBQSxFQUNyQyxTQUFTLGtDQUFrQztBQUFBLEVBQzNDLFNBQVMsb0NBQW9DO0FBQUEsRUFDN0MsU0FBUyw4QkFBOEI7QUFBQSxFQUN2QyxTQUFTLHdCQUF3QjtBQUFBLEVBQ2pDLFNBQVMsOEJBQThCO0FBQUEsRUFDdkMsU0FBUyw4QkFBOEI7QUFBQSxFQUN2QyxTQUFTLDhCQUE4QjtBQUFBLEVBQ3ZDLFNBQVMsOENBQThDO0FBQUEsRUFDdkQsU0FBUyx3QkFBd0I7QUFBQSxFQUNqQyxTQUFTLDRCQUE0QjtBQUFBLEVBQ3JDLFNBQVMsdUJBQXVCO0FBQUEsRUFDaEMsU0FBUyx3QkFBd0I7QUFBQSxFQUNqQyxTQUFTLG9CQUFvQjtBQUFBLEVBQzdCLFNBQVMsdUJBQXVCO0FBQUEsRUFDaEMsU0FBUywrQkFBK0I7QUFBQSxFQUN4QyxTQUFTLDRCQUE0QjtBQUFBLEVBQ3JDLFNBQVMsNkJBQTZCO0FBQUEsRUFDdEMsU0FBUywrQkFBK0I7QUFBQSxFQUN4QyxTQUFTLGtDQUFrQztBQUFBLEVBQzNDLFNBQVMsNkJBQTZCO0FBQUEsRUFDdEMsU0FBUyxtQ0FBbUM7QUFBQSxFQUM1QyxTQUFTLG1DQUFtQztBQUFBLEVBQzVDLFNBQVMsNEJBQTRCO0FBQUEsRUFDckMsU0FBUywrQkFBK0I7QUFBQSxFQUN4QyxTQUFTLHFDQUFxQztBQUFBLEVBQzlDLFNBQVMsa0NBQWtDO0FBQUEsRUFDM0MsU0FBUyxtQ0FBbUM7QUFBQSxFQUM1QyxTQUFTLGdDQUFnQztBQUFBLEVBQ3pDLFNBQVMsdUNBQXVDO0FBQUEsRUFDaEQsU0FBUywwQkFBMEI7QUFBQSxFQUNuQyxTQUFTLHdDQUF3QztBQUFBLEVBQ2pELFNBQVMsMEJBQTBCO0FBQUEsRUFDbkMsU0FBUyw2QkFBNkI7QUFBQSxFQUN0QyxTQUFTLDBDQUEwQztBQUFBLEVBQ25ELFNBQVMsZ0NBQWdDO0FBQUEsRUFDekMsU0FBUyxxQ0FBcUM7QUFBQSxFQUM5QyxTQUFTLG1DQUFtQztBQUFBLEVBQzVDLFNBQVMsaUNBQWlDO0FBQUEsRUFDMUMsU0FBUyxnQ0FBZ0M7QUFBQSxFQUN6QyxTQUFTLG9DQUFvQztBQUFBLEVBQzdDLFNBQVMsOEJBQThCO0FBQUEsRUFDdkMsU0FBUyxrQ0FBa0M7QUFBQSxFQUMzQyxTQUFTLDBDQUEwQztBQUFBLEVBQ25ELFNBQVMsaUNBQWlDO0FBQUEsRUFDMUMsU0FBUyxpQ0FBaUM7QUFBQSxFQUMxQyxTQUFTLG9DQUFvQztBQUFBLEVBQzdDLFNBQVMscUNBQXFDO0FBQUEsRUFDOUMsU0FBUyxzQ0FBc0M7QUFBQSxFQUMvQyxTQUFTLG9DQUFvQztBQUFBLEVBQzdDLFNBQVMsc0NBQXNDO0FBQUEsRUFDL0MsU0FBUyxrQ0FBa0M7QUFBQSxFQUMzQyxTQUFTLGtDQUFrQztBQUFBLEVBQzNDLFNBQVMsOEJBQThCO0FBQUEsRUFDdkMsU0FBUyw0QkFBNEI7QUFBQSxFQUNyQyxTQUFTLDZCQUE2QjtBQUFBLEVBQ3RDLFNBQVMsOEJBQThCO0FBQUEsRUFDdkMsU0FBUyxnQ0FBZ0M7QUFBQSxFQUN6QyxPQUFPO0FBQUEsRUFDTixDQUFDLENBQUM7OztBQzFFSixJQUFNLHdCQUF3QixJQUFJO0FBQ2xDLFNBQVMsVUFBVSxHQUFHO0FBQUEsRUFDckIsTUFBTSxNQUFNLEtBQUssSUFBSTtBQUFBLEVBQ3JCLFlBQVksS0FBSyxVQUFVO0FBQUEsSUFBTyxJQUFJLE1BQU0sVUFBVTtBQUFBLE1BQUssTUFBTSxPQUFPLEdBQUc7QUFBQTtBQUU1RSxZQUFZLFlBQVksT0FBTSxLQUFLLEVBQUU7QUFDckMsSUFBTSx1QkFBdUIsT0FBTSxLQUFLO0FBQ3hDLGVBQWUsUUFBUSxDQUFDLE1BQU0sYUFBYSxTQUFTLE9BQU8sTUFBTSxVQUFVLE9BQU8sZ0JBQWdCLHlCQUF5QixDQUFDLEdBQUc7QUFBQSxFQUM5SCxJQUFJO0FBQUEsSUFDSCxNQUFNLFVBQVU7QUFBQSxNQUNmLGNBQWMsUUFBUTtBQUFBLE1BQ3RCLFFBQVU7QUFBQSxJQUNYO0FBQUEsSUFDQSxJQUFJLFdBQVc7QUFBQSxNQUNkLEtBQUssZ0JBQWdCLGNBQWMsU0FBUyxHQUFHO0FBQUEsUUFDOUMsTUFBTSxnQkFBZ0IsY0FBYyxTQUFTO0FBQUEsUUFDN0MsS0FBSyxnQkFBZ0IsY0FBYyxTQUFTO0FBQUEsVUFBRyxNQUFNLElBQUksTUFBTSwwQ0FBMEMsVUFBVSxPQUFPO0FBQUEsTUFDM0g7QUFBQSxNQUNBLFFBQVEsbUJBQW1CLFVBQVUsVUFBVTtBQUFBLElBQ2hEO0FBQUEsSUFDQSxNQUFNLE9BQU87QUFBQSxNQUNaO0FBQUEsTUFDQSxRQUFRLFVBQVU7QUFBQSxNQUNsQixNQUFNLFFBQWE7QUFBQSxJQUNwQjtBQUFBLElBQ0EsTUFBTSxNQUFNLElBQUksSUFBSSxHQUFHLGlCQUFpQixLQUFLLFdBQVcsR0FBRyxJQUFJLE9BQU8sTUFBTSxNQUFNO0FBQUEsSUFDbEYsSUFBSSxhQUFhLElBQUksY0FBYyxhQUFhO0FBQUEsSUFDaEQsS0FBSyxXQUFXLEtBQUssV0FBVyxPQUFPO0FBQUEsTUFDdEMsTUFBTSxTQUFTLE1BQU0sSUFBSSxJQUFJLElBQUk7QUFBQSxNQUNqQyxJQUFJLFVBQVUsUUFBUSxVQUFVLEtBQUssSUFBSTtBQUFBLFFBQUcsT0FBTyxPQUFPO0FBQUEsSUFDM0Q7QUFBQSxJQUNBLE1BQU0sTUFBTSxNQUFNLE1BQU0sS0FBSyxJQUFJO0FBQUEsSUFDakMsTUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQUEsSUFDNUIsS0FBSyxJQUFJLElBQUk7QUFBQSxNQUNaLFFBQVEsTUFBTSwwQkFBMEIsVUFBVSxJQUFJLFVBQVUsSUFBSSxpQkFBaUIsS0FBSyxVQUFVLElBQUksR0FBRztBQUFBLE1BQzNHLE9BQU87QUFBQSxJQUNSO0FBQUEsSUFDQSxJQUFJLEtBQUssV0FBVztBQUFBLE1BQU8sTUFBTSxJQUFJLElBQUksTUFBTTtBQUFBLFFBQzlDLFNBQVMsS0FBSyxJQUFJLElBQUksUUFBUSxJQUFJLFNBQVMsS0FBSyxJQUFJLEtBQUssT0FBTyxJQUFJLFFBQVEsSUFBSSxTQUFTLEtBQUssRUFBRSxDQUFDLEVBQUUsUUFBUSxLQUFLLEdBQUcsS0FBSyxJQUFJLElBQUksYUFBYTtBQUFBLFFBQzdJO0FBQUEsTUFDRCxDQUFDO0FBQUEsSUFDRCxPQUFPO0FBQUEsSUFDTixPQUFPLEtBQUs7QUFBQSxJQUNiLFFBQVEsTUFBTSwwQkFBMEIsVUFBVSxLQUFLLFVBQVUsR0FBRyxLQUFLLEdBQUc7QUFBQSxJQUM1RSxPQUFPO0FBQUE7QUFBQTs7O0FDM0NULElBQUksb0JBQW9CLENBQUM7QUFDekIsU0FBUyxtQkFBbUI7QUFBQSxFQUMzQiwwQkFBMEIsTUFBTTtBQUFBLEVBQ2hDLDJCQUEyQixNQUFNO0FBQUEsRUFDakMsNEJBQTRCLE1BQU07QUFBQSxFQUNsQyx3QkFBd0IsTUFBTTtBQUFBLEVBQzlCLG9CQUFvQixNQUFNO0FBQUEsRUFDMUIsd0JBQXdCLE1BQU07QUFBQSxFQUM5QixvQkFBb0IsTUFBTTtBQUFBLEVBQzFCLGtDQUFrQyxNQUFNO0FBQUEsRUFDeEMsZ0NBQWdDLE1BQU07QUFBQSxFQUN0Qyx5QkFBeUIsTUFBTTtBQUFBLEVBQy9CLHNCQUFzQixNQUFNO0FBQUEsRUFDNUIseUJBQXlCLE1BQU07QUFBQSxFQUMvQixzQkFBc0IsTUFBTTtBQUFBLEVBQzVCLG9CQUFvQixNQUFNO0FBQUEsRUFDMUIsMkJBQTJCLE1BQU07QUFBQSxFQUNqQyxvQkFBb0IsTUFBTTtBQUFBLEVBQzFCLHVCQUF1QixNQUFNO0FBQUEsRUFDN0Isd0JBQXdCLE1BQU07QUFBQSxFQUM5QixtQkFBbUIsTUFBTTtBQUFBLEVBQ3pCLHVCQUF1QixNQUFNO0FBQUEsRUFDN0Isb0JBQW9CLE1BQU07QUFBQSxFQUMxQixvQkFBb0IsTUFBTTtBQUFBLEVBQzFCLDJCQUEyQixNQUFNO0FBQUEsRUFDakMsZ0NBQWdDLE1BQU07QUFBQSxFQUN0QyxnQkFBZ0IsTUFBTTtBQUN2QixDQUFDO0FBQ0QsU0FBUyxzQkFBc0IsQ0FBQyxJQUFJO0FBQUEsRUFDbkMsT0FBTyxTQUFTLGVBQWUsS0FBSztBQUFBO0FBRXJDLFNBQVMsd0JBQXdCLENBQUMsS0FBSztBQUFBLEVBQ3RDLE9BQU8sU0FBUyw0QkFBaUMsV0FBRztBQUFBLElBQ25ELFFBQVE7QUFBQSxJQUNSLE1BQU0sS0FBSyxVQUFVLEdBQUc7QUFBQSxFQUN6QixDQUFDLEVBQUU7QUFBQTtBQUVKLFNBQVMscUJBQXFCLENBQUMsSUFBSTtBQUFBLEVBQ2xDLE9BQU8sU0FBUyxlQUFlLGNBQWM7QUFBQTtBQUU5QyxTQUFTLDhCQUE4QixDQUFDLElBQUk7QUFBQSxFQUMzQyxPQUFPLFNBQVMsZUFBZSx3QkFBd0I7QUFBQTtBQUV4RCxTQUFTLGNBQWMsQ0FBQyxJQUFJO0FBQUEsRUFDM0IsT0FBTyx5Q0FBeUM7QUFBQTtBQUVqRCxTQUFTLGlCQUFpQixDQUFDLFdBQVc7QUFBQSxFQUNyQyxLQUFLLGdCQUFnQixTQUFTLFdBQVcsMENBQTBDO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDN0YsT0FBTyxTQUFTLGVBQWUsVUFBVSxnQkFBZ0IsU0FBUztBQUFBO0FBRW5FLFNBQVMsa0JBQWtCLENBQUMsV0FBVztBQUFBLEVBQ3RDLEtBQUssZ0JBQWdCLFNBQVMsV0FBVywrQkFBK0I7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUNsRixPQUFPLFNBQVMsZUFBZSxVQUFVLGlCQUFpQixTQUFTO0FBQUE7QUFFcEUsU0FBUyxxQkFBcUIsQ0FBQyxXQUFXO0FBQUEsRUFDekMsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLGtDQUFrQztBQUFBLElBQUcsT0FBTztBQUFBLEVBQ3JGLE9BQU8sU0FBUyxlQUFlLFVBQVUsb0JBQW9CLFNBQVM7QUFBQTtBQUV2RSxTQUFTLHlCQUF5QixDQUFDLFdBQVc7QUFBQSxFQUM3QyxLQUFLLGdCQUFnQixTQUFTLFdBQVcsc0NBQXNDO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDekYsT0FBTyxTQUFTLGVBQWUsVUFBVSx3QkFBd0IsU0FBUztBQUFBO0FBRTNFLFNBQVMsZ0NBQWdDLENBQUMsV0FBVztBQUFBLEVBQ3BELEtBQUssZ0JBQWdCLFNBQVMsV0FBVyxzQ0FBc0M7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUN6RixPQUFPLFNBQVMsZUFBZSxVQUFVLGdDQUFnQyxTQUFTO0FBQUE7QUFFbkYsU0FBUyxrQkFBa0IsQ0FBQyxXQUFXO0FBQUEsRUFDdEMsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLCtCQUErQjtBQUFBLElBQUcsT0FBTztBQUFBLEVBQ2xGLE9BQU8sU0FBUyxlQUFlLFVBQVUsaUJBQWlCLFNBQVM7QUFBQTtBQUVwRSxTQUFTLHVCQUF1QixDQUFDLFdBQVc7QUFBQSxFQUMzQyxLQUFLLGdCQUFnQixTQUFTLFdBQVcsZ0NBQWdDO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDbkYsT0FBTyxTQUFTLGVBQWUsVUFBVSxrQkFBa0IsU0FBUztBQUFBO0FBRXJFLFNBQVMsc0JBQXNCLENBQUMsV0FBVztBQUFBLEVBQzFDLEtBQUssZ0JBQWdCLFNBQVMsV0FBVyxtQ0FBbUM7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUN0RixPQUFPLFNBQVMsZUFBZSxVQUFVLHFCQUFxQixTQUFTO0FBQUE7QUFFeEUsU0FBUyx5QkFBeUIsQ0FBQyxXQUFXO0FBQUEsRUFDN0MsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLHdDQUF3QztBQUFBLElBQUcsT0FBTztBQUFBLEVBQzNGLE9BQU8sU0FBUyxlQUFlLFVBQVUsMEJBQTBCLFNBQVM7QUFBQTtBQUU3RSxTQUFTLGtCQUFrQixDQUFDLFdBQVc7QUFBQSxFQUN0QyxLQUFLLGdCQUFnQixTQUFTLFdBQVcsMkJBQTJCO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDOUUsT0FBTyxTQUFTLGVBQWUsVUFBVSxpQkFBaUIsU0FBUztBQUFBO0FBRXBFLFNBQVMsb0JBQW9CLENBQUMsV0FBVztBQUFBLEVBQ3hDLEtBQUssZ0JBQWdCLFNBQVMsV0FBVyw2QkFBNkI7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUNoRixPQUFPLFNBQVMsZUFBZSxVQUFVLG1CQUFtQixTQUFTO0FBQUE7QUFFdEUsU0FBUyxrQkFBa0IsQ0FBQyxXQUFXO0FBQUEsRUFDdEMsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLDJCQUEyQjtBQUFBLElBQUcsT0FBTztBQUFBLEVBQzlFLE9BQU8sU0FBUyxlQUFlLFVBQVUsaUJBQWlCLFNBQVM7QUFBQTtBQUVwRSxTQUFTLDBCQUEwQixDQUFDLFdBQVcsS0FBSztBQUFBLEVBQ25ELEtBQUssZ0JBQWdCLFNBQVMsV0FBVywyQkFBMkI7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUM5RSxPQUFPLFNBQVMsZUFBZSxVQUFVLDJCQUEyQixXQUFXO0FBQUEsSUFDOUUsUUFBUTtBQUFBLElBQ1IsTUFBTSxLQUFLLFVBQVUsR0FBRztBQUFBLEVBQ3pCLENBQUM7QUFBQTtBQUVGLFNBQVMsc0JBQXNCLENBQUMsV0FBVyxLQUFLO0FBQUEsRUFDL0MsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLDJCQUEyQjtBQUFBLElBQUcsT0FBTztBQUFBLEVBQzlFLE9BQU8sU0FBUyxlQUFlLFVBQVUsdUJBQXVCLFdBQVc7QUFBQSxJQUMxRSxRQUFRO0FBQUEsSUFDUixNQUFNLEtBQUssVUFBVSxHQUFHO0FBQUEsRUFDekIsQ0FBQztBQUFBO0FBRUYsU0FBUyxrQkFBa0IsQ0FBQyxXQUFXO0FBQUEsRUFDdEMsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLHFDQUFxQztBQUFBLElBQUcsT0FBTztBQUFBLEVBQ3hGLE9BQU8sU0FBUyxlQUFlLFVBQVUsaUJBQWlCLFNBQVM7QUFBQTtBQUVwRSxTQUFTLDhCQUE4QixDQUFDLFdBQVcsUUFBUTtBQUFBLEVBQzFELEtBQUssZ0JBQWdCLFNBQVMsV0FBVyxxQ0FBcUM7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUN4RixPQUFPLFNBQVMsZUFBZSxVQUFVLDhCQUE4QixXQUFXO0FBQUEsSUFDakYsUUFBUTtBQUFBLElBQ1IsTUFBTSxLQUFLLFVBQVUsTUFBTTtBQUFBLEVBQzVCLENBQUM7QUFBQTtBQUVGLFNBQVMseUJBQXlCLENBQUMsV0FBVyxPQUFPLEdBQUc7QUFBQSxFQUN2RCxLQUFLLGdCQUFnQixTQUFTLFdBQVcscUNBQXFDO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDeEYsT0FBTyxTQUFTLGVBQWUsVUFBVSw4QkFBOEIsUUFBUSxTQUFTO0FBQUE7QUFFekYsU0FBUyxvQkFBb0IsQ0FBQyxXQUFXO0FBQUEsRUFDeEMsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLCtCQUErQjtBQUFBLElBQUcsT0FBTztBQUFBLEVBQ2xGLE9BQU8sU0FBUyxlQUFlLFVBQVUsbUJBQW1CLFNBQVM7QUFBQTtBQUV0RSxTQUFTLGtCQUFrQixDQUFDLFdBQVc7QUFBQSxFQUN0QyxLQUFLLGdCQUFnQixTQUFTLFdBQVcsNkJBQTZCO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDaEYsT0FBTyxTQUFTLGVBQWUsVUFBVSxpQkFBaUIsU0FBUztBQUFBO0FBRXBFLFNBQVMsdUJBQXVCLENBQUMsV0FBVztBQUFBLEVBQzNDLEtBQUssZ0JBQWdCLFNBQVMsV0FBVyxnQ0FBZ0M7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUNuRixPQUFPLFNBQVMsZUFBZSxVQUFVLGVBQWUsU0FBUztBQUFBOzs7QUN0SWxFLElBQUksc0JBQXNCLENBQUM7QUFDM0IsU0FBUyxxQkFBcUI7QUFBQSxFQUM3QiwrQkFBK0IsTUFBTTtBQUFBLEVBQ3JDLDhCQUE4QixNQUFNO0FBQUEsRUFDcEMsMEJBQTBCLE1BQU07QUFBQSxFQUNoQyxzQkFBc0IsTUFBTTtBQUFBLEVBQzVCLG9CQUFvQixNQUFNO0FBQUEsRUFDMUIscUJBQXFCLE1BQU07QUFDNUIsQ0FBQztBQUNELGVBQWUsa0JBQWtCLENBQUMsSUFBSTtBQUFBLEVBQ3JDLE9BQU8sTUFBTSxTQUFTLGlCQUFpQixLQUFLO0FBQUE7QUFFN0MsZUFBZSw2QkFBNkIsQ0FBQyxJQUFJO0FBQUEsRUFDaEQsT0FBTyxNQUFNLFNBQVMsaUJBQWlCLHFCQUFxQjtBQUFBO0FBRTdELGVBQWUsbUJBQW1CLENBQUMsSUFBSTtBQUFBLEVBQ3RDLE9BQU8sTUFBTSxTQUFTLGlCQUFpQixXQUFXO0FBQUE7QUFFbkQsZUFBZSxvQkFBb0IsQ0FBQyxJQUFJLFdBQVc7QUFBQSxFQUNsRCxLQUFLLGdCQUFnQixTQUFTLFdBQVcsdUNBQXVDO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDMUYsT0FBTyxNQUFNLFNBQVMsaUJBQWlCLGNBQWMsU0FBUztBQUFBO0FBRS9ELGVBQWUsNEJBQTRCLENBQUMsSUFBSSxXQUFXLEtBQUs7QUFBQSxFQUMvRCxLQUFLLGdCQUFnQixTQUFTLFdBQVcsdUNBQXVDO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDMUYsT0FBTyxNQUFNLFNBQVMsaUJBQWlCLHdCQUF3QixXQUFXO0FBQUEsSUFDekUsUUFBUTtBQUFBLElBQ1IsTUFBTSxLQUFLLFVBQVUsR0FBRztBQUFBLEVBQ3pCLENBQUM7QUFBQTtBQUVGLGVBQWUsd0JBQXdCLENBQUMsSUFBSSxXQUFXLEtBQUs7QUFBQSxFQUMzRCxLQUFLLGdCQUFnQixTQUFTLFdBQVcsdUNBQXVDO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDMUYsT0FBTyxNQUFNLFNBQVMsaUJBQWlCLG9CQUFvQixXQUFXO0FBQUEsSUFDckUsUUFBUTtBQUFBLElBQ1IsTUFBTSxLQUFLLFVBQVUsR0FBRztBQUFBLEVBQ3pCLENBQUM7QUFBQTs7O0FDcENGLElBQUksbUJBQW1CLENBQUM7QUFDeEIsU0FBUyxrQkFBa0I7QUFBQSxFQUMxQix5QkFBeUIsTUFBTTtBQUFBLEVBQy9CLGlCQUFpQixNQUFNO0FBQUEsRUFDdkIsa0JBQWtCLE1BQU07QUFDekIsQ0FBQztBQUNELGVBQWUsZUFBZSxDQUFDLElBQUk7QUFBQSxFQUNsQyxPQUFPLE1BQU0sU0FBUyxjQUFjLEtBQUs7QUFBQTtBQUUxQyxlQUFlLHVCQUF1QixDQUFDLElBQUk7QUFBQSxFQUMxQyxPQUFPLE1BQU0sU0FBUyxjQUFjLGtCQUFrQjtBQUFBO0FBRXZELGVBQWUsZ0JBQWdCLENBQUMsSUFBSTtBQUFBLEVBQ25DLE9BQU8sTUFBTSxTQUFTLGNBQWMsV0FBVztBQUFBOzs7QUNSaEQsU0FBUyxzQkFBc0IsQ0FBQyxXQUFXO0FBQUEsRUFDMUMsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLCtCQUErQjtBQUFBLElBQUcsT0FBTztBQUFBLEVBQ2xGLE9BQU8sU0FBUyxlQUFlLFVBQVUsb0JBQW9CLFNBQVM7QUFBQTtBQU12RSxTQUFTLDJCQUEyQixDQUFDLGFBQWE7QUFBQSxFQUNqRCxNQUFNLHlCQUF5QixZQUFZLG9CQUFvQixZQUFZLGtCQUFrQixZQUFZO0FBQUEsRUFDekcsTUFBTSxpQ0FBaUMsSUFBSSxLQUFLLEdBQUcsUUFBUSxJQUFJLElBQUksS0FBSyxZQUFZLFVBQVUsRUFBRSxRQUFRLE1BQU0sSUFBSSxLQUFLLFlBQVksV0FBVyxFQUFFLFFBQVEsSUFBSSxJQUFJLEtBQUssWUFBWSxVQUFVLEVBQUUsUUFBUTtBQUFBLEVBQ3JNLE9BQU8seUJBQXlCLElBQUkseUJBQXlCO0FBQUE7OztBQ25COUQsSUFBSSxJQUFFLE9BQU8sSUFBSSxPQUFPO0FBQUUsU0FBUyxDQUFDLENBQUMsR0FBRTtBQUFBLEVBQUMsT0FBTyxFQUFFLE1BQUssQ0FBQztBQUFBO0FBQUUsU0FBUyxDQUFDLENBQUMsS0FBRyxVQUFTLE1BQUssS0FBRyxHQUFFO0FBQUEsRUFBQyxJQUFJLElBQUU7QUFBQSxFQUFFLElBQUcsTUFBTSxRQUFRLENBQUMsTUFBSSxFQUFFLENBQUM7QUFBQSxJQUFFLElBQUUsRUFBRSxJQUFJLENBQUMsTUFBSSxJQUFJLEtBQUcsSUFBRSxFQUFFLEVBQUMsVUFBUyxFQUFDLENBQUMsQ0FBQztBQUFBLEVBQUUsT0FBTyxPQUFPLE9BQU8sQ0FBQyxHQUFFLEtBQUksR0FBRSxLQUFJLEVBQUMsR0FBRSxDQUFDLEdBQUUsR0FBRSxJQUFHLEtBQUUsQ0FBQztBQUFBO0FBQUUsU0FBUyxDQUFDLENBQUMsR0FBRTtBQUFBLEVBQUMsT0FBTyxNQUFNLFFBQVEsQ0FBQyxPQUFLLEtBQUssTUFBSSxFQUFFLENBQUM7QUFBQTtBQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUU7QUFBQSxFQUFDLE9BQU8sSUFBSSxPQUFLLFVBQVEsT0FBTyxFQUFFLElBQUksU0FBTztBQUFBOzs7QUNDelUsU0FBd0IsR0FBRyxHQUFFLFFBQU87QUFBQSxFQUNsQyxNQUFNLE9BQU8sS0FBSyxtQkFBbUIsZ0JBQWdCLEtBQUssS0FBSyxlQUFlO0FBQUEsRUFDOUUsT0FBTyxFQUFnQixPQUFPO0FBQUEsSUFDNUIsT0FBTztBQUFBLElBQ1AsVUFBVSxDQUFDLEVBQWdCLE9BQU87QUFBQSxNQUNoQyxPQUFPO0FBQUEsTUFDUCxVQUFVLEVBQWdCLEtBQUs7QUFBQSxRQUM3QixPQUFPO0FBQUEsUUFDUCxVQUFVO0FBQUEsTUFDWixHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUk7QUFBQSxJQUN0QyxHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUksR0FBRyxFQUFnQixPQUFPO0FBQUEsTUFDNUQsT0FBTztBQUFBLE1BQ1AsVUFBVSxDQUFDLEVBQWdCLFNBQVM7QUFBQSxRQUNsQyxNQUFNO0FBQUEsUUFDTixhQUFhO0FBQUEsUUFDYixPQUFPO0FBQUEsTUFDVCxHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUksR0FBRyxFQUFnQixPQUFPO0FBQUEsUUFDNUQsT0FBTztBQUFBLFFBQ1AsVUFBVSxDQUFDLEVBQWdCLE9BQU87QUFBQSxVQUNoQyxVQUFVO0FBQUEsVUFDVixNQUFNO0FBQUEsVUFDTixPQUFPO0FBQUEsVUFDUCxVQUFVLEVBQWdCLE9BQU87QUFBQSxZQUMvQixPQUFPO0FBQUEsWUFDUCxVQUFVLEVBQWdCLE9BQU87QUFBQSxjQUMvQixLQUFLO0FBQUEsY0FDTCxLQUFLLFFBQVEsa0JBQWEsZUFBZSxLQUFLLEtBQUssS0FBSztBQUFBLFlBQzFELEdBQUcsV0FBVyxPQUFPLFdBQVcsSUFBSTtBQUFBLFVBQ3RDLEdBQUcsV0FBVyxPQUFPLFdBQVcsSUFBSTtBQUFBLFFBQ3RDLEdBQUcsV0FBVyxPQUFPLFdBQVcsSUFBSSxHQUFHLEVBQWdCLE1BQU07QUFBQSxVQUMzRCxVQUFVO0FBQUEsVUFDVixPQUFPO0FBQUEsVUFDUCxVQUFVLENBQUMsRUFBZ0IsTUFBTTtBQUFBLFlBQy9CLFVBQVUsUUFBUSxLQUFLO0FBQUEsVUFDekIsR0FBRyxXQUFXLE9BQU8sV0FBVyxJQUFJLEdBQUcsRUFBZ0IsTUFBTTtBQUFBLFlBQzNELFVBQVUsRUFBZ0IsS0FBSztBQUFBLGNBQzdCLE9BQU87QUFBQSxjQUNQLFVBQVUsQ0FBQyxjQUFjLEVBQWdCLFFBQVE7QUFBQSxnQkFDL0MsT0FBTztBQUFBLGdCQUNQLFVBQVUsS0FBSyxhQUFhO0FBQUEsY0FDOUIsR0FBRyxXQUFXLE9BQU8sV0FBVyxJQUFJLENBQUM7QUFBQSxZQUN2QyxHQUFHLFdBQVcsTUFBTSxXQUFXLElBQUk7QUFBQSxVQUNyQyxHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUksR0FBRyxFQUFnQixNQUFNO0FBQUEsWUFDM0QsVUFBVSxFQUFnQixLQUFLO0FBQUEsY0FDN0IsVUFBVTtBQUFBLFlBQ1osR0FBRyxXQUFXLE9BQU8sV0FBVyxJQUFJO0FBQUEsVUFDdEMsR0FBRyxXQUFXLE9BQU8sV0FBVyxJQUFJLEdBQUcsRUFBZ0IsTUFBTTtBQUFBLFlBQzNELFVBQVUsRUFBZ0IsS0FBSztBQUFBLGNBQzdCLFVBQVU7QUFBQSxZQUNaLEdBQUcsV0FBVyxPQUFPLFdBQVcsSUFBSTtBQUFBLFVBQ3RDLEdBQUcsV0FBVyxPQUFPLFdBQVcsSUFBSSxHQUFHLEVBQWdCLE1BQU07QUFBQSxZQUMzRCxVQUFVLEVBQWdCLEtBQUs7QUFBQSxjQUM3QixVQUFVO0FBQUEsWUFDWixHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUk7QUFBQSxVQUN0QyxHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUksQ0FBQztBQUFBLFFBQ3ZDLEdBQUcsV0FBVyxNQUFNLFdBQVcsSUFBSSxDQUFDO0FBQUEsTUFDdEMsR0FBRyxXQUFXLE1BQU0sV0FBVyxJQUFJLENBQUM7QUFBQSxJQUN0QyxHQUFHLFdBQVcsTUFBTSxXQUFXLElBQUksQ0FBQztBQUFBLEVBQ3RDLEdBQUcsV0FBVyxNQUFNLFdBQVcsSUFBSTtBQUFBOztBQ3JEckMsU0FBd0IsTUFBTSxHQUFFLFlBQVcsU0FBUztBQUFBLEVBQ2xELE1BQU0sT0FBTyxXQUFXLEtBQUssQ0FBQztBQUFBLEVBQzlCLE9BQU8sRUFBZ0IsUUFBUTtBQUFBLElBQzdCLE1BQU07QUFBQSxJQUNOLGNBQWM7QUFBQSxJQUNkLFVBQVUsQ0FBQyxFQUFnQixRQUFRO0FBQUEsTUFDakMsVUFBVSxDQUFDLEVBQWdCLFNBQVM7QUFBQSxRQUNsQyxJQUFJO0FBQUEsUUFDSixVQUFVO0FBQUEsTUFDWixHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUksR0FBRyxFQUFnQixRQUFRO0FBQUEsUUFDN0QsTUFBTTtBQUFBLFFBQ04sU0FBUztBQUFBLE1BQ1gsR0FBRyxXQUFXLE9BQU8sV0FBVyxJQUFJLEdBQUcsRUFBZ0IsUUFBUTtBQUFBLFFBQzdELEtBQUs7QUFBQSxRQUNMLE1BQU07QUFBQSxNQUNSLEdBQUcsV0FBVyxPQUFPLFdBQVcsSUFBSSxHQUFHLEVBQWdCLFFBQVE7QUFBQSxRQUM3RCxLQUFLO0FBQUEsUUFDTCxNQUFNO0FBQUEsTUFDUixHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUksR0FBRyxFQUFnQixRQUFRO0FBQUEsUUFDN0QsS0FBSztBQUFBLFFBQ0wsTUFBTTtBQUFBLFFBQ04sYUFBYTtBQUFBLE1BQ2YsR0FBRyxXQUFXLE9BQU8sV0FBVyxJQUFJLEdBQUcsRUFBZ0IsUUFBUTtBQUFBLFFBQzdELE1BQU07QUFBQSxRQUNOLEtBQUs7QUFBQSxNQUNQLEdBQUcsV0FBVyxPQUFPLFdBQVcsSUFBSSxHQUFHLEVBQWdCLFFBQVE7QUFBQSxRQUM3RCxNQUFNO0FBQUEsUUFDTixTQUFTO0FBQUEsTUFDWCxHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUksQ0FBQztBQUFBLElBQ3ZDLEdBQUcsV0FBVyxNQUFNLFdBQVcsSUFBSSxHQUFHLEVBQWdCLFFBQVE7QUFBQSxNQUM1RCxVQUFVLENBQUMsRUFBZ0IsVUFBVTtBQUFBLFFBQ25DLFVBQVUsRUFBZ0IsS0FBSztBQUFBLFVBQzdCO0FBQUEsUUFDRixHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUk7QUFBQSxNQUN0QyxHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUksR0FBRyxFQUFnQixRQUFRO0FBQUEsUUFDN0Q7QUFBQSxNQUNGLEdBQUcsV0FBVyxPQUFPLFdBQVcsSUFBSSxDQUFDO0FBQUEsSUFDdkMsR0FBRyxXQUFXLE1BQU0sV0FBVyxJQUFJLENBQUM7QUFBQSxFQUN0QyxHQUFHLFdBQVcsTUFBTSxXQUFXLElBQUk7QUFBQTsiLAogICJkZWJ1Z0lkIjogIjQ2Q0JFMTFCNjFENjM5MjI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|