/* THIS IS A GENERATED/BUNDLED FILE BY ROLLUP if you want to view the source visit the plugins github repository */ 'use strict'; var obsidian = require('obsidian'); var state = require('@codemirror/state'); var view = require('@codemirror/view'); /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } const DEFAULT_SETTINGS = { moveIntoMath_toggle: true, autoCloseMath_toggle: true, autoCloseRound_toggle: true, autoCloseSquare_toggle: true, autoCloseCurly_toggle: true, addAlignBlock_toggle: true, addAlignBlock_parameter: "align*", addMatrixBlock_toggle: true, addMatrixBlock_parameter: "pmatrix", addCasesBlock_toggle: true, autoFraction_toggle: true, autoLargeBracket_toggle: true, autoSumLimit_toggle: true, autoEncloseSup_toggle: true, autoEncloseSub_toggle: true, encloseSelection_toggle: true, customShorthand_toggle: true, customShorthand_parameter: "bi:\\binom{#cursor}{#tab};\nsq:\\sqrt{};\nbb:\\mathbb{};\nbf:\\mathbf{};\nte:\\text{};\ninf:\\infty;\n" + "cd:\\cdot;\nqu:\\quad;\nti:\\times;\n" + "al:\\alpha;\nbe:\\beta;\nga:\\gamma;\nGa:\\Gamma;\n" + "de:\\delta;\nDe:\\Delta;\nep:\\epsilon;\nze:\\zeta;\n" + "et:\\eta;\nth:\\theta;\nTh:\\Theta;\nio:\\iota;\n" + "ka:\\kappa;\nla:\\lambda;\nLa:\\Lambda;\nmu:\\mu;\n" + "nu:\\nu;\nxi:\\xi;\nXi:\\Xi;\npi:\\pi;\nPi:\\Pi;\n" + "rh:\\rho;\nsi:\\sigma;\nSi:\\Sigma;\nta:\\tau;\n" + "up:\\upsilon;\nUp:\\Upsilon;\nph:\\phi;\nPh:\\Phi;\nch:\\chi;\n" + "ps:\\psi;\nPs:\\Psi;\nom:\\omega;\nOm:\\Omega" }; class QuickLatexPlugin extends obsidian.Plugin { constructor() { super(...arguments); this.vimAllow_autoCloseMath = true; this.makeExtensionThing = () => state.Prec.high(view.keymap.of([ { key: '$', run: () => { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return false; const editor = view.editor; if (editor.getSelection().length > 0) { // enclose selected text if (this.settings.encloseSelection_toggle) { const anchor = editor.getCursor("anchor"); const head = editor.getCursor("head"); editor.replaceSelection(`$${editor.getSelection()}$`); if (anchor.line > head.line) { editor.setSelection({ line: anchor.line, ch: anchor.ch }, { line: head.line, ch: head.ch + 1 }); } else if (anchor.line < head.line) { editor.setSelection({ line: anchor.line, ch: anchor.ch + 1 }, { line: head.line, ch: head.ch }); } else { editor.setSelection({ line: anchor.line, ch: anchor.ch + 1 }, { line: head.line, ch: head.ch + 1 }); } return true; } return false; } else { // close math symbol const position = editor.getCursor(); const prev_char = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch }); const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 }); const next2_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 }); if (prev_char != "$" && next_char == "$") { if (next2_char == "$$") { editor.setCursor({ line: position.line, ch: position.ch + 2 }); return true; } else { editor.setCursor({ line: position.line, ch: position.ch + 1 }); return true; } } // auto close math if (this.settings.autoCloseMath_toggle && this.vimAllow_autoCloseMath) { editor.replaceSelection("$"); } // move into math if (this.settings.moveIntoMath_toggle) { const position = editor.getCursor(); const t = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch }); const t2 = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 }); const t_2 = editor.getRange({ line: position.line, ch: position.ch - 2 }, { line: position.line, ch: position.ch }); if (t == '$' && t2 != '$') { editor.setCursor({ line: position.line, ch: position.ch - 1 }); } else if (t_2 == '$$') { editor.setCursor({ line: position.line, ch: position.ch - 1 }); } } return false; } }, }, { key: 'Tab', run: () => { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return false; const editor = view.editor; // Tab shortcut for matrix block if (this.settings.addMatrixBlock_toggle) { if (this.withinAnyBrackets_document(editor, '\\begin{' + this.settings.addMatrixBlock_parameter, '\\end{' + this.settings.addMatrixBlock_parameter)) { editor.replaceSelection(' & '); return true; } } // Tab shortcut for cases block if (this.settings.addCasesBlock_toggle) { if (this.withinAnyBrackets_document(editor, '\\begin{cases}', '\\end{cases}')) { editor.replaceSelection(' & '); return true; } } // Tab to go to next #tab const position = editor.getCursor(); const current_line = editor.getLine(position.line); const tab_position = current_line.indexOf("#tab"); if (tab_position != -1) { editor.replaceRange("", { line: position.line, ch: tab_position }, { line: position.line, ch: tab_position + 4 }); editor.setCursor({ line: position.line, ch: tab_position }); return true; } return false; }, }, { key: 'Space', run: () => { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return false; const editor = view.editor; if (!this.settings.autoFraction_toggle && !this.settings.autoLargeBracket_toggle && !this.settings.autoEncloseSup_toggle && !this.settings.autoEncloseSub_toggle && !this.settings.customShorthand_toggle) return false; if (this.withinMath(editor)) { const position = editor.getCursor(); const current_line = editor.getLine(position.line); const last_dollar = current_line.lastIndexOf('$', position.ch - 1); // check for custom shorthand if (this.settings.customShorthand_toggle && !this.withinText(editor, position.ch)) { let keyword = ""; let keyword_length = 0; for (let i = 0; i < this.shorthand_array.length; i++) { keyword_length = this.shorthand_array[i][0].length; if (keyword_length > position.ch) { continue; } else if (keyword_length == position.ch) { keyword = "@" + editor.getRange({ line: position.line, ch: position.ch - keyword_length }, { line: position.line, ch: position.ch }); } else { keyword = editor.getRange({ line: position.line, ch: position.ch - keyword_length - 1 }, { line: position.line, ch: position.ch }); } if (keyword[0].toLowerCase() == keyword[0].toUpperCase() || keyword[0] == "@") { if (this.shorthand_array[i][0] == keyword.slice(-keyword_length) && this.shorthand_array[i][1] != keyword) { const replace_slash = (keyword[0] == "\\" && this.shorthand_array[i][1][0] == "\\") ? 1 : 0; const set_cursor_position = this.shorthand_array[i][1].indexOf("#cursor"); editor.replaceRange(this.shorthand_array[i][1], { line: position.line, ch: position.ch - keyword_length - replace_slash }, { line: position.line, ch: position.ch }); if (set_cursor_position != -1) { editor.replaceRange("", { line: position.line, ch: position.ch - keyword_length + set_cursor_position }, { line: position.line, ch: position.ch - keyword_length + set_cursor_position + 7 }); editor.setCursor({ line: position.line, ch: position.ch - keyword_length + set_cursor_position }); } else if (this.shorthand_array[i][1].slice(-2) == "{}") { editor.setCursor({ line: position.line, ch: position.ch + this.shorthand_array[i][1].length - keyword_length - 1 - replace_slash }); } else ; return true; } } } } // find last unbracketed subscript within last 10 characters and perform autoEncloseSub // ignore expression that contain + - * / ^ const last_math = current_line.lastIndexOf('$', position.ch - 1); if (this.settings.autoEncloseSub_toggle) { let last_subscript = current_line.lastIndexOf('_', position.ch); if (last_subscript != -1 && last_subscript > last_math) { const letter_after_subscript = editor.getRange({ line: position.line, ch: last_subscript + 1 }, { line: position.line, ch: last_subscript + 2 }); if (letter_after_subscript != "{" && (position.ch - last_subscript) <= 10) { editor.replaceSelection("}"); editor.replaceRange("{", { line: position.line, ch: last_subscript + 1 }); return true; } } } // retrieve the last unbracketed superscript let last_superscript = current_line.lastIndexOf('^', position.ch); while (last_superscript != -1) { const two_letters_after_superscript = editor.getRange({ line: position.line, ch: last_superscript + 1 }, { line: position.line, ch: last_superscript + 3 }); if (two_letters_after_superscript[0] == '{' || two_letters_after_superscript == ' {') { last_superscript = current_line.lastIndexOf('^', last_superscript - 1); } else if (last_superscript < last_math) { last_superscript = -1; break; } else { break; } } // retrieve the last divide symbol let last_divide = current_line.lastIndexOf('/', position.ch - 1); // perform autoEncloseSup if (this.settings.autoEncloseSup_toggle) { if (last_superscript > last_divide) { return this.autoEncloseSup(editor, event, last_superscript); } } // perform autoFraction if (this.settings.autoFraction_toggle && !this.withinText(editor, last_divide)) { if (last_divide > last_dollar) { const brackets = [['(', ')'], ['{', '}'], ['[', ']']]; // if any brackets in denominator still unclosed, dont do autoFraction yet if (!brackets.some(e => this.unclosed_bracket(editor, e[0], e[1], position.ch, last_divide)[0])) { return this.autoFractionCM6(editor, last_superscript); } } } // perform autoLargeBracket if (this.settings.autoLargeBracket_toggle) { let symbol_before = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch }); if (symbol_before == ')' || symbol_before == ']') { return this.autoLargeBracket(editor, event); } } } }, }, { key: 'Enter', run: () => { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return false; const editor = view.editor; if (this.settings.addAlignBlock_toggle) { if (this.withinAnyBrackets_document(editor, '\\begin{' + this.settings.addAlignBlock_parameter, '\\end{' + this.settings.addAlignBlock_parameter)) { editor.replaceSelection('\\\\\n&'); return true; } } if (this.settings.addMatrixBlock_toggle) { if (this.withinAnyBrackets_document(editor, '\\begin{' + this.settings.addMatrixBlock_parameter, '\\end{' + this.settings.addMatrixBlock_parameter)) { editor.replaceSelection(' \\\\ '); return true; } } if (this.settings.addCasesBlock_toggle) { if (this.withinAnyBrackets_document(editor, '\\begin{cases}', '\\end{cases}')) { editor.replaceSelection(' \\\\\n'); return true; } } // double enter for $$ if (this.withinMath(editor)) { const position = editor.getCursor(); const prev2_Char = editor.getRange({ line: position.line, ch: position.ch - 2 }, { line: position.line, ch: position.ch }); const next2_Char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 }); if (prev2_Char == "$$" && next2_Char == "$$") { editor.replaceSelection('\n'); editor.setCursor(position); return false; } } return false; }, }, { key: '{', run: () => { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return false; const editor = view.editor; if (this.withinMath(editor)) { if (this.settings.autoCloseCurly_toggle) { const position = editor.getCursor(); const brackets = [['(', ')'], ['{', '}'], ['[', ']']]; const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 }); const next_2char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 }); const followed_by_$spacetabnonedoubleslash = (['$', ' ', ' ', ''].contains(next_char) || next_2char == '\\\\'); if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) { editor.replaceSelection('{}'); editor.setCursor({ line: position.line, ch: position.ch + 1 }); return true; } } } return false; }, }, { key: '[', run: () => { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return false; const editor = view.editor; if (this.withinMath(editor)) { if (this.settings.autoCloseSquare_toggle) { const position = editor.getCursor(); const brackets = [['(', ')'], ['{', '}'], ['[', ']']]; const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 }); const next_2char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 }); const followed_by_$spacetabnonedoubleslash = (['$', ' ', ' ', ''].contains(next_char) || next_2char == '\\\\'); if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) { editor.replaceSelection('[]'); editor.setCursor({ line: position.line, ch: position.ch + 1 }); return true; } } } return false; }, }, { key: '(', run: () => { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return false; const editor = view.editor; if (this.withinMath(editor)) { if (this.settings.autoCloseRound_toggle) { const position = editor.getCursor(); const brackets = [['(', ')'], ['{', '}'], ['[', ']']]; const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 }); const next_2char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 }); const followed_by_$spacetabnonedoubleslash = (['$', ' ', ' ', ''].contains(next_char) || next_2char == '\\\\'); if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) { editor.replaceSelection('()'); editor.setCursor({ line: position.line, ch: position.ch + 1 }); return true; } } } return false; }, }, { key: '}', run: () => { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return false; const editor = view.editor; if (this.withinMath(editor)) { if (this.settings.autoCloseRound_toggle) { const position = editor.getCursor(); const end = editor.getLine(position.line).length; const next_sym = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 }); if (!this.unclosed_bracket(editor, "{", "}", end, 0)[0] && !this.unclosed_bracket(editor, "{", "}", end, 0, false)[0] && next_sym == "}") { editor.setCursor({ line: position.line, ch: position.ch + 1 }); return true; } else { return false; } } } return false; }, }, { key: ']', run: () => { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return false; const editor = view.editor; if (this.withinMath(editor)) { if (this.settings.autoCloseRound_toggle) { const position = editor.getCursor(); const end = editor.getLine(position.line).length; const next_sym = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 }); if (!this.unclosed_bracket(editor, "[", "]", end, 0)[0] && !this.unclosed_bracket(editor, "[", "]", end, 0, false)[0] && next_sym == "]") { editor.setCursor({ line: position.line, ch: position.ch + 1 }); return true; } else { return false; } } } return false; }, }, { key: ')', run: () => { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return false; const editor = view.editor; if (this.withinMath(editor)) { if (this.settings.autoCloseRound_toggle) { const position = editor.getCursor(); const end = editor.getLine(position.line).length; const next_sym = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 }); if (!this.unclosed_bracket(editor, "(", ")", end, 0)[0] && !this.unclosed_bracket(editor, "(", ")", end, 0, false)[0] && next_sym == ")") { editor.setCursor({ line: position.line, ch: position.ch + 1 }); return true; } else { return false; } } } return false; }, }, { key: 'm', run: () => { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return false; const editor = view.editor; if (!this.withinMath(editor)) return false; const position = editor.getCursor(); if (!this.settings.autoSumLimit_toggle) return; if (this.withinMath(editor)) { if (editor.getRange({ line: position.line, ch: position.ch - 3 }, { line: position.line, ch: position.ch }) == '\\su') { editor.replaceSelection('m\\limits'); return true; } } return false; }, }, ])); this.handleVimModeChange = (modeObj) => { if (!modeObj || modeObj.mode === 'insert') this.vimAllow_autoCloseMath = true; else this.vimAllow_autoCloseMath = false; }; this.handleKeyDown = (cm, event) => { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return; const editor = view.editor; if (['$', ' ', 'Enter', 'Tab'].contains(event.key)) { switch (event.key) { case '$': if (editor.getSelection().length > 0) { if (this.settings.encloseSelection_toggle) { const anchor = editor.getCursor("anchor"); const head = editor.getCursor("head"); editor.replaceSelection('$' + editor.getSelection() + '$'); if (anchor.line > head.line) { editor.setSelection({ line: anchor.line, ch: anchor.ch }, { line: head.line, ch: head.ch + 1 }); } else if (anchor.line < head.line) { editor.setSelection({ line: anchor.line, ch: anchor.ch + 1 }, { line: head.line, ch: head.ch }); } else { editor.setSelection({ line: anchor.line, ch: anchor.ch + 1 }, { line: head.line, ch: head.ch + 1 }); } event.preventDefault(); return; } } else { // close math symbol const position = editor.getCursor(); const prev_char = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch }); const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 }); const next2_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 }); if (prev_char != "$" && next_char == "$") { if (next2_char == "$$") { editor.setCursor({ line: position.line, ch: position.ch + 2 }); event.preventDefault(); return; } else { editor.setCursor({ line: position.line, ch: position.ch + 1 }); event.preventDefault(); return; } } // perform autoCloseMath if (this.settings.autoCloseMath_toggle && this.vimAllow_autoCloseMath) { editor.replaceSelection("$"); } // perform moveIntoMath if (this.settings.moveIntoMath_toggle) { const position = editor.getCursor(); const t = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch }); const t2 = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 }); const t_2 = editor.getRange({ line: position.line, ch: position.ch - 2 }, { line: position.line, ch: position.ch }); if (t == '$' && t2 != '$') { editor.setCursor({ line: position.line, ch: position.ch - 1 }); } else if (t_2 == '$$') { editor.setCursor({ line: position.line, ch: position.ch - 1 }); } } } return; case ' ': if (!this.settings.autoFraction_toggle && !this.settings.autoLargeBracket_toggle && !this.settings.autoEncloseSup_toggle && !this.settings.autoEncloseSub_toggle && !this.settings.customShorthand_toggle) return; if (this.withinMath(editor)) { const position = editor.getCursor(); const current_line = editor.getLine(position.line); const last_dollar = current_line.lastIndexOf('$', position.ch - 1); // check for custom shorthand if (this.settings.customShorthand_toggle && !this.withinText(editor, position.ch)) { let keyword = ""; let keyword_length = 0; for (let i = 0; i < this.shorthand_array.length; i++) { keyword_length = this.shorthand_array[i][0].length; if (keyword_length > position.ch) { continue; } else if (keyword_length == position.ch) { keyword = "@" + editor.getRange({ line: position.line, ch: position.ch - keyword_length }, { line: position.line, ch: position.ch }); } else { keyword = editor.getRange({ line: position.line, ch: position.ch - keyword_length - 1 }, { line: position.line, ch: position.ch }); } if (keyword[0].toLowerCase() == keyword[0].toUpperCase() || keyword[0] == "@") { if (this.shorthand_array[i][0] == keyword.slice(-keyword_length) && this.shorthand_array[i][1] != keyword) { const replace_slash = (keyword[0] == "\\" && this.shorthand_array[i][1][0] == "\\") ? 1 : 0; const set_cursor_position = this.shorthand_array[i][1].indexOf("#cursor"); editor.replaceRange(this.shorthand_array[i][1], { line: position.line, ch: position.ch - keyword_length - replace_slash }, { line: position.line, ch: position.ch }); if (set_cursor_position != -1) { editor.replaceRange("", { line: position.line, ch: position.ch - keyword_length + set_cursor_position }, { line: position.line, ch: position.ch - keyword_length + set_cursor_position + 7 }); editor.setCursor({ line: position.line, ch: position.ch - keyword_length + set_cursor_position }); } else if (this.shorthand_array[i][1].slice(-2) == "{}") { editor.setCursor({ line: position.line, ch: position.ch + this.shorthand_array[i][1].length - keyword_length - 1 - replace_slash }); } else ; event.preventDefault(); return; } } } } // find last unbracketed subscript within last 10 characters and perform autoEncloseSub // ignore expression that contain + - * / ^ const last_math = current_line.lastIndexOf('$', position.ch - 1); if (this.settings.autoEncloseSub_toggle) { let last_subscript = current_line.lastIndexOf('_', position.ch); if (last_subscript != -1 && last_subscript > last_math) { const letter_after_subscript = editor.getRange({ line: position.line, ch: last_subscript + 1 }, { line: position.line, ch: last_subscript + 2 }); if (letter_after_subscript != "{" && (position.ch - last_subscript) <= 10) { editor.replaceRange("}", position); editor.replaceRange("{", { line: position.line, ch: last_subscript + 1 }); event.preventDefault(); return; } } } // retrieve the last unbracketed superscript let last_superscript = current_line.lastIndexOf('^', position.ch); while (last_superscript != -1) { const two_letters_after_superscript = editor.getRange({ line: position.line, ch: last_superscript + 1 }, { line: position.line, ch: last_superscript + 3 }); if (two_letters_after_superscript[0] == '{' || two_letters_after_superscript == ' {') { last_superscript = current_line.lastIndexOf('^', last_superscript - 1); } else if (last_superscript < last_math) { last_superscript = -1; break; } else { break; } } // retrieve the last divide symbol let last_divide = current_line.lastIndexOf('/', position.ch - 1); // perform autoEncloseSup if (this.settings.autoEncloseSup_toggle) { if (last_superscript > last_divide) { this.autoEncloseSup(editor, event, last_superscript); return; } } // perform autoFraction if (this.settings.autoFraction_toggle && !this.withinText(editor, last_divide)) { if (last_divide > last_dollar) { const brackets = [['(', ')'], ['{', '}'], ['[', ']']]; // if any brackets in denominator still unclosed, dont do autoFraction yet if (!brackets.some(e => this.unclosed_bracket(editor, e[0], e[1], position.ch, last_divide)[0])) { this.autoFraction(editor, event, last_superscript); return; } } } // perform autoLargeBracket if (this.settings.autoLargeBracket_toggle) { let symbol_before = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch }); if (symbol_before == ')' || symbol_before == ']') { this.autoLargeBracket(editor, event); return; } } } break; case 'Enter': // perform Enter shortcut within matrix block if (this.settings.addMatrixBlock_toggle) { if (this.withinAnyBrackets_document(editor, '\\begin{' + this.settings.addMatrixBlock_parameter, '\\end{' + this.settings.addMatrixBlock_parameter)) { if (!event.shiftKey) { editor.replaceSelection(' \\\\ '); event.preventDefault(); } return; } } // perform Enter shortcut within align block if (this.settings.addAlignBlock_toggle) { if (this.withinAnyBrackets_document(editor, '\\begin{' + this.settings.addAlignBlock_parameter, '\\end{' + this.settings.addAlignBlock_parameter)) { if (!event.shiftKey) { editor.replaceSelection('\\\\\n&'); event.preventDefault(); } return; } } // enter for cases block if (this.settings.addCasesBlock_toggle) { if (this.withinAnyBrackets_document(editor, '\\begin{cases}', '\\end{cases}')) { editor.replaceSelection(' \\\\\n'); event.preventDefault(); return; } } // double enter for $$ if (this.withinMath(editor)) { const position = editor.getCursor(); const prev2_Char = editor.getRange({ line: position.line, ch: position.ch - 2 }, { line: position.line, ch: position.ch }); const next2_Char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 }); if (prev2_Char == "$$" && next2_Char == "$$") { editor.replaceSelection('\n'); editor.setCursor(position); } } return; case 'Tab': // perform Tab shortcut within matrix block if (this.settings.addMatrixBlock_toggle) { if (this.withinAnyBrackets_document(editor, '\\begin{' + this.settings.addMatrixBlock_parameter, '\\end{' + this.settings.addMatrixBlock_parameter)) { editor.replaceSelection(' & '); event.preventDefault(); return; } } // Tab shortcut for cases block if (this.settings.addCasesBlock_toggle) { if (this.withinAnyBrackets_document(editor, '\\begin{cases}', '\\end{cases}')) { editor.replaceSelection(' & '); event.preventDefault(); return; } } // Tab to go to next #tab const position = editor.getCursor(); const current_line = editor.getLine(position.line); const tab_position = current_line.indexOf("#tab"); if (tab_position != -1) { editor.replaceRange("", { line: position.line, ch: tab_position }, { line: position.line, ch: tab_position + 4 }); editor.setCursor({ line: position.line, ch: tab_position }); event.preventDefault(); return; } } } }; this.handleKeyPress = (cm, event) => { if (['{', '[', '(', 'm'].contains(event.key)) { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return; const editor = view.editor; if (this.withinMath(editor)) { const position = editor.getCursor(); const brackets = [['(', ')'], ['{', '}'], ['[', ']']]; const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 }); const next_2char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 }); const followed_by_$spacetabnonedoubleslash = (['$', ' ', ' ', ''].contains(next_char) || next_2char == '\\\\'); switch (event.key) { case '{': if (this.settings.autoCloseCurly_toggle) { if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) { editor.replaceSelection('{}'); editor.setCursor({ line: position.line, ch: position.ch + 1 }); event.preventDefault(); return; } } return; case '[': if (this.settings.autoCloseSquare_toggle) { if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) { editor.replaceSelection('[]'); editor.setCursor({ line: position.line, ch: position.ch + 1 }); event.preventDefault(); return; } } return; case '(': if (this.settings.autoCloseRound_toggle) { if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) { editor.replaceSelection('()'); editor.setCursor({ line: position.line, ch: position.ch + 1 }); event.preventDefault(); return; } } return; case 'm': if (!this.settings.autoSumLimit_toggle) return; if (editor.getRange({ line: position.line, ch: position.ch - 3 }, { line: position.line, ch: position.ch }) == '\\su') { editor.replaceSelection('m\\limits'); event.preventDefault(); return; } } } } }; //main functions this.autoEncloseSup = (editor, event, last_superscript) => { // superscript bracketing const position = editor.getCursor(); const letter_before_cursor = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch }); if (last_superscript != -1 && letter_before_cursor != "^") { const letter_after_superscript = editor.getRange({ line: position.line, ch: last_superscript + 1 }, { line: position.line, ch: last_superscript + 2 }); if (letter_after_superscript == '(' && letter_before_cursor == ')') { editor.replaceRange('}', { line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch }); editor.replaceRange('{', { line: position.line, ch: last_superscript + 1 }, { line: position.line, ch: last_superscript + 2 }); event.preventDefault(); return true; } else if (letter_after_superscript == ' ') { editor.replaceSelection('}'); editor.replaceRange('{', { line: position.line, ch: last_superscript + 2 }); event.preventDefault(); return true; } else { editor.replaceSelection('}'); editor.replaceRange('{', { line: position.line, ch: last_superscript + 1 }); event.preventDefault(); return true; } } else { return false; } }; this.autoFraction = (editor, event, last_superscript) => { const position = editor.getCursor(); const current_line = editor.getLine(position.line); let last_divide = current_line.lastIndexOf('/', position.ch - 1); // if cursor is preceeded by a close bracket, and the corresponding open bracket // is found before "/", remove the brackets and enclose whole expression using \frac const letter_before_cursor = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch }); // if there are any brackets unclosed before divide symbol, // include the open brackets into stop_symbols const brackets = [['(', ')'], ['{', '}'], ['[', ']']]; let stop_brackets = []; for (let i = 0; i < brackets.length; i++) { if (letter_before_cursor == brackets[i][1]) { const open_brackets = this.unclosed_bracket(editor, brackets[i][0], brackets[i][1], position.ch - 1, 0)[1]; const pos_of_the_open_bracket = open_brackets[open_brackets.length - 1]; if (pos_of_the_open_bracket < last_divide) { editor.replaceRange('}', { line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch }); editor.replaceRange('}{', { line: position.line, ch: last_divide }, { line: position.line, ch: last_divide + 1 }); editor.replaceRange('\\frac{', { line: position.line, ch: pos_of_the_open_bracket }, { line: position.line, ch: pos_of_the_open_bracket + 1 }); event.preventDefault(); return; } } stop_brackets.push(...this.unclosed_bracket(editor, brackets[i][0], brackets[i][1], last_divide, 0)[1]); } let frac = 0; // if numerator is enclosed by (), place frac in front of () and remove () let numerator_remove_bracket = 0; if (editor.getRange({ line: position.line, ch: last_divide - 1 }, { line: position.line, ch: last_divide }) == ')') { const numerator_open_bracket = this.unclosed_bracket(editor, '(', ')', last_divide - 1, 0)[1].slice(-1)[0]; frac = numerator_open_bracket - 1; numerator_remove_bracket = 1; } else { const stop_symbols = ['$', '=', '>', '<', ',', '/', ' ']; const symbol_positions = stop_symbols.map(e => current_line.lastIndexOf(e, last_divide - 1)); frac = Math.max(last_superscript, ...symbol_positions, ...stop_brackets); } // if denominator is enclosed by (), remove () const denominator = editor.getRange({ line: position.line, ch: last_divide + 1 }, { line: position.line, ch: position.ch }); let denominator_remove_bracket = 0; if (denominator.slice(-1)[0] == ')') { const denominator_open_bracket = this.unclosed_bracket(editor, '(', ')', position.ch - 1, 0)[1].slice(-1)[0]; if (denominator_open_bracket == last_divide + 1) { denominator_remove_bracket = 1; } } // perform \frac replace editor.replaceRange('}', { line: position.line, ch: position.ch - denominator_remove_bracket }, { line: position.line, ch: position.ch }); editor.replaceRange('}{', { line: position.line, ch: last_divide - numerator_remove_bracket }, { line: position.line, ch: last_divide + 1 + denominator_remove_bracket }); editor.replaceRange('\\frac{', { line: position.line, ch: frac + 1 }, { line: position.line, ch: frac + 1 + numerator_remove_bracket }); event.preventDefault(); return; }; this.autoFractionCM6 = (editor, last_superscript) => { const position = editor.getCursor(); const current_line = editor.getLine(position.line); let last_divide = current_line.lastIndexOf('/', position.ch - 1); // if cursor is preceeded by a close bracket, and the corresponding open bracket // is found before "/", remove the brackets and enclose whole expression using \frac const letter_before_cursor = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch }); // if there are any brackets unclosed before divide symbol, // include the open brackets into stop_symbols const brackets = [['(', ')'], ['{', '}'], ['[', ']']]; let stop_brackets = []; for (let i = 0; i < brackets.length; i++) { if (letter_before_cursor == brackets[i][1]) { const open_brackets = this.unclosed_bracket(editor, brackets[i][0], brackets[i][1], position.ch - 1, 0)[1]; const pos_of_the_open_bracket = open_brackets[open_brackets.length - 1]; if (pos_of_the_open_bracket < last_divide) { editor.replaceRange('}', { line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch }); editor.replaceRange('}{', { line: position.line, ch: last_divide }, { line: position.line, ch: last_divide + 1 }); editor.replaceRange('\\frac{', { line: position.line, ch: pos_of_the_open_bracket }, { line: position.line, ch: pos_of_the_open_bracket + 1 }); return true; } } stop_brackets.push(...this.unclosed_bracket(editor, brackets[i][0], brackets[i][1], last_divide, 0)[1]); } let frac = 0; // if numerator is enclosed by (), place frac in front of () and remove () let numerator_remove_bracket = 0; if (editor.getRange({ line: position.line, ch: last_divide - 1 }, { line: position.line, ch: last_divide }) == ')') { const numerator_open_bracket = this.unclosed_bracket(editor, '(', ')', last_divide - 1, 0)[1].slice(-1)[0]; frac = numerator_open_bracket - 1; numerator_remove_bracket = 1; } else { const stop_symbols = ['$', '=', '>', '<', ',', '/', ' ']; const symbol_positions = stop_symbols.map(e => current_line.lastIndexOf(e, last_divide - 1)); frac = Math.max(last_superscript, ...symbol_positions, ...stop_brackets); } // if denominator is enclosed by (), remove () const denominator = editor.getRange({ line: position.line, ch: last_divide + 1 }, { line: position.line, ch: position.ch }); let denominator_remove_bracket = 0; if (denominator.slice(-1)[0] == ')') { const denominator_open_bracket = this.unclosed_bracket(editor, '(', ')', position.ch - 1, 0)[1].slice(-1)[0]; if (denominator_open_bracket == last_divide + 1) { denominator_remove_bracket = 1; } } // perform \frac replace editor.replaceRange('}', { line: position.line, ch: position.ch - denominator_remove_bracket }, { line: position.line, ch: position.ch }); editor.replaceRange('}{', { line: position.line, ch: last_divide - numerator_remove_bracket }, { line: position.line, ch: last_divide + 1 + denominator_remove_bracket }); editor.replaceRange('\\frac{', { line: position.line, ch: frac + 1 }, { line: position.line, ch: frac + 1 + numerator_remove_bracket }); const pos = editor.getCursor(); editor.setCursor({ line: pos.line, ch: pos.ch + 1 - denominator_remove_bracket }); return true; }; this.autoLargeBracket = (editor, event) => { const position = editor.getCursor(); let brackets = [['[', ']'], ['(', ')']]; const prev_char = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch }); const current_brackets = brackets.filter(e => e[1] == prev_char)[0]; if (current_brackets.length == 0) return; const open_bracket = this.unclosed_bracket(editor, current_brackets[0], current_brackets[1], position.ch - 1, 0)[1].slice(-1)[0]; const text = editor.getRange({ line: position.line, ch: open_bracket }, { line: position.line, ch: position.ch }); const large_operators = ['\\sum', '\\int', '\\frac', '\\dfrac']; let large_operators_locations = []; for (let i = 0; i < large_operators.length; i++) { let found = 0; while (found != -1) { found = text.indexOf(large_operators[i], found + 1); if (found != -1) { large_operators_locations.push(found + open_bracket); } } } const current_line = editor.getLine(position.line); let retVal = false; for (let i = 0; i < large_operators_locations.length; i++) { let left_array = []; let right_array = []; for (let j = 0; j < brackets.length; j++) { left_array.push(...this.unclosed_bracket(editor, brackets[j][0], brackets[j][1], large_operators_locations[i], 0)[1]); right_array.push(...this.unclosed_bracket(editor, brackets[j][0], brackets[j][1], current_line.length, large_operators_locations[i], false)[1]); } for (let k = right_array.length - 1; k > -1; k--) { // check if unclosed brackets already appended with \right let check_right = editor.getRange({ line: position.line, ch: right_array[k] - 6 }, { line: position.line, ch: right_array[k] }); if (check_right != '\\right') { editor.replaceRange('\\right', { line: position.line, ch: right_array[k] }); event.preventDefault(); retVal = true; } } for (let l = left_array.length - 1; l > -1; l--) { // check if unclosed brackets already appended with \left let check_left = editor.getRange({ line: position.line, ch: left_array[l] - 5 }, { line: position.line, ch: left_array[l] }); if (check_left != '\\left') { editor.replaceRange('\\left', { line: position.line, ch: left_array[l] }); event.preventDefault(); retVal = true; } } } return retVal; }; //utility functions this.unclosed_bracket = (editor, open_symbol, close_symbol, before, after, unclosed_open_symbol = true //false for unclosed_close_symbol ) => { // determine if there are unclosed bracket within the range specified by before and after const position = editor.getCursor(); const text = editor.getRange({ line: position.line, ch: after }, { line: position.line, ch: before }); let open_array = []; let close_array = []; for (let i = 0; i < text.length; i++) { switch (text[i]) { case open_symbol: open_array.push(after + i); break; case close_symbol: if (open_array.length > 0) { open_array.pop(); } else { close_array.push(after + i); } break; } } if (unclosed_open_symbol) { return [open_array.length > 0, open_array]; } else { return [close_array.length > 0, close_array]; } }; this.withinText = (editor, at_where) => { // check if within text{} const position = editor.getCursor(); const bracket_locations = this.unclosed_bracket(editor, '{', '}', at_where, 0)[1]; return bracket_locations.some(loc => editor.getRange({ line: position.line, ch: loc - 4 }, { line: position.line, ch: loc }) == "text"); }; this.withinMath = (editor) => { // check if cursor within $$ const position = editor.getCursor(); const current_line = editor.getLine(position.line); let cursor_index = position.ch; let from = 0; let found = current_line.indexOf('$', from); while (found != -1 && found < cursor_index) { let next_char = editor.getRange({ line: position.line, ch: found + 1 }, { line: position.line, ch: found + 2 }); let prev_char = editor.getRange({ line: position.line, ch: found - 1 }, { line: position.line, ch: found }); if (next_char == '$' || prev_char == '$' || next_char == ' ') { from = found + 1; found = current_line.indexOf('$', from); continue; } else { from = found + 1; let next_found = current_line.indexOf('$', from); if (next_found == -1) { return false; } else if (cursor_index > found && cursor_index <= next_found) { return true; } else { from = next_found + 1; found = current_line.indexOf('$', from); continue; } } } const document_text = editor.getValue(); cursor_index = editor.posToOffset(position); from = 0; found = document_text.indexOf('$$', from); let count = 0; while (found != -1 && found < cursor_index) { count += 1; from = found + 2; found = document_text.indexOf('$$', from); } return count % 2 == 1; }; this.withinAnyBrackets_inline = (editor, brackets) => { const position = editor.getCursor(); const current_line = editor.getLine(position.line); return brackets.some(e => this.unclosed_bracket(editor, e[0], e[1], position.ch, 0)[0] && this.unclosed_bracket(editor, e[0], e[1], current_line.length, position.ch, false)[0]); }; this.withinAnyBrackets_document = (editor, open_symbol, close_symbol) => { const document_text = editor.getValue(); const cursorPos = editor.getCursor(); const cursor_index = editor.posToOffset(cursorPos); // count open symbols let from = 0; let found = document_text.indexOf(open_symbol, from); let count = 0; while (found != -1 && found < cursor_index) { count += 1; from = found + 1; found = document_text.indexOf(open_symbol, from); } const open_symbol_counts = count; // count close symbols from = 0; found = document_text.indexOf(close_symbol, from); count = 0; while (found != -1 && found < cursor_index) { count += 1; from = found + 1; found = document_text.indexOf(close_symbol, from); } const close_symbol_counts = count; return open_symbol_counts > close_symbol_counts; }; } onload() { return __awaiter(this, void 0, void 0, function* () { console.log('loading Quick-Latex plugin'); this.registerEditorExtension(this.makeExtensionThing()); yield this.loadSettings(); // preprocess shorthand array let shorthands = this.settings.customShorthand_parameter; while (shorthands.slice(-1) == "\n") { shorthands = shorthands.slice(0, -1); } if (shorthands.slice(-1) == ";") { shorthands = shorthands.slice(0, -1); } if (shorthands.lastIndexOf(";\n") == -1) { this.shorthand_array = shorthands.split(",").map(item => item.split(":").map(item => item.trim())); } else { this.shorthand_array = shorthands.split(";\n").map(item => item.split(":")); } this.app.workspace.onLayoutReady(() => { this.registerCodeMirror((cm) => { cm.on('vim-mode-change', this.handleVimModeChange); cm.on('keydown', this.handleKeyDown); cm.on('keypress', this.handleKeyPress); }); this.addSettingTab(new QuickLatexSettingTab(this.app, this)); this.addCommand({ id: 'addAlignBlock', name: 'Add Align Block', hotkeys: [ { modifiers: ['Alt', 'Shift'], key: 'A', }, ], editorCallback: (editor) => this.addAlignBlock(editor), }); this.addCommand({ id: 'addMatrixBlock', name: 'Add Matrix Block', hotkeys: [ { modifiers: ['Alt', 'Shift'], key: 'M', }, ], editorCallback: (editor) => this.addMatrixBlock(editor), }); this.addCommand({ id: 'addCasesBlock', name: 'Add Cases Block', hotkeys: [ { modifiers: ['Alt', 'Shift'], key: 'C', }, ], editorCallback: (editor) => this.addCasesBlock(editor), }); }); }); } addAlignBlock(editor) { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return; if (!this.settings.addAlignBlock_toggle) return; const selected_text = editor.getSelection(); editor.replaceSelection('\\begin{' + this.settings.addAlignBlock_parameter + '}\n' + selected_text + '\n\\end{' + this.settings.addAlignBlock_parameter + '}'); const position = editor.getCursor(); editor.setCursor({ line: position.line - 1, ch: editor.getLine(position.line - 1).length }); } addMatrixBlock(editor) { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return; if (!this.settings.addMatrixBlock_toggle) return; editor.replaceSelection('\\begin{' + this.settings.addMatrixBlock_parameter + '}' + '\\end{' + this.settings.addMatrixBlock_parameter + '}'); const position = editor.getCursor(); const retract_length = ('\\end{' + this.settings.addMatrixBlock_parameter + '}').length; editor.setCursor({ line: position.line, ch: position.ch - retract_length }); } addCasesBlock(editor) { const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (!view) return; if (!this.settings.addCasesBlock_toggle) return; const selected_text = editor.getSelection(); editor.replaceSelection('\\begin{cases}\n' + selected_text + '\n\\end{cases}'); const position = editor.getCursor(); editor.setCursor({ line: position.line - 1, ch: editor.getLine(position.line - 1).length }); } // Settings load and save loadSettings() { return __awaiter(this, void 0, void 0, function* () { this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); }); } ; onunload() { console.log('unloading Quick-Latex plugin'); this.app.workspace.iterateCodeMirrors((cm) => { cm.off('vim-mode-change', this.handleVimModeChange); cm.off('keydown', this.handleKeyDown); cm.off('keypress', this.handleKeyPress); }); } } class QuickLatexSettingTab extends obsidian.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; } display() { const { containerEl } = this; containerEl.empty(); containerEl.createEl('h2', { text: 'Quick Latex for Obsidian - Settings' }); new obsidian.Setting(containerEl) .setName('Autoclose $$ symbols') .setDesc('Typing one $ symbol will automatically lose with another $ symbol ' + '(best used with "Move cursor between $$ symbols" function') .addToggle((toggle) => toggle .setValue(this.plugin.settings.autoCloseMath_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.autoCloseMath_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('Move cursor between $$ symbols') .setDesc('Typing two consecutive $ symbols will automatically shift the cursor in between the $$ symbols') .addToggle((toggle) => toggle .setValue(this.plugin.settings.moveIntoMath_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.moveIntoMath_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('Enclose selected expression with math symbol $$') .setDesc('Select an expression and press "$" key will automatically ' + 'enclose the expression with the math symbols.') .addToggle((toggle) => toggle .setValue(this.plugin.settings.encloseSelection_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.encloseSelection_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('Autoclose {} curly brackets') .setDesc('Typing "{" will automatically close with "}"') .addToggle((toggle) => toggle .setValue(this.plugin.settings.autoCloseCurly_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.autoCloseCurly_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('Autoclose [] square brackets') .setDesc('Typing "[" will automatically close with "]"') .addToggle((toggle) => toggle .setValue(this.plugin.settings.autoCloseSquare_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.autoCloseSquare_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('Autoclose () round brackets') .setDesc('Typing "(" will automatically close with ")"') .addToggle((toggle) => toggle .setValue(this.plugin.settings.autoCloseRound_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.autoCloseRound_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('Auto append "\\limits" after "\\sum"') .setDesc('Typing "\\sum" will automatically append "\\limits" to shorten the syntax' + ' for proper display of the limits for summation symbol.') .addToggle((toggle) => toggle .setValue(this.plugin.settings.autoSumLimit_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.autoSumLimit_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('Auto enlarge brackets that contains \\sum, \\int or \\frac') .setDesc('Place cursor right after a () or [] bracketed expression that contains either ' + '\\sum, \\int or \\frac and press the space key, the outermost brackets will be' + ' appended with \\left and \\right in order to display larger brackets to enclose these big expressions.') .addToggle((toggle) => toggle .setValue(this.plugin.settings.autoLargeBracket_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.autoLargeBracket_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('Auto enclose expression after superscipt with {}') .setDesc('Typing expression after superscript "^" symbol follow by a "space" key ' + 'will automatically surround the expression with "{}"') .addToggle((toggle) => toggle .setValue(this.plugin.settings.autoEncloseSup_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.autoEncloseSup_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('Auto enclose expression after subscript with {}') .setDesc('Typing expression after subscript "_" symbol follow by a "space" key ' + 'will automatically surround the expression with "{}". ' + 'Note: expression more than 10 characters long will be ignored.') .addToggle((toggle) => toggle .setValue(this.plugin.settings.autoEncloseSub_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.autoEncloseSub_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('Type "/" instead of \\frac{}{}') .setDesc('Use "/" symbol for quickly typing fractions. eg. type "1/2" followed by a "space" key' + ' to transform to \\frac{1}{2}') .addToggle((toggle) => toggle .setValue(this.plugin.settings.autoFraction_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.autoFraction_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('Shortcut for Align Block') .setDesc('Use shortcut key to quickly insert \\begin{align*} \\end{align*} block. ' + 'Default: "Alt+Shift+A" (Mac: "Option+Shift+A")') .addToggle((toggle) => toggle .setValue(this.plugin.settings.addAlignBlock_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.addAlignBlock_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('Align Block Parameter') .setDesc('Set the text parameter in \\begin{parameter} and \\end{parameter}.') .addText((text) => text .setPlaceholder('default: align*') .setValue(this.plugin.settings.addAlignBlock_parameter) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.addAlignBlock_parameter = value; yield this.plugin.saveData(this.plugin.settings); }))); new obsidian.Setting(containerEl) .setName('Shortcut for Matrix Block') .setDesc('Use shortcut key to quickly insert \\begin{pmatrix} \\end{pmatrix} block. ' + 'Default: "Alt+Shift+M" (Mac: "Option+Shift+M")') .addToggle((toggle) => toggle .setValue(this.plugin.settings.addMatrixBlock_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.addMatrixBlock_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('Matrix Block Parameter') .setDesc('Set the text parameter in \\begin{parameter} and \\end{parameter}.') .addText((text) => text .setPlaceholder('default: pmatrix') .setValue(this.plugin.settings.addMatrixBlock_parameter) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.addMatrixBlock_parameter = value; yield this.plugin.saveData(this.plugin.settings); }))); new obsidian.Setting(containerEl) .setName('Shortcut for Cases Block') .setDesc('Use shortcut key to quickly insert \\begin{cases} \\end{cases} block. ' + 'Default: "Alt+Shift+C" (Mac: "Option+Shift+C")') .addToggle((toggle) => toggle .setValue(this.plugin.settings.addCasesBlock_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.addCasesBlock_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('Custom Shorthand') .setDesc('Use custom shorthand (can be multiple letters) for common latex strings. ' + 'Eg, typing "al" followed by "space" key will replace with "\\alpha"') .addToggle((toggle) => toggle .setValue(this.plugin.settings.customShorthand_toggle) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.customShorthand_toggle = value; yield this.plugin.saveData(this.plugin.settings); this.display(); }))); new obsidian.Setting(containerEl) .setName('【updated!】Custom Shorthand Parameter') .setDesc('Separate the multi-letters shorthand and the snippet with ":" and ' + 'end each set of shorthand snippet pair by ";" and a newline. ' + 'For expressions that end with "{}", the cursor will automatically be placed within the bracket. ' + 'Alternatively, you can type "#cursor" within the snippet to set the cursor location after replacement. ' + 'You can also include "#tab" within the snippet for use cases such as multiple {}s (e.g. \\binom{#cursor}{#tab}). ' + 'Pressing tab key in such cases will jump the cursor to the next "#tab" keyword.' + 'Shorthands now support multiline snippets too! ' + '(try uninstall then reinstalling the plugin to see the new set of shorthands.)') .setClass("text-snippets-class") .addTextArea((text) => text .setValue(this.plugin.settings.customShorthand_parameter) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.customShorthand_parameter = value; while (value.slice(-1) == "\n") { value = value.slice(0, -1); } if (value.slice(-1) == ";") { value = value.slice(0, -1); } if (value.lastIndexOf(";\n") == -1) { this.plugin.shorthand_array = value.split(",").map(item => item.split(":").map(item => item.trim())); } else { this.plugin.shorthand_array = value.split(";\n").map(item => item.split(":")); } yield this.plugin.saveData(this.plugin.settings); }))); } ; } module.exports = QuickLatexPlugin; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCJpbXBvcnQge1xyXG5cdEFwcCxcclxuXHRNYXJrZG93blZpZXcsXHJcblx0UGx1Z2luLFxyXG5cdEVkaXRvcixcclxuXHRQbHVnaW5TZXR0aW5nVGFiLFxyXG5cdFNldHRpbmdcclxufSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG5pbXBvcnQgeyBQcmVjLCBFeHRlbnNpb24gfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XHJcbmltcG9ydCB7IGtleW1hcCB9IGZyb20gJ0Bjb2RlbWlycm9yL3ZpZXcnO1xyXG5cclxuaW50ZXJmYWNlIFF1aWNrTGF0ZXhTZXR0aW5ncyB7XHJcblx0bW92ZUludG9NYXRoX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRhdXRvQ2xvc2VNYXRoX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRhdXRvQ2xvc2VSb3VuZF90b2dnbGU6IGJvb2xlYW47XHJcblx0YXV0b0Nsb3NlU3F1YXJlX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRhdXRvQ2xvc2VDdXJseV90b2dnbGU6IGJvb2xlYW47XHJcblx0YWRkQWxpZ25CbG9ja190b2dnbGU6IGJvb2xlYW47XHJcblx0YWRkQWxpZ25CbG9ja19wYXJhbWV0ZXI6IHN0cmluZztcclxuXHRhZGRNYXRyaXhCbG9ja190b2dnbGU6IGJvb2xlYW47XHJcblx0YWRkTWF0cml4QmxvY2tfcGFyYW1ldGVyOiBzdHJpbmc7XHJcblx0YWRkQ2FzZXNCbG9ja190b2dnbGU6IGJvb2xlYW47XHJcblx0YXV0b0ZyYWN0aW9uX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRhdXRvTGFyZ2VCcmFja2V0X3RvZ2dsZTogYm9vbGVhbjtcclxuXHRhdXRvU3VtTGltaXRfdG9nZ2xlOiBib29sZWFuO1xyXG5cdGF1dG9FbmNsb3NlU3VwX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRhdXRvRW5jbG9zZVN1Yl90b2dnbGU6IGJvb2xlYW47XHJcblx0ZW5jbG9zZVNlbGVjdGlvbl90b2dnbGU6IGJvb2xlYW47XHJcblx0Y3VzdG9tU2hvcnRoYW5kX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRjdXN0b21TaG9ydGhhbmRfcGFyYW1ldGVyOiBzdHJpbmdcclxufVxyXG5cclxuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogUXVpY2tMYXRleFNldHRpbmdzID0ge1xyXG5cdG1vdmVJbnRvTWF0aF90b2dnbGU6IHRydWUsXHJcblx0YXV0b0Nsb3NlTWF0aF90b2dnbGU6IHRydWUsXHJcblx0YXV0b0Nsb3NlUm91bmRfdG9nZ2xlOiB0cnVlLFxyXG5cdGF1dG9DbG9zZVNxdWFyZV90b2dnbGU6IHRydWUsXHJcblx0YXV0b0Nsb3NlQ3VybHlfdG9nZ2xlOiB0cnVlLFxyXG5cdGFkZEFsaWduQmxvY2tfdG9nZ2xlOiB0cnVlLFxyXG5cdGFkZEFsaWduQmxvY2tfcGFyYW1ldGVyOiBcImFsaWduKlwiLFxyXG5cdGFkZE1hdHJpeEJsb2NrX3RvZ2dsZTogdHJ1ZSxcclxuXHRhZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXI6IFwicG1hdHJpeFwiLFxyXG5cdGFkZENhc2VzQmxvY2tfdG9nZ2xlOiB0cnVlLFxyXG5cdGF1dG9GcmFjdGlvbl90b2dnbGU6IHRydWUsXHJcblx0YXV0b0xhcmdlQnJhY2tldF90b2dnbGU6IHRydWUsXHJcblx0YXV0b1N1bUxpbWl0X3RvZ2dsZTogdHJ1ZSxcclxuXHRhdXRvRW5jbG9zZVN1cF90b2dnbGU6IHRydWUsXHJcblx0YXV0b0VuY2xvc2VTdWJfdG9nZ2xlOiB0cnVlLFxyXG5cdGVuY2xvc2VTZWxlY3Rpb25fdG9nZ2xlOiB0cnVlLFxyXG5cdGN1c3RvbVNob3J0aGFuZF90b2dnbGU6IHRydWUsXHJcblx0Y3VzdG9tU2hvcnRoYW5kX3BhcmFtZXRlcjogXCJiaTpcXFxcYmlub217I2N1cnNvcn17I3RhYn07XFxuc3E6XFxcXHNxcnR7fTtcXG5iYjpcXFxcbWF0aGJie307XFxuYmY6XFxcXG1hdGhiZnt9O1xcbnRlOlxcXFx0ZXh0e307XFxuaW5mOlxcXFxpbmZ0eTtcXG5cIitcclxuXHRcdFx0XHRcdFx0XHRcImNkOlxcXFxjZG90O1xcbnF1OlxcXFxxdWFkO1xcbnRpOlxcXFx0aW1lcztcXG5cIitcclxuXHRcdFx0XHRcdFx0XHRcImFsOlxcXFxhbHBoYTtcXG5iZTpcXFxcYmV0YTtcXG5nYTpcXFxcZ2FtbWE7XFxuR2E6XFxcXEdhbW1hO1xcblwiK1xyXG5cdFx0XHRcdFx0XHRcdFwiZGU6XFxcXGRlbHRhO1xcbkRlOlxcXFxEZWx0YTtcXG5lcDpcXFxcZXBzaWxvbjtcXG56ZTpcXFxcemV0YTtcXG5cIitcclxuXHRcdFx0XHRcdFx0XHRcImV0OlxcXFxldGE7XFxudGg6XFxcXHRoZXRhO1xcblRoOlxcXFxUaGV0YTtcXG5pbzpcXFxcaW90YTtcXG5cIitcclxuXHRcdFx0XHRcdFx0XHRcImthOlxcXFxrYXBwYTtcXG5sYTpcXFxcbGFtYmRhO1xcbkxhOlxcXFxMYW1iZGE7XFxubXU6XFxcXG11O1xcblwiK1xyXG5cdFx0XHRcdFx0XHRcdFwibnU6XFxcXG51O1xcbnhpOlxcXFx4aTtcXG5YaTpcXFxcWGk7XFxucGk6XFxcXHBpO1xcblBpOlxcXFxQaTtcXG5cIitcclxuXHRcdFx0XHRcdFx0XHRcInJoOlxcXFxyaG87XFxuc2k6XFxcXHNpZ21hO1xcblNpOlxcXFxTaWdtYTtcXG50YTpcXFxcdGF1O1xcblwiK1xyXG5cdFx0XHRcdFx0XHRcdFwidXA6XFxcXHVwc2lsb247XFxuVXA6XFxcXFVwc2lsb247XFxucGg6XFxcXHBoaTtcXG5QaDpcXFxcUGhpO1xcbmNoOlxcXFxjaGk7XFxuXCIrXHJcblx0XHRcdFx0XHRcdFx0XCJwczpcXFxccHNpO1xcblBzOlxcXFxQc2k7XFxub206XFxcXG9tZWdhO1xcbk9tOlxcXFxPbWVnYVwiXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF1aWNrTGF0ZXhQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG5cdHNldHRpbmdzOiBRdWlja0xhdGV4U2V0dGluZ3M7XHJcblx0c2hvcnRoYW5kX2FycmF5OiBzdHJpbmdbXVtdO1xyXG5cclxuICAgIHByaXZhdGUgdmltQWxsb3dfYXV0b0Nsb3NlTWF0aDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdHByaXZhdGUgcmVhZG9ubHkgbWFrZUV4dGVuc2lvblRoaW5nID0gKCk6RXh0ZW5zaW9uID0+IFByZWMuaGlnaChrZXltYXAub2YoW1xyXG5cdFx0e1xyXG5cdFx0XHRrZXk6ICckJyxcclxuXHRcdFx0cnVuOiAoKTogYm9vbGVhbiA9PiB7XHJcblx0XHRcdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldylcclxuXHRcdFx0XHRpZiAoIXZpZXcpIHJldHVybiBmYWxzZVxyXG5cclxuXHRcdFx0XHRjb25zdCBlZGl0b3IgID0gdmlldy5lZGl0b3JcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRpZiAoZWRpdG9yLmdldFNlbGVjdGlvbigpLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdC8vIGVuY2xvc2Ugc2VsZWN0ZWQgdGV4dFxyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuZW5jbG9zZVNlbGVjdGlvbl90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYW5jaG9yID0gZWRpdG9yLmdldEN1cnNvcihcImFuY2hvclwiKVxyXG5cdFx0XHRcdFx0XHRjb25zdCBoZWFkID0gZWRpdG9yLmdldEN1cnNvcihcImhlYWRcIilcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oYCQke2VkaXRvci5nZXRTZWxlY3Rpb24oKX0kYClcclxuXHRcdFx0XHRcdFx0aWYgKGFuY2hvci5saW5lID4gaGVhZC5saW5lKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldFNlbGVjdGlvbih7bGluZTphbmNob3IubGluZSxjaDphbmNob3IuY2h9LHtsaW5lOmhlYWQubGluZSxjaDpoZWFkLmNoKzF9KVxyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGFuY2hvci5saW5lIDwgaGVhZC5saW5lKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldFNlbGVjdGlvbih7bGluZTphbmNob3IubGluZSxjaDphbmNob3IuY2grMX0se2xpbmU6aGVhZC5saW5lLGNoOmhlYWQuY2h9KVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRTZWxlY3Rpb24oe2xpbmU6YW5jaG9yLmxpbmUsY2g6YW5jaG9yLmNoKzF9LHtsaW5lOmhlYWQubGluZSxjaDpoZWFkLmNoKzF9KVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2VcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Ly8gY2xvc2UgbWF0aCBzeW1ib2xcclxuXHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpXHJcblx0XHRcdFx0XHRjb25zdCBwcmV2X2NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2gtMX0sXHJcblx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2h9KVxyXG5cdFx0XHRcdFx0Y29uc3QgbmV4dF9jaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNofSxcclxuXHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsxfSlcclxuXHRcdFx0XHRcdGNvbnN0IG5leHQyX2NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2h9LFxyXG5cdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNoKzJ9KVxyXG5cdFx0XHRcdFx0aWYgKHByZXZfY2hhciAhPSBcIiRcIiAmJiBuZXh0X2NoYXIgPT0gXCIkXCIpe1xyXG5cdFx0XHRcdFx0XHRpZiAobmV4dDJfY2hhciA9PSBcIiQkXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMn0pXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMX0pXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Ly8gYXV0byBjbG9zZSBtYXRoXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvQ2xvc2VNYXRoX3RvZ2dsZSAmJiB0aGlzLnZpbUFsbG93X2F1dG9DbG9zZU1hdGgpIHtcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oXCIkXCIpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Ly8gbW92ZSBpbnRvIG1hdGhcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLm1vdmVJbnRvTWF0aF90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHQgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAxIH0sXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSlcclxuXHRcdFx0XHRcdFx0Y29uc3QgdDIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCArIDEgfSlcclxuXHRcdFx0XHRcdFx0Y29uc3QgdF8yID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMiB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pXHJcblx0XHRcdFx0XHRcdGlmICh0ID09ICckJyAmJiB0MiAhPSAnJCcpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9KVxyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRfMiA9PSAnJCQnKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDEgfSlcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6ICdUYWInLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cclxuXHRcdFx0XHQvLyBUYWIgc2hvcnRjdXQgZm9yIG1hdHJpeCBibG9ja1xyXG5cdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMud2l0aGluQW55QnJhY2tldHNfZG9jdW1lbnQoZWRpdG9yLFxyXG5cdFx0XHRcdFx0J1xcXFxiZWdpbnsnICsgdGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXIsXHJcblx0XHRcdFx0XHQnXFxcXGVuZHsnICsgdGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXIsXHJcblx0XHRcdFx0XHQpKSB7XHJcblx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCcgJiAnKVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIFRhYiBzaG9ydGN1dCBmb3IgY2FzZXMgYmxvY2tcclxuXHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hZGRDYXNlc0Jsb2NrX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMud2l0aGluQW55QnJhY2tldHNfZG9jdW1lbnQoZWRpdG9yLFxyXG5cdFx0XHRcdFx0J1xcXFxiZWdpbntjYXNlc30nLFxyXG5cdFx0XHRcdFx0J1xcXFxlbmR7Y2FzZXN9J1xyXG5cdFx0XHRcdFx0KSkge1xyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignICYgJylcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdFxyXG5cclxuXHRcdFx0XHQvLyBUYWIgdG8gZ28gdG8gbmV4dCAjdGFiXHJcblx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0Y29uc3QgY3VycmVudF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSk7XHJcblx0XHRcdFx0Y29uc3QgdGFiX3Bvc2l0aW9uID0gY3VycmVudF9saW5lLmluZGV4T2YoXCIjdGFiXCIpO1xyXG5cdFx0XHRcdGlmICh0YWJfcG9zaXRpb24hPS0xKXtcclxuXHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXCJcIixcclxuXHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnRhYl9wb3NpdGlvbn0sXHJcblx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLCBjaDp0YWJfcG9zaXRpb24rNH0pXHJcblx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnRhYl9wb3NpdGlvbn0pXHJcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gZmFsc2VcclxuXHRcdFx0fSxcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogJ1NwYWNlJyxcclxuXHRcdFx0cnVuOiAoKTogYm9vbGVhbiA9PiB7XHJcblx0XHRcdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldylcclxuXHRcdFx0XHRpZiAoIXZpZXcpIHJldHVybiBmYWxzZVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cclxuXHRcdFx0XHRpZiAoIXRoaXMuc2V0dGluZ3MuYXV0b0ZyYWN0aW9uX3RvZ2dsZSAmJlxyXG5cdFx0XHRcdFx0IXRoaXMuc2V0dGluZ3MuYXV0b0xhcmdlQnJhY2tldF90b2dnbGUgJiZcclxuXHRcdFx0XHRcdCF0aGlzLnNldHRpbmdzLmF1dG9FbmNsb3NlU3VwX3RvZ2dsZSAmJlxyXG5cdFx0XHRcdFx0IXRoaXMuc2V0dGluZ3MuYXV0b0VuY2xvc2VTdWJfdG9nZ2xlICYmXHJcblx0XHRcdFx0XHQhdGhpcy5zZXR0aW5ncy5jdXN0b21TaG9ydGhhbmRfdG9nZ2xlKSByZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRfbGluZSA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUpO1xyXG5cdFx0XHRcdFx0Y29uc3QgbGFzdF9kb2xsYXIgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJyQnLCBwb3NpdGlvbi5jaCAtIDEpO1xyXG5cclxuXHRcdFx0XHRcdC8vIGNoZWNrIGZvciBjdXN0b20gc2hvcnRoYW5kXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5jdXN0b21TaG9ydGhhbmRfdG9nZ2xlICYmICF0aGlzLndpdGhpblRleHQoZWRpdG9yLCBwb3NpdGlvbi5jaCkpIHtcclxuXHRcdFx0XHRcdFx0bGV0IGtleXdvcmQ6c3RyaW5nID0gXCJcIjtcclxuXHRcdFx0XHRcdFx0bGV0IGtleXdvcmRfbGVuZ3RoOm51bWJlciA9IDA7XHJcblx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwIDsgaSA8IHRoaXMuc2hvcnRoYW5kX2FycmF5Lmxlbmd0aCA7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdGtleXdvcmRfbGVuZ3RoID0gdGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMF0ubGVuZ3RoO1xyXG5cdFx0XHRcdFx0XHRcdGlmICgga2V5d29yZF9sZW5ndGggPiBwb3NpdGlvbi5jaCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICgga2V5d29yZF9sZW5ndGggPT0gcG9zaXRpb24uY2ggKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRrZXl3b3JkID0gXCJAXCIgKyBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggfSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdGtleXdvcmQgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggLSAxIH0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRpZiAoa2V5d29yZFswXS50b0xvd2VyQ2FzZSgpID09IGtleXdvcmRbMF0udG9VcHBlckNhc2UoKSB8fCBcclxuXHRcdFx0XHRcdFx0XHRcdGtleXdvcmRbMF0gPT0gXCJAXCIgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMF0gPT0ga2V5d29yZC5zbGljZSgtIGtleXdvcmRfbGVuZ3RoKSAmJiBcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMV0gIT0ga2V5d29yZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCByZXBsYWNlX3NsYXNoID0gKGtleXdvcmRbMF09PVwiXFxcXFwiICYmIHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdWzBdPT1cIlxcXFxcIikgPyAxIDogMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2V0X2N1cnNvcl9wb3NpdGlvbiA9IHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdLmluZGV4T2YoXCIjY3Vyc29yXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggLSByZXBsYWNlX3NsYXNoIH0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChzZXRfY3Vyc29yX3Bvc2l0aW9uICE9IC0xKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggKyBzZXRfY3Vyc29yX3Bvc2l0aW9ufSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoICsgc2V0X2N1cnNvcl9wb3NpdGlvbis3fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoICsgc2V0X2N1cnNvcl9wb3NpdGlvbn0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMV0uc2xpY2UoLTIpID09IFwie31cIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2g6IHBvc2l0aW9uLmNoICsgdGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMV0ubGVuZ3RoIC0ga2V5d29yZF9sZW5ndGggLSAxIC0gcmVwbGFjZV9zbGFzaH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cdFx0XHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0Ly8gZmluZCBsYXN0IHVuYnJhY2tldGVkIHN1YnNjcmlwdCB3aXRoaW4gbGFzdCAxMCBjaGFyYWN0ZXJzIGFuZCBwZXJmb3JtIGF1dG9FbmNsb3NlU3ViXHJcblx0XHRcdFx0XHQvLyBpZ25vcmUgZXhwcmVzc2lvbiB0aGF0IGNvbnRhaW4gKyAtICogLyBeXHJcblx0XHRcdFx0XHRjb25zdCBsYXN0X21hdGggPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJyQnLCBwb3NpdGlvbi5jaCAtIDEpO1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0VuY2xvc2VTdWJfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGxldCBsYXN0X3N1YnNjcmlwdCA9IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZignXycsIHBvc2l0aW9uLmNoKTtcclxuXHRcdFx0XHRcdFx0aWYgKGxhc3Rfc3Vic2NyaXB0ICE9IC0xICYmIGxhc3Rfc3Vic2NyaXB0ID4gbGFzdF9tYXRoKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbGV0dGVyX2FmdGVyX3N1YnNjcmlwdCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3Rfc3Vic2NyaXB0ICsgMSB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdWJzY3JpcHQgKyAyIH0pO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChsZXR0ZXJfYWZ0ZXJfc3Vic2NyaXB0ICE9IFwie1wiICYmIFxyXG5cdFx0XHRcdFx0XHRcdFx0KHBvc2l0aW9uLmNoIC0gbGFzdF9zdWJzY3JpcHQpIDw9IDEwICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oXCJ9XCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcIntcIiwge2xpbmU6cG9zaXRpb24ubGluZSwgY2g6bGFzdF9zdWJzY3JpcHQrMX0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0XHQvLyByZXRyaWV2ZSB0aGUgbGFzdCB1bmJyYWNrZXRlZCBzdXBlcnNjcmlwdFxyXG5cdFx0XHRcdFx0bGV0IGxhc3Rfc3VwZXJzY3JpcHQgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJ14nLCBwb3NpdGlvbi5jaCk7XHJcblx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdHdoaWxlIChsYXN0X3N1cGVyc2NyaXB0ICE9IC0xKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHR3b19sZXR0ZXJzX2FmdGVyX3N1cGVyc2NyaXB0ID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3Rfc3VwZXJzY3JpcHQgKyAxIH0sXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdXBlcnNjcmlwdCArIDMgfSk7XHJcblx0XHRcdFx0XHRcdGlmICh0d29fbGV0dGVyc19hZnRlcl9zdXBlcnNjcmlwdFswXSA9PSAneycgfHwgdHdvX2xldHRlcnNfYWZ0ZXJfc3VwZXJzY3JpcHQgPT0gJyB7Jykge1xyXG5cdFx0XHRcdFx0XHRcdGxhc3Rfc3VwZXJzY3JpcHQgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJ14nLCBsYXN0X3N1cGVyc2NyaXB0IC0gMSk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobGFzdF9zdXBlcnNjcmlwdCA8IGxhc3RfbWF0aCkge1xyXG5cdFx0XHRcdFx0XHRcdGxhc3Rfc3VwZXJzY3JpcHQgPSAtMVxyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gcmV0cmlldmUgdGhlIGxhc3QgZGl2aWRlIHN5bWJvbFxyXG5cdFx0XHRcdFx0bGV0IGxhc3RfZGl2aWRlID0gY3VycmVudF9saW5lLmxhc3RJbmRleE9mKCcvJywgcG9zaXRpb24uY2ggLSAxKTtcclxuXHJcblx0XHRcdFx0XHQvLyBwZXJmb3JtIGF1dG9FbmNsb3NlU3VwXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvRW5jbG9zZVN1cF90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGxhc3Rfc3VwZXJzY3JpcHQgPiBsYXN0X2RpdmlkZSkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmF1dG9FbmNsb3NlU3VwKGVkaXRvciwgZXZlbnQsIGxhc3Rfc3VwZXJzY3JpcHQpO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHQvLyBwZXJmb3JtIGF1dG9GcmFjdGlvblxyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0ZyYWN0aW9uX3RvZ2dsZSAmJiAhdGhpcy53aXRoaW5UZXh0KGVkaXRvciwgbGFzdF9kaXZpZGUpKSB7XHJcblx0XHRcdFx0XHRcdGlmIChsYXN0X2RpdmlkZSA+IGxhc3RfZG9sbGFyKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgYnJhY2tldHMgPSBbWycoJywgJyknXSwgWyd7JywgJ30nXSwgWydbJywgJ10nXV07XHJcblx0XHRcdFx0XHRcdFx0Ly8gaWYgYW55IGJyYWNrZXRzIGluIGRlbm9taW5hdG9yIHN0aWxsIHVuY2xvc2VkLCBkb250IGRvIGF1dG9GcmFjdGlvbiB5ZXRcclxuXHRcdFx0XHRcdFx0XHRpZiAoIWJyYWNrZXRzLnNvbWUoZSA9PiB0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBlWzBdLCBlWzFdLCBwb3NpdGlvbi5jaCwgbGFzdF9kaXZpZGUpWzBdKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuYXV0b0ZyYWN0aW9uQ002KGVkaXRvciwgbGFzdF9zdXBlcnNjcmlwdCk7XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0Ly8gcGVyZm9ybSBhdXRvTGFyZ2VCcmFja2V0XHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvTGFyZ2VCcmFja2V0X3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRsZXQgc3ltYm9sX2JlZm9yZSA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDEgfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9KVxyXG5cdFx0XHRcdFx0XHRpZiAoc3ltYm9sX2JlZm9yZSA9PSAnKScgfHwgc3ltYm9sX2JlZm9yZSA9PSAnXScpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hdXRvTGFyZ2VCcmFja2V0KGVkaXRvciwgZXZlbnQpO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6ICdFbnRlcicsXHJcblx0XHRcdHJ1bjogKCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpXHJcblx0XHRcdFx0aWYgKCF2aWV3KSByZXR1cm4gZmFsc2VcclxuXHRcdFx0XHRjb25zdCBlZGl0b3IgID0gdmlldy5lZGl0b3JcclxuXHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMud2l0aGluQW55QnJhY2tldHNfZG9jdW1lbnQoXHJcblx0XHRcdFx0XHRcdGVkaXRvcixcclxuXHRcdFx0XHRcdFx0J1xcXFxiZWdpbnsnICsgdGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3BhcmFtZXRlcixcclxuXHRcdFx0XHRcdFx0J1xcXFxlbmR7JyArIHRoaXMuc2V0dGluZ3MuYWRkQWxpZ25CbG9ja19wYXJhbWV0ZXIpXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJ1xcXFxcXFxcXFxuJicpXHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLFxyXG5cdFx0XHRcdFx0XHQnXFxcXGJlZ2lueycgKyB0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlcixcclxuXHRcdFx0XHRcdFx0J1xcXFxlbmR7JyArIHRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfcGFyYW1ldGVyXHJcblx0XHRcdFx0XHQpKSB7XHJcblx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCcgXFxcXFxcXFwgJylcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hZGRDYXNlc0Jsb2NrX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMud2l0aGluQW55QnJhY2tldHNfZG9jdW1lbnQoXHJcblx0XHRcdFx0XHRcdGVkaXRvcixcclxuXHRcdFx0XHRcdFx0J1xcXFxiZWdpbntjYXNlc30nLFxyXG5cdFx0XHRcdFx0XHQnXFxcXGVuZHtjYXNlc30nXHJcblx0XHRcdFx0XHQpKSB7XHJcblx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCcgXFxcXFxcXFxcXG4nKVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gZG91YmxlIGVudGVyIGZvciAkJFxyXG5cdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRjb25zdCBwcmV2Ml9DaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDIgfSxcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSlcclxuXHRcdFx0XHRcdGNvbnN0IG5leHQyX0NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0sXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoICsgMiB9KVxyXG5cdFx0XHRcdFx0aWYgKHByZXYyX0NoYXI9PVwiJCRcIiYmbmV4dDJfQ2hhcj09XCIkJFwiKSB7XHJcblx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCdcXG4nKVxyXG5cdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHBvc2l0aW9uKVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2VcclxuXHRcdFx0XHRcdH1cdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gZmFsc2VcclxuXHRcdFx0fSxcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogJ3snLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9DbG9zZUN1cmx5X3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYnJhY2tldHMgPSBbWycoJywgJyknXSwgWyd7JywgJ30nXSwgWydbJywgJ10nXV07XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoKzEgfSk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfMmNoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCsyIH0pO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBmb2xsb3dlZF9ieV8kc3BhY2V0YWJub25lZG91Ymxlc2xhc2ggPSAoWyckJywnICcsJ1x0JywnJ10uY29udGFpbnMobmV4dF9jaGFyKSB8fCBuZXh0XzJjaGFyID09ICdcXFxcXFxcXCcpO1xyXG5cdFx0XHRcdFx0XHRpZiAoIXRoaXMud2l0aGluQW55QnJhY2tldHNfaW5saW5lKGVkaXRvciwgYnJhY2tldHMpICYmIGZvbGxvd2VkX2J5XyRzcGFjZXRhYm5vbmVkb3VibGVzbGFzaCkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCd7fScpO1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMX0pO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogJ1snLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9DbG9zZVNxdWFyZV90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGJyYWNrZXRzID0gW1snKCcsICcpJ10sIFsneycsICd9J10sIFsnWycsICddJ11dO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0X2NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCsxIH0pO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0XzJjaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0sXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2grMiB9KTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZm9sbG93ZWRfYnlfJHNwYWNldGFibm9uZWRvdWJsZXNsYXNoID0gKFsnJCcsJyAnLCdcdCcsJyddLmNvbnRhaW5zKG5leHRfY2hhcikgfHwgbmV4dF8yY2hhciA9PSAnXFxcXFxcXFwnKTtcclxuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLndpdGhpbkFueUJyYWNrZXRzX2lubGluZShlZGl0b3IsIGJyYWNrZXRzKSAmJiBmb2xsb3dlZF9ieV8kc3BhY2V0YWJub25lZG91Ymxlc2xhc2gpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignW10nKTtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoKzF9KTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2VcclxuXHRcdFx0fSxcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogJygnLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9DbG9zZVJvdW5kX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYnJhY2tldHMgPSBbWycoJywgJyknXSwgWyd7JywgJ30nXSwgWydbJywgJ10nXV07XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoKzEgfSk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfMmNoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCsyIH0pO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBmb2xsb3dlZF9ieV8kc3BhY2V0YWJub25lZG91Ymxlc2xhc2ggPSAoWyckJywnICcsJ1x0JywnJ10uY29udGFpbnMobmV4dF9jaGFyKSB8fCBuZXh0XzJjaGFyID09ICdcXFxcXFxcXCcpO1xyXG5cdFx0XHRcdFx0XHRpZiAoIXRoaXMud2l0aGluQW55QnJhY2tldHNfaW5saW5lKGVkaXRvciwgYnJhY2tldHMpICYmIGZvbGxvd2VkX2J5XyRzcGFjZXRhYm5vbmVkb3VibGVzbGFzaCkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCcoKScpO1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMX0pO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogJ30nLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9DbG9zZVJvdW5kX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZW5kID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSkubGVuZ3RoXHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfc3ltID0gZWRpdG9yLmdldFJhbmdlKHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2h9LHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMX0pXHJcblx0XHRcdFx0XHRcdGlmICghdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgXCJ7XCIsIFwifVwiLCBlbmQsIDApWzBdICYmXHJcblx0XHRcdFx0XHRcdCAhdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgXCJ7XCIsIFwifVwiLCBlbmQsIDAsIGZhbHNlKVswXSAmJlxyXG5cdFx0XHRcdFx0XHQgbmV4dF9zeW0gPT0gXCJ9XCIpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMX0pXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiAnXScsXHJcblx0XHRcdHJ1bjogKCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpXHJcblx0XHRcdFx0aWYgKCF2aWV3KSByZXR1cm4gZmFsc2VcclxuXHJcblx0XHRcdFx0Y29uc3QgZWRpdG9yICA9IHZpZXcuZWRpdG9yXHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0Nsb3NlUm91bmRfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBlbmQgPSBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lKS5sZW5ndGhcclxuXHRcdFx0XHRcdFx0Y29uc3QgbmV4dF9zeW0gPSBlZGl0b3IuZ2V0UmFuZ2Uoe2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaH0se2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsxfSlcclxuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBcIltcIiwgXCJdXCIsIGVuZCwgMClbMF0gJiZcclxuXHRcdFx0XHRcdFx0ICF0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBcIltcIiwgXCJdXCIsIGVuZCwgMCwgZmFsc2UpWzBdICYmXHJcblx0XHRcdFx0XHRcdCBuZXh0X3N5bSA9PSBcIl1cIikge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsxfSlcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlXHJcblx0XHRcdH0sXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6ICcpJyxcclxuXHRcdFx0cnVuOiAoKTogYm9vbGVhbiA9PiB7XHJcblx0XHRcdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldylcclxuXHRcdFx0XHRpZiAoIXZpZXcpIHJldHVybiBmYWxzZVxyXG5cclxuXHRcdFx0XHRjb25zdCBlZGl0b3IgID0gdmlldy5lZGl0b3JcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvQ2xvc2VSb3VuZF90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGVuZCA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUpLmxlbmd0aFxyXG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0X3N5bSA9IGVkaXRvci5nZXRSYW5nZSh7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNofSx7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNoKzF9KVxyXG5cdFx0XHRcdFx0XHRpZiAoIXRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsIFwiKFwiLCBcIilcIiwgZW5kLCAwKVswXSAmJlxyXG5cdFx0XHRcdFx0XHQgIXRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsIFwiKFwiLCBcIilcIiwgZW5kLCAwLCBmYWxzZSlbMF0gJiZcclxuXHRcdFx0XHRcdFx0IG5leHRfc3ltID09IFwiKVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNoKzF9KVxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2VcclxuXHRcdFx0fSxcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogJ20nLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGlmICghdGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHJldHVybiBmYWxzZVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cclxuXHRcdFx0XHRpZiAoIXRoaXMuc2V0dGluZ3MuYXV0b1N1bUxpbWl0X3RvZ2dsZSkgcmV0dXJuO1xyXG5cdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0aWYgKGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAzIH0sXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pID09ICdcXFxcc3UnKSB7XHJcblx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCdtXFxcXGxpbWl0cycpXHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cdFx0fSxcclxuXHRdKSk7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGNvbnNvbGUubG9nKCdsb2FkaW5nIFF1aWNrLUxhdGV4IHBsdWdpbicpO1xyXG5cclxuXHRcdHRoaXMucmVnaXN0ZXJFZGl0b3JFeHRlbnNpb24odGhpcy5tYWtlRXh0ZW5zaW9uVGhpbmcoKSk7XHJcblxyXG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHJcblx0XHQvLyBwcmVwcm9jZXNzIHNob3J0aGFuZCBhcnJheVxyXG5cdFx0bGV0IHNob3J0aGFuZHMgPSB0aGlzLnNldHRpbmdzLmN1c3RvbVNob3J0aGFuZF9wYXJhbWV0ZXJcclxuXHRcdHdoaWxlKHNob3J0aGFuZHMuc2xpY2UoLTEpPT1cIlxcblwiKXtcclxuXHRcdFx0c2hvcnRoYW5kcyA9IHNob3J0aGFuZHMuc2xpY2UoMCwtMSlcclxuXHRcdH1cclxuXHRcdGlmKHNob3J0aGFuZHMuc2xpY2UoLTEpPT1cIjtcIil7XHJcblx0XHRcdHNob3J0aGFuZHMgPSBzaG9ydGhhbmRzLnNsaWNlKDAsLTEpXHJcblx0XHR9XHJcblx0XHRpZihzaG9ydGhhbmRzLmxhc3RJbmRleE9mKFwiO1xcblwiKT09LTEpe1xyXG5cdFx0XHR0aGlzLnNob3J0aGFuZF9hcnJheSA9IHNob3J0aGFuZHMuc3BsaXQoXCIsXCIpLm1hcChpdGVtPT5pdGVtLnNwbGl0KFwiOlwiKS5tYXAoaXRlbT0+aXRlbS50cmltKCkpKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuc2hvcnRoYW5kX2FycmF5ID0gc2hvcnRoYW5kcy5zcGxpdChcIjtcXG5cIikubWFwKGl0ZW09Pml0ZW0uc3BsaXQoXCI6XCIpKTtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0dGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnJlZ2lzdGVyQ29kZU1pcnJvcigoY206IENvZGVNaXJyb3IuRWRpdG9yKSA9PiB7XHJcblx0XHRcdFx0Y20ub24oJ3ZpbS1tb2RlLWNoYW5nZScsIHRoaXMuaGFuZGxlVmltTW9kZUNoYW5nZSk7XHJcblx0XHRcdFx0Y20ub24oJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleURvd24pO1xyXG5cdFx0XHRcdGNtLm9uKCdrZXlwcmVzcycsIHRoaXMuaGFuZGxlS2V5UHJlc3MpO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBRdWlja0xhdGV4U2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cclxuXHRcdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0XHRpZDogJ2FkZEFsaWduQmxvY2snLFxyXG5cdFx0XHRcdG5hbWU6ICdBZGQgQWxpZ24gQmxvY2snLFxyXG5cdFx0XHRcdGhvdGtleXM6IFtcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0bW9kaWZpZXJzOiBbJ0FsdCcsICdTaGlmdCddLFxyXG5cdFx0XHRcdFx0XHRrZXk6ICdBJyxcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XSxcclxuXHRcdFx0XHRlZGl0b3JDYWxsYmFjazogKGVkaXRvcikgPT4gdGhpcy5hZGRBbGlnbkJsb2NrKGVkaXRvciksXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0XHRpZDogJ2FkZE1hdHJpeEJsb2NrJyxcclxuXHRcdFx0XHRuYW1lOiAnQWRkIE1hdHJpeCBCbG9jaycsXHJcblx0XHRcdFx0aG90a2V5czogW1xyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRtb2RpZmllcnM6IFsnQWx0JywgJ1NoaWZ0J10sXHJcblx0XHRcdFx0XHRcdGtleTogJ00nLFxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRdLFxyXG5cdFx0XHRcdGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yKSA9PiB0aGlzLmFkZE1hdHJpeEJsb2NrKGVkaXRvciksXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0XHRpZDogJ2FkZENhc2VzQmxvY2snLFxyXG5cdFx0XHRcdG5hbWU6ICdBZGQgQ2FzZXMgQmxvY2snLFxyXG5cdFx0XHRcdGhvdGtleXM6IFtcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0bW9kaWZpZXJzOiBbJ0FsdCcsICdTaGlmdCddLFxyXG5cdFx0XHRcdFx0XHRrZXk6ICdDJyxcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XSxcclxuXHRcdFx0XHRlZGl0b3JDYWxsYmFjazogKGVkaXRvcikgPT4gdGhpcy5hZGRDYXNlc0Jsb2NrKGVkaXRvciksXHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IGhhbmRsZVZpbU1vZGVDaGFuZ2UgPSAoXHJcbiAgICAgICAgbW9kZU9iajogYW55XHJcbiAgICApIDogdm9pZCA9PiB7XHJcbiAgICAgICAgaWYgKCFtb2RlT2JqIHx8IG1vZGVPYmoubW9kZSA9PT0gJ2luc2VydCcpXHJcbiAgICAgICAgICAgIHRoaXMudmltQWxsb3dfYXV0b0Nsb3NlTWF0aCA9IHRydWU7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnZpbUFsbG93X2F1dG9DbG9zZU1hdGggPSBmYWxzZTtcclxuICAgIH07XHJcblxyXG5cdHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlS2V5RG93biA9IChcclxuXHRcdGNtOiBDb2RlTWlycm9yLkVkaXRvcixcclxuXHRcdGV2ZW50OiBLZXlib2FyZEV2ZW50LFxyXG5cdCk6IHZvaWQgPT4ge1xyXG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XHJcblx0XHRpZiAoIXZpZXcpIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBlZGl0b3IgPSB2aWV3LmVkaXRvcjtcclxuXHJcblx0XHRpZiAoWyckJywgJyAnLCAnRW50ZXInLCAnVGFiJ10uY29udGFpbnMoZXZlbnQua2V5KSkge1xyXG5cdFx0XHRzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG5cdFx0XHRcdGNhc2UgJyQnOlxyXG5cdFx0XHRcdFx0aWYgKGVkaXRvci5nZXRTZWxlY3Rpb24oKS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmVuY2xvc2VTZWxlY3Rpb25fdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgYW5jaG9yID0gZWRpdG9yLmdldEN1cnNvcihcImFuY2hvclwiKTtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBoZWFkID0gZWRpdG9yLmdldEN1cnNvcihcImhlYWRcIik7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJyQnICsgZWRpdG9yLmdldFNlbGVjdGlvbigpICsgJyQnKVxyXG5cdFx0XHRcdFx0XHRcdGlmIChhbmNob3IubGluZSA+IGhlYWQubGluZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldFNlbGVjdGlvbih7bGluZTphbmNob3IubGluZSxjaDphbmNob3IuY2h9LHtsaW5lOmhlYWQubGluZSxjaDpoZWFkLmNoKzF9KVxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYW5jaG9yLmxpbmUgPCBoZWFkLmxpbmUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRTZWxlY3Rpb24oe2xpbmU6YW5jaG9yLmxpbmUsY2g6YW5jaG9yLmNoKzF9LHtsaW5lOmhlYWQubGluZSxjaDpoZWFkLmNofSlcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldFNlbGVjdGlvbih7bGluZTphbmNob3IubGluZSxjaDphbmNob3IuY2grMX0se2xpbmU6aGVhZC5saW5lLGNoOmhlYWQuY2grMX0pXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9IFxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Ly8gY2xvc2UgbWF0aCBzeW1ib2xcclxuXHRcdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKClcclxuXHRcdFx0XHRcdFx0Y29uc3QgcHJldl9jaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2gtMX0sXHJcblx0XHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaH0pXHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNofSxcclxuXHRcdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNoKzF9KVxyXG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0Ml9jaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2h9LFxyXG5cdFx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMn0pXHJcblx0XHRcdFx0XHRcdGlmIChwcmV2X2NoYXIgIT0gXCIkXCIgJiYgbmV4dF9jaGFyID09IFwiJFwiKXtcclxuXHRcdFx0XHRcdFx0XHRpZiAobmV4dDJfY2hhciA9PSBcIiQkXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsyfSlcclxuXHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsxfSlcclxuXHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBwZXJmb3JtIGF1dG9DbG9zZU1hdGhcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0Nsb3NlTWF0aF90b2dnbGUgJiYgdGhpcy52aW1BbGxvd19hdXRvQ2xvc2VNYXRoKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oXCIkXCIpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBwZXJmb3JtIG1vdmVJbnRvTWF0aFxyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5tb3ZlSW50b01hdGhfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgdCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSlcclxuXHRcdFx0XHRcdFx0XHRjb25zdCB0MiA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0sXHJcblx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCArIDEgfSlcclxuXHRcdFx0XHRcdFx0XHRjb25zdCB0XzIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDIgfSxcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pXHJcblx0XHRcdFx0XHRcdFx0aWYgKHQgPT0gJyQnICYmIHQyICE9ICckJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDEgfSlcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRfMiA9PSAnJCQnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9KVxyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdGNhc2UgJyAnOlxyXG5cdFx0XHRcdFx0aWYgKCF0aGlzLnNldHRpbmdzLmF1dG9GcmFjdGlvbl90b2dnbGUgJiZcclxuXHRcdFx0XHRcdFx0IXRoaXMuc2V0dGluZ3MuYXV0b0xhcmdlQnJhY2tldF90b2dnbGUgJiZcclxuXHRcdFx0XHRcdFx0IXRoaXMuc2V0dGluZ3MuYXV0b0VuY2xvc2VTdXBfdG9nZ2xlICYmXHJcblx0XHRcdFx0XHRcdCF0aGlzLnNldHRpbmdzLmF1dG9FbmNsb3NlU3ViX3RvZ2dsZSAmJlxyXG5cdFx0XHRcdFx0XHQhdGhpcy5zZXR0aW5ncy5jdXN0b21TaG9ydGhhbmRfdG9nZ2xlKSByZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGxhc3RfZG9sbGFyID0gY3VycmVudF9saW5lLmxhc3RJbmRleE9mKCckJywgcG9zaXRpb24uY2ggLSAxKTtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGNoZWNrIGZvciBjdXN0b20gc2hvcnRoYW5kXHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmN1c3RvbVNob3J0aGFuZF90b2dnbGUgJiYgIXRoaXMud2l0aGluVGV4dChlZGl0b3IsIHBvc2l0aW9uLmNoKSkge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBrZXl3b3JkOnN0cmluZyA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGtleXdvcmRfbGVuZ3RoOm51bWJlciA9IDA7XHJcblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDAgOyBpIDwgdGhpcy5zaG9ydGhhbmRfYXJyYXkubGVuZ3RoIDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRrZXl3b3JkX2xlbmd0aCA9IHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzBdLmxlbmd0aDtcclxuXHRcdFx0XHRcdFx0XHRcdGlmICgga2V5d29yZF9sZW5ndGggPiBwb3NpdGlvbi5jaCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGtleXdvcmRfbGVuZ3RoID09IHBvc2l0aW9uLmNoICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRrZXl3b3JkID0gXCJAXCIgKyBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5d29yZCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoIC0gMSB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGtleXdvcmRbMF0udG9Mb3dlckNhc2UoKSA9PSBrZXl3b3JkWzBdLnRvVXBwZXJDYXNlKCkgfHwgXHJcblx0XHRcdFx0XHRcdFx0XHRcdGtleXdvcmRbMF0gPT0gXCJAXCIgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLnNob3J0aGFuZF9hcnJheVtpXVswXSA9PSBrZXl3b3JkLnNsaWNlKC0ga2V5d29yZF9sZW5ndGgpICYmIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdICE9IGtleXdvcmQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCByZXBsYWNlX3NsYXNoID0gKGtleXdvcmRbMF09PVwiXFxcXFwiICYmIHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdWzBdPT1cIlxcXFxcIikgPyAxIDogMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzZXRfY3Vyc29yX3Bvc2l0aW9uID0gdGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMV0uaW5kZXhPZihcIiNjdXJzb3JcIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZSh0aGlzLnNob3J0aGFuZF9hcnJheVtpXVsxXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggLSByZXBsYWNlX3NsYXNoIH0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc2V0X2N1cnNvcl9wb3NpdGlvbiAhPSAtMSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCArIHNldF9jdXJzb3JfcG9zaXRpb259LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCArIHNldF9jdXJzb3JfcG9zaXRpb24rN30pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoICsgc2V0X2N1cnNvcl9wb3NpdGlvbn0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnNob3J0aGFuZF9hcnJheVtpXVsxXS5zbGljZSgtMikgPT0gXCJ7fVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjaDogcG9zaXRpb24uY2ggKyB0aGlzLnNob3J0aGFuZF9hcnJheVtpXVsxXS5sZW5ndGggLSBrZXl3b3JkX2xlbmd0aCAtIDEgLSByZXBsYWNlX3NsYXNofVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBmaW5kIGxhc3QgdW5icmFja2V0ZWQgc3Vic2NyaXB0IHdpdGhpbiBsYXN0IDEwIGNoYXJhY3RlcnMgYW5kIHBlcmZvcm0gYXV0b0VuY2xvc2VTdWJcclxuXHRcdFx0XHRcdFx0Ly8gaWdub3JlIGV4cHJlc3Npb24gdGhhdCBjb250YWluICsgLSAqIC8gXlxyXG5cdFx0XHRcdFx0XHRjb25zdCBsYXN0X21hdGggPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJyQnLCBwb3NpdGlvbi5jaCAtIDEpO1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvRW5jbG9zZVN1Yl90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgbGFzdF9zdWJzY3JpcHQgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJ18nLCBwb3NpdGlvbi5jaCk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGxhc3Rfc3Vic2NyaXB0ICE9IC0xICYmIGxhc3Rfc3Vic2NyaXB0ID4gbGFzdF9tYXRoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBsZXR0ZXJfYWZ0ZXJfc3Vic2NyaXB0ID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X3N1YnNjcmlwdCArIDEgfSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdWJzY3JpcHQgKyAyIH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGxldHRlcl9hZnRlcl9zdWJzY3JpcHQgIT0gXCJ7XCIgJiYgXHJcblx0XHRcdFx0XHRcdFx0XHRcdChwb3NpdGlvbi5jaCAtIGxhc3Rfc3Vic2NyaXB0KSA8PSAxMCApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcIn1cIiwgcG9zaXRpb24pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFwie1wiLCB7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpsYXN0X3N1YnNjcmlwdCsxfSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHQvLyByZXRyaWV2ZSB0aGUgbGFzdCB1bmJyYWNrZXRlZCBzdXBlcnNjcmlwdFxyXG5cdFx0XHRcdFx0XHRsZXQgbGFzdF9zdXBlcnNjcmlwdCA9IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZignXicsIHBvc2l0aW9uLmNoKTtcclxuXHRcdFx0XHRcdFx0d2hpbGUgKGxhc3Rfc3VwZXJzY3JpcHQgIT0gLTEpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCB0d29fbGV0dGVyc19hZnRlcl9zdXBlcnNjcmlwdCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3Rfc3VwZXJzY3JpcHQgKyAxIH0sXHJcblx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X3N1cGVyc2NyaXB0ICsgMyB9KTtcclxuXHRcdFx0XHRcdFx0XHRpZiAodHdvX2xldHRlcnNfYWZ0ZXJfc3VwZXJzY3JpcHRbMF0gPT0gJ3snIHx8IHR3b19sZXR0ZXJzX2FmdGVyX3N1cGVyc2NyaXB0ID09ICcgeycpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxhc3Rfc3VwZXJzY3JpcHQgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJ14nLCBsYXN0X3N1cGVyc2NyaXB0IC0gMSk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChsYXN0X3N1cGVyc2NyaXB0IDwgbGFzdF9tYXRoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRsYXN0X3N1cGVyc2NyaXB0ID0gLTFcclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIHJldHJpZXZlIHRoZSBsYXN0IGRpdmlkZSBzeW1ib2xcclxuXHRcdFx0XHRcdFx0bGV0IGxhc3RfZGl2aWRlID0gY3VycmVudF9saW5lLmxhc3RJbmRleE9mKCcvJywgcG9zaXRpb24uY2ggLSAxKTtcclxuXHJcblx0XHRcdFx0XHRcdC8vIHBlcmZvcm0gYXV0b0VuY2xvc2VTdXBcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0VuY2xvc2VTdXBfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGxhc3Rfc3VwZXJzY3JpcHQgPiBsYXN0X2RpdmlkZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdXRvRW5jbG9zZVN1cChlZGl0b3IsIGV2ZW50LCBsYXN0X3N1cGVyc2NyaXB0KTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gcGVyZm9ybSBhdXRvRnJhY3Rpb25cclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0ZyYWN0aW9uX3RvZ2dsZSAmJiAhdGhpcy53aXRoaW5UZXh0KGVkaXRvciwgbGFzdF9kaXZpZGUpKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGxhc3RfZGl2aWRlID4gbGFzdF9kb2xsYXIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGJyYWNrZXRzID0gW1snKCcsICcpJ10sIFsneycsICd9J10sIFsnWycsICddJ11dO1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gaWYgYW55IGJyYWNrZXRzIGluIGRlbm9taW5hdG9yIHN0aWxsIHVuY2xvc2VkLCBkb250IGRvIGF1dG9GcmFjdGlvbiB5ZXRcclxuXHRcdFx0XHRcdFx0XHRcdGlmICghYnJhY2tldHMuc29tZShlID0+IHRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsIGVbMF0sIGVbMV0sIHBvc2l0aW9uLmNoLCBsYXN0X2RpdmlkZSlbMF0pKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuYXV0b0ZyYWN0aW9uKGVkaXRvciwgZXZlbnQsIGxhc3Rfc3VwZXJzY3JpcHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBwZXJmb3JtIGF1dG9MYXJnZUJyYWNrZXRcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0xhcmdlQnJhY2tldF90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgc3ltYm9sX2JlZm9yZSA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSlcclxuXHRcdFx0XHRcdFx0XHRpZiAoc3ltYm9sX2JlZm9yZSA9PSAnKScgfHwgc3ltYm9sX2JlZm9yZSA9PSAnXScpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXV0b0xhcmdlQnJhY2tldChlZGl0b3IsIGV2ZW50KTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdFbnRlcic6XHJcblx0XHRcdFx0XHQvLyBwZXJmb3JtIEVudGVyIHNob3J0Y3V0IHdpdGhpbiBtYXRyaXggYmxvY2tcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IsXHJcblx0XHRcdFx0XHRcdFx0J1xcXFxiZWdpbnsnICsgdGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXIsXHJcblx0XHRcdFx0XHRcdFx0J1xcXFxlbmR7JyArIHRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfcGFyYW1ldGVyXHJcblx0XHRcdFx0XHRcdCkpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignIFxcXFxcXFxcICcpXHJcblx0XHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gcGVyZm9ybSBFbnRlciBzaG9ydGN1dCB3aXRoaW4gYWxpZ24gYmxvY2tcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbkFueUJyYWNrZXRzX2RvY3VtZW50KFxyXG5cdFx0XHRcdFx0XHRcdGVkaXRvcixcclxuXHRcdFx0XHRcdFx0XHQnXFxcXGJlZ2lueycgKyB0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfcGFyYW1ldGVyLFxyXG5cdFx0XHRcdFx0XHRcdCdcXFxcZW5keycgKyB0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfcGFyYW1ldGVyKVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignXFxcXFxcXFxcXG4mJylcclxuXHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gZW50ZXIgZm9yIGNhc2VzIGJsb2NrXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hZGRDYXNlc0Jsb2NrX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IsXHJcblx0XHRcdFx0XHRcdFx0J1xcXFxiZWdpbntjYXNlc30nLFxyXG5cdFx0XHRcdFx0XHRcdCdcXFxcZW5ke2Nhc2VzfSdcclxuXHRcdFx0XHRcdFx0KSkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCcgXFxcXFxcXFxcXG4nKVxyXG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gZG91YmxlIGVudGVyIGZvciAkJFxyXG5cdFx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwcmV2Ml9DaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMiB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pXHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHQyX0NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCArIDIgfSlcclxuXHRcdFx0XHRcdFx0aWYgKHByZXYyX0NoYXI9PVwiJCRcIiYmbmV4dDJfQ2hhcj09XCIkJFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJ1xcbicpXHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcihwb3NpdGlvbilcclxuXHRcdFx0XHRcdFx0fVx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHRjYXNlICdUYWInOlxyXG5cdFx0XHRcdFx0Ly8gcGVyZm9ybSBUYWIgc2hvcnRjdXQgd2l0aGluIG1hdHJpeCBibG9ja1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbkFueUJyYWNrZXRzX2RvY3VtZW50KFxyXG5cdFx0XHRcdFx0XHRcdGVkaXRvcixcclxuXHRcdFx0XHRcdFx0XHQnXFxcXGJlZ2lueycgKyB0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlcixcclxuXHRcdFx0XHRcdFx0XHQnXFxcXGVuZHsnICsgdGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXJcclxuXHRcdFx0XHRcdFx0KSkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCcgJiAnKVxyXG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdC8vIFRhYiBzaG9ydGN1dCBmb3IgY2FzZXMgYmxvY2tcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmFkZENhc2VzQmxvY2tfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbkFueUJyYWNrZXRzX2RvY3VtZW50KGVkaXRvcixcclxuXHRcdFx0XHRcdFx0J1xcXFxiZWdpbntjYXNlc30nLFxyXG5cdFx0XHRcdFx0XHQnXFxcXGVuZHtjYXNlc30nXHJcblx0XHRcdFx0XHRcdCkpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignICYgJylcclxuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0Ly8gVGFiIHRvIGdvIHRvIG5leHQgI3RhYlxyXG5cdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50X2xpbmUgPSBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lKTtcclxuXHRcdFx0XHRcdGNvbnN0IHRhYl9wb3NpdGlvbiA9IGN1cnJlbnRfbGluZS5pbmRleE9mKFwiI3RhYlwiKTtcclxuXHRcdFx0XHRcdGlmICh0YWJfcG9zaXRpb24hPS0xKXtcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcIlwiLFxyXG5cdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLCBjaDp0YWJfcG9zaXRpb259LFxyXG5cdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLCBjaDp0YWJfcG9zaXRpb24rNH0pXHJcblx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6dGFiX3Bvc2l0aW9ufSlcclxuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0fTtcclxuXHRcdH07XHJcblx0fTtcclxuXHJcblx0cHJpdmF0ZSByZWFkb25seSBoYW5kbGVLZXlQcmVzcyA9IChcclxuXHRcdGNtOiBDb2RlTWlycm9yLkVkaXRvcixcclxuXHRcdGV2ZW50OiBLZXlib2FyZEV2ZW50LFxyXG5cdCk6IHZvaWQgPT4ge1xyXG5cclxuXHRcdGlmIChbJ3snLCAnWycsICcoJywgJ20nXS5jb250YWlucyhldmVudC5rZXkpKSB7XHJcblx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xyXG5cdFx0XHRpZiAoIXZpZXcpIHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IGVkaXRvciA9IHZpZXcuZWRpdG9yO1xyXG5cdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRjb25zdCBicmFja2V0cyA9IFtbJygnLCAnKSddLCBbJ3snLCAnfSddLCBbJ1snLCAnXSddXTtcclxuXHRcdFx0XHRjb25zdCBuZXh0X2NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9LFxyXG5cdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2grMSB9KTtcclxuXHRcdFx0XHRjb25zdCBuZXh0XzJjaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSxcclxuXHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoKzIgfSk7XHJcblx0XHRcdFx0Y29uc3QgZm9sbG93ZWRfYnlfJHNwYWNldGFibm9uZWRvdWJsZXNsYXNoID0gKFsnJCcsJyAnLCdcdCcsJyddLmNvbnRhaW5zKG5leHRfY2hhcikgfHwgbmV4dF8yY2hhciA9PSAnXFxcXFxcXFwnKTtcclxuXHRcdFx0XHRzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG5cdFx0XHRcdFx0Y2FzZSAneyc6XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9DbG9zZUN1cmx5X3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmICghdGhpcy53aXRoaW5BbnlCcmFja2V0c19pbmxpbmUoZWRpdG9yLCBicmFja2V0cykgJiYgZm9sbG93ZWRfYnlfJHNwYWNldGFibm9uZWRvdWJsZXNsYXNoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbigne30nKTtcclxuXHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMX0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdGNhc2UgJ1snOlxyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvQ2xvc2VTcXVhcmVfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCF0aGlzLndpdGhpbkFueUJyYWNrZXRzX2lubGluZShlZGl0b3IsIGJyYWNrZXRzKSAmJiBmb2xsb3dlZF9ieV8kc3BhY2V0YWJub25lZG91Ymxlc2xhc2gpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCdbXScpO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCsxfSk7XHJcblx0XHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0Y2FzZSAnKCc6XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9DbG9zZVJvdW5kX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmICghdGhpcy53aXRoaW5BbnlCcmFja2V0c19pbmxpbmUoZWRpdG9yLCBicmFja2V0cykgJiYgZm9sbG93ZWRfYnlfJHNwYWNldGFibm9uZWRvdWJsZXNsYXNoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignKCknKTtcclxuXHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMX0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9XHRcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0Y2FzZSAnbSc6XHJcblx0XHRcdFx0XHRcdGlmICghdGhpcy5zZXR0aW5ncy5hdXRvU3VtTGltaXRfdG9nZ2xlKSByZXR1cm47XHJcblx0XHRcdFx0XHRcdGlmIChlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAzIH0sXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSkgPT0gJ1xcXFxzdScpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignbVxcXFxsaW1pdHMnKVxyXG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fTtcclxuXHRcdH07XHJcblx0fTtcclxuXHJcblx0Ly9tYWluIGZ1bmN0aW9uc1xyXG5cdHByaXZhdGUgcmVhZG9ubHkgYXV0b0VuY2xvc2VTdXAgPSAoXHJcblx0XHRlZGl0b3I6IEVkaXRvcixcclxuXHRcdGV2ZW50OkV2ZW50LFxyXG5cdFx0bGFzdF9zdXBlcnNjcmlwdDogbnVtYmVyXHJcblx0KTogYm9vbGVhbiA9PiB7XHJcblx0XHQvLyBzdXBlcnNjcmlwdCBicmFja2V0aW5nXHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdGNvbnN0IGxldHRlcl9iZWZvcmVfY3Vyc29yID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDEgfSxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfVxyXG5cdFx0KVxyXG5cclxuXHRcdGlmIChsYXN0X3N1cGVyc2NyaXB0ICE9IC0xICYmIGxldHRlcl9iZWZvcmVfY3Vyc29yICE9IFwiXlwiKSB7XHJcblx0XHRcdGNvbnN0IGxldHRlcl9hZnRlcl9zdXBlcnNjcmlwdCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X3N1cGVyc2NyaXB0ICsgMSB9LFxyXG5cdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3Rfc3VwZXJzY3JpcHQgKyAyIH0pO1xyXG5cdFx0XHRpZiAobGV0dGVyX2FmdGVyX3N1cGVyc2NyaXB0ID09ICcoJyAmJiBsZXR0ZXJfYmVmb3JlX2N1cnNvciA9PSAnKScpIHtcclxuXHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFxyXG5cdFx0XHRcdFx0J30nLFxyXG5cdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAxIH0sXHJcblx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9XHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcblx0XHRcdFx0XHQneycsXHJcblx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X3N1cGVyc2NyaXB0ICsgMSB9LFxyXG5cdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdXBlcnNjcmlwdCArIDIgfVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH0gZWxzZSBpZiAobGV0dGVyX2FmdGVyX3N1cGVyc2NyaXB0ID09ICcgJykge1xyXG5cdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCd9Jyk7XHJcblx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZSgneycsIHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3Rfc3VwZXJzY3JpcHQgKyAyIH0pO1xyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignfScpO1xyXG5cdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoJ3snLCB7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X3N1cGVyc2NyaXB0ICsgMSB9KTtcclxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IGF1dG9GcmFjdGlvbiA9IChcclxuXHRcdGVkaXRvcjogRWRpdG9yLFxyXG5cdFx0ZXZlbnQ6RXZlbnQsXHJcblx0XHRsYXN0X3N1cGVyc2NyaXB0OiBudW1iZXJcclxuXHQpOiBib29sZWFuID0+IHtcclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0Y29uc3QgY3VycmVudF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSk7XHJcblx0XHRsZXQgbGFzdF9kaXZpZGUgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJy8nLCBwb3NpdGlvbi5jaCAtIDEpO1xyXG5cclxuXHRcdC8vIGlmIGN1cnNvciBpcyBwcmVjZWVkZWQgYnkgYSBjbG9zZSBicmFja2V0LCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlbiBicmFja2V0XHJcblx0XHQvLyBpcyBmb3VuZCBiZWZvcmUgXCIvXCIsIHJlbW92ZSB0aGUgYnJhY2tldHMgYW5kIGVuY2xvc2Ugd2hvbGUgZXhwcmVzc2lvbiB1c2luZyBcXGZyYWNcclxuXHRcdGNvbnN0IGxldHRlcl9iZWZvcmVfY3Vyc29yID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDEgfSxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfVxyXG5cdFx0KVxyXG5cclxuXHRcdC8vIGlmIHRoZXJlIGFyZSBhbnkgYnJhY2tldHMgdW5jbG9zZWQgYmVmb3JlIGRpdmlkZSBzeW1ib2wsXHJcblx0XHQvLyBpbmNsdWRlIHRoZSBvcGVuIGJyYWNrZXRzIGludG8gc3RvcF9zeW1ib2xzXHJcblx0XHRjb25zdCBicmFja2V0cyA9IFtbJygnLCAnKSddLCBbJ3snLCAnfSddLCBbJ1snLCAnXSddXTtcclxuXHRcdGxldCBzdG9wX2JyYWNrZXRzID0gW11cclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYnJhY2tldHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0aWYgKGxldHRlcl9iZWZvcmVfY3Vyc29yID09IGJyYWNrZXRzW2ldWzFdKSB7XHJcblx0XHRcdFx0Y29uc3Qgb3Blbl9icmFja2V0cyA9IHRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsIGJyYWNrZXRzW2ldWzBdLCBicmFja2V0c1tpXVsxXSwgcG9zaXRpb24uY2ggLSAxLCAwKVsxXVxyXG5cdFx0XHRcdGNvbnN0IHBvc19vZl90aGVfb3Blbl9icmFja2V0ID0gb3Blbl9icmFja2V0c1tvcGVuX2JyYWNrZXRzLmxlbmd0aCAtIDFdXHJcblx0XHRcdFx0aWYgKHBvc19vZl90aGVfb3Blbl9icmFja2V0IDwgbGFzdF9kaXZpZGUpIHtcclxuXHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcblx0XHRcdFx0XHRcdCd9JyxcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAxIH0sXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH1cclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcblx0XHRcdFx0XHRcdCd9eycsXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlIH0sXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlICsgMSB9XHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFxyXG5cdFx0XHRcdFx0XHQnXFxcXGZyYWN7JyxcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zX29mX3RoZV9vcGVuX2JyYWNrZXQgfSxcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zX29mX3RoZV9vcGVuX2JyYWNrZXQgKyAxIH1cclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHN0b3BfYnJhY2tldHMucHVzaCguLi50aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBicmFja2V0c1tpXVswXSwgYnJhY2tldHNbaV1bMV0sIGxhc3RfZGl2aWRlLCAwKVsxXSlcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZnJhYyA9IDBcclxuXHJcblx0XHQvLyBpZiBudW1lcmF0b3IgaXMgZW5jbG9zZWQgYnkgKCksIHBsYWNlIGZyYWMgaW4gZnJvbnQgb2YgKCkgYW5kIHJlbW92ZSAoKVxyXG5cdFx0bGV0IG51bWVyYXRvcl9yZW1vdmVfYnJhY2tldCA9IDBcclxuXHRcdGlmIChlZGl0b3IuZ2V0UmFuZ2UoeyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgLSAxIH0sIHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlIH0pID09ICcpJykge1xyXG5cdFx0XHRjb25zdCBudW1lcmF0b3Jfb3Blbl9icmFja2V0ID0gdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgJygnLCAnKScsIGxhc3RfZGl2aWRlIC0gMSwgMClbMV0uc2xpY2UoLTEpWzBdXHJcblx0XHRcdGZyYWMgPSBudW1lcmF0b3Jfb3Blbl9icmFja2V0IC0gMTtcclxuXHRcdFx0bnVtZXJhdG9yX3JlbW92ZV9icmFja2V0ID0gMVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29uc3Qgc3RvcF9zeW1ib2xzID0gWyckJywgJz0nLCAnPicsICc8JywgJywnLCAnLycsICcgJ11cclxuXHRcdFx0Y29uc3Qgc3ltYm9sX3Bvc2l0aW9ucyA9IHN0b3Bfc3ltYm9scy5tYXAoZSA9PiBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoZSwgbGFzdF9kaXZpZGUgLSAxKSlcclxuXHRcdFx0ZnJhYyA9IE1hdGgubWF4KGxhc3Rfc3VwZXJzY3JpcHQsIC4uLnN5bWJvbF9wb3NpdGlvbnMsIC4uLnN0b3BfYnJhY2tldHMpXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGlmIGRlbm9taW5hdG9yIGlzIGVuY2xvc2VkIGJ5ICgpLCByZW1vdmUgKClcclxuXHRcdGNvbnN0IGRlbm9taW5hdG9yID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSArIDEgfSxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfVxyXG5cdFx0KTtcclxuXHRcdGxldCBkZW5vbWluYXRvcl9yZW1vdmVfYnJhY2tldCA9IDA7XHJcblx0XHRpZiAoZGVub21pbmF0b3Iuc2xpY2UoLTEpWzBdID09ICcpJykge1xyXG5cdFx0XHRjb25zdCBkZW5vbWluYXRvcl9vcGVuX2JyYWNrZXQgPSB0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCAnKCcsICcpJywgcG9zaXRpb24uY2ggLSAxLCAwKVsxXS5zbGljZSgtMSlbMF1cclxuXHRcdFx0aWYgKGRlbm9taW5hdG9yX29wZW5fYnJhY2tldCA9PSBsYXN0X2RpdmlkZSArIDEpIHtcclxuXHRcdFx0XHRkZW5vbWluYXRvcl9yZW1vdmVfYnJhY2tldCA9IDE7XHJcblx0XHRcdH07XHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIHBlcmZvcm0gXFxmcmFjIHJlcGxhY2VcclxuXHRcdFxyXG5cdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuXHRcdFx0J30nLFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIGRlbm9taW5hdG9yX3JlbW92ZV9icmFja2V0IH0sXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH1cclxuXHRcdFx0KTtcclxuXHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcblx0XHRcdCd9eycsXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlIC0gbnVtZXJhdG9yX3JlbW92ZV9icmFja2V0IH0sXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlICsgMSArIGRlbm9taW5hdG9yX3JlbW92ZV9icmFja2V0IH1cclxuXHRcdFx0KTtcclxuXHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcblx0XHRcdCdcXFxcZnJhY3snLFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBmcmFjICsgMSB9LFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBmcmFjICsgMSArIG51bWVyYXRvcl9yZW1vdmVfYnJhY2tldCB9XHJcblx0XHRcdCk7XHJcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0cmV0dXJuXHJcblx0fTtcclxuXHJcblx0cHJpdmF0ZSByZWFkb25seSBhdXRvRnJhY3Rpb25DTTYgPSAoXHJcblx0XHRlZGl0b3I6IEVkaXRvcixcclxuXHRcdGxhc3Rfc3VwZXJzY3JpcHQ6IG51bWJlclxyXG5cdCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRjb25zdCBjdXJyZW50X2xpbmUgPSBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lKTtcclxuXHRcdGxldCBsYXN0X2RpdmlkZSA9IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZignLycsIHBvc2l0aW9uLmNoIC0gMSk7XHJcblxyXG5cdFx0Ly8gaWYgY3Vyc29yIGlzIHByZWNlZWRlZCBieSBhIGNsb3NlIGJyYWNrZXQsIGFuZCB0aGUgY29ycmVzcG9uZGluZyBvcGVuIGJyYWNrZXRcclxuXHRcdC8vIGlzIGZvdW5kIGJlZm9yZSBcIi9cIiwgcmVtb3ZlIHRoZSBicmFja2V0cyBhbmQgZW5jbG9zZSB3aG9sZSBleHByZXNzaW9uIHVzaW5nIFxcZnJhY1xyXG5cdFx0Y29uc3QgbGV0dGVyX2JlZm9yZV9jdXJzb3IgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9LFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9XHJcblx0XHQpXHJcblxyXG5cdFx0Ly8gaWYgdGhlcmUgYXJlIGFueSBicmFja2V0cyB1bmNsb3NlZCBiZWZvcmUgZGl2aWRlIHN5bWJvbCxcclxuXHRcdC8vIGluY2x1ZGUgdGhlIG9wZW4gYnJhY2tldHMgaW50byBzdG9wX3N5bWJvbHNcclxuXHRcdGNvbnN0IGJyYWNrZXRzID0gW1snKCcsICcpJ10sIFsneycsICd9J10sIFsnWycsICddJ11dO1xyXG5cdFx0bGV0IHN0b3BfYnJhY2tldHMgPSBbXVxyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBicmFja2V0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRpZiAobGV0dGVyX2JlZm9yZV9jdXJzb3IgPT0gYnJhY2tldHNbaV1bMV0pIHtcclxuXHRcdFx0XHRjb25zdCBvcGVuX2JyYWNrZXRzID0gdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgYnJhY2tldHNbaV1bMF0sIGJyYWNrZXRzW2ldWzFdLCBwb3NpdGlvbi5jaCAtIDEsIDApWzFdXHJcblx0XHRcdFx0Y29uc3QgcG9zX29mX3RoZV9vcGVuX2JyYWNrZXQgPSBvcGVuX2JyYWNrZXRzW29wZW5fYnJhY2tldHMubGVuZ3RoIC0gMV1cclxuXHRcdFx0XHRpZiAocG9zX29mX3RoZV9vcGVuX2JyYWNrZXQgPCBsYXN0X2RpdmlkZSkge1xyXG5cdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuXHRcdFx0XHRcdFx0J30nLFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDEgfSxcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuXHRcdFx0XHRcdFx0J317JyxcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgfSxcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgKyAxIH1cclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcblx0XHRcdFx0XHRcdCdcXFxcZnJhY3snLFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3Nfb2ZfdGhlX29wZW5fYnJhY2tldCB9LFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3Nfb2ZfdGhlX29wZW5fYnJhY2tldCArIDEgfVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHN0b3BfYnJhY2tldHMucHVzaCguLi50aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBicmFja2V0c1tpXVswXSwgYnJhY2tldHNbaV1bMV0sIGxhc3RfZGl2aWRlLCAwKVsxXSlcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZnJhYyA9IDBcclxuXHJcblx0XHQvLyBpZiBudW1lcmF0b3IgaXMgZW5jbG9zZWQgYnkgKCksIHBsYWNlIGZyYWMgaW4gZnJvbnQgb2YgKCkgYW5kIHJlbW92ZSAoKVxyXG5cdFx0bGV0IG51bWVyYXRvcl9yZW1vdmVfYnJhY2tldCA9IDBcclxuXHRcdGlmIChlZGl0b3IuZ2V0UmFuZ2UoeyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgLSAxIH0sIHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlIH0pID09ICcpJykge1xyXG5cdFx0XHRjb25zdCBudW1lcmF0b3Jfb3Blbl9icmFja2V0ID0gdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgJygnLCAnKScsIGxhc3RfZGl2aWRlIC0gMSwgMClbMV0uc2xpY2UoLTEpWzBdXHJcblx0XHRcdGZyYWMgPSBudW1lcmF0b3Jfb3Blbl9icmFja2V0IC0gMTtcclxuXHRcdFx0bnVtZXJhdG9yX3JlbW92ZV9icmFja2V0ID0gMVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29uc3Qgc3RvcF9zeW1ib2xzID0gWyckJywgJz0nLCAnPicsICc8JywgJywnLCAnLycsICcgJ11cclxuXHRcdFx0Y29uc3Qgc3ltYm9sX3Bvc2l0aW9ucyA9IHN0b3Bfc3ltYm9scy5tYXAoZSA9PiBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoZSwgbGFzdF9kaXZpZGUgLSAxKSlcclxuXHRcdFx0ZnJhYyA9IE1hdGgubWF4KGxhc3Rfc3VwZXJzY3JpcHQsIC4uLnN5bWJvbF9wb3NpdGlvbnMsIC4uLnN0b3BfYnJhY2tldHMpXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGlmIGRlbm9taW5hdG9yIGlzIGVuY2xvc2VkIGJ5ICgpLCByZW1vdmUgKClcclxuXHRcdGNvbnN0IGRlbm9taW5hdG9yID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSArIDEgfSxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfVxyXG5cdFx0KTtcclxuXHRcdGxldCBkZW5vbWluYXRvcl9yZW1vdmVfYnJhY2tldCA9IDA7XHJcblx0XHRpZiAoZGVub21pbmF0b3Iuc2xpY2UoLTEpWzBdID09ICcpJykge1xyXG5cdFx0XHRjb25zdCBkZW5vbWluYXRvcl9vcGVuX2JyYWNrZXQgPSB0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCAnKCcsICcpJywgcG9zaXRpb24uY2ggLSAxLCAwKVsxXS5zbGljZSgtMSlbMF1cclxuXHRcdFx0aWYgKGRlbm9taW5hdG9yX29wZW5fYnJhY2tldCA9PSBsYXN0X2RpdmlkZSArIDEpIHtcclxuXHRcdFx0XHRkZW5vbWluYXRvcl9yZW1vdmVfYnJhY2tldCA9IDE7XHJcblx0XHRcdH07XHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIHBlcmZvcm0gXFxmcmFjIHJlcGxhY2VcclxuXHRcdFxyXG5cdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuXHRcdFx0J30nLFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIGRlbm9taW5hdG9yX3JlbW92ZV9icmFja2V0IH0sXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH1cclxuXHRcdFx0KTtcclxuXHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcblx0XHRcdCd9eycsXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlIC0gbnVtZXJhdG9yX3JlbW92ZV9icmFja2V0IH0sXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlICsgMSArIGRlbm9taW5hdG9yX3JlbW92ZV9icmFja2V0IH1cclxuXHRcdFx0KTtcclxuXHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcblx0XHRcdCdcXFxcZnJhY3snLFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBmcmFjICsgMSB9LFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBmcmFjICsgMSArIG51bWVyYXRvcl9yZW1vdmVfYnJhY2tldCB9XHJcblx0XHRcdCk7XHJcblxyXG5cdFx0Y29uc3QgcG9zID0gZWRpdG9yLmdldEN1cnNvcigpXHJcblx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvcy5saW5lLGNoOnBvcy5jaCsxLWRlbm9taW5hdG9yX3JlbW92ZV9icmFja2V0fSlcclxuXHRcdHJldHVybiB0cnVlXHJcblx0fTtcclxuXHJcblx0cHJpdmF0ZSByZWFkb25seSBhdXRvTGFyZ2VCcmFja2V0ID0gKFxyXG5cdFx0ZWRpdG9yOiBFZGl0b3IsXHJcblx0XHRldmVudDogRXZlbnRcclxuXHQpOiBib29sZWFuID0+IHtcclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0bGV0IGJyYWNrZXRzID0gW1snWycsICddJ10sIFsnKCcsICcpJ11dO1xyXG5cdFx0Y29uc3QgcHJldl9jaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaC0xfSxcclxuXHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2h9XHJcblx0XHQpXHJcblx0XHRjb25zdCBjdXJyZW50X2JyYWNrZXRzID0gYnJhY2tldHMuZmlsdGVyKGUgPT4gZVsxXT09cHJldl9jaGFyKVswXVxyXG5cdFx0aWYgKGN1cnJlbnRfYnJhY2tldHMubGVuZ3RoPT0wKSByZXR1cm47XHJcblx0XHRcclxuXHRcdGNvbnN0IG9wZW5fYnJhY2tldCA9IHRoaXMudW5jbG9zZWRfYnJhY2tldChcclxuXHRcdFx0ZWRpdG9yLFxyXG5cdFx0XHRjdXJyZW50X2JyYWNrZXRzWzBdLFxyXG5cdFx0XHRjdXJyZW50X2JyYWNrZXRzWzFdLFxyXG5cdFx0XHRwb3NpdGlvbi5jaC0xLFxyXG5cdFx0XHQwKVsxXS5zbGljZSgtMSlbMF1cclxuXHRcdGNvbnN0IHRleHQgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOm9wZW5fYnJhY2tldH0sXHJcblx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNofSlcclxuXHRcdFx0XHJcblx0XHRjb25zdCBsYXJnZV9vcGVyYXRvcnMgPSBbJ1xcXFxzdW0nLCAnXFxcXGludCcsICdcXFxcZnJhYycsJ1xcXFxkZnJhYyddO1xyXG5cdFx0bGV0IGxhcmdlX29wZXJhdG9yc19sb2NhdGlvbnM6bnVtYmVyW10gPSBbXTtcclxuXHJcblx0XHRmb3IgKGxldCBpID0gMCA7IGkgPCBsYXJnZV9vcGVyYXRvcnMubGVuZ3RoIDsgaSsrKSB7XHJcblx0XHRcdGxldCBmb3VuZCA9IDA7XHJcblx0XHRcdHdoaWxlIChmb3VuZCAhPSAtMSkge1xyXG5cdFx0XHRcdGZvdW5kID0gdGV4dC5pbmRleE9mKGxhcmdlX29wZXJhdG9yc1tpXSxmb3VuZCsxKVxyXG5cdFx0XHRcdGlmIChmb3VuZCAhPSAtMSkge1xyXG5cdFx0XHRcdFx0bGFyZ2Vfb3BlcmF0b3JzX2xvY2F0aW9ucy5wdXNoKGZvdW5kICsgb3Blbl9icmFja2V0KTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9O1x0XHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IGN1cnJlbnRfbGluZSA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUpO1xyXG5cdFx0XHJcblx0XHRsZXQgcmV0VmFsID0gZmFsc2VcclxuXHJcblx0XHRmb3IgKGxldCBpID0gMCA7IGkgPCBsYXJnZV9vcGVyYXRvcnNfbG9jYXRpb25zLmxlbmd0aCA7IGkrKykge1xyXG5cdFx0XHRsZXQgbGVmdF9hcnJheTogbnVtYmVyW10gPSBbXTtcclxuXHRcdFx0bGV0IHJpZ2h0X2FycmF5OiBudW1iZXJbXSA9IFtdO1xyXG5cdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGJyYWNrZXRzLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0bGVmdF9hcnJheS5wdXNoKFxyXG5cdFx0XHRcdFx0Li4udGhpcy51bmNsb3NlZF9icmFja2V0KFxyXG5cdFx0XHRcdFx0XHRlZGl0b3IsIFxyXG5cdFx0XHRcdFx0XHRicmFja2V0c1tqXVswXSwgXHJcblx0XHRcdFx0XHRcdGJyYWNrZXRzW2pdWzFdLCBcclxuXHRcdFx0XHRcdFx0bGFyZ2Vfb3BlcmF0b3JzX2xvY2F0aW9uc1tpXSwgXHJcblx0XHRcdFx0XHRcdDApWzFdKVxyXG5cdFx0XHRcdHJpZ2h0X2FycmF5LnB1c2goXHJcblx0XHRcdFx0XHQuLi50aGlzLnVuY2xvc2VkX2JyYWNrZXQoXHJcblx0XHRcdFx0XHRcdGVkaXRvciwgXHJcblx0XHRcdFx0XHRcdGJyYWNrZXRzW2pdWzBdLCBcclxuXHRcdFx0XHRcdFx0YnJhY2tldHNbal1bMV0sIFxyXG5cdFx0XHRcdFx0XHRjdXJyZW50X2xpbmUubGVuZ3RoLCBcclxuXHRcdFx0XHRcdFx0bGFyZ2Vfb3BlcmF0b3JzX2xvY2F0aW9uc1tpXSwgXHJcblx0XHRcdFx0XHRcdGZhbHNlKVsxXSlcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGZvciAobGV0IGsgPSByaWdodF9hcnJheS5sZW5ndGggLSAxOyBrID4gLTE7IGstLSkge1xyXG5cdFx0XHRcdC8vIGNoZWNrIGlmIHVuY2xvc2VkIGJyYWNrZXRzIGFscmVhZHkgYXBwZW5kZWQgd2l0aCBcXHJpZ2h0XHJcblx0XHRcdFx0bGV0IGNoZWNrX3JpZ2h0ID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcmlnaHRfYXJyYXlba10gLSA2IH0sXHJcblx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiByaWdodF9hcnJheVtrXSB9KTtcclxuXHRcdFx0XHRpZiAoY2hlY2tfcmlnaHQgIT0gJ1xcXFxyaWdodCcpIHtcclxuXHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoJ1xcXFxyaWdodCcsIHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHJpZ2h0X2FycmF5W2tdIH0pO1xyXG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdHJldFZhbCA9IHRydWVcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Zm9yIChsZXQgbCA9IGxlZnRfYXJyYXkubGVuZ3RoIC0gMTsgbCA+IC0xOyBsLS0pIHtcclxuXHRcdFx0XHQvLyBjaGVjayBpZiB1bmNsb3NlZCBicmFja2V0cyBhbHJlYWR5IGFwcGVuZGVkIHdpdGggXFxsZWZ0XHJcblx0XHRcdFx0bGV0IGNoZWNrX2xlZnQgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsZWZ0X2FycmF5W2xdIC0gNSB9LFxyXG5cdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGVmdF9hcnJheVtsXSB9KTtcclxuXHRcdFx0XHRpZiAoY2hlY2tfbGVmdCAhPSAnXFxcXGxlZnQnKSB7XHJcblx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKCdcXFxcbGVmdCcsIHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxlZnRfYXJyYXlbbF0gfSk7XHJcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0cmV0VmFsID0gdHJ1ZVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdH07XHJcblx0XHR9O1xyXG5cdFx0cmV0dXJuIHJldFZhbFxyXG5cdH07XHJcblxyXG5cdHByaXZhdGUgYWRkQWxpZ25CbG9jayhlZGl0b3I6IEVkaXRvcikge1xyXG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XHJcblx0XHRpZiAoIXZpZXcpIHJldHVybjtcclxuXHRcdGlmICghdGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3RvZ2dsZSkgcmV0dXJuO1xyXG5cdFx0Y29uc3Qgc2VsZWN0ZWRfdGV4dCA9IGVkaXRvci5nZXRTZWxlY3Rpb24oKVxyXG5cdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oXHJcblx0XHRcdCdcXFxcYmVnaW57JyArIHRoaXMuc2V0dGluZ3MuYWRkQWxpZ25CbG9ja19wYXJhbWV0ZXIgKyAnfVxcbicgK1xyXG5cdFx0XHRzZWxlY3RlZF90ZXh0ICtcclxuXHRcdFx0J1xcblxcXFxlbmR7JyArIHRoaXMuc2V0dGluZ3MuYWRkQWxpZ25CbG9ja19wYXJhbWV0ZXIgKyAnfSdcclxuXHRcdCk7XHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBwb3NpdGlvbi5saW5lIC0gMSwgY2g6IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUgLSAxKS5sZW5ndGggfSlcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYWRkTWF0cml4QmxvY2soZWRpdG9yOiBFZGl0b3IpIHtcclxuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xyXG5cdFx0aWYgKCF2aWV3KSByZXR1cm47XHJcblx0XHRpZiAoIXRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfdG9nZ2xlKSByZXR1cm47XHJcblx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihcclxuXHRcdFx0J1xcXFxiZWdpbnsnICsgdGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXIgKyAnfScgK1xyXG5cdFx0XHQnXFxcXGVuZHsnICsgdGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXIgKyAnfSdcclxuXHRcdCk7XHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdGNvbnN0IHJldHJhY3RfbGVuZ3RoID0gKCdcXFxcZW5keycgKyB0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlciArICd9JykubGVuZ3RoXHJcblx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gcmV0cmFjdF9sZW5ndGggfSlcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYWRkQ2FzZXNCbG9jayhlZGl0b3I6IEVkaXRvcikge1xyXG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XHJcblx0XHRpZiAoIXZpZXcpIHJldHVybjtcclxuXHRcdGlmICghdGhpcy5zZXR0aW5ncy5hZGRDYXNlc0Jsb2NrX3RvZ2dsZSkgcmV0dXJuO1xyXG5cdFx0Y29uc3Qgc2VsZWN0ZWRfdGV4dCA9IGVkaXRvci5nZXRTZWxlY3Rpb24oKVxyXG5cdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oXHJcblx0XHRcdCdcXFxcYmVnaW57Y2FzZXN9XFxuJyArXHJcblx0XHRcdHNlbGVjdGVkX3RleHQgK1xyXG5cdFx0XHQnXFxuXFxcXGVuZHtjYXNlc30nXHJcblx0XHQpO1xyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogcG9zaXRpb24ubGluZSAtIDEsIGNoOiBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lIC0gMSkubGVuZ3RoIH0pXHJcblx0fVxyXG5cclxuXHQvL3V0aWxpdHkgZnVuY3Rpb25zXHJcblx0cHJpdmF0ZSByZWFkb25seSB1bmNsb3NlZF9icmFja2V0ID0gKFxyXG5cdFx0ZWRpdG9yOiBFZGl0b3IsXHJcblx0XHRvcGVuX3N5bWJvbDogc3RyaW5nLFxyXG5cdFx0Y2xvc2Vfc3ltYm9sOiBzdHJpbmcsXHJcblx0XHRiZWZvcmU6IG51bWJlcixcclxuXHRcdGFmdGVyOiBudW1iZXIsXHJcblx0XHR1bmNsb3NlZF9vcGVuX3N5bWJvbDogYm9vbGVhbiA9IHRydWUgLy9mYWxzZSBmb3IgdW5jbG9zZWRfY2xvc2Vfc3ltYm9sXHJcblx0KTogW2Jvb2xlYW4sIG51bWJlcltdXSA9PiB7XHJcblx0XHQvLyBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIHVuY2xvc2VkIGJyYWNrZXQgd2l0aGluIHRoZSByYW5nZSBzcGVjaWZpZWQgYnkgYmVmb3JlIGFuZCBhZnRlclxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRjb25zdCB0ZXh0ID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBhZnRlciB9LFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBiZWZvcmUgfSk7XHJcblx0XHRsZXQgb3Blbl9hcnJheTogbnVtYmVyW10gPSBbXVxyXG5cdFx0bGV0IGNsb3NlX2FycmF5OiBudW1iZXJbXSA9IFtdXHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0c3dpdGNoICh0ZXh0W2ldKSB7XHJcblx0XHRcdFx0Y2FzZSBvcGVuX3N5bWJvbDpcclxuXHRcdFx0XHRcdG9wZW5fYXJyYXkucHVzaChhZnRlciArIGkpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBjbG9zZV9zeW1ib2w6XHJcblx0XHRcdFx0XHRpZiAob3Blbl9hcnJheS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdG9wZW5fYXJyYXkucG9wKClcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGNsb3NlX2FycmF5LnB1c2goYWZ0ZXIgKyBpKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAodW5jbG9zZWRfb3Blbl9zeW1ib2wpIHtcclxuXHRcdFx0cmV0dXJuIFtvcGVuX2FycmF5Lmxlbmd0aCA+IDAsIG9wZW5fYXJyYXldO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cmV0dXJuIFtjbG9zZV9hcnJheS5sZW5ndGggPiAwLCBjbG9zZV9hcnJheV07XHJcblx0XHR9XHJcblxyXG5cdH07XHJcblxyXG5cdHByaXZhdGUgcmVhZG9ubHkgd2l0aGluVGV4dCA9IChcclxuXHRcdGVkaXRvcjogRWRpdG9yLFxyXG5cdFx0YXRfd2hlcmU6IG51bWJlclxyXG5cdCk6IEJvb2xlYW4gPT4ge1xyXG5cdFx0Ly8gY2hlY2sgaWYgd2l0aGluIHRleHR7fVxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKClcclxuXHRcdGNvbnN0IGJyYWNrZXRfbG9jYXRpb25zID0gdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgJ3snLCd9JywgYXRfd2hlcmUsIDApWzFdXHJcblx0XHRyZXR1cm4gYnJhY2tldF9sb2NhdGlvbnMuc29tZShsb2MgPT4gZWRpdG9yLmdldFJhbmdlKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOmxvYy00fSx7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpsb2N9KT09XCJ0ZXh0XCIpXHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IHdpdGhpbk1hdGggPSAoXHJcblx0XHRlZGl0b3I6IEVkaXRvclxyXG5cdCk6IEJvb2xlYW4gPT4ge1xyXG5cdFx0Ly8gY2hlY2sgaWYgY3Vyc29yIHdpdGhpbiAkJFxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKClcclxuXHRcdGNvbnN0IGN1cnJlbnRfbGluZSA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUpO1xyXG5cdFx0bGV0IGN1cnNvcl9pbmRleCA9IHBvc2l0aW9uLmNoXHJcblx0XHRsZXQgZnJvbSA9IDA7XHJcblx0XHRsZXQgZm91bmQgPSBjdXJyZW50X2xpbmUuaW5kZXhPZignJCcsIGZyb20pO1xyXG5cdFx0d2hpbGUgKGZvdW5kICE9IC0xICYmIGZvdW5kIDwgY3Vyc29yX2luZGV4KSB7XHJcblx0XHRcdGxldCBuZXh0X2NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogZm91bmQgKyAxIH0sXHJcblx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogZm91bmQgKyAyIH0pXHJcblx0XHRcdGxldCBwcmV2X2NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogZm91bmQgLSAxIH0sXHJcblx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogZm91bmQgfSlcclxuXHRcdFx0aWYgKG5leHRfY2hhciA9PSAnJCcgfHwgcHJldl9jaGFyID09ICckJyB8fCBuZXh0X2NoYXIgPT0gJyAnKSB7XHJcblx0XHRcdFx0ZnJvbSA9IGZvdW5kICsgMTtcclxuXHRcdFx0XHRmb3VuZCA9IGN1cnJlbnRfbGluZS5pbmRleE9mKCckJywgZnJvbSk7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZnJvbSA9IGZvdW5kICsgMTtcclxuXHRcdFx0XHRsZXQgbmV4dF9mb3VuZCA9IGN1cnJlbnRfbGluZS5pbmRleE9mKCckJywgZnJvbSk7XHJcblx0XHRcdFx0aWYgKG5leHRfZm91bmQgPT0gLTEpIHtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGN1cnNvcl9pbmRleCA+IGZvdW5kICYmIGN1cnNvcl9pbmRleCA8PSBuZXh0X2ZvdW5kKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0ZnJvbSA9IG5leHRfZm91bmQgKyAxO1xyXG5cdFx0XHRcdFx0Zm91bmQgPSBjdXJyZW50X2xpbmUuaW5kZXhPZignJCcsIGZyb20pO1xyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZG9jdW1lbnRfdGV4dCA9IGVkaXRvci5nZXRWYWx1ZSgpO1xyXG5cdFx0Y3Vyc29yX2luZGV4ID0gZWRpdG9yLnBvc1RvT2Zmc2V0KHBvc2l0aW9uKTtcclxuXHRcdGZyb20gPSAwO1xyXG5cdFx0Zm91bmQgPSBkb2N1bWVudF90ZXh0LmluZGV4T2YoJyQkJywgZnJvbSk7XHJcblx0XHRsZXQgY291bnQgPSAwO1xyXG5cdFx0d2hpbGUgKGZvdW5kICE9IC0xICYmIGZvdW5kIDwgY3Vyc29yX2luZGV4KSB7XHJcblx0XHRcdGNvdW50ICs9IDE7XHJcblx0XHRcdGZyb20gPSBmb3VuZCArIDI7XHJcblx0XHRcdGZvdW5kID0gZG9jdW1lbnRfdGV4dC5pbmRleE9mKCckJCcsIGZyb20pO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGNvdW50ICUgMiA9PSAxO1xyXG5cdH07XHJcblxyXG5cdHByaXZhdGUgcmVhZG9ubHkgd2l0aGluQW55QnJhY2tldHNfaW5saW5lID0gKFxyXG5cdFx0ZWRpdG9yOiBFZGl0b3IsXHJcblx0XHRicmFja2V0czogc3RyaW5nW11bXVxyXG5cdCk6IEJvb2xlYW4gPT4ge1xyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKClcclxuXHRcdGNvbnN0IGN1cnJlbnRfbGluZSA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUpO1xyXG5cdFx0cmV0dXJuIGJyYWNrZXRzLnNvbWUoZSA9PiB0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBlWzBdLCBlWzFdLCBwb3NpdGlvbi5jaCwgMClbMF0gJiZcclxuXHRcdFx0dGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgZVswXSwgZVsxXSwgY3VycmVudF9saW5lLmxlbmd0aCwgcG9zaXRpb24uY2gsIGZhbHNlKVswXSlcclxuXHR9O1xyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IHdpdGhpbkFueUJyYWNrZXRzX2RvY3VtZW50ID0gKFxyXG5cdFx0ZWRpdG9yOiBFZGl0b3IsXHJcblx0XHRvcGVuX3N5bWJvbDogc3RyaW5nLFxyXG5cdFx0Y2xvc2Vfc3ltYm9sOiBzdHJpbmdcclxuXHQpOiBCb29sZWFuID0+IHtcclxuXHRcdGNvbnN0IGRvY3VtZW50X3RleHQgPSBlZGl0b3IuZ2V0VmFsdWUoKVxyXG5cdFx0Y29uc3QgY3Vyc29yUG9zID0gZWRpdG9yLmdldEN1cnNvcigpXHJcblx0XHRjb25zdCBjdXJzb3JfaW5kZXggPSBlZGl0b3IucG9zVG9PZmZzZXQoY3Vyc29yUG9zKVxyXG5cdFx0Ly8gY291bnQgb3BlbiBzeW1ib2xzXHJcblx0XHRsZXQgZnJvbSA9IDA7XHJcblx0XHRsZXQgZm91bmQgPSBkb2N1bWVudF90ZXh0LmluZGV4T2Yob3Blbl9zeW1ib2wsIGZyb20pO1xyXG5cdFx0bGV0IGNvdW50ID0gMDtcclxuXHRcdHdoaWxlIChmb3VuZCAhPSAtMSAmJiBmb3VuZCA8IGN1cnNvcl9pbmRleCkge1xyXG5cdFx0XHRjb3VudCArPSAxO1xyXG5cdFx0XHRmcm9tID0gZm91bmQgKyAxO1xyXG5cdFx0XHRmb3VuZCA9IGRvY3VtZW50X3RleHQuaW5kZXhPZihvcGVuX3N5bWJvbCwgZnJvbSk7XHJcblx0XHR9XHJcblx0XHRjb25zdCBvcGVuX3N5bWJvbF9jb3VudHMgPSBjb3VudFxyXG5cclxuXHRcdC8vIGNvdW50IGNsb3NlIHN5bWJvbHNcclxuXHRcdGZyb20gPSAwO1xyXG5cdFx0Zm91bmQgPSBkb2N1bWVudF90ZXh0LmluZGV4T2YoY2xvc2Vfc3ltYm9sLCBmcm9tKTtcclxuXHRcdGNvdW50ID0gMDtcclxuXHRcdHdoaWxlIChmb3VuZCAhPSAtMSAmJiBmb3VuZCA8IGN1cnNvcl9pbmRleCkge1xyXG5cdFx0XHRjb3VudCArPSAxO1xyXG5cdFx0XHRmcm9tID0gZm91bmQgKyAxO1xyXG5cdFx0XHRmb3VuZCA9IGRvY3VtZW50X3RleHQuaW5kZXhPZihjbG9zZV9zeW1ib2wsIGZyb20pO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgY2xvc2Vfc3ltYm9sX2NvdW50cyA9IGNvdW50XHJcblxyXG5cdFx0cmV0dXJuIG9wZW5fc3ltYm9sX2NvdW50cyA+IGNsb3NlX3N5bWJvbF9jb3VudHM7XHJcblx0fTtcclxuXHJcblx0Ly8gU2V0dGluZ3MgbG9hZCBhbmQgc2F2ZVxyXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcclxuXHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xyXG5cdH07XHJcblxyXG5cdHB1YmxpYyBvbnVubG9hZCgpOiB2b2lkIHtcclxuXHRcdGNvbnNvbGUubG9nKCd1bmxvYWRpbmcgUXVpY2stTGF0ZXggcGx1Z2luJyk7XHJcblxyXG5cdFx0dGhpcy5hcHAud29ya3NwYWNlLml0ZXJhdGVDb2RlTWlycm9ycygoY20pID0+IHtcclxuXHRcdFx0Y20ub2ZmKCd2aW0tbW9kZS1jaGFuZ2UnLCB0aGlzLmhhbmRsZVZpbU1vZGVDaGFuZ2UpO1xyXG5cdFx0XHRjbS5vZmYoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleURvd24pO1xyXG5cdFx0XHRjbS5vZmYoJ2tleXByZXNzJywgdGhpcy5oYW5kbGVLZXlQcmVzcyk7XHJcblx0XHRcdFxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxufTtcclxuXHJcblxyXG5jbGFzcyBRdWlja0xhdGV4U2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogUXVpY2tMYXRleFBsdWdpbjtcclxuXHJcblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogUXVpY2tMYXRleFBsdWdpbikge1xyXG5cdFx0c3VwZXIoYXBwLCBwbHVnaW4pO1xyXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZGlzcGxheSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XHJcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ1F1aWNrIExhdGV4IGZvciBPYnNpZGlhbiAtIFNldHRpbmdzJyB9KTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0F1dG9jbG9zZSAkJCBzeW1ib2xzJylcclxuXHRcdFx0LnNldERlc2MoJ1R5cGluZyBvbmUgJCBzeW1ib2wgd2lsbCBhdXRvbWF0aWNhbGx5IGxvc2Ugd2l0aCBhbm90aGVyICQgc3ltYm9sICcrXHJcblx0XHRcdFx0XHQnKGJlc3QgdXNlZCB3aXRoIFwiTW92ZSBjdXJzb3IgYmV0d2VlbiAkJCBzeW1ib2xzXCIgZnVuY3Rpb24nKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvQ2xvc2VNYXRoX3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvQ2xvc2VNYXRoX3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnTW92ZSBjdXJzb3IgYmV0d2VlbiAkJCBzeW1ib2xzJylcclxuXHRcdFx0LnNldERlc2MoJ1R5cGluZyB0d28gY29uc2VjdXRpdmUgJCBzeW1ib2xzIHdpbGwgYXV0b21hdGljYWxseSBzaGlmdCB0aGUgY3Vyc29yIGluIGJldHdlZW4gdGhlICQkIHN5bWJvbHMnKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5tb3ZlSW50b01hdGhfdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLm1vdmVJbnRvTWF0aF90b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0VuY2xvc2Ugc2VsZWN0ZWQgZXhwcmVzc2lvbiB3aXRoIG1hdGggc3ltYm9sICQkJylcclxuXHRcdFx0LnNldERlc2MoJ1NlbGVjdCBhbiBleHByZXNzaW9uIGFuZCBwcmVzcyBcIiRcIiBrZXkgd2lsbCBhdXRvbWF0aWNhbGx5ICcgK1xyXG5cdFx0XHRcdCdlbmNsb3NlIHRoZSBleHByZXNzaW9uIHdpdGggdGhlIG1hdGggc3ltYm9scy4nKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmNsb3NlU2VsZWN0aW9uX3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmNsb3NlU2VsZWN0aW9uX3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnQXV0b2Nsb3NlIHt9IGN1cmx5IGJyYWNrZXRzJylcclxuXHRcdFx0LnNldERlc2MoJ1R5cGluZyBcIntcIiB3aWxsIGF1dG9tYXRpY2FsbHkgY2xvc2Ugd2l0aCBcIn1cIicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9DbG9zZUN1cmx5X3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvQ2xvc2VDdXJseV90b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0F1dG9jbG9zZSBbXSBzcXVhcmUgYnJhY2tldHMnKVxyXG5cdFx0XHQuc2V0RGVzYygnVHlwaW5nIFwiW1wiIHdpbGwgYXV0b21hdGljYWxseSBjbG9zZSB3aXRoIFwiXVwiJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0Nsb3NlU3F1YXJlX3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvQ2xvc2VTcXVhcmVfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdBdXRvY2xvc2UgKCkgcm91bmQgYnJhY2tldHMnKVxyXG5cdFx0XHQuc2V0RGVzYygnVHlwaW5nIFwiKFwiIHdpbGwgYXV0b21hdGljYWxseSBjbG9zZSB3aXRoIFwiKVwiJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0Nsb3NlUm91bmRfdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9DbG9zZVJvdW5kX3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnQXV0byBhcHBlbmQgXCJcXFxcbGltaXRzXCIgYWZ0ZXIgXCJcXFxcc3VtXCInKVxyXG5cdFx0XHQuc2V0RGVzYygnVHlwaW5nIFwiXFxcXHN1bVwiIHdpbGwgYXV0b21hdGljYWxseSBhcHBlbmQgXCJcXFxcbGltaXRzXCIgdG8gc2hvcnRlbiB0aGUgc3ludGF4JyArXHJcblx0XHRcdFx0JyBmb3IgcHJvcGVyIGRpc3BsYXkgb2YgdGhlIGxpbWl0cyBmb3Igc3VtbWF0aW9uIHN5bWJvbC4nKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvU3VtTGltaXRfdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9TdW1MaW1pdF90b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0F1dG8gZW5sYXJnZSBicmFja2V0cyB0aGF0IGNvbnRhaW5zIFxcXFxzdW0sIFxcXFxpbnQgb3IgXFxcXGZyYWMnKVxyXG5cdFx0XHQuc2V0RGVzYygnUGxhY2UgY3Vyc29yIHJpZ2h0IGFmdGVyIGEgKCkgb3IgW10gYnJhY2tldGVkIGV4cHJlc3Npb24gdGhhdCBjb250YWlucyBlaXRoZXIgJyArXHJcblx0XHRcdFx0J1xcXFxzdW0sIFxcXFxpbnQgb3IgXFxcXGZyYWMgYW5kIHByZXNzIHRoZSBzcGFjZSBrZXksIHRoZSBvdXRlcm1vc3QgYnJhY2tldHMgd2lsbCBiZScgK1xyXG5cdFx0XHRcdCcgYXBwZW5kZWQgd2l0aCBcXFxcbGVmdCBhbmQgXFxcXHJpZ2h0IGluIG9yZGVyIHRvIGRpc3BsYXkgbGFyZ2VyIGJyYWNrZXRzIHRvIGVuY2xvc2UgdGhlc2UgYmlnIGV4cHJlc3Npb25zLicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9MYXJnZUJyYWNrZXRfdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9MYXJnZUJyYWNrZXRfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdBdXRvIGVuY2xvc2UgZXhwcmVzc2lvbiBhZnRlciBzdXBlcnNjaXB0IHdpdGgge30nKVxyXG5cdFx0XHQuc2V0RGVzYygnVHlwaW5nIGV4cHJlc3Npb24gYWZ0ZXIgc3VwZXJzY3JpcHQgXCJeXCIgc3ltYm9sIGZvbGxvdyBieSBhIFwic3BhY2VcIiBrZXkgJyArXHJcblx0XHRcdFx0J3dpbGwgYXV0b21hdGljYWxseSBzdXJyb3VuZCB0aGUgZXhwcmVzc2lvbiB3aXRoIFwie31cIicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9FbmNsb3NlU3VwX3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvRW5jbG9zZVN1cF90b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0F1dG8gZW5jbG9zZSBleHByZXNzaW9uIGFmdGVyIHN1YnNjcmlwdCB3aXRoIHt9JylcclxuXHRcdFx0LnNldERlc2MoJ1R5cGluZyBleHByZXNzaW9uIGFmdGVyIHN1YnNjcmlwdCBcIl9cIiBzeW1ib2wgZm9sbG93IGJ5IGEgXCJzcGFjZVwiIGtleSAnICtcclxuXHRcdFx0XHQnd2lsbCBhdXRvbWF0aWNhbGx5IHN1cnJvdW5kIHRoZSBleHByZXNzaW9uIHdpdGggXCJ7fVwiLiAnICtcclxuXHRcdFx0XHQnTm90ZTogZXhwcmVzc2lvbiBtb3JlIHRoYW4gMTAgY2hhcmFjdGVycyBsb25nIHdpbGwgYmUgaWdub3JlZC4nKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvRW5jbG9zZVN1Yl90b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0VuY2xvc2VTdWJfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdUeXBlIFwiL1wiIGluc3RlYWQgb2YgXFxcXGZyYWN7fXt9JylcclxuXHRcdFx0LnNldERlc2MoJ1VzZSBcIi9cIiBzeW1ib2wgZm9yIHF1aWNrbHkgdHlwaW5nIGZyYWN0aW9ucy4gZWcuIHR5cGUgXCIxLzJcIiBmb2xsb3dlZCBieSBhIFwic3BhY2VcIiBrZXknICtcclxuXHRcdFx0XHQnIHRvIHRyYW5zZm9ybSB0byBcXFxcZnJhY3sxfXsyfScpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9GcmFjdGlvbl90b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0ZyYWN0aW9uX3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnU2hvcnRjdXQgZm9yIEFsaWduIEJsb2NrJylcclxuXHRcdFx0LnNldERlc2MoJ1VzZSBzaG9ydGN1dCBrZXkgdG8gcXVpY2tseSBpbnNlcnQgXFxcXGJlZ2lue2FsaWduKn0gXFxcXGVuZHthbGlnbip9IGJsb2NrLiAnICtcclxuXHRcdFx0XHQnRGVmYXVsdDogXCJBbHQrU2hpZnQrQVwiIChNYWM6IFwiT3B0aW9uK1NoaWZ0K0FcIiknKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnQWxpZ24gQmxvY2sgUGFyYW1ldGVyJylcclxuXHRcdFx0LnNldERlc2MoJ1NldCB0aGUgdGV4dCBwYXJhbWV0ZXIgaW4gXFxcXGJlZ2lue3BhcmFtZXRlcn0gYW5kIFxcXFxlbmR7cGFyYW1ldGVyfS4nKVxyXG5cdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignZGVmYXVsdDogYWxpZ24qJylcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYWRkQWxpZ25CbG9ja19wYXJhbWV0ZXIpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYWRkQWxpZ25CbG9ja19wYXJhbWV0ZXIgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdTaG9ydGN1dCBmb3IgTWF0cml4IEJsb2NrJylcclxuXHRcdFx0LnNldERlc2MoJ1VzZSBzaG9ydGN1dCBrZXkgdG8gcXVpY2tseSAgaW5zZXJ0IFxcXFxiZWdpbntwbWF0cml4fSBcXFxcZW5ke3BtYXRyaXh9IGJsb2NrLiAnICtcclxuXHRcdFx0XHQnRGVmYXVsdDogXCJBbHQrU2hpZnQrTVwiIChNYWM6IFwiT3B0aW9uK1NoaWZ0K01cIiknKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja190b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdNYXRyaXggQmxvY2sgUGFyYW1ldGVyJylcclxuXHRcdFx0LnNldERlc2MoJ1NldCB0aGUgdGV4dCBwYXJhbWV0ZXIgaW4gXFxcXGJlZ2lue3BhcmFtZXRlcn0gYW5kIFxcXFxlbmR7cGFyYW1ldGVyfS4nKVxyXG5cdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignZGVmYXVsdDogcG1hdHJpeCcpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlcilcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXIgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdTaG9ydGN1dCBmb3IgQ2FzZXMgQmxvY2snKVxyXG5cdFx0XHQuc2V0RGVzYygnVXNlIHNob3J0Y3V0IGtleSB0byBxdWlja2x5IGluc2VydCBcXFxcYmVnaW57Y2FzZXN9IFxcXFxlbmR7Y2FzZXN9IGJsb2NrLiAnICtcclxuXHRcdFx0XHQnRGVmYXVsdDogXCJBbHQrU2hpZnQrQ1wiIChNYWM6IFwiT3B0aW9uK1NoaWZ0K0NcIiknKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hZGRDYXNlc0Jsb2NrX3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hZGRDYXNlc0Jsb2NrX3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnQ3VzdG9tIFNob3J0aGFuZCcpXHJcblx0XHRcdC5zZXREZXNjKCdVc2UgY3VzdG9tIHNob3J0aGFuZCAoY2FuIGJlIG11bHRpcGxlIGxldHRlcnMpIGZvciBjb21tb24gbGF0ZXggc3RyaW5ncy4gJytcclxuXHRcdFx0J0VnLCB0eXBpbmcgXCJhbFwiIGZvbGxvd2VkIGJ5IFwic3BhY2VcIiBrZXkgd2lsbCByZXBsYWNlIHdpdGggXCJcXFxcYWxwaGFcIicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmN1c3RvbVNob3J0aGFuZF90b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuY3VzdG9tU2hvcnRoYW5kX3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgn44CQdXBkYXRlZCHjgJFDdXN0b20gU2hvcnRoYW5kIFBhcmFtZXRlcicpXHJcblx0XHRcdC5zZXREZXNjKCdTZXBhcmF0ZSB0aGUgbXVsdGktbGV0dGVycyBzaG9ydGhhbmQgYW5kIHRoZSBzbmlwcGV0IHdpdGggXCI6XCIgYW5kICcrXHJcblx0XHRcdCdlbmQgZWFjaCBzZXQgb2Ygc2hvcnRoYW5kIHNuaXBwZXQgcGFpciBieSBcIjtcIiBhbmQgYSBuZXdsaW5lLiAnK1xyXG5cdFx0XHQnRm9yIGV4cHJlc3Npb25zIHRoYXQgZW5kIHdpdGggXCJ7fVwiLCB0aGUgY3Vyc29yIHdpbGwgYXV0b21hdGljYWxseSBiZSBwbGFjZWQgd2l0aGluIHRoZSBicmFja2V0LiAnK1xyXG5cdFx0XHQnQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB0eXBlIFwiI2N1cnNvclwiIHdpdGhpbiB0aGUgc25pcHBldCB0byBzZXQgdGhlIGN1cnNvciBsb2NhdGlvbiBhZnRlciByZXBsYWNlbWVudC4gJytcclxuXHRcdFx0J1lvdSBjYW4gYWxzbyBpbmNsdWRlIFwiI3RhYlwiIHdpdGhpbiB0aGUgc25pcHBldCBmb3IgdXNlIGNhc2VzIHN1Y2ggYXMgbXVsdGlwbGUge31zIChlLmcuIFxcXFxiaW5vbXsjY3Vyc29yfXsjdGFifSkuICcrXHJcblx0XHRcdCdQcmVzc2luZyB0YWIga2V5IGluIHN1Y2ggY2FzZXMgd2lsbCBqdW1wIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgXCIjdGFiXCIga2V5d29yZC4nK1xyXG5cdFx0XHQnU2hvcnRoYW5kcyBub3cgc3VwcG9ydCBtdWx0aWxpbmUgc25pcHBldHMgdG9vISAnK1xyXG5cdFx0XHQnKHRyeSB1bmluc3RhbGwgdGhlbiByZWluc3RhbGxpbmcgdGhlIHBsdWdpbiB0byBzZWUgdGhlIG5ldyBzZXQgb2Ygc2hvcnRoYW5kcy4pJylcclxuXHRcdFx0LnNldENsYXNzKFwidGV4dC1zbmlwcGV0cy1jbGFzc1wiKVxyXG5cdFx0XHQuYWRkVGV4dEFyZWEoKHRleHQpID0+IHRleHRcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuY3VzdG9tU2hvcnRoYW5kX3BhcmFtZXRlcilcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5jdXN0b21TaG9ydGhhbmRfcGFyYW1ldGVyID0gdmFsdWU7XHJcblx0XHRcdFx0XHR3aGlsZSh2YWx1ZS5zbGljZSgtMSk9PVwiXFxuXCIpe1xyXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsLTEpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZih2YWx1ZS5zbGljZSgtMSk9PVwiO1wiKXtcclxuXHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5zbGljZSgwLC0xKVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYodmFsdWUubGFzdEluZGV4T2YoXCI7XFxuXCIpPT0tMSl7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNob3J0aGFuZF9hcnJheSA9IHZhbHVlLnNwbGl0KFwiLFwiKS5tYXAoaXRlbT0+aXRlbS5zcGxpdChcIjpcIikubWFwKGl0ZW09Pml0ZW0udHJpbSgpKSk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zaG9ydGhhbmRfYXJyYXkgPSB2YWx1ZS5zcGxpdChcIjtcXG5cIikubWFwKGl0ZW09Pml0ZW0uc3BsaXQoXCI6XCIpKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHR9KSk7XHJcblx0fTtcclxufSJdLCJuYW1lcyI6WyJQbHVnaW4iLCJQcmVjIiwia2V5bWFwIiwiTWFya2Rvd25WaWV3IiwiUGx1Z2luU2V0dGluZ1RhYiIsIlNldHRpbmciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXVEQTtBQUNPLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMvRCxRQUFRLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDbkcsUUFBUSxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDdEcsUUFBUSxTQUFTLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDdEgsUUFBUSxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUUsS0FBSyxDQUFDLENBQUM7QUFDUDs7QUM1Q0EsTUFBTSxnQkFBZ0IsR0FBdUI7SUFDNUMsbUJBQW1CLEVBQUUsSUFBSTtJQUN6QixvQkFBb0IsRUFBRSxJQUFJO0lBQzFCLHFCQUFxQixFQUFFLElBQUk7SUFDM0Isc0JBQXNCLEVBQUUsSUFBSTtJQUM1QixxQkFBcUIsRUFBRSxJQUFJO0lBQzNCLG9CQUFvQixFQUFFLElBQUk7SUFDMUIsdUJBQXVCLEVBQUUsUUFBUTtJQUNqQyxxQkFBcUIsRUFBRSxJQUFJO0lBQzNCLHdCQUF3QixFQUFFLFNBQVM7SUFDbkMsb0JBQW9CLEVBQUUsSUFBSTtJQUMxQixtQkFBbUIsRUFBRSxJQUFJO0lBQ3pCLHVCQUF1QixFQUFFLElBQUk7SUFDN0IsbUJBQW1CLEVBQUUsSUFBSTtJQUN6QixxQkFBcUIsRUFBRSxJQUFJO0lBQzNCLHFCQUFxQixFQUFFLElBQUk7SUFDM0IsdUJBQXVCLEVBQUUsSUFBSTtJQUM3QixzQkFBc0IsRUFBRSxJQUFJO0lBQzVCLHlCQUF5QixFQUFFLHdHQUF3RztRQUM3SCx1Q0FBdUM7UUFDdkMscURBQXFEO1FBQ3JELHVEQUF1RDtRQUN2RCxtREFBbUQ7UUFDbkQscURBQXFEO1FBQ3JELG9EQUFvRDtRQUNwRCxrREFBa0Q7UUFDbEQsaUVBQWlFO1FBQ2pFLCtDQUErQztDQUNyRCxDQUFBO01BRW9CLGdCQUFpQixTQUFRQSxlQUFNO0lBQXBEOztRQUlZLDJCQUFzQixHQUFZLElBQUksQ0FBQztRQUVqQyx1QkFBa0IsR0FBRyxNQUFnQkMsVUFBSSxDQUFDLElBQUksQ0FBQ0MsV0FBTSxDQUFDLEVBQUUsQ0FBQztZQUN6RTtnQkFDQyxHQUFHLEVBQUUsR0FBRztnQkFDUixHQUFHLEVBQUU7b0JBQ0osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUNDLHFCQUFZLENBQUMsQ0FBQTtvQkFDakUsSUFBSSxDQUFDLElBQUk7d0JBQUUsT0FBTyxLQUFLLENBQUE7b0JBRXZCLE1BQU0sTUFBTSxHQUFJLElBQUksQ0FBQyxNQUFNLENBQUE7b0JBRTNCLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O3dCQUVyQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEVBQUU7NEJBQzFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7NEJBQ3pDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7NEJBQ3JDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUE7NEJBQ3JELElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFO2dDQUM1QixNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUMsSUFBSSxFQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUMsRUFBQyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxJQUFJLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7NkJBQ2xGO2lDQUFNLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFO2dDQUNuQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUMsSUFBSSxFQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUMsRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLElBQUksRUFBQyxFQUFFLEVBQUMsSUFBSSxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUE7NkJBQ2xGO2lDQUFNO2dDQUNOLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBQyxJQUFJLEVBQUMsTUFBTSxDQUFDLElBQUks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