/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // node_modules/css/lib/parse/index.js var require_parse = __commonJS({ "node_modules/css/lib/parse/index.js"(exports, module2) { var commentre = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//g; module2.exports = function(css2, options) { options = options || {}; var lineno = 1; var column = 1; function updatePosition(str) { var lines = str.match(/\n/g); if (lines) lineno += lines.length; var i = str.lastIndexOf("\n"); column = ~i ? str.length - i : column + str.length; } function position() { var start = { line: lineno, column }; return function(node) { node.position = new Position(start); whitespace(); return node; }; } function Position(start) { this.start = start; this.end = { line: lineno, column }; this.source = options.source; } Position.prototype.content = css2; var errorsList = []; function error(msg) { var err = new Error(options.source + ":" + lineno + ":" + column + ": " + msg); err.reason = msg; err.filename = options.source; err.line = lineno; err.column = column; err.source = css2; if (options.silent) { errorsList.push(err); } else { throw err; } } function stylesheet() { var rulesList = rules(); return { type: "stylesheet", stylesheet: { source: options.source, rules: rulesList, parsingErrors: errorsList } }; } function open() { return match(/^{\s*/); } function close() { return match(/^}/); } function rules() { var node; var rules2 = []; whitespace(); comments(rules2); while (css2.length && css2.charAt(0) != "}" && (node = atrule() || rule())) { if (node !== false) { rules2.push(node); comments(rules2); } } return rules2; } function match(re) { var m = re.exec(css2); if (!m) return; var str = m[0]; updatePosition(str); css2 = css2.slice(str.length); return m; } function whitespace() { match(/^\s*/); } function comments(rules2) { var c; rules2 = rules2 || []; while (c = comment()) { if (c !== false) { rules2.push(c); } } return rules2; } function comment() { var pos = position(); if ("/" != css2.charAt(0) || "*" != css2.charAt(1)) return; var i = 2; while ("" != css2.charAt(i) && ("*" != css2.charAt(i) || "/" != css2.charAt(i + 1))) ++i; i += 2; if ("" === css2.charAt(i - 1)) { return error("End of comment missing"); } var str = css2.slice(2, i - 2); column += 2; updatePosition(str); css2 = css2.slice(i); column += 2; return pos({ type: "comment", comment: str }); } function selector() { var m = match(/^([^{]+)/); if (!m) return; return trim(m[0]).replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/g, "").replace(/"(?:\\"|[^"])*"|'(?:\\'|[^'])*'/g, function(m2) { return m2.replace(/,/g, "\u200C"); }).split(/\s*(?![^(]*\)),\s*/).map(function(s) { return s.replace(/\u200C/g, ","); }); } function declaration() { var pos = position(); var prop = match(/^(\*?[-#\/\*\\\w]+(\[[0-9a-z_-]+\])?)\s*/); if (!prop) return; prop = trim(prop[0]); if (!match(/^:\s*/)) return error("property missing ':'"); var val = match(/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^\)]*?\)|[^};])+)/); var ret = pos({ type: "declaration", property: prop.replace(commentre, ""), value: val ? trim(val[0]).replace(commentre, "") : "" }); match(/^[;\s]*/); return ret; } function declarations() { var decls = []; if (!open()) return error("missing '{'"); comments(decls); var decl; while (decl = declaration()) { if (decl !== false) { decls.push(decl); comments(decls); } } if (!close()) return error("missing '}'"); return decls; } function keyframe() { var m; var vals = []; var pos = position(); while (m = match(/^((\d+\.\d+|\.\d+|\d+)%?|[a-z]+)\s*/)) { vals.push(m[1]); match(/^,\s*/); } if (!vals.length) return; return pos({ type: "keyframe", values: vals, declarations: declarations() }); } function atkeyframes() { var pos = position(); var m = match(/^@([-\w]+)?keyframes\s*/); if (!m) return; var vendor = m[1]; var m = match(/^([-\w]+)\s*/); if (!m) return error("@keyframes missing name"); var name = m[1]; if (!open()) return error("@keyframes missing '{'"); var frame; var frames = comments(); while (frame = keyframe()) { frames.push(frame); frames = frames.concat(comments()); } if (!close()) return error("@keyframes missing '}'"); return pos({ type: "keyframes", name, vendor, keyframes: frames }); } function atsupports() { var pos = position(); var m = match(/^@supports *([^{]+)/); if (!m) return; var supports = trim(m[1]); if (!open()) return error("@supports missing '{'"); var style = comments().concat(rules()); if (!close()) return error("@supports missing '}'"); return pos({ type: "supports", supports, rules: style }); } function athost() { var pos = position(); var m = match(/^@host\s*/); if (!m) return; if (!open()) return error("@host missing '{'"); var style = comments().concat(rules()); if (!close()) return error("@host missing '}'"); return pos({ type: "host", rules: style }); } function atmedia() { var pos = position(); var m = match(/^@media *([^{]+)/); if (!m) return; var media = trim(m[1]); if (!open()) return error("@media missing '{'"); var style = comments().concat(rules()); if (!close()) return error("@media missing '}'"); return pos({ type: "media", media, rules: style }); } function atcustommedia() { var pos = position(); var m = match(/^@custom-media\s+(--[^\s]+)\s*([^{;]+);/); if (!m) return; return pos({ type: "custom-media", name: trim(m[1]), media: trim(m[2]) }); } function atpage() { var pos = position(); var m = match(/^@page */); if (!m) return; var sel = selector() || []; if (!open()) return error("@page missing '{'"); var decls = comments(); var decl; while (decl = declaration()) { decls.push(decl); decls = decls.concat(comments()); } if (!close()) return error("@page missing '}'"); return pos({ type: "page", selectors: sel, declarations: decls }); } function atdocument() { var pos = position(); var m = match(/^@([-\w]+)?document *([^{]+)/); if (!m) return; var vendor = trim(m[1]); var doc = trim(m[2]); if (!open()) return error("@document missing '{'"); var style = comments().concat(rules()); if (!close()) return error("@document missing '}'"); return pos({ type: "document", document: doc, vendor, rules: style }); } function atfontface() { var pos = position(); var m = match(/^@font-face\s*/); if (!m) return; if (!open()) return error("@font-face missing '{'"); var decls = comments(); var decl; while (decl = declaration()) { decls.push(decl); decls = decls.concat(comments()); } if (!close()) return error("@font-face missing '}'"); return pos({ type: "font-face", declarations: decls }); } var atimport = _compileAtrule("import"); var atcharset = _compileAtrule("charset"); var atnamespace = _compileAtrule("namespace"); function _compileAtrule(name) { var re = new RegExp("^@" + name + "\\s*([^;]+);"); return function() { var pos = position(); var m = match(re); if (!m) return; var ret = { type: name }; ret[name] = m[1].trim(); return pos(ret); }; } function atrule() { if (css2[0] != "@") return; return atkeyframes() || atmedia() || atcustommedia() || atsupports() || atimport() || atcharset() || atnamespace() || atdocument() || atpage() || athost() || atfontface(); } function rule() { var pos = position(); var sel = selector(); if (!sel) return error("selector missing"); comments(); return pos({ type: "rule", selectors: sel, declarations: declarations() }); } return addParent(stylesheet()); }; function trim(str) { return str ? str.replace(/^\s+|\s+$/g, "") : ""; } function addParent(obj, parent) { var isNode = obj && typeof obj.type === "string"; var childParent = isNode ? obj : parent; for (var k in obj) { var value = obj[k]; if (Array.isArray(value)) { value.forEach(function(v) { addParent(v, childParent); }); } else if (value && typeof value === "object") { addParent(value, childParent); } } if (isNode) { Object.defineProperty(obj, "parent", { configurable: true, writable: true, enumerable: false, value: parent || null }); } return obj; } } }); // node_modules/css/lib/stringify/compiler.js var require_compiler = __commonJS({ "node_modules/css/lib/stringify/compiler.js"(exports, module2) { module2.exports = Compiler; function Compiler(opts) { this.options = opts || {}; } Compiler.prototype.emit = function(str) { return str; }; Compiler.prototype.visit = function(node) { return this[node.type](node); }; Compiler.prototype.mapVisit = function(nodes, delim) { var buf = ""; delim = delim || ""; for (var i = 0, length = nodes.length; i < length; i++) { buf += this.visit(nodes[i]); if (delim && i < length - 1) buf += this.emit(delim); } return buf; }; } }); // node_modules/inherits/inherits_browser.js var require_inherits_browser = __commonJS({ "node_modules/inherits/inherits_browser.js"(exports, module2) { if (typeof Object.create === "function") { module2.exports = function inherits(ctor, superCtor) { if (superCtor) { ctor.super_ = superCtor; ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); } }; } else { module2.exports = function inherits(ctor, superCtor) { if (superCtor) { ctor.super_ = superCtor; var TempCtor = function() { }; TempCtor.prototype = superCtor.prototype; ctor.prototype = new TempCtor(); ctor.prototype.constructor = ctor; } }; } } }); // node_modules/css/lib/stringify/compress.js var require_compress = __commonJS({ "node_modules/css/lib/stringify/compress.js"(exports, module2) { var Base = require_compiler(); var inherits = require_inherits_browser(); module2.exports = Compiler; function Compiler(options) { Base.call(this, options); } inherits(Compiler, Base); Compiler.prototype.compile = function(node) { return node.stylesheet.rules.map(this.visit, this).join(""); }; Compiler.prototype.comment = function(node) { return this.emit("", node.position); }; Compiler.prototype.import = function(node) { return this.emit("@import " + node.import + ";", node.position); }; Compiler.prototype.media = function(node) { return this.emit("@media " + node.media, node.position) + this.emit("{") + this.mapVisit(node.rules) + this.emit("}"); }; Compiler.prototype.document = function(node) { var doc = "@" + (node.vendor || "") + "document " + node.document; return this.emit(doc, node.position) + this.emit("{") + this.mapVisit(node.rules) + this.emit("}"); }; Compiler.prototype.charset = function(node) { return this.emit("@charset " + node.charset + ";", node.position); }; Compiler.prototype.namespace = function(node) { return this.emit("@namespace " + node.namespace + ";", node.position); }; Compiler.prototype.supports = function(node) { return this.emit("@supports " + node.supports, node.position) + this.emit("{") + this.mapVisit(node.rules) + this.emit("}"); }; Compiler.prototype.keyframes = function(node) { return this.emit("@" + (node.vendor || "") + "keyframes " + node.name, node.position) + this.emit("{") + this.mapVisit(node.keyframes) + this.emit("}"); }; Compiler.prototype.keyframe = function(node) { var decls = node.declarations; return this.emit(node.values.join(","), node.position) + this.emit("{") + this.mapVisit(decls) + this.emit("}"); }; Compiler.prototype.page = function(node) { var sel = node.selectors.length ? node.selectors.join(", ") : ""; return this.emit("@page " + sel, node.position) + this.emit("{") + this.mapVisit(node.declarations) + this.emit("}"); }; Compiler.prototype["font-face"] = function(node) { return this.emit("@font-face", node.position) + this.emit("{") + this.mapVisit(node.declarations) + this.emit("}"); }; Compiler.prototype.host = function(node) { return this.emit("@host", node.position) + this.emit("{") + this.mapVisit(node.rules) + this.emit("}"); }; Compiler.prototype["custom-media"] = function(node) { return this.emit("@custom-media " + node.name + " " + node.media + ";", node.position); }; Compiler.prototype.rule = function(node) { var decls = node.declarations; if (!decls.length) return ""; return this.emit(node.selectors.join(","), node.position) + this.emit("{") + this.mapVisit(decls) + this.emit("}"); }; Compiler.prototype.declaration = function(node) { return this.emit(node.property + ":" + node.value, node.position) + this.emit(";"); }; } }); // node_modules/css/lib/stringify/identity.js var require_identity = __commonJS({ "node_modules/css/lib/stringify/identity.js"(exports, module2) { var Base = require_compiler(); var inherits = require_inherits_browser(); module2.exports = Compiler; function Compiler(options) { options = options || {}; Base.call(this, options); this.indentation = options.indent; } inherits(Compiler, Base); Compiler.prototype.compile = function(node) { return this.stylesheet(node); }; Compiler.prototype.stylesheet = function(node) { return this.mapVisit(node.stylesheet.rules, "\n\n"); }; Compiler.prototype.comment = function(node) { return this.emit(this.indent() + "/*" + node.comment + "*/", node.position); }; Compiler.prototype.import = function(node) { return this.emit("@import " + node.import + ";", node.position); }; Compiler.prototype.media = function(node) { return this.emit("@media " + node.media, node.position) + this.emit( " {\n" + this.indent(1) ) + this.mapVisit(node.rules, "\n\n") + this.emit( this.indent(-1) + "\n}" ); }; Compiler.prototype.document = function(node) { var doc = "@" + (node.vendor || "") + "document " + node.document; return this.emit(doc, node.position) + this.emit( " {\n" + this.indent(1) ) + this.mapVisit(node.rules, "\n\n") + this.emit( this.indent(-1) + "\n}" ); }; Compiler.prototype.charset = function(node) { return this.emit("@charset " + node.charset + ";", node.position); }; Compiler.prototype.namespace = function(node) { return this.emit("@namespace " + node.namespace + ";", node.position); }; Compiler.prototype.supports = function(node) { return this.emit("@supports " + node.supports, node.position) + this.emit( " {\n" + this.indent(1) ) + this.mapVisit(node.rules, "\n\n") + this.emit( this.indent(-1) + "\n}" ); }; Compiler.prototype.keyframes = function(node) { return this.emit("@" + (node.vendor || "") + "keyframes " + node.name, node.position) + this.emit( " {\n" + this.indent(1) ) + this.mapVisit(node.keyframes, "\n") + this.emit( this.indent(-1) + "}" ); }; Compiler.prototype.keyframe = function(node) { var decls = node.declarations; return this.emit(this.indent()) + this.emit(node.values.join(", "), node.position) + this.emit( " {\n" + this.indent(1) ) + this.mapVisit(decls, "\n") + this.emit( this.indent(-1) + "\n" + this.indent() + "}\n" ); }; Compiler.prototype.page = function(node) { var sel = node.selectors.length ? node.selectors.join(", ") + " " : ""; return this.emit("@page " + sel, node.position) + this.emit("{\n") + this.emit(this.indent(1)) + this.mapVisit(node.declarations, "\n") + this.emit(this.indent(-1)) + this.emit("\n}"); }; Compiler.prototype["font-face"] = function(node) { return this.emit("@font-face ", node.position) + this.emit("{\n") + this.emit(this.indent(1)) + this.mapVisit(node.declarations, "\n") + this.emit(this.indent(-1)) + this.emit("\n}"); }; Compiler.prototype.host = function(node) { return this.emit("@host", node.position) + this.emit( " {\n" + this.indent(1) ) + this.mapVisit(node.rules, "\n\n") + this.emit( this.indent(-1) + "\n}" ); }; Compiler.prototype["custom-media"] = function(node) { return this.emit("@custom-media " + node.name + " " + node.media + ";", node.position); }; Compiler.prototype.rule = function(node) { var indent = this.indent(); var decls = node.declarations; if (!decls.length) return ""; return this.emit(node.selectors.map(function(s) { return indent + s; }).join(",\n"), node.position) + this.emit(" {\n") + this.emit(this.indent(1)) + this.mapVisit(decls, "\n") + this.emit(this.indent(-1)) + this.emit("\n" + this.indent() + "}"); }; Compiler.prototype.declaration = function(node) { return this.emit(this.indent()) + this.emit(node.property + ": " + node.value, node.position) + this.emit(";"); }; Compiler.prototype.indent = function(level) { this.level = this.level || 1; if (null != level) { this.level += level; return ""; } return Array(this.level).join(this.indentation || " "); }; } }); // node_modules/source-map/lib/base64.js var require_base64 = __commonJS({ "node_modules/source-map/lib/base64.js"(exports) { var intToCharMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""); exports.encode = function(number) { if (0 <= number && number < intToCharMap.length) { return intToCharMap[number]; } throw new TypeError("Must be between 0 and 63: " + number); }; exports.decode = function(charCode) { var bigA = 65; var bigZ = 90; var littleA = 97; var littleZ = 122; var zero = 48; var nine = 57; var plus = 43; var slash = 47; var littleOffset = 26; var numberOffset = 52; if (bigA <= charCode && charCode <= bigZ) { return charCode - bigA; } if (littleA <= charCode && charCode <= littleZ) { return charCode - littleA + littleOffset; } if (zero <= charCode && charCode <= nine) { return charCode - zero + numberOffset; } if (charCode == plus) { return 62; } if (charCode == slash) { return 63; } return -1; }; } }); // node_modules/source-map/lib/base64-vlq.js var require_base64_vlq = __commonJS({ "node_modules/source-map/lib/base64-vlq.js"(exports) { var base64 = require_base64(); var VLQ_BASE_SHIFT = 5; var VLQ_BASE = 1 << VLQ_BASE_SHIFT; var VLQ_BASE_MASK = VLQ_BASE - 1; var VLQ_CONTINUATION_BIT = VLQ_BASE; function toVLQSigned(aValue) { return aValue < 0 ? (-aValue << 1) + 1 : (aValue << 1) + 0; } function fromVLQSigned(aValue) { var isNegative = (aValue & 1) === 1; var shifted = aValue >> 1; return isNegative ? -shifted : shifted; } exports.encode = function base64VLQ_encode(aValue) { var encoded = ""; var digit; var vlq = toVLQSigned(aValue); do { digit = vlq & VLQ_BASE_MASK; vlq >>>= VLQ_BASE_SHIFT; if (vlq > 0) { digit |= VLQ_CONTINUATION_BIT; } encoded += base64.encode(digit); } while (vlq > 0); return encoded; }; exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { var strLen = aStr.length; var result = 0; var shift = 0; var continuation, digit; do { if (aIndex >= strLen) { throw new Error("Expected more digits in base 64 VLQ value."); } digit = base64.decode(aStr.charCodeAt(aIndex++)); if (digit === -1) { throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); } continuation = !!(digit & VLQ_CONTINUATION_BIT); digit &= VLQ_BASE_MASK; result = result + (digit << shift); shift += VLQ_BASE_SHIFT; } while (continuation); aOutParam.value = fromVLQSigned(result); aOutParam.rest = aIndex; }; } }); // node_modules/source-map/lib/util.js var require_util = __commonJS({ "node_modules/source-map/lib/util.js"(exports) { function getArg(aArgs, aName, aDefaultValue) { if (aName in aArgs) { return aArgs[aName]; } else if (arguments.length === 3) { return aDefaultValue; } else { throw new Error('"' + aName + '" is a required argument.'); } } exports.getArg = getArg; var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/; var dataUrlRegexp = /^data:.+\,.+$/; function urlParse(aUrl) { var match = aUrl.match(urlRegexp); if (!match) { return null; } return { scheme: match[1], auth: match[2], host: match[3], port: match[4], path: match[5] }; } exports.urlParse = urlParse; function urlGenerate(aParsedUrl) { var url = ""; if (aParsedUrl.scheme) { url += aParsedUrl.scheme + ":"; } url += "//"; if (aParsedUrl.auth) { url += aParsedUrl.auth + "@"; } if (aParsedUrl.host) { url += aParsedUrl.host; } if (aParsedUrl.port) { url += ":" + aParsedUrl.port; } if (aParsedUrl.path) { url += aParsedUrl.path; } return url; } exports.urlGenerate = urlGenerate; function normalize(aPath) { var path = aPath; var url = urlParse(aPath); if (url) { if (!url.path) { return aPath; } path = url.path; } var isAbsolute = exports.isAbsolute(path); var parts = path.split(/\/+/); for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { part = parts[i]; if (part === ".") { parts.splice(i, 1); } else if (part === "..") { up++; } else if (up > 0) { if (part === "") { parts.splice(i + 1, up); up = 0; } else { parts.splice(i, 2); up--; } } } path = parts.join("/"); if (path === "") { path = isAbsolute ? "/" : "."; } if (url) { url.path = path; return urlGenerate(url); } return path; } exports.normalize = normalize; function join(aRoot, aPath) { if (aRoot === "") { aRoot = "."; } if (aPath === "") { aPath = "."; } var aPathUrl = urlParse(aPath); var aRootUrl = urlParse(aRoot); if (aRootUrl) { aRoot = aRootUrl.path || "/"; } if (aPathUrl && !aPathUrl.scheme) { if (aRootUrl) { aPathUrl.scheme = aRootUrl.scheme; } return urlGenerate(aPathUrl); } if (aPathUrl || aPath.match(dataUrlRegexp)) { return aPath; } if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { aRootUrl.host = aPath; return urlGenerate(aRootUrl); } var joined = aPath.charAt(0) === "/" ? aPath : normalize(aRoot.replace(/\/+$/, "") + "/" + aPath); if (aRootUrl) { aRootUrl.path = joined; return urlGenerate(aRootUrl); } return joined; } exports.join = join; exports.isAbsolute = function(aPath) { return aPath.charAt(0) === "/" || urlRegexp.test(aPath); }; function relative(aRoot, aPath) { if (aRoot === "") { aRoot = "."; } aRoot = aRoot.replace(/\/$/, ""); var level = 0; while (aPath.indexOf(aRoot + "/") !== 0) { var index = aRoot.lastIndexOf("/"); if (index < 0) { return aPath; } aRoot = aRoot.slice(0, index); if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { return aPath; } ++level; } return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); } exports.relative = relative; var supportsNullProto = function() { var obj = /* @__PURE__ */ Object.create(null); return !("__proto__" in obj); }(); function identity(s) { return s; } function toSetString(aStr) { if (isProtoString(aStr)) { return "$" + aStr; } return aStr; } exports.toSetString = supportsNullProto ? identity : toSetString; function fromSetString(aStr) { if (isProtoString(aStr)) { return aStr.slice(1); } return aStr; } exports.fromSetString = supportsNullProto ? identity : fromSetString; function isProtoString(s) { if (!s) { return false; } var length = s.length; if (length < 9) { return false; } if (s.charCodeAt(length - 1) !== 95 || s.charCodeAt(length - 2) !== 95 || s.charCodeAt(length - 3) !== 111 || s.charCodeAt(length - 4) !== 116 || s.charCodeAt(length - 5) !== 111 || s.charCodeAt(length - 6) !== 114 || s.charCodeAt(length - 7) !== 112 || s.charCodeAt(length - 8) !== 95 || s.charCodeAt(length - 9) !== 95) { return false; } for (var i = length - 10; i >= 0; i--) { if (s.charCodeAt(i) !== 36) { return false; } } return true; } function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { var cmp = strcmp(mappingA.source, mappingB.source); if (cmp !== 0) { return cmp; } cmp = mappingA.originalLine - mappingB.originalLine; if (cmp !== 0) { return cmp; } cmp = mappingA.originalColumn - mappingB.originalColumn; if (cmp !== 0 || onlyCompareOriginal) { return cmp; } cmp = mappingA.generatedColumn - mappingB.generatedColumn; if (cmp !== 0) { return cmp; } cmp = mappingA.generatedLine - mappingB.generatedLine; if (cmp !== 0) { return cmp; } return strcmp(mappingA.name, mappingB.name); } exports.compareByOriginalPositions = compareByOriginalPositions; function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { var cmp = mappingA.generatedLine - mappingB.generatedLine; if (cmp !== 0) { return cmp; } cmp = mappingA.generatedColumn - mappingB.generatedColumn; if (cmp !== 0 || onlyCompareGenerated) { return cmp; } cmp = strcmp(mappingA.source, mappingB.source); if (cmp !== 0) { return cmp; } cmp = mappingA.originalLine - mappingB.originalLine; if (cmp !== 0) { return cmp; } cmp = mappingA.originalColumn - mappingB.originalColumn; if (cmp !== 0) { return cmp; } return strcmp(mappingA.name, mappingB.name); } exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; function strcmp(aStr1, aStr2) { if (aStr1 === aStr2) { return 0; } if (aStr1 === null) { return 1; } if (aStr2 === null) { return -1; } if (aStr1 > aStr2) { return 1; } return -1; } function compareByGeneratedPositionsInflated(mappingA, mappingB) { var cmp = mappingA.generatedLine - mappingB.generatedLine; if (cmp !== 0) { return cmp; } cmp = mappingA.generatedColumn - mappingB.generatedColumn; if (cmp !== 0) { return cmp; } cmp = strcmp(mappingA.source, mappingB.source); if (cmp !== 0) { return cmp; } cmp = mappingA.originalLine - mappingB.originalLine; if (cmp !== 0) { return cmp; } cmp = mappingA.originalColumn - mappingB.originalColumn; if (cmp !== 0) { return cmp; } return strcmp(mappingA.name, mappingB.name); } exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; function parseSourceMapInput(str) { return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, "")); } exports.parseSourceMapInput = parseSourceMapInput; function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) { sourceURL = sourceURL || ""; if (sourceRoot) { if (sourceRoot[sourceRoot.length - 1] !== "/" && sourceURL[0] !== "/") { sourceRoot += "/"; } sourceURL = sourceRoot + sourceURL; } if (sourceMapURL) { var parsed = urlParse(sourceMapURL); if (!parsed) { throw new Error("sourceMapURL could not be parsed"); } if (parsed.path) { var index = parsed.path.lastIndexOf("/"); if (index >= 0) { parsed.path = parsed.path.substring(0, index + 1); } } sourceURL = join(urlGenerate(parsed), sourceURL); } return normalize(sourceURL); } exports.computeSourceURL = computeSourceURL; } }); // node_modules/source-map/lib/array-set.js var require_array_set = __commonJS({ "node_modules/source-map/lib/array-set.js"(exports) { var util = require_util(); var has = Object.prototype.hasOwnProperty; var hasNativeMap = typeof Map !== "undefined"; function ArraySet() { this._array = []; this._set = hasNativeMap ? /* @__PURE__ */ new Map() : /* @__PURE__ */ Object.create(null); } ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { var set = new ArraySet(); for (var i = 0, len = aArray.length; i < len; i++) { set.add(aArray[i], aAllowDuplicates); } return set; }; ArraySet.prototype.size = function ArraySet_size() { return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; }; ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { var sStr = hasNativeMap ? aStr : util.toSetString(aStr); var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); var idx = this._array.length; if (!isDuplicate || aAllowDuplicates) { this._array.push(aStr); } if (!isDuplicate) { if (hasNativeMap) { this._set.set(aStr, idx); } else { this._set[sStr] = idx; } } }; ArraySet.prototype.has = function ArraySet_has(aStr) { if (hasNativeMap) { return this._set.has(aStr); } else { var sStr = util.toSetString(aStr); return has.call(this._set, sStr); } }; ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { if (hasNativeMap) { var idx = this._set.get(aStr); if (idx >= 0) { return idx; } } else { var sStr = util.toSetString(aStr); if (has.call(this._set, sStr)) { return this._set[sStr]; } } throw new Error('"' + aStr + '" is not in the set.'); }; ArraySet.prototype.at = function ArraySet_at(aIdx) { if (aIdx >= 0 && aIdx < this._array.length) { return this._array[aIdx]; } throw new Error("No element indexed by " + aIdx); }; ArraySet.prototype.toArray = function ArraySet_toArray() { return this._array.slice(); }; exports.ArraySet = ArraySet; } }); // node_modules/source-map/lib/mapping-list.js var require_mapping_list = __commonJS({ "node_modules/source-map/lib/mapping-list.js"(exports) { var util = require_util(); function generatedPositionAfter(mappingA, mappingB) { var lineA = mappingA.generatedLine; var lineB = mappingB.generatedLine; var columnA = mappingA.generatedColumn; var columnB = mappingB.generatedColumn; return lineB > lineA || lineB == lineA && columnB >= columnA || util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; } function MappingList() { this._array = []; this._sorted = true; this._last = { generatedLine: -1, generatedColumn: 0 }; } MappingList.prototype.unsortedForEach = function MappingList_forEach(aCallback, aThisArg) { this._array.forEach(aCallback, aThisArg); }; MappingList.prototype.add = function MappingList_add(aMapping) { if (generatedPositionAfter(this._last, aMapping)) { this._last = aMapping; this._array.push(aMapping); } else { this._sorted = false; this._array.push(aMapping); } }; MappingList.prototype.toArray = function MappingList_toArray() { if (!this._sorted) { this._array.sort(util.compareByGeneratedPositionsInflated); this._sorted = true; } return this._array; }; exports.MappingList = MappingList; } }); // node_modules/source-map/lib/source-map-generator.js var require_source_map_generator = __commonJS({ "node_modules/source-map/lib/source-map-generator.js"(exports) { var base64VLQ = require_base64_vlq(); var util = require_util(); var ArraySet = require_array_set().ArraySet; var MappingList = require_mapping_list().MappingList; function SourceMapGenerator(aArgs) { if (!aArgs) { aArgs = {}; } this._file = util.getArg(aArgs, "file", null); this._sourceRoot = util.getArg(aArgs, "sourceRoot", null); this._skipValidation = util.getArg(aArgs, "skipValidation", false); this._sources = new ArraySet(); this._names = new ArraySet(); this._mappings = new MappingList(); this._sourcesContents = null; } SourceMapGenerator.prototype._version = 3; SourceMapGenerator.fromSourceMap = function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { var sourceRoot = aSourceMapConsumer.sourceRoot; var generator = new SourceMapGenerator({ file: aSourceMapConsumer.file, sourceRoot }); aSourceMapConsumer.eachMapping(function(mapping) { var newMapping = { generated: { line: mapping.generatedLine, column: mapping.generatedColumn } }; if (mapping.source != null) { newMapping.source = mapping.source; if (sourceRoot != null) { newMapping.source = util.relative(sourceRoot, newMapping.source); } newMapping.original = { line: mapping.originalLine, column: mapping.originalColumn }; if (mapping.name != null) { newMapping.name = mapping.name; } } generator.addMapping(newMapping); }); aSourceMapConsumer.sources.forEach(function(sourceFile) { var sourceRelative = sourceFile; if (sourceRoot !== null) { sourceRelative = util.relative(sourceRoot, sourceFile); } if (!generator._sources.has(sourceRelative)) { generator._sources.add(sourceRelative); } var content = aSourceMapConsumer.sourceContentFor(sourceFile); if (content != null) { generator.setSourceContent(sourceFile, content); } }); return generator; }; SourceMapGenerator.prototype.addMapping = function SourceMapGenerator_addMapping(aArgs) { var generated = util.getArg(aArgs, "generated"); var original = util.getArg(aArgs, "original", null); var source = util.getArg(aArgs, "source", null); var name = util.getArg(aArgs, "name", null); if (!this._skipValidation) { this._validateMapping(generated, original, source, name); } if (source != null) { source = String(source); if (!this._sources.has(source)) { this._sources.add(source); } } if (name != null) { name = String(name); if (!this._names.has(name)) { this._names.add(name); } } this._mappings.add({ generatedLine: generated.line, generatedColumn: generated.column, originalLine: original != null && original.line, originalColumn: original != null && original.column, source, name }); }; SourceMapGenerator.prototype.setSourceContent = function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { var source = aSourceFile; if (this._sourceRoot != null) { source = util.relative(this._sourceRoot, source); } if (aSourceContent != null) { if (!this._sourcesContents) { this._sourcesContents = /* @__PURE__ */ Object.create(null); } this._sourcesContents[util.toSetString(source)] = aSourceContent; } else if (this._sourcesContents) { delete this._sourcesContents[util.toSetString(source)]; if (Object.keys(this._sourcesContents).length === 0) { this._sourcesContents = null; } } }; SourceMapGenerator.prototype.applySourceMap = function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { var sourceFile = aSourceFile; if (aSourceFile == null) { if (aSourceMapConsumer.file == null) { throw new Error( `SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map's "file" property. Both were omitted.` ); } sourceFile = aSourceMapConsumer.file; } var sourceRoot = this._sourceRoot; if (sourceRoot != null) { sourceFile = util.relative(sourceRoot, sourceFile); } var newSources = new ArraySet(); var newNames = new ArraySet(); this._mappings.unsortedForEach(function(mapping) { if (mapping.source === sourceFile && mapping.originalLine != null) { var original = aSourceMapConsumer.originalPositionFor({ line: mapping.originalLine, column: mapping.originalColumn }); if (original.source != null) { mapping.source = original.source; if (aSourceMapPath != null) { mapping.source = util.join(aSourceMapPath, mapping.source); } if (sourceRoot != null) { mapping.source = util.relative(sourceRoot, mapping.source); } mapping.originalLine = original.line; mapping.originalColumn = original.column; if (original.name != null) { mapping.name = original.name; } } } var source = mapping.source; if (source != null && !newSources.has(source)) { newSources.add(source); } var name = mapping.name; if (name != null && !newNames.has(name)) { newNames.add(name); } }, this); this._sources = newSources; this._names = newNames; aSourceMapConsumer.sources.forEach(function(sourceFile2) { var content = aSourceMapConsumer.sourceContentFor(sourceFile2); if (content != null) { if (aSourceMapPath != null) { sourceFile2 = util.join(aSourceMapPath, sourceFile2); } if (sourceRoot != null) { sourceFile2 = util.relative(sourceRoot, sourceFile2); } this.setSourceContent(sourceFile2, content); } }, this); }; SourceMapGenerator.prototype._validateMapping = function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, aName) { if (aOriginal && typeof aOriginal.line !== "number" && typeof aOriginal.column !== "number") { throw new Error( "original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values." ); } if (aGenerated && "line" in aGenerated && "column" in aGenerated && aGenerated.line > 0 && aGenerated.column >= 0 && !aOriginal && !aSource && !aName) { return; } else if (aGenerated && "line" in aGenerated && "column" in aGenerated && aOriginal && "line" in aOriginal && "column" in aOriginal && aGenerated.line > 0 && aGenerated.column >= 0 && aOriginal.line > 0 && aOriginal.column >= 0 && aSource) { return; } else { throw new Error("Invalid mapping: " + JSON.stringify({ generated: aGenerated, source: aSource, original: aOriginal, name: aName })); } }; SourceMapGenerator.prototype._serializeMappings = function SourceMapGenerator_serializeMappings() { var previousGeneratedColumn = 0; var previousGeneratedLine = 1; var previousOriginalColumn = 0; var previousOriginalLine = 0; var previousName = 0; var previousSource = 0; var result = ""; var next; var mapping; var nameIdx; var sourceIdx; var mappings = this._mappings.toArray(); for (var i = 0, len = mappings.length; i < len; i++) { mapping = mappings[i]; next = ""; if (mapping.generatedLine !== previousGeneratedLine) { previousGeneratedColumn = 0; while (mapping.generatedLine !== previousGeneratedLine) { next += ";"; previousGeneratedLine++; } } else { if (i > 0) { if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { continue; } next += ","; } } next += base64VLQ.encode(mapping.generatedColumn - previousGeneratedColumn); previousGeneratedColumn = mapping.generatedColumn; if (mapping.source != null) { sourceIdx = this._sources.indexOf(mapping.source); next += base64VLQ.encode(sourceIdx - previousSource); previousSource = sourceIdx; next += base64VLQ.encode(mapping.originalLine - 1 - previousOriginalLine); previousOriginalLine = mapping.originalLine - 1; next += base64VLQ.encode(mapping.originalColumn - previousOriginalColumn); previousOriginalColumn = mapping.originalColumn; if (mapping.name != null) { nameIdx = this._names.indexOf(mapping.name); next += base64VLQ.encode(nameIdx - previousName); previousName = nameIdx; } } result += next; } return result; }; SourceMapGenerator.prototype._generateSourcesContent = function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { return aSources.map(function(source) { if (!this._sourcesContents) { return null; } if (aSourceRoot != null) { source = util.relative(aSourceRoot, source); } var key = util.toSetString(source); return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) ? this._sourcesContents[key] : null; }, this); }; SourceMapGenerator.prototype.toJSON = function SourceMapGenerator_toJSON() { var map = { version: this._version, sources: this._sources.toArray(), names: this._names.toArray(), mappings: this._serializeMappings() }; if (this._file != null) { map.file = this._file; } if (this._sourceRoot != null) { map.sourceRoot = this._sourceRoot; } if (this._sourcesContents) { map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); } return map; }; SourceMapGenerator.prototype.toString = function SourceMapGenerator_toString() { return JSON.stringify(this.toJSON()); }; exports.SourceMapGenerator = SourceMapGenerator; } }); // node_modules/source-map/lib/binary-search.js var require_binary_search = __commonJS({ "node_modules/source-map/lib/binary-search.js"(exports) { exports.GREATEST_LOWER_BOUND = 1; exports.LEAST_UPPER_BOUND = 2; function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { var mid = Math.floor((aHigh - aLow) / 2) + aLow; var cmp = aCompare(aNeedle, aHaystack[mid], true); if (cmp === 0) { return mid; } else if (cmp > 0) { if (aHigh - mid > 1) { return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); } if (aBias == exports.LEAST_UPPER_BOUND) { return aHigh < aHaystack.length ? aHigh : -1; } else { return mid; } } else { if (mid - aLow > 1) { return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); } if (aBias == exports.LEAST_UPPER_BOUND) { return mid; } else { return aLow < 0 ? -1 : aLow; } } } exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { if (aHaystack.length === 0) { return -1; } var index = recursiveSearch( -1, aHaystack.length, aNeedle, aHaystack, aCompare, aBias || exports.GREATEST_LOWER_BOUND ); if (index < 0) { return -1; } while (index - 1 >= 0) { if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { break; } --index; } return index; }; } }); // node_modules/source-map/lib/quick-sort.js var require_quick_sort = __commonJS({ "node_modules/source-map/lib/quick-sort.js"(exports) { function swap(ary, x, y) { var temp = ary[x]; ary[x] = ary[y]; ary[y] = temp; } function randomIntInRange(low, high) { return Math.round(low + Math.random() * (high - low)); } function doQuickSort(ary, comparator, p, r) { if (p < r) { var pivotIndex = randomIntInRange(p, r); var i = p - 1; swap(ary, pivotIndex, r); var pivot = ary[r]; for (var j = p; j < r; j++) { if (comparator(ary[j], pivot) <= 0) { i += 1; swap(ary, i, j); } } swap(ary, i + 1, j); var q = i + 1; doQuickSort(ary, comparator, p, q - 1); doQuickSort(ary, comparator, q + 1, r); } } exports.quickSort = function(ary, comparator) { doQuickSort(ary, comparator, 0, ary.length - 1); }; } }); // node_modules/source-map/lib/source-map-consumer.js var require_source_map_consumer = __commonJS({ "node_modules/source-map/lib/source-map-consumer.js"(exports) { var util = require_util(); var binarySearch = require_binary_search(); var ArraySet = require_array_set().ArraySet; var base64VLQ = require_base64_vlq(); var quickSort = require_quick_sort().quickSort; function SourceMapConsumer(aSourceMap, aSourceMapURL) { var sourceMap = aSourceMap; if (typeof aSourceMap === "string") { sourceMap = util.parseSourceMapInput(aSourceMap); } return sourceMap.sections != null ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL) : new BasicSourceMapConsumer(sourceMap, aSourceMapURL); } SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) { return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL); }; SourceMapConsumer.prototype._version = 3; SourceMapConsumer.prototype.__generatedMappings = null; Object.defineProperty(SourceMapConsumer.prototype, "_generatedMappings", { configurable: true, enumerable: true, get: function() { if (!this.__generatedMappings) { this._parseMappings(this._mappings, this.sourceRoot); } return this.__generatedMappings; } }); SourceMapConsumer.prototype.__originalMappings = null; Object.defineProperty(SourceMapConsumer.prototype, "_originalMappings", { configurable: true, enumerable: true, get: function() { if (!this.__originalMappings) { this._parseMappings(this._mappings, this.sourceRoot); } return this.__originalMappings; } }); SourceMapConsumer.prototype._charIsMappingSeparator = function SourceMapConsumer_charIsMappingSeparator(aStr, index) { var c = aStr.charAt(index); return c === ";" || c === ","; }; SourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { throw new Error("Subclasses must implement _parseMappings"); }; SourceMapConsumer.GENERATED_ORDER = 1; SourceMapConsumer.ORIGINAL_ORDER = 2; SourceMapConsumer.GREATEST_LOWER_BOUND = 1; SourceMapConsumer.LEAST_UPPER_BOUND = 2; SourceMapConsumer.prototype.eachMapping = function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { var context = aContext || null; var order = aOrder || SourceMapConsumer.GENERATED_ORDER; var mappings; switch (order) { case SourceMapConsumer.GENERATED_ORDER: mappings = this._generatedMappings; break; case SourceMapConsumer.ORIGINAL_ORDER: mappings = this._originalMappings; break; default: throw new Error("Unknown order of iteration."); } var sourceRoot = this.sourceRoot; mappings.map(function(mapping) { var source = mapping.source === null ? null : this._sources.at(mapping.source); source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL); return { source, generatedLine: mapping.generatedLine, generatedColumn: mapping.generatedColumn, originalLine: mapping.originalLine, originalColumn: mapping.originalColumn, name: mapping.name === null ? null : this._names.at(mapping.name) }; }, this).forEach(aCallback, context); }; SourceMapConsumer.prototype.allGeneratedPositionsFor = function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { var line = util.getArg(aArgs, "line"); var needle = { source: util.getArg(aArgs, "source"), originalLine: line, originalColumn: util.getArg(aArgs, "column", 0) }; needle.source = this._findSourceIndex(needle.source); if (needle.source < 0) { return []; } var mappings = []; var index = this._findMapping( needle, this._originalMappings, "originalLine", "originalColumn", util.compareByOriginalPositions, binarySearch.LEAST_UPPER_BOUND ); if (index >= 0) { var mapping = this._originalMappings[index]; if (aArgs.column === void 0) { var originalLine = mapping.originalLine; while (mapping && mapping.originalLine === originalLine) { mappings.push({ line: util.getArg(mapping, "generatedLine", null), column: util.getArg(mapping, "generatedColumn", null), lastColumn: util.getArg(mapping, "lastGeneratedColumn", null) }); mapping = this._originalMappings[++index]; } } else { var originalColumn = mapping.originalColumn; while (mapping && mapping.originalLine === line && mapping.originalColumn == originalColumn) { mappings.push({ line: util.getArg(mapping, "generatedLine", null), column: util.getArg(mapping, "generatedColumn", null), lastColumn: util.getArg(mapping, "lastGeneratedColumn", null) }); mapping = this._originalMappings[++index]; } } } return mappings; }; exports.SourceMapConsumer = SourceMapConsumer; function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) { var sourceMap = aSourceMap; if (typeof aSourceMap === "string") { sourceMap = util.parseSourceMapInput(aSourceMap); } var version = util.getArg(sourceMap, "version"); var sources = util.getArg(sourceMap, "sources"); var names = util.getArg(sourceMap, "names", []); var sourceRoot = util.getArg(sourceMap, "sourceRoot", null); var sourcesContent = util.getArg(sourceMap, "sourcesContent", null); var mappings = util.getArg(sourceMap, "mappings"); var file = util.getArg(sourceMap, "file", null); if (version != this._version) { throw new Error("Unsupported version: " + version); } if (sourceRoot) { sourceRoot = util.normalize(sourceRoot); } sources = sources.map(String).map(util.normalize).map(function(source) { return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) ? util.relative(sourceRoot, source) : source; }); this._names = ArraySet.fromArray(names.map(String), true); this._sources = ArraySet.fromArray(sources, true); this._absoluteSources = this._sources.toArray().map(function(s) { return util.computeSourceURL(sourceRoot, s, aSourceMapURL); }); this.sourceRoot = sourceRoot; this.sourcesContent = sourcesContent; this._mappings = mappings; this._sourceMapURL = aSourceMapURL; this.file = file; } BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) { var relativeSource = aSource; if (this.sourceRoot != null) { relativeSource = util.relative(this.sourceRoot, relativeSource); } if (this._sources.has(relativeSource)) { return this._sources.indexOf(relativeSource); } var i; for (i = 0; i < this._absoluteSources.length; ++i) { if (this._absoluteSources[i] == aSource) { return i; } } return -1; }; BasicSourceMapConsumer.fromSourceMap = function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) { var smc = Object.create(BasicSourceMapConsumer.prototype); var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); smc.sourceRoot = aSourceMap._sourceRoot; smc.sourcesContent = aSourceMap._generateSourcesContent( smc._sources.toArray(), smc.sourceRoot ); smc.file = aSourceMap._file; smc._sourceMapURL = aSourceMapURL; smc._absoluteSources = smc._sources.toArray().map(function(s) { return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL); }); var generatedMappings = aSourceMap._mappings.toArray().slice(); var destGeneratedMappings = smc.__generatedMappings = []; var destOriginalMappings = smc.__originalMappings = []; for (var i = 0, length = generatedMappings.length; i < length; i++) { var srcMapping = generatedMappings[i]; var destMapping = new Mapping(); destMapping.generatedLine = srcMapping.generatedLine; destMapping.generatedColumn = srcMapping.generatedColumn; if (srcMapping.source) { destMapping.source = sources.indexOf(srcMapping.source); destMapping.originalLine = srcMapping.originalLine; destMapping.originalColumn = srcMapping.originalColumn; if (srcMapping.name) { destMapping.name = names.indexOf(srcMapping.name); } destOriginalMappings.push(destMapping); } destGeneratedMappings.push(destMapping); } quickSort(smc.__originalMappings, util.compareByOriginalPositions); return smc; }; BasicSourceMapConsumer.prototype._version = 3; Object.defineProperty(BasicSourceMapConsumer.prototype, "sources", { get: function() { return this._absoluteSources.slice(); } }); function Mapping() { this.generatedLine = 0; this.generatedColumn = 0; this.source = null; this.originalLine = null; this.originalColumn = null; this.name = null; } BasicSourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { var generatedLine = 1; var previousGeneratedColumn = 0; var previousOriginalLine = 0; var previousOriginalColumn = 0; var previousSource = 0; var previousName = 0; var length = aStr.length; var index = 0; var cachedSegments = {}; var temp = {}; var originalMappings = []; var generatedMappings = []; var mapping, str, segment, end, value; while (index < length) { if (aStr.charAt(index) === ";") { generatedLine++; index++; previousGeneratedColumn = 0; } else if (aStr.charAt(index) === ",") { index++; } else { mapping = new Mapping(); mapping.generatedLine = generatedLine; for (end = index; end < length; end++) { if (this._charIsMappingSeparator(aStr, end)) { break; } } str = aStr.slice(index, end); segment = cachedSegments[str]; if (segment) { index += str.length; } else { segment = []; while (index < end) { base64VLQ.decode(aStr, index, temp); value = temp.value; index = temp.rest; segment.push(value); } if (segment.length === 2) { throw new Error("Found a source, but no line and column"); } if (segment.length === 3) { throw new Error("Found a source and line, but no column"); } cachedSegments[str] = segment; } mapping.generatedColumn = previousGeneratedColumn + segment[0]; previousGeneratedColumn = mapping.generatedColumn; if (segment.length > 1) { mapping.source = previousSource + segment[1]; previousSource += segment[1]; mapping.originalLine = previousOriginalLine + segment[2]; previousOriginalLine = mapping.originalLine; mapping.originalLine += 1; mapping.originalColumn = previousOriginalColumn + segment[3]; previousOriginalColumn = mapping.originalColumn; if (segment.length > 4) { mapping.name = previousName + segment[4]; previousName += segment[4]; } } generatedMappings.push(mapping); if (typeof mapping.originalLine === "number") { originalMappings.push(mapping); } } } quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); this.__generatedMappings = generatedMappings; quickSort(originalMappings, util.compareByOriginalPositions); this.__originalMappings = originalMappings; }; BasicSourceMapConsumer.prototype._findMapping = function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, aColumnName, aComparator, aBias) { if (aNeedle[aLineName] <= 0) { throw new TypeError("Line must be greater than or equal to 1, got " + aNeedle[aLineName]); } if (aNeedle[aColumnName] < 0) { throw new TypeError("Column must be greater than or equal to 0, got " + aNeedle[aColumnName]); } return binarySearch.search(aNeedle, aMappings, aComparator, aBias); }; BasicSourceMapConsumer.prototype.computeColumnSpans = function SourceMapConsumer_computeColumnSpans() { for (var index = 0; index < this._generatedMappings.length; ++index) { var mapping = this._generatedMappings[index]; if (index + 1 < this._generatedMappings.length) { var nextMapping = this._generatedMappings[index + 1]; if (mapping.generatedLine === nextMapping.generatedLine) { mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; continue; } } mapping.lastGeneratedColumn = Infinity; } }; BasicSourceMapConsumer.prototype.originalPositionFor = function SourceMapConsumer_originalPositionFor(aArgs) { var needle = { generatedLine: util.getArg(aArgs, "line"), generatedColumn: util.getArg(aArgs, "column") }; var index = this._findMapping( needle, this._generatedMappings, "generatedLine", "generatedColumn", util.compareByGeneratedPositionsDeflated, util.getArg(aArgs, "bias", SourceMapConsumer.GREATEST_LOWER_BOUND) ); if (index >= 0) { var mapping = this._generatedMappings[index]; if (mapping.generatedLine === needle.generatedLine) { var source = util.getArg(mapping, "source", null); if (source !== null) { source = this._sources.at(source); source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL); } var name = util.getArg(mapping, "name", null); if (name !== null) { name = this._names.at(name); } return { source, line: util.getArg(mapping, "originalLine", null), column: util.getArg(mapping, "originalColumn", null), name }; } } return { source: null, line: null, column: null, name: null }; }; BasicSourceMapConsumer.prototype.hasContentsOfAllSources = function BasicSourceMapConsumer_hasContentsOfAllSources() { if (!this.sourcesContent) { return false; } return this.sourcesContent.length >= this._sources.size() && !this.sourcesContent.some(function(sc) { return sc == null; }); }; BasicSourceMapConsumer.prototype.sourceContentFor = function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { if (!this.sourcesContent) { return null; } var index = this._findSourceIndex(aSource); if (index >= 0) { return this.sourcesContent[index]; } var relativeSource = aSource; if (this.sourceRoot != null) { relativeSource = util.relative(this.sourceRoot, relativeSource); } var url; if (this.sourceRoot != null && (url = util.urlParse(this.sourceRoot))) { var fileUriAbsPath = relativeSource.replace(/^file:\/\//, ""); if (url.scheme == "file" && this._sources.has(fileUriAbsPath)) { return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]; } if ((!url.path || url.path == "/") && this._sources.has("/" + relativeSource)) { return this.sourcesContent[this._sources.indexOf("/" + relativeSource)]; } } if (nullOnMissing) { return null; } else { throw new Error('"' + relativeSource + '" is not in the SourceMap.'); } }; BasicSourceMapConsumer.prototype.generatedPositionFor = function SourceMapConsumer_generatedPositionFor(aArgs) { var source = util.getArg(aArgs, "source"); source = this._findSourceIndex(source); if (source < 0) { return { line: null, column: null, lastColumn: null }; } var needle = { source, originalLine: util.getArg(aArgs, "line"), originalColumn: util.getArg(aArgs, "column") }; var index = this._findMapping( needle, this._originalMappings, "originalLine", "originalColumn", util.compareByOriginalPositions, util.getArg(aArgs, "bias", SourceMapConsumer.GREATEST_LOWER_BOUND) ); if (index >= 0) { var mapping = this._originalMappings[index]; if (mapping.source === needle.source) { return { line: util.getArg(mapping, "generatedLine", null), column: util.getArg(mapping, "generatedColumn", null), lastColumn: util.getArg(mapping, "lastGeneratedColumn", null) }; } } return { line: null, column: null, lastColumn: null }; }; exports.BasicSourceMapConsumer = BasicSourceMapConsumer; function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) { var sourceMap = aSourceMap; if (typeof aSourceMap === "string") { sourceMap = util.parseSourceMapInput(aSourceMap); } var version = util.getArg(sourceMap, "version"); var sections = util.getArg(sourceMap, "sections"); if (version != this._version) { throw new Error("Unsupported version: " + version); } this._sources = new ArraySet(); this._names = new ArraySet(); var lastOffset = { line: -1, column: 0 }; this._sections = sections.map(function(s) { if (s.url) { throw new Error("Support for url field in sections not implemented."); } var offset = util.getArg(s, "offset"); var offsetLine = util.getArg(offset, "line"); var offsetColumn = util.getArg(offset, "column"); if (offsetLine < lastOffset.line || offsetLine === lastOffset.line && offsetColumn < lastOffset.column) { throw new Error("Section offsets must be ordered and non-overlapping."); } lastOffset = offset; return { generatedOffset: { // The offset fields are 0-based, but we use 1-based indices when // encoding/decoding from VLQ. generatedLine: offsetLine + 1, generatedColumn: offsetColumn + 1 }, consumer: new SourceMapConsumer(util.getArg(s, "map"), aSourceMapURL) }; }); } IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; IndexedSourceMapConsumer.prototype._version = 3; Object.defineProperty(IndexedSourceMapConsumer.prototype, "sources", { get: function() { var sources = []; for (var i = 0; i < this._sections.length; i++) { for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { sources.push(this._sections[i].consumer.sources[j]); } } return sources; } }); IndexedSourceMapConsumer.prototype.originalPositionFor = function IndexedSourceMapConsumer_originalPositionFor(aArgs) { var needle = { generatedLine: util.getArg(aArgs, "line"), generatedColumn: util.getArg(aArgs, "column") }; var sectionIndex = binarySearch.search( needle, this._sections, function(needle2, section2) { var cmp = needle2.generatedLine - section2.generatedOffset.generatedLine; if (cmp) { return cmp; } return needle2.generatedColumn - section2.generatedOffset.generatedColumn; } ); var section = this._sections[sectionIndex]; if (!section) { return { source: null, line: null, column: null, name: null }; } return section.consumer.originalPositionFor({ line: needle.generatedLine - (section.generatedOffset.generatedLine - 1), column: needle.generatedColumn - (section.generatedOffset.generatedLine === needle.generatedLine ? section.generatedOffset.generatedColumn - 1 : 0), bias: aArgs.bias }); }; IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = function IndexedSourceMapConsumer_hasContentsOfAllSources() { return this._sections.every(function(s) { return s.consumer.hasContentsOfAllSources(); }); }; IndexedSourceMapConsumer.prototype.sourceContentFor = function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { for (var i = 0; i < this._sections.length; i++) { var section = this._sections[i]; var content = section.consumer.sourceContentFor(aSource, true); if (content) { return content; } } if (nullOnMissing) { return null; } else { throw new Error('"' + aSource + '" is not in the SourceMap.'); } }; IndexedSourceMapConsumer.prototype.generatedPositionFor = function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { for (var i = 0; i < this._sections.length; i++) { var section = this._sections[i]; if (section.consumer._findSourceIndex(util.getArg(aArgs, "source")) === -1) { continue; } var generatedPosition = section.consumer.generatedPositionFor(aArgs); if (generatedPosition) { var ret = { line: generatedPosition.line + (section.generatedOffset.generatedLine - 1), column: generatedPosition.column + (section.generatedOffset.generatedLine === generatedPosition.line ? section.generatedOffset.generatedColumn - 1 : 0) }; return ret; } } return { line: null, column: null }; }; IndexedSourceMapConsumer.prototype._parseMappings = function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { this.__generatedMappings = []; this.__originalMappings = []; for (var i = 0; i < this._sections.length; i++) { var section = this._sections[i]; var sectionMappings = section.consumer._generatedMappings; for (var j = 0; j < sectionMappings.length; j++) { var mapping = sectionMappings[j]; var source = section.consumer._sources.at(mapping.source); source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL); this._sources.add(source); source = this._sources.indexOf(source); var name = null; if (mapping.name) { name = section.consumer._names.at(mapping.name); this._names.add(name); name = this._names.indexOf(name); } var adjustedMapping = { source, generatedLine: mapping.generatedLine + (section.generatedOffset.generatedLine - 1), generatedColumn: mapping.generatedColumn + (section.generatedOffset.generatedLine === mapping.generatedLine ? section.generatedOffset.generatedColumn - 1 : 0), originalLine: mapping.originalLine, originalColumn: mapping.originalColumn, name }; this.__generatedMappings.push(adjustedMapping); if (typeof adjustedMapping.originalLine === "number") { this.__originalMappings.push(adjustedMapping); } } } quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); quickSort(this.__originalMappings, util.compareByOriginalPositions); }; exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; } }); // node_modules/source-map/lib/source-node.js var require_source_node = __commonJS({ "node_modules/source-map/lib/source-node.js"(exports) { var SourceMapGenerator = require_source_map_generator().SourceMapGenerator; var util = require_util(); var REGEX_NEWLINE = /(\r?\n)/; var NEWLINE_CODE = 10; var isSourceNode = "$$$isSourceNode$$$"; function SourceNode(aLine, aColumn, aSource, aChunks, aName) { this.children = []; this.sourceContents = {}; this.line = aLine == null ? null : aLine; this.column = aColumn == null ? null : aColumn; this.source = aSource == null ? null : aSource; this.name = aName == null ? null : aName; this[isSourceNode] = true; if (aChunks != null) this.add(aChunks); } SourceNode.fromStringWithSourceMap = function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { var node = new SourceNode(); var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); var remainingLinesIndex = 0; var shiftNextLine = function() { var lineContents = getNextLine(); var newLine = getNextLine() || ""; return lineContents + newLine; function getNextLine() { return remainingLinesIndex < remainingLines.length ? remainingLines[remainingLinesIndex++] : void 0; } }; var lastGeneratedLine = 1, lastGeneratedColumn = 0; var lastMapping = null; aSourceMapConsumer.eachMapping(function(mapping) { if (lastMapping !== null) { if (lastGeneratedLine < mapping.generatedLine) { addMappingWithCode(lastMapping, shiftNextLine()); lastGeneratedLine++; lastGeneratedColumn = 0; } else { var nextLine = remainingLines[remainingLinesIndex] || ""; var code = nextLine.substr(0, mapping.generatedColumn - lastGeneratedColumn); remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - lastGeneratedColumn); lastGeneratedColumn = mapping.generatedColumn; addMappingWithCode(lastMapping, code); lastMapping = mapping; return; } } while (lastGeneratedLine < mapping.generatedLine) { node.add(shiftNextLine()); lastGeneratedLine++; } if (lastGeneratedColumn < mapping.generatedColumn) { var nextLine = remainingLines[remainingLinesIndex] || ""; node.add(nextLine.substr(0, mapping.generatedColumn)); remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); lastGeneratedColumn = mapping.generatedColumn; } lastMapping = mapping; }, this); if (remainingLinesIndex < remainingLines.length) { if (lastMapping) { addMappingWithCode(lastMapping, shiftNextLine()); } node.add(remainingLines.splice(remainingLinesIndex).join("")); } aSourceMapConsumer.sources.forEach(function(sourceFile) { var content = aSourceMapConsumer.sourceContentFor(sourceFile); if (content != null) { if (aRelativePath != null) { sourceFile = util.join(aRelativePath, sourceFile); } node.setSourceContent(sourceFile, content); } }); return node; function addMappingWithCode(mapping, code) { if (mapping === null || mapping.source === void 0) { node.add(code); } else { var source = aRelativePath ? util.join(aRelativePath, mapping.source) : mapping.source; node.add(new SourceNode( mapping.originalLine, mapping.originalColumn, source, code, mapping.name )); } } }; SourceNode.prototype.add = function SourceNode_add(aChunk) { if (Array.isArray(aChunk)) { aChunk.forEach(function(chunk) { this.add(chunk); }, this); } else if (aChunk[isSourceNode] || typeof aChunk === "string") { if (aChunk) { this.children.push(aChunk); } } else { throw new TypeError( "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk ); } return this; }; SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { if (Array.isArray(aChunk)) { for (var i = aChunk.length - 1; i >= 0; i--) { this.prepend(aChunk[i]); } } else if (aChunk[isSourceNode] || typeof aChunk === "string") { this.children.unshift(aChunk); } else { throw new TypeError( "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk ); } return this; }; SourceNode.prototype.walk = function SourceNode_walk(aFn) { var chunk; for (var i = 0, len = this.children.length; i < len; i++) { chunk = this.children[i]; if (chunk[isSourceNode]) { chunk.walk(aFn); } else { if (chunk !== "") { aFn(chunk, { source: this.source, line: this.line, column: this.column, name: this.name }); } } } }; SourceNode.prototype.join = function SourceNode_join(aSep) { var newChildren; var i; var len = this.children.length; if (len > 0) { newChildren = []; for (i = 0; i < len - 1; i++) { newChildren.push(this.children[i]); newChildren.push(aSep); } newChildren.push(this.children[i]); this.children = newChildren; } return this; }; SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { var lastChild = this.children[this.children.length - 1]; if (lastChild[isSourceNode]) { lastChild.replaceRight(aPattern, aReplacement); } else if (typeof lastChild === "string") { this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); } else { this.children.push("".replace(aPattern, aReplacement)); } return this; }; SourceNode.prototype.setSourceContent = function SourceNode_setSourceContent(aSourceFile, aSourceContent) { this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; }; SourceNode.prototype.walkSourceContents = function SourceNode_walkSourceContents(aFn) { for (var i = 0, len = this.children.length; i < len; i++) { if (this.children[i][isSourceNode]) { this.children[i].walkSourceContents(aFn); } } var sources = Object.keys(this.sourceContents); for (var i = 0, len = sources.length; i < len; i++) { aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); } }; SourceNode.prototype.toString = function SourceNode_toString() { var str = ""; this.walk(function(chunk) { str += chunk; }); return str; }; SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { var generated = { code: "", line: 1, column: 0 }; var map = new SourceMapGenerator(aArgs); var sourceMappingActive = false; var lastOriginalSource = null; var lastOriginalLine = null; var lastOriginalColumn = null; var lastOriginalName = null; this.walk(function(chunk, original) { generated.code += chunk; if (original.source !== null && original.line !== null && original.column !== null) { if (lastOriginalSource !== original.source || lastOriginalLine !== original.line || lastOriginalColumn !== original.column || lastOriginalName !== original.name) { map.addMapping({ source: original.source, original: { line: original.line, column: original.column }, generated: { line: generated.line, column: generated.column }, name: original.name }); } lastOriginalSource = original.source; lastOriginalLine = original.line; lastOriginalColumn = original.column; lastOriginalName = original.name; sourceMappingActive = true; } else if (sourceMappingActive) { map.addMapping({ generated: { line: generated.line, column: generated.column } }); lastOriginalSource = null; sourceMappingActive = false; } for (var idx = 0, length = chunk.length; idx < length; idx++) { if (chunk.charCodeAt(idx) === NEWLINE_CODE) { generated.line++; generated.column = 0; if (idx + 1 === length) { lastOriginalSource = null; sourceMappingActive = false; } else if (sourceMappingActive) { map.addMapping({ source: original.source, original: { line: original.line, column: original.column }, generated: { line: generated.line, column: generated.column }, name: original.name }); } } else { generated.column++; } } }); this.walkSourceContents(function(sourceFile, sourceContent) { map.setSourceContent(sourceFile, sourceContent); }); return { code: generated.code, map }; }; exports.SourceNode = SourceNode; } }); // node_modules/source-map/source-map.js var require_source_map = __commonJS({ "node_modules/source-map/source-map.js"(exports) { exports.SourceMapGenerator = require_source_map_generator().SourceMapGenerator; exports.SourceMapConsumer = require_source_map_consumer().SourceMapConsumer; exports.SourceNode = require_source_node().SourceNode; } }); // node_modules/atob/browser-atob.js var require_browser_atob = __commonJS({ "node_modules/atob/browser-atob.js"(exports, module2) { (function(w) { "use strict"; function findBest(atobNative) { if ("function" === typeof atobNative) { return atobNative; } if ("function" === typeof Buffer) { return function atobBrowserify(a) { return new Buffer(a, "base64").toString("binary"); }; } if ("object" === typeof w.base64js) { return function atobWebWorker_iOS(a) { var buf = w.base64js.b64ToByteArray(a); return Array.prototype.map.call(buf, function(ch) { return String.fromCharCode(ch); }).join(""); }; } return function() { throw new Error("You're probably in an old browser or an iOS webworker. It might help to include beatgammit's base64-js."); }; } var atobBest = findBest(w.atob); w.atob = atobBest; if (typeof module2 === "object" && module2 && module2.exports) { module2.exports = atobBest; } })(window); } }); // node_modules/decode-uri-component/index.js var require_decode_uri_component = __commonJS({ "node_modules/decode-uri-component/index.js"(exports, module2) { "use strict"; var token = "%[a-f0-9]{2}"; var singleMatcher = new RegExp("(" + token + ")|([^%]+?)", "gi"); var multiMatcher = new RegExp("(" + token + ")+", "gi"); function decodeComponents(components, split) { try { return [decodeURIComponent(components.join(""))]; } catch (err) { } if (components.length === 1) { return components; } split = split || 1; var left = components.slice(0, split); var right = components.slice(split); return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right)); } function decode(input) { try { return decodeURIComponent(input); } catch (err) { var tokens = input.match(singleMatcher) || []; for (var i = 1; i < tokens.length; i++) { input = decodeComponents(tokens, i).join(""); tokens = input.match(singleMatcher) || []; } return input; } } function customDecodeURIComponent(input) { var replaceMap = { "%FE%FF": "\uFFFD\uFFFD", "%FF%FE": "\uFFFD\uFFFD" }; var match = multiMatcher.exec(input); while (match) { try { replaceMap[match[0]] = decodeURIComponent(match[0]); } catch (err) { var result = decode(match[0]); if (result !== match[0]) { replaceMap[match[0]] = result; } } match = multiMatcher.exec(input); } replaceMap["%C2"] = "\uFFFD"; var entries = Object.keys(replaceMap); for (var i = 0; i < entries.length; i++) { var key = entries[i]; input = input.replace(new RegExp(key, "g"), replaceMap[key]); } return input; } module2.exports = function(encodedURI) { if (typeof encodedURI !== "string") { throw new TypeError("Expected `encodedURI` to be of type `string`, got `" + typeof encodedURI + "`"); } try { encodedURI = encodedURI.replace(/\+/g, " "); return decodeURIComponent(encodedURI); } catch (err) { return customDecodeURIComponent(encodedURI); } }; } }); // node_modules/source-map-resolve/index.js var require_source_map_resolve = __commonJS({ "node_modules/source-map-resolve/index.js"(exports, module2) { var atob = require_browser_atob(); var urlLib = require("url"); var pathLib = require("path"); var decodeUriComponentLib = require_decode_uri_component(); function resolveUrl() { return Array.prototype.reduce.call(arguments, function(resolved, nextUrl) { return urlLib.resolve(resolved, nextUrl); }); } function convertWindowsPath(aPath) { return pathLib.sep === "\\" ? aPath.replace(/\\/g, "/").replace(/^[a-z]:\/?/i, "/") : aPath; } function customDecodeUriComponent(string) { return decodeUriComponentLib(string.replace(/\+/g, "%2B")); } function callbackAsync(callback, error, result) { setImmediate(function() { callback(error, result); }); } function parseMapToJSON(string, data) { try { return JSON.parse(string.replace(/^\)\]\}'/, "")); } catch (error) { error.sourceMapData = data; throw error; } } function readSync(read, url, data) { var readUrl = customDecodeUriComponent(url); try { return String(read(readUrl)); } catch (error) { error.sourceMapData = data; throw error; } } var innerRegex = /[#@] sourceMappingURL=([^\s'"]*)/; var sourceMappingURLRegex = RegExp( "(?:/\\*(?:\\s*\r?\n(?://)?)?(?:" + innerRegex.source + ")\\s*\\*/|//(?:" + innerRegex.source + "))\\s*" ); function getSourceMappingUrl(code) { var match = code.match(sourceMappingURLRegex); return match ? match[1] || match[2] || "" : null; } function resolveSourceMap(code, codeUrl, read, callback) { var mapData; try { mapData = resolveSourceMapHelper(code, codeUrl); } catch (error) { return callbackAsync(callback, error); } if (!mapData || mapData.map) { return callbackAsync(callback, null, mapData); } var readUrl = customDecodeUriComponent(mapData.url); read(readUrl, function(error, result) { if (error) { error.sourceMapData = mapData; return callback(error); } mapData.map = String(result); try { mapData.map = parseMapToJSON(mapData.map, mapData); } catch (error2) { return callback(error2); } callback(null, mapData); }); } function resolveSourceMapSync(code, codeUrl, read) { var mapData = resolveSourceMapHelper(code, codeUrl); if (!mapData || mapData.map) { return mapData; } mapData.map = readSync(read, mapData.url, mapData); mapData.map = parseMapToJSON(mapData.map, mapData); return mapData; } var dataUriRegex = /^data:([^,;]*)(;[^,;]*)*(?:,(.*))?$/; var jsonMimeTypeRegex = /^(?:application|text)\/json$/; var jsonCharacterEncoding = "utf-8"; function base64ToBuf(b64) { var binStr = atob(b64); var len = binStr.length; var arr = new Uint8Array(len); for (var i = 0; i < len; i++) { arr[i] = binStr.charCodeAt(i); } return arr; } function decodeBase64String(b64) { if (typeof TextDecoder === "undefined" || typeof Uint8Array === "undefined") { return atob(b64); } var buf = base64ToBuf(b64); var decoder = new TextDecoder(jsonCharacterEncoding, { fatal: true }); return decoder.decode(buf); } function resolveSourceMapHelper(code, codeUrl) { codeUrl = convertWindowsPath(codeUrl); var url = getSourceMappingUrl(code); if (!url) { return null; } var dataUri = url.match(dataUriRegex); if (dataUri) { var mimeType = dataUri[1] || "text/plain"; var lastParameter = dataUri[2] || ""; var encoded = dataUri[3] || ""; var data = { sourceMappingURL: url, url: null, sourcesRelativeTo: codeUrl, map: encoded }; if (!jsonMimeTypeRegex.test(mimeType)) { var error = new Error("Unuseful data uri mime type: " + mimeType); error.sourceMapData = data; throw error; } try { data.map = parseMapToJSON( lastParameter === ";base64" ? decodeBase64String(encoded) : decodeURIComponent(encoded), data ); } catch (error2) { error2.sourceMapData = data; throw error2; } return data; } var mapUrl = resolveUrl(codeUrl, url); return { sourceMappingURL: url, url: mapUrl, sourcesRelativeTo: mapUrl, map: null }; } function resolveSources(map, mapUrl, read, options, callback) { if (typeof options === "function") { callback = options; options = {}; } var pending = map.sources ? map.sources.length : 0; var result = { sourcesResolved: [], sourcesContent: [] }; if (pending === 0) { callbackAsync(callback, null, result); return; } var done = function() { pending--; if (pending === 0) { callback(null, result); } }; resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) { result.sourcesResolved[index] = fullUrl; if (typeof sourceContent === "string") { result.sourcesContent[index] = sourceContent; callbackAsync(done, null); } else { var readUrl = customDecodeUriComponent(fullUrl); read(readUrl, function(error, source) { result.sourcesContent[index] = error ? error : String(source); done(); }); } }); } function resolveSourcesSync(map, mapUrl, read, options) { var result = { sourcesResolved: [], sourcesContent: [] }; if (!map.sources || map.sources.length === 0) { return result; } resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) { result.sourcesResolved[index] = fullUrl; if (read !== null) { if (typeof sourceContent === "string") { result.sourcesContent[index] = sourceContent; } else { var readUrl = customDecodeUriComponent(fullUrl); try { result.sourcesContent[index] = String(read(readUrl)); } catch (error) { result.sourcesContent[index] = error; } } } }); return result; } var endingSlash = /\/?$/; function resolveSourcesHelper(map, mapUrl, options, fn) { options = options || {}; mapUrl = convertWindowsPath(mapUrl); var fullUrl; var sourceContent; var sourceRoot; for (var index = 0, len = map.sources.length; index < len; index++) { sourceRoot = null; if (typeof options.sourceRoot === "string") { sourceRoot = options.sourceRoot; } else if (typeof map.sourceRoot === "string" && options.sourceRoot !== false) { sourceRoot = map.sourceRoot; } if (sourceRoot === null || sourceRoot === "") { fullUrl = resolveUrl(mapUrl, map.sources[index]); } else { fullUrl = resolveUrl(mapUrl, sourceRoot.replace(endingSlash, "/"), map.sources[index]); } sourceContent = (map.sourcesContent || [])[index]; fn(fullUrl, sourceContent, index); } } function resolve(code, codeUrl, read, options, callback) { if (typeof options === "function") { callback = options; options = {}; } if (code === null) { var mapUrl = codeUrl; var data = { sourceMappingURL: null, url: mapUrl, sourcesRelativeTo: mapUrl, map: null }; var readUrl = customDecodeUriComponent(mapUrl); read(readUrl, function(error, result) { if (error) { error.sourceMapData = data; return callback(error); } data.map = String(result); try { data.map = parseMapToJSON(data.map, data); } catch (error2) { return callback(error2); } _resolveSources(data); }); } else { resolveSourceMap(code, codeUrl, read, function(error, mapData) { if (error) { return callback(error); } if (!mapData) { return callback(null, null); } _resolveSources(mapData); }); } function _resolveSources(mapData) { resolveSources(mapData.map, mapData.sourcesRelativeTo, read, options, function(error, result) { if (error) { return callback(error); } mapData.sourcesResolved = result.sourcesResolved; mapData.sourcesContent = result.sourcesContent; callback(null, mapData); }); } } function resolveSync(code, codeUrl, read, options) { var mapData; if (code === null) { var mapUrl = codeUrl; mapData = { sourceMappingURL: null, url: mapUrl, sourcesRelativeTo: mapUrl, map: null }; mapData.map = readSync(read, mapUrl, mapData); mapData.map = parseMapToJSON(mapData.map, mapData); } else { mapData = resolveSourceMapSync(code, codeUrl, read); if (!mapData) { return null; } } var result = resolveSourcesSync(mapData.map, mapData.sourcesRelativeTo, read, options); mapData.sourcesResolved = result.sourcesResolved; mapData.sourcesContent = result.sourcesContent; return mapData; } module2.exports = { resolveSourceMap, resolveSourceMapSync, resolveSources, resolveSourcesSync, resolve, resolveSync, parseMapToJSON }; } }); // node_modules/css/lib/stringify/source-map-support.js var require_source_map_support = __commonJS({ "node_modules/css/lib/stringify/source-map-support.js"(exports, module2) { var SourceMap = require_source_map().SourceMapGenerator; var SourceMapConsumer = require_source_map().SourceMapConsumer; var sourceMapResolve = require_source_map_resolve(); var fs = require("fs"); var path = require("path"); module2.exports = mixin; var makeFriendlyPath = function(aPath) { return path.sep === "\\" ? aPath.replace(/\\/g, "/").replace(/^[a-z]:\/?/i, "/") : aPath; }; function mixin(compiler) { compiler._comment = compiler.comment; compiler.map = new SourceMap(); compiler.position = { line: 1, column: 1 }; compiler.files = {}; for (var k in exports) compiler[k] = exports[k]; } exports.updatePosition = function(str) { var lines = str.match(/\n/g); if (lines) this.position.line += lines.length; var i = str.lastIndexOf("\n"); this.position.column = ~i ? str.length - i : this.position.column + str.length; }; exports.emit = function(str, pos) { if (pos) { var sourceFile = makeFriendlyPath(pos.source || "source.css"); this.map.addMapping({ source: sourceFile, generated: { line: this.position.line, column: Math.max(this.position.column - 1, 0) }, original: { line: pos.start.line, column: pos.start.column - 1 } }); this.addFile(sourceFile, pos); } this.updatePosition(str); return str; }; exports.addFile = function(file, pos) { if (typeof pos.content !== "string") return; if (Object.prototype.hasOwnProperty.call(this.files, file)) return; this.files[file] = pos.content; }; exports.applySourceMaps = function() { Object.keys(this.files).forEach(function(file) { var content = this.files[file]; this.map.setSourceContent(file, content); if (this.options.inputSourcemaps !== false) { var originalMap = sourceMapResolve.resolveSync( content, file, fs.readFileSync ); if (originalMap) { var map = new SourceMapConsumer(originalMap.map); var relativeTo = originalMap.sourcesRelativeTo; this.map.applySourceMap(map, file, makeFriendlyPath(path.dirname(relativeTo))); } } }, this); }; exports.comment = function(node) { if (/^# sourceMappingURL=/.test(node.comment)) return this.emit("", node.position); else return this._comment(node); }; } }); // node_modules/css/lib/stringify/index.js var require_stringify = __commonJS({ "node_modules/css/lib/stringify/index.js"(exports, module2) { var Compressed = require_compress(); var Identity = require_identity(); module2.exports = function(node, options) { options = options || {}; var compiler = options.compress ? new Compressed(options) : new Identity(options); if (options.sourcemap) { var sourcemaps = require_source_map_support(); sourcemaps(compiler); var code = compiler.compile(node); compiler.applySourceMaps(); var map = options.sourcemap === "generator" ? compiler.map : compiler.map.toJSON(); return { code, map }; } var code = compiler.compile(node); return code; }; } }); // node_modules/css/index.js var require_css = __commonJS({ "node_modules/css/index.js"(exports) { exports.parse = require_parse(); exports.stringify = require_stringify(); } }); // main.ts var main_exports = {}; __export(main_exports, { default: () => InlineAdmonitionPlugin }); module.exports = __toCommonJS(main_exports); var import_obsidian7 = require("obsidian"); var import_state2 = require("@codemirror/state"); // src/settings/inlineAdmonitionSettingTab.ts var import_obsidian6 = require("obsidian"); // src/settings/editInlineAdmonitionModal.ts var import_obsidian5 = require("obsidian"); // src/utils.ts function encodeChar(char) { const charCode = char.charCodeAt(0); return `_x${charCode.toString(16).padStart(4, "0")}_`; } function sanitizeClassName(input) { input = input.trim(); if (!/^[a-zA-Z_]/.test(input.charAt(0))) { input = "_" + input; } return input.split("").map((char) => { if (/^[a-zA-Z0-9\-_]$/.test(char)) { return char; } else { return encodeChar(char); } }).join(""); } function appendOpacityToHexColor(hexColor, opacityPercent) { const hexCode = hexColor.trim().replace(/^#/g, "").substring(0, 6); return "#" + hexCode + convertAlphaToHex(opacityPercent); } function convertAlphaToHex(alphaDecimal) { if (alphaDecimal == null) { return "FF"; } const alpha = alphaDecimal / 100; const alphaInt = Math.round(alpha * 255); const alphaHex = alphaInt.toString(16).toUpperCase(); const paddedAlphaHex = alphaHex.padStart(2, "0"); return paddedAlphaHex; } // node_modules/uuid/dist/esm-browser/rng.js var getRandomValues; var rnds8 = new Uint8Array(16); function rng() { if (!getRandomValues) { getRandomValues = typeof crypto !== "undefined" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto); if (!getRandomValues) { throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported"); } } return getRandomValues(rnds8); } // node_modules/uuid/dist/esm-browser/stringify.js var byteToHex = []; for (let i = 0; i < 256; ++i) { byteToHex.push((i + 256).toString(16).slice(1)); } function unsafeStringify(arr, offset = 0) { return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]; } // node_modules/uuid/dist/esm-browser/native.js var randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto); var native_default = { randomUUID }; // node_modules/uuid/dist/esm-browser/v4.js function v4(options, buf, offset) { if (native_default.randomUUID && !buf && !options) { return native_default.randomUUID(); } options = options || {}; const rnds = options.random || (options.rng || rng)(); rnds[6] = rnds[6] & 15 | 64; rnds[8] = rnds[8] & 63 | 128; if (buf) { offset = offset || 0; for (let i = 0; i < 16; ++i) { buf[offset + i] = rnds[i]; } return buf; } return unsafeStringify(rnds); } var v4_default = v4; // src/InlineAdmonitions/inlineAdmonition.ts var InlineAdmonition = class { constructor(backgroundColor, bgColorOpacityPercent, color, colorOpacityPercent, slug) { this.toString = () => { return "InlineAdmonition(" + this.evalBackgroundColor() + ", " + this.type + ")"; }; this.backgroundColor = backgroundColor; this.bgColorOpacityPercent = bgColorOpacityPercent; this.color = color; this.colorOpacityPercent = colorOpacityPercent; this.slug = slug; } cssClasses() { return ["iad"]; } simpleStyle() { return `background-color: ${this.evalBackgroundColor()}; color: ${this.evalColor()};`; } copySettingsTo(other) { other.backgroundColor = this.backgroundColor; other.bgColorOpacityPercent = this.bgColorOpacityPercent; other.color = this.color; other.colorOpacityPercent = this.colorOpacityPercent; } evalBackgroundColor() { return appendOpacityToHexColor(this.backgroundColor, this.bgColorOpacityPercent); } evalColor() { return appendOpacityToHexColor(this.color, this.colorOpacityPercent); } static generateSlug() { return v4_default(); } }; // src/InlineAdmonitions/prefixInlineAdmonition.ts var import_obsidian4 = require("obsidian"); // src/InlineAdmonitions/suffixInlineAdmonition.ts var import_obsidian = require("obsidian"); var import_view = require("@codemirror/view"); var SuffixInlineAdmonition = class extends InlineAdmonition { constructor(suffix, hideTriggerString, backgroundColor, bgColorOpacityPercent, color, colorOpacityPercent, slug) { super(backgroundColor, bgColorOpacityPercent, color, colorOpacityPercent, slug); this.type = "suffix" /* Suffix */; this.toString = () => { return "SuffixInlineAdmonition(" + this.suffix + ", hidePrefix: " + this.hideTriggerString + ")"; }; this.suffix = suffix; this.hideTriggerString = hideTriggerString; } // TODO - I dont like this... static create() { return new SuffixInlineAdmonition( "", false, "#f1f1f1", 100, "#000000", 100, InlineAdmonition.generateSlug() ); } static unmarshal(data) { if (data.type != "suffix" /* Suffix */) { throw new Error("Cannot unmarshal data into SuffixInlineAdmonition: Wrong type: " + data.type); } return new SuffixInlineAdmonition( data.suffix, data.hideTriggerString, data.backgroundColor, data.bgColorOpacityPercent, data.color, data.colorOpacityPercent, data.slug ); } process(codeElement) { if (codeElement.innerText.endsWith(this.suffix)) { this.cssClasses().forEach((c) => codeElement.classList.add(c)); if (this.hideTriggerString) { codeElement.setText(codeElement.getText().replace(new RegExp(this.suffix + "$"), "")); } } } applyTo(node, content, builder) { if (content.endsWith(this.suffix)) { builder.add( node.from, node.to, import_view.Decoration.mark({ inclusive: true, attributes: { class: this.cssClasses().join(" ") }, tagName: "span" }) ); } if (this.hideTriggerString) { builder.add( node.to - this.suffix.length, node.to, import_view.Decoration.mark({ inclusive: true, attributes: { class: "iad-hidden" }, tagName: "span" }) ); } } cssClasses() { const classes = super.cssClasses(); classes.push("iad-suffix"); classes.push("iad-suffix-" + sanitizeClassName(this.suffix)); return classes; } sampleText() { if (this.hideTriggerString) { return "sample text"; } return "sample text " + this.suffix; } buildSettings(contentEl, updateSampleFunction) { const results = new Array(); results.push(new import_obsidian.Setting(contentEl).setName("Suffix").setDesc("Inline codeblock suffix to trigger this formatting").addText( (text) => text.setPlaceholder("Enter suffix").setValue(this.suffix).onChange((value) => { this.suffix = value; updateSampleFunction(); }) )); results.push( new import_obsidian.Setting(contentEl).setName("Hide suffix text").setDesc("If enabled, the 'suffix' text will not show in resulting Inline Admonition").addToggle( (toggle) => toggle.setValue(this.hideTriggerString).onChange((val) => { this.hideTriggerString = val; updateSampleFunction(); }) ) ); return results; } }; // src/InlineAdmonitions/containsInlineAdmonition.ts var import_obsidian2 = require("obsidian"); var import_view2 = require("@codemirror/view"); var ContainsInlineAdmonition = class extends InlineAdmonition { constructor(contains, backgroundColor, bgColorOpacityPercent, color, colorOpacityPercent, slug) { super(backgroundColor, bgColorOpacityPercent, color, colorOpacityPercent, slug); this.type = "contains" /* Contains */; this.toString = () => { return "ContainsInlineAdmonition(" + this.contains + ")"; }; this.contains = contains; } // TODO - I dont like this... static create() { return new ContainsInlineAdmonition( "", "#f1f1f1", 100, "#000000", 100, InlineAdmonition.generateSlug() ); } static unmarshal(data) { if (data.type != "contains" /* Contains */) { throw new Error("Cannot unmarshal data into ContainsInlineAdmonition: Wrong type: " + data.type); } return new ContainsInlineAdmonition( data.contains, data.backgroundColor, data.bgColorOpacityPercent, data.color, data.colorOpacityPercent, data.slug ); } process(codeElement) { if (codeElement.innerText.contains(this.contains)) { this.cssClasses().forEach((c) => codeElement.classList.add(c)); } } applyTo(node, content, builder) { if (content.contains(this.contains)) { builder.add( node.from, node.to, import_view2.Decoration.mark({ inclusive: true, attributes: { class: this.cssClasses().join(" ") }, tagName: "span" }) ); } } cssClasses() { const classes = super.cssClasses(); classes.push("iad-contains"); classes.push("iad-contains-" + sanitizeClassName(this.contains)); return classes; } sampleText() { return "sample " + this.contains + " text"; } buildSettings(contentEl, updateSampleFunction) { const results = new Array(); results.push(new import_obsidian2.Setting(contentEl).setName("Contains").setDesc("Inline codeblock contains this string to trigger this formatting").addText( (text) => text.setPlaceholder("Enter contains").setValue(this.contains).onChange((value) => { this.contains = value; updateSampleFunction(); }) )); return results; } }; // src/InlineAdmonitions/inlineAdmonitionType.ts var import_obsidian3 = require("obsidian"); var InlineAdmonitionType = /* @__PURE__ */ ((InlineAdmonitionType2) => { InlineAdmonitionType2["Prefix"] = "prefix"; InlineAdmonitionType2["Suffix"] = "suffix"; InlineAdmonitionType2["Contains"] = "contains"; return InlineAdmonitionType2; })(InlineAdmonitionType || {}); ((InlineAdmonitionType2) => { function create(type) { switch (type) { case "prefix" /* Prefix */: return PrefixInlineAdmonition.create(); case "suffix" /* Suffix */: return SuffixInlineAdmonition.create(); case "contains" /* Contains */: return ContainsInlineAdmonition.create(); default: throw new Error("Cannot create, invalid Inline Admonition type"); } } InlineAdmonitionType2.create = create; function from(type) { switch (type) { case "prefix" /* Prefix */: return "prefix" /* Prefix */; case "suffix" /* Suffix */: return "suffix" /* Suffix */; case "contains" /* Contains */: return "contains" /* Contains */; default: throw new Error("Invalid Inline Admonition type: " + type); } } InlineAdmonitionType2.from = from; function createFrom(type) { return create(from(type)); } InlineAdmonitionType2.createFrom = createFrom; function unmarshal(data) { const type = from(data.type); switch (type) { case "prefix" /* Prefix */: return PrefixInlineAdmonition.unmarshal(data); case "suffix" /* Suffix */: return SuffixInlineAdmonition.unmarshal(data); case "contains" /* Contains */: return ContainsInlineAdmonition.unmarshal(data); default: throw new Error("Cannot Unmarshal, invalid Inline Admonition type: " + type); } } InlineAdmonitionType2.unmarshal = unmarshal; function tooltip() { return ` The "type" defines what triggers an Inline Admonition - Prefix: Triggered if a codeblock starts with the string. - Suffix: Triggered if a codeblock ends with the string. - Contains: Triggered if a codeblock contains the string anywhere within it. `; } InlineAdmonitionType2.tooltip = tooltip; })(InlineAdmonitionType || (InlineAdmonitionType = {})); var TypeTooltipModal = class extends import_obsidian3.Modal { onOpen() { super.onOpen(); const { contentEl } = this; contentEl.createDiv({ text: InlineAdmonitionType.tooltip(), attr: { "style": "white-space: pre-wrap;" } }); } }; // src/InlineAdmonitions/prefixInlineAdmonition.ts var import_view3 = require("@codemirror/view"); var PrefixInlineAdmonition = class extends InlineAdmonition { constructor(prefix, hideTriggerString, backgroundColor, bgColorOpacityPercent, color, colorOpacityPercent, slug) { super(backgroundColor, bgColorOpacityPercent, color, colorOpacityPercent, slug); this.type = "prefix" /* Prefix */; this.toString = () => { return "PrefixInlineAdmonition(" + this.prefix + ", hidePrefix: " + this.hideTriggerString + ")"; }; this.prefix = prefix; this.hideTriggerString = hideTriggerString; } // TODO - I dont like this... static create() { return new PrefixInlineAdmonition( "", false, "#f1f1f1", 100, "#000000", 100, InlineAdmonition.generateSlug() ); } static unmarshal(data) { if (data.type != "prefix" /* Prefix */) { throw new Error("Cannot unmarshal data into PrefixInlineAdmonition: Wrong type: " + data.type); } return new PrefixInlineAdmonition( data.prefix, data.hideTriggerString, data.backgroundColor, data.bgColorOpacityPercent, data.color, data.colorOpacityPercent, data.slug ); } process(codeElement) { if (codeElement.innerText.startsWith(this.prefix)) { this.cssClasses().forEach((c) => codeElement.classList.add(c)); if (this.hideTriggerString) { codeElement.setText(codeElement.getText().replace(this.prefix, "")); } } } applyTo(node, content, builder) { if (content.startsWith(this.prefix)) { builder.add( node.from, node.to, import_view3.Decoration.mark({ inclusive: true, attributes: { class: this.cssClasses().join(" ") }, tagName: "span" }) ); if (this.hideTriggerString) { builder.add( node.from, node.from + this.prefix.length, import_view3.Decoration.mark({ inclusive: true, attributes: { class: "iad-hidden" }, tagName: "span" }) ); } } } cssClasses() { const classes = super.cssClasses(); classes.push("iad-prefix"); classes.push("iad-prefix-" + sanitizeClassName(this.prefix)); return classes; } sampleText() { if (this.hideTriggerString) { return "sample text"; } return this.prefix + " sample text"; } buildSettings(contentEl, updateSampleFunction) { const results = new Array(); results.push(new import_obsidian4.Setting(contentEl).setName("Prefix").setDesc("Inline codeblock prefix to trigger this formatting").addText( (text) => text.setPlaceholder("Enter prefix").setValue(this.prefix).onChange((value) => { this.prefix = value; updateSampleFunction(); }) )); results.push( new import_obsidian4.Setting(contentEl).setName("Hide prefix text").setDesc("If enabled, the 'prefix' text will not show in resulting Inline Admonition").addToggle( (toggle) => toggle.setValue(this.hideTriggerString).onChange((val) => { this.hideTriggerString = val; updateSampleFunction(); }) ) ); return results; } }; // src/settings/editInlineAdmonitionModal.ts var EditInlineAdmonitionModal = class extends import_obsidian5.Modal { constructor(app, toEdit, onSubmit) { super(app); this.typeSettings = new Array(); this.result = toEdit ? toEdit : PrefixInlineAdmonition.create(); this.onSubmit = onSubmit; } static edit(app, toEdit, onSubmit) { return new EditInlineAdmonitionModal(app, toEdit, onSubmit); } static new(app, onSubmit) { return new EditInlineAdmonitionModal(app, PrefixInlineAdmonition.create(), onSubmit); } onOpen() { const { contentEl } = this; contentEl.createEl("br"); const submitSetting = new import_obsidian5.Setting(contentEl).addButton((btn) => btn.setButtonText("Submit").setCta().onClick(() => { this.close(); this.onSubmit(this.result); })); this.sample = submitSetting.nameEl.createEl("code", { text: this.result.sampleText(), cls: "iad iad-sample iad-sample-editor iad-" + this.result.slug, attr: { "style": this.result.simpleStyle() } }); new import_obsidian5.Setting(contentEl).setName("Background color").setDesc("Color of the background of the inline admonition").addColorPicker( (cp) => cp.setValue(this.result.backgroundColor).onChange((val) => { this.result.backgroundColor = val; this.updateSample(); }) ); new import_obsidian5.Setting(contentEl).setName("Background opacity (0% - 100%)").setDesc("Percentage of opacity to apply to the background color. 0% is fully transparent.").addSlider((s) => s.setLimits(0, 100, 1).setValue(this.result.bgColorOpacityPercent).onChange((val) => { this.result.bgColorOpacityPercent = val; this.updateSample(); })); new import_obsidian5.Setting(contentEl).setName("Text color").setDesc("Color of the text of the inline admonition").addColorPicker( (cp) => cp.setValue(this.result.color).onChange((val) => { this.result.color = val; this.updateSample(); }) ); new import_obsidian5.Setting(contentEl).setName("Text color opacity (0% - 100%)").setDesc("Percentage of opacity to apply to the text color. 0% is fully transparent.").addSlider((s) => s.setLimits(0, 100, 1).setValue(this.result.colorOpacityPercent).onChange((val) => { this.result.colorOpacityPercent = val; this.updateSample(); })); new import_obsidian5.Setting(contentEl).setName("Type").setDesc("The way the Inline Admonition is triggered").setTooltip(InlineAdmonitionType.tooltip()).addDropdown((dc) => dc.addOption("prefix" /* Prefix */, "prefix" /* Prefix */).addOption("suffix" /* Suffix */, "suffix" /* Suffix */).addOption("contains" /* Contains */, "contains" /* Contains */).setValue(this.result.type).onChange((value) => { this.clearTypeSettings(); const old = this.result; this.result = InlineAdmonitionType.createFrom(value); old.copySettingsTo(this.result); this.appendTypeSettings(contentEl); })).addButton( (btn) => btn.setIcon("help-circle").onClick(() => { new TypeTooltipModal(this.app).open(); }) ); this.appendTypeSettings(contentEl); } updateSample() { this.sample.setText(this.result.sampleText()); this.sample.setAttr("style", this.result.simpleStyle() + `margin: 0.5em;`); } clearTypeSettings() { this.typeSettings.forEach((value) => value.settingEl.remove()); } appendTypeSettings(contentEl) { this.typeSettings = this.result.buildSettings(contentEl, () => this.updateSample()); } onClose() { const { contentEl } = this; contentEl.empty(); } }; // src/settings/inlineAdmonitionSettingTab.ts var InlineAdmonitionSettingTab = class extends import_obsidian6.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; } display() { const { containerEl } = this; containerEl.empty(); new import_obsidian6.Setting(containerEl).addButton((b) => b.setButtonText("Create new inline admonition").onClick(async (evt) => { EditInlineAdmonitionModal.new(this.app, async (result) => { this.plugin.settings.inlineAdmonitions.set(result.slug, result); await this.plugin.saveSettings(); this.rebuildSettingRows(containerEl); }).open(); })); this.rebuildSettingRows(containerEl); } // Renders the "samples" with options in the main settings view rebuildSettingRows(containerEl) { containerEl.findAll(".iad-setting-row").forEach((e) => e.remove()); new Map([...this.plugin.settings.inlineAdmonitions].sort()).forEach((iad, identifier) => { this.displaySampleIAD(containerEl, iad, identifier); }); } // Renders a single Inline Admonition "sample" with options displaySampleIAD(containerEl, iad, identifier) { const row = containerEl.createDiv(); row.addClass("iad-setting-row"); row.createSpan({ text: iad.type + " Type", cls: "iad-setting-row-title" }); row.createEl("code", { text: iad.sampleText(), cls: "iad iad-sample iad-" + iad.slug, parent: row, attr: { "style": iad.simpleStyle() + `; margin: 0.5em;` } }); const editButton = row.createEl("button", { text: "Edit" }); editButton.addEventListener("click", (evt) => { EditInlineAdmonitionModal.edit(this.app, iad, async (result) => { this.plugin.settings.inlineAdmonitions.delete(identifier); this.plugin.settings.inlineAdmonitions.set(result.slug, result); await this.plugin.saveSettings(); this.rebuildSettingRows(containerEl); }).open(); }); const deleteButton = row.createEl("button", { text: "Delete" }); deleteButton.addEventListener("click", async (evt) => { this.plugin.settings.inlineAdmonitions.delete(identifier); await this.plugin.saveSettings(); row.remove(); }); } }; // src/settings/inlineAdmonitionSettings.ts var InlineAdmonitionSettingsIO; ((InlineAdmonitionSettingsIO2) => { function marshal(settings) { const settingData = Object.assign({}, DEFAULT_SETTINGS, settings); settingData.inlineAdmonitions = Object.fromEntries(settings.inlineAdmonitions.entries()); return settingData; } InlineAdmonitionSettingsIO2.marshal = marshal; function unmarshalAndMigrate(data) { let settings = Object.assign({}, DEFAULT_SETTINGS, data); const [newSettings, dataMigrated] = migrateData(settings); settings = newSettings; const iads = /* @__PURE__ */ new Map(); for (const identifier in settings.inlineAdmonitions) { const iad = settings.inlineAdmonitions[identifier]; const typedIAD = InlineAdmonitionType.unmarshal(iad); iads.set(typedIAD.slug, typedIAD); } settings.inlineAdmonitions = iads; return [settings, dataMigrated]; } InlineAdmonitionSettingsIO2.unmarshalAndMigrate = unmarshalAndMigrate; function migrateData(settings) { let dataMigrated = false; if (settings.version == void 0 || settings.version === 0) { console.log("[Inline Admonitions] Migrating settings from version 0 to 1"); const iads = /* @__PURE__ */ new Map(); for (const identifier in settings == null ? void 0 : settings.inlineAdmonitions) { const iad = settings.inlineAdmonitions[identifier]; if (iad.type === void 0) { console.log("[Inline Admonitions] Setting InlineAdmonition " + identifier + " to Prefix type"); iad.type = "prefix" /* Prefix */; } if (iad.slug === void 0) { iad.slug = InlineAdmonition.generateSlug(); } const ia = InlineAdmonitionType.unmarshal(iad); iads.set(ia.slug, ia); } settings.inlineAdmonitions = iads; settings["mySetting"] = void 0; settings.version = 1; dataMigrated = true; } if (settings.version === 1) { console.log("[Inline Admonitions] Migrating settings from version 1 to 2"); for (const identifier in settings == null ? void 0 : settings.inlineAdmonitions) { const iad = settings.inlineAdmonitions[identifier]; if (iad.type === "prefix" && !iad.hasOwnProperty("hideTriggerString")) { iad.hideTriggerString = false; } if (iad.type === "suffix" && !iad.hasOwnProperty("hideTriggerString")) { iad.hideTriggerString = false; } settings.inlineAdmonitions[identifier] = iad; } settings.version = 2; dataMigrated = true; } return [settings, dataMigrated]; } InlineAdmonitionSettingsIO2.migrateData = migrateData; })(InlineAdmonitionSettingsIO || (InlineAdmonitionSettingsIO = {})); var DEFAULT_SETTINGS = { version: 0, inlineAdmonitions: /* @__PURE__ */ new Map() }; // src/InlineAdmonitions/inlineAdmonitionsPostProcessor.ts var InlineAdmonitionsPostProcessor = class { constructor(settings) { this.settings = settings; } postProcess(element, context) { element.findAll("code").forEach((codeblock) => { this.settings.inlineAdmonitions.forEach((iad) => iad.process(codeblock)); }); } }; // src/InlineAdmonitions/InlineAdmonitionExtension.ts var import_view4 = require("@codemirror/view"); var import_state = require("@codemirror/state"); var import_language = require("@codemirror/language"); function inlineAdmonitionPlugin(admonitions) { return import_view4.ViewPlugin.fromClass( class { constructor(view) { this.decorations = this.buildDecorations(view); } update(update) { if (update.docChanged || update.viewportChanged) { this.decorations = this.buildDecorations(update.view); } } buildDecorations(view) { const builder = new import_state.RangeSetBuilder(); for (const { from, to } of view.visibleRanges) { (0, import_language.syntaxTree)(view.state).iterate({ from, to, enter: (node) => { if (node.type.name.contains("inline-code")) { const content = view.state.doc.sliceString(node.from, node.to); admonitions.forEach((iad) => iad.applyTo(node, content, builder)); return false; } } }); } return builder.finish(); } }, { decorations: (view) => view.decorations } ); } // src/io/snippets.ts function snippetDir(app) { return `${app.vault.configDir}/snippets`; } function snippetPath(app, filename) { return `${app.vault.configDir}/snippets/${filename}`; } async function readSnippetFile(app, filename) { return await app.vault.adapter.read(`${snippetPath(app, filename)}`); } async function createSnippetFile(app, filename, data = "") { await _validatefilename(filename); await _createSnippetDirectoryIfNotExists(app); await app.vault.adapter.write(`${snippetPath(app, filename)}`, data); } async function writeSnippetFile(app, filename, data) { await app.vault.adapter.write(`${snippetPath(app, filename)}`, data); } async function snippetExists(app, filename) { return app.vault.adapter.exists(`${snippetPath(app, filename)}`); } async function _createSnippetDirectoryIfNotExists(app) { await app.vault.adapter.exists(snippetDir(app)) || await app.vault.adapter.mkdir(snippetDir(app)); } async function _validatefilename(value) { const errors = { exists: "", regex: "" }; if (value.length > 0 && await snippetExists(this.app, value)) { errors.exists = "File already exists."; } const regex = /^[0-9a-zA-Z\-_ ]+\.css$/; if (!regex.test(value)) { errors.regex = "Must end with .css and only contain alphanumeric, spaces, dashes, or underscore characters."; } if (Object.values(errors).some((x) => x !== "")) { const message = Object.values(errors).filter((x) => x !== "").reduce((acc, curr) => `${acc} ${curr}`, "Failed to create file."); throw new Error(message); } } // src/io/inlineAdmonitionCss.ts var css = __toESM(require_css()); var snippetName = "inlineAdmonitionsPluginReadOnly"; var snippetFilename = snippetName + ".css"; var header = `/* WARNING: THIS FILE IS AUTOGENERATED BY THE INLINE ADMONITION PLUGIN. DO NOT MODIFY! */ `; async function setCssForClass(app, className, css2) { const updatedCss = _setCssForClass(className, css2, await cssFileContents(app)); app.customCss.setCssEnabledStatus(snippetName, true); await app.customCss.readSnippets(); await app.customCss.requestLoadSnippets(); return writeSnippetFile(app, snippetFilename, updatedCss); } async function wipeCss(app) { if (await snippetExists(app, snippetFilename)) { return writeSnippetFile(app, snippetFilename, header); } else { return createSnippetFile(app, snippetFilename, header); } } async function cssFileContents(app) { return readSnippetFile(app, snippetFilename); } function _setCssForClass(className, cssClassDeclarations, cssFileContent) { const fileObj = css.parse(cssFileContent, {}); const fileSheet = fileObj.stylesheet; for (const rule of fileSheet.rules) { if (rule.selectors && rule.selectors.contains("." + className)) { rule.declarations = _makeCssRule(className, cssClassDeclarations).declarations; return css.stringify(fileObj); } } fileSheet.rules.push(_makeCssRule(className, cssClassDeclarations)); return css.stringify(fileObj); } function _makeCssRuleString(className, cssDeclarations) { return ".iad." + className + " {\n" + cssDeclarations + "\n}"; } function _makeCssRule(className, cssDeclarations) { const cssString = _makeCssRuleString(className, cssDeclarations); return css.parse(cssString, {}).stylesheet.rules[0]; } // main.ts var InlineAdmonitionPlugin = class extends import_obsidian7.Plugin { async onload() { console.log("Loading Inline Admonitions."); this.inlineAdmonitionCompartment = new import_state2.Compartment(); await this.loadSettings(); const extension = this.inlineAdmonitionCompartment.of( inlineAdmonitionPlugin(Array.from(this.settings.inlineAdmonitions.values())) ); this.registerEditorExtension(extension); this.registerMarkdownPostProcessor((element, context) => { new InlineAdmonitionsPostProcessor(this.settings).postProcess(element, context); }); this.addSettingTab(new InlineAdmonitionSettingTab(this.app, this)); } onunload() { } async loadSettings() { const settingData = await this.loadData(); const [settings, dataMigrated] = InlineAdmonitionSettingsIO.unmarshalAndMigrate(settingData); this.settings = settings; if (dataMigrated) { await this.saveSettings(); } await this.refreshCss(); } async saveSettings() { const settingData = InlineAdmonitionSettingsIO.marshal(this.settings); await this.saveData(settingData); await this.refreshCss(); this.rerenderMarkdownViews(); this.updateEditorExtensions(); } async refreshCss() { await wipeCss(this.app); for (const iad of this.settings.inlineAdmonitions.values()) { await setCssForClass(this.app, iad.cssClasses().last(), iad.simpleStyle()); } } rerenderMarkdownViews() { const view = this.app.workspace.getActiveViewOfType(import_obsidian7.MarkdownView); view == null ? void 0 : view.previewMode.rerender(true); } updateEditorExtensions() { const newExtension = inlineAdmonitionPlugin(Array.from(this.settings.inlineAdmonitions.values())); this.app.workspace.iterateAllLeaves((leaf) => { if (leaf.view instanceof import_obsidian7.MarkdownView && leaf.view.editor) { const editor = leaf.view.editor; const cm = editor.cm; cm.dispatch({ effects: this.inlineAdmonitionCompartment.reconfigure(newExtension) }); } }); } }; /*! Bundled license information: atob/browser-atob.js: (*!! Deliberately using an API that's deprecated in node.js because *) (*!! this file is for browsers and we expect them to cope with it. *) (*!! Discussion: github.com/node-browser-compat/atob/pull/9 *) */ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2Nzcy9saWIvcGFyc2UvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2Nzcy9saWIvc3RyaW5naWZ5L2NvbXBpbGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwgIm5vZGVfbW9kdWxlcy9jc3MvbGliL3N0cmluZ2lmeS9jb21wcmVzcy5qcyIsICJub2RlX21vZHVsZXMvY3NzL2xpYi9zdHJpbmdpZnkvaWRlbnRpdHkuanMiLCAibm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2Jhc2U2NC5qcyIsICJub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYmFzZTY0LXZscS5qcyIsICJub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvdXRpbC5qcyIsICJub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYXJyYXktc2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9tYXBwaW5nLWxpc3QuanMiLCAibm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAtZ2VuZXJhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9iaW5hcnktc2VhcmNoLmpzIiwgIm5vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9xdWljay1zb3J0LmpzIiwgIm5vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwLWNvbnN1bWVyLmpzIiwgIm5vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2Utbm9kZS5qcyIsICJub2RlX21vZHVsZXMvc291cmNlLW1hcC9zb3VyY2UtbWFwLmpzIiwgIm5vZGVfbW9kdWxlcy9hdG9iL2Jyb3dzZXItYXRvYi5qcyIsICJub2RlX21vZHVsZXMvZGVjb2RlLXVyaS1jb21wb25lbnQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAtcmVzb2x2ZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY3NzL2xpYi9zdHJpbmdpZnkvc291cmNlLW1hcC1zdXBwb3J0LmpzIiwgIm5vZGVfbW9kdWxlcy9jc3MvbGliL3N0cmluZ2lmeS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY3NzL2luZGV4LmpzIiwgIm1haW4udHMiLCAic3JjL3NldHRpbmdzL2lubGluZUFkbW9uaXRpb25TZXR0aW5nVGFiLnRzIiwgInNyYy9zZXR0aW5ncy9lZGl0SW5saW5lQWRtb25pdGlvbk1vZGFsLnRzIiwgInNyYy91dGlscy50cyIsICJub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsICJub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3N0cmluZ2lmeS5qcyIsICJub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25hdGl2ZS5qcyIsICJub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzIiwgInNyYy9JbmxpbmVBZG1vbml0aW9ucy9pbmxpbmVBZG1vbml0aW9uLnRzIiwgInNyYy9JbmxpbmVBZG1vbml0aW9ucy9wcmVmaXhJbmxpbmVBZG1vbml0aW9uLnRzIiwgInNyYy9JbmxpbmVBZG1vbml0aW9ucy9zdWZmaXhJbmxpbmVBZG1vbml0aW9uLnRzIiwgInNyYy9JbmxpbmVBZG1vbml0aW9ucy9jb250YWluc0lubGluZUFkbW9uaXRpb24udHMiLCAic3JjL0lubGluZUFkbW9uaXRpb25zL2lubGluZUFkbW9uaXRpb25UeXBlLnRzIiwgInNyYy9zZXR0aW5ncy9pbmxpbmVBZG1vbml0aW9uU2V0dGluZ3MudHMiLCAic3JjL0lubGluZUFkbW9uaXRpb25zL2lubGluZUFkbW9uaXRpb25zUG9zdFByb2Nlc3Nvci50cyIsICJzcmMvSW5saW5lQWRtb25pdGlvbnMvSW5saW5lQWRtb25pdGlvbkV4dGVuc2lvbi50cyIsICJzcmMvaW8vc25pcHBldHMudHMiLCAic3JjL2lvL2lubGluZUFkbW9uaXRpb25Dc3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL2dyYW1tYXIuaHRtbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3Zpc2lvbm1lZGlhL2Nzcy1wYXJzZS9wdWxsLzQ5I2lzc3VlY29tbWVudC0zMDA4ODAyN1xudmFyIGNvbW1lbnRyZSA9IC9cXC9cXCpbXipdKlxcKisoW14vKl1bXipdKlxcKispKlxcLy9nXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY3NzLCBvcHRpb25zKXtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLyoqXG4gICAqIFBvc2l0aW9uYWwuXG4gICAqL1xuXG4gIHZhciBsaW5lbm8gPSAxO1xuICB2YXIgY29sdW1uID0gMTtcblxuICAvKipcbiAgICogVXBkYXRlIGxpbmVubyBhbmQgY29sdW1uIGJhc2VkIG9uIGBzdHJgLlxuICAgKi9cblxuICBmdW5jdGlvbiB1cGRhdGVQb3NpdGlvbihzdHIpIHtcbiAgICB2YXIgbGluZXMgPSBzdHIubWF0Y2goL1xcbi9nKTtcbiAgICBpZiAobGluZXMpIGxpbmVubyArPSBsaW5lcy5sZW5ndGg7XG4gICAgdmFyIGkgPSBzdHIubGFzdEluZGV4T2YoJ1xcbicpO1xuICAgIGNvbHVtbiA9IH5pID8gc3RyLmxlbmd0aCAtIGkgOiBjb2x1bW4gKyBzdHIubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmsgcG9zaXRpb24gYW5kIHBhdGNoIGBub2RlLnBvc2l0aW9uYC5cbiAgICovXG5cbiAgZnVuY3Rpb24gcG9zaXRpb24oKSB7XG4gICAgdmFyIHN0YXJ0ID0geyBsaW5lOiBsaW5lbm8sIGNvbHVtbjogY29sdW1uIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpe1xuICAgICAgbm9kZS5wb3NpdGlvbiA9IG5ldyBQb3NpdGlvbihzdGFydCk7XG4gICAgICB3aGl0ZXNwYWNlKCk7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGZvciBhIG5vZGVcbiAgICovXG5cbiAgZnVuY3Rpb24gUG9zaXRpb24oc3RhcnQpIHtcbiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5lbmQgPSB7IGxpbmU6IGxpbmVubywgY29sdW1uOiBjb2x1bW4gfTtcbiAgICB0aGlzLnNvdXJjZSA9IG9wdGlvbnMuc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vbi1lbnVtZXJhYmxlIHNvdXJjZSBzdHJpbmdcbiAgICovXG5cbiAgUG9zaXRpb24ucHJvdG90eXBlLmNvbnRlbnQgPSBjc3M7XG5cbiAgLyoqXG4gICAqIEVycm9yIGBtc2dgLlxuICAgKi9cblxuICB2YXIgZXJyb3JzTGlzdCA9IFtdO1xuXG4gIGZ1bmN0aW9uIGVycm9yKG1zZykge1xuICAgIHZhciBlcnIgPSBuZXcgRXJyb3Iob3B0aW9ucy5zb3VyY2UgKyAnOicgKyBsaW5lbm8gKyAnOicgKyBjb2x1bW4gKyAnOiAnICsgbXNnKTtcbiAgICBlcnIucmVhc29uID0gbXNnO1xuICAgIGVyci5maWxlbmFtZSA9IG9wdGlvbnMuc291cmNlO1xuICAgIGVyci5saW5lID0gbGluZW5vO1xuICAgIGVyci5jb2x1bW4gPSBjb2x1bW47XG4gICAgZXJyLnNvdXJjZSA9IGNzcztcblxuICAgIGlmIChvcHRpb25zLnNpbGVudCkge1xuICAgICAgZXJyb3JzTGlzdC5wdXNoKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2Ugc3R5bGVzaGVldC5cbiAgICovXG5cbiAgZnVuY3Rpb24gc3R5bGVzaGVldCgpIHtcbiAgICB2YXIgcnVsZXNMaXN0ID0gcnVsZXMoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnc3R5bGVzaGVldCcsXG4gICAgICBzdHlsZXNoZWV0OiB7XG4gICAgICAgIHNvdXJjZTogb3B0aW9ucy5zb3VyY2UsXG4gICAgICAgIHJ1bGVzOiBydWxlc0xpc3QsXG4gICAgICAgIHBhcnNpbmdFcnJvcnM6IGVycm9yc0xpc3RcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5pbmcgYnJhY2UuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIG9wZW4oKSB7XG4gICAgcmV0dXJuIG1hdGNoKC9ee1xccyovKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zaW5nIGJyYWNlLlxuICAgKi9cblxuICBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICByZXR1cm4gbWF0Y2goL159Lyk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgcnVsZXNldC5cbiAgICovXG5cbiAgZnVuY3Rpb24gcnVsZXMoKSB7XG4gICAgdmFyIG5vZGU7XG4gICAgdmFyIHJ1bGVzID0gW107XG4gICAgd2hpdGVzcGFjZSgpO1xuICAgIGNvbW1lbnRzKHJ1bGVzKTtcbiAgICB3aGlsZSAoY3NzLmxlbmd0aCAmJiBjc3MuY2hhckF0KDApICE9ICd9JyAmJiAobm9kZSA9IGF0cnVsZSgpIHx8IHJ1bGUoKSkpIHtcbiAgICAgIGlmIChub2RlICE9PSBmYWxzZSkge1xuICAgICAgICBydWxlcy5wdXNoKG5vZGUpO1xuICAgICAgICBjb21tZW50cyhydWxlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBydWxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXRjaCBgcmVgIGFuZCByZXR1cm4gY2FwdHVyZXMuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIG1hdGNoKHJlKSB7XG4gICAgdmFyIG0gPSByZS5leGVjKGNzcyk7XG4gICAgaWYgKCFtKSByZXR1cm47XG4gICAgdmFyIHN0ciA9IG1bMF07XG4gICAgdXBkYXRlUG9zaXRpb24oc3RyKTtcbiAgICBjc3MgPSBjc3Muc2xpY2Uoc3RyLmxlbmd0aCk7XG4gICAgcmV0dXJuIG07XG4gIH1cblxuICAvKipcbiAgICogUGFyc2Ugd2hpdGVzcGFjZS5cbiAgICovXG5cbiAgZnVuY3Rpb24gd2hpdGVzcGFjZSgpIHtcbiAgICBtYXRjaCgvXlxccyovKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBjb21tZW50cztcbiAgICovXG5cbiAgZnVuY3Rpb24gY29tbWVudHMocnVsZXMpIHtcbiAgICB2YXIgYztcbiAgICBydWxlcyA9IHJ1bGVzIHx8IFtdO1xuICAgIHdoaWxlIChjID0gY29tbWVudCgpKSB7XG4gICAgICBpZiAoYyAhPT0gZmFsc2UpIHtcbiAgICAgICAgcnVsZXMucHVzaChjKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ1bGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGNvbW1lbnQuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGNvbW1lbnQoKSB7XG4gICAgdmFyIHBvcyA9IHBvc2l0aW9uKCk7XG4gICAgaWYgKCcvJyAhPSBjc3MuY2hhckF0KDApIHx8ICcqJyAhPSBjc3MuY2hhckF0KDEpKSByZXR1cm47XG5cbiAgICB2YXIgaSA9IDI7XG4gICAgd2hpbGUgKFwiXCIgIT0gY3NzLmNoYXJBdChpKSAmJiAoJyonICE9IGNzcy5jaGFyQXQoaSkgfHwgJy8nICE9IGNzcy5jaGFyQXQoaSArIDEpKSkgKytpO1xuICAgIGkgKz0gMjtcblxuICAgIGlmIChcIlwiID09PSBjc3MuY2hhckF0KGktMSkpIHtcbiAgICAgIHJldHVybiBlcnJvcignRW5kIG9mIGNvbW1lbnQgbWlzc2luZycpO1xuICAgIH1cblxuICAgIHZhciBzdHIgPSBjc3Muc2xpY2UoMiwgaSAtIDIpO1xuICAgIGNvbHVtbiArPSAyO1xuICAgIHVwZGF0ZVBvc2l0aW9uKHN0cik7XG4gICAgY3NzID0gY3NzLnNsaWNlKGkpO1xuICAgIGNvbHVtbiArPSAyO1xuXG4gICAgcmV0dXJuIHBvcyh7XG4gICAgICB0eXBlOiAnY29tbWVudCcsXG4gICAgICBjb21tZW50OiBzdHJcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBzZWxlY3Rvci5cbiAgICovXG5cbiAgZnVuY3Rpb24gc2VsZWN0b3IoKSB7XG4gICAgdmFyIG0gPSBtYXRjaCgvXihbXntdKykvKTtcbiAgICBpZiAoIW0pIHJldHVybjtcbiAgICAvKiBAZml4IFJlbW92ZSBhbGwgY29tbWVudHMgZnJvbSBzZWxlY3RvcnNcbiAgICAgKiBodHRwOi8vb3N0ZXJtaWxsZXIub3JnL2ZpbmRjb21tZW50Lmh0bWwgKi9cbiAgICByZXR1cm4gdHJpbShtWzBdKVxuICAgICAgLnJlcGxhY2UoL1xcL1xcKihbXipdfFtcXHJcXG5dfChcXCorKFteKi9dfFtcXHJcXG5dKSkpKlxcKlxcLysvZywgJycpXG4gICAgICAucmVwbGFjZSgvXCIoPzpcXFxcXCJ8W15cIl0pKlwifCcoPzpcXFxcJ3xbXiddKSonL2csIGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgcmV0dXJuIG0ucmVwbGFjZSgvLC9nLCAnXFx1MjAwQycpO1xuICAgICAgfSlcbiAgICAgIC5zcGxpdCgvXFxzKig/IVteKF0qXFwpKSxcXHMqLylcbiAgICAgIC5tYXAoZnVuY3Rpb24ocykge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9cXHUyMDBDL2csICcsJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBkZWNsYXJhdGlvbi5cbiAgICovXG5cbiAgZnVuY3Rpb24gZGVjbGFyYXRpb24oKSB7XG4gICAgdmFyIHBvcyA9IHBvc2l0aW9uKCk7XG5cbiAgICAvLyBwcm9wXG4gICAgdmFyIHByb3AgPSBtYXRjaCgvXihcXCo/Wy0jXFwvXFwqXFxcXFxcd10rKFxcW1swLTlhLXpfLV0rXFxdKT8pXFxzKi8pO1xuICAgIGlmICghcHJvcCkgcmV0dXJuO1xuICAgIHByb3AgPSB0cmltKHByb3BbMF0pO1xuXG4gICAgLy8gOlxuICAgIGlmICghbWF0Y2goL146XFxzKi8pKSByZXR1cm4gZXJyb3IoXCJwcm9wZXJ0eSBtaXNzaW5nICc6J1wiKTtcblxuICAgIC8vIHZhbFxuICAgIHZhciB2YWwgPSBtYXRjaCgvXigoPzonKD86XFxcXCd8LikqPyd8XCIoPzpcXFxcXCJ8LikqP1wifFxcKFteXFwpXSo/XFwpfFtefTtdKSspLyk7XG5cbiAgICB2YXIgcmV0ID0gcG9zKHtcbiAgICAgIHR5cGU6ICdkZWNsYXJhdGlvbicsXG4gICAgICBwcm9wZXJ0eTogcHJvcC5yZXBsYWNlKGNvbW1lbnRyZSwgJycpLFxuICAgICAgdmFsdWU6IHZhbCA/IHRyaW0odmFsWzBdKS5yZXBsYWNlKGNvbW1lbnRyZSwgJycpIDogJydcbiAgICB9KTtcblxuICAgIC8vIDtcbiAgICBtYXRjaCgvXls7XFxzXSovKTtcblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgZGVjbGFyYXRpb25zLlxuICAgKi9cblxuICBmdW5jdGlvbiBkZWNsYXJhdGlvbnMoKSB7XG4gICAgdmFyIGRlY2xzID0gW107XG5cbiAgICBpZiAoIW9wZW4oKSkgcmV0dXJuIGVycm9yKFwibWlzc2luZyAneydcIik7XG4gICAgY29tbWVudHMoZGVjbHMpO1xuXG4gICAgLy8gZGVjbGFyYXRpb25zXG4gICAgdmFyIGRlY2w7XG4gICAgd2hpbGUgKGRlY2wgPSBkZWNsYXJhdGlvbigpKSB7XG4gICAgICBpZiAoZGVjbCAhPT0gZmFsc2UpIHtcbiAgICAgICAgZGVjbHMucHVzaChkZWNsKTtcbiAgICAgICAgY29tbWVudHMoZGVjbHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghY2xvc2UoKSkgcmV0dXJuIGVycm9yKFwibWlzc2luZyAnfSdcIik7XG4gICAgcmV0dXJuIGRlY2xzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGtleWZyYW1lLlxuICAgKi9cblxuICBmdW5jdGlvbiBrZXlmcmFtZSgpIHtcbiAgICB2YXIgbTtcbiAgICB2YXIgdmFscyA9IFtdO1xuICAgIHZhciBwb3MgPSBwb3NpdGlvbigpO1xuXG4gICAgd2hpbGUgKG0gPSBtYXRjaCgvXigoXFxkK1xcLlxcZCt8XFwuXFxkK3xcXGQrKSU/fFthLXpdKylcXHMqLykpIHtcbiAgICAgIHZhbHMucHVzaChtWzFdKTtcbiAgICAgIG1hdGNoKC9eLFxccyovKTtcbiAgICB9XG5cbiAgICBpZiAoIXZhbHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICByZXR1cm4gcG9zKHtcbiAgICAgIHR5cGU6ICdrZXlmcmFtZScsXG4gICAgICB2YWx1ZXM6IHZhbHMsXG4gICAgICBkZWNsYXJhdGlvbnM6IGRlY2xhcmF0aW9ucygpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2Uga2V5ZnJhbWVzLlxuICAgKi9cblxuICBmdW5jdGlvbiBhdGtleWZyYW1lcygpIHtcbiAgICB2YXIgcG9zID0gcG9zaXRpb24oKTtcbiAgICB2YXIgbSA9IG1hdGNoKC9eQChbLVxcd10rKT9rZXlmcmFtZXNcXHMqLyk7XG5cbiAgICBpZiAoIW0pIHJldHVybjtcbiAgICB2YXIgdmVuZG9yID0gbVsxXTtcblxuICAgIC8vIGlkZW50aWZpZXJcbiAgICB2YXIgbSA9IG1hdGNoKC9eKFstXFx3XSspXFxzKi8pO1xuICAgIGlmICghbSkgcmV0dXJuIGVycm9yKFwiQGtleWZyYW1lcyBtaXNzaW5nIG5hbWVcIik7XG4gICAgdmFyIG5hbWUgPSBtWzFdO1xuXG4gICAgaWYgKCFvcGVuKCkpIHJldHVybiBlcnJvcihcIkBrZXlmcmFtZXMgbWlzc2luZyAneydcIik7XG5cbiAgICB2YXIgZnJhbWU7XG4gICAgdmFyIGZyYW1lcyA9IGNvbW1lbnRzKCk7XG4gICAgd2hpbGUgKGZyYW1lID0ga2V5ZnJhbWUoKSkge1xuICAgICAgZnJhbWVzLnB1c2goZnJhbWUpO1xuICAgICAgZnJhbWVzID0gZnJhbWVzLmNvbmNhdChjb21tZW50cygpKTtcbiAgICB9XG5cbiAgICBpZiAoIWNsb3NlKCkpIHJldHVybiBlcnJvcihcIkBrZXlmcmFtZXMgbWlzc2luZyAnfSdcIik7XG5cbiAgICByZXR1cm4gcG9zKHtcbiAgICAgIHR5cGU6ICdrZXlmcmFtZXMnLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZlbmRvcjogdmVuZG9yLFxuICAgICAga2V5ZnJhbWVzOiBmcmFtZXNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBzdXBwb3J0cy5cbiAgICovXG5cbiAgZnVuY3Rpb24gYXRzdXBwb3J0cygpIHtcbiAgICB2YXIgcG9zID0gcG9zaXRpb24oKTtcbiAgICB2YXIgbSA9IG1hdGNoKC9eQHN1cHBvcnRzICooW157XSspLyk7XG5cbiAgICBpZiAoIW0pIHJldHVybjtcbiAgICB2YXIgc3VwcG9ydHMgPSB0cmltKG1bMV0pO1xuXG4gICAgaWYgKCFvcGVuKCkpIHJldHVybiBlcnJvcihcIkBzdXBwb3J0cyBtaXNzaW5nICd7J1wiKTtcblxuICAgIHZhciBzdHlsZSA9IGNvbW1lbnRzKCkuY29uY2F0KHJ1bGVzKCkpO1xuXG4gICAgaWYgKCFjbG9zZSgpKSByZXR1cm4gZXJyb3IoXCJAc3VwcG9ydHMgbWlzc2luZyAnfSdcIik7XG5cbiAgICByZXR1cm4gcG9zKHtcbiAgICAgIHR5cGU6ICdzdXBwb3J0cycsXG4gICAgICBzdXBwb3J0czogc3VwcG9ydHMsXG4gICAgICBydWxlczogc3R5bGVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBob3N0LlxuICAgKi9cblxuICBmdW5jdGlvbiBhdGhvc3QoKSB7XG4gICAgdmFyIHBvcyA9IHBvc2l0aW9uKCk7XG4gICAgdmFyIG0gPSBtYXRjaCgvXkBob3N0XFxzKi8pO1xuXG4gICAgaWYgKCFtKSByZXR1cm47XG5cbiAgICBpZiAoIW9wZW4oKSkgcmV0dXJuIGVycm9yKFwiQGhvc3QgbWlzc2luZyAneydcIik7XG5cbiAgICB2YXIgc3R5bGUgPSBjb21tZW50cygpLmNvbmNhdChydWxlcygpKTtcblxuICAgIGlmICghY2xvc2UoKSkgcmV0dXJuIGVycm9yKFwiQGhvc3QgbWlzc2luZyAnfSdcIik7XG5cbiAgICByZXR1cm4gcG9zKHtcbiAgICAgIHR5cGU6ICdob3N0JyxcbiAgICAgIHJ1bGVzOiBzdHlsZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIG1lZGlhLlxuICAgKi9cblxuICBmdW5jdGlvbiBhdG1lZGlhKCkge1xuICAgIHZhciBwb3MgPSBwb3NpdGlvbigpO1xuICAgIHZhciBtID0gbWF0Y2goL15AbWVkaWEgKihbXntdKykvKTtcblxuICAgIGlmICghbSkgcmV0dXJuO1xuICAgIHZhciBtZWRpYSA9IHRyaW0obVsxXSk7XG5cbiAgICBpZiAoIW9wZW4oKSkgcmV0dXJuIGVycm9yKFwiQG1lZGlhIG1pc3NpbmcgJ3snXCIpO1xuXG4gICAgdmFyIHN0eWxlID0gY29tbWVudHMoKS5jb25jYXQocnVsZXMoKSk7XG5cbiAgICBpZiAoIWNsb3NlKCkpIHJldHVybiBlcnJvcihcIkBtZWRpYSBtaXNzaW5nICd9J1wiKTtcblxuICAgIHJldHVybiBwb3Moe1xuICAgICAgdHlwZTogJ21lZGlhJyxcbiAgICAgIG1lZGlhOiBtZWRpYSxcbiAgICAgIHJ1bGVzOiBzdHlsZVxuICAgIH0pO1xuICB9XG5cblxuICAvKipcbiAgICogUGFyc2UgY3VzdG9tLW1lZGlhLlxuICAgKi9cblxuICBmdW5jdGlvbiBhdGN1c3RvbW1lZGlhKCkge1xuICAgIHZhciBwb3MgPSBwb3NpdGlvbigpO1xuICAgIHZhciBtID0gbWF0Y2goL15AY3VzdG9tLW1lZGlhXFxzKygtLVteXFxzXSspXFxzKihbXns7XSspOy8pO1xuICAgIGlmICghbSkgcmV0dXJuO1xuXG4gICAgcmV0dXJuIHBvcyh7XG4gICAgICB0eXBlOiAnY3VzdG9tLW1lZGlhJyxcbiAgICAgIG5hbWU6IHRyaW0obVsxXSksXG4gICAgICBtZWRpYTogdHJpbShtWzJdKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHBhZ2VkIG1lZGlhLlxuICAgKi9cblxuICBmdW5jdGlvbiBhdHBhZ2UoKSB7XG4gICAgdmFyIHBvcyA9IHBvc2l0aW9uKCk7XG4gICAgdmFyIG0gPSBtYXRjaCgvXkBwYWdlICovKTtcbiAgICBpZiAoIW0pIHJldHVybjtcblxuICAgIHZhciBzZWwgPSBzZWxlY3RvcigpIHx8IFtdO1xuXG4gICAgaWYgKCFvcGVuKCkpIHJldHVybiBlcnJvcihcIkBwYWdlIG1pc3NpbmcgJ3snXCIpO1xuICAgIHZhciBkZWNscyA9IGNvbW1lbnRzKCk7XG5cbiAgICAvLyBkZWNsYXJhdGlvbnNcbiAgICB2YXIgZGVjbDtcbiAgICB3aGlsZSAoZGVjbCA9IGRlY2xhcmF0aW9uKCkpIHtcbiAgICAgIGRlY2xzLnB1c2goZGVjbCk7XG4gICAgICBkZWNscyA9IGRlY2xzLmNvbmNhdChjb21tZW50cygpKTtcbiAgICB9XG5cbiAgICBpZiAoIWNsb3NlKCkpIHJldHVybiBlcnJvcihcIkBwYWdlIG1pc3NpbmcgJ30nXCIpO1xuXG4gICAgcmV0dXJuIHBvcyh7XG4gICAgICB0eXBlOiAncGFnZScsXG4gICAgICBzZWxlY3RvcnM6IHNlbCxcbiAgICAgIGRlY2xhcmF0aW9uczogZGVjbHNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBkb2N1bWVudC5cbiAgICovXG5cbiAgZnVuY3Rpb24gYXRkb2N1bWVudCgpIHtcbiAgICB2YXIgcG9zID0gcG9zaXRpb24oKTtcbiAgICB2YXIgbSA9IG1hdGNoKC9eQChbLVxcd10rKT9kb2N1bWVudCAqKFtee10rKS8pO1xuICAgIGlmICghbSkgcmV0dXJuO1xuXG4gICAgdmFyIHZlbmRvciA9IHRyaW0obVsxXSk7XG4gICAgdmFyIGRvYyA9IHRyaW0obVsyXSk7XG5cbiAgICBpZiAoIW9wZW4oKSkgcmV0dXJuIGVycm9yKFwiQGRvY3VtZW50IG1pc3NpbmcgJ3snXCIpO1xuXG4gICAgdmFyIHN0eWxlID0gY29tbWVudHMoKS5jb25jYXQocnVsZXMoKSk7XG5cbiAgICBpZiAoIWNsb3NlKCkpIHJldHVybiBlcnJvcihcIkBkb2N1bWVudCBtaXNzaW5nICd9J1wiKTtcblxuICAgIHJldHVybiBwb3Moe1xuICAgICAgdHlwZTogJ2RvY3VtZW50JyxcbiAgICAgIGRvY3VtZW50OiBkb2MsXG4gICAgICB2ZW5kb3I6IHZlbmRvcixcbiAgICAgIHJ1bGVzOiBzdHlsZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGZvbnQtZmFjZS5cbiAgICovXG5cbiAgZnVuY3Rpb24gYXRmb250ZmFjZSgpIHtcbiAgICB2YXIgcG9zID0gcG9zaXRpb24oKTtcbiAgICB2YXIgbSA9IG1hdGNoKC9eQGZvbnQtZmFjZVxccyovKTtcbiAgICBpZiAoIW0pIHJldHVybjtcblxuICAgIGlmICghb3BlbigpKSByZXR1cm4gZXJyb3IoXCJAZm9udC1mYWNlIG1pc3NpbmcgJ3snXCIpO1xuICAgIHZhciBkZWNscyA9IGNvbW1lbnRzKCk7XG5cbiAgICAvLyBkZWNsYXJhdGlvbnNcbiAgICB2YXIgZGVjbDtcbiAgICB3aGlsZSAoZGVjbCA9IGRlY2xhcmF0aW9uKCkpIHtcbiAgICAgIGRlY2xzLnB1c2goZGVjbCk7XG4gICAgICBkZWNscyA9IGRlY2xzLmNvbmNhdChjb21tZW50cygpKTtcbiAgICB9XG5cbiAgICBpZiAoIWNsb3NlKCkpIHJldHVybiBlcnJvcihcIkBmb250LWZhY2UgbWlzc2luZyAnfSdcIik7XG5cbiAgICByZXR1cm4gcG9zKHtcbiAgICAgIHR5cGU6ICdmb250LWZhY2UnLFxuICAgICAgZGVjbGFyYXRpb25zOiBkZWNsc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGltcG9ydFxuICAgKi9cblxuICB2YXIgYXRpbXBvcnQgPSBfY29tcGlsZUF0cnVsZSgnaW1wb3J0Jyk7XG5cbiAgLyoqXG4gICAqIFBhcnNlIGNoYXJzZXRcbiAgICovXG5cbiAgdmFyIGF0Y2hhcnNldCA9IF9jb21waWxlQXRydWxlKCdjaGFyc2V0Jyk7XG5cbiAgLyoqXG4gICAqIFBhcnNlIG5hbWVzcGFjZVxuICAgKi9cblxuICB2YXIgYXRuYW1lc3BhY2UgPSBfY29tcGlsZUF0cnVsZSgnbmFtZXNwYWNlJyk7XG5cbiAgLyoqXG4gICAqIFBhcnNlIG5vbi1ibG9jayBhdC1ydWxlc1xuICAgKi9cblxuXG4gIGZ1bmN0aW9uIF9jb21waWxlQXRydWxlKG5hbWUpIHtcbiAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeQCcgKyBuYW1lICsgJ1xcXFxzKihbXjtdKyk7Jyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHBvcyA9IHBvc2l0aW9uKCk7XG4gICAgICB2YXIgbSA9IG1hdGNoKHJlKTtcbiAgICAgIGlmICghbSkgcmV0dXJuO1xuICAgICAgdmFyIHJldCA9IHsgdHlwZTogbmFtZSB9O1xuICAgICAgcmV0W25hbWVdID0gbVsxXS50cmltKCk7XG4gICAgICByZXR1cm4gcG9zKHJldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGF0IHJ1bGUuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGF0cnVsZSgpIHtcbiAgICBpZiAoY3NzWzBdICE9ICdAJykgcmV0dXJuO1xuXG4gICAgcmV0dXJuIGF0a2V5ZnJhbWVzKClcbiAgICAgIHx8IGF0bWVkaWEoKVxuICAgICAgfHwgYXRjdXN0b21tZWRpYSgpXG4gICAgICB8fCBhdHN1cHBvcnRzKClcbiAgICAgIHx8IGF0aW1wb3J0KClcbiAgICAgIHx8IGF0Y2hhcnNldCgpXG4gICAgICB8fCBhdG5hbWVzcGFjZSgpXG4gICAgICB8fCBhdGRvY3VtZW50KClcbiAgICAgIHx8IGF0cGFnZSgpXG4gICAgICB8fCBhdGhvc3QoKVxuICAgICAgfHwgYXRmb250ZmFjZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHJ1bGUuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHJ1bGUoKSB7XG4gICAgdmFyIHBvcyA9IHBvc2l0aW9uKCk7XG4gICAgdmFyIHNlbCA9IHNlbGVjdG9yKCk7XG5cbiAgICBpZiAoIXNlbCkgcmV0dXJuIGVycm9yKCdzZWxlY3RvciBtaXNzaW5nJyk7XG4gICAgY29tbWVudHMoKTtcblxuICAgIHJldHVybiBwb3Moe1xuICAgICAgdHlwZTogJ3J1bGUnLFxuICAgICAgc2VsZWN0b3JzOiBzZWwsXG4gICAgICBkZWNsYXJhdGlvbnM6IGRlY2xhcmF0aW9ucygpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gYWRkUGFyZW50KHN0eWxlc2hlZXQoKSk7XG59O1xuXG4vKipcbiAqIFRyaW0gYHN0cmAuXG4gKi9cblxuZnVuY3Rpb24gdHJpbShzdHIpIHtcbiAgcmV0dXJuIHN0ciA/IHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJykgOiAnJztcbn1cblxuLyoqXG4gKiBBZGRzIG5vbi1lbnVtZXJhYmxlIHBhcmVudCBub2RlIHJlZmVyZW5jZSB0byBlYWNoIG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gYWRkUGFyZW50KG9iaiwgcGFyZW50KSB7XG4gIHZhciBpc05vZGUgPSBvYmogJiYgdHlwZW9mIG9iai50eXBlID09PSAnc3RyaW5nJztcbiAgdmFyIGNoaWxkUGFyZW50ID0gaXNOb2RlID8gb2JqIDogcGFyZW50O1xuXG4gIGZvciAodmFyIGsgaW4gb2JqKSB7XG4gICAgdmFyIHZhbHVlID0gb2JqW2tdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGFkZFBhcmVudCh2LCBjaGlsZFBhcmVudCk7IH0pO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgYWRkUGFyZW50KHZhbHVlLCBjaGlsZFBhcmVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzTm9kZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosICdwYXJlbnQnLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHBhcmVudCB8fCBudWxsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuIiwgIlxuLyoqXG4gKiBFeHBvc2UgYENvbXBpbGVyYC5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBpbGVyO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBjb21waWxlci5cbiAqXG4gKiBAcGFyYW0ge1R5cGV9IG5hbWVcbiAqIEByZXR1cm4ge1R5cGV9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIENvbXBpbGVyKG9wdHMpIHtcbiAgdGhpcy5vcHRpb25zID0gb3B0cyB8fCB7fTtcbn1cblxuLyoqXG4gKiBFbWl0IGBzdHJgXG4gKi9cblxuQ29tcGlsZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihzdHIpIHtcbiAgcmV0dXJuIHN0cjtcbn07XG5cbi8qKlxuICogVmlzaXQgYG5vZGVgLlxuICovXG5cbkNvbXBpbGVyLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uKG5vZGUpe1xuICByZXR1cm4gdGhpc1tub2RlLnR5cGVdKG5vZGUpO1xufTtcblxuLyoqXG4gKiBNYXAgdmlzaXQgb3ZlciBhcnJheSBvZiBgbm9kZXNgLCBvcHRpb25hbGx5IHVzaW5nIGEgYGRlbGltYFxuICovXG5cbkNvbXBpbGVyLnByb3RvdHlwZS5tYXBWaXNpdCA9IGZ1bmN0aW9uKG5vZGVzLCBkZWxpbSl7XG4gIHZhciBidWYgPSAnJztcbiAgZGVsaW0gPSBkZWxpbSB8fCAnJztcblxuICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gbm9kZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBidWYgKz0gdGhpcy52aXNpdChub2Rlc1tpXSk7XG4gICAgaWYgKGRlbGltICYmIGkgPCBsZW5ndGggLSAxKSBidWYgKz0gdGhpcy5lbWl0KGRlbGltKTtcbiAgfVxuXG4gIHJldHVybiBidWY7XG59O1xuIiwgImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgICB9XG4gIH1cbn1cbiIsICJcbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vY29tcGlsZXInKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbi8qKlxuICogRXhwb3NlIGNvbXBpbGVyLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gQ29tcGlsZXI7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgQ29tcGlsZXJgLlxuICovXG5cbmZ1bmN0aW9uIENvbXBpbGVyKG9wdGlvbnMpIHtcbiAgQmFzZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgQmFzZS5wcm90b3R5cGVgLlxuICovXG5cbmluaGVyaXRzKENvbXBpbGVyLCBCYXNlKTtcblxuLyoqXG4gKiBDb21waWxlIGBub2RlYC5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uKG5vZGUpe1xuICByZXR1cm4gbm9kZS5zdHlsZXNoZWV0XG4gICAgLnJ1bGVzLm1hcCh0aGlzLnZpc2l0LCB0aGlzKVxuICAgIC5qb2luKCcnKTtcbn07XG5cbi8qKlxuICogVmlzaXQgY29tbWVudCBub2RlLlxuICovXG5cbkNvbXBpbGVyLnByb3RvdHlwZS5jb21tZW50ID0gZnVuY3Rpb24obm9kZSl7XG4gIHJldHVybiB0aGlzLmVtaXQoJycsIG5vZGUucG9zaXRpb24pO1xufTtcblxuLyoqXG4gKiBWaXNpdCBpbXBvcnQgbm9kZS5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGUuaW1wb3J0ID0gZnVuY3Rpb24obm9kZSl7XG4gIHJldHVybiB0aGlzLmVtaXQoJ0BpbXBvcnQgJyArIG5vZGUuaW1wb3J0ICsgJzsnLCBub2RlLnBvc2l0aW9uKTtcbn07XG5cbi8qKlxuICogVmlzaXQgbWVkaWEgbm9kZS5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGUubWVkaWEgPSBmdW5jdGlvbihub2RlKXtcbiAgcmV0dXJuIHRoaXMuZW1pdCgnQG1lZGlhICcgKyBub2RlLm1lZGlhLCBub2RlLnBvc2l0aW9uKVxuICAgICsgdGhpcy5lbWl0KCd7JylcbiAgICArIHRoaXMubWFwVmlzaXQobm9kZS5ydWxlcylcbiAgICArIHRoaXMuZW1pdCgnfScpO1xufTtcblxuLyoqXG4gKiBWaXNpdCBkb2N1bWVudCBub2RlLlxuICovXG5cbkNvbXBpbGVyLnByb3RvdHlwZS5kb2N1bWVudCA9IGZ1bmN0aW9uKG5vZGUpe1xuICB2YXIgZG9jID0gJ0AnICsgKG5vZGUudmVuZG9yIHx8ICcnKSArICdkb2N1bWVudCAnICsgbm9kZS5kb2N1bWVudDtcblxuICByZXR1cm4gdGhpcy5lbWl0KGRvYywgbm9kZS5wb3NpdGlvbilcbiAgICArIHRoaXMuZW1pdCgneycpXG4gICAgKyB0aGlzLm1hcFZpc2l0KG5vZGUucnVsZXMpXG4gICAgKyB0aGlzLmVtaXQoJ30nKTtcbn07XG5cbi8qKlxuICogVmlzaXQgY2hhcnNldCBub2RlLlxuICovXG5cbkNvbXBpbGVyLnByb3RvdHlwZS5jaGFyc2V0ID0gZnVuY3Rpb24obm9kZSl7XG4gIHJldHVybiB0aGlzLmVtaXQoJ0BjaGFyc2V0ICcgKyBub2RlLmNoYXJzZXQgKyAnOycsIG5vZGUucG9zaXRpb24pO1xufTtcblxuLyoqXG4gKiBWaXNpdCBuYW1lc3BhY2Ugbm9kZS5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGUubmFtZXNwYWNlID0gZnVuY3Rpb24obm9kZSl7XG4gIHJldHVybiB0aGlzLmVtaXQoJ0BuYW1lc3BhY2UgJyArIG5vZGUubmFtZXNwYWNlICsgJzsnLCBub2RlLnBvc2l0aW9uKTtcbn07XG5cbi8qKlxuICogVmlzaXQgc3VwcG9ydHMgbm9kZS5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGUuc3VwcG9ydHMgPSBmdW5jdGlvbihub2RlKXtcbiAgcmV0dXJuIHRoaXMuZW1pdCgnQHN1cHBvcnRzICcgKyBub2RlLnN1cHBvcnRzLCBub2RlLnBvc2l0aW9uKVxuICAgICsgdGhpcy5lbWl0KCd7JylcbiAgICArIHRoaXMubWFwVmlzaXQobm9kZS5ydWxlcylcbiAgICArIHRoaXMuZW1pdCgnfScpO1xufTtcblxuLyoqXG4gKiBWaXNpdCBrZXlmcmFtZXMgbm9kZS5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGUua2V5ZnJhbWVzID0gZnVuY3Rpb24obm9kZSl7XG4gIHJldHVybiB0aGlzLmVtaXQoJ0AnXG4gICAgKyAobm9kZS52ZW5kb3IgfHwgJycpXG4gICAgKyAna2V5ZnJhbWVzICdcbiAgICArIG5vZGUubmFtZSwgbm9kZS5wb3NpdGlvbilcbiAgICArIHRoaXMuZW1pdCgneycpXG4gICAgKyB0aGlzLm1hcFZpc2l0KG5vZGUua2V5ZnJhbWVzKVxuICAgICsgdGhpcy5lbWl0KCd9Jyk7XG59O1xuXG4vKipcbiAqIFZpc2l0IGtleWZyYW1lIG5vZGUuXG4gKi9cblxuQ29tcGlsZXIucHJvdG90eXBlLmtleWZyYW1lID0gZnVuY3Rpb24obm9kZSl7XG4gIHZhciBkZWNscyA9IG5vZGUuZGVjbGFyYXRpb25zO1xuXG4gIHJldHVybiB0aGlzLmVtaXQobm9kZS52YWx1ZXMuam9pbignLCcpLCBub2RlLnBvc2l0aW9uKVxuICAgICsgdGhpcy5lbWl0KCd7JylcbiAgICArIHRoaXMubWFwVmlzaXQoZGVjbHMpXG4gICAgKyB0aGlzLmVtaXQoJ30nKTtcbn07XG5cbi8qKlxuICogVmlzaXQgcGFnZSBub2RlLlxuICovXG5cbkNvbXBpbGVyLnByb3RvdHlwZS5wYWdlID0gZnVuY3Rpb24obm9kZSl7XG4gIHZhciBzZWwgPSBub2RlLnNlbGVjdG9ycy5sZW5ndGhcbiAgICA/IG5vZGUuc2VsZWN0b3JzLmpvaW4oJywgJylcbiAgICA6ICcnO1xuXG4gIHJldHVybiB0aGlzLmVtaXQoJ0BwYWdlICcgKyBzZWwsIG5vZGUucG9zaXRpb24pXG4gICAgKyB0aGlzLmVtaXQoJ3snKVxuICAgICsgdGhpcy5tYXBWaXNpdChub2RlLmRlY2xhcmF0aW9ucylcbiAgICArIHRoaXMuZW1pdCgnfScpO1xufTtcblxuLyoqXG4gKiBWaXNpdCBmb250LWZhY2Ugbm9kZS5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGVbJ2ZvbnQtZmFjZSddID0gZnVuY3Rpb24obm9kZSl7XG4gIHJldHVybiB0aGlzLmVtaXQoJ0Bmb250LWZhY2UnLCBub2RlLnBvc2l0aW9uKVxuICAgICsgdGhpcy5lbWl0KCd7JylcbiAgICArIHRoaXMubWFwVmlzaXQobm9kZS5kZWNsYXJhdGlvbnMpXG4gICAgKyB0aGlzLmVtaXQoJ30nKTtcbn07XG5cbi8qKlxuICogVmlzaXQgaG9zdCBub2RlLlxuICovXG5cbkNvbXBpbGVyLnByb3RvdHlwZS5ob3N0ID0gZnVuY3Rpb24obm9kZSl7XG4gIHJldHVybiB0aGlzLmVtaXQoJ0Bob3N0Jywgbm9kZS5wb3NpdGlvbilcbiAgICArIHRoaXMuZW1pdCgneycpXG4gICAgKyB0aGlzLm1hcFZpc2l0KG5vZGUucnVsZXMpXG4gICAgKyB0aGlzLmVtaXQoJ30nKTtcbn07XG5cbi8qKlxuICogVmlzaXQgY3VzdG9tLW1lZGlhIG5vZGUuXG4gKi9cblxuQ29tcGlsZXIucHJvdG90eXBlWydjdXN0b20tbWVkaWEnXSA9IGZ1bmN0aW9uKG5vZGUpe1xuICByZXR1cm4gdGhpcy5lbWl0KCdAY3VzdG9tLW1lZGlhICcgKyBub2RlLm5hbWUgKyAnICcgKyBub2RlLm1lZGlhICsgJzsnLCBub2RlLnBvc2l0aW9uKTtcbn07XG5cbi8qKlxuICogVmlzaXQgcnVsZSBub2RlLlxuICovXG5cbkNvbXBpbGVyLnByb3RvdHlwZS5ydWxlID0gZnVuY3Rpb24obm9kZSl7XG4gIHZhciBkZWNscyA9IG5vZGUuZGVjbGFyYXRpb25zO1xuICBpZiAoIWRlY2xzLmxlbmd0aCkgcmV0dXJuICcnO1xuXG4gIHJldHVybiB0aGlzLmVtaXQobm9kZS5zZWxlY3RvcnMuam9pbignLCcpLCBub2RlLnBvc2l0aW9uKVxuICAgICsgdGhpcy5lbWl0KCd7JylcbiAgICArIHRoaXMubWFwVmlzaXQoZGVjbHMpXG4gICAgKyB0aGlzLmVtaXQoJ30nKTtcbn07XG5cbi8qKlxuICogVmlzaXQgZGVjbGFyYXRpb24gbm9kZS5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGUuZGVjbGFyYXRpb24gPSBmdW5jdGlvbihub2RlKXtcbiAgcmV0dXJuIHRoaXMuZW1pdChub2RlLnByb3BlcnR5ICsgJzonICsgbm9kZS52YWx1ZSwgbm9kZS5wb3NpdGlvbikgKyB0aGlzLmVtaXQoJzsnKTtcbn07XG5cbiIsICJcbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vY29tcGlsZXInKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbi8qKlxuICogRXhwb3NlIGNvbXBpbGVyLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gQ29tcGlsZXI7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgQ29tcGlsZXJgLlxuICovXG5cbmZ1bmN0aW9uIENvbXBpbGVyKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIEJhc2UuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgdGhpcy5pbmRlbnRhdGlvbiA9IG9wdGlvbnMuaW5kZW50O1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgQmFzZS5wcm90b3R5cGVgLlxuICovXG5cbmluaGVyaXRzKENvbXBpbGVyLCBCYXNlKTtcblxuLyoqXG4gKiBDb21waWxlIGBub2RlYC5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uKG5vZGUpe1xuICByZXR1cm4gdGhpcy5zdHlsZXNoZWV0KG5vZGUpO1xufTtcblxuLyoqXG4gKiBWaXNpdCBzdHlsZXNoZWV0IG5vZGUuXG4gKi9cblxuQ29tcGlsZXIucHJvdG90eXBlLnN0eWxlc2hlZXQgPSBmdW5jdGlvbihub2RlKXtcbiAgcmV0dXJuIHRoaXMubWFwVmlzaXQobm9kZS5zdHlsZXNoZWV0LnJ1bGVzLCAnXFxuXFxuJyk7XG59O1xuXG4vKipcbiAqIFZpc2l0IGNvbW1lbnQgbm9kZS5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGUuY29tbWVudCA9IGZ1bmN0aW9uKG5vZGUpe1xuICByZXR1cm4gdGhpcy5lbWl0KHRoaXMuaW5kZW50KCkgKyAnLyonICsgbm9kZS5jb21tZW50ICsgJyovJywgbm9kZS5wb3NpdGlvbik7XG59O1xuXG4vKipcbiAqIFZpc2l0IGltcG9ydCBub2RlLlxuICovXG5cbkNvbXBpbGVyLnByb3RvdHlwZS5pbXBvcnQgPSBmdW5jdGlvbihub2RlKXtcbiAgcmV0dXJuIHRoaXMuZW1pdCgnQGltcG9ydCAnICsgbm9kZS5pbXBvcnQgKyAnOycsIG5vZGUucG9zaXRpb24pO1xufTtcblxuLyoqXG4gKiBWaXNpdCBtZWRpYSBub2RlLlxuICovXG5cbkNvbXBpbGVyLnByb3RvdHlwZS5tZWRpYSA9IGZ1bmN0aW9uKG5vZGUpe1xuICByZXR1cm4gdGhpcy5lbWl0KCdAbWVkaWEgJyArIG5vZGUubWVkaWEsIG5vZGUucG9zaXRpb24pXG4gICAgKyB0aGlzLmVtaXQoXG4gICAgICAgICcge1xcbidcbiAgICAgICAgKyB0aGlzLmluZGVudCgxKSlcbiAgICArIHRoaXMubWFwVmlzaXQobm9kZS5ydWxlcywgJ1xcblxcbicpXG4gICAgKyB0aGlzLmVtaXQoXG4gICAgICAgIHRoaXMuaW5kZW50KC0xKVxuICAgICAgICArICdcXG59Jyk7XG59O1xuXG4vKipcbiAqIFZpc2l0IGRvY3VtZW50IG5vZGUuXG4gKi9cblxuQ29tcGlsZXIucHJvdG90eXBlLmRvY3VtZW50ID0gZnVuY3Rpb24obm9kZSl7XG4gIHZhciBkb2MgPSAnQCcgKyAobm9kZS52ZW5kb3IgfHwgJycpICsgJ2RvY3VtZW50ICcgKyBub2RlLmRvY3VtZW50O1xuXG4gIHJldHVybiB0aGlzLmVtaXQoZG9jLCBub2RlLnBvc2l0aW9uKVxuICAgICsgdGhpcy5lbWl0KFxuICAgICAgICAnICdcbiAgICAgICsgJyB7XFxuJ1xuICAgICAgKyB0aGlzLmluZGVudCgxKSlcbiAgICArIHRoaXMubWFwVmlzaXQobm9kZS5ydWxlcywgJ1xcblxcbicpXG4gICAgKyB0aGlzLmVtaXQoXG4gICAgICAgIHRoaXMuaW5kZW50KC0xKVxuICAgICAgICArICdcXG59Jyk7XG59O1xuXG4vKipcbiAqIFZpc2l0IGNoYXJzZXQgbm9kZS5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGUuY2hhcnNldCA9IGZ1bmN0aW9uKG5vZGUpe1xuICByZXR1cm4gdGhpcy5lbWl0KCdAY2hhcnNldCAnICsgbm9kZS5jaGFyc2V0ICsgJzsnLCBub2RlLnBvc2l0aW9uKTtcbn07XG5cbi8qKlxuICogVmlzaXQgbmFtZXNwYWNlIG5vZGUuXG4gKi9cblxuQ29tcGlsZXIucHJvdG90eXBlLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKG5vZGUpe1xuICByZXR1cm4gdGhpcy5lbWl0KCdAbmFtZXNwYWNlICcgKyBub2RlLm5hbWVzcGFjZSArICc7Jywgbm9kZS5wb3NpdGlvbik7XG59O1xuXG4vKipcbiAqIFZpc2l0IHN1cHBvcnRzIG5vZGUuXG4gKi9cblxuQ29tcGlsZXIucHJvdG90eXBlLnN1cHBvcnRzID0gZnVuY3Rpb24obm9kZSl7XG4gIHJldHVybiB0aGlzLmVtaXQoJ0BzdXBwb3J0cyAnICsgbm9kZS5zdXBwb3J0cywgbm9kZS5wb3NpdGlvbilcbiAgICArIHRoaXMuZW1pdChcbiAgICAgICcge1xcbidcbiAgICAgICsgdGhpcy5pbmRlbnQoMSkpXG4gICAgKyB0aGlzLm1hcFZpc2l0KG5vZGUucnVsZXMsICdcXG5cXG4nKVxuICAgICsgdGhpcy5lbWl0KFxuICAgICAgICB0aGlzLmluZGVudCgtMSlcbiAgICAgICAgKyAnXFxufScpO1xufTtcblxuLyoqXG4gKiBWaXNpdCBrZXlmcmFtZXMgbm9kZS5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGUua2V5ZnJhbWVzID0gZnVuY3Rpb24obm9kZSl7XG4gIHJldHVybiB0aGlzLmVtaXQoJ0AnICsgKG5vZGUudmVuZG9yIHx8ICcnKSArICdrZXlmcmFtZXMgJyArIG5vZGUubmFtZSwgbm9kZS5wb3NpdGlvbilcbiAgICArIHRoaXMuZW1pdChcbiAgICAgICcge1xcbidcbiAgICAgICsgdGhpcy5pbmRlbnQoMSkpXG4gICAgKyB0aGlzLm1hcFZpc2l0KG5vZGUua2V5ZnJhbWVzLCAnXFxuJylcbiAgICArIHRoaXMuZW1pdChcbiAgICAgICAgdGhpcy5pbmRlbnQoLTEpXG4gICAgICAgICsgJ30nKTtcbn07XG5cbi8qKlxuICogVmlzaXQga2V5ZnJhbWUgbm9kZS5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGUua2V5ZnJhbWUgPSBmdW5jdGlvbihub2RlKXtcbiAgdmFyIGRlY2xzID0gbm9kZS5kZWNsYXJhdGlvbnM7XG5cbiAgcmV0dXJuIHRoaXMuZW1pdCh0aGlzLmluZGVudCgpKVxuICAgICsgdGhpcy5lbWl0KG5vZGUudmFsdWVzLmpvaW4oJywgJyksIG5vZGUucG9zaXRpb24pXG4gICAgKyB0aGlzLmVtaXQoXG4gICAgICAnIHtcXG4nXG4gICAgICArIHRoaXMuaW5kZW50KDEpKVxuICAgICsgdGhpcy5tYXBWaXNpdChkZWNscywgJ1xcbicpXG4gICAgKyB0aGlzLmVtaXQoXG4gICAgICB0aGlzLmluZGVudCgtMSlcbiAgICAgICsgJ1xcbidcbiAgICAgICsgdGhpcy5pbmRlbnQoKSArICd9XFxuJyk7XG59O1xuXG4vKipcbiAqIFZpc2l0IHBhZ2Ugbm9kZS5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGUucGFnZSA9IGZ1bmN0aW9uKG5vZGUpe1xuICB2YXIgc2VsID0gbm9kZS5zZWxlY3RvcnMubGVuZ3RoXG4gICAgPyBub2RlLnNlbGVjdG9ycy5qb2luKCcsICcpICsgJyAnXG4gICAgOiAnJztcblxuICByZXR1cm4gdGhpcy5lbWl0KCdAcGFnZSAnICsgc2VsLCBub2RlLnBvc2l0aW9uKVxuICAgICsgdGhpcy5lbWl0KCd7XFxuJylcbiAgICArIHRoaXMuZW1pdCh0aGlzLmluZGVudCgxKSlcbiAgICArIHRoaXMubWFwVmlzaXQobm9kZS5kZWNsYXJhdGlvbnMsICdcXG4nKVxuICAgICsgdGhpcy5lbWl0KHRoaXMuaW5kZW50KC0xKSlcbiAgICArIHRoaXMuZW1pdCgnXFxufScpO1xufTtcblxuLyoqXG4gKiBWaXNpdCBmb250LWZhY2Ugbm9kZS5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGVbJ2ZvbnQtZmFjZSddID0gZnVuY3Rpb24obm9kZSl7XG4gIHJldHVybiB0aGlzLmVtaXQoJ0Bmb250LWZhY2UgJywgbm9kZS5wb3NpdGlvbilcbiAgICArIHRoaXMuZW1pdCgne1xcbicpXG4gICAgKyB0aGlzLmVtaXQodGhpcy5pbmRlbnQoMSkpXG4gICAgKyB0aGlzLm1hcFZpc2l0KG5vZGUuZGVjbGFyYXRpb25zLCAnXFxuJylcbiAgICArIHRoaXMuZW1pdCh0aGlzLmluZGVudCgtMSkpXG4gICAgKyB0aGlzLmVtaXQoJ1xcbn0nKTtcbn07XG5cbi8qKlxuICogVmlzaXQgaG9zdCBub2RlLlxuICovXG5cbkNvbXBpbGVyLnByb3RvdHlwZS5ob3N0ID0gZnVuY3Rpb24obm9kZSl7XG4gIHJldHVybiB0aGlzLmVtaXQoJ0Bob3N0Jywgbm9kZS5wb3NpdGlvbilcbiAgICArIHRoaXMuZW1pdChcbiAgICAgICAgJyB7XFxuJ1xuICAgICAgICArIHRoaXMuaW5kZW50KDEpKVxuICAgICsgdGhpcy5tYXBWaXNpdChub2RlLnJ1bGVzLCAnXFxuXFxuJylcbiAgICArIHRoaXMuZW1pdChcbiAgICAgICAgdGhpcy5pbmRlbnQoLTEpXG4gICAgICAgICsgJ1xcbn0nKTtcbn07XG5cbi8qKlxuICogVmlzaXQgY3VzdG9tLW1lZGlhIG5vZGUuXG4gKi9cblxuQ29tcGlsZXIucHJvdG90eXBlWydjdXN0b20tbWVkaWEnXSA9IGZ1bmN0aW9uKG5vZGUpe1xuICByZXR1cm4gdGhpcy5lbWl0KCdAY3VzdG9tLW1lZGlhICcgKyBub2RlLm5hbWUgKyAnICcgKyBub2RlLm1lZGlhICsgJzsnLCBub2RlLnBvc2l0aW9uKTtcbn07XG5cbi8qKlxuICogVmlzaXQgcnVsZSBub2RlLlxuICovXG5cbkNvbXBpbGVyLnByb3RvdHlwZS5ydWxlID0gZnVuY3Rpb24obm9kZSl7XG4gIHZhciBpbmRlbnQgPSB0aGlzLmluZGVudCgpO1xuICB2YXIgZGVjbHMgPSBub2RlLmRlY2xhcmF0aW9ucztcbiAgaWYgKCFkZWNscy5sZW5ndGgpIHJldHVybiAnJztcblxuICByZXR1cm4gdGhpcy5lbWl0KG5vZGUuc2VsZWN0b3JzLm1hcChmdW5jdGlvbihzKXsgcmV0dXJuIGluZGVudCArIHMgfSkuam9pbignLFxcbicpLCBub2RlLnBvc2l0aW9uKVxuICAgICsgdGhpcy5lbWl0KCcge1xcbicpXG4gICAgKyB0aGlzLmVtaXQodGhpcy5pbmRlbnQoMSkpXG4gICAgKyB0aGlzLm1hcFZpc2l0KGRlY2xzLCAnXFxuJylcbiAgICArIHRoaXMuZW1pdCh0aGlzLmluZGVudCgtMSkpXG4gICAgKyB0aGlzLmVtaXQoJ1xcbicgKyB0aGlzLmluZGVudCgpICsgJ30nKTtcbn07XG5cbi8qKlxuICogVmlzaXQgZGVjbGFyYXRpb24gbm9kZS5cbiAqL1xuXG5Db21waWxlci5wcm90b3R5cGUuZGVjbGFyYXRpb24gPSBmdW5jdGlvbihub2RlKXtcbiAgcmV0dXJuIHRoaXMuZW1pdCh0aGlzLmluZGVudCgpKVxuICAgICsgdGhpcy5lbWl0KG5vZGUucHJvcGVydHkgKyAnOiAnICsgbm9kZS52YWx1ZSwgbm9kZS5wb3NpdGlvbilcbiAgICArIHRoaXMuZW1pdCgnOycpO1xufTtcblxuLyoqXG4gKiBJbmNyZWFzZSwgZGVjcmVhc2Ugb3IgcmV0dXJuIGN1cnJlbnQgaW5kZW50YXRpb24uXG4gKi9cblxuQ29tcGlsZXIucHJvdG90eXBlLmluZGVudCA9IGZ1bmN0aW9uKGxldmVsKSB7XG4gIHRoaXMubGV2ZWwgPSB0aGlzLmxldmVsIHx8IDE7XG5cbiAgaWYgKG51bGwgIT0gbGV2ZWwpIHtcbiAgICB0aGlzLmxldmVsICs9IGxldmVsO1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBBcnJheSh0aGlzLmxldmVsKS5qb2luKHRoaXMuaW5kZW50YXRpb24gfHwgJyAgJyk7XG59O1xuIiwgIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGludFRvQ2hhck1hcCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJy5zcGxpdCgnJyk7XG5cbi8qKlxuICogRW5jb2RlIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIG9mIDAgdG8gNjMgdG8gYSBzaW5nbGUgYmFzZSA2NCBkaWdpdC5cbiAqL1xuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gIGlmICgwIDw9IG51bWJlciAmJiBudW1iZXIgPCBpbnRUb0NoYXJNYXAubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGludFRvQ2hhck1hcFtudW1iZXJdO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNdXN0IGJlIGJldHdlZW4gMCBhbmQgNjM6IFwiICsgbnVtYmVyKTtcbn07XG5cbi8qKlxuICogRGVjb2RlIGEgc2luZ2xlIGJhc2UgNjQgY2hhcmFjdGVyIGNvZGUgZGlnaXQgdG8gYW4gaW50ZWdlci4gUmV0dXJucyAtMSBvblxuICogZmFpbHVyZS5cbiAqL1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiAoY2hhckNvZGUpIHtcbiAgdmFyIGJpZ0EgPSA2NTsgICAgIC8vICdBJ1xuICB2YXIgYmlnWiA9IDkwOyAgICAgLy8gJ1onXG5cbiAgdmFyIGxpdHRsZUEgPSA5NzsgIC8vICdhJ1xuICB2YXIgbGl0dGxlWiA9IDEyMjsgLy8gJ3onXG5cbiAgdmFyIHplcm8gPSA0ODsgICAgIC8vICcwJ1xuICB2YXIgbmluZSA9IDU3OyAgICAgLy8gJzknXG5cbiAgdmFyIHBsdXMgPSA0MzsgICAgIC8vICcrJ1xuICB2YXIgc2xhc2ggPSA0NzsgICAgLy8gJy8nXG5cbiAgdmFyIGxpdHRsZU9mZnNldCA9IDI2O1xuICB2YXIgbnVtYmVyT2Zmc2V0ID0gNTI7XG5cbiAgLy8gMCAtIDI1OiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWlxuICBpZiAoYmlnQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBiaWdaKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIGJpZ0EpO1xuICB9XG5cbiAgLy8gMjYgLSA1MTogYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcbiAgaWYgKGxpdHRsZUEgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gbGl0dGxlWikge1xuICAgIHJldHVybiAoY2hhckNvZGUgLSBsaXR0bGVBICsgbGl0dGxlT2Zmc2V0KTtcbiAgfVxuXG4gIC8vIDUyIC0gNjE6IDAxMjM0NTY3ODlcbiAgaWYgKHplcm8gPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gbmluZSkge1xuICAgIHJldHVybiAoY2hhckNvZGUgLSB6ZXJvICsgbnVtYmVyT2Zmc2V0KTtcbiAgfVxuXG4gIC8vIDYyOiArXG4gIGlmIChjaGFyQ29kZSA9PSBwbHVzKSB7XG4gICAgcmV0dXJuIDYyO1xuICB9XG5cbiAgLy8gNjM6IC9cbiAgaWYgKGNoYXJDb2RlID09IHNsYXNoKSB7XG4gICAgcmV0dXJuIDYzO1xuICB9XG5cbiAgLy8gSW52YWxpZCBiYXNlNjQgZGlnaXQuXG4gIHJldHVybiAtMTtcbn07XG4iLCAiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqXG4gKiBCYXNlZCBvbiB0aGUgQmFzZSA2NCBWTFEgaW1wbGVtZW50YXRpb24gaW4gQ2xvc3VyZSBDb21waWxlcjpcbiAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2xvc3VyZS1jb21waWxlci9zb3VyY2UvYnJvd3NlL3RydW5rL3NyYy9jb20vZ29vZ2xlL2RlYnVnZ2luZy9zb3VyY2VtYXAvQmFzZTY0VkxRLmphdmFcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSBUaGUgQ2xvc3VyZSBDb21waWxlciBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmVcbiAqICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4gKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWRcbiAqICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsXG4gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnLi9iYXNlNjQnKTtcblxuLy8gQSBzaW5nbGUgYmFzZSA2NCBkaWdpdCBjYW4gY29udGFpbiA2IGJpdHMgb2YgZGF0YS4gRm9yIHRoZSBiYXNlIDY0IHZhcmlhYmxlXG4vLyBsZW5ndGggcXVhbnRpdGllcyB3ZSB1c2UgaW4gdGhlIHNvdXJjZSBtYXAgc3BlYywgdGhlIGZpcnN0IGJpdCBpcyB0aGUgc2lnbixcbi8vIHRoZSBuZXh0IGZvdXIgYml0cyBhcmUgdGhlIGFjdHVhbCB2YWx1ZSwgYW5kIHRoZSA2dGggYml0IGlzIHRoZVxuLy8gY29udGludWF0aW9uIGJpdC4gVGhlIGNvbnRpbnVhdGlvbiBiaXQgdGVsbHMgdXMgd2hldGhlciB0aGVyZSBhcmUgbW9yZVxuLy8gZGlnaXRzIGluIHRoaXMgdmFsdWUgZm9sbG93aW5nIHRoaXMgZGlnaXQuXG4vL1xuLy8gICBDb250aW51YXRpb25cbi8vICAgfCAgICBTaWduXG4vLyAgIHwgICAgfFxuLy8gICBWICAgIFZcbi8vICAgMTAxMDExXG5cbnZhciBWTFFfQkFTRV9TSElGVCA9IDU7XG5cbi8vIGJpbmFyeTogMTAwMDAwXG52YXIgVkxRX0JBU0UgPSAxIDw8IFZMUV9CQVNFX1NISUZUO1xuXG4vLyBiaW5hcnk6IDAxMTExMVxudmFyIFZMUV9CQVNFX01BU0sgPSBWTFFfQkFTRSAtIDE7XG5cbi8vIGJpbmFyeTogMTAwMDAwXG52YXIgVkxRX0NPTlRJTlVBVElPTl9CSVQgPSBWTFFfQkFTRTtcblxuLyoqXG4gKiBDb252ZXJ0cyBmcm9tIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgdG8gYSB2YWx1ZSB3aGVyZSB0aGUgc2lnbiBiaXQgaXNcbiAqIHBsYWNlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LiAgRm9yIGV4YW1wbGUsIGFzIGRlY2ltYWxzOlxuICogICAxIGJlY29tZXMgMiAoMTAgYmluYXJ5KSwgLTEgYmVjb21lcyAzICgxMSBiaW5hcnkpXG4gKiAgIDIgYmVjb21lcyA0ICgxMDAgYmluYXJ5KSwgLTIgYmVjb21lcyA1ICgxMDEgYmluYXJ5KVxuICovXG5mdW5jdGlvbiB0b1ZMUVNpZ25lZChhVmFsdWUpIHtcbiAgcmV0dXJuIGFWYWx1ZSA8IDBcbiAgICA/ICgoLWFWYWx1ZSkgPDwgMSkgKyAxXG4gICAgOiAoYVZhbHVlIDw8IDEpICsgMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0byBhIHR3by1jb21wbGVtZW50IHZhbHVlIGZyb20gYSB2YWx1ZSB3aGVyZSB0aGUgc2lnbiBiaXQgaXNcbiAqIHBsYWNlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LiAgRm9yIGV4YW1wbGUsIGFzIGRlY2ltYWxzOlxuICogICAyICgxMCBiaW5hcnkpIGJlY29tZXMgMSwgMyAoMTEgYmluYXJ5KSBiZWNvbWVzIC0xXG4gKiAgIDQgKDEwMCBiaW5hcnkpIGJlY29tZXMgMiwgNSAoMTAxIGJpbmFyeSkgYmVjb21lcyAtMlxuICovXG5mdW5jdGlvbiBmcm9tVkxRU2lnbmVkKGFWYWx1ZSkge1xuICB2YXIgaXNOZWdhdGl2ZSA9IChhVmFsdWUgJiAxKSA9PT0gMTtcbiAgdmFyIHNoaWZ0ZWQgPSBhVmFsdWUgPj4gMTtcbiAgcmV0dXJuIGlzTmVnYXRpdmVcbiAgICA/IC1zaGlmdGVkXG4gICAgOiBzaGlmdGVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGJhc2UgNjQgVkxRIGVuY29kZWQgdmFsdWUuXG4gKi9cbmV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2VuY29kZShhVmFsdWUpIHtcbiAgdmFyIGVuY29kZWQgPSBcIlwiO1xuICB2YXIgZGlnaXQ7XG5cbiAgdmFyIHZscSA9IHRvVkxRU2lnbmVkKGFWYWx1ZSk7XG5cbiAgZG8ge1xuICAgIGRpZ2l0ID0gdmxxICYgVkxRX0JBU0VfTUFTSztcbiAgICB2bHEgPj4+PSBWTFFfQkFTRV9TSElGVDtcbiAgICBpZiAodmxxID4gMCkge1xuICAgICAgLy8gVGhlcmUgYXJlIHN0aWxsIG1vcmUgZGlnaXRzIGluIHRoaXMgdmFsdWUsIHNvIHdlIG11c3QgbWFrZSBzdXJlIHRoZVxuICAgICAgLy8gY29udGludWF0aW9uIGJpdCBpcyBtYXJrZWQuXG4gICAgICBkaWdpdCB8PSBWTFFfQ09OVElOVUFUSU9OX0JJVDtcbiAgICB9XG4gICAgZW5jb2RlZCArPSBiYXNlNjQuZW5jb2RlKGRpZ2l0KTtcbiAgfSB3aGlsZSAodmxxID4gMCk7XG5cbiAgcmV0dXJuIGVuY29kZWQ7XG59O1xuXG4vKipcbiAqIERlY29kZXMgdGhlIG5leHQgYmFzZSA2NCBWTFEgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCByZXR1cm5zIHRoZVxuICogdmFsdWUgYW5kIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgdmlhIHRoZSBvdXQgcGFyYW1ldGVyLlxuICovXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIGJhc2U2NFZMUV9kZWNvZGUoYVN0ciwgYUluZGV4LCBhT3V0UGFyYW0pIHtcbiAgdmFyIHN0ckxlbiA9IGFTdHIubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gMDtcbiAgdmFyIHNoaWZ0ID0gMDtcbiAgdmFyIGNvbnRpbnVhdGlvbiwgZGlnaXQ7XG5cbiAgZG8ge1xuICAgIGlmIChhSW5kZXggPj0gc3RyTGVuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBtb3JlIGRpZ2l0cyBpbiBiYXNlIDY0IFZMUSB2YWx1ZS5cIik7XG4gICAgfVxuXG4gICAgZGlnaXQgPSBiYXNlNjQuZGVjb2RlKGFTdHIuY2hhckNvZGVBdChhSW5kZXgrKykpO1xuICAgIGlmIChkaWdpdCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYmFzZTY0IGRpZ2l0OiBcIiArIGFTdHIuY2hhckF0KGFJbmRleCAtIDEpKTtcbiAgICB9XG5cbiAgICBjb250aW51YXRpb24gPSAhIShkaWdpdCAmIFZMUV9DT05USU5VQVRJT05fQklUKTtcbiAgICBkaWdpdCAmPSBWTFFfQkFTRV9NQVNLO1xuICAgIHJlc3VsdCA9IHJlc3VsdCArIChkaWdpdCA8PCBzaGlmdCk7XG4gICAgc2hpZnQgKz0gVkxRX0JBU0VfU0hJRlQ7XG4gIH0gd2hpbGUgKGNvbnRpbnVhdGlvbik7XG5cbiAgYU91dFBhcmFtLnZhbHVlID0gZnJvbVZMUVNpZ25lZChyZXN1bHQpO1xuICBhT3V0UGFyYW0ucmVzdCA9IGFJbmRleDtcbn07XG4iLCAiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIGdldHRpbmcgdmFsdWVzIGZyb20gcGFyYW1ldGVyL29wdGlvbnNcbiAqIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIGFyZ3MgVGhlIG9iamVjdCB3ZSBhcmUgZXh0cmFjdGluZyB2YWx1ZXMgZnJvbVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdlIGFyZSBnZXR0aW5nLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBBbiBvcHRpb25hbCB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmdcbiAqIGZyb20gdGhlIG9iamVjdC4gSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkIGFuZCB0aGUgcHJvcGVydHkgaXMgbWlzc2luZywgYW5cbiAqIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICovXG5mdW5jdGlvbiBnZXRBcmcoYUFyZ3MsIGFOYW1lLCBhRGVmYXVsdFZhbHVlKSB7XG4gIGlmIChhTmFtZSBpbiBhQXJncykge1xuICAgIHJldHVybiBhQXJnc1thTmFtZV07XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIHJldHVybiBhRGVmYXVsdFZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignXCInICsgYU5hbWUgKyAnXCIgaXMgYSByZXF1aXJlZCBhcmd1bWVudC4nKTtcbiAgfVxufVxuZXhwb3J0cy5nZXRBcmcgPSBnZXRBcmc7XG5cbnZhciB1cmxSZWdleHAgPSAvXig/OihbXFx3K1xcLS5dKyk6KT9cXC9cXC8oPzooXFx3KzpcXHcrKUApPyhbXFx3Li1dKikoPzo6KFxcZCspKT8oLiopJC87XG52YXIgZGF0YVVybFJlZ2V4cCA9IC9eZGF0YTouK1xcLC4rJC87XG5cbmZ1bmN0aW9uIHVybFBhcnNlKGFVcmwpIHtcbiAgdmFyIG1hdGNoID0gYVVybC5tYXRjaCh1cmxSZWdleHApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzY2hlbWU6IG1hdGNoWzFdLFxuICAgIGF1dGg6IG1hdGNoWzJdLFxuICAgIGhvc3Q6IG1hdGNoWzNdLFxuICAgIHBvcnQ6IG1hdGNoWzRdLFxuICAgIHBhdGg6IG1hdGNoWzVdXG4gIH07XG59XG5leHBvcnRzLnVybFBhcnNlID0gdXJsUGFyc2U7XG5cbmZ1bmN0aW9uIHVybEdlbmVyYXRlKGFQYXJzZWRVcmwpIHtcbiAgdmFyIHVybCA9ICcnO1xuICBpZiAoYVBhcnNlZFVybC5zY2hlbWUpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5zY2hlbWUgKyAnOic7XG4gIH1cbiAgdXJsICs9ICcvLyc7XG4gIGlmIChhUGFyc2VkVXJsLmF1dGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5hdXRoICsgJ0AnO1xuICB9XG4gIGlmIChhUGFyc2VkVXJsLmhvc3QpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5ob3N0O1xuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBvcnQpIHtcbiAgICB1cmwgKz0gXCI6XCIgKyBhUGFyc2VkVXJsLnBvcnRcbiAgfVxuICBpZiAoYVBhcnNlZFVybC5wYXRoKSB7XG4gICAgdXJsICs9IGFQYXJzZWRVcmwucGF0aDtcbiAgfVxuICByZXR1cm4gdXJsO1xufVxuZXhwb3J0cy51cmxHZW5lcmF0ZSA9IHVybEdlbmVyYXRlO1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBwYXRoLCBvciB0aGUgcGF0aCBwb3J0aW9uIG9mIGEgVVJMOlxuICpcbiAqIC0gUmVwbGFjZXMgY29uc2VjdXRpdmUgc2xhc2hlcyB3aXRoIG9uZSBzbGFzaC5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnLicgcGFydHMuXG4gKiAtIFJlbW92ZXMgdW5uZWNlc3NhcnkgJzxkaXI+Ly4uJyBwYXJ0cy5cbiAqXG4gKiBCYXNlZCBvbiBjb2RlIGluIHRoZSBOb2RlLmpzICdwYXRoJyBjb3JlIG1vZHVsZS5cbiAqXG4gKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgdXJsIHRvIG5vcm1hbGl6ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplKGFQYXRoKSB7XG4gIHZhciBwYXRoID0gYVBhdGg7XG4gIHZhciB1cmwgPSB1cmxQYXJzZShhUGF0aCk7XG4gIGlmICh1cmwpIHtcbiAgICBpZiAoIXVybC5wYXRoKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuICAgIHBhdGggPSB1cmwucGF0aDtcbiAgfVxuICB2YXIgaXNBYnNvbHV0ZSA9IGV4cG9ydHMuaXNBYnNvbHV0ZShwYXRoKTtcblxuICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KC9cXC8rLyk7XG4gIGZvciAodmFyIHBhcnQsIHVwID0gMCwgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgcGFydCA9IHBhcnRzW2ldO1xuICAgIGlmIChwYXJ0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuLicpIHtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCA+IDApIHtcbiAgICAgIGlmIChwYXJ0ID09PSAnJykge1xuICAgICAgICAvLyBUaGUgZmlyc3QgcGFydCBpcyBibGFuayBpZiB0aGUgcGF0aCBpcyBhYnNvbHV0ZS4gVHJ5aW5nIHRvIGdvXG4gICAgICAgIC8vIGFib3ZlIHRoZSByb290IGlzIGEgbm8tb3AuIFRoZXJlZm9yZSB3ZSBjYW4gcmVtb3ZlIGFsbCAnLi4nIHBhcnRzXG4gICAgICAgIC8vIGRpcmVjdGx5IGFmdGVyIHRoZSByb290LlxuICAgICAgICBwYXJ0cy5zcGxpY2UoaSArIDEsIHVwKTtcbiAgICAgICAgdXAgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydHMuc3BsaWNlKGksIDIpO1xuICAgICAgICB1cC0tO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwYXRoID0gcGFydHMuam9pbignLycpO1xuXG4gIGlmIChwYXRoID09PSAnJykge1xuICAgIHBhdGggPSBpc0Fic29sdXRlID8gJy8nIDogJy4nO1xuICB9XG5cbiAgaWYgKHVybCkge1xuICAgIHVybC5wYXRoID0gcGF0aDtcbiAgICByZXR1cm4gdXJsR2VuZXJhdGUodXJsKTtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn1cbmV4cG9ydHMubm9ybWFsaXplID0gbm9ybWFsaXplO1xuXG4vKipcbiAqIEpvaW5zIHR3byBwYXRocy9VUkxzLlxuICpcbiAqIEBwYXJhbSBhUm9vdCBUaGUgcm9vdCBwYXRoIG9yIFVSTC5cbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciBVUkwgdG8gYmUgam9pbmVkIHdpdGggdGhlIHJvb3QuXG4gKlxuICogLSBJZiBhUGF0aCBpcyBhIFVSTCBvciBhIGRhdGEgVVJJLCBhUGF0aCBpcyByZXR1cm5lZCwgdW5sZXNzIGFQYXRoIGlzIGFcbiAqICAgc2NoZW1lLXJlbGF0aXZlIFVSTDogVGhlbiB0aGUgc2NoZW1lIG9mIGFSb290LCBpZiBhbnksIGlzIHByZXBlbmRlZFxuICogICBmaXJzdC5cbiAqIC0gT3RoZXJ3aXNlIGFQYXRoIGlzIGEgcGF0aC4gSWYgYVJvb3QgaXMgYSBVUkwsIHRoZW4gaXRzIHBhdGggcG9ydGlvblxuICogICBpcyB1cGRhdGVkIHdpdGggdGhlIHJlc3VsdCBhbmQgYVJvb3QgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgcmVzdWx0XG4gKiAgIGlzIHJldHVybmVkLlxuICogICAtIElmIGFQYXRoIGlzIGFic29sdXRlLCB0aGUgcmVzdWx0IGlzIGFQYXRoLlxuICogICAtIE90aGVyd2lzZSB0aGUgdHdvIHBhdGhzIGFyZSBqb2luZWQgd2l0aCBhIHNsYXNoLlxuICogLSBKb2luaW5nIGZvciBleGFtcGxlICdodHRwOi8vJyBhbmQgJ3d3dy5leGFtcGxlLmNvbScgaXMgYWxzbyBzdXBwb3J0ZWQuXG4gKi9cbmZ1bmN0aW9uIGpvaW4oYVJvb3QsIGFQYXRoKSB7XG4gIGlmIChhUm9vdCA9PT0gXCJcIikge1xuICAgIGFSb290ID0gXCIuXCI7XG4gIH1cbiAgaWYgKGFQYXRoID09PSBcIlwiKSB7XG4gICAgYVBhdGggPSBcIi5cIjtcbiAgfVxuICB2YXIgYVBhdGhVcmwgPSB1cmxQYXJzZShhUGF0aCk7XG4gIHZhciBhUm9vdFVybCA9IHVybFBhcnNlKGFSb290KTtcbiAgaWYgKGFSb290VXJsKSB7XG4gICAgYVJvb3QgPSBhUm9vdFVybC5wYXRoIHx8ICcvJztcbiAgfVxuXG4gIC8vIGBqb2luKGZvbywgJy8vd3d3LmV4YW1wbGUub3JnJylgXG4gIGlmIChhUGF0aFVybCAmJiAhYVBhdGhVcmwuc2NoZW1lKSB7XG4gICAgaWYgKGFSb290VXJsKSB7XG4gICAgICBhUGF0aFVybC5zY2hlbWUgPSBhUm9vdFVybC5zY2hlbWU7XG4gICAgfVxuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUGF0aFVybCk7XG4gIH1cblxuICBpZiAoYVBhdGhVcmwgfHwgYVBhdGgubWF0Y2goZGF0YVVybFJlZ2V4cCkpIHtcbiAgICByZXR1cm4gYVBhdGg7XG4gIH1cblxuICAvLyBgam9pbignaHR0cDovLycsICd3d3cuZXhhbXBsZS5jb20nKWBcbiAgaWYgKGFSb290VXJsICYmICFhUm9vdFVybC5ob3N0ICYmICFhUm9vdFVybC5wYXRoKSB7XG4gICAgYVJvb3RVcmwuaG9zdCA9IGFQYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cblxuICB2YXIgam9pbmVkID0gYVBhdGguY2hhckF0KDApID09PSAnLydcbiAgICA/IGFQYXRoXG4gICAgOiBub3JtYWxpemUoYVJvb3QucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnLycgKyBhUGF0aCk7XG5cbiAgaWYgKGFSb290VXJsKSB7XG4gICAgYVJvb3RVcmwucGF0aCA9IGpvaW5lZDtcbiAgICByZXR1cm4gdXJsR2VuZXJhdGUoYVJvb3RVcmwpO1xuICB9XG4gIHJldHVybiBqb2luZWQ7XG59XG5leHBvcnRzLmpvaW4gPSBqb2luO1xuXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbiAoYVBhdGgpIHtcbiAgcmV0dXJuIGFQYXRoLmNoYXJBdCgwKSA9PT0gJy8nIHx8IHVybFJlZ2V4cC50ZXN0KGFQYXRoKTtcbn07XG5cbi8qKlxuICogTWFrZSBhIHBhdGggcmVsYXRpdmUgdG8gYSBVUkwgb3IgYW5vdGhlciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhUm9vdCBUaGUgcm9vdCBwYXRoIG9yIFVSTC5cbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciBVUkwgdG8gYmUgbWFkZSByZWxhdGl2ZSB0byBhUm9vdC5cbiAqL1xuZnVuY3Rpb24gcmVsYXRpdmUoYVJvb3QsIGFQYXRoKSB7XG4gIGlmIChhUm9vdCA9PT0gXCJcIikge1xuICAgIGFSb290ID0gXCIuXCI7XG4gIH1cblxuICBhUm9vdCA9IGFSb290LnJlcGxhY2UoL1xcLyQvLCAnJyk7XG5cbiAgLy8gSXQgaXMgcG9zc2libGUgZm9yIHRoZSBwYXRoIHRvIGJlIGFib3ZlIHRoZSByb290LiBJbiB0aGlzIGNhc2UsIHNpbXBseVxuICAvLyBjaGVja2luZyB3aGV0aGVyIHRoZSByb290IGlzIGEgcHJlZml4IG9mIHRoZSBwYXRoIHdvbid0IHdvcmsuIEluc3RlYWQsIHdlXG4gIC8vIG5lZWQgdG8gcmVtb3ZlIGNvbXBvbmVudHMgZnJvbSB0aGUgcm9vdCBvbmUgYnkgb25lLCB1bnRpbCBlaXRoZXIgd2UgZmluZFxuICAvLyBhIHByZWZpeCB0aGF0IGZpdHMsIG9yIHdlIHJ1biBvdXQgb2YgY29tcG9uZW50cyB0byByZW1vdmUuXG4gIHZhciBsZXZlbCA9IDA7XG4gIHdoaWxlIChhUGF0aC5pbmRleE9mKGFSb290ICsgJy8nKSAhPT0gMCkge1xuICAgIHZhciBpbmRleCA9IGFSb290Lmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG9ubHkgcGFydCBvZiB0aGUgcm9vdCB0aGF0IGlzIGxlZnQgaXMgdGhlIHNjaGVtZSAoaS5lLiBodHRwOi8vLFxuICAgIC8vIGZpbGU6Ly8vLCBldGMuKSwgb25lIG9yIG1vcmUgc2xhc2hlcyAoLyksIG9yIHNpbXBseSBub3RoaW5nIGF0IGFsbCwgd2VcbiAgICAvLyBoYXZlIGV4aGF1c3RlZCBhbGwgY29tcG9uZW50cywgc28gdGhlIHBhdGggaXMgbm90IHJlbGF0aXZlIHRvIHRoZSByb290LlxuICAgIGFSb290ID0gYVJvb3Quc2xpY2UoMCwgaW5kZXgpO1xuICAgIGlmIChhUm9vdC5tYXRjaCgvXihbXlxcL10rOlxcLyk/XFwvKiQvKSkge1xuICAgICAgcmV0dXJuIGFQYXRoO1xuICAgIH1cblxuICAgICsrbGV2ZWw7XG4gIH1cblxuICAvLyBNYWtlIHN1cmUgd2UgYWRkIGEgXCIuLi9cIiBmb3IgZWFjaCBjb21wb25lbnQgd2UgcmVtb3ZlZCBmcm9tIHRoZSByb290LlxuICByZXR1cm4gQXJyYXkobGV2ZWwgKyAxKS5qb2luKFwiLi4vXCIpICsgYVBhdGguc3Vic3RyKGFSb290Lmxlbmd0aCArIDEpO1xufVxuZXhwb3J0cy5yZWxhdGl2ZSA9IHJlbGF0aXZlO1xuXG52YXIgc3VwcG9ydHNOdWxsUHJvdG8gPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcmV0dXJuICEoJ19fcHJvdG9fXycgaW4gb2JqKTtcbn0oKSk7XG5cbmZ1bmN0aW9uIGlkZW50aXR5IChzKSB7XG4gIHJldHVybiBzO1xufVxuXG4vKipcbiAqIEJlY2F1c2UgYmVoYXZpb3IgZ29lcyB3YWNreSB3aGVuIHlvdSBzZXQgYF9fcHJvdG9fX2Agb24gb2JqZWN0cywgd2VcbiAqIGhhdmUgdG8gcHJlZml4IGFsbCB0aGUgc3RyaW5ncyBpbiBvdXIgc2V0IHdpdGggYW4gYXJiaXRyYXJ5IGNoYXJhY3Rlci5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9wdWxsLzMxIGFuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9pc3N1ZXMvMzBcbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuZnVuY3Rpb24gdG9TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiAnJCcgKyBhU3RyO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLnRvU2V0U3RyaW5nID0gc3VwcG9ydHNOdWxsUHJvdG8gPyBpZGVudGl0eSA6IHRvU2V0U3RyaW5nO1xuXG5mdW5jdGlvbiBmcm9tU2V0U3RyaW5nKGFTdHIpIHtcbiAgaWYgKGlzUHJvdG9TdHJpbmcoYVN0cikpIHtcbiAgICByZXR1cm4gYVN0ci5zbGljZSgxKTtcbiAgfVxuXG4gIHJldHVybiBhU3RyO1xufVxuZXhwb3J0cy5mcm9tU2V0U3RyaW5nID0gc3VwcG9ydHNOdWxsUHJvdG8gPyBpZGVudGl0eSA6IGZyb21TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzUHJvdG9TdHJpbmcocykge1xuICBpZiAoIXMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgbGVuZ3RoID0gcy5sZW5ndGg7XG5cbiAgaWYgKGxlbmd0aCA8IDkgLyogXCJfX3Byb3RvX19cIi5sZW5ndGggKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocy5jaGFyQ29kZUF0KGxlbmd0aCAtIDEpICE9PSA5NSAgLyogJ18nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMikgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAzKSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDQpICE9PSAxMTYgLyogJ3QnICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNSkgIT09IDExMSAvKiAnbycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA2KSAhPT0gMTE0IC8qICdyJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDcpICE9PSAxMTIgLyogJ3AnICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gOCkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA5KSAhPT0gOTUgIC8qICdfJyAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSBsZW5ndGggLSAxMDsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAocy5jaGFyQ29kZUF0KGkpICE9PSAzNiAvKiAnJCcgKi8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDb21wYXJhdG9yIGJldHdlZW4gdHdvIG1hcHBpbmdzIHdoZXJlIHRoZSBvcmlnaW5hbCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICpcbiAqIE9wdGlvbmFsbHkgcGFzcyBpbiBgdHJ1ZWAgYXMgYG9ubHlDb21wYXJlR2VuZXJhdGVkYCB0byBjb25zaWRlciB0d29cbiAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgb3JpZ2luYWwgc291cmNlL2xpbmUvY29sdW1uLCBidXQgZGlmZmVyZW50IGdlbmVyYXRlZFxuICogbGluZSBhbmQgY29sdW1uIHRoZSBzYW1lLiBVc2VmdWwgd2hlbiBzZWFyY2hpbmcgZm9yIGEgbWFwcGluZyB3aXRoIGFcbiAqIHN0dWJiZWQgb3V0IG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVPcmlnaW5hbCkge1xuICB2YXIgY21wID0gc3RyY21wKG1hcHBpbmdBLnNvdXJjZSwgbWFwcGluZ0Iuc291cmNlKTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lIC0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICByZXR1cm4gc3RyY21wKG1hcHBpbmdBLm5hbWUsIG1hcHBpbmdCLm5hbWUpO1xufVxuZXhwb3J0cy5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyA9IGNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zO1xuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2l0aCBkZWZsYXRlZCBzb3VyY2UgYW5kIG5hbWUgaW5kaWNlcyB3aGVyZVxuICogdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICpcbiAqIE9wdGlvbmFsbHkgcGFzcyBpbiBgdHJ1ZWAgYXMgYG9ubHlDb21wYXJlR2VuZXJhdGVkYCB0byBjb25zaWRlciB0d29cbiAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiwgYnV0IGRpZmZlcmVudFxuICogc291cmNlL25hbWUvb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHRoZSBzYW1lLiBVc2VmdWwgd2hlbiBzZWFyY2hpbmcgZm9yIGFcbiAqIG1hcHBpbmcgd2l0aCBhIHN0dWJiZWQgb3V0IG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVHZW5lcmF0ZWQpIHtcbiAgdmFyIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkID0gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQ7XG5cbmZ1bmN0aW9uIHN0cmNtcChhU3RyMSwgYVN0cjIpIHtcbiAgaWYgKGFTdHIxID09PSBhU3RyMikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYgKGFTdHIxID09PSBudWxsKSB7XG4gICAgcmV0dXJuIDE7IC8vIGFTdHIyICE9PSBudWxsXG4gIH1cblxuICBpZiAoYVN0cjIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gLTE7IC8vIGFTdHIxICE9PSBudWxsXG4gIH1cblxuICBpZiAoYVN0cjEgPiBhU3RyMikge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2l0aCBpbmZsYXRlZCBzb3VyY2UgYW5kIG5hbWUgc3RyaW5ncyB3aGVyZVxuICogdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIHtcbiAgdmFyIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkID0gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQ7XG5cbi8qKlxuICogU3RyaXAgYW55IEpTT04gWFNTSSBhdm9pZGFuY2UgcHJlZml4IGZyb20gdGhlIHN0cmluZyAoYXMgZG9jdW1lbnRlZFxuICogaW4gdGhlIHNvdXJjZSBtYXBzIHNwZWNpZmljYXRpb24pLCBhbmQgdGhlbiBwYXJzZSB0aGUgc3RyaW5nIGFzXG4gKiBKU09OLlxuICovXG5mdW5jdGlvbiBwYXJzZVNvdXJjZU1hcElucHV0KHN0cikge1xuICByZXR1cm4gSlNPTi5wYXJzZShzdHIucmVwbGFjZSgvXlxcKV19J1teXFxuXSpcXG4vLCAnJykpO1xufVxuZXhwb3J0cy5wYXJzZVNvdXJjZU1hcElucHV0ID0gcGFyc2VTb3VyY2VNYXBJbnB1dDtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBVUkwgb2YgYSBzb3VyY2UgZ2l2ZW4gdGhlIHRoZSBzb3VyY2Ugcm9vdCwgdGhlIHNvdXJjZSdzXG4gKiBVUkwsIGFuZCB0aGUgc291cmNlIG1hcCdzIFVSTC5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVNvdXJjZVVSTChzb3VyY2VSb290LCBzb3VyY2VVUkwsIHNvdXJjZU1hcFVSTCkge1xuICBzb3VyY2VVUkwgPSBzb3VyY2VVUkwgfHwgJyc7XG5cbiAgaWYgKHNvdXJjZVJvb3QpIHtcbiAgICAvLyBUaGlzIGZvbGxvd3Mgd2hhdCBDaHJvbWUgZG9lcy5cbiAgICBpZiAoc291cmNlUm9vdFtzb3VyY2VSb290Lmxlbmd0aCAtIDFdICE9PSAnLycgJiYgc291cmNlVVJMWzBdICE9PSAnLycpIHtcbiAgICAgIHNvdXJjZVJvb3QgKz0gJy8nO1xuICAgIH1cbiAgICAvLyBUaGUgc3BlYyBzYXlzOlxuICAgIC8vICAgTGluZSA0OiBBbiBvcHRpb25hbCBzb3VyY2Ugcm9vdCwgdXNlZnVsIGZvciByZWxvY2F0aW5nIHNvdXJjZVxuICAgIC8vICAgZmlsZXMgb24gYSBzZXJ2ZXIgb3IgcmVtb3ZpbmcgcmVwZWF0ZWQgdmFsdWVzIGluIHRoZVxuICAgIC8vICAgXHUyMDFDc291cmNlc1x1MjAxRCBlbnRyeS4gIFRoaXMgdmFsdWUgaXMgcHJlcGVuZGVkIHRvIHRoZSBpbmRpdmlkdWFsXG4gICAgLy8gICBlbnRyaWVzIGluIHRoZSBcdTIwMUNzb3VyY2VcdTIwMUQgZmllbGQuXG4gICAgc291cmNlVVJMID0gc291cmNlUm9vdCArIHNvdXJjZVVSTDtcbiAgfVxuXG4gIC8vIEhpc3RvcmljYWxseSwgU291cmNlTWFwQ29uc3VtZXIgZGlkIG5vdCB0YWtlIHRoZSBzb3VyY2VNYXBVUkwgYXNcbiAgLy8gYSBwYXJhbWV0ZXIuICBUaGlzIG1vZGUgaXMgc3RpbGwgc29tZXdoYXQgc3VwcG9ydGVkLCB3aGljaCBpcyB3aHlcbiAgLy8gdGhpcyBjb2RlIGJsb2NrIGlzIGNvbmRpdGlvbmFsLiAgSG93ZXZlciwgaXQncyBwcmVmZXJhYmxlIHRvIHBhc3NcbiAgLy8gdGhlIHNvdXJjZSBtYXAgVVJMIHRvIFNvdXJjZU1hcENvbnN1bWVyLCBzbyB0aGF0IHRoaXMgZnVuY3Rpb25cbiAgLy8gY2FuIGltcGxlbWVudCB0aGUgc291cmNlIFVSTCByZXNvbHV0aW9uIGFsZ29yaXRobSBhcyBvdXRsaW5lZCBpblxuICAvLyB0aGUgc3BlYy4gIFRoaXMgYmxvY2sgaXMgYmFzaWNhbGx5IHRoZSBlcXVpdmFsZW50IG9mOlxuICAvLyAgICBuZXcgVVJMKHNvdXJjZVVSTCwgc291cmNlTWFwVVJMKS50b1N0cmluZygpXG4gIC8vIC4uLiBleGNlcHQgaXQgYXZvaWRzIHVzaW5nIFVSTCwgd2hpY2ggd2Fzbid0IGF2YWlsYWJsZSBpbiB0aGVcbiAgLy8gb2xkZXIgcmVsZWFzZXMgb2Ygbm9kZSBzdGlsbCBzdXBwb3J0ZWQgYnkgdGhpcyBsaWJyYXJ5LlxuICAvL1xuICAvLyBUaGUgc3BlYyBzYXlzOlxuICAvLyAgIElmIHRoZSBzb3VyY2VzIGFyZSBub3QgYWJzb2x1dGUgVVJMcyBhZnRlciBwcmVwZW5kaW5nIG9mIHRoZVxuICAvLyAgIFx1MjAxQ3NvdXJjZVJvb3RcdTIwMUQsIHRoZSBzb3VyY2VzIGFyZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGVcbiAgLy8gICBTb3VyY2VNYXAgKGxpa2UgcmVzb2x2aW5nIHNjcmlwdCBzcmMgaW4gYSBodG1sIGRvY3VtZW50KS5cbiAgaWYgKHNvdXJjZU1hcFVSTCkge1xuICAgIHZhciBwYXJzZWQgPSB1cmxQYXJzZShzb3VyY2VNYXBVUkwpO1xuICAgIGlmICghcGFyc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzb3VyY2VNYXBVUkwgY291bGQgbm90IGJlIHBhcnNlZFwiKTtcbiAgICB9XG4gICAgaWYgKHBhcnNlZC5wYXRoKSB7XG4gICAgICAvLyBTdHJpcCB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudCwgYnV0IGtlZXAgdGhlIFwiL1wiLlxuICAgICAgdmFyIGluZGV4ID0gcGFyc2VkLnBhdGgubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHBhcnNlZC5wYXRoID0gcGFyc2VkLnBhdGguc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNvdXJjZVVSTCA9IGpvaW4odXJsR2VuZXJhdGUocGFyc2VkKSwgc291cmNlVVJMKTtcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemUoc291cmNlVVJMKTtcbn1cbmV4cG9ydHMuY29tcHV0ZVNvdXJjZVVSTCA9IGNvbXB1dGVTb3VyY2VVUkw7XG4iLCAiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaGFzTmF0aXZlTWFwID0gdHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICovXG5mdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc2V0ID0gaGFzTmF0aXZlTWFwID8gbmV3IE1hcCgpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAqL1xuQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gIH1cbiAgcmV0dXJuIHNldDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAqIGFkZGVkLCB0aGFuIHRob3NlIGRvIG5vdCBjb3VudCB0b3dhcmRzIHRoZSBzaXplLlxuICpcbiAqIEByZXR1cm5zIE51bWJlclxuICovXG5BcnJheVNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIEFycmF5U2V0X3NpemUoKSB7XG4gIHJldHVybiBoYXNOYXRpdmVNYXAgPyB0aGlzLl9zZXQuc2l6ZSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX3NldCkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzU3RyID0gaGFzTmF0aXZlTWFwID8gYVN0ciA6IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gIHZhciBpc0R1cGxpY2F0ZSA9IGhhc05hdGl2ZU1hcCA/IHRoaXMuaGFzKGFTdHIpIDogaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgfVxuICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgICAgdGhpcy5fc2V0LnNldChhU3RyLCBpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRbc1N0cl0gPSBpZHg7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoYVN0cik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX3NldC5nZXQoYVN0cik7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICpcbiAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbn07XG5cbmV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcbiIsICIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICogcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIC8vIE9wdGltaXplZCBmb3IgbW9zdCBjb21tb24gY2FzZVxuICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjtcbiAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIDw9IDA7XG59XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB0byBwcm92aWRlIGEgc29ydGVkIHZpZXcgb2YgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gYVxuICogcGVyZm9ybWFuY2UgY29uc2Npb3VzIG1hbm5lci4gSXQgdHJhZGVzIGEgbmVnbGliYWJsZSBvdmVyaGVhZCBpbiBnZW5lcmFsXG4gKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gTWFwcGluZ0xpc3QoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIC8vIFNlcnZlcyBhcyBpbmZpbXVtXG4gIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG59XG5cbi8qKlxuICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICogYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCB0YWtlcy5cbiAqXG4gKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudW5zb3J0ZWRGb3JFYWNoID1cbiAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgdGhpcy5fYXJyYXkuZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKTtcbiAgfTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHNvdXJjZSBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2FkZChhTWFwcGluZykge1xuICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICB0aGlzLl9sYXN0ID0gYU1hcHBpbmc7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICogZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICogcGVyZm9ybWFuY2UuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBOT1QgYmUgbXV0YXRlZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93blxuICogY29weS5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF90b0FycmF5KCkge1xuICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgIHRoaXMuX2FycmF5LnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCk7XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyYXk7XG59O1xuXG5leHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG4iLCAiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgYmFzZTY0VkxRID0gcmVxdWlyZSgnLi9iYXNlNjQtdmxxJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBNYXBwaW5nTGlzdCA9IHJlcXVpcmUoJy4vbWFwcGluZy1saXN0JykuTWFwcGluZ0xpc3Q7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhlIFNvdXJjZU1hcEdlbmVyYXRvciByZXByZXNlbnRzIGEgc291cmNlIG1hcCB3aGljaCBpc1xuICogYmVpbmcgYnVpbHQgaW5jcmVtZW50YWxseS4gWW91IG1heSBwYXNzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAqICAgLSBzb3VyY2VSb290OiBBIHJvb3QgZm9yIGFsbCByZWxhdGl2ZSBVUkxzIGluIHRoaXMgc291cmNlIG1hcC5cbiAqL1xuZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKSB7XG4gIGlmICghYUFyZ3MpIHtcbiAgICBhQXJncyA9IHt9O1xuICB9XG4gIHRoaXMuX2ZpbGUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2ZpbGUnLCBudWxsKTtcbiAgdGhpcy5fc291cmNlUm9vdCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICB0aGlzLl9za2lwVmFsaWRhdGlvbiA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc2tpcFZhbGlkYXRpb24nLCBmYWxzZSk7XG4gIHRoaXMuX3NvdXJjZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgdGhpcy5fbmFtZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgdGhpcy5fbWFwcGluZ3MgPSBuZXcgTWFwcGluZ0xpc3QoKTtcbiAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gbnVsbDtcbn1cblxuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBTb3VyY2VNYXBHZW5lcmF0b3IgYmFzZWQgb24gYSBTb3VyY2VNYXBDb25zdW1lclxuICpcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIpIHtcbiAgICB2YXIgc291cmNlUm9vdCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VSb290O1xuICAgIHZhciBnZW5lcmF0b3IgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKHtcbiAgICAgIGZpbGU6IGFTb3VyY2VNYXBDb25zdW1lci5maWxlLFxuICAgICAgc291cmNlUm9vdDogc291cmNlUm9vdFxuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5lYWNoTWFwcGluZyhmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIG5ld01hcHBpbmcgPSB7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSxcbiAgICAgICAgICBjb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgIG5ld01hcHBpbmcuc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbmV3TWFwcGluZy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3TWFwcGluZy5vcmlnaW5hbCA9IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW5cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdNYXBwaW5nLm5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZ2VuZXJhdG9yLmFkZE1hcHBpbmcobmV3TWFwcGluZyk7XG4gICAgfSk7XG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRmlsZSkge1xuICAgICAgdmFyIHNvdXJjZVJlbGF0aXZlID0gc291cmNlRmlsZTtcbiAgICAgIGlmIChzb3VyY2VSb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNvdXJjZVJlbGF0aXZlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFnZW5lcmF0b3IuX3NvdXJjZXMuaGFzKHNvdXJjZVJlbGF0aXZlKSkge1xuICAgICAgICBnZW5lcmF0b3IuX3NvdXJjZXMuYWRkKHNvdXJjZVJlbGF0aXZlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgZ2VuZXJhdG9yLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfTtcblxuLyoqXG4gKiBBZGQgYSBzaW5nbGUgbWFwcGluZyBmcm9tIG9yaWdpbmFsIHNvdXJjZSBsaW5lIGFuZCBjb2x1bW4gdG8gdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIGZvciB0aGlzIHNvdXJjZSBtYXAgYmVpbmcgY3JlYXRlZC4gVGhlIG1hcHBpbmdcbiAqIG9iamVjdCBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGdlbmVyYXRlZDogQW4gb2JqZWN0IHdpdGggdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zLlxuICogICAtIG9yaWdpbmFsOiBBbiBvYmplY3Qgd2l0aCB0aGUgb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSAocmVsYXRpdmUgdG8gdGhlIHNvdXJjZVJvb3QpLlxuICogICAtIG5hbWU6IEFuIG9wdGlvbmFsIG9yaWdpbmFsIHRva2VuIG5hbWUgZm9yIHRoaXMgbWFwcGluZy5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hZGRNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2FkZE1hcHBpbmcoYUFyZ3MpIHtcbiAgICB2YXIgZ2VuZXJhdGVkID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdnZW5lcmF0ZWQnKTtcbiAgICB2YXIgb3JpZ2luYWwgPSB1dGlsLmdldEFyZyhhQXJncywgJ29yaWdpbmFsJywgbnVsbCk7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJywgbnVsbCk7XG4gICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhhQXJncywgJ25hbWUnLCBudWxsKTtcblxuICAgIGlmICghdGhpcy5fc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRlTWFwcGluZyhnZW5lcmF0ZWQsIG9yaWdpbmFsLCBzb3VyY2UsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgc291cmNlID0gU3RyaW5nKHNvdXJjZSk7XG4gICAgICBpZiAoIXRoaXMuX3NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgdGhpcy5fc291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICBuYW1lID0gU3RyaW5nKG5hbWUpO1xuICAgICAgaWYgKCF0aGlzLl9uYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgdGhpcy5fbmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX21hcHBpbmdzLmFkZCh7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogZ2VuZXJhdGVkLmNvbHVtbixcbiAgICAgIG9yaWdpbmFsTGluZTogb3JpZ2luYWwgIT0gbnVsbCAmJiBvcmlnaW5hbC5saW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwuY29sdW1uLFxuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBuYW1lOiBuYW1lXG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3NldFNvdXJjZUNvbnRlbnQoYVNvdXJjZUZpbGUsIGFTb3VyY2VDb250ZW50KSB7XG4gICAgdmFyIHNvdXJjZSA9IGFTb3VyY2VGaWxlO1xuICAgIGlmICh0aGlzLl9zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5fc291cmNlUm9vdCwgc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoYVNvdXJjZUNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgLy8gQWRkIHRoZSBzb3VyY2UgY29udGVudCB0byB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgX3NvdXJjZXNDb250ZW50cyBtYXAgaWYgdGhlIHByb3BlcnR5IGlzIG51bGwuXG4gICAgICBpZiAoIXRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoc291cmNlKV0gPSBhU291cmNlQ29udGVudDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBzb3VyY2UgZmlsZSBmcm9tIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcC5cbiAgICAgIC8vIElmIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcCBpcyBlbXB0eSwgc2V0IHRoZSBwcm9wZXJ0eSB0byBudWxsLlxuICAgICAgZGVsZXRlIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3NvdXJjZXNDb250ZW50cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIG1hcHBpbmdzIG9mIGEgc3ViLXNvdXJjZS1tYXAgZm9yIGEgc3BlY2lmaWMgc291cmNlIGZpbGUgdG8gdGhlXG4gKiBzb3VyY2UgbWFwIGJlaW5nIGdlbmVyYXRlZC4gRWFjaCBtYXBwaW5nIHRvIHRoZSBzdXBwbGllZCBzb3VyY2UgZmlsZSBpc1xuICogcmV3cml0dGVuIHVzaW5nIHRoZSBzdXBwbGllZCBzb3VyY2UgbWFwLiBOb3RlOiBUaGUgcmVzb2x1dGlvbiBmb3IgdGhlXG4gKiByZXN1bHRpbmcgbWFwcGluZ3MgaXMgdGhlIG1pbmltaXVtIG9mIHRoaXMgbWFwIGFuZCB0aGUgc3VwcGxpZWQgbWFwLlxuICpcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBhU291cmNlRmlsZSBPcHRpb25hbC4gVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZS5cbiAqICAgICAgICBJZiBvbWl0dGVkLCBTb3VyY2VNYXBDb25zdW1lcidzIGZpbGUgcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICogQHBhcmFtIGFTb3VyY2VNYXBQYXRoIE9wdGlvbmFsLiBUaGUgZGlybmFtZSBvZiB0aGUgcGF0aCB0byB0aGUgc291cmNlIG1hcFxuICogICAgICAgIHRvIGJlIGFwcGxpZWQuIElmIHJlbGF0aXZlLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgU291cmNlTWFwQ29uc3VtZXIuXG4gKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgbmVlZGVkIHdoZW4gdGhlIHR3byBzb3VyY2UgbWFwcyBhcmVuJ3QgaW4gdGhlIHNhbWVcbiAqICAgICAgICBkaXJlY3RvcnksIGFuZCB0aGUgc291cmNlIG1hcCB0byBiZSBhcHBsaWVkIGNvbnRhaW5zIHJlbGF0aXZlIHNvdXJjZVxuICogICAgICAgIHBhdGhzLiBJZiBzbywgdGhvc2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIG5lZWQgdG8gYmUgcmV3cml0dGVuXG4gKiAgICAgICAgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcEdlbmVyYXRvci5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hcHBseVNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hcHBseVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIsIGFTb3VyY2VGaWxlLCBhU291cmNlTWFwUGF0aCkge1xuICAgIHZhciBzb3VyY2VGaWxlID0gYVNvdXJjZUZpbGU7XG4gICAgLy8gSWYgYVNvdXJjZUZpbGUgaXMgb21pdHRlZCwgd2Ugd2lsbCB1c2UgdGhlIGZpbGUgcHJvcGVydHkgb2YgdGhlIFNvdXJjZU1hcFxuICAgIGlmIChhU291cmNlRmlsZSA9PSBudWxsKSB7XG4gICAgICBpZiAoYVNvdXJjZU1hcENvbnN1bWVyLmZpbGUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1NvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgcmVxdWlyZXMgZWl0aGVyIGFuIGV4cGxpY2l0IHNvdXJjZSBmaWxlLCAnICtcbiAgICAgICAgICAnb3IgdGhlIHNvdXJjZSBtYXBcXCdzIFwiZmlsZVwiIHByb3BlcnR5LiBCb3RoIHdlcmUgb21pdHRlZC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzb3VyY2VGaWxlID0gYVNvdXJjZU1hcENvbnN1bWVyLmZpbGU7XG4gICAgfVxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5fc291cmNlUm9vdDtcbiAgICAvLyBNYWtlIFwic291cmNlRmlsZVwiIHJlbGF0aXZlIGlmIGFuIGFic29sdXRlIFVybCBpcyBwYXNzZWQuXG4gICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgc291cmNlRmlsZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgfVxuICAgIC8vIEFwcGx5aW5nIHRoZSBTb3VyY2VNYXAgY2FuIGFkZCBhbmQgcmVtb3ZlIGl0ZW1zIGZyb20gdGhlIHNvdXJjZXMgYW5kXG4gICAgLy8gdGhlIG5hbWVzIGFycmF5LlxuICAgIHZhciBuZXdTb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gICAgdmFyIG5ld05hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgICAvLyBGaW5kIG1hcHBpbmdzIGZvciB0aGUgXCJzb3VyY2VGaWxlXCJcbiAgICB0aGlzLl9tYXBwaW5ncy51bnNvcnRlZEZvckVhY2goZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gc291cmNlRmlsZSAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGl0IGNhbiBiZSBtYXBwZWQgYnkgdGhlIHNvdXJjZSBtYXAsIHRoZW4gdXBkYXRlIHRoZSBtYXBwaW5nLlxuICAgICAgICB2YXIgb3JpZ2luYWwgPSBhU291cmNlTWFwQ29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3JpZ2luYWwuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBDb3B5IG1hcHBpbmdcbiAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IG9yaWdpbmFsLnNvdXJjZTtcbiAgICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIG1hcHBpbmcuc291cmNlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbWFwcGluZy5zb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9IG9yaWdpbmFsLmxpbmU7XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgICAgICBpZiAob3JpZ2luYWwubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXBwaW5nLm5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgIW5ld1NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgbmV3U291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICBpZiAobmFtZSAhPSBudWxsICYmICFuZXdOYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgbmV3TmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuXG4gICAgfSwgdGhpcyk7XG4gICAgdGhpcy5fc291cmNlcyA9IG5ld1NvdXJjZXM7XG4gICAgdGhpcy5fbmFtZXMgPSBuZXdOYW1lcztcblxuICAgIC8vIENvcHkgc291cmNlc0NvbnRlbnRzIG9mIGFwcGxpZWQgbWFwLlxuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChhU291cmNlTWFwUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhU291cmNlTWFwUGF0aCwgc291cmNlRmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBBIG1hcHBpbmcgY2FuIGhhdmUgb25lIG9mIHRoZSB0aHJlZSBsZXZlbHMgb2YgZGF0YTpcbiAqXG4gKiAgIDEuIEp1c3QgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi5cbiAqICAgMi4gVGhlIEdlbmVyYXRlZCBwb3NpdGlvbiwgb3JpZ2luYWwgcG9zaXRpb24sIGFuZCBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIDMuIEdlbmVyYXRlZCBhbmQgb3JpZ2luYWwgcG9zaXRpb24sIG9yaWdpbmFsIHNvdXJjZSwgYXMgd2VsbCBhcyBhIG5hbWVcbiAqICAgICAgdG9rZW4uXG4gKlxuICogVG8gbWFpbnRhaW4gY29uc2lzdGVuY3ksIHdlIHZhbGlkYXRlIHRoYXQgYW55IG5ldyBtYXBwaW5nIGJlaW5nIGFkZGVkIGZhbGxzXG4gKiBpbiB0byBvbmUgb2YgdGhlc2UgY2F0ZWdvcmllcy5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGVNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3ZhbGlkYXRlTWFwcGluZyhhR2VuZXJhdGVkLCBhT3JpZ2luYWwsIGFTb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYU5hbWUpIHtcbiAgICAvLyBXaGVuIGFPcmlnaW5hbCBpcyB0cnV0aHkgYnV0IGhhcyBlbXB0eSB2YWx1ZXMgZm9yIC5saW5lIGFuZCAuY29sdW1uLFxuICAgIC8vIGl0IGlzIG1vc3QgbGlrZWx5IGEgcHJvZ3JhbW1lciBlcnJvci4gSW4gdGhpcyBjYXNlIHdlIHRocm93IGEgdmVyeVxuICAgIC8vIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UgdG8gdHJ5IHRvIGd1aWRlIHRoZW0gdGhlIHJpZ2h0IHdheS5cbiAgICAvLyBGb3IgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXIvcG9seW1lci1idW5kbGVyL3B1bGwvNTE5XG4gICAgaWYgKGFPcmlnaW5hbCAmJiB0eXBlb2YgYU9yaWdpbmFsLmxpbmUgIT09ICdudW1iZXInICYmIHR5cGVvZiBhT3JpZ2luYWwuY29sdW1uICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnb3JpZ2luYWwubGluZSBhbmQgb3JpZ2luYWwuY29sdW1uIGFyZSBub3QgbnVtYmVycyAtLSB5b3UgcHJvYmFibHkgbWVhbnQgdG8gb21pdCAnICtcbiAgICAgICAgICAgICd0aGUgb3JpZ2luYWwgbWFwcGluZyBlbnRpcmVseSBhbmQgb25seSBtYXAgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi4gSWYgc28sIHBhc3MgJyArXG4gICAgICAgICAgICAnbnVsbCBmb3IgdGhlIG9yaWdpbmFsIG1hcHBpbmcgaW5zdGVhZCBvZiBhbiBvYmplY3Qgd2l0aCBlbXB0eSBvciBudWxsIHZhbHVlcy4nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAmJiBhR2VuZXJhdGVkLmxpbmUgPiAwICYmIGFHZW5lcmF0ZWQuY29sdW1uID49IDBcbiAgICAgICAgJiYgIWFPcmlnaW5hbCAmJiAhYVNvdXJjZSAmJiAhYU5hbWUpIHtcbiAgICAgIC8vIENhc2UgMS5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxzZSBpZiAoYUdlbmVyYXRlZCAmJiAnbGluZScgaW4gYUdlbmVyYXRlZCAmJiAnY29sdW1uJyBpbiBhR2VuZXJhdGVkXG4gICAgICAgICAgICAgJiYgYU9yaWdpbmFsICYmICdsaW5lJyBpbiBhT3JpZ2luYWwgJiYgJ2NvbHVtbicgaW4gYU9yaWdpbmFsXG4gICAgICAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICAgICAgJiYgYU9yaWdpbmFsLmxpbmUgPiAwICYmIGFPcmlnaW5hbC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFTb3VyY2UpIHtcbiAgICAgIC8vIENhc2VzIDIgYW5kIDMuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1hcHBpbmc6ICcgKyBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGdlbmVyYXRlZDogYUdlbmVyYXRlZCxcbiAgICAgICAgc291cmNlOiBhU291cmNlLFxuICAgICAgICBvcmlnaW5hbDogYU9yaWdpbmFsLFxuICAgICAgICBuYW1lOiBhTmFtZVxuICAgICAgfSkpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBTZXJpYWxpemUgdGhlIGFjY3VtdWxhdGVkIG1hcHBpbmdzIGluIHRvIHRoZSBzdHJlYW0gb2YgYmFzZSA2NCBWTFFzXG4gKiBzcGVjaWZpZWQgYnkgdGhlIHNvdXJjZSBtYXAgZm9ybWF0LlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl9zZXJpYWxpemVNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXJpYWxpemVNYXBwaW5ncygpIHtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbExpbmUgPSAwO1xuICAgIHZhciBwcmV2aW91c05hbWUgPSAwO1xuICAgIHZhciBwcmV2aW91c1NvdXJjZSA9IDA7XG4gICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgIHZhciBuZXh0O1xuICAgIHZhciBtYXBwaW5nO1xuICAgIHZhciBuYW1lSWR4O1xuICAgIHZhciBzb3VyY2VJZHg7XG5cbiAgICB2YXIgbWFwcGluZ3MgPSB0aGlzLl9tYXBwaW5ncy50b0FycmF5KCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG1hcHBpbmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBtYXBwaW5nID0gbWFwcGluZ3NbaV07XG4gICAgICBuZXh0ID0gJydcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgICAgd2hpbGUgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbmV4dCArPSAnOyc7XG4gICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICBpZiAoIXV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZywgbWFwcGluZ3NbaSAtIDFdKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHQgKz0gJywnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c0dlbmVyYXRlZENvbHVtbik7XG4gICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VJZHggPSB0aGlzLl9zb3VyY2VzLmluZGV4T2YobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUoc291cmNlSWR4IC0gcHJldmlvdXNTb3VyY2UpO1xuICAgICAgICBwcmV2aW91c1NvdXJjZSA9IHNvdXJjZUlkeDtcblxuICAgICAgICAvLyBsaW5lcyBhcmUgc3RvcmVkIDAtYmFzZWQgaW4gU291cmNlTWFwIHNwZWMgdmVyc2lvbiAzXG4gICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLm9yaWdpbmFsTGluZSAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c09yaWdpbmFsTGluZSk7XG4gICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmUgLSAxO1xuXG4gICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbENvbHVtbik7XG4gICAgICAgIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIGlmIChtYXBwaW5nLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgIG5hbWVJZHggPSB0aGlzLl9uYW1lcy5pbmRleE9mKG1hcHBpbmcubmFtZSk7XG4gICAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKG5hbWVJZHggLSBwcmV2aW91c05hbWUpO1xuICAgICAgICAgIHByZXZpb3VzTmFtZSA9IG5hbWVJZHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0ICs9IG5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KGFTb3VyY2VzLCBhU291cmNlUm9vdCkge1xuICAgIHJldHVybiBhU291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoYVNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKGFTb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgfVxuICAgICAgdmFyIGtleSA9IHV0aWwudG9TZXRTdHJpbmcoc291cmNlKTtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fc291cmNlc0NvbnRlbnRzLCBrZXkpXG4gICAgICAgID8gdGhpcy5fc291cmNlc0NvbnRlbnRzW2tleV1cbiAgICAgICAgOiBudWxsO1xuICAgIH0sIHRoaXMpO1xuICB9O1xuXG4vKipcbiAqIEV4dGVybmFsaXplIHRoZSBzb3VyY2UgbWFwLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvSlNPTiA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl90b0pTT04oKSB7XG4gICAgdmFyIG1hcCA9IHtcbiAgICAgIHZlcnNpb246IHRoaXMuX3ZlcnNpb24sXG4gICAgICBzb3VyY2VzOiB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKSxcbiAgICAgIG5hbWVzOiB0aGlzLl9uYW1lcy50b0FycmF5KCksXG4gICAgICBtYXBwaW5nczogdGhpcy5fc2VyaWFsaXplTWFwcGluZ3MoKVxuICAgIH07XG4gICAgaWYgKHRoaXMuX2ZpbGUgIT0gbnVsbCkge1xuICAgICAgbWFwLmZpbGUgPSB0aGlzLl9maWxlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBtYXAuc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIG1hcC5zb3VyY2VzQ29udGVudCA9IHRoaXMuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQobWFwLnNvdXJjZXMsIG1hcC5zb3VyY2VSb290KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xuICB9O1xuXG4vKipcbiAqIFJlbmRlciB0aGUgc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQgdG8gYSBzdHJpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUudG9TdHJpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMudG9KU09OKCkpO1xuICB9O1xuXG5leHBvcnRzLlNvdXJjZU1hcEdlbmVyYXRvciA9IFNvdXJjZU1hcEdlbmVyYXRvcjtcbiIsICIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gIC8vXG4gIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gIC8vXG4gIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgLy8gICAgICB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQuXG4gIC8vXG4gIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gIC8vICAgICAgZWxlbWVudCB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlIHJldHVybiAtMS5cbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gIGlmIChjbXAgPT09IDApIHtcbiAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgcmV0dXJuIG1pZDtcbiAgfVxuICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBncmVhdGVyIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAqIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlIHBvaW50cyxcbiAqIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzcyBqdXN0IG1lYW5zXG4gKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gKlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqL1xuZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB2YXIgaW5kZXggPSByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIFdlIGhhdmUgZm91bmQgZWl0aGVyIHRoZSBleGFjdCBlbGVtZW50LCBvciB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQgdGhhblxuICAvLyB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBzdWNoXG4gIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC0taW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuIiwgIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxuLy8gSXQgdHVybnMgb3V0IHRoYXQgc29tZSAobW9zdD8pIEphdmFTY3JpcHQgZW5naW5lcyBkb24ndCBzZWxmLWhvc3Rcbi8vIGBBcnJheS5wcm90b3R5cGUuc29ydGAuIFRoaXMgbWFrZXMgc2Vuc2UgYmVjYXVzZSBDKysgd2lsbCBsaWtlbHkgcmVtYWluXG4vLyBmYXN0ZXIgdGhhbiBKUyB3aGVuIGRvaW5nIHJhdyBDUFUtaW50ZW5zaXZlIHNvcnRpbmcuIEhvd2V2ZXIsIHdoZW4gdXNpbmcgYVxuLy8gY3VzdG9tIGNvbXBhcmF0b3IgZnVuY3Rpb24sIGNhbGxpbmcgYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0aGUgVk0ncyBDKysgYW5kXG4vLyBKSVQnZCBKUyBpcyByYXRoZXIgc2xvdyAqYW5kKiBsb3NlcyBKSVQgdHlwZSBpbmZvcm1hdGlvbiwgcmVzdWx0aW5nIGluXG4vLyB3b3JzZSBnZW5lcmF0ZWQgY29kZSBmb3IgdGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24gdGhhbiB3b3VsZCBiZSBvcHRpbWFsLiBJblxuLy8gZmFjdCwgd2hlbiBzb3J0aW5nIHdpdGggYSBjb21wYXJhdG9yLCB0aGVzZSBjb3N0cyBvdXR3ZWlnaCB0aGUgYmVuZWZpdHMgb2Zcbi8vIHNvcnRpbmcgaW4gQysrLiBCeSB1c2luZyBvdXIgb3duIEpTLWltcGxlbWVudGVkIFF1aWNrIFNvcnQgKGJlbG93KSwgd2UgZ2V0XG4vLyBhIH4zNTAwbXMgbWVhbiBzcGVlZC11cCBpbiBgYmVuY2gvYmVuY2guaHRtbGAuXG5cbi8qKlxuICogU3dhcCB0aGUgZWxlbWVudHMgaW5kZXhlZCBieSBgeGAgYW5kIGB5YCBpbiB0aGUgYXJyYXkgYGFyeWAuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJ5XG4gKiAgICAgICAgVGhlIGFycmF5LlxuICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGl0ZW0uXG4gKiBAcGFyYW0ge051bWJlcn0geVxuICogICAgICAgIFRoZSBpbmRleCBvZiB0aGUgc2Vjb25kIGl0ZW0uXG4gKi9cbmZ1bmN0aW9uIHN3YXAoYXJ5LCB4LCB5KSB7XG4gIHZhciB0ZW1wID0gYXJ5W3hdO1xuICBhcnlbeF0gPSBhcnlbeV07XG4gIGFyeVt5XSA9IHRlbXA7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIHdpdGhpbiB0aGUgcmFuZ2UgYGxvdyAuLiBoaWdoYCBpbmNsdXNpdmUuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGxvd1xuICogICAgICAgIFRoZSBsb3dlciBib3VuZCBvbiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge051bWJlcn0gaGlnaFxuICogICAgICAgIFRoZSB1cHBlciBib3VuZCBvbiB0aGUgcmFuZ2UuXG4gKi9cbmZ1bmN0aW9uIHJhbmRvbUludEluUmFuZ2UobG93LCBoaWdoKSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKGxvdyArIChNYXRoLnJhbmRvbSgpICogKGhpZ2ggLSBsb3cpKSk7XG59XG5cbi8qKlxuICogVGhlIFF1aWNrIFNvcnQgYWxnb3JpdGhtLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICogQHBhcmFtIHtOdW1iZXJ9IHBcbiAqICAgICAgICBTdGFydCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSByXG4gKiAgICAgICAgRW5kIGluZGV4IG9mIHRoZSBhcnJheVxuICovXG5mdW5jdGlvbiBkb1F1aWNrU29ydChhcnksIGNvbXBhcmF0b3IsIHAsIHIpIHtcbiAgLy8gSWYgb3VyIGxvd2VyIGJvdW5kIGlzIGxlc3MgdGhhbiBvdXIgdXBwZXIgYm91bmQsIHdlICgxKSBwYXJ0aXRpb24gdGhlXG4gIC8vIGFycmF5IGludG8gdHdvIHBpZWNlcyBhbmQgKDIpIHJlY3Vyc2Ugb24gZWFjaCBoYWxmLiBJZiBpdCBpcyBub3QsIHRoaXMgaXNcbiAgLy8gdGhlIGVtcHR5IGFycmF5IGFuZCBvdXIgYmFzZSBjYXNlLlxuXG4gIGlmIChwIDwgcikge1xuICAgIC8vICgxKSBQYXJ0aXRpb25pbmcuXG4gICAgLy9cbiAgICAvLyBUaGUgcGFydGl0aW9uaW5nIGNob29zZXMgYSBwaXZvdCBiZXR3ZWVuIGBwYCBhbmQgYHJgIGFuZCBtb3ZlcyBhbGxcbiAgICAvLyBlbGVtZW50cyB0aGF0IGFyZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBpdm90IHRvIHRoZSBiZWZvcmUgaXQsIGFuZFxuICAgIC8vIGFsbCB0aGUgZWxlbWVudHMgdGhhdCBhcmUgZ3JlYXRlciB0aGFuIGl0IGFmdGVyIGl0LiBUaGUgZWZmZWN0IGlzIHRoYXRcbiAgICAvLyBvbmNlIHBhcnRpdGlvbiBpcyBkb25lLCB0aGUgcGl2b3QgaXMgaW4gdGhlIGV4YWN0IHBsYWNlIGl0IHdpbGwgYmUgd2hlblxuICAgIC8vIHRoZSBhcnJheSBpcyBwdXQgaW4gc29ydGVkIG9yZGVyLCBhbmQgaXQgd2lsbCBub3QgbmVlZCB0byBiZSBtb3ZlZFxuICAgIC8vIGFnYWluLiBUaGlzIHJ1bnMgaW4gTyhuKSB0aW1lLlxuXG4gICAgLy8gQWx3YXlzIGNob29zZSBhIHJhbmRvbSBwaXZvdCBzbyB0aGF0IGFuIGlucHV0IGFycmF5IHdoaWNoIGlzIHJldmVyc2VcbiAgICAvLyBzb3J0ZWQgZG9lcyBub3QgY2F1c2UgTyhuXjIpIHJ1bm5pbmcgdGltZS5cbiAgICB2YXIgcGl2b3RJbmRleCA9IHJhbmRvbUludEluUmFuZ2UocCwgcik7XG4gICAgdmFyIGkgPSBwIC0gMTtcblxuICAgIHN3YXAoYXJ5LCBwaXZvdEluZGV4LCByKTtcbiAgICB2YXIgcGl2b3QgPSBhcnlbcl07XG5cbiAgICAvLyBJbW1lZGlhdGVseSBhZnRlciBgamAgaXMgaW5jcmVtZW50ZWQgaW4gdGhpcyBsb29wLCB0aGUgZm9sbG93aW5nIGhvbGRcbiAgICAvLyB0cnVlOlxuICAgIC8vXG4gICAgLy8gICAqIEV2ZXJ5IGVsZW1lbnQgaW4gYGFyeVtwIC4uIGldYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBpdm90LlxuICAgIC8vXG4gICAgLy8gICAqIEV2ZXJ5IGVsZW1lbnQgaW4gYGFyeVtpKzEgLi4gai0xXWAgaXMgZ3JlYXRlciB0aGFuIHRoZSBwaXZvdC5cbiAgICBmb3IgKHZhciBqID0gcDsgaiA8IHI7IGorKykge1xuICAgICAgaWYgKGNvbXBhcmF0b3IoYXJ5W2pdLCBwaXZvdCkgPD0gMCkge1xuICAgICAgICBpICs9IDE7XG4gICAgICAgIHN3YXAoYXJ5LCBpLCBqKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2FwKGFyeSwgaSArIDEsIGopO1xuICAgIHZhciBxID0gaSArIDE7XG5cbiAgICAvLyAoMikgUmVjdXJzZSBvbiBlYWNoIGhhbGYuXG5cbiAgICBkb1F1aWNrU29ydChhcnksIGNvbXBhcmF0b3IsIHAsIHEgLSAxKTtcbiAgICBkb1F1aWNrU29ydChhcnksIGNvbXBhcmF0b3IsIHEgKyAxLCByKTtcbiAgfVxufVxuXG4vKipcbiAqIFNvcnQgdGhlIGdpdmVuIGFycmF5IGluLXBsYWNlIHdpdGggdGhlIGdpdmVuIGNvbXBhcmF0b3IgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJ5XG4gKiAgICAgICAgQW4gYXJyYXkgdG8gc29ydC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbXBhcmF0b3JcbiAqICAgICAgICBGdW5jdGlvbiB0byB1c2UgdG8gY29tcGFyZSB0d28gaXRlbXMuXG4gKi9cbmV4cG9ydHMucXVpY2tTb3J0ID0gZnVuY3Rpb24gKGFyeSwgY29tcGFyYXRvcikge1xuICBkb1F1aWNrU29ydChhcnksIGNvbXBhcmF0b3IsIDAsIGFyeS5sZW5ndGggLSAxKTtcbn07XG4iLCAiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbmZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICByZXR1cm4gc291cmNlTWFwLnNlY3Rpb25zICE9IG51bGxcbiAgICA/IG5ldyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKVxuICAgIDogbmV3IEJhc2ljU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcCA9IGZ1bmN0aW9uKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgcmV0dXJuIEJhc2ljU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8vIGBfX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmQgYF9fb3JpZ2luYWxNYXBwaW5nc2AgYXJlIGFycmF5cyB0aGF0IGhvbGQgdGhlXG4vLyBwYXJzZWQgbWFwcGluZyBjb29yZGluYXRlcyBmcm9tIHRoZSBzb3VyY2UgbWFwJ3MgXCJtYXBwaW5nc1wiIGF0dHJpYnV0ZS4gVGhleVxuLy8gYXJlIGxhemlseSBpbnN0YW50aWF0ZWQsIGFjY2Vzc2VkIHZpYSB0aGUgYF9nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGdldHRlcnMgcmVzcGVjdGl2ZWx5LCBhbmQgd2Ugb25seSBwYXJzZSB0aGUgbWFwcGluZ3Ncbi8vIGFuZCBjcmVhdGUgdGhlc2UgYXJyYXlzIG9uY2UgcXVlcmllZCBmb3IgYSBzb3VyY2UgbG9jYXRpb24uIFdlIGp1bXAgdGhyb3VnaFxuLy8gdGhlc2UgaG9vcHMgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSB0aG91c2FuZHMgb2YgbWFwcGluZ3MsIGFuZCBwYXJzaW5nXG4vLyB0aGVtIGlzIGV4cGVuc2l2ZSwgc28gd2Ugb25seSB3YW50IHRvIGRvIGl0IGlmIHdlIG11c3QuXG4vL1xuLy8gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5cyBpcyBvZiB0aGUgZm9ybTpcbi8vXG4vLyAgICAge1xuLy8gICAgICAgZ2VuZXJhdGVkTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIGdlbmVyYXRlZENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgc291cmNlOiBUaGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhpc1xuLy8gICAgICAgICAgICAgICBjaHVuayBvZiBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxMaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBvcmlnaW5hbENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhpcyBjaHVuayBvZiBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBzeW1ib2wgd2hpY2ggZ2VuZXJhdGVkIHRoaXMgY2h1bmsgb2Zcbi8vICAgICAgICAgICAgIGNvZGUuXG4vLyAgICAgfVxuLy9cbi8vIEFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBmb3IgYGdlbmVyYXRlZExpbmVgIGFuZCBgZ2VuZXJhdGVkQ29sdW1uYCBjYW4gYmVcbi8vIGBudWxsYC5cbi8vXG4vLyBgX2dlbmVyYXRlZE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zLlxuLy9cbi8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zLlxuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IG51bGw7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX2dlbmVyYXRlZE1hcHBpbmdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gIH1cbn0pO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19vcmlnaW5hbE1hcHBpbmdzID0gbnVsbDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfb3JpZ2luYWxNYXBwaW5ncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fY2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgaW5kZXgpIHtcbiAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBfcGFyc2VNYXBwaW5nc1wiKTtcbiAgfTtcblxuU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKlxuICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICogQHBhcmFtIGFPcmRlclxuICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICB2YXIgbWFwcGluZ3M7XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZSwgdGhpcy5fc291cmNlTWFwVVJMKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKVxuICAgICAgfTtcbiAgICB9LCB0aGlzKS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAqIGNsb3Nlc3QgbGluZSB0aGF0IGhhcyBhbnkgbWFwcGluZ3MuIE90aGVyd2lzZSwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAqXG4gKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IE9wdGlvbmFsLiB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yKGFBcmdzKSB7XG4gICAgdmFyIGxpbmUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKTtcblxuICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gZXhhY3QgbWF0Y2gsIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kTWFwcGluZ1xuICAgIC8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IG1hcHBpbmcgbGVzcyB0aGFuIHRoZSBuZWVkbGUuIEJ5XG4gICAgLy8gc2V0dGluZyBuZWVkbGUub3JpZ2luYWxDb2x1bW4gdG8gMCwgd2UgdGh1cyBmaW5kIHRoZSBsYXN0IG1hcHBpbmcgZm9yXG4gICAgLy8gdGhlIGdpdmVuIGxpbmUsIHByb3ZpZGVkIHN1Y2ggYSBtYXBwaW5nIGV4aXN0cy5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpLFxuICAgICAgb3JpZ2luYWxMaW5lOiBsaW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJywgMClcbiAgICB9O1xuXG4gICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChuZWVkbGUuc291cmNlKTtcbiAgICBpZiAobmVlZGxlLnNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgbWFwcGluZ3MgPSBbXTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKGFBcmdzLmNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZTtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIGZvdW5kLiBTaW5jZVxuICAgICAgICAvLyBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGZvdW5kLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gb3JpZ2luYWxMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIHdlcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgLy8gU2luY2UgbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAvLyB0aGUgbGluZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBsaW5lICYmXG4gICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID09IG9yaWdpbmFsQ29sdW1uKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXBwaW5ncztcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2ggd2UgY2FuXG4gKiBxdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGZpbGUgcG9zaXRpb25zIGJ5IGdpdmluZyBpdCBhIGZpbGVcbiAqIHBvc2l0aW9uIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICpcbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3JcbiAqIGFscmVhZHkgcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYywgc291cmNlIG1hcHMgaGF2ZSB0aGVcbiAqIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICpcbiAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICogICAtIHNvdXJjZXM6IEFuIGFycmF5IG9mIFVSTHMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAqICAgLSBuYW1lczogQW4gYXJyYXkgb2YgaWRlbnRpZmllcnMgd2hpY2ggY2FuIGJlIHJlZmVycmVuY2VkIGJ5IGluZGl2aWR1YWwgbWFwcGluZ3MuXG4gKiAgIC0gc291cmNlUm9vdDogT3B0aW9uYWwuIFRoZSBVUkwgcm9vdCBmcm9tIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSByZWxhdGl2ZS5cbiAqICAgLSBzb3VyY2VzQ29udGVudDogT3B0aW9uYWwuIEFuIGFycmF5IG9mIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbWFwcGluZ3M6IEEgc3RyaW5nIG9mIGJhc2U2NCBWTFFzIHdoaWNoIGNvbnRhaW4gdGhlIGFjdHVhbCBtYXBwaW5ncy5cbiAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gKlxuICogSGVyZSBpcyBhbiBleGFtcGxlIHNvdXJjZSBtYXAsIHRha2VuIGZyb20gdGhlIHNvdXJjZSBtYXAgc3BlY1swXTpcbiAqXG4gKiAgICAge1xuICogICAgICAgdmVyc2lvbiA6IDMsXG4gKiAgICAgICBmaWxlOiBcIm91dC5qc1wiLFxuICogICAgICAgc291cmNlUm9vdCA6IFwiXCIsXG4gKiAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAqICAgICAgIG1hcHBpbmdzOiBcIkFBLEFCOztBQkNERTtcIlxuICogICAgIH1cbiAqXG4gKiBUaGUgc2Vjb25kIHBhcmFtZXRlciwgaWYgZ2l2ZW4sIGlzIGEgc3RyaW5nIHdob3NlIHZhbHVlIGlzIHRoZSBVUkxcbiAqIGF0IHdoaWNoIHRoZSBzb3VyY2UgbWFwIHdhcyBmb3VuZC4gIFRoaXMgVVJMIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGVcbiAqIHNvdXJjZXMgYXJyYXkuXG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gKi9cbmZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IHV0aWwucGFyc2VTb3VyY2VNYXBJbnB1dChhU291cmNlTWFwKTtcbiAgfVxuXG4gIHZhciB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAndmVyc2lvbicpO1xuICB2YXIgc291cmNlcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXMnKTtcbiAgLy8gU2FzcyAzLjMgbGVhdmVzIG91dCB0aGUgJ25hbWVzJyBhcnJheSwgc28gd2UgZGV2aWF0ZSBmcm9tIHRoZSBzcGVjICh3aGljaFxuICAvLyByZXF1aXJlcyB0aGUgYXJyYXkpIHRvIHBsYXkgbmljZSBoZXJlLlxuICB2YXIgbmFtZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICduYW1lcycsIFtdKTtcbiAgdmFyIHNvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VSb290JywgbnVsbCk7XG4gIHZhciBzb3VyY2VzQ29udGVudCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXNDb250ZW50JywgbnVsbCk7XG4gIHZhciBtYXBwaW5ncyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ21hcHBpbmdzJyk7XG4gIHZhciBmaWxlID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnZmlsZScsIG51bGwpO1xuXG4gIC8vIE9uY2UgYWdhaW4sIFNhc3MgZGV2aWF0ZXMgZnJvbSB0aGUgc3BlYyBhbmQgc3VwcGxpZXMgdGhlIHZlcnNpb24gYXMgYVxuICAvLyBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIsIHNvIHdlIHVzZSBsb29zZSBlcXVhbGl0eSBjaGVja2luZyBoZXJlLlxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIHNvdXJjZVJvb3QgPSB1dGlsLm5vcm1hbGl6ZShzb3VyY2VSb290KTtcbiAgfVxuXG4gIHNvdXJjZXMgPSBzb3VyY2VzXG4gICAgLm1hcChTdHJpbmcpXG4gICAgLy8gU29tZSBzb3VyY2UgbWFwcyBwcm9kdWNlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBsaWtlIFwiLi9mb28uanNcIiBpbnN0ZWFkIG9mXG4gICAgLy8gXCJmb28uanNcIi4gIE5vcm1hbGl6ZSB0aGVzZSBmaXJzdCBzbyB0aGF0IGZ1dHVyZSBjb21wYXJpc29ucyB3aWxsIHN1Y2NlZWQuXG4gICAgLy8gU2VlIGJ1Z3ppbC5sYS8xMDkwNzY4LlxuICAgIC5tYXAodXRpbC5ub3JtYWxpemUpXG4gICAgLy8gQWx3YXlzIGVuc3VyZSB0aGF0IGFic29sdXRlIHNvdXJjZXMgYXJlIGludGVybmFsbHkgc3RvcmVkIHJlbGF0aXZlIHRvXG4gICAgLy8gdGhlIHNvdXJjZSByb290LCBpZiB0aGUgc291cmNlIHJvb3QgaXMgYWJzb2x1dGUuIE5vdCBkb2luZyB0aGlzIHdvdWxkXG4gICAgLy8gYmUgcGFydGljdWxhcmx5IHByb2JsZW1hdGljIHdoZW4gdGhlIHNvdXJjZSByb290IGlzIGEgcHJlZml4IG9mIHRoZVxuICAgIC8vIHNvdXJjZSAodmFsaWQsIGJ1dCB3aHk/PykuIFNlZSBnaXRodWIgaXNzdWUgIzE5OSBhbmQgYnVnemlsLmxhLzExODg5ODIuXG4gICAgLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlUm9vdCAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlUm9vdCkgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZSlcbiAgICAgICAgPyB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZSlcbiAgICAgICAgOiBzb3VyY2U7XG4gICAgfSk7XG5cbiAgLy8gUGFzcyBgdHJ1ZWAgYmVsb3cgdG8gYWxsb3cgZHVwbGljYXRlIG5hbWVzIGFuZCBzb3VyY2VzLiBXaGlsZSBzb3VyY2UgbWFwc1xuICAvLyBhcmUgaW50ZW5kZWQgdG8gYmUgY29tcHJlc3NlZCBhbmQgZGVkdXBsaWNhdGVkLCB0aGUgVHlwZVNjcmlwdCBjb21waWxlclxuICAvLyBzb21ldGltZXMgZ2VuZXJhdGVzIHNvdXJjZSBtYXBzIHdpdGggZHVwbGljYXRlcyBpbiB0aGVtLiBTZWUgR2l0aHViIGlzc3VlXG4gIC8vICM3MiBhbmQgYnVnemlsLmxhLzg4OTQ5Mi5cbiAgdGhpcy5fbmFtZXMgPSBBcnJheVNldC5mcm9tQXJyYXkobmFtZXMubWFwKFN0cmluZyksIHRydWUpO1xuICB0aGlzLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KHNvdXJjZXMsIHRydWUpO1xuXG4gIHRoaXMuX2Fic29sdXRlU291cmNlcyA9IHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc291cmNlUm9vdCwgcywgYVNvdXJjZU1hcFVSTCk7XG4gIH0pO1xuXG4gIHRoaXMuc291cmNlUm9vdCA9IHNvdXJjZVJvb3Q7XG4gIHRoaXMuc291cmNlc0NvbnRlbnQgPSBzb3VyY2VzQ29udGVudDtcbiAgdGhpcy5fbWFwcGluZ3MgPSBtYXBwaW5ncztcbiAgdGhpcy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgdGhpcy5maWxlID0gZmlsZTtcbn1cblxuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCB0aGUgaW5kZXggb2YgYSBzb3VyY2UuICBSZXR1cm5zIC0xIGlmIG5vdFxuICogZm91bmQuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kU291cmNlSW5kZXggPSBmdW5jdGlvbihhU291cmNlKSB7XG4gIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgIHJlbGF0aXZlU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhyZWxhdGl2ZVNvdXJjZSkpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlcy5pbmRleE9mKHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIC8vIE1heWJlIGFTb3VyY2UgaXMgYW4gYWJzb2x1dGUgVVJMIGFzIHJldHVybmVkIGJ5IHxzb3VyY2VzfC4gIEluXG4gIC8vIHRoaXMgY2FzZSB3ZSBjYW4ndCBzaW1wbHkgdW5kbyB0aGUgdHJhbnNmb3JtLlxuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2Fic29sdXRlU291cmNlcy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0aGlzLl9hYnNvbHV0ZVNvdXJjZXNbaV0gPT0gYVNvdXJjZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGZyb20gYSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKlxuICogQHBhcmFtIFNvdXJjZU1hcEdlbmVyYXRvciBhU291cmNlTWFwXG4gKiAgICAgICAgVGhlIHNvdXJjZSBtYXAgdGhhdCB3aWxsIGJlIGNvbnN1bWVkLlxuICogQHBhcmFtIFN0cmluZyBhU291cmNlTWFwVVJMXG4gKiAgICAgICAgVGhlIFVSTCBhdCB3aGljaCB0aGUgc291cmNlIG1hcCBjYW4gYmUgZm91bmQgKG9wdGlvbmFsKVxuICogQHJldHVybnMgQmFzaWNTb3VyY2VNYXBDb25zdW1lclxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgICB2YXIgc21jID0gT2JqZWN0LmNyZWF0ZShCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5cbiAgICB2YXIgbmFtZXMgPSBzbWMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX25hbWVzLnRvQXJyYXkoKSwgdHJ1ZSk7XG4gICAgdmFyIHNvdXJjZXMgPSBzbWMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fc291cmNlcy50b0FycmF5KCksIHRydWUpO1xuICAgIHNtYy5zb3VyY2VSb290ID0gYVNvdXJjZU1hcC5fc291cmNlUm9vdDtcbiAgICBzbWMuc291cmNlc0NvbnRlbnQgPSBhU291cmNlTWFwLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KHNtYy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWMuc291cmNlUm9vdCk7XG4gICAgc21jLmZpbGUgPSBhU291cmNlTWFwLl9maWxlO1xuICAgIHNtYy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgICBzbWMuX2Fic29sdXRlU291cmNlcyA9IHNtYy5fc291cmNlcy50b0FycmF5KCkubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNtYy5zb3VyY2VSb290LCBzLCBhU291cmNlTWFwVVJMKTtcbiAgICB9KTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAvLyBuYW1lcyB0byBpbmRpY2VzIGludG8gdGhlIHNvdXJjZXMgYW5kIG5hbWVzIEFycmF5U2V0cyksIHdlIGhhdmUgdG8gbWFrZVxuICAgIC8vIGEgY29weSBvZiB0aGUgZW50cnkgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gU2hhcmVkIG11dGFibGUgc3RhdGVcbiAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICB2YXIgZGVzdEdlbmVyYXRlZE1hcHBpbmdzID0gc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcmNNYXBwaW5nID0gZ2VuZXJhdGVkTWFwcGluZ3NbaV07XG4gICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBzcmNNYXBwaW5nLmdlbmVyYXRlZExpbmU7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBzcmNNYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgIGRlc3RNYXBwaW5nLnNvdXJjZSA9IHNvdXJjZXMuaW5kZXhPZihzcmNNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsTGluZSA9IHNyY01hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcubmFtZSkge1xuICAgICAgICAgIGRlc3RNYXBwaW5nLm5hbWUgPSBuYW1lcy5pbmRleE9mKHNyY01hcHBpbmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0T3JpZ2luYWxNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICAgIH1cblxuICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgIH1cblxuICAgIHF1aWNrU29ydChzbWMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgIHJldHVybiBzbWM7XG4gIH07XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fic29sdXRlU291cmNlcy5zbGljZSgpO1xuICB9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBKSVQgd2l0aCBhIG5pY2Ugc2hhcGUgLyBoaWRkZW4gY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmcoKSB7XG4gIHRoaXMuZ2VuZXJhdGVkTGluZSA9IDA7XG4gIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB0aGlzLm5hbWUgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICB2YXIgdGVtcCA9IHt9O1xuICAgIHZhciBvcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIG1hcHBpbmcsIHN0ciwgc2VnbWVudCwgZW5kLCB2YWx1ZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnLCcpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAvLyBCZWNhdXNlIGVhY2ggb2Zmc2V0IGlzIGVuY29kZWQgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgIC8vIGZhY3QgYnkgY2FjaGluZyB0aGUgcGFyc2VkIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgb2YgZWFjaCBzZWdtZW50LFxuICAgICAgICAvLyBhbGxvd2luZyB1cyB0byBhdm9pZCBhIHNlY29uZCBwYXJzZSBpZiB3ZSBlbmNvdW50ZXIgdGhlIHNhbWVcbiAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgZm9yIChlbmQgPSBpbmRleDsgZW5kIDwgbGVuZ3RoOyBlbmQrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGVuZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgIHNlZ21lbnQgPSBjYWNoZWRTZWdtZW50c1tzdHJdO1xuICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnbWVudCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShhU3RyLCBpbmRleCwgdGVtcCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gcHJldmlvdXNTb3VyY2UgKyBzZWdtZW50WzFdO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHNlZ21lbnRbMV07XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyBzZWdtZW50WzJdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gcHJldmlvdXNOYW1lICsgc2VnbWVudFs0XTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSBzZWdtZW50WzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KGdlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgIHF1aWNrU29ydChvcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG9yaWdpbmFsTWFwcGluZ3M7XG4gIH07XG5cbi8qKlxuICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykge1xuICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IsIGFCaWFzKTtcbiAgfTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gKiBpbmNsdXNpdmUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyXG4gKiAgICAgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKiAgIC0gbmFtZTogVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIsIG9yIG51bGwuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9vcmlnaW5hbFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIGdlbmVyYXRlZExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgZ2VuZXJhdGVkQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MsXG4gICAgICBcImdlbmVyYXRlZExpbmVcIixcbiAgICAgIFwiZ2VuZXJhdGVkQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdzb3VyY2UnLCBudWxsKTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuYXQoc291cmNlKTtcbiAgICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwodGhpcy5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbmFtZScsIG51bGwpO1xuICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5hdChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbExpbmUnLCBudWxsKSxcbiAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIG5hbWU6IG5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlOiBudWxsLFxuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIG5hbWU6IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgdGhlIHNvdXJjZSBjb250ZW50IGZvciBldmVyeSBzb3VyY2UgaW4gdGhlIHNvdXJjZVxuICogbWFwLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gQmFzaWNTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnQubGVuZ3RoID49IHRoaXMuX3NvdXJjZXMuc2l6ZSgpICYmXG4gICAgICAhdGhpcy5zb3VyY2VzQ29udGVudC5zb21lKGZ1bmN0aW9uIChzYykgeyByZXR1cm4gc2MgPT0gbnVsbDsgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChhU291cmNlKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbaW5kZXhdO1xuICAgIH1cblxuICAgIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIHVybDtcbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGxcbiAgICAgICAgJiYgKHVybCA9IHV0aWwudXJsUGFyc2UodGhpcy5zb3VyY2VSb290KSkpIHtcbiAgICAgIC8vIFhYWDogZmlsZTovLyBVUklzIGFuZCBhYnNvbHV0ZSBwYXRocyBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZm9yXG4gICAgICAvLyBtYW55IHVzZXJzLiBXZSBjYW4gaGVscCB0aGVtIG91dCB3aGVuIHRoZXkgZXhwZWN0IGZpbGU6Ly8gVVJJcyB0b1xuICAgICAgLy8gYmVoYXZlIGxpa2UgaXQgd291bGQgaWYgdGhleSB3ZXJlIHJ1bm5pbmcgYSBsb2NhbCBIVFRQIHNlcnZlci4gU2VlXG4gICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODU1OTcuXG4gICAgICB2YXIgZmlsZVVyaUFic1BhdGggPSByZWxhdGl2ZVNvdXJjZS5yZXBsYWNlKC9eZmlsZTpcXC9cXC8vLCBcIlwiKTtcbiAgICAgIGlmICh1cmwuc2NoZW1lID09IFwiZmlsZVwiXG4gICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoZmlsZVVyaUFic1BhdGgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihmaWxlVXJpQWJzUGF0aCldXG4gICAgICB9XG5cbiAgICAgIGlmICgoIXVybC5wYXRoIHx8IHVybC5wYXRoID09IFwiL1wiKVxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKFwiL1wiICsgcmVsYXRpdmVTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIHJlbGF0aXZlU291cmNlKV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHJlY3Vyc2l2ZWx5IGZyb21cbiAgICAvLyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IuIEluIHRoYXQgY2FzZSwgd2VcbiAgICAvLyBkb24ndCB3YW50IHRvIHRocm93IGlmIHdlIGNhbid0IGZpbmQgdGhlIHNvdXJjZSAtIHdlIGp1c3Qgd2FudCB0b1xuICAgIC8vIHJldHVybiBudWxsLCBzbyB3ZSBwcm92aWRlIGEgZmxhZyB0byBleGl0IGdyYWNlZnVsbHkuXG4gICAgaWYgKG51bGxPbk1pc3NpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgcmVsYXRpdmVTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyk7XG4gICAgc291cmNlID0gdGhpcy5fZmluZFNvdXJjZUluZGV4KHNvdXJjZSk7XG4gICAgaWYgKHNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBvcmlnaW5hbExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcoXG4gICAgICBuZWVkbGUsXG4gICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICB1dGlsLmdldEFyZyhhQXJncywgJ2JpYXMnLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORClcbiAgICApO1xuXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gbmVlZGxlLnNvdXJjZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgIH07XG4gIH07XG5cbmV4cG9ydHMuQmFzaWNTb3VyY2VNYXBDb25zdW1lciA9IEJhc2ljU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQW4gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaFxuICogd2UgY2FuIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbi4gSXQgZGlmZmVycyBmcm9tIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5cbiAqIHRoYXQgaXQgdGFrZXMgXCJpbmRleGVkXCIgc291cmNlIG1hcHMgKGkuZS4gb25lcyB3aXRoIGEgXCJzZWN0aW9uc1wiIGZpZWxkKSBhc1xuICogaW5wdXQuXG4gKlxuICogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICogaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAqXG4gKiBFYWNoIHZhbHVlIHVuZGVyIHRoZSBcInNlY3Rpb25zXCIgZmllbGQgaGFzIHR3byBmaWVsZHM6XG4gKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gKiAgICAgICBmaWVsZC5cbiAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gKiB1bnN1cHBvcnRlZC5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICogbW9kaWZpZWQgdG8gb21pdCBhIHNlY3Rpb24gd2hpY2ggdXNlcyB0aGUgXCJ1cmxcIiBmaWVsZC5cbiAqXG4gKiAge1xuICogICAgdmVyc2lvbiA6IDMsXG4gKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICogICAgc2VjdGlvbnM6IFt7XG4gKiAgICAgIG9mZnNldDoge2xpbmU6MTAwLCBjb2x1bW46MTB9LFxuICogICAgICBtYXA6IHtcbiAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgICBmaWxlOiBcInNlY3Rpb24uanNcIixcbiAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICAgbWFwcGluZ3M6IFwiQUFBQSxFOztBQkNERTtcIlxuICogICAgICB9XG4gKiAgICB9XSxcbiAqICB9XG4gKlxuICogVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlmIGdpdmVuLCBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMXG4gKiBhdCB3aGljaCB0aGUgc291cmNlIG1hcCB3YXMgZm91bmQuICBUaGlzIFVSTCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gKiBzb3VyY2VzIGFycmF5LlxuICpcbiAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0I2hlYWRpbmc9aC41MzVlczN4ZXByZ3RcbiAqL1xuZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgdmFyIGxhc3RPZmZzZXQgPSB7XG4gICAgbGluZTogLTEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMudXJsKSB7XG4gICAgICAvLyBUaGUgdXJsIGZpZWxkIHdpbGwgcmVxdWlyZSBzdXBwb3J0IGZvciBhc3luY2hyb25pY2l0eS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgIHZhciBvZmZzZXRMaW5lID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnbGluZScpO1xuICAgIHZhciBvZmZzZXRDb2x1bW4gPSB1dGlsLmdldEFyZyhvZmZzZXQsICdjb2x1bW4nKTtcblxuICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgIChvZmZzZXRMaW5lID09PSBsYXN0T2Zmc2V0LmxpbmUgJiYgb2Zmc2V0Q29sdW1uIDwgbGFzdE9mZnNldC5jb2x1bW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3Rpb24gb2Zmc2V0cyBtdXN0IGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy4nKTtcbiAgICB9XG4gICAgbGFzdE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgLy8gVGhlIG9mZnNldCBmaWVsZHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSB1c2UgMS1iYXNlZCBpbmRpY2VzIHdoZW5cbiAgICAgICAgLy8gZW5jb2RpbmcvZGVjb2RpbmcgZnJvbSBWTFEuXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG9mZnNldENvbHVtbiArIDFcbiAgICAgIH0sXG4gICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSwgYVNvdXJjZU1hcFVSTClcbiAgICB9XG4gIH0pO1xufVxuXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICAvLyBGaW5kIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbiB3ZSdyZSB0cnlpbmcgdG8gbWFwXG4gICAgLy8gdG8gYW4gb3JpZ2luYWwgcG9zaXRpb24uXG4gICAgdmFyIHNlY3Rpb25JbmRleCA9IGJpbmFyeVNlYXJjaC5zZWFyY2gobmVlZGxlLCB0aGlzLl9zZWN0aW9ucyxcbiAgICAgIGZ1bmN0aW9uKG5lZWRsZSwgc2VjdGlvbikge1xuICAgICAgICB2YXIgY21wID0gbmVlZGxlLmdlbmVyYXRlZExpbmUgLSBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lO1xuICAgICAgICBpZiAoY21wKSB7XG4gICAgICAgICAgcmV0dXJuIGNtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAobmVlZGxlLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgIH0pO1xuICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcblxuICAgIGlmICghc2VjdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIG5hbWU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlY3Rpb24uY29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICBsaW5lOiBuZWVkbGUuZ2VuZXJhdGVkTGluZSAtXG4gICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICBjb2x1bW46IG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmVcbiAgICAgICAgID8gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uIC0gMVxuICAgICAgICAgOiAwKSxcbiAgICAgIGJpYXM6IGFBcmdzLmJpYXNcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAqIG1hcCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWN0aW9ucy5ldmVyeShmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHMuY29uc3VtZXIuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKTtcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIHZhciBjb250ZW50ID0gc2VjdGlvbi5jb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIHRydWUpO1xuICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuIFxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIC8vIE9ubHkgY29uc2lkZXIgdGhpcyBzZWN0aW9uIGlmIHRoZSByZXF1ZXN0ZWQgc291cmNlIGlzIGluIHRoZSBsaXN0IG9mXG4gICAgICAvLyBzb3VyY2VzIG9mIHRoZSBjb25zdW1lci5cbiAgICAgIGlmIChzZWN0aW9uLmNvbnN1bWVyLl9maW5kU291cmNlSW5kZXgodXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSkgPT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGdlbmVyYXRlZFBvc2l0aW9uID0gc2VjdGlvbi5jb25zdW1lci5nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncyk7XG4gICAgICBpZiAoZ2VuZXJhdGVkUG9zaXRpb24pIHtcbiAgICAgICAgdmFyIHJldCA9IHtcbiAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWRQb3NpdGlvbi5jb2x1bW4gK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IGdlbmVyYXRlZFBvc2l0aW9uLmxpbmVcbiAgICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgICA6IDApXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fcGFyc2VNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuICAgICAgdmFyIHNlY3Rpb25NYXBwaW5ncyA9IHNlY3Rpb24uY29uc3VtZXIuX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWN0aW9uTWFwcGluZ3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSBzZWN0aW9uTWFwcGluZ3Nbal07XG5cbiAgICAgICAgdmFyIHNvdXJjZSA9IHNlY3Rpb24uY29uc3VtZXIuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc2VjdGlvbi5jb25zdW1lci5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpO1xuXG4gICAgICAgIHZhciBuYW1lID0gbnVsbDtcbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBzZWN0aW9uLmNvbnN1bWVyLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gb2Zmc2V0IHRoZW0gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb25jYXRlbmF0ZWRcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHF1aWNrU29ydCh0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gIH07XG5cbmV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xuIiwgIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIFNvdXJjZU1hcEdlbmVyYXRvciA9IHJlcXVpcmUoJy4vc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4vLyBNYXRjaGVzIGEgV2luZG93cy1zdHlsZSBgXFxyXFxuYCBuZXdsaW5lIG9yIGEgYFxcbmAgbmV3bGluZSB1c2VkIGJ5IGFsbCBvdGhlclxuLy8gb3BlcmF0aW5nIHN5c3RlbXMgdGhlc2UgZGF5cyAoY2FwdHVyaW5nIHRoZSByZXN1bHQpLlxudmFyIFJFR0VYX05FV0xJTkUgPSAvKFxccj9cXG4pLztcblxuLy8gTmV3bGluZSBjaGFyYWN0ZXIgY29kZSBmb3IgY2hhckNvZGVBdCgpIGNvbXBhcmlzb25zXG52YXIgTkVXTElORV9DT0RFID0gMTA7XG5cbi8vIFByaXZhdGUgc3ltYm9sIGZvciBpZGVudGlmeWluZyBgU291cmNlTm9kZWBzIHdoZW4gbXVsdGlwbGUgdmVyc2lvbnMgb2Zcbi8vIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkgYXJlIGxvYWRlZC4gVGhpcyBNVVNUIE5PVCBDSEFOR0UgYWNyb3NzXG4vLyB2ZXJzaW9ucyFcbnZhciBpc1NvdXJjZU5vZGUgPSBcIiQkJGlzU291cmNlTm9kZSQkJFwiO1xuXG4vKipcbiAqIFNvdXJjZU5vZGVzIHByb3ZpZGUgYSB3YXkgdG8gYWJzdHJhY3Qgb3ZlciBpbnRlcnBvbGF0aW5nL2NvbmNhdGVuYXRpbmdcbiAqIHNuaXBwZXRzIG9mIGdlbmVyYXRlZCBKYXZhU2NyaXB0IHNvdXJjZSBjb2RlIHdoaWxlIG1haW50YWluaW5nIHRoZSBsaW5lIGFuZFxuICogY29sdW1uIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUuXG4gKlxuICogQHBhcmFtIGFMaW5lIFRoZSBvcmlnaW5hbCBsaW5lIG51bWJlci5cbiAqIEBwYXJhbSBhQ29sdW1uIFRoZSBvcmlnaW5hbCBjb2x1bW4gbnVtYmVyLlxuICogQHBhcmFtIGFTb3VyY2UgVGhlIG9yaWdpbmFsIHNvdXJjZSdzIGZpbGVuYW1lLlxuICogQHBhcmFtIGFDaHVua3MgT3B0aW9uYWwuIEFuIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2ggYXJlIHNuaXBwZXRzIG9mXG4gKiAgICAgICAgZ2VuZXJhdGVkIEpTLCBvciBvdGhlciBTb3VyY2VOb2Rlcy5cbiAqIEBwYXJhbSBhTmFtZSBUaGUgb3JpZ2luYWwgaWRlbnRpZmllci5cbiAqL1xuZnVuY3Rpb24gU291cmNlTm9kZShhTGluZSwgYUNvbHVtbiwgYVNvdXJjZSwgYUNodW5rcywgYU5hbWUpIHtcbiAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICB0aGlzLnNvdXJjZUNvbnRlbnRzID0ge307XG4gIHRoaXMubGluZSA9IGFMaW5lID09IG51bGwgPyBudWxsIDogYUxpbmU7XG4gIHRoaXMuY29sdW1uID0gYUNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGFDb2x1bW47XG4gIHRoaXMuc291cmNlID0gYVNvdXJjZSA9PSBudWxsID8gbnVsbCA6IGFTb3VyY2U7XG4gIHRoaXMubmFtZSA9IGFOYW1lID09IG51bGwgPyBudWxsIDogYU5hbWU7XG4gIHRoaXNbaXNTb3VyY2VOb2RlXSA9IHRydWU7XG4gIGlmIChhQ2h1bmtzICE9IG51bGwpIHRoaXMuYWRkKGFDaHVua3MpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBTb3VyY2VOb2RlIGZyb20gZ2VuZXJhdGVkIGNvZGUgYW5kIGEgU291cmNlTWFwQ29uc3VtZXIuXG4gKlxuICogQHBhcmFtIGFHZW5lcmF0ZWRDb2RlIFRoZSBnZW5lcmF0ZWQgY29kZVxuICogQHBhcmFtIGFTb3VyY2VNYXBDb25zdW1lciBUaGUgU291cmNlTWFwIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhUmVsYXRpdmVQYXRoIE9wdGlvbmFsLiBUaGUgcGF0aCB0aGF0IHJlbGF0aXZlIHNvdXJjZXMgaW4gdGhlXG4gKiAgICAgICAgU291cmNlTWFwQ29uc3VtZXIgc2hvdWxkIGJlIHJlbGF0aXZlIHRvLlxuICovXG5Tb3VyY2VOb2RlLmZyb21TdHJpbmdXaXRoU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcChhR2VuZXJhdGVkQ29kZSwgYVNvdXJjZU1hcENvbnN1bWVyLCBhUmVsYXRpdmVQYXRoKSB7XG4gICAgLy8gVGhlIFNvdXJjZU5vZGUgd2Ugd2FudCB0byBmaWxsIHdpdGggdGhlIGdlbmVyYXRlZCBjb2RlXG4gICAgLy8gYW5kIHRoZSBTb3VyY2VNYXBcbiAgICB2YXIgbm9kZSA9IG5ldyBTb3VyY2VOb2RlKCk7XG5cbiAgICAvLyBBbGwgZXZlbiBpbmRpY2VzIG9mIHRoaXMgYXJyYXkgYXJlIG9uZSBsaW5lIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSxcbiAgICAvLyB3aGlsZSBhbGwgb2RkIGluZGljZXMgYXJlIHRoZSBuZXdsaW5lcyBiZXR3ZWVuIHR3byBhZGphY2VudCBsaW5lc1xuICAgIC8vIChzaW5jZSBgUkVHRVhfTkVXTElORWAgY2FwdHVyZXMgaXRzIG1hdGNoKS5cbiAgICAvLyBQcm9jZXNzZWQgZnJhZ21lbnRzIGFyZSBhY2Nlc3NlZCBieSBjYWxsaW5nIGBzaGlmdE5leHRMaW5lYC5cbiAgICB2YXIgcmVtYWluaW5nTGluZXMgPSBhR2VuZXJhdGVkQ29kZS5zcGxpdChSRUdFWF9ORVdMSU5FKTtcbiAgICB2YXIgcmVtYWluaW5nTGluZXNJbmRleCA9IDA7XG4gICAgdmFyIHNoaWZ0TmV4dExpbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBsaW5lQ29udGVudHMgPSBnZXROZXh0TGluZSgpO1xuICAgICAgLy8gVGhlIGxhc3QgbGluZSBvZiBhIGZpbGUgbWlnaHQgbm90IGhhdmUgYSBuZXdsaW5lLlxuICAgICAgdmFyIG5ld0xpbmUgPSBnZXROZXh0TGluZSgpIHx8IFwiXCI7XG4gICAgICByZXR1cm4gbGluZUNvbnRlbnRzICsgbmV3TGluZTtcblxuICAgICAgZnVuY3Rpb24gZ2V0TmV4dExpbmUoKSB7XG4gICAgICAgIHJldHVybiByZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoID9cbiAgICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXgrK10gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIHBvc2l0aW9uIG9mIFwicmVtYWluaW5nTGluZXNcIlxuICAgIHZhciBsYXN0R2VuZXJhdGVkTGluZSA9IDEsIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuXG4gICAgLy8gVGhlIGdlbmVyYXRlIFNvdXJjZU5vZGVzIHdlIG5lZWQgYSBjb2RlIHJhbmdlLlxuICAgIC8vIFRvIGV4dHJhY3QgaXQgY3VycmVudCBhbmQgbGFzdCBtYXBwaW5nIGlzIHVzZWQuXG4gICAgLy8gSGVyZSB3ZSBzdG9yZSB0aGUgbGFzdCBtYXBwaW5nLlxuICAgIHZhciBsYXN0TWFwcGluZyA9IG51bGw7XG5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIGlmIChsYXN0TWFwcGluZyAhPT0gbnVsbCkge1xuICAgICAgICAvLyBXZSBhZGQgdGhlIGNvZGUgZnJvbSBcImxhc3RNYXBwaW5nXCIgdG8gXCJtYXBwaW5nXCI6XG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZXJlIGlzIGEgbmV3IGxpbmUgaW4gYmV0d2Vlbi5cbiAgICAgICAgaWYgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgLy8gQXNzb2NpYXRlIGZpcnN0IGxpbmUgd2l0aCBcImxhc3RNYXBwaW5nXCJcbiAgICAgICAgICBhZGRNYXBwaW5nV2l0aENvZGUobGFzdE1hcHBpbmcsIHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIGNvZGUgaXMgYWRkZWQgd2l0aG91dCBtYXBwaW5nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlcmUgaXMgbm8gbmV3IGxpbmUgaW4gYmV0d2Vlbi5cbiAgICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIGNvZGUgYmV0d2VlbiBcImxhc3RHZW5lcmF0ZWRDb2x1bW5cIiBhbmRcbiAgICAgICAgICAvLyBcIm1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uXCIgd2l0aCBcImxhc3RNYXBwaW5nXCJcbiAgICAgICAgICB2YXIgbmV4dExpbmUgPSByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4XSB8fCAnJztcbiAgICAgICAgICB2YXIgY29kZSA9IG5leHRMaW5lLnN1YnN0cigwLCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbik7XG4gICAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcbiAgICAgICAgICBhZGRNYXBwaW5nV2l0aENvZGUobGFzdE1hcHBpbmcsIGNvZGUpO1xuICAgICAgICAgIC8vIE5vIG1vcmUgcmVtYWluaW5nIGNvZGUsIGNvbnRpbnVlXG4gICAgICAgICAgbGFzdE1hcHBpbmcgPSBtYXBwaW5nO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gV2UgYWRkIHRoZSBnZW5lcmF0ZWQgY29kZSB1bnRpbCB0aGUgZmlyc3QgbWFwcGluZ1xuICAgICAgLy8gdG8gdGhlIFNvdXJjZU5vZGUgd2l0aG91dCBhbnkgbWFwcGluZy5cbiAgICAgIC8vIEVhY2ggbGluZSBpcyBhZGRlZCBhcyBzZXBhcmF0ZSBzdHJpbmcuXG4gICAgICB3aGlsZSAobGFzdEdlbmVyYXRlZExpbmUgPCBtYXBwaW5nLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgbm9kZS5hZGQoc2hpZnROZXh0TGluZSgpKTtcbiAgICAgICAgbGFzdEdlbmVyYXRlZExpbmUrKztcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0R2VuZXJhdGVkQ29sdW1uIDwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pIHtcbiAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gfHwgJyc7XG4gICAgICAgIG5vZGUuYWRkKG5leHRMaW5lLnN1YnN0cigwLCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbikpO1xuICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4XSA9IG5leHRMaW5lLnN1YnN0cihtYXBwaW5nLmdlbmVyYXRlZENvbHVtbik7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcbiAgICAgIH1cbiAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICB9LCB0aGlzKTtcbiAgICAvLyBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgbWFwcGluZ3MuXG4gICAgaWYgKHJlbWFpbmluZ0xpbmVzSW5kZXggPCByZW1haW5pbmdMaW5lcy5sZW5ndGgpIHtcbiAgICAgIGlmIChsYXN0TWFwcGluZykge1xuICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIHJlbWFpbmluZyBjb2RlIGluIHRoZSBjdXJyZW50IGxpbmUgd2l0aCBcImxhc3RNYXBwaW5nXCJcbiAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgfVxuICAgICAgLy8gYW5kIGFkZCB0aGUgcmVtYWluaW5nIGxpbmVzIHdpdGhvdXQgYW55IG1hcHBpbmdcbiAgICAgIG5vZGUuYWRkKHJlbWFpbmluZ0xpbmVzLnNwbGljZShyZW1haW5pbmdMaW5lc0luZGV4KS5qb2luKFwiXCIpKTtcbiAgICB9XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50IGludG8gU291cmNlTm9kZVxuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChhUmVsYXRpdmVQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5qb2luKGFSZWxhdGl2ZVBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBub2RlO1xuXG4gICAgZnVuY3Rpb24gYWRkTWFwcGluZ1dpdGhDb2RlKG1hcHBpbmcsIGNvZGUpIHtcbiAgICAgIGlmIChtYXBwaW5nID09PSBudWxsIHx8IG1hcHBpbmcuc291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbm9kZS5hZGQoY29kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc291cmNlID0gYVJlbGF0aXZlUGF0aFxuICAgICAgICAgID8gdXRpbC5qb2luKGFSZWxhdGl2ZVBhdGgsIG1hcHBpbmcuc291cmNlKVxuICAgICAgICAgIDogbWFwcGluZy5zb3VyY2U7XG4gICAgICAgIG5vZGUuYWRkKG5ldyBTb3VyY2VOb2RlKG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcubmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBZGQgYSBjaHVuayBvZiBnZW5lcmF0ZWQgSlMgdG8gdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2FkZChhQ2h1bmspIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYUNodW5rKSkge1xuICAgIGFDaHVuay5mb3JFYWNoKGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgdGhpcy5hZGQoY2h1bmspO1xuICAgIH0sIHRoaXMpO1xuICB9XG4gIGVsc2UgaWYgKGFDaHVua1tpc1NvdXJjZU5vZGVdIHx8IHR5cGVvZiBhQ2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAoYUNodW5rKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goYUNodW5rKTtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBZGQgYSBjaHVuayBvZiBnZW5lcmF0ZWQgSlMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIHNvdXJjZSBub2RlLlxuICpcbiAqIEBwYXJhbSBhQ2h1bmsgQSBzdHJpbmcgc25pcHBldCBvZiBnZW5lcmF0ZWQgSlMgY29kZSwgYW5vdGhlciBpbnN0YW5jZSBvZlxuICogICAgICAgIFNvdXJjZU5vZGUsIG9yIGFuIGFycmF5IHdoZXJlIGVhY2ggbWVtYmVyIGlzIG9uZSBvZiB0aG9zZSB0aGluZ3MuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnByZXBlbmQgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3ByZXBlbmQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBmb3IgKHZhciBpID0gYUNodW5rLmxlbmd0aC0xOyBpID49IDA7IGktLSkge1xuICAgICAgdGhpcy5wcmVwZW5kKGFDaHVua1tpXSk7XG4gICAgfVxuICB9XG4gIGVsc2UgaWYgKGFDaHVua1tpc1NvdXJjZU5vZGVdIHx8IHR5cGVvZiBhQ2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICB0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYUNodW5rKTtcbiAgfVxuICBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgXCJFeHBlY3RlZCBhIFNvdXJjZU5vZGUsIHN0cmluZywgb3IgYW4gYXJyYXkgb2YgU291cmNlTm9kZXMgYW5kIHN0cmluZ3MuIEdvdCBcIiArIGFDaHVua1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFdhbGsgb3ZlciB0aGUgdHJlZSBvZiBKUyBzbmlwcGV0cyBpbiB0aGlzIG5vZGUgYW5kIGl0cyBjaGlsZHJlbi4gVGhlXG4gKiB3YWxraW5nIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIHNuaXBwZXQgb2YgSlMgYW5kIGlzIHBhc3NlZCB0aGF0XG4gKiBzbmlwcGV0IGFuZCB0aGUgaXRzIG9yaWdpbmFsIGFzc29jaWF0ZWQgc291cmNlJ3MgbGluZS9jb2x1bW4gbG9jYXRpb24uXG4gKlxuICogQHBhcmFtIGFGbiBUaGUgdHJhdmVyc2FsIGZ1bmN0aW9uLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS53YWxrID0gZnVuY3Rpb24gU291cmNlTm9kZV93YWxrKGFGbikge1xuICB2YXIgY2h1bms7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY2h1bmsgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgIGlmIChjaHVua1tpc1NvdXJjZU5vZGVdKSB7XG4gICAgICBjaHVuay53YWxrKGFGbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKGNodW5rICE9PSAnJykge1xuICAgICAgICBhRm4oY2h1bmssIHsgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMubGluZSxcbiAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIExpa2UgYFN0cmluZy5wcm90b3R5cGUuam9pbmAgZXhjZXB0IGZvciBTb3VyY2VOb2Rlcy4gSW5zZXJ0cyBgYVN0cmAgYmV0d2VlblxuICogZWFjaCBvZiBgdGhpcy5jaGlsZHJlbmAuXG4gKlxuICogQHBhcmFtIGFTZXAgVGhlIHNlcGFyYXRvci5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfam9pbihhU2VwKSB7XG4gIHZhciBuZXdDaGlsZHJlbjtcbiAgdmFyIGk7XG4gIHZhciBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDtcbiAgaWYgKGxlbiA+IDApIHtcbiAgICBuZXdDaGlsZHJlbiA9IFtdO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW4tMTsgaSsrKSB7XG4gICAgICBuZXdDaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaChhU2VwKTtcbiAgICB9XG4gICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICB0aGlzLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENhbGwgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlIG9uIHRoZSB2ZXJ5IHJpZ2h0LW1vc3Qgc291cmNlIHNuaXBwZXQuIFVzZWZ1bFxuICogZm9yIHRyaW1taW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZW5kIG9mIGEgc291cmNlIG5vZGUsIGV0Yy5cbiAqXG4gKiBAcGFyYW0gYVBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVwbGFjZS5cbiAqIEBwYXJhbSBhUmVwbGFjZW1lbnQgVGhlIHRoaW5nIHRvIHJlcGxhY2UgdGhlIHBhdHRlcm4gd2l0aC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUucmVwbGFjZVJpZ2h0ID0gZnVuY3Rpb24gU291cmNlTm9kZV9yZXBsYWNlUmlnaHQoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCkge1xuICB2YXIgbGFzdENoaWxkID0gdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdO1xuICBpZiAobGFzdENoaWxkW2lzU291cmNlTm9kZV0pIHtcbiAgICBsYXN0Q2hpbGQucmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiBsYXN0Q2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdID0gbGFzdENoaWxkLnJlcGxhY2UoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKCcnLnJlcGxhY2UoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCkpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIHNvdXJjZSBjb250ZW50IGZvciBhIHNvdXJjZSBmaWxlLiBUaGlzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIFNvdXJjZU1hcEdlbmVyYXRvclxuICogaW4gdGhlIHNvdXJjZXNDb250ZW50IGZpZWxkLlxuICpcbiAqIEBwYXJhbSBhU291cmNlRmlsZSBUaGUgZmlsZW5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlXG4gKiBAcGFyYW0gYVNvdXJjZUNvbnRlbnQgVGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnNldFNvdXJjZUNvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VOb2RlX3NldFNvdXJjZUNvbnRlbnQoYVNvdXJjZUZpbGUsIGFTb3VyY2VDb250ZW50KSB7XG4gICAgdGhpcy5zb3VyY2VDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKGFTb3VyY2VGaWxlKV0gPSBhU291cmNlQ29udGVudDtcbiAgfTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgU291cmNlTm9kZXMuIFRoZSB3YWxraW5nIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaFxuICogc291cmNlIGZpbGUgY29udGVudCBhbmQgaXMgcGFzc2VkIHRoZSBmaWxlbmFtZSBhbmQgc291cmNlIGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIGFGbiBUaGUgdHJhdmVyc2FsIGZ1bmN0aW9uLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS53YWxrU291cmNlQ29udGVudHMgPVxuICBmdW5jdGlvbiBTb3VyY2VOb2RlX3dhbGtTb3VyY2VDb250ZW50cyhhRm4pIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV1baXNTb3VyY2VOb2RlXSkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLndhbGtTb3VyY2VDb250ZW50cyhhRm4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzb3VyY2VzID0gT2JqZWN0LmtleXModGhpcy5zb3VyY2VDb250ZW50cyk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNvdXJjZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGFGbih1dGlsLmZyb21TZXRTdHJpbmcoc291cmNlc1tpXSksIHRoaXMuc291cmNlQ29udGVudHNbc291cmNlc1tpXV0pO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlLiBXYWxrcyBvdmVyIHRoZSB0cmVlXG4gKiBhbmQgY29uY2F0ZW5hdGVzIGFsbCB0aGUgdmFyaW91cyBzbmlwcGV0cyB0b2dldGhlciB0byBvbmUgc3RyaW5nLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfdG9TdHJpbmcoKSB7XG4gIHZhciBzdHIgPSBcIlwiO1xuICB0aGlzLndhbGsoZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgc3RyICs9IGNodW5rO1xuICB9KTtcbiAgcmV0dXJuIHN0cjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc291cmNlIG5vZGUgYWxvbmcgd2l0aCBhIHNvdXJjZVxuICogbWFwLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS50b1N0cmluZ1dpdGhTb3VyY2VNYXAgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nV2l0aFNvdXJjZU1hcChhQXJncykge1xuICB2YXIgZ2VuZXJhdGVkID0ge1xuICAgIGNvZGU6IFwiXCIsXG4gICAgbGluZTogMSxcbiAgICBjb2x1bW46IDBcbiAgfTtcbiAgdmFyIG1hcCA9IG5ldyBTb3VyY2VNYXBHZW5lcmF0b3IoYUFyZ3MpO1xuICB2YXIgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlO1xuICB2YXIgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbExpbmUgPSBudWxsO1xuICB2YXIgbGFzdE9yaWdpbmFsQ29sdW1uID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbE5hbWUgPSBudWxsO1xuICB0aGlzLndhbGsoZnVuY3Rpb24gKGNodW5rLCBvcmlnaW5hbCkge1xuICAgIGdlbmVyYXRlZC5jb2RlICs9IGNodW5rO1xuICAgIGlmIChvcmlnaW5hbC5zb3VyY2UgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwubGluZSAhPT0gbnVsbFxuICAgICAgICAmJiBvcmlnaW5hbC5jb2x1bW4gIT09IG51bGwpIHtcbiAgICAgIGlmKGxhc3RPcmlnaW5hbFNvdXJjZSAhPT0gb3JpZ2luYWwuc291cmNlXG4gICAgICAgICB8fCBsYXN0T3JpZ2luYWxMaW5lICE9PSBvcmlnaW5hbC5saW5lXG4gICAgICAgICB8fCBsYXN0T3JpZ2luYWxDb2x1bW4gIT09IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTmFtZSAhPT0gb3JpZ2luYWwubmFtZSkge1xuICAgICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgICAgIGxpbmU6IG9yaWdpbmFsLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG9yaWdpbmFsLnNvdXJjZTtcbiAgICAgIGxhc3RPcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgbGFzdE9yaWdpbmFsQ29sdW1uID0gb3JpZ2luYWwuY29sdW1uO1xuICAgICAgbGFzdE9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsLm5hbWU7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZU1hcHBpbmdBY3RpdmUpIHtcbiAgICAgIG1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDtcbiAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuZ3RoID0gY2h1bmsubGVuZ3RoOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7XG4gICAgICBpZiAoY2h1bmsuY2hhckNvZGVBdChpZHgpID09PSBORVdMSU5FX0NPREUpIHtcbiAgICAgICAgZ2VuZXJhdGVkLmxpbmUrKztcbiAgICAgICAgZ2VuZXJhdGVkLmNvbHVtbiA9IDA7XG4gICAgICAgIC8vIE1hcHBpbmdzIGVuZCBhdCBlb2xcbiAgICAgICAgaWYgKGlkeCArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZU1hcHBpbmdBY3RpdmUpIHtcbiAgICAgICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgICBzb3VyY2U6IG9yaWdpbmFsLnNvdXJjZSxcbiAgICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICAgIGxpbmU6IG9yaWdpbmFsLmxpbmUsXG4gICAgICAgICAgICAgIGNvbHVtbjogb3JpZ2luYWwuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYW1lOiBvcmlnaW5hbC5uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4rKztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB0aGlzLndhbGtTb3VyY2VDb250ZW50cyhmdW5jdGlvbiAoc291cmNlRmlsZSwgc291cmNlQ29udGVudCkge1xuICAgIG1hcC5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpO1xuICB9KTtcblxuICByZXR1cm4geyBjb2RlOiBnZW5lcmF0ZWQuY29kZSwgbWFwOiBtYXAgfTtcbn07XG5cbmV4cG9ydHMuU291cmNlTm9kZSA9IFNvdXJjZU5vZGU7XG4iLCAiLypcbiAqIENvcHlyaWdodCAyMDA5LTIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFLnR4dCBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvcicpLlNvdXJjZU1hcEdlbmVyYXRvcjtcbmV4cG9ydHMuU291cmNlTWFwQ29uc3VtZXIgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2UtbWFwLWNvbnN1bWVyJykuU291cmNlTWFwQ29uc3VtZXI7XG5leHBvcnRzLlNvdXJjZU5vZGUgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2Utbm9kZScpLlNvdXJjZU5vZGU7XG4iLCAiKGZ1bmN0aW9uICh3KSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIGZ1bmN0aW9uIGZpbmRCZXN0KGF0b2JOYXRpdmUpIHtcbiAgICAvLyBub3JtYWwgd2luZG93XG4gICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBhdG9iTmF0aXZlKSB7IHJldHVybiBhdG9iTmF0aXZlOyB9XG5cblxuICAgIC8vIGJyb3dzZXJpZnkgKHdlYiB3b3JrZXIpXG4gICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBCdWZmZXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBhdG9iQnJvd3NlcmlmeShhKSB7XG4gICAgICAgIC8vISEgRGVsaWJlcmF0ZWx5IHVzaW5nIGFuIEFQSSB0aGF0J3MgZGVwcmVjYXRlZCBpbiBub2RlLmpzIGJlY2F1c2VcbiAgICAgICAgLy8hISB0aGlzIGZpbGUgaXMgZm9yIGJyb3dzZXJzIGFuZCB3ZSBleHBlY3QgdGhlbSB0byBjb3BlIHdpdGggaXQuXG4gICAgICAgIC8vISEgRGlzY3Vzc2lvbjogZ2l0aHViLmNvbS9ub2RlLWJyb3dzZXItY29tcGF0L2F0b2IvcHVsbC85XG4gICAgICAgIHJldHVybiBuZXcgQnVmZmVyKGEsICdiYXNlNjQnKS50b1N0cmluZygnYmluYXJ5Jyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGlvcyB3ZWIgd29ya2VyIHdpdGggYmFzZTY0anNcbiAgICBpZiAoJ29iamVjdCcgPT09IHR5cGVvZiB3LmJhc2U2NGpzKSB7XG4gICAgICAvLyBidWZmZXJUb0JpbmFyeVN0cmluZ1xuICAgICAgLy8gaHR0cHM6Ly9naXQuY29vbGFqODYuY29tL2Nvb2xhajg2L3VuaWJhYmVsLmpzL2Jsb2IvbWFzdGVyL2luZGV4LmpzI0w1MFxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGF0b2JXZWJXb3JrZXJfaU9TKGEpIHtcbiAgICAgICAgdmFyIGJ1ZiA9IHcuYmFzZTY0anMuYjY0VG9CeXRlQXJyYXkoYSk7XG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoYnVmLCBmdW5jdGlvbiAoY2gpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgICAgIH0pLmpvaW4oJycpO1xuICAgICAgfTtcbiAgICB9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdFx0Ly8gaW9zIHdlYiB3b3JrZXIgd2l0aG91dCBiYXNlNjRqc1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiWW91J3JlIHByb2JhYmx5IGluIGFuIG9sZCBicm93c2VyIG9yIGFuIGlPUyB3ZWJ3b3JrZXIuXCIgK1xuXHRcdFx0XHRcIiBJdCBtaWdodCBoZWxwIHRvIGluY2x1ZGUgYmVhdGdhbW1pdCdzIGJhc2U2NC1qcy5cIik7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBhdG9iQmVzdCA9IGZpbmRCZXN0KHcuYXRvYik7XG4gIHcuYXRvYiA9IGF0b2JCZXN0O1xuXG4gIGlmICgodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpICYmIG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gYXRvYkJlc3Q7XG4gIH1cbn0od2luZG93KSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHRva2VuID0gJyVbYS1mMC05XXsyfSc7XG52YXIgc2luZ2xlTWF0Y2hlciA9IG5ldyBSZWdFeHAoJygnICsgdG9rZW4gKyAnKXwoW14lXSs/KScsICdnaScpO1xudmFyIG11bHRpTWF0Y2hlciA9IG5ldyBSZWdFeHAoJygnICsgdG9rZW4gKyAnKSsnLCAnZ2knKTtcblxuZnVuY3Rpb24gZGVjb2RlQ29tcG9uZW50cyhjb21wb25lbnRzLCBzcGxpdCkge1xuXHR0cnkge1xuXHRcdC8vIFRyeSB0byBkZWNvZGUgdGhlIGVudGlyZSBzdHJpbmcgZmlyc3Rcblx0XHRyZXR1cm4gW2RlY29kZVVSSUNvbXBvbmVudChjb21wb25lbnRzLmpvaW4oJycpKV07XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIERvIG5vdGhpbmdcblx0fVxuXG5cdGlmIChjb21wb25lbnRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBjb21wb25lbnRzO1xuXHR9XG5cblx0c3BsaXQgPSBzcGxpdCB8fCAxO1xuXG5cdC8vIFNwbGl0IHRoZSBhcnJheSBpbiAyIHBhcnRzXG5cdHZhciBsZWZ0ID0gY29tcG9uZW50cy5zbGljZSgwLCBzcGxpdCk7XG5cdHZhciByaWdodCA9IGNvbXBvbmVudHMuc2xpY2Uoc3BsaXQpO1xuXG5cdHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmNhbGwoW10sIGRlY29kZUNvbXBvbmVudHMobGVmdCksIGRlY29kZUNvbXBvbmVudHMocmlnaHQpKTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpbnB1dCk7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdHZhciB0b2tlbnMgPSBpbnB1dC5tYXRjaChzaW5nbGVNYXRjaGVyKSB8fCBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAxOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpbnB1dCA9IGRlY29kZUNvbXBvbmVudHModG9rZW5zLCBpKS5qb2luKCcnKTtcblxuXHRcdFx0dG9rZW5zID0gaW5wdXQubWF0Y2goc2luZ2xlTWF0Y2hlcikgfHwgW107XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGlucHV0O1xuXHR9XG59XG5cbmZ1bmN0aW9uIGN1c3RvbURlY29kZVVSSUNvbXBvbmVudChpbnB1dCkge1xuXHQvLyBLZWVwIHRyYWNrIG9mIGFsbCB0aGUgcmVwbGFjZW1lbnRzIGFuZCBwcmVmaWxsIHRoZSBtYXAgd2l0aCB0aGUgYEJPTWBcblx0dmFyIHJlcGxhY2VNYXAgPSB7XG5cdFx0JyVGRSVGRic6ICdcXHVGRkZEXFx1RkZGRCcsXG5cdFx0JyVGRiVGRSc6ICdcXHVGRkZEXFx1RkZGRCdcblx0fTtcblxuXHR2YXIgbWF0Y2ggPSBtdWx0aU1hdGNoZXIuZXhlYyhpbnB1dCk7XG5cdHdoaWxlIChtYXRjaCkge1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBEZWNvZGUgYXMgYmlnIGNodW5rcyBhcyBwb3NzaWJsZVxuXHRcdFx0cmVwbGFjZU1hcFttYXRjaFswXV0gPSBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbMF0pO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0dmFyIHJlc3VsdCA9IGRlY29kZShtYXRjaFswXSk7XG5cblx0XHRcdGlmIChyZXN1bHQgIT09IG1hdGNoWzBdKSB7XG5cdFx0XHRcdHJlcGxhY2VNYXBbbWF0Y2hbMF1dID0gcmVzdWx0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG1hdGNoID0gbXVsdGlNYXRjaGVyLmV4ZWMoaW5wdXQpO1xuXHR9XG5cblx0Ly8gQWRkIGAlQzJgIGF0IHRoZSBlbmQgb2YgdGhlIG1hcCB0byBtYWtlIHN1cmUgaXQgZG9lcyBub3QgcmVwbGFjZSB0aGUgY29tYmluYXRvciBiZWZvcmUgZXZlcnl0aGluZyBlbHNlXG5cdHJlcGxhY2VNYXBbJyVDMiddID0gJ1xcdUZGRkQnO1xuXG5cdHZhciBlbnRyaWVzID0gT2JqZWN0LmtleXMocmVwbGFjZU1hcCk7XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Ly8gUmVwbGFjZSBhbGwgZGVjb2RlZCBjb21wb25lbnRzXG5cdFx0dmFyIGtleSA9IGVudHJpZXNbaV07XG5cdFx0aW5wdXQgPSBpbnB1dC5yZXBsYWNlKG5ldyBSZWdFeHAoa2V5LCAnZycpLCByZXBsYWNlTWFwW2tleV0pO1xuXHR9XG5cblx0cmV0dXJuIGlucHV0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlbmNvZGVkVVJJKSB7XG5cdGlmICh0eXBlb2YgZW5jb2RlZFVSSSAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBgZW5jb2RlZFVSSWAgdG8gYmUgb2YgdHlwZSBgc3RyaW5nYCwgZ290IGAnICsgdHlwZW9mIGVuY29kZWRVUkkgKyAnYCcpO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRlbmNvZGVkVVJJID0gZW5jb2RlZFVSSS5yZXBsYWNlKC9cXCsvZywgJyAnKTtcblxuXHRcdC8vIFRyeSB0aGUgYnVpbHQgaW4gZGVjb2RlciBmaXJzdFxuXHRcdHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZW5jb2RlZFVSSSk7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIEZhbGxiYWNrIHRvIGEgbW9yZSBhZHZhbmNlZCBkZWNvZGVyXG5cdFx0cmV0dXJuIGN1c3RvbURlY29kZVVSSUNvbXBvbmVudChlbmNvZGVkVVJJKTtcblx0fVxufTtcbiIsICJ2YXIgYXRvYiA9IHJlcXVpcmUoXCJhdG9iXCIpXG52YXIgdXJsTGliID0gcmVxdWlyZShcInVybFwiKVxudmFyIHBhdGhMaWIgPSByZXF1aXJlKFwicGF0aFwiKVxudmFyIGRlY29kZVVyaUNvbXBvbmVudExpYiA9IHJlcXVpcmUoXCJkZWNvZGUtdXJpLWNvbXBvbmVudFwiKVxuXG5cblxuZnVuY3Rpb24gcmVzb2x2ZVVybCgvKiAuLi51cmxzICovKSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUucmVkdWNlLmNhbGwoYXJndW1lbnRzLCBmdW5jdGlvbihyZXNvbHZlZCwgbmV4dFVybCkge1xuICAgIHJldHVybiB1cmxMaWIucmVzb2x2ZShyZXNvbHZlZCwgbmV4dFVybClcbiAgfSlcbn1cblxuZnVuY3Rpb24gY29udmVydFdpbmRvd3NQYXRoKGFQYXRoKSB7XG4gIHJldHVybiBwYXRoTGliLnNlcCA9PT0gXCJcXFxcXCIgPyBhUGF0aC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKS5yZXBsYWNlKC9eW2Etel06XFwvPy9pLCBcIi9cIikgOiBhUGF0aFxufVxuXG5mdW5jdGlvbiBjdXN0b21EZWNvZGVVcmlDb21wb25lbnQoc3RyaW5nKSB7XG4gIC8vIGBkZWNvZGVVcmlDb21wb25lbnRMaWJgIHR1cm5zIGArYCBpbnRvIGAgYCwgYnV0IHRoYXQncyBub3Qgd2FudGVkLlxuICByZXR1cm4gZGVjb2RlVXJpQ29tcG9uZW50TGliKHN0cmluZy5yZXBsYWNlKC9cXCsvZywgXCIlMkJcIikpXG59XG5cbmZ1bmN0aW9uIGNhbGxiYWNrQXN5bmMoY2FsbGJhY2ssIGVycm9yLCByZXN1bHQpIHtcbiAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkgeyBjYWxsYmFjayhlcnJvciwgcmVzdWx0KSB9KVxufVxuXG5mdW5jdGlvbiBwYXJzZU1hcFRvSlNPTihzdHJpbmcsIGRhdGEpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHJpbmcucmVwbGFjZSgvXlxcKVxcXVxcfScvLCBcIlwiKSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBlcnJvci5zb3VyY2VNYXBEYXRhID0gZGF0YVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZFN5bmMocmVhZCwgdXJsLCBkYXRhKSB7XG4gIHZhciByZWFkVXJsID0gY3VzdG9tRGVjb2RlVXJpQ29tcG9uZW50KHVybClcbiAgdHJ5IHtcbiAgICByZXR1cm4gU3RyaW5nKHJlYWQocmVhZFVybCkpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZXJyb3Iuc291cmNlTWFwRGF0YSA9IGRhdGFcbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG5cblxuXG52YXIgaW5uZXJSZWdleCA9IC9bI0BdIHNvdXJjZU1hcHBpbmdVUkw9KFteXFxzJ1wiXSopL1xuXG52YXIgc291cmNlTWFwcGluZ1VSTFJlZ2V4ID0gUmVnRXhwKFxuICBcIig/OlwiICtcbiAgICBcIi9cXFxcKlwiICtcbiAgICBcIig/OlxcXFxzKlxccj9cXG4oPzovLyk/KT9cIiArXG4gICAgXCIoPzpcIiArIGlubmVyUmVnZXguc291cmNlICsgXCIpXCIgK1xuICAgIFwiXFxcXHMqXCIgK1xuICAgIFwiXFxcXCovXCIgK1xuICAgIFwifFwiICtcbiAgICBcIi8vKD86XCIgKyBpbm5lclJlZ2V4LnNvdXJjZSArIFwiKVwiICtcbiAgXCIpXCIgK1xuICBcIlxcXFxzKlwiXG4pXG5cbmZ1bmN0aW9uIGdldFNvdXJjZU1hcHBpbmdVcmwoY29kZSkge1xuICB2YXIgbWF0Y2ggPSBjb2RlLm1hdGNoKHNvdXJjZU1hcHBpbmdVUkxSZWdleClcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gfHwgbWF0Y2hbMl0gfHwgXCJcIiA6IG51bGxcbn1cblxuXG5cbmZ1bmN0aW9uIHJlc29sdmVTb3VyY2VNYXAoY29kZSwgY29kZVVybCwgcmVhZCwgY2FsbGJhY2spIHtcbiAgdmFyIG1hcERhdGFcbiAgdHJ5IHtcbiAgICBtYXBEYXRhID0gcmVzb2x2ZVNvdXJjZU1hcEhlbHBlcihjb2RlLCBjb2RlVXJsKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBjYWxsYmFja0FzeW5jKGNhbGxiYWNrLCBlcnJvcilcbiAgfVxuICBpZiAoIW1hcERhdGEgfHwgbWFwRGF0YS5tYXApIHtcbiAgICByZXR1cm4gY2FsbGJhY2tBc3luYyhjYWxsYmFjaywgbnVsbCwgbWFwRGF0YSlcbiAgfVxuICB2YXIgcmVhZFVybCA9IGN1c3RvbURlY29kZVVyaUNvbXBvbmVudChtYXBEYXRhLnVybClcbiAgcmVhZChyZWFkVXJsLCBmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBlcnJvci5zb3VyY2VNYXBEYXRhID0gbWFwRGF0YVxuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycm9yKVxuICAgIH1cbiAgICBtYXBEYXRhLm1hcCA9IFN0cmluZyhyZXN1bHQpXG4gICAgdHJ5IHtcbiAgICAgIG1hcERhdGEubWFwID0gcGFyc2VNYXBUb0pTT04obWFwRGF0YS5tYXAsIG1hcERhdGEpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnJvcilcbiAgICB9XG4gICAgY2FsbGJhY2sobnVsbCwgbWFwRGF0YSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVNvdXJjZU1hcFN5bmMoY29kZSwgY29kZVVybCwgcmVhZCkge1xuICB2YXIgbWFwRGF0YSA9IHJlc29sdmVTb3VyY2VNYXBIZWxwZXIoY29kZSwgY29kZVVybClcbiAgaWYgKCFtYXBEYXRhIHx8IG1hcERhdGEubWFwKSB7XG4gICAgcmV0dXJuIG1hcERhdGFcbiAgfVxuICBtYXBEYXRhLm1hcCA9IHJlYWRTeW5jKHJlYWQsIG1hcERhdGEudXJsLCBtYXBEYXRhKVxuICBtYXBEYXRhLm1hcCA9IHBhcnNlTWFwVG9KU09OKG1hcERhdGEubWFwLCBtYXBEYXRhKVxuICByZXR1cm4gbWFwRGF0YVxufVxuXG52YXIgZGF0YVVyaVJlZ2V4ID0gL15kYXRhOihbXiw7XSopKDtbXiw7XSopKig/OiwoLiopKT8kL1xuXG4vKipcbiAqIFRoZSBtZWRpYSB0eXBlIGZvciBKU09OIHRleHQgaXMgYXBwbGljYXRpb24vanNvbi5cbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzgyNTkjc2VjdGlvbi0xMSB8IElBTkEgQ29uc2lkZXJhdGlvbnMgfVxuICpcbiAqIGB0ZXh0L2pzb25gIGlzIG5vbi1zdGFuZGFyZCBtZWRpYSB0eXBlXG4gKi9cbnZhciBqc29uTWltZVR5cGVSZWdleCA9IC9eKD86YXBwbGljYXRpb258dGV4dClcXC9qc29uJC9cblxuLyoqXG4gKiBKU09OIHRleHQgZXhjaGFuZ2VkIGJldHdlZW4gc3lzdGVtcyB0aGF0IGFyZSBub3QgcGFydCBvZiBhIGNsb3NlZCBlY29zeXN0ZW1cbiAqIE1VU1QgYmUgZW5jb2RlZCB1c2luZyBVVEYtOC5cbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzgyNTkjc2VjdGlvbi04LjEgfCBDaGFyYWN0ZXIgRW5jb2Rpbmd9XG4gKi9cbnZhciBqc29uQ2hhcmFjdGVyRW5jb2RpbmcgPSBcInV0Zi04XCJcblxuZnVuY3Rpb24gYmFzZTY0VG9CdWYoYjY0KSB7XG4gIHZhciBiaW5TdHIgPSBhdG9iKGI2NClcbiAgdmFyIGxlbiA9IGJpblN0ci5sZW5ndGhcbiAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KGxlbilcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGFycltpXSA9IGJpblN0ci5jaGFyQ29kZUF0KGkpXG4gIH1cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBkZWNvZGVCYXNlNjRTdHJpbmcoYjY0KSB7XG4gIGlmICh0eXBlb2YgVGV4dERlY29kZXIgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mIFVpbnQ4QXJyYXkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gYXRvYihiNjQpXG4gIH1cbiAgdmFyIGJ1ZiA9IGJhc2U2NFRvQnVmKGI2NCk7XG4gIC8vIE5vdGU6IGBkZWNvZGVyLmRlY29kZWAgbWV0aG9kIHdpbGwgdGhyb3cgYSBgRE9NRXhjZXB0aW9uYCB3aXRoIHRoZVxuICAvLyBgXCJFbmNvZGluZ0Vycm9yXCJgIHZhbHVlIHdoZW4gYW4gY29kaW5nIGVycm9yIGlzIGZvdW5kLlxuICB2YXIgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2Rlcihqc29uQ2hhcmFjdGVyRW5jb2RpbmcsIHtmYXRhbDogdHJ1ZX0pXG4gIHJldHVybiBkZWNvZGVyLmRlY29kZShidWYpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlU291cmNlTWFwSGVscGVyKGNvZGUsIGNvZGVVcmwpIHtcbiAgY29kZVVybCA9IGNvbnZlcnRXaW5kb3dzUGF0aChjb2RlVXJsKVxuXG4gIHZhciB1cmwgPSBnZXRTb3VyY2VNYXBwaW5nVXJsKGNvZGUpXG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHZhciBkYXRhVXJpID0gdXJsLm1hdGNoKGRhdGFVcmlSZWdleClcbiAgaWYgKGRhdGFVcmkpIHtcbiAgICB2YXIgbWltZVR5cGUgPSBkYXRhVXJpWzFdIHx8IFwidGV4dC9wbGFpblwiXG4gICAgdmFyIGxhc3RQYXJhbWV0ZXIgPSBkYXRhVXJpWzJdIHx8IFwiXCJcbiAgICB2YXIgZW5jb2RlZCA9IGRhdGFVcmlbM10gfHwgXCJcIlxuICAgIHZhciBkYXRhID0ge1xuICAgICAgc291cmNlTWFwcGluZ1VSTDogdXJsLFxuICAgICAgdXJsOiBudWxsLFxuICAgICAgc291cmNlc1JlbGF0aXZlVG86IGNvZGVVcmwsXG4gICAgICBtYXA6IGVuY29kZWRcbiAgICB9XG4gICAgaWYgKCFqc29uTWltZVR5cGVSZWdleC50ZXN0KG1pbWVUeXBlKSkge1xuICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKFwiVW51c2VmdWwgZGF0YSB1cmkgbWltZSB0eXBlOiBcIiArIG1pbWVUeXBlKVxuICAgICAgZXJyb3Iuc291cmNlTWFwRGF0YSA9IGRhdGFcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBkYXRhLm1hcCA9IHBhcnNlTWFwVG9KU09OKFxuICAgICAgICBsYXN0UGFyYW1ldGVyID09PSBcIjtiYXNlNjRcIiA/IGRlY29kZUJhc2U2NFN0cmluZyhlbmNvZGVkKSA6IGRlY29kZVVSSUNvbXBvbmVudChlbmNvZGVkKSxcbiAgICAgICAgZGF0YVxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvci5zb3VyY2VNYXBEYXRhID0gZGF0YVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIHZhciBtYXBVcmwgPSByZXNvbHZlVXJsKGNvZGVVcmwsIHVybClcbiAgcmV0dXJuIHtcbiAgICBzb3VyY2VNYXBwaW5nVVJMOiB1cmwsXG4gICAgdXJsOiBtYXBVcmwsXG4gICAgc291cmNlc1JlbGF0aXZlVG86IG1hcFVybCxcbiAgICBtYXA6IG51bGxcbiAgfVxufVxuXG5cblxuZnVuY3Rpb24gcmVzb2x2ZVNvdXJjZXMobWFwLCBtYXBVcmwsIHJlYWQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHt9XG4gIH1cbiAgdmFyIHBlbmRpbmcgPSBtYXAuc291cmNlcyA/IG1hcC5zb3VyY2VzLmxlbmd0aCA6IDBcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICBzb3VyY2VzUmVzb2x2ZWQ6IFtdLFxuICAgIHNvdXJjZXNDb250ZW50OiAgW11cbiAgfVxuXG4gIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgY2FsbGJhY2tBc3luYyhjYWxsYmFjaywgbnVsbCwgcmVzdWx0KVxuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGRvbmUgPSBmdW5jdGlvbigpIHtcbiAgICBwZW5kaW5nLS1cbiAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KVxuICAgIH1cbiAgfVxuXG4gIHJlc29sdmVTb3VyY2VzSGVscGVyKG1hcCwgbWFwVXJsLCBvcHRpb25zLCBmdW5jdGlvbihmdWxsVXJsLCBzb3VyY2VDb250ZW50LCBpbmRleCkge1xuICAgIHJlc3VsdC5zb3VyY2VzUmVzb2x2ZWRbaW5kZXhdID0gZnVsbFVybFxuICAgIGlmICh0eXBlb2Ygc291cmNlQ29udGVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmVzdWx0LnNvdXJjZXNDb250ZW50W2luZGV4XSA9IHNvdXJjZUNvbnRlbnRcbiAgICAgIGNhbGxiYWNrQXN5bmMoZG9uZSwgbnVsbClcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlYWRVcmwgPSBjdXN0b21EZWNvZGVVcmlDb21wb25lbnQoZnVsbFVybClcbiAgICAgIHJlYWQocmVhZFVybCwgZnVuY3Rpb24oZXJyb3IsIHNvdXJjZSkge1xuICAgICAgICByZXN1bHQuc291cmNlc0NvbnRlbnRbaW5kZXhdID0gZXJyb3IgPyBlcnJvciA6IFN0cmluZyhzb3VyY2UpXG4gICAgICAgIGRvbmUoKVxuICAgICAgfSlcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTb3VyY2VzU3luYyhtYXAsIG1hcFVybCwgcmVhZCwgb3B0aW9ucykge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIHNvdXJjZXNSZXNvbHZlZDogW10sXG4gICAgc291cmNlc0NvbnRlbnQ6ICBbXVxuICB9XG5cbiAgaWYgKCFtYXAuc291cmNlcyB8fCBtYXAuc291cmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXNvbHZlU291cmNlc0hlbHBlcihtYXAsIG1hcFVybCwgb3B0aW9ucywgZnVuY3Rpb24oZnVsbFVybCwgc291cmNlQ29udGVudCwgaW5kZXgpIHtcbiAgICByZXN1bHQuc291cmNlc1Jlc29sdmVkW2luZGV4XSA9IGZ1bGxVcmxcbiAgICBpZiAocmVhZCAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBzb3VyY2VDb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJlc3VsdC5zb3VyY2VzQ29udGVudFtpbmRleF0gPSBzb3VyY2VDb250ZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVhZFVybCA9IGN1c3RvbURlY29kZVVyaUNvbXBvbmVudChmdWxsVXJsKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdC5zb3VyY2VzQ29udGVudFtpbmRleF0gPSBTdHJpbmcocmVhZChyZWFkVXJsKSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXN1bHQuc291cmNlc0NvbnRlbnRbaW5kZXhdID0gZXJyb3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gcmVzdWx0XG59XG5cbnZhciBlbmRpbmdTbGFzaCA9IC9cXC8/JC9cblxuZnVuY3Rpb24gcmVzb2x2ZVNvdXJjZXNIZWxwZXIobWFwLCBtYXBVcmwsIG9wdGlvbnMsIGZuKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIG1hcFVybCA9IGNvbnZlcnRXaW5kb3dzUGF0aChtYXBVcmwpXG4gIHZhciBmdWxsVXJsXG4gIHZhciBzb3VyY2VDb250ZW50XG4gIHZhciBzb3VyY2VSb290XG4gIGZvciAodmFyIGluZGV4ID0gMCwgbGVuID0gbWFwLnNvdXJjZXMubGVuZ3RoOyBpbmRleCA8IGxlbjsgaW5kZXgrKykge1xuICAgIHNvdXJjZVJvb3QgPSBudWxsXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnNvdXJjZVJvb3QgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHNvdXJjZVJvb3QgPSBvcHRpb25zLnNvdXJjZVJvb3RcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtYXAuc291cmNlUm9vdCA9PT0gXCJzdHJpbmdcIiAmJiBvcHRpb25zLnNvdXJjZVJvb3QgIT09IGZhbHNlKSB7XG4gICAgICBzb3VyY2VSb290ID0gbWFwLnNvdXJjZVJvb3RcbiAgICB9XG4gICAgLy8gSWYgdGhlIHNvdXJjZVJvb3QgaXMgdGhlIGVtcHR5IHN0cmluZywgaXQgaXMgZXF1aXZhbGVudCB0byBub3Qgc2V0dGluZ1xuICAgIC8vIHRoZSBwcm9wZXJ0eSBhdCBhbGwuXG4gICAgaWYgKHNvdXJjZVJvb3QgPT09IG51bGwgfHwgc291cmNlUm9vdCA9PT0gJycpIHtcbiAgICAgIGZ1bGxVcmwgPSByZXNvbHZlVXJsKG1hcFVybCwgbWFwLnNvdXJjZXNbaW5kZXhdKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgc291cmNlUm9vdCBlbmRzIHdpdGggYSBzbGFzaCwgc28gdGhhdCBgL3NjcmlwdHMvc3ViZGlyYCBiZWNvbWVzXG4gICAgICAvLyBgL3NjcmlwdHMvc3ViZGlyLzxzb3VyY2U+YCwgbm90IGAvc2NyaXB0cy88c291cmNlPmAuIFBvaW50aW5nIHRvIGEgZmlsZSBhcyBzb3VyY2Ugcm9vdFxuICAgICAgLy8gZG9lcyBub3QgbWFrZSBzZW5zZS5cbiAgICAgIGZ1bGxVcmwgPSByZXNvbHZlVXJsKG1hcFVybCwgc291cmNlUm9vdC5yZXBsYWNlKGVuZGluZ1NsYXNoLCBcIi9cIiksIG1hcC5zb3VyY2VzW2luZGV4XSlcbiAgICB9XG4gICAgc291cmNlQ29udGVudCA9IChtYXAuc291cmNlc0NvbnRlbnQgfHwgW10pW2luZGV4XVxuICAgIGZuKGZ1bGxVcmwsIHNvdXJjZUNvbnRlbnQsIGluZGV4KVxuICB9XG59XG5cblxuXG5mdW5jdGlvbiByZXNvbHZlKGNvZGUsIGNvZGVVcmwsIHJlYWQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHt9XG4gIH1cbiAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICB2YXIgbWFwVXJsID0gY29kZVVybFxuICAgIHZhciBkYXRhID0ge1xuICAgICAgc291cmNlTWFwcGluZ1VSTDogbnVsbCxcbiAgICAgIHVybDogbWFwVXJsLFxuICAgICAgc291cmNlc1JlbGF0aXZlVG86IG1hcFVybCxcbiAgICAgIG1hcDogbnVsbFxuICAgIH1cbiAgICB2YXIgcmVhZFVybCA9IGN1c3RvbURlY29kZVVyaUNvbXBvbmVudChtYXBVcmwpXG4gICAgcmVhZChyZWFkVXJsLCBmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgZXJyb3Iuc291cmNlTWFwRGF0YSA9IGRhdGFcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycm9yKVxuICAgICAgfVxuICAgICAgZGF0YS5tYXAgPSBTdHJpbmcocmVzdWx0KVxuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YS5tYXAgPSBwYXJzZU1hcFRvSlNPTihkYXRhLm1hcCwgZGF0YSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnJvcilcbiAgICAgIH1cbiAgICAgIF9yZXNvbHZlU291cmNlcyhkYXRhKVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgcmVzb2x2ZVNvdXJjZU1hcChjb2RlLCBjb2RlVXJsLCByZWFkLCBmdW5jdGlvbihlcnJvciwgbWFwRGF0YSkge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnJvcilcbiAgICAgIH1cbiAgICAgIGlmICghbWFwRGF0YSkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgbnVsbClcbiAgICAgIH1cbiAgICAgIF9yZXNvbHZlU291cmNlcyhtYXBEYXRhKVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBfcmVzb2x2ZVNvdXJjZXMobWFwRGF0YSkge1xuICAgIHJlc29sdmVTb3VyY2VzKG1hcERhdGEubWFwLCBtYXBEYXRhLnNvdXJjZXNSZWxhdGl2ZVRvLCByZWFkLCBvcHRpb25zLCBmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycm9yKVxuICAgICAgfVxuICAgICAgbWFwRGF0YS5zb3VyY2VzUmVzb2x2ZWQgPSByZXN1bHQuc291cmNlc1Jlc29sdmVkXG4gICAgICBtYXBEYXRhLnNvdXJjZXNDb250ZW50ICA9IHJlc3VsdC5zb3VyY2VzQ29udGVudFxuICAgICAgY2FsbGJhY2sobnVsbCwgbWFwRGF0YSlcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTeW5jKGNvZGUsIGNvZGVVcmwsIHJlYWQsIG9wdGlvbnMpIHtcbiAgdmFyIG1hcERhdGFcbiAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICB2YXIgbWFwVXJsID0gY29kZVVybFxuICAgIG1hcERhdGEgPSB7XG4gICAgICBzb3VyY2VNYXBwaW5nVVJMOiBudWxsLFxuICAgICAgdXJsOiBtYXBVcmwsXG4gICAgICBzb3VyY2VzUmVsYXRpdmVUbzogbWFwVXJsLFxuICAgICAgbWFwOiBudWxsXG4gICAgfVxuICAgIG1hcERhdGEubWFwID0gcmVhZFN5bmMocmVhZCwgbWFwVXJsLCBtYXBEYXRhKVxuICAgIG1hcERhdGEubWFwID0gcGFyc2VNYXBUb0pTT04obWFwRGF0YS5tYXAsIG1hcERhdGEpXG4gIH0gZWxzZSB7XG4gICAgbWFwRGF0YSA9IHJlc29sdmVTb3VyY2VNYXBTeW5jKGNvZGUsIGNvZGVVcmwsIHJlYWQpXG4gICAgaWYgKCFtYXBEYXRhKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuICB2YXIgcmVzdWx0ID0gcmVzb2x2ZVNvdXJjZXNTeW5jKG1hcERhdGEubWFwLCBtYXBEYXRhLnNvdXJjZXNSZWxhdGl2ZVRvLCByZWFkLCBvcHRpb25zKVxuICBtYXBEYXRhLnNvdXJjZXNSZXNvbHZlZCA9IHJlc3VsdC5zb3VyY2VzUmVzb2x2ZWRcbiAgbWFwRGF0YS5zb3VyY2VzQ29udGVudCAgPSByZXN1bHQuc291cmNlc0NvbnRlbnRcbiAgcmV0dXJuIG1hcERhdGFcbn1cblxuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICByZXNvbHZlU291cmNlTWFwOiAgICAgcmVzb2x2ZVNvdXJjZU1hcCxcbiAgcmVzb2x2ZVNvdXJjZU1hcFN5bmM6IHJlc29sdmVTb3VyY2VNYXBTeW5jLFxuICByZXNvbHZlU291cmNlczogICAgICAgcmVzb2x2ZVNvdXJjZXMsXG4gIHJlc29sdmVTb3VyY2VzU3luYzogICByZXNvbHZlU291cmNlc1N5bmMsXG4gIHJlc29sdmU6ICAgICAgICAgICAgICByZXNvbHZlLFxuICByZXNvbHZlU3luYzogICAgICAgICAgcmVzb2x2ZVN5bmMsXG4gIHBhcnNlTWFwVG9KU09OOiAgICAgICBwYXJzZU1hcFRvSlNPTlxufVxuIiwgIlxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBTb3VyY2VNYXAgPSByZXF1aXJlKCdzb3VyY2UtbWFwJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIFNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnc291cmNlLW1hcCcpLlNvdXJjZU1hcENvbnN1bWVyO1xudmFyIHNvdXJjZU1hcFJlc29sdmUgPSByZXF1aXJlKCdzb3VyY2UtbWFwLXJlc29sdmUnKTtcbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcblxuLyoqXG4gKiBFeHBvc2UgYG1peGluKClgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gbWl4aW47XG5cbi8qKlxuICogRW5zdXJlIFdpbmRvd3Mtc3R5bGUgcGF0aHMgYXJlIGZvcm1hdHRlZCBwcm9wZXJseVxuICovXG5cbmNvbnN0IG1ha2VGcmllbmRseVBhdGggPSBmdW5jdGlvbihhUGF0aCkge1xuICByZXR1cm4gcGF0aC5zZXAgPT09IFwiXFxcXFwiID8gYVBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikucmVwbGFjZSgvXlthLXpdOlxcLz8vaSwgXCIvXCIpIDogYVBhdGg7XG59XG5cbi8qKlxuICogTWl4aW4gc291cmNlIG1hcCBzdXBwb3J0IGludG8gYGNvbXBpbGVyYC5cbiAqXG4gKiBAcGFyYW0ge0NvbXBpbGVyfSBjb21waWxlclxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBtaXhpbihjb21waWxlcikge1xuICBjb21waWxlci5fY29tbWVudCA9IGNvbXBpbGVyLmNvbW1lbnQ7XG4gIGNvbXBpbGVyLm1hcCA9IG5ldyBTb3VyY2VNYXAoKTtcbiAgY29tcGlsZXIucG9zaXRpb24gPSB7IGxpbmU6IDEsIGNvbHVtbjogMSB9O1xuICBjb21waWxlci5maWxlcyA9IHt9O1xuICBmb3IgKHZhciBrIGluIGV4cG9ydHMpIGNvbXBpbGVyW2tdID0gZXhwb3J0c1trXTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy51cGRhdGVQb3NpdGlvbiA9IGZ1bmN0aW9uKHN0cikge1xuICB2YXIgbGluZXMgPSBzdHIubWF0Y2goL1xcbi9nKTtcbiAgaWYgKGxpbmVzKSB0aGlzLnBvc2l0aW9uLmxpbmUgKz0gbGluZXMubGVuZ3RoO1xuICB2YXIgaSA9IHN0ci5sYXN0SW5kZXhPZignXFxuJyk7XG4gIHRoaXMucG9zaXRpb24uY29sdW1uID0gfmkgPyBzdHIubGVuZ3RoIC0gaSA6IHRoaXMucG9zaXRpb24uY29sdW1uICsgc3RyLmxlbmd0aDtcbn07XG5cbi8qKlxuICogRW1pdCBgc3RyYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge09iamVjdH0gW3Bvc11cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuZW1pdCA9IGZ1bmN0aW9uKHN0ciwgcG9zKSB7XG4gIGlmIChwb3MpIHtcbiAgICB2YXIgc291cmNlRmlsZSA9IG1ha2VGcmllbmRseVBhdGgocG9zLnNvdXJjZSB8fCAnc291cmNlLmNzcycpO1xuXG4gICAgdGhpcy5tYXAuYWRkTWFwcGluZyh7XG4gICAgICBzb3VyY2U6IHNvdXJjZUZpbGUsXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgbGluZTogdGhpcy5wb3NpdGlvbi5saW5lLFxuICAgICAgICBjb2x1bW46IE1hdGgubWF4KHRoaXMucG9zaXRpb24uY29sdW1uIC0gMSwgMClcbiAgICAgIH0sXG4gICAgICBvcmlnaW5hbDoge1xuICAgICAgICBsaW5lOiBwb3Muc3RhcnQubGluZSxcbiAgICAgICAgY29sdW1uOiBwb3Muc3RhcnQuY29sdW1uIC0gMVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRGaWxlKHNvdXJjZUZpbGUsIHBvcyk7XG4gIH1cblxuICB0aGlzLnVwZGF0ZVBvc2l0aW9uKHN0cik7XG5cbiAgcmV0dXJuIHN0cjtcbn07XG5cbi8qKlxuICogQWRkcyBhIGZpbGUgdG8gdGhlIHNvdXJjZSBtYXAgb3V0cHV0IGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFkZGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gZmlsZVxuICogQHBhcmFtIHtPYmplY3R9IHBvc1xuICovXG5cbmV4cG9ydHMuYWRkRmlsZSA9IGZ1bmN0aW9uKGZpbGUsIHBvcykge1xuICBpZiAodHlwZW9mIHBvcy5jb250ZW50ICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuZmlsZXMsIGZpbGUpKSByZXR1cm47XG5cbiAgdGhpcy5maWxlc1tmaWxlXSA9IHBvcy5jb250ZW50O1xufTtcblxuLyoqXG4gKiBBcHBsaWVzIGFueSBvcmlnaW5hbCBzb3VyY2UgbWFwcyB0byB0aGUgb3V0cHV0IGFuZCBlbWJlZHMgdGhlIHNvdXJjZSBmaWxlXG4gKiBjb250ZW50cyBpbiB0aGUgc291cmNlIG1hcC5cbiAqL1xuXG5leHBvcnRzLmFwcGx5U291cmNlTWFwcyA9IGZ1bmN0aW9uKCkge1xuICBPYmplY3Qua2V5cyh0aGlzLmZpbGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGZpbGUpIHtcbiAgICB2YXIgY29udGVudCA9IHRoaXMuZmlsZXNbZmlsZV07XG4gICAgdGhpcy5tYXAuc2V0U291cmNlQ29udGVudChmaWxlLCBjb250ZW50KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuaW5wdXRTb3VyY2VtYXBzICE9PSBmYWxzZSkge1xuICAgICAgdmFyIG9yaWdpbmFsTWFwID0gc291cmNlTWFwUmVzb2x2ZS5yZXNvbHZlU3luYyhcbiAgICAgICAgY29udGVudCwgZmlsZSwgZnMucmVhZEZpbGVTeW5jKTtcbiAgICAgIGlmIChvcmlnaW5hbE1hcCkge1xuICAgICAgICB2YXIgbWFwID0gbmV3IFNvdXJjZU1hcENvbnN1bWVyKG9yaWdpbmFsTWFwLm1hcCk7XG4gICAgICAgIHZhciByZWxhdGl2ZVRvID0gb3JpZ2luYWxNYXAuc291cmNlc1JlbGF0aXZlVG87XG4gICAgICAgIHRoaXMubWFwLmFwcGx5U291cmNlTWFwKG1hcCwgZmlsZSwgbWFrZUZyaWVuZGx5UGF0aChwYXRoLmRpcm5hbWUocmVsYXRpdmVUbykpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHRoaXMpO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzIGNvbW1lbnRzLCBkcm9wcyBzb3VyY2VNYXAgY29tbWVudHMuXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZVxuICovXG5cbmV4cG9ydHMuY29tbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgaWYgKC9eIyBzb3VyY2VNYXBwaW5nVVJMPS8udGVzdChub2RlLmNvbW1lbnQpKVxuICAgIHJldHVybiB0aGlzLmVtaXQoJycsIG5vZGUucG9zaXRpb24pO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX2NvbW1lbnQobm9kZSk7XG59O1xuIiwgIlxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBDb21wcmVzc2VkID0gcmVxdWlyZSgnLi9jb21wcmVzcycpO1xudmFyIElkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIFN0cmluZ2Z5IHRoZSBnaXZlbiBBU1QgYG5vZGVgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGNvbXByZXNzYCBzcGFjZS1vcHRpbWl6ZWQgb3V0cHV0XG4gKiAgLSBgc291cmNlbWFwYCByZXR1cm4gYW4gb2JqZWN0IHdpdGggYC5jb2RlYCBhbmQgYC5tYXBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihub2RlLCBvcHRpb25zKXtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgdmFyIGNvbXBpbGVyID0gb3B0aW9ucy5jb21wcmVzc1xuICAgID8gbmV3IENvbXByZXNzZWQob3B0aW9ucylcbiAgICA6IG5ldyBJZGVudGl0eShvcHRpb25zKTtcblxuICAvLyBzb3VyY2UgbWFwc1xuICBpZiAob3B0aW9ucy5zb3VyY2VtYXApIHtcbiAgICB2YXIgc291cmNlbWFwcyA9IHJlcXVpcmUoJy4vc291cmNlLW1hcC1zdXBwb3J0Jyk7XG4gICAgc291cmNlbWFwcyhjb21waWxlcik7XG5cbiAgICB2YXIgY29kZSA9IGNvbXBpbGVyLmNvbXBpbGUobm9kZSk7XG4gICAgY29tcGlsZXIuYXBwbHlTb3VyY2VNYXBzKCk7XG5cbiAgICB2YXIgbWFwID0gb3B0aW9ucy5zb3VyY2VtYXAgPT09ICdnZW5lcmF0b3InXG4gICAgICA/IGNvbXBpbGVyLm1hcFxuICAgICAgOiBjb21waWxlci5tYXAudG9KU09OKCk7XG5cbiAgICByZXR1cm4geyBjb2RlOiBjb2RlLCBtYXA6IG1hcCB9O1xuICB9XG5cbiAgdmFyIGNvZGUgPSBjb21waWxlci5jb21waWxlKG5vZGUpO1xuICByZXR1cm4gY29kZTtcbn07XG4iLCAiZXhwb3J0cy5wYXJzZSA9IHJlcXVpcmUoJy4vbGliL3BhcnNlJyk7XG5leHBvcnRzLnN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vbGliL3N0cmluZ2lmeScpO1xuIiwgImltcG9ydCB7IE1hcmtkb3duVmlldywgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgQ29tcGFydG1lbnQgfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgeyBJbmxpbmVBZG1vbml0aW9uU2V0dGluZ1RhYiB9IGZyb20gXCIuL3NyYy9zZXR0aW5ncy9pbmxpbmVBZG1vbml0aW9uU2V0dGluZ1RhYlwiO1xuaW1wb3J0IHsgSW5saW5lQWRtb25pdGlvblNldHRpbmdzLCBJbmxpbmVBZG1vbml0aW9uU2V0dGluZ3NJTyB9IGZyb20gXCIuL3NyYy9zZXR0aW5ncy9pbmxpbmVBZG1vbml0aW9uU2V0dGluZ3NcIjtcbmltcG9ydCB7IElubGluZUFkbW9uaXRpb25zUG9zdFByb2Nlc3NvciB9IGZyb20gXCIuL3NyYy9JbmxpbmVBZG1vbml0aW9ucy9pbmxpbmVBZG1vbml0aW9uc1Bvc3RQcm9jZXNzb3JcIjtcbmltcG9ydCB7IGlubGluZUFkbW9uaXRpb25QbHVnaW4gfSBmcm9tIFwiLi9zcmMvSW5saW5lQWRtb25pdGlvbnMvSW5saW5lQWRtb25pdGlvbkV4dGVuc2lvblwiO1xuaW1wb3J0IHsgc2V0Q3NzRm9yQ2xhc3MsIHdpcGVDc3MgfSBmcm9tIFwiLi9zcmMvaW8vaW5saW5lQWRtb25pdGlvbkNzc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbmxpbmVBZG1vbml0aW9uUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcblx0c2V0dGluZ3M6IElubGluZUFkbW9uaXRpb25TZXR0aW5ncztcblx0cHJpdmF0ZSBpbmxpbmVBZG1vbml0aW9uQ29tcGFydG1lbnQ6IENvbXBhcnRtZW50O1xuXG5cdGFzeW5jIG9ubG9hZCgpIHtcblx0XHRjb25zb2xlLmxvZyhcIkxvYWRpbmcgSW5saW5lIEFkbW9uaXRpb25zLlwiKTtcblx0XHR0aGlzLmlubGluZUFkbW9uaXRpb25Db21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG5cblx0XHRjb25zdCBleHRlbnNpb24gPSB0aGlzLmlubGluZUFkbW9uaXRpb25Db21wYXJ0bWVudC5vZihcblx0XHRcdGlubGluZUFkbW9uaXRpb25QbHVnaW4oQXJyYXkuZnJvbSh0aGlzLnNldHRpbmdzLmlubGluZUFkbW9uaXRpb25zLnZhbHVlcygpKSlcblx0XHQpO1xuXHRcdHRoaXMucmVnaXN0ZXJFZGl0b3JFeHRlbnNpb24oZXh0ZW5zaW9uKTtcblxuXHRcdHRoaXMucmVnaXN0ZXJNYXJrZG93blBvc3RQcm9jZXNzb3IoKGVsZW1lbnQsIGNvbnRleHQpID0+IHtcblx0XHRcdG5ldyBJbmxpbmVBZG1vbml0aW9uc1Bvc3RQcm9jZXNzb3IodGhpcy5zZXR0aW5ncykucG9zdFByb2Nlc3MoZWxlbWVudCwgY29udGV4dCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IElubGluZUFkbW9uaXRpb25TZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG5cdH1cblxuXHRvbnVubG9hZCgpIHtcblx0XHQvLyBVbmxvYWQgYW55IHJlc291cmNlcyBpZiBuZWNlc3Nhcnlcblx0fVxuXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcblx0XHRjb25zdCBzZXR0aW5nRGF0YSA9IGF3YWl0IHRoaXMubG9hZERhdGEoKTtcblx0XHRjb25zdCBbc2V0dGluZ3MsIGRhdGFNaWdyYXRlZF0gPSBJbmxpbmVBZG1vbml0aW9uU2V0dGluZ3NJTy51bm1hcnNoYWxBbmRNaWdyYXRlKHNldHRpbmdEYXRhKTtcblx0XHR0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG5cdFx0aWYgKGRhdGFNaWdyYXRlZCkge1xuXHRcdFx0YXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcblx0XHR9XG5cdFx0YXdhaXQgdGhpcy5yZWZyZXNoQ3NzKCk7XG5cdH1cblxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG5cdFx0Y29uc3Qgc2V0dGluZ0RhdGEgPSBJbmxpbmVBZG1vbml0aW9uU2V0dGluZ3NJTy5tYXJzaGFsKHRoaXMuc2V0dGluZ3MpO1xuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEoc2V0dGluZ0RhdGEpO1xuXHRcdGF3YWl0IHRoaXMucmVmcmVzaENzcygpO1xuXHRcdHRoaXMucmVyZW5kZXJNYXJrZG93blZpZXdzKCk7XG5cdFx0dGhpcy51cGRhdGVFZGl0b3JFeHRlbnNpb25zKCk7XG5cdH1cblxuXHRhc3luYyByZWZyZXNoQ3NzKCkge1xuXHRcdGF3YWl0IHdpcGVDc3ModGhpcy5hcHApO1xuXHRcdGZvciAoY29uc3QgaWFkIG9mIHRoaXMuc2V0dGluZ3MuaW5saW5lQWRtb25pdGlvbnMudmFsdWVzKCkpIHtcblx0XHRcdGF3YWl0IHNldENzc0ZvckNsYXNzKHRoaXMuYXBwLCBpYWQuY3NzQ2xhc3NlcygpLmxhc3QoKSwgaWFkLnNpbXBsZVN0eWxlKCkpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcmVyZW5kZXJNYXJrZG93blZpZXdzKCkge1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuXHRcdHZpZXc/LnByZXZpZXdNb2RlLnJlcmVuZGVyKHRydWUpO1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVFZGl0b3JFeHRlbnNpb25zKCkge1xuXHRcdGNvbnN0IG5ld0V4dGVuc2lvbiA9IGlubGluZUFkbW9uaXRpb25QbHVnaW4oQXJyYXkuZnJvbSh0aGlzLnNldHRpbmdzLmlubGluZUFkbW9uaXRpb25zLnZhbHVlcygpKSk7XG5cdFx0dGhpcy5hcHAud29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMobGVhZiA9PiB7XG5cdFx0XHRpZiAobGVhZi52aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3ICYmIGxlYWYudmlldy5lZGl0b3IpIHtcblx0XHRcdFx0Y29uc3QgZWRpdG9yID0gbGVhZi52aWV3LmVkaXRvcjtcblx0XHRcdFx0Y29uc3QgY20gPSBlZGl0b3IuY207XG5cblx0XHRcdFx0Y20uZGlzcGF0Y2goe1xuXHRcdFx0XHRcdGVmZmVjdHM6IHRoaXMuaW5saW5lQWRtb25pdGlvbkNvbXBhcnRtZW50LnJlY29uZmlndXJlKG5ld0V4dGVuc2lvbilcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cbiIsICIvLyBTZXR0aW5nc1xuaW1wb3J0IHtBcHAsIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmd9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHtFZGl0SW5saW5lQWRtb25pdGlvbk1vZGFsfSBmcm9tIFwiLi9lZGl0SW5saW5lQWRtb25pdGlvbk1vZGFsXCI7XG5pbXBvcnQgSW5saW5lQWRtb25pdGlvblBsdWdpbiBmcm9tIFwiLi4vLi4vbWFpblwiO1xuaW1wb3J0IHtJbmxpbmVBZG1vbml0aW9ufSBmcm9tIFwiLi4vSW5saW5lQWRtb25pdGlvbnMvaW5saW5lQWRtb25pdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgSW5saW5lQWRtb25pdGlvblNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0cGx1Z2luOiBJbmxpbmVBZG1vbml0aW9uUGx1Z2luO1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IElubGluZUFkbW9uaXRpb25QbHVnaW4pIHtcblx0XHRzdXBlcihhcHAsIHBsdWdpbik7XG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XG5cdH1cblxuXHRkaXNwbGF5KCk6IHZvaWQge1xuXHRcdGNvbnN0IHtjb250YWluZXJFbH0gPSB0aGlzO1xuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cblx0XHQvLyBDcmVhdGUgSW5saW5lIEFkbW9uaXRpb24gQnV0dG9uXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuYWRkQnV0dG9uKGIgPT4gYlxuXHRcdFx0XHQuc2V0QnV0dG9uVGV4dChcIkNyZWF0ZSBuZXcgaW5saW5lIGFkbW9uaXRpb25cIilcblx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgZXZ0ID0+IHtcblx0XHRcdFx0XHRFZGl0SW5saW5lQWRtb25pdGlvbk1vZGFsLm5ldyh0aGlzLmFwcCwgYXN5bmMgcmVzdWx0ID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmlubGluZUFkbW9uaXRpb25zLnNldChyZXN1bHQuc2x1ZywgcmVzdWx0KTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0dGhpcy5yZWJ1aWxkU2V0dGluZ1Jvd3MoY29udGFpbmVyRWwpO1xuXHRcdFx0XHRcdH0pLm9wZW4oKTtcblx0XHRcdFx0fSkpO1xuXG5cdFx0dGhpcy5yZWJ1aWxkU2V0dGluZ1Jvd3MoY29udGFpbmVyRWwpO1xuXHR9XG5cblx0Ly8gUmVuZGVycyB0aGUgXCJzYW1wbGVzXCIgd2l0aCBvcHRpb25zIGluIHRoZSBtYWluIHNldHRpbmdzIHZpZXdcblx0cHJpdmF0ZSByZWJ1aWxkU2V0dGluZ1Jvd3MoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSB7XG5cdFx0Y29udGFpbmVyRWwuZmluZEFsbChcIi5pYWQtc2V0dGluZy1yb3dcIikuZm9yRWFjaChlID0+IGUucmVtb3ZlKCkpO1xuXHRcdG5ldyBNYXAoWy4uLnRoaXMucGx1Z2luLnNldHRpbmdzLmlubGluZUFkbW9uaXRpb25zXS5zb3J0KCkpLmZvckVhY2goKGlhZCwgaWRlbnRpZmllcikgPT4ge1xuXHRcdFx0dGhpcy5kaXNwbGF5U2FtcGxlSUFEKGNvbnRhaW5lckVsLCBpYWQsIGlkZW50aWZpZXIpO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gUmVuZGVycyBhIHNpbmdsZSBJbmxpbmUgQWRtb25pdGlvbiBcInNhbXBsZVwiIHdpdGggb3B0aW9uc1xuXHRwcml2YXRlIGRpc3BsYXlTYW1wbGVJQUQoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LCBpYWQ6IElubGluZUFkbW9uaXRpb24sIGlkZW50aWZpZXI6IHN0cmluZykge1xuXHRcdGNvbnN0IHJvdzogSFRNTEVsZW1lbnQgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoKTtcblx0XHRyb3cuYWRkQ2xhc3MoXCJpYWQtc2V0dGluZy1yb3dcIilcblxuXHRcdHJvdy5jcmVhdGVTcGFuKHtcblx0XHRcdHRleHQ6IGlhZC50eXBlICsgXCIgVHlwZVwiLFxuXHRcdFx0Y2xzOiBcImlhZC1zZXR0aW5nLXJvdy10aXRsZVwiXG5cdFx0fSk7XG5cblx0XHRyb3cuY3JlYXRlRWwoXCJjb2RlXCIsIHtcblx0XHRcdHRleHQ6IGlhZC5zYW1wbGVUZXh0KCksXG5cdFx0XHRjbHM6IFwiaWFkIGlhZC1zYW1wbGUgaWFkLVwiICsgaWFkLnNsdWcsXG5cdFx0XHRwYXJlbnQ6IHJvdyxcblx0XHRcdGF0dHI6IHtcInN0eWxlXCI6IGlhZC5zaW1wbGVTdHlsZSgpICsgYDsgbWFyZ2luOiAwLjVlbTtgfVxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgZWRpdEJ1dHRvbiA9IHJvdy5jcmVhdGVFbChcImJ1dHRvblwiLCB7dGV4dDogXCJFZGl0XCJ9KVxuXHRcdGVkaXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGV2dCA9PiB7XG5cdFx0XHRFZGl0SW5saW5lQWRtb25pdGlvbk1vZGFsLmVkaXQodGhpcy5hcHAsIGlhZCwgYXN5bmMgcmVzdWx0ID0+IHtcblx0XHRcdFx0Ly8gaWYgdGhlIGlhZCBwcmVmaXggY2hhbmdlZCwgd2UgbmVlZCB0byBraWxsIHRoZSBvcmlnaW5hbFxuXHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5pbmxpbmVBZG1vbml0aW9ucy5kZWxldGUoaWRlbnRpZmllcik7XG5cdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmlubGluZUFkbW9uaXRpb25zLnNldChyZXN1bHQuc2x1ZywgcmVzdWx0KTtcblx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdHRoaXMucmVidWlsZFNldHRpbmdSb3dzKGNvbnRhaW5lckVsKTtcblx0XHRcdH0pLm9wZW4oKTtcblx0XHR9KTtcblxuXHRcdGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IHJvdy5jcmVhdGVFbChcImJ1dHRvblwiLCB7dGV4dDogXCJEZWxldGVcIn0pXG5cdFx0ZGVsZXRlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyBldnQgPT4ge1xuXHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuaW5saW5lQWRtb25pdGlvbnMuZGVsZXRlKGlkZW50aWZpZXIpO1xuXHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRyb3cucmVtb3ZlKCk7XG5cdFx0fSk7XG5cdH1cbn1cbiIsICIvLyBNb2RlbCB0byBlZGl0IGEgc2luZ2xlIElubGluZSBBZG1vbml0aW9uJ3Mgc2V0dGluZ3NcbmltcG9ydCB7QXBwLCBNb2RhbCwgU2V0dGluZ30gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQge0lubGluZUFkbW9uaXRpb259IGZyb20gXCIuLi9JbmxpbmVBZG1vbml0aW9ucy9pbmxpbmVBZG1vbml0aW9uXCI7XG5pbXBvcnQge1ByZWZpeElubGluZUFkbW9uaXRpb259IGZyb20gXCIuLi9JbmxpbmVBZG1vbml0aW9ucy9wcmVmaXhJbmxpbmVBZG1vbml0aW9uXCI7XG5pbXBvcnQge0lubGluZUFkbW9uaXRpb25UeXBlLCBUeXBlVG9vbHRpcE1vZGFsfSBmcm9tIFwiLi4vSW5saW5lQWRtb25pdGlvbnMvaW5saW5lQWRtb25pdGlvblR5cGVcIjtcblxuZXhwb3J0IGNsYXNzIEVkaXRJbmxpbmVBZG1vbml0aW9uTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG5cdHJlc3VsdDogSW5saW5lQWRtb25pdGlvbjtcblx0b25TdWJtaXQ6IChyZXN1bHQ6IElubGluZUFkbW9uaXRpb24pID0+IHZvaWQ7XG5cdHNhbXBsZTogSFRNTEVsZW1lbnQ7XG5cdHByaXZhdGUgdHlwZVNldHRpbmdzOiBBcnJheTxTZXR0aW5nPiA9IG5ldyBBcnJheTxTZXR0aW5nPigpO1xuXG5cdHN0YXRpYyBlZGl0KGFwcDogQXBwLCB0b0VkaXQ6IElubGluZUFkbW9uaXRpb24sIG9uU3VibWl0OiAocmVzdWx0OiBJbmxpbmVBZG1vbml0aW9uKSA9PiB2b2lkKSB7XG5cdFx0cmV0dXJuIG5ldyBFZGl0SW5saW5lQWRtb25pdGlvbk1vZGFsKGFwcCwgdG9FZGl0LCBvblN1Ym1pdCk7XG5cdH1cblxuXHRzdGF0aWMgbmV3KGFwcDogQXBwLCBvblN1Ym1pdDogKHJlc3VsdDogSW5saW5lQWRtb25pdGlvbikgPT4gdm9pZCkge1xuXHRcdHJldHVybiBuZXcgRWRpdElubGluZUFkbW9uaXRpb25Nb2RhbChhcHAsIFByZWZpeElubGluZUFkbW9uaXRpb24uY3JlYXRlKCksIG9uU3VibWl0KTtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCB0b0VkaXQ6IElubGluZUFkbW9uaXRpb24sIG9uU3VibWl0OiAocmVzdWx0OiBJbmxpbmVBZG1vbml0aW9uKSA9PiB2b2lkKSB7XG5cdFx0c3VwZXIoYXBwKTtcblx0XHR0aGlzLnJlc3VsdCA9IHRvRWRpdCA/IHRvRWRpdCA6IFByZWZpeElubGluZUFkbW9uaXRpb24uY3JlYXRlKCk7XG5cdFx0dGhpcy5vblN1Ym1pdCA9IG9uU3VibWl0O1xuXHR9XG5cblx0b25PcGVuKCkge1xuXHRcdGNvbnN0IHtjb250ZW50RWx9ID0gdGhpcztcblxuXHRcdGNvbnRlbnRFbC5jcmVhdGVFbChcImJyXCIpO1xuXG5cdFx0Y29uc3Qgc3VibWl0U2V0dGluZyA9IG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcblx0XHRcdC5hZGRCdXR0b24oKGJ0bikgPT4gYnRuXG5cdFx0XHRcdC5zZXRCdXR0b25UZXh0KFwiU3VibWl0XCIpXG5cdFx0XHRcdC5zZXRDdGEoKVxuXHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdFx0XHRcdHRoaXMub25TdWJtaXQodGhpcy5yZXN1bHQpO1xuXHRcdFx0XHR9KSlcblxuXHRcdHRoaXMuc2FtcGxlID0gc3VibWl0U2V0dGluZy5uYW1lRWwuY3JlYXRlRWwoXCJjb2RlXCIsIHtcblx0XHRcdHRleHQ6IHRoaXMucmVzdWx0LnNhbXBsZVRleHQoKSxcblx0XHRcdGNsczogXCJpYWQgaWFkLXNhbXBsZSBpYWQtc2FtcGxlLWVkaXRvciBpYWQtXCIgKyB0aGlzLnJlc3VsdC5zbHVnLFxuXHRcdFx0YXR0cjoge1wic3R5bGVcIjogdGhpcy5yZXN1bHQuc2ltcGxlU3R5bGUoKX1cblx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcblx0XHRcdC5zZXROYW1lKFwiQmFja2dyb3VuZCBjb2xvclwiKVxuXHRcdFx0LnNldERlc2MoXCJDb2xvciBvZiB0aGUgYmFja2dyb3VuZCBvZiB0aGUgaW5saW5lIGFkbW9uaXRpb25cIilcblx0XHRcdC5hZGRDb2xvclBpY2tlcihjcCA9PiBjcFxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5yZXN1bHQuYmFja2dyb3VuZENvbG9yKVxuXHRcdFx0XHQub25DaGFuZ2UodmFsID0+IHtcblx0XHRcdFx0XHR0aGlzLnJlc3VsdC5iYWNrZ3JvdW5kQ29sb3IgPSB2YWw7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGVTYW1wbGUoKTtcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0bmV3IFNldHRpbmcoY29udGVudEVsKVxuXHRcdFx0LnNldE5hbWUoXCJCYWNrZ3JvdW5kIG9wYWNpdHkgKDAlIC0gMTAwJSlcIilcblx0XHRcdC5zZXREZXNjKFwiUGVyY2VudGFnZSBvZiBvcGFjaXR5IHRvIGFwcGx5IHRvIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLiAwJSBpcyBmdWxseSB0cmFuc3BhcmVudC5cIilcblx0XHRcdC5hZGRTbGlkZXIocyA9PiBzXG5cdFx0XHRcdC5zZXRMaW1pdHMoMCwgMTAwLCAxKVxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5yZXN1bHQuYmdDb2xvck9wYWNpdHlQZXJjZW50KVxuXHRcdFx0XHQub25DaGFuZ2UodmFsID0+IHtcblx0XHRcdFx0XHR0aGlzLnJlc3VsdC5iZ0NvbG9yT3BhY2l0eVBlcmNlbnQgPSB2YWw7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGVTYW1wbGUoKTtcblx0XHRcdFx0fSkpO1xuXHRcdG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcblx0XHRcdC5zZXROYW1lKFwiVGV4dCBjb2xvclwiKVxuXHRcdFx0LnNldERlc2MoXCJDb2xvciBvZiB0aGUgdGV4dCBvZiB0aGUgaW5saW5lIGFkbW9uaXRpb25cIilcblx0XHRcdC5hZGRDb2xvclBpY2tlcihjcCA9PiBjcFxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5yZXN1bHQuY29sb3IpXG5cdFx0XHRcdC5vbkNoYW5nZSh2YWwgPT4ge1xuXHRcdFx0XHRcdHRoaXMucmVzdWx0LmNvbG9yID0gdmFsO1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlU2FtcGxlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcblx0XHRcdC5zZXROYW1lKFwiVGV4dCBjb2xvciBvcGFjaXR5ICgwJSAtIDEwMCUpXCIpXG5cdFx0XHQuc2V0RGVzYyhcIlBlcmNlbnRhZ2Ugb2Ygb3BhY2l0eSB0byBhcHBseSB0byB0aGUgdGV4dCBjb2xvci4gMCUgaXMgZnVsbHkgdHJhbnNwYXJlbnQuXCIpXG5cdFx0XHQuYWRkU2xpZGVyKHMgPT4gc1xuXHRcdFx0XHQuc2V0TGltaXRzKDAsIDEwMCwgMSlcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucmVzdWx0LmNvbG9yT3BhY2l0eVBlcmNlbnQpXG5cdFx0XHRcdC5vbkNoYW5nZSh2YWwgPT4ge1xuXHRcdFx0XHRcdHRoaXMucmVzdWx0LmNvbG9yT3BhY2l0eVBlcmNlbnQgPSB2YWw7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGVTYW1wbGUoKTtcblx0XHRcdFx0fSkpO1xuXHRcdG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcblx0XHRcdC5zZXROYW1lKFwiVHlwZVwiKVxuXHRcdFx0LnNldERlc2MoXCJUaGUgd2F5IHRoZSBJbmxpbmUgQWRtb25pdGlvbiBpcyB0cmlnZ2VyZWRcIilcblx0XHRcdC5zZXRUb29sdGlwKElubGluZUFkbW9uaXRpb25UeXBlLnRvb2x0aXAoKSlcblx0XHRcdC5hZGREcm9wZG93bihkYyA9PiBkY1xuXHRcdFx0XHQuYWRkT3B0aW9uKElubGluZUFkbW9uaXRpb25UeXBlLlByZWZpeCwgSW5saW5lQWRtb25pdGlvblR5cGUuUHJlZml4KVxuXHRcdFx0XHQuYWRkT3B0aW9uKElubGluZUFkbW9uaXRpb25UeXBlLlN1ZmZpeCwgSW5saW5lQWRtb25pdGlvblR5cGUuU3VmZml4KVxuXHRcdFx0XHQuYWRkT3B0aW9uKElubGluZUFkbW9uaXRpb25UeXBlLkNvbnRhaW5zLCBJbmxpbmVBZG1vbml0aW9uVHlwZS5Db250YWlucylcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucmVzdWx0LnR5cGUpXG5cdFx0XHRcdC5vbkNoYW5nZSh2YWx1ZSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5jbGVhclR5cGVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdGNvbnN0IG9sZCA9IHRoaXMucmVzdWx0O1xuXHRcdFx0XHRcdHRoaXMucmVzdWx0ID0gSW5saW5lQWRtb25pdGlvblR5cGUuY3JlYXRlRnJvbSh2YWx1ZSk7XG5cdFx0XHRcdFx0b2xkLmNvcHlTZXR0aW5nc1RvKHRoaXMucmVzdWx0KVxuXHRcdFx0XHRcdHRoaXMuYXBwZW5kVHlwZVNldHRpbmdzKGNvbnRlbnRFbCk7XG5cdFx0XHRcdH0pKVxuXHRcdFx0LmFkZEJ1dHRvbihidG4gPT4gYnRuXG5cdFx0XHRcdC5zZXRJY29uKFwiaGVscC1jaXJjbGVcIilcblx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdG5ldyBUeXBlVG9vbHRpcE1vZGFsKHRoaXMuYXBwKS5vcGVuKClcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHR0aGlzLmFwcGVuZFR5cGVTZXR0aW5ncyhjb250ZW50RWwpO1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVTYW1wbGUoKSB7XG5cdFx0dGhpcy5zYW1wbGUuc2V0VGV4dCh0aGlzLnJlc3VsdC5zYW1wbGVUZXh0KCkpO1xuXHRcdC8vIFRPRE8gLSBJIHRoaW5rIHRoaXMgc2hvdWxkIGJlIGV4dHJhY3RlZCBvdXQgc29tZXdoZXJlP1xuXHRcdHRoaXMuc2FtcGxlLnNldEF0dHIoXCJzdHlsZVwiLCB0aGlzLnJlc3VsdC5zaW1wbGVTdHlsZSgpICsgYG1hcmdpbjogMC41ZW07YCk7XG5cdH1cblxuXHRwcml2YXRlIGNsZWFyVHlwZVNldHRpbmdzKCkge1xuXHRcdHRoaXMudHlwZVNldHRpbmdzLmZvckVhY2godmFsdWUgPT4gdmFsdWUuc2V0dGluZ0VsLnJlbW92ZSgpKTtcblx0fVxuXG5cdHByaXZhdGUgYXBwZW5kVHlwZVNldHRpbmdzKGNvbnRlbnRFbDogSFRNTEVsZW1lbnQpIHtcblx0XHR0aGlzLnR5cGVTZXR0aW5ncyA9IHRoaXMucmVzdWx0LmJ1aWxkU2V0dGluZ3MoY29udGVudEVsLCAoKSA9PiB0aGlzLnVwZGF0ZVNhbXBsZSgpKTtcblx0fVxuXG5cdG9uQ2xvc2UoKSB7XG5cdFx0Y29uc3Qge2NvbnRlbnRFbH0gPSB0aGlzO1xuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xuXHR9XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIHNsdWdpZnkoc3RyOiBhbnkpIHtcblx0cmV0dXJuIFN0cmluZyhzdHIpXG5cdFx0Lm5vcm1hbGl6ZSgnTkZLRCcpIC8vIHNwbGl0IGFjY2VudGVkIGNoYXJhY3RlcnMgaW50byB0aGVpciBiYXNlIGNoYXJhY3RlcnMgYW5kIGRpYWNyaXRpY2FsIG1hcmtzXG5cdFx0LnJlcGxhY2UoL1tcXHUwMzAwLVxcdTAzNmZdL2csICcnKSAvLyByZW1vdmUgYWxsIHRoZSBhY2NlbnRzLCB3aGljaCBoYXBwZW4gdG8gYmUgYWxsIGluIHRoZSBcXHUwM3h4IFVOSUNPREUgYmxvY2suXG5cdFx0LnRyaW0oKSAvLyB0cmltIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZVxuXHRcdC50b0xvd2VyQ2FzZSgpIC8vIGNvbnZlcnQgdG8gbG93ZXJjYXNlXG5cdFx0LnJlcGxhY2UoL1teYS16MC05IC1dL2csICcnKSAvLyByZW1vdmUgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzXG5cdFx0LnJlcGxhY2UoL1xccysvZywgJy0nKSAvLyByZXBsYWNlIHNwYWNlcyB3aXRoIGh5cGhlbnNcblx0XHQucmVwbGFjZSgvLSsvZywgJy0nKTsgLy8gcmVtb3ZlIGNvbnNlY3V0aXZlIGh5cGhlbnNcbn1cblxuLy8gRnVuY3Rpb24gdG8gZW5jb2RlIGFyYml0cmFyeSBjaGFyYWN0ZXJzIGludG8gYSB2YWxpZCBmb3JtYXRcbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVDaGFyKGNoYXI6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IGNoYXJDb2RlID0gY2hhci5jaGFyQ29kZUF0KDApO1xuXHRyZXR1cm4gYF94JHtjaGFyQ29kZS50b1N0cmluZygxNikucGFkU3RhcnQoNCwgJzAnKX1fYDtcbn1cblxuLyoqXG4gKiBTYW5pdGl6ZXMgYSBzdHJpbmcgdG8gY3JlYXRlIGEgdmFsaWQgQ1NTIGNsYXNzIG5hbWUuXG4gKiBAcGFyYW0gaW5wdXQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIHNhbml0aXplZC5cbiAqIEByZXR1cm5zIEEgdmFsaWQgQ1NTIGNsYXNzIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUNsYXNzTmFtZShpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcblx0Ly8gRW5zdXJlIHRoZSBpbnB1dCBpcyBhIHN0cmluZyBhbmQgdHJpbSB3aGl0ZXNwYWNlXG5cdGlucHV0ID0gaW5wdXQudHJpbSgpO1xuXG5cdC8vIEFkZCB1bmRlcnNjb3JlIHByZWZpeCBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGludmFsaWRcblx0aWYgKCEvXlthLXpBLVpfXS8udGVzdChpbnB1dC5jaGFyQXQoMCkpKSB7XG5cdFx0aW5wdXQgPSAnXycgKyBpbnB1dDtcblx0fVxuXHRyZXR1cm4gaW5wdXQuc3BsaXQoJycpLm1hcChjaGFyID0+IHtcblx0XHQvLyBWYWxpZCBjaGFyYWN0ZXJzIGZvciBDU1MgY2xhc3MgbmFtZXNcblx0XHRpZiAoL15bYS16QS1aMC05XFwtX10kLy50ZXN0KGNoYXIpKSB7XG5cdFx0XHRyZXR1cm4gY2hhcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRW5jb2RlIGFueSBpbnZhbGlkIGNoYXJhY3RlcnNcblx0XHRcdHJldHVybiBlbmNvZGVDaGFyKGNoYXIpO1xuXHRcdH1cblx0fSkuam9pbignJyk7XG59XG5cblxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kT3BhY2l0eVRvSGV4Q29sb3IoaGV4Q29sb3I6IHN0cmluZywgb3BhY2l0eVBlcmNlbnQ6IG51bWJlcik6IHN0cmluZyB7XG5cdC8vIENsZWFudXAgYW5kIHJlbW92ZSBsZWFkaW5nICNcblx0Y29uc3QgaGV4Q29kZSA9IGhleENvbG9yXG5cdFx0LnRyaW0oKVxuXHRcdC5yZXBsYWNlKC9eIy9nLCAnJylcblx0XHQuc3Vic3RyaW5nKDAsIDYpO1xuXHRyZXR1cm4gXCIjXCIgKyBoZXhDb2RlICsgY29udmVydEFscGhhVG9IZXgob3BhY2l0eVBlcmNlbnQpO1xufVxuXG4vLyBTb3VyY2U6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2xvcHNwb3dlci8wM2ZiMWNjMGFjOWYzMmVmMzhmND9wZXJtYWxpbmtfY29tbWVudF9pZD00NTQ1NjQwI2dpc3Rjb21tZW50LTQ1NDU2NDBcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0QWxwaGFUb0hleChhbHBoYURlY2ltYWw6IG51bWJlcikge1xuXHQvLyBJZiB0aGVyZSBpcyBubyB2YWx1ZSwgYXNzdW1lIDEwMCVcblx0aWYgKGFscGhhRGVjaW1hbCA9PSBudWxsKSB7XG5cdFx0cmV0dXJuIFwiRkZcIjtcblx0fVxuXHQvLyBDb252ZXJ0IGFscGhhRGVjaW1hbCB0byBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMVxuXHRjb25zdCBhbHBoYSA9IGFscGhhRGVjaW1hbCAvIDEwMDtcblxuXHQvLyBDYWxjdWxhdGUgdGhlIGVxdWl2YWxlbnQgYWxwaGEgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIDAgdG8gMjU1XG5cdGNvbnN0IGFscGhhSW50ID0gTWF0aC5yb3VuZChhbHBoYSAqIDI1NSk7XG5cblx0Ly8gQ29udmVydCBhbHBoYUludCB0byBoZXhhZGVjaW1hbCBzdHJpbmdcblx0Y29uc3QgYWxwaGFIZXggPSBhbHBoYUludC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblxuXHQvLyBQYWQgdGhlIGhleGFkZWNpbWFsIHZhbHVlIHdpdGggbGVhZGluZyB6ZXJvIGlmIG5lZWRlZFxuXHRjb25zdCBwYWRkZWRBbHBoYUhleCA9IGFscGhhSGV4LnBhZFN0YXJ0KDIsICcwJyk7XG5cblx0cmV0dXJuIHBhZGRlZEFscGhhSGV4O1xufVxuIiwgIi8vIFVuaXF1ZSBJRCBjcmVhdGlvbiByZXF1aXJlcyBhIGhpZ2ggcXVhbGl0eSByYW5kb20gIyBnZW5lcmF0b3IuIEluIHRoZSBicm93c2VyIHdlIHRoZXJlZm9yZVxuLy8gcmVxdWlyZSB0aGUgY3J5cHRvIEFQSSBhbmQgZG8gbm90IHN1cHBvcnQgYnVpbHQtaW4gZmFsbGJhY2sgdG8gbG93ZXIgcXVhbGl0eSByYW5kb20gbnVtYmVyXG4vLyBnZW5lcmF0b3JzIChsaWtlIE1hdGgucmFuZG9tKCkpLlxubGV0IGdldFJhbmRvbVZhbHVlcztcbmNvbnN0IHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uXG4gICAgZ2V0UmFuZG9tVmFsdWVzID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKTtcblxuICAgIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdldFJhbmRvbVZhbHVlcyhybmRzOCk7XG59IiwgImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xuXG5jb25zdCBieXRlVG9IZXggPSBbXTtcblxuZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXgucHVzaCgoaSArIDB4MTAwKS50b1N0cmluZygxNikuc2xpY2UoMSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5zYWZlU3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICAvLyBOb3RlOiBCZSBjYXJlZnVsIGVkaXRpbmcgdGhpcyBjb2RlISAgSXQncyBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZVxuICAvLyBhbmQgd29ya3MgaW4gd2F5cyB5b3UgbWF5IG5vdCBleHBlY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC80MzRcbiAgcmV0dXJuIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkoYXJyLCBvZmZzZXQgPSAwKSB7XG4gIGNvbnN0IHV1aWQgPSB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsICJjb25zdCByYW5kb21VVUlEID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQgJiYgY3J5cHRvLnJhbmRvbVVVSUQuYmluZChjcnlwdG8pO1xuZXhwb3J0IGRlZmF1bHQge1xuICByYW5kb21VVUlEXG59OyIsICJpbXBvcnQgbmF0aXZlIGZyb20gJy4vbmF0aXZlLmpzJztcbmltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHsgdW5zYWZlU3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuXG5mdW5jdGlvbiB2NChvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICBpZiAobmF0aXZlLnJhbmRvbVVVSUQgJiYgIWJ1ZiAmJiAhb3B0aW9ucykge1xuICAgIHJldHVybiBuYXRpdmUucmFuZG9tVVVJRCgpO1xuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IHJuZHMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpOyAvLyBQZXIgNC40LCBzZXQgYml0cyBmb3IgdmVyc2lvbiBhbmQgYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgXG5cbiAgcm5kc1s2XSA9IHJuZHNbNl0gJiAweDBmIHwgMHg0MDtcbiAgcm5kc1s4XSA9IHJuZHNbOF0gJiAweDNmIHwgMHg4MDsgLy8gQ29weSBieXRlcyB0byBidWZmZXIsIGlmIHByb3ZpZGVkXG5cbiAgaWYgKGJ1Zikge1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICBidWZbb2Zmc2V0ICsgaV0gPSBybmRzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICByZXR1cm4gdW5zYWZlU3RyaW5naWZ5KHJuZHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2NDsiLCAiaW1wb3J0IHtJbmxpbmVBZG1vbml0aW9uVHlwZX0gZnJvbSBcIi4vaW5saW5lQWRtb25pdGlvblR5cGVcIjtcbmltcG9ydCB7U2V0dGluZ30gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQge3Y0IGFzIHV1aWR2NH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB7U3ludGF4Tm9kZVJlZn0gZnJvbSBcIkBsZXplci9jb21tb25cIjtcbmltcG9ydCB7RGVjb3JhdGlvbn0gZnJvbSBcIkBjb2RlbWlycm9yL3ZpZXdcIjtcbmltcG9ydCB7UmFuZ2VTZXRCdWlsZGVyfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7YXBwZW5kT3BhY2l0eVRvSGV4Q29sb3J9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW5saW5lQWRtb25pdGlvbiB7XG5cdGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuXHRiZ0NvbG9yT3BhY2l0eVBlcmNlbnQ6IG51bWJlcjtcblx0Y29sb3I6IHN0cmluZztcblx0Y29sb3JPcGFjaXR5UGVyY2VudDogbnVtYmVyO1xuXHR0eXBlOiBJbmxpbmVBZG1vbml0aW9uVHlwZTtcblx0c2x1Zzogc3RyaW5nO1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihcblx0XHRiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyxcblx0XHRiZ0NvbG9yT3BhY2l0eVBlcmNlbnQ6IG51bWJlcixcblx0XHRjb2xvcjogc3RyaW5nLFxuXHRcdGNvbG9yT3BhY2l0eVBlcmNlbnQ6IG51bWJlcixcblx0XHRzbHVnOiBzdHJpbmcpIHtcblx0XHR0aGlzLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcblx0XHR0aGlzLmJnQ29sb3JPcGFjaXR5UGVyY2VudCA9IGJnQ29sb3JPcGFjaXR5UGVyY2VudDtcblx0XHR0aGlzLmNvbG9yID0gY29sb3I7XG5cdFx0dGhpcy5jb2xvck9wYWNpdHlQZXJjZW50ID0gY29sb3JPcGFjaXR5UGVyY2VudDtcblx0XHR0aGlzLnNsdWcgPSBzbHVnO1xuXHR9XG5cblx0cHVibGljIGFic3RyYWN0IHByb2Nlc3MoY29kZUVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZDtcblxuXHRwdWJsaWMgYWJzdHJhY3QgYXBwbHlUbyhub2RlOiBTeW50YXhOb2RlUmVmLCBjb250ZW50OiBzdHJpbmcsIGJ1aWxkZXI6IFJhbmdlU2V0QnVpbGRlcjxEZWNvcmF0aW9uPik6IHZvaWQ7XG5cblx0YWJzdHJhY3Qgc2FtcGxlVGV4dCgpOiBzdHJpbmc7XG5cblx0YWJzdHJhY3QgYnVpbGRTZXR0aW5ncyhjb250ZW50RWw6IEhUTUxFbGVtZW50LCB1cGRhdGVTYW1wbGVGdW5jdGlvbjogKCkgPT4gdm9pZCk6IEFycmF5PFNldHRpbmc+O1xuXG5cdHB1YmxpYyBjc3NDbGFzc2VzKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gW1wiaWFkXCJdO1xuXHR9XG5cblx0cHVibGljIHNpbXBsZVN0eWxlKCkge1xuXHRcdHJldHVybiBgYmFja2dyb3VuZC1jb2xvcjogJHt0aGlzLmV2YWxCYWNrZ3JvdW5kQ29sb3IoKX07IGNvbG9yOiAke3RoaXMuZXZhbENvbG9yKCl9O2A7XG5cdH1cblxuXHRjb3B5U2V0dGluZ3NUbyhvdGhlcjogSW5saW5lQWRtb25pdGlvbikge1xuXHRcdG90aGVyLmJhY2tncm91bmRDb2xvciA9IHRoaXMuYmFja2dyb3VuZENvbG9yO1xuXHRcdG90aGVyLmJnQ29sb3JPcGFjaXR5UGVyY2VudCA9IHRoaXMuYmdDb2xvck9wYWNpdHlQZXJjZW50O1xuXHRcdG90aGVyLmNvbG9yID0gdGhpcy5jb2xvcjtcblx0XHRvdGhlci5jb2xvck9wYWNpdHlQZXJjZW50ID0gdGhpcy5jb2xvck9wYWNpdHlQZXJjZW50O1xuXHR9XG5cblx0cHVibGljIHRvU3RyaW5nID0gKCk6IHN0cmluZyA9PiB7XG5cdFx0cmV0dXJuIFwiSW5saW5lQWRtb25pdGlvbihcIiArIHRoaXMuZXZhbEJhY2tncm91bmRDb2xvcigpICsgXCIsIFwiICsgdGhpcy50eXBlICsgXCIpXCJcblx0fVxuXG5cdHByaXZhdGUgZXZhbEJhY2tncm91bmRDb2xvcigpIHtcblx0XHRyZXR1cm4gYXBwZW5kT3BhY2l0eVRvSGV4Q29sb3IodGhpcy5iYWNrZ3JvdW5kQ29sb3IsIHRoaXMuYmdDb2xvck9wYWNpdHlQZXJjZW50KTtcblx0fVxuXG5cdHByaXZhdGUgZXZhbENvbG9yKCkge1xuXHRcdHJldHVybiBhcHBlbmRPcGFjaXR5VG9IZXhDb2xvcih0aGlzLmNvbG9yLCB0aGlzLmNvbG9yT3BhY2l0eVBlcmNlbnQpO1xuXHR9XG5cblx0c3RhdGljIGdlbmVyYXRlU2x1ZygpOiBzdHJpbmcge1xuXHRcdHJldHVybiB1dWlkdjQoKTtcblx0fVxufVxuIiwgImltcG9ydCB7c2FuaXRpemVDbGFzc05hbWUsIHNsdWdpZnl9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtJbmxpbmVBZG1vbml0aW9ufSBmcm9tIFwiLi9pbmxpbmVBZG1vbml0aW9uXCI7XG5pbXBvcnQge1NldHRpbmd9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHtJbmxpbmVBZG1vbml0aW9uVHlwZX0gZnJvbSBcIi4vaW5saW5lQWRtb25pdGlvblR5cGVcIjtcbmltcG9ydCB7U3ludGF4Tm9kZVJlZn0gZnJvbSBcIkBsZXplci9jb21tb25cIjtcbmltcG9ydCB7UmFuZ2VTZXRCdWlsZGVyfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7RGVjb3JhdGlvbn0gZnJvbSBcIkBjb2RlbWlycm9yL3ZpZXdcIjtcblxuZXhwb3J0IGNsYXNzIFByZWZpeElubGluZUFkbW9uaXRpb24gZXh0ZW5kcyBJbmxpbmVBZG1vbml0aW9uIHtcblx0cHJlZml4OiBzdHJpbmc7XG5cdGhpZGVUcmlnZ2VyU3RyaW5nOiBib29sZWFuO1xuXHR0eXBlID0gSW5saW5lQWRtb25pdGlvblR5cGUuUHJlZml4O1xuXG5cdC8vIFRPRE8gLSBJIGRvbnQgbGlrZSB0aGlzLi4uXG5cdHN0YXRpYyBjcmVhdGUoKSB7XG5cdFx0cmV0dXJuIG5ldyBQcmVmaXhJbmxpbmVBZG1vbml0aW9uKFxuXHRcdFx0XCJcIixcblx0XHRcdGZhbHNlLFxuXHRcdFx0XCIjZjFmMWYxXCIsXG5cdFx0XHQxMDAsXG5cdFx0XHRcIiMwMDAwMDBcIixcblx0XHRcdDEwMCxcblx0XHRcdElubGluZUFkbW9uaXRpb24uZ2VuZXJhdGVTbHVnKCkpO1xuXHR9XG5cblx0c3RhdGljIHVubWFyc2hhbChkYXRhOiBhbnkpOiBQcmVmaXhJbmxpbmVBZG1vbml0aW9uIHtcblx0XHRpZiAoZGF0YS50eXBlICE9IElubGluZUFkbW9uaXRpb25UeXBlLlByZWZpeCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVubWFyc2hhbCBkYXRhIGludG8gUHJlZml4SW5saW5lQWRtb25pdGlvbjogV3JvbmcgdHlwZTogXCIgKyBkYXRhLnR5cGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IFByZWZpeElubGluZUFkbW9uaXRpb24oXG5cdFx0XHRkYXRhLnByZWZpeCxcblx0XHRcdGRhdGEuaGlkZVRyaWdnZXJTdHJpbmcsXG5cdFx0XHRkYXRhLmJhY2tncm91bmRDb2xvcixcblx0XHRcdGRhdGEuYmdDb2xvck9wYWNpdHlQZXJjZW50LFxuXHRcdFx0ZGF0YS5jb2xvcixcblx0XHRcdGRhdGEuY29sb3JPcGFjaXR5UGVyY2VudCxcblx0XHRcdGRhdGEuc2x1Zyk7XG5cdH1cblxuXHRjb25zdHJ1Y3RvcihwcmVmaXg6IHN0cmluZyxcblx0XHRcdFx0aGlkZVRyaWdnZXJTdHJpbmc6IGJvb2xlYW4sXG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjogc3RyaW5nLFxuXHRcdFx0XHRiZ0NvbG9yT3BhY2l0eVBlcmNlbnQ6IG51bWJlcixcblx0XHRcdFx0Y29sb3I6IHN0cmluZyxcblx0XHRcdFx0Y29sb3JPcGFjaXR5UGVyY2VudDogbnVtYmVyLFxuXHRcdFx0XHRzbHVnOiBzdHJpbmcpIHtcblx0XHRzdXBlcihiYWNrZ3JvdW5kQ29sb3IsIGJnQ29sb3JPcGFjaXR5UGVyY2VudCwgY29sb3IsIGNvbG9yT3BhY2l0eVBlcmNlbnQsIHNsdWcpO1xuXHRcdHRoaXMucHJlZml4ID0gcHJlZml4O1xuXHRcdHRoaXMuaGlkZVRyaWdnZXJTdHJpbmcgPSBoaWRlVHJpZ2dlclN0cmluZztcblx0fVxuXG5cdHByb2Nlc3MoY29kZUVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG5cdFx0aWYgKGNvZGVFbGVtZW50LmlubmVyVGV4dC5zdGFydHNXaXRoKHRoaXMucHJlZml4KSkge1xuXHRcdFx0dGhpcy5jc3NDbGFzc2VzKCkuZm9yRWFjaChjID0+IGNvZGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoYykpO1xuXHRcdFx0Ly8gY29kZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgdGhpcy5zaW1wbGVTdHlsZSgpKTtcblx0XHRcdGlmICh0aGlzLmhpZGVUcmlnZ2VyU3RyaW5nKSB7XG5cdFx0XHRcdGNvZGVFbGVtZW50LnNldFRleHQoY29kZUVsZW1lbnQuZ2V0VGV4dCgpLnJlcGxhY2UodGhpcy5wcmVmaXgsIFwiXCIpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRhcHBseVRvKG5vZGU6IFN5bnRheE5vZGVSZWYsIGNvbnRlbnQ6IHN0cmluZywgYnVpbGRlcjogUmFuZ2VTZXRCdWlsZGVyPERlY29yYXRpb24+KSB7XG5cdFx0aWYgKGNvbnRlbnQuc3RhcnRzV2l0aCh0aGlzLnByZWZpeCkpIHtcblx0XHRcdGJ1aWxkZXIuYWRkKFxuXHRcdFx0XHRub2RlLmZyb20sXG5cdFx0XHRcdG5vZGUudG8sXG5cdFx0XHRcdERlY29yYXRpb24ubWFyayh7XG5cdFx0XHRcdFx0aW5jbHVzaXZlOiB0cnVlLFxuXHRcdFx0XHRcdGF0dHJpYnV0ZXM6IHtjbGFzczogdGhpcy5jc3NDbGFzc2VzKCkuam9pbihcIiBcIil9LFxuXHRcdFx0XHRcdHRhZ05hbWU6IFwic3BhblwiXG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdFx0Ly8gSGlkZSB0aGUgcHJlZml4IGlmIG5lY2Vzc2FyeVxuXHRcdFx0aWYgKHRoaXMuaGlkZVRyaWdnZXJTdHJpbmcpIHtcblx0XHRcdFx0YnVpbGRlci5hZGQoXG5cdFx0XHRcdFx0bm9kZS5mcm9tLFxuXHRcdFx0XHRcdG5vZGUuZnJvbSArIHRoaXMucHJlZml4Lmxlbmd0aCxcblx0XHRcdFx0XHREZWNvcmF0aW9uLm1hcmsoe1xuXHRcdFx0XHRcdFx0aW5jbHVzaXZlOiB0cnVlLFxuXHRcdFx0XHRcdFx0YXR0cmlidXRlczoge2NsYXNzOiBcImlhZC1oaWRkZW5cIn0sXG5cdFx0XHRcdFx0XHR0YWdOYW1lOiBcInNwYW5cIlxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y3NzQ2xhc3NlcygpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3QgY2xhc3NlcyA9IHN1cGVyLmNzc0NsYXNzZXMoKTtcblx0XHRjbGFzc2VzLnB1c2goXCJpYWQtcHJlZml4XCIpXG5cdFx0Y2xhc3Nlcy5wdXNoKFwiaWFkLXByZWZpeC1cIiArIHNhbml0aXplQ2xhc3NOYW1lKHRoaXMucHJlZml4KSk7XG5cdFx0cmV0dXJuIGNsYXNzZXM7XG5cdH1cblxuXHRzYW1wbGVUZXh0KCkge1xuXHRcdGlmICh0aGlzLmhpZGVUcmlnZ2VyU3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gXCJzYW1wbGUgdGV4dFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5wcmVmaXggKyBcIiBzYW1wbGUgdGV4dFwiO1xuXHR9XG5cblx0YnVpbGRTZXR0aW5ncyhjb250ZW50RWw6IEhUTUxFbGVtZW50LCB1cGRhdGVTYW1wbGVGdW5jdGlvbjogKCkgPT4gdm9pZCk6IFNldHRpbmdbXSB7XG5cdFx0Y29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheTxTZXR0aW5nPigpO1xuXG5cdFx0cmVzdWx0cy5wdXNoKG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcblx0XHRcdC5zZXROYW1lKFwiUHJlZml4XCIpXG5cdFx0XHQuc2V0RGVzYyhcIklubGluZSBjb2RlYmxvY2sgcHJlZml4IHRvIHRyaWdnZXIgdGhpcyBmb3JtYXR0aW5nXCIpXG5cdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4gdGV4dFxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoXCJFbnRlciBwcmVmaXhcIilcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucHJlZml4KVxuXHRcdFx0XHQub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wcmVmaXggPSB2YWx1ZTtcblx0XHRcdFx0XHR1cGRhdGVTYW1wbGVGdW5jdGlvbigpO1xuXHRcdFx0XHR9KVxuXHRcdFx0KSk7XG5cblx0XHRyZXN1bHRzLnB1c2gobmV3IFNldHRpbmcoY29udGVudEVsKVxuXHRcdFx0LnNldE5hbWUoXCJIaWRlIHByZWZpeCB0ZXh0XCIpXG5cdFx0XHQuc2V0RGVzYyhcIklmIGVuYWJsZWQsIHRoZSAncHJlZml4JyB0ZXh0IHdpbGwgbm90IHNob3cgaW4gcmVzdWx0aW5nIElubGluZSBBZG1vbml0aW9uXCIpXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5oaWRlVHJpZ2dlclN0cmluZylcblx0XHRcdFx0Lm9uQ2hhbmdlKCh2YWwpID0+IHtcblx0XHRcdFx0XHR0aGlzLmhpZGVUcmlnZ2VyU3RyaW5nID0gdmFsO1xuXHRcdFx0XHRcdHVwZGF0ZVNhbXBsZUZ1bmN0aW9uKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHQpXG5cdFx0KTtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0cHVibGljIHRvU3RyaW5nID0gKCk6IHN0cmluZyA9PiB7XG5cdFx0cmV0dXJuIFwiUHJlZml4SW5saW5lQWRtb25pdGlvbihcIiArIHRoaXMucHJlZml4ICsgXCIsIGhpZGVQcmVmaXg6IFwiICsgdGhpcy5oaWRlVHJpZ2dlclN0cmluZyArIFwiKVwiO1xuXHR9XG59XG4iLCAiaW1wb3J0IHtzYW5pdGl6ZUNsYXNzTmFtZSwgc2x1Z2lmeX0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge0lubGluZUFkbW9uaXRpb259IGZyb20gXCIuL2lubGluZUFkbW9uaXRpb25cIjtcbmltcG9ydCB7U2V0dGluZ30gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQge0lubGluZUFkbW9uaXRpb25UeXBlfSBmcm9tIFwiLi9pbmxpbmVBZG1vbml0aW9uVHlwZVwiO1xuaW1wb3J0IHtTeW50YXhOb2RlUmVmfSBmcm9tIFwiQGxlemVyL2NvbW1vblwiO1xuaW1wb3J0IHtSYW5nZVNldEJ1aWxkZXJ9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHtEZWNvcmF0aW9ufSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuXG5leHBvcnQgY2xhc3MgU3VmZml4SW5saW5lQWRtb25pdGlvbiBleHRlbmRzIElubGluZUFkbW9uaXRpb24ge1xuXHRzdWZmaXg6IHN0cmluZztcblx0aGlkZVRyaWdnZXJTdHJpbmc6IGJvb2xlYW47XG5cdHR5cGUgPSBJbmxpbmVBZG1vbml0aW9uVHlwZS5TdWZmaXg7XG5cblx0Ly8gVE9ETyAtIEkgZG9udCBsaWtlIHRoaXMuLi5cblx0c3RhdGljIGNyZWF0ZSgpIHtcblx0XHRyZXR1cm4gbmV3IFN1ZmZpeElubGluZUFkbW9uaXRpb24oXG5cdFx0XHRcIlwiLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRcIiNmMWYxZjFcIixcblx0XHRcdDEwMCxcblx0XHRcdFwiIzAwMDAwMFwiLFxuXHRcdFx0MTAwLFxuXHRcdFx0SW5saW5lQWRtb25pdGlvbi5nZW5lcmF0ZVNsdWcoKSk7XG5cdH1cblxuXHRzdGF0aWMgdW5tYXJzaGFsKGRhdGE6IGFueSk6IFN1ZmZpeElubGluZUFkbW9uaXRpb24ge1xuXHRcdGlmIChkYXRhLnR5cGUgIT0gSW5saW5lQWRtb25pdGlvblR5cGUuU3VmZml4KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdW5tYXJzaGFsIGRhdGEgaW50byBTdWZmaXhJbmxpbmVBZG1vbml0aW9uOiBXcm9uZyB0eXBlOiBcIiArIGRhdGEudHlwZSk7XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgU3VmZml4SW5saW5lQWRtb25pdGlvbihcblx0XHRcdGRhdGEuc3VmZml4LFxuXHRcdFx0ZGF0YS5oaWRlVHJpZ2dlclN0cmluZyxcblx0XHRcdGRhdGEuYmFja2dyb3VuZENvbG9yLFxuXHRcdFx0ZGF0YS5iZ0NvbG9yT3BhY2l0eVBlcmNlbnQsXG5cdFx0XHRkYXRhLmNvbG9yLFxuXHRcdFx0ZGF0YS5jb2xvck9wYWNpdHlQZXJjZW50LFxuXHRcdFx0ZGF0YS5zbHVnKTtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKHN1ZmZpeDogc3RyaW5nLFxuXHRcdFx0XHRoaWRlVHJpZ2dlclN0cmluZzogYm9vbGVhbixcblx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiBzdHJpbmcsXG5cdFx0XHRcdGJnQ29sb3JPcGFjaXR5UGVyY2VudDogbnVtYmVyLFxuXHRcdFx0XHRjb2xvcjogc3RyaW5nLFxuXHRcdFx0XHRjb2xvck9wYWNpdHlQZXJjZW50OiBudW1iZXIsXG5cdFx0XHRcdHNsdWc6IHN0cmluZykge1xuXHRcdHN1cGVyKGJhY2tncm91bmRDb2xvciwgYmdDb2xvck9wYWNpdHlQZXJjZW50LCBjb2xvciwgY29sb3JPcGFjaXR5UGVyY2VudCwgc2x1Zyk7XG5cdFx0dGhpcy5zdWZmaXggPSBzdWZmaXg7XG5cdFx0dGhpcy5oaWRlVHJpZ2dlclN0cmluZyA9IGhpZGVUcmlnZ2VyU3RyaW5nO1xuXHR9XG5cblx0cHJvY2Vzcyhjb2RlRWxlbWVudDogSFRNTEVsZW1lbnQpIHtcblx0XHRpZiAoY29kZUVsZW1lbnQuaW5uZXJUZXh0LmVuZHNXaXRoKHRoaXMuc3VmZml4KSkge1xuXHRcdFx0dGhpcy5jc3NDbGFzc2VzKCkuZm9yRWFjaChjID0+IGNvZGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoYykpO1xuXHRcdFx0Ly8gY29kZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgdGhpcy5zaW1wbGVTdHlsZSgpKTtcblx0XHRcdGlmICh0aGlzLmhpZGVUcmlnZ2VyU3RyaW5nKSB7XG5cdFx0XHRcdGNvZGVFbGVtZW50LnNldFRleHQoY29kZUVsZW1lbnQuZ2V0VGV4dCgpLnJlcGxhY2UobmV3IFJlZ0V4cCh0aGlzLnN1ZmZpeCArIFwiJFwiKSwgXCJcIikpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGFwcGx5VG8obm9kZTogU3ludGF4Tm9kZVJlZiwgY29udGVudDogc3RyaW5nLCBidWlsZGVyOiBSYW5nZVNldEJ1aWxkZXI8RGVjb3JhdGlvbj4pIHtcblx0XHRpZiAoY29udGVudC5lbmRzV2l0aCh0aGlzLnN1ZmZpeCkpIHtcblx0XHRcdGJ1aWxkZXIuYWRkKFxuXHRcdFx0XHRub2RlLmZyb20sXG5cdFx0XHRcdG5vZGUudG8sXG5cdFx0XHRcdERlY29yYXRpb24ubWFyayh7XG5cdFx0XHRcdFx0aW5jbHVzaXZlOiB0cnVlLFxuXHRcdFx0XHRcdGF0dHJpYnV0ZXM6IHtjbGFzczogdGhpcy5jc3NDbGFzc2VzKCkuam9pbihcIiBcIil9LFxuXHRcdFx0XHRcdHRhZ05hbWU6IFwic3BhblwiXG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvLyBIaWRlIHRoZSBwcmVmaXggaWYgbmVjZXNzYXJ5XG5cdFx0aWYgKHRoaXMuaGlkZVRyaWdnZXJTdHJpbmcpIHtcblx0XHRcdGJ1aWxkZXIuYWRkKFxuXHRcdFx0XHRub2RlLnRvIC0gdGhpcy5zdWZmaXgubGVuZ3RoLFxuXHRcdFx0XHRub2RlLnRvLFxuXHRcdFx0XHREZWNvcmF0aW9uLm1hcmsoe1xuXHRcdFx0XHRcdGluY2x1c2l2ZTogdHJ1ZSxcblx0XHRcdFx0XHRhdHRyaWJ1dGVzOiB7Y2xhc3M6IFwiaWFkLWhpZGRlblwifSxcblx0XHRcdFx0XHR0YWdOYW1lOiBcInNwYW5cIlxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRjc3NDbGFzc2VzKCk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBjbGFzc2VzID0gc3VwZXIuY3NzQ2xhc3NlcygpO1xuXHRcdGNsYXNzZXMucHVzaChcImlhZC1zdWZmaXhcIilcblx0XHRjbGFzc2VzLnB1c2goXCJpYWQtc3VmZml4LVwiICsgc2FuaXRpemVDbGFzc05hbWUodGhpcy5zdWZmaXgpKTtcblx0XHRyZXR1cm4gY2xhc3Nlcztcblx0fVxuXG5cdHNhbXBsZVRleHQoKSB7XG5cdFx0aWYgKHRoaXMuaGlkZVRyaWdnZXJTdHJpbmcpIHtcblx0XHRcdHJldHVybiBcInNhbXBsZSB0ZXh0XCI7XG5cdFx0fVxuXHRcdHJldHVybiBcInNhbXBsZSB0ZXh0IFwiICsgdGhpcy5zdWZmaXg7XG5cdH1cblxuXHRidWlsZFNldHRpbmdzKGNvbnRlbnRFbDogSFRNTEVsZW1lbnQsIHVwZGF0ZVNhbXBsZUZ1bmN0aW9uOiAoKSA9PiB2b2lkKTogU2V0dGluZ1tdIHtcblx0XHRjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNldHRpbmc+KCk7XG5cblx0XHRyZXN1bHRzLnB1c2gobmV3IFNldHRpbmcoY29udGVudEVsKVxuXHRcdFx0LnNldE5hbWUoXCJTdWZmaXhcIilcblx0XHRcdC5zZXREZXNjKFwiSW5saW5lIGNvZGVibG9jayBzdWZmaXggdG8gdHJpZ2dlciB0aGlzIGZvcm1hdHRpbmdcIilcblx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PiB0ZXh0XG5cdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihcIkVudGVyIHN1ZmZpeFwiKVxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5zdWZmaXgpXG5cdFx0XHRcdC5vbkNoYW5nZSgodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnN1ZmZpeCA9IHZhbHVlO1xuXHRcdFx0XHRcdHVwZGF0ZVNhbXBsZUZ1bmN0aW9uKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHQpKTtcblxuXHRcdHJlc3VsdHMucHVzaChuZXcgU2V0dGluZyhjb250ZW50RWwpXG5cdFx0XHQuc2V0TmFtZShcIkhpZGUgc3VmZml4IHRleHRcIilcblx0XHRcdC5zZXREZXNjKFwiSWYgZW5hYmxlZCwgdGhlICdzdWZmaXgnIHRleHQgd2lsbCBub3Qgc2hvdyBpbiByZXN1bHRpbmcgSW5saW5lIEFkbW9uaXRpb25cIilcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLmhpZGVUcmlnZ2VyU3RyaW5nKVxuXHRcdFx0XHQub25DaGFuZ2UoKHZhbCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuaGlkZVRyaWdnZXJTdHJpbmcgPSB2YWw7XG5cdFx0XHRcdFx0dXBkYXRlU2FtcGxlRnVuY3Rpb24oKTtcblx0XHRcdFx0fSlcblx0XHRcdClcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdHM7XG5cdH1cblxuXHRwdWJsaWMgdG9TdHJpbmcgPSAoKTogc3RyaW5nID0+IHtcblx0XHRyZXR1cm4gXCJTdWZmaXhJbmxpbmVBZG1vbml0aW9uKFwiICsgdGhpcy5zdWZmaXggKyBcIiwgaGlkZVByZWZpeDogXCIgKyB0aGlzLmhpZGVUcmlnZ2VyU3RyaW5nICsgXCIpXCI7XG5cdH1cbn1cbiIsICJpbXBvcnQge3Nhbml0aXplQ2xhc3NOYW1lLCBzbHVnaWZ5fSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7SW5saW5lQWRtb25pdGlvbn0gZnJvbSBcIi4vaW5saW5lQWRtb25pdGlvblwiO1xuaW1wb3J0IHtTZXR0aW5nfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7SW5saW5lQWRtb25pdGlvblR5cGV9IGZyb20gXCIuL2lubGluZUFkbW9uaXRpb25UeXBlXCI7XG5pbXBvcnQge1N5bnRheE5vZGVSZWZ9IGZyb20gXCJAbGV6ZXIvY29tbW9uXCI7XG5pbXBvcnQge1JhbmdlU2V0QnVpbGRlcn0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQge0RlY29yYXRpb259IGZyb20gXCJAY29kZW1pcnJvci92aWV3XCI7XG5cbmV4cG9ydCBjbGFzcyBDb250YWluc0lubGluZUFkbW9uaXRpb24gZXh0ZW5kcyBJbmxpbmVBZG1vbml0aW9uIHtcblx0Y29udGFpbnM6IHN0cmluZztcblx0dHlwZSA9IElubGluZUFkbW9uaXRpb25UeXBlLkNvbnRhaW5zO1xuXG5cdC8vIFRPRE8gLSBJIGRvbnQgbGlrZSB0aGlzLi4uXG5cdHN0YXRpYyBjcmVhdGUoKSB7XG5cdFx0cmV0dXJuIG5ldyBDb250YWluc0lubGluZUFkbW9uaXRpb24oXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCIjZjFmMWYxXCIsXG5cdFx0XHQxMDAsXG5cdFx0XHRcIiMwMDAwMDBcIixcblx0XHRcdDEwMCxcblx0XHRcdElubGluZUFkbW9uaXRpb24uZ2VuZXJhdGVTbHVnKCkpO1xuXHR9XG5cblx0c3RhdGljIHVubWFyc2hhbChkYXRhOiBhbnkpOiBDb250YWluc0lubGluZUFkbW9uaXRpb24ge1xuXHRcdGlmIChkYXRhLnR5cGUgIT0gSW5saW5lQWRtb25pdGlvblR5cGUuQ29udGFpbnMpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1bm1hcnNoYWwgZGF0YSBpbnRvIENvbnRhaW5zSW5saW5lQWRtb25pdGlvbjogV3JvbmcgdHlwZTogXCIgKyBkYXRhLnR5cGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IENvbnRhaW5zSW5saW5lQWRtb25pdGlvbihcblx0XHRcdGRhdGEuY29udGFpbnMsXG5cdFx0XHRkYXRhLmJhY2tncm91bmRDb2xvcixcblx0XHRcdGRhdGEuYmdDb2xvck9wYWNpdHlQZXJjZW50LFxuXHRcdFx0ZGF0YS5jb2xvcixcblx0XHRcdGRhdGEuY29sb3JPcGFjaXR5UGVyY2VudCxcblx0XHRcdGRhdGEuc2x1Zyk7XG5cdH1cblxuXHRjb25zdHJ1Y3Rvcihjb250YWluczogc3RyaW5nLFxuXHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyxcblx0XHRcdFx0YmdDb2xvck9wYWNpdHlQZXJjZW50OiBudW1iZXIsXG5cdFx0XHRcdGNvbG9yOiBzdHJpbmcsXG5cdFx0XHRcdGNvbG9yT3BhY2l0eVBlcmNlbnQ6IG51bWJlcixcblx0XHRcdFx0c2x1Zzogc3RyaW5nKSB7XG5cdFx0c3VwZXIoYmFja2dyb3VuZENvbG9yLCBiZ0NvbG9yT3BhY2l0eVBlcmNlbnQsIGNvbG9yLCBjb2xvck9wYWNpdHlQZXJjZW50LCBzbHVnKTtcblx0XHR0aGlzLmNvbnRhaW5zID0gY29udGFpbnM7XG5cdH1cblxuXHRwcm9jZXNzKGNvZGVFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuXHRcdGlmIChjb2RlRWxlbWVudC5pbm5lclRleHQuY29udGFpbnModGhpcy5jb250YWlucykpIHtcblx0XHRcdHRoaXMuY3NzQ2xhc3NlcygpLmZvckVhY2goYyA9PiBjb2RlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGMpKTtcblx0XHRcdC8vIGNvZGVFbGVtZW50LnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIHRoaXMuc2ltcGxlU3R5bGUoKSk7XG5cdFx0fVxuXHR9XG5cblx0YXBwbHlUbyhub2RlOiBTeW50YXhOb2RlUmVmLCBjb250ZW50OiBzdHJpbmcsIGJ1aWxkZXI6IFJhbmdlU2V0QnVpbGRlcjxEZWNvcmF0aW9uPikge1xuXHRcdGlmIChjb250ZW50LmNvbnRhaW5zKHRoaXMuY29udGFpbnMpKSB7XG5cdFx0XHRidWlsZGVyLmFkZChcblx0XHRcdFx0bm9kZS5mcm9tLFxuXHRcdFx0XHRub2RlLnRvLFxuXHRcdFx0XHREZWNvcmF0aW9uLm1hcmsoe1xuXHRcdFx0XHRcdGluY2x1c2l2ZTogdHJ1ZSxcblx0XHRcdFx0XHRhdHRyaWJ1dGVzOiB7Y2xhc3M6IHRoaXMuY3NzQ2xhc3NlcygpLmpvaW4oXCIgXCIpfSxcblx0XHRcdFx0XHR0YWdOYW1lOiBcInNwYW5cIlxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRjc3NDbGFzc2VzKCk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBjbGFzc2VzID0gc3VwZXIuY3NzQ2xhc3NlcygpO1xuXHRcdGNsYXNzZXMucHVzaChcImlhZC1jb250YWluc1wiKVxuXHRcdGNsYXNzZXMucHVzaChcImlhZC1jb250YWlucy1cIiArIHNhbml0aXplQ2xhc3NOYW1lKHRoaXMuY29udGFpbnMpKTtcblx0XHRyZXR1cm4gY2xhc3Nlcztcblx0fVxuXG5cdHNhbXBsZVRleHQoKSB7XG5cdFx0cmV0dXJuIFwic2FtcGxlIFwiICsgdGhpcy5jb250YWlucyArIFwiIHRleHRcIjtcblx0fVxuXG5cdGJ1aWxkU2V0dGluZ3MoY29udGVudEVsOiBIVE1MRWxlbWVudCwgdXBkYXRlU2FtcGxlRnVuY3Rpb246ICgpID0+IHZvaWQpOiBTZXR0aW5nW10ge1xuXHRcdGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2V0dGluZz4oKTtcblx0XHRyZXN1bHRzLnB1c2gobmV3IFNldHRpbmcoY29udGVudEVsKVxuXHRcdFx0LnNldE5hbWUoXCJDb250YWluc1wiKVxuXHRcdFx0LnNldERlc2MoXCJJbmxpbmUgY29kZWJsb2NrIGNvbnRhaW5zIHRoaXMgc3RyaW5nIHRvIHRyaWdnZXIgdGhpcyBmb3JtYXR0aW5nXCIpXG5cdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4gdGV4dFxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoXCJFbnRlciBjb250YWluc1wiKVxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5jb250YWlucylcblx0XHRcdFx0Lm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuY29udGFpbnMgPSB2YWx1ZTtcblx0XHRcdFx0XHR1cGRhdGVTYW1wbGVGdW5jdGlvbigpO1xuXHRcdFx0XHR9KVxuXHRcdFx0KSk7XG5cdFx0cmV0dXJuIHJlc3VsdHM7XG5cdH1cblxuXHRwdWJsaWMgdG9TdHJpbmcgPSAoKTogc3RyaW5nID0+IHtcblx0XHRyZXR1cm4gXCJDb250YWluc0lubGluZUFkbW9uaXRpb24oXCIgKyB0aGlzLmNvbnRhaW5zICsgXCIpXCJcblx0fVxufVxuIiwgImltcG9ydCB7UHJlZml4SW5saW5lQWRtb25pdGlvbn0gZnJvbSBcIi4vcHJlZml4SW5saW5lQWRtb25pdGlvblwiO1xuaW1wb3J0IHtTdWZmaXhJbmxpbmVBZG1vbml0aW9ufSBmcm9tIFwiLi9zdWZmaXhJbmxpbmVBZG1vbml0aW9uXCI7XG5pbXBvcnQge0lubGluZUFkbW9uaXRpb259IGZyb20gXCIuL2lubGluZUFkbW9uaXRpb25cIjtcbmltcG9ydCB7Q29udGFpbnNJbmxpbmVBZG1vbml0aW9ufSBmcm9tIFwiLi9jb250YWluc0lubGluZUFkbW9uaXRpb25cIjtcbmltcG9ydCB7TW9kYWx9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5leHBvcnQgZW51bSBJbmxpbmVBZG1vbml0aW9uVHlwZSB7XG5cdFByZWZpeCA9IFwicHJlZml4XCIsXG5cdFN1ZmZpeCA9IFwic3VmZml4XCIsXG5cdENvbnRhaW5zID0gXCJjb250YWluc1wiLFxufVxuXG5leHBvcnQgbmFtZXNwYWNlIElubGluZUFkbW9uaXRpb25UeXBlIHtcblx0ZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSh0eXBlOiBJbmxpbmVBZG1vbml0aW9uVHlwZSk6IElubGluZUFkbW9uaXRpb24ge1xuXHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0Y2FzZSBJbmxpbmVBZG1vbml0aW9uVHlwZS5QcmVmaXg6XG5cdFx0XHRcdHJldHVybiBQcmVmaXhJbmxpbmVBZG1vbml0aW9uLmNyZWF0ZSgpO1xuXHRcdFx0Y2FzZSBJbmxpbmVBZG1vbml0aW9uVHlwZS5TdWZmaXg6XG5cdFx0XHRcdHJldHVybiBTdWZmaXhJbmxpbmVBZG1vbml0aW9uLmNyZWF0ZSgpO1xuXHRcdFx0Y2FzZSBJbmxpbmVBZG1vbml0aW9uVHlwZS5Db250YWluczpcblx0XHRcdFx0cmV0dXJuIENvbnRhaW5zSW5saW5lQWRtb25pdGlvbi5jcmVhdGUoKTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjcmVhdGUsIGludmFsaWQgSW5saW5lIEFkbW9uaXRpb24gdHlwZVwiKVxuXHRcdH1cblx0fVxuXG5cdGV4cG9ydCBmdW5jdGlvbiBmcm9tKHR5cGU6IHN0cmluZyk6IElubGluZUFkbW9uaXRpb25UeXBlIHtcblx0XHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRcdGNhc2UgSW5saW5lQWRtb25pdGlvblR5cGUuUHJlZml4OlxuXHRcdFx0XHRyZXR1cm4gSW5saW5lQWRtb25pdGlvblR5cGUuUHJlZml4XG5cdFx0XHRjYXNlIElubGluZUFkbW9uaXRpb25UeXBlLlN1ZmZpeDpcblx0XHRcdFx0cmV0dXJuIElubGluZUFkbW9uaXRpb25UeXBlLlN1ZmZpeFxuXHRcdFx0Y2FzZSBJbmxpbmVBZG1vbml0aW9uVHlwZS5Db250YWluczpcblx0XHRcdFx0cmV0dXJuIElubGluZUFkbW9uaXRpb25UeXBlLkNvbnRhaW5zXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIElubGluZSBBZG1vbml0aW9uIHR5cGU6IFwiICsgdHlwZSlcblx0XHR9XG5cdH1cblxuXHQvLyBmb3IgY29udmVuaWVuY2UuLi5cblx0ZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyb20odHlwZTogc3RyaW5nKTogSW5saW5lQWRtb25pdGlvbiB7XG5cdFx0cmV0dXJuIGNyZWF0ZShmcm9tKHR5cGUpKTtcblx0fVxuXG5cdGV4cG9ydCBmdW5jdGlvbiB1bm1hcnNoYWwoZGF0YTogYW55KSB7XG5cdFx0Y29uc3QgdHlwZSA9IGZyb20oZGF0YS50eXBlKVxuXHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0Y2FzZSBJbmxpbmVBZG1vbml0aW9uVHlwZS5QcmVmaXg6XG5cdFx0XHRcdHJldHVybiBQcmVmaXhJbmxpbmVBZG1vbml0aW9uLnVubWFyc2hhbChkYXRhKTtcblx0XHRcdGNhc2UgSW5saW5lQWRtb25pdGlvblR5cGUuU3VmZml4OlxuXHRcdFx0XHRyZXR1cm4gU3VmZml4SW5saW5lQWRtb25pdGlvbi51bm1hcnNoYWwoZGF0YSk7XG5cdFx0XHRjYXNlIElubGluZUFkbW9uaXRpb25UeXBlLkNvbnRhaW5zOlxuXHRcdFx0XHRyZXR1cm4gQ29udGFpbnNJbmxpbmVBZG1vbml0aW9uLnVubWFyc2hhbChkYXRhKTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBVbm1hcnNoYWwsIGludmFsaWQgSW5saW5lIEFkbW9uaXRpb24gdHlwZTogXCIgKyB0eXBlKVxuXHRcdH1cblx0fVxuXG5cdGV4cG9ydCBmdW5jdGlvbiB0b29sdGlwKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGBcblRoZSBcInR5cGVcIiBkZWZpbmVzIHdoYXQgdHJpZ2dlcnMgYW4gSW5saW5lIEFkbW9uaXRpb25cblx0XHRcbiAtIFByZWZpeDogVHJpZ2dlcmVkIGlmIGEgY29kZWJsb2NrIHN0YXJ0cyB3aXRoIHRoZSBzdHJpbmcuXG4gLSBTdWZmaXg6IFRyaWdnZXJlZCBpZiBhIGNvZGVibG9jayBlbmRzIHdpdGggdGhlIHN0cmluZy5cbiAtIENvbnRhaW5zOiBUcmlnZ2VyZWQgaWYgYSBjb2RlYmxvY2sgY29udGFpbnMgdGhlIHN0cmluZyBhbnl3aGVyZSB3aXRoaW4gaXQuXG4gYFxuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBUeXBlVG9vbHRpcE1vZGFsIGV4dGVuZHMgTW9kYWwge1xuXHRvbk9wZW4oKSB7XG5cdFx0c3VwZXIub25PcGVuKCk7XG5cdFx0Y29uc3Qge2NvbnRlbnRFbH0gPSB0aGlzO1xuXHRcdGNvbnRlbnRFbC5jcmVhdGVEaXYoe1xuXHRcdFx0dGV4dDogSW5saW5lQWRtb25pdGlvblR5cGUudG9vbHRpcCgpLFxuXHRcdFx0YXR0cjoge1wic3R5bGVcIjogXCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XCJ9XG5cdFx0fSk7XG5cdH1cbn1cbiIsICJpbXBvcnQge0lubGluZUFkbW9uaXRpb259IGZyb20gXCIuLi9JbmxpbmVBZG1vbml0aW9ucy9pbmxpbmVBZG1vbml0aW9uXCI7XG5pbXBvcnQge0lubGluZUFkbW9uaXRpb25UeXBlfSBmcm9tIFwiLi4vSW5saW5lQWRtb25pdGlvbnMvaW5saW5lQWRtb25pdGlvblR5cGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJbmxpbmVBZG1vbml0aW9uU2V0dGluZ3Mge1xuXHR2ZXJzaW9uOiBudW1iZXI7XG5cdGlubGluZUFkbW9uaXRpb25zOiBNYXA8c3RyaW5nLCBJbmxpbmVBZG1vbml0aW9uPjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBJbmxpbmVBZG1vbml0aW9uU2V0dGluZ3NJTyB7XG5cdGV4cG9ydCBmdW5jdGlvbiBtYXJzaGFsKHNldHRpbmdzOiBJbmxpbmVBZG1vbml0aW9uU2V0dGluZ3MpIHtcblx0XHRjb25zdCBzZXR0aW5nRGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIHNldHRpbmdzKTtcblx0XHRzZXR0aW5nRGF0YS5pbmxpbmVBZG1vbml0aW9ucyA9IE9iamVjdC5mcm9tRW50cmllcyhzZXR0aW5ncy5pbmxpbmVBZG1vbml0aW9ucy5lbnRyaWVzKCkpO1xuXHRcdHJldHVybiBzZXR0aW5nRGF0YTtcblx0fVxuXG5cdGV4cG9ydCBmdW5jdGlvbiB1bm1hcnNoYWxBbmRNaWdyYXRlKGRhdGE6IGFueSk6IFtJbmxpbmVBZG1vbml0aW9uU2V0dGluZ3MsIGJvb2xlYW5dIHtcblx0XHRsZXQgc2V0dGluZ3M6IElubGluZUFkbW9uaXRpb25TZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGRhdGEpO1xuXG5cdFx0Y29uc3QgW25ld1NldHRpbmdzLCBkYXRhTWlncmF0ZWRdID0gbWlncmF0ZURhdGEoc2V0dGluZ3MpO1xuXHRcdHNldHRpbmdzID0gbmV3U2V0dGluZ3M7XG5cblx0XHRjb25zdCBpYWRzID0gbmV3IE1hcDxzdHJpbmcsIElubGluZUFkbW9uaXRpb24+KCk7XG5cdFx0Zm9yIChjb25zdCBpZGVudGlmaWVyIGluIHNldHRpbmdzLmlubGluZUFkbW9uaXRpb25zKSB7XG5cdFx0XHRjb25zdCBpYWQgPSBzZXR0aW5ncy5pbmxpbmVBZG1vbml0aW9uc1tpZGVudGlmaWVyXTtcblx0XHRcdGNvbnN0IHR5cGVkSUFEID0gSW5saW5lQWRtb25pdGlvblR5cGUudW5tYXJzaGFsKGlhZCk7XG5cdFx0XHRpYWRzLnNldCh0eXBlZElBRC5zbHVnLCB0eXBlZElBRCk7XG5cdFx0fVxuXHRcdHNldHRpbmdzLmlubGluZUFkbW9uaXRpb25zID0gaWFkcztcblx0XHRyZXR1cm4gW3NldHRpbmdzLCBkYXRhTWlncmF0ZWRdO1xuXHR9XG5cblx0ZXhwb3J0IGZ1bmN0aW9uIG1pZ3JhdGVEYXRhKHNldHRpbmdzOiBJbmxpbmVBZG1vbml0aW9uU2V0dGluZ3MpOiBbYW55LCBib29sZWFuXSB7XG5cdFx0bGV0IGRhdGFNaWdyYXRlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gTWlncmF0ZSB0byB2ZXJzaW9uIDFcblx0XHRpZiAoc2V0dGluZ3MudmVyc2lvbiA9PSB1bmRlZmluZWQgfHwgc2V0dGluZ3MudmVyc2lvbiA9PT0gMCkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJbSW5saW5lIEFkbW9uaXRpb25zXSBNaWdyYXRpbmcgc2V0dGluZ3MgZnJvbSB2ZXJzaW9uIDAgdG8gMVwiKTtcblx0XHRcdGNvbnN0IGlhZHMgPSBuZXcgTWFwPHN0cmluZywgSW5saW5lQWRtb25pdGlvbj4oKTtcblx0XHRcdGZvciAoY29uc3QgaWRlbnRpZmllciBpbiBzZXR0aW5ncz8uaW5saW5lQWRtb25pdGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgaWFkID0gc2V0dGluZ3MuaW5saW5lQWRtb25pdGlvbnNbaWRlbnRpZmllcl07XG5cdFx0XHRcdGlmIChpYWQudHlwZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Y29uc29sZS5sb2coXCJbSW5saW5lIEFkbW9uaXRpb25zXSBTZXR0aW5nIElubGluZUFkbW9uaXRpb24gXCIgKyBpZGVudGlmaWVyICsgXCIgdG8gUHJlZml4IHR5cGVcIilcblx0XHRcdFx0XHRpYWQudHlwZSA9IElubGluZUFkbW9uaXRpb25UeXBlLlByZWZpeDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaWFkLnNsdWcgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlhZC5zbHVnID0gSW5saW5lQWRtb25pdGlvbi5nZW5lcmF0ZVNsdWcoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGlhID0gSW5saW5lQWRtb25pdGlvblR5cGUudW5tYXJzaGFsKGlhZCk7XG5cdFx0XHRcdGlhZHMuc2V0KGlhLnNsdWcsIGlhKTtcblx0XHRcdH1cblx0XHRcdHNldHRpbmdzLmlubGluZUFkbW9uaXRpb25zID0gaWFkcztcblx0XHRcdHNldHRpbmdzWydteVNldHRpbmcnXSA9IHVuZGVmaW5lZDtcblx0XHRcdHNldHRpbmdzLnZlcnNpb24gPSAxO1xuXHRcdFx0ZGF0YU1pZ3JhdGVkID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBNaWdyYXRlIHRvIHZlcnNpb24gMlxuXHRcdC8vIEFkZHMgaGlkZVRpZ2dlclN0cmluZyB0byBwcmVmaXggYW5kIHN1ZmZpeCB0eXBlcywgb3ZlcmhhdWxzIGNvZGVcblx0XHRpZiAoc2V0dGluZ3MudmVyc2lvbiA9PT0gMSkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJbSW5saW5lIEFkbW9uaXRpb25zXSBNaWdyYXRpbmcgc2V0dGluZ3MgZnJvbSB2ZXJzaW9uIDEgdG8gMlwiKTtcblx0XHRcdGZvciAoY29uc3QgaWRlbnRpZmllciBpbiBzZXR0aW5ncz8uaW5saW5lQWRtb25pdGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgaWFkID0gc2V0dGluZ3MuaW5saW5lQWRtb25pdGlvbnNbaWRlbnRpZmllcl07XG5cdFx0XHRcdGlmIChpYWQudHlwZSA9PT0gXCJwcmVmaXhcIiAmJiAhaWFkLmhhc093blByb3BlcnR5KFwiaGlkZVRyaWdnZXJTdHJpbmdcIikpIHtcblx0XHRcdFx0XHRpYWQuaGlkZVRyaWdnZXJTdHJpbmcgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaWFkLnR5cGUgPT09IFwic3VmZml4XCIgJiYgIWlhZC5oYXNPd25Qcm9wZXJ0eShcImhpZGVUcmlnZ2VyU3RyaW5nXCIpKSB7XG5cdFx0XHRcdFx0aWFkLmhpZGVUcmlnZ2VyU3RyaW5nID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2V0dGluZ3MuaW5saW5lQWRtb25pdGlvbnNbaWRlbnRpZmllcl0gPSBpYWQ7XG5cdFx0XHR9XG5cdFx0XHRzZXR0aW5ncy52ZXJzaW9uID0gMjtcblx0XHRcdGRhdGFNaWdyYXRlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtzZXR0aW5ncywgZGF0YU1pZ3JhdGVkXTtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogSW5saW5lQWRtb25pdGlvblNldHRpbmdzID0ge1xuXHR2ZXJzaW9uOiAwLFxuXHRpbmxpbmVBZG1vbml0aW9uczogbmV3IE1hcDxzdHJpbmcsIElubGluZUFkbW9uaXRpb24+KClcbn1cbiIsICJpbXBvcnQge0lubGluZUFkbW9uaXRpb259IGZyb20gXCIuL2lubGluZUFkbW9uaXRpb25cIjtcbmltcG9ydCB7SW5saW5lQWRtb25pdGlvblNldHRpbmdzfSBmcm9tIFwiLi4vc2V0dGluZ3MvaW5saW5lQWRtb25pdGlvblNldHRpbmdzXCI7XG5pbXBvcnQgeyBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmV4cG9ydCBjbGFzcyBJbmxpbmVBZG1vbml0aW9uc1Bvc3RQcm9jZXNzb3Ige1xuXHRzZXR0aW5nczogSW5saW5lQWRtb25pdGlvblNldHRpbmdzO1xuXG5cdGNvbnN0cnVjdG9yKHNldHRpbmdzOiBJbmxpbmVBZG1vbml0aW9uU2V0dGluZ3MpIHtcblx0XHR0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG5cdH1cblxuXHRwb3N0UHJvY2VzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY29udGV4dDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCkge1xuXHRcdGVsZW1lbnQuZmluZEFsbChcImNvZGVcIikuZm9yRWFjaChjb2RlYmxvY2sgPT4ge1xuXHRcdFx0dGhpcy5zZXR0aW5ncy5pbmxpbmVBZG1vbml0aW9ucy5mb3JFYWNoKChpYWQ6IElubGluZUFkbW9uaXRpb24pID0+IGlhZC5wcm9jZXNzKGNvZGVibG9jaykpO1xuXHRcdH0pO1xuXHR9XG59XG4iLCAiaW1wb3J0IHtWaWV3VXBkYXRlLCBFZGl0b3JWaWV3LCBWaWV3UGx1Z2luLCBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uU2V0fSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuaW1wb3J0IHtSYW5nZVNldEJ1aWxkZXJ9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHtJbmxpbmVBZG1vbml0aW9ufSBmcm9tIFwiLi9pbmxpbmVBZG1vbml0aW9uXCI7XG5pbXBvcnQge3N5bnRheFRyZWV9IGZyb20gXCJAY29kZW1pcnJvci9sYW5ndWFnZVwiO1xuXG4vLyBQbHVnaW4vRXh0ZW5zaW9uIHRvIGhhbmRsZSBsaXZlLXByZXZpZXcgcmVuZGVyaW5nIG9mIElubGluZSBBZG1vbml0aW9ucy5cbi8vIFJlZmVyZW5jZTogaHR0cHM6Ly9naXRodWIuY29tL2xpYW1jYWluL29ic2lkaWFuLWxhcGVsL2Jsb2IvbWFpbi9zcmMvaGVhZGluZ1dpZGdldC50c1xuLy8gVE9ETyAtIGNyZWF0ZXMgY3NzIGNsYXNzZXMgYmFzZWQgb24gYWRtb25pdGlvbnNcbmV4cG9ydCBmdW5jdGlvbiBpbmxpbmVBZG1vbml0aW9uUGx1Z2luKGFkbW9uaXRpb25zOiBJbmxpbmVBZG1vbml0aW9uW10pIHtcblx0cmV0dXJuIFZpZXdQbHVnaW4uZnJvbUNsYXNzKFxuXHRcdGNsYXNzIHtcblx0XHRcdGRlY29yYXRpb25zOiBEZWNvcmF0aW9uU2V0O1xuXG5cdFx0XHRjb25zdHJ1Y3Rvcih2aWV3OiBFZGl0b3JWaWV3KSB7XG5cdFx0XHRcdHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmJ1aWxkRGVjb3JhdGlvbnModmlldyk7XG5cdFx0XHR9XG5cblx0XHRcdHVwZGF0ZSh1cGRhdGU6IFZpZXdVcGRhdGUpIHtcblx0XHRcdFx0aWYgKHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQpIHtcblx0XHRcdFx0XHR0aGlzLmRlY29yYXRpb25zID0gdGhpcy5idWlsZERlY29yYXRpb25zKHVwZGF0ZS52aWV3KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRidWlsZERlY29yYXRpb25zKHZpZXc6IEVkaXRvclZpZXcpOiBEZWNvcmF0aW9uU2V0IHtcblx0XHRcdFx0Y29uc3QgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXI8RGVjb3JhdGlvbj4oKTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IHtmcm9tLCB0b30gb2Ygdmlldy52aXNpYmxlUmFuZ2VzKSB7XG5cdFx0XHRcdFx0c3ludGF4VHJlZSh2aWV3LnN0YXRlKS5pdGVyYXRlKHtcblx0XHRcdFx0XHRcdGZyb20sXG5cdFx0XHRcdFx0XHR0byxcblx0XHRcdFx0XHRcdGVudGVyOiAobm9kZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAobm9kZS50eXBlLm5hbWUuY29udGFpbnMoXCJpbmxpbmUtY29kZVwiKSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNvbnRlbnQgPSB2aWV3LnN0YXRlLmRvYy5zbGljZVN0cmluZyhub2RlLmZyb20sIG5vZGUudG8pO1xuXHRcdFx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKG5vZGUudHlwZS5uYW1lICsgXCIoXCIgKyBub2RlLmZyb20gKyBcIiwgXCIgKyBub2RlLnRvICsgXCIpIC0gXCIgKyBjb250ZW50KTtcblx0XHRcdFx0XHRcdFx0XHRhZG1vbml0aW9ucy5mb3JFYWNoKGlhZCA9PiBpYWQuYXBwbHlUbyhub2RlLCBjb250ZW50LCBidWlsZGVyKSk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRkZWNvcmF0aW9uczogKHZpZXcpID0+IHZpZXcuZGVjb3JhdGlvbnMsXG5cdFx0fSxcblx0KTtcbn1cblxuIiwgIi8vIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL1phY2hhdG9vL29ic2lkaWFuLWNzcy1lZGl0b3IvYmxvYi9tYWluL3NyYy9vYnNpZGlhbi9maWxlLXN5c3RlbS1oZWxwZXJzLnRzXG5cbi8vIE1JVCBMaWNlbnNlXG4vL1xuLy8gQ29weXJpZ2h0IChjKSAyMDIzIFphY2ggWW91bmdcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gXHRUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbi8vIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gXHRUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIFx0RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gXHRPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuLy8gU09GVFdBUkUuXG5cbmltcG9ydCB7QXBwfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNuaXBwZXREaXIoYXBwOiBBcHApIHtcblx0cmV0dXJuIGAke2FwcC52YXVsdC5jb25maWdEaXJ9L3NuaXBwZXRzYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNuaXBwZXRQYXRoKGFwcDogQXBwLCBmaWxlbmFtZTogc3RyaW5nKSB7XG5cdHJldHVybiBgJHthcHAudmF1bHQuY29uZmlnRGlyfS9zbmlwcGV0cy8ke2ZpbGVuYW1lfWA7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkU25pcHBldEZpbGUoYXBwOiBBcHAsIGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRyZXR1cm4gYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIucmVhZChgJHtzbmlwcGV0UGF0aChhcHAsIGZpbGVuYW1lKX1gKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNuaXBwZXRGaWxlKGFwcDogQXBwLCBmaWxlbmFtZTogc3RyaW5nLCBkYXRhID0gXCJcIik6IFByb21pc2U8dm9pZD4ge1xuXHRhd2FpdCBfdmFsaWRhdGVmaWxlbmFtZShmaWxlbmFtZSk7XG5cdGF3YWl0IF9jcmVhdGVTbmlwcGV0RGlyZWN0b3J5SWZOb3RFeGlzdHMoYXBwKTtcblx0YXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIud3JpdGUoYCR7c25pcHBldFBhdGgoYXBwLCBmaWxlbmFtZSl9YCwgZGF0YSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZVNuaXBwZXRGaWxlKGFwcDogQXBwLCBmaWxlbmFtZTogc3RyaW5nLCBkYXRhOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0YXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIud3JpdGUoYCR7c25pcHBldFBhdGgoYXBwLCBmaWxlbmFtZSl9YCwgZGF0YSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVTbmlwcGV0RmlsZShhcHA6IEFwcCwgZmlsZW5hbWU6IHN0cmluZykge1xuXHRhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5yZW1vdmUoYCR7c25pcHBldFBhdGgoYXBwLCBmaWxlbmFtZSl9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbmlwcGV0RXhpc3RzKGFwcDogQXBwLCBmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdHJldHVybiBhcHAudmF1bHQuYWRhcHRlci5leGlzdHMoYCR7c25pcHBldFBhdGgoYXBwLCBmaWxlbmFtZSl9YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9jcmVhdGVTbmlwcGV0RGlyZWN0b3J5SWZOb3RFeGlzdHMoYXBwOiBBcHApIHtcblx0YXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHNuaXBwZXREaXIoYXBwKSkgfHwgYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoc25pcHBldERpcihhcHApKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3ZhbGlkYXRlZmlsZW5hbWUodmFsdWU6IHN0cmluZykge1xuXHRjb25zdCBlcnJvcnMgPSB7ZXhpc3RzOiBcIlwiLCByZWdleDogXCJcIix9O1xuXHRpZiAodmFsdWUubGVuZ3RoID4gMCAmJiAoYXdhaXQgc25pcHBldEV4aXN0cyh0aGlzLmFwcCwgdmFsdWUpKSkge1xuXHRcdGVycm9ycy5leGlzdHMgPSBcIkZpbGUgYWxyZWFkeSBleGlzdHMuXCI7XG5cdH1cblx0Y29uc3QgcmVnZXggPSAvXlswLTlhLXpBLVpcXC1fIF0rXFwuY3NzJC87XG5cdGlmICghcmVnZXgudGVzdCh2YWx1ZSkpIHtcblx0XHRlcnJvcnMucmVnZXggPVxuXHRcdFx0XCJNdXN0IGVuZCB3aXRoIC5jc3MgYW5kIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMsIHNwYWNlcywgZGFzaGVzLCBvciB1bmRlcnNjb3JlIGNoYXJhY3RlcnMuXCI7XG5cdH1cblx0aWYgKE9iamVjdC52YWx1ZXMoZXJyb3JzKS5zb21lKCh4KSA9PiB4ICE9PSBcIlwiKSkge1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSBPYmplY3QudmFsdWVzKGVycm9ycylcblx0XHRcdC5maWx0ZXIoKHgpID0+IHggIT09IFwiXCIpXG5cdFx0XHQucmVkdWNlKChhY2MsIGN1cnIpID0+IGAke2FjY31cXG4ke2N1cnJ9YCwgXCJGYWlsZWQgdG8gY3JlYXRlIGZpbGUuXCIpO1xuXHRcdHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcblx0fVxufVxuIiwgImltcG9ydCB7Y3JlYXRlU25pcHBldEZpbGUsIHJlYWRTbmlwcGV0RmlsZSwgc25pcHBldEV4aXN0cywgd3JpdGVTbmlwcGV0RmlsZX0gZnJvbSBcIi4vc25pcHBldHNcIjtcbmltcG9ydCB7QXBwfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCAqIGFzIGNzcyBmcm9tIFwiY3NzXCI7XG5cbmV4cG9ydCBjb25zdCBzbmlwcGV0TmFtZSA9IFwiaW5saW5lQWRtb25pdGlvbnNQbHVnaW5SZWFkT25seVwiXG5jb25zdCBzbmlwcGV0RmlsZW5hbWUgPSBzbmlwcGV0TmFtZSArIFwiLmNzc1wiXG5jb25zdCBoZWFkZXIgPSBgLypcbldBUk5JTkc6IFRISVMgRklMRSBJUyBBVVRPR0VORVJBVEVEIEJZIFRIRSBJTkxJTkUgQURNT05JVElPTiBQTFVHSU4uIERPIE5PVCBNT0RJRlkhXG4qL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENzc0ZvckNsYXNzKGFwcDogQXBwLCBjbGFzc05hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdHJldHVybiBfZ2V0Q3NzRm9yQ2xhc3MoY2xhc3NOYW1lLCBhd2FpdCBjc3NGaWxlQ29udGVudHMoYXBwKSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldENzc0ZvckNsYXNzKGFwcDogQXBwLCBjbGFzc05hbWU6IHN0cmluZywgY3NzOiBzdHJpbmcpIHtcblx0Y29uc3QgdXBkYXRlZENzcyA9IF9zZXRDc3NGb3JDbGFzcyhjbGFzc05hbWUsIGNzcywgYXdhaXQgY3NzRmlsZUNvbnRlbnRzKGFwcCkpO1xuXHQvL2h0dHBzOi8vZGlzY29yZC5jb20vY2hhbm5lbHMvNjg2MDUzNzA4MjYxMjI4NTc3Lzg0MDI4NjI2NDk2NDAyMjMwMi8xMjIwNTk2MjM0NTQ1NDAxOTA2XG5cdGFwcC5jdXN0b21Dc3Muc2V0Q3NzRW5hYmxlZFN0YXR1cyhzbmlwcGV0TmFtZSwgdHJ1ZSk7XG5cdGF3YWl0IGFwcC5jdXN0b21Dc3MucmVhZFNuaXBwZXRzKCk7XG5cdGF3YWl0IGFwcC5jdXN0b21Dc3MucmVxdWVzdExvYWRTbmlwcGV0cygpO1xuXHRyZXR1cm4gd3JpdGVTbmlwcGV0RmlsZShhcHAsIHNuaXBwZXRGaWxlbmFtZSwgdXBkYXRlZENzcyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXBlQ3NzKGFwcDogQXBwKSB7XG5cdGlmIChhd2FpdCBzbmlwcGV0RXhpc3RzKGFwcCwgc25pcHBldEZpbGVuYW1lKSkge1xuXHRcdHJldHVybiB3cml0ZVNuaXBwZXRGaWxlKGFwcCwgc25pcHBldEZpbGVuYW1lLCBoZWFkZXIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjcmVhdGVTbmlwcGV0RmlsZShhcHAsIHNuaXBwZXRGaWxlbmFtZSwgaGVhZGVyKTtcblx0fVxufVxuXG4vLyA9PT09PT09PT09XG4vLyAgSU5URVJOQUxcbi8vID09PT09PT09PT1cblxuYXN5bmMgZnVuY3Rpb24gY3NzRmlsZUNvbnRlbnRzKGFwcDogQXBwKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0cmV0dXJuIHJlYWRTbmlwcGV0RmlsZShhcHAsIHNuaXBwZXRGaWxlbmFtZSk7XG59XG5cbi8vIEdldHMgdGhlIGNzcyBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjbGFzc05hbWUgaW4gZW50aXJlIGNzc0NvbnRlbnQgKGNzcyBmaWxlKVxuZnVuY3Rpb24gX2dldENzc0ZvckNsYXNzKGNsYXNzTmFtZTogc3RyaW5nLCBjc3NDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuXHQvLyBUT0RPIC0gYWRkIHNvdXJjZVxuXHRjb25zdCBvYmogPSBjc3MucGFyc2UoY3NzQ29udGVudCwge30pO1xuXHRjb25zdCBzaGVldCA9IG9iai5zdHlsZXNoZWV0O1xuXG5cdGZvciAoY29uc3QgcnVsZSBvZiBzaGVldC5ydWxlcykge1xuXHRcdGlmIChydWxlLnNlbGVjdG9ycy5jb250YWlucyhcIi5cIiArIGNsYXNzTmFtZSkpIHtcblx0XHRcdGxldCBjbGFzc0NvbnRlbnQgPSBcIlwiO1xuXHRcdFx0cnVsZS5kZWNsYXJhdGlvbnMuZm9yRWFjaCgoZGVjOiB7IHByb3BlcnR5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IH0pID0+IHtcblx0XHRcdFx0Y2xhc3NDb250ZW50ICs9IGRlYy5wcm9wZXJ0eSArICc6JyArIGRlYy52YWx1ZSArICc7XFxuJztcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGNsYXNzQ29udGVudDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIFwiXCI7XG59XG5cbi8vIFNldHMgdGhlIGNzcyBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjbGFzc05hbWUgdG8gY3NzQ2xhc3NDb250ZW50IHdpdGhpbiB0aGUgY3NzRmlsZUNvbnRlbnRcbmV4cG9ydCBmdW5jdGlvbiBfc2V0Q3NzRm9yQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcsIGNzc0NsYXNzRGVjbGFyYXRpb25zOiBzdHJpbmcsIGNzc0ZpbGVDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuXHQvLyBUT0RPIC0gYWRkIHNvdXJjZVxuXHRjb25zdCBmaWxlT2JqID0gY3NzLnBhcnNlKGNzc0ZpbGVDb250ZW50LCB7fSk7XG5cdGNvbnN0IGZpbGVTaGVldCA9IGZpbGVPYmouc3R5bGVzaGVldDtcblxuXHRmb3IgKGNvbnN0IHJ1bGUgb2YgZmlsZVNoZWV0LnJ1bGVzKSB7XG5cdFx0aWYgKHJ1bGUuc2VsZWN0b3JzICYmIHJ1bGUuc2VsZWN0b3JzLmNvbnRhaW5zKFwiLlwiICsgY2xhc3NOYW1lKSkge1xuXHRcdFx0cnVsZS5kZWNsYXJhdGlvbnMgPSBfbWFrZUNzc1J1bGUoY2xhc3NOYW1lLCBjc3NDbGFzc0RlY2xhcmF0aW9ucykuZGVjbGFyYXRpb25zXG5cdFx0XHRyZXR1cm4gY3NzLnN0cmluZ2lmeShmaWxlT2JqKTtcblx0XHR9XG5cdH1cblx0ZmlsZVNoZWV0LnJ1bGVzLnB1c2goX21ha2VDc3NSdWxlKGNsYXNzTmFtZSwgY3NzQ2xhc3NEZWNsYXJhdGlvbnMpKTtcblx0cmV0dXJuIGNzcy5zdHJpbmdpZnkoZmlsZU9iaik7XG59XG5cbmZ1bmN0aW9uIF9tYWtlQ3NzUnVsZVN0cmluZyhjbGFzc05hbWU6IHN0cmluZywgY3NzRGVjbGFyYXRpb25zOiBzdHJpbmcpOiBzdHJpbmcge1xuXHQvLyBUT0RPIC0gVGhlIFwiLmlhZFwiIGlzIGhlcmUgdG8gaW5jcmVhc2UgdGhlIHByZWNlZGVuY2UuICBJIGRvbnQgbGlrZSBpdFxuXHRyZXR1cm4gXCIuaWFkLlwiICsgY2xhc3NOYW1lICsgXCIge1xcblwiICsgY3NzRGVjbGFyYXRpb25zICsgXCJcXG59XCI7XG59XG5cbmZ1bmN0aW9uIF9tYWtlQ3NzUnVsZShjbGFzc05hbWU6IHN0cmluZywgY3NzRGVjbGFyYXRpb25zOiBzdHJpbmcpIHtcblx0Y29uc3QgY3NzU3RyaW5nID0gX21ha2VDc3NSdWxlU3RyaW5nKGNsYXNzTmFtZSwgY3NzRGVjbGFyYXRpb25zKTtcblx0cmV0dXJuIGNzcy5wYXJzZShjc3NTdHJpbmcsIHt9KS5zdHlsZXNoZWV0LnJ1bGVzWzBdO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUEsaURBQUFBLFNBQUE7QUFFQSxRQUFJLFlBQVk7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QVMsS0FBSyw0QkFBNEIsWUFBWSxZQUFZO0FBQUEsUUFDbkUsQ0FBQztBQUFBLE1BQ0Y7QUFBQSxJQUNELENBQUM7QUFBQSxFQUNGO0FBQ0Q7IiwKICAibmFtZXMiOiBbIm1vZHVsZSIsICJjc3MiLCAicnVsZXMiLCAibSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAic291cmNlRmlsZSIsICJuZWVkbGUiLCAic2VjdGlvbiIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJlcnJvciIsICJtb2R1bGUiLCAibW9kdWxlIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfc3RhdGUiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF92aWV3IiwgImltcG9ydF9vYnNpZGlhbiIsICJJbmxpbmVBZG1vbml0aW9uVHlwZSIsICJpbXBvcnRfdmlldyIsICJJbmxpbmVBZG1vbml0aW9uU2V0dGluZ3NJTyIsICJpbXBvcnRfdmlldyIsICJjc3MiXQp9Cg==