From 83145894f4d6a46ea1cf5498f3b67ca3c43cd3e8 Mon Sep 17 00:00:00 2001 From: Heekang Park Date: Fri, 17 Feb 2023 02:20:10 +0900 Subject: [PATCH] v0.3.1 --- README.md | 6 + README_ko.md | 8 +- dist/main.js | 426 ++++++++++++------------- dist/manifest.json | 2 +- dist/styles.css | 17 +- dist/versions.json | 3 +- manifest.json | 2 +- package-lock.json | 4 +- package.json | 2 +- src/HKCodeBlockProcessor.ts | 601 +++++++++++++++++++----------------- src/styles.scss | 11 +- versions.json | 3 +- 12 files changed, 581 insertions(+), 504 deletions(-) diff --git a/README.md b/README.md index 099532e..84fd68a 100644 --- a/README.md +++ b/README.md @@ -386,3 +386,9 @@ Versions are controlled by the rule below. - Fix that code blocks inside other elements(ex. li) are not rendered properly - Add features - Now you can use `-` symbols in the highlight statement so that you can easily highlight multiple, continuous lines. + +### 0.3.1 + +- Bug fix + - Fix that the titles of continuous code blocks inside other elements(ex. li) are not rendered properly + - Fix that an additional empty line is inserted at the end of the code block when the code block is inside other elements(ex. li) \ No newline at end of file diff --git a/README_ko.md b/README_ko.md index bfb7646..df23979 100644 --- a/README_ko.md +++ b/README_ko.md @@ -385,4 +385,10 @@ MIT License - 버그 수정 - 다른 요소(ex. li) 아래에 있는 code block이 이상하게 렌더링되던 문제 해결 - 기능 추가 - - 이젠 줄 강조 시 `-` 기호를 사용해 손쉽게 여러 줄을 연속적으로 강조할 수 있음 \ No newline at end of file + - 이젠 줄 강조 시 `-` 기호를 사용해 손쉽게 여러 줄을 연속적으로 강조할 수 있음 + +### 0.3.1 + +- 버그 수정 + - 다른 요소(ex. li) 아래에 있는 연속된 code block의 제목이 렌더링되지 않던 문제 해결 + - 다른 요소 아래에 있는 code block에서 빈 마지막 줄이 삽입되던 문제 해결 \ No newline at end of file diff --git a/dist/main.js b/dist/main.js index 740f09b..44be926 100644 --- a/dist/main.js +++ b/dist/main.js @@ -258,70 +258,81 @@ var REGEX = { PROMPT_COMPLICATE: /\sprompt:(true|false|'(.*?)'|"(.*?)")\s/, NUMBER: /^-{0,1}\d+$/ }; -function getMeta(view, elem_code, section_code, settings) { - const lineStart = (() => { - for (let i = section_code.lineStart; i <= section_code.lineEnd; i++) { - const line = view.editor.getLine(i); - if (line.trim().startsWith("```")) - return i; +function getMeta(view, elem_code, elem_code_idx, section_code, settings) { + const return_value = { + isError: false, + lineStartInSection: -1, + lineEndInSection: -1, + showTitle: void 0, + title: "", + isCollapsible: void 0, + showLinenos: void 0, + linenosStart: settings.defaultLinenosStart, + linenosNum: 0, + showHighlight: void 0, + highlightLines: [], + showLanguage: void 0, + language: settings.defaultLanguage, + showCopyBtn: void 0, + isResult: false, + resultPrompt: settings.defaultResultPrompt, + showPrompt: void 0, + prompt: settings.defaultPrompt + }; + let marker_count = 0; + for (let i = section_code.lineStart; i <= section_code.lineEnd; i++) { + const line = view.editor.getLine(i); + if (line.trim().startsWith("```")) + marker_count++; + if (return_value.lineStartInSection === -1 && marker_count === elem_code_idx * 2 + 1) { + return_value.lineStartInSection = i; } - return -1; - })(); - const lineEnd = (() => { - for (let i = section_code.lineEnd; i >= section_code.lineStart; i--) { - const line = view.editor.getLine(i); - if (line.trim().startsWith("```")) - return i; + if (return_value.lineEndInSection === -1 && marker_count === elem_code_idx * 2 + 2) { + return_value.lineEndInSection = i; + break; } - return -1; - })(); - if (lineStart < 0 || lineEnd < 0 || lineStart >= lineEnd) { - throw new Error("Cannot find the first line or the last line of the code block"); } - const firstline = view.editor.getLine(lineStart) + " "; - let showTitle = void 0; - let title = ""; + if (return_value.lineStartInSection < 0 || return_value.lineEndInSection < 0 || return_value.lineStartInSection >= return_value.lineEndInSection) { + return_value.isError = true; + return return_value; + } + const firstline = view.editor.getLine(return_value.lineStartInSection).trim() + " "; const regexResult_title = REGEX.TITLE.exec(firstline); if (regexResult_title) { - showTitle = true; - title = regexResult_title[1] || regexResult_title[2]; + return_value.showTitle = true; + return_value.title = regexResult_title[1] || regexResult_title[2]; } - let isCollapsible = void 0; const regexResult_collapsibleSimple = REGEX.COLLAPSIBLE_SIMPLE.exec(firstline); const regexResult_collapsibleComplicate = REGEX.COLLAPSIBLE_COMPLICATE.exec(firstline); if (regexResult_collapsibleSimple) { - isCollapsible = true; + return_value.isCollapsible = true; } else if (regexResult_collapsibleComplicate) { if (regexResult_collapsibleComplicate[1] === "true") { - isCollapsible = true; + return_value.isCollapsible = true; } else if (regexResult_collapsibleComplicate[1] === "false") { - isCollapsible = false; + return_value.isCollapsible = false; } } - let showLinenos = void 0; - let linenosStart = settings.defaultLinenosStart; - const linenosNum = lineEnd - lineStart - 1; + return_value.linenosNum = return_value.lineEndInSection - return_value.lineStartInSection - 1; const regexResult_linenosSimple = REGEX.LINENOS_SIMPLE.exec(firstline); const regexResult_linenosComplicate = REGEX.LINENOS_COMPLICATE.exec(firstline); if (regexResult_linenosSimple) { - showLinenos = true; + return_value.showLinenos = true; } else if (regexResult_linenosComplicate) { if (regexResult_linenosComplicate[1] === "true") { - showLinenos = true; + return_value.showLinenos = true; } else if (regexResult_linenosComplicate[1] === "false") { - showLinenos = false; + return_value.showLinenos = false; } else { - showLinenos = true; - linenosStart = parseInt(regexResult_linenosComplicate[2]) || 1; + return_value.showLinenos = true; + return_value.linenosStart = parseInt(regexResult_linenosComplicate[2]) || 1; } } - let showHighlight = void 0; - let highlightLines = []; const regexResult_highlight = REGEX.HIGHLIGHT.exec(firstline); if (regexResult_highlight) { - showHighlight = true; + return_value.showHighlight = true; const highlightLines_str = regexResult_highlight[1] || regexResult_highlight[2]; - highlightLines = highlightLines_str.split(",").map((item) => { + let highlightLines = highlightLines_str.split(",").map((item) => { item = item.trim(); if (REGEX.NUMBER.test(item)) return parseInt(item); @@ -336,119 +347,98 @@ function getMeta(view, elem_code, section_code, settings) { return NaN; }).flat().filter((item) => !isNaN(item)); if (highlightLines.some((line) => isNaN(line))) { - showHighlight = void 0; - highlightLines = []; + return_value.showHighlight = void 0; + return_value.highlightLines = []; } else { - highlightLines = highlightLines.filter((line) => line >= linenosStart && line < linenosStart + linenosNum); + return_value.highlightLines = highlightLines.filter( + (line) => line >= return_value.linenosStart && line < return_value.linenosStart + return_value.linenosNum + ); } } - let showLanguage = void 0; - let language = (() => { - let language2 = settings.defaultLanguage; - elem_code.classList.forEach((className) => { - const regexResult_languageFromClass = REGEX.LANGUAGE_FROM_CLASS.exec(className.trim()); - if (regexResult_languageFromClass) - language2 = regexResult_languageFromClass[1]; - }); - return language2; - })(); + elem_code.classList.forEach((className) => { + const regexResult_languageFromClass = REGEX.LANGUAGE_FROM_CLASS.exec(className.trim()); + if (regexResult_languageFromClass) { + return_value.language = regexResult_languageFromClass[1]; + } + }); const regexResult_languageSimple = REGEX.LANGUAGE_SIMPLE.exec(firstline); const regexResult_languageComplicate = REGEX.LANGUAGE_COMPLICATE.exec(firstline); if (regexResult_languageSimple) { - showLanguage = true; + return_value.showLanguage = true; } else if (regexResult_languageComplicate) { if (regexResult_languageComplicate[1] === "true") { - showLanguage = true; + return_value.showLanguage = true; } else if (regexResult_languageComplicate[1] === "false") { - showLanguage = false; + return_value.showLanguage = false; } else { - showLanguage = true; - language = regexResult_languageComplicate[2] || regexResult_languageComplicate[3]; + return_value.showLanguage = true; + return_value.language = regexResult_languageComplicate[2] || regexResult_languageComplicate[3]; } } - let showCopyBtn = void 0; const regexResult_copyBtnSimple = REGEX.COPYBTN_SIMPLE.exec(firstline); const regexResult_copyBtnComplicate = REGEX.COPYBTN_COMPLICATE.exec(firstline); if (regexResult_copyBtnSimple) { - showCopyBtn = true; + return_value.showCopyBtn = true; } else if (regexResult_copyBtnComplicate) { if (regexResult_copyBtnComplicate[1] === "true") { - showCopyBtn = true; + return_value.showCopyBtn = true; } else if (regexResult_copyBtnComplicate[1] === "false") { - showCopyBtn = false; + return_value.showCopyBtn = false; } } - let showPrompt = void 0; - let prompt = settings.defaultPrompt; const regexResult_promptSimple = REGEX.PROMPT_SIMPLE.exec(firstline); const regexResult_promptComplicate = REGEX.PROMPT_COMPLICATE.exec(firstline); if (regexResult_promptSimple) { - showPrompt = true; + return_value.showPrompt = true; } else if (regexResult_promptComplicate) { if (regexResult_promptComplicate[1] === "true") { - showPrompt = true; + return_value.showPrompt = true; } else if (regexResult_promptComplicate[1] === "false") { - showPrompt = false; + return_value.showPrompt = false; } else { - showPrompt = true; - prompt = regexResult_promptComplicate[2] || regexResult_promptComplicate[3]; + return_value.showPrompt = true; + return_value.prompt = regexResult_promptComplicate[2] || regexResult_promptComplicate[3]; } } - let isResult = false; - let resultPrompt = settings.defaultResultPrompt; const regexResult_result = REGEX.RESULT.exec(firstline); const regexResultPrompt_result = REGEX.PROMPT_COMPLICATE.exec(firstline); if (regexResult_result) { - isResult = true; - showTitle = false; - showLanguage = false; - showCopyBtn = false; - showPrompt = false; + return_value.isResult = true; + return_value.showTitle = false; + return_value.showLanguage = false; + return_value.showCopyBtn = false; + return_value.showPrompt = false; if (regexResultPrompt_result) { - resultPrompt = regexResultPrompt_result[2] || regexResultPrompt_result[3]; + return_value.resultPrompt = regexResultPrompt_result[2] || regexResultPrompt_result[3]; } } - return { - showTitle, - title, - isCollapsible, - showLinenos, - linenosStart, - linenosNum, - showHighlight, - highlightLines, - showLanguage, - language, - showCopyBtn, - isResult, - resultPrompt, - showPrompt, - prompt - }; + return return_value; } async function HKCodeBlockProcessor(el, context, plugin) { const settings = plugin.settings; const view = app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); if (!view) return; - const elem_code = el.querySelector("pre:not(.frontmatter) > code"); - if (!elem_code) + const elem_codes = el.querySelectorAll("pre:not(.frontmatter) > code"); + if (elem_codes.length === 0) return; - const elem_pre = elem_code.parentElement; - if (!elem_pre) - return; - const elem_div = elem_pre.parentElement; - if (!elem_div) - return; - const elem_copyBtn = elem_div.querySelector(".copy-code-button"); - if (!elem_copyBtn) - return; - const section_code = context.getSectionInfo(elem_code); - if (!section_code) - return; - let showTitle, title, isCollapsible, showLinenos, linenosStart, linenosNum, showHighlight, highlightLines, showLanguage, language, showCopyBtn, isResult, resultPrompt, showPrompt, prompt; - try { - ({ + elem_codes.forEach((elem_code, elem_code_idx) => { + const elem_pre = elem_code.parentElement; + if (!elem_pre) + return; + const elem_pre_parent = elem_pre.parentElement; + if (!elem_pre_parent) + return; + const elem_copyBtn = elem_pre.querySelector(".copy-code-button"); + if (!elem_copyBtn) + return; + const section_code = context.getSectionInfo(elem_code); + if (!section_code) + return; + const { + isError, + lineStartInSection, + lineEndInSection, showTitle, title, isCollapsible, @@ -464,9 +454,14 @@ async function HKCodeBlockProcessor(el, context, plugin) { resultPrompt, showPrompt, prompt - } = getMeta(view, elem_code, section_code, settings)); + } = getMeta(view, elem_code, elem_code_idx, section_code, settings); + if (isError) + return; if (settings.debugMode) { console.log({ + isError, + lineStartInSection, + lineEndInSection, showTitle, title, isCollapsible, @@ -484,110 +479,127 @@ async function HKCodeBlockProcessor(el, context, plugin) { prompt }); } - } catch (e) { - return; - } - elem_div.classList.add("hk-codeblock"); - elem_code.classList.add("hk-codeblock-code"); - elem_copyBtn.remove(); - let elem_title = void 0; - if (settings.useTitleGlobal === "default off, but on when specified" && showTitle === true) { - elem_div.classList.add("hk-codeblock-show-title"); - elem_title = document.createElement("div"); - elem_title.classList.add("hk-codeblock-title"); - elem_title.innerHTML = title; - elem_div.insertBefore(elem_title, elem_pre); - } - if (settings.useCollapsibleGlobal === "always on" || settings.useCollapsibleGlobal === "default on, but off when specified" && (isCollapsible === void 0 || isCollapsible === true) || settings.useCollapsibleGlobal === "default off, but on when specified" && isCollapsible === true) { - elem_div.classList.add("hk-codeblock-collapsible"); - if (settings.defaultCollapse === "collapse") { - elem_div.classList.add("hk-codeblock-collapsed"); + const elem_div = document.createElement("div"); + elem_pre_parent.replaceChild(elem_div, elem_pre); + elem_div.appendChild(elem_pre); + elem_div.classList.add("hk-codeblock"); + elem_code.classList.add("hk-codeblock-code"); + elem_copyBtn.remove(); + let elem_title = void 0; + if (settings.useTitleGlobal === "default off, but on when specified" && showTitle === true) { + elem_div.classList.add("hk-codeblock-show-title"); + elem_title = document.createElement("div"); + elem_title.classList.add("hk-codeblock-title"); + elem_title.innerHTML = title; + elem_div.insertBefore(elem_title, elem_pre); } - if (elem_title) { - elem_title.addEventListener("click", (ev) => { - ev.stopPropagation(); - ev.preventDefault(); - if (elem_div.classList.contains("hk-codeblock-collapsed")) { - elem_div.classList.remove("hk-codeblock-collapsed"); - } else { + if (settings.useCollapsibleGlobal === "always on" || settings.useCollapsibleGlobal === "default on, but off when specified" && (isCollapsible === void 0 || isCollapsible === true) || settings.useCollapsibleGlobal === "default off, but on when specified" && isCollapsible === true) { + if (elem_title) { + elem_div.classList.add("hk-codeblock-collapsible"); + if (settings.defaultCollapse === "collapse") { elem_div.classList.add("hk-codeblock-collapsed"); } - }); - const elem_collapseBtns = document.createElement("div"); - elem_collapseBtns.classList.add("hk-codeblock-collapse-btns"); - const elem_collapseBtn = document.createElement("div"); - elem_collapseBtn.classList.add("hk-codeblock-collapse-btn", "hk-codeblock-collapsed-btn"); - elem_collapseBtn.innerHTML = ` + elem_title.addEventListener("click", (ev) => { + ev.stopPropagation(); + ev.preventDefault(); + elem_div.classList.toggle("hk-codeblock-collapsed"); + }); + const elem_collapseBtns = document.createElement("div"); + elem_collapseBtns.classList.add("hk-codeblock-collapse-btns"); + const elem_collapseBtn = document.createElement("div"); + elem_collapseBtn.classList.add("hk-codeblock-collapse-btn", "hk-codeblock-collapsed-btn"); + elem_collapseBtn.innerHTML = ` `; - elem_collapseBtns.appendChild(elem_collapseBtn); - const elem_expandBtn = document.createElement("div"); - elem_expandBtn.classList.add("hk-codeblock-collapse-btn", "hk-codeblock-expanded-btn"); - elem_expandBtn.innerHTML = ` + elem_collapseBtns.appendChild(elem_collapseBtn); + const elem_expandBtn = document.createElement("div"); + elem_expandBtn.classList.add("hk-codeblock-collapse-btn", "hk-codeblock-expanded-btn"); + elem_expandBtn.innerHTML = ` `; - elem_collapseBtns.appendChild(elem_expandBtn); - elem_title.prepend(elem_collapseBtns); - } - } - if (settings.useLinenosGlobal === "always on" || settings.useLinenosGlobal === "default on, but off when specified" && (showLinenos === void 0 || showLinenos === true) || settings.useLinenosGlobal === "default off, but on when specified" && showLinenos === true) { - elem_div.classList.add("hk-codeblock-show-linenos"); - const elem_linenos = document.createElement("div"); - elem_linenos.classList.add("hk-codeblock-linenos"); - elem_linenos.innerText = Array(linenosNum).fill(0).map((_, idx) => idx + linenosStart).join("\n"); - elem_pre.insertBefore(elem_linenos, elem_code); - if (settings.showLinenosSplitter) { - elem_linenos.classList.add("show-splitter"); - } - } - if (settings.useHighlightGlobal === "default off, but on when specified" && showHighlight === true) { - elem_div.classList.add("hk-codeblock-show-highlight"); - elem_div.style.setProperty("--hk-codeblock-highlight-background-color", settings.highlightColor); - const elem_highlight = document.createElement("div"); - elem_highlight.classList.add("hk-codeblock-highlight"); - elem_highlight.innerHTML = Array(linenosNum).fill(0).map((_, idx) => { - const classNames = []; - if (highlightLines.includes(idx + linenosStart)) - classNames.push("highlight"); - return ` `; - }).join("\n"); - elem_pre.insertBefore(elem_highlight, elem_code); - } - if (settings.useLanguageGlobal === "always on" || settings.useLanguageGlobal === "default on, but off when specified" && (showLanguage === void 0 || showLanguage === true) || settings.useLanguageGlobal === "default off, but on when specified" && showLanguage === true) { - elem_div.classList.add("hk-codeblock-show-language"); - const elem_language = document.createElement("div"); - elem_language.classList.add("hk-codeblock-language"); - elem_language.innerText = language; - elem_pre.prepend(elem_language); - } - if (settings.useCopyBtnGlobal === "always on" || settings.useCopyBtnGlobal === "default on, but off when specified" && (showCopyBtn === void 0 || showCopyBtn === true) || settings.useCopyBtnGlobal === "default off, but on when specified" && showCopyBtn === true) { - elem_div.classList.add("hk-codeblock-show-copybtn"); - elem_pre.appendChild(elem_copyBtn); - } - if (settings.usePromptGlobal === "always on" && settings.promptingLanguages.includes(language) || settings.usePromptGlobal === "default on, but off when specified" && settings.promptingLanguages.includes(language) && (showPrompt === void 0 || showPrompt === true) || settings.usePromptGlobal === "default off, but on when specified" && showPrompt === true) { - elem_div.classList.add("hk-codeblock-show-prompt"); - const elem_prompt = document.createElement("div"); - elem_prompt.classList.add("hk-codeblock-prompt"); - const lines = elem_code.innerText.split("\n"); - elem_prompt.innerText = Array(linenosNum).fill(0).map((_, idx) => { - if (idx < 0 || idx >= lines.length) - return null; - const line = lines[idx].trim(); - const prevLine = idx > 0 ? lines[idx - 1].trim() : ""; - if (line === "" || // check if the line is empty - line.startsWith("#") || // check if the line is a comment - prevLine.endsWith("\\")) { - return " ".repeat(prompt.length); + elem_collapseBtns.appendChild(elem_expandBtn); + elem_title.prepend(elem_collapseBtns); } - return prompt; - }).filter((line) => line !== null).join("\n"); - elem_pre.insertBefore(elem_prompt, elem_code); - } - if (settings.useResultGlobal === "enable" && isResult === true) { - elem_div.classList.add("hk-codeblock-result"); - elem_code.classList.add("hk-codeblock-result-code"); - elem_div.setAttribute("data-result-prompt", resultPrompt); - } + } + if (settings.useLinenosGlobal === "always on" || settings.useLinenosGlobal === "default on, but off when specified" && (showLinenos === void 0 || showLinenos === true) || settings.useLinenosGlobal === "default off, but on when specified" && showLinenos === true) { + elem_div.classList.add("hk-codeblock-show-linenos"); + const elem_linenos = document.createElement("div"); + elem_linenos.classList.add("hk-codeblock-linenos"); + elem_linenos.innerText = Array(linenosNum).fill(0).map((_, idx) => idx + linenosStart).join("\n"); + elem_pre.insertBefore(elem_linenos, elem_code); + if (settings.showLinenosSplitter) { + elem_linenos.classList.add("show-splitter"); + } + } + if (settings.useHighlightGlobal === "default off, but on when specified" && showHighlight === true) { + elem_div.classList.add("hk-codeblock-show-highlight"); + elem_div.style.setProperty("--hk-codeblock-highlight-background-color", settings.highlightColor); + const elem_highlight = document.createElement("div"); + elem_highlight.classList.add("hk-codeblock-highlight"); + elem_highlight.innerHTML = Array(linenosNum).fill(0).map((_, idx) => { + const classNames = []; + if (highlightLines.includes(idx + linenosStart)) + classNames.push("highlight"); + return ` `; + }).join("\n"); + elem_pre.insertBefore(elem_highlight, elem_code); + } + if (settings.useLanguageGlobal === "always on" || settings.useLanguageGlobal === "default on, but off when specified" && (showLanguage === void 0 || showLanguage === true) || settings.useLanguageGlobal === "default off, but on when specified" && showLanguage === true) { + elem_div.classList.add("hk-codeblock-show-language"); + const elem_language = document.createElement("div"); + elem_language.classList.add("hk-codeblock-language"); + elem_language.innerText = language; + elem_pre.prepend(elem_language); + } + if (settings.useCopyBtnGlobal === "always on" || settings.useCopyBtnGlobal === "default on, but off when specified" && (showCopyBtn === void 0 || showCopyBtn === true) || settings.useCopyBtnGlobal === "default off, but on when specified" && showCopyBtn === true) { + elem_div.classList.add("hk-codeblock-show-copybtn"); + elem_pre.appendChild(elem_copyBtn); + } + if (settings.usePromptGlobal === "always on" && settings.promptingLanguages.includes(language) || settings.usePromptGlobal === "default on, but off when specified" && settings.promptingLanguages.includes(language) && (showPrompt === void 0 || showPrompt === true) || settings.usePromptGlobal === "default off, but on when specified" && showPrompt === true) { + elem_div.classList.add("hk-codeblock-show-prompt"); + const elem_prompt = document.createElement("div"); + elem_prompt.classList.add("hk-codeblock-prompt"); + const lines = elem_code.innerText.split("\n"); + elem_prompt.innerText = Array(linenosNum).fill(0).map((_, idx) => { + if (idx < 0 || idx >= lines.length) + return null; + const line = lines[idx].trim(); + const prevLine = idx > 0 ? lines[idx - 1].trim() : ""; + if (line === "" || // check if the line is empty + line.startsWith("#") || // check if the line is a comment + prevLine.endsWith("\\")) { + return " ".repeat(prompt.length); + } + return prompt; + }).filter((line) => line !== null).join("\n"); + elem_pre.insertBefore(elem_prompt, elem_code); + } + if (settings.useResultGlobal === "enable" && isResult === true) { + const isCodeBlockAdjacent = (() => { + let line_idx = lineStartInSection - 1; + while (line_idx >= 0) { + const line = view.editor.getLine(line_idx).trim(); + if (line.length === 0) { + line_idx--; + continue; + } else if (line === "```") { + return true; + } else { + return false; + } + } + return false; + })(); + if (isCodeBlockAdjacent) { + elem_div.classList.add("hk-codeblock-result"); + elem_code.classList.add("hk-codeblock-result-code"); + const elem_result_prompt = document.createElement("div"); + elem_result_prompt.classList.add("hk-codeblock-result-prompt"); + elem_result_prompt.innerText = resultPrompt; + elem_div.insertBefore(elem_result_prompt, elem_pre); + } + } + }); } // src/main.ts @@ -615,4 +627,4 @@ var HKCodeBlockPlugin = class extends import_obsidian3.Plugin { await this.saveData(this.settings); } }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL21haW4udHMiLCAiLi4vc3JjL0hLQ29kZUJsb2NrU2V0dGluZ3MudHMiLCAiLi4vc3JjL0hLQ29kZUJsb2NrU2V0dGluZ1RhYi50cyIsICIuLi9zcmMvSEtDb2RlQmxvY2tQcm9jZXNzb3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFBsdWdpbiwgbG9hZFByaXNtIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IEhLQ29kZUJsb2NrU2V0dGluZ3MgfSBmcm9tICcuL0hLQ29kZUJsb2NrU2V0dGluZ3MnO1xuaW1wb3J0IHsgREVGQVVMVF9TRVRUSU5HUyB9IGZyb20gJy4vSEtDb2RlQmxvY2tTZXR0aW5ncyc7XG5pbXBvcnQgeyBIS0NvZGVCbG9ja1NldHRpbmdUYWIgfSBmcm9tICcuL0hLQ29kZUJsb2NrU2V0dGluZ1RhYic7XG5pbXBvcnQgeyBIS0NvZGVCbG9ja1Byb2Nlc3NvciB9IGZyb20gJy4vSEtDb2RlQmxvY2tQcm9jZXNzb3InO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIS0NvZGVCbG9ja1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG5cdHNldHRpbmdzOiBIS0NvZGVCbG9ja1NldHRpbmdzO1xuXG5cdGFzeW5jIG9ubG9hZCgpIHtcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXHRcdGlmICh0aGlzLnNldHRpbmdzLmRlYnVnTW9kZSkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJsb2FkaW5nIEhLQ29kZUJsb2NrIHBsdWdpblwiKTtcblx0XHR9XG5cblx0XHQvLyByZWdpc3RlciBzZXR0aW5ncyB0YWJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEhLQ29kZUJsb2NrU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgbWFya2Rvd24gcG9zdCBwcm9jZXNzb3Jcblx0XHRjb25zdCBwcm9jZXNzb3IgPSB0aGlzLnJlZ2lzdGVyTWFya2Rvd25Qb3N0UHJvY2Vzc29yKChlbCwgY3R4KSA9PiB7XG5cdFx0XHRIS0NvZGVCbG9ja1Byb2Nlc3NvcihlbCwgY3R4LCB0aGlzKTtcblx0XHR9KTtcblxuXHRcdHByb2Nlc3Nvci5zb3J0T3JkZXIgPSAxMDA7IC8vIHJ1biBhZnRlciB0aGUgZGVmYXVsdCBjb2RlIGJsb2NrIHByb2Nlc3NvclxuXHR9XG5cblx0b251bmxvYWQoKSB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWdNb2RlKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcInVubG9hZGluZyBIS0NvZGVCbG9jayBwbHVnaW5cIik7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xuXHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuXHR9XG5cblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG5cdH1cbn0iLCAiZXhwb3J0IGludGVyZmFjZSBIS0NvZGVCbG9ja1NldHRpbmdzIHtcblx0dXNlVGl0bGVHbG9iYWw6IChcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblxuXHR1c2VDb2xsYXBzaWJsZUdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRkZWZhdWx0Q29sbGFwc2U6IChcImNvbGxhcHNlXCIgfCBcImV4cGFuZFwiKTtcblx0c2hvd0NvbGxhcHNlQnRuOiBib29sZWFuO1xuXG5cdHVzZUxpbmVub3NHbG9iYWw6IChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0ZGVmYXVsdExpbmVub3NTdGFydDogbnVtYmVyO1xuXHRzaG93TGluZW5vc1NwbGl0dGVyOiBib29sZWFuO1xuXG5cdHVzZUhpZ2hsaWdodEdsb2JhbDogKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRoaWdobGlnaHRDb2xvcjogc3RyaW5nO1xuXG5cdHVzZUxhbmd1YWdlR2xvYmFsOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdGRlZmF1bHRMYW5ndWFnZTogc3RyaW5nO1xuXHRcblx0dXNlQ29weUJ0bkdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcblx0dXNlUHJvbXB0R2xvYmFsOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdGRlZmF1bHRQcm9tcHQ6IHN0cmluZztcblx0XG5cdHVzZVJlc3VsdEdsb2JhbDogKFwiZW5hYmxlXCIgfCBcImRpc2FibGVcIik7XG5cdHByb21wdGluZ0xhbmd1YWdlczogc3RyaW5nW107XG5cdGRlZmF1bHRSZXN1bHRQcm9tcHQ6IHN0cmluZztcblxuXHRkZWJ1Z01vZGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBIS0NvZGVCbG9ja1NldHRpbmdzID0ge1xuXHR1c2VUaXRsZUdsb2JhbDogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cblx0dXNlQ29sbGFwc2libGVHbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRkZWZhdWx0Q29sbGFwc2U6IFwiZXhwYW5kXCIsXG5cdHNob3dDb2xsYXBzZUJ0bjogdHJ1ZSxcblxuXHR1c2VMaW5lbm9zR2xvYmFsOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0ZGVmYXVsdExpbmVub3NTdGFydDogMSxcblx0c2hvd0xpbmVub3NTcGxpdHRlcjogdHJ1ZSxcblxuXHR1c2VIaWdobGlnaHRHbG9iYWw6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRoaWdobGlnaHRDb2xvcjogXCIjZmYwMDAwXCIsXG5cblx0dXNlTGFuZ3VhZ2VHbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRkZWZhdWx0TGFuZ3VhZ2U6IFwicGxhaW4gdGV4dFwiLFxuXG5cdHVzZUNvcHlCdG5HbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXG5cdHVzZVByb21wdEdsb2JhbDogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cdHByb21wdGluZ0xhbmd1YWdlczogW1wiYmFzaFwiXSxcblx0ZGVmYXVsdFByb21wdDogXCIkXCIsXG5cblx0dXNlUmVzdWx0R2xvYmFsOiBcImVuYWJsZVwiLFxuXHRkZWZhdWx0UmVzdWx0UHJvbXB0OiBcIlJlc3VsdFwiLFxuXG5cdGRlYnVnTW9kZTogZmFsc2UsXG59IiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IEhLQ29kZUJsb2NrUGx1Z2luIGZyb20gJy4vbWFpbic7XG5cbmV4cG9ydCBjb25zdCBmcmFnV2l0aEhUTUwgPSAodGV4dDogc3RyaW5nKSA9PiB7XG5cdHJldHVybiBjcmVhdGVGcmFnbWVudCgoZnJhZykgPT4ge1xuXHRcdGZyYWcuY3JlYXRlRGl2KCkuaW5uZXJIVE1MID0gdGV4dC5zcGxpdChcIlxcblwiKS5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKS5qb2luKFwiPGJyPlwiKTtcblx0fSk7XG59XG5cbmV4cG9ydCBjbGFzcyBIS0NvZGVCbG9ja1NldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0cGx1Z2luOiBIS0NvZGVCbG9ja1BsdWdpbjtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBIS0NvZGVCbG9ja1BsdWdpbikge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xuXG5cdFx0Ly8gdGl0bGVcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdUaXRsZScgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgVGl0bGUnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogdGhlIHRpdGxlIHdpbGwgb25seSBiZSBzaG93biBpZiB0aGUgdGl0bGUgc3RhdGVtZW50IGlzIHNwZWNpZmllZFxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogdGhlIHRpdGxlIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VUaXRsZUdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVRpdGxlR2xvYmFsID0gdmFsdWUgYXMgKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBjb2xsYXBzZVxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0NvbGxhcHNlJyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBDb2xsYXBzZScpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IHRoZSBjb2RlIGJsb2NrIHdpbGwgYWx3YXlzIGJlIGNvbGxhcHNpYmxlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZDwvYj4gOiB0aGUgY29kZSBibG9jayB3aWxsIGFsd2F5cyBiZSBjb2xsYXBzaWJsZSwgYnV0IHdpbGwgbm90IGJlIGNvbGxhcHNlZCBpZiBjb2xsYXBzZSBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiB0aGUgY29kZSBibG9jayB3aWxsIG9ubHkgYmUgY29sbGFwc2libGUgaWYgdGhlIGNvbGxhcHNlIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogdGhlIGNvZGUgYmxvY2sgd2lsbCBuZXZlciBiZSBjb2xsYXBzaWJsZWApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUNvbGxhcHNpYmxlR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlQ29sbGFwc2libGVHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0RlZmF1bHQgQ29sbGFwc2UgU3RhdGUnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBkZWZhdWx0IGNvbGxhcHNlIHN0YXRlIG9mIHRoZSBjb2RlIGJsb2NrLicpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJjb2xsYXBzZVwiOiBcImNvbGxhcHNlXCIsXG5cdFx0XHRcdFx0XCJleHBhbmRcIjogXCJleHBhbmRcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlID0gdmFsdWUgYXMgKFwiY29sbGFwc2VcIiB8IFwiZXhwYW5kXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBsaW5lIG51bWJlcnNcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMaW5lIE51bWJlcnMnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIExpbmUgTnVtYmVycycpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IGxpbmUgbnVtYmVycyB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGluZSBudW1iZXJzIHdpbGwgYWx3YXlzIGJlIHNob3duLCBidXQgd2lsbCBub3QgYmUgc2hvd24gaWYgbGluZW5vcyBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsaW5lIG51bWJlcnMgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsaW5lbm9zIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogbGluZSBudW1iZXJzIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlTGluZW5vc0dsb2JhbCA9IHZhbHVlIGFzIChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVmYXVsdCBMaW5lIE51bWJlciBTdGFydCcpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGRlZmF1bHQgbGluZSBudW1iZXIgc3RhcnQgb2YgdGhlIGNvZGUgYmxvY2suJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMaW5lbm9zU3RhcnQudG9TdHJpbmcoKSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG51bSA9IHBhcnNlSW50KHZhbHVlKTtcblx0XHRcdFx0XHRcdGlmIChpc05hTihudW0pKSByZXR1cm47XG5cblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMaW5lbm9zU3RhcnQgPSBudW07XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1Nob3cgTGluZSBOdW1iZXIgU3BsaXR0ZXInKVxuXHRcdFx0LmFkZFRvZ2dsZSh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93TGluZW5vc1NwbGl0dGVyKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dMaW5lbm9zU3BsaXR0ZXIgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gbGluZSBoaWdobGlnaHRcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMaW5lIEhpZ2hsaWdodCcgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgTGluZSBIaWdobGlnaHQnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGluZSBoaWdobGlnaHQgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsaW5lIGhpZ2hsaWdodCBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBsaW5lIGhpZ2hsaWdodCB3aWxsIG5ldmVyIGJlIHNob3duYCkpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiYWx3YXlzIG9mZlwiOiBcImFsd2F5cyBvZmZcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlSGlnaGxpZ2h0R2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlSGlnaGxpZ2h0R2xvYmFsID0gdmFsdWUgYXMgKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdMaW5lIEhpZ2hsaWdodCBDb2xvcicpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGhpZ2hsaWdodGVkIGxpbmUuIE5vdGUgdGhhdCB0aGUgZ2l2ZW4gY29sb3Igd2lsbCBiZSBhcHBsaWVkIHdpdGggMC4yIG9wYWNpdHkuJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmhpZ2hsaWdodENvbG9yKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuaGlnaGxpZ2h0Q29sb3IgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gbGFuZ3VhZ2Vcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMYW5ndWFnZSBJbmRpY2F0b3InIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIExhbmd1YWdlIEluZGljYXRvcicpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IGxhbmd1YWdlIGluZGljYXRvciB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGFuZ3VhZ2UgaW5kaWNhdG9yIHdpbGwgYWx3YXlzIGJlIHNob3duLCBidXQgd2lsbCBub3QgYmUgc2hvd24gaWYgdGhlIGxhbmd1YWdlIGluZGljYXRvciBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsYW5ndWFnZSBpbmRpY2F0b3Igd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsYW5ndWFnZSBpbmRpY2F0b3Igc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyB0cnVlXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBsYW5ndWFnZSBpbmRpY2F0b3Igd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0RlZmF1bHQgTGFuZ3VhZ2UnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBkZWZhdWx0IGxhbmd1YWdlIG5hbWUgb2YgdGhlIGNvZGUgYmxvY2sgaWYgdGhlIGxhbmd1YWdlIGlzIG5vdCBzcGVjaWZpZWQuJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMYW5ndWFnZSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMYW5ndWFnZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XG5cdFx0Ly8gY29weSBidXR0b25cblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdDb3B5IEJ1dHRvbicgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgQ29weSBCdXR0b24nKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmFsd2F5cyBvbjwvYj4gOiBjb3B5IGJ1dHRvbiB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogY29weSBidXR0b24gd2lsbCBhbHdheXMgYmUgc2hvd24sIGJ1dCB3aWxsIG5vdCBiZSBzaG93biBpZiB0aGUgY29weSBidXR0b24gc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyBmYWxzZVxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogY29weSBidXR0b24gd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBjb3B5IGJ1dHRvbiBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIHRydWVcblx0XHRcdFx0LSA8Yj5hbHdheXMgb2ZmPC9iPiA6IGNvcHkgYnV0dG9uIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlQ29weUJ0bkdsb2JhbCA9IHZhbHVlIGFzIChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gcHJvbXB0XG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiAnUHJvbXB0JyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBQcm9tcHQnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmFsd2F5cyBvbjwvYj4gOiBwcm9tcHQgd2lsbCBhbHdheXMgYmUgc2hvd25cblx0XHRcdFx0LSA8Yj5kZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkPC9iPiA6IHByb21wdCB3aWxsIGFsd2F5cyBiZSBzaG93biwgYnV0IHdpbGwgbm90IGJlIHNob3duIGlmIHRoZSBwcm9tcHQgc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyBmYWxzZVxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogcHJvbXB0IHdpbGwgb25seSBiZSBzaG93biBpZiB0aGUgcHJvbXB0IHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogcHJvbXB0IHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1Byb21wdGluZyBMYW5ndWFnZXMnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBsYW5ndWFnZXMgdGhhdCB3aWxsIGJlIHByb21wdGVkIGJ5IGRlZmF1bHQuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSBsYW5ndWFnZXMgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggZW50ZXJzLicpXG5cdFx0XHQuYWRkVGV4dEFyZWEodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvbXB0aW5nTGFuZ3VhZ2VzLmpvaW4oXCJcXG5cIikpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBsaW5lcyA9IHZhbHVlLnNwbGl0KFwiXFxuXCIpLmZpbHRlcihsaW5lID0+IGxpbmUudHJpbSgpICE9PSBcIlwiKTtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnByb21wdGluZ0xhbmd1YWdlcyA9IGxpbmVzO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiRGVmYXVsdCBQcm9tcHRcIilcblx0XHRcdC5zZXREZXNjKFwiVGhlIGRlZmF1bHQgcHJvbXB0IG9mIHRoZSBiYXNoIGNvZGUgYmxvY2suXCIpXG5cdFx0XHQuYWRkVGV4dCh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UHJvbXB0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdFByb21wdCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyByZXN1bHRcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdSZXN1bHQnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIFJlc3VsdCcpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+ZW5hYmxlPC9iPiA6IHRyZWF0IHRoZSBjb2RlIGJsb2NrIHN0YXJ0cyBsaWtlIFxcYFxcYFxcYFxcYHJlc3VsdFxcYCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBhZGphY2VudCBwcmV2aW91cyBjb2RlIGJsb2NrXG5cdFx0XHRcdC0gPGI+ZGlzYWJsZTwvYj4gOiB0cmVhdCB0aGUgY29kZSBibG9jayB3aXRoIFxcYHJlc3VsdFxcYCBhcyBpdHMgbGFuZ3VhZ2UgbmFtZSBhcyBhIG5vcm1hbCBjb2RlIGJsb2NrYCkpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJlbmFibGVcIjogXCJlbmFibGVcIixcblx0XHRcdFx0XHRcImRpc2FibGVcIjogXCJkaXNhYmxlXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVJlc3VsdEdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVJlc3VsdEdsb2JhbCA9IHZhbHVlIGFzIChcImVuYWJsZVwiIHwgXCJkaXNhYmxlXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiRGVmYXVsdCBSZXN1bHQgUHJvbXB0XCIpXG5cdFx0XHQuc2V0RGVzYyhcIlRoZSBkZWZhdWx0IHByb21wdCBvZiB0aGUgcmVzdWx0IGNvZGUgYmxvY2suXCIpXG5cdFx0XHQuYWRkVGV4dCh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UmVzdWx0UHJvbXB0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdFJlc3VsdFByb21wdCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBmb3IgZGV2ZWxvcGVyc1xuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0RldmVsb3BlcnMnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVidWcgTW9kZScpXG5cdFx0XHQuc2V0RGVzYygnU2hvdyBsb2dzIGluIHRoZSBjb25zb2xlLicpXG5cdFx0XHQuYWRkVG9nZ2xlKHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlYnVnTW9kZSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1Z01vZGUgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHR9XG59IiwgImltcG9ydCB7IE1hcmtkb3duVmlldyB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHR5cGUgeyBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LCBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgSEtDb2RlQmxvY2tQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xuaW1wb3J0IHR5cGUgeyBIS0NvZGVCbG9ja1NldHRpbmdzIH0gZnJvbSBcIi4vSEtDb2RlQmxvY2tTZXR0aW5nc1wiO1xuXG5jb25zdCBSRUdFWCA9IHtcbiAgVElUTEU6IC9cXHN0aXRsZTooPzonKC4qPyknfFwiKC4qPylcIilcXHMvLFxuICBDT0xMQVBTSUJMRV9TSU1QTEU6IC9cXHNjb2xsYXBzaWJsZVxccy8sXG4gIENPTExBUFNJQkxFX0NPTVBMSUNBVEU6IC9cXHNjb2xsYXBzaWJsZToodHJ1ZXxmYWxzZSlcXHMvLFxuICBMSU5FTk9TX1NJTVBMRTogL1xcc2xpbmVub3NcXHMvLFxuICBMSU5FTk9TX0NPTVBMSUNBVEU6IC9cXHNsaW5lbm9zOih0cnVlfGZhbHNlfCgtezAsMX1cXGQrKSlcXHMvLFxuICBISUdITElHSFQ6IC9cXHNoaWdobGlnaHQ6KD86JyguKj8pJ3xcIiguKj8pXCIpXFxzLyxcbiAgTEFOR1VBR0VfRlJPTV9DTEFTUzogL15sYW5ndWFnZS0oXFx3KykkLyxcbiAgTEFOR1VBR0VfU0lNUExFOiAvXFxzbGFuZ3VhZ2VcXHMvLFxuICBMQU5HVUFHRV9DT01QTElDQVRFOiAvXFxzbGFuZ3VhZ2U6KHRydWV8ZmFsc2V8JyguKj8pJ3xcIiguKj8pXCIpXFxzLyxcbiAgQ09QWUJUTl9TSU1QTEU6IC9cXHNjb3B5YnRuXFxzLyxcbiAgQ09QWUJUTl9DT01QTElDQVRFOiAvXFxzY29weWJ0bjoodHJ1ZXxmYWxzZSlcXHMvLFxuICBSRVNVTFQ6IC9eYGBgcmVzdWx0XFxzLyxcbiAgUFJPTVBUX1NJTVBMRTogL1xcc3Byb21wdFxccy8sXG4gIFBST01QVF9DT01QTElDQVRFOiAvXFxzcHJvbXB0Oih0cnVlfGZhbHNlfCcoLio/KSd8XCIoLio/KVwiKVxccy8sXG4gIE5VTUJFUjogL14tezAsMX1cXGQrJC8sXG59XG5cbmZ1bmN0aW9uIGdldE1ldGEodmlldzogTWFya2Rvd25WaWV3LCBlbGVtX2NvZGU6IEhUTUxFbGVtZW50LCBzZWN0aW9uX2NvZGU6IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uLCBzZXR0aW5nczogSEtDb2RlQmxvY2tTZXR0aW5ncyk6IHtcbiAgc2hvd1RpdGxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gIHRpdGxlOiBzdHJpbmcsXG4gIGlzQ29sbGFwc2libGU6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgc2hvd0xpbmVub3M6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgbGluZW5vc1N0YXJ0OiBudW1iZXIsXG4gIGxpbmVub3NOdW06IG51bWJlcixcbiAgc2hvd0hpZ2hsaWdodDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBoaWdobGlnaHRMaW5lczogbnVtYmVyW10sXG4gIHNob3dMYW5ndWFnZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBsYW5ndWFnZTogc3RyaW5nLFxuICBzaG93Q29weUJ0bjogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBpc1Jlc3VsdDogYm9vbGVhbixcbiAgcmVzdWx0UHJvbXB0OiBzdHJpbmcsXG4gIHNob3dQcm9tcHQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgcHJvbXB0OiBzdHJpbmdcbn0ge1xuICBjb25zdCBsaW5lU3RhcnQgPSAoKCkgPT4ge1xuICAgIGZvcihsZXQgaSA9IHNlY3Rpb25fY29kZS5saW5lU3RhcnQ7IGkgPD0gc2VjdGlvbl9jb2RlLmxpbmVFbmQ7IGkrKykge1xuICAgICAgY29uc3QgbGluZSA9IHZpZXcuZWRpdG9yLmdldExpbmUoaSk7XG4gICAgICBpZiAobGluZS50cmltKCkuc3RhcnRzV2l0aChcImBgYFwiKSkgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9KSgpO1xuXG4gIGNvbnN0IGxpbmVFbmQgPSAoKCkgPT4ge1xuICAgIGZvcihsZXQgaSA9IHNlY3Rpb25fY29kZS5saW5lRW5kOyBpID49IHNlY3Rpb25fY29kZS5saW5lU3RhcnQ7IGktLSkge1xuICAgICAgY29uc3QgbGluZSA9IHZpZXcuZWRpdG9yLmdldExpbmUoaSk7XG4gICAgICBpZiAobGluZS50cmltKCkuc3RhcnRzV2l0aChcImBgYFwiKSkgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9KSgpO1xuXG4gIGlmIChsaW5lU3RhcnQgPCAwIHx8IGxpbmVFbmQgPCAwIHx8IGxpbmVTdGFydCA+PSBsaW5lRW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgdGhlIGZpcnN0IGxpbmUgb3IgdGhlIGxhc3QgbGluZSBvZiB0aGUgY29kZSBibG9ja1wiKTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0bGluZSA9IHZpZXcuZWRpdG9yLmdldExpbmUobGluZVN0YXJ0KSArIFwiIFwiOyAvLyBhZGQgYSBzcGFjZSB0byB0aGUgZW5kIG9mIHRoZSBsaW5lIHRvIG1ha2Ugc3VyZSB0aGUgcmVnZXggd29ya3NcblxuICAvLyB0aXRsZVxuICBsZXQgc2hvd1RpdGxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCB0aXRsZSA9IFwiXCI7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X3RpdGxlID0gUkVHRVguVElUTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfdGl0bGUpIHtcbiAgICBzaG93VGl0bGUgPSB0cnVlO1xuICAgIHRpdGxlID0gcmVnZXhSZXN1bHRfdGl0bGVbMV0gfHwgcmVnZXhSZXN1bHRfdGl0bGVbMl07XG4gIH1cblxuICAvLyBjb2xsYXBzaWJsZVxuICBsZXQgaXNDb2xsYXBzaWJsZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpID0gdW5kZWZpbmVkO1xuICBjb25zdCByZWdleFJlc3VsdF9jb2xsYXBzaWJsZVNpbXBsZSA9IFJFR0VYLkNPTExBUFNJQkxFX1NJTVBMRS5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2NvbGxhcHNpYmxlQ29tcGxpY2F0ZSA9IFJFR0VYLkNPTExBUFNJQkxFX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfY29sbGFwc2libGVTaW1wbGUpIHtcbiAgICBpc0NvbGxhcHNpYmxlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9jb2xsYXBzaWJsZUNvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfY29sbGFwc2libGVDb21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgaXNDb2xsYXBzaWJsZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9jb2xsYXBzaWJsZUNvbXBsaWNhdGVbMV0gPT09IFwiZmFsc2VcIikge1xuICAgICAgaXNDb2xsYXBzaWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGxpbmVub3NcbiAgbGV0IHNob3dMaW5lbm9zOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCBsaW5lbm9zU3RhcnQgPSBzZXR0aW5ncy5kZWZhdWx0TGluZW5vc1N0YXJ0O1xuICBjb25zdCBsaW5lbm9zTnVtID0gbGluZUVuZCAtIGxpbmVTdGFydCAtIDE7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2xpbmVub3NTaW1wbGUgPSBSRUdFWC5MSU5FTk9TX1NJTVBMRS5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlID0gUkVHRVguTElORU5PU19DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X2xpbmVub3NTaW1wbGUpIHtcbiAgICBzaG93TGluZW5vcyA9IHRydWU7XG4gIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfbGluZW5vc0NvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfbGluZW5vc0NvbXBsaWNhdGVbMV0gPT09IFwidHJ1ZVwiKSB7XG4gICAgICBzaG93TGluZW5vcyA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZVsxXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICBzaG93TGluZW5vcyA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93TGluZW5vcyA9IHRydWU7XG4gICAgICBsaW5lbm9zU3RhcnQgPSBwYXJzZUludChyZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZVsyXSkgfHwgMTtcbiAgICB9XG4gIH1cblxuICAvLyBoaWdobGlnaHRcbiAgbGV0IHNob3dIaWdobGlnaHQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgbGV0IGhpZ2hsaWdodExpbmVzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCByZWdleFJlc3VsdF9oaWdobGlnaHQgPSBSRUdFWC5ISUdITElHSFQuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfaGlnaGxpZ2h0KSB7XG4gICAgc2hvd0hpZ2hsaWdodCA9IHRydWU7XG4gICAgY29uc3QgaGlnaGxpZ2h0TGluZXNfc3RyID0gcmVnZXhSZXN1bHRfaGlnaGxpZ2h0WzFdIHx8IHJlZ2V4UmVzdWx0X2hpZ2hsaWdodFsyXTtcbiAgICBoaWdobGlnaHRMaW5lcyA9IGhpZ2hsaWdodExpbmVzX3N0ci5zcGxpdChcIixcIikubWFwKChpdGVtKSA9PiB7XG4gICAgICBpdGVtID0gaXRlbS50cmltKCk7XG5cbiAgICAgIGlmIChSRUdFWC5OVU1CRVIudGVzdChpdGVtKSkgcmV0dXJuIHBhcnNlSW50KGl0ZW0pO1xuXG4gICAgICBjb25zdCBtdWx0aXBsZV9saW5lcyA9IGl0ZW0uc3BsaXQoXCItXCIpO1xuICAgICAgaWYgKG11bHRpcGxlX2xpbmVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCBzdGFydCA9IHBhcnNlSW50KG11bHRpcGxlX2xpbmVzWzBdLnRyaW0oKSk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHBhcnNlSW50KG11bHRpcGxlX2xpbmVzWzFdLnRyaW0oKSk7XG5cbiAgICAgICAgaWYgKCFpc05hTihzdGFydCkgJiYgIWlzTmFOKGVuZCkpIHtcbiAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogZW5kIC0gc3RhcnQgKyAxIH0sIChfLCBpKSA9PiBpICsgc3RhcnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOYU47XG4gICAgfSkuZmxhdCgpLmZpbHRlcigoaXRlbSkgPT4gIWlzTmFOKGl0ZW0pKTtcblxuICAgIGlmIChoaWdobGlnaHRMaW5lcy5zb21lKChsaW5lKSA9PiBpc05hTihsaW5lKSkpIHtcbiAgICAgIC8vIGlmIGFueSBlbGVtZW50IGlzIG5hbiwgdGhlbiBzZXQgc2hvd0hpZ2hsaWdodCB0byBmYWxzZVxuICAgICAgc2hvd0hpZ2hsaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgIGhpZ2hsaWdodExpbmVzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVzZSBvbmx5IHZhbGlkIGxpbmUgbnVtYmVyc1xuICAgICAgaGlnaGxpZ2h0TGluZXMgPSBoaWdobGlnaHRMaW5lcy5maWx0ZXIoKGxpbmUpID0+IGxpbmUgPj0gbGluZW5vc1N0YXJ0ICYmIGxpbmUgPCBsaW5lbm9zU3RhcnQgKyBsaW5lbm9zTnVtKTtcbiAgICB9XG4gIH1cblxuICAvLyBsYW5ndWFnZVxuICBsZXQgc2hvd0xhbmd1YWdlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCBsYW5ndWFnZSA9ICgoKSA9PiB7XG4gICAgbGV0IGxhbmd1YWdlID0gc2V0dGluZ3MuZGVmYXVsdExhbmd1YWdlO1xuICAgIGVsZW1fY29kZS5jbGFzc0xpc3QuZm9yRWFjaCgoY2xhc3NOYW1lKSA9PiB7XG4gICAgICBjb25zdCByZWdleFJlc3VsdF9sYW5ndWFnZUZyb21DbGFzcyA9IFJFR0VYLkxBTkdVQUdFX0ZST01fQ0xBU1MuZXhlYyhjbGFzc05hbWUudHJpbSgpKTtcbiAgICAgIGlmIChyZWdleFJlc3VsdF9sYW5ndWFnZUZyb21DbGFzcykgbGFuZ3VhZ2UgPSByZWdleFJlc3VsdF9sYW5ndWFnZUZyb21DbGFzc1sxXTtcbiAgICB9KTtcblxuICAgIHJldHVybiBsYW5ndWFnZTtcbiAgfSkoKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfbGFuZ3VhZ2VTaW1wbGUgPSBSRUdFWC5MQU5HVUFHRV9TSU1QTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBjb25zdCByZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGUgPSBSRUdFWC5MQU5HVUFHRV9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlU2ltcGxlKSB7XG4gICAgc2hvd0xhbmd1YWdlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgc2hvd0xhbmd1YWdlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZVsxXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICBzaG93TGFuZ3VhZ2UgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0xhbmd1YWdlID0gdHJ1ZTtcbiAgICAgIGxhbmd1YWdlID0gcmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzJdIHx8IHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZVszXTtcbiAgICB9XG4gIH1cblxuICAvLyBjb3B5IGJ1dHRvblxuICBsZXQgc2hvd0NvcHlCdG46IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVnZXhSZXN1bHRfY29weUJ0blNpbXBsZSA9IFJFR0VYLkNPUFlCVE5fU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfY29weUJ0bkNvbXBsaWNhdGUgPSBSRUdFWC5DT1BZQlROX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfY29weUJ0blNpbXBsZSkge1xuICAgIHNob3dDb3B5QnRuID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9jb3B5QnRuQ29tcGxpY2F0ZSkge1xuICAgIGlmIChyZWdleFJlc3VsdF9jb3B5QnRuQ29tcGxpY2F0ZVsxXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHNob3dDb3B5QnRuID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2NvcHlCdG5Db21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHNob3dDb3B5QnRuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJvbXB0XG4gIGxldCBzaG93UHJvbXB0OiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCBwcm9tcHQgPSBzZXR0aW5ncy5kZWZhdWx0UHJvbXB0O1xuICBjb25zdCByZWdleFJlc3VsdF9wcm9tcHRTaW1wbGUgPSBSRUdFWC5QUk9NUFRfU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZSA9IFJFR0VYLlBST01QVF9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X3Byb21wdFNpbXBsZSkge1xuICAgIHNob3dQcm9tcHQgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X3Byb21wdENvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZVsxXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHNob3dQcm9tcHQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZVsxXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICBzaG93UHJvbXB0ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dQcm9tcHQgPSB0cnVlO1xuICAgICAgcHJvbXB0ID0gcmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZVsyXSB8fCByZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlWzNdO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlc3VsdFxuICBsZXQgaXNSZXN1bHQgPSBmYWxzZTtcbiAgbGV0IHJlc3VsdFByb21wdCA9IHNldHRpbmdzLmRlZmF1bHRSZXN1bHRQcm9tcHQ7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X3Jlc3VsdCA9IFJFR0VYLlJFU1VMVC5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0UHJvbXB0X3Jlc3VsdCA9IFJFR0VYLlBST01QVF9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X3Jlc3VsdCkge1xuICAgIGlzUmVzdWx0ID0gdHJ1ZTtcblxuICAgIC8vIG92ZXJyaWRlIG90aGVyIG1ldGEgZGF0YSA6IG9ubHkgbGluZW5vcywgaGlnaGxpZ2h0IGFyZSBhdmFpbGFibGVcbiAgICBzaG93VGl0bGUgPSBmYWxzZTtcbiAgICBzaG93TGFuZ3VhZ2UgPSBmYWxzZTtcbiAgICBzaG93Q29weUJ0biA9IGZhbHNlO1xuICAgIHNob3dQcm9tcHQgPSBmYWxzZTtcblxuICAgIGlmIChyZWdleFJlc3VsdFByb21wdF9yZXN1bHQpIHtcbiAgICAgIHJlc3VsdFByb21wdCA9IHJlZ2V4UmVzdWx0UHJvbXB0X3Jlc3VsdFsyXSB8fCByZWdleFJlc3VsdFByb21wdF9yZXN1bHRbM107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzaG93VGl0bGU6IHNob3dUaXRsZSxcbiAgICB0aXRsZTogdGl0bGUsXG4gICAgaXNDb2xsYXBzaWJsZTogaXNDb2xsYXBzaWJsZSxcbiAgICBzaG93TGluZW5vczogc2hvd0xpbmVub3MsXG4gICAgbGluZW5vc1N0YXJ0OiBsaW5lbm9zU3RhcnQsXG4gICAgbGluZW5vc051bTogbGluZW5vc051bSxcbiAgICBzaG93SGlnaGxpZ2h0OiBzaG93SGlnaGxpZ2h0LFxuICAgIGhpZ2hsaWdodExpbmVzOiBoaWdobGlnaHRMaW5lcyxcbiAgICBzaG93TGFuZ3VhZ2U6IHNob3dMYW5ndWFnZSxcbiAgICBsYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgc2hvd0NvcHlCdG46IHNob3dDb3B5QnRuLFxuICAgIGlzUmVzdWx0OiBpc1Jlc3VsdCxcbiAgICByZXN1bHRQcm9tcHQ6IHJlc3VsdFByb21wdCxcbiAgICBzaG93UHJvbXB0OiBzaG93UHJvbXB0LFxuICAgIHByb21wdDogcHJvbXB0XG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBIS0NvZGVCbG9ja1Byb2Nlc3NvcihcbiAgZWw6IEhUTUxFbGVtZW50LFxuICBjb250ZXh0OiBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LFxuICBwbHVnaW46IEhLQ29kZUJsb2NrUGx1Z2luXG4pIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBwbHVnaW4uc2V0dGluZ3M7XG5cbiAgY29uc3QgdmlldyA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICBpZiAoIXZpZXcpIHJldHVybjtcblxuICBjb25zdCBlbGVtX2NvZGU6IChIVE1MRWxlbWVudCB8IG51bGwpID0gZWwucXVlcnlTZWxlY3RvcihcInByZTpub3QoLmZyb250bWF0dGVyKSA+IGNvZGVcIik7IC8vIHNraXAgZnJvbnQgbWF0dGVyXG4gIGlmICghZWxlbV9jb2RlKSByZXR1cm47XG5cbiAgY29uc3QgZWxlbV9wcmU6IChIVE1MRWxlbWVudCB8IG51bGwpID0gZWxlbV9jb2RlLnBhcmVudEVsZW1lbnQ7XG4gIGlmICghZWxlbV9wcmUpIHJldHVybjtcblxuICBjb25zdCBlbGVtX2RpdjogKEhUTUxFbGVtZW50IHwgbnVsbCkgPSBlbGVtX3ByZS5wYXJlbnRFbGVtZW50O1xuICBpZiAoIWVsZW1fZGl2KSByZXR1cm47XG5cbiAgY29uc3QgZWxlbV9jb3B5QnRuOiAoSFRNTEVsZW1lbnQgfCBudWxsKSA9IGVsZW1fZGl2LnF1ZXJ5U2VsZWN0b3IoXCIuY29weS1jb2RlLWJ1dHRvblwiKTtcbiAgaWYgKCFlbGVtX2NvcHlCdG4pIHJldHVybjtcblxuICBjb25zdCBzZWN0aW9uX2NvZGU6IChNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiB8IG51bGwpID0gY29udGV4dC5nZXRTZWN0aW9uSW5mbyhlbGVtX2NvZGUpO1xuICBpZiAoIXNlY3Rpb25fY29kZSkgcmV0dXJuO1xuXG4gIC8vIGdldCBtZXRhZGF0YVxuICBsZXQgXG4gICAgc2hvd1RpdGxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBpc0NvbGxhcHNpYmxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgc2hvd0xpbmVub3M6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgICBsaW5lbm9zU3RhcnQ6IG51bWJlcixcbiAgICBsaW5lbm9zTnVtOiBudW1iZXIsXG4gICAgc2hvd0hpZ2hsaWdodDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICAgIGhpZ2hsaWdodExpbmVzOiBudW1iZXJbXSxcbiAgICBzaG93TGFuZ3VhZ2U6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgICBsYW5ndWFnZTogc3RyaW5nLFxuICAgIHNob3dDb3B5QnRuOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgaXNSZXN1bHQ6IGJvb2xlYW4sXG4gICAgcmVzdWx0UHJvbXB0OiBzdHJpbmcsXG4gICAgc2hvd1Byb21wdDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICAgIHByb21wdDogc3RyaW5nO1xuICB0cnkge1xuICAgICh7XG4gICAgICBzaG93VGl0bGU6IHNob3dUaXRsZSxcbiAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgIGlzQ29sbGFwc2libGU6IGlzQ29sbGFwc2libGUsXG4gICAgICBzaG93TGluZW5vczogc2hvd0xpbmVub3MsXG4gICAgICBsaW5lbm9zU3RhcnQ6IGxpbmVub3NTdGFydCxcbiAgICAgIGxpbmVub3NOdW06IGxpbmVub3NOdW0sXG4gICAgICBzaG93SGlnaGxpZ2h0OiBzaG93SGlnaGxpZ2h0LFxuICAgICAgaGlnaGxpZ2h0TGluZXM6IGhpZ2hsaWdodExpbmVzLFxuICAgICAgc2hvd0xhbmd1YWdlOiBzaG93TGFuZ3VhZ2UsXG4gICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgICBzaG93Q29weUJ0bjogc2hvd0NvcHlCdG4sXG4gICAgICBpc1Jlc3VsdDogaXNSZXN1bHQsXG4gICAgICByZXN1bHRQcm9tcHQ6IHJlc3VsdFByb21wdCxcbiAgICAgIHNob3dQcm9tcHQ6IHNob3dQcm9tcHQsXG4gICAgICBwcm9tcHQ6IHByb21wdCxcbiAgICB9ID0gZ2V0TWV0YSh2aWV3LCBlbGVtX2NvZGUsIHNlY3Rpb25fY29kZSwgc2V0dGluZ3MpKTtcbiAgICBcbiAgICBpZiAoc2V0dGluZ3MuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgIHNob3dUaXRsZTogc2hvd1RpdGxlLFxuICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgIGlzQ29sbGFwc2libGU6IGlzQ29sbGFwc2libGUsXG4gICAgICAgIHNob3dMaW5lbm9zOiBzaG93TGluZW5vcyxcbiAgICAgICAgbGluZW5vc1N0YXJ0OiBsaW5lbm9zU3RhcnQsXG4gICAgICAgIGxpbmVub3NOdW06IGxpbmVub3NOdW0sXG4gICAgICAgIHNob3dIaWdobGlnaHQ6IHNob3dIaWdobGlnaHQsXG4gICAgICAgIGhpZ2hsaWdodExpbmVzOiBoaWdobGlnaHRMaW5lcyxcbiAgICAgICAgc2hvd0xhbmd1YWdlOiBzaG93TGFuZ3VhZ2UsXG4gICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICAgICAgc2hvd0NvcHlCdG46IHNob3dDb3B5QnRuLFxuICAgICAgICBpc1Jlc3VsdDogaXNSZXN1bHQsXG4gICAgICAgIHJlc3VsdFByb21wdDogcmVzdWx0UHJvbXB0LFxuICAgICAgICBzaG93UHJvbXB0OiBzaG93UHJvbXB0LFxuICAgICAgICBwcm9tcHQ6IHByb21wdCxcbiAgICAgIH0pXG4gICAgfVxuICB9IGNhdGNoIChlKSB7IC8vIGlmIGNhbm5vdCBmaW5kIG1ldGFkYXRhLCBza2lwIHRoaXMgY29kZSBibG9ja1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBIVE1MIGVsZW1lbnRzXG4gIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2tcIik7XG4gIGVsZW1fY29kZS5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWNvZGVcIik7XG4gIGVsZW1fY29weUJ0bi5yZW1vdmUoKTsgLy8gcmVtb3ZlIHRoZSBvcmlnaW5hbCBjb3B5IGJ1dHRvbiBhcyBkZWZhdWx0XG5cbiAgbGV0IGVsZW1fdGl0bGU6IChIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGlmIChzZXR0aW5ncy51c2VUaXRsZUdsb2JhbCA9PT0gXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dUaXRsZSA9PT0gdHJ1ZSkpIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctdGl0bGVcIik7XG5cbiAgICBlbGVtX3RpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlbGVtX3RpdGxlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stdGl0bGVcIik7XG4gICAgZWxlbV90aXRsZS5pbm5lckhUTUwgPSB0aXRsZTtcbiAgICBlbGVtX2Rpdi5pbnNlcnRCZWZvcmUoZWxlbV90aXRsZSwgZWxlbV9wcmUpO1xuICB9XG5cbiAgaWYgKFxuICAgIChzZXR0aW5ncy51c2VDb2xsYXBzaWJsZUdsb2JhbCA9PT0gXCJhbHdheXMgb25cIikgfHxcbiAgICAoc2V0dGluZ3MudXNlQ29sbGFwc2libGVHbG9iYWwgPT09IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiICYmIChpc0NvbGxhcHNpYmxlID09PSB1bmRlZmluZWQgfHwgaXNDb2xsYXBzaWJsZSA9PT0gdHJ1ZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZUNvbGxhcHNpYmxlR2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoaXNDb2xsYXBzaWJsZSA9PT0gdHJ1ZSkpXG4gICkge1xuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29sbGFwc2libGVcIik7XG5cbiAgICBpZiAoc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlID09PSBcImNvbGxhcHNlXCIpIHtcbiAgICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29sbGFwc2VkXCIpO1xuICAgIH1cblxuICAgIGlmIChlbGVtX3RpdGxlKSB7XG4gICAgICBlbGVtX3RpdGxlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZXYpID0+IHtcbiAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChlbGVtX2Rpdi5jbGFzc0xpc3QuY29udGFpbnMoXCJoay1jb2RlYmxvY2stY29sbGFwc2VkXCIpKSB7XG4gICAgICAgICAgZWxlbV9kaXYuY2xhc3NMaXN0LnJlbW92ZShcImhrLWNvZGVibG9jay1jb2xsYXBzZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1jb2xsYXBzZWRcIik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlbGVtX2NvbGxhcHNlQnRucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtX2NvbGxhcHNlQnRucy5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWNvbGxhcHNlLWJ0bnNcIik7XG5cbiAgICAgIGNvbnN0IGVsZW1fY29sbGFwc2VCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZWxlbV9jb2xsYXBzZUJ0bi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWNvbGxhcHNlLWJ0blwiLCBcImhrLWNvZGVibG9jay1jb2xsYXBzZWQtYnRuXCIpO1xuICAgICAgZWxlbV9jb2xsYXBzZUJ0bi5pbm5lckhUTUwgPSBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTEwIDE5YTEgMSAwIDAgMS0uNjQtLjIzIDEgMSAwIDAgMS0uMTMtMS40MUwxMy43MSAxMiA5LjM5IDYuNjNhMSAxIDAgMCAxIC4xNS0xLjQxIDEgMSAwIDAgMSAxLjQ2LjE1bDQuODMgNmExIDEgMCAwIDEgMCAxLjI3bC01IDZBMSAxIDAgMCAxIDEwIDE5elwiLz5cbiAgICAgIDwvc3ZnPmA7XG4gICAgICBlbGVtX2NvbGxhcHNlQnRucy5hcHBlbmRDaGlsZChlbGVtX2NvbGxhcHNlQnRuKTtcblxuICAgICAgY29uc3QgZWxlbV9leHBhbmRCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZWxlbV9leHBhbmRCdG4uY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1jb2xsYXBzZS1idG5cIiwgXCJoay1jb2RlYmxvY2stZXhwYW5kZWQtYnRuXCIpO1xuICAgICAgZWxlbV9leHBhbmRCdG4uaW5uZXJIVE1MID0gYDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMiAxNmExIDEgMCAwIDEtLjY0LS4yM2wtNi01YTEgMSAwIDEgMSAxLjI4LTEuNTRMMTIgMTMuNzFsNS4zNi00LjMyYTEgMSAwIDAgMSAxLjQxLjE1IDEgMSAwIDAgMS0uMTQgMS40NmwtNiA0LjgzQTEgMSAwIDAgMSAxMiAxNnpcIi8+XG4gICAgICA8L3N2Zz5gO1xuICAgICAgZWxlbV9jb2xsYXBzZUJ0bnMuYXBwZW5kQ2hpbGQoZWxlbV9leHBhbmRCdG4pO1xuXG4gICAgICBlbGVtX3RpdGxlLnByZXBlbmQoZWxlbV9jb2xsYXBzZUJ0bnMpO1xuICAgIH1cbiAgfVxuXG5cbiAgaWYgKFxuICAgIChzZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsID09PSBcImFsd2F5cyBvblwiKSB8fFxuICAgIChzZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0xpbmVub3MgPT09IHVuZGVmaW5lZCB8fCBzaG93TGluZW5vcyA9PT0gdHJ1ZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZUxpbmVub3NHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93TGluZW5vcyA9PT0gdHJ1ZSkpXG4gICkge1xuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stc2hvdy1saW5lbm9zXCIpO1xuXG4gICAgY29uc3QgZWxlbV9saW5lbm9zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlbGVtX2xpbmVub3MuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1saW5lbm9zXCIpO1xuICAgIGVsZW1fbGluZW5vcy5pbm5lclRleHQgPSBBcnJheShsaW5lbm9zTnVtKS5maWxsKDApLm1hcCgoXywgaWR4KSA9PiBpZHggKyBsaW5lbm9zU3RhcnQpLmpvaW4oXCJcXG5cIik7XG4gICAgZWxlbV9wcmUuaW5zZXJ0QmVmb3JlKGVsZW1fbGluZW5vcywgZWxlbV9jb2RlKTtcblxuICAgIGlmIChzZXR0aW5ncy5zaG93TGluZW5vc1NwbGl0dGVyKSB7XG4gICAgICBlbGVtX2xpbmVub3MuY2xhc3NMaXN0LmFkZChcInNob3ctc3BsaXR0ZXJcIik7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNldHRpbmdzLnVzZUhpZ2hsaWdodEdsb2JhbCA9PT0gXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dIaWdobGlnaHQgPT09IHRydWUpKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LWhpZ2hsaWdodFwiKTtcblxuICAgIGVsZW1fZGl2LnN0eWxlLnNldFByb3BlcnR5KFwiLS1oay1jb2RlYmxvY2staGlnaGxpZ2h0LWJhY2tncm91bmQtY29sb3JcIiwgc2V0dGluZ3MuaGlnaGxpZ2h0Q29sb3IpO1xuXG4gICAgY29uc3QgZWxlbV9oaWdobGlnaHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGVsZW1faGlnaGxpZ2h0LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2staGlnaGxpZ2h0XCIpO1xuICAgIGVsZW1faGlnaGxpZ2h0LmlubmVySFRNTCA9IEFycmF5KGxpbmVub3NOdW0pLmZpbGwoMCkubWFwKChfLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoaGlnaGxpZ2h0TGluZXMuaW5jbHVkZXMoaWR4ICsgbGluZW5vc1N0YXJ0KSkgY2xhc3NOYW1lcy5wdXNoKFwiaGlnaGxpZ2h0XCIpO1xuICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cImxpbmUgbGluZS0ke2lkeCArIGxpbmVub3NTdGFydH0gJHtjbGFzc05hbWVzLmpvaW4oXCIgXCIpfVwiPiA8L3NwYW4+YDtcbiAgICB9KS5qb2luKFwiXFxuXCIpO1xuICAgIGVsZW1fcHJlLmluc2VydEJlZm9yZShlbGVtX2hpZ2hsaWdodCwgZWxlbV9jb2RlKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPT09IFwiYWx3YXlzIG9uXCIpIHx8XG4gICAgKHNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0xhbmd1YWdlID09PSB1bmRlZmluZWQgfHwgc2hvd0xhbmd1YWdlID09PSB0cnVlKSkgfHxcbiAgICAoc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93TGFuZ3VhZ2UgPT09IHRydWUpKVxuICApIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctbGFuZ3VhZ2VcIik7XG5cbiAgICBjb25zdCBlbGVtX2xhbmd1YWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlbGVtX2xhbmd1YWdlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stbGFuZ3VhZ2VcIik7XG4gICAgZWxlbV9sYW5ndWFnZS5pbm5lclRleHQgPSBsYW5ndWFnZTtcbiAgICBlbGVtX3ByZS5wcmVwZW5kKGVsZW1fbGFuZ3VhZ2UpO1xuICB9XG5cbiAgaWYgKFxuICAgIChzZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID09PSBcImFsd2F5cyBvblwiKSB8fFxuICAgIChzZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0NvcHlCdG4gPT09IHVuZGVmaW5lZCB8fCBzaG93Q29weUJ0biA9PT0gdHJ1ZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZUNvcHlCdG5HbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93Q29weUJ0biA9PT0gdHJ1ZSkpXG4gICkge1xuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stc2hvdy1jb3B5YnRuXCIpO1xuXG4gICAgZWxlbV9wcmUuYXBwZW5kQ2hpbGQoZWxlbV9jb3B5QnRuKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoc2V0dGluZ3MudXNlUHJvbXB0R2xvYmFsID09PSBcImFsd2F5cyBvblwiICYmIHNldHRpbmdzLnByb21wdGluZ0xhbmd1YWdlcy5pbmNsdWRlcyhsYW5ndWFnZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZVByb21wdEdsb2JhbCA9PT0gXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgJiYgc2V0dGluZ3MucHJvbXB0aW5nTGFuZ3VhZ2VzLmluY2x1ZGVzKGxhbmd1YWdlKSAmJiAoc2hvd1Byb21wdCA9PT0gdW5kZWZpbmVkIHx8IHNob3dQcm9tcHQgPT09IHRydWUpKSB8fFxuICAgIChzZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93UHJvbXB0ID09PSB0cnVlKSlcbiAgKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LXByb21wdFwiKTtcblxuICAgIGNvbnN0IGVsZW1fcHJvbXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlbGVtX3Byb21wdC5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXByb21wdFwiKTtcblxuICAgIGNvbnN0IGxpbmVzID0gZWxlbV9jb2RlLmlubmVyVGV4dC5zcGxpdChcIlxcblwiKTtcbiAgICBlbGVtX3Byb21wdC5pbm5lclRleHQgPSBBcnJheShsaW5lbm9zTnVtKS5maWxsKDApLm1hcCgoXywgaWR4KSA9PiB7XG4gICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gbGluZXMubGVuZ3RoKSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2lkeF0udHJpbSgpO1xuICAgICAgY29uc3QgcHJldkxpbmUgPSBpZHggPiAwID8gbGluZXNbaWR4IC0gMV0udHJpbSgpIDogXCJcIjtcblxuICAgICAgaWYgKFxuICAgICAgICAobGluZSA9PT0gXCJcIikgfHwgLy8gY2hlY2sgaWYgdGhlIGxpbmUgaXMgZW1wdHlcbiAgICAgICAgKGxpbmUuc3RhcnRzV2l0aChcIiNcIikpIHx8IC8vIGNoZWNrIGlmIHRoZSBsaW5lIGlzIGEgY29tbWVudFxuICAgICAgICAocHJldkxpbmUuZW5kc1dpdGgoXCJcXFxcXCIpKSAvLyBjaGVjayBpZiB0aGUgbGluZSBpcyBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgcHJldmlvdXMgbGluZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBcIiBcIi5yZXBlYXQocHJvbXB0Lmxlbmd0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9tcHQ7XG4gICAgfSkuZmlsdGVyKChsaW5lKSA9PiBsaW5lICE9PSBudWxsKS5qb2luKFwiXFxuXCIpO1xuXG4gICAgZWxlbV9wcmUuaW5zZXJ0QmVmb3JlKGVsZW1fcHJvbXB0LCBlbGVtX2NvZGUpO1xuICB9XG5cbiAgaWYgKHNldHRpbmdzLnVzZVJlc3VsdEdsb2JhbCA9PT0gXCJlbmFibGVcIiAmJiAoaXNSZXN1bHQgPT09IHRydWUpKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1yZXN1bHRcIik7XG4gICAgZWxlbV9jb2RlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stcmVzdWx0LWNvZGVcIik7XG5cbiAgICBlbGVtX2Rpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLXJlc3VsdC1wcm9tcHRcIiwgcmVzdWx0UHJvbXB0KTtcbiAgfVxufSJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQSxt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YUFBYSxTQUFTO0FBQUEsRUFDOUM7QUFFQSxNQUFJLFNBQVMsb0JBQW9CLFlBQWEsYUFBYSxNQUFPO0FBQ2hFLGFBQVMsVUFBVSxJQUFJLHFCQUFxQjtBQUM1QyxjQUFVLFVBQVUsSUFBSSwwQkFBMEI7QUFFbEQsYUFBUyxhQUFhLHNCQUFzQixZQUFZO0FBQUEsRUFDMUQ7QUFDRjs7O0FIbGRBLElBQXFCLG9CQUFyQixjQUErQyx3QkFBTztBQUFBLEVBR3JELE1BQU0sU0FBUztBQUNkLFVBQU0sS0FBSyxhQUFhO0FBQ3hCLFFBQUksS0FBSyxTQUFTLFdBQVc7QUFDNUIsY0FBUSxJQUFJLDRCQUE0QjtBQUFBLElBQ3pDO0FBR0EsU0FBSyxjQUFjLElBQUksc0JBQXNCLEtBQUssS0FBSyxJQUFJLENBQUM7QUFHNUQsVUFBTSxZQUFZLEtBQUssOEJBQThCLENBQUMsSUFBSSxRQUFRO0FBQ2pFLDJCQUFxQixJQUFJLEtBQUssSUFBSTtBQUFBLElBQ25DLENBQUM7QUFFRCxjQUFVLFlBQVk7QUFBQSxFQUN2QjtBQUFBLEVBRUEsV0FBVztBQUNWLFFBQUksS0FBSyxTQUFTLFdBQVc7QUFDNUIsY0FBUSxJQUFJLDhCQUE4QjtBQUFBLElBQzNDO0FBQUEsRUFDRDtBQUFBLEVBRUEsTUFBTSxlQUFlO0FBQ3BCLFNBQUssV0FBVyxPQUFPLE9BQU8sQ0FBQyxHQUFHLGtCQUFrQixNQUFNLEtBQUssU0FBUyxDQUFDO0FBQUEsRUFDMUU7QUFBQSxFQUVBLE1BQU0sZUFBZTtBQUNwQixVQUFNLEtBQUssU0FBUyxLQUFLLFFBQVE7QUFBQSxFQUNsQztBQUNEOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfb2JzaWRpYW4iLCAiYXBwIiwgImltcG9ydF9vYnNpZGlhbiIsICJsYW5ndWFnZSJdCn0K +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL21haW4udHMiLCAiLi4vc3JjL0hLQ29kZUJsb2NrU2V0dGluZ3MudHMiLCAiLi4vc3JjL0hLQ29kZUJsb2NrU2V0dGluZ1RhYi50cyIsICIuLi9zcmMvSEtDb2RlQmxvY2tQcm9jZXNzb3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFBsdWdpbiwgbG9hZFByaXNtIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IEhLQ29kZUJsb2NrU2V0dGluZ3MgfSBmcm9tICcuL0hLQ29kZUJsb2NrU2V0dGluZ3MnO1xuaW1wb3J0IHsgREVGQVVMVF9TRVRUSU5HUyB9IGZyb20gJy4vSEtDb2RlQmxvY2tTZXR0aW5ncyc7XG5pbXBvcnQgeyBIS0NvZGVCbG9ja1NldHRpbmdUYWIgfSBmcm9tICcuL0hLQ29kZUJsb2NrU2V0dGluZ1RhYic7XG5pbXBvcnQgeyBIS0NvZGVCbG9ja1Byb2Nlc3NvciB9IGZyb20gJy4vSEtDb2RlQmxvY2tQcm9jZXNzb3InO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIS0NvZGVCbG9ja1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG5cdHNldHRpbmdzOiBIS0NvZGVCbG9ja1NldHRpbmdzO1xuXG5cdGFzeW5jIG9ubG9hZCgpIHtcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXHRcdGlmICh0aGlzLnNldHRpbmdzLmRlYnVnTW9kZSkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJsb2FkaW5nIEhLQ29kZUJsb2NrIHBsdWdpblwiKTtcblx0XHR9XG5cblx0XHQvLyByZWdpc3RlciBzZXR0aW5ncyB0YWJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEhLQ29kZUJsb2NrU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgbWFya2Rvd24gcG9zdCBwcm9jZXNzb3Jcblx0XHRjb25zdCBwcm9jZXNzb3IgPSB0aGlzLnJlZ2lzdGVyTWFya2Rvd25Qb3N0UHJvY2Vzc29yKChlbCwgY3R4KSA9PiB7XG5cdFx0XHRIS0NvZGVCbG9ja1Byb2Nlc3NvcihlbCwgY3R4LCB0aGlzKTtcblx0XHR9KTtcblxuXHRcdHByb2Nlc3Nvci5zb3J0T3JkZXIgPSAxMDA7IC8vIHJ1biBhZnRlciB0aGUgZGVmYXVsdCBjb2RlIGJsb2NrIHByb2Nlc3NvclxuXHR9XG5cblx0b251bmxvYWQoKSB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWdNb2RlKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcInVubG9hZGluZyBIS0NvZGVCbG9jayBwbHVnaW5cIik7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xuXHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuXHR9XG5cblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG5cdH1cbn0iLCAiZXhwb3J0IGludGVyZmFjZSBIS0NvZGVCbG9ja1NldHRpbmdzIHtcblx0dXNlVGl0bGVHbG9iYWw6IChcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblxuXHR1c2VDb2xsYXBzaWJsZUdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRkZWZhdWx0Q29sbGFwc2U6IChcImNvbGxhcHNlXCIgfCBcImV4cGFuZFwiKTtcblx0c2hvd0NvbGxhcHNlQnRuOiBib29sZWFuO1xuXG5cdHVzZUxpbmVub3NHbG9iYWw6IChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0ZGVmYXVsdExpbmVub3NTdGFydDogbnVtYmVyO1xuXHRzaG93TGluZW5vc1NwbGl0dGVyOiBib29sZWFuO1xuXG5cdHVzZUhpZ2hsaWdodEdsb2JhbDogKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRoaWdobGlnaHRDb2xvcjogc3RyaW5nO1xuXG5cdHVzZUxhbmd1YWdlR2xvYmFsOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdGRlZmF1bHRMYW5ndWFnZTogc3RyaW5nO1xuXHRcblx0dXNlQ29weUJ0bkdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcblx0dXNlUHJvbXB0R2xvYmFsOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdGRlZmF1bHRQcm9tcHQ6IHN0cmluZztcblx0XG5cdHVzZVJlc3VsdEdsb2JhbDogKFwiZW5hYmxlXCIgfCBcImRpc2FibGVcIik7XG5cdHByb21wdGluZ0xhbmd1YWdlczogc3RyaW5nW107XG5cdGRlZmF1bHRSZXN1bHRQcm9tcHQ6IHN0cmluZztcblxuXHRkZWJ1Z01vZGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBIS0NvZGVCbG9ja1NldHRpbmdzID0ge1xuXHR1c2VUaXRsZUdsb2JhbDogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cblx0dXNlQ29sbGFwc2libGVHbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRkZWZhdWx0Q29sbGFwc2U6IFwiZXhwYW5kXCIsXG5cdHNob3dDb2xsYXBzZUJ0bjogdHJ1ZSxcblxuXHR1c2VMaW5lbm9zR2xvYmFsOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0ZGVmYXVsdExpbmVub3NTdGFydDogMSxcblx0c2hvd0xpbmVub3NTcGxpdHRlcjogdHJ1ZSxcblxuXHR1c2VIaWdobGlnaHRHbG9iYWw6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRoaWdobGlnaHRDb2xvcjogXCIjZmYwMDAwXCIsXG5cblx0dXNlTGFuZ3VhZ2VHbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRkZWZhdWx0TGFuZ3VhZ2U6IFwicGxhaW4gdGV4dFwiLFxuXG5cdHVzZUNvcHlCdG5HbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXG5cdHVzZVByb21wdEdsb2JhbDogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cdHByb21wdGluZ0xhbmd1YWdlczogW1wiYmFzaFwiXSxcblx0ZGVmYXVsdFByb21wdDogXCIkXCIsXG5cblx0dXNlUmVzdWx0R2xvYmFsOiBcImVuYWJsZVwiLFxuXHRkZWZhdWx0UmVzdWx0UHJvbXB0OiBcIlJlc3VsdFwiLFxuXG5cdGRlYnVnTW9kZTogZmFsc2UsXG59IiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IEhLQ29kZUJsb2NrUGx1Z2luIGZyb20gJy4vbWFpbic7XG5cbmV4cG9ydCBjb25zdCBmcmFnV2l0aEhUTUwgPSAodGV4dDogc3RyaW5nKSA9PiB7XG5cdHJldHVybiBjcmVhdGVGcmFnbWVudCgoZnJhZykgPT4ge1xuXHRcdGZyYWcuY3JlYXRlRGl2KCkuaW5uZXJIVE1MID0gdGV4dC5zcGxpdChcIlxcblwiKS5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKS5qb2luKFwiPGJyPlwiKTtcblx0fSk7XG59XG5cbmV4cG9ydCBjbGFzcyBIS0NvZGVCbG9ja1NldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0cGx1Z2luOiBIS0NvZGVCbG9ja1BsdWdpbjtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBIS0NvZGVCbG9ja1BsdWdpbikge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xuXG5cdFx0Ly8gdGl0bGVcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdUaXRsZScgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgVGl0bGUnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogdGhlIHRpdGxlIHdpbGwgb25seSBiZSBzaG93biBpZiB0aGUgdGl0bGUgc3RhdGVtZW50IGlzIHNwZWNpZmllZFxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogdGhlIHRpdGxlIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VUaXRsZUdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVRpdGxlR2xvYmFsID0gdmFsdWUgYXMgKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBjb2xsYXBzZVxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0NvbGxhcHNlJyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBDb2xsYXBzZScpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IHRoZSBjb2RlIGJsb2NrIHdpbGwgYWx3YXlzIGJlIGNvbGxhcHNpYmxlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZDwvYj4gOiB0aGUgY29kZSBibG9jayB3aWxsIGFsd2F5cyBiZSBjb2xsYXBzaWJsZSwgYnV0IHdpbGwgbm90IGJlIGNvbGxhcHNlZCBpZiBjb2xsYXBzZSBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiB0aGUgY29kZSBibG9jayB3aWxsIG9ubHkgYmUgY29sbGFwc2libGUgaWYgdGhlIGNvbGxhcHNlIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogdGhlIGNvZGUgYmxvY2sgd2lsbCBuZXZlciBiZSBjb2xsYXBzaWJsZWApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUNvbGxhcHNpYmxlR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlQ29sbGFwc2libGVHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0RlZmF1bHQgQ29sbGFwc2UgU3RhdGUnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBkZWZhdWx0IGNvbGxhcHNlIHN0YXRlIG9mIHRoZSBjb2RlIGJsb2NrLicpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJjb2xsYXBzZVwiOiBcImNvbGxhcHNlXCIsXG5cdFx0XHRcdFx0XCJleHBhbmRcIjogXCJleHBhbmRcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlID0gdmFsdWUgYXMgKFwiY29sbGFwc2VcIiB8IFwiZXhwYW5kXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBsaW5lIG51bWJlcnNcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMaW5lIE51bWJlcnMnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIExpbmUgTnVtYmVycycpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IGxpbmUgbnVtYmVycyB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGluZSBudW1iZXJzIHdpbGwgYWx3YXlzIGJlIHNob3duLCBidXQgd2lsbCBub3QgYmUgc2hvd24gaWYgbGluZW5vcyBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsaW5lIG51bWJlcnMgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsaW5lbm9zIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogbGluZSBudW1iZXJzIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlTGluZW5vc0dsb2JhbCA9IHZhbHVlIGFzIChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVmYXVsdCBMaW5lIE51bWJlciBTdGFydCcpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGRlZmF1bHQgbGluZSBudW1iZXIgc3RhcnQgb2YgdGhlIGNvZGUgYmxvY2suJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMaW5lbm9zU3RhcnQudG9TdHJpbmcoKSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG51bSA9IHBhcnNlSW50KHZhbHVlKTtcblx0XHRcdFx0XHRcdGlmIChpc05hTihudW0pKSByZXR1cm47XG5cblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMaW5lbm9zU3RhcnQgPSBudW07XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1Nob3cgTGluZSBOdW1iZXIgU3BsaXR0ZXInKVxuXHRcdFx0LmFkZFRvZ2dsZSh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93TGluZW5vc1NwbGl0dGVyKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dMaW5lbm9zU3BsaXR0ZXIgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gbGluZSBoaWdobGlnaHRcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMaW5lIEhpZ2hsaWdodCcgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgTGluZSBIaWdobGlnaHQnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGluZSBoaWdobGlnaHQgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsaW5lIGhpZ2hsaWdodCBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBsaW5lIGhpZ2hsaWdodCB3aWxsIG5ldmVyIGJlIHNob3duYCkpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiYWx3YXlzIG9mZlwiOiBcImFsd2F5cyBvZmZcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlSGlnaGxpZ2h0R2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlSGlnaGxpZ2h0R2xvYmFsID0gdmFsdWUgYXMgKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdMaW5lIEhpZ2hsaWdodCBDb2xvcicpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGhpZ2hsaWdodGVkIGxpbmUuIE5vdGUgdGhhdCB0aGUgZ2l2ZW4gY29sb3Igd2lsbCBiZSBhcHBsaWVkIHdpdGggMC4yIG9wYWNpdHkuJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmhpZ2hsaWdodENvbG9yKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuaGlnaGxpZ2h0Q29sb3IgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gbGFuZ3VhZ2Vcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMYW5ndWFnZSBJbmRpY2F0b3InIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIExhbmd1YWdlIEluZGljYXRvcicpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IGxhbmd1YWdlIGluZGljYXRvciB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGFuZ3VhZ2UgaW5kaWNhdG9yIHdpbGwgYWx3YXlzIGJlIHNob3duLCBidXQgd2lsbCBub3QgYmUgc2hvd24gaWYgdGhlIGxhbmd1YWdlIGluZGljYXRvciBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsYW5ndWFnZSBpbmRpY2F0b3Igd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsYW5ndWFnZSBpbmRpY2F0b3Igc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyB0cnVlXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBsYW5ndWFnZSBpbmRpY2F0b3Igd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0RlZmF1bHQgTGFuZ3VhZ2UnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBkZWZhdWx0IGxhbmd1YWdlIG5hbWUgb2YgdGhlIGNvZGUgYmxvY2sgaWYgdGhlIGxhbmd1YWdlIGlzIG5vdCBzcGVjaWZpZWQuJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMYW5ndWFnZSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMYW5ndWFnZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XG5cdFx0Ly8gY29weSBidXR0b25cblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdDb3B5IEJ1dHRvbicgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgQ29weSBCdXR0b24nKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmFsd2F5cyBvbjwvYj4gOiBjb3B5IGJ1dHRvbiB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogY29weSBidXR0b24gd2lsbCBhbHdheXMgYmUgc2hvd24sIGJ1dCB3aWxsIG5vdCBiZSBzaG93biBpZiB0aGUgY29weSBidXR0b24gc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyBmYWxzZVxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogY29weSBidXR0b24gd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBjb3B5IGJ1dHRvbiBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIHRydWVcblx0XHRcdFx0LSA8Yj5hbHdheXMgb2ZmPC9iPiA6IGNvcHkgYnV0dG9uIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlQ29weUJ0bkdsb2JhbCA9IHZhbHVlIGFzIChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gcHJvbXB0XG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiAnUHJvbXB0JyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBQcm9tcHQnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmFsd2F5cyBvbjwvYj4gOiBwcm9tcHQgd2lsbCBhbHdheXMgYmUgc2hvd25cblx0XHRcdFx0LSA8Yj5kZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkPC9iPiA6IHByb21wdCB3aWxsIGFsd2F5cyBiZSBzaG93biwgYnV0IHdpbGwgbm90IGJlIHNob3duIGlmIHRoZSBwcm9tcHQgc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyBmYWxzZVxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogcHJvbXB0IHdpbGwgb25seSBiZSBzaG93biBpZiB0aGUgcHJvbXB0IHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogcHJvbXB0IHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1Byb21wdGluZyBMYW5ndWFnZXMnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBsYW5ndWFnZXMgdGhhdCB3aWxsIGJlIHByb21wdGVkIGJ5IGRlZmF1bHQuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSBsYW5ndWFnZXMgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggZW50ZXJzLicpXG5cdFx0XHQuYWRkVGV4dEFyZWEodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvbXB0aW5nTGFuZ3VhZ2VzLmpvaW4oXCJcXG5cIikpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBsaW5lcyA9IHZhbHVlLnNwbGl0KFwiXFxuXCIpLmZpbHRlcihsaW5lID0+IGxpbmUudHJpbSgpICE9PSBcIlwiKTtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnByb21wdGluZ0xhbmd1YWdlcyA9IGxpbmVzO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiRGVmYXVsdCBQcm9tcHRcIilcblx0XHRcdC5zZXREZXNjKFwiVGhlIGRlZmF1bHQgcHJvbXB0IG9mIHRoZSBiYXNoIGNvZGUgYmxvY2suXCIpXG5cdFx0XHQuYWRkVGV4dCh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UHJvbXB0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdFByb21wdCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyByZXN1bHRcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdSZXN1bHQnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIFJlc3VsdCcpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+ZW5hYmxlPC9iPiA6IHRyZWF0IHRoZSBjb2RlIGJsb2NrIHN0YXJ0cyBsaWtlIFxcYFxcYFxcYFxcYHJlc3VsdFxcYCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBhZGphY2VudCBwcmV2aW91cyBjb2RlIGJsb2NrXG5cdFx0XHRcdC0gPGI+ZGlzYWJsZTwvYj4gOiB0cmVhdCB0aGUgY29kZSBibG9jayB3aXRoIFxcYHJlc3VsdFxcYCBhcyBpdHMgbGFuZ3VhZ2UgbmFtZSBhcyBhIG5vcm1hbCBjb2RlIGJsb2NrYCkpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJlbmFibGVcIjogXCJlbmFibGVcIixcblx0XHRcdFx0XHRcImRpc2FibGVcIjogXCJkaXNhYmxlXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVJlc3VsdEdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVJlc3VsdEdsb2JhbCA9IHZhbHVlIGFzIChcImVuYWJsZVwiIHwgXCJkaXNhYmxlXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiRGVmYXVsdCBSZXN1bHQgUHJvbXB0XCIpXG5cdFx0XHQuc2V0RGVzYyhcIlRoZSBkZWZhdWx0IHByb21wdCBvZiB0aGUgcmVzdWx0IGNvZGUgYmxvY2suXCIpXG5cdFx0XHQuYWRkVGV4dCh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UmVzdWx0UHJvbXB0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdFJlc3VsdFByb21wdCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBmb3IgZGV2ZWxvcGVyc1xuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0RldmVsb3BlcnMnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVidWcgTW9kZScpXG5cdFx0XHQuc2V0RGVzYygnU2hvdyBsb2dzIGluIHRoZSBjb25zb2xlLicpXG5cdFx0XHQuYWRkVG9nZ2xlKHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlYnVnTW9kZSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1Z01vZGUgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHR9XG59IiwgImltcG9ydCB7IE1hcmtkb3duVmlldyB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHR5cGUgeyBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LCBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgSEtDb2RlQmxvY2tQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xuaW1wb3J0IHR5cGUgeyBIS0NvZGVCbG9ja1NldHRpbmdzIH0gZnJvbSBcIi4vSEtDb2RlQmxvY2tTZXR0aW5nc1wiO1xuXG5jb25zdCBSRUdFWCA9IHtcbiAgVElUTEU6IC9cXHN0aXRsZTooPzonKC4qPyknfFwiKC4qPylcIilcXHMvLFxuICBDT0xMQVBTSUJMRV9TSU1QTEU6IC9cXHNjb2xsYXBzaWJsZVxccy8sXG4gIENPTExBUFNJQkxFX0NPTVBMSUNBVEU6IC9cXHNjb2xsYXBzaWJsZToodHJ1ZXxmYWxzZSlcXHMvLFxuICBMSU5FTk9TX1NJTVBMRTogL1xcc2xpbmVub3NcXHMvLFxuICBMSU5FTk9TX0NPTVBMSUNBVEU6IC9cXHNsaW5lbm9zOih0cnVlfGZhbHNlfCgtezAsMX1cXGQrKSlcXHMvLFxuICBISUdITElHSFQ6IC9cXHNoaWdobGlnaHQ6KD86JyguKj8pJ3xcIiguKj8pXCIpXFxzLyxcbiAgTEFOR1VBR0VfRlJPTV9DTEFTUzogL15sYW5ndWFnZS0oXFx3KykkLyxcbiAgTEFOR1VBR0VfU0lNUExFOiAvXFxzbGFuZ3VhZ2VcXHMvLFxuICBMQU5HVUFHRV9DT01QTElDQVRFOiAvXFxzbGFuZ3VhZ2U6KHRydWV8ZmFsc2V8JyguKj8pJ3xcIiguKj8pXCIpXFxzLyxcbiAgQ09QWUJUTl9TSU1QTEU6IC9cXHNjb3B5YnRuXFxzLyxcbiAgQ09QWUJUTl9DT01QTElDQVRFOiAvXFxzY29weWJ0bjoodHJ1ZXxmYWxzZSlcXHMvLFxuICBSRVNVTFQ6IC9eYGBgcmVzdWx0XFxzLyxcbiAgUFJPTVBUX1NJTVBMRTogL1xcc3Byb21wdFxccy8sXG4gIFBST01QVF9DT01QTElDQVRFOiAvXFxzcHJvbXB0Oih0cnVlfGZhbHNlfCcoLio/KSd8XCIoLio/KVwiKVxccy8sXG4gIE5VTUJFUjogL14tezAsMX1cXGQrJC8sXG59XG5cbmZ1bmN0aW9uIGdldE1ldGEoXG4gIHZpZXc6IE1hcmtkb3duVmlldyxcbiAgZWxlbV9jb2RlOiBIVE1MRWxlbWVudCxcbiAgZWxlbV9jb2RlX2lkeDogbnVtYmVyLFxuICBzZWN0aW9uX2NvZGU6IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uLFxuICBzZXR0aW5nczogSEtDb2RlQmxvY2tTZXR0aW5nc1xuKToge1xuICBpc0Vycm9yOiBib29sZWFuLFxuICBsaW5lU3RhcnRJblNlY3Rpb246IG51bWJlcixcbiAgbGluZUVuZEluU2VjdGlvbjogbnVtYmVyLFxuICBzaG93VGl0bGU6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgdGl0bGU6IHN0cmluZyxcbiAgaXNDb2xsYXBzaWJsZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBzaG93TGluZW5vczogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBsaW5lbm9zU3RhcnQ6IG51bWJlcixcbiAgbGluZW5vc051bTogbnVtYmVyLFxuICBzaG93SGlnaGxpZ2h0OiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gIGhpZ2hsaWdodExpbmVzOiBudW1iZXJbXSxcbiAgc2hvd0xhbmd1YWdlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gIGxhbmd1YWdlOiBzdHJpbmcsXG4gIHNob3dDb3B5QnRuOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gIGlzUmVzdWx0OiBib29sZWFuLFxuICByZXN1bHRQcm9tcHQ6IHN0cmluZyxcbiAgc2hvd1Byb21wdDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBwcm9tcHQ6IHN0cmluZ1xufSB7XG4gIGNvbnN0IHJldHVybl92YWx1ZToge1xuICAgIGlzRXJyb3I6IGJvb2xlYW4sXG4gICAgbGluZVN0YXJ0SW5TZWN0aW9uOiBudW1iZXIsXG4gICAgbGluZUVuZEluU2VjdGlvbjogbnVtYmVyLFxuICAgIHNob3dUaXRsZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgaXNDb2xsYXBzaWJsZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICAgIHNob3dMaW5lbm9zOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgbGluZW5vc1N0YXJ0OiBudW1iZXIsXG4gICAgbGluZW5vc051bTogbnVtYmVyLFxuICAgIHNob3dIaWdobGlnaHQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgICBoaWdobGlnaHRMaW5lczogbnVtYmVyW10sXG4gICAgc2hvd0xhbmd1YWdlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgbGFuZ3VhZ2U6IHN0cmluZyxcbiAgICBzaG93Q29weUJ0bjogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICAgIGlzUmVzdWx0OiBib29sZWFuLFxuICAgIHJlc3VsdFByb21wdDogc3RyaW5nLFxuICAgIHNob3dQcm9tcHQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgICBwcm9tcHQ6IHN0cmluZ1xuICB9ID0ge1xuICAgIGlzRXJyb3I6IGZhbHNlLFxuICAgIGxpbmVTdGFydEluU2VjdGlvbjogLTEsXG4gICAgbGluZUVuZEluU2VjdGlvbjogLTEsXG4gICAgc2hvd1RpdGxlOiB1bmRlZmluZWQsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgaXNDb2xsYXBzaWJsZTogdW5kZWZpbmVkLFxuICAgIHNob3dMaW5lbm9zOiB1bmRlZmluZWQsXG4gICAgbGluZW5vc1N0YXJ0OiBzZXR0aW5ncy5kZWZhdWx0TGluZW5vc1N0YXJ0LFxuICAgIGxpbmVub3NOdW06IDAsXG4gICAgc2hvd0hpZ2hsaWdodDogdW5kZWZpbmVkLFxuICAgIGhpZ2hsaWdodExpbmVzOiBbXSxcbiAgICBzaG93TGFuZ3VhZ2U6IHVuZGVmaW5lZCxcbiAgICBsYW5ndWFnZTogc2V0dGluZ3MuZGVmYXVsdExhbmd1YWdlLFxuICAgIHNob3dDb3B5QnRuOiB1bmRlZmluZWQsXG4gICAgaXNSZXN1bHQ6IGZhbHNlLFxuICAgIHJlc3VsdFByb21wdDogc2V0dGluZ3MuZGVmYXVsdFJlc3VsdFByb21wdCxcbiAgICBzaG93UHJvbXB0OiB1bmRlZmluZWQsXG4gICAgcHJvbXB0OiBzZXR0aW5ncy5kZWZhdWx0UHJvbXB0XG4gIH1cblxuICBsZXQgbWFya2VyX2NvdW50ID0gMDtcbiAgZm9yIChsZXQgaSA9IHNlY3Rpb25fY29kZS5saW5lU3RhcnQ7IGkgPD0gc2VjdGlvbl9jb2RlLmxpbmVFbmQ7IGkrKykge1xuICAgIGNvbnN0IGxpbmUgPSB2aWV3LmVkaXRvci5nZXRMaW5lKGkpO1xuICAgIGlmIChsaW5lLnRyaW0oKS5zdGFydHNXaXRoKFwiYGBgXCIpKSBtYXJrZXJfY291bnQrKztcblxuICAgIGlmIChyZXR1cm5fdmFsdWUubGluZVN0YXJ0SW5TZWN0aW9uID09PSAtMSAmJiBtYXJrZXJfY291bnQgPT09IGVsZW1fY29kZV9pZHggKiAyICsgMSkge1xuICAgICAgcmV0dXJuX3ZhbHVlLmxpbmVTdGFydEluU2VjdGlvbiA9IGk7XG4gICAgfVxuXG4gICAgaWYgKHJldHVybl92YWx1ZS5saW5lRW5kSW5TZWN0aW9uID09PSAtMSAmJiBtYXJrZXJfY291bnQgPT09IGVsZW1fY29kZV9pZHggKiAyICsgMikge1xuICAgICAgcmV0dXJuX3ZhbHVlLmxpbmVFbmRJblNlY3Rpb24gPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHJldHVybl92YWx1ZS5saW5lU3RhcnRJblNlY3Rpb24gPCAwIHx8IHJldHVybl92YWx1ZS5saW5lRW5kSW5TZWN0aW9uIDwgMCB8fCByZXR1cm5fdmFsdWUubGluZVN0YXJ0SW5TZWN0aW9uID49IHJldHVybl92YWx1ZS5saW5lRW5kSW5TZWN0aW9uKSB7XG4gICAgcmV0dXJuX3ZhbHVlLmlzRXJyb3IgPSB0cnVlO1xuICAgIHJldHVybiByZXR1cm5fdmFsdWU7XG4gIH1cblxuICBjb25zdCBmaXJzdGxpbmUgPSB2aWV3LmVkaXRvci5nZXRMaW5lKHJldHVybl92YWx1ZS5saW5lU3RhcnRJblNlY3Rpb24pLnRyaW0oKSArIFwiIFwiOyAvLyBhZGQgYSBzcGFjZSB0byB0aGUgZW5kIG9mIHRoZSBsaW5lIHRvIG1ha2Ugc3VyZSB0aGUgcmVnZXggd29ya3NcblxuICAvLyB0aXRsZVxuICBjb25zdCByZWdleFJlc3VsdF90aXRsZSA9IFJFR0VYLlRJVExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X3RpdGxlKSB7XG4gICAgcmV0dXJuX3ZhbHVlLnNob3dUaXRsZSA9IHRydWU7XG4gICAgcmV0dXJuX3ZhbHVlLnRpdGxlID0gcmVnZXhSZXN1bHRfdGl0bGVbMV0gfHwgcmVnZXhSZXN1bHRfdGl0bGVbMl07XG4gIH1cblxuICAvLyBjb2xsYXBzaWJsZVxuICBjb25zdCByZWdleFJlc3VsdF9jb2xsYXBzaWJsZVNpbXBsZSA9IFJFR0VYLkNPTExBUFNJQkxFX1NJTVBMRS5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2NvbGxhcHNpYmxlQ29tcGxpY2F0ZSA9IFJFR0VYLkNPTExBUFNJQkxFX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfY29sbGFwc2libGVTaW1wbGUpIHtcbiAgICByZXR1cm5fdmFsdWUuaXNDb2xsYXBzaWJsZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfY29sbGFwc2libGVDb21wbGljYXRlKSB7XG4gICAgaWYgKHJlZ2V4UmVzdWx0X2NvbGxhcHNpYmxlQ29tcGxpY2F0ZVsxXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHJldHVybl92YWx1ZS5pc0NvbGxhcHNpYmxlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2NvbGxhcHNpYmxlQ29tcGxpY2F0ZVsxXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICByZXR1cm5fdmFsdWUuaXNDb2xsYXBzaWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGxpbmVub3NcbiAgcmV0dXJuX3ZhbHVlLmxpbmVub3NOdW0gPSByZXR1cm5fdmFsdWUubGluZUVuZEluU2VjdGlvbiAtIHJldHVybl92YWx1ZS5saW5lU3RhcnRJblNlY3Rpb24gLSAxO1xuICBjb25zdCByZWdleFJlc3VsdF9saW5lbm9zU2ltcGxlID0gUkVHRVguTElORU5PU19TSU1QTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBjb25zdCByZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZSA9IFJFR0VYLkxJTkVOT1NfQ09NUExJQ0FURS5leGVjKGZpcnN0bGluZSk7XG4gIGlmIChyZWdleFJlc3VsdF9saW5lbm9zU2ltcGxlKSB7XG4gICAgcmV0dXJuX3ZhbHVlLnNob3dMaW5lbm9zID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZSkge1xuICAgIGlmIChyZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZVsxXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHJldHVybl92YWx1ZS5zaG93TGluZW5vcyA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZVsxXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICByZXR1cm5fdmFsdWUuc2hvd0xpbmVub3MgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuX3ZhbHVlLnNob3dMaW5lbm9zID0gdHJ1ZTtcbiAgICAgIHJldHVybl92YWx1ZS5saW5lbm9zU3RhcnQgPSBwYXJzZUludChyZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZVsyXSkgfHwgMTtcbiAgICB9XG4gIH1cblxuICAvLyBoaWdobGlnaHRcbiAgY29uc3QgcmVnZXhSZXN1bHRfaGlnaGxpZ2h0ID0gUkVHRVguSElHSExJR0hULmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X2hpZ2hsaWdodCkge1xuICAgIHJldHVybl92YWx1ZS5zaG93SGlnaGxpZ2h0ID0gdHJ1ZTtcbiAgICBjb25zdCBoaWdobGlnaHRMaW5lc19zdHIgPSByZWdleFJlc3VsdF9oaWdobGlnaHRbMV0gfHwgcmVnZXhSZXN1bHRfaGlnaGxpZ2h0WzJdO1xuICAgIGxldCBoaWdobGlnaHRMaW5lcyA9IGhpZ2hsaWdodExpbmVzX3N0ci5zcGxpdChcIixcIikubWFwKChpdGVtKSA9PiB7XG4gICAgICBpdGVtID0gaXRlbS50cmltKCk7XG5cbiAgICAgIGlmIChSRUdFWC5OVU1CRVIudGVzdChpdGVtKSkgcmV0dXJuIHBhcnNlSW50KGl0ZW0pO1xuXG4gICAgICBjb25zdCBtdWx0aXBsZV9saW5lcyA9IGl0ZW0uc3BsaXQoXCItXCIpO1xuICAgICAgaWYgKG11bHRpcGxlX2xpbmVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCBzdGFydCA9IHBhcnNlSW50KG11bHRpcGxlX2xpbmVzWzBdLnRyaW0oKSk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHBhcnNlSW50KG11bHRpcGxlX2xpbmVzWzFdLnRyaW0oKSk7XG5cbiAgICAgICAgaWYgKCFpc05hTihzdGFydCkgJiYgIWlzTmFOKGVuZCkpIHtcbiAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogZW5kIC0gc3RhcnQgKyAxIH0sIChfLCBpKSA9PiBpICsgc3RhcnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOYU47XG4gICAgfSkuZmxhdCgpLmZpbHRlcigoaXRlbSkgPT4gIWlzTmFOKGl0ZW0pKTtcblxuICAgIGlmIChoaWdobGlnaHRMaW5lcy5zb21lKChsaW5lKSA9PiBpc05hTihsaW5lKSkpIHtcbiAgICAgIC8vIGlmIGFueSBlbGVtZW50IGlzIG5hbiwgdGhlbiBzZXQgc2hvd0hpZ2hsaWdodCB0byBmYWxzZVxuICAgICAgcmV0dXJuX3ZhbHVlLnNob3dIaWdobGlnaHQgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm5fdmFsdWUuaGlnaGxpZ2h0TGluZXMgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXNlIG9ubHkgdmFsaWQgbGluZSBudW1iZXJzXG4gICAgICByZXR1cm5fdmFsdWUuaGlnaGxpZ2h0TGluZXMgPSBoaWdobGlnaHRMaW5lcy5maWx0ZXIoXG4gICAgICAgIChsaW5lKSA9PiBsaW5lID49IHJldHVybl92YWx1ZS5saW5lbm9zU3RhcnQgJiYgbGluZSA8IHJldHVybl92YWx1ZS5saW5lbm9zU3RhcnQgKyByZXR1cm5fdmFsdWUubGluZW5vc051bVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBsYW5ndWFnZVxuICBlbGVtX2NvZGUuY2xhc3NMaXN0LmZvckVhY2goKGNsYXNzTmFtZSkgPT4ge1xuICAgIGNvbnN0IHJlZ2V4UmVzdWx0X2xhbmd1YWdlRnJvbUNsYXNzID0gUkVHRVguTEFOR1VBR0VfRlJPTV9DTEFTUy5leGVjKGNsYXNzTmFtZS50cmltKCkpO1xuICAgIGlmIChyZWdleFJlc3VsdF9sYW5ndWFnZUZyb21DbGFzcykge1xuICAgICAgcmV0dXJuX3ZhbHVlLmxhbmd1YWdlID0gcmVnZXhSZXN1bHRfbGFuZ3VhZ2VGcm9tQ2xhc3NbMV07XG4gICAgfVxuICB9KTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfbGFuZ3VhZ2VTaW1wbGUgPSBSRUdFWC5MQU5HVUFHRV9TSU1QTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBjb25zdCByZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGUgPSBSRUdFWC5MQU5HVUFHRV9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlU2ltcGxlKSB7XG4gICAgcmV0dXJuX3ZhbHVlLnNob3dMYW5ndWFnZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlKSB7XG4gICAgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZVsxXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHJldHVybl92YWx1ZS5zaG93TGFuZ3VhZ2UgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHJldHVybl92YWx1ZS5zaG93TGFuZ3VhZ2UgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuX3ZhbHVlLnNob3dMYW5ndWFnZSA9IHRydWU7XG4gICAgICByZXR1cm5fdmFsdWUubGFuZ3VhZ2UgPSByZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGVbMl0gfHwgcmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzNdO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvcHkgYnV0dG9uXG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2NvcHlCdG5TaW1wbGUgPSBSRUdFWC5DT1BZQlROX1NJTVBMRS5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2NvcHlCdG5Db21wbGljYXRlID0gUkVHRVguQ09QWUJUTl9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X2NvcHlCdG5TaW1wbGUpIHtcbiAgICByZXR1cm5fdmFsdWUuc2hvd0NvcHlCdG4gPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2NvcHlCdG5Db21wbGljYXRlKSB7XG4gICAgaWYgKHJlZ2V4UmVzdWx0X2NvcHlCdG5Db21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgcmV0dXJuX3ZhbHVlLnNob3dDb3B5QnRuID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2NvcHlCdG5Db21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHJldHVybl92YWx1ZS5zaG93Q29weUJ0biA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb21wdFxuICBjb25zdCByZWdleFJlc3VsdF9wcm9tcHRTaW1wbGUgPSBSRUdFWC5QUk9NUFRfU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZSA9IFJFR0VYLlBST01QVF9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X3Byb21wdFNpbXBsZSkge1xuICAgIHJldHVybl92YWx1ZS5zaG93UHJvbXB0ID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlKSB7XG4gICAgaWYgKHJlZ2V4UmVzdWx0X3Byb21wdENvbXBsaWNhdGVbMV0gPT09IFwidHJ1ZVwiKSB7XG4gICAgICByZXR1cm5fdmFsdWUuc2hvd1Byb21wdCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHJldHVybl92YWx1ZS5zaG93UHJvbXB0ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybl92YWx1ZS5zaG93UHJvbXB0ID0gdHJ1ZTtcbiAgICAgIHJldHVybl92YWx1ZS5wcm9tcHQgPSByZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlWzJdIHx8IHJlZ2V4UmVzdWx0X3Byb21wdENvbXBsaWNhdGVbM107XG4gICAgfVxuICB9XG5cbiAgLy8gcmVzdWx0XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X3Jlc3VsdCA9IFJFR0VYLlJFU1VMVC5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0UHJvbXB0X3Jlc3VsdCA9IFJFR0VYLlBST01QVF9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X3Jlc3VsdCkge1xuICAgIHJldHVybl92YWx1ZS5pc1Jlc3VsdCA9IHRydWU7XG5cbiAgICAvLyBvdmVycmlkZSBvdGhlciBtZXRhIGRhdGEgOiBvbmx5IGxpbmVub3MsIGhpZ2hsaWdodCBhcmUgYXZhaWxhYmxlXG4gICAgcmV0dXJuX3ZhbHVlLnNob3dUaXRsZSA9IGZhbHNlO1xuICAgIHJldHVybl92YWx1ZS5zaG93TGFuZ3VhZ2UgPSBmYWxzZTtcbiAgICByZXR1cm5fdmFsdWUuc2hvd0NvcHlCdG4gPSBmYWxzZTtcbiAgICByZXR1cm5fdmFsdWUuc2hvd1Byb21wdCA9IGZhbHNlO1xuXG4gICAgaWYgKHJlZ2V4UmVzdWx0UHJvbXB0X3Jlc3VsdCkge1xuICAgICAgcmV0dXJuX3ZhbHVlLnJlc3VsdFByb21wdCA9IHJlZ2V4UmVzdWx0UHJvbXB0X3Jlc3VsdFsyXSB8fCByZWdleFJlc3VsdFByb21wdF9yZXN1bHRbM107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldHVybl92YWx1ZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIEhLQ29kZUJsb2NrUHJvY2Vzc29yKFxuICBlbDogSFRNTEVsZW1lbnQsXG4gIGNvbnRleHQ6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsXG4gIHBsdWdpbjogSEtDb2RlQmxvY2tQbHVnaW5cbikge1xuICBjb25zdCBzZXR0aW5ncyA9IHBsdWdpbi5zZXR0aW5ncztcblxuICBjb25zdCB2aWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gIGlmICghdmlldykgcmV0dXJuO1xuXG4gIC8qIE5vdGU6XG4gIC8vIC0gZ2V0IGFsbCBjb2RlIGJsb2NrcyA6IG9ic2lkaWFuIG1hcmtkb3duIHBhcnNlciBzb21ldGltZXMgcGFzcyBtdWx0aXBsZSBjb2RlIGJsb2Nrc1xuICAvLyAtIHNraXAgZnJvbnQgbWF0dGVyXG4gICovXG4gIGNvbnN0IGVsZW1fY29kZXM6IE5vZGVMaXN0T2Y8RWxlbWVudD4gPSBlbC5xdWVyeVNlbGVjdG9yQWxsKFwicHJlOm5vdCguZnJvbnRtYXR0ZXIpID4gY29kZVwiKTtcbiAgaWYgKGVsZW1fY29kZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgZWxlbV9jb2Rlcy5mb3JFYWNoKChlbGVtX2NvZGU6IEhUTUxFbGVtZW50LCBlbGVtX2NvZGVfaWR4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBlbGVtX3ByZTogKEhUTUxFbGVtZW50IHwgbnVsbCkgPSBlbGVtX2NvZGUucGFyZW50RWxlbWVudDtcbiAgICBpZiAoIWVsZW1fcHJlKSByZXR1cm47XG5cbiAgICBjb25zdCBlbGVtX3ByZV9wYXJlbnQ6IChIVE1MRWxlbWVudCB8IG51bGwpID0gZWxlbV9wcmUucGFyZW50RWxlbWVudDtcbiAgICBpZiAoIWVsZW1fcHJlX3BhcmVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZWxlbV9jb3B5QnRuOiAoSFRNTEVsZW1lbnQgfCBudWxsKSA9IGVsZW1fcHJlLnF1ZXJ5U2VsZWN0b3IoXCIuY29weS1jb2RlLWJ1dHRvblwiKTtcbiAgICBpZiAoIWVsZW1fY29weUJ0bikgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2VjdGlvbl9jb2RlOiAoTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24gfCBudWxsKSA9IGNvbnRleHQuZ2V0U2VjdGlvbkluZm8oZWxlbV9jb2RlKTtcbiAgICBpZiAoIXNlY3Rpb25fY29kZSkgcmV0dXJuO1xuXG4gICAgLy8gZ2V0IG1ldGFkYXRhXG4gICAgY29uc3Qge1xuICAgICAgaXNFcnJvcixcbiAgICAgIGxpbmVTdGFydEluU2VjdGlvbixcbiAgICAgIGxpbmVFbmRJblNlY3Rpb24sXG4gICAgICBzaG93VGl0bGUsXG4gICAgICB0aXRsZSxcbiAgICAgIGlzQ29sbGFwc2libGUsXG4gICAgICBzaG93TGluZW5vcyxcbiAgICAgIGxpbmVub3NTdGFydCxcbiAgICAgIGxpbmVub3NOdW0sXG4gICAgICBzaG93SGlnaGxpZ2h0LFxuICAgICAgaGlnaGxpZ2h0TGluZXMsXG4gICAgICBzaG93TGFuZ3VhZ2UsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgIHNob3dDb3B5QnRuLFxuICAgICAgaXNSZXN1bHQsXG4gICAgICByZXN1bHRQcm9tcHQsXG4gICAgICBzaG93UHJvbXB0LFxuICAgICAgcHJvbXB0LFxuICAgIH06IHtcbiAgICAgIGlzRXJyb3I6IGJvb2xlYW4sXG4gICAgICBsaW5lU3RhcnRJblNlY3Rpb246IG51bWJlcixcbiAgICAgIGxpbmVFbmRJblNlY3Rpb246IG51bWJlcixcbiAgICAgIHNob3dUaXRsZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICAgICAgdGl0bGU6IHN0cmluZyxcbiAgICAgIGlzQ29sbGFwc2libGU6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgICAgIHNob3dMaW5lbm9zOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgICBsaW5lbm9zU3RhcnQ6IG51bWJlcixcbiAgICAgIGxpbmVub3NOdW06IG51bWJlcixcbiAgICAgIHNob3dIaWdobGlnaHQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgICAgIGhpZ2hsaWdodExpbmVzOiBudW1iZXJbXSxcbiAgICAgIHNob3dMYW5ndWFnZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICAgICAgbGFuZ3VhZ2U6IHN0cmluZyxcbiAgICAgIHNob3dDb3B5QnRuOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgICBpc1Jlc3VsdDogYm9vbGVhbixcbiAgICAgIHJlc3VsdFByb21wdDogc3RyaW5nLFxuICAgICAgc2hvd1Byb21wdDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICAgICAgcHJvbXB0OiBzdHJpbmdcbiAgICB9ID0gZ2V0TWV0YSh2aWV3LCBlbGVtX2NvZGUsIGVsZW1fY29kZV9pZHgsIHNlY3Rpb25fY29kZSwgc2V0dGluZ3MpO1xuICAgIGlmIChpc0Vycm9yKSByZXR1cm47XG4gICAgaWYgKHNldHRpbmdzLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICBpc0Vycm9yOiBpc0Vycm9yLFxuICAgICAgICBsaW5lU3RhcnRJblNlY3Rpb246IGxpbmVTdGFydEluU2VjdGlvbixcbiAgICAgICAgbGluZUVuZEluU2VjdGlvbjogbGluZUVuZEluU2VjdGlvbixcbiAgICAgICAgc2hvd1RpdGxlOiBzaG93VGl0bGUsXG4gICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgaXNDb2xsYXBzaWJsZTogaXNDb2xsYXBzaWJsZSxcbiAgICAgICAgc2hvd0xpbmVub3M6IHNob3dMaW5lbm9zLFxuICAgICAgICBsaW5lbm9zU3RhcnQ6IGxpbmVub3NTdGFydCxcbiAgICAgICAgbGluZW5vc051bTogbGluZW5vc051bSxcbiAgICAgICAgc2hvd0hpZ2hsaWdodDogc2hvd0hpZ2hsaWdodCxcbiAgICAgICAgaGlnaGxpZ2h0TGluZXM6IGhpZ2hsaWdodExpbmVzLFxuICAgICAgICBzaG93TGFuZ3VhZ2U6IHNob3dMYW5ndWFnZSxcbiAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlLFxuICAgICAgICBzaG93Q29weUJ0bjogc2hvd0NvcHlCdG4sXG4gICAgICAgIGlzUmVzdWx0OiBpc1Jlc3VsdCxcbiAgICAgICAgcmVzdWx0UHJvbXB0OiByZXN1bHRQcm9tcHQsXG4gICAgICAgIHNob3dQcm9tcHQ6IHNob3dQcm9tcHQsXG4gICAgICAgIHByb21wdDogcHJvbXB0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgSFRNTCBlbGVtZW50c1xuICAgIGNvbnN0IGVsZW1fZGl2OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZWxlbV9wcmVfcGFyZW50LnJlcGxhY2VDaGlsZChlbGVtX2RpdiwgZWxlbV9wcmUpO1xuICAgIGVsZW1fZGl2LmFwcGVuZENoaWxkKGVsZW1fcHJlKTtcblxuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2tcIik7XG4gICAgZWxlbV9jb2RlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29kZVwiKTtcbiAgICBlbGVtX2NvcHlCdG4ucmVtb3ZlKCk7IC8vIHJlbW92ZSB0aGUgb3JpZ2luYWwgY29weSBidXR0b24gYXMgZGVmYXVsdFxuXG4gICAgbGV0IGVsZW1fdGl0bGU6IChIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHNldHRpbmdzLnVzZVRpdGxlR2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd1RpdGxlID09PSB0cnVlKSkge1xuICAgICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LXRpdGxlXCIpO1xuXG4gICAgICBlbGVtX3RpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGVsZW1fdGl0bGUuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay10aXRsZVwiKTtcbiAgICAgIGVsZW1fdGl0bGUuaW5uZXJIVE1MID0gdGl0bGU7XG4gICAgICBlbGVtX2Rpdi5pbnNlcnRCZWZvcmUoZWxlbV90aXRsZSwgZWxlbV9wcmUpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChzZXR0aW5ncy51c2VDb2xsYXBzaWJsZUdsb2JhbCA9PT0gXCJhbHdheXMgb25cIikgfHxcbiAgICAgIChzZXR0aW5ncy51c2VDb2xsYXBzaWJsZUdsb2JhbCA9PT0gXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgJiYgKGlzQ29sbGFwc2libGUgPT09IHVuZGVmaW5lZCB8fCBpc0NvbGxhcHNpYmxlID09PSB0cnVlKSkgfHxcbiAgICAgIChzZXR0aW5ncy51c2VDb2xsYXBzaWJsZUdsb2JhbCA9PT0gXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgJiYgKGlzQ29sbGFwc2libGUgPT09IHRydWUpKVxuICAgICkge1xuICAgICAgaWYgKGVsZW1fdGl0bGUpIHtcbiAgICAgICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1jb2xsYXBzaWJsZVwiKTtcblxuICAgICAgICBpZiAoc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlID09PSBcImNvbGxhcHNlXCIpIHtcbiAgICAgICAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWNvbGxhcHNlZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1fdGl0bGUuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZWxlbV9kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImhrLWNvZGVibG9jay1jb2xsYXBzZWRcIik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGVsZW1fY29sbGFwc2VCdG5zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZWxlbV9jb2xsYXBzZUJ0bnMuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1jb2xsYXBzZS1idG5zXCIpO1xuXG4gICAgICAgIGNvbnN0IGVsZW1fY29sbGFwc2VCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBlbGVtX2NvbGxhcHNlQnRuLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29sbGFwc2UtYnRuXCIsIFwiaGstY29kZWJsb2NrLWNvbGxhcHNlZC1idG5cIik7XG4gICAgICAgIGVsZW1fY29sbGFwc2VCdG4uaW5uZXJIVE1MID0gYDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMCAxOWExIDEgMCAwIDEtLjY0LS4yMyAxIDEgMCAwIDEtLjEzLTEuNDFMMTMuNzEgMTIgOS4zOSA2LjYzYTEgMSAwIDAgMSAuMTUtMS40MSAxIDEgMCAwIDEgMS40Ni4xNWw0LjgzIDZhMSAxIDAgMCAxIDAgMS4yN2wtNSA2QTEgMSAwIDAgMSAxMCAxOXpcIi8+XG4gICAgICA8L3N2Zz5gO1xuICAgICAgICBlbGVtX2NvbGxhcHNlQnRucy5hcHBlbmRDaGlsZChlbGVtX2NvbGxhcHNlQnRuKTtcblxuICAgICAgICBjb25zdCBlbGVtX2V4cGFuZEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGVsZW1fZXhwYW5kQnRuLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29sbGFwc2UtYnRuXCIsIFwiaGstY29kZWJsb2NrLWV4cGFuZGVkLWJ0blwiKTtcbiAgICAgICAgZWxlbV9leHBhbmRCdG4uaW5uZXJIVE1MID0gYDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMiAxNmExIDEgMCAwIDEtLjY0LS4yM2wtNi01YTEgMSAwIDEgMSAxLjI4LTEuNTRMMTIgMTMuNzFsNS4zNi00LjMyYTEgMSAwIDAgMSAxLjQxLjE1IDEgMSAwIDAgMS0uMTQgMS40NmwtNiA0LjgzQTEgMSAwIDAgMSAxMiAxNnpcIi8+XG4gICAgICA8L3N2Zz5gO1xuICAgICAgICBlbGVtX2NvbGxhcHNlQnRucy5hcHBlbmRDaGlsZChlbGVtX2V4cGFuZEJ0bik7XG5cbiAgICAgICAgZWxlbV90aXRsZS5wcmVwZW5kKGVsZW1fY29sbGFwc2VCdG5zKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIGlmIChcbiAgICAgIChzZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsID09PSBcImFsd2F5cyBvblwiKSB8fFxuICAgICAgKHNldHRpbmdzLnVzZUxpbmVub3NHbG9iYWwgPT09IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93TGluZW5vcyA9PT0gdW5kZWZpbmVkIHx8IHNob3dMaW5lbm9zID09PSB0cnVlKSkgfHxcbiAgICAgIChzZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0xpbmVub3MgPT09IHRydWUpKVxuICAgICkge1xuICAgICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LWxpbmVub3NcIik7XG5cbiAgICAgIGNvbnN0IGVsZW1fbGluZW5vcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtX2xpbmVub3MuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1saW5lbm9zXCIpO1xuICAgICAgZWxlbV9saW5lbm9zLmlubmVyVGV4dCA9IEFycmF5KGxpbmVub3NOdW0pLmZpbGwoMCkubWFwKChfLCBpZHgpID0+IGlkeCArIGxpbmVub3NTdGFydCkuam9pbihcIlxcblwiKTtcbiAgICAgIGVsZW1fcHJlLmluc2VydEJlZm9yZShlbGVtX2xpbmVub3MsIGVsZW1fY29kZSk7XG5cbiAgICAgIGlmIChzZXR0aW5ncy5zaG93TGluZW5vc1NwbGl0dGVyKSB7XG4gICAgICAgIGVsZW1fbGluZW5vcy5jbGFzc0xpc3QuYWRkKFwic2hvdy1zcGxpdHRlclwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MudXNlSGlnaGxpZ2h0R2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0hpZ2hsaWdodCA9PT0gdHJ1ZSkpIHtcbiAgICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stc2hvdy1oaWdobGlnaHRcIik7XG5cbiAgICAgIGVsZW1fZGl2LnN0eWxlLnNldFByb3BlcnR5KFwiLS1oay1jb2RlYmxvY2staGlnaGxpZ2h0LWJhY2tncm91bmQtY29sb3JcIiwgc2V0dGluZ3MuaGlnaGxpZ2h0Q29sb3IpO1xuXG4gICAgICBjb25zdCBlbGVtX2hpZ2hsaWdodCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtX2hpZ2hsaWdodC5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWhpZ2hsaWdodFwiKTtcbiAgICAgIGVsZW1faGlnaGxpZ2h0LmlubmVySFRNTCA9IEFycmF5KGxpbmVub3NOdW0pLmZpbGwoMCkubWFwKChfLCBpZHgpID0+IHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKGhpZ2hsaWdodExpbmVzLmluY2x1ZGVzKGlkeCArIGxpbmVub3NTdGFydCkpIGNsYXNzTmFtZXMucHVzaChcImhpZ2hsaWdodFwiKTtcbiAgICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cImxpbmUgbGluZS0ke2lkeCArIGxpbmVub3NTdGFydH0gJHtjbGFzc05hbWVzLmpvaW4oXCIgXCIpfVwiPiA8L3NwYW4+YDtcbiAgICAgIH0pLmpvaW4oXCJcXG5cIik7XG4gICAgICBlbGVtX3ByZS5pbnNlcnRCZWZvcmUoZWxlbV9oaWdobGlnaHQsIGVsZW1fY29kZSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsID09PSBcImFsd2F5cyBvblwiKSB8fFxuICAgICAgKHNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0xhbmd1YWdlID09PSB1bmRlZmluZWQgfHwgc2hvd0xhbmd1YWdlID09PSB0cnVlKSkgfHxcbiAgICAgIChzZXR0aW5ncy51c2VMYW5ndWFnZUdsb2JhbCA9PT0gXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dMYW5ndWFnZSA9PT0gdHJ1ZSkpXG4gICAgKSB7XG4gICAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctbGFuZ3VhZ2VcIik7XG5cbiAgICAgIGNvbnN0IGVsZW1fbGFuZ3VhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZWxlbV9sYW5ndWFnZS5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWxhbmd1YWdlXCIpO1xuICAgICAgZWxlbV9sYW5ndWFnZS5pbm5lclRleHQgPSBsYW5ndWFnZTtcbiAgICAgIGVsZW1fcHJlLnByZXBlbmQoZWxlbV9sYW5ndWFnZSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHNldHRpbmdzLnVzZUNvcHlCdG5HbG9iYWwgPT09IFwiYWx3YXlzIG9uXCIpIHx8XG4gICAgICAoc2V0dGluZ3MudXNlQ29weUJ0bkdsb2JhbCA9PT0gXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dDb3B5QnRuID09PSB1bmRlZmluZWQgfHwgc2hvd0NvcHlCdG4gPT09IHRydWUpKSB8fFxuICAgICAgKHNldHRpbmdzLnVzZUNvcHlCdG5HbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93Q29weUJ0biA9PT0gdHJ1ZSkpXG4gICAgKSB7XG4gICAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctY29weWJ0blwiKTtcblxuICAgICAgZWxlbV9wcmUuYXBwZW5kQ2hpbGQoZWxlbV9jb3B5QnRuKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAoc2V0dGluZ3MudXNlUHJvbXB0R2xvYmFsID09PSBcImFsd2F5cyBvblwiICYmIHNldHRpbmdzLnByb21wdGluZ0xhbmd1YWdlcy5pbmNsdWRlcyhsYW5ndWFnZSkpIHx8XG4gICAgICAoc2V0dGluZ3MudXNlUHJvbXB0R2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiBzZXR0aW5ncy5wcm9tcHRpbmdMYW5ndWFnZXMuaW5jbHVkZXMobGFuZ3VhZ2UpICYmIChzaG93UHJvbXB0ID09PSB1bmRlZmluZWQgfHwgc2hvd1Byb21wdCA9PT0gdHJ1ZSkpIHx8XG4gICAgICAoc2V0dGluZ3MudXNlUHJvbXB0R2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd1Byb21wdCA9PT0gdHJ1ZSkpXG4gICAgKSB7XG4gICAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctcHJvbXB0XCIpO1xuXG4gICAgICBjb25zdCBlbGVtX3Byb21wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtX3Byb21wdC5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXByb21wdFwiKTtcblxuICAgICAgY29uc3QgbGluZXMgPSBlbGVtX2NvZGUuaW5uZXJUZXh0LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgZWxlbV9wcm9tcHQuaW5uZXJUZXh0ID0gQXJyYXkobGluZW5vc051bSkuZmlsbCgwKS5tYXAoKF8sIGlkeCkgPT4ge1xuICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gbGluZXMubGVuZ3RoKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbaWR4XS50cmltKCk7XG4gICAgICAgIGNvbnN0IHByZXZMaW5lID0gaWR4ID4gMCA/IGxpbmVzW2lkeCAtIDFdLnRyaW0oKSA6IFwiXCI7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIChsaW5lID09PSBcIlwiKSB8fCAvLyBjaGVjayBpZiB0aGUgbGluZSBpcyBlbXB0eVxuICAgICAgICAgIChsaW5lLnN0YXJ0c1dpdGgoXCIjXCIpKSB8fCAvLyBjaGVjayBpZiB0aGUgbGluZSBpcyBhIGNvbW1lbnRcbiAgICAgICAgICAocHJldkxpbmUuZW5kc1dpdGgoXCJcXFxcXCIpKSAvLyBjaGVjayBpZiB0aGUgbGluZSBpcyBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgcHJldmlvdXMgbGluZVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gXCIgXCIucmVwZWF0KHByb21wdC5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb21wdDtcbiAgICAgIH0pLmZpbHRlcigobGluZSkgPT4gbGluZSAhPT0gbnVsbCkuam9pbihcIlxcblwiKTtcblxuICAgICAgZWxlbV9wcmUuaW5zZXJ0QmVmb3JlKGVsZW1fcHJvbXB0LCBlbGVtX2NvZGUpO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy51c2VSZXN1bHRHbG9iYWwgPT09IFwiZW5hYmxlXCIgJiYgKGlzUmVzdWx0ID09PSB0cnVlKSkge1xuICAgICAgY29uc3QgaXNDb2RlQmxvY2tBZGphY2VudCA9ICgoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGxldCBsaW5lX2lkeCA9IGxpbmVTdGFydEluU2VjdGlvbiAtIDE7XG4gICAgICAgIHdoaWxlIChsaW5lX2lkeCA+PSAwKSB7XG4gICAgICAgICAgY29uc3QgbGluZSA9IHZpZXcuZWRpdG9yLmdldExpbmUobGluZV9pZHgpLnRyaW0oKTtcbiAgICAgICAgICBpZiAobGluZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGxpbmVfaWR4LS07XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUgPT09IFwiYGBgXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pKCk7XG5cbiAgICAgIGlmIChpc0NvZGVCbG9ja0FkamFjZW50KSB7XG4gICAgICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stcmVzdWx0XCIpO1xuICAgICAgICBlbGVtX2NvZGUuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1yZXN1bHQtY29kZVwiKTtcblxuICAgICAgICBjb25zdCBlbGVtX3Jlc3VsdF9wcm9tcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBlbGVtX3Jlc3VsdF9wcm9tcHQuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1yZXN1bHQtcHJvbXB0XCIpO1xuICAgICAgICBlbGVtX3Jlc3VsdF9wcm9tcHQuaW5uZXJUZXh0ID0gcmVzdWx0UHJvbXB0O1xuICAgICAgICBlbGVtX2Rpdi5pbnNlcnRCZWZvcmUoZWxlbV9yZXN1bHRfcHJvbXB0LCBlbGVtX3ByZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn0iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUEsbUJBQWtDOzs7QUM2QjNCLElBQU0sbUJBQXdDO0FBQUEsRUFDcEQsZ0JBQWdCO0FBQUEsRUFFaEIsc0JBQXNCO0FBQUEsRUFDdEIsaUJBQWlCO0FBQUEsRUFDakIsaUJBQWlCO0FBQUEsRUFFakIsa0JBQWtCO0FBQUEsRUFDbEIscUJBQXFCO0FBQUEsRUFDckIscUJBQXFCO0FBQUEsRUFFckIsb0JBQW9CO0FBQUEsRUFDcEIsZ0JBQWdCO0FBQUEsRUFFaEIsbUJBQW1CO0FBQUEsRUFDbkIsaUJBQWlCO0FBQUEsRUFFakIsa0JBQWtCO0FBQUEsRUFFbEIsaUJBQWlCO0FBQUEsRUFDakIsb0JBQW9CLENBQUMsTUFBTTtBQUFBLEVBQzNCLGVBQWU7QUFBQSxFQUVmLGlCQUFpQjtBQUFBLEVBQ2pCLHFCQUFxQjtBQUFBLEVBRXJCLFdBQVc7QUFDWjs7O0FDeERBLHNCQUErQztBQUl4QyxJQUFNLGVBQWUsQ0FBQyxTQUFpQjtBQUM3QyxTQUFPLGVBQWUsQ0FBQyxTQUFTO0FBQy9CLFNBQUssVUFBVSxFQUFFLFlBQVksS0FBSyxNQUFNLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUFFLEtBQUssTUFBTTtBQUFBLEVBQ3JGLENBQUM7QUFDRjtBQUVPLElBQU0sd0JBQU4sY0FBb0MsaUNBQWlCO0FBQUEsRUFHM0QsWUFBWUMsTUFBVSxRQUEyQjtBQUNoRCxVQUFNQSxNQUFLLE1BQU07QUFDakIsU0FBSyxTQUFTO0FBQUEsRUFDZjtBQUFBLEVBRUEsVUFBZ0I7QUFDZixVQUFNLEVBQUUsWUFBWSxJQUFJO0FBQ3hCLGdCQUFZLE1BQU07QUFHbEIsZ0JBQVksU0FBUyxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFNUMsUUFBSSx3QkFBUSxXQUFXLEVBQ3JCLFFBQVEsV0FBVyxFQUNuQixRQUFRLGFBQWE7QUFBQSx3REFDK0IsQ0FBQyxFQUNyRDtBQUFBLE1BQVksUUFDWixHQUFHLFdBQVc7QUFBQSxRQUNiLHNDQUFzQztBQUFBLFFBQ3RDLGNBQWM7QUFBQSxNQUNmLENBQUMsRUFDQyxTQUFTLEtBQUssT0FBTyxTQUFTLGNBQWMsRUFDNUMsU0FBUyxPQUFPLFVBQWtCO0FBQ2xDLGFBQUssT0FBTyxTQUFTLGlCQUFpQjtBQUN0QyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0g7QUFHRCxnQkFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUUvQyxRQUFJLHdCQUFRLFdBQVcsRUFDckIsUUFBUSxjQUFjLEVBQ3RCLFFBQVEsYUFBYTtBQUFBO0FBQUE7QUFBQSxtRUFHMEMsQ0FBQyxFQUNoRTtBQUFBLE1BQVksUUFDWixHQUFHLFdBQVc7QUFBQSxRQUNiLGFBQWE7QUFBQSxRQUNiLHNDQUFzQztBQUFBLFFBQ3RDLHNDQUFzQztBQUFBLFFBQ3RDLGNBQWM7QUFBQSxNQUNmLENBQUMsRUFDQyxTQUFTLEtBQUssT0FBTyxTQUFTLG9CQUFvQixFQUNsRCxTQUFTLE9BQU8sVUFBa0I7QUFDbEMsYUFBSyxPQUFPLFNBQVMsdUJBQXVCO0FBQzVDLGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNoQyxDQUFDO0FBQUEsSUFDSDtBQUVELFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLHdCQUF3QixFQUNoQyxRQUFRLCtDQUErQyxFQUN2RDtBQUFBLE1BQVksUUFDWixHQUFHLFdBQVc7QUFBQSxRQUNiLFlBQVk7QUFBQSxRQUNaLFVBQVU7QUFBQSxNQUNYLENBQUMsRUFDQyxTQUFTLEtBQUssT0FBTyxTQUFTLGVBQWUsRUFDN0MsU0FBUyxPQUFPLFVBQWtCO0FBQ2xDLGFBQUssT0FBTyxTQUFTLGtCQUFrQjtBQUN2QyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0g7QUFHRCxnQkFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxRQUFJLHdCQUFRLFdBQVcsRUFDckIsUUFBUSxrQkFBa0IsRUFDMUIsUUFBUSxhQUFhO0FBQUE7QUFBQTtBQUFBLDJEQUdrQyxDQUFDLEVBQ3hEO0FBQUEsTUFBWSxRQUNaLEdBQUcsV0FBVztBQUFBLFFBQ2IsYUFBYTtBQUFBLFFBQ2Isc0NBQXNDO0FBQUEsUUFDdEMsc0NBQXNDO0FBQUEsUUFDdEMsY0FBYztBQUFBLE1BQ2YsQ0FBQyxFQUNDLFNBQVMsS0FBSyxPQUFPLFNBQVMsZ0JBQWdCLEVBQzlDLFNBQVMsT0FBTyxVQUFrQjtBQUNsQyxhQUFLLE9BQU8sU0FBUyxtQkFBbUI7QUFDeEMsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLE1BQ2hDLENBQUM7QUFBQSxJQUNIO0FBRUQsUUFBSSx3QkFBUSxXQUFXLEVBQ3JCLFFBQVEsMkJBQTJCLEVBQ25DLFFBQVEsa0RBQWtELEVBQzFEO0FBQUEsTUFBUSxRQUNSLEdBQUcsU0FBUyxLQUFLLE9BQU8sU0FBUyxvQkFBb0IsU0FBUyxDQUFDLEVBQzdELFNBQVMsT0FBTyxVQUFrQjtBQUNsQyxjQUFNLE1BQU0sU0FBUyxLQUFLO0FBQzFCLFlBQUksTUFBTSxHQUFHO0FBQUc7QUFFaEIsYUFBSyxPQUFPLFNBQVMsc0JBQXNCO0FBQzNDLGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNoQyxDQUFDO0FBQUEsSUFDSDtBQUVELFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLDJCQUEyQixFQUNuQztBQUFBLE1BQVUsUUFDVixHQUFHLFNBQVMsS0FBSyxPQUFPLFNBQVMsbUJBQW1CLEVBQ2xELFNBQVMsT0FBTyxVQUFtQjtBQUNuQyxhQUFLLE9BQU8sU0FBUyxzQkFBc0I7QUFDM0MsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLE1BQ2hDLENBQUM7QUFBQSxJQUNIO0FBR0QsZ0JBQVksU0FBUyxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVyRCxRQUFJLHdCQUFRLFdBQVcsRUFDckIsUUFBUSxvQkFBb0IsRUFDNUIsUUFBUSxhQUFhO0FBQUEsNkRBQ29DLENBQUMsRUFDMUQ7QUFBQSxNQUFZLFFBQ1osR0FBRyxXQUFXO0FBQUEsUUFDYixzQ0FBc0M7QUFBQSxRQUN0QyxjQUFjO0FBQUEsTUFDZixDQUFDLEVBQ0MsU0FBUyxLQUFLLE9BQU8sU0FBUyxrQkFBa0IsRUFDaEQsU0FBUyxPQUFPLFVBQWtCO0FBQ2xDLGFBQUssT0FBTyxTQUFTLHFCQUFxQjtBQUMxQyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0g7QUFFRCxRQUFJLHdCQUFRLFdBQVcsRUFDckIsUUFBUSxzQkFBc0IsRUFDOUIsUUFBUSwyR0FBMkcsRUFDbkg7QUFBQSxNQUFRLFFBQ1IsR0FBRyxTQUFTLEtBQUssT0FBTyxTQUFTLGNBQWMsRUFDN0MsU0FBUyxPQUFPLFVBQWtCO0FBQ2xDLGFBQUssT0FBTyxTQUFTLGlCQUFpQjtBQUN0QyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0g7QUFHRCxnQkFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXpELFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLHdCQUF3QixFQUNoQyxRQUFRLGFBQWE7QUFBQTtBQUFBO0FBQUEsaUVBR3dDLENBQUMsRUFDOUQ7QUFBQSxNQUFZLFFBQ1osR0FBRyxXQUFXO0FBQUEsUUFDYixhQUFhO0FBQUEsUUFDYixzQ0FBc0M7QUFBQSxRQUN0QyxzQ0FBc0M7QUFBQSxRQUN0QyxjQUFjO0FBQUEsTUFDZixDQUFDLEVBQ0MsU0FBUyxLQUFLLE9BQU8sU0FBUyxpQkFBaUIsRUFDL0MsU0FBUyxPQUFPLFVBQWtCO0FBQ2xDLGFBQUssT0FBTyxTQUFTLG9CQUFvQjtBQUN6QyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0g7QUFFRCxRQUFJLHdCQUFRLFdBQVcsRUFDckIsUUFBUSxrQkFBa0IsRUFDMUIsUUFBUSwrRUFBK0UsRUFDdkY7QUFBQSxNQUFRLFFBQ1IsR0FBRyxTQUFTLEtBQUssT0FBTyxTQUFTLGVBQWUsRUFDOUMsU0FBUyxPQUFPLFVBQWtCO0FBQ2xDLGFBQUssT0FBTyxTQUFTLGtCQUFrQjtBQUN2QyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0g7QUFHRCxnQkFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVsRCxRQUFJLHdCQUFRLFdBQVcsRUFDckIsUUFBUSxpQkFBaUIsRUFDekIsUUFBUSxhQUFhO0FBQUE7QUFBQTtBQUFBLDBEQUdpQyxDQUFDLEVBQ3ZEO0FBQUEsTUFBWSxRQUNaLEdBQUcsV0FBVztBQUFBLFFBQ2IsYUFBYTtBQUFBLFFBQ2Isc0NBQXNDO0FBQUEsUUFDdEMsc0NBQXNDO0FBQUEsUUFDdEMsY0FBYztBQUFBLE1BQ2YsQ0FBQyxFQUNDLFNBQVMsS0FBSyxPQUFPLFNBQVMsZ0JBQWdCLEVBQzlDLFNBQVMsT0FBTyxVQUFrQjtBQUNsQyxhQUFLLE9BQU8sU0FBUyxtQkFBbUI7QUFDeEMsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLE1BQ2hDLENBQUM7QUFBQSxJQUNIO0FBR0QsZ0JBQVksU0FBUyxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFN0MsUUFBSSx3QkFBUSxXQUFXLEVBQ3JCLFFBQVEsWUFBWSxFQUNwQixRQUFRLGFBQWE7QUFBQTtBQUFBO0FBQUEscURBRzRCLENBQUMsRUFDbEQ7QUFBQSxNQUFZLFFBQ1osR0FBRyxXQUFXO0FBQUEsUUFDYixhQUFhO0FBQUEsUUFDYixzQ0FBc0M7QUFBQSxRQUN0QyxzQ0FBc0M7QUFBQSxRQUN0QyxjQUFjO0FBQUEsTUFDZixDQUFDLEVBQ0MsU0FBUyxLQUFLLE9BQU8sU0FBUyxlQUFlLEVBQzdDLFNBQVMsT0FBTyxVQUFrQjtBQUNsQyxhQUFLLE9BQU8sU0FBUyxrQkFBa0I7QUFDdkMsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLE1BQ2hDLENBQUM7QUFBQSxJQUNIO0FBRUQsUUFBSSx3QkFBUSxXQUFXLEVBQ3JCLFFBQVEscUJBQXFCLEVBQzdCLFFBQVEsb0hBQW9ILEVBQzVIO0FBQUEsTUFBWSxRQUNaLEdBQUcsU0FBUyxLQUFLLE9BQU8sU0FBUyxtQkFBbUIsS0FBSyxJQUFJLENBQUMsRUFDNUQsU0FBUyxPQUFPLFVBQWtCO0FBQ2xDLGNBQU0sUUFBUSxNQUFNLE1BQU0sSUFBSSxFQUFFLE9BQU8sVUFBUSxLQUFLLEtBQUssTUFBTSxFQUFFO0FBQ2pFLGFBQUssT0FBTyxTQUFTLHFCQUFxQjtBQUMxQyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0g7QUFFRCxRQUFJLHdCQUFRLFdBQVcsRUFDckIsUUFBUSxnQkFBZ0IsRUFDeEIsUUFBUSw0Q0FBNEMsRUFDcEQ7QUFBQSxNQUFRLFFBQ1IsR0FBRyxTQUFTLEtBQUssT0FBTyxTQUFTLGFBQWEsRUFDNUMsU0FBUyxPQUFPLFVBQWtCO0FBQ2xDLGFBQUssT0FBTyxTQUFTLGdCQUFnQjtBQUNyQyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0g7QUFHRCxnQkFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU3QyxRQUFJLHdCQUFRLFdBQVcsRUFDckIsUUFBUSxZQUFZLEVBQ3BCLFFBQVEsYUFBYTtBQUFBLHdHQUMrRSxDQUFDLEVBQ3JHO0FBQUEsTUFBWSxRQUNaLEdBQUcsV0FBVztBQUFBLFFBQ2IsVUFBVTtBQUFBLFFBQ1YsV0FBVztBQUFBLE1BQ1osQ0FBQyxFQUNDLFNBQVMsS0FBSyxPQUFPLFNBQVMsZUFBZSxFQUM3QyxTQUFTLE9BQU8sVUFBa0I7QUFDbEMsYUFBSyxPQUFPLFNBQVMsa0JBQWtCO0FBQ3ZDLGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNoQyxDQUFDO0FBQUEsSUFDSDtBQUVELFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLHVCQUF1QixFQUMvQixRQUFRLDhDQUE4QyxFQUN0RDtBQUFBLE1BQVEsUUFDUixHQUFHLFNBQVMsS0FBSyxPQUFPLFNBQVMsbUJBQW1CLEVBQ2xELFNBQVMsT0FBTyxVQUFrQjtBQUNsQyxhQUFLLE9BQU8sU0FBUyxzQkFBc0I7QUFDM0MsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLE1BQ2hDLENBQUM7QUFBQSxJQUNIO0FBR0QsZ0JBQVksU0FBUyxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFakQsUUFBSSx3QkFBUSxXQUFXLEVBQ3JCLFFBQVEsWUFBWSxFQUNwQixRQUFRLDJCQUEyQixFQUNuQztBQUFBLE1BQVUsUUFDVixHQUFHLFNBQVMsS0FBSyxPQUFPLFNBQVMsU0FBUyxFQUN4QyxTQUFTLE9BQU8sVUFBbUI7QUFDbkMsYUFBSyxPQUFPLFNBQVMsWUFBWTtBQUNqQyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQ0Q7OztBQy9TQSxJQUFBQyxtQkFBNkI7QUFNN0IsSUFBTSxRQUFRO0FBQUEsRUFDWixPQUFPO0FBQUEsRUFDUCxvQkFBb0I7QUFBQSxFQUNwQix3QkFBd0I7QUFBQSxFQUN4QixnQkFBZ0I7QUFBQSxFQUNoQixvQkFBb0I7QUFBQSxFQUNwQixXQUFXO0FBQUEsRUFDWCxxQkFBcUI7QUFBQSxFQUNyQixpQkFBaUI7QUFBQSxFQUNqQixxQkFBcUI7QUFBQSxFQUNyQixnQkFBZ0I7QUFBQSxFQUNoQixvQkFBb0I7QUFBQSxFQUNwQixRQUFRO0FBQUEsRUFDUixlQUFlO0FBQUEsRUFDZixtQkFBbUI7QUFBQSxFQUNuQixRQUFRO0FBQ1Y7QUFFQSxTQUFTLFFBQ1AsTUFDQSxXQUNBLGVBQ0EsY0FDQSxVQW9CQTtBQUNBLFFBQU0sZUFtQkY7QUFBQSxJQUNGLFNBQVM7QUFBQSxJQUNULG9CQUFvQjtBQUFBLElBQ3BCLGtCQUFrQjtBQUFBLElBQ2xCLFdBQVc7QUFBQSxJQUNYLE9BQU87QUFBQSxJQUNQLGVBQWU7QUFBQSxJQUNmLGFBQWE7QUFBQSxJQUNiLGNBQWMsU0FBUztBQUFBLElBQ3ZCLFlBQVk7QUFBQSxJQUNaLGVBQWU7QUFBQSxJQUNmLGdCQUFnQixDQUFDO0FBQUEsSUFDakIsY0FBYztBQUFBLElBQ2QsVUFBVSxTQUFTO0FBQUEsSUFDbkIsYUFBYTtBQUFBLElBQ2IsVUFBVTtBQUFBLElBQ1YsY0FBYyxTQUFTO0FBQUEsSUFDdkIsWUFBWTtBQUFBLElBQ1osUUFBUSxTQUFTO0FBQUEsRUFDbkI7QUFFQSxNQUFJLGVBQWU7QUFDbkIsV0FBUyxJQUFJLGFBQWEsV0FBVyxLQUFLLGFBQWEsU0FBUyxLQUFLO0FBQ25FLFVBQU0sT0FBTyxLQUFLLE9BQU8sUUFBUSxDQUFDO0FBQ2xDLFFBQUksS0FBSyxLQUFLLEVBQUUsV0FBVyxLQUFLO0FBQUc7QUFFbkMsUUFBSSxhQUFhLHVCQUF1QixNQUFNLGlCQUFpQixnQkFBZ0IsSUFBSSxHQUFHO0FBQ3BGLG1CQUFhLHFCQUFxQjtBQUFBLElBQ3BDO0FBRUEsUUFBSSxhQUFhLHFCQUFxQixNQUFNLGlCQUFpQixnQkFBZ0IsSUFBSSxHQUFHO0FBQ2xGLG1CQUFhLG1CQUFtQjtBQUNoQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxhQUFhLHFCQUFxQixLQUFLLGFBQWEsbUJBQW1CLEtBQUssYUFBYSxzQkFBc0IsYUFBYSxrQkFBa0I7QUFDaEosaUJBQWEsVUFBVTtBQUN2QixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sWUFBWSxLQUFLLE9BQU8sUUFBUSxhQUFhLGtCQUFrQixFQUFFLEtBQUssSUFBSTtBQUdoRixRQUFNLG9CQUFvQixNQUFNLE1BQU0sS0FBSyxTQUFTO0FBQ3BELE1BQUksbUJBQW1CO0FBQ3JCLGlCQUFhLFlBQVk7QUFDekIsaUJBQWEsUUFBUSxrQkFBa0IsQ0FBQyxLQUFLLGtCQUFrQixDQUFDO0FBQUEsRUFDbEU7QUFHQSxRQUFNLGdDQUFnQyxNQUFNLG1CQUFtQixLQUFLLFNBQVM7QUFDN0UsUUFBTSxvQ0FBb0MsTUFBTSx1QkFBdUIsS0FBSyxTQUFTO0FBQ3JGLE1BQUksK0JBQStCO0FBQ2pDLGlCQUFhLGdCQUFnQjtBQUFBLEVBQy9CLFdBQVcsbUNBQW1DO0FBQzVDLFFBQUksa0NBQWtDLENBQUMsTUFBTSxRQUFRO0FBQ25ELG1CQUFhLGdCQUFnQjtBQUFBLElBQy9CLFdBQVcsa0NBQWtDLENBQUMsTUFBTSxTQUFTO0FBQzNELG1CQUFhLGdCQUFnQjtBQUFBLElBQy9CO0FBQUEsRUFDRjtBQUdBLGVBQWEsYUFBYSxhQUFhLG1CQUFtQixhQUFhLHFCQUFxQjtBQUM1RixRQUFNLDRCQUE0QixNQUFNLGVBQWUsS0FBSyxTQUFTO0FBQ3JFLFFBQU0sZ0NBQWdDLE1BQU0sbUJBQW1CLEtBQUssU0FBUztBQUM3RSxNQUFJLDJCQUEyQjtBQUM3QixpQkFBYSxjQUFjO0FBQUEsRUFDN0IsV0FBVywrQkFBK0I7QUFDeEMsUUFBSSw4QkFBOEIsQ0FBQyxNQUFNLFFBQVE7QUFDL0MsbUJBQWEsY0FBYztBQUFBLElBQzdCLFdBQVcsOEJBQThCLENBQUMsTUFBTSxTQUFTO0FBQ3ZELG1CQUFhLGNBQWM7QUFBQSxJQUM3QixPQUFPO0FBQ0wsbUJBQWEsY0FBYztBQUMzQixtQkFBYSxlQUFlLFNBQVMsOEJBQThCLENBQUMsQ0FBQyxLQUFLO0FBQUEsSUFDNUU7QUFBQSxFQUNGO0FBR0EsUUFBTSx3QkFBd0IsTUFBTSxVQUFVLEtBQUssU0FBUztBQUM1RCxNQUFJLHVCQUF1QjtBQUN6QixpQkFBYSxnQkFBZ0I7QUFDN0IsVUFBTSxxQkFBcUIsc0JBQXNCLENBQUMsS0FBSyxzQkFBc0IsQ0FBQztBQUM5RSxRQUFJLGlCQUFpQixtQkFBbUIsTUFBTSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVM7QUFDL0QsYUFBTyxLQUFLLEtBQUs7QUFFakIsVUFBSSxNQUFNLE9BQU8sS0FBSyxJQUFJO0FBQUcsZUFBTyxTQUFTLElBQUk7QUFFakQsWUFBTSxpQkFBaUIsS0FBSyxNQUFNLEdBQUc7QUFDckMsVUFBSSxlQUFlLFdBQVcsR0FBRztBQUMvQixjQUFNLFFBQVEsU0FBUyxlQUFlLENBQUMsRUFBRSxLQUFLLENBQUM7QUFDL0MsY0FBTSxNQUFNLFNBQVMsZUFBZSxDQUFDLEVBQUUsS0FBSyxDQUFDO0FBRTdDLFlBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHO0FBQ2hDLGlCQUFPLE1BQU0sS0FBSyxFQUFFLFFBQVEsTUFBTSxRQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxJQUFJLEtBQUs7QUFBQSxRQUNwRTtBQUFBLE1BQ0Y7QUFFQSxhQUFPO0FBQUEsSUFDVCxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUM7QUFFdkMsUUFBSSxlQUFlLEtBQUssQ0FBQyxTQUFTLE1BQU0sSUFBSSxDQUFDLEdBQUc7QUFFOUMsbUJBQWEsZ0JBQWdCO0FBQzdCLG1CQUFhLGlCQUFpQixDQUFDO0FBQUEsSUFDakMsT0FBTztBQUVMLG1CQUFhLGlCQUFpQixlQUFlO0FBQUEsUUFDM0MsQ0FBQyxTQUFTLFFBQVEsYUFBYSxnQkFBZ0IsT0FBTyxhQUFhLGVBQWUsYUFBYTtBQUFBLE1BQ2pHO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFHQSxZQUFVLFVBQVUsUUFBUSxDQUFDLGNBQWM7QUFDekMsVUFBTSxnQ0FBZ0MsTUFBTSxvQkFBb0IsS0FBSyxVQUFVLEtBQUssQ0FBQztBQUNyRixRQUFJLCtCQUErQjtBQUNqQyxtQkFBYSxXQUFXLDhCQUE4QixDQUFDO0FBQUEsSUFDekQ7QUFBQSxFQUNGLENBQUM7QUFDRCxRQUFNLDZCQUE2QixNQUFNLGdCQUFnQixLQUFLLFNBQVM7QUFDdkUsUUFBTSxpQ0FBaUMsTUFBTSxvQkFBb0IsS0FBSyxTQUFTO0FBQy9FLE1BQUksNEJBQTRCO0FBQzlCLGlCQUFhLGVBQWU7QUFBQSxFQUM5QixXQUFXLGdDQUFnQztBQUN6QyxRQUFJLCtCQUErQixDQUFDLE1BQU0sUUFBUTtBQUNoRCxtQkFBYSxlQUFlO0FBQUEsSUFDOUIsV0FBVywrQkFBK0IsQ0FBQyxNQUFNLFNBQVM7QUFDeEQsbUJBQWEsZUFBZTtBQUFBLElBQzlCLE9BQU87QUFDTCxtQkFBYSxlQUFlO0FBQzVCLG1CQUFhLFdBQVcsK0JBQStCLENBQUMsS0FBSywrQkFBK0IsQ0FBQztBQUFBLElBQy9GO0FBQUEsRUFDRjtBQUdBLFFBQU0sNEJBQTRCLE1BQU0sZUFBZSxLQUFLLFNBQVM7QUFDckUsUUFBTSxnQ0FBZ0MsTUFBTSxtQkFBbUIsS0FBSyxTQUFTO0FBQzdFLE1BQUksMkJBQTJCO0FBQzdCLGlCQUFhLGNBQWM7QUFBQSxFQUM3QixXQUFXLCtCQUErQjtBQUN4QyxRQUFJLDhCQUE4QixDQUFDLE1BQU0sUUFBUTtBQUMvQyxtQkFBYSxjQUFjO0FBQUEsSUFDN0IsV0FBVyw4QkFBOEIsQ0FBQyxNQUFNLFNBQVM7QUFDdkQsbUJBQWEsY0FBYztBQUFBLElBQzdCO0FBQUEsRUFDRjtBQUdBLFFBQU0sMkJBQTJCLE1BQU0sY0FBYyxLQUFLLFNBQVM7QUFDbkUsUUFBTSwrQkFBK0IsTUFBTSxrQkFBa0IsS0FBSyxTQUFTO0FBQzNFLE1BQUksMEJBQTBCO0FBQzVCLGlCQUFhLGFBQWE7QUFBQSxFQUM1QixXQUFXLDhCQUE4QjtBQUN2QyxRQUFJLDZCQUE2QixDQUFDLE1BQU0sUUFBUTtBQUM5QyxtQkFBYSxhQUFhO0FBQUEsSUFDNUIsV0FBVyw2QkFBNkIsQ0FBQyxNQUFNLFNBQVM7QUFDdEQsbUJBQWEsYUFBYTtBQUFBLElBQzVCLE9BQU87QUFDTCxtQkFBYSxhQUFhO0FBQzFCLG1CQUFhLFNBQVMsNkJBQTZCLENBQUMsS0FBSyw2QkFBNkIsQ0FBQztBQUFBLElBQ3pGO0FBQUEsRUFDRjtBQUdBLFFBQU0scUJBQXFCLE1BQU0sT0FBTyxLQUFLLFNBQVM7QUFDdEQsUUFBTSwyQkFBMkIsTUFBTSxrQkFBa0IsS0FBSyxTQUFTO0FBQ3ZFLE1BQUksb0JBQW9CO0FBQ3RCLGlCQUFhLFdBQVc7QUFHeEIsaUJBQWEsWUFBWTtBQUN6QixpQkFBYSxlQUFlO0FBQzVCLGlCQUFhLGNBQWM7QUFDM0IsaUJBQWEsYUFBYTtBQUUxQixRQUFJLDBCQUEwQjtBQUM1QixtQkFBYSxlQUFlLHlCQUF5QixDQUFDLEtBQUsseUJBQXlCLENBQUM7QUFBQSxJQUN2RjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxlQUFzQixxQkFDcEIsSUFDQSxTQUNBLFFBQ0E7QUFDQSxRQUFNLFdBQVcsT0FBTztBQUV4QixRQUFNLE9BQU8sSUFBSSxVQUFVLG9CQUFvQiw2QkFBWTtBQUMzRCxNQUFJLENBQUM7QUFBTTtBQU1YLFFBQU0sYUFBa0MsR0FBRyxpQkFBaUIsOEJBQThCO0FBQzFGLE1BQUksV0FBVyxXQUFXO0FBQUc7QUFFN0IsYUFBVyxRQUFRLENBQUMsV0FBd0Isa0JBQTBCO0FBQ3BFLFVBQU0sV0FBaUMsVUFBVTtBQUNqRCxRQUFJLENBQUM7QUFBVTtBQUVmLFVBQU0sa0JBQXdDLFNBQVM7QUFDdkQsUUFBSSxDQUFDO0FBQWlCO0FBRXRCLFVBQU0sZUFBcUMsU0FBUyxjQUFjLG1CQUFtQjtBQUNyRixRQUFJLENBQUM7QUFBYztBQUVuQixVQUFNLGVBQW9ELFFBQVEsZUFBZSxTQUFTO0FBQzFGLFFBQUksQ0FBQztBQUFjO0FBR25CLFVBQU07QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLElBbUJJLFFBQVEsTUFBTSxXQUFXLGVBQWUsY0FBYyxRQUFRO0FBQ2xFLFFBQUk7QUFBUztBQUNiLFFBQUksU0FBUyxXQUFXO0FBQ3RCLGNBQVEsSUFBSTtBQUFBLFFBQ1Y7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFHQSxVQUFNLFdBQXdCLFNBQVMsY0FBYyxLQUFLO0FBQzFELG9CQUFnQixhQUFhLFVBQVUsUUFBUTtBQUMvQyxhQUFTLFlBQVksUUFBUTtBQUU3QixhQUFTLFVBQVUsSUFBSSxjQUFjO0FBQ3JDLGNBQVUsVUFBVSxJQUFJLG1CQUFtQjtBQUMzQyxpQkFBYSxPQUFPO0FBRXBCLFFBQUksYUFBd0M7QUFDNUMsUUFBSSxTQUFTLG1CQUFtQix3Q0FBeUMsY0FBYyxNQUFPO0FBQzVGLGVBQVMsVUFBVSxJQUFJLHlCQUF5QjtBQUVoRCxtQkFBYSxTQUFTLGNBQWMsS0FBSztBQUN6QyxpQkFBVyxVQUFVLElBQUksb0JBQW9CO0FBQzdDLGlCQUFXLFlBQVk7QUFDdkIsZUFBUyxhQUFhLFlBQVksUUFBUTtBQUFBLElBQzVDO0FBRUEsUUFDRyxTQUFTLHlCQUF5QixlQUNsQyxTQUFTLHlCQUF5Qix5Q0FBeUMsa0JBQWtCLFVBQWEsa0JBQWtCLFNBQzVILFNBQVMseUJBQXlCLHdDQUF5QyxrQkFBa0IsTUFDOUY7QUFDQSxVQUFJLFlBQVk7QUFDZCxpQkFBUyxVQUFVLElBQUksMEJBQTBCO0FBRWpELFlBQUksU0FBUyxvQkFBb0IsWUFBWTtBQUMzQyxtQkFBUyxVQUFVLElBQUksd0JBQXdCO0FBQUEsUUFDakQ7QUFFQSxtQkFBVyxpQkFBaUIsU0FBUyxDQUFDLE9BQU87QUFDM0MsYUFBRyxnQkFBZ0I7QUFDbkIsYUFBRyxlQUFlO0FBQ2xCLG1CQUFTLFVBQVUsT0FBTyx3QkFBd0I7QUFBQSxRQUNwRCxDQUFDO0FBRUQsY0FBTSxvQkFBb0IsU0FBUyxjQUFjLEtBQUs7QUFDdEQsMEJBQWtCLFVBQVUsSUFBSSw0QkFBNEI7QUFFNUQsY0FBTSxtQkFBbUIsU0FBUyxjQUFjLEtBQUs7QUFDckQseUJBQWlCLFVBQVUsSUFBSSw2QkFBNkIsNEJBQTRCO0FBQ3hGLHlCQUFpQixZQUFZO0FBQUE7QUFBQTtBQUc3QiwwQkFBa0IsWUFBWSxnQkFBZ0I7QUFFOUMsY0FBTSxpQkFBaUIsU0FBUyxjQUFjLEtBQUs7QUFDbkQsdUJBQWUsVUFBVSxJQUFJLDZCQUE2QiwyQkFBMkI7QUFDckYsdUJBQWUsWUFBWTtBQUFBO0FBQUE7QUFHM0IsMEJBQWtCLFlBQVksY0FBYztBQUU1QyxtQkFBVyxRQUFRLGlCQUFpQjtBQUFBLE1BQ3RDO0FBQUEsSUFDRjtBQUdBLFFBQ0csU0FBUyxxQkFBcUIsZUFDOUIsU0FBUyxxQkFBcUIseUNBQXlDLGdCQUFnQixVQUFhLGdCQUFnQixTQUNwSCxTQUFTLHFCQUFxQix3Q0FBeUMsZ0JBQWdCLE1BQ3hGO0FBQ0EsZUFBUyxVQUFVLElBQUksMkJBQTJCO0FBRWxELFlBQU0sZUFBZSxTQUFTLGNBQWMsS0FBSztBQUNqRCxtQkFBYSxVQUFVLElBQUksc0JBQXNCO0FBQ2pELG1CQUFhLFlBQVksTUFBTSxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsUUFBUSxNQUFNLFlBQVksRUFBRSxLQUFLLElBQUk7QUFDaEcsZUFBUyxhQUFhLGNBQWMsU0FBUztBQUU3QyxVQUFJLFNBQVMscUJBQXFCO0FBQ2hDLHFCQUFhLFVBQVUsSUFBSSxlQUFlO0FBQUEsTUFDNUM7QUFBQSxJQUNGO0FBRUEsUUFBSSxTQUFTLHVCQUF1Qix3Q0FBeUMsa0JBQWtCLE1BQU87QUFDcEcsZUFBUyxVQUFVLElBQUksNkJBQTZCO0FBRXBELGVBQVMsTUFBTSxZQUFZLDZDQUE2QyxTQUFTLGNBQWM7QUFFL0YsWUFBTSxpQkFBaUIsU0FBUyxjQUFjLEtBQUs7QUFDbkQscUJBQWUsVUFBVSxJQUFJLHdCQUF3QjtBQUNyRCxxQkFBZSxZQUFZLE1BQU0sVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLFFBQVE7QUFDbkUsY0FBTSxhQUF1QixDQUFDO0FBQzlCLFlBQUksZUFBZSxTQUFTLE1BQU0sWUFBWTtBQUFHLHFCQUFXLEtBQUssV0FBVztBQUM1RSxlQUFPLDBCQUEwQixNQUFNLGdCQUFnQixXQUFXLEtBQUssR0FBRztBQUFBLE1BQzVFLENBQUMsRUFBRSxLQUFLLElBQUk7QUFDWixlQUFTLGFBQWEsZ0JBQWdCLFNBQVM7QUFBQSxJQUNqRDtBQUVBLFFBQ0csU0FBUyxzQkFBc0IsZUFDL0IsU0FBUyxzQkFBc0IseUNBQXlDLGlCQUFpQixVQUFhLGlCQUFpQixTQUN2SCxTQUFTLHNCQUFzQix3Q0FBeUMsaUJBQWlCLE1BQzFGO0FBQ0EsZUFBUyxVQUFVLElBQUksNEJBQTRCO0FBRW5ELFlBQU0sZ0JBQWdCLFNBQVMsY0FBYyxLQUFLO0FBQ2xELG9CQUFjLFVBQVUsSUFBSSx1QkFBdUI7QUFDbkQsb0JBQWMsWUFBWTtBQUMxQixlQUFTLFFBQVEsYUFBYTtBQUFBLElBQ2hDO0FBRUEsUUFDRyxTQUFTLHFCQUFxQixlQUM5QixTQUFTLHFCQUFxQix5Q0FBeUMsZ0JBQWdCLFVBQWEsZ0JBQWdCLFNBQ3BILFNBQVMscUJBQXFCLHdDQUF5QyxnQkFBZ0IsTUFDeEY7QUFDQSxlQUFTLFVBQVUsSUFBSSwyQkFBMkI7QUFFbEQsZUFBUyxZQUFZLFlBQVk7QUFBQSxJQUNuQztBQUVBLFFBQ0csU0FBUyxvQkFBb0IsZUFBZSxTQUFTLG1CQUFtQixTQUFTLFFBQVEsS0FDekYsU0FBUyxvQkFBb0Isd0NBQXdDLFNBQVMsbUJBQW1CLFNBQVMsUUFBUSxNQUFNLGVBQWUsVUFBYSxlQUFlLFNBQ25LLFNBQVMsb0JBQW9CLHdDQUF5QyxlQUFlLE1BQ3RGO0FBQ0EsZUFBUyxVQUFVLElBQUksMEJBQTBCO0FBRWpELFlBQU0sY0FBYyxTQUFTLGNBQWMsS0FBSztBQUNoRCxrQkFBWSxVQUFVLElBQUkscUJBQXFCO0FBRS9DLFlBQU0sUUFBUSxVQUFVLFVBQVUsTUFBTSxJQUFJO0FBQzVDLGtCQUFZLFlBQVksTUFBTSxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsUUFBUTtBQUNoRSxZQUFJLE1BQU0sS0FBSyxPQUFPLE1BQU07QUFBUSxpQkFBTztBQUUzQyxjQUFNLE9BQU8sTUFBTSxHQUFHLEVBQUUsS0FBSztBQUM3QixjQUFNLFdBQVcsTUFBTSxJQUFJLE1BQU0sTUFBTSxDQUFDLEVBQUUsS0FBSyxJQUFJO0FBRW5ELFlBQ0csU0FBUztBQUFBLFFBQ1QsS0FBSyxXQUFXLEdBQUc7QUFBQSxRQUNuQixTQUFTLFNBQVMsSUFBSSxHQUN2QjtBQUNBLGlCQUFPLElBQUksT0FBTyxPQUFPLE1BQU07QUFBQSxRQUNqQztBQUVBLGVBQU87QUFBQSxNQUNULENBQUMsRUFBRSxPQUFPLENBQUMsU0FBUyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUk7QUFFNUMsZUFBUyxhQUFhLGFBQWEsU0FBUztBQUFBLElBQzlDO0FBRUEsUUFBSSxTQUFTLG9CQUFvQixZQUFhLGFBQWEsTUFBTztBQUNoRSxZQUFNLHVCQUF1QixNQUFlO0FBQzFDLFlBQUksV0FBVyxxQkFBcUI7QUFDcEMsZUFBTyxZQUFZLEdBQUc7QUFDcEIsZ0JBQU0sT0FBTyxLQUFLLE9BQU8sUUFBUSxRQUFRLEVBQUUsS0FBSztBQUNoRCxjQUFJLEtBQUssV0FBVyxHQUFHO0FBQ3JCO0FBQ0E7QUFBQSxVQUNGLFdBQVcsU0FBUyxPQUFPO0FBQ3pCLG1CQUFPO0FBQUEsVUFDVCxPQUFPO0FBQ0wsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRjtBQUNBLGVBQU87QUFBQSxNQUNULEdBQUc7QUFFSCxVQUFJLHFCQUFxQjtBQUN2QixpQkFBUyxVQUFVLElBQUkscUJBQXFCO0FBQzVDLGtCQUFVLFVBQVUsSUFBSSwwQkFBMEI7QUFFbEQsY0FBTSxxQkFBcUIsU0FBUyxjQUFjLEtBQUs7QUFDdkQsMkJBQW1CLFVBQVUsSUFBSSw0QkFBNEI7QUFDN0QsMkJBQW1CLFlBQVk7QUFDL0IsaUJBQVMsYUFBYSxvQkFBb0IsUUFBUTtBQUFBLE1BQ3BEO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUNIOzs7QUhuZ0JBLElBQXFCLG9CQUFyQixjQUErQyx3QkFBTztBQUFBLEVBR3JELE1BQU0sU0FBUztBQUNkLFVBQU0sS0FBSyxhQUFhO0FBQ3hCLFFBQUksS0FBSyxTQUFTLFdBQVc7QUFDNUIsY0FBUSxJQUFJLDRCQUE0QjtBQUFBLElBQ3pDO0FBR0EsU0FBSyxjQUFjLElBQUksc0JBQXNCLEtBQUssS0FBSyxJQUFJLENBQUM7QUFHNUQsVUFBTSxZQUFZLEtBQUssOEJBQThCLENBQUMsSUFBSSxRQUFRO0FBQ2pFLDJCQUFxQixJQUFJLEtBQUssSUFBSTtBQUFBLElBQ25DLENBQUM7QUFFRCxjQUFVLFlBQVk7QUFBQSxFQUN2QjtBQUFBLEVBRUEsV0FBVztBQUNWLFFBQUksS0FBSyxTQUFTLFdBQVc7QUFDNUIsY0FBUSxJQUFJLDhCQUE4QjtBQUFBLElBQzNDO0FBQUEsRUFDRDtBQUFBLEVBRUEsTUFBTSxlQUFlO0FBQ3BCLFNBQUssV0FBVyxPQUFPLE9BQU8sQ0FBQyxHQUFHLGtCQUFrQixNQUFNLEtBQUssU0FBUyxDQUFDO0FBQUEsRUFDMUU7QUFBQSxFQUVBLE1BQU0sZUFBZTtBQUNwQixVQUFNLEtBQUssU0FBUyxLQUFLLFFBQVE7QUFBQSxFQUNsQztBQUNEOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfb2JzaWRpYW4iLCAiYXBwIiwgImltcG9ydF9vYnNpZGlhbiJdCn0K diff --git a/dist/manifest.json b/dist/manifest.json index bb14daf..c57bffb 100644 --- a/dist/manifest.json +++ b/dist/manifest.json @@ -1,7 +1,7 @@ { "id": "hk-code-block", "name": "HK Code Block", - "version": "0.3.0", + "version": "0.3.1", "minAppVersion": "1.0.0", "description": "Obsidian plugin developed by Heekang Park; Make code block looking good on reading view", "author": "Heekang Park", diff --git a/dist/styles.css b/dist/styles.css index 81124ed..c723dcc 100644 --- a/dist/styles.css +++ b/dist/styles.css @@ -164,24 +164,25 @@ font-size: var(--hk-codeblock-font-size); background-color: transparent; } -.hk-codeblock + .hk-codeblock.hk-codeblock-result { +.hk-codeblock.hk-codeblock-result { margin-top: calc(var(--hk-codeblock-margin) * -1); border-top: 1px solid var(--hk-codeblock-border-color); + background-color: var(--hk-codeblock-background-color); } -.hk-codeblock + .hk-codeblock.hk-codeblock-result::before { - content: attr(data-result-prompt); - display: block; +.hk-codeblock.hk-codeblock-result .hk-codeblock-result-prompt { color: var(--hk-codeblock-result-text-color); - opacity: 0.6; + opacity: 0.4; font-size: 0.8em; padding-top: var(--hk-codeblock-vertical-padding); padding-left: var(--hk-codeblock-horizontal-padding); padding-right: var(--hk-codeblock-horizontal-padding); + user-select: none; + pointer-events: none; } -.hk-codeblock + .hk-codeblock.hk-codeblock-result pre { +.hk-codeblock.hk-codeblock-result pre { margin-top: 0; } -.hk-codeblock + .hk-codeblock.hk-codeblock-result pre .hk-codeblock-result-code { +.hk-codeblock.hk-codeblock-result pre .hk-codeblock-result-code { color: var(--hk-codeblock-result-text-color); } -/*# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3N0eWxlcy5zY3NzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIuaGstY29kZWJsb2NrIHtcbiAgJiB7XG4gICAgLy8gdmFyaWFibGVzXG4gICAgLS1oay1jb2RlYmxvY2stbWFyZ2luOiAxZW07XG4gICAgLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nOiAxNnB4O1xuICAgIC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmc6IDhweDtcbiAgICAtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2RlLWJhY2tncm91bmQpO1xuICAgIC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcjogdmFyKC0tZGl2aWRlci1jb2xvcik7IC8vIGFwcGxpZWQgdG8gdGl0bGUsIGxpbmVub3MsIGFuZCByZXN1bHRcbiAgICAtLWhrLWNvZGVibG9jay1mb250LXNpemU6IHZhcigtLWNvZGUtc2l6ZSk7XG4gICAgLS1oay1jb2RlYmxvY2stdGl0bGUtdGV4dC1jb2xvcjogdmFyKC0tdGV4dC1ub3JtYWwpO1xuICAgIC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1jb2xvcjogdmFyKC0tY29kZS1ub3JtYWwpO1xuICAgIC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1mb250OiB2YXIoLS1mb250LW1vbm9zcGFjZSk7XG4gICAgLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1jb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7IC8vIHNhbWUgd2l0aCBjb3B5IGJ1dHRvblxuICAgIC0taGstY29kZWJsb2NrLWxhbmd1YWdlLXRleHQtc2l6ZTogdmFyKC0tZm9udC11aS1zbWFsbGVyKTsgLy8gc2FtZSB3aXRoIGNvcHkgYnV0dG9uXG4gICAgLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1mb250OiB2YXIoLS1mb250LWludGVyZmFjZSk7IC8vIHNhbWUgd2l0aCBjb3B5IGJ1dHRvblxuICAgIC0taGstY29kZWJsb2NrLXByb21wdC10ZXh0LWNvbG9yOiB2YXIoLS1jb2RlLW5vcm1hbCk7XG4gICAgLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtZm9udDogdmFyKC0tZm9udC1tb25vc3BhY2UpO1xuICAgIC0taGstY29kZWJsb2NrLXJlc3VsdC10ZXh0LWNvbG9yOiB2YXIoLS10ZXh0LW5vcm1hbCk7XG4gIH1cblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbi1ib3R0b206IHZhcigtLWhrLWNvZGVibG9jay1tYXJnaW4pO1xuXG4gIHByZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZy10b3A6IHZhcigtLWhrLWNvZGVibG9jay12ZXJ0aWNhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLWJvdHRvbTogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctbGVmdDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1yaWdodDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWJhY2tncm91bmQtY29sb3IpO1xuXG4gICAgY29kZS5oay1jb2RlYmxvY2stY29kZSB7XG4gICAgICB3aGl0ZS1zcGFjZTogcHJlO1xuICAgICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stYmFja2dyb3VuZC1jb2xvcik7XG4gICAgfVxuICB9XG59XG5cbi8qIHRpdGxlICovXG4uaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1zaG93LXRpdGxlIHtcbiAgLmhrLWNvZGVibG9jay10aXRsZSB7XG4gICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLXJpZ2h0OiB2YXIoLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLXRvcDogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctYm90dG9tOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWJhY2tncm91bmQtY29sb3IpO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1oay1jb2RlYmxvY2stYm9yZGVyLWNvbG9yKTtcbiAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLXRpdGxlLXRleHQtY29sb3IpO1xuXG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cblxuICAuaGstY29kZWJsb2NrLXRpdGxlfnByZSB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgfVxufVxuXG4vKiBjb2xsYXBzZSAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy10aXRsZS5oay1jb2RlYmxvY2stY29sbGFwc2libGUge1xuICAuaGstY29kZWJsb2NrLXRpdGxlIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICAgLmhrLWNvZGVibG9jay1jb2xsYXBzZS1idG5zIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB0b3A6IC0xcHg7XG4gICAgICBsZWZ0OiAtM3B4O1xuXG4gICAgICAuaGstY29kZWJsb2NrLWNvbGxhcHNlLWJ0biB7XG4gICAgICAgIHdpZHRoOiAxNnB4O1xuICAgICAgICBoZWlnaHQ6IDE2cHg7XG5cbiAgICAgICAgZmlsbDogdmFyKC0taGstY29kZWJsb2NrLXRpdGxlLXRleHQtY29sb3IpO1xuICAgICAgICBzdHJva2U6IHZhcigtLWhrLWNvZGVibG9jay10aXRsZS10ZXh0LWNvbG9yKTtcbiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyO1xuICAgICAgICBvcGFjaXR5OiAwLjI7XG5cbiAgICAgICAgJi5oay1jb2RlYmxvY2stY29sbGFwc2VkLWJ0biB7XG4gICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgfVxuXG4gICAgICAgICYuaGstY29kZWJsb2NrLWV4cGFuZGVkLWJ0biB7XG4gICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJi5oay1jb2RlYmxvY2stY29sbGFwc2VkIHtcbiAgICAuaGstY29kZWJsb2NrLXRpdGxlIHtcbiAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG5cbiAgICAgIC5oay1jb2RlYmxvY2stY29sbGFwc2UtYnRucyB7XG4gICAgICAgIC5oay1jb2RlYmxvY2stY29sbGFwc2UtYnRuIHtcbiAgICAgICAgICAmLmhrLWNvZGVibG9jay1jb2xsYXBzZWQtYnRuIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAmLmhrLWNvZGVibG9jay1leHBhbmRlZC1idG4ge1xuICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcmUge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuLyogbGluZW5vcyAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1saW5lbm9zIHtcbiAgcHJlIHtcbiAgICAuaGstY29kZWJsb2NrLWxpbmVub3Mge1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICBmbGV4LWdyb3c6IDA7XG4gICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07XG4gICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stbGluZW5vcy10ZXh0LWNvbG9yKTtcbiAgICAgIHdoaXRlLXNwYWNlOiBwcmU7XG4gICAgICBmb250LWZhbWlseTogdmFyKC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1mb250KTtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0taGstY29kZWJsb2NrLWZvbnQtc2l6ZSk7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcblxuICAgICAgJi5zaG93LXNwbGl0dGVyIHtcbiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcik7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMWVtO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiBoaWdobGlnaHQgKi9cbi5oay1jb2RlYmxvY2suaGstY29kZWJsb2NrLXNob3ctaGlnaGxpZ2h0IHtcbiAgcHJlIHtcbiAgICAuaGstY29kZWJsb2NrLWhpZ2hsaWdodCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIGxlZnQ6IDA7XG4gICAgICByaWdodDogMDtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBwYWRkaW5nLXRvcDogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgICAgcGFkZGluZy1ib3R0b206IHZhcigtLWhrLWNvZGVibG9jay12ZXJ0aWNhbC1wYWRkaW5nKTtcbiAgICAgIG9wYWNpdHk6IDAuMjtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stbGluZW5vcy10ZXh0LWZvbnQpO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1oay1jb2RlYmxvY2stZm9udC1zaXplKTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gICAgICAubGluZS5oaWdobGlnaHQge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2staGlnaGxpZ2h0LWJhY2tncm91bmQtY29sb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiBsYW5ndWFnZSAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1sYW5ndWFnZSB7XG4gIHByZSB7XG4gICAgLmhrLWNvZGVibG9jay1sYW5ndWFnZSB7XG4gICAgICBvcGFjaXR5OiAwLjQ7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHotaW5kZXg6IDE7XG4gICAgICBtYXJnaW46IDZweDtcbiAgICAgIHBhZGRpbmc6IDZweCA4cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWxhbmd1YWdlLXRleHQtY29sb3IpO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1zaXplKTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1mb250KTtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgIH1cblxuICAgICY6aG92ZXIgLmhrLWNvZGVibG9jay1sYW5ndWFnZSB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4vKiBjb3B5IGJ1dHRvbiAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1jb3B5YnRuIHtcbiAgcHJlIHtcbiAgICAuY29weS1jb2RlLWJ1dHRvbiB7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuICB9XG59XG5cbi8qIHByb21wdCAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1wcm9tcHQge1xuICBwcmUge1xuICAgIC5oay1jb2RlYmxvY2stcHJvbXB0IHtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgZmxleC1ncm93OiAwO1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgcGFkZGluZy1yaWdodDogMC44ZW07XG4gICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtY29sb3IpO1xuICAgICAgd2hpdGUtc3BhY2U6IHByZTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtZm9udCk7XG4gICAgICBmb250LXNpemU6IHZhcigtLWhrLWNvZGVibG9jay1mb250LXNpemUpO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8qIHJlc3VsdCAqL1xuLmhrLWNvZGVibG9jaysuaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1yZXN1bHQge1xuICBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWhrLWNvZGVibG9jay1tYXJnaW4pICogKC0xKSk7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1oay1jb2RlYmxvY2stYm9yZGVyLWNvbG9yKTtcblxuICAmOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1yZXN1bHQtcHJvbXB0KTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLXJlc3VsdC10ZXh0LWNvbG9yKTtcbiAgICBvcGFjaXR5OiAwLjY7XG4gICAgZm9udC1zaXplOiAwLjhlbTtcbiAgICBwYWRkaW5nLXRvcDogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctbGVmdDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1yaWdodDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gIH1cblxuICBwcmUge1xuICAgIG1hcmdpbi10b3A6IDA7XG5cbiAgICAuaGstY29kZWJsb2NrLXJlc3VsdC1jb2RlIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stcmVzdWx0LXRleHQtY29sb3IpO1xuICAgIH1cbiAgfVxufSJdLAogICJtYXBwaW5ncyI6ICI7QUFBQTtBQW9CRTtBQUNBOztBQXBCQTtBQUVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFNRjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7QUFDQTtBQUNBOztBQU9KO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBR0Y7QUFDRTs7QUFNRjtBQUNFO0FBQ0E7O0FBRUE7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFOztBQUdGO0FBQ0U7O0FBT047QUFDRTs7QUFJSTtBQUNFOztBQUdGO0FBQ0U7O0FBTVI7QUFDRTs7QUFRRjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7O0FBU0o7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDRTs7QUFTSjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdGO0FBQ0U7O0FBUUY7QUFDRTs7QUFRRjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFNTjtBQUNFO0FBQ0E7O0FBRUE7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdGO0FBQ0U7O0FBRUE7QUFDRTs7IiwKICAibmFtZXMiOiBbXQp9Cg== */ +/*# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3N0eWxlcy5zY3NzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIuaGstY29kZWJsb2NrIHtcbiAgJiB7XG4gICAgLy8gdmFyaWFibGVzXG4gICAgLS1oay1jb2RlYmxvY2stbWFyZ2luOiAxZW07XG4gICAgLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nOiAxNnB4O1xuICAgIC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmc6IDhweDtcbiAgICAtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2RlLWJhY2tncm91bmQpO1xuICAgIC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcjogdmFyKC0tZGl2aWRlci1jb2xvcik7IC8vIGFwcGxpZWQgdG8gdGl0bGUsIGxpbmVub3MsIGFuZCByZXN1bHRcbiAgICAtLWhrLWNvZGVibG9jay1mb250LXNpemU6IHZhcigtLWNvZGUtc2l6ZSk7XG4gICAgLS1oay1jb2RlYmxvY2stdGl0bGUtdGV4dC1jb2xvcjogdmFyKC0tdGV4dC1ub3JtYWwpO1xuICAgIC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1jb2xvcjogdmFyKC0tY29kZS1ub3JtYWwpO1xuICAgIC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1mb250OiB2YXIoLS1mb250LW1vbm9zcGFjZSk7XG4gICAgLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1jb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7IC8vIHNhbWUgd2l0aCBjb3B5IGJ1dHRvblxuICAgIC0taGstY29kZWJsb2NrLWxhbmd1YWdlLXRleHQtc2l6ZTogdmFyKC0tZm9udC11aS1zbWFsbGVyKTsgLy8gc2FtZSB3aXRoIGNvcHkgYnV0dG9uXG4gICAgLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1mb250OiB2YXIoLS1mb250LWludGVyZmFjZSk7IC8vIHNhbWUgd2l0aCBjb3B5IGJ1dHRvblxuICAgIC0taGstY29kZWJsb2NrLXByb21wdC10ZXh0LWNvbG9yOiB2YXIoLS1jb2RlLW5vcm1hbCk7XG4gICAgLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtZm9udDogdmFyKC0tZm9udC1tb25vc3BhY2UpO1xuICAgIC0taGstY29kZWJsb2NrLXJlc3VsdC10ZXh0LWNvbG9yOiB2YXIoLS10ZXh0LW5vcm1hbCk7XG4gIH1cblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbi1ib3R0b206IHZhcigtLWhrLWNvZGVibG9jay1tYXJnaW4pO1xuXG4gIHByZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZy10b3A6IHZhcigtLWhrLWNvZGVibG9jay12ZXJ0aWNhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLWJvdHRvbTogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctbGVmdDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1yaWdodDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWJhY2tncm91bmQtY29sb3IpO1xuXG4gICAgY29kZS5oay1jb2RlYmxvY2stY29kZSB7XG4gICAgICB3aGl0ZS1zcGFjZTogcHJlO1xuICAgICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stYmFja2dyb3VuZC1jb2xvcik7XG4gICAgfVxuICB9XG59XG5cbi8qIHRpdGxlICovXG4uaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1zaG93LXRpdGxlIHtcbiAgLmhrLWNvZGVibG9jay10aXRsZSB7XG4gICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLXJpZ2h0OiB2YXIoLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLXRvcDogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctYm90dG9tOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWJhY2tncm91bmQtY29sb3IpO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1oay1jb2RlYmxvY2stYm9yZGVyLWNvbG9yKTtcbiAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLXRpdGxlLXRleHQtY29sb3IpO1xuXG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cblxuICAuaGstY29kZWJsb2NrLXRpdGxlfnByZSB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgfVxufVxuXG4vKiBjb2xsYXBzZSAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy10aXRsZS5oay1jb2RlYmxvY2stY29sbGFwc2libGUge1xuICAuaGstY29kZWJsb2NrLXRpdGxlIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICAgLmhrLWNvZGVibG9jay1jb2xsYXBzZS1idG5zIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB0b3A6IC0xcHg7XG4gICAgICBsZWZ0OiAtM3B4O1xuXG4gICAgICAuaGstY29kZWJsb2NrLWNvbGxhcHNlLWJ0biB7XG4gICAgICAgIHdpZHRoOiAxNnB4O1xuICAgICAgICBoZWlnaHQ6IDE2cHg7XG5cbiAgICAgICAgZmlsbDogdmFyKC0taGstY29kZWJsb2NrLXRpdGxlLXRleHQtY29sb3IpO1xuICAgICAgICBzdHJva2U6IHZhcigtLWhrLWNvZGVibG9jay10aXRsZS10ZXh0LWNvbG9yKTtcbiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyO1xuICAgICAgICBvcGFjaXR5OiAwLjI7XG5cbiAgICAgICAgJi5oay1jb2RlYmxvY2stY29sbGFwc2VkLWJ0biB7XG4gICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgfVxuXG4gICAgICAgICYuaGstY29kZWJsb2NrLWV4cGFuZGVkLWJ0biB7XG4gICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJi5oay1jb2RlYmxvY2stY29sbGFwc2VkIHtcbiAgICAuaGstY29kZWJsb2NrLXRpdGxlIHtcbiAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG5cbiAgICAgIC5oay1jb2RlYmxvY2stY29sbGFwc2UtYnRucyB7XG4gICAgICAgIC5oay1jb2RlYmxvY2stY29sbGFwc2UtYnRuIHtcbiAgICAgICAgICAmLmhrLWNvZGVibG9jay1jb2xsYXBzZWQtYnRuIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAmLmhrLWNvZGVibG9jay1leHBhbmRlZC1idG4ge1xuICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcmUge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuLyogbGluZW5vcyAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1saW5lbm9zIHtcbiAgcHJlIHtcbiAgICAuaGstY29kZWJsb2NrLWxpbmVub3Mge1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICBmbGV4LWdyb3c6IDA7XG4gICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07XG4gICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stbGluZW5vcy10ZXh0LWNvbG9yKTtcbiAgICAgIHdoaXRlLXNwYWNlOiBwcmU7XG4gICAgICBmb250LWZhbWlseTogdmFyKC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1mb250KTtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0taGstY29kZWJsb2NrLWZvbnQtc2l6ZSk7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcblxuICAgICAgJi5zaG93LXNwbGl0dGVyIHtcbiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcik7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMWVtO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiBoaWdobGlnaHQgKi9cbi5oay1jb2RlYmxvY2suaGstY29kZWJsb2NrLXNob3ctaGlnaGxpZ2h0IHtcbiAgcHJlIHtcbiAgICAuaGstY29kZWJsb2NrLWhpZ2hsaWdodCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIGxlZnQ6IDA7XG4gICAgICByaWdodDogMDtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBwYWRkaW5nLXRvcDogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgICAgcGFkZGluZy1ib3R0b206IHZhcigtLWhrLWNvZGVibG9jay12ZXJ0aWNhbC1wYWRkaW5nKTtcbiAgICAgIG9wYWNpdHk6IDAuMjtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stbGluZW5vcy10ZXh0LWZvbnQpO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1oay1jb2RlYmxvY2stZm9udC1zaXplKTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gICAgICAubGluZS5oaWdobGlnaHQge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2staGlnaGxpZ2h0LWJhY2tncm91bmQtY29sb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiBsYW5ndWFnZSAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1sYW5ndWFnZSB7XG4gIHByZSB7XG4gICAgLmhrLWNvZGVibG9jay1sYW5ndWFnZSB7XG4gICAgICBvcGFjaXR5OiAwLjQ7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHotaW5kZXg6IDE7XG4gICAgICBtYXJnaW46IDZweDtcbiAgICAgIHBhZGRpbmc6IDZweCA4cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWxhbmd1YWdlLXRleHQtY29sb3IpO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1zaXplKTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1mb250KTtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgIH1cblxuICAgICY6aG92ZXIgLmhrLWNvZGVibG9jay1sYW5ndWFnZSB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4vKiBjb3B5IGJ1dHRvbiAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1jb3B5YnRuIHtcbiAgcHJlIHtcbiAgICAuY29weS1jb2RlLWJ1dHRvbiB7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuICB9XG59XG5cbi8qIHByb21wdCAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1wcm9tcHQge1xuICBwcmUge1xuICAgIC5oay1jb2RlYmxvY2stcHJvbXB0IHtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgZmxleC1ncm93OiAwO1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgcGFkZGluZy1yaWdodDogMC44ZW07XG4gICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtY29sb3IpO1xuICAgICAgd2hpdGUtc3BhY2U6IHByZTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtZm9udCk7XG4gICAgICBmb250LXNpemU6IHZhcigtLWhrLWNvZGVibG9jay1mb250LXNpemUpO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8qIHJlc3VsdCAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stcmVzdWx0IHtcbiAgbWFyZ2luLXRvcDogY2FsYyh2YXIoLS1oay1jb2RlYmxvY2stbWFyZ2luKSAqICgtMSkpO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcik7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yKTtcblxuICAuaGstY29kZWJsb2NrLXJlc3VsdC1wcm9tcHQge1xuICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stcmVzdWx0LXRleHQtY29sb3IpO1xuICAgIG9wYWNpdHk6IDAuNDtcbiAgICBmb250LXNpemU6IDAuOGVtO1xuICAgIHBhZGRpbmctdG9wOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLXJpZ2h0OiB2YXIoLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuXG4gIHByZSB7XG4gICAgbWFyZ2luLXRvcDogMDtcblxuICAgIC5oay1jb2RlYmxvY2stcmVzdWx0LWNvZGUge1xuICAgICAgY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay1yZXN1bHQtdGV4dC1jb2xvcik7XG4gICAgfVxuICB9XG59Il0sCiAgIm1hcHBpbmdzIjogIjtBQUFBO0FBb0JFO0FBQ0E7O0FBcEJBO0FBRUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQU1GO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7O0FBT0o7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHRjtBQUNFOztBQU1GO0FBQ0U7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0U7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0U7O0FBR0Y7QUFDRTs7QUFPTjtBQUNFOztBQUlJO0FBQ0U7O0FBR0Y7QUFDRTs7QUFNUjtBQUNFOztBQVFGO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0U7QUFDQTs7QUFTSjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFOztBQVNKO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0Y7QUFDRTs7QUFRRjtBQUNFOztBQVFGO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQU1OO0FBQ0U7QUFDQTtBQUNBOztBQUVBO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHRjtBQUNFOztBQUVBO0FBQ0U7OyIsCiAgIm5hbWVzIjogW10KfQo= */ diff --git a/dist/versions.json b/dist/versions.json index 841ea9b..ad3f8f1 100644 --- a/dist/versions.json +++ b/dist/versions.json @@ -2,5 +2,6 @@ "0.1.0": "1.0.0", "0.2.0": "1.0.0", "0.2.1": "1.0.0", - "0.3.0": "1.0.0" + "0.3.0": "1.0.0", + "0.3.1": "1.0.0" } diff --git a/manifest.json b/manifest.json index 0658a59..82ffdc4 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "hk-code-block", "name": "HK Code Block", - "version": "0.3.0", + "version": "0.3.1", "minAppVersion": "1.0.0", "description": "Obsidian plugin developed by Heekang Park; Make code block looking good on reading view", "author": "Heekang Park", diff --git a/package-lock.json b/package-lock.json index daf553f..28241ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "obsidian-hk-code-block", - "version": "0.2.2", + "version": "0.3.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "obsidian-hk-code-block", - "version": "0.2.2", + "version": "0.3.1", "license": "MIT", "devDependencies": { "@types/node": "^16.11.6", diff --git a/package.json b/package.json index 748490c..ec331fa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-hk-code-block", - "version": "0.3.0", + "version": "0.3.1", "description": "Obsidian plugin developed by Heekang Park; Make code block looking good on reading view", "main": "./dist/main.js", "scripts": { diff --git a/src/HKCodeBlockProcessor.ts b/src/HKCodeBlockProcessor.ts index abfd920..2085e7e 100755 --- a/src/HKCodeBlockProcessor.ts +++ b/src/HKCodeBlockProcessor.ts @@ -22,7 +22,16 @@ const REGEX = { NUMBER: /^-{0,1}\d+$/, } -function getMeta(view: MarkdownView, elem_code: HTMLElement, section_code: MarkdownSectionInformation, settings: HKCodeBlockSettings): { +function getMeta( + view: MarkdownView, + elem_code: HTMLElement, + elem_code_idx: number, + section_code: MarkdownSectionInformation, + settings: HKCodeBlockSettings +): { + isError: boolean, + lineStartInSection: number, + lineEndInSection: number, showTitle: (boolean | undefined), title: string, isCollapsible: (boolean | undefined), @@ -39,80 +48,111 @@ function getMeta(view: MarkdownView, elem_code: HTMLElement, section_code: Markd showPrompt: (boolean | undefined), prompt: string } { - const lineStart = (() => { - for(let i = section_code.lineStart; i <= section_code.lineEnd; i++) { - const line = view.editor.getLine(i); - if (line.trim().startsWith("```")) return i; - } - - return -1; - })(); - - const lineEnd = (() => { - for(let i = section_code.lineEnd; i >= section_code.lineStart; i--) { - const line = view.editor.getLine(i); - if (line.trim().startsWith("```")) return i; - } - - return -1; - })(); - - if (lineStart < 0 || lineEnd < 0 || lineStart >= lineEnd) { - throw new Error("Cannot find the first line or the last line of the code block"); + const return_value: { + isError: boolean, + lineStartInSection: number, + lineEndInSection: number, + showTitle: (boolean | undefined), + title: string, + isCollapsible: (boolean | undefined), + showLinenos: (boolean | undefined), + linenosStart: number, + linenosNum: number, + showHighlight: (boolean | undefined), + highlightLines: number[], + showLanguage: (boolean | undefined), + language: string, + showCopyBtn: (boolean | undefined), + isResult: boolean, + resultPrompt: string, + showPrompt: (boolean | undefined), + prompt: string + } = { + isError: false, + lineStartInSection: -1, + lineEndInSection: -1, + showTitle: undefined, + title: "", + isCollapsible: undefined, + showLinenos: undefined, + linenosStart: settings.defaultLinenosStart, + linenosNum: 0, + showHighlight: undefined, + highlightLines: [], + showLanguage: undefined, + language: settings.defaultLanguage, + showCopyBtn: undefined, + isResult: false, + resultPrompt: settings.defaultResultPrompt, + showPrompt: undefined, + prompt: settings.defaultPrompt } - const firstline = view.editor.getLine(lineStart) + " "; // add a space to the end of the line to make sure the regex works + let marker_count = 0; + for (let i = section_code.lineStart; i <= section_code.lineEnd; i++) { + const line = view.editor.getLine(i); + if (line.trim().startsWith("```")) marker_count++; + + if (return_value.lineStartInSection === -1 && marker_count === elem_code_idx * 2 + 1) { + return_value.lineStartInSection = i; + } + + if (return_value.lineEndInSection === -1 && marker_count === elem_code_idx * 2 + 2) { + return_value.lineEndInSection = i; + break; + } + } + + if (return_value.lineStartInSection < 0 || return_value.lineEndInSection < 0 || return_value.lineStartInSection >= return_value.lineEndInSection) { + return_value.isError = true; + return return_value; + } + + const firstline = view.editor.getLine(return_value.lineStartInSection).trim() + " "; // add a space to the end of the line to make sure the regex works // title - let showTitle: (boolean | undefined) = undefined; - let title = ""; const regexResult_title = REGEX.TITLE.exec(firstline); if (regexResult_title) { - showTitle = true; - title = regexResult_title[1] || regexResult_title[2]; + return_value.showTitle = true; + return_value.title = regexResult_title[1] || regexResult_title[2]; } // collapsible - let isCollapsible: (boolean | undefined) = undefined; const regexResult_collapsibleSimple = REGEX.COLLAPSIBLE_SIMPLE.exec(firstline); const regexResult_collapsibleComplicate = REGEX.COLLAPSIBLE_COMPLICATE.exec(firstline); if (regexResult_collapsibleSimple) { - isCollapsible = true; + return_value.isCollapsible = true; } else if (regexResult_collapsibleComplicate) { if (regexResult_collapsibleComplicate[1] === "true") { - isCollapsible = true; + return_value.isCollapsible = true; } else if (regexResult_collapsibleComplicate[1] === "false") { - isCollapsible = false; + return_value.isCollapsible = false; } } // linenos - let showLinenos: (boolean | undefined) = undefined; - let linenosStart = settings.defaultLinenosStart; - const linenosNum = lineEnd - lineStart - 1; + return_value.linenosNum = return_value.lineEndInSection - return_value.lineStartInSection - 1; const regexResult_linenosSimple = REGEX.LINENOS_SIMPLE.exec(firstline); const regexResult_linenosComplicate = REGEX.LINENOS_COMPLICATE.exec(firstline); if (regexResult_linenosSimple) { - showLinenos = true; + return_value.showLinenos = true; } else if (regexResult_linenosComplicate) { if (regexResult_linenosComplicate[1] === "true") { - showLinenos = true; + return_value.showLinenos = true; } else if (regexResult_linenosComplicate[1] === "false") { - showLinenos = false; + return_value.showLinenos = false; } else { - showLinenos = true; - linenosStart = parseInt(regexResult_linenosComplicate[2]) || 1; + return_value.showLinenos = true; + return_value.linenosStart = parseInt(regexResult_linenosComplicate[2]) || 1; } } // highlight - let showHighlight: (boolean | undefined) = undefined; - let highlightLines: number[] = []; const regexResult_highlight = REGEX.HIGHLIGHT.exec(firstline); if (regexResult_highlight) { - showHighlight = true; + return_value.showHighlight = true; const highlightLines_str = regexResult_highlight[1] || regexResult_highlight[2]; - highlightLines = highlightLines_str.split(",").map((item) => { + let highlightLines = highlightLines_str.split(",").map((item) => { item = item.trim(); if (REGEX.NUMBER.test(item)) return parseInt(item); @@ -132,108 +172,85 @@ function getMeta(view: MarkdownView, elem_code: HTMLElement, section_code: Markd if (highlightLines.some((line) => isNaN(line))) { // if any element is nan, then set showHighlight to false - showHighlight = undefined; - highlightLines = []; + return_value.showHighlight = undefined; + return_value.highlightLines = []; } else { // use only valid line numbers - highlightLines = highlightLines.filter((line) => line >= linenosStart && line < linenosStart + linenosNum); + return_value.highlightLines = highlightLines.filter( + (line) => line >= return_value.linenosStart && line < return_value.linenosStart + return_value.linenosNum + ); } } // language - let showLanguage: (boolean | undefined) = undefined; - let language = (() => { - let language = settings.defaultLanguage; - elem_code.classList.forEach((className) => { - const regexResult_languageFromClass = REGEX.LANGUAGE_FROM_CLASS.exec(className.trim()); - if (regexResult_languageFromClass) language = regexResult_languageFromClass[1]; - }); - - return language; - })(); + elem_code.classList.forEach((className) => { + const regexResult_languageFromClass = REGEX.LANGUAGE_FROM_CLASS.exec(className.trim()); + if (regexResult_languageFromClass) { + return_value.language = regexResult_languageFromClass[1]; + } + }); const regexResult_languageSimple = REGEX.LANGUAGE_SIMPLE.exec(firstline); const regexResult_languageComplicate = REGEX.LANGUAGE_COMPLICATE.exec(firstline); if (regexResult_languageSimple) { - showLanguage = true; + return_value.showLanguage = true; } else if (regexResult_languageComplicate) { if (regexResult_languageComplicate[1] === "true") { - showLanguage = true; + return_value.showLanguage = true; } else if (regexResult_languageComplicate[1] === "false") { - showLanguage = false; + return_value.showLanguage = false; } else { - showLanguage = true; - language = regexResult_languageComplicate[2] || regexResult_languageComplicate[3]; + return_value.showLanguage = true; + return_value.language = regexResult_languageComplicate[2] || regexResult_languageComplicate[3]; } } // copy button - let showCopyBtn: (boolean | undefined) = undefined; const regexResult_copyBtnSimple = REGEX.COPYBTN_SIMPLE.exec(firstline); const regexResult_copyBtnComplicate = REGEX.COPYBTN_COMPLICATE.exec(firstline); if (regexResult_copyBtnSimple) { - showCopyBtn = true; + return_value.showCopyBtn = true; } else if (regexResult_copyBtnComplicate) { if (regexResult_copyBtnComplicate[1] === "true") { - showCopyBtn = true; + return_value.showCopyBtn = true; } else if (regexResult_copyBtnComplicate[1] === "false") { - showCopyBtn = false; + return_value.showCopyBtn = false; } } // prompt - let showPrompt: (boolean | undefined) = undefined; - let prompt = settings.defaultPrompt; const regexResult_promptSimple = REGEX.PROMPT_SIMPLE.exec(firstline); const regexResult_promptComplicate = REGEX.PROMPT_COMPLICATE.exec(firstline); if (regexResult_promptSimple) { - showPrompt = true; + return_value.showPrompt = true; } else if (regexResult_promptComplicate) { if (regexResult_promptComplicate[1] === "true") { - showPrompt = true; + return_value.showPrompt = true; } else if (regexResult_promptComplicate[1] === "false") { - showPrompt = false; + return_value.showPrompt = false; } else { - showPrompt = true; - prompt = regexResult_promptComplicate[2] || regexResult_promptComplicate[3]; + return_value.showPrompt = true; + return_value.prompt = regexResult_promptComplicate[2] || regexResult_promptComplicate[3]; } } // result - let isResult = false; - let resultPrompt = settings.defaultResultPrompt; const regexResult_result = REGEX.RESULT.exec(firstline); const regexResultPrompt_result = REGEX.PROMPT_COMPLICATE.exec(firstline); if (regexResult_result) { - isResult = true; + return_value.isResult = true; // override other meta data : only linenos, highlight are available - showTitle = false; - showLanguage = false; - showCopyBtn = false; - showPrompt = false; + return_value.showTitle = false; + return_value.showLanguage = false; + return_value.showCopyBtn = false; + return_value.showPrompt = false; if (regexResultPrompt_result) { - resultPrompt = regexResultPrompt_result[2] || regexResultPrompt_result[3]; + return_value.resultPrompt = regexResultPrompt_result[2] || regexResultPrompt_result[3]; } } - return { - showTitle: showTitle, - title: title, - isCollapsible: isCollapsible, - showLinenos: showLinenos, - linenosStart: linenosStart, - linenosNum: linenosNum, - showHighlight: showHighlight, - highlightLines: highlightLines, - showLanguage: showLanguage, - language: language, - showCopyBtn: showCopyBtn, - isResult: isResult, - resultPrompt: resultPrompt, - showPrompt: showPrompt, - prompt: prompt - }; + return return_value; } export async function HKCodeBlockProcessor( @@ -246,59 +263,72 @@ export async function HKCodeBlockProcessor( const view = app.workspace.getActiveViewOfType(MarkdownView); if (!view) return; - const elem_code: (HTMLElement | null) = el.querySelector("pre:not(.frontmatter) > code"); // skip front matter - if (!elem_code) return; + /* Note: + // - get all code blocks : obsidian markdown parser sometimes pass multiple code blocks + // - skip front matter + */ + const elem_codes: NodeListOf = el.querySelectorAll("pre:not(.frontmatter) > code"); + if (elem_codes.length === 0) return; - const elem_pre: (HTMLElement | null) = elem_code.parentElement; - if (!elem_pre) return; + elem_codes.forEach((elem_code: HTMLElement, elem_code_idx: number) => { + const elem_pre: (HTMLElement | null) = elem_code.parentElement; + if (!elem_pre) return; - const elem_div: (HTMLElement | null) = elem_pre.parentElement; - if (!elem_div) return; + const elem_pre_parent: (HTMLElement | null) = elem_pre.parentElement; + if (!elem_pre_parent) return; - const elem_copyBtn: (HTMLElement | null) = elem_div.querySelector(".copy-code-button"); - if (!elem_copyBtn) return; + const elem_copyBtn: (HTMLElement | null) = elem_pre.querySelector(".copy-code-button"); + if (!elem_copyBtn) return; - const section_code: (MarkdownSectionInformation | null) = context.getSectionInfo(elem_code); - if (!section_code) return; + const section_code: (MarkdownSectionInformation | null) = context.getSectionInfo(elem_code); + if (!section_code) return; - // get metadata - let - showTitle: (boolean | undefined), - title: string, - isCollapsible: (boolean | undefined), - showLinenos: (boolean | undefined), - linenosStart: number, - linenosNum: number, - showHighlight: (boolean | undefined), - highlightLines: number[], - showLanguage: (boolean | undefined), - language: string, - showCopyBtn: (boolean | undefined), - isResult: boolean, - resultPrompt: string, - showPrompt: (boolean | undefined), - prompt: string; - try { - ({ - showTitle: showTitle, - title: title, - isCollapsible: isCollapsible, - showLinenos: showLinenos, - linenosStart: linenosStart, - linenosNum: linenosNum, - showHighlight: showHighlight, - highlightLines: highlightLines, - showLanguage: showLanguage, - language: language, - showCopyBtn: showCopyBtn, - isResult: isResult, - resultPrompt: resultPrompt, - showPrompt: showPrompt, - prompt: prompt, - } = getMeta(view, elem_code, section_code, settings)); - + // get metadata + const { + isError, + lineStartInSection, + lineEndInSection, + showTitle, + title, + isCollapsible, + showLinenos, + linenosStart, + linenosNum, + showHighlight, + highlightLines, + showLanguage, + language, + showCopyBtn, + isResult, + resultPrompt, + showPrompt, + prompt, + }: { + isError: boolean, + lineStartInSection: number, + lineEndInSection: number, + showTitle: (boolean | undefined), + title: string, + isCollapsible: (boolean | undefined), + showLinenos: (boolean | undefined), + linenosStart: number, + linenosNum: number, + showHighlight: (boolean | undefined), + highlightLines: number[], + showLanguage: (boolean | undefined), + language: string, + showCopyBtn: (boolean | undefined), + isResult: boolean, + resultPrompt: string, + showPrompt: (boolean | undefined), + prompt: string + } = getMeta(view, elem_code, elem_code_idx, section_code, settings); + if (isError) return; if (settings.debugMode) { console.log({ + isError: isError, + lineStartInSection: lineStartInSection, + lineEndInSection: lineEndInSection, showTitle: showTitle, title: title, isCollapsible: isCollapsible, @@ -316,159 +346,178 @@ export async function HKCodeBlockProcessor( prompt: prompt, }) } - } catch (e) { // if cannot find metadata, skip this code block - return; - } - // create HTML elements - elem_div.classList.add("hk-codeblock"); - elem_code.classList.add("hk-codeblock-code"); - elem_copyBtn.remove(); // remove the original copy button as default + // create HTML elements + const elem_div: HTMLElement = document.createElement("div"); + elem_pre_parent.replaceChild(elem_div, elem_pre); + elem_div.appendChild(elem_pre); - let elem_title: (HTMLElement | undefined) = undefined; - if (settings.useTitleGlobal === "default off, but on when specified" && (showTitle === true)) { - elem_div.classList.add("hk-codeblock-show-title"); + elem_div.classList.add("hk-codeblock"); + elem_code.classList.add("hk-codeblock-code"); + elem_copyBtn.remove(); // remove the original copy button as default - elem_title = document.createElement("div"); - elem_title.classList.add("hk-codeblock-title"); - elem_title.innerHTML = title; - elem_div.insertBefore(elem_title, elem_pre); - } + let elem_title: (HTMLElement | undefined) = undefined; + if (settings.useTitleGlobal === "default off, but on when specified" && (showTitle === true)) { + elem_div.classList.add("hk-codeblock-show-title"); - if ( - (settings.useCollapsibleGlobal === "always on") || - (settings.useCollapsibleGlobal === "default on, but off when specified" && (isCollapsible === undefined || isCollapsible === true)) || - (settings.useCollapsibleGlobal === "default off, but on when specified" && (isCollapsible === true)) - ) { - elem_div.classList.add("hk-codeblock-collapsible"); - - if (settings.defaultCollapse === "collapse") { - elem_div.classList.add("hk-codeblock-collapsed"); + elem_title = document.createElement("div"); + elem_title.classList.add("hk-codeblock-title"); + elem_title.innerHTML = title; + elem_div.insertBefore(elem_title, elem_pre); } - if (elem_title) { - elem_title.addEventListener("click", (ev) => { - ev.stopPropagation(); - ev.preventDefault(); - if (elem_div.classList.contains("hk-codeblock-collapsed")) { - elem_div.classList.remove("hk-codeblock-collapsed"); - } else { + if ( + (settings.useCollapsibleGlobal === "always on") || + (settings.useCollapsibleGlobal === "default on, but off when specified" && (isCollapsible === undefined || isCollapsible === true)) || + (settings.useCollapsibleGlobal === "default off, but on when specified" && (isCollapsible === true)) + ) { + if (elem_title) { + elem_div.classList.add("hk-codeblock-collapsible"); + + if (settings.defaultCollapse === "collapse") { elem_div.classList.add("hk-codeblock-collapsed"); } - }); - const elem_collapseBtns = document.createElement("div"); - elem_collapseBtns.classList.add("hk-codeblock-collapse-btns"); + elem_title.addEventListener("click", (ev) => { + ev.stopPropagation(); + ev.preventDefault(); + elem_div.classList.toggle("hk-codeblock-collapsed"); + }); - const elem_collapseBtn = document.createElement("div"); - elem_collapseBtn.classList.add("hk-codeblock-collapse-btn", "hk-codeblock-collapsed-btn"); - elem_collapseBtn.innerHTML = ` + const elem_collapseBtns = document.createElement("div"); + elem_collapseBtns.classList.add("hk-codeblock-collapse-btns"); + + const elem_collapseBtn = document.createElement("div"); + elem_collapseBtn.classList.add("hk-codeblock-collapse-btn", "hk-codeblock-collapsed-btn"); + elem_collapseBtn.innerHTML = ` `; - elem_collapseBtns.appendChild(elem_collapseBtn); + elem_collapseBtns.appendChild(elem_collapseBtn); - const elem_expandBtn = document.createElement("div"); - elem_expandBtn.classList.add("hk-codeblock-collapse-btn", "hk-codeblock-expanded-btn"); - elem_expandBtn.innerHTML = ` + const elem_expandBtn = document.createElement("div"); + elem_expandBtn.classList.add("hk-codeblock-collapse-btn", "hk-codeblock-expanded-btn"); + elem_expandBtn.innerHTML = ` `; - elem_collapseBtns.appendChild(elem_expandBtn); + elem_collapseBtns.appendChild(elem_expandBtn); - elem_title.prepend(elem_collapseBtns); - } - } - - - if ( - (settings.useLinenosGlobal === "always on") || - (settings.useLinenosGlobal === "default on, but off when specified" && (showLinenos === undefined || showLinenos === true)) || - (settings.useLinenosGlobal === "default off, but on when specified" && (showLinenos === true)) - ) { - elem_div.classList.add("hk-codeblock-show-linenos"); - - const elem_linenos = document.createElement("div"); - elem_linenos.classList.add("hk-codeblock-linenos"); - elem_linenos.innerText = Array(linenosNum).fill(0).map((_, idx) => idx + linenosStart).join("\n"); - elem_pre.insertBefore(elem_linenos, elem_code); - - if (settings.showLinenosSplitter) { - elem_linenos.classList.add("show-splitter"); - } - } - - if (settings.useHighlightGlobal === "default off, but on when specified" && (showHighlight === true)) { - elem_div.classList.add("hk-codeblock-show-highlight"); - - elem_div.style.setProperty("--hk-codeblock-highlight-background-color", settings.highlightColor); - - const elem_highlight = document.createElement("div"); - elem_highlight.classList.add("hk-codeblock-highlight"); - elem_highlight.innerHTML = Array(linenosNum).fill(0).map((_, idx) => { - const classNames: string[] = []; - if (highlightLines.includes(idx + linenosStart)) classNames.push("highlight"); - return ` `; - }).join("\n"); - elem_pre.insertBefore(elem_highlight, elem_code); - } - - if ( - (settings.useLanguageGlobal === "always on") || - (settings.useLanguageGlobal === "default on, but off when specified" && (showLanguage === undefined || showLanguage === true)) || - (settings.useLanguageGlobal === "default off, but on when specified" && (showLanguage === true)) - ) { - elem_div.classList.add("hk-codeblock-show-language"); - - const elem_language = document.createElement("div"); - elem_language.classList.add("hk-codeblock-language"); - elem_language.innerText = language; - elem_pre.prepend(elem_language); - } - - if ( - (settings.useCopyBtnGlobal === "always on") || - (settings.useCopyBtnGlobal === "default on, but off when specified" && (showCopyBtn === undefined || showCopyBtn === true)) || - (settings.useCopyBtnGlobal === "default off, but on when specified" && (showCopyBtn === true)) - ) { - elem_div.classList.add("hk-codeblock-show-copybtn"); - - elem_pre.appendChild(elem_copyBtn); - } - - if ( - (settings.usePromptGlobal === "always on" && settings.promptingLanguages.includes(language)) || - (settings.usePromptGlobal === "default on, but off when specified" && settings.promptingLanguages.includes(language) && (showPrompt === undefined || showPrompt === true)) || - (settings.usePromptGlobal === "default off, but on when specified" && (showPrompt === true)) - ) { - elem_div.classList.add("hk-codeblock-show-prompt"); - - const elem_prompt = document.createElement("div"); - elem_prompt.classList.add("hk-codeblock-prompt"); - - const lines = elem_code.innerText.split("\n"); - elem_prompt.innerText = Array(linenosNum).fill(0).map((_, idx) => { - if (idx < 0 || idx >= lines.length) return null; - - const line = lines[idx].trim(); - const prevLine = idx > 0 ? lines[idx - 1].trim() : ""; - - if ( - (line === "") || // check if the line is empty - (line.startsWith("#")) || // check if the line is a comment - (prevLine.endsWith("\\")) // check if the line is a continuation of the previous line - ) { - return " ".repeat(prompt.length); + elem_title.prepend(elem_collapseBtns); } + } - return prompt; - }).filter((line) => line !== null).join("\n"); - elem_pre.insertBefore(elem_prompt, elem_code); - } + if ( + (settings.useLinenosGlobal === "always on") || + (settings.useLinenosGlobal === "default on, but off when specified" && (showLinenos === undefined || showLinenos === true)) || + (settings.useLinenosGlobal === "default off, but on when specified" && (showLinenos === true)) + ) { + elem_div.classList.add("hk-codeblock-show-linenos"); - if (settings.useResultGlobal === "enable" && (isResult === true)) { - elem_div.classList.add("hk-codeblock-result"); - elem_code.classList.add("hk-codeblock-result-code"); + const elem_linenos = document.createElement("div"); + elem_linenos.classList.add("hk-codeblock-linenos"); + elem_linenos.innerText = Array(linenosNum).fill(0).map((_, idx) => idx + linenosStart).join("\n"); + elem_pre.insertBefore(elem_linenos, elem_code); - elem_div.setAttribute("data-result-prompt", resultPrompt); - } + if (settings.showLinenosSplitter) { + elem_linenos.classList.add("show-splitter"); + } + } + + if (settings.useHighlightGlobal === "default off, but on when specified" && (showHighlight === true)) { + elem_div.classList.add("hk-codeblock-show-highlight"); + + elem_div.style.setProperty("--hk-codeblock-highlight-background-color", settings.highlightColor); + + const elem_highlight = document.createElement("div"); + elem_highlight.classList.add("hk-codeblock-highlight"); + elem_highlight.innerHTML = Array(linenosNum).fill(0).map((_, idx) => { + const classNames: string[] = []; + if (highlightLines.includes(idx + linenosStart)) classNames.push("highlight"); + return ` `; + }).join("\n"); + elem_pre.insertBefore(elem_highlight, elem_code); + } + + if ( + (settings.useLanguageGlobal === "always on") || + (settings.useLanguageGlobal === "default on, but off when specified" && (showLanguage === undefined || showLanguage === true)) || + (settings.useLanguageGlobal === "default off, but on when specified" && (showLanguage === true)) + ) { + elem_div.classList.add("hk-codeblock-show-language"); + + const elem_language = document.createElement("div"); + elem_language.classList.add("hk-codeblock-language"); + elem_language.innerText = language; + elem_pre.prepend(elem_language); + } + + if ( + (settings.useCopyBtnGlobal === "always on") || + (settings.useCopyBtnGlobal === "default on, but off when specified" && (showCopyBtn === undefined || showCopyBtn === true)) || + (settings.useCopyBtnGlobal === "default off, but on when specified" && (showCopyBtn === true)) + ) { + elem_div.classList.add("hk-codeblock-show-copybtn"); + + elem_pre.appendChild(elem_copyBtn); + } + + if ( + (settings.usePromptGlobal === "always on" && settings.promptingLanguages.includes(language)) || + (settings.usePromptGlobal === "default on, but off when specified" && settings.promptingLanguages.includes(language) && (showPrompt === undefined || showPrompt === true)) || + (settings.usePromptGlobal === "default off, but on when specified" && (showPrompt === true)) + ) { + elem_div.classList.add("hk-codeblock-show-prompt"); + + const elem_prompt = document.createElement("div"); + elem_prompt.classList.add("hk-codeblock-prompt"); + + const lines = elem_code.innerText.split("\n"); + elem_prompt.innerText = Array(linenosNum).fill(0).map((_, idx) => { + if (idx < 0 || idx >= lines.length) return null; + + const line = lines[idx].trim(); + const prevLine = idx > 0 ? lines[idx - 1].trim() : ""; + + if ( + (line === "") || // check if the line is empty + (line.startsWith("#")) || // check if the line is a comment + (prevLine.endsWith("\\")) // check if the line is a continuation of the previous line + ) { + return " ".repeat(prompt.length); + } + + return prompt; + }).filter((line) => line !== null).join("\n"); + + elem_pre.insertBefore(elem_prompt, elem_code); + } + + if (settings.useResultGlobal === "enable" && (isResult === true)) { + const isCodeBlockAdjacent = ((): boolean => { + let line_idx = lineStartInSection - 1; + while (line_idx >= 0) { + const line = view.editor.getLine(line_idx).trim(); + if (line.length === 0) { + line_idx--; + continue; + } else if (line === "```") { + return true; + } else { + return false; + } + } + return false; + })(); + + if (isCodeBlockAdjacent) { + elem_div.classList.add("hk-codeblock-result"); + elem_code.classList.add("hk-codeblock-result-code"); + + const elem_result_prompt = document.createElement("div"); + elem_result_prompt.classList.add("hk-codeblock-result-prompt"); + elem_result_prompt.innerText = resultPrompt; + elem_div.insertBefore(elem_result_prompt, elem_pre); + } + } + }); } \ No newline at end of file diff --git a/src/styles.scss b/src/styles.scss index 7ca9cd7..90e4d8a 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -227,19 +227,20 @@ } /* result */ -.hk-codeblock+.hk-codeblock.hk-codeblock-result { +.hk-codeblock.hk-codeblock-result { margin-top: calc(var(--hk-codeblock-margin) * (-1)); border-top: 1px solid var(--hk-codeblock-border-color); + background-color: var(--hk-codeblock-background-color); - &::before { - content: attr(data-result-prompt); - display: block; + .hk-codeblock-result-prompt { color: var(--hk-codeblock-result-text-color); - opacity: 0.6; + opacity: 0.4; font-size: 0.8em; padding-top: var(--hk-codeblock-vertical-padding); padding-left: var(--hk-codeblock-horizontal-padding); padding-right: var(--hk-codeblock-horizontal-padding); + user-select: none; + pointer-events: none; } pre { diff --git a/versions.json b/versions.json index 841ea9b..ad3f8f1 100644 --- a/versions.json +++ b/versions.json @@ -2,5 +2,6 @@ "0.1.0": "1.0.0", "0.2.0": "1.0.0", "0.2.1": "1.0.0", - "0.3.0": "1.0.0" + "0.3.0": "1.0.0", + "0.3.1": "1.0.0" }