diff --git a/.gitignore b/.gitignore
index b5b913d..e09a007 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,7 +10,7 @@ node_modules
# Don't include the compiled main.js file in the repo.
# They should be uploaded to GitHub releases instead.
-# main.js
+main.js
# Exclude sourcemaps
*.map
diff --git a/main.js b/main.js
deleted file mode 100644
index 505dfa5..0000000
--- a/main.js
+++ /dev/null
@@ -1,14931 +0,0 @@
-/*
-THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
-if you want to view the source, please visit the github repository of this plugin
-*/
-
-var __create = Object.create;
-var __defProp = Object.defineProperty;
-var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
-var __getOwnPropNames = Object.getOwnPropertyNames;
-var __getOwnPropSymbols = Object.getOwnPropertySymbols;
-var __getProtoOf = Object.getPrototypeOf;
-var __hasOwnProp = Object.prototype.hasOwnProperty;
-var __propIsEnum = Object.prototype.propertyIsEnumerable;
-var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
-var __spreadValues = (a, b) => {
- for (var prop in b || (b = {}))
- if (__hasOwnProp.call(b, prop))
- __defNormalProp(a, prop, b[prop]);
- if (__getOwnPropSymbols)
- for (var prop of __getOwnPropSymbols(b)) {
- if (__propIsEnum.call(b, prop))
- __defNormalProp(a, prop, b[prop]);
- }
- return a;
-};
-var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
-var __commonJS = (cb, mod) => function __require() {
- return mod || (0, cb[Object.keys(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
-};
-var __export = (target, all) => {
- __markAsModule(target);
- for (var name in all)
- __defProp(target, name, { get: all[name], enumerable: true });
-};
-var __reExport = (target, module2, desc) => {
- if (module2 && typeof module2 === "object" || typeof module2 === "function") {
- for (let key of __getOwnPropNames(module2))
- if (!__hasOwnProp.call(target, key) && key !== "default")
- __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
- }
- return target;
-};
-var __toModule = (module2) => {
- return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
-};
-var __async = (__this, __arguments, generator) => {
- return new Promise((resolve, reject) => {
- var fulfilled = (value) => {
- try {
- step(generator.next(value));
- } catch (e) {
- reject(e);
- }
- };
- var rejected = (value) => {
- try {
- step(generator.throw(value));
- } catch (e) {
- reject(e);
- }
- };
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
- step((generator = generator.apply(__this, __arguments)).next());
- });
-};
-
-// node_modules/bail/index.js
-var require_bail = __commonJS({
- "node_modules/bail/index.js"(exports, module2) {
- "use strict";
- module2.exports = bail;
- function bail(err) {
- if (err) {
- throw err;
- }
- }
- }
-});
-
-// node_modules/is-buffer/index.js
-var require_is_buffer = __commonJS({
- "node_modules/is-buffer/index.js"(exports, module2) {
- module2.exports = function isBuffer(obj) {
- return obj != null && obj.constructor != null && typeof obj.constructor.isBuffer === "function" && obj.constructor.isBuffer(obj);
- };
- }
-});
-
-// node_modules/extend/index.js
-var require_extend = __commonJS({
- "node_modules/extend/index.js"(exports, module2) {
- "use strict";
- var hasOwn = Object.prototype.hasOwnProperty;
- var toStr = Object.prototype.toString;
- var defineProperty = Object.defineProperty;
- var gOPD = Object.getOwnPropertyDescriptor;
- var isArray = function isArray2(arr) {
- if (typeof Array.isArray === "function") {
- return Array.isArray(arr);
- }
- return toStr.call(arr) === "[object Array]";
- };
- var isPlainObject = function isPlainObject2(obj) {
- if (!obj || toStr.call(obj) !== "[object Object]") {
- return false;
- }
- var hasOwnConstructor = hasOwn.call(obj, "constructor");
- var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, "isPrototypeOf");
- if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {
- return false;
- }
- var key;
- for (key in obj) {
- }
- return typeof key === "undefined" || hasOwn.call(obj, key);
- };
- var setProperty = function setProperty2(target, options) {
- if (defineProperty && options.name === "__proto__") {
- defineProperty(target, options.name, {
- enumerable: true,
- configurable: true,
- value: options.newValue,
- writable: true
- });
- } else {
- target[options.name] = options.newValue;
- }
- };
- var getProperty = function getProperty2(obj, name) {
- if (name === "__proto__") {
- if (!hasOwn.call(obj, name)) {
- return void 0;
- } else if (gOPD) {
- return gOPD(obj, name).value;
- }
- }
- return obj[name];
- };
- module2.exports = function extend() {
- var options, name, src, copy, copyIsArray, clone;
- var target = arguments[0];
- var i = 1;
- var length = arguments.length;
- var deep = false;
- if (typeof target === "boolean") {
- deep = target;
- target = arguments[1] || {};
- i = 2;
- }
- if (target == null || typeof target !== "object" && typeof target !== "function") {
- target = {};
- }
- for (; i < length; ++i) {
- options = arguments[i];
- if (options != null) {
- for (name in options) {
- src = getProperty(target, name);
- copy = getProperty(options, name);
- if (target !== copy) {
- if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {
- if (copyIsArray) {
- copyIsArray = false;
- clone = src && isArray(src) ? src : [];
- } else {
- clone = src && isPlainObject(src) ? src : {};
- }
- setProperty(target, { name, newValue: extend(deep, clone, copy) });
- } else if (typeof copy !== "undefined") {
- setProperty(target, { name, newValue: copy });
- }
- }
- }
- }
- }
- return target;
- };
- }
-});
-
-// node_modules/is-plain-obj/index.js
-var require_is_plain_obj = __commonJS({
- "node_modules/is-plain-obj/index.js"(exports, module2) {
- "use strict";
- module2.exports = (value) => {
- if (Object.prototype.toString.call(value) !== "[object Object]") {
- return false;
- }
- const prototype = Object.getPrototypeOf(value);
- return prototype === null || prototype === Object.prototype;
- };
- }
-});
-
-// node_modules/trough/wrap.js
-var require_wrap = __commonJS({
- "node_modules/trough/wrap.js"(exports, module2) {
- "use strict";
- var slice = [].slice;
- module2.exports = wrap;
- function wrap(fn, callback) {
- var invoked;
- return wrapped;
- function wrapped() {
- var params = slice.call(arguments, 0);
- var callback2 = fn.length > params.length;
- var result;
- if (callback2) {
- params.push(done);
- }
- try {
- result = fn.apply(null, params);
- } catch (error) {
- if (callback2 && invoked) {
- throw error;
- }
- return done(error);
- }
- if (!callback2) {
- if (result && typeof result.then === "function") {
- result.then(then, done);
- } else if (result instanceof Error) {
- done(result);
- } else {
- then(result);
- }
- }
- }
- function done() {
- if (!invoked) {
- invoked = true;
- callback.apply(null, arguments);
- }
- }
- function then(value) {
- done(null, value);
- }
- }
- }
-});
-
-// node_modules/trough/index.js
-var require_trough = __commonJS({
- "node_modules/trough/index.js"(exports, module2) {
- "use strict";
- var wrap = require_wrap();
- module2.exports = trough;
- trough.wrap = wrap;
- var slice = [].slice;
- function trough() {
- var fns = [];
- var middleware = {};
- middleware.run = run;
- middleware.use = use;
- return middleware;
- function run() {
- var index = -1;
- var input = slice.call(arguments, 0, -1);
- var done = arguments[arguments.length - 1];
- if (typeof done !== "function") {
- throw new Error("Expected function as last argument, not " + done);
- }
- next.apply(null, [null].concat(input));
- function next(err) {
- var fn = fns[++index];
- var params = slice.call(arguments, 0);
- var values = params.slice(1);
- var length = input.length;
- var pos = -1;
- if (err) {
- done(err);
- return;
- }
- while (++pos < length) {
- if (values[pos] === null || values[pos] === void 0) {
- values[pos] = input[pos];
- }
- }
- input = values;
- if (fn) {
- wrap(fn, next).apply(null, input);
- } else {
- done.apply(null, [null].concat(input));
- }
- }
- }
- function use(fn) {
- if (typeof fn !== "function") {
- throw new Error("Expected `fn` to be a function, not " + fn);
- }
- fns.push(fn);
- return middleware;
- }
- }
- }
-});
-
-// node_modules/unist-util-stringify-position/index.js
-var require_unist_util_stringify_position = __commonJS({
- "node_modules/unist-util-stringify-position/index.js"(exports, module2) {
- "use strict";
- var own = {}.hasOwnProperty;
- module2.exports = stringify4;
- function stringify4(value) {
- if (!value || typeof value !== "object") {
- return "";
- }
- if (own.call(value, "position") || own.call(value, "type")) {
- return position(value.position);
- }
- if (own.call(value, "start") || own.call(value, "end")) {
- return position(value);
- }
- if (own.call(value, "line") || own.call(value, "column")) {
- return point(value);
- }
- return "";
- }
- function point(point2) {
- if (!point2 || typeof point2 !== "object") {
- point2 = {};
- }
- return index(point2.line) + ":" + index(point2.column);
- }
- function position(pos) {
- if (!pos || typeof pos !== "object") {
- pos = {};
- }
- return point(pos.start) + "-" + point(pos.end);
- }
- function index(value) {
- return value && typeof value === "number" ? value : 1;
- }
- }
-});
-
-// node_modules/vfile-message/index.js
-var require_vfile_message = __commonJS({
- "node_modules/vfile-message/index.js"(exports, module2) {
- "use strict";
- var stringify4 = require_unist_util_stringify_position();
- module2.exports = VMessage;
- function VMessagePrototype() {
- }
- VMessagePrototype.prototype = Error.prototype;
- VMessage.prototype = new VMessagePrototype();
- var proto = VMessage.prototype;
- proto.file = "";
- proto.name = "";
- proto.reason = "";
- proto.message = "";
- proto.stack = "";
- proto.fatal = null;
- proto.column = null;
- proto.line = null;
- function VMessage(reason, position, origin) {
- var parts;
- var range;
- var location;
- if (typeof position === "string") {
- origin = position;
- position = null;
- }
- parts = parseOrigin(origin);
- range = stringify4(position) || "1:1";
- location = {
- start: { line: null, column: null },
- end: { line: null, column: null }
- };
- if (position && position.position) {
- position = position.position;
- }
- if (position) {
- if (position.start) {
- location = position;
- position = position.start;
- } else {
- location.start = position;
- }
- }
- if (reason.stack) {
- this.stack = reason.stack;
- reason = reason.message;
- }
- this.message = reason;
- this.name = range;
- this.reason = reason;
- this.line = position ? position.line : null;
- this.column = position ? position.column : null;
- this.location = location;
- this.source = parts[0];
- this.ruleId = parts[1];
- }
- function parseOrigin(origin) {
- var result = [null, null];
- var index;
- if (typeof origin === "string") {
- index = origin.indexOf(":");
- if (index === -1) {
- result[1] = origin;
- } else {
- result[0] = origin.slice(0, index);
- result[1] = origin.slice(index + 1);
- }
- }
- return result;
- }
- }
-});
-
-// node_modules/vfile/lib/minpath.browser.js
-var require_minpath_browser = __commonJS({
- "node_modules/vfile/lib/minpath.browser.js"(exports) {
- "use strict";
- exports.basename = basename;
- exports.dirname = dirname;
- exports.extname = extname;
- exports.join = join2;
- exports.sep = "/";
- function basename(path, ext) {
- var start = 0;
- var end = -1;
- var index;
- var firstNonSlashEnd;
- var seenNonSlash;
- var extIndex;
- if (ext !== void 0 && typeof ext !== "string") {
- throw new TypeError('"ext" argument must be a string');
- }
- assertPath(path);
- index = path.length;
- if (ext === void 0 || !ext.length || ext.length > path.length) {
- while (index--) {
- if (path.charCodeAt(index) === 47) {
- if (seenNonSlash) {
- start = index + 1;
- break;
- }
- } else if (end < 0) {
- seenNonSlash = true;
- end = index + 1;
- }
- }
- return end < 0 ? "" : path.slice(start, end);
- }
- if (ext === path) {
- return "";
- }
- firstNonSlashEnd = -1;
- extIndex = ext.length - 1;
- while (index--) {
- if (path.charCodeAt(index) === 47) {
- if (seenNonSlash) {
- start = index + 1;
- break;
- }
- } else {
- if (firstNonSlashEnd < 0) {
- seenNonSlash = true;
- firstNonSlashEnd = index + 1;
- }
- if (extIndex > -1) {
- if (path.charCodeAt(index) === ext.charCodeAt(extIndex--)) {
- if (extIndex < 0) {
- end = index;
- }
- } else {
- extIndex = -1;
- end = firstNonSlashEnd;
- }
- }
- }
- }
- if (start === end) {
- end = firstNonSlashEnd;
- } else if (end < 0) {
- end = path.length;
- }
- return path.slice(start, end);
- }
- function dirname(path) {
- var end;
- var unmatchedSlash;
- var index;
- assertPath(path);
- if (!path.length) {
- return ".";
- }
- end = -1;
- index = path.length;
- while (--index) {
- if (path.charCodeAt(index) === 47) {
- if (unmatchedSlash) {
- end = index;
- break;
- }
- } else if (!unmatchedSlash) {
- unmatchedSlash = true;
- }
- }
- return end < 0 ? path.charCodeAt(0) === 47 ? "/" : "." : end === 1 && path.charCodeAt(0) === 47 ? "//" : path.slice(0, end);
- }
- function extname(path) {
- var startDot = -1;
- var startPart = 0;
- var end = -1;
- var preDotState = 0;
- var unmatchedSlash;
- var code;
- var index;
- assertPath(path);
- index = path.length;
- while (index--) {
- code = path.charCodeAt(index);
- if (code === 47) {
- if (unmatchedSlash) {
- startPart = index + 1;
- break;
- }
- continue;
- }
- if (end < 0) {
- unmatchedSlash = true;
- end = index + 1;
- }
- if (code === 46) {
- if (startDot < 0) {
- startDot = index;
- } else if (preDotState !== 1) {
- preDotState = 1;
- }
- } else if (startDot > -1) {
- preDotState = -1;
- }
- }
- if (startDot < 0 || end < 0 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
- return "";
- }
- return path.slice(startDot, end);
- }
- function join2() {
- var index = -1;
- var joined;
- while (++index < arguments.length) {
- assertPath(arguments[index]);
- if (arguments[index]) {
- joined = joined === void 0 ? arguments[index] : joined + "/" + arguments[index];
- }
- }
- return joined === void 0 ? "." : normalize(joined);
- }
- function normalize(path) {
- var absolute;
- var value;
- assertPath(path);
- absolute = path.charCodeAt(0) === 47;
- value = normalizeString(path, !absolute);
- if (!value.length && !absolute) {
- value = ".";
- }
- if (value.length && path.charCodeAt(path.length - 1) === 47) {
- value += "/";
- }
- return absolute ? "/" + value : value;
- }
- function normalizeString(path, allowAboveRoot) {
- var result = "";
- var lastSegmentLength = 0;
- var lastSlash = -1;
- var dots = 0;
- var index = -1;
- var code;
- var lastSlashIndex;
- while (++index <= path.length) {
- if (index < path.length) {
- code = path.charCodeAt(index);
- } else if (code === 47) {
- break;
- } else {
- code = 47;
- }
- if (code === 47) {
- if (lastSlash === index - 1 || dots === 1) {
- } else if (lastSlash !== index - 1 && dots === 2) {
- if (result.length < 2 || lastSegmentLength !== 2 || result.charCodeAt(result.length - 1) !== 46 || result.charCodeAt(result.length - 2) !== 46) {
- if (result.length > 2) {
- lastSlashIndex = result.lastIndexOf("/");
- if (lastSlashIndex !== result.length - 1) {
- if (lastSlashIndex < 0) {
- result = "";
- lastSegmentLength = 0;
- } else {
- result = result.slice(0, lastSlashIndex);
- lastSegmentLength = result.length - 1 - result.lastIndexOf("/");
- }
- lastSlash = index;
- dots = 0;
- continue;
- }
- } else if (result.length) {
- result = "";
- lastSegmentLength = 0;
- lastSlash = index;
- dots = 0;
- continue;
- }
- }
- if (allowAboveRoot) {
- result = result.length ? result + "/.." : "..";
- lastSegmentLength = 2;
- }
- } else {
- if (result.length) {
- result += "/" + path.slice(lastSlash + 1, index);
- } else {
- result = path.slice(lastSlash + 1, index);
- }
- lastSegmentLength = index - lastSlash - 1;
- }
- lastSlash = index;
- dots = 0;
- } else if (code === 46 && dots > -1) {
- dots++;
- } else {
- dots = -1;
- }
- }
- return result;
- }
- function assertPath(path) {
- if (typeof path !== "string") {
- throw new TypeError("Path must be a string. Received " + JSON.stringify(path));
- }
- }
- }
-});
-
-// node_modules/vfile/lib/minproc.browser.js
-var require_minproc_browser = __commonJS({
- "node_modules/vfile/lib/minproc.browser.js"(exports) {
- "use strict";
- exports.cwd = cwd;
- function cwd() {
- return "/";
- }
- }
-});
-
-// node_modules/vfile/lib/core.js
-var require_core = __commonJS({
- "node_modules/vfile/lib/core.js"(exports, module2) {
- "use strict";
- var p = require_minpath_browser();
- var proc = require_minproc_browser();
- var buffer = require_is_buffer();
- module2.exports = VFile;
- var own = {}.hasOwnProperty;
- var order = ["history", "path", "basename", "stem", "extname", "dirname"];
- VFile.prototype.toString = toString;
- Object.defineProperty(VFile.prototype, "path", { get: getPath, set: setPath });
- Object.defineProperty(VFile.prototype, "dirname", {
- get: getDirname,
- set: setDirname
- });
- Object.defineProperty(VFile.prototype, "basename", {
- get: getBasename,
- set: setBasename
- });
- Object.defineProperty(VFile.prototype, "extname", {
- get: getExtname,
- set: setExtname
- });
- Object.defineProperty(VFile.prototype, "stem", { get: getStem, set: setStem });
- function VFile(options) {
- var prop;
- var index;
- if (!options) {
- options = {};
- } else if (typeof options === "string" || buffer(options)) {
- options = { contents: options };
- } else if ("message" in options && "messages" in options) {
- return options;
- }
- if (!(this instanceof VFile)) {
- return new VFile(options);
- }
- this.data = {};
- this.messages = [];
- this.history = [];
- this.cwd = proc.cwd();
- index = -1;
- while (++index < order.length) {
- prop = order[index];
- if (own.call(options, prop)) {
- this[prop] = options[prop];
- }
- }
- for (prop in options) {
- if (order.indexOf(prop) < 0) {
- this[prop] = options[prop];
- }
- }
- }
- function getPath() {
- return this.history[this.history.length - 1];
- }
- function setPath(path) {
- assertNonEmpty(path, "path");
- if (this.path !== path) {
- this.history.push(path);
- }
- }
- function getDirname() {
- return typeof this.path === "string" ? p.dirname(this.path) : void 0;
- }
- function setDirname(dirname) {
- assertPath(this.path, "dirname");
- this.path = p.join(dirname || "", this.basename);
- }
- function getBasename() {
- return typeof this.path === "string" ? p.basename(this.path) : void 0;
- }
- function setBasename(basename) {
- assertNonEmpty(basename, "basename");
- assertPart(basename, "basename");
- this.path = p.join(this.dirname || "", basename);
- }
- function getExtname() {
- return typeof this.path === "string" ? p.extname(this.path) : void 0;
- }
- function setExtname(extname) {
- assertPart(extname, "extname");
- assertPath(this.path, "extname");
- if (extname) {
- if (extname.charCodeAt(0) !== 46) {
- throw new Error("`extname` must start with `.`");
- }
- if (extname.indexOf(".", 1) > -1) {
- throw new Error("`extname` cannot contain multiple dots");
- }
- }
- this.path = p.join(this.dirname, this.stem + (extname || ""));
- }
- function getStem() {
- return typeof this.path === "string" ? p.basename(this.path, this.extname) : void 0;
- }
- function setStem(stem) {
- assertNonEmpty(stem, "stem");
- assertPart(stem, "stem");
- this.path = p.join(this.dirname || "", stem + (this.extname || ""));
- }
- function toString(encoding) {
- return (this.contents || "").toString(encoding);
- }
- function assertPart(part, name) {
- if (part && part.indexOf(p.sep) > -1) {
- throw new Error("`" + name + "` cannot be a path: did not expect `" + p.sep + "`");
- }
- }
- function assertNonEmpty(part, name) {
- if (!part) {
- throw new Error("`" + name + "` cannot be empty");
- }
- }
- function assertPath(path, name) {
- if (!path) {
- throw new Error("Setting `" + name + "` requires `path` to be set too");
- }
- }
- }
-});
-
-// node_modules/vfile/lib/index.js
-var require_lib = __commonJS({
- "node_modules/vfile/lib/index.js"(exports, module2) {
- "use strict";
- var VMessage = require_vfile_message();
- var VFile = require_core();
- module2.exports = VFile;
- VFile.prototype.message = message;
- VFile.prototype.info = info;
- VFile.prototype.fail = fail;
- function message(reason, position, origin) {
- var message2 = new VMessage(reason, position, origin);
- if (this.path) {
- message2.name = this.path + ":" + message2.name;
- message2.file = this.path;
- }
- message2.fatal = false;
- this.messages.push(message2);
- return message2;
- }
- function fail() {
- var message2 = this.message.apply(this, arguments);
- message2.fatal = true;
- throw message2;
- }
- function info() {
- var message2 = this.message.apply(this, arguments);
- message2.fatal = null;
- return message2;
- }
- }
-});
-
-// node_modules/vfile/index.js
-var require_vfile = __commonJS({
- "node_modules/vfile/index.js"(exports, module2) {
- "use strict";
- module2.exports = require_lib();
- }
-});
-
-// node_modules/unified/index.js
-var require_unified = __commonJS({
- "node_modules/unified/index.js"(exports, module2) {
- "use strict";
- var bail = require_bail();
- var buffer = require_is_buffer();
- var extend = require_extend();
- var plain = require_is_plain_obj();
- var trough = require_trough();
- var vfile = require_vfile();
- module2.exports = unified().freeze();
- var slice = [].slice;
- var own = {}.hasOwnProperty;
- var pipeline = trough().use(pipelineParse).use(pipelineRun).use(pipelineStringify);
- function pipelineParse(p, ctx) {
- ctx.tree = p.parse(ctx.file);
- }
- function pipelineRun(p, ctx, next) {
- p.run(ctx.tree, ctx.file, done);
- function done(error, tree, file) {
- if (error) {
- next(error);
- } else {
- ctx.tree = tree;
- ctx.file = file;
- next();
- }
- }
- }
- function pipelineStringify(p, ctx) {
- var result = p.stringify(ctx.tree, ctx.file);
- if (result === void 0 || result === null) {
- } else if (typeof result === "string" || buffer(result)) {
- if ("value" in ctx.file) {
- ctx.file.value = result;
- }
- ctx.file.contents = result;
- } else {
- ctx.file.result = result;
- }
- }
- function unified() {
- var attachers = [];
- var transformers = trough();
- var namespace = {};
- var freezeIndex = -1;
- var frozen;
- processor.data = data;
- processor.freeze = freeze;
- processor.attachers = attachers;
- processor.use = use;
- processor.parse = parse3;
- processor.stringify = stringify4;
- processor.run = run;
- processor.runSync = runSync;
- processor.process = process2;
- processor.processSync = processSync;
- return processor;
- function processor() {
- var destination = unified();
- var index = -1;
- while (++index < attachers.length) {
- destination.use.apply(null, attachers[index]);
- }
- destination.data(extend(true, {}, namespace));
- return destination;
- }
- function freeze() {
- var values;
- var transformer;
- if (frozen) {
- return processor;
- }
- while (++freezeIndex < attachers.length) {
- values = attachers[freezeIndex];
- if (values[1] === false) {
- continue;
- }
- if (values[1] === true) {
- values[1] = void 0;
- }
- transformer = values[0].apply(processor, values.slice(1));
- if (typeof transformer === "function") {
- transformers.use(transformer);
- }
- }
- frozen = true;
- freezeIndex = Infinity;
- return processor;
- }
- function data(key, value) {
- if (typeof key === "string") {
- if (arguments.length === 2) {
- assertUnfrozen("data", frozen);
- namespace[key] = value;
- return processor;
- }
- return own.call(namespace, key) && namespace[key] || null;
- }
- if (key) {
- assertUnfrozen("data", frozen);
- namespace = key;
- return processor;
- }
- return namespace;
- }
- function use(value) {
- var settings;
- assertUnfrozen("use", frozen);
- if (value === null || value === void 0) {
- } else if (typeof value === "function") {
- addPlugin.apply(null, arguments);
- } else if (typeof value === "object") {
- if ("length" in value) {
- addList(value);
- } else {
- addPreset(value);
- }
- } else {
- throw new Error("Expected usable value, not `" + value + "`");
- }
- if (settings) {
- namespace.settings = extend(namespace.settings || {}, settings);
- }
- return processor;
- function addPreset(result) {
- addList(result.plugins);
- if (result.settings) {
- settings = extend(settings || {}, result.settings);
- }
- }
- function add(value2) {
- if (typeof value2 === "function") {
- addPlugin(value2);
- } else if (typeof value2 === "object") {
- if ("length" in value2) {
- addPlugin.apply(null, value2);
- } else {
- addPreset(value2);
- }
- } else {
- throw new Error("Expected usable value, not `" + value2 + "`");
- }
- }
- function addList(plugins) {
- var index = -1;
- if (plugins === null || plugins === void 0) {
- } else if (typeof plugins === "object" && "length" in plugins) {
- while (++index < plugins.length) {
- add(plugins[index]);
- }
- } else {
- throw new Error("Expected a list of plugins, not `" + plugins + "`");
- }
- }
- function addPlugin(plugin, value2) {
- var entry = find(plugin);
- if (entry) {
- if (plain(entry[1]) && plain(value2)) {
- value2 = extend(true, entry[1], value2);
- }
- entry[1] = value2;
- } else {
- attachers.push(slice.call(arguments));
- }
- }
- }
- function find(plugin) {
- var index = -1;
- while (++index < attachers.length) {
- if (attachers[index][0] === plugin) {
- return attachers[index];
- }
- }
- }
- function parse3(doc) {
- var file = vfile(doc);
- var Parser2;
- freeze();
- Parser2 = processor.Parser;
- assertParser("parse", Parser2);
- if (newable(Parser2, "parse")) {
- return new Parser2(String(file), file).parse();
- }
- return Parser2(String(file), file);
- }
- function run(node, file, cb) {
- assertNode(node);
- freeze();
- if (!cb && typeof file === "function") {
- cb = file;
- file = null;
- }
- if (!cb) {
- return new Promise(executor);
- }
- executor(null, cb);
- function executor(resolve, reject) {
- transformers.run(node, vfile(file), done);
- function done(error, tree, file2) {
- tree = tree || node;
- if (error) {
- reject(error);
- } else if (resolve) {
- resolve(tree);
- } else {
- cb(null, tree, file2);
- }
- }
- }
- }
- function runSync(node, file) {
- var result;
- var complete;
- run(node, file, done);
- assertDone("runSync", "run", complete);
- return result;
- function done(error, tree) {
- complete = true;
- result = tree;
- bail(error);
- }
- }
- function stringify4(node, doc) {
- var file = vfile(doc);
- var Compiler;
- freeze();
- Compiler = processor.Compiler;
- assertCompiler("stringify", Compiler);
- assertNode(node);
- if (newable(Compiler, "compile")) {
- return new Compiler(node, file).compile();
- }
- return Compiler(node, file);
- }
- function process2(doc, cb) {
- freeze();
- assertParser("process", processor.Parser);
- assertCompiler("process", processor.Compiler);
- if (!cb) {
- return new Promise(executor);
- }
- executor(null, cb);
- function executor(resolve, reject) {
- var file = vfile(doc);
- pipeline.run(processor, { file }, done);
- function done(error) {
- if (error) {
- reject(error);
- } else if (resolve) {
- resolve(file);
- } else {
- cb(null, file);
- }
- }
- }
- }
- function processSync(doc) {
- var file;
- var complete;
- freeze();
- assertParser("processSync", processor.Parser);
- assertCompiler("processSync", processor.Compiler);
- file = vfile(doc);
- process2(file, done);
- assertDone("processSync", "process", complete);
- return file;
- function done(error) {
- complete = true;
- bail(error);
- }
- }
- }
- function newable(value, name) {
- return typeof value === "function" && value.prototype && (keys(value.prototype) || name in value.prototype);
- }
- function keys(value) {
- var key;
- for (key in value) {
- return true;
- }
- return false;
- }
- function assertParser(name, Parser2) {
- if (typeof Parser2 !== "function") {
- throw new Error("Cannot `" + name + "` without `Parser`");
- }
- }
- function assertCompiler(name, Compiler) {
- if (typeof Compiler !== "function") {
- throw new Error("Cannot `" + name + "` without `Compiler`");
- }
- }
- function assertUnfrozen(name, frozen) {
- if (frozen) {
- throw new Error("Cannot invoke `" + name + "` on a frozen processor.\nCreate a new processor first, by invoking it: use `processor()` instead of `processor`.");
- }
- }
- function assertNode(node) {
- if (!node || typeof node.type !== "string") {
- throw new Error("Expected node, got `" + node + "`");
- }
- }
- function assertDone(name, asyncName, complete) {
- if (!complete) {
- throw new Error("`" + name + "` finished async. Use `" + asyncName + "` instead");
- }
- }
- }
-});
-
-// node_modules/mdast-util-to-string/index.js
-var require_mdast_util_to_string = __commonJS({
- "node_modules/mdast-util-to-string/index.js"(exports, module2) {
- "use strict";
- module2.exports = toString;
- function toString(node) {
- return node && (node.value || node.alt || node.title || "children" in node && all(node.children) || "length" in node && all(node)) || "";
- }
- function all(values) {
- var result = [];
- var index = -1;
- while (++index < values.length) {
- result[index] = toString(values[index]);
- }
- return result.join("");
- }
- }
-});
-
-// node_modules/micromark/dist/constant/assign.js
-var require_assign = __commonJS({
- "node_modules/micromark/dist/constant/assign.js"(exports, module2) {
- "use strict";
- var assign = Object.assign;
- module2.exports = assign;
- }
-});
-
-// node_modules/micromark/dist/constant/has-own-property.js
-var require_has_own_property = __commonJS({
- "node_modules/micromark/dist/constant/has-own-property.js"(exports, module2) {
- "use strict";
- var own = {}.hasOwnProperty;
- module2.exports = own;
- }
-});
-
-// node_modules/micromark/dist/util/normalize-identifier.js
-var require_normalize_identifier = __commonJS({
- "node_modules/micromark/dist/util/normalize-identifier.js"(exports, module2) {
- "use strict";
- function normalizeIdentifier(value) {
- return value.replace(/[\t\n\r ]+/g, " ").replace(/^ | $/g, "").toLowerCase().toUpperCase();
- }
- module2.exports = normalizeIdentifier;
- }
-});
-
-// node_modules/micromark/dist/constant/from-char-code.js
-var require_from_char_code = __commonJS({
- "node_modules/micromark/dist/constant/from-char-code.js"(exports, module2) {
- "use strict";
- var fromCharCode = String.fromCharCode;
- module2.exports = fromCharCode;
- }
-});
-
-// node_modules/micromark/dist/util/safe-from-int.js
-var require_safe_from_int = __commonJS({
- "node_modules/micromark/dist/util/safe-from-int.js"(exports, module2) {
- "use strict";
- var fromCharCode = require_from_char_code();
- function safeFromInt(value, base) {
- var code = parseInt(value, base);
- if (code < 9 || code === 11 || code > 13 && code < 32 || code > 126 && code < 160 || code > 55295 && code < 57344 || code > 64975 && code < 65008 || (code & 65535) === 65535 || (code & 65535) === 65534 || code > 1114111) {
- return "\uFFFD";
- }
- return fromCharCode(code);
- }
- module2.exports = safeFromInt;
- }
-});
-
-// node_modules/micromark/dist/character/markdown-line-ending.js
-var require_markdown_line_ending = __commonJS({
- "node_modules/micromark/dist/character/markdown-line-ending.js"(exports, module2) {
- "use strict";
- function markdownLineEnding(code) {
- return code < -2;
- }
- module2.exports = markdownLineEnding;
- }
-});
-
-// node_modules/micromark/dist/character/markdown-space.js
-var require_markdown_space = __commonJS({
- "node_modules/micromark/dist/character/markdown-space.js"(exports, module2) {
- "use strict";
- function markdownSpace(code) {
- return code === -2 || code === -1 || code === 32;
- }
- module2.exports = markdownSpace;
- }
-});
-
-// node_modules/micromark/dist/tokenize/factory-space.js
-var require_factory_space = __commonJS({
- "node_modules/micromark/dist/tokenize/factory-space.js"(exports, module2) {
- "use strict";
- var markdownSpace = require_markdown_space();
- function spaceFactory(effects, ok, type, max) {
- var limit = max ? max - 1 : Infinity;
- var size = 0;
- return start;
- function start(code) {
- if (markdownSpace(code)) {
- effects.enter(type);
- return prefix(code);
- }
- return ok(code);
- }
- function prefix(code) {
- if (markdownSpace(code) && size++ < limit) {
- effects.consume(code);
- return prefix;
- }
- effects.exit(type);
- return ok(code);
- }
- }
- module2.exports = spaceFactory;
- }
-});
-
-// node_modules/micromark/dist/initialize/content.js
-var require_content = __commonJS({
- "node_modules/micromark/dist/initialize/content.js"(exports) {
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var markdownLineEnding = require_markdown_line_ending();
- var factorySpace = require_factory_space();
- var tokenize = initializeContent;
- function initializeContent(effects) {
- var contentStart = effects.attempt(this.parser.constructs.contentInitial, afterContentStartConstruct, paragraphInitial);
- var previous;
- return contentStart;
- function afterContentStartConstruct(code) {
- if (code === null) {
- effects.consume(code);
- return;
- }
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- return factorySpace(effects, contentStart, "linePrefix");
- }
- function paragraphInitial(code) {
- effects.enter("paragraph");
- return lineStart(code);
- }
- function lineStart(code) {
- var token = effects.enter("chunkText", {
- contentType: "text",
- previous
- });
- if (previous) {
- previous.next = token;
- }
- previous = token;
- return data(code);
- }
- function data(code) {
- if (code === null) {
- effects.exit("chunkText");
- effects.exit("paragraph");
- effects.consume(code);
- return;
- }
- if (markdownLineEnding(code)) {
- effects.consume(code);
- effects.exit("chunkText");
- return lineStart;
- }
- effects.consume(code);
- return data;
- }
- }
- exports.tokenize = tokenize;
- }
-});
-
-// node_modules/micromark/dist/tokenize/partial-blank-line.js
-var require_partial_blank_line = __commonJS({
- "node_modules/micromark/dist/tokenize/partial-blank-line.js"(exports, module2) {
- "use strict";
- var markdownLineEnding = require_markdown_line_ending();
- var factorySpace = require_factory_space();
- var partialBlankLine = {
- tokenize: tokenizePartialBlankLine,
- partial: true
- };
- function tokenizePartialBlankLine(effects, ok, nok) {
- return factorySpace(effects, afterWhitespace, "linePrefix");
- function afterWhitespace(code) {
- return code === null || markdownLineEnding(code) ? ok(code) : nok(code);
- }
- }
- module2.exports = partialBlankLine;
- }
-});
-
-// node_modules/micromark/dist/initialize/document.js
-var require_document = __commonJS({
- "node_modules/micromark/dist/initialize/document.js"(exports) {
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var markdownLineEnding = require_markdown_line_ending();
- var factorySpace = require_factory_space();
- var partialBlankLine = require_partial_blank_line();
- var tokenize = initializeDocument;
- var containerConstruct = {
- tokenize: tokenizeContainer
- };
- var lazyFlowConstruct = {
- tokenize: tokenizeLazyFlow
- };
- function initializeDocument(effects) {
- var self = this;
- var stack = [];
- var continued = 0;
- var inspectConstruct = {
- tokenize: tokenizeInspect,
- partial: true
- };
- var inspectResult;
- var childFlow;
- var childToken;
- return start;
- function start(code) {
- if (continued < stack.length) {
- self.containerState = stack[continued][1];
- return effects.attempt(stack[continued][0].continuation, documentContinue, documentContinued)(code);
- }
- return documentContinued(code);
- }
- function documentContinue(code) {
- continued++;
- return start(code);
- }
- function documentContinued(code) {
- if (inspectResult && inspectResult.flowContinue) {
- return flowStart(code);
- }
- self.interrupt = childFlow && childFlow.currentConstruct && childFlow.currentConstruct.interruptible;
- self.containerState = {};
- return effects.attempt(containerConstruct, containerContinue, flowStart)(code);
- }
- function containerContinue(code) {
- stack.push([self.currentConstruct, self.containerState]);
- self.containerState = void 0;
- return documentContinued(code);
- }
- function flowStart(code) {
- if (code === null) {
- exitContainers(0, true);
- effects.consume(code);
- return;
- }
- childFlow = childFlow || self.parser.flow(self.now());
- effects.enter("chunkFlow", {
- contentType: "flow",
- previous: childToken,
- _tokenizer: childFlow
- });
- return flowContinue(code);
- }
- function flowContinue(code) {
- if (code === null) {
- continueFlow(effects.exit("chunkFlow"));
- return flowStart(code);
- }
- if (markdownLineEnding(code)) {
- effects.consume(code);
- continueFlow(effects.exit("chunkFlow"));
- return effects.check(inspectConstruct, documentAfterPeek);
- }
- effects.consume(code);
- return flowContinue;
- }
- function documentAfterPeek(code) {
- exitContainers(inspectResult.continued, inspectResult && inspectResult.flowEnd);
- continued = 0;
- return start(code);
- }
- function continueFlow(token) {
- if (childToken)
- childToken.next = token;
- childToken = token;
- childFlow.lazy = inspectResult && inspectResult.lazy;
- childFlow.defineSkip(token.start);
- childFlow.write(self.sliceStream(token));
- }
- function exitContainers(size, end) {
- var index = stack.length;
- if (childFlow && end) {
- childFlow.write([null]);
- childToken = childFlow = void 0;
- }
- while (index-- > size) {
- self.containerState = stack[index][1];
- stack[index][0].exit.call(self, effects);
- }
- stack.length = size;
- }
- function tokenizeInspect(effects2, ok) {
- var subcontinued = 0;
- inspectResult = {};
- return inspectStart;
- function inspectStart(code) {
- if (subcontinued < stack.length) {
- self.containerState = stack[subcontinued][1];
- return effects2.attempt(stack[subcontinued][0].continuation, inspectContinue, inspectLess)(code);
- }
- if (childFlow.currentConstruct && childFlow.currentConstruct.concrete) {
- inspectResult.flowContinue = true;
- return inspectDone(code);
- }
- self.interrupt = childFlow.currentConstruct && childFlow.currentConstruct.interruptible;
- self.containerState = {};
- return effects2.attempt(containerConstruct, inspectFlowEnd, inspectDone)(code);
- }
- function inspectContinue(code) {
- subcontinued++;
- return self.containerState._closeFlow ? inspectFlowEnd(code) : inspectStart(code);
- }
- function inspectLess(code) {
- if (childFlow.currentConstruct && childFlow.currentConstruct.lazy) {
- self.containerState = {};
- return effects2.attempt(containerConstruct, inspectFlowEnd, effects2.attempt(lazyFlowConstruct, inspectFlowEnd, effects2.check(partialBlankLine, inspectFlowEnd, inspectLazy)))(code);
- }
- return inspectFlowEnd(code);
- }
- function inspectLazy(code) {
- subcontinued = stack.length;
- inspectResult.lazy = true;
- inspectResult.flowContinue = true;
- return inspectDone(code);
- }
- function inspectFlowEnd(code) {
- inspectResult.flowEnd = true;
- return inspectDone(code);
- }
- function inspectDone(code) {
- inspectResult.continued = subcontinued;
- self.interrupt = self.containerState = void 0;
- return ok(code);
- }
- }
- }
- function tokenizeContainer(effects, ok, nok) {
- return factorySpace(effects, effects.attempt(this.parser.constructs.document, ok, nok), "linePrefix", this.parser.constructs.disable.null.indexOf("codeIndented") > -1 ? void 0 : 4);
- }
- function tokenizeLazyFlow(effects, ok, nok) {
- return factorySpace(effects, effects.lazy(this.parser.constructs.flow, ok, nok), "linePrefix", this.parser.constructs.disable.null.indexOf("codeIndented") > -1 ? void 0 : 4);
- }
- exports.tokenize = tokenize;
- }
-});
-
-// node_modules/micromark/dist/util/size-chunks.js
-var require_size_chunks = __commonJS({
- "node_modules/micromark/dist/util/size-chunks.js"(exports, module2) {
- "use strict";
- function sizeChunks(chunks) {
- var index = -1;
- var size = 0;
- while (++index < chunks.length) {
- size += typeof chunks[index] === "string" ? chunks[index].length : 1;
- }
- return size;
- }
- module2.exports = sizeChunks;
- }
-});
-
-// node_modules/micromark/dist/util/prefix-size.js
-var require_prefix_size = __commonJS({
- "node_modules/micromark/dist/util/prefix-size.js"(exports, module2) {
- "use strict";
- var sizeChunks = require_size_chunks();
- function prefixSize(events, type) {
- var tail = events[events.length - 1];
- if (!tail || tail[1].type !== type)
- return 0;
- return sizeChunks(tail[2].sliceStream(tail[1]));
- }
- module2.exports = prefixSize;
- }
-});
-
-// node_modules/micromark/dist/constant/splice.js
-var require_splice = __commonJS({
- "node_modules/micromark/dist/constant/splice.js"(exports, module2) {
- "use strict";
- var splice = [].splice;
- module2.exports = splice;
- }
-});
-
-// node_modules/micromark/dist/util/chunked-splice.js
-var require_chunked_splice = __commonJS({
- "node_modules/micromark/dist/util/chunked-splice.js"(exports, module2) {
- "use strict";
- var splice = require_splice();
- function chunkedSplice(list, start, remove, items) {
- var end = list.length;
- var chunkStart = 0;
- var parameters;
- if (start < 0) {
- start = -start > end ? 0 : end + start;
- } else {
- start = start > end ? end : start;
- }
- remove = remove > 0 ? remove : 0;
- if (items.length < 1e4) {
- parameters = Array.from(items);
- parameters.unshift(start, remove);
- splice.apply(list, parameters);
- } else {
- if (remove)
- splice.apply(list, [start, remove]);
- while (chunkStart < items.length) {
- parameters = items.slice(chunkStart, chunkStart + 1e4);
- parameters.unshift(start, 0);
- splice.apply(list, parameters);
- chunkStart += 1e4;
- start += 1e4;
- }
- }
- }
- module2.exports = chunkedSplice;
- }
-});
-
-// node_modules/micromark/dist/util/shallow.js
-var require_shallow = __commonJS({
- "node_modules/micromark/dist/util/shallow.js"(exports, module2) {
- "use strict";
- var assign = require_assign();
- function shallow(object) {
- return assign({}, object);
- }
- module2.exports = shallow;
- }
-});
-
-// node_modules/micromark/dist/util/subtokenize.js
-var require_subtokenize = __commonJS({
- "node_modules/micromark/dist/util/subtokenize.js"(exports, module2) {
- "use strict";
- var assign = require_assign();
- var chunkedSplice = require_chunked_splice();
- var shallow = require_shallow();
- function subtokenize(events) {
- var jumps = {};
- var index = -1;
- var event;
- var lineIndex;
- var otherIndex;
- var otherEvent;
- var parameters;
- var subevents;
- var more;
- while (++index < events.length) {
- while (index in jumps) {
- index = jumps[index];
- }
- event = events[index];
- if (index && event[1].type === "chunkFlow" && events[index - 1][1].type === "listItemPrefix") {
- subevents = event[1]._tokenizer.events;
- otherIndex = 0;
- if (otherIndex < subevents.length && subevents[otherIndex][1].type === "lineEndingBlank") {
- otherIndex += 2;
- }
- if (otherIndex < subevents.length && subevents[otherIndex][1].type === "content") {
- while (++otherIndex < subevents.length) {
- if (subevents[otherIndex][1].type === "content") {
- break;
- }
- if (subevents[otherIndex][1].type === "chunkText") {
- subevents[otherIndex][1].isInFirstContentOfListItem = true;
- otherIndex++;
- }
- }
- }
- }
- if (event[0] === "enter") {
- if (event[1].contentType) {
- assign(jumps, subcontent(events, index));
- index = jumps[index];
- more = true;
- }
- } else if (event[1]._container || event[1]._movePreviousLineEndings) {
- otherIndex = index;
- lineIndex = void 0;
- while (otherIndex--) {
- otherEvent = events[otherIndex];
- if (otherEvent[1].type === "lineEnding" || otherEvent[1].type === "lineEndingBlank") {
- if (otherEvent[0] === "enter") {
- if (lineIndex) {
- events[lineIndex][1].type = "lineEndingBlank";
- }
- otherEvent[1].type = "lineEnding";
- lineIndex = otherIndex;
- }
- } else {
- break;
- }
- }
- if (lineIndex) {
- event[1].end = shallow(events[lineIndex][1].start);
- parameters = events.slice(lineIndex, index);
- parameters.unshift(event);
- chunkedSplice(events, lineIndex, index - lineIndex + 1, parameters);
- }
- }
- }
- return !more;
- }
- function subcontent(events, eventIndex) {
- var token = events[eventIndex][1];
- var context = events[eventIndex][2];
- var startPosition = eventIndex - 1;
- var startPositions = [];
- var tokenizer = token._tokenizer || context.parser[token.contentType](token.start);
- var childEvents = tokenizer.events;
- var jumps = [];
- var gaps = {};
- var stream;
- var previous;
- var index;
- var entered;
- var end;
- var adjust;
- while (token) {
- while (events[++startPosition][1] !== token) {
- }
- startPositions.push(startPosition);
- if (!token._tokenizer) {
- stream = context.sliceStream(token);
- if (!token.next) {
- stream.push(null);
- }
- if (previous) {
- tokenizer.defineSkip(token.start);
- }
- if (token.isInFirstContentOfListItem) {
- tokenizer._gfmTasklistFirstContentOfListItem = true;
- }
- tokenizer.write(stream);
- if (token.isInFirstContentOfListItem) {
- tokenizer._gfmTasklistFirstContentOfListItem = void 0;
- }
- }
- previous = token;
- token = token.next;
- }
- token = previous;
- index = childEvents.length;
- while (index--) {
- if (childEvents[index][0] === "enter") {
- entered = true;
- } else if (entered && childEvents[index][1].type === childEvents[index - 1][1].type && childEvents[index][1].start.line !== childEvents[index][1].end.line) {
- add(childEvents.slice(index + 1, end));
- token._tokenizer = token.next = void 0;
- token = token.previous;
- end = index + 1;
- }
- }
- tokenizer.events = token._tokenizer = token.next = void 0;
- add(childEvents.slice(0, end));
- index = -1;
- adjust = 0;
- while (++index < jumps.length) {
- gaps[adjust + jumps[index][0]] = adjust + jumps[index][1];
- adjust += jumps[index][1] - jumps[index][0] - 1;
- }
- return gaps;
- function add(slice) {
- var start = startPositions.pop();
- jumps.unshift([start, start + slice.length - 1]);
- chunkedSplice(events, start, 2, slice);
- }
- }
- module2.exports = subtokenize;
- }
-});
-
-// node_modules/micromark/dist/tokenize/content.js
-var require_content2 = __commonJS({
- "node_modules/micromark/dist/tokenize/content.js"(exports, module2) {
- "use strict";
- var markdownLineEnding = require_markdown_line_ending();
- var prefixSize = require_prefix_size();
- var subtokenize = require_subtokenize();
- var factorySpace = require_factory_space();
- var content = {
- tokenize: tokenizeContent,
- resolve: resolveContent,
- interruptible: true,
- lazy: true
- };
- var continuationConstruct = {
- tokenize: tokenizeContinuation,
- partial: true
- };
- function resolveContent(events) {
- subtokenize(events);
- return events;
- }
- function tokenizeContent(effects, ok) {
- var previous;
- return start;
- function start(code) {
- effects.enter("content");
- previous = effects.enter("chunkContent", {
- contentType: "content"
- });
- return data(code);
- }
- function data(code) {
- if (code === null) {
- return contentEnd(code);
- }
- if (markdownLineEnding(code)) {
- return effects.check(continuationConstruct, contentContinue, contentEnd)(code);
- }
- effects.consume(code);
- return data;
- }
- function contentEnd(code) {
- effects.exit("chunkContent");
- effects.exit("content");
- return ok(code);
- }
- function contentContinue(code) {
- effects.consume(code);
- effects.exit("chunkContent");
- previous = previous.next = effects.enter("chunkContent", {
- contentType: "content",
- previous
- });
- return data;
- }
- }
- function tokenizeContinuation(effects, ok, nok) {
- var self = this;
- return startLookahead;
- function startLookahead(code) {
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- return factorySpace(effects, prefixed, "linePrefix");
- }
- function prefixed(code) {
- if (code === null || markdownLineEnding(code)) {
- return nok(code);
- }
- if (self.parser.constructs.disable.null.indexOf("codeIndented") > -1 || prefixSize(self.events, "linePrefix") < 4) {
- return effects.interrupt(self.parser.constructs.flow, nok, ok)(code);
- }
- return ok(code);
- }
- }
- module2.exports = content;
- }
-});
-
-// node_modules/micromark/dist/initialize/flow.js
-var require_flow = __commonJS({
- "node_modules/micromark/dist/initialize/flow.js"(exports) {
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var content = require_content2();
- var factorySpace = require_factory_space();
- var partialBlankLine = require_partial_blank_line();
- var tokenize = initializeFlow;
- function initializeFlow(effects) {
- var self = this;
- var initial = effects.attempt(partialBlankLine, atBlankEnding, effects.attempt(this.parser.constructs.flowInitial, afterConstruct, factorySpace(effects, effects.attempt(this.parser.constructs.flow, afterConstruct, effects.attempt(content, afterConstruct)), "linePrefix")));
- return initial;
- function atBlankEnding(code) {
- if (code === null) {
- effects.consume(code);
- return;
- }
- effects.enter("lineEndingBlank");
- effects.consume(code);
- effects.exit("lineEndingBlank");
- self.currentConstruct = void 0;
- return initial;
- }
- function afterConstruct(code) {
- if (code === null) {
- effects.consume(code);
- return;
- }
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- self.currentConstruct = void 0;
- return initial;
- }
- }
- exports.tokenize = tokenize;
- }
-});
-
-// node_modules/micromark/dist/initialize/text.js
-var require_text = __commonJS({
- "node_modules/micromark/dist/initialize/text.js"(exports) {
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var assign = require_assign();
- var shallow = require_shallow();
- var text = initializeFactory("text");
- var string2 = initializeFactory("string");
- var resolver = {
- resolveAll: createResolver()
- };
- function initializeFactory(field) {
- return {
- tokenize: initializeText,
- resolveAll: createResolver(field === "text" ? resolveAllLineSuffixes : void 0)
- };
- function initializeText(effects) {
- var self = this;
- var constructs = this.parser.constructs[field];
- var text2 = effects.attempt(constructs, start, notText);
- return start;
- function start(code) {
- return atBreak(code) ? text2(code) : notText(code);
- }
- function notText(code) {
- if (code === null) {
- effects.consume(code);
- return;
- }
- effects.enter("data");
- effects.consume(code);
- return data;
- }
- function data(code) {
- if (atBreak(code)) {
- effects.exit("data");
- return text2(code);
- }
- effects.consume(code);
- return data;
- }
- function atBreak(code) {
- var list = constructs[code];
- var index = -1;
- if (code === null) {
- return true;
- }
- if (list) {
- while (++index < list.length) {
- if (!list[index].previous || list[index].previous.call(self, self.previous)) {
- return true;
- }
- }
- }
- }
- }
- }
- function createResolver(extraResolver) {
- return resolveAllText;
- function resolveAllText(events, context) {
- var index = -1;
- var enter;
- while (++index <= events.length) {
- if (enter === void 0) {
- if (events[index] && events[index][1].type === "data") {
- enter = index;
- index++;
- }
- } else if (!events[index] || events[index][1].type !== "data") {
- if (index !== enter + 2) {
- events[enter][1].end = events[index - 1][1].end;
- events.splice(enter + 2, index - enter - 2);
- index = enter + 2;
- }
- enter = void 0;
- }
- }
- return extraResolver ? extraResolver(events, context) : events;
- }
- }
- function resolveAllLineSuffixes(events, context) {
- var eventIndex = -1;
- var chunks;
- var data;
- var chunk;
- var index;
- var bufferIndex;
- var size;
- var tabs;
- var token;
- while (++eventIndex <= events.length) {
- if ((eventIndex === events.length || events[eventIndex][1].type === "lineEnding") && events[eventIndex - 1][1].type === "data") {
- data = events[eventIndex - 1][1];
- chunks = context.sliceStream(data);
- index = chunks.length;
- bufferIndex = -1;
- size = 0;
- tabs = void 0;
- while (index--) {
- chunk = chunks[index];
- if (typeof chunk === "string") {
- bufferIndex = chunk.length;
- while (chunk.charCodeAt(bufferIndex - 1) === 32) {
- size++;
- bufferIndex--;
- }
- if (bufferIndex)
- break;
- bufferIndex = -1;
- } else if (chunk === -2) {
- tabs = true;
- size++;
- } else if (chunk === -1)
- ;
- else {
- index++;
- break;
- }
- }
- if (size) {
- token = {
- type: eventIndex === events.length || tabs || size < 2 ? "lineSuffix" : "hardBreakTrailing",
- start: {
- line: data.end.line,
- column: data.end.column - size,
- offset: data.end.offset - size,
- _index: data.start._index + index,
- _bufferIndex: index ? bufferIndex : data.start._bufferIndex + bufferIndex
- },
- end: shallow(data.end)
- };
- data.end = shallow(token.start);
- if (data.start.offset === data.end.offset) {
- assign(data, token);
- } else {
- events.splice(eventIndex, 0, ["enter", token, context], ["exit", token, context]);
- eventIndex += 2;
- }
- }
- eventIndex++;
- }
- }
- return events;
- }
- exports.resolver = resolver;
- exports.string = string2;
- exports.text = text;
- }
-});
-
-// node_modules/micromark/dist/util/miniflat.js
-var require_miniflat = __commonJS({
- "node_modules/micromark/dist/util/miniflat.js"(exports, module2) {
- "use strict";
- function miniflat(value) {
- return value === null || value === void 0 ? [] : "length" in value ? value : [value];
- }
- module2.exports = miniflat;
- }
-});
-
-// node_modules/micromark/dist/util/combine-extensions.js
-var require_combine_extensions = __commonJS({
- "node_modules/micromark/dist/util/combine-extensions.js"(exports, module2) {
- "use strict";
- var hasOwnProperty = require_has_own_property();
- var chunkedSplice = require_chunked_splice();
- var miniflat = require_miniflat();
- function combineExtensions(extensions) {
- var all = {};
- var index = -1;
- while (++index < extensions.length) {
- extension(all, extensions[index]);
- }
- return all;
- }
- function extension(all, extension2) {
- var hook;
- var left;
- var right;
- var code;
- for (hook in extension2) {
- left = hasOwnProperty.call(all, hook) ? all[hook] : all[hook] = {};
- right = extension2[hook];
- for (code in right) {
- left[code] = constructs(miniflat(right[code]), hasOwnProperty.call(left, code) ? left[code] : []);
- }
- }
- }
- function constructs(list, existing) {
- var index = -1;
- var before = [];
- while (++index < list.length) {
- ;
- (list[index].add === "after" ? existing : before).push(list[index]);
- }
- chunkedSplice(existing, 0, 0, before);
- return existing;
- }
- module2.exports = combineExtensions;
- }
-});
-
-// node_modules/micromark/dist/util/chunked-push.js
-var require_chunked_push = __commonJS({
- "node_modules/micromark/dist/util/chunked-push.js"(exports, module2) {
- "use strict";
- var chunkedSplice = require_chunked_splice();
- function chunkedPush(list, items) {
- if (list.length) {
- chunkedSplice(list, list.length, 0, items);
- return list;
- }
- return items;
- }
- module2.exports = chunkedPush;
- }
-});
-
-// node_modules/micromark/dist/util/resolve-all.js
-var require_resolve_all = __commonJS({
- "node_modules/micromark/dist/util/resolve-all.js"(exports, module2) {
- "use strict";
- function resolveAll(constructs, events, context) {
- var called = [];
- var index = -1;
- var resolve;
- while (++index < constructs.length) {
- resolve = constructs[index].resolveAll;
- if (resolve && called.indexOf(resolve) < 0) {
- events = resolve(events, context);
- called.push(resolve);
- }
- }
- return events;
- }
- module2.exports = resolveAll;
- }
-});
-
-// node_modules/micromark/dist/util/serialize-chunks.js
-var require_serialize_chunks = __commonJS({
- "node_modules/micromark/dist/util/serialize-chunks.js"(exports, module2) {
- "use strict";
- var fromCharCode = require_from_char_code();
- function serializeChunks(chunks) {
- var index = -1;
- var result = [];
- var chunk;
- var value;
- var atTab;
- while (++index < chunks.length) {
- chunk = chunks[index];
- if (typeof chunk === "string") {
- value = chunk;
- } else if (chunk === -5) {
- value = "\r";
- } else if (chunk === -4) {
- value = "\n";
- } else if (chunk === -3) {
- value = "\r\n";
- } else if (chunk === -2) {
- value = " ";
- } else if (chunk === -1) {
- if (atTab)
- continue;
- value = " ";
- } else {
- value = fromCharCode(chunk);
- }
- atTab = chunk === -2;
- result.push(value);
- }
- return result.join("");
- }
- module2.exports = serializeChunks;
- }
-});
-
-// node_modules/micromark/dist/util/slice-chunks.js
-var require_slice_chunks = __commonJS({
- "node_modules/micromark/dist/util/slice-chunks.js"(exports, module2) {
- "use strict";
- function sliceChunks(chunks, token) {
- var startIndex = token.start._index;
- var startBufferIndex = token.start._bufferIndex;
- var endIndex = token.end._index;
- var endBufferIndex = token.end._bufferIndex;
- var view;
- if (startIndex === endIndex) {
- view = [chunks[startIndex].slice(startBufferIndex, endBufferIndex)];
- } else {
- view = chunks.slice(startIndex, endIndex);
- if (startBufferIndex > -1) {
- view[0] = view[0].slice(startBufferIndex);
- }
- if (endBufferIndex > 0) {
- view.push(chunks[endIndex].slice(0, endBufferIndex));
- }
- }
- return view;
- }
- module2.exports = sliceChunks;
- }
-});
-
-// node_modules/micromark/dist/util/create-tokenizer.js
-var require_create_tokenizer = __commonJS({
- "node_modules/micromark/dist/util/create-tokenizer.js"(exports, module2) {
- "use strict";
- var assign = require_assign();
- var markdownLineEnding = require_markdown_line_ending();
- var chunkedPush = require_chunked_push();
- var chunkedSplice = require_chunked_splice();
- var miniflat = require_miniflat();
- var resolveAll = require_resolve_all();
- var serializeChunks = require_serialize_chunks();
- var shallow = require_shallow();
- var sliceChunks = require_slice_chunks();
- function createTokenizer(parser, initialize, from) {
- var point = from ? shallow(from) : {
- line: 1,
- column: 1,
- offset: 0
- };
- var columnStart = {};
- var resolveAllConstructs = [];
- var chunks = [];
- var stack = [];
- var effects = {
- consume,
- enter,
- exit,
- attempt: constructFactory(onsuccessfulconstruct),
- check: constructFactory(onsuccessfulcheck),
- interrupt: constructFactory(onsuccessfulcheck, {
- interrupt: true
- }),
- lazy: constructFactory(onsuccessfulcheck, {
- lazy: true
- })
- };
- var context = {
- previous: null,
- events: [],
- parser,
- sliceStream,
- sliceSerialize,
- now,
- defineSkip: skip,
- write
- };
- var state = initialize.tokenize.call(context, effects);
- if (initialize.resolveAll) {
- resolveAllConstructs.push(initialize);
- }
- point._index = 0;
- point._bufferIndex = -1;
- return context;
- function write(slice) {
- chunks = chunkedPush(chunks, slice);
- main();
- if (chunks[chunks.length - 1] !== null) {
- return [];
- }
- addResult(initialize, 0);
- context.events = resolveAll(resolveAllConstructs, context.events, context);
- return context.events;
- }
- function sliceSerialize(token) {
- return serializeChunks(sliceStream(token));
- }
- function sliceStream(token) {
- return sliceChunks(chunks, token);
- }
- function now() {
- return shallow(point);
- }
- function skip(value) {
- columnStart[value.line] = value.column;
- accountForPotentialSkip();
- }
- function main() {
- var chunkIndex;
- var chunk;
- while (point._index < chunks.length) {
- chunk = chunks[point._index];
- if (typeof chunk === "string") {
- chunkIndex = point._index;
- if (point._bufferIndex < 0) {
- point._bufferIndex = 0;
- }
- while (point._index === chunkIndex && point._bufferIndex < chunk.length) {
- go(chunk.charCodeAt(point._bufferIndex));
- }
- } else {
- go(chunk);
- }
- }
- }
- function go(code) {
- state = state(code);
- }
- function consume(code) {
- if (markdownLineEnding(code)) {
- point.line++;
- point.column = 1;
- point.offset += code === -3 ? 2 : 1;
- accountForPotentialSkip();
- } else if (code !== -1) {
- point.column++;
- point.offset++;
- }
- if (point._bufferIndex < 0) {
- point._index++;
- } else {
- point._bufferIndex++;
- if (point._bufferIndex === chunks[point._index].length) {
- point._bufferIndex = -1;
- point._index++;
- }
- }
- context.previous = code;
- }
- function enter(type, fields) {
- var token = fields || {};
- token.type = type;
- token.start = now();
- context.events.push(["enter", token, context]);
- stack.push(token);
- return token;
- }
- function exit(type) {
- var token = stack.pop();
- token.end = now();
- context.events.push(["exit", token, context]);
- return token;
- }
- function onsuccessfulconstruct(construct, info) {
- addResult(construct, info.from);
- }
- function onsuccessfulcheck(construct, info) {
- info.restore();
- }
- function constructFactory(onreturn, fields) {
- return hook;
- function hook(constructs, returnState, bogusState) {
- var listOfConstructs;
- var constructIndex;
- var currentConstruct;
- var info;
- return constructs.tokenize || "length" in constructs ? handleListOfConstructs(miniflat(constructs)) : handleMapOfConstructs;
- function handleMapOfConstructs(code) {
- if (code in constructs || null in constructs) {
- return handleListOfConstructs(constructs.null ? miniflat(constructs[code]).concat(miniflat(constructs.null)) : constructs[code])(code);
- }
- return bogusState(code);
- }
- function handleListOfConstructs(list) {
- listOfConstructs = list;
- constructIndex = 0;
- return handleConstruct(list[constructIndex]);
- }
- function handleConstruct(construct) {
- return start;
- function start(code) {
- info = store();
- currentConstruct = construct;
- if (!construct.partial) {
- context.currentConstruct = construct;
- }
- if (construct.name && context.parser.constructs.disable.null.indexOf(construct.name) > -1) {
- return nok();
- }
- return construct.tokenize.call(fields ? assign({}, context, fields) : context, effects, ok, nok)(code);
- }
- }
- function ok(code) {
- onreturn(currentConstruct, info);
- return returnState;
- }
- function nok(code) {
- info.restore();
- if (++constructIndex < listOfConstructs.length) {
- return handleConstruct(listOfConstructs[constructIndex]);
- }
- return bogusState;
- }
- }
- }
- function addResult(construct, from2) {
- if (construct.resolveAll && resolveAllConstructs.indexOf(construct) < 0) {
- resolveAllConstructs.push(construct);
- }
- if (construct.resolve) {
- chunkedSplice(context.events, from2, context.events.length - from2, construct.resolve(context.events.slice(from2), context));
- }
- if (construct.resolveTo) {
- context.events = construct.resolveTo(context.events, context);
- }
- }
- function store() {
- var startPoint = now();
- var startPrevious = context.previous;
- var startCurrentConstruct = context.currentConstruct;
- var startEventsIndex = context.events.length;
- var startStack = Array.from(stack);
- return {
- restore,
- from: startEventsIndex
- };
- function restore() {
- point = startPoint;
- context.previous = startPrevious;
- context.currentConstruct = startCurrentConstruct;
- context.events.length = startEventsIndex;
- stack = startStack;
- accountForPotentialSkip();
- }
- }
- function accountForPotentialSkip() {
- if (point.line in columnStart && point.column < 2) {
- point.column = columnStart[point.line];
- point.offset += columnStart[point.line] - 1;
- }
- }
- }
- module2.exports = createTokenizer;
- }
-});
-
-// node_modules/micromark/dist/character/markdown-line-ending-or-space.js
-var require_markdown_line_ending_or_space = __commonJS({
- "node_modules/micromark/dist/character/markdown-line-ending-or-space.js"(exports, module2) {
- "use strict";
- function markdownLineEndingOrSpace(code) {
- return code < 0 || code === 32;
- }
- module2.exports = markdownLineEndingOrSpace;
- }
-});
-
-// node_modules/micromark/dist/constant/unicode-punctuation-regex.js
-var require_unicode_punctuation_regex = __commonJS({
- "node_modules/micromark/dist/constant/unicode-punctuation-regex.js"(exports, module2) {
- "use strict";
- var unicodePunctuation = /[!-\/:-@\[-`\{-~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]/;
- module2.exports = unicodePunctuation;
- }
-});
-
-// node_modules/micromark/dist/util/regex-check.js
-var require_regex_check = __commonJS({
- "node_modules/micromark/dist/util/regex-check.js"(exports, module2) {
- "use strict";
- var fromCharCode = require_from_char_code();
- function regexCheck(regex) {
- return check;
- function check(code) {
- return regex.test(fromCharCode(code));
- }
- }
- module2.exports = regexCheck;
- }
-});
-
-// node_modules/micromark/dist/character/unicode-punctuation.js
-var require_unicode_punctuation = __commonJS({
- "node_modules/micromark/dist/character/unicode-punctuation.js"(exports, module2) {
- "use strict";
- var unicodePunctuationRegex = require_unicode_punctuation_regex();
- var regexCheck = require_regex_check();
- var unicodePunctuation = regexCheck(unicodePunctuationRegex);
- module2.exports = unicodePunctuation;
- }
-});
-
-// node_modules/micromark/dist/character/unicode-whitespace.js
-var require_unicode_whitespace = __commonJS({
- "node_modules/micromark/dist/character/unicode-whitespace.js"(exports, module2) {
- "use strict";
- var regexCheck = require_regex_check();
- var unicodeWhitespace = regexCheck(/\s/);
- module2.exports = unicodeWhitespace;
- }
-});
-
-// node_modules/micromark/dist/util/classify-character.js
-var require_classify_character = __commonJS({
- "node_modules/micromark/dist/util/classify-character.js"(exports, module2) {
- "use strict";
- var markdownLineEndingOrSpace = require_markdown_line_ending_or_space();
- var unicodePunctuation = require_unicode_punctuation();
- var unicodeWhitespace = require_unicode_whitespace();
- function classifyCharacter(code) {
- if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {
- return 1;
- }
- if (unicodePunctuation(code)) {
- return 2;
- }
- }
- module2.exports = classifyCharacter;
- }
-});
-
-// node_modules/micromark/dist/util/move-point.js
-var require_move_point = __commonJS({
- "node_modules/micromark/dist/util/move-point.js"(exports, module2) {
- "use strict";
- function movePoint(point, offset) {
- point.column += offset;
- point.offset += offset;
- point._bufferIndex += offset;
- return point;
- }
- module2.exports = movePoint;
- }
-});
-
-// node_modules/micromark/dist/tokenize/attention.js
-var require_attention = __commonJS({
- "node_modules/micromark/dist/tokenize/attention.js"(exports, module2) {
- "use strict";
- var chunkedPush = require_chunked_push();
- var chunkedSplice = require_chunked_splice();
- var classifyCharacter = require_classify_character();
- var movePoint = require_move_point();
- var resolveAll = require_resolve_all();
- var shallow = require_shallow();
- var attention = {
- name: "attention",
- tokenize: tokenizeAttention,
- resolveAll: resolveAllAttention
- };
- function resolveAllAttention(events, context) {
- var index = -1;
- var open;
- var group;
- var text;
- var openingSequence;
- var closingSequence;
- var use;
- var nextEvents;
- var offset;
- while (++index < events.length) {
- if (events[index][0] === "enter" && events[index][1].type === "attentionSequence" && events[index][1]._close) {
- open = index;
- while (open--) {
- if (events[open][0] === "exit" && events[open][1].type === "attentionSequence" && events[open][1]._open && context.sliceSerialize(events[open][1]).charCodeAt(0) === context.sliceSerialize(events[index][1]).charCodeAt(0)) {
- if ((events[open][1]._close || events[index][1]._open) && (events[index][1].end.offset - events[index][1].start.offset) % 3 && !((events[open][1].end.offset - events[open][1].start.offset + events[index][1].end.offset - events[index][1].start.offset) % 3)) {
- continue;
- }
- use = events[open][1].end.offset - events[open][1].start.offset > 1 && events[index][1].end.offset - events[index][1].start.offset > 1 ? 2 : 1;
- openingSequence = {
- type: use > 1 ? "strongSequence" : "emphasisSequence",
- start: movePoint(shallow(events[open][1].end), -use),
- end: shallow(events[open][1].end)
- };
- closingSequence = {
- type: use > 1 ? "strongSequence" : "emphasisSequence",
- start: shallow(events[index][1].start),
- end: movePoint(shallow(events[index][1].start), use)
- };
- text = {
- type: use > 1 ? "strongText" : "emphasisText",
- start: shallow(events[open][1].end),
- end: shallow(events[index][1].start)
- };
- group = {
- type: use > 1 ? "strong" : "emphasis",
- start: shallow(openingSequence.start),
- end: shallow(closingSequence.end)
- };
- events[open][1].end = shallow(openingSequence.start);
- events[index][1].start = shallow(closingSequence.end);
- nextEvents = [];
- if (events[open][1].end.offset - events[open][1].start.offset) {
- nextEvents = chunkedPush(nextEvents, [
- ["enter", events[open][1], context],
- ["exit", events[open][1], context]
- ]);
- }
- nextEvents = chunkedPush(nextEvents, [
- ["enter", group, context],
- ["enter", openingSequence, context],
- ["exit", openingSequence, context],
- ["enter", text, context]
- ]);
- nextEvents = chunkedPush(nextEvents, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + 1, index), context));
- nextEvents = chunkedPush(nextEvents, [
- ["exit", text, context],
- ["enter", closingSequence, context],
- ["exit", closingSequence, context],
- ["exit", group, context]
- ]);
- if (events[index][1].end.offset - events[index][1].start.offset) {
- offset = 2;
- nextEvents = chunkedPush(nextEvents, [
- ["enter", events[index][1], context],
- ["exit", events[index][1], context]
- ]);
- } else {
- offset = 0;
- }
- chunkedSplice(events, open - 1, index - open + 3, nextEvents);
- index = open + nextEvents.length - offset - 2;
- break;
- }
- }
- }
- }
- index = -1;
- while (++index < events.length) {
- if (events[index][1].type === "attentionSequence") {
- events[index][1].type = "data";
- }
- }
- return events;
- }
- function tokenizeAttention(effects, ok) {
- var before = classifyCharacter(this.previous);
- var marker;
- return start;
- function start(code) {
- effects.enter("attentionSequence");
- marker = code;
- return sequence(code);
- }
- function sequence(code) {
- var token;
- var after;
- var open;
- var close;
- if (code === marker) {
- effects.consume(code);
- return sequence;
- }
- token = effects.exit("attentionSequence");
- after = classifyCharacter(code);
- open = !after || after === 2 && before;
- close = !before || before === 2 && after;
- token._open = marker === 42 ? open : open && (before || !close);
- token._close = marker === 42 ? close : close && (after || !open);
- return ok(code);
- }
- }
- module2.exports = attention;
- }
-});
-
-// node_modules/micromark/dist/character/ascii-alpha.js
-var require_ascii_alpha = __commonJS({
- "node_modules/micromark/dist/character/ascii-alpha.js"(exports, module2) {
- "use strict";
- var regexCheck = require_regex_check();
- var asciiAlpha = regexCheck(/[A-Za-z]/);
- module2.exports = asciiAlpha;
- }
-});
-
-// node_modules/micromark/dist/character/ascii-alphanumeric.js
-var require_ascii_alphanumeric = __commonJS({
- "node_modules/micromark/dist/character/ascii-alphanumeric.js"(exports, module2) {
- "use strict";
- var regexCheck = require_regex_check();
- var asciiAlphanumeric = regexCheck(/[\dA-Za-z]/);
- module2.exports = asciiAlphanumeric;
- }
-});
-
-// node_modules/micromark/dist/character/ascii-atext.js
-var require_ascii_atext = __commonJS({
- "node_modules/micromark/dist/character/ascii-atext.js"(exports, module2) {
- "use strict";
- var regexCheck = require_regex_check();
- var asciiAtext = regexCheck(/[#-'*+\--9=?A-Z^-~]/);
- module2.exports = asciiAtext;
- }
-});
-
-// node_modules/micromark/dist/character/ascii-control.js
-var require_ascii_control = __commonJS({
- "node_modules/micromark/dist/character/ascii-control.js"(exports, module2) {
- "use strict";
- function asciiControl(code) {
- return code < 32 || code === 127;
- }
- module2.exports = asciiControl;
- }
-});
-
-// node_modules/micromark/dist/tokenize/autolink.js
-var require_autolink = __commonJS({
- "node_modules/micromark/dist/tokenize/autolink.js"(exports, module2) {
- "use strict";
- var asciiAlpha = require_ascii_alpha();
- var asciiAlphanumeric = require_ascii_alphanumeric();
- var asciiAtext = require_ascii_atext();
- var asciiControl = require_ascii_control();
- var autolink = {
- name: "autolink",
- tokenize: tokenizeAutolink
- };
- function tokenizeAutolink(effects, ok, nok) {
- var size = 1;
- return start;
- function start(code) {
- effects.enter("autolink");
- effects.enter("autolinkMarker");
- effects.consume(code);
- effects.exit("autolinkMarker");
- effects.enter("autolinkProtocol");
- return open;
- }
- function open(code) {
- if (asciiAlpha(code)) {
- effects.consume(code);
- return schemeOrEmailAtext;
- }
- return asciiAtext(code) ? emailAtext(code) : nok(code);
- }
- function schemeOrEmailAtext(code) {
- return code === 43 || code === 45 || code === 46 || asciiAlphanumeric(code) ? schemeInsideOrEmailAtext(code) : emailAtext(code);
- }
- function schemeInsideOrEmailAtext(code) {
- if (code === 58) {
- effects.consume(code);
- return urlInside;
- }
- if ((code === 43 || code === 45 || code === 46 || asciiAlphanumeric(code)) && size++ < 32) {
- effects.consume(code);
- return schemeInsideOrEmailAtext;
- }
- return emailAtext(code);
- }
- function urlInside(code) {
- if (code === 62) {
- effects.exit("autolinkProtocol");
- return end(code);
- }
- if (code === 32 || code === 60 || asciiControl(code)) {
- return nok(code);
- }
- effects.consume(code);
- return urlInside;
- }
- function emailAtext(code) {
- if (code === 64) {
- effects.consume(code);
- size = 0;
- return emailAtSignOrDot;
- }
- if (asciiAtext(code)) {
- effects.consume(code);
- return emailAtext;
- }
- return nok(code);
- }
- function emailAtSignOrDot(code) {
- return asciiAlphanumeric(code) ? emailLabel(code) : nok(code);
- }
- function emailLabel(code) {
- if (code === 46) {
- effects.consume(code);
- size = 0;
- return emailAtSignOrDot;
- }
- if (code === 62) {
- effects.exit("autolinkProtocol").type = "autolinkEmail";
- return end(code);
- }
- return emailValue(code);
- }
- function emailValue(code) {
- if ((code === 45 || asciiAlphanumeric(code)) && size++ < 63) {
- effects.consume(code);
- return code === 45 ? emailValue : emailLabel;
- }
- return nok(code);
- }
- function end(code) {
- effects.enter("autolinkMarker");
- effects.consume(code);
- effects.exit("autolinkMarker");
- effects.exit("autolink");
- return ok;
- }
- }
- module2.exports = autolink;
- }
-});
-
-// node_modules/micromark/dist/tokenize/block-quote.js
-var require_block_quote = __commonJS({
- "node_modules/micromark/dist/tokenize/block-quote.js"(exports, module2) {
- "use strict";
- var markdownSpace = require_markdown_space();
- var factorySpace = require_factory_space();
- var blockQuote = {
- name: "blockQuote",
- tokenize: tokenizeBlockQuoteStart,
- continuation: {
- tokenize: tokenizeBlockQuoteContinuation
- },
- exit
- };
- function tokenizeBlockQuoteStart(effects, ok, nok) {
- var self = this;
- return start;
- function start(code) {
- if (code === 62) {
- if (!self.containerState.open) {
- effects.enter("blockQuote", {
- _container: true
- });
- self.containerState.open = true;
- }
- effects.enter("blockQuotePrefix");
- effects.enter("blockQuoteMarker");
- effects.consume(code);
- effects.exit("blockQuoteMarker");
- return after;
- }
- return nok(code);
- }
- function after(code) {
- if (markdownSpace(code)) {
- effects.enter("blockQuotePrefixWhitespace");
- effects.consume(code);
- effects.exit("blockQuotePrefixWhitespace");
- effects.exit("blockQuotePrefix");
- return ok;
- }
- effects.exit("blockQuotePrefix");
- return ok(code);
- }
- }
- function tokenizeBlockQuoteContinuation(effects, ok, nok) {
- return factorySpace(effects, effects.attempt(blockQuote, ok, nok), "linePrefix", this.parser.constructs.disable.null.indexOf("codeIndented") > -1 ? void 0 : 4);
- }
- function exit(effects) {
- effects.exit("blockQuote");
- }
- module2.exports = blockQuote;
- }
-});
-
-// node_modules/micromark/dist/character/ascii-punctuation.js
-var require_ascii_punctuation = __commonJS({
- "node_modules/micromark/dist/character/ascii-punctuation.js"(exports, module2) {
- "use strict";
- var regexCheck = require_regex_check();
- var asciiPunctuation = regexCheck(/[!-/:-@[-`{-~]/);
- module2.exports = asciiPunctuation;
- }
-});
-
-// node_modules/micromark/dist/tokenize/character-escape.js
-var require_character_escape = __commonJS({
- "node_modules/micromark/dist/tokenize/character-escape.js"(exports, module2) {
- "use strict";
- var asciiPunctuation = require_ascii_punctuation();
- var characterEscape = {
- name: "characterEscape",
- tokenize: tokenizeCharacterEscape
- };
- function tokenizeCharacterEscape(effects, ok, nok) {
- return start;
- function start(code) {
- effects.enter("characterEscape");
- effects.enter("escapeMarker");
- effects.consume(code);
- effects.exit("escapeMarker");
- return open;
- }
- function open(code) {
- if (asciiPunctuation(code)) {
- effects.enter("characterEscapeValue");
- effects.consume(code);
- effects.exit("characterEscapeValue");
- effects.exit("characterEscape");
- return ok;
- }
- return nok(code);
- }
- }
- module2.exports = characterEscape;
- }
-});
-
-// node_modules/parse-entities/decode-entity.browser.js
-var require_decode_entity_browser = __commonJS({
- "node_modules/parse-entities/decode-entity.browser.js"(exports, module2) {
- "use strict";
- var el;
- var semicolon = 59;
- module2.exports = decodeEntity;
- function decodeEntity(characters) {
- var entity = "&" + characters + ";";
- var char;
- el = el || document.createElement("i");
- el.innerHTML = entity;
- char = el.textContent;
- if (char.charCodeAt(char.length - 1) === semicolon && characters !== "semi") {
- return false;
- }
- return char === entity ? false : char;
- }
- }
-});
-
-// node_modules/micromark/dist/character/ascii-digit.js
-var require_ascii_digit = __commonJS({
- "node_modules/micromark/dist/character/ascii-digit.js"(exports, module2) {
- "use strict";
- var regexCheck = require_regex_check();
- var asciiDigit = regexCheck(/\d/);
- module2.exports = asciiDigit;
- }
-});
-
-// node_modules/micromark/dist/character/ascii-hex-digit.js
-var require_ascii_hex_digit = __commonJS({
- "node_modules/micromark/dist/character/ascii-hex-digit.js"(exports, module2) {
- "use strict";
- var regexCheck = require_regex_check();
- var asciiHexDigit = regexCheck(/[\dA-Fa-f]/);
- module2.exports = asciiHexDigit;
- }
-});
-
-// node_modules/micromark/dist/tokenize/character-reference.js
-var require_character_reference = __commonJS({
- "node_modules/micromark/dist/tokenize/character-reference.js"(exports, module2) {
- "use strict";
- var decodeEntity = require_decode_entity_browser();
- var asciiAlphanumeric = require_ascii_alphanumeric();
- var asciiDigit = require_ascii_digit();
- var asciiHexDigit = require_ascii_hex_digit();
- function _interopDefaultLegacy(e) {
- return e && typeof e === "object" && "default" in e ? e : { default: e };
- }
- var decodeEntity__default = /* @__PURE__ */ _interopDefaultLegacy(decodeEntity);
- var characterReference = {
- name: "characterReference",
- tokenize: tokenizeCharacterReference
- };
- function tokenizeCharacterReference(effects, ok, nok) {
- var self = this;
- var size = 0;
- var max;
- var test;
- return start;
- function start(code) {
- effects.enter("characterReference");
- effects.enter("characterReferenceMarker");
- effects.consume(code);
- effects.exit("characterReferenceMarker");
- return open;
- }
- function open(code) {
- if (code === 35) {
- effects.enter("characterReferenceMarkerNumeric");
- effects.consume(code);
- effects.exit("characterReferenceMarkerNumeric");
- return numeric;
- }
- effects.enter("characterReferenceValue");
- max = 31;
- test = asciiAlphanumeric;
- return value(code);
- }
- function numeric(code) {
- if (code === 88 || code === 120) {
- effects.enter("characterReferenceMarkerHexadecimal");
- effects.consume(code);
- effects.exit("characterReferenceMarkerHexadecimal");
- effects.enter("characterReferenceValue");
- max = 6;
- test = asciiHexDigit;
- return value;
- }
- effects.enter("characterReferenceValue");
- max = 7;
- test = asciiDigit;
- return value(code);
- }
- function value(code) {
- var token;
- if (code === 59 && size) {
- token = effects.exit("characterReferenceValue");
- if (test === asciiAlphanumeric && !decodeEntity__default["default"](self.sliceSerialize(token))) {
- return nok(code);
- }
- effects.enter("characterReferenceMarker");
- effects.consume(code);
- effects.exit("characterReferenceMarker");
- effects.exit("characterReference");
- return ok;
- }
- if (test(code) && size++ < max) {
- effects.consume(code);
- return value;
- }
- return nok(code);
- }
- }
- module2.exports = characterReference;
- }
-});
-
-// node_modules/micromark/dist/tokenize/code-fenced.js
-var require_code_fenced = __commonJS({
- "node_modules/micromark/dist/tokenize/code-fenced.js"(exports, module2) {
- "use strict";
- var markdownLineEnding = require_markdown_line_ending();
- var markdownLineEndingOrSpace = require_markdown_line_ending_or_space();
- var prefixSize = require_prefix_size();
- var factorySpace = require_factory_space();
- var codeFenced = {
- name: "codeFenced",
- tokenize: tokenizeCodeFenced,
- concrete: true
- };
- function tokenizeCodeFenced(effects, ok, nok) {
- var self = this;
- var closingFenceConstruct = {
- tokenize: tokenizeClosingFence,
- partial: true
- };
- var initialPrefix = prefixSize(this.events, "linePrefix");
- var sizeOpen = 0;
- var marker;
- return start;
- function start(code) {
- effects.enter("codeFenced");
- effects.enter("codeFencedFence");
- effects.enter("codeFencedFenceSequence");
- marker = code;
- return sequenceOpen(code);
- }
- function sequenceOpen(code) {
- if (code === marker) {
- effects.consume(code);
- sizeOpen++;
- return sequenceOpen;
- }
- effects.exit("codeFencedFenceSequence");
- return sizeOpen < 3 ? nok(code) : factorySpace(effects, infoOpen, "whitespace")(code);
- }
- function infoOpen(code) {
- if (code === null || markdownLineEnding(code)) {
- return openAfter(code);
- }
- effects.enter("codeFencedFenceInfo");
- effects.enter("chunkString", {
- contentType: "string"
- });
- return info(code);
- }
- function info(code) {
- if (code === null || markdownLineEndingOrSpace(code)) {
- effects.exit("chunkString");
- effects.exit("codeFencedFenceInfo");
- return factorySpace(effects, infoAfter, "whitespace")(code);
- }
- if (code === 96 && code === marker)
- return nok(code);
- effects.consume(code);
- return info;
- }
- function infoAfter(code) {
- if (code === null || markdownLineEnding(code)) {
- return openAfter(code);
- }
- effects.enter("codeFencedFenceMeta");
- effects.enter("chunkString", {
- contentType: "string"
- });
- return meta(code);
- }
- function meta(code) {
- if (code === null || markdownLineEnding(code)) {
- effects.exit("chunkString");
- effects.exit("codeFencedFenceMeta");
- return openAfter(code);
- }
- if (code === 96 && code === marker)
- return nok(code);
- effects.consume(code);
- return meta;
- }
- function openAfter(code) {
- effects.exit("codeFencedFence");
- return self.interrupt ? ok(code) : content(code);
- }
- function content(code) {
- if (code === null) {
- return after(code);
- }
- if (markdownLineEnding(code)) {
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- return effects.attempt(closingFenceConstruct, after, initialPrefix ? factorySpace(effects, content, "linePrefix", initialPrefix + 1) : content);
- }
- effects.enter("codeFlowValue");
- return contentContinue(code);
- }
- function contentContinue(code) {
- if (code === null || markdownLineEnding(code)) {
- effects.exit("codeFlowValue");
- return content(code);
- }
- effects.consume(code);
- return contentContinue;
- }
- function after(code) {
- effects.exit("codeFenced");
- return ok(code);
- }
- function tokenizeClosingFence(effects2, ok2, nok2) {
- var size = 0;
- return factorySpace(effects2, closingSequenceStart, "linePrefix", this.parser.constructs.disable.null.indexOf("codeIndented") > -1 ? void 0 : 4);
- function closingSequenceStart(code) {
- effects2.enter("codeFencedFence");
- effects2.enter("codeFencedFenceSequence");
- return closingSequence(code);
- }
- function closingSequence(code) {
- if (code === marker) {
- effects2.consume(code);
- size++;
- return closingSequence;
- }
- if (size < sizeOpen)
- return nok2(code);
- effects2.exit("codeFencedFenceSequence");
- return factorySpace(effects2, closingSequenceEnd, "whitespace")(code);
- }
- function closingSequenceEnd(code) {
- if (code === null || markdownLineEnding(code)) {
- effects2.exit("codeFencedFence");
- return ok2(code);
- }
- return nok2(code);
- }
- }
- }
- module2.exports = codeFenced;
- }
-});
-
-// node_modules/micromark/dist/tokenize/code-indented.js
-var require_code_indented = __commonJS({
- "node_modules/micromark/dist/tokenize/code-indented.js"(exports, module2) {
- "use strict";
- var markdownLineEnding = require_markdown_line_ending();
- var chunkedSplice = require_chunked_splice();
- var prefixSize = require_prefix_size();
- var factorySpace = require_factory_space();
- var codeIndented = {
- name: "codeIndented",
- tokenize: tokenizeCodeIndented,
- resolve: resolveCodeIndented
- };
- var indentedContentConstruct = {
- tokenize: tokenizeIndentedContent,
- partial: true
- };
- function resolveCodeIndented(events, context) {
- var code = {
- type: "codeIndented",
- start: events[0][1].start,
- end: events[events.length - 1][1].end
- };
- chunkedSplice(events, 0, 0, [["enter", code, context]]);
- chunkedSplice(events, events.length, 0, [["exit", code, context]]);
- return events;
- }
- function tokenizeCodeIndented(effects, ok, nok) {
- return effects.attempt(indentedContentConstruct, afterPrefix, nok);
- function afterPrefix(code) {
- if (code === null) {
- return ok(code);
- }
- if (markdownLineEnding(code)) {
- return effects.attempt(indentedContentConstruct, afterPrefix, ok)(code);
- }
- effects.enter("codeFlowValue");
- return content(code);
- }
- function content(code) {
- if (code === null || markdownLineEnding(code)) {
- effects.exit("codeFlowValue");
- return afterPrefix(code);
- }
- effects.consume(code);
- return content;
- }
- }
- function tokenizeIndentedContent(effects, ok, nok) {
- var self = this;
- return factorySpace(effects, afterPrefix, "linePrefix", 4 + 1);
- function afterPrefix(code) {
- if (markdownLineEnding(code)) {
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- return factorySpace(effects, afterPrefix, "linePrefix", 4 + 1);
- }
- return prefixSize(self.events, "linePrefix") < 4 ? nok(code) : ok(code);
- }
- }
- module2.exports = codeIndented;
- }
-});
-
-// node_modules/micromark/dist/tokenize/code-text.js
-var require_code_text = __commonJS({
- "node_modules/micromark/dist/tokenize/code-text.js"(exports, module2) {
- "use strict";
- var markdownLineEnding = require_markdown_line_ending();
- var codeText = {
- name: "codeText",
- tokenize: tokenizeCodeText,
- resolve: resolveCodeText,
- previous
- };
- function resolveCodeText(events) {
- var tailExitIndex = events.length - 4;
- var headEnterIndex = 3;
- var index;
- var enter;
- if ((events[headEnterIndex][1].type === "lineEnding" || events[headEnterIndex][1].type === "space") && (events[tailExitIndex][1].type === "lineEnding" || events[tailExitIndex][1].type === "space")) {
- index = headEnterIndex;
- while (++index < tailExitIndex) {
- if (events[index][1].type === "codeTextData") {
- events[tailExitIndex][1].type = events[headEnterIndex][1].type = "codeTextPadding";
- headEnterIndex += 2;
- tailExitIndex -= 2;
- break;
- }
- }
- }
- index = headEnterIndex - 1;
- tailExitIndex++;
- while (++index <= tailExitIndex) {
- if (enter === void 0) {
- if (index !== tailExitIndex && events[index][1].type !== "lineEnding") {
- enter = index;
- }
- } else if (index === tailExitIndex || events[index][1].type === "lineEnding") {
- events[enter][1].type = "codeTextData";
- if (index !== enter + 2) {
- events[enter][1].end = events[index - 1][1].end;
- events.splice(enter + 2, index - enter - 2);
- tailExitIndex -= index - enter - 2;
- index = enter + 2;
- }
- enter = void 0;
- }
- }
- return events;
- }
- function previous(code) {
- return code !== 96 || this.events[this.events.length - 1][1].type === "characterEscape";
- }
- function tokenizeCodeText(effects, ok, nok) {
- var sizeOpen = 0;
- var size;
- var token;
- return start;
- function start(code) {
- effects.enter("codeText");
- effects.enter("codeTextSequence");
- return openingSequence(code);
- }
- function openingSequence(code) {
- if (code === 96) {
- effects.consume(code);
- sizeOpen++;
- return openingSequence;
- }
- effects.exit("codeTextSequence");
- return gap(code);
- }
- function gap(code) {
- if (code === null) {
- return nok(code);
- }
- if (code === 96) {
- token = effects.enter("codeTextSequence");
- size = 0;
- return closingSequence(code);
- }
- if (code === 32) {
- effects.enter("space");
- effects.consume(code);
- effects.exit("space");
- return gap;
- }
- if (markdownLineEnding(code)) {
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- return gap;
- }
- effects.enter("codeTextData");
- return data(code);
- }
- function data(code) {
- if (code === null || code === 32 || code === 96 || markdownLineEnding(code)) {
- effects.exit("codeTextData");
- return gap(code);
- }
- effects.consume(code);
- return data;
- }
- function closingSequence(code) {
- if (code === 96) {
- effects.consume(code);
- size++;
- return closingSequence;
- }
- if (size === sizeOpen) {
- effects.exit("codeTextSequence");
- effects.exit("codeText");
- return ok(code);
- }
- token.type = "codeTextData";
- return data(code);
- }
- }
- module2.exports = codeText;
- }
-});
-
-// node_modules/micromark/dist/tokenize/factory-destination.js
-var require_factory_destination = __commonJS({
- "node_modules/micromark/dist/tokenize/factory-destination.js"(exports, module2) {
- "use strict";
- var asciiControl = require_ascii_control();
- var markdownLineEndingOrSpace = require_markdown_line_ending_or_space();
- var markdownLineEnding = require_markdown_line_ending();
- function destinationFactory(effects, ok, nok, type, literalType, literalMarkerType, rawType, stringType, max) {
- var limit = max || Infinity;
- var balance = 0;
- return start;
- function start(code) {
- if (code === 60) {
- effects.enter(type);
- effects.enter(literalType);
- effects.enter(literalMarkerType);
- effects.consume(code);
- effects.exit(literalMarkerType);
- return destinationEnclosedBefore;
- }
- if (asciiControl(code) || code === 41) {
- return nok(code);
- }
- effects.enter(type);
- effects.enter(rawType);
- effects.enter(stringType);
- effects.enter("chunkString", {
- contentType: "string"
- });
- return destinationRaw(code);
- }
- function destinationEnclosedBefore(code) {
- if (code === 62) {
- effects.enter(literalMarkerType);
- effects.consume(code);
- effects.exit(literalMarkerType);
- effects.exit(literalType);
- effects.exit(type);
- return ok;
- }
- effects.enter(stringType);
- effects.enter("chunkString", {
- contentType: "string"
- });
- return destinationEnclosed(code);
- }
- function destinationEnclosed(code) {
- if (code === 62) {
- effects.exit("chunkString");
- effects.exit(stringType);
- return destinationEnclosedBefore(code);
- }
- if (code === null || code === 60 || markdownLineEnding(code)) {
- return nok(code);
- }
- effects.consume(code);
- return code === 92 ? destinationEnclosedEscape : destinationEnclosed;
- }
- function destinationEnclosedEscape(code) {
- if (code === 60 || code === 62 || code === 92) {
- effects.consume(code);
- return destinationEnclosed;
- }
- return destinationEnclosed(code);
- }
- function destinationRaw(code) {
- if (code === 40) {
- if (++balance > limit)
- return nok(code);
- effects.consume(code);
- return destinationRaw;
- }
- if (code === 41) {
- if (!balance--) {
- effects.exit("chunkString");
- effects.exit(stringType);
- effects.exit(rawType);
- effects.exit(type);
- return ok(code);
- }
- effects.consume(code);
- return destinationRaw;
- }
- if (code === null || markdownLineEndingOrSpace(code)) {
- if (balance)
- return nok(code);
- effects.exit("chunkString");
- effects.exit(stringType);
- effects.exit(rawType);
- effects.exit(type);
- return ok(code);
- }
- if (asciiControl(code))
- return nok(code);
- effects.consume(code);
- return code === 92 ? destinationRawEscape : destinationRaw;
- }
- function destinationRawEscape(code) {
- if (code === 40 || code === 41 || code === 92) {
- effects.consume(code);
- return destinationRaw;
- }
- return destinationRaw(code);
- }
- }
- module2.exports = destinationFactory;
- }
-});
-
-// node_modules/micromark/dist/tokenize/factory-label.js
-var require_factory_label = __commonJS({
- "node_modules/micromark/dist/tokenize/factory-label.js"(exports, module2) {
- "use strict";
- var markdownLineEnding = require_markdown_line_ending();
- var markdownSpace = require_markdown_space();
- function labelFactory(effects, ok, nok, type, markerType, stringType) {
- var self = this;
- var size = 0;
- var data;
- return start;
- function start(code) {
- effects.enter(type);
- effects.enter(markerType);
- effects.consume(code);
- effects.exit(markerType);
- effects.enter(stringType);
- return atBreak;
- }
- function atBreak(code) {
- if (code === null || code === 91 || code === 93 && !data || code === 94 && !size && "_hiddenFootnoteSupport" in self.parser.constructs || size > 999) {
- return nok(code);
- }
- if (code === 93) {
- effects.exit(stringType);
- effects.enter(markerType);
- effects.consume(code);
- effects.exit(markerType);
- effects.exit(type);
- return ok;
- }
- if (markdownLineEnding(code)) {
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- return atBreak;
- }
- effects.enter("chunkString", {
- contentType: "string"
- });
- return label(code);
- }
- function label(code) {
- if (code === null || code === 91 || code === 93 || markdownLineEnding(code) || size++ > 999) {
- effects.exit("chunkString");
- return atBreak(code);
- }
- effects.consume(code);
- data = data || !markdownSpace(code);
- return code === 92 ? labelEscape : label;
- }
- function labelEscape(code) {
- if (code === 91 || code === 92 || code === 93) {
- effects.consume(code);
- size++;
- return label;
- }
- return label(code);
- }
- }
- module2.exports = labelFactory;
- }
-});
-
-// node_modules/micromark/dist/tokenize/factory-whitespace.js
-var require_factory_whitespace = __commonJS({
- "node_modules/micromark/dist/tokenize/factory-whitespace.js"(exports, module2) {
- "use strict";
- var markdownLineEnding = require_markdown_line_ending();
- var markdownSpace = require_markdown_space();
- var factorySpace = require_factory_space();
- function whitespaceFactory(effects, ok) {
- var seen;
- return start;
- function start(code) {
- if (markdownLineEnding(code)) {
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- seen = true;
- return start;
- }
- if (markdownSpace(code)) {
- return factorySpace(effects, start, seen ? "linePrefix" : "lineSuffix")(code);
- }
- return ok(code);
- }
- }
- module2.exports = whitespaceFactory;
- }
-});
-
-// node_modules/micromark/dist/tokenize/factory-title.js
-var require_factory_title = __commonJS({
- "node_modules/micromark/dist/tokenize/factory-title.js"(exports, module2) {
- "use strict";
- var markdownLineEnding = require_markdown_line_ending();
- var factorySpace = require_factory_space();
- function titleFactory(effects, ok, nok, type, markerType, stringType) {
- var marker;
- return start;
- function start(code) {
- effects.enter(type);
- effects.enter(markerType);
- effects.consume(code);
- effects.exit(markerType);
- marker = code === 40 ? 41 : code;
- return atFirstTitleBreak;
- }
- function atFirstTitleBreak(code) {
- if (code === marker) {
- effects.enter(markerType);
- effects.consume(code);
- effects.exit(markerType);
- effects.exit(type);
- return ok;
- }
- effects.enter(stringType);
- return atTitleBreak(code);
- }
- function atTitleBreak(code) {
- if (code === marker) {
- effects.exit(stringType);
- return atFirstTitleBreak(marker);
- }
- if (code === null) {
- return nok(code);
- }
- if (markdownLineEnding(code)) {
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- return factorySpace(effects, atTitleBreak, "linePrefix");
- }
- effects.enter("chunkString", {
- contentType: "string"
- });
- return title(code);
- }
- function title(code) {
- if (code === marker || code === null || markdownLineEnding(code)) {
- effects.exit("chunkString");
- return atTitleBreak(code);
- }
- effects.consume(code);
- return code === 92 ? titleEscape : title;
- }
- function titleEscape(code) {
- if (code === marker || code === 92) {
- effects.consume(code);
- return title;
- }
- return title(code);
- }
- }
- module2.exports = titleFactory;
- }
-});
-
-// node_modules/micromark/dist/tokenize/definition.js
-var require_definition = __commonJS({
- "node_modules/micromark/dist/tokenize/definition.js"(exports, module2) {
- "use strict";
- var markdownLineEnding = require_markdown_line_ending();
- var markdownLineEndingOrSpace = require_markdown_line_ending_or_space();
- var normalizeIdentifier = require_normalize_identifier();
- var factoryDestination = require_factory_destination();
- var factoryLabel = require_factory_label();
- var factorySpace = require_factory_space();
- var factoryWhitespace = require_factory_whitespace();
- var factoryTitle = require_factory_title();
- var definition = {
- name: "definition",
- tokenize: tokenizeDefinition
- };
- var titleConstruct = {
- tokenize: tokenizeTitle,
- partial: true
- };
- function tokenizeDefinition(effects, ok, nok) {
- var self = this;
- var identifier;
- return start;
- function start(code) {
- effects.enter("definition");
- return factoryLabel.call(self, effects, labelAfter, nok, "definitionLabel", "definitionLabelMarker", "definitionLabelString")(code);
- }
- function labelAfter(code) {
- identifier = normalizeIdentifier(self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1));
- if (code === 58) {
- effects.enter("definitionMarker");
- effects.consume(code);
- effects.exit("definitionMarker");
- return factoryWhitespace(effects, factoryDestination(effects, effects.attempt(titleConstruct, factorySpace(effects, after, "whitespace"), factorySpace(effects, after, "whitespace")), nok, "definitionDestination", "definitionDestinationLiteral", "definitionDestinationLiteralMarker", "definitionDestinationRaw", "definitionDestinationString"));
- }
- return nok(code);
- }
- function after(code) {
- if (code === null || markdownLineEnding(code)) {
- effects.exit("definition");
- if (self.parser.defined.indexOf(identifier) < 0) {
- self.parser.defined.push(identifier);
- }
- return ok(code);
- }
- return nok(code);
- }
- }
- function tokenizeTitle(effects, ok, nok) {
- return start;
- function start(code) {
- return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, before)(code) : nok(code);
- }
- function before(code) {
- if (code === 34 || code === 39 || code === 40) {
- return factoryTitle(effects, factorySpace(effects, after, "whitespace"), nok, "definitionTitle", "definitionTitleMarker", "definitionTitleString")(code);
- }
- return nok(code);
- }
- function after(code) {
- return code === null || markdownLineEnding(code) ? ok(code) : nok(code);
- }
- }
- module2.exports = definition;
- }
-});
-
-// node_modules/micromark/dist/tokenize/hard-break-escape.js
-var require_hard_break_escape = __commonJS({
- "node_modules/micromark/dist/tokenize/hard-break-escape.js"(exports, module2) {
- "use strict";
- var markdownLineEnding = require_markdown_line_ending();
- var hardBreakEscape = {
- name: "hardBreakEscape",
- tokenize: tokenizeHardBreakEscape
- };
- function tokenizeHardBreakEscape(effects, ok, nok) {
- return start;
- function start(code) {
- effects.enter("hardBreakEscape");
- effects.enter("escapeMarker");
- effects.consume(code);
- return open;
- }
- function open(code) {
- if (markdownLineEnding(code)) {
- effects.exit("escapeMarker");
- effects.exit("hardBreakEscape");
- return ok(code);
- }
- return nok(code);
- }
- }
- module2.exports = hardBreakEscape;
- }
-});
-
-// node_modules/micromark/dist/tokenize/heading-atx.js
-var require_heading_atx = __commonJS({
- "node_modules/micromark/dist/tokenize/heading-atx.js"(exports, module2) {
- "use strict";
- var markdownLineEnding = require_markdown_line_ending();
- var markdownLineEndingOrSpace = require_markdown_line_ending_or_space();
- var markdownSpace = require_markdown_space();
- var chunkedSplice = require_chunked_splice();
- var factorySpace = require_factory_space();
- var headingAtx = {
- name: "headingAtx",
- tokenize: tokenizeHeadingAtx,
- resolve: resolveHeadingAtx
- };
- function resolveHeadingAtx(events, context) {
- var contentEnd = events.length - 2;
- var contentStart = 3;
- var content;
- var text;
- if (events[contentStart][1].type === "whitespace") {
- contentStart += 2;
- }
- if (contentEnd - 2 > contentStart && events[contentEnd][1].type === "whitespace") {
- contentEnd -= 2;
- }
- if (events[contentEnd][1].type === "atxHeadingSequence" && (contentStart === contentEnd - 1 || contentEnd - 4 > contentStart && events[contentEnd - 2][1].type === "whitespace")) {
- contentEnd -= contentStart + 1 === contentEnd ? 2 : 4;
- }
- if (contentEnd > contentStart) {
- content = {
- type: "atxHeadingText",
- start: events[contentStart][1].start,
- end: events[contentEnd][1].end
- };
- text = {
- type: "chunkText",
- start: events[contentStart][1].start,
- end: events[contentEnd][1].end,
- contentType: "text"
- };
- chunkedSplice(events, contentStart, contentEnd - contentStart + 1, [
- ["enter", content, context],
- ["enter", text, context],
- ["exit", text, context],
- ["exit", content, context]
- ]);
- }
- return events;
- }
- function tokenizeHeadingAtx(effects, ok, nok) {
- var self = this;
- var size = 0;
- return start;
- function start(code) {
- effects.enter("atxHeading");
- effects.enter("atxHeadingSequence");
- return fenceOpenInside(code);
- }
- function fenceOpenInside(code) {
- if (code === 35 && size++ < 6) {
- effects.consume(code);
- return fenceOpenInside;
- }
- if (code === null || markdownLineEndingOrSpace(code)) {
- effects.exit("atxHeadingSequence");
- return self.interrupt ? ok(code) : headingBreak(code);
- }
- return nok(code);
- }
- function headingBreak(code) {
- if (code === 35) {
- effects.enter("atxHeadingSequence");
- return sequence(code);
- }
- if (code === null || markdownLineEnding(code)) {
- effects.exit("atxHeading");
- return ok(code);
- }
- if (markdownSpace(code)) {
- return factorySpace(effects, headingBreak, "whitespace")(code);
- }
- effects.enter("atxHeadingText");
- return data(code);
- }
- function sequence(code) {
- if (code === 35) {
- effects.consume(code);
- return sequence;
- }
- effects.exit("atxHeadingSequence");
- return headingBreak(code);
- }
- function data(code) {
- if (code === null || code === 35 || markdownLineEndingOrSpace(code)) {
- effects.exit("atxHeadingText");
- return headingBreak(code);
- }
- effects.consume(code);
- return data;
- }
- }
- module2.exports = headingAtx;
- }
-});
-
-// node_modules/micromark/dist/constant/html-block-names.js
-var require_html_block_names = __commonJS({
- "node_modules/micromark/dist/constant/html-block-names.js"(exports, module2) {
- "use strict";
- var basics = [
- "address",
- "article",
- "aside",
- "base",
- "basefont",
- "blockquote",
- "body",
- "caption",
- "center",
- "col",
- "colgroup",
- "dd",
- "details",
- "dialog",
- "dir",
- "div",
- "dl",
- "dt",
- "fieldset",
- "figcaption",
- "figure",
- "footer",
- "form",
- "frame",
- "frameset",
- "h1",
- "h2",
- "h3",
- "h4",
- "h5",
- "h6",
- "head",
- "header",
- "hr",
- "html",
- "iframe",
- "legend",
- "li",
- "link",
- "main",
- "menu",
- "menuitem",
- "nav",
- "noframes",
- "ol",
- "optgroup",
- "option",
- "p",
- "param",
- "section",
- "source",
- "summary",
- "table",
- "tbody",
- "td",
- "tfoot",
- "th",
- "thead",
- "title",
- "tr",
- "track",
- "ul"
- ];
- module2.exports = basics;
- }
-});
-
-// node_modules/micromark/dist/constant/html-raw-names.js
-var require_html_raw_names = __commonJS({
- "node_modules/micromark/dist/constant/html-raw-names.js"(exports, module2) {
- "use strict";
- var raws = ["pre", "script", "style", "textarea"];
- module2.exports = raws;
- }
-});
-
-// node_modules/micromark/dist/tokenize/html-flow.js
-var require_html_flow = __commonJS({
- "node_modules/micromark/dist/tokenize/html-flow.js"(exports, module2) {
- "use strict";
- var asciiAlpha = require_ascii_alpha();
- var asciiAlphanumeric = require_ascii_alphanumeric();
- var markdownLineEnding = require_markdown_line_ending();
- var markdownLineEndingOrSpace = require_markdown_line_ending_or_space();
- var markdownSpace = require_markdown_space();
- var fromCharCode = require_from_char_code();
- var htmlBlockNames = require_html_block_names();
- var htmlRawNames = require_html_raw_names();
- var partialBlankLine = require_partial_blank_line();
- var htmlFlow = {
- name: "htmlFlow",
- tokenize: tokenizeHtmlFlow,
- resolveTo: resolveToHtmlFlow,
- concrete: true
- };
- var nextBlankConstruct = {
- tokenize: tokenizeNextBlank,
- partial: true
- };
- function resolveToHtmlFlow(events) {
- var index = events.length;
- while (index--) {
- if (events[index][0] === "enter" && events[index][1].type === "htmlFlow") {
- break;
- }
- }
- if (index > 1 && events[index - 2][1].type === "linePrefix") {
- events[index][1].start = events[index - 2][1].start;
- events[index + 1][1].start = events[index - 2][1].start;
- events.splice(index - 2, 2);
- }
- return events;
- }
- function tokenizeHtmlFlow(effects, ok, nok) {
- var self = this;
- var kind;
- var startTag;
- var buffer;
- var index;
- var marker;
- return start;
- function start(code) {
- effects.enter("htmlFlow");
- effects.enter("htmlFlowData");
- effects.consume(code);
- return open;
- }
- function open(code) {
- if (code === 33) {
- effects.consume(code);
- return declarationStart;
- }
- if (code === 47) {
- effects.consume(code);
- return tagCloseStart;
- }
- if (code === 63) {
- effects.consume(code);
- kind = 3;
- return self.interrupt ? ok : continuationDeclarationInside;
- }
- if (asciiAlpha(code)) {
- effects.consume(code);
- buffer = fromCharCode(code);
- startTag = true;
- return tagName;
- }
- return nok(code);
- }
- function declarationStart(code) {
- if (code === 45) {
- effects.consume(code);
- kind = 2;
- return commentOpenInside;
- }
- if (code === 91) {
- effects.consume(code);
- kind = 5;
- buffer = "CDATA[";
- index = 0;
- return cdataOpenInside;
- }
- if (asciiAlpha(code)) {
- effects.consume(code);
- kind = 4;
- return self.interrupt ? ok : continuationDeclarationInside;
- }
- return nok(code);
- }
- function commentOpenInside(code) {
- if (code === 45) {
- effects.consume(code);
- return self.interrupt ? ok : continuationDeclarationInside;
- }
- return nok(code);
- }
- function cdataOpenInside(code) {
- if (code === buffer.charCodeAt(index++)) {
- effects.consume(code);
- return index === buffer.length ? self.interrupt ? ok : continuation : cdataOpenInside;
- }
- return nok(code);
- }
- function tagCloseStart(code) {
- if (asciiAlpha(code)) {
- effects.consume(code);
- buffer = fromCharCode(code);
- return tagName;
- }
- return nok(code);
- }
- function tagName(code) {
- if (code === null || code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {
- if (code !== 47 && startTag && htmlRawNames.indexOf(buffer.toLowerCase()) > -1) {
- kind = 1;
- return self.interrupt ? ok(code) : continuation(code);
- }
- if (htmlBlockNames.indexOf(buffer.toLowerCase()) > -1) {
- kind = 6;
- if (code === 47) {
- effects.consume(code);
- return basicSelfClosing;
- }
- return self.interrupt ? ok(code) : continuation(code);
- }
- kind = 7;
- return self.interrupt ? nok(code) : startTag ? completeAttributeNameBefore(code) : completeClosingTagAfter(code);
- }
- if (code === 45 || asciiAlphanumeric(code)) {
- effects.consume(code);
- buffer += fromCharCode(code);
- return tagName;
- }
- return nok(code);
- }
- function basicSelfClosing(code) {
- if (code === 62) {
- effects.consume(code);
- return self.interrupt ? ok : continuation;
- }
- return nok(code);
- }
- function completeClosingTagAfter(code) {
- if (markdownSpace(code)) {
- effects.consume(code);
- return completeClosingTagAfter;
- }
- return completeEnd(code);
- }
- function completeAttributeNameBefore(code) {
- if (code === 47) {
- effects.consume(code);
- return completeEnd;
- }
- if (code === 58 || code === 95 || asciiAlpha(code)) {
- effects.consume(code);
- return completeAttributeName;
- }
- if (markdownSpace(code)) {
- effects.consume(code);
- return completeAttributeNameBefore;
- }
- return completeEnd(code);
- }
- function completeAttributeName(code) {
- if (code === 45 || code === 46 || code === 58 || code === 95 || asciiAlphanumeric(code)) {
- effects.consume(code);
- return completeAttributeName;
- }
- return completeAttributeNameAfter(code);
- }
- function completeAttributeNameAfter(code) {
- if (code === 61) {
- effects.consume(code);
- return completeAttributeValueBefore;
- }
- if (markdownSpace(code)) {
- effects.consume(code);
- return completeAttributeNameAfter;
- }
- return completeAttributeNameBefore(code);
- }
- function completeAttributeValueBefore(code) {
- if (code === null || code === 60 || code === 61 || code === 62 || code === 96) {
- return nok(code);
- }
- if (code === 34 || code === 39) {
- effects.consume(code);
- marker = code;
- return completeAttributeValueQuoted;
- }
- if (markdownSpace(code)) {
- effects.consume(code);
- return completeAttributeValueBefore;
- }
- marker = void 0;
- return completeAttributeValueUnquoted(code);
- }
- function completeAttributeValueQuoted(code) {
- if (code === marker) {
- effects.consume(code);
- return completeAttributeValueQuotedAfter;
- }
- if (code === null || markdownLineEnding(code)) {
- return nok(code);
- }
- effects.consume(code);
- return completeAttributeValueQuoted;
- }
- function completeAttributeValueUnquoted(code) {
- if (code === null || code === 34 || code === 39 || code === 60 || code === 61 || code === 62 || code === 96 || markdownLineEndingOrSpace(code)) {
- return completeAttributeNameAfter(code);
- }
- effects.consume(code);
- return completeAttributeValueUnquoted;
- }
- function completeAttributeValueQuotedAfter(code) {
- if (code === 47 || code === 62 || markdownSpace(code)) {
- return completeAttributeNameBefore(code);
- }
- return nok(code);
- }
- function completeEnd(code) {
- if (code === 62) {
- effects.consume(code);
- return completeAfter;
- }
- return nok(code);
- }
- function completeAfter(code) {
- if (markdownSpace(code)) {
- effects.consume(code);
- return completeAfter;
- }
- return code === null || markdownLineEnding(code) ? continuation(code) : nok(code);
- }
- function continuation(code) {
- if (code === 45 && kind === 2) {
- effects.consume(code);
- return continuationCommentInside;
- }
- if (code === 60 && kind === 1) {
- effects.consume(code);
- return continuationRawTagOpen;
- }
- if (code === 62 && kind === 4) {
- effects.consume(code);
- return continuationClose;
- }
- if (code === 63 && kind === 3) {
- effects.consume(code);
- return continuationDeclarationInside;
- }
- if (code === 93 && kind === 5) {
- effects.consume(code);
- return continuationCharacterDataInside;
- }
- if (markdownLineEnding(code) && (kind === 6 || kind === 7)) {
- return effects.check(nextBlankConstruct, continuationClose, continuationAtLineEnding)(code);
- }
- if (code === null || markdownLineEnding(code)) {
- return continuationAtLineEnding(code);
- }
- effects.consume(code);
- return continuation;
- }
- function continuationAtLineEnding(code) {
- effects.exit("htmlFlowData");
- return htmlContinueStart(code);
- }
- function htmlContinueStart(code) {
- if (code === null) {
- return done(code);
- }
- if (markdownLineEnding(code)) {
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- return htmlContinueStart;
- }
- effects.enter("htmlFlowData");
- return continuation(code);
- }
- function continuationCommentInside(code) {
- if (code === 45) {
- effects.consume(code);
- return continuationDeclarationInside;
- }
- return continuation(code);
- }
- function continuationRawTagOpen(code) {
- if (code === 47) {
- effects.consume(code);
- buffer = "";
- return continuationRawEndTag;
- }
- return continuation(code);
- }
- function continuationRawEndTag(code) {
- if (code === 62 && htmlRawNames.indexOf(buffer.toLowerCase()) > -1) {
- effects.consume(code);
- return continuationClose;
- }
- if (asciiAlpha(code) && buffer.length < 8) {
- effects.consume(code);
- buffer += fromCharCode(code);
- return continuationRawEndTag;
- }
- return continuation(code);
- }
- function continuationCharacterDataInside(code) {
- if (code === 93) {
- effects.consume(code);
- return continuationDeclarationInside;
- }
- return continuation(code);
- }
- function continuationDeclarationInside(code) {
- if (code === 62) {
- effects.consume(code);
- return continuationClose;
- }
- return continuation(code);
- }
- function continuationClose(code) {
- if (code === null || markdownLineEnding(code)) {
- effects.exit("htmlFlowData");
- return done(code);
- }
- effects.consume(code);
- return continuationClose;
- }
- function done(code) {
- effects.exit("htmlFlow");
- return ok(code);
- }
- }
- function tokenizeNextBlank(effects, ok, nok) {
- return start;
- function start(code) {
- effects.exit("htmlFlowData");
- effects.enter("lineEndingBlank");
- effects.consume(code);
- effects.exit("lineEndingBlank");
- return effects.attempt(partialBlankLine, ok, nok);
- }
- }
- module2.exports = htmlFlow;
- }
-});
-
-// node_modules/micromark/dist/tokenize/html-text.js
-var require_html_text = __commonJS({
- "node_modules/micromark/dist/tokenize/html-text.js"(exports, module2) {
- "use strict";
- var asciiAlpha = require_ascii_alpha();
- var asciiAlphanumeric = require_ascii_alphanumeric();
- var markdownLineEnding = require_markdown_line_ending();
- var markdownLineEndingOrSpace = require_markdown_line_ending_or_space();
- var markdownSpace = require_markdown_space();
- var factorySpace = require_factory_space();
- var htmlText = {
- name: "htmlText",
- tokenize: tokenizeHtmlText
- };
- function tokenizeHtmlText(effects, ok, nok) {
- var self = this;
- var marker;
- var buffer;
- var index;
- var returnState;
- return start;
- function start(code) {
- effects.enter("htmlText");
- effects.enter("htmlTextData");
- effects.consume(code);
- return open;
- }
- function open(code) {
- if (code === 33) {
- effects.consume(code);
- return declarationOpen;
- }
- if (code === 47) {
- effects.consume(code);
- return tagCloseStart;
- }
- if (code === 63) {
- effects.consume(code);
- return instruction;
- }
- if (asciiAlpha(code)) {
- effects.consume(code);
- return tagOpen;
- }
- return nok(code);
- }
- function declarationOpen(code) {
- if (code === 45) {
- effects.consume(code);
- return commentOpen;
- }
- if (code === 91) {
- effects.consume(code);
- buffer = "CDATA[";
- index = 0;
- return cdataOpen;
- }
- if (asciiAlpha(code)) {
- effects.consume(code);
- return declaration;
- }
- return nok(code);
- }
- function commentOpen(code) {
- if (code === 45) {
- effects.consume(code);
- return commentStart;
- }
- return nok(code);
- }
- function commentStart(code) {
- if (code === null || code === 62) {
- return nok(code);
- }
- if (code === 45) {
- effects.consume(code);
- return commentStartDash;
- }
- return comment(code);
- }
- function commentStartDash(code) {
- if (code === null || code === 62) {
- return nok(code);
- }
- return comment(code);
- }
- function comment(code) {
- if (code === null) {
- return nok(code);
- }
- if (code === 45) {
- effects.consume(code);
- return commentClose;
- }
- if (markdownLineEnding(code)) {
- returnState = comment;
- return atLineEnding(code);
- }
- effects.consume(code);
- return comment;
- }
- function commentClose(code) {
- if (code === 45) {
- effects.consume(code);
- return end;
- }
- return comment(code);
- }
- function cdataOpen(code) {
- if (code === buffer.charCodeAt(index++)) {
- effects.consume(code);
- return index === buffer.length ? cdata : cdataOpen;
- }
- return nok(code);
- }
- function cdata(code) {
- if (code === null) {
- return nok(code);
- }
- if (code === 93) {
- effects.consume(code);
- return cdataClose;
- }
- if (markdownLineEnding(code)) {
- returnState = cdata;
- return atLineEnding(code);
- }
- effects.consume(code);
- return cdata;
- }
- function cdataClose(code) {
- if (code === 93) {
- effects.consume(code);
- return cdataEnd;
- }
- return cdata(code);
- }
- function cdataEnd(code) {
- if (code === 62) {
- return end(code);
- }
- if (code === 93) {
- effects.consume(code);
- return cdataEnd;
- }
- return cdata(code);
- }
- function declaration(code) {
- if (code === null || code === 62) {
- return end(code);
- }
- if (markdownLineEnding(code)) {
- returnState = declaration;
- return atLineEnding(code);
- }
- effects.consume(code);
- return declaration;
- }
- function instruction(code) {
- if (code === null) {
- return nok(code);
- }
- if (code === 63) {
- effects.consume(code);
- return instructionClose;
- }
- if (markdownLineEnding(code)) {
- returnState = instruction;
- return atLineEnding(code);
- }
- effects.consume(code);
- return instruction;
- }
- function instructionClose(code) {
- return code === 62 ? end(code) : instruction(code);
- }
- function tagCloseStart(code) {
- if (asciiAlpha(code)) {
- effects.consume(code);
- return tagClose;
- }
- return nok(code);
- }
- function tagClose(code) {
- if (code === 45 || asciiAlphanumeric(code)) {
- effects.consume(code);
- return tagClose;
- }
- return tagCloseBetween(code);
- }
- function tagCloseBetween(code) {
- if (markdownLineEnding(code)) {
- returnState = tagCloseBetween;
- return atLineEnding(code);
- }
- if (markdownSpace(code)) {
- effects.consume(code);
- return tagCloseBetween;
- }
- return end(code);
- }
- function tagOpen(code) {
- if (code === 45 || asciiAlphanumeric(code)) {
- effects.consume(code);
- return tagOpen;
- }
- if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {
- return tagOpenBetween(code);
- }
- return nok(code);
- }
- function tagOpenBetween(code) {
- if (code === 47) {
- effects.consume(code);
- return end;
- }
- if (code === 58 || code === 95 || asciiAlpha(code)) {
- effects.consume(code);
- return tagOpenAttributeName;
- }
- if (markdownLineEnding(code)) {
- returnState = tagOpenBetween;
- return atLineEnding(code);
- }
- if (markdownSpace(code)) {
- effects.consume(code);
- return tagOpenBetween;
- }
- return end(code);
- }
- function tagOpenAttributeName(code) {
- if (code === 45 || code === 46 || code === 58 || code === 95 || asciiAlphanumeric(code)) {
- effects.consume(code);
- return tagOpenAttributeName;
- }
- return tagOpenAttributeNameAfter(code);
- }
- function tagOpenAttributeNameAfter(code) {
- if (code === 61) {
- effects.consume(code);
- return tagOpenAttributeValueBefore;
- }
- if (markdownLineEnding(code)) {
- returnState = tagOpenAttributeNameAfter;
- return atLineEnding(code);
- }
- if (markdownSpace(code)) {
- effects.consume(code);
- return tagOpenAttributeNameAfter;
- }
- return tagOpenBetween(code);
- }
- function tagOpenAttributeValueBefore(code) {
- if (code === null || code === 60 || code === 61 || code === 62 || code === 96) {
- return nok(code);
- }
- if (code === 34 || code === 39) {
- effects.consume(code);
- marker = code;
- return tagOpenAttributeValueQuoted;
- }
- if (markdownLineEnding(code)) {
- returnState = tagOpenAttributeValueBefore;
- return atLineEnding(code);
- }
- if (markdownSpace(code)) {
- effects.consume(code);
- return tagOpenAttributeValueBefore;
- }
- effects.consume(code);
- marker = void 0;
- return tagOpenAttributeValueUnquoted;
- }
- function tagOpenAttributeValueQuoted(code) {
- if (code === marker) {
- effects.consume(code);
- return tagOpenAttributeValueQuotedAfter;
- }
- if (code === null) {
- return nok(code);
- }
- if (markdownLineEnding(code)) {
- returnState = tagOpenAttributeValueQuoted;
- return atLineEnding(code);
- }
- effects.consume(code);
- return tagOpenAttributeValueQuoted;
- }
- function tagOpenAttributeValueQuotedAfter(code) {
- if (code === 62 || code === 47 || markdownLineEndingOrSpace(code)) {
- return tagOpenBetween(code);
- }
- return nok(code);
- }
- function tagOpenAttributeValueUnquoted(code) {
- if (code === null || code === 34 || code === 39 || code === 60 || code === 61 || code === 96) {
- return nok(code);
- }
- if (code === 62 || markdownLineEndingOrSpace(code)) {
- return tagOpenBetween(code);
- }
- effects.consume(code);
- return tagOpenAttributeValueUnquoted;
- }
- function atLineEnding(code) {
- effects.exit("htmlTextData");
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- return factorySpace(effects, afterPrefix, "linePrefix", self.parser.constructs.disable.null.indexOf("codeIndented") > -1 ? void 0 : 4);
- }
- function afterPrefix(code) {
- effects.enter("htmlTextData");
- return returnState(code);
- }
- function end(code) {
- if (code === 62) {
- effects.consume(code);
- effects.exit("htmlTextData");
- effects.exit("htmlText");
- return ok;
- }
- return nok(code);
- }
- }
- module2.exports = htmlText;
- }
-});
-
-// node_modules/micromark/dist/tokenize/label-end.js
-var require_label_end = __commonJS({
- "node_modules/micromark/dist/tokenize/label-end.js"(exports, module2) {
- "use strict";
- var markdownLineEndingOrSpace = require_markdown_line_ending_or_space();
- var chunkedPush = require_chunked_push();
- var chunkedSplice = require_chunked_splice();
- var normalizeIdentifier = require_normalize_identifier();
- var resolveAll = require_resolve_all();
- var shallow = require_shallow();
- var factoryDestination = require_factory_destination();
- var factoryLabel = require_factory_label();
- var factoryTitle = require_factory_title();
- var factoryWhitespace = require_factory_whitespace();
- var labelEnd = {
- name: "labelEnd",
- tokenize: tokenizeLabelEnd,
- resolveTo: resolveToLabelEnd,
- resolveAll: resolveAllLabelEnd
- };
- var resourceConstruct = {
- tokenize: tokenizeResource
- };
- var fullReferenceConstruct = {
- tokenize: tokenizeFullReference
- };
- var collapsedReferenceConstruct = {
- tokenize: tokenizeCollapsedReference
- };
- function resolveAllLabelEnd(events) {
- var index = -1;
- var token;
- while (++index < events.length) {
- token = events[index][1];
- if (!token._used && (token.type === "labelImage" || token.type === "labelLink" || token.type === "labelEnd")) {
- events.splice(index + 1, token.type === "labelImage" ? 4 : 2);
- token.type = "data";
- index++;
- }
- }
- return events;
- }
- function resolveToLabelEnd(events, context) {
- var index = events.length;
- var offset = 0;
- var group;
- var label;
- var text;
- var token;
- var open;
- var close;
- var media;
- while (index--) {
- token = events[index][1];
- if (open) {
- if (token.type === "link" || token.type === "labelLink" && token._inactive) {
- break;
- }
- if (events[index][0] === "enter" && token.type === "labelLink") {
- token._inactive = true;
- }
- } else if (close) {
- if (events[index][0] === "enter" && (token.type === "labelImage" || token.type === "labelLink") && !token._balanced) {
- open = index;
- if (token.type !== "labelLink") {
- offset = 2;
- break;
- }
- }
- } else if (token.type === "labelEnd") {
- close = index;
- }
- }
- group = {
- type: events[open][1].type === "labelLink" ? "link" : "image",
- start: shallow(events[open][1].start),
- end: shallow(events[events.length - 1][1].end)
- };
- label = {
- type: "label",
- start: shallow(events[open][1].start),
- end: shallow(events[close][1].end)
- };
- text = {
- type: "labelText",
- start: shallow(events[open + offset + 2][1].end),
- end: shallow(events[close - 2][1].start)
- };
- media = [
- ["enter", group, context],
- ["enter", label, context]
- ];
- media = chunkedPush(media, events.slice(open + 1, open + offset + 3));
- media = chunkedPush(media, [["enter", text, context]]);
- media = chunkedPush(media, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + offset + 4, close - 3), context));
- media = chunkedPush(media, [
- ["exit", text, context],
- events[close - 2],
- events[close - 1],
- ["exit", label, context]
- ]);
- media = chunkedPush(media, events.slice(close + 1));
- media = chunkedPush(media, [["exit", group, context]]);
- chunkedSplice(events, open, events.length, media);
- return events;
- }
- function tokenizeLabelEnd(effects, ok, nok) {
- var self = this;
- var index = self.events.length;
- var labelStart;
- var defined;
- while (index--) {
- if ((self.events[index][1].type === "labelImage" || self.events[index][1].type === "labelLink") && !self.events[index][1]._balanced) {
- labelStart = self.events[index][1];
- break;
- }
- }
- return start;
- function start(code) {
- if (!labelStart) {
- return nok(code);
- }
- if (labelStart._inactive)
- return balanced(code);
- defined = self.parser.defined.indexOf(normalizeIdentifier(self.sliceSerialize({
- start: labelStart.end,
- end: self.now()
- }))) > -1;
- effects.enter("labelEnd");
- effects.enter("labelMarker");
- effects.consume(code);
- effects.exit("labelMarker");
- effects.exit("labelEnd");
- return afterLabelEnd;
- }
- function afterLabelEnd(code) {
- if (code === 40) {
- return effects.attempt(resourceConstruct, ok, defined ? ok : balanced)(code);
- }
- if (code === 91) {
- return effects.attempt(fullReferenceConstruct, ok, defined ? effects.attempt(collapsedReferenceConstruct, ok, balanced) : balanced)(code);
- }
- return defined ? ok(code) : balanced(code);
- }
- function balanced(code) {
- labelStart._balanced = true;
- return nok(code);
- }
- }
- function tokenizeResource(effects, ok, nok) {
- return start;
- function start(code) {
- effects.enter("resource");
- effects.enter("resourceMarker");
- effects.consume(code);
- effects.exit("resourceMarker");
- return factoryWhitespace(effects, open);
- }
- function open(code) {
- if (code === 41) {
- return end(code);
- }
- return factoryDestination(effects, destinationAfter, nok, "resourceDestination", "resourceDestinationLiteral", "resourceDestinationLiteralMarker", "resourceDestinationRaw", "resourceDestinationString", 3)(code);
- }
- function destinationAfter(code) {
- return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, between)(code) : end(code);
- }
- function between(code) {
- if (code === 34 || code === 39 || code === 40) {
- return factoryTitle(effects, factoryWhitespace(effects, end), nok, "resourceTitle", "resourceTitleMarker", "resourceTitleString")(code);
- }
- return end(code);
- }
- function end(code) {
- if (code === 41) {
- effects.enter("resourceMarker");
- effects.consume(code);
- effects.exit("resourceMarker");
- effects.exit("resource");
- return ok;
- }
- return nok(code);
- }
- }
- function tokenizeFullReference(effects, ok, nok) {
- var self = this;
- return start;
- function start(code) {
- return factoryLabel.call(self, effects, afterLabel, nok, "reference", "referenceMarker", "referenceString")(code);
- }
- function afterLabel(code) {
- return self.parser.defined.indexOf(normalizeIdentifier(self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1))) < 0 ? nok(code) : ok(code);
- }
- }
- function tokenizeCollapsedReference(effects, ok, nok) {
- return start;
- function start(code) {
- effects.enter("reference");
- effects.enter("referenceMarker");
- effects.consume(code);
- effects.exit("referenceMarker");
- return open;
- }
- function open(code) {
- if (code === 93) {
- effects.enter("referenceMarker");
- effects.consume(code);
- effects.exit("referenceMarker");
- effects.exit("reference");
- return ok;
- }
- return nok(code);
- }
- }
- module2.exports = labelEnd;
- }
-});
-
-// node_modules/micromark/dist/tokenize/label-start-image.js
-var require_label_start_image = __commonJS({
- "node_modules/micromark/dist/tokenize/label-start-image.js"(exports, module2) {
- "use strict";
- var labelEnd = require_label_end();
- var labelStartImage = {
- name: "labelStartImage",
- tokenize: tokenizeLabelStartImage,
- resolveAll: labelEnd.resolveAll
- };
- function tokenizeLabelStartImage(effects, ok, nok) {
- var self = this;
- return start;
- function start(code) {
- effects.enter("labelImage");
- effects.enter("labelImageMarker");
- effects.consume(code);
- effects.exit("labelImageMarker");
- return open;
- }
- function open(code) {
- if (code === 91) {
- effects.enter("labelMarker");
- effects.consume(code);
- effects.exit("labelMarker");
- effects.exit("labelImage");
- return after;
- }
- return nok(code);
- }
- function after(code) {
- return code === 94 && "_hiddenFootnoteSupport" in self.parser.constructs ? nok(code) : ok(code);
- }
- }
- module2.exports = labelStartImage;
- }
-});
-
-// node_modules/micromark/dist/tokenize/label-start-link.js
-var require_label_start_link = __commonJS({
- "node_modules/micromark/dist/tokenize/label-start-link.js"(exports, module2) {
- "use strict";
- var labelEnd = require_label_end();
- var labelStartLink = {
- name: "labelStartLink",
- tokenize: tokenizeLabelStartLink,
- resolveAll: labelEnd.resolveAll
- };
- function tokenizeLabelStartLink(effects, ok, nok) {
- var self = this;
- return start;
- function start(code) {
- effects.enter("labelLink");
- effects.enter("labelMarker");
- effects.consume(code);
- effects.exit("labelMarker");
- effects.exit("labelLink");
- return after;
- }
- function after(code) {
- return code === 94 && "_hiddenFootnoteSupport" in self.parser.constructs ? nok(code) : ok(code);
- }
- }
- module2.exports = labelStartLink;
- }
-});
-
-// node_modules/micromark/dist/tokenize/line-ending.js
-var require_line_ending = __commonJS({
- "node_modules/micromark/dist/tokenize/line-ending.js"(exports, module2) {
- "use strict";
- var factorySpace = require_factory_space();
- var lineEnding = {
- name: "lineEnding",
- tokenize: tokenizeLineEnding
- };
- function tokenizeLineEnding(effects, ok) {
- return start;
- function start(code) {
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- return factorySpace(effects, ok, "linePrefix");
- }
- }
- module2.exports = lineEnding;
- }
-});
-
-// node_modules/micromark/dist/tokenize/thematic-break.js
-var require_thematic_break = __commonJS({
- "node_modules/micromark/dist/tokenize/thematic-break.js"(exports, module2) {
- "use strict";
- var markdownLineEnding = require_markdown_line_ending();
- var markdownSpace = require_markdown_space();
- var factorySpace = require_factory_space();
- var thematicBreak = {
- name: "thematicBreak",
- tokenize: tokenizeThematicBreak
- };
- function tokenizeThematicBreak(effects, ok, nok) {
- var size = 0;
- var marker;
- return start;
- function start(code) {
- effects.enter("thematicBreak");
- marker = code;
- return atBreak(code);
- }
- function atBreak(code) {
- if (code === marker) {
- effects.enter("thematicBreakSequence");
- return sequence(code);
- }
- if (markdownSpace(code)) {
- return factorySpace(effects, atBreak, "whitespace")(code);
- }
- if (size < 3 || code !== null && !markdownLineEnding(code)) {
- return nok(code);
- }
- effects.exit("thematicBreak");
- return ok(code);
- }
- function sequence(code) {
- if (code === marker) {
- effects.consume(code);
- size++;
- return sequence;
- }
- effects.exit("thematicBreakSequence");
- return atBreak(code);
- }
- }
- module2.exports = thematicBreak;
- }
-});
-
-// node_modules/micromark/dist/tokenize/list.js
-var require_list = __commonJS({
- "node_modules/micromark/dist/tokenize/list.js"(exports, module2) {
- "use strict";
- var asciiDigit = require_ascii_digit();
- var markdownSpace = require_markdown_space();
- var prefixSize = require_prefix_size();
- var sizeChunks = require_size_chunks();
- var factorySpace = require_factory_space();
- var partialBlankLine = require_partial_blank_line();
- var thematicBreak = require_thematic_break();
- var list = {
- name: "list",
- tokenize: tokenizeListStart,
- continuation: {
- tokenize: tokenizeListContinuation
- },
- exit: tokenizeListEnd
- };
- var listItemPrefixWhitespaceConstruct = {
- tokenize: tokenizeListItemPrefixWhitespace,
- partial: true
- };
- var indentConstruct = {
- tokenize: tokenizeIndent,
- partial: true
- };
- function tokenizeListStart(effects, ok, nok) {
- var self = this;
- var initialSize = prefixSize(self.events, "linePrefix");
- var size = 0;
- return start;
- function start(code) {
- var kind = self.containerState.type || (code === 42 || code === 43 || code === 45 ? "listUnordered" : "listOrdered");
- if (kind === "listUnordered" ? !self.containerState.marker || code === self.containerState.marker : asciiDigit(code)) {
- if (!self.containerState.type) {
- self.containerState.type = kind;
- effects.enter(kind, {
- _container: true
- });
- }
- if (kind === "listUnordered") {
- effects.enter("listItemPrefix");
- return code === 42 || code === 45 ? effects.check(thematicBreak, nok, atMarker)(code) : atMarker(code);
- }
- if (!self.interrupt || code === 49) {
- effects.enter("listItemPrefix");
- effects.enter("listItemValue");
- return inside(code);
- }
- }
- return nok(code);
- }
- function inside(code) {
- if (asciiDigit(code) && ++size < 10) {
- effects.consume(code);
- return inside;
- }
- if ((!self.interrupt || size < 2) && (self.containerState.marker ? code === self.containerState.marker : code === 41 || code === 46)) {
- effects.exit("listItemValue");
- return atMarker(code);
- }
- return nok(code);
- }
- function atMarker(code) {
- effects.enter("listItemMarker");
- effects.consume(code);
- effects.exit("listItemMarker");
- self.containerState.marker = self.containerState.marker || code;
- return effects.check(partialBlankLine, self.interrupt ? nok : onBlank, effects.attempt(listItemPrefixWhitespaceConstruct, endOfPrefix, otherPrefix));
- }
- function onBlank(code) {
- self.containerState.initialBlankLine = true;
- initialSize++;
- return endOfPrefix(code);
- }
- function otherPrefix(code) {
- if (markdownSpace(code)) {
- effects.enter("listItemPrefixWhitespace");
- effects.consume(code);
- effects.exit("listItemPrefixWhitespace");
- return endOfPrefix;
- }
- return nok(code);
- }
- function endOfPrefix(code) {
- self.containerState.size = initialSize + sizeChunks(self.sliceStream(effects.exit("listItemPrefix")));
- return ok(code);
- }
- }
- function tokenizeListContinuation(effects, ok, nok) {
- var self = this;
- self.containerState._closeFlow = void 0;
- return effects.check(partialBlankLine, onBlank, notBlank);
- function onBlank(code) {
- self.containerState.furtherBlankLines = self.containerState.furtherBlankLines || self.containerState.initialBlankLine;
- return factorySpace(effects, ok, "listItemIndent", self.containerState.size + 1)(code);
- }
- function notBlank(code) {
- if (self.containerState.furtherBlankLines || !markdownSpace(code)) {
- self.containerState.furtherBlankLines = self.containerState.initialBlankLine = void 0;
- return notInCurrentItem(code);
- }
- self.containerState.furtherBlankLines = self.containerState.initialBlankLine = void 0;
- return effects.attempt(indentConstruct, ok, notInCurrentItem)(code);
- }
- function notInCurrentItem(code) {
- self.containerState._closeFlow = true;
- self.interrupt = void 0;
- return factorySpace(effects, effects.attempt(list, ok, nok), "linePrefix", self.parser.constructs.disable.null.indexOf("codeIndented") > -1 ? void 0 : 4)(code);
- }
- }
- function tokenizeIndent(effects, ok, nok) {
- var self = this;
- return factorySpace(effects, afterPrefix, "listItemIndent", self.containerState.size + 1);
- function afterPrefix(code) {
- return prefixSize(self.events, "listItemIndent") === self.containerState.size ? ok(code) : nok(code);
- }
- }
- function tokenizeListEnd(effects) {
- effects.exit(this.containerState.type);
- }
- function tokenizeListItemPrefixWhitespace(effects, ok, nok) {
- var self = this;
- return factorySpace(effects, afterPrefix, "listItemPrefixWhitespace", self.parser.constructs.disable.null.indexOf("codeIndented") > -1 ? void 0 : 4 + 1);
- function afterPrefix(code) {
- return markdownSpace(code) || !prefixSize(self.events, "listItemPrefixWhitespace") ? nok(code) : ok(code);
- }
- }
- module2.exports = list;
- }
-});
-
-// node_modules/micromark/dist/tokenize/setext-underline.js
-var require_setext_underline = __commonJS({
- "node_modules/micromark/dist/tokenize/setext-underline.js"(exports, module2) {
- "use strict";
- var markdownLineEnding = require_markdown_line_ending();
- var shallow = require_shallow();
- var factorySpace = require_factory_space();
- var setextUnderline = {
- name: "setextUnderline",
- tokenize: tokenizeSetextUnderline,
- resolveTo: resolveToSetextUnderline
- };
- function resolveToSetextUnderline(events, context) {
- var index = events.length;
- var content;
- var text;
- var definition;
- var heading;
- while (index--) {
- if (events[index][0] === "enter") {
- if (events[index][1].type === "content") {
- content = index;
- break;
- }
- if (events[index][1].type === "paragraph") {
- text = index;
- }
- } else {
- if (events[index][1].type === "content") {
- events.splice(index, 1);
- }
- if (!definition && events[index][1].type === "definition") {
- definition = index;
- }
- }
- }
- heading = {
- type: "setextHeading",
- start: shallow(events[text][1].start),
- end: shallow(events[events.length - 1][1].end)
- };
- events[text][1].type = "setextHeadingText";
- if (definition) {
- events.splice(text, 0, ["enter", heading, context]);
- events.splice(definition + 1, 0, ["exit", events[content][1], context]);
- events[content][1].end = shallow(events[definition][1].end);
- } else {
- events[content][1] = heading;
- }
- events.push(["exit", heading, context]);
- return events;
- }
- function tokenizeSetextUnderline(effects, ok, nok) {
- var self = this;
- var index = self.events.length;
- var marker;
- var paragraph;
- while (index--) {
- if (self.events[index][1].type !== "lineEnding" && self.events[index][1].type !== "linePrefix" && self.events[index][1].type !== "content") {
- paragraph = self.events[index][1].type === "paragraph";
- break;
- }
- }
- return start;
- function start(code) {
- if (!self.lazy && (self.interrupt || paragraph)) {
- effects.enter("setextHeadingLine");
- effects.enter("setextHeadingLineSequence");
- marker = code;
- return closingSequence(code);
- }
- return nok(code);
- }
- function closingSequence(code) {
- if (code === marker) {
- effects.consume(code);
- return closingSequence;
- }
- effects.exit("setextHeadingLineSequence");
- return factorySpace(effects, closingSequenceEnd, "lineSuffix")(code);
- }
- function closingSequenceEnd(code) {
- if (code === null || markdownLineEnding(code)) {
- effects.exit("setextHeadingLine");
- return ok(code);
- }
- return nok(code);
- }
- }
- module2.exports = setextUnderline;
- }
-});
-
-// node_modules/micromark/dist/constructs.js
-var require_constructs = __commonJS({
- "node_modules/micromark/dist/constructs.js"(exports) {
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var text$1 = require_text();
- var attention = require_attention();
- var autolink = require_autolink();
- var blockQuote = require_block_quote();
- var characterEscape = require_character_escape();
- var characterReference = require_character_reference();
- var codeFenced = require_code_fenced();
- var codeIndented = require_code_indented();
- var codeText = require_code_text();
- var definition = require_definition();
- var hardBreakEscape = require_hard_break_escape();
- var headingAtx = require_heading_atx();
- var htmlFlow = require_html_flow();
- var htmlText = require_html_text();
- var labelEnd = require_label_end();
- var labelStartImage = require_label_start_image();
- var labelStartLink = require_label_start_link();
- var lineEnding = require_line_ending();
- var list = require_list();
- var setextUnderline = require_setext_underline();
- var thematicBreak = require_thematic_break();
- var document2 = {
- 42: list,
- 43: list,
- 45: list,
- 48: list,
- 49: list,
- 50: list,
- 51: list,
- 52: list,
- 53: list,
- 54: list,
- 55: list,
- 56: list,
- 57: list,
- 62: blockQuote
- };
- var contentInitial = {
- 91: definition
- };
- var flowInitial = {
- "-2": codeIndented,
- "-1": codeIndented,
- 32: codeIndented
- };
- var flow = {
- 35: headingAtx,
- 42: thematicBreak,
- 45: [setextUnderline, thematicBreak],
- 60: htmlFlow,
- 61: setextUnderline,
- 95: thematicBreak,
- 96: codeFenced,
- 126: codeFenced
- };
- var string2 = {
- 38: characterReference,
- 92: characterEscape
- };
- var text = {
- "-5": lineEnding,
- "-4": lineEnding,
- "-3": lineEnding,
- 33: labelStartImage,
- 38: characterReference,
- 42: attention,
- 60: [autolink, htmlText],
- 91: labelStartLink,
- 92: [hardBreakEscape, characterEscape],
- 93: labelEnd,
- 95: attention,
- 96: codeText
- };
- var insideSpan = {
- null: [attention, text$1.resolver]
- };
- var disable = {
- null: []
- };
- exports.contentInitial = contentInitial;
- exports.disable = disable;
- exports.document = document2;
- exports.flow = flow;
- exports.flowInitial = flowInitial;
- exports.insideSpan = insideSpan;
- exports.string = string2;
- exports.text = text;
- }
-});
-
-// node_modules/micromark/dist/parse.js
-var require_parse = __commonJS({
- "node_modules/micromark/dist/parse.js"(exports, module2) {
- "use strict";
- var content = require_content();
- var document2 = require_document();
- var flow = require_flow();
- var text = require_text();
- var combineExtensions = require_combine_extensions();
- var createTokenizer = require_create_tokenizer();
- var miniflat = require_miniflat();
- var constructs = require_constructs();
- function parse3(options) {
- var settings = options || {};
- var parser = {
- defined: [],
- constructs: combineExtensions([constructs].concat(miniflat(settings.extensions))),
- content: create(content),
- document: create(document2),
- flow: create(flow),
- string: create(text.string),
- text: create(text.text)
- };
- return parser;
- function create(initializer) {
- return creator;
- function creator(from) {
- return createTokenizer(parser, initializer, from);
- }
- }
- }
- module2.exports = parse3;
- }
-});
-
-// node_modules/micromark/dist/preprocess.js
-var require_preprocess = __commonJS({
- "node_modules/micromark/dist/preprocess.js"(exports, module2) {
- "use strict";
- var search = /[\0\t\n\r]/g;
- function preprocess() {
- var start = true;
- var column = 1;
- var buffer = "";
- var atCarriageReturn;
- return preprocessor;
- function preprocessor(value, encoding, end) {
- var chunks = [];
- var match;
- var next;
- var startPosition;
- var endPosition;
- var code;
- value = buffer + value.toString(encoding);
- startPosition = 0;
- buffer = "";
- if (start) {
- if (value.charCodeAt(0) === 65279) {
- startPosition++;
- }
- start = void 0;
- }
- while (startPosition < value.length) {
- search.lastIndex = startPosition;
- match = search.exec(value);
- endPosition = match ? match.index : value.length;
- code = value.charCodeAt(endPosition);
- if (!match) {
- buffer = value.slice(startPosition);
- break;
- }
- if (code === 10 && startPosition === endPosition && atCarriageReturn) {
- chunks.push(-3);
- atCarriageReturn = void 0;
- } else {
- if (atCarriageReturn) {
- chunks.push(-5);
- atCarriageReturn = void 0;
- }
- if (startPosition < endPosition) {
- chunks.push(value.slice(startPosition, endPosition));
- column += endPosition - startPosition;
- }
- if (code === 0) {
- chunks.push(65533);
- column++;
- } else if (code === 9) {
- next = Math.ceil(column / 4) * 4;
- chunks.push(-2);
- while (column++ < next)
- chunks.push(-1);
- } else if (code === 10) {
- chunks.push(-4);
- column = 1;
- } else {
- atCarriageReturn = true;
- column = 1;
- }
- }
- startPosition = endPosition + 1;
- }
- if (end) {
- if (atCarriageReturn)
- chunks.push(-5);
- if (buffer)
- chunks.push(buffer);
- chunks.push(null);
- }
- return chunks;
- }
- }
- module2.exports = preprocess;
- }
-});
-
-// node_modules/micromark/dist/postprocess.js
-var require_postprocess = __commonJS({
- "node_modules/micromark/dist/postprocess.js"(exports, module2) {
- "use strict";
- var subtokenize = require_subtokenize();
- function postprocess(events) {
- while (!subtokenize(events)) {
- }
- return events;
- }
- module2.exports = postprocess;
- }
-});
-
-// node_modules/mdast-util-from-markdown/dist/index.js
-var require_dist = __commonJS({
- "node_modules/mdast-util-from-markdown/dist/index.js"(exports, module2) {
- "use strict";
- module2.exports = fromMarkdown;
- var toString = require_mdast_util_to_string();
- var assign = require_assign();
- var own = require_has_own_property();
- var normalizeIdentifier = require_normalize_identifier();
- var safeFromInt = require_safe_from_int();
- var parser = require_parse();
- var preprocessor = require_preprocess();
- var postprocess = require_postprocess();
- var decode = require_decode_entity_browser();
- var stringifyPosition = require_unist_util_stringify_position();
- function fromMarkdown(value, encoding, options) {
- if (typeof encoding !== "string") {
- options = encoding;
- encoding = void 0;
- }
- return compiler(options)(postprocess(parser(options).document().write(preprocessor()(value, encoding, true))));
- }
- function compiler(options) {
- var settings = options || {};
- var config = configure({
- transforms: [],
- canContainEols: [
- "emphasis",
- "fragment",
- "heading",
- "paragraph",
- "strong"
- ],
- enter: {
- autolink: opener(link),
- autolinkProtocol: onenterdata,
- autolinkEmail: onenterdata,
- atxHeading: opener(heading),
- blockQuote: opener(blockQuote),
- characterEscape: onenterdata,
- characterReference: onenterdata,
- codeFenced: opener(codeFlow),
- codeFencedFenceInfo: buffer,
- codeFencedFenceMeta: buffer,
- codeIndented: opener(codeFlow, buffer),
- codeText: opener(codeText, buffer),
- codeTextData: onenterdata,
- data: onenterdata,
- codeFlowValue: onenterdata,
- definition: opener(definition),
- definitionDestinationString: buffer,
- definitionLabelString: buffer,
- definitionTitleString: buffer,
- emphasis: opener(emphasis),
- hardBreakEscape: opener(hardBreak),
- hardBreakTrailing: opener(hardBreak),
- htmlFlow: opener(html, buffer),
- htmlFlowData: onenterdata,
- htmlText: opener(html, buffer),
- htmlTextData: onenterdata,
- image: opener(image),
- label: buffer,
- link: opener(link),
- listItem: opener(listItem),
- listItemValue: onenterlistitemvalue,
- listOrdered: opener(list, onenterlistordered),
- listUnordered: opener(list),
- paragraph: opener(paragraph),
- reference: onenterreference,
- referenceString: buffer,
- resourceDestinationString: buffer,
- resourceTitleString: buffer,
- setextHeading: opener(heading),
- strong: opener(strong),
- thematicBreak: opener(thematicBreak)
- },
- exit: {
- atxHeading: closer(),
- atxHeadingSequence: onexitatxheadingsequence,
- autolink: closer(),
- autolinkEmail: onexitautolinkemail,
- autolinkProtocol: onexitautolinkprotocol,
- blockQuote: closer(),
- characterEscapeValue: onexitdata,
- characterReferenceMarkerHexadecimal: onexitcharacterreferencemarker,
- characterReferenceMarkerNumeric: onexitcharacterreferencemarker,
- characterReferenceValue: onexitcharacterreferencevalue,
- codeFenced: closer(onexitcodefenced),
- codeFencedFence: onexitcodefencedfence,
- codeFencedFenceInfo: onexitcodefencedfenceinfo,
- codeFencedFenceMeta: onexitcodefencedfencemeta,
- codeFlowValue: onexitdata,
- codeIndented: closer(onexitcodeindented),
- codeText: closer(onexitcodetext),
- codeTextData: onexitdata,
- data: onexitdata,
- definition: closer(),
- definitionDestinationString: onexitdefinitiondestinationstring,
- definitionLabelString: onexitdefinitionlabelstring,
- definitionTitleString: onexitdefinitiontitlestring,
- emphasis: closer(),
- hardBreakEscape: closer(onexithardbreak),
- hardBreakTrailing: closer(onexithardbreak),
- htmlFlow: closer(onexithtmlflow),
- htmlFlowData: onexitdata,
- htmlText: closer(onexithtmltext),
- htmlTextData: onexitdata,
- image: closer(onexitimage),
- label: onexitlabel,
- labelText: onexitlabeltext,
- lineEnding: onexitlineending,
- link: closer(onexitlink),
- listItem: closer(),
- listOrdered: closer(),
- listUnordered: closer(),
- paragraph: closer(),
- referenceString: onexitreferencestring,
- resourceDestinationString: onexitresourcedestinationstring,
- resourceTitleString: onexitresourcetitlestring,
- resource: onexitresource,
- setextHeading: closer(onexitsetextheading),
- setextHeadingLineSequence: onexitsetextheadinglinesequence,
- setextHeadingText: onexitsetextheadingtext,
- strong: closer(),
- thematicBreak: closer()
- }
- }, settings.mdastExtensions || []);
- var data = {};
- return compile;
- function compile(events) {
- var tree = { type: "root", children: [] };
- var stack = [tree];
- var tokenStack = [];
- var listStack = [];
- var index = -1;
- var handler;
- var listStart;
- var context = {
- stack,
- tokenStack,
- config,
- enter,
- exit,
- buffer,
- resume,
- setData,
- getData
- };
- while (++index < events.length) {
- if (events[index][1].type === "listOrdered" || events[index][1].type === "listUnordered") {
- if (events[index][0] === "enter") {
- listStack.push(index);
- } else {
- listStart = listStack.pop(index);
- index = prepareList(events, listStart, index);
- }
- }
- }
- index = -1;
- while (++index < events.length) {
- handler = config[events[index][0]];
- if (own.call(handler, events[index][1].type)) {
- handler[events[index][1].type].call(assign({ sliceSerialize: events[index][2].sliceSerialize }, context), events[index][1]);
- }
- }
- if (tokenStack.length) {
- throw new Error("Cannot close document, a token (`" + tokenStack[tokenStack.length - 1].type + "`, " + stringifyPosition({
- start: tokenStack[tokenStack.length - 1].start,
- end: tokenStack[tokenStack.length - 1].end
- }) + ") is still open");
- }
- tree.position = {
- start: point(events.length ? events[0][1].start : { line: 1, column: 1, offset: 0 }),
- end: point(events.length ? events[events.length - 2][1].end : { line: 1, column: 1, offset: 0 })
- };
- index = -1;
- while (++index < config.transforms.length) {
- tree = config.transforms[index](tree) || tree;
- }
- return tree;
- }
- function prepareList(events, start, length) {
- var index = start - 1;
- var containerBalance = -1;
- var listSpread = false;
- var listItem2;
- var tailIndex;
- var lineIndex;
- var tailEvent;
- var event;
- var firstBlankLineIndex;
- var atMarker;
- while (++index <= length) {
- event = events[index];
- if (event[1].type === "listUnordered" || event[1].type === "listOrdered" || event[1].type === "blockQuote") {
- if (event[0] === "enter") {
- containerBalance++;
- } else {
- containerBalance--;
- }
- atMarker = void 0;
- } else if (event[1].type === "lineEndingBlank") {
- if (event[0] === "enter") {
- if (listItem2 && !atMarker && !containerBalance && !firstBlankLineIndex) {
- firstBlankLineIndex = index;
- }
- atMarker = void 0;
- }
- } else if (event[1].type === "linePrefix" || event[1].type === "listItemValue" || event[1].type === "listItemMarker" || event[1].type === "listItemPrefix" || event[1].type === "listItemPrefixWhitespace") {
- } else {
- atMarker = void 0;
- }
- if (!containerBalance && event[0] === "enter" && event[1].type === "listItemPrefix" || containerBalance === -1 && event[0] === "exit" && (event[1].type === "listUnordered" || event[1].type === "listOrdered")) {
- if (listItem2) {
- tailIndex = index;
- lineIndex = void 0;
- while (tailIndex--) {
- tailEvent = events[tailIndex];
- if (tailEvent[1].type === "lineEnding" || tailEvent[1].type === "lineEndingBlank") {
- if (tailEvent[0] === "exit")
- continue;
- if (lineIndex) {
- events[lineIndex][1].type = "lineEndingBlank";
- listSpread = true;
- }
- tailEvent[1].type = "lineEnding";
- lineIndex = tailIndex;
- } else if (tailEvent[1].type === "linePrefix" || tailEvent[1].type === "blockQuotePrefix" || tailEvent[1].type === "blockQuotePrefixWhitespace" || tailEvent[1].type === "blockQuoteMarker" || tailEvent[1].type === "listItemIndent") {
- } else {
- break;
- }
- }
- if (firstBlankLineIndex && (!lineIndex || firstBlankLineIndex < lineIndex)) {
- listItem2._spread = true;
- }
- listItem2.end = point(lineIndex ? events[lineIndex][1].start : event[1].end);
- events.splice(lineIndex || index, 0, ["exit", listItem2, event[2]]);
- index++;
- length++;
- }
- if (event[1].type === "listItemPrefix") {
- listItem2 = {
- type: "listItem",
- _spread: false,
- start: point(event[1].start)
- };
- events.splice(index, 0, ["enter", listItem2, event[2]]);
- index++;
- length++;
- firstBlankLineIndex = void 0;
- atMarker = true;
- }
- }
- }
- events[start][1]._spread = listSpread;
- return length;
- }
- function setData(key, value) {
- data[key] = value;
- }
- function getData(key) {
- return data[key];
- }
- function point(d) {
- return { line: d.line, column: d.column, offset: d.offset };
- }
- function opener(create, and) {
- return open;
- function open(token) {
- enter.call(this, create(token), token);
- if (and)
- and.call(this, token);
- }
- }
- function buffer() {
- this.stack.push({ type: "fragment", children: [] });
- }
- function enter(node, token) {
- this.stack[this.stack.length - 1].children.push(node);
- this.stack.push(node);
- this.tokenStack.push(token);
- node.position = { start: point(token.start) };
- return node;
- }
- function closer(and) {
- return close;
- function close(token) {
- if (and)
- and.call(this, token);
- exit.call(this, token);
- }
- }
- function exit(token) {
- var node = this.stack.pop();
- var open = this.tokenStack.pop();
- if (!open) {
- throw new Error("Cannot close `" + token.type + "` (" + stringifyPosition({ start: token.start, end: token.end }) + "): it\u2019s not open");
- } else if (open.type !== token.type) {
- throw new Error("Cannot close `" + token.type + "` (" + stringifyPosition({ start: token.start, end: token.end }) + "): a different token (`" + open.type + "`, " + stringifyPosition({ start: open.start, end: open.end }) + ") is open");
- }
- node.position.end = point(token.end);
- return node;
- }
- function resume() {
- return toString(this.stack.pop());
- }
- function onenterlistordered() {
- setData("expectingFirstListItemValue", true);
- }
- function onenterlistitemvalue(token) {
- if (getData("expectingFirstListItemValue")) {
- this.stack[this.stack.length - 2].start = parseInt(this.sliceSerialize(token), 10);
- setData("expectingFirstListItemValue");
- }
- }
- function onexitcodefencedfenceinfo() {
- var data2 = this.resume();
- this.stack[this.stack.length - 1].lang = data2;
- }
- function onexitcodefencedfencemeta() {
- var data2 = this.resume();
- this.stack[this.stack.length - 1].meta = data2;
- }
- function onexitcodefencedfence() {
- if (getData("flowCodeInside"))
- return;
- this.buffer();
- setData("flowCodeInside", true);
- }
- function onexitcodefenced() {
- var data2 = this.resume();
- this.stack[this.stack.length - 1].value = data2.replace(/^(\r?\n|\r)|(\r?\n|\r)$/g, "");
- setData("flowCodeInside");
- }
- function onexitcodeindented() {
- var data2 = this.resume();
- this.stack[this.stack.length - 1].value = data2;
- }
- function onexitdefinitionlabelstring(token) {
- var label = this.resume();
- this.stack[this.stack.length - 1].label = label;
- this.stack[this.stack.length - 1].identifier = normalizeIdentifier(this.sliceSerialize(token)).toLowerCase();
- }
- function onexitdefinitiontitlestring() {
- var data2 = this.resume();
- this.stack[this.stack.length - 1].title = data2;
- }
- function onexitdefinitiondestinationstring() {
- var data2 = this.resume();
- this.stack[this.stack.length - 1].url = data2;
- }
- function onexitatxheadingsequence(token) {
- if (!this.stack[this.stack.length - 1].depth) {
- this.stack[this.stack.length - 1].depth = this.sliceSerialize(token).length;
- }
- }
- function onexitsetextheadingtext() {
- setData("setextHeadingSlurpLineEnding", true);
- }
- function onexitsetextheadinglinesequence(token) {
- this.stack[this.stack.length - 1].depth = this.sliceSerialize(token).charCodeAt(0) === 61 ? 1 : 2;
- }
- function onexitsetextheading() {
- setData("setextHeadingSlurpLineEnding");
- }
- function onenterdata(token) {
- var siblings = this.stack[this.stack.length - 1].children;
- var tail = siblings[siblings.length - 1];
- if (!tail || tail.type !== "text") {
- tail = text();
- tail.position = { start: point(token.start) };
- this.stack[this.stack.length - 1].children.push(tail);
- }
- this.stack.push(tail);
- }
- function onexitdata(token) {
- var tail = this.stack.pop();
- tail.value += this.sliceSerialize(token);
- tail.position.end = point(token.end);
- }
- function onexitlineending(token) {
- var context = this.stack[this.stack.length - 1];
- if (getData("atHardBreak")) {
- context.children[context.children.length - 1].position.end = point(token.end);
- setData("atHardBreak");
- return;
- }
- if (!getData("setextHeadingSlurpLineEnding") && config.canContainEols.indexOf(context.type) > -1) {
- onenterdata.call(this, token);
- onexitdata.call(this, token);
- }
- }
- function onexithardbreak() {
- setData("atHardBreak", true);
- }
- function onexithtmlflow() {
- var data2 = this.resume();
- this.stack[this.stack.length - 1].value = data2;
- }
- function onexithtmltext() {
- var data2 = this.resume();
- this.stack[this.stack.length - 1].value = data2;
- }
- function onexitcodetext() {
- var data2 = this.resume();
- this.stack[this.stack.length - 1].value = data2;
- }
- function onexitlink() {
- var context = this.stack[this.stack.length - 1];
- if (getData("inReference")) {
- context.type += "Reference";
- context.referenceType = getData("referenceType") || "shortcut";
- delete context.url;
- delete context.title;
- } else {
- delete context.identifier;
- delete context.label;
- delete context.referenceType;
- }
- setData("referenceType");
- }
- function onexitimage() {
- var context = this.stack[this.stack.length - 1];
- if (getData("inReference")) {
- context.type += "Reference";
- context.referenceType = getData("referenceType") || "shortcut";
- delete context.url;
- delete context.title;
- } else {
- delete context.identifier;
- delete context.label;
- delete context.referenceType;
- }
- setData("referenceType");
- }
- function onexitlabeltext(token) {
- this.stack[this.stack.length - 2].identifier = normalizeIdentifier(this.sliceSerialize(token)).toLowerCase();
- }
- function onexitlabel() {
- var fragment = this.stack[this.stack.length - 1];
- var value = this.resume();
- this.stack[this.stack.length - 1].label = value;
- setData("inReference", true);
- if (this.stack[this.stack.length - 1].type === "link") {
- this.stack[this.stack.length - 1].children = fragment.children;
- } else {
- this.stack[this.stack.length - 1].alt = value;
- }
- }
- function onexitresourcedestinationstring() {
- var data2 = this.resume();
- this.stack[this.stack.length - 1].url = data2;
- }
- function onexitresourcetitlestring() {
- var data2 = this.resume();
- this.stack[this.stack.length - 1].title = data2;
- }
- function onexitresource() {
- setData("inReference");
- }
- function onenterreference() {
- setData("referenceType", "collapsed");
- }
- function onexitreferencestring(token) {
- var label = this.resume();
- this.stack[this.stack.length - 1].label = label;
- this.stack[this.stack.length - 1].identifier = normalizeIdentifier(this.sliceSerialize(token)).toLowerCase();
- setData("referenceType", "full");
- }
- function onexitcharacterreferencemarker(token) {
- setData("characterReferenceType", token.type);
- }
- function onexitcharacterreferencevalue(token) {
- var data2 = this.sliceSerialize(token);
- var type = getData("characterReferenceType");
- var value;
- var tail;
- if (type) {
- value = safeFromInt(data2, type === "characterReferenceMarkerNumeric" ? 10 : 16);
- setData("characterReferenceType");
- } else {
- value = decode(data2);
- }
- tail = this.stack.pop();
- tail.value += value;
- tail.position.end = point(token.end);
- }
- function onexitautolinkprotocol(token) {
- onexitdata.call(this, token);
- this.stack[this.stack.length - 1].url = this.sliceSerialize(token);
- }
- function onexitautolinkemail(token) {
- onexitdata.call(this, token);
- this.stack[this.stack.length - 1].url = "mailto:" + this.sliceSerialize(token);
- }
- function blockQuote() {
- return { type: "blockquote", children: [] };
- }
- function codeFlow() {
- return { type: "code", lang: null, meta: null, value: "" };
- }
- function codeText() {
- return { type: "inlineCode", value: "" };
- }
- function definition() {
- return {
- type: "definition",
- identifier: "",
- label: null,
- title: null,
- url: ""
- };
- }
- function emphasis() {
- return { type: "emphasis", children: [] };
- }
- function heading() {
- return { type: "heading", depth: void 0, children: [] };
- }
- function hardBreak() {
- return { type: "break" };
- }
- function html() {
- return { type: "html", value: "" };
- }
- function image() {
- return { type: "image", title: null, url: "", alt: null };
- }
- function link() {
- return { type: "link", title: null, url: "", children: [] };
- }
- function list(token) {
- return {
- type: "list",
- ordered: token.type === "listOrdered",
- start: null,
- spread: token._spread,
- children: []
- };
- }
- function listItem(token) {
- return {
- type: "listItem",
- spread: token._spread,
- checked: null,
- children: []
- };
- }
- function paragraph() {
- return { type: "paragraph", children: [] };
- }
- function strong() {
- return { type: "strong", children: [] };
- }
- function text() {
- return { type: "text", value: "" };
- }
- function thematicBreak() {
- return { type: "thematicBreak" };
- }
- }
- function configure(config, extensions) {
- var index = -1;
- while (++index < extensions.length) {
- extension(config, extensions[index]);
- }
- return config;
- }
- function extension(config, extension2) {
- var key;
- var left;
- for (key in extension2) {
- left = own.call(config, key) ? config[key] : config[key] = {};
- if (key === "canContainEols" || key === "transforms") {
- config[key] = [].concat(left, extension2[key]);
- } else {
- Object.assign(left, extension2[key]);
- }
- }
- }
- }
-});
-
-// node_modules/mdast-util-from-markdown/index.js
-var require_mdast_util_from_markdown = __commonJS({
- "node_modules/mdast-util-from-markdown/index.js"(exports, module2) {
- "use strict";
- module2.exports = require_dist();
- }
-});
-
-// node_modules/remark-parse/index.js
-var require_remark_parse = __commonJS({
- "node_modules/remark-parse/index.js"(exports, module2) {
- "use strict";
- module2.exports = parse3;
- var fromMarkdown = require_mdast_util_from_markdown();
- function parse3(options) {
- var self = this;
- this.Parser = parse4;
- function parse4(doc) {
- return fromMarkdown(doc, Object.assign({}, self.data("settings"), options, {
- extensions: self.data("micromarkExtensions") || [],
- mdastExtensions: self.data("fromMarkdownExtensions") || []
- }));
- }
- }
- }
-});
-
-// node_modules/@tryfabric/martian/build/src/notion/languageMap.json
-var require_languageMap = __commonJS({
- "node_modules/@tryfabric/martian/build/src/notion/languageMap.json"(exports, module2) {
- module2.exports = {
- abap: "abap",
- sh: "shell",
- "shell-script": "shell",
- bash: "shell",
- zsh: "shell",
- text: "vb.net",
- c_cpp: "c++",
- clojure: "clojure",
- coffee: "coffeescript",
- "coffee-script": "coffeescript",
- cpp: "c++",
- csharp: "c#",
- cake: "c#",
- cakescript: "c#",
- css: "css",
- dart: "dart",
- diff: "diff",
- udiff: "diff",
- dockerfile: "docker",
- elixir: "elixir",
- elm: "elm",
- erlang: "erlang",
- fsharp: "f#",
- cucumber: "gherkin",
- glsl: "glsl",
- golang: "go",
- groovy: "groovy",
- haskell: "haskell",
- html: "html",
- xhtml: "html",
- java: "java/c/c++/c#",
- javascript: "javascript",
- js: "javascript",
- node: "javascript",
- json: "json",
- julia: "julia",
- tex: "latex",
- latex: "latex",
- less: "less",
- lisp: "webassembly",
- livescript: "livescript",
- "live-script": "livescript",
- ls: "livescript",
- lua: "lua",
- makefile: "makefile",
- bsdmake: "makefile",
- make: "makefile",
- mf: "makefile",
- markdown: "markdown",
- pandoc: "markdown",
- matlab: "matlab",
- octave: "matlab",
- nix: "nix",
- nixos: "nix",
- objectivec: "objective-c",
- "obj-c": "objective-c",
- objc: "objective-c",
- ocaml: "ocaml",
- pascal: "pascal",
- delphi: "pascal",
- objectpascal: "pascal",
- perl: "perl",
- cperl: "perl",
- php: "php",
- inc: "php",
- powershell: "powershell",
- posh: "powershell",
- pwsh: "powershell",
- prolog: "prolog",
- protobuf: "protobuf",
- "Protocol Buffers": "protobuf",
- python: "python",
- python3: "python",
- rusthon: "python",
- r: "r",
- R: "r",
- Rscript: "r",
- splus: "r",
- rust: "rust",
- ruby: "ruby",
- jruby: "ruby",
- macruby: "ruby",
- rake: "ruby",
- rb: "ruby",
- rbx: "ruby",
- rs: "rust",
- sass: "sass",
- scala: "scala",
- scheme: "scheme",
- scss: "scss",
- sql: "sql",
- typescript: "typescript",
- ts: "typescript",
- "visual basic": "vb.net",
- vbnet: "vb.net",
- "vb .net": "vb.net",
- "vb.net": "vb.net",
- verilog: "verilog",
- vhdl: "vhdl",
- wast: "webassembly",
- wasm: "webassembly",
- xml: "xml",
- rss: "xml",
- xsd: "xml",
- wsdl: "xml",
- yaml: "yaml",
- yml: "yaml"
- };
- }
-});
-
-// node_modules/@tryfabric/martian/build/src/notion/blocks.js
-var require_blocks = __commonJS({
- "node_modules/@tryfabric/martian/build/src/notion/blocks.js"(exports) {
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.tableRow = exports.table = exports.toDo = exports.numberedListItem = exports.bulletedListItem = exports.headingThree = exports.headingTwo = exports.headingOne = exports.table_of_contents = exports.image = exports.blockquote = exports.code = exports.paragraph = void 0;
- function paragraph(text) {
- return {
- object: "block",
- type: "paragraph",
- paragraph: {
- rich_text: text
- }
- };
- }
- exports.paragraph = paragraph;
- function code(text, lang = "plain text") {
- return {
- object: "block",
- type: "code",
- code: {
- rich_text: text,
- language: lang
- }
- };
- }
- exports.code = code;
- function blockquote(text) {
- return {
- object: "block",
- type: "quote",
- quote: {
- rich_text: text
- }
- };
- }
- exports.blockquote = blockquote;
- function image(url) {
- return {
- object: "block",
- type: "image",
- image: {
- type: "external",
- external: {
- url
- }
- }
- };
- }
- exports.image = image;
- function table_of_contents() {
- return {
- object: "block",
- type: "table_of_contents",
- table_of_contents: {}
- };
- }
- exports.table_of_contents = table_of_contents;
- function headingOne(text) {
- return {
- object: "block",
- type: "heading_1",
- heading_1: {
- rich_text: text
- }
- };
- }
- exports.headingOne = headingOne;
- function headingTwo(text) {
- return {
- object: "block",
- type: "heading_2",
- heading_2: {
- rich_text: text
- }
- };
- }
- exports.headingTwo = headingTwo;
- function headingThree(text) {
- return {
- object: "block",
- type: "heading_3",
- heading_3: {
- rich_text: text
- }
- };
- }
- exports.headingThree = headingThree;
- function bulletedListItem(text, children = []) {
- return {
- object: "block",
- type: "bulleted_list_item",
- bulleted_list_item: {
- rich_text: text,
- children: children.length ? children : void 0
- }
- };
- }
- exports.bulletedListItem = bulletedListItem;
- function numberedListItem(text, children = []) {
- return {
- object: "block",
- type: "numbered_list_item",
- numbered_list_item: {
- rich_text: text,
- children: children.length ? children : void 0
- }
- };
- }
- exports.numberedListItem = numberedListItem;
- function toDo(checked, text, children = []) {
- return {
- object: "block",
- type: "to_do",
- to_do: {
- rich_text: text,
- checked,
- children: children.length ? children : void 0
- }
- };
- }
- exports.toDo = toDo;
- function table(children, tableWidth) {
- return {
- object: "block",
- type: "table",
- table: {
- table_width: tableWidth,
- has_row_header: true,
- children: (children === null || children === void 0 ? void 0 : children.length) ? children : []
- }
- };
- }
- exports.table = table;
- function tableRow(cells = []) {
- return {
- object: "block",
- type: "table_row",
- table_row: {
- cells: cells.length ? cells : []
- }
- };
- }
- exports.tableRow = tableRow;
- }
-});
-
-// node_modules/@tryfabric/martian/build/src/notion/common.js
-var require_common = __commonJS({
- "node_modules/@tryfabric/martian/build/src/notion/common.js"(exports) {
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.isSupportedCodeLang = exports.SUPPORTED_CODE_BLOCK_LANGUAGES = exports.richText = exports.LIMITS = void 0;
- exports.LIMITS = {
- PAYLOAD_BLOCKS: 1e3,
- RICH_TEXT_ARRAYS: 100,
- RICH_TEXT: {
- TEXT_CONTENT: 2e3,
- LINK_URL: 1e3,
- EQUATION_EXPRESSION: 1e3
- }
- };
- function richText(content, options = {}) {
- var _a;
- const annotations = (_a = options.annotations) !== null && _a !== void 0 ? _a : {};
- return {
- type: "text",
- annotations: __spreadValues({
- bold: false,
- strikethrough: false,
- underline: false,
- italic: false,
- code: false,
- color: "default"
- }, annotations),
- text: {
- content,
- link: options.url ? {
- type: "url",
- url: options.url
- } : void 0
- }
- };
- }
- exports.richText = richText;
- exports.SUPPORTED_CODE_BLOCK_LANGUAGES = [
- "abap",
- "arduino",
- "bash",
- "basic",
- "c",
- "clojure",
- "coffeescript",
- "c++",
- "c#",
- "css",
- "dart",
- "diff",
- "docker",
- "elixir",
- "elm",
- "erlang",
- "flow",
- "fortran",
- "f#",
- "gherkin",
- "glsl",
- "go",
- "graphql",
- "groovy",
- "haskell",
- "html",
- "java",
- "javascript",
- "json",
- "julia",
- "kotlin",
- "latex",
- "less",
- "lisp",
- "livescript",
- "lua",
- "makefile",
- "markdown",
- "markup",
- "matlab",
- "mermaid",
- "nix",
- "objective-c",
- "ocaml",
- "pascal",
- "perl",
- "php",
- "plain text",
- "powershell",
- "prolog",
- "protobuf",
- "python",
- "r",
- "reason",
- "ruby",
- "rust",
- "sass",
- "scala",
- "scheme",
- "scss",
- "shell",
- "sql",
- "swift",
- "typescript",
- "vb.net",
- "verilog",
- "vhdl",
- "visual basic",
- "webassembly",
- "xml",
- "yaml",
- "java/c/c++/c#"
- ];
- function isSupportedCodeLang(lang) {
- return exports.SUPPORTED_CODE_BLOCK_LANGUAGES.includes(lang);
- }
- exports.isSupportedCodeLang = isSupportedCodeLang;
- }
-});
-
-// node_modules/@tryfabric/martian/build/src/notion/index.js
-var require_notion = __commonJS({
- "node_modules/@tryfabric/martian/build/src/notion/index.js"(exports) {
- "use strict";
- var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) {
- if (k2 === void 0)
- k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() {
- return m[k];
- } });
- } : function(o, m, k, k2) {
- if (k2 === void 0)
- k2 = k;
- o[k2] = m[k];
- });
- var __exportStar = exports && exports.__exportStar || function(m, exports2) {
- for (var p in m)
- if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p))
- __createBinding(exports2, m, p);
- };
- var __importDefault = exports && exports.__importDefault || function(mod) {
- return mod && mod.__esModule ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.parseCodeLanguage = void 0;
- var languageMap_json_1 = __importDefault(require_languageMap());
- __exportStar(require_blocks(), exports);
- __exportStar(require_common(), exports);
- function parseCodeLanguage(lang) {
- return lang ? languageMap_json_1.default[lang.toLowerCase()] : void 0;
- }
- exports.parseCodeLanguage = parseCodeLanguage;
- }
-});
-
-// node_modules/@tryfabric/martian/build/src/parser/internal.js
-var require_internal = __commonJS({
- "node_modules/@tryfabric/martian/build/src/parser/internal.js"(exports) {
- "use strict";
- var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) {
- if (k2 === void 0)
- k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() {
- return m[k];
- } });
- } : function(o, m, k, k2) {
- if (k2 === void 0)
- k2 = k;
- o[k2] = m[k];
- });
- var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
- } : function(o, v) {
- o["default"] = v;
- });
- var __importStar = exports && exports.__importStar || function(mod) {
- if (mod && mod.__esModule)
- return mod;
- var result = {};
- if (mod != null) {
- for (var k in mod)
- if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k))
- __createBinding(result, mod, k);
- }
- __setModuleDefault(result, mod);
- return result;
- };
- var __importDefault = exports && exports.__importDefault || function(mod) {
- return mod && mod.__esModule ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.parseRichText = exports.parseBlocks = void 0;
- var notion = __importStar(require_notion());
- var path_1 = __importDefault(require("path"));
- var url_1 = require("url");
- var notion_1 = require_notion();
- function ensureLength(text, copy) {
- const chunks = text.match(/[^]{1,2000}/g) || [];
- return chunks.flatMap((item) => notion.richText(item, copy));
- }
- function ensureCodeBlockLanguage(lang) {
- if (lang) {
- lang = lang.toLowerCase();
- return (0, notion_1.isSupportedCodeLang)(lang) ? lang : notion.parseCodeLanguage(lang);
- }
- return void 0;
- }
- function parseInline(element, options) {
- var _a;
- const copy = {
- annotations: __spreadValues({}, (_a = options === null || options === void 0 ? void 0 : options.annotations) !== null && _a !== void 0 ? _a : {}),
- url: options === null || options === void 0 ? void 0 : options.url
- };
- switch (element.type) {
- case "text":
- return ensureLength(element.value, copy);
- case "delete":
- copy.annotations.strikethrough = true;
- return element.children.flatMap((child) => parseInline(child, copy));
- case "emphasis":
- copy.annotations.italic = true;
- return element.children.flatMap((child) => parseInline(child, copy));
- case "strong":
- copy.annotations.bold = true;
- return element.children.flatMap((child) => parseInline(child, copy));
- case "link":
- copy.url = element.url;
- return element.children.flatMap((child) => parseInline(child, copy));
- case "inlineCode":
- copy.annotations.code = true;
- return [notion.richText(element.value, copy)];
- default:
- return [];
- }
- }
- function parseImage(image, options) {
- var _a;
- const allowedTypes = [
- ".png",
- ".jpg",
- ".jpeg",
- ".gif",
- ".tif",
- ".tiff",
- ".bmp",
- ".svg",
- ".heic"
- ];
- function dealWithError() {
- return notion.paragraph([notion.richText(image.url)]);
- }
- try {
- if ((_a = options.strictImageUrls) !== null && _a !== void 0 ? _a : true) {
- const parsedUrl = new url_1.URL(image.url);
- const fileType = path_1.default.extname(parsedUrl.pathname);
- if (allowedTypes.includes(fileType)) {
- return notion.image(image.url);
- } else {
- return dealWithError();
- }
- } else {
- return notion.image(image.url);
- }
- } catch (error) {
- return dealWithError();
- }
- }
- function parseParagraph(element, options) {
- const mightBeToc = element.children.length > 2 && element.children[0].type === "text" && element.children[0].value === "[[" && element.children[1].type === "emphasis";
- if (mightBeToc) {
- const emphasisItem = element.children[1];
- const emphasisTextItem = emphasisItem.children[0];
- if (emphasisTextItem.value === "TOC") {
- return [notion.table_of_contents()];
- }
- }
- const images = [];
- const paragraphs = [];
- element.children.forEach((item) => {
- if (item.type === "image") {
- images.push(parseImage(item, options));
- } else {
- const richText = parseInline(item);
- if (richText.length) {
- paragraphs.push(richText);
- }
- }
- });
- if (paragraphs.length) {
- return [notion.paragraph(paragraphs.flat()), ...images];
- } else {
- return images;
- }
- }
- function parseBlockquote(element, options) {
- const blocks = element.children.flatMap((child) => parseNode(child, options));
- const paragraphs = blocks.flatMap((child) => child);
- const richtext = paragraphs.flatMap((child) => {
- if (child.type === "paragraph") {
- return child.paragraph.rich_text;
- }
- if (child.type === "heading_1") {
- return child.heading_1.rich_text;
- }
- if (child.type === "heading_2") {
- return child.heading_2.rich_text;
- }
- if (child.type === "heading_3") {
- return child.heading_3.rich_text;
- }
- return [];
- });
- return notion.blockquote(richtext);
- }
- function parseHeading(element) {
- const text = element.children.flatMap((child) => parseInline(child));
- switch (element.depth) {
- case 1:
- return notion.headingOne(text);
- case 2:
- return notion.headingTwo(text);
- default:
- return notion.headingThree(text);
- }
- }
- function parseCode(element) {
- const text = ensureLength(element.value);
- const lang = ensureCodeBlockLanguage(element.lang);
- return notion.code(text, lang);
- }
- function parseList(element, options) {
- return element.children.flatMap((item) => {
- const paragraph = item.children.shift();
- if (paragraph === void 0 || paragraph.type !== "paragraph") {
- return [];
- }
- const text = paragraph.children.flatMap((child) => parseInline(child));
- const parsedChildren = item.children.flatMap((child) => parseNode(child, options));
- if (element.start !== null && element.start !== void 0) {
- return [notion.numberedListItem(text, parsedChildren)];
- } else if (item.checked !== null && item.checked !== void 0) {
- return [notion.toDo(item.checked, text, parsedChildren)];
- } else {
- return [notion.bulletedListItem(text, parsedChildren)];
- }
- });
- }
- function parseTableCell(node) {
- return [node.children.flatMap((child) => parseInline(child))];
- }
- function parseTableRow(node) {
- const tableCells = node.children.flatMap((child) => parseTableCell(child));
- return [notion.tableRow(tableCells)];
- }
- function parseTable(node) {
- var _a;
- const tableWidth = ((_a = node.children) === null || _a === void 0 ? void 0 : _a.length) ? node.children[0].children.length : 0;
- const tableRows = node.children.flatMap((child) => parseTableRow(child));
- return [notion.table(tableRows, tableWidth)];
- }
- function parseNode(node, options) {
- switch (node.type) {
- case "heading":
- return [parseHeading(node)];
- case "paragraph":
- return parseParagraph(node, options);
- case "code":
- return [parseCode(node)];
- case "blockquote":
- return [parseBlockquote(node, options)];
- case "list":
- return parseList(node, options);
- case "table":
- if (options.allowUnsupported) {
- return parseTable(node);
- } else {
- return [];
- }
- default:
- return [];
- }
- }
- function parseBlocks(root, options) {
- var _a, _b, _c, _d;
- const parsed = root.children.flatMap((item) => parseNode(item, options || {}));
- const truncate = !!((_b = (_a = options === null || options === void 0 ? void 0 : options.notionLimits) === null || _a === void 0 ? void 0 : _a.truncate) !== null && _b !== void 0 ? _b : true), limitCallback = (_d = (_c = options === null || options === void 0 ? void 0 : options.notionLimits) === null || _c === void 0 ? void 0 : _c.onError) !== null && _d !== void 0 ? _d : () => {
- };
- if (parsed.length > notion_1.LIMITS.PAYLOAD_BLOCKS)
- limitCallback(new Error(`Resulting blocks array exceeds Notion limit (${notion_1.LIMITS.PAYLOAD_BLOCKS})`));
- return truncate ? parsed.slice(0, notion_1.LIMITS.PAYLOAD_BLOCKS) : parsed;
- }
- exports.parseBlocks = parseBlocks;
- function parseRichText(root, options) {
- var _a, _b, _c, _d;
- if (root.children[0].type !== "paragraph") {
- throw new Error(`Unsupported markdown element: ${JSON.stringify(root)}`);
- }
- const richTexts = [];
- root.children.forEach((paragraph) => {
- if (paragraph.type === "paragraph") {
- paragraph.children.forEach((child) => richTexts.push(...parseInline(child)));
- }
- });
- const truncate = !!((_b = (_a = options === null || options === void 0 ? void 0 : options.notionLimits) === null || _a === void 0 ? void 0 : _a.truncate) !== null && _b !== void 0 ? _b : true), limitCallback = (_d = (_c = options === null || options === void 0 ? void 0 : options.notionLimits) === null || _c === void 0 ? void 0 : _c.onError) !== null && _d !== void 0 ? _d : () => {
- };
- if (richTexts.length > notion_1.LIMITS.RICH_TEXT_ARRAYS)
- limitCallback(new Error(`Resulting richTexts array exceeds Notion limit (${notion_1.LIMITS.RICH_TEXT_ARRAYS})`));
- return (truncate ? richTexts.slice(0, notion_1.LIMITS.RICH_TEXT_ARRAYS) : richTexts).map((rt) => {
- var _a2;
- if (rt.type !== "text")
- return rt;
- if (rt.text.content.length > notion_1.LIMITS.RICH_TEXT.TEXT_CONTENT) {
- limitCallback(new Error(`Resulting text content exceeds Notion limit (${notion_1.LIMITS.RICH_TEXT.TEXT_CONTENT})`));
- if (truncate)
- rt.text.content = rt.text.content.slice(0, notion_1.LIMITS.RICH_TEXT.TEXT_CONTENT - 3) + "...";
- }
- if (((_a2 = rt.text.link) === null || _a2 === void 0 ? void 0 : _a2.url) && rt.text.link.url.length > notion_1.LIMITS.RICH_TEXT.LINK_URL)
- limitCallback(new Error(`Resulting text URL exceeds Notion limit (${notion_1.LIMITS.RICH_TEXT.LINK_URL})`));
- return rt;
- });
- }
- exports.parseRichText = parseRichText;
- }
-});
-
-// node_modules/micromark-extension-gfm-autolink-literal/syntax.js
-var require_syntax = __commonJS({
- "node_modules/micromark-extension-gfm-autolink-literal/syntax.js"(exports) {
- var asciiAlpha = require_ascii_alpha();
- var asciiAlphanumeric = require_ascii_alphanumeric();
- var asciiControl = require_ascii_control();
- var markdownLineEnding = require_markdown_line_ending();
- var unicodePunctuation = require_unicode_punctuation();
- var unicodeWhitespace = require_unicode_whitespace();
- var www = { tokenize: tokenizeWww, partial: true };
- var domain = { tokenize: tokenizeDomain, partial: true };
- var path = { tokenize: tokenizePath, partial: true };
- var punctuation = { tokenize: tokenizePunctuation, partial: true };
- var namedCharacterReference = {
- tokenize: tokenizeNamedCharacterReference,
- partial: true
- };
- var wwwAutolink = { tokenize: tokenizeWwwAutolink, previous: previousWww };
- var httpAutolink = { tokenize: tokenizeHttpAutolink, previous: previousHttp };
- var emailAutolink = { tokenize: tokenizeEmailAutolink, previous: previousEmail };
- var text = {};
- exports.text = text;
- var code = 48;
- while (code < 123) {
- text[code] = emailAutolink;
- code++;
- if (code === 58)
- code = 65;
- else if (code === 91)
- code = 97;
- }
- text[43] = emailAutolink;
- text[45] = emailAutolink;
- text[46] = emailAutolink;
- text[95] = emailAutolink;
- text[72] = [emailAutolink, httpAutolink];
- text[104] = [emailAutolink, httpAutolink];
- text[87] = [emailAutolink, wwwAutolink];
- text[119] = [emailAutolink, wwwAutolink];
- function tokenizeEmailAutolink(effects, ok, nok) {
- var self = this;
- var hasDot;
- return start;
- function start(code2) {
- if (!gfmAtext(code2) || !previousEmail(self.previous) || previous(self.events)) {
- return nok(code2);
- }
- effects.enter("literalAutolink");
- effects.enter("literalAutolinkEmail");
- return atext(code2);
- }
- function atext(code2) {
- if (gfmAtext(code2)) {
- effects.consume(code2);
- return atext;
- }
- if (code2 === 64) {
- effects.consume(code2);
- return label;
- }
- return nok(code2);
- }
- function label(code2) {
- if (code2 === 46) {
- return effects.check(punctuation, done, dotContinuation)(code2);
- }
- if (code2 === 45 || code2 === 95) {
- return effects.check(punctuation, nok, dashOrUnderscoreContinuation)(code2);
- }
- if (asciiAlphanumeric(code2)) {
- effects.consume(code2);
- return label;
- }
- return done(code2);
- }
- function dotContinuation(code2) {
- effects.consume(code2);
- hasDot = true;
- return label;
- }
- function dashOrUnderscoreContinuation(code2) {
- effects.consume(code2);
- return afterDashOrUnderscore;
- }
- function afterDashOrUnderscore(code2) {
- if (code2 === 46) {
- return effects.check(punctuation, nok, dotContinuation)(code2);
- }
- return label(code2);
- }
- function done(code2) {
- if (hasDot) {
- effects.exit("literalAutolinkEmail");
- effects.exit("literalAutolink");
- return ok(code2);
- }
- return nok(code2);
- }
- }
- function tokenizeWwwAutolink(effects, ok, nok) {
- var self = this;
- return start;
- function start(code2) {
- if (code2 !== 87 && code2 - 32 !== 87 || !previousWww(self.previous) || previous(self.events)) {
- return nok(code2);
- }
- effects.enter("literalAutolink");
- effects.enter("literalAutolinkWww");
- return effects.check(www, effects.attempt(domain, effects.attempt(path, done), nok), nok)(code2);
- }
- function done(code2) {
- effects.exit("literalAutolinkWww");
- effects.exit("literalAutolink");
- return ok(code2);
- }
- }
- function tokenizeHttpAutolink(effects, ok, nok) {
- var self = this;
- return start;
- function start(code2) {
- if (code2 !== 72 && code2 - 32 !== 72 || !previousHttp(self.previous) || previous(self.events)) {
- return nok(code2);
- }
- effects.enter("literalAutolink");
- effects.enter("literalAutolinkHttp");
- effects.consume(code2);
- return t1;
- }
- function t1(code2) {
- if (code2 === 84 || code2 - 32 === 84) {
- effects.consume(code2);
- return t2;
- }
- return nok(code2);
- }
- function t2(code2) {
- if (code2 === 84 || code2 - 32 === 84) {
- effects.consume(code2);
- return p;
- }
- return nok(code2);
- }
- function p(code2) {
- if (code2 === 80 || code2 - 32 === 80) {
- effects.consume(code2);
- return s;
- }
- return nok(code2);
- }
- function s(code2) {
- if (code2 === 83 || code2 - 32 === 83) {
- effects.consume(code2);
- return colon;
- }
- return colon(code2);
- }
- function colon(code2) {
- if (code2 === 58) {
- effects.consume(code2);
- return slash1;
- }
- return nok(code2);
- }
- function slash1(code2) {
- if (code2 === 47) {
- effects.consume(code2);
- return slash2;
- }
- return nok(code2);
- }
- function slash2(code2) {
- if (code2 === 47) {
- effects.consume(code2);
- return after;
- }
- return nok(code2);
- }
- function after(code2) {
- return asciiControl(code2) || unicodeWhitespace(code2) || unicodePunctuation(code2) ? nok(code2) : effects.attempt(domain, effects.attempt(path, done), nok)(code2);
- }
- function done(code2) {
- effects.exit("literalAutolinkHttp");
- effects.exit("literalAutolink");
- return ok(code2);
- }
- }
- function tokenizeWww(effects, ok, nok) {
- return start;
- function start(code2) {
- effects.consume(code2);
- return w2;
- }
- function w2(code2) {
- if (code2 === 87 || code2 - 32 === 87) {
- effects.consume(code2);
- return w3;
- }
- return nok(code2);
- }
- function w3(code2) {
- if (code2 === 87 || code2 - 32 === 87) {
- effects.consume(code2);
- return dot;
- }
- return nok(code2);
- }
- function dot(code2) {
- if (code2 === 46) {
- effects.consume(code2);
- return after;
- }
- return nok(code2);
- }
- function after(code2) {
- return code2 === null || markdownLineEnding(code2) ? nok(code2) : ok(code2);
- }
- }
- function tokenizeDomain(effects, ok, nok) {
- var hasUnderscoreInLastSegment;
- var hasUnderscoreInLastLastSegment;
- return domain2;
- function domain2(code2) {
- if (code2 === 38) {
- return effects.check(namedCharacterReference, done, punctuationContinuation)(code2);
- }
- if (code2 === 46 || code2 === 95) {
- return effects.check(punctuation, done, punctuationContinuation)(code2);
- }
- if (asciiControl(code2) || unicodeWhitespace(code2) || code2 !== 45 && unicodePunctuation(code2)) {
- return done(code2);
- }
- effects.consume(code2);
- return domain2;
- }
- function punctuationContinuation(code2) {
- if (code2 === 46) {
- hasUnderscoreInLastLastSegment = hasUnderscoreInLastSegment;
- hasUnderscoreInLastSegment = void 0;
- effects.consume(code2);
- return domain2;
- }
- if (code2 === 95)
- hasUnderscoreInLastSegment = true;
- effects.consume(code2);
- return domain2;
- }
- function done(code2) {
- if (!hasUnderscoreInLastLastSegment && !hasUnderscoreInLastSegment) {
- return ok(code2);
- }
- return nok(code2);
- }
- }
- function tokenizePath(effects, ok) {
- var balance = 0;
- return inPath;
- function inPath(code2) {
- if (code2 === 38) {
- return effects.check(namedCharacterReference, ok, continuedPunctuation)(code2);
- }
- if (code2 === 40) {
- balance++;
- }
- if (code2 === 41) {
- return effects.check(punctuation, parenAtPathEnd, continuedPunctuation)(code2);
- }
- if (pathEnd(code2)) {
- return ok(code2);
- }
- if (trailingPunctuation(code2)) {
- return effects.check(punctuation, ok, continuedPunctuation)(code2);
- }
- effects.consume(code2);
- return inPath;
- }
- function continuedPunctuation(code2) {
- effects.consume(code2);
- return inPath;
- }
- function parenAtPathEnd(code2) {
- balance--;
- return balance < 0 ? ok(code2) : continuedPunctuation(code2);
- }
- }
- function tokenizeNamedCharacterReference(effects, ok, nok) {
- return start;
- function start(code2) {
- effects.consume(code2);
- return inside;
- }
- function inside(code2) {
- if (asciiAlpha(code2)) {
- effects.consume(code2);
- return inside;
- }
- if (code2 === 59) {
- effects.consume(code2);
- return after;
- }
- return nok(code2);
- }
- function after(code2) {
- return pathEnd(code2) ? ok(code2) : nok(code2);
- }
- }
- function tokenizePunctuation(effects, ok, nok) {
- return start;
- function start(code2) {
- effects.consume(code2);
- return after;
- }
- function after(code2) {
- if (trailingPunctuation(code2)) {
- effects.consume(code2);
- return after;
- }
- return pathEnd(code2) ? ok(code2) : nok(code2);
- }
- }
- function trailingPunctuation(code2) {
- return code2 === 33 || code2 === 34 || code2 === 39 || code2 === 41 || code2 === 42 || code2 === 44 || code2 === 46 || code2 === 58 || code2 === 59 || code2 === 60 || code2 === 63 || code2 === 95 || code2 === 126;
- }
- function pathEnd(code2) {
- return code2 === null || code2 < 0 || code2 === 32 || code2 === 60;
- }
- function gfmAtext(code2) {
- return code2 === 43 || code2 === 45 || code2 === 46 || code2 === 95 || asciiAlphanumeric(code2);
- }
- function previousWww(code2) {
- return code2 === null || code2 < 0 || code2 === 32 || code2 === 40 || code2 === 42 || code2 === 95 || code2 === 126;
- }
- function previousHttp(code2) {
- return code2 === null || !asciiAlpha(code2);
- }
- function previousEmail(code2) {
- return code2 !== 47 && previousHttp(code2);
- }
- function previous(events) {
- var index = events.length;
- while (index--) {
- if ((events[index][1].type === "labelLink" || events[index][1].type === "labelImage") && !events[index][1]._balanced) {
- return true;
- }
- }
- }
- }
-});
-
-// node_modules/micromark-extension-gfm-autolink-literal/index.js
-var require_micromark_extension_gfm_autolink_literal = __commonJS({
- "node_modules/micromark-extension-gfm-autolink-literal/index.js"(exports, module2) {
- module2.exports = require_syntax();
- }
-});
-
-// node_modules/micromark-extension-gfm-strikethrough/index.js
-var require_micromark_extension_gfm_strikethrough = __commonJS({
- "node_modules/micromark-extension-gfm-strikethrough/index.js"(exports, module2) {
- module2.exports = create;
- var classifyCharacter = require_classify_character();
- var chunkedSplice = require_chunked_splice();
- var resolveAll = require_resolve_all();
- var shallow = require_shallow();
- function create(options) {
- var settings = options || {};
- var single = settings.singleTilde;
- var tokenizer = {
- tokenize: tokenizeStrikethrough,
- resolveAll: resolveAllStrikethrough
- };
- if (single === null || single === void 0) {
- single = true;
- }
- return { text: { 126: tokenizer }, insideSpan: { null: tokenizer } };
- function resolveAllStrikethrough(events, context) {
- var index = -1;
- var strikethrough;
- var text;
- var open;
- var nextEvents;
- while (++index < events.length) {
- if (events[index][0] === "enter" && events[index][1].type === "strikethroughSequenceTemporary" && events[index][1]._close) {
- open = index;
- while (open--) {
- if (events[open][0] === "exit" && events[open][1].type === "strikethroughSequenceTemporary" && events[open][1]._open && events[index][1].end.offset - events[index][1].start.offset === events[open][1].end.offset - events[open][1].start.offset) {
- events[index][1].type = "strikethroughSequence";
- events[open][1].type = "strikethroughSequence";
- strikethrough = {
- type: "strikethrough",
- start: shallow(events[open][1].start),
- end: shallow(events[index][1].end)
- };
- text = {
- type: "strikethroughText",
- start: shallow(events[open][1].end),
- end: shallow(events[index][1].start)
- };
- nextEvents = [
- ["enter", strikethrough, context],
- ["enter", events[open][1], context],
- ["exit", events[open][1], context],
- ["enter", text, context]
- ];
- chunkedSplice(nextEvents, nextEvents.length, 0, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + 1, index), context));
- chunkedSplice(nextEvents, nextEvents.length, 0, [
- ["exit", text, context],
- ["enter", events[index][1], context],
- ["exit", events[index][1], context],
- ["exit", strikethrough, context]
- ]);
- chunkedSplice(events, open - 1, index - open + 3, nextEvents);
- index = open + nextEvents.length - 2;
- break;
- }
- }
- }
- }
- return removeRemainingSequences(events);
- }
- function removeRemainingSequences(events) {
- var index = -1;
- var length = events.length;
- while (++index < length) {
- if (events[index][1].type === "strikethroughSequenceTemporary") {
- events[index][1].type = "data";
- }
- }
- return events;
- }
- function tokenizeStrikethrough(effects, ok, nok) {
- var previous = this.previous;
- var events = this.events;
- var size = 0;
- return start;
- function start(code) {
- if (code !== 126 || previous === 126 && events[events.length - 1][1].type !== "characterEscape") {
- return nok(code);
- }
- effects.enter("strikethroughSequenceTemporary");
- return more(code);
- }
- function more(code) {
- var before = classifyCharacter(previous);
- var token;
- var after;
- if (code === 126) {
- if (size > 1)
- return nok(code);
- effects.consume(code);
- size++;
- return more;
- }
- if (size < 2 && !single)
- return nok(code);
- token = effects.exit("strikethroughSequenceTemporary");
- after = classifyCharacter(code);
- token._open = !after || after === 2 && before;
- token._close = !before || before === 2 && after;
- return ok(code);
- }
- }
- }
- }
-});
-
-// node_modules/micromark-extension-gfm-table/syntax.js
-var require_syntax2 = __commonJS({
- "node_modules/micromark-extension-gfm-table/syntax.js"(exports) {
- exports.flow = {
- null: { tokenize: tokenizeTable, resolve: resolveTable, interruptible: true }
- };
- var createSpace = require_factory_space();
- var setextUnderlineMini = { tokenize: tokenizeSetextUnderlineMini, partial: true };
- var nextPrefixedOrBlank = { tokenize: tokenizeNextPrefixedOrBlank, partial: true };
- function resolveTable(events, context) {
- var length = events.length;
- var index = -1;
- var token;
- var inHead;
- var inDelimiterRow;
- var inRow;
- var cell;
- var content;
- var text;
- var contentStart;
- var contentEnd;
- var cellStart;
- while (++index < length) {
- token = events[index][1];
- if (inRow) {
- if (token.type === "temporaryTableCellContent") {
- contentStart = contentStart || index;
- contentEnd = index;
- }
- if ((token.type === "tableCellDivider" || token.type === "tableRow") && contentEnd) {
- content = {
- type: "tableContent",
- start: events[contentStart][1].start,
- end: events[contentEnd][1].end
- };
- text = {
- type: "chunkText",
- start: content.start,
- end: content.end,
- contentType: "text"
- };
- events.splice(contentStart, contentEnd - contentStart + 1, ["enter", content, context], ["enter", text, context], ["exit", text, context], ["exit", content, context]);
- index -= contentEnd - contentStart - 3;
- length = events.length;
- contentStart = void 0;
- contentEnd = void 0;
- }
- }
- if (events[index][0] === "exit" && cellStart && cellStart + 1 < index && (token.type === "tableCellDivider" || token.type === "tableRow" && (cellStart + 3 < index || events[cellStart][1].type !== "whitespace"))) {
- cell = {
- type: inDelimiterRow ? "tableDelimiter" : inHead ? "tableHeader" : "tableData",
- start: events[cellStart][1].start,
- end: events[index][1].end
- };
- events.splice(index + (token.type === "tableCellDivider" ? 1 : 0), 0, [
- "exit",
- cell,
- context
- ]);
- events.splice(cellStart, 0, ["enter", cell, context]);
- index += 2;
- length = events.length;
- cellStart = index + 1;
- }
- if (token.type === "tableRow") {
- inRow = events[index][0] === "enter";
- if (inRow) {
- cellStart = index + 1;
- }
- }
- if (token.type === "tableDelimiterRow") {
- inDelimiterRow = events[index][0] === "enter";
- if (inDelimiterRow) {
- cellStart = index + 1;
- }
- }
- if (token.type === "tableHead") {
- inHead = events[index][0] === "enter";
- }
- }
- return events;
- }
- function tokenizeTable(effects, ok, nok) {
- var align = [];
- var tableHeaderCount = 0;
- var seenDelimiter;
- var hasDash;
- return start;
- function start(code) {
- if (code === null || code === -5 || code === -4 || code === -3) {
- return nok(code);
- }
- effects.enter("table")._align = align;
- effects.enter("tableHead");
- effects.enter("tableRow");
- if (code === 124) {
- return cellDividerHead(code);
- }
- tableHeaderCount++;
- effects.enter("temporaryTableCellContent");
- return inCellContentHead(code);
- }
- function cellDividerHead(code) {
- effects.enter("tableCellDivider");
- effects.consume(code);
- effects.exit("tableCellDivider");
- seenDelimiter = true;
- return cellBreakHead;
- }
- function cellBreakHead(code) {
- if (code === null || code === -5 || code === -4 || code === -3) {
- return atRowEndHead(code);
- }
- if (code === -2 || code === -1 || code === 32) {
- effects.enter("whitespace");
- effects.consume(code);
- return inWhitespaceHead;
- }
- if (seenDelimiter) {
- seenDelimiter = void 0;
- tableHeaderCount++;
- }
- if (code === 124) {
- return cellDividerHead(code);
- }
- effects.enter("temporaryTableCellContent");
- return inCellContentHead(code);
- }
- function inWhitespaceHead(code) {
- if (code === -2 || code === -1 || code === 32) {
- effects.consume(code);
- return inWhitespaceHead;
- }
- effects.exit("whitespace");
- return cellBreakHead(code);
- }
- function inCellContentHead(code) {
- if (code === null || code < 0 || code === 32 || code === 124) {
- effects.exit("temporaryTableCellContent");
- return cellBreakHead(code);
- }
- effects.consume(code);
- return code === 92 ? inCellContentEscapeHead : inCellContentHead;
- }
- function inCellContentEscapeHead(code) {
- if (code === 92 || code === 124) {
- effects.consume(code);
- return inCellContentHead;
- }
- return inCellContentHead(code);
- }
- function atRowEndHead(code) {
- if (code === null) {
- return nok(code);
- }
- effects.exit("tableRow");
- effects.exit("tableHead");
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- return effects.check(setextUnderlineMini, nok, createSpace(effects, rowStartDelimiter, "linePrefix", 4));
- }
- function rowStartDelimiter(code) {
- if (code === null || code < 0 || code === 32) {
- return nok(code);
- }
- effects.enter("tableDelimiterRow");
- return atDelimiterRowBreak(code);
- }
- function atDelimiterRowBreak(code) {
- if (code === null || code === -5 || code === -4 || code === -3) {
- return rowEndDelimiter(code);
- }
- if (code === -2 || code === -1 || code === 32) {
- effects.enter("whitespace");
- effects.consume(code);
- return inWhitespaceDelimiter;
- }
- if (code === 45) {
- effects.enter("tableDelimiterFiller");
- effects.consume(code);
- hasDash = true;
- align.push(null);
- return inFillerDelimiter;
- }
- if (code === 58) {
- effects.enter("tableDelimiterAlignment");
- effects.consume(code);
- effects.exit("tableDelimiterAlignment");
- align.push("left");
- return afterLeftAlignment;
- }
- if (code === 124) {
- effects.enter("tableCellDivider");
- effects.consume(code);
- effects.exit("tableCellDivider");
- return atDelimiterRowBreak;
- }
- return nok(code);
- }
- function inWhitespaceDelimiter(code) {
- if (code === -2 || code === -1 || code === 32) {
- effects.consume(code);
- return inWhitespaceDelimiter;
- }
- effects.exit("whitespace");
- return atDelimiterRowBreak(code);
- }
- function inFillerDelimiter(code) {
- if (code === 45) {
- effects.consume(code);
- return inFillerDelimiter;
- }
- effects.exit("tableDelimiterFiller");
- if (code === 58) {
- effects.enter("tableDelimiterAlignment");
- effects.consume(code);
- effects.exit("tableDelimiterAlignment");
- align[align.length - 1] = align[align.length - 1] === "left" ? "center" : "right";
- return afterRightAlignment;
- }
- return atDelimiterRowBreak(code);
- }
- function afterLeftAlignment(code) {
- if (code === 45) {
- effects.enter("tableDelimiterFiller");
- effects.consume(code);
- hasDash = true;
- return inFillerDelimiter;
- }
- return nok(code);
- }
- function afterRightAlignment(code) {
- if (code === null || code === -5 || code === -4 || code === -3) {
- return rowEndDelimiter(code);
- }
- if (code === -2 || code === -1 || code === 32) {
- effects.enter("whitespace");
- effects.consume(code);
- return inWhitespaceDelimiter;
- }
- if (code === 124) {
- effects.enter("tableCellDivider");
- effects.consume(code);
- effects.exit("tableCellDivider");
- return atDelimiterRowBreak;
- }
- return nok(code);
- }
- function rowEndDelimiter(code) {
- effects.exit("tableDelimiterRow");
- if (!hasDash || tableHeaderCount !== align.length) {
- return nok(code);
- }
- if (code === null) {
- return tableClose(code);
- }
- return effects.check(nextPrefixedOrBlank, tableClose, tableContinue)(code);
- }
- function tableClose(code) {
- effects.exit("table");
- return ok(code);
- }
- function tableContinue(code) {
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- return createSpace(effects, bodyStart, "linePrefix", 4);
- }
- function bodyStart(code) {
- effects.enter("tableBody");
- return rowStartBody(code);
- }
- function rowStartBody(code) {
- effects.enter("tableRow");
- if (code === 124) {
- return cellDividerBody(code);
- }
- effects.enter("temporaryTableCellContent");
- return inCellContentBody(code);
- }
- function cellDividerBody(code) {
- effects.enter("tableCellDivider");
- effects.consume(code);
- effects.exit("tableCellDivider");
- return cellBreakBody;
- }
- function cellBreakBody(code) {
- if (code === null || code === -5 || code === -4 || code === -3) {
- return atRowEndBody(code);
- }
- if (code === -2 || code === -1 || code === 32) {
- effects.enter("whitespace");
- effects.consume(code);
- return inWhitespaceBody;
- }
- if (code === 124) {
- return cellDividerBody(code);
- }
- effects.enter("temporaryTableCellContent");
- return inCellContentBody(code);
- }
- function inWhitespaceBody(code) {
- if (code === -2 || code === -1 || code === 32) {
- effects.consume(code);
- return inWhitespaceBody;
- }
- effects.exit("whitespace");
- return cellBreakBody(code);
- }
- function inCellContentBody(code) {
- if (code === null || code < 0 || code === 32 || code === 124) {
- effects.exit("temporaryTableCellContent");
- return cellBreakBody(code);
- }
- effects.consume(code);
- return code === 92 ? inCellContentEscapeBody : inCellContentBody;
- }
- function inCellContentEscapeBody(code) {
- if (code === 92 || code === 124) {
- effects.consume(code);
- return inCellContentBody;
- }
- return inCellContentBody(code);
- }
- function atRowEndBody(code) {
- effects.exit("tableRow");
- if (code === null) {
- return tableBodyClose(code);
- }
- return effects.check(nextPrefixedOrBlank, tableBodyClose, tableBodyContinue)(code);
- }
- function tableBodyClose(code) {
- effects.exit("tableBody");
- return tableClose(code);
- }
- function tableBodyContinue(code) {
- effects.enter("lineEnding");
- effects.consume(code);
- effects.exit("lineEnding");
- return createSpace(effects, rowStartBody, "linePrefix", 4);
- }
- }
- function tokenizeSetextUnderlineMini(effects, ok, nok) {
- return start;
- function start(code) {
- if (code !== 45) {
- return nok(code);
- }
- effects.enter("setextUnderline");
- return sequence(code);
- }
- function sequence(code) {
- if (code === 45) {
- effects.consume(code);
- return sequence;
- }
- return whitespace(code);
- }
- function whitespace(code) {
- if (code === -2 || code === -1 || code === 32) {
- effects.consume(code);
- return whitespace;
- }
- if (code === null || code === -5 || code === -4 || code === -3) {
- return ok(code);
- }
- return nok(code);
- }
- }
- function tokenizeNextPrefixedOrBlank(effects, ok, nok) {
- var size = 0;
- return start;
- function start(code) {
- effects.enter("check");
- effects.consume(code);
- return whitespace;
- }
- function whitespace(code) {
- if (code === -1 || code === 32) {
- effects.consume(code);
- size++;
- return size === 4 ? ok : whitespace;
- }
- if (code === null || code < 0) {
- return ok(code);
- }
- return nok(code);
- }
- }
- }
-});
-
-// node_modules/micromark-extension-gfm-table/index.js
-var require_micromark_extension_gfm_table = __commonJS({
- "node_modules/micromark-extension-gfm-table/index.js"(exports, module2) {
- module2.exports = require_syntax2();
- }
-});
-
-// node_modules/micromark-extension-gfm-task-list-item/syntax.js
-var require_syntax3 = __commonJS({
- "node_modules/micromark-extension-gfm-task-list-item/syntax.js"(exports) {
- var markdownLineEndingOrSpace = require_markdown_line_ending_or_space();
- var spaceFactory = require_factory_space();
- var prefixSize = require_prefix_size();
- var tasklistCheck = { tokenize: tokenizeTasklistCheck };
- exports.text = { 91: tasklistCheck };
- function tokenizeTasklistCheck(effects, ok, nok) {
- var self = this;
- return open;
- function open(code) {
- if (code !== 91 || self.previous !== null || !self._gfmTasklistFirstContentOfListItem) {
- return nok(code);
- }
- effects.enter("taskListCheck");
- effects.enter("taskListCheckMarker");
- effects.consume(code);
- effects.exit("taskListCheckMarker");
- return inside;
- }
- function inside(code) {
- if (code === -2 || code === 32) {
- effects.enter("taskListCheckValueUnchecked");
- effects.consume(code);
- effects.exit("taskListCheckValueUnchecked");
- return close;
- }
- if (code === 88 || code === 120) {
- effects.enter("taskListCheckValueChecked");
- effects.consume(code);
- effects.exit("taskListCheckValueChecked");
- return close;
- }
- return nok(code);
- }
- function close(code) {
- if (code === 93) {
- effects.enter("taskListCheckMarker");
- effects.consume(code);
- effects.exit("taskListCheckMarker");
- effects.exit("taskListCheck");
- return effects.check({ tokenize: spaceThenNonSpace }, ok, nok);
- }
- return nok(code);
- }
- }
- function spaceThenNonSpace(effects, ok, nok) {
- var self = this;
- return spaceFactory(effects, after, "whitespace");
- function after(code) {
- return prefixSize(self.events, "whitespace") && code !== null && !markdownLineEndingOrSpace(code) ? ok(code) : nok(code);
- }
- }
- }
-});
-
-// node_modules/micromark-extension-gfm-task-list-item/index.js
-var require_micromark_extension_gfm_task_list_item = __commonJS({
- "node_modules/micromark-extension-gfm-task-list-item/index.js"(exports, module2) {
- module2.exports = require_syntax3();
- }
-});
-
-// node_modules/micromark-extension-gfm/syntax.js
-var require_syntax4 = __commonJS({
- "node_modules/micromark-extension-gfm/syntax.js"(exports, module2) {
- var combine = require_combine_extensions();
- var autolink = require_micromark_extension_gfm_autolink_literal();
- var strikethrough = require_micromark_extension_gfm_strikethrough();
- var table = require_micromark_extension_gfm_table();
- var tasklist = require_micromark_extension_gfm_task_list_item();
- module2.exports = create;
- function create(options) {
- return combine([autolink, strikethrough(options), table, tasklist]);
- }
- }
-});
-
-// node_modules/micromark-extension-gfm/index.js
-var require_micromark_extension_gfm = __commonJS({
- "node_modules/micromark-extension-gfm/index.js"(exports, module2) {
- module2.exports = require_syntax4();
- }
-});
-
-// node_modules/ccount/index.js
-var require_ccount = __commonJS({
- "node_modules/ccount/index.js"(exports, module2) {
- "use strict";
- module2.exports = ccount;
- function ccount(source, character) {
- var value = String(source);
- var count = 0;
- var index;
- if (typeof character !== "string") {
- throw new Error("Expected character");
- }
- index = value.indexOf(character);
- while (index !== -1) {
- count++;
- index = value.indexOf(character, index + character.length);
- }
- return count;
- }
- }
-});
-
-// node_modules/unist-util-is/convert.js
-var require_convert = __commonJS({
- "node_modules/unist-util-is/convert.js"(exports, module2) {
- "use strict";
- module2.exports = convert;
- function convert(test) {
- if (test == null) {
- return ok;
- }
- if (typeof test === "string") {
- return typeFactory(test);
- }
- if (typeof test === "object") {
- return "length" in test ? anyFactory(test) : allFactory(test);
- }
- if (typeof test === "function") {
- return test;
- }
- throw new Error("Expected function, string, or object as test");
- }
- function allFactory(test) {
- return all;
- function all(node) {
- var key;
- for (key in test) {
- if (node[key] !== test[key])
- return false;
- }
- return true;
- }
- }
- function anyFactory(tests) {
- var checks = [];
- var index = -1;
- while (++index < tests.length) {
- checks[index] = convert(tests[index]);
- }
- return any;
- function any() {
- var index2 = -1;
- while (++index2 < checks.length) {
- if (checks[index2].apply(this, arguments)) {
- return true;
- }
- }
- return false;
- }
- }
- function typeFactory(test) {
- return type;
- function type(node) {
- return Boolean(node && node.type === test);
- }
- }
- function ok() {
- return true;
- }
- }
-});
-
-// node_modules/unist-util-visit-parents/color.browser.js
-var require_color_browser = __commonJS({
- "node_modules/unist-util-visit-parents/color.browser.js"(exports, module2) {
- module2.exports = identity;
- function identity(d) {
- return d;
- }
- }
-});
-
-// node_modules/unist-util-visit-parents/index.js
-var require_unist_util_visit_parents = __commonJS({
- "node_modules/unist-util-visit-parents/index.js"(exports, module2) {
- "use strict";
- module2.exports = visitParents;
- var convert = require_convert();
- var color = require_color_browser();
- var CONTINUE = true;
- var SKIP3 = "skip";
- var EXIT = false;
- visitParents.CONTINUE = CONTINUE;
- visitParents.SKIP = SKIP3;
- visitParents.EXIT = EXIT;
- function visitParents(tree, test, visitor, reverse) {
- var step;
- var is;
- if (typeof test === "function" && typeof visitor !== "function") {
- reverse = visitor;
- visitor = test;
- test = null;
- }
- is = convert(test);
- step = reverse ? -1 : 1;
- factory(tree, null, [])();
- function factory(node, index, parents) {
- var value = typeof node === "object" && node !== null ? node : {};
- var name;
- if (typeof value.type === "string") {
- name = typeof value.tagName === "string" ? value.tagName : typeof value.name === "string" ? value.name : void 0;
- visit3.displayName = "node (" + color(value.type + (name ? "<" + name + ">" : "")) + ")";
- }
- return visit3;
- function visit3() {
- var grandparents = parents.concat(node);
- var result = [];
- var subresult;
- var offset;
- if (!test || is(node, index, parents[parents.length - 1] || null)) {
- result = toResult(visitor(node, parents));
- if (result[0] === EXIT) {
- return result;
- }
- }
- if (node.children && result[0] !== SKIP3) {
- offset = (reverse ? node.children.length : -1) + step;
- while (offset > -1 && offset < node.children.length) {
- subresult = factory(node.children[offset], offset, grandparents)();
- if (subresult[0] === EXIT) {
- return subresult;
- }
- offset = typeof subresult[1] === "number" ? subresult[1] : offset + step;
- }
- }
- return result;
- }
- }
- }
- function toResult(value) {
- if (value !== null && typeof value === "object" && "length" in value) {
- return value;
- }
- if (typeof value === "number") {
- return [CONTINUE, value];
- }
- return [value];
- }
- }
-});
-
-// node_modules/escape-string-regexp/index.js
-var require_escape_string_regexp = __commonJS({
- "node_modules/escape-string-regexp/index.js"(exports, module2) {
- "use strict";
- module2.exports = (string2) => {
- if (typeof string2 !== "string") {
- throw new TypeError("Expected a string");
- }
- return string2.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d");
- };
- }
-});
-
-// node_modules/mdast-util-find-and-replace/index.js
-var require_mdast_util_find_and_replace = __commonJS({
- "node_modules/mdast-util-find-and-replace/index.js"(exports, module2) {
- "use strict";
- module2.exports = findAndReplace;
- var visit3 = require_unist_util_visit_parents();
- var convert = require_convert();
- var escape = require_escape_string_regexp();
- var splice = [].splice;
- function findAndReplace(tree, find, replace, options) {
- var settings;
- var schema4;
- if (typeof find === "string" || find && typeof find.exec === "function") {
- schema4 = [[find, replace]];
- } else {
- schema4 = find;
- options = replace;
- }
- settings = options || {};
- search(tree, settings, handlerFactory(toPairs(schema4)));
- return tree;
- function handlerFactory(pairs2) {
- var pair = pairs2[0];
- return handler;
- function handler(node, parent) {
- var find2 = pair[0];
- var replace2 = pair[1];
- var nodes = [];
- var start = 0;
- var index = parent.children.indexOf(node);
- var position;
- var match;
- var subhandler;
- var value;
- find2.lastIndex = 0;
- match = find2.exec(node.value);
- while (match) {
- position = match.index;
- value = replace2.apply(null, [].concat(match, { index: match.index, input: match.input }));
- if (value !== false) {
- if (start !== position) {
- nodes.push({ type: "text", value: node.value.slice(start, position) });
- }
- if (typeof value === "string" && value.length > 0) {
- value = { type: "text", value };
- }
- if (value) {
- nodes = [].concat(nodes, value);
- }
- start = position + match[0].length;
- }
- if (!find2.global) {
- break;
- }
- match = find2.exec(node.value);
- }
- if (position === void 0) {
- nodes = [node];
- index--;
- } else {
- if (start < node.value.length) {
- nodes.push({ type: "text", value: node.value.slice(start) });
- }
- nodes.unshift(index, 1);
- splice.apply(parent.children, nodes);
- }
- if (pairs2.length > 1) {
- subhandler = handlerFactory(pairs2.slice(1));
- position = -1;
- while (++position < nodes.length) {
- node = nodes[position];
- if (node.type === "text") {
- subhandler(node, parent);
- } else {
- search(node, settings, subhandler);
- }
- }
- }
- return index + nodes.length + 1;
- }
- }
- }
- function search(tree, settings, handler) {
- var ignored = convert(settings.ignore || []);
- var result = [];
- visit3(tree, "text", visitor);
- return result;
- function visitor(node, parents) {
- var index = -1;
- var parent;
- var grandparent;
- while (++index < parents.length) {
- parent = parents[index];
- if (ignored(parent, grandparent ? grandparent.children.indexOf(parent) : void 0, grandparent)) {
- return;
- }
- grandparent = parent;
- }
- return handler(node, grandparent);
- }
- }
- function toPairs(schema4) {
- var result = [];
- var key;
- var index;
- if (typeof schema4 !== "object") {
- throw new Error("Expected array or object as schema");
- }
- if ("length" in schema4) {
- index = -1;
- while (++index < schema4.length) {
- result.push([
- toExpression(schema4[index][0]),
- toFunction(schema4[index][1])
- ]);
- }
- } else {
- for (key in schema4) {
- result.push([toExpression(key), toFunction(schema4[key])]);
- }
- }
- return result;
- }
- function toExpression(find) {
- return typeof find === "string" ? new RegExp(escape(find), "g") : find;
- }
- function toFunction(replace) {
- return typeof replace === "function" ? replace : returner;
- function returner() {
- return replace;
- }
- }
- }
-});
-
-// node_modules/mdast-util-gfm-autolink-literal/from-markdown.js
-var require_from_markdown = __commonJS({
- "node_modules/mdast-util-gfm-autolink-literal/from-markdown.js"(exports) {
- var ccount = require_ccount();
- var findAndReplace = require_mdast_util_find_and_replace();
- var unicodePunctuation = require_unicode_punctuation();
- var unicodeWhitespace = require_unicode_whitespace();
- exports.transforms = [transformGfmAutolinkLiterals];
- exports.enter = {
- literalAutolink: enterLiteralAutolink,
- literalAutolinkEmail: enterLiteralAutolinkValue,
- literalAutolinkHttp: enterLiteralAutolinkValue,
- literalAutolinkWww: enterLiteralAutolinkValue
- };
- exports.exit = {
- literalAutolink: exitLiteralAutolink,
- literalAutolinkEmail: exitLiteralAutolinkEmail,
- literalAutolinkHttp: exitLiteralAutolinkHttp,
- literalAutolinkWww: exitLiteralAutolinkWww
- };
- function enterLiteralAutolink(token) {
- this.enter({ type: "link", title: null, url: "", children: [] }, token);
- }
- function enterLiteralAutolinkValue(token) {
- this.config.enter.autolinkProtocol.call(this, token);
- }
- function exitLiteralAutolinkHttp(token) {
- this.config.exit.autolinkProtocol.call(this, token);
- }
- function exitLiteralAutolinkWww(token) {
- this.config.exit.data.call(this, token);
- this.stack[this.stack.length - 1].url = "http://" + this.sliceSerialize(token);
- }
- function exitLiteralAutolinkEmail(token) {
- this.config.exit.autolinkEmail.call(this, token);
- }
- function exitLiteralAutolink(token) {
- this.exit(token);
- }
- function transformGfmAutolinkLiterals(tree) {
- findAndReplace(tree, [
- [/(https?:\/\/|www(?=\.))([-.\w]+)([^ \t\r\n]*)/i, findUrl],
- [/([-.\w+]+)@([-\w]+(?:\.[-\w]+)+)/, findEmail]
- ], { ignore: ["link", "linkReference"] });
- }
- function findUrl($0, protocol, domain, path, match) {
- var prefix = "";
- var parts;
- var result;
- if (!previous(match)) {
- return false;
- }
- if (/^w/i.test(protocol)) {
- domain = protocol + domain;
- protocol = "";
- prefix = "http://";
- }
- if (!isCorrectDomain(domain)) {
- return false;
- }
- parts = splitUrl(domain + path);
- if (!parts[0])
- return false;
- result = {
- type: "link",
- title: null,
- url: prefix + protocol + parts[0],
- children: [{ type: "text", value: protocol + parts[0] }]
- };
- if (parts[1]) {
- result = [result, { type: "text", value: parts[1] }];
- }
- return result;
- }
- function findEmail($0, atext, label, match) {
- if (!previous(match, true) || /[_-]$/.test(label)) {
- return false;
- }
- return {
- type: "link",
- title: null,
- url: "mailto:" + atext + "@" + label,
- children: [{ type: "text", value: atext + "@" + label }]
- };
- }
- function isCorrectDomain(domain) {
- var parts = domain.split(".");
- if (parts.length < 2 || parts[parts.length - 1] && (/_/.test(parts[parts.length - 1]) || !/[a-zA-Z\d]/.test(parts[parts.length - 1])) || parts[parts.length - 2] && (/_/.test(parts[parts.length - 2]) || !/[a-zA-Z\d]/.test(parts[parts.length - 2]))) {
- return false;
- }
- return true;
- }
- function splitUrl(url) {
- var trail = /[!"&'),.:;<>?\]}]+$/.exec(url);
- var closingParenIndex;
- var openingParens;
- var closingParens;
- if (trail) {
- url = url.slice(0, trail.index);
- trail = trail[0];
- closingParenIndex = trail.indexOf(")");
- openingParens = ccount(url, "(");
- closingParens = ccount(url, ")");
- while (closingParenIndex !== -1 && openingParens > closingParens) {
- url += trail.slice(0, closingParenIndex + 1);
- trail = trail.slice(closingParenIndex + 1);
- closingParenIndex = trail.indexOf(")");
- closingParens++;
- }
- }
- return [url, trail];
- }
- function previous(match, email) {
- var code = match.input.charCodeAt(match.index - 1);
- return (code !== code || unicodeWhitespace(code) || unicodePunctuation(code)) && (!email || code !== 47);
- }
- }
-});
-
-// node_modules/mdast-util-gfm-strikethrough/from-markdown.js
-var require_from_markdown2 = __commonJS({
- "node_modules/mdast-util-gfm-strikethrough/from-markdown.js"(exports) {
- exports.canContainEols = ["delete"];
- exports.enter = { strikethrough: enterStrikethrough };
- exports.exit = { strikethrough: exitStrikethrough };
- function enterStrikethrough(token) {
- this.enter({ type: "delete", children: [] }, token);
- }
- function exitStrikethrough(token) {
- this.exit(token);
- }
- }
-});
-
-// node_modules/mdast-util-gfm-table/from-markdown.js
-var require_from_markdown3 = __commonJS({
- "node_modules/mdast-util-gfm-table/from-markdown.js"(exports) {
- exports.enter = {
- table: enterTable,
- tableData: enterCell,
- tableHeader: enterCell,
- tableRow: enterRow
- };
- exports.exit = {
- codeText: exitCodeText,
- table: exitTable,
- tableData: exit,
- tableHeader: exit,
- tableRow: exit
- };
- function enterTable(token) {
- this.enter({ type: "table", align: token._align, children: [] }, token);
- this.setData("inTable", true);
- }
- function exitTable(token) {
- this.exit(token);
- this.setData("inTable");
- }
- function enterRow(token) {
- this.enter({ type: "tableRow", children: [] }, token);
- }
- function exit(token) {
- this.exit(token);
- }
- function enterCell(token) {
- this.enter({ type: "tableCell", children: [] }, token);
- }
- function exitCodeText(token) {
- var value = this.resume();
- if (this.getData("inTable")) {
- value = value.replace(/\\([\\|])/g, replace);
- }
- this.stack[this.stack.length - 1].value = value;
- this.exit(token);
- }
- function replace($0, $1) {
- return $1 === "|" ? $1 : $0;
- }
- }
-});
-
-// node_modules/mdast-util-gfm-task-list-item/from-markdown.js
-var require_from_markdown4 = __commonJS({
- "node_modules/mdast-util-gfm-task-list-item/from-markdown.js"(exports) {
- exports.exit = {
- taskListCheckValueChecked: exitCheck,
- taskListCheckValueUnchecked: exitCheck,
- paragraph: exitParagraphWithTaskListItem
- };
- function exitCheck(token) {
- this.stack[this.stack.length - 2].checked = token.type === "taskListCheckValueChecked";
- }
- function exitParagraphWithTaskListItem(token) {
- var parent = this.stack[this.stack.length - 2];
- var node = this.stack[this.stack.length - 1];
- var siblings = parent.children;
- var head = node.children[0];
- var index = -1;
- var firstParaghraph;
- if (parent && parent.type === "listItem" && typeof parent.checked === "boolean" && head && head.type === "text") {
- while (++index < siblings.length) {
- if (siblings[index].type === "paragraph") {
- firstParaghraph = siblings[index];
- break;
- }
- }
- if (firstParaghraph === node) {
- head.value = head.value.slice(1);
- if (head.value.length === 0) {
- node.children.shift();
- } else {
- head.position.start.column++;
- head.position.start.offset++;
- node.position.start = Object.assign({}, head.position.start);
- }
- }
- }
- this.exit(token);
- }
- }
-});
-
-// node_modules/mdast-util-gfm/from-markdown.js
-var require_from_markdown5 = __commonJS({
- "node_modules/mdast-util-gfm/from-markdown.js"(exports, module2) {
- var autolinkLiteral = require_from_markdown();
- var strikethrough = require_from_markdown2();
- var table = require_from_markdown3();
- var taskListItem = require_from_markdown4();
- var own = {}.hasOwnProperty;
- module2.exports = configure([
- autolinkLiteral,
- strikethrough,
- table,
- taskListItem
- ]);
- function configure(extensions) {
- var config = { transforms: [], canContainEols: [] };
- var length = extensions.length;
- var index = -1;
- while (++index < length) {
- extension(config, extensions[index]);
- }
- return config;
- }
- function extension(config, extension2) {
- var key;
- var left;
- var right;
- for (key in extension2) {
- left = own.call(config, key) ? config[key] : config[key] = {};
- right = extension2[key];
- if (key === "canContainEols" || key === "transforms") {
- config[key] = [].concat(left, right);
- } else {
- Object.assign(left, right);
- }
- }
- }
- }
-});
-
-// node_modules/mdast-util-gfm-autolink-literal/to-markdown.js
-var require_to_markdown = __commonJS({
- "node_modules/mdast-util-gfm-autolink-literal/to-markdown.js"(exports) {
- var inConstruct = "phrasing";
- var notInConstruct = ["autolink", "link", "image", "label"];
- exports.unsafe = [
- {
- character: "@",
- before: "[+\\-.\\w]",
- after: "[\\-.\\w]",
- inConstruct,
- notInConstruct
- },
- {
- character: ".",
- before: "[Ww]",
- after: "[\\-.\\w]",
- inConstruct,
- notInConstruct
- },
- {
- character: ":",
- before: "[ps]",
- after: "\\/",
- inConstruct,
- notInConstruct
- }
- ];
- }
-});
-
-// node_modules/mdast-util-to-markdown/lib/util/container-phrasing.js
-var require_container_phrasing = __commonJS({
- "node_modules/mdast-util-to-markdown/lib/util/container-phrasing.js"(exports, module2) {
- module2.exports = phrasing;
- function phrasing(parent, context, safeOptions) {
- var children = parent.children || [];
- var results = [];
- var index = -1;
- var before = safeOptions.before;
- var after;
- var handle;
- var child;
- while (++index < children.length) {
- child = children[index];
- if (index + 1 < children.length) {
- handle = context.handle.handlers[children[index + 1].type];
- if (handle && handle.peek)
- handle = handle.peek;
- after = handle ? handle(children[index + 1], parent, context, {
- before: "",
- after: ""
- }).charAt(0) : "";
- } else {
- after = safeOptions.after;
- }
- if (results.length > 0 && (before === "\r" || before === "\n") && child.type === "html") {
- results[results.length - 1] = results[results.length - 1].replace(/(\r?\n|\r)$/, " ");
- before = " ";
- }
- results.push(context.handle(child, parent, context, {
- before,
- after
- }));
- before = results[results.length - 1].slice(-1);
- }
- return results.join("");
- }
- }
-});
-
-// node_modules/mdast-util-gfm-strikethrough/to-markdown.js
-var require_to_markdown2 = __commonJS({
- "node_modules/mdast-util-gfm-strikethrough/to-markdown.js"(exports) {
- var phrasing = require_container_phrasing();
- exports.unsafe = [{ character: "~", inConstruct: "phrasing" }];
- exports.handlers = { delete: handleDelete };
- handleDelete.peek = peekDelete;
- function handleDelete(node, _, context) {
- var exit = context.enter("emphasis");
- var value = phrasing(node, context, { before: "~", after: "~" });
- exit();
- return "~~" + value + "~~";
- }
- function peekDelete() {
- return "~";
- }
- }
-});
-
-// node_modules/mdast-util-to-markdown/lib/util/pattern-compile.js
-var require_pattern_compile = __commonJS({
- "node_modules/mdast-util-to-markdown/lib/util/pattern-compile.js"(exports, module2) {
- module2.exports = patternCompile;
- function patternCompile(pattern) {
- var before;
- var after;
- if (!pattern._compiled) {
- before = pattern.before ? "(?:" + pattern.before + ")" : "";
- after = pattern.after ? "(?:" + pattern.after + ")" : "";
- if (pattern.atBreak) {
- before = "[\\r\\n][\\t ]*" + before;
- }
- pattern._compiled = new RegExp((before ? "(" + before + ")" : "") + (/[|\\{}()[\]^$+*?.-]/.test(pattern.character) ? "\\" : "") + pattern.character + (after || ""), "g");
- }
- return pattern._compiled;
- }
- }
-});
-
-// node_modules/mdast-util-to-markdown/lib/handle/inline-code.js
-var require_inline_code = __commonJS({
- "node_modules/mdast-util-to-markdown/lib/handle/inline-code.js"(exports, module2) {
- module2.exports = inlineCode;
- inlineCode.peek = inlineCodePeek;
- var patternCompile = require_pattern_compile();
- function inlineCode(node, parent, context) {
- var value = node.value || "";
- var sequence = "`";
- var index = -1;
- var pattern;
- var expression;
- var match;
- var position;
- while (new RegExp("(^|[^`])" + sequence + "([^`]|$)").test(value)) {
- sequence += "`";
- }
- if (/[^ \r\n]/.test(value) && (/[ \r\n`]/.test(value.charAt(0)) || /[ \r\n`]/.test(value.charAt(value.length - 1)))) {
- value = " " + value + " ";
- }
- while (++index < context.unsafe.length) {
- pattern = context.unsafe[index];
- if (!pattern.atBreak)
- continue;
- expression = patternCompile(pattern);
- while (match = expression.exec(value)) {
- position = match.index;
- if (value.charCodeAt(position) === 10 && value.charCodeAt(position - 1) === 13) {
- position--;
- }
- value = value.slice(0, position) + " " + value.slice(match.index + 1);
- }
- }
- return sequence + value + sequence;
- }
- function inlineCodePeek() {
- return "`";
- }
- }
-});
-
-// node_modules/repeat-string/index.js
-var require_repeat_string = __commonJS({
- "node_modules/repeat-string/index.js"(exports, module2) {
- "use strict";
- var res = "";
- var cache;
- module2.exports = repeat;
- function repeat(str, num) {
- if (typeof str !== "string") {
- throw new TypeError("expected a string");
- }
- if (num === 1)
- return str;
- if (num === 2)
- return str + str;
- var max = str.length * num;
- if (cache !== str || typeof cache === "undefined") {
- cache = str;
- res = "";
- } else if (res.length >= max) {
- return res.substr(0, max);
- }
- while (max > res.length && num > 1) {
- if (num & 1) {
- res += str;
- }
- num >>= 1;
- str += str;
- }
- res += str;
- res = res.substr(0, max);
- return res;
- }
- }
-});
-
-// node_modules/markdown-table/index.js
-var require_markdown_table = __commonJS({
- "node_modules/markdown-table/index.js"(exports, module2) {
- "use strict";
- var repeat = require_repeat_string();
- module2.exports = markdownTable;
- var trailingWhitespace = / +$/;
- var space = " ";
- var lineFeed = "\n";
- var dash = "-";
- var colon = ":";
- var verticalBar = "|";
- var x = 0;
- var C = 67;
- var L = 76;
- var R = 82;
- var c = 99;
- var l = 108;
- var r = 114;
- function markdownTable(table, options) {
- var settings = options || {};
- var padding = settings.padding !== false;
- var start = settings.delimiterStart !== false;
- var end = settings.delimiterEnd !== false;
- var align = (settings.align || []).concat();
- var alignDelimiters = settings.alignDelimiters !== false;
- var alignments = [];
- var stringLength = settings.stringLength || defaultStringLength;
- var rowIndex = -1;
- var rowLength = table.length;
- var cellMatrix = [];
- var sizeMatrix = [];
- var row = [];
- var sizes = [];
- var longestCellByColumn = [];
- var mostCellsPerRow = 0;
- var cells;
- var columnIndex;
- var columnLength;
- var largest;
- var size;
- var cell;
- var lines;
- var line;
- var before;
- var after;
- var code;
- while (++rowIndex < rowLength) {
- cells = table[rowIndex];
- columnIndex = -1;
- columnLength = cells.length;
- row = [];
- sizes = [];
- if (columnLength > mostCellsPerRow) {
- mostCellsPerRow = columnLength;
- }
- while (++columnIndex < columnLength) {
- cell = serialize(cells[columnIndex]);
- if (alignDelimiters === true) {
- size = stringLength(cell);
- sizes[columnIndex] = size;
- largest = longestCellByColumn[columnIndex];
- if (largest === void 0 || size > largest) {
- longestCellByColumn[columnIndex] = size;
- }
- }
- row.push(cell);
- }
- cellMatrix[rowIndex] = row;
- sizeMatrix[rowIndex] = sizes;
- }
- columnIndex = -1;
- columnLength = mostCellsPerRow;
- if (typeof align === "object" && "length" in align) {
- while (++columnIndex < columnLength) {
- alignments[columnIndex] = toAlignment(align[columnIndex]);
- }
- } else {
- code = toAlignment(align);
- while (++columnIndex < columnLength) {
- alignments[columnIndex] = code;
- }
- }
- columnIndex = -1;
- columnLength = mostCellsPerRow;
- row = [];
- sizes = [];
- while (++columnIndex < columnLength) {
- code = alignments[columnIndex];
- before = "";
- after = "";
- if (code === l) {
- before = colon;
- } else if (code === r) {
- after = colon;
- } else if (code === c) {
- before = colon;
- after = colon;
- }
- size = alignDelimiters ? Math.max(1, longestCellByColumn[columnIndex] - before.length - after.length) : 1;
- cell = before + repeat(dash, size) + after;
- if (alignDelimiters === true) {
- size = before.length + size + after.length;
- if (size > longestCellByColumn[columnIndex]) {
- longestCellByColumn[columnIndex] = size;
- }
- sizes[columnIndex] = size;
- }
- row[columnIndex] = cell;
- }
- cellMatrix.splice(1, 0, row);
- sizeMatrix.splice(1, 0, sizes);
- rowIndex = -1;
- rowLength = cellMatrix.length;
- lines = [];
- while (++rowIndex < rowLength) {
- row = cellMatrix[rowIndex];
- sizes = sizeMatrix[rowIndex];
- columnIndex = -1;
- columnLength = mostCellsPerRow;
- line = [];
- while (++columnIndex < columnLength) {
- cell = row[columnIndex] || "";
- before = "";
- after = "";
- if (alignDelimiters === true) {
- size = longestCellByColumn[columnIndex] - (sizes[columnIndex] || 0);
- code = alignments[columnIndex];
- if (code === r) {
- before = repeat(space, size);
- } else if (code === c) {
- if (size % 2 === 0) {
- before = repeat(space, size / 2);
- after = before;
- } else {
- before = repeat(space, size / 2 + 0.5);
- after = repeat(space, size / 2 - 0.5);
- }
- } else {
- after = repeat(space, size);
- }
- }
- if (start === true && columnIndex === 0) {
- line.push(verticalBar);
- }
- if (padding === true && !(alignDelimiters === false && cell === "") && (start === true || columnIndex !== 0)) {
- line.push(space);
- }
- if (alignDelimiters === true) {
- line.push(before);
- }
- line.push(cell);
- if (alignDelimiters === true) {
- line.push(after);
- }
- if (padding === true) {
- line.push(space);
- }
- if (end === true || columnIndex !== columnLength - 1) {
- line.push(verticalBar);
- }
- }
- line = line.join("");
- if (end === false) {
- line = line.replace(trailingWhitespace, "");
- }
- lines.push(line);
- }
- return lines.join(lineFeed);
- }
- function serialize(value) {
- return value === null || value === void 0 ? "" : String(value);
- }
- function defaultStringLength(value) {
- return value.length;
- }
- function toAlignment(value) {
- var code = typeof value === "string" ? value.charCodeAt(0) : x;
- return code === L || code === l ? l : code === R || code === r ? r : code === C || code === c ? c : x;
- }
- }
-});
-
-// node_modules/mdast-util-gfm-table/to-markdown.js
-var require_to_markdown3 = __commonJS({
- "node_modules/mdast-util-gfm-table/to-markdown.js"(exports, module2) {
- var phrasing = require_container_phrasing();
- var defaultInlineCode = require_inline_code();
- var markdownTable = require_markdown_table();
- module2.exports = toMarkdown;
- function toMarkdown(options) {
- var settings = options || {};
- var padding = settings.tableCellPadding;
- var alignDelimiters = settings.tablePipeAlign;
- var stringLength = settings.stringLength;
- var around = padding ? " " : "|";
- return {
- unsafe: [
- { character: "\r", inConstruct: "tableCell" },
- { character: "\n", inConstruct: "tableCell" },
- { atBreak: true, character: "|", after: "[ :-]" },
- { character: "|", inConstruct: "tableCell" },
- { atBreak: true, character: ":", after: "-" },
- { atBreak: true, character: "-", after: "[:|-]" }
- ],
- handlers: {
- table: handleTable,
- tableRow: handleTableRow,
- tableCell: handleTableCell,
- inlineCode: inlineCodeWithTable
- }
- };
- function handleTable(node, _, context) {
- return serializeData(handleTableAsData(node, context), node.align);
- }
- function handleTableRow(node, _, context) {
- var row = handleTableRowAsData(node, context);
- var value = serializeData([row]);
- return value.slice(0, value.indexOf("\n"));
- }
- function handleTableCell(node, _, context) {
- var exit = context.enter("tableCell");
- var value = phrasing(node, context, { before: around, after: around });
- exit();
- return value;
- }
- function serializeData(matrix, align) {
- return markdownTable(matrix, {
- align,
- alignDelimiters,
- padding,
- stringLength
- });
- }
- function handleTableAsData(node, context) {
- var children = node.children;
- var index = -1;
- var length = children.length;
- var result = [];
- var subexit = context.enter("table");
- while (++index < length) {
- result[index] = handleTableRowAsData(children[index], context);
- }
- subexit();
- return result;
- }
- function handleTableRowAsData(node, context) {
- var children = node.children;
- var index = -1;
- var length = children.length;
- var result = [];
- var subexit = context.enter("tableRow");
- while (++index < length) {
- result[index] = handleTableCell(children[index], node, context);
- }
- subexit();
- return result;
- }
- function inlineCodeWithTable(node, parent, context) {
- var value = defaultInlineCode(node, parent, context);
- if (context.stack.indexOf("tableCell") !== -1) {
- value = value.replace(/\|/g, "\\$&");
- }
- return value;
- }
- }
- }
-});
-
-// node_modules/mdast-util-to-markdown/lib/util/check-bullet.js
-var require_check_bullet = __commonJS({
- "node_modules/mdast-util-to-markdown/lib/util/check-bullet.js"(exports, module2) {
- module2.exports = checkBullet;
- function checkBullet(context) {
- var marker = context.options.bullet || "*";
- if (marker !== "*" && marker !== "+" && marker !== "-") {
- throw new Error("Cannot serialize items with `" + marker + "` for `options.bullet`, expected `*`, `+`, or `-`");
- }
- return marker;
- }
- }
-});
-
-// node_modules/mdast-util-to-markdown/lib/util/check-list-item-indent.js
-var require_check_list_item_indent = __commonJS({
- "node_modules/mdast-util-to-markdown/lib/util/check-list-item-indent.js"(exports, module2) {
- module2.exports = checkListItemIndent;
- function checkListItemIndent(context) {
- var style = context.options.listItemIndent || "tab";
- if (style === 1 || style === "1") {
- return "one";
- }
- if (style !== "tab" && style !== "one" && style !== "mixed") {
- throw new Error("Cannot serialize items with `" + style + "` for `options.listItemIndent`, expected `tab`, `one`, or `mixed`");
- }
- return style;
- }
- }
-});
-
-// node_modules/mdast-util-to-markdown/lib/util/container-flow.js
-var require_container_flow = __commonJS({
- "node_modules/mdast-util-to-markdown/lib/util/container-flow.js"(exports, module2) {
- module2.exports = flow;
- var repeat = require_repeat_string();
- function flow(parent, context) {
- var children = parent.children || [];
- var results = [];
- var index = -1;
- var child;
- while (++index < children.length) {
- child = children[index];
- results.push(context.handle(child, parent, context, { before: "\n", after: "\n" }));
- if (index + 1 < children.length) {
- results.push(between(child, children[index + 1]));
- }
- }
- return results.join("");
- function between(left, right) {
- var index2 = -1;
- var result;
- while (++index2 < context.join.length) {
- result = context.join[index2](left, right, parent, context);
- if (result === true || result === 1) {
- break;
- }
- if (typeof result === "number") {
- return repeat("\n", 1 + Number(result));
- }
- if (result === false) {
- return "\n\n\n\n";
- }
- }
- return "\n\n";
- }
- }
- }
-});
-
-// node_modules/mdast-util-to-markdown/lib/util/indent-lines.js
-var require_indent_lines = __commonJS({
- "node_modules/mdast-util-to-markdown/lib/util/indent-lines.js"(exports, module2) {
- module2.exports = indentLines;
- var eol = /\r?\n|\r/g;
- function indentLines(value, map2) {
- var result = [];
- var start = 0;
- var line = 0;
- var match;
- while (match = eol.exec(value)) {
- one(value.slice(start, match.index));
- result.push(match[0]);
- start = match.index + match[0].length;
- line++;
- }
- one(value.slice(start));
- return result.join("");
- function one(value2) {
- result.push(map2(value2, line, !value2));
- }
- }
- }
-});
-
-// node_modules/mdast-util-to-markdown/lib/handle/list-item.js
-var require_list_item = __commonJS({
- "node_modules/mdast-util-to-markdown/lib/handle/list-item.js"(exports, module2) {
- module2.exports = listItem;
- var repeat = require_repeat_string();
- var checkBullet = require_check_bullet();
- var checkListItemIndent = require_check_list_item_indent();
- var flow = require_container_flow();
- var indentLines = require_indent_lines();
- function listItem(node, parent, context) {
- var bullet = checkBullet(context);
- var listItemIndent = checkListItemIndent(context);
- var size;
- var value;
- var exit;
- if (parent && parent.ordered) {
- bullet = (parent.start > -1 ? parent.start : 1) + (context.options.incrementListMarker === false ? 0 : parent.children.indexOf(node)) + ".";
- }
- size = bullet.length + 1;
- if (listItemIndent === "tab" || listItemIndent === "mixed" && (parent && parent.spread || node.spread)) {
- size = Math.ceil(size / 4) * 4;
- }
- exit = context.enter("listItem");
- value = indentLines(flow(node, context), map2);
- exit();
- return value;
- function map2(line, index, blank) {
- if (index) {
- return (blank ? "" : repeat(" ", size)) + line;
- }
- return (blank ? bullet : bullet + repeat(" ", size - bullet.length)) + line;
- }
- }
- }
-});
-
-// node_modules/mdast-util-gfm-task-list-item/to-markdown.js
-var require_to_markdown4 = __commonJS({
- "node_modules/mdast-util-gfm-task-list-item/to-markdown.js"(exports) {
- var defaultListItem = require_list_item();
- exports.unsafe = [{ atBreak: true, character: "-", after: "[:|-]" }];
- exports.handlers = {
- listItem: listItemWithTaskListItem
- };
- function listItemWithTaskListItem(node, parent, context) {
- var value = defaultListItem(node, parent, context);
- var head = node.children[0];
- if (typeof node.checked === "boolean" && head && head.type === "paragraph") {
- value = value.replace(/^(?:[*+-]|\d+\.)([\r\n]| {1,3})/, check);
- }
- return value;
- function check($0) {
- return $0 + "[" + (node.checked ? "x" : " ") + "] ";
- }
- }
- }
-});
-
-// node_modules/mdast-util-to-markdown/lib/configure.js
-var require_configure = __commonJS({
- "node_modules/mdast-util-to-markdown/lib/configure.js"(exports, module2) {
- module2.exports = configure;
- function configure(base, extension) {
- var index = -1;
- var key;
- if (extension.extensions) {
- while (++index < extension.extensions.length) {
- configure(base, extension.extensions[index]);
- }
- }
- for (key in extension) {
- if (key === "extensions") {
- } else if (key === "unsafe" || key === "join") {
- base[key] = base[key].concat(extension[key] || []);
- } else if (key === "handlers") {
- base[key] = Object.assign(base[key], extension[key] || {});
- } else {
- base.options[key] = extension[key];
- }
- }
- return base;
- }
- }
-});
-
-// node_modules/mdast-util-gfm/to-markdown.js
-var require_to_markdown5 = __commonJS({
- "node_modules/mdast-util-gfm/to-markdown.js"(exports, module2) {
- var autolinkLiteral = require_to_markdown();
- var strikethrough = require_to_markdown2();
- var table = require_to_markdown3();
- var taskListItem = require_to_markdown4();
- var configure = require_configure();
- module2.exports = toMarkdown;
- function toMarkdown(options) {
- var config = configure({ handlers: {}, join: [], unsafe: [], options: {} }, {
- extensions: [autolinkLiteral, strikethrough, table(options), taskListItem]
- });
- return Object.assign(config.options, {
- handlers: config.handlers,
- join: config.join,
- unsafe: config.unsafe
- });
- }
- }
-});
-
-// node_modules/remark-gfm/index.js
-var require_remark_gfm = __commonJS({
- "node_modules/remark-gfm/index.js"(exports, module2) {
- "use strict";
- var syntax = require_micromark_extension_gfm();
- var fromMarkdown = require_from_markdown5();
- var toMarkdown = require_to_markdown5();
- var warningIssued;
- module2.exports = gfm;
- function gfm(options) {
- var data = this.data();
- if (!warningIssued && (this.Parser && this.Parser.prototype && this.Parser.prototype.blockTokenizers || this.Compiler && this.Compiler.prototype && this.Compiler.prototype.visitors)) {
- warningIssued = true;
- console.warn("[remark-gfm] Warning: please upgrade to remark 13 to use this plugin");
- }
- add("micromarkExtensions", syntax(options));
- add("fromMarkdownExtensions", fromMarkdown);
- add("toMarkdownExtensions", toMarkdown(options));
- function add(field, value) {
- if (data[field])
- data[field].push(value);
- else
- data[field] = [value];
- }
- }
- }
-});
-
-// node_modules/@tryfabric/martian/build/src/index.js
-var require_src = __commonJS({
- "node_modules/@tryfabric/martian/build/src/index.js"(exports) {
- "use strict";
- var __importDefault = exports && exports.__importDefault || function(mod) {
- return mod && mod.__esModule ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.markdownToRichText = exports.markdownToBlocks = void 0;
- var unified_1 = __importDefault(require_unified());
- var remark_parse_1 = __importDefault(require_remark_parse());
- var internal_1 = require_internal();
- var remark_gfm_1 = __importDefault(require_remark_gfm());
- function markdownToBlocks2(body, options) {
- const root = (0, unified_1.default)().use(remark_parse_1.default).use(remark_gfm_1.default).parse(body);
- return (0, internal_1.parseBlocks)(root, options);
- }
- exports.markdownToBlocks = markdownToBlocks2;
- function markdownToRichText(text, options) {
- const root = (0, unified_1.default)().use(remark_parse_1.default).use(remark_gfm_1.default).parse(text);
- return (0, internal_1.parseRichText)(root, options);
- }
- exports.markdownToRichText = markdownToRichText;
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/common.js
-var require_common2 = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/common.js"(exports, module2) {
- "use strict";
- function isNothing(subject) {
- return typeof subject === "undefined" || subject === null;
- }
- function isObject(subject) {
- return typeof subject === "object" && subject !== null;
- }
- function toArray(sequence) {
- if (Array.isArray(sequence))
- return sequence;
- else if (isNothing(sequence))
- return [];
- return [sequence];
- }
- function extend(target, source) {
- var index, length, key, sourceKeys;
- if (source) {
- sourceKeys = Object.keys(source);
- for (index = 0, length = sourceKeys.length; index < length; index += 1) {
- key = sourceKeys[index];
- target[key] = source[key];
- }
- }
- return target;
- }
- function repeat(string2, count) {
- var result = "", cycle;
- for (cycle = 0; cycle < count; cycle += 1) {
- result += string2;
- }
- return result;
- }
- function isNegativeZero(number) {
- return number === 0 && Number.NEGATIVE_INFINITY === 1 / number;
- }
- module2.exports.isNothing = isNothing;
- module2.exports.isObject = isObject;
- module2.exports.toArray = toArray;
- module2.exports.repeat = repeat;
- module2.exports.isNegativeZero = isNegativeZero;
- module2.exports.extend = extend;
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/exception.js
-var require_exception = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/exception.js"(exports, module2) {
- "use strict";
- function YAMLException(reason, mark) {
- Error.call(this);
- this.name = "YAMLException";
- this.reason = reason;
- this.mark = mark;
- this.message = (this.reason || "(unknown reason)") + (this.mark ? " " + this.mark.toString() : "");
- if (Error.captureStackTrace) {
- Error.captureStackTrace(this, this.constructor);
- } else {
- this.stack = new Error().stack || "";
- }
- }
- YAMLException.prototype = Object.create(Error.prototype);
- YAMLException.prototype.constructor = YAMLException;
- YAMLException.prototype.toString = function toString(compact) {
- var result = this.name + ": ";
- result += this.reason || "(unknown reason)";
- if (!compact && this.mark) {
- result += " " + this.mark.toString();
- }
- return result;
- };
- module2.exports = YAMLException;
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/mark.js
-var require_mark = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/mark.js"(exports, module2) {
- "use strict";
- var common = require_common2();
- function Mark(name, buffer, position, line, column) {
- this.name = name;
- this.buffer = buffer;
- this.position = position;
- this.line = line;
- this.column = column;
- }
- Mark.prototype.getSnippet = function getSnippet(indent, maxLength) {
- var head, start, tail, end, snippet;
- if (!this.buffer)
- return null;
- indent = indent || 4;
- maxLength = maxLength || 75;
- head = "";
- start = this.position;
- while (start > 0 && "\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(start - 1)) === -1) {
- start -= 1;
- if (this.position - start > maxLength / 2 - 1) {
- head = " ... ";
- start += 5;
- break;
- }
- }
- tail = "";
- end = this.position;
- while (end < this.buffer.length && "\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(end)) === -1) {
- end += 1;
- if (end - this.position > maxLength / 2 - 1) {
- tail = " ... ";
- end -= 5;
- break;
- }
- }
- snippet = this.buffer.slice(start, end);
- return common.repeat(" ", indent) + head + snippet + tail + "\n" + common.repeat(" ", indent + this.position - start + head.length) + "^";
- };
- Mark.prototype.toString = function toString(compact) {
- var snippet, where = "";
- if (this.name) {
- where += 'in "' + this.name + '" ';
- }
- where += "at line " + (this.line + 1) + ", column " + (this.column + 1);
- if (!compact) {
- snippet = this.getSnippet();
- if (snippet) {
- where += ":\n" + snippet;
- }
- }
- return where;
- };
- module2.exports = Mark;
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type.js
-var require_type = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type.js"(exports, module2) {
- "use strict";
- var YAMLException = require_exception();
- var TYPE_CONSTRUCTOR_OPTIONS = [
- "kind",
- "resolve",
- "construct",
- "instanceOf",
- "predicate",
- "represent",
- "defaultStyle",
- "styleAliases"
- ];
- var YAML_NODE_KINDS = [
- "scalar",
- "sequence",
- "mapping"
- ];
- function compileStyleAliases(map2) {
- var result = {};
- if (map2 !== null) {
- Object.keys(map2).forEach(function(style) {
- map2[style].forEach(function(alias) {
- result[String(alias)] = style;
- });
- });
- }
- return result;
- }
- function Type(tag, options) {
- options = options || {};
- Object.keys(options).forEach(function(name) {
- if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {
- throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.');
- }
- });
- this.tag = tag;
- this.kind = options["kind"] || null;
- this.resolve = options["resolve"] || function() {
- return true;
- };
- this.construct = options["construct"] || function(data) {
- return data;
- };
- this.instanceOf = options["instanceOf"] || null;
- this.predicate = options["predicate"] || null;
- this.represent = options["represent"] || null;
- this.defaultStyle = options["defaultStyle"] || null;
- this.styleAliases = compileStyleAliases(options["styleAliases"] || null);
- if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {
- throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
- }
- }
- module2.exports = Type;
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/schema.js
-var require_schema = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/schema.js"(exports, module2) {
- "use strict";
- var common = require_common2();
- var YAMLException = require_exception();
- var Type = require_type();
- function compileList(schema4, name, result) {
- var exclude = [];
- schema4.include.forEach(function(includedSchema) {
- result = compileList(includedSchema, name, result);
- });
- schema4[name].forEach(function(currentType) {
- result.forEach(function(previousType, previousIndex) {
- if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) {
- exclude.push(previousIndex);
- }
- });
- result.push(currentType);
- });
- return result.filter(function(type, index) {
- return exclude.indexOf(index) === -1;
- });
- }
- function compileMap() {
- var result = {
- scalar: {},
- sequence: {},
- mapping: {},
- fallback: {}
- }, index, length;
- function collectType(type) {
- result[type.kind][type.tag] = result["fallback"][type.tag] = type;
- }
- for (index = 0, length = arguments.length; index < length; index += 1) {
- arguments[index].forEach(collectType);
- }
- return result;
- }
- function Schema2(definition) {
- this.include = definition.include || [];
- this.implicit = definition.implicit || [];
- this.explicit = definition.explicit || [];
- this.implicit.forEach(function(type) {
- if (type.loadKind && type.loadKind !== "scalar") {
- throw new YAMLException("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");
- }
- });
- this.compiledImplicit = compileList(this, "implicit", []);
- this.compiledExplicit = compileList(this, "explicit", []);
- this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit);
- }
- Schema2.DEFAULT = null;
- Schema2.create = function createSchema() {
- var schemas2, types;
- switch (arguments.length) {
- case 1:
- schemas2 = Schema2.DEFAULT;
- types = arguments[0];
- break;
- case 2:
- schemas2 = arguments[0];
- types = arguments[1];
- break;
- default:
- throw new YAMLException("Wrong number of arguments for Schema.create function");
- }
- schemas2 = common.toArray(schemas2);
- types = common.toArray(types);
- if (!schemas2.every(function(schema4) {
- return schema4 instanceof Schema2;
- })) {
- throw new YAMLException("Specified list of super schemas (or a single Schema object) contains a non-Schema object.");
- }
- if (!types.every(function(type) {
- return type instanceof Type;
- })) {
- throw new YAMLException("Specified list of YAML types (or a single Type object) contains a non-Type object.");
- }
- return new Schema2({
- include: schemas2,
- explicit: types
- });
- };
- module2.exports = Schema2;
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/str.js
-var require_str = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/str.js"(exports, module2) {
- "use strict";
- var Type = require_type();
- module2.exports = new Type("tag:yaml.org,2002:str", {
- kind: "scalar",
- construct: function(data) {
- return data !== null ? data : "";
- }
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/seq.js
-var require_seq = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/seq.js"(exports, module2) {
- "use strict";
- var Type = require_type();
- module2.exports = new Type("tag:yaml.org,2002:seq", {
- kind: "sequence",
- construct: function(data) {
- return data !== null ? data : [];
- }
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/map.js
-var require_map = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/map.js"(exports, module2) {
- "use strict";
- var Type = require_type();
- module2.exports = new Type("tag:yaml.org,2002:map", {
- kind: "mapping",
- construct: function(data) {
- return data !== null ? data : {};
- }
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/schema/failsafe.js
-var require_failsafe = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/schema/failsafe.js"(exports, module2) {
- "use strict";
- var Schema2 = require_schema();
- module2.exports = new Schema2({
- explicit: [
- require_str(),
- require_seq(),
- require_map()
- ]
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/null.js
-var require_null = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/null.js"(exports, module2) {
- "use strict";
- var Type = require_type();
- function resolveYamlNull(data) {
- if (data === null)
- return true;
- var max = data.length;
- return max === 1 && data === "~" || max === 4 && (data === "null" || data === "Null" || data === "NULL");
- }
- function constructYamlNull() {
- return null;
- }
- function isNull(object) {
- return object === null;
- }
- module2.exports = new Type("tag:yaml.org,2002:null", {
- kind: "scalar",
- resolve: resolveYamlNull,
- construct: constructYamlNull,
- predicate: isNull,
- represent: {
- canonical: function() {
- return "~";
- },
- lowercase: function() {
- return "null";
- },
- uppercase: function() {
- return "NULL";
- },
- camelcase: function() {
- return "Null";
- }
- },
- defaultStyle: "lowercase"
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/bool.js
-var require_bool = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/bool.js"(exports, module2) {
- "use strict";
- var Type = require_type();
- function resolveYamlBoolean(data) {
- if (data === null)
- return false;
- var max = data.length;
- return max === 4 && (data === "true" || data === "True" || data === "TRUE") || max === 5 && (data === "false" || data === "False" || data === "FALSE");
- }
- function constructYamlBoolean(data) {
- return data === "true" || data === "True" || data === "TRUE";
- }
- function isBoolean(object) {
- return Object.prototype.toString.call(object) === "[object Boolean]";
- }
- module2.exports = new Type("tag:yaml.org,2002:bool", {
- kind: "scalar",
- resolve: resolveYamlBoolean,
- construct: constructYamlBoolean,
- predicate: isBoolean,
- represent: {
- lowercase: function(object) {
- return object ? "true" : "false";
- },
- uppercase: function(object) {
- return object ? "TRUE" : "FALSE";
- },
- camelcase: function(object) {
- return object ? "True" : "False";
- }
- },
- defaultStyle: "lowercase"
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/int.js
-var require_int = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/int.js"(exports, module2) {
- "use strict";
- var common = require_common2();
- var Type = require_type();
- function isHexCode(c) {
- return 48 <= c && c <= 57 || 65 <= c && c <= 70 || 97 <= c && c <= 102;
- }
- function isOctCode(c) {
- return 48 <= c && c <= 55;
- }
- function isDecCode(c) {
- return 48 <= c && c <= 57;
- }
- function resolveYamlInteger(data) {
- if (data === null)
- return false;
- var max = data.length, index = 0, hasDigits = false, ch;
- if (!max)
- return false;
- ch = data[index];
- if (ch === "-" || ch === "+") {
- ch = data[++index];
- }
- if (ch === "0") {
- if (index + 1 === max)
- return true;
- ch = data[++index];
- if (ch === "b") {
- index++;
- for (; index < max; index++) {
- ch = data[index];
- if (ch === "_")
- continue;
- if (ch !== "0" && ch !== "1")
- return false;
- hasDigits = true;
- }
- return hasDigits && ch !== "_";
- }
- if (ch === "x") {
- index++;
- for (; index < max; index++) {
- ch = data[index];
- if (ch === "_")
- continue;
- if (!isHexCode(data.charCodeAt(index)))
- return false;
- hasDigits = true;
- }
- return hasDigits && ch !== "_";
- }
- for (; index < max; index++) {
- ch = data[index];
- if (ch === "_")
- continue;
- if (!isOctCode(data.charCodeAt(index)))
- return false;
- hasDigits = true;
- }
- return hasDigits && ch !== "_";
- }
- if (ch === "_")
- return false;
- for (; index < max; index++) {
- ch = data[index];
- if (ch === "_")
- continue;
- if (ch === ":")
- break;
- if (!isDecCode(data.charCodeAt(index))) {
- return false;
- }
- hasDigits = true;
- }
- if (!hasDigits || ch === "_")
- return false;
- if (ch !== ":")
- return true;
- return /^(:[0-5]?[0-9])+$/.test(data.slice(index));
- }
- function constructYamlInteger(data) {
- var value = data, sign = 1, ch, base, digits = [];
- if (value.indexOf("_") !== -1) {
- value = value.replace(/_/g, "");
- }
- ch = value[0];
- if (ch === "-" || ch === "+") {
- if (ch === "-")
- sign = -1;
- value = value.slice(1);
- ch = value[0];
- }
- if (value === "0")
- return 0;
- if (ch === "0") {
- if (value[1] === "b")
- return sign * parseInt(value.slice(2), 2);
- if (value[1] === "x")
- return sign * parseInt(value, 16);
- return sign * parseInt(value, 8);
- }
- if (value.indexOf(":") !== -1) {
- value.split(":").forEach(function(v) {
- digits.unshift(parseInt(v, 10));
- });
- value = 0;
- base = 1;
- digits.forEach(function(d) {
- value += d * base;
- base *= 60;
- });
- return sign * value;
- }
- return sign * parseInt(value, 10);
- }
- function isInteger(object) {
- return Object.prototype.toString.call(object) === "[object Number]" && (object % 1 === 0 && !common.isNegativeZero(object));
- }
- module2.exports = new Type("tag:yaml.org,2002:int", {
- kind: "scalar",
- resolve: resolveYamlInteger,
- construct: constructYamlInteger,
- predicate: isInteger,
- represent: {
- binary: function(obj) {
- return obj >= 0 ? "0b" + obj.toString(2) : "-0b" + obj.toString(2).slice(1);
- },
- octal: function(obj) {
- return obj >= 0 ? "0" + obj.toString(8) : "-0" + obj.toString(8).slice(1);
- },
- decimal: function(obj) {
- return obj.toString(10);
- },
- hexadecimal: function(obj) {
- return obj >= 0 ? "0x" + obj.toString(16).toUpperCase() : "-0x" + obj.toString(16).toUpperCase().slice(1);
- }
- },
- defaultStyle: "decimal",
- styleAliases: {
- binary: [2, "bin"],
- octal: [8, "oct"],
- decimal: [10, "dec"],
- hexadecimal: [16, "hex"]
- }
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/float.js
-var require_float = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/float.js"(exports, module2) {
- "use strict";
- var common = require_common2();
- var Type = require_type();
- var YAML_FLOAT_PATTERN = new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");
- function resolveYamlFloat(data) {
- if (data === null)
- return false;
- if (!YAML_FLOAT_PATTERN.test(data) || data[data.length - 1] === "_") {
- return false;
- }
- return true;
- }
- function constructYamlFloat(data) {
- var value, sign, base, digits;
- value = data.replace(/_/g, "").toLowerCase();
- sign = value[0] === "-" ? -1 : 1;
- digits = [];
- if ("+-".indexOf(value[0]) >= 0) {
- value = value.slice(1);
- }
- if (value === ".inf") {
- return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
- } else if (value === ".nan") {
- return NaN;
- } else if (value.indexOf(":") >= 0) {
- value.split(":").forEach(function(v) {
- digits.unshift(parseFloat(v, 10));
- });
- value = 0;
- base = 1;
- digits.forEach(function(d) {
- value += d * base;
- base *= 60;
- });
- return sign * value;
- }
- return sign * parseFloat(value, 10);
- }
- var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;
- function representYamlFloat(object, style) {
- var res;
- if (isNaN(object)) {
- switch (style) {
- case "lowercase":
- return ".nan";
- case "uppercase":
- return ".NAN";
- case "camelcase":
- return ".NaN";
- }
- } else if (Number.POSITIVE_INFINITY === object) {
- switch (style) {
- case "lowercase":
- return ".inf";
- case "uppercase":
- return ".INF";
- case "camelcase":
- return ".Inf";
- }
- } else if (Number.NEGATIVE_INFINITY === object) {
- switch (style) {
- case "lowercase":
- return "-.inf";
- case "uppercase":
- return "-.INF";
- case "camelcase":
- return "-.Inf";
- }
- } else if (common.isNegativeZero(object)) {
- return "-0.0";
- }
- res = object.toString(10);
- return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace("e", ".e") : res;
- }
- function isFloat(object) {
- return Object.prototype.toString.call(object) === "[object Number]" && (object % 1 !== 0 || common.isNegativeZero(object));
- }
- module2.exports = new Type("tag:yaml.org,2002:float", {
- kind: "scalar",
- resolve: resolveYamlFloat,
- construct: constructYamlFloat,
- predicate: isFloat,
- represent: representYamlFloat,
- defaultStyle: "lowercase"
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/schema/json.js
-var require_json = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/schema/json.js"(exports, module2) {
- "use strict";
- var Schema2 = require_schema();
- module2.exports = new Schema2({
- include: [
- require_failsafe()
- ],
- implicit: [
- require_null(),
- require_bool(),
- require_int(),
- require_float()
- ]
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/schema/core.js
-var require_core2 = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/schema/core.js"(exports, module2) {
- "use strict";
- var Schema2 = require_schema();
- module2.exports = new Schema2({
- include: [
- require_json()
- ]
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/timestamp.js
-var require_timestamp = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/timestamp.js"(exports, module2) {
- "use strict";
- var Type = require_type();
- var YAML_DATE_REGEXP = new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$");
- var YAML_TIMESTAMP_REGEXP = new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");
- function resolveYamlTimestamp(data) {
- if (data === null)
- return false;
- if (YAML_DATE_REGEXP.exec(data) !== null)
- return true;
- if (YAML_TIMESTAMP_REGEXP.exec(data) !== null)
- return true;
- return false;
- }
- function constructYamlTimestamp(data) {
- var match, year, month, day, hour, minute, second, fraction = 0, delta = null, tz_hour, tz_minute, date;
- match = YAML_DATE_REGEXP.exec(data);
- if (match === null)
- match = YAML_TIMESTAMP_REGEXP.exec(data);
- if (match === null)
- throw new Error("Date resolve error");
- year = +match[1];
- month = +match[2] - 1;
- day = +match[3];
- if (!match[4]) {
- return new Date(Date.UTC(year, month, day));
- }
- hour = +match[4];
- minute = +match[5];
- second = +match[6];
- if (match[7]) {
- fraction = match[7].slice(0, 3);
- while (fraction.length < 3) {
- fraction += "0";
- }
- fraction = +fraction;
- }
- if (match[9]) {
- tz_hour = +match[10];
- tz_minute = +(match[11] || 0);
- delta = (tz_hour * 60 + tz_minute) * 6e4;
- if (match[9] === "-")
- delta = -delta;
- }
- date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));
- if (delta)
- date.setTime(date.getTime() - delta);
- return date;
- }
- function representYamlTimestamp(object) {
- return object.toISOString();
- }
- module2.exports = new Type("tag:yaml.org,2002:timestamp", {
- kind: "scalar",
- resolve: resolveYamlTimestamp,
- construct: constructYamlTimestamp,
- instanceOf: Date,
- represent: representYamlTimestamp
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/merge.js
-var require_merge = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/merge.js"(exports, module2) {
- "use strict";
- var Type = require_type();
- function resolveYamlMerge(data) {
- return data === "<<" || data === null;
- }
- module2.exports = new Type("tag:yaml.org,2002:merge", {
- kind: "scalar",
- resolve: resolveYamlMerge
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/binary.js
-var require_binary = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/binary.js"(exports, module2) {
- "use strict";
- var NodeBuffer;
- try {
- _require = require;
- NodeBuffer = _require("buffer").Buffer;
- } catch (__) {
- }
- var _require;
- var Type = require_type();
- var BASE64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";
- function resolveYamlBinary(data) {
- if (data === null)
- return false;
- var code, idx, bitlen = 0, max = data.length, map2 = BASE64_MAP;
- for (idx = 0; idx < max; idx++) {
- code = map2.indexOf(data.charAt(idx));
- if (code > 64)
- continue;
- if (code < 0)
- return false;
- bitlen += 6;
- }
- return bitlen % 8 === 0;
- }
- function constructYamlBinary(data) {
- var idx, tailbits, input = data.replace(/[\r\n=]/g, ""), max = input.length, map2 = BASE64_MAP, bits = 0, result = [];
- for (idx = 0; idx < max; idx++) {
- if (idx % 4 === 0 && idx) {
- result.push(bits >> 16 & 255);
- result.push(bits >> 8 & 255);
- result.push(bits & 255);
- }
- bits = bits << 6 | map2.indexOf(input.charAt(idx));
- }
- tailbits = max % 4 * 6;
- if (tailbits === 0) {
- result.push(bits >> 16 & 255);
- result.push(bits >> 8 & 255);
- result.push(bits & 255);
- } else if (tailbits === 18) {
- result.push(bits >> 10 & 255);
- result.push(bits >> 2 & 255);
- } else if (tailbits === 12) {
- result.push(bits >> 4 & 255);
- }
- if (NodeBuffer) {
- return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result);
- }
- return result;
- }
- function representYamlBinary(object) {
- var result = "", bits = 0, idx, tail, max = object.length, map2 = BASE64_MAP;
- for (idx = 0; idx < max; idx++) {
- if (idx % 3 === 0 && idx) {
- result += map2[bits >> 18 & 63];
- result += map2[bits >> 12 & 63];
- result += map2[bits >> 6 & 63];
- result += map2[bits & 63];
- }
- bits = (bits << 8) + object[idx];
- }
- tail = max % 3;
- if (tail === 0) {
- result += map2[bits >> 18 & 63];
- result += map2[bits >> 12 & 63];
- result += map2[bits >> 6 & 63];
- result += map2[bits & 63];
- } else if (tail === 2) {
- result += map2[bits >> 10 & 63];
- result += map2[bits >> 4 & 63];
- result += map2[bits << 2 & 63];
- result += map2[64];
- } else if (tail === 1) {
- result += map2[bits >> 2 & 63];
- result += map2[bits << 4 & 63];
- result += map2[64];
- result += map2[64];
- }
- return result;
- }
- function isBinary(object) {
- return NodeBuffer && NodeBuffer.isBuffer(object);
- }
- module2.exports = new Type("tag:yaml.org,2002:binary", {
- kind: "scalar",
- resolve: resolveYamlBinary,
- construct: constructYamlBinary,
- predicate: isBinary,
- represent: representYamlBinary
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/omap.js
-var require_omap = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/omap.js"(exports, module2) {
- "use strict";
- var Type = require_type();
- var _hasOwnProperty = Object.prototype.hasOwnProperty;
- var _toString = Object.prototype.toString;
- function resolveYamlOmap(data) {
- if (data === null)
- return true;
- var objectKeys = [], index, length, pair, pairKey, pairHasKey, object = data;
- for (index = 0, length = object.length; index < length; index += 1) {
- pair = object[index];
- pairHasKey = false;
- if (_toString.call(pair) !== "[object Object]")
- return false;
- for (pairKey in pair) {
- if (_hasOwnProperty.call(pair, pairKey)) {
- if (!pairHasKey)
- pairHasKey = true;
- else
- return false;
- }
- }
- if (!pairHasKey)
- return false;
- if (objectKeys.indexOf(pairKey) === -1)
- objectKeys.push(pairKey);
- else
- return false;
- }
- return true;
- }
- function constructYamlOmap(data) {
- return data !== null ? data : [];
- }
- module2.exports = new Type("tag:yaml.org,2002:omap", {
- kind: "sequence",
- resolve: resolveYamlOmap,
- construct: constructYamlOmap
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/pairs.js
-var require_pairs = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/pairs.js"(exports, module2) {
- "use strict";
- var Type = require_type();
- var _toString = Object.prototype.toString;
- function resolveYamlPairs(data) {
- if (data === null)
- return true;
- var index, length, pair, keys, result, object = data;
- result = new Array(object.length);
- for (index = 0, length = object.length; index < length; index += 1) {
- pair = object[index];
- if (_toString.call(pair) !== "[object Object]")
- return false;
- keys = Object.keys(pair);
- if (keys.length !== 1)
- return false;
- result[index] = [keys[0], pair[keys[0]]];
- }
- return true;
- }
- function constructYamlPairs(data) {
- if (data === null)
- return [];
- var index, length, pair, keys, result, object = data;
- result = new Array(object.length);
- for (index = 0, length = object.length; index < length; index += 1) {
- pair = object[index];
- keys = Object.keys(pair);
- result[index] = [keys[0], pair[keys[0]]];
- }
- return result;
- }
- module2.exports = new Type("tag:yaml.org,2002:pairs", {
- kind: "sequence",
- resolve: resolveYamlPairs,
- construct: constructYamlPairs
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/set.js
-var require_set = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/set.js"(exports, module2) {
- "use strict";
- var Type = require_type();
- var _hasOwnProperty = Object.prototype.hasOwnProperty;
- function resolveYamlSet(data) {
- if (data === null)
- return true;
- var key, object = data;
- for (key in object) {
- if (_hasOwnProperty.call(object, key)) {
- if (object[key] !== null)
- return false;
- }
- }
- return true;
- }
- function constructYamlSet(data) {
- return data !== null ? data : {};
- }
- module2.exports = new Type("tag:yaml.org,2002:set", {
- kind: "mapping",
- resolve: resolveYamlSet,
- construct: constructYamlSet
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/schema/default_safe.js
-var require_default_safe = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/schema/default_safe.js"(exports, module2) {
- "use strict";
- var Schema2 = require_schema();
- module2.exports = new Schema2({
- include: [
- require_core2()
- ],
- implicit: [
- require_timestamp(),
- require_merge()
- ],
- explicit: [
- require_binary(),
- require_omap(),
- require_pairs(),
- require_set()
- ]
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/js/undefined.js
-var require_undefined = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/js/undefined.js"(exports, module2) {
- "use strict";
- var Type = require_type();
- function resolveJavascriptUndefined() {
- return true;
- }
- function constructJavascriptUndefined() {
- return void 0;
- }
- function representJavascriptUndefined() {
- return "";
- }
- function isUndefined(object) {
- return typeof object === "undefined";
- }
- module2.exports = new Type("tag:yaml.org,2002:js/undefined", {
- kind: "scalar",
- resolve: resolveJavascriptUndefined,
- construct: constructJavascriptUndefined,
- predicate: isUndefined,
- represent: representJavascriptUndefined
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/js/regexp.js
-var require_regexp = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/js/regexp.js"(exports, module2) {
- "use strict";
- var Type = require_type();
- function resolveJavascriptRegExp(data) {
- if (data === null)
- return false;
- if (data.length === 0)
- return false;
- var regexp = data, tail = /\/([gim]*)$/.exec(data), modifiers = "";
- if (regexp[0] === "/") {
- if (tail)
- modifiers = tail[1];
- if (modifiers.length > 3)
- return false;
- if (regexp[regexp.length - modifiers.length - 1] !== "/")
- return false;
- }
- return true;
- }
- function constructJavascriptRegExp(data) {
- var regexp = data, tail = /\/([gim]*)$/.exec(data), modifiers = "";
- if (regexp[0] === "/") {
- if (tail)
- modifiers = tail[1];
- regexp = regexp.slice(1, regexp.length - modifiers.length - 1);
- }
- return new RegExp(regexp, modifiers);
- }
- function representJavascriptRegExp(object) {
- var result = "/" + object.source + "/";
- if (object.global)
- result += "g";
- if (object.multiline)
- result += "m";
- if (object.ignoreCase)
- result += "i";
- return result;
- }
- function isRegExp(object) {
- return Object.prototype.toString.call(object) === "[object RegExp]";
- }
- module2.exports = new Type("tag:yaml.org,2002:js/regexp", {
- kind: "scalar",
- resolve: resolveJavascriptRegExp,
- construct: constructJavascriptRegExp,
- predicate: isRegExp,
- represent: representJavascriptRegExp
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/type/js/function.js
-var require_function = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/type/js/function.js"(exports, module2) {
- "use strict";
- var esprima;
- try {
- _require = require;
- esprima = _require("esprima");
- } catch (_) {
- if (typeof window !== "undefined")
- esprima = window.esprima;
- }
- var _require;
- var Type = require_type();
- function resolveJavascriptFunction(data) {
- if (data === null)
- return false;
- try {
- var source = "(" + data + ")", ast = esprima.parse(source, { range: true });
- if (ast.type !== "Program" || ast.body.length !== 1 || ast.body[0].type !== "ExpressionStatement" || ast.body[0].expression.type !== "ArrowFunctionExpression" && ast.body[0].expression.type !== "FunctionExpression") {
- return false;
- }
- return true;
- } catch (err) {
- return false;
- }
- }
- function constructJavascriptFunction(data) {
- var source = "(" + data + ")", ast = esprima.parse(source, { range: true }), params = [], body;
- if (ast.type !== "Program" || ast.body.length !== 1 || ast.body[0].type !== "ExpressionStatement" || ast.body[0].expression.type !== "ArrowFunctionExpression" && ast.body[0].expression.type !== "FunctionExpression") {
- throw new Error("Failed to resolve function");
- }
- ast.body[0].expression.params.forEach(function(param) {
- params.push(param.name);
- });
- body = ast.body[0].expression.body.range;
- if (ast.body[0].expression.body.type === "BlockStatement") {
- return new Function(params, source.slice(body[0] + 1, body[1] - 1));
- }
- return new Function(params, "return " + source.slice(body[0], body[1]));
- }
- function representJavascriptFunction(object) {
- return object.toString();
- }
- function isFunction(object) {
- return Object.prototype.toString.call(object) === "[object Function]";
- }
- module2.exports = new Type("tag:yaml.org,2002:js/function", {
- kind: "scalar",
- resolve: resolveJavascriptFunction,
- construct: constructJavascriptFunction,
- predicate: isFunction,
- represent: representJavascriptFunction
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/schema/default_full.js
-var require_default_full = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/schema/default_full.js"(exports, module2) {
- "use strict";
- var Schema2 = require_schema();
- module2.exports = Schema2.DEFAULT = new Schema2({
- include: [
- require_default_safe()
- ],
- explicit: [
- require_undefined(),
- require_regexp(),
- require_function()
- ]
- });
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/loader.js
-var require_loader = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/loader.js"(exports, module2) {
- "use strict";
- var common = require_common2();
- var YAMLException = require_exception();
- var Mark = require_mark();
- var DEFAULT_SAFE_SCHEMA = require_default_safe();
- var DEFAULT_FULL_SCHEMA = require_default_full();
- var _hasOwnProperty = Object.prototype.hasOwnProperty;
- var CONTEXT_FLOW_IN = 1;
- var CONTEXT_FLOW_OUT = 2;
- var CONTEXT_BLOCK_IN = 3;
- var CONTEXT_BLOCK_OUT = 4;
- var CHOMPING_CLIP = 1;
- var CHOMPING_STRIP = 2;
- var CHOMPING_KEEP = 3;
- var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
- var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/;
- var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/;
- var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i;
- var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;
- function _class(obj) {
- return Object.prototype.toString.call(obj);
- }
- function is_EOL(c) {
- return c === 10 || c === 13;
- }
- function is_WHITE_SPACE(c) {
- return c === 9 || c === 32;
- }
- function is_WS_OR_EOL(c) {
- return c === 9 || c === 32 || c === 10 || c === 13;
- }
- function is_FLOW_INDICATOR(c) {
- return c === 44 || c === 91 || c === 93 || c === 123 || c === 125;
- }
- function fromHexCode(c) {
- var lc;
- if (48 <= c && c <= 57) {
- return c - 48;
- }
- lc = c | 32;
- if (97 <= lc && lc <= 102) {
- return lc - 97 + 10;
- }
- return -1;
- }
- function escapedHexLen(c) {
- if (c === 120) {
- return 2;
- }
- if (c === 117) {
- return 4;
- }
- if (c === 85) {
- return 8;
- }
- return 0;
- }
- function fromDecimalCode(c) {
- if (48 <= c && c <= 57) {
- return c - 48;
- }
- return -1;
- }
- function simpleEscapeSequence(c) {
- return c === 48 ? "\0" : c === 97 ? "\x07" : c === 98 ? "\b" : c === 116 ? " " : c === 9 ? " " : c === 110 ? "\n" : c === 118 ? "\v" : c === 102 ? "\f" : c === 114 ? "\r" : c === 101 ? "" : c === 32 ? " " : c === 34 ? '"' : c === 47 ? "/" : c === 92 ? "\\" : c === 78 ? "\x85" : c === 95 ? "\xA0" : c === 76 ? "\u2028" : c === 80 ? "\u2029" : "";
- }
- function charFromCodepoint(c) {
- if (c <= 65535) {
- return String.fromCharCode(c);
- }
- return String.fromCharCode((c - 65536 >> 10) + 55296, (c - 65536 & 1023) + 56320);
- }
- var simpleEscapeCheck = new Array(256);
- var simpleEscapeMap = new Array(256);
- for (i = 0; i < 256; i++) {
- simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;
- simpleEscapeMap[i] = simpleEscapeSequence(i);
- }
- var i;
- function State(input, options) {
- this.input = input;
- this.filename = options["filename"] || null;
- this.schema = options["schema"] || DEFAULT_FULL_SCHEMA;
- this.onWarning = options["onWarning"] || null;
- this.legacy = options["legacy"] || false;
- this.json = options["json"] || false;
- this.listener = options["listener"] || null;
- this.implicitTypes = this.schema.compiledImplicit;
- this.typeMap = this.schema.compiledTypeMap;
- this.length = input.length;
- this.position = 0;
- this.line = 0;
- this.lineStart = 0;
- this.lineIndent = 0;
- this.documents = [];
- }
- function generateError(state, message) {
- return new YAMLException(message, new Mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart));
- }
- function throwError(state, message) {
- throw generateError(state, message);
- }
- function throwWarning(state, message) {
- if (state.onWarning) {
- state.onWarning.call(null, generateError(state, message));
- }
- }
- var directiveHandlers = {
- YAML: function handleYamlDirective(state, name, args) {
- var match, major, minor;
- if (state.version !== null) {
- throwError(state, "duplication of %YAML directive");
- }
- if (args.length !== 1) {
- throwError(state, "YAML directive accepts exactly one argument");
- }
- match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]);
- if (match === null) {
- throwError(state, "ill-formed argument of the YAML directive");
- }
- major = parseInt(match[1], 10);
- minor = parseInt(match[2], 10);
- if (major !== 1) {
- throwError(state, "unacceptable YAML version of the document");
- }
- state.version = args[0];
- state.checkLineBreaks = minor < 2;
- if (minor !== 1 && minor !== 2) {
- throwWarning(state, "unsupported YAML version of the document");
- }
- },
- TAG: function handleTagDirective(state, name, args) {
- var handle, prefix;
- if (args.length !== 2) {
- throwError(state, "TAG directive accepts exactly two arguments");
- }
- handle = args[0];
- prefix = args[1];
- if (!PATTERN_TAG_HANDLE.test(handle)) {
- throwError(state, "ill-formed tag handle (first argument) of the TAG directive");
- }
- if (_hasOwnProperty.call(state.tagMap, handle)) {
- throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle');
- }
- if (!PATTERN_TAG_URI.test(prefix)) {
- throwError(state, "ill-formed tag prefix (second argument) of the TAG directive");
- }
- state.tagMap[handle] = prefix;
- }
- };
- function captureSegment(state, start, end, checkJson) {
- var _position, _length, _character, _result;
- if (start < end) {
- _result = state.input.slice(start, end);
- if (checkJson) {
- for (_position = 0, _length = _result.length; _position < _length; _position += 1) {
- _character = _result.charCodeAt(_position);
- if (!(_character === 9 || 32 <= _character && _character <= 1114111)) {
- throwError(state, "expected valid JSON character");
- }
- }
- } else if (PATTERN_NON_PRINTABLE.test(_result)) {
- throwError(state, "the stream contains non-printable characters");
- }
- state.result += _result;
- }
- }
- function mergeMappings(state, destination, source, overridableKeys) {
- var sourceKeys, key, index, quantity;
- if (!common.isObject(source)) {
- throwError(state, "cannot merge mappings; the provided source object is unacceptable");
- }
- sourceKeys = Object.keys(source);
- for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {
- key = sourceKeys[index];
- if (!_hasOwnProperty.call(destination, key)) {
- destination[key] = source[key];
- overridableKeys[key] = true;
- }
- }
- }
- function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) {
- var index, quantity;
- if (Array.isArray(keyNode)) {
- keyNode = Array.prototype.slice.call(keyNode);
- for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {
- if (Array.isArray(keyNode[index])) {
- throwError(state, "nested arrays are not supported inside keys");
- }
- if (typeof keyNode === "object" && _class(keyNode[index]) === "[object Object]") {
- keyNode[index] = "[object Object]";
- }
- }
- }
- if (typeof keyNode === "object" && _class(keyNode) === "[object Object]") {
- keyNode = "[object Object]";
- }
- keyNode = String(keyNode);
- if (_result === null) {
- _result = {};
- }
- if (keyTag === "tag:yaml.org,2002:merge") {
- if (Array.isArray(valueNode)) {
- for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {
- mergeMappings(state, _result, valueNode[index], overridableKeys);
- }
- } else {
- mergeMappings(state, _result, valueNode, overridableKeys);
- }
- } else {
- if (!state.json && !_hasOwnProperty.call(overridableKeys, keyNode) && _hasOwnProperty.call(_result, keyNode)) {
- state.line = startLine || state.line;
- state.position = startPos || state.position;
- throwError(state, "duplicated mapping key");
- }
- _result[keyNode] = valueNode;
- delete overridableKeys[keyNode];
- }
- return _result;
- }
- function readLineBreak(state) {
- var ch;
- ch = state.input.charCodeAt(state.position);
- if (ch === 10) {
- state.position++;
- } else if (ch === 13) {
- state.position++;
- if (state.input.charCodeAt(state.position) === 10) {
- state.position++;
- }
- } else {
- throwError(state, "a line break is expected");
- }
- state.line += 1;
- state.lineStart = state.position;
- }
- function skipSeparationSpace(state, allowComments, checkIndent) {
- var lineBreaks = 0, ch = state.input.charCodeAt(state.position);
- while (ch !== 0) {
- while (is_WHITE_SPACE(ch)) {
- ch = state.input.charCodeAt(++state.position);
- }
- if (allowComments && ch === 35) {
- do {
- ch = state.input.charCodeAt(++state.position);
- } while (ch !== 10 && ch !== 13 && ch !== 0);
- }
- if (is_EOL(ch)) {
- readLineBreak(state);
- ch = state.input.charCodeAt(state.position);
- lineBreaks++;
- state.lineIndent = 0;
- while (ch === 32) {
- state.lineIndent++;
- ch = state.input.charCodeAt(++state.position);
- }
- } else {
- break;
- }
- }
- if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {
- throwWarning(state, "deficient indentation");
- }
- return lineBreaks;
- }
- function testDocumentSeparator(state) {
- var _position = state.position, ch;
- ch = state.input.charCodeAt(_position);
- if ((ch === 45 || ch === 46) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) {
- _position += 3;
- ch = state.input.charCodeAt(_position);
- if (ch === 0 || is_WS_OR_EOL(ch)) {
- return true;
- }
- }
- return false;
- }
- function writeFoldedLines(state, count) {
- if (count === 1) {
- state.result += " ";
- } else if (count > 1) {
- state.result += common.repeat("\n", count - 1);
- }
- }
- function readPlainScalar(state, nodeIndent, withinFlowCollection) {
- var preceding, following, captureStart, captureEnd, hasPendingContent, _line, _lineStart, _lineIndent, _kind = state.kind, _result = state.result, ch;
- ch = state.input.charCodeAt(state.position);
- if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 35 || ch === 38 || ch === 42 || ch === 33 || ch === 124 || ch === 62 || ch === 39 || ch === 34 || ch === 37 || ch === 64 || ch === 96) {
- return false;
- }
- if (ch === 63 || ch === 45) {
- following = state.input.charCodeAt(state.position + 1);
- if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) {
- return false;
- }
- }
- state.kind = "scalar";
- state.result = "";
- captureStart = captureEnd = state.position;
- hasPendingContent = false;
- while (ch !== 0) {
- if (ch === 58) {
- following = state.input.charCodeAt(state.position + 1);
- if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) {
- break;
- }
- } else if (ch === 35) {
- preceding = state.input.charCodeAt(state.position - 1);
- if (is_WS_OR_EOL(preceding)) {
- break;
- }
- } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) {
- break;
- } else if (is_EOL(ch)) {
- _line = state.line;
- _lineStart = state.lineStart;
- _lineIndent = state.lineIndent;
- skipSeparationSpace(state, false, -1);
- if (state.lineIndent >= nodeIndent) {
- hasPendingContent = true;
- ch = state.input.charCodeAt(state.position);
- continue;
- } else {
- state.position = captureEnd;
- state.line = _line;
- state.lineStart = _lineStart;
- state.lineIndent = _lineIndent;
- break;
- }
- }
- if (hasPendingContent) {
- captureSegment(state, captureStart, captureEnd, false);
- writeFoldedLines(state, state.line - _line);
- captureStart = captureEnd = state.position;
- hasPendingContent = false;
- }
- if (!is_WHITE_SPACE(ch)) {
- captureEnd = state.position + 1;
- }
- ch = state.input.charCodeAt(++state.position);
- }
- captureSegment(state, captureStart, captureEnd, false);
- if (state.result) {
- return true;
- }
- state.kind = _kind;
- state.result = _result;
- return false;
- }
- function readSingleQuotedScalar(state, nodeIndent) {
- var ch, captureStart, captureEnd;
- ch = state.input.charCodeAt(state.position);
- if (ch !== 39) {
- return false;
- }
- state.kind = "scalar";
- state.result = "";
- state.position++;
- captureStart = captureEnd = state.position;
- while ((ch = state.input.charCodeAt(state.position)) !== 0) {
- if (ch === 39) {
- captureSegment(state, captureStart, state.position, true);
- ch = state.input.charCodeAt(++state.position);
- if (ch === 39) {
- captureStart = state.position;
- state.position++;
- captureEnd = state.position;
- } else {
- return true;
- }
- } else if (is_EOL(ch)) {
- captureSegment(state, captureStart, captureEnd, true);
- writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
- captureStart = captureEnd = state.position;
- } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
- throwError(state, "unexpected end of the document within a single quoted scalar");
- } else {
- state.position++;
- captureEnd = state.position;
- }
- }
- throwError(state, "unexpected end of the stream within a single quoted scalar");
- }
- function readDoubleQuotedScalar(state, nodeIndent) {
- var captureStart, captureEnd, hexLength, hexResult, tmp, ch;
- ch = state.input.charCodeAt(state.position);
- if (ch !== 34) {
- return false;
- }
- state.kind = "scalar";
- state.result = "";
- state.position++;
- captureStart = captureEnd = state.position;
- while ((ch = state.input.charCodeAt(state.position)) !== 0) {
- if (ch === 34) {
- captureSegment(state, captureStart, state.position, true);
- state.position++;
- return true;
- } else if (ch === 92) {
- captureSegment(state, captureStart, state.position, true);
- ch = state.input.charCodeAt(++state.position);
- if (is_EOL(ch)) {
- skipSeparationSpace(state, false, nodeIndent);
- } else if (ch < 256 && simpleEscapeCheck[ch]) {
- state.result += simpleEscapeMap[ch];
- state.position++;
- } else if ((tmp = escapedHexLen(ch)) > 0) {
- hexLength = tmp;
- hexResult = 0;
- for (; hexLength > 0; hexLength--) {
- ch = state.input.charCodeAt(++state.position);
- if ((tmp = fromHexCode(ch)) >= 0) {
- hexResult = (hexResult << 4) + tmp;
- } else {
- throwError(state, "expected hexadecimal character");
- }
- }
- state.result += charFromCodepoint(hexResult);
- state.position++;
- } else {
- throwError(state, "unknown escape sequence");
- }
- captureStart = captureEnd = state.position;
- } else if (is_EOL(ch)) {
- captureSegment(state, captureStart, captureEnd, true);
- writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
- captureStart = captureEnd = state.position;
- } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
- throwError(state, "unexpected end of the document within a double quoted scalar");
- } else {
- state.position++;
- captureEnd = state.position;
- }
- }
- throwError(state, "unexpected end of the stream within a double quoted scalar");
- }
- function readFlowCollection(state, nodeIndent) {
- var readNext = true, _line, _tag = state.tag, _result, _anchor = state.anchor, following, terminator, isPair2, isExplicitPair, isMapping, overridableKeys = {}, keyNode, keyTag, valueNode, ch;
- ch = state.input.charCodeAt(state.position);
- if (ch === 91) {
- terminator = 93;
- isMapping = false;
- _result = [];
- } else if (ch === 123) {
- terminator = 125;
- isMapping = true;
- _result = {};
- } else {
- return false;
- }
- if (state.anchor !== null) {
- state.anchorMap[state.anchor] = _result;
- }
- ch = state.input.charCodeAt(++state.position);
- while (ch !== 0) {
- skipSeparationSpace(state, true, nodeIndent);
- ch = state.input.charCodeAt(state.position);
- if (ch === terminator) {
- state.position++;
- state.tag = _tag;
- state.anchor = _anchor;
- state.kind = isMapping ? "mapping" : "sequence";
- state.result = _result;
- return true;
- } else if (!readNext) {
- throwError(state, "missed comma between flow collection entries");
- }
- keyTag = keyNode = valueNode = null;
- isPair2 = isExplicitPair = false;
- if (ch === 63) {
- following = state.input.charCodeAt(state.position + 1);
- if (is_WS_OR_EOL(following)) {
- isPair2 = isExplicitPair = true;
- state.position++;
- skipSeparationSpace(state, true, nodeIndent);
- }
- }
- _line = state.line;
- composeNode2(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
- keyTag = state.tag;
- keyNode = state.result;
- skipSeparationSpace(state, true, nodeIndent);
- ch = state.input.charCodeAt(state.position);
- if ((isExplicitPair || state.line === _line) && ch === 58) {
- isPair2 = true;
- ch = state.input.charCodeAt(++state.position);
- skipSeparationSpace(state, true, nodeIndent);
- composeNode2(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
- valueNode = state.result;
- }
- if (isMapping) {
- storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode);
- } else if (isPair2) {
- _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode));
- } else {
- _result.push(keyNode);
- }
- skipSeparationSpace(state, true, nodeIndent);
- ch = state.input.charCodeAt(state.position);
- if (ch === 44) {
- readNext = true;
- ch = state.input.charCodeAt(++state.position);
- } else {
- readNext = false;
- }
- }
- throwError(state, "unexpected end of the stream within a flow collection");
- }
- function readBlockScalar(state, nodeIndent) {
- var captureStart, folding, chomping = CHOMPING_CLIP, didReadContent = false, detectedIndent = false, textIndent = nodeIndent, emptyLines = 0, atMoreIndented = false, tmp, ch;
- ch = state.input.charCodeAt(state.position);
- if (ch === 124) {
- folding = false;
- } else if (ch === 62) {
- folding = true;
- } else {
- return false;
- }
- state.kind = "scalar";
- state.result = "";
- while (ch !== 0) {
- ch = state.input.charCodeAt(++state.position);
- if (ch === 43 || ch === 45) {
- if (CHOMPING_CLIP === chomping) {
- chomping = ch === 43 ? CHOMPING_KEEP : CHOMPING_STRIP;
- } else {
- throwError(state, "repeat of a chomping mode identifier");
- }
- } else if ((tmp = fromDecimalCode(ch)) >= 0) {
- if (tmp === 0) {
- throwError(state, "bad explicit indentation width of a block scalar; it cannot be less than one");
- } else if (!detectedIndent) {
- textIndent = nodeIndent + tmp - 1;
- detectedIndent = true;
- } else {
- throwError(state, "repeat of an indentation width identifier");
- }
- } else {
- break;
- }
- }
- if (is_WHITE_SPACE(ch)) {
- do {
- ch = state.input.charCodeAt(++state.position);
- } while (is_WHITE_SPACE(ch));
- if (ch === 35) {
- do {
- ch = state.input.charCodeAt(++state.position);
- } while (!is_EOL(ch) && ch !== 0);
- }
- }
- while (ch !== 0) {
- readLineBreak(state);
- state.lineIndent = 0;
- ch = state.input.charCodeAt(state.position);
- while ((!detectedIndent || state.lineIndent < textIndent) && ch === 32) {
- state.lineIndent++;
- ch = state.input.charCodeAt(++state.position);
- }
- if (!detectedIndent && state.lineIndent > textIndent) {
- textIndent = state.lineIndent;
- }
- if (is_EOL(ch)) {
- emptyLines++;
- continue;
- }
- if (state.lineIndent < textIndent) {
- if (chomping === CHOMPING_KEEP) {
- state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines);
- } else if (chomping === CHOMPING_CLIP) {
- if (didReadContent) {
- state.result += "\n";
- }
- }
- break;
- }
- if (folding) {
- if (is_WHITE_SPACE(ch)) {
- atMoreIndented = true;
- state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines);
- } else if (atMoreIndented) {
- atMoreIndented = false;
- state.result += common.repeat("\n", emptyLines + 1);
- } else if (emptyLines === 0) {
- if (didReadContent) {
- state.result += " ";
- }
- } else {
- state.result += common.repeat("\n", emptyLines);
- }
- } else {
- state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines);
- }
- didReadContent = true;
- detectedIndent = true;
- emptyLines = 0;
- captureStart = state.position;
- while (!is_EOL(ch) && ch !== 0) {
- ch = state.input.charCodeAt(++state.position);
- }
- captureSegment(state, captureStart, state.position, false);
- }
- return true;
- }
- function readBlockSequence(state, nodeIndent) {
- var _line, _tag = state.tag, _anchor = state.anchor, _result = [], following, detected = false, ch;
- if (state.anchor !== null) {
- state.anchorMap[state.anchor] = _result;
- }
- ch = state.input.charCodeAt(state.position);
- while (ch !== 0) {
- if (ch !== 45) {
- break;
- }
- following = state.input.charCodeAt(state.position + 1);
- if (!is_WS_OR_EOL(following)) {
- break;
- }
- detected = true;
- state.position++;
- if (skipSeparationSpace(state, true, -1)) {
- if (state.lineIndent <= nodeIndent) {
- _result.push(null);
- ch = state.input.charCodeAt(state.position);
- continue;
- }
- }
- _line = state.line;
- composeNode2(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);
- _result.push(state.result);
- skipSeparationSpace(state, true, -1);
- ch = state.input.charCodeAt(state.position);
- if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) {
- throwError(state, "bad indentation of a sequence entry");
- } else if (state.lineIndent < nodeIndent) {
- break;
- }
- }
- if (detected) {
- state.tag = _tag;
- state.anchor = _anchor;
- state.kind = "sequence";
- state.result = _result;
- return true;
- }
- return false;
- }
- function readBlockMapping(state, nodeIndent, flowIndent) {
- var following, allowCompact, _line, _pos, _tag = state.tag, _anchor = state.anchor, _result = {}, overridableKeys = {}, keyTag = null, keyNode = null, valueNode = null, atExplicitKey = false, detected = false, ch;
- if (state.anchor !== null) {
- state.anchorMap[state.anchor] = _result;
- }
- ch = state.input.charCodeAt(state.position);
- while (ch !== 0) {
- following = state.input.charCodeAt(state.position + 1);
- _line = state.line;
- _pos = state.position;
- if ((ch === 63 || ch === 58) && is_WS_OR_EOL(following)) {
- if (ch === 63) {
- if (atExplicitKey) {
- storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
- keyTag = keyNode = valueNode = null;
- }
- detected = true;
- atExplicitKey = true;
- allowCompact = true;
- } else if (atExplicitKey) {
- atExplicitKey = false;
- allowCompact = true;
- } else {
- throwError(state, "incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line");
- }
- state.position += 1;
- ch = following;
- } else if (composeNode2(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {
- if (state.line === _line) {
- ch = state.input.charCodeAt(state.position);
- while (is_WHITE_SPACE(ch)) {
- ch = state.input.charCodeAt(++state.position);
- }
- if (ch === 58) {
- ch = state.input.charCodeAt(++state.position);
- if (!is_WS_OR_EOL(ch)) {
- throwError(state, "a whitespace character is expected after the key-value separator within a block mapping");
- }
- if (atExplicitKey) {
- storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
- keyTag = keyNode = valueNode = null;
- }
- detected = true;
- atExplicitKey = false;
- allowCompact = false;
- keyTag = state.tag;
- keyNode = state.result;
- } else if (detected) {
- throwError(state, "can not read an implicit mapping pair; a colon is missed");
- } else {
- state.tag = _tag;
- state.anchor = _anchor;
- return true;
- }
- } else if (detected) {
- throwError(state, "can not read a block mapping entry; a multiline key may not be an implicit key");
- } else {
- state.tag = _tag;
- state.anchor = _anchor;
- return true;
- }
- } else {
- break;
- }
- if (state.line === _line || state.lineIndent > nodeIndent) {
- if (composeNode2(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {
- if (atExplicitKey) {
- keyNode = state.result;
- } else {
- valueNode = state.result;
- }
- }
- if (!atExplicitKey) {
- storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos);
- keyTag = keyNode = valueNode = null;
- }
- skipSeparationSpace(state, true, -1);
- ch = state.input.charCodeAt(state.position);
- }
- if (state.lineIndent > nodeIndent && ch !== 0) {
- throwError(state, "bad indentation of a mapping entry");
- } else if (state.lineIndent < nodeIndent) {
- break;
- }
- }
- if (atExplicitKey) {
- storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
- }
- if (detected) {
- state.tag = _tag;
- state.anchor = _anchor;
- state.kind = "mapping";
- state.result = _result;
- }
- return detected;
- }
- function readTagProperty(state) {
- var _position, isVerbatim = false, isNamed = false, tagHandle, tagName, ch;
- ch = state.input.charCodeAt(state.position);
- if (ch !== 33)
- return false;
- if (state.tag !== null) {
- throwError(state, "duplication of a tag property");
- }
- ch = state.input.charCodeAt(++state.position);
- if (ch === 60) {
- isVerbatim = true;
- ch = state.input.charCodeAt(++state.position);
- } else if (ch === 33) {
- isNamed = true;
- tagHandle = "!!";
- ch = state.input.charCodeAt(++state.position);
- } else {
- tagHandle = "!";
- }
- _position = state.position;
- if (isVerbatim) {
- do {
- ch = state.input.charCodeAt(++state.position);
- } while (ch !== 0 && ch !== 62);
- if (state.position < state.length) {
- tagName = state.input.slice(_position, state.position);
- ch = state.input.charCodeAt(++state.position);
- } else {
- throwError(state, "unexpected end of the stream within a verbatim tag");
- }
- } else {
- while (ch !== 0 && !is_WS_OR_EOL(ch)) {
- if (ch === 33) {
- if (!isNamed) {
- tagHandle = state.input.slice(_position - 1, state.position + 1);
- if (!PATTERN_TAG_HANDLE.test(tagHandle)) {
- throwError(state, "named tag handle cannot contain such characters");
- }
- isNamed = true;
- _position = state.position + 1;
- } else {
- throwError(state, "tag suffix cannot contain exclamation marks");
- }
- }
- ch = state.input.charCodeAt(++state.position);
- }
- tagName = state.input.slice(_position, state.position);
- if (PATTERN_FLOW_INDICATORS.test(tagName)) {
- throwError(state, "tag suffix cannot contain flow indicator characters");
- }
- }
- if (tagName && !PATTERN_TAG_URI.test(tagName)) {
- throwError(state, "tag name cannot contain such characters: " + tagName);
- }
- if (isVerbatim) {
- state.tag = tagName;
- } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) {
- state.tag = state.tagMap[tagHandle] + tagName;
- } else if (tagHandle === "!") {
- state.tag = "!" + tagName;
- } else if (tagHandle === "!!") {
- state.tag = "tag:yaml.org,2002:" + tagName;
- } else {
- throwError(state, 'undeclared tag handle "' + tagHandle + '"');
- }
- return true;
- }
- function readAnchorProperty(state) {
- var _position, ch;
- ch = state.input.charCodeAt(state.position);
- if (ch !== 38)
- return false;
- if (state.anchor !== null) {
- throwError(state, "duplication of an anchor property");
- }
- ch = state.input.charCodeAt(++state.position);
- _position = state.position;
- while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
- ch = state.input.charCodeAt(++state.position);
- }
- if (state.position === _position) {
- throwError(state, "name of an anchor node must contain at least one character");
- }
- state.anchor = state.input.slice(_position, state.position);
- return true;
- }
- function readAlias(state) {
- var _position, alias, ch;
- ch = state.input.charCodeAt(state.position);
- if (ch !== 42)
- return false;
- ch = state.input.charCodeAt(++state.position);
- _position = state.position;
- while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
- ch = state.input.charCodeAt(++state.position);
- }
- if (state.position === _position) {
- throwError(state, "name of an alias node must contain at least one character");
- }
- alias = state.input.slice(_position, state.position);
- if (!_hasOwnProperty.call(state.anchorMap, alias)) {
- throwError(state, 'unidentified alias "' + alias + '"');
- }
- state.result = state.anchorMap[alias];
- skipSeparationSpace(state, true, -1);
- return true;
- }
- function composeNode2(state, parentIndent, nodeContext, allowToSeek, allowCompact) {
- var allowBlockStyles, allowBlockScalars, allowBlockCollections, indentStatus = 1, atNewLine = false, hasContent = false, typeIndex, typeQuantity, type, flowIndent, blockIndent;
- if (state.listener !== null) {
- state.listener("open", state);
- }
- state.tag = null;
- state.anchor = null;
- state.kind = null;
- state.result = null;
- allowBlockStyles = allowBlockScalars = allowBlockCollections = CONTEXT_BLOCK_OUT === nodeContext || CONTEXT_BLOCK_IN === nodeContext;
- if (allowToSeek) {
- if (skipSeparationSpace(state, true, -1)) {
- atNewLine = true;
- if (state.lineIndent > parentIndent) {
- indentStatus = 1;
- } else if (state.lineIndent === parentIndent) {
- indentStatus = 0;
- } else if (state.lineIndent < parentIndent) {
- indentStatus = -1;
- }
- }
- }
- if (indentStatus === 1) {
- while (readTagProperty(state) || readAnchorProperty(state)) {
- if (skipSeparationSpace(state, true, -1)) {
- atNewLine = true;
- allowBlockCollections = allowBlockStyles;
- if (state.lineIndent > parentIndent) {
- indentStatus = 1;
- } else if (state.lineIndent === parentIndent) {
- indentStatus = 0;
- } else if (state.lineIndent < parentIndent) {
- indentStatus = -1;
- }
- } else {
- allowBlockCollections = false;
- }
- }
- }
- if (allowBlockCollections) {
- allowBlockCollections = atNewLine || allowCompact;
- }
- if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {
- if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {
- flowIndent = parentIndent;
- } else {
- flowIndent = parentIndent + 1;
- }
- blockIndent = state.position - state.lineStart;
- if (indentStatus === 1) {
- if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) {
- hasContent = true;
- } else {
- if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) {
- hasContent = true;
- } else if (readAlias(state)) {
- hasContent = true;
- if (state.tag !== null || state.anchor !== null) {
- throwError(state, "alias node should not have any properties");
- }
- } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {
- hasContent = true;
- if (state.tag === null) {
- state.tag = "?";
- }
- }
- if (state.anchor !== null) {
- state.anchorMap[state.anchor] = state.result;
- }
- }
- } else if (indentStatus === 0) {
- hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);
- }
- }
- if (state.tag !== null && state.tag !== "!") {
- if (state.tag === "?") {
- if (state.result !== null && state.kind !== "scalar") {
- throwError(state, 'unacceptable node kind for !> tag; it should be "scalar", not "' + state.kind + '"');
- }
- for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {
- type = state.implicitTypes[typeIndex];
- if (type.resolve(state.result)) {
- state.result = type.construct(state.result);
- state.tag = type.tag;
- if (state.anchor !== null) {
- state.anchorMap[state.anchor] = state.result;
- }
- break;
- }
- }
- } else if (_hasOwnProperty.call(state.typeMap[state.kind || "fallback"], state.tag)) {
- type = state.typeMap[state.kind || "fallback"][state.tag];
- if (state.result !== null && type.kind !== state.kind) {
- throwError(state, "unacceptable node kind for !<" + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"');
- }
- if (!type.resolve(state.result)) {
- throwError(state, "cannot resolve a node with !<" + state.tag + "> explicit tag");
- } else {
- state.result = type.construct(state.result);
- if (state.anchor !== null) {
- state.anchorMap[state.anchor] = state.result;
- }
- }
- } else {
- throwError(state, "unknown tag !<" + state.tag + ">");
- }
- }
- if (state.listener !== null) {
- state.listener("close", state);
- }
- return state.tag !== null || state.anchor !== null || hasContent;
- }
- function readDocument(state) {
- var documentStart = state.position, _position, directiveName, directiveArgs, hasDirectives = false, ch;
- state.version = null;
- state.checkLineBreaks = state.legacy;
- state.tagMap = {};
- state.anchorMap = {};
- while ((ch = state.input.charCodeAt(state.position)) !== 0) {
- skipSeparationSpace(state, true, -1);
- ch = state.input.charCodeAt(state.position);
- if (state.lineIndent > 0 || ch !== 37) {
- break;
- }
- hasDirectives = true;
- ch = state.input.charCodeAt(++state.position);
- _position = state.position;
- while (ch !== 0 && !is_WS_OR_EOL(ch)) {
- ch = state.input.charCodeAt(++state.position);
- }
- directiveName = state.input.slice(_position, state.position);
- directiveArgs = [];
- if (directiveName.length < 1) {
- throwError(state, "directive name must not be less than one character in length");
- }
- while (ch !== 0) {
- while (is_WHITE_SPACE(ch)) {
- ch = state.input.charCodeAt(++state.position);
- }
- if (ch === 35) {
- do {
- ch = state.input.charCodeAt(++state.position);
- } while (ch !== 0 && !is_EOL(ch));
- break;
- }
- if (is_EOL(ch))
- break;
- _position = state.position;
- while (ch !== 0 && !is_WS_OR_EOL(ch)) {
- ch = state.input.charCodeAt(++state.position);
- }
- directiveArgs.push(state.input.slice(_position, state.position));
- }
- if (ch !== 0)
- readLineBreak(state);
- if (_hasOwnProperty.call(directiveHandlers, directiveName)) {
- directiveHandlers[directiveName](state, directiveName, directiveArgs);
- } else {
- throwWarning(state, 'unknown document directive "' + directiveName + '"');
- }
- }
- skipSeparationSpace(state, true, -1);
- if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 45 && state.input.charCodeAt(state.position + 1) === 45 && state.input.charCodeAt(state.position + 2) === 45) {
- state.position += 3;
- skipSeparationSpace(state, true, -1);
- } else if (hasDirectives) {
- throwError(state, "directives end mark is expected");
- }
- composeNode2(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);
- skipSeparationSpace(state, true, -1);
- if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {
- throwWarning(state, "non-ASCII line breaks are interpreted as content");
- }
- state.documents.push(state.result);
- if (state.position === state.lineStart && testDocumentSeparator(state)) {
- if (state.input.charCodeAt(state.position) === 46) {
- state.position += 3;
- skipSeparationSpace(state, true, -1);
- }
- return;
- }
- if (state.position < state.length - 1) {
- throwError(state, "end of the stream or a document separator is expected");
- } else {
- return;
- }
- }
- function loadDocuments(input, options) {
- input = String(input);
- options = options || {};
- if (input.length !== 0) {
- if (input.charCodeAt(input.length - 1) !== 10 && input.charCodeAt(input.length - 1) !== 13) {
- input += "\n";
- }
- if (input.charCodeAt(0) === 65279) {
- input = input.slice(1);
- }
- }
- var state = new State(input, options);
- var nullpos = input.indexOf("\0");
- if (nullpos !== -1) {
- state.position = nullpos;
- throwError(state, "null byte is not allowed in input");
- }
- state.input += "\0";
- while (state.input.charCodeAt(state.position) === 32) {
- state.lineIndent += 1;
- state.position += 1;
- }
- while (state.position < state.length - 1) {
- readDocument(state);
- }
- return state.documents;
- }
- function loadAll(input, iterator, options) {
- if (iterator !== null && typeof iterator === "object" && typeof options === "undefined") {
- options = iterator;
- iterator = null;
- }
- var documents = loadDocuments(input, options);
- if (typeof iterator !== "function") {
- return documents;
- }
- for (var index = 0, length = documents.length; index < length; index += 1) {
- iterator(documents[index]);
- }
- }
- function load(input, options) {
- var documents = loadDocuments(input, options);
- if (documents.length === 0) {
- return void 0;
- } else if (documents.length === 1) {
- return documents[0];
- }
- throw new YAMLException("expected a single document in the stream, but found more");
- }
- function safeLoadAll(input, iterator, options) {
- if (typeof iterator === "object" && iterator !== null && typeof options === "undefined") {
- options = iterator;
- iterator = null;
- }
- return loadAll(input, iterator, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
- }
- function safeLoad(input, options) {
- return load(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
- }
- module2.exports.loadAll = loadAll;
- module2.exports.load = load;
- module2.exports.safeLoadAll = safeLoadAll;
- module2.exports.safeLoad = safeLoad;
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml/dumper.js
-var require_dumper = __commonJS({
- "node_modules/js-yaml/lib/js-yaml/dumper.js"(exports, module2) {
- "use strict";
- var common = require_common2();
- var YAMLException = require_exception();
- var DEFAULT_FULL_SCHEMA = require_default_full();
- var DEFAULT_SAFE_SCHEMA = require_default_safe();
- var _toString = Object.prototype.toString;
- var _hasOwnProperty = Object.prototype.hasOwnProperty;
- var CHAR_TAB = 9;
- var CHAR_LINE_FEED = 10;
- var CHAR_CARRIAGE_RETURN = 13;
- var CHAR_SPACE = 32;
- var CHAR_EXCLAMATION = 33;
- var CHAR_DOUBLE_QUOTE = 34;
- var CHAR_SHARP = 35;
- var CHAR_PERCENT = 37;
- var CHAR_AMPERSAND = 38;
- var CHAR_SINGLE_QUOTE = 39;
- var CHAR_ASTERISK = 42;
- var CHAR_COMMA = 44;
- var CHAR_MINUS = 45;
- var CHAR_COLON = 58;
- var CHAR_EQUALS = 61;
- var CHAR_GREATER_THAN = 62;
- var CHAR_QUESTION = 63;
- var CHAR_COMMERCIAL_AT = 64;
- var CHAR_LEFT_SQUARE_BRACKET = 91;
- var CHAR_RIGHT_SQUARE_BRACKET = 93;
- var CHAR_GRAVE_ACCENT = 96;
- var CHAR_LEFT_CURLY_BRACKET = 123;
- var CHAR_VERTICAL_LINE = 124;
- var CHAR_RIGHT_CURLY_BRACKET = 125;
- var ESCAPE_SEQUENCES = {};
- ESCAPE_SEQUENCES[0] = "\\0";
- ESCAPE_SEQUENCES[7] = "\\a";
- ESCAPE_SEQUENCES[8] = "\\b";
- ESCAPE_SEQUENCES[9] = "\\t";
- ESCAPE_SEQUENCES[10] = "\\n";
- ESCAPE_SEQUENCES[11] = "\\v";
- ESCAPE_SEQUENCES[12] = "\\f";
- ESCAPE_SEQUENCES[13] = "\\r";
- ESCAPE_SEQUENCES[27] = "\\e";
- ESCAPE_SEQUENCES[34] = '\\"';
- ESCAPE_SEQUENCES[92] = "\\\\";
- ESCAPE_SEQUENCES[133] = "\\N";
- ESCAPE_SEQUENCES[160] = "\\_";
- ESCAPE_SEQUENCES[8232] = "\\L";
- ESCAPE_SEQUENCES[8233] = "\\P";
- var DEPRECATED_BOOLEANS_SYNTAX = [
- "y",
- "Y",
- "yes",
- "Yes",
- "YES",
- "on",
- "On",
- "ON",
- "n",
- "N",
- "no",
- "No",
- "NO",
- "off",
- "Off",
- "OFF"
- ];
- function compileStyleMap(schema4, map2) {
- var result, keys, index, length, tag, style, type;
- if (map2 === null)
- return {};
- result = {};
- keys = Object.keys(map2);
- for (index = 0, length = keys.length; index < length; index += 1) {
- tag = keys[index];
- style = String(map2[tag]);
- if (tag.slice(0, 2) === "!!") {
- tag = "tag:yaml.org,2002:" + tag.slice(2);
- }
- type = schema4.compiledTypeMap["fallback"][tag];
- if (type && _hasOwnProperty.call(type.styleAliases, style)) {
- style = type.styleAliases[style];
- }
- result[tag] = style;
- }
- return result;
- }
- function encodeHex(character) {
- var string2, handle, length;
- string2 = character.toString(16).toUpperCase();
- if (character <= 255) {
- handle = "x";
- length = 2;
- } else if (character <= 65535) {
- handle = "u";
- length = 4;
- } else if (character <= 4294967295) {
- handle = "U";
- length = 8;
- } else {
- throw new YAMLException("code point within a string may not be greater than 0xFFFFFFFF");
- }
- return "\\" + handle + common.repeat("0", length - string2.length) + string2;
- }
- function State(options) {
- this.schema = options["schema"] || DEFAULT_FULL_SCHEMA;
- this.indent = Math.max(1, options["indent"] || 2);
- this.noArrayIndent = options["noArrayIndent"] || false;
- this.skipInvalid = options["skipInvalid"] || false;
- this.flowLevel = common.isNothing(options["flowLevel"]) ? -1 : options["flowLevel"];
- this.styleMap = compileStyleMap(this.schema, options["styles"] || null);
- this.sortKeys = options["sortKeys"] || false;
- this.lineWidth = options["lineWidth"] || 80;
- this.noRefs = options["noRefs"] || false;
- this.noCompatMode = options["noCompatMode"] || false;
- this.condenseFlow = options["condenseFlow"] || false;
- this.implicitTypes = this.schema.compiledImplicit;
- this.explicitTypes = this.schema.compiledExplicit;
- this.tag = null;
- this.result = "";
- this.duplicates = [];
- this.usedDuplicates = null;
- }
- function indentString(string2, spaces) {
- var ind = common.repeat(" ", spaces), position = 0, next = -1, result = "", line, length = string2.length;
- while (position < length) {
- next = string2.indexOf("\n", position);
- if (next === -1) {
- line = string2.slice(position);
- position = length;
- } else {
- line = string2.slice(position, next + 1);
- position = next + 1;
- }
- if (line.length && line !== "\n")
- result += ind;
- result += line;
- }
- return result;
- }
- function generateNextLine(state, level) {
- return "\n" + common.repeat(" ", state.indent * level);
- }
- function testImplicitResolving(state, str) {
- var index, length, type;
- for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {
- type = state.implicitTypes[index];
- if (type.resolve(str)) {
- return true;
- }
- }
- return false;
- }
- function isWhitespace(c) {
- return c === CHAR_SPACE || c === CHAR_TAB;
- }
- function isPrintable(c) {
- return 32 <= c && c <= 126 || 161 <= c && c <= 55295 && c !== 8232 && c !== 8233 || 57344 <= c && c <= 65533 && c !== 65279 || 65536 <= c && c <= 1114111;
- }
- function isNsChar(c) {
- return isPrintable(c) && !isWhitespace(c) && c !== 65279 && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED;
- }
- function isPlainSafe(c, prev) {
- return isPrintable(c) && c !== 65279 && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET && c !== CHAR_COLON && (c !== CHAR_SHARP || prev && isNsChar(prev));
- }
- function isPlainSafeFirst(c) {
- return isPrintable(c) && c !== 65279 && !isWhitespace(c) && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT;
- }
- function needIndentIndicator(string2) {
- var leadingSpaceRe = /^\n* /;
- return leadingSpaceRe.test(string2);
- }
- var STYLE_PLAIN = 1;
- var STYLE_SINGLE = 2;
- var STYLE_LITERAL = 3;
- var STYLE_FOLDED = 4;
- var STYLE_DOUBLE = 5;
- function chooseScalarStyle(string2, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) {
- var i;
- var char, prev_char;
- var hasLineBreak = false;
- var hasFoldableLine = false;
- var shouldTrackWidth = lineWidth !== -1;
- var previousLineBreak = -1;
- var plain = isPlainSafeFirst(string2.charCodeAt(0)) && !isWhitespace(string2.charCodeAt(string2.length - 1));
- if (singleLineOnly) {
- for (i = 0; i < string2.length; i++) {
- char = string2.charCodeAt(i);
- if (!isPrintable(char)) {
- return STYLE_DOUBLE;
- }
- prev_char = i > 0 ? string2.charCodeAt(i - 1) : null;
- plain = plain && isPlainSafe(char, prev_char);
- }
- } else {
- for (i = 0; i < string2.length; i++) {
- char = string2.charCodeAt(i);
- if (char === CHAR_LINE_FEED) {
- hasLineBreak = true;
- if (shouldTrackWidth) {
- hasFoldableLine = hasFoldableLine || i - previousLineBreak - 1 > lineWidth && string2[previousLineBreak + 1] !== " ";
- previousLineBreak = i;
- }
- } else if (!isPrintable(char)) {
- return STYLE_DOUBLE;
- }
- prev_char = i > 0 ? string2.charCodeAt(i - 1) : null;
- plain = plain && isPlainSafe(char, prev_char);
- }
- hasFoldableLine = hasFoldableLine || shouldTrackWidth && (i - previousLineBreak - 1 > lineWidth && string2[previousLineBreak + 1] !== " ");
- }
- if (!hasLineBreak && !hasFoldableLine) {
- return plain && !testAmbiguousType(string2) ? STYLE_PLAIN : STYLE_SINGLE;
- }
- if (indentPerLevel > 9 && needIndentIndicator(string2)) {
- return STYLE_DOUBLE;
- }
- return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;
- }
- function writeScalar(state, string2, level, iskey) {
- state.dump = function() {
- if (string2.length === 0) {
- return "''";
- }
- if (!state.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string2) !== -1) {
- return "'" + string2 + "'";
- }
- var indent = state.indent * Math.max(1, level);
- var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);
- var singleLineOnly = iskey || state.flowLevel > -1 && level >= state.flowLevel;
- function testAmbiguity(string3) {
- return testImplicitResolving(state, string3);
- }
- switch (chooseScalarStyle(string2, singleLineOnly, state.indent, lineWidth, testAmbiguity)) {
- case STYLE_PLAIN:
- return string2;
- case STYLE_SINGLE:
- return "'" + string2.replace(/'/g, "''") + "'";
- case STYLE_LITERAL:
- return "|" + blockHeader(string2, state.indent) + dropEndingNewline(indentString(string2, indent));
- case STYLE_FOLDED:
- return ">" + blockHeader(string2, state.indent) + dropEndingNewline(indentString(foldString(string2, lineWidth), indent));
- case STYLE_DOUBLE:
- return '"' + escapeString(string2, lineWidth) + '"';
- default:
- throw new YAMLException("impossible error: invalid scalar style");
- }
- }();
- }
- function blockHeader(string2, indentPerLevel) {
- var indentIndicator = needIndentIndicator(string2) ? String(indentPerLevel) : "";
- var clip = string2[string2.length - 1] === "\n";
- var keep = clip && (string2[string2.length - 2] === "\n" || string2 === "\n");
- var chomp = keep ? "+" : clip ? "" : "-";
- return indentIndicator + chomp + "\n";
- }
- function dropEndingNewline(string2) {
- return string2[string2.length - 1] === "\n" ? string2.slice(0, -1) : string2;
- }
- function foldString(string2, width) {
- var lineRe = /(\n+)([^\n]*)/g;
- var result = function() {
- var nextLF = string2.indexOf("\n");
- nextLF = nextLF !== -1 ? nextLF : string2.length;
- lineRe.lastIndex = nextLF;
- return foldLine(string2.slice(0, nextLF), width);
- }();
- var prevMoreIndented = string2[0] === "\n" || string2[0] === " ";
- var moreIndented;
- var match;
- while (match = lineRe.exec(string2)) {
- var prefix = match[1], line = match[2];
- moreIndented = line[0] === " ";
- result += prefix + (!prevMoreIndented && !moreIndented && line !== "" ? "\n" : "") + foldLine(line, width);
- prevMoreIndented = moreIndented;
- }
- return result;
- }
- function foldLine(line, width) {
- if (line === "" || line[0] === " ")
- return line;
- var breakRe = / [^ ]/g;
- var match;
- var start = 0, end, curr = 0, next = 0;
- var result = "";
- while (match = breakRe.exec(line)) {
- next = match.index;
- if (next - start > width) {
- end = curr > start ? curr : next;
- result += "\n" + line.slice(start, end);
- start = end + 1;
- }
- curr = next;
- }
- result += "\n";
- if (line.length - start > width && curr > start) {
- result += line.slice(start, curr) + "\n" + line.slice(curr + 1);
- } else {
- result += line.slice(start);
- }
- return result.slice(1);
- }
- function escapeString(string2) {
- var result = "";
- var char, nextChar;
- var escapeSeq;
- for (var i = 0; i < string2.length; i++) {
- char = string2.charCodeAt(i);
- if (char >= 55296 && char <= 56319) {
- nextChar = string2.charCodeAt(i + 1);
- if (nextChar >= 56320 && nextChar <= 57343) {
- result += encodeHex((char - 55296) * 1024 + nextChar - 56320 + 65536);
- i++;
- continue;
- }
- }
- escapeSeq = ESCAPE_SEQUENCES[char];
- result += !escapeSeq && isPrintable(char) ? string2[i] : escapeSeq || encodeHex(char);
- }
- return result;
- }
- function writeFlowSequence(state, level, object) {
- var _result = "", _tag = state.tag, index, length;
- for (index = 0, length = object.length; index < length; index += 1) {
- if (writeNode(state, level, object[index], false, false)) {
- if (index !== 0)
- _result += "," + (!state.condenseFlow ? " " : "");
- _result += state.dump;
- }
- }
- state.tag = _tag;
- state.dump = "[" + _result + "]";
- }
- function writeBlockSequence(state, level, object, compact) {
- var _result = "", _tag = state.tag, index, length;
- for (index = 0, length = object.length; index < length; index += 1) {
- if (writeNode(state, level + 1, object[index], true, true)) {
- if (!compact || index !== 0) {
- _result += generateNextLine(state, level);
- }
- if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
- _result += "-";
- } else {
- _result += "- ";
- }
- _result += state.dump;
- }
- }
- state.tag = _tag;
- state.dump = _result || "[]";
- }
- function writeFlowMapping(state, level, object) {
- var _result = "", _tag = state.tag, objectKeyList = Object.keys(object), index, length, objectKey, objectValue, pairBuffer;
- for (index = 0, length = objectKeyList.length; index < length; index += 1) {
- pairBuffer = "";
- if (index !== 0)
- pairBuffer += ", ";
- if (state.condenseFlow)
- pairBuffer += '"';
- objectKey = objectKeyList[index];
- objectValue = object[objectKey];
- if (!writeNode(state, level, objectKey, false, false)) {
- continue;
- }
- if (state.dump.length > 1024)
- pairBuffer += "? ";
- pairBuffer += state.dump + (state.condenseFlow ? '"' : "") + ":" + (state.condenseFlow ? "" : " ");
- if (!writeNode(state, level, objectValue, false, false)) {
- continue;
- }
- pairBuffer += state.dump;
- _result += pairBuffer;
- }
- state.tag = _tag;
- state.dump = "{" + _result + "}";
- }
- function writeBlockMapping(state, level, object, compact) {
- var _result = "", _tag = state.tag, objectKeyList = Object.keys(object), index, length, objectKey, objectValue, explicitPair, pairBuffer;
- if (state.sortKeys === true) {
- objectKeyList.sort();
- } else if (typeof state.sortKeys === "function") {
- objectKeyList.sort(state.sortKeys);
- } else if (state.sortKeys) {
- throw new YAMLException("sortKeys must be a boolean or a function");
- }
- for (index = 0, length = objectKeyList.length; index < length; index += 1) {
- pairBuffer = "";
- if (!compact || index !== 0) {
- pairBuffer += generateNextLine(state, level);
- }
- objectKey = objectKeyList[index];
- objectValue = object[objectKey];
- if (!writeNode(state, level + 1, objectKey, true, true, true)) {
- continue;
- }
- explicitPair = state.tag !== null && state.tag !== "?" || state.dump && state.dump.length > 1024;
- if (explicitPair) {
- if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
- pairBuffer += "?";
- } else {
- pairBuffer += "? ";
- }
- }
- pairBuffer += state.dump;
- if (explicitPair) {
- pairBuffer += generateNextLine(state, level);
- }
- if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {
- continue;
- }
- if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
- pairBuffer += ":";
- } else {
- pairBuffer += ": ";
- }
- pairBuffer += state.dump;
- _result += pairBuffer;
- }
- state.tag = _tag;
- state.dump = _result || "{}";
- }
- function detectType(state, object, explicit) {
- var _result, typeList, index, length, type, style;
- typeList = explicit ? state.explicitTypes : state.implicitTypes;
- for (index = 0, length = typeList.length; index < length; index += 1) {
- type = typeList[index];
- if ((type.instanceOf || type.predicate) && (!type.instanceOf || typeof object === "object" && object instanceof type.instanceOf) && (!type.predicate || type.predicate(object))) {
- state.tag = explicit ? type.tag : "?";
- if (type.represent) {
- style = state.styleMap[type.tag] || type.defaultStyle;
- if (_toString.call(type.represent) === "[object Function]") {
- _result = type.represent(object, style);
- } else if (_hasOwnProperty.call(type.represent, style)) {
- _result = type.represent[style](object, style);
- } else {
- throw new YAMLException("!<" + type.tag + '> tag resolver accepts not "' + style + '" style');
- }
- state.dump = _result;
- }
- return true;
- }
- }
- return false;
- }
- function writeNode(state, level, object, block, compact, iskey) {
- state.tag = null;
- state.dump = object;
- if (!detectType(state, object, false)) {
- detectType(state, object, true);
- }
- var type = _toString.call(state.dump);
- if (block) {
- block = state.flowLevel < 0 || state.flowLevel > level;
- }
- var objectOrArray = type === "[object Object]" || type === "[object Array]", duplicateIndex, duplicate;
- if (objectOrArray) {
- duplicateIndex = state.duplicates.indexOf(object);
- duplicate = duplicateIndex !== -1;
- }
- if (state.tag !== null && state.tag !== "?" || duplicate || state.indent !== 2 && level > 0) {
- compact = false;
- }
- if (duplicate && state.usedDuplicates[duplicateIndex]) {
- state.dump = "*ref_" + duplicateIndex;
- } else {
- if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {
- state.usedDuplicates[duplicateIndex] = true;
- }
- if (type === "[object Object]") {
- if (block && Object.keys(state.dump).length !== 0) {
- writeBlockMapping(state, level, state.dump, compact);
- if (duplicate) {
- state.dump = "&ref_" + duplicateIndex + state.dump;
- }
- } else {
- writeFlowMapping(state, level, state.dump);
- if (duplicate) {
- state.dump = "&ref_" + duplicateIndex + " " + state.dump;
- }
- }
- } else if (type === "[object Array]") {
- var arrayLevel = state.noArrayIndent && level > 0 ? level - 1 : level;
- if (block && state.dump.length !== 0) {
- writeBlockSequence(state, arrayLevel, state.dump, compact);
- if (duplicate) {
- state.dump = "&ref_" + duplicateIndex + state.dump;
- }
- } else {
- writeFlowSequence(state, arrayLevel, state.dump);
- if (duplicate) {
- state.dump = "&ref_" + duplicateIndex + " " + state.dump;
- }
- }
- } else if (type === "[object String]") {
- if (state.tag !== "?") {
- writeScalar(state, state.dump, level, iskey);
- }
- } else {
- if (state.skipInvalid)
- return false;
- throw new YAMLException("unacceptable kind of an object to dump " + type);
- }
- if (state.tag !== null && state.tag !== "?") {
- state.dump = "!<" + state.tag + "> " + state.dump;
- }
- }
- return true;
- }
- function getDuplicateReferences(object, state) {
- var objects = [], duplicatesIndexes = [], index, length;
- inspectNode(object, objects, duplicatesIndexes);
- for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {
- state.duplicates.push(objects[duplicatesIndexes[index]]);
- }
- state.usedDuplicates = new Array(length);
- }
- function inspectNode(object, objects, duplicatesIndexes) {
- var objectKeyList, index, length;
- if (object !== null && typeof object === "object") {
- index = objects.indexOf(object);
- if (index !== -1) {
- if (duplicatesIndexes.indexOf(index) === -1) {
- duplicatesIndexes.push(index);
- }
- } else {
- objects.push(object);
- if (Array.isArray(object)) {
- for (index = 0, length = object.length; index < length; index += 1) {
- inspectNode(object[index], objects, duplicatesIndexes);
- }
- } else {
- objectKeyList = Object.keys(object);
- for (index = 0, length = objectKeyList.length; index < length; index += 1) {
- inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);
- }
- }
- }
- }
- }
- function dump(input, options) {
- options = options || {};
- var state = new State(options);
- if (!state.noRefs)
- getDuplicateReferences(input, state);
- if (writeNode(state, 0, input, true, true))
- return state.dump + "\n";
- return "";
- }
- function safeDump(input, options) {
- return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
- }
- module2.exports.dump = dump;
- module2.exports.safeDump = safeDump;
- }
-});
-
-// node_modules/js-yaml/lib/js-yaml.js
-var require_js_yaml = __commonJS({
- "node_modules/js-yaml/lib/js-yaml.js"(exports, module2) {
- "use strict";
- var loader = require_loader();
- var dumper = require_dumper();
- function deprecated(name) {
- return function() {
- throw new Error("Function " + name + " is deprecated and cannot be used.");
- };
- }
- module2.exports.Type = require_type();
- module2.exports.Schema = require_schema();
- module2.exports.FAILSAFE_SCHEMA = require_failsafe();
- module2.exports.JSON_SCHEMA = require_json();
- module2.exports.CORE_SCHEMA = require_core2();
- module2.exports.DEFAULT_SAFE_SCHEMA = require_default_safe();
- module2.exports.DEFAULT_FULL_SCHEMA = require_default_full();
- module2.exports.load = loader.load;
- module2.exports.loadAll = loader.loadAll;
- module2.exports.safeLoad = loader.safeLoad;
- module2.exports.safeLoadAll = loader.safeLoadAll;
- module2.exports.dump = dumper.dump;
- module2.exports.safeDump = dumper.safeDump;
- module2.exports.YAMLException = require_exception();
- module2.exports.MINIMAL_SCHEMA = require_failsafe();
- module2.exports.SAFE_SCHEMA = require_default_safe();
- module2.exports.DEFAULT_SCHEMA = require_default_full();
- module2.exports.scan = deprecated("scan");
- module2.exports.parse = deprecated("parse");
- module2.exports.compose = deprecated("compose");
- module2.exports.addConstructor = deprecated("addConstructor");
- }
-});
-
-// node_modules/js-yaml/index.js
-var require_js_yaml2 = __commonJS({
- "node_modules/js-yaml/index.js"(exports, module2) {
- "use strict";
- var yaml2 = require_js_yaml();
- module2.exports = yaml2;
- }
-});
-
-// main.ts
-__export(exports, {
- default: () => MyPlugin
-});
-var import_obsidian3 = __toModule(require("obsidian"));
-var import_path = __toModule(require("path"));
-var fs2 = __toModule(require("fs"));
-
-// icon.ts
-var import_obsidian = __toModule(require("obsidian"));
-var icons = {
- "notion-logo": `
-
- `
-};
-var addIcons = () => {
- Object.keys(icons).forEach((key) => {
- (0, import_obsidian.addIcon)(key, icons[key]);
- });
-};
-
-// Upload2Notion.ts
-var import_obsidian2 = __toModule(require("obsidian"));
-var import_martian = __toModule(require_src());
-var fs = __toModule(require("fs"));
-
-// node_modules/yaml-front-matter/src/index.js
-var jsYaml = require_js_yaml2();
-function parse(text, options, loadSafe) {
- let contentKeyName = options && typeof options === "string" ? options : options && options.contentKeyName ? options.contentKeyName : "__content";
- let passThroughOptions = options && typeof options === "object" ? options : void 0;
- let re = /^(-{3}(?:\n|\r)([\w\W]+?)(?:\n|\r)-{3})?([\w\W]*)*/, results = re.exec(text), conf = {}, yamlOrJson;
- if (yamlOrJson = results[2]) {
- if (yamlOrJson.charAt(0) === "{") {
- conf = JSON.parse(yamlOrJson);
- } else {
- if (loadSafe) {
- conf = jsYaml.safeLoad(yamlOrJson, passThroughOptions);
- } else {
- conf = jsYaml.load(yamlOrJson, passThroughOptions);
- }
- }
- }
- conf[contentKeyName] = results[3] || "";
- return conf;
-}
-function loadFront(content, options) {
- return parse(content, options, false);
-}
-
-// node_modules/yaml/browser/dist/nodes/Node.js
-var ALIAS = Symbol.for("yaml.alias");
-var DOC = Symbol.for("yaml.document");
-var MAP = Symbol.for("yaml.map");
-var PAIR = Symbol.for("yaml.pair");
-var SCALAR = Symbol.for("yaml.scalar");
-var SEQ = Symbol.for("yaml.seq");
-var NODE_TYPE = Symbol.for("yaml.node.type");
-var isAlias = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === ALIAS;
-var isDocument = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === DOC;
-var isMap = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === MAP;
-var isPair = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === PAIR;
-var isScalar = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === SCALAR;
-var isSeq = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === SEQ;
-function isCollection(node) {
- if (node && typeof node === "object")
- switch (node[NODE_TYPE]) {
- case MAP:
- case SEQ:
- return true;
- }
- return false;
-}
-function isNode(node) {
- if (node && typeof node === "object")
- switch (node[NODE_TYPE]) {
- case ALIAS:
- case MAP:
- case SCALAR:
- case SEQ:
- return true;
- }
- return false;
-}
-var hasAnchor = (node) => (isScalar(node) || isCollection(node)) && !!node.anchor;
-var NodeBase = class {
- constructor(type) {
- Object.defineProperty(this, NODE_TYPE, { value: type });
- }
- clone() {
- const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this));
- if (this.range)
- copy.range = this.range.slice();
- return copy;
- }
-};
-
-// node_modules/yaml/browser/dist/visit.js
-var BREAK = Symbol("break visit");
-var SKIP = Symbol("skip children");
-var REMOVE = Symbol("remove node");
-function visit(node, visitor) {
- const visitor_ = initVisitor(visitor);
- if (isDocument(node)) {
- const cd = visit_(null, node.contents, visitor_, Object.freeze([node]));
- if (cd === REMOVE)
- node.contents = null;
- } else
- visit_(null, node, visitor_, Object.freeze([]));
-}
-visit.BREAK = BREAK;
-visit.SKIP = SKIP;
-visit.REMOVE = REMOVE;
-function visit_(key, node, visitor, path) {
- const ctrl = callVisitor(key, node, visitor, path);
- if (isNode(ctrl) || isPair(ctrl)) {
- replaceNode(key, path, ctrl);
- return visit_(key, ctrl, visitor, path);
- }
- if (typeof ctrl !== "symbol") {
- if (isCollection(node)) {
- path = Object.freeze(path.concat(node));
- for (let i = 0; i < node.items.length; ++i) {
- const ci = visit_(i, node.items[i], visitor, path);
- if (typeof ci === "number")
- i = ci - 1;
- else if (ci === BREAK)
- return BREAK;
- else if (ci === REMOVE) {
- node.items.splice(i, 1);
- i -= 1;
- }
- }
- } else if (isPair(node)) {
- path = Object.freeze(path.concat(node));
- const ck = visit_("key", node.key, visitor, path);
- if (ck === BREAK)
- return BREAK;
- else if (ck === REMOVE)
- node.key = null;
- const cv = visit_("value", node.value, visitor, path);
- if (cv === BREAK)
- return BREAK;
- else if (cv === REMOVE)
- node.value = null;
- }
- }
- return ctrl;
-}
-function visitAsync(node, visitor) {
- return __async(this, null, function* () {
- const visitor_ = initVisitor(visitor);
- if (isDocument(node)) {
- const cd = yield visitAsync_(null, node.contents, visitor_, Object.freeze([node]));
- if (cd === REMOVE)
- node.contents = null;
- } else
- yield visitAsync_(null, node, visitor_, Object.freeze([]));
- });
-}
-visitAsync.BREAK = BREAK;
-visitAsync.SKIP = SKIP;
-visitAsync.REMOVE = REMOVE;
-function visitAsync_(key, node, visitor, path) {
- return __async(this, null, function* () {
- const ctrl = yield callVisitor(key, node, visitor, path);
- if (isNode(ctrl) || isPair(ctrl)) {
- replaceNode(key, path, ctrl);
- return visitAsync_(key, ctrl, visitor, path);
- }
- if (typeof ctrl !== "symbol") {
- if (isCollection(node)) {
- path = Object.freeze(path.concat(node));
- for (let i = 0; i < node.items.length; ++i) {
- const ci = yield visitAsync_(i, node.items[i], visitor, path);
- if (typeof ci === "number")
- i = ci - 1;
- else if (ci === BREAK)
- return BREAK;
- else if (ci === REMOVE) {
- node.items.splice(i, 1);
- i -= 1;
- }
- }
- } else if (isPair(node)) {
- path = Object.freeze(path.concat(node));
- const ck = yield visitAsync_("key", node.key, visitor, path);
- if (ck === BREAK)
- return BREAK;
- else if (ck === REMOVE)
- node.key = null;
- const cv = yield visitAsync_("value", node.value, visitor, path);
- if (cv === BREAK)
- return BREAK;
- else if (cv === REMOVE)
- node.value = null;
- }
- }
- return ctrl;
- });
-}
-function initVisitor(visitor) {
- if (typeof visitor === "object" && (visitor.Collection || visitor.Node || visitor.Value)) {
- return Object.assign({
- Alias: visitor.Node,
- Map: visitor.Node,
- Scalar: visitor.Node,
- Seq: visitor.Node
- }, visitor.Value && {
- Map: visitor.Value,
- Scalar: visitor.Value,
- Seq: visitor.Value
- }, visitor.Collection && {
- Map: visitor.Collection,
- Seq: visitor.Collection
- }, visitor);
- }
- return visitor;
-}
-function callVisitor(key, node, visitor, path) {
- var _a, _b, _c, _d, _e;
- if (typeof visitor === "function")
- return visitor(key, node, path);
- if (isMap(node))
- return (_a = visitor.Map) == null ? void 0 : _a.call(visitor, key, node, path);
- if (isSeq(node))
- return (_b = visitor.Seq) == null ? void 0 : _b.call(visitor, key, node, path);
- if (isPair(node))
- return (_c = visitor.Pair) == null ? void 0 : _c.call(visitor, key, node, path);
- if (isScalar(node))
- return (_d = visitor.Scalar) == null ? void 0 : _d.call(visitor, key, node, path);
- if (isAlias(node))
- return (_e = visitor.Alias) == null ? void 0 : _e.call(visitor, key, node, path);
- return void 0;
-}
-function replaceNode(key, path, node) {
- const parent = path[path.length - 1];
- if (isCollection(parent)) {
- parent.items[key] = node;
- } else if (isPair(parent)) {
- if (key === "key")
- parent.key = node;
- else
- parent.value = node;
- } else if (isDocument(parent)) {
- parent.contents = node;
- } else {
- const pt = isAlias(parent) ? "alias" : "scalar";
- throw new Error(`Cannot replace node with ${pt} parent`);
- }
-}
-
-// node_modules/yaml/browser/dist/doc/directives.js
-var escapeChars = {
- "!": "%21",
- ",": "%2C",
- "[": "%5B",
- "]": "%5D",
- "{": "%7B",
- "}": "%7D"
-};
-var escapeTagName = (tn) => tn.replace(/[!,[\]{}]/g, (ch) => escapeChars[ch]);
-var Directives = class {
- constructor(yaml2, tags) {
- this.docStart = null;
- this.docEnd = false;
- this.yaml = Object.assign({}, Directives.defaultYaml, yaml2);
- this.tags = Object.assign({}, Directives.defaultTags, tags);
- }
- clone() {
- const copy = new Directives(this.yaml, this.tags);
- copy.docStart = this.docStart;
- return copy;
- }
- atDocument() {
- const res = new Directives(this.yaml, this.tags);
- switch (this.yaml.version) {
- case "1.1":
- this.atNextDocument = true;
- break;
- case "1.2":
- this.atNextDocument = false;
- this.yaml = {
- explicit: Directives.defaultYaml.explicit,
- version: "1.2"
- };
- this.tags = Object.assign({}, Directives.defaultTags);
- break;
- }
- return res;
- }
- add(line, onError) {
- if (this.atNextDocument) {
- this.yaml = { explicit: Directives.defaultYaml.explicit, version: "1.1" };
- this.tags = Object.assign({}, Directives.defaultTags);
- this.atNextDocument = false;
- }
- const parts = line.trim().split(/[ \t]+/);
- const name = parts.shift();
- switch (name) {
- case "%TAG": {
- if (parts.length !== 2) {
- onError(0, "%TAG directive should contain exactly two parts");
- if (parts.length < 2)
- return false;
- }
- const [handle, prefix] = parts;
- this.tags[handle] = prefix;
- return true;
- }
- case "%YAML": {
- this.yaml.explicit = true;
- if (parts.length !== 1) {
- onError(0, "%YAML directive should contain exactly one part");
- return false;
- }
- const [version] = parts;
- if (version === "1.1" || version === "1.2") {
- this.yaml.version = version;
- return true;
- } else {
- const isValid = /^\d+\.\d+$/.test(version);
- onError(6, `Unsupported YAML version ${version}`, isValid);
- return false;
- }
- }
- default:
- onError(0, `Unknown directive ${name}`, true);
- return false;
- }
- }
- tagName(source, onError) {
- if (source === "!")
- return "!";
- if (source[0] !== "!") {
- onError(`Not a valid tag: ${source}`);
- return null;
- }
- if (source[1] === "<") {
- const verbatim = source.slice(2, -1);
- if (verbatim === "!" || verbatim === "!!") {
- onError(`Verbatim tags aren't resolved, so ${source} is invalid.`);
- return null;
- }
- if (source[source.length - 1] !== ">")
- onError("Verbatim tags must end with a >");
- return verbatim;
- }
- const [, handle, suffix] = source.match(/^(.*!)([^!]*)$/);
- if (!suffix)
- onError(`The ${source} tag has no suffix`);
- const prefix = this.tags[handle];
- if (prefix)
- return prefix + decodeURIComponent(suffix);
- if (handle === "!")
- return source;
- onError(`Could not resolve tag: ${source}`);
- return null;
- }
- tagString(tag) {
- for (const [handle, prefix] of Object.entries(this.tags)) {
- if (tag.startsWith(prefix))
- return handle + escapeTagName(tag.substring(prefix.length));
- }
- return tag[0] === "!" ? tag : `!<${tag}>`;
- }
- toString(doc) {
- const lines = this.yaml.explicit ? [`%YAML ${this.yaml.version || "1.2"}`] : [];
- const tagEntries = Object.entries(this.tags);
- let tagNames;
- if (doc && tagEntries.length > 0 && isNode(doc.contents)) {
- const tags = {};
- visit(doc.contents, (_key, node) => {
- if (isNode(node) && node.tag)
- tags[node.tag] = true;
- });
- tagNames = Object.keys(tags);
- } else
- tagNames = [];
- for (const [handle, prefix] of tagEntries) {
- if (handle === "!!" && prefix === "tag:yaml.org,2002:")
- continue;
- if (!doc || tagNames.some((tn) => tn.startsWith(prefix)))
- lines.push(`%TAG ${handle} ${prefix}`);
- }
- return lines.join("\n");
- }
-};
-Directives.defaultYaml = { explicit: false, version: "1.2" };
-Directives.defaultTags = { "!!": "tag:yaml.org,2002:" };
-
-// node_modules/yaml/browser/dist/doc/anchors.js
-function anchorIsValid(anchor) {
- if (/[\x00-\x19\s,[\]{}]/.test(anchor)) {
- const sa = JSON.stringify(anchor);
- const msg = `Anchor must not contain whitespace or control characters: ${sa}`;
- throw new Error(msg);
- }
- return true;
-}
-function anchorNames(root) {
- const anchors = new Set();
- visit(root, {
- Value(_key, node) {
- if (node.anchor)
- anchors.add(node.anchor);
- }
- });
- return anchors;
-}
-function findNewAnchor(prefix, exclude) {
- for (let i = 1; true; ++i) {
- const name = `${prefix}${i}`;
- if (!exclude.has(name))
- return name;
- }
-}
-function createNodeAnchors(doc, prefix) {
- const aliasObjects = [];
- const sourceObjects = new Map();
- let prevAnchors = null;
- return {
- onAnchor: (source) => {
- aliasObjects.push(source);
- if (!prevAnchors)
- prevAnchors = anchorNames(doc);
- const anchor = findNewAnchor(prefix, prevAnchors);
- prevAnchors.add(anchor);
- return anchor;
- },
- setAnchors: () => {
- for (const source of aliasObjects) {
- const ref = sourceObjects.get(source);
- if (typeof ref === "object" && ref.anchor && (isScalar(ref.node) || isCollection(ref.node))) {
- ref.node.anchor = ref.anchor;
- } else {
- const error = new Error("Failed to resolve repeated object (this should not happen)");
- error.source = source;
- throw error;
- }
- }
- },
- sourceObjects
- };
-}
-
-// node_modules/yaml/browser/dist/nodes/Alias.js
-var Alias = class extends NodeBase {
- constructor(source) {
- super(ALIAS);
- this.source = source;
- Object.defineProperty(this, "tag", {
- set() {
- throw new Error("Alias nodes cannot have tags");
- }
- });
- }
- resolve(doc) {
- let found = void 0;
- visit(doc, {
- Node: (_key, node) => {
- if (node === this)
- return visit.BREAK;
- if (node.anchor === this.source)
- found = node;
- }
- });
- return found;
- }
- toJSON(_arg, ctx) {
- if (!ctx)
- return { source: this.source };
- const { anchors, doc, maxAliasCount } = ctx;
- const source = this.resolve(doc);
- if (!source) {
- const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`;
- throw new ReferenceError(msg);
- }
- const data = anchors.get(source);
- if (!data || data.res === void 0) {
- const msg = "This should not happen: Alias anchor was not resolved?";
- throw new ReferenceError(msg);
- }
- if (maxAliasCount >= 0) {
- data.count += 1;
- if (data.aliasCount === 0)
- data.aliasCount = getAliasCount(doc, source, anchors);
- if (data.count * data.aliasCount > maxAliasCount) {
- const msg = "Excessive alias count indicates a resource exhaustion attack";
- throw new ReferenceError(msg);
- }
- }
- return data.res;
- }
- toString(ctx, _onComment, _onChompKeep) {
- const src = `*${this.source}`;
- if (ctx) {
- anchorIsValid(this.source);
- if (ctx.options.verifyAliasOrder && !ctx.anchors.has(this.source)) {
- const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`;
- throw new Error(msg);
- }
- if (ctx.implicitKey)
- return `${src} `;
- }
- return src;
- }
-};
-function getAliasCount(doc, node, anchors) {
- if (isAlias(node)) {
- const source = node.resolve(doc);
- const anchor = anchors && source && anchors.get(source);
- return anchor ? anchor.count * anchor.aliasCount : 0;
- } else if (isCollection(node)) {
- let count = 0;
- for (const item of node.items) {
- const c = getAliasCount(doc, item, anchors);
- if (c > count)
- count = c;
- }
- return count;
- } else if (isPair(node)) {
- const kc = getAliasCount(doc, node.key, anchors);
- const vc = getAliasCount(doc, node.value, anchors);
- return Math.max(kc, vc);
- }
- return 1;
-}
-
-// node_modules/yaml/browser/dist/nodes/toJS.js
-function toJS(value, arg, ctx) {
- if (Array.isArray(value))
- return value.map((v, i) => toJS(v, String(i), ctx));
- if (value && typeof value.toJSON === "function") {
- if (!ctx || !hasAnchor(value))
- return value.toJSON(arg, ctx);
- const data = { aliasCount: 0, count: 1, res: void 0 };
- ctx.anchors.set(value, data);
- ctx.onCreate = (res2) => {
- data.res = res2;
- delete ctx.onCreate;
- };
- const res = value.toJSON(arg, ctx);
- if (ctx.onCreate)
- ctx.onCreate(res);
- return res;
- }
- if (typeof value === "bigint" && !(ctx == null ? void 0 : ctx.keep))
- return Number(value);
- return value;
-}
-
-// node_modules/yaml/browser/dist/nodes/Scalar.js
-var isScalarValue = (value) => !value || typeof value !== "function" && typeof value !== "object";
-var Scalar = class extends NodeBase {
- constructor(value) {
- super(SCALAR);
- this.value = value;
- }
- toJSON(arg, ctx) {
- return (ctx == null ? void 0 : ctx.keep) ? this.value : toJS(this.value, arg, ctx);
- }
- toString() {
- return String(this.value);
- }
-};
-Scalar.BLOCK_FOLDED = "BLOCK_FOLDED";
-Scalar.BLOCK_LITERAL = "BLOCK_LITERAL";
-Scalar.PLAIN = "PLAIN";
-Scalar.QUOTE_DOUBLE = "QUOTE_DOUBLE";
-Scalar.QUOTE_SINGLE = "QUOTE_SINGLE";
-
-// node_modules/yaml/browser/dist/doc/createNode.js
-var defaultTagPrefix = "tag:yaml.org,2002:";
-function findTagObject(value, tagName, tags) {
- var _a;
- if (tagName) {
- const match = tags.filter((t) => t.tag === tagName);
- const tagObj = (_a = match.find((t) => !t.format)) != null ? _a : match[0];
- if (!tagObj)
- throw new Error(`Tag ${tagName} not found`);
- return tagObj;
- }
- return tags.find((t) => {
- var _a2;
- return ((_a2 = t.identify) == null ? void 0 : _a2.call(t, value)) && !t.format;
- });
-}
-function createNode(value, tagName, ctx) {
- var _a, _b;
- if (isDocument(value))
- value = value.contents;
- if (isNode(value))
- return value;
- if (isPair(value)) {
- const map2 = (_b = (_a = ctx.schema[MAP]).createNode) == null ? void 0 : _b.call(_a, ctx.schema, null, ctx);
- map2.items.push(value);
- return map2;
- }
- if (value instanceof String || value instanceof Number || value instanceof Boolean || typeof BigInt === "function" && value instanceof BigInt) {
- value = value.valueOf();
- }
- const { aliasDuplicateObjects, onAnchor, onTagObj, schema: schema4, sourceObjects } = ctx;
- let ref = void 0;
- if (aliasDuplicateObjects && value && typeof value === "object") {
- ref = sourceObjects.get(value);
- if (ref) {
- if (!ref.anchor)
- ref.anchor = onAnchor(value);
- return new Alias(ref.anchor);
- } else {
- ref = { anchor: null, node: null };
- sourceObjects.set(value, ref);
- }
- }
- if (tagName == null ? void 0 : tagName.startsWith("!!"))
- tagName = defaultTagPrefix + tagName.slice(2);
- let tagObj = findTagObject(value, tagName, schema4.tags);
- if (!tagObj) {
- if (value && typeof value.toJSON === "function") {
- value = value.toJSON();
- }
- if (!value || typeof value !== "object") {
- const node2 = new Scalar(value);
- if (ref)
- ref.node = node2;
- return node2;
- }
- tagObj = value instanceof Map ? schema4[MAP] : Symbol.iterator in Object(value) ? schema4[SEQ] : schema4[MAP];
- }
- if (onTagObj) {
- onTagObj(tagObj);
- delete ctx.onTagObj;
- }
- const node = (tagObj == null ? void 0 : tagObj.createNode) ? tagObj.createNode(ctx.schema, value, ctx) : new Scalar(value);
- if (tagName)
- node.tag = tagName;
- if (ref)
- ref.node = node;
- return node;
-}
-
-// node_modules/yaml/browser/dist/nodes/Collection.js
-function collectionFromPath(schema4, path, value) {
- let v = value;
- for (let i = path.length - 1; i >= 0; --i) {
- const k = path[i];
- if (typeof k === "number" && Number.isInteger(k) && k >= 0) {
- const a = [];
- a[k] = v;
- v = a;
- } else {
- v = new Map([[k, v]]);
- }
- }
- return createNode(v, void 0, {
- aliasDuplicateObjects: false,
- keepUndefined: false,
- onAnchor: () => {
- throw new Error("This should not happen, please report a bug.");
- },
- schema: schema4,
- sourceObjects: new Map()
- });
-}
-var isEmptyPath = (path) => path == null || typeof path === "object" && !!path[Symbol.iterator]().next().done;
-var Collection = class extends NodeBase {
- constructor(type, schema4) {
- super(type);
- Object.defineProperty(this, "schema", {
- value: schema4,
- configurable: true,
- enumerable: false,
- writable: true
- });
- }
- clone(schema4) {
- const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this));
- if (schema4)
- copy.schema = schema4;
- copy.items = copy.items.map((it) => isNode(it) || isPair(it) ? it.clone(schema4) : it);
- if (this.range)
- copy.range = this.range.slice();
- return copy;
- }
- addIn(path, value) {
- if (isEmptyPath(path))
- this.add(value);
- else {
- const [key, ...rest] = path;
- const node = this.get(key, true);
- if (isCollection(node))
- node.addIn(rest, value);
- else if (node === void 0 && this.schema)
- this.set(key, collectionFromPath(this.schema, rest, value));
- else
- throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);
- }
- }
- deleteIn(path) {
- const [key, ...rest] = path;
- if (rest.length === 0)
- return this.delete(key);
- const node = this.get(key, true);
- if (isCollection(node))
- return node.deleteIn(rest);
- else
- throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);
- }
- getIn(path, keepScalar) {
- const [key, ...rest] = path;
- const node = this.get(key, true);
- if (rest.length === 0)
- return !keepScalar && isScalar(node) ? node.value : node;
- else
- return isCollection(node) ? node.getIn(rest, keepScalar) : void 0;
- }
- hasAllNullValues(allowScalar) {
- return this.items.every((node) => {
- if (!isPair(node))
- return false;
- const n = node.value;
- return n == null || allowScalar && isScalar(n) && n.value == null && !n.commentBefore && !n.comment && !n.tag;
- });
- }
- hasIn(path) {
- const [key, ...rest] = path;
- if (rest.length === 0)
- return this.has(key);
- const node = this.get(key, true);
- return isCollection(node) ? node.hasIn(rest) : false;
- }
- setIn(path, value) {
- const [key, ...rest] = path;
- if (rest.length === 0) {
- this.set(key, value);
- } else {
- const node = this.get(key, true);
- if (isCollection(node))
- node.setIn(rest, value);
- else if (node === void 0 && this.schema)
- this.set(key, collectionFromPath(this.schema, rest, value));
- else
- throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);
- }
- }
-};
-Collection.maxFlowStringSingleLineLength = 60;
-
-// node_modules/yaml/browser/dist/stringify/stringifyComment.js
-var stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, "#");
-function indentComment(comment, indent) {
- if (/^\n+$/.test(comment))
- return comment.substring(1);
- return indent ? comment.replace(/^(?! *$)/gm, indent) : comment;
-}
-var lineComment = (str, indent, comment) => str.endsWith("\n") ? indentComment(comment, indent) : comment.includes("\n") ? "\n" + indentComment(comment, indent) : (str.endsWith(" ") ? "" : " ") + comment;
-
-// node_modules/yaml/browser/dist/stringify/foldFlowLines.js
-var FOLD_FLOW = "flow";
-var FOLD_BLOCK = "block";
-var FOLD_QUOTED = "quoted";
-function foldFlowLines(text, indent, mode = "flow", { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } = {}) {
- if (!lineWidth || lineWidth < 0)
- return text;
- const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length);
- if (text.length <= endStep)
- return text;
- const folds = [];
- const escapedFolds = {};
- let end = lineWidth - indent.length;
- if (typeof indentAtStart === "number") {
- if (indentAtStart > lineWidth - Math.max(2, minContentWidth))
- folds.push(0);
- else
- end = lineWidth - indentAtStart;
- }
- let split = void 0;
- let prev = void 0;
- let overflow = false;
- let i = -1;
- let escStart = -1;
- let escEnd = -1;
- if (mode === FOLD_BLOCK) {
- i = consumeMoreIndentedLines(text, i);
- if (i !== -1)
- end = i + endStep;
- }
- for (let ch; ch = text[i += 1]; ) {
- if (mode === FOLD_QUOTED && ch === "\\") {
- escStart = i;
- switch (text[i + 1]) {
- case "x":
- i += 3;
- break;
- case "u":
- i += 5;
- break;
- case "U":
- i += 9;
- break;
- default:
- i += 1;
- }
- escEnd = i;
- }
- if (ch === "\n") {
- if (mode === FOLD_BLOCK)
- i = consumeMoreIndentedLines(text, i);
- end = i + endStep;
- split = void 0;
- } else {
- if (ch === " " && prev && prev !== " " && prev !== "\n" && prev !== " ") {
- const next = text[i + 1];
- if (next && next !== " " && next !== "\n" && next !== " ")
- split = i;
- }
- if (i >= end) {
- if (split) {
- folds.push(split);
- end = split + endStep;
- split = void 0;
- } else if (mode === FOLD_QUOTED) {
- while (prev === " " || prev === " ") {
- prev = ch;
- ch = text[i += 1];
- overflow = true;
- }
- const j = i > escEnd + 1 ? i - 2 : escStart - 1;
- if (escapedFolds[j])
- return text;
- folds.push(j);
- escapedFolds[j] = true;
- end = j + endStep;
- split = void 0;
- } else {
- overflow = true;
- }
- }
- }
- prev = ch;
- }
- if (overflow && onOverflow)
- onOverflow();
- if (folds.length === 0)
- return text;
- if (onFold)
- onFold();
- let res = text.slice(0, folds[0]);
- for (let i2 = 0; i2 < folds.length; ++i2) {
- const fold = folds[i2];
- const end2 = folds[i2 + 1] || text.length;
- if (fold === 0)
- res = `
-${indent}${text.slice(0, end2)}`;
- else {
- if (mode === FOLD_QUOTED && escapedFolds[fold])
- res += `${text[fold]}\\`;
- res += `
-${indent}${text.slice(fold + 1, end2)}`;
- }
- }
- return res;
-}
-function consumeMoreIndentedLines(text, i) {
- let ch = text[i + 1];
- while (ch === " " || ch === " ") {
- do {
- ch = text[i += 1];
- } while (ch && ch !== "\n");
- ch = text[i + 1];
- }
- return i;
-}
-
-// node_modules/yaml/browser/dist/stringify/stringifyString.js
-var getFoldOptions = (ctx) => ({
- indentAtStart: ctx.indentAtStart,
- lineWidth: ctx.options.lineWidth,
- minContentWidth: ctx.options.minContentWidth
-});
-var containsDocumentMarker = (str) => /^(%|---|\.\.\.)/m.test(str);
-function lineLengthOverLimit(str, lineWidth, indentLength) {
- if (!lineWidth || lineWidth < 0)
- return false;
- const limit = lineWidth - indentLength;
- const strLen = str.length;
- if (strLen <= limit)
- return false;
- for (let i = 0, start = 0; i < strLen; ++i) {
- if (str[i] === "\n") {
- if (i - start > limit)
- return true;
- start = i + 1;
- if (strLen - start <= limit)
- return false;
- }
- }
- return true;
-}
-function doubleQuotedString(value, ctx) {
- const json = JSON.stringify(value);
- if (ctx.options.doubleQuotedAsJSON)
- return json;
- const { implicitKey } = ctx;
- const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength;
- const indent = ctx.indent || (containsDocumentMarker(value) ? " " : "");
- let str = "";
- let start = 0;
- for (let i = 0, ch = json[i]; ch; ch = json[++i]) {
- if (ch === " " && json[i + 1] === "\\" && json[i + 2] === "n") {
- str += json.slice(start, i) + "\\ ";
- i += 1;
- start = i;
- ch = "\\";
- }
- if (ch === "\\")
- switch (json[i + 1]) {
- case "u":
- {
- str += json.slice(start, i);
- const code = json.substr(i + 2, 4);
- switch (code) {
- case "0000":
- str += "\\0";
- break;
- case "0007":
- str += "\\a";
- break;
- case "000b":
- str += "\\v";
- break;
- case "001b":
- str += "\\e";
- break;
- case "0085":
- str += "\\N";
- break;
- case "00a0":
- str += "\\_";
- break;
- case "2028":
- str += "\\L";
- break;
- case "2029":
- str += "\\P";
- break;
- default:
- if (code.substr(0, 2) === "00")
- str += "\\x" + code.substr(2);
- else
- str += json.substr(i, 6);
- }
- i += 5;
- start = i + 1;
- }
- break;
- case "n":
- if (implicitKey || json[i + 2] === '"' || json.length < minMultiLineLength) {
- i += 1;
- } else {
- str += json.slice(start, i) + "\n\n";
- while (json[i + 2] === "\\" && json[i + 3] === "n" && json[i + 4] !== '"') {
- str += "\n";
- i += 2;
- }
- str += indent;
- if (json[i + 2] === " ")
- str += "\\";
- i += 1;
- start = i + 1;
- }
- break;
- default:
- i += 1;
- }
- }
- str = start ? str + json.slice(start) : json;
- return implicitKey ? str : foldFlowLines(str, indent, FOLD_QUOTED, getFoldOptions(ctx));
-}
-function singleQuotedString(value, ctx) {
- if (ctx.options.singleQuote === false || ctx.implicitKey && value.includes("\n") || /[ \t]\n|\n[ \t]/.test(value))
- return doubleQuotedString(value, ctx);
- const indent = ctx.indent || (containsDocumentMarker(value) ? " " : "");
- const res = "'" + value.replace(/'/g, "''").replace(/\n+/g, `$&
-${indent}`) + "'";
- return ctx.implicitKey ? res : foldFlowLines(res, indent, FOLD_FLOW, getFoldOptions(ctx));
-}
-function quotedString(value, ctx) {
- const { singleQuote } = ctx.options;
- let qs;
- if (singleQuote === false)
- qs = doubleQuotedString;
- else {
- const hasDouble = value.includes('"');
- const hasSingle = value.includes("'");
- if (hasDouble && !hasSingle)
- qs = singleQuotedString;
- else if (hasSingle && !hasDouble)
- qs = doubleQuotedString;
- else
- qs = singleQuote ? singleQuotedString : doubleQuotedString;
- }
- return qs(value, ctx);
-}
-function blockString({ comment, type, value }, ctx, onComment, onChompKeep) {
- const { blockQuote, commentString, lineWidth } = ctx.options;
- if (!blockQuote || /\n[\t ]+$/.test(value) || /^\s*$/.test(value)) {
- return quotedString(value, ctx);
- }
- const indent = ctx.indent || (ctx.forceBlockIndent || containsDocumentMarker(value) ? " " : "");
- const literal = blockQuote === "literal" ? true : blockQuote === "folded" || type === Scalar.BLOCK_FOLDED ? false : type === Scalar.BLOCK_LITERAL ? true : !lineLengthOverLimit(value, lineWidth, indent.length);
- if (!value)
- return literal ? "|\n" : ">\n";
- let chomp;
- let endStart;
- for (endStart = value.length; endStart > 0; --endStart) {
- const ch = value[endStart - 1];
- if (ch !== "\n" && ch !== " " && ch !== " ")
- break;
- }
- let end = value.substring(endStart);
- const endNlPos = end.indexOf("\n");
- if (endNlPos === -1) {
- chomp = "-";
- } else if (value === end || endNlPos !== end.length - 1) {
- chomp = "+";
- if (onChompKeep)
- onChompKeep();
- } else {
- chomp = "";
- }
- if (end) {
- value = value.slice(0, -end.length);
- if (end[end.length - 1] === "\n")
- end = end.slice(0, -1);
- end = end.replace(/\n+(?!\n|$)/g, `$&${indent}`);
- }
- let startWithSpace = false;
- let startEnd;
- let startNlPos = -1;
- for (startEnd = 0; startEnd < value.length; ++startEnd) {
- const ch = value[startEnd];
- if (ch === " ")
- startWithSpace = true;
- else if (ch === "\n")
- startNlPos = startEnd;
- else
- break;
- }
- let start = value.substring(0, startNlPos < startEnd ? startNlPos + 1 : startEnd);
- if (start) {
- value = value.substring(start.length);
- start = start.replace(/\n+/g, `$&${indent}`);
- }
- const indentSize = indent ? "2" : "1";
- let header = (literal ? "|" : ">") + (startWithSpace ? indentSize : "") + chomp;
- if (comment) {
- header += " " + commentString(comment.replace(/ ?[\r\n]+/g, " "));
- if (onComment)
- onComment();
- }
- if (literal) {
- value = value.replace(/\n+/g, `$&${indent}`);
- return `${header}
-${indent}${start}${value}${end}`;
- }
- value = value.replace(/\n+/g, "\n$&").replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g, "$1$2").replace(/\n+/g, `$&${indent}`);
- const body = foldFlowLines(`${start}${value}${end}`, indent, FOLD_BLOCK, getFoldOptions(ctx));
- return `${header}
-${indent}${body}`;
-}
-function plainString(item, ctx, onComment, onChompKeep) {
- const { type, value } = item;
- const { actualString, implicitKey, indent, inFlow } = ctx;
- if (implicitKey && /[\n[\]{},]/.test(value) || inFlow && /[[\]{},]/.test(value)) {
- return quotedString(value, ctx);
- }
- if (!value || /^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(value)) {
- return implicitKey || inFlow || !value.includes("\n") ? quotedString(value, ctx) : blockString(item, ctx, onComment, onChompKeep);
- }
- if (!implicitKey && !inFlow && type !== Scalar.PLAIN && value.includes("\n")) {
- return blockString(item, ctx, onComment, onChompKeep);
- }
- if (indent === "" && containsDocumentMarker(value)) {
- ctx.forceBlockIndent = true;
- return blockString(item, ctx, onComment, onChompKeep);
- }
- const str = value.replace(/\n+/g, `$&
-${indent}`);
- if (actualString) {
- const test = (tag) => {
- var _a;
- return tag.default && tag.tag !== "tag:yaml.org,2002:str" && ((_a = tag.test) == null ? void 0 : _a.test(str));
- };
- const { compat, tags } = ctx.doc.schema;
- if (tags.some(test) || (compat == null ? void 0 : compat.some(test)))
- return quotedString(value, ctx);
- }
- return implicitKey ? str : foldFlowLines(str, indent, FOLD_FLOW, getFoldOptions(ctx));
-}
-function stringifyString(item, ctx, onComment, onChompKeep) {
- const { implicitKey, inFlow } = ctx;
- const ss = typeof item.value === "string" ? item : Object.assign({}, item, { value: String(item.value) });
- let { type } = item;
- if (type !== Scalar.QUOTE_DOUBLE) {
- if (/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(ss.value))
- type = Scalar.QUOTE_DOUBLE;
- }
- const _stringify = (_type) => {
- switch (_type) {
- case Scalar.BLOCK_FOLDED:
- case Scalar.BLOCK_LITERAL:
- return implicitKey || inFlow ? quotedString(ss.value, ctx) : blockString(ss, ctx, onComment, onChompKeep);
- case Scalar.QUOTE_DOUBLE:
- return doubleQuotedString(ss.value, ctx);
- case Scalar.QUOTE_SINGLE:
- return singleQuotedString(ss.value, ctx);
- case Scalar.PLAIN:
- return plainString(ss, ctx, onComment, onChompKeep);
- default:
- return null;
- }
- };
- let res = _stringify(type);
- if (res === null) {
- const { defaultKeyType, defaultStringType } = ctx.options;
- const t = implicitKey && defaultKeyType || defaultStringType;
- res = _stringify(t);
- if (res === null)
- throw new Error(`Unsupported default string type ${t}`);
- }
- return res;
-}
-
-// node_modules/yaml/browser/dist/stringify/stringify.js
-function createStringifyContext(doc, options) {
- const opt = Object.assign({
- blockQuote: true,
- commentString: stringifyComment,
- defaultKeyType: null,
- defaultStringType: "PLAIN",
- directives: null,
- doubleQuotedAsJSON: false,
- doubleQuotedMinMultiLineLength: 40,
- falseStr: "false",
- indentSeq: true,
- lineWidth: 80,
- minContentWidth: 20,
- nullStr: "null",
- simpleKeys: false,
- singleQuote: null,
- trueStr: "true",
- verifyAliasOrder: true
- }, doc.schema.toStringOptions, options);
- let inFlow;
- switch (opt.collectionStyle) {
- case "block":
- inFlow = false;
- break;
- case "flow":
- inFlow = true;
- break;
- default:
- inFlow = null;
- }
- return {
- anchors: new Set(),
- doc,
- indent: "",
- indentStep: typeof opt.indent === "number" ? " ".repeat(opt.indent) : " ",
- inFlow,
- options: opt
- };
-}
-function getTagObject(tags, item) {
- var _a, _b, _c, _d;
- if (item.tag) {
- const match = tags.filter((t) => t.tag === item.tag);
- if (match.length > 0)
- return (_a = match.find((t) => t.format === item.format)) != null ? _a : match[0];
- }
- let tagObj = void 0;
- let obj;
- if (isScalar(item)) {
- obj = item.value;
- const match = tags.filter((t) => {
- var _a2;
- return (_a2 = t.identify) == null ? void 0 : _a2.call(t, obj);
- });
- tagObj = (_b = match.find((t) => t.format === item.format)) != null ? _b : match.find((t) => !t.format);
- } else {
- obj = item;
- tagObj = tags.find((t) => t.nodeClass && obj instanceof t.nodeClass);
- }
- if (!tagObj) {
- const name = (_d = (_c = obj == null ? void 0 : obj.constructor) == null ? void 0 : _c.name) != null ? _d : typeof obj;
- throw new Error(`Tag not resolved for ${name} value`);
- }
- return tagObj;
-}
-function stringifyProps(node, tagObj, { anchors, doc }) {
- if (!doc.directives)
- return "";
- const props = [];
- const anchor = (isScalar(node) || isCollection(node)) && node.anchor;
- if (anchor && anchorIsValid(anchor)) {
- anchors.add(anchor);
- props.push(`&${anchor}`);
- }
- const tag = node.tag ? node.tag : tagObj.default ? null : tagObj.tag;
- if (tag)
- props.push(doc.directives.tagString(tag));
- return props.join(" ");
-}
-function stringify(item, ctx, onComment, onChompKeep) {
- var _a, _b;
- if (isPair(item))
- return item.toString(ctx, onComment, onChompKeep);
- if (isAlias(item)) {
- if (ctx.doc.directives)
- return item.toString(ctx);
- if ((_a = ctx.resolvedAliases) == null ? void 0 : _a.has(item)) {
- throw new TypeError(`Cannot stringify circular structure without alias nodes`);
- } else {
- if (ctx.resolvedAliases)
- ctx.resolvedAliases.add(item);
- else
- ctx.resolvedAliases = new Set([item]);
- item = item.resolve(ctx.doc);
- }
- }
- let tagObj = void 0;
- const node = isNode(item) ? item : ctx.doc.createNode(item, { onTagObj: (o) => tagObj = o });
- if (!tagObj)
- tagObj = getTagObject(ctx.doc.schema.tags, node);
- const props = stringifyProps(node, tagObj, ctx);
- if (props.length > 0)
- ctx.indentAtStart = ((_b = ctx.indentAtStart) != null ? _b : 0) + props.length + 1;
- const str = typeof tagObj.stringify === "function" ? tagObj.stringify(node, ctx, onComment, onChompKeep) : isScalar(node) ? stringifyString(node, ctx, onComment, onChompKeep) : node.toString(ctx, onComment, onChompKeep);
- if (!props)
- return str;
- return isScalar(node) || str[0] === "{" || str[0] === "[" ? `${props} ${str}` : `${props}
-${ctx.indent}${str}`;
-}
-
-// node_modules/yaml/browser/dist/stringify/stringifyPair.js
-function stringifyPair({ key, value }, ctx, onComment, onChompKeep) {
- const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx;
- let keyComment = isNode(key) && key.comment || null;
- if (simpleKeys) {
- if (keyComment) {
- throw new Error("With simple keys, key nodes cannot have comments");
- }
- if (isCollection(key)) {
- const msg = "With simple keys, collection cannot be used as a key value";
- throw new Error(msg);
- }
- }
- let explicitKey = !simpleKeys && (!key || keyComment && value == null && !ctx.inFlow || isCollection(key) || (isScalar(key) ? key.type === Scalar.BLOCK_FOLDED || key.type === Scalar.BLOCK_LITERAL : typeof key === "object"));
- ctx = Object.assign({}, ctx, {
- allNullValues: false,
- implicitKey: !explicitKey && (simpleKeys || !allNullValues),
- indent: indent + indentStep
- });
- let keyCommentDone = false;
- let chompKeep = false;
- let str = stringify(key, ctx, () => keyCommentDone = true, () => chompKeep = true);
- if (!explicitKey && !ctx.inFlow && str.length > 1024) {
- if (simpleKeys)
- throw new Error("With simple keys, single line scalar must not span more than 1024 characters");
- explicitKey = true;
- }
- if (ctx.inFlow) {
- if (allNullValues || value == null) {
- if (keyCommentDone && onComment)
- onComment();
- return str === "" ? "?" : explicitKey ? `? ${str}` : str;
- }
- } else if (allNullValues && !simpleKeys || value == null && explicitKey) {
- str = `? ${str}`;
- if (keyComment && !keyCommentDone) {
- str += lineComment(str, ctx.indent, commentString(keyComment));
- } else if (chompKeep && onChompKeep)
- onChompKeep();
- return str;
- }
- if (keyCommentDone)
- keyComment = null;
- if (explicitKey) {
- if (keyComment)
- str += lineComment(str, ctx.indent, commentString(keyComment));
- str = `? ${str}
-${indent}:`;
- } else {
- str = `${str}:`;
- if (keyComment)
- str += lineComment(str, ctx.indent, commentString(keyComment));
- }
- let vcb = "";
- let valueComment = null;
- if (isNode(value)) {
- if (value.spaceBefore)
- vcb = "\n";
- if (value.commentBefore) {
- const cs = commentString(value.commentBefore);
- vcb += `
-${indentComment(cs, ctx.indent)}`;
- }
- valueComment = value.comment;
- } else if (value && typeof value === "object") {
- value = doc.createNode(value);
- }
- ctx.implicitKey = false;
- if (!explicitKey && !keyComment && isScalar(value))
- ctx.indentAtStart = str.length + 1;
- chompKeep = false;
- if (!indentSeq && indentStep.length >= 2 && !ctx.inFlow && !explicitKey && isSeq(value) && !value.flow && !value.tag && !value.anchor) {
- ctx.indent = ctx.indent.substr(2);
- }
- let valueCommentDone = false;
- const valueStr = stringify(value, ctx, () => valueCommentDone = true, () => chompKeep = true);
- let ws = " ";
- if (vcb || keyComment) {
- if (valueStr === "" && !ctx.inFlow)
- ws = vcb === "\n" ? "\n\n" : vcb;
- else
- ws = `${vcb}
-${ctx.indent}`;
- } else if (!explicitKey && isCollection(value)) {
- const flow = valueStr[0] === "[" || valueStr[0] === "{";
- if (!flow || valueStr.includes("\n"))
- ws = `
-${ctx.indent}`;
- } else if (valueStr === "" || valueStr[0] === "\n")
- ws = "";
- str += ws + valueStr;
- if (ctx.inFlow) {
- if (valueCommentDone && onComment)
- onComment();
- } else if (valueComment && !valueCommentDone) {
- str += lineComment(str, ctx.indent, commentString(valueComment));
- } else if (chompKeep && onChompKeep) {
- onChompKeep();
- }
- return str;
-}
-
-// node_modules/yaml/browser/dist/log.js
-function warn(logLevel, warning) {
- if (logLevel === "debug" || logLevel === "warn") {
- if (typeof process !== "undefined" && process.emitWarning)
- process.emitWarning(warning);
- else
- console.warn(warning);
- }
-}
-
-// node_modules/yaml/browser/dist/nodes/addPairToJSMap.js
-var MERGE_KEY = "<<";
-function addPairToJSMap(ctx, map2, { key, value }) {
- if ((ctx == null ? void 0 : ctx.doc.schema.merge) && isMergeKey(key)) {
- value = isAlias(value) ? value.resolve(ctx.doc) : value;
- if (isSeq(value))
- for (const it of value.items)
- mergeToJSMap(ctx, map2, it);
- else if (Array.isArray(value))
- for (const it of value)
- mergeToJSMap(ctx, map2, it);
- else
- mergeToJSMap(ctx, map2, value);
- } else {
- const jsKey = toJS(key, "", ctx);
- if (map2 instanceof Map) {
- map2.set(jsKey, toJS(value, jsKey, ctx));
- } else if (map2 instanceof Set) {
- map2.add(jsKey);
- } else {
- const stringKey = stringifyKey(key, jsKey, ctx);
- const jsValue = toJS(value, stringKey, ctx);
- if (stringKey in map2)
- Object.defineProperty(map2, stringKey, {
- value: jsValue,
- writable: true,
- enumerable: true,
- configurable: true
- });
- else
- map2[stringKey] = jsValue;
- }
- }
- return map2;
-}
-var isMergeKey = (key) => key === MERGE_KEY || isScalar(key) && key.value === MERGE_KEY && (!key.type || key.type === Scalar.PLAIN);
-function mergeToJSMap(ctx, map2, value) {
- const source = ctx && isAlias(value) ? value.resolve(ctx.doc) : value;
- if (!isMap(source))
- throw new Error("Merge sources must be maps or map aliases");
- const srcMap = source.toJSON(null, ctx, Map);
- for (const [key, value2] of srcMap) {
- if (map2 instanceof Map) {
- if (!map2.has(key))
- map2.set(key, value2);
- } else if (map2 instanceof Set) {
- map2.add(key);
- } else if (!Object.prototype.hasOwnProperty.call(map2, key)) {
- Object.defineProperty(map2, key, {
- value: value2,
- writable: true,
- enumerable: true,
- configurable: true
- });
- }
- }
- return map2;
-}
-function stringifyKey(key, jsKey, ctx) {
- if (jsKey === null)
- return "";
- if (typeof jsKey !== "object")
- return String(jsKey);
- if (isNode(key) && ctx && ctx.doc) {
- const strCtx = createStringifyContext(ctx.doc, {});
- strCtx.anchors = new Set();
- for (const node of ctx.anchors.keys())
- strCtx.anchors.add(node.anchor);
- strCtx.inFlow = true;
- strCtx.inStringifyKey = true;
- const strKey = key.toString(strCtx);
- if (!ctx.mapKeyWarned) {
- let jsonStr = JSON.stringify(strKey);
- if (jsonStr.length > 40)
- jsonStr = jsonStr.substring(0, 36) + '..."';
- warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`);
- ctx.mapKeyWarned = true;
- }
- return strKey;
- }
- return JSON.stringify(jsKey);
-}
-
-// node_modules/yaml/browser/dist/nodes/Pair.js
-function createPair(key, value, ctx) {
- const k = createNode(key, void 0, ctx);
- const v = createNode(value, void 0, ctx);
- return new Pair(k, v);
-}
-var Pair = class {
- constructor(key, value = null) {
- Object.defineProperty(this, NODE_TYPE, { value: PAIR });
- this.key = key;
- this.value = value;
- }
- clone(schema4) {
- let { key, value } = this;
- if (isNode(key))
- key = key.clone(schema4);
- if (isNode(value))
- value = value.clone(schema4);
- return new Pair(key, value);
- }
- toJSON(_, ctx) {
- const pair = (ctx == null ? void 0 : ctx.mapAsMap) ? new Map() : {};
- return addPairToJSMap(ctx, pair, this);
- }
- toString(ctx, onComment, onChompKeep) {
- return (ctx == null ? void 0 : ctx.doc) ? stringifyPair(this, ctx, onComment, onChompKeep) : JSON.stringify(this);
- }
-};
-
-// node_modules/yaml/browser/dist/stringify/stringifyCollection.js
-function stringifyCollection(collection, ctx, options) {
- var _a;
- const flow = (_a = ctx.inFlow) != null ? _a : collection.flow;
- const stringify4 = flow ? stringifyFlowCollection : stringifyBlockCollection;
- return stringify4(collection, ctx, options);
-}
-function stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) {
- const { indent, options: { commentString } } = ctx;
- const itemCtx = Object.assign({}, ctx, { indent: itemIndent, type: null });
- let chompKeep = false;
- const lines = [];
- for (let i = 0; i < items.length; ++i) {
- const item = items[i];
- let comment2 = null;
- if (isNode(item)) {
- if (!chompKeep && item.spaceBefore)
- lines.push("");
- addCommentBefore(ctx, lines, item.commentBefore, chompKeep);
- if (item.comment)
- comment2 = item.comment;
- } else if (isPair(item)) {
- const ik = isNode(item.key) ? item.key : null;
- if (ik) {
- if (!chompKeep && ik.spaceBefore)
- lines.push("");
- addCommentBefore(ctx, lines, ik.commentBefore, chompKeep);
- }
- }
- chompKeep = false;
- let str2 = stringify(item, itemCtx, () => comment2 = null, () => chompKeep = true);
- if (comment2)
- str2 += lineComment(str2, itemIndent, commentString(comment2));
- if (chompKeep && comment2)
- chompKeep = false;
- lines.push(blockItemPrefix + str2);
- }
- let str;
- if (lines.length === 0) {
- str = flowChars.start + flowChars.end;
- } else {
- str = lines[0];
- for (let i = 1; i < lines.length; ++i) {
- const line = lines[i];
- str += line ? `
-${indent}${line}` : "\n";
- }
- }
- if (comment) {
- str += "\n" + indentComment(commentString(comment), indent);
- if (onComment)
- onComment();
- } else if (chompKeep && onChompKeep)
- onChompKeep();
- return str;
-}
-function stringifyFlowCollection({ comment, items }, ctx, { flowChars, itemIndent, onComment }) {
- const { indent, indentStep, options: { commentString } } = ctx;
- itemIndent += indentStep;
- const itemCtx = Object.assign({}, ctx, {
- indent: itemIndent,
- inFlow: true,
- type: null
- });
- let reqNewline = false;
- let linesAtValue = 0;
- const lines = [];
- for (let i = 0; i < items.length; ++i) {
- const item = items[i];
- let comment2 = null;
- if (isNode(item)) {
- if (item.spaceBefore)
- lines.push("");
- addCommentBefore(ctx, lines, item.commentBefore, false);
- if (item.comment)
- comment2 = item.comment;
- } else if (isPair(item)) {
- const ik = isNode(item.key) ? item.key : null;
- if (ik) {
- if (ik.spaceBefore)
- lines.push("");
- addCommentBefore(ctx, lines, ik.commentBefore, false);
- if (ik.comment)
- reqNewline = true;
- }
- const iv = isNode(item.value) ? item.value : null;
- if (iv) {
- if (iv.comment)
- comment2 = iv.comment;
- if (iv.commentBefore)
- reqNewline = true;
- } else if (item.value == null && ik && ik.comment) {
- comment2 = ik.comment;
- }
- }
- if (comment2)
- reqNewline = true;
- let str2 = stringify(item, itemCtx, () => comment2 = null);
- if (i < items.length - 1)
- str2 += ",";
- if (comment2)
- str2 += lineComment(str2, itemIndent, commentString(comment2));
- if (!reqNewline && (lines.length > linesAtValue || str2.includes("\n")))
- reqNewline = true;
- lines.push(str2);
- linesAtValue = lines.length;
- }
- let str;
- const { start, end } = flowChars;
- if (lines.length === 0) {
- str = start + end;
- } else {
- if (!reqNewline) {
- const len = lines.reduce((sum, line) => sum + line.length + 2, 2);
- reqNewline = len > Collection.maxFlowStringSingleLineLength;
- }
- if (reqNewline) {
- str = start;
- for (const line of lines)
- str += line ? `
-${indentStep}${indent}${line}` : "\n";
- str += `
-${indent}${end}`;
- } else {
- str = `${start} ${lines.join(" ")} ${end}`;
- }
- }
- if (comment) {
- str += lineComment(str, commentString(comment), indent);
- if (onComment)
- onComment();
- }
- return str;
-}
-function addCommentBefore({ indent, options: { commentString } }, lines, comment, chompKeep) {
- if (comment && chompKeep)
- comment = comment.replace(/^\n+/, "");
- if (comment) {
- const ic = indentComment(commentString(comment), indent);
- lines.push(ic.trimStart());
- }
-}
-
-// node_modules/yaml/browser/dist/nodes/YAMLMap.js
-function findPair(items, key) {
- const k = isScalar(key) ? key.value : key;
- for (const it of items) {
- if (isPair(it)) {
- if (it.key === key || it.key === k)
- return it;
- if (isScalar(it.key) && it.key.value === k)
- return it;
- }
- }
- return void 0;
-}
-var YAMLMap = class extends Collection {
- constructor(schema4) {
- super(MAP, schema4);
- this.items = [];
- }
- static get tagName() {
- return "tag:yaml.org,2002:map";
- }
- add(pair, overwrite) {
- var _a;
- let _pair;
- if (isPair(pair))
- _pair = pair;
- else if (!pair || typeof pair !== "object" || !("key" in pair)) {
- _pair = new Pair(pair, pair == null ? void 0 : pair.value);
- } else
- _pair = new Pair(pair.key, pair.value);
- const prev = findPair(this.items, _pair.key);
- const sortEntries = (_a = this.schema) == null ? void 0 : _a.sortMapEntries;
- if (prev) {
- if (!overwrite)
- throw new Error(`Key ${_pair.key} already set`);
- if (isScalar(prev.value) && isScalarValue(_pair.value))
- prev.value.value = _pair.value;
- else
- prev.value = _pair.value;
- } else if (sortEntries) {
- const i = this.items.findIndex((item) => sortEntries(_pair, item) < 0);
- if (i === -1)
- this.items.push(_pair);
- else
- this.items.splice(i, 0, _pair);
- } else {
- this.items.push(_pair);
- }
- }
- delete(key) {
- const it = findPair(this.items, key);
- if (!it)
- return false;
- const del = this.items.splice(this.items.indexOf(it), 1);
- return del.length > 0;
- }
- get(key, keepScalar) {
- var _a;
- const it = findPair(this.items, key);
- const node = it == null ? void 0 : it.value;
- return (_a = !keepScalar && isScalar(node) ? node.value : node) != null ? _a : void 0;
- }
- has(key) {
- return !!findPair(this.items, key);
- }
- set(key, value) {
- this.add(new Pair(key, value), true);
- }
- toJSON(_, ctx, Type) {
- const map2 = Type ? new Type() : (ctx == null ? void 0 : ctx.mapAsMap) ? new Map() : {};
- if (ctx == null ? void 0 : ctx.onCreate)
- ctx.onCreate(map2);
- for (const item of this.items)
- addPairToJSMap(ctx, map2, item);
- return map2;
- }
- toString(ctx, onComment, onChompKeep) {
- if (!ctx)
- return JSON.stringify(this);
- for (const item of this.items) {
- if (!isPair(item))
- throw new Error(`Map items must all be pairs; found ${JSON.stringify(item)} instead`);
- }
- if (!ctx.allNullValues && this.hasAllNullValues(false))
- ctx = Object.assign({}, ctx, { allNullValues: true });
- return stringifyCollection(this, ctx, {
- blockItemPrefix: "",
- flowChars: { start: "{", end: "}" },
- itemIndent: ctx.indent || "",
- onChompKeep,
- onComment
- });
- }
-};
-
-// node_modules/yaml/browser/dist/schema/common/map.js
-function createMap(schema4, obj, ctx) {
- const { keepUndefined, replacer } = ctx;
- const map2 = new YAMLMap(schema4);
- const add = (key, value) => {
- if (typeof replacer === "function")
- value = replacer.call(obj, key, value);
- else if (Array.isArray(replacer) && !replacer.includes(key))
- return;
- if (value !== void 0 || keepUndefined)
- map2.items.push(createPair(key, value, ctx));
- };
- if (obj instanceof Map) {
- for (const [key, value] of obj)
- add(key, value);
- } else if (obj && typeof obj === "object") {
- for (const key of Object.keys(obj))
- add(key, obj[key]);
- }
- if (typeof schema4.sortMapEntries === "function") {
- map2.items.sort(schema4.sortMapEntries);
- }
- return map2;
-}
-var map = {
- collection: "map",
- createNode: createMap,
- default: true,
- nodeClass: YAMLMap,
- tag: "tag:yaml.org,2002:map",
- resolve(map2, onError) {
- if (!isMap(map2))
- onError("Expected a mapping for this tag");
- return map2;
- }
-};
-
-// node_modules/yaml/browser/dist/nodes/YAMLSeq.js
-var YAMLSeq = class extends Collection {
- constructor(schema4) {
- super(SEQ, schema4);
- this.items = [];
- }
- static get tagName() {
- return "tag:yaml.org,2002:seq";
- }
- add(value) {
- this.items.push(value);
- }
- delete(key) {
- const idx = asItemIndex(key);
- if (typeof idx !== "number")
- return false;
- const del = this.items.splice(idx, 1);
- return del.length > 0;
- }
- get(key, keepScalar) {
- const idx = asItemIndex(key);
- if (typeof idx !== "number")
- return void 0;
- const it = this.items[idx];
- return !keepScalar && isScalar(it) ? it.value : it;
- }
- has(key) {
- const idx = asItemIndex(key);
- return typeof idx === "number" && idx < this.items.length;
- }
- set(key, value) {
- const idx = asItemIndex(key);
- if (typeof idx !== "number")
- throw new Error(`Expected a valid index, not ${key}.`);
- const prev = this.items[idx];
- if (isScalar(prev) && isScalarValue(value))
- prev.value = value;
- else
- this.items[idx] = value;
- }
- toJSON(_, ctx) {
- const seq2 = [];
- if (ctx == null ? void 0 : ctx.onCreate)
- ctx.onCreate(seq2);
- let i = 0;
- for (const item of this.items)
- seq2.push(toJS(item, String(i++), ctx));
- return seq2;
- }
- toString(ctx, onComment, onChompKeep) {
- if (!ctx)
- return JSON.stringify(this);
- return stringifyCollection(this, ctx, {
- blockItemPrefix: "- ",
- flowChars: { start: "[", end: "]" },
- itemIndent: (ctx.indent || "") + " ",
- onChompKeep,
- onComment
- });
- }
-};
-function asItemIndex(key) {
- let idx = isScalar(key) ? key.value : key;
- if (idx && typeof idx === "string")
- idx = Number(idx);
- return typeof idx === "number" && Number.isInteger(idx) && idx >= 0 ? idx : null;
-}
-
-// node_modules/yaml/browser/dist/schema/common/seq.js
-function createSeq(schema4, obj, ctx) {
- const { replacer } = ctx;
- const seq2 = new YAMLSeq(schema4);
- if (obj && Symbol.iterator in Object(obj)) {
- let i = 0;
- for (let it of obj) {
- if (typeof replacer === "function") {
- const key = obj instanceof Set ? it : String(i++);
- it = replacer.call(obj, key, it);
- }
- seq2.items.push(createNode(it, void 0, ctx));
- }
- }
- return seq2;
-}
-var seq = {
- collection: "seq",
- createNode: createSeq,
- default: true,
- nodeClass: YAMLSeq,
- tag: "tag:yaml.org,2002:seq",
- resolve(seq2, onError) {
- if (!isSeq(seq2))
- onError("Expected a sequence for this tag");
- return seq2;
- }
-};
-
-// node_modules/yaml/browser/dist/schema/common/string.js
-var string = {
- identify: (value) => typeof value === "string",
- default: true,
- tag: "tag:yaml.org,2002:str",
- resolve: (str) => str,
- stringify(item, ctx, onComment, onChompKeep) {
- ctx = Object.assign({ actualString: true }, ctx);
- return stringifyString(item, ctx, onComment, onChompKeep);
- }
-};
-
-// node_modules/yaml/browser/dist/schema/common/null.js
-var nullTag = {
- identify: (value) => value == null,
- createNode: () => new Scalar(null),
- default: true,
- tag: "tag:yaml.org,2002:null",
- test: /^(?:~|[Nn]ull|NULL)?$/,
- resolve: () => new Scalar(null),
- stringify: ({ source }, ctx) => typeof source === "string" && nullTag.test.test(source) ? source : ctx.options.nullStr
-};
-
-// node_modules/yaml/browser/dist/schema/core/bool.js
-var boolTag = {
- identify: (value) => typeof value === "boolean",
- default: true,
- tag: "tag:yaml.org,2002:bool",
- test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,
- resolve: (str) => new Scalar(str[0] === "t" || str[0] === "T"),
- stringify({ source, value }, ctx) {
- if (source && boolTag.test.test(source)) {
- const sv = source[0] === "t" || source[0] === "T";
- if (value === sv)
- return source;
- }
- return value ? ctx.options.trueStr : ctx.options.falseStr;
- }
-};
-
-// node_modules/yaml/browser/dist/stringify/stringifyNumber.js
-function stringifyNumber({ format, minFractionDigits, tag, value }) {
- if (typeof value === "bigint")
- return String(value);
- const num = typeof value === "number" ? value : Number(value);
- if (!isFinite(num))
- return isNaN(num) ? ".nan" : num < 0 ? "-.inf" : ".inf";
- let n = JSON.stringify(value);
- if (!format && minFractionDigits && (!tag || tag === "tag:yaml.org,2002:float") && /^\d/.test(n)) {
- let i = n.indexOf(".");
- if (i < 0) {
- i = n.length;
- n += ".";
- }
- let d = minFractionDigits - (n.length - i - 1);
- while (d-- > 0)
- n += "0";
- }
- return n;
-}
-
-// node_modules/yaml/browser/dist/schema/core/float.js
-var floatNaN = {
- identify: (value) => typeof value === "number",
- default: true,
- tag: "tag:yaml.org,2002:float",
- test: /^(?:[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN))$/,
- resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
- stringify: stringifyNumber
-};
-var floatExp = {
- identify: (value) => typeof value === "number",
- default: true,
- tag: "tag:yaml.org,2002:float",
- format: "EXP",
- test: /^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,
- resolve: (str) => parseFloat(str),
- stringify(node) {
- const num = Number(node.value);
- return isFinite(num) ? num.toExponential() : stringifyNumber(node);
- }
-};
-var float = {
- identify: (value) => typeof value === "number",
- default: true,
- tag: "tag:yaml.org,2002:float",
- test: /^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,
- resolve(str) {
- const node = new Scalar(parseFloat(str));
- const dot = str.indexOf(".");
- if (dot !== -1 && str[str.length - 1] === "0")
- node.minFractionDigits = str.length - dot - 1;
- return node;
- },
- stringify: stringifyNumber
-};
-
-// node_modules/yaml/browser/dist/schema/core/int.js
-var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value);
-var intResolve = (str, offset, radix, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str.substring(offset), radix);
-function intStringify(node, radix, prefix) {
- const { value } = node;
- if (intIdentify(value) && value >= 0)
- return prefix + value.toString(radix);
- return stringifyNumber(node);
-}
-var intOct = {
- identify: (value) => intIdentify(value) && value >= 0,
- default: true,
- tag: "tag:yaml.org,2002:int",
- format: "OCT",
- test: /^0o[0-7]+$/,
- resolve: (str, _onError, opt) => intResolve(str, 2, 8, opt),
- stringify: (node) => intStringify(node, 8, "0o")
-};
-var int = {
- identify: intIdentify,
- default: true,
- tag: "tag:yaml.org,2002:int",
- test: /^[-+]?[0-9]+$/,
- resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt),
- stringify: stringifyNumber
-};
-var intHex = {
- identify: (value) => intIdentify(value) && value >= 0,
- default: true,
- tag: "tag:yaml.org,2002:int",
- format: "HEX",
- test: /^0x[0-9a-fA-F]+$/,
- resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt),
- stringify: (node) => intStringify(node, 16, "0x")
-};
-
-// node_modules/yaml/browser/dist/schema/core/schema.js
-var schema = [
- map,
- seq,
- string,
- nullTag,
- boolTag,
- intOct,
- int,
- intHex,
- floatNaN,
- floatExp,
- float
-];
-
-// node_modules/yaml/browser/dist/schema/json/schema.js
-function intIdentify2(value) {
- return typeof value === "bigint" || Number.isInteger(value);
-}
-var stringifyJSON = ({ value }) => JSON.stringify(value);
-var jsonScalars = [
- {
- identify: (value) => typeof value === "string",
- default: true,
- tag: "tag:yaml.org,2002:str",
- resolve: (str) => str,
- stringify: stringifyJSON
- },
- {
- identify: (value) => value == null,
- createNode: () => new Scalar(null),
- default: true,
- tag: "tag:yaml.org,2002:null",
- test: /^null$/,
- resolve: () => null,
- stringify: stringifyJSON
- },
- {
- identify: (value) => typeof value === "boolean",
- default: true,
- tag: "tag:yaml.org,2002:bool",
- test: /^true|false$/,
- resolve: (str) => str === "true",
- stringify: stringifyJSON
- },
- {
- identify: intIdentify2,
- default: true,
- tag: "tag:yaml.org,2002:int",
- test: /^-?(?:0|[1-9][0-9]*)$/,
- resolve: (str, _onError, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str, 10),
- stringify: ({ value }) => intIdentify2(value) ? value.toString() : JSON.stringify(value)
- },
- {
- identify: (value) => typeof value === "number",
- default: true,
- tag: "tag:yaml.org,2002:float",
- test: /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,
- resolve: (str) => parseFloat(str),
- stringify: stringifyJSON
- }
-];
-var jsonError = {
- default: true,
- tag: "",
- test: /^/,
- resolve(str, onError) {
- onError(`Unresolved plain scalar ${JSON.stringify(str)}`);
- return str;
- }
-};
-var schema2 = [map, seq].concat(jsonScalars, jsonError);
-
-// node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js
-var binary = {
- identify: (value) => value instanceof Uint8Array,
- default: false,
- tag: "tag:yaml.org,2002:binary",
- resolve(src, onError) {
- if (typeof Buffer === "function") {
- return Buffer.from(src, "base64");
- } else if (typeof atob === "function") {
- const str = atob(src.replace(/[\n\r]/g, ""));
- const buffer = new Uint8Array(str.length);
- for (let i = 0; i < str.length; ++i)
- buffer[i] = str.charCodeAt(i);
- return buffer;
- } else {
- onError("This environment does not support reading binary tags; either Buffer or atob is required");
- return src;
- }
- },
- stringify({ comment, type, value }, ctx, onComment, onChompKeep) {
- const buf = value;
- let str;
- if (typeof Buffer === "function") {
- str = buf instanceof Buffer ? buf.toString("base64") : Buffer.from(buf.buffer).toString("base64");
- } else if (typeof btoa === "function") {
- let s = "";
- for (let i = 0; i < buf.length; ++i)
- s += String.fromCharCode(buf[i]);
- str = btoa(s);
- } else {
- throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required");
- }
- if (!type)
- type = Scalar.BLOCK_LITERAL;
- if (type !== Scalar.QUOTE_DOUBLE) {
- const lineWidth = Math.max(ctx.options.lineWidth - ctx.indent.length, ctx.options.minContentWidth);
- const n = Math.ceil(str.length / lineWidth);
- const lines = new Array(n);
- for (let i = 0, o = 0; i < n; ++i, o += lineWidth) {
- lines[i] = str.substr(o, lineWidth);
- }
- str = lines.join(type === Scalar.BLOCK_LITERAL ? "\n" : " ");
- }
- return stringifyString({ comment, type, value: str }, ctx, onComment, onChompKeep);
- }
-};
-
-// node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js
-function resolvePairs(seq2, onError) {
- var _a;
- if (isSeq(seq2)) {
- for (let i = 0; i < seq2.items.length; ++i) {
- let item = seq2.items[i];
- if (isPair(item))
- continue;
- else if (isMap(item)) {
- if (item.items.length > 1)
- onError("Each pair must have its own sequence indicator");
- const pair = item.items[0] || new Pair(new Scalar(null));
- if (item.commentBefore)
- pair.key.commentBefore = pair.key.commentBefore ? `${item.commentBefore}
-${pair.key.commentBefore}` : item.commentBefore;
- if (item.comment) {
- const cn = (_a = pair.value) != null ? _a : pair.key;
- cn.comment = cn.comment ? `${item.comment}
-${cn.comment}` : item.comment;
- }
- item = pair;
- }
- seq2.items[i] = isPair(item) ? item : new Pair(item);
- }
- } else
- onError("Expected a sequence for this tag");
- return seq2;
-}
-function createPairs(schema4, iterable, ctx) {
- const { replacer } = ctx;
- const pairs2 = new YAMLSeq(schema4);
- pairs2.tag = "tag:yaml.org,2002:pairs";
- let i = 0;
- if (iterable && Symbol.iterator in Object(iterable))
- for (let it of iterable) {
- if (typeof replacer === "function")
- it = replacer.call(iterable, String(i++), it);
- let key, value;
- if (Array.isArray(it)) {
- if (it.length === 2) {
- key = it[0];
- value = it[1];
- } else
- throw new TypeError(`Expected [key, value] tuple: ${it}`);
- } else if (it && it instanceof Object) {
- const keys = Object.keys(it);
- if (keys.length === 1) {
- key = keys[0];
- value = it[key];
- } else
- throw new TypeError(`Expected { key: value } tuple: ${it}`);
- } else {
- key = it;
- }
- pairs2.items.push(createPair(key, value, ctx));
- }
- return pairs2;
-}
-var pairs = {
- collection: "seq",
- default: false,
- tag: "tag:yaml.org,2002:pairs",
- resolve: resolvePairs,
- createNode: createPairs
-};
-
-// node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js
-var YAMLOMap = class extends YAMLSeq {
- constructor() {
- super();
- this.add = YAMLMap.prototype.add.bind(this);
- this.delete = YAMLMap.prototype.delete.bind(this);
- this.get = YAMLMap.prototype.get.bind(this);
- this.has = YAMLMap.prototype.has.bind(this);
- this.set = YAMLMap.prototype.set.bind(this);
- this.tag = YAMLOMap.tag;
- }
- toJSON(_, ctx) {
- if (!ctx)
- return super.toJSON(_);
- const map2 = new Map();
- if (ctx == null ? void 0 : ctx.onCreate)
- ctx.onCreate(map2);
- for (const pair of this.items) {
- let key, value;
- if (isPair(pair)) {
- key = toJS(pair.key, "", ctx);
- value = toJS(pair.value, key, ctx);
- } else {
- key = toJS(pair, "", ctx);
- }
- if (map2.has(key))
- throw new Error("Ordered maps must not include duplicate keys");
- map2.set(key, value);
- }
- return map2;
- }
-};
-YAMLOMap.tag = "tag:yaml.org,2002:omap";
-var omap = {
- collection: "seq",
- identify: (value) => value instanceof Map,
- nodeClass: YAMLOMap,
- default: false,
- tag: "tag:yaml.org,2002:omap",
- resolve(seq2, onError) {
- const pairs2 = resolvePairs(seq2, onError);
- const seenKeys = [];
- for (const { key } of pairs2.items) {
- if (isScalar(key)) {
- if (seenKeys.includes(key.value)) {
- onError(`Ordered maps must not include duplicate keys: ${key.value}`);
- } else {
- seenKeys.push(key.value);
- }
- }
- }
- return Object.assign(new YAMLOMap(), pairs2);
- },
- createNode(schema4, iterable, ctx) {
- const pairs2 = createPairs(schema4, iterable, ctx);
- const omap2 = new YAMLOMap();
- omap2.items = pairs2.items;
- return omap2;
- }
-};
-
-// node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js
-function boolStringify({ value, source }, ctx) {
- const boolObj = value ? trueTag : falseTag;
- if (source && boolObj.test.test(source))
- return source;
- return value ? ctx.options.trueStr : ctx.options.falseStr;
-}
-var trueTag = {
- identify: (value) => value === true,
- default: true,
- tag: "tag:yaml.org,2002:bool",
- test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,
- resolve: () => new Scalar(true),
- stringify: boolStringify
-};
-var falseTag = {
- identify: (value) => value === false,
- default: true,
- tag: "tag:yaml.org,2002:bool",
- test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/i,
- resolve: () => new Scalar(false),
- stringify: boolStringify
-};
-
-// node_modules/yaml/browser/dist/schema/yaml-1.1/float.js
-var floatNaN2 = {
- identify: (value) => typeof value === "number",
- default: true,
- tag: "tag:yaml.org,2002:float",
- test: /^[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN)$/,
- resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
- stringify: stringifyNumber
-};
-var floatExp2 = {
- identify: (value) => typeof value === "number",
- default: true,
- tag: "tag:yaml.org,2002:float",
- format: "EXP",
- test: /^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,
- resolve: (str) => parseFloat(str.replace(/_/g, "")),
- stringify(node) {
- const num = Number(node.value);
- return isFinite(num) ? num.toExponential() : stringifyNumber(node);
- }
-};
-var float2 = {
- identify: (value) => typeof value === "number",
- default: true,
- tag: "tag:yaml.org,2002:float",
- test: /^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,
- resolve(str) {
- const node = new Scalar(parseFloat(str.replace(/_/g, "")));
- const dot = str.indexOf(".");
- if (dot !== -1) {
- const f = str.substring(dot + 1).replace(/_/g, "");
- if (f[f.length - 1] === "0")
- node.minFractionDigits = f.length;
- }
- return node;
- },
- stringify: stringifyNumber
-};
-
-// node_modules/yaml/browser/dist/schema/yaml-1.1/int.js
-var intIdentify3 = (value) => typeof value === "bigint" || Number.isInteger(value);
-function intResolve2(str, offset, radix, { intAsBigInt }) {
- const sign = str[0];
- if (sign === "-" || sign === "+")
- offset += 1;
- str = str.substring(offset).replace(/_/g, "");
- if (intAsBigInt) {
- switch (radix) {
- case 2:
- str = `0b${str}`;
- break;
- case 8:
- str = `0o${str}`;
- break;
- case 16:
- str = `0x${str}`;
- break;
- }
- const n2 = BigInt(str);
- return sign === "-" ? BigInt(-1) * n2 : n2;
- }
- const n = parseInt(str, radix);
- return sign === "-" ? -1 * n : n;
-}
-function intStringify2(node, radix, prefix) {
- const { value } = node;
- if (intIdentify3(value)) {
- const str = value.toString(radix);
- return value < 0 ? "-" + prefix + str.substr(1) : prefix + str;
- }
- return stringifyNumber(node);
-}
-var intBin = {
- identify: intIdentify3,
- default: true,
- tag: "tag:yaml.org,2002:int",
- format: "BIN",
- test: /^[-+]?0b[0-1_]+$/,
- resolve: (str, _onError, opt) => intResolve2(str, 2, 2, opt),
- stringify: (node) => intStringify2(node, 2, "0b")
-};
-var intOct2 = {
- identify: intIdentify3,
- default: true,
- tag: "tag:yaml.org,2002:int",
- format: "OCT",
- test: /^[-+]?0[0-7_]+$/,
- resolve: (str, _onError, opt) => intResolve2(str, 1, 8, opt),
- stringify: (node) => intStringify2(node, 8, "0")
-};
-var int2 = {
- identify: intIdentify3,
- default: true,
- tag: "tag:yaml.org,2002:int",
- test: /^[-+]?[0-9][0-9_]*$/,
- resolve: (str, _onError, opt) => intResolve2(str, 0, 10, opt),
- stringify: stringifyNumber
-};
-var intHex2 = {
- identify: intIdentify3,
- default: true,
- tag: "tag:yaml.org,2002:int",
- format: "HEX",
- test: /^[-+]?0x[0-9a-fA-F_]+$/,
- resolve: (str, _onError, opt) => intResolve2(str, 2, 16, opt),
- stringify: (node) => intStringify2(node, 16, "0x")
-};
-
-// node_modules/yaml/browser/dist/schema/yaml-1.1/set.js
-var YAMLSet = class extends YAMLMap {
- constructor(schema4) {
- super(schema4);
- this.tag = YAMLSet.tag;
- }
- add(key) {
- let pair;
- if (isPair(key))
- pair = key;
- else if (typeof key === "object" && "key" in key && "value" in key && key.value === null)
- pair = new Pair(key.key, null);
- else
- pair = new Pair(key, null);
- const prev = findPair(this.items, pair.key);
- if (!prev)
- this.items.push(pair);
- }
- get(key, keepPair) {
- const pair = findPair(this.items, key);
- return !keepPair && isPair(pair) ? isScalar(pair.key) ? pair.key.value : pair.key : pair;
- }
- set(key, value) {
- if (typeof value !== "boolean")
- throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`);
- const prev = findPair(this.items, key);
- if (prev && !value) {
- this.items.splice(this.items.indexOf(prev), 1);
- } else if (!prev && value) {
- this.items.push(new Pair(key));
- }
- }
- toJSON(_, ctx) {
- return super.toJSON(_, ctx, Set);
- }
- toString(ctx, onComment, onChompKeep) {
- if (!ctx)
- return JSON.stringify(this);
- if (this.hasAllNullValues(true))
- return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep);
- else
- throw new Error("Set items must all have null values");
- }
-};
-YAMLSet.tag = "tag:yaml.org,2002:set";
-var set = {
- collection: "map",
- identify: (value) => value instanceof Set,
- nodeClass: YAMLSet,
- default: false,
- tag: "tag:yaml.org,2002:set",
- resolve(map2, onError) {
- if (isMap(map2)) {
- if (map2.hasAllNullValues(true))
- return Object.assign(new YAMLSet(), map2);
- else
- onError("Set items must all have null values");
- } else
- onError("Expected a mapping for this tag");
- return map2;
- },
- createNode(schema4, iterable, ctx) {
- const { replacer } = ctx;
- const set2 = new YAMLSet(schema4);
- if (iterable && Symbol.iterator in Object(iterable))
- for (let value of iterable) {
- if (typeof replacer === "function")
- value = replacer.call(iterable, value, value);
- set2.items.push(createPair(value, null, ctx));
- }
- return set2;
- }
-};
-
-// node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js
-function parseSexagesimal(str, asBigInt) {
- const sign = str[0];
- const parts = sign === "-" || sign === "+" ? str.substring(1) : str;
- const num = (n) => asBigInt ? BigInt(n) : Number(n);
- const res = parts.replace(/_/g, "").split(":").reduce((res2, p) => res2 * num(60) + num(p), num(0));
- return sign === "-" ? num(-1) * res : res;
-}
-function stringifySexagesimal(node) {
- let { value } = node;
- let num = (n) => n;
- if (typeof value === "bigint")
- num = (n) => BigInt(n);
- else if (isNaN(value) || !isFinite(value))
- return stringifyNumber(node);
- let sign = "";
- if (value < 0) {
- sign = "-";
- value *= num(-1);
- }
- const _60 = num(60);
- const parts = [value % _60];
- if (value < 60) {
- parts.unshift(0);
- } else {
- value = (value - parts[0]) / _60;
- parts.unshift(value % _60);
- if (value >= 60) {
- value = (value - parts[0]) / _60;
- parts.unshift(value);
- }
- }
- return sign + parts.map((n) => n < 10 ? "0" + String(n) : String(n)).join(":").replace(/000000\d*$/, "");
-}
-var intTime = {
- identify: (value) => typeof value === "bigint" || Number.isInteger(value),
- default: true,
- tag: "tag:yaml.org,2002:int",
- format: "TIME",
- test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,
- resolve: (str, _onError, { intAsBigInt }) => parseSexagesimal(str, intAsBigInt),
- stringify: stringifySexagesimal
-};
-var floatTime = {
- identify: (value) => typeof value === "number",
- default: true,
- tag: "tag:yaml.org,2002:float",
- format: "TIME",
- test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,
- resolve: (str) => parseSexagesimal(str, false),
- stringify: stringifySexagesimal
-};
-var timestamp = {
- identify: (value) => value instanceof Date,
- default: true,
- tag: "tag:yaml.org,2002:timestamp",
- test: RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),
- resolve(str) {
- const match = str.match(timestamp.test);
- if (!match)
- throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");
- const [, year, month, day, hour, minute, second] = match.map(Number);
- const millisec = match[7] ? Number((match[7] + "00").substr(1, 3)) : 0;
- let date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec);
- const tz = match[8];
- if (tz && tz !== "Z") {
- let d = parseSexagesimal(tz, false);
- if (Math.abs(d) < 30)
- d *= 60;
- date -= 6e4 * d;
- }
- return new Date(date);
- },
- stringify: ({ value }) => value.toISOString().replace(/((T00:00)?:00)?\.000Z$/, "")
-};
-
-// node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js
-var schema3 = [
- map,
- seq,
- string,
- nullTag,
- trueTag,
- falseTag,
- intBin,
- intOct2,
- int2,
- intHex2,
- floatNaN2,
- floatExp2,
- float2,
- binary,
- omap,
- pairs,
- set,
- intTime,
- floatTime,
- timestamp
-];
-
-// node_modules/yaml/browser/dist/schema/tags.js
-var schemas = new Map([
- ["core", schema],
- ["failsafe", [map, seq, string]],
- ["json", schema2],
- ["yaml11", schema3],
- ["yaml-1.1", schema3]
-]);
-var tagsByName = {
- binary,
- bool: boolTag,
- float,
- floatExp,
- floatNaN,
- floatTime,
- int,
- intHex,
- intOct,
- intTime,
- map,
- null: nullTag,
- omap,
- pairs,
- seq,
- set,
- timestamp
-};
-var coreKnownTags = {
- "tag:yaml.org,2002:binary": binary,
- "tag:yaml.org,2002:omap": omap,
- "tag:yaml.org,2002:pairs": pairs,
- "tag:yaml.org,2002:set": set,
- "tag:yaml.org,2002:timestamp": timestamp
-};
-function getTags(customTags, schemaName) {
- let tags = schemas.get(schemaName);
- if (!tags) {
- if (Array.isArray(customTags))
- tags = [];
- else {
- const keys = Array.from(schemas.keys()).filter((key) => key !== "yaml11").map((key) => JSON.stringify(key)).join(", ");
- throw new Error(`Unknown schema "${schemaName}"; use one of ${keys} or define customTags array`);
- }
- }
- if (Array.isArray(customTags)) {
- for (const tag of customTags)
- tags = tags.concat(tag);
- } else if (typeof customTags === "function") {
- tags = customTags(tags.slice());
- }
- return tags.map((tag) => {
- if (typeof tag !== "string")
- return tag;
- const tagObj = tagsByName[tag];
- if (tagObj)
- return tagObj;
- const keys = Object.keys(tagsByName).map((key) => JSON.stringify(key)).join(", ");
- throw new Error(`Unknown custom tag "${tag}"; use one of ${keys}`);
- });
-}
-
-// node_modules/yaml/browser/dist/schema/Schema.js
-var sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0;
-var Schema = class {
- constructor({ compat, customTags, merge, resolveKnownTags, schema: schema4, sortMapEntries, toStringDefaults }) {
- this.compat = Array.isArray(compat) ? getTags(compat, "compat") : compat ? getTags(null, compat) : null;
- this.merge = !!merge;
- this.name = typeof schema4 === "string" && schema4 || "core";
- this.knownTags = resolveKnownTags ? coreKnownTags : {};
- this.tags = getTags(customTags, this.name);
- this.toStringOptions = toStringDefaults != null ? toStringDefaults : null;
- Object.defineProperty(this, MAP, { value: map });
- Object.defineProperty(this, SCALAR, { value: string });
- Object.defineProperty(this, SEQ, { value: seq });
- this.sortMapEntries = typeof sortMapEntries === "function" ? sortMapEntries : sortMapEntries === true ? sortMapEntriesByKey : null;
- }
- clone() {
- const copy = Object.create(Schema.prototype, Object.getOwnPropertyDescriptors(this));
- copy.tags = this.tags.slice();
- return copy;
- }
-};
-
-// node_modules/yaml/browser/dist/stringify/stringifyDocument.js
-function stringifyDocument(doc, options) {
- var _a;
- const lines = [];
- let hasDirectives = options.directives === true;
- if (options.directives !== false && doc.directives) {
- const dir = doc.directives.toString(doc);
- if (dir) {
- lines.push(dir);
- hasDirectives = true;
- } else if (doc.directives.docStart)
- hasDirectives = true;
- }
- if (hasDirectives)
- lines.push("---");
- const ctx = createStringifyContext(doc, options);
- const { commentString } = ctx.options;
- if (doc.commentBefore) {
- if (lines.length !== 1)
- lines.unshift("");
- const cs = commentString(doc.commentBefore);
- lines.unshift(indentComment(cs, ""));
- }
- let chompKeep = false;
- let contentComment = null;
- if (doc.contents) {
- if (isNode(doc.contents)) {
- if (doc.contents.spaceBefore && hasDirectives)
- lines.push("");
- if (doc.contents.commentBefore) {
- const cs = commentString(doc.contents.commentBefore);
- lines.push(indentComment(cs, ""));
- }
- ctx.forceBlockIndent = !!doc.comment;
- contentComment = doc.contents.comment;
- }
- const onChompKeep = contentComment ? void 0 : () => chompKeep = true;
- let body = stringify(doc.contents, ctx, () => contentComment = null, onChompKeep);
- if (contentComment)
- body += lineComment(body, "", commentString(contentComment));
- if ((body[0] === "|" || body[0] === ">") && lines[lines.length - 1] === "---") {
- lines[lines.length - 1] = `--- ${body}`;
- } else
- lines.push(body);
- } else {
- lines.push(stringify(doc.contents, ctx));
- }
- if ((_a = doc.directives) == null ? void 0 : _a.docEnd) {
- if (doc.comment) {
- const cs = commentString(doc.comment);
- if (cs.includes("\n")) {
- lines.push("...");
- lines.push(indentComment(cs, ""));
- } else {
- lines.push(`... ${cs}`);
- }
- } else {
- lines.push("...");
- }
- } else {
- let dc = doc.comment;
- if (dc && chompKeep)
- dc = dc.replace(/^\n+/, "");
- if (dc) {
- if ((!chompKeep || contentComment) && lines[lines.length - 1] !== "")
- lines.push("");
- lines.push(indentComment(commentString(dc), ""));
- }
- }
- return lines.join("\n") + "\n";
-}
-
-// node_modules/yaml/browser/dist/doc/applyReviver.js
-function applyReviver(reviver, obj, key, val) {
- if (val && typeof val === "object") {
- if (Array.isArray(val)) {
- for (let i = 0, len = val.length; i < len; ++i) {
- const v0 = val[i];
- const v1 = applyReviver(reviver, val, String(i), v0);
- if (v1 === void 0)
- delete val[i];
- else if (v1 !== v0)
- val[i] = v1;
- }
- } else if (val instanceof Map) {
- for (const k of Array.from(val.keys())) {
- const v0 = val.get(k);
- const v1 = applyReviver(reviver, val, k, v0);
- if (v1 === void 0)
- val.delete(k);
- else if (v1 !== v0)
- val.set(k, v1);
- }
- } else if (val instanceof Set) {
- for (const v0 of Array.from(val)) {
- const v1 = applyReviver(reviver, val, v0, v0);
- if (v1 === void 0)
- val.delete(v0);
- else if (v1 !== v0) {
- val.delete(v0);
- val.add(v1);
- }
- }
- } else {
- for (const [k, v0] of Object.entries(val)) {
- const v1 = applyReviver(reviver, val, k, v0);
- if (v1 === void 0)
- delete val[k];
- else if (v1 !== v0)
- val[k] = v1;
- }
- }
- }
- return reviver.call(obj, key, val);
-}
-
-// node_modules/yaml/browser/dist/doc/Document.js
-var Document = class {
- constructor(value, replacer, options) {
- this.commentBefore = null;
- this.comment = null;
- this.errors = [];
- this.warnings = [];
- Object.defineProperty(this, NODE_TYPE, { value: DOC });
- let _replacer = null;
- if (typeof replacer === "function" || Array.isArray(replacer)) {
- _replacer = replacer;
- } else if (options === void 0 && replacer) {
- options = replacer;
- replacer = void 0;
- }
- const opt = Object.assign({
- intAsBigInt: false,
- keepSourceTokens: false,
- logLevel: "warn",
- prettyErrors: true,
- strict: true,
- uniqueKeys: true,
- version: "1.2"
- }, options);
- this.options = opt;
- let { version } = opt;
- if (options == null ? void 0 : options._directives) {
- this.directives = options._directives.atDocument();
- if (this.directives.yaml.explicit)
- version = this.directives.yaml.version;
- } else
- this.directives = new Directives({ version });
- this.setSchema(version, options);
- if (value === void 0)
- this.contents = null;
- else {
- this.contents = this.createNode(value, _replacer, options);
- }
- }
- clone() {
- const copy = Object.create(Document.prototype, {
- [NODE_TYPE]: { value: DOC }
- });
- copy.commentBefore = this.commentBefore;
- copy.comment = this.comment;
- copy.errors = this.errors.slice();
- copy.warnings = this.warnings.slice();
- copy.options = Object.assign({}, this.options);
- if (this.directives)
- copy.directives = this.directives.clone();
- copy.schema = this.schema.clone();
- copy.contents = isNode(this.contents) ? this.contents.clone(copy.schema) : this.contents;
- if (this.range)
- copy.range = this.range.slice();
- return copy;
- }
- add(value) {
- if (assertCollection(this.contents))
- this.contents.add(value);
- }
- addIn(path, value) {
- if (assertCollection(this.contents))
- this.contents.addIn(path, value);
- }
- createAlias(node, name) {
- if (!node.anchor) {
- const prev = anchorNames(this);
- node.anchor = !name || prev.has(name) ? findNewAnchor(name || "a", prev) : name;
- }
- return new Alias(node.anchor);
- }
- createNode(value, replacer, options) {
- let _replacer = void 0;
- if (typeof replacer === "function") {
- value = replacer.call({ "": value }, "", value);
- _replacer = replacer;
- } else if (Array.isArray(replacer)) {
- const keyToStr = (v) => typeof v === "number" || v instanceof String || v instanceof Number;
- const asStr = replacer.filter(keyToStr).map(String);
- if (asStr.length > 0)
- replacer = replacer.concat(asStr);
- _replacer = replacer;
- } else if (options === void 0 && replacer) {
- options = replacer;
- replacer = void 0;
- }
- const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options != null ? options : {};
- const { onAnchor, setAnchors, sourceObjects } = createNodeAnchors(this, anchorPrefix || "a");
- const ctx = {
- aliasDuplicateObjects: aliasDuplicateObjects != null ? aliasDuplicateObjects : true,
- keepUndefined: keepUndefined != null ? keepUndefined : false,
- onAnchor,
- onTagObj,
- replacer: _replacer,
- schema: this.schema,
- sourceObjects
- };
- const node = createNode(value, tag, ctx);
- if (flow && isCollection(node))
- node.flow = true;
- setAnchors();
- return node;
- }
- createPair(key, value, options = {}) {
- const k = this.createNode(key, null, options);
- const v = this.createNode(value, null, options);
- return new Pair(k, v);
- }
- delete(key) {
- return assertCollection(this.contents) ? this.contents.delete(key) : false;
- }
- deleteIn(path) {
- if (isEmptyPath(path)) {
- if (this.contents == null)
- return false;
- this.contents = null;
- return true;
- }
- return assertCollection(this.contents) ? this.contents.deleteIn(path) : false;
- }
- get(key, keepScalar) {
- return isCollection(this.contents) ? this.contents.get(key, keepScalar) : void 0;
- }
- getIn(path, keepScalar) {
- if (isEmptyPath(path))
- return !keepScalar && isScalar(this.contents) ? this.contents.value : this.contents;
- return isCollection(this.contents) ? this.contents.getIn(path, keepScalar) : void 0;
- }
- has(key) {
- return isCollection(this.contents) ? this.contents.has(key) : false;
- }
- hasIn(path) {
- if (isEmptyPath(path))
- return this.contents !== void 0;
- return isCollection(this.contents) ? this.contents.hasIn(path) : false;
- }
- set(key, value) {
- if (this.contents == null) {
- this.contents = collectionFromPath(this.schema, [key], value);
- } else if (assertCollection(this.contents)) {
- this.contents.set(key, value);
- }
- }
- setIn(path, value) {
- if (isEmptyPath(path))
- this.contents = value;
- else if (this.contents == null) {
- this.contents = collectionFromPath(this.schema, Array.from(path), value);
- } else if (assertCollection(this.contents)) {
- this.contents.setIn(path, value);
- }
- }
- setSchema(version, options = {}) {
- if (typeof version === "number")
- version = String(version);
- let opt;
- switch (version) {
- case "1.1":
- if (this.directives)
- this.directives.yaml.version = "1.1";
- else
- this.directives = new Directives({ version: "1.1" });
- opt = { merge: true, resolveKnownTags: false, schema: "yaml-1.1" };
- break;
- case "1.2":
- case "next":
- if (this.directives)
- this.directives.yaml.version = version;
- else
- this.directives = new Directives({ version });
- opt = { merge: false, resolveKnownTags: true, schema: "core" };
- break;
- case null:
- if (this.directives)
- delete this.directives;
- opt = null;
- break;
- default: {
- const sv = JSON.stringify(version);
- throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${sv}`);
- }
- }
- if (options.schema instanceof Object)
- this.schema = options.schema;
- else if (opt)
- this.schema = new Schema(Object.assign(opt, options));
- else
- throw new Error(`With a null YAML version, the { schema: Schema } option is required`);
- }
- toJS({ json, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) {
- const ctx = {
- anchors: new Map(),
- doc: this,
- keep: !json,
- mapAsMap: mapAsMap === true,
- mapKeyWarned: false,
- maxAliasCount: typeof maxAliasCount === "number" ? maxAliasCount : 100,
- stringify
- };
- const res = toJS(this.contents, jsonArg != null ? jsonArg : "", ctx);
- if (typeof onAnchor === "function")
- for (const { count, res: res2 } of ctx.anchors.values())
- onAnchor(res2, count);
- return typeof reviver === "function" ? applyReviver(reviver, { "": res }, "", res) : res;
- }
- toJSON(jsonArg, onAnchor) {
- return this.toJS({ json: true, jsonArg, mapAsMap: false, onAnchor });
- }
- toString(options = {}) {
- if (this.errors.length > 0)
- throw new Error("Document with errors cannot be stringified");
- if ("indent" in options && (!Number.isInteger(options.indent) || Number(options.indent) <= 0)) {
- const s = JSON.stringify(options.indent);
- throw new Error(`"indent" option must be a positive integer, not ${s}`);
- }
- return stringifyDocument(this, options);
- }
-};
-function assertCollection(contents) {
- if (isCollection(contents))
- return true;
- throw new Error("Expected a YAML collection as document contents");
-}
-
-// node_modules/yaml/browser/dist/parse/cst-visit.js
-var BREAK2 = Symbol("break visit");
-var SKIP2 = Symbol("skip children");
-var REMOVE2 = Symbol("remove item");
-function visit2(cst, visitor) {
- if ("type" in cst && cst.type === "document")
- cst = { start: cst.start, value: cst.value };
- _visit(Object.freeze([]), cst, visitor);
-}
-visit2.BREAK = BREAK2;
-visit2.SKIP = SKIP2;
-visit2.REMOVE = REMOVE2;
-visit2.itemAtPath = (cst, path) => {
- let item = cst;
- for (const [field, index] of path) {
- const tok = item == null ? void 0 : item[field];
- if (tok && "items" in tok) {
- item = tok.items[index];
- } else
- return void 0;
- }
- return item;
-};
-visit2.parentCollection = (cst, path) => {
- const parent = visit2.itemAtPath(cst, path.slice(0, -1));
- const field = path[path.length - 1][0];
- const coll = parent == null ? void 0 : parent[field];
- if (coll && "items" in coll)
- return coll;
- throw new Error("Parent collection not found");
-};
-function _visit(path, item, visitor) {
- let ctrl = visitor(item, path);
- if (typeof ctrl === "symbol")
- return ctrl;
- for (const field of ["key", "value"]) {
- const token = item[field];
- if (token && "items" in token) {
- for (let i = 0; i < token.items.length; ++i) {
- const ci = _visit(Object.freeze(path.concat([[field, i]])), token.items[i], visitor);
- if (typeof ci === "number")
- i = ci - 1;
- else if (ci === BREAK2)
- return BREAK2;
- else if (ci === REMOVE2) {
- token.items.splice(i, 1);
- i -= 1;
- }
- }
- if (typeof ctrl === "function" && field === "key")
- ctrl = ctrl(item, path);
- }
- }
- return typeof ctrl === "function" ? ctrl(item, path) : ctrl;
-}
-
-// node_modules/yaml/browser/dist/parse/lexer.js
-var hexDigits = "0123456789ABCDEFabcdef".split("");
-var tagChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()".split("");
-var invalidFlowScalarChars = ",[]{}".split("");
-var invalidAnchorChars = " ,[]{}\n\r ".split("");
-
-// node_modules/yaml/browser/dist/public-api.js
-function stringify3(value, replacer, options) {
- var _a;
- let _replacer = null;
- if (typeof replacer === "function" || Array.isArray(replacer)) {
- _replacer = replacer;
- } else if (options === void 0 && replacer) {
- options = replacer;
- }
- if (typeof options === "string")
- options = options.length;
- if (typeof options === "number") {
- const indent = Math.round(options);
- options = indent < 1 ? void 0 : indent > 8 ? { indent: 8 } : { indent };
- }
- if (value === void 0) {
- const { keepUndefined } = (_a = options != null ? options : replacer) != null ? _a : {};
- if (!keepUndefined)
- return void 0;
- }
- return new Document(value, _replacer, options).toString(options);
-}
-
-// Upload2Notion.ts
-var Upload2Notion = class {
- constructor(app) {
- this.app = app;
- }
- createPage(title, childArr) {
- return __async(this, null, function* () {
- const bodyString = {
- parent: {
- database_id: this.app.settings.databaseID
- },
- properties: {
- Name: {
- title: [
- {
- text: {
- content: title
- }
- }
- ]
- }
- },
- children: childArr
- };
- const response = yield (0, import_obsidian2.requestUrl)({
- url: `https://api.notion.com/v1/pages`,
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- "Authorization": "Bearer " + this.app.settings.notionAPI,
- "Notion-Version": "2021-08-16"
- },
- body: JSON.stringify(bodyString)
- });
- return response;
- });
- }
- syncMarkdownToNotion(title, markdown, fullPath) {
- return __async(this, null, function* () {
- const yamlObj = loadFront(markdown);
- const __content = yamlObj.__content;
- const file2md = (0, import_martian.markdownToBlocks)(__content);
- const res = yield this.createPage(title, file2md);
- if (res.status === 200) {
- this.updateYamlInfo(markdown, fullPath, res);
- }
- return res;
- });
- }
- updateYamlInfo(yamlContent, fullPath, res) {
- return __async(this, null, function* () {
- const yamlObj = loadFront(yamlContent);
- const { url } = res.json;
- yamlObj.link = url;
- const __content = yamlObj.__content;
- delete yamlObj.__content;
- const yamlhead = stringify3(yamlObj);
- const yamlhead_remove_n = yamlhead.replace(/\n$/, "");
- const __content_remove_n = __content.replace(/^\n/, "");
- const content = "---\n" + yamlhead_remove_n + "\n---\n" + __content_remove_n;
- fs.writeFileSync(fullPath, content);
- return res;
- });
- }
-};
-
-// main.ts
-var DEFAULT_SETTINGS = {
- notionAPI: "",
- databaseID: "",
- proxy: ""
-};
-var MyPlugin = class extends import_obsidian3.Plugin {
- onload() {
- return __async(this, null, function* () {
- yield this.loadSettings();
- addIcons();
- const ribbonIconEl = this.addRibbonIcon("notion-logo", "Share to notion", (evt) => __async(this, null, function* () {
- this.upload();
- }));
- ribbonIconEl.addClass("my-plugin-ribbon-class");
- const statusBarItemEl = this.addStatusBarItem();
- this.addCommand({
- id: "share-to-notion",
- name: "share to notion",
- editorCallback: (editor, view) => __async(this, null, function* () {
- this.upload();
- })
- });
- this.addSettingTab(new SampleSettingTab(this.app, this));
- });
- }
- onunload() {
- }
- upload() {
- return __async(this, null, function* () {
- const { notionAPI, databaseID } = this.settings;
- if (notionAPI === "" || databaseID === "") {
- new import_obsidian3.Notice("Please set up the notion API and database ID in the settings tab.");
- return;
- }
- const { nowFile, fileData, fullPath } = yield this.getNowFileMarkdwonContent(this.app);
- const { basename } = nowFile;
- if (fileData) {
- const upload = new Upload2Notion(this);
- const res = yield upload.syncMarkdownToNotion(basename, fileData, fullPath);
- console.log(res);
- if (res.status === 200) {
- new import_obsidian3.Notice(`${basename} \u540C\u6B65\u6210\u529F`);
- } else {
- new import_obsidian3.Notice(`${basename} \u540C\u6B65\u5931\u8D25`);
- }
- }
- });
- }
- getNowFileMarkdwonContent(app) {
- return __async(this, null, function* () {
- const nowFile = app.workspace.getActiveFile();
- if (nowFile) {
- const filePath = nowFile.path;
- const basePath = nowFile.vault.adapter.basePath;
- const fullPath = (0, import_obsidian3.normalizePath)((0, import_path.join)(basePath, filePath));
- console.log("fullpath", fullPath);
- const fileData = fs2.readFileSync(fullPath, "utf8");
- return {
- fileData,
- nowFile,
- fullPath
- };
- } else {
- new import_obsidian3.Notice("\u8BF7\u6253\u5F00\u9700\u8981\u540C\u6B65\u7684\u6587\u4EF6");
- return;
- }
- });
- }
- loadSettings() {
- return __async(this, null, function* () {
- this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
- });
- }
- saveSettings() {
- return __async(this, null, function* () {
- yield this.saveData(this.settings);
- });
- }
-};
-var SampleSettingTab = class extends import_obsidian3.PluginSettingTab {
- constructor(app, plugin) {
- super(app, plugin);
- this.plugin = plugin;
- }
- display() {
- const { containerEl } = this;
- containerEl.empty();
- containerEl.createEl("h2", {
- text: "Settings for obsidian to notion plugin."
- });
- new import_obsidian3.Setting(containerEl).setName("Notion API Token").setDesc("It's a secret").addText((text) => text.setPlaceholder("Enter your Notion API Token").setValue(this.plugin.settings.notionAPI).onChange((value) => __async(this, null, function* () {
- console.log("Secret: " + value);
- this.plugin.settings.notionAPI = value;
- yield this.plugin.saveSettings();
- })));
- new import_obsidian3.Setting(containerEl).setName("Database ID").setDesc("It's a secret").addText((text) => text.setPlaceholder("Enter your Database ID").setValue(this.plugin.settings.databaseID).onChange((value) => __async(this, null, function* () {
- console.log("Secret: " + value);
- this.plugin.settings.databaseID = value;
- yield this.plugin.saveSettings();
- })));
- }
-};
-/*!
- * Determine if an object is a Buffer
- *
- * @author Feross Aboukhadijeh
- * @license MIT
- */
-/*!
- * repeat-string
- *
- * Copyright (c) 2014-2015, Jon Schlinkert.
- * Licensed under the MIT License.
- */
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2JhaWwvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2lzLWJ1ZmZlci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXh0ZW5kL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmovaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3Ryb3VnaC93cmFwLmpzIiwgIm5vZGVfbW9kdWxlcy90cm91Z2gvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy92ZmlsZS1tZXNzYWdlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy92ZmlsZS9saWIvbWlucGF0aC5icm93c2VyLmpzIiwgIm5vZGVfbW9kdWxlcy92ZmlsZS9saWIvbWlucHJvYy5icm93c2VyLmpzIiwgIm5vZGVfbW9kdWxlcy92ZmlsZS9saWIvY29yZS5qcyIsICJub2RlX21vZHVsZXMvdmZpbGUvbGliL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy92ZmlsZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvdW5pZmllZC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1zdHJpbmcvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L2NvbnN0YW50L2Fzc2lnbi5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY29uc3RhbnQvaGFzLW93bi1wcm9wZXJ0eS5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdXRpbC9ub3JtYWxpemUtaWRlbnRpZmllci5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY29uc3RhbnQvZnJvbS1jaGFyLWNvZGUuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3V0aWwvc2FmZS1mcm9tLWludC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9jaGFyYWN0ZXIvbWFya2Rvd24tc3BhY2UuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2ZhY3Rvcnktc3BhY2UuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L2luaXRpYWxpemUvY29udGVudC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvcGFydGlhbC1ibGFuay1saW5lLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9pbml0aWFsaXplL2RvY3VtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC91dGlsL3NpemUtY2h1bmtzLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC91dGlsL3ByZWZpeC1zaXplLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9jb25zdGFudC9zcGxpY2UuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3V0aWwvY2h1bmtlZC1zcGxpY2UuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3V0aWwvc2hhbGxvdy5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdXRpbC9zdWJ0b2tlbml6ZS5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvY29udGVudC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvaW5pdGlhbGl6ZS9mbG93LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9pbml0aWFsaXplL3RleHQuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3V0aWwvbWluaWZsYXQuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3V0aWwvY29tYmluZS1leHRlbnNpb25zLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC91dGlsL2NodW5rZWQtcHVzaC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdXRpbC9yZXNvbHZlLWFsbC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdXRpbC9zZXJpYWxpemUtY2h1bmtzLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC91dGlsL3NsaWNlLWNodW5rcy5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdXRpbC9jcmVhdGUtdG9rZW5pemVyLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmctb3Itc3BhY2UuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L2NvbnN0YW50L3VuaWNvZGUtcHVuY3R1YXRpb24tcmVnZXguanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3V0aWwvcmVnZXgtY2hlY2suanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci91bmljb2RlLXB1bmN0dWF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9jaGFyYWN0ZXIvdW5pY29kZS13aGl0ZXNwYWNlLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC91dGlsL2NsYXNzaWZ5LWNoYXJhY3Rlci5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdXRpbC9tb3ZlLXBvaW50LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9hdHRlbnRpb24uanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci9hc2NpaS1hbHBoYS5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY2hhcmFjdGVyL2FzY2lpLWFscGhhbnVtZXJpYy5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY2hhcmFjdGVyL2FzY2lpLWF0ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9jaGFyYWN0ZXIvYXNjaWktY29udHJvbC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvYXV0b2xpbmsuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2Jsb2NrLXF1b3RlLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9jaGFyYWN0ZXIvYXNjaWktcHVuY3R1YXRpb24uanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2NoYXJhY3Rlci1lc2NhcGUuanMiLCAibm9kZV9tb2R1bGVzL3BhcnNlLWVudGl0aWVzL2RlY29kZS1lbnRpdHkuYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY2hhcmFjdGVyL2FzY2lpLWRpZ2l0LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9jaGFyYWN0ZXIvYXNjaWktaGV4LWRpZ2l0LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9jaGFyYWN0ZXItcmVmZXJlbmNlLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9jb2RlLWZlbmNlZC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvY29kZS1pbmRlbnRlZC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvY29kZS10ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9mYWN0b3J5LWRlc3RpbmF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9mYWN0b3J5LWxhYmVsLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9mYWN0b3J5LXdoaXRlc3BhY2UuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2ZhY3RvcnktdGl0bGUuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2RlZmluaXRpb24uanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2hhcmQtYnJlYWstZXNjYXBlLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9oZWFkaW5nLWF0eC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY29uc3RhbnQvaHRtbC1ibG9jay1uYW1lcy5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY29uc3RhbnQvaHRtbC1yYXctbmFtZXMuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2h0bWwtZmxvdy5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvaHRtbC10ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9sYWJlbC1lbmQuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2xhYmVsLXN0YXJ0LWltYWdlLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9sYWJlbC1zdGFydC1saW5rLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9saW5lLWVuZGluZy5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvdGhlbWF0aWMtYnJlYWsuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2xpc3QuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL3NldGV4dC11bmRlcmxpbmUuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L2NvbnN0cnVjdHMuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3BhcnNlLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9wcmVwcm9jZXNzLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9wb3N0cHJvY2Vzcy5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duL2Rpc3QvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZnJvbS1tYXJrZG93bi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvcmVtYXJrLXBhcnNlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9AdHJ5ZmFicmljL21hcnRpYW4vc3JjL25vdGlvbi9ibG9ja3MudHMiLCAibm9kZV9tb2R1bGVzL0B0cnlmYWJyaWMvbWFydGlhbi9zcmMvbm90aW9uL2NvbW1vbi50cyIsICJub2RlX21vZHVsZXMvQHRyeWZhYnJpYy9tYXJ0aWFuL3NyYy9ub3Rpb24vaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL0B0cnlmYWJyaWMvbWFydGlhbi9zcmMvcGFyc2VyL2ludGVybmFsLnRzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1hdXRvbGluay1saXRlcmFsL3N5bnRheC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tc3RyaWtldGhyb3VnaC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGUvc3ludGF4LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWJsZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFzay1saXN0LWl0ZW0vc3ludGF4LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YXNrLWxpc3QtaXRlbS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0vc3ludGF4LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY2NvdW50L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy91bmlzdC11dGlsLWlzL2NvbnZlcnQuanMiLCAibm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9jb2xvci5icm93c2VyLmpzIiwgIm5vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0LXBhcmVudHMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2VzY2FwZS1zdHJpbmctcmVnZXhwL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZpbmQtYW5kLXJlcGxhY2UvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLWF1dG9saW5rLWxpdGVyYWwvZnJvbS1tYXJrZG93bi5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tc3RyaWtldGhyb3VnaC9mcm9tLW1hcmtkb3duLmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS10YWJsZS9mcm9tLW1hcmtkb3duLmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS10YXNrLWxpc3QtaXRlbS9mcm9tLW1hcmtkb3duLmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS9mcm9tLW1hcmtkb3duLmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS1hdXRvbGluay1saXRlcmFsL3RvLW1hcmtkb3duLmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbnRhaW5lci1waHJhc2luZy5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tc3RyaWtldGhyb3VnaC90by1tYXJrZG93bi5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9wYXR0ZXJuLWNvbXBpbGUuanMiLCAibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9pbmxpbmUtY29kZS5qcyIsICJub2RlX21vZHVsZXMvcmVwZWF0LXN0cmluZy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWFya2Rvd24tdGFibGUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXRhYmxlL3RvLW1hcmtkb3duLmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLWJ1bGxldC5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1saXN0LWl0ZW0taW5kZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbnRhaW5lci1mbG93LmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2luZGVudC1saW5lcy5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2xpc3QtaXRlbS5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tdGFzay1saXN0LWl0ZW0vdG8tbWFya2Rvd24uanMiLCAibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2NvbmZpZ3VyZS5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0vdG8tbWFya2Rvd24uanMiLCAibm9kZV9tb2R1bGVzL3JlbWFyay1nZm0vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0B0cnlmYWJyaWMvbWFydGlhbi9zcmMvaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvY29tbW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2V4Y2VwdGlvbi5qcyIsICJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9tYXJrLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUuanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc3RyLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2VxLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWFwLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZS5qcyIsICJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL251bGwuanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9ib29sLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvaW50LmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvZmxvYXQuanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2pzb24uanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2NvcmUuanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS90aW1lc3RhbXAuanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcyIsICJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2JpbmFyeS5qcyIsICJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL29tYXAuanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9wYWlycy5qcyIsICJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NldC5qcyIsICJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvdW5kZWZpbmVkLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvcmVnZXhwLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvZnVuY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbC5qcyIsICJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9sb2FkZXIuanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvZHVtcGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2luZGV4LmpzIiwgIm1haW4udHMiLCAiaWNvbi50cyIsICJVcGxvYWQyTm90aW9uLnRzIiwgIm5vZGVfbW9kdWxlcy95YW1sLWZyb250LW1hdHRlci9zcmMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL05vZGUuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3Zpc2l0LmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9kb2MvZGlyZWN0aXZlcy5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL2FuY2hvcnMuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL0FsaWFzLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy90b0pTLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9TY2FsYXIuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2RvYy9jcmVhdGVOb2RlLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9Db2xsZWN0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5Q29tbWVudC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L2ZvbGRGbG93TGluZXMuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnlTdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnkuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnlQYWlyLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9sb2cuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL2FkZFBhaXJUb0pTTWFwLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9QYWlyLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5Q29sbGVjdGlvbi5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvWUFNTE1hcC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvbW1vbi9tYXAuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL1lBTUxTZXEuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9jb21tb24vc2VxLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29tbW9uL3N0cmluZy5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvbW1vbi9udWxsLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29yZS9ib29sLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5TnVtYmVyLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29yZS9mbG9hdC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvcmUvaW50LmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29yZS9zY2hlbWEuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9qc29uL3NjaGVtYS5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL2JpbmFyeS5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3BhaXJzLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvb21hcC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL2Jvb2wuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9mbG9hdC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL2ludC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3NldC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3RpbWVzdGFtcC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3NjaGVtYS5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3RhZ3MuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9TY2hlbWEuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnlEb2N1bWVudC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL2FwcGx5UmV2aXZlci5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL0RvY3VtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9jc3QtdmlzaXQuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3BhcnNlL2xleGVyLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wdWJsaWMtYXBpLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBiYWlsXG5cbmZ1bmN0aW9uIGJhaWwoZXJyKSB7XG4gIGlmIChlcnIpIHtcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuIiwgIi8qIVxuICogRGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIEJ1ZmZlclxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IgIT0gbnVsbCAmJlxuICAgIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIGlzQXJyYXkgPSBmdW5jdGlvbiBpc0FycmF5KGFycikge1xuXHRpZiAodHlwZW9mIEFycmF5LmlzQXJyYXkgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShhcnIpO1xuXHR9XG5cblx0cmV0dXJuIHRvU3RyLmNhbGwoYXJyKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cbnZhciBpc1BsYWluT2JqZWN0ID0gZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcblx0aWYgKCFvYmogfHwgdG9TdHIuY2FsbChvYmopICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHZhciBoYXNPd25Db25zdHJ1Y3RvciA9IGhhc093bi5jYWxsKG9iaiwgJ2NvbnN0cnVjdG9yJyk7XG5cdHZhciBoYXNJc1Byb3RvdHlwZU9mID0gb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgJ2lzUHJvdG90eXBlT2YnKTtcblx0Ly8gTm90IG93biBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVjdFxuXHRpZiAob2JqLmNvbnN0cnVjdG9yICYmICFoYXNPd25Db25zdHJ1Y3RvciAmJiAhaGFzSXNQcm90b3R5cGVPZikge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIE93biBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLFxuXHQvLyBpZiBsYXN0IG9uZSBpcyBvd24sIHRoZW4gYWxsIHByb3BlcnRpZXMgYXJlIG93bi5cblx0dmFyIGtleTtcblx0Zm9yIChrZXkgaW4gb2JqKSB7IC8qKi8gfVxuXG5cdHJldHVybiB0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJyB8fCBoYXNPd24uY2FsbChvYmosIGtleSk7XG59O1xuXG4vLyBJZiBuYW1lIGlzICdfX3Byb3RvX18nLCBhbmQgT2JqZWN0LmRlZmluZVByb3BlcnR5IGlzIGF2YWlsYWJsZSwgZGVmaW5lIF9fcHJvdG9fXyBhcyBhbiBvd24gcHJvcGVydHkgb24gdGFyZ2V0XG52YXIgc2V0UHJvcGVydHkgPSBmdW5jdGlvbiBzZXRQcm9wZXJ0eSh0YXJnZXQsIG9wdGlvbnMpIHtcblx0aWYgKGRlZmluZVByb3BlcnR5ICYmIG9wdGlvbnMubmFtZSA9PT0gJ19fcHJvdG9fXycpIHtcblx0XHRkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIG9wdGlvbnMubmFtZSwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBvcHRpb25zLm5ld1ZhbHVlLFxuXHRcdFx0d3JpdGFibGU6IHRydWVcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR0YXJnZXRbb3B0aW9ucy5uYW1lXSA9IG9wdGlvbnMubmV3VmFsdWU7XG5cdH1cbn07XG5cbi8vIFJldHVybiB1bmRlZmluZWQgaW5zdGVhZCBvZiBfX3Byb3RvX18gaWYgJ19fcHJvdG9fXycgaXMgbm90IGFuIG93biBwcm9wZXJ0eVxudmFyIGdldFByb3BlcnR5ID0gZnVuY3Rpb24gZ2V0UHJvcGVydHkob2JqLCBuYW1lKSB7XG5cdGlmIChuYW1lID09PSAnX19wcm90b19fJykge1xuXHRcdGlmICghaGFzT3duLmNhbGwob2JqLCBuYW1lKSkge1xuXHRcdFx0cmV0dXJuIHZvaWQgMDtcblx0XHR9IGVsc2UgaWYgKGdPUEQpIHtcblx0XHRcdC8vIEluIGVhcmx5IHZlcnNpb25zIG9mIG5vZGUsIG9ialsnX19wcm90b19fJ10gaXMgYnVnZ3kgd2hlbiBvYmogaGFzXG5cdFx0XHQvLyBfX3Byb3RvX18gYXMgYW4gb3duIHByb3BlcnR5LiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKCkgd29ya3MuXG5cdFx0XHRyZXR1cm4gZ09QRChvYmosIG5hbWUpLnZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBvYmpbbmFtZV07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV4dGVuZCgpIHtcblx0dmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lO1xuXHR2YXIgdGFyZ2V0ID0gYXJndW1lbnRzWzBdO1xuXHR2YXIgaSA9IDE7XG5cdHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuXHR2YXIgZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKHR5cGVvZiB0YXJnZXQgPT09ICdib29sZWFuJykge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9O1xuXHRcdC8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXRcblx0XHRpID0gMjtcblx0fVxuXHRpZiAodGFyZ2V0ID09IG51bGwgfHwgKHR5cGVvZiB0YXJnZXQgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YXJnZXQgIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHRmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0b3B0aW9ucyA9IGFyZ3VtZW50c1tpXTtcblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yIChuYW1lIGluIG9wdGlvbnMpIHtcblx0XHRcdFx0c3JjID0gZ2V0UHJvcGVydHkodGFyZ2V0LCBuYW1lKTtcblx0XHRcdFx0Y29weSA9IGdldFByb3BlcnR5KG9wdGlvbnMsIG5hbWUpO1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3Bcblx0XHRcdFx0aWYgKHRhcmdldCAhPT0gY29weSkge1xuXHRcdFx0XHRcdC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5c1xuXHRcdFx0XHRcdGlmIChkZWVwICYmIGNvcHkgJiYgKGlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0gaXNBcnJheShjb3B5KSkpKSB7XG5cdFx0XHRcdFx0XHRpZiAoY29weUlzQXJyYXkpIHtcblx0XHRcdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgaXNBcnJheShzcmMpID8gc3JjIDogW107XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBpc1BsYWluT2JqZWN0KHNyYykgPyBzcmMgOiB7fTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtXG5cdFx0XHRcdFx0XHRzZXRQcm9wZXJ0eSh0YXJnZXQsIHsgbmFtZTogbmFtZSwgbmV3VmFsdWU6IGV4dGVuZChkZWVwLCBjbG9uZSwgY29weSkgfSk7XG5cblx0XHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgY29weSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHRcdHNldFByb3BlcnR5KHRhcmdldCwgeyBuYW1lOiBuYW1lLCBuZXdWYWx1ZTogY29weSB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWUgPT4ge1xuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gcHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBzbGljZSA9IFtdLnNsaWNlXG5cbm1vZHVsZS5leHBvcnRzID0gd3JhcFxuXG4vLyBXcmFwIGBmbmAuXG4vLyBDYW4gYmUgc3luYyBvciBhc3luYzsgcmV0dXJuIGEgcHJvbWlzZSwgcmVjZWl2ZSBhIGNvbXBsZXRpb24gaGFuZGxlciwgcmV0dXJuXG4vLyBuZXcgdmFsdWVzIGFuZCBlcnJvcnMuXG5mdW5jdGlvbiB3cmFwKGZuLCBjYWxsYmFjaykge1xuICB2YXIgaW52b2tlZFxuXG4gIHJldHVybiB3cmFwcGVkXG5cbiAgZnVuY3Rpb24gd3JhcHBlZCgpIHtcbiAgICB2YXIgcGFyYW1zID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDApXG4gICAgdmFyIGNhbGxiYWNrID0gZm4ubGVuZ3RoID4gcGFyYW1zLmxlbmd0aFxuICAgIHZhciByZXN1bHRcblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgcGFyYW1zLnB1c2goZG9uZSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZm4uYXBwbHkobnVsbCwgcGFyYW1zKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBXZWxsLCB0aGlzIGlzIHF1aXRlIHRoZSBwaWNrbGUuXG4gICAgICAvLyBgZm5gIHJlY2VpdmVkIGEgY2FsbGJhY2sgYW5kIGludm9rZWQgaXQgKHRodXMgY29udGludWluZyB0aGUgcGlwZWxpbmUpLFxuICAgICAgLy8gYnV0IGxhdGVyIGFsc28gdGhyZXcgYW4gZXJyb3IuXG4gICAgICAvLyBXZVx1MjAxOXJlIG5vdCBhYm91dCB0byByZXN0YXJ0IHRoZSBwaXBlbGluZSBhZ2Fpbiwgc28gdGhlIG9ubHkgdGhpbmcgbGVmdFxuICAgICAgLy8gdG8gZG8gaXMgdG8gdGhyb3cgdGhlIHRoaW5nIGluc3RlYWQuXG4gICAgICBpZiAoY2FsbGJhY2sgJiYgaW52b2tlZCkge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZG9uZShlcnJvcilcbiAgICB9XG5cbiAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXN1bHQudGhlbih0aGVuLCBkb25lKVxuICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBkb25lKHJlc3VsdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoZW4ocmVzdWx0KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEludm9rZSBgbmV4dGAsIG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICBpZiAoIWludm9rZWQpIHtcbiAgICAgIGludm9rZWQgPSB0cnVlXG5cbiAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cylcbiAgICB9XG4gIH1cblxuICAvLyBJbnZva2UgYGRvbmVgIHdpdGggb25lIHZhbHVlLlxuICAvLyBUcmFja3MgaWYgYW4gZXJyb3IgaXMgcGFzc2VkLCB0b28uXG4gIGZ1bmN0aW9uIHRoZW4odmFsdWUpIHtcbiAgICBkb25lKG51bGwsIHZhbHVlKVxuICB9XG59XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciB3cmFwID0gcmVxdWlyZSgnLi93cmFwLmpzJylcblxubW9kdWxlLmV4cG9ydHMgPSB0cm91Z2hcblxudHJvdWdoLndyYXAgPSB3cmFwXG5cbnZhciBzbGljZSA9IFtdLnNsaWNlXG5cbi8vIENyZWF0ZSBuZXcgbWlkZGxld2FyZS5cbmZ1bmN0aW9uIHRyb3VnaCgpIHtcbiAgdmFyIGZucyA9IFtdXG4gIHZhciBtaWRkbGV3YXJlID0ge31cblxuICBtaWRkbGV3YXJlLnJ1biA9IHJ1blxuICBtaWRkbGV3YXJlLnVzZSA9IHVzZVxuXG4gIHJldHVybiBtaWRkbGV3YXJlXG5cbiAgLy8gUnVuIGBmbnNgLiAgTGFzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29tcGxldGlvbiBoYW5kbGVyLlxuICBmdW5jdGlvbiBydW4oKSB7XG4gICAgdmFyIGluZGV4ID0gLTFcbiAgICB2YXIgaW5wdXQgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpXG4gICAgdmFyIGRvbmUgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdXG5cbiAgICBpZiAodHlwZW9mIGRvbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZnVuY3Rpb24gYXMgbGFzdCBhcmd1bWVudCwgbm90ICcgKyBkb25lKVxuICAgIH1cblxuICAgIG5leHQuYXBwbHkobnVsbCwgW251bGxdLmNvbmNhdChpbnB1dCkpXG5cbiAgICAvLyBSdW4gdGhlIG5leHQgYGZuYCwgaWYgYW55LlxuICAgIGZ1bmN0aW9uIG5leHQoZXJyKSB7XG4gICAgICB2YXIgZm4gPSBmbnNbKytpbmRleF1cbiAgICAgIHZhciBwYXJhbXMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMClcbiAgICAgIHZhciB2YWx1ZXMgPSBwYXJhbXMuc2xpY2UoMSlcbiAgICAgIHZhciBsZW5ndGggPSBpbnB1dC5sZW5ndGhcbiAgICAgIHZhciBwb3MgPSAtMVxuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGRvbmUoZXJyKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gQ29weSBub24tbnVsbHkgaW5wdXQgaW50byB2YWx1ZXMuXG4gICAgICB3aGlsZSAoKytwb3MgPCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKHZhbHVlc1twb3NdID09PSBudWxsIHx8IHZhbHVlc1twb3NdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YWx1ZXNbcG9zXSA9IGlucHV0W3Bvc11cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpbnB1dCA9IHZhbHVlc1xuXG4gICAgICAvLyBOZXh0IG9yIGRvbmUuXG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgd3JhcChmbiwgbmV4dCkuYXBwbHkobnVsbCwgaW5wdXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lLmFwcGx5KG51bGwsIFtudWxsXS5jb25jYXQoaW5wdXQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBgZm5gIHRvIHRoZSBsaXN0LlxuICBmdW5jdGlvbiB1c2UoZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGBmbmAgdG8gYmUgYSBmdW5jdGlvbiwgbm90ICcgKyBmbilcbiAgICB9XG5cbiAgICBmbnMucHVzaChmbilcblxuICAgIHJldHVybiBtaWRkbGV3YXJlXG4gIH1cbn1cbiIsICIndXNlIHN0cmljdCdcblxudmFyIG93biA9IHt9Lmhhc093blByb3BlcnR5XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5naWZ5XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeSh2YWx1ZSkge1xuICAvLyBOb3RoaW5nLlxuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIE5vZGUuXG4gIGlmIChvd24uY2FsbCh2YWx1ZSwgJ3Bvc2l0aW9uJykgfHwgb3duLmNhbGwodmFsdWUsICd0eXBlJykpIHtcbiAgICByZXR1cm4gcG9zaXRpb24odmFsdWUucG9zaXRpb24pXG4gIH1cblxuICAvLyBQb3NpdGlvbi5cbiAgaWYgKG93bi5jYWxsKHZhbHVlLCAnc3RhcnQnKSB8fCBvd24uY2FsbCh2YWx1ZSwgJ2VuZCcpKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uKHZhbHVlKVxuICB9XG5cbiAgLy8gUG9pbnQuXG4gIGlmIChvd24uY2FsbCh2YWx1ZSwgJ2xpbmUnKSB8fCBvd24uY2FsbCh2YWx1ZSwgJ2NvbHVtbicpKSB7XG4gICAgcmV0dXJuIHBvaW50KHZhbHVlKVxuICB9XG5cbiAgLy8gP1xuICByZXR1cm4gJydcbn1cblxuZnVuY3Rpb24gcG9pbnQocG9pbnQpIHtcbiAgaWYgKCFwb2ludCB8fCB0eXBlb2YgcG9pbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcG9pbnQgPSB7fVxuICB9XG5cbiAgcmV0dXJuIGluZGV4KHBvaW50LmxpbmUpICsgJzonICsgaW5kZXgocG9pbnQuY29sdW1uKVxufVxuXG5mdW5jdGlvbiBwb3NpdGlvbihwb3MpIHtcbiAgaWYgKCFwb3MgfHwgdHlwZW9mIHBvcyAhPT0gJ29iamVjdCcpIHtcbiAgICBwb3MgPSB7fVxuICB9XG5cbiAgcmV0dXJuIHBvaW50KHBvcy5zdGFydCkgKyAnLScgKyBwb2ludChwb3MuZW5kKVxufVxuXG5mdW5jdGlvbiBpbmRleCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogMVxufVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgc3RyaW5naWZ5ID0gcmVxdWlyZSgndW5pc3QtdXRpbC1zdHJpbmdpZnktcG9zaXRpb24nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IFZNZXNzYWdlXG5cbi8vIEluaGVyaXQgZnJvbSBgRXJyb3IjYC5cbmZ1bmN0aW9uIFZNZXNzYWdlUHJvdG90eXBlKCkge31cblZNZXNzYWdlUHJvdG90eXBlLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZVxuVk1lc3NhZ2UucHJvdG90eXBlID0gbmV3IFZNZXNzYWdlUHJvdG90eXBlKClcblxuLy8gTWVzc2FnZSBwcm9wZXJ0aWVzLlxudmFyIHByb3RvID0gVk1lc3NhZ2UucHJvdG90eXBlXG5cbnByb3RvLmZpbGUgPSAnJ1xucHJvdG8ubmFtZSA9ICcnXG5wcm90by5yZWFzb24gPSAnJ1xucHJvdG8ubWVzc2FnZSA9ICcnXG5wcm90by5zdGFjayA9ICcnXG5wcm90by5mYXRhbCA9IG51bGxcbnByb3RvLmNvbHVtbiA9IG51bGxcbnByb3RvLmxpbmUgPSBudWxsXG5cbi8vIENvbnN0cnVjdCBhIG5ldyBWTWVzc2FnZS5cbi8vXG4vLyBOb3RlOiBXZSBjYW5ub3QgaW52b2tlIGBFcnJvcmAgb24gdGhlIGNyZWF0ZWQgY29udGV4dCwgYXMgdGhhdCBhZGRzIHJlYWRvbmx5XG4vLyBgbGluZWAgYW5kIGBjb2x1bW5gIGF0dHJpYnV0ZXMgb24gU2FmYXJpIDksIHRodXMgdGhyb3dpbmcgYW5kIGZhaWxpbmcgdGhlXG4vLyBkYXRhLlxuZnVuY3Rpb24gVk1lc3NhZ2UocmVhc29uLCBwb3NpdGlvbiwgb3JpZ2luKSB7XG4gIHZhciBwYXJ0c1xuICB2YXIgcmFuZ2VcbiAgdmFyIGxvY2F0aW9uXG5cbiAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBvcmlnaW4gPSBwb3NpdGlvblxuICAgIHBvc2l0aW9uID0gbnVsbFxuICB9XG5cbiAgcGFydHMgPSBwYXJzZU9yaWdpbihvcmlnaW4pXG4gIHJhbmdlID0gc3RyaW5naWZ5KHBvc2l0aW9uKSB8fCAnMToxJ1xuXG4gIGxvY2F0aW9uID0ge1xuICAgIHN0YXJ0OiB7bGluZTogbnVsbCwgY29sdW1uOiBudWxsfSxcbiAgICBlbmQ6IHtsaW5lOiBudWxsLCBjb2x1bW46IG51bGx9XG4gIH1cblxuICAvLyBOb2RlLlxuICBpZiAocG9zaXRpb24gJiYgcG9zaXRpb24ucG9zaXRpb24pIHtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLnBvc2l0aW9uXG4gIH1cblxuICBpZiAocG9zaXRpb24pIHtcbiAgICAvLyBQb3NpdGlvbi5cbiAgICBpZiAocG9zaXRpb24uc3RhcnQpIHtcbiAgICAgIGxvY2F0aW9uID0gcG9zaXRpb25cbiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24uc3RhcnRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUG9pbnQuXG4gICAgICBsb2NhdGlvbi5zdGFydCA9IHBvc2l0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKHJlYXNvbi5zdGFjaykge1xuICAgIHRoaXMuc3RhY2sgPSByZWFzb24uc3RhY2tcbiAgICByZWFzb24gPSByZWFzb24ubWVzc2FnZVxuICB9XG5cbiAgdGhpcy5tZXNzYWdlID0gcmVhc29uXG4gIHRoaXMubmFtZSA9IHJhbmdlXG4gIHRoaXMucmVhc29uID0gcmVhc29uXG4gIHRoaXMubGluZSA9IHBvc2l0aW9uID8gcG9zaXRpb24ubGluZSA6IG51bGxcbiAgdGhpcy5jb2x1bW4gPSBwb3NpdGlvbiA/IHBvc2l0aW9uLmNvbHVtbiA6IG51bGxcbiAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uXG4gIHRoaXMuc291cmNlID0gcGFydHNbMF1cbiAgdGhpcy5ydWxlSWQgPSBwYXJ0c1sxXVxufVxuXG5mdW5jdGlvbiBwYXJzZU9yaWdpbihvcmlnaW4pIHtcbiAgdmFyIHJlc3VsdCA9IFtudWxsLCBudWxsXVxuICB2YXIgaW5kZXhcblxuICBpZiAodHlwZW9mIG9yaWdpbiA9PT0gJ3N0cmluZycpIHtcbiAgICBpbmRleCA9IG9yaWdpbi5pbmRleE9mKCc6JylcblxuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJlc3VsdFsxXSA9IG9yaWdpblxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRbMF0gPSBvcmlnaW4uc2xpY2UoMCwgaW5kZXgpXG4gICAgICByZXN1bHRbMV0gPSBvcmlnaW4uc2xpY2UoaW5kZXggKyAxKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cbiIsICIndXNlIHN0cmljdCdcblxuLy8gQSBkZXJpdmF0aXZlIHdvcmsgYmFzZWQgb246XG4vLyA8aHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJpZnkvcGF0aC1icm93c2VyaWZ5Pi5cbi8vIFdoaWNoIGlzIGxpY2Vuc2VkOlxuLy9cbi8vIE1JVCBMaWNlbnNlXG4vL1xuLy8gQ29weXJpZ2h0IChjKSAyMDEzIEphbWVzIEhhbGxpZGF5XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZlxuLy8gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpblxuLy8gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0b1xuLy8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2Zcbi8vIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuLy8gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTU1xuLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SXG4vLyBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVJcbi8vIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOXG4vLyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuLy8gQSBkZXJpdmF0aXZlIHdvcmsgYmFzZWQgb246XG4vL1xuLy8gUGFydHMgb2YgdGhhdCBhcmUgZXh0cmFjdGVkIGZyb20gTm9kZVx1MjAxOXMgaW50ZXJuYWwgYHBhdGhgIG1vZHVsZTpcbi8vIDxodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9tYXN0ZXIvbGliL3BhdGguanM+LlxuLy8gV2hpY2ggaXMgbGljZW5zZWQ6XG4vL1xuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbmV4cG9ydHMuYmFzZW5hbWUgPSBiYXNlbmFtZVxuZXhwb3J0cy5kaXJuYW1lID0gZGlybmFtZVxuZXhwb3J0cy5leHRuYW1lID0gZXh0bmFtZVxuZXhwb3J0cy5qb2luID0gam9pblxuZXhwb3J0cy5zZXAgPSAnLydcblxuZnVuY3Rpb24gYmFzZW5hbWUocGF0aCwgZXh0KSB7XG4gIHZhciBzdGFydCA9IDBcbiAgdmFyIGVuZCA9IC0xXG4gIHZhciBpbmRleFxuICB2YXIgZmlyc3ROb25TbGFzaEVuZFxuICB2YXIgc2Vlbk5vblNsYXNoXG4gIHZhciBleHRJbmRleFxuXG4gIGlmIChleHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZXh0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZXh0XCIgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZycpXG4gIH1cblxuICBhc3NlcnRQYXRoKHBhdGgpXG4gIGluZGV4ID0gcGF0aC5sZW5ndGhcblxuICBpZiAoZXh0ID09PSB1bmRlZmluZWQgfHwgIWV4dC5sZW5ndGggfHwgZXh0Lmxlbmd0aCA+IHBhdGgubGVuZ3RoKSB7XG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIGlmIChwYXRoLmNoYXJDb2RlQXQoaW5kZXgpID09PSA0NyAvKiBgL2AgKi8pIHtcbiAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGhcbiAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93LlxuICAgICAgICBpZiAoc2Vlbk5vblNsYXNoKSB7XG4gICAgICAgICAgc3RhcnQgPSBpbmRleCArIDFcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGVuZCA8IDApIHtcbiAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91clxuICAgICAgICAvLyBwYXRoIGNvbXBvbmVudC5cbiAgICAgICAgc2Vlbk5vblNsYXNoID0gdHJ1ZVxuICAgICAgICBlbmQgPSBpbmRleCArIDFcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW5kIDwgMCA/ICcnIDogcGF0aC5zbGljZShzdGFydCwgZW5kKVxuICB9XG5cbiAgaWYgKGV4dCA9PT0gcGF0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgZmlyc3ROb25TbGFzaEVuZCA9IC0xXG4gIGV4dEluZGV4ID0gZXh0Lmxlbmd0aCAtIDFcblxuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIGlmIChwYXRoLmNoYXJDb2RlQXQoaW5kZXgpID09PSA0NyAvKiBgL2AgKi8pIHtcbiAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoXG4gICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3cuXG4gICAgICBpZiAoc2Vlbk5vblNsYXNoKSB7XG4gICAgICAgIHN0YXJ0ID0gaW5kZXggKyAxXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmaXJzdE5vblNsYXNoRW5kIDwgMCkge1xuICAgICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvciwgcmVtZW1iZXIgdGhpcyBpbmRleCBpbiBjYXNlXG4gICAgICAgIC8vIHdlIG5lZWQgaXQgaWYgdGhlIGV4dGVuc2lvbiBlbmRzIHVwIG5vdCBtYXRjaGluZy5cbiAgICAgICAgc2Vlbk5vblNsYXNoID0gdHJ1ZVxuICAgICAgICBmaXJzdE5vblNsYXNoRW5kID0gaW5kZXggKyAxXG4gICAgICB9XG5cbiAgICAgIGlmIChleHRJbmRleCA+IC0xKSB7XG4gICAgICAgIC8vIFRyeSB0byBtYXRjaCB0aGUgZXhwbGljaXQgZXh0ZW5zaW9uLlxuICAgICAgICBpZiAocGF0aC5jaGFyQ29kZUF0KGluZGV4KSA9PT0gZXh0LmNoYXJDb2RlQXQoZXh0SW5kZXgtLSkpIHtcbiAgICAgICAgICBpZiAoZXh0SW5kZXggPCAwKSB7XG4gICAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBleHRlbnNpb24sIHNvIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91ciBwYXRoXG4gICAgICAgICAgICAvLyBjb21wb25lbnRcbiAgICAgICAgICAgIGVuZCA9IGluZGV4XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEV4dGVuc2lvbiBkb2VzIG5vdCBtYXRjaCwgc28gb3VyIHJlc3VsdCBpcyB0aGUgZW50aXJlIHBhdGhcbiAgICAgICAgICAvLyBjb21wb25lbnRcbiAgICAgICAgICBleHRJbmRleCA9IC0xXG4gICAgICAgICAgZW5kID0gZmlyc3ROb25TbGFzaEVuZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcbiAgICBlbmQgPSBmaXJzdE5vblNsYXNoRW5kXG4gIH0gZWxzZSBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCA9IHBhdGgubGVuZ3RoXG4gIH1cblxuICByZXR1cm4gcGF0aC5zbGljZShzdGFydCwgZW5kKVxufVxuXG5mdW5jdGlvbiBkaXJuYW1lKHBhdGgpIHtcbiAgdmFyIGVuZFxuICB2YXIgdW5tYXRjaGVkU2xhc2hcbiAgdmFyIGluZGV4XG5cbiAgYXNzZXJ0UGF0aChwYXRoKVxuXG4gIGlmICghcGF0aC5sZW5ndGgpIHtcbiAgICByZXR1cm4gJy4nXG4gIH1cblxuICBlbmQgPSAtMVxuICBpbmRleCA9IHBhdGgubGVuZ3RoXG5cbiAgLy8gUHJlZml4IGAtLWAgaXMgaW1wb3J0YW50IHRvIG5vdCBydW4gb24gYDBgLlxuICB3aGlsZSAoLS1pbmRleCkge1xuICAgIGlmIChwYXRoLmNoYXJDb2RlQXQoaW5kZXgpID09PSA0NyAvKiBgL2AgKi8pIHtcbiAgICAgIGlmICh1bm1hdGNoZWRTbGFzaCkge1xuICAgICAgICBlbmQgPSBpbmRleFxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXVubWF0Y2hlZFNsYXNoKSB7XG4gICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvclxuICAgICAgdW5tYXRjaGVkU2xhc2ggPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVuZCA8IDBcbiAgICA/IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyogYC9gICovXG4gICAgICA/ICcvJ1xuICAgICAgOiAnLidcbiAgICA6IGVuZCA9PT0gMSAmJiBwYXRoLmNoYXJDb2RlQXQoMCkgPT09IDQ3IC8qIGAvYCAqL1xuICAgID8gJy8vJ1xuICAgIDogcGF0aC5zbGljZSgwLCBlbmQpXG59XG5cbmZ1bmN0aW9uIGV4dG5hbWUocGF0aCkge1xuICB2YXIgc3RhcnREb3QgPSAtMVxuICB2YXIgc3RhcnRQYXJ0ID0gMFxuICB2YXIgZW5kID0gLTFcbiAgLy8gVHJhY2sgdGhlIHN0YXRlIG9mIGNoYXJhY3RlcnMgKGlmIGFueSkgd2Ugc2VlIGJlZm9yZSBvdXIgZmlyc3QgZG90IGFuZFxuICAvLyBhZnRlciBhbnkgcGF0aCBzZXBhcmF0b3Igd2UgZmluZC5cbiAgdmFyIHByZURvdFN0YXRlID0gMFxuICB2YXIgdW5tYXRjaGVkU2xhc2hcbiAgdmFyIGNvZGVcbiAgdmFyIGluZGV4XG5cbiAgYXNzZXJ0UGF0aChwYXRoKVxuXG4gIGluZGV4ID0gcGF0aC5sZW5ndGhcblxuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaW5kZXgpXG5cbiAgICBpZiAoY29kZSA9PT0gNDcgLyogYC9gICovKSB7XG4gICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aFxuICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93LlxuICAgICAgaWYgKHVubWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgIHN0YXJ0UGFydCA9IGluZGV4ICsgMVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvciwgbWFyayB0aGlzIGFzIHRoZSBlbmQgb2Ygb3VyXG4gICAgICAvLyBleHRlbnNpb24uXG4gICAgICB1bm1hdGNoZWRTbGFzaCA9IHRydWVcbiAgICAgIGVuZCA9IGluZGV4ICsgMVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA0NiAvKiBgLmAgKi8pIHtcbiAgICAgIC8vIElmIHRoaXMgaXMgb3VyIGZpcnN0IGRvdCwgbWFyayBpdCBhcyB0aGUgc3RhcnQgb2Ygb3VyIGV4dGVuc2lvbi5cbiAgICAgIGlmIChzdGFydERvdCA8IDApIHtcbiAgICAgICAgc3RhcnREb3QgPSBpbmRleFxuICAgICAgfSBlbHNlIGlmIChwcmVEb3RTdGF0ZSAhPT0gMSkge1xuICAgICAgICBwcmVEb3RTdGF0ZSA9IDFcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXJ0RG90ID4gLTEpIHtcbiAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgYW5kIG5vbi1wYXRoIHNlcGFyYXRvciBiZWZvcmUgb3VyIGRvdCwgc28gd2Ugc2hvdWxkXG4gICAgICAvLyBoYXZlIGEgZ29vZCBjaGFuY2UgYXQgaGF2aW5nIGEgbm9uLWVtcHR5IGV4dGVuc2lvbi5cbiAgICAgIHByZURvdFN0YXRlID0gLTFcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgc3RhcnREb3QgPCAwIHx8XG4gICAgZW5kIDwgMCB8fFxuICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgZG90LlxuICAgIHByZURvdFN0YXRlID09PSAwIHx8XG4gICAgLy8gVGhlIChyaWdodC1tb3N0KSB0cmltbWVkIHBhdGggY29tcG9uZW50IGlzIGV4YWN0bHkgYC4uYC5cbiAgICAocHJlRG90U3RhdGUgPT09IDEgJiYgc3RhcnREb3QgPT09IGVuZCAtIDEgJiYgc3RhcnREb3QgPT09IHN0YXJ0UGFydCArIDEpXG4gICkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnREb3QsIGVuZClcbn1cblxuZnVuY3Rpb24gam9pbigpIHtcbiAgdmFyIGluZGV4ID0gLTFcbiAgdmFyIGpvaW5lZFxuXG4gIHdoaWxlICgrK2luZGV4IDwgYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGFzc2VydFBhdGgoYXJndW1lbnRzW2luZGV4XSlcblxuICAgIGlmIChhcmd1bWVudHNbaW5kZXhdKSB7XG4gICAgICBqb2luZWQgPVxuICAgICAgICBqb2luZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gYXJndW1lbnRzW2luZGV4XVxuICAgICAgICAgIDogam9pbmVkICsgJy8nICsgYXJndW1lbnRzW2luZGV4XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBqb2luZWQgPT09IHVuZGVmaW5lZCA/ICcuJyA6IG5vcm1hbGl6ZShqb2luZWQpXG59XG5cbi8vIE5vdGU6IGBub3JtYWxpemVgIGlzIG5vdCBleHBvc2VkIGFzIGBwYXRoLm5vcm1hbGl6ZWAsIHNvIHNvbWUgY29kZSBpc1xuLy8gbWFudWFsbHkgcmVtb3ZlZCBmcm9tIGl0LlxuZnVuY3Rpb24gbm9ybWFsaXplKHBhdGgpIHtcbiAgdmFyIGFic29sdXRlXG4gIHZhciB2YWx1ZVxuXG4gIGFzc2VydFBhdGgocGF0aClcblxuICBhYnNvbHV0ZSA9IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyogYC9gICovXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoIGFjY29yZGluZyB0byBQT1NJWCBydWxlcy5cbiAgdmFsdWUgPSBub3JtYWxpemVTdHJpbmcocGF0aCwgIWFic29sdXRlKVxuXG4gIGlmICghdmFsdWUubGVuZ3RoICYmICFhYnNvbHV0ZSkge1xuICAgIHZhbHVlID0gJy4nXG4gIH1cblxuICBpZiAodmFsdWUubGVuZ3RoICYmIHBhdGguY2hhckNvZGVBdChwYXRoLmxlbmd0aCAtIDEpID09PSA0NyAvKiAvICovKSB7XG4gICAgdmFsdWUgKz0gJy8nXG4gIH1cblxuICByZXR1cm4gYWJzb2x1dGUgPyAnLycgKyB2YWx1ZSA6IHZhbHVlXG59XG5cbi8vIFJlc29sdmUgYC5gIGFuZCBgLi5gIGVsZW1lbnRzIGluIGEgcGF0aCB3aXRoIGRpcmVjdG9yeSBuYW1lcy5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZyhwYXRoLCBhbGxvd0Fib3ZlUm9vdCkge1xuICB2YXIgcmVzdWx0ID0gJydcbiAgdmFyIGxhc3RTZWdtZW50TGVuZ3RoID0gMFxuICB2YXIgbGFzdFNsYXNoID0gLTFcbiAgdmFyIGRvdHMgPSAwXG4gIHZhciBpbmRleCA9IC0xXG4gIHZhciBjb2RlXG4gIHZhciBsYXN0U2xhc2hJbmRleFxuXG4gIHdoaWxlICgrK2luZGV4IDw9IHBhdGgubGVuZ3RoKSB7XG4gICAgaWYgKGluZGV4IDwgcGF0aC5sZW5ndGgpIHtcbiAgICAgIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaW5kZXgpXG4gICAgfSBlbHNlIGlmIChjb2RlID09PSA0NyAvKiBgL2AgKi8pIHtcbiAgICAgIGJyZWFrXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUgPSA0NyAvKiBgL2AgKi9cbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gNDcgLyogYC9gICovKSB7XG4gICAgICBpZiAobGFzdFNsYXNoID09PSBpbmRleCAtIDEgfHwgZG90cyA9PT0gMSkge1xuICAgICAgICAvLyBFbXB0eS5cbiAgICAgIH0gZWxzZSBpZiAobGFzdFNsYXNoICE9PSBpbmRleCAtIDEgJiYgZG90cyA9PT0gMikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzdWx0Lmxlbmd0aCA8IDIgfHxcbiAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCAhPT0gMiB8fFxuICAgICAgICAgIHJlc3VsdC5jaGFyQ29kZUF0KHJlc3VsdC5sZW5ndGggLSAxKSAhPT0gNDYgLyogYC5gICovIHx8XG4gICAgICAgICAgcmVzdWx0LmNoYXJDb2RlQXQocmVzdWx0Lmxlbmd0aCAtIDIpICE9PSA0NiAvKiBgLmAgKi9cbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICBsYXN0U2xhc2hJbmRleCA9IHJlc3VsdC5sYXN0SW5kZXhPZignLycpXG5cbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlIC0gTm8gY2x1ZSBob3cgdG8gY292ZXIgaXQuICovXG4gICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggIT09IHJlc3VsdC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAnJ1xuICAgICAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMFxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBsYXN0U2xhc2hJbmRleClcbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IHJlc3VsdC5sZW5ndGggLSAxIC0gcmVzdWx0Lmxhc3RJbmRleE9mKCcvJylcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxhc3RTbGFzaCA9IGluZGV4XG4gICAgICAgICAgICAgIGRvdHMgPSAwXG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSAnJ1xuICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwXG4gICAgICAgICAgICBsYXN0U2xhc2ggPSBpbmRleFxuICAgICAgICAgICAgZG90cyA9IDBcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lmxlbmd0aCA/IHJlc3VsdCArICcvLi4nIDogJy4uJ1xuICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMlxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdCArPSAnLycgKyBwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGluZGV4KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IHBhdGguc2xpY2UobGFzdFNsYXNoICsgMSwgaW5kZXgpXG4gICAgICAgIH1cblxuICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IGluZGV4IC0gbGFzdFNsYXNoIC0gMVxuICAgICAgfVxuXG4gICAgICBsYXN0U2xhc2ggPSBpbmRleFxuICAgICAgZG90cyA9IDBcbiAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDQ2IC8qIGAuYCAqLyAmJiBkb3RzID4gLTEpIHtcbiAgICAgIGRvdHMrK1xuICAgIH0gZWxzZSB7XG4gICAgICBkb3RzID0gLTFcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGFzc2VydFBhdGgocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdQYXRoIG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkICcgKyBKU09OLnN0cmluZ2lmeShwYXRoKVxuICAgIClcbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0J1xuXG4vLyBTb21ld2hhdCBiYXNlZCBvbjpcbi8vIDxodHRwczovL2dpdGh1Yi5jb20vZGVmdW5jdHpvbWJpZS9ub2RlLXByb2Nlc3MvYmxvYi9tYXN0ZXIvYnJvd3Nlci5qcz4uXG4vLyBCdXQgSSBkb25cdTIwMTl0IHRoaW5rIG9uZSB0aW55IGxpbmUgb2YgY29kZSBjYW4gYmUgY29weXJpZ2h0ZWQuIFx1RDgzRFx1REUwNVxuZXhwb3J0cy5jd2QgPSBjd2RcblxuZnVuY3Rpb24gY3dkKCkge1xuICByZXR1cm4gJy8nXG59XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBwID0gcmVxdWlyZSgnLi9taW5wYXRoJylcbnZhciBwcm9jID0gcmVxdWlyZSgnLi9taW5wcm9jJylcbnZhciBidWZmZXIgPSByZXF1aXJlKCdpcy1idWZmZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IFZGaWxlXG5cbnZhciBvd24gPSB7fS5oYXNPd25Qcm9wZXJ0eVxuXG4vLyBPcmRlciBvZiBzZXR0aW5nIChsZWFzdCBzcGVjaWZpYyB0byBtb3N0KSwgd2UgbmVlZCB0aGlzIGJlY2F1c2Ugb3RoZXJ3aXNlXG4vLyBge3N0ZW06ICdhJywgcGF0aDogJ34vYi5qcyd9YCB3b3VsZCB0aHJvdywgYXMgYSBwYXRoIGlzIG5lZWRlZCBiZWZvcmUgYVxuLy8gc3RlbSBjYW4gYmUgc2V0LlxudmFyIG9yZGVyID0gWydoaXN0b3J5JywgJ3BhdGgnLCAnYmFzZW5hbWUnLCAnc3RlbScsICdleHRuYW1lJywgJ2Rpcm5hbWUnXVxuXG5WRmlsZS5wcm90b3R5cGUudG9TdHJpbmcgPSB0b1N0cmluZ1xuXG4vLyBBY2Nlc3MgZnVsbCBwYXRoIChgfi9pbmRleC5taW4uanNgKS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWRmlsZS5wcm90b3R5cGUsICdwYXRoJywge2dldDogZ2V0UGF0aCwgc2V0OiBzZXRQYXRofSlcblxuLy8gQWNjZXNzIHBhcmVudCBwYXRoIChgfmApLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZGaWxlLnByb3RvdHlwZSwgJ2Rpcm5hbWUnLCB7XG4gIGdldDogZ2V0RGlybmFtZSxcbiAgc2V0OiBzZXREaXJuYW1lXG59KVxuXG4vLyBBY2Nlc3MgYmFzZW5hbWUgKGBpbmRleC5taW4uanNgKS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWRmlsZS5wcm90b3R5cGUsICdiYXNlbmFtZScsIHtcbiAgZ2V0OiBnZXRCYXNlbmFtZSxcbiAgc2V0OiBzZXRCYXNlbmFtZVxufSlcblxuLy8gQWNjZXNzIGV4dG5hbWUgKGAuanNgKS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWRmlsZS5wcm90b3R5cGUsICdleHRuYW1lJywge1xuICBnZXQ6IGdldEV4dG5hbWUsXG4gIHNldDogc2V0RXh0bmFtZVxufSlcblxuLy8gQWNjZXNzIHN0ZW0gKGBpbmRleC5taW5gKS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWRmlsZS5wcm90b3R5cGUsICdzdGVtJywge2dldDogZ2V0U3RlbSwgc2V0OiBzZXRTdGVtfSlcblxuLy8gQ29uc3RydWN0IGEgbmV3IGZpbGUuXG5mdW5jdGlvbiBWRmlsZShvcHRpb25zKSB7XG4gIHZhciBwcm9wXG4gIHZhciBpbmRleFxuXG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJyB8fCBidWZmZXIob3B0aW9ucykpIHtcbiAgICBvcHRpb25zID0ge2NvbnRlbnRzOiBvcHRpb25zfVxuICB9IGVsc2UgaWYgKCdtZXNzYWdlJyBpbiBvcHRpb25zICYmICdtZXNzYWdlcycgaW4gb3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zXG4gIH1cblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVkZpbGUpKSB7XG4gICAgcmV0dXJuIG5ldyBWRmlsZShvcHRpb25zKVxuICB9XG5cbiAgdGhpcy5kYXRhID0ge31cbiAgdGhpcy5tZXNzYWdlcyA9IFtdXG4gIHRoaXMuaGlzdG9yeSA9IFtdXG4gIHRoaXMuY3dkID0gcHJvYy5jd2QoKVxuXG4gIC8vIFNldCBwYXRoIHJlbGF0ZWQgcHJvcGVydGllcyBpbiB0aGUgY29ycmVjdCBvcmRlci5cbiAgaW5kZXggPSAtMVxuXG4gIHdoaWxlICgrK2luZGV4IDwgb3JkZXIubGVuZ3RoKSB7XG4gICAgcHJvcCA9IG9yZGVyW2luZGV4XVxuXG4gICAgaWYgKG93bi5jYWxsKG9wdGlvbnMsIHByb3ApKSB7XG4gICAgICB0aGlzW3Byb3BdID0gb3B0aW9uc1twcm9wXVxuICAgIH1cbiAgfVxuXG4gIC8vIFNldCBub24tcGF0aCByZWxhdGVkIHByb3BlcnRpZXMuXG4gIGZvciAocHJvcCBpbiBvcHRpb25zKSB7XG4gICAgaWYgKG9yZGVyLmluZGV4T2YocHJvcCkgPCAwKSB7XG4gICAgICB0aGlzW3Byb3BdID0gb3B0aW9uc1twcm9wXVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQYXRoKCkge1xuICByZXR1cm4gdGhpcy5oaXN0b3J5W3RoaXMuaGlzdG9yeS5sZW5ndGggLSAxXVxufVxuXG5mdW5jdGlvbiBzZXRQYXRoKHBhdGgpIHtcbiAgYXNzZXJ0Tm9uRW1wdHkocGF0aCwgJ3BhdGgnKVxuXG4gIGlmICh0aGlzLnBhdGggIT09IHBhdGgpIHtcbiAgICB0aGlzLmhpc3RvcnkucHVzaChwYXRoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERpcm5hbWUoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcy5wYXRoID09PSAnc3RyaW5nJyA/IHAuZGlybmFtZSh0aGlzLnBhdGgpIDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIHNldERpcm5hbWUoZGlybmFtZSkge1xuICBhc3NlcnRQYXRoKHRoaXMucGF0aCwgJ2Rpcm5hbWUnKVxuICB0aGlzLnBhdGggPSBwLmpvaW4oZGlybmFtZSB8fCAnJywgdGhpcy5iYXNlbmFtZSlcbn1cblxuZnVuY3Rpb24gZ2V0QmFzZW5hbWUoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcy5wYXRoID09PSAnc3RyaW5nJyA/IHAuYmFzZW5hbWUodGhpcy5wYXRoKSA6IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBzZXRCYXNlbmFtZShiYXNlbmFtZSkge1xuICBhc3NlcnROb25FbXB0eShiYXNlbmFtZSwgJ2Jhc2VuYW1lJylcbiAgYXNzZXJ0UGFydChiYXNlbmFtZSwgJ2Jhc2VuYW1lJylcbiAgdGhpcy5wYXRoID0gcC5qb2luKHRoaXMuZGlybmFtZSB8fCAnJywgYmFzZW5hbWUpXG59XG5cbmZ1bmN0aW9uIGdldEV4dG5hbWUoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcy5wYXRoID09PSAnc3RyaW5nJyA/IHAuZXh0bmFtZSh0aGlzLnBhdGgpIDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIHNldEV4dG5hbWUoZXh0bmFtZSkge1xuICBhc3NlcnRQYXJ0KGV4dG5hbWUsICdleHRuYW1lJylcbiAgYXNzZXJ0UGF0aCh0aGlzLnBhdGgsICdleHRuYW1lJylcblxuICBpZiAoZXh0bmFtZSkge1xuICAgIGlmIChleHRuYW1lLmNoYXJDb2RlQXQoMCkgIT09IDQ2IC8qIGAuYCAqLykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdgZXh0bmFtZWAgbXVzdCBzdGFydCB3aXRoIGAuYCcpXG4gICAgfVxuXG4gICAgaWYgKGV4dG5hbWUuaW5kZXhPZignLicsIDEpID4gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYGV4dG5hbWVgIGNhbm5vdCBjb250YWluIG11bHRpcGxlIGRvdHMnKVxuICAgIH1cbiAgfVxuXG4gIHRoaXMucGF0aCA9IHAuam9pbih0aGlzLmRpcm5hbWUsIHRoaXMuc3RlbSArIChleHRuYW1lIHx8ICcnKSlcbn1cblxuZnVuY3Rpb24gZ2V0U3RlbSgpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzLnBhdGggPT09ICdzdHJpbmcnXG4gICAgPyBwLmJhc2VuYW1lKHRoaXMucGF0aCwgdGhpcy5leHRuYW1lKVxuICAgIDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIHNldFN0ZW0oc3RlbSkge1xuICBhc3NlcnROb25FbXB0eShzdGVtLCAnc3RlbScpXG4gIGFzc2VydFBhcnQoc3RlbSwgJ3N0ZW0nKVxuICB0aGlzLnBhdGggPSBwLmpvaW4odGhpcy5kaXJuYW1lIHx8ICcnLCBzdGVtICsgKHRoaXMuZXh0bmFtZSB8fCAnJykpXG59XG5cbi8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGZpbGUuXG5mdW5jdGlvbiB0b1N0cmluZyhlbmNvZGluZykge1xuICByZXR1cm4gKHRoaXMuY29udGVudHMgfHwgJycpLnRvU3RyaW5nKGVuY29kaW5nKVxufVxuXG4vLyBBc3NlcnQgdGhhdCBgcGFydGAgaXMgbm90IGEgcGF0aCAoaS5lLiwgZG9lcyBub3QgY29udGFpbiBgcC5zZXBgKS5cbmZ1bmN0aW9uIGFzc2VydFBhcnQocGFydCwgbmFtZSkge1xuICBpZiAocGFydCAmJiBwYXJ0LmluZGV4T2YocC5zZXApID4gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnYCcgKyBuYW1lICsgJ2AgY2Fubm90IGJlIGEgcGF0aDogZGlkIG5vdCBleHBlY3QgYCcgKyBwLnNlcCArICdgJ1xuICAgIClcbiAgfVxufVxuXG4vLyBBc3NlcnQgdGhhdCBgcGFydGAgaXMgbm90IGVtcHR5LlxuZnVuY3Rpb24gYXNzZXJ0Tm9uRW1wdHkocGFydCwgbmFtZSkge1xuICBpZiAoIXBhcnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2AnICsgbmFtZSArICdgIGNhbm5vdCBiZSBlbXB0eScpXG4gIH1cbn1cblxuLy8gQXNzZXJ0IGBwYXRoYCBleGlzdHMuXG5mdW5jdGlvbiBhc3NlcnRQYXRoKHBhdGgsIG5hbWUpIHtcbiAgaWYgKCFwYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTZXR0aW5nIGAnICsgbmFtZSArICdgIHJlcXVpcmVzIGBwYXRoYCB0byBiZSBzZXQgdG9vJylcbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgVk1lc3NhZ2UgPSByZXF1aXJlKCd2ZmlsZS1tZXNzYWdlJylcbnZhciBWRmlsZSA9IHJlcXVpcmUoJy4vY29yZS5qcycpXG5cbm1vZHVsZS5leHBvcnRzID0gVkZpbGVcblxuVkZpbGUucHJvdG90eXBlLm1lc3NhZ2UgPSBtZXNzYWdlXG5WRmlsZS5wcm90b3R5cGUuaW5mbyA9IGluZm9cblZGaWxlLnByb3RvdHlwZS5mYWlsID0gZmFpbFxuXG4vLyBDcmVhdGUgYSBtZXNzYWdlIHdpdGggYHJlYXNvbmAgYXQgYHBvc2l0aW9uYC5cbi8vIFdoZW4gYW4gZXJyb3IgaXMgcGFzc2VkIGluIGFzIGByZWFzb25gLCBjb3BpZXMgdGhlIHN0YWNrLlxuZnVuY3Rpb24gbWVzc2FnZShyZWFzb24sIHBvc2l0aW9uLCBvcmlnaW4pIHtcbiAgdmFyIG1lc3NhZ2UgPSBuZXcgVk1lc3NhZ2UocmVhc29uLCBwb3NpdGlvbiwgb3JpZ2luKVxuXG4gIGlmICh0aGlzLnBhdGgpIHtcbiAgICBtZXNzYWdlLm5hbWUgPSB0aGlzLnBhdGggKyAnOicgKyBtZXNzYWdlLm5hbWVcbiAgICBtZXNzYWdlLmZpbGUgPSB0aGlzLnBhdGhcbiAgfVxuXG4gIG1lc3NhZ2UuZmF0YWwgPSBmYWxzZVxuXG4gIHRoaXMubWVzc2FnZXMucHVzaChtZXNzYWdlKVxuXG4gIHJldHVybiBtZXNzYWdlXG59XG5cbi8vIEZhaWw6IGNyZWF0ZXMgYSB2bWVzc2FnZSwgYXNzb2NpYXRlcyBpdCB3aXRoIHRoZSBmaWxlLCBhbmQgdGhyb3dzIGl0LlxuZnVuY3Rpb24gZmFpbCgpIHtcbiAgdmFyIG1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2UuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXG4gIG1lc3NhZ2UuZmF0YWwgPSB0cnVlXG5cbiAgdGhyb3cgbWVzc2FnZVxufVxuXG4vLyBJbmZvOiBjcmVhdGVzIGEgdm1lc3NhZ2UsIGFzc29jaWF0ZXMgaXQgd2l0aCB0aGUgZmlsZSwgYW5kIG1hcmtzIHRoZSBmYXRhbGl0eVxuLy8gYXMgbnVsbC5cbmZ1bmN0aW9uIGluZm8oKSB7XG4gIHZhciBtZXNzYWdlID0gdGhpcy5tZXNzYWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuICBtZXNzYWdlLmZhdGFsID0gbnVsbFxuXG4gIHJldHVybiBtZXNzYWdlXG59XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWInKVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgYmFpbCA9IHJlcXVpcmUoJ2JhaWwnKVxudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2lzLWJ1ZmZlcicpXG52YXIgZXh0ZW5kID0gcmVxdWlyZSgnZXh0ZW5kJylcbnZhciBwbGFpbiA9IHJlcXVpcmUoJ2lzLXBsYWluLW9iaicpXG52YXIgdHJvdWdoID0gcmVxdWlyZSgndHJvdWdoJylcbnZhciB2ZmlsZSA9IHJlcXVpcmUoJ3ZmaWxlJylcblxuLy8gRXhwb3NlIGEgZnJvemVuIHByb2Nlc3Nvci5cbm1vZHVsZS5leHBvcnRzID0gdW5pZmllZCgpLmZyZWV6ZSgpXG5cbnZhciBzbGljZSA9IFtdLnNsaWNlXG52YXIgb3duID0ge30uaGFzT3duUHJvcGVydHlcblxuLy8gUHJvY2VzcyBwaXBlbGluZS5cbnZhciBwaXBlbGluZSA9IHRyb3VnaCgpXG4gIC51c2UocGlwZWxpbmVQYXJzZSlcbiAgLnVzZShwaXBlbGluZVJ1bilcbiAgLnVzZShwaXBlbGluZVN0cmluZ2lmeSlcblxuZnVuY3Rpb24gcGlwZWxpbmVQYXJzZShwLCBjdHgpIHtcbiAgY3R4LnRyZWUgPSBwLnBhcnNlKGN0eC5maWxlKVxufVxuXG5mdW5jdGlvbiBwaXBlbGluZVJ1bihwLCBjdHgsIG5leHQpIHtcbiAgcC5ydW4oY3R4LnRyZWUsIGN0eC5maWxlLCBkb25lKVxuXG4gIGZ1bmN0aW9uIGRvbmUoZXJyb3IsIHRyZWUsIGZpbGUpIHtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIG5leHQoZXJyb3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eC50cmVlID0gdHJlZVxuICAgICAgY3R4LmZpbGUgPSBmaWxlXG4gICAgICBuZXh0KClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcGlwZWxpbmVTdHJpbmdpZnkocCwgY3R4KSB7XG4gIHZhciByZXN1bHQgPSBwLnN0cmluZ2lmeShjdHgudHJlZSwgY3R4LmZpbGUpXG5cbiAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkIHx8IHJlc3VsdCA9PT0gbnVsbCkge1xuICAgIC8vIEVtcHR5LlxuICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnIHx8IGJ1ZmZlcihyZXN1bHQpKSB7XG4gICAgaWYgKCd2YWx1ZScgaW4gY3R4LmZpbGUpIHtcbiAgICAgIGN0eC5maWxlLnZhbHVlID0gcmVzdWx0XG4gICAgfVxuXG4gICAgY3R4LmZpbGUuY29udGVudHMgPSByZXN1bHRcbiAgfSBlbHNlIHtcbiAgICBjdHguZmlsZS5yZXN1bHQgPSByZXN1bHRcbiAgfVxufVxuXG4vLyBGdW5jdGlvbiB0byBjcmVhdGUgdGhlIGZpcnN0IHByb2Nlc3Nvci5cbmZ1bmN0aW9uIHVuaWZpZWQoKSB7XG4gIHZhciBhdHRhY2hlcnMgPSBbXVxuICB2YXIgdHJhbnNmb3JtZXJzID0gdHJvdWdoKClcbiAgdmFyIG5hbWVzcGFjZSA9IHt9XG4gIHZhciBmcmVlemVJbmRleCA9IC0xXG4gIHZhciBmcm96ZW5cblxuICAvLyBEYXRhIG1hbmFnZW1lbnQuXG4gIHByb2Nlc3Nvci5kYXRhID0gZGF0YVxuXG4gIC8vIExvY2suXG4gIHByb2Nlc3Nvci5mcmVlemUgPSBmcmVlemVcblxuICAvLyBQbHVnaW5zLlxuICBwcm9jZXNzb3IuYXR0YWNoZXJzID0gYXR0YWNoZXJzXG4gIHByb2Nlc3Nvci51c2UgPSB1c2VcblxuICAvLyBBUEkuXG4gIHByb2Nlc3Nvci5wYXJzZSA9IHBhcnNlXG4gIHByb2Nlc3Nvci5zdHJpbmdpZnkgPSBzdHJpbmdpZnlcbiAgcHJvY2Vzc29yLnJ1biA9IHJ1blxuICBwcm9jZXNzb3IucnVuU3luYyA9IHJ1blN5bmNcbiAgcHJvY2Vzc29yLnByb2Nlc3MgPSBwcm9jZXNzXG4gIHByb2Nlc3Nvci5wcm9jZXNzU3luYyA9IHByb2Nlc3NTeW5jXG5cbiAgLy8gRXhwb3NlLlxuICByZXR1cm4gcHJvY2Vzc29yXG5cbiAgLy8gQ3JlYXRlIGEgbmV3IHByb2Nlc3NvciBiYXNlZCBvbiB0aGUgcHJvY2Vzc29yIGluIHRoZSBjdXJyZW50IHNjb3BlLlxuICBmdW5jdGlvbiBwcm9jZXNzb3IoKSB7XG4gICAgdmFyIGRlc3RpbmF0aW9uID0gdW5pZmllZCgpXG4gICAgdmFyIGluZGV4ID0gLTFcblxuICAgIHdoaWxlICgrK2luZGV4IDwgYXR0YWNoZXJzLmxlbmd0aCkge1xuICAgICAgZGVzdGluYXRpb24udXNlLmFwcGx5KG51bGwsIGF0dGFjaGVyc1tpbmRleF0pXG4gICAgfVxuXG4gICAgZGVzdGluYXRpb24uZGF0YShleHRlbmQodHJ1ZSwge30sIG5hbWVzcGFjZSkpXG5cbiAgICByZXR1cm4gZGVzdGluYXRpb25cbiAgfVxuXG4gIC8vIEZyZWV6ZTogdXNlZCB0byBzaWduYWwgYSBwcm9jZXNzb3IgdGhhdCBoYXMgZmluaXNoZWQgY29uZmlndXJhdGlvbi5cbiAgLy9cbiAgLy8gRm9yIGV4YW1wbGUsIHRha2UgdW5pZmllZCBpdHNlbGY6IGl0XHUyMDE5cyBmcm96ZW4uXG4gIC8vIFBsdWdpbnMgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byBpdC5cbiAgLy8gUmF0aGVyLCBpdCBzaG91bGQgYmUgZXh0ZW5kZWQsIGJ5IGludm9raW5nIGl0LCBiZWZvcmUgbW9kaWZ5aW5nIGl0LlxuICAvL1xuICAvLyBJbiBlc3NlbmNlLCBhbHdheXMgaW52b2tlIHRoaXMgd2hlbiBleHBvcnRpbmcgYSBwcm9jZXNzb3IuXG4gIGZ1bmN0aW9uIGZyZWV6ZSgpIHtcbiAgICB2YXIgdmFsdWVzXG4gICAgdmFyIHRyYW5zZm9ybWVyXG5cbiAgICBpZiAoZnJvemVuKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc29yXG4gICAgfVxuXG4gICAgd2hpbGUgKCsrZnJlZXplSW5kZXggPCBhdHRhY2hlcnMubGVuZ3RoKSB7XG4gICAgICB2YWx1ZXMgPSBhdHRhY2hlcnNbZnJlZXplSW5kZXhdXG5cbiAgICAgIGlmICh2YWx1ZXNbMV0gPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZXNbMV0gPT09IHRydWUpIHtcbiAgICAgICAgdmFsdWVzWzFdID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIHRyYW5zZm9ybWVyID0gdmFsdWVzWzBdLmFwcGx5KHByb2Nlc3NvciwgdmFsdWVzLnNsaWNlKDEpKVxuXG4gICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybWVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRyYW5zZm9ybWVycy51c2UodHJhbnNmb3JtZXIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnJvemVuID0gdHJ1ZVxuICAgIGZyZWV6ZUluZGV4ID0gSW5maW5pdHlcblxuICAgIHJldHVybiBwcm9jZXNzb3JcbiAgfVxuXG4gIC8vIERhdGEgbWFuYWdlbWVudC5cbiAgLy8gR2V0dGVyIC8gc2V0dGVyIGZvciBwcm9jZXNzb3Itc3BlY2lmaWMgaW5mb3JtdGlvbi5cbiAgZnVuY3Rpb24gZGF0YShrZXksIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBTZXQgYGtleWAuXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBhc3NlcnRVbmZyb3plbignZGF0YScsIGZyb3plbilcbiAgICAgICAgbmFtZXNwYWNlW2tleV0gPSB2YWx1ZVxuICAgICAgICByZXR1cm4gcHJvY2Vzc29yXG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBga2V5YC5cbiAgICAgIHJldHVybiAob3duLmNhbGwobmFtZXNwYWNlLCBrZXkpICYmIG5hbWVzcGFjZVtrZXldKSB8fCBudWxsXG4gICAgfVxuXG4gICAgLy8gU2V0IHNwYWNlLlxuICAgIGlmIChrZXkpIHtcbiAgICAgIGFzc2VydFVuZnJvemVuKCdkYXRhJywgZnJvemVuKVxuICAgICAgbmFtZXNwYWNlID0ga2V5XG4gICAgICByZXR1cm4gcHJvY2Vzc29yXG4gICAgfVxuXG4gICAgLy8gR2V0IHNwYWNlLlxuICAgIHJldHVybiBuYW1lc3BhY2VcbiAgfVxuXG4gIC8vIFBsdWdpbiBtYW5hZ2VtZW50LlxuICAvL1xuICAvLyBQYXNzIGl0OlxuICAvLyAqICAgYW4gYXR0YWNoZXIgYW5kIG9wdGlvbnMsXG4gIC8vICogICBhIHByZXNldCxcbiAgLy8gKiAgIGEgbGlzdCBvZiBwcmVzZXRzLCBhdHRhY2hlcnMsIGFuZCBhcmd1bWVudHMgKGxpc3Qgb2YgYXR0YWNoZXJzIGFuZFxuICAvLyAgICAgb3B0aW9ucykuXG4gIGZ1bmN0aW9uIHVzZSh2YWx1ZSkge1xuICAgIHZhciBzZXR0aW5nc1xuXG4gICAgYXNzZXJ0VW5mcm96ZW4oJ3VzZScsIGZyb3plbilcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFbXB0eS5cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYWRkUGx1Z2luLmFwcGx5KG51bGwsIGFyZ3VtZW50cylcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICgnbGVuZ3RoJyBpbiB2YWx1ZSkge1xuICAgICAgICBhZGRMaXN0KHZhbHVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkUHJlc2V0KHZhbHVlKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHVzYWJsZSB2YWx1ZSwgbm90IGAnICsgdmFsdWUgKyAnYCcpXG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzKSB7XG4gICAgICBuYW1lc3BhY2Uuc2V0dGluZ3MgPSBleHRlbmQobmFtZXNwYWNlLnNldHRpbmdzIHx8IHt9LCBzZXR0aW5ncylcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvY2Vzc29yXG5cbiAgICBmdW5jdGlvbiBhZGRQcmVzZXQocmVzdWx0KSB7XG4gICAgICBhZGRMaXN0KHJlc3VsdC5wbHVnaW5zKVxuXG4gICAgICBpZiAocmVzdWx0LnNldHRpbmdzKSB7XG4gICAgICAgIHNldHRpbmdzID0gZXh0ZW5kKHNldHRpbmdzIHx8IHt9LCByZXN1bHQuc2V0dGluZ3MpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGFkZFBsdWdpbih2YWx1ZSlcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoJ2xlbmd0aCcgaW4gdmFsdWUpIHtcbiAgICAgICAgICBhZGRQbHVnaW4uYXBwbHkobnVsbCwgdmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkUHJlc2V0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHVzYWJsZSB2YWx1ZSwgbm90IGAnICsgdmFsdWUgKyAnYCcpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkTGlzdChwbHVnaW5zKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMVxuXG4gICAgICBpZiAocGx1Z2lucyA9PT0gbnVsbCB8fCBwbHVnaW5zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gRW1wdHkuXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwbHVnaW5zID09PSAnb2JqZWN0JyAmJiAnbGVuZ3RoJyBpbiBwbHVnaW5zKSB7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgcGx1Z2lucy5sZW5ndGgpIHtcbiAgICAgICAgICBhZGQocGx1Z2luc1tpbmRleF0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSBsaXN0IG9mIHBsdWdpbnMsIG5vdCBgJyArIHBsdWdpbnMgKyAnYCcpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkUGx1Z2luKHBsdWdpbiwgdmFsdWUpIHtcbiAgICAgIHZhciBlbnRyeSA9IGZpbmQocGx1Z2luKVxuXG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgaWYgKHBsYWluKGVudHJ5WzFdKSAmJiBwbGFpbih2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IGV4dGVuZCh0cnVlLCBlbnRyeVsxXSwgdmFsdWUpXG4gICAgICAgIH1cblxuICAgICAgICBlbnRyeVsxXSA9IHZhbHVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdHRhY2hlcnMucHVzaChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZChwbHVnaW4pIHtcbiAgICB2YXIgaW5kZXggPSAtMVxuXG4gICAgd2hpbGUgKCsraW5kZXggPCBhdHRhY2hlcnMubGVuZ3RoKSB7XG4gICAgICBpZiAoYXR0YWNoZXJzW2luZGV4XVswXSA9PT0gcGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBhdHRhY2hlcnNbaW5kZXhdXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUGFyc2UgYSBmaWxlIChpbiBzdHJpbmcgb3IgdmZpbGUgcmVwcmVzZW50YXRpb24pIGludG8gYSB1bmlzdCBub2RlIHVzaW5nXG4gIC8vIHRoZSBgUGFyc2VyYCBvbiB0aGUgcHJvY2Vzc29yLlxuICBmdW5jdGlvbiBwYXJzZShkb2MpIHtcbiAgICB2YXIgZmlsZSA9IHZmaWxlKGRvYylcbiAgICB2YXIgUGFyc2VyXG5cbiAgICBmcmVlemUoKVxuICAgIFBhcnNlciA9IHByb2Nlc3Nvci5QYXJzZXJcbiAgICBhc3NlcnRQYXJzZXIoJ3BhcnNlJywgUGFyc2VyKVxuXG4gICAgaWYgKG5ld2FibGUoUGFyc2VyLCAncGFyc2UnKSkge1xuICAgICAgcmV0dXJuIG5ldyBQYXJzZXIoU3RyaW5nKGZpbGUpLCBmaWxlKS5wYXJzZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIFBhcnNlcihTdHJpbmcoZmlsZSksIGZpbGUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuICB9XG5cbiAgLy8gUnVuIHRyYW5zZm9ybXMgb24gYSB1bmlzdCBub2RlIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZSAoaW4gc3RyaW5nIG9yXG4gIC8vIHZmaWxlIHJlcHJlc2VudGF0aW9uKSwgYXN5bmMuXG4gIGZ1bmN0aW9uIHJ1bihub2RlLCBmaWxlLCBjYikge1xuICAgIGFzc2VydE5vZGUobm9kZSlcbiAgICBmcmVlemUoKVxuXG4gICAgaWYgKCFjYiAmJiB0eXBlb2YgZmlsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBmaWxlXG4gICAgICBmaWxlID0gbnVsbFxuICAgIH1cblxuICAgIGlmICghY2IpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShleGVjdXRvcilcbiAgICB9XG5cbiAgICBleGVjdXRvcihudWxsLCBjYilcblxuICAgIGZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdHJhbnNmb3JtZXJzLnJ1bihub2RlLCB2ZmlsZShmaWxlKSwgZG9uZSlcblxuICAgICAgZnVuY3Rpb24gZG9uZShlcnJvciwgdHJlZSwgZmlsZSkge1xuICAgICAgICB0cmVlID0gdHJlZSB8fCBub2RlXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0cmVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNiKG51bGwsIHRyZWUsIGZpbGUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSdW4gdHJhbnNmb3JtcyBvbiBhIHVuaXN0IG5vZGUgcmVwcmVzZW50YXRpb24gb2YgYSBmaWxlIChpbiBzdHJpbmcgb3JcbiAgLy8gdmZpbGUgcmVwcmVzZW50YXRpb24pLCBzeW5jLlxuICBmdW5jdGlvbiBydW5TeW5jKG5vZGUsIGZpbGUpIHtcbiAgICB2YXIgcmVzdWx0XG4gICAgdmFyIGNvbXBsZXRlXG5cbiAgICBydW4obm9kZSwgZmlsZSwgZG9uZSlcblxuICAgIGFzc2VydERvbmUoJ3J1blN5bmMnLCAncnVuJywgY29tcGxldGUpXG5cbiAgICByZXR1cm4gcmVzdWx0XG5cbiAgICBmdW5jdGlvbiBkb25lKGVycm9yLCB0cmVlKSB7XG4gICAgICBjb21wbGV0ZSA9IHRydWVcbiAgICAgIHJlc3VsdCA9IHRyZWVcbiAgICAgIGJhaWwoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLy8gU3RyaW5naWZ5IGEgdW5pc3Qgbm9kZSByZXByZXNlbnRhdGlvbiBvZiBhIGZpbGUgKGluIHN0cmluZyBvciB2ZmlsZVxuICAvLyByZXByZXNlbnRhdGlvbikgaW50byBhIHN0cmluZyB1c2luZyB0aGUgYENvbXBpbGVyYCBvbiB0aGUgcHJvY2Vzc29yLlxuICBmdW5jdGlvbiBzdHJpbmdpZnkobm9kZSwgZG9jKSB7XG4gICAgdmFyIGZpbGUgPSB2ZmlsZShkb2MpXG4gICAgdmFyIENvbXBpbGVyXG5cbiAgICBmcmVlemUoKVxuICAgIENvbXBpbGVyID0gcHJvY2Vzc29yLkNvbXBpbGVyXG4gICAgYXNzZXJ0Q29tcGlsZXIoJ3N0cmluZ2lmeScsIENvbXBpbGVyKVxuICAgIGFzc2VydE5vZGUobm9kZSlcblxuICAgIGlmIChuZXdhYmxlKENvbXBpbGVyLCAnY29tcGlsZScpKSB7XG4gICAgICByZXR1cm4gbmV3IENvbXBpbGVyKG5vZGUsIGZpbGUpLmNvbXBpbGUoKVxuICAgIH1cblxuICAgIHJldHVybiBDb21waWxlcihub2RlLCBmaWxlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcbiAgfVxuXG4gIC8vIFBhcnNlIGEgZmlsZSAoaW4gc3RyaW5nIG9yIHZmaWxlIHJlcHJlc2VudGF0aW9uKSBpbnRvIGEgdW5pc3Qgbm9kZSB1c2luZ1xuICAvLyB0aGUgYFBhcnNlcmAgb24gdGhlIHByb2Nlc3NvciwgdGhlbiBydW4gdHJhbnNmb3JtcyBvbiB0aGF0IG5vZGUsIGFuZFxuICAvLyBjb21waWxlIHRoZSByZXN1bHRpbmcgbm9kZSB1c2luZyB0aGUgYENvbXBpbGVyYCBvbiB0aGUgcHJvY2Vzc29yLCBhbmRcbiAgLy8gc3RvcmUgdGhhdCByZXN1bHQgb24gdGhlIHZmaWxlLlxuICBmdW5jdGlvbiBwcm9jZXNzKGRvYywgY2IpIHtcbiAgICBmcmVlemUoKVxuICAgIGFzc2VydFBhcnNlcigncHJvY2VzcycsIHByb2Nlc3Nvci5QYXJzZXIpXG4gICAgYXNzZXJ0Q29tcGlsZXIoJ3Byb2Nlc3MnLCBwcm9jZXNzb3IuQ29tcGlsZXIpXG5cbiAgICBpZiAoIWNiKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZXhlY3V0b3IpXG4gICAgfVxuXG4gICAgZXhlY3V0b3IobnVsbCwgY2IpXG5cbiAgICBmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBmaWxlID0gdmZpbGUoZG9jKVxuXG4gICAgICBwaXBlbGluZS5ydW4ocHJvY2Vzc29yLCB7ZmlsZTogZmlsZX0sIGRvbmUpXG5cbiAgICAgIGZ1bmN0aW9uIGRvbmUoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKGZpbGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2IobnVsbCwgZmlsZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb2Nlc3MgdGhlIGdpdmVuIGRvY3VtZW50IChpbiBzdHJpbmcgb3IgdmZpbGUgcmVwcmVzZW50YXRpb24pLCBzeW5jLlxuICBmdW5jdGlvbiBwcm9jZXNzU3luYyhkb2MpIHtcbiAgICB2YXIgZmlsZVxuICAgIHZhciBjb21wbGV0ZVxuXG4gICAgZnJlZXplKClcbiAgICBhc3NlcnRQYXJzZXIoJ3Byb2Nlc3NTeW5jJywgcHJvY2Vzc29yLlBhcnNlcilcbiAgICBhc3NlcnRDb21waWxlcigncHJvY2Vzc1N5bmMnLCBwcm9jZXNzb3IuQ29tcGlsZXIpXG4gICAgZmlsZSA9IHZmaWxlKGRvYylcblxuICAgIHByb2Nlc3MoZmlsZSwgZG9uZSlcblxuICAgIGFzc2VydERvbmUoJ3Byb2Nlc3NTeW5jJywgJ3Byb2Nlc3MnLCBjb21wbGV0ZSlcblxuICAgIHJldHVybiBmaWxlXG5cbiAgICBmdW5jdGlvbiBkb25lKGVycm9yKSB7XG4gICAgICBjb21wbGV0ZSA9IHRydWVcbiAgICAgIGJhaWwoZXJyb3IpXG4gICAgfVxuICB9XG59XG5cbi8vIENoZWNrIGlmIGB2YWx1ZWAgaXMgYSBjb25zdHJ1Y3Rvci5cbmZ1bmN0aW9uIG5ld2FibGUodmFsdWUsIG5hbWUpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB2YWx1ZS5wcm90b3R5cGUgJiZcbiAgICAvLyBBIGZ1bmN0aW9uIHdpdGgga2V5cyBpbiBpdHMgcHJvdG90eXBlIGlzIHByb2JhYmx5IGEgY29uc3RydWN0b3IuXG4gICAgLy8gQ2xhc3Nlc1x1MjAxOSBwcm90b3R5cGUgbWV0aG9kcyBhcmUgbm90IGVudW1lcmFibGUsIHNvIHdlIGNoZWNrIGlmIHNvbWUgdmFsdWVcbiAgICAvLyBleGlzdHMgaW4gdGhlIHByb3RvdHlwZS5cbiAgICAoa2V5cyh2YWx1ZS5wcm90b3R5cGUpIHx8IG5hbWUgaW4gdmFsdWUucHJvdG90eXBlKVxuICApXG59XG5cbi8vIENoZWNrIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0IHdpdGgga2V5cy5cbmZ1bmN0aW9uIGtleXModmFsdWUpIHtcbiAgdmFyIGtleVxuICBmb3IgKGtleSBpbiB2YWx1ZSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLy8gQXNzZXJ0IGEgcGFyc2VyIGlzIGF2YWlsYWJsZS5cbmZ1bmN0aW9uIGFzc2VydFBhcnNlcihuYW1lLCBQYXJzZXIpIHtcbiAgaWYgKHR5cGVvZiBQYXJzZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBgJyArIG5hbWUgKyAnYCB3aXRob3V0IGBQYXJzZXJgJylcbiAgfVxufVxuXG4vLyBBc3NlcnQgYSBjb21waWxlciBpcyBhdmFpbGFibGUuXG5mdW5jdGlvbiBhc3NlcnRDb21waWxlcihuYW1lLCBDb21waWxlcikge1xuICBpZiAodHlwZW9mIENvbXBpbGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYCcgKyBuYW1lICsgJ2Agd2l0aG91dCBgQ29tcGlsZXJgJylcbiAgfVxufVxuXG4vLyBBc3NlcnQgdGhlIHByb2Nlc3NvciBpcyBub3QgZnJvemVuLlxuZnVuY3Rpb24gYXNzZXJ0VW5mcm96ZW4obmFtZSwgZnJvemVuKSB7XG4gIGlmIChmcm96ZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQ2Fubm90IGludm9rZSBgJyArXG4gICAgICAgIG5hbWUgK1xuICAgICAgICAnYCBvbiBhIGZyb3plbiBwcm9jZXNzb3IuXFxuQ3JlYXRlIGEgbmV3IHByb2Nlc3NvciBmaXJzdCwgYnkgaW52b2tpbmcgaXQ6IHVzZSBgcHJvY2Vzc29yKClgIGluc3RlYWQgb2YgYHByb2Nlc3NvcmAuJ1xuICAgIClcbiAgfVxufVxuXG4vLyBBc3NlcnQgYG5vZGVgIGlzIGEgdW5pc3Qgbm9kZS5cbmZ1bmN0aW9uIGFzc2VydE5vZGUobm9kZSkge1xuICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIG5vZGUsIGdvdCBgJyArIG5vZGUgKyAnYCcpXG4gIH1cbn1cblxuLy8gQXNzZXJ0IHRoYXQgYGNvbXBsZXRlYCBpcyBgdHJ1ZWAuXG5mdW5jdGlvbiBhc3NlcnREb25lKG5hbWUsIGFzeW5jTmFtZSwgY29tcGxldGUpIHtcbiAgaWYgKCFjb21wbGV0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdgJyArIG5hbWUgKyAnYCBmaW5pc2hlZCBhc3luYy4gVXNlIGAnICsgYXN5bmNOYW1lICsgJ2AgaW5zdGVhZCdcbiAgICApXG4gIH1cbn1cbiIsICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB0b1N0cmluZ1xuXG4vLyBHZXQgdGhlIHRleHQgY29udGVudCBvZiBhIG5vZGUuXG4vLyBQcmVmZXIgdGhlIG5vZGVcdTIwMTlzIHBsYWluLXRleHQgZmllbGRzLCBvdGhlcndpc2Ugc2VyaWFsaXplIGl0cyBjaGlsZHJlbixcbi8vIGFuZCBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gYXJyYXksIHNlcmlhbGl6ZSB0aGUgbm9kZXMgaW4gaXQuXG5mdW5jdGlvbiB0b1N0cmluZyhub2RlKSB7XG4gIHJldHVybiAoXG4gICAgKG5vZGUgJiZcbiAgICAgIChub2RlLnZhbHVlIHx8XG4gICAgICAgIG5vZGUuYWx0IHx8XG4gICAgICAgIG5vZGUudGl0bGUgfHxcbiAgICAgICAgKCdjaGlsZHJlbicgaW4gbm9kZSAmJiBhbGwobm9kZS5jaGlsZHJlbikpIHx8XG4gICAgICAgICgnbGVuZ3RoJyBpbiBub2RlICYmIGFsbChub2RlKSkpKSB8fFxuICAgICcnXG4gIClcbn1cblxuZnVuY3Rpb24gYWxsKHZhbHVlcykge1xuICB2YXIgcmVzdWx0ID0gW11cbiAgdmFyIGluZGV4ID0gLTFcblxuICB3aGlsZSAoKytpbmRleCA8IHZhbHVlcy5sZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gdG9TdHJpbmcodmFsdWVzW2luZGV4XSlcbiAgfVxuXG4gIHJldHVybiByZXN1bHQuam9pbignJylcbn1cbiIsICIndXNlIHN0cmljdCdcblxudmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ25cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25cbiIsICIndXNlIHN0cmljdCdcblxudmFyIG93biA9IHt9Lmhhc093blByb3BlcnR5XG5cbm1vZHVsZS5leHBvcnRzID0gb3duXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUlkZW50aWZpZXIodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAvLyBDb2xsYXBzZSBNYXJrZG93biB3aGl0ZXNwYWNlLlxuICAgICAgLnJlcGxhY2UoL1tcXHRcXG5cXHIgXSsvZywgJyAnKSAvLyBUcmltLlxuICAgICAgLnJlcGxhY2UoL14gfCAkL2csICcnKSAvLyBTb21lIGNoYXJhY3RlcnMgYXJlIGNvbnNpZGVyZWQgXHUyMDFDdXBwZXJjYXNlXHUyMDFELCBidXQgaWYgdGhlaXIgbG93ZXJjYXNlXG4gICAgICAvLyBjb3VudGVycGFydCBpcyB1cHBlcmNhc2VkIHdpbGwgcmVzdWx0IGluIGEgZGlmZmVyZW50IHVwcGVyY2FzZVxuICAgICAgLy8gY2hhcmFjdGVyLlxuICAgICAgLy8gSGVuY2UsIHRvIGdldCB0aGF0IGZvcm0sIHdlIHBlcmZvcm0gYm90aCBsb3dlci0gYW5kIHVwcGVyY2FzZS5cbiAgICAgIC8vIFVwcGVyIGNhc2UgbWFrZXMgc3VyZSBrZXlzIHdpbGwgbm90IGludGVyYWN0IHdpdGggZGVmYXVsdCBwcm90b3R5cGFsXG4gICAgICAvLyBtZXRob2RzOiBubyBvYmplY3QgbWV0aG9kIGlzIHVwcGVyY2FzZS5cbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAudG9VcHBlckNhc2UoKVxuICApXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbm9ybWFsaXplSWRlbnRpZmllclxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZyb21DaGFyQ29kZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgZnJvbUNoYXJDb2RlID0gcmVxdWlyZSgnLi4vY29uc3RhbnQvZnJvbS1jaGFyLWNvZGUuanMnKVxuXG5mdW5jdGlvbiBzYWZlRnJvbUludCh2YWx1ZSwgYmFzZSkge1xuICB2YXIgY29kZSA9IHBhcnNlSW50KHZhbHVlLCBiYXNlKVxuXG4gIGlmIChcbiAgICAvLyBDMCBleGNlcHQgZm9yIEhULCBMRiwgRkYsIENSLCBzcGFjZVxuICAgIGNvZGUgPCA5IHx8XG4gICAgY29kZSA9PT0gMTEgfHxcbiAgICAoY29kZSA+IDEzICYmIGNvZGUgPCAzMikgfHwgLy8gQ29udHJvbCBjaGFyYWN0ZXIgKERFTCkgb2YgdGhlIGJhc2ljIGJsb2NrIGFuZCBDMSBjb250cm9scy5cbiAgICAoY29kZSA+IDEyNiAmJiBjb2RlIDwgMTYwKSB8fCAvLyBMb25lIGhpZ2ggc3Vycm9nYXRlcyBhbmQgbG93IHN1cnJvZ2F0ZXMuXG4gICAgKGNvZGUgPiA1NTI5NSAmJiBjb2RlIDwgNTczNDQpIHx8IC8vIE5vbmNoYXJhY3RlcnMuXG4gICAgKGNvZGUgPiA2NDk3NSAmJiBjb2RlIDwgNjUwMDgpIHx8XG4gICAgKGNvZGUgJiA2NTUzNSkgPT09IDY1NTM1IHx8XG4gICAgKGNvZGUgJiA2NTUzNSkgPT09IDY1NTM0IHx8IC8vIE91dCBvZiByYW5nZVxuICAgIGNvZGUgPiAxMTE0MTExXG4gICkge1xuICAgIHJldHVybiAnXFx1RkZGRCdcbiAgfVxuXG4gIHJldHVybiBmcm9tQ2hhckNvZGUoY29kZSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzYWZlRnJvbUludFxuIiwgIid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkge1xuICByZXR1cm4gY29kZSA8IC0yXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFya2Rvd25MaW5lRW5kaW5nXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIG1hcmtkb3duU3BhY2UoY29kZSkge1xuICByZXR1cm4gY29kZSA9PT0gLTIgfHwgY29kZSA9PT0gLTEgfHwgY29kZSA9PT0gMzJcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXJrZG93blNwYWNlXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93blNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLXNwYWNlLmpzJylcblxuZnVuY3Rpb24gc3BhY2VGYWN0b3J5KGVmZmVjdHMsIG9rLCB0eXBlLCBtYXgpIHtcbiAgdmFyIGxpbWl0ID0gbWF4ID8gbWF4IC0gMSA6IEluZmluaXR5XG4gIHZhciBzaXplID0gMFxuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIodHlwZSlcbiAgICAgIHJldHVybiBwcmVmaXgoY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gb2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZWZpeChjb2RlKSB7XG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkgJiYgc2l6ZSsrIDwgbGltaXQpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHByZWZpeFxuICAgIH1cblxuICAgIGVmZmVjdHMuZXhpdCh0eXBlKVxuICAgIHJldHVybiBvayhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3BhY2VGYWN0b3J5XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHt2YWx1ZTogdHJ1ZX0pXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIGZhY3RvcnlTcGFjZSA9IHJlcXVpcmUoJy4uL3Rva2VuaXplL2ZhY3Rvcnktc3BhY2UuanMnKVxuXG52YXIgdG9rZW5pemUgPSBpbml0aWFsaXplQ29udGVudFxuXG5mdW5jdGlvbiBpbml0aWFsaXplQ29udGVudChlZmZlY3RzKSB7XG4gIHZhciBjb250ZW50U3RhcnQgPSBlZmZlY3RzLmF0dGVtcHQoXG4gICAgdGhpcy5wYXJzZXIuY29uc3RydWN0cy5jb250ZW50SW5pdGlhbCxcbiAgICBhZnRlckNvbnRlbnRTdGFydENvbnN0cnVjdCxcbiAgICBwYXJhZ3JhcGhJbml0aWFsXG4gIClcbiAgdmFyIHByZXZpb3VzXG4gIHJldHVybiBjb250ZW50U3RhcnRcblxuICBmdW5jdGlvbiBhZnRlckNvbnRlbnRTdGFydENvbnN0cnVjdChjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignbGluZUVuZGluZycpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgZWZmZWN0cy5leGl0KCdsaW5lRW5kaW5nJylcbiAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGNvbnRlbnRTdGFydCwgJ2xpbmVQcmVmaXgnKVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyYWdyYXBoSW5pdGlhbChjb2RlKSB7XG4gICAgZWZmZWN0cy5lbnRlcigncGFyYWdyYXBoJylcbiAgICByZXR1cm4gbGluZVN0YXJ0KGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBsaW5lU3RhcnQoY29kZSkge1xuICAgIHZhciB0b2tlbiA9IGVmZmVjdHMuZW50ZXIoJ2NodW5rVGV4dCcsIHtcbiAgICAgIGNvbnRlbnRUeXBlOiAndGV4dCcsXG4gICAgICBwcmV2aW91czogcHJldmlvdXNcbiAgICB9KVxuXG4gICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICBwcmV2aW91cy5uZXh0ID0gdG9rZW5cbiAgICB9XG5cbiAgICBwcmV2aW91cyA9IHRva2VuXG4gICAgcmV0dXJuIGRhdGEoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRhdGEoY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICBlZmZlY3RzLmV4aXQoJ2NodW5rVGV4dCcpXG4gICAgICBlZmZlY3RzLmV4aXQoJ3BhcmFncmFwaCcpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCdjaHVua1RleHQnKVxuICAgICAgcmV0dXJuIGxpbmVTdGFydFxuICAgIH0gLy8gRGF0YS5cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBkYXRhXG4gIH1cbn1cblxuZXhwb3J0cy50b2tlbml6ZSA9IHRva2VuaXplXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIGZhY3RvcnlTcGFjZSA9IHJlcXVpcmUoJy4vZmFjdG9yeS1zcGFjZS5qcycpXG5cbnZhciBwYXJ0aWFsQmxhbmtMaW5lID0ge1xuICB0b2tlbml6ZTogdG9rZW5pemVQYXJ0aWFsQmxhbmtMaW5lLFxuICBwYXJ0aWFsOiB0cnVlXG59XG5cbmZ1bmN0aW9uIHRva2VuaXplUGFydGlhbEJsYW5rTGluZShlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXJXaGl0ZXNwYWNlLCAnbGluZVByZWZpeCcpXG5cbiAgZnVuY3Rpb24gYWZ0ZXJXaGl0ZXNwYWNlKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkgPyBvayhjb2RlKSA6IG5vayhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGFydGlhbEJsYW5rTGluZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7dmFsdWU6IHRydWV9KVxuXG52YXIgbWFya2Rvd25MaW5lRW5kaW5nID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLmpzJylcbnZhciBmYWN0b3J5U3BhY2UgPSByZXF1aXJlKCcuLi90b2tlbml6ZS9mYWN0b3J5LXNwYWNlLmpzJylcbnZhciBwYXJ0aWFsQmxhbmtMaW5lID0gcmVxdWlyZSgnLi4vdG9rZW5pemUvcGFydGlhbC1ibGFuay1saW5lLmpzJylcblxudmFyIHRva2VuaXplID0gaW5pdGlhbGl6ZURvY3VtZW50XG52YXIgY29udGFpbmVyQ29uc3RydWN0ID0ge1xuICB0b2tlbml6ZTogdG9rZW5pemVDb250YWluZXJcbn1cbnZhciBsYXp5Rmxvd0NvbnN0cnVjdCA9IHtcbiAgdG9rZW5pemU6IHRva2VuaXplTGF6eUZsb3dcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZURvY3VtZW50KGVmZmVjdHMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBzdGFjayA9IFtdXG4gIHZhciBjb250aW51ZWQgPSAwXG4gIHZhciBpbnNwZWN0Q29uc3RydWN0ID0ge1xuICAgIHRva2VuaXplOiB0b2tlbml6ZUluc3BlY3QsXG4gICAgcGFydGlhbDogdHJ1ZVxuICB9XG4gIHZhciBpbnNwZWN0UmVzdWx0XG4gIHZhciBjaGlsZEZsb3dcbiAgdmFyIGNoaWxkVG9rZW5cbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGlmIChjb250aW51ZWQgPCBzdGFjay5sZW5ndGgpIHtcbiAgICAgIHNlbGYuY29udGFpbmVyU3RhdGUgPSBzdGFja1tjb250aW51ZWRdWzFdXG4gICAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgICBzdGFja1tjb250aW51ZWRdWzBdLmNvbnRpbnVhdGlvbixcbiAgICAgICAgZG9jdW1lbnRDb250aW51ZSxcbiAgICAgICAgZG9jdW1lbnRDb250aW51ZWRcbiAgICAgICkoY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gZG9jdW1lbnRDb250aW51ZWQoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRvY3VtZW50Q29udGludWUoY29kZSkge1xuICAgIGNvbnRpbnVlZCsrXG4gICAgcmV0dXJuIHN0YXJ0KGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBkb2N1bWVudENvbnRpbnVlZChjb2RlKSB7XG4gICAgLy8gSWYgd2VcdTIwMTlyZSBpbiBhIGNvbmNyZXRlIGNvbnN0cnVjdCAoc3VjaCBhcyB3aGVuIGV4cGVjdGluZyBhbm90aGVyIGxpbmUgb2ZcbiAgICAvLyBIVE1MLCBvciB3ZSByZXN1bHRlZCBpbiBsYXp5IGNvbnRlbnQpLCB3ZSBjYW4gaW1tZWRpYXRlbHkgc3RhcnQgZmxvdy5cbiAgICBpZiAoaW5zcGVjdFJlc3VsdCAmJiBpbnNwZWN0UmVzdWx0LmZsb3dDb250aW51ZSkge1xuICAgICAgcmV0dXJuIGZsb3dTdGFydChjb2RlKVxuICAgIH1cblxuICAgIHNlbGYuaW50ZXJydXB0ID1cbiAgICAgIGNoaWxkRmxvdyAmJlxuICAgICAgY2hpbGRGbG93LmN1cnJlbnRDb25zdHJ1Y3QgJiZcbiAgICAgIGNoaWxkRmxvdy5jdXJyZW50Q29uc3RydWN0LmludGVycnVwdGlibGVcbiAgICBzZWxmLmNvbnRhaW5lclN0YXRlID0ge31cbiAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgY29udGFpbmVyQ29uc3RydWN0LFxuICAgICAgY29udGFpbmVyQ29udGludWUsXG4gICAgICBmbG93U3RhcnRcbiAgICApKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb250YWluZXJDb250aW51ZShjb2RlKSB7XG4gICAgc3RhY2sucHVzaChbc2VsZi5jdXJyZW50Q29uc3RydWN0LCBzZWxmLmNvbnRhaW5lclN0YXRlXSlcbiAgICBzZWxmLmNvbnRhaW5lclN0YXRlID0gdW5kZWZpbmVkXG4gICAgcmV0dXJuIGRvY3VtZW50Q29udGludWVkKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBmbG93U3RhcnQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICBleGl0Q29udGFpbmVycygwLCB0cnVlKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjaGlsZEZsb3cgPSBjaGlsZEZsb3cgfHwgc2VsZi5wYXJzZXIuZmxvdyhzZWxmLm5vdygpKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2NodW5rRmxvdycsIHtcbiAgICAgIGNvbnRlbnRUeXBlOiAnZmxvdycsXG4gICAgICBwcmV2aW91czogY2hpbGRUb2tlbixcbiAgICAgIF90b2tlbml6ZXI6IGNoaWxkRmxvd1xuICAgIH0pXG4gICAgcmV0dXJuIGZsb3dDb250aW51ZShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZmxvd0NvbnRpbnVlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgY29udGludWVGbG93KGVmZmVjdHMuZXhpdCgnY2h1bmtGbG93JykpXG4gICAgICByZXR1cm4gZmxvd1N0YXJ0KGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBjb250aW51ZUZsb3coZWZmZWN0cy5leGl0KCdjaHVua0Zsb3cnKSlcbiAgICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKGluc3BlY3RDb25zdHJ1Y3QsIGRvY3VtZW50QWZ0ZXJQZWVrKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBmbG93Q29udGludWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGRvY3VtZW50QWZ0ZXJQZWVrKGNvZGUpIHtcbiAgICBleGl0Q29udGFpbmVycyhcbiAgICAgIGluc3BlY3RSZXN1bHQuY29udGludWVkLFxuICAgICAgaW5zcGVjdFJlc3VsdCAmJiBpbnNwZWN0UmVzdWx0LmZsb3dFbmRcbiAgICApXG4gICAgY29udGludWVkID0gMFxuICAgIHJldHVybiBzdGFydChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29udGludWVGbG93KHRva2VuKSB7XG4gICAgaWYgKGNoaWxkVG9rZW4pIGNoaWxkVG9rZW4ubmV4dCA9IHRva2VuXG4gICAgY2hpbGRUb2tlbiA9IHRva2VuXG4gICAgY2hpbGRGbG93LmxhenkgPSBpbnNwZWN0UmVzdWx0ICYmIGluc3BlY3RSZXN1bHQubGF6eVxuICAgIGNoaWxkRmxvdy5kZWZpbmVTa2lwKHRva2VuLnN0YXJ0KVxuICAgIGNoaWxkRmxvdy53cml0ZShzZWxmLnNsaWNlU3RyZWFtKHRva2VuKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4aXRDb250YWluZXJzKHNpemUsIGVuZCkge1xuICAgIHZhciBpbmRleCA9IHN0YWNrLmxlbmd0aCAvLyBDbG9zZSB0aGUgZmxvdy5cblxuICAgIGlmIChjaGlsZEZsb3cgJiYgZW5kKSB7XG4gICAgICBjaGlsZEZsb3cud3JpdGUoW251bGxdKVxuICAgICAgY2hpbGRUb2tlbiA9IGNoaWxkRmxvdyA9IHVuZGVmaW5lZFxuICAgIH0gLy8gRXhpdCBvcGVuIGNvbnRhaW5lcnMuXG5cbiAgICB3aGlsZSAoaW5kZXgtLSA+IHNpemUpIHtcbiAgICAgIHNlbGYuY29udGFpbmVyU3RhdGUgPSBzdGFja1tpbmRleF1bMV1cbiAgICAgIHN0YWNrW2luZGV4XVswXS5leGl0LmNhbGwoc2VsZiwgZWZmZWN0cylcbiAgICB9XG5cbiAgICBzdGFjay5sZW5ndGggPSBzaXplXG4gIH1cblxuICBmdW5jdGlvbiB0b2tlbml6ZUluc3BlY3QoZWZmZWN0cywgb2spIHtcbiAgICB2YXIgc3ViY29udGludWVkID0gMFxuICAgIGluc3BlY3RSZXN1bHQgPSB7fVxuICAgIHJldHVybiBpbnNwZWN0U3RhcnRcblxuICAgIGZ1bmN0aW9uIGluc3BlY3RTdGFydChjb2RlKSB7XG4gICAgICBpZiAoc3ViY29udGludWVkIDwgc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHNlbGYuY29udGFpbmVyU3RhdGUgPSBzdGFja1tzdWJjb250aW51ZWRdWzFdXG4gICAgICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoXG4gICAgICAgICAgc3RhY2tbc3ViY29udGludWVkXVswXS5jb250aW51YXRpb24sXG4gICAgICAgICAgaW5zcGVjdENvbnRpbnVlLFxuICAgICAgICAgIGluc3BlY3RMZXNzXG4gICAgICAgICkoY29kZSlcbiAgICAgIH0gLy8gSWYgd2VcdTIwMTlyZSBjb250aW51ZWQgYnV0IGluIGEgY29uY3JldGUgZmxvdywgd2UgY2FuXHUyMDE5dCBoYXZlIG1vcmVcbiAgICAgIC8vIGNvbnRhaW5lcnMuXG5cbiAgICAgIGlmIChjaGlsZEZsb3cuY3VycmVudENvbnN0cnVjdCAmJiBjaGlsZEZsb3cuY3VycmVudENvbnN0cnVjdC5jb25jcmV0ZSkge1xuICAgICAgICBpbnNwZWN0UmVzdWx0LmZsb3dDb250aW51ZSA9IHRydWVcbiAgICAgICAgcmV0dXJuIGluc3BlY3REb25lKGNvZGUpXG4gICAgICB9XG5cbiAgICAgIHNlbGYuaW50ZXJydXB0ID1cbiAgICAgICAgY2hpbGRGbG93LmN1cnJlbnRDb25zdHJ1Y3QgJiYgY2hpbGRGbG93LmN1cnJlbnRDb25zdHJ1Y3QuaW50ZXJydXB0aWJsZVxuICAgICAgc2VsZi5jb250YWluZXJTdGF0ZSA9IHt9XG4gICAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgICBjb250YWluZXJDb25zdHJ1Y3QsXG4gICAgICAgIGluc3BlY3RGbG93RW5kLFxuICAgICAgICBpbnNwZWN0RG9uZVxuICAgICAgKShjb2RlKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3BlY3RDb250aW51ZShjb2RlKSB7XG4gICAgICBzdWJjb250aW51ZWQrK1xuICAgICAgcmV0dXJuIHNlbGYuY29udGFpbmVyU3RhdGUuX2Nsb3NlRmxvd1xuICAgICAgICA/IGluc3BlY3RGbG93RW5kKGNvZGUpXG4gICAgICAgIDogaW5zcGVjdFN0YXJ0KGNvZGUpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zcGVjdExlc3MoY29kZSkge1xuICAgICAgaWYgKGNoaWxkRmxvdy5jdXJyZW50Q29uc3RydWN0ICYmIGNoaWxkRmxvdy5jdXJyZW50Q29uc3RydWN0LmxhenkpIHtcbiAgICAgICAgLy8gTWF5YmUgYW5vdGhlciBjb250YWluZXI/XG4gICAgICAgIHNlbGYuY29udGFpbmVyU3RhdGUgPSB7fVxuICAgICAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgICAgIGNvbnRhaW5lckNvbnN0cnVjdCxcbiAgICAgICAgICBpbnNwZWN0Rmxvd0VuZCwgLy8gTWF5YmUgZmxvdywgb3IgYSBibGFuayBsaW5lP1xuICAgICAgICAgIGVmZmVjdHMuYXR0ZW1wdChcbiAgICAgICAgICAgIGxhenlGbG93Q29uc3RydWN0LFxuICAgICAgICAgICAgaW5zcGVjdEZsb3dFbmQsXG4gICAgICAgICAgICBlZmZlY3RzLmNoZWNrKHBhcnRpYWxCbGFua0xpbmUsIGluc3BlY3RGbG93RW5kLCBpbnNwZWN0TGF6eSlcbiAgICAgICAgICApXG4gICAgICAgICkoY29kZSlcbiAgICAgIH0gLy8gT3RoZXJ3aXNlIHdlXHUyMDE5cmUgaW50ZXJydXB0aW5nLlxuXG4gICAgICByZXR1cm4gaW5zcGVjdEZsb3dFbmQoY29kZSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnNwZWN0TGF6eShjb2RlKSB7XG4gICAgICAvLyBBY3QgYXMgaWYgYWxsIGNvbnRhaW5lcnMgYXJlIGNvbnRpbnVlZC5cbiAgICAgIHN1YmNvbnRpbnVlZCA9IHN0YWNrLmxlbmd0aFxuICAgICAgaW5zcGVjdFJlc3VsdC5sYXp5ID0gdHJ1ZVxuICAgICAgaW5zcGVjdFJlc3VsdC5mbG93Q29udGludWUgPSB0cnVlXG4gICAgICByZXR1cm4gaW5zcGVjdERvbmUoY29kZSlcbiAgICB9IC8vIFdlXHUyMDE5cmUgZG9uZSB3aXRoIGZsb3cgaWYgd2UgaGF2ZSBtb3JlIGNvbnRhaW5lcnMsIG9yIGFuIGludGVycnVwdGlvbi5cblxuICAgIGZ1bmN0aW9uIGluc3BlY3RGbG93RW5kKGNvZGUpIHtcbiAgICAgIGluc3BlY3RSZXN1bHQuZmxvd0VuZCA9IHRydWVcbiAgICAgIHJldHVybiBpbnNwZWN0RG9uZShjb2RlKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3BlY3REb25lKGNvZGUpIHtcbiAgICAgIGluc3BlY3RSZXN1bHQuY29udGludWVkID0gc3ViY29udGludWVkXG4gICAgICBzZWxmLmludGVycnVwdCA9IHNlbGYuY29udGFpbmVyU3RhdGUgPSB1bmRlZmluZWRcbiAgICAgIHJldHVybiBvayhjb2RlKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUNvbnRhaW5lcihlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHJldHVybiBmYWN0b3J5U3BhY2UoXG4gICAgZWZmZWN0cyxcbiAgICBlZmZlY3RzLmF0dGVtcHQodGhpcy5wYXJzZXIuY29uc3RydWN0cy5kb2N1bWVudCwgb2ssIG5vayksXG4gICAgJ2xpbmVQcmVmaXgnLFxuICAgIHRoaXMucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluZGV4T2YoJ2NvZGVJbmRlbnRlZCcpID4gLTFcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IDRcbiAgKVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUxhenlGbG93KGVmZmVjdHMsIG9rLCBub2spIHtcbiAgcmV0dXJuIGZhY3RvcnlTcGFjZShcbiAgICBlZmZlY3RzLFxuICAgIGVmZmVjdHMubGF6eSh0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmZsb3csIG9rLCBub2spLFxuICAgICdsaW5lUHJlZml4JyxcbiAgICB0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmRleE9mKCdjb2RlSW5kZW50ZWQnKSA+IC0xXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiA0XG4gIClcbn1cblxuZXhwb3J0cy50b2tlbml6ZSA9IHRva2VuaXplXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbi8vIENvdW50cyB0YWJzIGJhc2VkIG9uIHRoZWlyIGV4cGFuZGVkIHNpemUsIGFuZCBDUitMRiBhcyBvbmUgY2hhcmFjdGVyLlxuXG5mdW5jdGlvbiBzaXplQ2h1bmtzKGNodW5rcykge1xuICB2YXIgaW5kZXggPSAtMVxuICB2YXIgc2l6ZSA9IDBcblxuICB3aGlsZSAoKytpbmRleCA8IGNodW5rcy5sZW5ndGgpIHtcbiAgICBzaXplICs9IHR5cGVvZiBjaHVua3NbaW5kZXhdID09PSAnc3RyaW5nJyA/IGNodW5rc1tpbmRleF0ubGVuZ3RoIDogMVxuICB9XG5cbiAgcmV0dXJuIHNpemVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaXplQ2h1bmtzXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBzaXplQ2h1bmtzID0gcmVxdWlyZSgnLi9zaXplLWNodW5rcy5qcycpXG5cbmZ1bmN0aW9uIHByZWZpeFNpemUoZXZlbnRzLCB0eXBlKSB7XG4gIHZhciB0YWlsID0gZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAxXVxuICBpZiAoIXRhaWwgfHwgdGFpbFsxXS50eXBlICE9PSB0eXBlKSByZXR1cm4gMFxuICByZXR1cm4gc2l6ZUNodW5rcyh0YWlsWzJdLnNsaWNlU3RyZWFtKHRhaWxbMV0pKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHByZWZpeFNpemVcbiIsICIndXNlIHN0cmljdCdcblxudmFyIHNwbGljZSA9IFtdLnNwbGljZVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNwbGljZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgc3BsaWNlID0gcmVxdWlyZSgnLi4vY29uc3RhbnQvc3BsaWNlLmpzJylcblxuLy8gY2F1c2VzIGEgc3RhY2sgb3ZlcmZsb3cgaW4gVjggd2hlbiB0cnlpbmcgdG8gaW5zZXJ0IDEwMGsgaXRlbXMgZm9yIGluc3RhbmNlLlxuXG5mdW5jdGlvbiBjaHVua2VkU3BsaWNlKGxpc3QsIHN0YXJ0LCByZW1vdmUsIGl0ZW1zKSB7XG4gIHZhciBlbmQgPSBsaXN0Lmxlbmd0aFxuICB2YXIgY2h1bmtTdGFydCA9IDBcbiAgdmFyIHBhcmFtZXRlcnMgLy8gTWFrZSBzdGFydCBiZXR3ZWVuIHplcm8gYW5kIGBlbmRgIChpbmNsdWRlZCkuXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gLXN0YXJ0ID4gZW5kID8gMCA6IGVuZCArIHN0YXJ0XG4gIH0gZWxzZSB7XG4gICAgc3RhcnQgPSBzdGFydCA+IGVuZCA/IGVuZCA6IHN0YXJ0XG4gIH1cblxuICByZW1vdmUgPSByZW1vdmUgPiAwID8gcmVtb3ZlIDogMCAvLyBObyBuZWVkIHRvIGNodW5rIHRoZSBpdGVtcyBpZiB0aGVyZVx1MjAxOXMgb25seSBhIGNvdXBsZSAoMTBrKSBpdGVtcy5cblxuICBpZiAoaXRlbXMubGVuZ3RoIDwgMTAwMDApIHtcbiAgICBwYXJhbWV0ZXJzID0gQXJyYXkuZnJvbShpdGVtcylcbiAgICBwYXJhbWV0ZXJzLnVuc2hpZnQoc3RhcnQsIHJlbW92ZSlcbiAgICBzcGxpY2UuYXBwbHkobGlzdCwgcGFyYW1ldGVycylcbiAgfSBlbHNlIHtcbiAgICAvLyBEZWxldGUgYHJlbW92ZWAgaXRlbXMgc3RhcnRpbmcgZnJvbSBgc3RhcnRgXG4gICAgaWYgKHJlbW92ZSkgc3BsaWNlLmFwcGx5KGxpc3QsIFtzdGFydCwgcmVtb3ZlXSkgLy8gSW5zZXJ0IHRoZSBpdGVtcyBpbiBjaHVua3MgdG8gbm90IGNhdXNlIHN0YWNrIG92ZXJmbG93cy5cblxuICAgIHdoaWxlIChjaHVua1N0YXJ0IDwgaXRlbXMubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzID0gaXRlbXMuc2xpY2UoY2h1bmtTdGFydCwgY2h1bmtTdGFydCArIDEwMDAwKVxuICAgICAgcGFyYW1ldGVycy51bnNoaWZ0KHN0YXJ0LCAwKVxuICAgICAgc3BsaWNlLmFwcGx5KGxpc3QsIHBhcmFtZXRlcnMpXG4gICAgICBjaHVua1N0YXJ0ICs9IDEwMDAwXG4gICAgICBzdGFydCArPSAxMDAwMFxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNodW5rZWRTcGxpY2VcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4uL2NvbnN0YW50L2Fzc2lnbi5qcycpXG5cbmZ1bmN0aW9uIHNoYWxsb3cob2JqZWN0KSB7XG4gIHJldHVybiBhc3NpZ24oe30sIG9iamVjdClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaGFsbG93XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuLi9jb25zdGFudC9hc3NpZ24uanMnKVxudmFyIGNodW5rZWRTcGxpY2UgPSByZXF1aXJlKCcuL2NodW5rZWQtc3BsaWNlLmpzJylcbnZhciBzaGFsbG93ID0gcmVxdWlyZSgnLi9zaGFsbG93LmpzJylcblxuZnVuY3Rpb24gc3VidG9rZW5pemUoZXZlbnRzKSB7XG4gIHZhciBqdW1wcyA9IHt9XG4gIHZhciBpbmRleCA9IC0xXG4gIHZhciBldmVudFxuICB2YXIgbGluZUluZGV4XG4gIHZhciBvdGhlckluZGV4XG4gIHZhciBvdGhlckV2ZW50XG4gIHZhciBwYXJhbWV0ZXJzXG4gIHZhciBzdWJldmVudHNcbiAgdmFyIG1vcmVcblxuICB3aGlsZSAoKytpbmRleCA8IGV2ZW50cy5sZW5ndGgpIHtcbiAgICB3aGlsZSAoaW5kZXggaW4ganVtcHMpIHtcbiAgICAgIGluZGV4ID0ganVtcHNbaW5kZXhdXG4gICAgfVxuXG4gICAgZXZlbnQgPSBldmVudHNbaW5kZXhdIC8vIEFkZCBhIGhvb2sgZm9yIHRoZSBHRk0gdGFza2xpc3QgZXh0ZW5zaW9uLCB3aGljaCBuZWVkcyB0byBrbm93IGlmIHRleHRcbiAgICAvLyBpcyBpbiB0aGUgZmlyc3QgY29udGVudCBvZiBhIGxpc3QgaXRlbS5cblxuICAgIGlmIChcbiAgICAgIGluZGV4ICYmXG4gICAgICBldmVudFsxXS50eXBlID09PSAnY2h1bmtGbG93JyAmJlxuICAgICAgZXZlbnRzW2luZGV4IC0gMV1bMV0udHlwZSA9PT0gJ2xpc3RJdGVtUHJlZml4J1xuICAgICkge1xuICAgICAgc3ViZXZlbnRzID0gZXZlbnRbMV0uX3Rva2VuaXplci5ldmVudHNcbiAgICAgIG90aGVySW5kZXggPSAwXG5cbiAgICAgIGlmIChcbiAgICAgICAgb3RoZXJJbmRleCA8IHN1YmV2ZW50cy5sZW5ndGggJiZcbiAgICAgICAgc3ViZXZlbnRzW290aGVySW5kZXhdWzFdLnR5cGUgPT09ICdsaW5lRW5kaW5nQmxhbmsnXG4gICAgICApIHtcbiAgICAgICAgb3RoZXJJbmRleCArPSAyXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgb3RoZXJJbmRleCA8IHN1YmV2ZW50cy5sZW5ndGggJiZcbiAgICAgICAgc3ViZXZlbnRzW290aGVySW5kZXhdWzFdLnR5cGUgPT09ICdjb250ZW50J1xuICAgICAgKSB7XG4gICAgICAgIHdoaWxlICgrK290aGVySW5kZXggPCBzdWJldmVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHN1YmV2ZW50c1tvdGhlckluZGV4XVsxXS50eXBlID09PSAnY29udGVudCcpIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN1YmV2ZW50c1tvdGhlckluZGV4XVsxXS50eXBlID09PSAnY2h1bmtUZXh0Jykge1xuICAgICAgICAgICAgc3ViZXZlbnRzW290aGVySW5kZXhdWzFdLmlzSW5GaXJzdENvbnRlbnRPZkxpc3RJdGVtID0gdHJ1ZVxuICAgICAgICAgICAgb3RoZXJJbmRleCsrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBFbnRlci5cblxuICAgIGlmIChldmVudFswXSA9PT0gJ2VudGVyJykge1xuICAgICAgaWYgKGV2ZW50WzFdLmNvbnRlbnRUeXBlKSB7XG4gICAgICAgIGFzc2lnbihqdW1wcywgc3ViY29udGVudChldmVudHMsIGluZGV4KSlcbiAgICAgICAgaW5kZXggPSBqdW1wc1tpbmRleF1cbiAgICAgICAgbW9yZSA9IHRydWVcbiAgICAgIH1cbiAgICB9IC8vIEV4aXQuXG4gICAgZWxzZSBpZiAoZXZlbnRbMV0uX2NvbnRhaW5lciB8fCBldmVudFsxXS5fbW92ZVByZXZpb3VzTGluZUVuZGluZ3MpIHtcbiAgICAgIG90aGVySW5kZXggPSBpbmRleFxuICAgICAgbGluZUluZGV4ID0gdW5kZWZpbmVkXG5cbiAgICAgIHdoaWxlIChvdGhlckluZGV4LS0pIHtcbiAgICAgICAgb3RoZXJFdmVudCA9IGV2ZW50c1tvdGhlckluZGV4XVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBvdGhlckV2ZW50WzFdLnR5cGUgPT09ICdsaW5lRW5kaW5nJyB8fFxuICAgICAgICAgIG90aGVyRXZlbnRbMV0udHlwZSA9PT0gJ2xpbmVFbmRpbmdCbGFuaydcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKG90aGVyRXZlbnRbMF0gPT09ICdlbnRlcicpIHtcbiAgICAgICAgICAgIGlmIChsaW5lSW5kZXgpIHtcbiAgICAgICAgICAgICAgZXZlbnRzW2xpbmVJbmRleF1bMV0udHlwZSA9ICdsaW5lRW5kaW5nQmxhbmsnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG90aGVyRXZlbnRbMV0udHlwZSA9ICdsaW5lRW5kaW5nJ1xuICAgICAgICAgICAgbGluZUluZGV4ID0gb3RoZXJJbmRleFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChsaW5lSW5kZXgpIHtcbiAgICAgICAgLy8gRml4IHBvc2l0aW9uLlxuICAgICAgICBldmVudFsxXS5lbmQgPSBzaGFsbG93KGV2ZW50c1tsaW5lSW5kZXhdWzFdLnN0YXJ0KSAvLyBTd2l0Y2ggY29udGFpbmVyIGV4aXQgdy8gbGluZSBlbmRpbmdzLlxuXG4gICAgICAgIHBhcmFtZXRlcnMgPSBldmVudHMuc2xpY2UobGluZUluZGV4LCBpbmRleClcbiAgICAgICAgcGFyYW1ldGVycy51bnNoaWZ0KGV2ZW50KVxuICAgICAgICBjaHVua2VkU3BsaWNlKGV2ZW50cywgbGluZUluZGV4LCBpbmRleCAtIGxpbmVJbmRleCArIDEsIHBhcmFtZXRlcnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICFtb3JlXG59XG5cbmZ1bmN0aW9uIHN1YmNvbnRlbnQoZXZlbnRzLCBldmVudEluZGV4KSB7XG4gIHZhciB0b2tlbiA9IGV2ZW50c1tldmVudEluZGV4XVsxXVxuICB2YXIgY29udGV4dCA9IGV2ZW50c1tldmVudEluZGV4XVsyXVxuICB2YXIgc3RhcnRQb3NpdGlvbiA9IGV2ZW50SW5kZXggLSAxXG4gIHZhciBzdGFydFBvc2l0aW9ucyA9IFtdXG4gIHZhciB0b2tlbml6ZXIgPVxuICAgIHRva2VuLl90b2tlbml6ZXIgfHwgY29udGV4dC5wYXJzZXJbdG9rZW4uY29udGVudFR5cGVdKHRva2VuLnN0YXJ0KVxuICB2YXIgY2hpbGRFdmVudHMgPSB0b2tlbml6ZXIuZXZlbnRzXG4gIHZhciBqdW1wcyA9IFtdXG4gIHZhciBnYXBzID0ge31cbiAgdmFyIHN0cmVhbVxuICB2YXIgcHJldmlvdXNcbiAgdmFyIGluZGV4XG4gIHZhciBlbnRlcmVkXG4gIHZhciBlbmRcbiAgdmFyIGFkanVzdCAvLyBMb29wIGZvcndhcmQgdGhyb3VnaCB0aGUgbGlua2VkIHRva2VucyB0byBwYXNzIHRoZW0gaW4gb3JkZXIgdG8gdGhlXG4gIC8vIHN1YnRva2VuaXplci5cblxuICB3aGlsZSAodG9rZW4pIHtcbiAgICAvLyBGaW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgZXZlbnQgZm9yIHRoaXMgdG9rZW4uXG4gICAgd2hpbGUgKGV2ZW50c1srK3N0YXJ0UG9zaXRpb25dWzFdICE9PSB0b2tlbikge1xuICAgICAgLy8gRW1wdHkuXG4gICAgfVxuXG4gICAgc3RhcnRQb3NpdGlvbnMucHVzaChzdGFydFBvc2l0aW9uKVxuXG4gICAgaWYgKCF0b2tlbi5fdG9rZW5pemVyKSB7XG4gICAgICBzdHJlYW0gPSBjb250ZXh0LnNsaWNlU3RyZWFtKHRva2VuKVxuXG4gICAgICBpZiAoIXRva2VuLm5leHQpIHtcbiAgICAgICAgc3RyZWFtLnB1c2gobnVsbClcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgIHRva2VuaXplci5kZWZpbmVTa2lwKHRva2VuLnN0YXJ0KVxuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4uaXNJbkZpcnN0Q29udGVudE9mTGlzdEl0ZW0pIHtcbiAgICAgICAgdG9rZW5pemVyLl9nZm1UYXNrbGlzdEZpcnN0Q29udGVudE9mTGlzdEl0ZW0gPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIHRva2VuaXplci53cml0ZShzdHJlYW0pXG5cbiAgICAgIGlmICh0b2tlbi5pc0luRmlyc3RDb250ZW50T2ZMaXN0SXRlbSkge1xuICAgICAgICB0b2tlbml6ZXIuX2dmbVRhc2tsaXN0Rmlyc3RDb250ZW50T2ZMaXN0SXRlbSA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0gLy8gVW5yYXZlbCB0aGUgbmV4dCB0b2tlbi5cblxuICAgIHByZXZpb3VzID0gdG9rZW5cbiAgICB0b2tlbiA9IHRva2VuLm5leHRcbiAgfSAvLyBOb3csIGxvb3AgYmFjayB0aHJvdWdoIGFsbCBldmVudHMgKGFuZCBsaW5rZWQgdG9rZW5zKSwgdG8gZmlndXJlIG91dCB3aGljaFxuICAvLyBwYXJ0cyBiZWxvbmcgd2hlcmUuXG5cbiAgdG9rZW4gPSBwcmV2aW91c1xuICBpbmRleCA9IGNoaWxkRXZlbnRzLmxlbmd0aFxuXG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgLy8gTWFrZSBzdXJlIHdlXHUyMDE5dmUgYXQgbGVhc3Qgc2VlbiBzb21ldGhpbmcgKGZpbmFsIGVvbCBpcyBwYXJ0IG9mIHRoZSBsYXN0XG4gICAgLy8gdG9rZW4pLlxuICAgIGlmIChjaGlsZEV2ZW50c1tpbmRleF1bMF0gPT09ICdlbnRlcicpIHtcbiAgICAgIGVudGVyZWQgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIEZpbmQgYSB2b2lkIHRva2VuIHRoYXQgaW5jbHVkZXMgYSBicmVhay5cbiAgICAgIGVudGVyZWQgJiZcbiAgICAgIGNoaWxkRXZlbnRzW2luZGV4XVsxXS50eXBlID09PSBjaGlsZEV2ZW50c1tpbmRleCAtIDFdWzFdLnR5cGUgJiZcbiAgICAgIGNoaWxkRXZlbnRzW2luZGV4XVsxXS5zdGFydC5saW5lICE9PSBjaGlsZEV2ZW50c1tpbmRleF1bMV0uZW5kLmxpbmVcbiAgICApIHtcbiAgICAgIGFkZChjaGlsZEV2ZW50cy5zbGljZShpbmRleCArIDEsIGVuZCkpXG4gICAgICAvLyBIZWxwIEdDLlxuICAgICAgdG9rZW4uX3Rva2VuaXplciA9IHRva2VuLm5leHQgPSB1bmRlZmluZWRcbiAgICAgIHRva2VuID0gdG9rZW4ucHJldmlvdXNcbiAgICAgIGVuZCA9IGluZGV4ICsgMVxuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHAgR0MuXG4gIHRva2VuaXplci5ldmVudHMgPSB0b2tlbi5fdG9rZW5pemVyID0gdG9rZW4ubmV4dCA9IHVuZGVmaW5lZCAvLyBEbyBoZWFkOlxuXG4gIGFkZChjaGlsZEV2ZW50cy5zbGljZSgwLCBlbmQpKVxuICBpbmRleCA9IC0xXG4gIGFkanVzdCA9IDBcblxuICB3aGlsZSAoKytpbmRleCA8IGp1bXBzLmxlbmd0aCkge1xuICAgIGdhcHNbYWRqdXN0ICsganVtcHNbaW5kZXhdWzBdXSA9IGFkanVzdCArIGp1bXBzW2luZGV4XVsxXVxuICAgIGFkanVzdCArPSBqdW1wc1tpbmRleF1bMV0gLSBqdW1wc1tpbmRleF1bMF0gLSAxXG4gIH1cblxuICByZXR1cm4gZ2Fwc1xuXG4gIGZ1bmN0aW9uIGFkZChzbGljZSkge1xuICAgIHZhciBzdGFydCA9IHN0YXJ0UG9zaXRpb25zLnBvcCgpXG4gICAganVtcHMudW5zaGlmdChbc3RhcnQsIHN0YXJ0ICsgc2xpY2UubGVuZ3RoIC0gMV0pXG4gICAgY2h1bmtlZFNwbGljZShldmVudHMsIHN0YXJ0LCAyLCBzbGljZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN1YnRva2VuaXplXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIHByZWZpeFNpemUgPSByZXF1aXJlKCcuLi91dGlsL3ByZWZpeC1zaXplLmpzJylcbnZhciBzdWJ0b2tlbml6ZSA9IHJlcXVpcmUoJy4uL3V0aWwvc3VidG9rZW5pemUuanMnKVxudmFyIGZhY3RvcnlTcGFjZSA9IHJlcXVpcmUoJy4vZmFjdG9yeS1zcGFjZS5qcycpXG5cbi8vIE5vIG5hbWUgYmVjYXVzZSBpdCBtdXN0IG5vdCBiZSB0dXJuZWQgb2ZmLlxudmFyIGNvbnRlbnQgPSB7XG4gIHRva2VuaXplOiB0b2tlbml6ZUNvbnRlbnQsXG4gIHJlc29sdmU6IHJlc29sdmVDb250ZW50LFxuICBpbnRlcnJ1cHRpYmxlOiB0cnVlLFxuICBsYXp5OiB0cnVlXG59XG52YXIgY29udGludWF0aW9uQ29uc3RydWN0ID0ge1xuICB0b2tlbml6ZTogdG9rZW5pemVDb250aW51YXRpb24sXG4gIHBhcnRpYWw6IHRydWVcbn0gLy8gQ29udGVudCBpcyB0cmFuc3BhcmVudDogaXRcdTIwMTlzIHBhcnNlZCByaWdodCBub3cuIFRoYXQgd2F5LCBkZWZpbml0aW9ucyBhcmUgYWxzb1xuLy8gcGFyc2VkIHJpZ2h0IG5vdzogYmVmb3JlIHRleHQgaW4gcGFyYWdyYXBocyAoc3BlY2lmaWNhbGx5LCBtZWRpYSkgYXJlIHBhcnNlZC5cblxuZnVuY3Rpb24gcmVzb2x2ZUNvbnRlbnQoZXZlbnRzKSB7XG4gIHN1YnRva2VuaXplKGV2ZW50cylcbiAgcmV0dXJuIGV2ZW50c1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUNvbnRlbnQoZWZmZWN0cywgb2spIHtcbiAgdmFyIHByZXZpb3VzXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdjb250ZW50JylcbiAgICBwcmV2aW91cyA9IGVmZmVjdHMuZW50ZXIoJ2NodW5rQ29udGVudCcsIHtcbiAgICAgIGNvbnRlbnRUeXBlOiAnY29udGVudCdcbiAgICB9KVxuICAgIHJldHVybiBkYXRhKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBkYXRhKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRFbmQoY29kZSlcbiAgICB9XG5cbiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhcbiAgICAgICAgY29udGludWF0aW9uQ29uc3RydWN0LFxuICAgICAgICBjb250ZW50Q29udGludWUsXG4gICAgICAgIGNvbnRlbnRFbmRcbiAgICAgICkoY29kZSlcbiAgICB9IC8vIERhdGEuXG5cbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgZnVuY3Rpb24gY29udGVudEVuZChjb2RlKSB7XG4gICAgZWZmZWN0cy5leGl0KCdjaHVua0NvbnRlbnQnKVxuICAgIGVmZmVjdHMuZXhpdCgnY29udGVudCcpXG4gICAgcmV0dXJuIG9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb250ZW50Q29udGludWUoY29kZSkge1xuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgnY2h1bmtDb250ZW50JylcbiAgICBwcmV2aW91cyA9IHByZXZpb3VzLm5leHQgPSBlZmZlY3RzLmVudGVyKCdjaHVua0NvbnRlbnQnLCB7XG4gICAgICBjb250ZW50VHlwZTogJ2NvbnRlbnQnLFxuICAgICAgcHJldmlvdXM6IHByZXZpb3VzXG4gICAgfSlcbiAgICByZXR1cm4gZGF0YVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplQ29udGludWF0aW9uKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHJldHVybiBzdGFydExvb2thaGVhZFxuXG4gIGZ1bmN0aW9uIHN0YXJ0TG9va2FoZWFkKGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdsaW5lRW5kaW5nJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ2xpbmVFbmRpbmcnKVxuICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgcHJlZml4ZWQsICdsaW5lUHJlZml4JylcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZWZpeGVkKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzZWxmLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmRleE9mKCdjb2RlSW5kZW50ZWQnKSA+IC0xIHx8XG4gICAgICBwcmVmaXhTaXplKHNlbGYuZXZlbnRzLCAnbGluZVByZWZpeCcpIDwgNFxuICAgICkge1xuICAgICAgcmV0dXJuIGVmZmVjdHMuaW50ZXJydXB0KHNlbGYucGFyc2VyLmNvbnN0cnVjdHMuZmxvdywgbm9rLCBvaykoY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gb2soY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnRcbiIsICIndXNlIHN0cmljdCdcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge3ZhbHVlOiB0cnVlfSlcblxudmFyIGNvbnRlbnQgPSByZXF1aXJlKCcuLi90b2tlbml6ZS9jb250ZW50LmpzJylcbnZhciBmYWN0b3J5U3BhY2UgPSByZXF1aXJlKCcuLi90b2tlbml6ZS9mYWN0b3J5LXNwYWNlLmpzJylcbnZhciBwYXJ0aWFsQmxhbmtMaW5lID0gcmVxdWlyZSgnLi4vdG9rZW5pemUvcGFydGlhbC1ibGFuay1saW5lLmpzJylcblxudmFyIHRva2VuaXplID0gaW5pdGlhbGl6ZUZsb3dcblxuZnVuY3Rpb24gaW5pdGlhbGl6ZUZsb3coZWZmZWN0cykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIGluaXRpYWwgPSBlZmZlY3RzLmF0dGVtcHQoXG4gICAgLy8gVHJ5IHRvIHBhcnNlIGEgYmxhbmsgbGluZS5cbiAgICBwYXJ0aWFsQmxhbmtMaW5lLFxuICAgIGF0QmxhbmtFbmRpbmcsIC8vIFRyeSB0byBwYXJzZSBpbml0aWFsIGZsb3cgKGVzc2VudGlhbGx5LCBvbmx5IGNvZGUpLlxuICAgIGVmZmVjdHMuYXR0ZW1wdChcbiAgICAgIHRoaXMucGFyc2VyLmNvbnN0cnVjdHMuZmxvd0luaXRpYWwsXG4gICAgICBhZnRlckNvbnN0cnVjdCxcbiAgICAgIGZhY3RvcnlTcGFjZShcbiAgICAgICAgZWZmZWN0cyxcbiAgICAgICAgZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgICAgIHRoaXMucGFyc2VyLmNvbnN0cnVjdHMuZmxvdyxcbiAgICAgICAgICBhZnRlckNvbnN0cnVjdCxcbiAgICAgICAgICBlZmZlY3RzLmF0dGVtcHQoY29udGVudCwgYWZ0ZXJDb25zdHJ1Y3QpXG4gICAgICAgICksXG4gICAgICAgICdsaW5lUHJlZml4J1xuICAgICAgKVxuICAgIClcbiAgKVxuICByZXR1cm4gaW5pdGlhbFxuXG4gIGZ1bmN0aW9uIGF0QmxhbmtFbmRpbmcoY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGVmZmVjdHMuZW50ZXIoJ2xpbmVFbmRpbmdCbGFuaycpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgZWZmZWN0cy5leGl0KCdsaW5lRW5kaW5nQmxhbmsnKVxuICAgIHNlbGYuY3VycmVudENvbnN0cnVjdCA9IHVuZGVmaW5lZFxuICAgIHJldHVybiBpbml0aWFsXG4gIH1cblxuICBmdW5jdGlvbiBhZnRlckNvbnN0cnVjdChjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignbGluZUVuZGluZycpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgZWZmZWN0cy5leGl0KCdsaW5lRW5kaW5nJylcbiAgICBzZWxmLmN1cnJlbnRDb25zdHJ1Y3QgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gaW5pdGlhbFxuICB9XG59XG5cbmV4cG9ydHMudG9rZW5pemUgPSB0b2tlbml6ZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7dmFsdWU6IHRydWV9KVxuXG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi4vY29uc3RhbnQvYXNzaWduLmpzJylcbnZhciBzaGFsbG93ID0gcmVxdWlyZSgnLi4vdXRpbC9zaGFsbG93LmpzJylcblxudmFyIHRleHQgPSBpbml0aWFsaXplRmFjdG9yeSgndGV4dCcpXG52YXIgc3RyaW5nID0gaW5pdGlhbGl6ZUZhY3RvcnkoJ3N0cmluZycpXG52YXIgcmVzb2x2ZXIgPSB7XG4gIHJlc29sdmVBbGw6IGNyZWF0ZVJlc29sdmVyKClcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZUZhY3RvcnkoZmllbGQpIHtcbiAgcmV0dXJuIHtcbiAgICB0b2tlbml6ZTogaW5pdGlhbGl6ZVRleHQsXG4gICAgcmVzb2x2ZUFsbDogY3JlYXRlUmVzb2x2ZXIoXG4gICAgICBmaWVsZCA9PT0gJ3RleHQnID8gcmVzb2x2ZUFsbExpbmVTdWZmaXhlcyA6IHVuZGVmaW5lZFxuICAgIClcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemVUZXh0KGVmZmVjdHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICB2YXIgY29uc3RydWN0cyA9IHRoaXMucGFyc2VyLmNvbnN0cnVjdHNbZmllbGRdXG4gICAgdmFyIHRleHQgPSBlZmZlY3RzLmF0dGVtcHQoY29uc3RydWN0cywgc3RhcnQsIG5vdFRleHQpXG4gICAgcmV0dXJuIHN0YXJ0XG5cbiAgICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgICByZXR1cm4gYXRCcmVhayhjb2RlKSA/IHRleHQoY29kZSkgOiBub3RUZXh0KGNvZGUpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm90VGV4dChjb2RlKSB7XG4gICAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2RhdGEnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRhdGEoY29kZSkge1xuICAgICAgaWYgKGF0QnJlYWsoY29kZSkpIHtcbiAgICAgICAgZWZmZWN0cy5leGl0KCdkYXRhJylcbiAgICAgICAgcmV0dXJuIHRleHQoY29kZSlcbiAgICAgIH0gLy8gRGF0YS5cblxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGF0QnJlYWsoY29kZSkge1xuICAgICAgdmFyIGxpc3QgPSBjb25zdHJ1Y3RzW2NvZGVdXG4gICAgICB2YXIgaW5kZXggPSAtMVxuXG4gICAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBpZiAobGlzdCkge1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWxpc3RbaW5kZXhdLnByZXZpb3VzIHx8XG4gICAgICAgICAgICBsaXN0W2luZGV4XS5wcmV2aW91cy5jYWxsKHNlbGYsIHNlbGYucHJldmlvdXMpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVSZXNvbHZlcihleHRyYVJlc29sdmVyKSB7XG4gIHJldHVybiByZXNvbHZlQWxsVGV4dFxuXG4gIGZ1bmN0aW9uIHJlc29sdmVBbGxUZXh0KGV2ZW50cywgY29udGV4dCkge1xuICAgIHZhciBpbmRleCA9IC0xXG4gICAgdmFyIGVudGVyIC8vIEEgcmF0aGVyIGJvcmluZyBjb21wdXRhdGlvbiAodG8gbWVyZ2UgYWRqYWNlbnQgYGRhdGFgIGV2ZW50cykgd2hpY2hcbiAgICAvLyBpbXByb3ZlcyBtbSBwZXJmb3JtYW5jZSBieSAyOSUuXG5cbiAgICB3aGlsZSAoKytpbmRleCA8PSBldmVudHMubGVuZ3RoKSB7XG4gICAgICBpZiAoZW50ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZXZlbnRzW2luZGV4XSAmJiBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdkYXRhJykge1xuICAgICAgICAgIGVudGVyID0gaW5kZXhcbiAgICAgICAgICBpbmRleCsrXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWV2ZW50c1tpbmRleF0gfHwgZXZlbnRzW2luZGV4XVsxXS50eXBlICE9PSAnZGF0YScpIHtcbiAgICAgICAgLy8gRG9uXHUyMDE5dCBkbyBhbnl0aGluZyBpZiB0aGVyZSBpcyBvbmUgZGF0YSB0b2tlbi5cbiAgICAgICAgaWYgKGluZGV4ICE9PSBlbnRlciArIDIpIHtcbiAgICAgICAgICBldmVudHNbZW50ZXJdWzFdLmVuZCA9IGV2ZW50c1tpbmRleCAtIDFdWzFdLmVuZFxuICAgICAgICAgIGV2ZW50cy5zcGxpY2UoZW50ZXIgKyAyLCBpbmRleCAtIGVudGVyIC0gMilcbiAgICAgICAgICBpbmRleCA9IGVudGVyICsgMlxuICAgICAgICB9XG5cbiAgICAgICAgZW50ZXIgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXh0cmFSZXNvbHZlciA/IGV4dHJhUmVzb2x2ZXIoZXZlbnRzLCBjb250ZXh0KSA6IGV2ZW50c1xuICB9XG59IC8vIEEgcmF0aGVyIHVnbHkgc2V0IG9mIGluc3RydWN0aW9ucyB3aGljaCBhZ2FpbiBsb29rcyBhdCBjaHVua3MgaW4gdGhlIGlucHV0XG4vLyBzdHJlYW0uXG4vLyBUaGUgcmVhc29uIHRvIGRvIHRoaXMgaGVyZSBpcyB0aGF0IGl0IGlzICptdWNoKiBmYXN0ZXIgdG8gcGFyc2UgaW4gcmV2ZXJzZS5cbi8vIEFuZCB0aGF0IHdlIGNhblx1MjAxOXQgaG9vayBpbnRvIGBudWxsYCB0byBzcGxpdCB0aGUgbGluZSBzdWZmaXggYmVmb3JlIGFuIEVPRi5cbi8vIFRvIGRvOiBmaWd1cmUgb3V0IGlmIHdlIGNhbiBtYWtlIHRoaXMgaW50byBhIGNsZWFuIHV0aWxpdHksIG9yIGV2ZW4gaW4gY29yZS5cbi8vIEFzIGl0IHdpbGwgYmUgdXNlZnVsIGZvciBHRk1zIGxpdGVyYWwgYXV0b2xpbmsgZXh0ZW5zaW9uIChhbmQgbWF5YmUgZXZlblxuLy8gdGFibGVzPylcblxuZnVuY3Rpb24gcmVzb2x2ZUFsbExpbmVTdWZmaXhlcyhldmVudHMsIGNvbnRleHQpIHtcbiAgdmFyIGV2ZW50SW5kZXggPSAtMVxuICB2YXIgY2h1bmtzXG4gIHZhciBkYXRhXG4gIHZhciBjaHVua1xuICB2YXIgaW5kZXhcbiAgdmFyIGJ1ZmZlckluZGV4XG4gIHZhciBzaXplXG4gIHZhciB0YWJzXG4gIHZhciB0b2tlblxuXG4gIHdoaWxlICgrK2V2ZW50SW5kZXggPD0gZXZlbnRzLmxlbmd0aCkge1xuICAgIGlmIChcbiAgICAgIChldmVudEluZGV4ID09PSBldmVudHMubGVuZ3RoIHx8XG4gICAgICAgIGV2ZW50c1tldmVudEluZGV4XVsxXS50eXBlID09PSAnbGluZUVuZGluZycpICYmXG4gICAgICBldmVudHNbZXZlbnRJbmRleCAtIDFdWzFdLnR5cGUgPT09ICdkYXRhJ1xuICAgICkge1xuICAgICAgZGF0YSA9IGV2ZW50c1tldmVudEluZGV4IC0gMV1bMV1cbiAgICAgIGNodW5rcyA9IGNvbnRleHQuc2xpY2VTdHJlYW0oZGF0YSlcbiAgICAgIGluZGV4ID0gY2h1bmtzLmxlbmd0aFxuICAgICAgYnVmZmVySW5kZXggPSAtMVxuICAgICAgc2l6ZSA9IDBcbiAgICAgIHRhYnMgPSB1bmRlZmluZWRcblxuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgY2h1bmsgPSBjaHVua3NbaW5kZXhdXG5cbiAgICAgICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBidWZmZXJJbmRleCA9IGNodW5rLmxlbmd0aFxuXG4gICAgICAgICAgd2hpbGUgKGNodW5rLmNoYXJDb2RlQXQoYnVmZmVySW5kZXggLSAxKSA9PT0gMzIpIHtcbiAgICAgICAgICAgIHNpemUrK1xuICAgICAgICAgICAgYnVmZmVySW5kZXgtLVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChidWZmZXJJbmRleCkgYnJlYWtcbiAgICAgICAgICBidWZmZXJJbmRleCA9IC0xXG4gICAgICAgIH0gLy8gTnVtYmVyXG4gICAgICAgIGVsc2UgaWYgKGNodW5rID09PSAtMikge1xuICAgICAgICAgIHRhYnMgPSB0cnVlXG4gICAgICAgICAgc2l6ZSsrXG4gICAgICAgIH0gZWxzZSBpZiAoY2h1bmsgPT09IC0xKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gUmVwbGFjZW1lbnQgY2hhcmFjdGVyLCBleGl0LlxuICAgICAgICAgIGluZGV4KytcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzaXplKSB7XG4gICAgICAgIHRva2VuID0ge1xuICAgICAgICAgIHR5cGU6XG4gICAgICAgICAgICBldmVudEluZGV4ID09PSBldmVudHMubGVuZ3RoIHx8IHRhYnMgfHwgc2l6ZSA8IDJcbiAgICAgICAgICAgICAgPyAnbGluZVN1ZmZpeCdcbiAgICAgICAgICAgICAgOiAnaGFyZEJyZWFrVHJhaWxpbmcnLFxuICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICBsaW5lOiBkYXRhLmVuZC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBkYXRhLmVuZC5jb2x1bW4gLSBzaXplLFxuICAgICAgICAgICAgb2Zmc2V0OiBkYXRhLmVuZC5vZmZzZXQgLSBzaXplLFxuICAgICAgICAgICAgX2luZGV4OiBkYXRhLnN0YXJ0Ll9pbmRleCArIGluZGV4LFxuICAgICAgICAgICAgX2J1ZmZlckluZGV4OiBpbmRleFxuICAgICAgICAgICAgICA/IGJ1ZmZlckluZGV4XG4gICAgICAgICAgICAgIDogZGF0YS5zdGFydC5fYnVmZmVySW5kZXggKyBidWZmZXJJbmRleFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZW5kOiBzaGFsbG93KGRhdGEuZW5kKVxuICAgICAgICB9XG4gICAgICAgIGRhdGEuZW5kID0gc2hhbGxvdyh0b2tlbi5zdGFydClcblxuICAgICAgICBpZiAoZGF0YS5zdGFydC5vZmZzZXQgPT09IGRhdGEuZW5kLm9mZnNldCkge1xuICAgICAgICAgIGFzc2lnbihkYXRhLCB0b2tlbilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBldmVudHMuc3BsaWNlKFxuICAgICAgICAgICAgZXZlbnRJbmRleCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBbJ2VudGVyJywgdG9rZW4sIGNvbnRleHRdLFxuICAgICAgICAgICAgWydleGl0JywgdG9rZW4sIGNvbnRleHRdXG4gICAgICAgICAgKVxuICAgICAgICAgIGV2ZW50SW5kZXggKz0gMlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGV2ZW50SW5kZXgrK1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBldmVudHNcbn1cblxuZXhwb3J0cy5yZXNvbHZlciA9IHJlc29sdmVyXG5leHBvcnRzLnN0cmluZyA9IHN0cmluZ1xuZXhwb3J0cy50ZXh0ID0gdGV4dFxuIiwgIid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiBtaW5pZmxhdCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgID8gW11cbiAgICA6ICdsZW5ndGgnIGluIHZhbHVlXG4gICAgPyB2YWx1ZVxuICAgIDogW3ZhbHVlXVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pbmlmbGF0XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2NvbnN0YW50L2hhcy1vd24tcHJvcGVydHkuanMnKVxudmFyIGNodW5rZWRTcGxpY2UgPSByZXF1aXJlKCcuL2NodW5rZWQtc3BsaWNlLmpzJylcbnZhciBtaW5pZmxhdCA9IHJlcXVpcmUoJy4vbWluaWZsYXQuanMnKVxuXG5mdW5jdGlvbiBjb21iaW5lRXh0ZW5zaW9ucyhleHRlbnNpb25zKSB7XG4gIHZhciBhbGwgPSB7fVxuICB2YXIgaW5kZXggPSAtMVxuXG4gIHdoaWxlICgrK2luZGV4IDwgZXh0ZW5zaW9ucy5sZW5ndGgpIHtcbiAgICBleHRlbnNpb24oYWxsLCBleHRlbnNpb25zW2luZGV4XSlcbiAgfVxuXG4gIHJldHVybiBhbGxcbn1cblxuZnVuY3Rpb24gZXh0ZW5zaW9uKGFsbCwgZXh0ZW5zaW9uKSB7XG4gIHZhciBob29rXG4gIHZhciBsZWZ0XG4gIHZhciByaWdodFxuICB2YXIgY29kZVxuXG4gIGZvciAoaG9vayBpbiBleHRlbnNpb24pIHtcbiAgICBsZWZ0ID0gaGFzT3duUHJvcGVydHkuY2FsbChhbGwsIGhvb2spID8gYWxsW2hvb2tdIDogKGFsbFtob29rXSA9IHt9KVxuICAgIHJpZ2h0ID0gZXh0ZW5zaW9uW2hvb2tdXG5cbiAgICBmb3IgKGNvZGUgaW4gcmlnaHQpIHtcbiAgICAgIGxlZnRbY29kZV0gPSBjb25zdHJ1Y3RzKFxuICAgICAgICBtaW5pZmxhdChyaWdodFtjb2RlXSksXG4gICAgICAgIGhhc093blByb3BlcnR5LmNhbGwobGVmdCwgY29kZSkgPyBsZWZ0W2NvZGVdIDogW11cbiAgICAgIClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3RydWN0cyhsaXN0LCBleGlzdGluZykge1xuICB2YXIgaW5kZXggPSAtMVxuICB2YXIgYmVmb3JlID0gW11cblxuICB3aGlsZSAoKytpbmRleCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgOyhsaXN0W2luZGV4XS5hZGQgPT09ICdhZnRlcicgPyBleGlzdGluZyA6IGJlZm9yZSkucHVzaChsaXN0W2luZGV4XSlcbiAgfVxuXG4gIGNodW5rZWRTcGxpY2UoZXhpc3RpbmcsIDAsIDAsIGJlZm9yZSlcbiAgcmV0dXJuIGV4aXN0aW5nXG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tYmluZUV4dGVuc2lvbnNcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGNodW5rZWRTcGxpY2UgPSByZXF1aXJlKCcuL2NodW5rZWQtc3BsaWNlLmpzJylcblxuZnVuY3Rpb24gY2h1bmtlZFB1c2gobGlzdCwgaXRlbXMpIHtcbiAgaWYgKGxpc3QubGVuZ3RoKSB7XG4gICAgY2h1bmtlZFNwbGljZShsaXN0LCBsaXN0Lmxlbmd0aCwgMCwgaXRlbXMpXG4gICAgcmV0dXJuIGxpc3RcbiAgfVxuXG4gIHJldHVybiBpdGVtc1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNodW5rZWRQdXNoXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIHJlc29sdmVBbGwoY29uc3RydWN0cywgZXZlbnRzLCBjb250ZXh0KSB7XG4gIHZhciBjYWxsZWQgPSBbXVxuICB2YXIgaW5kZXggPSAtMVxuICB2YXIgcmVzb2x2ZVxuXG4gIHdoaWxlICgrK2luZGV4IDwgY29uc3RydWN0cy5sZW5ndGgpIHtcbiAgICByZXNvbHZlID0gY29uc3RydWN0c1tpbmRleF0ucmVzb2x2ZUFsbFxuXG4gICAgaWYgKHJlc29sdmUgJiYgY2FsbGVkLmluZGV4T2YocmVzb2x2ZSkgPCAwKSB7XG4gICAgICBldmVudHMgPSByZXNvbHZlKGV2ZW50cywgY29udGV4dClcbiAgICAgIGNhbGxlZC5wdXNoKHJlc29sdmUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50c1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlc29sdmVBbGxcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGZyb21DaGFyQ29kZSA9IHJlcXVpcmUoJy4uL2NvbnN0YW50L2Zyb20tY2hhci1jb2RlLmpzJylcblxuZnVuY3Rpb24gc2VyaWFsaXplQ2h1bmtzKGNodW5rcykge1xuICB2YXIgaW5kZXggPSAtMVxuICB2YXIgcmVzdWx0ID0gW11cbiAgdmFyIGNodW5rXG4gIHZhciB2YWx1ZVxuICB2YXIgYXRUYWJcblxuICB3aGlsZSAoKytpbmRleCA8IGNodW5rcy5sZW5ndGgpIHtcbiAgICBjaHVuayA9IGNodW5rc1tpbmRleF1cblxuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IGNodW5rXG4gICAgfSBlbHNlIGlmIChjaHVuayA9PT0gLTUpIHtcbiAgICAgIHZhbHVlID0gJ1xccidcbiAgICB9IGVsc2UgaWYgKGNodW5rID09PSAtNCkge1xuICAgICAgdmFsdWUgPSAnXFxuJ1xuICAgIH0gZWxzZSBpZiAoY2h1bmsgPT09IC0zKSB7XG4gICAgICB2YWx1ZSA9ICdcXHInICsgJ1xcbidcbiAgICB9IGVsc2UgaWYgKGNodW5rID09PSAtMikge1xuICAgICAgdmFsdWUgPSAnXFx0J1xuICAgIH0gZWxzZSBpZiAoY2h1bmsgPT09IC0xKSB7XG4gICAgICBpZiAoYXRUYWIpIGNvbnRpbnVlXG4gICAgICB2YWx1ZSA9ICcgJ1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDdXJyZW50bHkgb25seSByZXBsYWNlbWVudCBjaGFyYWN0ZXIuXG4gICAgICB2YWx1ZSA9IGZyb21DaGFyQ29kZShjaHVuaylcbiAgICB9XG5cbiAgICBhdFRhYiA9IGNodW5rID09PSAtMlxuICAgIHJlc3VsdC5wdXNoKHZhbHVlKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNlcmlhbGl6ZUNodW5rc1xuIiwgIid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiBzbGljZUNodW5rcyhjaHVua3MsIHRva2VuKSB7XG4gIHZhciBzdGFydEluZGV4ID0gdG9rZW4uc3RhcnQuX2luZGV4XG4gIHZhciBzdGFydEJ1ZmZlckluZGV4ID0gdG9rZW4uc3RhcnQuX2J1ZmZlckluZGV4XG4gIHZhciBlbmRJbmRleCA9IHRva2VuLmVuZC5faW5kZXhcbiAgdmFyIGVuZEJ1ZmZlckluZGV4ID0gdG9rZW4uZW5kLl9idWZmZXJJbmRleFxuICB2YXIgdmlld1xuXG4gIGlmIChzdGFydEluZGV4ID09PSBlbmRJbmRleCkge1xuICAgIHZpZXcgPSBbY2h1bmtzW3N0YXJ0SW5kZXhdLnNsaWNlKHN0YXJ0QnVmZmVySW5kZXgsIGVuZEJ1ZmZlckluZGV4KV1cbiAgfSBlbHNlIHtcbiAgICB2aWV3ID0gY2h1bmtzLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KVxuXG4gICAgaWYgKHN0YXJ0QnVmZmVySW5kZXggPiAtMSkge1xuICAgICAgdmlld1swXSA9IHZpZXdbMF0uc2xpY2Uoc3RhcnRCdWZmZXJJbmRleClcbiAgICB9XG5cbiAgICBpZiAoZW5kQnVmZmVySW5kZXggPiAwKSB7XG4gICAgICB2aWV3LnB1c2goY2h1bmtzW2VuZEluZGV4XS5zbGljZSgwLCBlbmRCdWZmZXJJbmRleCkpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZpZXdcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzbGljZUNodW5rc1xuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi4vY29uc3RhbnQvYXNzaWduLmpzJylcbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIGNodW5rZWRQdXNoID0gcmVxdWlyZSgnLi9jaHVua2VkLXB1c2guanMnKVxudmFyIGNodW5rZWRTcGxpY2UgPSByZXF1aXJlKCcuL2NodW5rZWQtc3BsaWNlLmpzJylcbnZhciBtaW5pZmxhdCA9IHJlcXVpcmUoJy4vbWluaWZsYXQuanMnKVxudmFyIHJlc29sdmVBbGwgPSByZXF1aXJlKCcuL3Jlc29sdmUtYWxsLmpzJylcbnZhciBzZXJpYWxpemVDaHVua3MgPSByZXF1aXJlKCcuL3NlcmlhbGl6ZS1jaHVua3MuanMnKVxudmFyIHNoYWxsb3cgPSByZXF1aXJlKCcuL3NoYWxsb3cuanMnKVxudmFyIHNsaWNlQ2h1bmtzID0gcmVxdWlyZSgnLi9zbGljZS1jaHVua3MuanMnKVxuXG4vLyBDcmVhdGUgYSB0b2tlbml6ZXIuXG4vLyBUb2tlbml6ZXJzIGRlYWwgd2l0aCBvbmUgdHlwZSBvZiBkYXRhIChlLmcuLCBjb250YWluZXJzLCBmbG93LCB0ZXh0KS5cbi8vIFRoZSBwYXJzZXIgaXMgdGhlIG9iamVjdCBkZWFsaW5nIHdpdGggaXQgYWxsLlxuLy8gYGluaXRpYWxpemVgIHdvcmtzIGxpa2Ugb3RoZXIgY29uc3RydWN0cywgZXhjZXB0IHRoYXQgb25seSBpdHMgYHRva2VuaXplYFxuLy8gZnVuY3Rpb24gaXMgdXNlZCwgaW4gd2hpY2ggY2FzZSBpdCBkb2Vzblx1MjAxOXQgcmVjZWl2ZSBhbiBgb2tgIG9yIGBub2tgLlxuLy8gYGZyb21gIGNhbiBiZSBnaXZlbiB0byBzZXQgdGhlIHBvaW50IGJlZm9yZSB0aGUgZmlyc3QgY2hhcmFjdGVyLCBhbHRob3VnaFxuLy8gd2hlbiBmdXJ0aGVyIGxpbmVzIGFyZSBpbmRlbnRlZCwgdGhleSBtdXN0IGJlIHNldCB3aXRoIGBkZWZpbmVTa2lwYC5cbmZ1bmN0aW9uIGNyZWF0ZVRva2VuaXplcihwYXJzZXIsIGluaXRpYWxpemUsIGZyb20pIHtcbiAgdmFyIHBvaW50ID0gZnJvbVxuICAgID8gc2hhbGxvdyhmcm9tKVxuICAgIDoge1xuICAgICAgICBsaW5lOiAxLFxuICAgICAgICBjb2x1bW46IDEsXG4gICAgICAgIG9mZnNldDogMFxuICAgICAgfVxuICB2YXIgY29sdW1uU3RhcnQgPSB7fVxuICB2YXIgcmVzb2x2ZUFsbENvbnN0cnVjdHMgPSBbXVxuICB2YXIgY2h1bmtzID0gW11cbiAgdmFyIHN0YWNrID0gW11cblxuICB2YXIgZWZmZWN0cyA9IHtcbiAgICBjb25zdW1lOiBjb25zdW1lLFxuICAgIGVudGVyOiBlbnRlcixcbiAgICBleGl0OiBleGl0LFxuICAgIGF0dGVtcHQ6IGNvbnN0cnVjdEZhY3Rvcnkob25zdWNjZXNzZnVsY29uc3RydWN0KSxcbiAgICBjaGVjazogY29uc3RydWN0RmFjdG9yeShvbnN1Y2Nlc3NmdWxjaGVjayksXG4gICAgaW50ZXJydXB0OiBjb25zdHJ1Y3RGYWN0b3J5KG9uc3VjY2Vzc2Z1bGNoZWNrLCB7XG4gICAgICBpbnRlcnJ1cHQ6IHRydWVcbiAgICB9KSxcbiAgICBsYXp5OiBjb25zdHJ1Y3RGYWN0b3J5KG9uc3VjY2Vzc2Z1bGNoZWNrLCB7XG4gICAgICBsYXp5OiB0cnVlXG4gICAgfSlcbiAgfSAvLyBTdGF0ZSBhbmQgdG9vbHMgZm9yIHJlc29sdmluZyBhbmQgc2VyaWFsaXppbmcuXG5cbiAgdmFyIGNvbnRleHQgPSB7XG4gICAgcHJldmlvdXM6IG51bGwsXG4gICAgZXZlbnRzOiBbXSxcbiAgICBwYXJzZXI6IHBhcnNlcixcbiAgICBzbGljZVN0cmVhbTogc2xpY2VTdHJlYW0sXG4gICAgc2xpY2VTZXJpYWxpemU6IHNsaWNlU2VyaWFsaXplLFxuICAgIG5vdzogbm93LFxuICAgIGRlZmluZVNraXA6IHNraXAsXG4gICAgd3JpdGU6IHdyaXRlXG4gIH0gLy8gVGhlIHN0YXRlIGZ1bmN0aW9uLlxuXG4gIHZhciBzdGF0ZSA9IGluaXRpYWxpemUudG9rZW5pemUuY2FsbChjb250ZXh0LCBlZmZlY3RzKSAvLyBUcmFjayB3aGljaCBjaGFyYWN0ZXIgd2UgZXhwZWN0IHRvIGJlIGNvbnN1bWVkLCB0byBjYXRjaCBidWdzLlxuXG4gIGlmIChpbml0aWFsaXplLnJlc29sdmVBbGwpIHtcbiAgICByZXNvbHZlQWxsQ29uc3RydWN0cy5wdXNoKGluaXRpYWxpemUpXG4gIH0gLy8gU3RvcmUgd2hlcmUgd2UgYXJlIGluIHRoZSBpbnB1dCBzdHJlYW0uXG5cbiAgcG9pbnQuX2luZGV4ID0gMFxuICBwb2ludC5fYnVmZmVySW5kZXggPSAtMVxuICByZXR1cm4gY29udGV4dFxuXG4gIGZ1bmN0aW9uIHdyaXRlKHNsaWNlKSB7XG4gICAgY2h1bmtzID0gY2h1bmtlZFB1c2goY2h1bmtzLCBzbGljZSlcbiAgICBtYWluKCkgLy8gRXhpdCBpZiB3ZVx1MjAxOXJlIG5vdCBkb25lLCByZXNvbHZlIG1pZ2h0IGNoYW5nZSBzdHVmZi5cblxuICAgIGlmIChjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICBhZGRSZXN1bHQoaW5pdGlhbGl6ZSwgMCkgLy8gT3RoZXJ3aXNlLCByZXNvbHZlLCBhbmQgZXhpdC5cblxuICAgIGNvbnRleHQuZXZlbnRzID0gcmVzb2x2ZUFsbChyZXNvbHZlQWxsQ29uc3RydWN0cywgY29udGV4dC5ldmVudHMsIGNvbnRleHQpXG4gICAgcmV0dXJuIGNvbnRleHQuZXZlbnRzXG4gIH0gLy9cbiAgLy8gVG9vbHMuXG4gIC8vXG5cbiAgZnVuY3Rpb24gc2xpY2VTZXJpYWxpemUodG9rZW4pIHtcbiAgICByZXR1cm4gc2VyaWFsaXplQ2h1bmtzKHNsaWNlU3RyZWFtKHRva2VuKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHNsaWNlU3RyZWFtKHRva2VuKSB7XG4gICAgcmV0dXJuIHNsaWNlQ2h1bmtzKGNodW5rcywgdG9rZW4pXG4gIH1cblxuICBmdW5jdGlvbiBub3coKSB7XG4gICAgcmV0dXJuIHNoYWxsb3cocG9pbnQpXG4gIH1cblxuICBmdW5jdGlvbiBza2lwKHZhbHVlKSB7XG4gICAgY29sdW1uU3RhcnRbdmFsdWUubGluZV0gPSB2YWx1ZS5jb2x1bW5cbiAgICBhY2NvdW50Rm9yUG90ZW50aWFsU2tpcCgpXG4gIH0gLy9cbiAgLy8gU3RhdGUgbWFuYWdlbWVudC5cbiAgLy9cbiAgLy8gTWFpbiBsb29wIChub3RlIHRoYXQgYF9pbmRleGAgYW5kIGBfYnVmZmVySW5kZXhgIGluIGBwb2ludGAgYXJlIG1vZGlmaWVkIGJ5XG4gIC8vIGBjb25zdW1lYCkuXG4gIC8vIEhlcmUgaXMgd2hlcmUgd2Ugd2FsayB0aHJvdWdoIHRoZSBjaHVua3MsIHdoaWNoIGVpdGhlciBpbmNsdWRlIHN0cmluZ3Mgb2ZcbiAgLy8gc2V2ZXJhbCBjaGFyYWN0ZXJzLCBvciBudW1lcmljYWwgY2hhcmFjdGVyIGNvZGVzLlxuICAvLyBUaGUgcmVhc29uIHRvIGRvIHRoaXMgaW4gYSBsb29wIGluc3RlYWQgb2YgYSBjYWxsIGlzIHNvIHRoZSBzdGFjayBjYW5cbiAgLy8gZHJhaW4uXG5cbiAgZnVuY3Rpb24gbWFpbigpIHtcbiAgICB2YXIgY2h1bmtJbmRleFxuICAgIHZhciBjaHVua1xuXG4gICAgd2hpbGUgKHBvaW50Ll9pbmRleCA8IGNodW5rcy5sZW5ndGgpIHtcbiAgICAgIGNodW5rID0gY2h1bmtzW3BvaW50Ll9pbmRleF0gLy8gSWYgd2VcdTIwMTlyZSBpbiBhIGJ1ZmZlciBjaHVuaywgbG9vcCB0aHJvdWdoIGl0LlxuXG4gICAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgICBjaHVua0luZGV4ID0gcG9pbnQuX2luZGV4XG5cbiAgICAgICAgaWYgKHBvaW50Ll9idWZmZXJJbmRleCA8IDApIHtcbiAgICAgICAgICBwb2ludC5fYnVmZmVySW5kZXggPSAwXG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgcG9pbnQuX2luZGV4ID09PSBjaHVua0luZGV4ICYmXG4gICAgICAgICAgcG9pbnQuX2J1ZmZlckluZGV4IDwgY2h1bmsubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIGdvKGNodW5rLmNoYXJDb2RlQXQocG9pbnQuX2J1ZmZlckluZGV4KSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ28oY2h1bmspXG4gICAgICB9XG4gICAgfVxuICB9IC8vIERlYWwgd2l0aCBvbmUgY29kZS5cblxuICBmdW5jdGlvbiBnbyhjb2RlKSB7XG4gICAgc3RhdGUgPSBzdGF0ZShjb2RlKVxuICB9IC8vIE1vdmUgYSBjaGFyYWN0ZXIgZm9yd2FyZC5cblxuICBmdW5jdGlvbiBjb25zdW1lKGNvZGUpIHtcbiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICBwb2ludC5saW5lKytcbiAgICAgIHBvaW50LmNvbHVtbiA9IDFcbiAgICAgIHBvaW50Lm9mZnNldCArPSBjb2RlID09PSAtMyA/IDIgOiAxXG4gICAgICBhY2NvdW50Rm9yUG90ZW50aWFsU2tpcCgpXG4gICAgfSBlbHNlIGlmIChjb2RlICE9PSAtMSkge1xuICAgICAgcG9pbnQuY29sdW1uKytcbiAgICAgIHBvaW50Lm9mZnNldCsrXG4gICAgfSAvLyBOb3QgaW4gYSBzdHJpbmcgY2h1bmsuXG5cbiAgICBpZiAocG9pbnQuX2J1ZmZlckluZGV4IDwgMCkge1xuICAgICAgcG9pbnQuX2luZGV4KytcbiAgICB9IGVsc2Uge1xuICAgICAgcG9pbnQuX2J1ZmZlckluZGV4KysgLy8gQXQgZW5kIG9mIHN0cmluZyBjaHVuay5cblxuICAgICAgaWYgKHBvaW50Ll9idWZmZXJJbmRleCA9PT0gY2h1bmtzW3BvaW50Ll9pbmRleF0ubGVuZ3RoKSB7XG4gICAgICAgIHBvaW50Ll9idWZmZXJJbmRleCA9IC0xXG4gICAgICAgIHBvaW50Ll9pbmRleCsrXG4gICAgICB9XG4gICAgfSAvLyBFeHBvc2UgdGhlIHByZXZpb3VzIGNoYXJhY3Rlci5cblxuICAgIGNvbnRleHQucHJldmlvdXMgPSBjb2RlIC8vIE1hcmsgYXMgY29uc3VtZWQuXG4gIH0gLy8gU3RhcnQgYSB0b2tlbi5cblxuICBmdW5jdGlvbiBlbnRlcih0eXBlLCBmaWVsZHMpIHtcbiAgICB2YXIgdG9rZW4gPSBmaWVsZHMgfHwge31cbiAgICB0b2tlbi50eXBlID0gdHlwZVxuICAgIHRva2VuLnN0YXJ0ID0gbm93KClcbiAgICBjb250ZXh0LmV2ZW50cy5wdXNoKFsnZW50ZXInLCB0b2tlbiwgY29udGV4dF0pXG4gICAgc3RhY2sucHVzaCh0b2tlbilcbiAgICByZXR1cm4gdG9rZW5cbiAgfSAvLyBTdG9wIGEgdG9rZW4uXG5cbiAgZnVuY3Rpb24gZXhpdCh0eXBlKSB7XG4gICAgdmFyIHRva2VuID0gc3RhY2sucG9wKClcbiAgICB0b2tlbi5lbmQgPSBub3coKVxuICAgIGNvbnRleHQuZXZlbnRzLnB1c2goWydleGl0JywgdG9rZW4sIGNvbnRleHRdKVxuICAgIHJldHVybiB0b2tlblxuICB9IC8vIFVzZSByZXN1bHRzLlxuXG4gIGZ1bmN0aW9uIG9uc3VjY2Vzc2Z1bGNvbnN0cnVjdChjb25zdHJ1Y3QsIGluZm8pIHtcbiAgICBhZGRSZXN1bHQoY29uc3RydWN0LCBpbmZvLmZyb20pXG4gIH0gLy8gRGlzY2FyZCByZXN1bHRzLlxuXG4gIGZ1bmN0aW9uIG9uc3VjY2Vzc2Z1bGNoZWNrKGNvbnN0cnVjdCwgaW5mbykge1xuICAgIGluZm8ucmVzdG9yZSgpXG4gIH0gLy8gRmFjdG9yeSB0byBhdHRlbXB0L2NoZWNrL2ludGVycnVwdC5cblxuICBmdW5jdGlvbiBjb25zdHJ1Y3RGYWN0b3J5KG9ucmV0dXJuLCBmaWVsZHMpIHtcbiAgICByZXR1cm4gaG9vayAvLyBIYW5kbGUgZWl0aGVyIGFuIG9iamVjdCBtYXBwaW5nIGNvZGVzIHRvIGNvbnN0cnVjdHMsIGEgbGlzdCBvZlxuICAgIC8vIGNvbnN0cnVjdHMsIG9yIGEgc2luZ2xlIGNvbnN0cnVjdC5cblxuICAgIGZ1bmN0aW9uIGhvb2soY29uc3RydWN0cywgcmV0dXJuU3RhdGUsIGJvZ3VzU3RhdGUpIHtcbiAgICAgIHZhciBsaXN0T2ZDb25zdHJ1Y3RzXG4gICAgICB2YXIgY29uc3RydWN0SW5kZXhcbiAgICAgIHZhciBjdXJyZW50Q29uc3RydWN0XG4gICAgICB2YXIgaW5mb1xuICAgICAgcmV0dXJuIGNvbnN0cnVjdHMudG9rZW5pemUgfHwgJ2xlbmd0aCcgaW4gY29uc3RydWN0c1xuICAgICAgICA/IGhhbmRsZUxpc3RPZkNvbnN0cnVjdHMobWluaWZsYXQoY29uc3RydWN0cykpXG4gICAgICAgIDogaGFuZGxlTWFwT2ZDb25zdHJ1Y3RzXG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZU1hcE9mQ29uc3RydWN0cyhjb2RlKSB7XG4gICAgICAgIGlmIChjb2RlIGluIGNvbnN0cnVjdHMgfHwgbnVsbCBpbiBjb25zdHJ1Y3RzKSB7XG4gICAgICAgICAgcmV0dXJuIGhhbmRsZUxpc3RPZkNvbnN0cnVjdHMoXG4gICAgICAgICAgICBjb25zdHJ1Y3RzLm51bGxcbiAgICAgICAgICAgICAgPyAvKiBjOCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgICAgIG1pbmlmbGF0KGNvbnN0cnVjdHNbY29kZV0pLmNvbmNhdChtaW5pZmxhdChjb25zdHJ1Y3RzLm51bGwpKVxuICAgICAgICAgICAgICA6IGNvbnN0cnVjdHNbY29kZV1cbiAgICAgICAgICApKGNvZGUpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYm9ndXNTdGF0ZShjb2RlKVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVMaXN0T2ZDb25zdHJ1Y3RzKGxpc3QpIHtcbiAgICAgICAgbGlzdE9mQ29uc3RydWN0cyA9IGxpc3RcbiAgICAgICAgY29uc3RydWN0SW5kZXggPSAwXG4gICAgICAgIHJldHVybiBoYW5kbGVDb25zdHJ1Y3QobGlzdFtjb25zdHJ1Y3RJbmRleF0pXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZUNvbnN0cnVjdChjb25zdHJ1Y3QpIHtcbiAgICAgICAgcmV0dXJuIHN0YXJ0XG5cbiAgICAgICAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgICAgICAgIC8vIFRvIGRvOiBub3QgbmVkZSB0byBzdG9yZSBpZiB0aGVyZSBpcyBubyBib2d1cyBzdGF0ZSwgcHJvYmFibHk/XG4gICAgICAgICAgLy8gQ3VycmVudGx5IGRvZXNuXHUyMDE5dCB3b3JrIGJlY2F1c2UgYGluc3BlY3RgIGluIGRvY3VtZW50IGRvZXMgYSBjaGVja1xuICAgICAgICAgIC8vIHcvbyBhIGJvZ3VzLCB3aGljaCBkb2Vzblx1MjAxOXQgbWFrZSBzZW5zZS4gQnV0IGl0IGRvZXMgc2VlbSB0byBoZWxwIHBlcmZcbiAgICAgICAgICAvLyBieSBub3Qgc3RvcmluZy5cbiAgICAgICAgICBpbmZvID0gc3RvcmUoKVxuICAgICAgICAgIGN1cnJlbnRDb25zdHJ1Y3QgPSBjb25zdHJ1Y3RcblxuICAgICAgICAgIGlmICghY29uc3RydWN0LnBhcnRpYWwpIHtcbiAgICAgICAgICAgIGNvbnRleHQuY3VycmVudENvbnN0cnVjdCA9IGNvbnN0cnVjdFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvbnN0cnVjdC5uYW1lICYmXG4gICAgICAgICAgICBjb250ZXh0LnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmRleE9mKGNvbnN0cnVjdC5uYW1lKSA+IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9rKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29uc3RydWN0LnRva2VuaXplLmNhbGwoXG4gICAgICAgICAgICBmaWVsZHMgPyBhc3NpZ24oe30sIGNvbnRleHQsIGZpZWxkcykgOiBjb250ZXh0LFxuICAgICAgICAgICAgZWZmZWN0cyxcbiAgICAgICAgICAgIG9rLFxuICAgICAgICAgICAgbm9rXG4gICAgICAgICAgKShjb2RlKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9rKGNvZGUpIHtcbiAgICAgICAgb25yZXR1cm4oY3VycmVudENvbnN0cnVjdCwgaW5mbylcbiAgICAgICAgcmV0dXJuIHJldHVyblN0YXRlXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG5vayhjb2RlKSB7XG4gICAgICAgIGluZm8ucmVzdG9yZSgpXG5cbiAgICAgICAgaWYgKCsrY29uc3RydWN0SW5kZXggPCBsaXN0T2ZDb25zdHJ1Y3RzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVDb25zdHJ1Y3QobGlzdE9mQ29uc3RydWN0c1tjb25zdHJ1Y3RJbmRleF0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYm9ndXNTdGF0ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFJlc3VsdChjb25zdHJ1Y3QsIGZyb20pIHtcbiAgICBpZiAoY29uc3RydWN0LnJlc29sdmVBbGwgJiYgcmVzb2x2ZUFsbENvbnN0cnVjdHMuaW5kZXhPZihjb25zdHJ1Y3QpIDwgMCkge1xuICAgICAgcmVzb2x2ZUFsbENvbnN0cnVjdHMucHVzaChjb25zdHJ1Y3QpXG4gICAgfVxuXG4gICAgaWYgKGNvbnN0cnVjdC5yZXNvbHZlKSB7XG4gICAgICBjaHVua2VkU3BsaWNlKFxuICAgICAgICBjb250ZXh0LmV2ZW50cyxcbiAgICAgICAgZnJvbSxcbiAgICAgICAgY29udGV4dC5ldmVudHMubGVuZ3RoIC0gZnJvbSxcbiAgICAgICAgY29uc3RydWN0LnJlc29sdmUoY29udGV4dC5ldmVudHMuc2xpY2UoZnJvbSksIGNvbnRleHQpXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKGNvbnN0cnVjdC5yZXNvbHZlVG8pIHtcbiAgICAgIGNvbnRleHQuZXZlbnRzID0gY29uc3RydWN0LnJlc29sdmVUbyhjb250ZXh0LmV2ZW50cywgY29udGV4dClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdG9yZSgpIHtcbiAgICB2YXIgc3RhcnRQb2ludCA9IG5vdygpXG4gICAgdmFyIHN0YXJ0UHJldmlvdXMgPSBjb250ZXh0LnByZXZpb3VzXG4gICAgdmFyIHN0YXJ0Q3VycmVudENvbnN0cnVjdCA9IGNvbnRleHQuY3VycmVudENvbnN0cnVjdFxuICAgIHZhciBzdGFydEV2ZW50c0luZGV4ID0gY29udGV4dC5ldmVudHMubGVuZ3RoXG4gICAgdmFyIHN0YXJ0U3RhY2sgPSBBcnJheS5mcm9tKHN0YWNrKVxuICAgIHJldHVybiB7XG4gICAgICByZXN0b3JlOiByZXN0b3JlLFxuICAgICAgZnJvbTogc3RhcnRFdmVudHNJbmRleFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc3RvcmUoKSB7XG4gICAgICBwb2ludCA9IHN0YXJ0UG9pbnRcbiAgICAgIGNvbnRleHQucHJldmlvdXMgPSBzdGFydFByZXZpb3VzXG4gICAgICBjb250ZXh0LmN1cnJlbnRDb25zdHJ1Y3QgPSBzdGFydEN1cnJlbnRDb25zdHJ1Y3RcbiAgICAgIGNvbnRleHQuZXZlbnRzLmxlbmd0aCA9IHN0YXJ0RXZlbnRzSW5kZXhcbiAgICAgIHN0YWNrID0gc3RhcnRTdGFja1xuICAgICAgYWNjb3VudEZvclBvdGVudGlhbFNraXAoKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFjY291bnRGb3JQb3RlbnRpYWxTa2lwKCkge1xuICAgIGlmIChwb2ludC5saW5lIGluIGNvbHVtblN0YXJ0ICYmIHBvaW50LmNvbHVtbiA8IDIpIHtcbiAgICAgIHBvaW50LmNvbHVtbiA9IGNvbHVtblN0YXJ0W3BvaW50LmxpbmVdXG4gICAgICBwb2ludC5vZmZzZXQgKz0gY29sdW1uU3RhcnRbcG9pbnQubGluZV0gLSAxXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlVG9rZW5pemVyXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZSkge1xuICByZXR1cm4gY29kZSA8IDAgfHwgY29kZSA9PT0gMzJcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbi8vIFRoaXMgbW9kdWxlIGlzIGdlbmVyYXRlZCBieSBgc2NyaXB0L2AuXG4vL1xuLy8gQ29tbW9uTWFyayBoYW5kbGVzIGF0dGVudGlvbiAoZW1waGFzaXMsIHN0cm9uZykgbWFya2VycyBiYXNlZCBvbiB3aGF0IGNvbWVzXG4vLyBiZWZvcmUgb3IgYWZ0ZXIgdGhlbS5cbi8vIE9uZSBzdWNoIGRpZmZlcmVuY2UgaXMgaWYgdGhvc2UgY2hhcmFjdGVycyBhcmUgVW5pY29kZSBwdW5jdHVhdGlvbi5cbi8vIFRoaXMgc2NyaXB0IGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBVbmljb2RlIGRhdGEuXG52YXIgdW5pY29kZVB1bmN0dWF0aW9uID0gL1shLVxcLzotQFxcWy1gXFx7LX5cXHhBMVxceEE3XFx4QUJcXHhCNlxceEI3XFx4QkJcXHhCRlxcdTAzN0VcXHUwMzg3XFx1MDU1QS1cXHUwNTVGXFx1MDU4OVxcdTA1OEFcXHUwNUJFXFx1MDVDMFxcdTA1QzNcXHUwNUM2XFx1MDVGM1xcdTA1RjRcXHUwNjA5XFx1MDYwQVxcdTA2MENcXHUwNjBEXFx1MDYxQlxcdTA2MUVcXHUwNjFGXFx1MDY2QS1cXHUwNjZEXFx1MDZENFxcdTA3MDAtXFx1MDcwRFxcdTA3RjctXFx1MDdGOVxcdTA4MzAtXFx1MDgzRVxcdTA4NUVcXHUwOTY0XFx1MDk2NVxcdTA5NzBcXHUwOUZEXFx1MEE3NlxcdTBBRjBcXHUwQzc3XFx1MEM4NFxcdTBERjRcXHUwRTRGXFx1MEU1QVxcdTBFNUJcXHUwRjA0LVxcdTBGMTJcXHUwRjE0XFx1MEYzQS1cXHUwRjNEXFx1MEY4NVxcdTBGRDAtXFx1MEZENFxcdTBGRDlcXHUwRkRBXFx1MTA0QS1cXHUxMDRGXFx1MTBGQlxcdTEzNjAtXFx1MTM2OFxcdTE0MDBcXHUxNjZFXFx1MTY5QlxcdTE2OUNcXHUxNkVCLVxcdTE2RURcXHUxNzM1XFx1MTczNlxcdTE3RDQtXFx1MTdENlxcdTE3RDgtXFx1MTdEQVxcdTE4MDAtXFx1MTgwQVxcdTE5NDRcXHUxOTQ1XFx1MUExRVxcdTFBMUZcXHUxQUEwLVxcdTFBQTZcXHUxQUE4LVxcdTFBQURcXHUxQjVBLVxcdTFCNjBcXHUxQkZDLVxcdTFCRkZcXHUxQzNCLVxcdTFDM0ZcXHUxQzdFXFx1MUM3RlxcdTFDQzAtXFx1MUNDN1xcdTFDRDNcXHUyMDEwLVxcdTIwMjdcXHUyMDMwLVxcdTIwNDNcXHUyMDQ1LVxcdTIwNTFcXHUyMDUzLVxcdTIwNUVcXHUyMDdEXFx1MjA3RVxcdTIwOERcXHUyMDhFXFx1MjMwOC1cXHUyMzBCXFx1MjMyOVxcdTIzMkFcXHUyNzY4LVxcdTI3NzVcXHUyN0M1XFx1MjdDNlxcdTI3RTYtXFx1MjdFRlxcdTI5ODMtXFx1Mjk5OFxcdTI5RDgtXFx1MjlEQlxcdTI5RkNcXHUyOUZEXFx1MkNGOS1cXHUyQ0ZDXFx1MkNGRVxcdTJDRkZcXHUyRDcwXFx1MkUwMC1cXHUyRTJFXFx1MkUzMC1cXHUyRTRGXFx1MkU1MlxcdTMwMDEtXFx1MzAwM1xcdTMwMDgtXFx1MzAxMVxcdTMwMTQtXFx1MzAxRlxcdTMwMzBcXHUzMDNEXFx1MzBBMFxcdTMwRkJcXHVBNEZFXFx1QTRGRlxcdUE2MEQtXFx1QTYwRlxcdUE2NzNcXHVBNjdFXFx1QTZGMi1cXHVBNkY3XFx1QTg3NC1cXHVBODc3XFx1QThDRVxcdUE4Q0ZcXHVBOEY4LVxcdUE4RkFcXHVBOEZDXFx1QTkyRVxcdUE5MkZcXHVBOTVGXFx1QTlDMS1cXHVBOUNEXFx1QTlERVxcdUE5REZcXHVBQTVDLVxcdUFBNUZcXHVBQURFXFx1QUFERlxcdUFBRjBcXHVBQUYxXFx1QUJFQlxcdUZEM0VcXHVGRDNGXFx1RkUxMC1cXHVGRTE5XFx1RkUzMC1cXHVGRTUyXFx1RkU1NC1cXHVGRTYxXFx1RkU2M1xcdUZFNjhcXHVGRTZBXFx1RkU2QlxcdUZGMDEtXFx1RkYwM1xcdUZGMDUtXFx1RkYwQVxcdUZGMEMtXFx1RkYwRlxcdUZGMUFcXHVGRjFCXFx1RkYxRlxcdUZGMjBcXHVGRjNCLVxcdUZGM0RcXHVGRjNGXFx1RkY1QlxcdUZGNURcXHVGRjVGLVxcdUZGNjVdL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWNvZGVQdW5jdHVhdGlvblxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgZnJvbUNoYXJDb2RlID0gcmVxdWlyZSgnLi4vY29uc3RhbnQvZnJvbS1jaGFyLWNvZGUuanMnKVxuXG5mdW5jdGlvbiByZWdleENoZWNrKHJlZ2V4KSB7XG4gIHJldHVybiBjaGVja1xuXG4gIGZ1bmN0aW9uIGNoZWNrKGNvZGUpIHtcbiAgICByZXR1cm4gcmVnZXgudGVzdChmcm9tQ2hhckNvZGUoY29kZSkpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWdleENoZWNrXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciB1bmljb2RlUHVuY3R1YXRpb25SZWdleCA9IHJlcXVpcmUoJy4uL2NvbnN0YW50L3VuaWNvZGUtcHVuY3R1YXRpb24tcmVnZXguanMnKVxudmFyIHJlZ2V4Q2hlY2sgPSByZXF1aXJlKCcuLi91dGlsL3JlZ2V4LWNoZWNrLmpzJylcblxuLy8gSW4gZmFjdCBhZGRzIHRvIHRoZSBidW5kbGUgc2l6ZS5cblxudmFyIHVuaWNvZGVQdW5jdHVhdGlvbiA9IHJlZ2V4Q2hlY2sodW5pY29kZVB1bmN0dWF0aW9uUmVnZXgpXG5cbm1vZHVsZS5leHBvcnRzID0gdW5pY29kZVB1bmN0dWF0aW9uXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciByZWdleENoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9yZWdleC1jaGVjay5qcycpXG5cbnZhciB1bmljb2RlV2hpdGVzcGFjZSA9IHJlZ2V4Q2hlY2soL1xccy8pXG5cbm1vZHVsZS5leHBvcnRzID0gdW5pY29kZVdoaXRlc3BhY2VcbiIsICIndXNlIHN0cmljdCdcblxudmFyIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmctb3Itc3BhY2UuanMnKVxudmFyIHVuaWNvZGVQdW5jdHVhdGlvbiA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci91bmljb2RlLXB1bmN0dWF0aW9uLmpzJylcbnZhciB1bmljb2RlV2hpdGVzcGFjZSA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci91bmljb2RlLXdoaXRlc3BhY2UuanMnKVxuXG4vLyBDbGFzc2lmeSB3aGV0aGVyIGEgY2hhcmFjdGVyIGlzIHVuaWNvZGUgd2hpdGVzcGFjZSwgdW5pY29kZSBwdW5jdHVhdGlvbiwgb3Jcbi8vIGFueXRoaW5nIGVsc2UuXG4vLyBVc2VkIGZvciBhdHRlbnRpb24gKGVtcGhhc2lzLCBzdHJvbmcpLCB3aG9zZSBzZXF1ZW5jZXMgY2FuIG9wZW4gb3IgY2xvc2Vcbi8vIGJhc2VkIG9uIHRoZSBjbGFzcyBvZiBzdXJyb3VuZGluZyBjaGFyYWN0ZXJzLlxuZnVuY3Rpb24gY2xhc3NpZnlDaGFyYWN0ZXIoY29kZSkge1xuICBpZiAoXG4gICAgY29kZSA9PT0gbnVsbCB8fFxuICAgIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZSkgfHxcbiAgICB1bmljb2RlV2hpdGVzcGFjZShjb2RlKVxuICApIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgaWYgKHVuaWNvZGVQdW5jdHVhdGlvbihjb2RlKSkge1xuICAgIHJldHVybiAyXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc2lmeUNoYXJhY3RlclxuIiwgIid1c2Ugc3RyaWN0J1xuXG4vLyBjaHVua3MgKHJlcGxhY2VtZW50IGNoYXJhY3RlcnMsIHRhYnMsIG9yIGxpbmUgZW5kaW5ncykuXG5cbmZ1bmN0aW9uIG1vdmVQb2ludChwb2ludCwgb2Zmc2V0KSB7XG4gIHBvaW50LmNvbHVtbiArPSBvZmZzZXRcbiAgcG9pbnQub2Zmc2V0ICs9IG9mZnNldFxuICBwb2ludC5fYnVmZmVySW5kZXggKz0gb2Zmc2V0XG4gIHJldHVybiBwb2ludFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1vdmVQb2ludFxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgY2h1bmtlZFB1c2ggPSByZXF1aXJlKCcuLi91dGlsL2NodW5rZWQtcHVzaC5qcycpXG52YXIgY2h1bmtlZFNwbGljZSA9IHJlcXVpcmUoJy4uL3V0aWwvY2h1bmtlZC1zcGxpY2UuanMnKVxudmFyIGNsYXNzaWZ5Q2hhcmFjdGVyID0gcmVxdWlyZSgnLi4vdXRpbC9jbGFzc2lmeS1jaGFyYWN0ZXIuanMnKVxudmFyIG1vdmVQb2ludCA9IHJlcXVpcmUoJy4uL3V0aWwvbW92ZS1wb2ludC5qcycpXG52YXIgcmVzb2x2ZUFsbCA9IHJlcXVpcmUoJy4uL3V0aWwvcmVzb2x2ZS1hbGwuanMnKVxudmFyIHNoYWxsb3cgPSByZXF1aXJlKCcuLi91dGlsL3NoYWxsb3cuanMnKVxuXG52YXIgYXR0ZW50aW9uID0ge1xuICBuYW1lOiAnYXR0ZW50aW9uJyxcbiAgdG9rZW5pemU6IHRva2VuaXplQXR0ZW50aW9uLFxuICByZXNvbHZlQWxsOiByZXNvbHZlQWxsQXR0ZW50aW9uXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBbGxBdHRlbnRpb24oZXZlbnRzLCBjb250ZXh0KSB7XG4gIHZhciBpbmRleCA9IC0xXG4gIHZhciBvcGVuXG4gIHZhciBncm91cFxuICB2YXIgdGV4dFxuICB2YXIgb3BlbmluZ1NlcXVlbmNlXG4gIHZhciBjbG9zaW5nU2VxdWVuY2VcbiAgdmFyIHVzZVxuICB2YXIgbmV4dEV2ZW50c1xuICB2YXIgb2Zmc2V0IC8vIFdhbGsgdGhyb3VnaCBhbGwgZXZlbnRzLlxuICAvL1xuICAvLyBOb3RlOiBwZXJmb3JtYW5jZSBvZiB0aGlzIGlzIGZpbmUgb24gYW4gbWIgb2Ygbm9ybWFsIG1hcmtkb3duLCBidXQgaXRcdTIwMTlzXG4gIC8vIGEgYm90dGxlbmVjayBmb3IgbWFsaWNpb3VzIHN0dWZmLlxuXG4gIHdoaWxlICgrK2luZGV4IDwgZXZlbnRzLmxlbmd0aCkge1xuICAgIC8vIEZpbmQgYSB0b2tlbiB0aGF0IGNhbiBjbG9zZS5cbiAgICBpZiAoXG4gICAgICBldmVudHNbaW5kZXhdWzBdID09PSAnZW50ZXInICYmXG4gICAgICBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdhdHRlbnRpb25TZXF1ZW5jZScgJiZcbiAgICAgIGV2ZW50c1tpbmRleF1bMV0uX2Nsb3NlXG4gICAgKSB7XG4gICAgICBvcGVuID0gaW5kZXggLy8gTm93IHdhbGsgYmFjayB0byBmaW5kIGFuIG9wZW5lci5cblxuICAgICAgd2hpbGUgKG9wZW4tLSkge1xuICAgICAgICAvLyBGaW5kIGEgdG9rZW4gdGhhdCBjYW4gb3BlbiB0aGUgY2xvc2VyLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgZXZlbnRzW29wZW5dWzBdID09PSAnZXhpdCcgJiZcbiAgICAgICAgICBldmVudHNbb3Blbl1bMV0udHlwZSA9PT0gJ2F0dGVudGlvblNlcXVlbmNlJyAmJlxuICAgICAgICAgIGV2ZW50c1tvcGVuXVsxXS5fb3BlbiAmJiAvLyBJZiB0aGUgbWFya2VycyBhcmUgdGhlIHNhbWU6XG4gICAgICAgICAgY29udGV4dC5zbGljZVNlcmlhbGl6ZShldmVudHNbb3Blbl1bMV0pLmNoYXJDb2RlQXQoMCkgPT09XG4gICAgICAgICAgICBjb250ZXh0LnNsaWNlU2VyaWFsaXplKGV2ZW50c1tpbmRleF1bMV0pLmNoYXJDb2RlQXQoMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIG9wZW5pbmcgY2FuIGNsb3NlIG9yIHRoZSBjbG9zaW5nIGNhbiBvcGVuLFxuICAgICAgICAgIC8vIGFuZCB0aGUgY2xvc2Ugc2l6ZSAqaXMgbm90KiBhIG11bHRpcGxlIG9mIHRocmVlLFxuICAgICAgICAgIC8vIGJ1dCB0aGUgc3VtIG9mIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIHNpemUgKmlzKiBtdWx0aXBsZSBvZiB0aHJlZSxcbiAgICAgICAgICAvLyB0aGVuIGRvblx1MjAxOXQgbWF0Y2guXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGV2ZW50c1tvcGVuXVsxXS5fY2xvc2UgfHwgZXZlbnRzW2luZGV4XVsxXS5fb3BlbikgJiZcbiAgICAgICAgICAgIChldmVudHNbaW5kZXhdWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbaW5kZXhdWzFdLnN0YXJ0Lm9mZnNldCkgJSAzICYmXG4gICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAoZXZlbnRzW29wZW5dWzFdLmVuZC5vZmZzZXQgLVxuICAgICAgICAgICAgICAgIGV2ZW50c1tvcGVuXVsxXS5zdGFydC5vZmZzZXQgK1xuICAgICAgICAgICAgICAgIGV2ZW50c1tpbmRleF1bMV0uZW5kLm9mZnNldCAtXG4gICAgICAgICAgICAgICAgZXZlbnRzW2luZGV4XVsxXS5zdGFydC5vZmZzZXQpICVcbiAgICAgICAgICAgICAgM1xuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IC8vIE51bWJlciBvZiBtYXJrZXJzIHRvIHVzZSBmcm9tIHRoZSBzZXF1ZW5jZS5cblxuICAgICAgICAgIHVzZSA9XG4gICAgICAgICAgICBldmVudHNbb3Blbl1bMV0uZW5kLm9mZnNldCAtIGV2ZW50c1tvcGVuXVsxXS5zdGFydC5vZmZzZXQgPiAxICYmXG4gICAgICAgICAgICBldmVudHNbaW5kZXhdWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbaW5kZXhdWzFdLnN0YXJ0Lm9mZnNldCA+IDFcbiAgICAgICAgICAgICAgPyAyXG4gICAgICAgICAgICAgIDogMVxuICAgICAgICAgIG9wZW5pbmdTZXF1ZW5jZSA9IHtcbiAgICAgICAgICAgIHR5cGU6IHVzZSA+IDEgPyAnc3Ryb25nU2VxdWVuY2UnIDogJ2VtcGhhc2lzU2VxdWVuY2UnLFxuICAgICAgICAgICAgc3RhcnQ6IG1vdmVQb2ludChzaGFsbG93KGV2ZW50c1tvcGVuXVsxXS5lbmQpLCAtdXNlKSxcbiAgICAgICAgICAgIGVuZDogc2hhbGxvdyhldmVudHNbb3Blbl1bMV0uZW5kKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjbG9zaW5nU2VxdWVuY2UgPSB7XG4gICAgICAgICAgICB0eXBlOiB1c2UgPiAxID8gJ3N0cm9uZ1NlcXVlbmNlJyA6ICdlbXBoYXNpc1NlcXVlbmNlJyxcbiAgICAgICAgICAgIHN0YXJ0OiBzaGFsbG93KGV2ZW50c1tpbmRleF1bMV0uc3RhcnQpLFxuICAgICAgICAgICAgZW5kOiBtb3ZlUG9pbnQoc2hhbGxvdyhldmVudHNbaW5kZXhdWzFdLnN0YXJ0KSwgdXNlKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0ZXh0ID0ge1xuICAgICAgICAgICAgdHlwZTogdXNlID4gMSA/ICdzdHJvbmdUZXh0JyA6ICdlbXBoYXNpc1RleHQnLFxuICAgICAgICAgICAgc3RhcnQ6IHNoYWxsb3coZXZlbnRzW29wZW5dWzFdLmVuZCksXG4gICAgICAgICAgICBlbmQ6IHNoYWxsb3coZXZlbnRzW2luZGV4XVsxXS5zdGFydClcbiAgICAgICAgICB9XG4gICAgICAgICAgZ3JvdXAgPSB7XG4gICAgICAgICAgICB0eXBlOiB1c2UgPiAxID8gJ3N0cm9uZycgOiAnZW1waGFzaXMnLFxuICAgICAgICAgICAgc3RhcnQ6IHNoYWxsb3cob3BlbmluZ1NlcXVlbmNlLnN0YXJ0KSxcbiAgICAgICAgICAgIGVuZDogc2hhbGxvdyhjbG9zaW5nU2VxdWVuY2UuZW5kKVxuICAgICAgICAgIH1cbiAgICAgICAgICBldmVudHNbb3Blbl1bMV0uZW5kID0gc2hhbGxvdyhvcGVuaW5nU2VxdWVuY2Uuc3RhcnQpXG4gICAgICAgICAgZXZlbnRzW2luZGV4XVsxXS5zdGFydCA9IHNoYWxsb3coY2xvc2luZ1NlcXVlbmNlLmVuZClcbiAgICAgICAgICBuZXh0RXZlbnRzID0gW10gLy8gSWYgdGhlcmUgYXJlIG1vcmUgbWFya2VycyBpbiB0aGUgb3BlbmluZywgYWRkIHRoZW0gYmVmb3JlLlxuXG4gICAgICAgICAgaWYgKGV2ZW50c1tvcGVuXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW29wZW5dWzFdLnN0YXJ0Lm9mZnNldCkge1xuICAgICAgICAgICAgbmV4dEV2ZW50cyA9IGNodW5rZWRQdXNoKG5leHRFdmVudHMsIFtcbiAgICAgICAgICAgICAgWydlbnRlcicsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dF0sXG4gICAgICAgICAgICAgIFsnZXhpdCcsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dF1cbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgfSAvLyBPcGVuaW5nLlxuXG4gICAgICAgICAgbmV4dEV2ZW50cyA9IGNodW5rZWRQdXNoKG5leHRFdmVudHMsIFtcbiAgICAgICAgICAgIFsnZW50ZXInLCBncm91cCwgY29udGV4dF0sXG4gICAgICAgICAgICBbJ2VudGVyJywgb3BlbmluZ1NlcXVlbmNlLCBjb250ZXh0XSxcbiAgICAgICAgICAgIFsnZXhpdCcsIG9wZW5pbmdTZXF1ZW5jZSwgY29udGV4dF0sXG4gICAgICAgICAgICBbJ2VudGVyJywgdGV4dCwgY29udGV4dF1cbiAgICAgICAgICBdKSAvLyBCZXR3ZWVuLlxuXG4gICAgICAgICAgbmV4dEV2ZW50cyA9IGNodW5rZWRQdXNoKFxuICAgICAgICAgICAgbmV4dEV2ZW50cyxcbiAgICAgICAgICAgIHJlc29sdmVBbGwoXG4gICAgICAgICAgICAgIGNvbnRleHQucGFyc2VyLmNvbnN0cnVjdHMuaW5zaWRlU3Bhbi5udWxsLFxuICAgICAgICAgICAgICBldmVudHMuc2xpY2Uob3BlbiArIDEsIGluZGV4KSxcbiAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkgLy8gQ2xvc2luZy5cblxuICAgICAgICAgIG5leHRFdmVudHMgPSBjaHVua2VkUHVzaChuZXh0RXZlbnRzLCBbXG4gICAgICAgICAgICBbJ2V4aXQnLCB0ZXh0LCBjb250ZXh0XSxcbiAgICAgICAgICAgIFsnZW50ZXInLCBjbG9zaW5nU2VxdWVuY2UsIGNvbnRleHRdLFxuICAgICAgICAgICAgWydleGl0JywgY2xvc2luZ1NlcXVlbmNlLCBjb250ZXh0XSxcbiAgICAgICAgICAgIFsnZXhpdCcsIGdyb3VwLCBjb250ZXh0XVxuICAgICAgICAgIF0pIC8vIElmIHRoZXJlIGFyZSBtb3JlIG1hcmtlcnMgaW4gdGhlIGNsb3NpbmcsIGFkZCB0aGVtIGFmdGVyLlxuXG4gICAgICAgICAgaWYgKGV2ZW50c1tpbmRleF1bMV0uZW5kLm9mZnNldCAtIGV2ZW50c1tpbmRleF1bMV0uc3RhcnQub2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAyXG4gICAgICAgICAgICBuZXh0RXZlbnRzID0gY2h1bmtlZFB1c2gobmV4dEV2ZW50cywgW1xuICAgICAgICAgICAgICBbJ2VudGVyJywgZXZlbnRzW2luZGV4XVsxXSwgY29udGV4dF0sXG4gICAgICAgICAgICAgIFsnZXhpdCcsIGV2ZW50c1tpbmRleF1bMV0sIGNvbnRleHRdXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAwXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2h1bmtlZFNwbGljZShldmVudHMsIG9wZW4gLSAxLCBpbmRleCAtIG9wZW4gKyAzLCBuZXh0RXZlbnRzKVxuICAgICAgICAgIGluZGV4ID0gb3BlbiArIG5leHRFdmVudHMubGVuZ3RoIC0gb2Zmc2V0IC0gMlxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gUmVtb3ZlIHJlbWFpbmluZyBzZXF1ZW5jZXMuXG5cbiAgaW5kZXggPSAtMVxuXG4gIHdoaWxlICgrK2luZGV4IDwgZXZlbnRzLmxlbmd0aCkge1xuICAgIGlmIChldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdhdHRlbnRpb25TZXF1ZW5jZScpIHtcbiAgICAgIGV2ZW50c1tpbmRleF1bMV0udHlwZSA9ICdkYXRhJ1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBldmVudHNcbn1cblxuZnVuY3Rpb24gdG9rZW5pemVBdHRlbnRpb24oZWZmZWN0cywgb2spIHtcbiAgdmFyIGJlZm9yZSA9IGNsYXNzaWZ5Q2hhcmFjdGVyKHRoaXMucHJldmlvdXMpXG4gIHZhciBtYXJrZXJcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ2F0dGVudGlvblNlcXVlbmNlJylcbiAgICBtYXJrZXIgPSBjb2RlXG4gICAgcmV0dXJuIHNlcXVlbmNlKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBzZXF1ZW5jZShjb2RlKSB7XG4gICAgdmFyIHRva2VuXG4gICAgdmFyIGFmdGVyXG4gICAgdmFyIG9wZW5cbiAgICB2YXIgY2xvc2VcblxuICAgIGlmIChjb2RlID09PSBtYXJrZXIpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHNlcXVlbmNlXG4gICAgfVxuXG4gICAgdG9rZW4gPSBlZmZlY3RzLmV4aXQoJ2F0dGVudGlvblNlcXVlbmNlJylcbiAgICBhZnRlciA9IGNsYXNzaWZ5Q2hhcmFjdGVyKGNvZGUpXG4gICAgb3BlbiA9ICFhZnRlciB8fCAoYWZ0ZXIgPT09IDIgJiYgYmVmb3JlKVxuICAgIGNsb3NlID0gIWJlZm9yZSB8fCAoYmVmb3JlID09PSAyICYmIGFmdGVyKVxuICAgIHRva2VuLl9vcGVuID0gbWFya2VyID09PSA0MiA/IG9wZW4gOiBvcGVuICYmIChiZWZvcmUgfHwgIWNsb3NlKVxuICAgIHRva2VuLl9jbG9zZSA9IG1hcmtlciA9PT0gNDIgPyBjbG9zZSA6IGNsb3NlICYmIChhZnRlciB8fCAhb3BlbilcbiAgICByZXR1cm4gb2soY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGF0dGVudGlvblxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgcmVnZXhDaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvcmVnZXgtY2hlY2suanMnKVxuXG52YXIgYXNjaWlBbHBoYSA9IHJlZ2V4Q2hlY2soL1tBLVphLXpdLylcblxubW9kdWxlLmV4cG9ydHMgPSBhc2NpaUFscGhhXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciByZWdleENoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9yZWdleC1jaGVjay5qcycpXG5cbnZhciBhc2NpaUFscGhhbnVtZXJpYyA9IHJlZ2V4Q2hlY2soL1tcXGRBLVphLXpdLylcblxubW9kdWxlLmV4cG9ydHMgPSBhc2NpaUFscGhhbnVtZXJpY1xuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgcmVnZXhDaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvcmVnZXgtY2hlY2suanMnKVxuXG52YXIgYXNjaWlBdGV4dCA9IHJlZ2V4Q2hlY2soL1sjLScqK1xcLS05PT9BLVpeLX5dLylcblxubW9kdWxlLmV4cG9ydHMgPSBhc2NpaUF0ZXh0XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbi8vIE5vdGU6IEVPRiBpcyBzZWVuIGFzIEFTQ0lJIGNvbnRyb2wgaGVyZSwgYmVjYXVzZSBgbnVsbCA8IDMyID09IHRydWVgLlxuZnVuY3Rpb24gYXNjaWlDb250cm9sKGNvZGUpIHtcbiAgcmV0dXJuIChcbiAgICAvLyBTcGVjaWFsIHdoaXRlc3BhY2UgY29kZXMgKHdoaWNoIGhhdmUgbmVnYXRpdmUgdmFsdWVzKSwgQzAgYW5kIENvbnRyb2xcbiAgICAvLyBjaGFyYWN0ZXIgREVMXG4gICAgY29kZSA8IDMyIHx8IGNvZGUgPT09IDEyN1xuICApXG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNjaWlDb250cm9sXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBhc2NpaUFscGhhID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL2FzY2lpLWFscGhhLmpzJylcbnZhciBhc2NpaUFscGhhbnVtZXJpYyA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9hc2NpaS1hbHBoYW51bWVyaWMuanMnKVxudmFyIGFzY2lpQXRleHQgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvYXNjaWktYXRleHQuanMnKVxudmFyIGFzY2lpQ29udHJvbCA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9hc2NpaS1jb250cm9sLmpzJylcblxudmFyIGF1dG9saW5rID0ge1xuICBuYW1lOiAnYXV0b2xpbmsnLFxuICB0b2tlbml6ZTogdG9rZW5pemVBdXRvbGlua1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUF1dG9saW5rKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNpemUgPSAxXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdhdXRvbGluaycpXG4gICAgZWZmZWN0cy5lbnRlcignYXV0b2xpbmtNYXJrZXInKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgnYXV0b2xpbmtNYXJrZXInKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2F1dG9saW5rUHJvdG9jb2wnKVxuICAgIHJldHVybiBvcGVuXG4gIH1cblxuICBmdW5jdGlvbiBvcGVuKGNvZGUpIHtcbiAgICBpZiAoYXNjaWlBbHBoYShjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gc2NoZW1lT3JFbWFpbEF0ZXh0XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzY2lpQXRleHQoY29kZSkgPyBlbWFpbEF0ZXh0KGNvZGUpIDogbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBzY2hlbWVPckVtYWlsQXRleHQoY29kZSkge1xuICAgIHJldHVybiBjb2RlID09PSA0MyB8fCBjb2RlID09PSA0NSB8fCBjb2RlID09PSA0NiB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlKVxuICAgICAgPyBzY2hlbWVJbnNpZGVPckVtYWlsQXRleHQoY29kZSlcbiAgICAgIDogZW1haWxBdGV4dChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gc2NoZW1lSW5zaWRlT3JFbWFpbEF0ZXh0KGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNTgpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHVybEluc2lkZVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChjb2RlID09PSA0MyB8fCBjb2RlID09PSA0NSB8fCBjb2RlID09PSA0NiB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlKSkgJiZcbiAgICAgIHNpemUrKyA8IDMyXG4gICAgKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBzY2hlbWVJbnNpZGVPckVtYWlsQXRleHRcbiAgICB9XG5cbiAgICByZXR1cm4gZW1haWxBdGV4dChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gdXJsSW5zaWRlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNjIpIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnYXV0b2xpbmtQcm90b2NvbCcpXG4gICAgICByZXR1cm4gZW5kKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDMyIHx8IGNvZGUgPT09IDYwIHx8IGFzY2lpQ29udHJvbChjb2RlKSkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiB1cmxJbnNpZGVcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtYWlsQXRleHQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA2NCkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBzaXplID0gMFxuICAgICAgcmV0dXJuIGVtYWlsQXRTaWduT3JEb3RcbiAgICB9XG5cbiAgICBpZiAoYXNjaWlBdGV4dChjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gZW1haWxBdGV4dFxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtYWlsQXRTaWduT3JEb3QoY29kZSkge1xuICAgIHJldHVybiBhc2NpaUFscGhhbnVtZXJpYyhjb2RlKSA/IGVtYWlsTGFiZWwoY29kZSkgOiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtYWlsTGFiZWwoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0Nikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBzaXplID0gMFxuICAgICAgcmV0dXJuIGVtYWlsQXRTaWduT3JEb3RcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gNjIpIHtcbiAgICAgIC8vIEV4aXQsIHRoZW4gY2hhbmdlIHRoZSB0eXBlLlxuICAgICAgZWZmZWN0cy5leGl0KCdhdXRvbGlua1Byb3RvY29sJykudHlwZSA9ICdhdXRvbGlua0VtYWlsJ1xuICAgICAgcmV0dXJuIGVuZChjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBlbWFpbFZhbHVlKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBlbWFpbFZhbHVlKGNvZGUpIHtcbiAgICBpZiAoKGNvZGUgPT09IDQ1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGUpKSAmJiBzaXplKysgPCA2Mykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29kZSA9PT0gNDUgPyBlbWFpbFZhbHVlIDogZW1haWxMYWJlbFxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZChjb2RlKSB7XG4gICAgZWZmZWN0cy5lbnRlcignYXV0b2xpbmtNYXJrZXInKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgnYXV0b2xpbmtNYXJrZXInKVxuICAgIGVmZmVjdHMuZXhpdCgnYXV0b2xpbmsnKVxuICAgIHJldHVybiBva1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXV0b2xpbmtcbiIsICIndXNlIHN0cmljdCdcblxudmFyIG1hcmtkb3duU3BhY2UgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tc3BhY2UuanMnKVxudmFyIGZhY3RvcnlTcGFjZSA9IHJlcXVpcmUoJy4vZmFjdG9yeS1zcGFjZS5qcycpXG5cbnZhciBibG9ja1F1b3RlID0ge1xuICBuYW1lOiAnYmxvY2tRdW90ZScsXG4gIHRva2VuaXplOiB0b2tlbml6ZUJsb2NrUXVvdGVTdGFydCxcbiAgY29udGludWF0aW9uOiB7XG4gICAgdG9rZW5pemU6IHRva2VuaXplQmxvY2tRdW90ZUNvbnRpbnVhdGlvblxuICB9LFxuICBleGl0OiBleGl0XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplQmxvY2tRdW90ZVN0YXJ0KGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNjIpIHtcbiAgICAgIGlmICghc2VsZi5jb250YWluZXJTdGF0ZS5vcGVuKSB7XG4gICAgICAgIGVmZmVjdHMuZW50ZXIoJ2Jsb2NrUXVvdGUnLCB7XG4gICAgICAgICAgX2NvbnRhaW5lcjogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgICBzZWxmLmNvbnRhaW5lclN0YXRlLm9wZW4gPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2Jsb2NrUXVvdGVQcmVmaXgnKVxuICAgICAgZWZmZWN0cy5lbnRlcignYmxvY2tRdW90ZU1hcmtlcicpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgnYmxvY2tRdW90ZU1hcmtlcicpXG4gICAgICByZXR1cm4gYWZ0ZXJcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBhZnRlcihjb2RlKSB7XG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2Jsb2NrUXVvdGVQcmVmaXhXaGl0ZXNwYWNlJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCdibG9ja1F1b3RlUHJlZml4V2hpdGVzcGFjZScpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2Jsb2NrUXVvdGVQcmVmaXgnKVxuICAgICAgcmV0dXJuIG9rXG4gICAgfVxuXG4gICAgZWZmZWN0cy5leGl0KCdibG9ja1F1b3RlUHJlZml4JylcbiAgICByZXR1cm4gb2soY29kZSlcbiAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUJsb2NrUXVvdGVDb250aW51YXRpb24oZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gZmFjdG9yeVNwYWNlKFxuICAgIGVmZmVjdHMsXG4gICAgZWZmZWN0cy5hdHRlbXB0KGJsb2NrUXVvdGUsIG9rLCBub2spLFxuICAgICdsaW5lUHJlZml4JyxcbiAgICB0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmRleE9mKCdjb2RlSW5kZW50ZWQnKSA+IC0xXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiA0XG4gIClcbn1cblxuZnVuY3Rpb24gZXhpdChlZmZlY3RzKSB7XG4gIGVmZmVjdHMuZXhpdCgnYmxvY2tRdW90ZScpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmxvY2tRdW90ZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgcmVnZXhDaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvcmVnZXgtY2hlY2suanMnKVxuXG52YXIgYXNjaWlQdW5jdHVhdGlvbiA9IHJlZ2V4Q2hlY2soL1shLS86LUBbLWB7LX5dLylcblxubW9kdWxlLmV4cG9ydHMgPSBhc2NpaVB1bmN0dWF0aW9uXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBhc2NpaVB1bmN0dWF0aW9uID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL2FzY2lpLXB1bmN0dWF0aW9uLmpzJylcblxudmFyIGNoYXJhY3RlckVzY2FwZSA9IHtcbiAgbmFtZTogJ2NoYXJhY3RlckVzY2FwZScsXG4gIHRva2VuaXplOiB0b2tlbml6ZUNoYXJhY3RlckVzY2FwZVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUNoYXJhY3RlckVzY2FwZShlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdjaGFyYWN0ZXJFc2NhcGUnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2VzY2FwZU1hcmtlcicpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgZWZmZWN0cy5leGl0KCdlc2NhcGVNYXJrZXInKVxuICAgIHJldHVybiBvcGVuXG4gIH1cblxuICBmdW5jdGlvbiBvcGVuKGNvZGUpIHtcbiAgICBpZiAoYXNjaWlQdW5jdHVhdGlvbihjb2RlKSkge1xuICAgICAgZWZmZWN0cy5lbnRlcignY2hhcmFjdGVyRXNjYXBlVmFsdWUnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2NoYXJhY3RlckVzY2FwZVZhbHVlJylcbiAgICAgIGVmZmVjdHMuZXhpdCgnY2hhcmFjdGVyRXNjYXBlJylcbiAgICAgIHJldHVybiBva1xuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoYXJhY3RlckVzY2FwZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG4vKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cblxudmFyIGVsXG5cbnZhciBzZW1pY29sb24gPSA1OSAvLyAgJzsnXG5cbm1vZHVsZS5leHBvcnRzID0gZGVjb2RlRW50aXR5XG5cbmZ1bmN0aW9uIGRlY29kZUVudGl0eShjaGFyYWN0ZXJzKSB7XG4gIHZhciBlbnRpdHkgPSAnJicgKyBjaGFyYWN0ZXJzICsgJzsnXG4gIHZhciBjaGFyXG5cbiAgZWwgPSBlbCB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJylcbiAgZWwuaW5uZXJIVE1MID0gZW50aXR5XG4gIGNoYXIgPSBlbC50ZXh0Q29udGVudFxuXG4gIC8vIFNvbWUgZW50aXRpZXMgZG8gbm90IHJlcXVpcmUgdGhlIGNsb3Npbmcgc2VtaWNvbG9uIChgJm5vdGAgLSBmb3IgaW5zdGFuY2UpLFxuICAvLyB3aGljaCBsZWFkcyB0byBzaXR1YXRpb25zIHdoZXJlIHBhcnNpbmcgdGhlIGFzc3VtZWQgZW50aXR5IG9mICZub3RpdDsgd2lsbFxuICAvLyByZXN1bHQgaW4gdGhlIHN0cmluZyBgXHUwMEFDaXQ7YC4gIFdoZW4gd2UgZW5jb3VudGVyIGEgdHJhaWxpbmcgc2VtaWNvbG9uIGFmdGVyXG4gIC8vIHBhcnNpbmcgYW5kIHRoZSBlbnRpdHkgdG8gZGVjb2RlIHdhcyBub3QgYSBzZW1pY29sb24gKGAmc2VtaTtgKSwgd2UgY2FuXG4gIC8vIGFzc3VtZSB0aGF0IHRoZSBtYXRjaGluZyB3YXMgaW5jb21wbGV0ZVxuICBpZiAoY2hhci5jaGFyQ29kZUF0KGNoYXIubGVuZ3RoIC0gMSkgPT09IHNlbWljb2xvbiAmJiBjaGFyYWN0ZXJzICE9PSAnc2VtaScpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIElmIHRoZSBkZWNvZGVkIHN0cmluZyBpcyBlcXVhbCB0byB0aGUgaW5wdXQsIHRoZSBlbnRpdHkgd2FzIG5vdCB2YWxpZFxuICByZXR1cm4gY2hhciA9PT0gZW50aXR5ID8gZmFsc2UgOiBjaGFyXG59XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciByZWdleENoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9yZWdleC1jaGVjay5qcycpXG5cbnZhciBhc2NpaURpZ2l0ID0gcmVnZXhDaGVjaygvXFxkLylcblxubW9kdWxlLmV4cG9ydHMgPSBhc2NpaURpZ2l0XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciByZWdleENoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9yZWdleC1jaGVjay5qcycpXG5cbnZhciBhc2NpaUhleERpZ2l0ID0gcmVnZXhDaGVjaygvW1xcZEEtRmEtZl0vKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzY2lpSGV4RGlnaXRcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGRlY29kZUVudGl0eSA9IHJlcXVpcmUoJ3BhcnNlLWVudGl0aWVzL2RlY29kZS1lbnRpdHkuanMnKVxudmFyIGFzY2lpQWxwaGFudW1lcmljID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL2FzY2lpLWFscGhhbnVtZXJpYy5qcycpXG52YXIgYXNjaWlEaWdpdCA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9hc2NpaS1kaWdpdC5qcycpXG52YXIgYXNjaWlIZXhEaWdpdCA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9hc2NpaS1oZXgtZGlnaXQuanMnKVxuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHRMZWdhY3koZSkge1xuICByZXR1cm4gZSAmJiB0eXBlb2YgZSA9PT0gJ29iamVjdCcgJiYgJ2RlZmF1bHQnIGluIGUgPyBlIDoge2RlZmF1bHQ6IGV9XG59XG5cbnZhciBkZWNvZGVFbnRpdHlfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovIF9pbnRlcm9wRGVmYXVsdExlZ2FjeShkZWNvZGVFbnRpdHkpXG5cbnZhciBjaGFyYWN0ZXJSZWZlcmVuY2UgPSB7XG4gIG5hbWU6ICdjaGFyYWN0ZXJSZWZlcmVuY2UnLFxuICB0b2tlbml6ZTogdG9rZW5pemVDaGFyYWN0ZXJSZWZlcmVuY2Vcbn1cblxuZnVuY3Rpb24gdG9rZW5pemVDaGFyYWN0ZXJSZWZlcmVuY2UoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIHNpemUgPSAwXG4gIHZhciBtYXhcbiAgdmFyIHRlc3RcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ2NoYXJhY3RlclJlZmVyZW5jZScpXG4gICAgZWZmZWN0cy5lbnRlcignY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ2NoYXJhY3RlclJlZmVyZW5jZU1hcmtlcicpXG4gICAgcmV0dXJuIG9wZW5cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW4oY29kZSkge1xuICAgIGlmIChjb2RlID09PSAzNSkge1xuICAgICAgZWZmZWN0cy5lbnRlcignY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYycpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgnY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYycpXG4gICAgICByZXR1cm4gbnVtZXJpY1xuICAgIH1cblxuICAgIGVmZmVjdHMuZW50ZXIoJ2NoYXJhY3RlclJlZmVyZW5jZVZhbHVlJylcbiAgICBtYXggPSAzMVxuICAgIHRlc3QgPSBhc2NpaUFscGhhbnVtZXJpY1xuICAgIHJldHVybiB2YWx1ZShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gbnVtZXJpYyhjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDg4IHx8IGNvZGUgPT09IDEyMCkge1xuICAgICAgZWZmZWN0cy5lbnRlcignY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VySGV4YWRlY2ltYWwnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2NoYXJhY3RlclJlZmVyZW5jZU1hcmtlckhleGFkZWNpbWFsJylcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2NoYXJhY3RlclJlZmVyZW5jZVZhbHVlJylcbiAgICAgIG1heCA9IDZcbiAgICAgIHRlc3QgPSBhc2NpaUhleERpZ2l0XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBlZmZlY3RzLmVudGVyKCdjaGFyYWN0ZXJSZWZlcmVuY2VWYWx1ZScpXG4gICAgbWF4ID0gN1xuICAgIHRlc3QgPSBhc2NpaURpZ2l0XG4gICAgcmV0dXJuIHZhbHVlKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiB2YWx1ZShjb2RlKSB7XG4gICAgdmFyIHRva2VuXG5cbiAgICBpZiAoY29kZSA9PT0gNTkgJiYgc2l6ZSkge1xuICAgICAgdG9rZW4gPSBlZmZlY3RzLmV4aXQoJ2NoYXJhY3RlclJlZmVyZW5jZVZhbHVlJylcblxuICAgICAgaWYgKFxuICAgICAgICB0ZXN0ID09PSBhc2NpaUFscGhhbnVtZXJpYyAmJlxuICAgICAgICAhZGVjb2RlRW50aXR5X19kZWZhdWx0WydkZWZhdWx0J10oc2VsZi5zbGljZVNlcmlhbGl6ZSh0b2tlbikpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgICAgfVxuXG4gICAgICBlZmZlY3RzLmVudGVyKCdjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXInKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2NoYXJhY3RlclJlZmVyZW5jZU1hcmtlcicpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2NoYXJhY3RlclJlZmVyZW5jZScpXG4gICAgICByZXR1cm4gb2tcbiAgICB9XG5cbiAgICBpZiAodGVzdChjb2RlKSAmJiBzaXplKysgPCBtYXgpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2hhcmFjdGVyUmVmZXJlbmNlXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmctb3Itc3BhY2UuanMnKVxudmFyIHByZWZpeFNpemUgPSByZXF1aXJlKCcuLi91dGlsL3ByZWZpeC1zaXplLmpzJylcbnZhciBmYWN0b3J5U3BhY2UgPSByZXF1aXJlKCcuL2ZhY3Rvcnktc3BhY2UuanMnKVxuXG52YXIgY29kZUZlbmNlZCA9IHtcbiAgbmFtZTogJ2NvZGVGZW5jZWQnLFxuICB0b2tlbml6ZTogdG9rZW5pemVDb2RlRmVuY2VkLFxuICBjb25jcmV0ZTogdHJ1ZVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUNvZGVGZW5jZWQoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIGNsb3NpbmdGZW5jZUNvbnN0cnVjdCA9IHtcbiAgICB0b2tlbml6ZTogdG9rZW5pemVDbG9zaW5nRmVuY2UsXG4gICAgcGFydGlhbDogdHJ1ZVxuICB9XG4gIHZhciBpbml0aWFsUHJlZml4ID0gcHJlZml4U2l6ZSh0aGlzLmV2ZW50cywgJ2xpbmVQcmVmaXgnKVxuICB2YXIgc2l6ZU9wZW4gPSAwXG4gIHZhciBtYXJrZXJcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ2NvZGVGZW5jZWQnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2NvZGVGZW5jZWRGZW5jZScpXG4gICAgZWZmZWN0cy5lbnRlcignY29kZUZlbmNlZEZlbmNlU2VxdWVuY2UnKVxuICAgIG1hcmtlciA9IGNvZGVcbiAgICByZXR1cm4gc2VxdWVuY2VPcGVuKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBzZXF1ZW5jZU9wZW4oY29kZSkge1xuICAgIGlmIChjb2RlID09PSBtYXJrZXIpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgc2l6ZU9wZW4rK1xuICAgICAgcmV0dXJuIHNlcXVlbmNlT3BlblxuICAgIH1cblxuICAgIGVmZmVjdHMuZXhpdCgnY29kZUZlbmNlZEZlbmNlU2VxdWVuY2UnKVxuICAgIHJldHVybiBzaXplT3BlbiA8IDNcbiAgICAgID8gbm9rKGNvZGUpXG4gICAgICA6IGZhY3RvcnlTcGFjZShlZmZlY3RzLCBpbmZvT3BlbiwgJ3doaXRlc3BhY2UnKShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5mb09wZW4oY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuIG9wZW5BZnRlcihjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuZW50ZXIoJ2NvZGVGZW5jZWRGZW5jZUluZm8nKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2NodW5rU3RyaW5nJywge1xuICAgICAgY29udGVudFR5cGU6ICdzdHJpbmcnXG4gICAgfSlcbiAgICByZXR1cm4gaW5mbyhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5mbyhjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlKSkge1xuICAgICAgZWZmZWN0cy5leGl0KCdjaHVua1N0cmluZycpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2NvZGVGZW5jZWRGZW5jZUluZm8nKVxuICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBpbmZvQWZ0ZXIsICd3aGl0ZXNwYWNlJykoY29kZSlcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gOTYgJiYgY29kZSA9PT0gbWFya2VyKSByZXR1cm4gbm9rKGNvZGUpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIGluZm9cbiAgfVxuXG4gIGZ1bmN0aW9uIGluZm9BZnRlcihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICByZXR1cm4gb3BlbkFmdGVyKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignY29kZUZlbmNlZEZlbmNlTWV0YScpXG4gICAgZWZmZWN0cy5lbnRlcignY2h1bmtTdHJpbmcnLCB7XG4gICAgICBjb250ZW50VHlwZTogJ3N0cmluZydcbiAgICB9KVxuICAgIHJldHVybiBtZXRhKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBtZXRhKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnY2h1bmtTdHJpbmcnKVxuICAgICAgZWZmZWN0cy5leGl0KCdjb2RlRmVuY2VkRmVuY2VNZXRhJylcbiAgICAgIHJldHVybiBvcGVuQWZ0ZXIoY29kZSlcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gOTYgJiYgY29kZSA9PT0gbWFya2VyKSByZXR1cm4gbm9rKGNvZGUpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIG1ldGFcbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5BZnRlcihjb2RlKSB7XG4gICAgZWZmZWN0cy5leGl0KCdjb2RlRmVuY2VkRmVuY2UnKVxuICAgIHJldHVybiBzZWxmLmludGVycnVwdCA/IG9rKGNvZGUpIDogY29udGVudChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29udGVudChjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBhZnRlcihjb2RlKVxuICAgIH1cblxuICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2xpbmVFbmRpbmcnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2xpbmVFbmRpbmcnKVxuICAgICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChcbiAgICAgICAgY2xvc2luZ0ZlbmNlQ29uc3RydWN0LFxuICAgICAgICBhZnRlcixcbiAgICAgICAgaW5pdGlhbFByZWZpeFxuICAgICAgICAgID8gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGNvbnRlbnQsICdsaW5lUHJlZml4JywgaW5pdGlhbFByZWZpeCArIDEpXG4gICAgICAgICAgOiBjb250ZW50XG4gICAgICApXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignY29kZUZsb3dWYWx1ZScpXG4gICAgcmV0dXJuIGNvbnRlbnRDb250aW51ZShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29udGVudENvbnRpbnVlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnY29kZUZsb3dWYWx1ZScpXG4gICAgICByZXR1cm4gY29udGVudChjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBjb250ZW50Q29udGludWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGFmdGVyKGNvZGUpIHtcbiAgICBlZmZlY3RzLmV4aXQoJ2NvZGVGZW5jZWQnKVxuICAgIHJldHVybiBvayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gdG9rZW5pemVDbG9zaW5nRmVuY2UoZWZmZWN0cywgb2ssIG5vaykge1xuICAgIHZhciBzaXplID0gMFxuICAgIHJldHVybiBmYWN0b3J5U3BhY2UoXG4gICAgICBlZmZlY3RzLFxuICAgICAgY2xvc2luZ1NlcXVlbmNlU3RhcnQsXG4gICAgICAnbGluZVByZWZpeCcsXG4gICAgICB0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmRleE9mKCdjb2RlSW5kZW50ZWQnKSA+IC0xXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogNFxuICAgIClcblxuICAgIGZ1bmN0aW9uIGNsb3NpbmdTZXF1ZW5jZVN0YXJ0KGNvZGUpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2NvZGVGZW5jZWRGZW5jZScpXG4gICAgICBlZmZlY3RzLmVudGVyKCdjb2RlRmVuY2VkRmVuY2VTZXF1ZW5jZScpXG4gICAgICByZXR1cm4gY2xvc2luZ1NlcXVlbmNlKGNvZGUpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvc2luZ1NlcXVlbmNlKGNvZGUpIHtcbiAgICAgIGlmIChjb2RlID09PSBtYXJrZXIpIHtcbiAgICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICAgIHNpemUrK1xuICAgICAgICByZXR1cm4gY2xvc2luZ1NlcXVlbmNlXG4gICAgICB9XG5cbiAgICAgIGlmIChzaXplIDwgc2l6ZU9wZW4pIHJldHVybiBub2soY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgnY29kZUZlbmNlZEZlbmNlU2VxdWVuY2UnKVxuICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBjbG9zaW5nU2VxdWVuY2VFbmQsICd3aGl0ZXNwYWNlJykoY29kZSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbG9zaW5nU2VxdWVuY2VFbmQoY29kZSkge1xuICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICAgIGVmZmVjdHMuZXhpdCgnY29kZUZlbmNlZEZlbmNlJylcbiAgICAgICAgcmV0dXJuIG9rKGNvZGUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb2RlRmVuY2VkXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIGNodW5rZWRTcGxpY2UgPSByZXF1aXJlKCcuLi91dGlsL2NodW5rZWQtc3BsaWNlLmpzJylcbnZhciBwcmVmaXhTaXplID0gcmVxdWlyZSgnLi4vdXRpbC9wcmVmaXgtc2l6ZS5qcycpXG52YXIgZmFjdG9yeVNwYWNlID0gcmVxdWlyZSgnLi9mYWN0b3J5LXNwYWNlLmpzJylcblxudmFyIGNvZGVJbmRlbnRlZCA9IHtcbiAgbmFtZTogJ2NvZGVJbmRlbnRlZCcsXG4gIHRva2VuaXplOiB0b2tlbml6ZUNvZGVJbmRlbnRlZCxcbiAgcmVzb2x2ZTogcmVzb2x2ZUNvZGVJbmRlbnRlZFxufVxudmFyIGluZGVudGVkQ29udGVudENvbnN0cnVjdCA9IHtcbiAgdG9rZW5pemU6IHRva2VuaXplSW5kZW50ZWRDb250ZW50LFxuICBwYXJ0aWFsOiB0cnVlXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb2RlSW5kZW50ZWQoZXZlbnRzLCBjb250ZXh0KSB7XG4gIHZhciBjb2RlID0ge1xuICAgIHR5cGU6ICdjb2RlSW5kZW50ZWQnLFxuICAgIHN0YXJ0OiBldmVudHNbMF1bMV0uc3RhcnQsXG4gICAgZW5kOiBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLmVuZFxuICB9XG4gIGNodW5rZWRTcGxpY2UoZXZlbnRzLCAwLCAwLCBbWydlbnRlcicsIGNvZGUsIGNvbnRleHRdXSlcbiAgY2h1bmtlZFNwbGljZShldmVudHMsIGV2ZW50cy5sZW5ndGgsIDAsIFtbJ2V4aXQnLCBjb2RlLCBjb250ZXh0XV0pXG4gIHJldHVybiBldmVudHNcbn1cblxuZnVuY3Rpb24gdG9rZW5pemVDb2RlSW5kZW50ZWQoZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KGluZGVudGVkQ29udGVudENvbnN0cnVjdCwgYWZ0ZXJQcmVmaXgsIG5vaylcblxuICBmdW5jdGlvbiBhZnRlclByZWZpeChjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBvayhjb2RlKVxuICAgIH1cblxuICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoaW5kZW50ZWRDb250ZW50Q29uc3RydWN0LCBhZnRlclByZWZpeCwgb2spKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignY29kZUZsb3dWYWx1ZScpXG4gICAgcmV0dXJuIGNvbnRlbnQoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRlbnQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgZWZmZWN0cy5leGl0KCdjb2RlRmxvd1ZhbHVlJylcbiAgICAgIHJldHVybiBhZnRlclByZWZpeChjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBjb250ZW50XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5pemVJbmRlbnRlZENvbnRlbnQoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlclByZWZpeCwgJ2xpbmVQcmVmaXgnLCA0ICsgMSlcblxuICBmdW5jdGlvbiBhZnRlclByZWZpeChjb2RlKSB7XG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgZWZmZWN0cy5lbnRlcignbGluZUVuZGluZycpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgnbGluZUVuZGluZycpXG4gICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGFmdGVyUHJlZml4LCAnbGluZVByZWZpeCcsIDQgKyAxKVxuICAgIH1cblxuICAgIHJldHVybiBwcmVmaXhTaXplKHNlbGYuZXZlbnRzLCAnbGluZVByZWZpeCcpIDwgNCA/IG5vayhjb2RlKSA6IG9rKGNvZGUpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb2RlSW5kZW50ZWRcbiIsICIndXNlIHN0cmljdCdcblxudmFyIG1hcmtkb3duTGluZUVuZGluZyA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9tYXJrZG93bi1saW5lLWVuZGluZy5qcycpXG5cbnZhciBjb2RlVGV4dCA9IHtcbiAgbmFtZTogJ2NvZGVUZXh0JyxcbiAgdG9rZW5pemU6IHRva2VuaXplQ29kZVRleHQsXG4gIHJlc29sdmU6IHJlc29sdmVDb2RlVGV4dCxcbiAgcHJldmlvdXM6IHByZXZpb3VzXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb2RlVGV4dChldmVudHMpIHtcbiAgdmFyIHRhaWxFeGl0SW5kZXggPSBldmVudHMubGVuZ3RoIC0gNFxuICB2YXIgaGVhZEVudGVySW5kZXggPSAzXG4gIHZhciBpbmRleFxuICB2YXIgZW50ZXIgLy8gSWYgd2Ugc3RhcnQgYW5kIGVuZCB3aXRoIGFuIEVPTCBvciBhIHNwYWNlLlxuXG4gIGlmIChcbiAgICAoZXZlbnRzW2hlYWRFbnRlckluZGV4XVsxXS50eXBlID09PSAnbGluZUVuZGluZycgfHxcbiAgICAgIGV2ZW50c1toZWFkRW50ZXJJbmRleF1bMV0udHlwZSA9PT0gJ3NwYWNlJykgJiZcbiAgICAoZXZlbnRzW3RhaWxFeGl0SW5kZXhdWzFdLnR5cGUgPT09ICdsaW5lRW5kaW5nJyB8fFxuICAgICAgZXZlbnRzW3RhaWxFeGl0SW5kZXhdWzFdLnR5cGUgPT09ICdzcGFjZScpXG4gICkge1xuICAgIGluZGV4ID0gaGVhZEVudGVySW5kZXggLy8gQW5kIHdlIGhhdmUgZGF0YS5cblxuICAgIHdoaWxlICgrK2luZGV4IDwgdGFpbEV4aXRJbmRleCkge1xuICAgICAgaWYgKGV2ZW50c1tpbmRleF1bMV0udHlwZSA9PT0gJ2NvZGVUZXh0RGF0YScpIHtcbiAgICAgICAgLy8gVGhlbiB3ZSBoYXZlIHBhZGRpbmcuXG4gICAgICAgIGV2ZW50c1t0YWlsRXhpdEluZGV4XVsxXS50eXBlID0gZXZlbnRzW2hlYWRFbnRlckluZGV4XVsxXS50eXBlID1cbiAgICAgICAgICAnY29kZVRleHRQYWRkaW5nJ1xuICAgICAgICBoZWFkRW50ZXJJbmRleCArPSAyXG4gICAgICAgIHRhaWxFeGl0SW5kZXggLT0gMlxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBNZXJnZSBhZGphY2VudCBzcGFjZXMgYW5kIGRhdGEuXG5cbiAgaW5kZXggPSBoZWFkRW50ZXJJbmRleCAtIDFcbiAgdGFpbEV4aXRJbmRleCsrXG5cbiAgd2hpbGUgKCsraW5kZXggPD0gdGFpbEV4aXRJbmRleCkge1xuICAgIGlmIChlbnRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoaW5kZXggIT09IHRhaWxFeGl0SW5kZXggJiYgZXZlbnRzW2luZGV4XVsxXS50eXBlICE9PSAnbGluZUVuZGluZycpIHtcbiAgICAgICAgZW50ZXIgPSBpbmRleFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBpbmRleCA9PT0gdGFpbEV4aXRJbmRleCB8fFxuICAgICAgZXZlbnRzW2luZGV4XVsxXS50eXBlID09PSAnbGluZUVuZGluZydcbiAgICApIHtcbiAgICAgIGV2ZW50c1tlbnRlcl1bMV0udHlwZSA9ICdjb2RlVGV4dERhdGEnXG5cbiAgICAgIGlmIChpbmRleCAhPT0gZW50ZXIgKyAyKSB7XG4gICAgICAgIGV2ZW50c1tlbnRlcl1bMV0uZW5kID0gZXZlbnRzW2luZGV4IC0gMV1bMV0uZW5kXG4gICAgICAgIGV2ZW50cy5zcGxpY2UoZW50ZXIgKyAyLCBpbmRleCAtIGVudGVyIC0gMilcbiAgICAgICAgdGFpbEV4aXRJbmRleCAtPSBpbmRleCAtIGVudGVyIC0gMlxuICAgICAgICBpbmRleCA9IGVudGVyICsgMlxuICAgICAgfVxuXG4gICAgICBlbnRlciA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBldmVudHNcbn1cblxuZnVuY3Rpb24gcHJldmlvdXMoY29kZSkge1xuICAvLyBJZiB0aGVyZSBpcyBhIHByZXZpb3VzIGNvZGUsIHRoZXJlIHdpbGwgYWx3YXlzIGJlIGEgdGFpbC5cbiAgcmV0dXJuIChcbiAgICBjb2RlICE9PSA5NiB8fFxuICAgIHRoaXMuZXZlbnRzW3RoaXMuZXZlbnRzLmxlbmd0aCAtIDFdWzFdLnR5cGUgPT09ICdjaGFyYWN0ZXJFc2NhcGUnXG4gIClcbn1cblxuZnVuY3Rpb24gdG9rZW5pemVDb2RlVGV4dChlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzaXplT3BlbiA9IDBcbiAgdmFyIHNpemVcbiAgdmFyIHRva2VuXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdjb2RlVGV4dCcpXG4gICAgZWZmZWN0cy5lbnRlcignY29kZVRleHRTZXF1ZW5jZScpXG4gICAgcmV0dXJuIG9wZW5pbmdTZXF1ZW5jZShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gb3BlbmluZ1NlcXVlbmNlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gOTYpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgc2l6ZU9wZW4rK1xuICAgICAgcmV0dXJuIG9wZW5pbmdTZXF1ZW5jZVxuICAgIH1cblxuICAgIGVmZmVjdHMuZXhpdCgnY29kZVRleHRTZXF1ZW5jZScpXG4gICAgcmV0dXJuIGdhcChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZ2FwKGNvZGUpIHtcbiAgICAvLyBFT0YuXG4gICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9IC8vIENsb3NpbmcgZmVuY2U/XG4gICAgLy8gQ291bGQgYWxzbyBiZSBkYXRhLlxuXG4gICAgaWYgKGNvZGUgPT09IDk2KSB7XG4gICAgICB0b2tlbiA9IGVmZmVjdHMuZW50ZXIoJ2NvZGVUZXh0U2VxdWVuY2UnKVxuICAgICAgc2l6ZSA9IDBcbiAgICAgIHJldHVybiBjbG9zaW5nU2VxdWVuY2UoY29kZSlcbiAgICB9IC8vIFRhYnMgZG9uXHUyMDE5dCB3b3JrLCBhbmQgdmlydHVhbCBzcGFjZXMgZG9uXHUyMDE5dCBtYWtlIHNlbnNlLlxuXG4gICAgaWYgKGNvZGUgPT09IDMyKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCdzcGFjZScpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgnc3BhY2UnKVxuICAgICAgcmV0dXJuIGdhcFxuICAgIH1cblxuICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2xpbmVFbmRpbmcnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2xpbmVFbmRpbmcnKVxuICAgICAgcmV0dXJuIGdhcFxuICAgIH0gLy8gRGF0YS5cblxuICAgIGVmZmVjdHMuZW50ZXIoJ2NvZGVUZXh0RGF0YScpXG4gICAgcmV0dXJuIGRhdGEoY29kZSlcbiAgfSAvLyBJbiBjb2RlLlxuXG4gIGZ1bmN0aW9uIGRhdGEoY29kZSkge1xuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IG51bGwgfHxcbiAgICAgIGNvZGUgPT09IDMyIHx8XG4gICAgICBjb2RlID09PSA5NiB8fFxuICAgICAgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpXG4gICAgKSB7XG4gICAgICBlZmZlY3RzLmV4aXQoJ2NvZGVUZXh0RGF0YScpXG4gICAgICByZXR1cm4gZ2FwKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIGRhdGFcbiAgfSAvLyBDbG9zaW5nIGZlbmNlLlxuXG4gIGZ1bmN0aW9uIGNsb3NpbmdTZXF1ZW5jZShjb2RlKSB7XG4gICAgLy8gTW9yZS5cbiAgICBpZiAoY29kZSA9PT0gOTYpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgc2l6ZSsrXG4gICAgICByZXR1cm4gY2xvc2luZ1NlcXVlbmNlXG4gICAgfSAvLyBEb25lIVxuXG4gICAgaWYgKHNpemUgPT09IHNpemVPcGVuKSB7XG4gICAgICBlZmZlY3RzLmV4aXQoJ2NvZGVUZXh0U2VxdWVuY2UnKVxuICAgICAgZWZmZWN0cy5leGl0KCdjb2RlVGV4dCcpXG4gICAgICByZXR1cm4gb2soY29kZSlcbiAgICB9IC8vIE1vcmUgb3IgbGVzcyBhY2NlbnRzOiBtYXJrIGFzIGRhdGEuXG5cbiAgICB0b2tlbi50eXBlID0gJ2NvZGVUZXh0RGF0YSdcbiAgICByZXR1cm4gZGF0YShjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29kZVRleHRcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGFzY2lpQ29udHJvbCA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9hc2NpaS1jb250cm9sLmpzJylcbnZhciBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLW9yLXNwYWNlLmpzJylcbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuZnVuY3Rpb24gZGVzdGluYXRpb25GYWN0b3J5KFxuICBlZmZlY3RzLFxuICBvayxcbiAgbm9rLFxuICB0eXBlLFxuICBsaXRlcmFsVHlwZSxcbiAgbGl0ZXJhbE1hcmtlclR5cGUsXG4gIHJhd1R5cGUsXG4gIHN0cmluZ1R5cGUsXG4gIG1heFxuKSB7XG4gIHZhciBsaW1pdCA9IG1heCB8fCBJbmZpbml0eVxuICB2YXIgYmFsYW5jZSA9IDBcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA2MCkge1xuICAgICAgZWZmZWN0cy5lbnRlcih0eXBlKVxuICAgICAgZWZmZWN0cy5lbnRlcihsaXRlcmFsVHlwZSlcbiAgICAgIGVmZmVjdHMuZW50ZXIobGl0ZXJhbE1hcmtlclR5cGUpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdChsaXRlcmFsTWFya2VyVHlwZSlcbiAgICAgIHJldHVybiBkZXN0aW5hdGlvbkVuY2xvc2VkQmVmb3JlXG4gICAgfVxuXG4gICAgaWYgKGFzY2lpQ29udHJvbChjb2RlKSB8fCBjb2RlID09PSA0MSkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuZW50ZXIodHlwZSlcbiAgICBlZmZlY3RzLmVudGVyKHJhd1R5cGUpXG4gICAgZWZmZWN0cy5lbnRlcihzdHJpbmdUeXBlKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2NodW5rU3RyaW5nJywge1xuICAgICAgY29udGVudFR5cGU6ICdzdHJpbmcnXG4gICAgfSlcbiAgICByZXR1cm4gZGVzdGluYXRpb25SYXcoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3RpbmF0aW9uRW5jbG9zZWRCZWZvcmUoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA2Mikge1xuICAgICAgZWZmZWN0cy5lbnRlcihsaXRlcmFsTWFya2VyVHlwZSlcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KGxpdGVyYWxNYXJrZXJUeXBlKVxuICAgICAgZWZmZWN0cy5leGl0KGxpdGVyYWxUeXBlKVxuICAgICAgZWZmZWN0cy5leGl0KHR5cGUpXG4gICAgICByZXR1cm4gb2tcbiAgICB9XG5cbiAgICBlZmZlY3RzLmVudGVyKHN0cmluZ1R5cGUpXG4gICAgZWZmZWN0cy5lbnRlcignY2h1bmtTdHJpbmcnLCB7XG4gICAgICBjb250ZW50VHlwZTogJ3N0cmluZydcbiAgICB9KVxuICAgIHJldHVybiBkZXN0aW5hdGlvbkVuY2xvc2VkKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBkZXN0aW5hdGlvbkVuY2xvc2VkKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNjIpIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnY2h1bmtTdHJpbmcnKVxuICAgICAgZWZmZWN0cy5leGl0KHN0cmluZ1R5cGUpXG4gICAgICByZXR1cm4gZGVzdGluYXRpb25FbmNsb3NlZEJlZm9yZShjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IDYwIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBjb2RlID09PSA5MiA/IGRlc3RpbmF0aW9uRW5jbG9zZWRFc2NhcGUgOiBkZXN0aW5hdGlvbkVuY2xvc2VkXG4gIH1cblxuICBmdW5jdGlvbiBkZXN0aW5hdGlvbkVuY2xvc2VkRXNjYXBlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNjAgfHwgY29kZSA9PT0gNjIgfHwgY29kZSA9PT0gOTIpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uRW5jbG9zZWRcbiAgICB9XG5cbiAgICByZXR1cm4gZGVzdGluYXRpb25FbmNsb3NlZChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdGluYXRpb25SYXcoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0MCkge1xuICAgICAgaWYgKCsrYmFsYW5jZSA+IGxpbWl0KSByZXR1cm4gbm9rKGNvZGUpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBkZXN0aW5hdGlvblJhd1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA0MSkge1xuICAgICAgaWYgKCFiYWxhbmNlLS0pIHtcbiAgICAgICAgZWZmZWN0cy5leGl0KCdjaHVua1N0cmluZycpXG4gICAgICAgIGVmZmVjdHMuZXhpdChzdHJpbmdUeXBlKVxuICAgICAgICBlZmZlY3RzLmV4aXQocmF3VHlwZSlcbiAgICAgICAgZWZmZWN0cy5leGl0KHR5cGUpXG4gICAgICAgIHJldHVybiBvayhjb2RlKVxuICAgICAgfVxuXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBkZXN0aW5hdGlvblJhd1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZSkpIHtcbiAgICAgIGlmIChiYWxhbmNlKSByZXR1cm4gbm9rKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2NodW5rU3RyaW5nJylcbiAgICAgIGVmZmVjdHMuZXhpdChzdHJpbmdUeXBlKVxuICAgICAgZWZmZWN0cy5leGl0KHJhd1R5cGUpXG4gICAgICBlZmZlY3RzLmV4aXQodHlwZSlcbiAgICAgIHJldHVybiBvayhjb2RlKVxuICAgIH1cblxuICAgIGlmIChhc2NpaUNvbnRyb2woY29kZSkpIHJldHVybiBub2soY29kZSlcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gY29kZSA9PT0gOTIgPyBkZXN0aW5hdGlvblJhd0VzY2FwZSA6IGRlc3RpbmF0aW9uUmF3XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0aW5hdGlvblJhd0VzY2FwZShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDQwIHx8IGNvZGUgPT09IDQxIHx8IGNvZGUgPT09IDkyKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBkZXN0aW5hdGlvblJhd1xuICAgIH1cblxuICAgIHJldHVybiBkZXN0aW5hdGlvblJhdyhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVzdGluYXRpb25GYWN0b3J5XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIG1hcmtkb3duU3BhY2UgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tc3BhY2UuanMnKVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuZnVuY3Rpb24gbGFiZWxGYWN0b3J5KGVmZmVjdHMsIG9rLCBub2ssIHR5cGUsIG1hcmtlclR5cGUsIHN0cmluZ1R5cGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBzaXplID0gMFxuICB2YXIgZGF0YVxuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgZWZmZWN0cy5lbnRlcih0eXBlKVxuICAgIGVmZmVjdHMuZW50ZXIobWFya2VyVHlwZSlcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQobWFya2VyVHlwZSlcbiAgICBlZmZlY3RzLmVudGVyKHN0cmluZ1R5cGUpXG4gICAgcmV0dXJuIGF0QnJlYWtcbiAgfVxuXG4gIGZ1bmN0aW9uIGF0QnJlYWsoY29kZSkge1xuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IG51bGwgfHxcbiAgICAgIGNvZGUgPT09IDkxIHx8XG4gICAgICAoY29kZSA9PT0gOTMgJiYgIWRhdGEpIHx8XG4gICAgICAvKiBjOCBpZ25vcmUgbmV4dCAqL1xuICAgICAgKGNvZGUgPT09IDk0ICYmXG4gICAgICAgIC8qIGM4IGlnbm9yZSBuZXh0ICovXG4gICAgICAgICFzaXplICYmXG4gICAgICAgIC8qIGM4IGlnbm9yZSBuZXh0ICovXG4gICAgICAgICdfaGlkZGVuRm9vdG5vdGVTdXBwb3J0JyBpbiBzZWxmLnBhcnNlci5jb25zdHJ1Y3RzKSB8fFxuICAgICAgc2l6ZSA+IDk5OVxuICAgICkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA5Mykge1xuICAgICAgZWZmZWN0cy5leGl0KHN0cmluZ1R5cGUpXG4gICAgICBlZmZlY3RzLmVudGVyKG1hcmtlclR5cGUpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdChtYXJrZXJUeXBlKVxuICAgICAgZWZmZWN0cy5leGl0KHR5cGUpXG4gICAgICByZXR1cm4gb2tcbiAgICB9XG5cbiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCdsaW5lRW5kaW5nJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCdsaW5lRW5kaW5nJylcbiAgICAgIHJldHVybiBhdEJyZWFrXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignY2h1bmtTdHJpbmcnLCB7XG4gICAgICBjb250ZW50VHlwZTogJ3N0cmluZydcbiAgICB9KVxuICAgIHJldHVybiBsYWJlbChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gbGFiZWwoY29kZSkge1xuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IG51bGwgfHxcbiAgICAgIGNvZGUgPT09IDkxIHx8XG4gICAgICBjb2RlID09PSA5MyB8fFxuICAgICAgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpIHx8XG4gICAgICBzaXplKysgPiA5OTlcbiAgICApIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnY2h1bmtTdHJpbmcnKVxuICAgICAgcmV0dXJuIGF0QnJlYWsoY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBkYXRhID0gZGF0YSB8fCAhbWFya2Rvd25TcGFjZShjb2RlKVxuICAgIHJldHVybiBjb2RlID09PSA5MiA/IGxhYmVsRXNjYXBlIDogbGFiZWxcbiAgfVxuXG4gIGZ1bmN0aW9uIGxhYmVsRXNjYXBlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gOTEgfHwgY29kZSA9PT0gOTIgfHwgY29kZSA9PT0gOTMpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgc2l6ZSsrXG4gICAgICByZXR1cm4gbGFiZWxcbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWwoY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxhYmVsRmFjdG9yeVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgbWFya2Rvd25MaW5lRW5kaW5nID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLmpzJylcbnZhciBtYXJrZG93blNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLXNwYWNlLmpzJylcbnZhciBmYWN0b3J5U3BhY2UgPSByZXF1aXJlKCcuL2ZhY3Rvcnktc3BhY2UuanMnKVxuXG5mdW5jdGlvbiB3aGl0ZXNwYWNlRmFjdG9yeShlZmZlY3RzLCBvaykge1xuICB2YXIgc2VlblxuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgZWZmZWN0cy5lbnRlcignbGluZUVuZGluZycpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgnbGluZUVuZGluZycpXG4gICAgICBzZWVuID0gdHJ1ZVxuICAgICAgcmV0dXJuIHN0YXJ0XG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoXG4gICAgICAgIGVmZmVjdHMsXG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBzZWVuID8gJ2xpbmVQcmVmaXgnIDogJ2xpbmVTdWZmaXgnXG4gICAgICApKGNvZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG9rKGNvZGUpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3aGl0ZXNwYWNlRmFjdG9yeVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgbWFya2Rvd25MaW5lRW5kaW5nID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLmpzJylcbnZhciBmYWN0b3J5U3BhY2UgPSByZXF1aXJlKCcuL2ZhY3Rvcnktc3BhY2UuanMnKVxuXG5mdW5jdGlvbiB0aXRsZUZhY3RvcnkoZWZmZWN0cywgb2ssIG5vaywgdHlwZSwgbWFya2VyVHlwZSwgc3RyaW5nVHlwZSkge1xuICB2YXIgbWFya2VyXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKHR5cGUpXG4gICAgZWZmZWN0cy5lbnRlcihtYXJrZXJUeXBlKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdChtYXJrZXJUeXBlKVxuICAgIG1hcmtlciA9IGNvZGUgPT09IDQwID8gNDEgOiBjb2RlXG4gICAgcmV0dXJuIGF0Rmlyc3RUaXRsZUJyZWFrXG4gIH1cblxuICBmdW5jdGlvbiBhdEZpcnN0VGl0bGVCcmVhayhjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG1hcmtlcikge1xuICAgICAgZWZmZWN0cy5lbnRlcihtYXJrZXJUeXBlKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQobWFya2VyVHlwZSlcbiAgICAgIGVmZmVjdHMuZXhpdCh0eXBlKVxuICAgICAgcmV0dXJuIG9rXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcihzdHJpbmdUeXBlKVxuICAgIHJldHVybiBhdFRpdGxlQnJlYWsoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGF0VGl0bGVCcmVhayhjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG1hcmtlcikge1xuICAgICAgZWZmZWN0cy5leGl0KHN0cmluZ1R5cGUpXG4gICAgICByZXR1cm4gYXRGaXJzdFRpdGxlQnJlYWsobWFya2VyKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfSAvLyBOb3RlOiBibGFuayBsaW5lcyBjYW5cdTIwMTl0IGV4aXN0IGluIGNvbnRlbnQuXG5cbiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCdsaW5lRW5kaW5nJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCdsaW5lRW5kaW5nJylcbiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYXRUaXRsZUJyZWFrLCAnbGluZVByZWZpeCcpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignY2h1bmtTdHJpbmcnLCB7XG4gICAgICBjb250ZW50VHlwZTogJ3N0cmluZydcbiAgICB9KVxuICAgIHJldHVybiB0aXRsZShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gdGl0bGUoY29kZSkge1xuICAgIGlmIChjb2RlID09PSBtYXJrZXIgfHwgY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnY2h1bmtTdHJpbmcnKVxuICAgICAgcmV0dXJuIGF0VGl0bGVCcmVhayhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBjb2RlID09PSA5MiA/IHRpdGxlRXNjYXBlIDogdGl0bGVcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpdGxlRXNjYXBlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbWFya2VyIHx8IGNvZGUgPT09IDkyKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB0aXRsZVxuICAgIH1cblxuICAgIHJldHVybiB0aXRsZShjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGl0bGVGYWN0b3J5XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmctb3Itc3BhY2UuanMnKVxudmFyIG5vcm1hbGl6ZUlkZW50aWZpZXIgPSByZXF1aXJlKCcuLi91dGlsL25vcm1hbGl6ZS1pZGVudGlmaWVyLmpzJylcbnZhciBmYWN0b3J5RGVzdGluYXRpb24gPSByZXF1aXJlKCcuL2ZhY3RvcnktZGVzdGluYXRpb24uanMnKVxudmFyIGZhY3RvcnlMYWJlbCA9IHJlcXVpcmUoJy4vZmFjdG9yeS1sYWJlbC5qcycpXG52YXIgZmFjdG9yeVNwYWNlID0gcmVxdWlyZSgnLi9mYWN0b3J5LXNwYWNlLmpzJylcbnZhciBmYWN0b3J5V2hpdGVzcGFjZSA9IHJlcXVpcmUoJy4vZmFjdG9yeS13aGl0ZXNwYWNlLmpzJylcbnZhciBmYWN0b3J5VGl0bGUgPSByZXF1aXJlKCcuL2ZhY3RvcnktdGl0bGUuanMnKVxuXG52YXIgZGVmaW5pdGlvbiA9IHtcbiAgbmFtZTogJ2RlZmluaXRpb24nLFxuICB0b2tlbml6ZTogdG9rZW5pemVEZWZpbml0aW9uXG59XG52YXIgdGl0bGVDb25zdHJ1Y3QgPSB7XG4gIHRva2VuaXplOiB0b2tlbml6ZVRpdGxlLFxuICBwYXJ0aWFsOiB0cnVlXG59XG5cbmZ1bmN0aW9uIHRva2VuaXplRGVmaW5pdGlvbihlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgaWRlbnRpZmllclxuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgZWZmZWN0cy5lbnRlcignZGVmaW5pdGlvbicpXG4gICAgcmV0dXJuIGZhY3RvcnlMYWJlbC5jYWxsKFxuICAgICAgc2VsZixcbiAgICAgIGVmZmVjdHMsXG4gICAgICBsYWJlbEFmdGVyLFxuICAgICAgbm9rLFxuICAgICAgJ2RlZmluaXRpb25MYWJlbCcsXG4gICAgICAnZGVmaW5pdGlvbkxhYmVsTWFya2VyJyxcbiAgICAgICdkZWZpbml0aW9uTGFiZWxTdHJpbmcnXG4gICAgKShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gbGFiZWxBZnRlcihjb2RlKSB7XG4gICAgaWRlbnRpZmllciA9IG5vcm1hbGl6ZUlkZW50aWZpZXIoXG4gICAgICBzZWxmLnNsaWNlU2VyaWFsaXplKHNlbGYuZXZlbnRzW3NlbGYuZXZlbnRzLmxlbmd0aCAtIDFdWzFdKS5zbGljZSgxLCAtMSlcbiAgICApXG5cbiAgICBpZiAoY29kZSA9PT0gNTgpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2RlZmluaXRpb25NYXJrZXInKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2RlZmluaXRpb25NYXJrZXInKSAvLyBOb3RlOiBibGFuayBsaW5lcyBjYW5cdTIwMTl0IGV4aXN0IGluIGNvbnRlbnQuXG5cbiAgICAgIHJldHVybiBmYWN0b3J5V2hpdGVzcGFjZShcbiAgICAgICAgZWZmZWN0cyxcbiAgICAgICAgZmFjdG9yeURlc3RpbmF0aW9uKFxuICAgICAgICAgIGVmZmVjdHMsXG4gICAgICAgICAgZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgICAgICAgdGl0bGVDb25zdHJ1Y3QsXG4gICAgICAgICAgICBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXIsICd3aGl0ZXNwYWNlJyksXG4gICAgICAgICAgICBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXIsICd3aGl0ZXNwYWNlJylcbiAgICAgICAgICApLFxuICAgICAgICAgIG5vayxcbiAgICAgICAgICAnZGVmaW5pdGlvbkRlc3RpbmF0aW9uJyxcbiAgICAgICAgICAnZGVmaW5pdGlvbkRlc3RpbmF0aW9uTGl0ZXJhbCcsXG4gICAgICAgICAgJ2RlZmluaXRpb25EZXN0aW5hdGlvbkxpdGVyYWxNYXJrZXInLFxuICAgICAgICAgICdkZWZpbml0aW9uRGVzdGluYXRpb25SYXcnLFxuICAgICAgICAgICdkZWZpbml0aW9uRGVzdGluYXRpb25TdHJpbmcnXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBhZnRlcihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmV4aXQoJ2RlZmluaXRpb24nKVxuXG4gICAgICBpZiAoc2VsZi5wYXJzZXIuZGVmaW5lZC5pbmRleE9mKGlkZW50aWZpZXIpIDwgMCkge1xuICAgICAgICBzZWxmLnBhcnNlci5kZWZpbmVkLnB1c2goaWRlbnRpZmllcilcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9rKGNvZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplVGl0bGUoZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgcmV0dXJuIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZSlcbiAgICAgID8gZmFjdG9yeVdoaXRlc3BhY2UoZWZmZWN0cywgYmVmb3JlKShjb2RlKVxuICAgICAgOiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGJlZm9yZShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDM0IHx8IGNvZGUgPT09IDM5IHx8IGNvZGUgPT09IDQwKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeVRpdGxlKFxuICAgICAgICBlZmZlY3RzLFxuICAgICAgICBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXIsICd3aGl0ZXNwYWNlJyksXG4gICAgICAgIG5vayxcbiAgICAgICAgJ2RlZmluaXRpb25UaXRsZScsXG4gICAgICAgICdkZWZpbml0aW9uVGl0bGVNYXJrZXInLFxuICAgICAgICAnZGVmaW5pdGlvblRpdGxlU3RyaW5nJ1xuICAgICAgKShjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGFmdGVyKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkgPyBvayhjb2RlKSA6IG5vayhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvblxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgbWFya2Rvd25MaW5lRW5kaW5nID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLmpzJylcblxudmFyIGhhcmRCcmVha0VzY2FwZSA9IHtcbiAgbmFtZTogJ2hhcmRCcmVha0VzY2FwZScsXG4gIHRva2VuaXplOiB0b2tlbml6ZUhhcmRCcmVha0VzY2FwZVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUhhcmRCcmVha0VzY2FwZShlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdoYXJkQnJlYWtFc2NhcGUnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2VzY2FwZU1hcmtlcicpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIG9wZW5cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW4oY29kZSkge1xuICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnZXNjYXBlTWFya2VyJylcbiAgICAgIGVmZmVjdHMuZXhpdCgnaGFyZEJyZWFrRXNjYXBlJylcbiAgICAgIHJldHVybiBvayhjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhcmRCcmVha0VzY2FwZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgbWFya2Rvd25MaW5lRW5kaW5nID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLmpzJylcbnZhciBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLW9yLXNwYWNlLmpzJylcbnZhciBtYXJrZG93blNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLXNwYWNlLmpzJylcbnZhciBjaHVua2VkU3BsaWNlID0gcmVxdWlyZSgnLi4vdXRpbC9jaHVua2VkLXNwbGljZS5qcycpXG52YXIgZmFjdG9yeVNwYWNlID0gcmVxdWlyZSgnLi9mYWN0b3J5LXNwYWNlLmpzJylcblxudmFyIGhlYWRpbmdBdHggPSB7XG4gIG5hbWU6ICdoZWFkaW5nQXR4JyxcbiAgdG9rZW5pemU6IHRva2VuaXplSGVhZGluZ0F0eCxcbiAgcmVzb2x2ZTogcmVzb2x2ZUhlYWRpbmdBdHhcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUhlYWRpbmdBdHgoZXZlbnRzLCBjb250ZXh0KSB7XG4gIHZhciBjb250ZW50RW5kID0gZXZlbnRzLmxlbmd0aCAtIDJcbiAgdmFyIGNvbnRlbnRTdGFydCA9IDNcbiAgdmFyIGNvbnRlbnRcbiAgdmFyIHRleHQgLy8gUHJlZml4IHdoaXRlc3BhY2UsIHBhcnQgb2YgdGhlIG9wZW5pbmcuXG5cbiAgaWYgKGV2ZW50c1tjb250ZW50U3RhcnRdWzFdLnR5cGUgPT09ICd3aGl0ZXNwYWNlJykge1xuICAgIGNvbnRlbnRTdGFydCArPSAyXG4gIH0gLy8gU3VmZml4IHdoaXRlc3BhY2UsIHBhcnQgb2YgdGhlIGNsb3NpbmcuXG5cbiAgaWYgKFxuICAgIGNvbnRlbnRFbmQgLSAyID4gY29udGVudFN0YXJ0ICYmXG4gICAgZXZlbnRzW2NvbnRlbnRFbmRdWzFdLnR5cGUgPT09ICd3aGl0ZXNwYWNlJ1xuICApIHtcbiAgICBjb250ZW50RW5kIC09IDJcbiAgfVxuXG4gIGlmIChcbiAgICBldmVudHNbY29udGVudEVuZF1bMV0udHlwZSA9PT0gJ2F0eEhlYWRpbmdTZXF1ZW5jZScgJiZcbiAgICAoY29udGVudFN0YXJ0ID09PSBjb250ZW50RW5kIC0gMSB8fFxuICAgICAgKGNvbnRlbnRFbmQgLSA0ID4gY29udGVudFN0YXJ0ICYmXG4gICAgICAgIGV2ZW50c1tjb250ZW50RW5kIC0gMl1bMV0udHlwZSA9PT0gJ3doaXRlc3BhY2UnKSlcbiAgKSB7XG4gICAgY29udGVudEVuZCAtPSBjb250ZW50U3RhcnQgKyAxID09PSBjb250ZW50RW5kID8gMiA6IDRcbiAgfVxuXG4gIGlmIChjb250ZW50RW5kID4gY29udGVudFN0YXJ0KSB7XG4gICAgY29udGVudCA9IHtcbiAgICAgIHR5cGU6ICdhdHhIZWFkaW5nVGV4dCcsXG4gICAgICBzdGFydDogZXZlbnRzW2NvbnRlbnRTdGFydF1bMV0uc3RhcnQsXG4gICAgICBlbmQ6IGV2ZW50c1tjb250ZW50RW5kXVsxXS5lbmRcbiAgICB9XG4gICAgdGV4dCA9IHtcbiAgICAgIHR5cGU6ICdjaHVua1RleHQnLFxuICAgICAgc3RhcnQ6IGV2ZW50c1tjb250ZW50U3RhcnRdWzFdLnN0YXJ0LFxuICAgICAgZW5kOiBldmVudHNbY29udGVudEVuZF1bMV0uZW5kLFxuICAgICAgY29udGVudFR5cGU6ICd0ZXh0J1xuICAgIH1cbiAgICBjaHVua2VkU3BsaWNlKGV2ZW50cywgY29udGVudFN0YXJ0LCBjb250ZW50RW5kIC0gY29udGVudFN0YXJ0ICsgMSwgW1xuICAgICAgWydlbnRlcicsIGNvbnRlbnQsIGNvbnRleHRdLFxuICAgICAgWydlbnRlcicsIHRleHQsIGNvbnRleHRdLFxuICAgICAgWydleGl0JywgdGV4dCwgY29udGV4dF0sXG4gICAgICBbJ2V4aXQnLCBjb250ZW50LCBjb250ZXh0XVxuICAgIF0pXG4gIH1cblxuICByZXR1cm4gZXZlbnRzXG59XG5cbmZ1bmN0aW9uIHRva2VuaXplSGVhZGluZ0F0eChlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgc2l6ZSA9IDBcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ2F0eEhlYWRpbmcnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2F0eEhlYWRpbmdTZXF1ZW5jZScpXG4gICAgcmV0dXJuIGZlbmNlT3Blbkluc2lkZShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZmVuY2VPcGVuSW5zaWRlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gMzUgJiYgc2l6ZSsrIDwgNikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gZmVuY2VPcGVuSW5zaWRlXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlKSkge1xuICAgICAgZWZmZWN0cy5leGl0KCdhdHhIZWFkaW5nU2VxdWVuY2UnKVxuICAgICAgcmV0dXJuIHNlbGYuaW50ZXJydXB0ID8gb2soY29kZSkgOiBoZWFkaW5nQnJlYWsoY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBoZWFkaW5nQnJlYWsoY29kZSkge1xuICAgIGlmIChjb2RlID09PSAzNSkge1xuICAgICAgZWZmZWN0cy5lbnRlcignYXR4SGVhZGluZ1NlcXVlbmNlJylcbiAgICAgIHJldHVybiBzZXF1ZW5jZShjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgZWZmZWN0cy5leGl0KCdhdHhIZWFkaW5nJylcbiAgICAgIHJldHVybiBvayhjb2RlKVxuICAgIH1cblxuICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGUpKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGhlYWRpbmdCcmVhaywgJ3doaXRlc3BhY2UnKShjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuZW50ZXIoJ2F0eEhlYWRpbmdUZXh0JylcbiAgICByZXR1cm4gZGF0YShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gc2VxdWVuY2UoY29kZSkge1xuICAgIGlmIChjb2RlID09PSAzNSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gc2VxdWVuY2VcbiAgICB9XG5cbiAgICBlZmZlY3RzLmV4aXQoJ2F0eEhlYWRpbmdTZXF1ZW5jZScpXG4gICAgcmV0dXJuIGhlYWRpbmdCcmVhayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZGF0YShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gMzUgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlKSkge1xuICAgICAgZWZmZWN0cy5leGl0KCdhdHhIZWFkaW5nVGV4dCcpXG4gICAgICByZXR1cm4gaGVhZGluZ0JyZWFrKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhlYWRpbmdBdHhcbiIsICIndXNlIHN0cmljdCdcblxuLy8gVGhpcyBtb2R1bGUgaXMgY29waWVkIGZyb20gPGh0dHBzOi8vc3BlYy5jb21tb25tYXJrLm9yZy8wLjI5LyNodG1sLWJsb2Nrcz4uXG52YXIgYmFzaWNzID0gW1xuICAnYWRkcmVzcycsXG4gICdhcnRpY2xlJyxcbiAgJ2FzaWRlJyxcbiAgJ2Jhc2UnLFxuICAnYmFzZWZvbnQnLFxuICAnYmxvY2txdW90ZScsXG4gICdib2R5JyxcbiAgJ2NhcHRpb24nLFxuICAnY2VudGVyJyxcbiAgJ2NvbCcsXG4gICdjb2xncm91cCcsXG4gICdkZCcsXG4gICdkZXRhaWxzJyxcbiAgJ2RpYWxvZycsXG4gICdkaXInLFxuICAnZGl2JyxcbiAgJ2RsJyxcbiAgJ2R0JyxcbiAgJ2ZpZWxkc2V0JyxcbiAgJ2ZpZ2NhcHRpb24nLFxuICAnZmlndXJlJyxcbiAgJ2Zvb3RlcicsXG4gICdmb3JtJyxcbiAgJ2ZyYW1lJyxcbiAgJ2ZyYW1lc2V0JyxcbiAgJ2gxJyxcbiAgJ2gyJyxcbiAgJ2gzJyxcbiAgJ2g0JyxcbiAgJ2g1JyxcbiAgJ2g2JyxcbiAgJ2hlYWQnLFxuICAnaGVhZGVyJyxcbiAgJ2hyJyxcbiAgJ2h0bWwnLFxuICAnaWZyYW1lJyxcbiAgJ2xlZ2VuZCcsXG4gICdsaScsXG4gICdsaW5rJyxcbiAgJ21haW4nLFxuICAnbWVudScsXG4gICdtZW51aXRlbScsXG4gICduYXYnLFxuICAnbm9mcmFtZXMnLFxuICAnb2wnLFxuICAnb3B0Z3JvdXAnLFxuICAnb3B0aW9uJyxcbiAgJ3AnLFxuICAncGFyYW0nLFxuICAnc2VjdGlvbicsXG4gICdzb3VyY2UnLFxuICAnc3VtbWFyeScsXG4gICd0YWJsZScsXG4gICd0Ym9keScsXG4gICd0ZCcsXG4gICd0Zm9vdCcsXG4gICd0aCcsXG4gICd0aGVhZCcsXG4gICd0aXRsZScsXG4gICd0cicsXG4gICd0cmFjaycsXG4gICd1bCdcbl1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNpY3NcbiIsICIndXNlIHN0cmljdCdcblxuLy8gVGhpcyBtb2R1bGUgaXMgY29waWVkIGZyb20gPGh0dHBzOi8vc3BlYy5jb21tb25tYXJrLm9yZy8wLjI5LyNodG1sLWJsb2Nrcz4uXG52YXIgcmF3cyA9IFsncHJlJywgJ3NjcmlwdCcsICdzdHlsZScsICd0ZXh0YXJlYSddXG5cbm1vZHVsZS5leHBvcnRzID0gcmF3c1xuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgYXNjaWlBbHBoYSA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9hc2NpaS1hbHBoYS5qcycpXG52YXIgYXNjaWlBbHBoYW51bWVyaWMgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvYXNjaWktYWxwaGFudW1lcmljLmpzJylcbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmctb3Itc3BhY2UuanMnKVxudmFyIG1hcmtkb3duU3BhY2UgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tc3BhY2UuanMnKVxudmFyIGZyb21DaGFyQ29kZSA9IHJlcXVpcmUoJy4uL2NvbnN0YW50L2Zyb20tY2hhci1jb2RlLmpzJylcbnZhciBodG1sQmxvY2tOYW1lcyA9IHJlcXVpcmUoJy4uL2NvbnN0YW50L2h0bWwtYmxvY2stbmFtZXMuanMnKVxudmFyIGh0bWxSYXdOYW1lcyA9IHJlcXVpcmUoJy4uL2NvbnN0YW50L2h0bWwtcmF3LW5hbWVzLmpzJylcbnZhciBwYXJ0aWFsQmxhbmtMaW5lID0gcmVxdWlyZSgnLi9wYXJ0aWFsLWJsYW5rLWxpbmUuanMnKVxuXG52YXIgaHRtbEZsb3cgPSB7XG4gIG5hbWU6ICdodG1sRmxvdycsXG4gIHRva2VuaXplOiB0b2tlbml6ZUh0bWxGbG93LFxuICByZXNvbHZlVG86IHJlc29sdmVUb0h0bWxGbG93LFxuICBjb25jcmV0ZTogdHJ1ZVxufVxudmFyIG5leHRCbGFua0NvbnN0cnVjdCA9IHtcbiAgdG9rZW5pemU6IHRva2VuaXplTmV4dEJsYW5rLFxuICBwYXJ0aWFsOiB0cnVlXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUb0h0bWxGbG93KGV2ZW50cykge1xuICB2YXIgaW5kZXggPSBldmVudHMubGVuZ3RoXG5cbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICBpZiAoZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJyAmJiBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdodG1sRmxvdycpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKGluZGV4ID4gMSAmJiBldmVudHNbaW5kZXggLSAyXVsxXS50eXBlID09PSAnbGluZVByZWZpeCcpIHtcbiAgICAvLyBBZGQgdGhlIHByZWZpeCBzdGFydCB0byB0aGUgSFRNTCB0b2tlbi5cbiAgICBldmVudHNbaW5kZXhdWzFdLnN0YXJ0ID0gZXZlbnRzW2luZGV4IC0gMl1bMV0uc3RhcnQgLy8gQWRkIHRoZSBwcmVmaXggc3RhcnQgdG8gdGhlIEhUTUwgbGluZSB0b2tlbi5cblxuICAgIGV2ZW50c1tpbmRleCArIDFdWzFdLnN0YXJ0ID0gZXZlbnRzW2luZGV4IC0gMl1bMV0uc3RhcnQgLy8gUmVtb3ZlIHRoZSBsaW5lIHByZWZpeC5cblxuICAgIGV2ZW50cy5zcGxpY2UoaW5kZXggLSAyLCAyKVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50c1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUh0bWxGbG93KGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBraW5kXG4gIHZhciBzdGFydFRhZ1xuICB2YXIgYnVmZmVyXG4gIHZhciBpbmRleFxuICB2YXIgbWFya2VyXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdodG1sRmxvdycpXG4gICAgZWZmZWN0cy5lbnRlcignaHRtbEZsb3dEYXRhJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gb3BlblxuICB9XG5cbiAgZnVuY3Rpb24gb3Blbihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDMzKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBkZWNsYXJhdGlvblN0YXJ0XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDQ3KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB0YWdDbG9zZVN0YXJ0XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDYzKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGtpbmQgPSAzIC8vIFdoaWxlIHdlXHUyMDE5cmUgaW4gYW4gaW5zdHJ1Y3Rpb24gaW5zdGVhZCBvZiBhIGRlY2xhcmF0aW9uLCB3ZVx1MjAxOXJlIG9uIGEgYD9gXG4gICAgICAvLyByaWdodCBub3csIHNvIHdlIGRvIG5lZWQgdG8gc2VhcmNoIGZvciBgPmAsIHNpbWlsYXIgdG8gZGVjbGFyYXRpb25zLlxuXG4gICAgICByZXR1cm4gc2VsZi5pbnRlcnJ1cHQgPyBvayA6IGNvbnRpbnVhdGlvbkRlY2xhcmF0aW9uSW5zaWRlXG4gICAgfVxuXG4gICAgaWYgKGFzY2lpQWxwaGEoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgYnVmZmVyID0gZnJvbUNoYXJDb2RlKGNvZGUpXG4gICAgICBzdGFydFRhZyA9IHRydWVcbiAgICAgIHJldHVybiB0YWdOYW1lXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZGVjbGFyYXRpb25TdGFydChjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDQ1KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGtpbmQgPSAyXG4gICAgICByZXR1cm4gY29tbWVudE9wZW5JbnNpZGVcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gOTEpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAga2luZCA9IDVcbiAgICAgIGJ1ZmZlciA9ICdDREFUQVsnXG4gICAgICBpbmRleCA9IDBcbiAgICAgIHJldHVybiBjZGF0YU9wZW5JbnNpZGVcbiAgICB9XG5cbiAgICBpZiAoYXNjaWlBbHBoYShjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBraW5kID0gNFxuICAgICAgcmV0dXJuIHNlbGYuaW50ZXJydXB0ID8gb2sgOiBjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbW1lbnRPcGVuSW5zaWRlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNDUpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHNlbGYuaW50ZXJydXB0ID8gb2sgOiBjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNkYXRhT3Blbkluc2lkZShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IGJ1ZmZlci5jaGFyQ29kZUF0KGluZGV4KyspKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBpbmRleCA9PT0gYnVmZmVyLmxlbmd0aFxuICAgICAgICA/IHNlbGYuaW50ZXJydXB0XG4gICAgICAgICAgPyBva1xuICAgICAgICAgIDogY29udGludWF0aW9uXG4gICAgICAgIDogY2RhdGFPcGVuSW5zaWRlXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gdGFnQ2xvc2VTdGFydChjb2RlKSB7XG4gICAgaWYgKGFzY2lpQWxwaGEoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgYnVmZmVyID0gZnJvbUNoYXJDb2RlKGNvZGUpXG4gICAgICByZXR1cm4gdGFnTmFtZVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ05hbWUoY29kZSkge1xuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IG51bGwgfHxcbiAgICAgIGNvZGUgPT09IDQ3IHx8XG4gICAgICBjb2RlID09PSA2MiB8fFxuICAgICAgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlKVxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBjb2RlICE9PSA0NyAmJlxuICAgICAgICBzdGFydFRhZyAmJlxuICAgICAgICBodG1sUmF3TmFtZXMuaW5kZXhPZihidWZmZXIudG9Mb3dlckNhc2UoKSkgPiAtMVxuICAgICAgKSB7XG4gICAgICAgIGtpbmQgPSAxXG4gICAgICAgIHJldHVybiBzZWxmLmludGVycnVwdCA/IG9rKGNvZGUpIDogY29udGludWF0aW9uKGNvZGUpXG4gICAgICB9XG5cbiAgICAgIGlmIChodG1sQmxvY2tOYW1lcy5pbmRleE9mKGJ1ZmZlci50b0xvd2VyQ2FzZSgpKSA+IC0xKSB7XG4gICAgICAgIGtpbmQgPSA2XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDQ3KSB7XG4gICAgICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICAgICAgcmV0dXJuIGJhc2ljU2VsZkNsb3NpbmdcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWxmLmludGVycnVwdCA/IG9rKGNvZGUpIDogY29udGludWF0aW9uKGNvZGUpXG4gICAgICB9XG5cbiAgICAgIGtpbmQgPSA3IC8vIERvIG5vdCBzdXBwb3J0IGNvbXBsZXRlIEhUTUwgd2hlbiBpbnRlcnJ1cHRpbmcuXG5cbiAgICAgIHJldHVybiBzZWxmLmludGVycnVwdFxuICAgICAgICA/IG5vayhjb2RlKVxuICAgICAgICA6IHN0YXJ0VGFnXG4gICAgICAgID8gY29tcGxldGVBdHRyaWJ1dGVOYW1lQmVmb3JlKGNvZGUpXG4gICAgICAgIDogY29tcGxldGVDbG9zaW5nVGFnQWZ0ZXIoY29kZSlcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gNDUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgYnVmZmVyICs9IGZyb21DaGFyQ29kZShjb2RlKVxuICAgICAgcmV0dXJuIHRhZ05hbWVcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBiYXNpY1NlbGZDbG9zaW5nKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNjIpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHNlbGYuaW50ZXJydXB0ID8gb2sgOiBjb250aW51YXRpb25cbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb21wbGV0ZUNsb3NpbmdUYWdBZnRlcihjb2RlKSB7XG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbXBsZXRlQ2xvc2luZ1RhZ0FmdGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBsZXRlRW5kKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVCZWZvcmUoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0Nykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29tcGxldGVFbmRcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gNTggfHwgY29kZSA9PT0gOTUgfHwgYXNjaWlBbHBoYShjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZUJlZm9yZVxuICAgIH1cblxuICAgIHJldHVybiBjb21wbGV0ZUVuZChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29tcGxldGVBdHRyaWJ1dGVOYW1lKGNvZGUpIHtcbiAgICBpZiAoXG4gICAgICBjb2RlID09PSA0NSB8fFxuICAgICAgY29kZSA9PT0gNDYgfHxcbiAgICAgIGNvZGUgPT09IDU4IHx8XG4gICAgICBjb2RlID09PSA5NSB8fFxuICAgICAgYXNjaWlBbHBoYW51bWVyaWMoY29kZSlcbiAgICApIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZVxuICAgIH1cblxuICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVBZnRlcihjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29tcGxldGVBdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA2MSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZUJlZm9yZVxuICAgIH1cblxuICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVBZnRlclxuICAgIH1cblxuICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVCZWZvcmUoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVCZWZvcmUoY29kZSkge1xuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IG51bGwgfHxcbiAgICAgIGNvZGUgPT09IDYwIHx8XG4gICAgICBjb2RlID09PSA2MSB8fFxuICAgICAgY29kZSA9PT0gNjIgfHxcbiAgICAgIGNvZGUgPT09IDk2XG4gICAgKSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDM0IHx8IGNvZGUgPT09IDM5KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIG1hcmtlciA9IGNvZGVcbiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVCZWZvcmVcbiAgICB9XG5cbiAgICBtYXJrZXIgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbWFya2VyKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkQWZ0ZXJcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVF1b3RlZFxuICB9XG5cbiAgZnVuY3Rpb24gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkKGNvZGUpIHtcbiAgICBpZiAoXG4gICAgICBjb2RlID09PSBudWxsIHx8XG4gICAgICBjb2RlID09PSAzNCB8fFxuICAgICAgY29kZSA9PT0gMzkgfHxcbiAgICAgIGNvZGUgPT09IDYwIHx8XG4gICAgICBjb2RlID09PSA2MSB8fFxuICAgICAgY29kZSA9PT0gNjIgfHxcbiAgICAgIGNvZGUgPT09IDk2IHx8XG4gICAgICBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkXG4gIH1cblxuICBmdW5jdGlvbiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkQWZ0ZXIoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0NyB8fCBjb2RlID09PSA2MiB8fCBtYXJrZG93blNwYWNlKGNvZGUpKSB7XG4gICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lQmVmb3JlKGNvZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29tcGxldGVFbmQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA2Mikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29tcGxldGVBZnRlclxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBsZXRlQWZ0ZXIoY29kZSkge1xuICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb21wbGV0ZUFmdGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvZGUgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpXG4gICAgICA/IGNvbnRpbnVhdGlvbihjb2RlKVxuICAgICAgOiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRpbnVhdGlvbihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDQ1ICYmIGtpbmQgPT09IDIpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkNvbW1lbnRJbnNpZGVcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gNjAgJiYga2luZCA9PT0gMSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29udGludWF0aW9uUmF3VGFnT3BlblxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA2MiAmJiBraW5kID09PSA0KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb250aW51YXRpb25DbG9zZVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA2MyAmJiBraW5kID09PSAzKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA5MyAmJiBraW5kID09PSA1KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb250aW51YXRpb25DaGFyYWN0ZXJEYXRhSW5zaWRlXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSAmJiAoa2luZCA9PT0gNiB8fCBraW5kID09PSA3KSkge1xuICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soXG4gICAgICAgIG5leHRCbGFua0NvbnN0cnVjdCxcbiAgICAgICAgY29udGludWF0aW9uQ2xvc2UsXG4gICAgICAgIGNvbnRpbnVhdGlvbkF0TGluZUVuZGluZ1xuICAgICAgKShjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkF0TGluZUVuZGluZyhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBjb250aW51YXRpb25cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRpbnVhdGlvbkF0TGluZUVuZGluZyhjb2RlKSB7XG4gICAgZWZmZWN0cy5leGl0KCdodG1sRmxvd0RhdGEnKVxuICAgIHJldHVybiBodG1sQ29udGludWVTdGFydChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gaHRtbENvbnRpbnVlU3RhcnQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZG9uZShjb2RlKVxuICAgIH1cblxuICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2xpbmVFbmRpbmcnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2xpbmVFbmRpbmcnKVxuICAgICAgcmV0dXJuIGh0bWxDb250aW51ZVN0YXJ0XG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignaHRtbEZsb3dEYXRhJylcbiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb250aW51YXRpb25Db21tZW50SW5zaWRlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNDUpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkRlY2xhcmF0aW9uSW5zaWRlXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29udGludWF0aW9uUmF3VGFnT3Blbihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDQ3KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGJ1ZmZlciA9ICcnXG4gICAgICByZXR1cm4gY29udGludWF0aW9uUmF3RW5kVGFnXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29udGludWF0aW9uUmF3RW5kVGFnKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNjIgJiYgaHRtbFJhd05hbWVzLmluZGV4T2YoYnVmZmVyLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkNsb3NlXG4gICAgfVxuXG4gICAgaWYgKGFzY2lpQWxwaGEoY29kZSkgJiYgYnVmZmVyLmxlbmd0aCA8IDgpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgYnVmZmVyICs9IGZyb21DaGFyQ29kZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvblJhd0VuZFRhZ1xuICAgIH1cblxuICAgIHJldHVybiBjb250aW51YXRpb24oY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRpbnVhdGlvbkNoYXJhY3RlckRhdGFJbnNpZGUoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA5Mykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGVcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDYyKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb250aW51YXRpb25DbG9zZVxuICAgIH1cblxuICAgIHJldHVybiBjb250aW51YXRpb24oY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRpbnVhdGlvbkNsb3NlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnaHRtbEZsb3dEYXRhJylcbiAgICAgIHJldHVybiBkb25lKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbkNsb3NlXG4gIH1cblxuICBmdW5jdGlvbiBkb25lKGNvZGUpIHtcbiAgICBlZmZlY3RzLmV4aXQoJ2h0bWxGbG93JylcbiAgICByZXR1cm4gb2soY29kZSlcbiAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZU5leHRCbGFuayhlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmV4aXQoJ2h0bWxGbG93RGF0YScpXG4gICAgZWZmZWN0cy5lbnRlcignbGluZUVuZGluZ0JsYW5rJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ2xpbmVFbmRpbmdCbGFuaycpXG4gICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChwYXJ0aWFsQmxhbmtMaW5lLCBvaywgbm9rKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaHRtbEZsb3dcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGFzY2lpQWxwaGEgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvYXNjaWktYWxwaGEuanMnKVxudmFyIGFzY2lpQWxwaGFudW1lcmljID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL2FzY2lpLWFscGhhbnVtZXJpYy5qcycpXG52YXIgbWFya2Rvd25MaW5lRW5kaW5nID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLmpzJylcbnZhciBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLW9yLXNwYWNlLmpzJylcbnZhciBtYXJrZG93blNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLXNwYWNlLmpzJylcbnZhciBmYWN0b3J5U3BhY2UgPSByZXF1aXJlKCcuL2ZhY3Rvcnktc3BhY2UuanMnKVxuXG52YXIgaHRtbFRleHQgPSB7XG4gIG5hbWU6ICdodG1sVGV4dCcsXG4gIHRva2VuaXplOiB0b2tlbml6ZUh0bWxUZXh0XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplSHRtbFRleHQoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIG1hcmtlclxuICB2YXIgYnVmZmVyXG4gIHZhciBpbmRleFxuICB2YXIgcmV0dXJuU3RhdGVcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ2h0bWxUZXh0JylcbiAgICBlZmZlY3RzLmVudGVyKCdodG1sVGV4dERhdGEnKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBvcGVuXG4gIH1cblxuICBmdW5jdGlvbiBvcGVuKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gMzMpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uT3BlblxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA0Nykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gdGFnQ2xvc2VTdGFydFxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA2Mykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25cbiAgICB9XG5cbiAgICBpZiAoYXNjaWlBbHBoYShjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gdGFnT3BlblxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY2xhcmF0aW9uT3Blbihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDQ1KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb21tZW50T3BlblxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA5MSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBidWZmZXIgPSAnQ0RBVEFbJ1xuICAgICAgaW5kZXggPSAwXG4gICAgICByZXR1cm4gY2RhdGFPcGVuXG4gICAgfVxuXG4gICAgaWYgKGFzY2lpQWxwaGEoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29tbWVudE9wZW4oY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0NSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29tbWVudFN0YXJ0XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29tbWVudFN0YXJ0KGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSA2Mikge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA0NSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29tbWVudFN0YXJ0RGFzaFxuICAgIH1cblxuICAgIHJldHVybiBjb21tZW50KGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb21tZW50U3RhcnREYXNoKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSA2Mikge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBjb21tZW50KGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb21tZW50KGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA0NSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29tbWVudENsb3NlXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuU3RhdGUgPSBjb21tZW50XG4gICAgICByZXR1cm4gYXRMaW5lRW5kaW5nKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIGNvbW1lbnRcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbW1lbnRDbG9zZShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDQ1KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBlbmRcbiAgICB9XG5cbiAgICByZXR1cm4gY29tbWVudChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY2RhdGFPcGVuKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gYnVmZmVyLmNoYXJDb2RlQXQoaW5kZXgrKykpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGluZGV4ID09PSBidWZmZXIubGVuZ3RoID8gY2RhdGEgOiBjZGF0YU9wZW5cbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjZGF0YShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gOTMpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNkYXRhQ2xvc2VcbiAgICB9XG5cbiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICByZXR1cm5TdGF0ZSA9IGNkYXRhXG4gICAgICByZXR1cm4gYXRMaW5lRW5kaW5nKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIGNkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBjZGF0YUNsb3NlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gOTMpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNkYXRhRW5kXG4gICAgfVxuXG4gICAgcmV0dXJuIGNkYXRhKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjZGF0YUVuZChjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDYyKSB7XG4gICAgICByZXR1cm4gZW5kKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDkzKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjZGF0YUVuZFxuICAgIH1cblxuICAgIHJldHVybiBjZGF0YShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZGVjbGFyYXRpb24oY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IDYyKSB7XG4gICAgICByZXR1cm4gZW5kKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuU3RhdGUgPSBkZWNsYXJhdGlvblxuICAgICAgcmV0dXJuIGF0TGluZUVuZGluZyhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBkZWNsYXJhdGlvblxuICB9XG5cbiAgZnVuY3Rpb24gaW5zdHJ1Y3Rpb24oY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDYzKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBpbnN0cnVjdGlvbkNsb3NlXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuU3RhdGUgPSBpbnN0cnVjdGlvblxuICAgICAgcmV0dXJuIGF0TGluZUVuZGluZyhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBpbnN0cnVjdGlvblxuICB9XG5cbiAgZnVuY3Rpb24gaW5zdHJ1Y3Rpb25DbG9zZShjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPT09IDYyID8gZW5kKGNvZGUpIDogaW5zdHJ1Y3Rpb24oY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ0Nsb3NlU3RhcnQoY29kZSkge1xuICAgIGlmIChhc2NpaUFscGhhKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB0YWdDbG9zZVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ0Nsb3NlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNDUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHRhZ0Nsb3NlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRhZ0Nsb3NlQmV0d2Vlbihjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gdGFnQ2xvc2VCZXR3ZWVuKGNvZGUpIHtcbiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICByZXR1cm5TdGF0ZSA9IHRhZ0Nsb3NlQmV0d2VlblxuICAgICAgcmV0dXJuIGF0TGluZUVuZGluZyhjb2RlKVxuICAgIH1cblxuICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB0YWdDbG9zZUJldHdlZW5cbiAgICB9XG5cbiAgICByZXR1cm4gZW5kKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiB0YWdPcGVuKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNDUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHRhZ09wZW5cbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gNDcgfHwgY29kZSA9PT0gNjIgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlKSkge1xuICAgICAgcmV0dXJuIHRhZ09wZW5CZXR3ZWVuKGNvZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gdGFnT3BlbkJldHdlZW4oY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0Nykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gZW5kXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDU4IHx8IGNvZGUgPT09IDk1IHx8IGFzY2lpQWxwaGEoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuU3RhdGUgPSB0YWdPcGVuQmV0d2VlblxuICAgICAgcmV0dXJuIGF0TGluZUVuZGluZyhjb2RlKVxuICAgIH1cblxuICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB0YWdPcGVuQmV0d2VlblxuICAgIH1cblxuICAgIHJldHVybiBlbmQoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVOYW1lKGNvZGUpIHtcbiAgICBpZiAoXG4gICAgICBjb2RlID09PSA0NSB8fFxuICAgICAgY29kZSA9PT0gNDYgfHxcbiAgICAgIGNvZGUgPT09IDU4IHx8XG4gICAgICBjb2RlID09PSA5NSB8fFxuICAgICAgYXNjaWlBbHBoYW51bWVyaWMoY29kZSlcbiAgICApIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lXG4gICAgfVxuXG4gICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA2MSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlQmVmb3JlXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuU3RhdGUgPSB0YWdPcGVuQXR0cmlidXRlTmFtZUFmdGVyXG4gICAgICByZXR1cm4gYXRMaW5lRW5kaW5nKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXJcbiAgICB9XG5cbiAgICByZXR1cm4gdGFnT3BlbkJldHdlZW4oY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZUJlZm9yZShjb2RlKSB7XG4gICAgaWYgKFxuICAgICAgY29kZSA9PT0gbnVsbCB8fFxuICAgICAgY29kZSA9PT0gNjAgfHxcbiAgICAgIGNvZGUgPT09IDYxIHx8XG4gICAgICBjb2RlID09PSA2MiB8fFxuICAgICAgY29kZSA9PT0gOTZcbiAgICApIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gMzQgfHwgY29kZSA9PT0gMzkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgbWFya2VyID0gY29kZVxuICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZFxuICAgIH1cblxuICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIHJldHVyblN0YXRlID0gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlQmVmb3JlXG4gICAgICByZXR1cm4gYXRMaW5lRW5kaW5nKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZUJlZm9yZVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIG1hcmtlciA9IHVuZGVmaW5lZFxuICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVVbnF1b3RlZFxuICB9XG5cbiAgZnVuY3Rpb24gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlUXVvdGVkKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbWFya2VyKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVRdW90ZWRBZnRlclxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuU3RhdGUgPSB0YWdPcGVuQXR0cmlidXRlVmFsdWVRdW90ZWRcbiAgICAgIHJldHVybiBhdExpbmVFbmRpbmcoY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlUXVvdGVkXG4gIH1cblxuICBmdW5jdGlvbiB0YWdPcGVuQXR0cmlidXRlVmFsdWVRdW90ZWRBZnRlcihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDYyIHx8IGNvZGUgPT09IDQ3IHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZSkpIHtcbiAgICAgIHJldHVybiB0YWdPcGVuQmV0d2Vlbihjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVVucXVvdGVkKGNvZGUpIHtcbiAgICBpZiAoXG4gICAgICBjb2RlID09PSBudWxsIHx8XG4gICAgICBjb2RlID09PSAzNCB8fFxuICAgICAgY29kZSA9PT0gMzkgfHxcbiAgICAgIGNvZGUgPT09IDYwIHx8XG4gICAgICBjb2RlID09PSA2MSB8fFxuICAgICAgY29kZSA9PT0gOTZcbiAgICApIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gNjIgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlKSkge1xuICAgICAgcmV0dXJuIHRhZ09wZW5CZXR3ZWVuKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVVucXVvdGVkXG4gIH0gLy8gV2UgY2FuXHUyMDE5dCBoYXZlIGJsYW5rIGxpbmVzIGluIGNvbnRlbnQsIHNvIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgZW1wdHlcbiAgLy8gdG9rZW5zLlxuXG4gIGZ1bmN0aW9uIGF0TGluZUVuZGluZyhjb2RlKSB7XG4gICAgZWZmZWN0cy5leGl0KCdodG1sVGV4dERhdGEnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2xpbmVFbmRpbmcnKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgnbGluZUVuZGluZycpXG4gICAgcmV0dXJuIGZhY3RvcnlTcGFjZShcbiAgICAgIGVmZmVjdHMsXG4gICAgICBhZnRlclByZWZpeCxcbiAgICAgICdsaW5lUHJlZml4JyxcbiAgICAgIHNlbGYucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluZGV4T2YoJ2NvZGVJbmRlbnRlZCcpID4gLTFcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiA0XG4gICAgKVxuICB9XG5cbiAgZnVuY3Rpb24gYWZ0ZXJQcmVmaXgoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ2h0bWxUZXh0RGF0YScpXG4gICAgcmV0dXJuIHJldHVyblN0YXRlKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBlbmQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA2Mikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2h0bWxUZXh0RGF0YScpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2h0bWxUZXh0JylcbiAgICAgIHJldHVybiBva1xuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGh0bWxUZXh0XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLW9yLXNwYWNlLmpzJylcbnZhciBjaHVua2VkUHVzaCA9IHJlcXVpcmUoJy4uL3V0aWwvY2h1bmtlZC1wdXNoLmpzJylcbnZhciBjaHVua2VkU3BsaWNlID0gcmVxdWlyZSgnLi4vdXRpbC9jaHVua2VkLXNwbGljZS5qcycpXG52YXIgbm9ybWFsaXplSWRlbnRpZmllciA9IHJlcXVpcmUoJy4uL3V0aWwvbm9ybWFsaXplLWlkZW50aWZpZXIuanMnKVxudmFyIHJlc29sdmVBbGwgPSByZXF1aXJlKCcuLi91dGlsL3Jlc29sdmUtYWxsLmpzJylcbnZhciBzaGFsbG93ID0gcmVxdWlyZSgnLi4vdXRpbC9zaGFsbG93LmpzJylcbnZhciBmYWN0b3J5RGVzdGluYXRpb24gPSByZXF1aXJlKCcuL2ZhY3RvcnktZGVzdGluYXRpb24uanMnKVxudmFyIGZhY3RvcnlMYWJlbCA9IHJlcXVpcmUoJy4vZmFjdG9yeS1sYWJlbC5qcycpXG52YXIgZmFjdG9yeVRpdGxlID0gcmVxdWlyZSgnLi9mYWN0b3J5LXRpdGxlLmpzJylcbnZhciBmYWN0b3J5V2hpdGVzcGFjZSA9IHJlcXVpcmUoJy4vZmFjdG9yeS13aGl0ZXNwYWNlLmpzJylcblxudmFyIGxhYmVsRW5kID0ge1xuICBuYW1lOiAnbGFiZWxFbmQnLFxuICB0b2tlbml6ZTogdG9rZW5pemVMYWJlbEVuZCxcbiAgcmVzb2x2ZVRvOiByZXNvbHZlVG9MYWJlbEVuZCxcbiAgcmVzb2x2ZUFsbDogcmVzb2x2ZUFsbExhYmVsRW5kXG59XG52YXIgcmVzb3VyY2VDb25zdHJ1Y3QgPSB7XG4gIHRva2VuaXplOiB0b2tlbml6ZVJlc291cmNlXG59XG52YXIgZnVsbFJlZmVyZW5jZUNvbnN0cnVjdCA9IHtcbiAgdG9rZW5pemU6IHRva2VuaXplRnVsbFJlZmVyZW5jZVxufVxudmFyIGNvbGxhcHNlZFJlZmVyZW5jZUNvbnN0cnVjdCA9IHtcbiAgdG9rZW5pemU6IHRva2VuaXplQ29sbGFwc2VkUmVmZXJlbmNlXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBbGxMYWJlbEVuZChldmVudHMpIHtcbiAgdmFyIGluZGV4ID0gLTFcbiAgdmFyIHRva2VuXG5cbiAgd2hpbGUgKCsraW5kZXggPCBldmVudHMubGVuZ3RoKSB7XG4gICAgdG9rZW4gPSBldmVudHNbaW5kZXhdWzFdXG5cbiAgICBpZiAoXG4gICAgICAhdG9rZW4uX3VzZWQgJiZcbiAgICAgICh0b2tlbi50eXBlID09PSAnbGFiZWxJbWFnZScgfHxcbiAgICAgICAgdG9rZW4udHlwZSA9PT0gJ2xhYmVsTGluaycgfHxcbiAgICAgICAgdG9rZW4udHlwZSA9PT0gJ2xhYmVsRW5kJylcbiAgICApIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgbWFya2VyLlxuICAgICAgZXZlbnRzLnNwbGljZShpbmRleCArIDEsIHRva2VuLnR5cGUgPT09ICdsYWJlbEltYWdlJyA/IDQgOiAyKVxuICAgICAgdG9rZW4udHlwZSA9ICdkYXRhJ1xuICAgICAgaW5kZXgrK1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBldmVudHNcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRvTGFiZWxFbmQoZXZlbnRzLCBjb250ZXh0KSB7XG4gIHZhciBpbmRleCA9IGV2ZW50cy5sZW5ndGhcbiAgdmFyIG9mZnNldCA9IDBcbiAgdmFyIGdyb3VwXG4gIHZhciBsYWJlbFxuICB2YXIgdGV4dFxuICB2YXIgdG9rZW5cbiAgdmFyIG9wZW5cbiAgdmFyIGNsb3NlXG4gIHZhciBtZWRpYSAvLyBGaW5kIGFuIG9wZW5pbmcuXG5cbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICB0b2tlbiA9IGV2ZW50c1tpbmRleF1bMV1cblxuICAgIGlmIChvcGVuKSB7XG4gICAgICAvLyBJZiB3ZSBzZWUgYW5vdGhlciBsaW5rLCBvciBpbmFjdGl2ZSBsaW5rIGxhYmVsLCB3ZVx1MjAxOXZlIGJlZW4gaGVyZSBiZWZvcmUuXG4gICAgICBpZiAoXG4gICAgICAgIHRva2VuLnR5cGUgPT09ICdsaW5rJyB8fFxuICAgICAgICAodG9rZW4udHlwZSA9PT0gJ2xhYmVsTGluaycgJiYgdG9rZW4uX2luYWN0aXZlKVxuICAgICAgKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9IC8vIE1hcmsgb3RoZXIgbGluayBvcGVuaW5ncyBhcyBpbmFjdGl2ZSwgYXMgd2UgY2FuXHUyMDE5dCBoYXZlIGxpbmtzIGluXG4gICAgICAvLyBsaW5rcy5cblxuICAgICAgaWYgKGV2ZW50c1tpbmRleF1bMF0gPT09ICdlbnRlcicgJiYgdG9rZW4udHlwZSA9PT0gJ2xhYmVsTGluaycpIHtcbiAgICAgICAgdG9rZW4uX2luYWN0aXZlID0gdHJ1ZVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2xvc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJyAmJlxuICAgICAgICAodG9rZW4udHlwZSA9PT0gJ2xhYmVsSW1hZ2UnIHx8IHRva2VuLnR5cGUgPT09ICdsYWJlbExpbmsnKSAmJlxuICAgICAgICAhdG9rZW4uX2JhbGFuY2VkXG4gICAgICApIHtcbiAgICAgICAgb3BlbiA9IGluZGV4XG5cbiAgICAgICAgaWYgKHRva2VuLnR5cGUgIT09ICdsYWJlbExpbmsnKSB7XG4gICAgICAgICAgb2Zmc2V0ID0gMlxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRva2VuLnR5cGUgPT09ICdsYWJlbEVuZCcpIHtcbiAgICAgIGNsb3NlID0gaW5kZXhcbiAgICB9XG4gIH1cblxuICBncm91cCA9IHtcbiAgICB0eXBlOiBldmVudHNbb3Blbl1bMV0udHlwZSA9PT0gJ2xhYmVsTGluaycgPyAnbGluaycgOiAnaW1hZ2UnLFxuICAgIHN0YXJ0OiBzaGFsbG93KGV2ZW50c1tvcGVuXVsxXS5zdGFydCksXG4gICAgZW5kOiBzaGFsbG93KGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV1bMV0uZW5kKVxuICB9XG4gIGxhYmVsID0ge1xuICAgIHR5cGU6ICdsYWJlbCcsXG4gICAgc3RhcnQ6IHNoYWxsb3coZXZlbnRzW29wZW5dWzFdLnN0YXJ0KSxcbiAgICBlbmQ6IHNoYWxsb3coZXZlbnRzW2Nsb3NlXVsxXS5lbmQpXG4gIH1cbiAgdGV4dCA9IHtcbiAgICB0eXBlOiAnbGFiZWxUZXh0JyxcbiAgICBzdGFydDogc2hhbGxvdyhldmVudHNbb3BlbiArIG9mZnNldCArIDJdWzFdLmVuZCksXG4gICAgZW5kOiBzaGFsbG93KGV2ZW50c1tjbG9zZSAtIDJdWzFdLnN0YXJ0KVxuICB9XG4gIG1lZGlhID0gW1xuICAgIFsnZW50ZXInLCBncm91cCwgY29udGV4dF0sXG4gICAgWydlbnRlcicsIGxhYmVsLCBjb250ZXh0XVxuICBdIC8vIE9wZW5pbmcgbWFya2VyLlxuXG4gIG1lZGlhID0gY2h1bmtlZFB1c2gobWVkaWEsIGV2ZW50cy5zbGljZShvcGVuICsgMSwgb3BlbiArIG9mZnNldCArIDMpKSAvLyBUZXh0IG9wZW4uXG5cbiAgbWVkaWEgPSBjaHVua2VkUHVzaChtZWRpYSwgW1snZW50ZXInLCB0ZXh0LCBjb250ZXh0XV0pIC8vIEJldHdlZW4uXG5cbiAgbWVkaWEgPSBjaHVua2VkUHVzaChcbiAgICBtZWRpYSxcbiAgICByZXNvbHZlQWxsKFxuICAgICAgY29udGV4dC5wYXJzZXIuY29uc3RydWN0cy5pbnNpZGVTcGFuLm51bGwsXG4gICAgICBldmVudHMuc2xpY2Uob3BlbiArIG9mZnNldCArIDQsIGNsb3NlIC0gMyksXG4gICAgICBjb250ZXh0XG4gICAgKVxuICApIC8vIFRleHQgY2xvc2UsIG1hcmtlciBjbG9zZSwgbGFiZWwgY2xvc2UuXG5cbiAgbWVkaWEgPSBjaHVua2VkUHVzaChtZWRpYSwgW1xuICAgIFsnZXhpdCcsIHRleHQsIGNvbnRleHRdLFxuICAgIGV2ZW50c1tjbG9zZSAtIDJdLFxuICAgIGV2ZW50c1tjbG9zZSAtIDFdLFxuICAgIFsnZXhpdCcsIGxhYmVsLCBjb250ZXh0XVxuICBdKSAvLyBSZWZlcmVuY2UsIHJlc291cmNlLCBvciBzby5cblxuICBtZWRpYSA9IGNodW5rZWRQdXNoKG1lZGlhLCBldmVudHMuc2xpY2UoY2xvc2UgKyAxKSkgLy8gTWVkaWEgY2xvc2UuXG5cbiAgbWVkaWEgPSBjaHVua2VkUHVzaChtZWRpYSwgW1snZXhpdCcsIGdyb3VwLCBjb250ZXh0XV0pXG4gIGNodW5rZWRTcGxpY2UoZXZlbnRzLCBvcGVuLCBldmVudHMubGVuZ3RoLCBtZWRpYSlcbiAgcmV0dXJuIGV2ZW50c1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUxhYmVsRW5kKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBpbmRleCA9IHNlbGYuZXZlbnRzLmxlbmd0aFxuICB2YXIgbGFiZWxTdGFydFxuICB2YXIgZGVmaW5lZCAvLyBGaW5kIGFuIG9wZW5pbmcuXG5cbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICBpZiAoXG4gICAgICAoc2VsZi5ldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdsYWJlbEltYWdlJyB8fFxuICAgICAgICBzZWxmLmV2ZW50c1tpbmRleF1bMV0udHlwZSA9PT0gJ2xhYmVsTGluaycpICYmXG4gICAgICAhc2VsZi5ldmVudHNbaW5kZXhdWzFdLl9iYWxhbmNlZFxuICAgICkge1xuICAgICAgbGFiZWxTdGFydCA9IHNlbGYuZXZlbnRzW2luZGV4XVsxXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgaWYgKCFsYWJlbFN0YXJ0KSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfSAvLyBJdFx1MjAxOXMgYSBiYWxhbmNlZCBicmFja2V0LCBidXQgY29udGFpbnMgYSBsaW5rLlxuXG4gICAgaWYgKGxhYmVsU3RhcnQuX2luYWN0aXZlKSByZXR1cm4gYmFsYW5jZWQoY29kZSlcbiAgICBkZWZpbmVkID1cbiAgICAgIHNlbGYucGFyc2VyLmRlZmluZWQuaW5kZXhPZihcbiAgICAgICAgbm9ybWFsaXplSWRlbnRpZmllcihcbiAgICAgICAgICBzZWxmLnNsaWNlU2VyaWFsaXplKHtcbiAgICAgICAgICAgIHN0YXJ0OiBsYWJlbFN0YXJ0LmVuZCxcbiAgICAgICAgICAgIGVuZDogc2VsZi5ub3coKVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICkgPiAtMVxuICAgIGVmZmVjdHMuZW50ZXIoJ2xhYmVsRW5kJylcbiAgICBlZmZlY3RzLmVudGVyKCdsYWJlbE1hcmtlcicpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgZWZmZWN0cy5leGl0KCdsYWJlbE1hcmtlcicpXG4gICAgZWZmZWN0cy5leGl0KCdsYWJlbEVuZCcpXG4gICAgcmV0dXJuIGFmdGVyTGFiZWxFbmRcbiAgfVxuXG4gIGZ1bmN0aW9uIGFmdGVyTGFiZWxFbmQoY29kZSkge1xuICAgIC8vIFJlc291cmNlOiBgW2FzZF0oZmdoKWAuXG4gICAgaWYgKGNvZGUgPT09IDQwKSB7XG4gICAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgICByZXNvdXJjZUNvbnN0cnVjdCxcbiAgICAgICAgb2ssXG4gICAgICAgIGRlZmluZWQgPyBvayA6IGJhbGFuY2VkXG4gICAgICApKGNvZGUpXG4gICAgfSAvLyBDb2xsYXBzZWQgKGBbYXNkXVtdYCkgb3IgZnVsbCAoYFthc2RdW2ZnaF1gKSByZWZlcmVuY2U/XG5cbiAgICBpZiAoY29kZSA9PT0gOTEpIHtcbiAgICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoXG4gICAgICAgIGZ1bGxSZWZlcmVuY2VDb25zdHJ1Y3QsXG4gICAgICAgIG9rLFxuICAgICAgICBkZWZpbmVkXG4gICAgICAgICAgPyBlZmZlY3RzLmF0dGVtcHQoY29sbGFwc2VkUmVmZXJlbmNlQ29uc3RydWN0LCBvaywgYmFsYW5jZWQpXG4gICAgICAgICAgOiBiYWxhbmNlZFxuICAgICAgKShjb2RlKVxuICAgIH0gLy8gU2hvcnRjdXQgcmVmZXJlbmNlOiBgW2FzZF1gP1xuXG4gICAgcmV0dXJuIGRlZmluZWQgPyBvayhjb2RlKSA6IGJhbGFuY2VkKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBiYWxhbmNlZChjb2RlKSB7XG4gICAgbGFiZWxTdGFydC5fYmFsYW5jZWQgPSB0cnVlXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplUmVzb3VyY2UoZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgZWZmZWN0cy5lbnRlcigncmVzb3VyY2UnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ3Jlc291cmNlTWFya2VyJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ3Jlc291cmNlTWFya2VyJylcbiAgICByZXR1cm4gZmFjdG9yeVdoaXRlc3BhY2UoZWZmZWN0cywgb3BlbilcbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW4oY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0MSkge1xuICAgICAgcmV0dXJuIGVuZChjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBmYWN0b3J5RGVzdGluYXRpb24oXG4gICAgICBlZmZlY3RzLFxuICAgICAgZGVzdGluYXRpb25BZnRlcixcbiAgICAgIG5vayxcbiAgICAgICdyZXNvdXJjZURlc3RpbmF0aW9uJyxcbiAgICAgICdyZXNvdXJjZURlc3RpbmF0aW9uTGl0ZXJhbCcsXG4gICAgICAncmVzb3VyY2VEZXN0aW5hdGlvbkxpdGVyYWxNYXJrZXInLFxuICAgICAgJ3Jlc291cmNlRGVzdGluYXRpb25SYXcnLFxuICAgICAgJ3Jlc291cmNlRGVzdGluYXRpb25TdHJpbmcnLFxuICAgICAgM1xuICAgICkoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3RpbmF0aW9uQWZ0ZXIoY29kZSkge1xuICAgIHJldHVybiBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGUpXG4gICAgICA/IGZhY3RvcnlXaGl0ZXNwYWNlKGVmZmVjdHMsIGJldHdlZW4pKGNvZGUpXG4gICAgICA6IGVuZChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYmV0d2Vlbihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDM0IHx8IGNvZGUgPT09IDM5IHx8IGNvZGUgPT09IDQwKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeVRpdGxlKFxuICAgICAgICBlZmZlY3RzLFxuICAgICAgICBmYWN0b3J5V2hpdGVzcGFjZShlZmZlY3RzLCBlbmQpLFxuICAgICAgICBub2ssXG4gICAgICAgICdyZXNvdXJjZVRpdGxlJyxcbiAgICAgICAgJ3Jlc291cmNlVGl0bGVNYXJrZXInLFxuICAgICAgICAncmVzb3VyY2VUaXRsZVN0cmluZydcbiAgICAgICkoY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gZW5kKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBlbmQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0MSkge1xuICAgICAgZWZmZWN0cy5lbnRlcigncmVzb3VyY2VNYXJrZXInKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ3Jlc291cmNlTWFya2VyJylcbiAgICAgIGVmZmVjdHMuZXhpdCgncmVzb3VyY2UnKVxuICAgICAgcmV0dXJuIG9rXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplRnVsbFJlZmVyZW5jZShlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgcmV0dXJuIGZhY3RvcnlMYWJlbC5jYWxsKFxuICAgICAgc2VsZixcbiAgICAgIGVmZmVjdHMsXG4gICAgICBhZnRlckxhYmVsLFxuICAgICAgbm9rLFxuICAgICAgJ3JlZmVyZW5jZScsXG4gICAgICAncmVmZXJlbmNlTWFya2VyJyxcbiAgICAgICdyZWZlcmVuY2VTdHJpbmcnXG4gICAgKShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYWZ0ZXJMYWJlbChjb2RlKSB7XG4gICAgcmV0dXJuIHNlbGYucGFyc2VyLmRlZmluZWQuaW5kZXhPZihcbiAgICAgIG5vcm1hbGl6ZUlkZW50aWZpZXIoXG4gICAgICAgIHNlbGYuc2xpY2VTZXJpYWxpemUoc2VsZi5ldmVudHNbc2VsZi5ldmVudHMubGVuZ3RoIC0gMV1bMV0pLnNsaWNlKDEsIC0xKVxuICAgICAgKVxuICAgICkgPCAwXG4gICAgICA/IG5vayhjb2RlKVxuICAgICAgOiBvayhjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplQ29sbGFwc2VkUmVmZXJlbmNlKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ3JlZmVyZW5jZScpXG4gICAgZWZmZWN0cy5lbnRlcigncmVmZXJlbmNlTWFya2VyJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ3JlZmVyZW5jZU1hcmtlcicpXG4gICAgcmV0dXJuIG9wZW5cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW4oY29kZSkge1xuICAgIGlmIChjb2RlID09PSA5Mykge1xuICAgICAgZWZmZWN0cy5lbnRlcigncmVmZXJlbmNlTWFya2VyJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCdyZWZlcmVuY2VNYXJrZXInKVxuICAgICAgZWZmZWN0cy5leGl0KCdyZWZlcmVuY2UnKVxuICAgICAgcmV0dXJuIG9rXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGFiZWxFbmRcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGxhYmVsRW5kID0gcmVxdWlyZSgnLi9sYWJlbC1lbmQuanMnKVxuXG52YXIgbGFiZWxTdGFydEltYWdlID0ge1xuICBuYW1lOiAnbGFiZWxTdGFydEltYWdlJyxcbiAgdG9rZW5pemU6IHRva2VuaXplTGFiZWxTdGFydEltYWdlLFxuICByZXNvbHZlQWxsOiBsYWJlbEVuZC5yZXNvbHZlQWxsXG59XG5cbmZ1bmN0aW9uIHRva2VuaXplTGFiZWxTdGFydEltYWdlKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdsYWJlbEltYWdlJylcbiAgICBlZmZlY3RzLmVudGVyKCdsYWJlbEltYWdlTWFya2VyJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ2xhYmVsSW1hZ2VNYXJrZXInKVxuICAgIHJldHVybiBvcGVuXG4gIH1cblxuICBmdW5jdGlvbiBvcGVuKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gOTEpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2xhYmVsTWFya2VyJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCdsYWJlbE1hcmtlcicpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2xhYmVsSW1hZ2UnKVxuICAgICAgcmV0dXJuIGFmdGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYWZ0ZXIoY29kZSkge1xuICAgIC8qIGM4IGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIGNvZGUgPT09IDk0ICYmXG4gICAgICAvKiBjOCBpZ25vcmUgbmV4dCAqL1xuICAgICAgJ19oaWRkZW5Gb290bm90ZVN1cHBvcnQnIGluIHNlbGYucGFyc2VyLmNvbnN0cnVjdHNcbiAgICAgID8gLyogYzggaWdub3JlIG5leHQgKi9cbiAgICAgICAgbm9rKGNvZGUpXG4gICAgICA6IG9rKGNvZGUpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsYWJlbFN0YXJ0SW1hZ2VcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGxhYmVsRW5kID0gcmVxdWlyZSgnLi9sYWJlbC1lbmQuanMnKVxuXG52YXIgbGFiZWxTdGFydExpbmsgPSB7XG4gIG5hbWU6ICdsYWJlbFN0YXJ0TGluaycsXG4gIHRva2VuaXplOiB0b2tlbml6ZUxhYmVsU3RhcnRMaW5rLFxuICByZXNvbHZlQWxsOiBsYWJlbEVuZC5yZXNvbHZlQWxsXG59XG5cbmZ1bmN0aW9uIHRva2VuaXplTGFiZWxTdGFydExpbmsoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ2xhYmVsTGluaycpXG4gICAgZWZmZWN0cy5lbnRlcignbGFiZWxNYXJrZXInKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgnbGFiZWxNYXJrZXInKVxuICAgIGVmZmVjdHMuZXhpdCgnbGFiZWxMaW5rJylcbiAgICByZXR1cm4gYWZ0ZXJcbiAgfVxuXG4gIGZ1bmN0aW9uIGFmdGVyKGNvZGUpIHtcbiAgICAvKiBjOCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiBjb2RlID09PSA5NCAmJlxuICAgICAgLyogYzggaWdub3JlIG5leHQgKi9cbiAgICAgICdfaGlkZGVuRm9vdG5vdGVTdXBwb3J0JyBpbiBzZWxmLnBhcnNlci5jb25zdHJ1Y3RzXG4gICAgICA/IC8qIGM4IGlnbm9yZSBuZXh0ICovXG4gICAgICAgIG5vayhjb2RlKVxuICAgICAgOiBvayhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGFiZWxTdGFydExpbmtcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGZhY3RvcnlTcGFjZSA9IHJlcXVpcmUoJy4vZmFjdG9yeS1zcGFjZS5qcycpXG5cbnZhciBsaW5lRW5kaW5nID0ge1xuICBuYW1lOiAnbGluZUVuZGluZycsXG4gIHRva2VuaXplOiB0b2tlbml6ZUxpbmVFbmRpbmdcbn1cblxuZnVuY3Rpb24gdG9rZW5pemVMaW5lRW5kaW5nKGVmZmVjdHMsIG9rKSB7XG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdsaW5lRW5kaW5nJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ2xpbmVFbmRpbmcnKVxuICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgb2ssICdsaW5lUHJlZml4JylcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpbmVFbmRpbmdcbiIsICIndXNlIHN0cmljdCdcblxudmFyIG1hcmtkb3duTGluZUVuZGluZyA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9tYXJrZG93bi1saW5lLWVuZGluZy5qcycpXG52YXIgbWFya2Rvd25TcGFjZSA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9tYXJrZG93bi1zcGFjZS5qcycpXG52YXIgZmFjdG9yeVNwYWNlID0gcmVxdWlyZSgnLi9mYWN0b3J5LXNwYWNlLmpzJylcblxudmFyIHRoZW1hdGljQnJlYWsgPSB7XG4gIG5hbWU6ICd0aGVtYXRpY0JyZWFrJyxcbiAgdG9rZW5pemU6IHRva2VuaXplVGhlbWF0aWNCcmVha1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZVRoZW1hdGljQnJlYWsoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2l6ZSA9IDBcbiAgdmFyIG1hcmtlclxuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgZWZmZWN0cy5lbnRlcigndGhlbWF0aWNCcmVhaycpXG4gICAgbWFya2VyID0gY29kZVxuICAgIHJldHVybiBhdEJyZWFrKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBhdEJyZWFrKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbWFya2VyKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd0aGVtYXRpY0JyZWFrU2VxdWVuY2UnKVxuICAgICAgcmV0dXJuIHNlcXVlbmNlKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYXRCcmVhaywgJ3doaXRlc3BhY2UnKShjb2RlKVxuICAgIH1cblxuICAgIGlmIChzaXplIDwgMyB8fCAoY29kZSAhPT0gbnVsbCAmJiAhbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuZXhpdCgndGhlbWF0aWNCcmVhaycpXG4gICAgcmV0dXJuIG9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBzZXF1ZW5jZShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG1hcmtlcikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBzaXplKytcbiAgICAgIHJldHVybiBzZXF1ZW5jZVxuICAgIH1cblxuICAgIGVmZmVjdHMuZXhpdCgndGhlbWF0aWNCcmVha1NlcXVlbmNlJylcbiAgICByZXR1cm4gYXRCcmVhayhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGhlbWF0aWNCcmVha1xuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgYXNjaWlEaWdpdCA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9hc2NpaS1kaWdpdC5qcycpXG52YXIgbWFya2Rvd25TcGFjZSA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9tYXJrZG93bi1zcGFjZS5qcycpXG52YXIgcHJlZml4U2l6ZSA9IHJlcXVpcmUoJy4uL3V0aWwvcHJlZml4LXNpemUuanMnKVxudmFyIHNpemVDaHVua3MgPSByZXF1aXJlKCcuLi91dGlsL3NpemUtY2h1bmtzLmpzJylcbnZhciBmYWN0b3J5U3BhY2UgPSByZXF1aXJlKCcuL2ZhY3Rvcnktc3BhY2UuanMnKVxudmFyIHBhcnRpYWxCbGFua0xpbmUgPSByZXF1aXJlKCcuL3BhcnRpYWwtYmxhbmstbGluZS5qcycpXG52YXIgdGhlbWF0aWNCcmVhayA9IHJlcXVpcmUoJy4vdGhlbWF0aWMtYnJlYWsuanMnKVxuXG52YXIgbGlzdCA9IHtcbiAgbmFtZTogJ2xpc3QnLFxuICB0b2tlbml6ZTogdG9rZW5pemVMaXN0U3RhcnQsXG4gIGNvbnRpbnVhdGlvbjoge1xuICAgIHRva2VuaXplOiB0b2tlbml6ZUxpc3RDb250aW51YXRpb25cbiAgfSxcbiAgZXhpdDogdG9rZW5pemVMaXN0RW5kXG59XG52YXIgbGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlQ29uc3RydWN0ID0ge1xuICB0b2tlbml6ZTogdG9rZW5pemVMaXN0SXRlbVByZWZpeFdoaXRlc3BhY2UsXG4gIHBhcnRpYWw6IHRydWVcbn1cbnZhciBpbmRlbnRDb25zdHJ1Y3QgPSB7XG4gIHRva2VuaXplOiB0b2tlbml6ZUluZGVudCxcbiAgcGFydGlhbDogdHJ1ZVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUxpc3RTdGFydChlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgaW5pdGlhbFNpemUgPSBwcmVmaXhTaXplKHNlbGYuZXZlbnRzLCAnbGluZVByZWZpeCcpXG4gIHZhciBzaXplID0gMFxuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgdmFyIGtpbmQgPVxuICAgICAgc2VsZi5jb250YWluZXJTdGF0ZS50eXBlIHx8XG4gICAgICAoY29kZSA9PT0gNDIgfHwgY29kZSA9PT0gNDMgfHwgY29kZSA9PT0gNDVcbiAgICAgICAgPyAnbGlzdFVub3JkZXJlZCdcbiAgICAgICAgOiAnbGlzdE9yZGVyZWQnKVxuXG4gICAgaWYgKFxuICAgICAga2luZCA9PT0gJ2xpc3RVbm9yZGVyZWQnXG4gICAgICAgID8gIXNlbGYuY29udGFpbmVyU3RhdGUubWFya2VyIHx8IGNvZGUgPT09IHNlbGYuY29udGFpbmVyU3RhdGUubWFya2VyXG4gICAgICAgIDogYXNjaWlEaWdpdChjb2RlKVxuICAgICkge1xuICAgICAgaWYgKCFzZWxmLmNvbnRhaW5lclN0YXRlLnR5cGUpIHtcbiAgICAgICAgc2VsZi5jb250YWluZXJTdGF0ZS50eXBlID0ga2luZFxuICAgICAgICBlZmZlY3RzLmVudGVyKGtpbmQsIHtcbiAgICAgICAgICBfY29udGFpbmVyOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChraW5kID09PSAnbGlzdFVub3JkZXJlZCcpIHtcbiAgICAgICAgZWZmZWN0cy5lbnRlcignbGlzdEl0ZW1QcmVmaXgnKVxuICAgICAgICByZXR1cm4gY29kZSA9PT0gNDIgfHwgY29kZSA9PT0gNDVcbiAgICAgICAgICA/IGVmZmVjdHMuY2hlY2sodGhlbWF0aWNCcmVhaywgbm9rLCBhdE1hcmtlcikoY29kZSlcbiAgICAgICAgICA6IGF0TWFya2VyKGNvZGUpXG4gICAgICB9XG5cbiAgICAgIGlmICghc2VsZi5pbnRlcnJ1cHQgfHwgY29kZSA9PT0gNDkpIHtcbiAgICAgICAgZWZmZWN0cy5lbnRlcignbGlzdEl0ZW1QcmVmaXgnKVxuICAgICAgICBlZmZlY3RzLmVudGVyKCdsaXN0SXRlbVZhbHVlJylcbiAgICAgICAgcmV0dXJuIGluc2lkZShjb2RlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2lkZShjb2RlKSB7XG4gICAgaWYgKGFzY2lpRGlnaXQoY29kZSkgJiYgKytzaXplIDwgMTApIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGluc2lkZVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgICghc2VsZi5pbnRlcnJ1cHQgfHwgc2l6ZSA8IDIpICYmXG4gICAgICAoc2VsZi5jb250YWluZXJTdGF0ZS5tYXJrZXJcbiAgICAgICAgPyBjb2RlID09PSBzZWxmLmNvbnRhaW5lclN0YXRlLm1hcmtlclxuICAgICAgICA6IGNvZGUgPT09IDQxIHx8IGNvZGUgPT09IDQ2KVxuICAgICkge1xuICAgICAgZWZmZWN0cy5leGl0KCdsaXN0SXRlbVZhbHVlJylcbiAgICAgIHJldHVybiBhdE1hcmtlcihjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGF0TWFya2VyKGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdsaXN0SXRlbU1hcmtlcicpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgZWZmZWN0cy5leGl0KCdsaXN0SXRlbU1hcmtlcicpXG4gICAgc2VsZi5jb250YWluZXJTdGF0ZS5tYXJrZXIgPSBzZWxmLmNvbnRhaW5lclN0YXRlLm1hcmtlciB8fCBjb2RlXG4gICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soXG4gICAgICBwYXJ0aWFsQmxhbmtMaW5lLCAvLyBDYW5cdTIwMTl0IGJlIGVtcHR5IHdoZW4gaW50ZXJydXB0aW5nLlxuICAgICAgc2VsZi5pbnRlcnJ1cHQgPyBub2sgOiBvbkJsYW5rLFxuICAgICAgZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgICBsaXN0SXRlbVByZWZpeFdoaXRlc3BhY2VDb25zdHJ1Y3QsXG4gICAgICAgIGVuZE9mUHJlZml4LFxuICAgICAgICBvdGhlclByZWZpeFxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQmxhbmsoY29kZSkge1xuICAgIHNlbGYuY29udGFpbmVyU3RhdGUuaW5pdGlhbEJsYW5rTGluZSA9IHRydWVcbiAgICBpbml0aWFsU2l6ZSsrXG4gICAgcmV0dXJuIGVuZE9mUHJlZml4KGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBvdGhlclByZWZpeChjb2RlKSB7XG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2xpc3RJdGVtUHJlZml4V2hpdGVzcGFjZScpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgnbGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlJylcbiAgICAgIHJldHVybiBlbmRPZlByZWZpeFxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZE9mUHJlZml4KGNvZGUpIHtcbiAgICBzZWxmLmNvbnRhaW5lclN0YXRlLnNpemUgPVxuICAgICAgaW5pdGlhbFNpemUgKyBzaXplQ2h1bmtzKHNlbGYuc2xpY2VTdHJlYW0oZWZmZWN0cy5leGl0KCdsaXN0SXRlbVByZWZpeCcpKSlcbiAgICByZXR1cm4gb2soY29kZSlcbiAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUxpc3RDb250aW51YXRpb24oZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgc2VsZi5jb250YWluZXJTdGF0ZS5fY2xvc2VGbG93ID0gdW5kZWZpbmVkXG4gIHJldHVybiBlZmZlY3RzLmNoZWNrKHBhcnRpYWxCbGFua0xpbmUsIG9uQmxhbmssIG5vdEJsYW5rKVxuXG4gIGZ1bmN0aW9uIG9uQmxhbmsoY29kZSkge1xuICAgIHNlbGYuY29udGFpbmVyU3RhdGUuZnVydGhlckJsYW5rTGluZXMgPVxuICAgICAgc2VsZi5jb250YWluZXJTdGF0ZS5mdXJ0aGVyQmxhbmtMaW5lcyB8fFxuICAgICAgc2VsZi5jb250YWluZXJTdGF0ZS5pbml0aWFsQmxhbmtMaW5lIC8vIFdlIGhhdmUgYSBibGFuayBsaW5lLlxuICAgIC8vIFN0aWxsLCB0cnkgdG8gY29uc3VtZSBhdCBtb3N0IHRoZSBpdGVtcyBzaXplLlxuXG4gICAgcmV0dXJuIGZhY3RvcnlTcGFjZShcbiAgICAgIGVmZmVjdHMsXG4gICAgICBvayxcbiAgICAgICdsaXN0SXRlbUluZGVudCcsXG4gICAgICBzZWxmLmNvbnRhaW5lclN0YXRlLnNpemUgKyAxXG4gICAgKShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gbm90QmxhbmsoY29kZSkge1xuICAgIGlmIChzZWxmLmNvbnRhaW5lclN0YXRlLmZ1cnRoZXJCbGFua0xpbmVzIHx8ICFtYXJrZG93blNwYWNlKGNvZGUpKSB7XG4gICAgICBzZWxmLmNvbnRhaW5lclN0YXRlLmZ1cnRoZXJCbGFua0xpbmVzID0gc2VsZi5jb250YWluZXJTdGF0ZS5pbml0aWFsQmxhbmtMaW5lID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm4gbm90SW5DdXJyZW50SXRlbShjb2RlKVxuICAgIH1cblxuICAgIHNlbGYuY29udGFpbmVyU3RhdGUuZnVydGhlckJsYW5rTGluZXMgPSBzZWxmLmNvbnRhaW5lclN0YXRlLmluaXRpYWxCbGFua0xpbmUgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KGluZGVudENvbnN0cnVjdCwgb2ssIG5vdEluQ3VycmVudEl0ZW0pKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBub3RJbkN1cnJlbnRJdGVtKGNvZGUpIHtcbiAgICAvLyBXaGlsZSB3ZSBkbyBjb250aW51ZSwgd2Ugc2lnbmFsIHRoYXQgdGhlIGZsb3cgc2hvdWxkIGJlIGNsb3NlZC5cbiAgICBzZWxmLmNvbnRhaW5lclN0YXRlLl9jbG9zZUZsb3cgPSB0cnVlIC8vIEFzIHdlXHUyMDE5cmUgY2xvc2luZyBmbG93LCB3ZVx1MjAxOXJlIG5vIGxvbmdlciBpbnRlcnJ1cHRpbmcuXG5cbiAgICBzZWxmLmludGVycnVwdCA9IHVuZGVmaW5lZFxuICAgIHJldHVybiBmYWN0b3J5U3BhY2UoXG4gICAgICBlZmZlY3RzLFxuICAgICAgZWZmZWN0cy5hdHRlbXB0KGxpc3QsIG9rLCBub2spLFxuICAgICAgJ2xpbmVQcmVmaXgnLFxuICAgICAgc2VsZi5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5kZXhPZignY29kZUluZGVudGVkJykgPiAtMVxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IDRcbiAgICApKGNvZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5pemVJbmRlbnQoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgcmV0dXJuIGZhY3RvcnlTcGFjZShcbiAgICBlZmZlY3RzLFxuICAgIGFmdGVyUHJlZml4LFxuICAgICdsaXN0SXRlbUluZGVudCcsXG4gICAgc2VsZi5jb250YWluZXJTdGF0ZS5zaXplICsgMVxuICApXG5cbiAgZnVuY3Rpb24gYWZ0ZXJQcmVmaXgoY29kZSkge1xuICAgIHJldHVybiBwcmVmaXhTaXplKHNlbGYuZXZlbnRzLCAnbGlzdEl0ZW1JbmRlbnQnKSA9PT1cbiAgICAgIHNlbGYuY29udGFpbmVyU3RhdGUuc2l6ZVxuICAgICAgPyBvayhjb2RlKVxuICAgICAgOiBub2soY29kZSlcbiAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUxpc3RFbmQoZWZmZWN0cykge1xuICBlZmZlY3RzLmV4aXQodGhpcy5jb250YWluZXJTdGF0ZS50eXBlKVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZShlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICByZXR1cm4gZmFjdG9yeVNwYWNlKFxuICAgIGVmZmVjdHMsXG4gICAgYWZ0ZXJQcmVmaXgsXG4gICAgJ2xpc3RJdGVtUHJlZml4V2hpdGVzcGFjZScsXG4gICAgc2VsZi5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5kZXhPZignY29kZUluZGVudGVkJykgPiAtMVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogNCArIDFcbiAgKVxuXG4gIGZ1bmN0aW9uIGFmdGVyUHJlZml4KGNvZGUpIHtcbiAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlKSB8fFxuICAgICAgIXByZWZpeFNpemUoc2VsZi5ldmVudHMsICdsaXN0SXRlbVByZWZpeFdoaXRlc3BhY2UnKVxuICAgICAgPyBub2soY29kZSlcbiAgICAgIDogb2soY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RcbiIsICIndXNlIHN0cmljdCdcblxudmFyIG1hcmtkb3duTGluZUVuZGluZyA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9tYXJrZG93bi1saW5lLWVuZGluZy5qcycpXG52YXIgc2hhbGxvdyA9IHJlcXVpcmUoJy4uL3V0aWwvc2hhbGxvdy5qcycpXG52YXIgZmFjdG9yeVNwYWNlID0gcmVxdWlyZSgnLi9mYWN0b3J5LXNwYWNlLmpzJylcblxudmFyIHNldGV4dFVuZGVybGluZSA9IHtcbiAgbmFtZTogJ3NldGV4dFVuZGVybGluZScsXG4gIHRva2VuaXplOiB0b2tlbml6ZVNldGV4dFVuZGVybGluZSxcbiAgcmVzb2x2ZVRvOiByZXNvbHZlVG9TZXRleHRVbmRlcmxpbmVcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRvU2V0ZXh0VW5kZXJsaW5lKGV2ZW50cywgY29udGV4dCkge1xuICB2YXIgaW5kZXggPSBldmVudHMubGVuZ3RoXG4gIHZhciBjb250ZW50XG4gIHZhciB0ZXh0XG4gIHZhciBkZWZpbml0aW9uXG4gIHZhciBoZWFkaW5nIC8vIEZpbmQgdGhlIG9wZW5pbmcgb2YgdGhlIGNvbnRlbnQuXG4gIC8vIEl0XHUyMDE5bGwgYWx3YXlzIGV4aXN0OiB3ZSBkb25cdTIwMTl0IHRva2VuaXplIGlmIGl0IGlzblx1MjAxOXQgdGhlcmUuXG5cbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICBpZiAoZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJykge1xuICAgICAgaWYgKGV2ZW50c1tpbmRleF1bMV0udHlwZSA9PT0gJ2NvbnRlbnQnKSB7XG4gICAgICAgIGNvbnRlbnQgPSBpbmRleFxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRzW2luZGV4XVsxXS50eXBlID09PSAncGFyYWdyYXBoJykge1xuICAgICAgICB0ZXh0ID0gaW5kZXhcbiAgICAgIH1cbiAgICB9IC8vIEV4aXRcbiAgICBlbHNlIHtcbiAgICAgIGlmIChldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdjb250ZW50Jykge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIGNvbnRlbnQgZW5kIChpZiBuZWVkZWQgd2VcdTIwMTlsbCBhZGQgaXQgbGF0ZXIpXG4gICAgICAgIGV2ZW50cy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICB9XG5cbiAgICAgIGlmICghZGVmaW5pdGlvbiAmJiBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdkZWZpbml0aW9uJykge1xuICAgICAgICBkZWZpbml0aW9uID0gaW5kZXhcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoZWFkaW5nID0ge1xuICAgIHR5cGU6ICdzZXRleHRIZWFkaW5nJyxcbiAgICBzdGFydDogc2hhbGxvdyhldmVudHNbdGV4dF1bMV0uc3RhcnQpLFxuICAgIGVuZDogc2hhbGxvdyhldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLmVuZClcbiAgfSAvLyBDaGFuZ2UgdGhlIHBhcmFncmFwaCB0byBzZXRleHQgaGVhZGluZyB0ZXh0LlxuXG4gIGV2ZW50c1t0ZXh0XVsxXS50eXBlID0gJ3NldGV4dEhlYWRpbmdUZXh0JyAvLyBJZiB3ZSBoYXZlIGRlZmluaXRpb25zIGluIHRoZSBjb250ZW50LCB3ZVx1MjAxOWxsIGtlZXAgb24gaGF2aW5nIGNvbnRlbnQsXG4gIC8vIGJ1dCB3ZSBuZWVkIG1vdmUgaXQuXG5cbiAgaWYgKGRlZmluaXRpb24pIHtcbiAgICBldmVudHMuc3BsaWNlKHRleHQsIDAsIFsnZW50ZXInLCBoZWFkaW5nLCBjb250ZXh0XSlcbiAgICBldmVudHMuc3BsaWNlKGRlZmluaXRpb24gKyAxLCAwLCBbJ2V4aXQnLCBldmVudHNbY29udGVudF1bMV0sIGNvbnRleHRdKVxuICAgIGV2ZW50c1tjb250ZW50XVsxXS5lbmQgPSBzaGFsbG93KGV2ZW50c1tkZWZpbml0aW9uXVsxXS5lbmQpXG4gIH0gZWxzZSB7XG4gICAgZXZlbnRzW2NvbnRlbnRdWzFdID0gaGVhZGluZ1xuICB9IC8vIEFkZCB0aGUgaGVhZGluZyBleGl0IGF0IHRoZSBlbmQuXG5cbiAgZXZlbnRzLnB1c2goWydleGl0JywgaGVhZGluZywgY29udGV4dF0pXG4gIHJldHVybiBldmVudHNcbn1cblxuZnVuY3Rpb24gdG9rZW5pemVTZXRleHRVbmRlcmxpbmUoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIGluZGV4ID0gc2VsZi5ldmVudHMubGVuZ3RoXG4gIHZhciBtYXJrZXJcbiAgdmFyIHBhcmFncmFwaCAvLyBGaW5kIGFuIG9wZW5pbmcuXG5cbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAvLyBTa2lwIGVudGVyL2V4aXQgb2YgbGluZSBlbmRpbmcsIGxpbmUgcHJlZml4LCBhbmQgY29udGVudC5cbiAgICAvLyBXZSBjYW4gbm93IGVpdGhlciBoYXZlIGEgZGVmaW5pdGlvbiBvciBhIHBhcmFncmFwaC5cbiAgICBpZiAoXG4gICAgICBzZWxmLmV2ZW50c1tpbmRleF1bMV0udHlwZSAhPT0gJ2xpbmVFbmRpbmcnICYmXG4gICAgICBzZWxmLmV2ZW50c1tpbmRleF1bMV0udHlwZSAhPT0gJ2xpbmVQcmVmaXgnICYmXG4gICAgICBzZWxmLmV2ZW50c1tpbmRleF1bMV0udHlwZSAhPT0gJ2NvbnRlbnQnXG4gICAgKSB7XG4gICAgICBwYXJhZ3JhcGggPSBzZWxmLmV2ZW50c1tpbmRleF1bMV0udHlwZSA9PT0gJ3BhcmFncmFwaCdcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGlmICghc2VsZi5sYXp5ICYmIChzZWxmLmludGVycnVwdCB8fCBwYXJhZ3JhcGgpKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCdzZXRleHRIZWFkaW5nTGluZScpXG4gICAgICBlZmZlY3RzLmVudGVyKCdzZXRleHRIZWFkaW5nTGluZVNlcXVlbmNlJylcbiAgICAgIG1hcmtlciA9IGNvZGVcbiAgICAgIHJldHVybiBjbG9zaW5nU2VxdWVuY2UoY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjbG9zaW5nU2VxdWVuY2UoY29kZSkge1xuICAgIGlmIChjb2RlID09PSBtYXJrZXIpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNsb3NpbmdTZXF1ZW5jZVxuICAgIH1cblxuICAgIGVmZmVjdHMuZXhpdCgnc2V0ZXh0SGVhZGluZ0xpbmVTZXF1ZW5jZScpXG4gICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBjbG9zaW5nU2VxdWVuY2VFbmQsICdsaW5lU3VmZml4JykoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NpbmdTZXF1ZW5jZUVuZChjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmV4aXQoJ3NldGV4dEhlYWRpbmdMaW5lJylcbiAgICAgIHJldHVybiBvayhjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldGV4dFVuZGVybGluZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7dmFsdWU6IHRydWV9KVxuXG52YXIgdGV4dCQxID0gcmVxdWlyZSgnLi9pbml0aWFsaXplL3RleHQuanMnKVxudmFyIGF0dGVudGlvbiA9IHJlcXVpcmUoJy4vdG9rZW5pemUvYXR0ZW50aW9uLmpzJylcbnZhciBhdXRvbGluayA9IHJlcXVpcmUoJy4vdG9rZW5pemUvYXV0b2xpbmsuanMnKVxudmFyIGJsb2NrUXVvdGUgPSByZXF1aXJlKCcuL3Rva2VuaXplL2Jsb2NrLXF1b3RlLmpzJylcbnZhciBjaGFyYWN0ZXJFc2NhcGUgPSByZXF1aXJlKCcuL3Rva2VuaXplL2NoYXJhY3Rlci1lc2NhcGUuanMnKVxudmFyIGNoYXJhY3RlclJlZmVyZW5jZSA9IHJlcXVpcmUoJy4vdG9rZW5pemUvY2hhcmFjdGVyLXJlZmVyZW5jZS5qcycpXG52YXIgY29kZUZlbmNlZCA9IHJlcXVpcmUoJy4vdG9rZW5pemUvY29kZS1mZW5jZWQuanMnKVxudmFyIGNvZGVJbmRlbnRlZCA9IHJlcXVpcmUoJy4vdG9rZW5pemUvY29kZS1pbmRlbnRlZC5qcycpXG52YXIgY29kZVRleHQgPSByZXF1aXJlKCcuL3Rva2VuaXplL2NvZGUtdGV4dC5qcycpXG52YXIgZGVmaW5pdGlvbiA9IHJlcXVpcmUoJy4vdG9rZW5pemUvZGVmaW5pdGlvbi5qcycpXG52YXIgaGFyZEJyZWFrRXNjYXBlID0gcmVxdWlyZSgnLi90b2tlbml6ZS9oYXJkLWJyZWFrLWVzY2FwZS5qcycpXG52YXIgaGVhZGluZ0F0eCA9IHJlcXVpcmUoJy4vdG9rZW5pemUvaGVhZGluZy1hdHguanMnKVxudmFyIGh0bWxGbG93ID0gcmVxdWlyZSgnLi90b2tlbml6ZS9odG1sLWZsb3cuanMnKVxudmFyIGh0bWxUZXh0ID0gcmVxdWlyZSgnLi90b2tlbml6ZS9odG1sLXRleHQuanMnKVxudmFyIGxhYmVsRW5kID0gcmVxdWlyZSgnLi90b2tlbml6ZS9sYWJlbC1lbmQuanMnKVxudmFyIGxhYmVsU3RhcnRJbWFnZSA9IHJlcXVpcmUoJy4vdG9rZW5pemUvbGFiZWwtc3RhcnQtaW1hZ2UuanMnKVxudmFyIGxhYmVsU3RhcnRMaW5rID0gcmVxdWlyZSgnLi90b2tlbml6ZS9sYWJlbC1zdGFydC1saW5rLmpzJylcbnZhciBsaW5lRW5kaW5nID0gcmVxdWlyZSgnLi90b2tlbml6ZS9saW5lLWVuZGluZy5qcycpXG52YXIgbGlzdCA9IHJlcXVpcmUoJy4vdG9rZW5pemUvbGlzdC5qcycpXG52YXIgc2V0ZXh0VW5kZXJsaW5lID0gcmVxdWlyZSgnLi90b2tlbml6ZS9zZXRleHQtdW5kZXJsaW5lLmpzJylcbnZhciB0aGVtYXRpY0JyZWFrID0gcmVxdWlyZSgnLi90b2tlbml6ZS90aGVtYXRpYy1icmVhay5qcycpXG5cbnZhciBkb2N1bWVudCA9IHtcbiAgNDI6IGxpc3QsXG4gIC8vIEFzdGVyaXNrXG4gIDQzOiBsaXN0LFxuICAvLyBQbHVzIHNpZ25cbiAgNDU6IGxpc3QsXG4gIC8vIERhc2hcbiAgNDg6IGxpc3QsXG4gIC8vIDBcbiAgNDk6IGxpc3QsXG4gIC8vIDFcbiAgNTA6IGxpc3QsXG4gIC8vIDJcbiAgNTE6IGxpc3QsXG4gIC8vIDNcbiAgNTI6IGxpc3QsXG4gIC8vIDRcbiAgNTM6IGxpc3QsXG4gIC8vIDVcbiAgNTQ6IGxpc3QsXG4gIC8vIDZcbiAgNTU6IGxpc3QsXG4gIC8vIDdcbiAgNTY6IGxpc3QsXG4gIC8vIDhcbiAgNTc6IGxpc3QsXG4gIC8vIDlcbiAgNjI6IGJsb2NrUXVvdGUgLy8gR3JlYXRlciB0aGFuXG59XG52YXIgY29udGVudEluaXRpYWwgPSB7XG4gIDkxOiBkZWZpbml0aW9uIC8vIExlZnQgc3F1YXJlIGJyYWNrZXRcbn1cbnZhciBmbG93SW5pdGlhbCA9IHtcbiAgJy0yJzogY29kZUluZGVudGVkLFxuICAvLyBIb3Jpem9udGFsIHRhYlxuICAnLTEnOiBjb2RlSW5kZW50ZWQsXG4gIC8vIFZpcnR1YWwgc3BhY2VcbiAgMzI6IGNvZGVJbmRlbnRlZCAvLyBTcGFjZVxufVxudmFyIGZsb3cgPSB7XG4gIDM1OiBoZWFkaW5nQXR4LFxuICAvLyBOdW1iZXIgc2lnblxuICA0MjogdGhlbWF0aWNCcmVhayxcbiAgLy8gQXN0ZXJpc2tcbiAgNDU6IFtzZXRleHRVbmRlcmxpbmUsIHRoZW1hdGljQnJlYWtdLFxuICAvLyBEYXNoXG4gIDYwOiBodG1sRmxvdyxcbiAgLy8gTGVzcyB0aGFuXG4gIDYxOiBzZXRleHRVbmRlcmxpbmUsXG4gIC8vIEVxdWFscyB0b1xuICA5NTogdGhlbWF0aWNCcmVhayxcbiAgLy8gVW5kZXJzY29yZVxuICA5NjogY29kZUZlbmNlZCxcbiAgLy8gR3JhdmUgYWNjZW50XG4gIDEyNjogY29kZUZlbmNlZCAvLyBUaWxkZVxufVxudmFyIHN0cmluZyA9IHtcbiAgMzg6IGNoYXJhY3RlclJlZmVyZW5jZSxcbiAgLy8gQW1wZXJzYW5kXG4gIDkyOiBjaGFyYWN0ZXJFc2NhcGUgLy8gQmFja3NsYXNoXG59XG52YXIgdGV4dCA9IHtcbiAgJy01JzogbGluZUVuZGluZyxcbiAgLy8gQ2FycmlhZ2UgcmV0dXJuXG4gICctNCc6IGxpbmVFbmRpbmcsXG4gIC8vIExpbmUgZmVlZFxuICAnLTMnOiBsaW5lRW5kaW5nLFxuICAvLyBDYXJyaWFnZSByZXR1cm4gKyBsaW5lIGZlZWRcbiAgMzM6IGxhYmVsU3RhcnRJbWFnZSxcbiAgLy8gRXhjbGFtYXRpb24gbWFya1xuICAzODogY2hhcmFjdGVyUmVmZXJlbmNlLFxuICAvLyBBbXBlcnNhbmRcbiAgNDI6IGF0dGVudGlvbixcbiAgLy8gQXN0ZXJpc2tcbiAgNjA6IFthdXRvbGluaywgaHRtbFRleHRdLFxuICAvLyBMZXNzIHRoYW5cbiAgOTE6IGxhYmVsU3RhcnRMaW5rLFxuICAvLyBMZWZ0IHNxdWFyZSBicmFja2V0XG4gIDkyOiBbaGFyZEJyZWFrRXNjYXBlLCBjaGFyYWN0ZXJFc2NhcGVdLFxuICAvLyBCYWNrc2xhc2hcbiAgOTM6IGxhYmVsRW5kLFxuICAvLyBSaWdodCBzcXVhcmUgYnJhY2tldFxuICA5NTogYXR0ZW50aW9uLFxuICAvLyBVbmRlcnNjb3JlXG4gIDk2OiBjb2RlVGV4dCAvLyBHcmF2ZSBhY2NlbnRcbn1cbnZhciBpbnNpZGVTcGFuID0ge1xuICBudWxsOiBbYXR0ZW50aW9uLCB0ZXh0JDEucmVzb2x2ZXJdXG59XG52YXIgZGlzYWJsZSA9IHtcbiAgbnVsbDogW11cbn1cblxuZXhwb3J0cy5jb250ZW50SW5pdGlhbCA9IGNvbnRlbnRJbml0aWFsXG5leHBvcnRzLmRpc2FibGUgPSBkaXNhYmxlXG5leHBvcnRzLmRvY3VtZW50ID0gZG9jdW1lbnRcbmV4cG9ydHMuZmxvdyA9IGZsb3dcbmV4cG9ydHMuZmxvd0luaXRpYWwgPSBmbG93SW5pdGlhbFxuZXhwb3J0cy5pbnNpZGVTcGFuID0gaW5zaWRlU3BhblxuZXhwb3J0cy5zdHJpbmcgPSBzdHJpbmdcbmV4cG9ydHMudGV4dCA9IHRleHRcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGNvbnRlbnQgPSByZXF1aXJlKCcuL2luaXRpYWxpemUvY29udGVudC5qcycpXG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL2luaXRpYWxpemUvZG9jdW1lbnQuanMnKVxudmFyIGZsb3cgPSByZXF1aXJlKCcuL2luaXRpYWxpemUvZmxvdy5qcycpXG52YXIgdGV4dCA9IHJlcXVpcmUoJy4vaW5pdGlhbGl6ZS90ZXh0LmpzJylcbnZhciBjb21iaW5lRXh0ZW5zaW9ucyA9IHJlcXVpcmUoJy4vdXRpbC9jb21iaW5lLWV4dGVuc2lvbnMuanMnKVxudmFyIGNyZWF0ZVRva2VuaXplciA9IHJlcXVpcmUoJy4vdXRpbC9jcmVhdGUtdG9rZW5pemVyLmpzJylcbnZhciBtaW5pZmxhdCA9IHJlcXVpcmUoJy4vdXRpbC9taW5pZmxhdC5qcycpXG52YXIgY29uc3RydWN0cyA9IHJlcXVpcmUoJy4vY29uc3RydWN0cy5qcycpXG5cbmZ1bmN0aW9uIHBhcnNlKG9wdGlvbnMpIHtcbiAgdmFyIHNldHRpbmdzID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgcGFyc2VyID0ge1xuICAgIGRlZmluZWQ6IFtdLFxuICAgIGNvbnN0cnVjdHM6IGNvbWJpbmVFeHRlbnNpb25zKFxuICAgICAgW2NvbnN0cnVjdHNdLmNvbmNhdChtaW5pZmxhdChzZXR0aW5ncy5leHRlbnNpb25zKSlcbiAgICApLFxuICAgIGNvbnRlbnQ6IGNyZWF0ZShjb250ZW50KSxcbiAgICBkb2N1bWVudDogY3JlYXRlKGRvY3VtZW50KSxcbiAgICBmbG93OiBjcmVhdGUoZmxvdyksXG4gICAgc3RyaW5nOiBjcmVhdGUodGV4dC5zdHJpbmcpLFxuICAgIHRleHQ6IGNyZWF0ZSh0ZXh0LnRleHQpXG4gIH1cbiAgcmV0dXJuIHBhcnNlclxuXG4gIGZ1bmN0aW9uIGNyZWF0ZShpbml0aWFsaXplcikge1xuICAgIHJldHVybiBjcmVhdG9yXG5cbiAgICBmdW5jdGlvbiBjcmVhdG9yKGZyb20pIHtcbiAgICAgIHJldHVybiBjcmVhdGVUb2tlbml6ZXIocGFyc2VyLCBpbml0aWFsaXplciwgZnJvbSlcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgc2VhcmNoID0gL1tcXDBcXHRcXG5cXHJdL2dcblxuZnVuY3Rpb24gcHJlcHJvY2VzcygpIHtcbiAgdmFyIHN0YXJ0ID0gdHJ1ZVxuICB2YXIgY29sdW1uID0gMVxuICB2YXIgYnVmZmVyID0gJydcbiAgdmFyIGF0Q2FycmlhZ2VSZXR1cm5cbiAgcmV0dXJuIHByZXByb2Nlc3NvclxuXG4gIGZ1bmN0aW9uIHByZXByb2Nlc3Nvcih2YWx1ZSwgZW5jb2RpbmcsIGVuZCkge1xuICAgIHZhciBjaHVua3MgPSBbXVxuICAgIHZhciBtYXRjaFxuICAgIHZhciBuZXh0XG4gICAgdmFyIHN0YXJ0UG9zaXRpb25cbiAgICB2YXIgZW5kUG9zaXRpb25cbiAgICB2YXIgY29kZVxuICAgIHZhbHVlID0gYnVmZmVyICsgdmFsdWUudG9TdHJpbmcoZW5jb2RpbmcpXG4gICAgc3RhcnRQb3NpdGlvbiA9IDBcbiAgICBidWZmZXIgPSAnJ1xuXG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICBpZiAodmFsdWUuY2hhckNvZGVBdCgwKSA9PT0gNjUyNzkpIHtcbiAgICAgICAgc3RhcnRQb3NpdGlvbisrXG4gICAgICB9XG5cbiAgICAgIHN0YXJ0ID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgd2hpbGUgKHN0YXJ0UG9zaXRpb24gPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgIHNlYXJjaC5sYXN0SW5kZXggPSBzdGFydFBvc2l0aW9uXG4gICAgICBtYXRjaCA9IHNlYXJjaC5leGVjKHZhbHVlKVxuICAgICAgZW5kUG9zaXRpb24gPSBtYXRjaCA/IG1hdGNoLmluZGV4IDogdmFsdWUubGVuZ3RoXG4gICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChlbmRQb3NpdGlvbilcblxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICBidWZmZXIgPSB2YWx1ZS5zbGljZShzdGFydFBvc2l0aW9uKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAoY29kZSA9PT0gMTAgJiYgc3RhcnRQb3NpdGlvbiA9PT0gZW5kUG9zaXRpb24gJiYgYXRDYXJyaWFnZVJldHVybikge1xuICAgICAgICBjaHVua3MucHVzaCgtMylcbiAgICAgICAgYXRDYXJyaWFnZVJldHVybiA9IHVuZGVmaW5lZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGF0Q2FycmlhZ2VSZXR1cm4pIHtcbiAgICAgICAgICBjaHVua3MucHVzaCgtNSlcbiAgICAgICAgICBhdENhcnJpYWdlUmV0dXJuID0gdW5kZWZpbmVkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnRQb3NpdGlvbiA8IGVuZFBvc2l0aW9uKSB7XG4gICAgICAgICAgY2h1bmtzLnB1c2godmFsdWUuc2xpY2Uoc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pKVxuICAgICAgICAgIGNvbHVtbiArPSBlbmRQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb25cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgICAgY2h1bmtzLnB1c2goNjU1MzMpXG4gICAgICAgICAgY29sdW1uKytcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSA5KSB7XG4gICAgICAgICAgbmV4dCA9IE1hdGguY2VpbChjb2x1bW4gLyA0KSAqIDRcbiAgICAgICAgICBjaHVua3MucHVzaCgtMilcblxuICAgICAgICAgIHdoaWxlIChjb2x1bW4rKyA8IG5leHQpIGNodW5rcy5wdXNoKC0xKVxuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDEwKSB7XG4gICAgICAgICAgY2h1bmtzLnB1c2goLTQpXG4gICAgICAgICAgY29sdW1uID0gMVxuICAgICAgICB9IC8vIE11c3QgYmUgY2FycmlhZ2UgcmV0dXJuLlxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBhdENhcnJpYWdlUmV0dXJuID0gdHJ1ZVxuICAgICAgICAgIGNvbHVtbiA9IDFcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdGFydFBvc2l0aW9uID0gZW5kUG9zaXRpb24gKyAxXG4gICAgfVxuXG4gICAgaWYgKGVuZCkge1xuICAgICAgaWYgKGF0Q2FycmlhZ2VSZXR1cm4pIGNodW5rcy5wdXNoKC01KVxuICAgICAgaWYgKGJ1ZmZlcikgY2h1bmtzLnB1c2goYnVmZmVyKVxuICAgICAgY2h1bmtzLnB1c2gobnVsbClcbiAgICB9XG5cbiAgICByZXR1cm4gY2h1bmtzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwcmVwcm9jZXNzXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBzdWJ0b2tlbml6ZSA9IHJlcXVpcmUoJy4vdXRpbC9zdWJ0b2tlbml6ZS5qcycpXG5cbmZ1bmN0aW9uIHBvc3Rwcm9jZXNzKGV2ZW50cykge1xuICB3aGlsZSAoIXN1YnRva2VuaXplKGV2ZW50cykpIHtcbiAgICAvLyBFbXB0eVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50c1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBvc3Rwcm9jZXNzXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gZnJvbU1hcmtkb3duXG5cbi8vIFRoZXNlIHRocmVlIGFyZSBjb21waWxlZCBhd2F5IGluIHRoZSBgZGlzdC9gXG5cbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJ21kYXN0LXV0aWwtdG8tc3RyaW5nJylcbnZhciBhc3NpZ24gPSByZXF1aXJlKCdtaWNyb21hcmsvZGlzdC9jb25zdGFudC9hc3NpZ24nKVxudmFyIG93biA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NvbnN0YW50L2hhcy1vd24tcHJvcGVydHknKVxudmFyIG5vcm1hbGl6ZUlkZW50aWZpZXIgPSByZXF1aXJlKCdtaWNyb21hcmsvZGlzdC91dGlsL25vcm1hbGl6ZS1pZGVudGlmaWVyJylcbnZhciBzYWZlRnJvbUludCA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L3V0aWwvc2FmZS1mcm9tLWludCcpXG52YXIgcGFyc2VyID0gcmVxdWlyZSgnbWljcm9tYXJrL2Rpc3QvcGFyc2UnKVxudmFyIHByZXByb2Nlc3NvciA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L3ByZXByb2Nlc3MnKVxudmFyIHBvc3Rwcm9jZXNzID0gcmVxdWlyZSgnbWljcm9tYXJrL2Rpc3QvcG9zdHByb2Nlc3MnKVxudmFyIGRlY29kZSA9IHJlcXVpcmUoJ3BhcnNlLWVudGl0aWVzL2RlY29kZS1lbnRpdHknKVxudmFyIHN0cmluZ2lmeVBvc2l0aW9uID0gcmVxdWlyZSgndW5pc3QtdXRpbC1zdHJpbmdpZnktcG9zaXRpb24nKVxuXG5mdW5jdGlvbiBmcm9tTWFya2Rvd24odmFsdWUsIGVuY29kaW5nLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucyA9IGVuY29kaW5nXG4gICAgZW5jb2RpbmcgPSB1bmRlZmluZWRcbiAgfVxuXG4gIHJldHVybiBjb21waWxlcihvcHRpb25zKShcbiAgICBwb3N0cHJvY2VzcyhcbiAgICAgIHBhcnNlcihvcHRpb25zKS5kb2N1bWVudCgpLndyaXRlKHByZXByb2Nlc3NvcigpKHZhbHVlLCBlbmNvZGluZywgdHJ1ZSkpXG4gICAgKVxuICApXG59XG5cbi8vIE5vdGUgdGhpcyBjb21waWxlciBvbmx5IHVuZGVyc3RhbmQgY29tcGxldGUgYnVmZmVyaW5nLCBub3Qgc3RyZWFtaW5nLlxuZnVuY3Rpb24gY29tcGlsZXIob3B0aW9ucykge1xuICB2YXIgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9XG4gIHZhciBjb25maWcgPSBjb25maWd1cmUoXG4gICAge1xuICAgICAgdHJhbnNmb3JtczogW10sXG4gICAgICBjYW5Db250YWluRW9sczogW1xuICAgICAgICAnZW1waGFzaXMnLFxuICAgICAgICAnZnJhZ21lbnQnLFxuICAgICAgICAnaGVhZGluZycsXG4gICAgICAgICdwYXJhZ3JhcGgnLFxuICAgICAgICAnc3Ryb25nJ1xuICAgICAgXSxcblxuICAgICAgZW50ZXI6IHtcbiAgICAgICAgYXV0b2xpbms6IG9wZW5lcihsaW5rKSxcbiAgICAgICAgYXV0b2xpbmtQcm90b2NvbDogb25lbnRlcmRhdGEsXG4gICAgICAgIGF1dG9saW5rRW1haWw6IG9uZW50ZXJkYXRhLFxuICAgICAgICBhdHhIZWFkaW5nOiBvcGVuZXIoaGVhZGluZyksXG4gICAgICAgIGJsb2NrUXVvdGU6IG9wZW5lcihibG9ja1F1b3RlKSxcbiAgICAgICAgY2hhcmFjdGVyRXNjYXBlOiBvbmVudGVyZGF0YSxcbiAgICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlOiBvbmVudGVyZGF0YSxcbiAgICAgICAgY29kZUZlbmNlZDogb3BlbmVyKGNvZGVGbG93KSxcbiAgICAgICAgY29kZUZlbmNlZEZlbmNlSW5mbzogYnVmZmVyLFxuICAgICAgICBjb2RlRmVuY2VkRmVuY2VNZXRhOiBidWZmZXIsXG4gICAgICAgIGNvZGVJbmRlbnRlZDogb3BlbmVyKGNvZGVGbG93LCBidWZmZXIpLFxuICAgICAgICBjb2RlVGV4dDogb3BlbmVyKGNvZGVUZXh0LCBidWZmZXIpLFxuICAgICAgICBjb2RlVGV4dERhdGE6IG9uZW50ZXJkYXRhLFxuICAgICAgICBkYXRhOiBvbmVudGVyZGF0YSxcbiAgICAgICAgY29kZUZsb3dWYWx1ZTogb25lbnRlcmRhdGEsXG4gICAgICAgIGRlZmluaXRpb246IG9wZW5lcihkZWZpbml0aW9uKSxcbiAgICAgICAgZGVmaW5pdGlvbkRlc3RpbmF0aW9uU3RyaW5nOiBidWZmZXIsXG4gICAgICAgIGRlZmluaXRpb25MYWJlbFN0cmluZzogYnVmZmVyLFxuICAgICAgICBkZWZpbml0aW9uVGl0bGVTdHJpbmc6IGJ1ZmZlcixcbiAgICAgICAgZW1waGFzaXM6IG9wZW5lcihlbXBoYXNpcyksXG4gICAgICAgIGhhcmRCcmVha0VzY2FwZTogb3BlbmVyKGhhcmRCcmVhayksXG4gICAgICAgIGhhcmRCcmVha1RyYWlsaW5nOiBvcGVuZXIoaGFyZEJyZWFrKSxcbiAgICAgICAgaHRtbEZsb3c6IG9wZW5lcihodG1sLCBidWZmZXIpLFxuICAgICAgICBodG1sRmxvd0RhdGE6IG9uZW50ZXJkYXRhLFxuICAgICAgICBodG1sVGV4dDogb3BlbmVyKGh0bWwsIGJ1ZmZlciksXG4gICAgICAgIGh0bWxUZXh0RGF0YTogb25lbnRlcmRhdGEsXG4gICAgICAgIGltYWdlOiBvcGVuZXIoaW1hZ2UpLFxuICAgICAgICBsYWJlbDogYnVmZmVyLFxuICAgICAgICBsaW5rOiBvcGVuZXIobGluayksXG4gICAgICAgIGxpc3RJdGVtOiBvcGVuZXIobGlzdEl0ZW0pLFxuICAgICAgICBsaXN0SXRlbVZhbHVlOiBvbmVudGVybGlzdGl0ZW12YWx1ZSxcbiAgICAgICAgbGlzdE9yZGVyZWQ6IG9wZW5lcihsaXN0LCBvbmVudGVybGlzdG9yZGVyZWQpLFxuICAgICAgICBsaXN0VW5vcmRlcmVkOiBvcGVuZXIobGlzdCksXG4gICAgICAgIHBhcmFncmFwaDogb3BlbmVyKHBhcmFncmFwaCksXG4gICAgICAgIHJlZmVyZW5jZTogb25lbnRlcnJlZmVyZW5jZSxcbiAgICAgICAgcmVmZXJlbmNlU3RyaW5nOiBidWZmZXIsXG4gICAgICAgIHJlc291cmNlRGVzdGluYXRpb25TdHJpbmc6IGJ1ZmZlcixcbiAgICAgICAgcmVzb3VyY2VUaXRsZVN0cmluZzogYnVmZmVyLFxuICAgICAgICBzZXRleHRIZWFkaW5nOiBvcGVuZXIoaGVhZGluZyksXG4gICAgICAgIHN0cm9uZzogb3BlbmVyKHN0cm9uZyksXG4gICAgICAgIHRoZW1hdGljQnJlYWs6IG9wZW5lcih0aGVtYXRpY0JyZWFrKVxuICAgICAgfSxcblxuICAgICAgZXhpdDoge1xuICAgICAgICBhdHhIZWFkaW5nOiBjbG9zZXIoKSxcbiAgICAgICAgYXR4SGVhZGluZ1NlcXVlbmNlOiBvbmV4aXRhdHhoZWFkaW5nc2VxdWVuY2UsXG4gICAgICAgIGF1dG9saW5rOiBjbG9zZXIoKSxcbiAgICAgICAgYXV0b2xpbmtFbWFpbDogb25leGl0YXV0b2xpbmtlbWFpbCxcbiAgICAgICAgYXV0b2xpbmtQcm90b2NvbDogb25leGl0YXV0b2xpbmtwcm90b2NvbCxcbiAgICAgICAgYmxvY2tRdW90ZTogY2xvc2VyKCksXG4gICAgICAgIGNoYXJhY3RlckVzY2FwZVZhbHVlOiBvbmV4aXRkYXRhLFxuICAgICAgICBjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXJIZXhhZGVjaW1hbDogb25leGl0Y2hhcmFjdGVycmVmZXJlbmNlbWFya2VyLFxuICAgICAgICBjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXJOdW1lcmljOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIsXG4gICAgICAgIGNoYXJhY3RlclJlZmVyZW5jZVZhbHVlOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2V2YWx1ZSxcbiAgICAgICAgY29kZUZlbmNlZDogY2xvc2VyKG9uZXhpdGNvZGVmZW5jZWQpLFxuICAgICAgICBjb2RlRmVuY2VkRmVuY2U6IG9uZXhpdGNvZGVmZW5jZWRmZW5jZSxcbiAgICAgICAgY29kZUZlbmNlZEZlbmNlSW5mbzogb25leGl0Y29kZWZlbmNlZGZlbmNlaW5mbyxcbiAgICAgICAgY29kZUZlbmNlZEZlbmNlTWV0YTogb25leGl0Y29kZWZlbmNlZGZlbmNlbWV0YSxcbiAgICAgICAgY29kZUZsb3dWYWx1ZTogb25leGl0ZGF0YSxcbiAgICAgICAgY29kZUluZGVudGVkOiBjbG9zZXIob25leGl0Y29kZWluZGVudGVkKSxcbiAgICAgICAgY29kZVRleHQ6IGNsb3NlcihvbmV4aXRjb2RldGV4dCksXG4gICAgICAgIGNvZGVUZXh0RGF0YTogb25leGl0ZGF0YSxcbiAgICAgICAgZGF0YTogb25leGl0ZGF0YSxcbiAgICAgICAgZGVmaW5pdGlvbjogY2xvc2VyKCksXG4gICAgICAgIGRlZmluaXRpb25EZXN0aW5hdGlvblN0cmluZzogb25leGl0ZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nLFxuICAgICAgICBkZWZpbml0aW9uTGFiZWxTdHJpbmc6IG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZyxcbiAgICAgICAgZGVmaW5pdGlvblRpdGxlU3RyaW5nOiBvbmV4aXRkZWZpbml0aW9udGl0bGVzdHJpbmcsXG4gICAgICAgIGVtcGhhc2lzOiBjbG9zZXIoKSxcbiAgICAgICAgaGFyZEJyZWFrRXNjYXBlOiBjbG9zZXIob25leGl0aGFyZGJyZWFrKSxcbiAgICAgICAgaGFyZEJyZWFrVHJhaWxpbmc6IGNsb3NlcihvbmV4aXRoYXJkYnJlYWspLFxuICAgICAgICBodG1sRmxvdzogY2xvc2VyKG9uZXhpdGh0bWxmbG93KSxcbiAgICAgICAgaHRtbEZsb3dEYXRhOiBvbmV4aXRkYXRhLFxuICAgICAgICBodG1sVGV4dDogY2xvc2VyKG9uZXhpdGh0bWx0ZXh0KSxcbiAgICAgICAgaHRtbFRleHREYXRhOiBvbmV4aXRkYXRhLFxuICAgICAgICBpbWFnZTogY2xvc2VyKG9uZXhpdGltYWdlKSxcbiAgICAgICAgbGFiZWw6IG9uZXhpdGxhYmVsLFxuICAgICAgICBsYWJlbFRleHQ6IG9uZXhpdGxhYmVsdGV4dCxcbiAgICAgICAgbGluZUVuZGluZzogb25leGl0bGluZWVuZGluZyxcbiAgICAgICAgbGluazogY2xvc2VyKG9uZXhpdGxpbmspLFxuICAgICAgICBsaXN0SXRlbTogY2xvc2VyKCksXG4gICAgICAgIGxpc3RPcmRlcmVkOiBjbG9zZXIoKSxcbiAgICAgICAgbGlzdFVub3JkZXJlZDogY2xvc2VyKCksXG4gICAgICAgIHBhcmFncmFwaDogY2xvc2VyKCksXG4gICAgICAgIHJlZmVyZW5jZVN0cmluZzogb25leGl0cmVmZXJlbmNlc3RyaW5nLFxuICAgICAgICByZXNvdXJjZURlc3RpbmF0aW9uU3RyaW5nOiBvbmV4aXRyZXNvdXJjZWRlc3RpbmF0aW9uc3RyaW5nLFxuICAgICAgICByZXNvdXJjZVRpdGxlU3RyaW5nOiBvbmV4aXRyZXNvdXJjZXRpdGxlc3RyaW5nLFxuICAgICAgICByZXNvdXJjZTogb25leGl0cmVzb3VyY2UsXG4gICAgICAgIHNldGV4dEhlYWRpbmc6IGNsb3NlcihvbmV4aXRzZXRleHRoZWFkaW5nKSxcbiAgICAgICAgc2V0ZXh0SGVhZGluZ0xpbmVTZXF1ZW5jZTogb25leGl0c2V0ZXh0aGVhZGluZ2xpbmVzZXF1ZW5jZSxcbiAgICAgICAgc2V0ZXh0SGVhZGluZ1RleHQ6IG9uZXhpdHNldGV4dGhlYWRpbmd0ZXh0LFxuICAgICAgICBzdHJvbmc6IGNsb3NlcigpLFxuICAgICAgICB0aGVtYXRpY0JyZWFrOiBjbG9zZXIoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXR0aW5ncy5tZGFzdEV4dGVuc2lvbnMgfHwgW11cbiAgKVxuXG4gIHZhciBkYXRhID0ge31cblxuICByZXR1cm4gY29tcGlsZVxuXG4gIGZ1bmN0aW9uIGNvbXBpbGUoZXZlbnRzKSB7XG4gICAgdmFyIHRyZWUgPSB7dHlwZTogJ3Jvb3QnLCBjaGlsZHJlbjogW119XG4gICAgdmFyIHN0YWNrID0gW3RyZWVdXG4gICAgdmFyIHRva2VuU3RhY2sgPSBbXVxuICAgIHZhciBsaXN0U3RhY2sgPSBbXVxuICAgIHZhciBpbmRleCA9IC0xXG4gICAgdmFyIGhhbmRsZXJcbiAgICB2YXIgbGlzdFN0YXJ0XG5cbiAgICB2YXIgY29udGV4dCA9IHtcbiAgICAgIHN0YWNrOiBzdGFjayxcbiAgICAgIHRva2VuU3RhY2s6IHRva2VuU3RhY2ssXG4gICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgIGVudGVyOiBlbnRlcixcbiAgICAgIGV4aXQ6IGV4aXQsXG4gICAgICBidWZmZXI6IGJ1ZmZlcixcbiAgICAgIHJlc3VtZTogcmVzdW1lLFxuICAgICAgc2V0RGF0YTogc2V0RGF0YSxcbiAgICAgIGdldERhdGE6IGdldERhdGFcbiAgICB9XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGV2ZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIFdlIHByZXByb2Nlc3MgbGlzdHMgdG8gYWRkIGBsaXN0SXRlbWAgdG9rZW5zLCBhbmQgdG8gaW5mZXIgd2hldGhlclxuICAgICAgLy8gaXRlbXMgdGhlIGxpc3QgaXRzZWxmIGFyZSBzcHJlYWQgb3V0LlxuICAgICAgaWYgKFxuICAgICAgICBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdsaXN0T3JkZXJlZCcgfHxcbiAgICAgICAgZXZlbnRzW2luZGV4XVsxXS50eXBlID09PSAnbGlzdFVub3JkZXJlZCdcbiAgICAgICkge1xuICAgICAgICBpZiAoZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJykge1xuICAgICAgICAgIGxpc3RTdGFjay5wdXNoKGluZGV4KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpc3RTdGFydCA9IGxpc3RTdGFjay5wb3AoaW5kZXgpXG4gICAgICAgICAgaW5kZXggPSBwcmVwYXJlTGlzdChldmVudHMsIGxpc3RTdGFydCwgaW5kZXgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbmRleCA9IC0xXG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGV2ZW50cy5sZW5ndGgpIHtcbiAgICAgIGhhbmRsZXIgPSBjb25maWdbZXZlbnRzW2luZGV4XVswXV1cblxuICAgICAgaWYgKG93bi5jYWxsKGhhbmRsZXIsIGV2ZW50c1tpbmRleF1bMV0udHlwZSkpIHtcbiAgICAgICAgaGFuZGxlcltldmVudHNbaW5kZXhdWzFdLnR5cGVdLmNhbGwoXG4gICAgICAgICAgYXNzaWduKHtzbGljZVNlcmlhbGl6ZTogZXZlbnRzW2luZGV4XVsyXS5zbGljZVNlcmlhbGl6ZX0sIGNvbnRleHQpLFxuICAgICAgICAgIGV2ZW50c1tpbmRleF1bMV1cbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0b2tlblN0YWNrLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ2Fubm90IGNsb3NlIGRvY3VtZW50LCBhIHRva2VuIChgJyArXG4gICAgICAgICAgdG9rZW5TdGFja1t0b2tlblN0YWNrLmxlbmd0aCAtIDFdLnR5cGUgK1xuICAgICAgICAgICdgLCAnICtcbiAgICAgICAgICBzdHJpbmdpZnlQb3NpdGlvbih7XG4gICAgICAgICAgICBzdGFydDogdG9rZW5TdGFja1t0b2tlblN0YWNrLmxlbmd0aCAtIDFdLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiB0b2tlblN0YWNrW3Rva2VuU3RhY2subGVuZ3RoIC0gMV0uZW5kXG4gICAgICAgICAgfSkgK1xuICAgICAgICAgICcpIGlzIHN0aWxsIG9wZW4nXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gRmlndXJlIG91dCBgcm9vdGAgcG9zaXRpb24uXG4gICAgdHJlZS5wb3NpdGlvbiA9IHtcbiAgICAgIHN0YXJ0OiBwb2ludChcbiAgICAgICAgZXZlbnRzLmxlbmd0aCA/IGV2ZW50c1swXVsxXS5zdGFydCA6IHtsaW5lOiAxLCBjb2x1bW46IDEsIG9mZnNldDogMH1cbiAgICAgICksXG5cbiAgICAgIGVuZDogcG9pbnQoXG4gICAgICAgIGV2ZW50cy5sZW5ndGhcbiAgICAgICAgICA/IGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMl1bMV0uZW5kXG4gICAgICAgICAgOiB7bGluZTogMSwgY29sdW1uOiAxLCBvZmZzZXQ6IDB9XG4gICAgICApXG4gICAgfVxuXG4gICAgaW5kZXggPSAtMVxuICAgIHdoaWxlICgrK2luZGV4IDwgY29uZmlnLnRyYW5zZm9ybXMubGVuZ3RoKSB7XG4gICAgICB0cmVlID0gY29uZmlnLnRyYW5zZm9ybXNbaW5kZXhdKHRyZWUpIHx8IHRyZWVcbiAgICB9XG5cbiAgICByZXR1cm4gdHJlZVxuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZUxpc3QoZXZlbnRzLCBzdGFydCwgbGVuZ3RoKSB7XG4gICAgdmFyIGluZGV4ID0gc3RhcnQgLSAxXG4gICAgdmFyIGNvbnRhaW5lckJhbGFuY2UgPSAtMVxuICAgIHZhciBsaXN0U3ByZWFkID0gZmFsc2VcbiAgICB2YXIgbGlzdEl0ZW1cbiAgICB2YXIgdGFpbEluZGV4XG4gICAgdmFyIGxpbmVJbmRleFxuICAgIHZhciB0YWlsRXZlbnRcbiAgICB2YXIgZXZlbnRcbiAgICB2YXIgZmlyc3RCbGFua0xpbmVJbmRleFxuICAgIHZhciBhdE1hcmtlclxuXG4gICAgd2hpbGUgKCsraW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICBldmVudCA9IGV2ZW50c1tpbmRleF1cblxuICAgICAgaWYgKFxuICAgICAgICBldmVudFsxXS50eXBlID09PSAnbGlzdFVub3JkZXJlZCcgfHxcbiAgICAgICAgZXZlbnRbMV0udHlwZSA9PT0gJ2xpc3RPcmRlcmVkJyB8fFxuICAgICAgICBldmVudFsxXS50eXBlID09PSAnYmxvY2tRdW90ZSdcbiAgICAgICkge1xuICAgICAgICBpZiAoZXZlbnRbMF0gPT09ICdlbnRlcicpIHtcbiAgICAgICAgICBjb250YWluZXJCYWxhbmNlKytcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250YWluZXJCYWxhbmNlLS1cbiAgICAgICAgfVxuXG4gICAgICAgIGF0TWFya2VyID0gdW5kZWZpbmVkXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50WzFdLnR5cGUgPT09ICdsaW5lRW5kaW5nQmxhbmsnKSB7XG4gICAgICAgIGlmIChldmVudFswXSA9PT0gJ2VudGVyJykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGxpc3RJdGVtICYmXG4gICAgICAgICAgICAhYXRNYXJrZXIgJiZcbiAgICAgICAgICAgICFjb250YWluZXJCYWxhbmNlICYmXG4gICAgICAgICAgICAhZmlyc3RCbGFua0xpbmVJbmRleFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlyc3RCbGFua0xpbmVJbmRleCA9IGluZGV4XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXRNYXJrZXIgPSB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZXZlbnRbMV0udHlwZSA9PT0gJ2xpbmVQcmVmaXgnIHx8XG4gICAgICAgIGV2ZW50WzFdLnR5cGUgPT09ICdsaXN0SXRlbVZhbHVlJyB8fFxuICAgICAgICBldmVudFsxXS50eXBlID09PSAnbGlzdEl0ZW1NYXJrZXInIHx8XG4gICAgICAgIGV2ZW50WzFdLnR5cGUgPT09ICdsaXN0SXRlbVByZWZpeCcgfHxcbiAgICAgICAgZXZlbnRbMV0udHlwZSA9PT0gJ2xpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSdcbiAgICAgICkge1xuICAgICAgICAvLyBFbXB0eS5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF0TWFya2VyID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgKCFjb250YWluZXJCYWxhbmNlICYmXG4gICAgICAgICAgZXZlbnRbMF0gPT09ICdlbnRlcicgJiZcbiAgICAgICAgICBldmVudFsxXS50eXBlID09PSAnbGlzdEl0ZW1QcmVmaXgnKSB8fFxuICAgICAgICAoY29udGFpbmVyQmFsYW5jZSA9PT0gLTEgJiZcbiAgICAgICAgICBldmVudFswXSA9PT0gJ2V4aXQnICYmXG4gICAgICAgICAgKGV2ZW50WzFdLnR5cGUgPT09ICdsaXN0VW5vcmRlcmVkJyB8fFxuICAgICAgICAgICAgZXZlbnRbMV0udHlwZSA9PT0gJ2xpc3RPcmRlcmVkJykpXG4gICAgICApIHtcbiAgICAgICAgaWYgKGxpc3RJdGVtKSB7XG4gICAgICAgICAgdGFpbEluZGV4ID0gaW5kZXhcbiAgICAgICAgICBsaW5lSW5kZXggPSB1bmRlZmluZWRcblxuICAgICAgICAgIHdoaWxlICh0YWlsSW5kZXgtLSkge1xuICAgICAgICAgICAgdGFpbEV2ZW50ID0gZXZlbnRzW3RhaWxJbmRleF1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0YWlsRXZlbnRbMV0udHlwZSA9PT0gJ2xpbmVFbmRpbmcnIHx8XG4gICAgICAgICAgICAgIHRhaWxFdmVudFsxXS50eXBlID09PSAnbGluZUVuZGluZ0JsYW5rJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmICh0YWlsRXZlbnRbMF0gPT09ICdleGl0JykgY29udGludWVcblxuICAgICAgICAgICAgICBpZiAobGluZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgZXZlbnRzW2xpbmVJbmRleF1bMV0udHlwZSA9ICdsaW5lRW5kaW5nQmxhbmsnXG4gICAgICAgICAgICAgICAgbGlzdFNwcmVhZCA9IHRydWVcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRhaWxFdmVudFsxXS50eXBlID0gJ2xpbmVFbmRpbmcnXG4gICAgICAgICAgICAgIGxpbmVJbmRleCA9IHRhaWxJbmRleFxuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgdGFpbEV2ZW50WzFdLnR5cGUgPT09ICdsaW5lUHJlZml4JyB8fFxuICAgICAgICAgICAgICB0YWlsRXZlbnRbMV0udHlwZSA9PT0gJ2Jsb2NrUXVvdGVQcmVmaXgnIHx8XG4gICAgICAgICAgICAgIHRhaWxFdmVudFsxXS50eXBlID09PSAnYmxvY2tRdW90ZVByZWZpeFdoaXRlc3BhY2UnIHx8XG4gICAgICAgICAgICAgIHRhaWxFdmVudFsxXS50eXBlID09PSAnYmxvY2tRdW90ZU1hcmtlcicgfHxcbiAgICAgICAgICAgICAgdGFpbEV2ZW50WzFdLnR5cGUgPT09ICdsaXN0SXRlbUluZGVudCdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBFbXB0eVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaXJzdEJsYW5rTGluZUluZGV4ICYmXG4gICAgICAgICAgICAoIWxpbmVJbmRleCB8fCBmaXJzdEJsYW5rTGluZUluZGV4IDwgbGluZUluZGV4KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbGlzdEl0ZW0uX3NwcmVhZCA9IHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGaXggcG9zaXRpb24uXG4gICAgICAgICAgbGlzdEl0ZW0uZW5kID0gcG9pbnQoXG4gICAgICAgICAgICBsaW5lSW5kZXggPyBldmVudHNbbGluZUluZGV4XVsxXS5zdGFydCA6IGV2ZW50WzFdLmVuZFxuICAgICAgICAgIClcblxuICAgICAgICAgIGV2ZW50cy5zcGxpY2UobGluZUluZGV4IHx8IGluZGV4LCAwLCBbJ2V4aXQnLCBsaXN0SXRlbSwgZXZlbnRbMl1dKVxuICAgICAgICAgIGluZGV4KytcbiAgICAgICAgICBsZW5ndGgrK1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGxpc3QgaXRlbS5cbiAgICAgICAgaWYgKGV2ZW50WzFdLnR5cGUgPT09ICdsaXN0SXRlbVByZWZpeCcpIHtcbiAgICAgICAgICBsaXN0SXRlbSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdsaXN0SXRlbScsXG4gICAgICAgICAgICBfc3ByZWFkOiBmYWxzZSxcbiAgICAgICAgICAgIHN0YXJ0OiBwb2ludChldmVudFsxXS5zdGFydClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBldmVudHMuc3BsaWNlKGluZGV4LCAwLCBbJ2VudGVyJywgbGlzdEl0ZW0sIGV2ZW50WzJdXSlcbiAgICAgICAgICBpbmRleCsrXG4gICAgICAgICAgbGVuZ3RoKytcbiAgICAgICAgICBmaXJzdEJsYW5rTGluZUluZGV4ID0gdW5kZWZpbmVkXG4gICAgICAgICAgYXRNYXJrZXIgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudHNbc3RhcnRdWzFdLl9zcHJlYWQgPSBsaXN0U3ByZWFkXG4gICAgcmV0dXJuIGxlbmd0aFxuICB9XG5cbiAgZnVuY3Rpb24gc2V0RGF0YShrZXksIHZhbHVlKSB7XG4gICAgZGF0YVtrZXldID0gdmFsdWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERhdGEoa2V5KSB7XG4gICAgcmV0dXJuIGRhdGFba2V5XVxuICB9XG5cbiAgZnVuY3Rpb24gcG9pbnQoZCkge1xuICAgIHJldHVybiB7bGluZTogZC5saW5lLCBjb2x1bW46IGQuY29sdW1uLCBvZmZzZXQ6IGQub2Zmc2V0fVxuICB9XG5cbiAgZnVuY3Rpb24gb3BlbmVyKGNyZWF0ZSwgYW5kKSB7XG4gICAgcmV0dXJuIG9wZW5cblxuICAgIGZ1bmN0aW9uIG9wZW4odG9rZW4pIHtcbiAgICAgIGVudGVyLmNhbGwodGhpcywgY3JlYXRlKHRva2VuKSwgdG9rZW4pXG4gICAgICBpZiAoYW5kKSBhbmQuY2FsbCh0aGlzLCB0b2tlbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBidWZmZXIoKSB7XG4gICAgdGhpcy5zdGFjay5wdXNoKHt0eXBlOiAnZnJhZ21lbnQnLCBjaGlsZHJlbjogW119KVxuICB9XG5cbiAgZnVuY3Rpb24gZW50ZXIobm9kZSwgdG9rZW4pIHtcbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0uY2hpbGRyZW4ucHVzaChub2RlKVxuICAgIHRoaXMuc3RhY2sucHVzaChub2RlKVxuICAgIHRoaXMudG9rZW5TdGFjay5wdXNoKHRva2VuKVxuICAgIG5vZGUucG9zaXRpb24gPSB7c3RhcnQ6IHBvaW50KHRva2VuLnN0YXJ0KX1cbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VyKGFuZCkge1xuICAgIHJldHVybiBjbG9zZVxuXG4gICAgZnVuY3Rpb24gY2xvc2UodG9rZW4pIHtcbiAgICAgIGlmIChhbmQpIGFuZC5jYWxsKHRoaXMsIHRva2VuKVxuICAgICAgZXhpdC5jYWxsKHRoaXMsIHRva2VuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGV4aXQodG9rZW4pIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhY2sucG9wKClcbiAgICB2YXIgb3BlbiA9IHRoaXMudG9rZW5TdGFjay5wb3AoKVxuXG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgY2xvc2UgYCcgK1xuICAgICAgICAgIHRva2VuLnR5cGUgK1xuICAgICAgICAgICdgICgnICtcbiAgICAgICAgICBzdHJpbmdpZnlQb3NpdGlvbih7c3RhcnQ6IHRva2VuLnN0YXJ0LCBlbmQ6IHRva2VuLmVuZH0pICtcbiAgICAgICAgICAnKTogaXRcdTIwMTlzIG5vdCBvcGVuJ1xuICAgICAgKVxuICAgIH0gZWxzZSBpZiAob3Blbi50eXBlICE9PSB0b2tlbi50eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgY2xvc2UgYCcgK1xuICAgICAgICAgIHRva2VuLnR5cGUgK1xuICAgICAgICAgICdgICgnICtcbiAgICAgICAgICBzdHJpbmdpZnlQb3NpdGlvbih7c3RhcnQ6IHRva2VuLnN0YXJ0LCBlbmQ6IHRva2VuLmVuZH0pICtcbiAgICAgICAgICAnKTogYSBkaWZmZXJlbnQgdG9rZW4gKGAnICtcbiAgICAgICAgICBvcGVuLnR5cGUgK1xuICAgICAgICAgICdgLCAnICtcbiAgICAgICAgICBzdHJpbmdpZnlQb3NpdGlvbih7c3RhcnQ6IG9wZW4uc3RhcnQsIGVuZDogb3Blbi5lbmR9KSArXG4gICAgICAgICAgJykgaXMgb3BlbidcbiAgICAgIClcbiAgICB9XG5cbiAgICBub2RlLnBvc2l0aW9uLmVuZCA9IHBvaW50KHRva2VuLmVuZClcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzdW1lKCkge1xuICAgIHJldHVybiB0b1N0cmluZyh0aGlzLnN0YWNrLnBvcCgpKVxuICB9XG5cbiAgLy9cbiAgLy8gSGFuZGxlcnMuXG4gIC8vXG5cbiAgZnVuY3Rpb24gb25lbnRlcmxpc3RvcmRlcmVkKCkge1xuICAgIHNldERhdGEoJ2V4cGVjdGluZ0ZpcnN0TGlzdEl0ZW1WYWx1ZScsIHRydWUpXG4gIH1cblxuICBmdW5jdGlvbiBvbmVudGVybGlzdGl0ZW12YWx1ZSh0b2tlbikge1xuICAgIGlmIChnZXREYXRhKCdleHBlY3RpbmdGaXJzdExpc3RJdGVtVmFsdWUnKSkge1xuICAgICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDJdLnN0YXJ0ID0gcGFyc2VJbnQoXG4gICAgICAgIHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pLFxuICAgICAgICAxMFxuICAgICAgKVxuXG4gICAgICBzZXREYXRhKCdleHBlY3RpbmdGaXJzdExpc3RJdGVtVmFsdWUnKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8oKSB7XG4gICAgdmFyIGRhdGEgPSB0aGlzLnJlc3VtZSgpXG4gICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLmxhbmcgPSBkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRjb2RlZmVuY2VkZmVuY2VtZXRhKCkge1xuICAgIHZhciBkYXRhID0gdGhpcy5yZXN1bWUoKVxuICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXS5tZXRhID0gZGF0YVxuICB9XG5cbiAgZnVuY3Rpb24gb25leGl0Y29kZWZlbmNlZGZlbmNlKCkge1xuICAgIC8vIEV4aXQgaWYgdGhpcyBpcyB0aGUgY2xvc2luZyBmZW5jZS5cbiAgICBpZiAoZ2V0RGF0YSgnZmxvd0NvZGVJbnNpZGUnKSkgcmV0dXJuXG4gICAgdGhpcy5idWZmZXIoKVxuICAgIHNldERhdGEoJ2Zsb3dDb2RlSW5zaWRlJywgdHJ1ZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWQoKSB7XG4gICAgdmFyIGRhdGEgPSB0aGlzLnJlc3VtZSgpXG4gICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLnZhbHVlID0gZGF0YS5yZXBsYWNlKFxuICAgICAgL14oXFxyP1xcbnxcXHIpfChcXHI/XFxufFxccikkL2csXG4gICAgICAnJ1xuICAgIClcblxuICAgIHNldERhdGEoJ2Zsb3dDb2RlSW5zaWRlJylcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGNvZGVpbmRlbnRlZCgpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0udmFsdWUgPSBkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRkZWZpbml0aW9ubGFiZWxzdHJpbmcodG9rZW4pIHtcbiAgICAvLyBEaXNjYXJkIGxhYmVsLCB1c2UgdGhlIHNvdXJjZSBjb250ZW50IGluc3RlYWQuXG4gICAgdmFyIGxhYmVsID0gdGhpcy5yZXN1bWUoKVxuICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXS5sYWJlbCA9IGxhYmVsXG4gICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLmlkZW50aWZpZXIgPSBub3JtYWxpemVJZGVudGlmaWVyKFxuICAgICAgdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbilcbiAgICApLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZygpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0udGl0bGUgPSBkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRkZWZpbml0aW9uZGVzdGluYXRpb25zdHJpbmcoKSB7XG4gICAgdmFyIGRhdGEgPSB0aGlzLnJlc3VtZSgpXG4gICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLnVybCA9IGRhdGFcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGF0eGhlYWRpbmdzZXF1ZW5jZSh0b2tlbikge1xuICAgIGlmICghdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLmRlcHRoKSB7XG4gICAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0uZGVwdGggPSB0aGlzLnNsaWNlU2VyaWFsaXplKFxuICAgICAgICB0b2tlblxuICAgICAgKS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRzZXRleHRoZWFkaW5ndGV4dCgpIHtcbiAgICBzZXREYXRhKCdzZXRleHRIZWFkaW5nU2x1cnBMaW5lRW5kaW5nJywgdHJ1ZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdHNldGV4dGhlYWRpbmdsaW5lc2VxdWVuY2UodG9rZW4pIHtcbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0uZGVwdGggPVxuICAgICAgdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbikuY2hhckNvZGVBdCgwKSA9PT0gNjEgPyAxIDogMlxuICB9XG5cbiAgZnVuY3Rpb24gb25leGl0c2V0ZXh0aGVhZGluZygpIHtcbiAgICBzZXREYXRhKCdzZXRleHRIZWFkaW5nU2x1cnBMaW5lRW5kaW5nJylcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW50ZXJkYXRhKHRva2VuKSB7XG4gICAgdmFyIHNpYmxpbmdzID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLmNoaWxkcmVuXG4gICAgdmFyIHRhaWwgPSBzaWJsaW5nc1tzaWJsaW5ncy5sZW5ndGggLSAxXVxuXG4gICAgaWYgKCF0YWlsIHx8IHRhaWwudHlwZSAhPT0gJ3RleHQnKSB7XG4gICAgICAvLyBBZGQgYSBuZXcgdGV4dCBub2RlLlxuICAgICAgdGFpbCA9IHRleHQoKVxuICAgICAgdGFpbC5wb3NpdGlvbiA9IHtzdGFydDogcG9pbnQodG9rZW4uc3RhcnQpfVxuICAgICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLmNoaWxkcmVuLnB1c2godGFpbClcbiAgICB9XG5cbiAgICB0aGlzLnN0YWNrLnB1c2godGFpbClcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGRhdGEodG9rZW4pIHtcbiAgICB2YXIgdGFpbCA9IHRoaXMuc3RhY2sucG9wKClcbiAgICB0YWlsLnZhbHVlICs9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pXG4gICAgdGFpbC5wb3NpdGlvbi5lbmQgPSBwb2ludCh0b2tlbi5lbmQpXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRsaW5lZW5kaW5nKHRva2VuKSB7XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV1cblxuICAgIC8vIElmIHdlXHUyMDE5cmUgYXQgYSBoYXJkIGJyZWFrLCBpbmNsdWRlIHRoZSBsaW5lIGVuZGluZyBpbiB0aGVyZS5cbiAgICBpZiAoZ2V0RGF0YSgnYXRIYXJkQnJlYWsnKSkge1xuICAgICAgY29udGV4dC5jaGlsZHJlbltjb250ZXh0LmNoaWxkcmVuLmxlbmd0aCAtIDFdLnBvc2l0aW9uLmVuZCA9IHBvaW50KFxuICAgICAgICB0b2tlbi5lbmRcbiAgICAgIClcblxuICAgICAgc2V0RGF0YSgnYXRIYXJkQnJlYWsnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIWdldERhdGEoJ3NldGV4dEhlYWRpbmdTbHVycExpbmVFbmRpbmcnKSAmJlxuICAgICAgY29uZmlnLmNhbkNvbnRhaW5Fb2xzLmluZGV4T2YoY29udGV4dC50eXBlKSA+IC0xXG4gICAgKSB7XG4gICAgICBvbmVudGVyZGF0YS5jYWxsKHRoaXMsIHRva2VuKVxuICAgICAgb25leGl0ZGF0YS5jYWxsKHRoaXMsIHRva2VuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGhhcmRicmVhaygpIHtcbiAgICBzZXREYXRhKCdhdEhhcmRCcmVhaycsIHRydWUpXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRodG1sZmxvdygpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0udmFsdWUgPSBkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRodG1sdGV4dCgpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0udmFsdWUgPSBkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRjb2RldGV4dCgpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0udmFsdWUgPSBkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRsaW5rKCkge1xuICAgIHZhciBjb250ZXh0ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG5cbiAgICAvLyBUbyBkbzogY2xlYW4uXG4gICAgaWYgKGdldERhdGEoJ2luUmVmZXJlbmNlJykpIHtcbiAgICAgIGNvbnRleHQudHlwZSArPSAnUmVmZXJlbmNlJ1xuICAgICAgY29udGV4dC5yZWZlcmVuY2VUeXBlID0gZ2V0RGF0YSgncmVmZXJlbmNlVHlwZScpIHx8ICdzaG9ydGN1dCdcbiAgICAgIGRlbGV0ZSBjb250ZXh0LnVybFxuICAgICAgZGVsZXRlIGNvbnRleHQudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGNvbnRleHQuaWRlbnRpZmllclxuICAgICAgZGVsZXRlIGNvbnRleHQubGFiZWxcbiAgICAgIGRlbGV0ZSBjb250ZXh0LnJlZmVyZW5jZVR5cGVcbiAgICB9XG5cbiAgICBzZXREYXRhKCdyZWZlcmVuY2VUeXBlJylcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGltYWdlKCkge1xuICAgIHZhciBjb250ZXh0ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG5cbiAgICAvLyBUbyBkbzogY2xlYW4uXG4gICAgaWYgKGdldERhdGEoJ2luUmVmZXJlbmNlJykpIHtcbiAgICAgIGNvbnRleHQudHlwZSArPSAnUmVmZXJlbmNlJ1xuICAgICAgY29udGV4dC5yZWZlcmVuY2VUeXBlID0gZ2V0RGF0YSgncmVmZXJlbmNlVHlwZScpIHx8ICdzaG9ydGN1dCdcbiAgICAgIGRlbGV0ZSBjb250ZXh0LnVybFxuICAgICAgZGVsZXRlIGNvbnRleHQudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGNvbnRleHQuaWRlbnRpZmllclxuICAgICAgZGVsZXRlIGNvbnRleHQubGFiZWxcbiAgICAgIGRlbGV0ZSBjb250ZXh0LnJlZmVyZW5jZVR5cGVcbiAgICB9XG5cbiAgICBzZXREYXRhKCdyZWZlcmVuY2VUeXBlJylcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGxhYmVsdGV4dCh0b2tlbikge1xuICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAyXS5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcihcbiAgICAgIHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pXG4gICAgKS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRsYWJlbCgpIHtcbiAgICB2YXIgZnJhZ21lbnQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV1cbiAgICB2YXIgdmFsdWUgPSB0aGlzLnJlc3VtZSgpXG5cbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0ubGFiZWwgPSB2YWx1ZVxuXG4gICAgLy8gQXNzdW1lIGEgcmVmZXJlbmNlLlxuICAgIHNldERhdGEoJ2luUmVmZXJlbmNlJywgdHJ1ZSlcblxuICAgIGlmICh0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0udHlwZSA9PT0gJ2xpbmsnKSB7XG4gICAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0uY2hpbGRyZW4gPSBmcmFnbWVudC5jaGlsZHJlblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0uYWx0ID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRyZXNvdXJjZWRlc3RpbmF0aW9uc3RyaW5nKCkge1xuICAgIHZhciBkYXRhID0gdGhpcy5yZXN1bWUoKVxuICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXS51cmwgPSBkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRyZXNvdXJjZXRpdGxlc3RyaW5nKCkge1xuICAgIHZhciBkYXRhID0gdGhpcy5yZXN1bWUoKVxuICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXS50aXRsZSA9IGRhdGFcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdHJlc291cmNlKCkge1xuICAgIHNldERhdGEoJ2luUmVmZXJlbmNlJylcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW50ZXJyZWZlcmVuY2UoKSB7XG4gICAgc2V0RGF0YSgncmVmZXJlbmNlVHlwZScsICdjb2xsYXBzZWQnKVxuICB9XG5cbiAgZnVuY3Rpb24gb25leGl0cmVmZXJlbmNlc3RyaW5nKHRva2VuKSB7XG4gICAgdmFyIGxhYmVsID0gdGhpcy5yZXN1bWUoKVxuICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXS5sYWJlbCA9IGxhYmVsXG4gICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLmlkZW50aWZpZXIgPSBub3JtYWxpemVJZGVudGlmaWVyKFxuICAgICAgdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbilcbiAgICApLnRvTG93ZXJDYXNlKClcbiAgICBzZXREYXRhKCdyZWZlcmVuY2VUeXBlJywgJ2Z1bGwnKVxuICB9XG5cbiAgZnVuY3Rpb24gb25leGl0Y2hhcmFjdGVycmVmZXJlbmNlbWFya2VyKHRva2VuKSB7XG4gICAgc2V0RGF0YSgnY2hhcmFjdGVyUmVmZXJlbmNlVHlwZScsIHRva2VuLnR5cGUpXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2V2YWx1ZSh0b2tlbikge1xuICAgIHZhciBkYXRhID0gdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbilcbiAgICB2YXIgdHlwZSA9IGdldERhdGEoJ2NoYXJhY3RlclJlZmVyZW5jZVR5cGUnKVxuICAgIHZhciB2YWx1ZVxuICAgIHZhciB0YWlsXG5cbiAgICBpZiAodHlwZSkge1xuICAgICAgdmFsdWUgPSBzYWZlRnJvbUludChcbiAgICAgICAgZGF0YSxcbiAgICAgICAgdHlwZSA9PT0gJ2NoYXJhY3RlclJlZmVyZW5jZU1hcmtlck51bWVyaWMnID8gMTAgOiAxNlxuICAgICAgKVxuXG4gICAgICBzZXREYXRhKCdjaGFyYWN0ZXJSZWZlcmVuY2VUeXBlJylcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBkZWNvZGUoZGF0YSlcbiAgICB9XG5cbiAgICB0YWlsID0gdGhpcy5zdGFjay5wb3AoKVxuICAgIHRhaWwudmFsdWUgKz0gdmFsdWVcbiAgICB0YWlsLnBvc2l0aW9uLmVuZCA9IHBvaW50KHRva2VuLmVuZClcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGF1dG9saW5rcHJvdG9jb2wodG9rZW4pIHtcbiAgICBvbmV4aXRkYXRhLmNhbGwodGhpcywgdG9rZW4pXG4gICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLnVybCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRhdXRvbGlua2VtYWlsKHRva2VuKSB7XG4gICAgb25leGl0ZGF0YS5jYWxsKHRoaXMsIHRva2VuKVxuICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXS51cmwgPVxuICAgICAgJ21haWx0bzonICsgdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbilcbiAgfVxuXG4gIC8vXG4gIC8vIENyZWF0ZXJzLlxuICAvL1xuXG4gIGZ1bmN0aW9uIGJsb2NrUXVvdGUoKSB7XG4gICAgcmV0dXJuIHt0eXBlOiAnYmxvY2txdW90ZScsIGNoaWxkcmVuOiBbXX1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvZGVGbG93KCkge1xuICAgIHJldHVybiB7dHlwZTogJ2NvZGUnLCBsYW5nOiBudWxsLCBtZXRhOiBudWxsLCB2YWx1ZTogJyd9XG4gIH1cblxuICBmdW5jdGlvbiBjb2RlVGV4dCgpIHtcbiAgICByZXR1cm4ge3R5cGU6ICdpbmxpbmVDb2RlJywgdmFsdWU6ICcnfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2RlZmluaXRpb24nLFxuICAgICAgaWRlbnRpZmllcjogJycsXG4gICAgICBsYWJlbDogbnVsbCxcbiAgICAgIHRpdGxlOiBudWxsLFxuICAgICAgdXJsOiAnJ1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVtcGhhc2lzKCkge1xuICAgIHJldHVybiB7dHlwZTogJ2VtcGhhc2lzJywgY2hpbGRyZW46IFtdfVxuICB9XG5cbiAgZnVuY3Rpb24gaGVhZGluZygpIHtcbiAgICByZXR1cm4ge3R5cGU6ICdoZWFkaW5nJywgZGVwdGg6IHVuZGVmaW5lZCwgY2hpbGRyZW46IFtdfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFyZEJyZWFrKCkge1xuICAgIHJldHVybiB7dHlwZTogJ2JyZWFrJ31cbiAgfVxuXG4gIGZ1bmN0aW9uIGh0bWwoKSB7XG4gICAgcmV0dXJuIHt0eXBlOiAnaHRtbCcsIHZhbHVlOiAnJ31cbiAgfVxuXG4gIGZ1bmN0aW9uIGltYWdlKCkge1xuICAgIHJldHVybiB7dHlwZTogJ2ltYWdlJywgdGl0bGU6IG51bGwsIHVybDogJycsIGFsdDogbnVsbH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxpbmsoKSB7XG4gICAgcmV0dXJuIHt0eXBlOiAnbGluaycsIHRpdGxlOiBudWxsLCB1cmw6ICcnLCBjaGlsZHJlbjogW119XG4gIH1cblxuICBmdW5jdGlvbiBsaXN0KHRva2VuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgIG9yZGVyZWQ6IHRva2VuLnR5cGUgPT09ICdsaXN0T3JkZXJlZCcsXG4gICAgICBzdGFydDogbnVsbCxcbiAgICAgIHNwcmVhZDogdG9rZW4uX3NwcmVhZCxcbiAgICAgIGNoaWxkcmVuOiBbXVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RJdGVtKHRva2VuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdsaXN0SXRlbScsXG4gICAgICBzcHJlYWQ6IHRva2VuLl9zcHJlYWQsXG4gICAgICBjaGVja2VkOiBudWxsLFxuICAgICAgY2hpbGRyZW46IFtdXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyYWdyYXBoKCkge1xuICAgIHJldHVybiB7dHlwZTogJ3BhcmFncmFwaCcsIGNoaWxkcmVuOiBbXX1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0cm9uZygpIHtcbiAgICByZXR1cm4ge3R5cGU6ICdzdHJvbmcnLCBjaGlsZHJlbjogW119XG4gIH1cblxuICBmdW5jdGlvbiB0ZXh0KCkge1xuICAgIHJldHVybiB7dHlwZTogJ3RleHQnLCB2YWx1ZTogJyd9XG4gIH1cblxuICBmdW5jdGlvbiB0aGVtYXRpY0JyZWFrKCkge1xuICAgIHJldHVybiB7dHlwZTogJ3RoZW1hdGljQnJlYWsnfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZShjb25maWcsIGV4dGVuc2lvbnMpIHtcbiAgdmFyIGluZGV4ID0gLTFcblxuICB3aGlsZSAoKytpbmRleCA8IGV4dGVuc2lvbnMubGVuZ3RoKSB7XG4gICAgZXh0ZW5zaW9uKGNvbmZpZywgZXh0ZW5zaW9uc1tpbmRleF0pXG4gIH1cblxuICByZXR1cm4gY29uZmlnXG59XG5cbmZ1bmN0aW9uIGV4dGVuc2lvbihjb25maWcsIGV4dGVuc2lvbikge1xuICB2YXIga2V5XG4gIHZhciBsZWZ0XG5cbiAgZm9yIChrZXkgaW4gZXh0ZW5zaW9uKSB7XG4gICAgbGVmdCA9IG93bi5jYWxsKGNvbmZpZywga2V5KSA/IGNvbmZpZ1trZXldIDogKGNvbmZpZ1trZXldID0ge30pXG5cbiAgICBpZiAoa2V5ID09PSAnY2FuQ29udGFpbkVvbHMnIHx8IGtleSA9PT0gJ3RyYW5zZm9ybXMnKSB7XG4gICAgICBjb25maWdba2V5XSA9IFtdLmNvbmNhdChsZWZ0LCBleHRlbnNpb25ba2V5XSlcbiAgICB9IGVsc2Uge1xuICAgICAgT2JqZWN0LmFzc2lnbihsZWZ0LCBleHRlbnNpb25ba2V5XSlcbiAgICB9XG4gIH1cbn1cbiIsICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Rpc3QnKVxuIiwgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlXG5cbnZhciBmcm9tTWFya2Rvd24gPSByZXF1aXJlKCdtZGFzdC11dGlsLWZyb20tbWFya2Rvd24nKVxuXG5mdW5jdGlvbiBwYXJzZShvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIHRoaXMuUGFyc2VyID0gcGFyc2VcblxuICBmdW5jdGlvbiBwYXJzZShkb2MpIHtcbiAgICByZXR1cm4gZnJvbU1hcmtkb3duKFxuICAgICAgZG9jLFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgc2VsZi5kYXRhKCdzZXR0aW5ncycpLCBvcHRpb25zLCB7XG4gICAgICAgIC8vIE5vdGU6IHRoZXNlIG9wdGlvbnMgYXJlIG5vdCBpbiB0aGUgcmVhZG1lLlxuICAgICAgICAvLyBUaGUgZ29hbCBpcyBmb3IgdGhlbSB0byBiZSBzZXQgYnkgcGx1Z2lucyBvbiBgZGF0YWAgaW5zdGVhZCBvZiBiZWluZ1xuICAgICAgICAvLyBwYXNzZWQgYnkgdXNlcnMuXG4gICAgICAgIGV4dGVuc2lvbnM6IHNlbGYuZGF0YSgnbWljcm9tYXJrRXh0ZW5zaW9ucycpIHx8IFtdLFxuICAgICAgICBtZGFzdEV4dGVuc2lvbnM6IHNlbGYuZGF0YSgnZnJvbU1hcmtkb3duRXh0ZW5zaW9ucycpIHx8IFtdXG4gICAgICB9KVxuICAgIClcbiAgfVxufVxuIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgInZhciBhc2NpaUFscGhhID0gcmVxdWlyZSgnbWljcm9tYXJrL2Rpc3QvY2hhcmFjdGVyL2FzY2lpLWFscGhhJylcbnZhciBhc2NpaUFscGhhbnVtZXJpYyA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci9hc2NpaS1hbHBoYW51bWVyaWMnKVxudmFyIGFzY2lpQ29udHJvbCA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci9hc2NpaS1jb250cm9sJylcbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCdtaWNyb21hcmsvZGlzdC9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcnKVxudmFyIHVuaWNvZGVQdW5jdHVhdGlvbiA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci91bmljb2RlLXB1bmN0dWF0aW9uJylcbnZhciB1bmljb2RlV2hpdGVzcGFjZSA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci91bmljb2RlLXdoaXRlc3BhY2UnKVxuXG52YXIgd3d3ID0ge3Rva2VuaXplOiB0b2tlbml6ZVd3dywgcGFydGlhbDogdHJ1ZX1cbnZhciBkb21haW4gPSB7dG9rZW5pemU6IHRva2VuaXplRG9tYWluLCBwYXJ0aWFsOiB0cnVlfVxudmFyIHBhdGggPSB7dG9rZW5pemU6IHRva2VuaXplUGF0aCwgcGFydGlhbDogdHJ1ZX1cbnZhciBwdW5jdHVhdGlvbiA9IHt0b2tlbml6ZTogdG9rZW5pemVQdW5jdHVhdGlvbiwgcGFydGlhbDogdHJ1ZX1cbnZhciBuYW1lZENoYXJhY3RlclJlZmVyZW5jZSA9IHtcbiAgdG9rZW5pemU6IHRva2VuaXplTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2UsXG4gIHBhcnRpYWw6IHRydWVcbn1cblxudmFyIHd3d0F1dG9saW5rID0ge3Rva2VuaXplOiB0b2tlbml6ZVd3d0F1dG9saW5rLCBwcmV2aW91czogcHJldmlvdXNXd3d9XG52YXIgaHR0cEF1dG9saW5rID0ge3Rva2VuaXplOiB0b2tlbml6ZUh0dHBBdXRvbGluaywgcHJldmlvdXM6IHByZXZpb3VzSHR0cH1cbnZhciBlbWFpbEF1dG9saW5rID0ge3Rva2VuaXplOiB0b2tlbml6ZUVtYWlsQXV0b2xpbmssIHByZXZpb3VzOiBwcmV2aW91c0VtYWlsfVxuXG52YXIgdGV4dCA9IHt9XG5cbi8vIEV4cG9ydCBob29rZWQgY29uc3RydWN0cy5cbmV4cG9ydHMudGV4dCA9IHRleHRcblxuLy8gYDBgXG52YXIgY29kZSA9IDQ4XG5cbi8vIFdoaWxlIHRoZSBjb2RlIGlzIHNtYWxsZXIgdGhhbiBge2AuXG53aGlsZSAoY29kZSA8IDEyMykge1xuICB0ZXh0W2NvZGVdID0gZW1haWxBdXRvbGlua1xuICBjb2RlKytcbiAgLy8gSnVtcCBmcm9tIGA6YCAtPiBgQWBcbiAgaWYgKGNvZGUgPT09IDU4KSBjb2RlID0gNjVcbiAgLy8gSnVtcCBmcm9tIGBbYCAtPiBgYWBcbiAgZWxzZSBpZiAoY29kZSA9PT0gOTEpIGNvZGUgPSA5N1xufVxuXG4vLyBgK2BcbnRleHRbNDNdID0gZW1haWxBdXRvbGlua1xuLy8gYC1gXG50ZXh0WzQ1XSA9IGVtYWlsQXV0b2xpbmtcbi8vIGAuYFxudGV4dFs0Nl0gPSBlbWFpbEF1dG9saW5rXG4vLyBgX2BcbnRleHRbOTVdID0gZW1haWxBdXRvbGlua1xuLy8gYGhgLlxudGV4dFs3Ml0gPSBbZW1haWxBdXRvbGluaywgaHR0cEF1dG9saW5rXVxudGV4dFsxMDRdID0gW2VtYWlsQXV0b2xpbmssIGh0dHBBdXRvbGlua11cbi8vIGB3YC5cbnRleHRbODddID0gW2VtYWlsQXV0b2xpbmssIHd3d0F1dG9saW5rXVxudGV4dFsxMTldID0gW2VtYWlsQXV0b2xpbmssIHd3d0F1dG9saW5rXVxuXG5mdW5jdGlvbiB0b2tlbml6ZUVtYWlsQXV0b2xpbmsoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIGhhc0RvdFxuXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIGhvb2tzLiAqL1xuICAgIGlmIChcbiAgICAgICFnZm1BdGV4dChjb2RlKSB8fFxuICAgICAgIXByZXZpb3VzRW1haWwoc2VsZi5wcmV2aW91cykgfHxcbiAgICAgIHByZXZpb3VzKHNlbGYuZXZlbnRzKVxuICAgICkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuZW50ZXIoJ2xpdGVyYWxBdXRvbGluaycpXG4gICAgZWZmZWN0cy5lbnRlcignbGl0ZXJhbEF1dG9saW5rRW1haWwnKVxuICAgIHJldHVybiBhdGV4dChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYXRleHQoY29kZSkge1xuICAgIGlmIChnZm1BdGV4dChjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gYXRleHRcbiAgICB9XG5cbiAgICAvLyBgQGBcbiAgICBpZiAoY29kZSA9PT0gNjQpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGxhYmVsXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gbGFiZWwoY29kZSkge1xuICAgIC8vIGAuYFxuICAgIGlmIChjb2RlID09PSA0Nikge1xuICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2socHVuY3R1YXRpb24sIGRvbmUsIGRvdENvbnRpbnVhdGlvbikoY29kZSlcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAvLyBgLWBcbiAgICAgIGNvZGUgPT09IDQ1IHx8XG4gICAgICAvLyBgX2BcbiAgICAgIGNvZGUgPT09IDk1XG4gICAgKSB7XG4gICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhwdW5jdHVhdGlvbiwgbm9rLCBkYXNoT3JVbmRlcnNjb3JlQ29udGludWF0aW9uKShjb2RlKVxuICAgIH1cblxuICAgIGlmIChhc2NpaUFscGhhbnVtZXJpYyhjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gbGFiZWxcbiAgICB9XG5cbiAgICByZXR1cm4gZG9uZShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZG90Q29udGludWF0aW9uKGNvZGUpIHtcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBoYXNEb3QgPSB0cnVlXG4gICAgcmV0dXJuIGxhYmVsXG4gIH1cblxuICBmdW5jdGlvbiBkYXNoT3JVbmRlcnNjb3JlQ29udGludWF0aW9uKGNvZGUpIHtcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gYWZ0ZXJEYXNoT3JVbmRlcnNjb3JlXG4gIH1cblxuICBmdW5jdGlvbiBhZnRlckRhc2hPclVuZGVyc2NvcmUoY29kZSkge1xuICAgIC8vIGAuYFxuICAgIGlmIChjb2RlID09PSA0Nikge1xuICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2socHVuY3R1YXRpb24sIG5vaywgZG90Q29udGludWF0aW9uKShjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBsYWJlbChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZG9uZShjb2RlKSB7XG4gICAgaWYgKGhhc0RvdCkge1xuICAgICAgZWZmZWN0cy5leGl0KCdsaXRlcmFsQXV0b2xpbmtFbWFpbCcpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2xpdGVyYWxBdXRvbGluaycpXG4gICAgICByZXR1cm4gb2soY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5pemVXd3dBdXRvbGluayhlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIGhvb2tzLiAqL1xuICAgIGlmIChcbiAgICAgIChjb2RlICE9PSA4NyAmJiBjb2RlIC0gMzIgIT09IDg3KSB8fFxuICAgICAgIXByZXZpb3VzV3d3KHNlbGYucHJldmlvdXMpIHx8XG4gICAgICBwcmV2aW91cyhzZWxmLmV2ZW50cylcbiAgICApIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmVudGVyKCdsaXRlcmFsQXV0b2xpbmsnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2xpdGVyYWxBdXRvbGlua1d3dycpXG4gICAgLy8gRm9yIGB3d3cuYCB3ZSBjaGVjayBpbnN0ZWFkIG9mIGF0dGVtcHQsIGJlY2F1c2Ugd2hlbiBpdCBtYXRjaGVzLCBHSFxuICAgIC8vIHRyZWF0cyBpdCBhcyBwYXJ0IG9mIGEgZG9tYWluICh5ZXMsIGl0IHNheXMgYSB2YWxpZCBkb21haW4gbXVzdCBjb21lXG4gICAgLy8gYWZ0ZXIgYHd3dy5gLCBidXQgdGhhdFx1MjAxOXMgbm90IGhvdyBpdFx1MjAxOXMgaW1wbGVtZW50ZWQgYnkgdGhlbSkuXG4gICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soXG4gICAgICB3d3csXG4gICAgICBlZmZlY3RzLmF0dGVtcHQoZG9tYWluLCBlZmZlY3RzLmF0dGVtcHQocGF0aCwgZG9uZSksIG5vayksXG4gICAgICBub2tcbiAgICApKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBkb25lKGNvZGUpIHtcbiAgICBlZmZlY3RzLmV4aXQoJ2xpdGVyYWxBdXRvbGlua1d3dycpXG4gICAgZWZmZWN0cy5leGl0KCdsaXRlcmFsQXV0b2xpbmsnKVxuICAgIHJldHVybiBvayhjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplSHR0cEF1dG9saW5rKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gaG9va3MuICovXG4gICAgaWYgKFxuICAgICAgKGNvZGUgIT09IDcyICYmIGNvZGUgLSAzMiAhPT0gNzIpIHx8XG4gICAgICAhcHJldmlvdXNIdHRwKHNlbGYucHJldmlvdXMpIHx8XG4gICAgICBwcmV2aW91cyhzZWxmLmV2ZW50cylcbiAgICApIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmVudGVyKCdsaXRlcmFsQXV0b2xpbmsnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2xpdGVyYWxBdXRvbGlua0h0dHAnKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiB0MVxuICB9XG5cbiAgZnVuY3Rpb24gdDEoY29kZSkge1xuICAgIC8vIGB0YFxuICAgIGlmIChjb2RlID09PSA4NCB8fCBjb2RlIC0gMzIgPT09IDg0KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB0MlxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHQyKGNvZGUpIHtcbiAgICAvLyBgdGBcbiAgICBpZiAoY29kZSA9PT0gODQgfHwgY29kZSAtIDMyID09PSA4NCkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gcFxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHAoY29kZSkge1xuICAgIC8vIGBwYFxuICAgIGlmIChjb2RlID09PSA4MCB8fCBjb2RlIC0gMzIgPT09IDgwKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBzXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gcyhjb2RlKSB7XG4gICAgLy8gYHNgXG4gICAgaWYgKGNvZGUgPT09IDgzIHx8IGNvZGUgLSAzMiA9PT0gODMpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbG9uXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbG9uKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb2xvbihjb2RlKSB7XG4gICAgLy8gYDpgXG4gICAgaWYgKGNvZGUgPT09IDU4KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBzbGFzaDFcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBzbGFzaDEoY29kZSkge1xuICAgIC8vIGAvYFxuICAgIGlmIChjb2RlID09PSA0Nykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gc2xhc2gyXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gc2xhc2gyKGNvZGUpIHtcbiAgICAvLyBgL2BcbiAgICBpZiAoY29kZSA9PT0gNDcpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGFmdGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYWZ0ZXIoY29kZSkge1xuICAgIHJldHVybiBhc2NpaUNvbnRyb2woY29kZSkgfHxcbiAgICAgIHVuaWNvZGVXaGl0ZXNwYWNlKGNvZGUpIHx8XG4gICAgICB1bmljb2RlUHVuY3R1YXRpb24oY29kZSlcbiAgICAgID8gbm9rKGNvZGUpXG4gICAgICA6IGVmZmVjdHMuYXR0ZW1wdChkb21haW4sIGVmZmVjdHMuYXR0ZW1wdChwYXRoLCBkb25lKSwgbm9rKShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZG9uZShjb2RlKSB7XG4gICAgZWZmZWN0cy5leGl0KCdsaXRlcmFsQXV0b2xpbmtIdHRwJylcbiAgICBlZmZlY3RzLmV4aXQoJ2xpdGVyYWxBdXRvbGluaycpXG4gICAgcmV0dXJuIG9rKGNvZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5pemVXd3coZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgLy8gQXNzdW1lIGEgYHdgLlxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiB3MlxuICB9XG5cbiAgZnVuY3Rpb24gdzIoY29kZSkge1xuICAgIC8vIGB3YFxuICAgIGlmIChjb2RlID09PSA4NyB8fCBjb2RlIC0gMzIgPT09IDg3KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB3M1xuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHczKGNvZGUpIHtcbiAgICAvLyBgd2BcbiAgICBpZiAoY29kZSA9PT0gODcgfHwgY29kZSAtIDMyID09PSA4Nykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gZG90XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZG90KGNvZGUpIHtcbiAgICAvLyBgLmBcbiAgICBpZiAoY29kZSA9PT0gNDYpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGFmdGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYWZ0ZXIoY29kZSkge1xuICAgIHJldHVybiBjb2RlID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSA/IG5vayhjb2RlKSA6IG9rKGNvZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5pemVEb21haW4oZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgaGFzVW5kZXJzY29yZUluTGFzdFNlZ21lbnRcbiAgdmFyIGhhc1VuZGVyc2NvcmVJbkxhc3RMYXN0U2VnbWVudFxuXG4gIHJldHVybiBkb21haW5cblxuICBmdW5jdGlvbiBkb21haW4oY29kZSkge1xuICAgIC8vIGAmYFxuICAgIGlmIChjb2RlID09PSAzOCkge1xuICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soXG4gICAgICAgIG5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlLFxuICAgICAgICBkb25lLFxuICAgICAgICBwdW5jdHVhdGlvbkNvbnRpbnVhdGlvblxuICAgICAgKShjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA0NiAvKiBgLmAgKi8gfHwgY29kZSA9PT0gOTUgLyogYF9gICovKSB7XG4gICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhwdW5jdHVhdGlvbiwgZG9uZSwgcHVuY3R1YXRpb25Db250aW51YXRpb24pKGNvZGUpXG4gICAgfVxuXG4gICAgLy8gR0ggZG9jdW1lbnRzIHRoYXQgb25seSBhbHBoYW51bWVyaWNzIChvdGhlciB0aGFuIGAtYCwgYC5gLCBhbmQgYF9gKSBjYW5cbiAgICAvLyBvY2N1ciwgd2hpY2ggc291bmRzIGxpa2UgQVNDSUkgb25seSwgYnV0IHRoZXkgYWxzbyBzdXBwb3J0IGB3d3cuXHU5RURFXHU3NzBCLmNvbWAsXG4gICAgLy8gc28gdGhhdFx1MjAxOXMgVW5pY29kZS5cbiAgICAvLyBJbnN0ZWFkIG9mIHNvbWUgbmV3IHByb2R1Y3Rpb24gZm9yIFVuaWNvZGUgYWxwaGFudW1lcmljcywgbWFya2Rvd25cbiAgICAvLyBhbHJlYWR5IGhhcyB0aGF0IGZvciBVbmljb2RlIHB1bmN0dWF0aW9uIGFuZCB3aGl0ZXNwYWNlLCBzbyB1c2UgdGhvc2UuXG4gICAgaWYgKFxuICAgICAgYXNjaWlDb250cm9sKGNvZGUpIHx8XG4gICAgICB1bmljb2RlV2hpdGVzcGFjZShjb2RlKSB8fFxuICAgICAgKGNvZGUgIT09IDQ1IC8qIGAtYCAqLyAmJiB1bmljb2RlUHVuY3R1YXRpb24oY29kZSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZG9uZShjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBkb21haW5cbiAgfVxuXG4gIGZ1bmN0aW9uIHB1bmN0dWF0aW9uQ29udGludWF0aW9uKGNvZGUpIHtcbiAgICAvLyBgLmBcbiAgICBpZiAoY29kZSA9PT0gNDYpIHtcbiAgICAgIGhhc1VuZGVyc2NvcmVJbkxhc3RMYXN0U2VnbWVudCA9IGhhc1VuZGVyc2NvcmVJbkxhc3RTZWdtZW50XG4gICAgICBoYXNVbmRlcnNjb3JlSW5MYXN0U2VnbWVudCA9IHVuZGVmaW5lZFxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gZG9tYWluXG4gICAgfVxuXG4gICAgLy8gYF9gXG4gICAgaWYgKGNvZGUgPT09IDk1KSBoYXNVbmRlcnNjb3JlSW5MYXN0U2VnbWVudCA9IHRydWVcblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBkb21haW5cbiAgfVxuXG4gIGZ1bmN0aW9uIGRvbmUoY29kZSkge1xuICAgIGlmICghaGFzVW5kZXJzY29yZUluTGFzdExhc3RTZWdtZW50ICYmICFoYXNVbmRlcnNjb3JlSW5MYXN0U2VnbWVudCkge1xuICAgICAgcmV0dXJuIG9rKGNvZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplUGF0aChlZmZlY3RzLCBvaykge1xuICB2YXIgYmFsYW5jZSA9IDBcblxuICByZXR1cm4gaW5QYXRoXG5cbiAgZnVuY3Rpb24gaW5QYXRoKGNvZGUpIHtcbiAgICAvLyBgJmBcbiAgICBpZiAoY29kZSA9PT0gMzgpIHtcbiAgICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKFxuICAgICAgICBuYW1lZENoYXJhY3RlclJlZmVyZW5jZSxcbiAgICAgICAgb2ssXG4gICAgICAgIGNvbnRpbnVlZFB1bmN0dWF0aW9uXG4gICAgICApKGNvZGUpXG4gICAgfVxuXG4gICAgLy8gYChgXG4gICAgaWYgKGNvZGUgPT09IDQwKSB7XG4gICAgICBiYWxhbmNlKytcbiAgICB9XG5cbiAgICAvLyBgKWBcbiAgICBpZiAoY29kZSA9PT0gNDEpIHtcbiAgICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKFxuICAgICAgICBwdW5jdHVhdGlvbixcbiAgICAgICAgcGFyZW5BdFBhdGhFbmQsXG4gICAgICAgIGNvbnRpbnVlZFB1bmN0dWF0aW9uXG4gICAgICApKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKHBhdGhFbmQoY29kZSkpIHtcbiAgICAgIHJldHVybiBvayhjb2RlKVxuICAgIH1cblxuICAgIGlmICh0cmFpbGluZ1B1bmN0dWF0aW9uKGNvZGUpKSB7XG4gICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhwdW5jdHVhdGlvbiwgb2ssIGNvbnRpbnVlZFB1bmN0dWF0aW9uKShjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBpblBhdGhcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRpbnVlZFB1bmN0dWF0aW9uKGNvZGUpIHtcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gaW5QYXRoXG4gIH1cblxuICBmdW5jdGlvbiBwYXJlbkF0UGF0aEVuZChjb2RlKSB7XG4gICAgYmFsYW5jZS0tXG4gICAgcmV0dXJuIGJhbGFuY2UgPCAwID8gb2soY29kZSkgOiBjb250aW51ZWRQdW5jdHVhdGlvbihjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2UoZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgLy8gQXNzdW1lIGFuIGFtcGVyc2FuZC5cbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gaW5zaWRlXG4gIH1cblxuICBmdW5jdGlvbiBpbnNpZGUoY29kZSkge1xuICAgIGlmIChhc2NpaUFscGhhKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBpbnNpZGVcbiAgICB9XG5cbiAgICAvLyBgO2BcbiAgICBpZiAoY29kZSA9PT0gNTkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGFmdGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYWZ0ZXIoY29kZSkge1xuICAgIC8vIElmIHRoZSBuYW1lZCBjaGFyYWN0ZXIgcmVmZXJlbmNlIGlzIGZvbGxvd2VkIGJ5IHRoZSBlbmQgb2YgdGhlIHBhdGgsIGl0XHUyMDE5c1xuICAgIC8vIG5vdCBjb250aW51ZWQgcHVuY3R1YXRpb24uXG4gICAgcmV0dXJuIHBhdGhFbmQoY29kZSkgPyBvayhjb2RlKSA6IG5vayhjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplUHVuY3R1YXRpb24oZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgLy8gQWx3YXlzIGEgdmFsaWQgdHJhaWxpbmcgcHVuY3R1YXRpb24gbWFya2VyLlxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBhZnRlclxuICB9XG5cbiAgZnVuY3Rpb24gYWZ0ZXIoY29kZSkge1xuICAgIC8vIENoZWNrIHRoZSBuZXh0LlxuICAgIGlmICh0cmFpbGluZ1B1bmN0dWF0aW9uKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBhZnRlclxuICAgIH1cblxuICAgIC8vIElmIHRoZSBwdW5jdHVhdGlvbiBtYXJrZXIgaXMgZm9sbG93ZWQgYnkgdGhlIGVuZCBvZiB0aGUgcGF0aCwgaXRcdTIwMTlzIG5vdFxuICAgIC8vIGNvbnRpbnVlZCBwdW5jdHVhdGlvbi5cbiAgICByZXR1cm4gcGF0aEVuZChjb2RlKSA/IG9rKGNvZGUpIDogbm9rKGNvZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJhaWxpbmdQdW5jdHVhdGlvbihjb2RlKSB7XG4gIHJldHVybiAoXG4gICAgLy8gYCFgXG4gICAgY29kZSA9PT0gMzMgfHxcbiAgICAvLyBgXCJgXG4gICAgY29kZSA9PT0gMzQgfHxcbiAgICAvLyBgJ2BcbiAgICBjb2RlID09PSAzOSB8fFxuICAgIC8vIGApYFxuICAgIGNvZGUgPT09IDQxIHx8XG4gICAgLy8gYCpgXG4gICAgY29kZSA9PT0gNDIgfHxcbiAgICAvLyBgLGBcbiAgICBjb2RlID09PSA0NCB8fFxuICAgIC8vIGAuYFxuICAgIGNvZGUgPT09IDQ2IHx8XG4gICAgLy8gYDpgXG4gICAgY29kZSA9PT0gNTggfHxcbiAgICAvLyBgO2BcbiAgICBjb2RlID09PSA1OSB8fFxuICAgIC8vIGA8YFxuICAgIGNvZGUgPT09IDYwIHx8XG4gICAgLy8gYD9gXG4gICAgY29kZSA9PT0gNjMgfHxcbiAgICAvLyBgX2AuXG4gICAgY29kZSA9PT0gOTUgfHxcbiAgICAvLyBgfmBcbiAgICBjb2RlID09PSAxMjZcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXRoRW5kKGNvZGUpIHtcbiAgcmV0dXJuIChcbiAgICAvLyBFT0YuXG4gICAgY29kZSA9PT0gbnVsbCB8fFxuICAgIC8vIENSLCBMRiwgQ1JMRiwgSFQsIFZTLlxuICAgIGNvZGUgPCAwIHx8XG4gICAgLy8gU3BhY2UuXG4gICAgY29kZSA9PT0gMzIgfHxcbiAgICAvLyBgPGBcbiAgICBjb2RlID09PSA2MFxuICApXG59XG5cbmZ1bmN0aW9uIGdmbUF0ZXh0KGNvZGUpIHtcbiAgcmV0dXJuIChcbiAgICBjb2RlID09PSA0MyAvKiBgK2AgKi8gfHxcbiAgICBjb2RlID09PSA0NSAvKiBgLWAgKi8gfHxcbiAgICBjb2RlID09PSA0NiAvKiBgLmAgKi8gfHxcbiAgICBjb2RlID09PSA5NSAvKiBgX2AgKi8gfHxcbiAgICBhc2NpaUFscGhhbnVtZXJpYyhjb2RlKVxuICApXG59XG5cbmZ1bmN0aW9uIHByZXZpb3VzV3d3KGNvZGUpIHtcbiAgcmV0dXJuIChcbiAgICBjb2RlID09PSBudWxsIHx8XG4gICAgY29kZSA8IDAgfHxcbiAgICBjb2RlID09PSAzMiAvKiBgIGAgKi8gfHxcbiAgICBjb2RlID09PSA0MCAvKiBgKGAgKi8gfHxcbiAgICBjb2RlID09PSA0MiAvKiBgKmAgKi8gfHxcbiAgICBjb2RlID09PSA5NSAvKiBgX2AgKi8gfHxcbiAgICBjb2RlID09PSAxMjYgLyogYH5gICovXG4gIClcbn1cblxuZnVuY3Rpb24gcHJldmlvdXNIdHRwKGNvZGUpIHtcbiAgcmV0dXJuIGNvZGUgPT09IG51bGwgfHwgIWFzY2lpQWxwaGEoY29kZSlcbn1cblxuZnVuY3Rpb24gcHJldmlvdXNFbWFpbChjb2RlKSB7XG4gIHJldHVybiBjb2RlICE9PSA0NyAvKiBgL2AgKi8gJiYgcHJldmlvdXNIdHRwKGNvZGUpXG59XG5cbmZ1bmN0aW9uIHByZXZpb3VzKGV2ZW50cykge1xuICB2YXIgaW5kZXggPSBldmVudHMubGVuZ3RoXG5cbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICBpZiAoXG4gICAgICAoZXZlbnRzW2luZGV4XVsxXS50eXBlID09PSAnbGFiZWxMaW5rJyB8fFxuICAgICAgICBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdsYWJlbEltYWdlJykgJiZcbiAgICAgICFldmVudHNbaW5kZXhdWzFdLl9iYWxhbmNlZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbn1cbiIsICJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vc3ludGF4JylcbiIsICJtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVxuXG52YXIgY2xhc3NpZnlDaGFyYWN0ZXIgPSByZXF1aXJlKCdtaWNyb21hcmsvZGlzdC91dGlsL2NsYXNzaWZ5LWNoYXJhY3RlcicpXG52YXIgY2h1bmtlZFNwbGljZSA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L3V0aWwvY2h1bmtlZC1zcGxpY2UnKVxudmFyIHJlc29sdmVBbGwgPSByZXF1aXJlKCdtaWNyb21hcmsvZGlzdC91dGlsL3Jlc29sdmUtYWxsJylcbnZhciBzaGFsbG93ID0gcmVxdWlyZSgnbWljcm9tYXJrL2Rpc3QvdXRpbC9zaGFsbG93JylcblxuZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpIHtcbiAgdmFyIHNldHRpbmdzID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgc2luZ2xlID0gc2V0dGluZ3Muc2luZ2xlVGlsZGVcbiAgdmFyIHRva2VuaXplciA9IHtcbiAgICB0b2tlbml6ZTogdG9rZW5pemVTdHJpa2V0aHJvdWdoLFxuICAgIHJlc29sdmVBbGw6IHJlc29sdmVBbGxTdHJpa2V0aHJvdWdoXG4gIH1cblxuICBpZiAoc2luZ2xlID09PSBudWxsIHx8IHNpbmdsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc2luZ2xlID0gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIHt0ZXh0OiB7MTI2OiB0b2tlbml6ZXJ9LCBpbnNpZGVTcGFuOiB7bnVsbDogdG9rZW5pemVyfX1cblxuICAvLyBUYWtlIGV2ZW50cyBhbmQgcmVzb2x2ZSBzdHJpa2V0aHJvdWdoLlxuICBmdW5jdGlvbiByZXNvbHZlQWxsU3RyaWtldGhyb3VnaChldmVudHMsIGNvbnRleHQpIHtcbiAgICB2YXIgaW5kZXggPSAtMVxuICAgIHZhciBzdHJpa2V0aHJvdWdoXG4gICAgdmFyIHRleHRcbiAgICB2YXIgb3BlblxuICAgIHZhciBuZXh0RXZlbnRzXG5cbiAgICAvLyBXYWxrIHRocm91Z2ggYWxsIGV2ZW50cy5cbiAgICB3aGlsZSAoKytpbmRleCA8IGV2ZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIEZpbmQgYSB0b2tlbiB0aGF0IGNhbiBjbG9zZS5cbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJyAmJlxuICAgICAgICBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdzdHJpa2V0aHJvdWdoU2VxdWVuY2VUZW1wb3JhcnknICYmXG4gICAgICAgIGV2ZW50c1tpbmRleF1bMV0uX2Nsb3NlXG4gICAgICApIHtcbiAgICAgICAgb3BlbiA9IGluZGV4XG5cbiAgICAgICAgLy8gTm93IHdhbGsgYmFjayB0byBmaW5kIGFuIG9wZW5lci5cbiAgICAgICAgd2hpbGUgKG9wZW4tLSkge1xuICAgICAgICAgIC8vIEZpbmQgYSB0b2tlbiB0aGF0IGNhbiBvcGVuIHRoZSBjbG9zZXIuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXZlbnRzW29wZW5dWzBdID09PSAnZXhpdCcgJiZcbiAgICAgICAgICAgIGV2ZW50c1tvcGVuXVsxXS50eXBlID09PSAnc3RyaWtldGhyb3VnaFNlcXVlbmNlVGVtcG9yYXJ5JyAmJlxuICAgICAgICAgICAgZXZlbnRzW29wZW5dWzFdLl9vcGVuICYmXG4gICAgICAgICAgICAvLyBJZiB0aGUgc2l6ZXMgYXJlIHRoZSBzYW1lOlxuICAgICAgICAgICAgZXZlbnRzW2luZGV4XVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW2luZGV4XVsxXS5zdGFydC5vZmZzZXQgPT09XG4gICAgICAgICAgICAgIGV2ZW50c1tvcGVuXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW29wZW5dWzFdLnN0YXJ0Lm9mZnNldFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZXZlbnRzW2luZGV4XVsxXS50eXBlID0gJ3N0cmlrZXRocm91Z2hTZXF1ZW5jZSdcbiAgICAgICAgICAgIGV2ZW50c1tvcGVuXVsxXS50eXBlID0gJ3N0cmlrZXRocm91Z2hTZXF1ZW5jZSdcblxuICAgICAgICAgICAgc3RyaWtldGhyb3VnaCA9IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N0cmlrZXRocm91Z2gnLFxuICAgICAgICAgICAgICBzdGFydDogc2hhbGxvdyhldmVudHNbb3Blbl1bMV0uc3RhcnQpLFxuICAgICAgICAgICAgICBlbmQ6IHNoYWxsb3coZXZlbnRzW2luZGV4XVsxXS5lbmQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRleHQgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdzdHJpa2V0aHJvdWdoVGV4dCcsXG4gICAgICAgICAgICAgIHN0YXJ0OiBzaGFsbG93KGV2ZW50c1tvcGVuXVsxXS5lbmQpLFxuICAgICAgICAgICAgICBlbmQ6IHNoYWxsb3coZXZlbnRzW2luZGV4XVsxXS5zdGFydClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT3BlbmluZy5cbiAgICAgICAgICAgIG5leHRFdmVudHMgPSBbXG4gICAgICAgICAgICAgIFsnZW50ZXInLCBzdHJpa2V0aHJvdWdoLCBjb250ZXh0XSxcbiAgICAgICAgICAgICAgWydlbnRlcicsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dF0sXG4gICAgICAgICAgICAgIFsnZXhpdCcsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dF0sXG4gICAgICAgICAgICAgIFsnZW50ZXInLCB0ZXh0LCBjb250ZXh0XVxuICAgICAgICAgICAgXVxuXG4gICAgICAgICAgICAvLyBCZXR3ZWVuLlxuICAgICAgICAgICAgY2h1bmtlZFNwbGljZShcbiAgICAgICAgICAgICAgbmV4dEV2ZW50cyxcbiAgICAgICAgICAgICAgbmV4dEV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIHJlc29sdmVBbGwoXG4gICAgICAgICAgICAgICAgY29udGV4dC5wYXJzZXIuY29uc3RydWN0cy5pbnNpZGVTcGFuLm51bGwsXG4gICAgICAgICAgICAgICAgZXZlbnRzLnNsaWNlKG9wZW4gKyAxLCBpbmRleCksXG4gICAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIC8vIENsb3NpbmcuXG4gICAgICAgICAgICBjaHVua2VkU3BsaWNlKG5leHRFdmVudHMsIG5leHRFdmVudHMubGVuZ3RoLCAwLCBbXG4gICAgICAgICAgICAgIFsnZXhpdCcsIHRleHQsIGNvbnRleHRdLFxuICAgICAgICAgICAgICBbJ2VudGVyJywgZXZlbnRzW2luZGV4XVsxXSwgY29udGV4dF0sXG4gICAgICAgICAgICAgIFsnZXhpdCcsIGV2ZW50c1tpbmRleF1bMV0sIGNvbnRleHRdLFxuICAgICAgICAgICAgICBbJ2V4aXQnLCBzdHJpa2V0aHJvdWdoLCBjb250ZXh0XVxuICAgICAgICAgICAgXSlcblxuICAgICAgICAgICAgY2h1bmtlZFNwbGljZShldmVudHMsIG9wZW4gLSAxLCBpbmRleCAtIG9wZW4gKyAzLCBuZXh0RXZlbnRzKVxuXG4gICAgICAgICAgICBpbmRleCA9IG9wZW4gKyBuZXh0RXZlbnRzLmxlbmd0aCAtIDJcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbW92ZVJlbWFpbmluZ1NlcXVlbmNlcyhldmVudHMpXG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVSZW1haW5pbmdTZXF1ZW5jZXMoZXZlbnRzKSB7XG4gICAgdmFyIGluZGV4ID0gLTFcbiAgICB2YXIgbGVuZ3RoID0gZXZlbnRzLmxlbmd0aFxuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdzdHJpa2V0aHJvdWdoU2VxdWVuY2VUZW1wb3JhcnknKSB7XG4gICAgICAgIGV2ZW50c1tpbmRleF1bMV0udHlwZSA9ICdkYXRhJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBldmVudHNcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuaXplU3RyaWtldGhyb3VnaChlZmZlY3RzLCBvaywgbm9rKSB7XG4gICAgdmFyIHByZXZpb3VzID0gdGhpcy5wcmV2aW91c1xuICAgIHZhciBldmVudHMgPSB0aGlzLmV2ZW50c1xuICAgIHZhciBzaXplID0gMFxuXG4gICAgcmV0dXJuIHN0YXJ0XG5cbiAgICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvZGUgIT09IDEyNiB8fFxuICAgICAgICAocHJldmlvdXMgPT09IDEyNiAmJlxuICAgICAgICAgIGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV1bMV0udHlwZSAhPT0gJ2NoYXJhY3RlckVzY2FwZScpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgICAgfVxuXG4gICAgICBlZmZlY3RzLmVudGVyKCdzdHJpa2V0aHJvdWdoU2VxdWVuY2VUZW1wb3JhcnknKVxuICAgICAgcmV0dXJuIG1vcmUoY29kZSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3JlKGNvZGUpIHtcbiAgICAgIHZhciBiZWZvcmUgPSBjbGFzc2lmeUNoYXJhY3RlcihwcmV2aW91cylcbiAgICAgIHZhciB0b2tlblxuICAgICAgdmFyIGFmdGVyXG5cbiAgICAgIGlmIChjb2RlID09PSAxMjYpIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgdGhpcmQgbWFya2VyLCBleGl0LlxuICAgICAgICBpZiAoc2l6ZSA+IDEpIHJldHVybiBub2soY29kZSlcbiAgICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICAgIHNpemUrK1xuICAgICAgICByZXR1cm4gbW9yZVxuICAgICAgfVxuXG4gICAgICBpZiAoc2l6ZSA8IDIgJiYgIXNpbmdsZSkgcmV0dXJuIG5vayhjb2RlKVxuICAgICAgdG9rZW4gPSBlZmZlY3RzLmV4aXQoJ3N0cmlrZXRocm91Z2hTZXF1ZW5jZVRlbXBvcmFyeScpXG4gICAgICBhZnRlciA9IGNsYXNzaWZ5Q2hhcmFjdGVyKGNvZGUpXG4gICAgICB0b2tlbi5fb3BlbiA9ICFhZnRlciB8fCAoYWZ0ZXIgPT09IDIgJiYgYmVmb3JlKVxuICAgICAgdG9rZW4uX2Nsb3NlID0gIWJlZm9yZSB8fCAoYmVmb3JlID09PSAyICYmIGFmdGVyKVxuICAgICAgcmV0dXJuIG9rKGNvZGUpXG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0cy5mbG93ID0ge1xuICBudWxsOiB7dG9rZW5pemU6IHRva2VuaXplVGFibGUsIHJlc29sdmU6IHJlc29sdmVUYWJsZSwgaW50ZXJydXB0aWJsZTogdHJ1ZX1cbn1cblxudmFyIGNyZWF0ZVNwYWNlID0gcmVxdWlyZSgnbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvZmFjdG9yeS1zcGFjZScpXG5cbnZhciBzZXRleHRVbmRlcmxpbmVNaW5pID0ge3Rva2VuaXplOiB0b2tlbml6ZVNldGV4dFVuZGVybGluZU1pbmksIHBhcnRpYWw6IHRydWV9XG52YXIgbmV4dFByZWZpeGVkT3JCbGFuayA9IHt0b2tlbml6ZTogdG9rZW5pemVOZXh0UHJlZml4ZWRPckJsYW5rLCBwYXJ0aWFsOiB0cnVlfVxuXG5mdW5jdGlvbiByZXNvbHZlVGFibGUoZXZlbnRzLCBjb250ZXh0KSB7XG4gIHZhciBsZW5ndGggPSBldmVudHMubGVuZ3RoXG4gIHZhciBpbmRleCA9IC0xXG4gIHZhciB0b2tlblxuICB2YXIgaW5IZWFkXG4gIHZhciBpbkRlbGltaXRlclJvd1xuICB2YXIgaW5Sb3dcbiAgdmFyIGNlbGxcbiAgdmFyIGNvbnRlbnRcbiAgdmFyIHRleHRcbiAgdmFyIGNvbnRlbnRTdGFydFxuICB2YXIgY29udGVudEVuZFxuICB2YXIgY2VsbFN0YXJ0XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB0b2tlbiA9IGV2ZW50c1tpbmRleF1bMV1cblxuICAgIGlmIChpblJvdykge1xuICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICd0ZW1wb3JhcnlUYWJsZUNlbGxDb250ZW50Jykge1xuICAgICAgICBjb250ZW50U3RhcnQgPSBjb250ZW50U3RhcnQgfHwgaW5kZXhcbiAgICAgICAgY29udGVudEVuZCA9IGluZGV4XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgLy8gQ29tYmluZSBzZXBhcmF0ZSBjb250ZW50IHBhcnRzIGludG8gb25lLlxuICAgICAgICAodG9rZW4udHlwZSA9PT0gJ3RhYmxlQ2VsbERpdmlkZXInIHx8IHRva2VuLnR5cGUgPT09ICd0YWJsZVJvdycpICYmXG4gICAgICAgIGNvbnRlbnRFbmRcbiAgICAgICkge1xuICAgICAgICBjb250ZW50ID0ge1xuICAgICAgICAgIHR5cGU6ICd0YWJsZUNvbnRlbnQnLFxuICAgICAgICAgIHN0YXJ0OiBldmVudHNbY29udGVudFN0YXJ0XVsxXS5zdGFydCxcbiAgICAgICAgICBlbmQ6IGV2ZW50c1tjb250ZW50RW5kXVsxXS5lbmRcbiAgICAgICAgfVxuICAgICAgICB0ZXh0ID0ge1xuICAgICAgICAgIHR5cGU6ICdjaHVua1RleHQnLFxuICAgICAgICAgIHN0YXJ0OiBjb250ZW50LnN0YXJ0LFxuICAgICAgICAgIGVuZDogY29udGVudC5lbmQsXG4gICAgICAgICAgY29udGVudFR5cGU6ICd0ZXh0J1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnRzLnNwbGljZShcbiAgICAgICAgICBjb250ZW50U3RhcnQsXG4gICAgICAgICAgY29udGVudEVuZCAtIGNvbnRlbnRTdGFydCArIDEsXG4gICAgICAgICAgWydlbnRlcicsIGNvbnRlbnQsIGNvbnRleHRdLFxuICAgICAgICAgIFsnZW50ZXInLCB0ZXh0LCBjb250ZXh0XSxcbiAgICAgICAgICBbJ2V4aXQnLCB0ZXh0LCBjb250ZXh0XSxcbiAgICAgICAgICBbJ2V4aXQnLCBjb250ZW50LCBjb250ZXh0XVxuICAgICAgICApXG4gICAgICAgIGluZGV4IC09IGNvbnRlbnRFbmQgLSBjb250ZW50U3RhcnQgLSAzXG4gICAgICAgIGxlbmd0aCA9IGV2ZW50cy5sZW5ndGhcbiAgICAgICAgY29udGVudFN0YXJ0ID0gdW5kZWZpbmVkXG4gICAgICAgIGNvbnRlbnRFbmQgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBldmVudHNbaW5kZXhdWzBdID09PSAnZXhpdCcgJiZcbiAgICAgIGNlbGxTdGFydCAmJlxuICAgICAgY2VsbFN0YXJ0ICsgMSA8IGluZGV4ICYmXG4gICAgICAodG9rZW4udHlwZSA9PT0gJ3RhYmxlQ2VsbERpdmlkZXInIHx8XG4gICAgICAgICh0b2tlbi50eXBlID09PSAndGFibGVSb3cnICYmXG4gICAgICAgICAgKGNlbGxTdGFydCArIDMgPCBpbmRleCB8fFxuICAgICAgICAgICAgZXZlbnRzW2NlbGxTdGFydF1bMV0udHlwZSAhPT0gJ3doaXRlc3BhY2UnKSkpXG4gICAgKSB7XG4gICAgICBjZWxsID0ge1xuICAgICAgICB0eXBlOiBpbkRlbGltaXRlclJvd1xuICAgICAgICAgID8gJ3RhYmxlRGVsaW1pdGVyJ1xuICAgICAgICAgIDogaW5IZWFkXG4gICAgICAgICAgPyAndGFibGVIZWFkZXInXG4gICAgICAgICAgOiAndGFibGVEYXRhJyxcbiAgICAgICAgc3RhcnQ6IGV2ZW50c1tjZWxsU3RhcnRdWzFdLnN0YXJ0LFxuICAgICAgICBlbmQ6IGV2ZW50c1tpbmRleF1bMV0uZW5kXG4gICAgICB9XG4gICAgICBldmVudHMuc3BsaWNlKGluZGV4ICsgKHRva2VuLnR5cGUgPT09ICd0YWJsZUNlbGxEaXZpZGVyJyA/IDEgOiAwKSwgMCwgW1xuICAgICAgICAnZXhpdCcsXG4gICAgICAgIGNlbGwsXG4gICAgICAgIGNvbnRleHRcbiAgICAgIF0pXG4gICAgICBldmVudHMuc3BsaWNlKGNlbGxTdGFydCwgMCwgWydlbnRlcicsIGNlbGwsIGNvbnRleHRdKVxuICAgICAgaW5kZXggKz0gMlxuICAgICAgbGVuZ3RoID0gZXZlbnRzLmxlbmd0aFxuICAgICAgY2VsbFN0YXJ0ID0gaW5kZXggKyAxXG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICd0YWJsZVJvdycpIHtcbiAgICAgIGluUm93ID0gZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJ1xuXG4gICAgICBpZiAoaW5Sb3cpIHtcbiAgICAgICAgY2VsbFN0YXJ0ID0gaW5kZXggKyAxXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICd0YWJsZURlbGltaXRlclJvdycpIHtcbiAgICAgIGluRGVsaW1pdGVyUm93ID0gZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJ1xuXG4gICAgICBpZiAoaW5EZWxpbWl0ZXJSb3cpIHtcbiAgICAgICAgY2VsbFN0YXJ0ID0gaW5kZXggKyAxXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICd0YWJsZUhlYWQnKSB7XG4gICAgICBpbkhlYWQgPSBldmVudHNbaW5kZXhdWzBdID09PSAnZW50ZXInXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50c1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZVRhYmxlKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIGFsaWduID0gW11cbiAgdmFyIHRhYmxlSGVhZGVyQ291bnQgPSAwXG4gIHZhciBzZWVuRGVsaW1pdGVyXG4gIHZhciBoYXNEYXNoXG5cbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIHVzZWQgdG8gYmUgcGFzc2VkIGluIGJldGEgbWljcm9tYXJrIHZlcnNpb25zLiAqL1xuICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IC01IHx8IGNvZGUgPT09IC00IHx8IGNvZGUgPT09IC0zKSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcigndGFibGUnKS5fYWxpZ24gPSBhbGlnblxuICAgIGVmZmVjdHMuZW50ZXIoJ3RhYmxlSGVhZCcpXG4gICAgZWZmZWN0cy5lbnRlcigndGFibGVSb3cnKVxuXG4gICAgLy8gSWYgd2Ugc3RhcnQgd2l0aCBhIHBpcGUsIHdlIG9wZW4gYSBjZWxsIG1hcmtlci5cbiAgICBpZiAoY29kZSA9PT0gMTI0KSB7XG4gICAgICByZXR1cm4gY2VsbERpdmlkZXJIZWFkKGNvZGUpXG4gICAgfVxuXG4gICAgdGFibGVIZWFkZXJDb3VudCsrXG4gICAgZWZmZWN0cy5lbnRlcigndGVtcG9yYXJ5VGFibGVDZWxsQ29udGVudCcpXG4gICAgLy8gQ2FuXHUyMDE5dCBiZSBzcGFjZSBvciBlb2xzIGF0IHRoZSBzdGFydCBvZiBhIGNvbnN0cnVjdCwgc28gd2VcdTIwMTlyZSBpbiBhIGNlbGwuXG4gICAgcmV0dXJuIGluQ2VsbENvbnRlbnRIZWFkKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjZWxsRGl2aWRlckhlYWQoY29kZSkge1xuICAgIC8vIEFsd2F5cyBhIHBpcGUuXG4gICAgZWZmZWN0cy5lbnRlcigndGFibGVDZWxsRGl2aWRlcicpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgZWZmZWN0cy5leGl0KCd0YWJsZUNlbGxEaXZpZGVyJylcbiAgICBzZWVuRGVsaW1pdGVyID0gdHJ1ZVxuICAgIHJldHVybiBjZWxsQnJlYWtIZWFkXG4gIH1cblxuICBmdW5jdGlvbiBjZWxsQnJlYWtIZWFkKGNvZGUpIHtcbiAgICAvLyBFT0YsIENSLCBMRiwgQ1JMRi5cbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSAtNSB8fCBjb2RlID09PSAtNCB8fCBjb2RlID09PSAtMykge1xuICAgICAgcmV0dXJuIGF0Um93RW5kSGVhZChjb2RlKVxuICAgIH1cblxuICAgIC8vIEhULCBWUywgU1AuXG4gICAgaWYgKGNvZGUgPT09IC0yIHx8IGNvZGUgPT09IC0xIHx8IGNvZGUgPT09IDMyKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd3aGl0ZXNwYWNlJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGluV2hpdGVzcGFjZUhlYWRcbiAgICB9XG5cbiAgICBpZiAoc2VlbkRlbGltaXRlcikge1xuICAgICAgc2VlbkRlbGltaXRlciA9IHVuZGVmaW5lZFxuICAgICAgdGFibGVIZWFkZXJDb3VudCsrXG4gICAgfVxuXG4gICAgLy8gYHxgXG4gICAgaWYgKGNvZGUgPT09IDEyNCkge1xuICAgICAgcmV0dXJuIGNlbGxEaXZpZGVySGVhZChjb2RlKVxuICAgIH1cblxuICAgIC8vIEFueXRoaW5nIGVsc2UgaXMgY2VsbCBjb250ZW50LlxuICAgIGVmZmVjdHMuZW50ZXIoJ3RlbXBvcmFyeVRhYmxlQ2VsbENvbnRlbnQnKVxuICAgIHJldHVybiBpbkNlbGxDb250ZW50SGVhZChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5XaGl0ZXNwYWNlSGVhZChjb2RlKSB7XG4gICAgLy8gSFQsIFZTLCBTUC5cbiAgICBpZiAoY29kZSA9PT0gLTIgfHwgY29kZSA9PT0gLTEgfHwgY29kZSA9PT0gMzIpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGluV2hpdGVzcGFjZUhlYWRcbiAgICB9XG5cbiAgICBlZmZlY3RzLmV4aXQoJ3doaXRlc3BhY2UnKVxuICAgIHJldHVybiBjZWxsQnJlYWtIZWFkKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBpbkNlbGxDb250ZW50SGVhZChjb2RlKSB7XG4gICAgLy8gRU9GLCB3aGl0ZXNwYWNlLCBwaXBlXG4gICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA8IDAgfHwgY29kZSA9PT0gMzIgfHwgY29kZSA9PT0gMTI0KSB7XG4gICAgICBlZmZlY3RzLmV4aXQoJ3RlbXBvcmFyeVRhYmxlQ2VsbENvbnRlbnQnKVxuICAgICAgcmV0dXJuIGNlbGxCcmVha0hlYWQoY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAvLyBgXFxgXG4gICAgcmV0dXJuIGNvZGUgPT09IDkyID8gaW5DZWxsQ29udGVudEVzY2FwZUhlYWQgOiBpbkNlbGxDb250ZW50SGVhZFxuICB9XG5cbiAgZnVuY3Rpb24gaW5DZWxsQ29udGVudEVzY2FwZUhlYWQoY29kZSkge1xuICAgIC8vIGBcXGAgb3IgYHxgXG4gICAgaWYgKGNvZGUgPT09IDkyIHx8IGNvZGUgPT09IDEyNCkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gaW5DZWxsQ29udGVudEhlYWRcbiAgICB9XG5cbiAgICAvLyBBbnl0aGluZyBlbHNlLlxuICAgIHJldHVybiBpbkNlbGxDb250ZW50SGVhZChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYXRSb3dFbmRIZWFkKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuZXhpdCgndGFibGVSb3cnKVxuICAgIGVmZmVjdHMuZXhpdCgndGFibGVIZWFkJylcblxuICAgIC8vIEFsd2F5cyBhIGxpbmUgZW5kaW5nLlxuICAgIGVmZmVjdHMuZW50ZXIoJ2xpbmVFbmRpbmcnKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgnbGluZUVuZGluZycpXG5cbiAgICAvLyBJZiBhIHNldGV4dCBoZWFkaW5nLCBleGl0LlxuICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKFxuICAgICAgc2V0ZXh0VW5kZXJsaW5lTWluaSxcbiAgICAgIG5vayxcbiAgICAgIC8vIFN1cHBvcnQgYW4gaW5kZW50IGJlZm9yZSB0aGUgZGVsaW1pdGVyIHJvdy5cbiAgICAgIGNyZWF0ZVNwYWNlKGVmZmVjdHMsIHJvd1N0YXJ0RGVsaW1pdGVyLCAnbGluZVByZWZpeCcsIDQpXG4gICAgKVxuICB9XG5cbiAgZnVuY3Rpb24gcm93U3RhcnREZWxpbWl0ZXIoY29kZSkge1xuICAgIC8vIElmIHRoZXJlXHUyMDE5cyBhbm90aGVyIHNwYWNlLCBvciB3ZVx1MjAxOXJlIGF0IHRoZSBFT0wvRU9GLCBleGl0LlxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPCAwIHx8IGNvZGUgPT09IDMyKSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcigndGFibGVEZWxpbWl0ZXJSb3cnKVxuICAgIHJldHVybiBhdERlbGltaXRlclJvd0JyZWFrKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBhdERlbGltaXRlclJvd0JyZWFrKGNvZGUpIHtcbiAgICAvLyBFT0YsIENSLCBMRiwgQ1JMRi5cbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSAtNSB8fCBjb2RlID09PSAtNCB8fCBjb2RlID09PSAtMykge1xuICAgICAgcmV0dXJuIHJvd0VuZERlbGltaXRlcihjb2RlKVxuICAgIH1cblxuICAgIC8vIEhULCBWUywgU1AuXG4gICAgaWYgKGNvZGUgPT09IC0yIHx8IGNvZGUgPT09IC0xIHx8IGNvZGUgPT09IDMyKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd3aGl0ZXNwYWNlJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGluV2hpdGVzcGFjZURlbGltaXRlclxuICAgIH1cblxuICAgIC8vIGAtYFxuICAgIGlmIChjb2RlID09PSA0NSkge1xuICAgICAgZWZmZWN0cy5lbnRlcigndGFibGVEZWxpbWl0ZXJGaWxsZXInKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBoYXNEYXNoID0gdHJ1ZVxuICAgICAgYWxpZ24ucHVzaChudWxsKVxuICAgICAgcmV0dXJuIGluRmlsbGVyRGVsaW1pdGVyXG4gICAgfVxuXG4gICAgLy8gYDpgXG4gICAgaWYgKGNvZGUgPT09IDU4KSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd0YWJsZURlbGltaXRlckFsaWdubWVudCcpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgndGFibGVEZWxpbWl0ZXJBbGlnbm1lbnQnKVxuICAgICAgYWxpZ24ucHVzaCgnbGVmdCcpXG4gICAgICByZXR1cm4gYWZ0ZXJMZWZ0QWxpZ25tZW50XG4gICAgfVxuXG4gICAgLy8gSWYgd2Ugc3RhcnQgd2l0aCBhIHBpcGUsIHdlIG9wZW4gYSBjZWxsIG1hcmtlci5cbiAgICBpZiAoY29kZSA9PT0gMTI0KSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd0YWJsZUNlbGxEaXZpZGVyJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCd0YWJsZUNlbGxEaXZpZGVyJylcbiAgICAgIHJldHVybiBhdERlbGltaXRlclJvd0JyZWFrXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5XaGl0ZXNwYWNlRGVsaW1pdGVyKGNvZGUpIHtcbiAgICAvLyBIVCwgVlMsIFNQLlxuICAgIGlmIChjb2RlID09PSAtMiB8fCBjb2RlID09PSAtMSB8fCBjb2RlID09PSAzMikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gaW5XaGl0ZXNwYWNlRGVsaW1pdGVyXG4gICAgfVxuXG4gICAgZWZmZWN0cy5leGl0KCd3aGl0ZXNwYWNlJylcbiAgICByZXR1cm4gYXREZWxpbWl0ZXJSb3dCcmVhayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5GaWxsZXJEZWxpbWl0ZXIoY29kZSkge1xuICAgIC8vIGAtYFxuICAgIGlmIChjb2RlID09PSA0NSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gaW5GaWxsZXJEZWxpbWl0ZXJcbiAgICB9XG5cbiAgICBlZmZlY3RzLmV4aXQoJ3RhYmxlRGVsaW1pdGVyRmlsbGVyJylcblxuICAgIC8vIGA6YFxuICAgIGlmIChjb2RlID09PSA1OCkge1xuICAgICAgZWZmZWN0cy5lbnRlcigndGFibGVEZWxpbWl0ZXJBbGlnbm1lbnQnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ3RhYmxlRGVsaW1pdGVyQWxpZ25tZW50JylcblxuICAgICAgYWxpZ25bYWxpZ24ubGVuZ3RoIC0gMV0gPVxuICAgICAgICBhbGlnblthbGlnbi5sZW5ndGggLSAxXSA9PT0gJ2xlZnQnID8gJ2NlbnRlcicgOiAncmlnaHQnXG5cbiAgICAgIHJldHVybiBhZnRlclJpZ2h0QWxpZ25tZW50XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0RGVsaW1pdGVyUm93QnJlYWsoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGFmdGVyTGVmdEFsaWdubWVudChjb2RlKSB7XG4gICAgLy8gYC1gXG4gICAgaWYgKGNvZGUgPT09IDQ1KSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd0YWJsZURlbGltaXRlckZpbGxlcicpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGhhc0Rhc2ggPSB0cnVlXG4gICAgICByZXR1cm4gaW5GaWxsZXJEZWxpbWl0ZXJcbiAgICB9XG5cbiAgICAvLyBBbnl0aGluZyBlbHNlIGlzIG5vdCBvay5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBhZnRlclJpZ2h0QWxpZ25tZW50KGNvZGUpIHtcbiAgICAvLyBFT0YsIENSLCBMRiwgQ1JMRi5cbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSAtNSB8fCBjb2RlID09PSAtNCB8fCBjb2RlID09PSAtMykge1xuICAgICAgcmV0dXJuIHJvd0VuZERlbGltaXRlcihjb2RlKVxuICAgIH1cblxuICAgIC8vIEhULCBWUywgU1AuXG4gICAgaWYgKGNvZGUgPT09IC0yIHx8IGNvZGUgPT09IC0xIHx8IGNvZGUgPT09IDMyKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd3aGl0ZXNwYWNlJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGluV2hpdGVzcGFjZURlbGltaXRlclxuICAgIH1cblxuICAgIC8vIGB8YFxuICAgIGlmIChjb2RlID09PSAxMjQpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ3RhYmxlQ2VsbERpdmlkZXInKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ3RhYmxlQ2VsbERpdmlkZXInKVxuICAgICAgcmV0dXJuIGF0RGVsaW1pdGVyUm93QnJlYWtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiByb3dFbmREZWxpbWl0ZXIoY29kZSkge1xuICAgIGVmZmVjdHMuZXhpdCgndGFibGVEZWxpbWl0ZXJSb3cnKVxuXG4gICAgLy8gRXhpdCBpZiB0aGVyZSB3YXMgbm8gZGFzaCBhdCBhbGwsIG9yIGlmIHRoZSBoZWFkZXIgY2VsbCBjb3VudCBpcyBub3QgdGhlXG4gICAgLy8gZGVsaW1pdGVyIGNlbGwgY291bnQuXG4gICAgaWYgKCFoYXNEYXNoIHx8IHRhYmxlSGVhZGVyQ291bnQgIT09IGFsaWduLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGFibGVDbG9zZShjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKG5leHRQcmVmaXhlZE9yQmxhbmssIHRhYmxlQ2xvc2UsIHRhYmxlQ29udGludWUpKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiB0YWJsZUNsb3NlKGNvZGUpIHtcbiAgICBlZmZlY3RzLmV4aXQoJ3RhYmxlJylcbiAgICByZXR1cm4gb2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhYmxlQ29udGludWUoY29kZSkge1xuICAgIC8vIEFsd2F5cyBhIGxpbmUgZW5kaW5nLlxuICAgIGVmZmVjdHMuZW50ZXIoJ2xpbmVFbmRpbmcnKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgnbGluZUVuZGluZycpXG4gICAgLy8gV2UgY2hlY2tlZCB0aGF0IGl0XHUyMDE5cyBub3QgYSBwcmVmaXhlZCBvciBibGFuayBsaW5lLCBzbyB3ZVx1MjAxOXJlIGNlcnRhaW4gYVxuICAgIC8vIGJvZHkgaXMgY29taW5nLCB0aG91Z2ggaXQgbWF5IGJlIGluZGVudGVkLlxuICAgIHJldHVybiBjcmVhdGVTcGFjZShlZmZlY3RzLCBib2R5U3RhcnQsICdsaW5lUHJlZml4JywgNClcbiAgfVxuXG4gIGZ1bmN0aW9uIGJvZHlTdGFydChjb2RlKSB7XG4gICAgZWZmZWN0cy5lbnRlcigndGFibGVCb2R5JylcbiAgICByZXR1cm4gcm93U3RhcnRCb2R5KGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiByb3dTdGFydEJvZHkoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ3RhYmxlUm93JylcblxuICAgIC8vIElmIHdlIHN0YXJ0IHdpdGggYSBwaXBlLCB3ZSBvcGVuIGEgY2VsbCBtYXJrZXIuXG4gICAgaWYgKGNvZGUgPT09IDEyNCkge1xuICAgICAgcmV0dXJuIGNlbGxEaXZpZGVyQm9keShjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuZW50ZXIoJ3RlbXBvcmFyeVRhYmxlQ2VsbENvbnRlbnQnKVxuICAgIC8vIENhblx1MjAxOXQgYmUgc3BhY2Ugb3IgZW9scyBhdCB0aGUgc3RhcnQgb2YgYSBjb25zdHJ1Y3QsIHNvIHdlXHUyMDE5cmUgaW4gYSBjZWxsLlxuICAgIHJldHVybiBpbkNlbGxDb250ZW50Qm9keShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY2VsbERpdmlkZXJCb2R5KGNvZGUpIHtcbiAgICAvLyBBbHdheXMgYSBwaXBlLlxuICAgIGVmZmVjdHMuZW50ZXIoJ3RhYmxlQ2VsbERpdmlkZXInKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgndGFibGVDZWxsRGl2aWRlcicpXG4gICAgcmV0dXJuIGNlbGxCcmVha0JvZHlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNlbGxCcmVha0JvZHkoY29kZSkge1xuICAgIC8vIEVPRiwgQ1IsIExGLCBDUkxGLlxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IC01IHx8IGNvZGUgPT09IC00IHx8IGNvZGUgPT09IC0zKSB7XG4gICAgICByZXR1cm4gYXRSb3dFbmRCb2R5KGNvZGUpXG4gICAgfVxuXG4gICAgLy8gSFQsIFZTLCBTUC5cbiAgICBpZiAoY29kZSA9PT0gLTIgfHwgY29kZSA9PT0gLTEgfHwgY29kZSA9PT0gMzIpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ3doaXRlc3BhY2UnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gaW5XaGl0ZXNwYWNlQm9keVxuICAgIH1cblxuICAgIC8vIGB8YFxuICAgIGlmIChjb2RlID09PSAxMjQpIHtcbiAgICAgIHJldHVybiBjZWxsRGl2aWRlckJvZHkoY29kZSlcbiAgICB9XG5cbiAgICAvLyBBbnl0aGluZyBlbHNlIGlzIGNlbGwgY29udGVudC5cbiAgICBlZmZlY3RzLmVudGVyKCd0ZW1wb3JhcnlUYWJsZUNlbGxDb250ZW50JylcbiAgICByZXR1cm4gaW5DZWxsQ29udGVudEJvZHkoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGluV2hpdGVzcGFjZUJvZHkoY29kZSkge1xuICAgIC8vIEhULCBWUywgU1AuXG4gICAgaWYgKGNvZGUgPT09IC0yIHx8IGNvZGUgPT09IC0xIHx8IGNvZGUgPT09IDMyKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBpbldoaXRlc3BhY2VCb2R5XG4gICAgfVxuXG4gICAgZWZmZWN0cy5leGl0KCd3aGl0ZXNwYWNlJylcbiAgICByZXR1cm4gY2VsbEJyZWFrQm9keShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5DZWxsQ29udGVudEJvZHkoY29kZSkge1xuICAgIC8vIEVPRiwgd2hpdGVzcGFjZSwgcGlwZVxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPCAwIHx8IGNvZGUgPT09IDMyIHx8IGNvZGUgPT09IDEyNCkge1xuICAgICAgZWZmZWN0cy5leGl0KCd0ZW1wb3JhcnlUYWJsZUNlbGxDb250ZW50JylcbiAgICAgIHJldHVybiBjZWxsQnJlYWtCb2R5KGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgLy8gYFxcYFxuICAgIHJldHVybiBjb2RlID09PSA5MiA/IGluQ2VsbENvbnRlbnRFc2NhcGVCb2R5IDogaW5DZWxsQ29udGVudEJvZHlcbiAgfVxuXG4gIGZ1bmN0aW9uIGluQ2VsbENvbnRlbnRFc2NhcGVCb2R5KGNvZGUpIHtcbiAgICAvLyBgXFxgIG9yIGB8YFxuICAgIGlmIChjb2RlID09PSA5MiB8fCBjb2RlID09PSAxMjQpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGluQ2VsbENvbnRlbnRCb2R5XG4gICAgfVxuXG4gICAgLy8gQW55dGhpbmcgZWxzZS5cbiAgICByZXR1cm4gaW5DZWxsQ29udGVudEJvZHkoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGF0Um93RW5kQm9keShjb2RlKSB7XG4gICAgZWZmZWN0cy5leGl0KCd0YWJsZVJvdycpXG5cbiAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRhYmxlQm9keUNsb3NlKGNvZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soXG4gICAgICBuZXh0UHJlZml4ZWRPckJsYW5rLFxuICAgICAgdGFibGVCb2R5Q2xvc2UsXG4gICAgICB0YWJsZUJvZHlDb250aW51ZVxuICAgICkoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhYmxlQm9keUNsb3NlKGNvZGUpIHtcbiAgICBlZmZlY3RzLmV4aXQoJ3RhYmxlQm9keScpXG4gICAgcmV0dXJuIHRhYmxlQ2xvc2UoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhYmxlQm9keUNvbnRpbnVlKGNvZGUpIHtcbiAgICAvLyBBbHdheXMgYSBsaW5lIGVuZGluZy5cbiAgICBlZmZlY3RzLmVudGVyKCdsaW5lRW5kaW5nJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ2xpbmVFbmRpbmcnKVxuICAgIC8vIFN1cHBvcnQgYW4gb3B0aW9uYWwgcHJlZml4LCB0aGVuIHN0YXJ0IGEgYm9keSByb3cuXG4gICAgcmV0dXJuIGNyZWF0ZVNwYWNlKGVmZmVjdHMsIHJvd1N0YXJ0Qm9keSwgJ2xpbmVQcmVmaXgnLCA0KVxuICB9XG59XG5cbi8vIEJhc2VkIG9uIG1pY3JvbWFyaywgYnV0IHRoYXQgd29uXHUyMDE5dCB3b3JrIGFzIHdlXHUyMDE5cmUgaW4gYSB0YWJsZSwgYW5kIHRoYXQgZXhwZWN0c1xuLy8gY29udGVudC5cbi8vIDxodHRwczovL2dpdGh1Yi5jb20vbWljcm9tYXJrL21pY3JvbWFyay9ibG9iL21haW4vbGliL3Rva2VuaXplL3NldGV4dC11bmRlcmxpbmUuanM+XG5mdW5jdGlvbiB0b2tlbml6ZVNldGV4dFVuZGVybGluZU1pbmkoZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgLy8gYC1gXG4gICAgaWYgKGNvZGUgIT09IDQ1KSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignc2V0ZXh0VW5kZXJsaW5lJylcbiAgICByZXR1cm4gc2VxdWVuY2UoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlcXVlbmNlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNDUpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHNlcXVlbmNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHdoaXRlc3BhY2UoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHdoaXRlc3BhY2UoY29kZSkge1xuICAgIGlmIChjb2RlID09PSAtMiB8fCBjb2RlID09PSAtMSB8fCBjb2RlID09PSAzMikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gd2hpdGVzcGFjZVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IC01IHx8IGNvZGUgPT09IC00IHx8IGNvZGUgPT09IC0zKSB7XG4gICAgICByZXR1cm4gb2soY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5pemVOZXh0UHJlZml4ZWRPckJsYW5rKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNpemUgPSAwXG5cbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIC8vIFRoaXMgaXMgYSBjaGVjaywgc28gd2UgZG9uXHUyMDE5dCBjYXJlIGFib3V0IHRva2VucywgYnV0IHdlIG9wZW4gYSBib2d1cyBvbmVcbiAgICAvLyBzbyB3ZVx1MjAxOXJlIHZhbGlkLlxuICAgIGVmZmVjdHMuZW50ZXIoJ2NoZWNrJylcbiAgICAvLyBFT0wuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIHdoaXRlc3BhY2VcbiAgfVxuXG4gIGZ1bmN0aW9uIHdoaXRlc3BhY2UoY29kZSkge1xuICAgIC8vIFZTIG9yIFNQLlxuICAgIGlmIChjb2RlID09PSAtMSB8fCBjb2RlID09PSAzMikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBzaXplKytcbiAgICAgIHJldHVybiBzaXplID09PSA0ID8gb2sgOiB3aGl0ZXNwYWNlXG4gICAgfVxuXG4gICAgLy8gRU9GIG9yIHdoaXRlc3BhY2VcbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlIDwgMCkge1xuICAgICAgcmV0dXJuIG9rKGNvZGUpXG4gICAgfVxuXG4gICAgLy8gQW55dGhpbmcgZWxzZS5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cbn1cbiIsICJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vc3ludGF4JylcbiIsICJ2YXIgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZSA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci9tYXJrZG93bi1saW5lLWVuZGluZy1vci1zcGFjZScpXG52YXIgc3BhY2VGYWN0b3J5ID0gcmVxdWlyZSgnbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvZmFjdG9yeS1zcGFjZScpXG52YXIgcHJlZml4U2l6ZSA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L3V0aWwvcHJlZml4LXNpemUnKVxuXG52YXIgdGFza2xpc3RDaGVjayA9IHt0b2tlbml6ZTogdG9rZW5pemVUYXNrbGlzdENoZWNrfVxuXG5leHBvcnRzLnRleHQgPSB7OTE6IHRhc2tsaXN0Q2hlY2t9XG5cbmZ1bmN0aW9uIHRva2VuaXplVGFza2xpc3RDaGVjayhlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIHJldHVybiBvcGVuXG5cbiAgZnVuY3Rpb24gb3Blbihjb2RlKSB7XG4gICAgaWYgKFxuICAgICAgLy8gRXhpdCBpZiBub3QgYFtgLlxuICAgICAgY29kZSAhPT0gOTEgfHxcbiAgICAgIC8vIEV4aXQgaWYgdGhlcmVcdTIwMTlzIHN0dWZmIGJlZm9yZS5cbiAgICAgIHNlbGYucHJldmlvdXMgIT09IG51bGwgfHxcbiAgICAgIC8vIEV4aXQgaWYgbm90IGluIHRoZSBmaXJzdCBjb250ZW50IHRoYXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGEgbGlzdFxuICAgICAgLy8gaXRlbS5cbiAgICAgICFzZWxmLl9nZm1UYXNrbGlzdEZpcnN0Q29udGVudE9mTGlzdEl0ZW1cbiAgICApIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmVudGVyKCd0YXNrTGlzdENoZWNrJylcbiAgICBlZmZlY3RzLmVudGVyKCd0YXNrTGlzdENoZWNrTWFya2VyJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ3Rhc2tMaXN0Q2hlY2tNYXJrZXInKVxuICAgIHJldHVybiBpbnNpZGVcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2lkZShjb2RlKSB7XG4gICAgLy8gVGFiIG9yIHNwYWNlLlxuICAgIGlmIChjb2RlID09PSAtMiB8fCBjb2RlID09PSAzMikge1xuICAgICAgZWZmZWN0cy5lbnRlcigndGFza0xpc3RDaGVja1ZhbHVlVW5jaGVja2VkJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCd0YXNrTGlzdENoZWNrVmFsdWVVbmNoZWNrZWQnKVxuICAgICAgcmV0dXJuIGNsb3NlXG4gICAgfVxuXG4gICAgLy8gVXBwZXItIGFuZCBsb3dlciBgeGAuXG4gICAgaWYgKGNvZGUgPT09IDg4IHx8IGNvZGUgPT09IDEyMCkge1xuICAgICAgZWZmZWN0cy5lbnRlcigndGFza0xpc3RDaGVja1ZhbHVlQ2hlY2tlZCcpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgndGFza0xpc3RDaGVja1ZhbHVlQ2hlY2tlZCcpXG4gICAgICByZXR1cm4gY2xvc2VcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZShjb2RlKSB7XG4gICAgLy8gYF1gXG4gICAgaWYgKGNvZGUgPT09IDkzKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd0YXNrTGlzdENoZWNrTWFya2VyJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCd0YXNrTGlzdENoZWNrTWFya2VyJylcbiAgICAgIGVmZmVjdHMuZXhpdCgndGFza0xpc3RDaGVjaycpXG4gICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayh7dG9rZW5pemU6IHNwYWNlVGhlbk5vblNwYWNlfSwgb2ssIG5vaylcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gc3BhY2VUaGVuTm9uU3BhY2UoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICByZXR1cm4gc3BhY2VGYWN0b3J5KGVmZmVjdHMsIGFmdGVyLCAnd2hpdGVzcGFjZScpXG5cbiAgZnVuY3Rpb24gYWZ0ZXIoY29kZSkge1xuICAgIHJldHVybiBwcmVmaXhTaXplKHNlbGYuZXZlbnRzLCAnd2hpdGVzcGFjZScpICYmXG4gICAgICBjb2RlICE9PSBudWxsICYmXG4gICAgICAhbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlKVxuICAgICAgPyBvayhjb2RlKVxuICAgICAgOiBub2soY29kZSlcbiAgfVxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9zeW50YXgnKVxuIiwgInZhciBjb21iaW5lID0gcmVxdWlyZSgnbWljcm9tYXJrL2Rpc3QvdXRpbC9jb21iaW5lLWV4dGVuc2lvbnMnKVxudmFyIGF1dG9saW5rID0gcmVxdWlyZSgnbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbCcpXG52YXIgc3RyaWtldGhyb3VnaCA9IHJlcXVpcmUoJ21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXN0cmlrZXRocm91Z2gnKVxudmFyIHRhYmxlID0gcmVxdWlyZSgnbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGUnKVxudmFyIHRhc2tsaXN0ID0gcmVxdWlyZSgnbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFzay1saXN0LWl0ZW0nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVxuXG5mdW5jdGlvbiBjcmVhdGUob3B0aW9ucykge1xuICByZXR1cm4gY29tYmluZShbYXV0b2xpbmssIHN0cmlrZXRocm91Z2gob3B0aW9ucyksIHRhYmxlLCB0YXNrbGlzdF0pXG59XG4iLCAibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3N5bnRheCcpXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gY2NvdW50XG5cbmZ1bmN0aW9uIGNjb3VudChzb3VyY2UsIGNoYXJhY3Rlcikge1xuICB2YXIgdmFsdWUgPSBTdHJpbmcoc291cmNlKVxuICB2YXIgY291bnQgPSAwXG4gIHZhciBpbmRleFxuXG4gIGlmICh0eXBlb2YgY2hhcmFjdGVyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgY2hhcmFjdGVyJylcbiAgfVxuXG4gIGluZGV4ID0gdmFsdWUuaW5kZXhPZihjaGFyYWN0ZXIpXG5cbiAgd2hpbGUgKGluZGV4ICE9PSAtMSkge1xuICAgIGNvdW50KytcbiAgICBpbmRleCA9IHZhbHVlLmluZGV4T2YoY2hhcmFjdGVyLCBpbmRleCArIGNoYXJhY3Rlci5sZW5ndGgpXG4gIH1cblxuICByZXR1cm4gY291bnRcbn1cbiIsICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0XG5cbmZ1bmN0aW9uIGNvbnZlcnQodGVzdCkge1xuICBpZiAodGVzdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG9rXG4gIH1cblxuICBpZiAodHlwZW9mIHRlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGVGYWN0b3J5KHRlc3QpXG4gIH1cblxuICBpZiAodHlwZW9mIHRlc3QgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuICdsZW5ndGgnIGluIHRlc3QgPyBhbnlGYWN0b3J5KHRlc3QpIDogYWxsRmFjdG9yeSh0ZXN0KVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRlc3RcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZnVuY3Rpb24sIHN0cmluZywgb3Igb2JqZWN0IGFzIHRlc3QnKVxufVxuXG4vLyBVdGlsaXR5IGFzc2VydCBlYWNoIHByb3BlcnR5IGluIGB0ZXN0YCBpcyByZXByZXNlbnRlZCBpbiBgbm9kZWAsIGFuZCBlYWNoXG4vLyB2YWx1ZXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuZnVuY3Rpb24gYWxsRmFjdG9yeSh0ZXN0KSB7XG4gIHJldHVybiBhbGxcblxuICBmdW5jdGlvbiBhbGwobm9kZSkge1xuICAgIHZhciBrZXlcblxuICAgIGZvciAoa2V5IGluIHRlc3QpIHtcbiAgICAgIGlmIChub2RlW2tleV0gIT09IHRlc3Rba2V5XSkgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuXG5mdW5jdGlvbiBhbnlGYWN0b3J5KHRlc3RzKSB7XG4gIHZhciBjaGVja3MgPSBbXVxuICB2YXIgaW5kZXggPSAtMVxuXG4gIHdoaWxlICgrK2luZGV4IDwgdGVzdHMubGVuZ3RoKSB7XG4gICAgY2hlY2tzW2luZGV4XSA9IGNvbnZlcnQodGVzdHNbaW5kZXhdKVxuICB9XG5cbiAgcmV0dXJuIGFueVxuXG4gIGZ1bmN0aW9uIGFueSgpIHtcbiAgICB2YXIgaW5kZXggPSAtMVxuXG4gICAgd2hpbGUgKCsraW5kZXggPCBjaGVja3MubGVuZ3RoKSB7XG4gICAgICBpZiAoY2hlY2tzW2luZGV4XS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLy8gVXRpbGl0eSB0byBjb252ZXJ0IGEgc3RyaW5nIGludG8gYSBmdW5jdGlvbiB3aGljaCBjaGVja3MgYSBnaXZlbiBub2RlXHUyMDE5cyB0eXBlXG4vLyBmb3Igc2FpZCBzdHJpbmcuXG5mdW5jdGlvbiB0eXBlRmFjdG9yeSh0ZXN0KSB7XG4gIHJldHVybiB0eXBlXG5cbiAgZnVuY3Rpb24gdHlwZShub2RlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4obm9kZSAmJiBub2RlLnR5cGUgPT09IHRlc3QpXG4gIH1cbn1cblxuLy8gVXRpbGl0eSB0byByZXR1cm4gdHJ1ZS5cbmZ1bmN0aW9uIG9rKCkge1xuICByZXR1cm4gdHJ1ZVxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHlcbmZ1bmN0aW9uIGlkZW50aXR5KGQpIHtcbiAgcmV0dXJuIGRcbn1cbiIsICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB2aXNpdFBhcmVudHNcblxudmFyIGNvbnZlcnQgPSByZXF1aXJlKCd1bmlzdC11dGlsLWlzL2NvbnZlcnQnKVxudmFyIGNvbG9yID0gcmVxdWlyZSgnLi9jb2xvcicpXG5cbnZhciBDT05USU5VRSA9IHRydWVcbnZhciBTS0lQID0gJ3NraXAnXG52YXIgRVhJVCA9IGZhbHNlXG5cbnZpc2l0UGFyZW50cy5DT05USU5VRSA9IENPTlRJTlVFXG52aXNpdFBhcmVudHMuU0tJUCA9IFNLSVBcbnZpc2l0UGFyZW50cy5FWElUID0gRVhJVFxuXG5mdW5jdGlvbiB2aXNpdFBhcmVudHModHJlZSwgdGVzdCwgdmlzaXRvciwgcmV2ZXJzZSkge1xuICB2YXIgc3RlcFxuICB2YXIgaXNcblxuICBpZiAodHlwZW9mIHRlc3QgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZpc2l0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXZlcnNlID0gdmlzaXRvclxuICAgIHZpc2l0b3IgPSB0ZXN0XG4gICAgdGVzdCA9IG51bGxcbiAgfVxuXG4gIGlzID0gY29udmVydCh0ZXN0KVxuICBzdGVwID0gcmV2ZXJzZSA/IC0xIDogMVxuXG4gIGZhY3RvcnkodHJlZSwgbnVsbCwgW10pKClcblxuICBmdW5jdGlvbiBmYWN0b3J5KG5vZGUsIGluZGV4LCBwYXJlbnRzKSB7XG4gICAgdmFyIHZhbHVlID0gdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGUgIT09IG51bGwgPyBub2RlIDoge31cbiAgICB2YXIgbmFtZVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZSA9XG4gICAgICAgIHR5cGVvZiB2YWx1ZS50YWdOYW1lID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gdmFsdWUudGFnTmFtZVxuICAgICAgICAgIDogdHlwZW9mIHZhbHVlLm5hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyB2YWx1ZS5uYW1lXG4gICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgdmlzaXQuZGlzcGxheU5hbWUgPVxuICAgICAgICAnbm9kZSAoJyArIGNvbG9yKHZhbHVlLnR5cGUgKyAobmFtZSA/ICc8JyArIG5hbWUgKyAnPicgOiAnJykpICsgJyknXG4gICAgfVxuXG4gICAgcmV0dXJuIHZpc2l0XG5cbiAgICBmdW5jdGlvbiB2aXNpdCgpIHtcbiAgICAgIHZhciBncmFuZHBhcmVudHMgPSBwYXJlbnRzLmNvbmNhdChub2RlKVxuICAgICAgdmFyIHJlc3VsdCA9IFtdXG4gICAgICB2YXIgc3VicmVzdWx0XG4gICAgICB2YXIgb2Zmc2V0XG5cbiAgICAgIGlmICghdGVzdCB8fCBpcyhub2RlLCBpbmRleCwgcGFyZW50c1twYXJlbnRzLmxlbmd0aCAtIDFdIHx8IG51bGwpKSB7XG4gICAgICAgIHJlc3VsdCA9IHRvUmVzdWx0KHZpc2l0b3Iobm9kZSwgcGFyZW50cykpXG5cbiAgICAgICAgaWYgKHJlc3VsdFswXSA9PT0gRVhJVCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiByZXN1bHRbMF0gIT09IFNLSVApIHtcbiAgICAgICAgb2Zmc2V0ID0gKHJldmVyc2UgPyBub2RlLmNoaWxkcmVuLmxlbmd0aCA6IC0xKSArIHN0ZXBcblxuICAgICAgICB3aGlsZSAob2Zmc2V0ID4gLTEgJiYgb2Zmc2V0IDwgbm9kZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICBzdWJyZXN1bHQgPSBmYWN0b3J5KG5vZGUuY2hpbGRyZW5bb2Zmc2V0XSwgb2Zmc2V0LCBncmFuZHBhcmVudHMpKClcblxuICAgICAgICAgIGlmIChzdWJyZXN1bHRbMF0gPT09IEVYSVQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWJyZXN1bHRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvZmZzZXQgPVxuICAgICAgICAgICAgdHlwZW9mIHN1YnJlc3VsdFsxXSA9PT0gJ251bWJlcicgPyBzdWJyZXN1bHRbMV0gOiBvZmZzZXQgKyBzdGVwXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0b1Jlc3VsdCh2YWx1ZSkge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAnbGVuZ3RoJyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gW0NPTlRJTlVFLCB2YWx1ZV1cbiAgfVxuXG4gIHJldHVybiBbdmFsdWVdXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZyA9PiB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHQvLyBFc2NhcGUgY2hhcmFjdGVycyB3aXRoIHNwZWNpYWwgbWVhbmluZyBlaXRoZXIgaW5zaWRlIG9yIG91dHNpZGUgY2hhcmFjdGVyIHNldHMuXG5cdC8vIFVzZSBhIHNpbXBsZSBiYWNrc2xhc2ggZXNjYXBlIHdoZW4gaXRcdTIwMTlzIGFsd2F5cyB2YWxpZCwgYW5kIGEgXFx1bm5ubiBlc2NhcGUgd2hlbiB0aGUgc2ltcGxlciBmb3JtIHdvdWxkIGJlIGRpc2FsbG93ZWQgYnkgVW5pY29kZSBwYXR0ZXJuc1x1MjAxOSBzdHJpY3RlciBncmFtbWFyLlxuXHRyZXR1cm4gc3RyaW5nXG5cdFx0LnJlcGxhY2UoL1t8XFxcXHt9KClbXFxdXiQrKj8uXS9nLCAnXFxcXCQmJylcblx0XHQucmVwbGFjZSgvLS9nLCAnXFxcXHgyZCcpO1xufTtcbiIsICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBmaW5kQW5kUmVwbGFjZVxuXG52YXIgdmlzaXQgPSByZXF1aXJlKCd1bmlzdC11dGlsLXZpc2l0LXBhcmVudHMnKVxudmFyIGNvbnZlcnQgPSByZXF1aXJlKCd1bmlzdC11dGlsLWlzL2NvbnZlcnQnKVxudmFyIGVzY2FwZSA9IHJlcXVpcmUoJ2VzY2FwZS1zdHJpbmctcmVnZXhwJylcblxudmFyIHNwbGljZSA9IFtdLnNwbGljZVxuXG5mdW5jdGlvbiBmaW5kQW5kUmVwbGFjZSh0cmVlLCBmaW5kLCByZXBsYWNlLCBvcHRpb25zKSB7XG4gIHZhciBzZXR0aW5nc1xuICB2YXIgc2NoZW1hXG5cbiAgaWYgKHR5cGVvZiBmaW5kID09PSAnc3RyaW5nJyB8fCAoZmluZCAmJiB0eXBlb2YgZmluZC5leGVjID09PSAnZnVuY3Rpb24nKSkge1xuICAgIHNjaGVtYSA9IFtbZmluZCwgcmVwbGFjZV1dXG4gIH0gZWxzZSB7XG4gICAgc2NoZW1hID0gZmluZFxuICAgIG9wdGlvbnMgPSByZXBsYWNlXG4gIH1cblxuICBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge31cblxuICBzZWFyY2godHJlZSwgc2V0dGluZ3MsIGhhbmRsZXJGYWN0b3J5KHRvUGFpcnMoc2NoZW1hKSkpXG5cbiAgcmV0dXJuIHRyZWVcblxuICBmdW5jdGlvbiBoYW5kbGVyRmFjdG9yeShwYWlycykge1xuICAgIHZhciBwYWlyID0gcGFpcnNbMF1cblxuICAgIHJldHVybiBoYW5kbGVyXG5cbiAgICBmdW5jdGlvbiBoYW5kbGVyKG5vZGUsIHBhcmVudCkge1xuICAgICAgdmFyIGZpbmQgPSBwYWlyWzBdXG4gICAgICB2YXIgcmVwbGFjZSA9IHBhaXJbMV1cbiAgICAgIHZhciBub2RlcyA9IFtdXG4gICAgICB2YXIgc3RhcnQgPSAwXG4gICAgICB2YXIgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihub2RlKVxuICAgICAgdmFyIHBvc2l0aW9uXG4gICAgICB2YXIgbWF0Y2hcbiAgICAgIHZhciBzdWJoYW5kbGVyXG4gICAgICB2YXIgdmFsdWVcblxuICAgICAgZmluZC5sYXN0SW5kZXggPSAwXG5cbiAgICAgIG1hdGNoID0gZmluZC5leGVjKG5vZGUudmFsdWUpXG5cbiAgICAgIHdoaWxlIChtYXRjaCkge1xuICAgICAgICBwb3NpdGlvbiA9IG1hdGNoLmluZGV4XG4gICAgICAgIHZhbHVlID0gcmVwbGFjZS5hcHBseShcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIFtdLmNvbmNhdChtYXRjaCwge2luZGV4OiBtYXRjaC5pbmRleCwgaW5wdXQ6IG1hdGNoLmlucHV0fSlcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBpZiAoc3RhcnQgIT09IHBvc2l0aW9uKSB7XG4gICAgICAgICAgICBub2Rlcy5wdXNoKHt0eXBlOiAndGV4dCcsIHZhbHVlOiBub2RlLnZhbHVlLnNsaWNlKHN0YXJ0LCBwb3NpdGlvbil9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0ge3R5cGU6ICd0ZXh0JywgdmFsdWU6IHZhbHVlfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgbm9kZXMgPSBbXS5jb25jYXQobm9kZXMsIHZhbHVlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0YXJ0ID0gcG9zaXRpb24gKyBtYXRjaFswXS5sZW5ndGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmluZC5nbG9iYWwpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgbWF0Y2ggPSBmaW5kLmV4ZWMobm9kZS52YWx1ZSlcbiAgICAgIH1cblxuICAgICAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbm9kZXMgPSBbbm9kZV1cbiAgICAgICAgaW5kZXgtLVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXJ0IDwgbm9kZS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICBub2Rlcy5wdXNoKHt0eXBlOiAndGV4dCcsIHZhbHVlOiBub2RlLnZhbHVlLnNsaWNlKHN0YXJ0KX0pXG4gICAgICAgIH1cblxuICAgICAgICBub2Rlcy51bnNoaWZ0KGluZGV4LCAxKVxuICAgICAgICBzcGxpY2UuYXBwbHkocGFyZW50LmNoaWxkcmVuLCBub2RlcylcbiAgICAgIH1cblxuICAgICAgaWYgKHBhaXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgc3ViaGFuZGxlciA9IGhhbmRsZXJGYWN0b3J5KHBhaXJzLnNsaWNlKDEpKVxuICAgICAgICBwb3NpdGlvbiA9IC0xXG5cbiAgICAgICAgd2hpbGUgKCsrcG9zaXRpb24gPCBub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICBub2RlID0gbm9kZXNbcG9zaXRpb25dXG5cbiAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIHN1YmhhbmRsZXIobm9kZSwgcGFyZW50KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWFyY2gobm9kZSwgc2V0dGluZ3MsIHN1YmhhbmRsZXIpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbmRleCArIG5vZGVzLmxlbmd0aCArIDFcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VhcmNoKHRyZWUsIHNldHRpbmdzLCBoYW5kbGVyKSB7XG4gIHZhciBpZ25vcmVkID0gY29udmVydChzZXR0aW5ncy5pZ25vcmUgfHwgW10pXG4gIHZhciByZXN1bHQgPSBbXVxuXG4gIHZpc2l0KHRyZWUsICd0ZXh0JywgdmlzaXRvcilcblxuICByZXR1cm4gcmVzdWx0XG5cbiAgZnVuY3Rpb24gdmlzaXRvcihub2RlLCBwYXJlbnRzKSB7XG4gICAgdmFyIGluZGV4ID0gLTFcbiAgICB2YXIgcGFyZW50XG4gICAgdmFyIGdyYW5kcGFyZW50XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IHBhcmVudHMubGVuZ3RoKSB7XG4gICAgICBwYXJlbnQgPSBwYXJlbnRzW2luZGV4XVxuXG4gICAgICBpZiAoXG4gICAgICAgIGlnbm9yZWQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIGdyYW5kcGFyZW50ID8gZ3JhbmRwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihwYXJlbnQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGdyYW5kcGFyZW50XG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZ3JhbmRwYXJlbnQgPSBwYXJlbnRcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlcihub2RlLCBncmFuZHBhcmVudClcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1BhaXJzKHNjaGVtYSkge1xuICB2YXIgcmVzdWx0ID0gW11cbiAgdmFyIGtleVxuICB2YXIgaW5kZXhcblxuICBpZiAodHlwZW9mIHNjaGVtYSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGFycmF5IG9yIG9iamVjdCBhcyBzY2hlbWEnKVxuICB9XG5cbiAgaWYgKCdsZW5ndGgnIGluIHNjaGVtYSkge1xuICAgIGluZGV4ID0gLTFcblxuICAgIHdoaWxlICgrK2luZGV4IDwgc2NoZW1hLmxlbmd0aCkge1xuICAgICAgcmVzdWx0LnB1c2goW1xuICAgICAgICB0b0V4cHJlc3Npb24oc2NoZW1hW2luZGV4XVswXSksXG4gICAgICAgIHRvRnVuY3Rpb24oc2NoZW1hW2luZGV4XVsxXSlcbiAgICAgIF0pXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoa2V5IGluIHNjaGVtYSkge1xuICAgICAgcmVzdWx0LnB1c2goW3RvRXhwcmVzc2lvbihrZXkpLCB0b0Z1bmN0aW9uKHNjaGVtYVtrZXldKV0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB0b0V4cHJlc3Npb24oZmluZCkge1xuICByZXR1cm4gdHlwZW9mIGZpbmQgPT09ICdzdHJpbmcnID8gbmV3IFJlZ0V4cChlc2NhcGUoZmluZCksICdnJykgOiBmaW5kXG59XG5cbmZ1bmN0aW9uIHRvRnVuY3Rpb24ocmVwbGFjZSkge1xuICByZXR1cm4gdHlwZW9mIHJlcGxhY2UgPT09ICdmdW5jdGlvbicgPyByZXBsYWNlIDogcmV0dXJuZXJcblxuICBmdW5jdGlvbiByZXR1cm5lcigpIHtcbiAgICByZXR1cm4gcmVwbGFjZVxuICB9XG59XG4iLCAidmFyIGNjb3VudCA9IHJlcXVpcmUoJ2Njb3VudCcpXG52YXIgZmluZEFuZFJlcGxhY2UgPSByZXF1aXJlKCdtZGFzdC11dGlsLWZpbmQtYW5kLXJlcGxhY2UnKVxudmFyIHVuaWNvZGVQdW5jdHVhdGlvbiA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci91bmljb2RlLXB1bmN0dWF0aW9uJylcbnZhciB1bmljb2RlV2hpdGVzcGFjZSA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci91bmljb2RlLXdoaXRlc3BhY2UnKVxuXG5leHBvcnRzLnRyYW5zZm9ybXMgPSBbdHJhbnNmb3JtR2ZtQXV0b2xpbmtMaXRlcmFsc11cbmV4cG9ydHMuZW50ZXIgPSB7XG4gIGxpdGVyYWxBdXRvbGluazogZW50ZXJMaXRlcmFsQXV0b2xpbmssXG4gIGxpdGVyYWxBdXRvbGlua0VtYWlsOiBlbnRlckxpdGVyYWxBdXRvbGlua1ZhbHVlLFxuICBsaXRlcmFsQXV0b2xpbmtIdHRwOiBlbnRlckxpdGVyYWxBdXRvbGlua1ZhbHVlLFxuICBsaXRlcmFsQXV0b2xpbmtXd3c6IGVudGVyTGl0ZXJhbEF1dG9saW5rVmFsdWVcbn1cbmV4cG9ydHMuZXhpdCA9IHtcbiAgbGl0ZXJhbEF1dG9saW5rOiBleGl0TGl0ZXJhbEF1dG9saW5rLFxuICBsaXRlcmFsQXV0b2xpbmtFbWFpbDogZXhpdExpdGVyYWxBdXRvbGlua0VtYWlsLFxuICBsaXRlcmFsQXV0b2xpbmtIdHRwOiBleGl0TGl0ZXJhbEF1dG9saW5rSHR0cCxcbiAgbGl0ZXJhbEF1dG9saW5rV3d3OiBleGl0TGl0ZXJhbEF1dG9saW5rV3d3XG59XG5cbmZ1bmN0aW9uIGVudGVyTGl0ZXJhbEF1dG9saW5rKHRva2VuKSB7XG4gIHRoaXMuZW50ZXIoe3R5cGU6ICdsaW5rJywgdGl0bGU6IG51bGwsIHVybDogJycsIGNoaWxkcmVuOiBbXX0sIHRva2VuKVxufVxuXG5mdW5jdGlvbiBlbnRlckxpdGVyYWxBdXRvbGlua1ZhbHVlKHRva2VuKSB7XG4gIHRoaXMuY29uZmlnLmVudGVyLmF1dG9saW5rUHJvdG9jb2wuY2FsbCh0aGlzLCB0b2tlbilcbn1cblxuZnVuY3Rpb24gZXhpdExpdGVyYWxBdXRvbGlua0h0dHAodG9rZW4pIHtcbiAgdGhpcy5jb25maWcuZXhpdC5hdXRvbGlua1Byb3RvY29sLmNhbGwodGhpcywgdG9rZW4pXG59XG5cbmZ1bmN0aW9uIGV4aXRMaXRlcmFsQXV0b2xpbmtXd3codG9rZW4pIHtcbiAgdGhpcy5jb25maWcuZXhpdC5kYXRhLmNhbGwodGhpcywgdG9rZW4pXG4gIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXS51cmwgPSAnaHR0cDovLycgKyB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKVxufVxuXG5mdW5jdGlvbiBleGl0TGl0ZXJhbEF1dG9saW5rRW1haWwodG9rZW4pIHtcbiAgdGhpcy5jb25maWcuZXhpdC5hdXRvbGlua0VtYWlsLmNhbGwodGhpcywgdG9rZW4pXG59XG5cbmZ1bmN0aW9uIGV4aXRMaXRlcmFsQXV0b2xpbmsodG9rZW4pIHtcbiAgdGhpcy5leGl0KHRva2VuKVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1HZm1BdXRvbGlua0xpdGVyYWxzKHRyZWUpIHtcbiAgZmluZEFuZFJlcGxhY2UoXG4gICAgdHJlZSxcbiAgICBbXG4gICAgICBbLyhodHRwcz86XFwvXFwvfHd3dyg/PVxcLikpKFstLlxcd10rKShbXiBcXHRcXHJcXG5dKikvaSwgZmluZFVybF0sXG4gICAgICBbLyhbLS5cXHcrXSspQChbLVxcd10rKD86XFwuWy1cXHddKykrKS8sIGZpbmRFbWFpbF1cbiAgICBdLFxuICAgIHtpZ25vcmU6IFsnbGluaycsICdsaW5rUmVmZXJlbmNlJ119XG4gIClcbn1cblxuZnVuY3Rpb24gZmluZFVybCgkMCwgcHJvdG9jb2wsIGRvbWFpbiwgcGF0aCwgbWF0Y2gpIHtcbiAgdmFyIHByZWZpeCA9ICcnXG4gIHZhciBwYXJ0c1xuICB2YXIgcmVzdWx0XG5cbiAgLy8gTm90IGFuIGV4cGVjdGVkIHByZXZpb3VzIGNoYXJhY3Rlci5cbiAgaWYgKCFwcmV2aW91cyhtYXRjaCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFRyZWF0IGB3d3dgIGFzIHBhcnQgb2YgdGhlIGRvbWFpbi5cbiAgaWYgKC9edy9pLnRlc3QocHJvdG9jb2wpKSB7XG4gICAgZG9tYWluID0gcHJvdG9jb2wgKyBkb21haW5cbiAgICBwcm90b2NvbCA9ICcnXG4gICAgcHJlZml4ID0gJ2h0dHA6Ly8nXG4gIH1cblxuICBpZiAoIWlzQ29ycmVjdERvbWFpbihkb21haW4pKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBwYXJ0cyA9IHNwbGl0VXJsKGRvbWFpbiArIHBhdGgpXG5cbiAgaWYgKCFwYXJ0c1swXSkgcmV0dXJuIGZhbHNlXG5cbiAgcmVzdWx0ID0ge1xuICAgIHR5cGU6ICdsaW5rJyxcbiAgICB0aXRsZTogbnVsbCxcbiAgICB1cmw6IHByZWZpeCArIHByb3RvY29sICsgcGFydHNbMF0sXG4gICAgY2hpbGRyZW46IFt7dHlwZTogJ3RleHQnLCB2YWx1ZTogcHJvdG9jb2wgKyBwYXJ0c1swXX1dXG4gIH1cblxuICBpZiAocGFydHNbMV0pIHtcbiAgICByZXN1bHQgPSBbcmVzdWx0LCB7dHlwZTogJ3RleHQnLCB2YWx1ZTogcGFydHNbMV19XVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBmaW5kRW1haWwoJDAsIGF0ZXh0LCBsYWJlbCwgbWF0Y2gpIHtcbiAgLy8gTm90IGFuIGV4cGVjdGVkIHByZXZpb3VzIGNoYXJhY3Rlci5cbiAgaWYgKCFwcmV2aW91cyhtYXRjaCwgdHJ1ZSkgfHwgL1tfLV0kLy50ZXN0KGxhYmVsKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnbGluaycsXG4gICAgdGl0bGU6IG51bGwsXG4gICAgdXJsOiAnbWFpbHRvOicgKyBhdGV4dCArICdAJyArIGxhYmVsLFxuICAgIGNoaWxkcmVuOiBbe3R5cGU6ICd0ZXh0JywgdmFsdWU6IGF0ZXh0ICsgJ0AnICsgbGFiZWx9XVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ29ycmVjdERvbWFpbihkb21haW4pIHtcbiAgdmFyIHBhcnRzID0gZG9tYWluLnNwbGl0KCcuJylcblxuICBpZiAoXG4gICAgcGFydHMubGVuZ3RoIDwgMiB8fFxuICAgIChwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSAmJlxuICAgICAgKC9fLy50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSB8fFxuICAgICAgICAhL1thLXpBLVpcXGRdLy50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSkpIHx8XG4gICAgKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDJdICYmXG4gICAgICAoL18vLnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMl0pIHx8XG4gICAgICAgICEvW2EtekEtWlxcZF0vLnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMl0pKSlcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBzcGxpdFVybCh1cmwpIHtcbiAgdmFyIHRyYWlsID0gL1shXCImJyksLjo7PD4/XFxdfV0rJC8uZXhlYyh1cmwpXG4gIHZhciBjbG9zaW5nUGFyZW5JbmRleFxuICB2YXIgb3BlbmluZ1BhcmVuc1xuICB2YXIgY2xvc2luZ1BhcmVuc1xuXG4gIGlmICh0cmFpbCkge1xuICAgIHVybCA9IHVybC5zbGljZSgwLCB0cmFpbC5pbmRleClcbiAgICB0cmFpbCA9IHRyYWlsWzBdXG4gICAgY2xvc2luZ1BhcmVuSW5kZXggPSB0cmFpbC5pbmRleE9mKCcpJylcbiAgICBvcGVuaW5nUGFyZW5zID0gY2NvdW50KHVybCwgJygnKVxuICAgIGNsb3NpbmdQYXJlbnMgPSBjY291bnQodXJsLCAnKScpXG5cbiAgICB3aGlsZSAoY2xvc2luZ1BhcmVuSW5kZXggIT09IC0xICYmIG9wZW5pbmdQYXJlbnMgPiBjbG9zaW5nUGFyZW5zKSB7XG4gICAgICB1cmwgKz0gdHJhaWwuc2xpY2UoMCwgY2xvc2luZ1BhcmVuSW5kZXggKyAxKVxuICAgICAgdHJhaWwgPSB0cmFpbC5zbGljZShjbG9zaW5nUGFyZW5JbmRleCArIDEpXG4gICAgICBjbG9zaW5nUGFyZW5JbmRleCA9IHRyYWlsLmluZGV4T2YoJyknKVxuICAgICAgY2xvc2luZ1BhcmVucysrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFt1cmwsIHRyYWlsXVxufVxuXG5mdW5jdGlvbiBwcmV2aW91cyhtYXRjaCwgZW1haWwpIHtcbiAgdmFyIGNvZGUgPSBtYXRjaC5pbnB1dC5jaGFyQ29kZUF0KG1hdGNoLmluZGV4IC0gMSlcbiAgcmV0dXJuIChcbiAgICAoY29kZSAhPT0gY29kZSB8fCB1bmljb2RlV2hpdGVzcGFjZShjb2RlKSB8fCB1bmljb2RlUHVuY3R1YXRpb24oY29kZSkpICYmXG4gICAgKCFlbWFpbCB8fCBjb2RlICE9PSA0NylcbiAgKVxufVxuIiwgImV4cG9ydHMuY2FuQ29udGFpbkVvbHMgPSBbJ2RlbGV0ZSddXG5leHBvcnRzLmVudGVyID0ge3N0cmlrZXRocm91Z2g6IGVudGVyU3RyaWtldGhyb3VnaH1cbmV4cG9ydHMuZXhpdCA9IHtzdHJpa2V0aHJvdWdoOiBleGl0U3RyaWtldGhyb3VnaH1cblxuZnVuY3Rpb24gZW50ZXJTdHJpa2V0aHJvdWdoKHRva2VuKSB7XG4gIHRoaXMuZW50ZXIoe3R5cGU6ICdkZWxldGUnLCBjaGlsZHJlbjogW119LCB0b2tlbilcbn1cblxuZnVuY3Rpb24gZXhpdFN0cmlrZXRocm91Z2godG9rZW4pIHtcbiAgdGhpcy5leGl0KHRva2VuKVxufVxuIiwgImV4cG9ydHMuZW50ZXIgPSB7XG4gIHRhYmxlOiBlbnRlclRhYmxlLFxuICB0YWJsZURhdGE6IGVudGVyQ2VsbCxcbiAgdGFibGVIZWFkZXI6IGVudGVyQ2VsbCxcbiAgdGFibGVSb3c6IGVudGVyUm93XG59XG5leHBvcnRzLmV4aXQgPSB7XG4gIGNvZGVUZXh0OiBleGl0Q29kZVRleHQsXG4gIHRhYmxlOiBleGl0VGFibGUsXG4gIHRhYmxlRGF0YTogZXhpdCxcbiAgdGFibGVIZWFkZXI6IGV4aXQsXG4gIHRhYmxlUm93OiBleGl0XG59XG5cbmZ1bmN0aW9uIGVudGVyVGFibGUodG9rZW4pIHtcbiAgdGhpcy5lbnRlcih7dHlwZTogJ3RhYmxlJywgYWxpZ246IHRva2VuLl9hbGlnbiwgY2hpbGRyZW46IFtdfSwgdG9rZW4pXG4gIHRoaXMuc2V0RGF0YSgnaW5UYWJsZScsIHRydWUpXG59XG5cbmZ1bmN0aW9uIGV4aXRUYWJsZSh0b2tlbikge1xuICB0aGlzLmV4aXQodG9rZW4pXG4gIHRoaXMuc2V0RGF0YSgnaW5UYWJsZScpXG59XG5cbmZ1bmN0aW9uIGVudGVyUm93KHRva2VuKSB7XG4gIHRoaXMuZW50ZXIoe3R5cGU6ICd0YWJsZVJvdycsIGNoaWxkcmVuOiBbXX0sIHRva2VuKVxufVxuXG5mdW5jdGlvbiBleGl0KHRva2VuKSB7XG4gIHRoaXMuZXhpdCh0b2tlbilcbn1cblxuZnVuY3Rpb24gZW50ZXJDZWxsKHRva2VuKSB7XG4gIHRoaXMuZW50ZXIoe3R5cGU6ICd0YWJsZUNlbGwnLCBjaGlsZHJlbjogW119LCB0b2tlbilcbn1cblxuLy8gT3ZlcndyaXRlIHRoZSBkZWZhdWx0IGNvZGUgdGV4dCBkYXRhIGhhbmRsZXIgdG8gdW5lc2NhcGUgZXNjYXBlZCBwaXBlcyB3aGVuXG4vLyB0aGV5IGFyZSBpbiB0YWJsZXMuXG5mdW5jdGlvbiBleGl0Q29kZVRleHQodG9rZW4pIHtcbiAgdmFyIHZhbHVlID0gdGhpcy5yZXN1bWUoKVxuXG4gIGlmICh0aGlzLmdldERhdGEoJ2luVGFibGUnKSkge1xuICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxcXChbXFxcXHxdKS9nLCByZXBsYWNlKVxuICB9XG5cbiAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLnZhbHVlID0gdmFsdWVcbiAgdGhpcy5leGl0KHRva2VuKVxufVxuXG5mdW5jdGlvbiByZXBsYWNlKCQwLCAkMSkge1xuICAvLyBQaXBlcyB3b3JrLCBiYWNrc2xhc2hlcyBkb25cdTIwMTl0IChidXQgY2FuXHUyMDE5dCBlc2NhcGUgcGlwZXMpLlxuICByZXR1cm4gJDEgPT09ICd8JyA/ICQxIDogJDBcbn1cbiIsICJleHBvcnRzLmV4aXQgPSB7XG4gIHRhc2tMaXN0Q2hlY2tWYWx1ZUNoZWNrZWQ6IGV4aXRDaGVjayxcbiAgdGFza0xpc3RDaGVja1ZhbHVlVW5jaGVja2VkOiBleGl0Q2hlY2ssXG4gIHBhcmFncmFwaDogZXhpdFBhcmFncmFwaFdpdGhUYXNrTGlzdEl0ZW1cbn1cblxuZnVuY3Rpb24gZXhpdENoZWNrKHRva2VuKSB7XG4gIC8vIFdlXHUyMDE5cmUgYWx3YXlzIGluIGEgcGFyYWdyYXBoLCBpbiBhIGxpc3QgaXRlbS5cbiAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDJdLmNoZWNrZWQgPVxuICAgIHRva2VuLnR5cGUgPT09ICd0YXNrTGlzdENoZWNrVmFsdWVDaGVja2VkJ1xufVxuXG5mdW5jdGlvbiBleGl0UGFyYWdyYXBoV2l0aFRhc2tMaXN0SXRlbSh0b2tlbikge1xuICB2YXIgcGFyZW50ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDJdXG4gIHZhciBub2RlID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG4gIHZhciBzaWJsaW5ncyA9IHBhcmVudC5jaGlsZHJlblxuICB2YXIgaGVhZCA9IG5vZGUuY2hpbGRyZW5bMF1cbiAgdmFyIGluZGV4ID0gLTFcbiAgdmFyIGZpcnN0UGFyYWdocmFwaFxuXG4gIGlmIChcbiAgICBwYXJlbnQgJiZcbiAgICBwYXJlbnQudHlwZSA9PT0gJ2xpc3RJdGVtJyAmJlxuICAgIHR5cGVvZiBwYXJlbnQuY2hlY2tlZCA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgaGVhZCAmJlxuICAgIGhlYWQudHlwZSA9PT0gJ3RleHQnXG4gICkge1xuICAgIHdoaWxlICgrK2luZGV4IDwgc2libGluZ3MubGVuZ3RoKSB7XG4gICAgICBpZiAoc2libGluZ3NbaW5kZXhdLnR5cGUgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgICAgIGZpcnN0UGFyYWdocmFwaCA9IHNpYmxpbmdzW2luZGV4XVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmaXJzdFBhcmFnaHJhcGggPT09IG5vZGUpIHtcbiAgICAgIC8vIE11c3Qgc3RhcnQgd2l0aCBhIHNwYWNlIG9yIGEgdGFiLlxuICAgICAgaGVhZC52YWx1ZSA9IGhlYWQudmFsdWUuc2xpY2UoMSlcblxuICAgICAgaWYgKGhlYWQudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG5vZGUuY2hpbGRyZW4uc2hpZnQoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhZC5wb3NpdGlvbi5zdGFydC5jb2x1bW4rK1xuICAgICAgICBoZWFkLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCsrXG4gICAgICAgIG5vZGUucG9zaXRpb24uc3RhcnQgPSBPYmplY3QuYXNzaWduKHt9LCBoZWFkLnBvc2l0aW9uLnN0YXJ0KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuZXhpdCh0b2tlbilcbn1cbiIsICJ2YXIgYXV0b2xpbmtMaXRlcmFsID0gcmVxdWlyZSgnbWRhc3QtdXRpbC1nZm0tYXV0b2xpbmstbGl0ZXJhbC9mcm9tLW1hcmtkb3duJylcbnZhciBzdHJpa2V0aHJvdWdoID0gcmVxdWlyZSgnbWRhc3QtdXRpbC1nZm0tc3RyaWtldGhyb3VnaC9mcm9tLW1hcmtkb3duJylcbnZhciB0YWJsZSA9IHJlcXVpcmUoJ21kYXN0LXV0aWwtZ2ZtLXRhYmxlL2Zyb20tbWFya2Rvd24nKVxudmFyIHRhc2tMaXN0SXRlbSA9IHJlcXVpcmUoJ21kYXN0LXV0aWwtZ2ZtLXRhc2stbGlzdC1pdGVtL2Zyb20tbWFya2Rvd24nKVxuXG52YXIgb3duID0ge30uaGFzT3duUHJvcGVydHlcblxubW9kdWxlLmV4cG9ydHMgPSBjb25maWd1cmUoW1xuICBhdXRvbGlua0xpdGVyYWwsXG4gIHN0cmlrZXRocm91Z2gsXG4gIHRhYmxlLFxuICB0YXNrTGlzdEl0ZW1cbl0pXG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZShleHRlbnNpb25zKSB7XG4gIHZhciBjb25maWcgPSB7dHJhbnNmb3JtczogW10sIGNhbkNvbnRhaW5Fb2xzOiBbXX1cbiAgdmFyIGxlbmd0aCA9IGV4dGVuc2lvbnMubGVuZ3RoXG4gIHZhciBpbmRleCA9IC0xXG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBleHRlbnNpb24oY29uZmlnLCBleHRlbnNpb25zW2luZGV4XSlcbiAgfVxuXG4gIHJldHVybiBjb25maWdcbn1cblxuZnVuY3Rpb24gZXh0ZW5zaW9uKGNvbmZpZywgZXh0ZW5zaW9uKSB7XG4gIHZhciBrZXlcbiAgdmFyIGxlZnRcbiAgdmFyIHJpZ2h0XG5cbiAgZm9yIChrZXkgaW4gZXh0ZW5zaW9uKSB7XG4gICAgbGVmdCA9IG93bi5jYWxsKGNvbmZpZywga2V5KSA/IGNvbmZpZ1trZXldIDogKGNvbmZpZ1trZXldID0ge30pXG4gICAgcmlnaHQgPSBleHRlbnNpb25ba2V5XVxuXG4gICAgaWYgKGtleSA9PT0gJ2NhbkNvbnRhaW5Fb2xzJyB8fCBrZXkgPT09ICd0cmFuc2Zvcm1zJykge1xuICAgICAgY29uZmlnW2tleV0gPSBbXS5jb25jYXQobGVmdCwgcmlnaHQpXG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5hc3NpZ24obGVmdCwgcmlnaHQpXG4gICAgfVxuICB9XG59XG4iLCAidmFyIGluQ29uc3RydWN0ID0gJ3BocmFzaW5nJ1xudmFyIG5vdEluQ29uc3RydWN0ID0gWydhdXRvbGluaycsICdsaW5rJywgJ2ltYWdlJywgJ2xhYmVsJ11cblxuZXhwb3J0cy51bnNhZmUgPSBbXG4gIHtcbiAgICBjaGFyYWN0ZXI6ICdAJyxcbiAgICBiZWZvcmU6ICdbK1xcXFwtLlxcXFx3XScsXG4gICAgYWZ0ZXI6ICdbXFxcXC0uXFxcXHddJyxcbiAgICBpbkNvbnN0cnVjdDogaW5Db25zdHJ1Y3QsXG4gICAgbm90SW5Db25zdHJ1Y3Q6IG5vdEluQ29uc3RydWN0XG4gIH0sXG4gIHtcbiAgICBjaGFyYWN0ZXI6ICcuJyxcbiAgICBiZWZvcmU6ICdbV3ddJyxcbiAgICBhZnRlcjogJ1tcXFxcLS5cXFxcd10nLFxuICAgIGluQ29uc3RydWN0OiBpbkNvbnN0cnVjdCxcbiAgICBub3RJbkNvbnN0cnVjdDogbm90SW5Db25zdHJ1Y3RcbiAgfSxcbiAge1xuICAgIGNoYXJhY3RlcjogJzonLFxuICAgIGJlZm9yZTogJ1twc10nLFxuICAgIGFmdGVyOiAnXFxcXC8nLFxuICAgIGluQ29uc3RydWN0OiBpbkNvbnN0cnVjdCxcbiAgICBub3RJbkNvbnN0cnVjdDogbm90SW5Db25zdHJ1Y3RcbiAgfVxuXVxuIiwgIm1vZHVsZS5leHBvcnRzID0gcGhyYXNpbmdcblxuZnVuY3Rpb24gcGhyYXNpbmcocGFyZW50LCBjb250ZXh0LCBzYWZlT3B0aW9ucykge1xuICB2YXIgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGRyZW4gfHwgW11cbiAgdmFyIHJlc3VsdHMgPSBbXVxuICB2YXIgaW5kZXggPSAtMVxuICB2YXIgYmVmb3JlID0gc2FmZU9wdGlvbnMuYmVmb3JlXG4gIHZhciBhZnRlclxuICB2YXIgaGFuZGxlXG4gIHZhciBjaGlsZFxuXG4gIHdoaWxlICgrK2luZGV4IDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgY2hpbGQgPSBjaGlsZHJlbltpbmRleF1cblxuICAgIGlmIChpbmRleCArIDEgPCBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGhhbmRsZSA9IGNvbnRleHQuaGFuZGxlLmhhbmRsZXJzW2NoaWxkcmVuW2luZGV4ICsgMV0udHlwZV1cbiAgICAgIGlmIChoYW5kbGUgJiYgaGFuZGxlLnBlZWspIGhhbmRsZSA9IGhhbmRsZS5wZWVrXG4gICAgICBhZnRlciA9IGhhbmRsZVxuICAgICAgICA/IGhhbmRsZShjaGlsZHJlbltpbmRleCArIDFdLCBwYXJlbnQsIGNvbnRleHQsIHtcbiAgICAgICAgICAgIGJlZm9yZTogJycsXG4gICAgICAgICAgICBhZnRlcjogJydcbiAgICAgICAgICB9KS5jaGFyQXQoMClcbiAgICAgICAgOiAnJ1xuICAgIH0gZWxzZSB7XG4gICAgICBhZnRlciA9IHNhZmVPcHRpb25zLmFmdGVyXG4gICAgfVxuXG4gICAgLy8gSW4gc29tZSBjYXNlcywgaHRtbCAodGV4dCkgY2FuIGJlIGZvdW5kIGluIHBocmFzaW5nIHJpZ2h0IGFmdGVyIGFuIGVvbC5cbiAgICAvLyBXaGVuIHdlXHUyMDE5ZCBzZXJpYWxpemUgdGhhdCwgaW4gbW9zdCBjYXNlcyB0aGF0IHdvdWxkIGJlIHNlZW4gYXMgaHRtbFxuICAgIC8vIChmbG93KS5cbiAgICAvLyBBcyB3ZSBjYW5cdTIwMTl0IGVzY2FwZSBvciBzbyB0byBwcmV2ZW50IGl0IGZyb20gaGFwcGVuaW5nLCB3ZSB0YWtlIGEgc29tZXdoYXRcbiAgICAvLyByZWFzb25hYmxlIGFwcHJvYWNoOiByZXBsYWNlIHRoYXQgZW9sIHdpdGggYSBzcGFjZS5cbiAgICAvLyBTZWU6IDxodHRwczovL2dpdGh1Yi5jb20vc3ludGF4LXRyZWUvbWRhc3QtdXRpbC10by1tYXJrZG93bi9pc3N1ZXMvMTU+XG4gICAgaWYgKFxuICAgICAgcmVzdWx0cy5sZW5ndGggPiAwICYmXG4gICAgICAoYmVmb3JlID09PSAnXFxyJyB8fCBiZWZvcmUgPT09ICdcXG4nKSAmJlxuICAgICAgY2hpbGQudHlwZSA9PT0gJ2h0bWwnXG4gICAgKSB7XG4gICAgICByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0gPSByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0ucmVwbGFjZShcbiAgICAgICAgLyhcXHI/XFxufFxccikkLyxcbiAgICAgICAgJyAnXG4gICAgICApXG4gICAgICBiZWZvcmUgPSAnICdcbiAgICB9XG5cbiAgICByZXN1bHRzLnB1c2goXG4gICAgICBjb250ZXh0LmhhbmRsZShjaGlsZCwgcGFyZW50LCBjb250ZXh0LCB7XG4gICAgICAgIGJlZm9yZTogYmVmb3JlLFxuICAgICAgICBhZnRlcjogYWZ0ZXJcbiAgICAgIH0pXG4gICAgKVxuXG4gICAgYmVmb3JlID0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLnNsaWNlKC0xKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHMuam9pbignJylcbn1cbiIsICJ2YXIgcGhyYXNpbmcgPSByZXF1aXJlKCdtZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbnRhaW5lci1waHJhc2luZycpXG5cbmV4cG9ydHMudW5zYWZlID0gW3tjaGFyYWN0ZXI6ICd+JywgaW5Db25zdHJ1Y3Q6ICdwaHJhc2luZyd9XVxuZXhwb3J0cy5oYW5kbGVycyA9IHtkZWxldGU6IGhhbmRsZURlbGV0ZX1cblxuaGFuZGxlRGVsZXRlLnBlZWsgPSBwZWVrRGVsZXRlXG5cbmZ1bmN0aW9uIGhhbmRsZURlbGV0ZShub2RlLCBfLCBjb250ZXh0KSB7XG4gIHZhciBleGl0ID0gY29udGV4dC5lbnRlcignZW1waGFzaXMnKVxuICB2YXIgdmFsdWUgPSBwaHJhc2luZyhub2RlLCBjb250ZXh0LCB7YmVmb3JlOiAnficsIGFmdGVyOiAnfid9KVxuICBleGl0KClcbiAgcmV0dXJuICd+ficgKyB2YWx1ZSArICd+fidcbn1cblxuZnVuY3Rpb24gcGVla0RlbGV0ZSgpIHtcbiAgcmV0dXJuICd+J1xufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gcGF0dGVybkNvbXBpbGVcblxuZnVuY3Rpb24gcGF0dGVybkNvbXBpbGUocGF0dGVybikge1xuICB2YXIgYmVmb3JlXG4gIHZhciBhZnRlclxuXG4gIGlmICghcGF0dGVybi5fY29tcGlsZWQpIHtcbiAgICBiZWZvcmUgPSBwYXR0ZXJuLmJlZm9yZSA/ICcoPzonICsgcGF0dGVybi5iZWZvcmUgKyAnKScgOiAnJ1xuICAgIGFmdGVyID0gcGF0dGVybi5hZnRlciA/ICcoPzonICsgcGF0dGVybi5hZnRlciArICcpJyA6ICcnXG5cbiAgICBpZiAocGF0dGVybi5hdEJyZWFrKSB7XG4gICAgICBiZWZvcmUgPSAnW1xcXFxyXFxcXG5dW1xcXFx0IF0qJyArIGJlZm9yZVxuICAgIH1cblxuICAgIHBhdHRlcm4uX2NvbXBpbGVkID0gbmV3IFJlZ0V4cChcbiAgICAgIChiZWZvcmUgPyAnKCcgKyBiZWZvcmUgKyAnKScgOiAnJykgK1xuICAgICAgICAoL1t8XFxcXHt9KClbXFxdXiQrKj8uLV0vLnRlc3QocGF0dGVybi5jaGFyYWN0ZXIpID8gJ1xcXFwnIDogJycpICtcbiAgICAgICAgcGF0dGVybi5jaGFyYWN0ZXIgK1xuICAgICAgICAoYWZ0ZXIgfHwgJycpLFxuICAgICAgJ2cnXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhdHRlcm4uX2NvbXBpbGVkXG59XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBpbmxpbmVDb2RlXG5pbmxpbmVDb2RlLnBlZWsgPSBpbmxpbmVDb2RlUGVla1xuXG52YXIgcGF0dGVybkNvbXBpbGUgPSByZXF1aXJlKCcuLi91dGlsL3BhdHRlcm4tY29tcGlsZScpXG5cbmZ1bmN0aW9uIGlubGluZUNvZGUobm9kZSwgcGFyZW50LCBjb250ZXh0KSB7XG4gIHZhciB2YWx1ZSA9IG5vZGUudmFsdWUgfHwgJydcbiAgdmFyIHNlcXVlbmNlID0gJ2AnXG4gIHZhciBpbmRleCA9IC0xXG4gIHZhciBwYXR0ZXJuXG4gIHZhciBleHByZXNzaW9uXG4gIHZhciBtYXRjaFxuICB2YXIgcG9zaXRpb25cblxuICAvLyBJZiB0aGVyZSBpcyBhIHNpbmdsZSBncmF2ZSBhY2NlbnQgb24gaXRzIG93biBpbiB0aGUgY29kZSwgdXNlIGEgZmVuY2Ugb2ZcbiAgLy8gdHdvLlxuICAvLyBJZiB0aGVyZSBhcmUgdHdvIGluIGEgcm93LCB1c2Ugb25lLlxuICB3aGlsZSAobmV3IFJlZ0V4cCgnKF58W15gXSknICsgc2VxdWVuY2UgKyAnKFteYF18JCknKS50ZXN0KHZhbHVlKSkge1xuICAgIHNlcXVlbmNlICs9ICdgJ1xuICB9XG5cbiAgLy8gSWYgdGhpcyBpcyBub3QganVzdCBzcGFjZXMgb3IgZW9scyAodGFicyBkb25cdTIwMTl0IGNvdW50KSwgYW5kIGVpdGhlciB0aGVcbiAgLy8gZmlyc3Qgb3IgbGFzdCBjaGFyYWN0ZXIgYXJlIGEgc3BhY2UsIGVvbCwgb3IgdGljaywgdGhlbiBwYWQgd2l0aCBzcGFjZXMuXG4gIGlmIChcbiAgICAvW14gXFxyXFxuXS8udGVzdCh2YWx1ZSkgJiZcbiAgICAoL1sgXFxyXFxuYF0vLnRlc3QodmFsdWUuY2hhckF0KDApKSB8fFxuICAgICAgL1sgXFxyXFxuYF0vLnRlc3QodmFsdWUuY2hhckF0KHZhbHVlLmxlbmd0aCAtIDEpKSlcbiAgKSB7XG4gICAgdmFsdWUgPSAnICcgKyB2YWx1ZSArICcgJ1xuICB9XG5cbiAgLy8gV2UgaGF2ZSBhIHBvdGVudGlhbCBwcm9ibGVtOiBjZXJ0YWluIGNoYXJhY3RlcnMgYWZ0ZXIgZW9scyBjb3VsZCByZXN1bHQgaW5cbiAgLy8gYmxvY2tzIGJlaW5nIHNlZW4uXG4gIC8vIEZvciBleGFtcGxlLCBpZiBzb21lb25lIGluamVjdGVkIHRoZSBzdHJpbmcgYCdcXG4jIGInYCwgdGhlbiB0aGF0IHdvdWxkXG4gIC8vIHJlc3VsdCBpbiBhbiBBVFggaGVhZGluZy5cbiAgLy8gV2UgY2FuXHUyMDE5dCBlc2NhcGUgY2hhcmFjdGVycyBpbiBgaW5saW5lQ29kZWAsIGJ1dCBiZWNhdXNlIGVvbHMgYXJlXG4gIC8vIHRyYW5zZm9ybWVkIHRvIHNwYWNlcyB3aGVuIGdvaW5nIGZyb20gbWFya2Rvd24gdG8gSFRNTCBhbnl3YXksIHdlIGNhbiBzd2FwXG4gIC8vIHRoZW0gb3V0LlxuICB3aGlsZSAoKytpbmRleCA8IGNvbnRleHQudW5zYWZlLmxlbmd0aCkge1xuICAgIHBhdHRlcm4gPSBjb250ZXh0LnVuc2FmZVtpbmRleF1cblxuICAgIC8vIE9ubHkgbG9vayBmb3IgYGF0QnJlYWtgcy5cbiAgICAvLyBCdHc6IG5vdGUgdGhhdCBgYXRCcmVha2AgcGF0dGVybnMgd2lsbCBhbHdheXMgc3RhcnQgdGhlIHJlZ2V4IGF0IExGIG9yXG4gICAgLy8gQ1IuXG4gICAgaWYgKCFwYXR0ZXJuLmF0QnJlYWspIGNvbnRpbnVlXG5cbiAgICBleHByZXNzaW9uID0gcGF0dGVybkNvbXBpbGUocGF0dGVybilcblxuICAgIHdoaWxlICgobWF0Y2ggPSBleHByZXNzaW9uLmV4ZWModmFsdWUpKSkge1xuICAgICAgcG9zaXRpb24gPSBtYXRjaC5pbmRleFxuXG4gICAgICAvLyBTdXBwb3J0IENSTEYgKHBhdHRlcm5zIG9ubHkgbG9vayBmb3Igb25lIG9mIHRoZSBjaGFyYWN0ZXJzKS5cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUuY2hhckNvZGVBdChwb3NpdGlvbikgPT09IDEwIC8qIGBcXG5gICovICYmXG4gICAgICAgIHZhbHVlLmNoYXJDb2RlQXQocG9zaXRpb24gLSAxKSA9PT0gMTMgLyogYFxccmAgKi9cbiAgICAgICkge1xuICAgICAgICBwb3NpdGlvbi0tXG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgcG9zaXRpb24pICsgJyAnICsgdmFsdWUuc2xpY2UobWF0Y2guaW5kZXggKyAxKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzZXF1ZW5jZSArIHZhbHVlICsgc2VxdWVuY2Vcbn1cblxuZnVuY3Rpb24gaW5saW5lQ29kZVBlZWsoKSB7XG4gIHJldHVybiAnYCdcbn1cbiIsICIvKiFcbiAqIHJlcGVhdC1zdHJpbmcgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L3JlcGVhdC1zdHJpbmc+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBSZXN1bHRzIGNhY2hlXG4gKi9cblxudmFyIHJlcyA9ICcnO1xudmFyIGNhY2hlO1xuXG4vKipcbiAqIEV4cG9zZSBgcmVwZWF0YFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVwZWF0O1xuXG4vKipcbiAqIFJlcGVhdCB0aGUgZ2l2ZW4gYHN0cmluZ2AgdGhlIHNwZWNpZmllZCBgbnVtYmVyYFxuICogb2YgdGltZXMuXG4gKlxuICogKipFeGFtcGxlOioqXG4gKlxuICogYGBganNcbiAqIHZhciByZXBlYXQgPSByZXF1aXJlKCdyZXBlYXQtc3RyaW5nJyk7XG4gKiByZXBlYXQoJ0EnLCA1KTtcbiAqIC8vPT4gQUFBQUFcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyaW5nYCBUaGUgc3RyaW5nIHRvIHJlcGVhdFxuICogQHBhcmFtIHtOdW1iZXJ9IGBudW1iZXJgIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmdcbiAqIEByZXR1cm4ge1N0cmluZ30gUmVwZWF0ZWQgc3RyaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHJlcGVhdChzdHIsIG51bSkge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleHBlY3RlZCBhIHN0cmluZycpO1xuICB9XG5cbiAgLy8gY292ZXIgY29tbW9uLCBxdWljayB1c2UgY2FzZXNcbiAgaWYgKG51bSA9PT0gMSkgcmV0dXJuIHN0cjtcbiAgaWYgKG51bSA9PT0gMikgcmV0dXJuIHN0ciArIHN0cjtcblxuICB2YXIgbWF4ID0gc3RyLmxlbmd0aCAqIG51bTtcbiAgaWYgKGNhY2hlICE9PSBzdHIgfHwgdHlwZW9mIGNhY2hlID09PSAndW5kZWZpbmVkJykge1xuICAgIGNhY2hlID0gc3RyO1xuICAgIHJlcyA9ICcnO1xuICB9IGVsc2UgaWYgKHJlcy5sZW5ndGggPj0gbWF4KSB7XG4gICAgcmV0dXJuIHJlcy5zdWJzdHIoMCwgbWF4KTtcbiAgfVxuXG4gIHdoaWxlIChtYXggPiByZXMubGVuZ3RoICYmIG51bSA+IDEpIHtcbiAgICBpZiAobnVtICYgMSkge1xuICAgICAgcmVzICs9IHN0cjtcbiAgICB9XG5cbiAgICBudW0gPj49IDE7XG4gICAgc3RyICs9IHN0cjtcbiAgfVxuXG4gIHJlcyArPSBzdHI7XG4gIHJlcyA9IHJlcy5zdWJzdHIoMCwgbWF4KTtcbiAgcmV0dXJuIHJlcztcbn1cbiIsICIndXNlIHN0cmljdCdcblxudmFyIHJlcGVhdCA9IHJlcXVpcmUoJ3JlcGVhdC1zdHJpbmcnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcmtkb3duVGFibGVcblxudmFyIHRyYWlsaW5nV2hpdGVzcGFjZSA9IC8gKyQvXG5cbi8vIENoYXJhY3RlcnMuXG52YXIgc3BhY2UgPSAnICdcbnZhciBsaW5lRmVlZCA9ICdcXG4nXG52YXIgZGFzaCA9ICctJ1xudmFyIGNvbG9uID0gJzonXG52YXIgdmVydGljYWxCYXIgPSAnfCdcblxudmFyIHggPSAwXG52YXIgQyA9IDY3XG52YXIgTCA9IDc2XG52YXIgUiA9IDgyXG52YXIgYyA9IDk5XG52YXIgbCA9IDEwOFxudmFyIHIgPSAxMTRcblxuLy8gQ3JlYXRlIGEgdGFibGUgZnJvbSBhIG1hdHJpeCBvZiBzdHJpbmdzLlxuZnVuY3Rpb24gbWFya2Rvd25UYWJsZSh0YWJsZSwgb3B0aW9ucykge1xuICB2YXIgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9XG4gIHZhciBwYWRkaW5nID0gc2V0dGluZ3MucGFkZGluZyAhPT0gZmFsc2VcbiAgdmFyIHN0YXJ0ID0gc2V0dGluZ3MuZGVsaW1pdGVyU3RhcnQgIT09IGZhbHNlXG4gIHZhciBlbmQgPSBzZXR0aW5ncy5kZWxpbWl0ZXJFbmQgIT09IGZhbHNlXG4gIHZhciBhbGlnbiA9IChzZXR0aW5ncy5hbGlnbiB8fCBbXSkuY29uY2F0KClcbiAgdmFyIGFsaWduRGVsaW1pdGVycyA9IHNldHRpbmdzLmFsaWduRGVsaW1pdGVycyAhPT0gZmFsc2VcbiAgdmFyIGFsaWdubWVudHMgPSBbXVxuICB2YXIgc3RyaW5nTGVuZ3RoID0gc2V0dGluZ3Muc3RyaW5nTGVuZ3RoIHx8IGRlZmF1bHRTdHJpbmdMZW5ndGhcbiAgdmFyIHJvd0luZGV4ID0gLTFcbiAgdmFyIHJvd0xlbmd0aCA9IHRhYmxlLmxlbmd0aFxuICB2YXIgY2VsbE1hdHJpeCA9IFtdXG4gIHZhciBzaXplTWF0cml4ID0gW11cbiAgdmFyIHJvdyA9IFtdXG4gIHZhciBzaXplcyA9IFtdXG4gIHZhciBsb25nZXN0Q2VsbEJ5Q29sdW1uID0gW11cbiAgdmFyIG1vc3RDZWxsc1BlclJvdyA9IDBcbiAgdmFyIGNlbGxzXG4gIHZhciBjb2x1bW5JbmRleFxuICB2YXIgY29sdW1uTGVuZ3RoXG4gIHZhciBsYXJnZXN0XG4gIHZhciBzaXplXG4gIHZhciBjZWxsXG4gIHZhciBsaW5lc1xuICB2YXIgbGluZVxuICB2YXIgYmVmb3JlXG4gIHZhciBhZnRlclxuICB2YXIgY29kZVxuXG4gIC8vIFRoaXMgaXMgYSBzdXBlcmZsdW91cyBsb29wIGlmIHdlIGRvblx1MjAxOXQgYWxpZ24gZGVsaW1pdGVycywgYnV0IG90aGVyd2lzZSB3ZVx1MjAxOWRcbiAgLy8gZG8gc3VwZXJmbHVvdXMgd29yayB3aGVuIGFsaWduaW5nLCBzbyBvcHRpbWl6ZSBmb3IgYWxpZ25pbmcuXG4gIHdoaWxlICgrK3Jvd0luZGV4IDwgcm93TGVuZ3RoKSB7XG4gICAgY2VsbHMgPSB0YWJsZVtyb3dJbmRleF1cbiAgICBjb2x1bW5JbmRleCA9IC0xXG4gICAgY29sdW1uTGVuZ3RoID0gY2VsbHMubGVuZ3RoXG4gICAgcm93ID0gW11cbiAgICBzaXplcyA9IFtdXG5cbiAgICBpZiAoY29sdW1uTGVuZ3RoID4gbW9zdENlbGxzUGVyUm93KSB7XG4gICAgICBtb3N0Q2VsbHNQZXJSb3cgPSBjb2x1bW5MZW5ndGhcbiAgICB9XG5cbiAgICB3aGlsZSAoKytjb2x1bW5JbmRleCA8IGNvbHVtbkxlbmd0aCkge1xuICAgICAgY2VsbCA9IHNlcmlhbGl6ZShjZWxsc1tjb2x1bW5JbmRleF0pXG5cbiAgICAgIGlmIChhbGlnbkRlbGltaXRlcnMgPT09IHRydWUpIHtcbiAgICAgICAgc2l6ZSA9IHN0cmluZ0xlbmd0aChjZWxsKVxuICAgICAgICBzaXplc1tjb2x1bW5JbmRleF0gPSBzaXplXG5cbiAgICAgICAgbGFyZ2VzdCA9IGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXhdXG5cbiAgICAgICAgaWYgKGxhcmdlc3QgPT09IHVuZGVmaW5lZCB8fCBzaXplID4gbGFyZ2VzdCkge1xuICAgICAgICAgIGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXhdID0gc2l6ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJvdy5wdXNoKGNlbGwpXG4gICAgfVxuXG4gICAgY2VsbE1hdHJpeFtyb3dJbmRleF0gPSByb3dcbiAgICBzaXplTWF0cml4W3Jvd0luZGV4XSA9IHNpemVzXG4gIH1cblxuICAvLyBGaWd1cmUgb3V0IHdoaWNoIGFsaWdubWVudHMgdG8gdXNlLlxuICBjb2x1bW5JbmRleCA9IC0xXG4gIGNvbHVtbkxlbmd0aCA9IG1vc3RDZWxsc1BlclJvd1xuXG4gIGlmICh0eXBlb2YgYWxpZ24gPT09ICdvYmplY3QnICYmICdsZW5ndGgnIGluIGFsaWduKSB7XG4gICAgd2hpbGUgKCsrY29sdW1uSW5kZXggPCBjb2x1bW5MZW5ndGgpIHtcbiAgICAgIGFsaWdubWVudHNbY29sdW1uSW5kZXhdID0gdG9BbGlnbm1lbnQoYWxpZ25bY29sdW1uSW5kZXhdKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb2RlID0gdG9BbGlnbm1lbnQoYWxpZ24pXG5cbiAgICB3aGlsZSAoKytjb2x1bW5JbmRleCA8IGNvbHVtbkxlbmd0aCkge1xuICAgICAgYWxpZ25tZW50c1tjb2x1bW5JbmRleF0gPSBjb2RlXG4gICAgfVxuICB9XG5cbiAgLy8gSW5qZWN0IHRoZSBhbGlnbm1lbnQgcm93LlxuICBjb2x1bW5JbmRleCA9IC0xXG4gIGNvbHVtbkxlbmd0aCA9IG1vc3RDZWxsc1BlclJvd1xuICByb3cgPSBbXVxuICBzaXplcyA9IFtdXG5cbiAgd2hpbGUgKCsrY29sdW1uSW5kZXggPCBjb2x1bW5MZW5ndGgpIHtcbiAgICBjb2RlID0gYWxpZ25tZW50c1tjb2x1bW5JbmRleF1cbiAgICBiZWZvcmUgPSAnJ1xuICAgIGFmdGVyID0gJydcblxuICAgIGlmIChjb2RlID09PSBsKSB7XG4gICAgICBiZWZvcmUgPSBjb2xvblxuICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gcikge1xuICAgICAgYWZ0ZXIgPSBjb2xvblxuICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gYykge1xuICAgICAgYmVmb3JlID0gY29sb25cbiAgICAgIGFmdGVyID0gY29sb25cbiAgICB9XG5cbiAgICAvLyBUaGVyZSAqbXVzdCogYmUgYXQgbGVhc3Qgb25lIGh5cGhlbi1taW51cyBpbiBlYWNoIGFsaWdubWVudCBjZWxsLlxuICAgIHNpemUgPSBhbGlnbkRlbGltaXRlcnNcbiAgICAgID8gTWF0aC5tYXgoXG4gICAgICAgICAgMSxcbiAgICAgICAgICBsb25nZXN0Q2VsbEJ5Q29sdW1uW2NvbHVtbkluZGV4XSAtIGJlZm9yZS5sZW5ndGggLSBhZnRlci5sZW5ndGhcbiAgICAgICAgKVxuICAgICAgOiAxXG5cbiAgICBjZWxsID0gYmVmb3JlICsgcmVwZWF0KGRhc2gsIHNpemUpICsgYWZ0ZXJcblxuICAgIGlmIChhbGlnbkRlbGltaXRlcnMgPT09IHRydWUpIHtcbiAgICAgIHNpemUgPSBiZWZvcmUubGVuZ3RoICsgc2l6ZSArIGFmdGVyLmxlbmd0aFxuXG4gICAgICBpZiAoc2l6ZSA+IGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXhdKSB7XG4gICAgICAgIGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXhdID0gc2l6ZVxuICAgICAgfVxuXG4gICAgICBzaXplc1tjb2x1bW5JbmRleF0gPSBzaXplXG4gICAgfVxuXG4gICAgcm93W2NvbHVtbkluZGV4XSA9IGNlbGxcbiAgfVxuXG4gIC8vIEluamVjdCB0aGUgYWxpZ25tZW50IHJvdy5cbiAgY2VsbE1hdHJpeC5zcGxpY2UoMSwgMCwgcm93KVxuICBzaXplTWF0cml4LnNwbGljZSgxLCAwLCBzaXplcylcblxuICByb3dJbmRleCA9IC0xXG4gIHJvd0xlbmd0aCA9IGNlbGxNYXRyaXgubGVuZ3RoXG4gIGxpbmVzID0gW11cblxuICB3aGlsZSAoKytyb3dJbmRleCA8IHJvd0xlbmd0aCkge1xuICAgIHJvdyA9IGNlbGxNYXRyaXhbcm93SW5kZXhdXG4gICAgc2l6ZXMgPSBzaXplTWF0cml4W3Jvd0luZGV4XVxuICAgIGNvbHVtbkluZGV4ID0gLTFcbiAgICBjb2x1bW5MZW5ndGggPSBtb3N0Q2VsbHNQZXJSb3dcbiAgICBsaW5lID0gW11cblxuICAgIHdoaWxlICgrK2NvbHVtbkluZGV4IDwgY29sdW1uTGVuZ3RoKSB7XG4gICAgICBjZWxsID0gcm93W2NvbHVtbkluZGV4XSB8fCAnJ1xuICAgICAgYmVmb3JlID0gJydcbiAgICAgIGFmdGVyID0gJydcblxuICAgICAgaWYgKGFsaWduRGVsaW1pdGVycyA9PT0gdHJ1ZSkge1xuICAgICAgICBzaXplID0gbG9uZ2VzdENlbGxCeUNvbHVtbltjb2x1bW5JbmRleF0gLSAoc2l6ZXNbY29sdW1uSW5kZXhdIHx8IDApXG4gICAgICAgIGNvZGUgPSBhbGlnbm1lbnRzW2NvbHVtbkluZGV4XVxuXG4gICAgICAgIGlmIChjb2RlID09PSByKSB7XG4gICAgICAgICAgYmVmb3JlID0gcmVwZWF0KHNwYWNlLCBzaXplKVxuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IGMpIHtcbiAgICAgICAgICBpZiAoc2l6ZSAlIDIgPT09IDApIHtcbiAgICAgICAgICAgIGJlZm9yZSA9IHJlcGVhdChzcGFjZSwgc2l6ZSAvIDIpXG4gICAgICAgICAgICBhZnRlciA9IGJlZm9yZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiZWZvcmUgPSByZXBlYXQoc3BhY2UsIHNpemUgLyAyICsgMC41KVxuICAgICAgICAgICAgYWZ0ZXIgPSByZXBlYXQoc3BhY2UsIHNpemUgLyAyIC0gMC41KVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZnRlciA9IHJlcGVhdChzcGFjZSwgc2l6ZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RhcnQgPT09IHRydWUgJiYgY29sdW1uSW5kZXggPT09IDApIHtcbiAgICAgICAgbGluZS5wdXNoKHZlcnRpY2FsQmFyKVxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHBhZGRpbmcgPT09IHRydWUgJiZcbiAgICAgICAgLy8gRG9uXHUyMDE5dCBhZGQgdGhlIG9wZW5pbmcgc3BhY2UgaWYgd2VcdTIwMTlyZSBub3QgYWxpZ25pbmcgYW5kIHRoZSBjZWxsIGlzXG4gICAgICAgIC8vIGVtcHR5OiB0aGVyZSB3aWxsIGJlIGEgY2xvc2luZyBzcGFjZS5cbiAgICAgICAgIShhbGlnbkRlbGltaXRlcnMgPT09IGZhbHNlICYmIGNlbGwgPT09ICcnKSAmJlxuICAgICAgICAoc3RhcnQgPT09IHRydWUgfHwgY29sdW1uSW5kZXggIT09IDApXG4gICAgICApIHtcbiAgICAgICAgbGluZS5wdXNoKHNwYWNlKVxuICAgICAgfVxuXG4gICAgICBpZiAoYWxpZ25EZWxpbWl0ZXJzID09PSB0cnVlKSB7XG4gICAgICAgIGxpbmUucHVzaChiZWZvcmUpXG4gICAgICB9XG5cbiAgICAgIGxpbmUucHVzaChjZWxsKVxuXG4gICAgICBpZiAoYWxpZ25EZWxpbWl0ZXJzID09PSB0cnVlKSB7XG4gICAgICAgIGxpbmUucHVzaChhZnRlcilcbiAgICAgIH1cblxuICAgICAgaWYgKHBhZGRpbmcgPT09IHRydWUpIHtcbiAgICAgICAgbGluZS5wdXNoKHNwYWNlKVxuICAgICAgfVxuXG4gICAgICBpZiAoZW5kID09PSB0cnVlIHx8IGNvbHVtbkluZGV4ICE9PSBjb2x1bW5MZW5ndGggLSAxKSB7XG4gICAgICAgIGxpbmUucHVzaCh2ZXJ0aWNhbEJhcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaW5lID0gbGluZS5qb2luKCcnKVxuXG4gICAgaWYgKGVuZCA9PT0gZmFsc2UpIHtcbiAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UodHJhaWxpbmdXaGl0ZXNwYWNlLCAnJylcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKGxpbmUpXG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbihsaW5lRmVlZClcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcodmFsdWUpXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRTdHJpbmdMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLmxlbmd0aFxufVxuXG5mdW5jdGlvbiB0b0FsaWdubWVudCh2YWx1ZSkge1xuICB2YXIgY29kZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS5jaGFyQ29kZUF0KDApIDogeFxuXG4gIHJldHVybiBjb2RlID09PSBMIHx8IGNvZGUgPT09IGxcbiAgICA/IGxcbiAgICA6IGNvZGUgPT09IFIgfHwgY29kZSA9PT0gclxuICAgID8gclxuICAgIDogY29kZSA9PT0gQyB8fCBjb2RlID09PSBjXG4gICAgPyBjXG4gICAgOiB4XG59XG4iLCAidmFyIHBocmFzaW5nID0gcmVxdWlyZSgnbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jb250YWluZXItcGhyYXNpbmcnKVxudmFyIGRlZmF1bHRJbmxpbmVDb2RlID0gcmVxdWlyZSgnbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2lubGluZS1jb2RlJylcbnZhciBtYXJrZG93blRhYmxlID0gcmVxdWlyZSgnbWFya2Rvd24tdGFibGUnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvTWFya2Rvd25cblxuZnVuY3Rpb24gdG9NYXJrZG93bihvcHRpb25zKSB7XG4gIHZhciBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge31cbiAgdmFyIHBhZGRpbmcgPSBzZXR0aW5ncy50YWJsZUNlbGxQYWRkaW5nXG4gIHZhciBhbGlnbkRlbGltaXRlcnMgPSBzZXR0aW5ncy50YWJsZVBpcGVBbGlnblxuICB2YXIgc3RyaW5nTGVuZ3RoID0gc2V0dGluZ3Muc3RyaW5nTGVuZ3RoXG4gIHZhciBhcm91bmQgPSBwYWRkaW5nID8gJyAnIDogJ3wnXG5cbiAgcmV0dXJuIHtcbiAgICB1bnNhZmU6IFtcbiAgICAgIHtjaGFyYWN0ZXI6ICdcXHInLCBpbkNvbnN0cnVjdDogJ3RhYmxlQ2VsbCd9LFxuICAgICAge2NoYXJhY3RlcjogJ1xcbicsIGluQ29uc3RydWN0OiAndGFibGVDZWxsJ30sXG4gICAgICAvLyBBIHBpcGUsIHdoZW4gZm9sbG93ZWQgYnkgYSB0YWIgb3Igc3BhY2UgKHBhZGRpbmcpLCBvciBhIGRhc2ggb3IgY29sb25cbiAgICAgIC8vICh1bnBhZGRlZCBkZWxpbWl0ZXIgcm93KSwgY291bGQgcmVzdWx0IGluIGEgdGFibGUuXG4gICAgICB7YXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAnfCcsIGFmdGVyOiAnW1xcdCA6LV0nfSxcbiAgICAgIC8vIEEgcGlwZSBpbiBhIGNlbGwgbXVzdCBiZSBlbmNvZGVkLlxuICAgICAge2NoYXJhY3RlcjogJ3wnLCBpbkNvbnN0cnVjdDogJ3RhYmxlQ2VsbCd9LFxuICAgICAgLy8gQSBjb2xvbiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgZGFzaCwgaW4gd2hpY2ggY2FzZSBpdCBjb3VsZCBzdGFydCBhXG4gICAgICAvLyBkZWxpbWl0ZXIgcm93LlxuICAgICAge2F0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogJzonLCBhZnRlcjogJy0nfSxcbiAgICAgIC8vIEEgZGVsaW1pdGVyIHJvdyBjYW4gYWxzbyBzdGFydCB3aXRoIGEgZGFzaCwgd2hlbiBmb2xsb3dlZCBieSBtb3JlXG4gICAgICAvLyBkYXNoZXMsIGEgY29sb24sIG9yIGEgcGlwZS5cbiAgICAgIC8vIFRoaXMgaXMgYSBzdHJpY3RlciB2ZXJzaW9uIHRoYW4gdGhlIGJ1aWx0IGluIGNoZWNrIGZvciBsaXN0cywgdGhlbWF0aWNcbiAgICAgIC8vIGJyZWFrcywgYW5kIHNldGV4IGhlYWRpbmcgdW5kZXJsaW5lcyB0aG91Z2g6XG4gICAgICAvLyA8aHR0cHM6Ly9naXRodWIuY29tL3N5bnRheC10cmVlL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vYmxvYi81MWEyMDM4L2xpYi91bnNhZmUuanMjTDU3PlxuICAgICAge2F0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogJy0nLCBhZnRlcjogJ1s6fC1dJ31cbiAgICBdLFxuICAgIGhhbmRsZXJzOiB7XG4gICAgICB0YWJsZTogaGFuZGxlVGFibGUsXG4gICAgICB0YWJsZVJvdzogaGFuZGxlVGFibGVSb3csXG4gICAgICB0YWJsZUNlbGw6IGhhbmRsZVRhYmxlQ2VsbCxcbiAgICAgIGlubGluZUNvZGU6IGlubGluZUNvZGVXaXRoVGFibGVcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVUYWJsZShub2RlLCBfLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZURhdGEoaGFuZGxlVGFibGVBc0RhdGEobm9kZSwgY29udGV4dCksIG5vZGUuYWxpZ24pXG4gIH1cblxuICAvLyBUaGlzIGZ1bmN0aW9uIGlzblx1MjAxOXQgcmVhbGx5IHVzZWQgbm9ybWFsbHksIGJlY2F1c2Ugd2UgaGFuZGxlIHJvd3MgYXQgdGhlXG4gIC8vIHRhYmxlIGxldmVsLlxuICAvLyBCdXQsIGlmIHNvbWVvbmUgcGFzc2VzIGluIGEgdGFibGUgcm93LCB0aGlzIGVuc3VyZXMgd2UgbWFrZSBzb21ld2hhdCBzZW5zZS5cbiAgZnVuY3Rpb24gaGFuZGxlVGFibGVSb3cobm9kZSwgXywgY29udGV4dCkge1xuICAgIHZhciByb3cgPSBoYW5kbGVUYWJsZVJvd0FzRGF0YShub2RlLCBjb250ZXh0KVxuICAgIC8vIGBtYXJrZG93bi10YWJsZWAgd2lsbCBhbHdheXMgYWRkIGFuIGFsaWduIHJvd1xuICAgIHZhciB2YWx1ZSA9IHNlcmlhbGl6ZURhdGEoW3Jvd10pXG4gICAgcmV0dXJuIHZhbHVlLnNsaWNlKDAsIHZhbHVlLmluZGV4T2YoJ1xcbicpKVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlVGFibGVDZWxsKG5vZGUsIF8sIGNvbnRleHQpIHtcbiAgICB2YXIgZXhpdCA9IGNvbnRleHQuZW50ZXIoJ3RhYmxlQ2VsbCcpXG4gICAgdmFyIHZhbHVlID0gcGhyYXNpbmcobm9kZSwgY29udGV4dCwge2JlZm9yZTogYXJvdW5kLCBhZnRlcjogYXJvdW5kfSlcbiAgICBleGl0KClcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGEobWF0cml4LCBhbGlnbikge1xuICAgIHJldHVybiBtYXJrZG93blRhYmxlKG1hdHJpeCwge1xuICAgICAgYWxpZ246IGFsaWduLFxuICAgICAgYWxpZ25EZWxpbWl0ZXJzOiBhbGlnbkRlbGltaXRlcnMsXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgc3RyaW5nTGVuZ3RoOiBzdHJpbmdMZW5ndGhcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlVGFibGVBc0RhdGEobm9kZSwgY29udGV4dCkge1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW5cbiAgICB2YXIgaW5kZXggPSAtMVxuICAgIHZhciBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGhcbiAgICB2YXIgcmVzdWx0ID0gW11cbiAgICB2YXIgc3ViZXhpdCA9IGNvbnRleHQuZW50ZXIoJ3RhYmxlJylcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaGFuZGxlVGFibGVSb3dBc0RhdGEoY2hpbGRyZW5baW5kZXhdLCBjb250ZXh0KVxuICAgIH1cblxuICAgIHN1YmV4aXQoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlVGFibGVSb3dBc0RhdGEobm9kZSwgY29udGV4dCkge1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW5cbiAgICB2YXIgaW5kZXggPSAtMVxuICAgIHZhciBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGhcbiAgICB2YXIgcmVzdWx0ID0gW11cbiAgICB2YXIgc3ViZXhpdCA9IGNvbnRleHQuZW50ZXIoJ3RhYmxlUm93JylcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaGFuZGxlVGFibGVDZWxsKGNoaWxkcmVuW2luZGV4XSwgbm9kZSwgY29udGV4dClcbiAgICB9XG5cbiAgICBzdWJleGl0KClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZ1bmN0aW9uIGlubGluZUNvZGVXaXRoVGFibGUobm9kZSwgcGFyZW50LCBjb250ZXh0KSB7XG4gICAgdmFyIHZhbHVlID0gZGVmYXVsdElubGluZUNvZGUobm9kZSwgcGFyZW50LCBjb250ZXh0KVxuXG4gICAgaWYgKGNvbnRleHQuc3RhY2suaW5kZXhPZigndGFibGVDZWxsJykgIT09IC0xKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcfC9nLCAnXFxcXCQmJylcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gY2hlY2tCdWxsZXRcblxuZnVuY3Rpb24gY2hlY2tCdWxsZXQoY29udGV4dCkge1xuICB2YXIgbWFya2VyID0gY29udGV4dC5vcHRpb25zLmJ1bGxldCB8fCAnKidcblxuICBpZiAobWFya2VyICE9PSAnKicgJiYgbWFya2VyICE9PSAnKycgJiYgbWFya2VyICE9PSAnLScpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQ2Fubm90IHNlcmlhbGl6ZSBpdGVtcyB3aXRoIGAnICtcbiAgICAgICAgbWFya2VyICtcbiAgICAgICAgJ2AgZm9yIGBvcHRpb25zLmJ1bGxldGAsIGV4cGVjdGVkIGAqYCwgYCtgLCBvciBgLWAnXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIG1hcmtlclxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gY2hlY2tMaXN0SXRlbUluZGVudFxuXG5mdW5jdGlvbiBjaGVja0xpc3RJdGVtSW5kZW50KGNvbnRleHQpIHtcbiAgdmFyIHN0eWxlID0gY29udGV4dC5vcHRpb25zLmxpc3RJdGVtSW5kZW50IHx8ICd0YWInXG5cbiAgaWYgKHN0eWxlID09PSAxIHx8IHN0eWxlID09PSAnMScpIHtcbiAgICByZXR1cm4gJ29uZSdcbiAgfVxuXG4gIGlmIChzdHlsZSAhPT0gJ3RhYicgJiYgc3R5bGUgIT09ICdvbmUnICYmIHN0eWxlICE9PSAnbWl4ZWQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0Nhbm5vdCBzZXJpYWxpemUgaXRlbXMgd2l0aCBgJyArXG4gICAgICAgIHN0eWxlICtcbiAgICAgICAgJ2AgZm9yIGBvcHRpb25zLmxpc3RJdGVtSW5kZW50YCwgZXhwZWN0ZWQgYHRhYmAsIGBvbmVgLCBvciBgbWl4ZWRgJ1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBzdHlsZVxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gZmxvd1xuXG52YXIgcmVwZWF0ID0gcmVxdWlyZSgncmVwZWF0LXN0cmluZycpXG5cbmZ1bmN0aW9uIGZsb3cocGFyZW50LCBjb250ZXh0KSB7XG4gIHZhciBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZHJlbiB8fCBbXVxuICB2YXIgcmVzdWx0cyA9IFtdXG4gIHZhciBpbmRleCA9IC0xXG4gIHZhciBjaGlsZFxuXG4gIHdoaWxlICgrK2luZGV4IDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgY2hpbGQgPSBjaGlsZHJlbltpbmRleF1cblxuICAgIHJlc3VsdHMucHVzaChcbiAgICAgIGNvbnRleHQuaGFuZGxlKGNoaWxkLCBwYXJlbnQsIGNvbnRleHQsIHtiZWZvcmU6ICdcXG4nLCBhZnRlcjogJ1xcbid9KVxuICAgIClcblxuICAgIGlmIChpbmRleCArIDEgPCBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdHMucHVzaChiZXR3ZWVuKGNoaWxkLCBjaGlsZHJlbltpbmRleCArIDFdKSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cy5qb2luKCcnKVxuXG4gIGZ1bmN0aW9uIGJldHdlZW4obGVmdCwgcmlnaHQpIHtcbiAgICB2YXIgaW5kZXggPSAtMVxuICAgIHZhciByZXN1bHRcblxuICAgIHdoaWxlICgrK2luZGV4IDwgY29udGV4dC5qb2luLmxlbmd0aCkge1xuICAgICAgcmVzdWx0ID0gY29udGV4dC5qb2luW2luZGV4XShsZWZ0LCByaWdodCwgcGFyZW50LCBjb250ZXh0KVxuXG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlIHx8IHJlc3VsdCA9PT0gMSkge1xuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHJlcGVhdCgnXFxuJywgMSArIE51bWJlcihyZXN1bHQpKVxuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gJ1xcblxcbjwhLS0tLT5cXG5cXG4nXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICdcXG5cXG4nXG4gIH1cbn1cbiIsICJtb2R1bGUuZXhwb3J0cyA9IGluZGVudExpbmVzXG5cbnZhciBlb2wgPSAvXFxyP1xcbnxcXHIvZ1xuXG5mdW5jdGlvbiBpbmRlbnRMaW5lcyh2YWx1ZSwgbWFwKSB7XG4gIHZhciByZXN1bHQgPSBbXVxuICB2YXIgc3RhcnQgPSAwXG4gIHZhciBsaW5lID0gMFxuICB2YXIgbWF0Y2hcblxuICB3aGlsZSAoKG1hdGNoID0gZW9sLmV4ZWModmFsdWUpKSkge1xuICAgIG9uZSh2YWx1ZS5zbGljZShzdGFydCwgbWF0Y2guaW5kZXgpKVxuICAgIHJlc3VsdC5wdXNoKG1hdGNoWzBdKVxuICAgIHN0YXJ0ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGhcbiAgICBsaW5lKytcbiAgfVxuXG4gIG9uZSh2YWx1ZS5zbGljZShzdGFydCkpXG5cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKVxuXG4gIGZ1bmN0aW9uIG9uZSh2YWx1ZSkge1xuICAgIHJlc3VsdC5wdXNoKG1hcCh2YWx1ZSwgbGluZSwgIXZhbHVlKSlcbiAgfVxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gbGlzdEl0ZW1cblxudmFyIHJlcGVhdCA9IHJlcXVpcmUoJ3JlcGVhdC1zdHJpbmcnKVxudmFyIGNoZWNrQnVsbGV0ID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjay1idWxsZXQnKVxudmFyIGNoZWNrTGlzdEl0ZW1JbmRlbnQgPSByZXF1aXJlKCcuLi91dGlsL2NoZWNrLWxpc3QtaXRlbS1pbmRlbnQnKVxudmFyIGZsb3cgPSByZXF1aXJlKCcuLi91dGlsL2NvbnRhaW5lci1mbG93JylcbnZhciBpbmRlbnRMaW5lcyA9IHJlcXVpcmUoJy4uL3V0aWwvaW5kZW50LWxpbmVzJylcblxuZnVuY3Rpb24gbGlzdEl0ZW0obm9kZSwgcGFyZW50LCBjb250ZXh0KSB7XG4gIHZhciBidWxsZXQgPSBjaGVja0J1bGxldChjb250ZXh0KVxuICB2YXIgbGlzdEl0ZW1JbmRlbnQgPSBjaGVja0xpc3RJdGVtSW5kZW50KGNvbnRleHQpXG4gIHZhciBzaXplXG4gIHZhciB2YWx1ZVxuICB2YXIgZXhpdFxuXG4gIGlmIChwYXJlbnQgJiYgcGFyZW50Lm9yZGVyZWQpIHtcbiAgICBidWxsZXQgPVxuICAgICAgKHBhcmVudC5zdGFydCA+IC0xID8gcGFyZW50LnN0YXJ0IDogMSkgK1xuICAgICAgKGNvbnRleHQub3B0aW9ucy5pbmNyZW1lbnRMaXN0TWFya2VyID09PSBmYWxzZVxuICAgICAgICA/IDBcbiAgICAgICAgOiBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihub2RlKSkgK1xuICAgICAgJy4nXG4gIH1cblxuICBzaXplID0gYnVsbGV0Lmxlbmd0aCArIDFcblxuICBpZiAoXG4gICAgbGlzdEl0ZW1JbmRlbnQgPT09ICd0YWInIHx8XG4gICAgKGxpc3RJdGVtSW5kZW50ID09PSAnbWl4ZWQnICYmICgocGFyZW50ICYmIHBhcmVudC5zcHJlYWQpIHx8IG5vZGUuc3ByZWFkKSlcbiAgKSB7XG4gICAgc2l6ZSA9IE1hdGguY2VpbChzaXplIC8gNCkgKiA0XG4gIH1cblxuICBleGl0ID0gY29udGV4dC5lbnRlcignbGlzdEl0ZW0nKVxuICB2YWx1ZSA9IGluZGVudExpbmVzKGZsb3cobm9kZSwgY29udGV4dCksIG1hcClcbiAgZXhpdCgpXG5cbiAgcmV0dXJuIHZhbHVlXG5cbiAgZnVuY3Rpb24gbWFwKGxpbmUsIGluZGV4LCBibGFuaykge1xuICAgIGlmIChpbmRleCkge1xuICAgICAgcmV0dXJuIChibGFuayA/ICcnIDogcmVwZWF0KCcgJywgc2l6ZSkpICsgbGluZVxuICAgIH1cblxuICAgIHJldHVybiAoYmxhbmsgPyBidWxsZXQgOiBidWxsZXQgKyByZXBlYXQoJyAnLCBzaXplIC0gYnVsbGV0Lmxlbmd0aCkpICsgbGluZVxuICB9XG59XG4iLCAidmFyIGRlZmF1bHRMaXN0SXRlbSA9IHJlcXVpcmUoJ21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9saXN0LWl0ZW0nKVxuXG5leHBvcnRzLnVuc2FmZSA9IFt7YXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAnLScsIGFmdGVyOiAnWzp8LV0nfV1cblxuZXhwb3J0cy5oYW5kbGVycyA9IHtcbiAgbGlzdEl0ZW06IGxpc3RJdGVtV2l0aFRhc2tMaXN0SXRlbVxufVxuXG5mdW5jdGlvbiBsaXN0SXRlbVdpdGhUYXNrTGlzdEl0ZW0obm9kZSwgcGFyZW50LCBjb250ZXh0KSB7XG4gIHZhciB2YWx1ZSA9IGRlZmF1bHRMaXN0SXRlbShub2RlLCBwYXJlbnQsIGNvbnRleHQpXG4gIHZhciBoZWFkID0gbm9kZS5jaGlsZHJlblswXVxuXG4gIGlmICh0eXBlb2Ygbm9kZS5jaGVja2VkID09PSAnYm9vbGVhbicgJiYgaGVhZCAmJiBoZWFkLnR5cGUgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eKD86WyorLV18XFxkK1xcLikoW1xcclxcbl18IHsxLDN9KS8sIGNoZWNrKVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlXG5cbiAgZnVuY3Rpb24gY2hlY2soJDApIHtcbiAgICByZXR1cm4gJDAgKyAnWycgKyAobm9kZS5jaGVja2VkID8gJ3gnIDogJyAnKSArICddICdcbiAgfVxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gY29uZmlndXJlXG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZShiYXNlLCBleHRlbnNpb24pIHtcbiAgdmFyIGluZGV4ID0gLTFcbiAgdmFyIGtleVxuXG4gIC8vIEZpcnN0IGRvIHN1YmV4dGVuc2lvbnMuXG4gIGlmIChleHRlbnNpb24uZXh0ZW5zaW9ucykge1xuICAgIHdoaWxlICgrK2luZGV4IDwgZXh0ZW5zaW9uLmV4dGVuc2lvbnMubGVuZ3RoKSB7XG4gICAgICBjb25maWd1cmUoYmFzZSwgZXh0ZW5zaW9uLmV4dGVuc2lvbnNbaW5kZXhdKVxuICAgIH1cbiAgfVxuXG4gIGZvciAoa2V5IGluIGV4dGVuc2lvbikge1xuICAgIGlmIChrZXkgPT09ICdleHRlbnNpb25zJykge1xuICAgICAgLy8gRW1wdHkuXG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICd1bnNhZmUnIHx8IGtleSA9PT0gJ2pvaW4nKSB7XG4gICAgICBiYXNlW2tleV0gPSBiYXNlW2tleV0uY29uY2F0KGV4dGVuc2lvbltrZXldIHx8IFtdKVxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnaGFuZGxlcnMnKSB7XG4gICAgICBiYXNlW2tleV0gPSBPYmplY3QuYXNzaWduKGJhc2Vba2V5XSwgZXh0ZW5zaW9uW2tleV0gfHwge30pXG4gICAgfSBlbHNlIHtcbiAgICAgIGJhc2Uub3B0aW9uc1trZXldID0gZXh0ZW5zaW9uW2tleV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFzZVxufVxuIiwgInZhciBhdXRvbGlua0xpdGVyYWwgPSByZXF1aXJlKCdtZGFzdC11dGlsLWdmbS1hdXRvbGluay1saXRlcmFsL3RvLW1hcmtkb3duJylcbnZhciBzdHJpa2V0aHJvdWdoID0gcmVxdWlyZSgnbWRhc3QtdXRpbC1nZm0tc3RyaWtldGhyb3VnaC90by1tYXJrZG93bicpXG52YXIgdGFibGUgPSByZXF1aXJlKCdtZGFzdC11dGlsLWdmbS10YWJsZS90by1tYXJrZG93bicpXG52YXIgdGFza0xpc3RJdGVtID0gcmVxdWlyZSgnbWRhc3QtdXRpbC1nZm0tdGFzay1saXN0LWl0ZW0vdG8tbWFya2Rvd24nKVxudmFyIGNvbmZpZ3VyZSA9IHJlcXVpcmUoJ21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2NvbmZpZ3VyZScpXG5cbm1vZHVsZS5leHBvcnRzID0gdG9NYXJrZG93blxuXG5mdW5jdGlvbiB0b01hcmtkb3duKG9wdGlvbnMpIHtcbiAgdmFyIGNvbmZpZyA9IGNvbmZpZ3VyZShcbiAgICB7aGFuZGxlcnM6IHt9LCBqb2luOiBbXSwgdW5zYWZlOiBbXSwgb3B0aW9uczoge319LFxuICAgIHtcbiAgICAgIGV4dGVuc2lvbnM6IFthdXRvbGlua0xpdGVyYWwsIHN0cmlrZXRocm91Z2gsIHRhYmxlKG9wdGlvbnMpLCB0YXNrTGlzdEl0ZW1dXG4gICAgfVxuICApXG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oY29uZmlnLm9wdGlvbnMsIHtcbiAgICBoYW5kbGVyczogY29uZmlnLmhhbmRsZXJzLFxuICAgIGpvaW46IGNvbmZpZy5qb2luLFxuICAgIHVuc2FmZTogY29uZmlnLnVuc2FmZVxuICB9KVxufVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgc3ludGF4ID0gcmVxdWlyZSgnbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0nKVxudmFyIGZyb21NYXJrZG93biA9IHJlcXVpcmUoJ21kYXN0LXV0aWwtZ2ZtL2Zyb20tbWFya2Rvd24nKVxudmFyIHRvTWFya2Rvd24gPSByZXF1aXJlKCdtZGFzdC11dGlsLWdmbS90by1tYXJrZG93bicpXG5cbnZhciB3YXJuaW5nSXNzdWVkXG5cbm1vZHVsZS5leHBvcnRzID0gZ2ZtXG5cbmZ1bmN0aW9uIGdmbShvcHRpb25zKSB7XG4gIHZhciBkYXRhID0gdGhpcy5kYXRhKClcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIG9sZCByZW1hcmsuICovXG4gIGlmIChcbiAgICAhd2FybmluZ0lzc3VlZCAmJlxuICAgICgodGhpcy5QYXJzZXIgJiZcbiAgICAgIHRoaXMuUGFyc2VyLnByb3RvdHlwZSAmJlxuICAgICAgdGhpcy5QYXJzZXIucHJvdG90eXBlLmJsb2NrVG9rZW5pemVycykgfHxcbiAgICAgICh0aGlzLkNvbXBpbGVyICYmXG4gICAgICAgIHRoaXMuQ29tcGlsZXIucHJvdG90eXBlICYmXG4gICAgICAgIHRoaXMuQ29tcGlsZXIucHJvdG90eXBlLnZpc2l0b3JzKSlcbiAgKSB7XG4gICAgd2FybmluZ0lzc3VlZCA9IHRydWVcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW3JlbWFyay1nZm1dIFdhcm5pbmc6IHBsZWFzZSB1cGdyYWRlIHRvIHJlbWFyayAxMyB0byB1c2UgdGhpcyBwbHVnaW4nXG4gICAgKVxuICB9XG5cbiAgYWRkKCdtaWNyb21hcmtFeHRlbnNpb25zJywgc3ludGF4KG9wdGlvbnMpKVxuICBhZGQoJ2Zyb21NYXJrZG93bkV4dGVuc2lvbnMnLCBmcm9tTWFya2Rvd24pXG4gIGFkZCgndG9NYXJrZG93bkV4dGVuc2lvbnMnLCB0b01hcmtkb3duKG9wdGlvbnMpKVxuXG4gIGZ1bmN0aW9uIGFkZChmaWVsZCwgdmFsdWUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBvdGhlciBleHRlbnNpb25zLiAqL1xuICAgIGlmIChkYXRhW2ZpZWxkXSkgZGF0YVtmaWVsZF0ucHVzaCh2YWx1ZSlcbiAgICBlbHNlIGRhdGFbZmllbGRdID0gW3ZhbHVlXVxuICB9XG59XG4iLCBudWxsLCAiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIGlzTm90aGluZyhzdWJqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIHN1YmplY3QgPT09ICd1bmRlZmluZWQnKSB8fCAoc3ViamVjdCA9PT0gbnVsbCk7XG59XG5cblxuZnVuY3Rpb24gaXNPYmplY3Qoc3ViamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBzdWJqZWN0ID09PSAnb2JqZWN0JykgJiYgKHN1YmplY3QgIT09IG51bGwpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoc2VxdWVuY2UpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2VxdWVuY2UpKSByZXR1cm4gc2VxdWVuY2U7XG4gIGVsc2UgaWYgKGlzTm90aGluZyhzZXF1ZW5jZSkpIHJldHVybiBbXTtcblxuICByZXR1cm4gWyBzZXF1ZW5jZSBdO1xufVxuXG5cbmZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIgaW5kZXgsIGxlbmd0aCwga2V5LCBzb3VyY2VLZXlzO1xuXG4gIGlmIChzb3VyY2UpIHtcbiAgICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGtleSA9IHNvdXJjZUtleXNbaW5kZXhdO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5cbmZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIGNvdW50KSB7XG4gIHZhciByZXN1bHQgPSAnJywgY3ljbGU7XG5cbiAgZm9yIChjeWNsZSA9IDA7IGN5Y2xlIDwgY291bnQ7IGN5Y2xlICs9IDEpIHtcbiAgICByZXN1bHQgKz0gc3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5mdW5jdGlvbiBpc05lZ2F0aXZlWmVybyhudW1iZXIpIHtcbiAgcmV0dXJuIChudW1iZXIgPT09IDApICYmIChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IDEgLyBudW1iZXIpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmlzTm90aGluZyAgICAgID0gaXNOb3RoaW5nO1xubW9kdWxlLmV4cG9ydHMuaXNPYmplY3QgICAgICAgPSBpc09iamVjdDtcbm1vZHVsZS5leHBvcnRzLnRvQXJyYXkgICAgICAgID0gdG9BcnJheTtcbm1vZHVsZS5leHBvcnRzLnJlcGVhdCAgICAgICAgID0gcmVwZWF0O1xubW9kdWxlLmV4cG9ydHMuaXNOZWdhdGl2ZVplcm8gPSBpc05lZ2F0aXZlWmVybztcbm1vZHVsZS5leHBvcnRzLmV4dGVuZCAgICAgICAgID0gZXh0ZW5kO1xuIiwgIi8vIFlBTUwgZXJyb3IgY2xhc3MuIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvODQ1ODk4NFxuLy9cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gWUFNTEV4Y2VwdGlvbihyZWFzb24sIG1hcmspIHtcbiAgLy8gU3VwZXIgY29uc3RydWN0b3JcbiAgRXJyb3IuY2FsbCh0aGlzKTtcblxuICB0aGlzLm5hbWUgPSAnWUFNTEV4Y2VwdGlvbic7XG4gIHRoaXMucmVhc29uID0gcmVhc29uO1xuICB0aGlzLm1hcmsgPSBtYXJrO1xuICB0aGlzLm1lc3NhZ2UgPSAodGhpcy5yZWFzb24gfHwgJyh1bmtub3duIHJlYXNvbiknKSArICh0aGlzLm1hcmsgPyAnICcgKyB0aGlzLm1hcmsudG9TdHJpbmcoKSA6ICcnKTtcblxuICAvLyBJbmNsdWRlIHN0YWNrIHRyYWNlIGluIGVycm9yIG9iamVjdFxuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAvLyBDaHJvbWUgYW5kIE5vZGVKU1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9IGVsc2Uge1xuICAgIC8vIEZGLCBJRSAxMCsgYW5kIFNhZmFyaSA2Ky4gRmFsbGJhY2sgZm9yIG90aGVyc1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrIHx8ICcnO1xuICB9XG59XG5cblxuLy8gSW5oZXJpdCBmcm9tIEVycm9yXG5ZQU1MRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbllBTUxFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gWUFNTEV4Y2VwdGlvbjtcblxuXG5ZQU1MRXhjZXB0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGNvbXBhY3QpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMubmFtZSArICc6ICc7XG5cbiAgcmVzdWx0ICs9IHRoaXMucmVhc29uIHx8ICcodW5rbm93biByZWFzb24pJztcblxuICBpZiAoIWNvbXBhY3QgJiYgdGhpcy5tYXJrKSB7XG4gICAgcmVzdWx0ICs9ICcgJyArIHRoaXMubWFyay50b1N0cmluZygpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBZQU1MRXhjZXB0aW9uO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxuXG5mdW5jdGlvbiBNYXJrKG5hbWUsIGJ1ZmZlciwgcG9zaXRpb24sIGxpbmUsIGNvbHVtbikge1xuICB0aGlzLm5hbWUgICAgID0gbmFtZTtcbiAgdGhpcy5idWZmZXIgICA9IGJ1ZmZlcjtcbiAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICB0aGlzLmxpbmUgICAgID0gbGluZTtcbiAgdGhpcy5jb2x1bW4gICA9IGNvbHVtbjtcbn1cblxuXG5NYXJrLnByb3RvdHlwZS5nZXRTbmlwcGV0ID0gZnVuY3Rpb24gZ2V0U25pcHBldChpbmRlbnQsIG1heExlbmd0aCkge1xuICB2YXIgaGVhZCwgc3RhcnQsIHRhaWwsIGVuZCwgc25pcHBldDtcblxuICBpZiAoIXRoaXMuYnVmZmVyKSByZXR1cm4gbnVsbDtcblxuICBpbmRlbnQgPSBpbmRlbnQgfHwgNDtcbiAgbWF4TGVuZ3RoID0gbWF4TGVuZ3RoIHx8IDc1O1xuXG4gIGhlYWQgPSAnJztcbiAgc3RhcnQgPSB0aGlzLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChzdGFydCA+IDAgJiYgJ1xceDAwXFxyXFxuXFx4ODVcXHUyMDI4XFx1MjAyOScuaW5kZXhPZih0aGlzLmJ1ZmZlci5jaGFyQXQoc3RhcnQgLSAxKSkgPT09IC0xKSB7XG4gICAgc3RhcnQgLT0gMTtcbiAgICBpZiAodGhpcy5wb3NpdGlvbiAtIHN0YXJ0ID4gKG1heExlbmd0aCAvIDIgLSAxKSkge1xuICAgICAgaGVhZCA9ICcgLi4uICc7XG4gICAgICBzdGFydCArPSA1O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdGFpbCA9ICcnO1xuICBlbmQgPSB0aGlzLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChlbmQgPCB0aGlzLmJ1ZmZlci5sZW5ndGggJiYgJ1xceDAwXFxyXFxuXFx4ODVcXHUyMDI4XFx1MjAyOScuaW5kZXhPZih0aGlzLmJ1ZmZlci5jaGFyQXQoZW5kKSkgPT09IC0xKSB7XG4gICAgZW5kICs9IDE7XG4gICAgaWYgKGVuZCAtIHRoaXMucG9zaXRpb24gPiAobWF4TGVuZ3RoIC8gMiAtIDEpKSB7XG4gICAgICB0YWlsID0gJyAuLi4gJztcbiAgICAgIGVuZCAtPSA1O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc25pcHBldCA9IHRoaXMuYnVmZmVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gIHJldHVybiBjb21tb24ucmVwZWF0KCcgJywgaW5kZW50KSArIGhlYWQgKyBzbmlwcGV0ICsgdGFpbCArICdcXG4nICtcbiAgICAgICAgIGNvbW1vbi5yZXBlYXQoJyAnLCBpbmRlbnQgKyB0aGlzLnBvc2l0aW9uIC0gc3RhcnQgKyBoZWFkLmxlbmd0aCkgKyAnXic7XG59O1xuXG5cbk1hcmsucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoY29tcGFjdCkge1xuICB2YXIgc25pcHBldCwgd2hlcmUgPSAnJztcblxuICBpZiAodGhpcy5uYW1lKSB7XG4gICAgd2hlcmUgKz0gJ2luIFwiJyArIHRoaXMubmFtZSArICdcIiAnO1xuICB9XG5cbiAgd2hlcmUgKz0gJ2F0IGxpbmUgJyArICh0aGlzLmxpbmUgKyAxKSArICcsIGNvbHVtbiAnICsgKHRoaXMuY29sdW1uICsgMSk7XG5cbiAgaWYgKCFjb21wYWN0KSB7XG4gICAgc25pcHBldCA9IHRoaXMuZ2V0U25pcHBldCgpO1xuXG4gICAgaWYgKHNuaXBwZXQpIHtcbiAgICAgIHdoZXJlICs9ICc6XFxuJyArIHNuaXBwZXQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdoZXJlO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcms7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG5cbnZhciBUWVBFX0NPTlNUUlVDVE9SX09QVElPTlMgPSBbXG4gICdraW5kJyxcbiAgJ3Jlc29sdmUnLFxuICAnY29uc3RydWN0JyxcbiAgJ2luc3RhbmNlT2YnLFxuICAncHJlZGljYXRlJyxcbiAgJ3JlcHJlc2VudCcsXG4gICdkZWZhdWx0U3R5bGUnLFxuICAnc3R5bGVBbGlhc2VzJ1xuXTtcblxudmFyIFlBTUxfTk9ERV9LSU5EUyA9IFtcbiAgJ3NjYWxhcicsXG4gICdzZXF1ZW5jZScsXG4gICdtYXBwaW5nJ1xuXTtcblxuZnVuY3Rpb24gY29tcGlsZVN0eWxlQWxpYXNlcyhtYXApIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGlmIChtYXAgIT09IG51bGwpIHtcbiAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICBtYXBbc3R5bGVdLmZvckVhY2goZnVuY3Rpb24gKGFsaWFzKSB7XG4gICAgICAgIHJlc3VsdFtTdHJpbmcoYWxpYXMpXSA9IHN0eWxlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBUeXBlKHRhZywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBPYmplY3Qua2V5cyhvcHRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKFRZUEVfQ09OU1RSVUNUT1JfT1BUSU9OUy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24gb3B0aW9uIFwiJyArIG5hbWUgKyAnXCIgaXMgbWV0IGluIGRlZmluaXRpb24gb2YgXCInICsgdGFnICsgJ1wiIFlBTUwgdHlwZS4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFRPRE86IEFkZCB0YWcgZm9ybWF0IGNoZWNrLlxuICB0aGlzLnRhZyAgICAgICAgICA9IHRhZztcbiAgdGhpcy5raW5kICAgICAgICAgPSBvcHRpb25zWydraW5kJ10gICAgICAgICB8fCBudWxsO1xuICB0aGlzLnJlc29sdmUgICAgICA9IG9wdGlvbnNbJ3Jlc29sdmUnXSAgICAgIHx8IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XG4gIHRoaXMuY29uc3RydWN0ICAgID0gb3B0aW9uc1snY29uc3RydWN0J10gICAgfHwgZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGE7IH07XG4gIHRoaXMuaW5zdGFuY2VPZiAgID0gb3B0aW9uc1snaW5zdGFuY2VPZiddICAgfHwgbnVsbDtcbiAgdGhpcy5wcmVkaWNhdGUgICAgPSBvcHRpb25zWydwcmVkaWNhdGUnXSAgICB8fCBudWxsO1xuICB0aGlzLnJlcHJlc2VudCAgICA9IG9wdGlvbnNbJ3JlcHJlc2VudCddICAgIHx8IG51bGw7XG4gIHRoaXMuZGVmYXVsdFN0eWxlID0gb3B0aW9uc1snZGVmYXVsdFN0eWxlJ10gfHwgbnVsbDtcbiAgdGhpcy5zdHlsZUFsaWFzZXMgPSBjb21waWxlU3R5bGVBbGlhc2VzKG9wdGlvbnNbJ3N0eWxlQWxpYXNlcyddIHx8IG51bGwpO1xuXG4gIGlmIChZQU1MX05PREVfS0lORFMuaW5kZXhPZih0aGlzLmtpbmQpID09PSAtMSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdVbmtub3duIGtpbmQgXCInICsgdGhpcy5raW5kICsgJ1wiIGlzIHNwZWNpZmllZCBmb3IgXCInICsgdGFnICsgJ1wiIFlBTUwgdHlwZS4nKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFR5cGU7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKmVzbGludC1kaXNhYmxlIG1heC1sZW4qL1xuXG52YXIgY29tbW9uICAgICAgICA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG52YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG52YXIgVHlwZSAgICAgICAgICA9IHJlcXVpcmUoJy4vdHlwZScpO1xuXG5cbmZ1bmN0aW9uIGNvbXBpbGVMaXN0KHNjaGVtYSwgbmFtZSwgcmVzdWx0KSB7XG4gIHZhciBleGNsdWRlID0gW107XG5cbiAgc2NoZW1hLmluY2x1ZGUuZm9yRWFjaChmdW5jdGlvbiAoaW5jbHVkZWRTY2hlbWEpIHtcbiAgICByZXN1bHQgPSBjb21waWxlTGlzdChpbmNsdWRlZFNjaGVtYSwgbmFtZSwgcmVzdWx0KTtcbiAgfSk7XG5cbiAgc2NoZW1hW25hbWVdLmZvckVhY2goZnVuY3Rpb24gKGN1cnJlbnRUeXBlKSB7XG4gICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKHByZXZpb3VzVHlwZSwgcHJldmlvdXNJbmRleCkge1xuICAgICAgaWYgKHByZXZpb3VzVHlwZS50YWcgPT09IGN1cnJlbnRUeXBlLnRhZyAmJiBwcmV2aW91c1R5cGUua2luZCA9PT0gY3VycmVudFR5cGUua2luZCkge1xuICAgICAgICBleGNsdWRlLnB1c2gocHJldmlvdXNJbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXN1bHQucHVzaChjdXJyZW50VHlwZSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uICh0eXBlLCBpbmRleCkge1xuICAgIHJldHVybiBleGNsdWRlLmluZGV4T2YoaW5kZXgpID09PSAtMTtcbiAgfSk7XG59XG5cblxuZnVuY3Rpb24gY29tcGlsZU1hcCgvKiBsaXN0cy4uLiAqLykge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICBzY2FsYXI6IHt9LFxuICAgICAgICBzZXF1ZW5jZToge30sXG4gICAgICAgIG1hcHBpbmc6IHt9LFxuICAgICAgICBmYWxsYmFjazoge31cbiAgICAgIH0sIGluZGV4LCBsZW5ndGg7XG5cbiAgZnVuY3Rpb24gY29sbGVjdFR5cGUodHlwZSkge1xuICAgIHJlc3VsdFt0eXBlLmtpbmRdW3R5cGUudGFnXSA9IHJlc3VsdFsnZmFsbGJhY2snXVt0eXBlLnRhZ10gPSB0eXBlO1xuICB9XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgYXJndW1lbnRzW2luZGV4XS5mb3JFYWNoKGNvbGxlY3RUeXBlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbmZ1bmN0aW9uIFNjaGVtYShkZWZpbml0aW9uKSB7XG4gIHRoaXMuaW5jbHVkZSAgPSBkZWZpbml0aW9uLmluY2x1ZGUgIHx8IFtdO1xuICB0aGlzLmltcGxpY2l0ID0gZGVmaW5pdGlvbi5pbXBsaWNpdCB8fCBbXTtcbiAgdGhpcy5leHBsaWNpdCA9IGRlZmluaXRpb24uZXhwbGljaXQgfHwgW107XG5cbiAgdGhpcy5pbXBsaWNpdC5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgaWYgKHR5cGUubG9hZEtpbmQgJiYgdHlwZS5sb2FkS2luZCAhPT0gJ3NjYWxhcicpIHtcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdUaGVyZSBpcyBhIG5vbi1zY2FsYXIgdHlwZSBpbiB0aGUgaW1wbGljaXQgbGlzdCBvZiBhIHNjaGVtYS4gSW1wbGljaXQgcmVzb2x2aW5nIG9mIHN1Y2ggdHlwZXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMuY29tcGlsZWRJbXBsaWNpdCA9IGNvbXBpbGVMaXN0KHRoaXMsICdpbXBsaWNpdCcsIFtdKTtcbiAgdGhpcy5jb21waWxlZEV4cGxpY2l0ID0gY29tcGlsZUxpc3QodGhpcywgJ2V4cGxpY2l0JywgW10pO1xuICB0aGlzLmNvbXBpbGVkVHlwZU1hcCAgPSBjb21waWxlTWFwKHRoaXMuY29tcGlsZWRJbXBsaWNpdCwgdGhpcy5jb21waWxlZEV4cGxpY2l0KTtcbn1cblxuXG5TY2hlbWEuREVGQVVMVCA9IG51bGw7XG5cblxuU2NoZW1hLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZVNjaGVtYSgpIHtcbiAgdmFyIHNjaGVtYXMsIHR5cGVzO1xuXG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHNjaGVtYXMgPSBTY2hlbWEuREVGQVVMVDtcbiAgICAgIHR5cGVzID0gYXJndW1lbnRzWzBdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDI6XG4gICAgICBzY2hlbWFzID0gYXJndW1lbnRzWzBdO1xuICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMV07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgU2NoZW1hLmNyZWF0ZSBmdW5jdGlvbicpO1xuICB9XG5cbiAgc2NoZW1hcyA9IGNvbW1vbi50b0FycmF5KHNjaGVtYXMpO1xuICB0eXBlcyA9IGNvbW1vbi50b0FycmF5KHR5cGVzKTtcblxuICBpZiAoIXNjaGVtYXMuZXZlcnkoZnVuY3Rpb24gKHNjaGVtYSkgeyByZXR1cm4gc2NoZW1hIGluc3RhbmNlb2YgU2NoZW1hOyB9KSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdTcGVjaWZpZWQgbGlzdCBvZiBzdXBlciBzY2hlbWFzIChvciBhIHNpbmdsZSBTY2hlbWEgb2JqZWN0KSBjb250YWlucyBhIG5vbi1TY2hlbWEgb2JqZWN0LicpO1xuICB9XG5cbiAgaWYgKCF0eXBlcy5ldmVyeShmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIFR5cGU7IH0pKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1NwZWNpZmllZCBsaXN0IG9mIFlBTUwgdHlwZXMgKG9yIGEgc2luZ2xlIFR5cGUgb2JqZWN0KSBjb250YWlucyBhIG5vbi1UeXBlIG9iamVjdC4nKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2NoZW1hKHtcbiAgICBpbmNsdWRlOiBzY2hlbWFzLFxuICAgIGV4cGxpY2l0OiB0eXBlc1xuICB9KTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY2hlbWE7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c3RyJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiAnJzsgfVxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c2VxJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IFtdOyB9XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjptYXAnLCB7XG4gIGtpbmQ6ICdtYXBwaW5nJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTsgfVxufSk7XG4iLCAiLy8gU3RhbmRhcmQgWUFNTCdzIEZhaWxzYWZlIHNjaGVtYS5cbi8vIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjgwMjM0NlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL3N0cicpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvc2VxJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9tYXAnKVxuICBdXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE51bGwoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoO1xuXG4gIHJldHVybiAobWF4ID09PSAxICYmIGRhdGEgPT09ICd+JykgfHxcbiAgICAgICAgIChtYXggPT09IDQgJiYgKGRhdGEgPT09ICdudWxsJyB8fCBkYXRhID09PSAnTnVsbCcgfHwgZGF0YSA9PT0gJ05VTEwnKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNOdWxsKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0ID09PSBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxOdWxsLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxOdWxsLFxuICBwcmVkaWNhdGU6IGlzTnVsbCxcbiAgcmVwcmVzZW50OiB7XG4gICAgY2Fub25pY2FsOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnfic7ICAgIH0sXG4gICAgbG93ZXJjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnbnVsbCc7IH0sXG4gICAgdXBwZXJjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnTlVMTCc7IH0sXG4gICAgY2FtZWxjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnTnVsbCc7IH1cbiAgfSxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxCb29sZWFuKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgbWF4ID0gZGF0YS5sZW5ndGg7XG5cbiAgcmV0dXJuIChtYXggPT09IDQgJiYgKGRhdGEgPT09ICd0cnVlJyB8fCBkYXRhID09PSAnVHJ1ZScgfHwgZGF0YSA9PT0gJ1RSVUUnKSkgfHxcbiAgICAgICAgIChtYXggPT09IDUgJiYgKGRhdGEgPT09ICdmYWxzZScgfHwgZGF0YSA9PT0gJ0ZhbHNlJyB8fCBkYXRhID09PSAnRkFMU0UnKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxCb29sZWFuKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgPT09ICd0cnVlJyB8fFxuICAgICAgICAgZGF0YSA9PT0gJ1RydWUnIHx8XG4gICAgICAgICBkYXRhID09PSAnVFJVRSc7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBCb29sZWFuXSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEJvb2xlYW4sXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEJvb2xlYW4sXG4gIHByZWRpY2F0ZTogaXNCb29sZWFuLFxuICByZXByZXNlbnQ6IHtcbiAgICBsb3dlcmNhc2U6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIG9iamVjdCA/ICd0cnVlJyA6ICdmYWxzZSc7IH0sXG4gICAgdXBwZXJjYXNlOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiBvYmplY3QgPyAnVFJVRScgOiAnRkFMU0UnOyB9LFxuICAgIGNhbWVsY2FzZTogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gb2JqZWN0ID8gJ1RydWUnIDogJ0ZhbHNlJzsgfVxuICB9LFxuICBkZWZhdWx0U3R5bGU6ICdsb3dlcmNhc2UnXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBUeXBlICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIGlzSGV4Q29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSkgfHxcbiAgICAgICAgICgoMHg0MS8qIEEgKi8gPD0gYykgJiYgKGMgPD0gMHg0Ni8qIEYgKi8pKSB8fFxuICAgICAgICAgKCgweDYxLyogYSAqLyA8PSBjKSAmJiAoYyA8PSAweDY2LyogZiAqLykpO1xufVxuXG5mdW5jdGlvbiBpc09jdENvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM3LyogNyAqLykpO1xufVxuXG5mdW5jdGlvbiBpc0RlY0NvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEludGVnZXIoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGluZGV4ID0gMCxcbiAgICAgIGhhc0RpZ2l0cyA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKCFtYXgpIHJldHVybiBmYWxzZTtcblxuICBjaCA9IGRhdGFbaW5kZXhdO1xuXG4gIC8vIHNpZ25cbiAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykge1xuICAgIGNoID0gZGF0YVsrK2luZGV4XTtcbiAgfVxuXG4gIGlmIChjaCA9PT0gJzAnKSB7XG4gICAgLy8gMFxuICAgIGlmIChpbmRleCArIDEgPT09IG1heCkgcmV0dXJuIHRydWU7XG4gICAgY2ggPSBkYXRhWysraW5kZXhdO1xuXG4gICAgLy8gYmFzZSAyLCBiYXNlIDgsIGJhc2UgMTZcblxuICAgIGlmIChjaCA9PT0gJ2InKSB7XG4gICAgICAvLyBiYXNlIDJcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgICAgIGlmIChjaCAhPT0gJzAnICYmIGNoICE9PSAnMScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNEaWdpdHMgJiYgY2ggIT09ICdfJztcbiAgICB9XG5cblxuICAgIGlmIChjaCA9PT0gJ3gnKSB7XG4gICAgICAvLyBiYXNlIDE2XG4gICAgICBpbmRleCsrO1xuXG4gICAgICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICAgICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWlzSGV4Q29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgpKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc0RpZ2l0cyAmJiBjaCAhPT0gJ18nO1xuICAgIH1cblxuICAgIC8vIGJhc2UgOFxuICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNPY3RDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleCkpKSByZXR1cm4gZmFsc2U7XG4gICAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzRGlnaXRzICYmIGNoICE9PSAnXyc7XG4gIH1cblxuICAvLyBiYXNlIDEwIChleGNlcHQgMCkgb3IgYmFzZSA2MFxuXG4gIC8vIHZhbHVlIHNob3VsZCBub3Qgc3RhcnQgd2l0aCBgX2A7XG4gIGlmIChjaCA9PT0gJ18nKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgaWYgKGNoID09PSAnOicpIGJyZWFrO1xuICAgIGlmICghaXNEZWNDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gIH1cblxuICAvLyBTaG91bGQgaGF2ZSBkaWdpdHMgYW5kIHNob3VsZCBub3QgZW5kIHdpdGggYF9gXG4gIGlmICghaGFzRGlnaXRzIHx8IGNoID09PSAnXycpIHJldHVybiBmYWxzZTtcblxuICAvLyBpZiAhYmFzZTYwIC0gZG9uZTtcbiAgaWYgKGNoICE9PSAnOicpIHJldHVybiB0cnVlO1xuXG4gIC8vIGJhc2U2MCBhbG1vc3Qgbm90IHVzZWQsIG5vIG5lZWRzIHRvIG9wdGltaXplXG4gIHJldHVybiAvXig6WzAtNV0/WzAtOV0pKyQvLnRlc3QoZGF0YS5zbGljZShpbmRleCkpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sSW50ZWdlcihkYXRhKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGEsIHNpZ24gPSAxLCBjaCwgYmFzZSwgZGlnaXRzID0gW107XG5cbiAgaWYgKHZhbHVlLmluZGV4T2YoJ18nKSAhPT0gLTEpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL18vZywgJycpO1xuICB9XG5cbiAgY2ggPSB2YWx1ZVswXTtcblxuICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7XG4gICAgaWYgKGNoID09PSAnLScpIHNpZ24gPSAtMTtcbiAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICAgIGNoID0gdmFsdWVbMF07XG4gIH1cblxuICBpZiAodmFsdWUgPT09ICcwJykgcmV0dXJuIDA7XG5cbiAgaWYgKGNoID09PSAnMCcpIHtcbiAgICBpZiAodmFsdWVbMV0gPT09ICdiJykgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgMik7XG4gICAgaWYgKHZhbHVlWzFdID09PSAneCcpIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUsIDE2KTtcbiAgICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLCA4KTtcbiAgfVxuXG4gIGlmICh2YWx1ZS5pbmRleE9mKCc6JykgIT09IC0xKSB7XG4gICAgdmFsdWUuc3BsaXQoJzonKS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUludCh2LCAxMCkpO1xuICAgIH0pO1xuXG4gICAgdmFsdWUgPSAwO1xuICAgIGJhc2UgPSAxO1xuXG4gICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhbHVlICs9IChkICogYmFzZSk7XG4gICAgICBiYXNlICo9IDYwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNpZ24gKiB2YWx1ZTtcblxuICB9XG5cbiAgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZSwgMTApO1xufVxuXG5mdW5jdGlvbiBpc0ludGVnZXIob2JqZWN0KSB7XG4gIHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJlxuICAgICAgICAgKG9iamVjdCAlIDEgPT09IDAgJiYgIWNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6aW50Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxJbnRlZ2VyLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxJbnRlZ2VyLFxuICBwcmVkaWNhdGU6IGlzSW50ZWdlcixcbiAgcmVwcmVzZW50OiB7XG4gICAgYmluYXJ5OiAgICAgIGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiA+PSAwID8gJzBiJyArIG9iai50b1N0cmluZygyKSA6ICctMGInICsgb2JqLnRvU3RyaW5nKDIpLnNsaWNlKDEpOyB9LFxuICAgIG9jdGFsOiAgICAgICBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogPj0gMCA/ICcwJyAgKyBvYmoudG9TdHJpbmcoOCkgOiAnLTAnICArIG9iai50b1N0cmluZyg4KS5zbGljZSgxKTsgfSxcbiAgICBkZWNpbWFsOiAgICAgZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqLnRvU3RyaW5nKDEwKTsgfSxcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG4gICAgaGV4YWRlY2ltYWw6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiA+PSAwID8gJzB4JyArIG9iai50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSA6ICAnLTB4JyArIG9iai50b1N0cmluZygxNikudG9VcHBlckNhc2UoKS5zbGljZSgxKTsgfVxuICB9LFxuICBkZWZhdWx0U3R5bGU6ICdkZWNpbWFsJyxcbiAgc3R5bGVBbGlhc2VzOiB7XG4gICAgYmluYXJ5OiAgICAgIFsgMiwgICdiaW4nIF0sXG4gICAgb2N0YWw6ICAgICAgIFsgOCwgICdvY3QnIF0sXG4gICAgZGVjaW1hbDogICAgIFsgMTAsICdkZWMnIF0sXG4gICAgaGV4YWRlY2ltYWw6IFsgMTYsICdoZXgnIF1cbiAgfVxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgVHlwZSAgID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgWUFNTF9GTE9BVF9QQVRURVJOID0gbmV3IFJlZ0V4cChcbiAgLy8gMi41ZTQsIDIuNSBhbmQgaW50ZWdlcnNcbiAgJ14oPzpbLStdPyg/OjB8WzEtOV1bMC05X10qKSg/OlxcXFwuWzAtOV9dKik/KD86W2VFXVstK10/WzAtOV0rKT8nICtcbiAgLy8gLjJlNCwgLjJcbiAgLy8gc3BlY2lhbCBjYXNlLCBzZWVtcyBub3QgZnJvbSBzcGVjXG4gICd8XFxcXC5bMC05X10rKD86W2VFXVstK10/WzAtOV0rKT8nICtcbiAgLy8gMjA6NTlcbiAgJ3xbLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrXFxcXC5bMC05X10qJyArXG4gIC8vIC5pbmZcbiAgJ3xbLStdP1xcXFwuKD86aW5mfEluZnxJTkYpJyArXG4gIC8vIC5uYW5cbiAgJ3xcXFxcLig/Om5hbnxOYU58TkFOKSkkJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sRmxvYXQoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICghWUFNTF9GTE9BVF9QQVRURVJOLnRlc3QoZGF0YSkgfHxcbiAgICAgIC8vIFF1aWNrIGhhY2sgdG8gbm90IGFsbG93IGludGVnZXJzIGVuZCB3aXRoIGBfYFxuICAgICAgLy8gUHJvYmFibHkgc2hvdWxkIHVwZGF0ZSByZWdleHAgJiBjaGVjayBzcGVlZFxuICAgICAgZGF0YVtkYXRhLmxlbmd0aCAtIDFdID09PSAnXycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEZsb2F0KGRhdGEpIHtcbiAgdmFyIHZhbHVlLCBzaWduLCBiYXNlLCBkaWdpdHM7XG5cbiAgdmFsdWUgID0gZGF0YS5yZXBsYWNlKC9fL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICBzaWduICAgPSB2YWx1ZVswXSA9PT0gJy0nID8gLTEgOiAxO1xuICBkaWdpdHMgPSBbXTtcblxuICBpZiAoJystJy5pbmRleE9mKHZhbHVlWzBdKSA+PSAwKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJy5pbmYnKSB7XG4gICAgcmV0dXJuIChzaWduID09PSAxKSA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICB9IGVsc2UgaWYgKHZhbHVlID09PSAnLm5hbicpIHtcbiAgICByZXR1cm4gTmFOO1xuXG4gIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignOicpID49IDApIHtcbiAgICB2YWx1ZS5zcGxpdCgnOicpLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgIGRpZ2l0cy51bnNoaWZ0KHBhcnNlRmxvYXQodiwgMTApKTtcbiAgICB9KTtcblxuICAgIHZhbHVlID0gMC4wO1xuICAgIGJhc2UgPSAxO1xuXG4gICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhbHVlICs9IGQgKiBiYXNlO1xuICAgICAgYmFzZSAqPSA2MDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaWduICogdmFsdWU7XG5cbiAgfVxuICByZXR1cm4gc2lnbiAqIHBhcnNlRmxvYXQodmFsdWUsIDEwKTtcbn1cblxuXG52YXIgU0NJRU5USUZJQ19XSVRIT1VUX0RPVCA9IC9eWy0rXT9bMC05XStlLztcblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbEZsb2F0KG9iamVjdCwgc3R5bGUpIHtcbiAgdmFyIHJlcztcblxuICBpZiAoaXNOYU4ob2JqZWN0KSkge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xvd2VyY2FzZSc6IHJldHVybiAnLm5hbic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy5OQU4nO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICcuTmFOJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZID09PSBvYmplY3QpIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlICdsb3dlcmNhc2UnOiByZXR1cm4gJy5pbmYnO1xuICAgICAgY2FzZSAndXBwZXJjYXNlJzogcmV0dXJuICcuSU5GJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLkluZic7XG4gICAgfVxuICB9IGVsc2UgaWYgKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA9PT0gb2JqZWN0KSB7XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG93ZXJjYXNlJzogcmV0dXJuICctLmluZic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy0uSU5GJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLS5JbmYnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb21tb24uaXNOZWdhdGl2ZVplcm8ob2JqZWN0KSkge1xuICAgIHJldHVybiAnLTAuMCc7XG4gIH1cblxuICByZXMgPSBvYmplY3QudG9TdHJpbmcoMTApO1xuXG4gIC8vIEpTIHN0cmluZ2lmaWVyIGNhbiBidWlsZCBzY2llbnRpZmljIGZvcm1hdCB3aXRob3V0IGRvdHM6IDVlLTEwMCxcbiAgLy8gd2hpbGUgWUFNTCByZXF1cmVzIGRvdDogNS5lLTEwMC4gRml4IGl0IHdpdGggc2ltcGxlIGhhY2tcblxuICByZXR1cm4gU0NJRU5USUZJQ19XSVRIT1VUX0RPVC50ZXN0KHJlcykgPyByZXMucmVwbGFjZSgnZScsICcuZScpIDogcmVzO1xufVxuXG5mdW5jdGlvbiBpc0Zsb2F0KG9iamVjdCkge1xuICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBOdW1iZXJdJykgJiZcbiAgICAgICAgIChvYmplY3QgJSAxICE9PSAwIHx8IGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEZsb2F0LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxGbG9hdCxcbiAgcHJlZGljYXRlOiBpc0Zsb2F0LFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxGbG9hdCxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCAiLy8gU3RhbmRhcmQgWUFNTCdzIEpTT04gc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODAzMjMxXG4vL1xuLy8gTk9URTogSlMtWUFNTCBkb2VzIG5vdCBzdXBwb3J0IHNjaGVtYS1zcGVjaWZpYyB0YWcgcmVzb2x1dGlvbiByZXN0cmljdGlvbnMuXG4vLyBTbywgdGhpcyBzY2hlbWEgaXMgbm90IHN1Y2ggc3RyaWN0IGFzIGRlZmluZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vIEl0IGFsbG93cyBudW1iZXJzIGluIGJpbmFyeSBub3RhaW9uLCB1c2UgYE51bGxgIGFuZCBgTlVMTGAgYXMgYG51bGxgLCBldGMuXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9mYWlsc2FmZScpXG4gIF0sXG4gIGltcGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9udWxsJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9ib29sJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9pbnQnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2Zsb2F0JylcbiAgXVxufSk7XG4iLCAiLy8gU3RhbmRhcmQgWUFNTCdzIENvcmUgc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODA0OTIzXG4vL1xuLy8gTk9URTogSlMtWUFNTCBkb2VzIG5vdCBzdXBwb3J0IHNjaGVtYS1zcGVjaWZpYyB0YWcgcmVzb2x1dGlvbiByZXN0cmljdGlvbnMuXG4vLyBTbywgQ29yZSBzY2hlbWEgaGFzIG5vIGRpc3RpbmN0aW9ucyBmcm9tIEpTT04gc2NoZW1hIGlzIEpTLVlBTUwuXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9qc29uJylcbiAgXVxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIFlBTUxfREFURV9SRUdFWFAgPSBuZXcgUmVnRXhwKFxuICAnXihbMC05XVswLTldWzAtOV1bMC05XSknICAgICAgICAgICsgLy8gWzFdIHllYXJcbiAgJy0oWzAtOV1bMC05XSknICAgICAgICAgICAgICAgICAgICArIC8vIFsyXSBtb250aFxuICAnLShbMC05XVswLTldKSQnKTsgICAgICAgICAgICAgICAgICAgLy8gWzNdIGRheVxuXG52YXIgWUFNTF9USU1FU1RBTVBfUkVHRVhQID0gbmV3IFJlZ0V4cChcbiAgJ14oWzAtOV1bMC05XVswLTldWzAtOV0pJyAgICAgICAgICArIC8vIFsxXSB5ZWFyXG4gICctKFswLTldWzAtOV0/KScgICAgICAgICAgICAgICAgICAgKyAvLyBbMl0gbW9udGhcbiAgJy0oWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICArIC8vIFszXSBkYXlcbiAgJyg/OltUdF18WyBcXFxcdF0rKScgICAgICAgICAgICAgICAgICsgLy8gLi4uXG4gICcoWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNF0gaG91clxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzVdIG1pbnV0ZVxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzZdIHNlY29uZFxuICAnKD86XFxcXC4oWzAtOV0qKSk/JyAgICAgICAgICAgICAgICAgKyAvLyBbN10gZnJhY3Rpb25cbiAgJyg/OlsgXFxcXHRdKihafChbLStdKShbMC05XVswLTldPyknICsgLy8gWzhdIHR6IFs5XSB0el9zaWduIFsxMF0gdHpfaG91clxuICAnKD86OihbMC05XVswLTldKSk/KSk/JCcpOyAgICAgICAgICAgLy8gWzExXSB0el9taW51dGVcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxUaW1lc3RhbXAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoWUFNTF9EQVRFX1JFR0VYUC5leGVjKGRhdGEpICE9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpICE9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wKGRhdGEpIHtcbiAgdmFyIG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhY3Rpb24gPSAwLFxuICAgICAgZGVsdGEgPSBudWxsLCB0el9ob3VyLCB0el9taW51dGUsIGRhdGU7XG5cbiAgbWF0Y2ggPSBZQU1MX0RBVEVfUkVHRVhQLmV4ZWMoZGF0YSk7XG4gIGlmIChtYXRjaCA9PT0gbnVsbCkgbWF0Y2ggPSBZQU1MX1RJTUVTVEFNUF9SRUdFWFAuZXhlYyhkYXRhKTtcblxuICBpZiAobWF0Y2ggPT09IG51bGwpIHRocm93IG5ldyBFcnJvcignRGF0ZSByZXNvbHZlIGVycm9yJyk7XG5cbiAgLy8gbWF0Y2g6IFsxXSB5ZWFyIFsyXSBtb250aCBbM10gZGF5XG5cbiAgeWVhciA9ICsobWF0Y2hbMV0pO1xuICBtb250aCA9ICsobWF0Y2hbMl0pIC0gMTsgLy8gSlMgbW9udGggc3RhcnRzIHdpdGggMFxuICBkYXkgPSArKG1hdGNoWzNdKTtcblxuICBpZiAoIW1hdGNoWzRdKSB7IC8vIG5vIGhvdXJcbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSkpO1xuICB9XG5cbiAgLy8gbWF0Y2g6IFs0XSBob3VyIFs1XSBtaW51dGUgWzZdIHNlY29uZCBbN10gZnJhY3Rpb25cblxuICBob3VyID0gKyhtYXRjaFs0XSk7XG4gIG1pbnV0ZSA9ICsobWF0Y2hbNV0pO1xuICBzZWNvbmQgPSArKG1hdGNoWzZdKTtcblxuICBpZiAobWF0Y2hbN10pIHtcbiAgICBmcmFjdGlvbiA9IG1hdGNoWzddLnNsaWNlKDAsIDMpO1xuICAgIHdoaWxlIChmcmFjdGlvbi5sZW5ndGggPCAzKSB7IC8vIG1pbGxpLXNlY29uZHNcbiAgICAgIGZyYWN0aW9uICs9ICcwJztcbiAgICB9XG4gICAgZnJhY3Rpb24gPSArZnJhY3Rpb247XG4gIH1cblxuICAvLyBtYXRjaDogWzhdIHR6IFs5XSB0el9zaWduIFsxMF0gdHpfaG91ciBbMTFdIHR6X21pbnV0ZVxuXG4gIGlmIChtYXRjaFs5XSkge1xuICAgIHR6X2hvdXIgPSArKG1hdGNoWzEwXSk7XG4gICAgdHpfbWludXRlID0gKyhtYXRjaFsxMV0gfHwgMCk7XG4gICAgZGVsdGEgPSAodHpfaG91ciAqIDYwICsgdHpfbWludXRlKSAqIDYwMDAwOyAvLyBkZWx0YSBpbiBtaWxpLXNlY29uZHNcbiAgICBpZiAobWF0Y2hbOV0gPT09ICctJykgZGVsdGEgPSAtZGVsdGE7XG4gIH1cblxuICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZyYWN0aW9uKSk7XG5cbiAgaWYgKGRlbHRhKSBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgLSBkZWx0YSk7XG5cbiAgcmV0dXJuIGRhdGU7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxUaW1lc3RhbXAob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHJldHVybiBvYmplY3QudG9JU09TdHJpbmcoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxUaW1lc3RhbXAsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbFRpbWVzdGFtcCxcbiAgaW5zdGFuY2VPZjogRGF0ZSxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sVGltZXN0YW1wXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE1lcmdlKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgPT09ICc8PCcgfHwgZGF0YSA9PT0gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbE1lcmdlXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSovXG5cbnZhciBOb2RlQnVmZmVyO1xuXG50cnkge1xuICAvLyBBIHRyaWNrIGZvciBicm93c2VyaWZpZWQgdmVyc2lvbiwgdG8gbm90IGluY2x1ZGUgYEJ1ZmZlcmAgc2hpbVxuICB2YXIgX3JlcXVpcmUgPSByZXF1aXJlO1xuICBOb2RlQnVmZmVyID0gX3JlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbn0gY2F0Y2ggKF9fKSB7fVxuXG52YXIgVHlwZSAgICAgICA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuXG4vLyBbIDY0LCA2NSwgNjYgXSAtPiBbIHBhZGRpbmcsIENSLCBMRiBdXG52YXIgQkFTRTY0X01BUCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVxcblxccic7XG5cblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxCaW5hcnkoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBjb2RlLCBpZHgsIGJpdGxlbiA9IDAsIG1heCA9IGRhdGEubGVuZ3RoLCBtYXAgPSBCQVNFNjRfTUFQO1xuXG4gIC8vIENvbnZlcnQgb25lIGJ5IG9uZS5cbiAgZm9yIChpZHggPSAwOyBpZHggPCBtYXg7IGlkeCsrKSB7XG4gICAgY29kZSA9IG1hcC5pbmRleE9mKGRhdGEuY2hhckF0KGlkeCkpO1xuXG4gICAgLy8gU2tpcCBDUi9MRlxuICAgIGlmIChjb2RlID4gNjQpIGNvbnRpbnVlO1xuXG4gICAgLy8gRmFpbCBvbiBpbGxlZ2FsIGNoYXJhY3RlcnNcbiAgICBpZiAoY29kZSA8IDApIHJldHVybiBmYWxzZTtcblxuICAgIGJpdGxlbiArPSA2O1xuICB9XG5cbiAgLy8gSWYgdGhlcmUgYXJlIGFueSBiaXRzIGxlZnQsIHNvdXJjZSB3YXMgY29ycnVwdGVkXG4gIHJldHVybiAoYml0bGVuICUgOCkgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxCaW5hcnkoZGF0YSkge1xuICB2YXIgaWR4LCB0YWlsYml0cyxcbiAgICAgIGlucHV0ID0gZGF0YS5yZXBsYWNlKC9bXFxyXFxuPV0vZywgJycpLCAvLyByZW1vdmUgQ1IvTEYgJiBwYWRkaW5nIHRvIHNpbXBsaWZ5IHNjYW5cbiAgICAgIG1heCA9IGlucHV0Lmxlbmd0aCxcbiAgICAgIG1hcCA9IEJBU0U2NF9NQVAsXG4gICAgICBiaXRzID0gMCxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIC8vIENvbGxlY3QgYnkgNio0IGJpdHMgKDMgYnl0ZXMpXG5cbiAgZm9yIChpZHggPSAwOyBpZHggPCBtYXg7IGlkeCsrKSB7XG4gICAgaWYgKChpZHggJSA0ID09PSAwKSAmJiBpZHgpIHtcbiAgICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDE2KSAmIDB4RkYpO1xuICAgICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gOCkgJiAweEZGKTtcbiAgICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAweEZGKTtcbiAgICB9XG5cbiAgICBiaXRzID0gKGJpdHMgPDwgNikgfCBtYXAuaW5kZXhPZihpbnB1dC5jaGFyQXQoaWR4KSk7XG4gIH1cblxuICAvLyBEdW1wIHRhaWxcblxuICB0YWlsYml0cyA9IChtYXggJSA0KSAqIDY7XG5cbiAgaWYgKHRhaWxiaXRzID09PSAwKSB7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTYpICYgMHhGRik7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gOCkgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaChiaXRzICYgMHhGRik7XG4gIH0gZWxzZSBpZiAodGFpbGJpdHMgPT09IDE4KSB7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTApICYgMHhGRik7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMikgJiAweEZGKTtcbiAgfSBlbHNlIGlmICh0YWlsYml0cyA9PT0gMTIpIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiA0KSAmIDB4RkYpO1xuICB9XG5cbiAgLy8gV3JhcCBpbnRvIEJ1ZmZlciBmb3IgTm9kZUpTIGFuZCBsZWF2ZSBBcnJheSBmb3IgYnJvd3NlclxuICBpZiAoTm9kZUJ1ZmZlcikge1xuICAgIC8vIFN1cHBvcnQgbm9kZSA2LisgQnVmZmVyIEFQSSB3aGVuIGF2YWlsYWJsZVxuICAgIHJldHVybiBOb2RlQnVmZmVyLmZyb20gPyBOb2RlQnVmZmVyLmZyb20ocmVzdWx0KSA6IG5ldyBOb2RlQnVmZmVyKHJlc3VsdCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRZYW1sQmluYXJ5KG9iamVjdCAvKiwgc3R5bGUqLykge1xuICB2YXIgcmVzdWx0ID0gJycsIGJpdHMgPSAwLCBpZHgsIHRhaWwsXG4gICAgICBtYXggPSBvYmplY3QubGVuZ3RoLFxuICAgICAgbWFwID0gQkFTRTY0X01BUDtcblxuICAvLyBDb252ZXJ0IGV2ZXJ5IHRocmVlIGJ5dGVzIHRvIDQgQVNDSUkgY2hhcmFjdGVycy5cblxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDMgPT09IDApICYmIGlkeCkge1xuICAgICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxOCkgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTIpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDYpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwW2JpdHMgJiAweDNGXTtcbiAgICB9XG5cbiAgICBiaXRzID0gKGJpdHMgPDwgOCkgKyBvYmplY3RbaWR4XTtcbiAgfVxuXG4gIC8vIER1bXAgdGFpbFxuXG4gIHRhaWwgPSBtYXggJSAzO1xuXG4gIGlmICh0YWlsID09PSAwKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxOCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDEyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwW2JpdHMgJiAweDNGXTtcbiAgfSBlbHNlIGlmICh0YWlsID09PSAyKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxMCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDQpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA8PCAyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICB9IGVsc2UgaWYgKHRhaWwgPT09IDEpIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA8PCA0KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNCaW5hcnkob2JqZWN0KSB7XG4gIHJldHVybiBOb2RlQnVmZmVyICYmIE5vZGVCdWZmZXIuaXNCdWZmZXIob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6YmluYXJ5Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxCaW5hcnksXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEJpbmFyeSxcbiAgcHJlZGljYXRlOiBpc0JpbmFyeSxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sQmluYXJ5XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfdG9TdHJpbmcgICAgICAgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE9tYXAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIG9iamVjdEtleXMgPSBbXSwgaW5kZXgsIGxlbmd0aCwgcGFpciwgcGFpcktleSwgcGFpckhhc0tleSxcbiAgICAgIG9iamVjdCA9IGRhdGE7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG4gICAgcGFpckhhc0tleSA9IGZhbHNlO1xuXG4gICAgaWYgKF90b1N0cmluZy5jYWxsKHBhaXIpICE9PSAnW29iamVjdCBPYmplY3RdJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChwYWlyS2V5IGluIHBhaXIpIHtcbiAgICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChwYWlyLCBwYWlyS2V5KSkge1xuICAgICAgICBpZiAoIXBhaXJIYXNLZXkpIHBhaXJIYXNLZXkgPSB0cnVlO1xuICAgICAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXBhaXJIYXNLZXkpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChvYmplY3RLZXlzLmluZGV4T2YocGFpcktleSkgPT09IC0xKSBvYmplY3RLZXlzLnB1c2gocGFpcktleSk7XG4gICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbE9tYXAoZGF0YSkge1xuICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6b21hcCcsIHtcbiAga2luZDogJ3NlcXVlbmNlJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxPbWFwLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxPbWFwXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxQYWlycyhkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgaW5kZXgsIGxlbmd0aCwgcGFpciwga2V5cywgcmVzdWx0LFxuICAgICAgb2JqZWN0ID0gZGF0YTtcblxuICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG5cbiAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSByZXR1cm4gZmFsc2U7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMocGFpcik7XG5cbiAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHJlc3VsdFtpbmRleF0gPSBbIGtleXNbMF0sIHBhaXJba2V5c1swXV0gXTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sUGFpcnMoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuXG4gIHZhciBpbmRleCwgbGVuZ3RoLCBwYWlyLCBrZXlzLCByZXN1bHQsXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIHJlc3VsdCA9IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhwYWlyKTtcblxuICAgIHJlc3VsdFtpbmRleF0gPSBbIGtleXNbMF0sIHBhaXJba2V5c1swXV0gXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFBhaXJzLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxQYWlyc1xufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sU2V0KGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBrZXksIG9iamVjdCA9IGRhdGE7XG5cbiAgZm9yIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgaWYgKG9iamVjdFtrZXldICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxTZXQoZGF0YSkge1xuICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c2V0Jywge1xuICBraW5kOiAnbWFwcGluZycsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sU2V0LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxTZXRcbn0pO1xuIiwgIi8vIEpTLVlBTUwncyBkZWZhdWx0IHNjaGVtYSBmb3IgYHNhZmVMb2FkYCBmdW5jdGlvbi5cbi8vIEl0IGlzIG5vdCBkZXNjcmliZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vXG4vLyBUaGlzIHNjaGVtYSBpcyBiYXNlZCBvbiBzdGFuZGFyZCBZQU1MJ3MgQ29yZSBzY2hlbWEgYW5kIGluY2x1ZGVzIG1vc3Qgb2Zcbi8vIGV4dHJhIHR5cGVzIGRlc2NyaWJlZCBhdCBZQU1MIHRhZyByZXBvc2l0b3J5LiAoaHR0cDovL3lhbWwub3JnL3R5cGUvKVxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vY29yZScpXG4gIF0sXG4gIGltcGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS90aW1lc3RhbXAnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL21lcmdlJylcbiAgXSxcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL2JpbmFyeScpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvb21hcCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvcGFpcnMnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL3NldCcpXG4gIF1cbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCgpIHtcbiAgLyplc2xpbnQtZGlzYWJsZSBuby11bmRlZmluZWQqL1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmpzL3VuZGVmaW5lZCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRVbmRlZmluZWQsXG4gIHByZWRpY2F0ZTogaXNVbmRlZmluZWQsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdFVuZGVmaW5lZFxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uLy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRSZWdFeHAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICB2YXIgcmVnZXhwID0gZGF0YSxcbiAgICAgIHRhaWwgICA9IC9cXC8oW2dpbV0qKSQvLmV4ZWMoZGF0YSksXG4gICAgICBtb2RpZmllcnMgPSAnJztcblxuICAvLyBpZiByZWdleHAgc3RhcnRzIHdpdGggJy8nIGl0IGNhbiBoYXZlIG1vZGlmaWVycyBhbmQgbXVzdCBiZSBwcm9wZXJseSBjbG9zZWRcbiAgLy8gYC9mb28vZ2ltYCAtIG1vZGlmaWVycyB0YWlsIGNhbiBiZSBtYXhpbXVtIDMgY2hhcnNcbiAgaWYgKHJlZ2V4cFswXSA9PT0gJy8nKSB7XG4gICAgaWYgKHRhaWwpIG1vZGlmaWVycyA9IHRhaWxbMV07XG5cbiAgICBpZiAobW9kaWZpZXJzLmxlbmd0aCA+IDMpIHJldHVybiBmYWxzZTtcbiAgICAvLyBpZiBleHByZXNzaW9uIHN0YXJ0cyB3aXRoIC8sIGlzIHNob3VsZCBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkXG4gICAgaWYgKHJlZ2V4cFtyZWdleHAubGVuZ3RoIC0gbW9kaWZpZXJzLmxlbmd0aCAtIDFdICE9PSAnLycpIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHtcbiAgdmFyIHJlZ2V4cCA9IGRhdGEsXG4gICAgICB0YWlsICAgPSAvXFwvKFtnaW1dKikkLy5leGVjKGRhdGEpLFxuICAgICAgbW9kaWZpZXJzID0gJyc7XG5cbiAgLy8gYC9mb28vZ2ltYCAtIHRhaWwgY2FuIGJlIG1heGltdW0gNCBjaGFyc1xuICBpZiAocmVnZXhwWzBdID09PSAnLycpIHtcbiAgICBpZiAodGFpbCkgbW9kaWZpZXJzID0gdGFpbFsxXTtcbiAgICByZWdleHAgPSByZWdleHAuc2xpY2UoMSwgcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVnRXhwKHJlZ2V4cCwgbW9kaWZpZXJzKTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdFJlZ0V4cChvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgdmFyIHJlc3VsdCA9ICcvJyArIG9iamVjdC5zb3VyY2UgKyAnLyc7XG5cbiAgaWYgKG9iamVjdC5nbG9iYWwpIHJlc3VsdCArPSAnZyc7XG4gIGlmIChvYmplY3QubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAob2JqZWN0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNSZWdFeHAob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmpzL3JlZ2V4cCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0UmVnRXhwLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRSZWdFeHAsXG4gIHByZWRpY2F0ZTogaXNSZWdFeHAsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdFJlZ0V4cFxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZXNwcmltYTtcblxuLy8gQnJvd3NlcmlmaWVkIHZlcnNpb24gZG9lcyBub3QgaGF2ZSBlc3ByaW1hXG4vL1xuLy8gMS4gRm9yIG5vZGUuanMganVzdCByZXF1aXJlIG1vZHVsZSBhcyBkZXBzXG4vLyAyLiBGb3IgYnJvd3NlciB0cnkgdG8gcmVxdWlyZSBtdWR1bGUgdmlhIGV4dGVybmFsIEFNRCBzeXN0ZW0uXG4vLyAgICBJZiBub3QgZm91bmQgLSB0cnkgdG8gZmFsbGJhY2sgdG8gd2luZG93LmVzcHJpbWEuIElmIG5vdFxuLy8gICAgZm91bmQgdG9vIC0gdGhlbiBmYWlsIHRvIHBhcnNlLlxuLy9cbnRyeSB7XG4gIC8vIHdvcmthcm91bmQgdG8gZXhjbHVkZSBwYWNrYWdlIGZyb20gYnJvd3NlcmlmeSBsaXN0LlxuICB2YXIgX3JlcXVpcmUgPSByZXF1aXJlO1xuICBlc3ByaW1hID0gX3JlcXVpcmUoJ2VzcHJpbWEnKTtcbn0gY2F0Y2ggKF8pIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tcmVkZWNsYXJlICovXG4gIC8qIGdsb2JhbCB3aW5kb3cgKi9cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSBlc3ByaW1hID0gd2luZG93LmVzcHJpbWE7XG59XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdEZ1bmN0aW9uKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIHZhciBzb3VyY2UgPSAnKCcgKyBkYXRhICsgJyknLFxuICAgICAgICBhc3QgICAgPSBlc3ByaW1hLnBhcnNlKHNvdXJjZSwgeyByYW5nZTogdHJ1ZSB9KTtcblxuICAgIGlmIChhc3QudHlwZSAgICAgICAgICAgICAgICAgICAgIT09ICdQcm9ncmFtJyAgICAgICAgICAgICB8fFxuICAgICAgICBhc3QuYm9keS5sZW5ndGggICAgICAgICAgICAgIT09IDEgICAgICAgICAgICAgICAgICAgICB8fFxuICAgICAgICBhc3QuYm9keVswXS50eXBlICAgICAgICAgICAgIT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyB8fFxuICAgICAgICAoYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAnQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24nICYmXG4gICAgICAgICAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAnRnVuY3Rpb25FeHByZXNzaW9uJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRGdW5jdGlvbihkYXRhKSB7XG4gIC8qanNsaW50IGV2aWw6dHJ1ZSovXG5cbiAgdmFyIHNvdXJjZSA9ICcoJyArIGRhdGEgKyAnKScsXG4gICAgICBhc3QgICAgPSBlc3ByaW1hLnBhcnNlKHNvdXJjZSwgeyByYW5nZTogdHJ1ZSB9KSxcbiAgICAgIHBhcmFtcyA9IFtdLFxuICAgICAgYm9keTtcblxuICBpZiAoYXN0LnR5cGUgICAgICAgICAgICAgICAgICAgICE9PSAnUHJvZ3JhbScgICAgICAgICAgICAgfHxcbiAgICAgIGFzdC5ib2R5Lmxlbmd0aCAgICAgICAgICAgICAhPT0gMSAgICAgICAgICAgICAgICAgICAgIHx8XG4gICAgICBhc3QuYm9keVswXS50eXBlICAgICAgICAgICAgIT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyB8fFxuICAgICAgKGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJyAmJlxuICAgICAgICBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICdGdW5jdGlvbkV4cHJlc3Npb24nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlc29sdmUgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24ucGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgcGFyYW1zLnB1c2gocGFyYW0ubmFtZSk7XG4gIH0pO1xuXG4gIGJvZHkgPSBhc3QuYm9keVswXS5leHByZXNzaW9uLmJvZHkucmFuZ2U7XG5cbiAgLy8gRXNwcmltYSdzIHJhbmdlcyBpbmNsdWRlIHRoZSBmaXJzdCAneycgYW5kIHRoZSBsYXN0ICd9JyBjaGFyYWN0ZXJzIG9uXG4gIC8vIGZ1bmN0aW9uIGV4cHJlc3Npb25zLiBTbyBjdXQgdGhlbSBvdXQuXG4gIGlmIChhc3QuYm9keVswXS5leHByZXNzaW9uLmJvZHkudHlwZSA9PT0gJ0Jsb2NrU3RhdGVtZW50Jykge1xuICAgIC8qZXNsaW50LWRpc2FibGUgbm8tbmV3LWZ1bmMqL1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb24ocGFyYW1zLCBzb3VyY2Uuc2xpY2UoYm9keVswXSArIDEsIGJvZHlbMV0gLSAxKSk7XG4gIH1cbiAgLy8gRVM2IGFycm93IGZ1bmN0aW9ucyBjYW4gb21pdCB0aGUgQmxvY2tTdGF0ZW1lbnQuIEluIHRoYXQgY2FzZSwganVzdCByZXR1cm5cbiAgLy8gdGhlIGJvZHkuXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tbmV3LWZ1bmMqL1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKHBhcmFtcywgJ3JldHVybiAnICsgc291cmNlLnNsaWNlKGJvZHlbMF0sIGJvZHlbMV0pKTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uKG9iamVjdCAvKiwgc3R5bGUqLykge1xuICByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvZnVuY3Rpb24nLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlSmF2YXNjcmlwdEZ1bmN0aW9uLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRGdW5jdGlvbixcbiAgcHJlZGljYXRlOiBpc0Z1bmN0aW9uLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvblxufSk7XG4iLCAiLy8gSlMtWUFNTCdzIGRlZmF1bHQgc2NoZW1hIGZvciBgbG9hZGAgZnVuY3Rpb24uXG4vLyBJdCBpcyBub3QgZGVzY3JpYmVkIGluIHRoZSBZQU1MIHNwZWNpZmljYXRpb24uXG4vL1xuLy8gVGhpcyBzY2hlbWEgaXMgYmFzZWQgb24gSlMtWUFNTCdzIGRlZmF1bHQgc2FmZSBzY2hlbWEgYW5kIGluY2x1ZGVzXG4vLyBKYXZhU2NyaXB0LXNwZWNpZmljIHR5cGVzOiAhIWpzL3VuZGVmaW5lZCwgISFqcy9yZWdleHAgYW5kICEhanMvZnVuY3Rpb24uXG4vL1xuLy8gQWxzbyB0aGlzIHNjaGVtYSBpcyB1c2VkIGFzIGRlZmF1bHQgYmFzZSBzY2hlbWEgYXQgYFNjaGVtYS5jcmVhdGVgIGZ1bmN0aW9uLlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY2hlbWEuREVGQVVMVCA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9kZWZhdWx0X3NhZmUnKVxuICBdLFxuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvanMvdW5kZWZpbmVkJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9qcy9yZWdleHAnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2pzL2Z1bmN0aW9uJylcbiAgXVxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKmVzbGludC1kaXNhYmxlIG1heC1sZW4sbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuXG52YXIgY29tbW9uICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG52YXIgWUFNTEV4Y2VwdGlvbiAgICAgICA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG52YXIgTWFyayAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vbWFyaycpO1xudmFyIERFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlKCcuL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbnZhciBERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZSgnLi9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG5cblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cblxudmFyIENPTlRFWFRfRkxPV19JTiAgID0gMTtcbnZhciBDT05URVhUX0ZMT1dfT1VUICA9IDI7XG52YXIgQ09OVEVYVF9CTE9DS19JTiAgPSAzO1xudmFyIENPTlRFWFRfQkxPQ0tfT1VUID0gNDtcblxuXG52YXIgQ0hPTVBJTkdfQ0xJUCAgPSAxO1xudmFyIENIT01QSU5HX1NUUklQID0gMjtcbnZhciBDSE9NUElOR19LRUVQICA9IDM7XG5cblxudmFyIFBBVFRFUk5fTk9OX1BSSU5UQUJMRSAgICAgICAgID0gL1tcXHgwMC1cXHgwOFxceDBCXFx4MENcXHgwRS1cXHgxRlxceDdGLVxceDg0XFx4ODYtXFx4OUZcXHVGRkZFXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0vO1xudmFyIFBBVFRFUk5fTk9OX0FTQ0lJX0xJTkVfQlJFQUtTID0gL1tcXHg4NVxcdTIwMjhcXHUyMDI5XS87XG52YXIgUEFUVEVSTl9GTE9XX0lORElDQVRPUlMgICAgICAgPSAvWyxcXFtcXF1cXHtcXH1dLztcbnZhciBQQVRURVJOX1RBR19IQU5ETEUgICAgICAgICAgICA9IC9eKD86IXwhIXwhW2EtelxcLV0rISkkL2k7XG52YXIgUEFUVEVSTl9UQUdfVVJJICAgICAgICAgICAgICAgPSAvXig/OiF8W14sXFxbXFxdXFx7XFx9XSkoPzolWzAtOWEtZl17Mn18WzAtOWEtelxcLSM7XFwvXFw/OkAmPVxcK1xcJCxfXFwuIX5cXConXFwoXFwpXFxbXFxdXSkqJC9pO1xuXG5cbmZ1bmN0aW9uIF9jbGFzcyhvYmopIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopOyB9XG5cbmZ1bmN0aW9uIGlzX0VPTChjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwQS8qIExGICovKSB8fCAoYyA9PT0gMHgwRC8qIENSICovKTtcbn1cblxuZnVuY3Rpb24gaXNfV0hJVEVfU1BBQ0UoYykge1xuICByZXR1cm4gKGMgPT09IDB4MDkvKiBUYWIgKi8pIHx8IChjID09PSAweDIwLyogU3BhY2UgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19XU19PUl9FT0woYykge1xuICByZXR1cm4gKGMgPT09IDB4MDkvKiBUYWIgKi8pIHx8XG4gICAgICAgICAoYyA9PT0gMHgyMC8qIFNwYWNlICovKSB8fFxuICAgICAgICAgKGMgPT09IDB4MEEvKiBMRiAqLykgfHxcbiAgICAgICAgIChjID09PSAweDBELyogQ1IgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19GTE9XX0lORElDQVRPUihjKSB7XG4gIHJldHVybiBjID09PSAweDJDLyogLCAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg1Qi8qIFsgKi8gfHxcbiAgICAgICAgIGMgPT09IDB4NUQvKiBdICovIHx8XG4gICAgICAgICBjID09PSAweDdCLyogeyAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg3RC8qIH0gKi87XG59XG5cbmZ1bmN0aW9uIGZyb21IZXhDb2RlKGMpIHtcbiAgdmFyIGxjO1xuXG4gIGlmICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKSB7XG4gICAgcmV0dXJuIGMgLSAweDMwO1xuICB9XG5cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlKi9cbiAgbGMgPSBjIHwgMHgyMDtcblxuICBpZiAoKDB4NjEvKiBhICovIDw9IGxjKSAmJiAobGMgPD0gMHg2Ni8qIGYgKi8pKSB7XG4gICAgcmV0dXJuIGxjIC0gMHg2MSArIDEwO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVkSGV4TGVuKGMpIHtcbiAgaWYgKGMgPT09IDB4NzgvKiB4ICovKSB7IHJldHVybiAyOyB9XG4gIGlmIChjID09PSAweDc1LyogdSAqLykgeyByZXR1cm4gNDsgfVxuICBpZiAoYyA9PT0gMHg1NS8qIFUgKi8pIHsgcmV0dXJuIDg7IH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGZyb21EZWNpbWFsQ29kZShjKSB7XG4gIGlmICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKSB7XG4gICAgcmV0dXJuIGMgLSAweDMwO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVFc2NhcGVTZXF1ZW5jZShjKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIGluZGVudCAqL1xuICByZXR1cm4gKGMgPT09IDB4MzAvKiAwICovKSA/ICdcXHgwMCcgOlxuICAgICAgICAoYyA9PT0gMHg2MS8qIGEgKi8pID8gJ1xceDA3JyA6XG4gICAgICAgIChjID09PSAweDYyLyogYiAqLykgPyAnXFx4MDgnIDpcbiAgICAgICAgKGMgPT09IDB4NzQvKiB0ICovKSA/ICdcXHgwOScgOlxuICAgICAgICAoYyA9PT0gMHgwOS8qIFRhYiAqLykgPyAnXFx4MDknIDpcbiAgICAgICAgKGMgPT09IDB4NkUvKiBuICovKSA/ICdcXHgwQScgOlxuICAgICAgICAoYyA9PT0gMHg3Ni8qIHYgKi8pID8gJ1xceDBCJyA6XG4gICAgICAgIChjID09PSAweDY2LyogZiAqLykgPyAnXFx4MEMnIDpcbiAgICAgICAgKGMgPT09IDB4NzIvKiByICovKSA/ICdcXHgwRCcgOlxuICAgICAgICAoYyA9PT0gMHg2NS8qIGUgKi8pID8gJ1xceDFCJyA6XG4gICAgICAgIChjID09PSAweDIwLyogU3BhY2UgKi8pID8gJyAnIDpcbiAgICAgICAgKGMgPT09IDB4MjIvKiBcIiAqLykgPyAnXFx4MjInIDpcbiAgICAgICAgKGMgPT09IDB4MkYvKiAvICovKSA/ICcvJyA6XG4gICAgICAgIChjID09PSAweDVDLyogXFwgKi8pID8gJ1xceDVDJyA6XG4gICAgICAgIChjID09PSAweDRFLyogTiAqLykgPyAnXFx4ODUnIDpcbiAgICAgICAgKGMgPT09IDB4NUYvKiBfICovKSA/ICdcXHhBMCcgOlxuICAgICAgICAoYyA9PT0gMHg0Qy8qIEwgKi8pID8gJ1xcdTIwMjgnIDpcbiAgICAgICAgKGMgPT09IDB4NTAvKiBQICovKSA/ICdcXHUyMDI5JyA6ICcnO1xufVxuXG5mdW5jdGlvbiBjaGFyRnJvbUNvZGVwb2ludChjKSB7XG4gIGlmIChjIDw9IDB4RkZGRikge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICB9XG4gIC8vIEVuY29kZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXJcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2I0NvZGVfcG9pbnRzX1UuMkIwMTAwMDBfdG9fVS4yQjEwRkZGRlxuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAoKGMgLSAweDAxMDAwMCkgPj4gMTApICsgMHhEODAwLFxuICAgICgoYyAtIDB4MDEwMDAwKSAmIDB4MDNGRikgKyAweERDMDBcbiAgKTtcbn1cblxudmFyIHNpbXBsZUVzY2FwZUNoZWNrID0gbmV3IEFycmF5KDI1Nik7IC8vIGludGVnZXIsIGZvciBmYXN0IGFjY2Vzc1xudmFyIHNpbXBsZUVzY2FwZU1hcCA9IG5ldyBBcnJheSgyNTYpO1xuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuICBzaW1wbGVFc2NhcGVDaGVja1tpXSA9IHNpbXBsZUVzY2FwZVNlcXVlbmNlKGkpID8gMSA6IDA7XG4gIHNpbXBsZUVzY2FwZU1hcFtpXSA9IHNpbXBsZUVzY2FwZVNlcXVlbmNlKGkpO1xufVxuXG5cbmZ1bmN0aW9uIFN0YXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHRoaXMuaW5wdXQgPSBpbnB1dDtcblxuICB0aGlzLmZpbGVuYW1lICA9IG9wdGlvbnNbJ2ZpbGVuYW1lJ10gIHx8IG51bGw7XG4gIHRoaXMuc2NoZW1hICAgID0gb3B0aW9uc1snc2NoZW1hJ10gICAgfHwgREVGQVVMVF9GVUxMX1NDSEVNQTtcbiAgdGhpcy5vbldhcm5pbmcgPSBvcHRpb25zWydvbldhcm5pbmcnXSB8fCBudWxsO1xuICB0aGlzLmxlZ2FjeSAgICA9IG9wdGlvbnNbJ2xlZ2FjeSddICAgIHx8IGZhbHNlO1xuICB0aGlzLmpzb24gICAgICA9IG9wdGlvbnNbJ2pzb24nXSAgICAgIHx8IGZhbHNlO1xuICB0aGlzLmxpc3RlbmVyICA9IG9wdGlvbnNbJ2xpc3RlbmVyJ10gIHx8IG51bGw7XG5cbiAgdGhpcy5pbXBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRJbXBsaWNpdDtcbiAgdGhpcy50eXBlTWFwICAgICAgID0gdGhpcy5zY2hlbWEuY29tcGlsZWRUeXBlTWFwO1xuXG4gIHRoaXMubGVuZ3RoICAgICA9IGlucHV0Lmxlbmd0aDtcbiAgdGhpcy5wb3NpdGlvbiAgID0gMDtcbiAgdGhpcy5saW5lICAgICAgID0gMDtcbiAgdGhpcy5saW5lU3RhcnQgID0gMDtcbiAgdGhpcy5saW5lSW5kZW50ID0gMDtcblxuICB0aGlzLmRvY3VtZW50cyA9IFtdO1xuXG4gIC8qXG4gIHRoaXMudmVyc2lvbjtcbiAgdGhpcy5jaGVja0xpbmVCcmVha3M7XG4gIHRoaXMudGFnTWFwO1xuICB0aGlzLmFuY2hvck1hcDtcbiAgdGhpcy50YWc7XG4gIHRoaXMuYW5jaG9yO1xuICB0aGlzLmtpbmQ7XG4gIHRoaXMucmVzdWx0OyovXG5cbn1cblxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKSB7XG4gIHJldHVybiBuZXcgWUFNTEV4Y2VwdGlvbihcbiAgICBtZXNzYWdlLFxuICAgIG5ldyBNYXJrKHN0YXRlLmZpbGVuYW1lLCBzdGF0ZS5pbnB1dCwgc3RhdGUucG9zaXRpb24sIHN0YXRlLmxpbmUsIChzdGF0ZS5wb3NpdGlvbiAtIHN0YXRlLmxpbmVTdGFydCkpKTtcbn1cblxuZnVuY3Rpb24gdGhyb3dFcnJvcihzdGF0ZSwgbWVzc2FnZSkge1xuICB0aHJvdyBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gdGhyb3dXYXJuaW5nKHN0YXRlLCBtZXNzYWdlKSB7XG4gIGlmIChzdGF0ZS5vbldhcm5pbmcpIHtcbiAgICBzdGF0ZS5vbldhcm5pbmcuY2FsbChudWxsLCBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKSk7XG4gIH1cbn1cblxuXG52YXIgZGlyZWN0aXZlSGFuZGxlcnMgPSB7XG5cbiAgWUFNTDogZnVuY3Rpb24gaGFuZGxlWWFtbERpcmVjdGl2ZShzdGF0ZSwgbmFtZSwgYXJncykge1xuXG4gICAgdmFyIG1hdGNoLCBtYWpvciwgbWlub3I7XG5cbiAgICBpZiAoc3RhdGUudmVyc2lvbiAhPT0gbnVsbCkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0aW9uIG9mICVZQU1MIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ1lBTUwgZGlyZWN0aXZlIGFjY2VwdHMgZXhhY3RseSBvbmUgYXJndW1lbnQnKTtcbiAgICB9XG5cbiAgICBtYXRjaCA9IC9eKFswLTldKylcXC4oWzAtOV0rKSQvLmV4ZWMoYXJnc1swXSk7XG5cbiAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbGwtZm9ybWVkIGFyZ3VtZW50IG9mIHRoZSBZQU1MIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIG1ham9yID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgICBtaW5vciA9IHBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG5cbiAgICBpZiAobWFqb3IgIT09IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmFjY2VwdGFibGUgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCcpO1xuICAgIH1cblxuICAgIHN0YXRlLnZlcnNpb24gPSBhcmdzWzBdO1xuICAgIHN0YXRlLmNoZWNrTGluZUJyZWFrcyA9IChtaW5vciA8IDIpO1xuXG4gICAgaWYgKG1pbm9yICE9PSAxICYmIG1pbm9yICE9PSAyKSB7XG4gICAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICd1bnN1cHBvcnRlZCBZQU1MIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50Jyk7XG4gICAgfVxuICB9LFxuXG4gIFRBRzogZnVuY3Rpb24gaGFuZGxlVGFnRGlyZWN0aXZlKHN0YXRlLCBuYW1lLCBhcmdzKSB7XG5cbiAgICB2YXIgaGFuZGxlLCBwcmVmaXg7XG5cbiAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdUQUcgZGlyZWN0aXZlIGFjY2VwdHMgZXhhY3RseSB0d28gYXJndW1lbnRzJyk7XG4gICAgfVxuXG4gICAgaGFuZGxlID0gYXJnc1swXTtcbiAgICBwcmVmaXggPSBhcmdzWzFdO1xuXG4gICAgaWYgKCFQQVRURVJOX1RBR19IQU5ETEUudGVzdChoYW5kbGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCB0YWcgaGFuZGxlIChmaXJzdCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudGFnTWFwLCBoYW5kbGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGhlcmUgaXMgYSBwcmV2aW91c2x5IGRlY2xhcmVkIHN1ZmZpeCBmb3IgXCInICsgaGFuZGxlICsgJ1wiIHRhZyBoYW5kbGUnKTtcbiAgICB9XG5cbiAgICBpZiAoIVBBVFRFUk5fVEFHX1VSSS50ZXN0KHByZWZpeCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbGwtZm9ybWVkIHRhZyBwcmVmaXggKHNlY29uZCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBzdGF0ZS50YWdNYXBbaGFuZGxlXSA9IHByZWZpeDtcbiAgfVxufTtcblxuXG5mdW5jdGlvbiBjYXB0dXJlU2VnbWVudChzdGF0ZSwgc3RhcnQsIGVuZCwgY2hlY2tKc29uKSB7XG4gIHZhciBfcG9zaXRpb24sIF9sZW5ndGgsIF9jaGFyYWN0ZXIsIF9yZXN1bHQ7XG5cbiAgaWYgKHN0YXJ0IDwgZW5kKSB7XG4gICAgX3Jlc3VsdCA9IHN0YXRlLmlucHV0LnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gICAgaWYgKGNoZWNrSnNvbikge1xuICAgICAgZm9yIChfcG9zaXRpb24gPSAwLCBfbGVuZ3RoID0gX3Jlc3VsdC5sZW5ndGg7IF9wb3NpdGlvbiA8IF9sZW5ndGg7IF9wb3NpdGlvbiArPSAxKSB7XG4gICAgICAgIF9jaGFyYWN0ZXIgPSBfcmVzdWx0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcbiAgICAgICAgaWYgKCEoX2NoYXJhY3RlciA9PT0gMHgwOSB8fFxuICAgICAgICAgICAgICAoMHgyMCA8PSBfY2hhcmFjdGVyICYmIF9jaGFyYWN0ZXIgPD0gMHgxMEZGRkYpKSkge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdleHBlY3RlZCB2YWxpZCBKU09OIGNoYXJhY3RlcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChQQVRURVJOX05PTl9QUklOVEFCTEUudGVzdChfcmVzdWx0KSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RoZSBzdHJlYW0gY29udGFpbnMgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuXG4gICAgc3RhdGUucmVzdWx0ICs9IF9yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgZGVzdGluYXRpb24sIHNvdXJjZSwgb3ZlcnJpZGFibGVLZXlzKSB7XG4gIHZhciBzb3VyY2VLZXlzLCBrZXksIGluZGV4LCBxdWFudGl0eTtcblxuICBpZiAoIWNvbW1vbi5pc09iamVjdChzb3VyY2UpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2Nhbm5vdCBtZXJnZSBtYXBwaW5nczsgdGhlIHByb3ZpZGVkIHNvdXJjZSBvYmplY3QgaXMgdW5hY2NlcHRhYmxlJyk7XG4gIH1cblxuICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICBmb3IgKGluZGV4ID0gMCwgcXVhbnRpdHkgPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXggPCBxdWFudGl0eTsgaW5kZXggKz0gMSkge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaW5kZXhdO1xuXG4gICAgaWYgKCFfaGFzT3duUHJvcGVydHkuY2FsbChkZXN0aW5hdGlvbiwga2V5KSkge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgb3ZlcnJpZGFibGVLZXlzW2tleV0gPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlLCBzdGFydExpbmUsIHN0YXJ0UG9zKSB7XG4gIHZhciBpbmRleCwgcXVhbnRpdHk7XG5cbiAgLy8gVGhlIG91dHB1dCBpcyBhIHBsYWluIG9iamVjdCBoZXJlLCBzbyBrZXlzIGNhbiBvbmx5IGJlIHN0cmluZ3MuXG4gIC8vIFdlIG5lZWQgdG8gY29udmVydCBrZXlOb2RlIHRvIGEgc3RyaW5nLCBidXQgZG9pbmcgc28gY2FuIGhhbmcgdGhlIHByb2Nlc3NcbiAgLy8gKGRlZXBseSBuZXN0ZWQgYXJyYXlzIHRoYXQgZXhwbG9kZSBleHBvbmVudGlhbGx5IHVzaW5nIGFsaWFzZXMpLlxuICBpZiAoQXJyYXkuaXNBcnJheShrZXlOb2RlKSkge1xuICAgIGtleU5vZGUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChrZXlOb2RlKTtcblxuICAgIGZvciAoaW5kZXggPSAwLCBxdWFudGl0eSA9IGtleU5vZGUubGVuZ3RoOyBpbmRleCA8IHF1YW50aXR5OyBpbmRleCArPSAxKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlOb2RlW2luZGV4XSkpIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25lc3RlZCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGtleXMnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBrZXlOb2RlID09PSAnb2JqZWN0JyAmJiBfY2xhc3Moa2V5Tm9kZVtpbmRleF0pID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICBrZXlOb2RlW2luZGV4XSA9ICdbb2JqZWN0IE9iamVjdF0nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEF2b2lkIGNvZGUgZXhlY3V0aW9uIGluIGxvYWQoKSB2aWEgdG9TdHJpbmcgcHJvcGVydHlcbiAgLy8gKHN0aWxsIHVzZSBpdHMgb3duIHRvU3RyaW5nIGZvciBhcnJheXMsIHRpbWVzdGFtcHMsXG4gIC8vIGFuZCB3aGF0ZXZlciB1c2VyIHNjaGVtYSBleHRlbnNpb25zIGhhcHBlbiB0byBoYXZlIEBAdG9TdHJpbmdUYWcpXG4gIGlmICh0eXBlb2Yga2V5Tm9kZSA9PT0gJ29iamVjdCcgJiYgX2NsYXNzKGtleU5vZGUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgIGtleU5vZGUgPSAnW29iamVjdCBPYmplY3RdJztcbiAgfVxuXG5cbiAga2V5Tm9kZSA9IFN0cmluZyhrZXlOb2RlKTtcblxuICBpZiAoX3Jlc3VsdCA9PT0gbnVsbCkge1xuICAgIF9yZXN1bHQgPSB7fTtcbiAgfVxuXG4gIGlmIChrZXlUYWcgPT09ICd0YWc6eWFtbC5vcmcsMjAwMjptZXJnZScpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZU5vZGUpKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgcXVhbnRpdHkgPSB2YWx1ZU5vZGUubGVuZ3RoOyBpbmRleCA8IHF1YW50aXR5OyBpbmRleCArPSAxKSB7XG4gICAgICAgIG1lcmdlTWFwcGluZ3Moc3RhdGUsIF9yZXN1bHQsIHZhbHVlTm9kZVtpbmRleF0sIG92ZXJyaWRhYmxlS2V5cyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlTWFwcGluZ3Moc3RhdGUsIF9yZXN1bHQsIHZhbHVlTm9kZSwgb3ZlcnJpZGFibGVLZXlzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFzdGF0ZS5qc29uICYmXG4gICAgICAgICFfaGFzT3duUHJvcGVydHkuY2FsbChvdmVycmlkYWJsZUtleXMsIGtleU5vZGUpICYmXG4gICAgICAgIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKF9yZXN1bHQsIGtleU5vZGUpKSB7XG4gICAgICBzdGF0ZS5saW5lID0gc3RhcnRMaW5lIHx8IHN0YXRlLmxpbmU7XG4gICAgICBzdGF0ZS5wb3NpdGlvbiA9IHN0YXJ0UG9zIHx8IHN0YXRlLnBvc2l0aW9uO1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0ZWQgbWFwcGluZyBrZXknKTtcbiAgICB9XG4gICAgX3Jlc3VsdFtrZXlOb2RlXSA9IHZhbHVlTm9kZTtcbiAgICBkZWxldGUgb3ZlcnJpZGFibGVLZXlzW2tleU5vZGVdO1xuICB9XG5cbiAgcmV0dXJuIF9yZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRMaW5lQnJlYWsoc3RhdGUpIHtcbiAgdmFyIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDBBLyogTEYgKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDBELyogQ1IgKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgwQS8qIExGICovKSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYSBsaW5lIGJyZWFrIGlzIGV4cGVjdGVkJyk7XG4gIH1cblxuICBzdGF0ZS5saW5lICs9IDE7XG4gIHN0YXRlLmxpbmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xufVxuXG5mdW5jdGlvbiBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBhbGxvd0NvbW1lbnRzLCBjaGVja0luZGVudCkge1xuICB2YXIgbGluZUJyZWFrcyA9IDAsXG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoYWxsb3dDb21tZW50cyAmJiBjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIGRvIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfSB3aGlsZSAoY2ggIT09IDB4MEEvKiBMRiAqLyAmJiBjaCAhPT0gMHgwRC8qIENSICovICYmIGNoICE9PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG5cbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICBsaW5lQnJlYWtzKys7XG4gICAgICBzdGF0ZS5saW5lSW5kZW50ID0gMDtcblxuICAgICAgd2hpbGUgKGNoID09PSAweDIwLyogU3BhY2UgKi8pIHtcbiAgICAgICAgc3RhdGUubGluZUluZGVudCsrO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjaGVja0luZGVudCAhPT0gLTEgJiYgbGluZUJyZWFrcyAhPT0gMCAmJiBzdGF0ZS5saW5lSW5kZW50IDwgY2hlY2tJbmRlbnQpIHtcbiAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICdkZWZpY2llbnQgaW5kZW50YXRpb24nKTtcbiAgfVxuXG4gIHJldHVybiBsaW5lQnJlYWtzO1xufVxuXG5mdW5jdGlvbiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG5cbiAgLy8gQ29uZGl0aW9uIHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgaXMgdGVzdGVkXG4gIC8vIGluIHBhcmVudCBvbiBlYWNoIGNhbGwsIGZvciBlZmZpY2llbmN5LiBObyBuZWVkcyB0byB0ZXN0IGhlcmUgYWdhaW4uXG4gIGlmICgoY2ggPT09IDB4MkQvKiAtICovIHx8IGNoID09PSAweDJFLyogLiAqLykgJiZcbiAgICAgIGNoID09PSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbiArIDEpICYmXG4gICAgICBjaCA9PT0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24gKyAyKSkge1xuXG4gICAgX3Bvc2l0aW9uICs9IDM7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gMCB8fCBpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIGNvdW50KSB7XG4gIGlmIChjb3VudCA9PT0gMSkge1xuICAgIHN0YXRlLnJlc3VsdCArPSAnICc7XG4gIH0gZWxzZSBpZiAoY291bnQgPiAxKSB7XG4gICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGNvdW50IC0gMSk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiByZWFkUGxhaW5TY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQsIHdpdGhpbkZsb3dDb2xsZWN0aW9uKSB7XG4gIHZhciBwcmVjZWRpbmcsXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICBjYXB0dXJlU3RhcnQsXG4gICAgICBjYXB0dXJlRW5kLFxuICAgICAgaGFzUGVuZGluZ0NvbnRlbnQsXG4gICAgICBfbGluZSxcbiAgICAgIF9saW5lU3RhcnQsXG4gICAgICBfbGluZUluZGVudCxcbiAgICAgIF9raW5kID0gc3RhdGUua2luZCxcbiAgICAgIF9yZXN1bHQgPSBzdGF0ZS5yZXN1bHQsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChpc19XU19PUl9FT0woY2gpICAgICAgfHxcbiAgICAgIGlzX0ZMT1dfSU5ESUNBVE9SKGNoKSB8fFxuICAgICAgY2ggPT09IDB4MjMvKiAjICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNi8qICYgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDJBLyogKiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjEvKiAhICovICAgIHx8XG4gICAgICBjaCA9PT0gMHg3Qy8qIHwgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDNFLyogPiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjcvKiAnICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyMi8qIFwiICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNS8qICUgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDQwLyogQCAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4NjAvKiBgICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGNoID09PSAweDNGLyogPyAqLyB8fCBjaCA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykgfHxcbiAgICAgICAgd2l0aGluRmxvd0NvbGxlY3Rpb24gJiYgaXNfRkxPV19JTkRJQ0FUT1IoZm9sbG93aW5nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fFxuICAgICAgICAgIHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGZvbGxvd2luZykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgcHJlY2VkaW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiAtIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKHByZWNlZGluZykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHx8XG4gICAgICAgICAgICAgICB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICAgIGJyZWFrO1xuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgICBfbGluZVN0YXJ0ID0gc3RhdGUubGluZVN0YXJ0O1xuICAgICAgX2xpbmVJbmRlbnQgPSBzdGF0ZS5saW5lSW5kZW50O1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIC0xKTtcblxuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPj0gbm9kZUluZGVudCkge1xuICAgICAgICBoYXNQZW5kaW5nQ29udGVudCA9IHRydWU7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucG9zaXRpb24gPSBjYXB0dXJlRW5kO1xuICAgICAgICBzdGF0ZS5saW5lID0gX2xpbmU7XG4gICAgICAgIHN0YXRlLmxpbmVTdGFydCA9IF9saW5lU3RhcnQ7XG4gICAgICAgIHN0YXRlLmxpbmVJbmRlbnQgPSBfbGluZUluZGVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1BlbmRpbmdDb250ZW50KSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBzdGF0ZS5saW5lIC0gX2xpbmUpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uICsgMTtcbiAgICB9XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7XG5cbiAgaWYgKHN0YXRlLnJlc3VsdCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9IF9raW5kO1xuICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNoLFxuICAgICAgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDI3LyogJyAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIHN0YXRlLnBvc2l0aW9uKys7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7XG4gICAgaWYgKGNoID09PSAweDI3LyogJyAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICBpZiAoY2ggPT09IDB4MjcvKiAnICovKSB7XG4gICAgICAgIGNhcHR1cmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgdHJ1ZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgbm9kZUluZGVudCkpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIGEgc2luZ2xlIHF1b3RlZCBzY2FsYXInKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWREb3VibGVRdW90ZWRTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNhcHR1cmVTdGFydCxcbiAgICAgIGNhcHR1cmVFbmQsXG4gICAgICBoZXhMZW5ndGgsXG4gICAgICBoZXhSZXN1bHQsXG4gICAgICB0bXAsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyMi8qIFwiICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcbiAgc3RhdGUucG9zaXRpb24rKztcbiAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4MjIvKiBcIiAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgfSBlbHNlIGlmIChjaCA9PT0gMHg1Qy8qIFxcICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgIGlmIChpc19FT0woY2gpKSB7XG4gICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KTtcblxuICAgICAgICAvLyBUT0RPOiByZXdvcmsgdG8gaW5saW5lIGZuIHdpdGggbm8gdHlwZSBjYXN0P1xuICAgICAgfSBlbHNlIGlmIChjaCA8IDI1NiAmJiBzaW1wbGVFc2NhcGVDaGVja1tjaF0pIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IHNpbXBsZUVzY2FwZU1hcFtjaF07XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG5cbiAgICAgIH0gZWxzZSBpZiAoKHRtcCA9IGVzY2FwZWRIZXhMZW4oY2gpKSA+IDApIHtcbiAgICAgICAgaGV4TGVuZ3RoID0gdG1wO1xuICAgICAgICBoZXhSZXN1bHQgPSAwO1xuXG4gICAgICAgIGZvciAoOyBoZXhMZW5ndGggPiAwOyBoZXhMZW5ndGgtLSkge1xuICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgICAgIGlmICgodG1wID0gZnJvbUhleENvZGUoY2gpKSA+PSAwKSB7XG4gICAgICAgICAgICBoZXhSZXN1bHQgPSAoaGV4UmVzdWx0IDw8IDQpICsgdG1wO1xuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdleHBlY3RlZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY2hhckZyb21Db2RlcG9pbnQoaGV4UmVzdWx0KTtcblxuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5rbm93biBlc2NhcGUgc2VxdWVuY2UnKTtcbiAgICAgIH1cblxuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCB0cnVlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhcicpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgZG91YmxlIHF1b3RlZCBzY2FsYXInKTtcbn1cblxuZnVuY3Rpb24gcmVhZEZsb3dDb2xsZWN0aW9uKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciByZWFkTmV4dCA9IHRydWUsXG4gICAgICBfbGluZSxcbiAgICAgIF90YWcgICAgID0gc3RhdGUudGFnLFxuICAgICAgX3Jlc3VsdCxcbiAgICAgIF9hbmNob3IgID0gc3RhdGUuYW5jaG9yLFxuICAgICAgZm9sbG93aW5nLFxuICAgICAgdGVybWluYXRvcixcbiAgICAgIGlzUGFpcixcbiAgICAgIGlzRXhwbGljaXRQYWlyLFxuICAgICAgaXNNYXBwaW5nLFxuICAgICAgb3ZlcnJpZGFibGVLZXlzID0ge30sXG4gICAgICBrZXlOb2RlLFxuICAgICAga2V5VGFnLFxuICAgICAgdmFsdWVOb2RlLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4NUIvKiBbICovKSB7XG4gICAgdGVybWluYXRvciA9IDB4NUQ7LyogXSAqL1xuICAgIGlzTWFwcGluZyA9IGZhbHNlO1xuICAgIF9yZXN1bHQgPSBbXTtcbiAgfSBlbHNlIGlmIChjaCA9PT0gMHg3Qi8qIHsgKi8pIHtcbiAgICB0ZXJtaW5hdG9yID0gMHg3RDsvKiB9ICovXG4gICAgaXNNYXBwaW5nID0gdHJ1ZTtcbiAgICBfcmVzdWx0ID0ge307XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IHRlcm1pbmF0b3IpIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICAgIHN0YXRlLmtpbmQgPSBpc01hcHBpbmcgPyAnbWFwcGluZycgOiAnc2VxdWVuY2UnO1xuICAgICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIXJlYWROZXh0KSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbWlzc2VkIGNvbW1hIGJldHdlZW4gZmxvdyBjb2xsZWN0aW9uIGVudHJpZXMnKTtcbiAgICB9XG5cbiAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICBpc1BhaXIgPSBpc0V4cGxpY2l0UGFpciA9IGZhbHNlO1xuXG4gICAgaWYgKGNoID09PSAweDNGLyogPyAqLykge1xuICAgICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcbiAgICAgICAgaXNQYWlyID0gaXNFeHBsaWNpdFBhaXIgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfRkxPV19JTiwgZmFsc2UsIHRydWUpO1xuICAgIGtleVRhZyA9IHN0YXRlLnRhZztcbiAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmICgoaXNFeHBsaWNpdFBhaXIgfHwgc3RhdGUubGluZSA9PT0gX2xpbmUpICYmIGNoID09PSAweDNBLyogOiAqLykge1xuICAgICAgaXNQYWlyID0gdHJ1ZTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuICAgICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfRkxPV19JTiwgZmFsc2UsIHRydWUpO1xuICAgICAgdmFsdWVOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChpc01hcHBpbmcpIHtcbiAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgIH0gZWxzZSBpZiAoaXNQYWlyKSB7XG4gICAgICBfcmVzdWx0LnB1c2goc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgbnVsbCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfcmVzdWx0LnB1c2goa2V5Tm9kZSk7XG4gICAgfVxuXG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSAweDJDLyogLCAqLykge1xuICAgICAgcmVhZE5leHQgPSB0cnVlO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWFkTmV4dCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIGZsb3cgY29sbGVjdGlvbicpO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNhcHR1cmVTdGFydCxcbiAgICAgIGZvbGRpbmcsXG4gICAgICBjaG9tcGluZyAgICAgICA9IENIT01QSU5HX0NMSVAsXG4gICAgICBkaWRSZWFkQ29udGVudCA9IGZhbHNlLFxuICAgICAgZGV0ZWN0ZWRJbmRlbnQgPSBmYWxzZSxcbiAgICAgIHRleHRJbmRlbnQgICAgID0gbm9kZUluZGVudCxcbiAgICAgIGVtcHR5TGluZXMgICAgID0gMCxcbiAgICAgIGF0TW9yZUluZGVudGVkID0gZmFsc2UsXG4gICAgICB0bXAsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHg3Qy8qIHwgKi8pIHtcbiAgICBmb2xkaW5nID0gZmFsc2U7XG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4M0UvKiA+ICovKSB7XG4gICAgZm9sZGluZyA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDB4MkIvKiArICovIHx8IGNoID09PSAweDJELyogLSAqLykge1xuICAgICAgaWYgKENIT01QSU5HX0NMSVAgPT09IGNob21waW5nKSB7XG4gICAgICAgIGNob21waW5nID0gKGNoID09PSAweDJCLyogKyAqLykgPyBDSE9NUElOR19LRUVQIDogQ0hPTVBJTkdfU1RSSVA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAncmVwZWF0IG9mIGEgY2hvbXBpbmcgbW9kZSBpZGVudGlmaWVyJyk7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKCh0bXAgPSBmcm9tRGVjaW1hbENvZGUoY2gpKSA+PSAwKSB7XG4gICAgICBpZiAodG1wID09PSAwKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdiYWQgZXhwbGljaXQgaW5kZW50YXRpb24gd2lkdGggb2YgYSBibG9jayBzY2FsYXI7IGl0IGNhbm5vdCBiZSBsZXNzIHRoYW4gb25lJyk7XG4gICAgICB9IGVsc2UgaWYgKCFkZXRlY3RlZEluZGVudCkge1xuICAgICAgICB0ZXh0SW5kZW50ID0gbm9kZUluZGVudCArIHRtcCAtIDE7XG4gICAgICAgIGRldGVjdGVkSW5kZW50ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdyZXBlYXQgb2YgYW4gaW5kZW50YXRpb24gd2lkdGggaWRlbnRpZmllcicpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpO1xuXG4gICAgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiAoY2ggIT09IDApKTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICByZWFkTGluZUJyZWFrKHN0YXRlKTtcbiAgICBzdGF0ZS5saW5lSW5kZW50ID0gMDtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICB3aGlsZSAoKCFkZXRlY3RlZEluZGVudCB8fCBzdGF0ZS5saW5lSW5kZW50IDwgdGV4dEluZGVudCkgJiZcbiAgICAgICAgICAgKGNoID09PSAweDIwLyogU3BhY2UgKi8pKSB7XG4gICAgICBzdGF0ZS5saW5lSW5kZW50Kys7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKCFkZXRlY3RlZEluZGVudCAmJiBzdGF0ZS5saW5lSW5kZW50ID4gdGV4dEluZGVudCkge1xuICAgICAgdGV4dEluZGVudCA9IHN0YXRlLmxpbmVJbmRlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGVtcHR5TGluZXMrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEVuZCBvZiB0aGUgc2NhbGFyLlxuICAgIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgdGV4dEluZGVudCkge1xuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBjaG9tcGluZy5cbiAgICAgIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfS0VFUCkge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZGlkUmVhZENvbnRlbnQgPyAxICsgZW1wdHlMaW5lcyA6IGVtcHR5TGluZXMpO1xuICAgICAgfSBlbHNlIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfQ0xJUCkge1xuICAgICAgICBpZiAoZGlkUmVhZENvbnRlbnQpIHsgLy8gaS5lLiBvbmx5IGlmIHRoZSBzY2FsYXIgaXMgbm90IGVtcHR5LlxuICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCcmVhayB0aGlzIGB3aGlsZWAgY3ljbGUgYW5kIGdvIHRvIHRoZSBmdW5jaXRvbidzIGVwaWxvZ3VlLlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gRm9sZGVkIHN0eWxlOiB1c2UgZmFuY3kgcnVsZXMgdG8gaGFuZGxlIGxpbmUgYnJlYWtzLlxuICAgIGlmIChmb2xkaW5nKSB7XG5cbiAgICAgIC8vIExpbmVzIHN0YXJ0aW5nIHdpdGggd2hpdGUgc3BhY2UgY2hhcmFjdGVycyAobW9yZS1pbmRlbnRlZCBsaW5lcykgYXJlIG5vdCBmb2xkZWQuXG4gICAgICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICAgIGF0TW9yZUluZGVudGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gZXhjZXB0IGZvciB0aGUgZmlyc3QgY29udGVudCBsaW5lIChjZi4gRXhhbXBsZSA4LjEpXG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBkaWRSZWFkQ29udGVudCA/IDEgKyBlbXB0eUxpbmVzIDogZW1wdHlMaW5lcyk7XG5cbiAgICAgIC8vIEVuZCBvZiBtb3JlLWluZGVudGVkIGJsb2NrLlxuICAgICAgfSBlbHNlIGlmIChhdE1vcmVJbmRlbnRlZCkge1xuICAgICAgICBhdE1vcmVJbmRlbnRlZCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyArIDEpO1xuXG4gICAgICAvLyBKdXN0IG9uZSBsaW5lIGJyZWFrIC0gcGVyY2VpdmUgYXMgdGhlIHNhbWUgbGluZS5cbiAgICAgIH0gZWxzZSBpZiAoZW1wdHlMaW5lcyA9PT0gMCkge1xuICAgICAgICBpZiAoZGlkUmVhZENvbnRlbnQpIHsgLy8gaS5lLiBvbmx5IGlmIHdlIGhhdmUgYWxyZWFkeSByZWFkIHNvbWUgc2NhbGFyIGNvbnRlbnQuXG4gICAgICAgICAgc3RhdGUucmVzdWx0ICs9ICcgJztcbiAgICAgICAgfVxuXG4gICAgICAvLyBTZXZlcmFsIGxpbmUgYnJlYWtzIC0gcGVyY2VpdmUgYXMgZGlmZmVyZW50IGxpbmVzLlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMpO1xuICAgICAgfVxuXG4gICAgLy8gTGl0ZXJhbCBzdHlsZToganVzdCBhZGQgZXhhY3QgbnVtYmVyIG9mIGxpbmUgYnJlYWtzIGJldHdlZW4gY29udGVudCBsaW5lcy5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gS2VlcCBhbGwgbGluZSBicmVha3MgZXhjZXB0IHRoZSBoZWFkZXIgbGluZSBicmVhay5cbiAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBkaWRSZWFkQ29udGVudCA/IDEgKyBlbXB0eUxpbmVzIDogZW1wdHlMaW5lcyk7XG4gICAgfVxuXG4gICAgZGlkUmVhZENvbnRlbnQgPSB0cnVlO1xuICAgIGRldGVjdGVkSW5kZW50ID0gdHJ1ZTtcbiAgICBlbXB0eUxpbmVzID0gMDtcbiAgICBjYXB0dXJlU3RhcnQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiAoY2ggIT09IDApKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgX2xpbmUsXG4gICAgICBfdGFnICAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfYW5jaG9yICAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBfcmVzdWx0ICAgPSBbXSxcbiAgICAgIGZvbGxvd2luZyxcbiAgICAgIGRldGVjdGVkICA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG5cbiAgICBpZiAoY2ggIT09IDB4MkQvKiAtICovKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICBpZiAoIWlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkZXRlY3RlZCA9IHRydWU7XG4gICAgc3RhdGUucG9zaXRpb24rKztcblxuICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50IDw9IG5vZGVJbmRlbnQpIHtcbiAgICAgICAgX3Jlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfSU4sIGZhbHNlLCB0cnVlKTtcbiAgICBfcmVzdWx0LnB1c2goc3RhdGUucmVzdWx0KTtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKChzdGF0ZS5saW5lID09PSBfbGluZSB8fCBzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCkgJiYgKGNoICE9PSAwKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2JhZCBpbmRlbnRhdGlvbiBvZiBhIHNlcXVlbmNlIGVudHJ5Jyk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgbm9kZUluZGVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRldGVjdGVkKSB7XG4gICAgc3RhdGUudGFnID0gX3RhZztcbiAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgIHN0YXRlLmtpbmQgPSAnc2VxdWVuY2UnO1xuICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tNYXBwaW5nKHN0YXRlLCBub2RlSW5kZW50LCBmbG93SW5kZW50KSB7XG4gIHZhciBmb2xsb3dpbmcsXG4gICAgICBhbGxvd0NvbXBhY3QsXG4gICAgICBfbGluZSxcbiAgICAgIF9wb3MsXG4gICAgICBfdGFnICAgICAgICAgID0gc3RhdGUudGFnLFxuICAgICAgX2FuY2hvciAgICAgICA9IHN0YXRlLmFuY2hvcixcbiAgICAgIF9yZXN1bHQgICAgICAgPSB7fSxcbiAgICAgIG92ZXJyaWRhYmxlS2V5cyA9IHt9LFxuICAgICAga2V5VGFnICAgICAgICA9IG51bGwsXG4gICAgICBrZXlOb2RlICAgICAgID0gbnVsbCxcbiAgICAgIHZhbHVlTm9kZSAgICAgPSBudWxsLFxuICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlLFxuICAgICAgZGV0ZWN0ZWQgICAgICA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuICAgIF9saW5lID0gc3RhdGUubGluZTsgLy8gU2F2ZSB0aGUgY3VycmVudCBsaW5lLlxuICAgIF9wb3MgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIC8vXG4gICAgLy8gRXhwbGljaXQgbm90YXRpb24gY2FzZS4gVGhlcmUgYXJlIHR3byBzZXBhcmF0ZSBibG9ja3M6XG4gICAgLy8gZmlyc3QgZm9yIHRoZSBrZXkgKGRlbm90ZWQgYnkgXCI/XCIpIGFuZCBzZWNvbmQgZm9yIHRoZSB2YWx1ZSAoZGVub3RlZCBieSBcIjpcIilcbiAgICAvL1xuICAgIGlmICgoY2ggPT09IDB4M0YvKiA/ICovIHx8IGNoID09PSAweDNBLyogOiAqLykgJiYgaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcblxuICAgICAgaWYgKGNoID09PSAweDNGLyogPyAqLykge1xuICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgYXRFeHBsaWNpdEtleSA9IHRydWU7XG4gICAgICAgIGFsbG93Q29tcGFjdCA9IHRydWU7XG5cbiAgICAgIH0gZWxzZSBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAvLyBpLmUuIDB4M0EvKiA6ICovID09PSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGV4cGxpY2l0IGtleS5cbiAgICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlO1xuICAgICAgICBhbGxvd0NvbXBhY3QgPSB0cnVlO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaW5jb21wbGV0ZSBleHBsaWNpdCBtYXBwaW5nIHBhaXI7IGEga2V5IG5vZGUgaXMgbWlzc2VkOyBvciBmb2xsb3dlZCBieSBhIG5vbi10YWJ1bGF0ZWQgZW1wdHkgbGluZScpO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5wb3NpdGlvbiArPSAxO1xuICAgICAgY2ggPSBmb2xsb3dpbmc7XG5cbiAgICAvL1xuICAgIC8vIEltcGxpY2l0IG5vdGF0aW9uIGNhc2UuIEZsb3ctc3R5bGUgbm9kZSBhcyB0aGUga2V5IGZpcnN0LCB0aGVuIFwiOlwiLCBhbmQgdGhlIHZhbHVlLlxuICAgIC8vXG4gICAgfSBlbHNlIGlmIChjb21wb3NlTm9kZShzdGF0ZSwgZmxvd0luZGVudCwgQ09OVEVYVF9GTE9XX09VVCwgZmFsc2UsIHRydWUpKSB7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lID09PSBfbGluZSkge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgICAgaWYgKCFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBleHBlY3RlZCBhZnRlciB0aGUga2V5LXZhbHVlIHNlcGFyYXRvciB3aXRoaW4gYSBibG9jayBtYXBwaW5nJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgICAgICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICBhdEV4cGxpY2l0S2V5ID0gZmFsc2U7XG4gICAgICAgICAgYWxsb3dDb21wYWN0ID0gZmFsc2U7XG4gICAgICAgICAga2V5VGFnID0gc3RhdGUudGFnO1xuICAgICAgICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG5cbiAgICAgICAgfSBlbHNlIGlmIChkZXRlY3RlZCkge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW4gbm90IHJlYWQgYW4gaW1wbGljaXQgbWFwcGluZyBwYWlyOyBhIGNvbG9uIGlzIG1pc3NlZCcpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUudGFnID0gX3RhZztcbiAgICAgICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIHRoZSByZXN1bHQgb2YgYGNvbXBvc2VOb2RlYC5cbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW4gbm90IHJlYWQgYSBibG9jayBtYXBwaW5nIGVudHJ5OyBhIG11bHRpbGluZSBrZXkgbWF5IG5vdCBiZSBhbiBpbXBsaWNpdCBrZXknKTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUudGFnID0gX3RhZztcbiAgICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgdGhlIHJlc3VsdCBvZiBgY29tcG9zZU5vZGVgLlxuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrOyAvLyBSZWFkaW5nIGlzIGRvbmUuIEdvIHRvIHRoZSBlcGlsb2d1ZS5cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIENvbW1vbiByZWFkaW5nIGNvZGUgZm9yIGJvdGggZXhwbGljaXQgYW5kIGltcGxpY2l0IG5vdGF0aW9ucy5cbiAgICAvL1xuICAgIGlmIChzdGF0ZS5saW5lID09PSBfbGluZSB8fCBzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCkge1xuICAgICAgaWYgKGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0JMT0NLX09VVCwgdHJ1ZSwgYWxsb3dDb21wYWN0KSkge1xuICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWVOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghYXRFeHBsaWNpdEtleSkge1xuICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlLCBfbGluZSwgX3Bvcyk7XG4gICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCAmJiAoY2ggIT09IDApKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGluZGVudGF0aW9uIG9mIGEgbWFwcGluZyBlbnRyeScpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IG5vZGVJbmRlbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vXG4gIC8vIEVwaWxvZ3VlLlxuICAvL1xuXG4gIC8vIFNwZWNpYWwgY2FzZTogbGFzdCBtYXBwaW5nJ3Mgbm9kZSBjb250YWlucyBvbmx5IHRoZSBrZXkgaW4gZXhwbGljaXQgbm90YXRpb24uXG4gIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICB9XG5cbiAgLy8gRXhwb3NlIHRoZSByZXN1bHRpbmcgbWFwcGluZy5cbiAgaWYgKGRldGVjdGVkKSB7XG4gICAgc3RhdGUudGFnID0gX3RhZztcbiAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgIHN0YXRlLmtpbmQgPSAnbWFwcGluZyc7XG4gICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBkZXRlY3RlZDtcbn1cblxuZnVuY3Rpb24gcmVhZFRhZ1Byb3BlcnR5KHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sXG4gICAgICBpc1ZlcmJhdGltID0gZmFsc2UsXG4gICAgICBpc05hbWVkICAgID0gZmFsc2UsXG4gICAgICB0YWdIYW5kbGUsXG4gICAgICB0YWdOYW1lLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjEvKiAhICovKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGlvbiBvZiBhIHRhZyBwcm9wZXJ0eScpO1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHgzQy8qIDwgKi8pIHtcbiAgICBpc1ZlcmJhdGltID0gdHJ1ZTtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgfSBlbHNlIGlmIChjaCA9PT0gMHgyMS8qICEgKi8pIHtcbiAgICBpc05hbWVkID0gdHJ1ZTtcbiAgICB0YWdIYW5kbGUgPSAnISEnO1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICB9IGVsc2Uge1xuICAgIHRhZ0hhbmRsZSA9ICchJztcbiAgfVxuXG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIGlmIChpc1ZlcmJhdGltKSB7XG4gICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICB3aGlsZSAoY2ggIT09IDAgJiYgY2ggIT09IDB4M0UvKiA+ICovKTtcblxuICAgIGlmIChzdGF0ZS5wb3NpdGlvbiA8IHN0YXRlLmxlbmd0aCkge1xuICAgICAgdGFnTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSB2ZXJiYXRpbSB0YWcnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG5cbiAgICAgIGlmIChjaCA9PT0gMHgyMS8qICEgKi8pIHtcbiAgICAgICAgaWYgKCFpc05hbWVkKSB7XG4gICAgICAgICAgdGFnSGFuZGxlID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uIC0gMSwgc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgICAgICAgIGlmICghUEFUVEVSTl9UQUdfSEFORExFLnRlc3QodGFnSGFuZGxlKSkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWVkIHRhZyBoYW5kbGUgY2Fubm90IGNvbnRhaW4gc3VjaCBjaGFyYWN0ZXJzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaXNOYW1lZCA9IHRydWU7XG4gICAgICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb24gKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGV4Y2xhbWF0aW9uIG1hcmtzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIHRhZ05hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUy50ZXN0KHRhZ05hbWUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGFnIHN1ZmZpeCBjYW5ub3QgY29udGFpbiBmbG93IGluZGljYXRvciBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRhZ05hbWUgJiYgIVBBVFRFUk5fVEFHX1VSSS50ZXN0KHRhZ05hbWUpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RhZyBuYW1lIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVyczogJyArIHRhZ05hbWUpO1xuICB9XG5cbiAgaWYgKGlzVmVyYmF0aW0pIHtcbiAgICBzdGF0ZS50YWcgPSB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudGFnTWFwLCB0YWdIYW5kbGUpKSB7XG4gICAgc3RhdGUudGFnID0gc3RhdGUudGFnTWFwW3RhZ0hhbmRsZV0gKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAodGFnSGFuZGxlID09PSAnIScpIHtcbiAgICBzdGF0ZS50YWcgPSAnIScgKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAodGFnSGFuZGxlID09PSAnISEnKSB7XG4gICAgc3RhdGUudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOicgKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZGVjbGFyZWQgdGFnIGhhbmRsZSBcIicgKyB0YWdIYW5kbGUgKyAnXCInKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQW5jaG9yUHJvcGVydHkoc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbixcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDI2LyogJiAqLykgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRpb24gb2YgYW4gYW5jaG9yIHByb3BlcnR5Jyk7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSAmJiAhaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBfcG9zaXRpb24pIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmFtZSBvZiBhbiBhbmNob3Igbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlcicpO1xuICB9XG5cbiAgc3RhdGUuYW5jaG9yID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQWxpYXMoc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbiwgYWxpYXMsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyQS8qICogKi8pIHJldHVybiBmYWxzZTtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSAmJiAhaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBfcG9zaXRpb24pIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmFtZSBvZiBhbiBhbGlhcyBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyJyk7XG4gIH1cblxuICBhbGlhcyA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmICghX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUuYW5jaG9yTWFwLCBhbGlhcykpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5pZGVudGlmaWVkIGFsaWFzIFwiJyArIGFsaWFzICsgJ1wiJyk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bHQgPSBzdGF0ZS5hbmNob3JNYXBbYWxpYXNdO1xuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb21wb3NlTm9kZShzdGF0ZSwgcGFyZW50SW5kZW50LCBub2RlQ29udGV4dCwgYWxsb3dUb1NlZWssIGFsbG93Q29tcGFjdCkge1xuICB2YXIgYWxsb3dCbG9ja1N0eWxlcyxcbiAgICAgIGFsbG93QmxvY2tTY2FsYXJzLFxuICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zLFxuICAgICAgaW5kZW50U3RhdHVzID0gMSwgLy8gMTogdGhpcz5wYXJlbnQsIDA6IHRoaXM9cGFyZW50LCAtMTogdGhpczxwYXJlbnRcbiAgICAgIGF0TmV3TGluZSAgPSBmYWxzZSxcbiAgICAgIGhhc0NvbnRlbnQgPSBmYWxzZSxcbiAgICAgIHR5cGVJbmRleCxcbiAgICAgIHR5cGVRdWFudGl0eSxcbiAgICAgIHR5cGUsXG4gICAgICBmbG93SW5kZW50LFxuICAgICAgYmxvY2tJbmRlbnQ7XG5cbiAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgc3RhdGUubGlzdGVuZXIoJ29wZW4nLCBzdGF0ZSk7XG4gIH1cblxuICBzdGF0ZS50YWcgICAgPSBudWxsO1xuICBzdGF0ZS5hbmNob3IgPSBudWxsO1xuICBzdGF0ZS5raW5kICAgPSBudWxsO1xuICBzdGF0ZS5yZXN1bHQgPSBudWxsO1xuXG4gIGFsbG93QmxvY2tTdHlsZXMgPSBhbGxvd0Jsb2NrU2NhbGFycyA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9XG4gICAgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0IHx8XG4gICAgQ09OVEVYVF9CTE9DS19JTiAgPT09IG5vZGVDb250ZXh0O1xuXG4gIGlmIChhbGxvd1RvU2Vlaykge1xuICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgIGF0TmV3TGluZSA9IHRydWU7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IDE7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkge1xuICAgICAgICBpbmRlbnRTdGF0dXMgPSAwO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpbmRlbnRTdGF0dXMgPT09IDEpIHtcbiAgICB3aGlsZSAocmVhZFRhZ1Byb3BlcnR5KHN0YXRlKSB8fCByZWFkQW5jaG9yUHJvcGVydHkoc3RhdGUpKSB7XG4gICAgICBpZiAoc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpKSB7XG4gICAgICAgIGF0TmV3TGluZSA9IHRydWU7XG4gICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGFsbG93QmxvY2tTdHlsZXM7XG5cbiAgICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IC0xO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zKSB7XG4gICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gYXROZXdMaW5lIHx8IGFsbG93Q29tcGFjdDtcbiAgfVxuXG4gIGlmIChpbmRlbnRTdGF0dXMgPT09IDEgfHwgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0KSB7XG4gICAgaWYgKENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQgfHwgQ09OVEVYVF9GTE9XX09VVCA9PT0gbm9kZUNvbnRleHQpIHtcbiAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQgKyAxO1xuICAgIH1cblxuICAgIGJsb2NrSW5kZW50ID0gc3RhdGUucG9zaXRpb24gLSBzdGF0ZS5saW5lU3RhcnQ7XG5cbiAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7XG4gICAgICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmXG4gICAgICAgICAgKHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCkgfHxcbiAgICAgICAgICAgcmVhZEJsb2NrTWFwcGluZyhzdGF0ZSwgYmxvY2tJbmRlbnQsIGZsb3dJbmRlbnQpKSB8fFxuICAgICAgICAgIHJlYWRGbG93Q29sbGVjdGlvbihzdGF0ZSwgZmxvd0luZGVudCkpIHtcbiAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGFsbG93QmxvY2tTY2FsYXJzICYmIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkpIHx8XG4gICAgICAgICAgICByZWFkU2luZ2xlUXVvdGVkU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSB8fFxuICAgICAgICAgICAgcmVhZERvdWJsZVF1b3RlZFNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlYWRBbGlhcyhzdGF0ZSkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgfHwgc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYWxpYXMgbm9kZSBzaG91bGQgbm90IGhhdmUgYW55IHByb3BlcnRpZXMnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWFkUGxhaW5TY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQsIENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQpKSB7XG4gICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc3RhdGUudGFnID09PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZS50YWcgPSAnPyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbmRlbnRTdGF0dXMgPT09IDApIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZTogYmxvY2sgc2VxdWVuY2VzIGFyZSBhbGxvd2VkIHRvIGhhdmUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbCBhcyB0aGUgcGFyZW50LlxuICAgICAgLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyNzk5Nzg0XG4gICAgICBoYXNDb250ZW50ID0gYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZS50YWcgIT09ICchJykge1xuICAgIGlmIChzdGF0ZS50YWcgPT09ICc/Jykge1xuICAgICAgLy8gSW1wbGljaXQgcmVzb2x2aW5nIGlzIG5vdCBhbGxvd2VkIGZvciBub24tc2NhbGFyIHR5cGVzLCBhbmQgJz8nXG4gICAgICAvLyBub24tc3BlY2lmaWMgdGFnIGlzIG9ubHkgYXV0b21hdGljYWxseSBhc3NpZ25lZCB0byBwbGFpbiBzY2FsYXJzLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBjaGVjayBraW5kIGNvbmZvcm1pdHkgaW4gY2FzZSB1c2VyIGV4cGxpY2l0bHkgYXNzaWducyAnPydcbiAgICAgIC8vIHRhZywgZm9yIGV4YW1wbGUgbGlrZSB0aGlzOiBcIiE8Pz4gWzBdXCJcbiAgICAgIC8vXG4gICAgICBpZiAoc3RhdGUucmVzdWx0ICE9PSBudWxsICYmIHN0YXRlLmtpbmQgIT09ICdzY2FsYXInKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmFjY2VwdGFibGUgbm9kZSBraW5kIGZvciAhPD8+IHRhZzsgaXQgc2hvdWxkIGJlIFwic2NhbGFyXCIsIG5vdCBcIicgKyBzdGF0ZS5raW5kICsgJ1wiJyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodHlwZUluZGV4ID0gMCwgdHlwZVF1YW50aXR5ID0gc3RhdGUuaW1wbGljaXRUeXBlcy5sZW5ndGg7IHR5cGVJbmRleCA8IHR5cGVRdWFudGl0eTsgdHlwZUluZGV4ICs9IDEpIHtcbiAgICAgICAgdHlwZSA9IHN0YXRlLmltcGxpY2l0VHlwZXNbdHlwZUluZGV4XTtcblxuICAgICAgICBpZiAodHlwZS5yZXNvbHZlKHN0YXRlLnJlc3VsdCkpIHsgLy8gYHN0YXRlLnJlc3VsdGAgdXBkYXRlZCBpbiByZXNvbHZlciBpZiBtYXRjaGVkXG4gICAgICAgICAgc3RhdGUucmVzdWx0ID0gdHlwZS5jb25zdHJ1Y3Qoc3RhdGUucmVzdWx0KTtcbiAgICAgICAgICBzdGF0ZS50YWcgPSB0eXBlLnRhZztcbiAgICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnR5cGVNYXBbc3RhdGUua2luZCB8fCAnZmFsbGJhY2snXSwgc3RhdGUudGFnKSkge1xuICAgICAgdHlwZSA9IHN0YXRlLnR5cGVNYXBbc3RhdGUua2luZCB8fCAnZmFsbGJhY2snXVtzdGF0ZS50YWddO1xuXG4gICAgICBpZiAoc3RhdGUucmVzdWx0ICE9PSBudWxsICYmIHR5cGUua2luZCAhPT0gc3RhdGUua2luZCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITwnICsgc3RhdGUudGFnICsgJz4gdGFnOyBpdCBzaG91bGQgYmUgXCInICsgdHlwZS5raW5kICsgJ1wiLCBub3QgXCInICsgc3RhdGUua2luZCArICdcIicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXR5cGUucmVzb2x2ZShzdGF0ZS5yZXN1bHQpKSB7IC8vIGBzdGF0ZS5yZXN1bHRgIHVwZGF0ZWQgaW4gcmVzb2x2ZXIgaWYgbWF0Y2hlZFxuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2Fubm90IHJlc29sdmUgYSBub2RlIHdpdGggITwnICsgc3RhdGUudGFnICsgJz4gZXhwbGljaXQgdGFnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgPSB0eXBlLmNvbnN0cnVjdChzdGF0ZS5yZXN1bHQpO1xuICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3Vua25vd24gdGFnICE8JyArIHN0YXRlLnRhZyArICc+Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgc3RhdGUubGlzdGVuZXIoJ2Nsb3NlJywgc3RhdGUpO1xuICB9XG4gIHJldHVybiBzdGF0ZS50YWcgIT09IG51bGwgfHwgIHN0YXRlLmFuY2hvciAhPT0gbnVsbCB8fCBoYXNDb250ZW50O1xufVxuXG5mdW5jdGlvbiByZWFkRG9jdW1lbnQoc3RhdGUpIHtcbiAgdmFyIGRvY3VtZW50U3RhcnQgPSBzdGF0ZS5wb3NpdGlvbixcbiAgICAgIF9wb3NpdGlvbixcbiAgICAgIGRpcmVjdGl2ZU5hbWUsXG4gICAgICBkaXJlY3RpdmVBcmdzLFxuICAgICAgaGFzRGlyZWN0aXZlcyA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgc3RhdGUudmVyc2lvbiA9IG51bGw7XG4gIHN0YXRlLmNoZWNrTGluZUJyZWFrcyA9IHN0YXRlLmxlZ2FjeTtcbiAgc3RhdGUudGFnTWFwID0ge307XG4gIHN0YXRlLmFuY2hvck1hcCA9IHt9O1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiAwIHx8IGNoICE9PSAweDI1LyogJSAqLykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaGFzRGlyZWN0aXZlcyA9IHRydWU7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgZGlyZWN0aXZlTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICAgIGRpcmVjdGl2ZUFyZ3MgPSBbXTtcblxuICAgIGlmIChkaXJlY3RpdmVOYW1lLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkaXJlY3RpdmUgbmFtZSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gb25lIGNoYXJhY3RlciBpbiBsZW5ndGgnKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfRU9MKGNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNfRU9MKGNoKSkgYnJlYWs7XG5cbiAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBkaXJlY3RpdmVBcmdzLnB1c2goc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbikpO1xuICAgIH1cblxuICAgIGlmIChjaCAhPT0gMCkgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG5cbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoZGlyZWN0aXZlSGFuZGxlcnMsIGRpcmVjdGl2ZU5hbWUpKSB7XG4gICAgICBkaXJlY3RpdmVIYW5kbGVyc1tkaXJlY3RpdmVOYW1lXShzdGF0ZSwgZGlyZWN0aXZlTmFtZSwgZGlyZWN0aXZlQXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ3Vua25vd24gZG9jdW1lbnQgZGlyZWN0aXZlIFwiJyArIGRpcmVjdGl2ZU5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH1cblxuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IDAgJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pICAgICA9PT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKSA9PT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAyKSA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbiArPSAzO1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICB9IGVsc2UgaWYgKGhhc0RpcmVjdGl2ZXMpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZGlyZWN0aXZlcyBlbmQgbWFyayBpcyBleHBlY3RlZCcpO1xuICB9XG5cbiAgY29tcG9zZU5vZGUoc3RhdGUsIHN0YXRlLmxpbmVJbmRlbnQgLSAxLCBDT05URVhUX0JMT0NLX09VVCwgZmFsc2UsIHRydWUpO1xuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgaWYgKHN0YXRlLmNoZWNrTGluZUJyZWFrcyAmJlxuICAgICAgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MudGVzdChzdGF0ZS5pbnB1dC5zbGljZShkb2N1bWVudFN0YXJ0LCBzdGF0ZS5wb3NpdGlvbikpKSB7XG4gICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAnbm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50Jyk7XG4gIH1cblxuICBzdGF0ZS5kb2N1bWVudHMucHVzaChzdGF0ZS5yZXN1bHQpO1xuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcblxuICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgyRS8qIC4gKi8pIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDM7XG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA8IChzdGF0ZS5sZW5ndGggLSAxKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdlbmQgb2YgdGhlIHN0cmVhbSBvciBhIGRvY3VtZW50IHNlcGFyYXRvciBpcyBleHBlY3RlZCcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpIHtcbiAgaW5wdXQgPSBTdHJpbmcoaW5wdXQpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBpZiAoaW5wdXQubGVuZ3RoICE9PSAwKSB7XG5cbiAgICAvLyBBZGQgdGFpbGluZyBgXFxuYCBpZiBub3QgZXhpc3RzXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDB4MEEvKiBMRiAqLyAmJlxuICAgICAgICBpbnB1dC5jaGFyQ29kZUF0KGlucHV0Lmxlbmd0aCAtIDEpICE9PSAweDBELyogQ1IgKi8pIHtcbiAgICAgIGlucHV0ICs9ICdcXG4nO1xuICAgIH1cblxuICAgIC8vIFN0cmlwIEJPTVxuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0YXRlID0gbmV3IFN0YXRlKGlucHV0LCBvcHRpb25zKTtcblxuICB2YXIgbnVsbHBvcyA9IGlucHV0LmluZGV4T2YoJ1xcMCcpO1xuXG4gIGlmIChudWxscG9zICE9PSAtMSkge1xuICAgIHN0YXRlLnBvc2l0aW9uID0gbnVsbHBvcztcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbnVsbCBieXRlIGlzIG5vdCBhbGxvd2VkIGluIGlucHV0Jyk7XG4gIH1cblxuICAvLyBVc2UgMCBhcyBzdHJpbmcgdGVybWluYXRvci4gVGhhdCBzaWduaWZpY2FudGx5IHNpbXBsaWZpZXMgYm91bmRzIGNoZWNrLlxuICBzdGF0ZS5pbnB1dCArPSAnXFwwJztcblxuICB3aGlsZSAoc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgPT09IDB4MjAvKiBTcGFjZSAqLykge1xuICAgIHN0YXRlLmxpbmVJbmRlbnQgKz0gMTtcbiAgICBzdGF0ZS5wb3NpdGlvbiArPSAxO1xuICB9XG5cbiAgd2hpbGUgKHN0YXRlLnBvc2l0aW9uIDwgKHN0YXRlLmxlbmd0aCAtIDEpKSB7XG4gICAgcmVhZERvY3VtZW50KHN0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZS5kb2N1bWVudHM7XG59XG5cblxuZnVuY3Rpb24gbG9hZEFsbChpbnB1dCwgaXRlcmF0b3IsIG9wdGlvbnMpIHtcbiAgaWYgKGl0ZXJhdG9yICE9PSBudWxsICYmIHR5cGVvZiBpdGVyYXRvciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgb3B0aW9ucyA9IGl0ZXJhdG9yO1xuICAgIGl0ZXJhdG9yID0gbnVsbDtcbiAgfVxuXG4gIHZhciBkb2N1bWVudHMgPSBsb2FkRG9jdW1lbnRzKGlucHV0LCBvcHRpb25zKTtcblxuICBpZiAodHlwZW9mIGl0ZXJhdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50cztcbiAgfVxuXG4gIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0gZG9jdW1lbnRzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBpdGVyYXRvcihkb2N1bWVudHNbaW5kZXhdKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGxvYWQoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpO1xuXG4gIGlmIChkb2N1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgLyplc2xpbnQtZGlzYWJsZSBuby11bmRlZmluZWQqL1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSBpZiAoZG9jdW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBkb2N1bWVudHNbMF07XG4gIH1cbiAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ2V4cGVjdGVkIGEgc2luZ2xlIGRvY3VtZW50IGluIHRoZSBzdHJlYW0sIGJ1dCBmb3VuZCBtb3JlJyk7XG59XG5cblxuZnVuY3Rpb24gc2FmZUxvYWRBbGwoaW5wdXQsIGl0ZXJhdG9yLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgaXRlcmF0b3IgPT09ICdvYmplY3QnICYmIGl0ZXJhdG9yICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb25zID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdGlvbnMgPSBpdGVyYXRvcjtcbiAgICBpdGVyYXRvciA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gbG9hZEFsbChpbnB1dCwgaXRlcmF0b3IsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpO1xufVxuXG5cbmZ1bmN0aW9uIHNhZmVMb2FkKGlucHV0LCBvcHRpb25zKSB7XG4gIHJldHVybiBsb2FkKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cy5sb2FkQWxsICAgICA9IGxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5sb2FkICAgICAgICA9IGxvYWQ7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZEFsbCA9IHNhZmVMb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWQgICAgPSBzYWZlTG9hZDtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuXG52YXIgY29tbW9uICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG52YXIgWUFNTEV4Y2VwdGlvbiAgICAgICA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG52YXIgREVGQVVMVF9GVUxMX1NDSEVNQSA9IHJlcXVpcmUoJy4vc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xudmFyIERFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlKCcuL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcblxudmFyIF90b1N0cmluZyAgICAgICA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIENIQVJfVEFCICAgICAgICAgICAgICAgICAgPSAweDA5OyAvKiBUYWIgKi9cbnZhciBDSEFSX0xJTkVfRkVFRCAgICAgICAgICAgID0gMHgwQTsgLyogTEYgKi9cbnZhciBDSEFSX0NBUlJJQUdFX1JFVFVSTiAgICAgID0gMHgwRDsgLyogQ1IgKi9cbnZhciBDSEFSX1NQQUNFICAgICAgICAgICAgICAgID0gMHgyMDsgLyogU3BhY2UgKi9cbnZhciBDSEFSX0VYQ0xBTUFUSU9OICAgICAgICAgID0gMHgyMTsgLyogISAqL1xudmFyIENIQVJfRE9VQkxFX1FVT1RFICAgICAgICAgPSAweDIyOyAvKiBcIiAqL1xudmFyIENIQVJfU0hBUlAgICAgICAgICAgICAgICAgPSAweDIzOyAvKiAjICovXG52YXIgQ0hBUl9QRVJDRU5UICAgICAgICAgICAgICA9IDB4MjU7IC8qICUgKi9cbnZhciBDSEFSX0FNUEVSU0FORCAgICAgICAgICAgID0gMHgyNjsgLyogJiAqL1xudmFyIENIQVJfU0lOR0xFX1FVT1RFICAgICAgICAgPSAweDI3OyAvKiAnICovXG52YXIgQ0hBUl9BU1RFUklTSyAgICAgICAgICAgICA9IDB4MkE7IC8qICogKi9cbnZhciBDSEFSX0NPTU1BICAgICAgICAgICAgICAgID0gMHgyQzsgLyogLCAqL1xudmFyIENIQVJfTUlOVVMgICAgICAgICAgICAgICAgPSAweDJEOyAvKiAtICovXG52YXIgQ0hBUl9DT0xPTiAgICAgICAgICAgICAgICA9IDB4M0E7IC8qIDogKi9cbnZhciBDSEFSX0VRVUFMUyAgICAgICAgICAgICAgID0gMHgzRDsgLyogPSAqL1xudmFyIENIQVJfR1JFQVRFUl9USEFOICAgICAgICAgPSAweDNFOyAvKiA+ICovXG52YXIgQ0hBUl9RVUVTVElPTiAgICAgICAgICAgICA9IDB4M0Y7IC8qID8gKi9cbnZhciBDSEFSX0NPTU1FUkNJQUxfQVQgICAgICAgID0gMHg0MDsgLyogQCAqL1xudmFyIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCAgPSAweDVCOyAvKiBbICovXG52YXIgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCA9IDB4NUQ7IC8qIF0gKi9cbnZhciBDSEFSX0dSQVZFX0FDQ0VOVCAgICAgICAgID0gMHg2MDsgLyogYCAqL1xudmFyIENIQVJfTEVGVF9DVVJMWV9CUkFDS0VUICAgPSAweDdCOyAvKiB7ICovXG52YXIgQ0hBUl9WRVJUSUNBTF9MSU5FICAgICAgICA9IDB4N0M7IC8qIHwgKi9cbnZhciBDSEFSX1JJR0hUX0NVUkxZX0JSQUNLRVQgID0gMHg3RDsgLyogfSAqL1xuXG52YXIgRVNDQVBFX1NFUVVFTkNFUyA9IHt9O1xuXG5FU0NBUEVfU0VRVUVOQ0VTWzB4MDBdICAgPSAnXFxcXDAnO1xuRVNDQVBFX1NFUVVFTkNFU1sweDA3XSAgID0gJ1xcXFxhJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgwOF0gICA9ICdcXFxcYic7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4MDldICAgPSAnXFxcXHQnO1xuRVNDQVBFX1NFUVVFTkNFU1sweDBBXSAgID0gJ1xcXFxuJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgwQl0gICA9ICdcXFxcdic7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4MENdICAgPSAnXFxcXGYnO1xuRVNDQVBFX1NFUVVFTkNFU1sweDBEXSAgID0gJ1xcXFxyJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgxQl0gICA9ICdcXFxcZSc7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4MjJdICAgPSAnXFxcXFwiJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHg1Q10gICA9ICdcXFxcXFxcXCc7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4ODVdICAgPSAnXFxcXE4nO1xuRVNDQVBFX1NFUVVFTkNFU1sweEEwXSAgID0gJ1xcXFxfJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgyMDI4XSA9ICdcXFxcTCc7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4MjAyOV0gPSAnXFxcXFAnO1xuXG52YXIgREVQUkVDQVRFRF9CT09MRUFOU19TWU5UQVggPSBbXG4gICd5JywgJ1knLCAneWVzJywgJ1llcycsICdZRVMnLCAnb24nLCAnT24nLCAnT04nLFxuICAnbicsICdOJywgJ25vJywgJ05vJywgJ05PJywgJ29mZicsICdPZmYnLCAnT0ZGJ1xuXTtcblxuZnVuY3Rpb24gY29tcGlsZVN0eWxlTWFwKHNjaGVtYSwgbWFwKSB7XG4gIHZhciByZXN1bHQsIGtleXMsIGluZGV4LCBsZW5ndGgsIHRhZywgc3R5bGUsIHR5cGU7XG5cbiAgaWYgKG1hcCA9PT0gbnVsbCkgcmV0dXJuIHt9O1xuXG4gIHJlc3VsdCA9IHt9O1xuICBrZXlzID0gT2JqZWN0LmtleXMobWFwKTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgdGFnID0ga2V5c1tpbmRleF07XG4gICAgc3R5bGUgPSBTdHJpbmcobWFwW3RhZ10pO1xuXG4gICAgaWYgKHRhZy5zbGljZSgwLCAyKSA9PT0gJyEhJykge1xuICAgICAgdGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOicgKyB0YWcuc2xpY2UoMik7XG4gICAgfVxuICAgIHR5cGUgPSBzY2hlbWEuY29tcGlsZWRUeXBlTWFwWydmYWxsYmFjayddW3RhZ107XG5cbiAgICBpZiAodHlwZSAmJiBfaGFzT3duUHJvcGVydHkuY2FsbCh0eXBlLnN0eWxlQWxpYXNlcywgc3R5bGUpKSB7XG4gICAgICBzdHlsZSA9IHR5cGUuc3R5bGVBbGlhc2VzW3N0eWxlXTtcbiAgICB9XG5cbiAgICByZXN1bHRbdGFnXSA9IHN0eWxlO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZW5jb2RlSGV4KGNoYXJhY3Rlcikge1xuICB2YXIgc3RyaW5nLCBoYW5kbGUsIGxlbmd0aDtcblxuICBzdHJpbmcgPSBjaGFyYWN0ZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cbiAgaWYgKGNoYXJhY3RlciA8PSAweEZGKSB7XG4gICAgaGFuZGxlID0gJ3gnO1xuICAgIGxlbmd0aCA9IDI7XG4gIH0gZWxzZSBpZiAoY2hhcmFjdGVyIDw9IDB4RkZGRikge1xuICAgIGhhbmRsZSA9ICd1JztcbiAgICBsZW5ndGggPSA0O1xuICB9IGVsc2UgaWYgKGNoYXJhY3RlciA8PSAweEZGRkZGRkZGKSB7XG4gICAgaGFuZGxlID0gJ1UnO1xuICAgIGxlbmd0aCA9IDg7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ2NvZGUgcG9pbnQgd2l0aGluIGEgc3RyaW5nIG1heSBub3QgYmUgZ3JlYXRlciB0aGFuIDB4RkZGRkZGRkYnKTtcbiAgfVxuXG4gIHJldHVybiAnXFxcXCcgKyBoYW5kbGUgKyBjb21tb24ucmVwZWF0KCcwJywgbGVuZ3RoIC0gc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIFN0YXRlKG9wdGlvbnMpIHtcbiAgdGhpcy5zY2hlbWEgICAgICAgID0gb3B0aW9uc1snc2NoZW1hJ10gfHwgREVGQVVMVF9GVUxMX1NDSEVNQTtcbiAgdGhpcy5pbmRlbnQgICAgICAgID0gTWF0aC5tYXgoMSwgKG9wdGlvbnNbJ2luZGVudCddIHx8IDIpKTtcbiAgdGhpcy5ub0FycmF5SW5kZW50ID0gb3B0aW9uc1snbm9BcnJheUluZGVudCddIHx8IGZhbHNlO1xuICB0aGlzLnNraXBJbnZhbGlkICAgPSBvcHRpb25zWydza2lwSW52YWxpZCddIHx8IGZhbHNlO1xuICB0aGlzLmZsb3dMZXZlbCAgICAgPSAoY29tbW9uLmlzTm90aGluZyhvcHRpb25zWydmbG93TGV2ZWwnXSkgPyAtMSA6IG9wdGlvbnNbJ2Zsb3dMZXZlbCddKTtcbiAgdGhpcy5zdHlsZU1hcCAgICAgID0gY29tcGlsZVN0eWxlTWFwKHRoaXMuc2NoZW1hLCBvcHRpb25zWydzdHlsZXMnXSB8fCBudWxsKTtcbiAgdGhpcy5zb3J0S2V5cyAgICAgID0gb3B0aW9uc1snc29ydEtleXMnXSB8fCBmYWxzZTtcbiAgdGhpcy5saW5lV2lkdGggICAgID0gb3B0aW9uc1snbGluZVdpZHRoJ10gfHwgODA7XG4gIHRoaXMubm9SZWZzICAgICAgICA9IG9wdGlvbnNbJ25vUmVmcyddIHx8IGZhbHNlO1xuICB0aGlzLm5vQ29tcGF0TW9kZSAgPSBvcHRpb25zWydub0NvbXBhdE1vZGUnXSB8fCBmYWxzZTtcbiAgdGhpcy5jb25kZW5zZUZsb3cgID0gb3B0aW9uc1snY29uZGVuc2VGbG93J10gfHwgZmFsc2U7XG5cbiAgdGhpcy5pbXBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRJbXBsaWNpdDtcbiAgdGhpcy5leHBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRFeHBsaWNpdDtcblxuICB0aGlzLnRhZyA9IG51bGw7XG4gIHRoaXMucmVzdWx0ID0gJyc7XG5cbiAgdGhpcy5kdXBsaWNhdGVzID0gW107XG4gIHRoaXMudXNlZER1cGxpY2F0ZXMgPSBudWxsO1xufVxuXG4vLyBJbmRlbnRzIGV2ZXJ5IGxpbmUgaW4gYSBzdHJpbmcuIEVtcHR5IGxpbmVzIChcXG4gb25seSkgYXJlIG5vdCBpbmRlbnRlZC5cbmZ1bmN0aW9uIGluZGVudFN0cmluZyhzdHJpbmcsIHNwYWNlcykge1xuICB2YXIgaW5kID0gY29tbW9uLnJlcGVhdCgnICcsIHNwYWNlcyksXG4gICAgICBwb3NpdGlvbiA9IDAsXG4gICAgICBuZXh0ID0gLTEsXG4gICAgICByZXN1bHQgPSAnJyxcbiAgICAgIGxpbmUsXG4gICAgICBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuXG4gIHdoaWxlIChwb3NpdGlvbiA8IGxlbmd0aCkge1xuICAgIG5leHQgPSBzdHJpbmcuaW5kZXhPZignXFxuJywgcG9zaXRpb24pO1xuICAgIGlmIChuZXh0ID09PSAtMSkge1xuICAgICAgbGluZSA9IHN0cmluZy5zbGljZShwb3NpdGlvbik7XG4gICAgICBwb3NpdGlvbiA9IGxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZSA9IHN0cmluZy5zbGljZShwb3NpdGlvbiwgbmV4dCArIDEpO1xuICAgICAgcG9zaXRpb24gPSBuZXh0ICsgMTtcbiAgICB9XG5cbiAgICBpZiAobGluZS5sZW5ndGggJiYgbGluZSAhPT0gJ1xcbicpIHJlc3VsdCArPSBpbmQ7XG5cbiAgICByZXN1bHQgKz0gbGluZTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTmV4dExpbmUoc3RhdGUsIGxldmVsKSB7XG4gIHJldHVybiAnXFxuJyArIGNvbW1vbi5yZXBlYXQoJyAnLCBzdGF0ZS5pbmRlbnQgKiBsZXZlbCk7XG59XG5cbmZ1bmN0aW9uIHRlc3RJbXBsaWNpdFJlc29sdmluZyhzdGF0ZSwgc3RyKSB7XG4gIHZhciBpbmRleCwgbGVuZ3RoLCB0eXBlO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBzdGF0ZS5pbXBsaWNpdFR5cGVzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICB0eXBlID0gc3RhdGUuaW1wbGljaXRUeXBlc1tpbmRleF07XG5cbiAgICBpZiAodHlwZS5yZXNvbHZlKHN0cikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gWzMzXSBzLXdoaXRlIDo6PSBzLXNwYWNlIHwgcy10YWJcbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjKSB7XG4gIHJldHVybiBjID09PSBDSEFSX1NQQUNFIHx8IGMgPT09IENIQVJfVEFCO1xufVxuXG4vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBjYW4gYmUgcHJpbnRlZCB3aXRob3V0IGVzY2FwaW5nLlxuLy8gRnJvbSBZQU1MIDEuMjogXCJhbnkgYWxsb3dlZCBjaGFyYWN0ZXJzIGtub3duIHRvIGJlIG5vbi1wcmludGFibGVcbi8vIHNob3VsZCBhbHNvIGJlIGVzY2FwZWQuIFtIb3dldmVyLF0gVGhpcyBpc25cdTIwMTl0IG1hbmRhdG9yeVwiXG4vLyBEZXJpdmVkIGZyb20gbmItY2hhciAtIFxcdCAtICN4ODUgLSAjeEEwIC0gI3gyMDI4IC0gI3gyMDI5LlxuZnVuY3Rpb24gaXNQcmludGFibGUoYykge1xuICByZXR1cm4gICgweDAwMDIwIDw9IGMgJiYgYyA8PSAweDAwMDA3RSlcbiAgICAgIHx8ICgoMHgwMDBBMSA8PSBjICYmIGMgPD0gMHgwMEQ3RkYpICYmIGMgIT09IDB4MjAyOCAmJiBjICE9PSAweDIwMjkpXG4gICAgICB8fCAoKDB4MEUwMDAgPD0gYyAmJiBjIDw9IDB4MDBGRkZEKSAmJiBjICE9PSAweEZFRkYgLyogQk9NICovKVxuICAgICAgfHwgICgweDEwMDAwIDw9IGMgJiYgYyA8PSAweDEwRkZGRik7XG59XG5cbi8vIFszNF0gbnMtY2hhciA6Oj0gbmItY2hhciAtIHMtd2hpdGVcbi8vIFsyN10gbmItY2hhciA6Oj0gYy1wcmludGFibGUgLSBiLWNoYXIgLSBjLWJ5dGUtb3JkZXItbWFya1xuLy8gWzI2XSBiLWNoYXIgIDo6PSBiLWxpbmUtZmVlZCB8IGItY2FycmlhZ2UtcmV0dXJuXG4vLyBbMjRdIGItbGluZS1mZWVkICAgICAgIDo6PSAgICAgI3hBICAgIC8qIExGICovXG4vLyBbMjVdIGItY2FycmlhZ2UtcmV0dXJuIDo6PSAgICAgI3hEICAgIC8qIENSICovXG4vLyBbM10gIGMtYnl0ZS1vcmRlci1tYXJrIDo6PSAgICAgI3hGRUZGXG5mdW5jdGlvbiBpc05zQ2hhcihjKSB7XG4gIHJldHVybiBpc1ByaW50YWJsZShjKSAmJiAhaXNXaGl0ZXNwYWNlKGMpXG4gICAgLy8gYnl0ZS1vcmRlci1tYXJrXG4gICAgJiYgYyAhPT0gMHhGRUZGXG4gICAgLy8gYi1jaGFyXG4gICAgJiYgYyAhPT0gQ0hBUl9DQVJSSUFHRV9SRVRVUk5cbiAgICAmJiBjICE9PSBDSEFSX0xJTkVfRkVFRDtcbn1cblxuLy8gU2ltcGxpZmllZCB0ZXN0IGZvciB2YWx1ZXMgYWxsb3dlZCBhZnRlciB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHBsYWluIHN0eWxlLlxuZnVuY3Rpb24gaXNQbGFpblNhZmUoYywgcHJldikge1xuICAvLyBVc2VzIGEgc3Vic2V0IG9mIG5iLWNoYXIgLSBjLWZsb3ctaW5kaWNhdG9yIC0gXCI6XCIgLSBcIiNcIlxuICAvLyB3aGVyZSBuYi1jaGFyIDo6PSBjLXByaW50YWJsZSAtIGItY2hhciAtIGMtYnl0ZS1vcmRlci1tYXJrLlxuICByZXR1cm4gaXNQcmludGFibGUoYykgJiYgYyAhPT0gMHhGRUZGXG4gICAgLy8gLSBjLWZsb3ctaW5kaWNhdG9yXG4gICAgJiYgYyAhPT0gQ0hBUl9DT01NQVxuICAgICYmIGMgIT09IENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVFxuICAgICYmIGMgIT09IENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVRcbiAgICAmJiBjICE9PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0tFVFxuICAgICYmIGMgIT09IENIQVJfUklHSFRfQ1VSTFlfQlJBQ0tFVFxuICAgIC8vIC0gXCI6XCIgLSBcIiNcIlxuICAgIC8vIC8qIEFuIG5zLWNoYXIgcHJlY2VkaW5nICovIFwiI1wiXG4gICAgJiYgYyAhPT0gQ0hBUl9DT0xPTlxuICAgICYmICgoYyAhPT0gQ0hBUl9TSEFSUCkgfHwgKHByZXYgJiYgaXNOc0NoYXIocHJldikpKTtcbn1cblxuLy8gU2ltcGxpZmllZCB0ZXN0IGZvciB2YWx1ZXMgYWxsb3dlZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHBsYWluIHN0eWxlLlxuZnVuY3Rpb24gaXNQbGFpblNhZmVGaXJzdChjKSB7XG4gIC8vIFVzZXMgYSBzdWJzZXQgb2YgbnMtY2hhciAtIGMtaW5kaWNhdG9yXG4gIC8vIHdoZXJlIG5zLWNoYXIgPSBuYi1jaGFyIC0gcy13aGl0ZS5cbiAgcmV0dXJuIGlzUHJpbnRhYmxlKGMpICYmIGMgIT09IDB4RkVGRlxuICAgICYmICFpc1doaXRlc3BhY2UoYykgLy8gLSBzLXdoaXRlXG4gICAgLy8gLSAoYy1pbmRpY2F0b3IgOjo9XG4gICAgLy8gXHUyMDFDLVx1MjAxRCB8IFx1MjAxQz9cdTIwMUQgfCBcdTIwMUM6XHUyMDFEIHwgXHUyMDFDLFx1MjAxRCB8IFx1MjAxQ1tcdTIwMUQgfCBcdTIwMUNdXHUyMDFEIHwgXHUyMDFDe1x1MjAxRCB8IFx1MjAxQ31cdTIwMURcbiAgICAmJiBjICE9PSBDSEFSX01JTlVTXG4gICAgJiYgYyAhPT0gQ0hBUl9RVUVTVElPTlxuICAgICYmIGMgIT09IENIQVJfQ09MT05cbiAgICAmJiBjICE9PSBDSEFSX0NPTU1BXG4gICAgJiYgYyAhPT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUXG4gICAgJiYgYyAhPT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVFxuICAgICYmIGMgIT09IENIQVJfTEVGVF9DVVJMWV9CUkFDS0VUXG4gICAgJiYgYyAhPT0gQ0hBUl9SSUdIVF9DVVJMWV9CUkFDS0VUXG4gICAgLy8gfCBcdTIwMUMjXHUyMDFEIHwgXHUyMDFDJlx1MjAxRCB8IFx1MjAxQypcdTIwMUQgfCBcdTIwMUMhXHUyMDFEIHwgXHUyMDFDfFx1MjAxRCB8IFx1MjAxQz1cdTIwMUQgfCBcdTIwMUM+XHUyMDFEIHwgXHUyMDFDJ1x1MjAxRCB8IFx1MjAxQ1wiXHUyMDFEXG4gICAgJiYgYyAhPT0gQ0hBUl9TSEFSUFxuICAgICYmIGMgIT09IENIQVJfQU1QRVJTQU5EXG4gICAgJiYgYyAhPT0gQ0hBUl9BU1RFUklTS1xuICAgICYmIGMgIT09IENIQVJfRVhDTEFNQVRJT05cbiAgICAmJiBjICE9PSBDSEFSX1ZFUlRJQ0FMX0xJTkVcbiAgICAmJiBjICE9PSBDSEFSX0VRVUFMU1xuICAgICYmIGMgIT09IENIQVJfR1JFQVRFUl9USEFOXG4gICAgJiYgYyAhPT0gQ0hBUl9TSU5HTEVfUVVPVEVcbiAgICAmJiBjICE9PSBDSEFSX0RPVUJMRV9RVU9URVxuICAgIC8vIHwgXHUyMDFDJVx1MjAxRCB8IFx1MjAxQ0BcdTIwMUQgfCBcdTIwMUNgXHUyMDFEKVxuICAgICYmIGMgIT09IENIQVJfUEVSQ0VOVFxuICAgICYmIGMgIT09IENIQVJfQ09NTUVSQ0lBTF9BVFxuICAgICYmIGMgIT09IENIQVJfR1JBVkVfQUNDRU5UO1xufVxuXG4vLyBEZXRlcm1pbmVzIHdoZXRoZXIgYmxvY2sgaW5kZW50YXRpb24gaW5kaWNhdG9yIGlzIHJlcXVpcmVkLlxuZnVuY3Rpb24gbmVlZEluZGVudEluZGljYXRvcihzdHJpbmcpIHtcbiAgdmFyIGxlYWRpbmdTcGFjZVJlID0gL15cXG4qIC87XG4gIHJldHVybiBsZWFkaW5nU3BhY2VSZS50ZXN0KHN0cmluZyk7XG59XG5cbnZhciBTVFlMRV9QTEFJTiAgID0gMSxcbiAgICBTVFlMRV9TSU5HTEUgID0gMixcbiAgICBTVFlMRV9MSVRFUkFMID0gMyxcbiAgICBTVFlMRV9GT0xERUQgID0gNCxcbiAgICBTVFlMRV9ET1VCTEUgID0gNTtcblxuLy8gRGV0ZXJtaW5lcyB3aGljaCBzY2FsYXIgc3R5bGVzIGFyZSBwb3NzaWJsZSBhbmQgcmV0dXJucyB0aGUgcHJlZmVycmVkIHN0eWxlLlxuLy8gbGluZVdpZHRoID0gLTEgPT4gbm8gbGltaXQuXG4vLyBQcmUtY29uZGl0aW9uczogc3RyLmxlbmd0aCA+IDAuXG4vLyBQb3N0LWNvbmRpdGlvbnM6XG4vLyAgICBTVFlMRV9QTEFJTiBvciBTVFlMRV9TSU5HTEUgPT4gbm8gXFxuIGFyZSBpbiB0aGUgc3RyaW5nLlxuLy8gICAgU1RZTEVfTElURVJBTCA9PiBubyBsaW5lcyBhcmUgc3VpdGFibGUgZm9yIGZvbGRpbmcgKG9yIGxpbmVXaWR0aCBpcyAtMSkuXG4vLyAgICBTVFlMRV9GT0xERUQgPT4gYSBsaW5lID4gbGluZVdpZHRoIGFuZCBjYW4gYmUgZm9sZGVkIChhbmQgbGluZVdpZHRoICE9IC0xKS5cbmZ1bmN0aW9uIGNob29zZVNjYWxhclN0eWxlKHN0cmluZywgc2luZ2xlTGluZU9ubHksIGluZGVudFBlckxldmVsLCBsaW5lV2lkdGgsIHRlc3RBbWJpZ3VvdXNUeXBlKSB7XG4gIHZhciBpO1xuICB2YXIgY2hhciwgcHJldl9jaGFyO1xuICB2YXIgaGFzTGluZUJyZWFrID0gZmFsc2U7XG4gIHZhciBoYXNGb2xkYWJsZUxpbmUgPSBmYWxzZTsgLy8gb25seSBjaGVja2VkIGlmIHNob3VsZFRyYWNrV2lkdGhcbiAgdmFyIHNob3VsZFRyYWNrV2lkdGggPSBsaW5lV2lkdGggIT09IC0xO1xuICB2YXIgcHJldmlvdXNMaW5lQnJlYWsgPSAtMTsgLy8gY291bnQgdGhlIGZpcnN0IGxpbmUgY29ycmVjdGx5XG4gIHZhciBwbGFpbiA9IGlzUGxhaW5TYWZlRmlyc3Qoc3RyaW5nLmNoYXJDb2RlQXQoMCkpXG4gICAgICAgICAgJiYgIWlzV2hpdGVzcGFjZShzdHJpbmcuY2hhckNvZGVBdChzdHJpbmcubGVuZ3RoIC0gMSkpO1xuXG4gIGlmIChzaW5nbGVMaW5lT25seSkge1xuICAgIC8vIENhc2U6IG5vIGJsb2NrIHN0eWxlcy5cbiAgICAvLyBDaGVjayBmb3IgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzIHRvIHJ1bGUgb3V0IHBsYWluIGFuZCBzaW5nbGUuXG4gICAgZm9yIChpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgY2hhciA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgaWYgKCFpc1ByaW50YWJsZShjaGFyKSkge1xuICAgICAgICByZXR1cm4gU1RZTEVfRE9VQkxFO1xuICAgICAgfVxuICAgICAgcHJldl9jaGFyID0gaSA+IDAgPyBzdHJpbmcuY2hhckNvZGVBdChpIC0gMSkgOiBudWxsO1xuICAgICAgcGxhaW4gPSBwbGFpbiAmJiBpc1BsYWluU2FmZShjaGFyLCBwcmV2X2NoYXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBDYXNlOiBibG9jayBzdHlsZXMgcGVybWl0dGVkLlxuICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoYXIgPSBzdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICAgIGlmIChjaGFyID09PSBDSEFSX0xJTkVfRkVFRCkge1xuICAgICAgICBoYXNMaW5lQnJlYWsgPSB0cnVlO1xuICAgICAgICAvLyBDaGVjayBpZiBhbnkgbGluZSBjYW4gYmUgZm9sZGVkLlxuICAgICAgICBpZiAoc2hvdWxkVHJhY2tXaWR0aCkge1xuICAgICAgICAgIGhhc0ZvbGRhYmxlTGluZSA9IGhhc0ZvbGRhYmxlTGluZSB8fFxuICAgICAgICAgICAgLy8gRm9sZGFibGUgbGluZSA9IHRvbyBsb25nLCBhbmQgbm90IG1vcmUtaW5kZW50ZWQuXG4gICAgICAgICAgICAoaSAtIHByZXZpb3VzTGluZUJyZWFrIC0gMSA+IGxpbmVXaWR0aCAmJlxuICAgICAgICAgICAgIHN0cmluZ1twcmV2aW91c0xpbmVCcmVhayArIDFdICE9PSAnICcpO1xuICAgICAgICAgIHByZXZpb3VzTGluZUJyZWFrID0gaTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaXNQcmludGFibGUoY2hhcikpIHtcbiAgICAgICAgcmV0dXJuIFNUWUxFX0RPVUJMRTtcbiAgICAgIH1cbiAgICAgIHByZXZfY2hhciA9IGkgPiAwID8gc3RyaW5nLmNoYXJDb2RlQXQoaSAtIDEpIDogbnVsbDtcbiAgICAgIHBsYWluID0gcGxhaW4gJiYgaXNQbGFpblNhZmUoY2hhciwgcHJldl9jaGFyKTtcbiAgICB9XG4gICAgLy8gaW4gY2FzZSB0aGUgZW5kIGlzIG1pc3NpbmcgYSBcXG5cbiAgICBoYXNGb2xkYWJsZUxpbmUgPSBoYXNGb2xkYWJsZUxpbmUgfHwgKHNob3VsZFRyYWNrV2lkdGggJiZcbiAgICAgIChpIC0gcHJldmlvdXNMaW5lQnJlYWsgLSAxID4gbGluZVdpZHRoICYmXG4gICAgICAgc3RyaW5nW3ByZXZpb3VzTGluZUJyZWFrICsgMV0gIT09ICcgJykpO1xuICB9XG4gIC8vIEFsdGhvdWdoIGV2ZXJ5IHN0eWxlIGNhbiByZXByZXNlbnQgXFxuIHdpdGhvdXQgZXNjYXBpbmcsIHByZWZlciBibG9jayBzdHlsZXNcbiAgLy8gZm9yIG11bHRpbGluZSwgc2luY2UgdGhleSdyZSBtb3JlIHJlYWRhYmxlIGFuZCB0aGV5IGRvbid0IGFkZCBlbXB0eSBsaW5lcy5cbiAgLy8gQWxzbyBwcmVmZXIgZm9sZGluZyBhIHN1cGVyLWxvbmcgbGluZS5cbiAgaWYgKCFoYXNMaW5lQnJlYWsgJiYgIWhhc0ZvbGRhYmxlTGluZSkge1xuICAgIC8vIFN0cmluZ3MgaW50ZXJwcmV0YWJsZSBhcyBhbm90aGVyIHR5cGUgaGF2ZSB0byBiZSBxdW90ZWQ7XG4gICAgLy8gZS5nLiB0aGUgc3RyaW5nICd0cnVlJyB2cy4gdGhlIGJvb2xlYW4gdHJ1ZS5cbiAgICByZXR1cm4gcGxhaW4gJiYgIXRlc3RBbWJpZ3VvdXNUeXBlKHN0cmluZylcbiAgICAgID8gU1RZTEVfUExBSU4gOiBTVFlMRV9TSU5HTEU7XG4gIH1cbiAgLy8gRWRnZSBjYXNlOiBibG9jayBpbmRlbnRhdGlvbiBpbmRpY2F0b3IgY2FuIG9ubHkgaGF2ZSBvbmUgZGlnaXQuXG4gIGlmIChpbmRlbnRQZXJMZXZlbCA+IDkgJiYgbmVlZEluZGVudEluZGljYXRvcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIFNUWUxFX0RPVUJMRTtcbiAgfVxuICAvLyBBdCB0aGlzIHBvaW50IHdlIGtub3cgYmxvY2sgc3R5bGVzIGFyZSB2YWxpZC5cbiAgLy8gUHJlZmVyIGxpdGVyYWwgc3R5bGUgdW5sZXNzIHdlIHdhbnQgdG8gZm9sZC5cbiAgcmV0dXJuIGhhc0ZvbGRhYmxlTGluZSA/IFNUWUxFX0ZPTERFRCA6IFNUWUxFX0xJVEVSQUw7XG59XG5cbi8vIE5vdGU6IGxpbmUgYnJlYWtpbmcvZm9sZGluZyBpcyBpbXBsZW1lbnRlZCBmb3Igb25seSB0aGUgZm9sZGVkIHN0eWxlLlxuLy8gTkIuIFdlIGRyb3AgdGhlIGxhc3QgdHJhaWxpbmcgbmV3bGluZSAoaWYgYW55KSBvZiBhIHJldHVybmVkIGJsb2NrIHNjYWxhclxuLy8gIHNpbmNlIHRoZSBkdW1wZXIgYWRkcyBpdHMgb3duIG5ld2xpbmUuIFRoaXMgYWx3YXlzIHdvcmtzOlxuLy8gICAgXHUyMDIyIE5vIGVuZGluZyBuZXdsaW5lID0+IHVuYWZmZWN0ZWQ7IGFscmVhZHkgdXNpbmcgc3RyaXAgXCItXCIgY2hvbXBpbmcuXG4vLyAgICBcdTIwMjIgRW5kaW5nIG5ld2xpbmUgICAgPT4gcmVtb3ZlZCB0aGVuIHJlc3RvcmVkLlxuLy8gIEltcG9ydGFudGx5LCB0aGlzIGtlZXBzIHRoZSBcIitcIiBjaG9tcCBpbmRpY2F0b3IgZnJvbSBnYWluaW5nIGFuIGV4dHJhIGxpbmUuXG5mdW5jdGlvbiB3cml0ZVNjYWxhcihzdGF0ZSwgc3RyaW5nLCBsZXZlbCwgaXNrZXkpIHtcbiAgc3RhdGUuZHVtcCA9IChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHN0cmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBcIicnXCI7XG4gICAgfVxuICAgIGlmICghc3RhdGUubm9Db21wYXRNb2RlICYmXG4gICAgICAgIERFUFJFQ0FURURfQk9PTEVBTlNfU1lOVEFYLmluZGV4T2Yoc3RyaW5nKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBcIidcIiArIHN0cmluZyArIFwiJ1wiO1xuICAgIH1cblxuICAgIHZhciBpbmRlbnQgPSBzdGF0ZS5pbmRlbnQgKiBNYXRoLm1heCgxLCBsZXZlbCk7IC8vIG5vIDAtaW5kZW50IHNjYWxhcnNcbiAgICAvLyBBcyBpbmRlbnRhdGlvbiBnZXRzIGRlZXBlciwgbGV0IHRoZSB3aWR0aCBkZWNyZWFzZSBtb25vdG9uaWNhbGx5XG4gICAgLy8gdG8gdGhlIGxvd2VyIGJvdW5kIG1pbihzdGF0ZS5saW5lV2lkdGgsIDQwKS5cbiAgICAvLyBOb3RlIHRoYXQgdGhpcyBpbXBsaWVzXG4gICAgLy8gIHN0YXRlLmxpbmVXaWR0aCBcdTIyNjQgNDAgKyBzdGF0ZS5pbmRlbnQ6IHdpZHRoIGlzIGZpeGVkIGF0IHRoZSBsb3dlciBib3VuZC5cbiAgICAvLyAgc3RhdGUubGluZVdpZHRoID4gNDAgKyBzdGF0ZS5pbmRlbnQ6IHdpZHRoIGRlY3JlYXNlcyB1bnRpbCB0aGUgbG93ZXIgYm91bmQuXG4gICAgLy8gVGhpcyBiZWhhdmVzIGJldHRlciB0aGFuIGEgY29uc3RhbnQgbWluaW11bSB3aWR0aCB3aGljaCBkaXNhbGxvd3MgbmFycm93ZXIgb3B0aW9ucyxcbiAgICAvLyBvciBhbiBpbmRlbnQgdGhyZXNob2xkIHdoaWNoIGNhdXNlcyB0aGUgd2lkdGggdG8gc3VkZGVubHkgaW5jcmVhc2UuXG4gICAgdmFyIGxpbmVXaWR0aCA9IHN0YXRlLmxpbmVXaWR0aCA9PT0gLTFcbiAgICAgID8gLTEgOiBNYXRoLm1heChNYXRoLm1pbihzdGF0ZS5saW5lV2lkdGgsIDQwKSwgc3RhdGUubGluZVdpZHRoIC0gaW5kZW50KTtcblxuICAgIC8vIFdpdGhvdXQga25vd2luZyBpZiBrZXlzIGFyZSBpbXBsaWNpdC9leHBsaWNpdCwgYXNzdW1lIGltcGxpY2l0IGZvciBzYWZldHkuXG4gICAgdmFyIHNpbmdsZUxpbmVPbmx5ID0gaXNrZXlcbiAgICAgIC8vIE5vIGJsb2NrIHN0eWxlcyBpbiBmbG93IG1vZGUuXG4gICAgICB8fCAoc3RhdGUuZmxvd0xldmVsID4gLTEgJiYgbGV2ZWwgPj0gc3RhdGUuZmxvd0xldmVsKTtcbiAgICBmdW5jdGlvbiB0ZXN0QW1iaWd1aXR5KHN0cmluZykge1xuICAgICAgcmV0dXJuIHRlc3RJbXBsaWNpdFJlc29sdmluZyhzdGF0ZSwgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNob29zZVNjYWxhclN0eWxlKHN0cmluZywgc2luZ2xlTGluZU9ubHksIHN0YXRlLmluZGVudCwgbGluZVdpZHRoLCB0ZXN0QW1iaWd1aXR5KSkge1xuICAgICAgY2FzZSBTVFlMRV9QTEFJTjpcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIGNhc2UgU1RZTEVfU0lOR0xFOlxuICAgICAgICByZXR1cm4gXCInXCIgKyBzdHJpbmcucmVwbGFjZSgvJy9nLCBcIicnXCIpICsgXCInXCI7XG4gICAgICBjYXNlIFNUWUxFX0xJVEVSQUw6XG4gICAgICAgIHJldHVybiAnfCcgKyBibG9ja0hlYWRlcihzdHJpbmcsIHN0YXRlLmluZGVudClcbiAgICAgICAgICArIGRyb3BFbmRpbmdOZXdsaW5lKGluZGVudFN0cmluZyhzdHJpbmcsIGluZGVudCkpO1xuICAgICAgY2FzZSBTVFlMRV9GT0xERUQ6XG4gICAgICAgIHJldHVybiAnPicgKyBibG9ja0hlYWRlcihzdHJpbmcsIHN0YXRlLmluZGVudClcbiAgICAgICAgICArIGRyb3BFbmRpbmdOZXdsaW5lKGluZGVudFN0cmluZyhmb2xkU3RyaW5nKHN0cmluZywgbGluZVdpZHRoKSwgaW5kZW50KSk7XG4gICAgICBjYXNlIFNUWUxFX0RPVUJMRTpcbiAgICAgICAgcmV0dXJuICdcIicgKyBlc2NhcGVTdHJpbmcoc3RyaW5nLCBsaW5lV2lkdGgpICsgJ1wiJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdpbXBvc3NpYmxlIGVycm9yOiBpbnZhbGlkIHNjYWxhciBzdHlsZScpO1xuICAgIH1cbiAgfSgpKTtcbn1cblxuLy8gUHJlLWNvbmRpdGlvbnM6IHN0cmluZyBpcyB2YWxpZCBmb3IgYSBibG9jayBzY2FsYXIsIDEgPD0gaW5kZW50UGVyTGV2ZWwgPD0gOS5cbmZ1bmN0aW9uIGJsb2NrSGVhZGVyKHN0cmluZywgaW5kZW50UGVyTGV2ZWwpIHtcbiAgdmFyIGluZGVudEluZGljYXRvciA9IG5lZWRJbmRlbnRJbmRpY2F0b3Ioc3RyaW5nKSA/IFN0cmluZyhpbmRlbnRQZXJMZXZlbCkgOiAnJztcblxuICAvLyBub3RlIHRoZSBzcGVjaWFsIGNhc2U6IHRoZSBzdHJpbmcgJ1xcbicgY291bnRzIGFzIGEgXCJ0cmFpbGluZ1wiIGVtcHR5IGxpbmUuXG4gIHZhciBjbGlwID0gICAgICAgICAgc3RyaW5nW3N0cmluZy5sZW5ndGggLSAxXSA9PT0gJ1xcbic7XG4gIHZhciBrZWVwID0gY2xpcCAmJiAoc3RyaW5nW3N0cmluZy5sZW5ndGggLSAyXSA9PT0gJ1xcbicgfHwgc3RyaW5nID09PSAnXFxuJyk7XG4gIHZhciBjaG9tcCA9IGtlZXAgPyAnKycgOiAoY2xpcCA/ICcnIDogJy0nKTtcblxuICByZXR1cm4gaW5kZW50SW5kaWNhdG9yICsgY2hvbXAgKyAnXFxuJztcbn1cblxuLy8gKFNlZSB0aGUgbm90ZSBmb3Igd3JpdGVTY2FsYXIuKVxuZnVuY3Rpb24gZHJvcEVuZGluZ05ld2xpbmUoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmdbc3RyaW5nLmxlbmd0aCAtIDFdID09PSAnXFxuJyA/IHN0cmluZy5zbGljZSgwLCAtMSkgOiBzdHJpbmc7XG59XG5cbi8vIE5vdGU6IGEgbG9uZyBsaW5lIHdpdGhvdXQgYSBzdWl0YWJsZSBicmVhayBwb2ludCB3aWxsIGV4Y2VlZCB0aGUgd2lkdGggbGltaXQuXG4vLyBQcmUtY29uZGl0aW9uczogZXZlcnkgY2hhciBpbiBzdHIgaXNQcmludGFibGUsIHN0ci5sZW5ndGggPiAwLCB3aWR0aCA+IDAuXG5mdW5jdGlvbiBmb2xkU3RyaW5nKHN0cmluZywgd2lkdGgpIHtcbiAgLy8gSW4gZm9sZGVkIHN0eWxlLCAkayQgY29uc2VjdXRpdmUgbmV3bGluZXMgb3V0cHV0IGFzICRrKzEkIG5ld2xpbmVzXHUyMDE0XG4gIC8vIHVubGVzcyB0aGV5J3JlIGJlZm9yZSBvciBhZnRlciBhIG1vcmUtaW5kZW50ZWQgbGluZSwgb3IgYXQgdGhlIHZlcnlcbiAgLy8gYmVnaW5uaW5nIG9yIGVuZCwgaW4gd2hpY2ggY2FzZSAkayQgbWFwcyB0byAkayQuXG4gIC8vIFRoZXJlZm9yZSwgcGFyc2UgZWFjaCBjaHVuayBhcyBuZXdsaW5lKHMpIGZvbGxvd2VkIGJ5IGEgY29udGVudCBsaW5lLlxuICB2YXIgbGluZVJlID0gLyhcXG4rKShbXlxcbl0qKS9nO1xuXG4gIC8vIGZpcnN0IGxpbmUgKHBvc3NpYmx5IGFuIGVtcHR5IGxpbmUpXG4gIHZhciByZXN1bHQgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBuZXh0TEYgPSBzdHJpbmcuaW5kZXhPZignXFxuJyk7XG4gICAgbmV4dExGID0gbmV4dExGICE9PSAtMSA/IG5leHRMRiA6IHN0cmluZy5sZW5ndGg7XG4gICAgbGluZVJlLmxhc3RJbmRleCA9IG5leHRMRjtcbiAgICByZXR1cm4gZm9sZExpbmUoc3RyaW5nLnNsaWNlKDAsIG5leHRMRiksIHdpZHRoKTtcbiAgfSgpKTtcbiAgLy8gSWYgd2UgaGF2ZW4ndCByZWFjaGVkIHRoZSBmaXJzdCBjb250ZW50IGxpbmUgeWV0LCBkb24ndCBhZGQgYW4gZXh0cmEgXFxuLlxuICB2YXIgcHJldk1vcmVJbmRlbnRlZCA9IHN0cmluZ1swXSA9PT0gJ1xcbicgfHwgc3RyaW5nWzBdID09PSAnICc7XG4gIHZhciBtb3JlSW5kZW50ZWQ7XG5cbiAgLy8gcmVzdCBvZiB0aGUgbGluZXNcbiAgdmFyIG1hdGNoO1xuICB3aGlsZSAoKG1hdGNoID0gbGluZVJlLmV4ZWMoc3RyaW5nKSkpIHtcbiAgICB2YXIgcHJlZml4ID0gbWF0Y2hbMV0sIGxpbmUgPSBtYXRjaFsyXTtcbiAgICBtb3JlSW5kZW50ZWQgPSAobGluZVswXSA9PT0gJyAnKTtcbiAgICByZXN1bHQgKz0gcHJlZml4XG4gICAgICArICghcHJldk1vcmVJbmRlbnRlZCAmJiAhbW9yZUluZGVudGVkICYmIGxpbmUgIT09ICcnXG4gICAgICAgID8gJ1xcbicgOiAnJylcbiAgICAgICsgZm9sZExpbmUobGluZSwgd2lkdGgpO1xuICAgIHByZXZNb3JlSW5kZW50ZWQgPSBtb3JlSW5kZW50ZWQ7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBHcmVlZHkgbGluZSBicmVha2luZy5cbi8vIFBpY2tzIHRoZSBsb25nZXN0IGxpbmUgdW5kZXIgdGhlIGxpbWl0IGVhY2ggdGltZSxcbi8vIG90aGVyd2lzZSBzZXR0bGVzIGZvciB0aGUgc2hvcnRlc3QgbGluZSBvdmVyIHRoZSBsaW1pdC5cbi8vIE5CLiBNb3JlLWluZGVudGVkIGxpbmVzICpjYW5ub3QqIGJlIGZvbGRlZCwgYXMgdGhhdCB3b3VsZCBhZGQgYW4gZXh0cmEgXFxuLlxuZnVuY3Rpb24gZm9sZExpbmUobGluZSwgd2lkdGgpIHtcbiAgaWYgKGxpbmUgPT09ICcnIHx8IGxpbmVbMF0gPT09ICcgJykgcmV0dXJuIGxpbmU7XG5cbiAgLy8gU2luY2UgYSBtb3JlLWluZGVudGVkIGxpbmUgYWRkcyBhIFxcbiwgYnJlYWtzIGNhbid0IGJlIGZvbGxvd2VkIGJ5IGEgc3BhY2UuXG4gIHZhciBicmVha1JlID0gLyBbXiBdL2c7IC8vIG5vdGU6IHRoZSBtYXRjaCBpbmRleCB3aWxsIGFsd2F5cyBiZSA8PSBsZW5ndGgtMi5cbiAgdmFyIG1hdGNoO1xuICAvLyBzdGFydCBpcyBhbiBpbmNsdXNpdmUgaW5kZXguIGVuZCwgY3VyciwgYW5kIG5leHQgYXJlIGV4Y2x1c2l2ZS5cbiAgdmFyIHN0YXJ0ID0gMCwgZW5kLCBjdXJyID0gMCwgbmV4dCA9IDA7XG4gIHZhciByZXN1bHQgPSAnJztcblxuICAvLyBJbnZhcmlhbnRzOiAwIDw9IHN0YXJ0IDw9IGxlbmd0aC0xLlxuICAvLyAgIDAgPD0gY3VyciA8PSBuZXh0IDw9IG1heCgwLCBsZW5ndGgtMikuIGN1cnIgLSBzdGFydCA8PSB3aWR0aC5cbiAgLy8gSW5zaWRlIHRoZSBsb29wOlxuICAvLyAgIEEgbWF0Y2ggaW1wbGllcyBsZW5ndGggPj0gMiwgc28gY3VyciBhbmQgbmV4dCBhcmUgPD0gbGVuZ3RoLTIuXG4gIHdoaWxlICgobWF0Y2ggPSBicmVha1JlLmV4ZWMobGluZSkpKSB7XG4gICAgbmV4dCA9IG1hdGNoLmluZGV4O1xuICAgIC8vIG1haW50YWluIGludmFyaWFudDogY3VyciAtIHN0YXJ0IDw9IHdpZHRoXG4gICAgaWYgKG5leHQgLSBzdGFydCA+IHdpZHRoKSB7XG4gICAgICBlbmQgPSAoY3VyciA+IHN0YXJ0KSA/IGN1cnIgOiBuZXh0OyAvLyBkZXJpdmUgZW5kIDw9IGxlbmd0aC0yXG4gICAgICByZXN1bHQgKz0gJ1xcbicgKyBsaW5lLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgLy8gc2tpcCB0aGUgc3BhY2UgdGhhdCB3YXMgb3V0cHV0IGFzIFxcblxuICAgICAgc3RhcnQgPSBlbmQgKyAxOyAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlIHN0YXJ0IDw9IGxlbmd0aC0xXG4gICAgfVxuICAgIGN1cnIgPSBuZXh0O1xuICB9XG5cbiAgLy8gQnkgdGhlIGludmFyaWFudHMsIHN0YXJ0IDw9IGxlbmd0aC0xLCBzbyB0aGVyZSBpcyBzb21ldGhpbmcgbGVmdCBvdmVyLlxuICAvLyBJdCBpcyBlaXRoZXIgdGhlIHdob2xlIHN0cmluZyBvciBhIHBhcnQgc3RhcnRpbmcgZnJvbSBub24td2hpdGVzcGFjZS5cbiAgcmVzdWx0ICs9ICdcXG4nO1xuICAvLyBJbnNlcnQgYSBicmVhayBpZiB0aGUgcmVtYWluZGVyIGlzIHRvbyBsb25nIGFuZCB0aGVyZSBpcyBhIGJyZWFrIGF2YWlsYWJsZS5cbiAgaWYgKGxpbmUubGVuZ3RoIC0gc3RhcnQgPiB3aWR0aCAmJiBjdXJyID4gc3RhcnQpIHtcbiAgICByZXN1bHQgKz0gbGluZS5zbGljZShzdGFydCwgY3VycikgKyAnXFxuJyArIGxpbmUuc2xpY2UoY3VyciArIDEpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCArPSBsaW5lLnNsaWNlKHN0YXJ0KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQuc2xpY2UoMSk7IC8vIGRyb3AgZXh0cmEgXFxuIGpvaW5lclxufVxuXG4vLyBFc2NhcGVzIGEgZG91YmxlLXF1b3RlZCBzdHJpbmcuXG5mdW5jdGlvbiBlc2NhcGVTdHJpbmcoc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgdmFyIGNoYXIsIG5leHRDaGFyO1xuICB2YXIgZXNjYXBlU2VxO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhciA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgIC8vIENoZWNrIGZvciBzdXJyb2dhdGUgcGFpcnMgKHJlZmVyZW5jZSBVbmljb2RlIDMuMCBzZWN0aW9uIFwiMy43IFN1cnJvZ2F0ZXNcIikuXG4gICAgaWYgKGNoYXIgPj0gMHhEODAwICYmIGNoYXIgPD0gMHhEQkZGLyogaGlnaCBzdXJyb2dhdGUgKi8pIHtcbiAgICAgIG5leHRDaGFyID0gc3RyaW5nLmNoYXJDb2RlQXQoaSArIDEpO1xuICAgICAgaWYgKG5leHRDaGFyID49IDB4REMwMCAmJiBuZXh0Q2hhciA8PSAweERGRkYvKiBsb3cgc3Vycm9nYXRlICovKSB7XG4gICAgICAgIC8vIENvbWJpbmUgdGhlIHN1cnJvZ2F0ZSBwYWlyIGFuZCBzdG9yZSBpdCBlc2NhcGVkLlxuICAgICAgICByZXN1bHQgKz0gZW5jb2RlSGV4KChjaGFyIC0gMHhEODAwKSAqIDB4NDAwICsgbmV4dENoYXIgLSAweERDMDAgKyAweDEwMDAwKTtcbiAgICAgICAgLy8gQWR2YW5jZSBpbmRleCBvbmUgZXh0cmEgc2luY2Ugd2UgYWxyZWFkeSB1c2VkIHRoYXQgY2hhciBoZXJlLlxuICAgICAgICBpKys7IGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBlc2NhcGVTZXEgPSBFU0NBUEVfU0VRVUVOQ0VTW2NoYXJdO1xuICAgIHJlc3VsdCArPSAhZXNjYXBlU2VxICYmIGlzUHJpbnRhYmxlKGNoYXIpXG4gICAgICA/IHN0cmluZ1tpXVxuICAgICAgOiBlc2NhcGVTZXEgfHwgZW5jb2RlSGV4KGNoYXIpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG93U2VxdWVuY2Uoc3RhdGUsIGxldmVsLCBvYmplY3QpIHtcbiAgdmFyIF9yZXN1bHQgPSAnJyxcbiAgICAgIF90YWcgICAgPSBzdGF0ZS50YWcsXG4gICAgICBpbmRleCxcbiAgICAgIGxlbmd0aDtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAvLyBXcml0ZSBvbmx5IHZhbGlkIGVsZW1lbnRzLlxuICAgIGlmICh3cml0ZU5vZGUoc3RhdGUsIGxldmVsLCBvYmplY3RbaW5kZXhdLCBmYWxzZSwgZmFsc2UpKSB7XG4gICAgICBpZiAoaW5kZXggIT09IDApIF9yZXN1bHQgKz0gJywnICsgKCFzdGF0ZS5jb25kZW5zZUZsb3cgPyAnICcgOiAnJyk7XG4gICAgICBfcmVzdWx0ICs9IHN0YXRlLmR1bXA7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUudGFnID0gX3RhZztcbiAgc3RhdGUuZHVtcCA9ICdbJyArIF9yZXN1bHQgKyAnXSc7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQmxvY2tTZXF1ZW5jZShzdGF0ZSwgbGV2ZWwsIG9iamVjdCwgY29tcGFjdCkge1xuICB2YXIgX3Jlc3VsdCA9ICcnLFxuICAgICAgX3RhZyAgICA9IHN0YXRlLnRhZyxcbiAgICAgIGluZGV4LFxuICAgICAgbGVuZ3RoO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIC8vIFdyaXRlIG9ubHkgdmFsaWQgZWxlbWVudHMuXG4gICAgaWYgKHdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwgKyAxLCBvYmplY3RbaW5kZXhdLCB0cnVlLCB0cnVlKSkge1xuICAgICAgaWYgKCFjb21wYWN0IHx8IGluZGV4ICE9PSAwKSB7XG4gICAgICAgIF9yZXN1bHQgKz0gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZSwgbGV2ZWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUuZHVtcCAmJiBDSEFSX0xJTkVfRkVFRCA9PT0gc3RhdGUuZHVtcC5jaGFyQ29kZUF0KDApKSB7XG4gICAgICAgIF9yZXN1bHQgKz0gJy0nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3Jlc3VsdCArPSAnLSAnO1xuICAgICAgfVxuXG4gICAgICBfcmVzdWx0ICs9IHN0YXRlLmR1bXA7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUudGFnID0gX3RhZztcbiAgc3RhdGUuZHVtcCA9IF9yZXN1bHQgfHwgJ1tdJzsgLy8gRW1wdHkgc2VxdWVuY2UgaWYgbm8gdmFsaWQgdmFsdWVzLlxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb3dNYXBwaW5nKHN0YXRlLCBsZXZlbCwgb2JqZWN0KSB7XG4gIHZhciBfcmVzdWx0ICAgICAgID0gJycsXG4gICAgICBfdGFnICAgICAgICAgID0gc3RhdGUudGFnLFxuICAgICAgb2JqZWN0S2V5TGlzdCA9IE9iamVjdC5rZXlzKG9iamVjdCksXG4gICAgICBpbmRleCxcbiAgICAgIGxlbmd0aCxcbiAgICAgIG9iamVjdEtleSxcbiAgICAgIG9iamVjdFZhbHVlLFxuICAgICAgcGFpckJ1ZmZlcjtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0S2V5TGlzdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG5cbiAgICBwYWlyQnVmZmVyID0gJyc7XG4gICAgaWYgKGluZGV4ICE9PSAwKSBwYWlyQnVmZmVyICs9ICcsICc7XG5cbiAgICBpZiAoc3RhdGUuY29uZGVuc2VGbG93KSBwYWlyQnVmZmVyICs9ICdcIic7XG5cbiAgICBvYmplY3RLZXkgPSBvYmplY3RLZXlMaXN0W2luZGV4XTtcbiAgICBvYmplY3RWYWx1ZSA9IG9iamVjdFtvYmplY3RLZXldO1xuXG4gICAgaWYgKCF3cml0ZU5vZGUoc3RhdGUsIGxldmVsLCBvYmplY3RLZXksIGZhbHNlLCBmYWxzZSkpIHtcbiAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIHRoaXMgcGFpciBiZWNhdXNlIG9mIGludmFsaWQga2V5O1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5kdW1wLmxlbmd0aCA+IDEwMjQpIHBhaXJCdWZmZXIgKz0gJz8gJztcblxuICAgIHBhaXJCdWZmZXIgKz0gc3RhdGUuZHVtcCArIChzdGF0ZS5jb25kZW5zZUZsb3cgPyAnXCInIDogJycpICsgJzonICsgKHN0YXRlLmNvbmRlbnNlRmxvdyA/ICcnIDogJyAnKTtcblxuICAgIGlmICghd3JpdGVOb2RlKHN0YXRlLCBsZXZlbCwgb2JqZWN0VmFsdWUsIGZhbHNlLCBmYWxzZSkpIHtcbiAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIHRoaXMgcGFpciBiZWNhdXNlIG9mIGludmFsaWQgdmFsdWUuXG4gICAgfVxuXG4gICAgcGFpckJ1ZmZlciArPSBzdGF0ZS5kdW1wO1xuXG4gICAgLy8gQm90aCBrZXkgYW5kIHZhbHVlIGFyZSB2YWxpZC5cbiAgICBfcmVzdWx0ICs9IHBhaXJCdWZmZXI7XG4gIH1cblxuICBzdGF0ZS50YWcgPSBfdGFnO1xuICBzdGF0ZS5kdW1wID0gJ3snICsgX3Jlc3VsdCArICd9Jztcbn1cblxuZnVuY3Rpb24gd3JpdGVCbG9ja01hcHBpbmcoc3RhdGUsIGxldmVsLCBvYmplY3QsIGNvbXBhY3QpIHtcbiAgdmFyIF9yZXN1bHQgICAgICAgPSAnJyxcbiAgICAgIF90YWcgICAgICAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBvYmplY3RLZXlMaXN0ID0gT2JqZWN0LmtleXMob2JqZWN0KSxcbiAgICAgIGluZGV4LFxuICAgICAgbGVuZ3RoLFxuICAgICAgb2JqZWN0S2V5LFxuICAgICAgb2JqZWN0VmFsdWUsXG4gICAgICBleHBsaWNpdFBhaXIsXG4gICAgICBwYWlyQnVmZmVyO1xuXG4gIC8vIEFsbG93IHNvcnRpbmcga2V5cyBzbyB0aGF0IHRoZSBvdXRwdXQgZmlsZSBpcyBkZXRlcm1pbmlzdGljXG4gIGlmIChzdGF0ZS5zb3J0S2V5cyA9PT0gdHJ1ZSkge1xuICAgIC8vIERlZmF1bHQgc29ydGluZ1xuICAgIG9iamVjdEtleUxpc3Quc29ydCgpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzdGF0ZS5zb3J0S2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIEN1c3RvbSBzb3J0IGZ1bmN0aW9uXG4gICAgb2JqZWN0S2V5TGlzdC5zb3J0KHN0YXRlLnNvcnRLZXlzKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5zb3J0S2V5cykge1xuICAgIC8vIFNvbWV0aGluZyBpcyB3cm9uZ1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdzb3J0S2V5cyBtdXN0IGJlIGEgYm9vbGVhbiBvciBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0S2V5TGlzdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpckJ1ZmZlciA9ICcnO1xuXG4gICAgaWYgKCFjb21wYWN0IHx8IGluZGV4ICE9PSAwKSB7XG4gICAgICBwYWlyQnVmZmVyICs9IGdlbmVyYXRlTmV4dExpbmUoc3RhdGUsIGxldmVsKTtcbiAgICB9XG5cbiAgICBvYmplY3RLZXkgPSBvYmplY3RLZXlMaXN0W2luZGV4XTtcbiAgICBvYmplY3RWYWx1ZSA9IG9iamVjdFtvYmplY3RLZXldO1xuXG4gICAgaWYgKCF3cml0ZU5vZGUoc3RhdGUsIGxldmVsICsgMSwgb2JqZWN0S2V5LCB0cnVlLCB0cnVlLCB0cnVlKSkge1xuICAgICAgY29udGludWU7IC8vIFNraXAgdGhpcyBwYWlyIGJlY2F1c2Ugb2YgaW52YWxpZCBrZXkuXG4gICAgfVxuXG4gICAgZXhwbGljaXRQYWlyID0gKHN0YXRlLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZS50YWcgIT09ICc/JykgfHxcbiAgICAgICAgICAgICAgICAgICAoc3RhdGUuZHVtcCAmJiBzdGF0ZS5kdW1wLmxlbmd0aCA+IDEwMjQpO1xuXG4gICAgaWYgKGV4cGxpY2l0UGFpcikge1xuICAgICAgaWYgKHN0YXRlLmR1bXAgJiYgQ0hBUl9MSU5FX0ZFRUQgPT09IHN0YXRlLmR1bXAuY2hhckNvZGVBdCgwKSkge1xuICAgICAgICBwYWlyQnVmZmVyICs9ICc/JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhaXJCdWZmZXIgKz0gJz8gJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYWlyQnVmZmVyICs9IHN0YXRlLmR1bXA7XG5cbiAgICBpZiAoZXhwbGljaXRQYWlyKSB7XG4gICAgICBwYWlyQnVmZmVyICs9IGdlbmVyYXRlTmV4dExpbmUoc3RhdGUsIGxldmVsKTtcbiAgICB9XG5cbiAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwgKyAxLCBvYmplY3RWYWx1ZSwgdHJ1ZSwgZXhwbGljaXRQYWlyKSkge1xuICAgICAgY29udGludWU7IC8vIFNraXAgdGhpcyBwYWlyIGJlY2F1c2Ugb2YgaW52YWxpZCB2YWx1ZS5cbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuZHVtcCAmJiBDSEFSX0xJTkVfRkVFRCA9PT0gc3RhdGUuZHVtcC5jaGFyQ29kZUF0KDApKSB7XG4gICAgICBwYWlyQnVmZmVyICs9ICc6JztcbiAgICB9IGVsc2Uge1xuICAgICAgcGFpckJ1ZmZlciArPSAnOiAnO1xuICAgIH1cblxuICAgIHBhaXJCdWZmZXIgKz0gc3RhdGUuZHVtcDtcblxuICAgIC8vIEJvdGgga2V5IGFuZCB2YWx1ZSBhcmUgdmFsaWQuXG4gICAgX3Jlc3VsdCArPSBwYWlyQnVmZmVyO1xuICB9XG5cbiAgc3RhdGUudGFnID0gX3RhZztcbiAgc3RhdGUuZHVtcCA9IF9yZXN1bHQgfHwgJ3t9JzsgLy8gRW1wdHkgbWFwcGluZyBpZiBubyB2YWxpZCBwYWlycy5cbn1cblxuZnVuY3Rpb24gZGV0ZWN0VHlwZShzdGF0ZSwgb2JqZWN0LCBleHBsaWNpdCkge1xuICB2YXIgX3Jlc3VsdCwgdHlwZUxpc3QsIGluZGV4LCBsZW5ndGgsIHR5cGUsIHN0eWxlO1xuXG4gIHR5cGVMaXN0ID0gZXhwbGljaXQgPyBzdGF0ZS5leHBsaWNpdFR5cGVzIDogc3RhdGUuaW1wbGljaXRUeXBlcztcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gdHlwZUxpc3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHR5cGUgPSB0eXBlTGlzdFtpbmRleF07XG5cbiAgICBpZiAoKHR5cGUuaW5zdGFuY2VPZiAgfHwgdHlwZS5wcmVkaWNhdGUpICYmXG4gICAgICAgICghdHlwZS5pbnN0YW5jZU9mIHx8ICgodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcpICYmIChvYmplY3QgaW5zdGFuY2VvZiB0eXBlLmluc3RhbmNlT2YpKSkgJiZcbiAgICAgICAgKCF0eXBlLnByZWRpY2F0ZSAgfHwgdHlwZS5wcmVkaWNhdGUob2JqZWN0KSkpIHtcblxuICAgICAgc3RhdGUudGFnID0gZXhwbGljaXQgPyB0eXBlLnRhZyA6ICc/JztcblxuICAgICAgaWYgKHR5cGUucmVwcmVzZW50KSB7XG4gICAgICAgIHN0eWxlID0gc3RhdGUuc3R5bGVNYXBbdHlwZS50YWddIHx8IHR5cGUuZGVmYXVsdFN0eWxlO1xuXG4gICAgICAgIGlmIChfdG9TdHJpbmcuY2FsbCh0eXBlLnJlcHJlc2VudCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScpIHtcbiAgICAgICAgICBfcmVzdWx0ID0gdHlwZS5yZXByZXNlbnQob2JqZWN0LCBzdHlsZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwodHlwZS5yZXByZXNlbnQsIHN0eWxlKSkge1xuICAgICAgICAgIF9yZXN1bHQgPSB0eXBlLnJlcHJlc2VudFtzdHlsZV0ob2JqZWN0LCBzdHlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJyE8JyArIHR5cGUudGFnICsgJz4gdGFnIHJlc29sdmVyIGFjY2VwdHMgbm90IFwiJyArIHN0eWxlICsgJ1wiIHN0eWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5kdW1wID0gX3Jlc3VsdDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBTZXJpYWxpemVzIGBvYmplY3RgIGFuZCB3cml0ZXMgaXQgdG8gZ2xvYmFsIGByZXN1bHRgLlxuLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG9yIGZhbHNlIG9uIGludmFsaWQgb2JqZWN0LlxuLy9cbmZ1bmN0aW9uIHdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwsIG9iamVjdCwgYmxvY2ssIGNvbXBhY3QsIGlza2V5KSB7XG4gIHN0YXRlLnRhZyA9IG51bGw7XG4gIHN0YXRlLmR1bXAgPSBvYmplY3Q7XG5cbiAgaWYgKCFkZXRlY3RUeXBlKHN0YXRlLCBvYmplY3QsIGZhbHNlKSkge1xuICAgIGRldGVjdFR5cGUoc3RhdGUsIG9iamVjdCwgdHJ1ZSk7XG4gIH1cblxuICB2YXIgdHlwZSA9IF90b1N0cmluZy5jYWxsKHN0YXRlLmR1bXApO1xuXG4gIGlmIChibG9jaykge1xuICAgIGJsb2NrID0gKHN0YXRlLmZsb3dMZXZlbCA8IDAgfHwgc3RhdGUuZmxvd0xldmVsID4gbGV2ZWwpO1xuICB9XG5cbiAgdmFyIG9iamVjdE9yQXJyYXkgPSB0eXBlID09PSAnW29iamVjdCBPYmplY3RdJyB8fCB0eXBlID09PSAnW29iamVjdCBBcnJheV0nLFxuICAgICAgZHVwbGljYXRlSW5kZXgsXG4gICAgICBkdXBsaWNhdGU7XG5cbiAgaWYgKG9iamVjdE9yQXJyYXkpIHtcbiAgICBkdXBsaWNhdGVJbmRleCA9IHN0YXRlLmR1cGxpY2F0ZXMuaW5kZXhPZihvYmplY3QpO1xuICAgIGR1cGxpY2F0ZSA9IGR1cGxpY2F0ZUluZGV4ICE9PSAtMTtcbiAgfVxuXG4gIGlmICgoc3RhdGUudGFnICE9PSBudWxsICYmIHN0YXRlLnRhZyAhPT0gJz8nKSB8fCBkdXBsaWNhdGUgfHwgKHN0YXRlLmluZGVudCAhPT0gMiAmJiBsZXZlbCA+IDApKSB7XG4gICAgY29tcGFjdCA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKGR1cGxpY2F0ZSAmJiBzdGF0ZS51c2VkRHVwbGljYXRlc1tkdXBsaWNhdGVJbmRleF0pIHtcbiAgICBzdGF0ZS5kdW1wID0gJypyZWZfJyArIGR1cGxpY2F0ZUluZGV4O1xuICB9IGVsc2Uge1xuICAgIGlmIChvYmplY3RPckFycmF5ICYmIGR1cGxpY2F0ZSAmJiAhc3RhdGUudXNlZER1cGxpY2F0ZXNbZHVwbGljYXRlSW5kZXhdKSB7XG4gICAgICBzdGF0ZS51c2VkRHVwbGljYXRlc1tkdXBsaWNhdGVJbmRleF0gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIGlmIChibG9jayAmJiAoT2JqZWN0LmtleXMoc3RhdGUuZHVtcCkubGVuZ3RoICE9PSAwKSkge1xuICAgICAgICB3cml0ZUJsb2NrTWFwcGluZyhzdGF0ZSwgbGV2ZWwsIHN0YXRlLmR1bXAsIGNvbXBhY3QpO1xuICAgICAgICBpZiAoZHVwbGljYXRlKSB7XG4gICAgICAgICAgc3RhdGUuZHVtcCA9ICcmcmVmXycgKyBkdXBsaWNhdGVJbmRleCArIHN0YXRlLmR1bXA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdyaXRlRmxvd01hcHBpbmcoc3RhdGUsIGxldmVsLCBzdGF0ZS5kdW1wKTtcbiAgICAgICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgICAgIHN0YXRlLmR1bXAgPSAnJnJlZl8nICsgZHVwbGljYXRlSW5kZXggKyAnICcgKyBzdGF0ZS5kdW1wO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgICB2YXIgYXJyYXlMZXZlbCA9IChzdGF0ZS5ub0FycmF5SW5kZW50ICYmIChsZXZlbCA+IDApKSA/IGxldmVsIC0gMSA6IGxldmVsO1xuICAgICAgaWYgKGJsb2NrICYmIChzdGF0ZS5kdW1wLmxlbmd0aCAhPT0gMCkpIHtcbiAgICAgICAgd3JpdGVCbG9ja1NlcXVlbmNlKHN0YXRlLCBhcnJheUxldmVsLCBzdGF0ZS5kdW1wLCBjb21wYWN0KTtcbiAgICAgICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgICAgIHN0YXRlLmR1bXAgPSAnJnJlZl8nICsgZHVwbGljYXRlSW5kZXggKyBzdGF0ZS5kdW1wO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3cml0ZUZsb3dTZXF1ZW5jZShzdGF0ZSwgYXJyYXlMZXZlbCwgc3RhdGUuZHVtcCk7XG4gICAgICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgICAgICBzdGF0ZS5kdW1wID0gJyZyZWZfJyArIGR1cGxpY2F0ZUluZGV4ICsgJyAnICsgc3RhdGUuZHVtcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgU3RyaW5nXScpIHtcbiAgICAgIGlmIChzdGF0ZS50YWcgIT09ICc/Jykge1xuICAgICAgICB3cml0ZVNjYWxhcihzdGF0ZSwgc3RhdGUuZHVtcCwgbGV2ZWwsIGlza2V5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRlLnNraXBJbnZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbigndW5hY2NlcHRhYmxlIGtpbmQgb2YgYW4gb2JqZWN0IHRvIGR1bXAgJyArIHR5cGUpO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgJiYgc3RhdGUudGFnICE9PSAnPycpIHtcbiAgICAgIHN0YXRlLmR1bXAgPSAnITwnICsgc3RhdGUudGFnICsgJz4gJyArIHN0YXRlLmR1bXA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldER1cGxpY2F0ZVJlZmVyZW5jZXMob2JqZWN0LCBzdGF0ZSkge1xuICB2YXIgb2JqZWN0cyA9IFtdLFxuICAgICAgZHVwbGljYXRlc0luZGV4ZXMgPSBbXSxcbiAgICAgIGluZGV4LFxuICAgICAgbGVuZ3RoO1xuXG4gIGluc3BlY3ROb2RlKG9iamVjdCwgb2JqZWN0cywgZHVwbGljYXRlc0luZGV4ZXMpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBkdXBsaWNhdGVzSW5kZXhlcy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgc3RhdGUuZHVwbGljYXRlcy5wdXNoKG9iamVjdHNbZHVwbGljYXRlc0luZGV4ZXNbaW5kZXhdXSk7XG4gIH1cbiAgc3RhdGUudXNlZER1cGxpY2F0ZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdE5vZGUob2JqZWN0LCBvYmplY3RzLCBkdXBsaWNhdGVzSW5kZXhlcykge1xuICB2YXIgb2JqZWN0S2V5TGlzdCxcbiAgICAgIGluZGV4LFxuICAgICAgbGVuZ3RoO1xuXG4gIGlmIChvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICBpbmRleCA9IG9iamVjdHMuaW5kZXhPZihvYmplY3QpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGlmIChkdXBsaWNhdGVzSW5kZXhlcy5pbmRleE9mKGluZGV4KSA9PT0gLTEpIHtcbiAgICAgICAgZHVwbGljYXRlc0luZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iamVjdHMucHVzaChvYmplY3QpO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIGluc3BlY3ROb2RlKG9iamVjdFtpbmRleF0sIG9iamVjdHMsIGR1cGxpY2F0ZXNJbmRleGVzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0S2V5TGlzdCA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdEtleUxpc3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIGluc3BlY3ROb2RlKG9iamVjdFtvYmplY3RLZXlMaXN0W2luZGV4XV0sIG9iamVjdHMsIGR1cGxpY2F0ZXNJbmRleGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkdW1wKGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHZhciBzdGF0ZSA9IG5ldyBTdGF0ZShvcHRpb25zKTtcblxuICBpZiAoIXN0YXRlLm5vUmVmcykgZ2V0RHVwbGljYXRlUmVmZXJlbmNlcyhpbnB1dCwgc3RhdGUpO1xuXG4gIGlmICh3cml0ZU5vZGUoc3RhdGUsIDAsIGlucHV0LCB0cnVlLCB0cnVlKSkgcmV0dXJuIHN0YXRlLmR1bXAgKyAnXFxuJztcblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIHNhZmVEdW1wKGlucHV0LCBvcHRpb25zKSB7XG4gIHJldHVybiBkdW1wKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMuZHVtcCAgICAgPSBkdW1wO1xubW9kdWxlLmV4cG9ydHMuc2FmZUR1bXAgPSBzYWZlRHVtcDtcbiIsICIndXNlIHN0cmljdCc7XG5cblxudmFyIGxvYWRlciA9IHJlcXVpcmUoJy4vanMteWFtbC9sb2FkZXInKTtcbnZhciBkdW1wZXIgPSByZXF1aXJlKCcuL2pzLXlhbWwvZHVtcGVyJyk7XG5cblxuZnVuY3Rpb24gZGVwcmVjYXRlZChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiAnICsgbmFtZSArICcgaXMgZGVwcmVjYXRlZCBhbmQgY2Fubm90IGJlIHVzZWQuJyk7XG4gIH07XG59XG5cblxubW9kdWxlLmV4cG9ydHMuVHlwZSAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC90eXBlJyk7XG5tb2R1bGUuZXhwb3J0cy5TY2hlbWEgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYScpO1xubW9kdWxlLmV4cG9ydHMuRkFJTFNBRkVfU0NIRU1BICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZmFpbHNhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkpTT05fU0NIRU1BICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2pzb24nKTtcbm1vZHVsZS5leHBvcnRzLkNPUkVfU0NIRU1BICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2NvcmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9GVUxMX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG5tb2R1bGUuZXhwb3J0cy5sb2FkICAgICAgICAgICAgICAgID0gbG9hZGVyLmxvYWQ7XG5tb2R1bGUuZXhwb3J0cy5sb2FkQWxsICAgICAgICAgICAgID0gbG9hZGVyLmxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZCAgICAgICAgICAgID0gbG9hZGVyLnNhZmVMb2FkO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgICAgICAgICA9IGxvYWRlci5zYWZlTG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLmR1bXAgICAgICAgICAgICAgICAgPSBkdW1wZXIuZHVtcDtcbm1vZHVsZS5leHBvcnRzLnNhZmVEdW1wICAgICAgICAgICAgPSBkdW1wZXIuc2FmZUR1bXA7XG5tb2R1bGUuZXhwb3J0cy5ZQU1MRXhjZXB0aW9uICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL2V4Y2VwdGlvbicpO1xuXG4vLyBEZXByZWNhdGVkIHNjaGVtYSBuYW1lcyBmcm9tIEpTLVlBTUwgMi4wLnhcbm1vZHVsZS5leHBvcnRzLk1JTklNQUxfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuU0FGRV9TQ0hFTUEgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xuXG4vLyBEZXByZWNhdGVkIGZ1bmN0aW9ucyBmcm9tIEpTLVlBTUwgMS54Lnhcbm1vZHVsZS5leHBvcnRzLnNjYW4gICAgICAgICAgID0gZGVwcmVjYXRlZCgnc2NhbicpO1xubW9kdWxlLmV4cG9ydHMucGFyc2UgICAgICAgICAgPSBkZXByZWNhdGVkKCdwYXJzZScpO1xubW9kdWxlLmV4cG9ydHMuY29tcG9zZSAgICAgICAgPSBkZXByZWNhdGVkKCdjb21wb3NlJyk7XG5tb2R1bGUuZXhwb3J0cy5hZGRDb25zdHJ1Y3RvciA9IGRlcHJlY2F0ZWQoJ2FkZENvbnN0cnVjdG9yJyk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB5YW1sID0gcmVxdWlyZSgnLi9saWIvanMteWFtbC5qcycpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0geWFtbDtcbiIsICJpbXBvcnQgeyB0aW1pbmdTYWZlRXF1YWwgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQge1xuXHRBcHAsXG5cdEVkaXRhYmxlRmlsZVZpZXcsXG5cdHJlcXVlc3RVcmwsXG5cdEVkaXRvcixcblx0TWFya2Rvd25WaWV3LFxuXHRNb2RhbCxcblx0Tm90aWNlLFxuXHRQbHVnaW4sXG5cdFBsdWdpblNldHRpbmdUYWIsXG5cdFNldHRpbmcsXG5cdG5vcm1hbGl6ZVBhdGhcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHthZGRJY29uc30gIGZyb20gJ2ljb24nO1xuaW1wb3J0IHsgVXBsb2FkMk5vdGlvbiB9IGZyb20gXCJVcGxvYWQyTm90aW9uXCI7XG5cbi8vIFJlbWVtYmVyIHRvIHJlbmFtZSB0aGVzZSBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIVxuXG5pbnRlcmZhY2UgTXlQbHVnaW5TZXR0aW5ncyB7XG5cdG5vdGlvbkFQSTogc3RyaW5nO1xuXHRkYXRhYmFzZUlEOiBzdHJpbmc7XG5cdHByb3h5OiBzdHJpbmc7XG59XG5cbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IE15UGx1Z2luU2V0dGluZ3MgPSB7XG5cdG5vdGlvbkFQSTogXCJcIixcblx0ZGF0YWJhc2VJRDogXCJcIixcblx0cHJveHk6IFwiXCIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNeVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG5cdHNldHRpbmdzOiBNeVBsdWdpblNldHRpbmdzO1xuXHRcblx0YXN5bmMgb25sb2FkKCkge1xuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG5cdFx0YWRkSWNvbnMoKTtcblx0XHQvLyBUaGlzIGNyZWF0ZXMgYW4gaWNvbiBpbiB0aGUgbGVmdCByaWJib24uXG5cdFx0Y29uc3QgcmliYm9uSWNvbkVsID0gdGhpcy5hZGRSaWJib25JY29uKFxuXHRcdFx0XCJub3Rpb24tbG9nb1wiLFxuXHRcdFx0XCJTaGFyZSB0byBub3Rpb25cIixcblx0XHRcdGFzeW5jIChldnQ6IE1vdXNlRXZlbnQpID0+IHtcblx0XHRcdFx0Ly8gQ2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBpY29uLlxuXHRcdFx0XHR0aGlzLnVwbG9hZCgpO1xuXHRcdFx0fVxuXHRcdCk7XG5cdFx0Ly8gUGVyZm9ybSBhZGRpdGlvbmFsIHRoaW5ncyB3aXRoIHRoZSByaWJib25cblx0XHRyaWJib25JY29uRWwuYWRkQ2xhc3MoXCJteS1wbHVnaW4tcmliYm9uLWNsYXNzXCIpO1xuXG5cdFx0Ly8gVGhpcyBhZGRzIGEgc3RhdHVzIGJhciBpdGVtIHRvIHRoZSBib3R0b20gb2YgdGhlIGFwcC4gRG9lcyBub3Qgd29yayBvbiBtb2JpbGUgYXBwcy5cblx0XHRjb25zdCBzdGF0dXNCYXJJdGVtRWwgPSB0aGlzLmFkZFN0YXR1c0Jhckl0ZW0oKTtcblx0XHQvLyBzdGF0dXNCYXJJdGVtRWwuc2V0VGV4dChcInNoYXJlIHRvIG5vdGlvblwiKTtcblxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XG5cdFx0XHRpZDogXCJzaGFyZS10by1ub3Rpb25cIixcblx0XHRcdG5hbWU6IFwic2hhcmUgdG8gbm90aW9uXCIsXG5cdFx0XHRlZGl0b3JDYWxsYmFjazogYXN5bmMgKGVkaXRvcjogRWRpdG9yLCB2aWV3OiBNYXJrZG93blZpZXcpID0+IHtcblx0XHRcdFx0dGhpcy51cGxvYWQoKVxuXHRcdFx0fSxcblx0XHR9KTtcblxuXG5cdFx0Ly8gVGhpcyBhZGRzIGEgc2V0dGluZ3MgdGFiIHNvIHRoZSB1c2VyIGNhbiBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBwbHVnaW5cblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IFNhbXBsZVNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcblxuXHR9XG5cblx0b251bmxvYWQoKSB7fVxuXG5cdGFzeW5jIHVwbG9hZCgpe1xuXHRcdGNvbnN0IHsgbm90aW9uQVBJLCBkYXRhYmFzZUlEIH0gPSB0aGlzLnNldHRpbmdzO1xuXHRcdFx0XHRpZiAobm90aW9uQVBJID09PSBcIlwiIHx8IGRhdGFiYXNlSUQgPT09IFwiXCIpIHtcblx0XHRcdFx0XHRuZXcgTm90aWNlKFxuXHRcdFx0XHRcdFx0XCJQbGVhc2Ugc2V0IHVwIHRoZSBub3Rpb24gQVBJIGFuZCBkYXRhYmFzZSBJRCBpbiB0aGUgc2V0dGluZ3MgdGFiLlwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgeyBub3dGaWxlLCBmaWxlRGF0YSxmdWxsUGF0aCB9ID1cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldE5vd0ZpbGVNYXJrZHdvbkNvbnRlbnQodGhpcy5hcHApO1xuXHRcdFx0XHRjb25zdCB7IGJhc2VuYW1lIH0gPSBub3dGaWxlO1xuXHRcdFx0XHRpZiAoZmlsZURhdGEpIHtcblx0XHRcdFx0XHRjb25zdCB1cGxvYWQgPSBuZXcgVXBsb2FkMk5vdGlvbih0aGlzKTtcblx0XHRcdFx0XHRjb25zdCByZXMgPSBhd2FpdCB1cGxvYWQuc3luY01hcmtkb3duVG9Ob3Rpb24oYmFzZW5hbWUsZmlsZURhdGEsIGZ1bGxQYXRoKVxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKHJlcylcblx0XHRcdFx0XHRpZihyZXMuc3RhdHVzID09PSAyMDApe1xuXHRcdFx0XHRcdFx0bmV3IE5vdGljZShgJHtiYXNlbmFtZX0gXHU1NDBDXHU2QjY1XHU2MjEwXHU1MjlGYClcblx0XHRcdFx0XHR9ZWxzZSB7XG5cdFx0XHRcdFx0XHRuZXcgTm90aWNlKGAke2Jhc2VuYW1lfSBcdTU0MENcdTZCNjVcdTU5MzFcdThEMjVgKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHR9XG5cblx0YXN5bmMgZ2V0Tm93RmlsZU1hcmtkd29uQ29udGVudChhcHA6IEFwcCkge1xuXHRcdGNvbnN0IG5vd0ZpbGUgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcblx0XHRpZiAobm93RmlsZSkge1xuXHRcdFx0Y29uc3QgZmlsZVBhdGg6IHN0cmluZyA9IG5vd0ZpbGUucGF0aDtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGNvbnN0IGJhc2VQYXRoOiBzdHJpbmcgPSBub3dGaWxlLnZhdWx0LmFkYXB0ZXIuYmFzZVBhdGg7XG5cdFx0XHRjb25zdCBmdWxsUGF0aCA9IG5vcm1hbGl6ZVBhdGgoam9pbihiYXNlUGF0aCwgZmlsZVBhdGgpKTtcblx0XHRcdGNvbnNvbGUubG9nKFwiZnVsbHBhdGhcIiwgZnVsbFBhdGgpO1xuXHRcdFx0Y29uc3QgZmlsZURhdGEgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsIFwidXRmOFwiKTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGZpbGVEYXRhLFxuXHRcdFx0XHRub3dGaWxlLFxuXHRcdFx0XHRmdWxsUGF0aCxcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5ldyBOb3RpY2UoXCJcdThCRjdcdTYyNTNcdTVGMDBcdTk3MDBcdTg5ODFcdTU0MENcdTZCNjVcdTc2ODRcdTY1ODdcdTRFRjZcIik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xuXHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKFxuXHRcdFx0e30sXG5cdFx0XHRERUZBVUxUX1NFVFRJTkdTLFxuXHRcdFx0YXdhaXQgdGhpcy5sb2FkRGF0YSgpXG5cdFx0KTtcblx0fVxuXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcblx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xuXHR9XG59XG5cbmNsYXNzIFNhbXBsZU1vZGFsIGV4dGVuZHMgTW9kYWwge1xuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCkge1xuXHRcdHN1cGVyKGFwcCk7XG5cdH1cblxuXHRvbk9wZW4oKSB7XG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG5cdFx0Y29udGVudEVsLnNldFRleHQoXCJXb2FoIVwiKTtcblx0fVxuXG5cdG9uQ2xvc2UoKSB7XG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG5cdFx0Y29udGVudEVsLmVtcHR5KCk7XG5cdH1cbn1cblxuY2xhc3MgU2FtcGxlU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuXHRwbHVnaW46IE15UGx1Z2luO1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IE15UGx1Z2luKSB7XG5cdFx0c3VwZXIoYXBwLCBwbHVnaW4pO1xuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXHR9XG5cblx0ZGlzcGxheSgpOiB2b2lkIHtcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDJcIiwge1xuXHRcdFx0dGV4dDogXCJTZXR0aW5ncyBmb3Igb2JzaWRpYW4gdG8gbm90aW9uIHBsdWdpbi5cIixcblx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJOb3Rpb24gQVBJIFRva2VuXCIpXG5cdFx0XHQuc2V0RGVzYyhcIkl0J3MgYSBzZWNyZXRcIilcblx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PlxuXHRcdFx0XHR0ZXh0XG5cdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKFwiRW50ZXIgeW91ciBOb3Rpb24gQVBJIFRva2VuXCIpXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm5vdGlvbkFQSSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhcIlNlY3JldDogXCIgKyB2YWx1ZSk7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5ub3Rpb25BUEkgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShcIkRhdGFiYXNlIElEXCIpXG5cdFx0XHQuc2V0RGVzYyhcIkl0J3MgYSBzZWNyZXRcIilcblx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PlxuXHRcdFx0XHR0ZXh0XG5cdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKFwiRW50ZXIgeW91ciBEYXRhYmFzZSBJRFwiKVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kYXRhYmFzZUlEKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiU2VjcmV0OiBcIiArIHZhbHVlKTtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRhdGFiYXNlSUQgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdH1cbn1cbiIsICJpbXBvcnQgeyBhZGRJY29uIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5jb25zdCBpY29uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ25vdGlvbi1sb2dvJzogYFxuICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB3aWR0aD1cIjEwMHB4XCIgaGVpZ2h0PVwiMTAwcHhcIiB2aWV3Qm94PVwiMCAwIDEwMCAxMDBcIiB2ZXJzaW9uPVwiMS4xXCI+XG48ZyBpZD1cInN1cmZhY2UxXCI+XG48cGF0aCBzdHlsZT1cIiBzdHJva2U6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtmaWxsOmN1cnJlbnRDb2xvcjtmaWxsLW9wYWNpdHk6MTtcIiBkPVwiTSAxOC43MzgyODEgMTcuNzk2ODc1IEMgMjEuODMyMDMxIDIwLjMwODU5NCAyMi45OTYwOTQgMjAuMTE3MTg4IDI4LjgwNDY4OCAxOS43MzA0NjkgTCA4My41ODIwMzEgMTYuNDQxNDA2IEMgODQuNzQ2MDk0IDE2LjQ0MTQwNiA4My43ODEyNSAxNS4yODEyNSA4My4zOTA2MjUgMTUuMDg5ODQ0IEwgNzQuMjkyOTY5IDguNTExNzE5IEMgNzIuNTUwNzgxIDcuMTYwMTU2IDcwLjIzMDQ2OSA1LjYwOTM3NSA2NS43NzczNDQgNS45OTYwOTQgTCAxMi43MzQzNzUgOS44NjcxODggQyAxMC44MDA3ODEgMTAuMDU4NTk0IDEwLjQxNDA2MiAxMS4wMjM0MzggMTEuMTgzNTk0IDExLjgwMDc4MSBaIE0gMjIuMDI3MzQ0IDMwLjU2MjUgTCAyMi4wMjczNDQgODguMTk5MjE5IEMgMjIuMDI3MzQ0IDkxLjI5Njg3NSAyMy41NzQyMTkgOTIuNDU3MDMxIDI3LjA1ODU5NCA5Mi4yNjU2MjUgTCA4Ny4yNjE3MTkgODguNzgxMjUgQyA5MC43NDYwOTQgODguNTg5ODQ0IDkxLjEzNjcxOSA4Ni40NTcwMzEgOTEuMTM2NzE5IDgzLjk0MTQwNiBMIDkxLjEzNjcxOSAyNi42OTE0MDYgQyA5MS4xMzY3MTkgMjQuMTc5Njg4IDkwLjE2Nzk2OSAyMi44MjQyMTkgODguMDM1MTU2IDIzLjAxOTUzMSBMIDI1LjEyNSAyNi42OTE0MDYgQyAyMi44MDA3ODEgMjYuODg2NzE5IDIyLjAyNzM0NCAyOC4wNDY4NzUgMjIuMDI3MzQ0IDMwLjU2MjUgWiBNIDgxLjQ2MDkzOCAzMy42NTIzNDQgQyA4MS44NDM3NSAzNS4zOTg0MzggODEuNDYwOTM4IDM3LjEzNjcxOSA3OS43MTQ4NDQgMzcuMzMyMDMxIEwgNzYuODEyNSAzNy45MTAxNTYgTCA3Ni44MTI1IDgwLjQ2MDkzOCBDIDc0LjI5Mjk2OSA4MS44MTY0MDYgNzEuOTcyNjU2IDgyLjU4OTg0NCA3MC4wMzUxNTYgODIuNTg5ODQ0IEMgNjYuOTM3NSA4Mi41ODk4NDQgNjYuMTY0MDYyIDgxLjYyMTA5NCA2My44Mzk4NDQgNzguNzIyNjU2IEwgNDQuODY3MTg4IDQ4LjkzNzUgTCA0NC44NjcxODggNzcuNzUzOTA2IEwgNTAuODcxMDk0IDc5LjEwOTM3NSBDIDUwLjg3MTA5NCA3OS4xMDkzNzUgNTAuODcxMDk0IDgyLjU4OTg0NCA0Ni4wMjczNDQgODIuNTg5ODQ0IEwgMzIuNjc1NzgxIDgzLjM2MzI4MSBDIDMyLjI4NTE1NiA4Mi41ODk4NDQgMzIuNjc1NzgxIDgwLjY1NjI1IDM0LjAyNzM0NCA4MC4yNjk1MzEgTCAzNy41MTE3MTkgNzkuMzA0Njg4IEwgMzcuNTExNzE5IDQxLjE5OTIxOSBMIDMyLjY3NTc4MSA0MC44MTI1IEMgMzIuMjg1MTU2IDM5LjA3MDMxMiAzMy4yNTM5MDYgMzYuNTU4NTk0IDM1Ljk2NDg0NCAzNi4zNjMyODEgTCA1MC4yOTI5NjkgMzUuMzk4NDM4IEwgNzAuMDM1MTU2IDY1LjU3MDMxMiBMIDcwLjAzNTE1NiAzOC44Nzg5MDYgTCA2NS4wMDM5MDYgMzguMzAwNzgxIEMgNjQuNjE3MTg4IDM2LjE3MTg3NSA2Ni4xNjQwNjIgMzQuNjI1IDY4LjA5NzY1NiAzNC40MzM1OTQgWiBNIDguMjgxMjUgNC42NDQ1MzEgTCA2My40NTMxMjUgMC41ODIwMzEgQyA3MC4yMzA0NjkgMCA3MS45NzI2NTYgMC4zOTA2MjUgNzYuMjMwNDY5IDMuNDg0Mzc1IEwgOTMuODQzNzUgMTUuODU5Mzc1IEMgOTYuNzUgMTcuOTg4MjgxIDk3LjcxODc1IDE4LjU3MDMxMiA5Ny43MTg3NSAyMC44OTA2MjUgTCA5Ny43MTg3NSA4OC43ODEyNSBDIDk3LjcxODc1IDkzLjAzNTE1NiA5Ni4xNjc5NjkgOTUuNTUwNzgxIDkwLjc1IDk1LjkzNzUgTCAyNi42NzU3ODEgOTkuODA0Njg4IEMgMjIuNjA5Mzc1IDEwMCAyMC42NzE4NzUgOTkuNDIxODc1IDE4LjU0Mjk2OSA5Ni43MTA5MzggTCA1LjU3NDIxOSA3OS44ODI4MTIgQyAzLjI1IDc2Ljc4NTE1NiAyLjI4MTI1IDc0LjQ2ODc1IDIuMjgxMjUgNzEuNzU3ODEyIEwgMi4yODEyNSAxMS40MTAxNTYgQyAyLjI4MTI1IDcuOTMzNTk0IDMuODMyMDMxIDUuMDMxMjUgOC4yODEyNSA0LjY0NDUzMSBaIE0gOC4yODEyNSA0LjY0NDUzMSBcIi8+XG48L2c+XG48L3N2Zz5cbiAgYFxufTtcblxuZXhwb3J0IGNvbnN0IGFkZEljb25zID0gKCk6IHZvaWQgPT4ge1xuICBPYmplY3Qua2V5cyhpY29ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgYWRkSWNvbihrZXksIGljb25zW2tleV0pO1xuICB9KTtcbn07XG4iLCAiaW1wb3J0IHsgcmVxdWVzdFVybCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBub3Rpb25ocS9jbGllbnRcIjtcbmltcG9ydCB7IG1hcmtkb3duVG9CbG9ja3MsICB9IGZyb20gXCJAdHJ5ZmFicmljL21hcnRpYW5cIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgeWFtbEZyb250TWF0dGVyIGZyb20gXCJ5YW1sLWZyb250LW1hdHRlclwiO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tIFwieWFtbFwiXG5pbXBvcnQgTXlQbHVnaW4gZnJvbSBcIm1haW5cIjtcblxuZXhwb3J0IGNsYXNzIFVwbG9hZDJOb3Rpb24ge1xuXHRhcHA6IE15UGx1Z2luO1xuXHRub3Rpb246IENsaWVudDtcblx0YWdlbnQ6IGFueTtcblx0Y29uc3RydWN0b3IoYXBwOiBNeVBsdWdpbikge1xuXHRcdHRoaXMuYXBwID0gYXBwO1xuXHR9XG5cdGFzeW5jIGNyZWF0ZVBhZ2UodGl0bGU6c3RyaW5nLCBjaGlsZEFycjogYW55KSB7XG5cdFx0Y29uc3QgYm9keVN0cmluZyA9IHtcblx0XHRcdHBhcmVudDogeyBcblx0XHRcdFx0ZGF0YWJhc2VfaWQ6IHRoaXMuYXBwLnNldHRpbmdzLmRhdGFiYXNlSUQgXG5cdFx0XHR9LFxuXHRcdFx0cHJvcGVydGllczoge1xuXHRcdFx0XHROYW1lOiB7XG5cdFx0XHRcdFx0dGl0bGU6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGV4dDoge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRpdGxlLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdGNoaWxkcmVuOiBjaGlsZEFycixcblx0XHR9XG5cdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKHtcblx0XHRcdHVybDogYGh0dHBzOi8vYXBpLm5vdGlvbi5jb20vdjEvcGFnZXNgLFxuXHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdCdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG5cdFx0XHRcdC8vICdVc2VyLUFnZW50JzogJ29ic2lkaWFuLm1kJyxcblx0XHRcdFx0J0F1dGhvcml6YXRpb24nOiAnQmVhcmVyICcgKyB0aGlzLmFwcC5zZXR0aW5ncy5ub3Rpb25BUEksXG5cdFx0XHRcdCdOb3Rpb24tVmVyc2lvbic6ICcyMDIxLTA4LTE2Jyxcblx0XHRcdH0sXG5cdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeShib2R5U3RyaW5nKSxcblx0XHR9KVxuXHRcdHJldHVybiByZXNwb25zZTtcblx0fVxuXG5cdGFzeW5jIHN5bmNNYXJrZG93blRvTm90aW9uKHRpdGxlOnN0cmluZywgbWFya2Rvd246IHN0cmluZywgZnVsbFBhdGg6c3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCB5YW1sT2JqOmFueSA9IHlhbWxGcm9udE1hdHRlci5sb2FkRnJvbnQobWFya2Rvd24pO1xuXHRcdGNvbnN0IF9fY29udGVudCA9IHlhbWxPYmouX19jb250ZW50XG5cdFx0Y29uc3QgZmlsZTJtZCA9IG1hcmtkb3duVG9CbG9ja3MoX19jb250ZW50KTtcblx0XHRjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNyZWF0ZVBhZ2UodGl0bGUsIGZpbGUybWQpO1xuXHRcdGlmIChyZXMuc3RhdHVzID09PSAyMDApIHtcblx0XHRcdHRoaXMudXBkYXRlWWFtbEluZm8obWFya2Rvd24sIGZ1bGxQYXRoLCByZXMpXG5cdFx0fVxuXHRcdHJldHVybiByZXNcblx0fVxuXG5cdGFzeW5jIHVwZGF0ZVlhbWxJbmZvKHlhbWxDb250ZW50OiBzdHJpbmcsIGZ1bGxQYXRoOiBzdHJpbmcsIHJlczogYW55KSB7XG5cdFx0Y29uc3QgeWFtbE9iajphbnkgPSB5YW1sRnJvbnRNYXR0ZXIubG9hZEZyb250KHlhbWxDb250ZW50KTtcblx0XHRjb25zdCB7dXJsfSA9IHJlcy5qc29uXG5cdFx0eWFtbE9iai5saW5rID0gdXJsO1xuXHRcdGNvbnN0IF9fY29udGVudCA9IHlhbWxPYmouX19jb250ZW50O1xuXHRcdGRlbGV0ZSB5YW1sT2JqLl9fY29udGVudFxuXHRcdGNvbnN0IHlhbWxoZWFkID0geWFtbC5zdHJpbmdpZnkoeWFtbE9iailcblx0XHQvLyAgaWYgeWFtbGhlYWQgaGF2YSBsYXN0IFxcbiAgcmVtb3ZlIGl0XG5cdFx0Y29uc3QgeWFtbGhlYWRfcmVtb3ZlX24gPSB5YW1saGVhZC5yZXBsYWNlKC9cXG4kLywgJycpXG5cdFx0Ly8gaWYgX19jb250ZW50IGhhdmUgc3RhcnQgXFxuIHJlbW92ZSBpdFxuXHRcdGNvbnN0IF9fY29udGVudF9yZW1vdmVfbiA9IF9fY29udGVudC5yZXBsYWNlKC9eXFxuLywgJycpXG5cdFx0Y29uc3QgY29udGVudCA9ICctLS1cXG4nICt5YW1saGVhZF9yZW1vdmVfbiArJ1xcbi0tLVxcbicgKyBfX2NvbnRlbnRfcmVtb3ZlX247XG5cblx0XHQvL3dyaXRlIGNvbnRlbnQgZm8gZmlsZVxuXHRcdGZzLndyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGNvbnRlbnQpO1xuXHRcdHJldHVybiByZXNcblx0fVxufVxuIiwgInZhciBqc1lhbWwgPSByZXF1aXJlKCdqcy15YW1sJyk7XG5cbmZ1bmN0aW9uIHBhcnNlKHRleHQsIG9wdGlvbnMsIGxvYWRTYWZlKSB7XG4gICAgbGV0IGNvbnRlbnRLZXlOYW1lID0gb3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBvcHRpb25zXG4gICAgICAgIDogb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRlbnRLZXlOYW1lIFxuICAgICAgICAgICAgPyBvcHRpb25zLmNvbnRlbnRLZXlOYW1lIFxuICAgICAgICAgICAgOiAnX19jb250ZW50JztcblxuICAgIGxldCBwYXNzVGhyb3VnaE9wdGlvbnMgPSBvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0J1xuICAgICAgICA/IG9wdGlvbnNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgcmUgPSAvXigtezN9KD86XFxufFxccikoW1xcd1xcV10rPykoPzpcXG58XFxyKS17M30pPyhbXFx3XFxXXSopKi9cbiAgICAgICAgLCByZXN1bHRzID0gcmUuZXhlYyh0ZXh0KVxuICAgICAgICAsIGNvbmYgPSB7fVxuICAgICAgICAsIHlhbWxPckpzb247XG5cbiAgICBpZiAoKHlhbWxPckpzb24gPSByZXN1bHRzWzJdKSkge1xuICAgICAgICBpZiAoeWFtbE9ySnNvbi5jaGFyQXQoMCkgPT09ICd7Jykge1xuICAgICAgICAgICAgY29uZiA9IEpTT04ucGFyc2UoeWFtbE9ySnNvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZihsb2FkU2FmZSkge1xuICAgICAgICAgICAgICAgIGNvbmYgPSBqc1lhbWwuc2FmZUxvYWQoeWFtbE9ySnNvbiwgcGFzc1Rocm91Z2hPcHRpb25zKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uZiA9IGpzWWFtbC5sb2FkKHlhbWxPckpzb24sIHBhc3NUaHJvdWdoT3B0aW9ucyk7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uZltjb250ZW50S2V5TmFtZV0gPSByZXN1bHRzWzNdIHx8ICcnO1xuXG4gICAgcmV0dXJuIGNvbmY7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbG9hZEZyb250IChjb250ZW50LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHBhcnNlKGNvbnRlbnQsIG9wdGlvbnMsIGZhbHNlKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzYWZlTG9hZEZyb250IChjb250ZW50LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHBhcnNlKGNvbnRlbnQsIG9wdGlvbnMsIHRydWUpXG59XG4iLCAiY29uc3QgQUxJQVMgPSBTeW1ib2wuZm9yKCd5YW1sLmFsaWFzJyk7XG5jb25zdCBET0MgPSBTeW1ib2wuZm9yKCd5YW1sLmRvY3VtZW50Jyk7XG5jb25zdCBNQVAgPSBTeW1ib2wuZm9yKCd5YW1sLm1hcCcpO1xuY29uc3QgUEFJUiA9IFN5bWJvbC5mb3IoJ3lhbWwucGFpcicpO1xuY29uc3QgU0NBTEFSID0gU3ltYm9sLmZvcigneWFtbC5zY2FsYXInKTtcbmNvbnN0IFNFUSA9IFN5bWJvbC5mb3IoJ3lhbWwuc2VxJyk7XG5jb25zdCBOT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCd5YW1sLm5vZGUudHlwZScpO1xuY29uc3QgaXNBbGlhcyA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gQUxJQVM7XG5jb25zdCBpc0RvY3VtZW50ID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBET0M7XG5jb25zdCBpc01hcCA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gTUFQO1xuY29uc3QgaXNQYWlyID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBQQUlSO1xuY29uc3QgaXNTY2FsYXIgPSAobm9kZSkgPT4gISFub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBub2RlW05PREVfVFlQRV0gPT09IFNDQUxBUjtcbmNvbnN0IGlzU2VxID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBTRVE7XG5mdW5jdGlvbiBpc0NvbGxlY3Rpb24obm9kZSkge1xuICAgIGlmIChub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JylcbiAgICAgICAgc3dpdGNoIChub2RlW05PREVfVFlQRV0pIHtcbiAgICAgICAgICAgIGNhc2UgTUFQOlxuICAgICAgICAgICAgY2FzZSBTRVE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc05vZGUobm9kZSkge1xuICAgIGlmIChub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JylcbiAgICAgICAgc3dpdGNoIChub2RlW05PREVfVFlQRV0pIHtcbiAgICAgICAgICAgIGNhc2UgQUxJQVM6XG4gICAgICAgICAgICBjYXNlIE1BUDpcbiAgICAgICAgICAgIGNhc2UgU0NBTEFSOlxuICAgICAgICAgICAgY2FzZSBTRVE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5jb25zdCBoYXNBbmNob3IgPSAobm9kZSkgPT4gKGlzU2NhbGFyKG5vZGUpIHx8IGlzQ29sbGVjdGlvbihub2RlKSkgJiYgISFub2RlLmFuY2hvcjtcbmNsYXNzIE5vZGVCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBOT0RFX1RZUEUsIHsgdmFsdWU6IHR5cGUgfSk7XG4gICAgfVxuICAgIC8qKiBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgbm9kZS4gICovXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModGhpcykpO1xuICAgICAgICBpZiAodGhpcy5yYW5nZSlcbiAgICAgICAgICAgIGNvcHkucmFuZ2UgPSB0aGlzLnJhbmdlLnNsaWNlKCk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbn1cblxuZXhwb3J0IHsgQUxJQVMsIERPQywgTUFQLCBOT0RFX1RZUEUsIE5vZGVCYXNlLCBQQUlSLCBTQ0FMQVIsIFNFUSwgaGFzQW5jaG9yLCBpc0FsaWFzLCBpc0NvbGxlY3Rpb24sIGlzRG9jdW1lbnQsIGlzTWFwLCBpc05vZGUsIGlzUGFpciwgaXNTY2FsYXIsIGlzU2VxIH07XG4iLCAiaW1wb3J0IHsgaXNEb2N1bWVudCwgaXNOb2RlLCBpc1BhaXIsIGlzQ29sbGVjdGlvbiwgaXNNYXAsIGlzU2VxLCBpc1NjYWxhciwgaXNBbGlhcyB9IGZyb20gJy4vbm9kZXMvTm9kZS5qcyc7XG5cbmNvbnN0IEJSRUFLID0gU3ltYm9sKCdicmVhayB2aXNpdCcpO1xuY29uc3QgU0tJUCA9IFN5bWJvbCgnc2tpcCBjaGlsZHJlbicpO1xuY29uc3QgUkVNT1ZFID0gU3ltYm9sKCdyZW1vdmUgbm9kZScpO1xuLyoqXG4gKiBBcHBseSBhIHZpc2l0b3IgdG8gYW4gQVNUIG5vZGUgb3IgZG9jdW1lbnQuXG4gKlxuICogV2Fsa3MgdGhyb3VnaCB0aGUgdHJlZSAoZGVwdGgtZmlyc3QpIHN0YXJ0aW5nIGZyb20gYG5vZGVgLCBjYWxsaW5nIGFcbiAqIGB2aXNpdG9yYCBmdW5jdGlvbiB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICAgLSBga2V5YDogRm9yIHNlcXVlbmNlIHZhbHVlcyBhbmQgbWFwIGBQYWlyYCwgdGhlIG5vZGUncyBpbmRleCBpbiB0aGVcbiAqICAgICBjb2xsZWN0aW9uLiBXaXRoaW4gYSBgUGFpcmAsIGAna2V5J2Agb3IgYCd2YWx1ZSdgLCBjb3JyZXNwb25kaW5nbHkuXG4gKiAgICAgYG51bGxgIGZvciB0aGUgcm9vdCBub2RlLlxuICogICAtIGBub2RlYDogVGhlIGN1cnJlbnQgbm9kZS5cbiAqICAgLSBgcGF0aGA6IFRoZSBhbmNlc3RyeSBvZiB0aGUgY3VycmVudCBub2RlLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHZpc2l0b3IgbWF5IGJlIHVzZWQgdG8gY29udHJvbCB0aGUgdHJhdmVyc2FsOlxuICogICAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogRG8gbm90aGluZyBhbmQgY29udGludWVcbiAqICAgLSBgdmlzaXQuU0tJUGA6IERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCBjb250aW51ZSB3aXRoIG5leHRcbiAqICAgICBzaWJsaW5nXG4gKiAgIC0gYHZpc2l0LkJSRUFLYDogVGVybWluYXRlIHRyYXZlcnNhbCBjb21wbGV0ZWx5XG4gKiAgIC0gYHZpc2l0LlJFTU9WRWA6IFJlbW92ZSB0aGUgY3VycmVudCBub2RlLCB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lXG4gKiAgIC0gYE5vZGVgOiBSZXBsYWNlIHRoZSBjdXJyZW50IG5vZGUsIHRoZW4gY29udGludWUgYnkgdmlzaXRpbmcgaXRcbiAqICAgLSBgbnVtYmVyYDogV2hpbGUgaXRlcmF0aW5nIHRoZSBpdGVtcyBvZiBhIHNlcXVlbmNlIG9yIG1hcCwgc2V0IHRoZSBpbmRleFxuICogICAgIG9mIHRoZSBuZXh0IHN0ZXAuIFRoaXMgaXMgdXNlZnVsIGVzcGVjaWFsbHkgaWYgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50XG4gKiAgICAgbm9kZSBoYXMgY2hhbmdlZC5cbiAqXG4gKiBJZiBgdmlzaXRvcmAgaXMgYSBzaW5nbGUgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggYWxsIHZhbHVlc1xuICogZW5jb3VudGVyZWQgaW4gdGhlIHRyZWUsIGluY2x1ZGluZyBlLmcuIGBudWxsYCB2YWx1ZXMuIEFsdGVybmF0aXZlbHksXG4gKiBzZXBhcmF0ZSB2aXNpdG9yIGZ1bmN0aW9ucyBtYXkgYmUgZGVmaW5lZCBmb3IgZWFjaCBgTWFwYCwgYFBhaXJgLCBgU2VxYCxcbiAqIGBBbGlhc2AgYW5kIGBTY2FsYXJgIG5vZGUuIFRvIGRlZmluZSB0aGUgc2FtZSB2aXNpdG9yIGZ1bmN0aW9uIGZvciBtb3JlIHRoYW5cbiAqIG9uZSBub2RlIHR5cGUsIHVzZSB0aGUgYENvbGxlY3Rpb25gIChtYXAgYW5kIHNlcSksIGBWYWx1ZWAgKG1hcCwgc2VxICYgc2NhbGFyKVxuICogYW5kIGBOb2RlYCAoYWxpYXMsIG1hcCwgc2VxICYgc2NhbGFyKSB0YXJnZXRzLiBPZiBhbGwgdGhlc2UsIG9ubHkgdGhlIG1vc3RcbiAqIHNwZWNpZmljIGRlZmluZWQgb25lIHdpbGwgYmUgdXNlZCBmb3IgZWFjaCBub2RlLlxuICovXG5mdW5jdGlvbiB2aXNpdChub2RlLCB2aXNpdG9yKSB7XG4gICAgY29uc3QgdmlzaXRvcl8gPSBpbml0VmlzaXRvcih2aXNpdG9yKTtcbiAgICBpZiAoaXNEb2N1bWVudChub2RlKSkge1xuICAgICAgICBjb25zdCBjZCA9IHZpc2l0XyhudWxsLCBub2RlLmNvbnRlbnRzLCB2aXNpdG9yXywgT2JqZWN0LmZyZWV6ZShbbm9kZV0pKTtcbiAgICAgICAgaWYgKGNkID09PSBSRU1PVkUpXG4gICAgICAgICAgICBub2RlLmNvbnRlbnRzID0gbnVsbDtcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICB2aXNpdF8obnVsbCwgbm9kZSwgdmlzaXRvcl8sIE9iamVjdC5mcmVlemUoW10pKTtcbn1cbi8vIFdpdGhvdXQgdGhlIGBhcyBzeW1ib2xgIGNhc3RzLCBUUyBkZWNsYXJlcyB0aGVzZSBpbiB0aGUgYHZpc2l0YFxuLy8gbmFtZXNwYWNlIHVzaW5nIGB2YXJgLCBidXQgdGhlbiBjb21wbGFpbnMgYWJvdXQgdGhhdCBiZWNhdXNlXG4vLyBgdW5pcXVlIHN5bWJvbGAgbXVzdCBiZSBgY29uc3RgLlxuLyoqIFRlcm1pbmF0ZSB2aXNpdCB0cmF2ZXJzYWwgY29tcGxldGVseSAqL1xudmlzaXQuQlJFQUsgPSBCUkVBSztcbi8qKiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUgKi9cbnZpc2l0LlNLSVAgPSBTS0lQO1xuLyoqIFJlbW92ZSB0aGUgY3VycmVudCBub2RlICovXG52aXNpdC5SRU1PVkUgPSBSRU1PVkU7XG5mdW5jdGlvbiB2aXNpdF8oa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKSB7XG4gICAgY29uc3QgY3RybCA9IGNhbGxWaXNpdG9yKGtleSwgbm9kZSwgdmlzaXRvciwgcGF0aCk7XG4gICAgaWYgKGlzTm9kZShjdHJsKSB8fCBpc1BhaXIoY3RybCkpIHtcbiAgICAgICAgcmVwbGFjZU5vZGUoa2V5LCBwYXRoLCBjdHJsKTtcbiAgICAgICAgcmV0dXJuIHZpc2l0XyhrZXksIGN0cmwsIHZpc2l0b3IsIHBhdGgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGN0cmwgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgIGlmIChpc0NvbGxlY3Rpb24obm9kZSkpIHtcbiAgICAgICAgICAgIHBhdGggPSBPYmplY3QuZnJlZXplKHBhdGguY29uY2F0KG5vZGUpKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5pdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNpID0gdmlzaXRfKGksIG5vZGUuaXRlbXNbaV0sIHZpc2l0b3IsIHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2kgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgICAgICBpID0gY2kgLSAxO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNpID09PSBCUkVBSylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNpID09PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5pdGVtcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYWlyKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoID0gT2JqZWN0LmZyZWV6ZShwYXRoLmNvbmNhdChub2RlKSk7XG4gICAgICAgICAgICBjb25zdCBjayA9IHZpc2l0Xygna2V5Jywgbm9kZS5rZXksIHZpc2l0b3IsIHBhdGgpO1xuICAgICAgICAgICAgaWYgKGNrID09PSBCUkVBSylcbiAgICAgICAgICAgICAgICByZXR1cm4gQlJFQUs7XG4gICAgICAgICAgICBlbHNlIGlmIChjayA9PT0gUkVNT1ZFKVxuICAgICAgICAgICAgICAgIG5vZGUua2V5ID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGN2ID0gdmlzaXRfKCd2YWx1ZScsIG5vZGUudmFsdWUsIHZpc2l0b3IsIHBhdGgpO1xuICAgICAgICAgICAgaWYgKGN2ID09PSBCUkVBSylcbiAgICAgICAgICAgICAgICByZXR1cm4gQlJFQUs7XG4gICAgICAgICAgICBlbHNlIGlmIChjdiA9PT0gUkVNT1ZFKVxuICAgICAgICAgICAgICAgIG5vZGUudmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdHJsO1xufVxuLyoqXG4gKiBBcHBseSBhbiBhc3luYyB2aXNpdG9yIHRvIGFuIEFTVCBub2RlIG9yIGRvY3VtZW50LlxuICpcbiAqIFdhbGtzIHRocm91Z2ggdGhlIHRyZWUgKGRlcHRoLWZpcnN0KSBzdGFydGluZyBmcm9tIGBub2RlYCwgY2FsbGluZyBhXG4gKiBgdmlzaXRvcmAgZnVuY3Rpb24gd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAgIC0gYGtleWA6IEZvciBzZXF1ZW5jZSB2YWx1ZXMgYW5kIG1hcCBgUGFpcmAsIHRoZSBub2RlJ3MgaW5kZXggaW4gdGhlXG4gKiAgICAgY29sbGVjdGlvbi4gV2l0aGluIGEgYFBhaXJgLCBgJ2tleSdgIG9yIGAndmFsdWUnYCwgY29ycmVzcG9uZGluZ2x5LlxuICogICAgIGBudWxsYCBmb3IgdGhlIHJvb3Qgbm9kZS5cbiAqICAgLSBgbm9kZWA6IFRoZSBjdXJyZW50IG5vZGUuXG4gKiAgIC0gYHBhdGhgOiBUaGUgYW5jZXN0cnkgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB2aXNpdG9yIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIHRyYXZlcnNhbDpcbiAqICAgLSBgUHJvbWlzZWA6IE11c3QgcmVzb2x2ZSB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXNcbiAqICAgLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IERvIG5vdGhpbmcgYW5kIGNvbnRpbnVlXG4gKiAgIC0gYHZpc2l0LlNLSVBgOiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSwgY29udGludWUgd2l0aCBuZXh0XG4gKiAgICAgc2libGluZ1xuICogICAtIGB2aXNpdC5CUkVBS2A6IFRlcm1pbmF0ZSB0cmF2ZXJzYWwgY29tcGxldGVseVxuICogICAtIGB2aXNpdC5SRU1PVkVgOiBSZW1vdmUgdGhlIGN1cnJlbnQgbm9kZSwgdGhlbiBjb250aW51ZSB3aXRoIHRoZSBuZXh0IG9uZVxuICogICAtIGBOb2RlYDogUmVwbGFjZSB0aGUgY3VycmVudCBub2RlLCB0aGVuIGNvbnRpbnVlIGJ5IHZpc2l0aW5nIGl0XG4gKiAgIC0gYG51bWJlcmA6IFdoaWxlIGl0ZXJhdGluZyB0aGUgaXRlbXMgb2YgYSBzZXF1ZW5jZSBvciBtYXAsIHNldCB0aGUgaW5kZXhcbiAqICAgICBvZiB0aGUgbmV4dCBzdGVwLiBUaGlzIGlzIHVzZWZ1bCBlc3BlY2lhbGx5IGlmIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudFxuICogICAgIG5vZGUgaGFzIGNoYW5nZWQuXG4gKlxuICogSWYgYHZpc2l0b3JgIGlzIGEgc2luZ2xlIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGFsbCB2YWx1ZXNcbiAqIGVuY291bnRlcmVkIGluIHRoZSB0cmVlLCBpbmNsdWRpbmcgZS5nLiBgbnVsbGAgdmFsdWVzLiBBbHRlcm5hdGl2ZWx5LFxuICogc2VwYXJhdGUgdmlzaXRvciBmdW5jdGlvbnMgbWF5IGJlIGRlZmluZWQgZm9yIGVhY2ggYE1hcGAsIGBQYWlyYCwgYFNlcWAsXG4gKiBgQWxpYXNgIGFuZCBgU2NhbGFyYCBub2RlLiBUbyBkZWZpbmUgdGhlIHNhbWUgdmlzaXRvciBmdW5jdGlvbiBmb3IgbW9yZSB0aGFuXG4gKiBvbmUgbm9kZSB0eXBlLCB1c2UgdGhlIGBDb2xsZWN0aW9uYCAobWFwIGFuZCBzZXEpLCBgVmFsdWVgIChtYXAsIHNlcSAmIHNjYWxhcilcbiAqIGFuZCBgTm9kZWAgKGFsaWFzLCBtYXAsIHNlcSAmIHNjYWxhcikgdGFyZ2V0cy4gT2YgYWxsIHRoZXNlLCBvbmx5IHRoZSBtb3N0XG4gKiBzcGVjaWZpYyBkZWZpbmVkIG9uZSB3aWxsIGJlIHVzZWQgZm9yIGVhY2ggbm9kZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdmlzaXRBc3luYyhub2RlLCB2aXNpdG9yKSB7XG4gICAgY29uc3QgdmlzaXRvcl8gPSBpbml0VmlzaXRvcih2aXNpdG9yKTtcbiAgICBpZiAoaXNEb2N1bWVudChub2RlKSkge1xuICAgICAgICBjb25zdCBjZCA9IGF3YWl0IHZpc2l0QXN5bmNfKG51bGwsIG5vZGUuY29udGVudHMsIHZpc2l0b3JfLCBPYmplY3QuZnJlZXplKFtub2RlXSkpO1xuICAgICAgICBpZiAoY2QgPT09IFJFTU9WRSlcbiAgICAgICAgICAgIG5vZGUuY29udGVudHMgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIGF3YWl0IHZpc2l0QXN5bmNfKG51bGwsIG5vZGUsIHZpc2l0b3JfLCBPYmplY3QuZnJlZXplKFtdKSk7XG59XG4vLyBXaXRob3V0IHRoZSBgYXMgc3ltYm9sYCBjYXN0cywgVFMgZGVjbGFyZXMgdGhlc2UgaW4gdGhlIGB2aXNpdGBcbi8vIG5hbWVzcGFjZSB1c2luZyBgdmFyYCwgYnV0IHRoZW4gY29tcGxhaW5zIGFib3V0IHRoYXQgYmVjYXVzZVxuLy8gYHVuaXF1ZSBzeW1ib2xgIG11c3QgYmUgYGNvbnN0YC5cbi8qKiBUZXJtaW5hdGUgdmlzaXQgdHJhdmVyc2FsIGNvbXBsZXRlbHkgKi9cbnZpc2l0QXN5bmMuQlJFQUsgPSBCUkVBSztcbi8qKiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUgKi9cbnZpc2l0QXN5bmMuU0tJUCA9IFNLSVA7XG4vKiogUmVtb3ZlIHRoZSBjdXJyZW50IG5vZGUgKi9cbnZpc2l0QXN5bmMuUkVNT1ZFID0gUkVNT1ZFO1xuYXN5bmMgZnVuY3Rpb24gdmlzaXRBc3luY18oa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKSB7XG4gICAgY29uc3QgY3RybCA9IGF3YWl0IGNhbGxWaXNpdG9yKGtleSwgbm9kZSwgdmlzaXRvciwgcGF0aCk7XG4gICAgaWYgKGlzTm9kZShjdHJsKSB8fCBpc1BhaXIoY3RybCkpIHtcbiAgICAgICAgcmVwbGFjZU5vZGUoa2V5LCBwYXRoLCBjdHJsKTtcbiAgICAgICAgcmV0dXJuIHZpc2l0QXN5bmNfKGtleSwgY3RybCwgdmlzaXRvciwgcGF0aCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY3RybCAhPT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgaWYgKGlzQ29sbGVjdGlvbihub2RlKSkge1xuICAgICAgICAgICAgcGF0aCA9IE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQobm9kZSkpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2kgPSBhd2FpdCB2aXNpdEFzeW5jXyhpLCBub2RlLml0ZW1zW2ldLCB2aXNpdG9yLCBwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNpID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICAgICAgICAgaSA9IGNpIC0gMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuaXRlbXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICBpIC09IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGFpcihub2RlKSkge1xuICAgICAgICAgICAgcGF0aCA9IE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQobm9kZSkpO1xuICAgICAgICAgICAgY29uc3QgY2sgPSBhd2FpdCB2aXNpdEFzeW5jXygna2V5Jywgbm9kZS5rZXksIHZpc2l0b3IsIHBhdGgpO1xuICAgICAgICAgICAgaWYgKGNrID09PSBCUkVBSylcbiAgICAgICAgICAgICAgICByZXR1cm4gQlJFQUs7XG4gICAgICAgICAgICBlbHNlIGlmIChjayA9PT0gUkVNT1ZFKVxuICAgICAgICAgICAgICAgIG5vZGUua2V5ID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGN2ID0gYXdhaXQgdmlzaXRBc3luY18oJ3ZhbHVlJywgbm9kZS52YWx1ZSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICBpZiAoY3YgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgIGVsc2UgaWYgKGN2ID09PSBSRU1PVkUpXG4gICAgICAgICAgICAgICAgbm9kZS52YWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN0cmw7XG59XG5mdW5jdGlvbiBpbml0VmlzaXRvcih2aXNpdG9yKSB7XG4gICAgaWYgKHR5cGVvZiB2aXNpdG9yID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAodmlzaXRvci5Db2xsZWN0aW9uIHx8IHZpc2l0b3IuTm9kZSB8fCB2aXNpdG9yLlZhbHVlKSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBBbGlhczogdmlzaXRvci5Ob2RlLFxuICAgICAgICAgICAgTWFwOiB2aXNpdG9yLk5vZGUsXG4gICAgICAgICAgICBTY2FsYXI6IHZpc2l0b3IuTm9kZSxcbiAgICAgICAgICAgIFNlcTogdmlzaXRvci5Ob2RlXG4gICAgICAgIH0sIHZpc2l0b3IuVmFsdWUgJiYge1xuICAgICAgICAgICAgTWFwOiB2aXNpdG9yLlZhbHVlLFxuICAgICAgICAgICAgU2NhbGFyOiB2aXNpdG9yLlZhbHVlLFxuICAgICAgICAgICAgU2VxOiB2aXNpdG9yLlZhbHVlXG4gICAgICAgIH0sIHZpc2l0b3IuQ29sbGVjdGlvbiAmJiB7XG4gICAgICAgICAgICBNYXA6IHZpc2l0b3IuQ29sbGVjdGlvbixcbiAgICAgICAgICAgIFNlcTogdmlzaXRvci5Db2xsZWN0aW9uXG4gICAgICAgIH0sIHZpc2l0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gdmlzaXRvcjtcbn1cbmZ1bmN0aW9uIGNhbGxWaXNpdG9yKGtleSwgbm9kZSwgdmlzaXRvciwgcGF0aCkge1xuICAgIGlmICh0eXBlb2YgdmlzaXRvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcmV0dXJuIHZpc2l0b3Ioa2V5LCBub2RlLCBwYXRoKTtcbiAgICBpZiAoaXNNYXAobm9kZSkpXG4gICAgICAgIHJldHVybiB2aXNpdG9yLk1hcD8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgaWYgKGlzU2VxKG5vZGUpKVxuICAgICAgICByZXR1cm4gdmlzaXRvci5TZXE/LihrZXksIG5vZGUsIHBhdGgpO1xuICAgIGlmIChpc1BhaXIobm9kZSkpXG4gICAgICAgIHJldHVybiB2aXNpdG9yLlBhaXI/LihrZXksIG5vZGUsIHBhdGgpO1xuICAgIGlmIChpc1NjYWxhcihub2RlKSlcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IuU2NhbGFyPy4oa2V5LCBub2RlLCBwYXRoKTtcbiAgICBpZiAoaXNBbGlhcyhub2RlKSlcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IuQWxpYXM/LihrZXksIG5vZGUsIHBhdGgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiByZXBsYWNlTm9kZShrZXksIHBhdGgsIG5vZGUpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgaWYgKGlzQ29sbGVjdGlvbihwYXJlbnQpKSB7XG4gICAgICAgIHBhcmVudC5pdGVtc1trZXldID0gbm9kZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQYWlyKHBhcmVudCkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ2tleScpXG4gICAgICAgICAgICBwYXJlbnQua2V5ID0gbm9kZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcGFyZW50LnZhbHVlID0gbm9kZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNEb2N1bWVudChwYXJlbnQpKSB7XG4gICAgICAgIHBhcmVudC5jb250ZW50cyA9IG5vZGU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBwdCA9IGlzQWxpYXMocGFyZW50KSA/ICdhbGlhcycgOiAnc2NhbGFyJztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVwbGFjZSBub2RlIHdpdGggJHtwdH0gcGFyZW50YCk7XG4gICAgfVxufVxuXG5leHBvcnQgeyB2aXNpdCwgdmlzaXRBc3luYyB9O1xuIiwgImltcG9ydCB7IGlzTm9kZSB9IGZyb20gJy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICcuLi92aXNpdC5qcyc7XG5cbmNvbnN0IGVzY2FwZUNoYXJzID0ge1xuICAgICchJzogJyUyMScsXG4gICAgJywnOiAnJTJDJyxcbiAgICAnWyc6ICclNUInLFxuICAgICddJzogJyU1RCcsXG4gICAgJ3snOiAnJTdCJyxcbiAgICAnfSc6ICclN0QnXG59O1xuY29uc3QgZXNjYXBlVGFnTmFtZSA9ICh0bikgPT4gdG4ucmVwbGFjZSgvWyEsW1xcXXt9XS9nLCBjaCA9PiBlc2NhcGVDaGFyc1tjaF0pO1xuY2xhc3MgRGlyZWN0aXZlcyB7XG4gICAgY29uc3RydWN0b3IoeWFtbCwgdGFncykge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpcmVjdGl2ZXMtZW5kL2RvYy1zdGFydCBtYXJrZXIgYC0tLWAuIElmIGBudWxsYCwgYSBtYXJrZXIgbWF5IHN0aWxsIGJlXG4gICAgICAgICAqIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudCdzIHN0cmluZ2lmaWVkIHJlcHJlc2VudGF0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kb2NTdGFydCA9IG51bGw7XG4gICAgICAgIC8qKiBUaGUgZG9jLWVuZCBtYXJrZXIgYC4uLmAuICAqL1xuICAgICAgICB0aGlzLmRvY0VuZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnlhbWwgPSBPYmplY3QuYXNzaWduKHt9LCBEaXJlY3RpdmVzLmRlZmF1bHRZYW1sLCB5YW1sKTtcbiAgICAgICAgdGhpcy50YWdzID0gT2JqZWN0LmFzc2lnbih7fSwgRGlyZWN0aXZlcy5kZWZhdWx0VGFncywgdGFncyk7XG4gICAgfVxuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCBjb3B5ID0gbmV3IERpcmVjdGl2ZXModGhpcy55YW1sLCB0aGlzLnRhZ3MpO1xuICAgICAgICBjb3B5LmRvY1N0YXJ0ID0gdGhpcy5kb2NTdGFydDtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIER1cmluZyBwYXJzaW5nLCBnZXQgYSBEaXJlY3RpdmVzIGluc3RhbmNlIGZvciB0aGUgY3VycmVudCBkb2N1bWVudCBhbmRcbiAgICAgKiB1cGRhdGUgdGhlIHN0cmVhbSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgdmVyc2lvbidzIHNwZWMuXG4gICAgICovXG4gICAgYXREb2N1bWVudCgpIHtcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IERpcmVjdGl2ZXModGhpcy55YW1sLCB0aGlzLnRhZ3MpO1xuICAgICAgICBzd2l0Y2ggKHRoaXMueWFtbC52ZXJzaW9uKSB7XG4gICAgICAgICAgICBjYXNlICcxLjEnOlxuICAgICAgICAgICAgICAgIHRoaXMuYXROZXh0RG9jdW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMS4yJzpcbiAgICAgICAgICAgICAgICB0aGlzLmF0TmV4dERvY3VtZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy55YW1sID0ge1xuICAgICAgICAgICAgICAgICAgICBleHBsaWNpdDogRGlyZWN0aXZlcy5kZWZhdWx0WWFtbC5leHBsaWNpdCxcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzEuMidcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMudGFncyA9IE9iamVjdC5hc3NpZ24oe30sIERpcmVjdGl2ZXMuZGVmYXVsdFRhZ3MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBvbkVycm9yIC0gTWF5IGJlIGNhbGxlZCBldmVuIGlmIHRoZSBhY3Rpb24gd2FzIHN1Y2Nlc3NmdWxcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzc1xuICAgICAqL1xuICAgIGFkZChsaW5lLCBvbkVycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLmF0TmV4dERvY3VtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnlhbWwgPSB7IGV4cGxpY2l0OiBEaXJlY3RpdmVzLmRlZmF1bHRZYW1sLmV4cGxpY2l0LCB2ZXJzaW9uOiAnMS4xJyB9O1xuICAgICAgICAgICAgdGhpcy50YWdzID0gT2JqZWN0LmFzc2lnbih7fSwgRGlyZWN0aXZlcy5kZWZhdWx0VGFncyk7XG4gICAgICAgICAgICB0aGlzLmF0TmV4dERvY3VtZW50ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFydHMgPSBsaW5lLnRyaW0oKS5zcGxpdCgvWyBcXHRdKy8pO1xuICAgICAgICBjb25zdCBuYW1lID0gcGFydHMuc2hpZnQoKTtcbiAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICBjYXNlICclVEFHJzoge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcigwLCAnJVRBRyBkaXJlY3RpdmUgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSB0d28gcGFydHMnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IFtoYW5kbGUsIHByZWZpeF0gPSBwYXJ0cztcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3NbaGFuZGxlXSA9IHByZWZpeDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJyVZQU1MJzoge1xuICAgICAgICAgICAgICAgIHRoaXMueWFtbC5leHBsaWNpdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKDAsICclWUFNTCBkaXJlY3RpdmUgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSBvbmUgcGFydCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IFt2ZXJzaW9uXSA9IHBhcnRzO1xuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09PSAnMS4xJyB8fCB2ZXJzaW9uID09PSAnMS4yJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnlhbWwudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNWYWxpZCA9IC9eXFxkK1xcLlxcZCskLy50ZXN0KHZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKDYsIGBVbnN1cHBvcnRlZCBZQU1MIHZlcnNpb24gJHt2ZXJzaW9ufWAsIGlzVmFsaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBvbkVycm9yKDAsIGBVbmtub3duIGRpcmVjdGl2ZSAke25hbWV9YCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIGEgdGFnLCBtYXRjaGluZyBoYW5kbGVzIHRvIHRob3NlIGRlZmluZWQgaW4gJVRBRyBkaXJlY3RpdmVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZWQgdGFnLCB3aGljaCBtYXkgYWxzbyBiZSB0aGUgbm9uLXNwZWNpZmljIHRhZyBgJyEnYCBvciBhXG4gICAgICogICBgJyFsb2NhbCdgIHRhZywgb3IgYG51bGxgIGlmIHVucmVzb2x2YWJsZS5cbiAgICAgKi9cbiAgICB0YWdOYW1lKHNvdXJjZSwgb25FcnJvcikge1xuICAgICAgICBpZiAoc291cmNlID09PSAnIScpXG4gICAgICAgICAgICByZXR1cm4gJyEnOyAvLyBub24tc3BlY2lmaWMgdGFnXG4gICAgICAgIGlmIChzb3VyY2VbMF0gIT09ICchJykge1xuICAgICAgICAgICAgb25FcnJvcihgTm90IGEgdmFsaWQgdGFnOiAke3NvdXJjZX1gKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VbMV0gPT09ICc8Jykge1xuICAgICAgICAgICAgY29uc3QgdmVyYmF0aW0gPSBzb3VyY2Uuc2xpY2UoMiwgLTEpO1xuICAgICAgICAgICAgaWYgKHZlcmJhdGltID09PSAnIScgfHwgdmVyYmF0aW0gPT09ICchIScpIHtcbiAgICAgICAgICAgICAgICBvbkVycm9yKGBWZXJiYXRpbSB0YWdzIGFyZW4ndCByZXNvbHZlZCwgc28gJHtzb3VyY2V9IGlzIGludmFsaWQuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc291cmNlW3NvdXJjZS5sZW5ndGggLSAxXSAhPT0gJz4nKVxuICAgICAgICAgICAgICAgIG9uRXJyb3IoJ1ZlcmJhdGltIHRhZ3MgbXVzdCBlbmQgd2l0aCBhID4nKTtcbiAgICAgICAgICAgIHJldHVybiB2ZXJiYXRpbTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbLCBoYW5kbGUsIHN1ZmZpeF0gPSBzb3VyY2UubWF0Y2goL14oLiohKShbXiFdKikkLyk7XG4gICAgICAgIGlmICghc3VmZml4KVxuICAgICAgICAgICAgb25FcnJvcihgVGhlICR7c291cmNlfSB0YWcgaGFzIG5vIHN1ZmZpeGApO1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLnRhZ3NbaGFuZGxlXTtcbiAgICAgICAgaWYgKHByZWZpeClcbiAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyBkZWNvZGVVUklDb21wb25lbnQoc3VmZml4KTtcbiAgICAgICAgaWYgKGhhbmRsZSA9PT0gJyEnKVxuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTsgLy8gbG9jYWwgdGFnXG4gICAgICAgIG9uRXJyb3IoYENvdWxkIG5vdCByZXNvbHZlIHRhZzogJHtzb3VyY2V9YCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGZ1bGx5IHJlc29sdmVkIHRhZywgcmV0dXJucyBpdHMgcHJpbnRhYmxlIHN0cmluZyBmb3JtLFxuICAgICAqIHRha2luZyBpbnRvIGFjY291bnQgY3VycmVudCB0YWcgcHJlZml4ZXMgYW5kIGRlZmF1bHRzLlxuICAgICAqL1xuICAgIHRhZ1N0cmluZyh0YWcpIHtcbiAgICAgICAgZm9yIChjb25zdCBbaGFuZGxlLCBwcmVmaXhdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMudGFncykpIHtcbiAgICAgICAgICAgIGlmICh0YWcuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUgKyBlc2NhcGVUYWdOYW1lKHRhZy5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YWdbMF0gPT09ICchJyA/IHRhZyA6IGAhPCR7dGFnfT5gO1xuICAgIH1cbiAgICB0b1N0cmluZyhkb2MpIHtcbiAgICAgICAgY29uc3QgbGluZXMgPSB0aGlzLnlhbWwuZXhwbGljaXRcbiAgICAgICAgICAgID8gW2AlWUFNTCAke3RoaXMueWFtbC52ZXJzaW9uIHx8ICcxLjInfWBdXG4gICAgICAgICAgICA6IFtdO1xuICAgICAgICBjb25zdCB0YWdFbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGhpcy50YWdzKTtcbiAgICAgICAgbGV0IHRhZ05hbWVzO1xuICAgICAgICBpZiAoZG9jICYmIHRhZ0VudHJpZXMubGVuZ3RoID4gMCAmJiBpc05vZGUoZG9jLmNvbnRlbnRzKSkge1xuICAgICAgICAgICAgY29uc3QgdGFncyA9IHt9O1xuICAgICAgICAgICAgdmlzaXQoZG9jLmNvbnRlbnRzLCAoX2tleSwgbm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc05vZGUobm9kZSkgJiYgbm9kZS50YWcpXG4gICAgICAgICAgICAgICAgICAgIHRhZ3Nbbm9kZS50YWddID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGFnTmFtZXMgPSBPYmplY3Qua2V5cyh0YWdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0YWdOYW1lcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtoYW5kbGUsIHByZWZpeF0gb2YgdGFnRW50cmllcykge1xuICAgICAgICAgICAgaWYgKGhhbmRsZSA9PT0gJyEhJyAmJiBwcmVmaXggPT09ICd0YWc6eWFtbC5vcmcsMjAwMjonKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFkb2MgfHwgdGFnTmFtZXMuc29tZSh0biA9PiB0bi5zdGFydHNXaXRoKHByZWZpeCkpKVxuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goYCVUQUcgJHtoYW5kbGV9ICR7cHJlZml4fWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgICB9XG59XG5EaXJlY3RpdmVzLmRlZmF1bHRZYW1sID0geyBleHBsaWNpdDogZmFsc2UsIHZlcnNpb246ICcxLjInIH07XG5EaXJlY3RpdmVzLmRlZmF1bHRUYWdzID0geyAnISEnOiAndGFnOnlhbWwub3JnLDIwMDI6JyB9O1xuXG5leHBvcnQgeyBEaXJlY3RpdmVzIH07XG4iLCAiaW1wb3J0IHsgaXNTY2FsYXIsIGlzQ29sbGVjdGlvbiB9IGZyb20gJy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICcuLi92aXNpdC5qcyc7XG5cbi8qKlxuICogVmVyaWZ5IHRoYXQgdGhlIGlucHV0IHN0cmluZyBpcyBhIHZhbGlkIGFuY2hvci5cbiAqXG4gKiBXaWxsIHRocm93IG9uIGVycm9ycy5cbiAqL1xuZnVuY3Rpb24gYW5jaG9ySXNWYWxpZChhbmNob3IpIHtcbiAgICBpZiAoL1tcXHgwMC1cXHgxOVxccyxbXFxde31dLy50ZXN0KGFuY2hvcikpIHtcbiAgICAgICAgY29uc3Qgc2EgPSBKU09OLnN0cmluZ2lmeShhbmNob3IpO1xuICAgICAgICBjb25zdCBtc2cgPSBgQW5jaG9yIG11c3Qgbm90IGNvbnRhaW4gd2hpdGVzcGFjZSBvciBjb250cm9sIGNoYXJhY3RlcnM6ICR7c2F9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gYW5jaG9yTmFtZXMocm9vdCkge1xuICAgIGNvbnN0IGFuY2hvcnMgPSBuZXcgU2V0KCk7XG4gICAgdmlzaXQocm9vdCwge1xuICAgICAgICBWYWx1ZShfa2V5LCBub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5hbmNob3IpXG4gICAgICAgICAgICAgICAgYW5jaG9ycy5hZGQobm9kZS5hbmNob3IpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFuY2hvcnM7XG59XG4vKiogRmluZCBhIG5ldyBhbmNob3IgbmFtZSB3aXRoIHRoZSBnaXZlbiBgcHJlZml4YCBhbmQgYSBvbmUtaW5kZXhlZCBzdWZmaXguICovXG5mdW5jdGlvbiBmaW5kTmV3QW5jaG9yKHByZWZpeCwgZXhjbHVkZSkge1xuICAgIGZvciAobGV0IGkgPSAxOyB0cnVlOyArK2kpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGAke3ByZWZpeH0ke2l9YDtcbiAgICAgICAgaWYgKCFleGNsdWRlLmhhcyhuYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVBbmNob3JzKGRvYywgcHJlZml4KSB7XG4gICAgY29uc3QgYWxpYXNPYmplY3RzID0gW107XG4gICAgY29uc3Qgc291cmNlT2JqZWN0cyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgcHJldkFuY2hvcnMgPSBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICAgIG9uQW5jaG9yOiAoc291cmNlKSA9PiB7XG4gICAgICAgICAgICBhbGlhc09iamVjdHMucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKCFwcmV2QW5jaG9ycylcbiAgICAgICAgICAgICAgICBwcmV2QW5jaG9ycyA9IGFuY2hvck5hbWVzKGRvYyk7XG4gICAgICAgICAgICBjb25zdCBhbmNob3IgPSBmaW5kTmV3QW5jaG9yKHByZWZpeCwgcHJldkFuY2hvcnMpO1xuICAgICAgICAgICAgcHJldkFuY2hvcnMuYWRkKGFuY2hvcik7XG4gICAgICAgICAgICByZXR1cm4gYW5jaG9yO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2l0aCBjaXJjdWxhciByZWZlcmVuY2VzLCB0aGUgc291cmNlIG5vZGUgaXMgb25seSByZXNvbHZlZCBhZnRlciBhbGxcbiAgICAgICAgICogb2YgaXRzIGNoaWxkIG5vZGVzIGFyZS4gVGhpcyBpcyB3aHkgYW5jaG9ycyBhcmUgc2V0IG9ubHkgYWZ0ZXIgYWxsIG9mXG4gICAgICAgICAqIHRoZSBub2RlcyBoYXZlIGJlZW4gY3JlYXRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHNldEFuY2hvcnM6ICgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlIG9mIGFsaWFzT2JqZWN0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZiA9IHNvdXJjZU9iamVjdHMuZ2V0KHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWYgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgICAgIHJlZi5hbmNob3IgJiZcbiAgICAgICAgICAgICAgICAgICAgKGlzU2NhbGFyKHJlZi5ub2RlKSB8fCBpc0NvbGxlY3Rpb24ocmVmLm5vZGUpKSkge1xuICAgICAgICAgICAgICAgICAgICByZWYubm9kZS5hbmNob3IgPSByZWYuYW5jaG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ0ZhaWxlZCB0byByZXNvbHZlIHJlcGVhdGVkIG9iamVjdCAodGhpcyBzaG91bGQgbm90IGhhcHBlbiknKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3Iuc291cmNlID0gc291cmNlO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZU9iamVjdHNcbiAgICB9O1xufVxuXG5leHBvcnQgeyBhbmNob3JJc1ZhbGlkLCBhbmNob3JOYW1lcywgY3JlYXRlTm9kZUFuY2hvcnMsIGZpbmROZXdBbmNob3IgfTtcbiIsICJpbXBvcnQgeyBhbmNob3JJc1ZhbGlkIH0gZnJvbSAnLi4vZG9jL2FuY2hvcnMuanMnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICcuLi92aXNpdC5qcyc7XG5pbXBvcnQgeyBOb2RlQmFzZSwgQUxJQVMsIGlzQWxpYXMsIGlzQ29sbGVjdGlvbiwgaXNQYWlyIH0gZnJvbSAnLi9Ob2RlLmpzJztcblxuY2xhc3MgQWxpYXMgZXh0ZW5kcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgICAgIHN1cGVyKEFMSUFTKTtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndGFnJywge1xuICAgICAgICAgICAgc2V0KCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxpYXMgbm9kZXMgY2Fubm90IGhhdmUgdGFncycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSB0aGUgdmFsdWUgb2YgdGhpcyBhbGlhcyB3aXRoaW4gYGRvY2AsIGZpbmRpbmcgdGhlIGxhc3RcbiAgICAgKiBpbnN0YW5jZSBvZiB0aGUgYHNvdXJjZWAgYW5jaG9yIGJlZm9yZSB0aGlzIG5vZGUuXG4gICAgICovXG4gICAgcmVzb2x2ZShkb2MpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gdW5kZWZpbmVkO1xuICAgICAgICB2aXNpdChkb2MsIHtcbiAgICAgICAgICAgIE5vZGU6IChfa2V5LCBub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT09IHRoaXMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdC5CUkVBSztcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5hbmNob3IgPT09IHRoaXMuc291cmNlKVxuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIHRvSlNPTihfYXJnLCBjdHgpIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICByZXR1cm4geyBzb3VyY2U6IHRoaXMuc291cmNlIH07XG4gICAgICAgIGNvbnN0IHsgYW5jaG9ycywgZG9jLCBtYXhBbGlhc0NvdW50IH0gPSBjdHg7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMucmVzb2x2ZShkb2MpO1xuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gYFVucmVzb2x2ZWQgYWxpYXMgKHRoZSBhbmNob3IgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBhbGlhcyk6ICR7dGhpcy5zb3VyY2V9YDtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihtc2cpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhbmNob3JzLmdldChzb3VyY2UpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKCFkYXRhIHx8IGRhdGEucmVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdUaGlzIHNob3VsZCBub3QgaGFwcGVuOiBBbGlhcyBhbmNob3Igd2FzIG5vdCByZXNvbHZlZD8nO1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heEFsaWFzQ291bnQgPj0gMCkge1xuICAgICAgICAgICAgZGF0YS5jb3VudCArPSAxO1xuICAgICAgICAgICAgaWYgKGRhdGEuYWxpYXNDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICBkYXRhLmFsaWFzQ291bnQgPSBnZXRBbGlhc0NvdW50KGRvYywgc291cmNlLCBhbmNob3JzKTtcbiAgICAgICAgICAgIGlmIChkYXRhLmNvdW50ICogZGF0YS5hbGlhc0NvdW50ID4gbWF4QWxpYXNDb3VudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdFeGNlc3NpdmUgYWxpYXMgY291bnQgaW5kaWNhdGVzIGEgcmVzb3VyY2UgZXhoYXVzdGlvbiBhdHRhY2snO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhLnJlcztcbiAgICB9XG4gICAgdG9TdHJpbmcoY3R4LCBfb25Db21tZW50LCBfb25DaG9tcEtlZXApIHtcbiAgICAgICAgY29uc3Qgc3JjID0gYCoke3RoaXMuc291cmNlfWA7XG4gICAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgICAgIGFuY2hvcklzVmFsaWQodGhpcy5zb3VyY2UpO1xuICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLnZlcmlmeUFsaWFzT3JkZXIgJiYgIWN0eC5hbmNob3JzLmhhcyh0aGlzLnNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgVW5yZXNvbHZlZCBhbGlhcyAodGhlIGFuY2hvciBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGFsaWFzKTogJHt0aGlzLnNvdXJjZX1gO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN0eC5pbXBsaWNpdEtleSlcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7c3JjfSBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcmM7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0QWxpYXNDb3VudChkb2MsIG5vZGUsIGFuY2hvcnMpIHtcbiAgICBpZiAoaXNBbGlhcyhub2RlKSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBub2RlLnJlc29sdmUoZG9jKTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gYW5jaG9ycyAmJiBzb3VyY2UgJiYgYW5jaG9ycy5nZXQoc291cmNlKTtcbiAgICAgICAgcmV0dXJuIGFuY2hvciA/IGFuY2hvci5jb3VudCAqIGFuY2hvci5hbGlhc0NvdW50IDogMDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBub2RlLml0ZW1zKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gZ2V0QWxpYXNDb3VudChkb2MsIGl0ZW0sIGFuY2hvcnMpO1xuICAgICAgICAgICAgaWYgKGMgPiBjb3VudClcbiAgICAgICAgICAgICAgICBjb3VudCA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1BhaXIobm9kZSkpIHtcbiAgICAgICAgY29uc3Qga2MgPSBnZXRBbGlhc0NvdW50KGRvYywgbm9kZS5rZXksIGFuY2hvcnMpO1xuICAgICAgICBjb25zdCB2YyA9IGdldEFsaWFzQ291bnQoZG9jLCBub2RlLnZhbHVlLCBhbmNob3JzKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGtjLCB2Yyk7XG4gICAgfVxuICAgIHJldHVybiAxO1xufVxuXG5leHBvcnQgeyBBbGlhcyB9O1xuIiwgImltcG9ydCB7IGhhc0FuY2hvciB9IGZyb20gJy4vTm9kZS5qcyc7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgY29udmVydCBhbnkgbm9kZSBvciBpdHMgY29udGVudHMgdG8gbmF0aXZlIEphdmFTY3JpcHRcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5wdXQgdmFsdWVcbiAqIEBwYXJhbSBhcmcgLSBJZiBgdmFsdWVgIGRlZmluZXMgYSBgdG9KU09OKClgIG1ldGhvZCwgdXNlIHRoaXNcbiAqICAgYXMgaXRzIGZpcnN0IGFyZ3VtZW50XG4gKiBAcGFyYW0gY3R4IC0gQ29udmVyc2lvbiBjb250ZXh0LCBvcmlnaW5hbGx5IHNldCBpbiBEb2N1bWVudCN0b0pTKCkuIElmXG4gKiAgIGB7IGtlZXA6IHRydWUgfWAgaXMgbm90IHNldCwgb3V0cHV0IHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgSlNPTlxuICogICBzdHJpbmdpZmljYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHRvSlModmFsdWUsIGFyZywgY3R4KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtcmV0dXJuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgICByZXR1cm4gdmFsdWUubWFwKCh2LCBpKSA9PiB0b0pTKHYsIFN0cmluZyhpKSwgY3R4KSk7XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50b0pTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbFxuICAgICAgICBpZiAoIWN0eCB8fCAhaGFzQW5jaG9yKHZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0pTT04oYXJnLCBjdHgpO1xuICAgICAgICBjb25zdCBkYXRhID0geyBhbGlhc0NvdW50OiAwLCBjb3VudDogMSwgcmVzOiB1bmRlZmluZWQgfTtcbiAgICAgICAgY3R4LmFuY2hvcnMuc2V0KHZhbHVlLCBkYXRhKTtcbiAgICAgICAgY3R4Lm9uQ3JlYXRlID0gcmVzID0+IHtcbiAgICAgICAgICAgIGRhdGEucmVzID0gcmVzO1xuICAgICAgICAgICAgZGVsZXRlIGN0eC5vbkNyZWF0ZTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzID0gdmFsdWUudG9KU09OKGFyZywgY3R4KTtcbiAgICAgICAgaWYgKGN0eC5vbkNyZWF0ZSlcbiAgICAgICAgICAgIGN0eC5vbkNyZWF0ZShyZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyAmJiAhY3R4Py5rZWVwKVxuICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCB7IHRvSlMgfTtcbiIsICJpbXBvcnQgeyBOb2RlQmFzZSwgU0NBTEFSIH0gZnJvbSAnLi9Ob2RlLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5jb25zdCBpc1NjYWxhclZhbHVlID0gKHZhbHVlKSA9PiAhdmFsdWUgfHwgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKTtcbmNsYXNzIFNjYWxhciBleHRlbmRzIE5vZGVCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgICAgICBzdXBlcihTQ0FMQVIpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIHRvSlNPTihhcmcsIGN0eCkge1xuICAgICAgICByZXR1cm4gY3R4Py5rZWVwID8gdGhpcy52YWx1ZSA6IHRvSlModGhpcy52YWx1ZSwgYXJnLCBjdHgpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh0aGlzLnZhbHVlKTtcbiAgICB9XG59XG5TY2FsYXIuQkxPQ0tfRk9MREVEID0gJ0JMT0NLX0ZPTERFRCc7XG5TY2FsYXIuQkxPQ0tfTElURVJBTCA9ICdCTE9DS19MSVRFUkFMJztcblNjYWxhci5QTEFJTiA9ICdQTEFJTic7XG5TY2FsYXIuUVVPVEVfRE9VQkxFID0gJ1FVT1RFX0RPVUJMRSc7XG5TY2FsYXIuUVVPVEVfU0lOR0xFID0gJ1FVT1RFX1NJTkdMRSc7XG5cbmV4cG9ydCB7IFNjYWxhciwgaXNTY2FsYXJWYWx1ZSB9O1xuIiwgImltcG9ydCB7IEFsaWFzIH0gZnJvbSAnLi4vbm9kZXMvQWxpYXMuanMnO1xuaW1wb3J0IHsgaXNOb2RlLCBpc1BhaXIsIE1BUCwgU0VRLCBpc0RvY3VtZW50IH0gZnJvbSAnLi4vbm9kZXMvTm9kZS5qcyc7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi9ub2Rlcy9TY2FsYXIuanMnO1xuXG5jb25zdCBkZWZhdWx0VGFnUHJlZml4ID0gJ3RhZzp5YW1sLm9yZywyMDAyOic7XG5mdW5jdGlvbiBmaW5kVGFnT2JqZWN0KHZhbHVlLCB0YWdOYW1lLCB0YWdzKSB7XG4gICAgaWYgKHRhZ05hbWUpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0YWdzLmZpbHRlcih0ID0+IHQudGFnID09PSB0YWdOYW1lKTtcbiAgICAgICAgY29uc3QgdGFnT2JqID0gbWF0Y2guZmluZCh0ID0+ICF0LmZvcm1hdCkgPz8gbWF0Y2hbMF07XG4gICAgICAgIGlmICghdGFnT2JqKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWcgJHt0YWdOYW1lfSBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIHRhZ09iajtcbiAgICB9XG4gICAgcmV0dXJuIHRhZ3MuZmluZCh0ID0+IHQuaWRlbnRpZnk/Lih2YWx1ZSkgJiYgIXQuZm9ybWF0KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU5vZGUodmFsdWUsIHRhZ05hbWUsIGN0eCkge1xuICAgIGlmIChpc0RvY3VtZW50KHZhbHVlKSlcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5jb250ZW50cztcbiAgICBpZiAoaXNOb2RlKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIGlmIChpc1BhaXIodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IGN0eC5zY2hlbWFbTUFQXS5jcmVhdGVOb2RlPy4oY3R4LnNjaGVtYSwgbnVsbCwgY3R4KTtcbiAgICAgICAgbWFwLml0ZW1zLnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHxcbiAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIgfHxcbiAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuIHx8XG4gICAgICAgICh0eXBlb2YgQmlnSW50ID09PSAnZnVuY3Rpb24nICYmIHZhbHVlIGluc3RhbmNlb2YgQmlnSW50KSAvLyBub3Qgc3VwcG9ydGVkIGV2ZXJ5d2hlcmVcbiAgICApIHtcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXJpYWxpemVqc29ucHJvcGVydHlcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS52YWx1ZU9mKCk7XG4gICAgfVxuICAgIGNvbnN0IHsgYWxpYXNEdXBsaWNhdGVPYmplY3RzLCBvbkFuY2hvciwgb25UYWdPYmosIHNjaGVtYSwgc291cmNlT2JqZWN0cyB9ID0gY3R4O1xuICAgIC8vIERldGVjdCBkdXBsaWNhdGUgcmVmZXJlbmNlcyB0byB0aGUgc2FtZSBvYmplY3QgJiB1c2UgQWxpYXMgbm9kZXMgZm9yIGFsbFxuICAgIC8vIGFmdGVyIGZpcnN0LiBUaGUgYHJlZmAgd3JhcHBlciBhbGxvd3MgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgdG8gcmVzb2x2ZS5cbiAgICBsZXQgcmVmID0gdW5kZWZpbmVkO1xuICAgIGlmIChhbGlhc0R1cGxpY2F0ZU9iamVjdHMgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZWYgPSBzb3VyY2VPYmplY3RzLmdldCh2YWx1ZSk7XG4gICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgIGlmICghcmVmLmFuY2hvcilcbiAgICAgICAgICAgICAgICByZWYuYW5jaG9yID0gb25BbmNob3IodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBbGlhcyhyZWYuYW5jaG9yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlZiA9IHsgYW5jaG9yOiBudWxsLCBub2RlOiBudWxsIH07XG4gICAgICAgICAgICBzb3VyY2VPYmplY3RzLnNldCh2YWx1ZSwgcmVmKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodGFnTmFtZT8uc3RhcnRzV2l0aCgnISEnKSlcbiAgICAgICAgdGFnTmFtZSA9IGRlZmF1bHRUYWdQcmVmaXggKyB0YWdOYW1lLnNsaWNlKDIpO1xuICAgIGxldCB0YWdPYmogPSBmaW5kVGFnT2JqZWN0KHZhbHVlLCB0YWdOYW1lLCBzY2hlbWEudGFncyk7XG4gICAgaWYgKCF0YWdPYmopIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50b0pTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGxcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9KU09OKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gbmV3IFNjYWxhcih2YWx1ZSk7XG4gICAgICAgICAgICBpZiAocmVmKVxuICAgICAgICAgICAgICAgIHJlZi5ub2RlID0gbm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHRhZ09iaiA9XG4gICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE1hcFxuICAgICAgICAgICAgICAgID8gc2NoZW1hW01BUF1cbiAgICAgICAgICAgICAgICA6IFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodmFsdWUpXG4gICAgICAgICAgICAgICAgICAgID8gc2NoZW1hW1NFUV1cbiAgICAgICAgICAgICAgICAgICAgOiBzY2hlbWFbTUFQXTtcbiAgICB9XG4gICAgaWYgKG9uVGFnT2JqKSB7XG4gICAgICAgIG9uVGFnT2JqKHRhZ09iaik7XG4gICAgICAgIGRlbGV0ZSBjdHgub25UYWdPYmo7XG4gICAgfVxuICAgIGNvbnN0IG5vZGUgPSB0YWdPYmo/LmNyZWF0ZU5vZGVcbiAgICAgICAgPyB0YWdPYmouY3JlYXRlTm9kZShjdHguc2NoZW1hLCB2YWx1ZSwgY3R4KVxuICAgICAgICA6IG5ldyBTY2FsYXIodmFsdWUpO1xuICAgIGlmICh0YWdOYW1lKVxuICAgICAgICBub2RlLnRhZyA9IHRhZ05hbWU7XG4gICAgaWYgKHJlZilcbiAgICAgICAgcmVmLm5vZGUgPSBub2RlO1xuICAgIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgeyBjcmVhdGVOb2RlIH07XG4iLCAiaW1wb3J0IHsgY3JlYXRlTm9kZSB9IGZyb20gJy4uL2RvYy9jcmVhdGVOb2RlLmpzJztcbmltcG9ydCB7IE5vZGVCYXNlLCBpc05vZGUsIGlzUGFpciwgaXNDb2xsZWN0aW9uLCBpc1NjYWxhciB9IGZyb20gJy4vTm9kZS5qcyc7XG5cbmZ1bmN0aW9uIGNvbGxlY3Rpb25Gcm9tUGF0aChzY2hlbWEsIHBhdGgsIHZhbHVlKSB7XG4gICAgbGV0IHYgPSB2YWx1ZTtcbiAgICBmb3IgKGxldCBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICBjb25zdCBrID0gcGF0aFtpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBrID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKGspICYmIGsgPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgYSA9IFtdO1xuICAgICAgICAgICAgYVtrXSA9IHY7XG4gICAgICAgICAgICB2ID0gYTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHYgPSBuZXcgTWFwKFtbaywgdl1dKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlTm9kZSh2LCB1bmRlZmluZWQsIHtcbiAgICAgICAgYWxpYXNEdXBsaWNhdGVPYmplY3RzOiBmYWxzZSxcbiAgICAgICAga2VlcFVuZGVmaW5lZDogZmFsc2UsXG4gICAgICAgIG9uQW5jaG9yOiAoKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHBsZWFzZSByZXBvcnQgYSBidWcuJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgc291cmNlT2JqZWN0czogbmV3IE1hcCgpXG4gICAgfSk7XG59XG4vLyBUeXBlIGd1YXJkIGlzIGludGVudGlvbmFsbHkgYSBsaXR0bGUgd3Jvbmcgc28gYXMgdG8gYmUgbW9yZSB1c2VmdWwsXG4vLyBhcyBpdCBkb2VzIG5vdCBjb3ZlciB1bnR5cGFibGUgZW1wdHkgbm9uLXN0cmluZyBpdGVyYWJsZXMgKGUuZy4gW10pLlxuY29uc3QgaXNFbXB0eVBhdGggPSAocGF0aCkgPT4gcGF0aCA9PSBudWxsIHx8XG4gICAgKHR5cGVvZiBwYXRoID09PSAnb2JqZWN0JyAmJiAhIXBhdGhbU3ltYm9sLml0ZXJhdG9yXSgpLm5leHQoKS5kb25lKTtcbmNsYXNzIENvbGxlY3Rpb24gZXh0ZW5kcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodHlwZSwgc2NoZW1hKSB7XG4gICAgICAgIHN1cGVyKHR5cGUpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3NjaGVtYScsIHtcbiAgICAgICAgICAgIHZhbHVlOiBzY2hlbWEsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzY2hlbWEgLSBJZiBkZWZpbmVkLCBvdmVyd3JpdGVzIHRoZSBvcmlnaW5hbCdzIHNjaGVtYVxuICAgICAqL1xuICAgIGNsb25lKHNjaGVtYSkge1xuICAgICAgICBjb25zdCBjb3B5ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRoaXMpKTtcbiAgICAgICAgaWYgKHNjaGVtYSlcbiAgICAgICAgICAgIGNvcHkuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICBjb3B5Lml0ZW1zID0gY29weS5pdGVtcy5tYXAoaXQgPT4gaXNOb2RlKGl0KSB8fCBpc1BhaXIoaXQpID8gaXQuY2xvbmUoc2NoZW1hKSA6IGl0KTtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2UpXG4gICAgICAgICAgICBjb3B5LnJhbmdlID0gdGhpcy5yYW5nZS5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHZhbHVlIHRvIHRoZSBjb2xsZWN0aW9uLiBGb3IgYCEhbWFwYCBhbmQgYCEhb21hcGAgdGhlIHZhbHVlIG11c3RcbiAgICAgKiBiZSBhIFBhaXIgaW5zdGFuY2Ugb3IgYSBgeyBrZXksIHZhbHVlIH1gIG9iamVjdCwgd2hpY2ggbWF5IG5vdCBoYXZlIGEga2V5XG4gICAgICogdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWFwLlxuICAgICAqL1xuICAgIGFkZEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSlcbiAgICAgICAgICAgIHRoaXMuYWRkKHZhbHVlKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChpc0NvbGxlY3Rpb24obm9kZSkpXG4gICAgICAgICAgICAgICAgbm9kZS5hZGRJbihyZXN0LCB2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlID09PSB1bmRlZmluZWQgJiYgdGhpcy5zY2hlbWEpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIHJlc3QsIHZhbHVlKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBZQU1MIGNvbGxlY3Rpb24gYXQgJHtrZXl9LiBSZW1haW5pbmcgcGF0aDogJHtyZXN0fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVsZXRlSW4ocGF0aCkge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgaWYgKGlzQ29sbGVjdGlvbihub2RlKSlcbiAgICAgICAgICAgIHJldHVybiBub2RlLmRlbGV0ZUluKHJlc3QpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFlBTUwgY29sbGVjdGlvbiBhdCAke2tleX0uIFJlbWFpbmluZyBwYXRoOiAke3Jlc3R9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaXRlbSBhdCBga2V5YCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLiBCeSBkZWZhdWx0IHVud3JhcHNcbiAgICAgKiBzY2FsYXIgdmFsdWVzIGZyb20gdGhlaXIgc3Vycm91bmRpbmcgbm9kZTsgdG8gZGlzYWJsZSBzZXQgYGtlZXBTY2FsYXJgIHRvXG4gICAgICogYHRydWVgIChjb2xsZWN0aW9ucyBhcmUgYWx3YXlzIHJldHVybmVkIGludGFjdCkuXG4gICAgICovXG4gICAgZ2V0SW4ocGF0aCwga2VlcFNjYWxhcikge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gIWtlZXBTY2FsYXIgJiYgaXNTY2FsYXIobm9kZSkgPyBub2RlLnZhbHVlIDogbm9kZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbihub2RlKSA/IG5vZGUuZ2V0SW4ocmVzdCwga2VlcFNjYWxhcikgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGhhc0FsbE51bGxWYWx1ZXMoYWxsb3dTY2FsYXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZXZlcnkobm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzUGFpcihub2RlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBuID0gbm9kZS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiAobiA9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgKGFsbG93U2NhbGFyICYmXG4gICAgICAgICAgICAgICAgICAgIGlzU2NhbGFyKG4pICYmXG4gICAgICAgICAgICAgICAgICAgIG4udmFsdWUgPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAhbi5jb21tZW50QmVmb3JlICYmXG4gICAgICAgICAgICAgICAgICAgICFuLmNvbW1lbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgIW4udGFnKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGNvbGxlY3Rpb24gaW5jbHVkZXMgYSB2YWx1ZSB3aXRoIHRoZSBrZXkgYGtleWAuXG4gICAgICovXG4gICAgaGFzSW4ocGF0aCkge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhcyhrZXkpO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbihub2RlKSA/IG5vZGUuaGFzSW4ocmVzdCkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgY29sbGVjdGlvbi4gRm9yIGAhIXNldGAsIGB2YWx1ZWAgbmVlZHMgdG8gYmUgYVxuICAgICAqIGJvb2xlYW4gdG8gYWRkL3JlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBzZXQuXG4gICAgICovXG4gICAgc2V0SW4ocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRoO1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKVxuICAgICAgICAgICAgICAgIG5vZGUuc2V0SW4ocmVzdCwgdmFsdWUpO1xuICAgICAgICAgICAgZWxzZSBpZiAobm9kZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuc2NoZW1hKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29sbGVjdGlvbkZyb21QYXRoKHRoaXMuc2NoZW1hLCByZXN0LCB2YWx1ZSkpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgWUFNTCBjb2xsZWN0aW9uIGF0ICR7a2V5fS4gUmVtYWluaW5nIHBhdGg6ICR7cmVzdH1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkNvbGxlY3Rpb24ubWF4Rmxvd1N0cmluZ1NpbmdsZUxpbmVMZW5ndGggPSA2MDtcblxuZXhwb3J0IHsgQ29sbGVjdGlvbiwgY29sbGVjdGlvbkZyb21QYXRoLCBpc0VtcHR5UGF0aCB9O1xuIiwgIi8qKlxuICogU3RyaW5naWZpZXMgYSBjb21tZW50LlxuICpcbiAqIEVtcHR5IGNvbW1lbnQgbGluZXMgYXJlIGxlZnQgZW1wdHksXG4gKiBsaW5lcyBjb25zaXN0aW5nIG9mIGEgc2luZ2xlIHNwYWNlIGFyZSByZXBsYWNlZCBieSBgI2AsXG4gKiBhbmQgYWxsIG90aGVyIGxpbmVzIGFyZSBwcmVmaXhlZCB3aXRoIGEgYCNgLlxuICovXG5jb25zdCBzdHJpbmdpZnlDb21tZW50ID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoL14oPyEkKSg/OiAkKT8vZ20sICcjJyk7XG5mdW5jdGlvbiBpbmRlbnRDb21tZW50KGNvbW1lbnQsIGluZGVudCkge1xuICAgIGlmICgvXlxcbiskLy50ZXN0KGNvbW1lbnQpKVxuICAgICAgICByZXR1cm4gY29tbWVudC5zdWJzdHJpbmcoMSk7XG4gICAgcmV0dXJuIGluZGVudCA/IGNvbW1lbnQucmVwbGFjZSgvXig/ISAqJCkvZ20sIGluZGVudCkgOiBjb21tZW50O1xufVxuY29uc3QgbGluZUNvbW1lbnQgPSAoc3RyLCBpbmRlbnQsIGNvbW1lbnQpID0+IHN0ci5lbmRzV2l0aCgnXFxuJylcbiAgICA/IGluZGVudENvbW1lbnQoY29tbWVudCwgaW5kZW50KVxuICAgIDogY29tbWVudC5pbmNsdWRlcygnXFxuJylcbiAgICAgICAgPyAnXFxuJyArIGluZGVudENvbW1lbnQoY29tbWVudCwgaW5kZW50KVxuICAgICAgICA6IChzdHIuZW5kc1dpdGgoJyAnKSA/ICcnIDogJyAnKSArIGNvbW1lbnQ7XG5cbmV4cG9ydCB7IGluZGVudENvbW1lbnQsIGxpbmVDb21tZW50LCBzdHJpbmdpZnlDb21tZW50IH07XG4iLCAiY29uc3QgRk9MRF9GTE9XID0gJ2Zsb3cnO1xuY29uc3QgRk9MRF9CTE9DSyA9ICdibG9jayc7XG5jb25zdCBGT0xEX1FVT1RFRCA9ICdxdW90ZWQnO1xuLyoqXG4gKiBUcmllcyB0byBrZWVwIGlucHV0IGF0IHVwIHRvIGBsaW5lV2lkdGhgIGNoYXJhY3RlcnMsIHNwbGl0dGluZyBvbmx5IG9uIHNwYWNlc1xuICogbm90IGZvbGxvd2VkIGJ5IG5ld2xpbmVzIG9yIHNwYWNlcyB1bmxlc3MgYG1vZGVgIGlzIGAncXVvdGVkJ2AuIExpbmVzIGFyZVxuICogdGVybWluYXRlZCB3aXRoIGBcXG5gIGFuZCBzdGFydGVkIHdpdGggYGluZGVudGAuXG4gKi9cbmZ1bmN0aW9uIGZvbGRGbG93TGluZXModGV4dCwgaW5kZW50LCBtb2RlID0gJ2Zsb3cnLCB7IGluZGVudEF0U3RhcnQsIGxpbmVXaWR0aCA9IDgwLCBtaW5Db250ZW50V2lkdGggPSAyMCwgb25Gb2xkLCBvbk92ZXJmbG93IH0gPSB7fSkge1xuICAgIGlmICghbGluZVdpZHRoIHx8IGxpbmVXaWR0aCA8IDApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGVuZFN0ZXAgPSBNYXRoLm1heCgxICsgbWluQ29udGVudFdpZHRoLCAxICsgbGluZVdpZHRoIC0gaW5kZW50Lmxlbmd0aCk7XG4gICAgaWYgKHRleHQubGVuZ3RoIDw9IGVuZFN0ZXApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGZvbGRzID0gW107XG4gICAgY29uc3QgZXNjYXBlZEZvbGRzID0ge307XG4gICAgbGV0IGVuZCA9IGxpbmVXaWR0aCAtIGluZGVudC5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBpbmRlbnRBdFN0YXJ0ID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoaW5kZW50QXRTdGFydCA+IGxpbmVXaWR0aCAtIE1hdGgubWF4KDIsIG1pbkNvbnRlbnRXaWR0aCkpXG4gICAgICAgICAgICBmb2xkcy5wdXNoKDApO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBlbmQgPSBsaW5lV2lkdGggLSBpbmRlbnRBdFN0YXJ0O1xuICAgIH1cbiAgICBsZXQgc3BsaXQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHByZXYgPSB1bmRlZmluZWQ7XG4gICAgbGV0IG92ZXJmbG93ID0gZmFsc2U7XG4gICAgbGV0IGkgPSAtMTtcbiAgICBsZXQgZXNjU3RhcnQgPSAtMTtcbiAgICBsZXQgZXNjRW5kID0gLTE7XG4gICAgaWYgKG1vZGUgPT09IEZPTERfQkxPQ0spIHtcbiAgICAgICAgaSA9IGNvbnN1bWVNb3JlSW5kZW50ZWRMaW5lcyh0ZXh0LCBpKTtcbiAgICAgICAgaWYgKGkgIT09IC0xKVxuICAgICAgICAgICAgZW5kID0gaSArIGVuZFN0ZXA7XG4gICAgfVxuICAgIGZvciAobGV0IGNoOyAoY2ggPSB0ZXh0WyhpICs9IDEpXSk7KSB7XG4gICAgICAgIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCAmJiBjaCA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBlc2NTdGFydCA9IGk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRleHRbaSArIDFdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gNTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVSc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gOTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXNjRW5kID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBpZiAobW9kZSA9PT0gRk9MRF9CTE9DSylcbiAgICAgICAgICAgICAgICBpID0gY29uc3VtZU1vcmVJbmRlbnRlZExpbmVzKHRleHQsIGkpO1xuICAgICAgICAgICAgZW5kID0gaSArIGVuZFN0ZXA7XG4gICAgICAgICAgICBzcGxpdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJyAnICYmXG4gICAgICAgICAgICAgICAgcHJldiAmJlxuICAgICAgICAgICAgICAgIHByZXYgIT09ICcgJyAmJlxuICAgICAgICAgICAgICAgIHByZXYgIT09ICdcXG4nICYmXG4gICAgICAgICAgICAgICAgcHJldiAhPT0gJ1xcdCcpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGFjZSBzdXJyb3VuZGVkIGJ5IG5vbi1zcGFjZSBjYW4gYmUgcmVwbGFjZWQgd2l0aCBuZXdsaW5lICsgaW5kZW50XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRleHRbaSArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0ICYmIG5leHQgIT09ICcgJyAmJiBuZXh0ICE9PSAnXFxuJyAmJiBuZXh0ICE9PSAnXFx0JylcbiAgICAgICAgICAgICAgICAgICAgc3BsaXQgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgPj0gZW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvbGRzLnB1c2goc3BsaXQpO1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBzcGxpdCArIGVuZFN0ZXA7XG4gICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB3aGl0ZS1zcGFjZSBjb2xsZWN0ZWQgYXQgZW5kIG1heSBzdHJldGNoIHBhc3QgbGluZVdpZHRoXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChwcmV2ID09PSAnICcgfHwgcHJldiA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gdGV4dFsoaSArPSAxKV07XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3VudCBmb3IgbmV3bGluZSBlc2NhcGUsIGJ1dCBkb24ndCBicmVhayBwcmVjZWRpbmcgZXNjYXBlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGogPSBpID4gZXNjRW5kICsgMSA/IGkgLSAyIDogZXNjU3RhcnQgLSAxO1xuICAgICAgICAgICAgICAgICAgICAvLyBCYWlsIG91dCBpZiBsaW5lV2lkdGggJiBtaW5Db250ZW50V2lkdGggYXJlIHNob3J0ZXIgdGhhbiBhbiBlc2NhcGUgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIGlmIChlc2NhcGVkRm9sZHNbal0pXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgZm9sZHMucHVzaChqKTtcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZEZvbGRzW2pdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gaiArIGVuZFN0ZXA7XG4gICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwcmV2ID0gY2g7XG4gICAgfVxuICAgIGlmIChvdmVyZmxvdyAmJiBvbk92ZXJmbG93KVxuICAgICAgICBvbk92ZXJmbG93KCk7XG4gICAgaWYgKGZvbGRzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgaWYgKG9uRm9sZClcbiAgICAgICAgb25Gb2xkKCk7XG4gICAgbGV0IHJlcyA9IHRleHQuc2xpY2UoMCwgZm9sZHNbMF0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9sZHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgZm9sZCA9IGZvbGRzW2ldO1xuICAgICAgICBjb25zdCBlbmQgPSBmb2xkc1tpICsgMV0gfHwgdGV4dC5sZW5ndGg7XG4gICAgICAgIGlmIChmb2xkID09PSAwKVxuICAgICAgICAgICAgcmVzID0gYFxcbiR7aW5kZW50fSR7dGV4dC5zbGljZSgwLCBlbmQpfWA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKG1vZGUgPT09IEZPTERfUVVPVEVEICYmIGVzY2FwZWRGb2xkc1tmb2xkXSlcbiAgICAgICAgICAgICAgICByZXMgKz0gYCR7dGV4dFtmb2xkXX1cXFxcYDtcbiAgICAgICAgICAgIHJlcyArPSBgXFxuJHtpbmRlbnR9JHt0ZXh0LnNsaWNlKGZvbGQgKyAxLCBlbmQpfWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKlxuICogUHJlc3VtZXMgYGkgKyAxYCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lXG4gKiBAcmV0dXJucyBpbmRleCBvZiBsYXN0IG5ld2xpbmUgaW4gbW9yZS1pbmRlbnRlZCBibG9ja1xuICovXG5mdW5jdGlvbiBjb25zdW1lTW9yZUluZGVudGVkTGluZXModGV4dCwgaSkge1xuICAgIGxldCBjaCA9IHRleHRbaSArIDFdO1xuICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0Jykge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjaCA9IHRleHRbKGkgKz0gMSldO1xuICAgICAgICB9IHdoaWxlIChjaCAmJiBjaCAhPT0gJ1xcbicpO1xuICAgICAgICBjaCA9IHRleHRbaSArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gaTtcbn1cblxuZXhwb3J0IHsgRk9MRF9CTE9DSywgRk9MRF9GTE9XLCBGT0xEX1FVT1RFRCwgZm9sZEZsb3dMaW5lcyB9O1xuIiwgImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyBmb2xkRmxvd0xpbmVzLCBGT0xEX1FVT1RFRCwgRk9MRF9GTE9XLCBGT0xEX0JMT0NLIH0gZnJvbSAnLi9mb2xkRmxvd0xpbmVzLmpzJztcblxuY29uc3QgZ2V0Rm9sZE9wdGlvbnMgPSAoY3R4KSA9PiAoe1xuICAgIGluZGVudEF0U3RhcnQ6IGN0eC5pbmRlbnRBdFN0YXJ0LFxuICAgIGxpbmVXaWR0aDogY3R4Lm9wdGlvbnMubGluZVdpZHRoLFxuICAgIG1pbkNvbnRlbnRXaWR0aDogY3R4Lm9wdGlvbnMubWluQ29udGVudFdpZHRoXG59KTtcbi8vIEFsc28gY2hlY2tzIGZvciBsaW5lcyBzdGFydGluZyB3aXRoICUsIGFzIHBhcnNpbmcgdGhlIG91dHB1dCBhcyBZQU1MIDEuMSB3aWxsXG4vLyBwcmVzdW1lIHRoYXQncyBzdGFydGluZyBhIG5ldyBkb2N1bWVudC5cbmNvbnN0IGNvbnRhaW5zRG9jdW1lbnRNYXJrZXIgPSAoc3RyKSA9PiAvXiglfC0tLXxcXC5cXC5cXC4pL20udGVzdChzdHIpO1xuZnVuY3Rpb24gbGluZUxlbmd0aE92ZXJMaW1pdChzdHIsIGxpbmVXaWR0aCwgaW5kZW50TGVuZ3RoKSB7XG4gICAgaWYgKCFsaW5lV2lkdGggfHwgbGluZVdpZHRoIDwgMClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGxpbWl0ID0gbGluZVdpZHRoIC0gaW5kZW50TGVuZ3RoO1xuICAgIGNvbnN0IHN0ckxlbiA9IHN0ci5sZW5ndGg7XG4gICAgaWYgKHN0ckxlbiA8PSBsaW1pdClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwLCBzdGFydCA9IDA7IGkgPCBzdHJMZW47ICsraSkge1xuICAgICAgICBpZiAoc3RyW2ldID09PSAnXFxuJykge1xuICAgICAgICAgICAgaWYgKGkgLSBzdGFydCA+IGxpbWl0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIGlmIChzdHJMZW4gLSBzdGFydCA8PSBsaW1pdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBkb3VibGVRdW90ZWRTdHJpbmcodmFsdWUsIGN0eCkge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgaWYgKGN0eC5vcHRpb25zLmRvdWJsZVF1b3RlZEFzSlNPTilcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgY29uc3QgeyBpbXBsaWNpdEtleSB9ID0gY3R4O1xuICAgIGNvbnN0IG1pbk11bHRpTGluZUxlbmd0aCA9IGN0eC5vcHRpb25zLmRvdWJsZVF1b3RlZE1pbk11bHRpTGluZUxlbmd0aDtcbiAgICBjb25zdCBpbmRlbnQgPSBjdHguaW5kZW50IHx8IChjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSA/ICcgICcgOiAnJyk7XG4gICAgbGV0IHN0ciA9ICcnO1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDAsIGNoID0ganNvbltpXTsgY2g7IGNoID0ganNvblsrK2ldKSB7XG4gICAgICAgIGlmIChjaCA9PT0gJyAnICYmIGpzb25baSArIDFdID09PSAnXFxcXCcgJiYganNvbltpICsgMl0gPT09ICduJykge1xuICAgICAgICAgICAgLy8gc3BhY2UgYmVmb3JlIG5ld2xpbmUgbmVlZHMgdG8gYmUgZXNjYXBlZCB0byBub3QgYmUgZm9sZGVkXG4gICAgICAgICAgICBzdHIgKz0ganNvbi5zbGljZShzdGFydCwgaSkgKyAnXFxcXCAnO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgc3RhcnQgPSBpO1xuICAgICAgICAgICAgY2ggPSAnXFxcXCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoID09PSAnXFxcXCcpXG4gICAgICAgICAgICBzd2l0Y2ggKGpzb25baSArIDFdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBqc29uLnNsaWNlKHN0YXJ0LCBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBqc29uLnN1YnN0cihpICsgMiwgNCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMDAwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcMCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwMDcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxhJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDAwYic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXHYnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMDFiJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwODUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxOJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDBhMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXF8nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcyMDI4JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcTCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzIwMjknOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxQJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuc3Vic3RyKDAsIDIpID09PSAnMDAnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxceCcgKyBjb2RlLnN1YnN0cigyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGpzb24uc3Vic3RyKGksIDYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA1O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICduJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxpY2l0S2V5IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uW2kgKyAyXSA9PT0gJ1wiJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAganNvbi5sZW5ndGggPCBtaW5NdWx0aUxpbmVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGRpbmcgd2lsbCBlYXQgZmlyc3QgbmV3bGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGpzb24uc2xpY2Uoc3RhcnQsIGkpICsgJ1xcblxcbic7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoanNvbltpICsgMl0gPT09ICdcXFxcJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25baSArIDNdID09PSAnbicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uW2kgKyA0XSAhPT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxuJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gaW5kZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BhY2UgYWZ0ZXIgbmV3bGluZSBuZWVkcyB0byBiZSBlc2NhcGVkIHRvIG5vdCBiZSBmb2xkZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc29uW2kgKyAyXSA9PT0gJyAnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgc3RyID0gc3RhcnQgPyBzdHIgKyBqc29uLnNsaWNlKHN0YXJ0KSA6IGpzb247XG4gICAgcmV0dXJuIGltcGxpY2l0S2V5XG4gICAgICAgID8gc3RyXG4gICAgICAgIDogZm9sZEZsb3dMaW5lcyhzdHIsIGluZGVudCwgRk9MRF9RVU9URUQsIGdldEZvbGRPcHRpb25zKGN0eCkpO1xufVxuZnVuY3Rpb24gc2luZ2xlUXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpIHtcbiAgICBpZiAoY3R4Lm9wdGlvbnMuc2luZ2xlUXVvdGUgPT09IGZhbHNlIHx8XG4gICAgICAgIChjdHguaW1wbGljaXRLZXkgJiYgdmFsdWUuaW5jbHVkZXMoJ1xcbicpKSB8fFxuICAgICAgICAvWyBcXHRdXFxufFxcblsgXFx0XS8udGVzdCh2YWx1ZSkgLy8gc2luZ2xlIHF1b3RlZCBzdHJpbmcgY2FuJ3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYXJvdW5kIG5ld2xpbmVcbiAgICApXG4gICAgICAgIHJldHVybiBkb3VibGVRdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgY29uc3QgaW5kZW50ID0gY3R4LmluZGVudCB8fCAoY29udGFpbnNEb2N1bWVudE1hcmtlcih2YWx1ZSkgPyAnICAnIDogJycpO1xuICAgIGNvbnN0IHJlcyA9IFwiJ1wiICsgdmFsdWUucmVwbGFjZSgvJy9nLCBcIicnXCIpLnJlcGxhY2UoL1xcbisvZywgYCQmXFxuJHtpbmRlbnR9YCkgKyBcIidcIjtcbiAgICByZXR1cm4gY3R4LmltcGxpY2l0S2V5XG4gICAgICAgID8gcmVzXG4gICAgICAgIDogZm9sZEZsb3dMaW5lcyhyZXMsIGluZGVudCwgRk9MRF9GTE9XLCBnZXRGb2xkT3B0aW9ucyhjdHgpKTtcbn1cbmZ1bmN0aW9uIHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KSB7XG4gICAgY29uc3QgeyBzaW5nbGVRdW90ZSB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgbGV0IHFzO1xuICAgIGlmIChzaW5nbGVRdW90ZSA9PT0gZmFsc2UpXG4gICAgICAgIHFzID0gZG91YmxlUXVvdGVkU3RyaW5nO1xuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBoYXNEb3VibGUgPSB2YWx1ZS5pbmNsdWRlcygnXCInKTtcbiAgICAgICAgY29uc3QgaGFzU2luZ2xlID0gdmFsdWUuaW5jbHVkZXMoXCInXCIpO1xuICAgICAgICBpZiAoaGFzRG91YmxlICYmICFoYXNTaW5nbGUpXG4gICAgICAgICAgICBxcyA9IHNpbmdsZVF1b3RlZFN0cmluZztcbiAgICAgICAgZWxzZSBpZiAoaGFzU2luZ2xlICYmICFoYXNEb3VibGUpXG4gICAgICAgICAgICBxcyA9IGRvdWJsZVF1b3RlZFN0cmluZztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcXMgPSBzaW5nbGVRdW90ZSA/IHNpbmdsZVF1b3RlZFN0cmluZyA6IGRvdWJsZVF1b3RlZFN0cmluZztcbiAgICB9XG4gICAgcmV0dXJuIHFzKHZhbHVlLCBjdHgpO1xufVxuZnVuY3Rpb24gYmxvY2tTdHJpbmcoeyBjb21tZW50LCB0eXBlLCB2YWx1ZSB9LCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICBjb25zdCB7IGJsb2NrUXVvdGUsIGNvbW1lbnRTdHJpbmcsIGxpbmVXaWR0aCB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgLy8gMS4gQmxvY2sgY2FuJ3QgZW5kIGluIHdoaXRlc3BhY2UgdW5sZXNzIHRoZSBsYXN0IGxpbmUgaXMgbm9uLWVtcHR5LlxuICAgIC8vIDIuIFN0cmluZ3MgY29uc2lzdGluZyBvZiBvbmx5IHdoaXRlc3BhY2UgYXJlIGJlc3QgcmVuZGVyZWQgZXhwbGljaXRseS5cbiAgICBpZiAoIWJsb2NrUXVvdGUgfHwgL1xcbltcXHQgXSskLy50ZXN0KHZhbHVlKSB8fCAvXlxccyokLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gcXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCBpbmRlbnQgPSBjdHguaW5kZW50IHx8XG4gICAgICAgIChjdHguZm9yY2VCbG9ja0luZGVudCB8fCBjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSA/ICcgICcgOiAnJyk7XG4gICAgY29uc3QgbGl0ZXJhbCA9IGJsb2NrUXVvdGUgPT09ICdsaXRlcmFsJ1xuICAgICAgICA/IHRydWVcbiAgICAgICAgOiBibG9ja1F1b3RlID09PSAnZm9sZGVkJyB8fCB0eXBlID09PSBTY2FsYXIuQkxPQ0tfRk9MREVEXG4gICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICA6IHR5cGUgPT09IFNjYWxhci5CTE9DS19MSVRFUkFMXG4gICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgOiAhbGluZUxlbmd0aE92ZXJMaW1pdCh2YWx1ZSwgbGluZVdpZHRoLCBpbmRlbnQubGVuZ3RoKTtcbiAgICBpZiAoIXZhbHVlKVxuICAgICAgICByZXR1cm4gbGl0ZXJhbCA/ICd8XFxuJyA6ICc+XFxuJztcbiAgICAvLyBkZXRlcm1pbmUgY2hvbXBpbmcgZnJvbSB3aGl0ZXNwYWNlIGF0IHZhbHVlIGVuZFxuICAgIGxldCBjaG9tcDtcbiAgICBsZXQgZW5kU3RhcnQ7XG4gICAgZm9yIChlbmRTdGFydCA9IHZhbHVlLmxlbmd0aDsgZW5kU3RhcnQgPiAwOyAtLWVuZFN0YXJ0KSB7XG4gICAgICAgIGNvbnN0IGNoID0gdmFsdWVbZW5kU3RhcnQgLSAxXTtcbiAgICAgICAgaWYgKGNoICE9PSAnXFxuJyAmJiBjaCAhPT0gJ1xcdCcgJiYgY2ggIT09ICcgJylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsZXQgZW5kID0gdmFsdWUuc3Vic3RyaW5nKGVuZFN0YXJ0KTtcbiAgICBjb25zdCBlbmRObFBvcyA9IGVuZC5pbmRleE9mKCdcXG4nKTtcbiAgICBpZiAoZW5kTmxQb3MgPT09IC0xKSB7XG4gICAgICAgIGNob21wID0gJy0nOyAvLyBzdHJpcFxuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZSA9PT0gZW5kIHx8IGVuZE5sUG9zICE9PSBlbmQubGVuZ3RoIC0gMSkge1xuICAgICAgICBjaG9tcCA9ICcrJzsgLy8ga2VlcFxuICAgICAgICBpZiAob25DaG9tcEtlZXApXG4gICAgICAgICAgICBvbkNob21wS2VlcCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hvbXAgPSAnJzsgLy8gY2xpcFxuICAgIH1cbiAgICBpZiAoZW5kKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgLWVuZC5sZW5ndGgpO1xuICAgICAgICBpZiAoZW5kW2VuZC5sZW5ndGggLSAxXSA9PT0gJ1xcbicpXG4gICAgICAgICAgICBlbmQgPSBlbmQuc2xpY2UoMCwgLTEpO1xuICAgICAgICBlbmQgPSBlbmQucmVwbGFjZSgvXFxuKyg/IVxcbnwkKS9nLCBgJCYke2luZGVudH1gKTtcbiAgICB9XG4gICAgLy8gZGV0ZXJtaW5lIGluZGVudCBpbmRpY2F0b3IgZnJvbSB3aGl0ZXNwYWNlIGF0IHZhbHVlIHN0YXJ0XG4gICAgbGV0IHN0YXJ0V2l0aFNwYWNlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0RW5kO1xuICAgIGxldCBzdGFydE5sUG9zID0gLTE7XG4gICAgZm9yIChzdGFydEVuZCA9IDA7IHN0YXJ0RW5kIDwgdmFsdWUubGVuZ3RoOyArK3N0YXJ0RW5kKSB7XG4gICAgICAgIGNvbnN0IGNoID0gdmFsdWVbc3RhcnRFbmRdO1xuICAgICAgICBpZiAoY2ggPT09ICcgJylcbiAgICAgICAgICAgIHN0YXJ0V2l0aFNwYWNlID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICdcXG4nKVxuICAgICAgICAgICAgc3RhcnRObFBvcyA9IHN0YXJ0RW5kO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgbGV0IHN0YXJ0ID0gdmFsdWUuc3Vic3RyaW5nKDAsIHN0YXJ0TmxQb3MgPCBzdGFydEVuZCA/IHN0YXJ0TmxQb3MgKyAxIDogc3RhcnRFbmQpO1xuICAgIGlmIChzdGFydCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyhzdGFydC5sZW5ndGgpO1xuICAgICAgICBzdGFydCA9IHN0YXJ0LnJlcGxhY2UoL1xcbisvZywgYCQmJHtpbmRlbnR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGluZGVudFNpemUgPSBpbmRlbnQgPyAnMicgOiAnMSc7IC8vIHJvb3QgaXMgYXQgLTFcbiAgICBsZXQgaGVhZGVyID0gKGxpdGVyYWwgPyAnfCcgOiAnPicpICsgKHN0YXJ0V2l0aFNwYWNlID8gaW5kZW50U2l6ZSA6ICcnKSArIGNob21wO1xuICAgIGlmIChjb21tZW50KSB7XG4gICAgICAgIGhlYWRlciArPSAnICcgKyBjb21tZW50U3RyaW5nKGNvbW1lbnQucmVwbGFjZSgvID9bXFxyXFxuXSsvZywgJyAnKSk7XG4gICAgICAgIGlmIChvbkNvbW1lbnQpXG4gICAgICAgICAgICBvbkNvbW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKGxpdGVyYWwpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXG4rL2csIGAkJiR7aW5kZW50fWApO1xuICAgICAgICByZXR1cm4gYCR7aGVhZGVyfVxcbiR7aW5kZW50fSR7c3RhcnR9JHt2YWx1ZX0ke2VuZH1gO1xuICAgIH1cbiAgICB2YWx1ZSA9IHZhbHVlXG4gICAgICAgIC5yZXBsYWNlKC9cXG4rL2csICdcXG4kJicpXG4gICAgICAgIC5yZXBsYWNlKC8oPzpefFxcbikoW1xcdCBdLiopKD86KFtcXG5cXHQgXSopXFxuKD8hW1xcblxcdCBdKSk/L2csICckMSQyJykgLy8gbW9yZS1pbmRlbnRlZCBsaW5lcyBhcmVuJ3QgZm9sZGVkXG4gICAgICAgIC8vICAgICAgICAgICAgICAgIF4gbW9yZS1pbmQuIF4gZW1wdHkgICAgIF4gY2FwdHVyZSBuZXh0IGVtcHR5IGxpbmVzIG9ubHkgYXQgZW5kIG9mIGluZGVudFxuICAgICAgICAucmVwbGFjZSgvXFxuKy9nLCBgJCYke2luZGVudH1gKTtcbiAgICBjb25zdCBib2R5ID0gZm9sZEZsb3dMaW5lcyhgJHtzdGFydH0ke3ZhbHVlfSR7ZW5kfWAsIGluZGVudCwgRk9MRF9CTE9DSywgZ2V0Rm9sZE9wdGlvbnMoY3R4KSk7XG4gICAgcmV0dXJuIGAke2hlYWRlcn1cXG4ke2luZGVudH0ke2JvZHl9YDtcbn1cbmZ1bmN0aW9uIHBsYWluU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgIGNvbnN0IHsgdHlwZSwgdmFsdWUgfSA9IGl0ZW07XG4gICAgY29uc3QgeyBhY3R1YWxTdHJpbmcsIGltcGxpY2l0S2V5LCBpbmRlbnQsIGluRmxvdyB9ID0gY3R4O1xuICAgIGlmICgoaW1wbGljaXRLZXkgJiYgL1tcXG5bXFxde30sXS8udGVzdCh2YWx1ZSkpIHx8XG4gICAgICAgIChpbkZsb3cgJiYgL1tbXFxde30sXS8udGVzdCh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgfVxuICAgIGlmICghdmFsdWUgfHxcbiAgICAgICAgL15bXFxuXFx0ICxbXFxde30jJiohfD4nXCIlQGBdfF5bPy1dJHxeWz8tXVsgXFx0XXxbXFxuOl1bIFxcdF18WyBcXHRdXFxufFtcXG5cXHQgXSN8W1xcblxcdCA6XSQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIC8vIG5vdCBhbGxvd2VkOlxuICAgICAgICAvLyAtIGVtcHR5IHN0cmluZywgJy0nIG9yICc/J1xuICAgICAgICAvLyAtIHN0YXJ0IHdpdGggYW4gaW5kaWNhdG9yIGNoYXJhY3RlciAoZXhjZXB0IFs/Oi1dKSBvciAvWz8tXSAvXG4gICAgICAgIC8vIC0gJ1xcbiAnLCAnOiAnIG9yICcgXFxuJyBhbnl3aGVyZVxuICAgICAgICAvLyAtICcjJyBub3QgcHJlY2VkZWQgYnkgYSBub24tc3BhY2UgY2hhclxuICAgICAgICAvLyAtIGVuZCB3aXRoICcgJyBvciAnOidcbiAgICAgICAgcmV0dXJuIGltcGxpY2l0S2V5IHx8IGluRmxvdyB8fCAhdmFsdWUuaW5jbHVkZXMoJ1xcbicpXG4gICAgICAgICAgICA/IHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KVxuICAgICAgICAgICAgOiBibG9ja1N0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbiAgICBpZiAoIWltcGxpY2l0S2V5ICYmXG4gICAgICAgICFpbkZsb3cgJiZcbiAgICAgICAgdHlwZSAhPT0gU2NhbGFyLlBMQUlOICYmXG4gICAgICAgIHZhbHVlLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgICAvLyBXaGVyZSBhbGxvd2VkICYgdHlwZSBub3Qgc2V0IGV4cGxpY2l0bHksIHByZWZlciBibG9jayBzdHlsZSBmb3IgbXVsdGlsaW5lIHN0cmluZ3NcbiAgICAgICAgcmV0dXJuIGJsb2NrU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgfVxuICAgIGlmIChpbmRlbnQgPT09ICcnICYmIGNvbnRhaW5zRG9jdW1lbnRNYXJrZXIodmFsdWUpKSB7XG4gICAgICAgIGN0eC5mb3JjZUJsb2NrSW5kZW50ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGJsb2NrU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgfVxuICAgIGNvbnN0IHN0ciA9IHZhbHVlLnJlcGxhY2UoL1xcbisvZywgYCQmXFxuJHtpbmRlbnR9YCk7XG4gICAgLy8gVmVyaWZ5IHRoYXQgb3V0cHV0IHdpbGwgYmUgcGFyc2VkIGFzIGEgc3RyaW5nLCBhcyBlLmcuIHBsYWluIG51bWJlcnMgYW5kXG4gICAgLy8gYm9vbGVhbnMgZ2V0IHBhcnNlZCB3aXRoIHRob3NlIHR5cGVzIGluIHYxLjIgKGUuZy4gJzQyJywgJ3RydWUnICYgJzAuOWUtMycpLFxuICAgIC8vIGFuZCBvdGhlcnMgaW4gdjEuMS5cbiAgICBpZiAoYWN0dWFsU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRlc3QgPSAodGFnKSA9PiB0YWcuZGVmYXVsdCAmJiB0YWcudGFnICE9PSAndGFnOnlhbWwub3JnLDIwMDI6c3RyJyAmJiB0YWcudGVzdD8udGVzdChzdHIpO1xuICAgICAgICBjb25zdCB7IGNvbXBhdCwgdGFncyB9ID0gY3R4LmRvYy5zY2hlbWE7XG4gICAgICAgIGlmICh0YWdzLnNvbWUodGVzdCkgfHwgY29tcGF0Py5zb21lKHRlc3QpKVxuICAgICAgICAgICAgcmV0dXJuIHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KTtcbiAgICB9XG4gICAgcmV0dXJuIGltcGxpY2l0S2V5XG4gICAgICAgID8gc3RyXG4gICAgICAgIDogZm9sZEZsb3dMaW5lcyhzdHIsIGluZGVudCwgRk9MRF9GTE9XLCBnZXRGb2xkT3B0aW9ucyhjdHgpKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeVN0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICBjb25zdCB7IGltcGxpY2l0S2V5LCBpbkZsb3cgfSA9IGN0eDtcbiAgICBjb25zdCBzcyA9IHR5cGVvZiBpdGVtLnZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGl0ZW1cbiAgICAgICAgOiBPYmplY3QuYXNzaWduKHt9LCBpdGVtLCB7IHZhbHVlOiBTdHJpbmcoaXRlbS52YWx1ZSkgfSk7XG4gICAgbGV0IHsgdHlwZSB9ID0gaXRlbTtcbiAgICBpZiAodHlwZSAhPT0gU2NhbGFyLlFVT1RFX0RPVUJMRSkge1xuICAgICAgICAvLyBmb3JjZSBkb3VibGUgcXVvdGVzIG9uIGNvbnRyb2wgY2hhcmFjdGVycyAmIHVucGFpcmVkIHN1cnJvZ2F0ZXNcbiAgICAgICAgaWYgKC9bXFx4MDAtXFx4MDhcXHgwYi1cXHgxZlxceDdmLVxceDlmXFx1e0Q4MDB9LVxcdXtERkZGfV0vdS50ZXN0KHNzLnZhbHVlKSlcbiAgICAgICAgICAgIHR5cGUgPSBTY2FsYXIuUVVPVEVfRE9VQkxFO1xuICAgIH1cbiAgICBjb25zdCBfc3RyaW5naWZ5ID0gKF90eXBlKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoX3R5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyLkJMT0NLX0ZPTERFRDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyLkJMT0NLX0xJVEVSQUw6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGltcGxpY2l0S2V5IHx8IGluRmxvd1xuICAgICAgICAgICAgICAgICAgICA/IHF1b3RlZFN0cmluZyhzcy52YWx1ZSwgY3R4KSAvLyBibG9ja3MgYXJlIG5vdCB2YWxpZCBpbnNpZGUgZmxvdyBjb250YWluZXJzXG4gICAgICAgICAgICAgICAgICAgIDogYmxvY2tTdHJpbmcoc3MsIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5RVU9URV9ET1VCTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZVF1b3RlZFN0cmluZyhzcy52YWx1ZSwgY3R4KTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyLlFVT1RFX1NJTkdMRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gc2luZ2xlUXVvdGVkU3RyaW5nKHNzLnZhbHVlLCBjdHgpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXIuUExBSU46XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBsYWluU3RyaW5nKHNzLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgbGV0IHJlcyA9IF9zdHJpbmdpZnkodHlwZSk7XG4gICAgaWYgKHJlcyA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCB7IGRlZmF1bHRLZXlUeXBlLCBkZWZhdWx0U3RyaW5nVHlwZSB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHQgPSAoaW1wbGljaXRLZXkgJiYgZGVmYXVsdEtleVR5cGUpIHx8IGRlZmF1bHRTdHJpbmdUeXBlO1xuICAgICAgICByZXMgPSBfc3RyaW5naWZ5KHQpO1xuICAgICAgICBpZiAocmVzID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkZWZhdWx0IHN0cmluZyB0eXBlICR7dH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IHsgc3RyaW5naWZ5U3RyaW5nIH07XG4iLCAiaW1wb3J0IHsgYW5jaG9ySXNWYWxpZCB9IGZyb20gJy4uL2RvYy9hbmNob3JzLmpzJztcbmltcG9ydCB7IGlzUGFpciwgaXNBbGlhcywgaXNOb2RlLCBpc1NjYWxhciwgaXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vbm9kZXMvTm9kZS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlDb21tZW50IH0gZnJvbSAnLi9zdHJpbmdpZnlDb21tZW50LmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeVN0cmluZyB9IGZyb20gJy4vc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlU3RyaW5naWZ5Q29udGV4dChkb2MsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBvcHQgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgYmxvY2tRdW90ZTogdHJ1ZSxcbiAgICAgICAgY29tbWVudFN0cmluZzogc3RyaW5naWZ5Q29tbWVudCxcbiAgICAgICAgZGVmYXVsdEtleVR5cGU6IG51bGwsXG4gICAgICAgIGRlZmF1bHRTdHJpbmdUeXBlOiAnUExBSU4nLFxuICAgICAgICBkaXJlY3RpdmVzOiBudWxsLFxuICAgICAgICBkb3VibGVRdW90ZWRBc0pTT046IGZhbHNlLFxuICAgICAgICBkb3VibGVRdW90ZWRNaW5NdWx0aUxpbmVMZW5ndGg6IDQwLFxuICAgICAgICBmYWxzZVN0cjogJ2ZhbHNlJyxcbiAgICAgICAgaW5kZW50U2VxOiB0cnVlLFxuICAgICAgICBsaW5lV2lkdGg6IDgwLFxuICAgICAgICBtaW5Db250ZW50V2lkdGg6IDIwLFxuICAgICAgICBudWxsU3RyOiAnbnVsbCcsXG4gICAgICAgIHNpbXBsZUtleXM6IGZhbHNlLFxuICAgICAgICBzaW5nbGVRdW90ZTogbnVsbCxcbiAgICAgICAgdHJ1ZVN0cjogJ3RydWUnLFxuICAgICAgICB2ZXJpZnlBbGlhc09yZGVyOiB0cnVlXG4gICAgfSwgZG9jLnNjaGVtYS50b1N0cmluZ09wdGlvbnMsIG9wdGlvbnMpO1xuICAgIGxldCBpbkZsb3c7XG4gICAgc3dpdGNoIChvcHQuY29sbGVjdGlvblN0eWxlKSB7XG4gICAgICAgIGNhc2UgJ2Jsb2NrJzpcbiAgICAgICAgICAgIGluRmxvdyA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Zsb3cnOlxuICAgICAgICAgICAgaW5GbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaW5GbG93ID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYW5jaG9yczogbmV3IFNldCgpLFxuICAgICAgICBkb2MsXG4gICAgICAgIGluZGVudDogJycsXG4gICAgICAgIGluZGVudFN0ZXA6IHR5cGVvZiBvcHQuaW5kZW50ID09PSAnbnVtYmVyJyA/ICcgJy5yZXBlYXQob3B0LmluZGVudCkgOiAnICAnLFxuICAgICAgICBpbkZsb3csXG4gICAgICAgIG9wdGlvbnM6IG9wdFxuICAgIH07XG59XG5mdW5jdGlvbiBnZXRUYWdPYmplY3QodGFncywgaXRlbSkge1xuICAgIGlmIChpdGVtLnRhZykge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHRhZ3MuZmlsdGVyKHQgPT4gdC50YWcgPT09IGl0ZW0udGFnKTtcbiAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2guZmluZCh0ID0+IHQuZm9ybWF0ID09PSBpdGVtLmZvcm1hdCkgPz8gbWF0Y2hbMF07XG4gICAgfVxuICAgIGxldCB0YWdPYmogPSB1bmRlZmluZWQ7XG4gICAgbGV0IG9iajtcbiAgICBpZiAoaXNTY2FsYXIoaXRlbSkpIHtcbiAgICAgICAgb2JqID0gaXRlbS52YWx1ZTtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0YWdzLmZpbHRlcih0ID0+IHQuaWRlbnRpZnk/LihvYmopKTtcbiAgICAgICAgdGFnT2JqID1cbiAgICAgICAgICAgIG1hdGNoLmZpbmQodCA9PiB0LmZvcm1hdCA9PT0gaXRlbS5mb3JtYXQpID8/IG1hdGNoLmZpbmQodCA9PiAhdC5mb3JtYXQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgb2JqID0gaXRlbTtcbiAgICAgICAgdGFnT2JqID0gdGFncy5maW5kKHQgPT4gdC5ub2RlQ2xhc3MgJiYgb2JqIGluc3RhbmNlb2YgdC5ub2RlQ2xhc3MpO1xuICAgIH1cbiAgICBpZiAoIXRhZ09iaikge1xuICAgICAgICBjb25zdCBuYW1lID0gb2JqPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyB0eXBlb2Ygb2JqO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhZyBub3QgcmVzb2x2ZWQgZm9yICR7bmFtZX0gdmFsdWVgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhZ09iajtcbn1cbi8vIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdmFsdWUgc3RyaW5naWZpZXIgdG8gYWxsb3cgZm9yIGNpcmN1bGFyIGFuY2hvciByZWZzXG5mdW5jdGlvbiBzdHJpbmdpZnlQcm9wcyhub2RlLCB0YWdPYmosIHsgYW5jaG9ycywgZG9jIH0pIHtcbiAgICBpZiAoIWRvYy5kaXJlY3RpdmVzKVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgY29uc3QgcHJvcHMgPSBbXTtcbiAgICBjb25zdCBhbmNob3IgPSAoaXNTY2FsYXIobm9kZSkgfHwgaXNDb2xsZWN0aW9uKG5vZGUpKSAmJiBub2RlLmFuY2hvcjtcbiAgICBpZiAoYW5jaG9yICYmIGFuY2hvcklzVmFsaWQoYW5jaG9yKSkge1xuICAgICAgICBhbmNob3JzLmFkZChhbmNob3IpO1xuICAgICAgICBwcm9wcy5wdXNoKGAmJHthbmNob3J9YCk7XG4gICAgfVxuICAgIGNvbnN0IHRhZyA9IG5vZGUudGFnID8gbm9kZS50YWcgOiB0YWdPYmouZGVmYXVsdCA/IG51bGwgOiB0YWdPYmoudGFnO1xuICAgIGlmICh0YWcpXG4gICAgICAgIHByb3BzLnB1c2goZG9jLmRpcmVjdGl2ZXMudGFnU3RyaW5nKHRhZykpO1xuICAgIHJldHVybiBwcm9wcy5qb2luKCcgJyk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgaWYgKGlzUGFpcihpdGVtKSlcbiAgICAgICAgcmV0dXJuIGl0ZW0udG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICBpZiAoaXNBbGlhcyhpdGVtKSkge1xuICAgICAgICBpZiAoY3R4LmRvYy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0udG9TdHJpbmcoY3R4KTtcbiAgICAgICAgaWYgKGN0eC5yZXNvbHZlZEFsaWFzZXM/LmhhcyhpdGVtKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHN0cmluZ2lmeSBjaXJjdWxhciBzdHJ1Y3R1cmUgd2l0aG91dCBhbGlhcyBub2Rlc2ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGN0eC5yZXNvbHZlZEFsaWFzZXMpXG4gICAgICAgICAgICAgICAgY3R4LnJlc29sdmVkQWxpYXNlcy5hZGQoaXRlbSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY3R4LnJlc29sdmVkQWxpYXNlcyA9IG5ldyBTZXQoW2l0ZW1dKTtcbiAgICAgICAgICAgIGl0ZW0gPSBpdGVtLnJlc29sdmUoY3R4LmRvYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHRhZ09iaiA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBub2RlID0gaXNOb2RlKGl0ZW0pXG4gICAgICAgID8gaXRlbVxuICAgICAgICA6IGN0eC5kb2MuY3JlYXRlTm9kZShpdGVtLCB7IG9uVGFnT2JqOiBvID0+ICh0YWdPYmogPSBvKSB9KTtcbiAgICBpZiAoIXRhZ09iailcbiAgICAgICAgdGFnT2JqID0gZ2V0VGFnT2JqZWN0KGN0eC5kb2Muc2NoZW1hLnRhZ3MsIG5vZGUpO1xuICAgIGNvbnN0IHByb3BzID0gc3RyaW5naWZ5UHJvcHMobm9kZSwgdGFnT2JqLCBjdHgpO1xuICAgIGlmIChwcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICBjdHguaW5kZW50QXRTdGFydCA9IChjdHguaW5kZW50QXRTdGFydCA/PyAwKSArIHByb3BzLmxlbmd0aCArIDE7XG4gICAgY29uc3Qgc3RyID0gdHlwZW9mIHRhZ09iai5zdHJpbmdpZnkgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyB0YWdPYmouc3RyaW5naWZ5KG5vZGUsIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcClcbiAgICAgICAgOiBpc1NjYWxhcihub2RlKVxuICAgICAgICAgICAgPyBzdHJpbmdpZnlTdHJpbmcobm9kZSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKVxuICAgICAgICAgICAgOiBub2RlLnRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgaWYgKCFwcm9wcylcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICByZXR1cm4gaXNTY2FsYXIobm9kZSkgfHwgc3RyWzBdID09PSAneycgfHwgc3RyWzBdID09PSAnWydcbiAgICAgICAgPyBgJHtwcm9wc30gJHtzdHJ9YFxuICAgICAgICA6IGAke3Byb3BzfVxcbiR7Y3R4LmluZGVudH0ke3N0cn1gO1xufVxuXG5leHBvcnQgeyBjcmVhdGVTdHJpbmdpZnlDb250ZXh0LCBzdHJpbmdpZnkgfTtcbiIsICJpbXBvcnQgeyBpc0NvbGxlY3Rpb24sIGlzTm9kZSwgaXNTY2FsYXIsIGlzU2VxIH0gZnJvbSAnLi4vbm9kZXMvTm9kZS5qcyc7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuaW1wb3J0IHsgbGluZUNvbW1lbnQsIGluZGVudENvbW1lbnQgfSBmcm9tICcuL3N0cmluZ2lmeUNvbW1lbnQuanMnO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlQYWlyKHsga2V5LCB2YWx1ZSB9LCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICBjb25zdCB7IGFsbE51bGxWYWx1ZXMsIGRvYywgaW5kZW50LCBpbmRlbnRTdGVwLCBvcHRpb25zOiB7IGNvbW1lbnRTdHJpbmcsIGluZGVudFNlcSwgc2ltcGxlS2V5cyB9IH0gPSBjdHg7XG4gICAgbGV0IGtleUNvbW1lbnQgPSAoaXNOb2RlKGtleSkgJiYga2V5LmNvbW1lbnQpIHx8IG51bGw7XG4gICAgaWYgKHNpbXBsZUtleXMpIHtcbiAgICAgICAgaWYgKGtleUNvbW1lbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2l0aCBzaW1wbGUga2V5cywga2V5IG5vZGVzIGNhbm5vdCBoYXZlIGNvbW1lbnRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ29sbGVjdGlvbihrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSAnV2l0aCBzaW1wbGUga2V5cywgY29sbGVjdGlvbiBjYW5ub3QgYmUgdXNlZCBhcyBhIGtleSB2YWx1ZSc7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgZXhwbGljaXRLZXkgPSAhc2ltcGxlS2V5cyAmJlxuICAgICAgICAoIWtleSB8fFxuICAgICAgICAgICAgKGtleUNvbW1lbnQgJiYgdmFsdWUgPT0gbnVsbCAmJiAhY3R4LmluRmxvdykgfHxcbiAgICAgICAgICAgIGlzQ29sbGVjdGlvbihrZXkpIHx8XG4gICAgICAgICAgICAoaXNTY2FsYXIoa2V5KVxuICAgICAgICAgICAgICAgID8ga2V5LnR5cGUgPT09IFNjYWxhci5CTE9DS19GT0xERUQgfHwga2V5LnR5cGUgPT09IFNjYWxhci5CTE9DS19MSVRFUkFMXG4gICAgICAgICAgICAgICAgOiB0eXBlb2Yga2V5ID09PSAnb2JqZWN0JykpO1xuICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oe30sIGN0eCwge1xuICAgICAgICBhbGxOdWxsVmFsdWVzOiBmYWxzZSxcbiAgICAgICAgaW1wbGljaXRLZXk6ICFleHBsaWNpdEtleSAmJiAoc2ltcGxlS2V5cyB8fCAhYWxsTnVsbFZhbHVlcyksXG4gICAgICAgIGluZGVudDogaW5kZW50ICsgaW5kZW50U3RlcFxuICAgIH0pO1xuICAgIGxldCBrZXlDb21tZW50RG9uZSA9IGZhbHNlO1xuICAgIGxldCBjaG9tcEtlZXAgPSBmYWxzZTtcbiAgICBsZXQgc3RyID0gc3RyaW5naWZ5KGtleSwgY3R4LCAoKSA9PiAoa2V5Q29tbWVudERvbmUgPSB0cnVlKSwgKCkgPT4gKGNob21wS2VlcCA9IHRydWUpKTtcbiAgICBpZiAoIWV4cGxpY2l0S2V5ICYmICFjdHguaW5GbG93ICYmIHN0ci5sZW5ndGggPiAxMDI0KSB7XG4gICAgICAgIGlmIChzaW1wbGVLZXlzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXaXRoIHNpbXBsZSBrZXlzLCBzaW5nbGUgbGluZSBzY2FsYXIgbXVzdCBub3Qgc3BhbiBtb3JlIHRoYW4gMTAyNCBjaGFyYWN0ZXJzJyk7XG4gICAgICAgIGV4cGxpY2l0S2V5ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGN0eC5pbkZsb3cpIHtcbiAgICAgICAgaWYgKGFsbE51bGxWYWx1ZXMgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGtleUNvbW1lbnREb25lICYmIG9uQ29tbWVudClcbiAgICAgICAgICAgICAgICBvbkNvbW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiBzdHIgPT09ICcnID8gJz8nIDogZXhwbGljaXRLZXkgPyBgPyAke3N0cn1gIDogc3RyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKChhbGxOdWxsVmFsdWVzICYmICFzaW1wbGVLZXlzKSB8fCAodmFsdWUgPT0gbnVsbCAmJiBleHBsaWNpdEtleSkpIHtcbiAgICAgICAgc3RyID0gYD8gJHtzdHJ9YDtcbiAgICAgICAgaWYgKGtleUNvbW1lbnQgJiYgIWtleUNvbW1lbnREb25lKSB7XG4gICAgICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBjdHguaW5kZW50LCBjb21tZW50U3RyaW5nKGtleUNvbW1lbnQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaG9tcEtlZXAgJiYgb25DaG9tcEtlZXApXG4gICAgICAgICAgICBvbkNob21wS2VlcCgpO1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBpZiAoa2V5Q29tbWVudERvbmUpXG4gICAgICAgIGtleUNvbW1lbnQgPSBudWxsO1xuICAgIGlmIChleHBsaWNpdEtleSkge1xuICAgICAgICBpZiAoa2V5Q29tbWVudClcbiAgICAgICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGN0eC5pbmRlbnQsIGNvbW1lbnRTdHJpbmcoa2V5Q29tbWVudCkpO1xuICAgICAgICBzdHIgPSBgPyAke3N0cn1cXG4ke2luZGVudH06YDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN0ciA9IGAke3N0cn06YDtcbiAgICAgICAgaWYgKGtleUNvbW1lbnQpXG4gICAgICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBjdHguaW5kZW50LCBjb21tZW50U3RyaW5nKGtleUNvbW1lbnQpKTtcbiAgICB9XG4gICAgbGV0IHZjYiA9ICcnO1xuICAgIGxldCB2YWx1ZUNvbW1lbnQgPSBudWxsO1xuICAgIGlmIChpc05vZGUodmFsdWUpKSB7XG4gICAgICAgIGlmICh2YWx1ZS5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgIHZjYiA9ICdcXG4nO1xuICAgICAgICBpZiAodmFsdWUuY29tbWVudEJlZm9yZSkge1xuICAgICAgICAgICAgY29uc3QgY3MgPSBjb21tZW50U3RyaW5nKHZhbHVlLmNvbW1lbnRCZWZvcmUpO1xuICAgICAgICAgICAgdmNiICs9IGBcXG4ke2luZGVudENvbW1lbnQoY3MsIGN0eC5pbmRlbnQpfWA7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWVDb21tZW50ID0gdmFsdWUuY29tbWVudDtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICB2YWx1ZSA9IGRvYy5jcmVhdGVOb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgY3R4LmltcGxpY2l0S2V5ID0gZmFsc2U7XG4gICAgaWYgKCFleHBsaWNpdEtleSAmJiAha2V5Q29tbWVudCAmJiBpc1NjYWxhcih2YWx1ZSkpXG4gICAgICAgIGN0eC5pbmRlbnRBdFN0YXJ0ID0gc3RyLmxlbmd0aCArIDE7XG4gICAgY2hvbXBLZWVwID0gZmFsc2U7XG4gICAgaWYgKCFpbmRlbnRTZXEgJiZcbiAgICAgICAgaW5kZW50U3RlcC5sZW5ndGggPj0gMiAmJlxuICAgICAgICAhY3R4LmluRmxvdyAmJlxuICAgICAgICAhZXhwbGljaXRLZXkgJiZcbiAgICAgICAgaXNTZXEodmFsdWUpICYmXG4gICAgICAgICF2YWx1ZS5mbG93ICYmXG4gICAgICAgICF2YWx1ZS50YWcgJiZcbiAgICAgICAgIXZhbHVlLmFuY2hvcikge1xuICAgICAgICAvLyBJZiBpbmRlbnRTZXEgPT09IGZhbHNlLCBjb25zaWRlciAnLSAnIGFzIHBhcnQgb2YgaW5kZW50YXRpb24gd2hlcmUgcG9zc2libGVcbiAgICAgICAgY3R4LmluZGVudCA9IGN0eC5pbmRlbnQuc3Vic3RyKDIpO1xuICAgIH1cbiAgICBsZXQgdmFsdWVDb21tZW50RG9uZSA9IGZhbHNlO1xuICAgIGNvbnN0IHZhbHVlU3RyID0gc3RyaW5naWZ5KHZhbHVlLCBjdHgsICgpID0+ICh2YWx1ZUNvbW1lbnREb25lID0gdHJ1ZSksICgpID0+IChjaG9tcEtlZXAgPSB0cnVlKSk7XG4gICAgbGV0IHdzID0gJyAnO1xuICAgIGlmICh2Y2IgfHwga2V5Q29tbWVudCkge1xuICAgICAgICBpZiAodmFsdWVTdHIgPT09ICcnICYmICFjdHguaW5GbG93KVxuICAgICAgICAgICAgd3MgPSB2Y2IgPT09ICdcXG4nID8gJ1xcblxcbicgOiB2Y2I7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHdzID0gYCR7dmNifVxcbiR7Y3R4LmluZGVudH1gO1xuICAgIH1cbiAgICBlbHNlIGlmICghZXhwbGljaXRLZXkgJiYgaXNDb2xsZWN0aW9uKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBmbG93ID0gdmFsdWVTdHJbMF0gPT09ICdbJyB8fCB2YWx1ZVN0clswXSA9PT0gJ3snO1xuICAgICAgICBpZiAoIWZsb3cgfHwgdmFsdWVTdHIuaW5jbHVkZXMoJ1xcbicpKVxuICAgICAgICAgICAgd3MgPSBgXFxuJHtjdHguaW5kZW50fWA7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlU3RyID09PSAnJyB8fCB2YWx1ZVN0clswXSA9PT0gJ1xcbicpXG4gICAgICAgIHdzID0gJyc7XG4gICAgc3RyICs9IHdzICsgdmFsdWVTdHI7XG4gICAgaWYgKGN0eC5pbkZsb3cpIHtcbiAgICAgICAgaWYgKHZhbHVlQ29tbWVudERvbmUgJiYgb25Db21tZW50KVxuICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlQ29tbWVudCAmJiAhdmFsdWVDb21tZW50RG9uZSkge1xuICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBjdHguaW5kZW50LCBjb21tZW50U3RyaW5nKHZhbHVlQ29tbWVudCkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChjaG9tcEtlZXAgJiYgb25DaG9tcEtlZXApIHtcbiAgICAgICAgb25DaG9tcEtlZXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IHsgc3RyaW5naWZ5UGFpciB9O1xuIiwgImZ1bmN0aW9uIGRlYnVnKGxvZ0xldmVsLCAuLi5tZXNzYWdlcykge1xuICAgIGlmIChsb2dMZXZlbCA9PT0gJ2RlYnVnJylcbiAgICAgICAgY29uc29sZS5sb2coLi4ubWVzc2FnZXMpO1xufVxuZnVuY3Rpb24gd2Fybihsb2dMZXZlbCwgd2FybmluZykge1xuICAgIGlmIChsb2dMZXZlbCA9PT0gJ2RlYnVnJyB8fCBsb2dMZXZlbCA9PT0gJ3dhcm4nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbWl0V2FybmluZylcbiAgICAgICAgICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcod2FybmluZyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IGRlYnVnLCB3YXJuIH07XG4iLCAiaW1wb3J0IHsgd2FybiB9IGZyb20gJy4uL2xvZy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTdHJpbmdpZnlDb250ZXh0IH0gZnJvbSAnLi4vc3RyaW5naWZ5L3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgeyBpc0FsaWFzLCBpc1NlcSwgaXNTY2FsYXIsIGlzTWFwLCBpc05vZGUgfSBmcm9tICcuL05vZGUuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi9TY2FsYXIuanMnO1xuaW1wb3J0IHsgdG9KUyB9IGZyb20gJy4vdG9KUy5qcyc7XG5cbmNvbnN0IE1FUkdFX0tFWSA9ICc8PCc7XG5mdW5jdGlvbiBhZGRQYWlyVG9KU01hcChjdHgsIG1hcCwgeyBrZXksIHZhbHVlIH0pIHtcbiAgICBpZiAoY3R4Py5kb2Muc2NoZW1hLm1lcmdlICYmIGlzTWVyZ2VLZXkoa2V5KSkge1xuICAgICAgICB2YWx1ZSA9IGlzQWxpYXModmFsdWUpID8gdmFsdWUucmVzb2x2ZShjdHguZG9jKSA6IHZhbHVlO1xuICAgICAgICBpZiAoaXNTZXEodmFsdWUpKVxuICAgICAgICAgICAgZm9yIChjb25zdCBpdCBvZiB2YWx1ZS5pdGVtcylcbiAgICAgICAgICAgICAgICBtZXJnZVRvSlNNYXAoY3R4LCBtYXAsIGl0KTtcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0IG9mIHZhbHVlKVxuICAgICAgICAgICAgICAgIG1lcmdlVG9KU01hcChjdHgsIG1hcCwgaXQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBtZXJnZVRvSlNNYXAoY3R4LCBtYXAsIHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGpzS2V5ID0gdG9KUyhrZXksICcnLCBjdHgpO1xuICAgICAgICBpZiAobWFwIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBtYXAuc2V0KGpzS2V5LCB0b0pTKHZhbHVlLCBqc0tleSwgY3R4KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWFwIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICBtYXAuYWRkKGpzS2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZ0tleSA9IHN0cmluZ2lmeUtleShrZXksIGpzS2V5LCBjdHgpO1xuICAgICAgICAgICAgY29uc3QganNWYWx1ZSA9IHRvSlModmFsdWUsIHN0cmluZ0tleSwgY3R4KTtcbiAgICAgICAgICAgIGlmIChzdHJpbmdLZXkgaW4gbWFwKVxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYXAsIHN0cmluZ0tleSwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZToganNWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1hcFtzdHJpbmdLZXldID0ganNWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwO1xufVxuY29uc3QgaXNNZXJnZUtleSA9IChrZXkpID0+IGtleSA9PT0gTUVSR0VfS0VZIHx8XG4gICAgKGlzU2NhbGFyKGtleSkgJiZcbiAgICAgICAga2V5LnZhbHVlID09PSBNRVJHRV9LRVkgJiZcbiAgICAgICAgKCFrZXkudHlwZSB8fCBrZXkudHlwZSA9PT0gU2NhbGFyLlBMQUlOKSk7XG4vLyBJZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgbWVyZ2Uga2V5IGlzIGEgc2luZ2xlIG1hcHBpbmcgbm9kZSwgZWFjaCBvZlxuLy8gaXRzIGtleS92YWx1ZSBwYWlycyBpcyBpbnNlcnRlZCBpbnRvIHRoZSBjdXJyZW50IG1hcHBpbmcsIHVubGVzcyB0aGUga2V5XG4vLyBhbHJlYWR5IGV4aXN0cyBpbiBpdC4gSWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVyZ2Uga2V5IGlzIGFcbi8vIHNlcXVlbmNlLCB0aGVuIHRoaXMgc2VxdWVuY2UgaXMgZXhwZWN0ZWQgdG8gY29udGFpbiBtYXBwaW5nIG5vZGVzIGFuZCBlYWNoXG4vLyBvZiB0aGVzZSBub2RlcyBpcyBtZXJnZWQgaW4gdHVybiBhY2NvcmRpbmcgdG8gaXRzIG9yZGVyIGluIHRoZSBzZXF1ZW5jZS5cbi8vIEtleXMgaW4gbWFwcGluZyBub2RlcyBlYXJsaWVyIGluIHRoZSBzZXF1ZW5jZSBvdmVycmlkZSBrZXlzIHNwZWNpZmllZCBpblxuLy8gbGF0ZXIgbWFwcGluZyBub2Rlcy4gLS0gaHR0cDovL3lhbWwub3JnL3R5cGUvbWVyZ2UuaHRtbFxuZnVuY3Rpb24gbWVyZ2VUb0pTTWFwKGN0eCwgbWFwLCB2YWx1ZSkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGN0eCAmJiBpc0FsaWFzKHZhbHVlKSA/IHZhbHVlLnJlc29sdmUoY3R4LmRvYykgOiB2YWx1ZTtcbiAgICBpZiAoIWlzTWFwKHNvdXJjZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWVyZ2Ugc291cmNlcyBtdXN0IGJlIG1hcHMgb3IgbWFwIGFsaWFzZXMnKTtcbiAgICBjb25zdCBzcmNNYXAgPSBzb3VyY2UudG9KU09OKG51bGwsIGN0eCwgTWFwKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzcmNNYXApIHtcbiAgICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgaWYgKCFtYXAuaGFzKGtleSkpXG4gICAgICAgICAgICAgICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXAgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgIG1hcC5hZGQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1hcCwga2V5KSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1hcCwga2V5LCB7XG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlLZXkoa2V5LCBqc0tleSwgY3R4KSB7XG4gICAgaWYgKGpzS2V5ID09PSBudWxsKVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgaWYgKHR5cGVvZiBqc0tleSAhPT0gJ29iamVjdCcpXG4gICAgICAgIHJldHVybiBTdHJpbmcoanNLZXkpO1xuICAgIGlmIChpc05vZGUoa2V5KSAmJiBjdHggJiYgY3R4LmRvYykge1xuICAgICAgICBjb25zdCBzdHJDdHggPSBjcmVhdGVTdHJpbmdpZnlDb250ZXh0KGN0eC5kb2MsIHt9KTtcbiAgICAgICAgc3RyQ3R4LmFuY2hvcnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBjdHguYW5jaG9ycy5rZXlzKCkpXG4gICAgICAgICAgICBzdHJDdHguYW5jaG9ycy5hZGQobm9kZS5hbmNob3IpO1xuICAgICAgICBzdHJDdHguaW5GbG93ID0gdHJ1ZTtcbiAgICAgICAgc3RyQ3R4LmluU3RyaW5naWZ5S2V5ID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc3RyS2V5ID0ga2V5LnRvU3RyaW5nKHN0ckN0eCk7XG4gICAgICAgIGlmICghY3R4Lm1hcEtleVdhcm5lZCkge1xuICAgICAgICAgICAgbGV0IGpzb25TdHIgPSBKU09OLnN0cmluZ2lmeShzdHJLZXkpO1xuICAgICAgICAgICAgaWYgKGpzb25TdHIubGVuZ3RoID4gNDApXG4gICAgICAgICAgICAgICAganNvblN0ciA9IGpzb25TdHIuc3Vic3RyaW5nKDAsIDM2KSArICcuLi5cIic7XG4gICAgICAgICAgICB3YXJuKGN0eC5kb2Mub3B0aW9ucy5sb2dMZXZlbCwgYEtleXMgd2l0aCBjb2xsZWN0aW9uIHZhbHVlcyB3aWxsIGJlIHN0cmluZ2lmaWVkIGR1ZSB0byBKUyBPYmplY3QgcmVzdHJpY3Rpb25zOiAke2pzb25TdHJ9LiBTZXQgbWFwQXNNYXA6IHRydWUgdG8gdXNlIG9iamVjdCBrZXlzLmApO1xuICAgICAgICAgICAgY3R4Lm1hcEtleVdhcm5lZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cktleTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzS2V5KTtcbn1cblxuZXhwb3J0IHsgYWRkUGFpclRvSlNNYXAgfTtcbiIsICJpbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSAnLi4vZG9jL2NyZWF0ZU5vZGUuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5UGFpciB9IGZyb20gJy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlQYWlyLmpzJztcbmltcG9ydCB7IGFkZFBhaXJUb0pTTWFwIH0gZnJvbSAnLi9hZGRQYWlyVG9KU01hcC5qcyc7XG5pbXBvcnQgeyBOT0RFX1RZUEUsIFBBSVIsIGlzTm9kZSB9IGZyb20gJy4vTm9kZS5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhaXIoa2V5LCB2YWx1ZSwgY3R4KSB7XG4gICAgY29uc3QgayA9IGNyZWF0ZU5vZGUoa2V5LCB1bmRlZmluZWQsIGN0eCk7XG4gICAgY29uc3QgdiA9IGNyZWF0ZU5vZGUodmFsdWUsIHVuZGVmaW5lZCwgY3R4KTtcbiAgICByZXR1cm4gbmV3IFBhaXIoaywgdik7XG59XG5jbGFzcyBQYWlyIHtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlID0gbnVsbCkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTk9ERV9UWVBFLCB7IHZhbHVlOiBQQUlSIH0pO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBjbG9uZShzY2hlbWEpIHtcbiAgICAgICAgbGV0IHsga2V5LCB2YWx1ZSB9ID0gdGhpcztcbiAgICAgICAgaWYgKGlzTm9kZShrZXkpKVxuICAgICAgICAgICAga2V5ID0ga2V5LmNsb25lKHNjaGVtYSk7XG4gICAgICAgIGlmIChpc05vZGUodmFsdWUpKVxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5jbG9uZShzY2hlbWEpO1xuICAgICAgICByZXR1cm4gbmV3IFBhaXIoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHRvSlNPTihfLCBjdHgpIHtcbiAgICAgICAgY29uc3QgcGFpciA9IGN0eD8ubWFwQXNNYXAgPyBuZXcgTWFwKCkgOiB7fTtcbiAgICAgICAgcmV0dXJuIGFkZFBhaXJUb0pTTWFwKGN0eCwgcGFpciwgdGhpcyk7XG4gICAgfVxuICAgIHRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICByZXR1cm4gY3R4Py5kb2NcbiAgICAgICAgICAgID8gc3RyaW5naWZ5UGFpcih0aGlzLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApXG4gICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgUGFpciwgY3JlYXRlUGFpciB9O1xuIiwgImltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuLi9ub2Rlcy9Db2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IGlzTm9kZSwgaXNQYWlyIH0gZnJvbSAnLi4vbm9kZXMvTm9kZS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgeyBsaW5lQ29tbWVudCwgaW5kZW50Q29tbWVudCB9IGZyb20gJy4vc3RyaW5naWZ5Q29tbWVudC5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUNvbGxlY3Rpb24oY29sbGVjdGlvbiwgY3R4LCBvcHRpb25zKSB7XG4gICAgY29uc3QgZmxvdyA9IGN0eC5pbkZsb3cgPz8gY29sbGVjdGlvbi5mbG93O1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IGZsb3cgPyBzdHJpbmdpZnlGbG93Q29sbGVjdGlvbiA6IHN0cmluZ2lmeUJsb2NrQ29sbGVjdGlvbjtcbiAgICByZXR1cm4gc3RyaW5naWZ5KGNvbGxlY3Rpb24sIGN0eCwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlCbG9ja0NvbGxlY3Rpb24oeyBjb21tZW50LCBpdGVtcyB9LCBjdHgsIHsgYmxvY2tJdGVtUHJlZml4LCBmbG93Q2hhcnMsIGl0ZW1JbmRlbnQsIG9uQ2hvbXBLZWVwLCBvbkNvbW1lbnQgfSkge1xuICAgIGNvbnN0IHsgaW5kZW50LCBvcHRpb25zOiB7IGNvbW1lbnRTdHJpbmcgfSB9ID0gY3R4O1xuICAgIGNvbnN0IGl0ZW1DdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHsgaW5kZW50OiBpdGVtSW5kZW50LCB0eXBlOiBudWxsIH0pO1xuICAgIGxldCBjaG9tcEtlZXAgPSBmYWxzZTsgLy8gZmxhZyBmb3IgdGhlIHByZWNlZGluZyBub2RlJ3Mgc3RhdHVzXG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSBudWxsO1xuICAgICAgICBpZiAoaXNOb2RlKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAoIWNob21wS2VlcCAmJiBpdGVtLnNwYWNlQmVmb3JlKVxuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgYWRkQ29tbWVudEJlZm9yZShjdHgsIGxpbmVzLCBpdGVtLmNvbW1lbnRCZWZvcmUsIGNob21wS2VlcCk7XG4gICAgICAgICAgICBpZiAoaXRlbS5jb21tZW50KVxuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpdGVtLmNvbW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYWlyKGl0ZW0pKSB7XG4gICAgICAgICAgICBjb25zdCBpayA9IGlzTm9kZShpdGVtLmtleSkgPyBpdGVtLmtleSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoaWspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNob21wS2VlcCAmJiBpay5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgYWRkQ29tbWVudEJlZm9yZShjdHgsIGxpbmVzLCBpay5jb21tZW50QmVmb3JlLCBjaG9tcEtlZXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgICAgICBsZXQgc3RyID0gc3RyaW5naWZ5KGl0ZW0sIGl0ZW1DdHgsICgpID0+IChjb21tZW50ID0gbnVsbCksICgpID0+IChjaG9tcEtlZXAgPSB0cnVlKSk7XG4gICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgaXRlbUluZGVudCwgY29tbWVudFN0cmluZyhjb21tZW50KSk7XG4gICAgICAgIGlmIChjaG9tcEtlZXAgJiYgY29tbWVudClcbiAgICAgICAgICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgICAgICBsaW5lcy5wdXNoKGJsb2NrSXRlbVByZWZpeCArIHN0cik7XG4gICAgfVxuICAgIGxldCBzdHI7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzdHIgPSBmbG93Q2hhcnMuc3RhcnQgKyBmbG93Q2hhcnMuZW5kO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyID0gbGluZXNbMF07XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgICAgIHN0ciArPSBsaW5lID8gYFxcbiR7aW5kZW50fSR7bGluZX1gIDogJ1xcbic7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgc3RyICs9ICdcXG4nICsgaW5kZW50Q29tbWVudChjb21tZW50U3RyaW5nKGNvbW1lbnQpLCBpbmRlbnQpO1xuICAgICAgICBpZiAob25Db21tZW50KVxuICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNob21wS2VlcCAmJiBvbkNob21wS2VlcClcbiAgICAgICAgb25DaG9tcEtlZXAoKTtcbiAgICByZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5Rmxvd0NvbGxlY3Rpb24oeyBjb21tZW50LCBpdGVtcyB9LCBjdHgsIHsgZmxvd0NoYXJzLCBpdGVtSW5kZW50LCBvbkNvbW1lbnQgfSkge1xuICAgIGNvbnN0IHsgaW5kZW50LCBpbmRlbnRTdGVwLCBvcHRpb25zOiB7IGNvbW1lbnRTdHJpbmcgfSB9ID0gY3R4O1xuICAgIGl0ZW1JbmRlbnQgKz0gaW5kZW50U3RlcDtcbiAgICBjb25zdCBpdGVtQ3R4ID0gT2JqZWN0LmFzc2lnbih7fSwgY3R4LCB7XG4gICAgICAgIGluZGVudDogaXRlbUluZGVudCxcbiAgICAgICAgaW5GbG93OiB0cnVlLFxuICAgICAgICB0eXBlOiBudWxsXG4gICAgfSk7XG4gICAgbGV0IHJlcU5ld2xpbmUgPSBmYWxzZTtcbiAgICBsZXQgbGluZXNBdFZhbHVlID0gMDtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBsZXQgY29tbWVudCA9IG51bGw7XG4gICAgICAgIGlmIChpc05vZGUoaXRlbSkpIHtcbiAgICAgICAgICAgIGlmIChpdGVtLnNwYWNlQmVmb3JlKVxuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgYWRkQ29tbWVudEJlZm9yZShjdHgsIGxpbmVzLCBpdGVtLmNvbW1lbnRCZWZvcmUsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChpdGVtLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgY29tbWVudCA9IGl0ZW0uY29tbWVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1BhaXIoaXRlbSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlrID0gaXNOb2RlKGl0ZW0ua2V5KSA/IGl0ZW0ua2V5IDogbnVsbDtcbiAgICAgICAgICAgIGlmIChpaykge1xuICAgICAgICAgICAgICAgIGlmIChpay5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgYWRkQ29tbWVudEJlZm9yZShjdHgsIGxpbmVzLCBpay5jb21tZW50QmVmb3JlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlrLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIHJlcU5ld2xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXYgPSBpc05vZGUoaXRlbS52YWx1ZSkgPyBpdGVtLnZhbHVlIDogbnVsbDtcbiAgICAgICAgICAgIGlmIChpdikge1xuICAgICAgICAgICAgICAgIGlmIChpdi5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gaXYuY29tbWVudDtcbiAgICAgICAgICAgICAgICBpZiAoaXYuY29tbWVudEJlZm9yZSlcbiAgICAgICAgICAgICAgICAgICAgcmVxTmV3bGluZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpdGVtLnZhbHVlID09IG51bGwgJiYgaWsgJiYgaWsuY29tbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpay5jb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgcmVxTmV3bGluZSA9IHRydWU7XG4gICAgICAgIGxldCBzdHIgPSBzdHJpbmdpZnkoaXRlbSwgaXRlbUN0eCwgKCkgPT4gKGNvbW1lbnQgPSBudWxsKSk7XG4gICAgICAgIGlmIChpIDwgaXRlbXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgIHN0ciArPSAnLCc7XG4gICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgaXRlbUluZGVudCwgY29tbWVudFN0cmluZyhjb21tZW50KSk7XG4gICAgICAgIGlmICghcmVxTmV3bGluZSAmJiAobGluZXMubGVuZ3RoID4gbGluZXNBdFZhbHVlIHx8IHN0ci5pbmNsdWRlcygnXFxuJykpKVxuICAgICAgICAgICAgcmVxTmV3bGluZSA9IHRydWU7XG4gICAgICAgIGxpbmVzLnB1c2goc3RyKTtcbiAgICAgICAgbGluZXNBdFZhbHVlID0gbGluZXMubGVuZ3RoO1xuICAgIH1cbiAgICBsZXQgc3RyO1xuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gZmxvd0NoYXJzO1xuICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RhcnQgKyBlbmQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIXJlcU5ld2xpbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IGxpbmVzLnJlZHVjZSgoc3VtLCBsaW5lKSA9PiBzdW0gKyBsaW5lLmxlbmd0aCArIDIsIDIpO1xuICAgICAgICAgICAgcmVxTmV3bGluZSA9IGxlbiA+IENvbGxlY3Rpb24ubWF4Rmxvd1N0cmluZ1NpbmdsZUxpbmVMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcU5ld2xpbmUpIHtcbiAgICAgICAgICAgIHN0ciA9IHN0YXJ0O1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKVxuICAgICAgICAgICAgICAgIHN0ciArPSBsaW5lID8gYFxcbiR7aW5kZW50U3RlcH0ke2luZGVudH0ke2xpbmV9YCA6ICdcXG4nO1xuICAgICAgICAgICAgc3RyICs9IGBcXG4ke2luZGVudH0ke2VuZH1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RyID0gYCR7c3RhcnR9ICR7bGluZXMuam9pbignICcpfSAke2VuZH1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb21tZW50KSB7XG4gICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGNvbW1lbnRTdHJpbmcoY29tbWVudCksIGluZGVudCk7XG4gICAgICAgIGlmIChvbkNvbW1lbnQpXG4gICAgICAgICAgICBvbkNvbW1lbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cbmZ1bmN0aW9uIGFkZENvbW1lbnRCZWZvcmUoeyBpbmRlbnQsIG9wdGlvbnM6IHsgY29tbWVudFN0cmluZyB9IH0sIGxpbmVzLCBjb21tZW50LCBjaG9tcEtlZXApIHtcbiAgICBpZiAoY29tbWVudCAmJiBjaG9tcEtlZXApXG4gICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnJlcGxhY2UoL15cXG4rLywgJycpO1xuICAgIGlmIChjb21tZW50KSB7XG4gICAgICAgIGNvbnN0IGljID0gaW5kZW50Q29tbWVudChjb21tZW50U3RyaW5nKGNvbW1lbnQpLCBpbmRlbnQpO1xuICAgICAgICBsaW5lcy5wdXNoKGljLnRyaW1TdGFydCgpKTsgLy8gQXZvaWQgZG91YmxlIGluZGVudCBvbiBmaXJzdCBsaW5lXG4gICAgfVxufVxuXG5leHBvcnQgeyBzdHJpbmdpZnlDb2xsZWN0aW9uIH07XG4iLCAiaW1wb3J0IHsgc3RyaW5naWZ5Q29sbGVjdGlvbiB9IGZyb20gJy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlDb2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IGFkZFBhaXJUb0pTTWFwIH0gZnJvbSAnLi9hZGRQYWlyVG9KU01hcC5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnLi9Db2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IGlzUGFpciwgaXNTY2FsYXIsIE1BUCB9IGZyb20gJy4vTm9kZS5qcyc7XG5pbXBvcnQgeyBQYWlyIH0gZnJvbSAnLi9QYWlyLmpzJztcbmltcG9ydCB7IGlzU2NhbGFyVmFsdWUgfSBmcm9tICcuL1NjYWxhci5qcyc7XG5cbmZ1bmN0aW9uIGZpbmRQYWlyKGl0ZW1zLCBrZXkpIHtcbiAgICBjb25zdCBrID0gaXNTY2FsYXIoa2V5KSA/IGtleS52YWx1ZSA6IGtleTtcbiAgICBmb3IgKGNvbnN0IGl0IG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmIChpc1BhaXIoaXQpKSB7XG4gICAgICAgICAgICBpZiAoaXQua2V5ID09PSBrZXkgfHwgaXQua2V5ID09PSBrKVxuICAgICAgICAgICAgICAgIHJldHVybiBpdDtcbiAgICAgICAgICAgIGlmIChpc1NjYWxhcihpdC5rZXkpICYmIGl0LmtleS52YWx1ZSA9PT0gaylcbiAgICAgICAgICAgICAgICByZXR1cm4gaXQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbmNsYXNzIFlBTUxNYXAgZXh0ZW5kcyBDb2xsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIoTUFQLCBzY2hlbWEpO1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgdGFnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICd0YWc6eWFtbC5vcmcsMjAwMjptYXAnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgdmFsdWUgdG8gdGhlIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIC0gSWYgbm90IHNldCBgdHJ1ZWAsIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSBpbiB0aGVcbiAgICAgKiAgIGNvbGxlY3Rpb24gd2lsbCB0aHJvdy4gT3RoZXJ3aXNlLCBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyB2YWx1ZS5cbiAgICAgKi9cbiAgICBhZGQocGFpciwgb3ZlcndyaXRlKSB7XG4gICAgICAgIGxldCBfcGFpcjtcbiAgICAgICAgaWYgKGlzUGFpcihwYWlyKSlcbiAgICAgICAgICAgIF9wYWlyID0gcGFpcjtcbiAgICAgICAgZWxzZSBpZiAoIXBhaXIgfHwgdHlwZW9mIHBhaXIgIT09ICdvYmplY3QnIHx8ICEoJ2tleScgaW4gcGFpcikpIHtcbiAgICAgICAgICAgIC8vIEluIFR5cGVTY3JpcHQsIHRoaXMgbmV2ZXIgaGFwcGVucy5cbiAgICAgICAgICAgIF9wYWlyID0gbmV3IFBhaXIocGFpciwgcGFpcj8udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIF9wYWlyID0gbmV3IFBhaXIocGFpci5rZXksIHBhaXIudmFsdWUpO1xuICAgICAgICBjb25zdCBwcmV2ID0gZmluZFBhaXIodGhpcy5pdGVtcywgX3BhaXIua2V5KTtcbiAgICAgICAgY29uc3Qgc29ydEVudHJpZXMgPSB0aGlzLnNjaGVtYT8uc29ydE1hcEVudHJpZXM7XG4gICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICBpZiAoIW92ZXJ3cml0ZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEtleSAke19wYWlyLmtleX0gYWxyZWFkeSBzZXRgKTtcbiAgICAgICAgICAgIC8vIEZvciBzY2FsYXJzLCBrZWVwIHRoZSBvbGQgbm9kZSAmIGl0cyBjb21tZW50cyBhbmQgYW5jaG9yc1xuICAgICAgICAgICAgaWYgKGlzU2NhbGFyKHByZXYudmFsdWUpICYmIGlzU2NhbGFyVmFsdWUoX3BhaXIudmFsdWUpKVxuICAgICAgICAgICAgICAgIHByZXYudmFsdWUudmFsdWUgPSBfcGFpci52YWx1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBwcmV2LnZhbHVlID0gX3BhaXIudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc29ydEVudHJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLml0ZW1zLmZpbmRJbmRleChpdGVtID0+IHNvcnRFbnRyaWVzKF9wYWlyLCBpdGVtKSA8IDApO1xuICAgICAgICAgICAgaWYgKGkgPT09IC0xKVxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChfcGFpcik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaSwgMCwgX3BhaXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKF9wYWlyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgaWYgKCFpdClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZGVsID0gdGhpcy5pdGVtcy5zcGxpY2UodGhpcy5pdGVtcy5pbmRleE9mKGl0KSwgMSk7XG4gICAgICAgIHJldHVybiBkZWwubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgZ2V0KGtleSwga2VlcFNjYWxhcikge1xuICAgICAgICBjb25zdCBpdCA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBpdD8udmFsdWU7XG4gICAgICAgIHJldHVybiAoIWtlZXBTY2FsYXIgJiYgaXNTY2FsYXIobm9kZSkgPyBub2RlLnZhbHVlIDogbm9kZSkgPz8gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgfVxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYWRkKG5ldyBQYWlyKGtleSwgdmFsdWUpLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGN0eCAtIENvbnZlcnNpb24gY29udGV4dCwgb3JpZ2luYWxseSBzZXQgaW4gRG9jdW1lbnQjdG9KUygpXG4gICAgICogQHBhcmFtIHtDbGFzc30gVHlwZSAtIElmIHNldCwgZm9yY2VzIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIHR5cGVcbiAgICAgKiBAcmV0dXJucyBJbnN0YW5jZSBvZiBUeXBlLCBNYXAsIG9yIE9iamVjdFxuICAgICAqL1xuICAgIHRvSlNPTihfLCBjdHgsIFR5cGUpIHtcbiAgICAgICAgY29uc3QgbWFwID0gVHlwZSA/IG5ldyBUeXBlKCkgOiBjdHg/Lm1hcEFzTWFwID8gbmV3IE1hcCgpIDoge307XG4gICAgICAgIGlmIChjdHg/Lm9uQ3JlYXRlKVxuICAgICAgICAgICAgY3R4Lm9uQ3JlYXRlKG1hcCk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKVxuICAgICAgICAgICAgYWRkUGFpclRvSlNNYXAoY3R4LCBtYXAsIGl0ZW0pO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICB0b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoIWlzUGFpcihpdGVtKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hcCBpdGVtcyBtdXN0IGFsbCBiZSBwYWlyczsgZm91bmQgJHtKU09OLnN0cmluZ2lmeShpdGVtKX0gaW5zdGVhZGApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3R4LmFsbE51bGxWYWx1ZXMgJiYgdGhpcy5oYXNBbGxOdWxsVmFsdWVzKGZhbHNlKSlcbiAgICAgICAgICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oe30sIGN0eCwgeyBhbGxOdWxsVmFsdWVzOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gc3RyaW5naWZ5Q29sbGVjdGlvbih0aGlzLCBjdHgsIHtcbiAgICAgICAgICAgIGJsb2NrSXRlbVByZWZpeDogJycsXG4gICAgICAgICAgICBmbG93Q2hhcnM6IHsgc3RhcnQ6ICd7JywgZW5kOiAnfScgfSxcbiAgICAgICAgICAgIGl0ZW1JbmRlbnQ6IGN0eC5pbmRlbnQgfHwgJycsXG4gICAgICAgICAgICBvbkNob21wS2VlcCxcbiAgICAgICAgICAgIG9uQ29tbWVudFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFlBTUxNYXAsIGZpbmRQYWlyIH07XG4iLCAiaW1wb3J0IHsgaXNNYXAgfSBmcm9tICcuLi8uLi9ub2Rlcy9Ob2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZVBhaXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9QYWlyLmpzJztcbmltcG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MTWFwLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlTWFwKHNjaGVtYSwgb2JqLCBjdHgpIHtcbiAgICBjb25zdCB7IGtlZXBVbmRlZmluZWQsIHJlcGxhY2VyIH0gPSBjdHg7XG4gICAgY29uc3QgbWFwID0gbmV3IFlBTUxNYXAoc2NoZW1hKTtcbiAgICBjb25zdCBhZGQgPSAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgdmFsdWUgPSByZXBsYWNlci5jYWxsKG9iaiwga2V5LCB2YWx1ZSk7XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVwbGFjZXIpICYmICFyZXBsYWNlci5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCB8fCBrZWVwVW5kZWZpbmVkKVxuICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goY3JlYXRlUGFpcihrZXksIHZhbHVlLCBjdHgpKTtcbiAgICB9O1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb2JqKVxuICAgICAgICAgICAgYWRkKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSlcbiAgICAgICAgICAgIGFkZChrZXksIG9ialtrZXldKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuc29ydE1hcEVudHJpZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbWFwLml0ZW1zLnNvcnQoc2NoZW1hLnNvcnRNYXBFbnRyaWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbn1cbmNvbnN0IG1hcCA9IHtcbiAgICBjb2xsZWN0aW9uOiAnbWFwJyxcbiAgICBjcmVhdGVOb2RlOiBjcmVhdGVNYXAsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICBub2RlQ2xhc3M6IFlBTUxNYXAsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6bWFwJyxcbiAgICByZXNvbHZlKG1hcCwgb25FcnJvcikge1xuICAgICAgICBpZiAoIWlzTWFwKG1hcCkpXG4gICAgICAgICAgICBvbkVycm9yKCdFeHBlY3RlZCBhIG1hcHBpbmcgZm9yIHRoaXMgdGFnJyk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgbWFwIH07XG4iLCAiaW1wb3J0IHsgc3RyaW5naWZ5Q29sbGVjdGlvbiB9IGZyb20gJy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlDb2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuL0NvbGxlY3Rpb24uanMnO1xuaW1wb3J0IHsgU0VRLCBpc1NjYWxhciB9IGZyb20gJy4vTm9kZS5qcyc7XG5pbXBvcnQgeyBpc1NjYWxhclZhbHVlIH0gZnJvbSAnLi9TY2FsYXIuanMnO1xuaW1wb3J0IHsgdG9KUyB9IGZyb20gJy4vdG9KUy5qcyc7XG5cbmNsYXNzIFlBTUxTZXEgZXh0ZW5kcyBDb2xsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIoU0VRLCBzY2hlbWEpO1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgdGFnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICd0YWc6eWFtbC5vcmcsMjAwMjpzZXEnO1xuICAgIH1cbiAgICBhZGQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHZhbHVlIGZyb20gdGhlIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBga2V5YCBtdXN0IGNvbnRhaW4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyIGZvciB0aGlzIHRvIHN1Y2NlZWQuXG4gICAgICogSXQgbWF5IGJlIHdyYXBwZWQgaW4gYSBgU2NhbGFyYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICBjb25zdCBpZHggPSBhc0l0ZW1JbmRleChrZXkpO1xuICAgICAgICBpZiAodHlwZW9mIGlkeCAhPT0gJ251bWJlcicpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGRlbCA9IHRoaXMuaXRlbXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIHJldHVybiBkZWwubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgZ2V0KGtleSwga2VlcFNjYWxhcikge1xuICAgICAgICBjb25zdCBpZHggPSBhc0l0ZW1JbmRleChrZXkpO1xuICAgICAgICBpZiAodHlwZW9mIGlkeCAhPT0gJ251bWJlcicpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBpdCA9IHRoaXMuaXRlbXNbaWR4XTtcbiAgICAgICAgcmV0dXJuICFrZWVwU2NhbGFyICYmIGlzU2NhbGFyKGl0KSA/IGl0LnZhbHVlIDogaXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY29sbGVjdGlvbiBpbmNsdWRlcyBhIHZhbHVlIHdpdGggdGhlIGtleSBga2V5YC5cbiAgICAgKlxuICAgICAqIGBrZXlgIG11c3QgY29udGFpbiBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgZm9yIHRoaXMgdG8gc3VjY2VlZC5cbiAgICAgKiBJdCBtYXkgYmUgd3JhcHBlZCBpbiBhIGBTY2FsYXJgLlxuICAgICAqL1xuICAgIGhhcyhrZXkpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpZHggPT09ICdudW1iZXInICYmIGlkeCA8IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgaW4gdGhpcyBjb2xsZWN0aW9uLiBGb3IgYCEhc2V0YCwgYHZhbHVlYCBuZWVkcyB0byBiZSBhXG4gICAgICogYm9vbGVhbiB0byBhZGQvcmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIHNldC5cbiAgICAgKlxuICAgICAqIElmIGBrZXlgIGRvZXMgbm90IGNvbnRhaW4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyLCB0aGlzIHdpbGwgdGhyb3cuXG4gICAgICogSXQgbWF5IGJlIHdyYXBwZWQgaW4gYSBgU2NhbGFyYC5cbiAgICAgKi9cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBpZHggPSBhc0l0ZW1JbmRleChrZXkpO1xuICAgICAgICBpZiAodHlwZW9mIGlkeCAhPT0gJ251bWJlcicpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgdmFsaWQgaW5kZXgsIG5vdCAke2tleX0uYCk7XG4gICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLml0ZW1zW2lkeF07XG4gICAgICAgIGlmIChpc1NjYWxhcihwcmV2KSAmJiBpc1NjYWxhclZhbHVlKHZhbHVlKSlcbiAgICAgICAgICAgIHByZXYudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5pdGVtc1tpZHhdID0gdmFsdWU7XG4gICAgfVxuICAgIHRvSlNPTihfLCBjdHgpIHtcbiAgICAgICAgY29uc3Qgc2VxID0gW107XG4gICAgICAgIGlmIChjdHg/Lm9uQ3JlYXRlKVxuICAgICAgICAgICAgY3R4Lm9uQ3JlYXRlKHNlcSk7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMpXG4gICAgICAgICAgICBzZXEucHVzaCh0b0pTKGl0ZW0sIFN0cmluZyhpKyspLCBjdHgpKTtcbiAgICAgICAgcmV0dXJuIHNlcTtcbiAgICB9XG4gICAgdG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgICAgICByZXR1cm4gc3RyaW5naWZ5Q29sbGVjdGlvbih0aGlzLCBjdHgsIHtcbiAgICAgICAgICAgIGJsb2NrSXRlbVByZWZpeDogJy0gJyxcbiAgICAgICAgICAgIGZsb3dDaGFyczogeyBzdGFydDogJ1snLCBlbmQ6ICddJyB9LFxuICAgICAgICAgICAgaXRlbUluZGVudDogKGN0eC5pbmRlbnQgfHwgJycpICsgJyAgJyxcbiAgICAgICAgICAgIG9uQ2hvbXBLZWVwLFxuICAgICAgICAgICAgb25Db21tZW50XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzSXRlbUluZGV4KGtleSkge1xuICAgIGxldCBpZHggPSBpc1NjYWxhcihrZXkpID8ga2V5LnZhbHVlIDoga2V5O1xuICAgIGlmIChpZHggJiYgdHlwZW9mIGlkeCA9PT0gJ3N0cmluZycpXG4gICAgICAgIGlkeCA9IE51bWJlcihpZHgpO1xuICAgIHJldHVybiB0eXBlb2YgaWR4ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKGlkeCkgJiYgaWR4ID49IDBcbiAgICAgICAgPyBpZHhcbiAgICAgICAgOiBudWxsO1xufVxuXG5leHBvcnQgeyBZQU1MU2VxIH07XG4iLCAiaW1wb3J0IHsgY3JlYXRlTm9kZSB9IGZyb20gJy4uLy4uL2RvYy9jcmVhdGVOb2RlLmpzJztcbmltcG9ydCB7IGlzU2VxIH0gZnJvbSAnLi4vLi4vbm9kZXMvTm9kZS5qcyc7XG5pbXBvcnQgeyBZQU1MU2VxIH0gZnJvbSAnLi4vLi4vbm9kZXMvWUFNTFNlcS5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVNlcShzY2hlbWEsIG9iaiwgY3R4KSB7XG4gICAgY29uc3QgeyByZXBsYWNlciB9ID0gY3R4O1xuICAgIGNvbnN0IHNlcSA9IG5ldyBZQU1MU2VxKHNjaGVtYSk7XG4gICAgaWYgKG9iaiAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KG9iaikpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBmb3IgKGxldCBpdCBvZiBvYmopIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBvYmogaW5zdGFuY2VvZiBTZXQgPyBpdCA6IFN0cmluZyhpKyspO1xuICAgICAgICAgICAgICAgIGl0ID0gcmVwbGFjZXIuY2FsbChvYmosIGtleSwgaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VxLml0ZW1zLnB1c2goY3JlYXRlTm9kZShpdCwgdW5kZWZpbmVkLCBjdHgpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VxO1xufVxuY29uc3Qgc2VxID0ge1xuICAgIGNvbGxlY3Rpb246ICdzZXEnLFxuICAgIGNyZWF0ZU5vZGU6IGNyZWF0ZVNlcSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIG5vZGVDbGFzczogWUFNTFNlcSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpzZXEnLFxuICAgIHJlc29sdmUoc2VxLCBvbkVycm9yKSB7XG4gICAgICAgIGlmICghaXNTZXEoc2VxKSlcbiAgICAgICAgICAgIG9uRXJyb3IoJ0V4cGVjdGVkIGEgc2VxdWVuY2UgZm9yIHRoaXMgdGFnJyk7XG4gICAgICAgIHJldHVybiBzZXE7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgc2VxIH07XG4iLCAiaW1wb3J0IHsgc3RyaW5naWZ5U3RyaW5nIH0gZnJvbSAnLi4vLi4vc3RyaW5naWZ5L3N0cmluZ2lmeVN0cmluZy5qcyc7XG5cbmNvbnN0IHN0cmluZyA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicsXG4gICAgcmVzb2x2ZTogc3RyID0+IHN0cixcbiAgICBzdHJpbmdpZnkoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oeyBhY3R1YWxTdHJpbmc6IHRydWUgfSwgY3R4KTtcbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeVN0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbn07XG5cbmV4cG9ydCB7IHN0cmluZyB9O1xuIiwgImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5cbmNvbnN0IG51bGxUYWcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlID09IG51bGwsXG4gICAgY3JlYXRlTm9kZTogKCkgPT4gbmV3IFNjYWxhcihudWxsKSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm51bGwnLFxuICAgIHRlc3Q6IC9eKD86fnxbTm5ddWxsfE5VTEwpPyQvLFxuICAgIHJlc29sdmU6ICgpID0+IG5ldyBTY2FsYXIobnVsbCksXG4gICAgc3RyaW5naWZ5OiAoeyBzb3VyY2UgfSwgY3R4KSA9PiB0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJyAmJiBudWxsVGFnLnRlc3QudGVzdChzb3VyY2UpXG4gICAgICAgID8gc291cmNlXG4gICAgICAgIDogY3R4Lm9wdGlvbnMubnVsbFN0clxufTtcblxuZXhwb3J0IHsgbnVsbFRhZyB9O1xuIiwgImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5cbmNvbnN0IGJvb2xUYWcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsXG4gICAgdGVzdDogL14oPzpbVHRdcnVlfFRSVUV8W0ZmXWFsc2V8RkFMU0UpJC8sXG4gICAgcmVzb2x2ZTogc3RyID0+IG5ldyBTY2FsYXIoc3RyWzBdID09PSAndCcgfHwgc3RyWzBdID09PSAnVCcpLFxuICAgIHN0cmluZ2lmeSh7IHNvdXJjZSwgdmFsdWUgfSwgY3R4KSB7XG4gICAgICAgIGlmIChzb3VyY2UgJiYgYm9vbFRhZy50ZXN0LnRlc3Qoc291cmNlKSkge1xuICAgICAgICAgICAgY29uc3Qgc3YgPSBzb3VyY2VbMF0gPT09ICd0JyB8fCBzb3VyY2VbMF0gPT09ICdUJztcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gc3YpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgPyBjdHgub3B0aW9ucy50cnVlU3RyIDogY3R4Lm9wdGlvbnMuZmFsc2VTdHI7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgYm9vbFRhZyB9O1xuIiwgImZ1bmN0aW9uIHN0cmluZ2lmeU51bWJlcih7IGZvcm1hdCwgbWluRnJhY3Rpb25EaWdpdHMsIHRhZywgdmFsdWUgfSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKVxuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICBjb25zdCBudW0gPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBOdW1iZXIodmFsdWUpO1xuICAgIGlmICghaXNGaW5pdGUobnVtKSlcbiAgICAgICAgcmV0dXJuIGlzTmFOKG51bSkgPyAnLm5hbicgOiBudW0gPCAwID8gJy0uaW5mJyA6ICcuaW5mJztcbiAgICBsZXQgbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICBpZiAoIWZvcm1hdCAmJlxuICAgICAgICBtaW5GcmFjdGlvbkRpZ2l0cyAmJlxuICAgICAgICAoIXRhZyB8fCB0YWcgPT09ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcpICYmXG4gICAgICAgIC9eXFxkLy50ZXN0KG4pKSB7XG4gICAgICAgIGxldCBpID0gbi5pbmRleE9mKCcuJyk7XG4gICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgaSA9IG4ubGVuZ3RoO1xuICAgICAgICAgICAgbiArPSAnLic7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGQgPSBtaW5GcmFjdGlvbkRpZ2l0cyAtIChuLmxlbmd0aCAtIGkgLSAxKTtcbiAgICAgICAgd2hpbGUgKGQtLSA+IDApXG4gICAgICAgICAgICBuICs9ICcwJztcbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeU51bWJlciB9O1xuIiwgImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlOdW1iZXIgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5TnVtYmVyLmpzJztcblxuY29uc3QgZmxvYXROYU4gPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgdGVzdDogL14oPzpbLStdP1xcLig/OmluZnxJbmZ8SU5GfG5hbnxOYU58TkFOKSkkLyxcbiAgICByZXNvbHZlOiBzdHIgPT4gc3RyLnNsaWNlKC0zKS50b0xvd2VyQ2FzZSgpID09PSAnbmFuJ1xuICAgICAgICA/IE5hTlxuICAgICAgICA6IHN0clswXSA9PT0gJy0nXG4gICAgICAgICAgICA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgICAgICAgICAgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5jb25zdCBmbG9hdEV4cCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICBmb3JtYXQ6ICdFWFAnLFxuICAgIHRlc3Q6IC9eWy0rXT8oPzpcXC5bMC05XSt8WzAtOV0rKD86XFwuWzAtOV0qKT8pW2VFXVstK10/WzAtOV0rJC8sXG4gICAgcmVzb2x2ZTogc3RyID0+IHBhcnNlRmxvYXQoc3RyKSxcbiAgICBzdHJpbmdpZnkobm9kZSkge1xuICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIobm9kZS52YWx1ZSk7XG4gICAgICAgIHJldHVybiBpc0Zpbml0ZShudW0pID8gbnVtLnRvRXhwb25lbnRpYWwoKSA6IHN0cmluZ2lmeU51bWJlcihub2RlKTtcbiAgICB9XG59O1xuY29uc3QgZmxvYXQgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgdGVzdDogL15bLStdPyg/OlxcLlswLTldK3xbMC05XStcXC5bMC05XSopJC8sXG4gICAgcmVzb2x2ZShzdHIpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBTY2FsYXIocGFyc2VGbG9hdChzdHIpKTtcbiAgICAgICAgY29uc3QgZG90ID0gc3RyLmluZGV4T2YoJy4nKTtcbiAgICAgICAgaWYgKGRvdCAhPT0gLTEgJiYgc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJzAnKVxuICAgICAgICAgICAgbm9kZS5taW5GcmFjdGlvbkRpZ2l0cyA9IHN0ci5sZW5ndGggLSBkb3QgLSAxO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9LFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuXG5leHBvcnQgeyBmbG9hdCwgZmxvYXRFeHAsIGZsb2F0TmFOIH07XG4iLCAiaW1wb3J0IHsgc3RyaW5naWZ5TnVtYmVyIH0gZnJvbSAnLi4vLi4vc3RyaW5naWZ5L3N0cmluZ2lmeU51bWJlci5qcyc7XG5cbmNvbnN0IGludElkZW50aWZ5ID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnIHx8IE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xuY29uc3QgaW50UmVzb2x2ZSA9IChzdHIsIG9mZnNldCwgcmFkaXgsIHsgaW50QXNCaWdJbnQgfSkgPT4gKGludEFzQmlnSW50ID8gQmlnSW50KHN0cikgOiBwYXJzZUludChzdHIuc3Vic3RyaW5nKG9mZnNldCksIHJhZGl4KSk7XG5mdW5jdGlvbiBpbnRTdHJpbmdpZnkobm9kZSwgcmFkaXgsIHByZWZpeCkge1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IG5vZGU7XG4gICAgaWYgKGludElkZW50aWZ5KHZhbHVlKSAmJiB2YWx1ZSA+PSAwKVxuICAgICAgICByZXR1cm4gcHJlZml4ICsgdmFsdWUudG9TdHJpbmcocmFkaXgpO1xuICAgIHJldHVybiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG59XG5jb25zdCBpbnRPY3QgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IGludElkZW50aWZ5KHZhbHVlKSAmJiB2YWx1ZSA+PSAwLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICBmb3JtYXQ6ICdPQ1QnLFxuICAgIHRlc3Q6IC9eMG9bMC03XSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMiwgOCwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IG5vZGUgPT4gaW50U3RyaW5naWZ5KG5vZGUsIDgsICcwbycpXG59O1xuY29uc3QgaW50ID0ge1xuICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgdGVzdDogL15bLStdP1swLTldKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAwLCAxMCwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcbmNvbnN0IGludEhleCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gaW50SWRlbnRpZnkodmFsdWUpICYmIHZhbHVlID49IDAsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ0hFWCcsXG4gICAgdGVzdDogL14weFswLTlhLWZBLUZdKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAyLCAxNiwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IG5vZGUgPT4gaW50U3RyaW5naWZ5KG5vZGUsIDE2LCAnMHgnKVxufTtcblxuZXhwb3J0IHsgaW50LCBpbnRIZXgsIGludE9jdCB9O1xuIiwgImltcG9ydCB7IG1hcCB9IGZyb20gJy4uL2NvbW1vbi9tYXAuanMnO1xuaW1wb3J0IHsgbnVsbFRhZyB9IGZyb20gJy4uL2NvbW1vbi9udWxsLmpzJztcbmltcG9ydCB7IHNlcSB9IGZyb20gJy4uL2NvbW1vbi9zZXEuanMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAnLi4vY29tbW9uL3N0cmluZy5qcyc7XG5pbXBvcnQgeyBib29sVGFnIH0gZnJvbSAnLi9ib29sLmpzJztcbmltcG9ydCB7IGZsb2F0TmFOLCBmbG9hdEV4cCwgZmxvYXQgfSBmcm9tICcuL2Zsb2F0LmpzJztcbmltcG9ydCB7IGludE9jdCwgaW50LCBpbnRIZXggfSBmcm9tICcuL2ludC5qcyc7XG5cbmNvbnN0IHNjaGVtYSA9IFtcbiAgICBtYXAsXG4gICAgc2VxLFxuICAgIHN0cmluZyxcbiAgICBudWxsVGFnLFxuICAgIGJvb2xUYWcsXG4gICAgaW50T2N0LFxuICAgIGludCxcbiAgICBpbnRIZXgsXG4gICAgZmxvYXROYU4sXG4gICAgZmxvYXRFeHAsXG4gICAgZmxvYXRcbl07XG5cbmV4cG9ydCB7IHNjaGVtYSB9O1xuIiwgImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICcuLi9jb21tb24vbWFwLmpzJztcbmltcG9ydCB7IHNlcSB9IGZyb20gJy4uL2NvbW1vbi9zZXEuanMnO1xuXG5mdW5jdGlvbiBpbnRJZGVudGlmeSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnIHx8IE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xufVxuY29uc3Qgc3RyaW5naWZ5SlNPTiA9ICh7IHZhbHVlIH0pID0+IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbmNvbnN0IGpzb25TY2FsYXJzID0gW1xuICAgIHtcbiAgICAgICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicsXG4gICAgICAgIHJlc29sdmU6IHN0ciA9PiBzdHIsXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgPT0gbnVsbCxcbiAgICAgICAgY3JlYXRlTm9kZTogKCkgPT4gbmV3IFNjYWxhcihudWxsKSxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6bnVsbCcsXG4gICAgICAgIHRlc3Q6IC9ebnVsbCQvLFxuICAgICAgICByZXNvbHZlOiAoKSA9PiBudWxsLFxuICAgICAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeUpTT05cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpib29sJyxcbiAgICAgICAgdGVzdDogL150cnVlfGZhbHNlJC8sXG4gICAgICAgIHJlc29sdmU6IHN0ciA9PiBzdHIgPT09ICd0cnVlJyxcbiAgICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlKU09OXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICAgICAgdGVzdDogL14tPyg/OjB8WzEtOV1bMC05XSopJC8sXG4gICAgICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCB7IGludEFzQmlnSW50IH0pID0+IGludEFzQmlnSW50ID8gQmlnSW50KHN0cikgOiBwYXJzZUludChzdHIsIDEwKSxcbiAgICAgICAgc3RyaW5naWZ5OiAoeyB2YWx1ZSB9KSA9PiBpbnRJZGVudGlmeSh2YWx1ZSkgPyB2YWx1ZS50b1N0cmluZygpIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgICAgIHRlc3Q6IC9eLT8oPzowfFsxLTldWzAtOV0qKSg/OlxcLlswLTldKik/KD86W2VFXVstK10/WzAtOV0rKT8kLyxcbiAgICAgICAgcmVzb2x2ZTogc3RyID0+IHBhcnNlRmxvYXQoc3RyKSxcbiAgICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlKU09OXG4gICAgfVxuXTtcbmNvbnN0IGpzb25FcnJvciA9IHtcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJycsXG4gICAgdGVzdDogL14vLFxuICAgIHJlc29sdmUoc3RyLCBvbkVycm9yKSB7XG4gICAgICAgIG9uRXJyb3IoYFVucmVzb2x2ZWQgcGxhaW4gc2NhbGFyICR7SlNPTi5zdHJpbmdpZnkoc3RyKX1gKTtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG59O1xuY29uc3Qgc2NoZW1hID0gW21hcCwgc2VxXS5jb25jYXQoanNvblNjYWxhcnMsIGpzb25FcnJvcik7XG5cbmV4cG9ydCB7IHNjaGVtYSB9O1xuIiwgImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuY29uc3QgYmluYXJ5ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6YmluYXJ5JyxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQnVmZmVyIGluIG5vZGUgYW5kIGFuIFVpbnQ4QXJyYXkgaW4gYnJvd3NlcnNcbiAgICAgKlxuICAgICAqIFRvIHVzZSB0aGUgcmVzdWx0aW5nIGJ1ZmZlciBhcyBhbiBpbWFnZSwgeW91J2xsIHdhbnQgdG8gZG8gc29tZXRoaW5nIGxpa2U6XG4gICAgICpcbiAgICAgKiAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiAnaW1hZ2UvanBlZycgfSlcbiAgICAgKiAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwaG90bycpLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgKi9cbiAgICByZXNvbHZlKHNyYywgb25FcnJvcikge1xuICAgICAgICBpZiAodHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNyYywgJ2Jhc2U2NCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBhdG9iID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBPbiBJRSAxMSwgYXRvYigpIGNhbid0IGhhbmRsZSBuZXdsaW5lc1xuICAgICAgICAgICAgY29uc3Qgc3RyID0gYXRvYihzcmMucmVwbGFjZSgvW1xcblxccl0vZywgJycpKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb25FcnJvcignVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgYmluYXJ5IHRhZ3M7IGVpdGhlciBCdWZmZXIgb3IgYXRvYiBpcyByZXF1aXJlZCcpO1xuICAgICAgICAgICAgcmV0dXJuIHNyYztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgc3RyaW5naWZ5KHsgY29tbWVudCwgdHlwZSwgdmFsdWUgfSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IHZhbHVlOyAvLyBjaGVja2VkIGVhcmxpZXIgYnkgYmluYXJ5LmlkZW50aWZ5KClcbiAgICAgICAgbGV0IHN0cjtcbiAgICAgICAgaWYgKHR5cGVvZiBCdWZmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN0ciA9XG4gICAgICAgICAgICAgICAgYnVmIGluc3RhbmNlb2YgQnVmZmVyXG4gICAgICAgICAgICAgICAgICAgID8gYnVmLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICAgICAgICAgICAgICA6IEJ1ZmZlci5mcm9tKGJ1Zi5idWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgYnRvYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbGV0IHMgPSAnJztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICAgICAgICAgICAgc3RyID0gYnRvYShzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgYmluYXJ5IHRhZ3M7IGVpdGhlciBCdWZmZXIgb3IgYnRvYSBpcyByZXF1aXJlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdHlwZSlcbiAgICAgICAgICAgIHR5cGUgPSBTY2FsYXIuQkxPQ0tfTElURVJBTDtcbiAgICAgICAgaWYgKHR5cGUgIT09IFNjYWxhci5RVU9URV9ET1VCTEUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IE1hdGgubWF4KGN0eC5vcHRpb25zLmxpbmVXaWR0aCAtIGN0eC5pbmRlbnQubGVuZ3RoLCBjdHgub3B0aW9ucy5taW5Db250ZW50V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbiA9IE1hdGguY2VpbChzdHIubGVuZ3RoIC8gbGluZVdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gbmV3IEFycmF5KG4pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIG8gPSAwOyBpIDwgbjsgKytpLCBvICs9IGxpbmVXaWR0aCkge1xuICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gc3RyLnN1YnN0cihvLCBsaW5lV2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyID0gbGluZXMuam9pbih0eXBlID09PSBTY2FsYXIuQkxPQ0tfTElURVJBTCA/ICdcXG4nIDogJyAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyaW5naWZ5U3RyaW5nKHsgY29tbWVudCwgdHlwZSwgdmFsdWU6IHN0ciB9LCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbn07XG5cbmV4cG9ydCB7IGJpbmFyeSB9O1xuIiwgImltcG9ydCB7IGlzU2VxLCBpc1BhaXIsIGlzTWFwIH0gZnJvbSAnLi4vLi4vbm9kZXMvTm9kZS5qcyc7XG5pbXBvcnQgeyBQYWlyLCBjcmVhdGVQYWlyIH0gZnJvbSAnLi4vLi4vbm9kZXMvUGFpci5qcyc7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4uLy4uL25vZGVzL1lBTUxTZXEuanMnO1xuXG5mdW5jdGlvbiByZXNvbHZlUGFpcnMoc2VxLCBvbkVycm9yKSB7XG4gICAgaWYgKGlzU2VxKHNlcSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXEuaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gc2VxLml0ZW1zW2ldO1xuICAgICAgICAgICAgaWYgKGlzUGFpcihpdGVtKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzTWFwKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbXMubGVuZ3RoID4gMSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcignRWFjaCBwYWlyIG11c3QgaGF2ZSBpdHMgb3duIHNlcXVlbmNlIGluZGljYXRvcicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBpdGVtLml0ZW1zWzBdIHx8IG5ldyBQYWlyKG5ldyBTY2FsYXIobnVsbCkpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbW1lbnRCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgIHBhaXIua2V5LmNvbW1lbnRCZWZvcmUgPSBwYWlyLmtleS5jb21tZW50QmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGAke2l0ZW0uY29tbWVudEJlZm9yZX1cXG4ke3BhaXIua2V5LmNvbW1lbnRCZWZvcmV9YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVtLmNvbW1lbnRCZWZvcmU7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbiA9IHBhaXIudmFsdWUgPz8gcGFpci5rZXk7XG4gICAgICAgICAgICAgICAgICAgIGNuLmNvbW1lbnQgPSBjbi5jb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICA/IGAke2l0ZW0uY29tbWVudH1cXG4ke2NuLmNvbW1lbnR9YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVtLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGl0ZW0gPSBwYWlyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VxLml0ZW1zW2ldID0gaXNQYWlyKGl0ZW0pID8gaXRlbSA6IG5ldyBQYWlyKGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgb25FcnJvcignRXhwZWN0ZWQgYSBzZXF1ZW5jZSBmb3IgdGhpcyB0YWcnKTtcbiAgICByZXR1cm4gc2VxO1xufVxuZnVuY3Rpb24gY3JlYXRlUGFpcnMoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSB7XG4gICAgY29uc3QgeyByZXBsYWNlciB9ID0gY3R4O1xuICAgIGNvbnN0IHBhaXJzID0gbmV3IFlBTUxTZXEoc2NoZW1hKTtcbiAgICBwYWlycy50YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6cGFpcnMnO1xuICAgIGxldCBpID0gMDtcbiAgICBpZiAoaXRlcmFibGUgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyYWJsZSkpXG4gICAgICAgIGZvciAobGV0IGl0IG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgIGl0ID0gcmVwbGFjZXIuY2FsbChpdGVyYWJsZSwgU3RyaW5nKGkrKyksIGl0KTtcbiAgICAgICAgICAgIGxldCBrZXksIHZhbHVlO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBpdFswXTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpdFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBba2V5LCB2YWx1ZV0gdHVwbGU6ICR7aXR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpdCAmJiBpdCBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpdCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXNbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaXRba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCB7IGtleTogdmFsdWUgfSB0dXBsZTogJHtpdH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGtleSA9IGl0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFpcnMuaXRlbXMucHVzaChjcmVhdGVQYWlyKGtleSwgdmFsdWUsIGN0eCkpO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHBhaXJzO1xufVxuY29uc3QgcGFpcnMgPSB7XG4gICAgY29sbGVjdGlvbjogJ3NlcScsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6cGFpcnMnLFxuICAgIHJlc29sdmU6IHJlc29sdmVQYWlycyxcbiAgICBjcmVhdGVOb2RlOiBjcmVhdGVQYWlyc1xufTtcblxuZXhwb3J0IHsgY3JlYXRlUGFpcnMsIHBhaXJzLCByZXNvbHZlUGFpcnMgfTtcbiIsICJpbXBvcnQgeyBZQU1MU2VxIH0gZnJvbSAnLi4vLi4vbm9kZXMvWUFNTFNlcS5qcyc7XG5pbXBvcnQgeyB0b0pTIH0gZnJvbSAnLi4vLi4vbm9kZXMvdG9KUy5qcyc7XG5pbXBvcnQgeyBpc1NjYWxhciwgaXNQYWlyIH0gZnJvbSAnLi4vLi4vbm9kZXMvTm9kZS5qcyc7XG5pbXBvcnQgeyBZQU1MTWFwIH0gZnJvbSAnLi4vLi4vbm9kZXMvWUFNTE1hcC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUGFpcnMsIGNyZWF0ZVBhaXJzIH0gZnJvbSAnLi9wYWlycy5qcyc7XG5cbmNsYXNzIFlBTUxPTWFwIGV4dGVuZHMgWUFNTFNlcSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYWRkID0gWUFNTE1hcC5wcm90b3R5cGUuYWRkLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVsZXRlID0gWUFNTE1hcC5wcm90b3R5cGUuZGVsZXRlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZ2V0ID0gWUFNTE1hcC5wcm90b3R5cGUuZ2V0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaGFzID0gWUFNTE1hcC5wcm90b3R5cGUuaGFzLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2V0ID0gWUFNTE1hcC5wcm90b3R5cGUuc2V0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMudGFnID0gWUFNTE9NYXAudGFnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBgY3R4YCBpcyBnaXZlbiwgdGhlIHJldHVybiB0eXBlIGlzIGFjdHVhbGx5IGBNYXA8dW5rbm93biwgdW5rbm93bj5gLFxuICAgICAqIGJ1dCBUeXBlU2NyaXB0IHdvbid0IGFsbG93IHdpZGVuaW5nIHRoZSBzaWduYXR1cmUgb2YgYSBjaGlsZCBtZXRob2QuXG4gICAgICovXG4gICAgdG9KU09OKF8sIGN0eCkge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHJldHVybiBzdXBlci50b0pTT04oXyk7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgaWYgKGN0eD8ub25DcmVhdGUpXG4gICAgICAgICAgICBjdHgub25DcmVhdGUobWFwKTtcbiAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgICAgICAgIGxldCBrZXksIHZhbHVlO1xuICAgICAgICAgICAgaWYgKGlzUGFpcihwYWlyKSkge1xuICAgICAgICAgICAgICAgIGtleSA9IHRvSlMocGFpci5rZXksICcnLCBjdHgpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9KUyhwYWlyLnZhbHVlLCBrZXksIGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBrZXkgPSB0b0pTKHBhaXIsICcnLCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hcC5oYXMoa2V5KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09yZGVyZWQgbWFwcyBtdXN0IG5vdCBpbmNsdWRlIGR1cGxpY2F0ZSBrZXlzJyk7XG4gICAgICAgICAgICBtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxufVxuWUFNTE9NYXAudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnO1xuY29uc3Qgb21hcCA9IHtcbiAgICBjb2xsZWN0aW9uOiAnc2VxJyxcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBNYXAsXG4gICAgbm9kZUNsYXNzOiBZQU1MT01hcCxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpvbWFwJyxcbiAgICByZXNvbHZlKHNlcSwgb25FcnJvcikge1xuICAgICAgICBjb25zdCBwYWlycyA9IHJlc29sdmVQYWlycyhzZXEsIG9uRXJyb3IpO1xuICAgICAgICBjb25zdCBzZWVuS2V5cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHsga2V5IH0gb2YgcGFpcnMuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChpc1NjYWxhcihrZXkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlZW5LZXlzLmluY2x1ZGVzKGtleS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihgT3JkZXJlZCBtYXBzIG11c3Qgbm90IGluY2x1ZGUgZHVwbGljYXRlIGtleXM6ICR7a2V5LnZhbHVlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlbktleXMucHVzaChrZXkudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgWUFNTE9NYXAoKSwgcGFpcnMpO1xuICAgIH0sXG4gICAgY3JlYXRlTm9kZShzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpIHtcbiAgICAgICAgY29uc3QgcGFpcnMgPSBjcmVhdGVQYWlycyhzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpO1xuICAgICAgICBjb25zdCBvbWFwID0gbmV3IFlBTUxPTWFwKCk7XG4gICAgICAgIG9tYXAuaXRlbXMgPSBwYWlycy5pdGVtcztcbiAgICAgICAgcmV0dXJuIG9tYXA7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgWUFNTE9NYXAsIG9tYXAgfTtcbiIsICJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuXG5mdW5jdGlvbiBib29sU3RyaW5naWZ5KHsgdmFsdWUsIHNvdXJjZSB9LCBjdHgpIHtcbiAgICBjb25zdCBib29sT2JqID0gdmFsdWUgPyB0cnVlVGFnIDogZmFsc2VUYWc7XG4gICAgaWYgKHNvdXJjZSAmJiBib29sT2JqLnRlc3QudGVzdChzb3VyY2UpKVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIHJldHVybiB2YWx1ZSA/IGN0eC5vcHRpb25zLnRydWVTdHIgOiBjdHgub3B0aW9ucy5mYWxzZVN0cjtcbn1cbmNvbnN0IHRydWVUYWcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlID09PSB0cnVlLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsXG4gICAgdGVzdDogL14oPzpZfHl8W1l5XWVzfFlFU3xbVHRdcnVlfFRSVUV8W09vXW58T04pJC8sXG4gICAgcmVzb2x2ZTogKCkgPT4gbmV3IFNjYWxhcih0cnVlKSxcbiAgICBzdHJpbmdpZnk6IGJvb2xTdHJpbmdpZnlcbn07XG5jb25zdCBmYWxzZVRhZyA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgPT09IGZhbHNlLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsXG4gICAgdGVzdDogL14oPzpOfG58W05uXW98Tk98W0ZmXWFsc2V8RkFMU0V8W09vXWZmfE9GRikkL2ksXG4gICAgcmVzb2x2ZTogKCkgPT4gbmV3IFNjYWxhcihmYWxzZSksXG4gICAgc3RyaW5naWZ5OiBib29sU3RyaW5naWZ5XG59O1xuXG5leHBvcnQgeyBmYWxzZVRhZywgdHJ1ZVRhZyB9O1xuIiwgImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlOdW1iZXIgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5TnVtYmVyLmpzJztcblxuY29uc3QgZmxvYXROYU4gPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgdGVzdDogL15bLStdP1xcLig/OmluZnxJbmZ8SU5GfG5hbnxOYU58TkFOKSQvLFxuICAgIHJlc29sdmU6IChzdHIpID0+IHN0ci5zbGljZSgtMykudG9Mb3dlckNhc2UoKSA9PT0gJ25hbidcbiAgICAgICAgPyBOYU5cbiAgICAgICAgOiBzdHJbMF0gPT09ICctJ1xuICAgICAgICAgICAgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFlcbiAgICAgICAgICAgIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuY29uc3QgZmxvYXRFeHAgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgZm9ybWF0OiAnRVhQJyxcbiAgICB0ZXN0OiAvXlstK10/KD86WzAtOV1bMC05X10qKT8oPzpcXC5bMC05X10qKT9bZUVdWy0rXT9bMC05XSskLyxcbiAgICByZXNvbHZlOiAoc3RyKSA9PiBwYXJzZUZsb2F0KHN0ci5yZXBsYWNlKC9fL2csICcnKSksXG4gICAgc3RyaW5naWZ5KG5vZGUpIHtcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKG5vZGUudmFsdWUpO1xuICAgICAgICByZXR1cm4gaXNGaW5pdGUobnVtKSA/IG51bS50b0V4cG9uZW50aWFsKCkgOiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG4gICAgfVxufTtcbmNvbnN0IGZsb2F0ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIHRlc3Q6IC9eWy0rXT8oPzpbMC05XVswLTlfXSopP1xcLlswLTlfXSokLyxcbiAgICByZXNvbHZlKHN0cikge1xuICAgICAgICBjb25zdCBub2RlID0gbmV3IFNjYWxhcihwYXJzZUZsb2F0KHN0ci5yZXBsYWNlKC9fL2csICcnKSkpO1xuICAgICAgICBjb25zdCBkb3QgPSBzdHIuaW5kZXhPZignLicpO1xuICAgICAgICBpZiAoZG90ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgZiA9IHN0ci5zdWJzdHJpbmcoZG90ICsgMSkucmVwbGFjZSgvXy9nLCAnJyk7XG4gICAgICAgICAgICBpZiAoZltmLmxlbmd0aCAtIDFdID09PSAnMCcpXG4gICAgICAgICAgICAgICAgbm9kZS5taW5GcmFjdGlvbkRpZ2l0cyA9IGYubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0sXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5cbmV4cG9ydCB7IGZsb2F0LCBmbG9hdEV4cCwgZmxvYXROYU4gfTtcbiIsICJpbXBvcnQgeyBzdHJpbmdpZnlOdW1iZXIgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5TnVtYmVyLmpzJztcblxuY29uc3QgaW50SWRlbnRpZnkgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgfHwgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSk7XG5mdW5jdGlvbiBpbnRSZXNvbHZlKHN0ciwgb2Zmc2V0LCByYWRpeCwgeyBpbnRBc0JpZ0ludCB9KSB7XG4gICAgY29uc3Qgc2lnbiA9IHN0clswXTtcbiAgICBpZiAoc2lnbiA9PT0gJy0nIHx8IHNpZ24gPT09ICcrJylcbiAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgc3RyID0gc3RyLnN1YnN0cmluZyhvZmZzZXQpLnJlcGxhY2UoL18vZywgJycpO1xuICAgIGlmIChpbnRBc0JpZ0ludCkge1xuICAgICAgICBzd2l0Y2ggKHJhZGl4KSB7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgc3RyID0gYDBiJHtzdHJ9YDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICBzdHIgPSBgMG8ke3N0cn1gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICBzdHIgPSBgMHgke3N0cn1gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG4gPSBCaWdJbnQoc3RyKTtcbiAgICAgICAgcmV0dXJuIHNpZ24gPT09ICctJyA/IEJpZ0ludCgtMSkgKiBuIDogbjtcbiAgICB9XG4gICAgY29uc3QgbiA9IHBhcnNlSW50KHN0ciwgcmFkaXgpO1xuICAgIHJldHVybiBzaWduID09PSAnLScgPyAtMSAqIG4gOiBuO1xufVxuZnVuY3Rpb24gaW50U3RyaW5naWZ5KG5vZGUsIHJhZGl4LCBwcmVmaXgpIHtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBub2RlO1xuICAgIGlmIChpbnRJZGVudGlmeSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qgc3RyID0gdmFsdWUudG9TdHJpbmcocmFkaXgpO1xuICAgICAgICByZXR1cm4gdmFsdWUgPCAwID8gJy0nICsgcHJlZml4ICsgc3RyLnN1YnN0cigxKSA6IHByZWZpeCArIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cmluZ2lmeU51bWJlcihub2RlKTtcbn1cbmNvbnN0IGludEJpbiA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ0JJTicsXG4gICAgdGVzdDogL15bLStdPzBiWzAtMV9dKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAyLCAyLCBvcHQpLFxuICAgIHN0cmluZ2lmeTogbm9kZSA9PiBpbnRTdHJpbmdpZnkobm9kZSwgMiwgJzBiJylcbn07XG5jb25zdCBpbnRPY3QgPSB7XG4gICAgaWRlbnRpZnk6IGludElkZW50aWZ5LFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICBmb3JtYXQ6ICdPQ1QnLFxuICAgIHRlc3Q6IC9eWy0rXT8wWzAtN19dKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAxLCA4LCBvcHQpLFxuICAgIHN0cmluZ2lmeTogbm9kZSA9PiBpbnRTdHJpbmdpZnkobm9kZSwgOCwgJzAnKVxufTtcbmNvbnN0IGludCA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIHRlc3Q6IC9eWy0rXT9bMC05XVswLTlfXSokLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMCwgMTAsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5jb25zdCBpbnRIZXggPSB7XG4gICAgaWRlbnRpZnk6IGludElkZW50aWZ5LFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICBmb3JtYXQ6ICdIRVgnLFxuICAgIHRlc3Q6IC9eWy0rXT8weFswLTlhLWZBLUZfXSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMiwgMTYsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCAxNiwgJzB4Jylcbn07XG5cbmV4cG9ydCB7IGludCwgaW50QmluLCBpbnRIZXgsIGludE9jdCB9O1xuIiwgImltcG9ydCB7IGlzTWFwLCBpc1BhaXIsIGlzU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvTm9kZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQYWlyLCBQYWlyIH0gZnJvbSAnLi4vLi4vbm9kZXMvUGFpci5qcyc7XG5pbXBvcnQgeyBZQU1MTWFwLCBmaW5kUGFpciB9IGZyb20gJy4uLy4uL25vZGVzL1lBTUxNYXAuanMnO1xuXG5jbGFzcyBZQU1MU2V0IGV4dGVuZHMgWUFNTE1hcCB7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hKSB7XG4gICAgICAgIHN1cGVyKHNjaGVtYSk7XG4gICAgICAgIHRoaXMudGFnID0gWUFNTFNldC50YWc7XG4gICAgfVxuICAgIGFkZChrZXkpIHtcbiAgICAgICAgbGV0IHBhaXI7XG4gICAgICAgIGlmIChpc1BhaXIoa2V5KSlcbiAgICAgICAgICAgIHBhaXIgPSBrZXk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAna2V5JyBpbiBrZXkgJiZcbiAgICAgICAgICAgICd2YWx1ZScgaW4ga2V5ICYmXG4gICAgICAgICAgICBrZXkudmFsdWUgPT09IG51bGwpXG4gICAgICAgICAgICBwYWlyID0gbmV3IFBhaXIoa2V5LmtleSwgbnVsbCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhaXIgPSBuZXcgUGFpcihrZXksIG51bGwpO1xuICAgICAgICBjb25zdCBwcmV2ID0gZmluZFBhaXIodGhpcy5pdGVtcywgcGFpci5rZXkpO1xuICAgICAgICBpZiAoIXByZXYpXG4gICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2gocGFpcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIGBrZWVwUGFpcmAgaXMgYHRydWVgLCByZXR1cm5zIHRoZSBQYWlyIG1hdGNoaW5nIGBrZXlgLlxuICAgICAqIE90aGVyd2lzZSwgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhhdCBQYWlyJ3Mga2V5LlxuICAgICAqL1xuICAgIGdldChrZXksIGtlZXBQYWlyKSB7XG4gICAgICAgIGNvbnN0IHBhaXIgPSBmaW5kUGFpcih0aGlzLml0ZW1zLCBrZXkpO1xuICAgICAgICByZXR1cm4gIWtlZXBQYWlyICYmIGlzUGFpcihwYWlyKVxuICAgICAgICAgICAgPyBpc1NjYWxhcihwYWlyLmtleSlcbiAgICAgICAgICAgICAgICA/IHBhaXIua2V5LnZhbHVlXG4gICAgICAgICAgICAgICAgOiBwYWlyLmtleVxuICAgICAgICAgICAgOiBwYWlyO1xuICAgIH1cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGJvb2xlYW4gdmFsdWUgZm9yIHNldChrZXksIHZhbHVlKSBpbiBhIFlBTUwgc2V0LCBub3QgJHt0eXBlb2YgdmFsdWV9YCk7XG4gICAgICAgIGNvbnN0IHByZXYgPSBmaW5kUGFpcih0aGlzLml0ZW1zLCBrZXkpO1xuICAgICAgICBpZiAocHJldiAmJiAhdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKHRoaXMuaXRlbXMuaW5kZXhPZihwcmV2KSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXByZXYgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChuZXcgUGFpcihrZXkpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0pTT04oXywgY3R4KSB7XG4gICAgICAgIHJldHVybiBzdXBlci50b0pTT04oXywgY3R4LCBTZXQpO1xuICAgIH1cbiAgICB0b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmhhc0FsbE51bGxWYWx1ZXModHJ1ZSkpXG4gICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoT2JqZWN0LmFzc2lnbih7fSwgY3R4LCB7IGFsbE51bGxWYWx1ZXM6IHRydWUgfSksIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NldCBpdGVtcyBtdXN0IGFsbCBoYXZlIG51bGwgdmFsdWVzJyk7XG4gICAgfVxufVxuWUFNTFNldC50YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6c2V0JztcbmNvbnN0IHNldCA9IHtcbiAgICBjb2xsZWN0aW9uOiAnbWFwJyxcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBTZXQsXG4gICAgbm9kZUNsYXNzOiBZQU1MU2V0LFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnNldCcsXG4gICAgcmVzb2x2ZShtYXAsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKGlzTWFwKG1hcCkpIHtcbiAgICAgICAgICAgIGlmIChtYXAuaGFzQWxsTnVsbFZhbHVlcyh0cnVlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgWUFNTFNldCgpLCBtYXApO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG9uRXJyb3IoJ1NldCBpdGVtcyBtdXN0IGFsbCBoYXZlIG51bGwgdmFsdWVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgb25FcnJvcignRXhwZWN0ZWQgYSBtYXBwaW5nIGZvciB0aGlzIHRhZycpO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH0sXG4gICAgY3JlYXRlTm9kZShzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpIHtcbiAgICAgICAgY29uc3QgeyByZXBsYWNlciB9ID0gY3R4O1xuICAgICAgICBjb25zdCBzZXQgPSBuZXcgWUFNTFNldChzY2hlbWEpO1xuICAgICAgICBpZiAoaXRlcmFibGUgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyYWJsZSkpXG4gICAgICAgICAgICBmb3IgKGxldCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVwbGFjZXIuY2FsbChpdGVyYWJsZSwgdmFsdWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBzZXQuaXRlbXMucHVzaChjcmVhdGVQYWlyKHZhbHVlLCBudWxsLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG59O1xuXG5leHBvcnQgeyBZQU1MU2V0LCBzZXQgfTtcbiIsICJpbXBvcnQgeyBzdHJpbmdpZnlOdW1iZXIgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5TnVtYmVyLmpzJztcblxuLyoqIEludGVybmFsIHR5cGVzIGhhbmRsZSBiaWdpbnQgYXMgbnVtYmVyLCBiZWNhdXNlIFRTIGNhbid0IGZpZ3VyZSBpdCBvdXQuICovXG5mdW5jdGlvbiBwYXJzZVNleGFnZXNpbWFsKHN0ciwgYXNCaWdJbnQpIHtcbiAgICBjb25zdCBzaWduID0gc3RyWzBdO1xuICAgIGNvbnN0IHBhcnRzID0gc2lnbiA9PT0gJy0nIHx8IHNpZ24gPT09ICcrJyA/IHN0ci5zdWJzdHJpbmcoMSkgOiBzdHI7XG4gICAgY29uc3QgbnVtID0gKG4pID0+IGFzQmlnSW50ID8gQmlnSW50KG4pIDogTnVtYmVyKG4pO1xuICAgIGNvbnN0IHJlcyA9IHBhcnRzXG4gICAgICAgIC5yZXBsYWNlKC9fL2csICcnKVxuICAgICAgICAuc3BsaXQoJzonKVxuICAgICAgICAucmVkdWNlKChyZXMsIHApID0+IHJlcyAqIG51bSg2MCkgKyBudW0ocCksIG51bSgwKSk7XG4gICAgcmV0dXJuIChzaWduID09PSAnLScgPyBudW0oLTEpICogcmVzIDogcmVzKTtcbn1cbi8qKlxuICogaGhoaDptbTpzcy5zc3NcbiAqXG4gKiBJbnRlcm5hbCB0eXBlcyBoYW5kbGUgYmlnaW50IGFzIG51bWJlciwgYmVjYXVzZSBUUyBjYW4ndCBmaWd1cmUgaXQgb3V0LlxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlTZXhhZ2VzaW1hbChub2RlKSB7XG4gICAgbGV0IHsgdmFsdWUgfSA9IG5vZGU7XG4gICAgbGV0IG51bSA9IChuKSA9PiBuO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKVxuICAgICAgICBudW0gPSBuID0+IEJpZ0ludChuKTtcbiAgICBlbHNlIGlmIChpc05hTih2YWx1ZSkgfHwgIWlzRmluaXRlKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeU51bWJlcihub2RlKTtcbiAgICBsZXQgc2lnbiA9ICcnO1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgICAgc2lnbiA9ICctJztcbiAgICAgICAgdmFsdWUgKj0gbnVtKC0xKTtcbiAgICB9XG4gICAgY29uc3QgXzYwID0gbnVtKDYwKTtcbiAgICBjb25zdCBwYXJ0cyA9IFt2YWx1ZSAlIF82MF07IC8vIHNlY29uZHMsIGluY2x1ZGluZyBtc1xuICAgIGlmICh2YWx1ZSA8IDYwKSB7XG4gICAgICAgIHBhcnRzLnVuc2hpZnQoMCk7IC8vIGF0IGxlYXN0IG9uZSA6IGlzIHJlcXVpcmVkXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSAtIHBhcnRzWzBdKSAvIF82MDtcbiAgICAgICAgcGFydHMudW5zaGlmdCh2YWx1ZSAlIF82MCk7IC8vIG1pbnV0ZXNcbiAgICAgICAgaWYgKHZhbHVlID49IDYwKSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSAtIHBhcnRzWzBdKSAvIF82MDtcbiAgICAgICAgICAgIHBhcnRzLnVuc2hpZnQodmFsdWUpOyAvLyBob3Vyc1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoc2lnbiArXG4gICAgICAgIHBhcnRzXG4gICAgICAgICAgICAubWFwKG4gPT4gKG4gPCAxMCA/ICcwJyArIFN0cmluZyhuKSA6IFN0cmluZyhuKSkpXG4gICAgICAgICAgICAuam9pbignOicpXG4gICAgICAgICAgICAucmVwbGFjZSgvMDAwMDAwXFxkKiQvLCAnJykgLy8gJSA2MCBtYXkgaW50cm9kdWNlIGVycm9yXG4gICAgKTtcbn1cbmNvbnN0IGludFRpbWUgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgfHwgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ1RJTUUnLFxuICAgIHRlc3Q6IC9eWy0rXT9bMC05XVswLTlfXSooPzo6WzAtNV0/WzAtOV0pKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCB7IGludEFzQmlnSW50IH0pID0+IHBhcnNlU2V4YWdlc2ltYWwoc3RyLCBpbnRBc0JpZ0ludCksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlTZXhhZ2VzaW1hbFxufTtcbmNvbnN0IGZsb2F0VGltZSA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICBmb3JtYXQ6ICdUSU1FJyxcbiAgICB0ZXN0OiAvXlstK10/WzAtOV1bMC05X10qKD86OlswLTVdP1swLTldKStcXC5bMC05X10qJC8sXG4gICAgcmVzb2x2ZTogc3RyID0+IHBhcnNlU2V4YWdlc2ltYWwoc3RyLCBmYWxzZSksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlTZXhhZ2VzaW1hbFxufTtcbmNvbnN0IHRpbWVzdGFtcCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wJyxcbiAgICAvLyBJZiB0aGUgdGltZSB6b25lIGlzIG9taXR0ZWQsIHRoZSB0aW1lc3RhbXAgaXMgYXNzdW1lZCB0byBiZSBzcGVjaWZpZWQgaW4gVVRDLiBUaGUgdGltZSBwYXJ0XG4gICAgLy8gbWF5IGJlIG9taXR0ZWQgYWx0b2dldGhlciwgcmVzdWx0aW5nIGluIGEgZGF0ZSBmb3JtYXQuIEluIHN1Y2ggYSBjYXNlLCB0aGUgdGltZSBwYXJ0IGlzXG4gICAgLy8gYXNzdW1lZCB0byBiZSAwMDowMDowMFogKHN0YXJ0IG9mIGRheSwgVVRDKS5cbiAgICB0ZXN0OiBSZWdFeHAoJ14oWzAtOV17NH0pLShbMC05XXsxLDJ9KS0oWzAtOV17MSwyfSknICsgLy8gWVlZWS1NbS1EZFxuICAgICAgICAnKD86JyArIC8vIHRpbWUgaXMgb3B0aW9uYWxcbiAgICAgICAgJyg/OnR8VHxbIFxcXFx0XSspJyArIC8vIHQgfCBUIHwgd2hpdGVzcGFjZVxuICAgICAgICAnKFswLTldezEsMn0pOihbMC05XXsxLDJ9KTooWzAtOV17MSwyfShcXFxcLlswLTldKyk/KScgKyAvLyBIaDpNbTpTcyguc3MpP1xuICAgICAgICAnKD86WyBcXFxcdF0qKFp8Wy0rXVswMTJdP1swLTldKD86OlswLTldezJ9KT8pKT8nICsgLy8gWiB8ICs1IHwgLTAzOjMwXG4gICAgICAgICcpPyQnKSxcbiAgICByZXNvbHZlKHN0cikge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHN0ci5tYXRjaCh0aW1lc3RhbXAudGVzdCk7XG4gICAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJyEhdGltZXN0YW1wIGV4cGVjdHMgYSBkYXRlLCBzdGFydGluZyB3aXRoIHl5eXktbW0tZGQnKTtcbiAgICAgICAgY29uc3QgWywgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gbWF0Y2gubWFwKE51bWJlcik7XG4gICAgICAgIGNvbnN0IG1pbGxpc2VjID0gbWF0Y2hbN10gPyBOdW1iZXIoKG1hdGNoWzddICsgJzAwJykuc3Vic3RyKDEsIDMpKSA6IDA7XG4gICAgICAgIGxldCBkYXRlID0gRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIgfHwgMCwgbWludXRlIHx8IDAsIHNlY29uZCB8fCAwLCBtaWxsaXNlYyk7XG4gICAgICAgIGNvbnN0IHR6ID0gbWF0Y2hbOF07XG4gICAgICAgIGlmICh0eiAmJiB0eiAhPT0gJ1onKSB7XG4gICAgICAgICAgICBsZXQgZCA9IHBhcnNlU2V4YWdlc2ltYWwodHosIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkKSA8IDMwKVxuICAgICAgICAgICAgICAgIGQgKj0gNjA7XG4gICAgICAgICAgICBkYXRlIC09IDYwMDAwICogZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZSk7XG4gICAgfSxcbiAgICBzdHJpbmdpZnk6ICh7IHZhbHVlIH0pID0+IHZhbHVlLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvKChUMDA6MDApPzowMCk/XFwuMDAwWiQvLCAnJylcbn07XG5cbmV4cG9ydCB7IGZsb2F0VGltZSwgaW50VGltZSwgdGltZXN0YW1wIH07XG4iLCAiaW1wb3J0IHsgbWFwIH0gZnJvbSAnLi4vY29tbW9uL21hcC5qcyc7XG5pbXBvcnQgeyBudWxsVGFnIH0gZnJvbSAnLi4vY29tbW9uL251bGwuanMnO1xuaW1wb3J0IHsgc2VxIH0gZnJvbSAnLi4vY29tbW9uL3NlcS5qcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICcuLi9jb21tb24vc3RyaW5nLmpzJztcbmltcG9ydCB7IGJpbmFyeSB9IGZyb20gJy4vYmluYXJ5LmpzJztcbmltcG9ydCB7IHRydWVUYWcsIGZhbHNlVGFnIH0gZnJvbSAnLi9ib29sLmpzJztcbmltcG9ydCB7IGZsb2F0TmFOLCBmbG9hdEV4cCwgZmxvYXQgfSBmcm9tICcuL2Zsb2F0LmpzJztcbmltcG9ydCB7IGludEJpbiwgaW50T2N0LCBpbnQsIGludEhleCB9IGZyb20gJy4vaW50LmpzJztcbmltcG9ydCB7IG9tYXAgfSBmcm9tICcuL29tYXAuanMnO1xuaW1wb3J0IHsgcGFpcnMgfSBmcm9tICcuL3BhaXJzLmpzJztcbmltcG9ydCB7IHNldCB9IGZyb20gJy4vc2V0LmpzJztcbmltcG9ydCB7IGludFRpbWUsIGZsb2F0VGltZSwgdGltZXN0YW1wIH0gZnJvbSAnLi90aW1lc3RhbXAuanMnO1xuXG5jb25zdCBzY2hlbWEgPSBbXG4gICAgbWFwLFxuICAgIHNlcSxcbiAgICBzdHJpbmcsXG4gICAgbnVsbFRhZyxcbiAgICB0cnVlVGFnLFxuICAgIGZhbHNlVGFnLFxuICAgIGludEJpbixcbiAgICBpbnRPY3QsXG4gICAgaW50LFxuICAgIGludEhleCxcbiAgICBmbG9hdE5hTixcbiAgICBmbG9hdEV4cCxcbiAgICBmbG9hdCxcbiAgICBiaW5hcnksXG4gICAgb21hcCxcbiAgICBwYWlycyxcbiAgICBzZXQsXG4gICAgaW50VGltZSxcbiAgICBmbG9hdFRpbWUsXG4gICAgdGltZXN0YW1wXG5dO1xuXG5leHBvcnQgeyBzY2hlbWEgfTtcbiIsICJpbXBvcnQgeyBtYXAgfSBmcm9tICcuL2NvbW1vbi9tYXAuanMnO1xuaW1wb3J0IHsgbnVsbFRhZyB9IGZyb20gJy4vY29tbW9uL251bGwuanMnO1xuaW1wb3J0IHsgc2VxIH0gZnJvbSAnLi9jb21tb24vc2VxLmpzJztcbmltcG9ydCB7IHN0cmluZyB9IGZyb20gJy4vY29tbW9uL3N0cmluZy5qcyc7XG5pbXBvcnQgeyBib29sVGFnIH0gZnJvbSAnLi9jb3JlL2Jvb2wuanMnO1xuaW1wb3J0IHsgZmxvYXQsIGZsb2F0RXhwLCBmbG9hdE5hTiB9IGZyb20gJy4vY29yZS9mbG9hdC5qcyc7XG5pbXBvcnQgeyBpbnQsIGludEhleCwgaW50T2N0IH0gZnJvbSAnLi9jb3JlL2ludC5qcyc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL2NvcmUvc2NoZW1hLmpzJztcbmltcG9ydCB7IHNjaGVtYSBhcyBzY2hlbWEkMSB9IGZyb20gJy4vanNvbi9zY2hlbWEuanMnO1xuaW1wb3J0IHsgYmluYXJ5IH0gZnJvbSAnLi95YW1sLTEuMS9iaW5hcnkuanMnO1xuaW1wb3J0IHsgb21hcCB9IGZyb20gJy4veWFtbC0xLjEvb21hcC5qcyc7XG5pbXBvcnQgeyBwYWlycyB9IGZyb20gJy4veWFtbC0xLjEvcGFpcnMuanMnO1xuaW1wb3J0IHsgc2NoZW1hIGFzIHNjaGVtYSQyIH0gZnJvbSAnLi95YW1sLTEuMS9zY2hlbWEuanMnO1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnLi95YW1sLTEuMS9zZXQuanMnO1xuaW1wb3J0IHsgZmxvYXRUaW1lLCBpbnRUaW1lLCB0aW1lc3RhbXAgfSBmcm9tICcuL3lhbWwtMS4xL3RpbWVzdGFtcC5qcyc7XG5cbmNvbnN0IHNjaGVtYXMgPSBuZXcgTWFwKFtcbiAgICBbJ2NvcmUnLCBzY2hlbWFdLFxuICAgIFsnZmFpbHNhZmUnLCBbbWFwLCBzZXEsIHN0cmluZ11dLFxuICAgIFsnanNvbicsIHNjaGVtYSQxXSxcbiAgICBbJ3lhbWwxMScsIHNjaGVtYSQyXSxcbiAgICBbJ3lhbWwtMS4xJywgc2NoZW1hJDJdXG5dKTtcbmNvbnN0IHRhZ3NCeU5hbWUgPSB7XG4gICAgYmluYXJ5LFxuICAgIGJvb2w6IGJvb2xUYWcsXG4gICAgZmxvYXQsXG4gICAgZmxvYXRFeHAsXG4gICAgZmxvYXROYU4sXG4gICAgZmxvYXRUaW1lLFxuICAgIGludCxcbiAgICBpbnRIZXgsXG4gICAgaW50T2N0LFxuICAgIGludFRpbWUsXG4gICAgbWFwLFxuICAgIG51bGw6IG51bGxUYWcsXG4gICAgb21hcCxcbiAgICBwYWlycyxcbiAgICBzZXEsXG4gICAgc2V0LFxuICAgIHRpbWVzdGFtcFxufTtcbmNvbnN0IGNvcmVLbm93blRhZ3MgPSB7XG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOmJpbmFyeSc6IGJpbmFyeSxcbiAgICAndGFnOnlhbWwub3JnLDIwMDI6b21hcCc6IG9tYXAsXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJzogcGFpcnMsXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOnNldCc6IHNldCxcbiAgICAndGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wJzogdGltZXN0YW1wXG59O1xuZnVuY3Rpb24gZ2V0VGFncyhjdXN0b21UYWdzLCBzY2hlbWFOYW1lKSB7XG4gICAgbGV0IHRhZ3MgPSBzY2hlbWFzLmdldChzY2hlbWFOYW1lKTtcbiAgICBpZiAoIXRhZ3MpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VzdG9tVGFncykpXG4gICAgICAgICAgICB0YWdzID0gW107XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IEFycmF5LmZyb20oc2NoZW1hcy5rZXlzKCkpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihrZXkgPT4ga2V5ICE9PSAneWFtbDExJylcbiAgICAgICAgICAgICAgICAubWFwKGtleSA9PiBKU09OLnN0cmluZ2lmeShrZXkpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHNjaGVtYSBcIiR7c2NoZW1hTmFtZX1cIjsgdXNlIG9uZSBvZiAke2tleXN9IG9yIGRlZmluZSBjdXN0b21UYWdzIGFycmF5YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY3VzdG9tVGFncykpIHtcbiAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgY3VzdG9tVGFncylcbiAgICAgICAgICAgIHRhZ3MgPSB0YWdzLmNvbmNhdCh0YWcpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgY3VzdG9tVGFncyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0YWdzID0gY3VzdG9tVGFncyh0YWdzLnNsaWNlKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGFncy5tYXAodGFnID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0YWcgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICAgICAgY29uc3QgdGFnT2JqID0gdGFnc0J5TmFtZVt0YWddO1xuICAgICAgICBpZiAodGFnT2JqKVxuICAgICAgICAgICAgcmV0dXJuIHRhZ09iajtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRhZ3NCeU5hbWUpXG4gICAgICAgICAgICAubWFwKGtleSA9PiBKU09OLnN0cmluZ2lmeShrZXkpKVxuICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjdXN0b20gdGFnIFwiJHt0YWd9XCI7IHVzZSBvbmUgb2YgJHtrZXlzfWApO1xuICAgIH0pO1xufVxuXG5leHBvcnQgeyBjb3JlS25vd25UYWdzLCBnZXRUYWdzIH07XG4iLCAiaW1wb3J0IHsgTUFQLCBTQ0FMQVIsIFNFUSB9IGZyb20gJy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAnLi9jb21tb24vbWFwLmpzJztcbmltcG9ydCB7IHNlcSB9IGZyb20gJy4vY29tbW9uL3NlcS5qcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICcuL2NvbW1vbi9zdHJpbmcuanMnO1xuaW1wb3J0IHsgZ2V0VGFncywgY29yZUtub3duVGFncyB9IGZyb20gJy4vdGFncy5qcyc7XG5cbmNvbnN0IHNvcnRNYXBFbnRyaWVzQnlLZXkgPSAoYSwgYikgPT4gYS5rZXkgPCBiLmtleSA/IC0xIDogYS5rZXkgPiBiLmtleSA/IDEgOiAwO1xuY2xhc3MgU2NoZW1hIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGNvbXBhdCwgY3VzdG9tVGFncywgbWVyZ2UsIHJlc29sdmVLbm93blRhZ3MsIHNjaGVtYSwgc29ydE1hcEVudHJpZXMsIHRvU3RyaW5nRGVmYXVsdHMgfSkge1xuICAgICAgICB0aGlzLmNvbXBhdCA9IEFycmF5LmlzQXJyYXkoY29tcGF0KVxuICAgICAgICAgICAgPyBnZXRUYWdzKGNvbXBhdCwgJ2NvbXBhdCcpXG4gICAgICAgICAgICA6IGNvbXBhdFxuICAgICAgICAgICAgICAgID8gZ2V0VGFncyhudWxsLCBjb21wYXQpXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICB0aGlzLm1lcmdlID0gISFtZXJnZTtcbiAgICAgICAgdGhpcy5uYW1lID0gKHR5cGVvZiBzY2hlbWEgPT09ICdzdHJpbmcnICYmIHNjaGVtYSkgfHwgJ2NvcmUnO1xuICAgICAgICB0aGlzLmtub3duVGFncyA9IHJlc29sdmVLbm93blRhZ3MgPyBjb3JlS25vd25UYWdzIDoge307XG4gICAgICAgIHRoaXMudGFncyA9IGdldFRhZ3MoY3VzdG9tVGFncywgdGhpcy5uYW1lKTtcbiAgICAgICAgdGhpcy50b1N0cmluZ09wdGlvbnMgPSB0b1N0cmluZ0RlZmF1bHRzID8/IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNQVAsIHsgdmFsdWU6IG1hcCB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFNDQUxBUiwgeyB2YWx1ZTogc3RyaW5nIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU0VRLCB7IHZhbHVlOiBzZXEgfSk7XG4gICAgICAgIC8vIFVzZWQgYnkgY3JlYXRlTWFwKClcbiAgICAgICAgdGhpcy5zb3J0TWFwRW50cmllcyA9XG4gICAgICAgICAgICB0eXBlb2Ygc29ydE1hcEVudHJpZXMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICA/IHNvcnRNYXBFbnRyaWVzXG4gICAgICAgICAgICAgICAgOiBzb3J0TWFwRW50cmllcyA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA/IHNvcnRNYXBFbnRyaWVzQnlLZXlcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY29weSA9IE9iamVjdC5jcmVhdGUoU2NoZW1hLnByb3RvdHlwZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModGhpcykpO1xuICAgICAgICBjb3B5LnRhZ3MgPSB0aGlzLnRhZ3Muc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBTY2hlbWEgfTtcbiIsICJpbXBvcnQgeyBpc05vZGUgfSBmcm9tICcuLi9ub2Rlcy9Ob2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQsIHN0cmluZ2lmeSB9IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCB7IGluZGVudENvbW1lbnQsIGxpbmVDb21tZW50IH0gZnJvbSAnLi9zdHJpbmdpZnlDb21tZW50LmpzJztcblxuZnVuY3Rpb24gc3RyaW5naWZ5RG9jdW1lbnQoZG9jLCBvcHRpb25zKSB7XG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICBsZXQgaGFzRGlyZWN0aXZlcyA9IG9wdGlvbnMuZGlyZWN0aXZlcyA9PT0gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucy5kaXJlY3RpdmVzICE9PSBmYWxzZSAmJiBkb2MuZGlyZWN0aXZlcykge1xuICAgICAgICBjb25zdCBkaXIgPSBkb2MuZGlyZWN0aXZlcy50b1N0cmluZyhkb2MpO1xuICAgICAgICBpZiAoZGlyKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGRpcik7XG4gICAgICAgICAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkb2MuZGlyZWN0aXZlcy5kb2NTdGFydClcbiAgICAgICAgICAgIGhhc0RpcmVjdGl2ZXMgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoaGFzRGlyZWN0aXZlcylcbiAgICAgICAgbGluZXMucHVzaCgnLS0tJyk7XG4gICAgY29uc3QgY3R4ID0gY3JlYXRlU3RyaW5naWZ5Q29udGV4dChkb2MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHsgY29tbWVudFN0cmluZyB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgaWYgKGRvYy5jb21tZW50QmVmb3JlKSB7XG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICBsaW5lcy51bnNoaWZ0KCcnKTtcbiAgICAgICAgY29uc3QgY3MgPSBjb21tZW50U3RyaW5nKGRvYy5jb21tZW50QmVmb3JlKTtcbiAgICAgICAgbGluZXMudW5zaGlmdChpbmRlbnRDb21tZW50KGNzLCAnJykpO1xuICAgIH1cbiAgICBsZXQgY2hvbXBLZWVwID0gZmFsc2U7XG4gICAgbGV0IGNvbnRlbnRDb21tZW50ID0gbnVsbDtcbiAgICBpZiAoZG9jLmNvbnRlbnRzKSB7XG4gICAgICAgIGlmIChpc05vZGUoZG9jLmNvbnRlbnRzKSkge1xuICAgICAgICAgICAgaWYgKGRvYy5jb250ZW50cy5zcGFjZUJlZm9yZSAmJiBoYXNEaXJlY3RpdmVzKVxuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgaWYgKGRvYy5jb250ZW50cy5jb21tZW50QmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSBjb21tZW50U3RyaW5nKGRvYy5jb250ZW50cy5jb21tZW50QmVmb3JlKTtcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGluZGVudENvbW1lbnQoY3MsICcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0b3AtbGV2ZWwgYmxvY2sgc2NhbGFycyBuZWVkIHRvIGJlIGluZGVudGVkIGlmIGZvbGxvd2VkIGJ5IGEgY29tbWVudFxuICAgICAgICAgICAgY3R4LmZvcmNlQmxvY2tJbmRlbnQgPSAhIWRvYy5jb21tZW50O1xuICAgICAgICAgICAgY29udGVudENvbW1lbnQgPSBkb2MuY29udGVudHMuY29tbWVudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbkNob21wS2VlcCA9IGNvbnRlbnRDb21tZW50ID8gdW5kZWZpbmVkIDogKCkgPT4gKGNob21wS2VlcCA9IHRydWUpO1xuICAgICAgICBsZXQgYm9keSA9IHN0cmluZ2lmeShkb2MuY29udGVudHMsIGN0eCwgKCkgPT4gKGNvbnRlbnRDb21tZW50ID0gbnVsbCksIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgaWYgKGNvbnRlbnRDb21tZW50KVxuICAgICAgICAgICAgYm9keSArPSBsaW5lQ29tbWVudChib2R5LCAnJywgY29tbWVudFN0cmluZyhjb250ZW50Q29tbWVudCkpO1xuICAgICAgICBpZiAoKGJvZHlbMF0gPT09ICd8JyB8fCBib2R5WzBdID09PSAnPicpICYmXG4gICAgICAgICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9PT0gJy0tLScpIHtcbiAgICAgICAgICAgIC8vIFRvcC1sZXZlbCBibG9jayBzY2FsYXJzIHdpdGggYSBwcmVjZWRpbmcgZG9jIG1hcmtlciBvdWdodCB0byB1c2UgdGhlXG4gICAgICAgICAgICAvLyBzYW1lIGxpbmUgZm9yIHRoZWlyIGhlYWRlci5cbiAgICAgICAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID0gYC0tLSAke2JvZHl9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsaW5lcy5wdXNoKGJvZHkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChzdHJpbmdpZnkoZG9jLmNvbnRlbnRzLCBjdHgpKTtcbiAgICB9XG4gICAgaWYgKGRvYy5kaXJlY3RpdmVzPy5kb2NFbmQpIHtcbiAgICAgICAgaWYgKGRvYy5jb21tZW50KSB7XG4gICAgICAgICAgICBjb25zdCBjcyA9IGNvbW1lbnRTdHJpbmcoZG9jLmNvbW1lbnQpO1xuICAgICAgICAgICAgaWYgKGNzLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJy4uLicpO1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goaW5kZW50Q29tbWVudChjcywgJycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goYC4uLiAke2NzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGluZXMucHVzaCgnLi4uJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBkYyA9IGRvYy5jb21tZW50O1xuICAgICAgICBpZiAoZGMgJiYgY2hvbXBLZWVwKVxuICAgICAgICAgICAgZGMgPSBkYy5yZXBsYWNlKC9eXFxuKy8sICcnKTtcbiAgICAgICAgaWYgKGRjKSB7XG4gICAgICAgICAgICBpZiAoKCFjaG9tcEtlZXAgfHwgY29udGVudENvbW1lbnQpICYmIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdICE9PSAnJylcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goaW5kZW50Q29tbWVudChjb21tZW50U3RyaW5nKGRjKSwgJycpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJykgKyAnXFxuJztcbn1cblxuZXhwb3J0IHsgc3RyaW5naWZ5RG9jdW1lbnQgfTtcbiIsICIvKipcbiAqIEFwcGxpZXMgdGhlIEpTT04ucGFyc2UgcmV2aXZlciBhbGdvcml0aG0gYXMgZGVmaW5lZCBpbiB0aGUgRUNNQS0yNjIgc3BlYyxcbiAqIGluIHNlY3Rpb24gMjQuNS4xLjEgXCJSdW50aW1lIFNlbWFudGljczogSW50ZXJuYWxpemVKU09OUHJvcGVydHlcIiBvZiB0aGVcbiAqIDIwMjEgZWRpdGlvbjogaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1qc29uLnBhcnNlXG4gKlxuICogSW5jbHVkZXMgZXh0ZW5zaW9ucyBmb3IgaGFuZGxpbmcgTWFwIGFuZCBTZXQgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gYXBwbHlSZXZpdmVyKHJldml2ZXIsIG9iaiwga2V5LCB2YWwpIHtcbiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB2YWwubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MCA9IHZhbFtpXTtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIFN0cmluZyhpKSwgdjApO1xuICAgICAgICAgICAgICAgIGlmICh2MSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdmFsW2ldO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYxICE9PSB2MClcbiAgICAgICAgICAgICAgICAgICAgdmFsW2ldID0gdjE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2YgQXJyYXkuZnJvbSh2YWwua2V5cygpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYwID0gdmFsLmdldChrKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIGssIHYwKTtcbiAgICAgICAgICAgICAgICBpZiAodjEgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgdmFsLmRlbGV0ZShrKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2MSAhPT0gdjApXG4gICAgICAgICAgICAgICAgICAgIHZhbC5zZXQoaywgdjEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB2MCBvZiBBcnJheS5mcm9tKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIHYwLCB2MCk7XG4gICAgICAgICAgICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHZhbC5kZWxldGUodjApO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYxICE9PSB2MCkge1xuICAgICAgICAgICAgICAgICAgICB2YWwuZGVsZXRlKHYwKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsLmFkZCh2MSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdjBdIG9mIE9iamVjdC5lbnRyaWVzKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIGssIHYwKTtcbiAgICAgICAgICAgICAgICBpZiAodjEgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHZhbFtrXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2MSAhPT0gdjApXG4gICAgICAgICAgICAgICAgICAgIHZhbFtrXSA9IHYxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXZpdmVyLmNhbGwob2JqLCBrZXksIHZhbCk7XG59XG5cbmV4cG9ydCB7IGFwcGx5UmV2aXZlciB9O1xuIiwgImltcG9ydCB7IEFsaWFzIH0gZnJvbSAnLi4vbm9kZXMvQWxpYXMuanMnO1xuaW1wb3J0IHsgaXNFbXB0eVBhdGgsIGNvbGxlY3Rpb25Gcm9tUGF0aCB9IGZyb20gJy4uL25vZGVzL0NvbGxlY3Rpb24uanMnO1xuaW1wb3J0IHsgTk9ERV9UWVBFLCBET0MsIGlzTm9kZSwgaXNDb2xsZWN0aW9uLCBpc1NjYWxhciB9IGZyb20gJy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgUGFpciB9IGZyb20gJy4uL25vZGVzL1BhaXIuanMnO1xuaW1wb3J0IHsgdG9KUyB9IGZyb20gJy4uL25vZGVzL3RvSlMuanMnO1xuaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAnLi4vc2NoZW1hL1NjaGVtYS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5LmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeURvY3VtZW50IH0gZnJvbSAnLi4vc3RyaW5naWZ5L3N0cmluZ2lmeURvY3VtZW50LmpzJztcbmltcG9ydCB7IGFuY2hvck5hbWVzLCBmaW5kTmV3QW5jaG9yLCBjcmVhdGVOb2RlQW5jaG9ycyB9IGZyb20gJy4vYW5jaG9ycy5qcyc7XG5pbXBvcnQgeyBhcHBseVJldml2ZXIgfSBmcm9tICcuL2FwcGx5UmV2aXZlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSAnLi9jcmVhdGVOb2RlLmpzJztcbmltcG9ydCB7IERpcmVjdGl2ZXMgfSBmcm9tICcuL2RpcmVjdGl2ZXMuanMnO1xuXG5jbGFzcyBEb2N1bWVudCB7XG4gICAgY29uc3RydWN0b3IodmFsdWUsIHJlcGxhY2VyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qKiBBIGNvbW1lbnQgYmVmb3JlIHRoaXMgRG9jdW1lbnQgKi9cbiAgICAgICAgdGhpcy5jb21tZW50QmVmb3JlID0gbnVsbDtcbiAgICAgICAgLyoqIEEgY29tbWVudCBpbW1lZGlhdGVseSBhZnRlciB0aGlzIERvY3VtZW50ICovXG4gICAgICAgIHRoaXMuY29tbWVudCA9IG51bGw7XG4gICAgICAgIC8qKiBFcnJvcnMgZW5jb3VudGVyZWQgZHVyaW5nIHBhcnNpbmcuICovXG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgIC8qKiBXYXJuaW5ncyBlbmNvdW50ZXJlZCBkdXJpbmcgcGFyc2luZy4gKi9cbiAgICAgICAgdGhpcy53YXJuaW5ncyA9IFtdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTk9ERV9UWVBFLCB7IHZhbHVlOiBET0MgfSk7XG4gICAgICAgIGxldCBfcmVwbGFjZXIgPSBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nIHx8IEFycmF5LmlzQXJyYXkocmVwbGFjZXIpKSB7XG4gICAgICAgICAgICBfcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgJiYgcmVwbGFjZXIpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSByZXBsYWNlcjtcbiAgICAgICAgICAgIHJlcGxhY2VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdCA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgaW50QXNCaWdJbnQ6IGZhbHNlLFxuICAgICAgICAgICAga2VlcFNvdXJjZVRva2VuczogZmFsc2UsXG4gICAgICAgICAgICBsb2dMZXZlbDogJ3dhcm4nLFxuICAgICAgICAgICAgcHJldHR5RXJyb3JzOiB0cnVlLFxuICAgICAgICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgICAgICAgdW5pcXVlS2V5czogdHJ1ZSxcbiAgICAgICAgICAgIHZlcnNpb246ICcxLjInXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHQ7XG4gICAgICAgIGxldCB7IHZlcnNpb24gfSA9IG9wdDtcbiAgICAgICAgaWYgKG9wdGlvbnM/Ll9kaXJlY3RpdmVzKSB7XG4gICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBvcHRpb25zLl9kaXJlY3RpdmVzLmF0RG9jdW1lbnQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpcmVjdGl2ZXMueWFtbC5leHBsaWNpdClcbiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdGhpcy5kaXJlY3RpdmVzLnlhbWwudmVyc2lvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7IHZlcnNpb24gfSk7XG4gICAgICAgIHRoaXMuc2V0U2NoZW1hKHZlcnNpb24sIG9wdGlvbnMpO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSBudWxsO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSB0aGlzLmNyZWF0ZU5vZGUodmFsdWUsIF9yZXBsYWNlciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgZGVlcCBjb3B5IG9mIHRoaXMgRG9jdW1lbnQgYW5kIGl0cyBjb250ZW50cy5cbiAgICAgKlxuICAgICAqIEN1c3RvbSBOb2RlIHZhbHVlcyB0aGF0IGluaGVyaXQgZnJvbSBgT2JqZWN0YCBzdGlsbCByZWZlciB0byB0aGVpciBvcmlnaW5hbCBpbnN0YW5jZXMuXG4gICAgICovXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBPYmplY3QuY3JlYXRlKERvY3VtZW50LnByb3RvdHlwZSwge1xuICAgICAgICAgICAgW05PREVfVFlQRV06IHsgdmFsdWU6IERPQyB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb3B5LmNvbW1lbnRCZWZvcmUgPSB0aGlzLmNvbW1lbnRCZWZvcmU7XG4gICAgICAgIGNvcHkuY29tbWVudCA9IHRoaXMuY29tbWVudDtcbiAgICAgICAgY29weS5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgpO1xuICAgICAgICBjb3B5Lndhcm5pbmdzID0gdGhpcy53YXJuaW5ncy5zbGljZSgpO1xuICAgICAgICBjb3B5Lm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgY29weS5kaXJlY3RpdmVzID0gdGhpcy5kaXJlY3RpdmVzLmNsb25lKCk7XG4gICAgICAgIGNvcHkuc2NoZW1hID0gdGhpcy5zY2hlbWEuY2xvbmUoKTtcbiAgICAgICAgY29weS5jb250ZW50cyA9IGlzTm9kZSh0aGlzLmNvbnRlbnRzKVxuICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLmNsb25lKGNvcHkuc2NoZW1hKVxuICAgICAgICAgICAgOiB0aGlzLmNvbnRlbnRzO1xuICAgICAgICBpZiAodGhpcy5yYW5nZSlcbiAgICAgICAgICAgIGNvcHkucmFuZ2UgPSB0aGlzLnJhbmdlLnNsaWNlKCk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKiogQWRkcyBhIHZhbHVlIHRvIHRoZSBkb2N1bWVudC4gKi9cbiAgICBhZGQodmFsdWUpIHtcbiAgICAgICAgaWYgKGFzc2VydENvbGxlY3Rpb24odGhpcy5jb250ZW50cykpXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzLmFkZCh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKiBBZGRzIGEgdmFsdWUgdG8gdGhlIGRvY3VtZW50LiAqL1xuICAgIGFkZEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKVxuICAgICAgICAgICAgdGhpcy5jb250ZW50cy5hZGRJbihwYXRoLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBgQWxpYXNgIG5vZGUsIGVuc3VyaW5nIHRoYXQgdGhlIHRhcmdldCBgbm9kZWAgaGFzIHRoZSByZXF1aXJlZCBhbmNob3IuXG4gICAgICpcbiAgICAgKiBJZiBgbm9kZWAgYWxyZWFkeSBoYXMgYW4gYW5jaG9yLCBgbmFtZWAgaXMgaWdub3JlZC5cbiAgICAgKiBPdGhlcndpc2UsIHRoZSBgbm9kZS5hbmNob3JgIHZhbHVlIHdpbGwgYmUgc2V0IHRvIGBuYW1lYCxcbiAgICAgKiBvciBpZiBhbiBhbmNob3Igd2l0aCB0aGF0IG5hbWUgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBkb2N1bWVudCxcbiAgICAgKiBgbmFtZWAgd2lsbCBiZSB1c2VkIGFzIGEgcHJlZml4IGZvciBhIG5ldyB1bmlxdWUgYW5jaG9yLlxuICAgICAqIElmIGBuYW1lYCBpcyB1bmRlZmluZWQsIHRoZSBnZW5lcmF0ZWQgYW5jaG9yIHdpbGwgdXNlICdhJyBhcyBhIHByZWZpeC5cbiAgICAgKi9cbiAgICBjcmVhdGVBbGlhcyhub2RlLCBuYW1lKSB7XG4gICAgICAgIGlmICghbm9kZS5hbmNob3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXYgPSBhbmNob3JOYW1lcyh0aGlzKTtcbiAgICAgICAgICAgIG5vZGUuYW5jaG9yID1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICAgICAgICAgICAgICAhbmFtZSB8fCBwcmV2LmhhcyhuYW1lKSA/IGZpbmROZXdBbmNob3IobmFtZSB8fCAnYScsIHByZXYpIDogbmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFsaWFzKG5vZGUuYW5jaG9yKTtcbiAgICB9XG4gICAgY3JlYXRlTm9kZSh2YWx1ZSwgcmVwbGFjZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IF9yZXBsYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFsdWUgPSByZXBsYWNlci5jYWxsKHsgJyc6IHZhbHVlIH0sICcnLCB2YWx1ZSk7XG4gICAgICAgICAgICBfcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcGxhY2VyKSkge1xuICAgICAgICAgICAgY29uc3Qga2V5VG9TdHIgPSAodikgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInIHx8IHYgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdiBpbnN0YW5jZW9mIE51bWJlcjtcbiAgICAgICAgICAgIGNvbnN0IGFzU3RyID0gcmVwbGFjZXIuZmlsdGVyKGtleVRvU3RyKS5tYXAoU3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChhc1N0ci5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJlcGxhY2VyID0gcmVwbGFjZXIuY29uY2F0KGFzU3RyKTtcbiAgICAgICAgICAgIF9yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiByZXBsYWNlcikge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHJlcGxhY2VyO1xuICAgICAgICAgICAgcmVwbGFjZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBhbGlhc0R1cGxpY2F0ZU9iamVjdHMsIGFuY2hvclByZWZpeCwgZmxvdywga2VlcFVuZGVmaW5lZCwgb25UYWdPYmosIHRhZyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICAgICAgY29uc3QgeyBvbkFuY2hvciwgc2V0QW5jaG9ycywgc291cmNlT2JqZWN0cyB9ID0gY3JlYXRlTm9kZUFuY2hvcnModGhpcywgXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICBhbmNob3JQcmVmaXggfHwgJ2EnKTtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgYWxpYXNEdXBsaWNhdGVPYmplY3RzOiBhbGlhc0R1cGxpY2F0ZU9iamVjdHMgPz8gdHJ1ZSxcbiAgICAgICAgICAgIGtlZXBVbmRlZmluZWQ6IGtlZXBVbmRlZmluZWQgPz8gZmFsc2UsXG4gICAgICAgICAgICBvbkFuY2hvcixcbiAgICAgICAgICAgIG9uVGFnT2JqLFxuICAgICAgICAgICAgcmVwbGFjZXI6IF9yZXBsYWNlcixcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICAgICAgICBzb3VyY2VPYmplY3RzXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5vZGUgPSBjcmVhdGVOb2RlKHZhbHVlLCB0YWcsIGN0eCk7XG4gICAgICAgIGlmIChmbG93ICYmIGlzQ29sbGVjdGlvbihub2RlKSlcbiAgICAgICAgICAgIG5vZGUuZmxvdyA9IHRydWU7XG4gICAgICAgIHNldEFuY2hvcnMoKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSBrZXkgYW5kIGEgdmFsdWUgaW50byBhIGBQYWlyYCB1c2luZyB0aGUgY3VycmVudCBzY2hlbWEsXG4gICAgICogcmVjdXJzaXZlbHkgd3JhcHBpbmcgYWxsIHZhbHVlcyBhcyBgU2NhbGFyYCBvciBgQ29sbGVjdGlvbmAgbm9kZXMuXG4gICAgICovXG4gICAgY3JlYXRlUGFpcihrZXksIHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgayA9IHRoaXMuY3JlYXRlTm9kZShrZXksIG51bGwsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB2ID0gdGhpcy5jcmVhdGVOb2RlKHZhbHVlLCBudWxsLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWlyKGssIHYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBkZWxldGUoa2V5KSB7XG4gICAgICAgIHJldHVybiBhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpID8gdGhpcy5jb250ZW50cy5kZWxldGUoa2V5KSA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBkZWxldGVJbihwYXRoKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpXG4gICAgICAgICAgICA/IHRoaXMuY29udGVudHMuZGVsZXRlSW4ocGF0aClcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaXRlbSBhdCBga2V5YCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLiBCeSBkZWZhdWx0IHVud3JhcHNcbiAgICAgKiBzY2FsYXIgdmFsdWVzIGZyb20gdGhlaXIgc3Vycm91bmRpbmcgbm9kZTsgdG8gZGlzYWJsZSBzZXQgYGtlZXBTY2FsYXJgIHRvXG4gICAgICogYHRydWVgIChjb2xsZWN0aW9ucyBhcmUgYWx3YXlzIHJldHVybmVkIGludGFjdCkuXG4gICAgICovXG4gICAgZ2V0KGtleSwga2VlcFNjYWxhcikge1xuICAgICAgICByZXR1cm4gaXNDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpXG4gICAgICAgICAgICA/IHRoaXMuY29udGVudHMuZ2V0KGtleSwga2VlcFNjYWxhcilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGl0ZW0gYXQgYHBhdGhgLCBvciBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmQuIEJ5IGRlZmF1bHQgdW53cmFwc1xuICAgICAqIHNjYWxhciB2YWx1ZXMgZnJvbSB0aGVpciBzdXJyb3VuZGluZyBub2RlOyB0byBkaXNhYmxlIHNldCBga2VlcFNjYWxhcmAgdG9cbiAgICAgKiBgdHJ1ZWAgKGNvbGxlY3Rpb25zIGFyZSBhbHdheXMgcmV0dXJuZWQgaW50YWN0KS5cbiAgICAgKi9cbiAgICBnZXRJbihwYXRoLCBrZWVwU2NhbGFyKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSlcbiAgICAgICAgICAgIHJldHVybiAha2VlcFNjYWxhciAmJiBpc1NjYWxhcih0aGlzLmNvbnRlbnRzKVxuICAgICAgICAgICAgICAgID8gdGhpcy5jb250ZW50cy52YWx1ZVxuICAgICAgICAgICAgICAgIDogdGhpcy5jb250ZW50cztcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKVxuICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLmdldEluKHBhdGgsIGtlZXBTY2FsYXIpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBkb2N1bWVudCBpbmNsdWRlcyBhIHZhbHVlIHdpdGggdGhlIGtleSBga2V5YC5cbiAgICAgKi9cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24odGhpcy5jb250ZW50cykgPyB0aGlzLmNvbnRlbnRzLmhhcyhrZXkpIDogZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZG9jdW1lbnQgaW5jbHVkZXMgYSB2YWx1ZSBhdCBgcGF0aGAuXG4gICAgICovXG4gICAgaGFzSW4ocGF0aCkge1xuICAgICAgICBpZiAoaXNFbXB0eVBhdGgocGF0aCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50cyAhPT0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gaXNDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpID8gdGhpcy5jb250ZW50cy5oYXNJbihwYXRoKSA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgaW4gdGhpcyBkb2N1bWVudC4gRm9yIGAhIXNldGAsIGB2YWx1ZWAgbmVlZHMgdG8gYmUgYVxuICAgICAqIGJvb2xlYW4gdG8gYWRkL3JlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBzZXQuXG4gICAgICovXG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IGNvbGxlY3Rpb25Gcm9tUGF0aCh0aGlzLnNjaGVtYSwgW2tleV0sIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgaW4gdGhpcyBkb2N1bWVudC4gRm9yIGAhIXNldGAsIGB2YWx1ZWAgbmVlZHMgdG8gYmUgYVxuICAgICAqIGJvb2xlYW4gdG8gYWRkL3JlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBzZXQuXG4gICAgICovXG4gICAgc2V0SW4ocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGlzRW1wdHlQYXRoKHBhdGgpKVxuICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IHZhbHVlO1xuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbnRlbnRzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIEFycmF5LmZyb20ocGF0aCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzLnNldEluKHBhdGgsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIFlBTUwgdmVyc2lvbiBhbmQgc2NoZW1hIHVzZWQgYnkgdGhlIGRvY3VtZW50LlxuICAgICAqIEEgYG51bGxgIHZlcnNpb24gZGlzYWJsZXMgc3VwcG9ydCBmb3IgZGlyZWN0aXZlcywgZXhwbGljaXQgdGFncywgYW5jaG9ycywgYW5kIGFsaWFzZXMuXG4gICAgICogSXQgYWxzbyByZXF1aXJlcyB0aGUgYHNjaGVtYWAgb3B0aW9uIHRvIGJlIGdpdmVuIGFzIGEgYFNjaGVtYWAgaW5zdGFuY2UgdmFsdWUuXG4gICAgICpcbiAgICAgKiBPdmVycmlkZXMgYWxsIHByZXZpb3VzbHkgc2V0IHNjaGVtYSBvcHRpb25zLlxuICAgICAqL1xuICAgIHNldFNjaGVtYSh2ZXJzaW9uLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgIHZlcnNpb24gPSBTdHJpbmcodmVyc2lvbik7XG4gICAgICAgIGxldCBvcHQ7XG4gICAgICAgIHN3aXRjaCAodmVyc2lvbikge1xuICAgICAgICAgICAgY2FzZSAnMS4xJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMueWFtbC52ZXJzaW9uID0gJzEuMSc7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7IHZlcnNpb246ICcxLjEnIH0pO1xuICAgICAgICAgICAgICAgIG9wdCA9IHsgbWVyZ2U6IHRydWUsIHJlc29sdmVLbm93blRhZ3M6IGZhbHNlLCBzY2hlbWE6ICd5YW1sLTEuMScgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzEuMic6XG4gICAgICAgICAgICBjYXNlICduZXh0JzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMueWFtbC52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IG5ldyBEaXJlY3RpdmVzKHsgdmVyc2lvbiB9KTtcbiAgICAgICAgICAgICAgICBvcHQgPSB7IG1lcmdlOiBmYWxzZSwgcmVzb2x2ZUtub3duVGFnczogdHJ1ZSwgc2NoZW1hOiAnY29yZScgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgbnVsbDpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5kaXJlY3RpdmVzO1xuICAgICAgICAgICAgICAgIG9wdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3YgPSBKU09OLnN0cmluZ2lmeSh2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICcxLjEnLCAnMS4yJyBvciBudWxsIGFzIGZpcnN0IGFyZ3VtZW50LCBidXQgZm91bmQ6ICR7c3Z9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90IHVzaW5nIGBpbnN0YW5jZW9mIFNjaGVtYWAgdG8gYWxsb3cgZm9yIGR1Y2sgdHlwaW5nXG4gICAgICAgIGlmIChvcHRpb25zLnNjaGVtYSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gb3B0aW9ucy5zY2hlbWE7XG4gICAgICAgIGVsc2UgaWYgKG9wdClcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gbmV3IFNjaGVtYShPYmplY3QuYXNzaWduKG9wdCwgb3B0aW9ucykpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdpdGggYSBudWxsIFlBTUwgdmVyc2lvbiwgdGhlIHsgc2NoZW1hOiBTY2hlbWEgfSBvcHRpb24gaXMgcmVxdWlyZWRgKTtcbiAgICB9XG4gICAgLy8ganNvbiAmIGpzb25BcmcgYXJlIG9ubHkgdXNlZCBmcm9tIHRvSlNPTigpXG4gICAgdG9KUyh7IGpzb24sIGpzb25BcmcsIG1hcEFzTWFwLCBtYXhBbGlhc0NvdW50LCBvbkFuY2hvciwgcmV2aXZlciB9ID0ge30pIHtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgYW5jaG9yczogbmV3IE1hcCgpLFxuICAgICAgICAgICAgZG9jOiB0aGlzLFxuICAgICAgICAgICAga2VlcDogIWpzb24sXG4gICAgICAgICAgICBtYXBBc01hcDogbWFwQXNNYXAgPT09IHRydWUsXG4gICAgICAgICAgICBtYXBLZXlXYXJuZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbWF4QWxpYXNDb3VudDogdHlwZW9mIG1heEFsaWFzQ291bnQgPT09ICdudW1iZXInID8gbWF4QWxpYXNDb3VudCA6IDEwMCxcbiAgICAgICAgICAgIHN0cmluZ2lmeVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXMgPSB0b0pTKHRoaXMuY29udGVudHMsIGpzb25BcmcgPz8gJycsIGN0eCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25BbmNob3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgY291bnQsIHJlcyB9IG9mIGN0eC5hbmNob3JzLnZhbHVlcygpKVxuICAgICAgICAgICAgICAgIG9uQW5jaG9yKHJlcywgY291bnQpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHsgJyc6IHJlcyB9LCAnJywgcmVzKVxuICAgICAgICAgICAgOiByZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZG9jdW1lbnQgYGNvbnRlbnRzYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBqc29uQXJnIFVzZWQgYnkgYEpTT04uc3RyaW5naWZ5YCB0byBpbmRpY2F0ZSB0aGUgYXJyYXkgaW5kZXggb3JcbiAgICAgKiAgIHByb3BlcnR5IG5hbWUuXG4gICAgICovXG4gICAgdG9KU09OKGpzb25BcmcsIG9uQW5jaG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSlMoeyBqc29uOiB0cnVlLCBqc29uQXJnLCBtYXBBc01hcDogZmFsc2UsIG9uQW5jaG9yIH0pO1xuICAgIH1cbiAgICAvKiogQSBZQU1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkb2N1bWVudC4gKi9cbiAgICB0b1N0cmluZyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY3VtZW50IHdpdGggZXJyb3JzIGNhbm5vdCBiZSBzdHJpbmdpZmllZCcpO1xuICAgICAgICBpZiAoJ2luZGVudCcgaW4gb3B0aW9ucyAmJlxuICAgICAgICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMuaW5kZW50KSB8fCBOdW1iZXIob3B0aW9ucy5pbmRlbnQpIDw9IDApKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5pbmRlbnQpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcImluZGVudFwiIG9wdGlvbiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgbm90ICR7c31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyaW5naWZ5RG9jdW1lbnQodGhpcywgb3B0aW9ucyk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0Q29sbGVjdGlvbihjb250ZW50cykge1xuICAgIGlmIChpc0NvbGxlY3Rpb24oY29udGVudHMpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgWUFNTCBjb2xsZWN0aW9uIGFzIGRvY3VtZW50IGNvbnRlbnRzJyk7XG59XG5cbmV4cG9ydCB7IERvY3VtZW50IH07XG4iLCAiY29uc3QgQlJFQUsgPSBTeW1ib2woJ2JyZWFrIHZpc2l0Jyk7XG5jb25zdCBTS0lQID0gU3ltYm9sKCdza2lwIGNoaWxkcmVuJyk7XG5jb25zdCBSRU1PVkUgPSBTeW1ib2woJ3JlbW92ZSBpdGVtJyk7XG4vKipcbiAqIEFwcGx5IGEgdmlzaXRvciB0byBhIENTVCBkb2N1bWVudCBvciBpdGVtLlxuICpcbiAqIFdhbGtzIHRocm91Z2ggdGhlIHRyZWUgKGRlcHRoLWZpcnN0KSBzdGFydGluZyBmcm9tIHRoZSByb290LCBjYWxsaW5nIGFcbiAqIGB2aXNpdG9yYCBmdW5jdGlvbiB3aXRoIHR3byBhcmd1bWVudHMgd2hlbiBlbnRlcmluZyBlYWNoIGl0ZW06XG4gKiAgIC0gYGl0ZW1gOiBUaGUgY3VycmVudCBpdGVtLCB3aGljaCBpbmNsdWRlZCB0aGUgZm9sbG93aW5nIG1lbWJlcnM6XG4gKiAgICAgLSBgc3RhcnQ6IFNvdXJjZVRva2VuW11gIFx1MjAxMyBTb3VyY2UgdG9rZW5zIGJlZm9yZSB0aGUga2V5IG9yIHZhbHVlLFxuICogICAgICAgcG9zc2libHkgaW5jbHVkaW5nIGl0cyBhbmNob3Igb3IgdGFnLlxuICogICAgIC0gYGtleT86IFRva2VuIHwgbnVsbGAgXHUyMDEzIFNldCBmb3IgcGFpciB2YWx1ZXMuIE1heSB0aGVuIGJlIGBudWxsYCwgaWZcbiAqICAgICAgIHRoZSBrZXkgYmVmb3JlIHRoZSBgOmAgc2VwYXJhdG9yIGlzIGVtcHR5LlxuICogICAgIC0gYHNlcD86IFNvdXJjZVRva2VuW11gIFx1MjAxMyBTb3VyY2UgdG9rZW5zIGJldHdlZW4gdGhlIGtleSBhbmQgdGhlIHZhbHVlLFxuICogICAgICAgd2hpY2ggc2hvdWxkIGluY2x1ZGUgdGhlIGA6YCBtYXAgdmFsdWUgaW5kaWNhdG9yIGlmIGB2YWx1ZWAgaXMgc2V0LlxuICogICAgIC0gYHZhbHVlPzogVG9rZW5gIFx1MjAxMyBUaGUgdmFsdWUgb2YgYSBzZXF1ZW5jZSBpdGVtLCBvciBvZiBhIG1hcCBwYWlyLlxuICogICAtIGBwYXRoYDogVGhlIHN0ZXBzIGZyb20gdGhlIHJvb3QgdG8gdGhlIGN1cnJlbnQgbm9kZSwgYXMgYW4gYXJyYXkgb2ZcbiAqICAgICBgWydrZXknIHwgJ3ZhbHVlJywgbnVtYmVyXWAgdHVwbGVzLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHZpc2l0b3IgbWF5IGJlIHVzZWQgdG8gY29udHJvbCB0aGUgdHJhdmVyc2FsOlxuICogICAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogRG8gbm90aGluZyBhbmQgY29udGludWVcbiAqICAgLSBgdmlzaXQuU0tJUGA6IERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhpcyB0b2tlbiwgY29udGludWUgd2l0aFxuICogICAgICBuZXh0IHNpYmxpbmdcbiAqICAgLSBgdmlzaXQuQlJFQUtgOiBUZXJtaW5hdGUgdHJhdmVyc2FsIGNvbXBsZXRlbHlcbiAqICAgLSBgdmlzaXQuUkVNT1ZFYDogUmVtb3ZlIHRoZSBjdXJyZW50IGl0ZW0sIHRoZW4gY29udGludWUgd2l0aCB0aGUgbmV4dCBvbmVcbiAqICAgLSBgbnVtYmVyYDogU2V0IHRoZSBpbmRleCBvZiB0aGUgbmV4dCBzdGVwLiBUaGlzIGlzIHVzZWZ1bCBlc3BlY2lhbGx5IGlmXG4gKiAgICAgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHRva2VuIGhhcyBjaGFuZ2VkLlxuICogICAtIGBmdW5jdGlvbmA6IERlZmluZSB0aGUgbmV4dCB2aXNpdG9yIGZvciB0aGlzIGl0ZW0uIEFmdGVyIHRoZSBvcmlnaW5hbFxuICogICAgIHZpc2l0b3IgaXMgY2FsbGVkIG9uIGl0ZW0gZW50cnksIG5leHQgdmlzaXRvcnMgYXJlIGNhbGxlZCBhZnRlciBoYW5kbGluZ1xuICogICAgIGEgbm9uLWVtcHR5IGBrZXlgIGFuZCB3aGVuIGV4aXRpbmcgdGhlIGl0ZW0uXG4gKi9cbmZ1bmN0aW9uIHZpc2l0KGNzdCwgdmlzaXRvcikge1xuICAgIGlmICgndHlwZScgaW4gY3N0ICYmIGNzdC50eXBlID09PSAnZG9jdW1lbnQnKVxuICAgICAgICBjc3QgPSB7IHN0YXJ0OiBjc3Quc3RhcnQsIHZhbHVlOiBjc3QudmFsdWUgfTtcbiAgICBfdmlzaXQoT2JqZWN0LmZyZWV6ZShbXSksIGNzdCwgdmlzaXRvcik7XG59XG4vLyBXaXRob3V0IHRoZSBgYXMgc3ltYm9sYCBjYXN0cywgVFMgZGVjbGFyZXMgdGhlc2UgaW4gdGhlIGB2aXNpdGBcbi8vIG5hbWVzcGFjZSB1c2luZyBgdmFyYCwgYnV0IHRoZW4gY29tcGxhaW5zIGFib3V0IHRoYXQgYmVjYXVzZVxuLy8gYHVuaXF1ZSBzeW1ib2xgIG11c3QgYmUgYGNvbnN0YC5cbi8qKiBUZXJtaW5hdGUgdmlzaXQgdHJhdmVyc2FsIGNvbXBsZXRlbHkgKi9cbnZpc2l0LkJSRUFLID0gQlJFQUs7XG4vKiogRG8gbm90IHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBpdGVtICovXG52aXNpdC5TS0lQID0gU0tJUDtcbi8qKiBSZW1vdmUgdGhlIGN1cnJlbnQgaXRlbSAqL1xudmlzaXQuUkVNT1ZFID0gUkVNT1ZFO1xuLyoqIEZpbmQgdGhlIGl0ZW0gYXQgYHBhdGhgIGZyb20gYGNzdGAgYXMgdGhlIHJvb3QgKi9cbnZpc2l0Lml0ZW1BdFBhdGggPSAoY3N0LCBwYXRoKSA9PiB7XG4gICAgbGV0IGl0ZW0gPSBjc3Q7XG4gICAgZm9yIChjb25zdCBbZmllbGQsIGluZGV4XSBvZiBwYXRoKSB7XG4gICAgICAgIGNvbnN0IHRvayA9IGl0ZW0/LltmaWVsZF07XG4gICAgICAgIGlmICh0b2sgJiYgJ2l0ZW1zJyBpbiB0b2spIHtcbiAgICAgICAgICAgIGl0ZW0gPSB0b2suaXRlbXNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xufTtcbi8qKlxuICogR2V0IHRoZSBpbW1lZGlhdGUgcGFyZW50IGNvbGxlY3Rpb24gb2YgdGhlIGl0ZW0gYXQgYHBhdGhgIGZyb20gYGNzdGAgYXMgdGhlIHJvb3QuXG4gKlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG5vdCBmb3VuZCwgd2hpY2ggc2hvdWxkIG5ldmVyIGhhcHBlbiBpZiB0aGUgaXRlbSBpdHNlbGYgZXhpc3RzLlxuICovXG52aXNpdC5wYXJlbnRDb2xsZWN0aW9uID0gKGNzdCwgcGF0aCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudCA9IHZpc2l0Lml0ZW1BdFBhdGgoY3N0LCBwYXRoLnNsaWNlKDAsIC0xKSk7XG4gICAgY29uc3QgZmllbGQgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV1bMF07XG4gICAgY29uc3QgY29sbCA9IHBhcmVudD8uW2ZpZWxkXTtcbiAgICBpZiAoY29sbCAmJiAnaXRlbXMnIGluIGNvbGwpXG4gICAgICAgIHJldHVybiBjb2xsO1xuICAgIHRocm93IG5ldyBFcnJvcignUGFyZW50IGNvbGxlY3Rpb24gbm90IGZvdW5kJyk7XG59O1xuZnVuY3Rpb24gX3Zpc2l0KHBhdGgsIGl0ZW0sIHZpc2l0b3IpIHtcbiAgICBsZXQgY3RybCA9IHZpc2l0b3IoaXRlbSwgcGF0aCk7XG4gICAgaWYgKHR5cGVvZiBjdHJsID09PSAnc3ltYm9sJylcbiAgICAgICAgcmV0dXJuIGN0cmw7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBbJ2tleScsICd2YWx1ZSddKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gaXRlbVtmaWVsZF07XG4gICAgICAgIGlmICh0b2tlbiAmJiAnaXRlbXMnIGluIHRva2VuKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2VuLml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2kgPSBfdmlzaXQoT2JqZWN0LmZyZWV6ZShwYXRoLmNvbmNhdChbW2ZpZWxkLCBpXV0pKSwgdG9rZW4uaXRlbXNbaV0sIHZpc2l0b3IpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2kgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgICAgICBpID0gY2kgLSAxO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNpID09PSBCUkVBSylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNpID09PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4uaXRlbXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICBpIC09IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjdHJsID09PSAnZnVuY3Rpb24nICYmIGZpZWxkID09PSAna2V5JylcbiAgICAgICAgICAgICAgICBjdHJsID0gY3RybChpdGVtLCBwYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIGN0cmwgPT09ICdmdW5jdGlvbicgPyBjdHJsKGl0ZW0sIHBhdGgpIDogY3RybDtcbn1cblxuZXhwb3J0IHsgdmlzaXQgfTtcbiIsICJpbXBvcnQgeyBCT00sIERPQ1VNRU5ULCBGTE9XX0VORCwgU0NBTEFSIH0gZnJvbSAnLi9jc3QuanMnO1xuXG4vKlxuU1RBUlQgLT4gc3RyZWFtXG5cbnN0cmVhbVxuICBkaXJlY3RpdmUgLT4gbGluZS1lbmQgLT4gc3RyZWFtXG4gIGluZGVudCArIGxpbmUtZW5kIC0+IHN0cmVhbVxuICBbZWxzZV0gLT4gbGluZS1zdGFydFxuXG5saW5lLWVuZFxuICBjb21tZW50IC0+IGxpbmUtZW5kXG4gIG5ld2xpbmUgLT4gLlxuICBpbnB1dC1lbmQgLT4gRU5EXG5cbmxpbmUtc3RhcnRcbiAgZG9jLXN0YXJ0IC0+IGRvY1xuICBkb2MtZW5kIC0+IHN0cmVhbVxuICBbZWxzZV0gLT4gaW5kZW50IC0+IGJsb2NrLXN0YXJ0XG5cbmJsb2NrLXN0YXJ0XG4gIHNlcS1pdGVtLXN0YXJ0IC0+IGJsb2NrLXN0YXJ0XG4gIGV4cGxpY2l0LWtleS1zdGFydCAtPiBibG9jay1zdGFydFxuICBtYXAtdmFsdWUtc3RhcnQgLT4gYmxvY2stc3RhcnRcbiAgW2Vsc2VdIC0+IGRvY1xuXG5kb2NcbiAgbGluZS1lbmQgLT4gbGluZS1zdGFydFxuICBzcGFjZXMgLT4gZG9jXG4gIGFuY2hvciAtPiBkb2NcbiAgdGFnIC0+IGRvY1xuICBmbG93LXN0YXJ0IC0+IGZsb3cgLT4gZG9jXG4gIGZsb3ctZW5kIC0+IGVycm9yIC0+IGRvY1xuICBzZXEtaXRlbS1zdGFydCAtPiBlcnJvciAtPiBkb2NcbiAgZXhwbGljaXQta2V5LXN0YXJ0IC0+IGVycm9yIC0+IGRvY1xuICBtYXAtdmFsdWUtc3RhcnQgLT4gZG9jXG4gIGFsaWFzIC0+IGRvY1xuICBxdW90ZS1zdGFydCAtPiBxdW90ZWQtc2NhbGFyIC0+IGRvY1xuICBibG9jay1zY2FsYXItaGVhZGVyIC0+IGxpbmUtZW5kIC0+IGJsb2NrLXNjYWxhcihtaW4pIC0+IGxpbmUtc3RhcnRcbiAgW2Vsc2VdIC0+IHBsYWluLXNjYWxhcihmYWxzZSwgbWluKSAtPiBkb2NcblxuZmxvd1xuICBsaW5lLWVuZCAtPiBmbG93XG4gIHNwYWNlcyAtPiBmbG93XG4gIGFuY2hvciAtPiBmbG93XG4gIHRhZyAtPiBmbG93XG4gIGZsb3ctc3RhcnQgLT4gZmxvdyAtPiBmbG93XG4gIGZsb3ctZW5kIC0+IC5cbiAgc2VxLWl0ZW0tc3RhcnQgLT4gZXJyb3IgLT4gZmxvd1xuICBleHBsaWNpdC1rZXktc3RhcnQgLT4gZmxvd1xuICBtYXAtdmFsdWUtc3RhcnQgLT4gZmxvd1xuICBhbGlhcyAtPiBmbG93XG4gIHF1b3RlLXN0YXJ0IC0+IHF1b3RlZC1zY2FsYXIgLT4gZmxvd1xuICBjb21tYSAtPiBmbG93XG4gIFtlbHNlXSAtPiBwbGFpbi1zY2FsYXIodHJ1ZSwgMCkgLT4gZmxvd1xuXG5xdW90ZWQtc2NhbGFyXG4gIHF1b3RlLWVuZCAtPiAuXG4gIFtlbHNlXSAtPiBxdW90ZWQtc2NhbGFyXG5cbmJsb2NrLXNjYWxhcihtaW4pXG4gIG5ld2xpbmUgKyBwZWVrKGluZGVudCA8IG1pbikgLT4gLlxuICBbZWxzZV0gLT4gYmxvY2stc2NhbGFyKG1pbilcblxucGxhaW4tc2NhbGFyKGlzLWZsb3csIG1pbilcbiAgc2NhbGFyLWVuZChpcy1mbG93KSAtPiAuXG4gIHBlZWsobmV3bGluZSArIChpbmRlbnQgPCBtaW4pKSAtPiAuXG4gIFtlbHNlXSAtPiBwbGFpbi1zY2FsYXIobWluKVxuKi9cbmZ1bmN0aW9uIGlzRW1wdHkoY2gpIHtcbiAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgY2FzZSAnXFxyJzpcbiAgICAgICAgY2FzZSAnXFx0JzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmNvbnN0IGhleERpZ2l0cyA9ICcwMTIzNDU2Nzg5QUJDREVGYWJjZGVmJy5zcGxpdCgnJyk7XG5jb25zdCB0YWdDaGFycyA9IFwiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXotIzsvPzpAJj0rJF8uIX4qJygpXCIuc3BsaXQoJycpO1xuY29uc3QgaW52YWxpZEZsb3dTY2FsYXJDaGFycyA9ICcsW117fScuc3BsaXQoJycpO1xuY29uc3QgaW52YWxpZEFuY2hvckNoYXJzID0gJyAsW117fVxcblxcclxcdCcuc3BsaXQoJycpO1xuY29uc3QgaXNOb3RBbmNob3JDaGFyID0gKGNoKSA9PiAhY2ggfHwgaW52YWxpZEFuY2hvckNoYXJzLmluY2x1ZGVzKGNoKTtcbi8qKlxuICogU3BsaXRzIGFuIGlucHV0IHN0cmluZyBpbnRvIGxleGljYWwgdG9rZW5zLCBpLmUuIHNtYWxsZXIgc3RyaW5ncyB0aGF0IGFyZVxuICogZWFzaWx5IGlkZW50aWZpYWJsZSBieSBgdG9rZW5zLnRva2VuVHlwZSgpYC5cbiAqXG4gKiBMZXhpbmcgc3RhcnRzIGFsd2F5cyBpbiBhIFwic3RyZWFtXCIgY29udGV4dC4gSW5jb21wbGV0ZSBpbnB1dCBtYXkgYmUgYnVmZmVyZWRcbiAqIHVudGlsIGEgY29tcGxldGUgdG9rZW4gY2FuIGJlIGVtaXR0ZWQuXG4gKlxuICogSW4gYWRkaXRpb24gdG8gc2xpY2VzIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCwgdGhlIGZvbGxvd2luZyBjb250cm9sIGNoYXJhY3RlcnNcbiAqIG1heSBhbHNvIGJlIGVtaXR0ZWQ6XG4gKlxuICogLSBgXFx4MDJgIChTdGFydCBvZiBUZXh0KTogQSBkb2N1bWVudCBzdGFydHMgd2l0aCB0aGUgbmV4dCB0b2tlblxuICogLSBgXFx4MThgIChDYW5jZWwpOiBVbmV4cGVjdGVkIGVuZCBvZiBmbG93LW1vZGUgKGluZGljYXRlcyBhbiBlcnJvcilcbiAqIC0gYFxceDFmYCAoVW5pdCBTZXBhcmF0b3IpOiBOZXh0IHRva2VuIGlzIGEgc2NhbGFyIHZhbHVlXG4gKiAtIGBcXHV7RkVGRn1gIChCeXRlIG9yZGVyIG1hcmspOiBFbWl0dGVkIHNlcGFyYXRlbHkgb3V0c2lkZSBkb2N1bWVudHNcbiAqL1xuY2xhc3MgTGV4ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBidWZmZXIgbWFya3MgdGhlIGVuZCBvZlxuICAgICAgICAgKiBhbGwgaW5wdXRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXRFbmQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4cGxpY2l0IGluZGVudCBzZXQgaW4gYmxvY2sgc2NhbGFyIGhlYWRlciwgYXMgYW4gb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnRcbiAgICAgICAgICogbWluaW11bSBpbmRlbnQsIHNvIGUuZy4gc2V0IHRvIDEgZnJvbSBhIGhlYWRlciBgfDIrYC4gU2V0IHRvIC0xIGlmIG5vdFxuICAgICAgICAgKiBleHBsaWNpdGx5IHNldC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJJbmRlbnQgPSAtMTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJsb2NrIHNjYWxhcnMgdGhhdCBpbmNsdWRlIGEgKyAoa2VlcCkgY2hvbXBpbmcgaW5kaWNhdG9yIGluIHRoZWlyIGhlYWRlclxuICAgICAgICAgKiBpbmNsdWRlIHRyYWlsaW5nIGVtcHR5IGxpbmVzLCB3aGljaCBhcmUgb3RoZXJ3aXNlIGV4Y2x1ZGVkIGZyb20gdGhlXG4gICAgICAgICAqIHNjYWxhcidzIGNvbnRlbnRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ibG9ja1NjYWxhcktlZXAgPSBmYWxzZTtcbiAgICAgICAgLyoqIEN1cnJlbnQgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5idWZmZXIgPSAnJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsYWcgbm90aW5nIHdoZXRoZXIgdGhlIG1hcCB2YWx1ZSBpbmRpY2F0b3IgOiBjYW4gaW1tZWRpYXRlbHkgZm9sbG93IHRoaXNcbiAgICAgICAgICogbm9kZSB3aXRoaW4gYSBmbG93IGNvbnRleHQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgLyoqIENvdW50IG9mIHN1cnJvdW5kaW5nIGZsb3cgY29sbGVjdGlvbiBsZXZlbHMuICovXG4gICAgICAgIHRoaXMuZmxvd0xldmVsID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1pbmltdW0gbGV2ZWwgb2YgaW5kZW50YXRpb24gcmVxdWlyZWQgZm9yIG5leHQgbGluZXMgdG8gYmUgcGFyc2VkIGFzIGFcbiAgICAgICAgICogcGFydCBvZiB0aGUgY3VycmVudCBzY2FsYXIgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluZGVudE5leHQgPSAwO1xuICAgICAgICAvKiogSW5kZW50YXRpb24gbGV2ZWwgb2YgdGhlIGN1cnJlbnQgbGluZS4gKi9cbiAgICAgICAgdGhpcy5pbmRlbnRWYWx1ZSA9IDA7XG4gICAgICAgIC8qKiBQb3NpdGlvbiBvZiB0aGUgbmV4dCBcXG4gY2hhcmFjdGVyLiAqL1xuICAgICAgICB0aGlzLmxpbmVFbmRQb3MgPSBudWxsO1xuICAgICAgICAvKiogU3RvcmVzIHRoZSBzdGF0ZSBvZiB0aGUgbGV4ZXIgaWYgcmVhY2hpbmcgdGhlIGVuZCBvZiBpbmNwb21wbGV0ZSBpbnB1dCAqL1xuICAgICAgICB0aGlzLm5leHQgPSBudWxsO1xuICAgICAgICAvKiogQSBwb2ludGVyIHRvIGBidWZmZXJgOyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgbGV4ZXIuICovXG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgWUFNTCB0b2tlbnMgZnJvbSB0aGUgYHNvdXJjZWAgc3RyaW5nLiBJZiBgaW5jb21wbGV0ZWAsXG4gICAgICogYSBwYXJ0IG9mIHRoZSBsYXN0IGxpbmUgbWF5IGJlIGxlZnQgYXMgYSBidWZmZXIgZm9yIHRoZSBuZXh0IGNhbGwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIGdlbmVyYXRvciBvZiBsZXhpY2FsIHRva2Vuc1xuICAgICAqL1xuICAgICpsZXgoc291cmNlLCBpbmNvbXBsZXRlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyICsgc291cmNlIDogc291cmNlO1xuICAgICAgICAgICAgdGhpcy5saW5lRW5kUG9zID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF0RW5kID0gIWluY29tcGxldGU7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5uZXh0ID8/ICdzdHJlYW0nO1xuICAgICAgICB3aGlsZSAobmV4dCAmJiAoaW5jb21wbGV0ZSB8fCB0aGlzLmhhc0NoYXJzKDEpKSlcbiAgICAgICAgICAgIG5leHQgPSB5aWVsZCogdGhpcy5wYXJzZU5leHQobmV4dCk7XG4gICAgfVxuICAgIGF0TGluZUVuZCgpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JylcbiAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgaWYgKCFjaCB8fCBjaCA9PT0gJyMnIHx8IGNoID09PSAnXFxuJylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW2kgKyAxXSA9PT0gJ1xcbic7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2hhckF0KG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zICsgbl07XG4gICAgfVxuICAgIGNvbnRpbnVlU2NhbGFyKG9mZnNldCkge1xuICAgICAgICBsZXQgY2ggPSB0aGlzLmJ1ZmZlcltvZmZzZXRdO1xuICAgICAgICBpZiAodGhpcy5pbmRlbnROZXh0ID4gMCkge1xuICAgICAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoY2ggPT09ICcgJylcbiAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraW5kZW50ICsgb2Zmc2V0XTtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5idWZmZXJbaW5kZW50ICsgb2Zmc2V0ICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICdcXG4nIHx8ICghbmV4dCAmJiAhdGhpcy5hdEVuZCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQgKyBpbmRlbnQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNoID09PSAnXFxuJyB8fCBpbmRlbnQgPj0gdGhpcy5pbmRlbnROZXh0IHx8ICghY2ggJiYgIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgPyBvZmZzZXQgKyBpbmRlbnRcbiAgICAgICAgICAgICAgICA6IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnLicpIHtcbiAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy5idWZmZXIuc3Vic3RyKG9mZnNldCwgMyk7XG4gICAgICAgICAgICBpZiAoKGR0ID09PSAnLS0tJyB8fCBkdCA9PT0gJy4uLicpICYmIGlzRW1wdHkodGhpcy5idWZmZXJbb2Zmc2V0ICsgM10pKVxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBnZXRMaW5lKCkge1xuICAgICAgICBsZXQgZW5kID0gdGhpcy5saW5lRW5kUG9zO1xuICAgICAgICBpZiAodHlwZW9mIGVuZCAhPT0gJ251bWJlcicgfHwgKGVuZCAhPT0gLTEgJiYgZW5kIDwgdGhpcy5wb3MpKSB7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKCdcXG4nLCB0aGlzLnBvcyk7XG4gICAgICAgICAgICB0aGlzLmxpbmVFbmRQb3MgPSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdEVuZCA/IHRoaXMuYnVmZmVyLnN1YnN0cmluZyh0aGlzLnBvcykgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy5idWZmZXJbZW5kIC0gMV0gPT09ICdcXHInKVxuICAgICAgICAgICAgZW5kIC09IDE7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MsIGVuZCk7XG4gICAgfVxuICAgIGhhc0NoYXJzKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zICsgbiA8PSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgfVxuICAgIHNldE5leHQoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMubGluZUVuZFBvcyA9IG51bGw7XG4gICAgICAgIHRoaXMubmV4dCA9IHN0YXRlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcGVlayhuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zdWJzdHIodGhpcy5wb3MsIG4pO1xuICAgIH1cbiAgICAqcGFyc2VOZXh0KG5leHQpIHtcbiAgICAgICAgc3dpdGNoIChuZXh0KSB7XG4gICAgICAgICAgICBjYXNlICdzdHJlYW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVN0cmVhbSgpO1xuICAgICAgICAgICAgY2FzZSAnbGluZS1zdGFydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBjYXNlICdibG9jay1zdGFydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTdGFydCgpO1xuICAgICAgICAgICAgY2FzZSAnZG9jJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VEb2N1bWVudCgpO1xuICAgICAgICAgICAgY2FzZSAnZmxvdyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlRmxvd0NvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1NjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAncGxhaW4tc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZVN0cmVhbSgpIHtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLmdldExpbmUoKTtcbiAgICAgICAgaWYgKGxpbmUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdzdHJlYW0nKTtcbiAgICAgICAgaWYgKGxpbmVbMF0gPT09IEJPTSkge1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lWzBdID09PSAnJScpIHtcbiAgICAgICAgICAgIGxldCBkaXJFbmQgPSBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGNzID0gbGluZS5pbmRleE9mKCcjJyk7XG4gICAgICAgICAgICBpZiAoY3MgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2ggPSBsaW5lW2NzIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnICcgfHwgY2ggPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBkaXJFbmQgPSBjcyAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoID0gbGluZVtkaXJFbmQgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcpXG4gICAgICAgICAgICAgICAgICAgIGRpckVuZCAtPSAxO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuID0gKHlpZWxkKiB0aGlzLnB1c2hDb3VudChkaXJFbmQpKSArICh5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpKTtcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudChsaW5lLmxlbmd0aCAtIG4pOyAvLyBwb3NzaWJsZSBjb21tZW50XG4gICAgICAgICAgICB0aGlzLnB1c2hOZXdsaW5lKCk7XG4gICAgICAgICAgICByZXR1cm4gJ3N0cmVhbSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXRMaW5lRW5kKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNwID0geWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudChsaW5lLmxlbmd0aCAtIHNwKTtcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hOZXdsaW5lKCk7XG4gICAgICAgICAgICByZXR1cm4gJ3N0cmVhbSc7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQgRE9DVU1FTlQ7XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUxpbmVTdGFydCgpO1xuICAgIH1cbiAgICAqcGFyc2VMaW5lU3RhcnQoKSB7XG4gICAgICAgIGNvbnN0IGNoID0gdGhpcy5jaGFyQXQoMCk7XG4gICAgICAgIGlmICghY2ggJiYgIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdsaW5lLXN0YXJ0Jyk7XG4gICAgICAgIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnLicpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hdEVuZCAmJiAhdGhpcy5oYXNDaGFycyg0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdsaW5lLXN0YXJ0Jyk7XG4gICAgICAgICAgICBjb25zdCBzID0gdGhpcy5wZWVrKDMpO1xuICAgICAgICAgICAgaWYgKHMgPT09ICctLS0nICYmIGlzRW1wdHkodGhpcy5jaGFyQXQoMykpKSB7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDMpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50VmFsdWUgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCA9IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkb2MnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocyA9PT0gJy4uLicgJiYgaXNFbXB0eSh0aGlzLmNoYXJBdCgzKSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzdHJlYW0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50VmFsdWUgPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuaW5kZW50TmV4dCA+IHRoaXMuaW5kZW50VmFsdWUgJiYgIWlzRW1wdHkodGhpcy5jaGFyQXQoMSkpKVxuICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gdGhpcy5pbmRlbnRWYWx1ZTtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTdGFydCgpO1xuICAgIH1cbiAgICAqcGFyc2VCbG9ja1N0YXJ0KCkge1xuICAgICAgICBjb25zdCBbY2gwLCBjaDFdID0gdGhpcy5wZWVrKDIpO1xuICAgICAgICBpZiAoIWNoMSAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Jsb2NrLXN0YXJ0Jyk7XG4gICAgICAgIGlmICgoY2gwID09PSAnLScgfHwgY2gwID09PSAnPycgfHwgY2gwID09PSAnOicpICYmIGlzRW1wdHkoY2gxKSkge1xuICAgICAgICAgICAgY29uc3QgbiA9ICh5aWVsZCogdGhpcy5wdXNoQ291bnQoMSkpICsgKHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSkpO1xuICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gdGhpcy5pbmRlbnRWYWx1ZSArIDE7XG4gICAgICAgICAgICB0aGlzLmluZGVudFZhbHVlICs9IG47XG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1N0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdkb2MnO1xuICAgIH1cbiAgICAqcGFyc2VEb2N1bWVudCgpIHtcbiAgICAgICAgeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICBpZiAobGluZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2RvYycpO1xuICAgICAgICBsZXQgbiA9IHlpZWxkKiB0aGlzLnB1c2hJbmRpY2F0b3JzKCk7XG4gICAgICAgIHN3aXRjaCAobGluZVtuXSkge1xuICAgICAgICAgICAgY2FzZSAnIyc6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gbik7XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VMaW5lU3RhcnQoKTtcbiAgICAgICAgICAgIGNhc2UgJ3snOlxuICAgICAgICAgICAgY2FzZSAnWyc6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmxvd0tleSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZmxvd0xldmVsID0gMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAnfSc6XG4gICAgICAgICAgICBjYXNlICddJzpcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnZG9jJztcbiAgICAgICAgICAgIGNhc2UgJyonOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hVbnRpbChpc05vdEFuY2hvckNoYXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnZG9jJztcbiAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlUXVvdGVkU2NhbGFyKCk7XG4gICAgICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucGFyc2VCbG9ja1NjYWxhckhlYWRlcigpO1xuICAgICAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQobGluZS5sZW5ndGggLSBuKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoTmV3bGluZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUJsb2NrU2NhbGFyKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVBsYWluU2NhbGFyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgKnBhcnNlRmxvd0NvbGxlY3Rpb24oKSB7XG4gICAgICAgIGxldCBubCwgc3A7XG4gICAgICAgIGxldCBpbmRlbnQgPSAtMTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgbmwgPSB5aWVsZCogdGhpcy5wdXNoTmV3bGluZSgpO1xuICAgICAgICAgICAgaWYgKG5sID4gMCkge1xuICAgICAgICAgICAgICAgIHNwID0geWllbGQqIHRoaXMucHVzaFNwYWNlcyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnRWYWx1ZSA9IGluZGVudCA9IHNwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3AgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3AgKz0geWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgfSB3aGlsZSAobmwgKyBzcCA+IDApO1xuICAgICAgICBjb25zdCBsaW5lID0gdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgIGlmIChsaW5lID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnZmxvdycpO1xuICAgICAgICBpZiAoKGluZGVudCAhPT0gLTEgJiYgaW5kZW50IDwgdGhpcy5pbmRlbnROZXh0ICYmIGxpbmVbMF0gIT09ICcjJykgfHxcbiAgICAgICAgICAgIChpbmRlbnQgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAobGluZS5zdGFydHNXaXRoKCctLS0nKSB8fCBsaW5lLnN0YXJ0c1dpdGgoJy4uLicpKSAmJlxuICAgICAgICAgICAgICAgIGlzRW1wdHkobGluZVszXSkpKSB7XG4gICAgICAgICAgICAvLyBBbGxvd2luZyBmb3IgdGhlIHRlcm1pbmFsIF0gb3IgfSBhdCB0aGUgc2FtZSAocmF0aGVyIHRoYW4gZ3JlYXRlcilcbiAgICAgICAgICAgIC8vIGluZGVudCBsZXZlbCBhcyB0aGUgaW5pdGlhbCBbIG9yIHsgaXMgdGVjaG5pY2FsbHkgaW52YWxpZCwgYnV0XG4gICAgICAgICAgICAvLyBmYWlsaW5nIGhlcmUgd291bGQgYmUgc3VycHJpc2luZyB0byB1c2Vycy5cbiAgICAgICAgICAgIGNvbnN0IGF0Rmxvd0VuZE1hcmtlciA9IGluZGVudCA9PT0gdGhpcy5pbmRlbnROZXh0IC0gMSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuZmxvd0xldmVsID09PSAxICYmXG4gICAgICAgICAgICAgICAgKGxpbmVbMF0gPT09ICddJyB8fCBsaW5lWzBdID09PSAnfScpO1xuICAgICAgICAgICAgaWYgKCFhdEZsb3dFbmRNYXJrZXIpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgdGhpcy5mbG93TGV2ZWwgPSAwO1xuICAgICAgICAgICAgICAgIHlpZWxkIEZMT1dfRU5EO1xuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUxpbmVTdGFydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBuID0gMDtcbiAgICAgICAgd2hpbGUgKGxpbmVbbl0gPT09ICcsJykge1xuICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnB1c2hJbmRpY2F0b3JzKCk7XG4gICAgICAgIHN3aXRjaCAobGluZVtuXSkge1xuICAgICAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudChsaW5lLmxlbmd0aCAtIG4pO1xuICAgICAgICAgICAgICAgIHJldHVybiAnZmxvdyc7XG4gICAgICAgICAgICBjYXNlICd7JzpcbiAgICAgICAgICAgIGNhc2UgJ1snOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCArPSAxO1xuICAgICAgICAgICAgICAgIHJldHVybiAnZmxvdyc7XG4gICAgICAgICAgICBjYXNlICd9JzpcbiAgICAgICAgICAgIGNhc2UgJ10nOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZmxvd0xldmVsIC09IDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmxvd0xldmVsID8gJ2Zsb3cnIDogJ2RvYyc7XG4gICAgICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoVW50aWwoaXNOb3RBbmNob3JDaGFyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgY2FzZSBcIidcIjpcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAnOic6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5jaGFyQXQoMSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmxvd0tleSB8fCBpc0VtcHR5KG5leHQpIHx8IG5leHQgPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMuZmxvd0tleSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVBsYWluU2NhbGFyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgKnBhcnNlUXVvdGVkU2NhbGFyKCkge1xuICAgICAgICBjb25zdCBxdW90ZSA9IHRoaXMuY2hhckF0KDApO1xuICAgICAgICBsZXQgZW5kID0gdGhpcy5idWZmZXIuaW5kZXhPZihxdW90ZSwgdGhpcy5wb3MgKyAxKTtcbiAgICAgICAgaWYgKHF1b3RlID09PSBcIidcIikge1xuICAgICAgICAgICAgd2hpbGUgKGVuZCAhPT0gLTEgJiYgdGhpcy5idWZmZXJbZW5kICsgMV0gPT09IFwiJ1wiKVxuICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMuYnVmZmVyLmluZGV4T2YoXCInXCIsIGVuZCArIDIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZG91YmxlLXF1b3RlXG4gICAgICAgICAgICB3aGlsZSAoZW5kICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGxldCBuID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5idWZmZXJbZW5kIC0gMSAtIG5dID09PSAnXFxcXCcpXG4gICAgICAgICAgICAgICAgICAgIG4gKz0gMTtcbiAgICAgICAgICAgICAgICBpZiAobiAlIDIgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMuYnVmZmVyLmluZGV4T2YoJ1wiJywgZW5kICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBsb29raW5nIGZvciBuZXdsaW5lcyB3aXRoaW4gdGhlIHF1b3Rlc1xuICAgICAgICBjb25zdCBxYiA9IHRoaXMuYnVmZmVyLnN1YnN0cmluZygwLCBlbmQpO1xuICAgICAgICBsZXQgbmwgPSBxYi5pbmRleE9mKCdcXG4nLCB0aGlzLnBvcyk7XG4gICAgICAgIGlmIChubCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHdoaWxlIChubCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcyA9IHRoaXMuY29udGludWVTY2FsYXIobmwgKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAoY3MgPT09IC0xKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBubCA9IHFiLmluZGV4T2YoJ1xcbicsIGNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChubCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGFuIGVycm9yIGNhdXNlZCBieSBhbiB1bmV4cGVjdGVkIHVuaW5kZW50XG4gICAgICAgICAgICAgICAgZW5kID0gbmwgLSAocWJbbmwgLSAxXSA9PT0gJ1xccicgPyAyIDogMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hdEVuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdxdW90ZWQtc2NhbGFyJyk7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQqIHRoaXMucHVzaFRvSW5kZXgoZW5kICsgMSwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93TGV2ZWwgPyAnZmxvdycgOiAnZG9jJztcbiAgICB9XG4gICAgKnBhcnNlQmxvY2tTY2FsYXJIZWFkZXIoKSB7XG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJJbmRlbnQgPSAtMTtcbiAgICAgICAgdGhpcy5ibG9ja1NjYWxhcktlZXAgPSBmYWxzZTtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcztcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJysnKVxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tTY2FsYXJLZWVwID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoID4gJzAnICYmIGNoIDw9ICc5JylcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrU2NhbGFySW5kZW50ID0gTnVtYmVyKGNoKSAtIDE7XG4gICAgICAgICAgICBlbHNlIGlmIChjaCAhPT0gJy0nKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoVW50aWwoY2ggPT4gaXNFbXB0eShjaCkgfHwgY2ggPT09ICcjJyk7XG4gICAgfVxuICAgICpwYXJzZUJsb2NrU2NhbGFyKCkge1xuICAgICAgICBsZXQgbmwgPSB0aGlzLnBvcyAtIDE7IC8vIG1heSBiZSAtMSBpZiB0aGlzLnBvcyA9PT0gMFxuICAgICAgICBsZXQgaW5kZW50ID0gMDtcbiAgICAgICAgbGV0IGNoO1xuICAgICAgICBsb29wOiBmb3IgKGxldCBpID0gdGhpcy5wb3M7IChjaCA9IHRoaXMuYnVmZmVyW2ldKTsgKytpKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdcXG4nOlxuICAgICAgICAgICAgICAgICAgICBubCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGluZGVudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xccic6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuYnVmZmVyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0ICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnYmxvY2stc2NhbGFyJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnXFxuJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gLy8gZmFsbHRocm91Z2hcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY2ggJiYgIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdibG9jay1zY2FsYXInKTtcbiAgICAgICAgaWYgKGluZGVudCA+PSB0aGlzLmluZGVudE5leHQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJsb2NrU2NhbGFySW5kZW50ID09PSAtMSlcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSBpbmRlbnQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ICs9IHRoaXMuYmxvY2tTY2FsYXJJbmRlbnQ7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSB0aGlzLmNvbnRpbnVlU2NhbGFyKG5sICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGNzID09PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgbmwgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKCdcXG4nLCBjcyk7XG4gICAgICAgICAgICB9IHdoaWxlIChubCAhPT0gLTEpO1xuICAgICAgICAgICAgaWYgKG5sID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5hdEVuZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnYmxvY2stc2NhbGFyJyk7XG4gICAgICAgICAgICAgICAgbmwgPSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmJsb2NrU2NhbGFyS2VlcCkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGxldCBpID0gbmwgLSAxO1xuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbLS1pXTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0Q2hhciA9IGk7IC8vIERyb3AgdGhlIGxpbmUgaWYgbGFzdCBjaGFyIG5vdCBtb3JlIGluZGVudGVkXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNoID09PSAnICcgfHwgY2ggPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWy0taV07XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxuJyAmJiBpID49IHRoaXMucG9zICYmIGkgKyAxICsgaW5kZW50ID4gbGFzdENoYXIpXG4gICAgICAgICAgICAgICAgICAgIG5sID0gaTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQgU0NBTEFSO1xuICAgICAgICB5aWVsZCogdGhpcy5wdXNoVG9JbmRleChubCArIDEsIHRydWUpO1xuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VMaW5lU3RhcnQoKTtcbiAgICB9XG4gICAgKnBhcnNlUGxhaW5TY2FsYXIoKSB7XG4gICAgICAgIGNvbnN0IGluRmxvdyA9IHRoaXMuZmxvd0xldmVsID4gMDtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMucG9zIC0gMTtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcyAtIDE7XG4gICAgICAgIGxldCBjaDtcbiAgICAgICAgd2hpbGUgKChjaCA9IHRoaXMuYnVmZmVyWysraV0pKSB7XG4gICAgICAgICAgICBpZiAoY2ggPT09ICc6Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkobmV4dCkgfHwgKGluRmxvdyAmJiBuZXh0ID09PSAnLCcpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNFbXB0eShjaCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMuYnVmZmVyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAnXFxuJztcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICcjJyB8fCAoaW5GbG93ICYmIGludmFsaWRGbG93U2NhbGFyQ2hhcnMuaW5jbHVkZXMobmV4dCkpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzID0gdGhpcy5jb250aW51ZVNjYWxhcihpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjcyA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaSA9IE1hdGgubWF4KGksIGNzIC0gMik7IC8vIHRvIGFkdmFuY2UsIGJ1dCBzdGlsbCBhY2NvdW50IGZvciAnICMnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGluRmxvdyAmJiBpbnZhbGlkRmxvd1NjYWxhckNoYXJzLmluY2x1ZGVzKGNoKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgncGxhaW4tc2NhbGFyJyk7XG4gICAgICAgIHlpZWxkIFNDQUxBUjtcbiAgICAgICAgeWllbGQqIHRoaXMucHVzaFRvSW5kZXgoZW5kICsgMSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBpbkZsb3cgPyAnZmxvdycgOiAnZG9jJztcbiAgICB9XG4gICAgKnB1c2hDb3VudChuKSB7XG4gICAgICAgIGlmIChuID4gMCkge1xuICAgICAgICAgICAgeWllbGQgdGhpcy5idWZmZXIuc3Vic3RyKHRoaXMucG9zLCBuKTtcbiAgICAgICAgICAgIHRoaXMucG9zICs9IG47XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgKnB1c2hUb0luZGV4KGksIGFsbG93RW1wdHkpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMuYnVmZmVyLnNsaWNlKHRoaXMucG9zLCBpKTtcbiAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgIHlpZWxkIHM7XG4gICAgICAgICAgICB0aGlzLnBvcyArPSBzLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGxvd0VtcHR5KVxuICAgICAgICAgICAgeWllbGQgJyc7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAqcHVzaEluZGljYXRvcnMoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5jaGFyQXQoMCkpIHtcbiAgICAgICAgICAgIGNhc2UgJyEnOlxuICAgICAgICAgICAgICAgIHJldHVybiAoKHlpZWxkKiB0aGlzLnB1c2hUYWcoKSkgK1xuICAgICAgICAgICAgICAgICAgICAoeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKSkgK1xuICAgICAgICAgICAgICAgICAgICAoeWllbGQqIHRoaXMucHVzaEluZGljYXRvcnMoKSkpO1xuICAgICAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgICAgICAgcmV0dXJuICgoeWllbGQqIHRoaXMucHVzaFVudGlsKGlzTm90QW5jaG9yQ2hhcikpICtcbiAgICAgICAgICAgICAgICAgICAgKHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSkpICtcbiAgICAgICAgICAgICAgICAgICAgKHlpZWxkKiB0aGlzLnB1c2hJbmRpY2F0b3JzKCkpKTtcbiAgICAgICAgICAgIGNhc2UgJy0nOiAvLyB0aGlzIGlzIGFuIGVycm9yXG4gICAgICAgICAgICBjYXNlICc/JzogLy8gdGhpcyBpcyBhbiBlcnJvciBvdXRzaWRlIGZsb3cgY29sbGVjdGlvbnNcbiAgICAgICAgICAgIGNhc2UgJzonOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5GbG93ID0gdGhpcy5mbG93TGV2ZWwgPiAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoMSA9IHRoaXMuY2hhckF0KDEpO1xuICAgICAgICAgICAgICAgIGlmIChpc0VtcHR5KGNoMSkgfHwgKGluRmxvdyAmJiBpbnZhbGlkRmxvd1NjYWxhckNoYXJzLmluY2x1ZGVzKGNoMSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW5GbG93KVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gdGhpcy5pbmRlbnRWYWx1ZSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZmxvd0tleSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmxvd0tleSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCh5aWVsZCogdGhpcy5wdXNoQ291bnQoMSkpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICh5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAoeWllbGQqIHRoaXMucHVzaEluZGljYXRvcnMoKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgKnB1c2hUYWcoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXJBdCgxKSA9PT0gJzwnKSB7XG4gICAgICAgICAgICBsZXQgaSA9IHRoaXMucG9zICsgMjtcbiAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgd2hpbGUgKCFpc0VtcHR5KGNoKSAmJiBjaCAhPT0gJz4nKVxuICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoVG9JbmRleChjaCA9PT0gJz4nID8gaSArIDEgOiBpLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgaSA9IHRoaXMucG9zICsgMTtcbiAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgd2hpbGUgKGNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ0NoYXJzLmluY2x1ZGVzKGNoKSlcbiAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsrK2ldO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAnJScgJiZcbiAgICAgICAgICAgICAgICAgICAgaGV4RGlnaXRzLmluY2x1ZGVzKHRoaXMuYnVmZmVyW2kgKyAxXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgaGV4RGlnaXRzLmluY2x1ZGVzKHRoaXMuYnVmZmVyW2kgKyAyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsoaSArPSAzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFRvSW5kZXgoaSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwdXNoTmV3bGluZSgpIHtcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLmJ1ZmZlclt0aGlzLnBvc107XG4gICAgICAgIGlmIChjaCA9PT0gJ1xcbicpXG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICBlbHNlIGlmIChjaCA9PT0gJ1xccicgJiYgdGhpcy5jaGFyQXQoMSkgPT09ICdcXG4nKVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgyKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgICpwdXNoU3BhY2VzKGFsbG93VGFicykge1xuICAgICAgICBsZXQgaSA9IHRoaXMucG9zIC0gMTtcbiAgICAgICAgbGV0IGNoO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgIH0gd2hpbGUgKGNoID09PSAnICcgfHwgKGFsbG93VGFicyAmJiBjaCA9PT0gJ1xcdCcpKTtcbiAgICAgICAgY29uc3QgbiA9IGkgLSB0aGlzLnBvcztcbiAgICAgICAgaWYgKG4gPiAwKSB7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmJ1ZmZlci5zdWJzdHIodGhpcy5wb3MsIG4pO1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICAqcHVzaFVudGlsKHRlc3QpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlICghdGVzdChjaCkpXG4gICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoVG9JbmRleChpLCBmYWxzZSk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBMZXhlciB9O1xuIiwgImltcG9ydCB7IENvbXBvc2VyIH0gZnJvbSAnLi9jb21wb3NlL2NvbXBvc2VyLmpzJztcbmltcG9ydCB7IERvY3VtZW50IH0gZnJvbSAnLi9kb2MvRG9jdW1lbnQuanMnO1xuaW1wb3J0IHsgcHJldHRpZnlFcnJvciwgWUFNTFBhcnNlRXJyb3IgfSBmcm9tICcuL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyB3YXJuIH0gZnJvbSAnLi9sb2cuanMnO1xuaW1wb3J0IHsgTGluZUNvdW50ZXIgfSBmcm9tICcuL3BhcnNlL2xpbmUtY291bnRlci5qcyc7XG5pbXBvcnQgeyBQYXJzZXIgfSBmcm9tICcuL3BhcnNlL3BhcnNlci5qcyc7XG5cbmZ1bmN0aW9uIHBhcnNlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgY29uc3QgcHJldHR5RXJyb3JzID0gb3B0aW9ucy5wcmV0dHlFcnJvcnMgIT09IGZhbHNlO1xuICAgIGNvbnN0IGxpbmVDb3VudGVyID0gb3B0aW9ucy5saW5lQ291bnRlciB8fCAocHJldHR5RXJyb3JzICYmIG5ldyBMaW5lQ291bnRlcigpKSB8fCBudWxsO1xuICAgIHJldHVybiB7IGxpbmVDb3VudGVyLCBwcmV0dHlFcnJvcnMgfTtcbn1cbi8qKlxuICogUGFyc2UgdGhlIGlucHV0IGFzIGEgc3RyZWFtIG9mIFlBTUwgZG9jdW1lbnRzLlxuICpcbiAqIERvY3VtZW50cyBzaG91bGQgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciBieSBgLi4uYCBvciBgLS0tYCBtYXJrZXIgbGluZXMuXG4gKlxuICogQHJldHVybnMgSWYgYW4gZW1wdHkgYGRvY3NgIGFycmF5IGlzIHJldHVybmVkLCBpdCB3aWxsIGJlIG9mIHR5cGVcbiAqICAgRW1wdHlTdHJlYW0gYW5kIGNvbnRhaW4gYWRkaXRpb25hbCBzdHJlYW0gaW5mb3JtYXRpb24uIEluXG4gKiAgIFR5cGVTY3JpcHQsIHlvdSBzaG91bGQgdXNlIGAnZW1wdHknIGluIGRvY3NgIGFzIGEgdHlwZSBndWFyZCBmb3IgaXQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQWxsRG9jdW1lbnRzKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBsaW5lQ291bnRlciwgcHJldHR5RXJyb3JzIH0gPSBwYXJzZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcihsaW5lQ291bnRlcj8uYWRkTmV3TGluZSk7XG4gICAgY29uc3QgY29tcG9zZXIgPSBuZXcgQ29tcG9zZXIob3B0aW9ucyk7XG4gICAgY29uc3QgZG9jcyA9IEFycmF5LmZyb20oY29tcG9zZXIuY29tcG9zZShwYXJzZXIucGFyc2Uoc291cmNlKSkpO1xuICAgIGlmIChwcmV0dHlFcnJvcnMgJiYgbGluZUNvdW50ZXIpXG4gICAgICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICAgICAgICAgIGRvYy5lcnJvcnMuZm9yRWFjaChwcmV0dGlmeUVycm9yKHNvdXJjZSwgbGluZUNvdW50ZXIpKTtcbiAgICAgICAgICAgIGRvYy53YXJuaW5ncy5mb3JFYWNoKHByZXR0aWZ5RXJyb3Ioc291cmNlLCBsaW5lQ291bnRlcikpO1xuICAgICAgICB9XG4gICAgaWYgKGRvY3MubGVuZ3RoID4gMClcbiAgICAgICAgcmV0dXJuIGRvY3M7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oW10sIHsgZW1wdHk6IHRydWUgfSwgY29tcG9zZXIuc3RyZWFtSW5mbygpKTtcbn1cbi8qKiBQYXJzZSBhbiBpbnB1dCBzdHJpbmcgaW50byBhIHNpbmdsZSBZQU1MLkRvY3VtZW50ICovXG5mdW5jdGlvbiBwYXJzZURvY3VtZW50KHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBsaW5lQ291bnRlciwgcHJldHR5RXJyb3JzIH0gPSBwYXJzZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcihsaW5lQ291bnRlcj8uYWRkTmV3TGluZSk7XG4gICAgY29uc3QgY29tcG9zZXIgPSBuZXcgQ29tcG9zZXIob3B0aW9ucyk7XG4gICAgLy8gYGRvY2AgaXMgYWx3YXlzIHNldCBieSBjb21wb3NlLmVuZCh0cnVlKSBhdCB0aGUgdmVyeSBsYXRlc3RcbiAgICBsZXQgZG9jID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IF9kb2Mgb2YgY29tcG9zZXIuY29tcG9zZShwYXJzZXIucGFyc2Uoc291cmNlKSwgdHJ1ZSwgc291cmNlLmxlbmd0aCkpIHtcbiAgICAgICAgaWYgKCFkb2MpXG4gICAgICAgICAgICBkb2MgPSBfZG9jO1xuICAgICAgICBlbHNlIGlmIChkb2Mub3B0aW9ucy5sb2dMZXZlbCAhPT0gJ3NpbGVudCcpIHtcbiAgICAgICAgICAgIGRvYy5lcnJvcnMucHVzaChuZXcgWUFNTFBhcnNlRXJyb3IoX2RvYy5yYW5nZS5zbGljZSgwLCAyKSwgJ01VTFRJUExFX0RPQ1MnLCAnU291cmNlIGNvbnRhaW5zIG11bHRpcGxlIGRvY3VtZW50czsgcGxlYXNlIHVzZSBZQU1MLnBhcnNlQWxsRG9jdW1lbnRzKCknKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJldHR5RXJyb3JzICYmIGxpbmVDb3VudGVyKSB7XG4gICAgICAgIGRvYy5lcnJvcnMuZm9yRWFjaChwcmV0dGlmeUVycm9yKHNvdXJjZSwgbGluZUNvdW50ZXIpKTtcbiAgICAgICAgZG9jLndhcm5pbmdzLmZvckVhY2gocHJldHRpZnlFcnJvcihzb3VyY2UsIGxpbmVDb3VudGVyKSk7XG4gICAgfVxuICAgIHJldHVybiBkb2M7XG59XG5mdW5jdGlvbiBwYXJzZShzcmMsIHJldml2ZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgX3Jldml2ZXIgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiByZXZpdmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIF9yZXZpdmVyID0gcmV2aXZlcjtcbiAgICB9XG4gICAgZWxzZSBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkICYmIHJldml2ZXIgJiYgdHlwZW9mIHJldml2ZXIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdGlvbnMgPSByZXZpdmVyO1xuICAgIH1cbiAgICBjb25zdCBkb2MgPSBwYXJzZURvY3VtZW50KHNyYywgb3B0aW9ucyk7XG4gICAgaWYgKCFkb2MpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGRvYy53YXJuaW5ncy5mb3JFYWNoKHdhcm5pbmcgPT4gd2Fybihkb2Mub3B0aW9ucy5sb2dMZXZlbCwgd2FybmluZykpO1xuICAgIGlmIChkb2MuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGRvYy5vcHRpb25zLmxvZ0xldmVsICE9PSAnc2lsZW50JylcbiAgICAgICAgICAgIHRocm93IGRvYy5lcnJvcnNbMF07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRvYy5lcnJvcnMgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGRvYy50b0pTKE9iamVjdC5hc3NpZ24oeyByZXZpdmVyOiBfcmV2aXZlciB9LCBvcHRpb25zKSk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkodmFsdWUsIHJlcGxhY2VyLCBvcHRpb25zKSB7XG4gICAgbGV0IF9yZXBsYWNlciA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJyB8fCBBcnJheS5pc0FycmF5KHJlcGxhY2VyKSkge1xuICAgICAgICBfcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgICB9XG4gICAgZWxzZSBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkICYmIHJlcGxhY2VyKSB7XG4gICAgICAgIG9wdGlvbnMgPSByZXBsYWNlcjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJylcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMubGVuZ3RoO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgaW5kZW50ID0gTWF0aC5yb3VuZChvcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucyA9IGluZGVudCA8IDEgPyB1bmRlZmluZWQgOiBpbmRlbnQgPiA4ID8geyBpbmRlbnQ6IDggfSA6IHsgaW5kZW50IH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHsga2VlcFVuZGVmaW5lZCB9ID0gb3B0aW9ucyA/PyByZXBsYWNlciA/PyB7fTtcbiAgICAgICAgaWYgKCFrZWVwVW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEb2N1bWVudCh2YWx1ZSwgX3JlcGxhY2VyLCBvcHRpb25zKS50b1N0cmluZyhvcHRpb25zKTtcbn1cblxuZXhwb3J0IHsgcGFyc2UsIHBhcnNlQWxsRG9jdW1lbnRzLCBwYXJzZURvY3VtZW50LCBzdHJpbmdpZnkgfTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFFQSxZQUFPLFVBQVU7QUFFakIsa0JBQWMsS0FBSztBQUNqQixVQUFJLEtBQUs7QUFDUCxjQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ05WO0FBQUE7QUFPQSxZQUFPLFVBQVUsa0JBQW1CLEtBQUs7QUFDdkMsYUFBTyxPQUFPLFFBQVEsSUFBSSxlQUFlLFFBQ3ZDLE9BQU8sSUFBSSxZQUFZLGFBQWEsY0FBYyxJQUFJLFlBQVksU0FBUztBQUFBO0FBQUE7QUFBQTs7O0FDVC9FO0FBQUE7QUFBQTtBQUVBLFFBQUksU0FBUyxPQUFPLFVBQVU7QUFDOUIsUUFBSSxRQUFRLE9BQU8sVUFBVTtBQUM3QixRQUFJLGlCQUFpQixPQUFPO0FBQzVCLFFBQUksT0FBTyxPQUFPO0FBRWxCLFFBQUksVUFBVSxrQkFBaUIsS0FBSztBQUNuQyxVQUFJLE9BQU8sTUFBTSxZQUFZLFlBQVk7QUFDeEMsZUFBTyxNQUFNLFFBQVE7QUFBQTtBQUd0QixhQUFPLE1BQU0sS0FBSyxTQUFTO0FBQUE7QUFHNUIs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QVcsS0FBSTtBQUNyQixjQUFJLHdCQUFPLEdBQUc7QUFBQSxlQUNUO0FBQ0wsY0FBSSx3QkFBTyxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtiLDBCQUEwQixLQUFVO0FBQUE7QUFDekMsWUFBTSxVQUFVLElBQUksVUFBVTtBQUM5QixVQUFJLFNBQVM7QUFDWixjQUFNLFdBQW1CLFFBQVE7QUFFakMsY0FBTSxXQUFtQixRQUFRLE1BQU0sUUFBUTtBQUMvQyxjQUFNLFdBQVcsb0NBQWMsc0JBQUssVUFBVTtBQUM5QyxnQkFBUSxJQUFJLFlBQVk7QUFDeEIsY0FBTSxXQUFXLEFBQUcsaUJBQWEsVUFBVTtBQUMzQyxlQUFPO0FBQUEsVUFDTjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUE7QUFBQSxhQUVLO0FBQ04sWUFBSSx3QkFBTztBQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSSxlQUFlO0FBQUE7QUFDcEIsV0FBSyxXQUFXLE9BQU8sT0FDdEIsSUFDQSxrQkFDQSxNQUFNLEtBQUs7QUFBQTtBQUFBO0FBQUEsRUFJUCxlQUFlO0FBQUE7QUFDcEIsWUFBTSxLQUFLLFNBQVMsS0FBSztBQUFBO0FBQUE7QUFBQTtBQW9CM0IscUNBQStCLGtDQUFpQjtBQUFBLEVBRy9DLFlBQVksS0FBVSxRQUFrQjtBQUN2QyxVQUFNLEtBQUs7QUFDWCxTQUFLLFNBQVM7QUFBQTtBQUFBLEVBR2YsVUFBZ0I7QUFDZixVQUFNLEVBQUUsZ0JBQWdCO0FBRXhCLGdCQUFZO0FBRVosZ0JBQVksU0FBUyxNQUFNO0FBQUEsTUFDMUIsTUFBTTtBQUFBO0FBR1AsUUFBSSx5QkFBUSxhQUNWLFFBQVEsb0JBQ1IsUUFBUSxpQkFDUixRQUFRLENBQUMsU0FDVCxLQUNFLGVBQWUsK0JBQ2YsU0FBUyxLQUFLLE9BQU8sU0FBUyxXQUM5QixTQUFTLENBQU8sVUFBVTtBQUMxQixjQUFRLElBQUksYUFBYTtBQUN6QixXQUFLLE9BQU8sU0FBUyxZQUFZO0FBQ2pDLFlBQU0sS0FBSyxPQUFPO0FBQUE7QUFJdEIsUUFBSSx5QkFBUSxhQUNWLFFBQVEsZUFDUixRQUFRLGlCQUNSLFFBQVEsQ0FBQyxTQUNULEtBQ0UsZUFBZSwwQkFDZixTQUFTLEtBQUssT0FBTyxTQUFTLFlBQzlCLFNBQVMsQ0FBTyxVQUFVO0FBQzFCLGNBQVEsSUFBSSxhQUFhO0FBQ3pCLFdBQUssT0FBTyxTQUFTLGFBQWE7QUFDbEMsWUFBTSxLQUFLLE9BQU87QUFBQTtBQUFBO0FBQUE7IiwKICAibmFtZXMiOiBbXQp9Cg==