diff --git a/.gitignore b/.gitignore index ef62189..b8edd98 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .pnpm-debug.log +.obsidian diff --git a/.obsidian/app.json b/.obsidian/app.json deleted file mode 100644 index eb5f189..0000000 --- a/.obsidian/app.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "legacyEditor": false, - "alwaysUpdateLinks": true -} \ No newline at end of file diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json deleted file mode 100644 index 990f337..0000000 --- a/.obsidian/appearance.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "baseFontSize": 16 -} \ No newline at end of file diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json deleted file mode 100644 index bfdcdf8..0000000 --- a/.obsidian/community-plugins.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "obsidian-circuitjs" -] \ No newline at end of file diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json deleted file mode 100644 index ab1d511..0000000 --- a/.obsidian/core-plugins.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - "file-explorer", - "global-search", - "switcher", - "graph", - "backlink", - "page-preview", - "note-composer", - "command-palette", - "editor-status", - "markdown-importer", - "word-count", - "open-with-default-app", - "file-recovery" -] \ No newline at end of file diff --git a/.obsidian/hotkeys.json b/.obsidian/hotkeys.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.obsidian/hotkeys.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-circuitjs/main.js b/.obsidian/plugins/obsidian-circuitjs/main.js deleted file mode 100644 index f9f5b20..0000000 --- a/.obsidian/plugins/obsidian-circuitjs/main.js +++ /dev/null @@ -1,586 +0,0 @@ -/* -THIS IS A GENERATED/BUNDLED FILE BY ESBUILD -if you want to view the source, please visit the github repository of this plugin -*/ - -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); -var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[Object.keys(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __export = (target, all) => { - __markAsModule(target); - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __reExport = (target, module2, desc) => { - if (module2 && typeof module2 === "object" || typeof module2 === "function") { - for (let key of __getOwnPropNames(module2)) - if (!__hasOwnProp.call(target, key) && key !== "default") - __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); - } - return target; -}; -var __toModule = (module2) => { - return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); -}; -var __async = (__this, __arguments, generator) => { - return new Promise((resolve, reject) => { - var fulfilled = (value) => { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - }; - var rejected = (value) => { - try { - step(generator.throw(value)); - } catch (e) { - reject(e); - } - }; - var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); - step((generator = generator.apply(__this, __arguments)).next()); - }); -}; - -// node_modules/.pnpm/lz-string@1.4.4/node_modules/lz-string/libs/lz-string.js -var require_lz_string = __commonJS({ - "node_modules/.pnpm/lz-string@1.4.4/node_modules/lz-string/libs/lz-string.js"(exports, module2) { - var LZString2 = function() { - var f = String.fromCharCode; - var keyStrBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - var keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$"; - var baseReverseDic = {}; - function getBaseValue(alphabet, character) { - if (!baseReverseDic[alphabet]) { - baseReverseDic[alphabet] = {}; - for (var i = 0; i < alphabet.length; i++) { - baseReverseDic[alphabet][alphabet.charAt(i)] = i; - } - } - return baseReverseDic[alphabet][character]; - } - var LZString3 = { - compressToBase64: function(input) { - if (input == null) - return ""; - var res = LZString3._compress(input, 6, function(a) { - return keyStrBase64.charAt(a); - }); - switch (res.length % 4) { - default: - case 0: - return res; - case 1: - return res + "==="; - case 2: - return res + "=="; - case 3: - return res + "="; - } - }, - decompressFromBase64: function(input) { - if (input == null) - return ""; - if (input == "") - return null; - return LZString3._decompress(input.length, 32, function(index) { - return getBaseValue(keyStrBase64, input.charAt(index)); - }); - }, - compressToUTF16: function(input) { - if (input == null) - return ""; - return LZString3._compress(input, 15, function(a) { - return f(a + 32); - }) + " "; - }, - decompressFromUTF16: function(compressed) { - if (compressed == null) - return ""; - if (compressed == "") - return null; - return LZString3._decompress(compressed.length, 16384, function(index) { - return compressed.charCodeAt(index) - 32; - }); - }, - compressToUint8Array: function(uncompressed) { - var compressed = LZString3.compress(uncompressed); - var buf = new Uint8Array(compressed.length * 2); - for (var i = 0, TotalLen = compressed.length; i < TotalLen; i++) { - var current_value = compressed.charCodeAt(i); - buf[i * 2] = current_value >>> 8; - buf[i * 2 + 1] = current_value % 256; - } - return buf; - }, - decompressFromUint8Array: function(compressed) { - if (compressed === null || compressed === void 0) { - return LZString3.decompress(compressed); - } else { - var buf = new Array(compressed.length / 2); - for (var i = 0, TotalLen = buf.length; i < TotalLen; i++) { - buf[i] = compressed[i * 2] * 256 + compressed[i * 2 + 1]; - } - var result = []; - buf.forEach(function(c) { - result.push(f(c)); - }); - return LZString3.decompress(result.join("")); - } - }, - compressToEncodedURIComponent: function(input) { - if (input == null) - return ""; - return LZString3._compress(input, 6, function(a) { - return keyStrUriSafe.charAt(a); - }); - }, - decompressFromEncodedURIComponent: function(input) { - if (input == null) - return ""; - if (input == "") - return null; - input = input.replace(/ /g, "+"); - return LZString3._decompress(input.length, 32, function(index) { - return getBaseValue(keyStrUriSafe, input.charAt(index)); - }); - }, - compress: function(uncompressed) { - return LZString3._compress(uncompressed, 16, function(a) { - return f(a); - }); - }, - _compress: function(uncompressed, bitsPerChar, getCharFromInt) { - if (uncompressed == null) - return ""; - var i, value, context_dictionary = {}, context_dictionaryToCreate = {}, context_c = "", context_wc = "", context_w = "", context_enlargeIn = 2, context_dictSize = 3, context_numBits = 2, context_data = [], context_data_val = 0, context_data_position = 0, ii; - for (ii = 0; ii < uncompressed.length; ii += 1) { - context_c = uncompressed.charAt(ii); - if (!Object.prototype.hasOwnProperty.call(context_dictionary, context_c)) { - context_dictionary[context_c] = context_dictSize++; - context_dictionaryToCreate[context_c] = true; - } - context_wc = context_w + context_c; - if (Object.prototype.hasOwnProperty.call(context_dictionary, context_wc)) { - context_w = context_wc; - } else { - if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) { - if (context_w.charCodeAt(0) < 256) { - for (i = 0; i < context_numBits; i++) { - context_data_val = context_data_val << 1; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - } - value = context_w.charCodeAt(0); - for (i = 0; i < 8; i++) { - context_data_val = context_data_val << 1 | value & 1; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = value >> 1; - } - } else { - value = 1; - for (i = 0; i < context_numBits; i++) { - context_data_val = context_data_val << 1 | value; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = 0; - } - value = context_w.charCodeAt(0); - for (i = 0; i < 16; i++) { - context_data_val = context_data_val << 1 | value & 1; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = value >> 1; - } - } - context_enlargeIn--; - if (context_enlargeIn == 0) { - context_enlargeIn = Math.pow(2, context_numBits); - context_numBits++; - } - delete context_dictionaryToCreate[context_w]; - } else { - value = context_dictionary[context_w]; - for (i = 0; i < context_numBits; i++) { - context_data_val = context_data_val << 1 | value & 1; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = value >> 1; - } - } - context_enlargeIn--; - if (context_enlargeIn == 0) { - context_enlargeIn = Math.pow(2, context_numBits); - context_numBits++; - } - context_dictionary[context_wc] = context_dictSize++; - context_w = String(context_c); - } - } - if (context_w !== "") { - if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) { - if (context_w.charCodeAt(0) < 256) { - for (i = 0; i < context_numBits; i++) { - context_data_val = context_data_val << 1; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - } - value = context_w.charCodeAt(0); - for (i = 0; i < 8; i++) { - context_data_val = context_data_val << 1 | value & 1; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = value >> 1; - } - } else { - value = 1; - for (i = 0; i < context_numBits; i++) { - context_data_val = context_data_val << 1 | value; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = 0; - } - value = context_w.charCodeAt(0); - for (i = 0; i < 16; i++) { - context_data_val = context_data_val << 1 | value & 1; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = value >> 1; - } - } - context_enlargeIn--; - if (context_enlargeIn == 0) { - context_enlargeIn = Math.pow(2, context_numBits); - context_numBits++; - } - delete context_dictionaryToCreate[context_w]; - } else { - value = context_dictionary[context_w]; - for (i = 0; i < context_numBits; i++) { - context_data_val = context_data_val << 1 | value & 1; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = value >> 1; - } - } - context_enlargeIn--; - if (context_enlargeIn == 0) { - context_enlargeIn = Math.pow(2, context_numBits); - context_numBits++; - } - } - value = 2; - for (i = 0; i < context_numBits; i++) { - context_data_val = context_data_val << 1 | value & 1; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = value >> 1; - } - while (true) { - context_data_val = context_data_val << 1; - if (context_data_position == bitsPerChar - 1) { - context_data.push(getCharFromInt(context_data_val)); - break; - } else - context_data_position++; - } - return context_data.join(""); - }, - decompress: function(compressed) { - if (compressed == null) - return ""; - if (compressed == "") - return null; - return LZString3._decompress(compressed.length, 32768, function(index) { - return compressed.charCodeAt(index); - }); - }, - _decompress: function(length, resetValue, getNextValue) { - var dictionary = [], next, enlargeIn = 4, dictSize = 4, numBits = 3, entry = "", result = [], i, w, bits, resb, maxpower, power, c, data = { val: getNextValue(0), position: resetValue, index: 1 }; - for (i = 0; i < 3; i += 1) { - dictionary[i] = i; - } - bits = 0; - maxpower = Math.pow(2, 2); - power = 1; - while (power != maxpower) { - resb = data.val & data.position; - data.position >>= 1; - if (data.position == 0) { - data.position = resetValue; - data.val = getNextValue(data.index++); - } - bits |= (resb > 0 ? 1 : 0) * power; - power <<= 1; - } - switch (next = bits) { - case 0: - bits = 0; - maxpower = Math.pow(2, 8); - power = 1; - while (power != maxpower) { - resb = data.val & data.position; - data.position >>= 1; - if (data.position == 0) { - data.position = resetValue; - data.val = getNextValue(data.index++); - } - bits |= (resb > 0 ? 1 : 0) * power; - power <<= 1; - } - c = f(bits); - break; - case 1: - bits = 0; - maxpower = Math.pow(2, 16); - power = 1; - while (power != maxpower) { - resb = data.val & data.position; - data.position >>= 1; - if (data.position == 0) { - data.position = resetValue; - data.val = getNextValue(data.index++); - } - bits |= (resb > 0 ? 1 : 0) * power; - power <<= 1; - } - c = f(bits); - break; - case 2: - return ""; - } - dictionary[3] = c; - w = c; - result.push(c); - while (true) { - if (data.index > length) { - return ""; - } - bits = 0; - maxpower = Math.pow(2, numBits); - power = 1; - while (power != maxpower) { - resb = data.val & data.position; - data.position >>= 1; - if (data.position == 0) { - data.position = resetValue; - data.val = getNextValue(data.index++); - } - bits |= (resb > 0 ? 1 : 0) * power; - power <<= 1; - } - switch (c = bits) { - case 0: - bits = 0; - maxpower = Math.pow(2, 8); - power = 1; - while (power != maxpower) { - resb = data.val & data.position; - data.position >>= 1; - if (data.position == 0) { - data.position = resetValue; - data.val = getNextValue(data.index++); - } - bits |= (resb > 0 ? 1 : 0) * power; - power <<= 1; - } - dictionary[dictSize++] = f(bits); - c = dictSize - 1; - enlargeIn--; - break; - case 1: - bits = 0; - maxpower = Math.pow(2, 16); - power = 1; - while (power != maxpower) { - resb = data.val & data.position; - data.position >>= 1; - if (data.position == 0) { - data.position = resetValue; - data.val = getNextValue(data.index++); - } - bits |= (resb > 0 ? 1 : 0) * power; - power <<= 1; - } - dictionary[dictSize++] = f(bits); - c = dictSize - 1; - enlargeIn--; - break; - case 2: - return result.join(""); - } - if (enlargeIn == 0) { - enlargeIn = Math.pow(2, numBits); - numBits++; - } - if (dictionary[c]) { - entry = dictionary[c]; - } else { - if (c === dictSize) { - entry = w + w.charAt(0); - } else { - return null; - } - } - result.push(entry); - dictionary[dictSize++] = w + entry.charAt(0); - enlargeIn--; - w = entry; - if (enlargeIn == 0) { - enlargeIn = Math.pow(2, numBits); - numBits++; - } - } - } - }; - return LZString3; - }(); - if (typeof define === "function" && define.amd) { - define(function() { - return LZString2; - }); - } else if (typeof module2 !== "undefined" && module2 != null) { - module2.exports = LZString2; - } - } -}); - -// main.ts -__export(exports, { - default: () => CircuitJsPlugin -}); -var import_obsidian2 = __toModule(require("obsidian")); - -// circuitRenderer.ts -var import_obsidian = __toModule(require("obsidian")); -var LZString = __toModule(require_lz_string()); -var CircuitRenderChild = class extends import_obsidian.MarkdownRenderChild { - constructor(el, renderer, content, settings) { - super(el); - this.settings = settings; - this.code = content; - this.compressed = LZString.compressToEncodedURIComponent(this.code); - if (this.settings.editable) { - this.url = `${this.settings.circuitJsUrl}?ctz=${this.compressed}&running=true`; - } else { - this.url = `${this.settings.circuitJsUrl}?ctz=${this.compressed}&running=false`; - } - } - onload() { - const div = document.createElement("div"); - if (this.settings.editLink) { - const editLink = document.createElement("a"); - editLink.setAttribute("href", this.url); - const editLinkContent = document.createTextNode("[EDIT]"); - editLink.appendChild(editLinkContent); - div.appendChild(editLink); - } - const iframeNode = document.createElement("iframe"); - iframeNode.setAttribute("src", this.url); - iframeNode.setAttribute("width", "100%"); - iframeNode.setAttribute("height", "600px"); - div.appendChild(iframeNode); - this.containerEl.appendChild(div); - } - onunload() { - } -}; - -// main.ts -var DEFAULT_SETTINGS = { - editable: true, - editLink: true, - circuitJsUrl: "http://falstad.com/circuit/circuitjs.html", - circuitTag: "circuitjs" -}; -var CircuitJsPlugin = class extends import_obsidian2.Plugin { - constructor() { - super(...arguments); - this.postprocessor = (content, el, ctx) => __async(this, null, function* () { - ctx.addChild(new CircuitRenderChild(el, this, content, this.settings)); - }); - } - onload() { - return __async(this, null, function* () { - yield this.loadSettings(); - this.registerMarkdownCodeBlockProcessor(this.settings.circuitTag, this.postprocessor); - }); - } - onunload() { - } - loadSettings() { - return __async(this, null, function* () { - this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); - }); - } - saveSettings() { - return __async(this, null, function* () { - yield this.saveData(this.settings); - }); - } -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzLy5wbnBtL2x6LXN0cmluZ0AxLjQuNC9ub2RlX21vZHVsZXMvbHotc3RyaW5nL2xpYnMvbHotc3RyaW5nLmpzIiwgIm1haW4udHMiLCAiY2lyY3VpdFJlbmRlcmVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBDb3B5cmlnaHQgKGMpIDIwMTMgUGllcm94eSA8cGllcm94eUBwaWVyb3h5Lm5ldD5cbi8vIFRoaXMgd29yayBpcyBmcmVlLiBZb3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0XG4vLyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIFdURlBMLCBWZXJzaW9uIDJcbi8vIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBMSUNFTlNFLnR4dCBvciBodHRwOi8vd3d3Lnd0ZnBsLm5ldC9cbi8vXG4vLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgdGhlIGhvbWUgcGFnZTpcbi8vIGh0dHA6Ly9waWVyb3h5Lm5ldC9ibG9nL3BhZ2VzL2x6LXN0cmluZy90ZXN0aW5nLmh0bWxcbi8vXG4vLyBMWi1iYXNlZCBjb21wcmVzc2lvbiBhbGdvcml0aG0sIHZlcnNpb24gMS40LjRcbnZhciBMWlN0cmluZyA9IChmdW5jdGlvbigpIHtcblxuLy8gcHJpdmF0ZSBwcm9wZXJ0eVxudmFyIGYgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xudmFyIGtleVN0ckJhc2U2NCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIjtcbnZhciBrZXlTdHJVcmlTYWZlID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSstJFwiO1xudmFyIGJhc2VSZXZlcnNlRGljID0ge307XG5cbmZ1bmN0aW9uIGdldEJhc2VWYWx1ZShhbHBoYWJldCwgY2hhcmFjdGVyKSB7XG4gIGlmICghYmFzZVJldmVyc2VEaWNbYWxwaGFiZXRdKSB7XG4gICAgYmFzZVJldmVyc2VEaWNbYWxwaGFiZXRdID0ge307XG4gICAgZm9yICh2YXIgaT0wIDsgaTxhbHBoYWJldC5sZW5ndGggOyBpKyspIHtcbiAgICAgIGJhc2VSZXZlcnNlRGljW2FscGhhYmV0XVthbHBoYWJldC5jaGFyQXQoaSldID0gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJhc2VSZXZlcnNlRGljW2FscGhhYmV0XVtjaGFyYWN0ZXJdO1xufVxuXG52YXIgTFpTdHJpbmcgPSB7XG4gIGNvbXByZXNzVG9CYXNlNjQgOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgPT0gbnVsbCkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHJlcyA9IExaU3RyaW5nLl9jb21wcmVzcyhpbnB1dCwgNiwgZnVuY3Rpb24oYSl7cmV0dXJuIGtleVN0ckJhc2U2NC5jaGFyQXQoYSk7fSk7XG4gICAgc3dpdGNoIChyZXMubGVuZ3RoICUgNCkgeyAvLyBUbyBwcm9kdWNlIHZhbGlkIEJhc2U2NFxuICAgIGRlZmF1bHQ6IC8vIFdoZW4gY291bGQgdGhpcyBoYXBwZW4gP1xuICAgIGNhc2UgMCA6IHJldHVybiByZXM7XG4gICAgY2FzZSAxIDogcmV0dXJuIHJlcytcIj09PVwiO1xuICAgIGNhc2UgMiA6IHJldHVybiByZXMrXCI9PVwiO1xuICAgIGNhc2UgMyA6IHJldHVybiByZXMrXCI9XCI7XG4gICAgfVxuICB9LFxuXG4gIGRlY29tcHJlc3NGcm9tQmFzZTY0IDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgaWYgKGlucHV0ID09IG51bGwpIHJldHVybiBcIlwiO1xuICAgIGlmIChpbnB1dCA9PSBcIlwiKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gTFpTdHJpbmcuX2RlY29tcHJlc3MoaW5wdXQubGVuZ3RoLCAzMiwgZnVuY3Rpb24oaW5kZXgpIHsgcmV0dXJuIGdldEJhc2VWYWx1ZShrZXlTdHJCYXNlNjQsIGlucHV0LmNoYXJBdChpbmRleCkpOyB9KTtcbiAgfSxcblxuICBjb21wcmVzc1RvVVRGMTYgOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgPT0gbnVsbCkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIExaU3RyaW5nLl9jb21wcmVzcyhpbnB1dCwgMTUsIGZ1bmN0aW9uKGEpe3JldHVybiBmKGErMzIpO30pICsgXCIgXCI7XG4gIH0sXG5cbiAgZGVjb21wcmVzc0Zyb21VVEYxNjogZnVuY3Rpb24gKGNvbXByZXNzZWQpIHtcbiAgICBpZiAoY29tcHJlc3NlZCA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICBpZiAoY29tcHJlc3NlZCA9PSBcIlwiKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gTFpTdHJpbmcuX2RlY29tcHJlc3MoY29tcHJlc3NlZC5sZW5ndGgsIDE2Mzg0LCBmdW5jdGlvbihpbmRleCkgeyByZXR1cm4gY29tcHJlc3NlZC5jaGFyQ29kZUF0KGluZGV4KSAtIDMyOyB9KTtcbiAgfSxcblxuICAvL2NvbXByZXNzIGludG8gdWludDhhcnJheSAoVUNTLTIgYmlnIGVuZGlhbiBmb3JtYXQpXG4gIGNvbXByZXNzVG9VaW50OEFycmF5OiBmdW5jdGlvbiAodW5jb21wcmVzc2VkKSB7XG4gICAgdmFyIGNvbXByZXNzZWQgPSBMWlN0cmluZy5jb21wcmVzcyh1bmNvbXByZXNzZWQpO1xuICAgIHZhciBidWY9bmV3IFVpbnQ4QXJyYXkoY29tcHJlc3NlZC5sZW5ndGgqMik7IC8vIDIgYnl0ZXMgcGVyIGNoYXJhY3RlclxuXG4gICAgZm9yICh2YXIgaT0wLCBUb3RhbExlbj1jb21wcmVzc2VkLmxlbmd0aDsgaTxUb3RhbExlbjsgaSsrKSB7XG4gICAgICB2YXIgY3VycmVudF92YWx1ZSA9IGNvbXByZXNzZWQuY2hhckNvZGVBdChpKTtcbiAgICAgIGJ1ZltpKjJdID0gY3VycmVudF92YWx1ZSA+Pj4gODtcbiAgICAgIGJ1ZltpKjIrMV0gPSBjdXJyZW50X3ZhbHVlICUgMjU2O1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9LFxuXG4gIC8vZGVjb21wcmVzcyBmcm9tIHVpbnQ4YXJyYXkgKFVDUy0yIGJpZyBlbmRpYW4gZm9ybWF0KVxuICBkZWNvbXByZXNzRnJvbVVpbnQ4QXJyYXk6ZnVuY3Rpb24gKGNvbXByZXNzZWQpIHtcbiAgICBpZiAoY29tcHJlc3NlZD09PW51bGwgfHwgY29tcHJlc3NlZD09PXVuZGVmaW5lZCl7XG4gICAgICAgIHJldHVybiBMWlN0cmluZy5kZWNvbXByZXNzKGNvbXByZXNzZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBidWY9bmV3IEFycmF5KGNvbXByZXNzZWQubGVuZ3RoLzIpOyAvLyAyIGJ5dGVzIHBlciBjaGFyYWN0ZXJcbiAgICAgICAgZm9yICh2YXIgaT0wLCBUb3RhbExlbj1idWYubGVuZ3RoOyBpPFRvdGFsTGVuOyBpKyspIHtcbiAgICAgICAgICBidWZbaV09Y29tcHJlc3NlZFtpKjJdKjI1Nitjb21wcmVzc2VkW2kqMisxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgYnVmLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChmKGMpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBMWlN0cmluZy5kZWNvbXByZXNzKHJlc3VsdC5qb2luKCcnKSk7XG5cbiAgICB9XG5cbiAgfSxcblxuXG4gIC8vY29tcHJlc3MgaW50byBhIHN0cmluZyB0aGF0IGlzIGFscmVhZHkgVVJJIGVuY29kZWRcbiAgY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQ6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIGlmIChpbnB1dCA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gTFpTdHJpbmcuX2NvbXByZXNzKGlucHV0LCA2LCBmdW5jdGlvbihhKXtyZXR1cm4ga2V5U3RyVXJpU2FmZS5jaGFyQXQoYSk7fSk7XG4gIH0sXG5cbiAgLy9kZWNvbXByZXNzIGZyb20gYW4gb3V0cHV0IG9mIGNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50XG4gIGRlY29tcHJlc3NGcm9tRW5jb2RlZFVSSUNvbXBvbmVudDpmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgPT0gbnVsbCkgcmV0dXJuIFwiXCI7XG4gICAgaWYgKGlucHV0ID09IFwiXCIpIHJldHVybiBudWxsO1xuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvIC9nLCBcIitcIik7XG4gICAgcmV0dXJuIExaU3RyaW5nLl9kZWNvbXByZXNzKGlucHV0Lmxlbmd0aCwgMzIsIGZ1bmN0aW9uKGluZGV4KSB7IHJldHVybiBnZXRCYXNlVmFsdWUoa2V5U3RyVXJpU2FmZSwgaW5wdXQuY2hhckF0KGluZGV4KSk7IH0pO1xuICB9LFxuXG4gIGNvbXByZXNzOiBmdW5jdGlvbiAodW5jb21wcmVzc2VkKSB7XG4gICAgcmV0dXJuIExaU3RyaW5nLl9jb21wcmVzcyh1bmNvbXByZXNzZWQsIDE2LCBmdW5jdGlvbihhKXtyZXR1cm4gZihhKTt9KTtcbiAgfSxcbiAgX2NvbXByZXNzOiBmdW5jdGlvbiAodW5jb21wcmVzc2VkLCBiaXRzUGVyQ2hhciwgZ2V0Q2hhckZyb21JbnQpIHtcbiAgICBpZiAodW5jb21wcmVzc2VkID09IG51bGwpIHJldHVybiBcIlwiO1xuICAgIHZhciBpLCB2YWx1ZSxcbiAgICAgICAgY29udGV4dF9kaWN0aW9uYXJ5PSB7fSxcbiAgICAgICAgY29udGV4dF9kaWN0aW9uYXJ5VG9DcmVhdGU9IHt9LFxuICAgICAgICBjb250ZXh0X2M9XCJcIixcbiAgICAgICAgY29udGV4dF93Yz1cIlwiLFxuICAgICAgICBjb250ZXh0X3c9XCJcIixcbiAgICAgICAgY29udGV4dF9lbmxhcmdlSW49IDIsIC8vIENvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBlbnRyeSB3aGljaCBzaG91bGQgbm90IGNvdW50XG4gICAgICAgIGNvbnRleHRfZGljdFNpemU9IDMsXG4gICAgICAgIGNvbnRleHRfbnVtQml0cz0gMixcbiAgICAgICAgY29udGV4dF9kYXRhPVtdLFxuICAgICAgICBjb250ZXh0X2RhdGFfdmFsPTAsXG4gICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbj0wLFxuICAgICAgICBpaTtcblxuICAgIGZvciAoaWkgPSAwOyBpaSA8IHVuY29tcHJlc3NlZC5sZW5ndGg7IGlpICs9IDEpIHtcbiAgICAgIGNvbnRleHRfYyA9IHVuY29tcHJlc3NlZC5jaGFyQXQoaWkpO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29udGV4dF9kaWN0aW9uYXJ5LGNvbnRleHRfYykpIHtcbiAgICAgICAgY29udGV4dF9kaWN0aW9uYXJ5W2NvbnRleHRfY10gPSBjb250ZXh0X2RpY3RTaXplKys7XG4gICAgICAgIGNvbnRleHRfZGljdGlvbmFyeVRvQ3JlYXRlW2NvbnRleHRfY10gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0X3djID0gY29udGV4dF93ICsgY29udGV4dF9jO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb250ZXh0X2RpY3Rpb25hcnksY29udGV4dF93YykpIHtcbiAgICAgICAgY29udGV4dF93ID0gY29udGV4dF93YztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29udGV4dF9kaWN0aW9uYXJ5VG9DcmVhdGUsY29udGV4dF93KSkge1xuICAgICAgICAgIGlmIChjb250ZXh0X3cuY2hhckNvZGVBdCgwKTwyNTYpIHtcbiAgICAgICAgICAgIGZvciAoaT0wIDsgaTxjb250ZXh0X251bUJpdHMgOyBpKyspIHtcbiAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IChjb250ZXh0X2RhdGFfdmFsIDw8IDEpO1xuICAgICAgICAgICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09IGJpdHNQZXJDaGFyLTEpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YS5wdXNoKGdldENoYXJGcm9tSW50KGNvbnRleHRfZGF0YV92YWwpKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsID0gMDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24rKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWUgPSBjb250ZXh0X3cuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgIGZvciAoaT0wIDsgaTw4IDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAoY29udGV4dF9kYXRhX3ZhbCA8PCAxKSB8ICh2YWx1ZSYxKTtcbiAgICAgICAgICAgICAgaWYgKGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9PSBiaXRzUGVyQ2hhci0xKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGEucHVzaChnZXRDaGFyRnJvbUludChjb250ZXh0X2RhdGFfdmFsKSk7XG4gICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IDA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA+PiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IDE7XG4gICAgICAgICAgICBmb3IgKGk9MCA7IGk8Y29udGV4dF9udW1CaXRzIDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAoY29udGV4dF9kYXRhX3ZhbCA8PCAxKSB8IHZhbHVlO1xuICAgICAgICAgICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09Yml0c1BlckNoYXItMSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICAgICAgY29udGV4dF9kYXRhLnB1c2goZ2V0Q2hhckZyb21JbnQoY29udGV4dF9kYXRhX3ZhbCkpO1xuICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAwO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbisrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhbHVlID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gY29udGV4dF93LmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICBmb3IgKGk9MCA7IGk8MTYgOyBpKyspIHtcbiAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IChjb250ZXh0X2RhdGFfdmFsIDw8IDEpIHwgKHZhbHVlJjEpO1xuICAgICAgICAgICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09IGJpdHNQZXJDaGFyLTEpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YS5wdXNoKGdldENoYXJGcm9tSW50KGNvbnRleHRfZGF0YV92YWwpKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsID0gMDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24rKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRleHRfZW5sYXJnZUluLS07XG4gICAgICAgICAgaWYgKGNvbnRleHRfZW5sYXJnZUluID09IDApIHtcbiAgICAgICAgICAgIGNvbnRleHRfZW5sYXJnZUluID0gTWF0aC5wb3coMiwgY29udGV4dF9udW1CaXRzKTtcbiAgICAgICAgICAgIGNvbnRleHRfbnVtQml0cysrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgY29udGV4dF9kaWN0aW9uYXJ5VG9DcmVhdGVbY29udGV4dF93XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IGNvbnRleHRfZGljdGlvbmFyeVtjb250ZXh0X3ddO1xuICAgICAgICAgIGZvciAoaT0wIDsgaTxjb250ZXh0X251bUJpdHMgOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAoY29udGV4dF9kYXRhX3ZhbCA8PCAxKSB8ICh2YWx1ZSYxKTtcbiAgICAgICAgICAgIGlmIChjb250ZXh0X2RhdGFfcG9zaXRpb24gPT0gYml0c1BlckNoYXItMSkge1xuICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgICBjb250ZXh0X2RhdGEucHVzaChnZXRDaGFyRnJvbUludChjb250ZXh0X2RhdGFfdmFsKSk7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+IDE7XG4gICAgICAgICAgfVxuXG5cbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0X2VubGFyZ2VJbi0tO1xuICAgICAgICBpZiAoY29udGV4dF9lbmxhcmdlSW4gPT0gMCkge1xuICAgICAgICAgIGNvbnRleHRfZW5sYXJnZUluID0gTWF0aC5wb3coMiwgY29udGV4dF9udW1CaXRzKTtcbiAgICAgICAgICBjb250ZXh0X251bUJpdHMrKztcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGQgd2MgdG8gdGhlIGRpY3Rpb25hcnkuXG4gICAgICAgIGNvbnRleHRfZGljdGlvbmFyeVtjb250ZXh0X3djXSA9IGNvbnRleHRfZGljdFNpemUrKztcbiAgICAgICAgY29udGV4dF93ID0gU3RyaW5nKGNvbnRleHRfYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3V0cHV0IHRoZSBjb2RlIGZvciB3LlxuICAgIGlmIChjb250ZXh0X3cgIT09IFwiXCIpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29udGV4dF9kaWN0aW9uYXJ5VG9DcmVhdGUsY29udGV4dF93KSkge1xuICAgICAgICBpZiAoY29udGV4dF93LmNoYXJDb2RlQXQoMCk8MjU2KSB7XG4gICAgICAgICAgZm9yIChpPTAgOyBpPGNvbnRleHRfbnVtQml0cyA7IGkrKykge1xuICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IChjb250ZXh0X2RhdGFfdmFsIDw8IDEpO1xuICAgICAgICAgICAgaWYgKGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9PSBiaXRzUGVyQ2hhci0xKSB7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YS5wdXNoKGdldENoYXJGcm9tSW50KGNvbnRleHRfZGF0YV92YWwpKTtcbiAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSBjb250ZXh0X3cuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICBmb3IgKGk9MCA7IGk8OCA7IGkrKykge1xuICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IChjb250ZXh0X2RhdGFfdmFsIDw8IDEpIHwgKHZhbHVlJjEpO1xuICAgICAgICAgICAgaWYgKGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9PSBiaXRzUGVyQ2hhci0xKSB7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YS5wdXNoKGdldENoYXJGcm9tSW50KGNvbnRleHRfZGF0YV92YWwpKTtcbiAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPj4gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSAxO1xuICAgICAgICAgIGZvciAoaT0wIDsgaTxjb250ZXh0X251bUJpdHMgOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAoY29udGV4dF9kYXRhX3ZhbCA8PCAxKSB8IHZhbHVlO1xuICAgICAgICAgICAgaWYgKGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9PSBiaXRzUGVyQ2hhci0xKSB7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YS5wdXNoKGdldENoYXJGcm9tSW50KGNvbnRleHRfZGF0YV92YWwpKTtcbiAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSBjb250ZXh0X3cuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICBmb3IgKGk9MCA7IGk8MTYgOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAoY29udGV4dF9kYXRhX3ZhbCA8PCAxKSB8ICh2YWx1ZSYxKTtcbiAgICAgICAgICAgIGlmIChjb250ZXh0X2RhdGFfcG9zaXRpb24gPT0gYml0c1BlckNoYXItMSkge1xuICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgICBjb250ZXh0X2RhdGEucHVzaChnZXRDaGFyRnJvbUludChjb250ZXh0X2RhdGFfdmFsKSk7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRleHRfZW5sYXJnZUluLS07XG4gICAgICAgIGlmIChjb250ZXh0X2VubGFyZ2VJbiA9PSAwKSB7XG4gICAgICAgICAgY29udGV4dF9lbmxhcmdlSW4gPSBNYXRoLnBvdygyLCBjb250ZXh0X251bUJpdHMpO1xuICAgICAgICAgIGNvbnRleHRfbnVtQml0cysrO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBjb250ZXh0X2RpY3Rpb25hcnlUb0NyZWF0ZVtjb250ZXh0X3ddO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBjb250ZXh0X2RpY3Rpb25hcnlbY29udGV4dF93XTtcbiAgICAgICAgZm9yIChpPTAgOyBpPGNvbnRleHRfbnVtQml0cyA7IGkrKykge1xuICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAoY29udGV4dF9kYXRhX3ZhbCA8PCAxKSB8ICh2YWx1ZSYxKTtcbiAgICAgICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09IGJpdHNQZXJDaGFyLTEpIHtcbiAgICAgICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICBjb250ZXh0X2RhdGEucHVzaChnZXRDaGFyRnJvbUludChjb250ZXh0X2RhdGFfdmFsKSk7XG4gICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbHVlID0gdmFsdWUgPj4gMTtcbiAgICAgICAgfVxuXG5cbiAgICAgIH1cbiAgICAgIGNvbnRleHRfZW5sYXJnZUluLS07XG4gICAgICBpZiAoY29udGV4dF9lbmxhcmdlSW4gPT0gMCkge1xuICAgICAgICBjb250ZXh0X2VubGFyZ2VJbiA9IE1hdGgucG93KDIsIGNvbnRleHRfbnVtQml0cyk7XG4gICAgICAgIGNvbnRleHRfbnVtQml0cysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1hcmsgdGhlIGVuZCBvZiB0aGUgc3RyZWFtXG4gICAgdmFsdWUgPSAyO1xuICAgIGZvciAoaT0wIDsgaTxjb250ZXh0X251bUJpdHMgOyBpKyspIHtcbiAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAoY29udGV4dF9kYXRhX3ZhbCA8PCAxKSB8ICh2YWx1ZSYxKTtcbiAgICAgIGlmIChjb250ZXh0X2RhdGFfcG9zaXRpb24gPT0gYml0c1BlckNoYXItMSkge1xuICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24gPSAwO1xuICAgICAgICBjb250ZXh0X2RhdGEucHVzaChnZXRDaGFyRnJvbUludChjb250ZXh0X2RhdGFfdmFsKSk7XG4gICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHZhbHVlID4+IDE7XG4gICAgfVxuXG4gICAgLy8gRmx1c2ggdGhlIGxhc3QgY2hhclxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb250ZXh0X2RhdGFfdmFsID0gKGNvbnRleHRfZGF0YV92YWwgPDwgMSk7XG4gICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09IGJpdHNQZXJDaGFyLTEpIHtcbiAgICAgICAgY29udGV4dF9kYXRhLnB1c2goZ2V0Q2hhckZyb21JbnQoY29udGV4dF9kYXRhX3ZhbCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGVsc2UgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0X2RhdGEuam9pbignJyk7XG4gIH0sXG5cbiAgZGVjb21wcmVzczogZnVuY3Rpb24gKGNvbXByZXNzZWQpIHtcbiAgICBpZiAoY29tcHJlc3NlZCA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICBpZiAoY29tcHJlc3NlZCA9PSBcIlwiKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gTFpTdHJpbmcuX2RlY29tcHJlc3MoY29tcHJlc3NlZC5sZW5ndGgsIDMyNzY4LCBmdW5jdGlvbihpbmRleCkgeyByZXR1cm4gY29tcHJlc3NlZC5jaGFyQ29kZUF0KGluZGV4KTsgfSk7XG4gIH0sXG5cbiAgX2RlY29tcHJlc3M6IGZ1bmN0aW9uIChsZW5ndGgsIHJlc2V0VmFsdWUsIGdldE5leHRWYWx1ZSkge1xuICAgIHZhciBkaWN0aW9uYXJ5ID0gW10sXG4gICAgICAgIG5leHQsXG4gICAgICAgIGVubGFyZ2VJbiA9IDQsXG4gICAgICAgIGRpY3RTaXplID0gNCxcbiAgICAgICAgbnVtQml0cyA9IDMsXG4gICAgICAgIGVudHJ5ID0gXCJcIixcbiAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgIGksXG4gICAgICAgIHcsXG4gICAgICAgIGJpdHMsIHJlc2IsIG1heHBvd2VyLCBwb3dlcixcbiAgICAgICAgYyxcbiAgICAgICAgZGF0YSA9IHt2YWw6Z2V0TmV4dFZhbHVlKDApLCBwb3NpdGlvbjpyZXNldFZhbHVlLCBpbmRleDoxfTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpICs9IDEpIHtcbiAgICAgIGRpY3Rpb25hcnlbaV0gPSBpO1xuICAgIH1cblxuICAgIGJpdHMgPSAwO1xuICAgIG1heHBvd2VyID0gTWF0aC5wb3coMiwyKTtcbiAgICBwb3dlcj0xO1xuICAgIHdoaWxlIChwb3dlciE9bWF4cG93ZXIpIHtcbiAgICAgIHJlc2IgPSBkYXRhLnZhbCAmIGRhdGEucG9zaXRpb247XG4gICAgICBkYXRhLnBvc2l0aW9uID4+PSAxO1xuICAgICAgaWYgKGRhdGEucG9zaXRpb24gPT0gMCkge1xuICAgICAgICBkYXRhLnBvc2l0aW9uID0gcmVzZXRWYWx1ZTtcbiAgICAgICAgZGF0YS52YWwgPSBnZXROZXh0VmFsdWUoZGF0YS5pbmRleCsrKTtcbiAgICAgIH1cbiAgICAgIGJpdHMgfD0gKHJlc2I+MCA/IDEgOiAwKSAqIHBvd2VyO1xuICAgICAgcG93ZXIgPDw9IDE7XG4gICAgfVxuXG4gICAgc3dpdGNoIChuZXh0ID0gYml0cykge1xuICAgICAgY2FzZSAwOlxuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIG1heHBvd2VyID0gTWF0aC5wb3coMiw4KTtcbiAgICAgICAgICBwb3dlcj0xO1xuICAgICAgICAgIHdoaWxlIChwb3dlciE9bWF4cG93ZXIpIHtcbiAgICAgICAgICAgIHJlc2IgPSBkYXRhLnZhbCAmIGRhdGEucG9zaXRpb247XG4gICAgICAgICAgICBkYXRhLnBvc2l0aW9uID4+PSAxO1xuICAgICAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gPT0gMCkge1xuICAgICAgICAgICAgICBkYXRhLnBvc2l0aW9uID0gcmVzZXRWYWx1ZTtcbiAgICAgICAgICAgICAgZGF0YS52YWwgPSBnZXROZXh0VmFsdWUoZGF0YS5pbmRleCsrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJpdHMgfD0gKHJlc2I+MCA/IDEgOiAwKSAqIHBvd2VyO1xuICAgICAgICAgICAgcG93ZXIgPDw9IDE7XG4gICAgICAgICAgfVxuICAgICAgICBjID0gZihiaXRzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgbWF4cG93ZXIgPSBNYXRoLnBvdygyLDE2KTtcbiAgICAgICAgICBwb3dlcj0xO1xuICAgICAgICAgIHdoaWxlIChwb3dlciE9bWF4cG93ZXIpIHtcbiAgICAgICAgICAgIHJlc2IgPSBkYXRhLnZhbCAmIGRhdGEucG9zaXRpb247XG4gICAgICAgICAgICBkYXRhLnBvc2l0aW9uID4+PSAxO1xuICAgICAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gPT0gMCkge1xuICAgICAgICAgICAgICBkYXRhLnBvc2l0aW9uID0gcmVzZXRWYWx1ZTtcbiAgICAgICAgICAgICAgZGF0YS52YWwgPSBnZXROZXh0VmFsdWUoZGF0YS5pbmRleCsrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJpdHMgfD0gKHJlc2I+MCA/IDEgOiAwKSAqIHBvd2VyO1xuICAgICAgICAgICAgcG93ZXIgPDw9IDE7XG4gICAgICAgICAgfVxuICAgICAgICBjID0gZihiaXRzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBkaWN0aW9uYXJ5WzNdID0gYztcbiAgICB3ID0gYztcbiAgICByZXN1bHQucHVzaChjKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKGRhdGEuaW5kZXggPiBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG5cbiAgICAgIGJpdHMgPSAwO1xuICAgICAgbWF4cG93ZXIgPSBNYXRoLnBvdygyLG51bUJpdHMpO1xuICAgICAgcG93ZXI9MTtcbiAgICAgIHdoaWxlIChwb3dlciE9bWF4cG93ZXIpIHtcbiAgICAgICAgcmVzYiA9IGRhdGEudmFsICYgZGF0YS5wb3NpdGlvbjtcbiAgICAgICAgZGF0YS5wb3NpdGlvbiA+Pj0gMTtcbiAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gPT0gMCkge1xuICAgICAgICAgIGRhdGEucG9zaXRpb24gPSByZXNldFZhbHVlO1xuICAgICAgICAgIGRhdGEudmFsID0gZ2V0TmV4dFZhbHVlKGRhdGEuaW5kZXgrKyk7XG4gICAgICAgIH1cbiAgICAgICAgYml0cyB8PSAocmVzYj4wID8gMSA6IDApICogcG93ZXI7XG4gICAgICAgIHBvd2VyIDw8PSAxO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGMgPSBiaXRzKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICBtYXhwb3dlciA9IE1hdGgucG93KDIsOCk7XG4gICAgICAgICAgcG93ZXI9MTtcbiAgICAgICAgICB3aGlsZSAocG93ZXIhPW1heHBvd2VyKSB7XG4gICAgICAgICAgICByZXNiID0gZGF0YS52YWwgJiBkYXRhLnBvc2l0aW9uO1xuICAgICAgICAgICAgZGF0YS5wb3NpdGlvbiA+Pj0gMTtcbiAgICAgICAgICAgIGlmIChkYXRhLnBvc2l0aW9uID09IDApIHtcbiAgICAgICAgICAgICAgZGF0YS5wb3NpdGlvbiA9IHJlc2V0VmFsdWU7XG4gICAgICAgICAgICAgIGRhdGEudmFsID0gZ2V0TmV4dFZhbHVlKGRhdGEuaW5kZXgrKyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaXRzIHw9IChyZXNiPjAgPyAxIDogMCkgKiBwb3dlcjtcbiAgICAgICAgICAgIHBvd2VyIDw8PSAxO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpY3Rpb25hcnlbZGljdFNpemUrK10gPSBmKGJpdHMpO1xuICAgICAgICAgIGMgPSBkaWN0U2l6ZS0xO1xuICAgICAgICAgIGVubGFyZ2VJbi0tO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgbWF4cG93ZXIgPSBNYXRoLnBvdygyLDE2KTtcbiAgICAgICAgICBwb3dlcj0xO1xuICAgICAgICAgIHdoaWxlIChwb3dlciE9bWF4cG93ZXIpIHtcbiAgICAgICAgICAgIHJlc2IgPSBkYXRhLnZhbCAmIGRhdGEucG9zaXRpb247XG4gICAgICAgICAgICBkYXRhLnBvc2l0aW9uID4+PSAxO1xuICAgICAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gPT0gMCkge1xuICAgICAgICAgICAgICBkYXRhLnBvc2l0aW9uID0gcmVzZXRWYWx1ZTtcbiAgICAgICAgICAgICAgZGF0YS52YWwgPSBnZXROZXh0VmFsdWUoZGF0YS5pbmRleCsrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJpdHMgfD0gKHJlc2I+MCA/IDEgOiAwKSAqIHBvd2VyO1xuICAgICAgICAgICAgcG93ZXIgPDw9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRpY3Rpb25hcnlbZGljdFNpemUrK10gPSBmKGJpdHMpO1xuICAgICAgICAgIGMgPSBkaWN0U2l6ZS0xO1xuICAgICAgICAgIGVubGFyZ2VJbi0tO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVubGFyZ2VJbiA9PSAwKSB7XG4gICAgICAgIGVubGFyZ2VJbiA9IE1hdGgucG93KDIsIG51bUJpdHMpO1xuICAgICAgICBudW1CaXRzKys7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaWN0aW9uYXJ5W2NdKSB7XG4gICAgICAgIGVudHJ5ID0gZGljdGlvbmFyeVtjXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjID09PSBkaWN0U2l6ZSkge1xuICAgICAgICAgIGVudHJ5ID0gdyArIHcuY2hhckF0KDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaChlbnRyeSk7XG5cbiAgICAgIC8vIEFkZCB3K2VudHJ5WzBdIHRvIHRoZSBkaWN0aW9uYXJ5LlxuICAgICAgZGljdGlvbmFyeVtkaWN0U2l6ZSsrXSA9IHcgKyBlbnRyeS5jaGFyQXQoMCk7XG4gICAgICBlbmxhcmdlSW4tLTtcblxuICAgICAgdyA9IGVudHJ5O1xuXG4gICAgICBpZiAoZW5sYXJnZUluID09IDApIHtcbiAgICAgICAgZW5sYXJnZUluID0gTWF0aC5wb3coMiwgbnVtQml0cyk7XG4gICAgICAgIG51bUJpdHMrKztcbiAgICAgIH1cblxuICAgIH1cbiAgfVxufTtcbiAgcmV0dXJuIExaU3RyaW5nO1xufSkoKTtcblxuaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24gKCkgeyByZXR1cm4gTFpTdHJpbmc7IH0pO1xufSBlbHNlIGlmKCB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUgIT0gbnVsbCApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBMWlN0cmluZ1xufVxuIiwgImltcG9ydCB7IEFwcCwgRWRpdG9yLCBNYXJrZG93blZpZXcsIE1vZGFsLCBOb3RpY2UsIFBsdWdpbiwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZywgTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IFJlbmRlcmVyLCB7IENpcmN1aXRSZW5kZXJDaGlsZCB9IGZyb20gJy4vY2lyY3VpdFJlbmRlcmVyJztcclxuXHJcbi8vIFJlbWVtYmVyIHRvIHJlbmFtZSB0aGVzZSBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDaXJjdWl0SnNTZXR0aW5ncyB7XHJcblx0ZWRpdGFibGU6IGJvb2xlYW47XHJcblx0ZWRpdExpbms6IGJvb2xlYW47XHJcblx0Y2lyY3VpdEpzVXJsOiBzdHJpbmc7XHJcblx0Y2lyY3VpdFRhZzogc3RyaW5nO1xyXG59XHJcblxyXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBDaXJjdWl0SnNTZXR0aW5ncyA9IHtcclxuXHRlZGl0YWJsZTogdHJ1ZSxcclxuXHRlZGl0TGluazogdHJ1ZSxcclxuXHRjaXJjdWl0SnNVcmw6IFwiaHR0cDovL2ZhbHN0YWQuY29tL2NpcmN1aXQvY2lyY3VpdGpzLmh0bWxcIixcclxuXHRjaXJjdWl0VGFnOiBcImNpcmN1aXRqc1wiXHJcbn1cclxuXHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2lyY3VpdEpzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRzZXR0aW5nczogQ2lyY3VpdEpzU2V0dGluZ3M7XHJcblx0cmVuZGVyZXI6IFJlbmRlcmVyO1xyXG5cclxuXHRwb3N0cHJvY2Vzc29yID0gYXN5bmMgKGNvbnRlbnQ6IHN0cmluZywgZWw6IEhUTUxFbGVtZW50LCBjdHg6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQpID0+IHtcclxuXHRcdGN0eC5hZGRDaGlsZChuZXcgQ2lyY3VpdFJlbmRlckNoaWxkKGVsLCB0aGlzLCBjb250ZW50LCB0aGlzLnNldHRpbmdzKSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBvbmxvYWQoKSB7XHJcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG5cclxuXHRcdHRoaXMucmVnaXN0ZXJNYXJrZG93bkNvZGVCbG9ja1Byb2Nlc3Nvcih0aGlzLnNldHRpbmdzLmNpcmN1aXRUYWcsIHRoaXMucG9zdHByb2Nlc3Nvcik7XHJcblx0fVxyXG5cclxuXHRvbnVubG9hZCgpIHtcclxuXHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG59XHJcblxyXG5cclxuY2xhc3MgU2FtcGxlU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogQ2lyY3VpdEpzUGx1Z2luO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBDaXJjdWl0SnNQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0ZGlzcGxheSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHtjb250YWluZXJFbH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywge3RleHQ6ICdTZXR0aW5ncyBmb3IgT2JzaWRpYW4gQ2lyY3VpdEpTJ30pO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnRWRpdGFibGUnKVxyXG5cdFx0XHQuc2V0RGVzYygnSWYgdGhlIHNpbXVsYXRpb24gY2FuIGJlIGVkaXRlZCcpXHJcblx0XHRcdC5hZGRUb2dnbGUoYm9vbGVhbiA9PiBib29sZWFuXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVkaXRhYmxlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKCdFZGl0YWJsZTogJyArIHZhbHVlKTtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmVkaXRhYmxlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSk7XHJcblx0fVxyXG59XHJcbiIsICJpbXBvcnQgeyBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LCBNYXJrZG93blJlbmRlckNoaWxkLCBwYXJzZVlhbWwgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBMWlN0cmluZ1N0YXRpYyB9IGZyb20gJ2x6LXN0cmluZyc7XG5pbXBvcnQgKiBhcyBMWlN0cmluZyBmcm9tICdsei1zdHJpbmcnO1xuaW1wb3J0IHsgQ2lyY3VpdEpzU2V0dGluZ3MgfSBmcm9tICdtYWluJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVuZGVyZXIge1xuXG59XG5cbmV4cG9ydCBjbGFzcyBDaXJjdWl0UmVuZGVyQ2hpbGQgZXh0ZW5kcyBNYXJrZG93blJlbmRlckNoaWxkIHtcbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgY29tcHJlc3NlZDogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjtcbiAgICBzZXR0aW5nczogQ2lyY3VpdEpzU2V0dGluZ3M7XG5cbiAgICBjb25zdHJ1Y3RvcihlbDogSFRNTEVsZW1lbnQsIHJlbmRlcmVyOiBSZW5kZXJlciwgY29udGVudDogc3RyaW5nLCBzZXR0aW5nczogQ2lyY3VpdEpzU2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoZWwpO1xuXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgdGhpcy5jb2RlID0gY29udGVudDtcblxuICAgICAgICB0aGlzLmNvbXByZXNzZWQgPSBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudCh0aGlzLmNvZGUpO1xuICAgICAgICBcbiAgICAgICAgaWYodGhpcy5zZXR0aW5ncy5lZGl0YWJsZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy51cmwgPSBgJHt0aGlzLnNldHRpbmdzLmNpcmN1aXRKc1VybH0/Y3R6PSR7dGhpcy5jb21wcmVzc2VkfSZydW5uaW5nPXRydWVgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy51cmwgPSBgJHt0aGlzLnNldHRpbmdzLmNpcmN1aXRKc1VybH0/Y3R6PSR7dGhpcy5jb21wcmVzc2VkfSZydW5uaW5nPWZhbHNlYDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9ubG9hZCgpIHtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5lZGl0TGluaykge1xuICAgICAgICAgICAgY29uc3QgZWRpdExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgICAgIGVkaXRMaW5rLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgdGhpcy51cmwpO1xuICAgICAgICAgICAgY29uc3QgZWRpdExpbmtDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJbRURJVF1cIik7XG4gICAgICAgICAgICBlZGl0TGluay5hcHBlbmRDaGlsZChlZGl0TGlua0NvbnRlbnQpO1xuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGVkaXRMaW5rKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlmcmFtZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgICAgICBpZnJhbWVOb2RlLnNldEF0dHJpYnV0ZShcInNyY1wiLCB0aGlzLnVybCk7XG4gICAgICAgIGlmcmFtZU5vZGUuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCIxMDAlXCIpO1xuICAgICAgICBpZnJhbWVOb2RlLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIjYwMHB4XCIpO1xuXG4gICAgICAgIFxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoaWZyYW1lTm9kZSk7XG5cbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5hcHBlbmRDaGlsZChkaXYpO1xuICAgIH1cblxuICAgIG9udW5sb2FkKCkge1xuICAgIH1cbn0iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFTQSxRQUFJLFlBQVksV0FBVztBQUczQixVQUFJLElBQUksT0FBTztBQUNmLFVBQUksZUFBZTtBQUNuQixVQUFJLGdCQUFnQjtBQUNwQixVQUFJLGlC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 diff --git a/.obsidian/plugins/obsidian-circuitjs/manifest.json b/.obsidian/plugins/obsidian-circuitjs/manifest.json deleted file mode 100644 index 9a551ea..0000000 --- a/.obsidian/plugins/obsidian-circuitjs/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "obsidian-circuitjs", - "name": "Obsidian CircuitJS", - "version": "1.0.0", - "minAppVersion": "0.12.0", - "description": "Integrating CircuitJS and Obsidian", - "author": "Steven Gann", - "authorUrl": "https://github.com/StevenGann", - "isDesktopOnly": true -} diff --git a/.obsidian/plugins/obsidian-circuitjs/styles.css b/.obsidian/plugins/obsidian-circuitjs/styles.css deleted file mode 100644 index 8537307..0000000 --- a/.obsidian/plugins/obsidian-circuitjs/styles.css +++ /dev/null @@ -1 +0,0 @@ -Not Found \ No newline at end of file diff --git a/.obsidian/workspace b/.obsidian/workspace deleted file mode 100644 index 4a96367..0000000 --- a/.obsidian/workspace +++ /dev/null @@ -1,101 +0,0 @@ -{ - "main": { - "id": "20f00a703135d3b3", - "type": "split", - "children": [ - { - "id": "f044b8f2aaa9c540", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "Areas/electricity/parts/capacitors.md.md", - "mode": "source", - "source": false - } - } - } - ], - "direction": "vertical" - }, - "left": { - "id": "e6019eea54339191", - "type": "split", - "children": [ - { - "id": "bcaa06271147c8b2", - "type": "tabs", - "children": [ - { - "id": "b2484810d49bee98", - "type": "leaf", - "state": { - "type": "file-explorer", - "state": {} - } - }, - { - "id": "1d7a2eec817a817f", - "type": "leaf", - "state": { - "type": "search", - "state": { - "query": "", - "matchingCase": false, - "explainSearch": false, - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical" - } - } - } - ] - } - ], - "direction": "horizontal", - "width": 300 - }, - "right": { - "id": "5cbdf016cba539bb", - "type": "split", - "children": [ - { - "id": "1e5dd0e7a1e6a44f", - "type": "tabs", - "children": [ - { - "id": "f03fddf060b0214b", - "type": "leaf", - "state": { - "type": "backlink", - "state": { - "file": "Areas/electricity/parts/capacitors.md.md", - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical", - "showSearch": false, - "searchQuery": "", - "backlinkCollapsed": false, - "unlinkedCollapsed": true - } - } - } - ] - } - ], - "direction": "horizontal", - "width": 300, - "collapsed": true - }, - "active": "f044b8f2aaa9c540", - "lastOpenFiles": [ - "Areas/electricity/parts/capacitors.md.md", - "Areas/electricity/formulas/kirchhoffs-law.md.md", - "Areas/electricity/ac.md.md", - "Areas/electricity/glossary.md", - "a.md", - "Areas/electricity/formulas.md", - "Areas/electricity/parts/resistors.md.md", - "Areas/electricity/basics.md" - ] -} \ No newline at end of file