diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index 483cf5f6..dc65b9b4 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -12,14 +12,12 @@ "dataview", "obsidian-dice-roller", "obsidian-dynamic-toc", - "emoji-shortcodes", "extract-url", "find-and-replace-in-selection", "find-unlinked-files", "obsidian-footnotes", "garble-text", "obsidian-hackernews", - "obsidian-icon-shortcodes", "obsidian-itinerary", "obsidian-journey-plugin", "ledger-obsidian", @@ -52,7 +50,6 @@ "obsidian-full-calendar", "markdown-table-editor", "obsidian-book-search-plugin", - "obsidian-columns", "obsidian-media-db-plugin", "tasks-packrat-plugin", "obsidian-tts", @@ -61,5 +58,6 @@ "obsidian-camera", "table-editor-obsidian", "obsidian-smart-typography", - "podnotes" + "podnotes", + "emoji-shortcodes" ] \ No newline at end of file diff --git a/.obsidian/plugins/multi-column-markdown/main.js b/.obsidian/plugins/multi-column-markdown/main.js new file mode 100644 index 00000000..8a7c2707 --- /dev/null +++ b/.obsidian/plugins/multi-column-markdown/main.js @@ -0,0 +1,3185 @@ +/* +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'); +var language = require('@codemirror/language'); + +/****************************************************************************** +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()); + }); +} + +/* + * Filename: multi-column-markdown/src/regionSettings.ts + * Created Date: Tuesday, February 1st 2022, 12:23:53 pm + * Author: Cameron Robinson + * + * Copyright (c) 2022 Cameron Robinson + */ +var BorderOption; +(function (BorderOption) { + BorderOption[BorderOption["enabled"] = 0] = "enabled"; + BorderOption[BorderOption["on"] = 1] = "on"; + BorderOption[BorderOption["true"] = 2] = "true"; + BorderOption[BorderOption["disabled"] = 3] = "disabled"; + BorderOption[BorderOption["off"] = 4] = "off"; + BorderOption[BorderOption["false"] = 5] = "false"; +})(BorderOption || (BorderOption = {})); +var ShadowOption; +(function (ShadowOption) { + ShadowOption[ShadowOption["enabled"] = 0] = "enabled"; + ShadowOption[ShadowOption["on"] = 1] = "on"; + ShadowOption[ShadowOption["true"] = 2] = "true"; + ShadowOption[ShadowOption["disabled"] = 3] = "disabled"; + ShadowOption[ShadowOption["off"] = 4] = "off"; + ShadowOption[ShadowOption["false"] = 5] = "false"; +})(ShadowOption || (ShadowOption = {})); +var ColumnLayout; +(function (ColumnLayout) { + ColumnLayout[ColumnLayout["standard"] = 0] = "standard"; + ColumnLayout[ColumnLayout["left"] = 1] = "left"; + ColumnLayout[ColumnLayout["first"] = 2] = "first"; + ColumnLayout[ColumnLayout["center"] = 3] = "center"; + ColumnLayout[ColumnLayout["middle"] = 4] = "middle"; + ColumnLayout[ColumnLayout["second"] = 5] = "second"; + ColumnLayout[ColumnLayout["right"] = 6] = "right"; + ColumnLayout[ColumnLayout["third"] = 7] = "third"; + ColumnLayout[ColumnLayout["last"] = 8] = "last"; +})(ColumnLayout || (ColumnLayout = {})); +var SingleColumnSize; +(function (SingleColumnSize) { + SingleColumnSize[SingleColumnSize["small"] = 0] = "small"; + SingleColumnSize[SingleColumnSize["medium"] = 1] = "medium"; + SingleColumnSize[SingleColumnSize["large"] = 2] = "large"; +})(SingleColumnSize || (SingleColumnSize = {})); +var ContentOverflowType; +(function (ContentOverflowType) { + ContentOverflowType[ContentOverflowType["scroll"] = 0] = "scroll"; + ContentOverflowType[ContentOverflowType["hidden"] = 1] = "hidden"; +})(ContentOverflowType || (ContentOverflowType = {})); +function getDefaultMultiColumnSettings() { + return { + numberOfColumns: 2, + columnLayout: ColumnLayout.standard, + drawBorder: true, + drawShadow: true, + autoLayout: false, + columnSize: SingleColumnSize.medium, + columnPosition: ColumnLayout.standard, + columnSpacing: "", + contentOverflow: ContentOverflowType.scroll + }; +} + +/** + * File: /src/utilities/settingsParser.ts + * Created Date: Friday, June 3rd 2022, 8:16 pm + * Author: Cameron Robinson + * + * Copyright (c) 2022 Cameron Robinson + */ +/** + * Here we define all of the valid settings strings that the user can enter for each setting type. + * The strings are then mapped twice, first to a valid regex string that searches for the setting + * name, ignoring all extra spaces and letter case, and then maped to a RegEx object to be used + * when parsing. + */ +const COL_POSITION_OPTION_STRS = [ + "column position", + "col position", + "column location", + "col location", + "single column location", + "single column position", +]; +const COL_POSITION_REGEX_ARR = COL_POSITION_OPTION_STRS.map(convertStringToSettingsRegex).map((value) => { + return new RegExp(value, "i"); +}); +const COL_SIZE_OPTION_STRS = [ + "column size", + "column width", + "col size", + "col width", + "single column size", + "single col size", + "single column width", + "single col width" +]; +const COL_SIZE_OPTION_REGEX_ARR = COL_SIZE_OPTION_STRS.map(convertStringToSettingsRegex).map((value) => { + return new RegExp(value, "i"); +}); +const NUMBER_OF_COLUMNS_STRS = [ + "number of columns" +]; +const NUMBER_OF_COLUMNS_REGEX_ARR = NUMBER_OF_COLUMNS_STRS.map(convertStringToSettingsRegex).map((value) => { + return new RegExp(value, "i"); +}); +const LARGEST_COLUMN_STRS = [ + "largest column" +]; +const LARGEST_COLUMN_REGEX_ARR = LARGEST_COLUMN_STRS.map(convertStringToSettingsRegex).map((value) => { + return new RegExp(value, "i"); +}); +const DRAW_BORDER_STRS = [ + "border" +]; +const DRAW_BORDER_REGEX_ARR = DRAW_BORDER_STRS.map(convertStringToSettingsRegex).map((value) => { + return new RegExp(value, "i"); +}); +const DRAW_SHADOW_STRS = [ + "shadow" +]; +const DRAW_SHADOW_REGEX_ARR = DRAW_SHADOW_STRS.map(convertStringToSettingsRegex).map((value) => { + return new RegExp(value, "i"); +}); +const AUTO_LAYOUT_SETTING_STRS = [ + "auto layout" +]; +const AUTO_LAYOUT_REGEX_ARR = AUTO_LAYOUT_SETTING_STRS.map(convertStringToSettingsRegex).map((value) => { + return new RegExp(value, "i"); +}); +const COLUMN_SPACING_REGEX_ARR = [ + "column spacing", +].map((value) => { + return new RegExp(convertStringToSettingsRegex(value), "i"); +}); +const CONTENT_OVERFLOW_REGEX_ARR = [ + "overflow", + "content overflow" +].map((value) => { + return new RegExp(convertStringToSettingsRegex(value), "i"); +}); +/** + * This function searches the settings string through each regex option. If one of the regex + * values match, it returns the first group found by the regex. This is depended on proper + * regex formatting which is done by the convertStringToSettingsRegex function defined below. + * + * @param settingsString The value that may match one of the setting options. + * @param validSettingFormatRegEx The settings options through which to check all options. If one of these regex + * values match on the string we break from the loop returning the found value. + * + * @returns the user entered data if the setting is a match, or null if non of the options matched. + */ +function getSettingsDataFromKeys(settingsString, validSettingFormatRegEx) { + for (let i = 0; i < validSettingFormatRegEx.length; i++) { + let regexSearchData = validSettingFormatRegEx[i].exec(settingsString); + if (regexSearchData !== null) { + return regexSearchData[1].trim(); + } + } + return null; +} +function parseSingleColumnSettings(settingsStr, originalSettings) { + let settingsLines = settingsStr.split("\n"); + for (let i = 0; i < settingsLines.length; i++) { + let settingsLine = settingsLines[i]; + let settingsData = getSettingsDataFromKeys(settingsLine, COL_POSITION_REGEX_ARR); + if (settingsData !== null) { + originalSettings.columnPosition = parseForSingleColumnLocation(settingsData); + } + settingsData = getSettingsDataFromKeys(settingsLine, COL_SIZE_OPTION_REGEX_ARR); + if (settingsData !== null) { + originalSettings.columnSize = parseForSingleColumnSize(settingsData); + } + } + return originalSettings; +} +function parseColumnSettings(settingsStr) { + let parsedSettings = getDefaultMultiColumnSettings(); + let settingsLines = settingsStr.split("\n"); + for (let i = 0; i < settingsLines.length; i++) { + let settingsLine = settingsLines[i]; + let settingsData = getSettingsDataFromKeys(settingsLine, NUMBER_OF_COLUMNS_REGEX_ARR); + if (settingsData !== null) { + let numOfCols = parseInt(settingsData); + if (Number.isNaN(numOfCols) === false) { + if (numOfCols >= 1 && numOfCols <= 3) { + parsedSettings.numberOfColumns = numOfCols; + } + } + } + settingsData = getSettingsDataFromKeys(settingsLine, LARGEST_COLUMN_REGEX_ARR); + if (settingsData !== null) { + let userDefLayout = ColumnLayout[settingsData]; + if (userDefLayout !== undefined) { + parsedSettings.columnLayout = userDefLayout; + parsedSettings.columnPosition = userDefLayout; + } + } + settingsData = getSettingsDataFromKeys(settingsLine, DRAW_BORDER_REGEX_ARR); + if (settingsData !== null) { + let isBorderDrawn = BorderOption[settingsData]; + if (isBorderDrawn !== undefined) { + switch (isBorderDrawn) { + case (BorderOption.disabled): + case (BorderOption.off): + case (BorderOption.false): + parsedSettings.drawBorder = false; + break; + } + } + } + settingsData = getSettingsDataFromKeys(settingsLine, DRAW_SHADOW_REGEX_ARR); + if (settingsData !== null) { + let isShadowDrawn = ShadowOption[settingsData]; + if (isShadowDrawn !== undefined) { + switch (isShadowDrawn) { + case (ShadowOption.disabled): + case (ShadowOption.off): + case (ShadowOption.false): + parsedSettings.drawShadow = false; + break; + } + } + } + settingsData = getSettingsDataFromKeys(settingsLine, AUTO_LAYOUT_REGEX_ARR); + if (settingsData !== null) { + if (settingsData === "true") { + parsedSettings.autoLayout = true; + } + } + settingsData = getSettingsDataFromKeys(settingsLine, COLUMN_SPACING_REGEX_ARR); + if (settingsData !== null) { + let parsed = getLengthUnit(settingsData.trim()); + let spacingStr = ""; + if (parsed.isValid) { + let noUnitsStr = settingsData.replace(parsed.unitStr, "").trim(); + let noUnitsNum = parseInt(noUnitsStr); + if (isNaN(noUnitsNum) === false) { + spacingStr = `${noUnitsStr}${parsed.unitStr}`; + } + } + else { + let noUnitsNum = parseInt(settingsData.trim()); + if (isNaN(noUnitsNum) === false) { + spacingStr = `${noUnitsNum}pt`; + } + } + parsedSettings.columnSpacing = spacingStr; + } + settingsData = getSettingsDataFromKeys(settingsLine, CONTENT_OVERFLOW_REGEX_ARR); + if (settingsData !== null) { + let overflowType = ContentOverflowType.scroll; + settingsData = settingsData.toLowerCase().trim(); + if (settingsData === "hidden") { + overflowType = ContentOverflowType.hidden; + } + parsedSettings.contentOverflow = overflowType; + } + } + return parsedSettings; +} +function getLengthUnit(lengthStr) { + let lastChar = lengthStr.slice(lengthStr.length - 1); + let lastTwoChars = lengthStr.slice(lengthStr.length - 2); + let unitStr = ""; + let isValid = false; + if (lastChar === "%") { + unitStr = lastChar; + isValid = true; + } + else if (lastTwoChars === "cm" || + lastTwoChars === "mm" || + lastTwoChars === "in" || + lastTwoChars === "px" || + lastTwoChars === "pt" || + lastTwoChars === "pc" || + lastTwoChars === "em" || + lastTwoChars === "ex" || + lastTwoChars === "ch" || + lastTwoChars === "vw" || + lastTwoChars === "vh") { + unitStr = lastTwoChars; + isValid = true; + } + return { isValid: isValid, unitStr: unitStr }; +} +const CODEBLOCK_REGION_ID_REGEX_STRS = [ + "id", + "region id" +]; +const CODEBLOCK_REGION_ID_REGEX_ARR = CODEBLOCK_REGION_ID_REGEX_STRS.map(convertStringToSettingsRegex).map((value) => { + return new RegExp(value, "i"); +}); +function parseStartRegionCodeBlockID(settingsStr) { + let codeBlockRegionID = ""; + let settingsLines = settingsStr.split("\n"); + for (let i = 0; i < settingsLines.length; i++) { + let settingsLine = settingsLines[i]; + let settingsData = getSettingsDataFromKeys(settingsLine, CODEBLOCK_REGION_ID_REGEX_ARR); + if (settingsData !== null) { + codeBlockRegionID = settingsData; + } + } + return codeBlockRegionID; +} +function parseForSingleColumnLocation(locationString) { + switch (locationString.toLowerCase().trim().replace(" ", "")) { + case "left": + case "leftside": + case "leftmargin": + case "leftalign": + case "leftaligned": + case "leftalignement": + case "first": + case "start": + case "beginning": + return ColumnLayout.left; + case "middle": + case "middlealigned": + case "middlealignment": + case "center": + case "centeraligned": + case "centeralignment": + case "centered": + case "standard": + return ColumnLayout.center; + case "right": + case "rightside": + case "rightmargin": + case "rightalign": + case "rightaligned": + case "rightalignment": + case "last": + case "end": + return ColumnLayout.right; + } + return ColumnLayout.center; +} +function parseForSingleColumnSize(sizeString) { + switch (sizeString = sizeString.toLowerCase().trim().replace(" ", "")) { + case "small": + case "sm": + return SingleColumnSize.small; + case "medium": + case "med": + return SingleColumnSize.medium; + case "large": + case "lg": + return SingleColumnSize.large; + } + return SingleColumnSize.medium; +} +function convertStringToSettingsRegex(originalString) { + originalString = originalString.replace(" ", " *"); + let regexString = `(?:${originalString} *: *)(.*)`; + return regexString; +} + +/* + * File: multi-column-markdown/src/MultiColumnParser.ts + * Created Date: Saturday, January 22nd 2022, 6:02:46 pm + * Author: Cameron Robinson + * + * Copyright (c) 2022 Cameron Robinson + */ +const START_REGEX_STRS = ["=== *start-multi-column(:?[a-zA-Z0-9-_\\s]*)?", + "=== *multi-column-start(:?[a-zA-Z0-9-_\\s]*)?"]; +const START_REGEX_ARR = []; +for (let i = 0; i < START_REGEX_STRS.length; i++) { + START_REGEX_ARR.push(new RegExp(START_REGEX_STRS[i])); +} +const START_REGEX_STRS_WHOLE_LINE = ["^=== *start-multi-column(:?[a-zA-Z0-9-_\\s]*)?$", + "^=== *multi-column-start(:?[a-zA-Z0-9-_\\s]*)?$"]; +const START_REGEX_ARR_WHOLE_LINE = []; +for (let i = 0; i < START_REGEX_STRS_WHOLE_LINE.length; i++) { + START_REGEX_ARR_WHOLE_LINE.push(new RegExp(START_REGEX_STRS_WHOLE_LINE[i])); +} +function findStartTag(text) { + let found = false; + let startPosition = -1; + let matchLength = 0; + for (let i = 0; i < START_REGEX_ARR.length; i++) { + let regexData = START_REGEX_ARR[i].exec(text); + if (regexData !== null && regexData.length > 0) { + startPosition = regexData.index; + matchLength = regexData[0].length; + let line = text.slice(startPosition, startPosition + matchLength); + if (START_REGEX_ARR_WHOLE_LINE[i].test(line)) { + found = true; + break; + } + } + } + let endPosition = startPosition + matchLength; + return { found, startPosition, endPosition, matchLength }; +} +function containsStartTag(text) { + return findStartTag(text).found; +} +function isStartTagWithID(text) { + let startTagData = findStartTag(text); + if (startTagData.found === true) { + let key = getStartTagKey(text); + if (key === null || key === "") { + return { isStartTag: true, hasKey: false }; + } + return { isStartTag: true, hasKey: true }; + } + return { isStartTag: false, hasKey: false }; +} +const END_REGEX_STRS = ["=== *end-multi-column", + "=== *multi-column-end"]; +const END_REGEX_ARR = []; +for (let i = 0; i < END_REGEX_STRS.length; i++) { + END_REGEX_ARR.push(new RegExp(END_REGEX_STRS[i])); +} +function findEndTag(text) { + let found = false; + let startPosition = -1; + for (let i = 0; i < END_REGEX_ARR.length; i++) { + if (END_REGEX_ARR[i].test(text)) { + found = true; + startPosition = text.search(END_REGEX_STRS[i]); + break; + } + } + let endPosition = -1; + let matchLength = 0; + for (let i = 0; i < END_REGEX_ARR.length; i++) { + let regexData = END_REGEX_ARR[i].exec(text); + if (regexData !== null && regexData.length > 0) { + found = true; + startPosition = regexData.index; + matchLength = regexData[0].length; + break; + } + } + endPosition = startPosition + matchLength; + return { found, startPosition, endPosition, matchLength }; +} +function containsEndTag(text) { + return findEndTag(text).found; +} +const COL_REGEX_STRS = ["=== *column-end *===", + "=== *end-column *===", + "=== *column-break *===", + "=== *break-column *===", + "--- *column-end *---", + "--- *end-column *---", + "--- *column-break *---", + "--- *break-column *---"]; +const COL_REGEX_ARR = []; +for (let i = 0; i < COL_REGEX_STRS.length; i++) { + COL_REGEX_ARR.push(new RegExp(COL_REGEX_STRS[i])); +} +function containsColEndTag(text) { + let found = false; + for (let i = 0; i < COL_REGEX_ARR.length; i++) { + if (COL_REGEX_ARR[i].test(text)) { + found = true; + break; + } + } + return found; +} +const COL_ELEMENT_INNER_TEXT_REGEX_STRS = ["= *column-end *=", + "= *end-column *=", + "= *column-break *=", + "= *break-column *="]; +for (let i = 0; i < COL_ELEMENT_INNER_TEXT_REGEX_STRS.length; i++) { + COL_REGEX_ARR.push(new RegExp(COL_ELEMENT_INNER_TEXT_REGEX_STRS[i])); +} +function elInnerTextContainsColEndTag(text) { + let found = false; + for (let i = 0; i < COL_REGEX_ARR.length; i++) { + if (COL_REGEX_ARR[i].test(text)) { + found = true; + break; + } + } + return found; +} +const COL_SETTINGS_REGEX_STRS = ["```settings", + "```column-settings", + "```multi-column-settings"]; +const COL_SETTINGS_REGEX_ARR = []; +for (let i = 0; i < COL_SETTINGS_REGEX_STRS.length; i++) { + COL_SETTINGS_REGEX_ARR.push(new RegExp(COL_SETTINGS_REGEX_STRS[i])); +} +function containsColSettingsTag(text) { + let found = false; + for (let i = 0; i < COL_SETTINGS_REGEX_ARR.length; i++) { + if (COL_SETTINGS_REGEX_ARR[i].test(text)) { + found = true; + break; + } + } + return found; +} +function findSettingsCodeblock(text) { + let found = false; + let startPosition = -1; + let endPosition = -1; + let matchLength = 0; + for (let i = 0; i < COL_SETTINGS_REGEX_ARR.length; i++) { + let regexData = COL_SETTINGS_REGEX_ARR[i].exec(text); + if (regexData !== null && regexData.length > 0) { + found = true; + startPosition = regexData.index; + matchLength = regexData[0].length; + endPosition = startPosition + matchLength; + let remainingText = text.slice(endPosition); + regexData = CODEBLOCK_END_REGEX.exec(remainingText); + if (regexData !== null && regexData.length > 0) { + found = true; + endPosition += regexData.index + regexData[0].length; + } + break; + } + } + return { found, startPosition, endPosition, matchLength }; +} +const START_CODEBLOCK_REGEX_ARR = [ + "```multi-column-start", + "```start-multi-column" +].map((val) => { + return new RegExp(val); +}); +function findStartCodeblock(text) { + let found = false; + let startPosition = -1; + let endPosition = -1; + let matchLength = 0; + for (let i = 0; i < START_CODEBLOCK_REGEX_ARR.length; i++) { + let regexData = START_CODEBLOCK_REGEX_ARR[i].exec(text); + if (regexData !== null && regexData.length > 0) { + found = true; + startPosition = regexData.index; + matchLength = regexData[0].length; + endPosition = startPosition + matchLength; + let remainingText = text.slice(endPosition); + regexData = CODEBLOCK_END_REGEX.exec(remainingText); + if (regexData !== null && regexData.length > 0) { + found = true; + endPosition += regexData.index + regexData[0].length; + } + break; + } + } + return { found, startPosition, endPosition, matchLength }; +} +function containsStartCodeBlock(text) { + return findStartCodeblock(text).found; +} +function containsRegionStart(text) { + return containsStartCodeBlock(text) || containsStartTag(text); +} +function countStartTags(initialText) { + let keys = []; + let text = initialText; + let startTagData = findStartTag(text); + while (startTagData.found) { + // Slice off everything before the tag + text = text.slice(startTagData.startPosition); + /** + * Get just the start tag line and then set text to everything just + * after the start tag. + */ + let tag = text.split("\n")[0]; + text = text.slice(1); // This moves the text 1 character so we dont match the same tag. + // Parse out the key and append to the list. + let key = getStartTagKey(tag); + if (key === null) { + key = ""; + } + keys.push(key); + // Search again for another tag before looping. + startTagData = findStartTag(text); + } + text = initialText; + startTagData = findStartCodeblock(text); + while (startTagData.found) { + let settingsText = text.slice(startTagData.startPosition, startTagData.endPosition); + text = text.slice(startTagData.endPosition); + let key = parseStartRegionCodeBlockID(settingsText); + if (key === null) { + key = ""; + } + keys.push(key); + // Search again for another tag before looping. + startTagData = findStartCodeblock(text); + } + return { numberOfTags: keys.length, keys }; +} +function getStartBlockOrCodeblockAboveLine(linesAboveArray) { + let startBlock = getStartBlockAboveLine(linesAboveArray); + if (startBlock !== null) { + return startBlock; + } + let codeBlock = getStartCodeBlockAboveLine(linesAboveArray); + if (codeBlock !== null) { + return codeBlock; + } + return null; +} +/** + * This function will filter a set of strings, returning all items starting + * from the closest open start tag through the last item in the set. + * + * The function filters out all end tags to make sure that the start tag we + * find is the proper start tag for the list sent. + * @param linesAboveArray + * @returns + */ +function getStartBlockAboveLine(linesAboveArray) { + // Reduce the array down into a single string so that we can + // easily RegEx over the string and find the indicies we're looking for. + let linesAboveStr = linesAboveArray.reduce((prev, current) => { + return prev + "\n" + current; + }, ""); + /* + * First thing we need to do is check if there are any end tags in the + * set of strings (which logically would close start tags and therefore + * the start tag it closes is not what we want). If there are we want to + * slowly narrow down our set of strings until the last end tag is + * removed. This makes it easier to find the closest open start tag + * in the data. + */ + let endTagSerachData = findEndTag(linesAboveStr); + while (endTagSerachData.found === true) { + // Get the index of where the first regex match in the + // string is. then we slice from 0 to index off of the string + // split it by newline, cut off the first line (which actually + // contains the regex) then reduce back down to a single string. + // + // TODO: This could be simplified if we just slice the text after + // the end tag instead of the begining. + let indexOfRegex = endTagSerachData.startPosition; + linesAboveArray = linesAboveStr.slice(indexOfRegex).split("\n").splice(1); + linesAboveStr = linesAboveArray.reduce((prev, current) => { + return prev + "\n" + current; + }, ""); + endTagSerachData = findEndTag(linesAboveStr); + } + /** + * Now we have the set of lines after all other end tags. We now + * need to check if there is still a start tag left in the data. If + * there is no start tag then we want to return an empty array and empty + * key. + */ + let startBlockKey = ""; + let startTagSearchData = findStartTag(linesAboveStr); + if (startTagSearchData.found === false) { + return null; + } + else { + /** + * Now we know there is at least 1 start key left, however there + * may be multiple start keys if the user is not closing their + * blocks. We currently dont allow recusive splitting so we + * want to get the last key in our remaining set. Same idea as + * above. + */ + while (startTagSearchData.found === true) { + // Get the index of where the first regex match in the + // string is. then we slice from 0 to index off of the string + // split it by newline, cut off the first line (which actually + // contains the regex) then reduce back down to a single string. + // + // TODO: This could be simplified if we just slice the text after + // the end tag instead of the begining. + let startIndex = startTagSearchData.startPosition; + linesAboveArray = linesAboveStr.slice(startIndex).split("\n"); + let startTag = linesAboveArray[0]; + let key = getStartTagKey(startTag); + if (key !== null) { + startBlockKey = key; + } + linesAboveArray = linesAboveArray.splice(1); + linesAboveStr = linesAboveArray.reduce((prev, current) => { + return prev + "\n" + current; + }, ""); + startTagSearchData = findStartTag(linesAboveStr); + } + } + if (startBlockKey === "") { + let codeBlockData = parseCodeBlockStart(linesAboveArray); + if (codeBlockData !== null) { + startBlockKey = codeBlockData.id; + if (codeBlockData.index > 0) { + linesAboveArray = linesAboveArray.slice(codeBlockData.index + 1); + } + } + } + return { startBlockKey, linesAboveArray }; +} +function getStartCodeBlockAboveLine(linesAboveArray) { + let linesAboveStr = linesAboveArray.reduce((prev, current) => { + return prev + "\n" + current; + }, ""); + /* + * First thing we need to do is check if there are any end tags in the + * set of strings (which logically would close start tags and therefore + * the start tag it closes is not what we want). If there are we want to + * slowly narrow down our set of strings until the last end tag is + * removed. This makes it easier to find the closest open start tag + * in the data. + */ + let endTagSerachData = findEndTag(linesAboveStr); + while (endTagSerachData.found === true) { + // Get the index of where the first regex match in the + // string is. then we slice from 0 to index off of the string + // split it by newline, cut off the first line (which actually + // contains the regex) then reduce back down to a single string. + linesAboveStr = linesAboveStr.slice(endTagSerachData.endPosition); + endTagSerachData = findEndTag(linesAboveStr); + } + let startCodeBlockData = findStartCodeblock(linesAboveStr); + let codeBlockText = linesAboveStr.slice(startCodeBlockData.startPosition, startCodeBlockData.endPosition); + let startBlockKey = ""; + if (startCodeBlockData.found === false) { + return null; + } + else { + /** + * Now we know there is at least 1 start key left, however there + * may be multiple start keys if the user is not closing their + * blocks. We currently dont allow recusive splitting so we + * want to get the last key in our remaining set. Same idea as + * above. + */ + while (startCodeBlockData.found === true) { + // Get the index of where the first regex match in the + // string is. then we slice from 0 to index off of the string + // split it by newline, cut off the first line (which actually + // contains the regex) then reduce back down to a single string. + codeBlockText = linesAboveStr.slice(startCodeBlockData.startPosition, startCodeBlockData.endPosition); + startBlockKey = parseStartRegionCodeBlockID(codeBlockText); + linesAboveStr = linesAboveStr.slice(startCodeBlockData.endPosition); + startCodeBlockData = findStartCodeblock(linesAboveStr); + } + } + let retLinesAboveArray = linesAboveStr.split("\n"); + return { startBlockKey, linesAboveArray: retLinesAboveArray }; +} +function getEndBlockBelow(linesBelow) { + // Reduce the array down into a single string so that we can + // easily RegEx over the string and find the indicies we're looking for. + let linesBelowStr = linesBelow.reduce((prev, current) => { + return prev + "\n" + current; + }, ""); + let endTagSerachData = findEndTag(linesBelowStr); + let startTagSearchData = findStartTag(linesBelowStr); + let sliceEndIndex = -1; // If neither start or end found we return the entire array. + if (endTagSerachData.found === true && startTagSearchData.found === false) { + sliceEndIndex = endTagSerachData.startPosition; + } + else if (endTagSerachData.found === false && startTagSearchData.found === true) { + sliceEndIndex = startTagSearchData.startPosition; + } + else if (endTagSerachData.found === true && startTagSearchData.found === true) { + sliceEndIndex = endTagSerachData.startPosition; + if (startTagSearchData.startPosition < endTagSerachData.startPosition) { + /** + * If we found a start tag before an end tag we want to use the start tag + * our current block is not properly ended and we use the next start tag + * as our limit + */ + sliceEndIndex = startTagSearchData.startPosition; + } + } + return linesBelow.slice(0, sliceEndIndex); +} +function getStartTagKey(startTag) { + let keySplit = startTag.split(":"); + if (keySplit.length > 1) { + return keySplit[1].replace(" ", ""); + } + return null; +} +const TAB_HEADER_END_REGEX_STR = "^```$"; +const TAB_HEADER_END_REGEX = new RegExp(TAB_HEADER_END_REGEX_STR); +function parseCodeBlockStart(codeBlockLines) { + let id = null; + for (let i = 0; i < codeBlockLines.length; i++) { + let line = codeBlockLines[i]; + if (id === null) { + let key = line.split(":")[0]; + if (key.toLowerCase() === "region id") { + id = line.split(":")[1].trim(); + } + } + else { + if (TAB_HEADER_END_REGEX.test(line)) { + return { id: id, index: i }; + } + } + } + if (id === null) { + return null; + } + else { + return { id: id, index: -1 }; + } +} +const CODEBLOCK_END_REGEX_STR = "```"; +const CODEBLOCK_END_REGEX = new RegExp(CODEBLOCK_END_REGEX_STR); + +/* + * Filename: multi-column-markdown/src/utilities/utils.ts + * Created Date: Tuesday, January 30th 2022, 4:02:19 pm + * Author: Cameron Robinson + * + * Copyright (c) 2022 Cameron Robinson + */ +function getUID(length = 10) { + if (length > 10) { + length = 10; + } + let UID = Math.random().toString(36).substring(2); + UID = UID.slice(0, length); + return UID; +} +/** + * BFS on the child nodes of the passed element searching for the first instance of the + * node type passed. Returning the element found or null if none found. + * + * @param root + * @param nodeTypeName + * @returns + */ +function searchChildrenForNodeType(root, nodeTypeName) { + nodeTypeName = nodeTypeName.toLowerCase(); + let queue = [root]; + while (queue.length > 0) { + for (let i = 0; i < queue.length; i++) { + let node = queue.shift(); + let nodeName = node.nodeName.toLowerCase(); + if (nodeName === nodeTypeName) { + return node; + } + for (let i = 0; i < node.children.length; i++) { + queue.push(node.children[i]); + } + } + } + return null; +} +function getLeafSourceMode(fileLeaf) { + return fileLeaf.getViewState().state.mode; +} +function fileStillInView(sourcePath) { + let fileLeaf = getFileLeaf(sourcePath); + if (fileLeaf === null) { + return false; + } + return true; +} +function getFileLeaf(sourcePath) { + let markdownLeaves = app.workspace.getLeavesOfType("markdown"); + if (markdownLeaves.length === 0) { + return null; + } + for (let i = 0; i < markdownLeaves.length; i++) { + if (markdownLeaves[i].getViewState().state.file === sourcePath) { + return markdownLeaves[i]; + } + } + return null; +} + +var ElementRenderType; +(function (ElementRenderType) { + ElementRenderType[ElementRenderType["undefined"] = 0] = "undefined"; + ElementRenderType[ElementRenderType["normalRender"] = 1] = "normalRender"; + ElementRenderType[ElementRenderType["specialRender"] = 2] = "specialRender"; + ElementRenderType[ElementRenderType["specialSingleElementRender"] = 3] = "specialSingleElementRender"; + ElementRenderType[ElementRenderType["canvasRenderElement"] = 4] = "canvasRenderElement"; + ElementRenderType[ElementRenderType["unRendered"] = 5] = "unRendered"; +})(ElementRenderType || (ElementRenderType = {})); +function getElementRenderType(element) { + /** + * The Dataview plugin needs to be constantly checked if the clone should be + * updated but should not always update the "dual render" aspect, so we add + * a special case for that plugin and maybe others in the future. + */ + if (hasDataview(element) === true) { + return ElementRenderType.specialSingleElementRender; + } + /** + * Some types of content are rendered in canvases which are not rendered properly + * when we clone the original node. Here we are flagging the element as a canvas + * element so we can clone the canvas to a copy element within the region. + * + */ + if (hasDataviewJS(element) === true) { + return ElementRenderType.canvasRenderElement; + } + /** + * Look for specific kinds of elements by their CSS class names here. These + * are going to be brittle links as they rely on other plugin definitions but + * as this is only adding in extra compatability to the plugins defined here + * it should be ok. + * + * These may be classes on one of the simple elements (such as a paragraph) + * that we search for below so need to look for these first. + */ + if (hasDiceRoller(element) === true || + hasCopyButton(element) === true || + hasAdmonitionFold(element) === true) { + return ElementRenderType.specialRender; + } + /** + * This checks for special types of elements that should be rendered normally. Is + * slightly redundant with next check but differentiates between types of ements + * being checked. + */ + if (hasAdmonition(element) === true || + isIFrame(element) === true) { + return ElementRenderType.normalRender; + } + /** + * If we didnt find a special element we want to check for simple elements + * such as paragraphs or lists. In the current implementation we only set up + * the special case for "specialRender" elements so this *should* be saving + * some rendering time by setting these tags properly. + */ + if (hasParagraph(element) || + hasHeader(element) || + hasList(element) || + isHorizontalRule(element) || + isTable(element)) { + return ElementRenderType.normalRender; + } + // If still nothing found we return other as the default response if nothing else found. + return ElementRenderType.specialRender; +} +function hasParagraph(element) { + return element.innerHTML.startsWith(" 0) { + return element.firstChild.nodeName.toLowerCase() === "iframe"; + } + return false; +} +function isHorizontalRule(element) { + return element.innerHTML.startsWith(" 1) { + console.debug("Found multiple heading collapse indicators in element."); + } + return null; +} + +/* + * Filename: multi-column-markdown/src/domObject.ts + * Created Date: Tuesday, February 1st 2022, 12:04:00 pm + * Author: Cameron Robinson + * + * Copyright (c) 2022 Cameron Robinson + */ +var DOMObjectTag; +(function (DOMObjectTag) { + DOMObjectTag[DOMObjectTag["none"] = 0] = "none"; + DOMObjectTag[DOMObjectTag["startRegion"] = 1] = "startRegion"; + DOMObjectTag[DOMObjectTag["regionSettings"] = 2] = "regionSettings"; + DOMObjectTag[DOMObjectTag["columnBreak"] = 3] = "columnBreak"; + DOMObjectTag[DOMObjectTag["endRegion"] = 4] = "endRegion"; +})(DOMObjectTag || (DOMObjectTag = {})); +class DOMObject { + constructor(element, linesOfElement, randomID = getUID(), tag = DOMObjectTag.none) { + this.clonedElement = null; + this.elementType = ElementRenderType.undefined; + this.elementContainer = null; + this.elementRenderedHeight = 0; + this.nodeKey = element.innerText.trim(); + this.originalElement = element; + this.UID = randomID; + this.tag = tag; + this.usingOriginalElement = false; + this.linesOfElement = linesOfElement; + if (this.tag === DOMObjectTag.none) { + this.setDomObjectTag(); + } + } + setMainDOMElement(domElement) { + this.originalElement = domElement; + this.usingOriginalElement = true; + } + setDomObjectTag() { + let elementTextSpaced = this.linesOfElement.reduce((prev, curr) => { + return prev + "\n" + curr; + }); + if (containsEndTag(this.originalElement.textContent) === true) { + this.elementType = ElementRenderType.unRendered; + this.tag = DOMObjectTag.endRegion; + // el.addClass(MultiColumnStyleCSS.RegionEndTag) + // regionalManager.updateElementTag(currentObject.UID, DOMObjectTag.endRegion); + } + else if (containsColEndTag(this.originalElement.textContent) === true || + (this.originalElement.innerHTML.startsWith("")) && elInnerTextContainsColEndTag(this.originalElement.textContent)) { + this.elementType = ElementRenderType.unRendered; + this.tag = DOMObjectTag.columnBreak; + // el.addClass(MultiColumnStyleCSS.ColumnEndTag) + // regionalManager.updateElementTag(currentObject.UID, DOMObjectTag.columnBreak); + } + else if (containsStartTag(this.originalElement.textContent) === true) { + this.elementType = ElementRenderType.unRendered; + this.tag = DOMObjectTag.startRegion; + // el.addClass(MultiColumnStyleCSS.ColumnEndTag) + // regionalManager.updateElementTag(currentObject.UID, DOMObjectTag.columnBreak); + } + else if (containsColSettingsTag(elementTextSpaced) === true) { + this.elementType = ElementRenderType.unRendered; + // el.addClass(MultiColumnStyleCSS.RegionSettings) + // regionalManager = regionalContainer.setRegionSettings(elementTextSpaced) + // regionalManager.updateElementTag(currentObject.UID, DOMObjectTag.regionSettings); + } + } +} +class TaskListDOMObject extends DOMObject { + constructor(baseDOMObject) { + super(baseDOMObject.originalElement, baseDOMObject.linesOfElement, baseDOMObject.UID, DOMObjectTag.none); + this.originalCheckboxes = []; + } + checkboxClicked(index) { + if (index < this.originalCheckboxes.length) { + let originalInput = this.originalCheckboxes[index].firstChild; + originalInput.click(); + } + } + static checkForTaskListElement(domElement) { + if (domElement.originalElement.getElementsByClassName("task-list-item").length > 0) { + return new TaskListDOMObject(domElement); + } + return domElement; + } +} + +/* + * File: multi-column-markdown/src/utilities/cssDefinitions.ts + * Created Date: Wednesday, February 16th 2022, 11:09:06 am + * Author: Cameron Robinson + * + * Copyright (c) 2022 Cameron Robinson + */ +var MultiColumnLayoutCSS; +(function (MultiColumnLayoutCSS) { + MultiColumnLayoutCSS["RegionRootContainerDiv"] = "mcm-column-root-container"; + MultiColumnLayoutCSS["RegionErrorContainerDiv"] = "mcm-column-error-region-wrapper"; + MultiColumnLayoutCSS["RegionContentContainerDiv"] = "mcm-column-region-wrapper"; + MultiColumnLayoutCSS["RegionColumnContainerDiv"] = "mcm-column-parent-container"; + MultiColumnLayoutCSS["ColumnDualElementContainer"] = "mcm-column-element-wrapper"; + MultiColumnLayoutCSS["OriginalElementType"] = "mcm-original-column-element"; + MultiColumnLayoutCSS["ClonedElementType"] = "mcm-cloned-column-element"; + MultiColumnLayoutCSS["ContentOverflowAutoScroll"] = "mcm-content-overflow-auto-scroll"; + MultiColumnLayoutCSS["ContentOverflowHidden"] = "mcm-content-overflow-hidden"; + // ------------------------------------------------------ // + MultiColumnLayoutCSS["SingleColumnSmall"] = "mcm-single-column-small"; + MultiColumnLayoutCSS["SingleColumnMed"] = "mcm-single-column-medium"; + MultiColumnLayoutCSS["SingleColumnLarge"] = "mcm-single-column-large"; + MultiColumnLayoutCSS["SingleColumnLeftLayout"] = "mcm-singlecol-layout-left"; + MultiColumnLayoutCSS["SingleColumnCenterLayout"] = "mcm-singlecol-layout-center"; + MultiColumnLayoutCSS["SingleColumnRightLayout"] = "mcm-singlecol-layout-right"; + // ------------------------------------------------------ // + MultiColumnLayoutCSS["TwoEqualColumns"] = "mcm-two-equal-columns"; + MultiColumnLayoutCSS["TwoColumnSmall"] = "mcm-two-column-small"; + MultiColumnLayoutCSS["TwoColumnLarge"] = "mcm-two-column-large"; + // ------------------------------------------------------ // + MultiColumnLayoutCSS["ThreeEqualColumns"] = "mcm-three-equal-columns"; + MultiColumnLayoutCSS["ThreeColumn_Large"] = "mcm-three-column-large"; + MultiColumnLayoutCSS["ThreeColumn_Small"] = "mcm-three-column-small"; +})(MultiColumnLayoutCSS || (MultiColumnLayoutCSS = {})); +var MultiColumnStyleCSS; +(function (MultiColumnStyleCSS) { + MultiColumnStyleCSS["RegionErrorMessage"] = "mcm-column-error-message"; + MultiColumnStyleCSS["RegionSettings"] = "mcm-column-settings-wrapper"; + MultiColumnStyleCSS["RegionContent"] = "mcm-column-content-wrapper"; + MultiColumnStyleCSS["RegionEndTag"] = "mcm-column-end-tag-wrapper"; + MultiColumnStyleCSS["ColumnEndTag"] = "mcm-column-break-tag-wrapper"; + MultiColumnStyleCSS["RegionShadow"] = "mcm-region-shadow"; + MultiColumnStyleCSS["ColumnShadow"] = "mcm-column-shadow"; + MultiColumnStyleCSS["ColumnBorder"] = "mcm-column-border"; + MultiColumnStyleCSS["ColumnContent"] = "mcm-column-div"; +})(MultiColumnStyleCSS || (MultiColumnStyleCSS = {})); + +/** + * File: /src/dom_manager/regional_managers/RegionManager.ts * + * Created Date: Sunday, May 22nd 2022, 7:49 pm * + * Author: Cameron Robinson * + * * + * Copyright (c) 2022 Cameron Robinson * + */ +class RegionManager { + constructor(data) { + this.domList = []; + this.domObjectMap = new Map(); + this.regionalSettings = getDefaultMultiColumnSettings(); + this.domList = data.domList; + this.domObjectMap = data.domObjectMap; + this.regionParent = data.regionParent; + this.fileManager = data.fileManager; + this.regionalSettings = data.regionalSettings; + this.regionKey = data.regionKey; + } + get regionParent() { + return this._regionParent; + } + set regionParent(value) { + this._regionParent = value; + } + getRegionData() { + return { + domList: this.domList, + domObjectMap: this.domObjectMap, + regionParent: this.regionParent, + fileManager: this.fileManager, + regionalSettings: this.regionalSettings, + regionKey: this.regionKey, + rootElement: null + }; + } + addObject(siblingsAbove, siblingsBelow, obj) { + let prevObj = siblingsAbove.children[siblingsAbove.children.length - 1]; + let nextObj = siblingsBelow.children[0]; + let addAtIndex = siblingsAbove.children.length; + if (prevObj !== undefined) { + prevObj.innerText; + for (let i = this.domList.length - 1; i >= 0; i--) { + if (this.domList[i].nodeKey === prevObj.innerText) { + addAtIndex = i + 1; + break; + } + } + } + let nextElIndex = addAtIndex; + if (nextObj !== undefined) { + nextObj.innerText; + for (let i = addAtIndex; i < this.domList.length; i++) { + if (this.domList[i].nodeKey === nextObj.innerText.trim()) { + nextElIndex = i; + break; + } + } + } + // console.log(" Prev: ", siblingsAbove.children[siblingsAbove.children.length - 1], "Adding: ", obj.element, " Next: ", siblingsBelow.children[0], "Overwriting:", this.domList.slice(addAtIndex, nextElIndex)); + this.domList.splice(addAtIndex, nextElIndex - addAtIndex, obj); + this.domObjectMap.set(obj.UID, obj); + // /** + // * Make a copy of the list to log, only because + // * console log updates its references with updates in memory. + // */ + // let x = this.domList.slice(0); + // console.log(x); + return addAtIndex; + } + removeObject(objectUID) { + // /** + // * Make a copy of the list to log + // */ + // let x = domList.slice(0); + // console.log(x); + // Get the object by key, remove it from the map and then + // from the list. + let obj = this.domObjectMap.get(objectUID); + this.domObjectMap.delete(objectUID); + if (obj === undefined) { + return; + } + if (this.domList.contains(obj)) { + this.domList.remove(obj); + } + if (this.domList.length === 0 && this.fileManager !== null) { + this.fileManager.removeRegion(this.regionKey); + } + // x = domList.slice(0); + // console.log(x); + } + updateElementTag(objectUID, newTag) { + let obj = this.domObjectMap.get(objectUID); + let index = this.domList.indexOf(obj); + if (index !== -1) { + this.domList[index].tag = newTag; + } + } + setRegionalSettings(regionSettings) { + this.regionalSettings = regionSettings; + } + /** + * Creates an object containing all necessary information for the region + * to be rendered to the preview pane. + * + * @returns a MultiColumnRenderData object with the root DOM element, settings object, and + * all child objects in the order they should be rendered. + */ + getRegionRenderData() { + return { + parentRenderElement: this.regionParent, + parentRenderSettings: this.regionalSettings, + domObjects: this.domList + }; + } + /** + * This fuction is called when a start tag is removed from view meaning + * our parent element storing the multi-column region is removed. It + * removes the CSS class from all of the elements so they will be + * re-rendered in the preview window. + */ + displayOriginalElements() { + for (let i = 0; i < this.domList.length; i++) { + if (this.domList[i].originalElement) { + this.domList[i].originalElement.removeClasses([MultiColumnStyleCSS.RegionEndTag, + MultiColumnStyleCSS.ColumnEndTag, + MultiColumnStyleCSS.RegionSettings, + MultiColumnStyleCSS.RegionContent]); + if (this.domList[i].originalElement.parentElement) { + this.domList[i].originalElement.parentElement.removeChild(this.domList[i].originalElement); + } + } + } + } + getID() { + return this.regionKey; + } + updateRenderedMarkdown() { + /** + * This function acts as the update loop for the multi-column regions. + * Here we loop through all of the elements within the rendered region and + * potentially update how things are rendered. We need to do this for + * compatability with other plugins. + * + * If the multi-column region is rendered before other plugins that effect + * content within the region our rendered data may not properly display + * the content from the other plugin. Here we loop through the elements + * after all plugins have had a chance to run and can make changes to the + * DOM at this point. + */ + for (let i = 0; i < this.domList.length; i++) { + /** + * Here we check for special cases + */ + if (this.domList[i] instanceof TaskListDOMObject) { + this.fixClonedCheckListButtons(this.domList[i]); + } + let elementType = this.domList[i].elementType; + /** + * If the element is not currently a special render element we check again + * as the original element may have been updated. + * + * TODO: find a way to "Officially" mark normal elements rather than + * continuously search for special render types. + */ + if (elementType !== ElementRenderType.specialRender && + elementType !== ElementRenderType.specialSingleElementRender && + elementType !== ElementRenderType.unRendered) { + // If the new result returns as a special renderer we update so + // this wont run again for this item. + elementType = getElementRenderType(this.domList[i].originalElement); + this.domList[i].originalElement.clientHeight; + } + if (elementType === ElementRenderType.specialRender || + elementType === ElementRenderType.specialSingleElementRender || + elementType === ElementRenderType.canvasRenderElement) { + this.domList[i].elementType = elementType; + this.setUpDualRender(this.domList[i]); + } + } + } + /** + * This function takes in the original element and its clone and checks if + * the element contains a task-list-item class. If so it loops through all + * items in the list and fixes their checkboxes to properly fire an event. + * The new checkbox calls the click function on the original checkbox so + * compatability with other plugins *should* remain. + * @param domElement + * @param initalizeCheckboxes + */ + fixClonedCheckListButtons(domElement, initalizeCheckboxes = false) { + if (domElement.originalElement === null || domElement.clonedElement === null) { + return; + } + let element = domElement.originalElement; + let clonedElement = domElement.clonedElement; + let clonedListCheckboxes = Array.from(clonedElement.getElementsByClassName("task-list-item")); + let originalListCheckboxes = Array.from(element.getElementsByClassName("task-list-item")); + if (initalizeCheckboxes === true) { + // When we initalize we remove the old input checkbox that contains + // the weird callback situation causing the bug. Then we create a new + // checkbox to replace it and set it up to fire the click event on + // the original checkbox so functionality is restored. + for (let i = 0; i < originalListCheckboxes.length; i++) { + const checkbox = createEl('input'); + let originalInput = originalListCheckboxes[i].firstChild; + checkbox.checked = originalInput.checked; + clonedListCheckboxes[i].replaceChild(checkbox, clonedListCheckboxes[i].children[0]); + checkbox.addClass('task-list-item-checkbox'); + checkbox.type = 'checkbox'; + checkbox.onClickEvent(() => { + domElement.checkboxClicked(i); + }); + } + } + else { + // Whenever we reach this point we update our list of original checkboxes + // that may be different from our cache. This is due to how obsidian + // changes the DOM underneath us so we need to constantly update our cache. + domElement.originalCheckboxes = originalListCheckboxes; + } + // When the Tasks plugin is installed the cloned copy of the original element contains + // an extra element for some reason. If this occurs for other reasons here we adjust + // that to keep the clone the same as the original. + if (clonedListCheckboxes.length > originalListCheckboxes.length) { + for (let i = originalListCheckboxes.length; i < clonedListCheckboxes.length; i++) { + domElement.clonedElement.removeChild(clonedListCheckboxes[i]); + } + } + } + setUpDualRender(domElement) { + /** + * If our element is of "specialRender" type it *may* need to be rendered + * using the original element rather than a copy. For example, an element + * may have an onClick event that would not get coppied to the clone. + * + * If we just moved these elements into the region it would get + * moved back out into the original location in the DOM by obsidian + * when scrolling or when the file is updated. On the next refresh it + * would be moved back but that can lead to a region jumping + * around as the item is moved in and out. + * + * Here we set up the div to contain the element and create + * a visual only clone of it. The clone will only be visible + * when the original is not in the multi-column region so it + * saves us from the visual noise of the region jumping around. + */ + let originalElement = domElement.originalElement; + let clonedElement = domElement.clonedElement; + let containerElement = domElement.elementContainer; + // Get height of the original and cloned element. If the element is not currently rendered + // it will have 0 height so we need to temporarily render it to get the height. + let originalElementHeight = getElementClientHeight(originalElement, containerElement); + let clonedElementHeight = getElementClientHeight(clonedElement, containerElement); + /** + * We only want to clone the element once to reduce GC. But if the cloned + * element's height is not equal to the original element, this means the + * item element has been updated somewhere else without the dom being + * refreshed. This can occur when elements are updated by other plugins, + * such as Dataview. + */ + if (clonedElement === null || + clonedElementHeight !== originalElementHeight) { + // Update clone and reference. + domElement.clonedElement = originalElement.cloneNode(true); + clonedElement = domElement.clonedElement; + /** + * If we updated the cloned element, we want to also update the + * element rendered in the parent container. + */ + for (let i = containerElement.children.length - 1; i >= 0; i--) { + containerElement.children[i].detach(); + } + // Update CSS, we add cloned class and remove classes from originalElement that do not apply. + clonedElement.addClass(MultiColumnLayoutCSS.ClonedElementType); + clonedElement.removeClasses([MultiColumnStyleCSS.RegionContent, MultiColumnLayoutCSS.OriginalElementType]); + containerElement.appendChild(clonedElement); + } + if (domElement.elementType === ElementRenderType.canvasRenderElement) { + containerElement.appendChild(originalElement); + function cloneCanvas(originalCanvas) { + //create a new canvas + let clonedCanvas = originalCanvas.cloneNode(true); + let context = clonedCanvas.getContext('2d'); + //set dimensions + clonedCanvas.width = originalCanvas.width; + clonedCanvas.height = originalCanvas.height; + if (clonedCanvas.width === 0 || clonedCanvas.height === 0) { + // Dont want to render if the width is 0 as it throws an error + // would happen if the old canvas hasnt been rendered yet. + return clonedCanvas; + } + //apply the old canvas to the new one + context.drawImage(originalCanvas, 0, 0); + //return the new canvas + return clonedCanvas; + } + let canvas = searchChildrenForNodeType(originalElement, "canvas"); + if (canvas !== null) { + for (let i = clonedElement.children.length - 1; i >= 0; i--) { + clonedElement.children[i].detach(); + } + clonedElement.appendChild(cloneCanvas(canvas)); + } + containerElement.removeChild(originalElement); + } + /** + * If the container element has less than 2 children we need to move the + * original element back into it. However some elements constantly get moved + * in and out causing some unwanted behavior. Those element will be tagged + * as specialSingleElementRender so we ignore those elements here. + */ + if (domElement.elementContainer.children.length < 2 && + domElement.elementType !== ElementRenderType.specialSingleElementRender) { + // console.log("Updating dual rendering.", domElement, domElement.originalElement.parentElement, domElement.originalElement.parentElement?.childElementCount); + // Make sure our CSS is up to date. + originalElement.addClass(MultiColumnLayoutCSS.OriginalElementType); + clonedElement.addClass(MultiColumnLayoutCSS.ClonedElementType); + clonedElement.removeClasses([MultiColumnStyleCSS.RegionContent, MultiColumnLayoutCSS.OriginalElementType]); + for (let i = containerElement.children.length - 1; i >= 0; i--) { + containerElement.children[i].detach(); + } + containerElement.appendChild(originalElement); + containerElement.appendChild(clonedElement); + } + } + /** + * Sets up the CSS classes and the number of columns based on the passed settings. + * @param settings The user defined settings that determine what CSS is set here. + * @param multiColumnParent The parent object that the column divs will be created under. + * @returns The list of column divs created under the passed parent element. + */ + getColumnContentDivs(settings, multiColumnParent) { + let columnContentDivs = []; + let styleStr = ""; + if (settings.columnSpacing !== "") { + styleStr = `margin-inline: ${settings.columnSpacing};`; + } + if (settings.numberOfColumns === 2) { + switch (settings.columnLayout) { + case (ColumnLayout.standard): + case (ColumnLayout.middle): + case (ColumnLayout.center): + case (ColumnLayout.third): + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.TwoEqualColumns}` + })); + multiColumnParent.createDiv({ + cls: `mcm-column-spacer`, + attr: { "style": styleStr } + }); + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.TwoEqualColumns}` + })); + break; + case (ColumnLayout.left): + case (ColumnLayout.first): + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.TwoColumnLarge}` + })); + multiColumnParent.createDiv({ + cls: `mcm-column-spacer`, + attr: { "style": styleStr } + }); + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.TwoColumnSmall}` + })); + break; + case (ColumnLayout.right): + case (ColumnLayout.second): + case (ColumnLayout.last): + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.TwoColumnSmall}` + })); + multiColumnParent.createDiv({ + cls: `mcm-column-spacer`, + attr: { "style": styleStr } + }); + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.TwoColumnLarge}` + })); + break; + } + } + else if (settings.numberOfColumns === 3) { + switch (settings.columnLayout) { + case (ColumnLayout.standard): + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.ThreeEqualColumns}` + })); + multiColumnParent.createDiv({ + cls: `mcm-column-spacer`, + attr: { "style": styleStr } + }); + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.ThreeEqualColumns}` + })); + multiColumnParent.createDiv({ + cls: `mcm-column-spacer`, + attr: { "style": styleStr } + }); + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.ThreeEqualColumns}` + })); + break; + case (ColumnLayout.left): + case (ColumnLayout.first): + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.ThreeColumn_Large}` + })); + multiColumnParent.createDiv({ + cls: `mcm-column-spacer`, + attr: { "style": styleStr } + }); + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.ThreeColumn_Small}` + })); + multiColumnParent.createDiv({ + cls: `mcm-column-spacer`, + attr: { "style": styleStr } + }); + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.ThreeColumn_Small}` + })); + break; + case (ColumnLayout.middle): + case (ColumnLayout.center): + case (ColumnLayout.second): + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.ThreeColumn_Small}` + })); + multiColumnParent.createDiv({ + cls: `mcm-column-spacer`, + attr: { "style": styleStr } + }); + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.ThreeColumn_Large}` + })); + multiColumnParent.createDiv({ + cls: `mcm-column-spacer`, + attr: { "style": styleStr } + }); + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.ThreeColumn_Small}` + })); + break; + case (ColumnLayout.right): + case (ColumnLayout.third): + case (ColumnLayout.last): + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.ThreeColumn_Small}` + })); + multiColumnParent.createDiv({ + cls: `mcm-column-spacer`, + attr: { "style": styleStr } + }); + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.ThreeColumn_Small}` + })); + multiColumnParent.createDiv({ + cls: `mcm-column-spacer`, + attr: { "style": styleStr } + }); + columnContentDivs.push(multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent} ${MultiColumnLayoutCSS.ThreeColumn_Large}` + })); + break; + } + } + return columnContentDivs; + } +} +function getElementClientHeight(element, parentRenderElement) { + let height = element.clientHeight; + if (height === 0) { + parentRenderElement.appendChild(element); + height = element.clientHeight; + parentRenderElement.removeChild(element); + } + return height; +} + +/** + * File: /src/dom_manager/regional_managers/regionDOMManager.ts * + * Created Date: Sunday, May 22nd 2022, 7:46 pm * + * Author: Cameron Robinson * + * * + * Copyright (c) 2022 Cameron Robinson * + */ +class StandardMultiColumnRegionManager extends RegionManager { + renderRegionElementsToScreen() { + this.renderColumnMarkdown(this.regionParent, this.domList, this.regionalSettings); + } + exportRegionElementsToPDF(pdfParentElement) { + // Default set shadow to off for exporting PDFs + let renderSettings = this.regionalSettings; + renderSettings.drawShadow = false; + this.renderColumnMarkdown(pdfParentElement, this.domList.slice(), renderSettings); + } + renderRegionElementsToLivePreview(parentElement) { + this.renderColumnMarkdown(parentElement, this.domList, this.regionalSettings); + } + /** + * This function takes in the data for the multi-column region and sets up the + * user defined number of children with the proper css classes to be rendered properly. + * + * @param parentElement The element that the multi-column region will be rendered under. + * @param regionElements The list of DOM objects that will be coppied under the parent object + * @param settings The settings the user has defined for the region. + */ + renderColumnMarkdown(parentElement, regionElements, settings) { + let multiColumnParent = createDiv({ + cls: MultiColumnLayoutCSS.RegionColumnContainerDiv, + }); + /** + * Pass our parent div and settings to parser to create the required + * column divs as children of the parent. + */ + let columnContentDivs = this.getColumnContentDivs(settings, multiColumnParent); + if (settings.drawShadow === true) { + multiColumnParent.addClass(MultiColumnStyleCSS.RegionShadow); + } + for (let i = 0; i < columnContentDivs.length; i++) { + if (settings.drawBorder === true) { + columnContentDivs[i].addClass(MultiColumnStyleCSS.ColumnBorder); + } + if (settings.drawShadow === true) { + columnContentDivs[i].addClass(MultiColumnStyleCSS.ColumnShadow); + } + } + // Create markdown renderer to parse the passed markdown + // between the tags. + let markdownRenderChild = new obsidian.MarkdownRenderChild(multiColumnParent); + // Remove every other child from the parent so + // we dont end up with multiple sets of data. This should + // really only need to loop once for i = 0 but loop just + // in case. + for (let i = parentElement.children.length - 1; i >= 0; i--) { + parentElement.children[i].detach(); + } + parentElement.appendChild(markdownRenderChild.containerEl); + this.appendElementsToColumns(regionElements, columnContentDivs, settings); + } + appendElementsToColumns(regionElements, columnContentDivs, settings) { + let columnIndex = 0; + for (let i = 0; i < regionElements.length; i++) { + if (regionElements[i].tag === DOMObjectTag.none || + regionElements[i].tag === DOMObjectTag.columnBreak) { + // We store the elements in a wrapper container until we determine + let element = createDiv({ + cls: MultiColumnLayoutCSS.ColumnDualElementContainer, + }); + if (settings.contentOverflow === ContentOverflowType.hidden) { + element.addClass(MultiColumnLayoutCSS.ContentOverflowHidden); + } + else { + element.addClass(MultiColumnLayoutCSS.ContentOverflowAutoScroll); + } + regionElements[i].elementContainer = element; + // Otherwise we just make a copy of the original element to display. + let clonedElement = regionElements[i].originalElement.cloneNode(true); + let headingCollapseElement = getHeadingCollapseElement(clonedElement); + if (headingCollapseElement !== null) { + // This removes the collapse arrow from the view if it exists. + headingCollapseElement.detach(); + } + regionElements[i].clonedElement = clonedElement; + element.appendChild(clonedElement); + if (regionElements[i] instanceof TaskListDOMObject) { + this.fixClonedCheckListButtons(regionElements[i], true); + } + if (element !== null && regionElements[i].tag !== DOMObjectTag.columnBreak) { + columnContentDivs[columnIndex].appendChild(element); + } + /** + * If the tag is a column break we update the column index after + * appending the item to the column div. This keeps the main DOM + * cleaner by removing other items and placing them all within + * a region container. + */ + if (regionElements[i].tag === DOMObjectTag.columnBreak && + (columnIndex + 1) < settings.numberOfColumns) { + columnIndex++; + } + } + } + } +} + +class SingleColumnRegionManager extends RegionManager { + renderRegionElementsToScreen() { + this.renderColumnMarkdown(this.regionParent, this.domList, this.regionalSettings); + } + exportRegionElementsToPDF(pdfParentElement) { + // Default set shadow to off for exporting PDFs + let renderSettings = this.regionalSettings; + renderSettings.drawShadow = false; + this.renderColumnMarkdown(pdfParentElement, this.domList.slice(), renderSettings); + } + renderRegionElementsToLivePreview(parentElement) { + this.renderColumnMarkdown(parentElement, this.domList, this.regionalSettings); + } + /** + * This function takes in the data for the multi-column region and sets up the + * user defined number of children with the proper css classes to be rendered properly. + * + * @param parentElement The element that the multi-column region will be rendered under. + * @param regionElements The list of DOM objects that will be coppied under the parent object + * @param settings The settings the user has defined for the region. + */ + renderColumnMarkdown(parentElement, regionElements, settings) { + let multiColumnParent = createDiv({ + cls: MultiColumnLayoutCSS.RegionColumnContainerDiv, + }); + if (isLeftLayout(this.regionalSettings.columnPosition)) { + multiColumnParent.addClass(MultiColumnLayoutCSS.SingleColumnLeftLayout); + } + else if (isRightLayout(this.regionalSettings.columnPosition)) { + multiColumnParent.addClass(MultiColumnLayoutCSS.SingleColumnRightLayout); + } + else { + multiColumnParent.addClass(MultiColumnLayoutCSS.SingleColumnCenterLayout); + } + /** + * Pass our parent div and settings to parser to create the required + * column divs as children of the parent. + */ + let columnContentDiv = this.createColumnContentDivs(multiColumnParent); + if (settings.drawBorder === true) { + columnContentDiv.addClass(MultiColumnStyleCSS.ColumnBorder); + } + if (settings.drawShadow === true) { + columnContentDiv.addClass(MultiColumnStyleCSS.ColumnShadow); + } + // Create markdown renderer to parse the passed markdown + // between the tags. + let markdownRenderChild = new obsidian.MarkdownRenderChild(multiColumnParent); + // Remove every other child from the parent so + // we dont end up with multiple sets of data. This should + // really only need to loop once for i = 0 but loop just + // in case. + for (let i = parentElement.children.length - 1; i >= 0; i--) { + parentElement.children[i].detach(); + } + parentElement.appendChild(markdownRenderChild.containerEl); + this.appendElementsToColumns(regionElements, columnContentDiv, settings); + } + appendElementsToColumns(regionElements, columnContentDiv, settings) { + for (let i = 0; i < regionElements.length; i++) { + if (regionElements[i].tag === DOMObjectTag.none || + regionElements[i].tag === DOMObjectTag.columnBreak) { + // We store the elements in a wrapper container until we determine + let element = createDiv({ + cls: MultiColumnLayoutCSS.ColumnDualElementContainer, + }); + regionElements[i].elementContainer = element; + // Otherwise we just make a copy of the original element to display. + let clonedElement = regionElements[i].originalElement.cloneNode(true); + let headingCollapseElement = getHeadingCollapseElement(clonedElement); + if (headingCollapseElement !== null) { + // This removes the collapse arrow from the view if it exists. + headingCollapseElement.detach(); + } + regionElements[i].clonedElement = clonedElement; + element.appendChild(clonedElement); + if (regionElements[i] instanceof TaskListDOMObject) { + this.fixClonedCheckListButtons(regionElements[i], true); + } + if (element !== null) { + columnContentDiv.appendChild(element); + } + } + } + } + createColumnContentDivs(multiColumnParent) { + let contentDiv = multiColumnParent.createDiv({ + cls: `${MultiColumnStyleCSS.ColumnContent}` + }); + if (this.regionalSettings.columnSize === SingleColumnSize.small) { + contentDiv.addClass(`${MultiColumnLayoutCSS.SingleColumnSmall}`); + } + else if (this.regionalSettings.columnSize === SingleColumnSize.large) { + contentDiv.addClass(`${MultiColumnLayoutCSS.SingleColumnLarge}`); + } + else { + contentDiv.addClass(`${MultiColumnLayoutCSS.SingleColumnMed}`); + } + return contentDiv; + } +} +function isLeftLayout(layout) { + if (layout === ColumnLayout.left || + layout === ColumnLayout.first) { + return true; + } + return false; +} +function isRightLayout(layout) { + if (layout === ColumnLayout.right || + layout === ColumnLayout.third || + layout === ColumnLayout.last) { + return true; + } + return false; +} + +/** + * File: /src/dom_manager/regional_managers/autoLayoutRegionManager.ts * + * Created Date: Sunday, May 22nd 2022, 10:23 pm * + * Author: Cameron Robinson * + * * + * Copyright (c) 2022 Cameron Robinson * + */ +class AutoLayoutRegionManager extends RegionManager { + constructor() { + super(...arguments); + this.previousColumnHeights = []; + } + renderRegionElementsToScreen() { + this.renderColumnMarkdown(this.regionParent, this.domList, this.regionalSettings); + } + exportRegionElementsToPDF(pdfParentElement) { + // Default set shadow to off for exporting PDFs + let renderSettings = this.regionalSettings; + renderSettings.drawShadow = false; + this.renderColumnMarkdown(pdfParentElement, this.domList.slice(), renderSettings); + } + renderRegionElementsToLivePreview(parentElement) { + this.renderColumnMarkdown(parentElement, this.domList, this.regionalSettings); + } + /** + * This function takes in the data for the multi-column region and sets up the + * user defined number of children with the proper css classes to be rendered properly. + * + * @param parentElement The element that the multi-column region will be rendered under. + * @param regionElements The list of DOM objects that will be coppied under the parent object + * @param settings The settings the user has defined for the region. + */ + renderColumnMarkdown(parentElement, regionElements, settings) { + let multiColumnParent = createDiv({ + cls: MultiColumnLayoutCSS.RegionColumnContainerDiv, + }); + this.columnParent = multiColumnParent; + /** + * Pass our parent div and settings to parser to create the required + * column divs as children of the parent. + */ + this.columnDivs = this.getColumnContentDivs(settings, multiColumnParent); + if (settings.drawShadow === true) { + multiColumnParent.addClass(MultiColumnStyleCSS.RegionShadow); + } + for (let i = 0; i < this.columnDivs.length; i++) { + if (settings.drawBorder === true) { + this.columnDivs[i].addClass(MultiColumnStyleCSS.ColumnBorder); + } + if (settings.drawShadow === true) { + this.columnDivs[i].addClass(MultiColumnStyleCSS.ColumnShadow); + } + } + // Remove every other child from the parent so + // we dont end up with multiple sets of data. This should + // really only need to loop once for i = 0 but loop just + // in case. + for (let i = parentElement.children.length - 1; i >= 0; i--) { + parentElement.children[i].detach(); + } + parentElement.appendChild(multiColumnParent); + this.appendElementsToColumns(regionElements, this.columnDivs, settings); + } + appendElementsToColumns(regionElements, columnContentDivs, settings) { + function balanceElements() { + let totalHeight = regionElements.map((el, index) => { + // We only want to attempt to update the elementRenderedHeight if it is 0 and if it is not an unrendered element such as a endregion tag. + if (el.elementRenderedHeight === 0 && + el.tag !== DOMObjectTag.columnBreak && + el.tag !== DOMObjectTag.endRegion && + el.tag !== DOMObjectTag.regionSettings && + el.tag !== DOMObjectTag.startRegion) { + // Add element to rendered div so we can extract the rendered height. + columnContentDivs[0].appendChild(el.originalElement); + el.elementRenderedHeight = el.originalElement.clientHeight; + columnContentDivs[0].removeChild(el.originalElement); + } + return el.elementRenderedHeight; + }).reduce((prev, curr) => { return prev + curr; }, 0); + let maxColumnContentHeight = Math.trunc(totalHeight / settings.numberOfColumns); + for (let i = 0; i < columnContentDivs.length; i++) { + for (let j = columnContentDivs[i].children.length - 1; j >= 0; j--) { + columnContentDivs[i].children[j].detach(); + } + } + let columnIndex = 0; + let currentColumnHeight = 0; + function checkShouldSwitchColumns(nextElementHeight) { + if (currentColumnHeight + nextElementHeight > maxColumnContentHeight && + (columnIndex + 1) < settings.numberOfColumns) { + columnIndex++; + currentColumnHeight = 0; + } + } + for (let i = 0; i < regionElements.length; i++) { + if (regionElements[i].tag === DOMObjectTag.none || + regionElements[i].tag === DOMObjectTag.columnBreak) { + /** + * Here we check if we need to swap to the next column for the current element. + * If the user wants to keep headings with the content below it we also make sure + * that the last item in a column is not a header element by using the header and + * the next element's height as the height value. + */ + if (hasHeader(regionElements[i].originalElement) === true) { // TODO: Add this as selectable option. + let headerAndNextElementHeight = regionElements[i].elementRenderedHeight; + if (i < regionElements.length - 1) { + headerAndNextElementHeight += regionElements[i + 1].elementRenderedHeight; + } + checkShouldSwitchColumns(headerAndNextElementHeight); + } + else { + checkShouldSwitchColumns(regionElements[i].elementRenderedHeight); + } + currentColumnHeight += regionElements[i].elementRenderedHeight; + /** + * We store the elements in a wrapper container until we determine if we want to + * use the original element or a clone of the element. This helps us by allowing + * us to create a visual only clone while the update loop moves the original element + * into the columns. + */ + let element = createDiv({ + cls: MultiColumnLayoutCSS.ColumnDualElementContainer, + }); + regionElements[i].elementContainer = element; + let clonedElement = regionElements[i].clonedElement; + if (regionElements[i].clonedElement === null) { + clonedElement = regionElements[i].originalElement.cloneNode(true); + let headingCollapseElement = getHeadingCollapseElement(clonedElement); + if (headingCollapseElement !== null) { + // This removes the collapse arrow from the view if it exists. + headingCollapseElement.detach(); + } + regionElements[i].clonedElement = clonedElement; + } + element.appendChild(clonedElement); + if (regionElements[i] instanceof TaskListDOMObject) { + this.fixClonedCheckListButtons(regionElements[i], true); + } + if (element !== null && + columnContentDivs[columnIndex] && + regionElements[i].tag !== DOMObjectTag.columnBreak) { + columnContentDivs[columnIndex].appendChild(element); + regionElements[i].elementRenderedHeight = element.clientHeight; + } + /** + * If the tag is a column break we update the column index after + * appending the item to the column div. This keeps the main DOM + * cleaner by removing other items and placing them all within + * a region container. + * + * Removing the end column tag as an option for now. + */ + // if (regionElements[i].tag === DOMObjectTag.columnBreak && + // (columnIndex + 1) < settings.numberOfColumns) { + // columnIndex++; + // currentColumnHeight = 0; + // } + } + } + } + /** + * Attempt to balanced the elements. We need to iterate over the elements multiple times because + * our initial balance estimate may not be perfectly balanced due to different column widths causing + * elements within them to be of different heights. This can cause the elements to jump around on + * subsiquent update loops which is not ideal. Here we render the elements to the screen and update + * their height after being rendered into the estimated position. + * + * Once everything is rendered we check all of the column heights against our last iteration and + * if nothing has changed we know we are balanced. + * + * There is probably a better way of accomplishing this task but this works for the time being. + */ + for (let i = 0; i < 5; i++) { + balanceElements(); + let balanced = true; + for (let j = 0; j < columnContentDivs.length; j++) { + // If the column heights are undefined we set default to zero so not to encounter an error. + if (!this.previousColumnHeights[j]) { + this.previousColumnHeights.push(0); + } + // if this render height is not the same as the previous height we are still balancing. + if (this.previousColumnHeights[j] !== columnContentDivs[j].clientHeight) { + this.previousColumnHeights[j] = columnContentDivs[j].clientHeight; + balanced = false; + } + } + // if we made it out of the loop and all of the columns are the same height as last update + // we're balanced so we can break out of the loop. + if (balanced === true) { + break; + } + } + } + updateRenderedMarkdown() { + for (let i = 0; i < this.domList.length; i++) { + let el = this.domList[i]; + let originalClientHeight = 0; + if (el.originalElement) { + originalClientHeight = el.originalElement.clientHeight; + } + let clonedClientHeight = 0; + if (el.clonedElement) { + clonedClientHeight = el.clonedElement.clientHeight; + } + if (originalClientHeight < clonedClientHeight) { + this.domList[i].elementRenderedHeight = clonedClientHeight; + } + else { + this.domList[i].elementRenderedHeight = originalClientHeight; + } + } + let validColumns = true; + if (this.columnParent !== null && this.columnDivs !== null && this.columnDivs !== undefined && + this.columnDivs.length === this.regionalSettings.numberOfColumns) { + let totalHeight = this.domList.map((el, index) => { + // We only want to attempt to update the elementRenderedHeight if it is 0 and if it is not an unrendered element such as a endregion tag. + if (el.elementRenderedHeight === 0 && + el.tag !== DOMObjectTag.columnBreak && + el.tag !== DOMObjectTag.endRegion && + el.tag !== DOMObjectTag.regionSettings && + el.tag !== DOMObjectTag.startRegion) { + // Add element to rendered div so we can extract the rendered height. + this.columnParent.appendChild(el.originalElement); + el.elementRenderedHeight = el.originalElement.clientHeight; + this.columnParent.removeChild(el.originalElement); + } + return el.elementRenderedHeight; + }).reduce((prev, curr) => { return prev + curr; }, 0); + let maxColumnContentHeight = Math.trunc(totalHeight / this.regionalSettings.numberOfColumns); + for (let i = 0; i < this.columnDivs.length - 1; i++) { + let columnHeight = 0; + for (let j = 0; j < this.columnDivs[i].children.length; j++) { + columnHeight += this.columnDivs[i].children[j].clientHeight; + } + if (columnHeight > maxColumnContentHeight) { + validColumns = false; + break; + } + } + } + if (validColumns === false) { + this.renderColumnMarkdown(this.regionParent, this.domList, this.regionalSettings); + } + super.updateRenderedMarkdown(); + } +} + +/** + * File: /src/dom_manager/regional_managers/regionManagerContainer.ts * + * Created Date: Sunday, May 22nd 2022, 7:50 pm * + * Author: Cameron Robinson * + * * + * Copyright (c) 2022 Cameron Robinson * + */ +/** + * This class acts as an abstraction for the actual regional manager. It is used to update the + * subclass of RegionalManager depending on user preferences to make rendering more simplified. + */ +class RegionManagerContainer { + constructor(parentFileManager, regionKey, rootElement, regionParent) { + this.region = new StandardMultiColumnRegionManager(createDefaultRegionManagerData(regionParent, parentFileManager, regionKey, rootElement)); + } + getRegion() { + return this.region; + } + setRegionSettings(settingsText) { + let regionalSettings = parseColumnSettings(settingsText); + if (regionalSettings.numberOfColumns === 1) { + regionalSettings = parseSingleColumnSettings(settingsText, regionalSettings); + } + this.region.setRegionalSettings(regionalSettings); + if (regionalSettings.numberOfColumns === 1) { + if (this.region instanceof SingleColumnRegionManager === false) { + console.debug("Converting region to single column."); + this.convertToSingleColumn(); + } + } + else if (regionalSettings.autoLayout === true) { + if (this.region instanceof AutoLayoutRegionManager === false) { + console.debug("Converting region to auto layout."); + this.convertToAutoLayout(); + } + } + else if (regionalSettings.numberOfColumns >= 2) { + if (this.region instanceof StandardMultiColumnRegionManager === false) { + console.debug("Converting region to standard multi-column"); + this.convertToStandardMultiColumn(); + } + } + return this.region; + } + convertToSingleColumn() { + let data = this.region.getRegionData(); + this.region = new SingleColumnRegionManager(data); + return this.region; + } + convertToStandardMultiColumn() { + let data = this.region.getRegionData(); + this.region = new StandardMultiColumnRegionManager(data); + return this.region; + } + convertToAutoLayout() { + let data = this.region.getRegionData(); + this.region = new AutoLayoutRegionManager(data); + return this.region; + } +} +function createDefaultRegionManagerData(regionParent, fileManager, regionKey, rootElement) { + return { + domList: [], + domObjectMap: new Map(), + regionParent: regionParent, + fileManager: fileManager, + regionalSettings: getDefaultMultiColumnSettings(), + regionKey: regionKey, + rootElement: rootElement + }; +} + +/* + * File: multi-column-markdown/src/domManager.ts + * Created Date: Saturday, January 30th 2022, 3:16:32 pm + * Author: Cameron Robinson + * + * Copyright (c) 2022 Cameron Robinson + */ +/** + * This class handles the global managers keeping track of all open files that + * contain MCM-Regions. + */ +class GlobalDOMManager { + constructor() { + this.managers = new Map(); + } + removeFileManagerCallback(key) { + if (this.managers.has(key) === true) { + this.managers.delete(key); + } + } + getFileManager(key) { + let fileManager = null; + if (this.managers.has(key) === true) { + fileManager = this.managers.get(key); + } + else { + fileManager = createFileDOMManager(this, key); + this.managers.set(key, fileManager); + } + return fileManager; + } + getAllFileManagers() { + return Array.from(this.managers.values()); + } +} +function createFileDOMManager(parentManager, fileKey) { + let regionMap = new Map(); + let hasStartTag = false; + function removeRegion(regionKey) { + let regionContainer = regionMap.get(regionKey); + if (regionContainer) { + let regionalManager = regionContainer.getRegion(); + regionalManager.displayOriginalElements(); + } + regionMap.delete(regionKey); + if (regionMap.size === 0) { + parentManager.removeFileManagerCallback(fileKey); + } + } + function createRegionalManager(regionKey, rootElement, errorElement, renderRegionElement) { + //TODO: Use the error element whenever there is an error. + let regonalContainer = new RegionManagerContainer(this, regionKey, rootElement, renderRegionElement); + regionMap.set(regionKey, regonalContainer); + return regonalContainer.getRegion(); + } + function getRegionalContainer(regionKey) { + let regonalManager = null; + if (regionMap.has(regionKey) === true) { + regonalManager = regionMap.get(regionKey); + } + return regonalManager; + } + function getAllRegionalManagers() { + let containers = Array.from(regionMap.values()); + let regions = containers.map((curr) => { return curr.getRegion(); }); + return regions; + } + function setHasStartTag() { + hasStartTag = true; + } + function getHasStartTag() { + return hasStartTag; + } + function getNumberOfRegions() { + return regionMap.size; + } + function checkKeyExists(checkKey) { + return regionMap.has(checkKey); + } + return { regionMap: regionMap, + hasStartTag: hasStartTag, + createRegionalManager: createRegionalManager, + getRegionalContainer: getRegionalContainer, + getAllRegionalManagers: getAllRegionalManagers, + removeRegion: removeRegion, + setHasStartTag: setHasStartTag, + getHasStartTag: getHasStartTag, + getNumberOfRegions: getNumberOfRegions, + checkKeyExists: checkKeyExists + }; +} + +/* + * Filename: multi-column-markdown/src/live_preview/MultiColumnMarkdown_Widget.ts + * Created Date: Tuesday, August 16th 2022, 4:38:43 pm + * Author: Cameron Robinson + * + * Copyright (c) 2022 Cameron Robinson + */ +class MultiColumnMarkdown_LivePreview_Widget extends view.WidgetType { + constructor(contentData) { + super(); + this.domList = []; + this.regionSettings = getDefaultMultiColumnSettings(); + this.contentData = contentData; + // Find the settings defined in the content, if it exists. + // If the settings codeblock isnt defined attempt to get the region codeblock type. + let settingsStartData = findSettingsCodeblock(this.contentData); + if (settingsStartData.found === false) { + settingsStartData = findStartCodeblock(this.contentData); + } + if (settingsStartData.found === true) { + this.settingsText = this.contentData.slice(settingsStartData.startPosition, settingsStartData.endPosition); + this.contentData = this.contentData.replace(this.settingsText, ""); + // Parse the settings, updating the default settings. + this.regionSettings = parseColumnSettings(this.settingsText); + } + // Render the markdown content to our temp parent element. + this.tempParent = createDiv(); + let elementMarkdownRenderer = new obsidian.MarkdownRenderChild(this.tempParent); + obsidian.MarkdownRenderer.renderMarkdown(this.contentData, this.tempParent, "", elementMarkdownRenderer); + // take all elements, in order, and create our DOM list. + let arr = Array.from(this.tempParent.children); + for (let i = 0; i < arr.length; i++) { + this.domList.push(new DOMObject(arr[i], [""])); + } + // Set up the region manager data before then creating our region manager. + let regionData = { + domList: this.domList, + domObjectMap: new Map(), + regionParent: createDiv(), + fileManager: null, + regionalSettings: this.regionSettings, + regionKey: getUID(), + rootElement: createDiv() + }; + // Finally setup the type of region manager required. + if (this.regionSettings.numberOfColumns === 1) { + this.regionSettings = parseSingleColumnSettings(this.settingsText, this.regionSettings); + this.regionManager = new SingleColumnRegionManager(regionData); + } + else if (this.regionSettings.autoLayout === true) { + this.regionManager = new AutoLayoutRegionManager(regionData); + } + else { + this.regionManager = new StandardMultiColumnRegionManager(regionData); + } + } + toDOM() { + // Create our element to hold all of the live preview elements. + let el = document.createElement("div"); + el.className = "mcm-cm-preview"; + /** + * For situations where we need to know the rendered height, AutoLayout, + * the element must be rendered onto the screen to get the info, even if + * only for a moment. Here we attempt to get a leaf from the app so we + * can briefly append our element, check any data if required, and then + * remove it. + */ + let leaf = null; + if (app) { + let leaves = app.workspace.getLeavesOfType("markdown"); + if (leaves.length > 0) { + leaf = leaves[0]; + } + } + if (this.regionManager) { + if (leaf) { + leaf.view.containerEl.appendChild(el); + } + this.regionManager.renderRegionElementsToLivePreview(el); + if (leaf) { + leaf.view.containerEl.removeChild(el); + } + } + return el; + } +} +class MultiColumnMarkdown_DefinedSettings_LivePreview_Widget extends view.WidgetType { + constructor(contentData) { + super(); + this.contentData = contentData; + } + toDOM() { + console.log("Rendering settings block"); + // Create our element to hold all of the live preview elements. + let el = document.createElement("div"); + el.className = "mcm-cm-settings-preview"; + let labelDiv = el.createDiv(); + let label = labelDiv.createSpan({ + cls: "mcm-col-settings-preview" + }); + label.textContent = "Column Settings:"; + let list = el.createEl("ul"); + let lines = this.contentData.split("\n"); + for (let i = 1; i < lines.length - 1; i++) { + let item = list.createEl("li"); + item.textContent = lines[i]; + } + return el; + } +} + +/* + * Filename: multi-column-markdown/src/live_preview/cm6_livePreview.ts + * Created Date: Monday, August 1st 2022, 1:51:16 pm + * Author: Cameron Robinson + * + * Copyright (c) 2022 Cameron Robinson + */ +const multiColumnMarkdown_StateField = state.StateField.define({ + create(state) { + return view.Decoration.none; + }, + update(oldState, transaction) { + const builder = new state.RangeSetBuilder(); + let generated = false; + language.syntaxTree(transaction.state).iterate({ + enter(node) { + // We only want to run the generation once per state change. If + // a previous node has sucessfully generated regions we ignore all + // other nodes in the state. + if (generated === true) { + return; + } + let markdownLeaves = app.workspace.getLeavesOfType("markdown"); + if (markdownLeaves.length === 0) { + return; + } + // TODO: Check other ways to get if source is live preview? editorLivePreviewField + if (markdownLeaves[0].getViewState().state.source === true) { + console.debug("User disabled live preview."); + return; + } + // We want to run on the whole file so we dont just look for a single token. + const tokenProps = node.type.prop(language.tokenClassNodeProp); + if (tokenProps !== undefined) { + return; + } + /** + * When we have the while file we then get the entire doc text and check if it + * contains a MCM region so we know to break or not. + */ + let docLength = transaction.state.doc.length; + let docText = transaction.state.doc.sliceString(0, docLength); + if (containsRegionStart(docText) === false) { + console.debug("No start tag in document."); + return; + } + // We want to know where the user's cursor is, it can be + // selecting multiple regions of text as well so we need to know + // all locations. Used to know if we should render region as text or as preview. + let ranges = getCursorLineLocations(); + // Setup our loop to render the regions as MCM. + let workingFileText = docText; + let startTagData = findStartTag(workingFileText); + if (startTagData.found === false) { + startTagData = findStartCodeblock(workingFileText); + } + let endTagData = findEndTag(workingFileText); + let loopIndex = 0; + let startIndexOffset = 0; + while (startTagData.found === true && endTagData.found === true) { + /** + * For the region we found get the start and end position of the tags so we + * can slice it out of the document. + */ + let startIndex = startIndexOffset + startTagData.startPosition; + let endIndex = startIndexOffset + endTagData.startPosition + endTagData.matchLength; // Without the matchLength will leave the end tag on the screen. + // This text is the entire region data including the start and end tags. + let elementText = docText.slice(startIndex, endIndex); + /** + * Update our start offset and the working text of the file so our next + * iteration knows where we left off + */ + startIndexOffset = endIndex; + workingFileText = docText.slice(endIndex); + // Here we check if the cursor is in this specific region. + let cursorInRegion = checkCursorInRegion(startIndex, endIndex, ranges); + if (cursorInRegion === true) { + // If the cursor is within the region we then need to know if + // it is within our settings block (if it exists.) + let settingsStartData = findStartCodeblock(elementText); + if (settingsStartData.found === false) { + settingsStartData = findSettingsCodeblock(elementText); + } + if (settingsStartData.found === true) { + // Since the settings block exists check if the cursor is within that region. + let codeblockStartIndex = startIndex + settingsStartData.startPosition; + let codeblockEndIndex = startIndex + settingsStartData.endPosition; + let settingsText = docText.slice(codeblockStartIndex, codeblockEndIndex); + let cursorInCodeblock = checkCursorInRegion(codeblockStartIndex, codeblockEndIndex, ranges); + if (cursorInCodeblock === false) { + // If the cursor is not within the region we pass the data to the + // settings view so it can be displayed in the region. + builder.add(codeblockStartIndex, codeblockEndIndex + 1, view.Decoration.replace({ + widget: new MultiColumnMarkdown_DefinedSettings_LivePreview_Widget(settingsText), + })); + } + } + } + // At this point if the cursor isnt in the region we pass the data to the + // element to be rendered. + if (cursorInRegion === false) { + builder.add(startIndex, endIndex, view.Decoration.replace({ + widget: new MultiColumnMarkdown_LivePreview_Widget(elementText), + })); + } + generated = true; + // ReCalculate additional start tags if there are more in document. + startTagData = findStartTag(workingFileText); + if (startTagData.found === false) { + startTagData = findStartCodeblock(workingFileText); + } + endTagData = findEndTag(workingFileText); + loopIndex++; + if (loopIndex > 100) { + console.warn("Potential issue with rendering Multi-Column Markdown live preview regions. If problem persists please file a bug report with developer."); + break; + } + } + }, + }); + return builder.finish(); + function getCursorLineLocations() { + let ranges = []; + if (transaction.state.selection.ranges) { + ranges = transaction.state.selection.ranges.filter((range) => { + return range.empty; + }).map((range) => { + let line = transaction.state.doc.lineAt(range.head); + `${line.number}:${range.head - line.from}`; + return { + line: line, + position: range.head + }; + }); + } + return ranges; + } + function valueIsInRange(value, minVal, maxVal, inclusive = true) { + if (inclusive === true && (value === minVal || value === maxVal)) { + return true; + } + if (minVal < value && value < maxVal) { + return true; + } + return false; + } + function checkCursorInRegion(startIndex, endIndex, ranges) { + let cursorInRegion = false; + for (let i = 0; i < ranges.length; i++) { + // TODO: Maybe look into limiting this to the second and second to last line + // of the region as clicking right at the top or bottom of the region + // swaps it to unrendered. + let range = ranges[i]; + if (valueIsInRange(range.position, startIndex, endIndex) === true) { + cursorInRegion = true; + break; + } + } + if (cursorInRegion === false && transaction.selection) { + for (let i = 0; i < transaction.selection.ranges.length; i++) { + let range = transaction.selection.ranges[i]; + // If either the start or end of the selection is within the + // region range we do not render live preview. + if (valueIsInRange(range.from, startIndex, endIndex) || + valueIsInRange(range.to, startIndex, endIndex)) { + cursorInRegion = true; + break; + } + // Or if the entire region is within the selection range + // we do not render the live preview. + if (valueIsInRange(startIndex, range.from, range.to) && + valueIsInRange(endIndex, range.from, range.to)) { + cursorInRegion = true; + break; + } + } + } + return cursorInRegion; + } + }, + provide(field) { + return view.EditorView.decorations.from(field); + }, +}); + +/* + * File: multi-column-markdown/src/main.ts + * Created Date: Tuesday, October 5th 2021, 1:09 pm + * Author: Cameron Robinson + * + * Copyright (c) 2022 Cameron Robinson + */ +const CODEBLOCK_START_STRS = [ + "start-multi-column", + "multi-column-start" +]; +class MultiColumnMarkdown extends obsidian.Plugin { + constructor() { + super(...arguments); + this.globalManager = new GlobalDOMManager(); + } + onload() { + return __awaiter(this, void 0, void 0, function* () { + console.log("Loading multi-column markdown"); + this.globalManager = new GlobalDOMManager(); + this.registerEditorExtension(multiColumnMarkdown_StateField); + for (let i = 0; i < CODEBLOCK_START_STRS.length; i++) { + let startStr = CODEBLOCK_START_STRS[i]; + this.setupMarkdownCodeblockPostProcessor(startStr); + } + this.setupMarkdownPostProcessor(); + //TODO: Set up this as a modal to set settings automatically + this.addCommand({ + id: `insert-multi-column-region`, + name: `Insert Multi-Column Region`, + editorCallback: (editor, view) => { + try { + let cursorStartPosition = editor.getCursor("from"); + editor.getDoc().replaceSelection(` +\`\`\`start-multi-column +ID: ID_${getUID(4)} +Number of Columns: 2 +Largest Column: standard +\`\`\` + + + +--- column-end --- + + + +=== end-multi-column + +${editor.getDoc().getSelection()}`); + cursorStartPosition.line = cursorStartPosition.line + 7; + cursorStartPosition.ch = 0; + editor.setCursor(cursorStartPosition); + } + catch (e) { + new obsidian.Notice("Encountered an error inserting a multi-column region. Please try again later."); + } + } + }); + this.addCommand({ + id: `add-IDs-To-multi-column-region`, + name: `Fix Missing IDs for Multi-Column Regions`, + editorCallback: (editor, view) => { + try { + /** + * Not sure if there is an easier way to do this. + * + * Get all of the lines of the document split by newlines. + */ + let docText = editor.getRange({ line: 0, ch: 0 }, { line: editor.getDoc().lineCount(), ch: 0 }); + let lines = docText.split("\n"); + let startCodeblock = findStartCodeblock(docText); + let lineOffset = 0; + let numCodeblocksUpdated = 0; + while (startCodeblock.found === true) { + let startReplaceLines = (docText.slice(0, startCodeblock.startPosition).split("\n").length - 1) + lineOffset; // -1 to Zero index the replace line + let settingsText = docText.slice(startCodeblock.startPosition, startCodeblock.endPosition); + let settingsID = parseStartRegionCodeBlockID(settingsText); + if (settingsID === "") { + let replacementText = editor.getRange({ line: startReplaceLines, ch: 0 }, { line: startReplaceLines, ch: startCodeblock.matchLength }) + `\nID: ID_${getUID(4)}`; + editor.replaceRange(replacementText, { line: startReplaceLines, ch: 0 }, { line: startReplaceLines, ch: startCodeblock.matchLength }); + startReplaceLines += 1; // we added a line to the doc so update our offset. + numCodeblocksUpdated += 1; + } + lineOffset = startReplaceLines; + docText = docText.slice(startCodeblock.startPosition + startCodeblock.matchLength); + startCodeblock = findStartCodeblock(docText); + } + /** + * Loop through all of the lines checking if the line is a + * start tag and if so is it missing an ID. + */ + let linesWithoutIDs = []; + let textWithoutIDs = []; + for (let i = 0; i < lines.length; i++) { + let data = isStartTagWithID(lines[i]); + if (data.isStartTag === true && data.hasKey === false) { + linesWithoutIDs.push(i); + textWithoutIDs.push(lines[i]); + } + } + if (linesWithoutIDs.length === 0 && numCodeblocksUpdated === 0) { + new obsidian.Notice("Found 0 missing IDs in the current document."); + return; + } + /** + * Now loop through each line that is missing an ID and + * generate a random ID and replace the original text. + */ + for (let i = 0; i < linesWithoutIDs.length; i++) { + let originalText = textWithoutIDs[i]; + let text = originalText; + text = text.trimEnd(); + if (text.charAt(text.length - 1) === ":") { + text = text.slice(0, text.length - 1); + } + text = `${text}: ID_${getUID(4)}`; + editor.replaceRange(text, { line: linesWithoutIDs[i], ch: 0 }, { line: linesWithoutIDs[i], ch: originalText.length }); + } + new obsidian.Notice(`Replaced ${linesWithoutIDs.length + numCodeblocksUpdated} missing ID(s) in the current document.`); + } + catch (e) { + new obsidian.Notice("Encountered an error addign IDs to multi-column regions. Please try again later."); + } + } + }); + this.registerInterval(window.setInterval(() => { + this.UpdateOpenFilePreviews(); + }, 500)); + }); + } + UpdateOpenFilePreviews() { + let fileManagers = this.globalManager.getAllFileManagers(); + fileManagers.forEach(element => { + let regionalManagers = element.getAllRegionalManagers(); + regionalManagers.forEach(regionManager => { + regionManager.updateRenderedMarkdown(); + }); + }); + } + setupMarkdownPostProcessor() { + this.registerMarkdownPostProcessor((el, ctx) => __awaiter(this, void 0, void 0, function* () { + const sourcePath = ctx.sourcePath; + let fileDOMManager = this.globalManager.getFileManager(sourcePath); + if (fileDOMManager === null) { + console.log("Found null DOM manager. Could not process multi-column markdown."); + return; + } + /** + * Here we check if the export "print" flag is in the DOM so we can determine if we + * are exporting and handle that case. + */ + if (this.checkExporting(el)) { + this.exportDocumentToPDF(el, fileDOMManager, sourcePath); + } + // Get the info for our current context and then check + // if the entire text contains a start tag. If there is + // no start tag in the document we can just return and + // ignore the rest of the parsing. + let info = ctx.getSectionInfo(el); + /** + * We need the context info to properly parse so returning here + * info is null. TODO: Set error in view if this occurs. + */ + if (!info) { + return; + } + let docString = info.text; + let docLines = docString.split("\n"); + /** + * If we encounter a start tag on the document we set the flag to start + * parsing the rest of the document. + */ + if (containsStartTag(el.textContent) || + containsStartCodeBlock(docString)) { + fileDOMManager.setHasStartTag(); + } + /** + * If the document does not contain any start tags we ignore the + * rest of the parsing. This is only set to true once the first + * start tag element is parsed above. + */ + if (fileDOMManager.getHasStartTag() === false) { + return; + } + /** + * Take the info provided and generate the required variables from + * the line start and end values. + */ + let linesAboveArray = docLines.slice(0, info.lineStart); + let linesOfElement = docLines.slice(info.lineStart, info.lineEnd + 1); + let textOfElement = linesOfElement.join("\n"); + let linesBelowArray = docLines.slice(info.lineEnd + 1); + //#region Depreciated Start Tag + /** + * If the current line is a start tag we want to set up the + * region manager. The regional manager takes care + * of all items between it's start and end tags while the + * file manager we got above above takes care of all regional + * managers in each file. + */ + if (containsStartTag(textOfElement)) { + /** + * Set up the current element to act as the parent for the + * multi-column region. + */ + el.children[0].detach(); + el.classList.add(MultiColumnLayoutCSS.RegionRootContainerDiv); + let renderErrorRegion = el.createDiv({ + cls: `${MultiColumnLayoutCSS.RegionErrorContainerDiv} ${MultiColumnStyleCSS.RegionErrorMessage}`, + }); + let renderColumnRegion = el.createDiv({ + cls: MultiColumnLayoutCSS.RegionContentContainerDiv + }); + let startBlockData = getStartBlockAboveLine(linesOfElement); + if (startBlockData === null) { + return; + } + let regionKey = startBlockData.startBlockKey; + if (fileDOMManager.checkKeyExists(regionKey) === true) { + let { numberOfTags, keys } = countStartTags(info.text); + let numMatches = 0; + for (let i = 0; i < numberOfTags; i++) { + // Because we checked if key exists one of these has to match. + if (keys[i] === regionKey) { + numMatches++; + } + } + // We only want to display an error if there are more than 2 of the same id across + // the whole document. This prevents erros when obsidian reloads the whole document + // and there are two of the same key in the map. + if (numMatches >= 2) { + if (regionKey === "") { + renderErrorRegion.innerText = "Found multiple regions with empty IDs. Please set a unique ID after each start tag.\nEG: '=== multi-column-start: randomID'\nOr use 'Fix Missing IDs' in the command palette and reload the document."; + } + else { + renderErrorRegion.innerText = "Region ID already exists in document, please set a unique ID.\nEG: '=== multi-column-start: randomID'"; + } + return; + } + } + el.id = `MultiColumnID:${regionKey}`; + let elementMarkdownRenderer = new obsidian.MarkdownRenderChild(el); + fileDOMManager.createRegionalManager(regionKey, el, renderErrorRegion, renderColumnRegion); + elementMarkdownRenderer.onunload = () => { + if (fileDOMManager) { + fileDOMManager.removeRegion(startBlockData.startBlockKey); + } + }; + ctx.addChild(elementMarkdownRenderer); + /** + * Now we have created our regional manager and defined what elements + * need to be rendered into. So we can return without any more processing. + */ + return; + } + //#endregion Depreciated Start Tag + /** + * Check if any of the lines above us contain a start block, and if + * so get the lines from our current element to the start block. + */ + let startBockAbove = getStartBlockOrCodeblockAboveLine(linesAboveArray); + if (startBockAbove === null) { + return; + } + /** + * We now know we're within a multi-column region, so we update our + * list of lines above to just be the items within this region. + */ + linesAboveArray = startBockAbove.linesAboveArray; + /** + * We use the start block's key to get our regional manager. If this + * lookup fails we can not continue processing this element. + */ + let regionalContainer = fileDOMManager.getRegionalContainer(startBockAbove.startBlockKey); + if (regionalContainer === null) { + return; + } + let regionalManager = regionalContainer.getRegion(); + /** + * To make sure we're placing the item in the right location (and + * overwrite elements that are now gone) we now want all of the + * lines after this element up to the end tag. + */ + linesBelowArray = getEndBlockBelow(linesBelowArray); + /** + * Now we take the lines above our current element up until the + * start region tag and render that into an HTML element. We will + * use these elements to determine where to place our current element. + */ + let siblingsAbove = renderMarkdownFromLines(linesAboveArray, sourcePath); + let siblingsBelow = renderMarkdownFromLines(linesBelowArray, sourcePath); + /** + * Set up our dom object to be added to the manager. + */ + let currentObject = new DOMObject(el, linesOfElement); + el.id = currentObject.UID; + currentObject = TaskListDOMObject.checkForTaskListElement(currentObject); + /** + * Now we add the object to the manager and then setup the + * callback for when the object is removed from view that will remove + * the item from the manager. + */ + regionalManager.addObject(siblingsAbove, siblingsBelow, currentObject); + let elementMarkdownRenderer = new obsidian.MarkdownRenderChild(el); + elementMarkdownRenderer.onunload = () => { + if (regionalContainer === null) { + return; + } + let regionalManager = regionalContainer.getRegion(); + if (regionalManager) { + // We can attempt to update the view here after the item is removed + // but need to get the item's parent element before removing object from manager. + let regionRenderData = regionalManager.getRegionRenderData(); + regionalManager.removeObject(currentObject.UID); + /** + * Need to check here if element is null as this closure will be called + * repeatedly on file change. + */ + if (regionRenderData.parentRenderElement === null) { + return; + } + regionalManager.renderRegionElementsToScreen(); + } + }; + ctx.addChild(elementMarkdownRenderer); + let elementTextSpaced = linesOfElement.reduce((prev, curr) => { + return prev + "\n" + curr; + }); + /** + * Now we check if our current element is a special flag so we can + * properly set the element tag within the regional manager. + */ + if (containsEndTag(el.textContent) === true) { + currentObject.elementType = ElementRenderType.unRendered; + el.addClass(MultiColumnStyleCSS.RegionEndTag); + regionalManager.updateElementTag(currentObject.UID, DOMObjectTag.endRegion); + } + else if (containsColEndTag(elementTextSpaced) === true) { + currentObject.elementType = ElementRenderType.unRendered; + el.addClass(MultiColumnStyleCSS.ColumnEndTag); + regionalManager.updateElementTag(currentObject.UID, DOMObjectTag.columnBreak); + } + else if (containsColSettingsTag(elementTextSpaced) === true) { + currentObject.elementType = ElementRenderType.unRendered; + el.addClass(MultiColumnStyleCSS.RegionSettings); + regionalManager = regionalContainer.setRegionSettings(elementTextSpaced); + regionalManager.updateElementTag(currentObject.UID, DOMObjectTag.regionSettings); + } + else { + el.addClass(MultiColumnStyleCSS.RegionContent); + } + regionalManager.renderRegionElementsToScreen(); + return; + })); + } + isStartCodeblockInExport(node) { + for (let i = 0; i < CODEBLOCK_START_STRS.length; i++) { + if (node.hasClass(`block-language-${CODEBLOCK_START_STRS[i]}`)) { + return true; + } + } + return false; + } + exportDocumentToPDF(el, fileDOMManager, sourcePath) { + return __awaiter(this, void 0, void 0, function* () { + // A true export will be passed an element with all other items in the doc as children. + // So if there are no children we can just return + let docChildren = Array.from(el.childNodes); + if (docChildren.length === 0) { + return; + } + let childrenToRemove = []; + // To export codeblocks we need to get the IDs so we can get the data from our managers. + // however since the ID isnt being stored in the element yet this means we need to read + // all of the IDs out of the full document. + let codeblockStartBlocks = []; + let aFile = this.app.vault.getAbstractFileByPath(sourcePath); + if (aFile instanceof obsidian.TFile) { + let file = aFile; + let fileText = yield this.app.vault.cachedRead(file); // Is cached read Ok here? It should be. + // Once we have our data we search the text for all codeblock start values. + // storing them into our queue. + let codeBlockData = findStartCodeblock(fileText); + while (codeBlockData.found === true) { + let codeblockText = fileText.slice(codeBlockData.startPosition, codeBlockData.endPosition); + fileText = fileText.slice(codeBlockData.endPosition); + codeblockStartBlocks.push(codeblockText); + codeBlockData = findStartCodeblock(fileText); + } + } + let inBlock = false; + for (let i = 0; i < docChildren.length; i++) { + let child = docChildren[i]; + if (child instanceof HTMLElement) { + if (inBlock === false) { + let foundBlockData = false; + let regionKey = ""; + let blockData = isStartTagWithID(child.textContent); + if (blockData.isStartTag === true) { + foundBlockData = true; + if (blockData.hasKey === true) { + let foundKey = getStartTagKey(child.textContent); + if (foundKey !== null) { + regionKey = foundKey; + } + } + } + else if (blockData.isStartTag === false && this.isStartCodeblockInExport(child)) { + // If the start tag from the old version is null we then check to see if the element is + // a codeblock start. If it is we use the next available codeblock data to retrieve our ID. + let codeblockText = codeblockStartBlocks.shift(); + if (codeblockText === undefined) { + console.error("Found undefined codeblock data when exporting."); + return; + } + let id = parseStartRegionCodeBlockID(codeblockText); + if (id !== "") { + foundBlockData = true; + regionKey = id; + } + } + if (foundBlockData === true && regionKey !== "") { + inBlock = true; + for (let i = child.children.length - 1; i >= 0; i--) { + child.children[i].detach(); + } + child.innerText = ""; + child.classList.add(MultiColumnLayoutCSS.RegionRootContainerDiv); + let renderErrorRegion = child.createDiv({ + cls: `${MultiColumnLayoutCSS.RegionErrorContainerDiv}, ${MultiColumnStyleCSS.RegionErrorMessage}`, + }); + let renderColumnRegion = child.createDiv({ + cls: MultiColumnLayoutCSS.RegionContentContainerDiv + }); + let regionalContainer = fileDOMManager.getRegionalContainer(regionKey); + if (regionalContainer === null) { + renderErrorRegion.innerText = "Error rendering multi-column region.\nPlease close and reopen the file, then make sure you are in reading mode before exporting."; + } + else { + let regionalManager = regionalContainer.getRegion(); + regionalManager.exportRegionElementsToPDF(renderColumnRegion); + } + } + } + else { + if (containsEndTag(child.textContent) === true) { + inBlock = false; + } + childrenToRemove.push(child); + } + } + } + childrenToRemove.forEach(child => { + el.removeChild(child); + }); + }); + } + checkExporting(element) { + if (element === null) { + return false; + } + if (element.classList.contains("print")) { + return true; + } + if (element.parentNode !== null) { + return this.checkExporting(element.parentElement); + } + return false; + } + setupMarkdownCodeblockPostProcessor(startStr) { + this.registerMarkdownCodeBlockProcessor(startStr, (source, el, ctx) => { + var _a; + const sourcePath = ctx.sourcePath; + // Set up our CSS so that the codeblock only renders this data in reading mode + // source/live preview mode is handled by the CM6 implementation. + (_a = el.parentElement) === null || _a === void 0 ? void 0 : _a.addClass("preivew-mcm-start-block"); + // To determine what kind of view we are rendering in we need a markdown leaf. + // Really this should never return here since rendering is only done in markdown leaves. + let markdownLeaves = app.workspace.getLeavesOfType("markdown"); + if (markdownLeaves.length === 0) { + return; + } + for (let i = 0; i < markdownLeaves.length; i++) { + let fileLeaf = getFileLeaf(sourcePath); + if (fileLeaf === null) { + continue; + } + if (getLeafSourceMode(fileLeaf) === "source") { + return; + } + } + if (this.globalManager === null || this.globalManager === undefined) { + console.log("Global manager is undefined?"); + return; + } + let fileDOMManager = this.globalManager.getFileManager(sourcePath); + if (fileDOMManager === null) { + return; + } + // Set file to have start tag. + fileDOMManager.setHasStartTag(); + // Get the info for our current context and then check + // if the entire text contains a start tag. If there is + // no start tag in the document we can just return and + // ignore the rest of the parsing. + let info = ctx.getSectionInfo(el); + /** + * We need the context info to properly parse so returning here + * info is null. TODO: Set error in view if this occurs. + */ + if (!info) { + return; + } + /** + * Set up the current element to act as the parent for the + * multi-column region. + */ + el.classList.add(MultiColumnLayoutCSS.RegionRootContainerDiv); + let renderErrorRegion = el.createDiv({ + cls: `${MultiColumnLayoutCSS.RegionErrorContainerDiv} ${MultiColumnStyleCSS.RegionErrorMessage}`, + }); + let renderColumnRegion = el.createDiv({ + cls: MultiColumnLayoutCSS.RegionContentContainerDiv + }); + let regionKey = parseStartRegionCodeBlockID(source); + let createNewRegionManager = true; + if (fileDOMManager.checkKeyExists(regionKey) === true) { + createNewRegionManager = false; + let { numberOfTags, keys } = countStartTags(info.text); + let numMatches = 0; + for (let i = 0; i < numberOfTags; i++) { + // Because we checked if key exists one of these has to match. + if (keys[i] === regionKey) { + numMatches++; + } + } + // We only want to display an error if there are more than 2 of the same id across + // the whole document. This prevents erros when obsidian reloads the whole document + // and there are two of the same key in the map. + if (numMatches >= 2) { + if (regionKey === "") { + renderErrorRegion.innerText = "Found multiple regions with empty IDs. Please set a unique ID after each start tag.\nEG: '=== multi-column-start: randomID'\nOr use 'Fix Missing IDs' in the command palette and reload the document."; + } + else { + renderErrorRegion.innerText = "Region ID already exists in document, please set a unique ID.\nEG: '=== multi-column-start: randomID'"; + } + return; + } + } + el.id = `MultiColumnID:${regionKey}`; + // If something changes in the codeblock we dont necessarily want to update our + // old reference to the region manager. This could be a potential bug area. + if (createNewRegionManager === true) { + // Create a new regional manager. + let elementMarkdownRenderer = new obsidian.MarkdownRenderChild(el); + fileDOMManager.createRegionalManager(regionKey, el, renderErrorRegion, renderColumnRegion); + // Set up the on unload callback. This can be called if the user changes + // the start/settings codeblock in any way. We only want to unload + // if the file is being removed from view. + elementMarkdownRenderer.onunload = () => { + if (fileDOMManager && fileStillInView(sourcePath) === false) { + console.debug("File not in any markdown leaf. Removing region from dom manager."); + fileDOMManager.removeRegion(regionKey); + } + }; + ctx.addChild(elementMarkdownRenderer); + } + let regionalManagerContainer = fileDOMManager.getRegionalContainer(regionKey); + if (regionalManagerContainer !== null) { + let regionalManager = regionalManagerContainer.setRegionSettings(source); + regionalManager.regionParent = el; + } + }); + } +} +function renderMarkdownFromLines(mdLines, sourcePath) { + /** + * We re-render all of the items above our element, until the start tag, + * so we can determine where to place the new item in the manager. + * + * TODO: Can reduce the amount needing to be rendered by only rendering to + * the start tag or a column-break whichever is closer. + */ + let siblings = createDiv(); + let markdownRenderChild = new obsidian.MarkdownRenderChild(siblings); + obsidian.MarkdownRenderer.renderMarkdown(mdLines.reduce((prev, current) => { + return prev + "\n" + current; + }, ""), siblings, sourcePath, markdownRenderChild); + return siblings; +} + +module.exports = MultiColumnMarkdown; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9yZWdpb25TZXR0aW5ncy50cyIsInNyYy91dGlsaXRpZXMvc2V0dGluZ3NQYXJzZXIudHMiLCJzcmMvdXRpbGl0aWVzL3RleHRQYXJzZXIudHMiLCJzcmMvdXRpbGl0aWVzL3V0aWxzLnRzIiwic3JjL3V0aWxpdGllcy9lbGVtZW50UmVuZGVyVHlwZVBhcnNlci50cyIsInNyYy9kb21fbWFuYWdlci9kb21PYmplY3QudHMiLCJzcmMvdXRpbGl0aWVzL2Nzc0RlZmluaXRpb25zLnRzIiwic3JjL2RvbV9tYW5hZ2VyL3JlZ2lvbmFsX21hbmFnZXJzL3JlZ2lvbk1hbmFnZXIudHMiLCJzcmMvZG9tX21hbmFnZXIvcmVnaW9uYWxfbWFuYWdlcnMvc3RhbmRhcmRNdWx0aUNvbHVtblJlZ2lvbk1hbmFnZXIudHMiLCJzcmMvZG9tX21hbmFnZXIvcmVnaW9uYWxfbWFuYWdlcnMvc2luZ2xlQ29sdW1uUmVnaW9uTWFuYWdlci50cyIsInNyYy9kb21fbWFuYWdlci9yZWdpb25hbF9tYW5hZ2Vycy9hdXRvTGF5b3V0UmVnaW9uTWFuYWdlci50cyIsInNyYy9kb21fbWFuYWdlci9yZWdpb25hbF9tYW5hZ2Vycy9yZWdpb25NYW5hZ2VyQ29udGFpbmVyLnRzIiwic3JjL2RvbV9tYW5hZ2VyL2RvbU1hbmFnZXIudHMiLCJzcmMvbGl2ZV9wcmV2aWV3L21jbV9saXZlUHJldmlld193aWRnZXQudHMiLCJzcmMvbGl2ZV9wcmV2aWV3L2NtNl9saXZlUHJldmlldy50cyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcclxuICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG4iLCIvKlxuICogRmlsZW5hbWU6IG11bHRpLWNvbHVtbi1tYXJrZG93bi9zcmMvcmVnaW9uU2V0dGluZ3MudHNcbiAqIENyZWF0ZWQgRGF0ZTogVHVlc2RheSwgRmVicnVhcnkgMXN0IDIwMjIsIDEyOjIzOjUzIHBtXG4gKiBBdXRob3I6IENhbWVyb24gUm9iaW5zb25cbiAqIFxuICogQ29weXJpZ2h0IChjKSAyMDIyIENhbWVyb24gUm9iaW5zb25cbiAqL1xuXG5leHBvcnQgZW51bSBCb3JkZXJPcHRpb24ge1xuICAgIGVuYWJsZWQsXG4gICAgb24sXG4gICAgdHJ1ZSxcbiAgICBkaXNhYmxlZCxcbiAgICBvZmYsXG4gICAgZmFsc2Vcbn1cblxuZXhwb3J0IGVudW0gU2hhZG93T3B0aW9uIHtcbiAgICBlbmFibGVkLFxuICAgIG9uLFxuICAgIHRydWUsXG4gICAgZGlzYWJsZWQsXG4gICAgb2ZmLFxuICAgIGZhbHNlXG59XG5cbmV4cG9ydCBlbnVtIENvbHVtbkxheW91dCB7IFxuICAgIHN0YW5kYXJkLFxuICAgIGxlZnQsXG4gICAgZmlyc3QsXG4gICAgY2VudGVyLFxuICAgIG1pZGRsZSxcbiAgICBzZWNvbmQsXG4gICAgcmlnaHQsXG4gICAgdGhpcmQsXG4gICAgbGFzdFxufTtcblxuZXhwb3J0IGVudW0gU2luZ2xlQ29sdW1uU2l6ZSB7XG4gICAgc21hbGwsXG4gICAgbWVkaXVtLFxuICAgIGxhcmdlXG59XG5cbmV4cG9ydCBlbnVtIENvbnRlbnRPdmVyZmxvd1R5cGUge1xuICAgIHNjcm9sbCxcbiAgICBoaWRkZW5cbn1cblxuZXhwb3J0IHR5cGUgTXVsdGlDb2x1bW5TZXR0aW5ncyA9IHtcbiAgICBudW1iZXJPZkNvbHVtbnM6IG51bWJlcixcbiAgICBjb2x1bW5MYXlvdXQ6IENvbHVtbkxheW91dCxcbiAgICBkcmF3Qm9yZGVyOiBib29sZWFuLFxuICAgIGRyYXdTaGFkb3c6IGJvb2xlYW4sXG4gICAgYXV0b0xheW91dDogYm9vbGVhblxuICAgIGNvbHVtblNpemU6IFNpbmdsZUNvbHVtblNpemUsXG4gICAgY29sdW1uUG9zaXRpb246IENvbHVtbkxheW91dCxcbiAgICBjb2x1bW5TcGFjaW5nOiBzdHJpbmcsXG4gICAgY29udGVudE92ZXJmbG93OiBDb250ZW50T3ZlcmZsb3dUeXBlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0TXVsdGlDb2x1bW5TZXR0aW5ncygpOiBNdWx0aUNvbHVtblNldHRpbmdzIHtcblxuICAgIHJldHVybiB7XG4gICAgICAgIG51bWJlck9mQ29sdW1uczogMixcbiAgICAgICAgY29sdW1uTGF5b3V0OiBDb2x1bW5MYXlvdXQuc3RhbmRhcmQsXG4gICAgICAgIGRyYXdCb3JkZXI6IHRydWUsXG4gICAgICAgIGRyYXdTaGFkb3c6IHRydWUsXG4gICAgICAgIGF1dG9MYXlvdXQ6IGZhbHNlLFxuICAgICAgICBjb2x1bW5TaXplOiBTaW5nbGVDb2x1bW5TaXplLm1lZGl1bSxcbiAgICAgICAgY29sdW1uUG9zaXRpb246IENvbHVtbkxheW91dC5zdGFuZGFyZCxcbiAgICAgICAgY29sdW1uU3BhY2luZzogXCJcIixcbiAgICAgICAgY29udGVudE92ZXJmbG93OiBDb250ZW50T3ZlcmZsb3dUeXBlLnNjcm9sbFxuICAgIH1cbn0iLCIvKipcbiAqIEZpbGU6IC9zcmMvdXRpbGl0aWVzL3NldHRpbmdzUGFyc2VyLnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAqIENyZWF0ZWQgRGF0ZTogRnJpZGF5LCBKdW5lIDNyZCAyMDIyLCA4OjE2IHBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAqIEF1dGhvcjogQ2FtZXJvbiBSb2JpbnNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAqIENvcHlyaWdodCAoYykgMjAyMiBDYW1lcm9uIFJvYmluc29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAqL1xuXG5pbXBvcnQgeyBNdWx0aUNvbHVtblNldHRpbmdzLCBDb2x1bW5MYXlvdXQsIEJvcmRlck9wdGlvbiwgU2hhZG93T3B0aW9uLCBnZXREZWZhdWx0TXVsdGlDb2x1bW5TZXR0aW5ncywgU2luZ2xlQ29sdW1uU2l6ZSwgQ29udGVudE92ZXJmbG93VHlwZSB9IGZyb20gXCIuLi9yZWdpb25TZXR0aW5nc1wiO1xuXG4vKipcbiAqIEhlcmUgd2UgZGVmaW5lIGFsbCBvZiB0aGUgdmFsaWQgc2V0dGluZ3Mgc3RyaW5ncyB0aGF0IHRoZSB1c2VyIGNhbiBlbnRlciBmb3IgZWFjaCBzZXR0aW5nIHR5cGUuXG4gKiBUaGUgc3RyaW5ncyBhcmUgdGhlbiBtYXBwZWQgdHdpY2UsIGZpcnN0IHRvIGEgdmFsaWQgcmVnZXggc3RyaW5nIHRoYXQgc2VhcmNoZXMgZm9yIHRoZSBzZXR0aW5nXG4gKiBuYW1lLCBpZ25vcmluZyBhbGwgZXh0cmEgc3BhY2VzIGFuZCBsZXR0ZXIgY2FzZSwgYW5kIHRoZW4gbWFwZWQgdG8gYSBSZWdFeCBvYmplY3QgdG8gYmUgdXNlZCBcbiAqIHdoZW4gcGFyc2luZy5cbiAqL1xuY29uc3QgQ09MX1BPU0lUSU9OX09QVElPTl9TVFJTOiBzdHJpbmdbXSA9IFtcbiAgICBcImNvbHVtbiBwb3NpdGlvblwiLFxuICAgIFwiY29sIHBvc2l0aW9uXCIsXG4gICAgXCJjb2x1bW4gbG9jYXRpb25cIixcbiAgICBcImNvbCBsb2NhdGlvblwiLFxuICAgIFwic2luZ2xlIGNvbHVtbiBsb2NhdGlvblwiLFxuICAgIFwic2luZ2xlIGNvbHVtbiBwb3NpdGlvblwiLFxuXTtcbmNvbnN0IENPTF9QT1NJVElPTl9SRUdFWF9BUlI6IFJlZ0V4cFtdID0gQ09MX1BPU0lUSU9OX09QVElPTl9TVFJTLm1hcChjb252ZXJ0U3RyaW5nVG9TZXR0aW5nc1JlZ2V4KS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAodmFsdWUsIFwiaVwiKTtcbn0pO1xuXG5jb25zdCBDT0xfU0laRV9PUFRJT05fU1RSUzogc3RyaW5nW10gPSBbXG4gICAgXCJjb2x1bW4gc2l6ZVwiLFxuICAgIFwiY29sdW1uIHdpZHRoXCIsXG4gICAgXCJjb2wgc2l6ZVwiLFxuICAgIFwiY29sIHdpZHRoXCIsXG4gICAgXCJzaW5nbGUgY29sdW1uIHNpemVcIixcbiAgICBcInNpbmdsZSBjb2wgc2l6ZVwiLFxuICAgIFwic2luZ2xlIGNvbHVtbiB3aWR0aFwiLFxuICAgIFwic2luZ2xlIGNvbCB3aWR0aFwiXG5dO1xuY29uc3QgQ09MX1NJWkVfT1BUSU9OX1JFR0VYX0FSUjogUmVnRXhwW10gPSBDT0xfU0laRV9PUFRJT05fU1RSUy5tYXAoY29udmVydFN0cmluZ1RvU2V0dGluZ3NSZWdleCkubWFwKCh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKHZhbHVlLCBcImlcIik7XG59KTtcblxuY29uc3QgTlVNQkVSX09GX0NPTFVNTlNfU1RSUyA9IFtcbiAgICBcIm51bWJlciBvZiBjb2x1bW5zXCJcbl1cbmNvbnN0IE5VTUJFUl9PRl9DT0xVTU5TX1JFR0VYX0FSUjogUmVnRXhwW10gPSBOVU1CRVJfT0ZfQ09MVU1OU19TVFJTLm1hcChjb252ZXJ0U3RyaW5nVG9TZXR0aW5nc1JlZ2V4KS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAodmFsdWUsIFwiaVwiKTtcbn0pO1xuXG5jb25zdCBMQVJHRVNUX0NPTFVNTl9TVFJTID0gW1xuICAgIFwibGFyZ2VzdCBjb2x1bW5cIlxuXVxuY29uc3QgTEFSR0VTVF9DT0xVTU5fUkVHRVhfQVJSOiBSZWdFeHBbXSA9IExBUkdFU1RfQ09MVU1OX1NUUlMubWFwKGNvbnZlcnRTdHJpbmdUb1NldHRpbmdzUmVnZXgpLm1hcCgodmFsdWUpID0+IHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cCh2YWx1ZSwgXCJpXCIpO1xufSk7XG5cbmNvbnN0IERSQVdfQk9SREVSX1NUUlMgPSBbXG4gICAgXCJib3JkZXJcIlxuXVxuY29uc3QgRFJBV19CT1JERVJfUkVHRVhfQVJSOiBSZWdFeHBbXSA9IERSQVdfQk9SREVSX1NUUlMubWFwKGNvbnZlcnRTdHJpbmdUb1NldHRpbmdzUmVnZXgpLm1hcCgodmFsdWUpID0+IHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cCh2YWx1ZSwgXCJpXCIpO1xufSk7XG5cbmNvbnN0IERSQVdfU0hBRE9XX1NUUlMgPSBbXG4gICAgXCJzaGFkb3dcIlxuXVxuY29uc3QgRFJBV19TSEFET1dfUkVHRVhfQVJSOiBSZWdFeHBbXSA9IERSQVdfU0hBRE9XX1NUUlMubWFwKGNvbnZlcnRTdHJpbmdUb1NldHRpbmdzUmVnZXgpLm1hcCgodmFsdWUpID0+IHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cCh2YWx1ZSwgXCJpXCIpO1xufSk7XG5cbmNvbnN0IEFVVE9fTEFZT1VUX1NFVFRJTkdfU1RSUyA9IFtcbiAgICBcImF1dG8gbGF5b3V0XCJcbl1cbmNvbnN0IEFVVE9fTEFZT1VUX1JFR0VYX0FSUjogUmVnRXhwW10gPSBBVVRPX0xBWU9VVF9TRVRUSU5HX1NUUlMubWFwKGNvbnZlcnRTdHJpbmdUb1NldHRpbmdzUmVnZXgpLm1hcCgodmFsdWUpID0+IHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cCh2YWx1ZSwgXCJpXCIpO1xufSk7XG5cbmNvbnN0IENPTFVNTl9TUEFDSU5HX1JFR0VYX0FSUjogUmVnRXhwW10gPSBbXG4gICAgXCJjb2x1bW4gc3BhY2luZ1wiLFxuXS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoY29udmVydFN0cmluZ1RvU2V0dGluZ3NSZWdleCh2YWx1ZSksIFwiaVwiKTtcbn0pO1xuXG5jb25zdCBDT05URU5UX09WRVJGTE9XX1JFR0VYX0FSUjogUmVnRXhwW10gPSBbXG4gICAgXCJvdmVyZmxvd1wiLFxuICAgIFwiY29udGVudCBvdmVyZmxvd1wiXG5dLm1hcCgodmFsdWUpID0+IHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChjb252ZXJ0U3RyaW5nVG9TZXR0aW5nc1JlZ2V4KHZhbHVlKSwgXCJpXCIpXG59KVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIHNldHRpbmdzIHN0cmluZyB0aHJvdWdoIGVhY2ggcmVnZXggb3B0aW9uLiBJZiBvbmUgb2YgdGhlIHJlZ2V4XG4gKiB2YWx1ZXMgbWF0Y2gsIGl0IHJldHVybnMgdGhlIGZpcnN0IGdyb3VwIGZvdW5kIGJ5IHRoZSByZWdleC4gVGhpcyBpcyBkZXBlbmRlZCBvbiBwcm9wZXJcbiAqIHJlZ2V4IGZvcm1hdHRpbmcgd2hpY2ggaXMgZG9uZSBieSB0aGUgY29udmVydFN0cmluZ1RvU2V0dGluZ3NSZWdleCBmdW5jdGlvbiBkZWZpbmVkIGJlbG93LlxuICogXG4gKiBAcGFyYW0gc2V0dGluZ3NTdHJpbmcgVGhlIHZhbHVlIHRoYXQgbWF5IG1hdGNoIG9uZSBvZiB0aGUgc2V0dGluZyBvcHRpb25zLlxuICogQHBhcmFtIHZhbGlkU2V0dGluZ0Zvcm1hdFJlZ0V4IFRoZSBzZXR0aW5ncyBvcHRpb25zIHRocm91Z2ggd2hpY2ggdG8gY2hlY2sgYWxsIG9wdGlvbnMuIElmIG9uZSBvZiB0aGVzZSByZWdleCBcbiAqIHZhbHVlcyBtYXRjaCBvbiB0aGUgc3RyaW5nIHdlIGJyZWFrIGZyb20gdGhlIGxvb3AgcmV0dXJuaW5nIHRoZSBmb3VuZCB2YWx1ZS5cbiAqIFxuICogQHJldHVybnMgdGhlIHVzZXIgZW50ZXJlZCBkYXRhIGlmIHRoZSBzZXR0aW5nIGlzIGEgbWF0Y2gsIG9yIG51bGwgaWYgbm9uIG9mIHRoZSBvcHRpb25zIG1hdGNoZWQuXG4gKi9cbmZ1bmN0aW9uIGdldFNldHRpbmdzRGF0YUZyb21LZXlzKHNldHRpbmdzU3RyaW5nOiBzdHJpbmcsIHZhbGlkU2V0dGluZ0Zvcm1hdFJlZ0V4OiBSZWdFeHBbXSk6IHN0cmluZyB8IG51bGwge1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZFNldHRpbmdGb3JtYXRSZWdFeC5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIGxldCByZWdleFNlYXJjaERhdGEgPSB2YWxpZFNldHRpbmdGb3JtYXRSZWdFeFtpXS5leGVjKHNldHRpbmdzU3RyaW5nKVxuICAgICAgICBpZihyZWdleFNlYXJjaERhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiByZWdleFNlYXJjaERhdGFbMV0udHJpbSgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2luZ2xlQ29sdW1uU2V0dGluZ3Moc2V0dGluZ3NTdHI6IHN0cmluZywgb3JpZ2luYWxTZXR0aW5nczogTXVsdGlDb2x1bW5TZXR0aW5ncyk6IE11bHRpQ29sdW1uU2V0dGluZ3Mge1xuXG4gICAgbGV0IHNldHRpbmdzTGluZXMgPSBzZXR0aW5nc1N0ci5zcGxpdChcIlxcblwiKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldHRpbmdzTGluZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICBsZXQgc2V0dGluZ3NMaW5lID0gc2V0dGluZ3NMaW5lc1tpXTtcbiAgICAgICAgbGV0IHNldHRpbmdzRGF0YSA9IGdldFNldHRpbmdzRGF0YUZyb21LZXlzKHNldHRpbmdzTGluZSwgQ09MX1BPU0lUSU9OX1JFR0VYX0FSUik7XG4gICAgICAgIGlmIChzZXR0aW5nc0RhdGEgIT09IG51bGwpIHtcblxuICAgICAgICAgICAgb3JpZ2luYWxTZXR0aW5ncy5jb2x1bW5Qb3NpdGlvbiA9IHBhcnNlRm9yU2luZ2xlQ29sdW1uTG9jYXRpb24oc2V0dGluZ3NEYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldHRpbmdzRGF0YSA9IGdldFNldHRpbmdzRGF0YUZyb21LZXlzKHNldHRpbmdzTGluZSwgQ09MX1NJWkVfT1BUSU9OX1JFR0VYX0FSUik7XG4gICAgICAgIGlmIChzZXR0aW5nc0RhdGEgIT09IG51bGwpIHtcblxuICAgICAgICAgICAgb3JpZ2luYWxTZXR0aW5ncy5jb2x1bW5TaXplID0gcGFyc2VGb3JTaW5nbGVDb2x1bW5TaXplKHNldHRpbmdzRGF0YSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvcmlnaW5hbFNldHRpbmdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb2x1bW5TZXR0aW5ncyhzZXR0aW5nc1N0cjogc3RyaW5nKTogTXVsdGlDb2x1bW5TZXR0aW5ncyB7XG5cbiAgICBsZXQgcGFyc2VkU2V0dGluZ3MgPSBnZXREZWZhdWx0TXVsdGlDb2x1bW5TZXR0aW5ncygpO1xuXG4gICAgbGV0IHNldHRpbmdzTGluZXMgPSBzZXR0aW5nc1N0ci5zcGxpdChcIlxcblwiKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0dGluZ3NMaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgc2V0dGluZ3NMaW5lID0gc2V0dGluZ3NMaW5lc1tpXTtcblxuICAgICAgICBsZXQgc2V0dGluZ3NEYXRhID0gZ2V0U2V0dGluZ3NEYXRhRnJvbUtleXMoc2V0dGluZ3NMaW5lLCBOVU1CRVJfT0ZfQ09MVU1OU19SRUdFWF9BUlIpO1xuICAgICAgICBpZiAoc2V0dGluZ3NEYXRhICE9PSBudWxsKSB7XG5cbiAgICAgICAgICAgIGxldCBudW1PZkNvbHMgPSBwYXJzZUludChzZXR0aW5nc0RhdGEpXG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG51bU9mQ29scykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bU9mQ29scyA+PSAxICYmIG51bU9mQ29scyA8PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZFNldHRpbmdzLm51bWJlck9mQ29sdW1ucyA9IG51bU9mQ29scztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZXR0aW5nc0RhdGEgPSBnZXRTZXR0aW5nc0RhdGFGcm9tS2V5cyhzZXR0aW5nc0xpbmUsIExBUkdFU1RfQ09MVU1OX1JFR0VYX0FSUilcbiAgICAgICAgaWYgKHNldHRpbmdzRGF0YSAhPT0gbnVsbCkge1xuXG4gICAgICAgICAgICBsZXQgdXNlckRlZkxheW91dDogQ29sdW1uTGF5b3V0ID0gKDxhbnk+Q29sdW1uTGF5b3V0KVtzZXR0aW5nc0RhdGFdO1xuICAgICAgICAgICAgaWYgKHVzZXJEZWZMYXlvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBhcnNlZFNldHRpbmdzLmNvbHVtbkxheW91dCA9IHVzZXJEZWZMYXlvdXQ7XG4gICAgICAgICAgICAgICAgcGFyc2VkU2V0dGluZ3MuY29sdW1uUG9zaXRpb24gPSB1c2VyRGVmTGF5b3V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0dGluZ3NEYXRhID0gZ2V0U2V0dGluZ3NEYXRhRnJvbUtleXMoc2V0dGluZ3NMaW5lLCBEUkFXX0JPUkRFUl9SRUdFWF9BUlIpXG4gICAgICAgIGlmIChzZXR0aW5nc0RhdGEgIT09IG51bGwpIHtcblxuICAgICAgICAgICAgbGV0IGlzQm9yZGVyRHJhd246IEJvcmRlck9wdGlvbiA9ICg8YW55PkJvcmRlck9wdGlvbilbc2V0dGluZ3NEYXRhXTtcbiAgICAgICAgICAgIGlmIChpc0JvcmRlckRyYXduICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGlzQm9yZGVyRHJhd24pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAoQm9yZGVyT3B0aW9uLmRpc2FibGVkKTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAoQm9yZGVyT3B0aW9uLm9mZik6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgKEJvcmRlck9wdGlvbi5mYWxzZSk6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRTZXR0aW5ncy5kcmF3Qm9yZGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZXR0aW5nc0RhdGEgPSBnZXRTZXR0aW5nc0RhdGFGcm9tS2V5cyhzZXR0aW5nc0xpbmUsIERSQVdfU0hBRE9XX1JFR0VYX0FSUilcbiAgICAgICAgaWYgKHNldHRpbmdzRGF0YSAhPT0gbnVsbCkge1xuXG4gICAgICAgICAgICBsZXQgaXNTaGFkb3dEcmF3bjogU2hhZG93T3B0aW9uID0gKDxhbnk+U2hhZG93T3B0aW9uKVtzZXR0aW5nc0RhdGFdO1xuICAgICAgICAgICAgaWYgKGlzU2hhZG93RHJhd24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoaXNTaGFkb3dEcmF3bikge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIChTaGFkb3dPcHRpb24uZGlzYWJsZWQpOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIChTaGFkb3dPcHRpb24ub2ZmKTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAoU2hhZG93T3B0aW9uLmZhbHNlKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFNldHRpbmdzLmRyYXdTaGFkb3cgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNldHRpbmdzRGF0YSA9IGdldFNldHRpbmdzRGF0YUZyb21LZXlzKHNldHRpbmdzTGluZSwgQVVUT19MQVlPVVRfUkVHRVhfQVJSKVxuICAgICAgICBpZiAoc2V0dGluZ3NEYXRhICE9PSBudWxsKSB7XG5cbiAgICAgICAgICAgIGlmKHNldHRpbmdzRGF0YSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICBwYXJzZWRTZXR0aW5ncy5hdXRvTGF5b3V0ID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0dGluZ3NEYXRhID0gZ2V0U2V0dGluZ3NEYXRhRnJvbUtleXMoc2V0dGluZ3NMaW5lLCBDT0xVTU5fU1BBQ0lOR19SRUdFWF9BUlIpO1xuICAgICAgICBpZihzZXR0aW5nc0RhdGEgIT09IG51bGwpIHtcblxuICAgICAgICAgICAgbGV0IHBhcnNlZCA9IGdldExlbmd0aFVuaXQoc2V0dGluZ3NEYXRhLnRyaW0oKSk7XG4gICAgICAgICAgICBsZXQgc3BhY2luZ1N0ciA9IFwiXCI7XG5cbiAgICAgICAgICAgIGlmKHBhcnNlZC5pc1ZhbGlkKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgbm9Vbml0c1N0ciA9IHNldHRpbmdzRGF0YS5yZXBsYWNlKHBhcnNlZC51bml0U3RyLCBcIlwiKS50cmltKCk7XG4gICAgICAgICAgICAgICAgbGV0IG5vVW5pdHNOdW0gPSBwYXJzZUludChub1VuaXRzU3RyKTtcbiAgICAgICAgICAgICAgICBpZihpc05hTihub1VuaXRzTnVtKSA9PT0gZmFsc2UpIHtcblxuICAgICAgICAgICAgICAgICAgICBzcGFjaW5nU3RyID0gYCR7bm9Vbml0c1N0cn0ke3BhcnNlZC51bml0U3RyfWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgbm9Vbml0c051bSA9IHBhcnNlSW50KHNldHRpbmdzRGF0YS50cmltKCkpO1xuICAgICAgICAgICAgICAgIGlmKGlzTmFOKG5vVW5pdHNOdW0pID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHNwYWNpbmdTdHIgPSBgJHtub1VuaXRzTnVtfXB0YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyc2VkU2V0dGluZ3MuY29sdW1uU3BhY2luZyA9IHNwYWNpbmdTdHI7XG4gICAgICAgIH1cblxuICAgICAgICBzZXR0aW5nc0RhdGEgPSBnZXRTZXR0aW5nc0RhdGFGcm9tS2V5cyhzZXR0aW5nc0xpbmUsIENPTlRFTlRfT1ZFUkZMT1dfUkVHRVhfQVJSKTtcbiAgICAgICAgaWYoc2V0dGluZ3NEYXRhICE9PSBudWxsKSB7XG5cbiAgICAgICAgICAgIGxldCBvdmVyZmxvd1R5cGUgPSBDb250ZW50T3ZlcmZsb3dUeXBlLnNjcm9sbDtcblxuICAgICAgICAgICAgc2V0dGluZ3NEYXRhID0gc2V0dGluZ3NEYXRhLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICAgICAgaWYoc2V0dGluZ3NEYXRhID09PSBcImhpZGRlblwiKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dUeXBlID0gQ29udGVudE92ZXJmbG93VHlwZS5oaWRkZW47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcnNlZFNldHRpbmdzLmNvbnRlbnRPdmVyZmxvdyA9IG92ZXJmbG93VHlwZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJzZWRTZXR0aW5ncztcbn1cblxuZnVuY3Rpb24gZ2V0TGVuZ3RoVW5pdChsZW5ndGhTdHI6IHN0cmluZyk6IHsgaXNWYWxpZDogYm9vbGVhbiwgdW5pdFN0cjogc3RyaW5nIH0ge1xuXG4gICAgbGV0IGxhc3RDaGFyID0gbGVuZ3RoU3RyLnNsaWNlKGxlbmd0aFN0ci5sZW5ndGggLSAxKTtcbiAgICBsZXQgbGFzdFR3b0NoYXJzID0gbGVuZ3RoU3RyLnNsaWNlKGxlbmd0aFN0ci5sZW5ndGggLSAyKTtcblxuICAgIGxldCB1bml0U3RyID0gXCJcIlxuICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgaWYobGFzdENoYXIgPT09IFwiJVwiKSB7XG4gICAgICAgIHVuaXRTdHIgPSBsYXN0Q2hhcjtcbiAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYobGFzdFR3b0NoYXJzID09PSBcImNtXCIgfHxcbiAgICAgICAgICAgIGxhc3RUd29DaGFycyA9PT0gXCJtbVwiIHx8XG4gICAgICAgICAgICBsYXN0VHdvQ2hhcnMgPT09IFwiaW5cIiB8fFxuICAgICAgICAgICAgbGFzdFR3b0NoYXJzID09PSBcInB4XCIgfHxcbiAgICAgICAgICAgIGxhc3RUd29DaGFycyA9PT0gXCJwdFwiIHx8XG4gICAgICAgICAgICBsYXN0VHdvQ2hhcnMgPT09IFwicGNcIiB8fFxuICAgICAgICAgICAgbGFzdFR3b0NoYXJzID09PSBcImVtXCIgfHxcbiAgICAgICAgICAgIGxhc3RUd29DaGFycyA9PT0gXCJleFwiIHx8XG4gICAgICAgICAgICBsYXN0VHdvQ2hhcnMgPT09IFwiY2hcIiB8fFxuICAgICAgICAgICAgbGFzdFR3b0NoYXJzID09PSBcInZ3XCIgfHxcbiAgICAgICAgICAgIGxhc3RUd29DaGFycyA9PT0gXCJ2aFwiICkge1xuICAgICAgICB1bml0U3RyID0gbGFzdFR3b0NoYXJzO1xuICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBpc1ZhbGlkOiBpc1ZhbGlkLCB1bml0U3RyOiB1bml0U3RyIH1cbn1cblxuY29uc3QgQ09ERUJMT0NLX1JFR0lPTl9JRF9SRUdFWF9TVFJTID0gW1xuICAgIFwiaWRcIixcbiAgICBcInJlZ2lvbiBpZFwiXG5dXG5jb25zdCBDT0RFQkxPQ0tfUkVHSU9OX0lEX1JFR0VYX0FSUjogUmVnRXhwW10gPSBDT0RFQkxPQ0tfUkVHSU9OX0lEX1JFR0VYX1NUUlMubWFwKGNvbnZlcnRTdHJpbmdUb1NldHRpbmdzUmVnZXgpLm1hcCgodmFsdWUpID0+IHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cCh2YWx1ZSwgXCJpXCIpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdGFydFJlZ2lvbkNvZGVCbG9ja0lEKHNldHRpbmdzU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuXG4gICAgbGV0IGNvZGVCbG9ja1JlZ2lvbklEID0gXCJcIlxuICAgIGxldCBzZXR0aW5nc0xpbmVzID0gc2V0dGluZ3NTdHIuc3BsaXQoXCJcXG5cIik7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldHRpbmdzTGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHNldHRpbmdzTGluZSA9IHNldHRpbmdzTGluZXNbaV07XG5cbiAgICAgICAgbGV0IHNldHRpbmdzRGF0YSA9IGdldFNldHRpbmdzRGF0YUZyb21LZXlzKHNldHRpbmdzTGluZSwgQ09ERUJMT0NLX1JFR0lPTl9JRF9SRUdFWF9BUlIpO1xuICAgICAgICBpZiAoc2V0dGluZ3NEYXRhICE9PSBudWxsKSB7XG5cbiAgICAgICAgICAgIGNvZGVCbG9ja1JlZ2lvbklEID0gc2V0dGluZ3NEYXRhXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29kZUJsb2NrUmVnaW9uSUQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRm9yU2luZ2xlQ29sdW1uTG9jYXRpb24obG9jYXRpb25TdHJpbmc6IHN0cmluZyk6IENvbHVtbkxheW91dHtcblxuICAgIHN3aXRjaCAobG9jYXRpb25TdHJpbmcudG9Mb3dlckNhc2UoKS50cmltKCkucmVwbGFjZShcIiBcIiwgXCJcIikpIHtcbiAgICAgICAgY2FzZSBcImxlZnRcIjpcbiAgICAgICAgY2FzZSBcImxlZnRzaWRlXCI6XG4gICAgICAgIGNhc2UgXCJsZWZ0bWFyZ2luXCI6XG4gICAgICAgIGNhc2UgXCJsZWZ0YWxpZ25cIjpcbiAgICAgICAgY2FzZSBcImxlZnRhbGlnbmVkXCI6XG4gICAgICAgIGNhc2UgXCJsZWZ0YWxpZ25lbWVudFwiOlxuICAgICAgICBjYXNlIFwiZmlyc3RcIjpcbiAgICAgICAgY2FzZSBcInN0YXJ0XCI6XG4gICAgICAgIGNhc2UgXCJiZWdpbm5pbmdcIjpcbiAgICAgICAgICAgIHJldHVybiBDb2x1bW5MYXlvdXQubGVmdFxuICAgICAgICBjYXNlIFwibWlkZGxlXCI6XG4gICAgICAgIGNhc2UgXCJtaWRkbGVhbGlnbmVkXCI6XG4gICAgICAgIGNhc2UgXCJtaWRkbGVhbGlnbm1lbnRcIjpcbiAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICBjYXNlIFwiY2VudGVyYWxpZ25lZFwiOlxuICAgICAgICBjYXNlIFwiY2VudGVyYWxpZ25tZW50XCI6XG4gICAgICAgIGNhc2UgXCJjZW50ZXJlZFwiOlxuICAgICAgICBjYXNlIFwic3RhbmRhcmRcIjpcbiAgICAgICAgICAgIHJldHVybiBDb2x1bW5MYXlvdXQuY2VudGVyXG4gICAgICAgIGNhc2UgXCJyaWdodFwiOlxuICAgICAgICBjYXNlIFwicmlnaHRzaWRlXCI6XG4gICAgICAgIGNhc2UgXCJyaWdodG1hcmdpblwiOlxuICAgICAgICBjYXNlIFwicmlnaHRhbGlnblwiOlxuICAgICAgICBjYXNlIFwicmlnaHRhbGlnbmVkXCI6XG4gICAgICAgIGNhc2UgXCJyaWdodGFsaWdubWVudFwiOlxuICAgICAgICBjYXNlIFwibGFzdFwiOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gQ29sdW1uTGF5b3V0LnJpZ2h0XG4gICAgfVxuXG4gICAgcmV0dXJuIENvbHVtbkxheW91dC5jZW50ZXJcbn1cblxuZnVuY3Rpb24gcGFyc2VGb3JTaW5nbGVDb2x1bW5TaXplKHNpemVTdHJpbmc6IHN0cmluZyk6IFNpbmdsZUNvbHVtblNpemUge1xuXG4gICAgc3dpdGNoIChzaXplU3RyaW5nID0gc2l6ZVN0cmluZy50b0xvd2VyQ2FzZSgpLnRyaW0oKS5yZXBsYWNlKFwiIFwiLCBcIlwiKSkge1xuICAgICAgICBjYXNlIFwic21hbGxcIjpcbiAgICAgICAgY2FzZSBcInNtXCI6XG4gICAgICAgICAgICByZXR1cm4gU2luZ2xlQ29sdW1uU2l6ZS5zbWFsbDtcbiAgICAgICAgY2FzZSBcIm1lZGl1bVwiOlxuICAgICAgICBjYXNlIFwibWVkXCI6XG4gICAgICAgICAgICByZXR1cm4gU2luZ2xlQ29sdW1uU2l6ZS5tZWRpdW07XG4gICAgICAgIGNhc2UgXCJsYXJnZVwiOlxuICAgICAgICBjYXNlIFwibGdcIjpcbiAgICAgICAgICAgIHJldHVybiBTaW5nbGVDb2x1bW5TaXplLmxhcmdlO1xuICAgIH1cblxuICAgIHJldHVybiBTaW5nbGVDb2x1bW5TaXplLm1lZGl1bVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0U3RyaW5nVG9TZXR0aW5nc1JlZ2V4KG9yaWdpbmFsU3RyaW5nOiBTdHJpbmcpOiBzdHJpbmcge1xuXG4gICAgb3JpZ2luYWxTdHJpbmcgPSBvcmlnaW5hbFN0cmluZy5yZXBsYWNlKFwiIFwiLCBcIiAqXCIpO1xuICAgIFxuICAgIGxldCByZWdleFN0cmluZyA9IGAoPzoke29yaWdpbmFsU3RyaW5nfSAqOiAqKSguKilgO1xuICAgIHJldHVybiByZWdleFN0cmluZztcbn0iLCIvKlxuICogRmlsZTogbXVsdGktY29sdW1uLW1hcmtkb3duL3NyYy9NdWx0aUNvbHVtblBhcnNlci50c1xuICogQ3JlYXRlZCBEYXRlOiBTYXR1cmRheSwgSmFudWFyeSAyMm5kIDIwMjIsIDY6MDI6NDYgcG1cbiAqIEF1dGhvcjogQ2FtZXJvbiBSb2JpbnNvblxuICogXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgQ2FtZXJvbiBSb2JpbnNvblxuICovXG5cbmltcG9ydCB7IHBhcnNlU3RhcnRSZWdpb25Db2RlQmxvY2tJRCB9IGZyb20gXCIuL3NldHRpbmdzUGFyc2VyXCI7XG5cbmNvbnN0IFNUQVJUX1JFR0VYX1NUUlMgPSBbXCI9PT0gKnN0YXJ0LW11bHRpLWNvbHVtbig6P1thLXpBLVowLTktX1xcXFxzXSopP1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIj09PSAqbXVsdGktY29sdW1uLXN0YXJ0KDo/W2EtekEtWjAtOS1fXFxcXHNdKik/XCJdXG5jb25zdCBTVEFSVF9SRUdFWF9BUlI6IFJlZ0V4cFtdID0gW107XG5mb3IobGV0IGkgPSAwOyBpIDwgU1RBUlRfUkVHRVhfU1RSUy5sZW5ndGg7IGkrKykge1xuICAgIFNUQVJUX1JFR0VYX0FSUi5wdXNoKG5ldyBSZWdFeHAoU1RBUlRfUkVHRVhfU1RSU1tpXSkpO1xufVxuXG5jb25zdCBTVEFSVF9SRUdFWF9TVFJTX1dIT0xFX0xJTkUgPSBbXCJePT09ICpzdGFydC1tdWx0aS1jb2x1bW4oOj9bYS16QS1aMC05LV9cXFxcc10qKT8kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJePT09ICptdWx0aS1jb2x1bW4tc3RhcnQoOj9bYS16QS1aMC05LV9cXFxcc10qKT8kXCJdXG5jb25zdCBTVEFSVF9SRUdFWF9BUlJfV0hPTEVfTElORTogUmVnRXhwW10gPSBbXTtcbmZvcihsZXQgaSA9IDA7IGkgPCBTVEFSVF9SRUdFWF9TVFJTX1dIT0xFX0xJTkUubGVuZ3RoOyBpKyspIHtcbiAgICBTVEFSVF9SRUdFWF9BUlJfV0hPTEVfTElORS5wdXNoKG5ldyBSZWdFeHAoU1RBUlRfUkVHRVhfU1RSU19XSE9MRV9MSU5FW2ldKSk7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTdGFydFRhZyh0ZXh0OiBzdHJpbmcpOiB7IGZvdW5kOiBib29sZWFuLCBzdGFydFBvc2l0aW9uOiBudW1iZXIsIGVuZFBvc2l0aW9uOiBudW1iZXIsIG1hdGNoTGVuZ3RoOiBudW1iZXIgfSB7XG5cbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICBsZXQgc3RhcnRQb3NpdGlvbiA9IC0xO1xuICAgIGxldCBtYXRjaExlbmd0aCA9IDA7XG4gICAgZm9yKGxldCBpID0gMDsgaTwgU1RBUlRfUkVHRVhfQVJSLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgbGV0IHJlZ2V4RGF0YSA9IFNUQVJUX1JFR0VYX0FSUltpXS5leGVjKHRleHQpXG4gICAgICAgIGlmKHJlZ2V4RGF0YSAhPT0gbnVsbCAmJiByZWdleERhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IHJlZ2V4RGF0YS5pbmRleFxuICAgICAgICAgICAgbWF0Y2hMZW5ndGggPSByZWdleERhdGFbMF0ubGVuZ3RoO1xuXG4gICAgICAgICAgICBsZXQgbGluZSA9IHRleHQuc2xpY2Uoc3RhcnRQb3NpdGlvbiwgc3RhcnRQb3NpdGlvbiArIG1hdGNoTGVuZ3RoKTtcbiAgICAgICAgICAgIGlmKFNUQVJUX1JFR0VYX0FSUl9XSE9MRV9MSU5FW2ldLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGVuZFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbiArIG1hdGNoTGVuZ3RoO1xuXG4gICAgcmV0dXJuIHsgZm91bmQsIHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uLCBtYXRjaExlbmd0aCB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zU3RhcnRUYWcodGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZpbmRTdGFydFRhZyh0ZXh0KS5mb3VuZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdGFydFRhZ1dpdGhJRCh0ZXh0OiBzdHJpbmcpOiB7aXNTdGFydFRhZzogYm9vbGVhbiwgaGFzS2V5OiBib29sZWFufSB7XG5cbiAgICBsZXQgc3RhcnRUYWdEYXRhID0gZmluZFN0YXJ0VGFnKHRleHQpO1xuICAgIGlmKHN0YXJ0VGFnRGF0YS5mb3VuZCA9PT0gdHJ1ZSkge1xuXG4gICAgICAgIGxldCBrZXkgPSBnZXRTdGFydFRhZ0tleSh0ZXh0KVxuICAgICAgICBpZihrZXkgPT09IG51bGwgfHwga2V5ID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4ge2lzU3RhcnRUYWc6IHRydWUsIGhhc0tleTogZmFsc2V9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7aXNTdGFydFRhZzogdHJ1ZSwgaGFzS2V5OiB0cnVlfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2lzU3RhcnRUYWc6IGZhbHNlLCBoYXNLZXk6IGZhbHNlfTtcbn1cblxuY29uc3QgRU5EX1JFR0VYX1NUUlMgPSBbXCI9PT0gKmVuZC1tdWx0aS1jb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiPT09ICptdWx0aS1jb2x1bW4tZW5kXCJdXG5jb25zdCBFTkRfUkVHRVhfQVJSOiBSZWdFeHBbXSA9IFtdO1xuZm9yKGxldCBpID0gMDsgaSA8IEVORF9SRUdFWF9TVFJTLmxlbmd0aDsgaSsrKSB7XG4gICAgRU5EX1JFR0VYX0FSUi5wdXNoKG5ldyBSZWdFeHAoRU5EX1JFR0VYX1NUUlNbaV0pKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRW5kVGFnKHRleHQ6IHN0cmluZyk6IHsgZm91bmQ6IGJvb2xlYW4sIHN0YXJ0UG9zaXRpb246IG51bWJlciwgZW5kUG9zaXRpb246IG51bWJlciwgbWF0Y2hMZW5ndGg6IG51bWJlciB9IHtcblxuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGxldCBzdGFydFBvc2l0aW9uID0gLTE7XG4gICAgZm9yKGxldCBpID0gMDsgaTwgRU5EX1JFR0VYX0FSUi5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIGlmKEVORF9SRUdFWF9BUlJbaV0udGVzdCh0ZXh0KSkge1xuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IHRleHQuc2VhcmNoKEVORF9SRUdFWF9TVFJTW2ldKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZW5kUG9zaXRpb24gPSAtMVxuICAgIGxldCBtYXRjaExlbmd0aCA9IDA7XG4gICAgZm9yKGxldCBpID0gMDsgaTwgRU5EX1JFR0VYX0FSUi5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIGxldCByZWdleERhdGEgPSBFTkRfUkVHRVhfQVJSW2ldLmV4ZWModGV4dClcbiAgICAgICAgaWYocmVnZXhEYXRhICE9PSBudWxsICYmIHJlZ2V4RGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uID0gcmVnZXhEYXRhLmluZGV4XG4gICAgICAgICAgICBtYXRjaExlbmd0aCA9IHJlZ2V4RGF0YVswXS5sZW5ndGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbmRQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb24gKyBtYXRjaExlbmd0aDtcblxuICAgIHJldHVybiB7IGZvdW5kLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwgbWF0Y2hMZW5ndGggfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluc0VuZFRhZyh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmluZEVuZFRhZyh0ZXh0KS5mb3VuZFxufVxuXG5jb25zdCBDT0xfUkVHRVhfU1RSUzogc3RyaW5nW10gPSBbXCI9PT0gKmNvbHVtbi1lbmQgKj09PVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPT09ICplbmQtY29sdW1uICo9PT1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj09PSAqY29sdW1uLWJyZWFrICo9PT1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj09PSAqYnJlYWstY29sdW1uICo9PT1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi0tLSAqY29sdW1uLWVuZCAqLS0tXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCItLS0gKmVuZC1jb2x1bW4gKi0tLVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLS0tICpjb2x1bW4tYnJlYWsgKi0tLVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLS0tICpicmVhay1jb2x1bW4gKi0tLVwiXTtcbmNvbnN0IENPTF9SRUdFWF9BUlI6IFJlZ0V4cFtdID0gW107XG5mb3IobGV0IGkgPSAwOyBpIDwgQ09MX1JFR0VYX1NUUlMubGVuZ3RoOyBpKyspIHtcbiAgICBDT0xfUkVHRVhfQVJSLnB1c2gobmV3IFJlZ0V4cChDT0xfUkVHRVhfU1RSU1tpXSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zQ29sRW5kVGFnKHRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgZm9yKGxldCBpID0gMDsgaTwgQ09MX1JFR0VYX0FSUi5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIGlmKENPTF9SRUdFWF9BUlJbaV0udGVzdCh0ZXh0KSkge1xuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZm91bmQ7XG59XG5cbmNvbnN0IENPTF9FTEVNRU5UX0lOTkVSX1RFWFRfUkVHRVhfU1RSUzogc3RyaW5nW10gPSBbXCI9ICpjb2x1bW4tZW5kICo9XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI9ICplbmQtY29sdW1uICo9XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI9ICpjb2x1bW4tYnJlYWsgKj1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj0gKmJyZWFrLWNvbHVtbiAqPVwiXVxuY29uc3QgQ09MX0VMRU1FTlRfSU5ORVJfVEVYVF9SRUdFWF9BUlI6IFJlZ0V4cFtdID0gW107XG5mb3IobGV0IGkgPSAwOyBpIDwgQ09MX0VMRU1FTlRfSU5ORVJfVEVYVF9SRUdFWF9TVFJTLmxlbmd0aDsgaSsrKSB7XG4gICAgQ09MX1JFR0VYX0FSUi5wdXNoKG5ldyBSZWdFeHAoQ09MX0VMRU1FTlRfSU5ORVJfVEVYVF9SRUdFWF9TVFJTW2ldKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZWxJbm5lclRleHRDb250YWluc0NvbEVuZFRhZyh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGZvcihsZXQgaSA9IDA7IGk8IENPTF9SRUdFWF9BUlIubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICBpZihDT0xfUkVHRVhfQVJSW2ldLnRlc3QodGV4dCkpIHtcbiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kO1xufVxuXG5jb25zdCBDT0xfU0VUVElOR1NfUkVHRVhfU1RSUyA9IFtcImBgYHNldHRpbmdzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImBgYGNvbHVtbi1zZXR0aW5nc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJgYGBtdWx0aS1jb2x1bW4tc2V0dGluZ3NcIl07XG5jb25zdCBDT0xfU0VUVElOR1NfUkVHRVhfQVJSOiBSZWdFeHBbXSA9IFtdO1xuZm9yKGxldCBpID0gMDsgaSA8IENPTF9TRVRUSU5HU19SRUdFWF9TVFJTLmxlbmd0aDsgaSsrKSB7XG4gICAgQ09MX1NFVFRJTkdTX1JFR0VYX0FSUi5wdXNoKG5ldyBSZWdFeHAoQ09MX1NFVFRJTkdTX1JFR0VYX1NUUlNbaV0pKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluc0NvbFNldHRpbmdzVGFnKHRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgZm9yKGxldCBpID0gMDsgaTwgQ09MX1NFVFRJTkdTX1JFR0VYX0FSUi5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIGlmKENPTF9TRVRUSU5HU19SRUdFWF9BUlJbaV0udGVzdCh0ZXh0KSkge1xuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZm91bmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2V0dGluZ3NDb2RlYmxvY2sodGV4dDogc3RyaW5nKTogeyBmb3VuZDogYm9vbGVhbiwgc3RhcnRQb3NpdGlvbjogbnVtYmVyLCBlbmRQb3NpdGlvbjogbnVtYmVyLCBtYXRjaExlbmd0aDogbnVtYmVyIH0ge1xuXG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0UG9zaXRpb24gPSAtMTtcbiAgICBsZXQgZW5kUG9zaXRpb24gPSAtMVxuICAgIGxldCBtYXRjaExlbmd0aCA9IDA7XG4gICAgZm9yKGxldCBpID0gMDsgaTwgQ09MX1NFVFRJTkdTX1JFR0VYX0FSUi5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIGxldCByZWdleERhdGEgPSBDT0xfU0VUVElOR1NfUkVHRVhfQVJSW2ldLmV4ZWModGV4dClcbiAgICAgICAgaWYocmVnZXhEYXRhICE9PSBudWxsICYmIHJlZ2V4RGF0YS5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24gPSByZWdleERhdGEuaW5kZXhcbiAgICAgICAgICAgIG1hdGNoTGVuZ3RoID0gcmVnZXhEYXRhWzBdLmxlbmd0aDtcbiAgICAgICAgICAgIGVuZFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbiArIG1hdGNoTGVuZ3RoO1xuXG4gICAgICAgICAgICBsZXQgcmVtYWluaW5nVGV4dCA9IHRleHQuc2xpY2UoZW5kUG9zaXRpb24pXG4gICAgICAgICAgICByZWdleERhdGEgPSBDT0RFQkxPQ0tfRU5EX1JFR0VYLmV4ZWMocmVtYWluaW5nVGV4dClcbiAgICAgICAgICAgIGlmKHJlZ2V4RGF0YSAhPT0gbnVsbCAmJiByZWdleERhdGEubGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGVuZFBvc2l0aW9uICs9IHJlZ2V4RGF0YS5pbmRleCArIHJlZ2V4RGF0YVswXS5sZW5ndGggXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGZvdW5kLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwgbWF0Y2hMZW5ndGggfTtcbn1cblxuY29uc3QgU1RBUlRfQ09ERUJMT0NLX1JFR0VYX0FSUjogUmVnRXhwW10gPSBbXG5cImBgYG11bHRpLWNvbHVtbi1zdGFydFwiLFxuXCJgYGBzdGFydC1tdWx0aS1jb2x1bW5cIlxuXS5tYXAoKHZhbCkgPT4ge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKHZhbCk7XG59KVxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTdGFydENvZGVibG9jayh0ZXh0OiBzdHJpbmcpOiB7IGZvdW5kOiBib29sZWFuLCBzdGFydFBvc2l0aW9uOiBudW1iZXIsIGVuZFBvc2l0aW9uOiBudW1iZXIsIG1hdGNoTGVuZ3RoOiBudW1iZXIgfSB7XG5cbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICBsZXQgc3RhcnRQb3NpdGlvbiA9IC0xO1xuICAgIGxldCBlbmRQb3NpdGlvbiA9IC0xXG4gICAgbGV0IG1hdGNoTGVuZ3RoID0gMDtcbiAgICBmb3IobGV0IGkgPSAwOyBpPCBTVEFSVF9DT0RFQkxPQ0tfUkVHRVhfQVJSLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgbGV0IHJlZ2V4RGF0YSA9IFNUQVJUX0NPREVCTE9DS19SRUdFWF9BUlJbaV0uZXhlYyh0ZXh0KVxuICAgICAgICBpZihyZWdleERhdGEgIT09IG51bGwgJiYgcmVnZXhEYXRhLmxlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IHJlZ2V4RGF0YS5pbmRleFxuICAgICAgICAgICAgbWF0Y2hMZW5ndGggPSByZWdleERhdGFbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgZW5kUG9zaXRpb24gPSBzdGFydFBvc2l0aW9uICsgbWF0Y2hMZW5ndGg7XG5cbiAgICAgICAgICAgIGxldCByZW1haW5pbmdUZXh0ID0gdGV4dC5zbGljZShlbmRQb3NpdGlvbilcbiAgICAgICAgICAgIHJlZ2V4RGF0YSA9IENPREVCTE9DS19FTkRfUkVHRVguZXhlYyhyZW1haW5pbmdUZXh0KVxuICAgICAgICAgICAgaWYocmVnZXhEYXRhICE9PSBudWxsICYmIHJlZ2V4RGF0YS5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZW5kUG9zaXRpb24gKz0gcmVnZXhEYXRhLmluZGV4ICsgcmVnZXhEYXRhWzBdLmxlbmd0aCBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBmb3VuZCwgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24sIG1hdGNoTGVuZ3RoIH07XG59XG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnNTdGFydENvZGVCbG9jayh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmluZFN0YXJ0Q29kZWJsb2NrKHRleHQpLmZvdW5kXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluc1JlZ2lvblN0YXJ0KHRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb250YWluc1N0YXJ0Q29kZUJsb2NrKHRleHQpIHx8IGNvbnRhaW5zU3RhcnRUYWcodGV4dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3VudFN0YXJ0VGFncyhpbml0aWFsVGV4dDogc3RyaW5nKTogeyBudW1iZXJPZlRhZ3M6IG51bWJlciwga2V5czogc3RyaW5nW10gfSB7XG5cbiAgICBsZXQga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgdGV4dCA9IGluaXRpYWxUZXh0XG4gICAgbGV0IHN0YXJ0VGFnRGF0YSA9IGZpbmRTdGFydFRhZyh0ZXh0KTtcbiAgICB3aGlsZShzdGFydFRhZ0RhdGEuZm91bmQpIHtcbiAgICAgICAgXG4gICAgICAgIC8vIFNsaWNlIG9mZiBldmVyeXRoaW5nIGJlZm9yZSB0aGUgdGFnXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKHN0YXJ0VGFnRGF0YS5zdGFydFBvc2l0aW9uKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGp1c3QgdGhlIHN0YXJ0IHRhZyBsaW5lIGFuZCB0aGVuIHNldCB0ZXh0IHRvIGV2ZXJ5dGhpbmcganVzdFxuICAgICAgICAgKiBhZnRlciB0aGUgc3RhcnQgdGFnLlxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHRhZyA9IHRleHQuc3BsaXQoXCJcXG5cIilbMF07XG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDEpOyAvLyBUaGlzIG1vdmVzIHRoZSB0ZXh0IDEgY2hhcmFjdGVyIHNvIHdlIGRvbnQgbWF0Y2ggdGhlIHNhbWUgdGFnLlxuXG4gICAgICAgIC8vIFBhcnNlIG91dCB0aGUga2V5IGFuZCBhcHBlbmQgdG8gdGhlIGxpc3QuXG4gICAgICAgIGxldCBrZXkgPSBnZXRTdGFydFRhZ0tleSh0YWcpO1xuICAgICAgICBpZihrZXkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGtleSA9IFwiXCJcbiAgICAgICAgfVxuICAgICAgICBrZXlzLnB1c2goa2V5KTtcblxuICAgICAgICAvLyBTZWFyY2ggYWdhaW4gZm9yIGFub3RoZXIgdGFnIGJlZm9yZSBsb29waW5nLlxuICAgICAgICBzdGFydFRhZ0RhdGEgPSBmaW5kU3RhcnRUYWcodGV4dCk7XG4gICAgfVxuXG4gICAgdGV4dCA9IGluaXRpYWxUZXh0O1xuICAgIHN0YXJ0VGFnRGF0YSA9IGZpbmRTdGFydENvZGVibG9jayh0ZXh0KTtcbiAgICB3aGlsZShzdGFydFRhZ0RhdGEuZm91bmQpIHtcbiAgICAgICAgXG4gICAgICAgIGxldCBzZXR0aW5nc1RleHQgPSB0ZXh0LnNsaWNlKHN0YXJ0VGFnRGF0YS5zdGFydFBvc2l0aW9uLCBzdGFydFRhZ0RhdGEuZW5kUG9zaXRpb24pO1xuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZShzdGFydFRhZ0RhdGEuZW5kUG9zaXRpb24pO1xuXG4gICAgICAgIGxldCBrZXkgPSBwYXJzZVN0YXJ0UmVnaW9uQ29kZUJsb2NrSUQoc2V0dGluZ3NUZXh0KTtcbiAgICAgICAgaWYoa2V5ID09PSBudWxsKSB7XG4gICAgICAgICAgICBrZXkgPSBcIlwiXG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG5cbiAgICAgICAgLy8gU2VhcmNoIGFnYWluIGZvciBhbm90aGVyIHRhZyBiZWZvcmUgbG9vcGluZy5cbiAgICAgICAgc3RhcnRUYWdEYXRhID0gZmluZFN0YXJ0Q29kZWJsb2NrKHRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IG51bWJlck9mVGFnczoga2V5cy5sZW5ndGgsIGtleXMgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXJ0QmxvY2tPckNvZGVibG9ja0Fib3ZlTGluZShsaW5lc0Fib3ZlQXJyYXk6IHN0cmluZ1tdKTogeyBcbnN0YXJ0QmxvY2tLZXk6IHN0cmluZywgXG5saW5lc0Fib3ZlQXJyYXk6IHN0cmluZ1tdIH0gfCBudWxsIHtcblxuICAgIGxldCBzdGFydEJsb2NrID0gZ2V0U3RhcnRCbG9ja0Fib3ZlTGluZShsaW5lc0Fib3ZlQXJyYXkpO1xuICAgIGlmKHN0YXJ0QmxvY2sgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN0YXJ0QmxvY2s7XG4gICAgfVxuXG4gICAgbGV0IGNvZGVCbG9jayA9IGdldFN0YXJ0Q29kZUJsb2NrQWJvdmVMaW5lKGxpbmVzQWJvdmVBcnJheSlcbiAgICBpZihjb2RlQmxvY2sgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGNvZGVCbG9jaztcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZmlsdGVyIGEgc2V0IG9mIHN0cmluZ3MsIHJldHVybmluZyBhbGwgaXRlbXMgc3RhcnRpbmdcbiAqIGZyb20gdGhlIGNsb3Nlc3Qgb3BlbiBzdGFydCB0YWcgdGhyb3VnaCB0aGUgbGFzdCBpdGVtIGluIHRoZSBzZXQuIFxuICogXG4gKiBUaGUgZnVuY3Rpb24gZmlsdGVycyBvdXQgYWxsIGVuZCB0YWdzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzdGFydCB0YWcgd2UgXG4gKiBmaW5kIGlzIHRoZSBwcm9wZXIgc3RhcnQgdGFnIGZvciB0aGUgbGlzdCBzZW50LiBcbiAqIEBwYXJhbSBsaW5lc0Fib3ZlQXJyYXkgXG4gKiBAcmV0dXJucyBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXJ0QmxvY2tBYm92ZUxpbmUobGluZXNBYm92ZUFycmF5OiBzdHJpbmdbXSk6IHsgc3RhcnRCbG9ja0tleTogc3RyaW5nLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNBYm92ZUFycmF5OiBzdHJpbmdbXSB9IHwgbnVsbCB7XG5cbiAgICAvLyBSZWR1Y2UgdGhlIGFycmF5IGRvd24gaW50byBhIHNpbmdsZSBzdHJpbmcgc28gdGhhdCB3ZSBjYW5cbiAgICAvLyBlYXNpbHkgUmVnRXggb3ZlciB0aGUgc3RyaW5nIGFuZCBmaW5kIHRoZSBpbmRpY2llcyB3ZSdyZSBsb29raW5nIGZvci5cbiAgICBsZXQgbGluZXNBYm92ZVN0ciA9IGxpbmVzQWJvdmVBcnJheS5yZWR1Y2UoKHByZXYsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgcmV0dXJuIHByZXYgKyBcIlxcblwiICArIGN1cnJlbnQ7XG4gICAgfSwgXCJcIik7XG5cbiAgICAvKlxuICAgICAgICAqIEZpcnN0IHRoaW5nIHdlIG5lZWQgdG8gZG8gaXMgY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBlbmQgdGFncyBpbiB0aGVcbiAgICAgICAgKiBzZXQgb2Ygc3RyaW5ncyAod2hpY2ggbG9naWNhbGx5IHdvdWxkIGNsb3NlIHN0YXJ0IHRhZ3MgYW5kIHRoZXJlZm9yZVxuICAgICAgICAqIHRoZSBzdGFydCB0YWcgaXQgY2xvc2VzIGlzIG5vdCB3aGF0IHdlIHdhbnQpLiBJZiB0aGVyZSBhcmUgd2Ugd2FudCB0byBcbiAgICAgICAgKiBzbG93bHkgbmFycm93IGRvd24gb3VyIHNldCBvZiBzdHJpbmdzIHVudGlsIHRoZSBsYXN0IGVuZCB0YWcgaXMgXG4gICAgICAgICogcmVtb3ZlZC4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gZmluZCB0aGUgY2xvc2VzdCBvcGVuIHN0YXJ0IHRhZyBcbiAgICAgICAgKiBpbiB0aGUgZGF0YS5cbiAgICAgICAgKi9cbiAgICBsZXQgZW5kVGFnU2VyYWNoRGF0YSA9IGZpbmRFbmRUYWcobGluZXNBYm92ZVN0cik7XG4gICAgd2hpbGUoZW5kVGFnU2VyYWNoRGF0YS5mb3VuZCA9PT0gdHJ1ZSkge1xuXG4gICAgICAgIC8vIEdldCB0aGUgaW5kZXggb2Ygd2hlcmUgdGhlIGZpcnN0IHJlZ2V4IG1hdGNoIGluIHRoZVxuICAgICAgICAvLyBzdHJpbmcgaXMuIHRoZW4gd2Ugc2xpY2UgZnJvbSAwIHRvIGluZGV4IG9mZiBvZiB0aGUgc3RyaW5nXG4gICAgICAgIC8vIHNwbGl0IGl0IGJ5IG5ld2xpbmUsIGN1dCBvZmYgdGhlIGZpcnN0IGxpbmUgKHdoaWNoIGFjdHVhbGx5XG4gICAgICAgIC8vIGNvbnRhaW5zIHRoZSByZWdleCkgdGhlbiByZWR1Y2UgYmFjayBkb3duIHRvIGEgc2luZ2xlIHN0cmluZy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVE9ETzogVGhpcyBjb3VsZCBiZSBzaW1wbGlmaWVkIGlmIHdlIGp1c3Qgc2xpY2UgdGhlIHRleHQgYWZ0ZXJcbiAgICAgICAgLy8gdGhlIGVuZCB0YWcgaW5zdGVhZCBvZiB0aGUgYmVnaW5pbmcuXG4gICAgICAgIGxldCBpbmRleE9mUmVnZXggPSBlbmRUYWdTZXJhY2hEYXRhLnN0YXJ0UG9zaXRpb247XG4gICAgICAgIGxpbmVzQWJvdmVBcnJheSA9IGxpbmVzQWJvdmVTdHIuc2xpY2UoaW5kZXhPZlJlZ2V4KS5zcGxpdChcIlxcblwiKS5zcGxpY2UoMSlcbiAgICAgICAgbGluZXNBYm92ZVN0ciA9IGxpbmVzQWJvdmVBcnJheS5yZWR1Y2UoKHByZXYsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBwcmV2ICsgXCJcXG5cIiAgKyBjdXJyZW50O1xuICAgICAgICB9LCBcIlwiKTtcbiAgICAgICAgZW5kVGFnU2VyYWNoRGF0YSA9IGZpbmRFbmRUYWcobGluZXNBYm92ZVN0cik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm93IHdlIGhhdmUgdGhlIHNldCBvZiBsaW5lcyBhZnRlciBhbGwgb3RoZXIgZW5kIHRhZ3MuIFdlIG5vd1xuICAgICAqIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgc3RpbGwgYSBzdGFydCB0YWcgbGVmdCBpbiB0aGUgZGF0YS4gSWYgXG4gICAgICogdGhlcmUgaXMgbm8gc3RhcnQgdGFnIHRoZW4gd2Ugd2FudCB0byByZXR1cm4gYW4gZW1wdHkgYXJyYXkgYW5kIGVtcHR5IFxuICAgICAqIGtleS5cbiAgICAgKi8gXG4gICAgbGV0IHN0YXJ0QmxvY2tLZXkgPSBcIlwiO1xuICAgIGxldCBzdGFydFRhZ1NlYXJjaERhdGEgPSBmaW5kU3RhcnRUYWcobGluZXNBYm92ZVN0cik7XG4gICAgaWYoc3RhcnRUYWdTZWFyY2hEYXRhLmZvdW5kID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdyB3ZSBrbm93IHRoZXJlIGlzIGF0IGxlYXN0IDEgc3RhcnQga2V5IGxlZnQsIGhvd2V2ZXIgdGhlcmVcbiAgICAgICAgICogbWF5IGJlIG11bHRpcGxlIHN0YXJ0IGtleXMgaWYgdGhlIHVzZXIgaXMgbm90IGNsb3NpbmcgdGhlaXJcbiAgICAgICAgICogYmxvY2tzLiBXZSBjdXJyZW50bHkgZG9udCBhbGxvdyByZWN1c2l2ZSBzcGxpdHRpbmcgc28gd2UgXG4gICAgICAgICAqIHdhbnQgdG8gZ2V0IHRoZSBsYXN0IGtleSBpbiBvdXIgcmVtYWluaW5nIHNldC4gU2FtZSBpZGVhIGFzXG4gICAgICAgICAqIGFib3ZlLlxuICAgICAgICAgKi9cbiAgICAgICAgd2hpbGUoc3RhcnRUYWdTZWFyY2hEYXRhLmZvdW5kID09PSB0cnVlKSB7XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgaW5kZXggb2Ygd2hlcmUgdGhlIGZpcnN0IHJlZ2V4IG1hdGNoIGluIHRoZVxuICAgICAgICAgICAgLy8gc3RyaW5nIGlzLiB0aGVuIHdlIHNsaWNlIGZyb20gMCB0byBpbmRleCBvZmYgb2YgdGhlIHN0cmluZ1xuICAgICAgICAgICAgLy8gc3BsaXQgaXQgYnkgbmV3bGluZSwgY3V0IG9mZiB0aGUgZmlyc3QgbGluZSAod2hpY2ggYWN0dWFsbHlcbiAgICAgICAgICAgIC8vIGNvbnRhaW5zIHRoZSByZWdleCkgdGhlbiByZWR1Y2UgYmFjayBkb3duIHRvIGEgc2luZ2xlIHN0cmluZy5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUT0RPOiBUaGlzIGNvdWxkIGJlIHNpbXBsaWZpZWQgaWYgd2UganVzdCBzbGljZSB0aGUgdGV4dCBhZnRlclxuICAgICAgICAgICAgLy8gdGhlIGVuZCB0YWcgaW5zdGVhZCBvZiB0aGUgYmVnaW5pbmcuXG4gICAgICAgICAgICBsZXQgc3RhcnRJbmRleCA9IHN0YXJ0VGFnU2VhcmNoRGF0YS5zdGFydFBvc2l0aW9uO1xuXG4gICAgICAgICAgICBsaW5lc0Fib3ZlQXJyYXkgPSBsaW5lc0Fib3ZlU3RyLnNsaWNlKHN0YXJ0SW5kZXgpLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBzdGFydFRhZyA9IGxpbmVzQWJvdmVBcnJheVswXTtcbiAgICAgICAgICAgIGxldCBrZXkgPSBnZXRTdGFydFRhZ0tleShzdGFydFRhZyk7XG4gICAgICAgICAgICBpZihrZXkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzdGFydEJsb2NrS2V5ID0ga2V5O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lc0Fib3ZlQXJyYXkgPSBsaW5lc0Fib3ZlQXJyYXkuc3BsaWNlKDEpXG4gICAgICAgICAgICBsaW5lc0Fib3ZlU3RyID0gbGluZXNBYm92ZUFycmF5LnJlZHVjZSgocHJldiwgY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2ICsgXCJcXG5cIiAgKyBjdXJyZW50O1xuICAgICAgICAgICAgfSwgXCJcIik7XG5cbiAgICAgICAgICAgIHN0YXJ0VGFnU2VhcmNoRGF0YSA9IGZpbmRTdGFydFRhZyhsaW5lc0Fib3ZlU3RyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmKHN0YXJ0QmxvY2tLZXkgPT09IFwiXCIpIHtcblxuICAgICAgICBsZXQgY29kZUJsb2NrRGF0YSA9IHBhcnNlQ29kZUJsb2NrU3RhcnQobGluZXNBYm92ZUFycmF5KVxuICAgICAgICBpZihjb2RlQmxvY2tEYXRhICE9PSBudWxsKSB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHN0YXJ0QmxvY2tLZXkgPSBjb2RlQmxvY2tEYXRhLmlkO1xuXG4gICAgICAgICAgICBpZihjb2RlQmxvY2tEYXRhLmluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgIGxpbmVzQWJvdmVBcnJheSA9IGxpbmVzQWJvdmVBcnJheS5zbGljZShjb2RlQmxvY2tEYXRhLmluZGV4ICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGFydEJsb2NrS2V5LCBsaW5lc0Fib3ZlQXJyYXkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXJ0Q29kZUJsb2NrQWJvdmVMaW5lKGxpbmVzQWJvdmVBcnJheTogc3RyaW5nW10pOiB7IFxuICAgIHN0YXJ0QmxvY2tLZXk6IHN0cmluZywgXG4gICAgbGluZXNBYm92ZUFycmF5OiBzdHJpbmdbXSB9IHwgbnVsbCB7XG4gICAgXG4gICAgbGV0IGxpbmVzQWJvdmVTdHIgPSBsaW5lc0Fib3ZlQXJyYXkucmVkdWNlKChwcmV2LCBjdXJyZW50KSA9PiB7XG4gICAgICAgIHJldHVybiBwcmV2ICsgXCJcXG5cIiAgKyBjdXJyZW50O1xuICAgIH0sIFwiXCIpO1xuXG4gICAgLypcbiAgICAgKiBGaXJzdCB0aGluZyB3ZSBuZWVkIHRvIGRvIGlzIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgZW5kIHRhZ3MgaW4gdGhlXG4gICAgICogc2V0IG9mIHN0cmluZ3MgKHdoaWNoIGxvZ2ljYWxseSB3b3VsZCBjbG9zZSBzdGFydCB0YWdzIGFuZCB0aGVyZWZvcmVcbiAgICAgKiB0aGUgc3RhcnQgdGFnIGl0IGNsb3NlcyBpcyBub3Qgd2hhdCB3ZSB3YW50KS4gSWYgdGhlcmUgYXJlIHdlIHdhbnQgdG8gXG4gICAgICogc2xvd2x5IG5hcnJvdyBkb3duIG91ciBzZXQgb2Ygc3RyaW5ncyB1bnRpbCB0aGUgbGFzdCBlbmQgdGFnIGlzIFxuICAgICAqIHJlbW92ZWQuIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGZpbmQgdGhlIGNsb3Nlc3Qgb3BlbiBzdGFydCB0YWcgXG4gICAgICogaW4gdGhlIGRhdGEuXG4gICAgICovXG4gICAgbGV0IGVuZFRhZ1NlcmFjaERhdGEgPSBmaW5kRW5kVGFnKGxpbmVzQWJvdmVTdHIpO1xuICAgIHdoaWxlKGVuZFRhZ1NlcmFjaERhdGEuZm91bmQgPT09IHRydWUpIHtcblxuICAgICAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHdoZXJlIHRoZSBmaXJzdCByZWdleCBtYXRjaCBpbiB0aGVcbiAgICAgICAgLy8gc3RyaW5nIGlzLiB0aGVuIHdlIHNsaWNlIGZyb20gMCB0byBpbmRleCBvZmYgb2YgdGhlIHN0cmluZ1xuICAgICAgICAvLyBzcGxpdCBpdCBieSBuZXdsaW5lLCBjdXQgb2ZmIHRoZSBmaXJzdCBsaW5lICh3aGljaCBhY3R1YWxseVxuICAgICAgICAvLyBjb250YWlucyB0aGUgcmVnZXgpIHRoZW4gcmVkdWNlIGJhY2sgZG93biB0byBhIHNpbmdsZSBzdHJpbmcuXG4gICAgICAgIGxpbmVzQWJvdmVTdHIgPSBsaW5lc0Fib3ZlU3RyLnNsaWNlKGVuZFRhZ1NlcmFjaERhdGEuZW5kUG9zaXRpb24pO1xuICAgICAgICBlbmRUYWdTZXJhY2hEYXRhID0gZmluZEVuZFRhZyhsaW5lc0Fib3ZlU3RyKTtcbiAgICB9XG5cbiAgICBsZXQgc3RhcnRDb2RlQmxvY2tEYXRhID0gZmluZFN0YXJ0Q29kZWJsb2NrKGxpbmVzQWJvdmVTdHIpO1xuICAgIGxldCBjb2RlQmxvY2tUZXh0ID0gbGluZXNBYm92ZVN0ci5zbGljZShzdGFydENvZGVCbG9ja0RhdGEuc3RhcnRQb3NpdGlvbiwgc3RhcnRDb2RlQmxvY2tEYXRhLmVuZFBvc2l0aW9uKVxuXG4gICAgbGV0IHN0YXJ0QmxvY2tLZXkgPSBcIlwiICAgIFxuICAgIGlmKHN0YXJ0Q29kZUJsb2NrRGF0YS5mb3VuZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3cgd2Uga25vdyB0aGVyZSBpcyBhdCBsZWFzdCAxIHN0YXJ0IGtleSBsZWZ0LCBob3dldmVyIHRoZXJlXG4gICAgICAgICAqIG1heSBiZSBtdWx0aXBsZSBzdGFydCBrZXlzIGlmIHRoZSB1c2VyIGlzIG5vdCBjbG9zaW5nIHRoZWlyXG4gICAgICAgICAqIGJsb2Nrcy4gV2UgY3VycmVudGx5IGRvbnQgYWxsb3cgcmVjdXNpdmUgc3BsaXR0aW5nIHNvIHdlIFxuICAgICAgICAgKiB3YW50IHRvIGdldCB0aGUgbGFzdCBrZXkgaW4gb3VyIHJlbWFpbmluZyBzZXQuIFNhbWUgaWRlYSBhc1xuICAgICAgICAgKiBhYm92ZS5cbiAgICAgICAgICovXG4gICAgICAgIHdoaWxlKHN0YXJ0Q29kZUJsb2NrRGF0YS5mb3VuZCA9PT0gdHJ1ZSkge1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHdoZXJlIHRoZSBmaXJzdCByZWdleCBtYXRjaCBpbiB0aGVcbiAgICAgICAgICAgIC8vIHN0cmluZyBpcy4gdGhlbiB3ZSBzbGljZSBmcm9tIDAgdG8gaW5kZXggb2ZmIG9mIHRoZSBzdHJpbmdcbiAgICAgICAgICAgIC8vIHNwbGl0IGl0IGJ5IG5ld2xpbmUsIGN1dCBvZmYgdGhlIGZpcnN0IGxpbmUgKHdoaWNoIGFjdHVhbGx5XG4gICAgICAgICAgICAvLyBjb250YWlucyB0aGUgcmVnZXgpIHRoZW4gcmVkdWNlIGJhY2sgZG93biB0byBhIHNpbmdsZSBzdHJpbmcuXG5cbiAgICAgICAgICAgIGNvZGVCbG9ja1RleHQgPSBsaW5lc0Fib3ZlU3RyLnNsaWNlKHN0YXJ0Q29kZUJsb2NrRGF0YS5zdGFydFBvc2l0aW9uLCBzdGFydENvZGVCbG9ja0RhdGEuZW5kUG9zaXRpb24pXG4gICAgICAgICAgICBzdGFydEJsb2NrS2V5ID0gcGFyc2VTdGFydFJlZ2lvbkNvZGVCbG9ja0lEKGNvZGVCbG9ja1RleHQpXG5cbiAgICAgICAgICAgIGxpbmVzQWJvdmVTdHIgPSBsaW5lc0Fib3ZlU3RyLnNsaWNlKHN0YXJ0Q29kZUJsb2NrRGF0YS5lbmRQb3NpdGlvbik7XG4gICAgICAgICAgICBzdGFydENvZGVCbG9ja0RhdGEgPSBmaW5kU3RhcnRDb2RlYmxvY2sobGluZXNBYm92ZVN0cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmV0TGluZXNBYm92ZUFycmF5ID0gbGluZXNBYm92ZVN0ci5zcGxpdChcIlxcblwiKTtcbiAgICByZXR1cm4geyBzdGFydEJsb2NrS2V5LCBsaW5lc0Fib3ZlQXJyYXk6IHJldExpbmVzQWJvdmVBcnJheSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW5kQmxvY2tCZWxvdyhsaW5lc0JlbG93OiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcblxuICAgIC8vIFJlZHVjZSB0aGUgYXJyYXkgZG93biBpbnRvIGEgc2luZ2xlIHN0cmluZyBzbyB0aGF0IHdlIGNhblxuICAgIC8vIGVhc2lseSBSZWdFeCBvdmVyIHRoZSBzdHJpbmcgYW5kIGZpbmQgdGhlIGluZGljaWVzIHdlJ3JlIGxvb2tpbmcgZm9yLlxuICAgIGxldCBsaW5lc0JlbG93U3RyID0gbGluZXNCZWxvdy5yZWR1Y2UoKHByZXYsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgcmV0dXJuIHByZXYgKyBcIlxcblwiICArIGN1cnJlbnQ7XG4gICAgfSwgXCJcIik7XG4gICAgbGV0IGVuZFRhZ1NlcmFjaERhdGEgPSBmaW5kRW5kVGFnKGxpbmVzQmVsb3dTdHIpO1xuICAgIGxldCBzdGFydFRhZ1NlYXJjaERhdGEgPSBmaW5kU3RhcnRUYWcobGluZXNCZWxvd1N0cik7XG5cbiAgICBsZXQgc2xpY2VFbmRJbmRleCA9IC0xOyAvLyBJZiBuZWl0aGVyIHN0YXJ0IG9yIGVuZCBmb3VuZCB3ZSByZXR1cm4gdGhlIGVudGlyZSBhcnJheS5cbiAgICBpZihlbmRUYWdTZXJhY2hEYXRhLmZvdW5kID09PSB0cnVlICYmIHN0YXJ0VGFnU2VhcmNoRGF0YS5mb3VuZCA9PT0gZmFsc2UpIHtcblxuICAgICAgICBzbGljZUVuZEluZGV4ID0gZW5kVGFnU2VyYWNoRGF0YS5zdGFydFBvc2l0aW9uO1xuICAgIH1cbiAgICBlbHNlIGlmKGVuZFRhZ1NlcmFjaERhdGEuZm91bmQgPT09IGZhbHNlICYmIHN0YXJ0VGFnU2VhcmNoRGF0YS5mb3VuZCA9PT0gdHJ1ZSkge1xuXG4gICAgICAgIHNsaWNlRW5kSW5kZXggPSBzdGFydFRhZ1NlYXJjaERhdGEuc3RhcnRQb3NpdGlvbjtcbiAgICB9XG4gICAgZWxzZSBpZihlbmRUYWdTZXJhY2hEYXRhLmZvdW5kID09PSB0cnVlICYmIHN0YXJ0VGFnU2VhcmNoRGF0YS5mb3VuZCA9PT0gdHJ1ZSkge1xuXG4gICAgICAgIHNsaWNlRW5kSW5kZXggPSBlbmRUYWdTZXJhY2hEYXRhLnN0YXJ0UG9zaXRpb247XG4gICAgICAgIGlmKHN0YXJ0VGFnU2VhcmNoRGF0YS5zdGFydFBvc2l0aW9uIDwgZW5kVGFnU2VyYWNoRGF0YS5zdGFydFBvc2l0aW9uKSB7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSWYgd2UgZm91bmQgYSBzdGFydCB0YWcgYmVmb3JlIGFuIGVuZCB0YWcgd2Ugd2FudCB0byB1c2UgdGhlIHN0YXJ0IHRhZ1xuICAgICAgICAgICAgICogb3VyIGN1cnJlbnQgYmxvY2sgaXMgbm90IHByb3Blcmx5IGVuZGVkIGFuZCB3ZSB1c2UgdGhlIG5leHQgc3RhcnQgdGFnIFxuICAgICAgICAgICAgICogYXMgb3VyIGxpbWl0XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHNsaWNlRW5kSW5kZXggPSBzdGFydFRhZ1NlYXJjaERhdGEuc3RhcnRQb3NpdGlvbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsaW5lc0JlbG93LnNsaWNlKDAsIHNsaWNlRW5kSW5kZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhcnRUYWdLZXkoc3RhcnRUYWc6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuXG4gICAgbGV0IGtleVNwbGl0ID0gc3RhcnRUYWcuc3BsaXQoXCI6XCIpO1xuICAgIGlmKGtleVNwbGl0Lmxlbmd0aCA+IDEpe1xuICAgICAgICByZXR1cm4ga2V5U3BsaXRbMV0ucmVwbGFjZShcIiBcIiwgXCJcIilcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuXG5jb25zdCBUQUJfSEVBREVSX0VORF9SRUdFWF9TVFIgPSBcIl5gYGAkXCI7XG5jb25zdCBUQUJfSEVBREVSX0VORF9SRUdFWDogUmVnRXhwID0gbmV3IFJlZ0V4cChUQUJfSEVBREVSX0VORF9SRUdFWF9TVFIpO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29kZUJsb2NrU3RhcnQoY29kZUJsb2NrTGluZXM6IHN0cmluZ1tdKTogeyBpZDogc3RyaW5nLCBpbmRleDogbnVtYmVyfSB8IG51bGwge1xuXG4gICAgbGV0IGlkID0gbnVsbDtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgY29kZUJsb2NrTGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGxpbmUgPSBjb2RlQmxvY2tMaW5lc1tpXTtcblxuICAgICAgICBpZihpZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGtleSA9IGxpbmUuc3BsaXQoXCI6XCIpWzBdO1xuICAgICAgICAgICAgaWYoa2V5LnRvTG93ZXJDYXNlKCkgPT09IFwicmVnaW9uIGlkXCIpIHtcbiAgICAgICAgICAgICAgICBpZCA9IGxpbmUuc3BsaXQoXCI6XCIpWzFdLnRyaW0oKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYoVEFCX0hFQURFUl9FTkRfUkVHRVgudGVzdChsaW5lKSkge1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgaWQ6IGlkLCBpbmRleDogaSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYoaWQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4geyBpZDogaWQsIGluZGV4OiAtMSB9XG4gICAgfVxufVxuY29uc3QgQ09ERUJMT0NLX0VORF9SRUdFWF9TVFIgPSBcImBgYFwiO1xuY29uc3QgQ09ERUJMT0NLX0VORF9SRUdFWDogUmVnRXhwID0gbmV3IFJlZ0V4cChDT0RFQkxPQ0tfRU5EX1JFR0VYX1NUUik7XG5leHBvcnQgZnVuY3Rpb24gZmluZEVuZE9mQ29kZUJsb2NrKHRleHQ6IHN0cmluZyk6IHsgZm91bmQ6IGJvb2xlYW4sIHN0YXJ0UG9zaXRpb246IG51bWJlciwgZW5kUG9zaXRpb246IG51bWJlciwgbWF0Y2hMZW5ndGg6IG51bWJlciB9IHtcblxuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGxldCBzdGFydFBvc2l0aW9uID0gLTE7XG4gICAgbGV0IG1hdGNoTGVuZ3RoID0gMDtcbiAgICBsZXQgZW5kUG9zaXRpb24gPSAtMTtcblxuICAgIGxldCByZWdleERhdGEgPSBDT0RFQkxPQ0tfRU5EX1JFR0VYLmV4ZWModGV4dClcbiAgICBpZihyZWdleERhdGEgIT09IG51bGwgJiYgcmVnZXhEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICBzdGFydFBvc2l0aW9uID0gcmVnZXhEYXRhLmluZGV4XG4gICAgICAgIG1hdGNoTGVuZ3RoID0gcmVnZXhEYXRhWzBdLmxlbmd0aFxuICAgIH1cbiAgICBlbmRQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb24gKyBtYXRjaExlbmd0aDtcblxuICAgIHJldHVybiB7IGZvdW5kLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwgbWF0Y2hMZW5ndGggfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29kZUJsb2NrU2V0dGluZ3MoY29kZUJsb2NrTGluZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcblxuICAgIGxldCBzZXR0aW5nc0xpbmVzID0gW107XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGNvZGVCbG9ja0xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBsaW5lID0gY29kZUJsb2NrTGluZXNbaV07XG5cbiAgICAgICAgbGV0IGtleSA9IGxpbmUuc3BsaXQoXCI6XCIpWzBdO1xuICAgICAgICBpZihrZXkudG9Mb3dlckNhc2UoKSAhPT0gXCJyZWdpb24gaWRcIikge1xuICAgICAgICAgICAgc2V0dGluZ3NMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldHRpbmdzTGluZXMuam9pbihcIlxcblwiKTtcbn0iLCIvKlxuICogRmlsZW5hbWU6IG11bHRpLWNvbHVtbi1tYXJrZG93bi9zcmMvdXRpbGl0aWVzL3V0aWxzLnRzXG4gKiBDcmVhdGVkIERhdGU6IFR1ZXNkYXksIEphbnVhcnkgMzB0aCAyMDIyLCA0OjAyOjE5IHBtXG4gKiBBdXRob3I6IENhbWVyb24gUm9iaW5zb25cbiAqIFxuICogQ29weXJpZ2h0IChjKSAyMDIyIENhbWVyb24gUm9iaW5zb25cbiAqL1xuXG5pbXBvcnQgeyBXb3Jrc3BhY2VMZWFmIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVSUQobGVuZ3RoOiBudW1iZXIgPSAxMCk6IHN0cmluZyB7XG5cbiAgICBpZihsZW5ndGggPiAxMCkge1xuICAgICAgICBsZW5ndGggPSAxMDtcbiAgICB9XG4gICAgbGV0IFVJRCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyKTtcbiAgICBVSUQgPSBVSUQuc2xpY2UoMCwgbGVuZ3RoKTtcbiAgICBcbiAgICByZXR1cm4gVUlEO1xufVxuXG4vKipcbiAqIEJGUyBvbiB0aGUgY2hpbGQgbm9kZXMgb2YgdGhlIHBhc3NlZCBlbGVtZW50IHNlYXJjaGluZyBmb3IgdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZVxuICogbm9kZSB0eXBlIHBhc3NlZC4gUmV0dXJuaW5nIHRoZSBlbGVtZW50IGZvdW5kIG9yIG51bGwgaWYgbm9uZSBmb3VuZC5cbiAqIFxuICogQHBhcmFtIHJvb3QgXG4gKiBAcGFyYW0gbm9kZVR5cGVOYW1lXG4gKiBAcmV0dXJucyBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaENoaWxkcmVuRm9yTm9kZVR5cGUocm9vdDogSFRNTEVsZW1lbnQsIG5vZGVUeXBlTmFtZTogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcblxuICAgIG5vZGVUeXBlTmFtZSA9IG5vZGVUeXBlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIFxuICAgIGxldCBxdWV1ZTogSFRNTEVsZW1lbnRbXSA9IFtyb290XVxuICAgIHdoaWxlKHF1ZXVlLmxlbmd0aCA+IDApe1xuICAgICAgICBcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBub2RlID0gcXVldWUuc2hpZnQoKVxuXG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIGlmKG5vZGVOYW1lID09PSBub2RlVHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKG5vZGUuY2hpbGRyZW5baV0gYXMgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVTb3VyY2VNb2RlKHNvdXJjZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cbiAgICBsZXQgZmlsZUxlYWYgPSBnZXRGaWxlTGVhZihzb3VyY2VQYXRoKTtcbiAgICBpZihmaWxlTGVhZiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGVMZWFmLmdldFZpZXdTdGF0ZSgpLnN0YXRlLm1vZGU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TGVhZlNvdXJjZU1vZGUoZmlsZUxlYWY6IFdvcmtzcGFjZUxlYWYpOiBzdHJpbmcge1xuXG4gICAgcmV0dXJuIGZpbGVMZWFmLmdldFZpZXdTdGF0ZSgpLnN0YXRlLm1vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWxlU3RpbGxJblZpZXcoc291cmNlUGF0aDogc3RyaW5nKTpib29sZWFuIHtcblxuICAgIGxldCBmaWxlTGVhZiA9IGdldEZpbGVMZWFmKHNvdXJjZVBhdGgpO1xuICAgIGlmKGZpbGVMZWFmID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlTGVhZihzb3VyY2VQYXRoOiBzdHJpbmcpOiBXb3Jrc3BhY2VMZWFmIHwgbnVsbCB7XG5cbiAgICBsZXQgbWFya2Rvd25MZWF2ZXMgPSBhcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShcIm1hcmtkb3duXCIpO1xuICAgIGlmKG1hcmtkb3duTGVhdmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgbWFya2Rvd25MZWF2ZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICBpZihtYXJrZG93bkxlYXZlc1tpXS5nZXRWaWV3U3RhdGUoKS5zdGF0ZS5maWxlID09PSBzb3VyY2VQYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFya2Rvd25MZWF2ZXNbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn0iLCJpbXBvcnQgeyBzZWFyY2hDaGlsZHJlbkZvck5vZGVUeXBlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGVudW0gRWxlbWVudFJlbmRlclR5cGUge1xuICAgIHVuZGVmaW5lZCxcbiAgICBub3JtYWxSZW5kZXIsXG4gICAgc3BlY2lhbFJlbmRlcixcbiAgICBzcGVjaWFsU2luZ2xlRWxlbWVudFJlbmRlcixcbiAgICBjYW52YXNSZW5kZXJFbGVtZW50LFxuICAgIHVuUmVuZGVyZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRSZW5kZXJUeXBlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogRWxlbWVudFJlbmRlclR5cGUge1xuXG4gICAgLyoqXG4gICAgICogVGhlIERhdGF2aWV3IHBsdWdpbiBuZWVkcyB0byBiZSBjb25zdGFudGx5IGNoZWNrZWQgaWYgdGhlIGNsb25lIHNob3VsZCBiZVxuICAgICAqIHVwZGF0ZWQgYnV0IHNob3VsZCBub3QgYWx3YXlzIHVwZGF0ZSB0aGUgXCJkdWFsIHJlbmRlclwiIGFzcGVjdCwgc28gd2UgYWRkXG4gICAgICogYSBzcGVjaWFsIGNhc2UgZm9yIHRoYXQgcGx1Z2luIGFuZCBtYXliZSBvdGhlcnMgaW4gdGhlIGZ1dHVyZS5cbiAgICAgKi9cbiAgICBpZihoYXNEYXRhdmlldyhlbGVtZW50KSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gRWxlbWVudFJlbmRlclR5cGUuc3BlY2lhbFNpbmdsZUVsZW1lbnRSZW5kZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU29tZSB0eXBlcyBvZiBjb250ZW50IGFyZSByZW5kZXJlZCBpbiBjYW52YXNlcyB3aGljaCBhcmUgbm90IHJlbmRlcmVkIHByb3Blcmx5XG4gICAgICogd2hlbiB3ZSBjbG9uZSB0aGUgb3JpZ2luYWwgbm9kZS4gSGVyZSB3ZSBhcmUgZmxhZ2dpbmcgdGhlIGVsZW1lbnQgYXMgYSBjYW52YXNcbiAgICAgKiBlbGVtZW50IHNvIHdlIGNhbiBjbG9uZSB0aGUgY2FudmFzIHRvIGEgY29weSBlbGVtZW50IHdpdGhpbiB0aGUgcmVnaW9uLlxuICAgICAqIFxuICAgICAqL1xuICAgIGlmKCBoYXNEYXRhdmlld0pTKGVsZW1lbnQpID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBFbGVtZW50UmVuZGVyVHlwZS5jYW52YXNSZW5kZXJFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvb2sgZm9yIHNwZWNpZmljIGtpbmRzIG9mIGVsZW1lbnRzIGJ5IHRoZWlyIENTUyBjbGFzcyBuYW1lcyBoZXJlLiBUaGVzZSBcbiAgICAgKiBhcmUgZ29pbmcgdG8gYmUgYnJpdHRsZSBsaW5rcyBhcyB0aGV5IHJlbHkgb24gb3RoZXIgcGx1Z2luIGRlZmluaXRpb25zIGJ1dFxuICAgICAqIGFzIHRoaXMgaXMgb25seSBhZGRpbmcgaW4gZXh0cmEgY29tcGF0YWJpbGl0eSB0byB0aGUgcGx1Z2lucyBkZWZpbmVkIGhlcmUgXG4gICAgICogaXQgc2hvdWxkIGJlIG9rLlxuICAgICAqIFxuICAgICAqIFRoZXNlIG1heSBiZSBjbGFzc2VzIG9uIG9uZSBvZiB0aGUgc2ltcGxlIGVsZW1lbnRzIChzdWNoIGFzIGEgcGFyYWdyYXBoKVxuICAgICAqIHRoYXQgd2Ugc2VhcmNoIGZvciBiZWxvdyBzbyBuZWVkIHRvIGxvb2sgZm9yIHRoZXNlIGZpcnN0LlxuICAgICAqL1xuICAgIGlmKGhhc0RpY2VSb2xsZXIoZWxlbWVudCkgPT09IHRydWUgfHxcbiAgICAgICBoYXNDb3B5QnV0dG9uKGVsZW1lbnQpID09PSB0cnVlIHx8XG4gICAgICAgaGFzQWRtb25pdGlvbkZvbGQoZWxlbWVudCkgPT09IHRydWUpIHtcblxuICAgICAgICByZXR1cm4gRWxlbWVudFJlbmRlclR5cGUuc3BlY2lhbFJlbmRlclxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgY2hlY2tzIGZvciBzcGVjaWFsIHR5cGVzIG9mIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkIG5vcm1hbGx5LiBJc1xuICAgICAqIHNsaWdodGx5IHJlZHVuZGFudCB3aXRoIG5leHQgY2hlY2sgYnV0IGRpZmZlcmVudGlhdGVzIGJldHdlZW4gdHlwZXMgb2YgZW1lbnRzIFxuICAgICAqIGJlaW5nIGNoZWNrZWQuXG4gICAgICovXG4gICAgaWYoaGFzQWRtb25pdGlvbihlbGVtZW50KSA9PT0gdHJ1ZSB8fFxuICAgICAgIGlzSUZyYW1lKGVsZW1lbnQpID09PSB0cnVlKSB7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gRWxlbWVudFJlbmRlclR5cGUubm9ybWFsUmVuZGVyXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgd2UgZGlkbnQgZmluZCBhIHNwZWNpYWwgZWxlbWVudCB3ZSB3YW50IHRvIGNoZWNrIGZvciBzaW1wbGUgZWxlbWVudHNcbiAgICAgKiBzdWNoIGFzIHBhcmFncmFwaHMgb3IgbGlzdHMuIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdlIG9ubHkgc2V0IHVwXG4gICAgICogdGhlIHNwZWNpYWwgY2FzZSBmb3IgXCJzcGVjaWFsUmVuZGVyXCIgZWxlbWVudHMgc28gdGhpcyAqc2hvdWxkKiBiZSBzYXZpbmdcbiAgICAgKiBzb21lIHJlbmRlcmluZyB0aW1lIGJ5IHNldHRpbmcgdGhlc2UgdGFncyBwcm9wZXJseS5cbiAgICAgKi9cbiAgICBpZihoYXNQYXJhZ3JhcGgoZWxlbWVudCkgfHwgXG4gICAgICAgaGFzSGVhZGVyKGVsZW1lbnQpICAgIHx8XG4gICAgICAgaGFzTGlzdChlbGVtZW50KSB8fFxuICAgICAgIGlzSG9yaXpvbnRhbFJ1bGUoZWxlbWVudCkgfHxcbiAgICAgICBpc1RhYmxlKGVsZW1lbnQpKSB7XG5cbiAgICAgICAgcmV0dXJuIEVsZW1lbnRSZW5kZXJUeXBlLm5vcm1hbFJlbmRlcjtcbiAgICB9XG5cbiAgICAvLyBJZiBzdGlsbCBub3RoaW5nIGZvdW5kIHdlIHJldHVybiBvdGhlciBhcyB0aGUgZGVmYXVsdCByZXNwb25zZSBpZiBub3RoaW5nIGVsc2UgZm91bmQuXG4gICAgcmV0dXJuIEVsZW1lbnRSZW5kZXJUeXBlLnNwZWNpYWxSZW5kZXI7XG59XG5cbmZ1bmN0aW9uIGhhc1BhcmFncmFwaChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlbGVtZW50LmlubmVySFRNTC5zdGFydHNXaXRoKFwiPHBcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNIZWFkZXIoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcblxuICAgIGlmKGVsZW1lbnQuaW5uZXJIVE1MLnN0YXJ0c1dpdGgoXCI8aDFcIikgfHwgXG4gICAgICAgZWxlbWVudC5pbm5lckhUTUwuc3RhcnRzV2l0aChcIjxoMlwiKSB8fCBcbiAgICAgICBlbGVtZW50LmlubmVySFRNTC5zdGFydHNXaXRoKFwiPGgzXCIpIHx8IFxuICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MLnN0YXJ0c1dpdGgoXCI8aDRcIikgfHxcbiAgICAgICBlbGVtZW50LmlubmVySFRNTC5zdGFydHNXaXRoKFwiPGg1XCIpIHx8XG4gICAgICAgZWxlbWVudC5pbm5lckhUTUwuc3RhcnRzV2l0aChcIjxoNlwiKSkge1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzTGlzdChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIFxuICAgIGlmKGVsZW1lbnQuaW5uZXJIVE1MLnN0YXJ0c1dpdGgoXCI8dWxcIikgfHwgXG4gICAgICAgZWxlbWVudC5pbm5lckhUTUwuc3RhcnRzV2l0aChcIjxvbFwiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGhhc0NvcHlCdXR0b24oZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiY29weS1jb2RlLWJ1dHRvblwiKS5sZW5ndGggIT09IDAgfHwgXG4gICAgICAgICAgICBlbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJhZG1vbml0aW9uLWNvbnRlbnQtY29weVwiKS5sZW5ndGggIT09IDA7XG59XG5cbmZ1bmN0aW9uIGhhc0RpY2VSb2xsZXIoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiZGljZS1yb2xsZXJcIikubGVuZ3RoICE9PSAwO1xufVxuXG5mdW5jdGlvbiBoYXNBZG1vbml0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImFkbW9uaXRpb25cIikubGVuZ3RoICE9PSAwO1xufVxuXG5mdW5jdGlvbiBpc0lGcmFtZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuXG4gICAgaWYoZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZmlyc3RDaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlmcmFtZVwiO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBpc0hvcml6b250YWxSdWxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJIVE1MLnN0YXJ0c1dpdGgoXCI8aHJcIilcbn1cblxuZnVuY3Rpb24gaXNUYWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlbGVtZW50LmlubmVySFRNTC5zdGFydHNXaXRoKFwiPHRhYmxlXCIpXG59XG5cbmZ1bmN0aW9uIGhhc0FkbW9uaXRpb25Gb2xkKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImNhbGxvdXQtZm9sZFwiKS5sZW5ndGggIT09IDA7XG59XG5cbmZ1bmN0aW9uIGhhc0RhdGF2aWV3KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG5cbiAgICBsZXQgaXNEYXRhdmlldyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImRhdGF2aWV3XCIpLmxlbmd0aCAhPT0gMDtcbiAgICByZXR1cm4gaXNEYXRhdmlldztcbn1cblxuZnVuY3Rpb24gaGFzRGF0YXZpZXdKUyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuXG4gICAgbGV0IGlzRGF0YXZpZXdKUyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImJsb2NrLWxhbmd1YWdlLWRhdGF2aWV3anNcIikubGVuZ3RoICE9PSAwO1xuICAgIGxldCBjYW52YXMgPSBzZWFyY2hDaGlsZHJlbkZvck5vZGVUeXBlKGVsZW1lbnQsIFwiY2FudmFzXCIpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZWFucyBvbmx5IGRhdGF2aWV3SlMgY2hhcnQgY2FudmFzIGVsZW1lbnRzIHNob3VsZCBiZSByZW5kZXJlZCBwcm9wZXJseS4gT3RoZXIgY2FudmFzZXMgd2lsbCBcbiAgICAgKiBuZWVkIHRoaWVyIG93biBjYXNlIHB1dCBpbiBvciB0aGUgcmVzdHJpY3Rpb24gcmVtb3ZlZCBhZnRlciB0ZXN0aW5nLlxuICAgICAqL1xuICAgIHJldHVybiBjYW52YXMgIT09IG51bGwgJiYgaXNEYXRhdmlld0pTIFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZGluZ0NvbGxhcHNlRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEVsZW1lbnQgfCBudWxsIHtcblxuICAgIGlmKGVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGNoaWxkRWxlbWVudHMgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJoZWFkaW5nLWNvbGxhcHNlLWluZGljYXRvclwiKVxuICAgIGlmKGNoaWxkRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBjaGlsZEVsZW1lbnRzWzBdO1xuICAgIH1cbiAgICBpZihjaGlsZEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkZvdW5kIG11bHRpcGxlIGhlYWRpbmcgY29sbGFwc2UgaW5kaWNhdG9ycyBpbiBlbGVtZW50LlwiKVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn0iLCIvKlxuICogRmlsZW5hbWU6IG11bHRpLWNvbHVtbi1tYXJrZG93bi9zcmMvZG9tT2JqZWN0LnRzXG4gKiBDcmVhdGVkIERhdGU6IFR1ZXNkYXksIEZlYnJ1YXJ5IDFzdCAyMDIyLCAxMjowNDowMCBwbVxuICogQXV0aG9yOiBDYW1lcm9uIFJvYmluc29uXG4gKiBcbiAqIENvcHlyaWdodCAoYykgMjAyMiBDYW1lcm9uIFJvYmluc29uXG4gKi9cblxuaW1wb3J0IHsgZ2V0VUlEIH0gZnJvbSBcIi4uL3V0aWxpdGllcy91dGlsc1wiO1xuaW1wb3J0IHsgRWxlbWVudFJlbmRlclR5cGUgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2VsZW1lbnRSZW5kZXJUeXBlUGFyc2VyXCI7XG5pbXBvcnQgeyBjb250YWluc0NvbEVuZFRhZywgY29udGFpbnNDb2xTZXR0aW5nc1RhZywgY29udGFpbnNFbmRUYWcsIGNvbnRhaW5zU3RhcnRUYWcsIGVsSW5uZXJUZXh0Q29udGFpbnNDb2xFbmRUYWcgfSBmcm9tIFwic3JjL3V0aWxpdGllcy90ZXh0UGFyc2VyXCI7XG5cbmV4cG9ydCBlbnVtIERPTU9iamVjdFRhZyB7XG4gICAgbm9uZSxcbiAgICBzdGFydFJlZ2lvbixcbiAgICByZWdpb25TZXR0aW5ncyxcbiAgICBjb2x1bW5CcmVhayxcbiAgICBlbmRSZWdpb25cbn1cblxuZXhwb3J0IGNsYXNzIERPTU9iamVjdCB7XG4gICAgbm9kZUtleTogc3RyaW5nO1xuICAgIG9yaWdpbmFsRWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgY2xvbmVkRWxlbWVudDogSFRNTEVsZW1lbnQgPSBudWxsO1xuICAgIFVJRDogc3RyaW5nO1xuICAgIHRhZzogRE9NT2JqZWN0VGFnO1xuICAgIHVzaW5nT3JpZ2luYWxFbGVtZW50OiBib29sZWFuXG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRSZW5kZXJUeXBlID0gRWxlbWVudFJlbmRlclR5cGUudW5kZWZpbmVkO1xuICAgIGVsZW1lbnRDb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gbnVsbDtcbiAgICBlbGVtZW50UmVuZGVyZWRIZWlnaHQgPSAwO1xuICAgIGxpbmVzT2ZFbGVtZW50OiBzdHJpbmdbXVxuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgbGluZXNPZkVsZW1lbnQ6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIHJhbmRvbUlEOnN0cmluZyA9IGdldFVJRCgpLCBcbiAgICAgICAgICAgICAgICB0YWc6IERPTU9iamVjdFRhZyA9IERPTU9iamVjdFRhZy5ub25lICkge1xuICAgICAgICB0aGlzLm5vZGVLZXkgPSBlbGVtZW50LmlubmVyVGV4dC50cmltKCk7XG4gICAgICAgIHRoaXMub3JpZ2luYWxFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5VSUQgPSByYW5kb21JRDtcbiAgICAgICAgdGhpcy50YWcgPSB0YWc7XG4gICAgICAgIHRoaXMudXNpbmdPcmlnaW5hbEVsZW1lbnQgPSBmYWxzZVxuICAgICAgICB0aGlzLmxpbmVzT2ZFbGVtZW50ID0gbGluZXNPZkVsZW1lbnQ7XG5cbiAgICAgICAgaWYodGhpcy50YWcgPT09IERPTU9iamVjdFRhZy5ub25lKSB7XG4gICAgICAgICAgICB0aGlzLnNldERvbU9iamVjdFRhZygpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRNYWluRE9NRWxlbWVudChkb21FbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICB0aGlzLm9yaWdpbmFsRWxlbWVudCA9IGRvbUVsZW1lbnQ7XG4gICAgICAgIHRoaXMudXNpbmdPcmlnaW5hbEVsZW1lbnQgPSB0cnVlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXREb21PYmplY3RUYWcoKSB7XG5cbiAgICAgICAgbGV0IGVsZW1lbnRUZXh0U3BhY2VkID0gdGhpcy5saW5lc09mRWxlbWVudC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBwcmV2ICsgXCJcXG5cIiArIGN1cnI7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmKGNvbnRhaW5zRW5kVGFnKHRoaXMub3JpZ2luYWxFbGVtZW50LnRleHRDb250ZW50KSA9PT0gdHJ1ZSkge1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRUeXBlID0gRWxlbWVudFJlbmRlclR5cGUudW5SZW5kZXJlZDtcbiAgICAgICAgICAgIHRoaXMudGFnID0gRE9NT2JqZWN0VGFnLmVuZFJlZ2lvbjtcbiAgICAgICAgICAgIC8vIGVsLmFkZENsYXNzKE11bHRpQ29sdW1uU3R5bGVDU1MuUmVnaW9uRW5kVGFnKVxuICAgICAgICAgICAgLy8gcmVnaW9uYWxNYW5hZ2VyLnVwZGF0ZUVsZW1lbnRUYWcoY3VycmVudE9iamVjdC5VSUQsIERPTU9iamVjdFRhZy5lbmRSZWdpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoY29udGFpbnNDb2xFbmRUYWcodGhpcy5vcmlnaW5hbEVsZW1lbnQudGV4dENvbnRlbnQpID09PSB0cnVlIHx8IFxuICAgICAgICAodGhpcy5vcmlnaW5hbEVsZW1lbnQuaW5uZXJIVE1MLnN0YXJ0c1dpdGgoXCI8bWFyaz5cIikpICYmIGVsSW5uZXJUZXh0Q29udGFpbnNDb2xFbmRUYWcodGhpcy5vcmlnaW5hbEVsZW1lbnQudGV4dENvbnRlbnQpKSB7XG5cbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFR5cGUgPSBFbGVtZW50UmVuZGVyVHlwZS51blJlbmRlcmVkXG4gICAgICAgICAgICB0aGlzLnRhZyA9IERPTU9iamVjdFRhZy5jb2x1bW5CcmVhaztcbiAgICAgICAgICAgIC8vIGVsLmFkZENsYXNzKE11bHRpQ29sdW1uU3R5bGVDU1MuQ29sdW1uRW5kVGFnKVxuICAgICAgICAgICAgLy8gcmVnaW9uYWxNYW5hZ2VyLnVwZGF0ZUVsZW1lbnRUYWcoY3VycmVudE9iamVjdC5VSUQsIERPTU9iamVjdFRhZy5jb2x1bW5CcmVhayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihjb250YWluc1N0YXJ0VGFnKHRoaXMub3JpZ2luYWxFbGVtZW50LnRleHRDb250ZW50KSA9PT0gdHJ1ZSkge1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRUeXBlID0gRWxlbWVudFJlbmRlclR5cGUudW5SZW5kZXJlZFxuICAgICAgICAgICAgdGhpcy50YWcgPSBET01PYmplY3RUYWcuc3RhcnRSZWdpb247XG4gICAgICAgICAgICAvLyBlbC5hZGRDbGFzcyhNdWx0aUNvbHVtblN0eWxlQ1NTLkNvbHVtbkVuZFRhZylcbiAgICAgICAgICAgIC8vIHJlZ2lvbmFsTWFuYWdlci51cGRhdGVFbGVtZW50VGFnKGN1cnJlbnRPYmplY3QuVUlELCBET01PYmplY3RUYWcuY29sdW1uQnJlYWspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoY29udGFpbnNDb2xTZXR0aW5nc1RhZyhlbGVtZW50VGV4dFNwYWNlZCkgPT09IHRydWUpIHtcblxuICAgICAgICAgICAgdGhpcy5lbGVtZW50VHlwZSA9IEVsZW1lbnRSZW5kZXJUeXBlLnVuUmVuZGVyZWRcbiAgICAgICAgICAgIC8vIGVsLmFkZENsYXNzKE11bHRpQ29sdW1uU3R5bGVDU1MuUmVnaW9uU2V0dGluZ3MpXG4gICAgICAgICAgICAvLyByZWdpb25hbE1hbmFnZXIgPSByZWdpb25hbENvbnRhaW5lci5zZXRSZWdpb25TZXR0aW5ncyhlbGVtZW50VGV4dFNwYWNlZClcbiAgICAgICAgICAgIC8vIHJlZ2lvbmFsTWFuYWdlci51cGRhdGVFbGVtZW50VGFnKGN1cnJlbnRPYmplY3QuVUlELCBET01PYmplY3RUYWcucmVnaW9uU2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRE9NU3RhcnRSZWdpb25PYmplY3QgZXh0ZW5kcyBET01PYmplY3Qge1xuXG4gICAgcmVnaW9uRWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihiYXNlRE9NT2JqZWN0OiBET01PYmplY3QsIHJlZ2lvbkVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG5cbiAgICAgICAgc3VwZXIoYmFzZURPTU9iamVjdC5vcmlnaW5hbEVsZW1lbnQsIGJhc2VET01PYmplY3QubGluZXNPZkVsZW1lbnQsIGJhc2VET01PYmplY3QuVUlELCBET01PYmplY3RUYWcuc3RhcnRSZWdpb24pO1xuICAgICAgICB0aGlzLnJlZ2lvbkVsZW1lbnQgPSByZWdpb25FbGVtZW50O1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhc2tMaXN0RE9NT2JqZWN0IGV4dGVuZHMgRE9NT2JqZWN0IHtcblxuICAgIG9yaWdpbmFsQ2hlY2tib3hlczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoYmFzZURPTU9iamVjdDogRE9NT2JqZWN0KSB7XG5cbiAgICAgICAgc3VwZXIoYmFzZURPTU9iamVjdC5vcmlnaW5hbEVsZW1lbnQsIGJhc2VET01PYmplY3QubGluZXNPZkVsZW1lbnQsIGJhc2VET01PYmplY3QuVUlELCBET01PYmplY3RUYWcubm9uZSk7XG4gICAgfVxuXG4gICAgY2hlY2tib3hDbGlja2VkKGluZGV4OiBudW1iZXIpIHtcblxuICAgICAgICBpZihpbmRleCA8IHRoaXMub3JpZ2luYWxDaGVja2JveGVzLmxlbmd0aCkge1xuXG4gICAgICAgICAgICBsZXQgb3JpZ2luYWxJbnB1dCA9IHRoaXMub3JpZ2luYWxDaGVja2JveGVzW2luZGV4XS5maXJzdENoaWxkIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgICAgICBvcmlnaW5hbElucHV0LmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgY2hlY2tGb3JUYXNrTGlzdEVsZW1lbnQoZG9tRWxlbWVudDogRE9NT2JqZWN0KSB7XG5cbiAgICAgICAgaWYoZG9tRWxlbWVudC5vcmlnaW5hbEVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcInRhc2stbGlzdC1pdGVtXCIpLmxlbmd0aCA+IDAgKSB7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFza0xpc3RET01PYmplY3QoZG9tRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZG9tRWxlbWVudDtcbiAgICB9XG59IiwiLypcbiAqIEZpbGU6IG11bHRpLWNvbHVtbi1tYXJrZG93bi9zcmMvdXRpbGl0aWVzL2Nzc0RlZmluaXRpb25zLnRzXG4gKiBDcmVhdGVkIERhdGU6IFdlZG5lc2RheSwgRmVicnVhcnkgMTZ0aCAyMDIyLCAxMTowOTowNiBhbVxuICogQXV0aG9yOiBDYW1lcm9uIFJvYmluc29uXG4gKiBcbiAqIENvcHlyaWdodCAoYykgMjAyMiBDYW1lcm9uIFJvYmluc29uXG4gKi9cblxuZXhwb3J0IGVudW0gTXVsdGlDb2x1bW5MYXlvdXRDU1Mge1xuXG4gICAgUmVnaW9uUm9vdENvbnRhaW5lckRpdiA9IFwibWNtLWNvbHVtbi1yb290LWNvbnRhaW5lclwiLFxuICAgIFJlZ2lvbkVycm9yQ29udGFpbmVyRGl2ID0gXCJtY20tY29sdW1uLWVycm9yLXJlZ2lvbi13cmFwcGVyXCIsXG4gICAgUmVnaW9uQ29udGVudENvbnRhaW5lckRpdiA9IFwibWNtLWNvbHVtbi1yZWdpb24td3JhcHBlclwiLFxuICAgIFJlZ2lvbkNvbHVtbkNvbnRhaW5lckRpdiA9IFwibWNtLWNvbHVtbi1wYXJlbnQtY29udGFpbmVyXCIsXG4gICAgQ29sdW1uRHVhbEVsZW1lbnRDb250YWluZXIgPSBcIm1jbS1jb2x1bW4tZWxlbWVudC13cmFwcGVyXCIsXG4gICAgT3JpZ2luYWxFbGVtZW50VHlwZSA9IFwibWNtLW9yaWdpbmFsLWNvbHVtbi1lbGVtZW50XCIsXG4gICAgQ2xvbmVkRWxlbWVudFR5cGUgPSBcIm1jbS1jbG9uZWQtY29sdW1uLWVsZW1lbnRcIixcblxuICAgIENvbnRlbnRPdmVyZmxvd0F1dG9TY3JvbGwgPSBcIm1jbS1jb250ZW50LW92ZXJmbG93LWF1dG8tc2Nyb2xsXCIsXG4gICAgQ29udGVudE92ZXJmbG93SGlkZGVuID0gXCJtY20tY29udGVudC1vdmVyZmxvdy1oaWRkZW5cIixcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4gICAgU2luZ2xlQ29sdW1uU21hbGwgPSBcIm1jbS1zaW5nbGUtY29sdW1uLXNtYWxsXCIsXG4gICAgU2luZ2xlQ29sdW1uTWVkID0gXCJtY20tc2luZ2xlLWNvbHVtbi1tZWRpdW1cIixcbiAgICBTaW5nbGVDb2x1bW5MYXJnZSA9IFwibWNtLXNpbmdsZS1jb2x1bW4tbGFyZ2VcIixcblxuICAgIFNpbmdsZUNvbHVtbkxlZnRMYXlvdXQgPSBcIm1jbS1zaW5nbGVjb2wtbGF5b3V0LWxlZnRcIixcbiAgICBTaW5nbGVDb2x1bW5DZW50ZXJMYXlvdXQgPSBcIm1jbS1zaW5nbGVjb2wtbGF5b3V0LWNlbnRlclwiLFxuICAgIFNpbmdsZUNvbHVtblJpZ2h0TGF5b3V0ID0gXCJtY20tc2luZ2xlY29sLWxheW91dC1yaWdodFwiLFxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgICBUd29FcXVhbENvbHVtbnMgPSBcIm1jbS10d28tZXF1YWwtY29sdW1uc1wiLFxuXG4gICAgVHdvQ29sdW1uU21hbGwgPSBcIm1jbS10d28tY29sdW1uLXNtYWxsXCIsXG4gICAgVHdvQ29sdW1uTGFyZ2UgPSBcIm1jbS10d28tY29sdW1uLWxhcmdlXCIsXG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAgIFRocmVlRXF1YWxDb2x1bW5zID0gXCJtY20tdGhyZWUtZXF1YWwtY29sdW1uc1wiLFxuXG4gICAgVGhyZWVDb2x1bW5fTGFyZ2UgPSBcIm1jbS10aHJlZS1jb2x1bW4tbGFyZ2VcIixcbiAgICBUaHJlZUNvbHVtbl9TbWFsbCA9IFwibWNtLXRocmVlLWNvbHVtbi1zbWFsbFwiLFxufVxuXG5leHBvcnQgZW51bSBNdWx0aUNvbHVtblN0eWxlQ1NTIHtcblxuICAgIFJlZ2lvbkVycm9yTWVzc2FnZSA9IFwibWNtLWNvbHVtbi1lcnJvci1tZXNzYWdlXCIsXG4gICAgUmVnaW9uU2V0dGluZ3MgPSBcIm1jbS1jb2x1bW4tc2V0dGluZ3Mtd3JhcHBlclwiLFxuICAgIFJlZ2lvbkNvbnRlbnQgPSBcIm1jbS1jb2x1bW4tY29udGVudC13cmFwcGVyXCIsXG4gICAgUmVnaW9uRW5kVGFnID0gXCJtY20tY29sdW1uLWVuZC10YWctd3JhcHBlclwiLFxuICAgIENvbHVtbkVuZFRhZyA9IFwibWNtLWNvbHVtbi1icmVhay10YWctd3JhcHBlclwiLFxuICAgIFJlZ2lvblNoYWRvdyA9IFwibWNtLXJlZ2lvbi1zaGFkb3dcIixcbiAgICBDb2x1bW5TaGFkb3cgPSBcIm1jbS1jb2x1bW4tc2hhZG93XCIsXG4gICAgQ29sdW1uQm9yZGVyID0gXCJtY20tY29sdW1uLWJvcmRlclwiLFxuICAgIENvbHVtbkNvbnRlbnQgPSBcIm1jbS1jb2x1bW4tZGl2XCJcbn0iLCIvKipcbiAqIEZpbGU6IC9zcmMvZG9tX21hbmFnZXIvcmVnaW9uYWxfbWFuYWdlcnMvUmVnaW9uTWFuYWdlci50cyAgICAgICAgICAgICAgICAgICAqXG4gKiBDcmVhdGVkIERhdGU6IFN1bmRheSwgTWF5IDIybmQgMjAyMiwgNzo0OSBwbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogQXV0aG9yOiBDYW1lcm9uIFJvYmluc29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgQ2FtZXJvbiBSb2JpbnNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICovXG5cbmltcG9ydCB7IERPTU9iamVjdCwgRE9NT2JqZWN0VGFnLCBUYXNrTGlzdERPTU9iamVjdCB9IGZyb20gJy4uL2RvbU9iamVjdCc7XG5pbXBvcnQgeyBNdWx0aUNvbHVtblNldHRpbmdzLCBDb2x1bW5MYXlvdXQsIGdldERlZmF1bHRNdWx0aUNvbHVtblNldHRpbmdzIH0gZnJvbSBcIi4uLy4uL3JlZ2lvblNldHRpbmdzXCI7XG5pbXBvcnQgeyBNdWx0aUNvbHVtbkxheW91dENTUywgTXVsdGlDb2x1bW5TdHlsZUNTUyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9jc3NEZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBGaWxlRE9NTWFuYWdlciB9IGZyb20gJy4uL2RvbU1hbmFnZXInO1xuaW1wb3J0IHsgRWxlbWVudFJlbmRlclR5cGUsIGdldEVsZW1lbnRSZW5kZXJUeXBlIH0gZnJvbSAnc3JjL3V0aWxpdGllcy9lbGVtZW50UmVuZGVyVHlwZVBhcnNlcic7XG5pbXBvcnQgeyBSZWdpb25NYW5hZ2VyRGF0YSB9IGZyb20gJy4vcmVnaW9uTWFuYWdlckNvbnRhaW5lcic7XG5pbXBvcnQgeyBzZWFyY2hDaGlsZHJlbkZvck5vZGVUeXBlIH0gZnJvbSAnc3JjL3V0aWxpdGllcy91dGlscyc7XG5cbmV4cG9ydCB0eXBlIE11bHRpQ29sdW1uUmVuZGVyRGF0YSA9IHsgXG4gICAgcGFyZW50UmVuZGVyRWxlbWVudDogSFRNTEVsZW1lbnQsIFxuICAgIHBhcmVudFJlbmRlclNldHRpbmdzOiBNdWx0aUNvbHVtblNldHRpbmdzLFxuICAgIGRvbU9iamVjdHM6IERPTU9iamVjdFtdXG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZWdpb25NYW5hZ2VyIHtcblxuICAgIHByb3RlY3RlZCBkb21MaXN0OiBET01PYmplY3RbXSA9IFtdO1xuICAgIHByb3RlY3RlZCBkb21PYmplY3RNYXA6IE1hcDxzdHJpbmcsIERPTU9iamVjdD4gPSBuZXcgTWFwKCk7XG4gICAgcHJpdmF0ZSBfcmVnaW9uUGFyZW50OiBIVE1MRWxlbWVudDtcbiAgICBwdWJsaWMgZ2V0IHJlZ2lvblBhcmVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpb25QYXJlbnQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgcmVnaW9uUGFyZW50KHZhbHVlOiBIVE1MRWxlbWVudCkge1xuICAgICAgICB0aGlzLl9yZWdpb25QYXJlbnQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZmlsZU1hbmFnZXI6IEZpbGVET01NYW5hZ2VyO1xuICAgIHByb3RlY3RlZCByZWdpb25hbFNldHRpbmdzOiBNdWx0aUNvbHVtblNldHRpbmdzID0gZ2V0RGVmYXVsdE11bHRpQ29sdW1uU2V0dGluZ3MoKTtcblxuICAgIHByb3RlY3RlZCByZWdpb25LZXk6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFJlZ2lvbk1hbmFnZXJEYXRhKSB7XG5cbiAgICAgICAgdGhpcy5kb21MaXN0ID0gZGF0YS5kb21MaXN0O1xuICAgICAgICB0aGlzLmRvbU9iamVjdE1hcCA9IGRhdGEuZG9tT2JqZWN0TWFwO1xuICAgICAgICB0aGlzLnJlZ2lvblBhcmVudCA9IGRhdGEucmVnaW9uUGFyZW50O1xuXG4gICAgICAgIHRoaXMuZmlsZU1hbmFnZXIgPSBkYXRhLmZpbGVNYW5hZ2VyO1xuICAgICAgICB0aGlzLnJlZ2lvbmFsU2V0dGluZ3MgPSBkYXRhLnJlZ2lvbmFsU2V0dGluZ3M7XG5cbiAgICAgICAgdGhpcy5yZWdpb25LZXkgPSBkYXRhLnJlZ2lvbktleTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVnaW9uRGF0YSgpOiBSZWdpb25NYW5hZ2VyRGF0YSB7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbUxpc3Q6IHRoaXMuZG9tTGlzdCxcbiAgICAgICAgICAgIGRvbU9iamVjdE1hcDogdGhpcy5kb21PYmplY3RNYXAsXG4gICAgICAgICAgICByZWdpb25QYXJlbnQ6IHRoaXMucmVnaW9uUGFyZW50LFxuXG4gICAgICAgICAgICBmaWxlTWFuYWdlcjogdGhpcy5maWxlTWFuYWdlcixcbiAgICAgICAgICAgIHJlZ2lvbmFsU2V0dGluZ3M6IHRoaXMucmVnaW9uYWxTZXR0aW5ncyxcblxuICAgICAgICAgICAgcmVnaW9uS2V5OiB0aGlzLnJlZ2lvbktleSxcbiAgICAgICAgICAgIHJvb3RFbGVtZW50OiBudWxsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFkZE9iamVjdChzaWJsaW5nc0Fib3ZlOiBIVE1MRGl2RWxlbWVudCwgc2libGluZ3NCZWxvdzogSFRNTERpdkVsZW1lbnQsIG9iajogRE9NT2JqZWN0KTogbnVtYmVyIHtcblxuICAgICAgICBsZXQgcHJldk9iaiA9IHNpYmxpbmdzQWJvdmUuY2hpbGRyZW5bc2libGluZ3NBYm92ZS5jaGlsZHJlbi5sZW5ndGggLSAxXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgbGV0IG5leHRPYmogPSBzaWJsaW5nc0JlbG93LmNoaWxkcmVuWzBdIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGxldCBhZGRBdEluZGV4ID0gc2libGluZ3NBYm92ZS5jaGlsZHJlbi5sZW5ndGg7XG5cbiAgICAgICAgbGV0IHByZXZPYmpUZXh0ID0gXCJcIjtcbiAgICAgICAgaWYgKHByZXZPYmogIT09IHVuZGVmaW5lZCkge1xuXG4gICAgICAgICAgICBwcmV2T2JqVGV4dCA9IHByZXZPYmouaW5uZXJUZXh0O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5kb21MaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZG9tTGlzdFtpXS5ub2RlS2V5ID09PSBwcmV2T2JqLmlubmVyVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBhZGRBdEluZGV4ID0gaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBuZXh0RWxJbmRleCA9IGFkZEF0SW5kZXg7XG4gICAgICAgIGxldCBuZXh0T2JqVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChuZXh0T2JqICE9PSB1bmRlZmluZWQpIHtcblxuICAgICAgICAgICAgbGV0IGZvdW5kTmV4dCA9IGZhbHNlO1xuICAgICAgICAgICAgbmV4dE9ialRleHQgPSBuZXh0T2JqLmlubmVyVGV4dDtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGFkZEF0SW5kZXg7IGkgPCB0aGlzLmRvbUxpc3QubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbUxpc3RbaV0ubm9kZUtleSA9PT0gbmV4dE9iai5pbm5lclRleHQudHJpbSgpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbmV4dEVsSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICBmb3VuZE5leHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIiBQcmV2OiBcIiwgc2libGluZ3NBYm92ZS5jaGlsZHJlbltzaWJsaW5nc0Fib3ZlLmNoaWxkcmVuLmxlbmd0aCAtIDFdLCBcIkFkZGluZzogXCIsIG9iai5lbGVtZW50LCBcIiBOZXh0OiBcIiwgc2libGluZ3NCZWxvdy5jaGlsZHJlblswXSwgXCJPdmVyd3JpdGluZzpcIiwgdGhpcy5kb21MaXN0LnNsaWNlKGFkZEF0SW5kZXgsIG5leHRFbEluZGV4KSk7XG4gICAgICAgIHRoaXMuZG9tTGlzdC5zcGxpY2UoYWRkQXRJbmRleCwgbmV4dEVsSW5kZXggLSBhZGRBdEluZGV4LCBvYmopO1xuICAgICAgICB0aGlzLmRvbU9iamVjdE1hcC5zZXQob2JqLlVJRCwgb2JqKTtcblxuICAgICAgICAvLyAvKipcbiAgICAgICAgLy8gICogTWFrZSBhIGNvcHkgb2YgdGhlIGxpc3QgdG8gbG9nLCBvbmx5IGJlY2F1c2VcbiAgICAgICAgLy8gICogY29uc29sZSBsb2cgdXBkYXRlcyBpdHMgcmVmZXJlbmNlcyB3aXRoIHVwZGF0ZXMgaW4gbWVtb3J5LlxuICAgICAgICAvLyAgKi9cbiAgICAgICAgLy8gbGV0IHggPSB0aGlzLmRvbUxpc3Quc2xpY2UoMCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHgpO1xuICAgICAgICByZXR1cm4gYWRkQXRJbmRleDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlT2JqZWN0KG9iamVjdFVJRDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIC8vIC8qKlxuICAgICAgICAvLyAgKiBNYWtlIGEgY29weSBvZiB0aGUgbGlzdCB0byBsb2dcbiAgICAgICAgLy8gICovXG4gICAgICAgIC8vIGxldCB4ID0gZG9tTGlzdC5zbGljZSgwKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coeCk7XG4gICAgICAgIC8vIEdldCB0aGUgb2JqZWN0IGJ5IGtleSwgcmVtb3ZlIGl0IGZyb20gdGhlIG1hcCBhbmQgdGhlblxuICAgICAgICAvLyBmcm9tIHRoZSBsaXN0LlxuICAgICAgICBsZXQgb2JqID0gdGhpcy5kb21PYmplY3RNYXAuZ2V0KG9iamVjdFVJRCk7XG4gICAgICAgIHRoaXMuZG9tT2JqZWN0TWFwLmRlbGV0ZShvYmplY3RVSUQpO1xuXG4gICAgICAgIGlmIChvYmogPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZG9tTGlzdC5jb250YWlucyhvYmopKSB7XG4gICAgICAgICAgICB0aGlzLmRvbUxpc3QucmVtb3ZlKG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kb21MaXN0Lmxlbmd0aCA9PT0gMCAmJiB0aGlzLmZpbGVNYW5hZ2VyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVNYW5hZ2VyLnJlbW92ZVJlZ2lvbih0aGlzLnJlZ2lvbktleSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB4ID0gZG9tTGlzdC5zbGljZSgwKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coeCk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZUVsZW1lbnRUYWcob2JqZWN0VUlEOiBzdHJpbmcsIG5ld1RhZzogRE9NT2JqZWN0VGFnKTogdm9pZCB7XG5cbiAgICAgICAgbGV0IG9iaiA9IHRoaXMuZG9tT2JqZWN0TWFwLmdldChvYmplY3RVSUQpO1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRvbUxpc3QuaW5kZXhPZihvYmopO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmRvbUxpc3RbaW5kZXhdLnRhZyA9IG5ld1RhZztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSZWdpb25hbFNldHRpbmdzKHJlZ2lvblNldHRpbmdzOiBNdWx0aUNvbHVtblNldHRpbmdzKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVnaW9uYWxTZXR0aW5ncyA9IHJlZ2lvblNldHRpbmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlZ2lvblxuICAgICAqIHRvIGJlIHJlbmRlcmVkIHRvIHRoZSBwcmV2aWV3IHBhbmUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBhIE11bHRpQ29sdW1uUmVuZGVyRGF0YSBvYmplY3Qgd2l0aCB0aGUgcm9vdCBET00gZWxlbWVudCwgc2V0dGluZ3Mgb2JqZWN0LCBhbmRcbiAgICAgKiBhbGwgY2hpbGQgb2JqZWN0cyBpbiB0aGUgb3JkZXIgdGhleSBzaG91bGQgYmUgcmVuZGVyZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldFJlZ2lvblJlbmRlckRhdGEoKTogTXVsdGlDb2x1bW5SZW5kZXJEYXRhIHtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGFyZW50UmVuZGVyRWxlbWVudDogdGhpcy5yZWdpb25QYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnRSZW5kZXJTZXR0aW5nczogdGhpcy5yZWdpb25hbFNldHRpbmdzLFxuICAgICAgICAgICAgZG9tT2JqZWN0czogdGhpcy5kb21MaXN0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdWN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgc3RhcnQgdGFnIGlzIHJlbW92ZWQgZnJvbSB2aWV3IG1lYW5pbmdcbiAgICAgKiBvdXIgcGFyZW50IGVsZW1lbnQgc3RvcmluZyB0aGUgbXVsdGktY29sdW1uIHJlZ2lvbiBpcyByZW1vdmVkLiBJdFxuICAgICAqIHJlbW92ZXMgdGhlIENTUyBjbGFzcyBmcm9tIGFsbCBvZiB0aGUgZWxlbWVudHMgc28gdGhleSB3aWxsIGJlXG4gICAgICogcmUtcmVuZGVyZWQgaW4gdGhlIHByZXZpZXcgd2luZG93LlxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNwbGF5T3JpZ2luYWxFbGVtZW50cygpIHtcblxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kb21MaXN0Lmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRvbUxpc3RbaV0ub3JpZ2luYWxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb21MaXN0W2ldLm9yaWdpbmFsRWxlbWVudC5yZW1vdmVDbGFzc2VzKFtNdWx0aUNvbHVtblN0eWxlQ1NTLlJlZ2lvbkVuZFRhZyxcbiAgICAgICAgICAgICAgICBNdWx0aUNvbHVtblN0eWxlQ1NTLkNvbHVtbkVuZFRhZyxcbiAgICAgICAgICAgICAgICBNdWx0aUNvbHVtblN0eWxlQ1NTLlJlZ2lvblNldHRpbmdzLFxuICAgICAgICAgICAgICAgIE11bHRpQ29sdW1uU3R5bGVDU1MuUmVnaW9uQ29udGVudF0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbUxpc3RbaV0ub3JpZ2luYWxFbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb21MaXN0W2ldLm9yaWdpbmFsRWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuZG9tTGlzdFtpXS5vcmlnaW5hbEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZ2V0SUQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaW9uS2V5O1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVSZW5kZXJlZE1hcmtkb3duKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBhY3RzIGFzIHRoZSB1cGRhdGUgbG9vcCBmb3IgdGhlIG11bHRpLWNvbHVtbiByZWdpb25zLlxuICAgICAgICAgKiBIZXJlIHdlIGxvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIGVsZW1lbnRzIHdpdGhpbiB0aGUgcmVuZGVyZWQgcmVnaW9uIGFuZFxuICAgICAgICAgKiBwb3RlbnRpYWxseSB1cGRhdGUgaG93IHRoaW5ncyBhcmUgcmVuZGVyZWQuIFdlIG5lZWQgdG8gZG8gdGhpcyBmb3JcbiAgICAgICAgICogY29tcGF0YWJpbGl0eSB3aXRoIG90aGVyIHBsdWdpbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBtdWx0aS1jb2x1bW4gcmVnaW9uIGlzIHJlbmRlcmVkIGJlZm9yZSBvdGhlciBwbHVnaW5zIHRoYXQgZWZmZWN0XG4gICAgICAgICAqIGNvbnRlbnQgd2l0aGluIHRoZSByZWdpb24gb3VyIHJlbmRlcmVkIGRhdGEgbWF5IG5vdCBwcm9wZXJseSBkaXNwbGF5XG4gICAgICAgICAqIHRoZSBjb250ZW50IGZyb20gdGhlIG90aGVyIHBsdWdpbi4gSGVyZSB3ZSBsb29wIHRocm91Z2ggdGhlIGVsZW1lbnRzXG4gICAgICAgICAqIGFmdGVyIGFsbCBwbHVnaW5zIGhhdmUgaGFkIGEgY2hhbmNlIHRvIHJ1biBhbmQgY2FuIG1ha2UgY2hhbmdlcyB0byB0aGVcbiAgICAgICAgICogRE9NIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAqL1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZG9tTGlzdC5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEhlcmUgd2UgY2hlY2sgZm9yIHNwZWNpYWwgY2FzZXNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHRoaXMuZG9tTGlzdFtpXSBpbnN0YW5jZW9mIFRhc2tMaXN0RE9NT2JqZWN0KSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZpeENsb25lZENoZWNrTGlzdEJ1dHRvbnModGhpcy5kb21MaXN0W2ldIGFzIFRhc2tMaXN0RE9NT2JqZWN0KTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBsZXQgZWxlbWVudFR5cGUgPSB0aGlzLmRvbUxpc3RbaV0uZWxlbWVudFR5cGU7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSWYgdGhlIGVsZW1lbnQgaXMgbm90IGN1cnJlbnRseSBhIHNwZWNpYWwgcmVuZGVyIGVsZW1lbnQgd2UgY2hlY2sgYWdhaW5cbiAgICAgICAgICAgICAqIGFzIHRoZSBvcmlnaW5hbCBlbGVtZW50IG1heSBoYXZlIGJlZW4gdXBkYXRlZC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBUT0RPOiBmaW5kIGEgd2F5IHRvIFwiT2ZmaWNpYWxseVwiIG1hcmsgbm9ybWFsIGVsZW1lbnRzIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgKiBjb250aW51b3VzbHkgc2VhcmNoIGZvciBzcGVjaWFsIHJlbmRlciB0eXBlcy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlICE9PSBFbGVtZW50UmVuZGVyVHlwZS5zcGVjaWFsUmVuZGVyICYmXG4gICAgICAgICAgICAgICAgZWxlbWVudFR5cGUgIT09IEVsZW1lbnRSZW5kZXJUeXBlLnNwZWNpYWxTaW5nbGVFbGVtZW50UmVuZGVyICYmIFxuICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlICE9PSBFbGVtZW50UmVuZGVyVHlwZS51blJlbmRlcmVkKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV3IHJlc3VsdCByZXR1cm5zIGFzIGEgc3BlY2lhbCByZW5kZXJlciB3ZSB1cGRhdGUgc29cbiAgICAgICAgICAgICAgICAvLyB0aGlzIHdvbnQgcnVuIGFnYWluIGZvciB0aGlzIGl0ZW0uXG4gICAgICAgICAgICAgICAgZWxlbWVudFR5cGUgPSBnZXRFbGVtZW50UmVuZGVyVHlwZSh0aGlzLmRvbUxpc3RbaV0ub3JpZ2luYWxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRvbUxpc3RbaV0ub3JpZ2luYWxFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09PSBFbGVtZW50UmVuZGVyVHlwZS5zcGVjaWFsUmVuZGVyIHx8XG4gICAgICAgICAgICAgICAgZWxlbWVudFR5cGUgPT09IEVsZW1lbnRSZW5kZXJUeXBlLnNwZWNpYWxTaW5nbGVFbGVtZW50UmVuZGVyIHx8IFxuICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlID09PSBFbGVtZW50UmVuZGVyVHlwZS5jYW52YXNSZW5kZXJFbGVtZW50KSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRvbUxpc3RbaV0uZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFVwRHVhbFJlbmRlcih0aGlzLmRvbUxpc3RbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiB0YWtlcyBpbiB0aGUgb3JpZ2luYWwgZWxlbWVudCBhbmQgaXRzIGNsb25lIGFuZCBjaGVja3MgaWZcbiAgICAgKiB0aGUgZWxlbWVudCBjb250YWlucyBhIHRhc2stbGlzdC1pdGVtIGNsYXNzLiBJZiBzbyBpdCBsb29wcyB0aHJvdWdoIGFsbFxuICAgICAqIGl0ZW1zIGluIHRoZSBsaXN0IGFuZCBmaXhlcyB0aGVpciBjaGVja2JveGVzIHRvIHByb3Blcmx5IGZpcmUgYW4gZXZlbnQuXG4gICAgICogVGhlIG5ldyBjaGVja2JveCBjYWxscyB0aGUgY2xpY2sgZnVuY3Rpb24gb24gdGhlIG9yaWdpbmFsIGNoZWNrYm94IHNvXG4gICAgICogY29tcGF0YWJpbGl0eSB3aXRoIG90aGVyIHBsdWdpbnMgKnNob3VsZCogcmVtYWluLlxuICAgICAqIEBwYXJhbSBkb21FbGVtZW50XG4gICAgICogQHBhcmFtIGluaXRhbGl6ZUNoZWNrYm94ZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZml4Q2xvbmVkQ2hlY2tMaXN0QnV0dG9ucyhkb21FbGVtZW50OiBUYXNrTGlzdERPTU9iamVjdCwgaW5pdGFsaXplQ2hlY2tib3hlczogYm9vbGVhbiA9IGZhbHNlKSB7XG5cbiAgICAgICAgaWYoZG9tRWxlbWVudC5vcmlnaW5hbEVsZW1lbnQgPT09IG51bGwgfHwgZG9tRWxlbWVudC5jbG9uZWRFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbWVudDogSFRNTEVsZW1lbnQgPSBkb21FbGVtZW50Lm9yaWdpbmFsRWxlbWVudDtcbiAgICAgICAgbGV0IGNsb25lZEVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gZG9tRWxlbWVudC5jbG9uZWRFbGVtZW50O1xuXG4gICAgICAgIGxldCBjbG9uZWRMaXN0Q2hlY2tib3hlcyA9IEFycmF5LmZyb20oY2xvbmVkRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwidGFzay1saXN0LWl0ZW1cIikpIGFzIEhUTUxFbGVtZW50W107XG4gICAgICAgIGxldCBvcmlnaW5hbExpc3RDaGVja2JveGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJ0YXNrLWxpc3QtaXRlbVwiKSkgYXMgSFRNTEVsZW1lbnRbXTtcblxuICAgICAgICBpZiAoaW5pdGFsaXplQ2hlY2tib3hlcyA9PT0gdHJ1ZSkge1xuXG4gICAgICAgICAgICAvLyBXaGVuIHdlIGluaXRhbGl6ZSB3ZSByZW1vdmUgdGhlIG9sZCBpbnB1dCBjaGVja2JveCB0aGF0IGNvbnRhaW5zXG4gICAgICAgICAgICAvLyB0aGUgd2VpcmQgY2FsbGJhY2sgc2l0dWF0aW9uIGNhdXNpbmcgdGhlIGJ1Zy4gVGhlbiB3ZSBjcmVhdGUgYSBuZXdcbiAgICAgICAgICAgIC8vIGNoZWNrYm94IHRvIHJlcGxhY2UgaXQgYW5kIHNldCBpdCB1cCB0byBmaXJlIHRoZSBjbGljayBldmVudCBvblxuICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIGNoZWNrYm94IHNvIGZ1bmN0aW9uYWxpdHkgaXMgcmVzdG9yZWQuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yaWdpbmFsTGlzdENoZWNrYm94ZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrYm94ID0gY3JlYXRlRWwoJ2lucHV0Jyk7XG5cbiAgICAgICAgICAgICAgICBsZXQgb3JpZ2luYWxJbnB1dCA9IG9yaWdpbmFsTGlzdENoZWNrYm94ZXNbaV0uZmlyc3RDaGlsZCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9IG9yaWdpbmFsSW5wdXQuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICBjbG9uZWRMaXN0Q2hlY2tib3hlc1tpXS5yZXBsYWNlQ2hpbGQoY2hlY2tib3gsIGNsb25lZExpc3RDaGVja2JveGVzW2ldLmNoaWxkcmVuWzBdKTtcbiAgICAgICAgICAgICAgICBjaGVja2JveC5hZGRDbGFzcygndGFzay1saXN0LWl0ZW0tY2hlY2tib3gnKTtcbiAgICAgICAgICAgICAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICAgICAgICAgICAgICBjaGVja2JveC5vbkNsaWNrRXZlbnQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LmNoZWNrYm94Q2xpY2tlZChpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcblxuICAgICAgICAgICAgLy8gV2hlbmV2ZXIgd2UgcmVhY2ggdGhpcyBwb2ludCB3ZSB1cGRhdGUgb3VyIGxpc3Qgb2Ygb3JpZ2luYWwgY2hlY2tib3hlc1xuICAgICAgICAgICAgLy8gdGhhdCBtYXkgYmUgZGlmZmVyZW50IGZyb20gb3VyIGNhY2hlLiBUaGlzIGlzIGR1ZSB0byBob3cgb2JzaWRpYW5cbiAgICAgICAgICAgIC8vIGNoYW5nZXMgdGhlIERPTSB1bmRlcm5lYXRoIHVzIHNvIHdlIG5lZWQgdG8gY29uc3RhbnRseSB1cGRhdGUgb3VyIGNhY2hlLlxuICAgICAgICAgICAgZG9tRWxlbWVudC5vcmlnaW5hbENoZWNrYm94ZXMgPSBvcmlnaW5hbExpc3RDaGVja2JveGVzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiB0aGUgVGFza3MgcGx1Z2luIGlzIGluc3RhbGxlZCB0aGUgY2xvbmVkIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGVsZW1lbnQgY29udGFpbnNcbiAgICAgICAgLy8gYW4gZXh0cmEgZWxlbWVudCBmb3Igc29tZSByZWFzb24uIElmIHRoaXMgb2NjdXJzIGZvciBvdGhlciByZWFzb25zIGhlcmUgd2UgYWRqdXN0XG4gICAgICAgIC8vIHRoYXQgdG8ga2VlcCB0aGUgY2xvbmUgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsLlxuICAgICAgICBpZiAoY2xvbmVkTGlzdENoZWNrYm94ZXMubGVuZ3RoID4gb3JpZ2luYWxMaXN0Q2hlY2tib3hlcy5sZW5ndGgpIHtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG9yaWdpbmFsTGlzdENoZWNrYm94ZXMubGVuZ3RoOyBpIDwgY2xvbmVkTGlzdENoZWNrYm94ZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQuY2xvbmVkRWxlbWVudC5yZW1vdmVDaGlsZChjbG9uZWRMaXN0Q2hlY2tib3hlc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0VXBEdWFsUmVuZGVyKGRvbUVsZW1lbnQ6IERPTU9iamVjdCkge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBvdXIgZWxlbWVudCBpcyBvZiBcInNwZWNpYWxSZW5kZXJcIiB0eXBlIGl0ICptYXkqIG5lZWQgdG8gYmUgcmVuZGVyZWRcbiAgICAgICAgICogdXNpbmcgdGhlIG9yaWdpbmFsIGVsZW1lbnQgcmF0aGVyIHRoYW4gYSBjb3B5LiBGb3IgZXhhbXBsZSwgYW4gZWxlbWVudFxuICAgICAgICAgKiBtYXkgaGF2ZSBhbiBvbkNsaWNrIGV2ZW50IHRoYXQgd291bGQgbm90IGdldCBjb3BwaWVkIHRvIHRoZSBjbG9uZS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgd2UganVzdCBtb3ZlZCB0aGVzZSBlbGVtZW50cyBpbnRvIHRoZSByZWdpb24gaXQgd291bGQgZ2V0XG4gICAgICAgICAqIG1vdmVkIGJhY2sgb3V0IGludG8gdGhlIG9yaWdpbmFsIGxvY2F0aW9uIGluIHRoZSBET00gYnkgb2JzaWRpYW5cbiAgICAgICAgICogd2hlbiBzY3JvbGxpbmcgb3Igd2hlbiB0aGUgZmlsZSBpcyB1cGRhdGVkLiBPbiB0aGUgbmV4dCByZWZyZXNoIGl0XG4gICAgICAgICAqIHdvdWxkIGJlIG1vdmVkIGJhY2sgYnV0IHRoYXQgY2FuIGxlYWQgdG8gYSByZWdpb24ganVtcGluZ1xuICAgICAgICAgKiBhcm91bmQgYXMgdGhlIGl0ZW0gaXMgbW92ZWQgaW4gYW5kIG91dC5cbiAgICAgICAgICpcbiAgICAgICAgICogSGVyZSB3ZSBzZXQgdXAgdGhlIGRpdiB0byBjb250YWluIHRoZSBlbGVtZW50IGFuZCBjcmVhdGVcbiAgICAgICAgICogYSB2aXN1YWwgb25seSBjbG9uZSBvZiBpdC4gVGhlIGNsb25lIHdpbGwgb25seSBiZSB2aXNpYmxlXG4gICAgICAgICAqIHdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBpbiB0aGUgbXVsdGktY29sdW1uIHJlZ2lvbiBzbyBpdFxuICAgICAgICAgKiBzYXZlcyB1cyBmcm9tIHRoZSB2aXN1YWwgbm9pc2Ugb2YgdGhlIHJlZ2lvbiBqdW1waW5nIGFyb3VuZC5cbiAgICAgICAgICovXG5cbiAgICAgICAgIGxldCBvcmlnaW5hbEVsZW1lbnQgPSBkb21FbGVtZW50Lm9yaWdpbmFsRWxlbWVudDtcbiAgICAgICAgIGxldCBjbG9uZWRFbGVtZW50ID0gZG9tRWxlbWVudC5jbG9uZWRFbGVtZW50O1xuICAgICAgICAgbGV0IGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50ID0gZG9tRWxlbWVudC5lbGVtZW50Q29udGFpbmVyO1xuXG4gICAgICAgIC8vIEdldCBoZWlnaHQgb2YgdGhlIG9yaWdpbmFsIGFuZCBjbG9uZWQgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgaXMgbm90IGN1cnJlbnRseSByZW5kZXJlZFxuICAgICAgICAvLyBpdCB3aWxsIGhhdmUgMCBoZWlnaHQgc28gd2UgbmVlZCB0byB0ZW1wb3JhcmlseSByZW5kZXIgaXQgdG8gZ2V0IHRoZSBoZWlnaHQuXG4gICAgICAgIGxldCBvcmlnaW5hbEVsZW1lbnRIZWlnaHQgPSBnZXRFbGVtZW50Q2xpZW50SGVpZ2h0KG9yaWdpbmFsRWxlbWVudCwgY29udGFpbmVyRWxlbWVudCk7XG4gICAgICAgIGxldCBjbG9uZWRFbGVtZW50SGVpZ2h0ID0gZ2V0RWxlbWVudENsaWVudEhlaWdodChjbG9uZWRFbGVtZW50LCBjb250YWluZXJFbGVtZW50KTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogV2Ugb25seSB3YW50IHRvIGNsb25lIHRoZSBlbGVtZW50IG9uY2UgdG8gcmVkdWNlIEdDLiBCdXQgaWYgdGhlIGNsb25lZCBcbiAgICAgICAgICogZWxlbWVudCdzIGhlaWdodCBpcyBub3QgZXF1YWwgdG8gdGhlIG9yaWdpbmFsIGVsZW1lbnQsIHRoaXMgbWVhbnMgdGhlXG4gICAgICAgICAqIGl0ZW0gZWxlbWVudCBoYXMgYmVlbiB1cGRhdGVkIHNvbWV3aGVyZSBlbHNlIHdpdGhvdXQgdGhlIGRvbSBiZWluZyBcbiAgICAgICAgICogcmVmcmVzaGVkLiBUaGlzIGNhbiBvY2N1ciB3aGVuIGVsZW1lbnRzIGFyZSB1cGRhdGVkIGJ5IG90aGVyIHBsdWdpbnMsIFxuICAgICAgICAgKiBzdWNoIGFzIERhdGF2aWV3LlxuICAgICAgICAgKi9cbiAgICAgICAgaWYoY2xvbmVkRWxlbWVudCA9PT0gbnVsbCAgfHwgXG4gICAgICAgICAgICBjbG9uZWRFbGVtZW50SGVpZ2h0ICE9PSBvcmlnaW5hbEVsZW1lbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVXBkYXRlIGNsb25lIGFuZCByZWZlcmVuY2UuXG4gICAgICAgICAgICBkb21FbGVtZW50LmNsb25lZEVsZW1lbnQgPSBvcmlnaW5hbEVsZW1lbnQuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgICAgICAgICAgY2xvbmVkRWxlbWVudCA9IGRvbUVsZW1lbnQuY2xvbmVkRWxlbWVudDtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBJZiB3ZSB1cGRhdGVkIHRoZSBjbG9uZWQgZWxlbWVudCwgd2Ugd2FudCB0byBhbHNvIHVwZGF0ZSB0aGVcbiAgICAgICAgICAgICAqIGVsZW1lbnQgcmVuZGVyZWQgaW4gdGhlIHBhcmVudCBjb250YWluZXIuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBjb250YWluZXJFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudC5jaGlsZHJlbltpXS5kZXRhY2goKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIENTUywgd2UgYWRkIGNsb25lZCBjbGFzcyBhbmQgcmVtb3ZlIGNsYXNzZXMgZnJvbSBvcmlnaW5hbEVsZW1lbnQgdGhhdCBkbyBub3QgYXBwbHkuXG4gICAgICAgICAgICBjbG9uZWRFbGVtZW50LmFkZENsYXNzKE11bHRpQ29sdW1uTGF5b3V0Q1NTLkNsb25lZEVsZW1lbnRUeXBlKTtcbiAgICAgICAgICAgIGNsb25lZEVsZW1lbnQucmVtb3ZlQ2xhc3NlcyhbTXVsdGlDb2x1bW5TdHlsZUNTUy5SZWdpb25Db250ZW50LCBNdWx0aUNvbHVtbkxheW91dENTUy5PcmlnaW5hbEVsZW1lbnRUeXBlXSk7XG4gICAgICAgICAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKGNsb25lZEVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoZG9tRWxlbWVudC5lbGVtZW50VHlwZSA9PT0gRWxlbWVudFJlbmRlclR5cGUuY2FudmFzUmVuZGVyRWxlbWVudCkge1xuXG4gICAgICAgICAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKG9yaWdpbmFsRWxlbWVudCk7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNsb25lQ2FudmFzKG9yaWdpbmFsQ2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IEhUTUxDYW52YXNFbGVtZW50IHtcblxuICAgICAgICAgICAgICAgIC8vY3JlYXRlIGEgbmV3IGNhbnZhc1xuICAgICAgICAgICAgICAgIGxldCBjbG9uZWRDYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gb3JpZ2luYWxDYW52YXMuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxDYW52YXNFbGVtZW50O1xuICAgICAgICAgICAgICAgIGxldCBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBjbG9uZWRDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vc2V0IGRpbWVuc2lvbnNcbiAgICAgICAgICAgICAgICBjbG9uZWRDYW52YXMud2lkdGggPSBvcmlnaW5hbENhbnZhcy53aWR0aDtcbiAgICAgICAgICAgICAgICBjbG9uZWRDYW52YXMuaGVpZ2h0ID0gb3JpZ2luYWxDYW52YXMuaGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgaWYoY2xvbmVkQ2FudmFzLndpZHRoID09PSAwIHx8IGNsb25lZENhbnZhcy5oZWlnaHQgPT09IDApe1xuICAgICAgICAgICAgICAgICAgICAvLyBEb250IHdhbnQgdG8gcmVuZGVyIGlmIHRoZSB3aWR0aCBpcyAwIGFzIGl0IHRocm93cyBhbiBlcnJvclxuICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBoYXBwZW4gaWYgdGhlIG9sZCBjYW52YXMgaGFzbnQgYmVlbiByZW5kZXJlZCB5ZXQuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZWRDYW52YXM7XG4gICAgICAgICAgICAgICAgfSBcblxuICAgICAgICAgICAgICAgIC8vYXBwbHkgdGhlIG9sZCBjYW52YXMgdG8gdGhlIG5ldyBvbmVcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShvcmlnaW5hbENhbnZhcywgMCwgMCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvL3JldHVybiB0aGUgbmV3IGNhbnZhc1xuICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZWRDYW52YXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjYW52YXMgPSBzZWFyY2hDaGlsZHJlbkZvck5vZGVUeXBlKG9yaWdpbmFsRWxlbWVudCwgXCJjYW52YXNcIik7XG4gICAgICAgICAgICBpZihjYW52YXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gY2xvbmVkRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBjbG9uZWRFbGVtZW50LmNoaWxkcmVuW2ldLmRldGFjaCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjbG9uZWRFbGVtZW50LmFwcGVuZENoaWxkKGNsb25lQ2FudmFzKGNhbnZhcyBhcyBIVE1MQ2FudmFzRWxlbWVudCkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQucmVtb3ZlQ2hpbGQob3JpZ2luYWxFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLyoqIFxuICAgICAgICAgKiBJZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgaGFzIGxlc3MgdGhhbiAyIGNoaWxkcmVuIHdlIG5lZWQgdG8gbW92ZSB0aGVcbiAgICAgICAgICogb3JpZ2luYWwgZWxlbWVudCBiYWNrIGludG8gaXQuIEhvd2V2ZXIgc29tZSBlbGVtZW50cyBjb25zdGFudGx5IGdldCBtb3ZlZFxuICAgICAgICAgKiBpbiBhbmQgb3V0IGNhdXNpbmcgc29tZSB1bndhbnRlZCBiZWhhdmlvci4gVGhvc2UgZWxlbWVudCB3aWxsIGJlIHRhZ2dlZFxuICAgICAgICAgKiBhcyBzcGVjaWFsU2luZ2xlRWxlbWVudFJlbmRlciBzbyB3ZSBpZ25vcmUgdGhvc2UgZWxlbWVudHMgaGVyZS5cbiAgICAgICAgICovXG4gICAgICAgIGlmKGRvbUVsZW1lbnQuZWxlbWVudENvbnRhaW5lci5jaGlsZHJlbi5sZW5ndGggPCAyICYmIFxuICAgICAgICAgICAgZG9tRWxlbWVudC5lbGVtZW50VHlwZSAhPT0gRWxlbWVudFJlbmRlclR5cGUuc3BlY2lhbFNpbmdsZUVsZW1lbnRSZW5kZXIpIHtcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJVcGRhdGluZyBkdWFsIHJlbmRlcmluZy5cIiwgZG9tRWxlbWVudCwgZG9tRWxlbWVudC5vcmlnaW5hbEVsZW1lbnQucGFyZW50RWxlbWVudCwgZG9tRWxlbWVudC5vcmlnaW5hbEVsZW1lbnQucGFyZW50RWxlbWVudD8uY2hpbGRFbGVtZW50Q291bnQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgb3VyIENTUyBpcyB1cCB0byBkYXRlLlxuICAgICAgICAgICAgb3JpZ2luYWxFbGVtZW50LmFkZENsYXNzKE11bHRpQ29sdW1uTGF5b3V0Q1NTLk9yaWdpbmFsRWxlbWVudFR5cGUpO1xuICAgICAgICAgICAgY2xvbmVkRWxlbWVudC5hZGRDbGFzcyhNdWx0aUNvbHVtbkxheW91dENTUy5DbG9uZWRFbGVtZW50VHlwZSk7XG4gICAgICAgICAgICBjbG9uZWRFbGVtZW50LnJlbW92ZUNsYXNzZXMoW011bHRpQ29sdW1uU3R5bGVDU1MuUmVnaW9uQ29udGVudCwgTXVsdGlDb2x1bW5MYXlvdXRDU1MuT3JpZ2luYWxFbGVtZW50VHlwZV0pO1xuICAgIFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNvbnRhaW5lckVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXJFbGVtZW50LmNoaWxkcmVuW2ldLmRldGFjaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZChvcmlnaW5hbEVsZW1lbnQpO1xuICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZChjbG9uZWRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdXAgdGhlIENTUyBjbGFzc2VzIGFuZCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYmFzZWQgb24gdGhlIHBhc3NlZCBzZXR0aW5ncy5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIHVzZXIgZGVmaW5lZCBzZXR0aW5ncyB0aGF0IGRldGVybWluZSB3aGF0IENTUyBpcyBzZXQgaGVyZS5cbiAgICAgKiBAcGFyYW0gbXVsdGlDb2x1bW5QYXJlbnQgVGhlIHBhcmVudCBvYmplY3QgdGhhdCB0aGUgY29sdW1uIGRpdnMgd2lsbCBiZSBjcmVhdGVkIHVuZGVyLlxuICAgICAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIGNvbHVtbiBkaXZzIGNyZWF0ZWQgdW5kZXIgdGhlIHBhc3NlZCBwYXJlbnQgZWxlbWVudC5cbiAgICAgKi9cbiAgICBnZXRDb2x1bW5Db250ZW50RGl2cyhzZXR0aW5nczogTXVsdGlDb2x1bW5TZXR0aW5ncywgbXVsdGlDb2x1bW5QYXJlbnQ6IEhUTUxEaXZFbGVtZW50KTogSFRNTERpdkVsZW1lbnRbXSB7XG5cbiAgICAgICAgbGV0IGNvbHVtbkNvbnRlbnREaXZzOiBIVE1MRGl2RWxlbWVudFtdID0gW11cbiAgICAgICAgbGV0IHN0eWxlU3RyOiBzdHJpbmcgPSBcIlwiXG4gICAgICAgIGlmKHNldHRpbmdzLmNvbHVtblNwYWNpbmcgIT09IFwiXCIpIHtcblxuICAgICAgICAgICAgc3R5bGVTdHIgPSBgbWFyZ2luLWlubGluZTogJHtzZXR0aW5ncy5jb2x1bW5TcGFjaW5nfTtgXG4gICAgICAgIH1cblxuICAgICAgICBpZihzZXR0aW5ncy5udW1iZXJPZkNvbHVtbnMgPT09IDIpIHtcblxuICAgICAgICAgICAgc3dpdGNoKHNldHRpbmdzLmNvbHVtbkxheW91dCkge1xuICAgICAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0LnN0YW5kYXJkKTpcbiAgICAgICAgICAgICAgICBjYXNlKENvbHVtbkxheW91dC5taWRkbGUpOlxuICAgICAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0LmNlbnRlcik6XG4gICAgICAgICAgICAgICAgY2FzZShDb2x1bW5MYXlvdXQudGhpcmQpOlxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2cy5wdXNoKG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGAke011bHRpQ29sdW1uU3R5bGVDU1MuQ29sdW1uQ29udGVudH0gJHtNdWx0aUNvbHVtbkxheW91dENTUy5Ud29FcXVhbENvbHVtbnN9YFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGBtY20tY29sdW1uLXNwYWNlcmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyOiB7XCJzdHlsZVwiOiBzdHlsZVN0cn1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXZzLnB1c2gobXVsdGlDb2x1bW5QYXJlbnQuY3JlYXRlRGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogYCR7TXVsdGlDb2x1bW5TdHlsZUNTUy5Db2x1bW5Db250ZW50fSAke011bHRpQ29sdW1uTGF5b3V0Q1NTLlR3b0VxdWFsQ29sdW1uc31gXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlKENvbHVtbkxheW91dC5sZWZ0KTpcbiAgICAgICAgICAgICAgICBjYXNlKENvbHVtbkxheW91dC5maXJzdCk6XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXZzLnB1c2gobXVsdGlDb2x1bW5QYXJlbnQuY3JlYXRlRGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogYCR7TXVsdGlDb2x1bW5TdHlsZUNTUy5Db2x1bW5Db250ZW50fSAke011bHRpQ29sdW1uTGF5b3V0Q1NTLlR3b0NvbHVtbkxhcmdlfWBcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBgbWNtLWNvbHVtbi1zcGFjZXJgLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cjoge1wic3R5bGVcIjogc3R5bGVTdHJ9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2cy5wdXNoKG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGAke011bHRpQ29sdW1uU3R5bGVDU1MuQ29sdW1uQ29udGVudH0gJHtNdWx0aUNvbHVtbkxheW91dENTUy5Ud29Db2x1bW5TbWFsbH1gXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlKENvbHVtbkxheW91dC5yaWdodCk6XG4gICAgICAgICAgICAgICAgY2FzZShDb2x1bW5MYXlvdXQuc2Vjb25kKTpcbiAgICAgICAgICAgICAgICBjYXNlKENvbHVtbkxheW91dC5sYXN0KTpcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnMucHVzaChtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBgJHtNdWx0aUNvbHVtblN0eWxlQ1NTLkNvbHVtbkNvbnRlbnR9ICR7TXVsdGlDb2x1bW5MYXlvdXRDU1MuVHdvQ29sdW1uU21hbGx9YFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGBtY20tY29sdW1uLXNwYWNlcmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyOiB7XCJzdHlsZVwiOiBzdHlsZVN0cn1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXZzLnB1c2gobXVsdGlDb2x1bW5QYXJlbnQuY3JlYXRlRGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogYCR7TXVsdGlDb2x1bW5TdHlsZUNTUy5Db2x1bW5Db250ZW50fSAke011bHRpQ29sdW1uTGF5b3V0Q1NTLlR3b0NvbHVtbkxhcmdlfWBcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKHNldHRpbmdzLm51bWJlck9mQ29sdW1ucyA9PT0gMykge1xuXG4gICAgICAgICAgICBzd2l0Y2goc2V0dGluZ3MuY29sdW1uTGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgY2FzZShDb2x1bW5MYXlvdXQuc3RhbmRhcmQpOlxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2cy5wdXNoKG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGAke011bHRpQ29sdW1uU3R5bGVDU1MuQ29sdW1uQ29udGVudH0gJHtNdWx0aUNvbHVtbkxheW91dENTUy5UaHJlZUVxdWFsQ29sdW1uc31gXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlDb2x1bW5QYXJlbnQuY3JlYXRlRGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogYG1jbS1jb2x1bW4tc3BhY2VyYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHI6IHtcInN0eWxlXCI6IHN0eWxlU3RyfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnMucHVzaChtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBgJHtNdWx0aUNvbHVtblN0eWxlQ1NTLkNvbHVtbkNvbnRlbnR9ICR7TXVsdGlDb2x1bW5MYXlvdXRDU1MuVGhyZWVFcXVhbENvbHVtbnN9YFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGBtY20tY29sdW1uLXNwYWNlcmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyOiB7XCJzdHlsZVwiOiBzdHlsZVN0cn1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXZzLnB1c2gobXVsdGlDb2x1bW5QYXJlbnQuY3JlYXRlRGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogYCR7TXVsdGlDb2x1bW5TdHlsZUNTUy5Db2x1bW5Db250ZW50fSAke011bHRpQ29sdW1uTGF5b3V0Q1NTLlRocmVlRXF1YWxDb2x1bW5zfWBcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0LmxlZnQpOlxuICAgICAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0LmZpcnN0KTpcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnMucHVzaChtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBgJHtNdWx0aUNvbHVtblN0eWxlQ1NTLkNvbHVtbkNvbnRlbnR9ICR7TXVsdGlDb2x1bW5MYXlvdXRDU1MuVGhyZWVDb2x1bW5fTGFyZ2V9YFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGBtY20tY29sdW1uLXNwYWNlcmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyOiB7XCJzdHlsZVwiOiBzdHlsZVN0cn1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXZzLnB1c2gobXVsdGlDb2x1bW5QYXJlbnQuY3JlYXRlRGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogYCR7TXVsdGlDb2x1bW5TdHlsZUNTUy5Db2x1bW5Db250ZW50fSAke011bHRpQ29sdW1uTGF5b3V0Q1NTLlRocmVlQ29sdW1uX1NtYWxsfWBcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBgbWNtLWNvbHVtbi1zcGFjZXJgLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cjoge1wic3R5bGVcIjogc3R5bGVTdHJ9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2cy5wdXNoKG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGAke011bHRpQ29sdW1uU3R5bGVDU1MuQ29sdW1uQ29udGVudH0gJHtNdWx0aUNvbHVtbkxheW91dENTUy5UaHJlZUNvbHVtbl9TbWFsbH1gXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlKENvbHVtbkxheW91dC5taWRkbGUpOlxuICAgICAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0LmNlbnRlcik6XG4gICAgICAgICAgICAgICAgY2FzZShDb2x1bW5MYXlvdXQuc2Vjb25kKTpcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnMucHVzaChtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBgJHtNdWx0aUNvbHVtblN0eWxlQ1NTLkNvbHVtbkNvbnRlbnR9ICR7TXVsdGlDb2x1bW5MYXlvdXRDU1MuVGhyZWVDb2x1bW5fU21hbGx9YFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGBtY20tY29sdW1uLXNwYWNlcmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyOiB7XCJzdHlsZVwiOiBzdHlsZVN0cn1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXZzLnB1c2gobXVsdGlDb2x1bW5QYXJlbnQuY3JlYXRlRGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogYCR7TXVsdGlDb2x1bW5TdHlsZUNTUy5Db2x1bW5Db250ZW50fSAke011bHRpQ29sdW1uTGF5b3V0Q1NTLlRocmVlQ29sdW1uX0xhcmdlfWBcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBgbWNtLWNvbHVtbi1zcGFjZXJgLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cjoge1wic3R5bGVcIjogc3R5bGVTdHJ9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2cy5wdXNoKG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGAke011bHRpQ29sdW1uU3R5bGVDU1MuQ29sdW1uQ29udGVudH0gJHtNdWx0aUNvbHVtbkxheW91dENTUy5UaHJlZUNvbHVtbl9TbWFsbH1gXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlKENvbHVtbkxheW91dC5yaWdodCk6XG4gICAgICAgICAgICAgICAgY2FzZShDb2x1bW5MYXlvdXQudGhpcmQpOlxuICAgICAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0Lmxhc3QpOlxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2cy5wdXNoKG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGAke011bHRpQ29sdW1uU3R5bGVDU1MuQ29sdW1uQ29udGVudH0gJHtNdWx0aUNvbHVtbkxheW91dENTUy5UaHJlZUNvbHVtbl9TbWFsbH1gXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlDb2x1bW5QYXJlbnQuY3JlYXRlRGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogYG1jbS1jb2x1bW4tc3BhY2VyYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHI6IHtcInN0eWxlXCI6IHN0eWxlU3RyfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnMucHVzaChtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBgJHtNdWx0aUNvbHVtblN0eWxlQ1NTLkNvbHVtbkNvbnRlbnR9ICR7TXVsdGlDb2x1bW5MYXlvdXRDU1MuVGhyZWVDb2x1bW5fU21hbGx9YFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGBtY20tY29sdW1uLXNwYWNlcmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyOiB7XCJzdHlsZVwiOiBzdHlsZVN0cn1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXZzLnB1c2gobXVsdGlDb2x1bW5QYXJlbnQuY3JlYXRlRGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogYCR7TXVsdGlDb2x1bW5TdHlsZUNTUy5Db2x1bW5Db250ZW50fSAke011bHRpQ29sdW1uTGF5b3V0Q1NTLlRocmVlQ29sdW1uX0xhcmdlfWBcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2x1bW5Db250ZW50RGl2cztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgcmVuZGVyUmVnaW9uRWxlbWVudHNUb1NjcmVlbigpOiB2b2lkO1xuICAgIHB1YmxpYyBhYnN0cmFjdCBleHBvcnRSZWdpb25FbGVtZW50c1RvUERGKHBkZlBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZDtcbiAgICBwdWJsaWMgYWJzdHJhY3QgcmVuZGVyUmVnaW9uRWxlbWVudHNUb0xpdmVQcmV2aWV3KHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZFxufVxuXG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRDbGllbnRIZWlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQsIHBhcmVudFJlbmRlckVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50KTogbnVtYmVyIHtcblxuICAgIGxldCBoZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICBpZihoZWlnaHQgPT09IDApIHtcbiAgICAgICAgcGFyZW50UmVuZGVyRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgaGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICAgICAgcGFyZW50UmVuZGVyRWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIGhlaWdodFxufSIsIi8qKlxuICogRmlsZTogL3NyYy9kb21fbWFuYWdlci9yZWdpb25hbF9tYW5hZ2Vycy9yZWdpb25ET01NYW5hZ2VyLnRzICAgICAgICAgICAgICAgICpcbiAqIENyZWF0ZWQgRGF0ZTogU3VuZGF5LCBNYXkgMjJuZCAyMDIyLCA3OjQ2IHBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gKiBBdXRob3I6IENhbWVyb24gUm9iaW5zb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAqIENvcHlyaWdodCAoYykgMjAyMiBDYW1lcm9uIFJvYmluc29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gKi9cblxuaW1wb3J0IHsgRE9NT2JqZWN0LCBET01PYmplY3RUYWcsIFRhc2tMaXN0RE9NT2JqZWN0IH0gZnJvbSAnLi4vZG9tT2JqZWN0JztcbmltcG9ydCB7IE11bHRpQ29sdW1uU2V0dGluZ3MsIENvbnRlbnRPdmVyZmxvd1R5cGUgfSBmcm9tIFwiLi4vLi4vcmVnaW9uU2V0dGluZ3NcIjtcbmltcG9ydCB7IE11bHRpQ29sdW1uTGF5b3V0Q1NTLCBNdWx0aUNvbHVtblN0eWxlQ1NTIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2Nzc0RlZmluaXRpb25zJztcbmltcG9ydCB7IE1hcmtkb3duUmVuZGVyQ2hpbGQgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBSZWdpb25NYW5hZ2VyIH0gZnJvbSAnLi9yZWdpb25NYW5hZ2VyJztcbmltcG9ydCB7IGdldEhlYWRpbmdDb2xsYXBzZUVsZW1lbnQgfSBmcm9tICdzcmMvdXRpbGl0aWVzL2VsZW1lbnRSZW5kZXJUeXBlUGFyc2VyJztcblxuZXhwb3J0IGNsYXNzIFN0YW5kYXJkTXVsdGlDb2x1bW5SZWdpb25NYW5hZ2VyIGV4dGVuZHMgUmVnaW9uTWFuYWdlciB7XG5cblxuICAgIHB1YmxpYyByZW5kZXJSZWdpb25FbGVtZW50c1RvU2NyZWVuKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMucmVuZGVyQ29sdW1uTWFya2Rvd24odGhpcy5yZWdpb25QYXJlbnQsIHRoaXMuZG9tTGlzdCwgdGhpcy5yZWdpb25hbFNldHRpbmdzKTtcbiAgICB9XG4gICAgcHVibGljIGV4cG9ydFJlZ2lvbkVsZW1lbnRzVG9QREYocGRmUGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcblxuICAgICAgICAvLyBEZWZhdWx0IHNldCBzaGFkb3cgdG8gb2ZmIGZvciBleHBvcnRpbmcgUERGc1xuICAgICAgICBsZXQgcmVuZGVyU2V0dGluZ3MgPSB0aGlzLnJlZ2lvbmFsU2V0dGluZ3M7XG4gICAgICAgIHJlbmRlclNldHRpbmdzLmRyYXdTaGFkb3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW5kZXJDb2x1bW5NYXJrZG93bihwZGZQYXJlbnRFbGVtZW50LCB0aGlzLmRvbUxpc3Quc2xpY2UoKSwgcmVuZGVyU2V0dGluZ3MpO1xuICAgIH1cbiAgICBwdWJsaWMgcmVuZGVyUmVnaW9uRWxlbWVudHNUb0xpdmVQcmV2aWV3KHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJDb2x1bW5NYXJrZG93bihwYXJlbnRFbGVtZW50LCB0aGlzLmRvbUxpc3QsIHRoaXMucmVnaW9uYWxTZXR0aW5ncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW4gdGhlIGRhdGEgZm9yIHRoZSBtdWx0aS1jb2x1bW4gcmVnaW9uIGFuZCBzZXRzIHVwIHRoZSBcbiAgICAgKiB1c2VyIGRlZmluZWQgbnVtYmVyIG9mIGNoaWxkcmVuIHdpdGggdGhlIHByb3BlciBjc3MgY2xhc3NlcyB0byBiZSByZW5kZXJlZCBwcm9wZXJseS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcGFyZW50RWxlbWVudCBUaGUgZWxlbWVudCB0aGF0IHRoZSBtdWx0aS1jb2x1bW4gcmVnaW9uIHdpbGwgYmUgcmVuZGVyZWQgdW5kZXIuXG4gICAgICogQHBhcmFtIHJlZ2lvbkVsZW1lbnRzIFRoZSBsaXN0IG9mIERPTSBvYmplY3RzIHRoYXQgd2lsbCBiZSBjb3BwaWVkIHVuZGVyIHRoZSBwYXJlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBzZXR0aW5ncyB0aGUgdXNlciBoYXMgZGVmaW5lZCBmb3IgdGhlIHJlZ2lvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckNvbHVtbk1hcmtkb3duKHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCByZWdpb25FbGVtZW50czogRE9NT2JqZWN0W10sIHNldHRpbmdzOiBNdWx0aUNvbHVtblNldHRpbmdzKSB7XG5cbiAgICAgICAgbGV0IG11bHRpQ29sdW1uUGFyZW50ID0gY3JlYXRlRGl2KHtcbiAgICAgICAgICAgIGNsczogTXVsdGlDb2x1bW5MYXlvdXRDU1MuUmVnaW9uQ29sdW1uQ29udGFpbmVyRGl2LFxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYXNzIG91ciBwYXJlbnQgZGl2IGFuZCBzZXR0aW5ncyB0byBwYXJzZXIgdG8gY3JlYXRlIHRoZSByZXF1aXJlZFxuICAgICAgICAgKiBjb2x1bW4gZGl2cyBhcyBjaGlsZHJlbiBvZiB0aGUgcGFyZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IGNvbHVtbkNvbnRlbnREaXZzID0gdGhpcy5nZXRDb2x1bW5Db250ZW50RGl2cyhzZXR0aW5ncywgbXVsdGlDb2x1bW5QYXJlbnQpO1xuICAgICAgICBpZihzZXR0aW5ncy5kcmF3U2hhZG93ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBtdWx0aUNvbHVtblBhcmVudC5hZGRDbGFzcyhNdWx0aUNvbHVtblN0eWxlQ1NTLlJlZ2lvblNoYWRvdyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGNvbHVtbkNvbnRlbnREaXZzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZihzZXR0aW5ncy5kcmF3Qm9yZGVyID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnNbaV0uYWRkQ2xhc3MoTXVsdGlDb2x1bW5TdHlsZUNTUy5Db2x1bW5Cb3JkZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihzZXR0aW5ncy5kcmF3U2hhZG93ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnNbaV0uYWRkQ2xhc3MoTXVsdGlDb2x1bW5TdHlsZUNTUy5Db2x1bW5TaGFkb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIG1hcmtkb3duIHJlbmRlcmVyIHRvIHBhcnNlIHRoZSBwYXNzZWQgbWFya2Rvd25cbiAgICAgICAgLy8gYmV0d2VlbiB0aGUgdGFncy5cbiAgICAgICAgbGV0IG1hcmtkb3duUmVuZGVyQ2hpbGQgPSBuZXcgTWFya2Rvd25SZW5kZXJDaGlsZChcbiAgICAgICAgICAgIG11bHRpQ29sdW1uUGFyZW50XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGV2ZXJ5IG90aGVyIGNoaWxkIGZyb20gdGhlIHBhcmVudCBzbyBcbiAgICAgICAgLy8gd2UgZG9udCBlbmQgdXAgd2l0aCBtdWx0aXBsZSBzZXRzIG9mIGRhdGEuIFRoaXMgc2hvdWxkXG4gICAgICAgIC8vIHJlYWxseSBvbmx5IG5lZWQgdG8gbG9vcCBvbmNlIGZvciBpID0gMCBidXQgbG9vcCBqdXN0XG4gICAgICAgIC8vIGluIGNhc2UuXG4gICAgICAgIGZvcihsZXQgaSA9IHBhcmVudEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuY2hpbGRyZW5baV0uZGV0YWNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChtYXJrZG93blJlbmRlckNoaWxkLmNvbnRhaW5lckVsKTtcblxuICAgICAgICB0aGlzLmFwcGVuZEVsZW1lbnRzVG9Db2x1bW5zKHJlZ2lvbkVsZW1lbnRzLCBjb2x1bW5Db250ZW50RGl2cywgc2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwZW5kRWxlbWVudHNUb0NvbHVtbnMocmVnaW9uRWxlbWVudHM6IERPTU9iamVjdFtdLCBjb2x1bW5Db250ZW50RGl2czogSFRNTERpdkVsZW1lbnRbXSwgc2V0dGluZ3M6IE11bHRpQ29sdW1uU2V0dGluZ3MpIHtcblxuICAgICAgICBsZXQgY29sdW1uSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZ2lvbkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgIGlmIChyZWdpb25FbGVtZW50c1tpXS50YWcgPT09IERPTU9iamVjdFRhZy5ub25lIHx8XG4gICAgICAgICAgICAgICAgcmVnaW9uRWxlbWVudHNbaV0udGFnID09PSBET01PYmplY3RUYWcuY29sdW1uQnJlYWspIHtcblxuICAgICAgICAgICAgICAgIC8vIFdlIHN0b3JlIHRoZSBlbGVtZW50cyBpbiBhIHdyYXBwZXIgY29udGFpbmVyIHVudGlsIHdlIGRldGVybWluZVxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gY3JlYXRlRGl2KHtcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBNdWx0aUNvbHVtbkxheW91dENTUy5Db2x1bW5EdWFsRWxlbWVudENvbnRhaW5lcixcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmKHNldHRpbmdzLmNvbnRlbnRPdmVyZmxvdyA9PT0gQ29udGVudE92ZXJmbG93VHlwZS5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hZGRDbGFzcyhNdWx0aUNvbHVtbkxheW91dENTUy5Db250ZW50T3ZlcmZsb3dIaWRkZW4pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKE11bHRpQ29sdW1uTGF5b3V0Q1NTLkNvbnRlbnRPdmVyZmxvd0F1dG9TY3JvbGwpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVnaW9uRWxlbWVudHNbaV0uZWxlbWVudENvbnRhaW5lciA9IGVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UganVzdCBtYWtlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgZWxlbWVudCB0byBkaXNwbGF5LlxuICAgICAgICAgICAgICAgIGxldCBjbG9uZWRFbGVtZW50ID0gcmVnaW9uRWxlbWVudHNbaV0ub3JpZ2luYWxFbGVtZW50LmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgICAgICAgICBsZXQgaGVhZGluZ0NvbGxhcHNlRWxlbWVudCA9IGdldEhlYWRpbmdDb2xsYXBzZUVsZW1lbnQoY2xvbmVkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYoaGVhZGluZ0NvbGxhcHNlRWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHJlbW92ZXMgdGhlIGNvbGxhcHNlIGFycm93IGZyb20gdGhlIHZpZXcgaWYgaXQgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICBoZWFkaW5nQ29sbGFwc2VFbGVtZW50LmRldGFjaCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlZ2lvbkVsZW1lbnRzW2ldLmNsb25lZEVsZW1lbnQgPSBjbG9uZWRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2xvbmVkRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVnaW9uRWxlbWVudHNbaV0gaW5zdGFuY2VvZiBUYXNrTGlzdERPTU9iamVjdCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZml4Q2xvbmVkQ2hlY2tMaXN0QnV0dG9ucyhyZWdpb25FbGVtZW50c1tpXSBhcyBUYXNrTGlzdERPTU9iamVjdCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT09IG51bGwgJiYgcmVnaW9uRWxlbWVudHNbaV0udGFnICE9PSBET01PYmplY3RUYWcuY29sdW1uQnJlYWspIHtcblxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2c1tjb2x1bW5JbmRleF0uYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogSWYgdGhlIHRhZyBpcyBhIGNvbHVtbiBicmVhayB3ZSB1cGRhdGUgdGhlIGNvbHVtbiBpbmRleCBhZnRlclxuICAgICAgICAgICAgICAgICAqIGFwcGVuZGluZyB0aGUgaXRlbSB0byB0aGUgY29sdW1uIGRpdi4gVGhpcyBrZWVwcyB0aGUgbWFpbiBET01cbiAgICAgICAgICAgICAgICAgKiBjbGVhbmVyIGJ5IHJlbW92aW5nIG90aGVyIGl0ZW1zIGFuZCBwbGFjaW5nIHRoZW0gYWxsIHdpdGhpblxuICAgICAgICAgICAgICAgICAqIGEgcmVnaW9uIGNvbnRhaW5lci5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBpZiAocmVnaW9uRWxlbWVudHNbaV0udGFnID09PSBET01PYmplY3RUYWcuY29sdW1uQnJlYWsgJiZcbiAgICAgICAgICAgICAgICAgICAgKGNvbHVtbkluZGV4ICsgMSkgPCBzZXR0aW5ncy5udW1iZXJPZkNvbHVtbnMpIHtcblxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuIiwiaW1wb3J0IHsgRE9NT2JqZWN0LCBET01PYmplY3RUYWcsIFRhc2tMaXN0RE9NT2JqZWN0IH0gZnJvbSAnLi4vZG9tT2JqZWN0JztcbmltcG9ydCB7IE11bHRpQ29sdW1uU2V0dGluZ3MsIENvbHVtbkxheW91dCwgU2luZ2xlQ29sdW1uU2l6ZSB9IGZyb20gXCIuLi8uLi9yZWdpb25TZXR0aW5nc1wiO1xuaW1wb3J0IHsgTXVsdGlDb2x1bW5MYXlvdXRDU1MsIE11bHRpQ29sdW1uU3R5bGVDU1MgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvY3NzRGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgTWFya2Rvd25SZW5kZXJDaGlsZCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IFJlZ2lvbk1hbmFnZXIgfSBmcm9tICcuL3JlZ2lvbk1hbmFnZXInO1xuaW1wb3J0IHsgZ2V0SGVhZGluZ0NvbGxhcHNlRWxlbWVudCB9IGZyb20gJ3NyYy91dGlsaXRpZXMvZWxlbWVudFJlbmRlclR5cGVQYXJzZXInO1xuXG5cbmV4cG9ydCBjbGFzcyBTaW5nbGVDb2x1bW5SZWdpb25NYW5hZ2VyIGV4dGVuZHMgUmVnaW9uTWFuYWdlciB7XG5cblxuICAgIHB1YmxpYyByZW5kZXJSZWdpb25FbGVtZW50c1RvU2NyZWVuKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMucmVuZGVyQ29sdW1uTWFya2Rvd24odGhpcy5yZWdpb25QYXJlbnQsIHRoaXMuZG9tTGlzdCwgdGhpcy5yZWdpb25hbFNldHRpbmdzKTtcbiAgICB9XG4gICAgcHVibGljIGV4cG9ydFJlZ2lvbkVsZW1lbnRzVG9QREYocGRmUGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcblxuICAgICAgICAvLyBEZWZhdWx0IHNldCBzaGFkb3cgdG8gb2ZmIGZvciBleHBvcnRpbmcgUERGc1xuICAgICAgICBsZXQgcmVuZGVyU2V0dGluZ3MgPSB0aGlzLnJlZ2lvbmFsU2V0dGluZ3M7XG4gICAgICAgIHJlbmRlclNldHRpbmdzLmRyYXdTaGFkb3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW5kZXJDb2x1bW5NYXJrZG93bihwZGZQYXJlbnRFbGVtZW50LCB0aGlzLmRvbUxpc3Quc2xpY2UoKSwgcmVuZGVyU2V0dGluZ3MpO1xuICAgIH1cbiAgICBwdWJsaWMgcmVuZGVyUmVnaW9uRWxlbWVudHNUb0xpdmVQcmV2aWV3KHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJDb2x1bW5NYXJrZG93bihwYXJlbnRFbGVtZW50LCB0aGlzLmRvbUxpc3QsIHRoaXMucmVnaW9uYWxTZXR0aW5ncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW4gdGhlIGRhdGEgZm9yIHRoZSBtdWx0aS1jb2x1bW4gcmVnaW9uIGFuZCBzZXRzIHVwIHRoZVxuICAgICAqIHVzZXIgZGVmaW5lZCBudW1iZXIgb2YgY2hpbGRyZW4gd2l0aCB0aGUgcHJvcGVyIGNzcyBjbGFzc2VzIHRvIGJlIHJlbmRlcmVkIHByb3Blcmx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmVudEVsZW1lbnQgVGhlIGVsZW1lbnQgdGhhdCB0aGUgbXVsdGktY29sdW1uIHJlZ2lvbiB3aWxsIGJlIHJlbmRlcmVkIHVuZGVyLlxuICAgICAqIEBwYXJhbSByZWdpb25FbGVtZW50cyBUaGUgbGlzdCBvZiBET00gb2JqZWN0cyB0aGF0IHdpbGwgYmUgY29wcGllZCB1bmRlciB0aGUgcGFyZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgc2V0dGluZ3MgdGhlIHVzZXIgaGFzIGRlZmluZWQgZm9yIHRoZSByZWdpb24uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlbmRlckNvbHVtbk1hcmtkb3duKHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCByZWdpb25FbGVtZW50czogRE9NT2JqZWN0W10sIHNldHRpbmdzOiBNdWx0aUNvbHVtblNldHRpbmdzKSB7XG5cbiAgICAgICAgbGV0IG11bHRpQ29sdW1uUGFyZW50ID0gY3JlYXRlRGl2KHtcbiAgICAgICAgICAgIGNsczogTXVsdGlDb2x1bW5MYXlvdXRDU1MuUmVnaW9uQ29sdW1uQ29udGFpbmVyRGl2LFxuICAgICAgICB9KTtcblxuICAgICAgICBpZihpc0xlZnRMYXlvdXQodGhpcy5yZWdpb25hbFNldHRpbmdzLmNvbHVtblBvc2l0aW9uKSl7XG4gICAgICAgICAgICBtdWx0aUNvbHVtblBhcmVudC5hZGRDbGFzcyhNdWx0aUNvbHVtbkxheW91dENTUy5TaW5nbGVDb2x1bW5MZWZ0TGF5b3V0KVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoaXNSaWdodExheW91dCh0aGlzLnJlZ2lvbmFsU2V0dGluZ3MuY29sdW1uUG9zaXRpb24pKSB7XG4gICAgICAgICAgICBtdWx0aUNvbHVtblBhcmVudC5hZGRDbGFzcyhNdWx0aUNvbHVtbkxheW91dENTUy5TaW5nbGVDb2x1bW5SaWdodExheW91dClcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG11bHRpQ29sdW1uUGFyZW50LmFkZENsYXNzKE11bHRpQ29sdW1uTGF5b3V0Q1NTLlNpbmdsZUNvbHVtbkNlbnRlckxheW91dClcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYXNzIG91ciBwYXJlbnQgZGl2IGFuZCBzZXR0aW5ncyB0byBwYXJzZXIgdG8gY3JlYXRlIHRoZSByZXF1aXJlZFxuICAgICAgICAgKiBjb2x1bW4gZGl2cyBhcyBjaGlsZHJlbiBvZiB0aGUgcGFyZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IGNvbHVtbkNvbnRlbnREaXYgPSB0aGlzLmNyZWF0ZUNvbHVtbkNvbnRlbnREaXZzKG11bHRpQ29sdW1uUGFyZW50KTtcbiAgICAgICAgaWYgKHNldHRpbmdzLmRyYXdCb3JkZXIgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXYuYWRkQ2xhc3MoTXVsdGlDb2x1bW5TdHlsZUNTUy5Db2x1bW5Cb3JkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR0aW5ncy5kcmF3U2hhZG93ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2LmFkZENsYXNzKE11bHRpQ29sdW1uU3R5bGVDU1MuQ29sdW1uU2hhZG93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBtYXJrZG93biByZW5kZXJlciB0byBwYXJzZSB0aGUgcGFzc2VkIG1hcmtkb3duXG4gICAgICAgIC8vIGJldHdlZW4gdGhlIHRhZ3MuXG4gICAgICAgIGxldCBtYXJrZG93blJlbmRlckNoaWxkID0gbmV3IE1hcmtkb3duUmVuZGVyQ2hpbGQoXG4gICAgICAgICAgICBtdWx0aUNvbHVtblBhcmVudFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlbW92ZSBldmVyeSBvdGhlciBjaGlsZCBmcm9tIHRoZSBwYXJlbnQgc28gXG4gICAgICAgIC8vIHdlIGRvbnQgZW5kIHVwIHdpdGggbXVsdGlwbGUgc2V0cyBvZiBkYXRhLiBUaGlzIHNob3VsZFxuICAgICAgICAvLyByZWFsbHkgb25seSBuZWVkIHRvIGxvb3Agb25jZSBmb3IgaSA9IDAgYnV0IGxvb3AganVzdFxuICAgICAgICAvLyBpbiBjYXNlLlxuICAgICAgICBmb3IgKGxldCBpID0gcGFyZW50RWxlbWVudC5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgcGFyZW50RWxlbWVudC5jaGlsZHJlbltpXS5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKG1hcmtkb3duUmVuZGVyQ2hpbGQuY29udGFpbmVyRWwpO1xuXG4gICAgICAgIHRoaXMuYXBwZW5kRWxlbWVudHNUb0NvbHVtbnMocmVnaW9uRWxlbWVudHMsIGNvbHVtbkNvbnRlbnREaXYsIHNldHRpbmdzKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXBwZW5kRWxlbWVudHNUb0NvbHVtbnMocmVnaW9uRWxlbWVudHM6IERPTU9iamVjdFtdLCBjb2x1bW5Db250ZW50RGl2OiBIVE1MRGl2RWxlbWVudCwgc2V0dGluZ3M6IE11bHRpQ29sdW1uU2V0dGluZ3MpIHtcblxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVnaW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICAgICAgaWYgKHJlZ2lvbkVsZW1lbnRzW2ldLnRhZyA9PT0gRE9NT2JqZWN0VGFnLm5vbmUgfHxcbiAgICAgICAgICAgICAgICByZWdpb25FbGVtZW50c1tpXS50YWcgPT09IERPTU9iamVjdFRhZy5jb2x1bW5CcmVhaykge1xuXG4gICAgICAgICAgICAgICAgLy8gV2Ugc3RvcmUgdGhlIGVsZW1lbnRzIGluIGEgd3JhcHBlciBjb250YWluZXIgdW50aWwgd2UgZGV0ZXJtaW5lXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBjcmVhdGVEaXYoe1xuICAgICAgICAgICAgICAgICAgICBjbHM6IE11bHRpQ29sdW1uTGF5b3V0Q1NTLkNvbHVtbkR1YWxFbGVtZW50Q29udGFpbmVyLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlZ2lvbkVsZW1lbnRzW2ldLmVsZW1lbnRDb250YWluZXIgPSBlbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGp1c3QgbWFrZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdG8gZGlzcGxheS5cbiAgICAgICAgICAgICAgICBsZXQgY2xvbmVkRWxlbWVudCA9IHJlZ2lvbkVsZW1lbnRzW2ldLm9yaWdpbmFsRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgbGV0IGhlYWRpbmdDb2xsYXBzZUVsZW1lbnQgPSBnZXRIZWFkaW5nQ29sbGFwc2VFbGVtZW50KGNsb25lZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmKGhlYWRpbmdDb2xsYXBzZUVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZW1vdmVzIHRoZSBjb2xsYXBzZSBhcnJvdyBmcm9tIHRoZSB2aWV3IGlmIGl0IGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgaGVhZGluZ0NvbGxhcHNlRWxlbWVudC5kZXRhY2goKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZWdpb25FbGVtZW50c1tpXS5jbG9uZWRFbGVtZW50ID0gY2xvbmVkRWxlbWVudDtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNsb25lZEVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZ2lvbkVsZW1lbnRzW2ldIGluc3RhbmNlb2YgVGFza0xpc3RET01PYmplY3QpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpeENsb25lZENoZWNrTGlzdEJ1dHRvbnMocmVnaW9uRWxlbWVudHNbaV0gYXMgVGFza0xpc3RET01PYmplY3QsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9PSBudWxsKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdi5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVDb2x1bW5Db250ZW50RGl2cyhtdWx0aUNvbHVtblBhcmVudDogSFRNTERpdkVsZW1lbnQpOiBIVE1MRGl2RWxlbWVudCB7XG5cbiAgICAgICAgbGV0IGNvbnRlbnREaXYgPSBtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xuICAgICAgICAgICAgY2xzOiBgJHtNdWx0aUNvbHVtblN0eWxlQ1NTLkNvbHVtbkNvbnRlbnR9YFxuICAgICAgICB9KTtcblxuICAgICAgICBpZih0aGlzLnJlZ2lvbmFsU2V0dGluZ3MuY29sdW1uU2l6ZSA9PT0gU2luZ2xlQ29sdW1uU2l6ZS5zbWFsbCkge1xuICAgICAgICAgICAgY29udGVudERpdi5hZGRDbGFzcyhgJHtNdWx0aUNvbHVtbkxheW91dENTUy5TaW5nbGVDb2x1bW5TbWFsbH1gKVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodGhpcy5yZWdpb25hbFNldHRpbmdzLmNvbHVtblNpemUgPT09IFNpbmdsZUNvbHVtblNpemUubGFyZ2UpIHtcbiAgICAgICAgICAgIGNvbnRlbnREaXYuYWRkQ2xhc3MoYCR7TXVsdGlDb2x1bW5MYXlvdXRDU1MuU2luZ2xlQ29sdW1uTGFyZ2V9YClcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnREaXYuYWRkQ2xhc3MoYCR7TXVsdGlDb2x1bW5MYXlvdXRDU1MuU2luZ2xlQ29sdW1uTWVkfWApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGVudERpdjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzQ2VudGVyZWQobGF5b3V0OiBDb2x1bW5MYXlvdXQpOiBib29sZWFuIHtcblxuICAgIGlmKGxheW91dCA9PT0gQ29sdW1uTGF5b3V0LnN0YW5kYXJkIHx8XG4gICAgICAgbGF5b3V0ID09PSBDb2x1bW5MYXlvdXQubWlkZGxlICAgfHxcbiAgICAgICBsYXlvdXQgPT09IENvbHVtbkxheW91dC5jZW50ZXIgICB8fFxuICAgICAgIGxheW91dCA9PT0gQ29sdW1uTGF5b3V0LnNlY29uZCAgICApIHtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gaXNMZWZ0TGF5b3V0KGxheW91dDogQ29sdW1uTGF5b3V0KTogYm9vbGVhbiB7XG5cbiAgICBpZihsYXlvdXQgPT09IENvbHVtbkxheW91dC5sZWZ0IHx8XG4gICAgICAgbGF5b3V0ID09PSBDb2x1bW5MYXlvdXQuZmlyc3QgKSB7XG4gXG4gICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgfVxuIFxuICAgICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gaXNSaWdodExheW91dChsYXlvdXQ6IENvbHVtbkxheW91dCk6IGJvb2xlYW4ge1xuXG4gICAgaWYobGF5b3V0ID09PSBDb2x1bW5MYXlvdXQucmlnaHQgfHxcbiAgICAgICBsYXlvdXQgPT09IENvbHVtbkxheW91dC50aGlyZCB8fFxuICAgICAgIGxheW91dCA9PT0gQ29sdW1uTGF5b3V0Lmxhc3QgKSB7XG4gXG4gICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgfVxuIFxuICAgICByZXR1cm4gZmFsc2Vcbn0iLCIvKipcbiAqIEZpbGU6IC9zcmMvZG9tX21hbmFnZXIvcmVnaW9uYWxfbWFuYWdlcnMvYXV0b0xheW91dFJlZ2lvbk1hbmFnZXIudHMgICAgICAgICAqXG4gKiBDcmVhdGVkIERhdGU6IFN1bmRheSwgTWF5IDIybmQgMjAyMiwgMTA6MjMgcG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogQXV0aG9yOiBDYW1lcm9uIFJvYmluc29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgQ2FtZXJvbiBSb2JpbnNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICovXG5cbmltcG9ydCB7IERPTU9iamVjdCwgRE9NT2JqZWN0VGFnLCBUYXNrTGlzdERPTU9iamVjdCB9IGZyb20gJy4uL2RvbU9iamVjdCc7XG5pbXBvcnQgeyBNdWx0aUNvbHVtblNldHRpbmdzIH0gZnJvbSBcIi4uLy4uL3JlZ2lvblNldHRpbmdzXCI7XG5pbXBvcnQgeyBNdWx0aUNvbHVtbkxheW91dENTUywgTXVsdGlDb2x1bW5TdHlsZUNTUyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9jc3NEZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBSZWdpb25NYW5hZ2VyIH0gZnJvbSAnLi9yZWdpb25NYW5hZ2VyJztcbmltcG9ydCB7IGdldEhlYWRpbmdDb2xsYXBzZUVsZW1lbnQsIGhhc0hlYWRlciB9IGZyb20gJ3NyYy91dGlsaXRpZXMvZWxlbWVudFJlbmRlclR5cGVQYXJzZXInO1xuXG5leHBvcnQgY2xhc3MgQXV0b0xheW91dFJlZ2lvbk1hbmFnZXIgZXh0ZW5kcyBSZWdpb25NYW5hZ2VyIHtcblxuICAgIHByaXZhdGUgcHJldmlvdXNDb2x1bW5IZWlnaHRzOiBudW1iZXJbXSA9IFtdXG5cbiAgICBwcml2YXRlIGNvbHVtblBhcmVudDogSFRNTERpdkVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBjb2x1bW5EaXZzOiBIVE1MRGl2RWxlbWVudFtdO1xuXG4gICAgcHVibGljIHJlbmRlclJlZ2lvbkVsZW1lbnRzVG9TY3JlZW4oKTogdm9pZCB7XG5cbiAgICAgICAgIHRoaXMucmVuZGVyQ29sdW1uTWFya2Rvd24odGhpcy5yZWdpb25QYXJlbnQsIHRoaXMuZG9tTGlzdCwgdGhpcy5yZWdpb25hbFNldHRpbmdzKTtcbiAgICB9XG4gICAgcHVibGljIGV4cG9ydFJlZ2lvbkVsZW1lbnRzVG9QREYocGRmUGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcblxuICAgICAgICAvLyBEZWZhdWx0IHNldCBzaGFkb3cgdG8gb2ZmIGZvciBleHBvcnRpbmcgUERGc1xuICAgICAgICBsZXQgcmVuZGVyU2V0dGluZ3MgPSB0aGlzLnJlZ2lvbmFsU2V0dGluZ3M7XG4gICAgICAgIHJlbmRlclNldHRpbmdzLmRyYXdTaGFkb3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW5kZXJDb2x1bW5NYXJrZG93bihwZGZQYXJlbnRFbGVtZW50LCB0aGlzLmRvbUxpc3Quc2xpY2UoKSwgcmVuZGVyU2V0dGluZ3MpO1xuICAgIH1cbiAgICBwdWJsaWMgcmVuZGVyUmVnaW9uRWxlbWVudHNUb0xpdmVQcmV2aWV3KHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJDb2x1bW5NYXJrZG93bihwYXJlbnRFbGVtZW50LCB0aGlzLmRvbUxpc3QsIHRoaXMucmVnaW9uYWxTZXR0aW5ncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW4gdGhlIGRhdGEgZm9yIHRoZSBtdWx0aS1jb2x1bW4gcmVnaW9uIGFuZCBzZXRzIHVwIHRoZSBcbiAgICAgKiB1c2VyIGRlZmluZWQgbnVtYmVyIG9mIGNoaWxkcmVuIHdpdGggdGhlIHByb3BlciBjc3MgY2xhc3NlcyB0byBiZSByZW5kZXJlZCBwcm9wZXJseS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcGFyZW50RWxlbWVudCBUaGUgZWxlbWVudCB0aGF0IHRoZSBtdWx0aS1jb2x1bW4gcmVnaW9uIHdpbGwgYmUgcmVuZGVyZWQgdW5kZXIuXG4gICAgICogQHBhcmFtIHJlZ2lvbkVsZW1lbnRzIFRoZSBsaXN0IG9mIERPTSBvYmplY3RzIHRoYXQgd2lsbCBiZSBjb3BwaWVkIHVuZGVyIHRoZSBwYXJlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBzZXR0aW5ncyB0aGUgdXNlciBoYXMgZGVmaW5lZCBmb3IgdGhlIHJlZ2lvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckNvbHVtbk1hcmtkb3duKHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCByZWdpb25FbGVtZW50czogRE9NT2JqZWN0W10sIHNldHRpbmdzOiBNdWx0aUNvbHVtblNldHRpbmdzKSB7XG5cbiAgICAgICAgbGV0IG11bHRpQ29sdW1uUGFyZW50ID0gY3JlYXRlRGl2KHtcbiAgICAgICAgICAgIGNsczogTXVsdGlDb2x1bW5MYXlvdXRDU1MuUmVnaW9uQ29sdW1uQ29udGFpbmVyRGl2LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb2x1bW5QYXJlbnQgPSBtdWx0aUNvbHVtblBhcmVudDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUGFzcyBvdXIgcGFyZW50IGRpdiBhbmQgc2V0dGluZ3MgdG8gcGFyc2VyIHRvIGNyZWF0ZSB0aGUgcmVxdWlyZWRcbiAgICAgICAgICogY29sdW1uIGRpdnMgYXMgY2hpbGRyZW4gb2YgdGhlIHBhcmVudC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1uRGl2cyA9IHRoaXMuZ2V0Q29sdW1uQ29udGVudERpdnMoc2V0dGluZ3MsIG11bHRpQ29sdW1uUGFyZW50KTtcblxuICAgICAgICBpZiAoc2V0dGluZ3MuZHJhd1NoYWRvdyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgbXVsdGlDb2x1bW5QYXJlbnQuYWRkQ2xhc3MoTXVsdGlDb2x1bW5TdHlsZUNTUy5SZWdpb25TaGFkb3cpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5EaXZzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuZHJhd0JvcmRlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uRGl2c1tpXS5hZGRDbGFzcyhNdWx0aUNvbHVtblN0eWxlQ1NTLkNvbHVtbkJvcmRlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5kcmF3U2hhZG93ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5EaXZzW2ldLmFkZENsYXNzKE11bHRpQ29sdW1uU3R5bGVDU1MuQ29sdW1uU2hhZG93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBldmVyeSBvdGhlciBjaGlsZCBmcm9tIHRoZSBwYXJlbnQgc28gXG4gICAgICAgIC8vIHdlIGRvbnQgZW5kIHVwIHdpdGggbXVsdGlwbGUgc2V0cyBvZiBkYXRhLiBUaGlzIHNob3VsZFxuICAgICAgICAvLyByZWFsbHkgb25seSBuZWVkIHRvIGxvb3Agb25jZSBmb3IgaSA9IDAgYnV0IGxvb3AganVzdFxuICAgICAgICAvLyBpbiBjYXNlLlxuICAgICAgICBmb3IgKGxldCBpID0gcGFyZW50RWxlbWVudC5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgcGFyZW50RWxlbWVudC5jaGlsZHJlbltpXS5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKG11bHRpQ29sdW1uUGFyZW50KTtcblxuICAgICAgICB0aGlzLmFwcGVuZEVsZW1lbnRzVG9Db2x1bW5zKHJlZ2lvbkVsZW1lbnRzLCB0aGlzLmNvbHVtbkRpdnMsIHNldHRpbmdzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGVuZEVsZW1lbnRzVG9Db2x1bW5zKHJlZ2lvbkVsZW1lbnRzOiBET01PYmplY3RbXSwgY29sdW1uQ29udGVudERpdnM6IEhUTUxEaXZFbGVtZW50W10sIHNldHRpbmdzOiBNdWx0aUNvbHVtblNldHRpbmdzKSB7XG5cbiAgICAgICAgZnVuY3Rpb24gYmFsYW5jZUVsZW1lbnRzKCkge1xuXG4gICAgICAgICAgICBsZXQgdG90YWxIZWlnaHQgPSByZWdpb25FbGVtZW50cy5tYXAoKGVsOiBET01PYmplY3QsIGluZGV4OiBudW1iZXIpID0+IHsgXG5cbiAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gYXR0ZW1wdCB0byB1cGRhdGUgdGhlIGVsZW1lbnRSZW5kZXJlZEhlaWdodCBpZiBpdCBpcyAwIGFuZCBpZiBpdCBpcyBub3QgYW4gdW5yZW5kZXJlZCBlbGVtZW50IHN1Y2ggYXMgYSBlbmRyZWdpb24gdGFnLlxuICAgICAgICAgICAgICAgIGlmKGVsLmVsZW1lbnRSZW5kZXJlZEhlaWdodCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBlbC50YWcgIT09IERPTU9iamVjdFRhZy5jb2x1bW5CcmVhayAmJlxuICAgICAgICAgICAgICAgICAgICBlbC50YWcgIT09IERPTU9iamVjdFRhZy5lbmRSZWdpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgZWwudGFnICE9PSBET01PYmplY3RUYWcucmVnaW9uU2V0dGluZ3MgJiZcbiAgICAgICAgICAgICAgICAgICAgZWwudGFnICE9PSBET01PYmplY3RUYWcuc3RhcnRSZWdpb24pIHtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGVsZW1lbnQgdG8gcmVuZGVyZWQgZGl2IHNvIHdlIGNhbiBleHRyYWN0IHRoZSByZW5kZXJlZCBoZWlnaHQuXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXZzWzBdLmFwcGVuZENoaWxkKGVsLm9yaWdpbmFsRWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgZWwuZWxlbWVudFJlbmRlcmVkSGVpZ2h0ID0gZWwub3JpZ2luYWxFbGVtZW50LmNsaWVudEhlaWdodFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2c1swXS5yZW1vdmVDaGlsZChlbC5vcmlnaW5hbEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiBlbC5lbGVtZW50UmVuZGVyZWRIZWlnaHQgXG4gICAgICAgICAgICB9KS5yZWR1Y2UoKHByZXY6IG51bWJlciwgY3VycjogbnVtYmVyKSA9PiB7IHJldHVybiBwcmV2ICsgY3VyciB9LCAwKTtcbiAgICAgICAgICAgIGxldCBtYXhDb2x1bW5Db250ZW50SGVpZ2h0ID0gTWF0aC50cnVuYyh0b3RhbEhlaWdodCAvIHNldHRpbmdzLm51bWJlck9mQ29sdW1ucyk7XG5cbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBjb2x1bW5Db250ZW50RGl2cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBjb2x1bW5Db250ZW50RGl2c1tpXS5jaGlsZHJlbi5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2c1tpXS5jaGlsZHJlbltqXS5kZXRhY2goKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjb2x1bW5JbmRleCA9IDA7XG4gICAgICAgICAgICBsZXQgY3VycmVudENvbHVtbkhlaWdodCA9IDA7XG4gICAgICAgICAgICBmdW5jdGlvbiBjaGVja1Nob3VsZFN3aXRjaENvbHVtbnMobmV4dEVsZW1lbnRIZWlnaHQ6IG51bWJlcikge1xuICAgIFxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29sdW1uSGVpZ2h0ICsgbmV4dEVsZW1lbnRIZWlnaHQgPiBtYXhDb2x1bW5Db250ZW50SGVpZ2h0ICYmXG4gICAgICAgICAgICAgICAgICAgIChjb2x1bW5JbmRleCArIDEpIDwgc2V0dGluZ3MubnVtYmVyT2ZDb2x1bW5zKSB7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb2x1bW5IZWlnaHQgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWdpb25FbGVtZW50cy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZ2lvbkVsZW1lbnRzW2ldLnRhZyA9PT0gRE9NT2JqZWN0VGFnLm5vbmUgfHxcbiAgICAgICAgICAgICAgICAgICAgcmVnaW9uRWxlbWVudHNbaV0udGFnID09PSBET01PYmplY3RUYWcuY29sdW1uQnJlYWspIHtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIEhlcmUgd2UgY2hlY2sgaWYgd2UgbmVlZCB0byBzd2FwIHRvIHRoZSBuZXh0IGNvbHVtbiBmb3IgdGhlIGN1cnJlbnQgZWxlbWVudC5cbiAgICAgICAgICAgICAgICAgICAgICogSWYgdGhlIHVzZXIgd2FudHMgdG8ga2VlcCBoZWFkaW5ncyB3aXRoIHRoZSBjb250ZW50IGJlbG93IGl0IHdlIGFsc28gbWFrZSBzdXJlXG4gICAgICAgICAgICAgICAgICAgICAqIHRoYXQgdGhlIGxhc3QgaXRlbSBpbiBhIGNvbHVtbiBpcyBub3QgYSBoZWFkZXIgZWxlbWVudCBieSB1c2luZyB0aGUgaGVhZGVyIGFuZFxuICAgICAgICAgICAgICAgICAgICAgKiB0aGUgbmV4dCBlbGVtZW50J3MgaGVpZ2h0IGFzIHRoZSBoZWlnaHQgdmFsdWUuIFxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgaWYoaGFzSGVhZGVyKHJlZ2lvbkVsZW1lbnRzW2ldLm9yaWdpbmFsRWxlbWVudCkgPT09IHRydWUpIHsgLy8gVE9ETzogQWRkIHRoaXMgYXMgc2VsZWN0YWJsZSBvcHRpb24uXG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZGVyQW5kTmV4dEVsZW1lbnRIZWlnaHQgPSByZWdpb25FbGVtZW50c1tpXS5lbGVtZW50UmVuZGVyZWRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihpIDwgcmVnaW9uRWxlbWVudHMubGVuZ3RoIC0gMSkge1xuICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckFuZE5leHRFbGVtZW50SGVpZ2h0ICs9IHJlZ2lvbkVsZW1lbnRzW2kgKyAxXS5lbGVtZW50UmVuZGVyZWRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1Nob3VsZFN3aXRjaENvbHVtbnMoaGVhZGVyQW5kTmV4dEVsZW1lbnRIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTaG91bGRTd2l0Y2hDb2x1bW5zKHJlZ2lvbkVsZW1lbnRzW2ldLmVsZW1lbnRSZW5kZXJlZEhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbHVtbkhlaWdodCArPSByZWdpb25FbGVtZW50c1tpXS5lbGVtZW50UmVuZGVyZWRIZWlnaHRcbiAgICBcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIFdlIHN0b3JlIHRoZSBlbGVtZW50cyBpbiBhIHdyYXBwZXIgY29udGFpbmVyIHVudGlsIHdlIGRldGVybWluZSBpZiB3ZSB3YW50IHRvIFxuICAgICAgICAgICAgICAgICAgICAgKiB1c2UgdGhlIG9yaWdpbmFsIGVsZW1lbnQgb3IgYSBjbG9uZSBvZiB0aGUgZWxlbWVudC4gVGhpcyBoZWxwcyB1cyBieSBhbGxvd2luZyBcbiAgICAgICAgICAgICAgICAgICAgICogdXMgdG8gY3JlYXRlIGEgdmlzdWFsIG9ubHkgY2xvbmUgd2hpbGUgdGhlIHVwZGF0ZSBsb29wIG1vdmVzIHRoZSBvcmlnaW5hbCBlbGVtZW50IFxuICAgICAgICAgICAgICAgICAgICAgKiBpbnRvIHRoZSBjb2x1bW5zLlxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBjcmVhdGVEaXYoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBNdWx0aUNvbHVtbkxheW91dENTUy5Db2x1bW5EdWFsRWxlbWVudENvbnRhaW5lcixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lvbkVsZW1lbnRzW2ldLmVsZW1lbnRDb250YWluZXIgPSBlbGVtZW50O1xuICAgIFxuICAgICAgICAgICAgICAgICAgICBsZXQgY2xvbmVkRWxlbWVudCA9IHJlZ2lvbkVsZW1lbnRzW2ldLmNsb25lZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmKHJlZ2lvbkVsZW1lbnRzW2ldLmNsb25lZEVsZW1lbnQgPT09IG51bGwpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkRWxlbWVudCA9IHJlZ2lvbkVsZW1lbnRzW2ldLm9yaWdpbmFsRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZGluZ0NvbGxhcHNlRWxlbWVudCA9IGdldEhlYWRpbmdDb2xsYXBzZUVsZW1lbnQoY2xvbmVkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihoZWFkaW5nQ29sbGFwc2VFbGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZW1vdmVzIHRoZSBjb2xsYXBzZSBhcnJvdyBmcm9tIHRoZSB2aWV3IGlmIGl0IGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkaW5nQ29sbGFwc2VFbGVtZW50LmRldGFjaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkVsZW1lbnRzW2ldLmNsb25lZEVsZW1lbnQgPSBjbG9uZWRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2xvbmVkRWxlbWVudCk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWdpb25FbGVtZW50c1tpXSBpbnN0YW5jZW9mIFRhc2tMaXN0RE9NT2JqZWN0KSB7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpeENsb25lZENoZWNrTGlzdEJ1dHRvbnMocmVnaW9uRWxlbWVudHNbaV0gYXMgVGFza0xpc3RET01PYmplY3QsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9PSBudWxsICYmIFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnNbY29sdW1uSW5kZXhdICYmIFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uRWxlbWVudHNbaV0udGFnICE9PSBET01PYmplY3RUYWcuY29sdW1uQnJlYWspIHtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXZzW2NvbHVtbkluZGV4XS5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkVsZW1lbnRzW2ldLmVsZW1lbnRSZW5kZXJlZEhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBJZiB0aGUgdGFnIGlzIGEgY29sdW1uIGJyZWFrIHdlIHVwZGF0ZSB0aGUgY29sdW1uIGluZGV4IGFmdGVyXG4gICAgICAgICAgICAgICAgICAgICAqIGFwcGVuZGluZyB0aGUgaXRlbSB0byB0aGUgY29sdW1uIGRpdi4gVGhpcyBrZWVwcyB0aGUgbWFpbiBET01cbiAgICAgICAgICAgICAgICAgICAgICogY2xlYW5lciBieSByZW1vdmluZyBvdGhlciBpdGVtcyBhbmQgcGxhY2luZyB0aGVtIGFsbCB3aXRoaW5cbiAgICAgICAgICAgICAgICAgICAgICogYSByZWdpb24gY29udGFpbmVyLlxuICAgICAgICAgICAgICAgICAgICAgKiBcbiAgICAgICAgICAgICAgICAgICAgICogUmVtb3ZpbmcgdGhlIGVuZCBjb2x1bW4gdGFnIGFzIGFuIG9wdGlvbiBmb3Igbm93LlxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHJlZ2lvbkVsZW1lbnRzW2ldLnRhZyA9PT0gRE9NT2JqZWN0VGFnLmNvbHVtbkJyZWFrICYmXG4gICAgICAgICAgICAgICAgICAgIC8vICAgIChjb2x1bW5JbmRleCArIDEpIDwgc2V0dGluZ3MubnVtYmVyT2ZDb2x1bW5zKSB7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBjb2x1bW5JbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgY3VycmVudENvbHVtbkhlaWdodCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQXR0ZW1wdCB0byBiYWxhbmNlZCB0aGUgZWxlbWVudHMuIFdlIG5lZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBtdWx0aXBsZSB0aW1lcyBiZWNhdXNlXG4gICAgICAgICAqIG91ciBpbml0aWFsIGJhbGFuY2UgZXN0aW1hdGUgbWF5IG5vdCBiZSBwZXJmZWN0bHkgYmFsYW5jZWQgZHVlIHRvIGRpZmZlcmVudCBjb2x1bW4gd2lkdGhzIGNhdXNpbmcgXG4gICAgICAgICAqIGVsZW1lbnRzIHdpdGhpbiB0aGVtIHRvIGJlIG9mIGRpZmZlcmVudCBoZWlnaHRzLiBUaGlzIGNhbiBjYXVzZSB0aGUgZWxlbWVudHMgdG8ganVtcCBhcm91bmQgb24gXG4gICAgICAgICAqIHN1YnNpcXVlbnQgdXBkYXRlIGxvb3BzIHdoaWNoIGlzIG5vdCBpZGVhbC4gSGVyZSB3ZSByZW5kZXIgdGhlIGVsZW1lbnRzIHRvIHRoZSBzY3JlZW4gYW5kIHVwZGF0ZSBcbiAgICAgICAgICogdGhlaXIgaGVpZ2h0IGFmdGVyIGJlaW5nIHJlbmRlcmVkIGludG8gdGhlIGVzdGltYXRlZCBwb3NpdGlvbi4gXG4gICAgICAgICAqIFxuICAgICAgICAgKiBPbmNlIGV2ZXJ5dGhpbmcgaXMgcmVuZGVyZWQgd2UgY2hlY2sgYWxsIG9mIHRoZSBjb2x1bW4gaGVpZ2h0cyBhZ2FpbnN0IG91ciBsYXN0IGl0ZXJhdGlvbiBhbmQgXG4gICAgICAgICAqIGlmIG5vdGhpbmcgaGFzIGNoYW5nZWQgd2Uga25vdyB3ZSBhcmUgYmFsYW5jZWQuXG4gICAgICAgICAqIFxuICAgICAgICAgKiBUaGVyZSBpcyBwcm9iYWJseSBhIGJldHRlciB3YXkgb2YgYWNjb21wbGlzaGluZyB0aGlzIHRhc2sgYnV0IHRoaXMgd29ya3MgZm9yIHRoZSB0aW1lIGJlaW5nLlxuICAgICAgICAgKi9cbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IDU7IGkrKykge1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBiYWxhbmNlRWxlbWVudHMoKVxuXG4gICAgICAgICAgICBsZXQgYmFsYW5jZWQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yKGxldCBqID0gMDsgaiA8IGNvbHVtbkNvbnRlbnREaXZzLmxlbmd0aDsgaisrKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29sdW1uIGhlaWdodHMgYXJlIHVuZGVmaW5lZCB3ZSBzZXQgZGVmYXVsdCB0byB6ZXJvIHNvIG5vdCB0byBlbmNvdW50ZXIgYW4gZXJyb3IuXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMucHJldmlvdXNDb2x1bW5IZWlnaHRzW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNDb2x1bW5IZWlnaHRzLnB1c2goMClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHJlbmRlciBoZWlnaHQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBoZWlnaHQgd2UgYXJlIHN0aWxsIGJhbGFuY2luZy5cbiAgICAgICAgICAgICAgICBpZih0aGlzLnByZXZpb3VzQ29sdW1uSGVpZ2h0c1tqXSAhPT0gY29sdW1uQ29udGVudERpdnNbal0uY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNDb2x1bW5IZWlnaHRzW2pdID0gY29sdW1uQ29udGVudERpdnNbal0uY2xpZW50SGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgIGJhbGFuY2VkID0gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHdlIG1hZGUgaXQgb3V0IG9mIHRoZSBsb29wIGFuZCBhbGwgb2YgdGhlIGNvbHVtbnMgYXJlIHRoZSBzYW1lIGhlaWdodCBhcyBsYXN0IHVwZGF0ZVxuICAgICAgICAgICAgLy8gd2UncmUgYmFsYW5jZWQgc28gd2UgY2FuIGJyZWFrIG91dCBvZiB0aGUgbG9vcC5cbiAgICAgICAgICAgIGlmKGJhbGFuY2VkID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlUmVuZGVyZWRNYXJrZG93bigpIHtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZG9tTGlzdC5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICBsZXQgZWwgPSB0aGlzLmRvbUxpc3RbaV1cbiAgICAgICAgICAgIGxldCBvcmlnaW5hbENsaWVudEhlaWdodCA9IDA7XG4gICAgICAgICAgICBpZiAoZWwub3JpZ2luYWxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxDbGllbnRIZWlnaHQgPSBlbC5vcmlnaW5hbEVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2xvbmVkQ2xpZW50SGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIGlmIChlbC5jbG9uZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY2xvbmVkQ2xpZW50SGVpZ2h0ID0gZWwuY2xvbmVkRWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsQ2xpZW50SGVpZ2h0IDwgY2xvbmVkQ2xpZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb21MaXN0W2ldLmVsZW1lbnRSZW5kZXJlZEhlaWdodCA9IGNsb25lZENsaWVudEhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tTGlzdFtpXS5lbGVtZW50UmVuZGVyZWRIZWlnaHQgPSBvcmlnaW5hbENsaWVudEhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWxpZENvbHVtbnMgPSB0cnVlO1xuICAgICAgICBpZih0aGlzLmNvbHVtblBhcmVudCAhPT0gbnVsbCAmJiB0aGlzLmNvbHVtbkRpdnMgIT09IG51bGwgJiYgdGhpcy5jb2x1bW5EaXZzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHRoaXMuY29sdW1uRGl2cy5sZW5ndGggPT09IHRoaXMucmVnaW9uYWxTZXR0aW5ncy5udW1iZXJPZkNvbHVtbnMpIHtcblxuICAgICAgICAgICAgbGV0IHRvdGFsSGVpZ2h0ID0gdGhpcy5kb21MaXN0Lm1hcCgoZWw6IERPTU9iamVjdCwgaW5kZXg6IG51bWJlcikgPT4geyBcblxuICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgd2FudCB0byBhdHRlbXB0IHRvIHVwZGF0ZSB0aGUgZWxlbWVudFJlbmRlcmVkSGVpZ2h0IGlmIGl0IGlzIDAgYW5kIGlmIGl0IGlzIG5vdCBhbiB1bnJlbmRlcmVkIGVsZW1lbnQgc3VjaCBhcyBhIGVuZHJlZ2lvbiB0YWcuXG4gICAgICAgICAgICAgICAgaWYoZWwuZWxlbWVudFJlbmRlcmVkSGVpZ2h0ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGVsLnRhZyAhPT0gRE9NT2JqZWN0VGFnLmNvbHVtbkJyZWFrICYmXG4gICAgICAgICAgICAgICAgICAgIGVsLnRhZyAhPT0gRE9NT2JqZWN0VGFnLmVuZFJlZ2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICBlbC50YWcgIT09IERPTU9iamVjdFRhZy5yZWdpb25TZXR0aW5ncyAmJlxuICAgICAgICAgICAgICAgICAgICBlbC50YWcgIT09IERPTU9iamVjdFRhZy5zdGFydFJlZ2lvbikge1xuICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgZWxlbWVudCB0byByZW5kZXJlZCBkaXYgc28gd2UgY2FuIGV4dHJhY3QgdGhlIHJlbmRlcmVkIGhlaWdodC5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5QYXJlbnQuYXBwZW5kQ2hpbGQoZWwub3JpZ2luYWxFbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICBlbC5lbGVtZW50UmVuZGVyZWRIZWlnaHQgPSBlbC5vcmlnaW5hbEVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uUGFyZW50LnJlbW92ZUNoaWxkKGVsLm9yaWdpbmFsRWxlbWVudClcbiAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsLmVsZW1lbnRSZW5kZXJlZEhlaWdodCBcbiAgICAgICAgICAgIH0pLnJlZHVjZSgocHJldjogbnVtYmVyLCBjdXJyOiBudW1iZXIpID0+IHsgcmV0dXJuIHByZXYgKyBjdXJyIH0sIDApO1xuICAgICAgICAgICAgbGV0IG1heENvbHVtbkNvbnRlbnRIZWlnaHQgPSBNYXRoLnRydW5jKHRvdGFsSGVpZ2h0IC8gdGhpcy5yZWdpb25hbFNldHRpbmdzLm51bWJlck9mQ29sdW1ucyk7XG5cbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbkRpdnMubGVuZ3RoIC0gMTsgaSsrKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgY29sdW1uSGVpZ2h0ID0gMFxuICAgICAgICAgICAgICAgIGZvcihsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbkRpdnNbaV0uY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uSGVpZ2h0ICs9IHRoaXMuY29sdW1uRGl2c1tpXS5jaGlsZHJlbltqXS5jbGllbnRIZWlnaHRcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZihjb2x1bW5IZWlnaHQgPiBtYXhDb2x1bW5Db250ZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkQ29sdW1ucyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZih2YWxpZENvbHVtbnMgPT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ29sdW1uTWFya2Rvd24odGhpcy5yZWdpb25QYXJlbnQsIHRoaXMuZG9tTGlzdCwgdGhpcy5yZWdpb25hbFNldHRpbmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLnVwZGF0ZVJlbmRlcmVkTWFya2Rvd24oKTtcbiAgICB9XG59XG5cbiIsIi8qKlxuICogRmlsZTogL3NyYy9kb21fbWFuYWdlci9yZWdpb25hbF9tYW5hZ2Vycy9yZWdpb25NYW5hZ2VyQ29udGFpbmVyLnRzICAgICAgICAgICpcbiAqIENyZWF0ZWQgRGF0ZTogU3VuZGF5LCBNYXkgMjJuZCAyMDIyLCA3OjUwIHBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gKiBBdXRob3I6IENhbWVyb24gUm9iaW5zb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAqIENvcHlyaWdodCAoYykgMjAyMiBDYW1lcm9uIFJvYmluc29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gKi9cblxuaW1wb3J0IHsgcGFyc2VDb2x1bW5TZXR0aW5ncywgcGFyc2VTaW5nbGVDb2x1bW5TZXR0aW5ncyB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvc2V0dGluZ3NQYXJzZXJcIjtcbmltcG9ydCB7IERPTU9iamVjdCB9IGZyb20gJy4uL2RvbU9iamVjdCc7XG5pbXBvcnQgeyBNdWx0aUNvbHVtblNldHRpbmdzLCBnZXREZWZhdWx0TXVsdGlDb2x1bW5TZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9yZWdpb25TZXR0aW5nc1wiO1xuaW1wb3J0IHsgRmlsZURPTU1hbmFnZXIgfSBmcm9tICcuLi9kb21NYW5hZ2VyJztcbmltcG9ydCB7IFN0YW5kYXJkTXVsdGlDb2x1bW5SZWdpb25NYW5hZ2VyIGFzIFN0YW5kYXJkTXVsdGlDb2x1bW5SZWdpb25NYW5hZ2VyIH0gZnJvbSAnLi9zdGFuZGFyZE11bHRpQ29sdW1uUmVnaW9uTWFuYWdlcic7XG5pbXBvcnQgeyBTaW5nbGVDb2x1bW5SZWdpb25NYW5hZ2VyIH0gZnJvbSBcIi4vc2luZ2xlQ29sdW1uUmVnaW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgUmVnaW9uTWFuYWdlciB9IGZyb20gXCIuL3JlZ2lvbk1hbmFnZXJcIjtcbmltcG9ydCB7IEF1dG9MYXlvdXRSZWdpb25NYW5hZ2VyIH0gZnJvbSAnLi9hdXRvTGF5b3V0UmVnaW9uTWFuYWdlcic7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBhY3RzIGFzIGFuIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHJlZ2lvbmFsIG1hbmFnZXIuIEl0IGlzIHVzZWQgdG8gdXBkYXRlIHRoZVxuICogc3ViY2xhc3Mgb2YgUmVnaW9uYWxNYW5hZ2VyIGRlcGVuZGluZyBvbiB1c2VyIHByZWZlcmVuY2VzIHRvIG1ha2UgcmVuZGVyaW5nIG1vcmUgc2ltcGxpZmllZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lvbk1hbmFnZXJDb250YWluZXIge1xuXG4gICAgcHJvdGVjdGVkIHJlZ2lvbjogUmVnaW9uTWFuYWdlcjtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnRGaWxlTWFuYWdlcjogRmlsZURPTU1hbmFnZXIsIHJlZ2lvbktleTogc3RyaW5nLCByb290RWxlbWVudDogSFRNTEVsZW1lbnQsIHJlZ2lvblBhcmVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5yZWdpb24gPSBuZXcgU3RhbmRhcmRNdWx0aUNvbHVtblJlZ2lvbk1hbmFnZXIoY3JlYXRlRGVmYXVsdFJlZ2lvbk1hbmFnZXJEYXRhKHJlZ2lvblBhcmVudCwgcGFyZW50RmlsZU1hbmFnZXIsIHJlZ2lvbktleSwgcm9vdEVsZW1lbnQpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVnaW9uKCk6IFJlZ2lvbk1hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWdpb247XG4gICAgfVxuXG4gICAgcHVibGljIHNldFJlZ2lvblNldHRpbmdzKHNldHRpbmdzVGV4dDogc3RyaW5nKTogUmVnaW9uTWFuYWdlciB7XG5cbiAgICAgICAgbGV0IHJlZ2lvbmFsU2V0dGluZ3MgPSBwYXJzZUNvbHVtblNldHRpbmdzKHNldHRpbmdzVGV4dCk7XG4gICAgICAgIGlmIChyZWdpb25hbFNldHRpbmdzLm51bWJlck9mQ29sdW1ucyA9PT0gMSkge1xuXG4gICAgICAgICAgICByZWdpb25hbFNldHRpbmdzID0gcGFyc2VTaW5nbGVDb2x1bW5TZXR0aW5ncyhzZXR0aW5nc1RleHQsIHJlZ2lvbmFsU2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVnaW9uLnNldFJlZ2lvbmFsU2V0dGluZ3MocmVnaW9uYWxTZXR0aW5ncyk7XG5cbiAgICAgICAgaWYgKHJlZ2lvbmFsU2V0dGluZ3MubnVtYmVyT2ZDb2x1bW5zID09PSAxKSB7XG5cbiAgICAgICAgICAgIGlmKHRoaXMucmVnaW9uIGluc3RhbmNlb2YgU2luZ2xlQ29sdW1uUmVnaW9uTWFuYWdlciA9PT0gZmFsc2UpIHtcblxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJDb252ZXJ0aW5nIHJlZ2lvbiB0byBzaW5nbGUgY29sdW1uLlwiKVxuICAgICAgICAgICAgICAgIHRoaXMuY29udmVydFRvU2luZ2xlQ29sdW1uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihyZWdpb25hbFNldHRpbmdzLmF1dG9MYXlvdXQgPT09IHRydWUpIHtcblxuICAgICAgICAgICAgaWYodGhpcy5yZWdpb24gaW5zdGFuY2VvZiBBdXRvTGF5b3V0UmVnaW9uTWFuYWdlciA9PT0gZmFsc2UpIHtcblxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJDb252ZXJ0aW5nIHJlZ2lvbiB0byBhdXRvIGxheW91dC5cIilcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnZlcnRUb0F1dG9MYXlvdXQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJlZ2lvbmFsU2V0dGluZ3MubnVtYmVyT2ZDb2x1bW5zID49IDIpIHtcblxuICAgICAgICAgICAgaWYodGhpcy5yZWdpb24gaW5zdGFuY2VvZiBTdGFuZGFyZE11bHRpQ29sdW1uUmVnaW9uTWFuYWdlciA9PT0gZmFsc2UpIHtcblxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJDb252ZXJ0aW5nIHJlZ2lvbiB0byBzdGFuZGFyZCBtdWx0aS1jb2x1bW5cIilcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnZlcnRUb1N0YW5kYXJkTXVsdGlDb2x1bW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lvbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbnZlcnRUb1NpbmdsZUNvbHVtbigpOiBTaW5nbGVDb2x1bW5SZWdpb25NYW5hZ2VyIHtcblxuICAgICAgICBsZXQgZGF0YSA9IHRoaXMucmVnaW9uLmdldFJlZ2lvbkRhdGEoKTtcbiAgICAgICAgdGhpcy5yZWdpb24gPSBuZXcgU2luZ2xlQ29sdW1uUmVnaW9uTWFuYWdlcihkYXRhKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpb24gYXMgU2luZ2xlQ29sdW1uUmVnaW9uTWFuYWdlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbnZlcnRUb1N0YW5kYXJkTXVsdGlDb2x1bW4oKTogU3RhbmRhcmRNdWx0aUNvbHVtblJlZ2lvbk1hbmFnZXIge1xuXG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5yZWdpb24uZ2V0UmVnaW9uRGF0YSgpO1xuICAgICAgICB0aGlzLnJlZ2lvbiA9IG5ldyBTdGFuZGFyZE11bHRpQ29sdW1uUmVnaW9uTWFuYWdlcihkYXRhKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpb24gYXMgU3RhbmRhcmRNdWx0aUNvbHVtblJlZ2lvbk1hbmFnZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb252ZXJ0VG9BdXRvTGF5b3V0KCk6IEF1dG9MYXlvdXRSZWdpb25NYW5hZ2VyIHtcblxuICAgICAgICBsZXQgZGF0YSA9IHRoaXMucmVnaW9uLmdldFJlZ2lvbkRhdGEoKTtcbiAgICAgICAgdGhpcy5yZWdpb24gPSBuZXcgQXV0b0xheW91dFJlZ2lvbk1hbmFnZXIoZGF0YSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaW9uIGFzIEF1dG9MYXlvdXRSZWdpb25NYW5hZ2VyO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdFJlZ2lvbk1hbmFnZXJEYXRhKHJlZ2lvblBhcmVudDogSFRNTEVsZW1lbnQsIGZpbGVNYW5hZ2VyOiBGaWxlRE9NTWFuYWdlciwgcmVnaW9uS2V5OiBzdHJpbmcsIHJvb3RFbGVtZW50OiBIVE1MRWxlbWVudCk6IFJlZ2lvbk1hbmFnZXJEYXRhIHtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGRvbUxpc3Q6IFtdLFxuICAgICAgICBkb21PYmplY3RNYXA6IG5ldyBNYXAoKSxcbiAgICAgICAgcmVnaW9uUGFyZW50OiByZWdpb25QYXJlbnQsXG4gICAgICAgIGZpbGVNYW5hZ2VyOiBmaWxlTWFuYWdlcixcbiAgICAgICAgcmVnaW9uYWxTZXR0aW5nczogZ2V0RGVmYXVsdE11bHRpQ29sdW1uU2V0dGluZ3MoKSxcbiAgICAgICAgcmVnaW9uS2V5OiByZWdpb25LZXksXG4gICAgICAgIHJvb3RFbGVtZW50OiByb290RWxlbWVudFxuICAgIH07XG59XG5cbmV4cG9ydCB0eXBlIFJlZ2lvbk1hbmFnZXJEYXRhID0ge1xuICAgIGRvbUxpc3Q6IERPTU9iamVjdFtdO1xuICAgIGRvbU9iamVjdE1hcDogTWFwPHN0cmluZywgRE9NT2JqZWN0PjtcbiAgICByZWdpb25QYXJlbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgZmlsZU1hbmFnZXI6IEZpbGVET01NYW5hZ2VyO1xuICAgIHJlZ2lvbmFsU2V0dGluZ3M6IE11bHRpQ29sdW1uU2V0dGluZ3M7XG5cbiAgICByZWdpb25LZXk6IHN0cmluZztcbiAgICByb290RWxlbWVudDogSFRNTEVsZW1lbnQ7XG59O1xuIiwiLypcbiAqIEZpbGU6IG11bHRpLWNvbHVtbi1tYXJrZG93bi9zcmMvZG9tTWFuYWdlci50c1xuICogQ3JlYXRlZCBEYXRlOiBTYXR1cmRheSwgSmFudWFyeSAzMHRoIDIwMjIsIDM6MTY6MzIgcG1cbiAqIEF1dGhvcjogQ2FtZXJvbiBSb2JpbnNvblxuICogXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgQ2FtZXJvbiBSb2JpbnNvblxuICovXG5cbmltcG9ydCB7IFJlZ2lvbk1hbmFnZXIgfSBmcm9tIFwiLi9yZWdpb25hbF9tYW5hZ2Vycy9yZWdpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBSZWdpb25NYW5hZ2VyQ29udGFpbmVyIH0gZnJvbSBcIi4vcmVnaW9uYWxfbWFuYWdlcnMvcmVnaW9uTWFuYWdlckNvbnRhaW5lclwiO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgZ2xvYmFsIG1hbmFnZXJzIGtlZXBpbmcgdHJhY2sgb2YgYWxsIG9wZW4gZmlsZXMgdGhhdFxuICogY29udGFpbiBNQ00tUmVnaW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdsb2JhbERPTU1hbmFnZXIge1xuICAgIG1hbmFnZXJzOiBNYXA8c3RyaW5nLCBGaWxlRE9NTWFuYWdlcj47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VycyA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlRmlsZU1hbmFnZXJDYWxsYmFjayhrZXk6IHN0cmluZykge1xuICAgICAgICBpZih0aGlzLm1hbmFnZXJzLmhhcyhrZXkpID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLm1hbmFnZXJzLmRlbGV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpbGVNYW5hZ2VyKGtleTogc3RyaW5nKSB7XG5cbiAgICAgICAgbGV0IGZpbGVNYW5hZ2VyID0gbnVsbDtcbiAgICAgICAgaWYodGhpcy5tYW5hZ2Vycy5oYXMoa2V5KSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgZmlsZU1hbmFnZXIgPSB0aGlzLm1hbmFnZXJzLmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZmlsZU1hbmFnZXIgPSBjcmVhdGVGaWxlRE9NTWFuYWdlcih0aGlzLCBrZXkpO1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2Vycy5zZXQoa2V5LCBmaWxlTWFuYWdlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsZU1hbmFnZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFsbEZpbGVNYW5hZ2VycygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5tYW5hZ2Vycy52YWx1ZXMoKSk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBGaWxlRE9NTWFuYWdlciA9IHtcbiAgICByZWdpb25NYXA6IE1hcDxzdHJpbmcsIFJlZ2lvbk1hbmFnZXJDb250YWluZXI+LFxuICAgIGhhc1N0YXJ0VGFnOiBib29sZWFuLFxuICAgIGNyZWF0ZVJlZ2lvbmFsTWFuYWdlcjogKHJlZ2lvbktleTogc3RyaW5nLCByb290RWxlbWVudDogSFRNTEVsZW1lbnQsIGVycm9yRWxlbWVudDogSFRNTEVsZW1lbnQsIHJlbmRlclJlZ2lvbkVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiBSZWdpb25NYW5hZ2VyXG4gICAgZ2V0UmVnaW9uYWxDb250YWluZXI6IChyZWdpb25LZXk6IHN0cmluZykgPT4gUmVnaW9uTWFuYWdlckNvbnRhaW5lciB8IG51bGwsXG4gICAgZ2V0QWxsUmVnaW9uYWxNYW5hZ2VyczogKCkgPT4gUmVnaW9uTWFuYWdlcltdLFxuICAgIHJlbW92ZVJlZ2lvbjogKHJlZ2lvbktleTogc3RyaW5nKSA9PiB2b2lkLFxuICAgIHNldEhhc1N0YXJ0VGFnOiAoKSA9PiB2b2lkLFxuICAgIGdldEhhc1N0YXJ0VGFnOiAoKSA9PiBib29sZWFuLFxuICAgIGdldE51bWJlck9mUmVnaW9uczogKCkgPT4gbnVtYmVyLFxuICAgIGNoZWNrS2V5RXhpc3RzOiAoY2hlY2tLZXk6IHN0cmluZykgPT4gYm9vbGVhblxufVxuZnVuY3Rpb24gY3JlYXRlRmlsZURPTU1hbmFnZXIocGFyZW50TWFuYWdlcjogR2xvYmFsRE9NTWFuYWdlciwgZmlsZUtleTogc3RyaW5nKTogRmlsZURPTU1hbmFnZXIge1xuICAgIFxuICAgIGxldCByZWdpb25NYXA6IE1hcDxzdHJpbmcsIFJlZ2lvbk1hbmFnZXJDb250YWluZXI+ID0gbmV3IE1hcCgpO1xuICAgIGxldCBoYXNTdGFydFRhZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gcmVtb3ZlUmVnaW9uKHJlZ2lvbktleTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgbGV0IHJlZ2lvbkNvbnRhaW5lciA9IHJlZ2lvbk1hcC5nZXQocmVnaW9uS2V5KTtcbiAgICAgICAgaWYocmVnaW9uQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBsZXQgcmVnaW9uYWxNYW5hZ2VyID0gcmVnaW9uQ29udGFpbmVyLmdldFJlZ2lvbigpO1xuICAgICAgICAgICAgcmVnaW9uYWxNYW5hZ2VyLmRpc3BsYXlPcmlnaW5hbEVsZW1lbnRzKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpb25NYXAuZGVsZXRlKHJlZ2lvbktleSk7XG4gICAgICAgIFxuICAgICAgICBpZihyZWdpb25NYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcGFyZW50TWFuYWdlci5yZW1vdmVGaWxlTWFuYWdlckNhbGxiYWNrKGZpbGVLZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlUmVnaW9uYWxNYW5hZ2VyKHJlZ2lvbktleTogc3RyaW5nLCByb290RWxlbWVudDogSFRNTEVsZW1lbnQsIGVycm9yRWxlbWVudDogSFRNTEVsZW1lbnQsIHJlbmRlclJlZ2lvbkVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUmVnaW9uTWFuYWdlciB7XG5cbiAgICAgICAgLy9UT0RPOiBVc2UgdGhlIGVycm9yIGVsZW1lbnQgd2hlbmV2ZXIgdGhlcmUgaXMgYW4gZXJyb3IuXG5cbiAgICAgICAgbGV0IHJlZ29uYWxDb250YWluZXIgPSBuZXcgUmVnaW9uTWFuYWdlckNvbnRhaW5lcih0aGlzLCByZWdpb25LZXksIHJvb3RFbGVtZW50LCByZW5kZXJSZWdpb25FbGVtZW50KTtcbiAgICAgICAgcmVnaW9uTWFwLnNldChyZWdpb25LZXksIHJlZ29uYWxDb250YWluZXIpO1xuICAgICAgICByZXR1cm4gcmVnb25hbENvbnRhaW5lci5nZXRSZWdpb24oKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRSZWdpb25hbENvbnRhaW5lcihyZWdpb25LZXk6IHN0cmluZyk6IFJlZ2lvbk1hbmFnZXJDb250YWluZXIgfCBudWxsIHtcblxuICAgICAgICBsZXQgcmVnb25hbE1hbmFnZXIgPSBudWxsO1xuICAgICAgICBpZihyZWdpb25NYXAuaGFzKHJlZ2lvbktleSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJlZ29uYWxNYW5hZ2VyID0gcmVnaW9uTWFwLmdldChyZWdpb25LZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlZ29uYWxNYW5hZ2VyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEFsbFJlZ2lvbmFsTWFuYWdlcnMoKTogUmVnaW9uTWFuYWdlcltdIHtcblxuICAgICAgICBsZXQgY29udGFpbmVycyA9IEFycmF5LmZyb20ocmVnaW9uTWFwLnZhbHVlcygpKVxuICAgICAgICBsZXQgcmVnaW9uczogUmVnaW9uTWFuYWdlcltdID0gY29udGFpbmVycy5tYXAoKGN1cnIpID0+IHsgcmV0dXJuIGN1cnIuZ2V0UmVnaW9uKCkgfSk7XG4gICAgICAgIHJldHVybiByZWdpb25zO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldEhhc1N0YXJ0VGFnKCkge1xuICAgICAgICBoYXNTdGFydFRhZyA9IHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SGFzU3RhcnRUYWcoKSB7XG4gICAgICAgIHJldHVybiBoYXNTdGFydFRhZztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXROdW1iZXJPZlJlZ2lvbnMoKSB7XG4gICAgICAgIHJldHVybiByZWdpb25NYXAuc2l6ZVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrS2V5RXhpc3RzKGNoZWNrS2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lvbk1hcC5oYXMoY2hlY2tLZXkpO1xuICAgIH1cblxuICAgIHJldHVybiB7IHJlZ2lvbk1hcDogcmVnaW9uTWFwLCBcbiAgICAgICAgaGFzU3RhcnRUYWc6IGhhc1N0YXJ0VGFnLCAgXG4gICAgICAgIGNyZWF0ZVJlZ2lvbmFsTWFuYWdlcjogY3JlYXRlUmVnaW9uYWxNYW5hZ2VyLCBcbiAgICAgICAgZ2V0UmVnaW9uYWxDb250YWluZXI6IGdldFJlZ2lvbmFsQ29udGFpbmVyLFxuICAgICAgICBnZXRBbGxSZWdpb25hbE1hbmFnZXJzOiBnZXRBbGxSZWdpb25hbE1hbmFnZXJzLFxuICAgICAgICByZW1vdmVSZWdpb246IHJlbW92ZVJlZ2lvbiwgXG4gICAgICAgIHNldEhhc1N0YXJ0VGFnOiBzZXRIYXNTdGFydFRhZywgXG4gICAgICAgIGdldEhhc1N0YXJ0VGFnOiBnZXRIYXNTdGFydFRhZyxcbiAgICAgICAgZ2V0TnVtYmVyT2ZSZWdpb25zOiBnZXROdW1iZXJPZlJlZ2lvbnMsXG4gICAgICAgIGNoZWNrS2V5RXhpc3RzOiBjaGVja0tleUV4aXN0c1xuICAgIH1cbn0iLCIvKlxuICogRmlsZW5hbWU6IG11bHRpLWNvbHVtbi1tYXJrZG93bi9zcmMvbGl2ZV9wcmV2aWV3L011bHRpQ29sdW1uTWFya2Rvd25fV2lkZ2V0LnRzXG4gKiBDcmVhdGVkIERhdGU6IFR1ZXNkYXksIEF1Z3VzdCAxNnRoIDIwMjIsIDQ6Mzg6NDMgcG1cbiAqIEF1dGhvcjogQ2FtZXJvbiBSb2JpbnNvblxuICogXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgQ2FtZXJvbiBSb2JpbnNvblxuICovXG5cbmltcG9ydCB7IE1hcmtkb3duUmVuZGVyQ2hpbGQsIE1hcmtkb3duUmVuZGVyZXIsIFdvcmtzcGFjZUxlYWYgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IFdpZGdldFR5cGUgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdE11bHRpQ29sdW1uU2V0dGluZ3MsIE11bHRpQ29sdW1uU2V0dGluZ3MgfSBmcm9tIFwiLi4vcmVnaW9uU2V0dGluZ3NcIjtcbmltcG9ydCB7IGZpbmRTZXR0aW5nc0NvZGVibG9jaywgZmluZFN0YXJ0Q29kZWJsb2NrIH0gZnJvbSBcIi4uL3V0aWxpdGllcy90ZXh0UGFyc2VyXCI7XG5pbXBvcnQgeyBwYXJzZUNvbHVtblNldHRpbmdzLCBwYXJzZVNpbmdsZUNvbHVtblNldHRpbmdzIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9zZXR0aW5nc1BhcnNlclwiO1xuaW1wb3J0IHsgU3RhbmRhcmRNdWx0aUNvbHVtblJlZ2lvbk1hbmFnZXIgfSBmcm9tIFwiLi4vZG9tX21hbmFnZXIvcmVnaW9uYWxfbWFuYWdlcnMvc3RhbmRhcmRNdWx0aUNvbHVtblJlZ2lvbk1hbmFnZXJcIjtcbmltcG9ydCB7IFJlZ2lvbk1hbmFnZXJEYXRhIH0gZnJvbSBcIi4uL2RvbV9tYW5hZ2VyL3JlZ2lvbmFsX21hbmFnZXJzL3JlZ2lvbk1hbmFnZXJDb250YWluZXJcIjtcbmltcG9ydCB7IGdldFVJRCB9IGZyb20gXCIuLi91dGlsaXRpZXMvdXRpbHNcIjtcbmltcG9ydCB7IERPTU9iamVjdCB9IGZyb20gXCIuLi9kb21fbWFuYWdlci9kb21PYmplY3RcIjtcbmltcG9ydCB7IFJlZ2lvbk1hbmFnZXIgfSBmcm9tIFwiLi4vZG9tX21hbmFnZXIvcmVnaW9uYWxfbWFuYWdlcnMvcmVnaW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgU2luZ2xlQ29sdW1uUmVnaW9uTWFuYWdlciB9IGZyb20gXCIuLi9kb21fbWFuYWdlci9yZWdpb25hbF9tYW5hZ2Vycy9zaW5nbGVDb2x1bW5SZWdpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBBdXRvTGF5b3V0UmVnaW9uTWFuYWdlciB9IGZyb20gXCIuLi9kb21fbWFuYWdlci9yZWdpb25hbF9tYW5hZ2Vycy9hdXRvTGF5b3V0UmVnaW9uTWFuYWdlclwiO1xuXG5leHBvcnQgY2xhc3MgTXVsdGlDb2x1bW5NYXJrZG93bl9MaXZlUHJldmlld19XaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcblxuICAgIGNvbnRlbnREYXRhOiBzdHJpbmc7XG4gICAgdGVtcFBhcmVudDogSFRNTERpdkVsZW1lbnQ7XG4gICAgZG9tTGlzdDogRE9NT2JqZWN0W10gPSBbXTtcbiAgICBzZXR0aW5nc1RleHQ6IHN0cmluZztcbiAgICByZWdpb25TZXR0aW5nczogTXVsdGlDb2x1bW5TZXR0aW5ncyA9IGdldERlZmF1bHRNdWx0aUNvbHVtblNldHRpbmdzKCk7XG4gICAgcmVnaW9uTWFuYWdlcjogUmVnaW9uTWFuYWdlcjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRlbnREYXRhOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50RGF0YSA9IGNvbnRlbnREYXRhO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIHNldHRpbmdzIGRlZmluZWQgaW4gdGhlIGNvbnRlbnQsIGlmIGl0IGV4aXN0cy5cbiAgICAgICAgLy8gSWYgdGhlIHNldHRpbmdzIGNvZGVibG9jayBpc250IGRlZmluZWQgYXR0ZW1wdCB0byBnZXQgdGhlIHJlZ2lvbiBjb2RlYmxvY2sgdHlwZS5cbiAgICAgICAgbGV0IHNldHRpbmdzU3RhcnREYXRhID0gZmluZFNldHRpbmdzQ29kZWJsb2NrKHRoaXMuY29udGVudERhdGEpO1xuICAgICAgICBpZihzZXR0aW5nc1N0YXJ0RGF0YS5mb3VuZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHNldHRpbmdzU3RhcnREYXRhID0gZmluZFN0YXJ0Q29kZWJsb2NrKHRoaXMuY29udGVudERhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR0aW5nc1N0YXJ0RGF0YS5mb3VuZCA9PT0gdHJ1ZSkge1xuXG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzVGV4dCA9IHRoaXMuY29udGVudERhdGEuc2xpY2Uoc2V0dGluZ3NTdGFydERhdGEuc3RhcnRQb3NpdGlvbiwgc2V0dGluZ3NTdGFydERhdGEuZW5kUG9zaXRpb24pO1xuICAgICAgICAgICAgdGhpcy5jb250ZW50RGF0YSA9IHRoaXMuY29udGVudERhdGEucmVwbGFjZSh0aGlzLnNldHRpbmdzVGV4dCwgXCJcIik7XG5cbiAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBzZXR0aW5ncywgdXBkYXRpbmcgdGhlIGRlZmF1bHQgc2V0dGluZ3MuXG4gICAgICAgICAgICB0aGlzLnJlZ2lvblNldHRpbmdzID0gcGFyc2VDb2x1bW5TZXR0aW5ncyh0aGlzLnNldHRpbmdzVGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW5kZXIgdGhlIG1hcmtkb3duIGNvbnRlbnQgdG8gb3VyIHRlbXAgcGFyZW50IGVsZW1lbnQuXG4gICAgICAgIHRoaXMudGVtcFBhcmVudCA9IGNyZWF0ZURpdigpO1xuICAgICAgICBsZXQgZWxlbWVudE1hcmtkb3duUmVuZGVyZXIgPSBuZXcgTWFya2Rvd25SZW5kZXJDaGlsZCh0aGlzLnRlbXBQYXJlbnQpO1xuICAgICAgICBNYXJrZG93blJlbmRlcmVyLnJlbmRlck1hcmtkb3duKHRoaXMuY29udGVudERhdGEsIHRoaXMudGVtcFBhcmVudCwgXCJcIiwgZWxlbWVudE1hcmtkb3duUmVuZGVyZXIpO1xuXG4gICAgICAgIC8vIHRha2UgYWxsIGVsZW1lbnRzLCBpbiBvcmRlciwgYW5kIGNyZWF0ZSBvdXIgRE9NIGxpc3QuXG4gICAgICAgIGxldCBhcnIgPSBBcnJheS5mcm9tKHRoaXMudGVtcFBhcmVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgIHRoaXMuZG9tTGlzdC5wdXNoKG5ldyBET01PYmplY3QoYXJyW2ldIGFzIEhUTUxFbGVtZW50LCBbXCJcIl0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB1cCB0aGUgcmVnaW9uIG1hbmFnZXIgZGF0YSBiZWZvcmUgdGhlbiBjcmVhdGluZyBvdXIgcmVnaW9uIG1hbmFnZXIuXG4gICAgICAgIGxldCByZWdpb25EYXRhOiBSZWdpb25NYW5hZ2VyRGF0YSA9IHtcbiAgICAgICAgICAgIGRvbUxpc3Q6IHRoaXMuZG9tTGlzdCxcbiAgICAgICAgICAgIGRvbU9iamVjdE1hcDogbmV3IE1hcDxzdHJpbmcsIERPTU9iamVjdD4oKSxcbiAgICAgICAgICAgIHJlZ2lvblBhcmVudDogY3JlYXRlRGl2KCksXG4gICAgICAgICAgICBmaWxlTWFuYWdlcjogbnVsbCxcbiAgICAgICAgICAgIHJlZ2lvbmFsU2V0dGluZ3M6IHRoaXMucmVnaW9uU2V0dGluZ3MsXG4gICAgICAgICAgICByZWdpb25LZXk6IGdldFVJRCgpLFxuICAgICAgICAgICAgcm9vdEVsZW1lbnQ6IGNyZWF0ZURpdigpXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRmluYWxseSBzZXR1cCB0aGUgdHlwZSBvZiByZWdpb24gbWFuYWdlciByZXF1aXJlZC5cbiAgICAgICAgaWYgKHRoaXMucmVnaW9uU2V0dGluZ3MubnVtYmVyT2ZDb2x1bW5zID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lvblNldHRpbmdzID0gcGFyc2VTaW5nbGVDb2x1bW5TZXR0aW5ncyh0aGlzLnNldHRpbmdzVGV4dCwgdGhpcy5yZWdpb25TZXR0aW5ncyk7XG4gICAgICAgICAgICB0aGlzLnJlZ2lvbk1hbmFnZXIgPSBuZXcgU2luZ2xlQ29sdW1uUmVnaW9uTWFuYWdlcihyZWdpb25EYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnJlZ2lvblNldHRpbmdzLmF1dG9MYXlvdXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMucmVnaW9uTWFuYWdlciA9IG5ldyBBdXRvTGF5b3V0UmVnaW9uTWFuYWdlcihyZWdpb25EYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVnaW9uTWFuYWdlciA9IG5ldyBTdGFuZGFyZE11bHRpQ29sdW1uUmVnaW9uTWFuYWdlcihyZWdpb25EYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvRE9NKCkge1xuICAgICAgICAvLyBDcmVhdGUgb3VyIGVsZW1lbnQgdG8gaG9sZCBhbGwgb2YgdGhlIGxpdmUgcHJldmlldyBlbGVtZW50cy5cbiAgICAgICAgbGV0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZWwuY2xhc3NOYW1lID0gXCJtY20tY20tcHJldmlld1wiO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGb3Igc2l0dWF0aW9ucyB3aGVyZSB3ZSBuZWVkIHRvIGtub3cgdGhlIHJlbmRlcmVkIGhlaWdodCwgQXV0b0xheW91dCwgXG4gICAgICAgICAqIHRoZSBlbGVtZW50IG11c3QgYmUgcmVuZGVyZWQgb250byB0aGUgc2NyZWVuIHRvIGdldCB0aGUgaW5mbywgZXZlbiBpZiBcbiAgICAgICAgICogb25seSBmb3IgYSBtb21lbnQuIEhlcmUgd2UgYXR0ZW1wdCB0byBnZXQgYSBsZWFmIGZyb20gdGhlIGFwcCBzbyB3ZSBcbiAgICAgICAgICogY2FuIGJyaWVmbHkgYXBwZW5kIG91ciBlbGVtZW50LCBjaGVjayBhbnkgZGF0YSBpZiByZXF1aXJlZCwgYW5kIHRoZW5cbiAgICAgICAgICogcmVtb3ZlIGl0LlxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IGxlYWY6IFdvcmtzcGFjZUxlYWYgPSBudWxsO1xuICAgICAgICBpZiAoYXBwKSB7XG4gICAgICAgICAgICBsZXQgbGVhdmVzID0gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoXCJtYXJrZG93blwiKTtcbiAgICAgICAgICAgIGlmIChsZWF2ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxlYWYgPSBsZWF2ZXNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZWdpb25NYW5hZ2VyKSB7XG5cbiAgICAgICAgICAgIGlmIChsZWFmKSB7XG4gICAgICAgICAgICAgICAgbGVhZi52aWV3LmNvbnRhaW5lckVsLmFwcGVuZENoaWxkKGVsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZWdpb25NYW5hZ2VyLnJlbmRlclJlZ2lvbkVsZW1lbnRzVG9MaXZlUHJldmlldyhlbCk7XG5cbiAgICAgICAgICAgIGlmIChsZWFmKSB7XG4gICAgICAgICAgICAgICAgbGVhZi52aWV3LmNvbnRhaW5lckVsLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNdWx0aUNvbHVtbk1hcmtkb3duX0RlZmluZWRTZXR0aW5nc19MaXZlUHJldmlld19XaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcblxuICAgIGNvbnRlbnREYXRhOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZW50RGF0YTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50RGF0YSA9IGNvbnRlbnREYXRhO1xuICAgIH1cblxuICAgIHRvRE9NKCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIlJlbmRlcmluZyBzZXR0aW5ncyBibG9ja1wiKVxuICAgICAgICAvLyBDcmVhdGUgb3VyIGVsZW1lbnQgdG8gaG9sZCBhbGwgb2YgdGhlIGxpdmUgcHJldmlldyBlbGVtZW50cy5cbiAgICAgICAgbGV0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZWwuY2xhc3NOYW1lID0gXCJtY20tY20tc2V0dGluZ3MtcHJldmlld1wiO1xuXG4gICAgICAgIGxldCBsYWJlbERpdiA9IGVsLmNyZWF0ZURpdigpXG4gICAgICAgIGxldCBsYWJlbCA9IGxhYmVsRGl2LmNyZWF0ZVNwYW4oe1xuICAgICAgICAgICAgY2xzOiBcIm1jbS1jb2wtc2V0dGluZ3MtcHJldmlld1wiXG4gICAgICAgIH0pXG4gICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gXCJDb2x1bW4gU2V0dGluZ3M6XCI7XG5cbiAgICAgICAgbGV0IGxpc3QgPSBlbC5jcmVhdGVFbChcInVsXCIpXG4gICAgICAgIGxldCBsaW5lcyA9IHRoaXMuY29udGVudERhdGEuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgZm9yKGxldCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgbGV0IGl0ZW0gPSBsaXN0LmNyZWF0ZUVsKFwibGlcIilcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBsaW5lc1tpXVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsO1xuICAgIH1cbn0iLCIvKlxuICogRmlsZW5hbWU6IG11bHRpLWNvbHVtbi1tYXJrZG93bi9zcmMvbGl2ZV9wcmV2aWV3L2NtNl9saXZlUHJldmlldy50c1xuICogQ3JlYXRlZCBEYXRlOiBNb25kYXksIEF1Z3VzdCAxc3QgMjAyMiwgMTo1MToxNiBwbVxuICogQXV0aG9yOiBDYW1lcm9uIFJvYmluc29uXG4gKiBcbiAqIENvcHlyaWdodCAoYykgMjAyMiBDYW1lcm9uIFJvYmluc29uXG4gKi9cblxuaW1wb3J0IHsgRXh0ZW5zaW9uLCBMaW5lLCBSYW5nZVNldEJ1aWxkZXIsIFN0YXRlRmllbGQsIFRyYW5zYWN0aW9uIH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uU2V0LCBFZGl0b3JWaWV3IH0gZnJvbSBcIkBjb2RlbWlycm9yL3ZpZXdcIjtcbmltcG9ydCB7IHN5bnRheFRyZWUsIHRva2VuQ2xhc3NOb2RlUHJvcCB9IGZyb20gXCJAY29kZW1pcnJvci9sYW5ndWFnZVwiO1xuaW1wb3J0IHsgY29udGFpbnNSZWdpb25TdGFydCwgZmluZEVuZFRhZywgZmluZFNldHRpbmdzQ29kZWJsb2NrLCBmaW5kU3RhcnRDb2RlYmxvY2ssIGZpbmRTdGFydFRhZyB9IGZyb20gXCIuLi91dGlsaXRpZXMvdGV4dFBhcnNlclwiO1xuaW1wb3J0IHsgTXVsdGlDb2x1bW5NYXJrZG93bl9EZWZpbmVkU2V0dGluZ3NfTGl2ZVByZXZpZXdfV2lkZ2V0LCBNdWx0aUNvbHVtbk1hcmtkb3duX0xpdmVQcmV2aWV3X1dpZGdldCB9IGZyb20gXCIuL21jbV9saXZlUHJldmlld193aWRnZXRcIjtcblxuZXhwb3J0IGNvbnN0IG11bHRpQ29sdW1uTWFya2Rvd25fU3RhdGVGaWVsZCA9IFN0YXRlRmllbGQuZGVmaW5lPERlY29yYXRpb25TZXQ+KHtcblx0Y3JlYXRlKHN0YXRlKTogRGVjb3JhdGlvblNldCB7XG5cdFx0cmV0dXJuIERlY29yYXRpb24ubm9uZTtcblx0fSxcblx0dXBkYXRlKG9sZFN0YXRlOiBEZWNvcmF0aW9uU2V0LCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiBEZWNvcmF0aW9uU2V0IHtcblx0XHRjb25zdCBidWlsZGVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcjxEZWNvcmF0aW9uPigpO1xuICAgICAgICBsZXQgZ2VuZXJhdGVkID0gZmFsc2U7XG5cblx0XHRzeW50YXhUcmVlKHRyYW5zYWN0aW9uLnN0YXRlKS5pdGVyYXRlKHtcblx0XHRcdGVudGVyKG5vZGUpIHtcblxuICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgd2FudCB0byBydW4gdGhlIGdlbmVyYXRpb24gb25jZSBwZXIgc3RhdGUgY2hhbmdlLiBJZlxuICAgICAgICAgICAgICAgIC8vIGEgcHJldmlvdXMgbm9kZSBoYXMgc3VjZXNzZnVsbHkgZ2VuZXJhdGVkIHJlZ2lvbnMgd2UgaWdub3JlIGFsbFxuICAgICAgICAgICAgICAgIC8vIG90aGVyIG5vZGVzIGluIHRoZSBzdGF0ZS5cbiAgICAgICAgICAgICAgICBpZihnZW5lcmF0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBtYXJrZG93bkxlYXZlcyA9IGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFwibWFya2Rvd25cIik7XG4gICAgICAgICAgICAgICAgaWYobWFya2Rvd25MZWF2ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBDaGVjayBvdGhlciB3YXlzIHRvIGdldCBpZiBzb3VyY2UgaXMgbGl2ZSBwcmV2aWV3PyBlZGl0b3JMaXZlUHJldmlld0ZpZWxkXG4gICAgICAgICAgICAgICAgaWYobWFya2Rvd25MZWF2ZXNbMF0uZ2V0Vmlld1N0YXRlKCkuc3RhdGUuc291cmNlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJVc2VyIGRpc2FibGVkIGxpdmUgcHJldmlldy5cIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuXHRcdFx0XHQvLyBXZSB3YW50IHRvIHJ1biBvbiB0aGUgd2hvbGUgZmlsZSBzbyB3ZSBkb250IGp1c3QgbG9vayBmb3IgYSBzaW5nbGUgdG9rZW4uXG5cdFx0XHRcdGNvbnN0IHRva2VuUHJvcHMgPSBub2RlLnR5cGUucHJvcDxzdHJpbmc+KHRva2VuQ2xhc3NOb2RlUHJvcCk7XG5cdFx0XHRcdGlmICh0b2tlblByb3BzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogV2hlbiB3ZSBoYXZlIHRoZSB3aGlsZSBmaWxlIHdlIHRoZW4gZ2V0IHRoZSBlbnRpcmUgZG9jIHRleHQgYW5kIGNoZWNrIGlmIGl0IFxuXHRcdFx0XHQgKiBjb250YWlucyBhIE1DTSByZWdpb24gc28gd2Uga25vdyB0byBicmVhayBvciBub3QuXG5cdFx0XHRcdCAqL1xuICAgICAgICAgICAgICAgIGxldCBkb2NMZW5ndGggPSB0cmFuc2FjdGlvbi5zdGF0ZS5kb2MubGVuZ3RoXG4gICAgICAgICAgICAgICAgbGV0IGRvY1RleHQgPSB0cmFuc2FjdGlvbi5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcoMCwgZG9jTGVuZ3RoKTtcblx0XHRcdFx0aWYgKGNvbnRhaW5zUmVnaW9uU3RhcnQoZG9jVGV4dCkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0Y29uc29sZS5kZWJ1ZyhcIk5vIHN0YXJ0IHRhZyBpbiBkb2N1bWVudC5cIilcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSB3YW50IHRvIGtub3cgd2hlcmUgdGhlIHVzZXIncyBjdXJzb3IgaXMsIGl0IGNhbiBiZVxuXHRcdFx0XHQvLyBzZWxlY3RpbmcgbXVsdGlwbGUgcmVnaW9ucyBvZiB0ZXh0IGFzIHdlbGwgc28gd2UgbmVlZCB0byBrbm93XG5cdFx0XHRcdC8vIGFsbCBsb2NhdGlvbnMuIFVzZWQgdG8ga25vdyBpZiB3ZSBzaG91bGQgcmVuZGVyIHJlZ2lvbiBhcyB0ZXh0IG9yIGFzIHByZXZpZXcuXG5cdFx0XHRcdGxldCByYW5nZXMgPSBnZXRDdXJzb3JMaW5lTG9jYXRpb25zKCk7XG5cblx0XHRcdFx0Ly8gU2V0dXAgb3VyIGxvb3AgdG8gcmVuZGVyIHRoZSByZWdpb25zIGFzIE1DTS4gXG5cdFx0XHRcdGxldCB3b3JraW5nRmlsZVRleHQgPSBkb2NUZXh0O1xuXHRcdFx0XHRsZXQgc3RhcnRUYWdEYXRhID0gZmluZFN0YXJ0VGFnKHdvcmtpbmdGaWxlVGV4dCk7XG5cdFx0XHRcdGlmKHN0YXJ0VGFnRGF0YS5mb3VuZCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHRzdGFydFRhZ0RhdGEgPSBmaW5kU3RhcnRDb2RlYmxvY2sod29ya2luZ0ZpbGVUZXh0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBlbmRUYWdEYXRhID0gZmluZEVuZFRhZyh3b3JraW5nRmlsZVRleHQpO1xuXHRcdFx0XHRsZXQgbG9vcEluZGV4ID0gMDtcblx0XHRcdFx0bGV0IHN0YXJ0SW5kZXhPZmZzZXQgPSAwO1xuXHRcdFx0XHR3aGlsZSAoc3RhcnRUYWdEYXRhLmZvdW5kID09PSB0cnVlICYmIGVuZFRhZ0RhdGEuZm91bmQgPT09IHRydWUpIHtcblxuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIEZvciB0aGUgcmVnaW9uIHdlIGZvdW5kIGdldCB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbiBvZiB0aGUgdGFncyBzbyB3ZSBcblx0XHRcdFx0XHQgKiBjYW4gc2xpY2UgaXQgb3V0IG9mIHRoZSBkb2N1bWVudC5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRsZXQgc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXhPZmZzZXQgKyBzdGFydFRhZ0RhdGEuc3RhcnRQb3NpdGlvblxuXHRcdFx0XHRcdGxldCBlbmRJbmRleCA9IHN0YXJ0SW5kZXhPZmZzZXQgKyBlbmRUYWdEYXRhLnN0YXJ0UG9zaXRpb24gKyBlbmRUYWdEYXRhLm1hdGNoTGVuZ3RoIC8vIFdpdGhvdXQgdGhlIG1hdGNoTGVuZ3RoIHdpbGwgbGVhdmUgdGhlIGVuZCB0YWcgb24gdGhlIHNjcmVlbi5cblxuXHRcdFx0XHRcdC8vIFRoaXMgdGV4dCBpcyB0aGUgZW50aXJlIHJlZ2lvbiBkYXRhIGluY2x1ZGluZyB0aGUgc3RhcnQgYW5kIGVuZCB0YWdzLlxuXHRcdFx0XHRcdGxldCBlbGVtZW50VGV4dCA9IGRvY1RleHQuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpXG5cblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBVcGRhdGUgb3VyIHN0YXJ0IG9mZnNldCBhbmQgdGhlIHdvcmtpbmcgdGV4dCBvZiB0aGUgZmlsZSBzbyBvdXIgbmV4dCBcblx0XHRcdFx0XHQgKiBpdGVyYXRpb24ga25vd3Mgd2hlcmUgd2UgbGVmdCBvZmZcblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRzdGFydEluZGV4T2Zmc2V0ID0gZW5kSW5kZXhcblx0XHRcdFx0XHR3b3JraW5nRmlsZVRleHQgPSBkb2NUZXh0LnNsaWNlKGVuZEluZGV4KTtcblxuXG5cdFx0XHRcdFx0Ly8gSGVyZSB3ZSBjaGVjayBpZiB0aGUgY3Vyc29yIGlzIGluIHRoaXMgc3BlY2lmaWMgcmVnaW9uLlxuXHRcdFx0XHRcdGxldCBjdXJzb3JJblJlZ2lvbiA9IGNoZWNrQ3Vyc29ySW5SZWdpb24oc3RhcnRJbmRleCwgZW5kSW5kZXgsIHJhbmdlcyk7XG5cdFx0XHRcdFx0aWYoY3Vyc29ySW5SZWdpb24gPT09IHRydWUpIHtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGN1cnNvciBpcyB3aXRoaW4gdGhlIHJlZ2lvbiB3ZSB0aGVuIG5lZWQgdG8ga25vdyBpZlxuXHRcdFx0XHRcdFx0Ly8gaXQgaXMgd2l0aGluIG91ciBzZXR0aW5ncyBibG9jayAoaWYgaXQgZXhpc3RzLilcblx0XHRcdFx0XHRcdGxldCBzZXR0aW5nc1N0YXJ0RGF0YSA9IGZpbmRTdGFydENvZGVibG9jayhlbGVtZW50VGV4dCk7XG5cdFx0XHRcdFx0XHRpZihzZXR0aW5nc1N0YXJ0RGF0YS5mb3VuZCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdFx0c2V0dGluZ3NTdGFydERhdGEgPSBmaW5kU2V0dGluZ3NDb2RlYmxvY2soZWxlbWVudFRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZihzZXR0aW5nc1N0YXJ0RGF0YS5mb3VuZCA9PT0gdHJ1ZSkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFNpbmNlIHRoZSBzZXR0aW5ncyBibG9jayBleGlzdHMgY2hlY2sgaWYgdGhlIGN1cnNvciBpcyB3aXRoaW4gdGhhdCByZWdpb24uXG5cdFx0XHRcdFx0XHRcdGxldCBjb2RlYmxvY2tTdGFydEluZGV4ID0gc3RhcnRJbmRleCArIHNldHRpbmdzU3RhcnREYXRhLnN0YXJ0UG9zaXRpb247XG5cdFx0XHRcdFx0XHRcdGxldCBjb2RlYmxvY2tFbmRJbmRleCA9IHN0YXJ0SW5kZXggKyBzZXR0aW5nc1N0YXJ0RGF0YS5lbmRQb3NpdGlvbjtcblx0XHRcdFx0XHRcdFx0bGV0IHNldHRpbmdzVGV4dCA9IGRvY1RleHQuc2xpY2UoY29kZWJsb2NrU3RhcnRJbmRleCwgY29kZWJsb2NrRW5kSW5kZXggKVxuXG5cdFx0XHRcdFx0XHRcdGxldCBjdXJzb3JJbkNvZGVibG9jayA9IGNoZWNrQ3Vyc29ySW5SZWdpb24oY29kZWJsb2NrU3RhcnRJbmRleCwgY29kZWJsb2NrRW5kSW5kZXgsIHJhbmdlcyk7XG5cdFx0XHRcdFx0XHRcdGlmKGN1cnNvckluQ29kZWJsb2NrID09PSBmYWxzZSkge1xuXHRcblx0XHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgY3Vyc29yIGlzIG5vdCB3aXRoaW4gdGhlIHJlZ2lvbiB3ZSBwYXNzIHRoZSBkYXRhIHRvIHRoZVxuXHRcdFx0XHRcdFx0XHRcdC8vIHNldHRpbmdzIHZpZXcgc28gaXQgY2FuIGJlIGRpc3BsYXllZCBpbiB0aGUgcmVnaW9uLlxuXHRcdFx0XHRcdFx0XHRcdGJ1aWxkZXIuYWRkKFxuXHRcdFx0XHRcdFx0XHRcdFx0Y29kZWJsb2NrU3RhcnRJbmRleCxcblx0XHRcdFx0XHRcdFx0XHRcdGNvZGVibG9ja0VuZEluZGV4ICsgMSxcblx0XHRcdFx0XHRcdFx0XHRcdERlY29yYXRpb24ucmVwbGFjZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpZGdldDogbmV3IE11bHRpQ29sdW1uTWFya2Rvd25fRGVmaW5lZFNldHRpbmdzX0xpdmVQcmV2aWV3X1dpZGdldChzZXR0aW5nc1RleHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gQXQgdGhpcyBwb2ludCBpZiB0aGUgY3Vyc29yIGlzbnQgaW4gdGhlIHJlZ2lvbiB3ZSBwYXNzIHRoZSBkYXRhIHRvIHRoZVxuXHRcdFx0XHRcdC8vIGVsZW1lbnQgdG8gYmUgcmVuZGVyZWQuXG5cdFx0XHRcdFx0aWYoY3Vyc29ySW5SZWdpb24gPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0XHRidWlsZGVyLmFkZChcblx0XHRcdFx0XHRcdFx0c3RhcnRJbmRleCxcblx0XHRcdFx0XHRcdFx0ZW5kSW5kZXgsXG5cdFx0XHRcdFx0XHRcdERlY29yYXRpb24ucmVwbGFjZSh7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0OiBuZXcgTXVsdGlDb2x1bW5NYXJrZG93bl9MaXZlUHJldmlld19XaWRnZXQoZWxlbWVudFRleHQpLFxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Z2VuZXJhdGVkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdC8vIFJlQ2FsY3VsYXRlIGFkZGl0aW9uYWwgc3RhcnQgdGFncyBpZiB0aGVyZSBhcmUgbW9yZSBpbiBkb2N1bWVudC5cblx0XHRcdFx0XHRzdGFydFRhZ0RhdGEgPSBmaW5kU3RhcnRUYWcod29ya2luZ0ZpbGVUZXh0KTtcblx0XHRcdFx0XHRpZihzdGFydFRhZ0RhdGEuZm91bmQgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0XHRzdGFydFRhZ0RhdGEgPSBmaW5kU3RhcnRDb2RlYmxvY2sod29ya2luZ0ZpbGVUZXh0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbmRUYWdEYXRhID0gZmluZEVuZFRhZyh3b3JraW5nRmlsZVRleHQpO1xuXHRcdFx0XHRcdGxvb3BJbmRleCsrO1xuXHRcdFx0XHRcdGlmKGxvb3BJbmRleCA+IDEwMCkge1xuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKFwiUG90ZW50aWFsIGlzc3VlIHdpdGggcmVuZGVyaW5nIE11bHRpLUNvbHVtbiBNYXJrZG93biBsaXZlIHByZXZpZXcgcmVnaW9ucy4gSWYgcHJvYmxlbSBwZXJzaXN0cyBwbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQgd2l0aCBkZXZlbG9wZXIuXCIpXG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0fSk7XG4gXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7XG5cblx0XHRmdW5jdGlvbiBnZXRDdXJzb3JMaW5lTG9jYXRpb25zKCk6IHsgbGluZTogTGluZSwgcG9zaXRpb246IG51bWJlciB9W10ge1xuXG5cdFx0XHRsZXQgcmFuZ2VzOiB7IGxpbmU6IExpbmUsIHBvc2l0aW9uOiBudW1iZXIgfVtdID0gW107XG5cblx0XHRcdGlmICh0cmFuc2FjdGlvbi5zdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG5cblx0XHRcdFx0cmFuZ2VzID0gdHJhbnNhY3Rpb24uc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5maWx0ZXIoKHJhbmdlKSA9PiB7XG5cblx0XHRcdFx0XHRyZXR1cm4gcmFuZ2UuZW1wdHk7XG5cdFx0XHRcdH0pLm1hcCgocmFuZ2UpID0+IHtcblxuXHRcdFx0XHRcdGxldCBsaW5lID0gdHJhbnNhY3Rpb24uc3RhdGUuZG9jLmxpbmVBdChyYW5nZS5oZWFkKTtcblx0XHRcdFx0XHRsZXQgdGV4dCA9IGAke2xpbmUubnVtYmVyfToke3JhbmdlLmhlYWQgLSBsaW5lLmZyb219YDtcblxuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRsaW5lOiBsaW5lLFxuXHRcdFx0XHRcdFx0cG9zaXRpb246IHJhbmdlLmhlYWRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmFuZ2VzO1xuXHRcdH1cblxuICAgICAgICBmdW5jdGlvbiB2YWx1ZUlzSW5SYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW5WYWw6IG51bWJlciwgbWF4VmFsOiBudW1iZXIsIGluY2x1c2l2ZTogYm9vbGVhbiA9IHRydWUpIHtcblxuICAgICAgICAgICAgaWYoaW5jbHVzaXZlID09PSB0cnVlICYmICh2YWx1ZSA9PT0gbWluVmFsIHx8IHZhbHVlID09PSBtYXhWYWwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtaW5WYWwgPCB2YWx1ZSAmJiB2YWx1ZSA8IG1heFZhbCkge1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG5cdFx0ZnVuY3Rpb24gY2hlY2tDdXJzb3JJblJlZ2lvbihzdGFydEluZGV4OiBudW1iZXIsXG5cdFx0XHRcdFx0XHRcdFx0ZW5kSW5kZXg6IG51bWJlciwgXG5cdFx0XHRcdFx0XHRcdFx0cmFuZ2VzOiB7IGxpbmU6IExpbmUsIHBvc2l0aW9uOiBudW1iZXIgfVtdICk6IGJvb2xlYW4ge1xuXG5cdFx0XHRsZXQgY3Vyc29ySW5SZWdpb24gPSBmYWxzZTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0Ly8gVE9ETzogTWF5YmUgbG9vayBpbnRvIGxpbWl0aW5nIHRoaXMgdG8gdGhlIHNlY29uZCBhbmQgc2Vjb25kIHRvIGxhc3QgbGluZVxuXHRcdFx0XHQvLyBvZiB0aGUgcmVnaW9uIGFzIGNsaWNraW5nIHJpZ2h0IGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSByZWdpb25cblx0XHRcdFx0Ly8gc3dhcHMgaXQgdG8gdW5yZW5kZXJlZC5cblx0XHRcdFx0bGV0IHJhbmdlID0gcmFuZ2VzW2ldO1xuXHRcdFx0XHRpZih2YWx1ZUlzSW5SYW5nZShyYW5nZS5wb3NpdGlvbiwgc3RhcnRJbmRleCwgZW5kSW5kZXgpID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0Y3Vyc29ySW5SZWdpb24gPSB0cnVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmKGN1cnNvckluUmVnaW9uID09PSBmYWxzZSAmJiB0cmFuc2FjdGlvbi5zZWxlY3Rpb24pe1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRyYW5zYWN0aW9uLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRcdGxldCByYW5nZSA9IHRyYW5zYWN0aW9uLnNlbGVjdGlvbi5yYW5nZXNbaV07XG5cblx0XHRcdFx0XHQvLyBJZiBlaXRoZXIgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgc2VsZWN0aW9uIGlzIHdpdGhpbiB0aGVcblx0XHRcdFx0XHQvLyByZWdpb24gcmFuZ2Ugd2UgZG8gbm90IHJlbmRlciBsaXZlIHByZXZpZXcuXG5cdFx0XHRcdFx0aWYodmFsdWVJc0luUmFuZ2UocmFuZ2UuZnJvbSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHx8IFxuXHRcdFx0XHRcdCAgIHZhbHVlSXNJblJhbmdlKHJhbmdlLnRvLCBzdGFydEluZGV4LCBlbmRJbmRleCkpIHtcblx0XHRcdFx0XHRcdGN1cnNvckluUmVnaW9uID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9yIGlmIHRoZSBlbnRpcmUgcmVnaW9uIGlzIHdpdGhpbiB0aGUgc2VsZWN0aW9uIHJhbmdlXG5cdFx0XHRcdFx0Ly8gd2UgZG8gbm90IHJlbmRlciB0aGUgbGl2ZSBwcmV2aWV3LlxuXHRcdFx0XHRcdGlmKHZhbHVlSXNJblJhbmdlKHN0YXJ0SW5kZXgsIHJhbmdlLmZyb20sIHJhbmdlLnRvKSAmJiBcblx0XHRcdFx0XHQgICB2YWx1ZUlzSW5SYW5nZShlbmRJbmRleCwgcmFuZ2UuZnJvbSwgcmFuZ2UudG8pKSB7XG5cdFx0XHRcdFx0XHRjdXJzb3JJblJlZ2lvbiA9IHRydWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGN1cnNvckluUmVnaW9uO1xuXHRcdH1cblx0fSxcblx0cHJvdmlkZShmaWVsZDogU3RhdGVGaWVsZDxEZWNvcmF0aW9uU2V0Pik6IEV4dGVuc2lvbiB7XG5cdFx0cmV0dXJuIEVkaXRvclZpZXcuZGVjb3JhdGlvbnMuZnJvbShmaWVsZCk7XG5cdH0sXG59KTtcblxuIiwiLypcclxuICogRmlsZTogbXVsdGktY29sdW1uLW1hcmtkb3duL3NyYy9tYWluLnRzXHJcbiAqIENyZWF0ZWQgRGF0ZTogVHVlc2RheSwgT2N0b2JlciA1dGggMjAyMSwgMTowOSBwbVxyXG4gKiBBdXRob3I6IENhbWVyb24gUm9iaW5zb25cclxuICogXHJcbiAqIENvcHlyaWdodCAoYykgMjAyMiBDYW1lcm9uIFJvYmluc29uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgTm90aWNlLCBQbHVnaW4sICBNYXJrZG93blJlbmRlckNoaWxkLCBNYXJrZG93blJlbmRlcmVyLCBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0ICogYXMgbXVsdGlDb2x1bW5QYXJzZXIgZnJvbSAnLi91dGlsaXRpZXMvdGV4dFBhcnNlcic7XHJcbmltcG9ydCB7IEZpbGVET01NYW5hZ2VyLCBHbG9iYWxET01NYW5hZ2VyIH0gZnJvbSAnLi9kb21fbWFuYWdlci9kb21NYW5hZ2VyJztcclxuaW1wb3J0IHsgTXVsdGlDb2x1bW5SZW5kZXJEYXRhIH0gZnJvbSBcIi4vZG9tX21hbmFnZXIvcmVnaW9uYWxfbWFuYWdlcnMvcmVnaW9uTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBSZWdpb25NYW5hZ2VyIH0gZnJvbSBcIi4vZG9tX21hbmFnZXIvcmVnaW9uYWxfbWFuYWdlcnMvcmVnaW9uTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBSZWdpb25NYW5hZ2VyQ29udGFpbmVyIH0gZnJvbSBcIi4vZG9tX21hbmFnZXIvcmVnaW9uYWxfbWFuYWdlcnMvcmVnaW9uTWFuYWdlckNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBET01PYmplY3QsIERPTU9iamVjdFRhZywgVGFza0xpc3RET01PYmplY3QgfSBmcm9tICcuL2RvbV9tYW5hZ2VyL2RvbU9iamVjdCc7XHJcbmltcG9ydCB7IGZpbGVTdGlsbEluVmlldywgZ2V0RmlsZUxlYWYsIGdldExlYWZTb3VyY2VNb2RlLCBnZXRVSUQgfSBmcm9tICcuL3V0aWxpdGllcy91dGlscyc7XHJcbmltcG9ydCB7IE11bHRpQ29sdW1uTGF5b3V0Q1NTLCBNdWx0aUNvbHVtblN0eWxlQ1NTIH0gZnJvbSAnLi91dGlsaXRpZXMvY3NzRGVmaW5pdGlvbnMnO1xyXG5pbXBvcnQgeyBFbGVtZW50UmVuZGVyVHlwZSB9IGZyb20gJy4vdXRpbGl0aWVzL2VsZW1lbnRSZW5kZXJUeXBlUGFyc2VyJztcclxuaW1wb3J0IHsgbXVsdGlDb2x1bW5NYXJrZG93bl9TdGF0ZUZpZWxkIH0gZnJvbSAnLi9saXZlX3ByZXZpZXcvY202X2xpdmVQcmV2aWV3JztcclxuaW1wb3J0IHsgcGFyc2VTdGFydFJlZ2lvbkNvZGVCbG9ja0lEIH0gZnJvbSAnLi91dGlsaXRpZXMvc2V0dGluZ3NQYXJzZXInO1xyXG5cclxuY29uc3QgQ09ERUJMT0NLX1NUQVJUX1NUUlMgPSBbXHJcbiAgICBcInN0YXJ0LW11bHRpLWNvbHVtblwiLFxyXG4gICAgXCJtdWx0aS1jb2x1bW4tc3RhcnRcIlxyXG5dXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE11bHRpQ29sdW1uTWFya2Rvd24gZXh0ZW5kcyBQbHVnaW4ge1xyXG5cclxuICAgIGdsb2JhbE1hbmFnZXI6IEdsb2JhbERPTU1hbmFnZXIgPSBuZXcgR2xvYmFsRE9NTWFuYWdlcigpO1xyXG5cclxuXHRhc3luYyBvbmxvYWQoKSB7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiTG9hZGluZyBtdWx0aS1jb2x1bW4gbWFya2Rvd25cIik7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxNYW5hZ2VyID0gbmV3IEdsb2JhbERPTU1hbmFnZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlckVkaXRvckV4dGVuc2lvbihtdWx0aUNvbHVtbk1hcmtkb3duX1N0YXRlRmllbGQpXHJcblxyXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBDT0RFQkxPQ0tfU1RBUlRfU1RSUy5sZW5ndGg7IGkrKykge1xyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXJ0U3RyID0gQ09ERUJMT0NLX1NUQVJUX1NUUlNbaV1cclxuICAgICAgICAgICAgdGhpcy5zZXR1cE1hcmtkb3duQ29kZWJsb2NrUG9zdFByb2Nlc3NvcihzdGFydFN0cik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0dXBNYXJrZG93blBvc3RQcm9jZXNzb3IoKTtcclxuXHJcbiAgICAgICAgLy9UT0RPOiBTZXQgdXAgdGhpcyBhcyBhIG1vZGFsIHRvIHNldCBzZXR0aW5ncyBhdXRvbWF0aWNhbGx5XHJcbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgaWQ6IGBpbnNlcnQtbXVsdGktY29sdW1uLXJlZ2lvbmAsXHJcbiAgICAgICAgICAgIG5hbWU6IGBJbnNlcnQgTXVsdGktQ29sdW1uIFJlZ2lvbmAsXHJcbiAgICAgICAgICAgIGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yLCB2aWV3KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY3Vyc29yU3RhcnRQb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoXCJmcm9tXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuZ2V0RG9jKCkucmVwbGFjZVNlbGVjdGlvbihcclxuYFxyXG5cXGBcXGBcXGBzdGFydC1tdWx0aS1jb2x1bW5cclxuSUQ6IElEXyR7Z2V0VUlEKDQpfVxyXG5OdW1iZXIgb2YgQ29sdW1uczogMlxyXG5MYXJnZXN0IENvbHVtbjogc3RhbmRhcmRcclxuXFxgXFxgXFxgXHJcblxyXG5cclxuXHJcbi0tLSBjb2x1bW4tZW5kIC0tLVxyXG5cclxuXHJcblxyXG49PT0gZW5kLW11bHRpLWNvbHVtblxyXG5cclxuJHtlZGl0b3IuZ2V0RG9jKCkuZ2V0U2VsZWN0aW9uKCl9YFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yU3RhcnRQb3NpdGlvbi5saW5lID0gY3Vyc29yU3RhcnRQb3NpdGlvbi5saW5lICsgN1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnNvclN0YXJ0UG9zaXRpb24uY2ggPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0Q3Vyc29yKGN1cnNvclN0YXJ0UG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRW5jb3VudGVyZWQgYW4gZXJyb3IgaW5zZXJ0aW5nIGEgbXVsdGktY29sdW1uIHJlZ2lvbi4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIlxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgaWQ6IGBhZGQtSURzLVRvLW11bHRpLWNvbHVtbi1yZWdpb25gLFxyXG4gICAgICAgICAgICBuYW1lOiBgRml4IE1pc3NpbmcgSURzIGZvciBNdWx0aS1Db2x1bW4gUmVnaW9uc2AsXHJcbiAgICAgICAgICAgIGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yLCB2aWV3KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAgICAgKiBOb3Qgc3VyZSBpZiB0aGVyZSBpcyBhbiBlYXNpZXIgd2F5IHRvIGRvIHRoaXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICogXHJcbiAgICAgICAgICAgICAgICAgICAgICogR2V0IGFsbCBvZiB0aGUgbGluZXMgb2YgdGhlIGRvY3VtZW50IHNwbGl0IGJ5IG5ld2xpbmVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkb2NUZXh0ID0gZWRpdG9yLmdldFJhbmdlKHsgbGluZTogMCwgY2g6IDAgfSwgeyBsaW5lOiBlZGl0b3IuZ2V0RG9jKCkubGluZUNvdW50KCksIGNoOiAwfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVzID0gZG9jVGV4dC5zcGxpdChcIlxcblwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0Q29kZWJsb2NrID0gbXVsdGlDb2x1bW5QYXJzZXIuZmluZFN0YXJ0Q29kZWJsb2NrKGRvY1RleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsaW5lT2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbnVtQ29kZWJsb2Nrc1VwZGF0ZWQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlKHN0YXJ0Q29kZWJsb2NrLmZvdW5kID09PSB0cnVlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRSZXBsYWNlTGluZXMgPSAoZG9jVGV4dC5zbGljZSgwLCBzdGFydENvZGVibG9jay5zdGFydFBvc2l0aW9uKS5zcGxpdChcIlxcblwiKS5sZW5ndGggLSAxKSArIGxpbmVPZmZzZXQ7IC8vIC0xIHRvIFplcm8gaW5kZXggdGhlIHJlcGxhY2UgbGluZVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNldHRpbmdzVGV4dCA9IGRvY1RleHQuc2xpY2Uoc3RhcnRDb2RlYmxvY2suc3RhcnRQb3NpdGlvbiwgc3RhcnRDb2RlYmxvY2suZW5kUG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2V0dGluZ3NJRCA9IHBhcnNlU3RhcnRSZWdpb25Db2RlQmxvY2tJRChzZXR0aW5nc1RleHQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZ3NJRCA9PT0gXCJcIikge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBsYWNlbWVudFRleHQgPSBlZGl0b3IuZ2V0UmFuZ2UoeyBsaW5lOiBzdGFydFJlcGxhY2VMaW5lcywgY2g6IDAgfSwgeyBsaW5lOiBzdGFydFJlcGxhY2VMaW5lcywgY2g6IHN0YXJ0Q29kZWJsb2NrLm1hdGNoTGVuZ3RofSkgKyBgXFxuSUQ6IElEXyR7Z2V0VUlEKDQpfWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5yZXBsYWNlUmFuZ2UocmVwbGFjZW1lbnRUZXh0LCB7IGxpbmU6IHN0YXJ0UmVwbGFjZUxpbmVzLCBjaDogMCB9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGxpbmU6IHN0YXJ0UmVwbGFjZUxpbmVzLCBjaDogc3RhcnRDb2RlYmxvY2subWF0Y2hMZW5ndGh9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFJlcGxhY2VMaW5lcyArPSAxOyAvLyB3ZSBhZGRlZCBhIGxpbmUgdG8gdGhlIGRvYyBzbyB1cGRhdGUgb3VyIG9mZnNldC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNvZGVibG9ja3NVcGRhdGVkICs9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZU9mZnNldCA9IHN0YXJ0UmVwbGFjZUxpbmVzXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2NUZXh0ID0gZG9jVGV4dC5zbGljZShzdGFydENvZGVibG9jay5zdGFydFBvc2l0aW9uICsgc3RhcnRDb2RlYmxvY2subWF0Y2hMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydENvZGVibG9jayA9IG11bHRpQ29sdW1uUGFyc2VyLmZpbmRTdGFydENvZGVibG9jayhkb2NUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICAgICAqIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIGxpbmVzIGNoZWNraW5nIGlmIHRoZSBsaW5lIGlzIGEgXHJcbiAgICAgICAgICAgICAgICAgICAgICogc3RhcnQgdGFnIGFuZCBpZiBzbyBpcyBpdCBtaXNzaW5nIGFuIElELlxyXG4gICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsaW5lc1dpdGhvdXRJRHMgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0V2l0aG91dElEcyA9IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IG11bHRpQ29sdW1uUGFyc2VyLmlzU3RhcnRUYWdXaXRoSUQobGluZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmlzU3RhcnRUYWcgPT09IHRydWUgJiYgZGF0YS5oYXNLZXkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1dpdGhvdXRJRHMucHVzaChpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRXaXRob3V0SURzLnB1c2gobGluZXNbaV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYobGluZXNXaXRob3V0SURzLmxlbmd0aCA9PT0gMCAmJiBudW1Db2RlYmxvY2tzVXBkYXRlZCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlIChcIkZvdW5kIDAgbWlzc2luZyBJRHMgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAgICAgKiBOb3cgbG9vcCB0aHJvdWdoIGVhY2ggbGluZSB0aGF0IGlzIG1pc3NpbmcgYW4gSUQgYW5kXHJcbiAgICAgICAgICAgICAgICAgICAgICogZ2VuZXJhdGUgYSByYW5kb20gSUQgYW5kIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHRleHQuXHJcbiAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGxpbmVzV2l0aG91dElEcy5sZW5ndGg7IGkrKykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9yaWdpbmFsVGV4dCA9IHRleHRXaXRob3V0SURzW2ldXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gb3JpZ2luYWxUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC50cmltRW5kKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHQuY2hhckF0KHRleHQubGVuZ3RoIC0gMSkgPT09IFwiOlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCB0ZXh0Lmxlbmd0aC0xKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gYCR7dGV4dH06IElEXyR7Z2V0VUlEKDQpfWA7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IucmVwbGFjZVJhbmdlKHRleHQsIHsgbGluZTogbGluZXNXaXRob3V0SURzW2ldLCBjaDogMCB9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGxpbmU6IGxpbmVzV2l0aG91dElEc1tpXSwgY2g6IG9yaWdpbmFsVGV4dC5sZW5ndGh9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UgKGBSZXBsYWNlZCAke2xpbmVzV2l0aG91dElEcy5sZW5ndGggKyBudW1Db2RlYmxvY2tzVXBkYXRlZH0gbWlzc2luZyBJRChzKSBpbiB0aGUgY3VycmVudCBkb2N1bWVudC5gKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkVuY291bnRlcmVkIGFuIGVycm9yIGFkZGlnbiBJRHMgdG8gbXVsdGktY29sdW1uIHJlZ2lvbnMuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCJcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJJbnRlcnZhbCh3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5VcGRhdGVPcGVuRmlsZVByZXZpZXdzKCk7XHJcbiAgICAgICAgfSwgNTAwKSk7XHJcbiAgICB9XHJcblxyXG4gICAgVXBkYXRlT3BlbkZpbGVQcmV2aWV3cygpIHtcclxuXHJcbiAgICAgICAgbGV0IGZpbGVNYW5hZ2VycyA9IHRoaXMuZ2xvYmFsTWFuYWdlci5nZXRBbGxGaWxlTWFuYWdlcnMoKTtcclxuICAgICAgICBmaWxlTWFuYWdlcnMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCByZWdpb25hbE1hbmFnZXJzID0gZWxlbWVudC5nZXRBbGxSZWdpb25hbE1hbmFnZXJzKCk7XHJcbiAgICAgICAgICAgIHJlZ2lvbmFsTWFuYWdlcnMuZm9yRWFjaChyZWdpb25NYW5hZ2VyID0+IHtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmVnaW9uTWFuYWdlci51cGRhdGVSZW5kZXJlZE1hcmtkb3duKClcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0dXBNYXJrZG93blBvc3RQcm9jZXNzb3IoKSB7XHJcbiAgICAgICAgdGhpcy5yZWdpc3Rlck1hcmtkb3duUG9zdFByb2Nlc3Nvcihhc3luYyAoZWwsIGN0eCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc291cmNlUGF0aCA9IGN0eC5zb3VyY2VQYXRoO1xyXG5cclxuICAgICAgICAgICAgbGV0IGZpbGVET01NYW5hZ2VyID0gdGhpcy5nbG9iYWxNYW5hZ2VyLmdldEZpbGVNYW5hZ2VyKHNvdXJjZVBhdGgpO1xyXG4gICAgICAgICAgICBpZihmaWxlRE9NTWFuYWdlciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJGb3VuZCBudWxsIERPTSBtYW5hZ2VyLiBDb3VsZCBub3QgcHJvY2VzcyBtdWx0aS1jb2x1bW4gbWFya2Rvd24uXCIpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBIZXJlIHdlIGNoZWNrIGlmIHRoZSBleHBvcnQgXCJwcmludFwiIGZsYWcgaXMgaW4gdGhlIERPTSBzbyB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHdlXHJcbiAgICAgICAgICAgICAqIGFyZSBleHBvcnRpbmcgYW5kIGhhbmRsZSB0aGF0IGNhc2UuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZih0aGlzLmNoZWNrRXhwb3J0aW5nKGVsKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZXhwb3J0RG9jdW1lbnRUb1BERihlbCwgZmlsZURPTU1hbmFnZXIsIHNvdXJjZVBhdGgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGluZm8gZm9yIG91ciBjdXJyZW50IGNvbnRleHQgYW5kIHRoZW4gY2hlY2tcclxuICAgICAgICAgICAgLy8gaWYgdGhlIGVudGlyZSB0ZXh0IGNvbnRhaW5zIGEgc3RhcnQgdGFnLiBJZiB0aGVyZSBpc1xyXG4gICAgICAgICAgICAvLyBubyBzdGFydCB0YWcgaW4gdGhlIGRvY3VtZW50IHdlIGNhbiBqdXN0IHJldHVybiBhbmRcclxuICAgICAgICAgICAgLy8gaWdub3JlIHRoZSByZXN0IG9mIHRoZSBwYXJzaW5nLlxyXG4gICAgICAgICAgICBsZXQgaW5mbyA9IGN0eC5nZXRTZWN0aW9uSW5mbyhlbCk7XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogV2UgbmVlZCB0aGUgY29udGV4dCBpbmZvIHRvIHByb3Blcmx5IHBhcnNlIHNvIHJldHVybmluZyBoZXJlIFxyXG4gICAgICAgICAgICAgKiBpbmZvIGlzIG51bGwuIFRPRE86IFNldCBlcnJvciBpbiB2aWV3IGlmIHRoaXMgb2NjdXJzLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgaWYoIWluZm8pIHtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBkb2NTdHJpbmcgPSBpbmZvLnRleHQ7XHJcbiAgICAgICAgICAgIGxldCBkb2NMaW5lcyA9IGRvY1N0cmluZy5zcGxpdChcIlxcblwiKTtcclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBJZiB3ZSBlbmNvdW50ZXIgYSBzdGFydCB0YWcgb24gdGhlIGRvY3VtZW50IHdlIHNldCB0aGUgZmxhZyB0byBzdGFydFxyXG4gICAgICAgICAgICAgKiBwYXJzaW5nIHRoZSByZXN0IG9mIHRoZSBkb2N1bWVudC5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmKG11bHRpQ29sdW1uUGFyc2VyLmNvbnRhaW5zU3RhcnRUYWcoZWwudGV4dENvbnRlbnQpIHx8IFxyXG4gICAgICAgICAgICAgICBtdWx0aUNvbHVtblBhcnNlci5jb250YWluc1N0YXJ0Q29kZUJsb2NrKGRvY1N0cmluZykpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBmaWxlRE9NTWFuYWdlci5zZXRIYXNTdGFydFRhZygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogXHJcbiAgICAgICAgICAgICAqIElmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBjb250YWluIGFueSBzdGFydCB0YWdzIHdlIGlnbm9yZSB0aGVcclxuICAgICAgICAgICAgICogcmVzdCBvZiB0aGUgcGFyc2luZy4gVGhpcyBpcyBvbmx5IHNldCB0byB0cnVlIG9uY2UgdGhlIGZpcnN0XHJcbiAgICAgICAgICAgICAqIHN0YXJ0IHRhZyBlbGVtZW50IGlzIHBhcnNlZCBhYm92ZS5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmKGZpbGVET01NYW5hZ2VyLmdldEhhc1N0YXJ0VGFnKCkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBUYWtlIHRoZSBpbmZvIHByb3ZpZGVkIGFuZCBnZW5lcmF0ZSB0aGUgcmVxdWlyZWQgdmFyaWFibGVzIGZyb20gXHJcbiAgICAgICAgICAgICAqIHRoZSBsaW5lIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGV0IGxpbmVzQWJvdmVBcnJheSA9IGRvY0xpbmVzLnNsaWNlKDAsIGluZm8ubGluZVN0YXJ0KVxyXG4gICAgICAgICAgICBsZXQgbGluZXNPZkVsZW1lbnQgPSBkb2NMaW5lcy5zbGljZShpbmZvLmxpbmVTdGFydCwgaW5mby5saW5lRW5kICsgMSk7XHJcbiAgICAgICAgICAgIGxldCB0ZXh0T2ZFbGVtZW50ID0gbGluZXNPZkVsZW1lbnQuam9pbihcIlxcblwiKVxyXG4gICAgICAgICAgICBsZXQgbGluZXNCZWxvd0FycmF5ID0gZG9jTGluZXMuc2xpY2UoaW5mby5saW5lRW5kICsgMSlcclxuXHJcbiAgICAgICAgICAgIC8vI3JlZ2lvbiBEZXByZWNpYXRlZCBTdGFydCBUYWdcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIElmIHRoZSBjdXJyZW50IGxpbmUgaXMgYSBzdGFydCB0YWcgd2Ugd2FudCB0byBzZXQgdXAgdGhlXHJcbiAgICAgICAgICAgICAqIHJlZ2lvbiBtYW5hZ2VyLiBUaGUgcmVnaW9uYWwgbWFuYWdlciB0YWtlcyBjYXJlXHJcbiAgICAgICAgICAgICAqIG9mIGFsbCBpdGVtcyBiZXR3ZWVuIGl0J3Mgc3RhcnQgYW5kIGVuZCB0YWdzIHdoaWxlIHRoZVxyXG4gICAgICAgICAgICAgKiBmaWxlIG1hbmFnZXIgd2UgZ290IGFib3ZlIGFib3ZlIHRha2VzIGNhcmUgb2YgYWxsIHJlZ2lvbmFsIFxyXG4gICAgICAgICAgICAgKiBtYW5hZ2VycyBpbiBlYWNoIGZpbGUuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZihtdWx0aUNvbHVtblBhcnNlci5jb250YWluc1N0YXJ0VGFnKHRleHRPZkVsZW1lbnQpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqIFxyXG4gICAgICAgICAgICAgICAgICogU2V0IHVwIHRoZSBjdXJyZW50IGVsZW1lbnQgdG8gYWN0IGFzIHRoZSBwYXJlbnQgZm9yIHRoZSBcclxuICAgICAgICAgICAgICAgICAqIG11bHRpLWNvbHVtbiByZWdpb24uXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGVsLmNoaWxkcmVuWzBdLmRldGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZChNdWx0aUNvbHVtbkxheW91dENTUy5SZWdpb25Sb290Q29udGFpbmVyRGl2KVxyXG4gICAgICAgICAgICAgICAgbGV0IHJlbmRlckVycm9yUmVnaW9uID0gZWwuY3JlYXRlRGl2KHtcclxuICAgICAgICAgICAgICAgICAgICBjbHM6IGAke011bHRpQ29sdW1uTGF5b3V0Q1NTLlJlZ2lvbkVycm9yQ29udGFpbmVyRGl2fSAke011bHRpQ29sdW1uU3R5bGVDU1MuUmVnaW9uRXJyb3JNZXNzYWdlfWAsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGxldCByZW5kZXJDb2x1bW5SZWdpb24gPSBlbC5jcmVhdGVEaXYoe1xyXG4gICAgICAgICAgICAgICAgICAgIGNsczogTXVsdGlDb2x1bW5MYXlvdXRDU1MuUmVnaW9uQ29udGVudENvbnRhaW5lckRpdlxyXG4gICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnRCbG9ja0RhdGEgPSBtdWx0aUNvbHVtblBhcnNlci5nZXRTdGFydEJsb2NrQWJvdmVMaW5lKGxpbmVzT2ZFbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgaWYoc3RhcnRCbG9ja0RhdGEgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGxldCByZWdpb25LZXkgPSBzdGFydEJsb2NrRGF0YS5zdGFydEJsb2NrS2V5O1xyXG4gICAgICAgICAgICAgICAgaWYoZmlsZURPTU1hbmFnZXIuY2hlY2tLZXlFeGlzdHMocmVnaW9uS2V5KSA9PT0gdHJ1ZSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgeyBudW1iZXJPZlRhZ3MsIGtleXMgfSA9IG11bHRpQ29sdW1uUGFyc2VyLmNvdW50U3RhcnRUYWdzKGluZm8udGV4dCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBudW1NYXRjaGVzID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZUYWdzOyBpKyspIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugd2UgY2hlY2tlZCBpZiBrZXkgZXhpc3RzIG9uZSBvZiB0aGVzZSBoYXMgdG8gbWF0Y2guXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGtleXNbaV0gPT09IHJlZ2lvbktleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTWF0Y2hlcysrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gZGlzcGxheSBhbiBlcnJvciBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDIgb2YgdGhlIHNhbWUgaWQgYWNyb3NzXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdob2xlIGRvY3VtZW50LiBUaGlzIHByZXZlbnRzIGVycm9zIHdoZW4gb2JzaWRpYW4gcmVsb2FkcyB0aGUgd2hvbGUgZG9jdW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlcmUgYXJlIHR3byBvZiB0aGUgc2FtZSBrZXkgaW4gdGhlIG1hcC5cclxuICAgICAgICAgICAgICAgICAgICBpZihudW1NYXRjaGVzID49IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVnaW9uS2V5ID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJFcnJvclJlZ2lvbi5pbm5lclRleHQgPSBcIkZvdW5kIG11bHRpcGxlIHJlZ2lvbnMgd2l0aCBlbXB0eSBJRHMuIFBsZWFzZSBzZXQgYSB1bmlxdWUgSUQgYWZ0ZXIgZWFjaCBzdGFydCB0YWcuXFxuRUc6ICc9PT0gbXVsdGktY29sdW1uLXN0YXJ0OiByYW5kb21JRCdcXG5PciB1c2UgJ0ZpeCBNaXNzaW5nIElEcycgaW4gdGhlIGNvbW1hbmQgcGFsZXR0ZSBhbmQgcmVsb2FkIHRoZSBkb2N1bWVudC5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyRXJyb3JSZWdpb24uaW5uZXJUZXh0ID0gXCJSZWdpb24gSUQgYWxyZWFkeSBleGlzdHMgaW4gZG9jdW1lbnQsIHBsZWFzZSBzZXQgYSB1bmlxdWUgSUQuXFxuRUc6ICc9PT0gbXVsdGktY29sdW1uLXN0YXJ0OiByYW5kb21JRCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbC5pZCA9IGBNdWx0aUNvbHVtbklEOiR7cmVnaW9uS2V5fWBcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE1hcmtkb3duUmVuZGVyZXIgPSBuZXcgTWFya2Rvd25SZW5kZXJDaGlsZChlbCk7XHJcbiAgICAgICAgICAgICAgICBmaWxlRE9NTWFuYWdlci5jcmVhdGVSZWdpb25hbE1hbmFnZXIocmVnaW9uS2V5LCBlbCwgcmVuZGVyRXJyb3JSZWdpb24sIHJlbmRlckNvbHVtblJlZ2lvbik7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50TWFya2Rvd25SZW5kZXJlci5vbnVubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihmaWxlRE9NTWFuYWdlcikge1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVET01NYW5hZ2VyLnJlbW92ZVJlZ2lvbihzdGFydEJsb2NrRGF0YS5zdGFydEJsb2NrS2V5KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgY3R4LmFkZENoaWxkKGVsZW1lbnRNYXJrZG93blJlbmRlcmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIE5vdyB3ZSBoYXZlIGNyZWF0ZWQgb3VyIHJlZ2lvbmFsIG1hbmFnZXIgYW5kIGRlZmluZWQgd2hhdCBlbGVtZW50cyBcclxuICAgICAgICAgICAgICAgICAqIG5lZWQgdG8gYmUgcmVuZGVyZWQgaW50by4gU28gd2UgY2FuIHJldHVybiB3aXRob3V0IGFueSBtb3JlIHByb2Nlc3NpbmcuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vI2VuZHJlZ2lvbiBEZXByZWNpYXRlZCBTdGFydCBUYWdcclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBDaGVjayBpZiBhbnkgb2YgdGhlIGxpbmVzIGFib3ZlIHVzIGNvbnRhaW4gYSBzdGFydCBibG9jaywgYW5kIGlmXHJcbiAgICAgICAgICAgICAqIHNvIGdldCB0aGUgbGluZXMgZnJvbSBvdXIgY3VycmVudCBlbGVtZW50IHRvIHRoZSBzdGFydCBibG9jay5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGxldCBzdGFydEJvY2tBYm92ZSA9IG11bHRpQ29sdW1uUGFyc2VyLmdldFN0YXJ0QmxvY2tPckNvZGVibG9ja0Fib3ZlTGluZShsaW5lc0Fib3ZlQXJyYXkpO1xyXG4gICAgICAgICAgICBpZihzdGFydEJvY2tBYm92ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBXZSBub3cga25vdyB3ZSdyZSB3aXRoaW4gYSBtdWx0aS1jb2x1bW4gcmVnaW9uLCBzbyB3ZSB1cGRhdGUgb3VyXHJcbiAgICAgICAgICAgICAqIGxpc3Qgb2YgbGluZXMgYWJvdmUgdG8ganVzdCBiZSB0aGUgaXRlbXMgd2l0aGluIHRoaXMgcmVnaW9uLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGluZXNBYm92ZUFycmF5ID0gc3RhcnRCb2NrQWJvdmUubGluZXNBYm92ZUFycmF5O1xyXG5cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFdlIHVzZSB0aGUgc3RhcnQgYmxvY2sncyBrZXkgdG8gZ2V0IG91ciByZWdpb25hbCBtYW5hZ2VyLiBJZiB0aGlzXHJcbiAgICAgICAgICAgICAqIGxvb2t1cCBmYWlscyB3ZSBjYW4gbm90IGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhpcyBlbGVtZW50LlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGV0IHJlZ2lvbmFsQ29udGFpbmVyOiBSZWdpb25NYW5hZ2VyQ29udGFpbmVyID0gZmlsZURPTU1hbmFnZXIuZ2V0UmVnaW9uYWxDb250YWluZXIoc3RhcnRCb2NrQWJvdmUuc3RhcnRCbG9ja0tleSk7XHJcbiAgICAgICAgICAgIGlmKHJlZ2lvbmFsQ29udGFpbmVyID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcmVnaW9uYWxNYW5hZ2VyOiBSZWdpb25NYW5hZ2VyID0gcmVnaW9uYWxDb250YWluZXIuZ2V0UmVnaW9uKCk7XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogVG8gbWFrZSBzdXJlIHdlJ3JlIHBsYWNpbmcgdGhlIGl0ZW0gaW4gdGhlIHJpZ2h0IGxvY2F0aW9uIChhbmQgXHJcbiAgICAgICAgICAgICAqIG92ZXJ3cml0ZSBlbGVtZW50cyB0aGF0IGFyZSBub3cgZ29uZSkgd2Ugbm93IHdhbnQgYWxsIG9mIHRoZVxyXG4gICAgICAgICAgICAgKiBsaW5lcyBhZnRlciB0aGlzIGVsZW1lbnQgdXAgdG8gdGhlIGVuZCB0YWcuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBsaW5lc0JlbG93QXJyYXkgPSAgbXVsdGlDb2x1bW5QYXJzZXIuZ2V0RW5kQmxvY2tCZWxvdyhsaW5lc0JlbG93QXJyYXkpO1xyXG5cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIE5vdyB3ZSB0YWtlIHRoZSBsaW5lcyBhYm92ZSBvdXIgY3VycmVudCBlbGVtZW50IHVwIHVudGlsIHRoZVxyXG4gICAgICAgICAgICAgKiBzdGFydCByZWdpb24gdGFnIGFuZCByZW5kZXIgdGhhdCBpbnRvIGFuIEhUTUwgZWxlbWVudC4gV2Ugd2lsbCBcclxuICAgICAgICAgICAgICogdXNlIHRoZXNlIGVsZW1lbnRzIHRvIGRldGVybWluZSB3aGVyZSB0byBwbGFjZSBvdXIgY3VycmVudCBlbGVtZW50LlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGV0IHNpYmxpbmdzQWJvdmU6IEhUTUxEaXZFbGVtZW50ID0gcmVuZGVyTWFya2Rvd25Gcm9tTGluZXMobGluZXNBYm92ZUFycmF5LCBzb3VyY2VQYXRoKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzaWJsaW5nc0JlbG93OiBIVE1MRGl2RWxlbWVudCA9IHJlbmRlck1hcmtkb3duRnJvbUxpbmVzKGxpbmVzQmVsb3dBcnJheSwgc291cmNlUGF0aCk7XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogU2V0IHVwIG91ciBkb20gb2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBtYW5hZ2VyLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRPYmplY3Q6IERPTU9iamVjdCA9IG5ldyBET01PYmplY3QoZWwsIGxpbmVzT2ZFbGVtZW50KVxyXG4gICAgICAgICAgICBlbC5pZCA9IGN1cnJlbnRPYmplY3QuVUlEO1xyXG5cclxuICAgICAgICAgICAgY3VycmVudE9iamVjdCA9IFRhc2tMaXN0RE9NT2JqZWN0LmNoZWNrRm9yVGFza0xpc3RFbGVtZW50KGN1cnJlbnRPYmplY3QpXHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogTm93IHdlIGFkZCB0aGUgb2JqZWN0IHRvIHRoZSBtYW5hZ2VyIGFuZCB0aGVuIHNldHVwIHRoZVxyXG4gICAgICAgICAgICAgKiBjYWxsYmFjayBmb3Igd2hlbiB0aGUgb2JqZWN0IGlzIHJlbW92ZWQgZnJvbSB2aWV3IHRoYXQgd2lsbCByZW1vdmUgXHJcbiAgICAgICAgICAgICAqIHRoZSBpdGVtIGZyb20gdGhlIG1hbmFnZXIuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICByZWdpb25hbE1hbmFnZXIuYWRkT2JqZWN0KHNpYmxpbmdzQWJvdmUsIHNpYmxpbmdzQmVsb3csIGN1cnJlbnRPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGVsZW1lbnRNYXJrZG93blJlbmRlcmVyID0gbmV3IE1hcmtkb3duUmVuZGVyQ2hpbGQoZWwpO1xyXG4gICAgICAgICAgICBlbGVtZW50TWFya2Rvd25SZW5kZXJlci5vbnVubG9hZCA9ICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZihyZWdpb25hbENvbnRhaW5lciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgcmVnaW9uYWxNYW5hZ2VyOiBSZWdpb25NYW5hZ2VyID0gcmVnaW9uYWxDb250YWluZXIuZ2V0UmVnaW9uKCk7XHJcbiAgICAgICAgICAgICAgICBpZihyZWdpb25hbE1hbmFnZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW4gYXR0ZW1wdCB0byB1cGRhdGUgdGhlIHZpZXcgaGVyZSBhZnRlciB0aGUgaXRlbSBpcyByZW1vdmVkXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYnV0IG5lZWQgdG8gZ2V0IHRoZSBpdGVtJ3MgcGFyZW50IGVsZW1lbnQgYmVmb3JlIHJlbW92aW5nIG9iamVjdCBmcm9tIG1hbmFnZXIuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ2lvblJlbmRlckRhdGE6IE11bHRpQ29sdW1uUmVuZGVyRGF0YSA9IHJlZ2lvbmFsTWFuYWdlci5nZXRSZWdpb25SZW5kZXJEYXRhKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlZ2lvbmFsTWFuYWdlci5yZW1vdmVPYmplY3QoY3VycmVudE9iamVjdC5VSUQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAgICAgKiBOZWVkIHRvIGNoZWNrIGhlcmUgaWYgZWxlbWVudCBpcyBudWxsIGFzIHRoaXMgY2xvc3VyZSB3aWxsIGJlIGNhbGxlZFxyXG4gICAgICAgICAgICAgICAgICAgICAqIHJlcGVhdGVkbHkgb24gZmlsZSBjaGFuZ2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICAgICAgaWYocmVnaW9uUmVuZGVyRGF0YS5wYXJlbnRSZW5kZXJFbGVtZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVnaW9uYWxNYW5hZ2VyLnJlbmRlclJlZ2lvbkVsZW1lbnRzVG9TY3JlZW4oKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjdHguYWRkQ2hpbGQoZWxlbWVudE1hcmtkb3duUmVuZGVyZXIpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGVsZW1lbnRUZXh0U3BhY2VkID0gbGluZXNPZkVsZW1lbnQucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldiArIFwiXFxuXCIgKyBjdXJyO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIE5vdyB3ZSBjaGVjayBpZiBvdXIgY3VycmVudCBlbGVtZW50IGlzIGEgc3BlY2lhbCBmbGFnIHNvIHdlIGNhblxyXG4gICAgICAgICAgICAgKiBwcm9wZXJseSBzZXQgdGhlIGVsZW1lbnQgdGFnIHdpdGhpbiB0aGUgcmVnaW9uYWwgbWFuYWdlci5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmKG11bHRpQ29sdW1uUGFyc2VyLmNvbnRhaW5zRW5kVGFnKGVsLnRleHRDb250ZW50KSA9PT0gdHJ1ZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGN1cnJlbnRPYmplY3QuZWxlbWVudFR5cGUgPSBFbGVtZW50UmVuZGVyVHlwZS51blJlbmRlcmVkXHJcbiAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyhNdWx0aUNvbHVtblN0eWxlQ1NTLlJlZ2lvbkVuZFRhZylcclxuICAgICAgICAgICAgICAgIHJlZ2lvbmFsTWFuYWdlci51cGRhdGVFbGVtZW50VGFnKGN1cnJlbnRPYmplY3QuVUlELCBET01PYmplY3RUYWcuZW5kUmVnaW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmKG11bHRpQ29sdW1uUGFyc2VyLmNvbnRhaW5zQ29sRW5kVGFnKGVsZW1lbnRUZXh0U3BhY2VkKSA9PT0gdHJ1ZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGN1cnJlbnRPYmplY3QuZWxlbWVudFR5cGUgPSBFbGVtZW50UmVuZGVyVHlwZS51blJlbmRlcmVkXHJcbiAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyhNdWx0aUNvbHVtblN0eWxlQ1NTLkNvbHVtbkVuZFRhZylcclxuICAgICAgICAgICAgICAgIHJlZ2lvbmFsTWFuYWdlci51cGRhdGVFbGVtZW50VGFnKGN1cnJlbnRPYmplY3QuVUlELCBET01PYmplY3RUYWcuY29sdW1uQnJlYWspO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYobXVsdGlDb2x1bW5QYXJzZXIuY29udGFpbnNDb2xTZXR0aW5nc1RhZyhlbGVtZW50VGV4dFNwYWNlZCkgPT09IHRydWUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0LmVsZW1lbnRUeXBlID0gRWxlbWVudFJlbmRlclR5cGUudW5SZW5kZXJlZFxyXG4gICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoTXVsdGlDb2x1bW5TdHlsZUNTUy5SZWdpb25TZXR0aW5ncylcclxuICAgICAgICAgICAgICAgIHJlZ2lvbmFsTWFuYWdlciA9IHJlZ2lvbmFsQ29udGFpbmVyLnNldFJlZ2lvblNldHRpbmdzKGVsZW1lbnRUZXh0U3BhY2VkKVxyXG4gICAgICAgICAgICAgICAgcmVnaW9uYWxNYW5hZ2VyLnVwZGF0ZUVsZW1lbnRUYWcoY3VycmVudE9iamVjdC5VSUQsIERPTU9iamVjdFRhZy5yZWdpb25TZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyhNdWx0aUNvbHVtblN0eWxlQ1NTLlJlZ2lvbkNvbnRlbnQpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJlZ2lvbmFsTWFuYWdlci5yZW5kZXJSZWdpb25FbGVtZW50c1RvU2NyZWVuKClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNTdGFydENvZGVibG9ja0luRXhwb3J0KG5vZGU6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcblxyXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBDT0RFQkxPQ0tfU1RBUlRfU1RSUy5sZW5ndGg7IGkrKykge1xyXG5cclxuICAgICAgICAgICAgaWYobm9kZS5oYXNDbGFzcyhgYmxvY2stbGFuZ3VhZ2UtJHtDT0RFQkxPQ0tfU1RBUlRfU1RSU1tpXX1gKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgZXhwb3J0RG9jdW1lbnRUb1BERihlbDogSFRNTEVsZW1lbnQsIGZpbGVET01NYW5hZ2VyOiBGaWxlRE9NTWFuYWdlciwgc291cmNlUGF0aDogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIC8vIEEgdHJ1ZSBleHBvcnQgd2lsbCBiZSBwYXNzZWQgYW4gZWxlbWVudCB3aXRoIGFsbCBvdGhlciBpdGVtcyBpbiB0aGUgZG9jIGFzIGNoaWxkcmVuLiBcclxuICAgICAgICAvLyBTbyBpZiB0aGVyZSBhcmUgbm8gY2hpbGRyZW4gd2UgY2FuIGp1c3QgcmV0dXJuXHJcbiAgICAgICAgbGV0IGRvY0NoaWxkcmVuID0gQXJyYXkuZnJvbShlbC5jaGlsZE5vZGVzKTtcclxuICAgICAgICBpZihkb2NDaGlsZHJlbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGNoaWxkcmVuVG9SZW1vdmUgPSBbXTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBUbyBleHBvcnQgY29kZWJsb2NrcyB3ZSBuZWVkIHRvIGdldCB0aGUgSURzIHNvIHdlIGNhbiBnZXQgdGhlIGRhdGEgZnJvbSBvdXIgbWFuYWdlcnMuXHJcbiAgICAgICAgLy8gaG93ZXZlciBzaW5jZSB0aGUgSUQgaXNudCBiZWluZyBzdG9yZWQgaW4gdGhlIGVsZW1lbnQgeWV0IHRoaXMgbWVhbnMgd2UgbmVlZCB0byByZWFkXHJcbiAgICAgICAgLy8gYWxsIG9mIHRoZSBJRHMgb3V0IG9mIHRoZSBmdWxsIGRvY3VtZW50LlxyXG4gICAgICAgIGxldCBjb2RlYmxvY2tTdGFydEJsb2NrcyA9IFtdXHJcbiAgICAgICAgbGV0IGFGaWxlID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHNvdXJjZVBhdGgpO1xyXG4gICAgICAgIGlmKGFGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBmaWxlID0gYUZpbGUgYXMgVEZpbGVcclxuICAgICAgICAgICAgbGV0IGZpbGVUZXh0ID0gYXdhaXQgdGhpcy5hcHAudmF1bHQuY2FjaGVkUmVhZChmaWxlKSAvLyBJcyBjYWNoZWQgcmVhZCBPayBoZXJlPyBJdCBzaG91bGQgYmUuXHJcblxyXG4gICAgICAgICAgICAvLyBPbmNlIHdlIGhhdmUgb3VyIGRhdGEgd2Ugc2VhcmNoIHRoZSB0ZXh0IGZvciBhbGwgY29kZWJsb2NrIHN0YXJ0IHZhbHVlcy5cclxuICAgICAgICAgICAgLy8gc3RvcmluZyB0aGVtIGludG8gb3VyIHF1ZXVlLlxyXG4gICAgICAgICAgICBsZXQgY29kZUJsb2NrRGF0YSA9IG11bHRpQ29sdW1uUGFyc2VyLmZpbmRTdGFydENvZGVibG9jayhmaWxlVGV4dCk7XHJcbiAgICAgICAgICAgIHdoaWxlKGNvZGVCbG9ja0RhdGEuZm91bmQgPT09IHRydWUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY29kZWJsb2NrVGV4dCA9IGZpbGVUZXh0LnNsaWNlKGNvZGVCbG9ja0RhdGEuc3RhcnRQb3NpdGlvbiwgY29kZUJsb2NrRGF0YS5lbmRQb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICBmaWxlVGV4dCA9IGZpbGVUZXh0LnNsaWNlKGNvZGVCbG9ja0RhdGEuZW5kUG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgY29kZWJsb2NrU3RhcnRCbG9ja3MucHVzaChjb2RlYmxvY2tUZXh0KTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb2RlQmxvY2tEYXRhID0gbXVsdGlDb2x1bW5QYXJzZXIuZmluZFN0YXJ0Q29kZWJsb2NrKGZpbGVUZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gIFxyXG5cclxuICAgICAgICBsZXQgaW5CbG9jayA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9jQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IGRvY0NoaWxkcmVuW2ldO1xyXG4gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkRWwgPSBjaGlsZCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGlmIChpbkJsb2NrID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZEJsb2NrRGF0YSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZWdpb25LZXkgPSBcIlwiO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgYmxvY2tEYXRhID0gbXVsdGlDb2x1bW5QYXJzZXIuaXNTdGFydFRhZ1dpdGhJRChjaGlsZC50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrRGF0YS5pc1N0YXJ0VGFnID09PSB0cnVlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEJsb2NrRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9ja0RhdGEuaGFzS2V5ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmRLZXkgPSBtdWx0aUNvbHVtblBhcnNlci5nZXRTdGFydFRhZ0tleShjaGlsZC50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRLZXkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25LZXkgPSBmb3VuZEtleTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGJsb2NrRGF0YS5pc1N0YXJ0VGFnID09PSBmYWxzZSAmJiB0aGlzLmlzU3RhcnRDb2RlYmxvY2tJbkV4cG9ydChjaGlsZCkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzdGFydCB0YWcgZnJvbSB0aGUgb2xkIHZlcnNpb24gaXMgbnVsbCB3ZSB0aGVuIGNoZWNrIHRvIHNlZSBpZiB0aGUgZWxlbWVudCBpc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGNvZGVibG9jayBzdGFydC4gSWYgaXQgaXMgd2UgdXNlIHRoZSBuZXh0IGF2YWlsYWJsZSBjb2RlYmxvY2sgZGF0YSB0byByZXRyaWV2ZSBvdXIgSUQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2RlYmxvY2tUZXh0ID0gY29kZWJsb2NrU3RhcnRCbG9ja3Muc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29kZWJsb2NrVGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRm91bmQgdW5kZWZpbmVkIGNvZGVibG9jayBkYXRhIHdoZW4gZXhwb3J0aW5nLlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSBwYXJzZVN0YXJ0UmVnaW9uQ29kZUJsb2NrSUQoY29kZWJsb2NrVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlkICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEJsb2NrRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25LZXkgPSBpZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZm91bmRCbG9ja0RhdGEgPT09IHRydWUgJiYgcmVnaW9uS2V5ICE9PSBcIlwiKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbkJsb2NrID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBjaGlsZC5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuY2hpbGRyZW5baV0uZGV0YWNoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuaW5uZXJUZXh0ID0gXCJcIjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmNsYXNzTGlzdC5hZGQoTXVsdGlDb2x1bW5MYXlvdXRDU1MuUmVnaW9uUm9vdENvbnRhaW5lckRpdik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZW5kZXJFcnJvclJlZ2lvbiA9IGNoaWxkLmNyZWF0ZURpdih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGAke011bHRpQ29sdW1uTGF5b3V0Q1NTLlJlZ2lvbkVycm9yQ29udGFpbmVyRGl2fSwgJHtNdWx0aUNvbHVtblN0eWxlQ1NTLlJlZ2lvbkVycm9yTWVzc2FnZX1gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlbmRlckNvbHVtblJlZ2lvbiA9IGNoaWxkLmNyZWF0ZURpdih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHM6IE11bHRpQ29sdW1uTGF5b3V0Q1NTLlJlZ2lvbkNvbnRlbnRDb250YWluZXJEaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ2lvbmFsQ29udGFpbmVyOiBSZWdpb25NYW5hZ2VyQ29udGFpbmVyID0gZmlsZURPTU1hbmFnZXIuZ2V0UmVnaW9uYWxDb250YWluZXIocmVnaW9uS2V5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ2lvbmFsQ29udGFpbmVyID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJFcnJvclJlZ2lvbi5pbm5lclRleHQgPSBcIkVycm9yIHJlbmRlcmluZyBtdWx0aS1jb2x1bW4gcmVnaW9uLlxcblBsZWFzZSBjbG9zZSBhbmQgcmVvcGVuIHRoZSBmaWxlLCB0aGVuIG1ha2Ugc3VyZSB5b3UgYXJlIGluIHJlYWRpbmcgbW9kZSBiZWZvcmUgZXhwb3J0aW5nLlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ2lvbmFsTWFuYWdlcjogUmVnaW9uTWFuYWdlciA9IHJlZ2lvbmFsQ29udGFpbmVyLmdldFJlZ2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uYWxNYW5hZ2VyLmV4cG9ydFJlZ2lvbkVsZW1lbnRzVG9QREYocmVuZGVyQ29sdW1uUmVnaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlDb2x1bW5QYXJzZXIuY29udGFpbnNFbmRUYWcoY2hpbGQudGV4dENvbnRlbnQpID09PSB0cnVlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbkJsb2NrID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlblRvUmVtb3ZlLnB1c2goY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjaGlsZHJlblRvUmVtb3ZlLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICAgICAgICBlbC5yZW1vdmVDaGlsZChjaGlsZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tFeHBvcnRpbmcoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgaWYoZWxlbWVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZihlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcInByaW50XCIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoZWxlbWVudC5wYXJlbnROb2RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrRXhwb3J0aW5nKGVsZW1lbnQucGFyZW50RWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0dXBNYXJrZG93bkNvZGVibG9ja1Bvc3RQcm9jZXNzb3Ioc3RhcnRTdHI6IHN0cmluZykge1xyXG5cclxuICAgICAgICB0aGlzLnJlZ2lzdGVyTWFya2Rvd25Db2RlQmxvY2tQcm9jZXNzb3Ioc3RhcnRTdHIsIChzb3VyY2UsIGVsLCBjdHgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSBjdHguc291cmNlUGF0aDtcclxuICAgICAgICBcclxuICAgICAgICAgICAgLy8gU2V0IHVwIG91ciBDU1Mgc28gdGhhdCB0aGUgY29kZWJsb2NrIG9ubHkgcmVuZGVycyB0aGlzIGRhdGEgaW4gcmVhZGluZyBtb2RlXHJcbiAgICAgICAgICAgIC8vIHNvdXJjZS9saXZlIHByZXZpZXcgbW9kZSBpcyBoYW5kbGVkIGJ5IHRoZSBDTTYgaW1wbGVtZW50YXRpb24uXHJcbiAgICAgICAgICAgIGVsLnBhcmVudEVsZW1lbnQ/LmFkZENsYXNzKFwicHJlaXZldy1tY20tc3RhcnQtYmxvY2tcIik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFRvIGRldGVybWluZSB3aGF0IGtpbmQgb2YgdmlldyB3ZSBhcmUgcmVuZGVyaW5nIGluIHdlIG5lZWQgYSBtYXJrZG93biBsZWFmLlxyXG4gICAgICAgICAgICAvLyBSZWFsbHkgdGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuIGhlcmUgc2luY2UgcmVuZGVyaW5nIGlzIG9ubHkgZG9uZSBpbiBtYXJrZG93biBsZWF2ZXMuXHJcbiAgICAgICAgICAgIGxldCBtYXJrZG93bkxlYXZlcyA9IGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFwibWFya2Rvd25cIik7XHJcbiAgICAgICAgICAgIGlmKG1hcmtkb3duTGVhdmVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBsZWFmXHJcbiAgICAgICAgICAgIGxldCBmb3VuZEZpbGVMZWFmID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBtYXJrZG93bkxlYXZlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IGZpbGVMZWFmID0gZ2V0RmlsZUxlYWYoc291cmNlUGF0aCk7XHJcbiAgICAgICAgICAgICAgICBpZihmaWxlTGVhZiA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm91bmRGaWxlTGVhZiA9IHRydWU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZihnZXRMZWFmU291cmNlTW9kZShmaWxlTGVhZikgPT09IFwic291cmNlXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgaWYodGhpcy5nbG9iYWxNYW5hZ2VyID09PSBudWxsIHx8IHRoaXMuZ2xvYmFsTWFuYWdlciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdsb2JhbCBtYW5hZ2VyIGlzIHVuZGVmaW5lZD9cIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBmaWxlRE9NTWFuYWdlciA9IHRoaXMuZ2xvYmFsTWFuYWdlci5nZXRGaWxlTWFuYWdlcihzb3VyY2VQYXRoKTtcclxuICAgICAgICAgICAgaWYoZmlsZURPTU1hbmFnZXIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gU2V0IGZpbGUgdG8gaGF2ZSBzdGFydCB0YWcuXHJcbiAgICAgICAgICAgIGZpbGVET01NYW5hZ2VyLnNldEhhc1N0YXJ0VGFnKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEdldCB0aGUgaW5mbyBmb3Igb3VyIGN1cnJlbnQgY29udGV4dCBhbmQgdGhlbiBjaGVja1xyXG4gICAgICAgICAgICAvLyBpZiB0aGUgZW50aXJlIHRleHQgY29udGFpbnMgYSBzdGFydCB0YWcuIElmIHRoZXJlIGlzXHJcbiAgICAgICAgICAgIC8vIG5vIHN0YXJ0IHRhZyBpbiB0aGUgZG9jdW1lbnQgd2UgY2FuIGp1c3QgcmV0dXJuIGFuZFxyXG4gICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHJlc3Qgb2YgdGhlIHBhcnNpbmcuXHJcbiAgICAgICAgICAgIGxldCBpbmZvID0gY3R4LmdldFNlY3Rpb25JbmZvKGVsKTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFdlIG5lZWQgdGhlIGNvbnRleHQgaW5mbyB0byBwcm9wZXJseSBwYXJzZSBzbyByZXR1cm5pbmcgaGVyZSBcclxuICAgICAgICAgICAgICogaW5mbyBpcyBudWxsLiBUT0RPOiBTZXQgZXJyb3IgaW4gdmlldyBpZiB0aGlzIG9jY3Vycy5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmKCFpbmZvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgLyoqIFxyXG4gICAgICAgICAgICAgKiBTZXQgdXAgdGhlIGN1cnJlbnQgZWxlbWVudCB0byBhY3QgYXMgdGhlIHBhcmVudCBmb3IgdGhlIFxyXG4gICAgICAgICAgICAgKiBtdWx0aS1jb2x1bW4gcmVnaW9uLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZChNdWx0aUNvbHVtbkxheW91dENTUy5SZWdpb25Sb290Q29udGFpbmVyRGl2KVxyXG4gICAgICAgICAgICBsZXQgcmVuZGVyRXJyb3JSZWdpb24gPSBlbC5jcmVhdGVEaXYoe1xyXG4gICAgICAgICAgICAgICAgY2xzOiBgJHtNdWx0aUNvbHVtbkxheW91dENTUy5SZWdpb25FcnJvckNvbnRhaW5lckRpdn0gJHtNdWx0aUNvbHVtblN0eWxlQ1NTLlJlZ2lvbkVycm9yTWVzc2FnZX1gLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbGV0IHJlbmRlckNvbHVtblJlZ2lvbiA9IGVsLmNyZWF0ZURpdih7XHJcbiAgICAgICAgICAgICAgICBjbHM6IE11bHRpQ29sdW1uTGF5b3V0Q1NTLlJlZ2lvbkNvbnRlbnRDb250YWluZXJEaXZcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICBcclxuICAgICAgICAgICAgbGV0IHJlZ2lvbktleSA9IHBhcnNlU3RhcnRSZWdpb25Db2RlQmxvY2tJRChzb3VyY2UpO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgY3JlYXRlTmV3UmVnaW9uTWFuYWdlciA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmKGZpbGVET01NYW5hZ2VyLmNoZWNrS2V5RXhpc3RzKHJlZ2lvbktleSkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlTmV3UmVnaW9uTWFuYWdlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgbGV0IHsgbnVtYmVyT2ZUYWdzLCBrZXlzIH0gPSBtdWx0aUNvbHVtblBhcnNlci5jb3VudFN0YXJ0VGFncyhpbmZvLnRleHQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IG51bU1hdGNoZXMgPSAwO1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IG51bWJlck9mVGFnczsgaSsrKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB3ZSBjaGVja2VkIGlmIGtleSBleGlzdHMgb25lIG9mIHRoZXNlIGhhcyB0byBtYXRjaC5cclxuICAgICAgICAgICAgICAgICAgICBpZihrZXlzW2ldID09PSByZWdpb25LZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtTWF0Y2hlcysrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgd2FudCB0byBkaXNwbGF5IGFuIGVycm9yIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMiBvZiB0aGUgc2FtZSBpZCBhY3Jvc3NcclxuICAgICAgICAgICAgICAgIC8vIHRoZSB3aG9sZSBkb2N1bWVudC4gVGhpcyBwcmV2ZW50cyBlcnJvcyB3aGVuIG9ic2lkaWFuIHJlbG9hZHMgdGhlIHdob2xlIGRvY3VtZW50XHJcbiAgICAgICAgICAgICAgICAvLyBhbmQgdGhlcmUgYXJlIHR3byBvZiB0aGUgc2FtZSBrZXkgaW4gdGhlIG1hcC5cclxuICAgICAgICAgICAgICAgIGlmKG51bU1hdGNoZXMgPj0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHJlZ2lvbktleSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJFcnJvclJlZ2lvbi5pbm5lclRleHQgPSBcIkZvdW5kIG11bHRpcGxlIHJlZ2lvbnMgd2l0aCBlbXB0eSBJRHMuIFBsZWFzZSBzZXQgYSB1bmlxdWUgSUQgYWZ0ZXIgZWFjaCBzdGFydCB0YWcuXFxuRUc6ICc9PT0gbXVsdGktY29sdW1uLXN0YXJ0OiByYW5kb21JRCdcXG5PciB1c2UgJ0ZpeCBNaXNzaW5nIElEcycgaW4gdGhlIGNvbW1hbmQgcGFsZXR0ZSBhbmQgcmVsb2FkIHRoZSBkb2N1bWVudC5cIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyRXJyb3JSZWdpb24uaW5uZXJUZXh0ID0gXCJSZWdpb24gSUQgYWxyZWFkeSBleGlzdHMgaW4gZG9jdW1lbnQsIHBsZWFzZSBzZXQgYSB1bmlxdWUgSUQuXFxuRUc6ICc9PT0gbXVsdGktY29sdW1uLXN0YXJ0OiByYW5kb21JRCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWwuaWQgPSBgTXVsdGlDb2x1bW5JRDoke3JlZ2lvbktleX1gXHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIElmIHNvbWV0aGluZyBjaGFuZ2VzIGluIHRoZSBjb2RlYmxvY2sgd2UgZG9udCBuZWNlc3NhcmlseSB3YW50IHRvIHVwZGF0ZSBvdXJcclxuICAgICAgICAgICAgLy8gb2xkIHJlZmVyZW5jZSB0byB0aGUgcmVnaW9uIG1hbmFnZXIuIFRoaXMgY291bGQgYmUgYSBwb3RlbnRpYWwgYnVnIGFyZWEuXHJcbiAgICAgICAgICAgIGlmKGNyZWF0ZU5ld1JlZ2lvbk1hbmFnZXIgPT09IHRydWUpIHtcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyByZWdpb25hbCBtYW5hZ2VyLlxyXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRNYXJrZG93blJlbmRlcmVyID0gbmV3IE1hcmtkb3duUmVuZGVyQ2hpbGQoZWwpO1xyXG4gICAgICAgICAgICAgICAgZmlsZURPTU1hbmFnZXIuY3JlYXRlUmVnaW9uYWxNYW5hZ2VyKHJlZ2lvbktleSwgZWwsIHJlbmRlckVycm9yUmVnaW9uLCByZW5kZXJDb2x1bW5SZWdpb24pO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gU2V0IHVwIHRoZSBvbiB1bmxvYWQgY2FsbGJhY2suIFRoaXMgY2FuIGJlIGNhbGxlZCBpZiB0aGUgdXNlciBjaGFuZ2VzXHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgc3RhcnQvc2V0dGluZ3MgY29kZWJsb2NrIGluIGFueSB3YXkuIFdlIG9ubHkgd2FudCB0byB1bmxvYWRcclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBmaWxlIGlzIGJlaW5nIHJlbW92ZWQgZnJvbSB2aWV3LlxyXG4gICAgICAgICAgICAgICAgZWxlbWVudE1hcmtkb3duUmVuZGVyZXIub251bmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZmlsZURPTU1hbmFnZXIgJiYgZmlsZVN0aWxsSW5WaWV3KHNvdXJjZVBhdGgpID09PSBmYWxzZSkge1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiRmlsZSBub3QgaW4gYW55IG1hcmtkb3duIGxlYWYuIFJlbW92aW5nIHJlZ2lvbiBmcm9tIGRvbSBtYW5hZ2VyLlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlRE9NTWFuYWdlci5yZW1vdmVSZWdpb24ocmVnaW9uS2V5KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgY3R4LmFkZENoaWxkKGVsZW1lbnRNYXJrZG93blJlbmRlcmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgcmVnaW9uYWxNYW5hZ2VyQ29udGFpbmVyID0gZmlsZURPTU1hbmFnZXIuZ2V0UmVnaW9uYWxDb250YWluZXIocmVnaW9uS2V5KTtcclxuICAgICAgICAgICAgaWYocmVnaW9uYWxNYW5hZ2VyQ29udGFpbmVyICE9PSBudWxsKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgcmVnaW9uYWxNYW5hZ2VyID0gcmVnaW9uYWxNYW5hZ2VyQ29udGFpbmVyLnNldFJlZ2lvblNldHRpbmdzKHNvdXJjZSk7XHJcbiAgICAgICAgICAgICAgICByZWdpb25hbE1hbmFnZXIucmVnaW9uUGFyZW50ID0gZWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IHR5cGUgbmVhcmJ5U2libGluZ3MgPSB7IFxyXG4gICAgc2libGluZ3NBYm92ZTogSFRNTERpdkVsZW1lbnQsXHJcbiAgICBjdXJyZW50T2JqZWN0OiBET01PYmplY3QsIFxyXG59XHJcbmZ1bmN0aW9uIHJlbmRlck1hcmtkb3duRnJvbUxpbmVzKG1kTGluZXM6IHN0cmluZ1tdLCBzb3VyY2VQYXRoOiBzdHJpbmcpOiBIVE1MRGl2RWxlbWVudCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXZSByZS1yZW5kZXIgYWxsIG9mIHRoZSBpdGVtcyBhYm92ZSBvdXIgZWxlbWVudCwgdW50aWwgdGhlIHN0YXJ0IHRhZywgXHJcbiAgICAgKiBzbyB3ZSBjYW4gZGV0ZXJtaW5lIHdoZXJlIHRvIHBsYWNlIHRoZSBuZXcgaXRlbSBpbiB0aGUgbWFuYWdlci5cclxuICAgICAqIFxyXG4gICAgICogVE9ETzogQ2FuIHJlZHVjZSB0aGUgYW1vdW50IG5lZWRpbmcgdG8gYmUgcmVuZGVyZWQgYnkgb25seSByZW5kZXJpbmcgdG9cclxuICAgICAqIHRoZSBzdGFydCB0YWcgb3IgYSBjb2x1bW4tYnJlYWsgd2hpY2hldmVyIGlzIGNsb3Nlci5cclxuICAgICAqL1xyXG4gICAgbGV0IHNpYmxpbmdzID0gY3JlYXRlRGl2KCk7XHJcbiAgICBsZXQgbWFya2Rvd25SZW5kZXJDaGlsZCA9IG5ldyBNYXJrZG93blJlbmRlckNoaWxkKFxyXG4gICAgICAgIHNpYmxpbmdzXHJcbiAgICApO1xyXG4gICAgTWFya2Rvd25SZW5kZXJlci5yZW5kZXJNYXJrZG93bihcclxuICAgICAgICBtZExpbmVzLnJlZHVjZSgocHJldiwgY3VycmVudCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJldiArIFwiXFxuXCIgICsgY3VycmVudDtcclxuICAgICAgICB9LCBcIlwiKSxcclxuICAgICAgICBzaWJsaW5ncyxcclxuICAgICAgICBzb3VyY2VQYXRoLFxyXG4gICAgICAgIG1hcmtkb3duUmVuZGVyQ2hpbGRcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHNpYmxpbmdzO1xyXG59XHJcbiJdLCJuYW1lcyI6WyJNYXJrZG93blJlbmRlckNoaWxkIiwiV2lkZ2V0VHlwZSIsIk1hcmtkb3duUmVuZGVyZXIiLCJTdGF0ZUZpZWxkIiwiRGVjb3JhdGlvbiIsIlJhbmdlU2V0QnVpbGRlciIsInN5bnRheFRyZWUiLCJ0b2tlbkNsYXNzTm9kZVByb3AiLCJFZGl0b3JWaWV3IiwiUGx1Z2luIiwiTm90aWNlIiwibXVsdGlDb2x1bW5QYXJzZXIuZmluZFN0YXJ0Q29kZWJsb2NrIiwibXVsdGlDb2x1bW5QYXJzZXIuaXNTdGFydFRhZ1dpdGhJRCIsIm11bHRpQ29sdW1uUGFyc2VyLmNvbnRhaW5zU3RhcnRUYWciLCJtdWx0aUNvbHVtblBhcnNlci5jb250YWluc1N0YXJ0Q29kZUJsb2NrIiwibXVsdGlDb2x1bW5QYXJzZXIuZ2V0U3RhcnRCbG9ja0Fib3ZlTGluZSIsIm11bHRpQ29sdW1uUGFyc2VyLmNvdW50U3RhcnRUYWdzIiwibXVsdGlDb2x1bW5QYXJzZXIuZ2V0U3RhcnRCbG9ja09yQ29kZWJsb2NrQWJvdmVMaW5lIiwibXVsdGlDb2x1bW5QYXJzZXIuZ2V0RW5kQmxvY2tCZWxvdyIsIm11bHRpQ29sdW1uUGFyc2VyLmNvbnRhaW5zRW5kVGFnIiwibXVsdGlDb2x1bW5QYXJzZXIuY29udGFpbnNDb2xFbmRUYWciLCJtdWx0aUNvbHVtblBhcnNlci5jb250YWluc0NvbFNldHRpbmdzVGFnIiwiVEZpbGUiLCJtdWx0aUNvbHVtblBhcnNlci5nZXRTdGFydFRhZ0tleSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXVEQTtBQUNPLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMvRCxRQUFRLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDbkcsUUFBUSxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDdEcsUUFBUSxTQUFTLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDdEgsUUFBUSxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUUsS0FBSyxDQUFDLENBQUM7QUFDUDs7QUM3RUE7Ozs7OztBQU1HO0FBRUgsSUFBWSxZQU9YLENBQUE7QUFQRCxDQUFBLFVBQVksWUFBWSxFQUFBO0FBQ3BCLElBQUEsWUFBQSxDQUFBLFlBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxTQUFPLENBQUE7QUFDUCxJQUFBLFlBQUEsQ0FBQSxZQUFBLENBQUEsSUFBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEdBQUEsSUFBRSxDQUFBO0FBQ0YsSUFBQSxZQUFBLENBQUEsWUFBQSxDQUFBLE1BQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxHQUFBLE1BQUksQ0FBQTtBQUNKLElBQUEsWUFBQSxDQUFBLFlBQUEsQ0FBQSxVQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxVQUFRLENBQUE7QUFDUixJQUFBLFlBQUEsQ0FBQSxZQUFBLENBQUEsS0FBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEdBQUEsS0FBRyxDQUFBO0FBQ0gsSUFBQSxZQUFBLENBQUEsWUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxHQUFBLE9BQUssQ0FBQTtBQUNULENBQUMsRUFQVyxZQUFZLEtBQVosWUFBWSxHQU92QixFQUFBLENBQUEsQ0FBQSxDQUFBO0FBRUQsSUFBWSxZQU9YLENBQUE7QUFQRCxDQUFBLFVBQVksWUFBWSxFQUFBO0FBQ3BCLElBQUEsWUFBQSxDQUFBLFlBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxTQUFPLENBQUE7QUFDUCxJQUFBLFlBQUEsQ0FBQSxZQUFBLENBQUEsSUFBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEdBQUEsSUFBRSxDQUFBO0FBQ0YsSUFBQSxZQUFBLENBQUEsWUFBQSxDQUFBLE1BQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxHQUFBLE1BQUksQ0FBQTtBQUNKLElBQUEsWUFBQSxDQUFBLFlBQUEsQ0FBQSxVQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxVQUFRLENBQUE7QUFDUixJQUFBLFlBQUEsQ0FBQSxZQUFBLENBQUEsS0FBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEdBQUEsS0FBRyxDQUFBO0FBQ0gsSUFBQSxZQUFBLENBQUEsWUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxHQUFBLE9BQUssQ0FBQTtBQUNULENBQUMs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 diff --git a/.obsidian/plugins/multi-column-markdown/manifest.json b/.obsidian/plugins/multi-column-markdown/manifest.json new file mode 100644 index 00000000..38067c2c --- /dev/null +++ b/.obsidian/plugins/multi-column-markdown/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "multi-column-markdown", + "name": "Multi-Column Markdown", + "version": "0.7.2", + "minAppVersion": "0.15.9", + "description": "This plugin adds functionality to create markdown documents with multiple columns of content viewable within Obsidian's preview mode", + "author": "Cameron Robinson", + "authorUrl": "https://portfolio.ckrobinson.net", + "isDesktopOnly": false +} diff --git a/.obsidian/plugins/multi-column-markdown/styles.css b/.obsidian/plugins/multi-column-markdown/styles.css new file mode 100644 index 00000000..c333dcb9 --- /dev/null +++ b/.obsidian/plugins/multi-column-markdown/styles.css @@ -0,0 +1,151 @@ +.mcm-single-column-layout-left { + left: 10px; +} +.mcm-single-column-layout-right { + right: 10px; +} +.mcm-single-column-small { + width: 25%; +} +.mcm-single-column-medium { + width: 50%; +} +.mcm-single-column-large { + width: 75%; +} + +/* ----------------------------------- */ + +.mcm-singlecol-layout-right { + justify-content: right; +} +.mcm-singlecol-layout-left { + justify-content: left; +} +.mcm-singlecol-layout-center { + justify-content: center; +} + +/* ----------------------------------- */ + +.mcm-column-spacer { + margin-inline: 0.25%; +} + +/* ----------------------------------- */ + +.mcm-two-equal-columns { + width: 49.75%; +} + +.mcm-two-column-large { + width: 66.75%; +} + +.mcm-two-column-small { + width: 32.75%; +} + +/* ----------------------------------- */ + +.mcm-three-equal-columns { + width: 32.75%; +} + +/* ----------------------------------- */ + +.mcm-three-column-large { + width: 49.75%; +} +.mcm-three-column-small { + width: 24.5%; +} + +/* ----------------------------------- */ + +.mcm-column-div { + padding-inline: 10px; +} + +.mcm-column-border { + border: grey; + border-style: solid; + border-width: 0.5px; +} + +.mcm-column-shadow { + box-shadow: 0 0.2rem 0.5rem var(--background-modifier-box-shadow); +} + +.mcm-column-error-message { + margin-bottom: 10px; + color: var(--text-error); + text-align: center; +} + +.mcm-column-root-container { + margin: 1.5625em 0; +} + +.mcm-column-parent-container { + padding: 0; + overflow: hidden; + color: var(--text-normal); + page-break-inside: avoid; + + border-radius: 0.1rem; + + display:flex; + flex-direction:row; +} + +.mcm-region-shadow { + box-shadow: 0 0.2rem 0.5rem var(--background-modifier-box-shadow); +} + +.mcm-column-end-tag-wrapper, +.mcm-column-break-tag-wrapper, +.mcm-column-settings-wrapper, +.mcm-column-content-wrapper { + opacity: 0; +} + +.mcm-column-div .mcm-column-content-wrapper { + opacity: 100; +} + +.markdown-preview-section > .mcm-column-content-wrapper, + .mcm-column-break-tag-wrapper, + .mcm-column-end-tag-wrapper, + .mcm-column-settings-wrapper { + height: 0px !important; + overflow: hidden; +} + +.mcm-original-column-element + .mcm-cloned-column-element { + display: none; +} + +.mcm-cm-preview { + line-height: var(--lh); + white-space: normal; + word-break: keep-all; + word-wrap: normal; +} + +.mcm-col-settings-preview { + color: var(--text-normal); +} + +.cm-preview-code-block.preivew-mcm-start-block { + height: 0pt !important; + padding: 0pt !important; +} + +.mcm-content-overflow-hidden { + overflow-x: hidden; +} + +.mcm-content-overflow-auto-scroll { + overflow-x: auto; +} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-activity-history/data.json b/.obsidian/plugins/obsidian-activity-history/data.json index 773ca55b..49b39b7f 100644 --- a/.obsidian/plugins/obsidian-activity-history/data.json +++ b/.obsidian/plugins/obsidian-activity-history/data.json @@ -12,8 +12,8 @@ "checkpointList": [ { "path": "/", - "date": "2022-08-28", - "size": 6866748 + "date": "2022-08-31", + "size": 6876717 } ], "activityHistory": [ @@ -942,7 +942,19 @@ }, { "date": "2022-08-28", - "value": 121125 + "value": 121140 + }, + { + "date": "2022-08-29", + "value": 4931 + }, + { + "date": "2022-08-30", + "value": 1949 + }, + { + "date": "2022-08-31", + "value": 7626 } ] } diff --git a/.obsidian/plugins/obsidian-book-search-plugin/main.js b/.obsidian/plugins/obsidian-book-search-plugin/main.js index b49b7cfc..ecdc934a 100644 --- a/.obsidian/plugins/obsidian-book-search-plugin/main.js +++ b/.obsidian/plugins/obsidian-book-search-plugin/main.js @@ -3,10 +3,10 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ -var Lr=Object.create;var ke=Object.defineProperty;var Fr=Object.getOwnPropertyDescriptor;var _r=Object.getOwnPropertyNames,Lt=Object.getOwnPropertySymbols,Vr=Object.getPrototypeOf,Ft=Object.prototype.hasOwnProperty,Hr=Object.prototype.propertyIsEnumerable;var _t=(r,e,t)=>e in r?ke(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,xe=(r,e)=>{for(var t in e||(e={}))Ft.call(e,t)&&_t(r,t,e[t]);if(Lt)for(var t of Lt(e))Hr.call(e,t)&&_t(r,t,e[t]);return r};var Vt=r=>ke(r,"__esModule",{value:!0});var $r=(r,e)=>{Vt(r);for(var t in e)ke(r,t,{get:e[t],enumerable:!0})},Wr=(r,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of _r(e))!Ft.call(r,o)&&o!=="default"&&ke(r,o,{get:()=>e[o],enumerable:!(t=Fr(e,o))||t.enumerable});return r},W=r=>Wr(Vt(ke(r!=null?Lr(Vr(r)):{},"default",r&&r.__esModule&&"default"in r?{get:()=>r.default,enumerable:!0}:{value:r,enumerable:!0})),r);var d=(r,e,t)=>new Promise((o,i)=>{var n=l=>{try{s(t.next(l))}catch(c){i(c)}},a=l=>{try{s(t.throw(l))}catch(c){i(c)}},s=l=>l.done?o(l.value):Promise.resolve(l.value).then(n,a);s((t=t.apply(r,e)).next())});$r(exports,{default:()=>Ot});var kr=W(require("path")),Ce=W(require("obsidian"));var oe=W(require("obsidian"));var N;(function(t){t.google="google",t.naver="naver"})(N||(N={}));var Ht=W(require("obsidian"));var tt=class{getByQuery(e){return d(this,null,function*(){try{let t={q:e,maxResults:40,printType:"books"},o=window.moment.locale();o&&(t.langRestrict=o);let i=yield $e("https://www.googleapis.com/books/v1/volumes",t);return(i==null?void 0:i.totalItems)?i.items.map(({volumeInfo:n})=>this.createBookItem(n)):[]}catch(t){throw console.warn(t),t}})}getISBN(e){return e==null?void 0:e.reduce((t,o)=>(o.type=="ISBN_10"&&(t.isbn10=o.identifier.trim()),o.type=="ISBN_13"&&(t.isbn13=o.identifier.trim()),t),{})}createBookItem(e){var o,i,n,a,s;return xe({title:e.title,author:this.formatList(e.authors),category:this.formatList(e.categories),publisher:e.publisher,totalPage:e.pageCount,coverUrl:(i=(o=e.imageLinks)==null?void 0:o.thumbnail)!=null?i:"",coverSmallUrl:(a=(n=e.imageLinks)==null?void 0:n.smallThumbnail)!=null?a:"",publishDate:((s=e.publishedDate)==null?void 0:s.slice(0,4))||"",description:e.description,link:e.canonicalVolumeLink||e.infoLink,previewLink:e.previewLink},this.getISBN(e.industryIdentifiers))}convertGoogleBookImageURLSize(e,t){return e.replace(/(&zoom)=\d/,`$1=${t}`)}formatList(e){var t,o;return(e==null?void 0:e.length)>1?e.map(i=>`${i.trim()}`).join(", "):(o=(t=e==null?void 0:e[0])==null?void 0:t.replace("N/A",""))!=null?o:""}};var rt=class{constructor(e,t){this.clientId=e;this.clientSecret=t}getByQuery(e){return d(this,null,function*(){try{let t={query:e,display:50,sort:"sim"},o={"X-Naver-Client-Id":this.clientId,"X-Naver-Client-Secret":this.clientSecret},i=yield $e("https://openapi.naver.com/v1/search/book.json",t,o);return(i==null?void 0:i.total)?i.items.map(this.createBookItem):[]}catch(t){throw console.warn(t),t}})}createBookItem(e){var t,o;return xe({title:e.title,author:e.author,publisher:e.publisher,coverUrl:e.image,publishDate:((t=e.pubdate)==null?void 0:t.slice(0,4))||"",link:e.link,description:e.description,isbn:e.isbn},((o=e.isbn)==null?void 0:o.length)>=13?{isbn13:e.isbn}:{isbn10:e.isbn})}};function $t(r){if(r.serviceProvider===N.google)return new tt;if(r.serviceProvider===N.naver){if(!r.naverClientId||!r.naverClientSecret)throw new Error('\uB124\uC774\uBC84 \uAC1C\uBC1C\uC790\uC13C\uD130\uC5D0\uC11C "Client ID"\uC640 "Client Secret"\uB97C \uBC1C\uAE09\uBC1B\uC544 \uC124\uC815\uD574\uC8FC\uC138\uC694.');return new rt(r.naverClientId,r.naverClientSecret)}}function $e(o){return d(this,arguments,function*(r,e={},t){let i=new URL(r);return Object.entries(e).forEach(([a,s])=>{i.searchParams.append(a,s==null?void 0:s.toString())}),(yield(0,Ht.requestUrl)({url:i.href,method:"GET",headers:xe({Accept:"*/*","Content-Type":"application/json; charset=utf-8"},t)})).json})}var ot=class extends oe.Modal{constructor(e,t,o){super(e.app);this.query=t,this.callback=o,this.serviceProvider=$t(e.settings)}setBusy(e){this.isBusy=e,this.okBtnRef.setDisabled(e),this.okBtnRef.setButtonText(e?"Requesting...":"Search")}searchBook(){return d(this,null,function*(){if(!this.query)throw new Error("No query entered.");if(!this.isBusy){try{this.setBusy(!0);let e=yield this.serviceProvider.getByQuery(this.query);if(this.setBusy(!1),!(e==null?void 0:e.length)){new oe.Notice(`No results found for "${this.query}"`);return}this.callback(null,e)}catch(e){this.callback(e)}this.close()}})}submitEnterCallback(e){e.key==="Enter"&&this.searchBook()}onOpen(){let{contentEl:e}=this;e.createEl("h2",{text:"Search Book"}),e.createDiv({cls:"book-search-plugin__search-modal--input"},t=>{new oe.TextComponent(t).setValue(this.query).setPlaceholder("Search by keyword or ISBN").onChange(o=>this.query=o).inputEl.addEventListener("keydown",this.submitEnterCallback.bind(this))}),new oe.Setting(e).addButton(t=>this.okBtnRef=t.setButtonText("Search").setCta().onClick(()=>{this.searchBook()}))}onClose(){this.contentEl.empty()}};var Wt=W(require("obsidian")),it=class extends Wt.SuggestModal{constructor(e,t,o){super(e);this.suggestion=t,this.onChoose=o}getSuggestions(e){return this.suggestion.filter(t=>{var i,n,a;let o=e==null?void 0:e.toLowerCase();return((i=t.title)==null?void 0:i.toLowerCase().includes(o))||((n=t.author)==null?void 0:n.toLowerCase().includes(o))||((a=t.publisher)==null?void 0:a.toLowerCase().includes(o))})}renderSuggestion(e,t){let o=e.title,i=e.publisher?`, ${e.publisher}`:"",n=e.publishDate?`(${e.publishDate})`:"",a=e.totalPage?`, p${e.totalPage}`:"",s=`${e.author}${i}${n}${a}`;t.createEl("div",{text:o}),t.createEl("small",{text:s})}onChooseSuggestion(e){this.onChoose(null,e)}};var Xt=W(require("obsidian")),nt=class{constructor(e){this.app=e}jumpToNextCursorLocation(){return d(this,null,function*(){let e=this.app.workspace.getActiveViewOfType(Xt.MarkdownView);if(!e)return;let o=(yield this.app.vault.cachedRead(e.file)).length+1,i=e.editor;i.focus(),i.setCursor(o,0)})}};var U=W(require("obsidian"));var Gt=/^-?[0-9]*$/,st=/{{DATE(\+-?[0-9]+)?}}/,at=/{{DATE:([^}\n\r+]*)(\+-?[0-9]+)?}}/;function Xr(r){return r.replace(/[\\,#%&{}/*<>$":@.]/g,"").replace(/\s+/g," ")}function Ut(r,e){let t;return e?t=Ne(r,We(e)):t=r.author?`${r.title} - ${r.author}`:r.title,Xr(t)+".md"}function Gr(r){return Object.entries(r).reduce((e,[t,o])=>(e[Ur(t)]=o,e),{})}function qt(r,e,t=Q.snakeCase){var n,a;let o=t===Q.camelCase?r:Gr(r),i=typeof e=="string"?qr(e):e;for(let s in i){let l=(a=(n=i[s])==null?void 0:n.toString().trim())!=null?a:"";o[s]&&o[s]!==l?o[s]=`${o[s]}, ${l}`:o[s]=l}return o}function Ne(r,e){return(e==null?void 0:e.trim())?Object.entries(r).reduce((o,[i,n=""])=>o.replace(new RegExp(`{{${i}}}`,"ig"),n),e).replace(/{{.+}}/gi,"").trim():""}function Ur(r){return r.replace(/[A-Z]/g,e=>`_${e==null?void 0:e.toLowerCase()}`)}function qr(r){return r?r.split(` +var Ir=Object.create;var ke=Object.defineProperty;var Lr=Object.getOwnPropertyDescriptor;var Fr=Object.getOwnPropertyNames,Lt=Object.getOwnPropertySymbols,_r=Object.getPrototypeOf,Ft=Object.prototype.hasOwnProperty,Vr=Object.prototype.propertyIsEnumerable;var _t=(r,e,t)=>e in r?ke(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,xe=(r,e)=>{for(var t in e||(e={}))Ft.call(e,t)&&_t(r,t,e[t]);if(Lt)for(var t of Lt(e))Vr.call(e,t)&&_t(r,t,e[t]);return r};var Vt=r=>ke(r,"__esModule",{value:!0});var $r=(r,e)=>{Vt(r);for(var t in e)ke(r,t,{get:e[t],enumerable:!0})},Hr=(r,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Fr(e))!Ft.call(r,o)&&o!=="default"&&ke(r,o,{get:()=>e[o],enumerable:!(t=Lr(e,o))||t.enumerable});return r},U=r=>Hr(Vt(ke(r!=null?Ir(_r(r)):{},"default",r&&r.__esModule&&"default"in r?{get:()=>r.default,enumerable:!0}:{value:r,enumerable:!0})),r);var d=(r,e,t)=>new Promise((o,i)=>{var n=l=>{try{s(t.next(l))}catch(c){i(c)}},a=l=>{try{s(t.throw(l))}catch(c){i(c)}},s=l=>l.done?o(l.value):Promise.resolve(l.value).then(n,a);s((t=t.apply(r,e)).next())});$r(exports,{default:()=>Ot});var Ce=U(require("obsidian"));var oe=U(require("obsidian"));var N;(function(t){t.google="google",t.naver="naver"})(N||(N={}));var $t=U(require("obsidian"));var tt=class{getByQuery(e){return d(this,null,function*(){try{let t={q:e,maxResults:40,printType:"books"},o=window.moment.locale();o&&(t.langRestrict=o);let i=yield He("https://www.googleapis.com/books/v1/volumes",t);return(i==null?void 0:i.totalItems)?i.items.map(({volumeInfo:n})=>this.createBookItem(n)):[]}catch(t){throw console.warn(t),t}})}getISBN(e){return e==null?void 0:e.reduce((t,o)=>(o.type=="ISBN_10"&&(t.isbn10=o.identifier.trim()),o.type=="ISBN_13"&&(t.isbn13=o.identifier.trim()),t),{})}createBookItem(e){var o,i,n,a,s;return xe({title:e.title,author:this.formatList(e.authors),category:this.formatList(e.categories),publisher:e.publisher,totalPage:e.pageCount,coverUrl:(i=(o=e.imageLinks)==null?void 0:o.thumbnail)!=null?i:"",coverSmallUrl:(a=(n=e.imageLinks)==null?void 0:n.smallThumbnail)!=null?a:"",publishDate:((s=e.publishedDate)==null?void 0:s.slice(0,4))||"",description:e.description,link:e.canonicalVolumeLink||e.infoLink,previewLink:e.previewLink},this.getISBN(e.industryIdentifiers))}convertGoogleBookImageURLSize(e,t){return e.replace(/(&zoom)=\d/,`$1=${t}`)}formatList(e){var t,o;return(e==null?void 0:e.length)>1?e.map(i=>`${i.trim()}`).join(", "):(o=(t=e==null?void 0:e[0])==null?void 0:t.replace("N/A",""))!=null?o:""}};var rt=class{constructor(e,t){this.clientId=e;this.clientSecret=t}getByQuery(e){return d(this,null,function*(){try{let t={query:e,display:50,sort:"sim"},o={"X-Naver-Client-Id":this.clientId,"X-Naver-Client-Secret":this.clientSecret},i=yield He("https://openapi.naver.com/v1/search/book.json",t,o);return(i==null?void 0:i.total)?i.items.map(this.createBookItem):[]}catch(t){throw console.warn(t),t}})}createBookItem(e){var t,o;return xe({title:e.title,author:e.author,publisher:e.publisher,coverUrl:e.image,publishDate:((t=e.pubdate)==null?void 0:t.slice(0,4))||"",link:e.link,description:e.description,isbn:e.isbn},((o=e.isbn)==null?void 0:o.length)>=13?{isbn13:e.isbn}:{isbn10:e.isbn})}};function Ht(r){if(r.serviceProvider===N.google)return new tt;if(r.serviceProvider===N.naver){if(!r.naverClientId||!r.naverClientSecret)throw new Error('\uB124\uC774\uBC84 \uAC1C\uBC1C\uC790\uC13C\uD130\uC5D0\uC11C "Client ID"\uC640 "Client Secret"\uB97C \uBC1C\uAE09\uBC1B\uC544 \uC124\uC815\uD574\uC8FC\uC138\uC694.');return new rt(r.naverClientId,r.naverClientSecret)}}function He(o){return d(this,arguments,function*(r,e={},t){let i=new URL(r);return Object.entries(e).forEach(([a,s])=>{i.searchParams.append(a,s==null?void 0:s.toString())}),(yield(0,$t.requestUrl)({url:i.href,method:"GET",headers:xe({Accept:"*/*","Content-Type":"application/json; charset=utf-8"},t)})).json})}var ot=class extends oe.Modal{constructor(e,t,o){super(e.app);this.query=t,this.callback=o,this.serviceProvider=Ht(e.settings)}setBusy(e){this.isBusy=e,this.okBtnRef.setDisabled(e),this.okBtnRef.setButtonText(e?"Requesting...":"Search")}searchBook(){return d(this,null,function*(){if(!this.query)throw new Error("No query entered.");if(!this.isBusy){try{this.setBusy(!0);let e=yield this.serviceProvider.getByQuery(this.query);if(this.setBusy(!1),!(e==null?void 0:e.length)){new oe.Notice(`No results found for "${this.query}"`);return}this.callback(null,e)}catch(e){this.callback(e)}this.close()}})}submitEnterCallback(e){e.key==="Enter"&&this.searchBook()}onOpen(){let{contentEl:e}=this;e.createEl("h2",{text:"Search Book"}),e.createDiv({cls:"book-search-plugin__search-modal--input"},t=>{new oe.TextComponent(t).setValue(this.query).setPlaceholder("Search by keyword or ISBN").onChange(o=>this.query=o).inputEl.addEventListener("keydown",this.submitEnterCallback.bind(this))}),new oe.Setting(e).addButton(t=>this.okBtnRef=t.setButtonText("Search").setCta().onClick(()=>{this.searchBook()}))}onClose(){this.contentEl.empty()}};var Wt=U(require("obsidian")),it=class extends Wt.SuggestModal{constructor(e,t,o){super(e);this.suggestion=t,this.onChoose=o}getSuggestions(e){return this.suggestion.filter(t=>{var i,n,a;let o=e==null?void 0:e.toLowerCase();return((i=t.title)==null?void 0:i.toLowerCase().includes(o))||((n=t.author)==null?void 0:n.toLowerCase().includes(o))||((a=t.publisher)==null?void 0:a.toLowerCase().includes(o))})}renderSuggestion(e,t){let o=e.title,i=e.publisher?`, ${e.publisher}`:"",n=e.publishDate?`(${e.publishDate})`:"",a=e.totalPage?`, p${e.totalPage}`:"",s=`${e.author}${i}${n}${a}`;t.createEl("div",{text:o}),t.createEl("small",{text:s})}onChooseSuggestion(e){this.onChoose(null,e)}};var Xt=U(require("obsidian")),nt=class{constructor(e){this.app=e}jumpToNextCursorLocation(){return d(this,null,function*(){let e=this.app.workspace.getActiveViewOfType(Xt.MarkdownView);if(!e)return;let o=(yield this.app.vault.cachedRead(e.file)).length+1,i=e.editor;i.focus(),i.setCursor(o,0)})}};var G=U(require("obsidian"));var Gt=/^-?[0-9]*$/,st=/{{DATE(\+-?[0-9]+)?}}/,at=/{{DATE:([^}\n\r+]*)(\+-?[0-9]+)?}}/;function Wr(r){return r.replace(/[\\,#%&{}/*<>$":@.]/g,"").replace(/\s+/g," ")}function qt(r,e){let t;return e?t=Ne(r,We(e)):t=r.author?`${r.title} - ${r.author}`:r.title,Wr(t)+".md"}function Xr(r){return Object.entries(r).reduce((e,[t,o])=>(e[Gr(t)]=o,e),{})}function Ut(r,e,t=Q.snakeCase){var n,a;let o=t===Q.camelCase?r:Xr(r),i=typeof e=="string"?qr(e):e;for(let s in i){let l=(a=(n=i[s])==null?void 0:n.toString().trim())!=null?a:"";o[s]&&o[s]!==l?o[s]=`${o[s]}, ${l}`:o[s]=l}return o}function Ne(r,e){return(e==null?void 0:e.trim())?Object.entries(r).reduce((o,[i,n=""])=>o.replace(new RegExp(`{{${i}}}`,"ig"),n),e).replace(/{{.+}}/gi,"").trim():""}function Gr(r){return r.replace(/[A-Z]/g,e=>`_${e==null?void 0:e.toLowerCase()}`)}function qr(r){return r?r.split(` `).map(e=>{var n,a;let t=e.indexOf(":");if(t===-1)return[e.trim(),""];let o=(n=e.slice(0,t))==null?void 0:n.trim(),i=(a=e.slice(t+1))==null?void 0:a.trim();return[o,i]}).reduce((e,[t,o])=>{var i;return t&&(e[t]=(i=o==null?void 0:o.trim())!=null?i:""),e},{}):{}}function Yt(r){return Object.entries(r).map(([e,t])=>{var i;let o=(i=t==null?void 0:t.toString().trim())!=null?i:"";return/\r|\n/.test(o)?"":/:\s/.test(o)?`${e}: "${o.replace(/"/g,""")}" `:`${e}: ${o} -`}).join("").trim()}function zt(r){let e;return r.offset!==null&&r.offset!==void 0&&typeof r.offset=="number"&&(e=window.moment.duration(r.offset,"days")),r.format?window.moment().add(e).format(r.format):window.moment().add(e).format("YYYY-MM-DD")}function We(r){let e=r;for(;st.test(e);){let t=st.exec(e),o;if(t[1]){let i=t[1].replace("+","").trim();Gt.test(i)&&(o=parseInt(i))}e=Kt(e,st,zt({offset:o}))}for(;at.test(e);){let t=at.exec(e),o=t[1],i;if(t[2]){let n=t[2].replace("+","").trim();Gt.test(n)&&(i=parseInt(n))}e=Kt(e,at,zt({format:o,offset:i}))}return e}function Kt(r,e,t){return r.replace(e,function(){return t})}var wr=W(require("obsidian"));var P="top",D="bottom",k="right",T="left",Xe="auto",ie=[P,D,k,T],Z="start",le="end",Qt="clippingParents",Ge="viewport",be="popper",Jt="reference",pt=ie.reduce(function(r,e){return r.concat([e+"-"+Z,e+"-"+le])},[]),Ue=[].concat(ie,[Xe]).reduce(function(r,e){return r.concat([e,e+"-"+Z,e+"-"+le])},[]),Yr="beforeRead",zr="read",Kr="afterRead",Qr="beforeMain",Jr="main",Zr="afterMain",eo="beforeWrite",to="write",ro="afterWrite",Zt=[Yr,zr,Kr,Qr,Jr,Zr,eo,to,ro];function M(r){return r?(r.nodeName||"").toLowerCase():null}function B(r){if(r==null)return window;if(r.toString()!=="[object Window]"){var e=r.ownerDocument;return e&&e.defaultView||window}return r}function J(r){var e=B(r).Element;return r instanceof e||r instanceof Element}function A(r){var e=B(r).HTMLElement;return r instanceof e||r instanceof HTMLElement}function ye(r){if(typeof ShadowRoot=="undefined")return!1;var e=B(r).ShadowRoot;return r instanceof e||r instanceof ShadowRoot}function oo(r){var e=r.state;Object.keys(e.elements).forEach(function(t){var o=e.styles[t]||{},i=e.attributes[t]||{},n=e.elements[t];!A(n)||!M(n)||(Object.assign(n.style,o),Object.keys(i).forEach(function(a){var s=i[a];s===!1?n.removeAttribute(a):n.setAttribute(a,s===!0?"":s)}))})}function io(r){var e=r.state,t={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,t.popper),e.styles=t,e.elements.arrow&&Object.assign(e.elements.arrow.style,t.arrow),function(){Object.keys(e.elements).forEach(function(o){var i=e.elements[o],n=e.attributes[o]||{},a=Object.keys(e.styles.hasOwnProperty(o)?e.styles[o]:t[o]),s=a.reduce(function(l,c){return l[c]="",l},{});!A(i)||!M(i)||(Object.assign(i.style,s),Object.keys(n).forEach(function(l){i.removeAttribute(l)}))})}}var er={name:"applyStyles",enabled:!0,phase:"write",fn:oo,effect:io,requires:["computeStyles"]};function R(r){return r.split("-")[0]}var Y=Math.max,ce=Math.min,ee=Math.round;function X(r,e){e===void 0&&(e=!1);var t=r.getBoundingClientRect(),o=1,i=1;if(A(r)&&e){var n=r.offsetHeight,a=r.offsetWidth;a>0&&(o=ee(t.width)/a||1),n>0&&(i=ee(t.height)/n||1)}return{width:t.width/o,height:t.height/i,top:t.top/i,right:t.right/o,bottom:t.bottom/i,left:t.left/o,x:t.left/o,y:t.top/i}}function me(r){var e=X(r),t=r.offsetWidth,o=r.offsetHeight;return Math.abs(e.width-t)<=1&&(t=e.width),Math.abs(e.height-o)<=1&&(o=e.height),{x:r.offsetLeft,y:r.offsetTop,width:t,height:o}}function De(r,e){var t=e.getRootNode&&e.getRootNode();if(r.contains(e))return!0;if(t&&ye(t)){var o=e;do{if(o&&r.isSameNode(o))return!0;o=o.parentNode||o.host}while(o)}return!1}function _(r){return B(r).getComputedStyle(r)}function lt(r){return["table","td","th"].indexOf(M(r))>=0}function F(r){return((J(r)?r.ownerDocument:r.document)||window.document).documentElement}function te(r){return M(r)==="html"?r:r.assignedSlot||r.parentNode||(ye(r)?r.host:null)||F(r)}function tr(r){return!A(r)||_(r).position==="fixed"?null:r.offsetParent}function no(r){var e=navigator.userAgent.toLowerCase().indexOf("firefox")!==-1,t=navigator.userAgent.indexOf("Trident")!==-1;if(t&&A(r)){var o=_(r);if(o.position==="fixed")return null}var i=te(r);for(ye(i)&&(i=i.host);A(i)&&["html","body"].indexOf(M(i))<0;){var n=_(i);if(n.transform!=="none"||n.perspective!=="none"||n.contain==="paint"||["transform","perspective"].indexOf(n.willChange)!==-1||e&&n.willChange==="filter"||e&&n.filter&&n.filter!=="none")return i;i=i.parentNode}return null}function z(r){for(var e=B(r),t=tr(r);t&<(t)&&_(t).position==="static";)t=tr(t);return t&&(M(t)==="html"||M(t)==="body"&&_(t).position==="static")?e:t||no(r)||e}function ue(r){return["top","bottom"].indexOf(r)>=0?"x":"y"}function fe(r,e,t){return Y(r,ce(e,t))}function rr(r,e,t){var o=fe(r,e,t);return o>t?t:o}function Ae(){return{top:0,right:0,bottom:0,left:0}}function Me(r){return Object.assign({},Ae(),r)}function Re(r,e){return e.reduce(function(t,o){return t[o]=r,t},{})}var so=function(e,t){return e=typeof e=="function"?e(Object.assign({},t.rects,{placement:t.placement})):e,Me(typeof e!="number"?e:Re(e,ie))};function ao(r){var e,t=r.state,o=r.name,i=r.options,n=t.elements.arrow,a=t.modifiersData.popperOffsets,s=R(t.placement),l=ue(s),c=[T,k].indexOf(s)>=0,p=c?"height":"width";if(!(!n||!a)){var m=so(i.padding,t),v=me(n),u=l==="y"?P:T,w=l==="y"?D:k,f=t.rects.reference[p]+t.rects.reference[l]-a[l]-t.rects.popper[p],g=a[l]-t.rects.reference[l],E=z(n),j=E?l==="y"?E.clientHeight||0:E.clientWidth||0:0,C=f/2-g/2,h=m[u],b=j-v[p]-m[w],x=j/2-v[p]/2+C,y=fe(h,x,b),O=l;t.modifiersData[o]=(e={},e[O]=y,e.centerOffset=y-x,e)}}function po(r){var e=r.state,t=r.options,o=t.element,i=o===void 0?"[data-popper-arrow]":o;i!=null&&(typeof i=="string"&&(i=e.elements.popper.querySelector(i),!i)||!De(e.elements.popper,i)||(e.elements.arrow=i))}var or={name:"arrow",enabled:!0,phase:"main",fn:ao,effect:po,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function G(r){return r.split("-")[1]}var lo={top:"auto",right:"auto",bottom:"auto",left:"auto"};function co(r){var e=r.x,t=r.y,o=window,i=o.devicePixelRatio||1;return{x:ee(e*i)/i||0,y:ee(t*i)/i||0}}function ir(r){var e,t=r.popper,o=r.popperRect,i=r.placement,n=r.variation,a=r.offsets,s=r.position,l=r.gpuAcceleration,c=r.adaptive,p=r.roundOffsets,m=r.isFixed,v=a.x,u=v===void 0?0:v,w=a.y,f=w===void 0?0:w,g=typeof p=="function"?p({x:u,y:f}):{x:u,y:f};u=g.x,f=g.y;var E=a.hasOwnProperty("x"),j=a.hasOwnProperty("y"),C=T,h=P,b=window;if(c){var x=z(t),y="clientHeight",O="clientWidth";if(x===B(t)&&(x=F(t),_(x).position!=="static"&&s==="absolute"&&(y="scrollHeight",O="scrollWidth")),x=x,i===P||(i===T||i===k)&&n===le){h=D;var I=m&&x===b&&b.visualViewport?b.visualViewport.height:x[y];f-=I-o.height,f*=l?1:-1}if(i===T||(i===P||i===D)&&n===le){C=k;var L=m&&x===b&&b.visualViewport?b.visualViewport.width:x[O];u-=L-o.width,u*=l?1:-1}}var S=Object.assign({position:s},c&&lo),V=p===!0?co({x:u,y:f}):{x:u,y:f};if(u=V.x,f=V.y,l){var H;return Object.assign({},S,(H={},H[h]=j?"0":"",H[C]=E?"0":"",H.transform=(b.devicePixelRatio||1)<=1?"translate("+u+"px, "+f+"px)":"translate3d("+u+"px, "+f+"px, 0)",H))}return Object.assign({},S,(e={},e[h]=j?f+"px":"",e[C]=E?u+"px":"",e.transform="",e))}function mo(r){var e=r.state,t=r.options,o=t.gpuAcceleration,i=o===void 0?!0:o,n=t.adaptive,a=n===void 0?!0:n,s=t.roundOffsets,l=s===void 0?!0:s;if(!1)var c;var p={placement:R(e.placement),variation:G(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:i,isFixed:e.options.strategy==="fixed"};e.modifiersData.popperOffsets!=null&&(e.styles.popper=Object.assign({},e.styles.popper,ir(Object.assign({},p,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:a,roundOffsets:l})))),e.modifiersData.arrow!=null&&(e.styles.arrow=Object.assign({},e.styles.arrow,ir(Object.assign({},p,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})}var nr={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:mo,data:{}};var qe={passive:!0};function uo(r){var e=r.state,t=r.instance,o=r.options,i=o.scroll,n=i===void 0?!0:i,a=o.resize,s=a===void 0?!0:a,l=B(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return n&&c.forEach(function(p){p.addEventListener("scroll",t.update,qe)}),s&&l.addEventListener("resize",t.update,qe),function(){n&&c.forEach(function(p){p.removeEventListener("scroll",t.update,qe)}),s&&l.removeEventListener("resize",t.update,qe)}}var sr={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:uo,data:{}};var fo={left:"right",right:"left",bottom:"top",top:"bottom"};function Se(r){return r.replace(/left|right|bottom|top/g,function(e){return fo[e]})}var go={start:"end",end:"start"};function Ye(r){return r.replace(/start|end/g,function(e){return go[e]})}function de(r){var e=B(r),t=e.pageXOffset,o=e.pageYOffset;return{scrollLeft:t,scrollTop:o}}function ge(r){return X(F(r)).left+de(r).scrollLeft}function ct(r){var e=B(r),t=F(r),o=e.visualViewport,i=t.clientWidth,n=t.clientHeight,a=0,s=0;return o&&(i=o.width,n=o.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(a=o.offsetLeft,s=o.offsetTop)),{width:i,height:n,x:a+ge(r),y:s}}function mt(r){var e,t=F(r),o=de(r),i=(e=r.ownerDocument)==null?void 0:e.body,n=Y(t.scrollWidth,t.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),a=Y(t.scrollHeight,t.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),s=-o.scrollLeft+ge(r),l=-o.scrollTop;return _(i||t).direction==="rtl"&&(s+=Y(t.clientWidth,i?i.clientWidth:0)-n),{width:n,height:a,x:s,y:l}}function he(r){var e=_(r),t=e.overflow,o=e.overflowX,i=e.overflowY;return/auto|scroll|overlay|hidden/.test(t+i+o)}function ze(r){return["html","body","#document"].indexOf(M(r))>=0?r.ownerDocument.body:A(r)&&he(r)?r:ze(te(r))}function ne(r,e){var t;e===void 0&&(e=[]);var o=ze(r),i=o===((t=r.ownerDocument)==null?void 0:t.body),n=B(o),a=i?[n].concat(n.visualViewport||[],he(o)?o:[]):o,s=e.concat(a);return i?s:s.concat(ne(te(a)))}function Ee(r){return Object.assign({},r,{left:r.x,top:r.y,right:r.x+r.width,bottom:r.y+r.height})}function ho(r){var e=X(r);return e.top=e.top+r.clientTop,e.left=e.left+r.clientLeft,e.bottom=e.top+r.clientHeight,e.right=e.left+r.clientWidth,e.width=r.clientWidth,e.height=r.clientHeight,e.x=e.left,e.y=e.top,e}function ar(r,e){return e===Ge?Ee(ct(r)):J(e)?ho(e):Ee(mt(F(r)))}function vo(r){var e=ne(te(r)),t=["absolute","fixed"].indexOf(_(r).position)>=0,o=t&&A(r)?z(r):r;return J(o)?e.filter(function(i){return J(i)&&De(i,o)&&M(i)!=="body"}):[]}function ut(r,e,t){var o=e==="clippingParents"?vo(r):[].concat(e),i=[].concat(o,[t]),n=i[0],a=i.reduce(function(s,l){var c=ar(r,l);return s.top=Y(c.top,s.top),s.right=ce(c.right,s.right),s.bottom=ce(c.bottom,s.bottom),s.left=Y(c.left,s.left),s},ar(r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function Ie(r){var e=r.reference,t=r.element,o=r.placement,i=o?R(o):null,n=o?G(o):null,a=e.x+e.width/2-t.width/2,s=e.y+e.height/2-t.height/2,l;switch(i){case P:l={x:a,y:e.y-t.height};break;case D:l={x:a,y:e.y+e.height};break;case k:l={x:e.x+e.width,y:s};break;case T:l={x:e.x-t.width,y:s};break;default:l={x:e.x,y:e.y}}var c=i?ue(i):null;if(c!=null){var p=c==="y"?"height":"width";switch(n){case Z:l[c]=l[c]-(e[p]/2-t[p]/2);break;case le:l[c]=l[c]+(e[p]/2-t[p]/2);break;default:}}return l}function K(r,e){e===void 0&&(e={});var t=e,o=t.placement,i=o===void 0?r.placement:o,n=t.boundary,a=n===void 0?Qt:n,s=t.rootBoundary,l=s===void 0?Ge:s,c=t.elementContext,p=c===void 0?be:c,m=t.altBoundary,v=m===void 0?!1:m,u=t.padding,w=u===void 0?0:u,f=Me(typeof w!="number"?w:Re(w,ie)),g=p===be?Jt:be,E=r.rects.popper,j=r.elements[v?g:p],C=ut(J(j)?j:j.contextElement||F(r.elements.popper),a,l),h=X(r.elements.reference),b=Ie({reference:h,element:E,strategy:"absolute",placement:i}),x=Ee(Object.assign({},E,b)),y=p===be?x:h,O={top:C.top-y.top+f.top,bottom:y.bottom-C.bottom+f.bottom,left:C.left-y.left+f.left,right:y.right-C.right+f.right},I=r.modifiersData.offset;if(p===be&&I){var L=I[i];Object.keys(O).forEach(function(S){var V=[k,D].indexOf(S)>=0?1:-1,H=[P,D].indexOf(S)>=0?"y":"x";O[S]+=L[H]*V})}return O}function ft(r,e){e===void 0&&(e={});var t=e,o=t.placement,i=t.boundary,n=t.rootBoundary,a=t.padding,s=t.flipVariations,l=t.allowedAutoPlacements,c=l===void 0?Ue:l,p=G(o),m=p?s?pt:pt.filter(function(w){return G(w)===p}):ie,v=m.filter(function(w){return c.indexOf(w)>=0});v.length===0&&(v=m);var u=v.reduce(function(w,f){return w[f]=K(r,{placement:f,boundary:i,rootBoundary:n,padding:a})[R(f)],w},{});return Object.keys(u).sort(function(w,f){return u[w]-u[f]})}function wo(r){if(R(r)===Xe)return[];var e=Se(r);return[Ye(r),e,Ye(e)]}function xo(r){var e=r.state,t=r.options,o=r.name;if(!e.modifiersData[o]._skip){for(var i=t.mainAxis,n=i===void 0?!0:i,a=t.altAxis,s=a===void 0?!0:a,l=t.fallbackPlacements,c=t.padding,p=t.boundary,m=t.rootBoundary,v=t.altBoundary,u=t.flipVariations,w=u===void 0?!0:u,f=t.allowedAutoPlacements,g=e.options.placement,E=R(g),j=E===g,C=l||(j||!w?[Se(g)]:wo(g)),h=[g].concat(C).reduce(function(we,re){return we.concat(R(re)===Xe?ft(e,{placement:re,boundary:p,rootBoundary:m,padding:c,flipVariations:w,allowedAutoPlacements:f}):re)},[]),b=e.rects.reference,x=e.rects.popper,y=new Map,O=!0,I=h[0],L=0;L=0,Oe=Pe?"width":"height",$=K(e,{placement:S,boundary:p,rootBoundary:m,altBoundary:v,padding:c}),q=Pe?H?k:T:H?D:P;b[Oe]>x[Oe]&&(q=Se(q));var Le=Se(q),se=[];if(n&&se.push($[V]<=0),s&&se.push($[q]<=0,$[Le]<=0),se.every(function(we){return we})){I=S,O=!1;break}y.set(S,se)}if(O)for(var Fe=w?3:1,Qe=function(re){var Be=h.find(function(Ve){var ae=y.get(Ve);if(ae)return ae.slice(0,re).every(function(Je){return Je})});if(Be)return I=Be,"break"},Te=Fe;Te>0;Te--){var _e=Qe(Te);if(_e==="break")break}e.placement!==I&&(e.modifiersData[o]._skip=!0,e.placement=I,e.reset=!0)}}var pr={name:"flip",enabled:!0,phase:"main",fn:xo,requiresIfExists:["offset"],data:{_skip:!1}};function lr(r,e,t){return t===void 0&&(t={x:0,y:0}),{top:r.top-e.height-t.y,right:r.right-e.width+t.x,bottom:r.bottom-e.height+t.y,left:r.left-e.width-t.x}}function cr(r){return[P,k,D,T].some(function(e){return r[e]>=0})}function bo(r){var e=r.state,t=r.name,o=e.rects.reference,i=e.rects.popper,n=e.modifiersData.preventOverflow,a=K(e,{elementContext:"reference"}),s=K(e,{altBoundary:!0}),l=lr(a,o),c=lr(s,i,n),p=cr(l),m=cr(c);e.modifiersData[t]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:m},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":m})}var mr={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:bo};function yo(r,e,t){var o=R(r),i=[T,P].indexOf(o)>=0?-1:1,n=typeof t=="function"?t(Object.assign({},e,{placement:r})):t,a=n[0],s=n[1];return a=a||0,s=(s||0)*i,[T,k].indexOf(o)>=0?{x:s,y:a}:{x:a,y:s}}function So(r){var e=r.state,t=r.options,o=r.name,i=t.offset,n=i===void 0?[0,0]:i,a=Ue.reduce(function(p,m){return p[m]=yo(m,e.rects,n),p},{}),s=a[e.placement],l=s.x,c=s.y;e.modifiersData.popperOffsets!=null&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[o]=a}var ur={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:So};function Eo(r){var e=r.state,t=r.name;e.modifiersData[t]=Ie({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})}var fr={name:"popperOffsets",enabled:!0,phase:"read",fn:Eo,data:{}};function dt(r){return r==="x"?"y":"x"}function jo(r){var e=r.state,t=r.options,o=r.name,i=t.mainAxis,n=i===void 0?!0:i,a=t.altAxis,s=a===void 0?!1:a,l=t.boundary,c=t.rootBoundary,p=t.altBoundary,m=t.padding,v=t.tether,u=v===void 0?!0:v,w=t.tetherOffset,f=w===void 0?0:w,g=K(e,{boundary:l,rootBoundary:c,padding:m,altBoundary:p}),E=R(e.placement),j=G(e.placement),C=!j,h=ue(E),b=dt(h),x=e.modifiersData.popperOffsets,y=e.rects.reference,O=e.rects.popper,I=typeof f=="function"?f(Object.assign({},e.rects,{placement:e.placement})):f,L=typeof I=="number"?{mainAxis:I,altAxis:I}:Object.assign({mainAxis:0,altAxis:0},I),S=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,V={x:0,y:0};if(!!x){if(n){var H,Pe=h==="y"?P:T,Oe=h==="y"?D:k,$=h==="y"?"height":"width",q=x[h],Le=q+g[Pe],se=q-g[Oe],Fe=u?-O[$]/2:0,Qe=j===Z?y[$]:O[$],Te=j===Z?-O[$]:-y[$],_e=e.elements.arrow,we=u&&_e?me(_e):{width:0,height:0},re=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:Ae(),Be=re[Pe],Ve=re[Oe],ae=fe(0,y[$],we[$]),Je=C?y[$]/2-Fe-ae-Be-L.mainAxis:Qe-ae-Be-L.mainAxis,Nr=C?-y[$]/2+Fe+ae+Ve+L.mainAxis:Te+ae+Ve+L.mainAxis,Ze=e.elements.arrow&&z(e.elements.arrow),Dr=Ze?h==="y"?Ze.clientTop||0:Ze.clientLeft||0:0,Tt=(H=S==null?void 0:S[h])!=null?H:0,Ar=q+Je-Tt-Dr,Mr=q+Nr-Tt,Bt=fe(u?ce(Le,Ar):Le,q,u?Y(se,Mr):se);x[h]=Bt,V[h]=Bt-q}if(s){var kt,Rr=h==="x"?P:T,Ir=h==="x"?D:k,pe=x[b],He=b==="y"?"height":"width",Nt=pe+g[Rr],Dt=pe-g[Ir],et=[P,T].indexOf(E)!==-1,At=(kt=S==null?void 0:S[b])!=null?kt:0,Mt=et?Nt:pe-y[He]-O[He]-At+L.altAxis,Rt=et?pe+y[He]+O[He]-At-L.altAxis:Dt,It=u&&et?rr(Mt,pe,Rt):fe(u?Mt:Nt,pe,u?Rt:Dt);x[b]=It,V[b]=It-pe}e.modifiersData[o]=V}}var dr={name:"preventOverflow",enabled:!0,phase:"main",fn:jo,requiresIfExists:["offset"]};function gt(r){return{scrollLeft:r.scrollLeft,scrollTop:r.scrollTop}}function ht(r){return r===B(r)||!A(r)?de(r):gt(r)}function Co(r){var e=r.getBoundingClientRect(),t=ee(e.width)/r.offsetWidth||1,o=ee(e.height)/r.offsetHeight||1;return t!==1||o!==1}function vt(r,e,t){t===void 0&&(t=!1);var o=A(e),i=A(e)&&Co(e),n=F(e),a=X(r,i),s={scrollLeft:0,scrollTop:0},l={x:0,y:0};return(o||!o&&!t)&&((M(e)!=="body"||he(n))&&(s=ht(e)),A(e)?(l=X(e,!0),l.x+=e.clientLeft,l.y+=e.clientTop):n&&(l.x=ge(n))),{x:a.left+s.scrollLeft-l.x,y:a.top+s.scrollTop-l.y,width:a.width,height:a.height}}function Po(r){var e=new Map,t=new Set,o=[];r.forEach(function(n){e.set(n.name,n)});function i(n){t.add(n.name);var a=[].concat(n.requires||[],n.requiresIfExists||[]);a.forEach(function(s){if(!t.has(s)){var l=e.get(s);l&&i(l)}}),o.push(n)}return r.forEach(function(n){t.has(n.name)||i(n)}),o}function wt(r){var e=Po(r);return Zt.reduce(function(t,o){return t.concat(e.filter(function(i){return i.phase===o}))},[])}function xt(r){var e;return function(){return e||(e=new Promise(function(t){Promise.resolve().then(function(){e=void 0,t(r())})})),e}}function bt(r){var e=r.reduce(function(t,o){var i=t[o.name];return t[o.name]=i?Object.assign({},i,o,{options:Object.assign({},i.options,o.options),data:Object.assign({},i.data,o.data)}):o,t},{});return Object.keys(e).map(function(t){return e[t]})}var gr={placement:"bottom",modifiers:[],strategy:"absolute"};function hr(){for(var r=arguments.length,e=new Array(r),t=0;t(r%e+e)%e,xr=class{constructor(e,t,o){this.owner=e,this.containerEl=t,t.on("click",".suggestion-item",this.onSuggestionClick.bind(this)),t.on("mousemove",".suggestion-item",this.onSuggestionMouseover.bind(this)),o.register([],"ArrowUp",i=>{if(!i.isComposing)return this.setSelectedItem(this.selectedItem-1,!0),!1}),o.register([],"ArrowDown",i=>{if(!i.isComposing)return this.setSelectedItem(this.selectedItem+1,!0),!1}),o.register([],"Enter",i=>{if(!i.isComposing)return this.useSelectedItem(i),!1})}onSuggestionClick(e,t){e.preventDefault();let o=this.suggestions.indexOf(t);this.setSelectedItem(o,!1),this.useSelectedItem(e)}onSuggestionMouseover(e,t){let o=this.suggestions.indexOf(t);this.setSelectedItem(o,!1)}setSuggestions(e){this.containerEl.empty();let t=[];e.forEach(o=>{let i=this.containerEl.createDiv("suggestion-item");this.owner.renderSuggestion(o,i),t.push(i)}),this.values=e,this.suggestions=t,this.setSelectedItem(0,!1)}useSelectedItem(e){let t=this.values[this.selectedItem];t&&this.owner.selectSuggestion(t,e)}setSelectedItem(e,t){let o=To(e,this.suggestions.length),i=this.suggestions[this.selectedItem],n=this.suggestions[o];i==null||i.removeClass("is-selected"),n==null||n.addClass("is-selected"),this.selectedItem=o,t&&n.scrollIntoView(!1)}},ve=class{constructor(e,t){this.app=e,this.inputEl=t,this.scope=new wr.Scope,this.suggestEl=createDiv("suggestion-container");let o=this.suggestEl.createDiv("suggestion");this.suggest=new xr(this,o,this.scope),this.scope.register([],"Escape",this.close.bind(this)),this.inputEl.addEventListener("input",this.onInputChanged.bind(this)),this.inputEl.addEventListener("focus",this.onInputChanged.bind(this)),this.inputEl.addEventListener("blur",this.close.bind(this)),this.suggestEl.on("mousedown",".suggestion-container",i=>{i.preventDefault()})}onInputChanged(){let e=this.inputEl.value,t=this.getSuggestions(e);if(!t){this.close();return}t.length>0?(this.suggest.setSuggestions(t),this.open(this.app.dom.appContainerEl,this.inputEl)):this.close()}open(e,t){this.app.keymap.pushScope(this.scope),e.appendChild(this.suggestEl),this.popper=yt(t,this.suggestEl,{placement:"bottom-start",modifiers:[{name:"sameWidth",enabled:!0,fn:({state:o,instance:i})=>{let n=`${o.rects.reference.width}px`;o.styles.popper.width!==n&&(o.styles.popper.width=n,i.update())},phase:"beforeWrite",requires:["computeStyles"]}]})}close(){this.app.keymap.popScope(this.scope),this.suggest.setSuggestions([]),this.popper&&this.popper.destroy(),this.suggestEl.detach()}};var Bo="{{DATE}}",br="{{DATE:}}",ko=/{{D?A?T?E?}?}?$/i,No=/{{D?A?T?E?:?$|{{DATE:[^\n\r}]*}}$/i,Do="{{author}}",Ao=/{{a?u?t?h?o?r?}?}?$/i,Mo="{{title}}",Ro=/{{t?i?t?l?e?}?}?$/i,St=class extends ve{constructor(e,t){super(e,t);this.app=e;this.inputEl=t;this.lastInput=""}getSuggestions(e){let t=this.inputEl.selectionStart,o=15,i=e.substr(t-o,o),n=[];return this.processToken(i,(a,s)=>{this.lastInput=a[0],n.push(s)}),n}selectSuggestion(e){let t=this.inputEl.selectionStart,o=this.lastInput.length,i=this.inputEl.value,n=0,a=(s,l=0)=>`${i.substr(0,t-o+l)}${s}${i.substr(t)}`;this.processToken(e,(s,l)=>{e.contains(l)&&(this.inputEl.value=a(e),n=t-o+e.length,e===br&&(n-=2))}),this.inputEl.trigger("input"),this.close(),this.inputEl.setSelectionRange(n,n)}renderSuggestion(e,t){e&&t.setText(e)}processToken(e,t){let o=No.exec(e);o&&t(o,br);let i=ko.exec(e);i&&t(i,Bo);let n=Ao.exec(e);n&&t(n,Do);let a=Ro.exec(e);a&&t(a,Mo)}};var yr=W(require("obsidian"));var Et=class extends ve{getSuggestions(e){let t=this.app.vault.getAllLoadedFiles(),o=[],i=e.toLowerCase();return t.forEach(n=>{n instanceof yr.TFolder&&n.path.toLowerCase().contains(i)&&o.push(n)}),o}renderSuggestion(e,t){t.setText(e.path)}selectSuggestion(e){this.inputEl.value=e.path,this.inputEl.trigger("input"),this.close()}};var Sr=W(require("obsidian"));var jt=class extends ve{getSuggestions(e){let t=this.app.vault.getAllLoadedFiles(),o=[],i=e.toLowerCase();return t.forEach(n=>{n instanceof Sr.TFile&&n.extension==="md"&&n.path.toLowerCase().contains(i)&&o.push(n)}),o}renderSuggestion(e,t){t.setText(e.path)}selectSuggestion(e){this.inputEl.value=e.path,this.inputEl.trigger("input"),this.close()}};var je=W(require("obsidian")),Ct=class extends je.Modal{constructor(e,t){super(e.app);this.callback=t;var o,i;this.plugin=e,this.currentServiceProvider=(i=(o=e.settings)==null?void 0:o.serviceProvider)!=null?i:N.google}get settings(){return this.plugin.settings}saveSetting(){return d(this,null,function*(){return this.plugin.saveSettings()})}saveClientId(e){this.currentServiceProvider===N.naver&&(this.plugin.settings.naverClientId=e)}saveClientSecret(e){this.currentServiceProvider===N.naver&&(this.settings.naverClientSecret=e)}get currentClientId(){if(this.currentServiceProvider===N.naver)return this.settings.naverClientId}get currentClientSecret(){if(this.currentServiceProvider===N.naver)return this.settings.naverClientSecret}onOpen(){let{contentEl:e}=this;e.createEl("h2",{text:"Service Provider Setting"}),new je.Setting(e).setName("Client ID").addText(t=>{t.setValue(this.currentClientId).onChange(o=>this.saveClientId(o))}),new je.Setting(e).setName("Client Secret").addText(t=>{t.setValue(this.currentClientSecret).onChange(o=>this.saveClientSecret(o))}),new je.Setting(e).addButton(t=>t.setButtonText("Save").setCta().onClick(()=>d(this,null,function*(){var o;yield this.plugin.saveSettings(),this.close(),(o=this.callback)==null||o.call(this)})))}onClose(){this.contentEl.empty()}};var Er="https://github.com/anpigon/obsidian-book-search-plugin",Q;(function(t){t.snakeCase="Snake Case",t.camelCase="Camel Case"})(Q||(Q={}));var jr={folder:"",fileNameFormat:"",frontmatter:"",content:"",useDefaultFrontmatter:!0,defaultFrontmatterKeyType:Q.camelCase,templateFile:"",serviceProvider:N.google,naverClientId:"",naverClientSecret:""},Pt=class extends U.PluginSettingTab{constructor(e,t){super(e,t);this.plugin=t}get settings(){return this.plugin.settings}display(){let{containerEl:e}=this;e.empty(),e.classList.add("book-search-plugin__settings"),Cr(e,"General Settings"),new U.Setting(e).setName("New file location").setDesc("New book notes will be placed here.").addSearch(p=>{try{new Et(this.app,p.inputEl)}catch(m){}p.setPlaceholder("Example: folder1/folder2").setValue(this.plugin.settings.folder).onChange(m=>{this.plugin.settings.folder=m,this.plugin.saveSettings()})});let t=document.createDocumentFragment().createEl("code",{text:We(this.plugin.settings.fileNameFormat)||"{{title}} - {{author}}"});new U.Setting(e).setClass("book-search-plugin__settings--new_file_name").setName("New file name").setDesc("Enter the file name format.").addSearch(p=>{try{new St(this.app,p.inputEl)}catch(m){}p.setPlaceholder("Example: {{title}} - {{author}}").setValue(this.plugin.settings.fileNameFormat).onChange(m=>{this.plugin.settings.fileNameFormat=m==null?void 0:m.trim(),this.plugin.saveSettings(),t.innerHTML=We(m)||"{{title}} - {{author}}"})}),e.createEl("div",{cls:["setting-item-description","book-search-plugin__settings--new_file_name_hint"]}).append(t);let o=document.createDocumentFragment();o.createDiv({text:"Files will be available as templates."}),o.createEl("a",{text:"Example Template",href:`${Er}#example-template`}),new U.Setting(e).setName("Template file").setDesc(o).addSearch(p=>{try{new jt(this.app,p.inputEl)}catch(m){}p.setPlaceholder("Example: templates/template-file").setValue(this.plugin.settings.templateFile).onChange(m=>{this.plugin.settings.templateFile=m,this.plugin.saveSettings()})});let i,n=()=>{i.addClass("book-search-plugin__hide")},a=()=>{i.removeClass("book-search-plugin__hide")},s=(p=(m=>(m=this.settings)==null?void 0:m.serviceProvider)())=>{p===N.naver?a():n()};new U.Setting(e).setName("Service Provider").setDesc("Choose the service provider you want to use to search your books.").setClass("book-search-plugin__settings--service_provider").addDropdown(p=>{var m,v;p.addOption(N.google,`${N.google} (Global)`),p.addOption(N.naver,`${N.naver} (Korean)`),p.setValue((v=(m=this.plugin.settings)==null?void 0:m.serviceProvider)!=null?v:N.google),p.onChange(u=>d(this,null,function*(){let w=u;s(w),this.settings.serviceProvider=w,yield this.plugin.saveSettings()}))}).addExtraButton(p=>{i=p.extraSettingsEl,s(),p.onClick(()=>{new Ct(this.plugin).open()})});let l=[];Pr(e,"Frontmatter Settings",l),l.push(new U.Setting(e).setClass("book-search-plugin__hide").setName("Use the default frontmatter").setDesc("If you don't want the default frontmatter to be inserted, disable it.").addToggle(p=>{p.setValue(this.plugin.settings.useDefaultFrontmatter).onChange(m=>d(this,null,function*(){let v=m;this.plugin.settings.useDefaultFrontmatter=v,yield this.plugin.saveSettings()}))}),new U.Setting(e).setClass("book-search-plugin__hide").setName("Default frontmatter key type").setDesc(Io()).addDropdown(p=>{p.addOption(Q.snakeCase,Q.snakeCase.toString()),p.addOption(Q.camelCase,Q.camelCase.toString()),p.setValue(this.plugin.settings.defaultFrontmatterKeyType),p.onChange(m=>d(this,null,function*(){this.plugin.settings.defaultFrontmatterKeyType=m,yield this.plugin.saveSettings()}))}),new U.Setting(e).setClass("book-search-plugin__hide").setName("(Deprecated) Text to insert into frontmatter").setDesc(Or("#text-to-insert-into-frontmatter")).addTextArea(p=>{let m=this.plugin.settings.frontmatter;p.setValue(m).onChange(v=>d(this,null,function*(){let u=v;this.plugin.settings.frontmatter=u,yield this.plugin.saveSettings()}))}));let c=[];Pr(e,"Content Settings",c),c.push(new U.Setting(e).setClass("book-search-plugin__hide").setName("(Deprecated) Text to insert into content").setDesc(Or("#text-to-insert-into-content")).addTextArea(p=>{let m=this.plugin.settings.content;p.setValue(m).onChange(v=>d(this,null,function*(){let u=v;this.plugin.settings.content=u,yield this.plugin.saveSettings()}))}))}};function Io(){let r=document.createDocumentFragment();return r.append("- Snake Case: ",r.createEl("code",{text:"total_page"}),r.createEl("br"),"- Camel Case: ",r.createEl("code",{text:"totalPage"})),r}function Cr(r,e){let t=document.createDocumentFragment();return t.createEl("h2",{text:e}),new U.Setting(r).setHeading().setName(t)}function Pr(r,e,t){return Cr(r,e).addToggle(o=>{o.onChange(i=>{t.forEach(({settingEl:n})=>{n.toggleClass("book-search-plugin__show",i)})})})}function Or(r){let e=document.createDocumentFragment();return e.append("Please use the template file.",e.createEl("br"),"The following syntaxes are available: ",e.createEl("br"),e.createEl("code",{text:"{{title}}"}),", ",e.createEl("code",{text:"{{author}}"}),", ",e.createEl("code",{text:"{{category}}"}),", ",e.createEl("code",{text:"{{publisher}}"}),", ",e.createEl("code",{text:"{{publishDate}}"}),", ",e.createEl("code",{text:"{{totalPage}}"}),", ",e.createEl("code",{text:"{{coverUrl}}"}),", ",e.createEl("code",{text:"{{isbn10}}"}),", ",e.createEl("code",{text:"{{isbn13}}"}),e.createEl("br"),"Check the ",e.createEl("a",{href:`${Er}${r}`,text:"documentation"})," for more information."),e}var Ke=W(require("obsidian"));function Tr(r,e){return d(this,null,function*(){let{metadataCache:t,vault:o}=r,i=(0,Ke.normalizePath)(e!=null?e:"");if(e==="/")return Promise.resolve("");try{let n=t.getFirstLinkpathDest(i,"");return n?o.cachedRead(n):""}catch(n){return console.error(`Failed to read the daily note template '${i}'`,n),new Ke.Notice("Failed to read the daily note template"),""}})}function Br(r){return r.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(e,t,o,i,n,a)=>{let s=window.moment(),l=window.moment().clone().set({hour:s.get("hour"),minute:s.get("minute"),second:s.get("second")});return o&&l.add(parseInt(i,10),n),a?l.format(a.substring(1).trim()):l.format("YYYY-MM-DD")})}var Ot=class extends Ce.Plugin{onload(){return d(this,null,function*(){yield this.loadSettings(),this.addRibbonIcon("book","Create new book note",()=>this.createNewBookNote()).addClass("obsidian-book-search-plugin-ribbon-class"),this.addCommand({id:"open-book-search-modal",name:"Create new book note",callback:()=>this.createNewBookNote()}),this.addCommand({id:"open-book-search-modal-to-insert",name:"Insert the metadata",callback:()=>this.insertMetadata()}),this.addSettingTab(new Pt(this.app,this))})}showNotice(e){try{new Ce.Notice(e==null?void 0:e.toString())}catch(t){}}searchBookMetadata(e){return d(this,null,function*(){let t=yield this.openBookSearchModal(e);return yield this.openBookSuggestModal(t)})}getRenderedContents(e){return d(this,null,function*(){let{templateFile:t,useDefaultFrontmatter:o,defaultFrontmatterKeyType:i,frontmatter:n,content:a}=this.settings;if(t){let c=yield Tr(this.app,t);return Ne(e,Br(c))}let s=Ne(e,n);o&&(s=Yt(qt(e,s,i)));let l=Ne(e,a);return s?`--- +`}).join("").trim()}function zt(r){let e;return r.offset!==null&&r.offset!==void 0&&typeof r.offset=="number"&&(e=window.moment.duration(r.offset,"days")),r.format?window.moment().add(e).format(r.format):window.moment().add(e).format("YYYY-MM-DD")}function We(r){let e=r;for(;st.test(e);){let t=st.exec(e),o;if(t[1]){let i=t[1].replace("+","").trim();Gt.test(i)&&(o=parseInt(i))}e=Kt(e,st,zt({offset:o}))}for(;at.test(e);){let t=at.exec(e),o=t[1],i;if(t[2]){let n=t[2].replace("+","").trim();Gt.test(n)&&(i=parseInt(n))}e=Kt(e,at,zt({format:o,offset:i}))}return e}function Kt(r,e,t){return r.replace(e,function(){return t})}var wr=U(require("obsidian"));var P="top",A="bottom",k="right",T="left",Xe="auto",ie=[P,A,k,T],Z="start",le="end",Qt="clippingParents",Ge="viewport",be="popper",Jt="reference",pt=ie.reduce(function(r,e){return r.concat([e+"-"+Z,e+"-"+le])},[]),qe=[].concat(ie,[Xe]).reduce(function(r,e){return r.concat([e,e+"-"+Z,e+"-"+le])},[]),Ur="beforeRead",Yr="read",zr="afterRead",Kr="beforeMain",Qr="main",Jr="afterMain",Zr="beforeWrite",eo="write",to="afterWrite",Zt=[Ur,Yr,zr,Kr,Qr,Jr,Zr,eo,to];function M(r){return r?(r.nodeName||"").toLowerCase():null}function B(r){if(r==null)return window;if(r.toString()!=="[object Window]"){var e=r.ownerDocument;return e&&e.defaultView||window}return r}function J(r){var e=B(r).Element;return r instanceof e||r instanceof Element}function D(r){var e=B(r).HTMLElement;return r instanceof e||r instanceof HTMLElement}function ye(r){if(typeof ShadowRoot=="undefined")return!1;var e=B(r).ShadowRoot;return r instanceof e||r instanceof ShadowRoot}function ro(r){var e=r.state;Object.keys(e.elements).forEach(function(t){var o=e.styles[t]||{},i=e.attributes[t]||{},n=e.elements[t];!D(n)||!M(n)||(Object.assign(n.style,o),Object.keys(i).forEach(function(a){var s=i[a];s===!1?n.removeAttribute(a):n.setAttribute(a,s===!0?"":s)}))})}function oo(r){var e=r.state,t={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,t.popper),e.styles=t,e.elements.arrow&&Object.assign(e.elements.arrow.style,t.arrow),function(){Object.keys(e.elements).forEach(function(o){var i=e.elements[o],n=e.attributes[o]||{},a=Object.keys(e.styles.hasOwnProperty(o)?e.styles[o]:t[o]),s=a.reduce(function(l,c){return l[c]="",l},{});!D(i)||!M(i)||(Object.assign(i.style,s),Object.keys(n).forEach(function(l){i.removeAttribute(l)}))})}}var er={name:"applyStyles",enabled:!0,phase:"write",fn:ro,effect:oo,requires:["computeStyles"]};function R(r){return r.split("-")[0]}var Y=Math.max,ce=Math.min,ee=Math.round;function W(r,e){e===void 0&&(e=!1);var t=r.getBoundingClientRect(),o=1,i=1;if(D(r)&&e){var n=r.offsetHeight,a=r.offsetWidth;a>0&&(o=ee(t.width)/a||1),n>0&&(i=ee(t.height)/n||1)}return{width:t.width/o,height:t.height/i,top:t.top/i,right:t.right/o,bottom:t.bottom/i,left:t.left/o,x:t.left/o,y:t.top/i}}function me(r){var e=W(r),t=r.offsetWidth,o=r.offsetHeight;return Math.abs(e.width-t)<=1&&(t=e.width),Math.abs(e.height-o)<=1&&(o=e.height),{x:r.offsetLeft,y:r.offsetTop,width:t,height:o}}function Ae(r,e){var t=e.getRootNode&&e.getRootNode();if(r.contains(e))return!0;if(t&&ye(t)){var o=e;do{if(o&&r.isSameNode(o))return!0;o=o.parentNode||o.host}while(o)}return!1}function _(r){return B(r).getComputedStyle(r)}function lt(r){return["table","td","th"].indexOf(M(r))>=0}function F(r){return((J(r)?r.ownerDocument:r.document)||window.document).documentElement}function te(r){return M(r)==="html"?r:r.assignedSlot||r.parentNode||(ye(r)?r.host:null)||F(r)}function tr(r){return!D(r)||_(r).position==="fixed"?null:r.offsetParent}function io(r){var e=navigator.userAgent.toLowerCase().indexOf("firefox")!==-1,t=navigator.userAgent.indexOf("Trident")!==-1;if(t&&D(r)){var o=_(r);if(o.position==="fixed")return null}var i=te(r);for(ye(i)&&(i=i.host);D(i)&&["html","body"].indexOf(M(i))<0;){var n=_(i);if(n.transform!=="none"||n.perspective!=="none"||n.contain==="paint"||["transform","perspective"].indexOf(n.willChange)!==-1||e&&n.willChange==="filter"||e&&n.filter&&n.filter!=="none")return i;i=i.parentNode}return null}function z(r){for(var e=B(r),t=tr(r);t&<(t)&&_(t).position==="static";)t=tr(t);return t&&(M(t)==="html"||M(t)==="body"&&_(t).position==="static")?e:t||io(r)||e}function ue(r){return["top","bottom"].indexOf(r)>=0?"x":"y"}function fe(r,e,t){return Y(r,ce(e,t))}function rr(r,e,t){var o=fe(r,e,t);return o>t?t:o}function De(){return{top:0,right:0,bottom:0,left:0}}function Me(r){return Object.assign({},De(),r)}function Re(r,e){return e.reduce(function(t,o){return t[o]=r,t},{})}var no=function(e,t){return e=typeof e=="function"?e(Object.assign({},t.rects,{placement:t.placement})):e,Me(typeof e!="number"?e:Re(e,ie))};function so(r){var e,t=r.state,o=r.name,i=r.options,n=t.elements.arrow,a=t.modifiersData.popperOffsets,s=R(t.placement),l=ue(s),c=[T,k].indexOf(s)>=0,p=c?"height":"width";if(!(!n||!a)){var m=no(i.padding,t),v=me(n),u=l==="y"?P:T,w=l==="y"?A:k,f=t.rects.reference[p]+t.rects.reference[l]-a[l]-t.rects.popper[p],g=a[l]-t.rects.reference[l],E=z(n),j=E?l==="y"?E.clientHeight||0:E.clientWidth||0:0,C=f/2-g/2,h=m[u],b=j-v[p]-m[w],x=j/2-v[p]/2+C,y=fe(h,x,b),O=l;t.modifiersData[o]=(e={},e[O]=y,e.centerOffset=y-x,e)}}function ao(r){var e=r.state,t=r.options,o=t.element,i=o===void 0?"[data-popper-arrow]":o;i!=null&&(typeof i=="string"&&(i=e.elements.popper.querySelector(i),!i)||!Ae(e.elements.popper,i)||(e.elements.arrow=i))}var or={name:"arrow",enabled:!0,phase:"main",fn:so,effect:ao,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function X(r){return r.split("-")[1]}var po={top:"auto",right:"auto",bottom:"auto",left:"auto"};function lo(r){var e=r.x,t=r.y,o=window,i=o.devicePixelRatio||1;return{x:ee(e*i)/i||0,y:ee(t*i)/i||0}}function ir(r){var e,t=r.popper,o=r.popperRect,i=r.placement,n=r.variation,a=r.offsets,s=r.position,l=r.gpuAcceleration,c=r.adaptive,p=r.roundOffsets,m=r.isFixed,v=a.x,u=v===void 0?0:v,w=a.y,f=w===void 0?0:w,g=typeof p=="function"?p({x:u,y:f}):{x:u,y:f};u=g.x,f=g.y;var E=a.hasOwnProperty("x"),j=a.hasOwnProperty("y"),C=T,h=P,b=window;if(c){var x=z(t),y="clientHeight",O="clientWidth";if(x===B(t)&&(x=F(t),_(x).position!=="static"&&s==="absolute"&&(y="scrollHeight",O="scrollWidth")),x=x,i===P||(i===T||i===k)&&n===le){h=A;var I=m&&x===b&&b.visualViewport?b.visualViewport.height:x[y];f-=I-o.height,f*=l?1:-1}if(i===T||(i===P||i===A)&&n===le){C=k;var L=m&&x===b&&b.visualViewport?b.visualViewport.width:x[O];u-=L-o.width,u*=l?1:-1}}var S=Object.assign({position:s},c&&po),V=p===!0?lo({x:u,y:f}):{x:u,y:f};if(u=V.x,f=V.y,l){var $;return Object.assign({},S,($={},$[h]=j?"0":"",$[C]=E?"0":"",$.transform=(b.devicePixelRatio||1)<=1?"translate("+u+"px, "+f+"px)":"translate3d("+u+"px, "+f+"px, 0)",$))}return Object.assign({},S,(e={},e[h]=j?f+"px":"",e[C]=E?u+"px":"",e.transform="",e))}function co(r){var e=r.state,t=r.options,o=t.gpuAcceleration,i=o===void 0?!0:o,n=t.adaptive,a=n===void 0?!0:n,s=t.roundOffsets,l=s===void 0?!0:s;if(!1)var c;var p={placement:R(e.placement),variation:X(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:i,isFixed:e.options.strategy==="fixed"};e.modifiersData.popperOffsets!=null&&(e.styles.popper=Object.assign({},e.styles.popper,ir(Object.assign({},p,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:a,roundOffsets:l})))),e.modifiersData.arrow!=null&&(e.styles.arrow=Object.assign({},e.styles.arrow,ir(Object.assign({},p,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})}var nr={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:co,data:{}};var Ue={passive:!0};function mo(r){var e=r.state,t=r.instance,o=r.options,i=o.scroll,n=i===void 0?!0:i,a=o.resize,s=a===void 0?!0:a,l=B(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return n&&c.forEach(function(p){p.addEventListener("scroll",t.update,Ue)}),s&&l.addEventListener("resize",t.update,Ue),function(){n&&c.forEach(function(p){p.removeEventListener("scroll",t.update,Ue)}),s&&l.removeEventListener("resize",t.update,Ue)}}var sr={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:mo,data:{}};var uo={left:"right",right:"left",bottom:"top",top:"bottom"};function Se(r){return r.replace(/left|right|bottom|top/g,function(e){return uo[e]})}var fo={start:"end",end:"start"};function Ye(r){return r.replace(/start|end/g,function(e){return fo[e]})}function de(r){var e=B(r),t=e.pageXOffset,o=e.pageYOffset;return{scrollLeft:t,scrollTop:o}}function ge(r){return W(F(r)).left+de(r).scrollLeft}function ct(r){var e=B(r),t=F(r),o=e.visualViewport,i=t.clientWidth,n=t.clientHeight,a=0,s=0;return o&&(i=o.width,n=o.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(a=o.offsetLeft,s=o.offsetTop)),{width:i,height:n,x:a+ge(r),y:s}}function mt(r){var e,t=F(r),o=de(r),i=(e=r.ownerDocument)==null?void 0:e.body,n=Y(t.scrollWidth,t.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),a=Y(t.scrollHeight,t.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),s=-o.scrollLeft+ge(r),l=-o.scrollTop;return _(i||t).direction==="rtl"&&(s+=Y(t.clientWidth,i?i.clientWidth:0)-n),{width:n,height:a,x:s,y:l}}function he(r){var e=_(r),t=e.overflow,o=e.overflowX,i=e.overflowY;return/auto|scroll|overlay|hidden/.test(t+i+o)}function ze(r){return["html","body","#document"].indexOf(M(r))>=0?r.ownerDocument.body:D(r)&&he(r)?r:ze(te(r))}function ne(r,e){var t;e===void 0&&(e=[]);var o=ze(r),i=o===((t=r.ownerDocument)==null?void 0:t.body),n=B(o),a=i?[n].concat(n.visualViewport||[],he(o)?o:[]):o,s=e.concat(a);return i?s:s.concat(ne(te(a)))}function Ee(r){return Object.assign({},r,{left:r.x,top:r.y,right:r.x+r.width,bottom:r.y+r.height})}function go(r){var e=W(r);return e.top=e.top+r.clientTop,e.left=e.left+r.clientLeft,e.bottom=e.top+r.clientHeight,e.right=e.left+r.clientWidth,e.width=r.clientWidth,e.height=r.clientHeight,e.x=e.left,e.y=e.top,e}function ar(r,e){return e===Ge?Ee(ct(r)):J(e)?go(e):Ee(mt(F(r)))}function ho(r){var e=ne(te(r)),t=["absolute","fixed"].indexOf(_(r).position)>=0,o=t&&D(r)?z(r):r;return J(o)?e.filter(function(i){return J(i)&&Ae(i,o)&&M(i)!=="body"}):[]}function ut(r,e,t){var o=e==="clippingParents"?ho(r):[].concat(e),i=[].concat(o,[t]),n=i[0],a=i.reduce(function(s,l){var c=ar(r,l);return s.top=Y(c.top,s.top),s.right=ce(c.right,s.right),s.bottom=ce(c.bottom,s.bottom),s.left=Y(c.left,s.left),s},ar(r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function Ie(r){var e=r.reference,t=r.element,o=r.placement,i=o?R(o):null,n=o?X(o):null,a=e.x+e.width/2-t.width/2,s=e.y+e.height/2-t.height/2,l;switch(i){case P:l={x:a,y:e.y-t.height};break;case A:l={x:a,y:e.y+e.height};break;case k:l={x:e.x+e.width,y:s};break;case T:l={x:e.x-t.width,y:s};break;default:l={x:e.x,y:e.y}}var c=i?ue(i):null;if(c!=null){var p=c==="y"?"height":"width";switch(n){case Z:l[c]=l[c]-(e[p]/2-t[p]/2);break;case le:l[c]=l[c]+(e[p]/2-t[p]/2);break;default:}}return l}function K(r,e){e===void 0&&(e={});var t=e,o=t.placement,i=o===void 0?r.placement:o,n=t.boundary,a=n===void 0?Qt:n,s=t.rootBoundary,l=s===void 0?Ge:s,c=t.elementContext,p=c===void 0?be:c,m=t.altBoundary,v=m===void 0?!1:m,u=t.padding,w=u===void 0?0:u,f=Me(typeof w!="number"?w:Re(w,ie)),g=p===be?Jt:be,E=r.rects.popper,j=r.elements[v?g:p],C=ut(J(j)?j:j.contextElement||F(r.elements.popper),a,l),h=W(r.elements.reference),b=Ie({reference:h,element:E,strategy:"absolute",placement:i}),x=Ee(Object.assign({},E,b)),y=p===be?x:h,O={top:C.top-y.top+f.top,bottom:y.bottom-C.bottom+f.bottom,left:C.left-y.left+f.left,right:y.right-C.right+f.right},I=r.modifiersData.offset;if(p===be&&I){var L=I[i];Object.keys(O).forEach(function(S){var V=[k,A].indexOf(S)>=0?1:-1,$=[P,A].indexOf(S)>=0?"y":"x";O[S]+=L[$]*V})}return O}function ft(r,e){e===void 0&&(e={});var t=e,o=t.placement,i=t.boundary,n=t.rootBoundary,a=t.padding,s=t.flipVariations,l=t.allowedAutoPlacements,c=l===void 0?qe:l,p=X(o),m=p?s?pt:pt.filter(function(w){return X(w)===p}):ie,v=m.filter(function(w){return c.indexOf(w)>=0});v.length===0&&(v=m);var u=v.reduce(function(w,f){return w[f]=K(r,{placement:f,boundary:i,rootBoundary:n,padding:a})[R(f)],w},{});return Object.keys(u).sort(function(w,f){return u[w]-u[f]})}function vo(r){if(R(r)===Xe)return[];var e=Se(r);return[Ye(r),e,Ye(e)]}function wo(r){var e=r.state,t=r.options,o=r.name;if(!e.modifiersData[o]._skip){for(var i=t.mainAxis,n=i===void 0?!0:i,a=t.altAxis,s=a===void 0?!0:a,l=t.fallbackPlacements,c=t.padding,p=t.boundary,m=t.rootBoundary,v=t.altBoundary,u=t.flipVariations,w=u===void 0?!0:u,f=t.allowedAutoPlacements,g=e.options.placement,E=R(g),j=E===g,C=l||(j||!w?[Se(g)]:vo(g)),h=[g].concat(C).reduce(function(we,re){return we.concat(R(re)===Xe?ft(e,{placement:re,boundary:p,rootBoundary:m,padding:c,flipVariations:w,allowedAutoPlacements:f}):re)},[]),b=e.rects.reference,x=e.rects.popper,y=new Map,O=!0,I=h[0],L=0;L=0,Oe=Pe?"width":"height",H=K(e,{placement:S,boundary:p,rootBoundary:m,altBoundary:v,padding:c}),q=Pe?$?k:T:$?A:P;b[Oe]>x[Oe]&&(q=Se(q));var Le=Se(q),se=[];if(n&&se.push(H[V]<=0),s&&se.push(H[q]<=0,H[Le]<=0),se.every(function(we){return we})){I=S,O=!1;break}y.set(S,se)}if(O)for(var Fe=w?3:1,Qe=function(re){var Be=h.find(function(Ve){var ae=y.get(Ve);if(ae)return ae.slice(0,re).every(function(Je){return Je})});if(Be)return I=Be,"break"},Te=Fe;Te>0;Te--){var _e=Qe(Te);if(_e==="break")break}e.placement!==I&&(e.modifiersData[o]._skip=!0,e.placement=I,e.reset=!0)}}var pr={name:"flip",enabled:!0,phase:"main",fn:wo,requiresIfExists:["offset"],data:{_skip:!1}};function lr(r,e,t){return t===void 0&&(t={x:0,y:0}),{top:r.top-e.height-t.y,right:r.right-e.width+t.x,bottom:r.bottom-e.height+t.y,left:r.left-e.width-t.x}}function cr(r){return[P,k,A,T].some(function(e){return r[e]>=0})}function xo(r){var e=r.state,t=r.name,o=e.rects.reference,i=e.rects.popper,n=e.modifiersData.preventOverflow,a=K(e,{elementContext:"reference"}),s=K(e,{altBoundary:!0}),l=lr(a,o),c=lr(s,i,n),p=cr(l),m=cr(c);e.modifiersData[t]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:m},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":m})}var mr={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:xo};function bo(r,e,t){var o=R(r),i=[T,P].indexOf(o)>=0?-1:1,n=typeof t=="function"?t(Object.assign({},e,{placement:r})):t,a=n[0],s=n[1];return a=a||0,s=(s||0)*i,[T,k].indexOf(o)>=0?{x:s,y:a}:{x:a,y:s}}function yo(r){var e=r.state,t=r.options,o=r.name,i=t.offset,n=i===void 0?[0,0]:i,a=qe.reduce(function(p,m){return p[m]=bo(m,e.rects,n),p},{}),s=a[e.placement],l=s.x,c=s.y;e.modifiersData.popperOffsets!=null&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[o]=a}var ur={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:yo};function So(r){var e=r.state,t=r.name;e.modifiersData[t]=Ie({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})}var fr={name:"popperOffsets",enabled:!0,phase:"read",fn:So,data:{}};function dt(r){return r==="x"?"y":"x"}function Eo(r){var e=r.state,t=r.options,o=r.name,i=t.mainAxis,n=i===void 0?!0:i,a=t.altAxis,s=a===void 0?!1:a,l=t.boundary,c=t.rootBoundary,p=t.altBoundary,m=t.padding,v=t.tether,u=v===void 0?!0:v,w=t.tetherOffset,f=w===void 0?0:w,g=K(e,{boundary:l,rootBoundary:c,padding:m,altBoundary:p}),E=R(e.placement),j=X(e.placement),C=!j,h=ue(E),b=dt(h),x=e.modifiersData.popperOffsets,y=e.rects.reference,O=e.rects.popper,I=typeof f=="function"?f(Object.assign({},e.rects,{placement:e.placement})):f,L=typeof I=="number"?{mainAxis:I,altAxis:I}:Object.assign({mainAxis:0,altAxis:0},I),S=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,V={x:0,y:0};if(!!x){if(n){var $,Pe=h==="y"?P:T,Oe=h==="y"?A:k,H=h==="y"?"height":"width",q=x[h],Le=q+g[Pe],se=q-g[Oe],Fe=u?-O[H]/2:0,Qe=j===Z?y[H]:O[H],Te=j===Z?-O[H]:-y[H],_e=e.elements.arrow,we=u&&_e?me(_e):{width:0,height:0},re=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:De(),Be=re[Pe],Ve=re[Oe],ae=fe(0,y[H],we[H]),Je=C?y[H]/2-Fe-ae-Be-L.mainAxis:Qe-ae-Be-L.mainAxis,kr=C?-y[H]/2+Fe+ae+Ve+L.mainAxis:Te+ae+Ve+L.mainAxis,Ze=e.elements.arrow&&z(e.elements.arrow),Nr=Ze?h==="y"?Ze.clientTop||0:Ze.clientLeft||0:0,Tt=($=S==null?void 0:S[h])!=null?$:0,Ar=q+Je-Tt-Nr,Dr=q+kr-Tt,Bt=fe(u?ce(Le,Ar):Le,q,u?Y(se,Dr):se);x[h]=Bt,V[h]=Bt-q}if(s){var kt,Mr=h==="x"?P:T,Rr=h==="x"?A:k,pe=x[b],$e=b==="y"?"height":"width",Nt=pe+g[Mr],At=pe-g[Rr],et=[P,T].indexOf(E)!==-1,Dt=(kt=S==null?void 0:S[b])!=null?kt:0,Mt=et?Nt:pe-y[$e]-O[$e]-Dt+L.altAxis,Rt=et?pe+y[$e]+O[$e]-Dt-L.altAxis:At,It=u&&et?rr(Mt,pe,Rt):fe(u?Mt:Nt,pe,u?Rt:At);x[b]=It,V[b]=It-pe}e.modifiersData[o]=V}}var dr={name:"preventOverflow",enabled:!0,phase:"main",fn:Eo,requiresIfExists:["offset"]};function gt(r){return{scrollLeft:r.scrollLeft,scrollTop:r.scrollTop}}function ht(r){return r===B(r)||!D(r)?de(r):gt(r)}function jo(r){var e=r.getBoundingClientRect(),t=ee(e.width)/r.offsetWidth||1,o=ee(e.height)/r.offsetHeight||1;return t!==1||o!==1}function vt(r,e,t){t===void 0&&(t=!1);var o=D(e),i=D(e)&&jo(e),n=F(e),a=W(r,i),s={scrollLeft:0,scrollTop:0},l={x:0,y:0};return(o||!o&&!t)&&((M(e)!=="body"||he(n))&&(s=ht(e)),D(e)?(l=W(e,!0),l.x+=e.clientLeft,l.y+=e.clientTop):n&&(l.x=ge(n))),{x:a.left+s.scrollLeft-l.x,y:a.top+s.scrollTop-l.y,width:a.width,height:a.height}}function Co(r){var e=new Map,t=new Set,o=[];r.forEach(function(n){e.set(n.name,n)});function i(n){t.add(n.name);var a=[].concat(n.requires||[],n.requiresIfExists||[]);a.forEach(function(s){if(!t.has(s)){var l=e.get(s);l&&i(l)}}),o.push(n)}return r.forEach(function(n){t.has(n.name)||i(n)}),o}function wt(r){var e=Co(r);return Zt.reduce(function(t,o){return t.concat(e.filter(function(i){return i.phase===o}))},[])}function xt(r){var e;return function(){return e||(e=new Promise(function(t){Promise.resolve().then(function(){e=void 0,t(r())})})),e}}function bt(r){var e=r.reduce(function(t,o){var i=t[o.name];return t[o.name]=i?Object.assign({},i,o,{options:Object.assign({},i.options,o.options),data:Object.assign({},i.data,o.data)}):o,t},{});return Object.keys(e).map(function(t){return e[t]})}var gr={placement:"bottom",modifiers:[],strategy:"absolute"};function hr(){for(var r=arguments.length,e=new Array(r),t=0;t(r%e+e)%e,xr=class{constructor(e,t,o){this.owner=e,this.containerEl=t,t.on("click",".suggestion-item",this.onSuggestionClick.bind(this)),t.on("mousemove",".suggestion-item",this.onSuggestionMouseover.bind(this)),o.register([],"ArrowUp",i=>{if(!i.isComposing)return this.setSelectedItem(this.selectedItem-1,!0),!1}),o.register([],"ArrowDown",i=>{if(!i.isComposing)return this.setSelectedItem(this.selectedItem+1,!0),!1}),o.register([],"Enter",i=>{if(!i.isComposing)return this.useSelectedItem(i),!1})}onSuggestionClick(e,t){e.preventDefault();let o=this.suggestions.indexOf(t);this.setSelectedItem(o,!1),this.useSelectedItem(e)}onSuggestionMouseover(e,t){let o=this.suggestions.indexOf(t);this.setSelectedItem(o,!1)}setSuggestions(e){this.containerEl.empty();let t=[];e.forEach(o=>{let i=this.containerEl.createDiv("suggestion-item");this.owner.renderSuggestion(o,i),t.push(i)}),this.values=e,this.suggestions=t,this.setSelectedItem(0,!1)}useSelectedItem(e){let t=this.values[this.selectedItem];t&&this.owner.selectSuggestion(t,e)}setSelectedItem(e,t){let o=Oo(e,this.suggestions.length),i=this.suggestions[this.selectedItem],n=this.suggestions[o];i==null||i.removeClass("is-selected"),n==null||n.addClass("is-selected"),this.selectedItem=o,t&&n.scrollIntoView(!1)}},ve=class{constructor(e,t){this.app=e,this.inputEl=t,this.scope=new wr.Scope,this.suggestEl=createDiv("suggestion-container");let o=this.suggestEl.createDiv("suggestion");this.suggest=new xr(this,o,this.scope),this.scope.register([],"Escape",this.close.bind(this)),this.inputEl.addEventListener("input",this.onInputChanged.bind(this)),this.inputEl.addEventListener("focus",this.onInputChanged.bind(this)),this.inputEl.addEventListener("blur",this.close.bind(this)),this.suggestEl.on("mousedown",".suggestion-container",i=>{i.preventDefault()})}onInputChanged(){let e=this.inputEl.value,t=this.getSuggestions(e);if(!t){this.close();return}t.length>0?(this.suggest.setSuggestions(t),this.open(this.app.dom.appContainerEl,this.inputEl)):this.close()}open(e,t){this.app.keymap.pushScope(this.scope),e.appendChild(this.suggestEl),this.popper=yt(t,this.suggestEl,{placement:"bottom-start",modifiers:[{name:"sameWidth",enabled:!0,fn:({state:o,instance:i})=>{let n=`${o.rects.reference.width}px`;o.styles.popper.width!==n&&(o.styles.popper.width=n,i.update())},phase:"beforeWrite",requires:["computeStyles"]}]})}close(){this.app.keymap.popScope(this.scope),this.suggest.setSuggestions([]),this.popper&&this.popper.destroy(),this.suggestEl.detach()}};var To="{{DATE}}",br="{{DATE:}}",Bo=/{{D?A?T?E?}?}?$/i,ko=/{{D?A?T?E?:?$|{{DATE:[^\n\r}]*}}$/i,No="{{author}}",Ao=/{{a?u?t?h?o?r?}?}?$/i,Do="{{title}}",Mo=/{{t?i?t?l?e?}?}?$/i,St=class extends ve{constructor(e,t){super(e,t);this.app=e;this.inputEl=t;this.lastInput=""}getSuggestions(e){let t=this.inputEl.selectionStart,o=15,i=e.substr(t-o,o),n=[];return this.processToken(i,(a,s)=>{this.lastInput=a[0],n.push(s)}),n}selectSuggestion(e){let t=this.inputEl.selectionStart,o=this.lastInput.length,i=this.inputEl.value,n=0,a=(s,l=0)=>`${i.substr(0,t-o+l)}${s}${i.substr(t)}`;this.processToken(e,(s,l)=>{e.contains(l)&&(this.inputEl.value=a(e),n=t-o+e.length,e===br&&(n-=2))}),this.inputEl.trigger("input"),this.close(),this.inputEl.setSelectionRange(n,n)}renderSuggestion(e,t){e&&t.setText(e)}processToken(e,t){let o=ko.exec(e);o&&t(o,br);let i=Bo.exec(e);i&&t(i,To);let n=Ao.exec(e);n&&t(n,No);let a=Mo.exec(e);a&&t(a,Do)}};var yr=U(require("obsidian"));var Et=class extends ve{getSuggestions(e){let t=this.app.vault.getAllLoadedFiles(),o=[],i=e.toLowerCase();return t.forEach(n=>{n instanceof yr.TFolder&&n.path.toLowerCase().contains(i)&&o.push(n)}),o}renderSuggestion(e,t){t.setText(e.path)}selectSuggestion(e){this.inputEl.value=e.path,this.inputEl.trigger("input"),this.close()}};var Sr=U(require("obsidian"));var jt=class extends ve{getSuggestions(e){let t=this.app.vault.getAllLoadedFiles(),o=[],i=e.toLowerCase();return t.forEach(n=>{n instanceof Sr.TFile&&n.extension==="md"&&n.path.toLowerCase().contains(i)&&o.push(n)}),o}renderSuggestion(e,t){t.setText(e.path)}selectSuggestion(e){this.inputEl.value=e.path,this.inputEl.trigger("input"),this.close()}};var je=U(require("obsidian")),Ct=class extends je.Modal{constructor(e,t){super(e.app);this.callback=t;var o,i;this.plugin=e,this.currentServiceProvider=(i=(o=e.settings)==null?void 0:o.serviceProvider)!=null?i:N.google}get settings(){return this.plugin.settings}saveSetting(){return d(this,null,function*(){return this.plugin.saveSettings()})}saveClientId(e){this.currentServiceProvider===N.naver&&(this.plugin.settings.naverClientId=e)}saveClientSecret(e){this.currentServiceProvider===N.naver&&(this.settings.naverClientSecret=e)}get currentClientId(){if(this.currentServiceProvider===N.naver)return this.settings.naverClientId}get currentClientSecret(){if(this.currentServiceProvider===N.naver)return this.settings.naverClientSecret}onOpen(){let{contentEl:e}=this;e.createEl("h2",{text:"Service Provider Setting"}),new je.Setting(e).setName("Client ID").addText(t=>{t.setValue(this.currentClientId).onChange(o=>this.saveClientId(o))}),new je.Setting(e).setName("Client Secret").addText(t=>{t.setValue(this.currentClientSecret).onChange(o=>this.saveClientSecret(o))}),new je.Setting(e).addButton(t=>t.setButtonText("Save").setCta().onClick(()=>d(this,null,function*(){var o;yield this.plugin.saveSettings(),this.close(),(o=this.callback)==null||o.call(this)})))}onClose(){this.contentEl.empty()}};var Er="https://github.com/anpigon/obsidian-book-search-plugin",Q;(function(t){t.snakeCase="Snake Case",t.camelCase="Camel Case"})(Q||(Q={}));var jr={folder:"",fileNameFormat:"",frontmatter:"",content:"",useDefaultFrontmatter:!0,defaultFrontmatterKeyType:Q.camelCase,templateFile:"",serviceProvider:N.google,naverClientId:"",naverClientSecret:""},Pt=class extends G.PluginSettingTab{constructor(e,t){super(e,t);this.plugin=t}get settings(){return this.plugin.settings}display(){let{containerEl:e}=this;e.empty(),e.classList.add("book-search-plugin__settings"),Cr(e,"General Settings"),new G.Setting(e).setName("New file location").setDesc("New book notes will be placed here.").addSearch(p=>{try{new Et(this.app,p.inputEl)}catch(m){}p.setPlaceholder("Example: folder1/folder2").setValue(this.plugin.settings.folder).onChange(m=>{this.plugin.settings.folder=m,this.plugin.saveSettings()})});let t=document.createDocumentFragment().createEl("code",{text:We(this.plugin.settings.fileNameFormat)||"{{title}} - {{author}}"});new G.Setting(e).setClass("book-search-plugin__settings--new_file_name").setName("New file name").setDesc("Enter the file name format.").addSearch(p=>{try{new St(this.app,p.inputEl)}catch(m){}p.setPlaceholder("Example: {{title}} - {{author}}").setValue(this.plugin.settings.fileNameFormat).onChange(m=>{this.plugin.settings.fileNameFormat=m==null?void 0:m.trim(),this.plugin.saveSettings(),t.innerHTML=We(m)||"{{title}} - {{author}}"})}),e.createEl("div",{cls:["setting-item-description","book-search-plugin__settings--new_file_name_hint"]}).append(t);let o=document.createDocumentFragment();o.createDiv({text:"Files will be available as templates."}),o.createEl("a",{text:"Example Template",href:`${Er}#example-template`}),new G.Setting(e).setName("Template file").setDesc(o).addSearch(p=>{try{new jt(this.app,p.inputEl)}catch(m){}p.setPlaceholder("Example: templates/template-file").setValue(this.plugin.settings.templateFile).onChange(m=>{this.plugin.settings.templateFile=m,this.plugin.saveSettings()})});let i,n=()=>{i.addClass("book-search-plugin__hide")},a=()=>{i.removeClass("book-search-plugin__hide")},s=(p=(m=>(m=this.settings)==null?void 0:m.serviceProvider)())=>{p===N.naver?a():n()};new G.Setting(e).setName("Service Provider").setDesc("Choose the service provider you want to use to search your books.").setClass("book-search-plugin__settings--service_provider").addDropdown(p=>{var m,v;p.addOption(N.google,`${N.google} (Global)`),p.addOption(N.naver,`${N.naver} (Korean)`),p.setValue((v=(m=this.plugin.settings)==null?void 0:m.serviceProvider)!=null?v:N.google),p.onChange(u=>d(this,null,function*(){let w=u;s(w),this.settings.serviceProvider=w,yield this.plugin.saveSettings()}))}).addExtraButton(p=>{i=p.extraSettingsEl,s(),p.onClick(()=>{new Ct(this.plugin).open()})});let l=[];Pr(e,"Frontmatter Settings",l),l.push(new G.Setting(e).setClass("book-search-plugin__hide").setName("Use the default frontmatter").setDesc("If you don't want the default frontmatter to be inserted, disable it.").addToggle(p=>{p.setValue(this.plugin.settings.useDefaultFrontmatter).onChange(m=>d(this,null,function*(){let v=m;this.plugin.settings.useDefaultFrontmatter=v,yield this.plugin.saveSettings()}))}),new G.Setting(e).setClass("book-search-plugin__hide").setName("Default frontmatter key type").setDesc(Ro()).addDropdown(p=>{p.addOption(Q.snakeCase,Q.snakeCase.toString()),p.addOption(Q.camelCase,Q.camelCase.toString()),p.setValue(this.plugin.settings.defaultFrontmatterKeyType),p.onChange(m=>d(this,null,function*(){this.plugin.settings.defaultFrontmatterKeyType=m,yield this.plugin.saveSettings()}))}),new G.Setting(e).setClass("book-search-plugin__hide").setName("(Deprecated) Text to insert into frontmatter").setDesc(Or("#text-to-insert-into-frontmatter")).addTextArea(p=>{let m=this.plugin.settings.frontmatter;p.setValue(m).onChange(v=>d(this,null,function*(){let u=v;this.plugin.settings.frontmatter=u,yield this.plugin.saveSettings()}))}));let c=[];Pr(e,"Content Settings",c),c.push(new G.Setting(e).setClass("book-search-plugin__hide").setName("(Deprecated) Text to insert into content").setDesc(Or("#text-to-insert-into-content")).addTextArea(p=>{let m=this.plugin.settings.content;p.setValue(m).onChange(v=>d(this,null,function*(){let u=v;this.plugin.settings.content=u,yield this.plugin.saveSettings()}))}))}};function Ro(){let r=document.createDocumentFragment();return r.append("- Snake Case: ",r.createEl("code",{text:"total_page"}),r.createEl("br"),"- Camel Case: ",r.createEl("code",{text:"totalPage"})),r}function Cr(r,e){let t=document.createDocumentFragment();return t.createEl("h2",{text:e}),new G.Setting(r).setHeading().setName(t)}function Pr(r,e,t){return Cr(r,e).addToggle(o=>{o.onChange(i=>{t.forEach(({settingEl:n})=>{n.toggleClass("book-search-plugin__show",i)})})})}function Or(r){let e=document.createDocumentFragment();return e.append("Please use the template file.",e.createEl("br"),"The following syntaxes are available: ",e.createEl("br"),e.createEl("code",{text:"{{title}}"}),", ",e.createEl("code",{text:"{{author}}"}),", ",e.createEl("code",{text:"{{category}}"}),", ",e.createEl("code",{text:"{{publisher}}"}),", ",e.createEl("code",{text:"{{publishDate}}"}),", ",e.createEl("code",{text:"{{totalPage}}"}),", ",e.createEl("code",{text:"{{coverUrl}}"}),", ",e.createEl("code",{text:"{{isbn10}}"}),", ",e.createEl("code",{text:"{{isbn13}}"}),e.createEl("br"),"Check the ",e.createEl("a",{href:`${Er}${r}`,text:"documentation"})," for more information."),e}var Ke=U(require("obsidian"));function Tr(r,e){return d(this,null,function*(){let{metadataCache:t,vault:o}=r,i=(0,Ke.normalizePath)(e!=null?e:"");if(e==="/")return Promise.resolve("");try{let n=t.getFirstLinkpathDest(i,"");return n?o.cachedRead(n):""}catch(n){return console.error(`Failed to read the daily note template '${i}'`,n),new Ke.Notice("Failed to read the daily note template"),""}})}function Br(r){return r.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(e,t,o,i,n,a)=>{let s=window.moment(),l=window.moment().clone().set({hour:s.get("hour"),minute:s.get("minute"),second:s.get("second")});return o&&l.add(parseInt(i,10),n),a?l.format(a.substring(1).trim()):l.format("YYYY-MM-DD")})}var Ot=class extends Ce.Plugin{onload(){return d(this,null,function*(){yield this.loadSettings(),this.addRibbonIcon("book","Create new book note",()=>this.createNewBookNote()).addClass("obsidian-book-search-plugin-ribbon-class"),this.addCommand({id:"open-book-search-modal",name:"Create new book note",callback:()=>this.createNewBookNote()}),this.addCommand({id:"open-book-search-modal-to-insert",name:"Insert the metadata",callback:()=>this.insertMetadata()}),this.addSettingTab(new Pt(this.app,this)),console.log(`Book Search: version ${this.manifest.version} (requires obsidian ${this.manifest.minAppVersion})`)})}showNotice(e){try{new Ce.Notice(e==null?void 0:e.toString())}catch(t){}}searchBookMetadata(e){return d(this,null,function*(){let t=yield this.openBookSearchModal(e);return yield this.openBookSuggestModal(t)})}getRenderedContents(e){return d(this,null,function*(){let{templateFile:t,useDefaultFrontmatter:o,defaultFrontmatterKeyType:i,frontmatter:n,content:a}=this.settings;if(t){let c=yield Tr(this.app,t);return Ne(e,Br(c))}let s=Ne(e,n);o&&(s=Yt(Ut(e,s,i)));let l=Ne(e,a);return s?`--- ${s} --- -${l}`:l})}insertMetadata(){return d(this,null,function*(){try{let e=this.app.workspace.getActiveViewOfType(Ce.MarkdownView);if(!e){console.warn("Can not find an active markdown view");return}let t=yield this.searchBookMetadata(e.file.basename);if(!e.editor){console.warn("Can not find editor from the active markdown view");return}let o=yield this.getRenderedContents(t);e.editor.replaceRange(o,{line:0,ch:0})}catch(e){console.warn(e),this.showNotice(e)}})}createNewBookNote(){return d(this,null,function*(){try{let e=yield this.searchBookMetadata(),t=this.app.workspace.getLeaf();if(!t){console.warn("No active leaf");return}let o=yield this.getRenderedContents(e),i=Ut(e,this.settings.fileNameFormat),n=kr.join(this.settings.folder,i),a=yield this.app.vault.create(n,o);yield t.openFile(a,{state:{mode:"source"}}),t.setEphemeralState({rename:"all"}),yield new nt(this.app).jumpToNextCursorLocation()}catch(e){this.showNotice(e)}})}openBookSearchModal(e=""){return d(this,null,function*(){return new Promise((t,o)=>new ot(this,e,(i,n)=>i?o(i):t(n)).open())})}openBookSuggestModal(e){return d(this,null,function*(){return new Promise((t,o)=>new it(this.app,e,(i,n)=>i?o(i):t(n)).open())})}loadSettings(){return d(this,null,function*(){this.settings=Object.assign({},jr,yield this.loadData())})}saveSettings(){return d(this,null,function*(){yield this.saveData(this.settings)})}}; +${l}`:l})}insertMetadata(){return d(this,null,function*(){try{let e=this.app.workspace.getActiveViewOfType(Ce.MarkdownView);if(!e){console.warn("Can not find an active markdown view");return}let t=yield this.searchBookMetadata(e.file.basename);if(!e.editor){console.warn("Can not find editor from the active markdown view");return}let o=yield this.getRenderedContents(t);e.editor.replaceRange(o,{line:0,ch:0})}catch(e){console.warn(e),this.showNotice(e)}})}createNewBookNote(){return d(this,null,function*(){try{let e=yield this.searchBookMetadata(),t=this.app.workspace.getLeaf();if(!t){console.warn("No active leaf");return}let o=yield this.getRenderedContents(e),i=qt(e,this.settings.fileNameFormat),n=`${this.settings.folder}/${i}`,a=yield this.app.vault.create(n,o);yield t.openFile(a,{state:{mode:"source"}}),t.setEphemeralState({rename:"all"}),yield new nt(this.app).jumpToNextCursorLocation()}catch(e){console.warn(e),this.showNotice(e)}})}openBookSearchModal(e=""){return d(this,null,function*(){return new Promise((t,o)=>new ot(this,e,(i,n)=>i?o(i):t(n)).open())})}openBookSuggestModal(e){return d(this,null,function*(){return new Promise((t,o)=>new it(this.app,e,(i,n)=>i?o(i):t(n)).open())})}loadSettings(){return d(this,null,function*(){this.settings=Object.assign({},jr,yield this.loadData())})}saveSettings(){return d(this,null,function*(){yield this.saveData(this.settings)})}}; diff --git a/.obsidian/plugins/obsidian-book-search-plugin/manifest.json b/.obsidian/plugins/obsidian-book-search-plugin/manifest.json index b12ea655..ca794327 100644 --- a/.obsidian/plugins/obsidian-book-search-plugin/manifest.json +++ b/.obsidian/plugins/obsidian-book-search-plugin/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-book-search-plugin", "name": "Book Search", - "version": "0.5.5", + "version": "0.5.6", "minAppVersion": "0.12.0", "description": "Helps you find books and create notes.", "author": "anpigon", diff --git a/.obsidian/plugins/obsidian-columns/data.json b/.obsidian/plugins/obsidian-columns/data.json deleted file mode 100644 index 65b6b527..00000000 --- a/.obsidian/plugins/obsidian-columns/data.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "wrapSize": 25, - "defaultSpan": 1 -} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-columns/main.js b/.obsidian/plugins/obsidian-columns/main.js deleted file mode 100644 index 1f0e07c2..00000000 --- a/.obsidian/plugins/obsidian-columns/main.js +++ /dev/null @@ -1,345 +0,0 @@ -/* -THIS IS A GENERATED/BUNDLED FILE BY ESBUILD -if you want to view the source, please visit the github repository of this plugin -*/ - -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); -var __export = (target, all) => { - __markAsModule(target); - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __reExport = (target, module2, desc) => { - if (module2 && typeof module2 === "object" || typeof module2 === "function") { - for (let key of __getOwnPropNames(module2)) - if (!__hasOwnProp.call(target, key) && key !== "default") - __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); - } - return target; -}; -var __toModule = (module2) => { - return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); -}; -var __async = (__this, __arguments, generator) => { - return new Promise((resolve, reject) => { - var fulfilled = (value) => { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - }; - var rejected = (value) => { - try { - step(generator.throw(value)); - } catch (e) { - reject(e); - } - }; - var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); - step((generator = generator.apply(__this, __arguments)).next()); - }); -}; - -// main.ts -__export(exports, { - ColumnInsertModal: () => ColumnInsertModal, - default: () => ObsidianColumns -}); -var import_obsidian2 = __toModule(require("obsidian")); - -// obsidian-settings/settings.ts -var import_obsidian = __toModule(require("obsidian")); -var parseBoolean = (value) => { - return value == "yes" || value == "true"; -}; -var parseObject = (value, typ) => { - if (typ == "string") { - return value; - } - if (typ == "boolean") { - return parseBoolean(value); - } - if (typ == "number") { - return parseFloat(value); - } -}; -function createSetting(containerEl, keyval, currentValue, onChange) { - let setting = new import_obsidian.Setting(containerEl).setName(keyval[1].name).setDesc(keyval[1].desc); - if (typeof keyval[1].value == "boolean") { - setting.addToggle((toggle) => toggle.setValue(currentValue).onChange((bool) => { - onChange(bool, keyval[0]); - })); - } else { - setting.addText((text) => text.setPlaceholder(String(keyval[1].value)).setValue(String(currentValue)).onChange((value) => { - onChange(parseObject(value, typeof keyval[1].value), keyval[0]); - })); - } -} -function display(obj, DEFAULT_SETTINGS2, name) { - const { containerEl } = obj; - containerEl.empty(); - containerEl.createEl("h2", { text: "Settings for " + name }); - let keyvals = Object.entries(DEFAULT_SETTINGS2); - for (let keyval of keyvals) { - createSetting(containerEl, keyval, obj.plugin.settings[keyval[0]].value, (value, key) => { - obj.plugin.settings[key].value = value; - obj.plugin.saveSettings(); - }); - } -} -function loadSettings(obj, DEFAULT_SETTINGS2) { - obj.settings = DEFAULT_SETTINGS2; - obj.loadData().then((data) => { - if (data) { - let items = Object.entries(data); - items.forEach((item) => { - obj.settings[item[0]].value = item[1]; - }); - } - }); -} -function saveSettings(obj, DEFAULT_SETTINGS2) { - return __async(this, null, function* () { - let saveData = {}; - Object.entries(obj.settings).forEach((i) => { - saveData[i[0]] = i[1].value; - }); - yield obj.saveData(saveData); - }); -} - -// main.ts -var NAME = "Obsidian Columns"; -var COLUMNNAME = "col"; -var COLUMNMD = COLUMNNAME + "-md"; -var TOKEN = "!!!"; -var SETTINGSDELIM = "\n===\n"; -var DEFAULT_SETTINGS = { - wrapSize: { value: 100, name: "Minimum width of column", desc: "Columns will have this minimum width before wrapping to a new row. 0 disables column wrapping. Useful for smaller devices" }, - defaultSpan: { value: 1, name: "The default span of an item", desc: "The default width of a column. If the minimum width is specified, the width of the column will be multiplied by this setting." } -}; -var parseSettings = (settings) => { - let o = {}; - settings.split("\n").map((i) => { - return i.split(";"); - }).reduce((a, b) => { - a.push(...b); - return a; - }).map((i) => { - return i.split("=").map((j) => { - return j.trim(); - }).slice(0, 2); - }).forEach((i) => { - o[i[0]] = i[1]; - }); - return o; -}; -var ObsidianColumns = class extends import_obsidian2.Plugin { - constructor() { - super(...arguments); - this.generateCssString = (span) => { - let o = {}; - o.flexGrow = span.toString(); - o.flexBasis = (this.settings.wrapSize.value * span).toString() + "px"; - o.width = (this.settings.wrapSize.value * span).toString() + "px"; - return o; - }; - this.applyStyle = (el, styles) => { - Object.assign(el.style, styles); - }; - this.processChild = (c) => { - if (c.firstChild != null && "tagName" in c.firstChild && c.firstChild.tagName == "BR") { - c.removeChild(c.firstChild); - } - let firstChild = c; - while (firstChild != null) { - if ("style" in firstChild) { - firstChild.style.marginTop = "0px"; - } - firstChild = firstChild.firstChild; - } - let lastChild = c; - while (lastChild != null) { - if ("style" in lastChild) { - lastChild.style.marginBottom = "0px"; - } - lastChild = lastChild.lastChild; - } - }; - } - onload() { - return __async(this, null, function* () { - yield this.loadSettings(); - this.addSettingTab(new ObsidianColumnsSettings(this.app, this)); - this.registerMarkdownCodeBlockProcessor(COLUMNMD, (source, el, ctx) => { - let split = source.split(SETTINGSDELIM); - let settings = {}; - if (split.length > 1) { - source = split.slice(1).join(SETTINGSDELIM); - settings = parseSettings(split[0]); - } - const sourcePath = ctx.sourcePath; - let child = el.createDiv(); - let renderChild = new import_obsidian2.MarkdownRenderChild(child); - ctx.addChild(renderChild); - import_obsidian2.MarkdownRenderer.renderMarkdown(source, child, sourcePath, renderChild); - if ("flexGrow" in settings) { - let flexGrow = parseFloat(settings.flexGrow); - let CSS = this.generateCssString(flexGrow); - delete CSS.width; - this.applyStyle(child, CSS); - } - }); - this.registerMarkdownCodeBlockProcessor(COLUMNNAME, (source, el, ctx) => { - const sourcePath = ctx.sourcePath; - let child = createDiv(); - let renderChild = new import_obsidian2.MarkdownRenderChild(child); - ctx.addChild(renderChild); - import_obsidian2.MarkdownRenderer.renderMarkdown(source, child, sourcePath, renderChild); - let parent = el.createEl("div", { cls: "columnParent" }); - Array.from(child.children).forEach((c) => { - let cc = parent.createEl("div", { cls: "columnChild" }); - let renderCc = new import_obsidian2.MarkdownRenderChild(cc); - ctx.addChild(renderCc); - this.applyStyle(cc, this.generateCssString(this.settings.defaultSpan.value)); - cc.appendChild(c); - if (c.classList.contains("block-language-" + COLUMNMD) && c.childNodes[0].style.flexGrow != "") { - cc.style.flexGrow = c.childNodes[0].style.flexGrow; - cc.style.flexBasis = c.childNodes[0].style.flexBasis; - cc.style.width = c.childNodes[0].style.flexBasis; - } - this.processChild(c); - }); - }); - this.addCommand({ - id: "insert-column-wrapper", - name: "Insert column wrapper", - editorCallback: (editor, view) => { - new ColumnInsertModal(this.app, (result) => { - let num = result.numberOfColumns.value; - let outString = "````col\n"; - for (let i = 0; i < num; i++) { - outString += "```col-md\nflexGrow=1\n===\n# Column " + i + "\n```\n"; - } - outString += "````\n"; - editor.replaceSelection(outString); - }).open(); - } - }); - this.addCommand({ - id: "insert-column", - name: "Insert column", - editorCallback: (editor, view) => { - editor.replaceSelection("```col-md\nflexGrow=1\n===\n# New Column\n```"); - } - }); - let processList = (element, context) => { - for (let child of Array.from(element.children)) { - if (child == null) { - continue; - } - if (child.nodeName != "UL" && child.nodeName != "OL") { - continue; - } - for (let listItem of Array.from(child.children)) { - if (listItem == null) { - continue; - } - if (!listItem.textContent.trim().startsWith(TOKEN + COLUMNNAME)) { - processList(listItem, context); - continue; - } - child.removeChild(listItem); - let colParent = element.createEl("div", { cls: "columnParent" }); - let renderColP = new import_obsidian2.MarkdownRenderChild(colParent); - context.addChild(renderColP); - let itemList = listItem.querySelector("ul, ol"); - if (itemList == null) { - continue; - } - for (let itemListItem of Array.from(itemList.children)) { - let childDiv = colParent.createEl("div", { cls: "columnChild" }); - let renderColC = new import_obsidian2.MarkdownRenderChild(childDiv); - context.addChild(renderColC); - let span = parseFloat(itemListItem.textContent.split("\n")[0].split(" ")[0]); - if (isNaN(span)) { - span = this.settings.defaultSpan.value; - } - this.applyStyle(childDiv, this.generateCssString(span)); - let afterText = false; - processList(itemListItem, context); - for (let itemListItemChild of Array.from(itemListItem.childNodes)) { - if (afterText) { - childDiv.appendChild(itemListItemChild); - } - if (itemListItemChild.nodeName == "#text") { - afterText = true; - } - } - this.processChild(childDiv); - } - } - } - }; - this.registerMarkdownPostProcessor((element, context) => { - processList(element, context); - }); - }); - } - onunload() { - } - loadSettings() { - return __async(this, null, function* () { - loadSettings(this, DEFAULT_SETTINGS); - }); - } - saveSettings() { - return __async(this, null, function* () { - yield saveSettings(this, DEFAULT_SETTINGS); - }); - } -}; -var DEFAULT_MODAL_SETTINGS = { - numberOfColumns: { value: 2, name: "Number of Columns", desc: "Number of Columns to be made" } -}; -var ColumnInsertModal = class extends import_obsidian2.Modal { - constructor(app, onSubmit) { - super(app); - this.onSubmit = onSubmit; - } - onOpen() { - const { contentEl } = this; - contentEl.createEl("h1", { text: "Create a Column Wrapper" }); - let modalSettings = DEFAULT_MODAL_SETTINGS; - let keyvals = Object.entries(DEFAULT_MODAL_SETTINGS); - for (let keyval of keyvals) { - createSetting(contentEl, keyval, "", (value, key) => { - modalSettings[key].value = value; - }); - } - new import_obsidian2.Setting(contentEl).addButton((btn) => btn.setButtonText("Submit").setCta().onClick(() => { - this.close(); - this.onSubmit(modalSettings); - })); - } - onClose() { - let { contentEl } = this; - contentEl.empty(); - } -}; -var ObsidianColumnsSettings = class extends import_obsidian2.PluginSettingTab { - constructor(app, plugin) { - super(app, plugin); - this.plugin = plugin; - } - display() { - display(this, DEFAULT_SETTINGS, NAME); - } -}; diff --git a/.obsidian/plugins/obsidian-columns/manifest.json b/.obsidian/plugins/obsidian-columns/manifest.json deleted file mode 100644 index 6be97274..00000000 --- a/.obsidian/plugins/obsidian-columns/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "obsidian-columns", - "name": "Obsidian Columns", - "minAppVersion": "0.12.0", - "description": "Allows you to create columns in Obsidian Markdown", - "author": "Trevor Nichols", - "authorUrl": "https://github.com/tnichols217/obsidian-columns", - "isDesktopOnly": false, - "version": "1.2.0" -} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-columns/styles.css b/.obsidian/plugins/obsidian-columns/styles.css deleted file mode 100644 index 4c047c67..00000000 --- a/.obsidian/plugins/obsidian-columns/styles.css +++ /dev/null @@ -1,19 +0,0 @@ -.columnParent { - display: flex; - padding: 15px 20px; - flex-wrap: wrap; - gap: 20px; -} - -.columnParent { - white-space: normal; -} - -.cm-preview-code-block .admonition-content .columnParent p { - white-space: pre-wrap; -} - -.columnChild { - flex-grow: 1; - flex-basis: 0px; -} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-commits/data.json b/.obsidian/plugins/obsidian-commits/data.json index 255a4e1e..79cec6e9 100644 --- a/.obsidian/plugins/obsidian-commits/data.json +++ b/.obsidian/plugins/obsidian-commits/data.json @@ -480,9 +480,9 @@ "links": 5 }, "05.01 Computer setup/Nextcloud.md": { - "size": 3197, + "size": 8113, "tags": 4, - "links": 4 + "links": 6 }, "05.01 Computer setup/Threats and Intrusions.md": { "size": 823, @@ -1591,8 +1591,8 @@ }, "00.01 Admin/Test sheet.md": { "size": 12366, - "tags": 0, - "links": 0 + "tags": 5, + "links": 10 }, "00.01 Admin/Templates/layout$address.md": { "size": 51, @@ -1835,7 +1835,7 @@ "links": 0 }, "05.02 Networks/Configuring Docker.md": { - "size": 4762, + "size": 5271, "tags": 3, "links": 4 }, @@ -1875,9 +1875,9 @@ "links": 21 }, "05.02 Networks/Server Cloud.md": { - "size": 9324, + "size": 4792, "tags": 5, - "links": 12 + "links": 13 }, "05.02 Networks/Server Alias.md": { "size": 6817, @@ -1925,7 +1925,7 @@ "links": 1 }, "01.02 Home/Household.md": { - "size": 1713, + "size": 1970, "tags": 3, "links": 2 }, @@ -4345,7 +4345,7 @@ "links": 2 }, "00.01 Admin/Calendars/2022-06-25.md": { - "size": 1236, + "size": 1372, "tags": 1, "links": 9 }, @@ -5232,7 +5232,7 @@ "00.01 Admin/Calendars/2022-08-19.md": { "size": 1130, "tags": 0, - "links": 5 + "links": 7 }, "02.03 Zürich/Dolder Grand.md": { "size": 1159, @@ -5242,7 +5242,7 @@ "02.03 Zürich/Bebek.md": { "size": 1108, "tags": 0, - "links": 2 + "links": 4 }, "03.04 Cinematheque/Django (1966).md": { "size": 1981, @@ -5290,7 +5290,7 @@ "links": 2 }, "03.01 Reading list/La promesse de l'aube.md": { - "size": 1380, + "size": 1915, "tags": 1, "links": 3 }, @@ -5422,27 +5422,27 @@ "00.01 Admin/Calendars/2022-08-28.md": { "size": 1130, "tags": 0, - "links": 4 + "links": 5 }, "00.03 News/Why Don’t Millennials Have Hobbies.md": { "size": 12694, "tags": 4, - "links": 1 + "links": 2 }, "00.03 News/Was King Arthur a Real Person.md": { "size": 36763, "tags": 3, - "links": 1 + "links": 2 }, "00.03 News/Opinion Maternal Instinct Is a Myth That Men Created.md": { "size": 23951, "tags": 2, - "links": 1 + "links": 2 }, "00.03 News/The Deacon and the Dog City Journal.md": { "size": 33264, "tags": 4, - "links": 1 + "links": 2 }, "03.03 Food & Wine/Shakshuka.md": { "size": 4042, @@ -5452,15 +5452,50 @@ "00.03 News/Derinkuyu Mysterious underground city in Turkey found in man’s basement.md": { "size": 8394, "tags": 3, + "links": 2 + }, + "03.04 Cinematheque/Squid Game (2021–).md": { + "size": 2625, + "tags": 1, "links": 1 + }, + "00.01 Admin/Calendars/2022-08-29.md": { + "size": 1135, + "tags": 0, + "links": 4 + }, + "00.01 Admin/Calendars/2022-08-30.md": { + "size": 1135, + "tags": 0, + "links": 8 + }, + "00.01 Admin/Calendars/2022-08-31.md": { + "size": 1429, + "tags": 0, + "links": 7 + }, + "00.01 Admin/Calendars/2022-11-19 Fiancailles Marguerite & Arnold - Paris.md": { + "size": 230, + "tags": 0, + "links": 4 + }, + "00.01 Admin/Calendars/2023-01-14 Mariage Marguerite & Arnold.md": { + "size": 204, + "tags": 0, + "links": 4 + }, + "05.01 Computer setup/Jellyfin.md": { + "size": 1002, + "tags": 4, + "links": 2 } }, "commitTypes": { "/": { - "Refactor": 735, - "Create": 783, - "Link": 1635, - "Expand": 714 + "Refactor": 747, + "Create": 793, + "Link": 1661, + "Expand": 727 } }, "dailyCommits": { @@ -5472,30 +5507,30 @@ "4": 12, "5": 6, "6": 33, - "7": 245, - "8": 390, - "9": 366, - "10": 233, - "11": 196, - "12": 149, - "13": 263, - "14": 206, - "15": 219, - "16": 179, - "17": 168, - "18": 371, + "7": 257, + "8": 395, + "9": 373, + "10": 240, + "11": 199, + "12": 150, + "13": 264, + "14": 208, + "15": 223, + "16": 185, + "17": 179, + "18": 372, "19": 189, "20": 138, "21": 111, - "22": 243, + "22": 244, "23": 53 } }, "weeklyCommits": { "/": { - "Mon": 591, - "Tue": 483, - "Wed": 504, + "Mon": 611, + "Tue": 491, + "Wed": 537, "Thu": 367, "Fri": 333, "Sat": 0, @@ -5505,6 +5540,19 @@ "recentCommits": { "/": { "Expanded": [ + " Jellyfin ", + " Nextcloud ", + " Configuring Docker ", + " Nextcloud ", + " Nextcloud ", + " 2022-08-31 ", + " 2022-06-25 ", + " 2022-08-31 ", + " 2022-11-19 Fiancailles Marguerite & Arnold - Paris ", + " 2023-01-14 Mariage Marguerite & Arnold ", + " Household ", + " La promesse de l'aube ", + " Romain Gary 2 ", " Shakshuka ", " 2022-11-02 Juventus - PSG ", " Household ", @@ -5542,22 +5590,19 @@ " Derborence ", " Polo Park Zürich ", " @Restaurants Zürich ", - " Rosi ", - " Le Mezzerie ", - " Configuring UFW ", - " Crypto Tasks ", - " Bebek ", - " No Idea ", - " Modo ", - " La Réserve ", - " Iroquois ", - " Grande ", - " Daizy ", - " Cantinetta Antinori ", - " Café des Amis ", - " Dolder Grand " + " Rosi " ], "Created": [ + " Jellyfin ", + " 2023-01-14 Mmariage Marguerite & Arnold ", + " 2022-11-19 Fiancailles Marguerite & Arnold - Paris ", + " 2022-08-31 ", + " You Must Remember This - 1989 sex lies and videotape Rob Lowe and James Spader (Erotic 80s Part 12) ", + " 2022-08-30 ", + " Untitled ", + " 2022-08-29 ", + " You Must Remember This - 1989 sex lies and videotape Rob Lowe and James Spader (Erotic 80s Part 12) ", + " Squid Game (2021–) ", " You Must Remember This - 1989 sex lies and videotape Rob Lowe and James Spader (Erotic 80s Part 12) ", " Derinkuyu Mysterious underground city in Turkey found in man’s basement ", " Untitled ", @@ -5598,19 +5643,13 @@ " 2022-08-21 ", " Untitled ", " “Republicans Buy Sneakers Too” ", - " U.S. Ship Sunk by Germans in 1917 Is Found Off English Coast ", - " Welcome to Philip K. Dick’s dystopia ", - " The architect who became the king of bank robberies ", - " Untitled ", - " Untitled ", - " Untitled ", - " 2022-08-20 ", - " Django (1966) ", - " Untitled ", - " Untitled ", - " 2022-08-19 " + " U.S. Ship Sunk by Germans in 1917 Is Found Off English Coast " ], "Renamed": [ + " Jellyfin ", + " 2023-01-14 Mariage Marguerite & Arnold ", + " Romain Gary 2 ", + " Squid Game (2021–) ", " Derinkuyu Mysterious underground city in Turkey found in man’s basement ", " Shakshuka ", " The Deacon and the Dog City Journal ", @@ -5657,13 +5696,12 @@ " After the Zodiac Killer's '340' Cipher Stumped the FBI, Three Amateurs Made a Breakthrough ", " YouTube Fraud Led to $23 Million in Royalties for 2 Men, IRS Says ", " Donald Trump and American Intelligence’s Years of Conflict ", - " How Bolivia’s ruthless tin baron saved thousands of Jewish refugees ", - " The Unlikely Rise of Slim Pickins, the First Black-Owned Outdoors Retailer in the Country ", - " Twitter is becoming a lost city ", - " Then Again Dying man’s note nearly turned history upside down - VTDigger ", - " 2022-08-11 Reparation Oignon LIP " + " How Bolivia’s ruthless tin baron saved thousands of Jewish refugees " ], "Tagged": [ + " Jellyfin ", + " Test sheet ", + " Squid Game (2021–) ", " Derinkuyu Mysterious underground city in Turkey found in man’s basement ", " Shakshuka ", " Opinion Maternal Instinct Is a Myth That Men Created ", @@ -5711,12 +5749,13 @@ " The Wire (2002–2008) ", " My Name Is Earl (2005–2009) ", " The Big Bang Theory (2007–2019) ", - " Weeds (2005–2012) ", - " How I Met Your Mother (2005–2014) ", - " Game of Thrones (2011–2019) ", - " Licence to Kill (1989) " + " Weeds (2005–2012) " ], "Refactored": [ + " Server Cloud ", + " Server Cloud ", + " Server Cloud ", + " Server Cloud ", " Obsidian plugins ", " @Main Dashboard ", " @Café Zürich ", @@ -5763,13 +5802,12 @@ " Equity Tasks ", " Crypto Tasks ", " VC Tasks ", - " Storage and Syncing ", - " Template Movie ", - " Equity Tasks ", - " Crypto Tasks ", - " VC Tasks " + " Storage and Syncing " ], "Deleted": [ + " You Must Remember This - 1989 sex lies and videotape Rob Lowe and James Spader (Erotic 80s Part 12) ", + " Romain Gary 2 ", + " You Must Remember This - 1989 sex lies and videotape Rob Lowe and James Spader (Erotic 80s Part 12) ", " You Must Remember This - 1989 sex lies and videotape Rob Lowe and James Spader (Erotic 80s Part 12) ", " ‘Screw This City’ There’s Never Been a Worse Time to Rent an Apartment in NYC ", " Renegades Born in the USA - Our Unlikely Friendship ", @@ -5817,12 +5855,32 @@ " delete ", " 2022-03-31 ", " Installer Node Exporte... Doc SysNetAdmin ", - " This Italian artist became the first female superstar of the Renaissance ", - " GitHub - inCallerprometheus_bot Telegram bot for prometheus alerting ", - " Prometheus Alertmanager send alerts via Telegram - DPBD90 - Medium ", - " How to Install and Configure Prometheus Alert Manager on Ubuntu 20.04 LTS " + " This Italian artist became the first female superstar of the Renaissance " ], "Linked": [ + " 2022-08-31 ", + " Jellyfin ", + " Server Cloud ", + " Server Cloud ", + " Nextcloud ", + " 2022-08-31 ", + " 2022-11-19 Fiancailles Marguerite & Arnold - Paris ", + " 2023-01-14 Mariage Marguerite & Arnold ", + " Was King Arthur a Real Person ", + " Opinion Maternal Instinct Is a Myth That Men Created ", + " 2022-08-31 ", + " 2022-08-30 ", + " Test sheet ", + " 2022-08-30 ", + " 2022-08-30 ", + " Derinkuyu Mysterious underground city in Turkey found in man’s basement ", + " The Deacon and the Dog City Journal ", + " Why Don’t Millennials Have Hobbies ", + " 2022-08-19 ", + " Bebek ", + " 2022-08-28 ", + " 2022-08-29 ", + " Squid Game (2021–) ", " Derinkuyu Mysterious underground city in Turkey found in man’s basement ", " Shakshuka ", " Shakshuka ", @@ -5850,30 +5908,7 @@ " 2022-02-28 ", " Mountain hikes in Switzerland ", " Skiing in Switzerland ", - " Geneva ", - " @@Travels ", - " @@Travels ", - " @Switzerland ", - " The century of climate migration why we need to plan for the great upheaval ", - " Gaming Wall Street ", - " The Mafia, The CIA and George Bush ", - " The Company-Building Cornerstones Every Founder Needs to Focus On — Advice from HubSpot ", - " The Importance of Leading With Empathy (And How To Do It) ", - " Sameer Huda - gunnercooke llp ", - " Lynceus Partners arrivée de Melchior de Villeneuve en tant que Responsable du Développement ", - " @Professional ", - " 2022-08-24 ", - " 2022-08-23 ", - " Luca2 ", - " En Bretagne, les responsables politiques redoutent l’émergence d’une « Breizh Riviera » ", - " Désert rural. La grande ruée vers les maisons italiennes à 1 euro ", - " Quand tu arrives ici, tu te dis que rien n’est cher les Parisiens s’entichent de Marseille ", - " 2022-08-23 ", - " 2023-02-11 Mariage Eloi ", - " 2022-09-13 Diner Lorena ", - " 2022-08-18 ", - " 2022-08-09 ", - " 2022-08-03 " + " Geneva " ], "Removed Tags from": [ " Le Miel de Paris ", @@ -5906,7 +5941,8 @@ " Storage and Syncing ", " Les 17 erreurs de management à ne pas commettre ", " Obsidian website publish - comments ", - " @@London " + " @@London ", + " Server Cloud " ] } }, diff --git a/.obsidian/plugins/obsidian-icon-shortcodes/data.json b/.obsidian/plugins/obsidian-icon-shortcodes/data.json deleted file mode 100644 index 3626fb1f..00000000 --- a/.obsidian/plugins/obsidian-icon-shortcodes/data.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "code2emoji": true, - "suggester": true, - "iconpack": { - "fab": true, - "far": true, - "fas": true, - "rif": true, - "ril": true - }, - "spaceAfterSC": false, - "isMigrated": false -} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-icon-shortcodes/main.js b/.obsidian/plugins/obsidian-icon-shortcodes/main.js deleted file mode 100644 index 54970b54..00000000 --- a/.obsidian/plugins/obsidian-icon-shortcodes/main.js +++ /dev/null @@ -1,168 +0,0 @@ -/* -THIS IS A GENERATED/BUNDLED FILE BY ESBUILD -if you want to view the source visit the plugins github repository -*/ - -var rp=Object.create;var zt=Object.defineProperty,op=Object.defineProperties,sp=Object.getOwnPropertyDescriptor,cp=Object.getOwnPropertyDescriptors,lp=Object.getOwnPropertyNames,sn=Object.getOwnPropertySymbols,pp=Object.getPrototypeOf,ea=Object.prototype.hasOwnProperty,Yi=Object.prototype.propertyIsEnumerable;var Ki=(e,t,n)=>t in e?zt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Me=(e,t)=>{for(var n in t||(t={}))ea.call(t,n)&&Ki(e,n,t[n]);if(sn)for(var n of sn(t))Yi.call(t,n)&&Ki(e,n,t[n]);return e},et=(e,t)=>op(e,cp(t));var cn=(e,t)=>{var n={};for(var a in e)ea.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(e!=null&&sn)for(var a of sn(e))t.indexOf(a)<0&&Yi.call(e,a)&&(n[a]=e[a]);return n};var K=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Xi=(e,t)=>{for(var n in t)zt(e,n,{get:t[n],enumerable:!0})},Ji=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of lp(t))!ea.call(e,i)&&i!==n&&zt(e,i,{get:()=>t[i],enumerable:!(a=sp(t,i))||a.enumerable});return e};var be=(e,t,n)=>(n=e!=null?rp(pp(e)):{},Ji(t||!e||!e.__esModule?zt(n,"default",{value:e,enumerable:!0}):n,e)),up=e=>Ji(zt({},"__esModule",{value:!0}),e);var $=(e,t,n)=>new Promise((a,i)=>{var r=p=>{try{s(n.next(p))}catch(l){i(l)}},o=p=>{try{s(n.throw(p))}catch(l){i(l)}},s=p=>p.done?a(p.value):Promise.resolve(p.value).then(r,o);s((n=n.apply(e,t)).next())});var or=K((h1,gp)=>{gp.exports={"application/1d-interleaved-parityfec":{source:"iana"},"application/3gpdash-qoe-report+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/3gpp-ims+xml":{source:"iana",compressible:!0},"application/3gpphal+json":{source:"iana",compressible:!0},"application/3gpphalforms+json":{source:"iana",compressible:!0},"application/a2l":{source:"iana"},"application/ace+cbor":{source:"iana"},"application/activemessage":{source:"iana"},"application/activity+json":{source:"iana",compressible:!0},"application/alto-costmap+json":{source:"iana",compressible:!0},"application/alto-costmapfilter+json":{source:"iana",compressible:!0},"application/alto-directory+json":{source:"iana",compressible:!0},"application/alto-endpointcost+json":{source:"iana",compressible:!0},"application/alto-endpointcostparams+json":{source:"iana",compressible:!0},"application/alto-endpointprop+json":{source:"iana",compressible:!0},"application/alto-endpointpropparams+json":{source:"iana",compressible:!0},"application/alto-error+json":{source:"iana",compressible:!0},"application/alto-networkmap+json":{source:"iana",compressible:!0},"application/alto-networkmapfilter+json":{source:"iana",compressible:!0},"application/alto-updatestreamcontrol+json":{source:"iana",compressible:!0},"application/alto-updatestreamparams+json":{source:"iana",compressible:!0},"application/aml":{source:"iana"},"application/andrew-inset":{source:"iana",extensions:["ez"]},"application/applefile":{source:"iana"},"application/applixware":{source:"apache",extensions:["aw"]},"application/at+jwt":{source:"iana"},"application/atf":{source:"iana"},"application/atfx":{source:"iana"},"application/atom+xml":{source:"iana",compressible:!0,extensions:["atom"]},"application/atomcat+xml":{source:"iana",compressible:!0,extensions:["atomcat"]},"application/atomdeleted+xml":{source:"iana",compressible:!0,extensions:["atomdeleted"]},"application/atomicmail":{source:"iana"},"application/atomsvc+xml":{source:"iana",compressible:!0,extensions:["atomsvc"]},"application/atsc-dwd+xml":{source:"iana",compressible:!0,extensions:["dwd"]},"application/atsc-dynamic-event-message":{source:"iana"},"application/atsc-held+xml":{source:"iana",compressible:!0,extensions:["held"]},"application/atsc-rdt+json":{source:"iana",compressible:!0},"application/atsc-rsat+xml":{source:"iana",compressible:!0,extensions:["rsat"]},"application/atxml":{source:"iana"},"application/auth-policy+xml":{source:"iana",compressible:!0},"application/bacnet-xdd+zip":{source:"iana",compressible:!1},"application/batch-smtp":{source:"iana"},"application/bdoc":{compressible:!1,extensions:["bdoc"]},"application/beep+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/calendar+json":{source:"iana",compressible:!0},"application/calendar+xml":{source:"iana",compressible:!0,extensions:["xcs"]},"application/call-completion":{source:"iana"},"application/cals-1840":{source:"iana"},"application/captive+json":{source:"iana",compressible:!0},"application/cbor":{source:"iana"},"application/cbor-seq":{source:"iana"},"application/cccex":{source:"iana"},"application/ccmp+xml":{source:"iana",compressible:!0},"application/ccxml+xml":{source:"iana",compressible:!0,extensions:["ccxml"]},"application/cdfx+xml":{source:"iana",compressible:!0,extensions:["cdfx"]},"application/cdmi-capability":{source:"iana",extensions:["cdmia"]},"application/cdmi-container":{source:"iana",extensions:["cdmic"]},"application/cdmi-domain":{source:"iana",extensions:["cdmid"]},"application/cdmi-object":{source:"iana",extensions:["cdmio"]},"application/cdmi-queue":{source:"iana",extensions:["cdmiq"]},"application/cdni":{source:"iana"},"application/cea":{source:"iana"},"application/cea-2018+xml":{source:"iana",compressible:!0},"application/cellml+xml":{source:"iana",compressible:!0},"application/cfw":{source:"iana"},"application/city+json":{source:"iana",compressible:!0},"application/clr":{source:"iana"},"application/clue+xml":{source:"iana",compressible:!0},"application/clue_info+xml":{source:"iana",compressible:!0},"application/cms":{source:"iana"},"application/cnrp+xml":{source:"iana",compressible:!0},"application/coap-group+json":{source:"iana",compressible:!0},"application/coap-payload":{source:"iana"},"application/commonground":{source:"iana"},"application/conference-info+xml":{source:"iana",compressible:!0},"application/cose":{source:"iana"},"application/cose-key":{source:"iana"},"application/cose-key-set":{source:"iana"},"application/cpl+xml":{source:"iana",compressible:!0,extensions:["cpl"]},"application/csrattrs":{source:"iana"},"application/csta+xml":{source:"iana",compressible:!0},"application/cstadata+xml":{source:"iana",compressible:!0},"application/csvm+json":{source:"iana",compressible:!0},"application/cu-seeme":{source:"apache",extensions:["cu"]},"application/cwt":{source:"iana"},"application/cybercash":{source:"iana"},"application/dart":{compressible:!0},"application/dash+xml":{source:"iana",compressible:!0,extensions:["mpd"]},"application/dash-patch+xml":{source:"iana",compressible:!0,extensions:["mpp"]},"application/dashdelta":{source:"iana"},"application/davmount+xml":{source:"iana",compressible:!0,extensions:["davmount"]},"application/dca-rft":{source:"iana"},"application/dcd":{source:"iana"},"application/dec-dx":{source:"iana"},"application/dialog-info+xml":{source:"iana",compressible:!0},"application/dicom":{source:"iana"},"application/dicom+json":{source:"iana",compressible:!0},"application/dicom+xml":{source:"iana",compressible:!0},"application/dii":{source:"iana"},"application/dit":{source:"iana"},"application/dns":{source:"iana"},"application/dns+json":{source:"iana",compressible:!0},"application/dns-message":{source:"iana"},"application/docbook+xml":{source:"apache",compressible:!0,extensions:["dbk"]},"application/dots+cbor":{source:"iana"},"application/dskpp+xml":{source:"iana",compressible:!0},"application/dssc+der":{source:"iana",extensions:["dssc"]},"application/dssc+xml":{source:"iana",compressible:!0,extensions:["xdssc"]},"application/dvcs":{source:"iana"},"application/ecmascript":{source:"iana",compressible:!0,extensions:["es","ecma"]},"application/edi-consent":{source:"iana"},"application/edi-x12":{source:"iana",compressible:!1},"application/edifact":{source:"iana",compressible:!1},"application/efi":{source:"iana"},"application/elm+json":{source:"iana",charset:"UTF-8",compressible:!0},"application/elm+xml":{source:"iana",compressible:!0},"application/emergencycalldata.cap+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/emergencycalldata.comment+xml":{source:"iana",compressible:!0},"application/emergencycalldata.control+xml":{source:"iana",compressible:!0},"application/emergencycalldata.deviceinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.ecall.msd":{source:"iana"},"application/emergencycalldata.providerinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.serviceinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.subscriberinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.veds+xml":{source:"iana",compressible:!0},"application/emma+xml":{source:"iana",compressible:!0,extensions:["emma"]},"application/emotionml+xml":{source:"iana",compressible:!0,extensions:["emotionml"]},"application/encaprtp":{source:"iana"},"application/epp+xml":{source:"iana",compressible:!0},"application/epub+zip":{source:"iana",compressible:!1,extensions:["epub"]},"application/eshop":{source:"iana"},"application/exi":{source:"iana",extensions:["exi"]},"application/expect-ct-report+json":{source:"iana",compressible:!0},"application/express":{source:"iana",extensions:["exp"]},"application/fastinfoset":{source:"iana"},"application/fastsoap":{source:"iana"},"application/fdt+xml":{source:"iana",compressible:!0,extensions:["fdt"]},"application/fhir+json":{source:"iana",charset:"UTF-8",compressible:!0},"application/fhir+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/fido.trusted-apps+json":{compressible:!0},"application/fits":{source:"iana"},"application/flexfec":{source:"iana"},"application/font-sfnt":{source:"iana"},"application/font-tdpfr":{source:"iana",extensions:["pfr"]},"application/font-woff":{source:"iana",compressible:!1},"application/framework-attributes+xml":{source:"iana",compressible:!0},"application/geo+json":{source:"iana",compressible:!0,extensions:["geojson"]},"application/geo+json-seq":{source:"iana"},"application/geopackage+sqlite3":{source:"iana"},"application/geoxacml+xml":{source:"iana",compressible:!0},"application/gltf-buffer":{source:"iana"},"application/gml+xml":{source:"iana",compressible:!0,extensions:["gml"]},"application/gpx+xml":{source:"apache",compressible:!0,extensions:["gpx"]},"application/gxf":{source:"apache",extensions:["gxf"]},"application/gzip":{source:"iana",compressible:!1,extensions:["gz"]},"application/h224":{source:"iana"},"application/held+xml":{source:"iana",compressible:!0},"application/hjson":{extensions:["hjson"]},"application/http":{source:"iana"},"application/hyperstudio":{source:"iana",extensions:["stk"]},"application/ibe-key-request+xml":{source:"iana",compressible:!0},"application/ibe-pkg-reply+xml":{source:"iana",compressible:!0},"application/ibe-pp-data":{source:"iana"},"application/iges":{source:"iana"},"application/im-iscomposing+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/index":{source:"iana"},"application/index.cmd":{source:"iana"},"application/index.obj":{source:"iana"},"application/index.response":{source:"iana"},"application/index.vnd":{source:"iana"},"application/inkml+xml":{source:"iana",compressible:!0,extensions:["ink","inkml"]},"application/iotp":{source:"iana"},"application/ipfix":{source:"iana",extensions:["ipfix"]},"application/ipp":{source:"iana"},"application/isup":{source:"iana"},"application/its+xml":{source:"iana",compressible:!0,extensions:["its"]},"application/java-archive":{source:"apache",compressible:!1,extensions:["jar","war","ear"]},"application/java-serialized-object":{source:"apache",compressible:!1,extensions:["ser"]},"application/java-vm":{source:"apache",compressible:!1,extensions:["class"]},"application/javascript":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["js","mjs"]},"application/jf2feed+json":{source:"iana",compressible:!0},"application/jose":{source:"iana"},"application/jose+json":{source:"iana",compressible:!0},"application/jrd+json":{source:"iana",compressible:!0},"application/jscalendar+json":{source:"iana",compressible:!0},"application/json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["json","map"]},"application/json-patch+json":{source:"iana",compressible:!0},"application/json-seq":{source:"iana"},"application/json5":{extensions:["json5"]},"application/jsonml+json":{source:"apache",compressible:!0,extensions:["jsonml"]},"application/jwk+json":{source:"iana",compressible:!0},"application/jwk-set+json":{source:"iana",compressible:!0},"application/jwt":{source:"iana"},"application/kpml-request+xml":{source:"iana",compressible:!0},"application/kpml-response+xml":{source:"iana",compressible:!0},"application/ld+json":{source:"iana",compressible:!0,extensions:["jsonld"]},"application/lgr+xml":{source:"iana",compressible:!0,extensions:["lgr"]},"application/link-format":{source:"iana"},"application/load-control+xml":{source:"iana",compressible:!0},"application/lost+xml":{source:"iana",compressible:!0,extensions:["lostxml"]},"application/lostsync+xml":{source:"iana",compressible:!0},"application/lpf+zip":{source:"iana",compressible:!1},"application/lxf":{source:"iana"},"application/mac-binhex40":{source:"iana",extensions:["hqx"]},"application/mac-compactpro":{source:"apache",extensions:["cpt"]},"application/macwriteii":{source:"iana"},"application/mads+xml":{source:"iana",compressible:!0,extensions:["mads"]},"application/manifest+json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["webmanifest"]},"application/marc":{source:"iana",extensions:["mrc"]},"application/marcxml+xml":{source:"iana",compressible:!0,extensions:["mrcx"]},"application/mathematica":{source:"iana",extensions:["ma","nb","mb"]},"application/mathml+xml":{source:"iana",compressible:!0,extensions:["mathml"]},"application/mathml-content+xml":{source:"iana",compressible:!0},"application/mathml-presentation+xml":{source:"iana",compressible:!0},"application/mbms-associated-procedure-description+xml":{source:"iana",compressible:!0},"application/mbms-deregister+xml":{source:"iana",compressible:!0},"application/mbms-envelope+xml":{source:"iana",compressible:!0},"application/mbms-msk+xml":{source:"iana",compressible:!0},"application/mbms-msk-response+xml":{source:"iana",compressible:!0},"application/mbms-protection-description+xml":{source:"iana",compressible:!0},"application/mbms-reception-report+xml":{source:"iana",compressible:!0},"application/mbms-register+xml":{source:"iana",compressible:!0},"application/mbms-register-response+xml":{source:"iana",compressible:!0},"application/mbms-schedule+xml":{source:"iana",compressible:!0},"application/mbms-user-service-description+xml":{source:"iana",compressible:!0},"application/mbox":{source:"iana",extensions:["mbox"]},"application/media-policy-dataset+xml":{source:"iana",compressible:!0,extensions:["mpf"]},"application/media_control+xml":{source:"iana",compressible:!0},"application/mediaservercontrol+xml":{source:"iana",compressible:!0,extensions:["mscml"]},"application/merge-patch+json":{source:"iana",compressible:!0},"application/metalink+xml":{source:"apache",compressible:!0,extensions:["metalink"]},"application/metalink4+xml":{source:"iana",compressible:!0,extensions:["meta4"]},"application/mets+xml":{source:"iana",compressible:!0,extensions:["mets"]},"application/mf4":{source:"iana"},"application/mikey":{source:"iana"},"application/mipc":{source:"iana"},"application/missing-blocks+cbor-seq":{source:"iana"},"application/mmt-aei+xml":{source:"iana",compressible:!0,extensions:["maei"]},"application/mmt-usd+xml":{source:"iana",compressible:!0,extensions:["musd"]},"application/mods+xml":{source:"iana",compressible:!0,extensions:["mods"]},"application/moss-keys":{source:"iana"},"application/moss-signature":{source:"iana"},"application/mosskey-data":{source:"iana"},"application/mosskey-request":{source:"iana"},"application/mp21":{source:"iana",extensions:["m21","mp21"]},"application/mp4":{source:"iana",extensions:["mp4s","m4p"]},"application/mpeg4-generic":{source:"iana"},"application/mpeg4-iod":{source:"iana"},"application/mpeg4-iod-xmt":{source:"iana"},"application/mrb-consumer+xml":{source:"iana",compressible:!0},"application/mrb-publish+xml":{source:"iana",compressible:!0},"application/msc-ivr+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/msc-mixer+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/msword":{source:"iana",compressible:!1,extensions:["doc","dot"]},"application/mud+json":{source:"iana",compressible:!0},"application/multipart-core":{source:"iana"},"application/mxf":{source:"iana",extensions:["mxf"]},"application/n-quads":{source:"iana",extensions:["nq"]},"application/n-triples":{source:"iana",extensions:["nt"]},"application/nasdata":{source:"iana"},"application/news-checkgroups":{source:"iana",charset:"US-ASCII"},"application/news-groupinfo":{source:"iana",charset:"US-ASCII"},"application/news-transmission":{source:"iana"},"application/nlsml+xml":{source:"iana",compressible:!0},"application/node":{source:"iana",extensions:["cjs"]},"application/nss":{source:"iana"},"application/oauth-authz-req+jwt":{source:"iana"},"application/oblivious-dns-message":{source:"iana"},"application/ocsp-request":{source:"iana"},"application/ocsp-response":{source:"iana"},"application/octet-stream":{source:"iana",compressible:!1,extensions:["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]},"application/oda":{source:"iana",extensions:["oda"]},"application/odm+xml":{source:"iana",compressible:!0},"application/odx":{source:"iana"},"application/oebps-package+xml":{source:"iana",compressible:!0,extensions:["opf"]},"application/ogg":{source:"iana",compressible:!1,extensions:["ogx"]},"application/omdoc+xml":{source:"apache",compressible:!0,extensions:["omdoc"]},"application/onenote":{source:"apache",extensions:["onetoc","onetoc2","onetmp","onepkg"]},"application/opc-nodeset+xml":{source:"iana",compressible:!0},"application/oscore":{source:"iana"},"application/oxps":{source:"iana",extensions:["oxps"]},"application/p21":{source:"iana"},"application/p21+zip":{source:"iana",compressible:!1},"application/p2p-overlay+xml":{source:"iana",compressible:!0,extensions:["relo"]},"application/parityfec":{source:"iana"},"application/passport":{source:"iana"},"application/patch-ops-error+xml":{source:"iana",compressible:!0,extensions:["xer"]},"application/pdf":{source:"iana",compressible:!1,extensions:["pdf"]},"application/pdx":{source:"iana"},"application/pem-certificate-chain":{source:"iana"},"application/pgp-encrypted":{source:"iana",compressible:!1,extensions:["pgp"]},"application/pgp-keys":{source:"iana",extensions:["asc"]},"application/pgp-signature":{source:"iana",extensions:["asc","sig"]},"application/pics-rules":{source:"apache",extensions:["prf"]},"application/pidf+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/pidf-diff+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/pkcs10":{source:"iana",extensions:["p10"]},"application/pkcs12":{source:"iana"},"application/pkcs7-mime":{source:"iana",extensions:["p7m","p7c"]},"application/pkcs7-signature":{source:"iana",extensions:["p7s"]},"application/pkcs8":{source:"iana",extensions:["p8"]},"application/pkcs8-encrypted":{source:"iana"},"application/pkix-attr-cert":{source:"iana",extensions:["ac"]},"application/pkix-cert":{source:"iana",extensions:["cer"]},"application/pkix-crl":{source:"iana",extensions:["crl"]},"application/pkix-pkipath":{source:"iana",extensions:["pkipath"]},"application/pkixcmp":{source:"iana",extensions:["pki"]},"application/pls+xml":{source:"iana",compressible:!0,extensions:["pls"]},"application/poc-settings+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/postscript":{source:"iana",compressible:!0,extensions:["ai","eps","ps"]},"application/ppsp-tracker+json":{source:"iana",compressible:!0},"application/problem+json":{source:"iana",compressible:!0},"application/problem+xml":{source:"iana",compressible:!0},"application/provenance+xml":{source:"iana",compressible:!0,extensions:["provx"]},"application/prs.alvestrand.titrax-sheet":{source:"iana"},"application/prs.cww":{source:"iana",extensions:["cww"]},"application/prs.cyn":{source:"iana",charset:"7-BIT"},"application/prs.hpub+zip":{source:"iana",compressible:!1},"application/prs.nprend":{source:"iana"},"application/prs.plucker":{source:"iana"},"application/prs.rdf-xml-crypt":{source:"iana"},"application/prs.xsf+xml":{source:"iana",compressible:!0},"application/pskc+xml":{source:"iana",compressible:!0,extensions:["pskcxml"]},"application/pvd+json":{source:"iana",compressible:!0},"application/qsig":{source:"iana"},"application/raml+yaml":{compressible:!0,extensions:["raml"]},"application/raptorfec":{source:"iana"},"application/rdap+json":{source:"iana",compressible:!0},"application/rdf+xml":{source:"iana",compressible:!0,extensions:["rdf","owl"]},"application/reginfo+xml":{source:"iana",compressible:!0,extensions:["rif"]},"application/relax-ng-compact-syntax":{source:"iana",extensions:["rnc"]},"application/remote-printing":{source:"iana"},"application/reputon+json":{source:"iana",compressible:!0},"application/resource-lists+xml":{source:"iana",compressible:!0,extensions:["rl"]},"application/resource-lists-diff+xml":{source:"iana",compressible:!0,extensions:["rld"]},"application/rfc+xml":{source:"iana",compressible:!0},"application/riscos":{source:"iana"},"application/rlmi+xml":{source:"iana",compressible:!0},"application/rls-services+xml":{source:"iana",compressible:!0,extensions:["rs"]},"application/route-apd+xml":{source:"iana",compressible:!0,extensions:["rapd"]},"application/route-s-tsid+xml":{source:"iana",compressible:!0,extensions:["sls"]},"application/route-usd+xml":{source:"iana",compressible:!0,extensions:["rusd"]},"application/rpki-ghostbusters":{source:"iana",extensions:["gbr"]},"application/rpki-manifest":{source:"iana",extensions:["mft"]},"application/rpki-publication":{source:"iana"},"application/rpki-roa":{source:"iana",extensions:["roa"]},"application/rpki-updown":{source:"iana"},"application/rsd+xml":{source:"apache",compressible:!0,extensions:["rsd"]},"application/rss+xml":{source:"apache",compressible:!0,extensions:["rss"]},"application/rtf":{source:"iana",compressible:!0,extensions:["rtf"]},"application/rtploopback":{source:"iana"},"application/rtx":{source:"iana"},"application/samlassertion+xml":{source:"iana",compressible:!0},"application/samlmetadata+xml":{source:"iana",compressible:!0},"application/sarif+json":{source:"iana",compressible:!0},"application/sarif-external-properties+json":{source:"iana",compressible:!0},"application/sbe":{source:"iana"},"application/sbml+xml":{source:"iana",compressible:!0,extensions:["sbml"]},"application/scaip+xml":{source:"iana",compressible:!0},"application/scim+json":{source:"iana",compressible:!0},"application/scvp-cv-request":{source:"iana",extensions:["scq"]},"application/scvp-cv-response":{source:"iana",extensions:["scs"]},"application/scvp-vp-request":{source:"iana",extensions:["spq"]},"application/scvp-vp-response":{source:"iana",extensions:["spp"]},"application/sdp":{source:"iana",extensions:["sdp"]},"application/secevent+jwt":{source:"iana"},"application/senml+cbor":{source:"iana"},"application/senml+json":{source:"iana",compressible:!0},"application/senml+xml":{source:"iana",compressible:!0,extensions:["senmlx"]},"application/senml-etch+cbor":{source:"iana"},"application/senml-etch+json":{source:"iana",compressible:!0},"application/senml-exi":{source:"iana"},"application/sensml+cbor":{source:"iana"},"application/sensml+json":{source:"iana",compressible:!0},"application/sensml+xml":{source:"iana",compressible:!0,extensions:["sensmlx"]},"application/sensml-exi":{source:"iana"},"application/sep+xml":{source:"iana",compressible:!0},"application/sep-exi":{source:"iana"},"application/session-info":{source:"iana"},"application/set-payment":{source:"iana"},"application/set-payment-initiation":{source:"iana",extensions:["setpay"]},"application/set-registration":{source:"iana"},"application/set-registration-initiation":{source:"iana",extensions:["setreg"]},"application/sgml":{source:"iana"},"application/sgml-open-catalog":{source:"iana"},"application/shf+xml":{source:"iana",compressible:!0,extensions:["shf"]},"application/sieve":{source:"iana",extensions:["siv","sieve"]},"application/simple-filter+xml":{source:"iana",compressible:!0},"application/simple-message-summary":{source:"iana"},"application/simplesymbolcontainer":{source:"iana"},"application/sipc":{source:"iana"},"application/slate":{source:"iana"},"application/smil":{source:"iana"},"application/smil+xml":{source:"iana",compressible:!0,extensions:["smi","smil"]},"application/smpte336m":{source:"iana"},"application/soap+fastinfoset":{source:"iana"},"application/soap+xml":{source:"iana",compressible:!0},"application/sparql-query":{source:"iana",extensions:["rq"]},"application/sparql-results+xml":{source:"iana",compressible:!0,extensions:["srx"]},"application/spdx+json":{source:"iana",compressible:!0},"application/spirits-event+xml":{source:"iana",compressible:!0},"application/sql":{source:"iana"},"application/srgs":{source:"iana",extensions:["gram"]},"application/srgs+xml":{source:"iana",compressible:!0,extensions:["grxml"]},"application/sru+xml":{source:"iana",compressible:!0,extensions:["sru"]},"application/ssdl+xml":{source:"apache",compressible:!0,extensions:["ssdl"]},"application/ssml+xml":{source:"iana",compressible:!0,extensions:["ssml"]},"application/stix+json":{source:"iana",compressible:!0},"application/swid+xml":{source:"iana",compressible:!0,extensions:["swidtag"]},"application/tamp-apex-update":{source:"iana"},"application/tamp-apex-update-confirm":{source:"iana"},"application/tamp-community-update":{source:"iana"},"application/tamp-community-update-confirm":{source:"iana"},"application/tamp-error":{source:"iana"},"application/tamp-sequence-adjust":{source:"iana"},"application/tamp-sequence-adjust-confirm":{source:"iana"},"application/tamp-status-query":{source:"iana"},"application/tamp-status-response":{source:"iana"},"application/tamp-update":{source:"iana"},"application/tamp-update-confirm":{source:"iana"},"application/tar":{compressible:!0},"application/taxii+json":{source:"iana",compressible:!0},"application/td+json":{source:"iana",compressible:!0},"application/tei+xml":{source:"iana",compressible:!0,extensions:["tei","teicorpus"]},"application/tetra_isi":{source:"iana"},"application/thraud+xml":{source:"iana",compressible:!0,extensions:["tfi"]},"application/timestamp-query":{source:"iana"},"application/timestamp-reply":{source:"iana"},"application/timestamped-data":{source:"iana",extensions:["tsd"]},"application/tlsrpt+gzip":{source:"iana"},"application/tlsrpt+json":{source:"iana",compressible:!0},"application/tnauthlist":{source:"iana"},"application/token-introspection+jwt":{source:"iana"},"application/toml":{compressible:!0,extensions:["toml"]},"application/trickle-ice-sdpfrag":{source:"iana"},"application/trig":{source:"iana",extensions:["trig"]},"application/ttml+xml":{source:"iana",compressible:!0,extensions:["ttml"]},"application/tve-trigger":{source:"iana"},"application/tzif":{source:"iana"},"application/tzif-leap":{source:"iana"},"application/ubjson":{compressible:!1,extensions:["ubj"]},"application/ulpfec":{source:"iana"},"application/urc-grpsheet+xml":{source:"iana",compressible:!0},"application/urc-ressheet+xml":{source:"iana",compressible:!0,extensions:["rsheet"]},"application/urc-targetdesc+xml":{source:"iana",compressible:!0,extensions:["td"]},"application/urc-uisocketdesc+xml":{source:"iana",compressible:!0},"application/vcard+json":{source:"iana",compressible:!0},"application/vcard+xml":{source:"iana",compressible:!0},"application/vemmi":{source:"iana"},"application/vividence.scriptfile":{source:"apache"},"application/vnd.1000minds.decision-model+xml":{source:"iana",compressible:!0,extensions:["1km"]},"application/vnd.3gpp-prose+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-prose-pc3ch+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-v2x-local-service-information":{source:"iana"},"application/vnd.3gpp.5gnas":{source:"iana"},"application/vnd.3gpp.access-transfer-events+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.bsf+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.gmop+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.gtpc":{source:"iana"},"application/vnd.3gpp.interworking-data":{source:"iana"},"application/vnd.3gpp.lpp":{source:"iana"},"application/vnd.3gpp.mc-signalling-ear":{source:"iana"},"application/vnd.3gpp.mcdata-affiliation-command+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-payload":{source:"iana"},"application/vnd.3gpp.mcdata-service-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-signalling":{source:"iana"},"application/vnd.3gpp.mcdata-ue-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-user-profile+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-affiliation-command+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-floor-request+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-location-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-mbms-usage-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-service-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-signed+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-ue-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-ue-init-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-user-profile+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-affiliation-command+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-affiliation-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-location-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-mbms-usage-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-service-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-transmission-request+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-ue-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-user-profile+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mid-call+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.ngap":{source:"iana"},"application/vnd.3gpp.pfcp":{source:"iana"},"application/vnd.3gpp.pic-bw-large":{source:"iana",extensions:["plb"]},"application/vnd.3gpp.pic-bw-small":{source:"iana",extensions:["psb"]},"application/vnd.3gpp.pic-bw-var":{source:"iana",extensions:["pvb"]},"application/vnd.3gpp.s1ap":{source:"iana"},"application/vnd.3gpp.sms":{source:"iana"},"application/vnd.3gpp.sms+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.srvcc-ext+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.srvcc-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.state-and-event-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.ussd+xml":{source:"iana",compressible:!0},"application/vnd.3gpp2.bcmcsinfo+xml":{source:"iana",compressible:!0},"application/vnd.3gpp2.sms":{source:"iana"},"application/vnd.3gpp2.tcap":{source:"iana",extensions:["tcap"]},"application/vnd.3lightssoftware.imagescal":{source:"iana"},"application/vnd.3m.post-it-notes":{source:"iana",extensions:["pwn"]},"application/vnd.accpac.simply.aso":{source:"iana",extensions:["aso"]},"application/vnd.accpac.simply.imp":{source:"iana",extensions:["imp"]},"application/vnd.acucobol":{source:"iana",extensions:["acu"]},"application/vnd.acucorp":{source:"iana",extensions:["atc","acutc"]},"application/vnd.adobe.air-application-installer-package+zip":{source:"apache",compressible:!1,extensions:["air"]},"application/vnd.adobe.flash.movie":{source:"iana"},"application/vnd.adobe.formscentral.fcdt":{source:"iana",extensions:["fcdt"]},"application/vnd.adobe.fxp":{source:"iana",extensions:["fxp","fxpl"]},"application/vnd.adobe.partial-upload":{source:"iana"},"application/vnd.adobe.xdp+xml":{source:"iana",compressible:!0,extensions:["xdp"]},"application/vnd.adobe.xfdf":{source:"iana",extensions:["xfdf"]},"application/vnd.aether.imp":{source:"iana"},"application/vnd.afpc.afplinedata":{source:"iana"},"application/vnd.afpc.afplinedata-pagedef":{source:"iana"},"application/vnd.afpc.cmoca-cmresource":{source:"iana"},"application/vnd.afpc.foca-charset":{source:"iana"},"application/vnd.afpc.foca-codedfont":{source:"iana"},"application/vnd.afpc.foca-codepage":{source:"iana"},"application/vnd.afpc.modca":{source:"iana"},"application/vnd.afpc.modca-cmtable":{source:"iana"},"application/vnd.afpc.modca-formdef":{source:"iana"},"application/vnd.afpc.modca-mediummap":{source:"iana"},"application/vnd.afpc.modca-objectcontainer":{source:"iana"},"application/vnd.afpc.modca-overlay":{source:"iana"},"application/vnd.afpc.modca-pagesegment":{source:"iana"},"application/vnd.age":{source:"iana",extensions:["age"]},"application/vnd.ah-barcode":{source:"iana"},"application/vnd.ahead.space":{source:"iana",extensions:["ahead"]},"application/vnd.airzip.filesecure.azf":{source:"iana",extensions:["azf"]},"application/vnd.airzip.filesecure.azs":{source:"iana",extensions:["azs"]},"application/vnd.amadeus+json":{source:"iana",compressible:!0},"application/vnd.amazon.ebook":{source:"apache",extensions:["azw"]},"application/vnd.amazon.mobi8-ebook":{source:"iana"},"application/vnd.americandynamics.acc":{source:"iana",extensions:["acc"]},"application/vnd.amiga.ami":{source:"iana",extensions:["ami"]},"application/vnd.amundsen.maze+xml":{source:"iana",compressible:!0},"application/vnd.android.ota":{source:"iana"},"application/vnd.android.package-archive":{source:"apache",compressible:!1,extensions:["apk"]},"application/vnd.anki":{source:"iana"},"application/vnd.anser-web-certificate-issue-initiation":{source:"iana",extensions:["cii"]},"application/vnd.anser-web-funds-transfer-initiation":{source:"apache",extensions:["fti"]},"application/vnd.antix.game-component":{source:"iana",extensions:["atx"]},"application/vnd.apache.arrow.file":{source:"iana"},"application/vnd.apache.arrow.stream":{source:"iana"},"application/vnd.apache.thrift.binary":{source:"iana"},"application/vnd.apache.thrift.compact":{source:"iana"},"application/vnd.apache.thrift.json":{source:"iana"},"application/vnd.api+json":{source:"iana",compressible:!0},"application/vnd.aplextor.warrp+json":{source:"iana",compressible:!0},"application/vnd.apothekende.reservation+json":{source:"iana",compressible:!0},"application/vnd.apple.installer+xml":{source:"iana",compressible:!0,extensions:["mpkg"]},"application/vnd.apple.keynote":{source:"iana",extensions:["key"]},"application/vnd.apple.mpegurl":{source:"iana",extensions:["m3u8"]},"application/vnd.apple.numbers":{source:"iana",extensions:["numbers"]},"application/vnd.apple.pages":{source:"iana",extensions:["pages"]},"application/vnd.apple.pkpass":{compressible:!1,extensions:["pkpass"]},"application/vnd.arastra.swi":{source:"iana"},"application/vnd.aristanetworks.swi":{source:"iana",extensions:["swi"]},"application/vnd.artisan+json":{source:"iana",compressible:!0},"application/vnd.artsquare":{source:"iana"},"application/vnd.astraea-software.iota":{source:"iana",extensions:["iota"]},"application/vnd.audiograph":{source:"iana",extensions:["aep"]},"application/vnd.autopackage":{source:"iana"},"application/vnd.avalon+json":{source:"iana",compressible:!0},"application/vnd.avistar+xml":{source:"iana",compressible:!0},"application/vnd.balsamiq.bmml+xml":{source:"iana",compressible:!0,extensions:["bmml"]},"application/vnd.balsamiq.bmpr":{source:"iana"},"application/vnd.banana-accounting":{source:"iana"},"application/vnd.bbf.usp.error":{source:"iana"},"application/vnd.bbf.usp.msg":{source:"iana"},"application/vnd.bbf.usp.msg+json":{source:"iana",compressible:!0},"application/vnd.bekitzur-stech+json":{source:"iana",compressible:!0},"application/vnd.bint.med-content":{source:"iana"},"application/vnd.biopax.rdf+xml":{source:"iana",compressible:!0},"application/vnd.blink-idb-value-wrapper":{source:"iana"},"application/vnd.blueice.multipass":{source:"iana",extensions:["mpm"]},"application/vnd.bluetooth.ep.oob":{source:"iana"},"application/vnd.bluetooth.le.oob":{source:"iana"},"application/vnd.bmi":{source:"iana",extensions:["bmi"]},"application/vnd.bpf":{source:"iana"},"application/vnd.bpf3":{source:"iana"},"application/vnd.businessobjects":{source:"iana",extensions:["rep"]},"application/vnd.byu.uapi+json":{source:"iana",compressible:!0},"application/vnd.cab-jscript":{source:"iana"},"application/vnd.canon-cpdl":{source:"iana"},"application/vnd.canon-lips":{source:"iana"},"application/vnd.capasystems-pg+json":{source:"iana",compressible:!0},"application/vnd.cendio.thinlinc.clientconf":{source:"iana"},"application/vnd.century-systems.tcp_stream":{source:"iana"},"application/vnd.chemdraw+xml":{source:"iana",compressible:!0,extensions:["cdxml"]},"application/vnd.chess-pgn":{source:"iana"},"application/vnd.chipnuts.karaoke-mmd":{source:"iana",extensions:["mmd"]},"application/vnd.ciedi":{source:"iana"},"application/vnd.cinderella":{source:"iana",extensions:["cdy"]},"application/vnd.cirpack.isdn-ext":{source:"iana"},"application/vnd.citationstyles.style+xml":{source:"iana",compressible:!0,extensions:["csl"]},"application/vnd.claymore":{source:"iana",extensions:["cla"]},"application/vnd.cloanto.rp9":{source:"iana",extensions:["rp9"]},"application/vnd.clonk.c4group":{source:"iana",extensions:["c4g","c4d","c4f","c4p","c4u"]},"application/vnd.cluetrust.cartomobile-config":{source:"iana",extensions:["c11amc"]},"application/vnd.cluetrust.cartomobile-config-pkg":{source:"iana",extensions:["c11amz"]},"application/vnd.coffeescript":{source:"iana"},"application/vnd.collabio.xodocuments.document":{source:"iana"},"application/vnd.collabio.xodocuments.document-template":{source:"iana"},"application/vnd.collabio.xodocuments.presentation":{source:"iana"},"application/vnd.collabio.xodocuments.presentation-template":{source:"iana"},"application/vnd.collabio.xodocuments.spreadsheet":{source:"iana"},"application/vnd.collabio.xodocuments.spreadsheet-template":{source:"iana"},"application/vnd.collection+json":{source:"iana",compressible:!0},"application/vnd.collection.doc+json":{source:"iana",compressible:!0},"application/vnd.collection.next+json":{source:"iana",compressible:!0},"application/vnd.comicbook+zip":{source:"iana",compressible:!1},"application/vnd.comicbook-rar":{source:"iana"},"application/vnd.commerce-battelle":{source:"iana"},"application/vnd.commonspace":{source:"iana",extensions:["csp"]},"application/vnd.contact.cmsg":{source:"iana",extensions:["cdbcmsg"]},"application/vnd.coreos.ignition+json":{source:"iana",compressible:!0},"application/vnd.cosmocaller":{source:"iana",extensions:["cmc"]},"application/vnd.crick.clicker":{source:"iana",extensions:["clkx"]},"application/vnd.crick.clicker.keyboard":{source:"iana",extensions:["clkk"]},"application/vnd.crick.clicker.palette":{source:"iana",extensions:["clkp"]},"application/vnd.crick.clicker.template":{source:"iana",extensions:["clkt"]},"application/vnd.crick.clicker.wordbank":{source:"iana",extensions:["clkw"]},"application/vnd.criticaltools.wbs+xml":{source:"iana",compressible:!0,extensions:["wbs"]},"application/vnd.cryptii.pipe+json":{source:"iana",compressible:!0},"application/vnd.crypto-shade-file":{source:"iana"},"application/vnd.cryptomator.encrypted":{source:"iana"},"application/vnd.cryptomator.vault":{source:"iana"},"application/vnd.ctc-posml":{source:"iana",extensions:["pml"]},"application/vnd.ctct.ws+xml":{source:"iana",compressible:!0},"application/vnd.cups-pdf":{source:"iana"},"application/vnd.cups-postscript":{source:"iana"},"application/vnd.cups-ppd":{source:"iana",extensions:["ppd"]},"application/vnd.cups-raster":{source:"iana"},"application/vnd.cups-raw":{source:"iana"},"application/vnd.curl":{source:"iana"},"application/vnd.curl.car":{source:"apache",extensions:["car"]},"application/vnd.curl.pcurl":{source:"apache",extensions:["pcurl"]},"application/vnd.cyan.dean.root+xml":{source:"iana",compressible:!0},"application/vnd.cybank":{source:"iana"},"application/vnd.cyclonedx+json":{source:"iana",compressible:!0},"application/vnd.cyclonedx+xml":{source:"iana",compressible:!0},"application/vnd.d2l.coursepackage1p0+zip":{source:"iana",compressible:!1},"application/vnd.d3m-dataset":{source:"iana"},"application/vnd.d3m-problem":{source:"iana"},"application/vnd.dart":{source:"iana",compressible:!0,extensions:["dart"]},"application/vnd.data-vision.rdz":{source:"iana",extensions:["rdz"]},"application/vnd.datapackage+json":{source:"iana",compressible:!0},"application/vnd.dataresource+json":{source:"iana",compressible:!0},"application/vnd.dbf":{source:"iana",extensions:["dbf"]},"application/vnd.debian.binary-package":{source:"iana"},"application/vnd.dece.data":{source:"iana",extensions:["uvf","uvvf","uvd","uvvd"]},"application/vnd.dece.ttml+xml":{source:"iana",compressible:!0,extensions:["uvt","uvvt"]},"application/vnd.dece.unspecified":{source:"iana",extensions:["uvx","uvvx"]},"application/vnd.dece.zip":{source:"iana",extensions:["uvz","uvvz"]},"application/vnd.denovo.fcselayout-link":{source:"iana",extensions:["fe_launch"]},"application/vnd.desmume.movie":{source:"iana"},"application/vnd.dir-bi.plate-dl-nosuffix":{source:"iana"},"application/vnd.dm.delegation+xml":{source:"iana",compressible:!0},"application/vnd.dna":{source:"iana",extensions:["dna"]},"application/vnd.document+json":{source:"iana",compressible:!0},"application/vnd.dolby.mlp":{source:"apache",extensions:["mlp"]},"application/vnd.dolby.mobile.1":{source:"iana"},"application/vnd.dolby.mobile.2":{source:"iana"},"application/vnd.doremir.scorecloud-binary-document":{source:"iana"},"application/vnd.dpgraph":{source:"iana",extensions:["dpg"]},"application/vnd.dreamfactory":{source:"iana",extensions:["dfac"]},"application/vnd.drive+json":{source:"iana",compressible:!0},"application/vnd.ds-keypoint":{source:"apache",extensions:["kpxx"]},"application/vnd.dtg.local":{source:"iana"},"application/vnd.dtg.local.flash":{source:"iana"},"application/vnd.dtg.local.html":{source:"iana"},"application/vnd.dvb.ait":{source:"iana",extensions:["ait"]},"application/vnd.dvb.dvbisl+xml":{source:"iana",compressible:!0},"application/vnd.dvb.dvbj":{source:"iana"},"application/vnd.dvb.esgcontainer":{source:"iana"},"application/vnd.dvb.ipdcdftnotifaccess":{source:"iana"},"application/vnd.dvb.ipdcesgaccess":{source:"iana"},"application/vnd.dvb.ipdcesgaccess2":{source:"iana"},"application/vnd.dvb.ipdcesgpdd":{source:"iana"},"application/vnd.dvb.ipdcroaming":{source:"iana"},"application/vnd.dvb.iptv.alfec-base":{source:"iana"},"application/vnd.dvb.iptv.alfec-enhancement":{source:"iana"},"application/vnd.dvb.notif-aggregate-root+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-container+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-generic+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-ia-msglist+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-ia-registration-request+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-ia-registration-response+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-init+xml":{source:"iana",compressible:!0},"application/vnd.dvb.pfr":{source:"iana"},"application/vnd.dvb.service":{source:"iana",extensions:["svc"]},"application/vnd.dxr":{source:"iana"},"application/vnd.dynageo":{source:"iana",extensions:["geo"]},"application/vnd.dzr":{source:"iana"},"application/vnd.easykaraoke.cdgdownload":{source:"iana"},"application/vnd.ecdis-update":{source:"iana"},"application/vnd.ecip.rlp":{source:"iana"},"application/vnd.eclipse.ditto+json":{source:"iana",compressible:!0},"application/vnd.ecowin.chart":{source:"iana",extensions:["mag"]},"application/vnd.ecowin.filerequest":{source:"iana"},"application/vnd.ecowin.fileupdate":{source:"iana"},"application/vnd.ecowin.series":{source:"iana"},"application/vnd.ecowin.seriesrequest":{source:"iana"},"application/vnd.ecowin.seriesupdate":{source:"iana"},"application/vnd.efi.img":{source:"iana"},"application/vnd.efi.iso":{source:"iana"},"application/vnd.emclient.accessrequest+xml":{source:"iana",compressible:!0},"application/vnd.enliven":{source:"iana",extensions:["nml"]},"application/vnd.enphase.envoy":{source:"iana"},"application/vnd.eprints.data+xml":{source:"iana",compressible:!0},"application/vnd.epson.esf":{source:"iana",extensions:["esf"]},"application/vnd.epson.msf":{source:"iana",extensions:["msf"]},"application/vnd.epson.quickanime":{source:"iana",extensions:["qam"]},"application/vnd.epson.salt":{source:"iana",extensions:["slt"]},"application/vnd.epson.ssf":{source:"iana",extensions:["ssf"]},"application/vnd.ericsson.quickcall":{source:"iana"},"application/vnd.espass-espass+zip":{source:"iana",compressible:!1},"application/vnd.eszigno3+xml":{source:"iana",compressible:!0,extensions:["es3","et3"]},"application/vnd.etsi.aoc+xml":{source:"iana",compressible:!0},"application/vnd.etsi.asic-e+zip":{source:"iana",compressible:!1},"application/vnd.etsi.asic-s+zip":{source:"iana",compressible:!1},"application/vnd.etsi.cug+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvcommand+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvdiscovery+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvprofile+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsad-bc+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsad-cod+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsad-npvr+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvservice+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsync+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvueprofile+xml":{source:"iana",compressible:!0},"application/vnd.etsi.mcid+xml":{source:"iana",compressible:!0},"application/vnd.etsi.mheg5":{source:"iana"},"application/vnd.etsi.overload-control-policy-dataset+xml":{source:"iana",compressible:!0},"application/vnd.etsi.pstn+xml":{source:"iana",compressible:!0},"application/vnd.etsi.sci+xml":{source:"iana",compressible:!0},"application/vnd.etsi.simservs+xml":{source:"iana",compressible:!0},"application/vnd.etsi.timestamp-token":{source:"iana"},"application/vnd.etsi.tsl+xml":{source:"iana",compressible:!0},"application/vnd.etsi.tsl.der":{source:"iana"},"application/vnd.eu.kasparian.car+json":{source:"iana",compressible:!0},"application/vnd.eudora.data":{source:"iana"},"application/vnd.evolv.ecig.profile":{source:"iana"},"application/vnd.evolv.ecig.settings":{source:"iana"},"application/vnd.evolv.ecig.theme":{source:"iana"},"application/vnd.exstream-empower+zip":{source:"iana",compressible:!1},"application/vnd.exstream-package":{source:"iana"},"application/vnd.ezpix-album":{source:"iana",extensions:["ez2"]},"application/vnd.ezpix-package":{source:"iana",extensions:["ez3"]},"application/vnd.f-secure.mobile":{source:"iana"},"application/vnd.familysearch.gedcom+zip":{source:"iana",compressible:!1},"application/vnd.fastcopy-disk-image":{source:"iana"},"application/vnd.fdf":{source:"iana",extensions:["fdf"]},"application/vnd.fdsn.mseed":{source:"iana",extensions:["mseed"]},"application/vnd.fdsn.seed":{source:"iana",extensions:["seed","dataless"]},"application/vnd.ffsns":{source:"iana"},"application/vnd.ficlab.flb+zip":{source:"iana",compressible:!1},"application/vnd.filmit.zfc":{source:"iana"},"application/vnd.fints":{source:"iana"},"application/vnd.firemonkeys.cloudcell":{source:"iana"},"application/vnd.flographit":{source:"iana",extensions:["gph"]},"application/vnd.fluxtime.clip":{source:"iana",extensions:["ftc"]},"application/vnd.font-fontforge-sfd":{source:"iana"},"application/vnd.framemaker":{source:"iana",extensions:["fm","frame","maker","book"]},"application/vnd.frogans.fnc":{source:"iana",extensions:["fnc"]},"application/vnd.frogans.ltf":{source:"iana",extensions:["ltf"]},"application/vnd.fsc.weblaunch":{source:"iana",extensions:["fsc"]},"application/vnd.fujifilm.fb.docuworks":{source:"iana"},"application/vnd.fujifilm.fb.docuworks.binder":{source:"iana"},"application/vnd.fujifilm.fb.docuworks.container":{source:"iana"},"application/vnd.fujifilm.fb.jfi+xml":{source:"iana",compressible:!0},"application/vnd.fujitsu.oasys":{source:"iana",extensions:["oas"]},"application/vnd.fujitsu.oasys2":{source:"iana",extensions:["oa2"]},"application/vnd.fujitsu.oasys3":{source:"iana",extensions:["oa3"]},"application/vnd.fujitsu.oasysgp":{source:"iana",extensions:["fg5"]},"application/vnd.fujitsu.oasysprs":{source:"iana",extensions:["bh2"]},"application/vnd.fujixerox.art-ex":{source:"iana"},"application/vnd.fujixerox.art4":{source:"iana"},"application/vnd.fujixerox.ddd":{source:"iana",extensions:["ddd"]},"application/vnd.fujixerox.docuworks":{source:"iana",extensions:["xdw"]},"application/vnd.fujixerox.docuworks.binder":{source:"iana",extensions:["xbd"]},"application/vnd.fujixerox.docuworks.container":{source:"iana"},"application/vnd.fujixerox.hbpl":{source:"iana"},"application/vnd.fut-misnet":{source:"iana"},"application/vnd.futoin+cbor":{source:"iana"},"application/vnd.futoin+json":{source:"iana",compressible:!0},"application/vnd.fuzzysheet":{source:"iana",extensions:["fzs"]},"application/vnd.genomatix.tuxedo":{source:"iana",extensions:["txd"]},"application/vnd.gentics.grd+json":{source:"iana",compressible:!0},"application/vnd.geo+json":{source:"iana",compressible:!0},"application/vnd.geocube+xml":{source:"iana",compressible:!0},"application/vnd.geogebra.file":{source:"iana",extensions:["ggb"]},"application/vnd.geogebra.slides":{source:"iana"},"application/vnd.geogebra.tool":{source:"iana",extensions:["ggt"]},"application/vnd.geometry-explorer":{source:"iana",extensions:["gex","gre"]},"application/vnd.geonext":{source:"iana",extensions:["gxt"]},"application/vnd.geoplan":{source:"iana",extensions:["g2w"]},"application/vnd.geospace":{source:"iana",extensions:["g3w"]},"application/vnd.gerber":{source:"iana"},"application/vnd.globalplatform.card-content-mgt":{source:"iana"},"application/vnd.globalplatform.card-content-mgt-response":{source:"iana"},"application/vnd.gmx":{source:"iana",extensions:["gmx"]},"application/vnd.google-apps.document":{compressible:!1,extensions:["gdoc"]},"application/vnd.google-apps.presentation":{compressible:!1,extensions:["gslides"]},"application/vnd.google-apps.spreadsheet":{compressible:!1,extensions:["gsheet"]},"application/vnd.google-earth.kml+xml":{source:"iana",compressible:!0,extensions:["kml"]},"application/vnd.google-earth.kmz":{source:"iana",compressible:!1,extensions:["kmz"]},"application/vnd.gov.sk.e-form+xml":{source:"iana",compressible:!0},"application/vnd.gov.sk.e-form+zip":{source:"iana",compressible:!1},"application/vnd.gov.sk.xmldatacontainer+xml":{source:"iana",compressible:!0},"application/vnd.grafeq":{source:"iana",extensions:["gqf","gqs"]},"application/vnd.gridmp":{source:"iana"},"application/vnd.groove-account":{source:"iana",extensions:["gac"]},"application/vnd.groove-help":{source:"iana",extensions:["ghf"]},"application/vnd.groove-identity-message":{source:"iana",extensions:["gim"]},"application/vnd.groove-injector":{source:"iana",extensions:["grv"]},"application/vnd.groove-tool-message":{source:"iana",extensions:["gtm"]},"application/vnd.groove-tool-template":{source:"iana",extensions:["tpl"]},"application/vnd.groove-vcard":{source:"iana",extensions:["vcg"]},"application/vnd.hal+json":{source:"iana",compressible:!0},"application/vnd.hal+xml":{source:"iana",compressible:!0,extensions:["hal"]},"application/vnd.handheld-entertainment+xml":{source:"iana",compressible:!0,extensions:["zmm"]},"application/vnd.hbci":{source:"iana",extensions:["hbci"]},"application/vnd.hc+json":{source:"iana",compressible:!0},"application/vnd.hcl-bireports":{source:"iana"},"application/vnd.hdt":{source:"iana"},"application/vnd.heroku+json":{source:"iana",compressible:!0},"application/vnd.hhe.lesson-player":{source:"iana",extensions:["les"]},"application/vnd.hl7cda+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.hl7v2+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.hp-hpgl":{source:"iana",extensions:["hpgl"]},"application/vnd.hp-hpid":{source:"iana",extensions:["hpid"]},"application/vnd.hp-hps":{source:"iana",extensions:["hps"]},"application/vnd.hp-jlyt":{source:"iana",extensions:["jlt"]},"application/vnd.hp-pcl":{source:"iana",extensions:["pcl"]},"application/vnd.hp-pclxl":{source:"iana",extensions:["pclxl"]},"application/vnd.httphone":{source:"iana"},"application/vnd.hydrostatix.sof-data":{source:"iana",extensions:["sfd-hdstx"]},"application/vnd.hyper+json":{source:"iana",compressible:!0},"application/vnd.hyper-item+json":{source:"iana",compressible:!0},"application/vnd.hyperdrive+json":{source:"iana",compressible:!0},"application/vnd.hzn-3d-crossword":{source:"iana"},"application/vnd.ibm.afplinedata":{source:"iana"},"application/vnd.ibm.electronic-media":{source:"iana"},"application/vnd.ibm.minipay":{source:"iana",extensions:["mpy"]},"application/vnd.ibm.modcap":{source:"iana",extensions:["afp","listafp","list3820"]},"application/vnd.ibm.rights-management":{source:"iana",extensions:["irm"]},"application/vnd.ibm.secure-container":{source:"iana",extensions:["sc"]},"application/vnd.iccprofile":{source:"iana",extensions:["icc","icm"]},"application/vnd.ieee.1905":{source:"iana"},"application/vnd.igloader":{source:"iana",extensions:["igl"]},"application/vnd.imagemeter.folder+zip":{source:"iana",compressible:!1},"application/vnd.imagemeter.image+zip":{source:"iana",compressible:!1},"application/vnd.immervision-ivp":{source:"iana",extensions:["ivp"]},"application/vnd.immervision-ivu":{source:"iana",extensions:["ivu"]},"application/vnd.ims.imsccv1p1":{source:"iana"},"application/vnd.ims.imsccv1p2":{source:"iana"},"application/vnd.ims.imsccv1p3":{source:"iana"},"application/vnd.ims.lis.v2.result+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolconsumerprofile+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolproxy+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolproxy.id+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolsettings+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolsettings.simple+json":{source:"iana",compressible:!0},"application/vnd.informedcontrol.rms+xml":{source:"iana",compressible:!0},"application/vnd.informix-visionary":{source:"iana"},"application/vnd.infotech.project":{source:"iana"},"application/vnd.infotech.project+xml":{source:"iana",compressible:!0},"application/vnd.innopath.wamp.notification":{source:"iana"},"application/vnd.insors.igm":{source:"iana",extensions:["igm"]},"application/vnd.intercon.formnet":{source:"iana",extensions:["xpw","xpx"]},"application/vnd.intergeo":{source:"iana",extensions:["i2g"]},"application/vnd.intertrust.digibox":{source:"iana"},"application/vnd.intertrust.nncp":{source:"iana"},"application/vnd.intu.qbo":{source:"iana",extensions:["qbo"]},"application/vnd.intu.qfx":{source:"iana",extensions:["qfx"]},"application/vnd.iptc.g2.catalogitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.conceptitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.knowledgeitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.newsitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.newsmessage+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.packageitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.planningitem+xml":{source:"iana",compressible:!0},"application/vnd.ipunplugged.rcprofile":{source:"iana",extensions:["rcprofile"]},"application/vnd.irepository.package+xml":{source:"iana",compressible:!0,extensions:["irp"]},"application/vnd.is-xpr":{source:"iana",extensions:["xpr"]},"application/vnd.isac.fcs":{source:"iana",extensions:["fcs"]},"application/vnd.iso11783-10+zip":{source:"iana",compressible:!1},"application/vnd.jam":{source:"iana",extensions:["jam"]},"application/vnd.japannet-directory-service":{source:"iana"},"application/vnd.japannet-jpnstore-wakeup":{source:"iana"},"application/vnd.japannet-payment-wakeup":{source:"iana"},"application/vnd.japannet-registration":{source:"iana"},"application/vnd.japannet-registration-wakeup":{source:"iana"},"application/vnd.japannet-setstore-wakeup":{source:"iana"},"application/vnd.japannet-verification":{source:"iana"},"application/vnd.japannet-verification-wakeup":{source:"iana"},"application/vnd.jcp.javame.midlet-rms":{source:"iana",extensions:["rms"]},"application/vnd.jisp":{source:"iana",extensions:["jisp"]},"application/vnd.joost.joda-archive":{source:"iana",extensions:["joda"]},"application/vnd.jsk.isdn-ngn":{source:"iana"},"application/vnd.kahootz":{source:"iana",extensions:["ktz","ktr"]},"application/vnd.kde.karbon":{source:"iana",extensions:["karbon"]},"application/vnd.kde.kchart":{source:"iana",extensions:["chrt"]},"application/vnd.kde.kformula":{source:"iana",extensions:["kfo"]},"application/vnd.kde.kivio":{source:"iana",extensions:["flw"]},"application/vnd.kde.kontour":{source:"iana",extensions:["kon"]},"application/vnd.kde.kpresenter":{source:"iana",extensions:["kpr","kpt"]},"application/vnd.kde.kspread":{source:"iana",extensions:["ksp"]},"application/vnd.kde.kword":{source:"iana",extensions:["kwd","kwt"]},"application/vnd.kenameaapp":{source:"iana",extensions:["htke"]},"application/vnd.kidspiration":{source:"iana",extensions:["kia"]},"application/vnd.kinar":{source:"iana",extensions:["kne","knp"]},"application/vnd.koan":{source:"iana",extensions:["skp","skd","skt","skm"]},"application/vnd.kodak-descriptor":{source:"iana",extensions:["sse"]},"application/vnd.las":{source:"iana"},"application/vnd.las.las+json":{source:"iana",compressible:!0},"application/vnd.las.las+xml":{source:"iana",compressible:!0,extensions:["lasxml"]},"application/vnd.laszip":{source:"iana"},"application/vnd.leap+json":{source:"iana",compressible:!0},"application/vnd.liberty-request+xml":{source:"iana",compressible:!0},"application/vnd.llamagraphics.life-balance.desktop":{source:"iana",extensions:["lbd"]},"application/vnd.llamagraphics.life-balance.exchange+xml":{source:"iana",compressible:!0,extensions:["lbe"]},"application/vnd.logipipe.circuit+zip":{source:"iana",compressible:!1},"application/vnd.loom":{source:"iana"},"application/vnd.lotus-1-2-3":{source:"iana",extensions:["123"]},"application/vnd.lotus-approach":{source:"iana",extensions:["apr"]},"application/vnd.lotus-freelance":{source:"iana",extensions:["pre"]},"application/vnd.lotus-notes":{source:"iana",extensions:["nsf"]},"application/vnd.lotus-organizer":{source:"iana",extensions:["org"]},"application/vnd.lotus-screencam":{source:"iana",extensions:["scm"]},"application/vnd.lotus-wordpro":{source:"iana",extensions:["lwp"]},"application/vnd.macports.portpkg":{source:"iana",extensions:["portpkg"]},"application/vnd.mapbox-vector-tile":{source:"iana",extensions:["mvt"]},"application/vnd.marlin.drm.actiontoken+xml":{source:"iana",compressible:!0},"application/vnd.marlin.drm.conftoken+xml":{source:"iana",compressible:!0},"application/vnd.marlin.drm.license+xml":{source:"iana",compressible:!0},"application/vnd.marlin.drm.mdcf":{source:"iana"},"application/vnd.mason+json":{source:"iana",compressible:!0},"application/vnd.maxar.archive.3tz+zip":{source:"iana",compressible:!1},"application/vnd.maxmind.maxmind-db":{source:"iana"},"application/vnd.mcd":{source:"iana",extensions:["mcd"]},"application/vnd.medcalcdata":{source:"iana",extensions:["mc1"]},"application/vnd.mediastation.cdkey":{source:"iana",extensions:["cdkey"]},"application/vnd.meridian-slingshot":{source:"iana"},"application/vnd.mfer":{source:"iana",extensions:["mwf"]},"application/vnd.mfmp":{source:"iana",extensions:["mfm"]},"application/vnd.micro+json":{source:"iana",compressible:!0},"application/vnd.micrografx.flo":{source:"iana",extensions:["flo"]},"application/vnd.micrografx.igx":{source:"iana",extensions:["igx"]},"application/vnd.microsoft.portable-executable":{source:"iana"},"application/vnd.microsoft.windows.thumbnail-cache":{source:"iana"},"application/vnd.miele+json":{source:"iana",compressible:!0},"application/vnd.mif":{source:"iana",extensions:["mif"]},"application/vnd.minisoft-hp3000-save":{source:"iana"},"application/vnd.mitsubishi.misty-guard.trustweb":{source:"iana"},"application/vnd.mobius.daf":{source:"iana",extensions:["daf"]},"application/vnd.mobius.dis":{source:"iana",extensions:["dis"]},"application/vnd.mobius.mbk":{source:"iana",extensions:["mbk"]},"application/vnd.mobius.mqy":{source:"iana",extensions:["mqy"]},"application/vnd.mobius.msl":{source:"iana",extensions:["msl"]},"application/vnd.mobius.plc":{source:"iana",extensions:["plc"]},"application/vnd.mobius.txf":{source:"iana",extensions:["txf"]},"application/vnd.mophun.application":{source:"iana",extensions:["mpn"]},"application/vnd.mophun.certificate":{source:"iana",extensions:["mpc"]},"application/vnd.motorola.flexsuite":{source:"iana"},"application/vnd.motorola.flexsuite.adsi":{source:"iana"},"application/vnd.motorola.flexsuite.fis":{source:"iana"},"application/vnd.motorola.flexsuite.gotap":{source:"iana"},"application/vnd.motorola.flexsuite.kmr":{source:"iana"},"application/vnd.motorola.flexsuite.ttc":{source:"iana"},"application/vnd.motorola.flexsuite.wem":{source:"iana"},"application/vnd.motorola.iprm":{source:"iana"},"application/vnd.mozilla.xul+xml":{source:"iana",compressible:!0,extensions:["xul"]},"application/vnd.ms-3mfdocument":{source:"iana"},"application/vnd.ms-artgalry":{source:"iana",extensions:["cil"]},"application/vnd.ms-asf":{source:"iana"},"application/vnd.ms-cab-compressed":{source:"iana",extensions:["cab"]},"application/vnd.ms-color.iccprofile":{source:"apache"},"application/vnd.ms-excel":{source:"iana",compressible:!1,extensions:["xls","xlm","xla","xlc","xlt","xlw"]},"application/vnd.ms-excel.addin.macroenabled.12":{source:"iana",extensions:["xlam"]},"application/vnd.ms-excel.sheet.binary.macroenabled.12":{source:"iana",extensions:["xlsb"]},"application/vnd.ms-excel.sheet.macroenabled.12":{source:"iana",extensions:["xlsm"]},"application/vnd.ms-excel.template.macroenabled.12":{source:"iana",extensions:["xltm"]},"application/vnd.ms-fontobject":{source:"iana",compressible:!0,extensions:["eot"]},"application/vnd.ms-htmlhelp":{source:"iana",extensions:["chm"]},"application/vnd.ms-ims":{source:"iana",extensions:["ims"]},"application/vnd.ms-lrm":{source:"iana",extensions:["lrm"]},"application/vnd.ms-office.activex+xml":{source:"iana",compressible:!0},"application/vnd.ms-officetheme":{source:"iana",extensions:["thmx"]},"application/vnd.ms-opentype":{source:"apache",compressible:!0},"application/vnd.ms-outlook":{compressible:!1,extensions:["msg"]},"application/vnd.ms-package.obfuscated-opentype":{source:"apache"},"application/vnd.ms-pki.seccat":{source:"apache",extensions:["cat"]},"application/vnd.ms-pki.stl":{source:"apache",extensions:["stl"]},"application/vnd.ms-playready.initiator+xml":{source:"iana",compressible:!0},"application/vnd.ms-powerpoint":{source:"iana",compressible:!1,extensions:["ppt","pps","pot"]},"application/vnd.ms-powerpoint.addin.macroenabled.12":{source:"iana",extensions:["ppam"]},"application/vnd.ms-powerpoint.presentation.macroenabled.12":{source:"iana",extensions:["pptm"]},"application/vnd.ms-powerpoint.slide.macroenabled.12":{source:"iana",extensions:["sldm"]},"application/vnd.ms-powerpoint.slideshow.macroenabled.12":{source:"iana",extensions:["ppsm"]},"application/vnd.ms-powerpoint.template.macroenabled.12":{source:"iana",extensions:["potm"]},"application/vnd.ms-printdevicecapabilities+xml":{source:"iana",compressible:!0},"application/vnd.ms-printing.printticket+xml":{source:"apache",compressible:!0},"application/vnd.ms-printschematicket+xml":{source:"iana",compressible:!0},"application/vnd.ms-project":{source:"iana",extensions:["mpp","mpt"]},"application/vnd.ms-tnef":{source:"iana"},"application/vnd.ms-windows.devicepairing":{source:"iana"},"application/vnd.ms-windows.nwprinting.oob":{source:"iana"},"application/vnd.ms-windows.printerpairing":{source:"iana"},"application/vnd.ms-windows.wsd.oob":{source:"iana"},"application/vnd.ms-wmdrm.lic-chlg-req":{source:"iana"},"application/vnd.ms-wmdrm.lic-resp":{source:"iana"},"application/vnd.ms-wmdrm.meter-chlg-req":{source:"iana"},"application/vnd.ms-wmdrm.meter-resp":{source:"iana"},"application/vnd.ms-word.document.macroenabled.12":{source:"iana",extensions:["docm"]},"application/vnd.ms-word.template.macroenabled.12":{source:"iana",extensions:["dotm"]},"application/vnd.ms-works":{source:"iana",extensions:["wps","wks","wcm","wdb"]},"application/vnd.ms-wpl":{source:"iana",extensions:["wpl"]},"application/vnd.ms-xpsdocument":{source:"iana",compressible:!1,extensions:["xps"]},"application/vnd.msa-disk-image":{source:"iana"},"application/vnd.mseq":{source:"iana",extensions:["mseq"]},"application/vnd.msign":{source:"iana"},"application/vnd.multiad.creator":{source:"iana"},"application/vnd.multiad.creator.cif":{source:"iana"},"application/vnd.music-niff":{source:"iana"},"application/vnd.musician":{source:"iana",extensions:["mus"]},"application/vnd.muvee.style":{source:"iana",extensions:["msty"]},"application/vnd.mynfc":{source:"iana",extensions:["taglet"]},"application/vnd.nacamar.ybrid+json":{source:"iana",compressible:!0},"application/vnd.ncd.control":{source:"iana"},"application/vnd.ncd.reference":{source:"iana"},"application/vnd.nearst.inv+json":{source:"iana",compressible:!0},"application/vnd.nebumind.line":{source:"iana"},"application/vnd.nervana":{source:"iana"},"application/vnd.netfpx":{source:"iana"},"application/vnd.neurolanguage.nlu":{source:"iana",extensions:["nlu"]},"application/vnd.nimn":{source:"iana"},"application/vnd.nintendo.nitro.rom":{source:"iana"},"application/vnd.nintendo.snes.rom":{source:"iana"},"application/vnd.nitf":{source:"iana",extensions:["ntf","nitf"]},"application/vnd.noblenet-directory":{source:"iana",extensions:["nnd"]},"application/vnd.noblenet-sealer":{source:"iana",extensions:["nns"]},"application/vnd.noblenet-web":{source:"iana",extensions:["nnw"]},"application/vnd.nokia.catalogs":{source:"iana"},"application/vnd.nokia.conml+wbxml":{source:"iana"},"application/vnd.nokia.conml+xml":{source:"iana",compressible:!0},"application/vnd.nokia.iptv.config+xml":{source:"iana",compressible:!0},"application/vnd.nokia.isds-radio-presets":{source:"iana"},"application/vnd.nokia.landmark+wbxml":{source:"iana"},"application/vnd.nokia.landmark+xml":{source:"iana",compressible:!0},"application/vnd.nokia.landmarkcollection+xml":{source:"iana",compressible:!0},"application/vnd.nokia.n-gage.ac+xml":{source:"iana",compressible:!0,extensions:["ac"]},"application/vnd.nokia.n-gage.data":{source:"iana",extensions:["ngdat"]},"application/vnd.nokia.n-gage.symbian.install":{source:"iana",extensions:["n-gage"]},"application/vnd.nokia.ncd":{source:"iana"},"application/vnd.nokia.pcd+wbxml":{source:"iana"},"application/vnd.nokia.pcd+xml":{source:"iana",compressible:!0},"application/vnd.nokia.radio-preset":{source:"iana",extensions:["rpst"]},"application/vnd.nokia.radio-presets":{source:"iana",extensions:["rpss"]},"application/vnd.novadigm.edm":{source:"iana",extensions:["edm"]},"application/vnd.novadigm.edx":{source:"iana",extensions:["edx"]},"application/vnd.novadigm.ext":{source:"iana",extensions:["ext"]},"application/vnd.ntt-local.content-share":{source:"iana"},"application/vnd.ntt-local.file-transfer":{source:"iana"},"application/vnd.ntt-local.ogw_remote-access":{source:"iana"},"application/vnd.ntt-local.sip-ta_remote":{source:"iana"},"application/vnd.ntt-local.sip-ta_tcp_stream":{source:"iana"},"application/vnd.oasis.opendocument.chart":{source:"iana",extensions:["odc"]},"application/vnd.oasis.opendocument.chart-template":{source:"iana",extensions:["otc"]},"application/vnd.oasis.opendocument.database":{source:"iana",extensions:["odb"]},"application/vnd.oasis.opendocument.formula":{source:"iana",extensions:["odf"]},"application/vnd.oasis.opendocument.formula-template":{source:"iana",extensions:["odft"]},"application/vnd.oasis.opendocument.graphics":{source:"iana",compressible:!1,extensions:["odg"]},"application/vnd.oasis.opendocument.graphics-template":{source:"iana",extensions:["otg"]},"application/vnd.oasis.opendocument.image":{source:"iana",extensions:["odi"]},"application/vnd.oasis.opendocument.image-template":{source:"iana",extensions:["oti"]},"application/vnd.oasis.opendocument.presentation":{source:"iana",compressible:!1,extensions:["odp"]},"application/vnd.oasis.opendocument.presentation-template":{source:"iana",extensions:["otp"]},"application/vnd.oasis.opendocument.spreadsheet":{source:"iana",compressible:!1,extensions:["ods"]},"application/vnd.oasis.opendocument.spreadsheet-template":{source:"iana",extensions:["ots"]},"application/vnd.oasis.opendocument.text":{source:"iana",compressible:!1,extensions:["odt"]},"application/vnd.oasis.opendocument.text-master":{source:"iana",extensions:["odm"]},"application/vnd.oasis.opendocument.text-template":{source:"iana",extensions:["ott"]},"application/vnd.oasis.opendocument.text-web":{source:"iana",extensions:["oth"]},"application/vnd.obn":{source:"iana"},"application/vnd.ocf+cbor":{source:"iana"},"application/vnd.oci.image.manifest.v1+json":{source:"iana",compressible:!0},"application/vnd.oftn.l10n+json":{source:"iana",compressible:!0},"application/vnd.oipf.contentaccessdownload+xml":{source:"iana",compressible:!0},"application/vnd.oipf.contentaccessstreaming+xml":{source:"iana",compressible:!0},"application/vnd.oipf.cspg-hexbinary":{source:"iana"},"application/vnd.oipf.dae.svg+xml":{source:"iana",compressible:!0},"application/vnd.oipf.dae.xhtml+xml":{source:"iana",compressible:!0},"application/vnd.oipf.mippvcontrolmessage+xml":{source:"iana",compressible:!0},"application/vnd.oipf.pae.gem":{source:"iana"},"application/vnd.oipf.spdiscovery+xml":{source:"iana",compressible:!0},"application/vnd.oipf.spdlist+xml":{source:"iana",compressible:!0},"application/vnd.oipf.ueprofile+xml":{source:"iana",compressible:!0},"application/vnd.oipf.userprofile+xml":{source:"iana",compressible:!0},"application/vnd.olpc-sugar":{source:"iana",extensions:["xo"]},"application/vnd.oma-scws-config":{source:"iana"},"application/vnd.oma-scws-http-request":{source:"iana"},"application/vnd.oma-scws-http-response":{source:"iana"},"application/vnd.oma.bcast.associated-procedure-parameter+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.drm-trigger+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.imd+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.ltkm":{source:"iana"},"application/vnd.oma.bcast.notification+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.provisioningtrigger":{source:"iana"},"application/vnd.oma.bcast.sgboot":{source:"iana"},"application/vnd.oma.bcast.sgdd+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.sgdu":{source:"iana"},"application/vnd.oma.bcast.simple-symbol-container":{source:"iana"},"application/vnd.oma.bcast.smartcard-trigger+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.sprov+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.stkm":{source:"iana"},"application/vnd.oma.cab-address-book+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-feature-handler+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-pcc+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-subs-invite+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-user-prefs+xml":{source:"iana",compressible:!0},"application/vnd.oma.dcd":{source:"iana"},"application/vnd.oma.dcdc":{source:"iana"},"application/vnd.oma.dd2+xml":{source:"iana",compressible:!0,extensions:["dd2"]},"application/vnd.oma.drm.risd+xml":{source:"iana",compressible:!0},"application/vnd.oma.group-usage-list+xml":{source:"iana",compressible:!0},"application/vnd.oma.lwm2m+cbor":{source:"iana"},"application/vnd.oma.lwm2m+json":{source:"iana",compressible:!0},"application/vnd.oma.lwm2m+tlv":{source:"iana"},"application/vnd.oma.pal+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.detailed-progress-report+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.final-report+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.groups+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.invocation-descriptor+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.optimized-progress-report+xml":{source:"iana",compressible:!0},"application/vnd.oma.push":{source:"iana"},"application/vnd.oma.scidm.messages+xml":{source:"iana",compressible:!0},"application/vnd.oma.xcap-directory+xml":{source:"iana",compressible:!0},"application/vnd.omads-email+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.omads-file+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.omads-folder+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.omaloc-supl-init":{source:"iana"},"application/vnd.onepager":{source:"iana"},"application/vnd.onepagertamp":{source:"iana"},"application/vnd.onepagertamx":{source:"iana"},"application/vnd.onepagertat":{source:"iana"},"application/vnd.onepagertatp":{source:"iana"},"application/vnd.onepagertatx":{source:"iana"},"application/vnd.openblox.game+xml":{source:"iana",compressible:!0,extensions:["obgx"]},"application/vnd.openblox.game-binary":{source:"iana"},"application/vnd.openeye.oeb":{source:"iana"},"application/vnd.openofficeorg.extension":{source:"apache",extensions:["oxt"]},"application/vnd.openstreetmap.data+xml":{source:"iana",compressible:!0,extensions:["osm"]},"application/vnd.opentimestamps.ots":{source:"iana"},"application/vnd.openxmlformats-officedocument.custom-properties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.customxmlproperties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawing+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.chart+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.extended-properties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.comments+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.presentation":{source:"iana",compressible:!1,extensions:["pptx"]},"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slide":{source:"iana",extensions:["sldx"]},"application/vnd.openxmlformats-officedocument.presentationml.slide+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slideshow":{source:"iana",extensions:["ppsx"]},"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.tags+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.template":{source:"iana",extensions:["potx"]},"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{source:"iana",compressible:!1,extensions:["xlsx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.template":{source:"iana",extensions:["xltx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.theme+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.themeoverride+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.vmldrawing":{source:"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.document":{source:"iana",compressible:!1,extensions:["docx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.template":{source:"iana",extensions:["dotx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-package.core-properties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-package.relationships+xml":{source:"iana",compressible:!0},"application/vnd.oracle.resource+json":{source:"iana",compressible:!0},"application/vnd.orange.indata":{source:"iana"},"application/vnd.osa.netdeploy":{source:"iana"},"application/vnd.osgeo.mapguide.package":{source:"iana",extensions:["mgp"]},"application/vnd.osgi.bundle":{source:"iana"},"application/vnd.osgi.dp":{source:"iana",extensions:["dp"]},"application/vnd.osgi.subsystem":{source:"iana",extensions:["esa"]},"application/vnd.otps.ct-kip+xml":{source:"iana",compressible:!0},"application/vnd.oxli.countgraph":{source:"iana"},"application/vnd.pagerduty+json":{source:"iana",compressible:!0},"application/vnd.palm":{source:"iana",extensions:["pdb","pqa","oprc"]},"application/vnd.panoply":{source:"iana"},"application/vnd.paos.xml":{source:"iana"},"application/vnd.patentdive":{source:"iana"},"application/vnd.patientecommsdoc":{source:"iana"},"application/vnd.pawaafile":{source:"iana",extensions:["paw"]},"application/vnd.pcos":{source:"iana"},"application/vnd.pg.format":{source:"iana",extensions:["str"]},"application/vnd.pg.osasli":{source:"iana",extensions:["ei6"]},"application/vnd.piaccess.application-licence":{source:"iana"},"application/vnd.picsel":{source:"iana",extensions:["efif"]},"application/vnd.pmi.widget":{source:"iana",extensions:["wg"]},"application/vnd.poc.group-advertisement+xml":{source:"iana",compressible:!0},"application/vnd.pocketlearn":{source:"iana",extensions:["plf"]},"application/vnd.powerbuilder6":{source:"iana",extensions:["pbd"]},"application/vnd.powerbuilder6-s":{source:"iana"},"application/vnd.powerbuilder7":{source:"iana"},"application/vnd.powerbuilder7-s":{source:"iana"},"application/vnd.powerbuilder75":{source:"iana"},"application/vnd.powerbuilder75-s":{source:"iana"},"application/vnd.preminet":{source:"iana"},"application/vnd.previewsystems.box":{source:"iana",extensions:["box"]},"application/vnd.proteus.magazine":{source:"iana",extensions:["mgz"]},"application/vnd.psfs":{source:"iana"},"application/vnd.publishare-delta-tree":{source:"iana",extensions:["qps"]},"application/vnd.pvi.ptid1":{source:"iana",extensions:["ptid"]},"application/vnd.pwg-multiplexed":{source:"iana"},"application/vnd.pwg-xhtml-print+xml":{source:"iana",compressible:!0},"application/vnd.qualcomm.brew-app-res":{source:"iana"},"application/vnd.quarantainenet":{source:"iana"},"application/vnd.quark.quarkxpress":{source:"iana",extensions:["qxd","qxt","qwd","qwt","qxl","qxb"]},"application/vnd.quobject-quoxdocument":{source:"iana"},"application/vnd.radisys.moml+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-conf+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-conn+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-dialog+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-stream+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-conf+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-base+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-fax-detect+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-fax-sendrecv+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-group+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-speech+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-transform+xml":{source:"iana",compressible:!0},"application/vnd.rainstor.data":{source:"iana"},"application/vnd.rapid":{source:"iana"},"application/vnd.rar":{source:"iana",extensions:["rar"]},"application/vnd.realvnc.bed":{source:"iana",extensions:["bed"]},"application/vnd.recordare.musicxml":{source:"iana",extensions:["mxl"]},"application/vnd.recordare.musicxml+xml":{source:"iana",compressible:!0,extensions:["musicxml"]},"application/vnd.renlearn.rlprint":{source:"iana"},"application/vnd.resilient.logic":{source:"iana"},"application/vnd.restful+json":{source:"iana",compressible:!0},"application/vnd.rig.cryptonote":{source:"iana",extensions:["cryptonote"]},"application/vnd.rim.cod":{source:"apache",extensions:["cod"]},"application/vnd.rn-realmedia":{source:"apache",extensions:["rm"]},"application/vnd.rn-realmedia-vbr":{source:"apache",extensions:["rmvb"]},"application/vnd.route66.link66+xml":{source:"iana",compressible:!0,extensions:["link66"]},"application/vnd.rs-274x":{source:"iana"},"application/vnd.ruckus.download":{source:"iana"},"application/vnd.s3sms":{source:"iana"},"application/vnd.sailingtracker.track":{source:"iana",extensions:["st"]},"application/vnd.sar":{source:"iana"},"application/vnd.sbm.cid":{source:"iana"},"application/vnd.sbm.mid2":{source:"iana"},"application/vnd.scribus":{source:"iana"},"application/vnd.sealed.3df":{source:"iana"},"application/vnd.sealed.csf":{source:"iana"},"application/vnd.sealed.doc":{source:"iana"},"application/vnd.sealed.eml":{source:"iana"},"application/vnd.sealed.mht":{source:"iana"},"application/vnd.sealed.net":{source:"iana"},"application/vnd.sealed.ppt":{source:"iana"},"application/vnd.sealed.tiff":{source:"iana"},"application/vnd.sealed.xls":{source:"iana"},"application/vnd.sealedmedia.softseal.html":{source:"iana"},"application/vnd.sealedmedia.softseal.pdf":{source:"iana"},"application/vnd.seemail":{source:"iana",extensions:["see"]},"application/vnd.seis+json":{source:"iana",compressible:!0},"application/vnd.sema":{source:"iana",extensions:["sema"]},"application/vnd.semd":{source:"iana",extensions:["semd"]},"application/vnd.semf":{source:"iana",extensions:["semf"]},"application/vnd.shade-save-file":{source:"iana"},"application/vnd.shana.informed.formdata":{source:"iana",extensions:["ifm"]},"application/vnd.shana.informed.formtemplate":{source:"iana",extensions:["itp"]},"application/vnd.shana.informed.interchange":{source:"iana",extensions:["iif"]},"application/vnd.shana.informed.package":{source:"iana",extensions:["ipk"]},"application/vnd.shootproof+json":{source:"iana",compressible:!0},"application/vnd.shopkick+json":{source:"iana",compressible:!0},"application/vnd.shp":{source:"iana"},"application/vnd.shx":{source:"iana"},"application/vnd.sigrok.session":{source:"iana"},"application/vnd.simtech-mindmapper":{source:"iana",extensions:["twd","twds"]},"application/vnd.siren+json":{source:"iana",compressible:!0},"application/vnd.smaf":{source:"iana",extensions:["mmf"]},"application/vnd.smart.notebook":{source:"iana"},"application/vnd.smart.teacher":{source:"iana",extensions:["teacher"]},"application/vnd.snesdev-page-table":{source:"iana"},"application/vnd.software602.filler.form+xml":{source:"iana",compressible:!0,extensions:["fo"]},"application/vnd.software602.filler.form-xml-zip":{source:"iana"},"application/vnd.solent.sdkm+xml":{source:"iana",compressible:!0,extensions:["sdkm","sdkd"]},"application/vnd.spotfire.dxp":{source:"iana",extensions:["dxp"]},"application/vnd.spotfire.sfs":{source:"iana",extensions:["sfs"]},"application/vnd.sqlite3":{source:"iana"},"application/vnd.sss-cod":{source:"iana"},"application/vnd.sss-dtf":{source:"iana"},"application/vnd.sss-ntf":{source:"iana"},"application/vnd.stardivision.calc":{source:"apache",extensions:["sdc"]},"application/vnd.stardivision.draw":{source:"apache",extensions:["sda"]},"application/vnd.stardivision.impress":{source:"apache",extensions:["sdd"]},"application/vnd.stardivision.math":{source:"apache",extensions:["smf"]},"application/vnd.stardivision.writer":{source:"apache",extensions:["sdw","vor"]},"application/vnd.stardivision.writer-global":{source:"apache",extensions:["sgl"]},"application/vnd.stepmania.package":{source:"iana",extensions:["smzip"]},"application/vnd.stepmania.stepchart":{source:"iana",extensions:["sm"]},"application/vnd.street-stream":{source:"iana"},"application/vnd.sun.wadl+xml":{source:"iana",compressible:!0,extensions:["wadl"]},"application/vnd.sun.xml.calc":{source:"apache",extensions:["sxc"]},"application/vnd.sun.xml.calc.template":{source:"apache",extensions:["stc"]},"application/vnd.sun.xml.draw":{source:"apache",extensions:["sxd"]},"application/vnd.sun.xml.draw.template":{source:"apache",extensions:["std"]},"application/vnd.sun.xml.impress":{source:"apache",extensions:["sxi"]},"application/vnd.sun.xml.impress.template":{source:"apache",extensions:["sti"]},"application/vnd.sun.xml.math":{source:"apache",extensions:["sxm"]},"application/vnd.sun.xml.writer":{source:"apache",extensions:["sxw"]},"application/vnd.sun.xml.writer.global":{source:"apache",extensions:["sxg"]},"application/vnd.sun.xml.writer.template":{source:"apache",extensions:["stw"]},"application/vnd.sus-calendar":{source:"iana",extensions:["sus","susp"]},"application/vnd.svd":{source:"iana",extensions:["svd"]},"application/vnd.swiftview-ics":{source:"iana"},"application/vnd.sycle+xml":{source:"iana",compressible:!0},"application/vnd.syft+json":{source:"iana",compressible:!0},"application/vnd.symbian.install":{source:"apache",extensions:["sis","sisx"]},"application/vnd.syncml+xml":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["xsm"]},"application/vnd.syncml.dm+wbxml":{source:"iana",charset:"UTF-8",extensions:["bdm"]},"application/vnd.syncml.dm+xml":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["xdm"]},"application/vnd.syncml.dm.notification":{source:"iana"},"application/vnd.syncml.dmddf+wbxml":{source:"iana"},"application/vnd.syncml.dmddf+xml":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["ddf"]},"application/vnd.syncml.dmtnds+wbxml":{source:"iana"},"application/vnd.syncml.dmtnds+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.syncml.ds.notification":{source:"iana"},"application/vnd.tableschema+json":{source:"iana",compressible:!0},"application/vnd.tao.intent-module-archive":{source:"iana",extensions:["tao"]},"application/vnd.tcpdump.pcap":{source:"iana",extensions:["pcap","cap","dmp"]},"application/vnd.think-cell.ppttc+json":{source:"iana",compressible:!0},"application/vnd.tmd.mediaflex.api+xml":{source:"iana",compressible:!0},"application/vnd.tml":{source:"iana"},"application/vnd.tmobile-livetv":{source:"iana",extensions:["tmo"]},"application/vnd.tri.onesource":{source:"iana"},"application/vnd.trid.tpt":{source:"iana",extensions:["tpt"]},"application/vnd.triscape.mxs":{source:"iana",extensions:["mxs"]},"application/vnd.trueapp":{source:"iana",extensions:["tra"]},"application/vnd.truedoc":{source:"iana"},"application/vnd.ubisoft.webplayer":{source:"iana"},"application/vnd.ufdl":{source:"iana",extensions:["ufd","ufdl"]},"application/vnd.uiq.theme":{source:"iana",extensions:["utz"]},"application/vnd.umajin":{source:"iana",extensions:["umj"]},"application/vnd.unity":{source:"iana",extensions:["unityweb"]},"application/vnd.uoml+xml":{source:"iana",compressible:!0,extensions:["uoml"]},"application/vnd.uplanet.alert":{source:"iana"},"application/vnd.uplanet.alert-wbxml":{source:"iana"},"application/vnd.uplanet.bearer-choice":{source:"iana"},"application/vnd.uplanet.bearer-choice-wbxml":{source:"iana"},"application/vnd.uplanet.cacheop":{source:"iana"},"application/vnd.uplanet.cacheop-wbxml":{source:"iana"},"application/vnd.uplanet.channel":{source:"iana"},"application/vnd.uplanet.channel-wbxml":{source:"iana"},"application/vnd.uplanet.list":{source:"iana"},"application/vnd.uplanet.list-wbxml":{source:"iana"},"application/vnd.uplanet.listcmd":{source:"iana"},"application/vnd.uplanet.listcmd-wbxml":{source:"iana"},"application/vnd.uplanet.signal":{source:"iana"},"application/vnd.uri-map":{source:"iana"},"application/vnd.valve.source.material":{source:"iana"},"application/vnd.vcx":{source:"iana",extensions:["vcx"]},"application/vnd.vd-study":{source:"iana"},"application/vnd.vectorworks":{source:"iana"},"application/vnd.vel+json":{source:"iana",compressible:!0},"application/vnd.verimatrix.vcas":{source:"iana"},"application/vnd.veritone.aion+json":{source:"iana",compressible:!0},"application/vnd.veryant.thin":{source:"iana"},"application/vnd.ves.encrypted":{source:"iana"},"application/vnd.vidsoft.vidconference":{source:"iana"},"application/vnd.visio":{source:"iana",extensions:["vsd","vst","vss","vsw"]},"application/vnd.visionary":{source:"iana",extensions:["vis"]},"application/vnd.vividence.scriptfile":{source:"iana"},"application/vnd.vsf":{source:"iana",extensions:["vsf"]},"application/vnd.wap.sic":{source:"iana"},"application/vnd.wap.slc":{source:"iana"},"application/vnd.wap.wbxml":{source:"iana",charset:"UTF-8",extensions:["wbxml"]},"application/vnd.wap.wmlc":{source:"iana",extensions:["wmlc"]},"application/vnd.wap.wmlscriptc":{source:"iana",extensions:["wmlsc"]},"application/vnd.webturbo":{source:"iana",extensions:["wtb"]},"application/vnd.wfa.dpp":{source:"iana"},"application/vnd.wfa.p2p":{source:"iana"},"application/vnd.wfa.wsc":{source:"iana"},"application/vnd.windows.devicepairing":{source:"iana"},"application/vnd.wmc":{source:"iana"},"application/vnd.wmf.bootstrap":{source:"iana"},"application/vnd.wolfram.mathematica":{source:"iana"},"application/vnd.wolfram.mathematica.package":{source:"iana"},"application/vnd.wolfram.player":{source:"iana",extensions:["nbp"]},"application/vnd.wordperfect":{source:"iana",extensions:["wpd"]},"application/vnd.wqd":{source:"iana",extensions:["wqd"]},"application/vnd.wrq-hp3000-labelled":{source:"iana"},"application/vnd.wt.stf":{source:"iana",extensions:["stf"]},"application/vnd.wv.csp+wbxml":{source:"iana"},"application/vnd.wv.csp+xml":{source:"iana",compressible:!0},"application/vnd.wv.ssp+xml":{source:"iana",compressible:!0},"application/vnd.xacml+json":{source:"iana",compressible:!0},"application/vnd.xara":{source:"iana",extensions:["xar"]},"application/vnd.xfdl":{source:"iana",extensions:["xfdl"]},"application/vnd.xfdl.webform":{source:"iana"},"application/vnd.xmi+xml":{source:"iana",compressible:!0},"application/vnd.xmpie.cpkg":{source:"iana"},"application/vnd.xmpie.dpkg":{source:"iana"},"application/vnd.xmpie.plan":{source:"iana"},"application/vnd.xmpie.ppkg":{source:"iana"},"application/vnd.xmpie.xlim":{source:"iana"},"application/vnd.yamaha.hv-dic":{source:"iana",extensions:["hvd"]},"application/vnd.yamaha.hv-script":{source:"iana",extensions:["hvs"]},"application/vnd.yamaha.hv-voice":{source:"iana",extensions:["hvp"]},"application/vnd.yamaha.openscoreformat":{source:"iana",extensions:["osf"]},"application/vnd.yamaha.openscoreformat.osfpvg+xml":{source:"iana",compressible:!0,extensions:["osfpvg"]},"application/vnd.yamaha.remote-setup":{source:"iana"},"application/vnd.yamaha.smaf-audio":{source:"iana",extensions:["saf"]},"application/vnd.yamaha.smaf-phrase":{source:"iana",extensions:["spf"]},"application/vnd.yamaha.through-ngn":{source:"iana"},"application/vnd.yamaha.tunnel-udpencap":{source:"iana"},"application/vnd.yaoweme":{source:"iana"},"application/vnd.yellowriver-custom-menu":{source:"iana",extensions:["cmp"]},"application/vnd.youtube.yt":{source:"iana"},"application/vnd.zul":{source:"iana",extensions:["zir","zirz"]},"application/vnd.zzazz.deck+xml":{source:"iana",compressible:!0,extensions:["zaz"]},"application/voicexml+xml":{source:"iana",compressible:!0,extensions:["vxml"]},"application/voucher-cms+json":{source:"iana",compressible:!0},"application/vq-rtcpxr":{source:"iana"},"application/wasm":{source:"iana",compressible:!0,extensions:["wasm"]},"application/watcherinfo+xml":{source:"iana",compressible:!0,extensions:["wif"]},"application/webpush-options+json":{source:"iana",compressible:!0},"application/whoispp-query":{source:"iana"},"application/whoispp-response":{source:"iana"},"application/widget":{source:"iana",extensions:["wgt"]},"application/winhlp":{source:"apache",extensions:["hlp"]},"application/wita":{source:"iana"},"application/wordperfect5.1":{source:"iana"},"application/wsdl+xml":{source:"iana",compressible:!0,extensions:["wsdl"]},"application/wspolicy+xml":{source:"iana",compressible:!0,extensions:["wspolicy"]},"application/x-7z-compressed":{source:"apache",compressible:!1,extensions:["7z"]},"application/x-abiword":{source:"apache",extensions:["abw"]},"application/x-ace-compressed":{source:"apache",extensions:["ace"]},"application/x-amf":{source:"apache"},"application/x-apple-diskimage":{source:"apache",extensions:["dmg"]},"application/x-arj":{compressible:!1,extensions:["arj"]},"application/x-authorware-bin":{source:"apache",extensions:["aab","x32","u32","vox"]},"application/x-authorware-map":{source:"apache",extensions:["aam"]},"application/x-authorware-seg":{source:"apache",extensions:["aas"]},"application/x-bcpio":{source:"apache",extensions:["bcpio"]},"application/x-bdoc":{compressible:!1,extensions:["bdoc"]},"application/x-bittorrent":{source:"apache",extensions:["torrent"]},"application/x-blorb":{source:"apache",extensions:["blb","blorb"]},"application/x-bzip":{source:"apache",compressible:!1,extensions:["bz"]},"application/x-bzip2":{source:"apache",compressible:!1,extensions:["bz2","boz"]},"application/x-cbr":{source:"apache",extensions:["cbr","cba","cbt","cbz","cb7"]},"application/x-cdlink":{source:"apache",extensions:["vcd"]},"application/x-cfs-compressed":{source:"apache",extensions:["cfs"]},"application/x-chat":{source:"apache",extensions:["chat"]},"application/x-chess-pgn":{source:"apache",extensions:["pgn"]},"application/x-chrome-extension":{extensions:["crx"]},"application/x-cocoa":{source:"nginx",extensions:["cco"]},"application/x-compress":{source:"apache"},"application/x-conference":{source:"apache",extensions:["nsc"]},"application/x-cpio":{source:"apache",extensions:["cpio"]},"application/x-csh":{source:"apache",extensions:["csh"]},"application/x-deb":{compressible:!1},"application/x-debian-package":{source:"apache",extensions:["deb","udeb"]},"application/x-dgc-compressed":{source:"apache",extensions:["dgc"]},"application/x-director":{source:"apache",extensions:["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]},"application/x-doom":{source:"apache",extensions:["wad"]},"application/x-dtbncx+xml":{source:"apache",compressible:!0,extensions:["ncx"]},"application/x-dtbook+xml":{source:"apache",compressible:!0,extensions:["dtb"]},"application/x-dtbresource+xml":{source:"apache",compressible:!0,extensions:["res"]},"application/x-dvi":{source:"apache",compressible:!1,extensions:["dvi"]},"application/x-envoy":{source:"apache",extensions:["evy"]},"application/x-eva":{source:"apache",extensions:["eva"]},"application/x-font-bdf":{source:"apache",extensions:["bdf"]},"application/x-font-dos":{source:"apache"},"application/x-font-framemaker":{source:"apache"},"application/x-font-ghostscript":{source:"apache",extensions:["gsf"]},"application/x-font-libgrx":{source:"apache"},"application/x-font-linux-psf":{source:"apache",extensions:["psf"]},"application/x-font-pcf":{source:"apache",extensions:["pcf"]},"application/x-font-snf":{source:"apache",extensions:["snf"]},"application/x-font-speedo":{source:"apache"},"application/x-font-sunos-news":{source:"apache"},"application/x-font-type1":{source:"apache",extensions:["pfa","pfb","pfm","afm"]},"application/x-font-vfont":{source:"apache"},"application/x-freearc":{source:"apache",extensions:["arc"]},"application/x-futuresplash":{source:"apache",extensions:["spl"]},"application/x-gca-compressed":{source:"apache",extensions:["gca"]},"application/x-glulx":{source:"apache",extensions:["ulx"]},"application/x-gnumeric":{source:"apache",extensions:["gnumeric"]},"application/x-gramps-xml":{source:"apache",extensions:["gramps"]},"application/x-gtar":{source:"apache",extensions:["gtar"]},"application/x-gzip":{source:"apache"},"application/x-hdf":{source:"apache",extensions:["hdf"]},"application/x-httpd-php":{compressible:!0,extensions:["php"]},"application/x-install-instructions":{source:"apache",extensions:["install"]},"application/x-iso9660-image":{source:"apache",extensions:["iso"]},"application/x-iwork-keynote-sffkey":{extensions:["key"]},"application/x-iwork-numbers-sffnumbers":{extensions:["numbers"]},"application/x-iwork-pages-sffpages":{extensions:["pages"]},"application/x-java-archive-diff":{source:"nginx",extensions:["jardiff"]},"application/x-java-jnlp-file":{source:"apache",compressible:!1,extensions:["jnlp"]},"application/x-javascript":{compressible:!0},"application/x-keepass2":{extensions:["kdbx"]},"application/x-latex":{source:"apache",compressible:!1,extensions:["latex"]},"application/x-lua-bytecode":{extensions:["luac"]},"application/x-lzh-compressed":{source:"apache",extensions:["lzh","lha"]},"application/x-makeself":{source:"nginx",extensions:["run"]},"application/x-mie":{source:"apache",extensions:["mie"]},"application/x-mobipocket-ebook":{source:"apache",extensions:["prc","mobi"]},"application/x-mpegurl":{compressible:!1},"application/x-ms-application":{source:"apache",extensions:["application"]},"application/x-ms-shortcut":{source:"apache",extensions:["lnk"]},"application/x-ms-wmd":{source:"apache",extensions:["wmd"]},"application/x-ms-wmz":{source:"apache",extensions:["wmz"]},"application/x-ms-xbap":{source:"apache",extensions:["xbap"]},"application/x-msaccess":{source:"apache",extensions:["mdb"]},"application/x-msbinder":{source:"apache",extensions:["obd"]},"application/x-mscardfile":{source:"apache",extensions:["crd"]},"application/x-msclip":{source:"apache",extensions:["clp"]},"application/x-msdos-program":{extensions:["exe"]},"application/x-msdownload":{source:"apache",extensions:["exe","dll","com","bat","msi"]},"application/x-msmediaview":{source:"apache",extensions:["mvb","m13","m14"]},"application/x-msmetafile":{source:"apache",extensions:["wmf","wmz","emf","emz"]},"application/x-msmoney":{source:"apache",extensions:["mny"]},"application/x-mspublisher":{source:"apache",extensions:["pub"]},"application/x-msschedule":{source:"apache",extensions:["scd"]},"application/x-msterminal":{source:"apache",extensions:["trm"]},"application/x-mswrite":{source:"apache",extensions:["wri"]},"application/x-netcdf":{source:"apache",extensions:["nc","cdf"]},"application/x-ns-proxy-autoconfig":{compressible:!0,extensions:["pac"]},"application/x-nzb":{source:"apache",extensions:["nzb"]},"application/x-perl":{source:"nginx",extensions:["pl","pm"]},"application/x-pilot":{source:"nginx",extensions:["prc","pdb"]},"application/x-pkcs12":{source:"apache",compressible:!1,extensions:["p12","pfx"]},"application/x-pkcs7-certificates":{source:"apache",extensions:["p7b","spc"]},"application/x-pkcs7-certreqresp":{source:"apache",extensions:["p7r"]},"application/x-pki-message":{source:"iana"},"application/x-rar-compressed":{source:"apache",compressible:!1,extensions:["rar"]},"application/x-redhat-package-manager":{source:"nginx",extensions:["rpm"]},"application/x-research-info-systems":{source:"apache",extensions:["ris"]},"application/x-sea":{source:"nginx",extensions:["sea"]},"application/x-sh":{source:"apache",compressible:!0,extensions:["sh"]},"application/x-shar":{source:"apache",extensions:["shar"]},"application/x-shockwave-flash":{source:"apache",compressible:!1,extensions:["swf"]},"application/x-silverlight-app":{source:"apache",extensions:["xap"]},"application/x-sql":{source:"apache",extensions:["sql"]},"application/x-stuffit":{source:"apache",compressible:!1,extensions:["sit"]},"application/x-stuffitx":{source:"apache",extensions:["sitx"]},"application/x-subrip":{source:"apache",extensions:["srt"]},"application/x-sv4cpio":{source:"apache",extensions:["sv4cpio"]},"application/x-sv4crc":{source:"apache",extensions:["sv4crc"]},"application/x-t3vm-image":{source:"apache",extensions:["t3"]},"application/x-tads":{source:"apache",extensions:["gam"]},"application/x-tar":{source:"apache",compressible:!0,extensions:["tar"]},"application/x-tcl":{source:"apache",extensions:["tcl","tk"]},"application/x-tex":{source:"apache",extensions:["tex"]},"application/x-tex-tfm":{source:"apache",extensions:["tfm"]},"application/x-texinfo":{source:"apache",extensions:["texinfo","texi"]},"application/x-tgif":{source:"apache",extensions:["obj"]},"application/x-ustar":{source:"apache",extensions:["ustar"]},"application/x-virtualbox-hdd":{compressible:!0,extensions:["hdd"]},"application/x-virtualbox-ova":{compressible:!0,extensions:["ova"]},"application/x-virtualbox-ovf":{compressible:!0,extensions:["ovf"]},"application/x-virtualbox-vbox":{compressible:!0,extensions:["vbox"]},"application/x-virtualbox-vbox-extpack":{compressible:!1,extensions:["vbox-extpack"]},"application/x-virtualbox-vdi":{compressible:!0,extensions:["vdi"]},"application/x-virtualbox-vhd":{compressible:!0,extensions:["vhd"]},"application/x-virtualbox-vmdk":{compressible:!0,extensions:["vmdk"]},"application/x-wais-source":{source:"apache",extensions:["src"]},"application/x-web-app-manifest+json":{compressible:!0,extensions:["webapp"]},"application/x-www-form-urlencoded":{source:"iana",compressible:!0},"application/x-x509-ca-cert":{source:"iana",extensions:["der","crt","pem"]},"application/x-x509-ca-ra-cert":{source:"iana"},"application/x-x509-next-ca-cert":{source:"iana"},"application/x-xfig":{source:"apache",extensions:["fig"]},"application/x-xliff+xml":{source:"apache",compressible:!0,extensions:["xlf"]},"application/x-xpinstall":{source:"apache",compressible:!1,extensions:["xpi"]},"application/x-xz":{source:"apache",extensions:["xz"]},"application/x-zmachine":{source:"apache",extensions:["z1","z2","z3","z4","z5","z6","z7","z8"]},"application/x400-bp":{source:"iana"},"application/xacml+xml":{source:"iana",compressible:!0},"application/xaml+xml":{source:"apache",compressible:!0,extensions:["xaml"]},"application/xcap-att+xml":{source:"iana",compressible:!0,extensions:["xav"]},"application/xcap-caps+xml":{source:"iana",compressible:!0,extensions:["xca"]},"application/xcap-diff+xml":{source:"iana",compressible:!0,extensions:["xdf"]},"application/xcap-el+xml":{source:"iana",compressible:!0,extensions:["xel"]},"application/xcap-error+xml":{source:"iana",compressible:!0},"application/xcap-ns+xml":{source:"iana",compressible:!0,extensions:["xns"]},"application/xcon-conference-info+xml":{source:"iana",compressible:!0},"application/xcon-conference-info-diff+xml":{source:"iana",compressible:!0},"application/xenc+xml":{source:"iana",compressible:!0,extensions:["xenc"]},"application/xhtml+xml":{source:"iana",compressible:!0,extensions:["xhtml","xht"]},"application/xhtml-voice+xml":{source:"apache",compressible:!0},"application/xliff+xml":{source:"iana",compressible:!0,extensions:["xlf"]},"application/xml":{source:"iana",compressible:!0,extensions:["xml","xsl","xsd","rng"]},"application/xml-dtd":{source:"iana",compressible:!0,extensions:["dtd"]},"application/xml-external-parsed-entity":{source:"iana"},"application/xml-patch+xml":{source:"iana",compressible:!0},"application/xmpp+xml":{source:"iana",compressible:!0},"application/xop+xml":{source:"iana",compressible:!0,extensions:["xop"]},"application/xproc+xml":{source:"apache",compressible:!0,extensions:["xpl"]},"application/xslt+xml":{source:"iana",compressible:!0,extensions:["xsl","xslt"]},"application/xspf+xml":{source:"apache",compressible:!0,extensions:["xspf"]},"application/xv+xml":{source:"iana",compressible:!0,extensions:["mxml","xhvml","xvml","xvm"]},"application/yang":{source:"iana",extensions:["yang"]},"application/yang-data+json":{source:"iana",compressible:!0},"application/yang-data+xml":{source:"iana",compressible:!0},"application/yang-patch+json":{source:"iana",compressible:!0},"application/yang-patch+xml":{source:"iana",compressible:!0},"application/yin+xml":{source:"iana",compressible:!0,extensions:["yin"]},"application/zip":{source:"iana",compressible:!1,extensions:["zip"]},"application/zlib":{source:"iana"},"application/zstd":{source:"iana"},"audio/1d-interleaved-parityfec":{source:"iana"},"audio/32kadpcm":{source:"iana"},"audio/3gpp":{source:"iana",compressible:!1,extensions:["3gpp"]},"audio/3gpp2":{source:"iana"},"audio/aac":{source:"iana"},"audio/ac3":{source:"iana"},"audio/adpcm":{source:"apache",extensions:["adp"]},"audio/amr":{source:"iana",extensions:["amr"]},"audio/amr-wb":{source:"iana"},"audio/amr-wb+":{source:"iana"},"audio/aptx":{source:"iana"},"audio/asc":{source:"iana"},"audio/atrac-advanced-lossless":{source:"iana"},"audio/atrac-x":{source:"iana"},"audio/atrac3":{source:"iana"},"audio/basic":{source:"iana",compressible:!1,extensions:["au","snd"]},"audio/bv16":{source:"iana"},"audio/bv32":{source:"iana"},"audio/clearmode":{source:"iana"},"audio/cn":{source:"iana"},"audio/dat12":{source:"iana"},"audio/dls":{source:"iana"},"audio/dsr-es201108":{source:"iana"},"audio/dsr-es202050":{source:"iana"},"audio/dsr-es202211":{source:"iana"},"audio/dsr-es202212":{source:"iana"},"audio/dv":{source:"iana"},"audio/dvi4":{source:"iana"},"audio/eac3":{source:"iana"},"audio/encaprtp":{source:"iana"},"audio/evrc":{source:"iana"},"audio/evrc-qcp":{source:"iana"},"audio/evrc0":{source:"iana"},"audio/evrc1":{source:"iana"},"audio/evrcb":{source:"iana"},"audio/evrcb0":{source:"iana"},"audio/evrcb1":{source:"iana"},"audio/evrcnw":{source:"iana"},"audio/evrcnw0":{source:"iana"},"audio/evrcnw1":{source:"iana"},"audio/evrcwb":{source:"iana"},"audio/evrcwb0":{source:"iana"},"audio/evrcwb1":{source:"iana"},"audio/evs":{source:"iana"},"audio/flexfec":{source:"iana"},"audio/fwdred":{source:"iana"},"audio/g711-0":{source:"iana"},"audio/g719":{source:"iana"},"audio/g722":{source:"iana"},"audio/g7221":{source:"iana"},"audio/g723":{source:"iana"},"audio/g726-16":{source:"iana"},"audio/g726-24":{source:"iana"},"audio/g726-32":{source:"iana"},"audio/g726-40":{source:"iana"},"audio/g728":{source:"iana"},"audio/g729":{source:"iana"},"audio/g7291":{source:"iana"},"audio/g729d":{source:"iana"},"audio/g729e":{source:"iana"},"audio/gsm":{source:"iana"},"audio/gsm-efr":{source:"iana"},"audio/gsm-hr-08":{source:"iana"},"audio/ilbc":{source:"iana"},"audio/ip-mr_v2.5":{source:"iana"},"audio/isac":{source:"apache"},"audio/l16":{source:"iana"},"audio/l20":{source:"iana"},"audio/l24":{source:"iana",compressible:!1},"audio/l8":{source:"iana"},"audio/lpc":{source:"iana"},"audio/melp":{source:"iana"},"audio/melp1200":{source:"iana"},"audio/melp2400":{source:"iana"},"audio/melp600":{source:"iana"},"audio/mhas":{source:"iana"},"audio/midi":{source:"apache",extensions:["mid","midi","kar","rmi"]},"audio/mobile-xmf":{source:"iana",extensions:["mxmf"]},"audio/mp3":{compressible:!1,extensions:["mp3"]},"audio/mp4":{source:"iana",compressible:!1,extensions:["m4a","mp4a"]},"audio/mp4a-latm":{source:"iana"},"audio/mpa":{source:"iana"},"audio/mpa-robust":{source:"iana"},"audio/mpeg":{source:"iana",compressible:!1,extensions:["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/mpeg4-generic":{source:"iana"},"audio/musepack":{source:"apache"},"audio/ogg":{source:"iana",compressible:!1,extensions:["oga","ogg","spx","opus"]},"audio/opus":{source:"iana"},"audio/parityfec":{source:"iana"},"audio/pcma":{source:"iana"},"audio/pcma-wb":{source:"iana"},"audio/pcmu":{source:"iana"},"audio/pcmu-wb":{source:"iana"},"audio/prs.sid":{source:"iana"},"audio/qcelp":{source:"iana"},"audio/raptorfec":{source:"iana"},"audio/red":{source:"iana"},"audio/rtp-enc-aescm128":{source:"iana"},"audio/rtp-midi":{source:"iana"},"audio/rtploopback":{source:"iana"},"audio/rtx":{source:"iana"},"audio/s3m":{source:"apache",extensions:["s3m"]},"audio/scip":{source:"iana"},"audio/silk":{source:"apache",extensions:["sil"]},"audio/smv":{source:"iana"},"audio/smv-qcp":{source:"iana"},"audio/smv0":{source:"iana"},"audio/sofa":{source:"iana"},"audio/sp-midi":{source:"iana"},"audio/speex":{source:"iana"},"audio/t140c":{source:"iana"},"audio/t38":{source:"iana"},"audio/telephone-event":{source:"iana"},"audio/tetra_acelp":{source:"iana"},"audio/tetra_acelp_bb":{source:"iana"},"audio/tone":{source:"iana"},"audio/tsvcis":{source:"iana"},"audio/uemclip":{source:"iana"},"audio/ulpfec":{source:"iana"},"audio/usac":{source:"iana"},"audio/vdvi":{source:"iana"},"audio/vmr-wb":{source:"iana"},"audio/vnd.3gpp.iufp":{source:"iana"},"audio/vnd.4sb":{source:"iana"},"audio/vnd.audiokoz":{source:"iana"},"audio/vnd.celp":{source:"iana"},"audio/vnd.cisco.nse":{source:"iana"},"audio/vnd.cmles.radio-events":{source:"iana"},"audio/vnd.cns.anp1":{source:"iana"},"audio/vnd.cns.inf1":{source:"iana"},"audio/vnd.dece.audio":{source:"iana",extensions:["uva","uvva"]},"audio/vnd.digital-winds":{source:"iana",extensions:["eol"]},"audio/vnd.dlna.adts":{source:"iana"},"audio/vnd.dolby.heaac.1":{source:"iana"},"audio/vnd.dolby.heaac.2":{source:"iana"},"audio/vnd.dolby.mlp":{source:"iana"},"audio/vnd.dolby.mps":{source:"iana"},"audio/vnd.dolby.pl2":{source:"iana"},"audio/vnd.dolby.pl2x":{source:"iana"},"audio/vnd.dolby.pl2z":{source:"iana"},"audio/vnd.dolby.pulse.1":{source:"iana"},"audio/vnd.dra":{source:"iana",extensions:["dra"]},"audio/vnd.dts":{source:"iana",extensions:["dts"]},"audio/vnd.dts.hd":{source:"iana",extensions:["dtshd"]},"audio/vnd.dts.uhd":{source:"iana"},"audio/vnd.dvb.file":{source:"iana"},"audio/vnd.everad.plj":{source:"iana"},"audio/vnd.hns.audio":{source:"iana"},"audio/vnd.lucent.voice":{source:"iana",extensions:["lvp"]},"audio/vnd.ms-playready.media.pya":{source:"iana",extensions:["pya"]},"audio/vnd.nokia.mobile-xmf":{source:"iana"},"audio/vnd.nortel.vbk":{source:"iana"},"audio/vnd.nuera.ecelp4800":{source:"iana",extensions:["ecelp4800"]},"audio/vnd.nuera.ecelp7470":{source:"iana",extensions:["ecelp7470"]},"audio/vnd.nuera.ecelp9600":{source:"iana",extensions:["ecelp9600"]},"audio/vnd.octel.sbc":{source:"iana"},"audio/vnd.presonus.multitrack":{source:"iana"},"audio/vnd.qcelp":{source:"iana"},"audio/vnd.rhetorex.32kadpcm":{source:"iana"},"audio/vnd.rip":{source:"iana",extensions:["rip"]},"audio/vnd.rn-realaudio":{compressible:!1},"audio/vnd.sealedmedia.softseal.mpeg":{source:"iana"},"audio/vnd.vmx.cvsd":{source:"iana"},"audio/vnd.wave":{compressible:!1},"audio/vorbis":{source:"iana",compressible:!1},"audio/vorbis-config":{source:"iana"},"audio/wav":{compressible:!1,extensions:["wav"]},"audio/wave":{compressible:!1,extensions:["wav"]},"audio/webm":{source:"apache",compressible:!1,extensions:["weba"]},"audio/x-aac":{source:"apache",compressible:!1,extensions:["aac"]},"audio/x-aiff":{source:"apache",extensions:["aif","aiff","aifc"]},"audio/x-caf":{source:"apache",compressible:!1,extensions:["caf"]},"audio/x-flac":{source:"apache",extensions:["flac"]},"audio/x-m4a":{source:"nginx",extensions:["m4a"]},"audio/x-matroska":{source:"apache",extensions:["mka"]},"audio/x-mpegurl":{source:"apache",extensions:["m3u"]},"audio/x-ms-wax":{source:"apache",extensions:["wax"]},"audio/x-ms-wma":{source:"apache",extensions:["wma"]},"audio/x-pn-realaudio":{source:"apache",extensions:["ram","ra"]},"audio/x-pn-realaudio-plugin":{source:"apache",extensions:["rmp"]},"audio/x-realaudio":{source:"nginx",extensions:["ra"]},"audio/x-tta":{source:"apache"},"audio/x-wav":{source:"apache",extensions:["wav"]},"audio/xm":{source:"apache",extensions:["xm"]},"chemical/x-cdx":{source:"apache",extensions:["cdx"]},"chemical/x-cif":{source:"apache",extensions:["cif"]},"chemical/x-cmdf":{source:"apache",extensions:["cmdf"]},"chemical/x-cml":{source:"apache",extensions:["cml"]},"chemical/x-csml":{source:"apache",extensions:["csml"]},"chemical/x-pdb":{source:"apache"},"chemical/x-xyz":{source:"apache",extensions:["xyz"]},"font/collection":{source:"iana",extensions:["ttc"]},"font/otf":{source:"iana",compressible:!0,extensions:["otf"]},"font/sfnt":{source:"iana"},"font/ttf":{source:"iana",compressible:!0,extensions:["ttf"]},"font/woff":{source:"iana",extensions:["woff"]},"font/woff2":{source:"iana",extensions:["woff2"]},"image/aces":{source:"iana",extensions:["exr"]},"image/apng":{compressible:!1,extensions:["apng"]},"image/avci":{source:"iana",extensions:["avci"]},"image/avcs":{source:"iana",extensions:["avcs"]},"image/avif":{source:"iana",compressible:!1,extensions:["avif"]},"image/bmp":{source:"iana",compressible:!0,extensions:["bmp"]},"image/cgm":{source:"iana",extensions:["cgm"]},"image/dicom-rle":{source:"iana",extensions:["drle"]},"image/emf":{source:"iana",extensions:["emf"]},"image/fits":{source:"iana",extensions:["fits"]},"image/g3fax":{source:"iana",extensions:["g3"]},"image/gif":{source:"iana",compressible:!1,extensions:["gif"]},"image/heic":{source:"iana",extensions:["heic"]},"image/heic-sequence":{source:"iana",extensions:["heics"]},"image/heif":{source:"iana",extensions:["heif"]},"image/heif-sequence":{source:"iana",extensions:["heifs"]},"image/hej2k":{source:"iana",extensions:["hej2"]},"image/hsj2":{source:"iana",extensions:["hsj2"]},"image/ief":{source:"iana",extensions:["ief"]},"image/jls":{source:"iana",extensions:["jls"]},"image/jp2":{source:"iana",compressible:!1,extensions:["jp2","jpg2"]},"image/jpeg":{source:"iana",compressible:!1,extensions:["jpeg","jpg","jpe"]},"image/jph":{source:"iana",extensions:["jph"]},"image/jphc":{source:"iana",extensions:["jhc"]},"image/jpm":{source:"iana",compressible:!1,extensions:["jpm"]},"image/jpx":{source:"iana",compressible:!1,extensions:["jpx","jpf"]},"image/jxr":{source:"iana",extensions:["jxr"]},"image/jxra":{source:"iana",extensions:["jxra"]},"image/jxrs":{source:"iana",extensions:["jxrs"]},"image/jxs":{source:"iana",extensions:["jxs"]},"image/jxsc":{source:"iana",extensions:["jxsc"]},"image/jxsi":{source:"iana",extensions:["jxsi"]},"image/jxss":{source:"iana",extensions:["jxss"]},"image/ktx":{source:"iana",extensions:["ktx"]},"image/ktx2":{source:"iana",extensions:["ktx2"]},"image/naplps":{source:"iana"},"image/pjpeg":{compressible:!1},"image/png":{source:"iana",compressible:!1,extensions:["png"]},"image/prs.btif":{source:"iana",extensions:["btif"]},"image/prs.pti":{source:"iana",extensions:["pti"]},"image/pwg-raster":{source:"iana"},"image/sgi":{source:"apache",extensions:["sgi"]},"image/svg+xml":{source:"iana",compressible:!0,extensions:["svg","svgz"]},"image/t38":{source:"iana",extensions:["t38"]},"image/tiff":{source:"iana",compressible:!1,extensions:["tif","tiff"]},"image/tiff-fx":{source:"iana",extensions:["tfx"]},"image/vnd.adobe.photoshop":{source:"iana",compressible:!0,extensions:["psd"]},"image/vnd.airzip.accelerator.azv":{source:"iana",extensions:["azv"]},"image/vnd.cns.inf2":{source:"iana"},"image/vnd.dece.graphic":{source:"iana",extensions:["uvi","uvvi","uvg","uvvg"]},"image/vnd.djvu":{source:"iana",extensions:["djvu","djv"]},"image/vnd.dvb.subtitle":{source:"iana",extensions:["sub"]},"image/vnd.dwg":{source:"iana",extensions:["dwg"]},"image/vnd.dxf":{source:"iana",extensions:["dxf"]},"image/vnd.fastbidsheet":{source:"iana",extensions:["fbs"]},"image/vnd.fpx":{source:"iana",extensions:["fpx"]},"image/vnd.fst":{source:"iana",extensions:["fst"]},"image/vnd.fujixerox.edmics-mmr":{source:"iana",extensions:["mmr"]},"image/vnd.fujixerox.edmics-rlc":{source:"iana",extensions:["rlc"]},"image/vnd.globalgraphics.pgb":{source:"iana"},"image/vnd.microsoft.icon":{source:"iana",compressible:!0,extensions:["ico"]},"image/vnd.mix":{source:"iana"},"image/vnd.mozilla.apng":{source:"iana"},"image/vnd.ms-dds":{compressible:!0,extensions:["dds"]},"image/vnd.ms-modi":{source:"iana",extensions:["mdi"]},"image/vnd.ms-photo":{source:"apache",extensions:["wdp"]},"image/vnd.net-fpx":{source:"iana",extensions:["npx"]},"image/vnd.pco.b16":{source:"iana",extensions:["b16"]},"image/vnd.radiance":{source:"iana"},"image/vnd.sealed.png":{source:"iana"},"image/vnd.sealedmedia.softseal.gif":{source:"iana"},"image/vnd.sealedmedia.softseal.jpg":{source:"iana"},"image/vnd.svf":{source:"iana"},"image/vnd.tencent.tap":{source:"iana",extensions:["tap"]},"image/vnd.valve.source.texture":{source:"iana",extensions:["vtf"]},"image/vnd.wap.wbmp":{source:"iana",extensions:["wbmp"]},"image/vnd.xiff":{source:"iana",extensions:["xif"]},"image/vnd.zbrush.pcx":{source:"iana",extensions:["pcx"]},"image/webp":{source:"apache",extensions:["webp"]},"image/wmf":{source:"iana",extensions:["wmf"]},"image/x-3ds":{source:"apache",extensions:["3ds"]},"image/x-cmu-raster":{source:"apache",extensions:["ras"]},"image/x-cmx":{source:"apache",extensions:["cmx"]},"image/x-freehand":{source:"apache",extensions:["fh","fhc","fh4","fh5","fh7"]},"image/x-icon":{source:"apache",compressible:!0,extensions:["ico"]},"image/x-jng":{source:"nginx",extensions:["jng"]},"image/x-mrsid-image":{source:"apache",extensions:["sid"]},"image/x-ms-bmp":{source:"nginx",compressible:!0,extensions:["bmp"]},"image/x-pcx":{source:"apache",extensions:["pcx"]},"image/x-pict":{source:"apache",extensions:["pic","pct"]},"image/x-portable-anymap":{source:"apache",extensions:["pnm"]},"image/x-portable-bitmap":{source:"apache",extensions:["pbm"]},"image/x-portable-graymap":{source:"apache",extensions:["pgm"]},"image/x-portable-pixmap":{source:"apache",extensions:["ppm"]},"image/x-rgb":{source:"apache",extensions:["rgb"]},"image/x-tga":{source:"apache",extensions:["tga"]},"image/x-xbitmap":{source:"apache",extensions:["xbm"]},"image/x-xcf":{compressible:!1},"image/x-xpixmap":{source:"apache",extensions:["xpm"]},"image/x-xwindowdump":{source:"apache",extensions:["xwd"]},"message/cpim":{source:"iana"},"message/delivery-status":{source:"iana"},"message/disposition-notification":{source:"iana",extensions:["disposition-notification"]},"message/external-body":{source:"iana"},"message/feedback-report":{source:"iana"},"message/global":{source:"iana",extensions:["u8msg"]},"message/global-delivery-status":{source:"iana",extensions:["u8dsn"]},"message/global-disposition-notification":{source:"iana",extensions:["u8mdn"]},"message/global-headers":{source:"iana",extensions:["u8hdr"]},"message/http":{source:"iana",compressible:!1},"message/imdn+xml":{source:"iana",compressible:!0},"message/news":{source:"iana"},"message/partial":{source:"iana",compressible:!1},"message/rfc822":{source:"iana",compressible:!0,extensions:["eml","mime"]},"message/s-http":{source:"iana"},"message/sip":{source:"iana"},"message/sipfrag":{source:"iana"},"message/tracking-status":{source:"iana"},"message/vnd.si.simp":{source:"iana"},"message/vnd.wfa.wsc":{source:"iana",extensions:["wsc"]},"model/3mf":{source:"iana",extensions:["3mf"]},"model/e57":{source:"iana"},"model/gltf+json":{source:"iana",compressible:!0,extensions:["gltf"]},"model/gltf-binary":{source:"iana",compressible:!0,extensions:["glb"]},"model/iges":{source:"iana",compressible:!1,extensions:["igs","iges"]},"model/mesh":{source:"iana",compressible:!1,extensions:["msh","mesh","silo"]},"model/mtl":{source:"iana",extensions:["mtl"]},"model/obj":{source:"iana",extensions:["obj"]},"model/step":{source:"iana"},"model/step+xml":{source:"iana",compressible:!0,extensions:["stpx"]},"model/step+zip":{source:"iana",compressible:!1,extensions:["stpz"]},"model/step-xml+zip":{source:"iana",compressible:!1,extensions:["stpxz"]},"model/stl":{source:"iana",extensions:["stl"]},"model/vnd.collada+xml":{source:"iana",compressible:!0,extensions:["dae"]},"model/vnd.dwf":{source:"iana",extensions:["dwf"]},"model/vnd.flatland.3dml":{source:"iana"},"model/vnd.gdl":{source:"iana",extensions:["gdl"]},"model/vnd.gs-gdl":{source:"apache"},"model/vnd.gs.gdl":{source:"iana"},"model/vnd.gtw":{source:"iana",extensions:["gtw"]},"model/vnd.moml+xml":{source:"iana",compressible:!0},"model/vnd.mts":{source:"iana",extensions:["mts"]},"model/vnd.opengex":{source:"iana",extensions:["ogex"]},"model/vnd.parasolid.transmit.binary":{source:"iana",extensions:["x_b"]},"model/vnd.parasolid.transmit.text":{source:"iana",extensions:["x_t"]},"model/vnd.pytha.pyox":{source:"iana"},"model/vnd.rosette.annotated-data-model":{source:"iana"},"model/vnd.sap.vds":{source:"iana",extensions:["vds"]},"model/vnd.usdz+zip":{source:"iana",compressible:!1,extensions:["usdz"]},"model/vnd.valve.source.compiled-map":{source:"iana",extensions:["bsp"]},"model/vnd.vtu":{source:"iana",extensions:["vtu"]},"model/vrml":{source:"iana",compressible:!1,extensions:["wrl","vrml"]},"model/x3d+binary":{source:"apache",compressible:!1,extensions:["x3db","x3dbz"]},"model/x3d+fastinfoset":{source:"iana",extensions:["x3db"]},"model/x3d+vrml":{source:"apache",compressible:!1,extensions:["x3dv","x3dvz"]},"model/x3d+xml":{source:"iana",compressible:!0,extensions:["x3d","x3dz"]},"model/x3d-vrml":{source:"iana",extensions:["x3dv"]},"multipart/alternative":{source:"iana",compressible:!1},"multipart/appledouble":{source:"iana"},"multipart/byteranges":{source:"iana"},"multipart/digest":{source:"iana"},"multipart/encrypted":{source:"iana",compressible:!1},"multipart/form-data":{source:"iana",compressible:!1},"multipart/header-set":{source:"iana"},"multipart/mixed":{source:"iana"},"multipart/multilingual":{source:"iana"},"multipart/parallel":{source:"iana"},"multipart/related":{source:"iana",compressible:!1},"multipart/report":{source:"iana"},"multipart/signed":{source:"iana",compressible:!1},"multipart/vnd.bint.med-plus":{source:"iana"},"multipart/voice-message":{source:"iana"},"multipart/x-mixed-replace":{source:"iana"},"text/1d-interleaved-parityfec":{source:"iana"},"text/cache-manifest":{source:"iana",compressible:!0,extensions:["appcache","manifest"]},"text/calendar":{source:"iana",extensions:["ics","ifb"]},"text/calender":{compressible:!0},"text/cmd":{compressible:!0},"text/coffeescript":{extensions:["coffee","litcoffee"]},"text/cql":{source:"iana"},"text/cql-expression":{source:"iana"},"text/cql-identifier":{source:"iana"},"text/css":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["css"]},"text/csv":{source:"iana",compressible:!0,extensions:["csv"]},"text/csv-schema":{source:"iana"},"text/directory":{source:"iana"},"text/dns":{source:"iana"},"text/ecmascript":{source:"iana"},"text/encaprtp":{source:"iana"},"text/enriched":{source:"iana"},"text/fhirpath":{source:"iana"},"text/flexfec":{source:"iana"},"text/fwdred":{source:"iana"},"text/gff3":{source:"iana"},"text/grammar-ref-list":{source:"iana"},"text/html":{source:"iana",compressible:!0,extensions:["html","htm","shtml"]},"text/jade":{extensions:["jade"]},"text/javascript":{source:"iana",compressible:!0},"text/jcr-cnd":{source:"iana"},"text/jsx":{compressible:!0,extensions:["jsx"]},"text/less":{compressible:!0,extensions:["less"]},"text/markdown":{source:"iana",compressible:!0,extensions:["markdown","md"]},"text/mathml":{source:"nginx",extensions:["mml"]},"text/mdx":{compressible:!0,extensions:["mdx"]},"text/mizar":{source:"iana"},"text/n3":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["n3"]},"text/parameters":{source:"iana",charset:"UTF-8"},"text/parityfec":{source:"iana"},"text/plain":{source:"iana",compressible:!0,extensions:["txt","text","conf","def","list","log","in","ini"]},"text/provenance-notation":{source:"iana",charset:"UTF-8"},"text/prs.fallenstein.rst":{source:"iana"},"text/prs.lines.tag":{source:"iana",extensions:["dsc"]},"text/prs.prop.logic":{source:"iana"},"text/raptorfec":{source:"iana"},"text/red":{source:"iana"},"text/rfc822-headers":{source:"iana"},"text/richtext":{source:"iana",compressible:!0,extensions:["rtx"]},"text/rtf":{source:"iana",compressible:!0,extensions:["rtf"]},"text/rtp-enc-aescm128":{source:"iana"},"text/rtploopback":{source:"iana"},"text/rtx":{source:"iana"},"text/sgml":{source:"iana",extensions:["sgml","sgm"]},"text/shaclc":{source:"iana"},"text/shex":{source:"iana",extensions:["shex"]},"text/slim":{extensions:["slim","slm"]},"text/spdx":{source:"iana",extensions:["spdx"]},"text/strings":{source:"iana"},"text/stylus":{extensions:["stylus","styl"]},"text/t140":{source:"iana"},"text/tab-separated-values":{source:"iana",compressible:!0,extensions:["tsv"]},"text/troff":{source:"iana",extensions:["t","tr","roff","man","me","ms"]},"text/turtle":{source:"iana",charset:"UTF-8",extensions:["ttl"]},"text/ulpfec":{source:"iana"},"text/uri-list":{source:"iana",compressible:!0,extensions:["uri","uris","urls"]},"text/vcard":{source:"iana",compressible:!0,extensions:["vcard"]},"text/vnd.a":{source:"iana"},"text/vnd.abc":{source:"iana"},"text/vnd.ascii-art":{source:"iana"},"text/vnd.curl":{source:"iana",extensions:["curl"]},"text/vnd.curl.dcurl":{source:"apache",extensions:["dcurl"]},"text/vnd.curl.mcurl":{source:"apache",extensions:["mcurl"]},"text/vnd.curl.scurl":{source:"apache",extensions:["scurl"]},"text/vnd.debian.copyright":{source:"iana",charset:"UTF-8"},"text/vnd.dmclientscript":{source:"iana"},"text/vnd.dvb.subtitle":{source:"iana",extensions:["sub"]},"text/vnd.esmertec.theme-descriptor":{source:"iana",charset:"UTF-8"},"text/vnd.familysearch.gedcom":{source:"iana",extensions:["ged"]},"text/vnd.ficlab.flt":{source:"iana"},"text/vnd.fly":{source:"iana",extensions:["fly"]},"text/vnd.fmi.flexstor":{source:"iana",extensions:["flx"]},"text/vnd.gml":{source:"iana"},"text/vnd.graphviz":{source:"iana",extensions:["gv"]},"text/vnd.hans":{source:"iana"},"text/vnd.hgl":{source:"iana"},"text/vnd.in3d.3dml":{source:"iana",extensions:["3dml"]},"text/vnd.in3d.spot":{source:"iana",extensions:["spot"]},"text/vnd.iptc.newsml":{source:"iana"},"text/vnd.iptc.nitf":{source:"iana"},"text/vnd.latex-z":{source:"iana"},"text/vnd.motorola.reflex":{source:"iana"},"text/vnd.ms-mediapackage":{source:"iana"},"text/vnd.net2phone.commcenter.command":{source:"iana"},"text/vnd.radisys.msml-basic-layout":{source:"iana"},"text/vnd.senx.warpscript":{source:"iana"},"text/vnd.si.uricatalogue":{source:"iana"},"text/vnd.sosi":{source:"iana"},"text/vnd.sun.j2me.app-descriptor":{source:"iana",charset:"UTF-8",extensions:["jad"]},"text/vnd.trolltech.linguist":{source:"iana",charset:"UTF-8"},"text/vnd.wap.si":{source:"iana"},"text/vnd.wap.sl":{source:"iana"},"text/vnd.wap.wml":{source:"iana",extensions:["wml"]},"text/vnd.wap.wmlscript":{source:"iana",extensions:["wmls"]},"text/vtt":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["vtt"]},"text/x-asm":{source:"apache",extensions:["s","asm"]},"text/x-c":{source:"apache",extensions:["c","cc","cxx","cpp","h","hh","dic"]},"text/x-component":{source:"nginx",extensions:["htc"]},"text/x-fortran":{source:"apache",extensions:["f","for","f77","f90"]},"text/x-gwt-rpc":{compressible:!0},"text/x-handlebars-template":{extensions:["hbs"]},"text/x-java-source":{source:"apache",extensions:["java"]},"text/x-jquery-tmpl":{compressible:!0},"text/x-lua":{extensions:["lua"]},"text/x-markdown":{compressible:!0,extensions:["mkd"]},"text/x-nfo":{source:"apache",extensions:["nfo"]},"text/x-opml":{source:"apache",extensions:["opml"]},"text/x-org":{compressible:!0,extensions:["org"]},"text/x-pascal":{source:"apache",extensions:["p","pas"]},"text/x-processing":{compressible:!0,extensions:["pde"]},"text/x-sass":{extensions:["sass"]},"text/x-scss":{extensions:["scss"]},"text/x-setext":{source:"apache",extensions:["etx"]},"text/x-sfv":{source:"apache",extensions:["sfv"]},"text/x-suse-ymp":{compressible:!0,extensions:["ymp"]},"text/x-uuencode":{source:"apache",extensions:["uu"]},"text/x-vcalendar":{source:"apache",extensions:["vcs"]},"text/x-vcard":{source:"apache",extensions:["vcf"]},"text/xml":{source:"iana",compressible:!0,extensions:["xml"]},"text/xml-external-parsed-entity":{source:"iana"},"text/yaml":{compressible:!0,extensions:["yaml","yml"]},"video/1d-interleaved-parityfec":{source:"iana"},"video/3gpp":{source:"iana",extensions:["3gp","3gpp"]},"video/3gpp-tt":{source:"iana"},"video/3gpp2":{source:"iana",extensions:["3g2"]},"video/av1":{source:"iana"},"video/bmpeg":{source:"iana"},"video/bt656":{source:"iana"},"video/celb":{source:"iana"},"video/dv":{source:"iana"},"video/encaprtp":{source:"iana"},"video/ffv1":{source:"iana"},"video/flexfec":{source:"iana"},"video/h261":{source:"iana",extensions:["h261"]},"video/h263":{source:"iana",extensions:["h263"]},"video/h263-1998":{source:"iana"},"video/h263-2000":{source:"iana"},"video/h264":{source:"iana",extensions:["h264"]},"video/h264-rcdo":{source:"iana"},"video/h264-svc":{source:"iana"},"video/h265":{source:"iana"},"video/iso.segment":{source:"iana",extensions:["m4s"]},"video/jpeg":{source:"iana",extensions:["jpgv"]},"video/jpeg2000":{source:"iana"},"video/jpm":{source:"apache",extensions:["jpm","jpgm"]},"video/jxsv":{source:"iana"},"video/mj2":{source:"iana",extensions:["mj2","mjp2"]},"video/mp1s":{source:"iana"},"video/mp2p":{source:"iana"},"video/mp2t":{source:"iana",extensions:["ts"]},"video/mp4":{source:"iana",compressible:!1,extensions:["mp4","mp4v","mpg4"]},"video/mp4v-es":{source:"iana"},"video/mpeg":{source:"iana",compressible:!1,extensions:["mpeg","mpg","mpe","m1v","m2v"]},"video/mpeg4-generic":{source:"iana"},"video/mpv":{source:"iana"},"video/nv":{source:"iana"},"video/ogg":{source:"iana",compressible:!1,extensions:["ogv"]},"video/parityfec":{source:"iana"},"video/pointer":{source:"iana"},"video/quicktime":{source:"iana",compressible:!1,extensions:["qt","mov"]},"video/raptorfec":{source:"iana"},"video/raw":{source:"iana"},"video/rtp-enc-aescm128":{source:"iana"},"video/rtploopback":{source:"iana"},"video/rtx":{source:"iana"},"video/scip":{source:"iana"},"video/smpte291":{source:"iana"},"video/smpte292m":{source:"iana"},"video/ulpfec":{source:"iana"},"video/vc1":{source:"iana"},"video/vc2":{source:"iana"},"video/vnd.cctv":{source:"iana"},"video/vnd.dece.hd":{source:"iana",extensions:["uvh","uvvh"]},"video/vnd.dece.mobile":{source:"iana",extensions:["uvm","uvvm"]},"video/vnd.dece.mp4":{source:"iana"},"video/vnd.dece.pd":{source:"iana",extensions:["uvp","uvvp"]},"video/vnd.dece.sd":{source:"iana",extensions:["uvs","uvvs"]},"video/vnd.dece.video":{source:"iana",extensions:["uvv","uvvv"]},"video/vnd.directv.mpeg":{source:"iana"},"video/vnd.directv.mpeg-tts":{source:"iana"},"video/vnd.dlna.mpeg-tts":{source:"iana"},"video/vnd.dvb.file":{source:"iana",extensions:["dvb"]},"video/vnd.fvt":{source:"iana",extensions:["fvt"]},"video/vnd.hns.video":{source:"iana"},"video/vnd.iptvforum.1dparityfec-1010":{source:"iana"},"video/vnd.iptvforum.1dparityfec-2005":{source:"iana"},"video/vnd.iptvforum.2dparityfec-1010":{source:"iana"},"video/vnd.iptvforum.2dparityfec-2005":{source:"iana"},"video/vnd.iptvforum.ttsavc":{source:"iana"},"video/vnd.iptvforum.ttsmpeg2":{source:"iana"},"video/vnd.motorola.video":{source:"iana"},"video/vnd.motorola.videop":{source:"iana"},"video/vnd.mpegurl":{source:"iana",extensions:["mxu","m4u"]},"video/vnd.ms-playready.media.pyv":{source:"iana",extensions:["pyv"]},"video/vnd.nokia.interleaved-multimedia":{source:"iana"},"video/vnd.nokia.mp4vr":{source:"iana"},"video/vnd.nokia.videovoip":{source:"iana"},"video/vnd.objectvideo":{source:"iana"},"video/vnd.radgamettools.bink":{source:"iana"},"video/vnd.radgamettools.smacker":{source:"iana"},"video/vnd.sealed.mpeg1":{source:"iana"},"video/vnd.sealed.mpeg4":{source:"iana"},"video/vnd.sealed.swf":{source:"iana"},"video/vnd.sealedmedia.softseal.mov":{source:"iana"},"video/vnd.uvvu.mp4":{source:"iana",extensions:["uvu","uvvu"]},"video/vnd.vivo":{source:"iana",extensions:["viv"]},"video/vnd.youtube.yt":{source:"iana"},"video/vp8":{source:"iana"},"video/vp9":{source:"iana"},"video/webm":{source:"apache",compressible:!1,extensions:["webm"]},"video/x-f4v":{source:"apache",extensions:["f4v"]},"video/x-fli":{source:"apache",extensions:["fli"]},"video/x-flv":{source:"apache",compressible:!1,extensions:["flv"]},"video/x-m4v":{source:"apache",extensions:["m4v"]},"video/x-matroska":{source:"apache",compressible:!1,extensions:["mkv","mk3d","mks"]},"video/x-mng":{source:"apache",extensions:["mng"]},"video/x-ms-asf":{source:"apache",extensions:["asf","asx"]},"video/x-ms-vob":{source:"apache",extensions:["vob"]},"video/x-ms-wm":{source:"apache",extensions:["wm"]},"video/x-ms-wmv":{source:"apache",compressible:!1,extensions:["wmv"]},"video/x-ms-wmx":{source:"apache",extensions:["wmx"]},"video/x-ms-wvx":{source:"apache",extensions:["wvx"]},"video/x-msvideo":{source:"apache",extensions:["avi"]},"video/x-sgi-movie":{source:"apache",extensions:["movie"]},"video/x-smv":{source:"apache",extensions:["smv"]},"x-conference/x-cooltalk":{source:"apache",extensions:["ice"]},"x-shader/x-fragment":{compressible:!0},"x-shader/x-vertex":{compressible:!0}}});var cr=K((g1,sr)=>{sr.exports=or()});var Bt=K((x1,pr)=>{"use strict";function Pe(e){if(typeof e!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}function lr(e,t){for(var n="",a=0,i=-1,r=0,o,s=0;s<=e.length;++s){if(s2){var p=n.lastIndexOf("/");if(p!==n.length-1){p===-1?(n="",a=0):(n=n.slice(0,p),a=n.length-1-n.lastIndexOf("/")),i=s,r=0;continue}}else if(n.length===2||n.length===1){n="",a=0,i=s,r=0;continue}}t&&(n.length>0?n+="/..":n="..",a=2)}else n.length>0?n+="/"+e.slice(i+1,s):n=e.slice(i+1,s),a=s-i-1;i=s,r=0}else o===46&&r!==-1?++r:r=-1}return n}function xp(e,t){var n=t.dir||t.root,a=t.base||(t.name||"")+(t.ext||"");return n?n===t.root?n+a:n+e+a:a}var ct={resolve:function(){for(var t="",n=!1,a,i=arguments.length-1;i>=-1&&!n;i--){var r;i>=0?r=arguments[i]:(a===void 0&&(a=process.cwd()),r=a),Pe(r),r.length!==0&&(t=r+"/"+t,n=r.charCodeAt(0)===47)}return t=lr(t,!n),n?t.length>0?"/"+t:"/":t.length>0?t:"."},normalize:function(t){if(Pe(t),t.length===0)return".";var n=t.charCodeAt(0)===47,a=t.charCodeAt(t.length-1)===47;return t=lr(t,!n),t.length===0&&!n&&(t="."),t.length>0&&a&&(t+="/"),n?"/"+t:t},isAbsolute:function(t){return Pe(t),t.length>0&&t.charCodeAt(0)===47},join:function(){if(arguments.length===0)return".";for(var t,n=0;n0&&(t===void 0?t=a:t+="/"+a)}return t===void 0?".":ct.normalize(t)},relative:function(t,n){if(Pe(t),Pe(n),t===n||(t=ct.resolve(t),n=ct.resolve(n),t===n))return"";for(var a=1;al){if(n.charCodeAt(o+u)===47)return n.slice(o+u+1);if(u===0)return n.slice(o+u)}else r>l&&(t.charCodeAt(a+u)===47?c=u:u===0&&(c=0));break}var h=t.charCodeAt(a+u),f=n.charCodeAt(o+u);if(h!==f)break;h===47&&(c=u)}var g="";for(u=a+c+1;u<=i;++u)(u===i||t.charCodeAt(u)===47)&&(g.length===0?g+="..":g+="/..");return g.length>0?g+n.slice(o+c):(o+=c,n.charCodeAt(o)===47&&++o,n.slice(o))},_makeLong:function(t){return t},dirname:function(t){if(Pe(t),t.length===0)return".";for(var n=t.charCodeAt(0),a=n===47,i=-1,r=!0,o=t.length-1;o>=1;--o)if(n=t.charCodeAt(o),n===47){if(!r){i=o;break}}else r=!1;return i===-1?a?"/":".":a&&i===1?"//":t.slice(0,i)},basename:function(t,n){if(n!==void 0&&typeof n!="string")throw new TypeError('"ext" argument must be a string');Pe(t);var a=0,i=-1,r=!0,o;if(n!==void 0&&n.length>0&&n.length<=t.length){if(n.length===t.length&&n===t)return"";var s=n.length-1,p=-1;for(o=t.length-1;o>=0;--o){var l=t.charCodeAt(o);if(l===47){if(!r){a=o+1;break}}else p===-1&&(r=!1,p=o+1),s>=0&&(l===n.charCodeAt(s)?--s===-1&&(i=o):(s=-1,i=p))}return a===i?i=p:i===-1&&(i=t.length),t.slice(a,i)}else{for(o=t.length-1;o>=0;--o)if(t.charCodeAt(o)===47){if(!r){a=o+1;break}}else i===-1&&(r=!1,i=o+1);return i===-1?"":t.slice(a,i)}},extname:function(t){Pe(t);for(var n=-1,a=0,i=-1,r=!0,o=0,s=t.length-1;s>=0;--s){var p=t.charCodeAt(s);if(p===47){if(!r){a=s+1;break}continue}i===-1&&(r=!1,i=s+1),p===46?n===-1?n=s:o!==1&&(o=1):n!==-1&&(o=-1)}return n===-1||i===-1||o===0||o===1&&n===i-1&&n===a+1?"":t.slice(n,i)},format:function(t){if(t===null||typeof t!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof t);return xp("/",t)},parse:function(t){Pe(t);var n={root:"",dir:"",base:"",ext:"",name:""};if(t.length===0)return n;var a=t.charCodeAt(0),i=a===47,r;i?(n.root="/",r=1):r=0;for(var o=-1,s=0,p=-1,l=!0,c=t.length-1,u=0;c>=r;--c){if(a=t.charCodeAt(c),a===47){if(!l){s=c+1;break}continue}p===-1&&(l=!1,p=c+1),a===46?o===-1?o=c:u!==1&&(u=1):o!==-1&&(u=-1)}return o===-1||p===-1||u===0||u===1&&o===p-1&&o===s+1?p!==-1&&(s===0&&i?n.base=n.name=t.slice(1,p):n.base=n.name=t.slice(s,p)):(s===0&&i?(n.name=t.slice(1,o),n.base=t.slice(1,p)):(n.name=t.slice(s,o),n.base=t.slice(s,p)),n.ext=t.slice(o,p)),s>0?n.dir=t.slice(0,s-1):i&&(n.dir="/"),n},sep:"/",delimiter:":",win32:null,posix:null};ct.posix=ct;pr.exports=ct});var fr=K(ye=>{"use strict";var pn=cr(),vp=Bt().extname,ur=/^\s*([^;\s]*)(?:;|\s|$)/,bp=/^text\//i;ye.charset=dr;ye.charsets={lookup:dr};ye.contentType=yp;ye.extension=_p;ye.extensions=Object.create(null);ye.lookup=kp;ye.types=Object.create(null);wp(ye.extensions,ye.types);function dr(e){if(!e||typeof e!="string")return!1;var t=ur.exec(e),n=t&&pn[t[1].toLowerCase()];return n&&n.charset?n.charset:t&&bp.test(t[1])?"UTF-8":!1}function yp(e){if(!e||typeof e!="string")return!1;var t=e.indexOf("/")===-1?ye.lookup(e):e;if(!t)return!1;if(t.indexOf("charset")===-1){var n=ye.charset(t);n&&(t+="; charset="+n.toLowerCase())}return t}function _p(e){if(!e||typeof e!="string")return!1;var t=ur.exec(e),n=t&&ye.extensions[t[1].toLowerCase()];return!n||!n.length?!1:n[0]}function kp(e){if(!e||typeof e!="string")return!1;var t=vp("x."+e).toLowerCase().substr(1);return t&&ye.types[t]||!1}function wp(e,t){var n=["nginx","apache",void 0,"iana"];Object.keys(pn).forEach(function(i){var r=pn[i],o=r.extensions;if(!(!o||!o.length)){e[i]=o;for(var s=0;sc||l===c&&t[p].substr(0,12)==="application/"))continue}t[p]=i}}})}});var aa=K((b1,mr)=>{var Cp=typeof global=="object"&&global&&global.Object===Object&&global;mr.exports=Cp});var Ue=K((y1,hr)=>{var jp=aa(),Lp=typeof self=="object"&&self&&self.Object===Object&&self,Ip=jp||Lp||Function("return this")();hr.exports=Ip});var un=K((_1,gr)=>{var Sp=Ue(),Ap=Sp.Symbol;gr.exports=Ap});var vr=K((k1,xr)=>{function Mp(e,t){var n=-1,a=e.length;for(t||(t=Array(a));++n{var br=un(),yr=Object.prototype,Fp=yr.hasOwnProperty,Ep=yr.toString,Pt=br?br.toStringTag:void 0;function zp(e){var t=Fp.call(e,Pt),n=e[Pt];try{e[Pt]=void 0;var a=!0}catch{}var i=Ep.call(e);return a&&(t?e[Pt]=n:delete e[Pt]),i}_r.exports=zp});var Cr=K((C1,wr)=>{var Bp=Object.prototype,Pp=Bp.toString;function Tp(e){return Pp.call(e)}wr.exports=Tp});var lt=K((j1,Ir)=>{var jr=un(),Op=kr(),Np=Cr(),Dp="[object Null]",Wp="[object Undefined]",Lr=jr?jr.toStringTag:void 0;function Rp(e){return e==null?e===void 0?Wp:Dp:Lr&&Lr in Object(e)?Op(e):Np(e)}Ir.exports=Rp});var ia=K((L1,Sr)=>{function Up(e){var t=typeof e;return e!=null&&(t=="object"||t=="function")}Sr.exports=Up});var ra=K((I1,Ar)=>{var Vp=lt(),Hp=ia(),qp="[object AsyncFunction]",$p="[object Function]",Gp="[object GeneratorFunction]",Zp="[object Proxy]";function Kp(e){if(!Hp(e))return!1;var t=Vp(e);return t==$p||t==Gp||t==qp||t==Zp}Ar.exports=Kp});var Fr=K((S1,Mr)=>{var Yp=Ue(),Xp=Yp["__core-js_shared__"];Mr.exports=Xp});var Br=K((A1,zr)=>{var oa=Fr(),Er=function(){var e=/[^.]+$/.exec(oa&&oa.keys&&oa.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();function Jp(e){return!!Er&&Er in e}zr.exports=Jp});var sa=K((M1,Pr)=>{var Qp=Function.prototype,eu=Qp.toString;function tu(e){if(e!=null){try{return eu.call(e)}catch{}try{return e+""}catch{}}return""}Pr.exports=tu});var Or=K((F1,Tr)=>{var nu=ra(),au=Br(),iu=ia(),ru=sa(),ou=/[\\^$.*+?()[\]{}|]/g,su=/^\[object .+?Constructor\]$/,cu=Function.prototype,lu=Object.prototype,pu=cu.toString,uu=lu.hasOwnProperty,du=RegExp("^"+pu.call(uu).replace(ou,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function fu(e){if(!iu(e)||au(e))return!1;var t=nu(e)?du:su;return t.test(ru(e))}Tr.exports=fu});var Dr=K((E1,Nr)=>{function mu(e,t){return e?.[t]}Nr.exports=mu});var pt=K((z1,Wr)=>{var hu=Or(),gu=Dr();function xu(e,t){var n=gu(e,t);return hu(n)?n:void 0}Wr.exports=xu});var Ur=K((B1,Rr)=>{var vu=pt(),bu=Ue(),yu=vu(bu,"DataView");Rr.exports=yu});var Hr=K((P1,Vr)=>{var _u=pt(),ku=Ue(),wu=_u(ku,"Map");Vr.exports=wu});var $r=K((T1,qr)=>{var Cu=pt(),ju=Ue(),Lu=Cu(ju,"Promise");qr.exports=Lu});var Zr=K((O1,Gr)=>{var Iu=pt(),Su=Ue(),Au=Iu(Su,"Set");Gr.exports=Au});var Yr=K((N1,Kr)=>{var Mu=pt(),Fu=Ue(),Eu=Mu(Fu,"WeakMap");Kr.exports=Eu});var io=K((D1,ao)=>{var ca=Ur(),la=Hr(),pa=$r(),ua=Zr(),da=Yr(),no=lt(),ut=sa(),Xr="[object Map]",zu="[object Object]",Jr="[object Promise]",Qr="[object Set]",eo="[object WeakMap]",to="[object DataView]",Bu=ut(ca),Pu=ut(la),Tu=ut(pa),Ou=ut(ua),Nu=ut(da),nt=no;(ca&&nt(new ca(new ArrayBuffer(1)))!=to||la&&nt(new la)!=Xr||pa&&nt(pa.resolve())!=Jr||ua&&nt(new ua)!=Qr||da&&nt(new da)!=eo)&&(nt=function(e){var t=no(e),n=t==zu?e.constructor:void 0,a=n?ut(n):"";if(a)switch(a){case Bu:return to;case Pu:return Xr;case Tu:return Jr;case Ou:return Qr;case Nu:return eo}return t});ao.exports=nt});var fa=K((W1,ro)=>{var Du=9007199254740991;function Wu(e){return typeof e=="number"&&e>-1&&e%1==0&&e<=Du}ro.exports=Wu});var ma=K((R1,oo)=>{var Ru=ra(),Uu=fa();function Vu(e){return e!=null&&Uu(e.length)&&!Ru(e)}oo.exports=Vu});var ha=K((U1,so)=>{var Hu=Array.isArray;so.exports=Hu});var Tt=K((V1,co)=>{function qu(e){return e!=null&&typeof e=="object"}co.exports=qu});var po=K((H1,lo)=>{var $u=lt(),Gu=ha(),Zu=Tt(),Ku="[object String]";function Yu(e){return typeof e=="string"||!Gu(e)&&Zu(e)&&$u(e)==Ku}lo.exports=Yu});var fo=K((q1,uo)=>{function Xu(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}uo.exports=Xu});var ho=K(($1,mo)=>{function Ju(e){var t=-1,n=Array(e.size);return e.forEach(function(a,i){n[++t]=[i,a]}),n}mo.exports=Ju});var xo=K((G1,go)=>{function Qu(e){var t=-1,n=Array(e.size);return e.forEach(function(a){n[++t]=a}),n}go.exports=Qu});var bo=K((Z1,vo)=>{function ed(e){return e.split("")}vo.exports=ed});var _o=K((K1,yo)=>{var td="\\ud800-\\udfff",nd="\\u0300-\\u036f",ad="\\ufe20-\\ufe2f",id="\\u20d0-\\u20ff",rd=nd+ad+id,od="\\ufe0e\\ufe0f",sd="\\u200d",cd=RegExp("["+sd+td+rd+od+"]");function ld(e){return cd.test(e)}yo.exports=ld});var Ao=K((Y1,So)=>{var ko="\\ud800-\\udfff",pd="\\u0300-\\u036f",ud="\\ufe20-\\ufe2f",dd="\\u20d0-\\u20ff",fd=pd+ud+dd,md="\\ufe0e\\ufe0f",hd="["+ko+"]",ga="["+fd+"]",xa="\\ud83c[\\udffb-\\udfff]",gd="(?:"+ga+"|"+xa+")",wo="[^"+ko+"]",Co="(?:\\ud83c[\\udde6-\\uddff]){2}",jo="[\\ud800-\\udbff][\\udc00-\\udfff]",xd="\\u200d",Lo=gd+"?",Io="["+md+"]?",vd="(?:"+xd+"(?:"+[wo,Co,jo].join("|")+")"+Io+Lo+")*",bd=Io+Lo+vd,yd="(?:"+[wo+ga+"?",ga,Co,jo,hd].join("|")+")",_d=RegExp(xa+"(?="+xa+")|"+yd+bd,"g");function kd(e){return e.match(_d)||[]}So.exports=kd});var Fo=K((X1,Mo)=>{var wd=bo(),Cd=_o(),jd=Ao();function Ld(e){return Cd(e)?jd(e):wd(e)}Mo.exports=Ld});var zo=K((J1,Eo)=>{function Id(e,t){for(var n=-1,a=e==null?0:e.length,i=Array(a);++n{var Sd=zo();function Ad(e,t){return Sd(t,function(n){return e[n]})}Bo.exports=Ad});var Oo=K((e2,To)=>{function Md(e,t){for(var n=-1,a=Array(e);++n{var Fd=lt(),Ed=Tt(),zd="[object Arguments]";function Bd(e){return Ed(e)&&Fd(e)==zd}No.exports=Bd});var Vo=K((n2,Uo)=>{var Wo=Do(),Pd=Tt(),Ro=Object.prototype,Td=Ro.hasOwnProperty,Od=Ro.propertyIsEnumerable,Nd=Wo(function(){return arguments}())?Wo:function(e){return Pd(e)&&Td.call(e,"callee")&&!Od.call(e,"callee")};Uo.exports=Nd});var qo=K((a2,Ho)=>{function Dd(){return!1}Ho.exports=Dd});var Ko=K((Ot,dt)=>{var Wd=Ue(),Rd=qo(),Zo=typeof Ot=="object"&&Ot&&!Ot.nodeType&&Ot,$o=Zo&&typeof dt=="object"&&dt&&!dt.nodeType&&dt,Ud=$o&&$o.exports===Zo,Go=Ud?Wd.Buffer:void 0,Vd=Go?Go.isBuffer:void 0,Hd=Vd||Rd;dt.exports=Hd});var Xo=K((i2,Yo)=>{var qd=9007199254740991,$d=/^(?:0|[1-9]\d*)$/;function Gd(e,t){var n=typeof e;return t=t??qd,!!t&&(n=="number"||n!="symbol"&&$d.test(e))&&e>-1&&e%1==0&&e{var Zd=lt(),Kd=fa(),Yd=Tt(),Xd="[object Arguments]",Jd="[object Array]",Qd="[object Boolean]",ef="[object Date]",tf="[object Error]",nf="[object Function]",af="[object Map]",rf="[object Number]",of="[object Object]",sf="[object RegExp]",cf="[object Set]",lf="[object String]",pf="[object WeakMap]",uf="[object ArrayBuffer]",df="[object DataView]",ff="[object Float32Array]",mf="[object Float64Array]",hf="[object Int8Array]",gf="[object Int16Array]",xf="[object Int32Array]",vf="[object Uint8Array]",bf="[object Uint8ClampedArray]",yf="[object Uint16Array]",_f="[object Uint32Array]",pe={};pe[ff]=pe[mf]=pe[hf]=pe[gf]=pe[xf]=pe[vf]=pe[bf]=pe[yf]=pe[_f]=!0;pe[Xd]=pe[Jd]=pe[uf]=pe[Qd]=pe[df]=pe[ef]=pe[tf]=pe[nf]=pe[af]=pe[rf]=pe[of]=pe[sf]=pe[cf]=pe[lf]=pe[pf]=!1;function kf(e){return Yd(e)&&Kd(e.length)&&!!pe[Zd(e)]}Jo.exports=kf});var ts=K((o2,es)=>{function wf(e){return function(t){return e(t)}}es.exports=wf});var as=K((Nt,ft)=>{var Cf=aa(),ns=typeof Nt=="object"&&Nt&&!Nt.nodeType&&Nt,Dt=ns&&typeof ft=="object"&&ft&&!ft.nodeType&&ft,jf=Dt&&Dt.exports===ns,va=jf&&Cf.process,Lf=function(){try{var e=Dt&&Dt.require&&Dt.require("util").types;return e||va&&va.binding&&va.binding("util")}catch{}}();ft.exports=Lf});var ss=K((s2,os)=>{var If=Qo(),Sf=ts(),is=as(),rs=is&&is.isTypedArray,Af=rs?Sf(rs):If;os.exports=Af});var ls=K((c2,cs)=>{var Mf=Oo(),Ff=Vo(),Ef=ha(),zf=Ko(),Bf=Xo(),Pf=ss(),Tf=Object.prototype,Of=Tf.hasOwnProperty;function Nf(e,t){var n=Ef(e),a=!n&&Ff(e),i=!n&&!a&&zf(e),r=!n&&!a&&!i&&Pf(e),o=n||a||i||r,s=o?Mf(e.length,String):[],p=s.length;for(var l in e)(t||Of.call(e,l))&&!(o&&(l=="length"||i&&(l=="offset"||l=="parent")||r&&(l=="buffer"||l=="byteLength"||l=="byteOffset")||Bf(l,p)))&&s.push(l);return s}cs.exports=Nf});var us=K((l2,ps)=>{var Df=Object.prototype;function Wf(e){var t=e&&e.constructor,n=typeof t=="function"&&t.prototype||Df;return e===n}ps.exports=Wf});var fs=K((p2,ds)=>{function Rf(e,t){return function(n){return e(t(n))}}ds.exports=Rf});var hs=K((u2,ms)=>{var Uf=fs(),Vf=Uf(Object.keys,Object);ms.exports=Vf});var xs=K((d2,gs)=>{var Hf=us(),qf=hs(),$f=Object.prototype,Gf=$f.hasOwnProperty;function Zf(e){if(!Hf(e))return qf(e);var t=[];for(var n in Object(e))Gf.call(e,n)&&n!="constructor"&&t.push(n);return t}gs.exports=Zf});var bs=K((f2,vs)=>{var Kf=ls(),Yf=xs(),Xf=ma();function Jf(e){return Xf(e)?Kf(e):Yf(e)}vs.exports=Jf});var _s=K((m2,ys)=>{var Qf=Po(),em=bs();function tm(e){return e==null?[]:Qf(e,em(e))}ys.exports=tm});var Cs=K((h2,ws)=>{var ks=un(),nm=vr(),am=io(),im=ma(),rm=po(),om=fo(),sm=ho(),cm=xo(),lm=Fo(),pm=_s(),um="[object Map]",dm="[object Set]",ba=ks?ks.iterator:void 0;function fm(e){if(!e)return[];if(im(e))return rm(e)?lm(e):nm(e);if(ba&&e[ba])return om(e[ba]());var t=am(e),n=t==um?sm:t==dm?cm:pm;return n(e)}ws.exports=fm});var ya=K((g2,mm)=>{mm.exports={"100":"\u{1F4AF}","1234":"\u{1F522}",umbrella_with_rain_drops:"\u2614",coffee:"\u2615",aries:"\u2648",taurus:"\u2649",sagittarius:"\u2650",capricorn:"\u2651",aquarius:"\u2652",pisces:"\u2653",anchor:"\u2693",white_check_mark:"\u2705",sparkles:"\u2728",question:"\u2753",grey_question:"\u2754",grey_exclamation:"\u2755",exclamation:"\u2757",heavy_exclamation_mark:"\u2757",heavy_plus_sign:"\u2795",heavy_minus_sign:"\u2796",heavy_division_sign:"\u2797",hash:"#\uFE0F\u20E3",keycap_star:"*\uFE0F\u20E3",zero:"0\uFE0F\u20E3",one:"1\uFE0F\u20E3",two:"2\uFE0F\u20E3",three:"3\uFE0F\u20E3",four:"4\uFE0F\u20E3",five:"5\uFE0F\u20E3",six:"6\uFE0F\u20E3",seven:"7\uFE0F\u20E3",eight:"8\uFE0F\u20E3",nine:"9\uFE0F\u20E3",copyright:"\xA9\uFE0F",registered:"\xAE\uFE0F",mahjong:"\u{1F004}",black_joker:"\u{1F0CF}",a:"\u{1F170}\uFE0F",b:"\u{1F171}\uFE0F",o2:"\u{1F17E}\uFE0F",parking:"\u{1F17F}\uFE0F",ab:"\u{1F18E}",cl:"\u{1F191}",cool:"\u{1F192}",free:"\u{1F193}",id:"\u{1F194}",new:"\u{1F195}",ng:"\u{1F196}",ok:"\u{1F197}",sos:"\u{1F198}",up:"\u{1F199}",vs:"\u{1F19A}","flag-ac":"\u{1F1E6}\u{1F1E8}","flag-ad":"\u{1F1E6}\u{1F1E9}","flag-ae":"\u{1F1E6}\u{1F1EA}","flag-af":"\u{1F1E6}\u{1F1EB}","flag-ag":"\u{1F1E6}\u{1F1EC}","flag-ai":"\u{1F1E6}\u{1F1EE}","flag-al":"\u{1F1E6}\u{1F1F1}","flag-am":"\u{1F1E6}\u{1F1F2}","flag-ao":"\u{1F1E6}\u{1F1F4}","flag-aq":"\u{1F1E6}\u{1F1F6}","flag-ar":"\u{1F1E6}\u{1F1F7}","flag-as":"\u{1F1E6}\u{1F1F8}","flag-at":"\u{1F1E6}\u{1F1F9}","flag-au":"\u{1F1E6}\u{1F1FA}","flag-aw":"\u{1F1E6}\u{1F1FC}","flag-ax":"\u{1F1E6}\u{1F1FD}","flag-az":"\u{1F1E6}\u{1F1FF}","flag-ba":"\u{1F1E7}\u{1F1E6}","flag-bb":"\u{1F1E7}\u{1F1E7}","flag-bd":"\u{1F1E7}\u{1F1E9}","flag-be":"\u{1F1E7}\u{1F1EA}","flag-bf":"\u{1F1E7}\u{1F1EB}","flag-bg":"\u{1F1E7}\u{1F1EC}","flag-bh":"\u{1F1E7}\u{1F1ED}","flag-bi":"\u{1F1E7}\u{1F1EE}","flag-bj":"\u{1F1E7}\u{1F1EF}","flag-bl":"\u{1F1E7}\u{1F1F1}","flag-bm":"\u{1F1E7}\u{1F1F2}","flag-bn":"\u{1F1E7}\u{1F1F3}","flag-bo":"\u{1F1E7}\u{1F1F4}","flag-bq":"\u{1F1E7}\u{1F1F6}","flag-br":"\u{1F1E7}\u{1F1F7}","flag-bs":"\u{1F1E7}\u{1F1F8}","flag-bt":"\u{1F1E7}\u{1F1F9}","flag-bv":"\u{1F1E7}\u{1F1FB}","flag-bw":"\u{1F1E7}\u{1F1FC}","flag-by":"\u{1F1E7}\u{1F1FE}","flag-bz":"\u{1F1E7}\u{1F1FF}","flag-ca":"\u{1F1E8}\u{1F1E6}","flag-cc":"\u{1F1E8}\u{1F1E8}","flag-cd":"\u{1F1E8}\u{1F1E9}","flag-cf":"\u{1F1E8}\u{1F1EB}","flag-cg":"\u{1F1E8}\u{1F1EC}","flag-ch":"\u{1F1E8}\u{1F1ED}","flag-ci":"\u{1F1E8}\u{1F1EE}","flag-ck":"\u{1F1E8}\u{1F1F0}","flag-cl":"\u{1F1E8}\u{1F1F1}","flag-cm":"\u{1F1E8}\u{1F1F2}",cn:"\u{1F1E8}\u{1F1F3}","flag-cn":"\u{1F1E8}\u{1F1F3}","flag-co":"\u{1F1E8}\u{1F1F4}","flag-cp":"\u{1F1E8}\u{1F1F5}","flag-cr":"\u{1F1E8}\u{1F1F7}","flag-cu":"\u{1F1E8}\u{1F1FA}","flag-cv":"\u{1F1E8}\u{1F1FB}","flag-cw":"\u{1F1E8}\u{1F1FC}","flag-cx":"\u{1F1E8}\u{1F1FD}","flag-cy":"\u{1F1E8}\u{1F1FE}","flag-cz":"\u{1F1E8}\u{1F1FF}",de:"\u{1F1E9}\u{1F1EA}","flag-de":"\u{1F1E9}\u{1F1EA}","flag-dg":"\u{1F1E9}\u{1F1EC}","flag-dj":"\u{1F1E9}\u{1F1EF}","flag-dk":"\u{1F1E9}\u{1F1F0}","flag-dm":"\u{1F1E9}\u{1F1F2}","flag-do":"\u{1F1E9}\u{1F1F4}","flag-dz":"\u{1F1E9}\u{1F1FF}","flag-ea":"\u{1F1EA}\u{1F1E6}","flag-ec":"\u{1F1EA}\u{1F1E8}","flag-ee":"\u{1F1EA}\u{1F1EA}","flag-eg":"\u{1F1EA}\u{1F1EC}","flag-eh":"\u{1F1EA}\u{1F1ED}","flag-er":"\u{1F1EA}\u{1F1F7}",es:"\u{1F1EA}\u{1F1F8}","flag-es":"\u{1F1EA}\u{1F1F8}","flag-et":"\u{1F1EA}\u{1F1F9}","flag-eu":"\u{1F1EA}\u{1F1FA}","flag-fi":"\u{1F1EB}\u{1F1EE}","flag-fj":"\u{1F1EB}\u{1F1EF}","flag-fk":"\u{1F1EB}\u{1F1F0}","flag-fm":"\u{1F1EB}\u{1F1F2}","flag-fo":"\u{1F1EB}\u{1F1F4}",fr:"\u{1F1EB}\u{1F1F7}","flag-fr":"\u{1F1EB}\u{1F1F7}","flag-ga":"\u{1F1EC}\u{1F1E6}",gb:"\u{1F1EC}\u{1F1E7}",uk:"\u{1F1EC}\u{1F1E7}","flag-gb":"\u{1F1EC}\u{1F1E7}","flag-gd":"\u{1F1EC}\u{1F1E9}","flag-ge":"\u{1F1EC}\u{1F1EA}","flag-gf":"\u{1F1EC}\u{1F1EB}","flag-gg":"\u{1F1EC}\u{1F1EC}","flag-gh":"\u{1F1EC}\u{1F1ED}","flag-gi":"\u{1F1EC}\u{1F1EE}","flag-gl":"\u{1F1EC}\u{1F1F1}","flag-gm":"\u{1F1EC}\u{1F1F2}","flag-gn":"\u{1F1EC}\u{1F1F3}","flag-gp":"\u{1F1EC}\u{1F1F5}","flag-gq":"\u{1F1EC}\u{1F1F6}","flag-gr":"\u{1F1EC}\u{1F1F7}","flag-gs":"\u{1F1EC}\u{1F1F8}","flag-gt":"\u{1F1EC}\u{1F1F9}","flag-gu":"\u{1F1EC}\u{1F1FA}","flag-gw":"\u{1F1EC}\u{1F1FC}","flag-gy":"\u{1F1EC}\u{1F1FE}","flag-hk":"\u{1F1ED}\u{1F1F0}","flag-hm":"\u{1F1ED}\u{1F1F2}","flag-hn":"\u{1F1ED}\u{1F1F3}","flag-hr":"\u{1F1ED}\u{1F1F7}","flag-ht":"\u{1F1ED}\u{1F1F9}","flag-hu":"\u{1F1ED}\u{1F1FA}","flag-ic":"\u{1F1EE}\u{1F1E8}","flag-id":"\u{1F1EE}\u{1F1E9}","flag-ie":"\u{1F1EE}\u{1F1EA}","flag-il":"\u{1F1EE}\u{1F1F1}","flag-im":"\u{1F1EE}\u{1F1F2}","flag-in":"\u{1F1EE}\u{1F1F3}","flag-io":"\u{1F1EE}\u{1F1F4}","flag-iq":"\u{1F1EE}\u{1F1F6}","flag-ir":"\u{1F1EE}\u{1F1F7}","flag-is":"\u{1F1EE}\u{1F1F8}",it:"\u{1F1EE}\u{1F1F9}","flag-it":"\u{1F1EE}\u{1F1F9}","flag-je":"\u{1F1EF}\u{1F1EA}","flag-jm":"\u{1F1EF}\u{1F1F2}","flag-jo":"\u{1F1EF}\u{1F1F4}",jp:"\u{1F1EF}\u{1F1F5}","flag-jp":"\u{1F1EF}\u{1F1F5}","flag-ke":"\u{1F1F0}\u{1F1EA}","flag-kg":"\u{1F1F0}\u{1F1EC}","flag-kh":"\u{1F1F0}\u{1F1ED}","flag-ki":"\u{1F1F0}\u{1F1EE}","flag-km":"\u{1F1F0}\u{1F1F2}","flag-kn":"\u{1F1F0}\u{1F1F3}","flag-kp":"\u{1F1F0}\u{1F1F5}",kr:"\u{1F1F0}\u{1F1F7}","flag-kr":"\u{1F1F0}\u{1F1F7}","flag-kw":"\u{1F1F0}\u{1F1FC}","flag-ky":"\u{1F1F0}\u{1F1FE}","flag-kz":"\u{1F1F0}\u{1F1FF}","flag-la":"\u{1F1F1}\u{1F1E6}","flag-lb":"\u{1F1F1}\u{1F1E7}","flag-lc":"\u{1F1F1}\u{1F1E8}","flag-li":"\u{1F1F1}\u{1F1EE}","flag-lk":"\u{1F1F1}\u{1F1F0}","flag-lr":"\u{1F1F1}\u{1F1F7}","flag-ls":"\u{1F1F1}\u{1F1F8}","flag-lt":"\u{1F1F1}\u{1F1F9}","flag-lu":"\u{1F1F1}\u{1F1FA}","flag-lv":"\u{1F1F1}\u{1F1FB}","flag-ly":"\u{1F1F1}\u{1F1FE}","flag-ma":"\u{1F1F2}\u{1F1E6}","flag-mc":"\u{1F1F2}\u{1F1E8}","flag-md":"\u{1F1F2}\u{1F1E9}","flag-me":"\u{1F1F2}\u{1F1EA}","flag-mf":"\u{1F1F2}\u{1F1EB}","flag-mg":"\u{1F1F2}\u{1F1EC}","flag-mh":"\u{1F1F2}\u{1F1ED}","flag-mk":"\u{1F1F2}\u{1F1F0}","flag-ml":"\u{1F1F2}\u{1F1F1}","flag-mm":"\u{1F1F2}\u{1F1F2}","flag-mn":"\u{1F1F2}\u{1F1F3}","flag-mo":"\u{1F1F2}\u{1F1F4}","flag-mp":"\u{1F1F2}\u{1F1F5}","flag-mq":"\u{1F1F2}\u{1F1F6}","flag-mr":"\u{1F1F2}\u{1F1F7}","flag-ms":"\u{1F1F2}\u{1F1F8}","flag-mt":"\u{1F1F2}\u{1F1F9}","flag-mu":"\u{1F1F2}\u{1F1FA}","flag-mv":"\u{1F1F2}\u{1F1FB}","flag-mw":"\u{1F1F2}\u{1F1FC}","flag-mx":"\u{1F1F2}\u{1F1FD}","flag-my":"\u{1F1F2}\u{1F1FE}","flag-mz":"\u{1F1F2}\u{1F1FF}","flag-na":"\u{1F1F3}\u{1F1E6}","flag-nc":"\u{1F1F3}\u{1F1E8}","flag-ne":"\u{1F1F3}\u{1F1EA}","flag-nf":"\u{1F1F3}\u{1F1EB}","flag-ng":"\u{1F1F3}\u{1F1EC}","flag-ni":"\u{1F1F3}\u{1F1EE}","flag-nl":"\u{1F1F3}\u{1F1F1}","flag-no":"\u{1F1F3}\u{1F1F4}","flag-np":"\u{1F1F3}\u{1F1F5}","flag-nr":"\u{1F1F3}\u{1F1F7}","flag-nu":"\u{1F1F3}\u{1F1FA}","flag-nz":"\u{1F1F3}\u{1F1FF}","flag-om":"\u{1F1F4}\u{1F1F2}","flag-pa":"\u{1F1F5}\u{1F1E6}","flag-pe":"\u{1F1F5}\u{1F1EA}","flag-pf":"\u{1F1F5}\u{1F1EB}","flag-pg":"\u{1F1F5}\u{1F1EC}","flag-ph":"\u{1F1F5}\u{1F1ED}","flag-pk":"\u{1F1F5}\u{1F1F0}","flag-pl":"\u{1F1F5}\u{1F1F1}","flag-pm":"\u{1F1F5}\u{1F1F2}","flag-pn":"\u{1F1F5}\u{1F1F3}","flag-pr":"\u{1F1F5}\u{1F1F7}","flag-ps":"\u{1F1F5}\u{1F1F8}","flag-pt":"\u{1F1F5}\u{1F1F9}","flag-pw":"\u{1F1F5}\u{1F1FC}","flag-py":"\u{1F1F5}\u{1F1FE}","flag-qa":"\u{1F1F6}\u{1F1E6}","flag-re":"\u{1F1F7}\u{1F1EA}","flag-ro":"\u{1F1F7}\u{1F1F4}","flag-rs":"\u{1F1F7}\u{1F1F8}",ru:"\u{1F1F7}\u{1F1FA}","flag-ru":"\u{1F1F7}\u{1F1FA}","flag-rw":"\u{1F1F7}\u{1F1FC}","flag-sa":"\u{1F1F8}\u{1F1E6}","flag-sb":"\u{1F1F8}\u{1F1E7}","flag-sc":"\u{1F1F8}\u{1F1E8}","flag-sd":"\u{1F1F8}\u{1F1E9}","flag-se":"\u{1F1F8}\u{1F1EA}","flag-sg":"\u{1F1F8}\u{1F1EC}","flag-sh":"\u{1F1F8}\u{1F1ED}","flag-si":"\u{1F1F8}\u{1F1EE}","flag-sj":"\u{1F1F8}\u{1F1EF}","flag-sk":"\u{1F1F8}\u{1F1F0}","flag-sl":"\u{1F1F8}\u{1F1F1}","flag-sm":"\u{1F1F8}\u{1F1F2}","flag-sn":"\u{1F1F8}\u{1F1F3}","flag-so":"\u{1F1F8}\u{1F1F4}","flag-sr":"\u{1F1F8}\u{1F1F7}","flag-ss":"\u{1F1F8}\u{1F1F8}","flag-st":"\u{1F1F8}\u{1F1F9}","flag-sv":"\u{1F1F8}\u{1F1FB}","flag-sx":"\u{1F1F8}\u{1F1FD}","flag-sy":"\u{1F1F8}\u{1F1FE}","flag-sz":"\u{1F1F8}\u{1F1FF}","flag-ta":"\u{1F1F9}\u{1F1E6}","flag-tc":"\u{1F1F9}\u{1F1E8}","flag-td":"\u{1F1F9}\u{1F1E9}","flag-tf":"\u{1F1F9}\u{1F1EB}","flag-tg":"\u{1F1F9}\u{1F1EC}","flag-th":"\u{1F1F9}\u{1F1ED}","flag-tj":"\u{1F1F9}\u{1F1EF}","flag-tk":"\u{1F1F9}\u{1F1F0}","flag-tl":"\u{1F1F9}\u{1F1F1}","flag-tm":"\u{1F1F9}\u{1F1F2}","flag-tn":"\u{1F1F9}\u{1F1F3}","flag-to":"\u{1F1F9}\u{1F1F4}","flag-tr":"\u{1F1F9}\u{1F1F7}","flag-tt":"\u{1F1F9}\u{1F1F9}","flag-tv":"\u{1F1F9}\u{1F1FB}","flag-tw":"\u{1F1F9}\u{1F1FC}","flag-tz":"\u{1F1F9}\u{1F1FF}","flag-ua":"\u{1F1FA}\u{1F1E6}","flag-ug":"\u{1F1FA}\u{1F1EC}","flag-um":"\u{1F1FA}\u{1F1F2}","flag-un":"\u{1F1FA}\u{1F1F3}",us:"\u{1F1FA}\u{1F1F8}","flag-us":"\u{1F1FA}\u{1F1F8}","flag-uy":"\u{1F1FA}\u{1F1FE}","flag-uz":"\u{1F1FA}\u{1F1FF}","flag-va":"\u{1F1FB}\u{1F1E6}","flag-vc":"\u{1F1FB}\u{1F1E8}","flag-ve":"\u{1F1FB}\u{1F1EA}","flag-vg":"\u{1F1FB}\u{1F1EC}","flag-vi":"\u{1F1FB}\u{1F1EE}","flag-vn":"\u{1F1FB}\u{1F1F3}","flag-vu":"\u{1F1FB}\u{1F1FA}","flag-wf":"\u{1F1FC}\u{1F1EB}","flag-ws":"\u{1F1FC}\u{1F1F8}","flag-xk":"\u{1F1FD}\u{1F1F0}","flag-ye":"\u{1F1FE}\u{1F1EA}","flag-yt":"\u{1F1FE}\u{1F1F9}","flag-za":"\u{1F1FF}\u{1F1E6}","flag-zm":"\u{1F1FF}\u{1F1F2}","flag-zw":"\u{1F1FF}\u{1F1FC}",koko:"\u{1F201}",sa:"\u{1F202}\uFE0F",u7121:"\u{1F21A}",u6307:"\u{1F22F}",u7981:"\u{1F232}",u7a7a:"\u{1F233}",u5408:"\u{1F234}",u6e80:"\u{1F235}",u6709:"\u{1F236}",u6708:"\u{1F237}\uFE0F",u7533:"\u{1F238}",u5272:"\u{1F239}",u55b6:"\u{1F23A}",ideograph_advantage:"\u{1F250}",accept:"\u{1F251}",cyclone:"\u{1F300}",foggy:"\u{1F301}",closed_umbrella:"\u{1F302}",night_with_stars:"\u{1F303}",sunrise_over_mountains:"\u{1F304}",sunrise:"\u{1F305}",city_sunset:"\u{1F306}",city_sunrise:"\u{1F307}",rainbow:"\u{1F308}",bridge_at_night:"\u{1F309}",ocean:"\u{1F30A}",volcano:"\u{1F30B}",milky_way:"\u{1F30C}",earth_africa:"\u{1F30D}",earth_americas:"\u{1F30E}",earth_asia:"\u{1F30F}",globe_with_meridians:"\u{1F310}",new_moon:"\u{1F311}",waxing_crescent_moon:"\u{1F312}",first_quarter_moon:"\u{1F313}",moon:"\u{1F314}",waxing_gibbous_moon:"\u{1F314}",full_moon:"\u{1F315}",waning_gibbous_moon:"\u{1F316}",last_quarter_moon:"\u{1F317}",waning_crescent_moon:"\u{1F318}",crescent_moon:"\u{1F319}",new_moon_with_face:"\u{1F31A}",first_quarter_moon_with_face:"\u{1F31B}",last_quarter_moon_with_face:"\u{1F31C}",full_moon_with_face:"\u{1F31D}",sun_with_face:"\u{1F31E}",star2:"\u{1F31F}",stars:"\u{1F320}",thermometer:"\u{1F321}\uFE0F",mostly_sunny:"\u{1F324}\uFE0F",sun_small_cloud:"\u{1F324}\uFE0F",barely_sunny:"\u{1F325}\uFE0F",sun_behind_cloud:"\u{1F325}\uFE0F",partly_sunny_rain:"\u{1F326}\uFE0F",sun_behind_rain_cloud:"\u{1F326}\uFE0F",rain_cloud:"\u{1F327}\uFE0F",snow_cloud:"\u{1F328}\uFE0F",lightning:"\u{1F329}\uFE0F",lightning_cloud:"\u{1F329}\uFE0F",tornado:"\u{1F32A}\uFE0F",tornado_cloud:"\u{1F32A}\uFE0F",fog:"\u{1F32B}\uFE0F",wind_blowing_face:"\u{1F32C}\uFE0F",hotdog:"\u{1F32D}",taco:"\u{1F32E}",burrito:"\u{1F32F}",chestnut:"\u{1F330}",seedling:"\u{1F331}",evergreen_tree:"\u{1F332}",deciduous_tree:"\u{1F333}",palm_tree:"\u{1F334}",cactus:"\u{1F335}",hot_pepper:"\u{1F336}\uFE0F",tulip:"\u{1F337}",cherry_blossom:"\u{1F338}",rose:"\u{1F339}",hibiscus:"\u{1F33A}",sunflower:"\u{1F33B}",blossom:"\u{1F33C}",corn:"\u{1F33D}",ear_of_rice:"\u{1F33E}",herb:"\u{1F33F}",four_leaf_clover:"\u{1F340}",maple_leaf:"\u{1F341}",fallen_leaf:"\u{1F342}",leaves:"\u{1F343}",mushroom:"\u{1F344}",tomato:"\u{1F345}",eggplant:"\u{1F346}",grapes:"\u{1F347}",melon:"\u{1F348}",watermelon:"\u{1F349}",tangerine:"\u{1F34A}",lemon:"\u{1F34B}",banana:"\u{1F34C}",pineapple:"\u{1F34D}",apple:"\u{1F34E}",green_apple:"\u{1F34F}",pear:"\u{1F350}",peach:"\u{1F351}",cherries:"\u{1F352}",strawberry:"\u{1F353}",hamburger:"\u{1F354}",pizza:"\u{1F355}",meat_on_bone:"\u{1F356}",poultry_leg:"\u{1F357}",rice_cracker:"\u{1F358}",rice_ball:"\u{1F359}",rice:"\u{1F35A}",curry:"\u{1F35B}",ramen:"\u{1F35C}",spaghetti:"\u{1F35D}",bread:"\u{1F35E}",fries:"\u{1F35F}",sweet_potato:"\u{1F360}",dango:"\u{1F361}",oden:"\u{1F362}",sushi:"\u{1F363}",fried_shrimp:"\u{1F364}",fish_cake:"\u{1F365}",icecream:"\u{1F366}",shaved_ice:"\u{1F367}",ice_cream:"\u{1F368}",doughnut:"\u{1F369}",cookie:"\u{1F36A}",chocolate_bar:"\u{1F36B}",candy:"\u{1F36C}",lollipop:"\u{1F36D}",custard:"\u{1F36E}",honey_pot:"\u{1F36F}",cake:"\u{1F370}",bento:"\u{1F371}",stew:"\u{1F372}",fried_egg:"\u{1F373}",cooking:"\u{1F373}",fork_and_knife:"\u{1F374}",tea:"\u{1F375}",sake:"\u{1F376}",wine_glass:"\u{1F377}",cocktail:"\u{1F378}",tropical_drink:"\u{1F379}",beer:"\u{1F37A}",beers:"\u{1F37B}",baby_bottle:"\u{1F37C}",knife_fork_plate:"\u{1F37D}\uFE0F",champagne:"\u{1F37E}",popcorn:"\u{1F37F}",ribbon:"\u{1F380}",gift:"\u{1F381}",birthday:"\u{1F382}",jack_o_lantern:"\u{1F383}",christmas_tree:"\u{1F384}",santa:"\u{1F385}",fireworks:"\u{1F386}",sparkler:"\u{1F387}",balloon:"\u{1F388}",tada:"\u{1F389}",confetti_ball:"\u{1F38A}",tanabata_tree:"\u{1F38B}",crossed_flags:"\u{1F38C}",bamboo:"\u{1F38D}",dolls:"\u{1F38E}",flags:"\u{1F38F}",wind_chime:"\u{1F390}",rice_scene:"\u{1F391}",school_satchel:"\u{1F392}",mortar_board:"\u{1F393}",medal:"\u{1F396}\uFE0F",reminder_ribbon:"\u{1F397}\uFE0F",studio_microphone:"\u{1F399}\uFE0F",level_slider:"\u{1F39A}\uFE0F",control_knobs:"\u{1F39B}\uFE0F",film_frames:"\u{1F39E}\uFE0F",admission_tickets:"\u{1F39F}\uFE0F",carousel_horse:"\u{1F3A0}",ferris_wheel:"\u{1F3A1}",roller_coaster:"\u{1F3A2}",fishing_pole_and_fish:"\u{1F3A3}",microphone:"\u{1F3A4}",movie_camera:"\u{1F3A5}",cinema:"\u{1F3A6}",headphones:"\u{1F3A7}",art:"\u{1F3A8}",tophat:"\u{1F3A9}",circus_tent:"\u{1F3AA}",ticket:"\u{1F3AB}",clapper:"\u{1F3AC}",performing_arts:"\u{1F3AD}",video_game:"\u{1F3AE}",dart:"\u{1F3AF}",slot_machine:"\u{1F3B0}","8ball":"\u{1F3B1}",game_die:"\u{1F3B2}",bowling:"\u{1F3B3}",flower_playing_cards:"\u{1F3B4}",musical_note:"\u{1F3B5}",notes:"\u{1F3B6}",saxophone:"\u{1F3B7}",guitar:"\u{1F3B8}",musical_keyboard:"\u{1F3B9}",trumpet:"\u{1F3BA}",violin:"\u{1F3BB}",musical_score:"\u{1F3BC}",running_shirt_with_sash:"\u{1F3BD}",tennis:"\u{1F3BE}",ski:"\u{1F3BF}",basketball:"\u{1F3C0}",checkered_flag:"\u{1F3C1}",snowboarder:"\u{1F3C2}","woman-running":"\u{1F3C3}\u200D\u2640\uFE0F",running_woman:"\u{1F3C3}\u200D\u2640\uFE0F","man-running":"\u{1F3C3}\u200D\u2642\uFE0F",runner:"\u{1F3C3}\u200D\u2642\uFE0F",running:"\u{1F3C3}\u200D\u2642\uFE0F",running_man:"\u{1F3C3}\u200D\u2642\uFE0F","woman-surfing":"\u{1F3C4}\u200D\u2640\uFE0F",surfing_woman:"\u{1F3C4}\u200D\u2640\uFE0F","man-surfing":"\u{1F3C4}\u200D\u2642\uFE0F",surfer:"\u{1F3C4}\u200D\u2642\uFE0F",surfing_man:"\u{1F3C4}\u200D\u2642\uFE0F",sports_medal:"\u{1F3C5}",trophy:"\u{1F3C6}",horse_racing:"\u{1F3C7}",football:"\u{1F3C8}",rugby_football:"\u{1F3C9}","woman-swimming":"\u{1F3CA}\u200D\u2640\uFE0F",swimming_woman:"\u{1F3CA}\u200D\u2640\uFE0F","man-swimming":"\u{1F3CA}\u200D\u2642\uFE0F",swimmer:"\u{1F3CA}\u200D\u2642\uFE0F",swimming_man:"\u{1F3CA}\u200D\u2642\uFE0F","woman-lifting-weights":"\u{1F3CB}\uFE0F\u200D\u2640\uFE0F",weight_lifting_woman:"\u{1F3CB}\uFE0F\u200D\u2640\uFE0F","man-lifting-weights":"\u{1F3CB}\uFE0F\u200D\u2642\uFE0F",weight_lifter:"\u{1F3CB}\uFE0F\u200D\u2642\uFE0F",weight_lifting_man:"\u{1F3CB}\uFE0F\u200D\u2642\uFE0F","woman-golfing":"\u{1F3CC}\uFE0F\u200D\u2640\uFE0F",golfing_woman:"\u{1F3CC}\uFE0F\u200D\u2640\uFE0F","man-golfing":"\u{1F3CC}\uFE0F\u200D\u2642\uFE0F",golfer:"\u{1F3CC}\uFE0F\u200D\u2642\uFE0F",golfing_man:"\u{1F3CC}\uFE0F\u200D\u2642\uFE0F",racing_motorcycle:"\u{1F3CD}\uFE0F",racing_car:"\u{1F3CE}\uFE0F",cricket_bat_and_ball:"\u{1F3CF}",volleyball:"\u{1F3D0}",field_hockey_stick_and_ball:"\u{1F3D1}",ice_hockey_stick_and_puck:"\u{1F3D2}",table_tennis_paddle_and_ball:"\u{1F3D3}",snow_capped_mountain:"\u{1F3D4}\uFE0F",camping:"\u{1F3D5}\uFE0F",beach_with_umbrella:"\u{1F3D6}\uFE0F",building_construction:"\u{1F3D7}\uFE0F",house_buildings:"\u{1F3D8}\uFE0F",cityscape:"\u{1F3D9}\uFE0F",derelict_house_building:"\u{1F3DA}\uFE0F",classical_building:"\u{1F3DB}\uFE0F",desert:"\u{1F3DC}\uFE0F",desert_island:"\u{1F3DD}\uFE0F",national_park:"\u{1F3DE}\uFE0F",stadium:"\u{1F3DF}\uFE0F",house:"\u{1F3E0}",house_with_garden:"\u{1F3E1}",office:"\u{1F3E2}",post_office:"\u{1F3E3}",european_post_office:"\u{1F3E4}",hospital:"\u{1F3E5}",bank:"\u{1F3E6}",atm:"\u{1F3E7}",hotel:"\u{1F3E8}",love_hotel:"\u{1F3E9}",convenience_store:"\u{1F3EA}",school:"\u{1F3EB}",department_store:"\u{1F3EC}",factory:"\u{1F3ED}",izakaya_lantern:"\u{1F3EE}",lantern:"\u{1F3EE}",japanese_castle:"\u{1F3EF}",european_castle:"\u{1F3F0}","rainbow-flag":"\u{1F3F3}\uFE0F\u200D\u{1F308}",transgender_flag:"\u{1F3F3}\uFE0F\u200D\u26A7\uFE0F",waving_white_flag:"\u{1F3F3}\uFE0F",pirate_flag:"\u{1F3F4}\u200D\u2620\uFE0F","flag-england":"\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}","flag-scotland":"\u{1F3F4}\u{E0067}\u{E0062}\u{E0073}\u{E0063}\u{E0074}\u{E007F}","flag-wales":"\u{1F3F4}\u{E0067}\u{E0062}\u{E0077}\u{E006C}\u{E0073}\u{E007F}",waving_black_flag:"\u{1F3F4}",rosette:"\u{1F3F5}\uFE0F",label:"\u{1F3F7}\uFE0F",badminton_racquet_and_shuttlecock:"\u{1F3F8}",bow_and_arrow:"\u{1F3F9}",amphora:"\u{1F3FA}","skin-tone-2":"\u{1F3FB}","skin-tone-3":"\u{1F3FC}","skin-tone-4":"\u{1F3FD}","skin-tone-5":"\u{1F3FE}","skin-tone-6":"\u{1F3FF}",rat:"\u{1F400}",mouse2:"\u{1F401}",ox:"\u{1F402}",water_buffalo:"\u{1F403}",cow2:"\u{1F404}",tiger2:"\u{1F405}",leopard:"\u{1F406}",rabbit2:"\u{1F407}",black_cat:"\u{1F408}\u200D\u2B1B",cat2:"\u{1F408}",dragon:"\u{1F409}",crocodile:"\u{1F40A}",whale2:"\u{1F40B}",snail:"\u{1F40C}",snake:"\u{1F40D}",racehorse:"\u{1F40E}",ram:"\u{1F40F}",goat:"\u{1F410}",sheep:"\u{1F411}",monkey:"\u{1F412}",rooster:"\u{1F413}",chicken:"\u{1F414}",service_dog:"\u{1F415}\u200D\u{1F9BA}",dog2:"\u{1F415}",pig2:"\u{1F416}",boar:"\u{1F417}",elephant:"\u{1F418}",octopus:"\u{1F419}",shell:"\u{1F41A}",bug:"\u{1F41B}",ant:"\u{1F41C}",bee:"\u{1F41D}",honeybee:"\u{1F41D}",ladybug:"\u{1F41E}",lady_beetle:"\u{1F41E}",fish:"\u{1F41F}",tropical_fish:"\u{1F420}",blowfish:"\u{1F421}",turtle:"\u{1F422}",hatching_chick:"\u{1F423}",baby_chick:"\u{1F424}",hatched_chick:"\u{1F425}",bird:"\u{1F426}",penguin:"\u{1F427}",koala:"\u{1F428}",poodle:"\u{1F429}",dromedary_camel:"\u{1F42A}",camel:"\u{1F42B}",dolphin:"\u{1F42C}",flipper:"\u{1F42C}",mouse:"\u{1F42D}",cow:"\u{1F42E}",tiger:"\u{1F42F}",rabbit:"\u{1F430}",cat:"\u{1F431}",dragon_face:"\u{1F432}",whale:"\u{1F433}",horse:"\u{1F434}",monkey_face:"\u{1F435}",dog:"\u{1F436}",pig:"\u{1F437}",frog:"\u{1F438}",hamster:"\u{1F439}",wolf:"\u{1F43A}",polar_bear:"\u{1F43B}\u200D\u2744\uFE0F",bear:"\u{1F43B}",panda_face:"\u{1F43C}",pig_nose:"\u{1F43D}",feet:"\u{1F43E}",paw_prints:"\u{1F43E}",chipmunk:"\u{1F43F}\uFE0F",eyes:"\u{1F440}","eye-in-speech-bubble":"\u{1F441}\uFE0F\u200D\u{1F5E8}\uFE0F",eye:"\u{1F441}\uFE0F",ear:"\u{1F442}",nose:"\u{1F443}",lips:"\u{1F444}",tongue:"\u{1F445}",point_up_2:"\u{1F446}",point_down:"\u{1F447}",point_left:"\u{1F448}",point_right:"\u{1F449}",facepunch:"\u{1F44A}",punch:"\u{1F44A}",wave:"\u{1F44B}",ok_hand:"\u{1F44C}","+1":"\u{1F44D}",thumbsup:"\u{1F44D}","-1":"\u{1F44E}",thumbsdown:"\u{1F44E}",clap:"\u{1F44F}",open_hands:"\u{1F450}",crown:"\u{1F451}",womans_hat:"\u{1F452}",eyeglasses:"\u{1F453}",necktie:"\u{1F454}",shirt:"\u{1F455}",tshirt:"\u{1F455}",jeans:"\u{1F456}",dress:"\u{1F457}",kimono:"\u{1F458}",bikini:"\u{1F459}",womans_clothes:"\u{1F45A}",purse:"\u{1F45B}",handbag:"\u{1F45C}",pouch:"\u{1F45D}",mans_shoe:"\u{1F45E}",shoe:"\u{1F45E}",athletic_shoe:"\u{1F45F}",high_heel:"\u{1F460}",sandal:"\u{1F461}",boot:"\u{1F462}",footprints:"\u{1F463}",bust_in_silhouette:"\u{1F464}",busts_in_silhouette:"\u{1F465}",boy:"\u{1F466}",girl:"\u{1F467}","male-farmer":"\u{1F468}\u200D\u{1F33E}","male-cook":"\u{1F468}\u200D\u{1F373}",man_feeding_baby:"\u{1F468}\u200D\u{1F37C}","male-student":"\u{1F468}\u200D\u{1F393}","male-singer":"\u{1F468}\u200D\u{1F3A4}","male-artist":"\u{1F468}\u200D\u{1F3A8}","male-teacher":"\u{1F468}\u200D\u{1F3EB}","male-factory-worker":"\u{1F468}\u200D\u{1F3ED}","man-boy-boy":"\u{1F468}\u200D\u{1F466}\u200D\u{1F466}","man-boy":"\u{1F468}\u200D\u{1F466}","man-girl-boy":"\u{1F468}\u200D\u{1F467}\u200D\u{1F466}","man-girl-girl":"\u{1F468}\u200D\u{1F467}\u200D\u{1F467}","man-girl":"\u{1F468}\u200D\u{1F467}","man-man-boy":"\u{1F468}\u200D\u{1F468}\u200D\u{1F466}","man-man-boy-boy":"\u{1F468}\u200D\u{1F468}\u200D\u{1F466}\u200D\u{1F466}","man-man-girl":"\u{1F468}\u200D\u{1F468}\u200D\u{1F467}","man-man-girl-boy":"\u{1F468}\u200D\u{1F468}\u200D\u{1F467}\u200D\u{1F466}","man-man-girl-girl":"\u{1F468}\u200D\u{1F468}\u200D\u{1F467}\u200D\u{1F467}","man-woman-boy":"\u{1F468}\u200D\u{1F469}\u200D\u{1F466}",family:"\u{1F468}\u200D\u{1F469}\u200D\u{1F466}","man-woman-boy-boy":"\u{1F468}\u200D\u{1F469}\u200D\u{1F466}\u200D\u{1F466}","man-woman-girl":"\u{1F468}\u200D\u{1F469}\u200D\u{1F467}","man-woman-girl-boy":"\u{1F468}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F466}","man-woman-girl-girl":"\u{1F468}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F467}","male-technologist":"\u{1F468}\u200D\u{1F4BB}","male-office-worker":"\u{1F468}\u200D\u{1F4BC}","male-mechanic":"\u{1F468}\u200D\u{1F527}","male-scientist":"\u{1F468}\u200D\u{1F52C}","male-astronaut":"\u{1F468}\u200D\u{1F680}","male-firefighter":"\u{1F468}\u200D\u{1F692}",man_with_probing_cane:"\u{1F468}\u200D\u{1F9AF}",red_haired_man:"\u{1F468}\u200D\u{1F9B0}",curly_haired_man:"\u{1F468}\u200D\u{1F9B1}",bald_man:"\u{1F468}\u200D\u{1F9B2}",white_haired_man:"\u{1F468}\u200D\u{1F9B3}",man_in_motorized_wheelchair:"\u{1F468}\u200D\u{1F9BC}",man_in_manual_wheelchair:"\u{1F468}\u200D\u{1F9BD}","male-doctor":"\u{1F468}\u200D\u2695\uFE0F","male-judge":"\u{1F468}\u200D\u2696\uFE0F","male-pilot":"\u{1F468}\u200D\u2708\uFE0F","man-heart-man":"\u{1F468}\u200D\u2764\uFE0F\u200D\u{1F468}","man-kiss-man":"\u{1F468}\u200D\u2764\uFE0F\u200D\u{1F48B}\u200D\u{1F468}",man:"\u{1F468}","female-farmer":"\u{1F469}\u200D\u{1F33E}","female-cook":"\u{1F469}\u200D\u{1F373}",woman_feeding_baby:"\u{1F469}\u200D\u{1F37C}","female-student":"\u{1F469}\u200D\u{1F393}","female-singer":"\u{1F469}\u200D\u{1F3A4}","female-artist":"\u{1F469}\u200D\u{1F3A8}","female-teacher":"\u{1F469}\u200D\u{1F3EB}","female-factory-worker":"\u{1F469}\u200D\u{1F3ED}","woman-boy-boy":"\u{1F469}\u200D\u{1F466}\u200D\u{1F466}","woman-boy":"\u{1F469}\u200D\u{1F466}","woman-girl-boy":"\u{1F469}\u200D\u{1F467}\u200D\u{1F466}","woman-girl-girl":"\u{1F469}\u200D\u{1F467}\u200D\u{1F467}","woman-girl":"\u{1F469}\u200D\u{1F467}","woman-woman-boy":"\u{1F469}\u200D\u{1F469}\u200D\u{1F466}","woman-woman-boy-boy":"\u{1F469}\u200D\u{1F469}\u200D\u{1F466}\u200D\u{1F466}","woman-woman-girl":"\u{1F469}\u200D\u{1F469}\u200D\u{1F467}","woman-woman-girl-boy":"\u{1F469}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F466}","woman-woman-girl-girl":"\u{1F469}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F467}","female-technologist":"\u{1F469}\u200D\u{1F4BB}","female-office-worker":"\u{1F469}\u200D\u{1F4BC}","female-mechanic":"\u{1F469}\u200D\u{1F527}","female-scientist":"\u{1F469}\u200D\u{1F52C}","female-astronaut":"\u{1F469}\u200D\u{1F680}","female-firefighter":"\u{1F469}\u200D\u{1F692}",woman_with_probing_cane:"\u{1F469}\u200D\u{1F9AF}",red_haired_woman:"\u{1F469}\u200D\u{1F9B0}",curly_haired_woman:"\u{1F469}\u200D\u{1F9B1}",bald_woman:"\u{1F469}\u200D\u{1F9B2}",white_haired_woman:"\u{1F469}\u200D\u{1F9B3}",woman_in_motorized_wheelchair:"\u{1F469}\u200D\u{1F9BC}",woman_in_manual_wheelchair:"\u{1F469}\u200D\u{1F9BD}","female-doctor":"\u{1F469}\u200D\u2695\uFE0F","female-judge":"\u{1F469}\u200D\u2696\uFE0F","female-pilot":"\u{1F469}\u200D\u2708\uFE0F","woman-heart-man":"\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F468}","woman-heart-woman":"\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F469}","woman-kiss-man":"\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F48B}\u200D\u{1F468}","woman-kiss-woman":"\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F48B}\u200D\u{1F469}",woman:"\u{1F469}",man_and_woman_holding_hands:"\u{1F46B}",woman_and_man_holding_hands:"\u{1F46B}",couple:"\u{1F46B}",two_men_holding_hands:"\u{1F46C}",men_holding_hands:"\u{1F46C}",two_women_holding_hands:"\u{1F46D}",women_holding_hands:"\u{1F46D}","female-police-officer":"\u{1F46E}\u200D\u2640\uFE0F","male-police-officer":"\u{1F46E}\u200D\u2642\uFE0F",cop:"\u{1F46E}\u200D\u2642\uFE0F","women-with-bunny-ears-partying":"\u{1F46F}\u200D\u2640\uFE0F","woman-with-bunny-ears-partying":"\u{1F46F}\u200D\u2640\uFE0F",dancers:"\u{1F46F}\u200D\u2640\uFE0F","men-with-bunny-ears-partying":"\u{1F46F}\u200D\u2642\uFE0F","man-with-bunny-ears-partying":"\u{1F46F}\u200D\u2642\uFE0F",woman_with_veil:"\u{1F470}\u200D\u2640\uFE0F",man_with_veil:"\u{1F470}\u200D\u2642\uFE0F",bride_with_veil:"\u{1F470}","blond-haired-woman":"\u{1F471}\u200D\u2640\uFE0F","blond-haired-man":"\u{1F471}\u200D\u2642\uFE0F",person_with_blond_hair:"\u{1F471}\u200D\u2642\uFE0F",man_with_gua_pi_mao:"\u{1F472}","woman-wearing-turban":"\u{1F473}\u200D\u2640\uFE0F",woman_with_turban:"\u{1F473}\u200D\u2640\uFE0F","man-wearing-turban":"\u{1F473}\u200D\u2642\uFE0F",man_with_turban:"\u{1F473}\u200D\u2642\uFE0F",older_man:"\u{1F474}",older_woman:"\u{1F475}",baby:"\u{1F476}","female-construction-worker":"\u{1F477}\u200D\u2640\uFE0F","male-construction-worker":"\u{1F477}\u200D\u2642\uFE0F",construction_worker:"\u{1F477}\u200D\u2642\uFE0F",princess:"\u{1F478}",japanese_ogre:"\u{1F479}",japanese_goblin:"\u{1F47A}",ghost:"\u{1F47B}",angel:"\u{1F47C}",alien:"\u{1F47D}",space_invader:"\u{1F47E}",imp:"\u{1F47F}",skull:"\u{1F480}","woman-tipping-hand":"\u{1F481}\u200D\u2640\uFE0F",information_desk_person:"\u{1F481}\u200D\u2640\uFE0F",tipping_hand_woman:"\u{1F481}\u200D\u2640\uFE0F","man-tipping-hand":"\u{1F481}\u200D\u2642\uFE0F",tipping_hand_man:"\u{1F481}\u200D\u2642\uFE0F","female-guard":"\u{1F482}\u200D\u2640\uFE0F",guardswoman:"\u{1F482}\u200D\u2640\uFE0F","male-guard":"\u{1F482}\u200D\u2642\uFE0F",guardsman:"\u{1F482}\u200D\u2642\uFE0F",dancer:"\u{1F483}",lipstick:"\u{1F484}",nail_care:"\u{1F485}","woman-getting-massage":"\u{1F486}\u200D\u2640\uFE0F",massage:"\u{1F486}\u200D\u2640\uFE0F","man-getting-massage":"\u{1F486}\u200D\u2642\uFE0F","woman-getting-haircut":"\u{1F487}\u200D\u2640\uFE0F",haircut:"\u{1F487}\u200D\u2640\uFE0F","man-getting-haircut":"\u{1F487}\u200D\u2642\uFE0F",barber:"\u{1F488}",syringe:"\u{1F489}",pill:"\u{1F48A}",kiss:"\u{1F48B}",love_letter:"\u{1F48C}",ring:"\u{1F48D}",gem:"\u{1F48E}",couplekiss:"\u{1F48F}",bouquet:"\u{1F490}",couple_with_heart:"\u{1F491}",wedding:"\u{1F492}",heartbeat:"\u{1F493}",broken_heart:"\u{1F494}",two_hearts:"\u{1F495}",sparkling_heart:"\u{1F496}",heartpulse:"\u{1F497}",cupid:"\u{1F498}",blue_heart:"\u{1F499}",green_heart:"\u{1F49A}",yellow_heart:"\u{1F49B}",purple_heart:"\u{1F49C}",gift_heart:"\u{1F49D}",revolving_hearts:"\u{1F49E}",heart_decoration:"\u{1F49F}",diamond_shape_with_a_dot_inside:"\u{1F4A0}",bulb:"\u{1F4A1}",anger:"\u{1F4A2}",bomb:"\u{1F4A3}",zzz:"\u{1F4A4}",boom:"\u{1F4A5}",collision:"\u{1F4A5}",sweat_drops:"\u{1F4A6}",droplet:"\u{1F4A7}",dash:"\u{1F4A8}",hankey:"\u{1F4A9}",poop:"\u{1F4A9}",shit:"\u{1F4A9}",muscle:"\u{1F4AA}",dizzy:"\u{1F4AB}",speech_balloon:"\u{1F4AC}",thought_balloon:"\u{1F4AD}",white_flower:"\u{1F4AE}",moneybag:"\u{1F4B0}",currency_exchange:"\u{1F4B1}",heavy_dollar_sign:"\u{1F4B2}",credit_card:"\u{1F4B3}",yen:"\u{1F4B4}",dollar:"\u{1F4B5}",euro:"\u{1F4B6}",pound:"\u{1F4B7}",money_with_wings:"\u{1F4B8}",chart:"\u{1F4B9}",seat:"\u{1F4BA}",computer:"\u{1F4BB}",briefcase:"\u{1F4BC}",minidisc:"\u{1F4BD}",floppy_disk:"\u{1F4BE}",cd:"\u{1F4BF}",dvd:"\u{1F4C0}",file_folder:"\u{1F4C1}",open_file_folder:"\u{1F4C2}",page_with_curl:"\u{1F4C3}",page_facing_up:"\u{1F4C4}",date:"\u{1F4C5}",calendar:"\u{1F4C6}",card_index:"\u{1F4C7}",chart_with_upwards_trend:"\u{1F4C8}",chart_with_downwards_trend:"\u{1F4C9}",bar_chart:"\u{1F4CA}",clipboard:"\u{1F4CB}",pushpin:"\u{1F4CC}",round_pushpin:"\u{1F4CD}",paperclip:"\u{1F4CE}",straight_ruler:"\u{1F4CF}",triangular_ruler:"\u{1F4D0}",bookmark_tabs:"\u{1F4D1}",ledger:"\u{1F4D2}",notebook:"\u{1F4D3}",notebook_with_decorative_cover:"\u{1F4D4}",closed_book:"\u{1F4D5}",book:"\u{1F4D6}",open_book:"\u{1F4D6}",green_book:"\u{1F4D7}",blue_book:"\u{1F4D8}",orange_book:"\u{1F4D9}",books:"\u{1F4DA}",name_badge:"\u{1F4DB}",scroll:"\u{1F4DC}",memo:"\u{1F4DD}",pencil:"\u{1F4DD}",telephone_receiver:"\u{1F4DE}",pager:"\u{1F4DF}",fax:"\u{1F4E0}",satellite_antenna:"\u{1F4E1}",loudspeaker:"\u{1F4E2}",mega:"\u{1F4E3}",outbox_tray:"\u{1F4E4}",inbox_tray:"\u{1F4E5}",package:"\u{1F4E6}","e-mail":"\u{1F4E7}",incoming_envelope:"\u{1F4E8}",envelope_with_arrow:"\u{1F4E9}",mailbox_closed:"\u{1F4EA}",mailbox:"\u{1F4EB}",mailbox_with_mail:"\u{1F4EC}",mailbox_with_no_mail:"\u{1F4ED}",postbox:"\u{1F4EE}",postal_horn:"\u{1F4EF}",newspaper:"\u{1F4F0}",iphone:"\u{1F4F1}",calling:"\u{1F4F2}",vibration_mode:"\u{1F4F3}",mobile_phone_off:"\u{1F4F4}",no_mobile_phones:"\u{1F4F5}",signal_strength:"\u{1F4F6}",camera:"\u{1F4F7}",camera_with_flash:"\u{1F4F8}",video_camera:"\u{1F4F9}",tv:"\u{1F4FA}",radio:"\u{1F4FB}",vhs:"\u{1F4FC}",film_projector:"\u{1F4FD}\uFE0F",prayer_beads:"\u{1F4FF}",twisted_rightwards_arrows:"\u{1F500}",repeat:"\u{1F501}",repeat_one:"\u{1F502}",arrows_clockwise:"\u{1F503}",arrows_counterclockwise:"\u{1F504}",low_brightness:"\u{1F505}",high_brightness:"\u{1F506}",mute:"\u{1F507}",speaker:"\u{1F508}",sound:"\u{1F509}",loud_sound:"\u{1F50A}",battery:"\u{1F50B}",electric_plug:"\u{1F50C}",mag:"\u{1F50D}",mag_right:"\u{1F50E}",lock_with_ink_pen:"\u{1F50F}",closed_lock_with_key:"\u{1F510}",key:"\u{1F511}",lock:"\u{1F512}",unlock:"\u{1F513}",bell:"\u{1F514}",no_bell:"\u{1F515}",bookmark:"\u{1F516}",link:"\u{1F517}",radio_button:"\u{1F518}",back:"\u{1F519}",end:"\u{1F51A}",on:"\u{1F51B}",soon:"\u{1F51C}",top:"\u{1F51D}",underage:"\u{1F51E}",keycap_ten:"\u{1F51F}",capital_abcd:"\u{1F520}",abcd:"\u{1F521}",symbols:"\u{1F523}",abc:"\u{1F524}",fire:"\u{1F525}",flashlight:"\u{1F526}",wrench:"\u{1F527}",hammer:"\u{1F528}",nut_and_bolt:"\u{1F529}",hocho:"\u{1F52A}",knife:"\u{1F52A}",gun:"\u{1F52B}",microscope:"\u{1F52C}",telescope:"\u{1F52D}",crystal_ball:"\u{1F52E}",six_pointed_star:"\u{1F52F}",beginner:"\u{1F530}",trident:"\u{1F531}",black_square_button:"\u{1F532}",white_square_button:"\u{1F533}",red_circle:"\u{1F534}",large_blue_circle:"\u{1F535}",large_orange_diamond:"\u{1F536}",large_blue_diamond:"\u{1F537}",small_orange_diamond:"\u{1F538}",small_blue_diamond:"\u{1F539}",small_red_triangle:"\u{1F53A}",small_red_triangle_down:"\u{1F53B}",arrow_up_small:"\u{1F53C}",arrow_down_small:"\u{1F53D}",om_symbol:"\u{1F549}\uFE0F",dove_of_peace:"\u{1F54A}\uFE0F",kaaba:"\u{1F54B}",mosque:"\u{1F54C}",synagogue:"\u{1F54D}",menorah_with_nine_branches:"\u{1F54E}",clock1:"\u{1F550}",clock2:"\u{1F551}",clock3:"\u{1F552}",clock4:"\u{1F553}",clock5:"\u{1F554}",clock6:"\u{1F555}",clock7:"\u{1F556}",clock8:"\u{1F557}",clock9:"\u{1F558}",clock10:"\u{1F559}",clock11:"\u{1F55A}",clock12:"\u{1F55B}",clock130:"\u{1F55C}",clock230:"\u{1F55D}",clock330:"\u{1F55E}",clock430:"\u{1F55F}",clock530:"\u{1F560}",clock630:"\u{1F561}",clock730:"\u{1F562}",clock830:"\u{1F563}",clock930:"\u{1F564}",clock1030:"\u{1F565}",clock1130:"\u{1F566}",clock1230:"\u{1F567}",candle:"\u{1F56F}\uFE0F",mantelpiece_clock:"\u{1F570}\uFE0F",hole:"\u{1F573}\uFE0F",man_in_business_suit_levitating:"\u{1F574}\uFE0F","female-detective":"\u{1F575}\uFE0F\u200D\u2640\uFE0F","male-detective":"\u{1F575}\uFE0F\u200D\u2642\uFE0F",sleuth_or_spy:"\u{1F575}\uFE0F\u200D\u2642\uFE0F",dark_sunglasses:"\u{1F576}\uFE0F",spider:"\u{1F577}\uFE0F",spider_web:"\u{1F578}\uFE0F",joystick:"\u{1F579}\uFE0F",man_dancing:"\u{1F57A}",linked_paperclips:"\u{1F587}\uFE0F",lower_left_ballpoint_pen:"\u{1F58A}\uFE0F",lower_left_fountain_pen:"\u{1F58B}\uFE0F",lower_left_paintbrush:"\u{1F58C}\uFE0F",lower_left_crayon:"\u{1F58D}\uFE0F",raised_hand_with_fingers_splayed:"\u{1F590}\uFE0F",middle_finger:"\u{1F595}",reversed_hand_with_middle_finger_extended:"\u{1F595}","spock-hand":"\u{1F596}",black_heart:"\u{1F5A4}",desktop_computer:"\u{1F5A5}\uFE0F",printer:"\u{1F5A8}\uFE0F",three_button_mouse:"\u{1F5B1}\uFE0F",trackball:"\u{1F5B2}\uFE0F",frame_with_picture:"\u{1F5BC}\uFE0F",card_index_dividers:"\u{1F5C2}\uFE0F",card_file_box:"\u{1F5C3}\uFE0F",file_cabinet:"\u{1F5C4}\uFE0F",wastebasket:"\u{1F5D1}\uFE0F",spiral_note_pad:"\u{1F5D2}\uFE0F",spiral_calendar_pad:"\u{1F5D3}\uFE0F",compression:"\u{1F5DC}\uFE0F",old_key:"\u{1F5DD}\uFE0F",rolled_up_newspaper:"\u{1F5DE}\uFE0F",dagger_knife:"\u{1F5E1}\uFE0F",speaking_head_in_silhouette:"\u{1F5E3}\uFE0F",left_speech_bubble:"\u{1F5E8}\uFE0F",right_anger_bubble:"\u{1F5EF}\uFE0F",ballot_box_with_ballot:"\u{1F5F3}\uFE0F",world_map:"\u{1F5FA}\uFE0F",mount_fuji:"\u{1F5FB}",tokyo_tower:"\u{1F5FC}",statue_of_liberty:"\u{1F5FD}",japan:"\u{1F5FE}",moyai:"\u{1F5FF}",grinning:"\u{1F600}",grin:"\u{1F601}",joy:"\u{1F602}",smiley:"\u{1F603}",smile:"\u{1F604}",sweat_smile:"\u{1F605}",laughing:"\u{1F606}",satisfied:"\u{1F606}",innocent:"\u{1F607}",smiling_imp:"\u{1F608}",wink:"\u{1F609}",blush:"\u{1F60A}",yum:"\u{1F60B}",relieved:"\u{1F60C}",heart_eyes:"\u{1F60D}",sunglasses:"\u{1F60E}",smirk:"\u{1F60F}",neutral_face:"\u{1F610}",expressionless:"\u{1F611}",unamused:"\u{1F612}",sweat:"\u{1F613}",pensive:"\u{1F614}",confused:"\u{1F615}",confounded:"\u{1F616}",kissing:"\u{1F617}",kissing_heart:"\u{1F618}",kissing_smiling_eyes:"\u{1F619}",kissing_closed_eyes:"\u{1F61A}",stuck_out_tongue:"\u{1F61B}",stuck_out_tongue_winking_eye:"\u{1F61C}",stuck_out_tongue_closed_eyes:"\u{1F61D}",disappointed:"\u{1F61E}",worried:"\u{1F61F}",angry:"\u{1F620}",rage:"\u{1F621}",cry:"\u{1F622}",persevere:"\u{1F623}",triumph:"\u{1F624}",disappointed_relieved:"\u{1F625}",frowning:"\u{1F626}",anguished:"\u{1F627}",fearful:"\u{1F628}",weary:"\u{1F629}",sleepy:"\u{1F62A}",tired_face:"\u{1F62B}",grimacing:"\u{1F62C}",sob:"\u{1F62D}",face_exhaling:"\u{1F62E}\u200D\u{1F4A8}",open_mouth:"\u{1F62E}",hushed:"\u{1F62F}",cold_sweat:"\u{1F630}",scream:"\u{1F631}",astonished:"\u{1F632}",flushed:"\u{1F633}",sleeping:"\u{1F634}",face_with_spiral_eyes:"\u{1F635}\u200D\u{1F4AB}",dizzy_face:"\u{1F635}",face_in_clouds:"\u{1F636}\u200D\u{1F32B}\uFE0F",no_mouth:"\u{1F636}",mask:"\u{1F637}",smile_cat:"\u{1F638}",joy_cat:"\u{1F639}",smiley_cat:"\u{1F63A}",heart_eyes_cat:"\u{1F63B}",smirk_cat:"\u{1F63C}",kissing_cat:"\u{1F63D}",pouting_cat:"\u{1F63E}",crying_cat_face:"\u{1F63F}",scream_cat:"\u{1F640}",slightly_frowning_face:"\u{1F641}",slightly_smiling_face:"\u{1F642}",upside_down_face:"\u{1F643}",face_with_rolling_eyes:"\u{1F644}","woman-gesturing-no":"\u{1F645}\u200D\u2640\uFE0F",no_good:"\u{1F645}\u200D\u2640\uFE0F","man-gesturing-no":"\u{1F645}\u200D\u2642\uFE0F","woman-gesturing-ok":"\u{1F646}\u200D\u2640\uFE0F",ok_woman:"\u{1F646}\u200D\u2640\uFE0F","man-gesturing-ok":"\u{1F646}\u200D\u2642\uFE0F","woman-bowing":"\u{1F647}\u200D\u2640\uFE0F",bowing_woman:"\u{1F647}\u200D\u2640\uFE0F","man-bowing":"\u{1F647}\u200D\u2642\uFE0F",bow:"\u{1F647}\u200D\u2642\uFE0F",bowing_man:"\u{1F647}\u200D\u2642\uFE0F",see_no_evil:"\u{1F648}",hear_no_evil:"\u{1F649}",speak_no_evil:"\u{1F64A}","woman-raising-hand":"\u{1F64B}\u200D\u2640\uFE0F",raising_hand:"\u{1F64B}\u200D\u2640\uFE0F",raising_hand_woman:"\u{1F64B}\u200D\u2640\uFE0F","man-raising-hand":"\u{1F64B}\u200D\u2642\uFE0F",raising_hand_man:"\u{1F64B}\u200D\u2642\uFE0F",raised_hands:"\u{1F64C}","woman-frowning":"\u{1F64D}\u200D\u2640\uFE0F",person_frowning:"\u{1F64D}\u200D\u2640\uFE0F",frowning_woman:"\u{1F64D}\u200D\u2640\uFE0F","man-frowning":"\u{1F64D}\u200D\u2642\uFE0F",frowning_man:"\u{1F64D}\u200D\u2642\uFE0F","woman-pouting":"\u{1F64E}\u200D\u2640\uFE0F",person_with_pouting_face:"\u{1F64E}\u200D\u2640\uFE0F",pouting_woman:"\u{1F64E}\u200D\u2640\uFE0F","man-pouting":"\u{1F64E}\u200D\u2642\uFE0F",pouting_man:"\u{1F64E}\u200D\u2642\uFE0F",pray:"\u{1F64F}",rocket:"\u{1F680}",helicopter:"\u{1F681}",steam_locomotive:"\u{1F682}",railway_car:"\u{1F683}",bullettrain_side:"\u{1F684}",bullettrain_front:"\u{1F685}",train2:"\u{1F686}",metro:"\u{1F687}",light_rail:"\u{1F688}",station:"\u{1F689}",tram:"\u{1F68A}",train:"\u{1F68B}",bus:"\u{1F68C}",oncoming_bus:"\u{1F68D}",trolleybus:"\u{1F68E}",busstop:"\u{1F68F}",minibus:"\u{1F690}",ambulance:"\u{1F691}",fire_engine:"\u{1F692}",police_car:"\u{1F693}",oncoming_police_car:"\u{1F694}",taxi:"\u{1F695}",oncoming_taxi:"\u{1F696}",car:"\u{1F697}",red_car:"\u{1F697}",oncoming_automobile:"\u{1F698}",blue_car:"\u{1F699}",truck:"\u{1F69A}",articulated_lorry:"\u{1F69B}",tractor:"\u{1F69C}",monorail:"\u{1F69D}",mountain_railway:"\u{1F69E}",suspension_railway:"\u{1F69F}",mountain_cableway:"\u{1F6A0}",aerial_tramway:"\u{1F6A1}",ship:"\u{1F6A2}","woman-rowing-boat":"\u{1F6A3}\u200D\u2640\uFE0F",rowing_woman:"\u{1F6A3}\u200D\u2640\uFE0F","man-rowing-boat":"\u{1F6A3}\u200D\u2642\uFE0F",rowboat:"\u{1F6A3}\u200D\u2642\uFE0F",rowing_man:"\u{1F6A3}\u200D\u2642\uFE0F",speedboat:"\u{1F6A4}",traffic_light:"\u{1F6A5}",vertical_traffic_light:"\u{1F6A6}",construction:"\u{1F6A7}",rotating_light:"\u{1F6A8}",triangular_flag_on_post:"\u{1F6A9}",door:"\u{1F6AA}",no_entry_sign:"\u{1F6AB}",smoking:"\u{1F6AC}",no_smoking:"\u{1F6AD}",put_litter_in_its_place:"\u{1F6AE}",do_not_litter:"\u{1F6AF}",potable_water:"\u{1F6B0}","non-potable_water":"\u{1F6B1}",bike:"\u{1F6B2}",no_bicycles:"\u{1F6B3}","woman-biking":"\u{1F6B4}\u200D\u2640\uFE0F",biking_woman:"\u{1F6B4}\u200D\u2640\uFE0F","man-biking":"\u{1F6B4}\u200D\u2642\uFE0F",bicyclist:"\u{1F6B4}\u200D\u2642\uFE0F",biking_man:"\u{1F6B4}\u200D\u2642\uFE0F","woman-mountain-biking":"\u{1F6B5}\u200D\u2640\uFE0F",mountain_biking_woman:"\u{1F6B5}\u200D\u2640\uFE0F","man-mountain-biking":"\u{1F6B5}\u200D\u2642\uFE0F",mountain_bicyclist:"\u{1F6B5}\u200D\u2642\uFE0F",mountain_biking_man:"\u{1F6B5}\u200D\u2642\uFE0F","woman-walking":"\u{1F6B6}\u200D\u2640\uFE0F",walking_woman:"\u{1F6B6}\u200D\u2640\uFE0F","man-walking":"\u{1F6B6}\u200D\u2642\uFE0F",walking:"\u{1F6B6}\u200D\u2642\uFE0F",walking_man:"\u{1F6B6}\u200D\u2642\uFE0F",no_pedestrians:"\u{1F6B7}",children_crossing:"\u{1F6B8}",mens:"\u{1F6B9}",womens:"\u{1F6BA}",restroom:"\u{1F6BB}",baby_symbol:"\u{1F6BC}",toilet:"\u{1F6BD}",wc:"\u{1F6BE}",shower:"\u{1F6BF}",bath:"\u{1F6C0}",bathtub:"\u{1F6C1}",passport_control:"\u{1F6C2}",customs:"\u{1F6C3}",baggage_claim:"\u{1F6C4}",left_luggage:"\u{1F6C5}",couch_and_lamp:"\u{1F6CB}\uFE0F",sleeping_accommodation:"\u{1F6CC}",shopping_bags:"\u{1F6CD}\uFE0F",bellhop_bell:"\u{1F6CE}\uFE0F",bed:"\u{1F6CF}\uFE0F",place_of_worship:"\u{1F6D0}",octagonal_sign:"\u{1F6D1}",shopping_trolley:"\u{1F6D2}",hindu_temple:"\u{1F6D5}",hut:"\u{1F6D6}",elevator:"\u{1F6D7}",hammer_and_wrench:"\u{1F6E0}\uFE0F",shield:"\u{1F6E1}\uFE0F",oil_drum:"\u{1F6E2}\uFE0F",motorway:"\u{1F6E3}\uFE0F",railway_track:"\u{1F6E4}\uFE0F",motor_boat:"\u{1F6E5}\uFE0F",small_airplane:"\u{1F6E9}\uFE0F",airplane_departure:"\u{1F6EB}",airplane_arriving:"\u{1F6EC}",satellite:"\u{1F6F0}\uFE0F",passenger_ship:"\u{1F6F3}\uFE0F",scooter:"\u{1F6F4}",motor_scooter:"\u{1F6F5}",canoe:"\u{1F6F6}",sled:"\u{1F6F7}",flying_saucer:"\u{1F6F8}",skateboard:"\u{1F6F9}",auto_rickshaw:"\u{1F6FA}",pickup_truck:"\u{1F6FB}",roller_skate:"\u{1F6FC}",large_orange_circle:"\u{1F7E0}",large_yellow_circle:"\u{1F7E1}",large_green_circle:"\u{1F7E2}",large_purple_circle:"\u{1F7E3}",large_brown_circle:"\u{1F7E4}",large_red_square:"\u{1F7E5}",large_blue_square:"\u{1F7E6}",large_orange_square:"\u{1F7E7}",large_yellow_square:"\u{1F7E8}",large_green_square:"\u{1F7E9}",large_purple_square:"\u{1F7EA}",large_brown_square:"\u{1F7EB}",pinched_fingers:"\u{1F90C}",white_heart:"\u{1F90D}",brown_heart:"\u{1F90E}",pinching_hand:"\u{1F90F}",zipper_mouth_face:"\u{1F910}",money_mouth_face:"\u{1F911}",face_with_thermometer:"\u{1F912}",nerd_face:"\u{1F913}",thinking_face:"\u{1F914}",face_with_head_bandage:"\u{1F915}",robot_face:"\u{1F916}",hugging_face:"\u{1F917}",the_horns:"\u{1F918}",sign_of_the_horns:"\u{1F918}",call_me_hand:"\u{1F919}",raised_back_of_hand:"\u{1F91A}","left-facing_fist":"\u{1F91B}","right-facing_fist":"\u{1F91C}",handshake:"\u{1F91D}",crossed_fingers:"\u{1F91E}",hand_with_index_and_middle_fingers_crossed:"\u{1F91E}",i_love_you_hand_sign:"\u{1F91F}",face_with_cowboy_hat:"\u{1F920}",clown_face:"\u{1F921}",nauseated_face:"\u{1F922}",rolling_on_the_floor_laughing:"\u{1F923}",drooling_face:"\u{1F924}",lying_face:"\u{1F925}","woman-facepalming":"\u{1F926}\u200D\u2640\uFE0F","man-facepalming":"\u{1F926}\u200D\u2642\uFE0F",face_palm:"\u{1F926}",sneezing_face:"\u{1F927}",face_with_raised_eyebrow:"\u{1F928}",face_with_one_eyebrow_raised:"\u{1F928}","star-struck":"\u{1F929}",grinning_face_with_star_eyes:"\u{1F929}",zany_face:"\u{1F92A}",grinning_face_with_one_large_and_one_small_eye:"\u{1F92A}",shushing_face:"\u{1F92B}",face_with_finger_covering_closed_lips:"\u{1F92B}",face_with_symbols_on_mouth:"\u{1F92C}",serious_face_with_symbols_covering_mouth:"\u{1F92C}",face_with_hand_over_mouth:"\u{1F92D}",smiling_face_with_smiling_eyes_and_hand_covering_mouth:"\u{1F92D}",face_vomiting:"\u{1F92E}",face_with_open_mouth_vomiting:"\u{1F92E}",exploding_head:"\u{1F92F}",shocked_face_with_exploding_head:"\u{1F92F}",pregnant_woman:"\u{1F930}","breast-feeding":"\u{1F931}",palms_up_together:"\u{1F932}",selfie:"\u{1F933}",prince:"\u{1F934}",woman_in_tuxedo:"\u{1F935}\u200D\u2640\uFE0F",man_in_tuxedo:"\u{1F935}\u200D\u2642\uFE0F",person_in_tuxedo:"\u{1F935}",mrs_claus:"\u{1F936}",mother_christmas:"\u{1F936}","woman-shrugging":"\u{1F937}\u200D\u2640\uFE0F","man-shrugging":"\u{1F937}\u200D\u2642\uFE0F",shrug:"\u{1F937}","woman-cartwheeling":"\u{1F938}\u200D\u2640\uFE0F","man-cartwheeling":"\u{1F938}\u200D\u2642\uFE0F",person_doing_cartwheel:"\u{1F938}","woman-juggling":"\u{1F939}\u200D\u2640\uFE0F","man-juggling":"\u{1F939}\u200D\u2642\uFE0F",juggling:"\u{1F939}",fencer:"\u{1F93A}","woman-wrestling":"\u{1F93C}\u200D\u2640\uFE0F","man-wrestling":"\u{1F93C}\u200D\u2642\uFE0F",wrestlers:"\u{1F93C}","woman-playing-water-polo":"\u{1F93D}\u200D\u2640\uFE0F","man-playing-water-polo":"\u{1F93D}\u200D\u2642\uFE0F",water_polo:"\u{1F93D}","woman-playing-handball":"\u{1F93E}\u200D\u2640\uFE0F","man-playing-handball":"\u{1F93E}\u200D\u2642\uFE0F",handball:"\u{1F93E}",diving_mask:"\u{1F93F}",wilted_flower:"\u{1F940}",drum_with_drumsticks:"\u{1F941}",clinking_glasses:"\u{1F942}",tumbler_glass:"\u{1F943}",spoon:"\u{1F944}",goal_net:"\u{1F945}",first_place_medal:"\u{1F947}",second_place_medal:"\u{1F948}",third_place_medal:"\u{1F949}",boxing_glove:"\u{1F94A}",martial_arts_uniform:"\u{1F94B}",curling_stone:"\u{1F94C}",lacrosse:"\u{1F94D}",softball:"\u{1F94E}",flying_disc:"\u{1F94F}",croissant:"\u{1F950}",avocado:"\u{1F951}",cucumber:"\u{1F952}",bacon:"\u{1F953}",potato:"\u{1F954}",carrot:"\u{1F955}",baguette_bread:"\u{1F956}",green_salad:"\u{1F957}",shallow_pan_of_food:"\u{1F958}",stuffed_flatbread:"\u{1F959}",egg:"\u{1F95A}",glass_of_milk:"\u{1F95B}",peanuts:"\u{1F95C}",kiwifruit:"\u{1F95D}",pancakes:"\u{1F95E}",dumpling:"\u{1F95F}",fortune_cookie:"\u{1F960}",takeout_box:"\u{1F961}",chopsticks:"\u{1F962}",bowl_with_spoon:"\u{1F963}",cup_with_straw:"\u{1F964}",coconut:"\u{1F965}",broccoli:"\u{1F966}",pie:"\u{1F967}",pretzel:"\u{1F968}",cut_of_meat:"\u{1F969}",sandwich:"\u{1F96A}",canned_food:"\u{1F96B}",leafy_green:"\u{1F96C}",mango:"\u{1F96D}",moon_cake:"\u{1F96E}",bagel:"\u{1F96F}",smiling_face_with_3_hearts:"\u{1F970}",yawning_face:"\u{1F971}",smiling_face_with_tear:"\u{1F972}",partying_face:"\u{1F973}",woozy_face:"\u{1F974}",hot_face:"\u{1F975}",cold_face:"\u{1F976}",ninja:"\u{1F977}",disguised_face:"\u{1F978}",pleading_face:"\u{1F97A}",sari:"\u{1F97B}",lab_coat:"\u{1F97C}",goggles:"\u{1F97D}",hiking_boot:"\u{1F97E}",womans_flat_shoe:"\u{1F97F}",crab:"\u{1F980}",lion_face:"\u{1F981}",scorpion:"\u{1F982}",turkey:"\u{1F983}",unicorn_face:"\u{1F984}",eagle:"\u{1F985}",duck:"\u{1F986}",bat:"\u{1F987}",shark:"\u{1F988}",owl:"\u{1F989}",fox_face:"\u{1F98A}",butterfly:"\u{1F98B}",deer:"\u{1F98C}",gorilla:"\u{1F98D}",lizard:"\u{1F98E}",rhinoceros:"\u{1F98F}",shrimp:"\u{1F990}",squid:"\u{1F991}",giraffe_face:"\u{1F992}",zebra_face:"\u{1F993}",hedgehog:"\u{1F994}",sauropod:"\u{1F995}","t-rex":"\u{1F996}",cricket:"\u{1F997}",kangaroo:"\u{1F998}",llama:"\u{1F999}",peacock:"\u{1F99A}",hippopotamus:"\u{1F99B}",parrot:"\u{1F99C}",raccoon:"\u{1F99D}",lobster:"\u{1F99E}",mosquito:"\u{1F99F}",microbe:"\u{1F9A0}",badger:"\u{1F9A1}",swan:"\u{1F9A2}",mammoth:"\u{1F9A3}",dodo:"\u{1F9A4}",sloth:"\u{1F9A5}",otter:"\u{1F9A6}",orangutan:"\u{1F9A7}",skunk:"\u{1F9A8}",flamingo:"\u{1F9A9}",oyster:"\u{1F9AA}",beaver:"\u{1F9AB}",bison:"\u{1F9AC}",seal:"\u{1F9AD}",guide_dog:"\u{1F9AE}",probing_cane:"\u{1F9AF}",bone:"\u{1F9B4}",leg:"\u{1F9B5}",foot:"\u{1F9B6}",tooth:"\u{1F9B7}",female_superhero:"\u{1F9B8}\u200D\u2640\uFE0F",male_superhero:"\u{1F9B8}\u200D\u2642\uFE0F",superhero:"\u{1F9B8}",female_supervillain:"\u{1F9B9}\u200D\u2640\uFE0F",male_supervillain:"\u{1F9B9}\u200D\u2642\uFE0F",supervillain:"\u{1F9B9}",safety_vest:"\u{1F9BA}",ear_with_hearing_aid:"\u{1F9BB}",motorized_wheelchair:"\u{1F9BC}",manual_wheelchair:"\u{1F9BD}",mechanical_arm:"\u{1F9BE}",mechanical_leg:"\u{1F9BF}",cheese_wedge:"\u{1F9C0}",cupcake:"\u{1F9C1}",salt:"\u{1F9C2}",beverage_box:"\u{1F9C3}",garlic:"\u{1F9C4}",onion:"\u{1F9C5}",falafel:"\u{1F9C6}",waffle:"\u{1F9C7}",butter:"\u{1F9C8}",mate_drink:"\u{1F9C9}",ice_cube:"\u{1F9CA}",bubble_tea:"\u{1F9CB}",woman_standing:"\u{1F9CD}\u200D\u2640\uFE0F",man_standing:"\u{1F9CD}\u200D\u2642\uFE0F",standing_person:"\u{1F9CD}",woman_kneeling:"\u{1F9CE}\u200D\u2640\uFE0F",man_kneeling:"\u{1F9CE}\u200D\u2642\uFE0F",kneeling_person:"\u{1F9CE}",deaf_woman:"\u{1F9CF}\u200D\u2640\uFE0F",deaf_man:"\u{1F9CF}\u200D\u2642\uFE0F",deaf_person:"\u{1F9CF}",face_with_monocle:"\u{1F9D0}",farmer:"\u{1F9D1}\u200D\u{1F33E}",cook:"\u{1F9D1}\u200D\u{1F373}",person_feeding_baby:"\u{1F9D1}\u200D\u{1F37C}",mx_claus:"\u{1F9D1}\u200D\u{1F384}",student:"\u{1F9D1}\u200D\u{1F393}",singer:"\u{1F9D1}\u200D\u{1F3A4}",artist:"\u{1F9D1}\u200D\u{1F3A8}",teacher:"\u{1F9D1}\u200D\u{1F3EB}",factory_worker:"\u{1F9D1}\u200D\u{1F3ED}",technologist:"\u{1F9D1}\u200D\u{1F4BB}",office_worker:"\u{1F9D1}\u200D\u{1F4BC}",mechanic:"\u{1F9D1}\u200D\u{1F527}",scientist:"\u{1F9D1}\u200D\u{1F52C}",astronaut:"\u{1F9D1}\u200D\u{1F680}",firefighter:"\u{1F9D1}\u200D\u{1F692}",people_holding_hands:"\u{1F9D1}\u200D\u{1F91D}\u200D\u{1F9D1}",person_with_probing_cane:"\u{1F9D1}\u200D\u{1F9AF}",red_haired_person:"\u{1F9D1}\u200D\u{1F9B0}",curly_haired_person:"\u{1F9D1}\u200D\u{1F9B1}",bald_person:"\u{1F9D1}\u200D\u{1F9B2}",white_haired_person:"\u{1F9D1}\u200D\u{1F9B3}",person_in_motorized_wheelchair:"\u{1F9D1}\u200D\u{1F9BC}",person_in_manual_wheelchair:"\u{1F9D1}\u200D\u{1F9BD}",health_worker:"\u{1F9D1}\u200D\u2695\uFE0F",judge:"\u{1F9D1}\u200D\u2696\uFE0F",pilot:"\u{1F9D1}\u200D\u2708\uFE0F",adult:"\u{1F9D1}",child:"\u{1F9D2}",older_adult:"\u{1F9D3}",woman_with_beard:"\u{1F9D4}\u200D\u2640\uFE0F",man_with_beard:"\u{1F9D4}\u200D\u2642\uFE0F",bearded_person:"\u{1F9D4}",person_with_headscarf:"\u{1F9D5}",woman_in_steamy_room:"\u{1F9D6}\u200D\u2640\uFE0F",man_in_steamy_room:"\u{1F9D6}\u200D\u2642\uFE0F",person_in_steamy_room:"\u{1F9D6}\u200D\u2642\uFE0F",woman_climbing:"\u{1F9D7}\u200D\u2640\uFE0F",person_climbing:"\u{1F9D7}\u200D\u2640\uFE0F",man_climbing:"\u{1F9D7}\u200D\u2642\uFE0F",woman_in_lotus_position:"\u{1F9D8}\u200D\u2640\uFE0F",person_in_lotus_position:"\u{1F9D8}\u200D\u2640\uFE0F",man_in_lotus_position:"\u{1F9D8}\u200D\u2642\uFE0F",female_mage:"\u{1F9D9}\u200D\u2640\uFE0F",mage:"\u{1F9D9}\u200D\u2640\uFE0F",male_mage:"\u{1F9D9}\u200D\u2642\uFE0F",female_fairy:"\u{1F9DA}\u200D\u2640\uFE0F",fairy:"\u{1F9DA}\u200D\u2640\uFE0F",male_fairy:"\u{1F9DA}\u200D\u2642\uFE0F",female_vampire:"\u{1F9DB}\u200D\u2640\uFE0F",vampire:"\u{1F9DB}\u200D\u2640\uFE0F",male_vampire:"\u{1F9DB}\u200D\u2642\uFE0F",mermaid:"\u{1F9DC}\u200D\u2640\uFE0F",merman:"\u{1F9DC}\u200D\u2642\uFE0F",merperson:"\u{1F9DC}\u200D\u2642\uFE0F",female_elf:"\u{1F9DD}\u200D\u2640\uFE0F",male_elf:"\u{1F9DD}\u200D\u2642\uFE0F",elf:"\u{1F9DD}\u200D\u2642\uFE0F",female_genie:"\u{1F9DE}\u200D\u2640\uFE0F",male_genie:"\u{1F9DE}\u200D\u2642\uFE0F",genie:"\u{1F9DE}\u200D\u2642\uFE0F",female_zombie:"\u{1F9DF}\u200D\u2640\uFE0F",male_zombie:"\u{1F9DF}\u200D\u2642\uFE0F",zombie:"\u{1F9DF}\u200D\u2642\uFE0F",brain:"\u{1F9E0}",orange_heart:"\u{1F9E1}",billed_cap:"\u{1F9E2}",scarf:"\u{1F9E3}",gloves:"\u{1F9E4}",coat:"\u{1F9E5}",socks:"\u{1F9E6}",red_envelope:"\u{1F9E7}",firecracker:"\u{1F9E8}",jigsaw:"\u{1F9E9}",test_tube:"\u{1F9EA}",petri_dish:"\u{1F9EB}",dna:"\u{1F9EC}",compass:"\u{1F9ED}",abacus:"\u{1F9EE}",fire_extinguisher:"\u{1F9EF}",toolbox:"\u{1F9F0}",bricks:"\u{1F9F1}",magnet:"\u{1F9F2}",luggage:"\u{1F9F3}",lotion_bottle:"\u{1F9F4}",thread:"\u{1F9F5}",yarn:"\u{1F9F6}",safety_pin:"\u{1F9F7}",teddy_bear:"\u{1F9F8}",broom:"\u{1F9F9}",basket:"\u{1F9FA}",roll_of_paper:"\u{1F9FB}",soap:"\u{1F9FC}",sponge:"\u{1F9FD}",receipt:"\u{1F9FE}",nazar_amulet:"\u{1F9FF}",ballet_shoes:"\u{1FA70}","one-piece_swimsuit":"\u{1FA71}",briefs:"\u{1FA72}",shorts:"\u{1FA73}",thong_sandal:"\u{1FA74}",drop_of_blood:"\u{1FA78}",adhesive_bandage:"\u{1FA79}",stethoscope:"\u{1FA7A}","yo-yo":"\u{1FA80}",kite:"\u{1FA81}",parachute:"\u{1FA82}",boomerang:"\u{1FA83}",magic_wand:"\u{1FA84}",pinata:"\u{1FA85}",nesting_dolls:"\u{1FA86}",ringed_planet:"\u{1FA90}",chair:"\u{1FA91}",razor:"\u{1FA92}",axe:"\u{1FA93}",diya_lamp:"\u{1FA94}",banjo:"\u{1FA95}",military_helmet:"\u{1FA96}",accordion:"\u{1FA97}",long_drum:"\u{1FA98}",coin:"\u{1FA99}",carpentry_saw:"\u{1FA9A}",screwdriver:"\u{1FA9B}",ladder:"\u{1FA9C}",hook:"\u{1FA9D}",mirror:"\u{1FA9E}",window:"\u{1FA9F}",plunger:"\u{1FAA0}",sewing_needle:"\u{1FAA1}",knot:"\u{1FAA2}",bucket:"\u{1FAA3}",mouse_trap:"\u{1FAA4}",toothbrush:"\u{1FAA5}",headstone:"\u{1FAA6}",placard:"\u{1FAA7}",rock:"\u{1FAA8}",fly:"\u{1FAB0}",worm:"\u{1FAB1}",beetle:"\u{1FAB2}",cockroach:"\u{1FAB3}",potted_plant:"\u{1FAB4}",wood:"\u{1FAB5}",feather:"\u{1FAB6}",anatomical_heart:"\u{1FAC0}",lungs:"\u{1FAC1}",people_hugging:"\u{1FAC2}",blueberries:"\u{1FAD0}",bell_pepper:"\u{1FAD1}",olive:"\u{1FAD2}",flatbread:"\u{1FAD3}",tamale:"\u{1FAD4}",fondue:"\u{1FAD5}",teapot:"\u{1FAD6}",bangbang:"\u203C\uFE0F",interrobang:"\u2049\uFE0F",tm:"\u2122\uFE0F",information_source:"\u2139\uFE0F",left_right_arrow:"\u2194\uFE0F",arrow_up_down:"\u2195\uFE0F",arrow_upper_left:"\u2196\uFE0F",arrow_upper_right:"\u2197\uFE0F",arrow_lower_right:"\u2198\uFE0F",arrow_lower_left:"\u2199\uFE0F",leftwards_arrow_with_hook:"\u21A9\uFE0F",arrow_right_hook:"\u21AA\uFE0F",watch:"\u231A",hourglass:"\u231B",keyboard:"\u2328\uFE0F",eject:"\u23CF\uFE0F",fast_forward:"\u23E9",rewind:"\u23EA",arrow_double_up:"\u23EB",arrow_double_down:"\u23EC",black_right_pointing_double_triangle_with_vertical_bar:"\u23ED\uFE0F",black_left_pointing_double_triangle_with_vertical_bar:"\u23EE\uFE0F",black_right_pointing_triangle_with_double_vertical_bar:"\u23EF\uFE0F",alarm_clock:"\u23F0",stopwatch:"\u23F1\uFE0F",timer_clock:"\u23F2\uFE0F",hourglass_flowing_sand:"\u23F3",double_vertical_bar:"\u23F8\uFE0F",black_square_for_stop:"\u23F9\uFE0F",black_circle_for_record:"\u23FA\uFE0F",m:"\u24C2\uFE0F",black_small_square:"\u25AA\uFE0F",white_small_square:"\u25AB\uFE0F",arrow_forward:"\u25B6\uFE0F",arrow_backward:"\u25C0\uFE0F",white_medium_square:"\u25FB\uFE0F",black_medium_square:"\u25FC\uFE0F",white_medium_small_square:"\u25FD",black_medium_small_square:"\u25FE",sunny:"\u2600\uFE0F",cloud:"\u2601\uFE0F",umbrella:"\u2602\uFE0F",snowman:"\u2603\uFE0F",comet:"\u2604\uFE0F",phone:"\u260E\uFE0F",telephone:"\u260E\uFE0F",ballot_box_with_check:"\u2611\uFE0F",shamrock:"\u2618\uFE0F",point_up:"\u261D\uFE0F",skull_and_crossbones:"\u2620\uFE0F",radioactive_sign:"\u2622\uFE0F",biohazard_sign:"\u2623\uFE0F",orthodox_cross:"\u2626\uFE0F",star_and_crescent:"\u262A\uFE0F",peace_symbol:"\u262E\uFE0F",yin_yang:"\u262F\uFE0F",wheel_of_dharma:"\u2638\uFE0F",white_frowning_face:"\u2639\uFE0F",relaxed:"\u263A\uFE0F",female_sign:"\u2640\uFE0F",male_sign:"\u2642\uFE0F",gemini:"\u264A",cancer:"\u264B",leo:"\u264C",virgo:"\u264D",libra:"\u264E",scorpius:"\u264F",chess_pawn:"\u265F\uFE0F",spades:"\u2660\uFE0F",clubs:"\u2663\uFE0F",hearts:"\u2665\uFE0F",diamonds:"\u2666\uFE0F",hotsprings:"\u2668\uFE0F",recycle:"\u267B\uFE0F",infinity:"\u267E\uFE0F",wheelchair:"\u267F",hammer_and_pick:"\u2692\uFE0F",crossed_swords:"\u2694\uFE0F",medical_symbol:"\u2695\uFE0F",staff_of_aesculapius:"\u2695\uFE0F",scales:"\u2696\uFE0F",alembic:"\u2697\uFE0F",gear:"\u2699\uFE0F",atom_symbol:"\u269B\uFE0F",fleur_de_lis:"\u269C\uFE0F",warning:"\u26A0\uFE0F",zap:"\u26A1",transgender_symbol:"\u26A7\uFE0F",white_circle:"\u26AA",black_circle:"\u26AB",coffin:"\u26B0\uFE0F",funeral_urn:"\u26B1\uFE0F",soccer:"\u26BD",baseball:"\u26BE",snowman_without_snow:"\u26C4",partly_sunny:"\u26C5",thunder_cloud_and_rain:"\u26C8\uFE0F",ophiuchus:"\u26CE",pick:"\u26CF\uFE0F",helmet_with_white_cross:"\u26D1\uFE0F",chains:"\u26D3\uFE0F",no_entry:"\u26D4",shinto_shrine:"\u26E9\uFE0F",church:"\u26EA",mountain:"\u26F0\uFE0F",umbrella_on_ground:"\u26F1\uFE0F",fountain:"\u26F2",golf:"\u26F3",ferry:"\u26F4\uFE0F",boat:"\u26F5",sailboat:"\u26F5",skier:"\u26F7\uFE0F",ice_skate:"\u26F8\uFE0F","woman-bouncing-ball":"\u26F9\uFE0F\u200D\u2640\uFE0F","man-bouncing-ball":"\u26F9\uFE0F\u200D\u2642\uFE0F",person_with_ball:"\u26F9\uFE0F\u200D\u2642\uFE0F",tent:"\u26FA",fuelpump:"\u26FD",scissors:"\u2702\uFE0F",airplane:"\u2708\uFE0F",email:"\u2709\uFE0F",envelope:"\u2709\uFE0F",fist:"\u270A",hand:"\u270B",raised_hand:"\u270B",v:"\u270C\uFE0F",writing_hand:"\u270D\uFE0F",pencil2:"\u270F\uFE0F",black_nib:"\u2712\uFE0F",heavy_check_mark:"\u2714\uFE0F",heavy_multiplication_x:"\u2716\uFE0F",latin_cross:"\u271D\uFE0F",star_of_david:"\u2721\uFE0F",eight_spoked_asterisk:"\u2733\uFE0F",eight_pointed_black_star:"\u2734\uFE0F",snowflake:"\u2744\uFE0F",sparkle:"\u2747\uFE0F",x:"\u274C",negative_squared_cross_mark:"\u274E",heavy_heart_exclamation_mark_ornament:"\u2763\uFE0F",heart_on_fire:"\u2764\uFE0F\u200D\u{1F525}",mending_heart:"\u2764\uFE0F\u200D\u{1FA79}",heart:"\u2764\uFE0F",arrow_right:"\u27A1\uFE0F",curly_loop:"\u27B0",loop:"\u27BF",arrow_heading_up:"\u2934\uFE0F",arrow_heading_down:"\u2935\uFE0F",arrow_left:"\u2B05\uFE0F",arrow_up:"\u2B06\uFE0F",arrow_down:"\u2B07\uFE0F",black_large_square:"\u2B1B",white_large_square:"\u2B1C",star:"\u2B50",o:"\u2B55",wavy_dash:"\u3030\uFE0F",part_alternation_mark:"\u303D\uFE0F",congratulations:"\u3297\uFE0F",secret:"\u3299\uFE0F"}});var Ss=K((x2,Is)=>{var js=Cs(),Ve=ya(),hm=/:([a-zA-Z0-9_\-\+]+):/g,gm=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function mt(e){var t=e.indexOf(":");return t>-1?t===e.length-1?(e=e.substring(0,t),mt(e)):(e=e.substr(t+1),mt(e)):e}function Ls(e){return typeof e=="string"&&e.length>0?":"+e+":":e}function xm(e){return typeof e=="string"&&e[0]!==":"?Ls(e):e}var vm=String.fromCharCode(65039),bm=new RegExp(vm,"g");function ht(e){return e.replace(bm,"")}var _a=Object.keys(Ve).reduce(function(e,t){return e[ht(Ve[t])]=t,e},{}),ce={emoji:Ve};ce._get=function(t){return _a[ht(t)]?t:Ve.hasOwnProperty(t)?Ve[t]:xm(t)};ce.get=function(t){return t=mt(t),ce._get(t)};ce.find=function(t){return ce.findByName(t)||ce.findByCode(t)};ce.findByName=function(t){var n=mt(t),a=Ve[n];return a?{emoji:a,key:n}:void 0};ce.findByCode=function(t){var n=ht(t),a=_a[n];return a?{emoji:Ve[a],key:a}:void 0};ce.hasEmoji=function(t){return ce.hasEmojiByName(t)||ce.hasEmojiByCode(t)};ce.hasEmojiByName=function(t){var n=ce.findByName(t);return!!n&&n.key===mt(t)};ce.hasEmojiByCode=function(t){var n=ce.findByCode(t);return!!n&&ht(n.emoji)===ht(t)};ce.which=function(t,n){var a=ht(t),i=_a[a];return n?Ls(i):i};ce.emojify=function(t,n,a){return t?t.split(hm).map(function(r,o){if(o%2===0)return r;var s=ce._get(r),p=s.indexOf(":")>-1;return p&&typeof n=="function"?n(r):!p&&typeof a=="function"?a(s,r):s}).join(""):""};ce.random=function(){var t=Object.keys(Ve),n=Math.floor(Math.random()*t.length),a=t[n],i=ce._get(a);return{key:a,emoji:i}};ce.search=function(t){var n=Object.keys(Ve),a=mt(t),i=n.filter(function(r){return r.toString().indexOf(a)===0});return i.map(function(r){return{key:r,emoji:ce._get(r)}})};ce.unemojify=function(t){if(!t)return"";var n=js(t);return n.map(function(a){return ce.which(a,!0)||a}).join("")};ce.replace=function(t,n,a){if(!t)return"";var i=typeof n=="function"?n:function(){return n},r=js(t),o=r.map(function(s,p){var l=ce.findByCode(s);return l&&a&&r[p+1]===" "&&(r[p+1]=""),l?i(l):s}).join("");return a?o.replace(gm,""):o};ce.strip=function(t){return ce.replace(t,"",!0)};Is.exports=ce});var Wt=K((v2,As)=>{As.exports=Ss()});var fn=K((b2,dn)=>{(function(){"use strict";var e={}.hasOwnProperty;function t(){for(var n=[],a=0;a{"use strict";Object.defineProperty(yn,"__esModule",{value:!0});function Ds(e,t){if(t)return e;throw new Error("Unhandled discriminated union member: "+JSON.stringify(e))}yn.assertNever=Ds;yn.default=Ds});var Js=K((Xs,Va)=>{(function(e){typeof Xs=="object"&&typeof Va<"u"?Va.exports=e():typeof define=="function"&&define.amd?define([],e):(typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:this).JSZip=e()})(function(){return function e(t,n,a){function i(s,p){if(!n[s]){if(!t[s]){var l=typeof require=="function"&&require;if(!p&&l)return l(s,!0);if(r)return r(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var u=n[s]={exports:{}};t[s][0].call(u.exports,function(h){var f=t[s][1][h];return i(f||h)},u,u.exports,e,t,n,a)}return n[s].exports}for(var r=typeof require=="function"&&require,o=0;o>2,u=(3&s)<<4|p>>4,h=1<_?(15&p)<<2|l>>6:64,f=2<_?63&l:64,g.push(r.charAt(c)+r.charAt(u)+r.charAt(h)+r.charAt(f));return g.join("")},n.decode=function(o){var s,p,l,c,u,h,f=0,g=0,x="data:";if(o.substr(0,x.length)===x)throw new Error("Invalid base64 input, it looks like a data url.");var b,_=3*(o=o.replace(/[^A-Za-z0-9\+\/\=]/g,"")).length/4;if(o.charAt(o.length-1)===r.charAt(64)&&_--,o.charAt(o.length-2)===r.charAt(64)&&_--,_%1!=0)throw new Error("Invalid base64 input, bad content length.");for(b=i.uint8array?new Uint8Array(0|_):new Array(0|_);f>4,p=(15&c)<<4|(u=r.indexOf(o.charAt(f++)))>>2,l=(3&u)<<6|(h=r.indexOf(o.charAt(f++))),b[g++]=s,u!==64&&(b[g++]=p),h!==64&&(b[g++]=l);return b}},{"./support":30,"./utils":32}],2:[function(e,t,n){"use strict";var a=e("./external"),i=e("./stream/DataWorker"),r=e("./stream/Crc32Probe"),o=e("./stream/DataLengthProbe");function s(p,l,c,u,h){this.compressedSize=p,this.uncompressedSize=l,this.crc32=c,this.compression=u,this.compressedContent=h}s.prototype={getContentWorker:function(){var p=new i(a.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new o("data_length")),l=this;return p.on("end",function(){if(this.streamInfo.data_length!==l.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),p},getCompressedWorker:function(){return new i(a.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},s.createWorkerFrom=function(p,l,c){return p.pipe(new r).pipe(new o("uncompressedSize")).pipe(l.compressWorker(c)).pipe(new o("compressedSize")).withStreamInfo("compression",l)},t.exports=s},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(e,t,n){"use strict";var a=e("./stream/GenericWorker");n.STORE={magic:"\0\0",compressWorker:function(i){return new a("STORE compression")},uncompressWorker:function(){return new a("STORE decompression")}},n.DEFLATE=e("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(e,t,n){"use strict";var a=e("./utils"),i=function(){for(var r,o=[],s=0;s<256;s++){r=s;for(var p=0;p<8;p++)r=1&r?3988292384^r>>>1:r>>>1;o[s]=r}return o}();t.exports=function(r,o){return r!==void 0&&r.length?a.getTypeOf(r)!=="string"?function(s,p,l,c){var u=i,h=c+l;s^=-1;for(var f=c;f>>8^u[255&(s^p[f])];return-1^s}(0|o,r,r.length,0):function(s,p,l,c){var u=i,h=c+l;s^=-1;for(var f=c;f>>8^u[255&(s^p.charCodeAt(f))];return-1^s}(0|o,r,r.length,0):0}},{"./utils":32}],5:[function(e,t,n){"use strict";n.base64=!1,n.binary=!1,n.dir=!1,n.createFolders=!0,n.date=null,n.compression=null,n.compressionOptions=null,n.comment=null,n.unixPermissions=null,n.dosPermissions=null},{}],6:[function(e,t,n){"use strict";var a=null;a=typeof Promise<"u"?Promise:e("lie"),t.exports={Promise:a}},{lie:37}],7:[function(e,t,n){"use strict";var a=typeof Uint8Array<"u"&&typeof Uint16Array<"u"&&typeof Uint32Array<"u",i=e("pako"),r=e("./utils"),o=e("./stream/GenericWorker"),s=a?"uint8array":"array";function p(l,c){o.call(this,"FlateWorker/"+l),this._pako=null,this._pakoAction=l,this._pakoOptions=c,this.meta={}}n.magic="\b\0",r.inherits(p,o),p.prototype.processChunk=function(l){this.meta=l.meta,this._pako===null&&this._createPako(),this._pako.push(r.transformTo(s,l.data),!1)},p.prototype.flush=function(){o.prototype.flush.call(this),this._pako===null&&this._createPako(),this._pako.push([],!0)},p.prototype.cleanUp=function(){o.prototype.cleanUp.call(this),this._pako=null},p.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var l=this;this._pako.onData=function(c){l.push({data:c,meta:l.meta})}},n.compressWorker=function(l){return new p("Deflate",l)},n.uncompressWorker=function(){return new p("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(e,t,n){"use strict";function a(u,h){var f,g="";for(f=0;f>>=8;return g}function i(u,h,f,g,x,b){var _,C,w=u.file,z=u.compression,F=b!==s.utf8encode,T=r.transformTo("string",b(w.name)),S=r.transformTo("string",s.utf8encode(w.name)),W=w.comment,Y=r.transformTo("string",b(W)),k=r.transformTo("string",s.utf8encode(W)),E=S.length!==w.name.length,m=k.length!==W.length,P="",J="",D="",ae=w.dir,R=w.date,te={crc32:0,compressedSize:0,uncompressedSize:0};h&&!f||(te.crc32=u.crc32,te.compressedSize=u.compressedSize,te.uncompressedSize=u.uncompressedSize);var A=0;h&&(A|=8),F||!E&&!m||(A|=2048);var I=0,ee=0;ae&&(I|=16),x==="UNIX"?(ee=798,I|=function(q,ue){var ve=q;return q||(ve=ue?16893:33204),(65535&ve)<<16}(w.unixPermissions,ae)):(ee=20,I|=function(q){return 63&(q||0)}(w.dosPermissions)),_=R.getUTCHours(),_<<=6,_|=R.getUTCMinutes(),_<<=5,_|=R.getUTCSeconds()/2,C=R.getUTCFullYear()-1980,C<<=4,C|=R.getUTCMonth()+1,C<<=5,C|=R.getUTCDate(),E&&(J=a(1,1)+a(p(T),4)+S,P+="up"+a(J.length,2)+J),m&&(D=a(1,1)+a(p(Y),4)+k,P+="uc"+a(D.length,2)+D);var G="";return G+=` -\0`,G+=a(A,2),G+=z.magic,G+=a(_,2),G+=a(C,2),G+=a(te.crc32,4),G+=a(te.compressedSize,4),G+=a(te.uncompressedSize,4),G+=a(T.length,2),G+=a(P.length,2),{fileRecord:l.LOCAL_FILE_HEADER+G+T+P,dirRecord:l.CENTRAL_FILE_HEADER+a(ee,2)+G+a(Y.length,2)+"\0\0\0\0"+a(I,4)+a(g,4)+T+P+Y}}var r=e("../utils"),o=e("../stream/GenericWorker"),s=e("../utf8"),p=e("../crc32"),l=e("../signature");function c(u,h,f,g){o.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=h,this.zipPlatform=f,this.encodeFileName=g,this.streamFiles=u,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}r.inherits(c,o),c.prototype.push=function(u){var h=u.meta.percent||0,f=this.entriesCount,g=this._sources.length;this.accumulate?this.contentBuffer.push(u):(this.bytesWritten+=u.data.length,o.prototype.push.call(this,{data:u.data,meta:{currentFile:this.currentFile,percent:f?(h+100*(f-g-1))/f:100}}))},c.prototype.openedSource=function(u){this.currentSourceOffset=this.bytesWritten,this.currentFile=u.file.name;var h=this.streamFiles&&!u.file.dir;if(h){var f=i(u,h,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:f.fileRecord,meta:{percent:0}})}else this.accumulate=!0},c.prototype.closedSource=function(u){this.accumulate=!1;var h=this.streamFiles&&!u.file.dir,f=i(u,h,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(f.dirRecord),h)this.push({data:function(g){return l.DATA_DESCRIPTOR+a(g.crc32,4)+a(g.compressedSize,4)+a(g.uncompressedSize,4)}(u),meta:{percent:100}});else for(this.push({data:f.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},c.prototype.flush=function(){for(var u=this.bytesWritten,h=0;h=this.index;o--)s=(s<<8)+this.byteAt(o);return this.index+=r,s},readString:function(r){return a.transformTo("string",this.readData(r))},readData:function(r){},lastIndexOfSignature:function(r){},readAndCheckSignature:function(r){},readDate:function(){var r=this.readInt(4);return new Date(Date.UTC(1980+(r>>25&127),(r>>21&15)-1,r>>16&31,r>>11&31,r>>5&63,(31&r)<<1))}},t.exports=i},{"../utils":32}],19:[function(e,t,n){"use strict";var a=e("./Uint8ArrayReader");function i(r){a.call(this,r)}e("../utils").inherits(i,a),i.prototype.readData=function(r){this.checkOffset(r);var o=this.data.slice(this.zero+this.index,this.zero+this.index+r);return this.index+=r,o},t.exports=i},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(e,t,n){"use strict";var a=e("./DataReader");function i(r){a.call(this,r)}e("../utils").inherits(i,a),i.prototype.byteAt=function(r){return this.data.charCodeAt(this.zero+r)},i.prototype.lastIndexOfSignature=function(r){return this.data.lastIndexOf(r)-this.zero},i.prototype.readAndCheckSignature=function(r){return r===this.readData(4)},i.prototype.readData=function(r){this.checkOffset(r);var o=this.data.slice(this.zero+this.index,this.zero+this.index+r);return this.index+=r,o},t.exports=i},{"../utils":32,"./DataReader":18}],21:[function(e,t,n){"use strict";var a=e("./ArrayReader");function i(r){a.call(this,r)}e("../utils").inherits(i,a),i.prototype.readData=function(r){if(this.checkOffset(r),r===0)return new Uint8Array(0);var o=this.data.subarray(this.zero+this.index,this.zero+this.index+r);return this.index+=r,o},t.exports=i},{"../utils":32,"./ArrayReader":17}],22:[function(e,t,n){"use strict";var a=e("../utils"),i=e("../support"),r=e("./ArrayReader"),o=e("./StringReader"),s=e("./NodeBufferReader"),p=e("./Uint8ArrayReader");t.exports=function(l){var c=a.getTypeOf(l);return a.checkSupport(c),c!=="string"||i.uint8array?c==="nodebuffer"?new s(l):i.uint8array?new p(a.transformTo("uint8array",l)):new r(a.transformTo("array",l)):new o(l)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(e,t,n){"use strict";n.LOCAL_FILE_HEADER="PK",n.CENTRAL_FILE_HEADER="PK",n.CENTRAL_DIRECTORY_END="PK",n.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK\x07",n.ZIP64_CENTRAL_DIRECTORY_END="PK",n.DATA_DESCRIPTOR="PK\x07\b"},{}],24:[function(e,t,n){"use strict";var a=e("./GenericWorker"),i=e("../utils");function r(o){a.call(this,"ConvertWorker to "+o),this.destType=o}i.inherits(r,a),r.prototype.processChunk=function(o){this.push({data:i.transformTo(this.destType,o.data),meta:o.meta})},t.exports=r},{"../utils":32,"./GenericWorker":28}],25:[function(e,t,n){"use strict";var a=e("./GenericWorker"),i=e("../crc32");function r(){a.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}e("../utils").inherits(r,a),r.prototype.processChunk=function(o){this.streamInfo.crc32=i(o.data,this.streamInfo.crc32||0),this.push(o)},t.exports=r},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(e,t,n){"use strict";var a=e("../utils"),i=e("./GenericWorker");function r(o){i.call(this,"DataLengthProbe for "+o),this.propName=o,this.withStreamInfo(o,0)}a.inherits(r,i),r.prototype.processChunk=function(o){if(o){var s=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=s+o.data.length}i.prototype.processChunk.call(this,o)},t.exports=r},{"../utils":32,"./GenericWorker":28}],27:[function(e,t,n){"use strict";var a=e("../utils"),i=e("./GenericWorker");function r(o){i.call(this,"DataWorker");var s=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,o.then(function(p){s.dataIsReady=!0,s.data=p,s.max=p&&p.length||0,s.type=a.getTypeOf(p),s.isPaused||s._tickAndRepeat()},function(p){s.error(p)})}a.inherits(r,i),r.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},r.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,a.delay(this._tickAndRepeat,[],this)),!0)},r.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(a.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},r.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var o=null,s=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":o=this.data.substring(this.index,s);break;case"uint8array":o=this.data.subarray(this.index,s);break;case"array":case"nodebuffer":o=this.data.slice(this.index,s)}return this.index=s,this.push({data:o,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=r},{"../utils":32,"./GenericWorker":28}],28:[function(e,t,n){"use strict";function a(i){this.name=i||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}a.prototype={push:function(i){this.emit("data",i)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(i){this.emit("error",i)}return!0},error:function(i){return!this.isFinished&&(this.isPaused?this.generatedError=i:(this.isFinished=!0,this.emit("error",i),this.previous&&this.previous.error(i),this.cleanUp()),!0)},on:function(i,r){return this._listeners[i].push(r),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(i,r){if(this._listeners[i])for(var o=0;o "+i:i}},t.exports=a},{}],29:[function(e,t,n){"use strict";var a=e("../utils"),i=e("./ConvertWorker"),r=e("./GenericWorker"),o=e("../base64"),s=e("../support"),p=e("../external"),l=null;if(s.nodestream)try{l=e("../nodejs/NodejsStreamOutputAdapter")}catch{}function c(h,f){return new p.Promise(function(g,x){var b=[],_=h._internalType,C=h._outputType,w=h._mimeType;h.on("data",function(z,F){b.push(z),f&&f(F)}).on("error",function(z){b=[],x(z)}).on("end",function(){try{var z=function(F,T,S){switch(F){case"blob":return a.newBlob(a.transformTo("arraybuffer",T),S);case"base64":return o.encode(T);default:return a.transformTo(F,T)}}(C,function(F,T){var S,W=0,Y=null,k=0;for(S=0;S"u")n.blob=!1;else{var a=new ArrayBuffer(0);try{n.blob=new Blob([a],{type:"application/zip"}).size===0}catch{try{var i=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);i.append(a),n.blob=i.getBlob("application/zip").size===0}catch{n.blob=!1}}}try{n.nodestream=!!e("readable-stream").Readable}catch{n.nodestream=!1}},{"readable-stream":16}],31:[function(e,t,n){"use strict";for(var a=e("./utils"),i=e("./support"),r=e("./nodejsUtils"),o=e("./stream/GenericWorker"),s=new Array(256),p=0;p<256;p++)s[p]=252<=p?6:248<=p?5:240<=p?4:224<=p?3:192<=p?2:1;s[254]=s[254]=1;function l(){o.call(this,"utf-8 decode"),this.leftOver=null}function c(){o.call(this,"utf-8 encode")}n.utf8encode=function(u){return i.nodebuffer?r.newBufferFrom(u,"utf-8"):function(h){var f,g,x,b,_,C=h.length,w=0;for(b=0;b>>6:(g<65536?f[_++]=224|g>>>12:(f[_++]=240|g>>>18,f[_++]=128|g>>>12&63),f[_++]=128|g>>>6&63),f[_++]=128|63&g);return f}(u)},n.utf8decode=function(u){return i.nodebuffer?a.transformTo("nodebuffer",u).toString("utf-8"):function(h){var f,g,x,b,_=h.length,C=new Array(2*_);for(f=g=0;f<_;)if((x=h[f++])<128)C[g++]=x;else if(4<(b=s[x]))C[g++]=65533,f+=b-1;else{for(x&=b===2?31:b===3?15:7;1>10&1023,C[g++]=56320|1023&x)}return C.length!==g&&(C.subarray?C=C.subarray(0,g):C.length=g),a.applyFromCharCode(C)}(u=a.transformTo(i.uint8array?"uint8array":"array",u))},a.inherits(l,o),l.prototype.processChunk=function(u){var h=a.transformTo(i.uint8array?"uint8array":"array",u.data);if(this.leftOver&&this.leftOver.length){if(i.uint8array){var f=h;(h=new Uint8Array(f.length+this.leftOver.length)).set(this.leftOver,0),h.set(f,this.leftOver.length)}else h=this.leftOver.concat(h);this.leftOver=null}var g=function(b,_){var C;for((_=_||b.length)>b.length&&(_=b.length),C=_-1;0<=C&&(192&b[C])==128;)C--;return C<0||C===0?_:C+s[b[C]]>_?C:_}(h),x=h;g!==h.length&&(i.uint8array?(x=h.subarray(0,g),this.leftOver=h.subarray(g,h.length)):(x=h.slice(0,g),this.leftOver=h.slice(g,h.length))),this.push({data:n.utf8decode(x),meta:u.meta})},l.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:n.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},n.Utf8DecodeWorker=l,a.inherits(c,o),c.prototype.processChunk=function(u){this.push({data:n.utf8encode(u.data),meta:u.meta})},n.Utf8EncodeWorker=c},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(e,t,n){"use strict";var a=e("./support"),i=e("./base64"),r=e("./nodejsUtils"),o=e("./external");function s(f){return f}function p(f,g){for(var x=0;x>8;this.dir=!!(16&this.externalFileAttributes),u==0&&(this.dosPermissions=63&this.externalFileAttributes),u==3&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||this.fileNameStr.slice(-1)!=="/"||(this.dir=!0)},parseZIP64ExtraField:function(u){if(this.extraFields[1]){var h=a(this.extraFields[1].value);this.uncompressedSize===i.MAX_VALUE_32BITS&&(this.uncompressedSize=h.readInt(8)),this.compressedSize===i.MAX_VALUE_32BITS&&(this.compressedSize=h.readInt(8)),this.localHeaderOffset===i.MAX_VALUE_32BITS&&(this.localHeaderOffset=h.readInt(8)),this.diskNumberStart===i.MAX_VALUE_32BITS&&(this.diskNumberStart=h.readInt(4))}},readExtraFields:function(u){var h,f,g,x=u.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});u.index+4>>6:(u<65536?c[g++]=224|u>>>12:(c[g++]=240|u>>>18,c[g++]=128|u>>>12&63),c[g++]=128|u>>>6&63),c[g++]=128|63&u);return c},n.buf2binstring=function(l){return p(l,l.length)},n.binstring2buf=function(l){for(var c=new a.Buf8(l.length),u=0,h=c.length;u>10&1023,b[h++]=56320|1023&f)}return p(b,h)},n.utf8border=function(l,c){var u;for((c=c||l.length)>l.length&&(c=l.length),u=c-1;0<=u&&(192&l[u])==128;)u--;return u<0||u===0?c:u+o[l[u]]>c?u:c}},{"./common":41}],43:[function(e,t,n){"use strict";t.exports=function(a,i,r,o){for(var s=65535&a|0,p=a>>>16&65535|0,l=0;r!==0;){for(r-=l=2e3>>1:i>>>1;r[o]=i}return r}();t.exports=function(i,r,o,s){var p=a,l=s+o;i^=-1;for(var c=s;c>>8^p[255&(i^r[c])];return-1^i}},{}],46:[function(e,t,n){"use strict";var a,i=e("../utils/common"),r=e("./trees"),o=e("./adler32"),s=e("./crc32"),p=e("./messages"),l=0,c=4,u=0,h=-2,f=-1,g=4,x=2,b=8,_=9,C=286,w=30,z=19,F=2*C+1,T=15,S=3,W=258,Y=W+S+1,k=42,E=113,m=1,P=2,J=3,D=4;function ae(d,B){return d.msg=p[B],B}function R(d){return(d<<1)-(4d.avail_out&&(M=d.avail_out),M!==0&&(i.arraySet(d.output,B.pending_buf,B.pending_out,M,d.next_out),d.next_out+=M,B.pending_out+=M,d.total_out+=M,d.avail_out-=M,B.pending-=M,B.pending===0&&(B.pending_out=0))}function I(d,B){r._tr_flush_block(d,0<=d.block_start?d.block_start:-1,d.strstart-d.block_start,B),d.block_start=d.strstart,A(d.strm)}function ee(d,B){d.pending_buf[d.pending++]=B}function G(d,B){d.pending_buf[d.pending++]=B>>>8&255,d.pending_buf[d.pending++]=255&B}function q(d,B){var M,y,v=d.max_chain_length,j=d.strstart,O=d.prev_length,N=d.nice_match,L=d.strstart>d.w_size-Y?d.strstart-(d.w_size-Y):0,U=d.window,Z=d.w_mask,V=d.prev,Q=d.strstart+W,le=U[j+O-1],re=U[j+O];d.prev_length>=d.good_match&&(v>>=2),N>d.lookahead&&(N=d.lookahead);do if(U[(M=B)+O]===re&&U[M+O-1]===le&&U[M]===U[j]&&U[++M]===U[j+1]){j+=2,M++;do;while(U[++j]===U[++M]&&U[++j]===U[++M]&&U[++j]===U[++M]&&U[++j]===U[++M]&&U[++j]===U[++M]&&U[++j]===U[++M]&&U[++j]===U[++M]&&U[++j]===U[++M]&&jL&&--v!=0);return O<=d.lookahead?O:d.lookahead}function ue(d){var B,M,y,v,j,O,N,L,U,Z,V=d.w_size;do{if(v=d.window_size-d.lookahead-d.strstart,d.strstart>=V+(V-Y)){for(i.arraySet(d.window,d.window,V,V,0),d.match_start-=V,d.strstart-=V,d.block_start-=V,B=M=d.hash_size;y=d.head[--B],d.head[B]=V<=y?y-V:0,--M;);for(B=M=V;y=d.prev[--B],d.prev[B]=V<=y?y-V:0,--M;);v+=V}if(d.strm.avail_in===0)break;if(O=d.strm,N=d.window,L=d.strstart+d.lookahead,U=v,Z=void 0,Z=O.avail_in,U=S)for(j=d.strstart-d.insert,d.ins_h=d.window[j],d.ins_h=(d.ins_h<=S&&(d.ins_h=(d.ins_h<=S)if(y=r._tr_tally(d,d.strstart-d.match_start,d.match_length-S),d.lookahead-=d.match_length,d.match_length<=d.max_lazy_match&&d.lookahead>=S){for(d.match_length--;d.strstart++,d.ins_h=(d.ins_h<=S&&(d.ins_h=(d.ins_h<=S&&d.match_length<=d.prev_length){for(v=d.strstart+d.lookahead-S,y=r._tr_tally(d,d.strstart-1-d.prev_match,d.prev_length-S),d.lookahead-=d.prev_length-1,d.prev_length-=2;++d.strstart<=v&&(d.ins_h=(d.ins_h<d.pending_buf_size-5&&(M=d.pending_buf_size-5);;){if(d.lookahead<=1){if(ue(d),d.lookahead===0&&B===l)return m;if(d.lookahead===0)break}d.strstart+=d.lookahead,d.lookahead=0;var y=d.block_start+M;if((d.strstart===0||d.strstart>=y)&&(d.lookahead=d.strstart-y,d.strstart=y,I(d,!1),d.strm.avail_out===0)||d.strstart-d.block_start>=d.w_size-Y&&(I(d,!1),d.strm.avail_out===0))return m}return d.insert=0,B===c?(I(d,!0),d.strm.avail_out===0?J:D):(d.strstart>d.block_start&&(I(d,!1),d.strm.avail_out),m)}),new oe(4,4,8,4,ve),new oe(4,5,16,8,ve),new oe(4,6,32,32,ve),new oe(4,4,16,16,ie),new oe(8,16,32,32,ie),new oe(8,16,128,128,ie),new oe(8,32,128,256,ie),new oe(32,128,258,1024,ie),new oe(32,258,258,4096,ie)],n.deflateInit=function(d,B){return Ae(d,B,b,15,8,0)},n.deflateInit2=Ae,n.deflateReset=ze,n.deflateResetKeep=de,n.deflateSetHeader=function(d,B){return d&&d.state?d.state.wrap!==2?h:(d.state.gzhead=B,u):h},n.deflate=function(d,B){var M,y,v,j;if(!d||!d.state||5>8&255),ee(y,y.gzhead.time>>16&255),ee(y,y.gzhead.time>>24&255),ee(y,y.level===9?2:2<=y.strategy||y.level<2?4:0),ee(y,255&y.gzhead.os),y.gzhead.extra&&y.gzhead.extra.length&&(ee(y,255&y.gzhead.extra.length),ee(y,y.gzhead.extra.length>>8&255)),y.gzhead.hcrc&&(d.adler=s(d.adler,y.pending_buf,y.pending,0)),y.gzindex=0,y.status=69):(ee(y,0),ee(y,0),ee(y,0),ee(y,0),ee(y,0),ee(y,y.level===9?2:2<=y.strategy||y.level<2?4:0),ee(y,3),y.status=E);else{var O=b+(y.w_bits-8<<4)<<8;O|=(2<=y.strategy||y.level<2?0:y.level<6?1:y.level===6?2:3)<<6,y.strstart!==0&&(O|=32),O+=31-O%31,y.status=E,G(y,O),y.strstart!==0&&(G(y,d.adler>>>16),G(y,65535&d.adler)),d.adler=1}if(y.status===69)if(y.gzhead.extra){for(v=y.pending;y.gzindex<(65535&y.gzhead.extra.length)&&(y.pending!==y.pending_buf_size||(y.gzhead.hcrc&&y.pending>v&&(d.adler=s(d.adler,y.pending_buf,y.pending-v,v)),A(d),v=y.pending,y.pending!==y.pending_buf_size));)ee(y,255&y.gzhead.extra[y.gzindex]),y.gzindex++;y.gzhead.hcrc&&y.pending>v&&(d.adler=s(d.adler,y.pending_buf,y.pending-v,v)),y.gzindex===y.gzhead.extra.length&&(y.gzindex=0,y.status=73)}else y.status=73;if(y.status===73)if(y.gzhead.name){v=y.pending;do{if(y.pending===y.pending_buf_size&&(y.gzhead.hcrc&&y.pending>v&&(d.adler=s(d.adler,y.pending_buf,y.pending-v,v)),A(d),v=y.pending,y.pending===y.pending_buf_size)){j=1;break}j=y.gzindexv&&(d.adler=s(d.adler,y.pending_buf,y.pending-v,v)),j===0&&(y.gzindex=0,y.status=91)}else y.status=91;if(y.status===91)if(y.gzhead.comment){v=y.pending;do{if(y.pending===y.pending_buf_size&&(y.gzhead.hcrc&&y.pending>v&&(d.adler=s(d.adler,y.pending_buf,y.pending-v,v)),A(d),v=y.pending,y.pending===y.pending_buf_size)){j=1;break}j=y.gzindexv&&(d.adler=s(d.adler,y.pending_buf,y.pending-v,v)),j===0&&(y.status=103)}else y.status=103;if(y.status===103&&(y.gzhead.hcrc?(y.pending+2>y.pending_buf_size&&A(d),y.pending+2<=y.pending_buf_size&&(ee(y,255&d.adler),ee(y,d.adler>>8&255),d.adler=0,y.status=E)):y.status=E),y.pending!==0){if(A(d),d.avail_out===0)return y.last_flush=-1,u}else if(d.avail_in===0&&R(B)<=R(M)&&B!==c)return ae(d,-5);if(y.status===666&&d.avail_in!==0)return ae(d,-5);if(d.avail_in!==0||y.lookahead!==0||B!==l&&y.status!==666){var N=y.strategy===2?function(L,U){for(var Z;;){if(L.lookahead===0&&(ue(L),L.lookahead===0)){if(U===l)return m;break}if(L.match_length=0,Z=r._tr_tally(L,0,L.window[L.strstart]),L.lookahead--,L.strstart++,Z&&(I(L,!1),L.strm.avail_out===0))return m}return L.insert=0,U===c?(I(L,!0),L.strm.avail_out===0?J:D):L.last_lit&&(I(L,!1),L.strm.avail_out===0)?m:P}(y,B):y.strategy===3?function(L,U){for(var Z,V,Q,le,re=L.window;;){if(L.lookahead<=W){if(ue(L),L.lookahead<=W&&U===l)return m;if(L.lookahead===0)break}if(L.match_length=0,L.lookahead>=S&&0L.lookahead&&(L.match_length=L.lookahead)}if(L.match_length>=S?(Z=r._tr_tally(L,1,L.match_length-S),L.lookahead-=L.match_length,L.strstart+=L.match_length,L.match_length=0):(Z=r._tr_tally(L,0,L.window[L.strstart]),L.lookahead--,L.strstart++),Z&&(I(L,!1),L.strm.avail_out===0))return m}return L.insert=0,U===c?(I(L,!0),L.strm.avail_out===0?J:D):L.last_lit&&(I(L,!1),L.strm.avail_out===0)?m:P}(y,B):a[y.level].func(y,B);if(N!==J&&N!==D||(y.status=666),N===m||N===J)return d.avail_out===0&&(y.last_flush=-1),u;if(N===P&&(B===1?r._tr_align(y):B!==5&&(r._tr_stored_block(y,0,0,!1),B===3&&(te(y.head),y.lookahead===0&&(y.strstart=0,y.block_start=0,y.insert=0))),A(d),d.avail_out===0))return y.last_flush=-1,u}return B!==c?u:y.wrap<=0?1:(y.wrap===2?(ee(y,255&d.adler),ee(y,d.adler>>8&255),ee(y,d.adler>>16&255),ee(y,d.adler>>24&255),ee(y,255&d.total_in),ee(y,d.total_in>>8&255),ee(y,d.total_in>>16&255),ee(y,d.total_in>>24&255)):(G(y,d.adler>>>16),G(y,65535&d.adler)),A(d),0=M.w_size&&(j===0&&(te(M.head),M.strstart=0,M.block_start=0,M.insert=0),U=new i.Buf8(M.w_size),i.arraySet(U,B,Z-M.w_size,M.w_size,0),B=U,Z=M.w_size),O=d.avail_in,N=d.next_in,L=d.input,d.avail_in=Z,d.next_in=0,d.input=B,ue(M);M.lookahead>=S;){for(y=M.strstart,v=M.lookahead-(S-1);M.ins_h=(M.ins_h<>>=S=T>>>24,_-=S,(S=T>>>16&255)===0)P[p++]=65535&T;else{if(!(16&S)){if((64&S)==0){T=C[(65535&T)+(b&(1<>>=S,_-=S),_<15&&(b+=m[o++]<<_,_+=8,b+=m[o++]<<_,_+=8),T=w[b&F];n:for(;;){if(b>>>=S=T>>>24,_-=S,!(16&(S=T>>>16&255))){if((64&S)==0){T=w[(65535&T)+(b&(1<>>=S,_-=S,(S=p-l)>3,b&=(1<<(_-=W<<3))-1,a.next_in=o,a.next_out=p,a.avail_in=o>>24&255)+(k>>>8&65280)+((65280&k)<<8)+((255&k)<<24)}function b(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new a.Buf16(320),this.work=new a.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function _(k){var E;return k&&k.state?(E=k.state,k.total_in=k.total_out=E.total=0,k.msg="",E.wrap&&(k.adler=1&E.wrap),E.mode=h,E.last=0,E.havedict=0,E.dmax=32768,E.head=null,E.hold=0,E.bits=0,E.lencode=E.lendyn=new a.Buf32(f),E.distcode=E.distdyn=new a.Buf32(g),E.sane=1,E.back=-1,c):u}function C(k){var E;return k&&k.state?((E=k.state).wsize=0,E.whave=0,E.wnext=0,_(k)):u}function w(k,E){var m,P;return k&&k.state?(P=k.state,E<0?(m=0,E=-E):(m=1+(E>>4),E<48&&(E&=15)),E&&(E<8||15=D.wsize?(a.arraySet(D.window,E,m-D.wsize,D.wsize,0),D.wnext=0,D.whave=D.wsize):(P<(J=D.wsize-D.wnext)&&(J=P),a.arraySet(D.window,E,m-P,J,D.wnext),(P-=J)?(a.arraySet(D.window,E,m-P,P,0),D.wnext=P,D.whave=D.wsize):(D.wnext+=J,D.wnext===D.wsize&&(D.wnext=0),D.whave>>8&255,m.check=r(m.check,j,2,0),I=A=0,m.mode=2;break}if(m.flags=0,m.head&&(m.head.done=!1),!(1&m.wrap)||(((255&A)<<8)+(A>>8))%31){k.msg="incorrect header check",m.mode=30;break}if((15&A)!=8){k.msg="unknown compression method",m.mode=30;break}if(I-=4,d=8+(15&(A>>>=4)),m.wbits===0)m.wbits=d;else if(d>m.wbits){k.msg="invalid window size",m.mode=30;break}m.dmax=1<>8&1),512&m.flags&&(j[0]=255&A,j[1]=A>>>8&255,m.check=r(m.check,j,2,0)),I=A=0,m.mode=3;case 3:for(;I<32;){if(R===0)break e;R--,A+=P[D++]<>>8&255,j[2]=A>>>16&255,j[3]=A>>>24&255,m.check=r(m.check,j,4,0)),I=A=0,m.mode=4;case 4:for(;I<16;){if(R===0)break e;R--,A+=P[D++]<>8),512&m.flags&&(j[0]=255&A,j[1]=A>>>8&255,m.check=r(m.check,j,2,0)),I=A=0,m.mode=5;case 5:if(1024&m.flags){for(;I<16;){if(R===0)break e;R--,A+=P[D++]<>>8&255,m.check=r(m.check,j,2,0)),I=A=0}else m.head&&(m.head.extra=null);m.mode=6;case 6:if(1024&m.flags&&(R<(q=m.length)&&(q=R),q&&(m.head&&(d=m.head.extra_len-m.length,m.head.extra||(m.head.extra=new Array(m.head.extra_len)),a.arraySet(m.head.extra,P,D,q,d)),512&m.flags&&(m.check=r(m.check,P,q,D)),R-=q,D+=q,m.length-=q),m.length))break e;m.length=0,m.mode=7;case 7:if(2048&m.flags){if(R===0)break e;for(q=0;d=P[D+q++],m.head&&d&&m.length<65536&&(m.head.name+=String.fromCharCode(d)),d&&q>9&1,m.head.done=!0),k.adler=m.check=0,m.mode=12;break;case 10:for(;I<32;){if(R===0)break e;R--,A+=P[D++]<>>=7&I,I-=7&I,m.mode=27;break}for(;I<3;){if(R===0)break e;R--,A+=P[D++]<>>=1)){case 0:m.mode=14;break;case 1:if(W(m),m.mode=20,E!==6)break;A>>>=2,I-=2;break e;case 2:m.mode=17;break;case 3:k.msg="invalid block type",m.mode=30}A>>>=2,I-=2;break;case 14:for(A>>>=7&I,I-=7&I;I<32;){if(R===0)break e;R--,A+=P[D++]<>>16^65535)){k.msg="invalid stored block lengths",m.mode=30;break}if(m.length=65535&A,I=A=0,m.mode=15,E===6)break e;case 15:m.mode=16;case 16:if(q=m.length){if(R>>=5,I-=5,m.ndist=1+(31&A),A>>>=5,I-=5,m.ncode=4+(15&A),A>>>=4,I-=4,286>>=3,I-=3}for(;m.have<19;)m.lens[O[m.have++]]=0;if(m.lencode=m.lendyn,m.lenbits=7,M={bits:m.lenbits},B=s(0,m.lens,0,19,m.lencode,0,m.work,M),m.lenbits=M.bits,B){k.msg="invalid code lengths set",m.mode=30;break}m.have=0,m.mode=19;case 19:for(;m.have>>16&255,he=65535&v,!((ie=v>>>24)<=I);){if(R===0)break e;R--,A+=P[D++]<>>=ie,I-=ie,m.lens[m.have++]=he;else{if(he===16){for(y=ie+2;I>>=ie,I-=ie,m.have===0){k.msg="invalid bit length repeat",m.mode=30;break}d=m.lens[m.have-1],q=3+(3&A),A>>>=2,I-=2}else if(he===17){for(y=ie+3;I>>=ie)),A>>>=3,I-=3}else{for(y=ie+7;I>>=ie)),A>>>=7,I-=7}if(m.have+q>m.nlen+m.ndist){k.msg="invalid bit length repeat",m.mode=30;break}for(;q--;)m.lens[m.have++]=d}}if(m.mode===30)break;if(m.lens[256]===0){k.msg="invalid code -- missing end-of-block",m.mode=30;break}if(m.lenbits=9,M={bits:m.lenbits},B=s(p,m.lens,0,m.nlen,m.lencode,0,m.work,M),m.lenbits=M.bits,B){k.msg="invalid literal/lengths set",m.mode=30;break}if(m.distbits=6,m.distcode=m.distdyn,M={bits:m.distbits},B=s(l,m.lens,m.nlen,m.ndist,m.distcode,0,m.work,M),m.distbits=M.bits,B){k.msg="invalid distances set",m.mode=30;break}if(m.mode=20,E===6)break e;case 20:m.mode=21;case 21:if(6<=R&&258<=te){k.next_out=ae,k.avail_out=te,k.next_in=D,k.avail_in=R,m.hold=A,m.bits=I,o(k,G),ae=k.next_out,J=k.output,te=k.avail_out,D=k.next_in,P=k.input,R=k.avail_in,A=m.hold,I=m.bits,m.mode===12&&(m.back=-1);break}for(m.back=0;oe=(v=m.lencode[A&(1<>>16&255,he=65535&v,!((ie=v>>>24)<=I);){if(R===0)break e;R--,A+=P[D++]<>de)])>>>16&255,he=65535&v,!(de+(ie=v>>>24)<=I);){if(R===0)break e;R--,A+=P[D++]<>>=de,I-=de,m.back+=de}if(A>>>=ie,I-=ie,m.back+=ie,m.length=he,oe===0){m.mode=26;break}if(32&oe){m.back=-1,m.mode=12;break}if(64&oe){k.msg="invalid literal/length code",m.mode=30;break}m.extra=15&oe,m.mode=22;case 22:if(m.extra){for(y=m.extra;I>>=m.extra,I-=m.extra,m.back+=m.extra}m.was=m.length,m.mode=23;case 23:for(;oe=(v=m.distcode[A&(1<>>16&255,he=65535&v,!((ie=v>>>24)<=I);){if(R===0)break e;R--,A+=P[D++]<>de)])>>>16&255,he=65535&v,!(de+(ie=v>>>24)<=I);){if(R===0)break e;R--,A+=P[D++]<>>=de,I-=de,m.back+=de}if(A>>>=ie,I-=ie,m.back+=ie,64&oe){k.msg="invalid distance code",m.mode=30;break}m.offset=he,m.extra=15&oe,m.mode=24;case 24:if(m.extra){for(y=m.extra;I>>=m.extra,I-=m.extra,m.back+=m.extra}if(m.offset>m.dmax){k.msg="invalid distance too far back",m.mode=30;break}m.mode=25;case 25:if(te===0)break e;if(q=G-te,m.offset>q){if((q=m.offset-q)>m.whave&&m.sane){k.msg="invalid distance too far back",m.mode=30;break}ue=q>m.wnext?(q-=m.wnext,m.wsize-q):m.wnext-q,q>m.length&&(q=m.length),ve=m.window}else ve=J,ue=ae-m.offset,q=m.length;for(teF?(S=ue[ve+g[E]],I[ee+g[E]]):(S=96,0),b=1<>ae)+(_-=b)]=T<<24|S<<16|W|0,_!==0;);for(b=1<>=1;if(b!==0?(A&=b-1,A+=b):A=0,E++,--G[k]==0){if(k===P)break;k=l[c+g[E]]}if(J>>7)]}function ee(v,j){v.pending_buf[v.pending++]=255&j,v.pending_buf[v.pending++]=j>>>8&255}function G(v,j,O){v.bi_valid>x-O?(v.bi_buf|=j<>x-v.bi_valid,v.bi_valid+=O-x):(v.bi_buf|=j<>>=1,O<<=1,0<--j;);return O>>>1}function ve(v,j,O){var N,L,U=new Array(g+1),Z=0;for(N=1;N<=g;N++)U[N]=Z=Z+O[N-1]<<1;for(L=0;L<=j;L++){var V=v[2*L+1];V!==0&&(v[2*L]=ue(U[V]++,V))}}function ie(v){var j;for(j=0;j>1;1<=O;O--)de(v,U,O);for(L=Q;O=v.heap[1],v.heap[1]=v.heap[v.heap_len--],de(v,U,1),N=v.heap[1],v.heap[--v.heap_max]=O,v.heap[--v.heap_max]=N,U[2*L]=U[2*O]+U[2*N],v.depth[L]=(v.depth[O]>=v.depth[N]?v.depth[O]:v.depth[N])+1,U[2*O+1]=U[2*N+1]=L,v.heap[1]=L++,de(v,U,1),2<=v.heap_len;);v.heap[--v.heap_max]=v.heap[1],function(re,Ce){var Mt,Be,Ft,fe,rn,Qn,Re=Ce.dyn_tree,Gi=Ce.max_code,np=Ce.stat_desc.static_tree,ap=Ce.stat_desc.has_stree,ip=Ce.stat_desc.extra_bits,Zi=Ce.stat_desc.extra_base,Et=Ce.stat_desc.max_length,on=0;for(fe=0;fe<=g;fe++)re.bl_count[fe]=0;for(Re[2*re.heap[re.heap_max]+1]=0,Mt=re.heap_max+1;Mt>=7;L>>=1)if(1&le&&V.dyn_ltree[2*Q]!==0)return i;if(V.dyn_ltree[18]!==0||V.dyn_ltree[20]!==0||V.dyn_ltree[26]!==0)return r;for(Q=32;Q>>3,(U=v.static_len+3+7>>>3)<=L&&(L=U)):L=U=O+5,O+4<=L&&j!==-1?y(v,j,O,N):v.strategy===4||U===L?(G(v,2+(N?1:0),3),ze(v,Y,k)):(G(v,4+(N?1:0),3),function(V,Q,le,re){var Ce;for(G(V,Q-257,5),G(V,le-1,5),G(V,re-4,4),Ce=0;Ce>>8&255,v.pending_buf[v.d_buf+2*v.last_lit+1]=255&j,v.pending_buf[v.l_buf+v.last_lit]=255&O,v.last_lit++,j===0?v.dyn_ltree[2*O]++:(v.matches++,j--,v.dyn_ltree[2*(m[O]+l+1)]++,v.dyn_dtree[2*I(j)]++),v.last_lit===v.lit_bufsize-1},n._tr_align=function(v){G(v,2,3),q(v,_,Y),function(j){j.bi_valid===16?(ee(j,j.bi_buf),j.bi_buf=0,j.bi_valid=0):8<=j.bi_valid&&(j.pending_buf[j.pending++]=255&j.bi_buf,j.bi_buf>>=8,j.bi_valid-=8)}(v)}},{"../utils/common":41}],53:[function(e,t,n){"use strict";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,n){(function(a){(function(i,r){"use strict";if(!i.setImmediate){var o,s,p,l,c=1,u={},h=!1,f=i.document,g=Object.getPrototypeOf&&Object.getPrototypeOf(i);g=g&&g.setTimeout?g:i,o={}.toString.call(i.process)==="[object process]"?function(C){process.nextTick(function(){b(C)})}:function(){if(i.postMessage&&!i.importScripts){var C=!0,w=i.onmessage;return i.onmessage=function(){C=!1},i.postMessage("","*"),i.onmessage=w,C}}()?(l="setImmediate$"+Math.random()+"$",i.addEventListener?i.addEventListener("message",_,!1):i.attachEvent("onmessage",_),function(C){i.postMessage(l+C,"*")}):i.MessageChannel?((p=new MessageChannel).port1.onmessage=function(C){b(C.data)},function(C){p.port2.postMessage(C)}):f&&"onreadystatechange"in f.createElement("script")?(s=f.documentElement,function(C){var w=f.createElement("script");w.onreadystatechange=function(){b(C),w.onreadystatechange=null,s.removeChild(w),w=null},s.appendChild(w)}):function(C){setTimeout(b,0,C)},g.setImmediate=function(C){typeof C!="function"&&(C=new Function(""+C));for(var w=new Array(arguments.length-1),z=0;z"u"?a===void 0?this:a:self)}).call(this,typeof global<"u"?global:typeof self<"u"?self:typeof window<"u"?window:{})},{}]},{},[10])(10)})});var pc=K((Z2,lc)=>{lc.exports={aqua:/#00ffff(ff)?(?!\w)|#0ff(f)?(?!\w)/gi,azure:/#f0ffff(ff)?(?!\w)/gi,beige:/#f5f5dc(ff)?(?!\w)/gi,bisque:/#ffe4c4(ff)?(?!\w)/gi,black:/#000000(ff)?(?!\w)|#000(f)?(?!\w)/gi,blue:/#0000ff(ff)?(?!\w)|#00f(f)?(?!\w)/gi,brown:/#a52a2a(ff)?(?!\w)/gi,coral:/#ff7f50(ff)?(?!\w)/gi,cornsilk:/#fff8dc(ff)?(?!\w)/gi,crimson:/#dc143c(ff)?(?!\w)/gi,cyan:/#00ffff(ff)?(?!\w)|#0ff(f)?(?!\w)/gi,darkblue:/#00008b(ff)?(?!\w)/gi,darkcyan:/#008b8b(ff)?(?!\w)/gi,darkgrey:/#a9a9a9(ff)?(?!\w)/gi,darkred:/#8b0000(ff)?(?!\w)/gi,deeppink:/#ff1493(ff)?(?!\w)/gi,dimgrey:/#696969(ff)?(?!\w)/gi,gold:/#ffd700(ff)?(?!\w)/gi,green:/#008000(ff)?(?!\w)/gi,grey:/#808080(ff)?(?!\w)/gi,honeydew:/#f0fff0(ff)?(?!\w)/gi,hotpink:/#ff69b4(ff)?(?!\w)/gi,indigo:/#4b0082(ff)?(?!\w)/gi,ivory:/#fffff0(ff)?(?!\w)/gi,khaki:/#f0e68c(ff)?(?!\w)/gi,lavender:/#e6e6fa(ff)?(?!\w)/gi,lime:/#00ff00(ff)?(?!\w)|#0f0(f)?(?!\w)/gi,linen:/#faf0e6(ff)?(?!\w)/gi,maroon:/#800000(ff)?(?!\w)/gi,moccasin:/#ffe4b5(ff)?(?!\w)/gi,navy:/#000080(ff)?(?!\w)/gi,oldlace:/#fdf5e6(ff)?(?!\w)/gi,olive:/#808000(ff)?(?!\w)/gi,orange:/#ffa500(ff)?(?!\w)/gi,orchid:/#da70d6(ff)?(?!\w)/gi,peru:/#cd853f(ff)?(?!\w)/gi,pink:/#ffc0cb(ff)?(?!\w)/gi,plum:/#dda0dd(ff)?(?!\w)/gi,purple:/#800080(ff)?(?!\w)/gi,red:/#ff0000(ff)?(?!\w)|#f00(f)?(?!\w)/gi,salmon:/#fa8072(ff)?(?!\w)/gi,seagreen:/#2e8b57(ff)?(?!\w)/gi,seashell:/#fff5ee(ff)?(?!\w)/gi,sienna:/#a0522d(ff)?(?!\w)/gi,silver:/#c0c0c0(ff)?(?!\w)/gi,skyblue:/#87ceeb(ff)?(?!\w)/gi,snow:/#fffafa(ff)?(?!\w)/gi,tan:/#d2b48c(ff)?(?!\w)/gi,teal:/#008080(ff)?(?!\w)/gi,thistle:/#d8bfd8(ff)?(?!\w)/gi,tomato:/#ff6347(ff)?(?!\w)/gi,violet:/#ee82ee(ff)?(?!\w)/gi,wheat:/#f5deb3(ff)?(?!\w)/gi,white:/#ffffff(ff)?(?!\w)|#fff(f)?(?!\w)/gi}});var dc=K((K2,uc)=>{var Ga=pc(),Ka={whitespace:/\s+/g,urlHexPairs:/%[\dA-F]{2}/g,quotes:/"/g};function dh(e){return e.trim().replace(Ka.whitespace," ")}function fh(e){return encodeURIComponent(e).replace(Ka.urlHexPairs,hh)}function mh(e){return Object.keys(Ga).forEach(function(t){Ga[t].test(e)&&(e=e.replace(Ga[t],t))}),e}function hh(e){switch(e){case"%20":return" ";case"%3D":return"=";case"%3A":return":";case"%2F":return"/";default:return e.toLowerCase()}}function Za(e){if(typeof e!="string")throw new TypeError("Expected a string, but received "+typeof e);e.charCodeAt(0)===65279&&(e=e.slice(1));var t=mh(dh(e)).replace(Ka.quotes,"'");return"data:image/svg+xml,"+fh(t)}Za.toSrcset=function(t){return Za(t).replace(/ /g,"%20")};uc.exports=Za});var n1={};Xi(n1,{default:()=>Jn});module.exports=up(n1);var tp=require("obsidian");var st=require("@codemirror/view"),na=require("obsidian");var ln=require("@codemirror/view"),er=require("obsidian");var Qi=require("@codemirror/view"),tt=class extends Qi.WidgetType{constructor(n,a){super();this.id=n;this.plugin=a}eq(n){return n instanceof tt&&n.id===this.id}toDOM(n){let a=createSpan({cls:"cm-isc-icon",attr:{"aria-label":this.id.replace(/_/g," ")}});return this.plugin.packManager.getSVGIcon(this.id).then(i=>{i?(i.classList.forEach(r=>a.addClass(r)),a.replaceChildren(...i.childNodes)):a.append(`:${this.id}:`)}),a}ignoreEvent(){return!1}};var dp=(e,t)=>{let n=[],a=e.state.field(t.shortcodePosField);for(let{from:i,to:r}of e.visibleRanges)a.between(i,r,(o,s,{iconId:p})=>{n.push([p,o,s])});return ln.Decoration.set(n.map(([i,r,o])=>{let p={widget:new tt(i,t),side:-1,from:r,to:o};return e.state.field(er.editorLivePreviewField)?ln.Decoration.replace(p).range(r,o):ln.Decoration.widget(p).range(o)}),!0)},ta=dp;var tr=require("obsidian"),fp=(e,t,n,a)=>new tr.Menu(n.app).addItem(i=>i.setIcon("image-glyph").setTitle("Change Icon").onClick(()=>$(void 0,null,function*(){let r=yield n.api.getIconFromUser();!r||a.dispatch({changes:{from:e,to:t,insert:`:${r.id}:`}})}))).addItem(i=>i.setIcon("trash").setTitle("Delete Icon").onClick(()=>{a.dispatch({changes:{from:e,to:t,insert:""}})})),nr=fp;var mp=e=>{class t{constructor(i){this.plugin=e,this.decorations=ta(i,this.plugin)}update(i){let r=i.startState.field(na.editorLivePreviewField),o=i.state.field(na.editorLivePreviewField);(i.docChanged||i.viewportChanged||r!==o)&&(this.decorations=ta(i.view,e))}}return st.ViewPlugin.fromClass(t,{eventHandlers:{mousedown:n},decorations:a=>a.decorations,provide:a=>st.EditorView.atomicRanges.of(i=>{let r=i.plugin(a);return r?r.decorations:st.Decoration.none})});function n(a,i){let r=a.target;if(r.matchParent(".cm-isc-icon",i.contentDOM)){let o=i.posAtDOM(r),s=-1,p=-1;if(this.decorations.between(o-1,o+1,(l,c,u)=>{if(o>=l&&o<=c){l===c?(s=u.spec.from,p=u.spec.to):(s=l,p=c);return}}),s<0||p<0){console.error("no range found for",r);return}if(ar(0).then(()=>i.dispatch({selection:{anchor:s,head:p}})),a.button===0||a.button===1){let l=nr(s,p,e,i);ar(200).then(()=>l.showAtMouseEvent(a))}}}},ar=e=>new Promise(t=>setTimeout(t,e)),ir=mp;var hp=e=>{e.registerEditorExtension([e.shortcodePosField,ir(e)])},rr=hp;var Ps=require("@codemirror/language"),Ts=require("@codemirror/language"),bn=require("@codemirror/state"),Os=require("@codemirror/state");var mn=be(fr(),1),Fs=be(Wt(),1),Bs=be(fn(),1);var{toString:ym}=Object.prototype;function ka(e){return ym.call(e)==="[object RegExp]"}var Ms={global:"g",ignoreCase:"i",multiline:"m",dotAll:"s",sticky:"y",unicode:"u"};function wa(e,t={}){if(!ka(e))throw new TypeError("Expected a RegExp instance");let n=Object.keys(Ms).map(i=>(typeof t[i]=="boolean"?t[i]:e[i])?Ms[i]:"").join(""),a=new RegExp(t.source||e.source,n);return a.lastIndex=typeof t.lastIndex=="number"?t.lastIndex:e.lastIndex,a}var je=e=>{var t=e.indexOf(":");return t>-1?t===e.length-1?(e=e.substring(0,t),je(e)):(e=e.substring(t+1),je(e)):e},_m=/^([A-Za-z0-9]+?)_/,Ca=e=>{if(Fs.default.hasEmoji(e))return{pack:"emoji",name:e};let t=e.match(_m);if(!t)return console.error("No vaild pack id found in: ",e),null;let[n,a]=t;return{pack:a,name:e.substring(n.length)}},ja=e=>{let t=Ca(e);return t?`${t.pack}_${La(t.name)}`:(console.log("failed to rename icon: id %s invalid",e),null)},La=e=>e.trim().replace(/[ -]+/g,"_").replace(/\s+/g,"").toLocaleLowerCase(),hn=[".bmp",".png",".jpg",".jpeg",".gif",".svg",".webp"],Es=/^[\w-]+\.(?:bmp|png|jpg|jpeg|gif|svg|webp)$/,gn=/\.(?:bmp|png|jpg|jpeg|gif|svg|webp)$/,km=hn.map(e=>(0,mn.lookup)(e)),zs=e=>$(void 0,null,function*(){if(!e||e.length<=0)return null;let t=i=>$(void 0,null,function*(){return{name:i.name.replace(gn,""),ext:"."+(0,mn.extension)(i.type),data:yield i.arrayBuffer()}}),n=[];for(let i=0;i0?a:null}),gt=/:\+1:|:-1:|:[\w-]+:/,Rt=e=>wa(e,{global:!0}),xt=e=>(0,Bs.default)(["isc-icon",`isc-${e.pack}`]);var wm=(e,t)=>xn(e,t[0])||xn(e,t[1]),xn=(e,t)=>e[0]t,Cm=(e,t)=>{let n=xn(e,t[0])?e[0]:t[0],a=xn(e,t[1])?e[1]:t[1];return[n,a]},jm=e=>e.sort((t,n)=>t[0]-n[0]).reduce((t,n)=>{let a=t.findIndex(i=>wm(i,n));return a!==-1?t[a]=Cm(t[a],n):t.push(n),t},[]),vn=jm;var Ut=class extends bn.RangeValue{constructor(n){super();this.text=n}get iconId(){return je(this.text)}eq(n){return n instanceof Ut&&n.text===this.text}},Lm=["link-alias","comment","header","strong","em","strikethrough","quote","link","list-1","list-2","list-3","highlight","hmd-footref2","footref"],Im=["formatting","comment-start","comment-end"],Sm=e=>{let t=e.prop(Ts.tokenClassNodeProp);if(!t)return!1;let n=new Set(t==null?void 0:t.split(" "));return Im.every(a=>!n.has(a))&&Lm.some(a=>n.has(a))},Am=e=>{let t=(n,a,i,r)=>{let o=(p,l)=>{let c=n.doc.sliceString(p,l);if(!!c.trim())for(let{0:u,index:h}of c.matchAll(Rt(gt)))e.packManager.hasIcon(je(u))&&r(p+h,p+h+u.length,new Ut(u))},s=a;(0,Ps.syntaxTree)(n).iterate({from:a-1,to:i+1,enter:({type:p,from:l,to:c})=>{p.name!=="Document"&&(l!==s&&o(s,l),s=c,Sm(p)&&o(l,c))}}),s!==i&&o(s,i)};return Os.StateField.define({create:n=>{let a=new bn.RangeSetBuilder;return t(n,0,n.doc.length,a.add.bind(a)),a.finish()},update:(n,a)=>{if(!a.docChanged)return n;n=n.map(a.changes);let i=[];a.changes.iterChangedRanges((o,s,p,l)=>{i.push([a.state.doc.lineAt(p).number,a.state.doc.lineAt(l).number])});let r=[];for(let[o,s]of vn(i)){let{from:p}=a.state.doc.line(o),{to:l}=a.state.doc.line(s);n=n.update({filterFrom:p,filterTo:l,filter:()=>!1}),t(a.state,p,l,(c,u,h)=>{r.push(h.range(c,u))})}return n=n.update({add:r}),n}})},Ns=Am;var Vt=class{constructor(t){this.plugin=t;this.cache=new Map}get vault(){return this.plugin.app.vault}getIcon(t){return $(this,null,function*(){let n=yield this.vault.adapter.stat(t);if(!n||n.type!=="file")return null;if(this.cache.has(t)){let i=this.cache.get(t);if(i.ctime===n.ctime&&i.mtime===n.mtime&&i.size===n.size)return i.svg.cloneNode(!0)}return(yield this.readIntoCache(t,n)).cloneNode(!0)})}readIntoCache(t,n){return $(this,null,function*(){let a=DOMPurify.sanitize(yield this.vault.adapter.read(t)),i=new DOMParser().parseFromString(a,"image/svg+xml").documentElement;return this.cache.set(t,et(Me({},n),{svg:i})),i})}refresh(){let t=n=>$(this,null,function*(){let a=yield this.vault.adapter.stat(n);return!a||a.type!=="file"?this.cache.delete(n):yield this.readIntoCache(n,a),n});return Promise.allSettled([...this.cache.keys()].map(t))}clear(){this.cache.clear()}};var yc=be(Ia(),1);function He(e){return Array.isArray?Array.isArray(e):Gs(e)==="[object Array]"}var Mm=1/0;function Fm(e){if(typeof e=="string")return e;let t=e+"";return t=="0"&&1/e==-Mm?"-0":t}function Em(e){return e==null?"":Fm(e)}function Te(e){return typeof e=="string"}function qs(e){return typeof e=="number"}function zm(e){return e===!0||e===!1||Bm(e)&&Gs(e)=="[object Boolean]"}function $s(e){return typeof e=="object"}function Bm(e){return $s(e)&&e!==null}function ke(e){return e!=null}function Sa(e){return!e.trim().length}function Gs(e){return e==null?e===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}var Pm="Incorrect 'index' type",Tm=e=>`Invalid value for key ${e}`,Om=e=>`Pattern length exceeds max of ${e}.`,Nm=e=>`Missing ${e} property in key`,Dm=e=>`Property 'weight' in key '${e}' must be a positive integer`,Ws=Object.prototype.hasOwnProperty,Aa=class{constructor(t){this._keys=[],this._keyMap={};let n=0;t.forEach(a=>{let i=Zs(a);n+=i.weight,this._keys.push(i),this._keyMap[i.id]=i,n+=i.weight}),this._keys.forEach(a=>{a.weight/=n})}get(t){return this._keyMap[t]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}};function Zs(e){let t=null,n=null,a=null,i=1,r=null;if(Te(e)||He(e))a=e,t=Rs(e),n=Ma(e);else{if(!Ws.call(e,"name"))throw new Error(Nm("name"));let o=e.name;if(a=o,Ws.call(e,"weight")&&(i=e.weight,i<=0))throw new Error(Dm(o));t=Rs(o),n=Ma(o),r=e.getFn}return{path:t,id:n,weight:i,src:a,getFn:r}}function Rs(e){return He(e)?e:e.split(".")}function Ma(e){return He(e)?e.join("."):e}function Wm(e,t){let n=[],a=!1,i=(r,o,s)=>{if(!!ke(r))if(!o[s])n.push(r);else{let p=o[s],l=r[p];if(!ke(l))return;if(s===o.length-1&&(Te(l)||qs(l)||zm(l)))n.push(Em(l));else if(He(l)){a=!0;for(let c=0,u=l.length;ce.score===t.score?e.idx{this._keysMap[n.id]=a})}create(){this.isCreated||!this.docs.length||(this.isCreated=!0,Te(this.docs[0])?this.docs.forEach((t,n)=>{this._addString(t,n)}):this.docs.forEach((t,n)=>{this._addObject(t,n)}),this.norm.clear())}add(t){let n=this.size();Te(t)?this._addString(t,n):this._addObject(t,n)}removeAt(t){this.records.splice(t,1);for(let n=t,a=this.size();n{let o=i.getFn?i.getFn(t):this.getFn(t,i.path);if(!!ke(o)){if(He(o)){let s=[],p=[{nestedArrIndex:-1,value:o}];for(;p.length;){let{nestedArrIndex:l,value:c}=p.pop();if(!!ke(c))if(Te(c)&&!Sa(c)){let u={v:c,i:l,n:this.norm.get(c)};s.push(u)}else He(c)&&c.forEach((u,h)=>{p.push({nestedArrIndex:h,value:u})})}a.$[r]=s}else if(Te(o)&&!Sa(o)){let s={v:o,n:this.norm.get(o)};a.$[r]=s}}}),this.records.push(a)}toJSON(){return{keys:this.keys,records:this.records}}};function Ks(e,t,{getFn:n=ne.getFn,fieldNormWeight:a=ne.fieldNormWeight}={}){let i=new Ht({getFn:n,fieldNormWeight:a});return i.setKeys(e.map(Zs)),i.setSources(t),i.create(),i}function Gm(e,{getFn:t=ne.getFn,fieldNormWeight:n=ne.fieldNormWeight}={}){let{keys:a,records:i}=e,r=new Ht({getFn:t,fieldNormWeight:n});return r.setKeys(a),r.setIndexRecords(i),r}function _n(e,{errors:t=0,currentLocation:n=0,expectedLocation:a=0,distance:i=ne.distance,ignoreLocation:r=ne.ignoreLocation}={}){let o=t/e.length;if(r)return o;let s=Math.abs(a-n);return i?o+s/i:s?1:o}function Zm(e=[],t=ne.minMatchCharLength){let n=[],a=-1,i=-1,r=0;for(let o=e.length;r=t&&n.push([a,i]),a=-1)}return e[r-1]&&r-a>=t&&n.push([a,r-1]),n}var at=32;function Km(e,t,n,{location:a=ne.location,distance:i=ne.distance,threshold:r=ne.threshold,findAllMatches:o=ne.findAllMatches,minMatchCharLength:s=ne.minMatchCharLength,includeMatches:p=ne.includeMatches,ignoreLocation:l=ne.ignoreLocation}={}){if(t.length>at)throw new Error(Om(at));let c=t.length,u=e.length,h=Math.max(0,Math.min(a,u)),f=r,g=h,x=s>1||p,b=x?Array(u):[],_;for(;(_=e.indexOf(t,g))>-1;){let S=_n(t,{currentLocation:_,expectedLocation:h,distance:i,ignoreLocation:l});if(f=Math.min(S,f),g=_+c,x){let W=0;for(;W=k;J-=1){let D=J-1,ae=n[e.charAt(D)];if(x&&(b[D]=+!!ae),m[J]=(m[J+1]<<1|1)&ae,S&&(m[J]|=(C[J+1]|C[J])<<1|1|C[J+1]),m[J]&F&&(w=_n(t,{errors:S,currentLocation:D,expectedLocation:h,distance:i,ignoreLocation:l}),w<=f)){if(f=w,g=D,g<=h)break;k=Math.max(1,2*h-g)}}if(_n(t,{errors:S+1,currentLocation:h,expectedLocation:h,distance:i,ignoreLocation:l})>f)break;C=m}let T={isMatch:g>=0,score:Math.max(.001,w)};if(x){let S=Zm(b,s);S.length?p&&(T.indices=S):T.isMatch=!1}return T}function Ym(e){let t={};for(let n=0,a=e.length;n{this.chunks.push({pattern:h,alphabet:Ym(h),startIndex:f})},u=this.pattern.length;if(u>at){let h=0,f=u%at,g=u-f;for(;h{let{isMatch:_,score:C,indices:w}=Km(t,g,x,{location:i+b,distance:r,threshold:o,findAllMatches:s,minMatchCharLength:p,includeMatches:a,ignoreLocation:l});_&&(h=!0),u+=C,_&&w&&(c=[...c,...w])});let f={isMatch:h,score:h?u/this.chunks.length:1};return h&&a&&(f.indices=c),f}},Oe=class{constructor(t){this.pattern=t}static isMultiMatch(t){return Us(t,this.multiRegex)}static isSingleMatch(t){return Us(t,this.singleRegex)}search(){}};function Us(e,t){let n=e.match(t);return n?n[1]:null}var Fa=class extends Oe{constructor(t){super(t)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(t){let n=t===this.pattern;return{isMatch:n,score:n?0:1,indices:[0,this.pattern.length-1]}}},Ea=class extends Oe{constructor(t){super(t)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(t){let a=t.indexOf(this.pattern)===-1;return{isMatch:a,score:a?0:1,indices:[0,t.length-1]}}},za=class extends Oe{constructor(t){super(t)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(t){let n=t.startsWith(this.pattern);return{isMatch:n,score:n?0:1,indices:[0,this.pattern.length-1]}}},Ba=class extends Oe{constructor(t){super(t)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(t){let n=!t.startsWith(this.pattern);return{isMatch:n,score:n?0:1,indices:[0,t.length-1]}}},Pa=class extends Oe{constructor(t){super(t)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(t){let n=t.endsWith(this.pattern);return{isMatch:n,score:n?0:1,indices:[t.length-this.pattern.length,t.length-1]}}},Ta=class extends Oe{constructor(t){super(t)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(t){let n=!t.endsWith(this.pattern);return{isMatch:n,score:n?0:1,indices:[0,t.length-1]}}},wn=class extends Oe{constructor(t,{location:n=ne.location,threshold:a=ne.threshold,distance:i=ne.distance,includeMatches:r=ne.includeMatches,findAllMatches:o=ne.findAllMatches,minMatchCharLength:s=ne.minMatchCharLength,isCaseSensitive:p=ne.isCaseSensitive,ignoreLocation:l=ne.ignoreLocation}={}){super(t),this._bitapSearch=new kn(t,{location:n,threshold:a,distance:i,includeMatches:r,findAllMatches:o,minMatchCharLength:s,isCaseSensitive:p,ignoreLocation:l})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(t){return this._bitapSearch.searchIn(t)}},Cn=class extends Oe{constructor(t){super(t)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(t){let n=0,a,i=[],r=this.pattern.length;for(;(a=t.indexOf(this.pattern,n))>-1;)n=a+r,i.push([a,n-1]);let o=!!i.length;return{isMatch:o,score:o?0:1,indices:i}}},Oa=[Fa,Cn,za,Ba,Ta,Pa,Ea,wn],Vs=Oa.length,Xm=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,Jm="|";function Qm(e,t={}){return e.split(Jm).map(n=>{let a=n.trim().split(Xm).filter(r=>r&&!!r.trim()),i=[];for(let r=0,o=a.length;r!!(e[jn.AND]||e[jn.OR]),nh=e=>!!e[Ra.PATH],ah=e=>!He(e)&&$s(e)&&!Ua(e),Hs=e=>({[jn.AND]:Object.keys(e).map(t=>({[t]:e[t]}))});function Ys(e,t,{auto:n=!0}={}){let a=i=>{let r=Object.keys(i),o=nh(i);if(!o&&r.length>1&&!Ua(i))return a(Hs(i));if(ah(i)){let p=o?i[Ra.PATH]:r[0],l=o?i[Ra.PATTERN]:i[p];if(!Te(l))throw new Error(Tm(p));let c={keyId:Ma(p),pattern:l};return n&&(c.searcher=Wa(l,t)),c}let s={children:[],operator:r[0]};return r.forEach(p=>{let l=i[p];He(l)&&l.forEach(c=>{s.children.push(a(c))})}),s};return Ua(e)||(e=Hs(e)),a(e)}function ih(e,{ignoreFieldNorm:t=ne.ignoreFieldNorm}){e.forEach(n=>{let a=1;n.matches.forEach(({key:i,norm:r,score:o})=>{let s=i?i.weight:null;a*=Math.pow(o===0&&s?Number.EPSILON:o,(s||1)*(t?1:r))}),n.score=a})}function rh(e,t){let n=e.matches;t.matches=[],ke(n)&&n.forEach(a=>{if(!ke(a.indices)||!a.indices.length)return;let{indices:i,value:r}=a,o={indices:i,value:r};a.key&&(o.key=a.key.src),a.idx>-1&&(o.refIndex=a.idx),t.matches.push(o)})}function oh(e,t){t.score=e.score}function sh(e,t,{includeMatches:n=ne.includeMatches,includeScore:a=ne.includeScore}={}){let i=[];return n&&i.push(rh),a&&i.push(oh),e.map(r=>{let{idx:o}=r,s={item:t[o],refIndex:o};return i.length&&i.forEach(p=>{p(r,s)}),s})}var qe=class{constructor(t,n={},a){this.options={...ne,...n},this.options.useExtendedSearch,this._keyStore=new Aa(this.options.keys),this.setCollection(t,a)}setCollection(t,n){if(this._docs=t,n&&!(n instanceof Ht))throw new Error(Pm);this._myIndex=n||Ks(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(t){!ke(t)||(this._docs.push(t),this._myIndex.add(t))}remove(t=()=>!1){let n=[];for(let a=0,i=this._docs.length;a-1&&(p=p.slice(0,n)),sh(p,this._docs,{includeMatches:a,includeScore:i})}_searchStringList(t){let n=Wa(t,this.options),{records:a}=this._myIndex,i=[];return a.forEach(({v:r,i:o,n:s})=>{if(!ke(r))return;let{isMatch:p,score:l,indices:c}=n.searchIn(r);p&&i.push({item:r,idx:o,matches:[{score:l,value:r,norm:s,indices:c}]})}),i}_searchLogical(t){let n=Ys(t,this.options),a=(s,p,l)=>{if(!s.children){let{keyId:u,searcher:h}=s,f=this._findMatches({key:this._keyStore.get(u),value:this._myIndex.getValueForItemAtKeyId(p,u),searcher:h});return f&&f.length?[{idx:l,item:p,matches:f}]:[]}let c=[];for(let u=0,h=s.children.length;u{if(ke(s)){let l=a(n,s,p);l.length&&(r[p]||(r[p]={idx:p,item:s,matches:[]},o.push(r[p])),l.forEach(({matches:c})=>{r[p].matches.push(...c)}))}}),o}_searchObjectList(t){let n=Wa(t,this.options),{keys:a,records:i}=this._myIndex,r=[];return i.forEach(({$:o,i:s})=>{if(!ke(o))return;let p=[];a.forEach((l,c)=>{p.push(...this._findMatches({key:l,value:o[c],searcher:n}))}),p.length&&r.push({idx:s,item:o,matches:p})}),r}_findMatches({key:t,value:n,searcher:a}){if(!ke(n))return[];let i=[];if(He(n))n.forEach(({v:r,i:o,n:s})=>{if(!ke(r))return;let{isMatch:p,score:l,indices:c}=a.searchIn(r);p&&i.push({score:l,key:t,value:r,idx:o,norm:s,indices:c})});else{let{v:r,n:o}=n,{isMatch:s,score:p,indices:l}=a.searchIn(r);s&&i.push({score:p,key:t,value:r,norm:o,indices:l})}return i}};qe.version="6.6.2";qe.createIndex=Ks;qe.parseIndex=Gm;qe.config=ne;qe.parseQuery=Ys;th(Na);var En=be(Js(),1),_c=be(Wt(),1),Fe=require("obsidian"),Le=be(Bt(),1);function qt(e,t){let n=In(e),a=In(t),i=n.pop(),r=a.pop(),o=Ha(n,a);return o!==0?o:i&&r?Ha(i.split("."),r.split(".")):i||r?i?-1:1:0}var ch=e=>typeof e=="string"&&/^[v\d]/.test(e)&&nc.test(e),Sn=(e,t,n)=>{ph(n);let a=qt(e,t);return ac[n].includes(a)},qa=(e,t)=>{let n=t.match(/^([<>=~^]+)/),a=n?n[1]:"=";if(a!=="^"&&a!=="~")return Sn(e,t,a);let[i,r,o]=In(e),[s,p,l]=In(t);return Ln(i,s)!==0?!1:a==="^"?Ha([r,o],[p,l])>=0:Ln(r,p)!==0?!1:Ln(o,l)>=0};qt.validate=ch;qt.compare=Sn;qt.sastisfies=qa;var nc=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,In=e=>{if(typeof e!="string")throw new TypeError("Invalid argument expected string");let t=e.match(nc);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},Qs=e=>e==="*"||e==="x"||e==="X",ec=e=>{let t=parseInt(e,10);return isNaN(t)?e:t},lh=(e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t],Ln=(e,t)=>{if(Qs(e)||Qs(t))return 0;let[n,a]=lh(ec(e),ec(t));return n>a?1:n{for(let n=0;n":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1]},tc=Object.keys(ac),ph=e=>{if(typeof e!="string")throw new TypeError(`Invalid operator type, expected string but got ${typeof e}`);if(tc.indexOf(e)===-1)throw new Error(`Invalid operator, expected one of ${tc.join("|")}`)};var $a=be(Wt(),1);var Fn=require("obsidian");var ic="isc",rc=(e,t)=>typeof e=="string"&&e.trim().length>0?t.search(e.replace(/^\+|\+$/g,"").split(/[+]/g)):t.getAllIds();function oc(e,t){return $(this,null,function*(){let{id:n,name:a}=e.item,{matches:i}=e,r=yield this.packManager.getSVGIcon(n);if(!r)throw new TypeError("Failed to get icon for key: "+n);let o=t;if(i){let s=i.length===1?i[0].key==="name"?i[0].indices:[]:vn(i.flatMap(p=>p.key==="name"?p.indices:[]));uh(o,a.replace(/[_-]/g," "),s)}else o.setText(a.replace(/[_-]/g," "));t.createSpan({cls:"suggestion-flair"},s=>s.appendChild(r))})}var An=class extends Fn.SuggestModal{constructor(n){super(n.app);this.plugin=n;this.renderSuggestion=oc;this.resolve=null;this.modalEl.addClass(ic)}get packManager(){return this.plugin.packManager}getSuggestions(n){return rc(n,this.packManager)}open(){return super.open(),new Promise(n=>{this.resolve=n})}onClose(){this.resolve&&(this.resolve(null),this.resolve=null)}onChooseSuggestion(n){}selectSuggestion(n,a){this.resolve&&(n!=null&&n.item?this.resolve(n.item):this.resolve(null),this.resolve=null),super.selectSuggestion(n,a)}},Mn=class extends Fn.EditorSuggest{constructor(n){super(n.app);this.plugin=n;this.renderSuggestion=oc;this.suggestEl.addClass(ic)}get packManager(){return this.plugin.packManager}onTrigger(n,a){if(!this.plugin.settings.suggester)return null;let i=a.getLine(n.line).substring(0,n.ch),r=this.plugin.settings.triggerWithTrailingSpace?" ":"",o=String.raw`(?:${r}:|::)([^:\s]+$)`,s=i.match(new RegExp(o,"i"));if(!s)return null;let p=s.input.substring(0,s.index).match(/:([^\s:]+$)/);return p&&this.packManager.hasIcon(p[1])?null:{end:n,start:{ch:s.index,line:n.line},query:s[1]}}getSuggestions(n){return rc(n.query,this.packManager)}selectSuggestion(n){if(!this.context)return;let{id:a,pack:i}=n.item;this.context.editor.replaceRange(this.plugin.settings.code2emoji&&i==="emoji"?this.packManager.getIcon(a,!0):`:${a}:`+(this.plugin.settings.spaceAfterSC?" ":""),this.context.start,this.context.end)}},uh=(e,t,n,a)=>{if(n){a===void 0&&(a=0);let i=0;for(let r=0;r=t.length)break;s<0&&(s=0),s!==i&&e.appendText(t.substring(i,s)),e.createSpan({cls:"suggestion-highlight",text:t.substring(s,p)}),i=p}}i({hasIcon:e.hasIcon.bind(e),getIcon:e.getIcon.bind(e),getIconData:e.getIconData.bind(e),getSVGIcon:e.getSVGIcon.bind(e),getIconFromUser:()=>new An(t).open(),isEmoji:$a.default.hasEmoji.bind($a.default),postProcessor:t.postProcessor.bind(t),version:{get current(){return t.manifest.version},compare:(n,a)=>Sn(t.manifest.version,a,n),satisfies:n=>qa(t.manifest.version,n)}});var hc=be(dc(),1),gc=be(ya(),1),Ja=require("obsidian");var Ya=["activity","airplay","alarm-check","alarm-clock-off","alarm-clock","alarm-minus","alarm-plus","album","alert-circle","alert-octagon","alert-triangle","align-center","align-justify","align-left","align-right","anchor","aperture","archive","arrow-big-down","arrow-big-left","arrow-big-right","arrow-big-up","arrow-down-circle","arrow-down-left","arrow-down-right","arrow-down","arrow-left-circle","arrow-left-right","arrow-left","arrow-right-circle","arrow-right","arrow-up-circle","arrow-up-left","arrow-up-right","arrow-up","asterisk","at-sign","award","axe","banknote","bar-chart-2","bar-chart","battery-charging","battery-full","battery-low","battery-medium","battery","beaker","bell-minus","bell-off","bell-plus","bell-ring","bell","bike","binary","bitcoin","bluetooth-connected","bluetooth-off","bluetooth-searching","bluetooth","bold","book-open","book","bookmark-minus","bookmark-plus","bookmark","bot","box-select","box","briefcase","brush","bug","building","bus","calculator","calendar","camera-off","camera","car","carrot","cast","check-circle-2","check-circle","check-square","check","chevron-down","chevron-first","chevron-last","chevron-left","chevron-right","chevron-up","chevrons-down-up","chevrons-down","chevrons-left","chevrons-right","chevrons-up-down","chevrons-up","chrome","circle-slashed","circle","clipboard-check","clipboard-copy","clipboard-list","clipboard-x","clipboard","clock-1","clock-10","clock-11","clock-12","clock-2","clock-3","clock-4","clock-5","clock-6","clock-7","clock-8","clock-9","clock","cloud-drizzle","cloud-fog","cloud-hail","cloud-lightning","cloud-moon","cloud-off","cloud-rain-wind","cloud-rain","cloud-snow","cloud-sun","cloud","cloudy","clover","code-2","code","codepen","codesandbox","coffee","coins","columns","command","compass","contact","contrast","cookie","copy","copyleft","copyright","corner-down-left","corner-down-right","corner-left-down","corner-left-up","corner-right-down","corner-right-up","corner-up-left","corner-up-right","cpu","credit-card","crop","cross","crosshair","crown","currency","database","delete","disc","divide-circle","divide-square","divide","dollar-sign","download-cloud","download","dribbble","droplet","droplets","drumstick","edit-2","edit-3","edit","egg","equal-not","equal","euro","expand","external-link","eye-off","eye","facebook","fast-forward","feather","figma","file-check-2","file-check","file-code","file-digit","file-input","file-minus-2","file-minus","file-output","file-plus-2","file-plus","file-search","file-text","file-x-2","file-x","file","files","film","filter","flag-triangle-left","flag-triangle-right","flag","flame","flashlight-off","flashlight","flask-conical","flask-round","folder-minus","folder-open","folder-plus","folder","form-input","forward","framer","frown","function-square","gamepad-2","gamepad","gauge","gavel","gem","ghost","gift","git-branch-plus","git-branch","git-commit","git-merge","git-pull-request","github","gitlab","glasses","globe-2","globe","grab","graduation-cap","grid","grip-horizontal","grip-vertical","hammer","hand-metal","hand","hard-drive","hard-hat","hash","haze","headphones","heart","help-circle","hexagon","highlighter","history","home","image-minus","image-off","image-plus","image","import","inbox","indent","indian-rupee","infinity","info","inspect","instagram","italic","japanese-yen","key","landmark","languages","laptop-2","laptop","lasso-select","lasso","layers","layout-dashboard","layout-grid","layout-list","layout-template","layout","library","life-buoy","lightbulb-off","lightbulb","link-2-off","link-2","link","linkedin","list-checks","list-minus","list-ordered","list-plus","list-x","list","list.txt","loader-2","loader","locate-fixed","locate","lock","log-in","log-out","mail","map-pin","map","maximize-2","maximize","megaphone","meh","menu","message-circle","message-square","mic-off","mic","minimize-2","minimize","minus-circle","minus-square","minus","monitor-off","monitor-speaker","monitor","moon","more-horizontal","more-vertical","mountain-snow","mountain","mouse-pointer-2","mouse-pointer-click","mouse-pointer","move-diagonal-2","move-diagonal","move-horizontal","move-vertical","move","music","navigation-2","navigation","network","octagon","option","outdent","package-check","package-minus","package-plus","package-search","package-x","package","palette","paperclip","pause-circle","pause-octagon","pause","pen-tool","pencil","percent","person-standing","phone-call","phone-forwarded","phone-incoming","phone-missed","phone-off","phone-outgoing","phone","pie-chart","piggy-bank","pin","pipette","plane","play-circle","play","plug-zap","plus-circle","plus-square","plus","pocket","podcast","pointer","pound-sterling","power-off","power","printer","qr-code","quote","radio-receiver","radio","redo","refresh-ccw","refresh-cw","regex","repeat-1","repeat","reply-all","reply","rewind","rocking-chair","rotate-ccw","rotate-cw","rss","ruler","russian-ruble","save","scale","scan-line","scan","scissors","screen-share-off","screen-share","search","send","separator-horizontal","separator-vertical","server-crash","server-off","server","settings-2","settings","share-2","share","sheet","shield-alert","shield-check","shield-close","shield-off","shield","shirt","shopping-bag","shopping-cart","shovel","shrink","shuffle","sidebar-close","sidebar-open","sidebar","sigma","signal-high","signal-low","signal-medium","signal-zero","signal","skip-back","skip-forward","skull","slack","slash","sliders","smartphone-charging","smartphone","smile","snowflake","sort-asc","sort-desc","speaker","sprout","square","star-half","star","stop-circle","strikethrough","subscript","sun","sunrise","sunset","superscript","swiss-franc","switch-camera","table","tablet","tag","target","tent","terminal-square","terminal","text-cursor-input","text-cursor","thermometer-snowflake","thermometer-sun","thermometer","thumbs-down","thumbs-up","ticket","timer-off","timer-reset","timer","toggle-left","toggle-right","tornado","trash-2","trash","trello","trending-down","trending-up","triangle","truck","tv-2","tv","twitch","twitter","type","umbrella","underline","undo","unlink-2","unlink","unlock","upload-cloud","upload","user-check","user-minus","user-plus","user-x","user","users","verified","vibrate","video-off","video","view","voicemail","volume-1","volume-2","volume-x","volume","wallet","wand","watch","webcam","wifi-off","wifi","wind","wrap-text","wrench","x-circle","x-octagon","x-square","x","youtube","zap-off","zap","zoom-in","zoom-out",""];var Xa=["logo-crystal","create-new","trash","search","right-triangle","document","folder","pencil","left-arrow","right-arrow","three-horizontal-bars","dot-network","audio-file","image-file","pdf-file","gear","documents","blocks","go-to-file","presentation","cross-in-box","microphone","microphone-filled","link","popup-open","checkmark","hashtag","left-arrow-with-tail","right-arrow-with-tail","up-arrow-with-tail","down-arrow-with-tail","lines-of-text","vertical-three-dots","pin","magnifying-glass","info","horizontal-split","vertical-split","calendar-with-checkmark","sheets-in-box","up-and-down-arrows","broken-link","cross","any-key","reset","star","crossed-star","dice","filled-pin","enter","help","vault","open-vault","paper-plane","bullet-list","uppercase-lowercase-a","star-list","expand-vertically","languages","switch","pane-layout","install","sync","check-in-circle","sync-small","check-small","paused","forward-arrow","stacked-levels","bracket-glyph","note-glyph","tag-glyph","price-tag-glyph","heading-glyph","bold-glyph","italic-glyph","strikethrough-glyph","highlight-glyph","code-glyph","quote-glyph","link-glyph","bullet-list-glyph","number-list-glyph","checkbox-glyph","undo-glyph","redo-glyph","up-chevron-glyph","down-chevron-glyph","left-chevron-glyph","right-chevron-glyph","percent-sign-glyph","keyboard-glyph","double-up-arrow-glyph","double-down-arrow-glyph","image-glyph","wrench-screwdriver-glyph","clock","plus-with-circle","minus-with-circle","indent-glyph","unindent-glyph","fullscreen","exit-fullscreen","cloud","run-command","compress-glyph","enlarge-glyph","scissors-glyph","up-curly-arrow-glyph","down-curly-arrow-glyph","plus-minus-glyph","links-going-out","links-coming-in","add-note-glyph","duplicate-glyph","clock-glyph","calendar-glyph","command-glyph","dice-glyph","file-explorer-glyph","graph-glyph","import-glyph","navigate-glyph","open-elsewhere-glyph","bullet-list-glyph","presentation-glyph","paper-plane-glyph","question-mark-glyph","restore-file-glyph","search-glyph","star-glyph","play-audio-glyph","stop-audio-glyph","tomorrow-glyph","wand-glyph","workspace-glyph","yesterday-glyph","box-glyph","merge-files-glyph","merge-files","two-blank-pages","scissors","paste","paste-text","split","select-all-text","wand","github-glyph","reading-glasses"];var vh=e=>e.replace(/-/g,"_"),Qa="luc",bh="obs",fc=e=>["class","height","width"].forEach(t=>{var n;return(n=e.firstElementChild)==null?void 0:n.removeAttribute(t)}),ei=class{constructor(t,n){this.pack=t;this.obsidianId=n;this.type="bulti-in";this.name=vh(n),this.id=`${t}_${this.name}`}get data(){var n;let t=createDiv();return(0,Ja.setIcon)(t,(this.pack===Qa?"lucide-":"")+this.obsidianId),fc(t),(n=t.firstElementChild)==null||n.setAttribute("xmlns","http://www.w3.org/2000/svg"),t.innerHTML}get dataUri(){return(0,hc.default)(this.data)}getDOM(t=!0){let n=createSpan({cls:xt(this)});return t?(n.addClass("isc-svg-icon"),(0,Ja.setIcon)(n,(this.pack===Qa?"lucide-":"")+this.obsidianId),fc(n)):(n.addClass("isc-img-icon"),n.createEl("img",{attr:{src:this.dataUri}})),n}},mc="emoji",yh=()=>{let e=new Map,t=[],n=[];for(let[a,i]of[[bh,Xa],[Qa,Ya]]){n.push(a);for(let r of i){let o=new ei(a,r);e.set(o.id,o),t.push(o)}}n.push(mc);for(let a of Object.keys(gc.default))t.push({pack:mc,id:a,name:a});return{packs:e,ids:t,packnames:n}},ti=yh(),ni=ti.packs,ai=ti.ids,vt=ti.packnames;var ii=be(Wt(),1);var it=class{constructor(t){this.name=t}get id(){return this.name}get pack(){return"emoji"}get type(){return"emoji"}get char(){return ii.default.get(this.name)}static getData(t){return ii.default.hasEmoji(t)?new it(t):null}getDOM(t=!0){return createSpan({cls:[xt(this),"isc-char-icon"],text:this.char})}};var xc=require("obsidian"),vc=be(Bt(),1);var Xe=class{constructor(t,n,a,i,r){this._id=t;this._name=n;this._pack=a;this.plugin=r;this.path=i.trim()}static getData(t,n,a){let i=Ca(t);return!i||i.pack==="emoji"?null:new Xe(t,i.name,i.pack,n,a)}get type(){return"file"}get vault(){return this.plugin.app.vault}get id(){return this._id}get pack(){return this._pack}get name(){return this._name}get ext(){return(0,vc.extname)(this.path)}get fsPath(){return this.vault.adapter instanceof xc.FileSystemAdapter?this.vault.adapter.getFullPath(this.path):null}get resourcePath(){return this.vault.adapter.getResourcePath(this.path)}get isSVG(){return this.ext===".svg"}getDOM(t=!0){let n=createSpan({cls:xt(this)});return t&&this.isSVG?(n.addClass("isc-svg-icon"),(()=>$(this,null,function*(){let a=yield this.plugin.fileIconCache.getIcon(this.path);return a?(this.fixFillColor(a),n.append(a)):console.error("failed to get icon data for",this.path),n}))()):(n.addClass("isc-img-icon"),n.createEl("img",{attr:{src:this.resourcePath}}),n)}fixFillColor(t){if(!!_h.includes(this.pack))for(let n of t.getElementsByTagName("path"))n.hasAttribute("fill")||n.setAttribute("fill","currentColor")}},_h=["fab","far","fas","rif","ril"];var bc=e=>!!e.ext;var kh="/icons.json",wh="icons",$t=class extends Fe.Events{constructor(n){super();this.plugin=n;this._customIcons=new Map;this._cutomsIconPacknames=new Set;this._loaded=!1;this._fuse=new qe(ai,{keys:["name","pack"],includeScore:!0,findAllMatches:!0,threshold:.5,shouldSort:!0,includeMatches:!0,useExtendedSearch:!0})}get vault(){return this.plugin.app.vault}renameIconFile(n,a,i){return $(this,null,function*(){let r=(0,Le.join)(this.customIconsDir,i+a),o=(0,Le.join)(this.customIconsDir,n+a);return yield this.vault.adapter.rename(o,r),r})}removeIconFile(n,a){let i=(0,Le.join)(this.customIconsDir,n+a);return this.vault.adapter.remove(i)}addIcon(n,a,i){return $(this,null,function*(){let r=(0,Le.join)(this.customIconsDir,n+a);return yield this.vault.adapter.writeBinary(r,i),r})}get customPacknames(){return[...this._cutomsIconPacknames]}get customIconsFilePath(){return(0,Fe.normalizePath)(this.plugin.manifest.dir+kh)}get customIconsDir(){return(0,Le.join)(this.vault.configDir,wh)}isPacknameExists(n){return vt.includes(n)||this._cutomsIconPacknames.has(n)}get enabledPacknames(){return[...vt,...this._cutomsIconPacknames].filter(n=>this.isPackEnabled(n))}hasIcon(n){return this._isBuiltIn(n)||this._customIcons.has(n)}_isBuiltIn(n){return _c.default.hasEmoji(n)||ni.has(n)}getIcon(n,a=!1){n=je(n);let i=this.getIconData(n);if(!i)return null;let r=()=>i.getDOM(!1);switch(i.type){case"emoji":return a?i.char:r();case"bulti-in":return a?i.dataUri:r();case"file":return a?i.resourcePath:r();default:(0,yc.default)(i)}}getSVGIcon(n,a=!1){return $(this,null,function*(){n=je(n);let i=this.getIconData(n);if(!i)return null;let r=()=>i.getDOM(!0);if(i.type==="emoji")return a?i.char:r();if(i.type==="bulti-in"||i.type==="file"&&i.isSVG){let o=yield r();return a?o.innerHTML:o}else return a?i.resourcePath:r()})}getIconData(n){n=je(n);let a;return(a=it.getData(n))||(a=ni.get(n))||(a=this._customIcons.get(n))?a:null}isPackEnabled(n){return n==="emoji"?!0:!this.plugin.settings.disabledPacks.has(n)}refreshPackNames(){this._cutomsIconPacknames.clear();for(let[,{pack:n}]of this._customIcons)this._cutomsIconPacknames.add(n)}loadIcons(){return $(this,null,function*(){if(this._loaded&&(this._fuse.setCollection([]),this._customIcons.clear(),this._cutomsIconPacknames.clear(),this._loaded=!1),!(yield this.vault.adapter.exists(this.customIconsDir))){yield this.vault.adapter.mkdir(this.customIconsDir);return}let n=yield this.vault.adapter.list(this.customIconsDir),a,i=n.files.map(r=>$(this,null,function*(){if(!gn.test(r))return;let o=(0,Le.basename)(r).replace(gn,""),s=Xe.getData(o,r,this.plugin);s?(this._customIcons.set(o,s),this._fuse.add(s)):console.warn("Failed to load icon data (raw value: %o) for id %s, skipping...",r,o)}));for(let r of yield Promise.allSettled(i))r.status==="rejected"&&console.error("Failed to load icon",r.reason);this._loaded=!0,this.refreshPackNames(),this.trigger("initialized",this.plugin.api)})}backupIcons(n){return $(this,null,function*(){let a=new En.default,i=yield this.vault.adapter.list(this.customIconsDir);for(let o of i.files)(!n||(0,Le.basename)(o).startsWith(n+"_"))&&a.file((0,Le.basename)(o),this.vault.adapter.readBinary(o));let r=`${n!=null?n:"custom-icons"}.zip`;yield this.vault.createBinary(r,yield a.generateAsync({type:"arraybuffer"})),Fe.Platform.isDesktopApp?this.plugin.app.openWithDefaultApp(""):new Fe.Notice(`icons have been saved to ${r}, enable 'Detect all file extension' in 'Files & Links' to visit it`)})}importIconsFromFileList(n,a=!1){return $(this,null,function*(){let i=[];for(let r=0;r$(this,null,function*(){let{name:l}=p;a&&!l.startsWith(i+"_")&&(l=i+"_"+l);let c=this.getAvailableId(l),u=(0,Le.join)(this.customIconsDir,c);return(yield this.vault.adapter.exists(u))?Promise.reject(`icon ${c} already exists, skipping..`):(yield this.vault.adapter.writeBinary(u,yield p.async("arraybuffer")),c)})),s=(yield Promise.allSettled(o)).reduce((p,l)=>(l.status==="rejected"?console.error("Failed to import icon",l.reason):p.push(l.value),p),[]);return new Fe.Notice(s.length+" icons imported"),n.name})}addFromFiles(n,a){return $(this,null,function*(){let i=yield zs(a);if(!i){new Fe.Notice("No SVG file found in dropped items");return}if(vt.includes(n)){console.error("failed to add pack: pack name %s reserved",n);return}let r=i.reduce((s,{name:p,ext:l,data:c})=>{let u=ja(`${n}_${p}`);return u?(u=this.getAvailableId(u),this._customIcons.has(u)?(s.push(Promise.reject(`icon ${u} already exists, skipping..`)),s):(s.push((()=>$(this,null,function*(){try{let h=yield this.addIcon(u,l,c);this.set(u,new Xe(u,p,n,h,this.plugin),!1)}catch(h){throw new $e("add",u,h)}return u}))()),s)):(console.warn("failed to add icon: id %s invalid, skipping...",u),s)},[]),o=[];for(let s of yield Promise.allSettled(r))s.status==="rejected"?console.error("Failed to add icon, details: ",s.reason):o.push(s.value);this.refreshPackNames(),this.trigger("changed",this.plugin.api,o),new Fe.Notice(o.length.toString()+" icons added")})}deleteMultiple(...n){return $(this,null,function*(){this._fuse.remove(r=>bc(r)&&n.includes(r.id));let a=n.map(r=>$(this,null,function*(){let o=this._customIcons.get(r);if(!o)throw new $e("delete",r,"No icon found in _customIcons");this._customIcons.delete(r);try{yield this.removeIconFile(r,o.ext)}catch(s){throw new $e("delete",r,s)}})),i=!1;for(let r of yield Promise.allSettled(a))r.status==="rejected"?console.error("Failed to remove icon file, details: ",r.reason):i||(i=!0);i&&(this.refreshPackNames(),this.trigger("changed",this.plugin.api,n))})}filter(n){return $(this,null,function*(){let a=new Map;for(let[r,o]of this._customIcons)n(r,o)||(this._customIcons.delete(r),a.set(r,o.path));if(this._fuse.remove(r=>a.has(r.id)),a.size===0)return;this.refreshPackNames(),this.trigger("changed",this.plugin.api,[...a.keys()]);let i=[...a.values()].map(r=>$(this,null,function*(){try{yield this.vault.adapter.remove(r)}catch(o){throw new $e("delete",(0,Le.basename)(r),o)}}));for(let r of yield Promise.allSettled(i))r.status==="rejected"&&console.error("Failed to remove icon file, details: ",r.reason)})}rename(n,a){return $(this,null,function*(){if(this.hasIcon(a))return console.log("failed to rename icon: id %s already exists",a),null;let i=this._customIcons.get(n);if(!i)return console.log("failed to rename icon: id %s not found in custom icons",n),null;let r=ja(a);if(!r)return console.log("failed to rename icon: id %s invalid",n),null;try{i.path=yield this.renameIconFile(n,i.ext,a)}catch(o){throw new $e("rename",n,o,a)}return this.set(r,i,!1),this.delete(n,!1,!1),this.refreshPackNames(),this.trigger("changed",this.plugin.api,[n,a]),a})}star(n){return $(this,null,function*(){let a=n.replace(/_\d?$/,"");if(a===n)return console.log("failed to star icon: no suffix found for id %s",n),null;let i=this._customIcons.get(n);if(!i)return console.log("failed to star icon: id %s not found in custom icons",n),null;if(this._isBuiltIn(a))return console.log("failed to star icon: new id %s exists in built-in icons",a),null;try{let{ext:r}=i;if(this._customIcons.has(a)){let o=this._customIcons.get(a),{ext:s}=o;yield this.renameIconFile(a,s,a+"_temp"),i.path=yield this.renameIconFile(n,r,a),this.set(a,i,!1),o.path=yield this.renameIconFile(a+"_temp",s,n),this.set(n,o,!1)}else i.path=yield this.renameIconFile(n,r,a),this.set(a,i,!1),this.delete(n,!1,!1)}catch(r){new $e("rename",n,r,a)}return this.refreshPackNames(),this.trigger("changed",this.plugin.api,[n,a]),a})}getAvailableId(n){if(!this.hasIcon(n))return n;let a=1,i=`${n}_${a}`;for(;this.hasIcon(i);)i=`${n}_${++a}`;return`${n}_${a}`}set(n,a,i=!0){this._customIcons.get(n)!==a&&(this._customIcons.set(n,a),this._fuse.remove(r=>r.id===n),this._fuse.add(a),i&&(this.refreshPackNames(),this.trigger("changed",this.plugin.api,[n])))}delete(n,a=!0,i=!0){return $(this,null,function*(){let r=this._customIcons.get(n);if(!r)return!1;if(i)try{yield this.removeIconFile(n,r.ext)}catch(s){throw new $e("delete",n,s)}let o=this._customIcons.delete(n);return this._fuse.remove(s=>s.id===n),a&&(this.refreshPackNames(),this.trigger("changed",this.plugin.api,[n])),o})}clear(){return $(this,null,function*(){let n=(yield this.vault.adapter.list(this.customIconsDir)).files.map(a=>this.vault.adapter.remove(a));for(let a of yield Promise.allSettled(n))a.status==="rejected"&&console.error("Failed to remove icon file, details: ",a.reason);this._customIcons.clear(),this._fuse.remove(a=>!ai.includes(a)),this.refreshPackNames(),this.trigger("changed",this.plugin.api)})}search(n,a,i){let r=n.map(o=>({name:o}));return a=a!=null?a:this.enabledPacknames,r.push({$or:a.map(o=>({pack:`=${o}`}))}),this._fuse.search({$and:r},{limit:i!=null?i:20})}getAllIds(n,a){let i=(n!=null?n:this.enabledPacknames).map(r=>({pack:`=${r}`}));return this._fuse.search({$or:i},{limit:a!=null?a:20})}trigger(...n){let[a,...i]=n;super.trigger(a,...i),this.plugin.app.vault.trigger(sc+a,...i)}on(...n){return super.on(...n)}},$e=class extends Error{constructor(t,n,a,i){super(`Error while ${t} on ${n}${i?"=>"+i:""}: ${a instanceof Error?`${a.name}: ${a.message}`:a}`),console.error(`${t} on ${n}${i?"=>"+i:""}`,a),this.name="SaveIconError"}};var oi=require("obsidian"),Cc=be(Bt(),1);var kc=require("obsidian"),ri=class extends kc.Modal{constructor(n){super(n);this.buttonContainerEl=this.modalEl.createDiv("modal-button-container");this.resolve=null;this.containerEl.addClass("mod-confirmation"),this.addButton("mod-cta","OK",()=>this.resolve&&this.resolve(!0)),this.addCancelButton()}open(){return super.open(),new Promise(n=>this.resolve=n)}addButton(n,a,i){return this.buttonContainerEl.createEl("button",{cls:n,text:a}).addEventListener("click",r=>$(this,null,function*(){i&&(yield i(r)),this.close()})),this}onClose(){this.resolve&&this.resolve(!1)}addCancelButton(){return this.addButton("","Cancel",this.close.bind(this))}},wc=(e,t)=>{let n=new ri(t);return n.contentEl.setText(e),n.open()};var Ch=e=>$(void 0,null,function*(){let{vault:t}=e.app,n=yield t.readJson(e.packManager.customIconsFilePath),a=e.packManager.customIconsDir;(yield t.adapter.exists(a))||(yield t.adapter.mkdir(a)),yield Promise.allSettled(Object.entries(n).reduce((i,[r,o])=>{if(typeof r=="string"&&typeof o=="string"){let s=(0,Cc.join)(a,`${r}.svg`);i.push(t.create(s,o))}return i},[]))}),jh=e=>$(void 0,null,function*(){if((yield e.app.vault.adapter.exists(e.packManager.customIconsFilePath))&&!e.settings.isMigrated&&(yield wc("Found custom icons that have not been upgraded, update icons now?",e.app)))try{yield Ch(e),e.settings.isMigrated=!0,yield e.saveSettings(),new oi.Notice("Icon update complete, you can now find icon files in "+e.packManager.customIconsDir)}catch(n){new oi.Notice("Failed to update icons, check console for more details"),console.error(n)}}),jc=jh;var Lh=e=>(t,n)=>{for(let a of t.querySelectorAll(".callout")){let i=a.querySelector(".callout-title > .callout-icon"),r=new MutationObserver(o=>$(void 0,null,function*(){if(i.childElementCount>0)return;let s=Ih(i,"--callout-icon"),p=yield e.api.getSVGIcon(s);!p||(r.disconnect(),i.className+=" "+p.className,i.replaceChildren(...p.childNodes))}));r.observe(i,{childList:!0})}},Lc=Lh,Ih=(e,t,n)=>getComputedStyle(e,n).getPropertyValue(t).trim();var Sh=e=>{switch(e.nodeName){case"CODE":case"MJX-CONTAINER":return NodeFilter.FILTER_REJECT;case"#text":return e.nodeValue&>.test(e.nodeValue)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT;default:return NodeFilter.FILTER_SKIP}},si=e=>{let t=a=>$(void 0,null,function*(){for(let i of[...a.wholeText.matchAll(Rt(gt))].sort((r,o)=>o.index-r.index).map(r=>({text:r[0],index:r.index})))yield n(a,i)}),n=(o,s)=>$(void 0,[o,s],function*(a,{text:i,index:r}){var l,c;let p=yield e.packManager.getSVGIcon(je(i));if(!p)return a;if(typeof p=="string")a.textContent&&(a.textContent=(l=a.textContent)==null?void 0:l.replace(i,p));else{let u=a.splitText(r);(c=u.parentElement)==null||c.insertBefore(p,u),u.textContent=u.wholeText.substring(i.length)}});return a=>{let i=document.createTreeWalker(a,NodeFilter.SHOW_ALL,{acceptNode:Sh}),r=i.currentNode;for(;r;){if(r.nodeType===3){let o=r;$(void 0,null,function*(){let s=[o];o.__PENDING__&&(yield o.__PENDING__,s=[...o.parentElement.childNodes].filter(l=>l instanceof Text));let p=Promise.all(s.map(t));o.__PENDING__=p,yield p,delete o.__PENDING__})}r=i.nextNode()}}},ci=e=>(t,n)=>t.replace(Rt(gt),a=>e.packManager.hasIcon(je(a))?n(a):a);var Ic=e=>{e.registerMarkdownPostProcessor(e._nodeProcessor),e.registerMarkdownPostProcessor(Lc(e))};var zn=class extends Error{},li=class extends zn{},pi=class extends zn{},Ah=(e,t=",")=>e.join(t),Mh={accept:"*",multiple:!1,strict:!1},ui=e=>{let{accept:t,multiple:n,strict:a}={...Mh,...e},i=zh({multiple:n,accept:Array.isArray(t)?Ah(t):t});return new Promise(r=>{i.onchange=()=>{r(Fh(i.files,n,a)),i.remove()},i.click()})},Fh=(e,t,n)=>new Promise((a,i)=>{if(!e)return i(new li);let r=Eh(e,t,n);if(!r)return i(new pi);a(r)}),Eh=(e,t,n)=>!t&&n?e.length===1?e[0]:null:e.length?e:null,zh=({accept:e,multiple:t})=>{let n=document.createElement("input");return n.type="file",n.multiple=t,n.accept=e,n};var me=require("obsidian");var Ol=be(Ia(),1),Nl=be(fn(),1),Vn=require("obsidian");var Kt,X,Ec,Bh,Gt,zc,Sc,Bc,Bn={},Pc=[],Ph=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function Ge(e,t){for(var n in t)e[n]=t[n];return e}function Tc(e){var t=e.parentNode;t&&t.removeChild(e)}function Ee(e,t,n){var a,i,r,o={};for(r in t)r=="key"?a=t[r]:r=="ref"?i=t[r]:o[r]=t[r];if(arguments.length>2&&(o.children=arguments.length>3?Kt.call(arguments,2):n),typeof e=="function"&&e.defaultProps!=null)for(r in e.defaultProps)o[r]===void 0&&(o[r]=e.defaultProps[r]);return Zt(e,o,a,i,null)}function Zt(e,t,n,a,i){var r={type:e,props:t,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:i??++Ec};return i==null&&X.vnode!=null&&X.vnode(r),r}function fi(){return{current:null}}function Ne(e){return e.children}function Ie(e,t){this.props=e,this.context=t}function bt(e,t){if(t==null)return e.__?bt(e.__,e.__.__k.indexOf(e)+1):null;for(var n;t0?Zt(f.type,f.props,f.key,null,f.__v):f)!=null){if(f.__=n,f.__b=n.__b+1,(h=_[c])===null||h&&f.key==h.key&&f.type===h.type)_[c]=void 0;else for(u=0;u2&&(o.children=arguments.length>3?Kt.call(arguments,2):n),Zt(e.type,o,a||e.key,i||e.ref,null)}function Yt(e,t){var n={__c:t="__cC"+Bc++,__:e,Consumer:function(a,i){return a.children(i)},Provider:function(a){var i,r;return this.getChildContext||(i=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(o){this.props.value!==o.value&&i.some(di)},this.sub=function(o){i.push(o);var s=o.componentWillUnmount;o.componentWillUnmount=function(){i.splice(i.indexOf(o),1),s&&s.call(o)}}),a.children}};return n.Provider.__=n.Consumer.contextType=n}Kt=Pc.slice,X={__e:function(e,t,n,a){for(var i,r,o;t=t.__;)if((i=t.__c)&&!i.__)try{if((r=i.constructor)&&r.getDerivedStateFromError!=null&&(i.setState(r.getDerivedStateFromError(e)),o=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(e,a||{}),o=i.__d),o)return i.__E=i}catch(s){e=s}throw e}},Ec=0,Bh=function(e){return e!=null&&e.constructor===void 0},Ie.prototype.setState=function(e,t){var n;n=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=Ge({},this.state),typeof e=="function"&&(e=e(Ge({},n),this.props)),e&&Ge(n,e),e!=null&&this.__v&&(t&&this.__h.push(t),di(this))},Ie.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),di(this))},Ie.prototype.render=Ne,Gt=[],zc=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Pn.__r=0,Bc=0;var kt,ge,gi,qc,_t=0,Jc=[],$c=X.__b,Gc=X.__r,Zc=X.diffed,Kc=X.__c,Yc=X.unmount;function Xt(e,t){X.__h&&X.__h(ge,e,_t||t),_t=0;var n=ge.__H||(ge.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function _e(e){return _t=1,Nn(nl,e)}function Nn(e,t,n){var a=Xt(kt++,2);return a.t=e,a.__c||(a.__=[n?n(t):nl(void 0,t),function(i){var r=a.t(a.__[0],i);a.__[0]!==r&&(a.__=[r,a.__[1]],a.__c.setState({}))}],a.__c=ge),a.__}function Je(e,t){var n=Xt(kt++,3);!X.__s&&bi(n.__H,t)&&(n.__=e,n.__H=t,ge.__H.__h.push(n))}function vi(e,t){var n=Xt(kt++,4);!X.__s&&bi(n.__H,t)&&(n.__=e,n.__H=t,ge.__h.push(n))}function Qc(e){return _t=5,Ze(function(){return{current:e}},[])}function el(e,t,n){_t=6,vi(function(){return typeof e=="function"?(e(t()),function(){return e(null)}):e?(e.current=t(),function(){return e.current=null}):void 0},n==null?n:n.concat(e))}function Ze(e,t){var n=Xt(kt++,7);return bi(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function rt(e,t){return _t=8,Ze(function(){return e},t)}function wt(e){var t=ge.context[e.__c],n=Xt(kt++,9);return n.c=e,t?(n.__==null&&(n.__=!0,t.sub(ge)),t.props.value):e.__}function tl(e,t){X.useDebugValue&&X.useDebugValue(t?t(e):e)}function Dh(){for(var e;e=Jc.shift();)if(e.__P)try{e.__H.__h.forEach(On),e.__H.__h.forEach(xi),e.__H.__h=[]}catch(t){e.__H.__h=[],X.__e(t,e.__v)}}X.__b=function(e){ge=null,$c&&$c(e)},X.__r=function(e){Gc&&Gc(e),kt=0;var t=(ge=e.__c).__H;t&&(gi===ge?(t.__h=[],ge.__h=[],t.__.forEach(function(n){n.__H&&(n.__H=void 0)})):(t.__h.forEach(On),t.__h.forEach(xi),t.__h=[])),gi=ge},X.diffed=function(e){Zc&&Zc(e);var t=e.__c;t&&t.__H&&t.__H.__h.length&&(Jc.push(t)!==1&&qc===X.requestAnimationFrame||((qc=X.requestAnimationFrame)||function(n){var a,i=function(){clearTimeout(r),Xc&&cancelAnimationFrame(a),setTimeout(n)},r=setTimeout(i,100);Xc&&(a=requestAnimationFrame(i))})(Dh)),ge=null,gi=null},X.__c=function(e,t){t.some(function(n){try{n.__h.forEach(On),n.__h=n.__h.filter(function(a){return!a.__||xi(a)})}catch(a){t.some(function(i){i.__h&&(i.__h=[])}),t=[],X.__e(a,n.__v)}}),Kc&&Kc(e,t)},X.unmount=function(e){Yc&&Yc(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.forEach(function(a){try{On(a)}catch(i){t=i}}),t&&X.__e(t,n.__v))};var Xc=typeof requestAnimationFrame=="function";function On(e){var t=ge,n=e.__c;typeof n=="function"&&(e.__c=void 0,n()),ge=t}function xi(e){var t=ge;e.__c=e.__(),ge=t}function bi(e,t){return!e||e.length!==t.length||t.some(function(n,a){return n!==e[a]})}function nl(e,t){return typeof t=="function"?t(e):t}function ul(e,t){for(var n in t)e[n]=t[n];return e}function yi(e,t){for(var n in e)if(n!=="__source"&&!(n in t))return!0;for(var a in t)if(a!=="__source"&&e[a]!==t[a])return!0;return!1}function _i(e){this.props=e}function Wh(e,t){function n(i){var r=this.props.ref,o=r==i.ref;return!o&&r&&(r.call?r(null):r.current=null),t?!t(this.props,i)||!o:yi(this.props,i)}function a(i){return this.shouldComponentUpdate=n,Ee(e,i)}return a.displayName="Memo("+(e.displayName||e.name)+")",a.prototype.isReactComponent=!0,a.__f=!0,a}(_i.prototype=new Ie).isPureReactComponent=!0,_i.prototype.shouldComponentUpdate=function(e,t){return yi(this.props,e)||yi(this.state,t)};var al=X.__b;X.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),al&&al(e)};var Rh=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.forward_ref")||3911;function Uh(e){function t(n){var a=ul({},n);return delete a.ref,e(a,n.ref||null)}return t.$$typeof=Rh,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(e.displayName||e.name)+")",t}var il=function(e,t){return e==null?null:De(De(e).map(t))},Vh={map:il,forEach:il,count:function(e){return e?De(e).length:0},only:function(e){var t=De(e);if(t.length!==1)throw"Children.only";return t[0]},toArray:De},Hh=X.__e;X.__e=function(e,t,n,a){if(e.then){for(var i,r=t;r=r.__;)if((i=r.__c)&&i.__c)return t.__e==null&&(t.__e=n.__e,t.__k=n.__k),i.__c(e,t)}Hh(e,t,n,a)};var rl=X.unmount;function Dn(){this.__u=0,this.t=null,this.__b=null}function dl(e){var t=e.__.__c;return t&&t.__e&&t.__e(e)}function qh(e){var t,n,a;function i(r){if(t||(t=e()).then(function(o){n=o.default||o},function(o){a=o}),a)throw a;if(!n)throw t;return Ee(n,r)}return i.displayName="Lazy",i.__f=!0,i}function Jt(){this.u=null,this.o=null}X.unmount=function(e){var t=e.__c;t&&t.__R&&t.__R(),t&&e.__h===!0&&(e.type=null),rl&&rl(e)},(Dn.prototype=new Ie).__c=function(e,t){var n=t.__c,a=this;a.t==null&&(a.t=[]),a.t.push(n);var i=dl(a.__v),r=!1,o=function(){r||(r=!0,n.__R=null,i?i(s):s())};n.__R=o;var s=function(){if(!--a.__u){if(a.state.__e){var l=a.state.__e;a.__v.__k[0]=function u(h,f,g){return h&&(h.__v=null,h.__k=h.__k&&h.__k.map(function(x){return u(x,f,g)}),h.__c&&h.__c.__P===f&&(h.__e&&g.insertBefore(h.__e,h.__d),h.__c.__e=!0,h.__c.__P=g)),h}(l,l.__c.__P,l.__c.__O)}var c;for(a.setState({__e:a.__b=null});c=a.t.pop();)c.forceUpdate()}},p=t.__h===!0;a.__u++||p||a.setState({__e:a.__b=a.__v.__k[0]}),e.then(o,o)},Dn.prototype.componentWillUnmount=function(){this.t=[]},Dn.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),a=this.__v.__k[0].__c;this.__v.__k[0]=function r(o,s,p){return o&&(o.__c&&o.__c.__H&&(o.__c.__H.__.forEach(function(l){typeof l.__c=="function"&&l.__c()}),o.__c.__H=null),(o=ul({},o)).__c!=null&&(o.__c.__P===p&&(o.__c.__P=s),o.__c=null),o.__k=o.__k&&o.__k.map(function(l){return r(l,s,p)})),o}(this.__b,n,a.__O=a.__P)}this.__b=null}var i=t.__e&&Ee(Ne,null,e.fallback);return i&&(i.__h=null),[Ee(Ne,null,t.__e?null:e.children),i]};var ol=function(e,t,n){if(++n[1]===n[0]&&e.o.delete(t),e.props.revealOrder&&(e.props.revealOrder[0]!=="t"||!e.o.size))for(n=e.u;n;){for(;n.length>3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(a)}}),yt(Ee($h,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function Zh(e,t){var n=Ee(Gh,{__v:e,i:t});return n.containerInfo=t,n}(Jt.prototype=new Ie).__e=function(e){var t=this,n=dl(t.__v),a=t.o.get(e);return a[0]++,function(i){var r=function(){t.props.revealOrder?(a.push(i),ol(t,e,a)):i()};n?n(r):r()}},Jt.prototype.render=function(e){this.u=null,this.o=new Map;var t=De(e.children);e.revealOrder&&e.revealOrder[0]==="b"&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},Jt.prototype.componentDidUpdate=Jt.prototype.componentDidMount=function(){var e=this;this.o.forEach(function(t,n){ol(e,n,t)})};var fl=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.element")||60103,Kh=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Yh=typeof document<"u",Xh=function(e){return(typeof Symbol<"u"&&typeof Symbol()=="symbol"?/fil|che|rad/i:/fil|che|ra/i).test(e)};function Jh(e,t,n){return t.__k==null&&(t.textContent=""),yt(e,t),typeof n=="function"&&n(),e?e.__c:null}function Qh(e,t,n){return hi(e,t),typeof n=="function"&&n(),e?e.__c:null}Ie.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(e){Object.defineProperty(Ie.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})});var sl=X.event;function eg(){}function tg(){return this.cancelBubble}function ng(){return this.defaultPrevented}X.event=function(e){return sl&&(e=sl(e)),e.persist=eg,e.isPropagationStopped=tg,e.isDefaultPrevented=ng,e.nativeEvent=e};var ml,cl={configurable:!0,get:function(){return this.class}},ll=X.vnode;X.vnode=function(e){var t=e.type,n=e.props,a=n;if(typeof t=="string"){var i=t.indexOf("-")===-1;for(var r in a={},n){var o=n[r];Yh&&r==="children"&&t==="noscript"||r==="value"&&"defaultValue"in n&&o==null||(r==="defaultValue"&&"value"in n&&n.value==null?r="value":r==="download"&&o===!0?o="":/ondoubleclick/i.test(r)?r="ondblclick":/^onchange(textarea|input)/i.test(r+t)&&!Xh(n.type)?r="oninput":/^onfocus$/i.test(r)?r="onfocusin":/^onblur$/i.test(r)?r="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(r)?r=r.toLowerCase():i&&Kh.test(r)?r=r.replace(/[A-Z0-9]/,"-$&").toLowerCase():o===null&&(o=void 0),/^oninput/i.test(r)&&(r=r.toLowerCase(),a[r]&&(r="oninputCapture")),a[r]=o)}t=="select"&&a.multiple&&Array.isArray(a.value)&&(a.value=De(n.children).forEach(function(s){s.props.selected=a.value.indexOf(s.props.value)!=-1})),t=="select"&&a.defaultValue!=null&&(a.value=De(n.children).forEach(function(s){s.props.selected=a.multiple?a.defaultValue.indexOf(s.props.value)!=-1:a.defaultValue==s.props.value})),e.props=a,n.class!=n.className&&(cl.enumerable="className"in n,n.className!=null&&(a.class=n.className),Object.defineProperty(a,"className",cl))}e.$$typeof=fl,ll&&ll(e)};var pl=X.__r;X.__r=function(e){pl&&pl(e),ml=e.__c};var ag={ReactCurrentDispatcher:{current:{readContext:function(e){return ml.__n[e.__c].props.value}}}};function ig(e){return Ee.bind(null,e)}function hl(e){return!!e&&e.$$typeof===fl}function rg(e){return hl(e)?Hc.apply(null,arguments):e}function og(e){return!!e.__k&&(yt(null,e),!0)}function sg(e){return e&&(e.base||e.nodeType===1&&e)||null}var cg=function(e,t){return e(t)},lg=function(e,t){return e(t)};var H={useState:_e,useReducer:Nn,useEffect:Je,useLayoutEffect:vi,useRef:Qc,useImperativeHandle:el,useMemo:Ze,useCallback:rt,useContext:wt,useDebugValue:tl,version:"17.0.2",Children:Vh,render:Jh,hydrate:Qh,unmountComponentAtNode:og,createPortal:Zh,createElement:Ee,createContext:Yt,createFactory:ig,cloneElement:rg,createRef:fi,Fragment:Ne,isValidElement:hl,findDOMNode:sg,Component:Ie,PureComponent:_i,memo:Wh,forwardRef:Uh,flushSync:lg,unstable_batchedUpdates:cg,StrictMode:Ne,Suspense:Dn,SuspenseList:Jt,lazy:qh,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:ag};var ki={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},wi=H.createContext&&H.createContext(ki);var Qe=function(){return Qe=Object.assign||function(e){for(var t,n=1,a=arguments.length;n{let t={};return e.forEach((n,a)=>t[n]=a),t})(mg),hg=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,ot=String.fromCharCode.bind(String),kl=typeof Uint8Array.from=="function"?Uint8Array.from.bind(Uint8Array):(e,t=n=>n)=>new Uint8Array(Array.prototype.slice.call(e,0).map(t));var wl=e=>e.replace(/[^A-Za-z0-9\+\/]/g,"");var gg=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,xg=e=>{switch(e.length){case 4:var t=(7&e.charCodeAt(0))<<18|(63&e.charCodeAt(1))<<12|(63&e.charCodeAt(2))<<6|63&e.charCodeAt(3),n=t-65536;return ot((n>>>10)+55296)+ot((n&1023)+56320);case 3:return ot((15&e.charCodeAt(0))<<12|(63&e.charCodeAt(1))<<6|63&e.charCodeAt(2));default:return ot((31&e.charCodeAt(0))<<6|63&e.charCodeAt(1))}},vg=e=>e.replace(gg,xg),bg=e=>{if(e=e.replace(/\s+/g,""),!hg.test(e))throw new TypeError("malformed base64.");e+="==".slice(2-(e.length&3));let t,n="",a,i;for(let r=0;r>16&255):i===64?ot(t>>16&255,t>>8&255):ot(t>>16&255,t>>8&255,t&255);return n},Cl=dg?e=>atob(wl(e)):ji?e=>Buffer.from(e,"base64").toString("binary"):bg,yg=ji?e=>kl(Buffer.from(e,"base64")):e=>kl(Cl(e),t=>t.charCodeAt(0));var _g=ji?e=>Buffer.from(e,"base64").toString("utf8"):_l?e=>_l.decode(yg(e)):e=>vg(Cl(e)),kg=e=>wl(e.replace(/[-_]/g,t=>t=="-"?"+":"/")),jl=e=>_g(kg(e));var Li=require("obsidian"),Ii=(e,t="master",n=!1)=>`https://${n?"raw.staticdn.net":"raw.githubusercontent.com"}/aidenlx/obsidian-icon-shortcodes/${t}/${e}`,Rn=class extends Error{constructor(n){super("GitHub: "+n.message);this.response=n}},Ll=(e="master")=>$(void 0,null,function*(){var a;let t=`https://api.github.com/repos/aidenlx/obsidian-icon-shortcodes/git/trees/${e}?recursive=1&${Date.now()}`,n=(yield(0,Li.requestUrl)({url:t})).json;if(Array.isArray(n.tree)){let i=(a=n.tree.find(r=>r.path==="assets/manifest.json"))==null?void 0:a.url;if(i)return yield wg(i);throw console.error(n),new Error("No manifest.json for icon pack found")}else throw new Rn(n)}),wg=e=>$(void 0,null,function*(){let t=(yield(0,Li.requestUrl)({url:e})).json;if(t.encoding&&t.content){if(t.encoding==="base64")return JSON.parse(jl(t.content));throw console.error(t),new TypeError("Unsupported encoding")}else throw new Rn(t)});var Si={};Xi(Si,{balls:()=>Sl,bars:()=>Al,blank:()=>Il,bubbles:()=>Ml,cubes:()=>Fl,cylon:()=>El,spin:()=>zl,spinningBubbles:()=>Bl,spokes:()=>Pl});var Il=` -`;var Sl=` - - - - - - - - - - - - - -`;var Al=` - - - - - - - - - - - - - - - - -`;var Ml=` - - - - - - - - - - -`;var Fl=` - - - - - - - - - - - - - -`;var El=` - - - - - - - - - - -`;var zl=` - - - - - -`;var Bl=` - - - - - - - - - - - - - - - - - - - - - - - - - - - - -`;var Pl=` - - - - - - - - - - - - - - - - - - - - - - - - - -`;var zg=o=>{var s=o,{color:e="var(--interactive-accent)",delay:t=0,type:n="balls",height:a=64,width:i=64}=s,r=cn(s,["color","delay","type","height","width"]);let[p,l]=_e(t>0);return Je(()=>{let u=-1;return p&&(u=window.setTimeout(()=>l(!1),t)),()=>clearTimeout(u)},[]),H.createElement("div",Me({style:{fill:e,height:a,width:i},dangerouslySetInnerHTML:{__html:Si[p?"blank":n]}},r))},Ai=zg;var Qt=class extends Vn.Modal{constructor(n){super(n.app);this.plugin=n;this.modalEl.addClass("mod-browser-packs")}onOpen(){H.render(H.createElement(Pg,{getIconPack:this.getIconPack.bind(this)}),this.contentEl)}onClose(){H.unmountComponentAtNode(this.contentEl)}getIconPack(n,a){return $(this,null,function*(){let i=(r=!1)=>$(this,null,function*(){let o=Ii(n,a,r),s=(yield(0,Vn.requestUrl)({url:o})).arrayBuffer;yield this.plugin.packManager.importIcons({name:o.split("/").pop(),data:s},!1)});try{yield i()}catch(r){console.error("switch to alternative link",r),yield i(!0)}})}},Bg=(e="master")=>$(void 0,null,function*(){let t=yield Ll(e),n=[];for(let a of t){let i=n.last();(i==null?void 0:i.series)===a.series?(i.styles.push(a),i.count+=a.count):n.push({homepage:a.homepage,description:a.description,series:a.series,license:a.license,styles:[a],count:a.count})}return n}),Pg=({getIconPack:e})=>{var a;let[t,n]=_e(null);return Je(()=>{Bg().then(n).catch(n)},[]),t===null?H.createElement("div",{className:"loading"},H.createElement(Ai,{type:"spin",className:"loading-indicator"}),H.createElement("div",null,"Loading Icon Pack List...")):Array.isArray(t)?H.createElement("div",{className:"icon-pack-list"},t.map(i=>H.createElement(Tg,{key:i.homepage,manifest:i,onDownload:r=>e(r)}))):(console.error(t),H.createElement("div",{className:"error"},"Failed to Load Icon Pack List:",H.createElement("div",{className:"mod-warning"},(a=t.message)!=null?a:t.toString())))},Tl="pack-manifest",Tg=({manifest:{series:e,styles:t,description:n,count:a,homepage:i,license:r},onDownload:o})=>{let s=rt(p=>`${Tl}-${p}`,[]);return H.createElement("div",{className:Tl},H.createElement("div",{className:s("title")},e),H.createElement("div",{className:s("details")},H.createElement("span",{className:s("license"),"aria-label":"License: "+r},H.createElement(xl,{size:"0.9em"})),H.createElement("span",{className:s("count"),"aria-label":`${a} icons in total`},H.createElement(Ci,{size:"0.9em"}),H.createElement("span",{className:"icon-text"},a))),H.createElement("div",{className:s("desc")},H.createElement("div",{className:s("homepage"),"aria-label":i,onClick:()=>window.open(i)},H.createElement(yl,null),H.createElement("a",{className:"icon-text"},"Home Page")),n),H.createElement("div",{className:"styles-list"},t.map(p=>H.createElement(Og,{key:p.bundleName,styleInfo:p,onDownload:o}))))},Dl="style-info",Un=(...e)=>(0,Nl.default)(Dl,...e),Og=({styleInfo:{count:e,packId:t,path:n,style:a},onDownload:i})=>{var p;let r=rt(l=>`${Dl}-${l}`,[]),[o,s]=_e({state:"display"});switch(o.state){case"display":return H.createElement("div",{className:Un()},H.createElement("div",{className:r("title")},a||"regular",H.createElement("span",{className:r("pack-id"),"aria-label":"Pack id used as shortcode prefix"},t)),H.createElement("div",{className:r("details")},H.createElement("div",{className:r("count"),"aria-label":`${e} icons in total`},H.createElement(Ci,{size:"0.9em"}),H.createElement("span",{className:"icon-text"},e))),H.createElement("div",{className:r("button-container")},H.createElement("button",{className:r("download"),onClick:()=>$(void 0,null,function*(){s({state:"downloading"});try{yield i(n),s({state:"done"}),console.log("done")}catch(l){console.error(l),s({state:"error",error:l})}}),"aria-label":"Download"},H.createElement(vl,null)),H.createElement("button",{"aria-label":"Download via Browser",onClick:()=>window.open(Ii(n))},H.createElement(bl,null))));case"downloading":return H.createElement("div",{className:Un("downloading")},H.createElement(Ai,{type:"bubbles",className:"loading-indicator"}),H.createElement("div",null,"Downloading..."));case"done":return H.createElement("div",{className:Un("done")},"Downloaded");case"error":return console.error(o.error),H.createElement("div",{className:Un("error")},"Failed to Download:",H.createElement("div",{className:"mod-warning"},o.error instanceof Error?o.error.message:(p=o.error)==null?void 0:p.toString()));default:(0,Ol.default)(o)}};function Se(e){for(var t=arguments.length,n=Array(t>1?t-1:0),a=1;a3?t.i-4:t.i:Array.isArray(e)?1:Ni(e)?2:Di(e)?3:0}function Bi(e,t){return It(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function Ng(e,t){return It(e)===2?e.get(t):e[t]}function Gl(e,t,n){var a=It(e);a===2?e.set(t,n):a===3?(e.delete(t),e.add(n)):e[t]=n}function Dg(e,t){return e===t?e!==0||1/e==1/t:e!=e&&t!=t}function Ni(e){return Hg&&e instanceof Map}function Di(e){return qg&&e instanceof Set}function xe(e){return e.o||e.t}function Wi(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=Gg(e);delete t[se];for(var n=Vi(t),a=0;a1&&(e.set=e.add=e.clear=e.delete=Wg),Object.freeze(e),t&&Lt(e,function(n,a){return St(a,!0)},!0)),e}function Wg(){Se(2)}function Ri(e){return e==null||typeof e!="object"||Object.isFrozen(e)}function We(e){var t=Ti[e];return t||Se(18,e),t}function Rg(e,t){Ti[e]||(Ti[e]=t)}function qn(){return nn}function Mi(e,t){t&&(We("Patches"),e.u=[],e.s=[],e.v=t)}function $n(e){Pi(e),e.p.forEach(Ug),e.p=null}function Pi(e){e===nn&&(nn=e.l)}function Wl(e){return nn={p:[],l:nn,h:e,m:!0,_:0}}function Ug(e){var t=e[se];t.i===0||t.i===1?t.j():t.O=!0}function Fi(e,t){t._=t.p.length;var n=t.p[0],a=e!==void 0&&e!==n;return t.h.g||We("ES5").S(t,e,a),a?(n[se].P&&($n(t),Se(4)),Ye(e)&&(e=Gn(t,e),t.l||Zn(t,e)),t.u&&We("Patches").M(n[se].t,e,t.u,t.s)):e=Gn(t,n,[]),$n(t),t.u&&t.v(t.u,t.s),e!==Kl?e:void 0}function Gn(e,t,n){if(Ri(t))return t;var a=t[se];if(!a)return Lt(t,function(r,o){return Rl(e,a,t,r,o,n)},!0),t;if(a.A!==e)return t;if(!a.P)return Zn(e,a.t,!0),a.t;if(!a.I){a.I=!0,a.A._--;var i=a.i===4||a.i===5?a.o=Wi(a.k):a.o;Lt(a.i===3?new Set(i):i,function(r,o){return Rl(e,a,i,r,o,n)}),Zn(e,i,!1),n&&e.u&&We("Patches").R(a,n,e.u,e.s)}return a.o}function Rl(e,t,n,a,i,r){if(jt(i)){var o=Gn(e,i,r&&t&&t.i!==3&&!Bi(t.D,a)?r.concat(a):void 0);if(Gl(n,a,o),!jt(o))return;e.m=!1}if(Ye(i)&&!Ri(i)){if(!e.h.F&&e._<1)return;Gn(e,i),t&&t.A.l||Zn(e,i)}}function Zn(e,t,n){n===void 0&&(n=!1),e.h.F&&e.m&&St(t,n)}function Ei(e,t){var n=e[se];return(n?xe(n):e)[t]}function Ul(e,t){if(t in e)for(var n=Object.getPrototypeOf(e);n;){var a=Object.getOwnPropertyDescriptor(n,t);if(a)return a;n=Object.getPrototypeOf(n)}}function Ke(e){e.P||(e.P=!0,e.l&&Ke(e.l))}function zi(e){e.o||(e.o=Wi(e.t))}function tn(e,t,n){var a=Ni(t)?We("MapSet").N(t,n):Di(t)?We("MapSet").T(t,n):e.g?function(i,r){var o=Array.isArray(i),s={i:o?1:0,A:r?r.A:qn(),P:!1,I:!1,D:{},l:r,t:i,k:null,o:null,j:null,C:!1},p=s,l=Oi;o&&(p=[s],l=en);var c=Proxy.revocable(p,l),u=c.revoke,h=c.proxy;return s.k=h,s.j=u,h}(t,n):We("ES5").J(t,n);return(n?n.A:qn()).p.push(a),a}function Vg(e){return jt(e)||Se(22,e),function t(n){if(!Ye(n))return n;var a,i=n[se],r=It(n);if(i){if(!i.P&&(i.i<4||!We("ES5").K(i)))return i.t;i.I=!0,a=Vl(n,r),i.I=!1}else a=Vl(n,r);return Lt(a,function(o,s){i&&Ng(i.t,o)===s||Gl(a,o,t(s))}),r===3?new Set(a):a}(e)}function Vl(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return Wi(e)}function Zl(){function e(s,p){function l(){this.constructor=s}i(s,p),s.prototype=(l.prototype=p.prototype,new l)}function t(s){s.o||(s.D=new Map,s.o=new Map(s.t))}function n(s){s.o||(s.o=new Set,s.t.forEach(function(p){if(Ye(p)){var l=tn(s.A.h,p,s);s.p.set(p,l),s.o.add(l)}else s.o.add(p)}))}function a(s){s.O&&Se(3,JSON.stringify(xe(s)))}var i=function(s,p){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,c){l.__proto__=c}||function(l,c){for(var u in c)c.hasOwnProperty(u)&&(l[u]=c[u])})(s,p)},r=function(){function s(l,c){return this[se]={i:2,l:c,A:c?c.A:qn(),P:!1,I:!1,o:void 0,D:void 0,t:l,k:this,C:!1,O:!1},this}e(s,Map);var p=s.prototype;return Object.defineProperty(p,"size",{get:function(){return xe(this[se]).size}}),p.has=function(l){return xe(this[se]).has(l)},p.set=function(l,c){var u=this[se];return a(u),xe(u).has(l)&&xe(u).get(l)===c||(t(u),Ke(u),u.D.set(l,!0),u.o.set(l,c),u.D.set(l,!0)),this},p.delete=function(l){if(!this.has(l))return!1;var c=this[se];return a(c),t(c),Ke(c),c.t.has(l)?c.D.set(l,!1):c.D.delete(l),c.o.delete(l),!0},p.clear=function(){var l=this[se];a(l),xe(l).size&&(t(l),Ke(l),l.D=new Map,Lt(l.t,function(c){l.D.set(c,!1)}),l.o.clear())},p.forEach=function(l,c){var u=this;xe(this[se]).forEach(function(h,f){l.call(c,u.get(f),f,u)})},p.get=function(l){var c=this[se];a(c);var u=xe(c).get(l);if(c.I||!Ye(u)||u!==c.t.get(l))return u;var h=tn(c.A.h,u,c);return t(c),c.o.set(l,h),h},p.keys=function(){return xe(this[se]).keys()},p.values=function(){var l,c=this,u=this.keys();return(l={})[Hn]=function(){return c.values()},l.next=function(){var h=u.next();return h.done?h:{done:!1,value:c.get(h.value)}},l},p.entries=function(){var l,c=this,u=this.keys();return(l={})[Hn]=function(){return c.entries()},l.next=function(){var h=u.next();if(h.done)return h;var f=c.get(h.value);return{done:!1,value:[h.value,f]}},l},p[Hn]=function(){return this.entries()},s}(),o=function(){function s(l,c){return this[se]={i:3,l:c,A:c?c.A:qn(),P:!1,I:!1,o:void 0,t:l,k:this,p:new Map,O:!1,C:!1},this}e(s,Set);var p=s.prototype;return Object.defineProperty(p,"size",{get:function(){return xe(this[se]).size}}),p.has=function(l){var c=this[se];return a(c),c.o?!!c.o.has(l)||!(!c.p.has(l)||!c.o.has(c.p.get(l))):c.t.has(l)},p.add=function(l){var c=this[se];return a(c),this.has(l)||(n(c),Ke(c),c.o.add(l)),this},p.delete=function(l){if(!this.has(l))return!1;var c=this[se];return a(c),n(c),Ke(c),c.o.delete(l)||!!c.p.has(l)&&c.o.delete(c.p.get(l))},p.clear=function(){var l=this[se];a(l),xe(l).size&&(n(l),Ke(l),l.o.clear())},p.values=function(){var l=this[se];return a(l),n(l),l.o.values()},p.entries=function(){var l=this[se];return a(l),n(l),l.o.entries()},p.keys=function(){return this.values()},p[Hn]=function(){return this.values()},p.forEach=function(l,c){for(var u=this.values(),h=u.next();!h.done;)l.call(c,h.value,h.value,this),h=u.next()},s}();Rg("MapSet",{N:function(s,p){return new r(s,p)},T:function(s,p){return new o(s,p)}})}var Hl,nn,Ui=typeof Symbol<"u"&&typeof Symbol("x")=="symbol",Hg=typeof Map<"u",qg=typeof Set<"u",ql=typeof Proxy<"u"&&Proxy.revocable!==void 0&&typeof Reflect<"u",Kl=Ui?Symbol.for("immer-nothing"):((Hl={})["immer-nothing"]=!0,Hl),$l=Ui?Symbol.for("immer-draftable"):"__$immer_draftable",se=Ui?Symbol.for("immer-state"):"__$immer_state",Hn=typeof Symbol<"u"&&Symbol.iterator||"@@iterator";var $g=""+Object.prototype.constructor,Vi=typeof Reflect<"u"&&Reflect.ownKeys?Reflect.ownKeys:Object.getOwnPropertySymbols!==void 0?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:Object.getOwnPropertyNames,Gg=Object.getOwnPropertyDescriptors||function(e){var t={};return Vi(e).forEach(function(n){t[n]=Object.getOwnPropertyDescriptor(e,n)}),t},Ti={},Oi={get:function(e,t){if(t===se)return e;var n=xe(e);if(!Bi(n,t))return function(i,r,o){var s,p=Ul(r,o);return p?"value"in p?p.value:(s=p.get)===null||s===void 0?void 0:s.call(i.k):void 0}(e,n,t);var a=n[t];return e.I||!Ye(a)?a:a===Ei(e.t,t)?(zi(e),e.o[t]=tn(e.A.h,a,e)):a},has:function(e,t){return t in xe(e)},ownKeys:function(e){return Reflect.ownKeys(xe(e))},set:function(e,t,n){var a=Ul(xe(e),t);if(a?.set)return a.set.call(e.k,n),!0;if(!e.P){var i=Ei(xe(e),t),r=i?.[se];if(r&&r.t===n)return e.o[t]=n,e.D[t]=!1,!0;if(Dg(n,i)&&(n!==void 0||Bi(e.t,t)))return!0;zi(e),Ke(e)}return e.o[t]===n&&typeof n!="number"&&(n!==void 0||t in e.o)||(e.o[t]=n,e.D[t]=!0,!0)},deleteProperty:function(e,t){return Ei(e.t,t)!==void 0||t in e.t?(e.D[t]=!1,zi(e),Ke(e)):delete e.D[t],e.o&&delete e.o[t],!0},getOwnPropertyDescriptor:function(e,t){var n=xe(e),a=Reflect.getOwnPropertyDescriptor(n,t);return a&&{writable:!0,configurable:e.i!==1||t!=="length",enumerable:a.enumerable,value:n[t]}},defineProperty:function(){Se(11)},getPrototypeOf:function(e){return Object.getPrototypeOf(e.t)},setPrototypeOf:function(){Se(12)}},en={};Lt(Oi,function(e,t){en[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}}),en.deleteProperty=function(e,t){return en.set.call(this,e,t,void 0)},en.set=function(e,t,n){return Oi.set.call(this,e[0],t,n,e[0])};var Zg=function(){function e(n){var a=this;this.g=ql,this.F=!0,this.produce=function(i,r,o){if(typeof i=="function"&&typeof r!="function"){var s=r;r=i;var p=a;return function(x){var b=this;x===void 0&&(x=s);for(var _=arguments.length,C=Array(_>1?_-1:0),w=1;w<_;w++)C[w-1]=arguments[w];return p.produce(x,function(z){var F;return(F=r).call.apply(F,[b,z].concat(C))})}}var l;if(typeof r!="function"&&Se(6),o!==void 0&&typeof o!="function"&&Se(7),Ye(i)){var c=Wl(a),u=tn(a,i,void 0),h=!0;try{l=r(u),h=!1}finally{h?$n(c):Pi(c)}return typeof Promise<"u"&&l instanceof Promise?l.then(function(x){return Mi(c,o),Fi(x,c)},function(x){throw $n(c),x}):(Mi(c,o),Fi(l,c))}if(!i||typeof i!="object"){if((l=r(i))===void 0&&(l=i),l===Kl&&(l=void 0),a.F&&St(l,!0),o){var f=[],g=[];We("Patches").M(i,l,f,g),o(f,g)}return l}Se(21,i)},this.produceWithPatches=function(i,r){if(typeof i=="function")return function(l){for(var c=arguments.length,u=Array(c>1?c-1:0),h=1;h=0;i--){var r=a[i];if(r.path.length===0&&r.op==="replace"){n=r.value;break}}i>-1&&(a=a.slice(i+1));var o=We("Patches").$;return jt(n)?o(n,a):this.produce(n,function(s){return o(s,a)})},e}(),we=new Zg,Kg=we.produce,H0=we.produceWithPatches.bind(we),q0=we.setAutoFreeze.bind(we),$0=we.setUseProxies.bind(we),G0=we.applyPatches.bind(we),Z0=we.createDraft.bind(we),K0=we.finishDraft.bind(we),Yl=Kg;var Yn=require("obsidian");function Xl(e){var t=_e(function(){return St(typeof e=="function"?e():e,!0)}),n=t[1];return[t[0],rt(function(a){n(typeof a=="function"?Yl(a):St(a))},[])]}var qi=be(fn(),1),At=require("obsidian");var Yg=({iconInfo:e,updated:t})=>{let{packs:n,icons:a}=wt(Kn),{trash:i,pencil:r,star:o,checkmark:s}=a,[p,l]=_e(e.name.replace(/[-_]/g," ")),[c,u]=_e(!1),h=`${e.pack}_${La(p)}`,f=h===e.id||!n.hasIcon(h),g=Ze(()=>n.getIcon(e.id,!0),[e.id,t]),x=b=>$(void 0,null,function*(){let _=yield n.rename(e.id,b);_?(new At.Notice(`The icon is renamed to ${_}`),u(!1)):new At.Notice(`Failed to rename to ${p}, check log for details`)});return H.createElement("div",{className:"item"},H.createElement("div",{className:"icon"},H.createElement("img",{className:"isc-icon",src:g!=null?g:void 0})),H.createElement("div",{className:"name"},c?H.createElement(Xg,{className:(0,qi.default)({invalid:!f}),onChange:b=>l(b.target.value),value:p}):H.createElement("span",null,p)),H.createElement("div",{className:"buttons"},H.createElement(Hi,{btnType:"cta",icon:o,onClick:()=>$(void 0,null,function*(){let b;(b=yield n.star(e.id))&&new At.Notice(`${e.id} is now ${b}`)})}),H.createElement(Hi,{btnType:"cta",icon:c?s:r,onClick:()=>$(void 0,null,function*(){c?f?h!==e.id?yield x(h):u(!1):new At.Notice(`Unable to rename to ${p}, given id invalid`):u(!0)})}),H.createElement(Hi,{btnType:"warning",icon:i,onClick:()=>$(void 0,null,function*(){(yield n.delete(e.id))&&new At.Notice(`${e.id} is removed from the pack`)})})))},Jl=Yg,Hi=e=>{let i=e,{btnType:t,icon:n}=i,a=cn(i,["btnType","icon"]);return H.createElement("button",et(Me({},a),{className:(0,qi.default)({["mod-"+t]:!!t}),dangerouslySetInnerHTML:{__html:n}}))},Xg=e=>H.createElement("textarea",Me({spellCheck:"false",rows:2},e));Zl();var Jg=()=>{let e=createDiv(),t={};for(let n of["trash","pencil","star","checkmark"])e.empty(),(0,Yn.setIcon)(e,n,14),t[n]=e.innerHTML;return t},Kn=Yt(null),$i="%ALL%",an=class extends Yn.Modal{constructor(n,a){super(n.app);this.plugin=n;this.pack=a;this.titleEl.setText(`${a} Icons`),this.modalEl.addClasses(["isc-icon-manager","mod-community-theme"])}onOpen(){return $(this,null,function*(){this.contentEl.empty(),H.render(H.createElement(Kn.Provider,{value:{packs:this.plugin.packManager,icons:Jg()}},H.createElement(e1,{pack:this.pack})),this.contentEl)})}onClose(){H.unmountComponentAtNode(this.contentEl)}},Qg=(e,t)=>e.name.localeCompare(t.name),e1=({pack:e})=>{if(e==="emoji")throw new TypeError("Emoji not supported");let{packs:t}=wt(Kn),[n,a]=_e(""),[i,r]=Xl(new Map),o=Ze(()=>{let s=t.search(n?n.trim().split(" "):[],[e],1/0).map(({item:p})=>p);return n||s.sort(Qg),s},[n,e,i]);return Je(()=>{let s=t.on("changed",(p,l)=>r(c=>{l?l.forEach(u=>c.set(u,(c.get(u)||0)+1)):c.set($i,(c.get($i)||0)+1)}));return()=>t.offref(s)},[t]),H.createElement(H.Fragment,null,H.createElement("div",{className:"filter"},H.createElement("input",{type:"text",placeholder:"Filter",value:n,onChange:s=>a(s.target.value)})),H.createElement("div",{className:"icons"},o.map(s=>{var l,c;let p=((l=i.get(s.id))!=null?l:0)+((c=i.get($i))!=null?c:0);return H.createElement(Jl,{iconInfo:s,updated:p,key:s.id+p})})))};var Ql={code2emoji:!0,suggester:!0,disabledPacks:new Set(["obs"]),triggerWithTrailingSpace:!1,spaceAfterSC:!1,isMigrated:!1},Xn=class extends me.PluginSettingTab{constructor(n,a){super(n,a);this.plugin=a}display(){let{containerEl:n}=this;this.containerEl.empty(),new me.Setting(n).setHeading().setName("Icon Suggester"),new me.Setting(n).setDesc("If this is turned on, a Suggester will appear everytime you type :(or \uFF1A\uFF1A if full-width) followed by a letter. This will help you insert Emojis. ").addToggle(i=>{i.setValue(this.plugin.settings.suggester).onChange(r=>$(this,null,function*(){this.plugin.settings.suggester=r,yield this.plugin.saveSettings()}))}),new me.Setting(n).setName("Replace emoji shortcode with emoji character").setDesc("If this is turned on, emoji shortcodes will be immediately replaced by emoji after typing. Otherwise they are still stored as a shortcode and you only see the Emoji in Preview Mode.").addToggle(i=>{i.setValue(this.plugin.settings.code2emoji).onChange(r=>$(this,null,function*(){this.plugin.settings.code2emoji=r,yield this.plugin.saveSettings()}))}),new me.Setting(n).setName("Trigger with trailing space").setDesc("only trigger suggester if there is a trailing space before the colon").addToggle(i=>{i.setValue(this.plugin.settings.triggerWithTrailingSpace).onChange(r=>$(this,null,function*(){this.plugin.settings.triggerWithTrailingSpace=r,yield this.plugin.saveSettings()}))}),new me.Setting(n).setName("Add space after inserted shortcode").addToggle(i=>{i.setValue(this.plugin.settings.spaceAfterSC).onChange(r=>$(this,null,function*(){this.plugin.settings.spaceAfterSC=r,yield this.plugin.saveSettings()}))}),this.skipIconPack(),new me.Setting(n).setName("Icon Packs").setDesc("Browse and download icon packs").addButton(i=>i.setButtonText("Browser").onClick(()=>new Qt(this.plugin).open()));let a=createDiv({cls:["isc-settings-custom-icon","installed-plugins-container"]});new me.Setting(this.containerEl).setHeading().setName("Custom Icons").addExtraButton(i=>i.setIcon("sheets-in-box").setTooltip("Backup icons").onClick(()=>this.plugin.packManager.backupIcons())).addExtraButton(i=>i.setIcon("restore-file-glyph").setTooltip("Restore backup").onClick(()=>$(this,null,function*(){this.plugin.packManager.importIconsFromFileList(yield ui({multiple:!0,accept:".zip"}),!1),yield this.plugin.packManager.loadIcons(),this.manageCustomIcons(a)}))).addExtraButton(i=>i.setIcon("switch").setTooltip("Reload custom icons").onClick(()=>$(this,null,function*(){yield this.plugin.packManager.loadIcons(),this.manageCustomIcons(a),new me.Notice("Custom icons reloaded")}))).then(i=>me.Platform.isDesktopApp&&i.addExtraButton(r=>r.setIcon("folder").setTooltip("Open Icons Folder").onClick(()=>this.app.openWithDefaultApp(this.plugin.packManager.customIconsDir)))),this.containerEl.appendChild(a),this.manageCustomIcons(a)}_setDisabledPack(n,a){return a.addToggle(i=>{i.setValue(!this.plugin.settings.disabledPacks.has(n)).onChange(r=>$(this,null,function*(){r?this.plugin.settings.disabledPacks.delete(n):this.plugin.settings.disabledPacks.add(n),yield this.plugin.saveSettings()})),i.toggleEl.setAttr("aria-label",`Enable/Disable ${n} Icon Pack`)})}skipIconPack(){let{containerEl:n}=this,a=(i,r,o)=>this._setDisabledPack(i,new me.Setting(n).setName(r).setDesc(createFragment(o)));new me.Setting(this.containerEl).setHeading().setName("Icon Packs"),a("luc","Lucide",i=>i.createEl("a",{href:"https://lucide.dev",text:"official website"})),a("obs","Obsidian's built-in icons",i=>i.appendText("Obsidian's built-in icons are mostly used for UI components. "))}manageCustomIcons(n){n.hasChildNodes()&&n.empty();let a=i=>!/^[A-Za-z0-9]+$/.test(i)||this.plugin.packManager.isPacknameExists(i);new me.Setting(n).setName("Add new icon pack").setDesc("Reserved names: "+vt.join(", ")).then(i=>{let r=null,o=null;i.addText(s=>{s.setPlaceholder("Enter name").onChange(p=>{let l=a(p);s.inputEl.toggleClass("invalid",!!p&&l),r==null||r.setDisabled(l)}).then(p=>p.inputEl.addClass("isc-add-pack-input")),o=s}).addButton(s=>(s.setCta().setIcon("plus-with-circle").onClick(()=>{let p=o==null?void 0:o.getValue();if(!!p){if(a(p)){new me.Notice("This name is invalid.");return}this.addNewCustomIconEntry(p,n).settingEl.scrollIntoView(),o==null||o.setValue("")}}),r=s))}),this.plugin.packManager.customPacknames.forEach(i=>this.addNewCustomIconEntry(i,n))}addNewCustomIconEntry(n,a){let i=new me.Setting(a).setName(n).setDesc(createFragment(r=>{r.appendText("Drag files in to import custom icons"),r.createEl("br"),r.appendText("Supported format: "),hn.forEach((o,s,p)=>{r.createEl("code",{text:o}),p.length-1!==s&&r.appendText(", ")})})).addButton(r=>r.setIcon("sheets-in-box").setTooltip("Backup icons").onClick(()=>this.plugin.packManager.backupIcons(n))).addButton(r=>r.setIcon("go-to-file").setTooltip("select files to import").onClick(()=>$(this,null,function*(){return this.plugin.packManager.addFromFiles(n,yield ui({multiple:!0,accept:hn}))}))).addButton(r=>r.setIcon("trash").setTooltip("delete").setWarning().onClick(()=>{this.plugin.packManager.filter((o,s)=>s.pack!==n),a.removeChild(i.settingEl)})).addButton(r=>r.setIcon("popup-open").setTooltip("manage icons").setCta().onClick(()=>new an(this.plugin,n).open())).then(r=>t1(r.settingEl,o=>$(this,null,function*(){if(!o.dataTransfer){new me.Notice("Failed to get dropped items");return}this.plugin.packManager.addFromFiles(n,o.dataTransfer.files)})));return this._setDisabledPack(n,i),i}},t1=(e,t)=>{let n="dragover";e.addEventListener("dragover",a=>{a.preventDefault(),a.currentTarget.addClass(n)}),e.addEventListener("drop",a=>{a.preventDefault(),a.currentTarget.removeClass(n),t(a)}),e.addEventListener("dragleave",a=>{a.preventDefault(),a.currentTarget.removeClass(n)})};var ep="IconSCAPIv0",Jn=class extends tp.Plugin{constructor(){super(...arguments);this.settings=Ql;this.packManager=new $t(this);this._nodeProcessor=si(this);this._mdProcessor=ci(this);this.shortcodePosField=Ns(this);this.api=cc(this.packManager,this);this.fileIconCache=new Vt(this)}postProcessor(n,a){if(typeof n=="string"&&a)return this._mdProcessor(n,a);if(n instanceof HTMLElement)return this._nodeProcessor(n);throw new TypeError("Invalid args given to postProcessor")}onload(){return $(this,null,function*(){console.log("loading Icon Shortcodes"),yield this.loadSettings(),yield jc(this),yield this.packManager.loadIcons(),(window[ep]=this.api)&&this.register(()=>window[ep]=void 0),this.registerEditorSuggest(new Mn(this)),Ic(this),rr(this),this.addSettingTab(new Xn(this.app,this))})}loadSettings(){return $(this,null,function*(){let n=yield this.loadData();n&&(n.iconpack&&delete n.iconpack,this.settings=et(Me(Me({},this.settings),n),{disabledPacks:n.disabledPacks?new Set(n.disabledPacks):this.settings.disabledPacks}))})}saveSettings(){return $(this,null,function*(){yield this.saveData(et(Me({},this.settings),{disabledPacks:[...this.settings.disabledPacks]}))})}}; -/*! - -JSZip v3.10.0 - A JavaScript class for generating and reading zip files - - -(c) 2009-2016 Stuart Knightley -Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown. - -JSZip uses the library pako released under the MIT license : -https://github.com/nodeca/pako/blob/main/LICENSE -*/ -/*! - Copyright (c) 2018 Jed Watson. - Licensed under the MIT License (MIT), see - http://jedwatson.github.io/classnames -*/ -/*! - * mime-db - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015-2022 Douglas Christopher Wilson - * MIT Licensed - */ -/*! - * mime-types - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21pbWUtZGJAMS41Mi4wL25vZGVfbW9kdWxlcy9taW1lLWRiL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9wYXRoLWJyb3dzZXJpZnlAMS4wLjEvbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbWltZS10eXBlc0AyLjEuMzUvbm9kZV9tb2R1bGVzL21pbWUtdHlwZXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZyZWVHbG9iYWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1N5bWJvbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbG9kYXNoQDQuMTcuMjEvbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weUFycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRSYXdUYWcuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvX29iamVjdFRvU3RyaW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0VGFnLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL2lzRnVuY3Rpb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcmVKc0RhdGEuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzTWFza2VkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL190b1NvdXJjZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbG9kYXNoQDQuMTcuMjEvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmF0aXZlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRWYWx1ZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbG9kYXNoQDQuMTcuMjEvbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TmF0aXZlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19EYXRhVmlldy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbG9kYXNoQDQuMTcuMjEvbm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19Qcm9taXNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19TZXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1dlYWtNYXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFRhZy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbG9kYXNoQDQuMTcuMjEvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0xlbmd0aC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbG9kYXNoQDQuMTcuMjEvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbG9kYXNoQDQuMTcuMjEvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbG9kYXNoQDQuMTcuMjEvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N0cmluZy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbG9kYXNoQDQuMTcuMjEvbm9kZV9tb2R1bGVzL2xvZGFzaC9faXRlcmF0b3JUb0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBUb0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVRvQXJyYXkuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc1VuaWNvZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3VuaWNvZGVUb0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdUb0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheU1hcC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbG9kYXNoQDQuMTcuMjEvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVZhbHVlcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbG9kYXNoQDQuMTcuMjEvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRpbWVzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNBcmd1bWVudHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvc3R1YkZhbHNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQnVmZmVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNUeXBlZEFycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5hcnkuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25vZGVVdGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL2lzVHlwZWRBcnJheS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbG9kYXNoQDQuMTcuMjEvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlMaWtlS2V5cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbG9kYXNoQDQuMTcuMjEvbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNQcm90b3R5cGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvX292ZXJBcmcuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL2tleXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaEA0LjE3LjIxL25vZGVfbW9kdWxlcy9sb2Rhc2gvdmFsdWVzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2hANC4xNy4yMS9ub2RlX21vZHVsZXMvbG9kYXNoL3RvQXJyYXkuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2dpdGh1Yi5jb20rcmh5c2Qrbm9kZS1lbW9qaUA0MTQwOGNiNTg1NzU5MGI2ZTk0MmQ0MDE1ODE0ZjI2YWQyN2JlOTY0L25vZGVfbW9kdWxlcy9ub2RlLWVtb2ppL2xpYi9lbW9qaS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vZ2l0aHViLmNvbStyaHlzZCtub2RlLWVtb2ppQDQxNDA4Y2I1ODU3NTkwYjZlOTQyZDQwMTU4MTRmMjZhZDI3YmU5NjQvbm9kZV9tb2R1bGVzL25vZGUtZW1vamkvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NsYXNzbmFtZXNAMi4zLjEvbm9kZV9tb2R1bGVzL2NsYXNzbmFtZXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Fzc2VydC1uZXZlckAxLjIuMS9ub2RlX21vZHVsZXMvYXNzZXJ0LW5ldmVyL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qc3ppcEAzLjEwLjAvbm9kZV9tb2R1bGVzL2pzemlwL2Rpc3QvanN6aXAubWluLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9taW5pLXN2Zy1kYXRhLXVyaUAxLjQuNC9ub2RlX21vZHVsZXMvbWluaS1zdmctZGF0YS11cmkvc2hvcnRlci1jc3MtY29sb3ItbmFtZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21pbmktc3ZnLWRhdGEtdXJpQDEuNC40L25vZGVfbW9kdWxlcy9taW5pLXN2Zy1kYXRhLXVyaS9pbmRleC5qcyIsICIuLi9zcmMvaXNjLW1haW4udHMiLCAiLi4vc3JjL2ljb24taW4tZWRpdG9yL3ZpZXctcGx1Z2luLnRzIiwgIi4uL3NyYy9pY29uLWluLWVkaXRvci9kZWNvLnRzIiwgIi4uL3NyYy9pY29uLWluLWVkaXRvci93aWRnZXQudHMiLCAiLi4vc3JjL2ljb24taW4tZWRpdG9yL2dldC1tZW51LnRzIiwgIi4uL3NyYy9pY29uLWluLWVkaXRvci9pbmRleC50cyIsICIuLi9zcmMvaWNvbi1pbi1lZGl0b3Ivc3RhdGUudHMiLCAiLi4vc3JjL2ljb24tcGFja3MvdXRpbHMudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2lzLXJlZ2V4cEAzLjEuMC9ub2RlX21vZHVsZXMvaXMtcmVnZXhwL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jbG9uZS1yZWdleHBAMy4wLjAvbm9kZV9tb2R1bGVzL2Nsb25lLXJlZ2V4cC9pbmRleC5qcyIsICIuLi9zcmMvbW9kdWxlcy91bmlvbi50cyIsICIuLi9zcmMvaWNvbi1wYWNrcy9pY29uLWNhY2hlLnRzIiwgIi4uL3NyYy9pY29uLXBhY2tzL3BhY2stbWFuYWdlci50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vZnVzZS5qc0A2LjYuMi9ub2RlX21vZHVsZXMvZnVzZS5qcy9kaXN0L2Z1c2UuZXNtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jb21wYXJlLXZlcnNpb25zQDQuMS4zL25vZGVfbW9kdWxlcy9jb21wYXJlLXZlcnNpb25zL2luZGV4Lm1qcyIsICIuLi9zcmMvdHlwaW5ncy9hcGkudHMiLCAiLi4vc3JjL21vZHVsZXMvc3VnZ2VzdGVyLnRzIiwgIi4uL3NyYy9pY29uLXBhY2tzL2J1aWx0LWlucy50cyIsICIuLi9zcmMvaWNvbi1wYWNrcy9lbW9qaS50cyIsICIuLi9zcmMvaWNvbi1wYWNrcy9maWxlLWljb24udHMiLCAiLi4vc3JjL2ljb24tcGFja3MvdHlwZXMudHMiLCAiLi4vc3JjL21vZHVsZXMvanNvbi10by1zdmcudHMiLCAiLi4vc3JjL21vZHVsZXMvZGlhbG9nLnRzIiwgIi4uL3NyYy9wb3N0LXBzL2NhbGxvdXQtaWNvbi50cyIsICIuLi9zcmMvcG9zdC1wcy90ZXh0LnRzIiwgIi4uL3NyYy9wb3N0LXBzL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9maWxlLXNlbGVjdC1kaWFsb2dAMS41LjQvbm9kZV9tb2R1bGVzL2ZpbGUtc2VsZWN0LWRpYWxvZy9zcmMvZXJyb3IudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2ZpbGUtc2VsZWN0LWRpYWxvZ0AxLjUuNC9ub2RlX21vZHVsZXMvZmlsZS1zZWxlY3QtZGlhbG9nL3NyYy91dGlsLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9maWxlLXNlbGVjdC1kaWFsb2dAMS41LjQvbm9kZV9tb2R1bGVzL2ZpbGUtc2VsZWN0LWRpYWxvZy9zcmMvZmlsZS1kaWFsb2cudHMiLCAiLi4vc3JjL3NldHRpbmdzLnRzIiwgIi4uL3NyYy9jb21wb25lbnQvYnJvd3Nlci1wYWNrcy50c3giLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ByZWFjdEAxMC44LjAvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvY29uc3RhbnRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuOC4wL25vZGVfbW9kdWxlcy9wcmVhY3Qvc3JjL3V0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ByZWFjdEAxMC44LjAvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvb3B0aW9ucy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjguMC9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jcmVhdGUtZWxlbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjguMC9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jb21wb25lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ByZWFjdEAxMC44LjAvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvY3JlYXRlLWNvbnRleHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ByZWFjdEAxMC44LjAvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9jaGlsZHJlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjguMC9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9kaWZmL3Byb3BzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuOC4wL25vZGVfbW9kdWxlcy9wcmVhY3Qvc3JjL2RpZmYvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ByZWFjdEAxMC44LjAvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvcmVuZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuOC4wL25vZGVfbW9kdWxlcy9wcmVhY3Qvc3JjL2Nsb25lLWVsZW1lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ByZWFjdEAxMC44LjAvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9jYXRjaC1lcnJvci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjguMC9ub2RlX21vZHVsZXMvcHJlYWN0L2hvb2tzL3NyYy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjguMC9ub2RlX21vZHVsZXMvcHJlYWN0L2NvbXBhdC9zcmMvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjguMC9ub2RlX21vZHVsZXMvcHJlYWN0L2NvbXBhdC9zcmMvUHVyZUNvbXBvbmVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjguMC9ub2RlX21vZHVsZXMvcHJlYWN0L2NvbXBhdC9zcmMvbWVtby5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjguMC9ub2RlX21vZHVsZXMvcHJlYWN0L2NvbXBhdC9zcmMvZm9yd2FyZFJlZi5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjguMC9ub2RlX21vZHVsZXMvcHJlYWN0L2NvbXBhdC9zcmMvQ2hpbGRyZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ByZWFjdEAxMC44LjAvbm9kZV9tb2R1bGVzL3ByZWFjdC9jb21wYXQvc3JjL3N1c3BlbnNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuOC4wL25vZGVfbW9kdWxlcy9wcmVhY3QvY29tcGF0L3NyYy9zdXNwZW5zZS1saXN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuOC4wL25vZGVfbW9kdWxlcy9wcmVhY3QvY29tcGF0L3NyYy9wb3J0YWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuOC4wL25vZGVfbW9kdWxlcy9wcmVhY3QvY29tcGF0L3NyYy9yZW5kZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ByZWFjdEAxMC44LjAvbm9kZV9tb2R1bGVzL3ByZWFjdC9jb21wYXQvc3JjL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9yZWFjdC1pY29uc0A0LjQuMF9AcHJlYWN0K2NvbXBhdEAxNy4xLjEvbm9kZV9tb2R1bGVzL3JlYWN0LWljb25zL2xpYi9lc20vaWNvbkNvbnRleHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JlYWN0LWljb25zQDQuNC4wX0BwcmVhY3QrY29tcGF0QDE3LjEuMS9ub2RlX21vZHVsZXMvcmVhY3QtaWNvbnMvbGliL2VzbS9pY29uQmFzZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vcmVhY3QtaWNvbnNANC40LjBfQHByZWFjdCtjb21wYXRAMTcuMS4xL25vZGVfbW9kdWxlcy9yZWFjdC1pY29ucy9maS9pbmRleC5lc20uanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2pzLWJhc2U2NEAzLjcuMi9ub2RlX21vZHVsZXMvanMtYmFzZTY0L2Jhc2U2NC5tanMiLCAiLi4vc3JjL21vZHVsZXMvaWNvbi1wYWNrcy50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vcmVhY3QtbG9hZGluZ0AyLjAuM19AcHJlYWN0K2NvbXBhdEAxNy4xLjEvbm9kZV9tb2R1bGVzL3JlYWN0LWxvYWRpbmcvbGliL3N2Zy9pbmRleC5qcyIsICIuLi9zcmMvY29tcG9uZW50L2xvYWRpbmcudHN4IiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9pbW1lckA5LjAuMTUvbm9kZV9tb2R1bGVzL2ltbWVyL3NyYy91dGlscy9lcnJvcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2ltbWVyQDkuMC4xNS9ub2RlX21vZHVsZXMvaW1tZXIvc3JjL3V0aWxzL2NvbW1vbi50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vaW1tZXJAOS4wLjE1L25vZGVfbW9kdWxlcy9pbW1lci9zcmMvdXRpbHMvcGx1Z2lucy50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vaW1tZXJAOS4wLjE1L25vZGVfbW9kdWxlcy9pbW1lci9zcmMvY29yZS9zY29wZS50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vaW1tZXJAOS4wLjE1L25vZGVfbW9kdWxlcy9pbW1lci9zcmMvY29yZS9maW5hbGl6ZS50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vaW1tZXJAOS4wLjE1L25vZGVfbW9kdWxlcy9pbW1lci9zcmMvY29yZS9wcm94eS50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vaW1tZXJAOS4wLjE1L25vZGVfbW9kdWxlcy9pbW1lci9zcmMvY29yZS9pbW1lckNsYXNzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9pbW1lckA5LjAuMTUvbm9kZV9tb2R1bGVzL2ltbWVyL3NyYy9jb3JlL2N1cnJlbnQudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2ltbWVyQDkuMC4xNS9ub2RlX21vZHVsZXMvaW1tZXIvc3JjL3BsdWdpbnMvZXM1LnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9pbW1lckA5LjAuMTUvbm9kZV9tb2R1bGVzL2ltbWVyL3NyYy9wbHVnaW5zL3BhdGNoZXMudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2ltbWVyQDkuMC4xNS9ub2RlX21vZHVsZXMvaW1tZXIvc3JjL3BsdWdpbnMvbWFwc2V0LnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9pbW1lckA5LjAuMTUvbm9kZV9tb2R1bGVzL2ltbWVyL3NyYy9wbHVnaW5zL2FsbC50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vaW1tZXJAOS4wLjE1L25vZGVfbW9kdWxlcy9pbW1lci9zcmMvaW1tZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2ltbWVyQDkuMC4xNS9ub2RlX21vZHVsZXMvaW1tZXIvc3JjL3V0aWxzL2Vudi50cyIsICIuLi9zcmMvY29tcG9uZW50L2ljb24tbWFuYWdlci50c3giLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VzZS1pbW1lckAwLjYuMF9rb3Y1d3R1bGY1Zzc1Z2x2N3QydWR2c256ZS9ub2RlX21vZHVsZXMvdXNlLWltbWVyL3NyYy9pbmRleC50cyIsICIuLi9zcmMvY29tcG9uZW50L2ljb24tcHJldmlldy50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIVxuICogbWltZS1kYlxuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNS0yMDIyIERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kYi5qc29uJylcbiIsICIvLyAncGF0aCcgbW9kdWxlIGV4dHJhY3RlZCBmcm9tIE5vZGUuanMgdjguMTEuMSAob25seSB0aGUgcG9zaXggcGFydClcbi8vIHRyYW5zcGxpdGVkIHdpdGggQmFiZWxcblxuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gYXNzZXJ0UGF0aChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXRoIG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkICcgKyBKU09OLnN0cmluZ2lmeShwYXRoKSk7XG4gIH1cbn1cblxuLy8gUmVzb2x2ZXMgLiBhbmQgLi4gZWxlbWVudHMgaW4gYSBwYXRoIHdpdGggZGlyZWN0b3J5IG5hbWVzXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdQb3NpeChwYXRoLCBhbGxvd0Fib3ZlUm9vdCkge1xuICB2YXIgcmVzID0gJyc7XG4gIHZhciBsYXN0U2VnbWVudExlbmd0aCA9IDA7XG4gIHZhciBsYXN0U2xhc2ggPSAtMTtcbiAgdmFyIGRvdHMgPSAwO1xuICB2YXIgY29kZTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPD0gcGF0aC5sZW5ndGg7ICsraSkge1xuICAgIGlmIChpIDwgcGF0aC5sZW5ndGgpXG4gICAgICBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KGkpO1xuICAgIGVsc2UgaWYgKGNvZGUgPT09IDQ3IC8qLyovKVxuICAgICAgYnJlYWs7XG4gICAgZWxzZVxuICAgICAgY29kZSA9IDQ3IC8qLyovO1xuICAgIGlmIChjb2RlID09PSA0NyAvKi8qLykge1xuICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gaSAtIDEgfHwgZG90cyA9PT0gMSkge1xuICAgICAgICAvLyBOT09QXG4gICAgICB9IGVsc2UgaWYgKGxhc3RTbGFzaCAhPT0gaSAtIDEgJiYgZG90cyA9PT0gMikge1xuICAgICAgICBpZiAocmVzLmxlbmd0aCA8IDIgfHwgbGFzdFNlZ21lbnRMZW5ndGggIT09IDIgfHwgcmVzLmNoYXJDb2RlQXQocmVzLmxlbmd0aCAtIDEpICE9PSA0NiAvKi4qLyB8fCByZXMuY2hhckNvZGVBdChyZXMubGVuZ3RoIC0gMikgIT09IDQ2IC8qLiovKSB7XG4gICAgICAgICAgaWYgKHJlcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICB2YXIgbGFzdFNsYXNoSW5kZXggPSByZXMubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCAhPT0gcmVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgaWYgKGxhc3RTbGFzaEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlcyA9ICcnO1xuICAgICAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXMgPSByZXMuc2xpY2UoMCwgbGFzdFNsYXNoSW5kZXgpO1xuICAgICAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gcmVzLmxlbmd0aCAtIDEgLSByZXMubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsYXN0U2xhc2ggPSBpO1xuICAgICAgICAgICAgICBkb3RzID0gMDtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXMubGVuZ3RoID09PSAyIHx8IHJlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJlcyA9ICcnO1xuICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICAgICAgICAgICAgbGFzdFNsYXNoID0gaTtcbiAgICAgICAgICAgIGRvdHMgPSAwO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgICAgICAgIGlmIChyZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJlcyArPSAnLy4uJztcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXMgPSAnLi4nO1xuICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHJlcy5sZW5ndGggPiAwKVxuICAgICAgICAgIHJlcyArPSAnLycgKyBwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmVzID0gcGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpKTtcbiAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSBpIC0gbGFzdFNsYXNoIC0gMTtcbiAgICAgIH1cbiAgICAgIGxhc3RTbGFzaCA9IGk7XG4gICAgICBkb3RzID0gMDtcbiAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDQ2IC8qLiovICYmIGRvdHMgIT09IC0xKSB7XG4gICAgICArK2RvdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvdHMgPSAtMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gX2Zvcm1hdChzZXAsIHBhdGhPYmplY3QpIHtcbiAgdmFyIGRpciA9IHBhdGhPYmplY3QuZGlyIHx8IHBhdGhPYmplY3Qucm9vdDtcbiAgdmFyIGJhc2UgPSBwYXRoT2JqZWN0LmJhc2UgfHwgKHBhdGhPYmplY3QubmFtZSB8fCAnJykgKyAocGF0aE9iamVjdC5leHQgfHwgJycpO1xuICBpZiAoIWRpcikge1xuICAgIHJldHVybiBiYXNlO1xuICB9XG4gIGlmIChkaXIgPT09IHBhdGhPYmplY3Qucm9vdCkge1xuICAgIHJldHVybiBkaXIgKyBiYXNlO1xuICB9XG4gIHJldHVybiBkaXIgKyBzZXAgKyBiYXNlO1xufVxuXG52YXIgcG9zaXggPSB7XG4gIC8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSgpIHtcbiAgICB2YXIgcmVzb2x2ZWRQYXRoID0gJyc7XG4gICAgdmFyIHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcbiAgICB2YXIgY3dkO1xuXG4gICAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICAgIHZhciBwYXRoO1xuICAgICAgaWYgKGkgPj0gMClcbiAgICAgICAgcGF0aCA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoY3dkID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgY3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgcGF0aCA9IGN3ZDtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0UGF0aChwYXRoKTtcblxuICAgICAgLy8gU2tpcCBlbXB0eSBlbnRyaWVzXG4gICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XG4gICAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQ29kZUF0KDApID09PSA0NyAvKi8qLztcbiAgICB9XG5cbiAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gICAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVTdHJpbmdQb3NpeChyZXNvbHZlZFBhdGgsICFyZXNvbHZlZEFic29sdXRlKTtcblxuICAgIGlmIChyZXNvbHZlZEFic29sdXRlKSB7XG4gICAgICBpZiAocmVzb2x2ZWRQYXRoLmxlbmd0aCA+IDApXG4gICAgICAgIHJldHVybiAnLycgKyByZXNvbHZlZFBhdGg7XG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybiAnLyc7XG4gICAgfSBlbHNlIGlmIChyZXNvbHZlZFBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcuJztcbiAgICB9XG4gIH0sXG5cbiAgbm9ybWFsaXplOiBmdW5jdGlvbiBub3JtYWxpemUocGF0aCkge1xuICAgIGFzc2VydFBhdGgocGF0aCk7XG5cbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiAnLic7XG5cbiAgICB2YXIgaXNBYnNvbHV0ZSA9IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyovKi87XG4gICAgdmFyIHRyYWlsaW5nU2VwYXJhdG9yID0gcGF0aC5jaGFyQ29kZUF0KHBhdGgubGVuZ3RoIC0gMSkgPT09IDQ3IC8qLyovO1xuXG4gICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gICAgcGF0aCA9IG5vcm1hbGl6ZVN0cmluZ1Bvc2l4KHBhdGgsICFpc0Fic29sdXRlKTtcblxuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCAmJiAhaXNBYnNvbHV0ZSkgcGF0aCA9ICcuJztcbiAgICBpZiAocGF0aC5sZW5ndGggPiAwICYmIHRyYWlsaW5nU2VwYXJhdG9yKSBwYXRoICs9ICcvJztcblxuICAgIGlmIChpc0Fic29sdXRlKSByZXR1cm4gJy8nICsgcGF0aDtcbiAgICByZXR1cm4gcGF0aDtcbiAgfSxcblxuICBpc0Fic29sdXRlOiBmdW5jdGlvbiBpc0Fic29sdXRlKHBhdGgpIHtcbiAgICBhc3NlcnRQYXRoKHBhdGgpO1xuICAgIHJldHVybiBwYXRoLmxlbmd0aCA+IDAgJiYgcGF0aC5jaGFyQ29kZUF0KDApID09PSA0NyAvKi8qLztcbiAgfSxcblxuICBqb2luOiBmdW5jdGlvbiBqb2luKCkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuICcuJztcbiAgICB2YXIgam9pbmVkO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xuICAgICAgYXNzZXJ0UGF0aChhcmcpO1xuICAgICAgaWYgKGFyZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChqb2luZWQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICBqb2luZWQgPSBhcmc7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBqb2luZWQgKz0gJy8nICsgYXJnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoam9pbmVkID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gJy4nO1xuICAgIHJldHVybiBwb3NpeC5ub3JtYWxpemUoam9pbmVkKTtcbiAgfSxcblxuICByZWxhdGl2ZTogZnVuY3Rpb24gcmVsYXRpdmUoZnJvbSwgdG8pIHtcbiAgICBhc3NlcnRQYXRoKGZyb20pO1xuICAgIGFzc2VydFBhdGgodG8pO1xuXG4gICAgaWYgKGZyb20gPT09IHRvKSByZXR1cm4gJyc7XG5cbiAgICBmcm9tID0gcG9zaXgucmVzb2x2ZShmcm9tKTtcbiAgICB0byA9IHBvc2l4LnJlc29sdmUodG8pO1xuXG4gICAgaWYgKGZyb20gPT09IHRvKSByZXR1cm4gJyc7XG5cbiAgICAvLyBUcmltIGFueSBsZWFkaW5nIGJhY2tzbGFzaGVzXG4gICAgdmFyIGZyb21TdGFydCA9IDE7XG4gICAgZm9yICg7IGZyb21TdGFydCA8IGZyb20ubGVuZ3RoOyArK2Zyb21TdGFydCkge1xuICAgICAgaWYgKGZyb20uY2hhckNvZGVBdChmcm9tU3RhcnQpICE9PSA0NyAvKi8qLylcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmcm9tRW5kID0gZnJvbS5sZW5ndGg7XG4gICAgdmFyIGZyb21MZW4gPSBmcm9tRW5kIC0gZnJvbVN0YXJ0O1xuXG4gICAgLy8gVHJpbSBhbnkgbGVhZGluZyBiYWNrc2xhc2hlc1xuICAgIHZhciB0b1N0YXJ0ID0gMTtcbiAgICBmb3IgKDsgdG9TdGFydCA8IHRvLmxlbmd0aDsgKyt0b1N0YXJ0KSB7XG4gICAgICBpZiAodG8uY2hhckNvZGVBdCh0b1N0YXJ0KSAhPT0gNDcgLyovKi8pXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgdG9FbmQgPSB0by5sZW5ndGg7XG4gICAgdmFyIHRvTGVuID0gdG9FbmQgLSB0b1N0YXJ0O1xuXG4gICAgLy8gQ29tcGFyZSBwYXRocyB0byBmaW5kIHRoZSBsb25nZXN0IGNvbW1vbiBwYXRoIGZyb20gcm9vdFxuICAgIHZhciBsZW5ndGggPSBmcm9tTGVuIDwgdG9MZW4gPyBmcm9tTGVuIDogdG9MZW47XG4gICAgdmFyIGxhc3RDb21tb25TZXAgPSAtMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yICg7IGkgPD0gbGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChpID09PSBsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRvTGVuID4gbGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHRvLmNoYXJDb2RlQXQodG9TdGFydCArIGkpID09PSA0NyAvKi8qLykge1xuICAgICAgICAgICAgLy8gV2UgZ2V0IGhlcmUgaWYgYGZyb21gIGlzIHRoZSBleGFjdCBiYXNlIHBhdGggZm9yIGB0b2AuXG4gICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nL2Zvby9iYXInOyB0bz0nL2Zvby9iYXIvYmF6J1xuICAgICAgICAgICAgcmV0dXJuIHRvLnNsaWNlKHRvU3RhcnQgKyBpICsgMSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAvLyBXZSBnZXQgaGVyZSBpZiBgZnJvbWAgaXMgdGhlIHJvb3RcbiAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiBmcm9tPScvJzsgdG89Jy9mb28nXG4gICAgICAgICAgICByZXR1cm4gdG8uc2xpY2UodG9TdGFydCArIGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChmcm9tTGVuID4gbGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKGZyb20uY2hhckNvZGVBdChmcm9tU3RhcnQgKyBpKSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGB0b2AgaXMgdGhlIGV4YWN0IGJhc2UgcGF0aCBmb3IgYGZyb21gLlxuICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGZyb209Jy9mb28vYmFyL2Jheic7IHRvPScvZm9vL2JhcidcbiAgICAgICAgICAgIGxhc3RDb21tb25TZXAgPSBpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgLy8gV2UgZ2V0IGhlcmUgaWYgYHRvYCBpcyB0aGUgcm9vdC5cbiAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiBmcm9tPScvZm9vJzsgdG89Jy8nXG4gICAgICAgICAgICBsYXN0Q29tbW9uU2VwID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB2YXIgZnJvbUNvZGUgPSBmcm9tLmNoYXJDb2RlQXQoZnJvbVN0YXJ0ICsgaSk7XG4gICAgICB2YXIgdG9Db2RlID0gdG8uY2hhckNvZGVBdCh0b1N0YXJ0ICsgaSk7XG4gICAgICBpZiAoZnJvbUNvZGUgIT09IHRvQ29kZSlcbiAgICAgICAgYnJlYWs7XG4gICAgICBlbHNlIGlmIChmcm9tQ29kZSA9PT0gNDcgLyovKi8pXG4gICAgICAgIGxhc3RDb21tb25TZXAgPSBpO1xuICAgIH1cblxuICAgIHZhciBvdXQgPSAnJztcbiAgICAvLyBHZW5lcmF0ZSB0aGUgcmVsYXRpdmUgcGF0aCBiYXNlZCBvbiB0aGUgcGF0aCBkaWZmZXJlbmNlIGJldHdlZW4gYHRvYFxuICAgIC8vIGFuZCBgZnJvbWBcbiAgICBmb3IgKGkgPSBmcm9tU3RhcnQgKyBsYXN0Q29tbW9uU2VwICsgMTsgaSA8PSBmcm9tRW5kOyArK2kpIHtcbiAgICAgIGlmIChpID09PSBmcm9tRW5kIHx8IGZyb20uY2hhckNvZGVBdChpKSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgaWYgKG91dC5sZW5ndGggPT09IDApXG4gICAgICAgICAgb3V0ICs9ICcuLic7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBvdXQgKz0gJy8uLic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGFzdGx5LCBhcHBlbmQgdGhlIHJlc3Qgb2YgdGhlIGRlc3RpbmF0aW9uIChgdG9gKSBwYXRoIHRoYXQgY29tZXMgYWZ0ZXJcbiAgICAvLyB0aGUgY29tbW9uIHBhdGggcGFydHNcbiAgICBpZiAob3V0Lmxlbmd0aCA+IDApXG4gICAgICByZXR1cm4gb3V0ICsgdG8uc2xpY2UodG9TdGFydCArIGxhc3RDb21tb25TZXApO1xuICAgIGVsc2Uge1xuICAgICAgdG9TdGFydCArPSBsYXN0Q29tbW9uU2VwO1xuICAgICAgaWYgKHRvLmNoYXJDb2RlQXQodG9TdGFydCkgPT09IDQ3IC8qLyovKVxuICAgICAgICArK3RvU3RhcnQ7XG4gICAgICByZXR1cm4gdG8uc2xpY2UodG9TdGFydCk7XG4gICAgfVxuICB9LFxuXG4gIF9tYWtlTG9uZzogZnVuY3Rpb24gX21ha2VMb25nKHBhdGgpIHtcbiAgICByZXR1cm4gcGF0aDtcbiAgfSxcblxuICBkaXJuYW1lOiBmdW5jdGlvbiBkaXJuYW1lKHBhdGgpIHtcbiAgICBhc3NlcnRQYXRoKHBhdGgpO1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcuJztcbiAgICB2YXIgY29kZSA9IHBhdGguY2hhckNvZGVBdCgwKTtcbiAgICB2YXIgaGFzUm9vdCA9IGNvZGUgPT09IDQ3IC8qLyovO1xuICAgIHZhciBlbmQgPSAtMTtcbiAgICB2YXIgbWF0Y2hlZFNsYXNoID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDE7IC0taSkge1xuICAgICAgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICAgIGlmIChjb2RlID09PSA0NyAvKi8qLykge1xuICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvclxuICAgICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW5kID09PSAtMSkgcmV0dXJuIGhhc1Jvb3QgPyAnLycgOiAnLic7XG4gICAgaWYgKGhhc1Jvb3QgJiYgZW5kID09PSAxKSByZXR1cm4gJy8vJztcbiAgICByZXR1cm4gcGF0aC5zbGljZSgwLCBlbmQpO1xuICB9LFxuXG4gIGJhc2VuYW1lOiBmdW5jdGlvbiBiYXNlbmFtZShwYXRoLCBleHQpIHtcbiAgICBpZiAoZXh0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGV4dCAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZXh0XCIgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIGFzc2VydFBhdGgocGF0aCk7XG5cbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIHZhciBlbmQgPSAtMTtcbiAgICB2YXIgbWF0Y2hlZFNsYXNoID0gdHJ1ZTtcbiAgICB2YXIgaTtcblxuICAgIGlmIChleHQgIT09IHVuZGVmaW5lZCAmJiBleHQubGVuZ3RoID4gMCAmJiBleHQubGVuZ3RoIDw9IHBhdGgubGVuZ3RoKSB7XG4gICAgICBpZiAoZXh0Lmxlbmd0aCA9PT0gcGF0aC5sZW5ndGggJiYgZXh0ID09PSBwYXRoKSByZXR1cm4gJyc7XG4gICAgICB2YXIgZXh0SWR4ID0gZXh0Lmxlbmd0aCAtIDE7XG4gICAgICB2YXIgZmlyc3ROb25TbGFzaEVuZCA9IC0xO1xuICAgICAgZm9yIChpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKGNvZGUgPT09IDQ3IC8qLyovKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aFxuICAgICAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93XG4gICAgICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkge1xuICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChmaXJzdE5vblNsYXNoRW5kID09PSAtMSkge1xuICAgICAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIHJlbWVtYmVyIHRoaXMgaW5kZXggaW4gY2FzZVxuICAgICAgICAgICAgLy8gd2UgbmVlZCBpdCBpZiB0aGUgZXh0ZW5zaW9uIGVuZHMgdXAgbm90IG1hdGNoaW5nXG4gICAgICAgICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgICAgICAgIGZpcnN0Tm9uU2xhc2hFbmQgPSBpICsgMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4dElkeCA+PSAwKSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggdGhlIGV4cGxpY2l0IGV4dGVuc2lvblxuICAgICAgICAgICAgaWYgKGNvZGUgPT09IGV4dC5jaGFyQ29kZUF0KGV4dElkeCkpIHtcbiAgICAgICAgICAgICAgaWYgKC0tZXh0SWR4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIGV4dGVuc2lvbiwgc28gbWFyayB0aGlzIGFzIHRoZSBlbmQgb2Ygb3VyIHBhdGhcbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnRcbiAgICAgICAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBFeHRlbnNpb24gZG9lcyBub3QgbWF0Y2gsIHNvIG91ciByZXN1bHQgaXMgdGhlIGVudGlyZSBwYXRoXG4gICAgICAgICAgICAgIC8vIGNvbXBvbmVudFxuICAgICAgICAgICAgICBleHRJZHggPSAtMTtcbiAgICAgICAgICAgICAgZW5kID0gZmlyc3ROb25TbGFzaEVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIGVuZCA9IGZpcnN0Tm9uU2xhc2hFbmQ7ZWxzZSBpZiAoZW5kID09PSAtMSkgZW5kID0gcGF0aC5sZW5ndGg7XG4gICAgICByZXR1cm4gcGF0aC5zbGljZShzdGFydCwgZW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICBpZiAocGF0aC5jaGFyQ29kZUF0KGkpID09PSA0NyAvKi8qLykge1xuICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGhcbiAgICAgICAgICAgIC8vIHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzdG9wIG5vd1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91clxuICAgICAgICAgIC8vIHBhdGggY29tcG9uZW50XG4gICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICAgICAgZW5kID0gaSArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGVuZCA9PT0gLTEpIHJldHVybiAnJztcbiAgICAgIHJldHVybiBwYXRoLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgIH1cbiAgfSxcblxuICBleHRuYW1lOiBmdW5jdGlvbiBleHRuYW1lKHBhdGgpIHtcbiAgICBhc3NlcnRQYXRoKHBhdGgpO1xuICAgIHZhciBzdGFydERvdCA9IC0xO1xuICAgIHZhciBzdGFydFBhcnQgPSAwO1xuICAgIHZhciBlbmQgPSAtMTtcbiAgICB2YXIgbWF0Y2hlZFNsYXNoID0gdHJ1ZTtcbiAgICAvLyBUcmFjayB0aGUgc3RhdGUgb2YgY2hhcmFjdGVycyAoaWYgYW55KSB3ZSBzZWUgYmVmb3JlIG91ciBmaXJzdCBkb3QgYW5kXG4gICAgLy8gYWZ0ZXIgYW55IHBhdGggc2VwYXJhdG9yIHdlIGZpbmRcbiAgICB2YXIgcHJlRG90U3RhdGUgPSAwO1xuICAgIGZvciAodmFyIGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB2YXIgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICAgIGlmIChjb2RlID09PSA0NyAvKi8qLykge1xuICAgICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoXG4gICAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93XG4gICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICAgIHN0YXJ0UGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICBpZiAoZW5kID09PSAtMSkge1xuICAgICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvciwgbWFyayB0aGlzIGFzIHRoZSBlbmQgb2Ygb3VyXG4gICAgICAgIC8vIGV4dGVuc2lvblxuICAgICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgICAgZW5kID0gaSArIDE7XG4gICAgICB9XG4gICAgICBpZiAoY29kZSA9PT0gNDYgLyouKi8pIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGlzIG91ciBmaXJzdCBkb3QsIG1hcmsgaXQgYXMgdGhlIHN0YXJ0IG9mIG91ciBleHRlbnNpb25cbiAgICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xKVxuICAgICAgICAgICAgc3RhcnREb3QgPSBpO1xuICAgICAgICAgIGVsc2UgaWYgKHByZURvdFN0YXRlICE9PSAxKVxuICAgICAgICAgICAgcHJlRG90U3RhdGUgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzdGFydERvdCAhPT0gLTEpIHtcbiAgICAgICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBhbmQgbm9uLXBhdGggc2VwYXJhdG9yIGJlZm9yZSBvdXIgZG90LCBzbyB3ZSBzaG91bGRcbiAgICAgICAgLy8gaGF2ZSBhIGdvb2QgY2hhbmNlIGF0IGhhdmluZyBhIG5vbi1lbXB0eSBleHRlbnNpb25cbiAgICAgICAgcHJlRG90U3RhdGUgPSAtMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhcnREb3QgPT09IC0xIHx8IGVuZCA9PT0gLTEgfHxcbiAgICAgICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBkb3RcbiAgICAgICAgcHJlRG90U3RhdGUgPT09IDAgfHxcbiAgICAgICAgLy8gVGhlIChyaWdodC1tb3N0KSB0cmltbWVkIHBhdGggY29tcG9uZW50IGlzIGV4YWN0bHkgJy4uJ1xuICAgICAgICBwcmVEb3RTdGF0ZSA9PT0gMSAmJiBzdGFydERvdCA9PT0gZW5kIC0gMSAmJiBzdGFydERvdCA9PT0gc3RhcnRQYXJ0ICsgMSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5zbGljZShzdGFydERvdCwgZW5kKTtcbiAgfSxcblxuICBmb3JtYXQ6IGZ1bmN0aW9uIGZvcm1hdChwYXRoT2JqZWN0KSB7XG4gICAgaWYgKHBhdGhPYmplY3QgPT09IG51bGwgfHwgdHlwZW9mIHBhdGhPYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJwYXRoT2JqZWN0XCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHBhdGhPYmplY3QpO1xuICAgIH1cbiAgICByZXR1cm4gX2Zvcm1hdCgnLycsIHBhdGhPYmplY3QpO1xuICB9LFxuXG4gIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShwYXRoKSB7XG4gICAgYXNzZXJ0UGF0aChwYXRoKTtcblxuICAgIHZhciByZXQgPSB7IHJvb3Q6ICcnLCBkaXI6ICcnLCBiYXNlOiAnJywgZXh0OiAnJywgbmFtZTogJycgfTtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiByZXQ7XG4gICAgdmFyIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIGlzQWJzb2x1dGUgPSBjb2RlID09PSA0NyAvKi8qLztcbiAgICB2YXIgc3RhcnQ7XG4gICAgaWYgKGlzQWJzb2x1dGUpIHtcbiAgICAgIHJldC5yb290ID0gJy8nO1xuICAgICAgc3RhcnQgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGFydCA9IDA7XG4gICAgfVxuICAgIHZhciBzdGFydERvdCA9IC0xO1xuICAgIHZhciBzdGFydFBhcnQgPSAwO1xuICAgIHZhciBlbmQgPSAtMTtcbiAgICB2YXIgbWF0Y2hlZFNsYXNoID0gdHJ1ZTtcbiAgICB2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTtcblxuICAgIC8vIFRyYWNrIHRoZSBzdGF0ZSBvZiBjaGFyYWN0ZXJzIChpZiBhbnkpIHdlIHNlZSBiZWZvcmUgb3VyIGZpcnN0IGRvdCBhbmRcbiAgICAvLyBhZnRlciBhbnkgcGF0aCBzZXBhcmF0b3Igd2UgZmluZFxuICAgIHZhciBwcmVEb3RTdGF0ZSA9IDA7XG5cbiAgICAvLyBHZXQgbm9uLWRpciBpbmZvXG4gICAgZm9yICg7IGkgPj0gc3RhcnQ7IC0taSkge1xuICAgICAgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICAgIGlmIChjb2RlID09PSA0NyAvKi8qLykge1xuICAgICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoXG4gICAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93XG4gICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICAgIHN0YXJ0UGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICBpZiAoZW5kID09PSAtMSkge1xuICAgICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvciwgbWFyayB0aGlzIGFzIHRoZSBlbmQgb2Ygb3VyXG4gICAgICAgIC8vIGV4dGVuc2lvblxuICAgICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgICAgZW5kID0gaSArIDE7XG4gICAgICB9XG4gICAgICBpZiAoY29kZSA9PT0gNDYgLyouKi8pIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGlzIG91ciBmaXJzdCBkb3QsIG1hcmsgaXQgYXMgdGhlIHN0YXJ0IG9mIG91ciBleHRlbnNpb25cbiAgICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xKSBzdGFydERvdCA9IGk7ZWxzZSBpZiAocHJlRG90U3RhdGUgIT09IDEpIHByZURvdFN0YXRlID0gMTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGFydERvdCAhPT0gLTEpIHtcbiAgICAgICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBhbmQgbm9uLXBhdGggc2VwYXJhdG9yIGJlZm9yZSBvdXIgZG90LCBzbyB3ZSBzaG91bGRcbiAgICAgICAgLy8gaGF2ZSBhIGdvb2QgY2hhbmNlIGF0IGhhdmluZyBhIG5vbi1lbXB0eSBleHRlbnNpb25cbiAgICAgICAgcHJlRG90U3RhdGUgPSAtMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhcnREb3QgPT09IC0xIHx8IGVuZCA9PT0gLTEgfHxcbiAgICAvLyBXZSBzYXcgYSBub24tZG90IGNoYXJhY3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGRvdFxuICAgIHByZURvdFN0YXRlID09PSAwIHx8XG4gICAgLy8gVGhlIChyaWdodC1tb3N0KSB0cmltbWVkIHBhdGggY29tcG9uZW50IGlzIGV4YWN0bHkgJy4uJ1xuICAgIHByZURvdFN0YXRlID09PSAxICYmIHN0YXJ0RG90ID09PSBlbmQgLSAxICYmIHN0YXJ0RG90ID09PSBzdGFydFBhcnQgKyAxKSB7XG4gICAgICBpZiAoZW5kICE9PSAtMSkge1xuICAgICAgICBpZiAoc3RhcnRQYXJ0ID09PSAwICYmIGlzQWJzb2x1dGUpIHJldC5iYXNlID0gcmV0Lm5hbWUgPSBwYXRoLnNsaWNlKDEsIGVuZCk7ZWxzZSByZXQuYmFzZSA9IHJldC5uYW1lID0gcGF0aC5zbGljZShzdGFydFBhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGFydFBhcnQgPT09IDAgJiYgaXNBYnNvbHV0ZSkge1xuICAgICAgICByZXQubmFtZSA9IHBhdGguc2xpY2UoMSwgc3RhcnREb3QpO1xuICAgICAgICByZXQuYmFzZSA9IHBhdGguc2xpY2UoMSwgZW5kKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldC5uYW1lID0gcGF0aC5zbGljZShzdGFydFBhcnQsIHN0YXJ0RG90KTtcbiAgICAgICAgcmV0LmJhc2UgPSBwYXRoLnNsaWNlKHN0YXJ0UGFydCwgZW5kKTtcbiAgICAgIH1cbiAgICAgIHJldC5leHQgPSBwYXRoLnNsaWNlKHN0YXJ0RG90LCBlbmQpO1xuICAgIH1cblxuICAgIGlmIChzdGFydFBhcnQgPiAwKSByZXQuZGlyID0gcGF0aC5zbGljZSgwLCBzdGFydFBhcnQgLSAxKTtlbHNlIGlmIChpc0Fic29sdXRlKSByZXQuZGlyID0gJy8nO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBzZXA6ICcvJyxcbiAgZGVsaW1pdGVyOiAnOicsXG4gIHdpbjMyOiBudWxsLFxuICBwb3NpeDogbnVsbFxufTtcblxucG9zaXgucG9zaXggPSBwb3NpeDtcblxubW9kdWxlLmV4cG9ydHMgPSBwb3NpeDtcbiIsICIvKiFcbiAqIG1pbWUtdHlwZXNcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBkYiA9IHJlcXVpcmUoJ21pbWUtZGInKVxudmFyIGV4dG5hbWUgPSByZXF1aXJlKCdwYXRoJykuZXh0bmFtZVxuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBFWFRSQUNUX1RZUEVfUkVHRVhQID0gL15cXHMqKFteO1xcc10qKSg/Ojt8XFxzfCQpL1xudmFyIFRFWFRfVFlQRV9SRUdFWFAgPSAvXnRleHRcXC8vaVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbmV4cG9ydHMuY2hhcnNldCA9IGNoYXJzZXRcbmV4cG9ydHMuY2hhcnNldHMgPSB7IGxvb2t1cDogY2hhcnNldCB9XG5leHBvcnRzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGVcbmV4cG9ydHMuZXh0ZW5zaW9uID0gZXh0ZW5zaW9uXG5leHBvcnRzLmV4dGVuc2lvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5leHBvcnRzLmxvb2t1cCA9IGxvb2t1cFxuZXhwb3J0cy50eXBlcyA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuLy8gUG9wdWxhdGUgdGhlIGV4dGVuc2lvbnMvdHlwZXMgbWFwc1xucG9wdWxhdGVNYXBzKGV4cG9ydHMuZXh0ZW5zaW9ucywgZXhwb3J0cy50eXBlcylcblxuLyoqXG4gKiBHZXQgdGhlIGRlZmF1bHQgY2hhcnNldCBmb3IgYSBNSU1FIHR5cGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGNoYXJzZXQgKHR5cGUpIHtcbiAgaWYgKCF0eXBlIHx8IHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gVE9ETzogdXNlIG1lZGlhLXR5cGVyXG4gIHZhciBtYXRjaCA9IEVYVFJBQ1RfVFlQRV9SRUdFWFAuZXhlYyh0eXBlKVxuICB2YXIgbWltZSA9IG1hdGNoICYmIGRiW21hdGNoWzFdLnRvTG93ZXJDYXNlKCldXG5cbiAgaWYgKG1pbWUgJiYgbWltZS5jaGFyc2V0KSB7XG4gICAgcmV0dXJuIG1pbWUuY2hhcnNldFxuICB9XG5cbiAgLy8gZGVmYXVsdCB0ZXh0LyogdG8gdXRmLThcbiAgaWYgKG1hdGNoICYmIFRFWFRfVFlQRV9SRUdFWFAudGVzdChtYXRjaFsxXSkpIHtcbiAgICByZXR1cm4gJ1VURi04J1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZnVsbCBDb250ZW50LVR5cGUgaGVhZGVyIGdpdmVuIGEgTUlNRSB0eXBlIG9yIGV4dGVuc2lvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtib29sZWFufHN0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBjb250ZW50VHlwZSAoc3RyKSB7XG4gIC8vIFRPRE86IHNob3VsZCB0aGlzIGV2ZW4gYmUgaW4gdGhpcyBtb2R1bGU/XG4gIGlmICghc3RyIHx8IHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICB2YXIgbWltZSA9IHN0ci5pbmRleE9mKCcvJykgPT09IC0xXG4gICAgPyBleHBvcnRzLmxvb2t1cChzdHIpXG4gICAgOiBzdHJcblxuICBpZiAoIW1pbWUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFRPRE86IHVzZSBjb250ZW50LXR5cGUgb3Igb3RoZXIgbW9kdWxlXG4gIGlmIChtaW1lLmluZGV4T2YoJ2NoYXJzZXQnKSA9PT0gLTEpIHtcbiAgICB2YXIgY2hhcnNldCA9IGV4cG9ydHMuY2hhcnNldChtaW1lKVxuICAgIGlmIChjaGFyc2V0KSBtaW1lICs9ICc7IGNoYXJzZXQ9JyArIGNoYXJzZXQudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgcmV0dXJuIG1pbWVcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGRlZmF1bHQgZXh0ZW5zaW9uIGZvciBhIE1JTUUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHJldHVybiB7Ym9vbGVhbnxzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gZXh0ZW5zaW9uICh0eXBlKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFRPRE86IHVzZSBtZWRpYS10eXBlclxuICB2YXIgbWF0Y2ggPSBFWFRSQUNUX1RZUEVfUkVHRVhQLmV4ZWModHlwZSlcblxuICAvLyBnZXQgZXh0ZW5zaW9uc1xuICB2YXIgZXh0cyA9IG1hdGNoICYmIGV4cG9ydHMuZXh0ZW5zaW9uc1ttYXRjaFsxXS50b0xvd2VyQ2FzZSgpXVxuXG4gIGlmICghZXh0cyB8fCAhZXh0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBleHRzWzBdXG59XG5cbi8qKlxuICogTG9va3VwIHRoZSBNSU1FIHR5cGUgZm9yIGEgZmlsZSBwYXRoL2V4dGVuc2lvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHJldHVybiB7Ym9vbGVhbnxzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gbG9va3VwIChwYXRoKSB7XG4gIGlmICghcGF0aCB8fCB0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIGdldCB0aGUgZXh0ZW5zaW9uIChcImV4dFwiIG9yIFwiLmV4dFwiIG9yIGZ1bGwgcGF0aClcbiAgdmFyIGV4dGVuc2lvbiA9IGV4dG5hbWUoJ3guJyArIHBhdGgpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAuc3Vic3RyKDEpXG5cbiAgaWYgKCFleHRlbnNpb24pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzLnR5cGVzW2V4dGVuc2lvbl0gfHwgZmFsc2Vcbn1cblxuLyoqXG4gKiBQb3B1bGF0ZSB0aGUgZXh0ZW5zaW9ucyBhbmQgdHlwZXMgbWFwcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcG9wdWxhdGVNYXBzIChleHRlbnNpb25zLCB0eXBlcykge1xuICAvLyBzb3VyY2UgcHJlZmVyZW5jZSAobGVhc3QgLT4gbW9zdClcbiAgdmFyIHByZWZlcmVuY2UgPSBbJ25naW54JywgJ2FwYWNoZScsIHVuZGVmaW5lZCwgJ2lhbmEnXVxuXG4gIE9iamVjdC5rZXlzKGRiKS5mb3JFYWNoKGZ1bmN0aW9uIGZvckVhY2hNaW1lVHlwZSAodHlwZSkge1xuICAgIHZhciBtaW1lID0gZGJbdHlwZV1cbiAgICB2YXIgZXh0cyA9IG1pbWUuZXh0ZW5zaW9uc1xuXG4gICAgaWYgKCFleHRzIHx8ICFleHRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gbWltZSAtPiBleHRlbnNpb25zXG4gICAgZXh0ZW5zaW9uc1t0eXBlXSA9IGV4dHNcblxuICAgIC8vIGV4dGVuc2lvbiAtPiBtaW1lXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZXh0ZW5zaW9uID0gZXh0c1tpXVxuXG4gICAgICBpZiAodHlwZXNbZXh0ZW5zaW9uXSkge1xuICAgICAgICB2YXIgZnJvbSA9IHByZWZlcmVuY2UuaW5kZXhPZihkYlt0eXBlc1tleHRlbnNpb25dXS5zb3VyY2UpXG4gICAgICAgIHZhciB0byA9IHByZWZlcmVuY2UuaW5kZXhPZihtaW1lLnNvdXJjZSlcblxuICAgICAgICBpZiAodHlwZXNbZXh0ZW5zaW9uXSAhPT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgJiZcbiAgICAgICAgICAoZnJvbSA+IHRvIHx8IChmcm9tID09PSB0byAmJiB0eXBlc1tleHRlbnNpb25dLnN1YnN0cigwLCAxMikgPT09ICdhcHBsaWNhdGlvbi8nKSkpIHtcbiAgICAgICAgICAvLyBza2lwIHRoZSByZW1hcHBpbmdcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHNldCB0aGUgZXh0ZW5zaW9uIC0+IG1pbWVcbiAgICAgIHR5cGVzW2V4dGVuc2lvbl0gPSB0eXBlXG4gICAgfVxuICB9KVxufVxuIiwgIi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnJlZUdsb2JhbDtcbiIsICJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLCAidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbDtcbiIsICIvKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIHRvLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBcnJheShzb3VyY2UsIGFycmF5KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5QXJyYXk7XG4iLCAidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlR2V0VGFnYCB3aGljaCBpZ25vcmVzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKSB7XG4gIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICB0cnkge1xuICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgaWYgKHVubWFza2VkKSB7XG4gICAgaWYgKGlzT3duKSB7XG4gICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UmF3VGFnO1xuIiwgIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuIiwgInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBnZXRSYXdUYWcgPSByZXF1aXJlKCcuL19nZXRSYXdUYWcnKSxcbiAgICBvYmplY3RUb1N0cmluZyA9IHJlcXVpcmUoJy4vX29iamVjdFRvU3RyaW5nJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gIH1cbiAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRUYWc7XG4iLCAiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG4iLCAidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGdW5jdGlvbjtcbiIsICJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3JlSnNEYXRhO1xuIiwgInZhciBjb3JlSnNEYXRhID0gcmVxdWlyZSgnLi9fY29yZUpzRGF0YScpO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFza2VkO1xuIiwgIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNvdXJjZSBjb2RlLlxuICovXG5mdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG4gIGlmIChmdW5jICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG4gIHJldHVybiAnJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1NvdXJjZTtcbiIsICJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTWFza2VkID0gcmVxdWlyZSgnLi9faXNNYXNrZWQnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICB0b1NvdXJjZSA9IHJlcXVpcmUoJy4vX3RvU291cmNlJyk7XG5cbi8qKlxuICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gKi9cbnZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbnZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbih2YWx1ZSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTmF0aXZlO1xuIiwgIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFZhbHVlO1xuIiwgInZhciBiYXNlSXNOYXRpdmUgPSByZXF1aXJlKCcuL19iYXNlSXNOYXRpdmUnKSxcbiAgICBnZXRWYWx1ZSA9IHJlcXVpcmUoJy4vX2dldFZhbHVlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TmF0aXZlO1xuIiwgInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUocm9vdCwgJ0RhdGFWaWV3Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0YVZpZXc7XG4iLCAidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcbiIsICJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuIiwgInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgU2V0ID0gZ2V0TmF0aXZlKHJvb3QsICdTZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZXQ7XG4iLCAidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBXZWFrTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdXZWFrTWFwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gV2Vha01hcDtcbiIsICJ2YXIgRGF0YVZpZXcgPSByZXF1aXJlKCcuL19EYXRhVmlldycpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpLFxuICAgIFByb21pc2UgPSByZXF1aXJlKCcuL19Qcm9taXNlJyksXG4gICAgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgV2Vha01hcCA9IHJlcXVpcmUoJy4vX1dlYWtNYXAnKSxcbiAgICBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi9cbnZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlKSxcbiAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4vKipcbiAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG52YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuaWYgKChEYXRhVmlldyAmJiBnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpICE9IGRhdGFWaWV3VGFnKSB8fFxuICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgKFNldCAmJiBnZXRUYWcobmV3IFNldCkgIT0gc2V0VGFnKSB8fFxuICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgcmVzdWx0ID0gYmFzZUdldFRhZyh2YWx1ZSksXG4gICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgIGlmIChjdG9yU3RyaW5nKSB7XG4gICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgY2FzZSBtYXBDdG9yU3RyaW5nOiByZXR1cm4gbWFwVGFnO1xuICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOiByZXR1cm4gd2Vha01hcFRhZztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRUYWc7XG4iLCAiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTGVuZ3RoO1xuIiwgInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXlMaWtlO1xuIiwgIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7XG4iLCAiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3RMaWtlO1xuIiwgInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N0cmluZygnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N0cmluZygxKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N0cmluZztcbiIsICIvKipcbiAqIENvbnZlcnRzIGBpdGVyYXRvcmAgdG8gYW4gYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVyYXRvciBUaGUgaXRlcmF0b3IgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3IpIHtcbiAgdmFyIGRhdGEsXG4gICAgICByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoIShkYXRhID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgcmVzdWx0LnB1c2goZGF0YS52YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpdGVyYXRvclRvQXJyYXk7XG4iLCAiLyoqXG4gKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICovXG5mdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcblxuICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gW2tleSwgdmFsdWVdO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBUb0FycmF5O1xuIiwgIi8qKlxuICogQ29udmVydHMgYHNldGAgdG8gYW4gYXJyYXkgb2YgaXRzIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0VG9BcnJheTtcbiIsICIvKipcbiAqIENvbnZlcnRzIGFuIEFTQ0lJIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhc2NpaVRvQXJyYXkoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcuc3BsaXQoJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzY2lpVG9BcnJheTtcbiIsICIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3Mgd2l0aCBbemVyby13aWR0aCBqb2luZXJzIG9yIGNvZGUgcG9pbnRzIGZyb20gdGhlIGFzdHJhbCBwbGFuZXNdKGh0dHA6Ly9lZXYuZWUvYmxvZy8yMDE1LzA5LzEyL2RhcmstY29ybmVycy1vZi11bmljb2RlLykuICovXG52YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHN5bWJvbCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICByZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNVbmljb2RlO1xuIiwgIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovXG52YXIgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgIHJzT3B0VmFyID0gJ1snICsgcnNWYXJSYW5nZSArICddPycsXG4gICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovXG52YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbi8qKlxuICogQ29udmVydHMgYSBVbmljb2RlIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiB1bmljb2RlVG9BcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGUpIHx8IFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWNvZGVUb0FycmF5O1xuIiwgInZhciBhc2NpaVRvQXJyYXkgPSByZXF1aXJlKCcuL19hc2NpaVRvQXJyYXknKSxcbiAgICBoYXNVbmljb2RlID0gcmVxdWlyZSgnLi9faGFzVW5pY29kZScpLFxuICAgIHVuaWNvZGVUb0FycmF5ID0gcmVxdWlyZSgnLi9fdW5pY29kZVRvQXJyYXknKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVG9BcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgID8gdW5pY29kZVRvQXJyYXkoc3RyaW5nKVxuICAgIDogYXNjaWlUb0FycmF5KHN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5nVG9BcnJheTtcbiIsICIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5TWFwO1xuIiwgInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogb2YgYHByb3BzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VWYWx1ZXM7XG4iLCAiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVGltZXM7XG4iLCAidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICovXG5mdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJnc1RhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNBcmd1bWVudHM7XG4iLCAidmFyIGJhc2VJc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vX2Jhc2VJc0FyZ3VtZW50cycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FyZ3VtZW50cyA9IGJhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA/IGJhc2VJc0FyZ3VtZW50cyA6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJndW1lbnRzO1xuIiwgIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICovXG5mdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRmFsc2U7XG4iLCAidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290JyksXG4gICAgc3R1YkZhbHNlID0gcmVxdWlyZSgnLi9zdHViRmFsc2UnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQnVmZmVyO1xuIiwgIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuXG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAodHlwZSAhPSAnc3ltYm9sJyAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkpICYmXG4gICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0luZGV4O1xuIiwgInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIG9mIHR5cGVkIGFycmF5cy4gKi9cbnZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xudHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG50eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG50eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG50eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9XG50eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG50eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG50eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9XG50eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG50eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNUeXBlZEFycmF5O1xuIiwgIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5hcnk7XG4iLCAidmFyIGZyZWVHbG9iYWwgPSByZXF1aXJlKCcuL19mcmVlR2xvYmFsJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZVByb2Nlc3MgPSBtb2R1bGVFeHBvcnRzICYmIGZyZWVHbG9iYWwucHJvY2VzcztcblxuLyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovXG52YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgLy8gVXNlIGB1dGlsLnR5cGVzYCBmb3IgTm9kZS5qcyAxMCsuXG4gICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICBpZiAodHlwZXMpIHtcbiAgICAgIHJldHVybiB0eXBlcztcbiAgICB9XG5cbiAgICAvLyBMZWdhY3kgYHByb2Nlc3MuYmluZGluZygndXRpbCcpYCBmb3IgTm9kZS5qcyA8IDEwLlxuICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbm9kZVV0aWw7XG4iLCAidmFyIGJhc2VJc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19iYXNlSXNUeXBlZEFycmF5JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc1R5cGVkQXJyYXk7XG4iLCAidmFyIGJhc2VUaW1lcyA9IHJlcXVpcmUoJy4vX2Jhc2VUaW1lcycpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5oZXJpdGVkIFNwZWNpZnkgcmV0dXJuaW5nIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcy5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkge1xuICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKSxcbiAgICAgIGlzQXJnID0gIWlzQXJyICYmIGlzQXJndW1lbnRzKHZhbHVlKSxcbiAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiAhaXNBcmcgJiYgaXNCdWZmZXIodmFsdWUpLFxuICAgICAgaXNUeXBlID0gIWlzQXJyICYmICFpc0FyZyAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheSh2YWx1ZSksXG4gICAgICBza2lwSW5kZXhlcyA9IGlzQXJyIHx8IGlzQXJnIHx8IGlzQnVmZiB8fCBpc1R5cGUsXG4gICAgICByZXN1bHQgPSBza2lwSW5kZXhlcyA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZykgOiBbXSxcbiAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkgJiZcbiAgICAgICAgIShza2lwSW5kZXhlcyAmJiAoXG4gICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS5cbiAgICAgICAgICAga2V5ID09ICdsZW5ndGgnIHx8XG4gICAgICAgICAgIC8vIE5vZGUuanMgMC4xMCBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiBidWZmZXJzLlxuICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHxcbiAgICAgICAgICAgLy8gUGhhbnRvbUpTIDIgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gdHlwZWQgYXJyYXlzLlxuICAgICAgICAgICAoaXNUeXBlICYmIChrZXkgPT0gJ2J1ZmZlcicgfHwga2V5ID09ICdieXRlTGVuZ3RoJyB8fCBrZXkgPT0gJ2J5dGVPZmZzZXQnKSkgfHxcbiAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICBpc0luZGV4KGtleSwgbGVuZ3RoKVxuICAgICAgICApKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUxpa2VLZXlzO1xuIiwgIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1Byb3RvdHlwZTtcbiIsICIvKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdmVyQXJnO1xuIiwgInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlS2V5cztcbiIsICJ2YXIgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpLFxuICAgIG5hdGl2ZUtleXMgPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5cztcbiIsICJ2YXIgYXJyYXlMaWtlS2V5cyA9IHJlcXVpcmUoJy4vX2FycmF5TGlrZUtleXMnKSxcbiAgICBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXM7XG4iLCAidmFyIGJhc2VWYWx1ZXMgPSByZXF1aXJlKCcuL19iYXNlVmFsdWVzJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8udmFsdWVzKG5ldyBGb28pO1xuICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy52YWx1ZXMoJ2hpJyk7XG4gKiAvLyA9PiBbJ2gnLCAnaSddXG4gKi9cbmZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2YWx1ZXM7XG4iLCAidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGNvcHlBcnJheSA9IHJlcXVpcmUoJy4vX2NvcHlBcnJheScpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzU3RyaW5nID0gcmVxdWlyZSgnLi9pc1N0cmluZycpLFxuICAgIGl0ZXJhdG9yVG9BcnJheSA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9yVG9BcnJheScpLFxuICAgIG1hcFRvQXJyYXkgPSByZXF1aXJlKCcuL19tYXBUb0FycmF5JyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKSxcbiAgICBzdHJpbmdUb0FycmF5ID0gcmVxdWlyZSgnLi9fc3RyaW5nVG9BcnJheScpLFxuICAgIHZhbHVlcyA9IHJlcXVpcmUoJy4vdmFsdWVzJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltSXRlcmF0b3IgPSBTeW1ib2wgPyBTeW1ib2wuaXRlcmF0b3IgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvQXJyYXkoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIF8udG9BcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAqXG4gKiBfLnRvQXJyYXkoMSk7XG4gKiAvLyA9PiBbXVxuICpcbiAqIF8udG9BcnJheShudWxsKTtcbiAqIC8vID0+IFtdXG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UodmFsdWUpKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSA/IHN0cmluZ1RvQXJyYXkodmFsdWUpIDogY29weUFycmF5KHZhbHVlKTtcbiAgfVxuICBpZiAoc3ltSXRlcmF0b3IgJiYgdmFsdWVbc3ltSXRlcmF0b3JdKSB7XG4gICAgcmV0dXJuIGl0ZXJhdG9yVG9BcnJheSh2YWx1ZVtzeW1JdGVyYXRvcl0oKSk7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICBmdW5jID0gdGFnID09IG1hcFRhZyA/IG1hcFRvQXJyYXkgOiAodGFnID09IHNldFRhZyA/IHNldFRvQXJyYXkgOiB2YWx1ZXMpO1xuXG4gIHJldHVybiBmdW5jKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0FycmF5O1xuIiwgIi8qanNsaW50IG5vZGU6IHRydWUqL1xudmFyIHRvQXJyYXkgPSByZXF1aXJlKCdsb2Rhc2gvdG9BcnJheScpO1xudmFyIGVtb2ppQnlOYW1lID0gcmVxdWlyZSgnLi9lbW9qaS5qc29uJyk7XG5cblwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIHJlZ2V4IHRvIHBhcnNlIGVtb2ppIGluIGEgc3RyaW5nIC0gZmluZHMgZW1vamksIGUuZy4gOmNvZmZlZTpcbiAqL1xudmFyIGVtb2ppTmFtZVJlZ2V4ID0gLzooW2EtekEtWjAtOV9cXC1cXCtdKyk6L2c7XG5cbi8qKlxuICogcmVnZXggdG8gdHJpbSB3aGl0ZXNwYWNlXG4gKiB1c2UgaW5zdGVhZCBvZiBTdHJpbmcucHJvdG90eXBlLnRyaW0oKSBmb3IgSUU4IHN1cHBvcnRcbiAqL1xudmFyIHRyaW1TcGFjZVJlZ2V4ID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nO1xuXG4vKipcbiAqIFJlbW92ZXMgY29sb25zIG9uIGVpdGhlciBzaWRlXG4gKiBvZiB0aGUgc3RyaW5nIGlmIHByZXNlbnRcbiAqIEBwYXJhbSAge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHN0cmlwQ29sb25zIChzdHIpIHtcbiAgdmFyIGNvbG9uSW5kZXggPSBzdHIuaW5kZXhPZignOicpO1xuICBpZiAoY29sb25JbmRleCA+IC0xKSB7XG4gICAgLy8gOmVtb2ppOiAoaHR0cDovL3d3dy5lbW9qaS1jaGVhdC1zaGVldC5jb20vKVxuICAgIGlmIChjb2xvbkluZGV4ID09PSBzdHIubGVuZ3RoIC0gMSkge1xuICAgICAgc3RyID0gc3RyLnN1YnN0cmluZygwLCBjb2xvbkluZGV4KTtcbiAgICAgIHJldHVybiBzdHJpcENvbG9ucyhzdHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBzdHIuc3Vic3RyKGNvbG9uSW5kZXggKyAxKTtcbiAgICAgIHJldHVybiBzdHJpcENvbG9ucyhzdHIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHI7XG59XG5cbi8qKlxuICogQWRkcyBjb2xvbnMgdG8gZWl0aGVyIHNpZGVcbiAqIG9mIHRoZSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gd3JhcENvbG9ucyAoc3RyKSB7XG4gIHJldHVybiAodHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyLmxlbmd0aCA+IDApID8gJzonICsgc3RyICsgJzonIDogc3RyO1xufVxuXG4vKipcbiAqIEVuc3VyZSB0aGF0IHRoZSB3b3JkIGlzIHdyYXBwZWQgaW4gY29sb25zXG4gKiBieSBvbmx5IGFkZGluZyB0aGVtLCBpZiB0aGV5IGFyZSBub3QgdGhlcmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVuc3VyZUNvbG9ucyAoc3RyKSB7XG4gIHJldHVybiAodHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyWzBdICE9PSAnOicpID8gd3JhcENvbG9ucyhzdHIpIDogc3RyO1xufVxuXG4vLyBOb24gc3BhY2luZyBtYXJrLCBzb21lIGVtb3RpY29ucyBoYXZlIHRoZW0uIEl0J3MgdGhlICdWYXJpYW50IEZvcm0nLFxuLy8gd2hpY2ggcHJvdmlkZXMgbW9yZSBpbmZvcm1hdGlvbiBzbyB0aGF0IGVtb3RpY29ucyBjYW4gYmUgcmVuZGVyZWQgYXNcbi8vIG1vcmUgY29sb3JmdWwgZ3JhcGhpY3MuIEZFMEUgaXMgYSB1bmljb2RlIHRleHQgdmVyc2lvbiwgd2hlcmUgYXMgRkUwRlxuLy8gc2hvdWxkIGJlIHJlbmRlcmVkIGFzIGEgZ3JhcGhpY2FsIHZlcnNpb24uIFRoZSBjb2RlIGdyYWNlZnVsbHkgZGVncmFkZXMuXG52YXIgTk9OX1NQQUNJTkdfTUFSSyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoNjUwMzkpOyAvLyA2NTAzOSAtICdcdUZFMEYnIC0gMHhGRTBGO1xudmFyIG5vblNwYWNpbmdSZWdleCA9IG5ldyBSZWdFeHAoTk9OX1NQQUNJTkdfTUFSSywgJ2cnKVxuXG4vLyBSZW1vdmUgdGhlIG5vbi1zcGFjaW5nLW1hcmsgZnJvbSB0aGUgY29kZSwgbmV2ZXIgc2VuZCBhIHN0cmlwcGVkIHZlcnNpb25cbi8vIHRvIHRoZSBjbGllbnQsIGFzIGl0IGtpbGxzIGdyYXBoaWNhbCBlbW90aWNvbnMuXG5mdW5jdGlvbiBzdHJpcE5TQiAoY29kZSkge1xuICByZXR1cm4gY29kZS5yZXBsYWNlKG5vblNwYWNpbmdSZWdleCwgJycpO1xufTtcblxuLy8gUmV2ZXJzZWQgaGFzaCB0YWJsZSwgd2hlcmUgYXMgZW1vamlCeU5hbWUgY29udGFpbnMgYSB7IGhlYXJ0OiAnXHUyNzY0JyB9XG4vLyBkaWN0aW9uYXJ5IGVtb2ppQnlDb2RlIGNvbnRhaW5zIHsgXHUyNzY0OiAnaGVhcnQnIH0uIFRoZSBjb2RlcyBhcmUgbm9ybWFsaXplZFxuLy8gdG8gdGhlIHRleHQgdmVyc2lvbi5cbnZhciBlbW9qaUJ5Q29kZSA9IE9iamVjdC5rZXlzKGVtb2ppQnlOYW1lKS5yZWR1Y2UoZnVuY3Rpb24oaCxrKSB7XG4gIGhbc3RyaXBOU0IoZW1vamlCeU5hbWVba10pXSA9IGs7XG4gIHJldHVybiBoO1xufSwge30pO1xuXG4vKipcbiAqIEVtb2ppIG5hbWVzcGFjZVxuICovXG52YXIgRW1vamkgPSB7XG4gIGVtb2ppOiBlbW9qaUJ5TmFtZSxcbn07XG5cbi8qKlxuICogZ2V0IGVtb2ppIGNvZGUgZnJvbSBuYW1lLiByZXR1cm4gZW1vamkgY29kZSBiYWNrIGlmIGNvZGUgaXMgcGFzc2VkIGluLlxuICogQHBhcmFtICB7c3RyaW5nfSBlbW9qaVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5FbW9qaS5fZ2V0ID0gZnVuY3Rpb24gX2dldCAoZW1vamkpIHtcbiAgaWYgKGVtb2ppQnlDb2RlW3N0cmlwTlNCKGVtb2ppKV0pIHtcbiAgICByZXR1cm4gZW1vamk7XG4gIH0gZWxzZSBpZiAoZW1vamlCeU5hbWUuaGFzT3duUHJvcGVydHkoZW1vamkpKSB7XG4gICAgcmV0dXJuIGVtb2ppQnlOYW1lW2Vtb2ppXTtcbiAgfVxuXG4gIHJldHVybiBlbnN1cmVDb2xvbnMoZW1vamkpO1xufTtcblxuLyoqXG4gKiBnZXQgZW1vamkgY29kZSBmcm9tIDplbW9qaTogc3RyaW5nIG9yIG5hbWVcbiAqIEBwYXJhbSAge3N0cmluZ30gZW1vamlcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuRW1vamkuZ2V0ID0gZnVuY3Rpb24gZ2V0IChlbW9qaSkge1xuICBlbW9qaSA9IHN0cmlwQ29sb25zKGVtb2ppKTtcblxuICByZXR1cm4gRW1vamkuX2dldChlbW9qaSk7XG59O1xuXG4vKipcbiAqIGZpbmQgdGhlIGVtb2ppIGJ5IGVpdGhlciBjb2RlIG9yIG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lT3JDb2RlIFRoZSBlbW9qaSB0byBmaW5kLCBlaXRoZXIgYGNvZmZlZWAsIGA6Y29mZmVlOmAgb3IgYFx1MjYxNWA7XG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbkVtb2ppLmZpbmQgPSBmdW5jdGlvbiBmaW5kIChuYW1lT3JDb2RlKSB7XG4gIHJldHVybiBFbW9qaS5maW5kQnlOYW1lKG5hbWVPckNvZGUpIHx8IEVtb2ppLmZpbmRCeUNvZGUobmFtZU9yQ29kZSk7XG59O1xuXG4vKipcbiAqIGZpbmQgdGhlIGVtb2ppIGJ5IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBlbW9qaSB0byBmaW5kIGVpdGhlciBgY29mZmVlYCBvciBgOmNvZmZlZTpgO1xuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5FbW9qaS5maW5kQnlOYW1lID0gZnVuY3Rpb24gZmluZEJ5TmFtZSAobmFtZSkge1xuICB2YXIgc3RyaXBwZWQgPSBzdHJpcENvbG9ucyhuYW1lKTtcbiAgdmFyIGVtb2ppID0gZW1vamlCeU5hbWVbc3RyaXBwZWRdO1xuXG4gIHJldHVybiBlbW9qaSA/ICh7IGVtb2ppOiBlbW9qaSwga2V5OiBzdHJpcHBlZCB9KSA6IHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogZmluZCB0aGUgZW1vamkgYnkgY29kZSAoZW1vamkpXG4gKiBAcGFyYW0ge3N0cmluZ30gY29kZSBUaGUgZW1vamkgdG8gZmluZDsgZm9yIGV4YW1wbGUgYFx1MjYxNWAgb3IgYFx1MjYxNGBcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuRW1vamkuZmluZEJ5Q29kZSA9IGZ1bmN0aW9uIGZpbmRCeUNvZGUgKGNvZGUpIHtcbiAgdmFyIHN0cmlwcGVkID0gc3RyaXBOU0IoY29kZSk7XG4gIHZhciBuYW1lID0gZW1vamlCeUNvZGVbc3RyaXBwZWRdO1xuXG4gIC8vIGxvb2t1cCBlbW9qaSB0byBlbnN1cmUgdGhlIFZhcmlhbnQgRm9ybSBpcyByZXR1cm5lZFxuICByZXR1cm4gbmFtZSA/ICh7IGVtb2ppOiBlbW9qaUJ5TmFtZVtuYW1lXSwga2V5OiBuYW1lIH0pIDogdW5kZWZpbmVkO1xufTtcblxuXG4vKipcbiAqIENoZWNrIGlmIGFuIGVtb2ppIGlzIGtub3duIGJ5IHRoaXMgbGlicmFyeVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVPckNvZGUgVGhlIGVtb2ppIHRvIHZhbGlkYXRlLCBlaXRoZXIgYGNvZmZlZWAsIGA6Y29mZmVlOmAgb3IgYFx1MjYxNWA7XG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbkVtb2ppLmhhc0Vtb2ppID0gZnVuY3Rpb24gaGFzRW1vamkgKG5hbWVPckNvZGUpIHtcbiAgcmV0dXJuIEVtb2ppLmhhc0Vtb2ppQnlOYW1lKG5hbWVPckNvZGUpIHx8IEVtb2ppLmhhc0Vtb2ppQnlDb2RlKG5hbWVPckNvZGUpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhbiBlbW9qaSB3aXRoIGdpdmVuIG5hbWUgaXMga25vd24gYnkgdGhpcyBsaWJyYXJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZW1vamkgdG8gdmFsaWRhdGUgZWl0aGVyIGBjb2ZmZWVgIG9yIGA6Y29mZmVlOmA7XG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbkVtb2ppLmhhc0Vtb2ppQnlOYW1lID0gZnVuY3Rpb24gaGFzRW1vamlCeU5hbWUgKG5hbWUpIHtcbiAgdmFyIHJlc3VsdCA9IEVtb2ppLmZpbmRCeU5hbWUobmFtZSk7XG4gIHJldHVybiAhIXJlc3VsdCAmJiByZXN1bHQua2V5ID09PSBzdHJpcENvbG9ucyhuYW1lKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBnaXZlbiBlbW9qaSBpcyBrbm93biBieSB0aGlzIGxpYnJhcnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIFRoZSBlbW9qaSB0byB2YWxpZGF0ZTsgZm9yIGV4YW1wbGUgYFx1MjYxNWAgb3IgYFx1MjYxNGBcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuRW1vamkuaGFzRW1vamlCeUNvZGUgPSBmdW5jdGlvbiBoYXNFbW9qaUJ5Q29kZSAoY29kZSkge1xuICB2YXIgcmVzdWx0ID0gRW1vamkuZmluZEJ5Q29kZShjb2RlKTtcbiAgcmV0dXJuICEhcmVzdWx0ICYmIHN0cmlwTlNCKHJlc3VsdC5lbW9qaSkgPT09IHN0cmlwTlNCKGNvZGUpO1xufTtcblxuLyoqXG4gKiBnZXQgZW1vamkgbmFtZSBmcm9tIGNvZGVcbiAqIEBwYXJhbSAge3N0cmluZ30gZW1vamlcbiAqIEBwYXJhbSAge2Jvb2xlYW59IGluY2x1ZGVDb2xvbnMgc2hvdWxkIHRoZSByZXN1bHQgaW5jbHVkZSB0aGUgOjpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuRW1vamkud2hpY2ggPSBmdW5jdGlvbiB3aGljaCAoZW1vamlfY29kZSwgaW5jbHVkZUNvbG9ucykge1xuICB2YXIgY29kZSA9IHN0cmlwTlNCKGVtb2ppX2NvZGUpO1xuICB2YXIgd29yZCA9IGVtb2ppQnlDb2RlW2NvZGVdO1xuXG4gIHJldHVybiBpbmNsdWRlQ29sb25zID8gd3JhcENvbG9ucyh3b3JkKSA6IHdvcmQ7XG59O1xuXG4vKipcbiAqIGVtb2ppZnkgYSBzdHJpbmcgKHJlcGxhY2UgOmVtb2ppOiB3aXRoIGFuIGVtb2ppKVxuICogQHBhcmFtICB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBvbl9taXNzaW5nIChnZXRzIGVtb2ppIG5hbWUgd2l0aG91dCA6OiBhbmQgcmV0dXJucyBhIHByb3BlciBlbW9qaSBpZiBubyBlbW9qaSB3YXMgZm91bmQpXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gZm9ybWF0ICh3cmFwIHRoZSByZXR1cm5lZCBlbW9qaSBpbiBhIGN1c3RvbSBlbGVtZW50KVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5FbW9qaS5lbW9qaWZ5ID0gZnVuY3Rpb24gZW1vamlmeSAoc3RyLCBvbl9taXNzaW5nLCBmb3JtYXQpIHtcbiAgaWYgKCFzdHIpIHJldHVybiAnJztcblxuICByZXR1cm4gc3RyLnNwbGl0KGVtb2ppTmFtZVJlZ2V4KSAvLyBwYXJzZSBlbW9qaSB2aWEgcmVnZXhcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gcGFyc2VFbW9qaShzLCBpKSB7XG4gICAgICAgICAgICAgIC8vIGV2ZXJ5IHNlY29uZCBlbGVtZW50IGlzIGFuIGVtb2ppLCBlLmcuIFwidGVzdCA6ZmFzdF9mb3J3YXJkOlwiIC0+IFsgXCJ0ZXN0IFwiLCBcImZhc3RfZm9yd2FyZFwiIF1cbiAgICAgICAgICAgICAgaWYgKGkgJSAyID09PSAwKSByZXR1cm4gcztcbiAgICAgICAgICAgICAgdmFyIGVtb2ppID0gRW1vamkuX2dldChzKTtcbiAgICAgICAgICAgICAgdmFyIGlzTWlzc2luZyA9IGVtb2ppLmluZGV4T2YoJzonKSA+IC0xO1xuXG4gICAgICAgICAgICAgIGlmIChpc01pc3NpbmcgJiYgdHlwZW9mIG9uX21pc3NpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb25fbWlzc2luZyhzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICghaXNNaXNzaW5nICYmIHR5cGVvZiBmb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0KGVtb2ppLCBzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBlbW9qaTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignJykgLy8gY29udmVydCBiYWNrIHRvIHN0cmluZ1xuICA7XG59O1xuXG4vKipcbiAqIHJldHVybiBhIHJhbmRvbSBlbW9qaVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5FbW9qaS5yYW5kb20gPSBmdW5jdGlvbiByYW5kb20gKCkge1xuICB2YXIgZW1vamlLZXlzID0gT2JqZWN0LmtleXMoZW1vamlCeU5hbWUpO1xuICB2YXIgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBlbW9qaUtleXMubGVuZ3RoKTtcbiAgdmFyIGtleSA9IGVtb2ppS2V5c1tyYW5kb21JbmRleF07XG4gIHZhciBlbW9qaSA9IEVtb2ppLl9nZXQoa2V5KTtcbiAgcmV0dXJuIHsga2V5OiBrZXksIGVtb2ppOiBlbW9qaSB9O1xufVxuXG4vKipcbiAqICByZXR1cm4gYW4gY29sbGVjdGlvbiBvZiBwb3RlbnRpYWwgZW1vamkgbWF0Y2hlc1xuICogIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqICBAcmV0dXJuIHtBcnJheS48T2JqZWN0Pn1cbiAqL1xuRW1vamkuc2VhcmNoID0gZnVuY3Rpb24gc2VhcmNoIChzdHIpIHtcbiAgdmFyIGVtb2ppS2V5cyA9IE9iamVjdC5rZXlzKGVtb2ppQnlOYW1lKTtcbiAgdmFyIG1hdGNoZXIgPSBzdHJpcENvbG9ucyhzdHIpXG4gIHZhciBtYXRjaGluZ0tleXMgPSBlbW9qaUtleXMuZmlsdGVyKGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBrZXkudG9TdHJpbmcoKS5pbmRleE9mKG1hdGNoZXIpID09PSAwO1xuICB9KTtcbiAgcmV0dXJuIG1hdGNoaW5nS2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleToga2V5LFxuICAgICAgZW1vamk6IEVtb2ppLl9nZXQoa2V5KSxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiB1bmVtb2ppZnkgYSBzdHJpbmcgKHJlcGxhY2UgZW1vamkgd2l0aCA6ZW1vamk6KVxuICogQHBhcmFtICB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuRW1vamkudW5lbW9qaWZ5ID0gZnVuY3Rpb24gdW5lbW9qaWZ5IChzdHIpIHtcbiAgaWYgKCFzdHIpIHJldHVybiAnJztcbiAgdmFyIHdvcmRzID0gdG9BcnJheShzdHIpO1xuXG4gIHJldHVybiB3b3Jkcy5tYXAoZnVuY3Rpb24od29yZCkge1xuICAgIHJldHVybiBFbW9qaS53aGljaCh3b3JkLCB0cnVlKSB8fCB3b3JkO1xuICB9KS5qb2luKCcnKTtcbn07XG5cbi8qKlxuICogcmVwbGFjZSBlbW9qaXMgd2l0aCByZXBsYWNlbWVudCB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtmdW5jdGlvbnxzdHJpbmd9IHRoZSBzdHJpbmcgb3IgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVwbGFjZSB0aGUgZW1vamkgd2l0aFxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGQgdHJhaWxpbmcgd2hpdGVzcGFjZXMgYmUgY2xlYW5lZD8gRGVmYXVsdHMgZmFsc2VcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuRW1vamkucmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2UgKHN0ciwgcmVwbGFjZW1lbnQsIGNsZWFuU3BhY2VzKSB7XG4gIGlmICghc3RyKSByZXR1cm4gJyc7XG5cbiAgdmFyIHJlcGxhY2UgPSB0eXBlb2YgcmVwbGFjZW1lbnQgPT09ICdmdW5jdGlvbicgPyByZXBsYWNlbWVudCA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gcmVwbGFjZW1lbnQ7IH07XG4gIHZhciB3b3JkcyA9IHRvQXJyYXkoc3RyKTtcblxuICB2YXIgcmVwbGFjZWQgPSB3b3Jkcy5tYXAoZnVuY3Rpb24od29yZCwgaWR4KSB7XG4gICAgdmFyIGVtb2ppID0gRW1vamkuZmluZEJ5Q29kZSh3b3JkKTtcblxuICAgIGlmIChlbW9qaSAmJiBjbGVhblNwYWNlcyAmJiB3b3Jkc1tpZHggKyAxXSA9PT0gJyAnKSB7XG4gICAgICB3b3Jkc1tpZHggKyAxXSA9ICcnO1xuICAgIH1cblxuICAgIHJldHVybiBlbW9qaSA/IHJlcGxhY2UoZW1vamkpIDogd29yZDtcbiAgfSkuam9pbignJyk7XG5cbiAgcmV0dXJuIGNsZWFuU3BhY2VzID8gcmVwbGFjZWQucmVwbGFjZSh0cmltU3BhY2VSZWdleCwgJycpIDogcmVwbGFjZWQ7XG59O1xuXG5cbi8qKlxuICogcmVtb3ZlIGFsbCBlbW9qaXMgZnJvbSBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5FbW9qaS5zdHJpcCA9IGZ1bmN0aW9uIHN0cmlwIChzdHIpIHtcbiAgcmV0dXJuIEVtb2ppLnJlcGxhY2Uoc3RyLCAnJywgdHJ1ZSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVtb2ppO1xuIiwgIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvZW1vamknKTsiLCAiLyohXG4gIENvcHlyaWdodCAoYykgMjAxOCBKZWQgV2F0c29uLlxuICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCksIHNlZVxuICBodHRwOi8vamVkd2F0c29uLmdpdGh1Yi5pby9jbGFzc25hbWVzXG4qL1xuLyogZ2xvYmFsIGRlZmluZSAqL1xuXG4oZnVuY3Rpb24gKCkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIGhhc093biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5cdGZ1bmN0aW9uIGNsYXNzTmFtZXMoKSB7XG5cdFx0dmFyIGNsYXNzZXMgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0aWYgKCFhcmcpIGNvbnRpbnVlO1xuXG5cdFx0XHR2YXIgYXJnVHlwZSA9IHR5cGVvZiBhcmc7XG5cblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJyB8fCBhcmdUeXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRjbGFzc2VzLnB1c2goYXJnKTtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG5cdFx0XHRcdGlmIChhcmcubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dmFyIGlubmVyID0gY2xhc3NOYW1lcy5hcHBseShudWxsLCBhcmcpO1xuXHRcdFx0XHRcdGlmIChpbm5lcikge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGlubmVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYXJnVHlwZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0aWYgKGFyZy50b1N0cmluZyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykge1xuXHRcdFx0XHRcdGZvciAodmFyIGtleSBpbiBhcmcpIHtcblx0XHRcdFx0XHRcdGlmIChoYXNPd24uY2FsbChhcmcsIGtleSkgJiYgYXJnW2tleV0pIHtcblx0XHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNsYXNzZXMucHVzaChhcmcudG9TdHJpbmcoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG5cdH1cblxuXHRpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRjbGFzc05hbWVzLmRlZmF1bHQgPSBjbGFzc05hbWVzO1xuXHRcdG1vZHVsZS5leHBvcnRzID0gY2xhc3NOYW1lcztcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkZWZpbmUuYW1kID09PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gcmVnaXN0ZXIgYXMgJ2NsYXNzbmFtZXMnLCBjb25zaXN0ZW50IHdpdGggbnBtIHBhY2thZ2UgbmFtZVxuXHRcdGRlZmluZSgnY2xhc3NuYW1lcycsIFtdLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gY2xhc3NOYW1lcztcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR3aW5kb3cuY2xhc3NOYW1lcyA9IGNsYXNzTmFtZXM7XG5cdH1cbn0oKSk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiBmb3IgZXhoYXVzdGl2ZSBjaGVja3Mgb2YgZGlzY3JpbWluYXRlZCB1bmlvbnMuXG4gKiBodHRwczovL2Jhc2FyYXQuZ2l0Ym9va3MuaW8vdHlwZXNjcmlwdC9kb2NzL3R5cGVzL2Rpc2NyaW1pbmF0ZWQtdW5pb25zLmh0bWxcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgIHR5cGUgQSA9IHt0eXBlOiAnYSd9O1xuICogICAgdHlwZSBCID0ge3R5cGU6ICdiJ307XG4gKiAgICB0eXBlIFVuaW9uID0gQSB8IEI7XG4gKlxuICogICAgZnVuY3Rpb24gZG9Tb21ldGhpbmcoYXJnOiBVbmlvbikge1xuICogICAgICBpZiAoYXJnLnR5cGUgPT09ICdhJykge1xuICogICAgICAgIHJldHVybiBzb21ldGhpbmc7XG4gKiAgICAgIH1cbiAqXG4gKiAgICAgIGlmIChhcmcudHlwZSA9PT0gJ2InKSB7XG4gKiAgICAgICAgcmV0dXJuIHNvbWV0aGluZ0Vsc2U7XG4gKiAgICAgIH1cbiAqXG4gKiAgICAgIC8vIFRTIHdpbGwgZXJyb3IgaWYgdGhlcmUgYXJlIG90aGVyIHR5cGVzIGluIHRoZSB1bmlvblxuICogICAgICAvLyBXaWxsIHRocm93IGFuIEVycm9yIHdoZW4gY2FsbGVkIGF0IHJ1bnRpbWUuXG4gKiAgICAgIC8vIFVzZSBgYXNzZXJ0TmV2ZXIoYXJnLCB0cnVlKWAgaW5zdGVhZCB0byBmYWlsIHNpbGVudGx5LlxuICogICAgICByZXR1cm4gYXNzZXJ0TmV2ZXIoYXJnKTtcbiAqICAgIH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0TmV2ZXIodmFsdWUsIG5vVGhyb3cpIHtcbiAgICBpZiAobm9UaHJvdykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuaGFuZGxlZCBkaXNjcmltaW5hdGVkIHVuaW9uIG1lbWJlcjogXCIgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xufVxuZXhwb3J0cy5hc3NlcnROZXZlciA9IGFzc2VydE5ldmVyO1xuZXhwb3J0cy5kZWZhdWx0ID0gYXNzZXJ0TmV2ZXI7XG4iLCAiLyohXG5cbkpTWmlwIHYzLjEwLjAgLSBBIEphdmFTY3JpcHQgY2xhc3MgZm9yIGdlbmVyYXRpbmcgYW5kIHJlYWRpbmcgemlwIGZpbGVzXG48aHR0cDovL3N0dWFydGsuY29tL2pzemlwPlxuXG4oYykgMjAwOS0yMDE2IFN0dWFydCBLbmlnaHRsZXkgPHN0dWFydCBbYXRdIHN0dWFydGsuY29tPlxuRHVhbCBsaWNlbmNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2Ugb3IgR1BMdjMuIFNlZSBodHRwczovL3Jhdy5naXRodWIuY29tL1N0dWsvanN6aXAvbWFpbi9MSUNFTlNFLm1hcmtkb3duLlxuXG5KU1ppcCB1c2VzIHRoZSBsaWJyYXJ5IHBha28gcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIDpcbmh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9ibG9iL21haW4vTElDRU5TRVxuKi9cblxuIWZ1bmN0aW9uKGUpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUoKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sZSk7ZWxzZXsoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzKS5KU1ppcD1lKCl9fShmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBzKGEsbyxoKXtmdW5jdGlvbiB1KHIsZSl7aWYoIW9bcl0pe2lmKCFhW3JdKXt2YXIgdD1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFlJiZ0KXJldHVybiB0KHIsITApO2lmKGwpcmV0dXJuIGwociwhMCk7dmFyIG49bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIityK1wiJ1wiKTt0aHJvdyBuLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsbn12YXIgaT1vW3JdPXtleHBvcnRzOnt9fTthW3JdWzBdLmNhbGwoaS5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciB0PWFbcl1bMV1bZV07cmV0dXJuIHUodHx8ZSl9LGksaS5leHBvcnRzLHMsYSxvLGgpfXJldHVybiBvW3JdLmV4cG9ydHN9Zm9yKHZhciBsPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsZT0wO2U8aC5sZW5ndGg7ZSsrKXUoaFtlXSk7cmV0dXJuIHV9KHsxOltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGQ9ZShcIi4vdXRpbHNcIiksYz1lKFwiLi9zdXBwb3J0XCIpLHA9XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO3IuZW5jb2RlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxyLG4saSxzLGEsbyxoPVtdLHU9MCxsPWUubGVuZ3RoLGY9bCxjPVwic3RyaW5nXCIhPT1kLmdldFR5cGVPZihlKTt1PGUubGVuZ3RoOylmPWwtdSxuPWM/KHQ9ZVt1KytdLHI9dTxsP2VbdSsrXTowLHU8bD9lW3UrK106MCk6KHQ9ZS5jaGFyQ29kZUF0KHUrKykscj11PGw/ZS5jaGFyQ29kZUF0KHUrKyk6MCx1PGw/ZS5jaGFyQ29kZUF0KHUrKyk6MCksaT10Pj4yLHM9KDMmdCk8PDR8cj4+NCxhPTE8Zj8oMTUmcik8PDJ8bj4+Njo2NCxvPTI8Zj82MyZuOjY0LGgucHVzaChwLmNoYXJBdChpKStwLmNoYXJBdChzKStwLmNoYXJBdChhKStwLmNoYXJBdChvKSk7cmV0dXJuIGguam9pbihcIlwiKX0sci5kZWNvZGU9ZnVuY3Rpb24oZSl7dmFyIHQscixuLGkscyxhLG89MCxoPTAsdT1cImRhdGE6XCI7aWYoZS5zdWJzdHIoMCx1Lmxlbmd0aCk9PT11KXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYmFzZTY0IGlucHV0LCBpdCBsb29rcyBsaWtlIGEgZGF0YSB1cmwuXCIpO3ZhciBsLGY9MyooZT1lLnJlcGxhY2UoL1teQS1aYS16MC05XFwrXFwvXFw9XS9nLFwiXCIpKS5sZW5ndGgvNDtpZihlLmNoYXJBdChlLmxlbmd0aC0xKT09PXAuY2hhckF0KDY0KSYmZi0tLGUuY2hhckF0KGUubGVuZ3RoLTIpPT09cC5jaGFyQXQoNjQpJiZmLS0sZiUxIT0wKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYmFzZTY0IGlucHV0LCBiYWQgY29udGVudCBsZW5ndGguXCIpO2ZvcihsPWMudWludDhhcnJheT9uZXcgVWludDhBcnJheSgwfGYpOm5ldyBBcnJheSgwfGYpO288ZS5sZW5ndGg7KXQ9cC5pbmRleE9mKGUuY2hhckF0KG8rKykpPDwyfChpPXAuaW5kZXhPZihlLmNoYXJBdChvKyspKSk+PjQscj0oMTUmaSk8PDR8KHM9cC5pbmRleE9mKGUuY2hhckF0KG8rKykpKT4+MixuPSgzJnMpPDw2fChhPXAuaW5kZXhPZihlLmNoYXJBdChvKyspKSksbFtoKytdPXQsNjQhPT1zJiYobFtoKytdPXIpLDY0IT09YSYmKGxbaCsrXT1uKTtyZXR1cm4gbH19LHtcIi4vc3VwcG9ydFwiOjMwLFwiLi91dGlsc1wiOjMyfV0sMjpbZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3ZhciBuPWUoXCIuL2V4dGVybmFsXCIpLGk9ZShcIi4vc3RyZWFtL0RhdGFXb3JrZXJcIikscz1lKFwiLi9zdHJlYW0vQ3JjMzJQcm9iZVwiKSxhPWUoXCIuL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmVcIik7ZnVuY3Rpb24gbyhlLHQscixuLGkpe3RoaXMuY29tcHJlc3NlZFNpemU9ZSx0aGlzLnVuY29tcHJlc3NlZFNpemU9dCx0aGlzLmNyYzMyPXIsdGhpcy5jb21wcmVzc2lvbj1uLHRoaXMuY29tcHJlc3NlZENvbnRlbnQ9aX1vLnByb3RvdHlwZT17Z2V0Q29udGVudFdvcmtlcjpmdW5jdGlvbigpe3ZhciBlPW5ldyBpKG4uUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29tcHJlc3NlZENvbnRlbnQpKS5waXBlKHRoaXMuY29tcHJlc3Npb24udW5jb21wcmVzc1dvcmtlcigpKS5waXBlKG5ldyBhKFwiZGF0YV9sZW5ndGhcIikpLHQ9dGhpcztyZXR1cm4gZS5vbihcImVuZFwiLGZ1bmN0aW9uKCl7aWYodGhpcy5zdHJlYW1JbmZvLmRhdGFfbGVuZ3RoIT09dC51bmNvbXByZXNzZWRTaXplKXRocm93IG5ldyBFcnJvcihcIkJ1ZyA6IHVuY29tcHJlc3NlZCBkYXRhIHNpemUgbWlzbWF0Y2hcIil9KSxlfSxnZXRDb21wcmVzc2VkV29ya2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBpKG4uUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29tcHJlc3NlZENvbnRlbnQpKS53aXRoU3RyZWFtSW5mbyhcImNvbXByZXNzZWRTaXplXCIsdGhpcy5jb21wcmVzc2VkU2l6ZSkud2l0aFN0cmVhbUluZm8oXCJ1bmNvbXByZXNzZWRTaXplXCIsdGhpcy51bmNvbXByZXNzZWRTaXplKS53aXRoU3RyZWFtSW5mbyhcImNyYzMyXCIsdGhpcy5jcmMzMikud2l0aFN0cmVhbUluZm8oXCJjb21wcmVzc2lvblwiLHRoaXMuY29tcHJlc3Npb24pfX0sby5jcmVhdGVXb3JrZXJGcm9tPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZS5waXBlKG5ldyBzKS5waXBlKG5ldyBhKFwidW5jb21wcmVzc2VkU2l6ZVwiKSkucGlwZSh0LmNvbXByZXNzV29ya2VyKHIpKS5waXBlKG5ldyBhKFwiY29tcHJlc3NlZFNpemVcIikpLndpdGhTdHJlYW1JbmZvKFwiY29tcHJlc3Npb25cIix0KX0sdC5leHBvcnRzPW99LHtcIi4vZXh0ZXJuYWxcIjo2LFwiLi9zdHJlYW0vQ3JjMzJQcm9iZVwiOjI1LFwiLi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlXCI6MjYsXCIuL3N0cmVhbS9EYXRhV29ya2VyXCI6Mjd9XSwzOltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49ZShcIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXJcIik7ci5TVE9SRT17bWFnaWM6XCJcXDBcXDBcIixjb21wcmVzc1dvcmtlcjpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IG4oXCJTVE9SRSBjb21wcmVzc2lvblwiKX0sdW5jb21wcmVzc1dvcmtlcjpmdW5jdGlvbigpe3JldHVybiBuZXcgbihcIlNUT1JFIGRlY29tcHJlc3Npb25cIil9fSxyLkRFRkxBVEU9ZShcIi4vZmxhdGVcIil9LHtcIi4vZmxhdGVcIjo3LFwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlclwiOjI4fV0sNDpbZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3ZhciBuPWUoXCIuL3V0aWxzXCIpO3ZhciBvPWZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9W10scj0wO3I8MjU2O3IrKyl7ZT1yO2Zvcih2YXIgbj0wO248ODtuKyspZT0xJmU/Mzk4ODI5MjM4NF5lPj4+MTplPj4+MTt0W3JdPWV9cmV0dXJuIHR9KCk7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMCE9PWUmJmUubGVuZ3RoP1wic3RyaW5nXCIhPT1uLmdldFR5cGVPZihlKT9mdW5jdGlvbihlLHQscixuKXt2YXIgaT1vLHM9bityO2VePS0xO2Zvcih2YXIgYT1uO2E8czthKyspZT1lPj4+OF5pWzI1NSYoZV50W2FdKV07cmV0dXJuLTFeZX0oMHx0LGUsZS5sZW5ndGgsMCk6ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGk9byxzPW4rcjtlXj0tMTtmb3IodmFyIGE9bjthPHM7YSsrKWU9ZT4+PjheaVsyNTUmKGVedC5jaGFyQ29kZUF0KGEpKV07cmV0dXJuLTFeZX0oMHx0LGUsZS5sZW5ndGgsMCk6MH19LHtcIi4vdXRpbHNcIjozMn1dLDU6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjtyLmJhc2U2ND0hMSxyLmJpbmFyeT0hMSxyLmRpcj0hMSxyLmNyZWF0ZUZvbGRlcnM9ITAsci5kYXRlPW51bGwsci5jb21wcmVzc2lvbj1udWxsLHIuY29tcHJlc3Npb25PcHRpb25zPW51bGwsci5jb21tZW50PW51bGwsci51bml4UGVybWlzc2lvbnM9bnVsbCxyLmRvc1Blcm1pc3Npb25zPW51bGx9LHt9XSw2OltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49bnVsbDtuPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBQcm9taXNlP1Byb21pc2U6ZShcImxpZVwiKSx0LmV4cG9ydHM9e1Byb21pc2U6bn19LHtsaWU6Mzd9XSw3OltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFVpbnQ4QXJyYXkmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBVaW50MTZBcnJheSYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFVpbnQzMkFycmF5LGk9ZShcInBha29cIikscz1lKFwiLi91dGlsc1wiKSxhPWUoXCIuL3N0cmVhbS9HZW5lcmljV29ya2VyXCIpLG89bj9cInVpbnQ4YXJyYXlcIjpcImFycmF5XCI7ZnVuY3Rpb24gaChlLHQpe2EuY2FsbCh0aGlzLFwiRmxhdGVXb3JrZXIvXCIrZSksdGhpcy5fcGFrbz1udWxsLHRoaXMuX3Bha29BY3Rpb249ZSx0aGlzLl9wYWtvT3B0aW9ucz10LHRoaXMubWV0YT17fX1yLm1hZ2ljPVwiXFxiXFwwXCIscy5pbmhlcml0cyhoLGEpLGgucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihlKXt0aGlzLm1ldGE9ZS5tZXRhLG51bGw9PT10aGlzLl9wYWtvJiZ0aGlzLl9jcmVhdGVQYWtvKCksdGhpcy5fcGFrby5wdXNoKHMudHJhbnNmb3JtVG8obyxlLmRhdGEpLCExKX0saC5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXthLnByb3RvdHlwZS5mbHVzaC5jYWxsKHRoaXMpLG51bGw9PT10aGlzLl9wYWtvJiZ0aGlzLl9jcmVhdGVQYWtvKCksdGhpcy5fcGFrby5wdXNoKFtdLCEwKX0saC5wcm90b3R5cGUuY2xlYW5VcD1mdW5jdGlvbigpe2EucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKSx0aGlzLl9wYWtvPW51bGx9LGgucHJvdG90eXBlLl9jcmVhdGVQYWtvPWZ1bmN0aW9uKCl7dGhpcy5fcGFrbz1uZXcgaVt0aGlzLl9wYWtvQWN0aW9uXSh7cmF3OiEwLGxldmVsOnRoaXMuX3Bha29PcHRpb25zLmxldmVsfHwtMX0pO3ZhciB0PXRoaXM7dGhpcy5fcGFrby5vbkRhdGE9ZnVuY3Rpb24oZSl7dC5wdXNoKHtkYXRhOmUsbWV0YTp0Lm1ldGF9KX19LHIuY29tcHJlc3NXb3JrZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBoKFwiRGVmbGF0ZVwiLGUpfSxyLnVuY29tcHJlc3NXb3JrZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGgoXCJJbmZsYXRlXCIse30pfX0se1wiLi9zdHJlYW0vR2VuZXJpY1dvcmtlclwiOjI4LFwiLi91dGlsc1wiOjMyLHBha286Mzh9XSw4OltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQShlLHQpe3ZhciByLG49XCJcIjtmb3Iocj0wO3I8dDtyKyspbis9U3RyaW5nLmZyb21DaGFyQ29kZSgyNTUmZSksZT4+Pj04O3JldHVybiBufWZ1bmN0aW9uIG4oZSx0LHIsbixpLHMpe3ZhciBhLG8saD1lLmZpbGUsdT1lLmNvbXByZXNzaW9uLGw9cyE9PU8udXRmOGVuY29kZSxmPUkudHJhbnNmb3JtVG8oXCJzdHJpbmdcIixzKGgubmFtZSkpLGM9SS50cmFuc2Zvcm1UbyhcInN0cmluZ1wiLE8udXRmOGVuY29kZShoLm5hbWUpKSxkPWguY29tbWVudCxwPUkudHJhbnNmb3JtVG8oXCJzdHJpbmdcIixzKGQpKSxtPUkudHJhbnNmb3JtVG8oXCJzdHJpbmdcIixPLnV0ZjhlbmNvZGUoZCkpLF89Yy5sZW5ndGghPT1oLm5hbWUubGVuZ3RoLGc9bS5sZW5ndGghPT1kLmxlbmd0aCxiPVwiXCIsdj1cIlwiLHk9XCJcIix3PWguZGlyLGs9aC5kYXRlLHg9e2NyYzMyOjAsY29tcHJlc3NlZFNpemU6MCx1bmNvbXByZXNzZWRTaXplOjB9O3QmJiFyfHwoeC5jcmMzMj1lLmNyYzMyLHguY29tcHJlc3NlZFNpemU9ZS5jb21wcmVzc2VkU2l6ZSx4LnVuY29tcHJlc3NlZFNpemU9ZS51bmNvbXByZXNzZWRTaXplKTt2YXIgUz0wO3QmJihTfD04KSxsfHwhXyYmIWd8fChTfD0yMDQ4KTt2YXIgej0wLEM9MDt3JiYoenw9MTYpLFwiVU5JWFwiPT09aT8oQz03OTgsenw9ZnVuY3Rpb24oZSx0KXt2YXIgcj1lO3JldHVybiBlfHwocj10PzE2ODkzOjMzMjA0KSwoNjU1MzUmcik8PDE2fShoLnVuaXhQZXJtaXNzaW9ucyx3KSk6KEM9MjAsenw9ZnVuY3Rpb24oZSl7cmV0dXJuIDYzJihlfHwwKX0oaC5kb3NQZXJtaXNzaW9ucykpLGE9ay5nZXRVVENIb3VycygpLGE8PD02LGF8PWsuZ2V0VVRDTWludXRlcygpLGE8PD01LGF8PWsuZ2V0VVRDU2Vjb25kcygpLzIsbz1rLmdldFVUQ0Z1bGxZZWFyKCktMTk4MCxvPDw9NCxvfD1rLmdldFVUQ01vbnRoKCkrMSxvPDw9NSxvfD1rLmdldFVUQ0RhdGUoKSxfJiYodj1BKDEsMSkrQShCKGYpLDQpK2MsYis9XCJ1cFwiK0Eodi5sZW5ndGgsMikrdiksZyYmKHk9QSgxLDEpK0EoQihwKSw0KSttLGIrPVwidWNcIitBKHkubGVuZ3RoLDIpK3kpO3ZhciBFPVwiXCI7cmV0dXJuIEUrPVwiXFxuXFwwXCIsRSs9QShTLDIpLEUrPXUubWFnaWMsRSs9QShhLDIpLEUrPUEobywyKSxFKz1BKHguY3JjMzIsNCksRSs9QSh4LmNvbXByZXNzZWRTaXplLDQpLEUrPUEoeC51bmNvbXByZXNzZWRTaXplLDQpLEUrPUEoZi5sZW5ndGgsMiksRSs9QShiLmxlbmd0aCwyKSx7ZmlsZVJlY29yZDpSLkxPQ0FMX0ZJTEVfSEVBREVSK0UrZitiLGRpclJlY29yZDpSLkNFTlRSQUxfRklMRV9IRUFERVIrQShDLDIpK0UrQShwLmxlbmd0aCwyKStcIlxcMFxcMFxcMFxcMFwiK0Eoeiw0KStBKG4sNCkrZitiK3B9fXZhciBJPWUoXCIuLi91dGlsc1wiKSxpPWUoXCIuLi9zdHJlYW0vR2VuZXJpY1dvcmtlclwiKSxPPWUoXCIuLi91dGY4XCIpLEI9ZShcIi4uL2NyYzMyXCIpLFI9ZShcIi4uL3NpZ25hdHVyZVwiKTtmdW5jdGlvbiBzKGUsdCxyLG4pe2kuY2FsbCh0aGlzLFwiWmlwRmlsZVdvcmtlclwiKSx0aGlzLmJ5dGVzV3JpdHRlbj0wLHRoaXMuemlwQ29tbWVudD10LHRoaXMuemlwUGxhdGZvcm09cix0aGlzLmVuY29kZUZpbGVOYW1lPW4sdGhpcy5zdHJlYW1GaWxlcz1lLHRoaXMuYWNjdW11bGF0ZT0hMSx0aGlzLmNvbnRlbnRCdWZmZXI9W10sdGhpcy5kaXJSZWNvcmRzPVtdLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldD0wLHRoaXMuZW50cmllc0NvdW50PTAsdGhpcy5jdXJyZW50RmlsZT1udWxsLHRoaXMuX3NvdXJjZXM9W119SS5pbmhlcml0cyhzLGkpLHMucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tZXRhLnBlcmNlbnR8fDAscj10aGlzLmVudHJpZXNDb3VudCxuPXRoaXMuX3NvdXJjZXMubGVuZ3RoO3RoaXMuYWNjdW11bGF0ZT90aGlzLmNvbnRlbnRCdWZmZXIucHVzaChlKToodGhpcy5ieXRlc1dyaXR0ZW4rPWUuZGF0YS5sZW5ndGgsaS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMse2RhdGE6ZS5kYXRhLG1ldGE6e2N1cnJlbnRGaWxlOnRoaXMuY3VycmVudEZpbGUscGVyY2VudDpyPyh0KzEwMCooci1uLTEpKS9yOjEwMH19KSl9LHMucHJvdG90eXBlLm9wZW5lZFNvdXJjZT1mdW5jdGlvbihlKXt0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQ9dGhpcy5ieXRlc1dyaXR0ZW4sdGhpcy5jdXJyZW50RmlsZT1lLmZpbGUubmFtZTt2YXIgdD10aGlzLnN0cmVhbUZpbGVzJiYhZS5maWxlLmRpcjtpZih0KXt2YXIgcj1uKGUsdCwhMSx0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQsdGhpcy56aXBQbGF0Zm9ybSx0aGlzLmVuY29kZUZpbGVOYW1lKTt0aGlzLnB1c2goe2RhdGE6ci5maWxlUmVjb3JkLG1ldGE6e3BlcmNlbnQ6MH19KX1lbHNlIHRoaXMuYWNjdW11bGF0ZT0hMH0scy5wcm90b3R5cGUuY2xvc2VkU291cmNlPWZ1bmN0aW9uKGUpe3RoaXMuYWNjdW11bGF0ZT0hMTt2YXIgdD10aGlzLnN0cmVhbUZpbGVzJiYhZS5maWxlLmRpcixyPW4oZSx0LCEwLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldCx0aGlzLnppcFBsYXRmb3JtLHRoaXMuZW5jb2RlRmlsZU5hbWUpO2lmKHRoaXMuZGlyUmVjb3Jkcy5wdXNoKHIuZGlyUmVjb3JkKSx0KXRoaXMucHVzaCh7ZGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gUi5EQVRBX0RFU0NSSVBUT1IrQShlLmNyYzMyLDQpK0EoZS5jb21wcmVzc2VkU2l6ZSw0KStBKGUudW5jb21wcmVzc2VkU2l6ZSw0KX0oZSksbWV0YTp7cGVyY2VudDoxMDB9fSk7ZWxzZSBmb3IodGhpcy5wdXNoKHtkYXRhOnIuZmlsZVJlY29yZCxtZXRhOntwZXJjZW50OjB9fSk7dGhpcy5jb250ZW50QnVmZmVyLmxlbmd0aDspdGhpcy5wdXNoKHRoaXMuY29udGVudEJ1ZmZlci5zaGlmdCgpKTt0aGlzLmN1cnJlbnRGaWxlPW51bGx9LHMucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuYnl0ZXNXcml0dGVuLHQ9MDt0PHRoaXMuZGlyUmVjb3Jkcy5sZW5ndGg7dCsrKXRoaXMucHVzaCh7ZGF0YTp0aGlzLmRpclJlY29yZHNbdF0sbWV0YTp7cGVyY2VudDoxMDB9fSk7dmFyIHI9dGhpcy5ieXRlc1dyaXR0ZW4tZSxuPWZ1bmN0aW9uKGUsdCxyLG4saSl7dmFyIHM9SS50cmFuc2Zvcm1UbyhcInN0cmluZ1wiLGkobikpO3JldHVybiBSLkNFTlRSQUxfRElSRUNUT1JZX0VORCtcIlxcMFxcMFxcMFxcMFwiK0EoZSwyKStBKGUsMikrQSh0LDQpK0Eociw0KStBKHMubGVuZ3RoLDIpK3N9KHRoaXMuZGlyUmVjb3Jkcy5sZW5ndGgscixlLHRoaXMuemlwQ29tbWVudCx0aGlzLmVuY29kZUZpbGVOYW1lKTt0aGlzLnB1c2goe2RhdGE6bixtZXRhOntwZXJjZW50OjEwMH19KX0scy5wcm90b3R5cGUucHJlcGFyZU5leHRTb3VyY2U9ZnVuY3Rpb24oKXt0aGlzLnByZXZpb3VzPXRoaXMuX3NvdXJjZXMuc2hpZnQoKSx0aGlzLm9wZW5lZFNvdXJjZSh0aGlzLnByZXZpb3VzLnN0cmVhbUluZm8pLHRoaXMuaXNQYXVzZWQ/dGhpcy5wcmV2aW91cy5wYXVzZSgpOnRoaXMucHJldmlvdXMucmVzdW1lKCl9LHMucHJvdG90eXBlLnJlZ2lzdGVyUHJldmlvdXM9ZnVuY3Rpb24oZSl7dGhpcy5fc291cmNlcy5wdXNoKGUpO3ZhciB0PXRoaXM7cmV0dXJuIGUub24oXCJkYXRhXCIsZnVuY3Rpb24oZSl7dC5wcm9jZXNzQ2h1bmsoZSl9KSxlLm9uKFwiZW5kXCIsZnVuY3Rpb24oKXt0LmNsb3NlZFNvdXJjZSh0LnByZXZpb3VzLnN0cmVhbUluZm8pLHQuX3NvdXJjZXMubGVuZ3RoP3QucHJlcGFyZU5leHRTb3VyY2UoKTp0LmVuZCgpfSksZS5vbihcImVycm9yXCIsZnVuY3Rpb24oZSl7dC5lcnJvcihlKX0pLHRoaXN9LHMucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiEhaS5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykmJighdGhpcy5wcmV2aW91cyYmdGhpcy5fc291cmNlcy5sZW5ndGg/KHRoaXMucHJlcGFyZU5leHRTb3VyY2UoKSwhMCk6dGhpcy5wcmV2aW91c3x8dGhpcy5fc291cmNlcy5sZW5ndGh8fHRoaXMuZ2VuZXJhdGVkRXJyb3I/dm9pZCAwOih0aGlzLmVuZCgpLCEwKSl9LHMucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3NvdXJjZXM7aWYoIWkucHJvdG90eXBlLmVycm9yLmNhbGwodGhpcyxlKSlyZXR1cm4hMTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl0cnl7dFtyXS5lcnJvcihlKX1jYXRjaChlKXt9cmV0dXJuITB9LHMucHJvdG90eXBlLmxvY2s9ZnVuY3Rpb24oKXtpLnByb3RvdHlwZS5sb2NrLmNhbGwodGhpcyk7Zm9yKHZhciBlPXRoaXMuX3NvdXJjZXMsdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0ubG9jaygpfSx0LmV4cG9ydHM9c30se1wiLi4vY3JjMzJcIjo0LFwiLi4vc2lnbmF0dXJlXCI6MjMsXCIuLi9zdHJlYW0vR2VuZXJpY1dvcmtlclwiOjI4LFwiLi4vdXRmOFwiOjMxLFwiLi4vdXRpbHNcIjozMn1dLDk6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt2YXIgdT1lKFwiLi4vY29tcHJlc3Npb25zXCIpLG49ZShcIi4vWmlwRmlsZVdvcmtlclwiKTtyLmdlbmVyYXRlV29ya2VyPWZ1bmN0aW9uKGUsYSx0KXt2YXIgbz1uZXcgbihhLnN0cmVhbUZpbGVzLHQsYS5wbGF0Zm9ybSxhLmVuY29kZUZpbGVOYW1lKSxoPTA7dHJ5e2UuZm9yRWFjaChmdW5jdGlvbihlLHQpe2grKzt2YXIgcj1mdW5jdGlvbihlLHQpe3ZhciByPWV8fHQsbj11W3JdO2lmKCFuKXRocm93IG5ldyBFcnJvcihyK1wiIGlzIG5vdCBhIHZhbGlkIGNvbXByZXNzaW9uIG1ldGhvZCAhXCIpO3JldHVybiBufSh0Lm9wdGlvbnMuY29tcHJlc3Npb24sYS5jb21wcmVzc2lvbiksbj10Lm9wdGlvbnMuY29tcHJlc3Npb25PcHRpb25zfHxhLmNvbXByZXNzaW9uT3B0aW9uc3x8e30saT10LmRpcixzPXQuZGF0ZTt0Ll9jb21wcmVzc1dvcmtlcihyLG4pLndpdGhTdHJlYW1JbmZvKFwiZmlsZVwiLHtuYW1lOmUsZGlyOmksZGF0ZTpzLGNvbW1lbnQ6dC5jb21tZW50fHxcIlwiLHVuaXhQZXJtaXNzaW9uczp0LnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczp0LmRvc1Blcm1pc3Npb25zfSkucGlwZShvKX0pLG8uZW50cmllc0NvdW50PWh9Y2F0Y2goZSl7by5lcnJvcihlKX1yZXR1cm4gb319LHtcIi4uL2NvbXByZXNzaW9uc1wiOjMsXCIuL1ppcEZpbGVXb3JrZXJcIjo4fV0sMTA6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgbikpcmV0dXJuIG5ldyBuO2lmKGFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiVGhlIGNvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVycyBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLlwiKTt0aGlzLmZpbGVzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5jb21tZW50PW51bGwsdGhpcy5yb290PVwiXCIsdGhpcy5jbG9uZT1mdW5jdGlvbigpe3ZhciBlPW5ldyBuO2Zvcih2YXIgdCBpbiB0aGlzKVwiZnVuY3Rpb25cIiE9dHlwZW9mIHRoaXNbdF0mJihlW3RdPXRoaXNbdF0pO3JldHVybiBlfX0obi5wcm90b3R5cGU9ZShcIi4vb2JqZWN0XCIpKS5sb2FkQXN5bmM9ZShcIi4vbG9hZFwiKSxuLnN1cHBvcnQ9ZShcIi4vc3VwcG9ydFwiKSxuLmRlZmF1bHRzPWUoXCIuL2RlZmF1bHRzXCIpLG4udmVyc2lvbj1cIjMuMTAuMFwiLG4ubG9hZEFzeW5jPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKG5ldyBuKS5sb2FkQXN5bmMoZSx0KX0sbi5leHRlcm5hbD1lKFwiLi9leHRlcm5hbFwiKSx0LmV4cG9ydHM9bn0se1wiLi9kZWZhdWx0c1wiOjUsXCIuL2V4dGVybmFsXCI6NixcIi4vbG9hZFwiOjExLFwiLi9vYmplY3RcIjoxNSxcIi4vc3VwcG9ydFwiOjMwfV0sMTE6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt2YXIgdT1lKFwiLi91dGlsc1wiKSxpPWUoXCIuL2V4dGVybmFsXCIpLG49ZShcIi4vdXRmOFwiKSxzPWUoXCIuL3ppcEVudHJpZXNcIiksYT1lKFwiLi9zdHJlYW0vQ3JjMzJQcm9iZVwiKSxsPWUoXCIuL25vZGVqc1V0aWxzXCIpO2Z1bmN0aW9uIGYobil7cmV0dXJuIG5ldyBpLlByb21pc2UoZnVuY3Rpb24oZSx0KXt2YXIgcj1uLmRlY29tcHJlc3NlZC5nZXRDb250ZW50V29ya2VyKCkucGlwZShuZXcgYSk7ci5vbihcImVycm9yXCIsZnVuY3Rpb24oZSl7dChlKX0pLm9uKFwiZW5kXCIsZnVuY3Rpb24oKXtyLnN0cmVhbUluZm8uY3JjMzIhPT1uLmRlY29tcHJlc3NlZC5jcmMzMj90KG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBDUkMzMiBtaXNtYXRjaFwiKSk6ZSgpfSkucmVzdW1lKCl9KX10LmV4cG9ydHM9ZnVuY3Rpb24oZSxvKXt2YXIgaD10aGlzO3JldHVybiBvPXUuZXh0ZW5kKG98fHt9LHtiYXNlNjQ6ITEsY2hlY2tDUkMzMjohMSxvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6ITEsY3JlYXRlRm9sZGVyczohMSxkZWNvZGVGaWxlTmFtZTpuLnV0ZjhkZWNvZGV9KSxsLmlzTm9kZSYmbC5pc1N0cmVhbShlKT9pLlByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkpTWmlwIGNhbid0IGFjY2VwdCBhIHN0cmVhbSB3aGVuIGxvYWRpbmcgYSB6aXAgZmlsZS5cIikpOnUucHJlcGFyZUNvbnRlbnQoXCJ0aGUgbG9hZGVkIHppcCBmaWxlXCIsZSwhMCxvLm9wdGltaXplZEJpbmFyeVN0cmluZyxvLmJhc2U2NCkudGhlbihmdW5jdGlvbihlKXt2YXIgdD1uZXcgcyhvKTtyZXR1cm4gdC5sb2FkKGUpLHR9KS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PVtpLlByb21pc2UucmVzb2x2ZShlKV0scj1lLmZpbGVzO2lmKG8uY2hlY2tDUkMzMilmb3IodmFyIG49MDtuPHIubGVuZ3RoO24rKyl0LnB1c2goZihyW25dKSk7cmV0dXJuIGkuUHJvbWlzZS5hbGwodCl9KS50aGVuKGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLnNoaWZ0KCkscj10LmZpbGVzLG49MDtuPHIubGVuZ3RoO24rKyl7dmFyIGk9cltuXSxzPWkuZmlsZU5hbWVTdHIsYT11LnJlc29sdmUoaS5maWxlTmFtZVN0cik7aC5maWxlKGEsaS5kZWNvbXByZXNzZWQse2JpbmFyeTohMCxvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6ITAsZGF0ZTppLmRhdGUsZGlyOmkuZGlyLGNvbW1lbnQ6aS5maWxlQ29tbWVudFN0ci5sZW5ndGg/aS5maWxlQ29tbWVudFN0cjpudWxsLHVuaXhQZXJtaXNzaW9uczppLnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczppLmRvc1Blcm1pc3Npb25zLGNyZWF0ZUZvbGRlcnM6by5jcmVhdGVGb2xkZXJzfSksaS5kaXJ8fChoLmZpbGUoYSkudW5zYWZlT3JpZ2luYWxOYW1lPXMpfXJldHVybiB0LnppcENvbW1lbnQubGVuZ3RoJiYoaC5jb21tZW50PXQuemlwQ29tbWVudCksaH0pfX0se1wiLi9leHRlcm5hbFwiOjYsXCIuL25vZGVqc1V0aWxzXCI6MTQsXCIuL3N0cmVhbS9DcmMzMlByb2JlXCI6MjUsXCIuL3V0ZjhcIjozMSxcIi4vdXRpbHNcIjozMixcIi4vemlwRW50cmllc1wiOjMzfV0sMTI6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1lKFwiLi4vdXRpbHNcIiksaT1lKFwiLi4vc3RyZWFtL0dlbmVyaWNXb3JrZXJcIik7ZnVuY3Rpb24gcyhlLHQpe2kuY2FsbCh0aGlzLFwiTm9kZWpzIHN0cmVhbSBpbnB1dCBhZGFwdGVyIGZvciBcIitlKSx0aGlzLl91cHN0cmVhbUVuZGVkPSExLHRoaXMuX2JpbmRTdHJlYW0odCl9bi5pbmhlcml0cyhzLGkpLHMucHJvdG90eXBlLl9iaW5kU3RyZWFtPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7KHRoaXMuX3N0cmVhbT1lKS5wYXVzZSgpLGUub24oXCJkYXRhXCIsZnVuY3Rpb24oZSl7dC5wdXNoKHtkYXRhOmUsbWV0YTp7cGVyY2VudDowfX0pfSkub24oXCJlcnJvclwiLGZ1bmN0aW9uKGUpe3QuaXNQYXVzZWQ/dGhpcy5nZW5lcmF0ZWRFcnJvcj1lOnQuZXJyb3IoZSl9KS5vbihcImVuZFwiLGZ1bmN0aW9uKCl7dC5pc1BhdXNlZD90Ll91cHN0cmVhbUVuZGVkPSEwOnQuZW5kKCl9KX0scy5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4hIWkucHJvdG90eXBlLnBhdXNlLmNhbGwodGhpcykmJih0aGlzLl9zdHJlYW0ucGF1c2UoKSwhMCl9LHMucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiEhaS5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykmJih0aGlzLl91cHN0cmVhbUVuZGVkP3RoaXMuZW5kKCk6dGhpcy5fc3RyZWFtLnJlc3VtZSgpLCEwKX0sdC5leHBvcnRzPXN9LHtcIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyXCI6MjgsXCIuLi91dGlsc1wiOjMyfV0sMTM6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt2YXIgaT1lKFwicmVhZGFibGUtc3RyZWFtXCIpLlJlYWRhYmxlO2Z1bmN0aW9uIG4oZSx0LHIpe2kuY2FsbCh0aGlzLHQpLHRoaXMuX2hlbHBlcj1lO3ZhciBuPXRoaXM7ZS5vbihcImRhdGFcIixmdW5jdGlvbihlLHQpe24ucHVzaChlKXx8bi5faGVscGVyLnBhdXNlKCksciYmcih0KX0pLm9uKFwiZXJyb3JcIixmdW5jdGlvbihlKXtuLmVtaXQoXCJlcnJvclwiLGUpfSkub24oXCJlbmRcIixmdW5jdGlvbigpe24ucHVzaChudWxsKX0pfWUoXCIuLi91dGlsc1wiKS5pbmhlcml0cyhuLGkpLG4ucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKCl7dGhpcy5faGVscGVyLnJlc3VtZSgpfSx0LmV4cG9ydHM9bn0se1wiLi4vdXRpbHNcIjozMixcInJlYWRhYmxlLXN0cmVhbVwiOjE2fV0sMTQ6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt0LmV4cG9ydHM9e2lzTm9kZTpcInVuZGVmaW5lZFwiIT10eXBlb2YgQnVmZmVyLG5ld0J1ZmZlckZyb206ZnVuY3Rpb24oZSx0KXtpZihCdWZmZXIuZnJvbSYmQnVmZmVyLmZyb20hPT1VaW50OEFycmF5LmZyb20pcmV0dXJuIEJ1ZmZlci5mcm9tKGUsdCk7aWYoXCJudW1iZXJcIj09dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJkYXRhXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4gbmV3IEJ1ZmZlcihlLHQpfSxhbGxvY0J1ZmZlcjpmdW5jdGlvbihlKXtpZihCdWZmZXIuYWxsb2MpcmV0dXJuIEJ1ZmZlci5hbGxvYyhlKTt2YXIgdD1uZXcgQnVmZmVyKGUpO3JldHVybiB0LmZpbGwoMCksdH0saXNCdWZmZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihlKX0saXNTdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUub24mJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUucGF1c2UmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUucmVzdW1lfX19LHt9XSwxNTpbZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHMoZSx0LHIpe3ZhciBuLGk9dS5nZXRUeXBlT2YodCkscz11LmV4dGVuZChyfHx7fSxmKTtzLmRhdGU9cy5kYXRlfHxuZXcgRGF0ZSxudWxsIT09cy5jb21wcmVzc2lvbiYmKHMuY29tcHJlc3Npb249cy5jb21wcmVzc2lvbi50b1VwcGVyQ2FzZSgpKSxcInN0cmluZ1wiPT10eXBlb2Ygcy51bml4UGVybWlzc2lvbnMmJihzLnVuaXhQZXJtaXNzaW9ucz1wYXJzZUludChzLnVuaXhQZXJtaXNzaW9ucyw4KSkscy51bml4UGVybWlzc2lvbnMmJjE2Mzg0JnMudW5peFBlcm1pc3Npb25zJiYocy5kaXI9ITApLHMuZG9zUGVybWlzc2lvbnMmJjE2JnMuZG9zUGVybWlzc2lvbnMmJihzLmRpcj0hMCkscy5kaXImJihlPWcoZSkpLHMuY3JlYXRlRm9sZGVycyYmKG49XyhlKSkmJmIuY2FsbCh0aGlzLG4sITApO3ZhciBhPVwic3RyaW5nXCI9PT1pJiYhMT09PXMuYmluYXJ5JiYhMT09PXMuYmFzZTY0O3ImJnZvaWQgMCE9PXIuYmluYXJ5fHwocy5iaW5hcnk9IWEpLCh0IGluc3RhbmNlb2YgYyYmMD09PXQudW5jb21wcmVzc2VkU2l6ZXx8cy5kaXJ8fCF0fHwwPT09dC5sZW5ndGgpJiYocy5iYXNlNjQ9ITEscy5iaW5hcnk9ITAsdD1cIlwiLHMuY29tcHJlc3Npb249XCJTVE9SRVwiLGk9XCJzdHJpbmdcIik7dmFyIG89bnVsbDtvPXQgaW5zdGFuY2VvZiBjfHx0IGluc3RhbmNlb2YgbD90OnAuaXNOb2RlJiZwLmlzU3RyZWFtKHQpP25ldyBtKGUsdCk6dS5wcmVwYXJlQ29udGVudChlLHQscy5iaW5hcnkscy5vcHRpbWl6ZWRCaW5hcnlTdHJpbmcscy5iYXNlNjQpO3ZhciBoPW5ldyBkKGUsbyxzKTt0aGlzLmZpbGVzW2VdPWh9dmFyIGk9ZShcIi4vdXRmOFwiKSx1PWUoXCIuL3V0aWxzXCIpLGw9ZShcIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXJcIiksYT1lKFwiLi9zdHJlYW0vU3RyZWFtSGVscGVyXCIpLGY9ZShcIi4vZGVmYXVsdHNcIiksYz1lKFwiLi9jb21wcmVzc2VkT2JqZWN0XCIpLGQ9ZShcIi4vemlwT2JqZWN0XCIpLG89ZShcIi4vZ2VuZXJhdGVcIikscD1lKFwiLi9ub2RlanNVdGlsc1wiKSxtPWUoXCIuL25vZGVqcy9Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXJcIiksXz1mdW5jdGlvbihlKXtcIi9cIj09PWUuc2xpY2UoLTEpJiYoZT1lLnN1YnN0cmluZygwLGUubGVuZ3RoLTEpKTt2YXIgdD1lLmxhc3RJbmRleE9mKFwiL1wiKTtyZXR1cm4gMDx0P2Uuc3Vic3RyaW5nKDAsdCk6XCJcIn0sZz1mdW5jdGlvbihlKXtyZXR1cm5cIi9cIiE9PWUuc2xpY2UoLTEpJiYoZSs9XCIvXCIpLGV9LGI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD12b2lkIDAhPT10P3Q6Zi5jcmVhdGVGb2xkZXJzLGU9ZyhlKSx0aGlzLmZpbGVzW2VdfHxzLmNhbGwodGhpcyxlLG51bGwse2RpcjohMCxjcmVhdGVGb2xkZXJzOnR9KSx0aGlzLmZpbGVzW2VdfTtmdW5jdGlvbiBoKGUpe3JldHVyblwiW29iamVjdCBSZWdFeHBdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9dmFyIG49e2xvYWQ6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLlwiKX0sZm9yRWFjaDpmdW5jdGlvbihlKXt2YXIgdCxyLG47Zm9yKHQgaW4gdGhpcy5maWxlcyluPXRoaXMuZmlsZXNbdF0sKHI9dC5zbGljZSh0aGlzLnJvb3QubGVuZ3RoLHQubGVuZ3RoKSkmJnQuc2xpY2UoMCx0aGlzLnJvb3QubGVuZ3RoKT09PXRoaXMucm9vdCYmZShyLG4pfSxmaWx0ZXI6ZnVuY3Rpb24ocil7dmFyIG49W107cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihlLHQpe3IoZSx0KSYmbi5wdXNoKHQpfSksbn0sZmlsZTpmdW5jdGlvbihlLHQscil7aWYoMSE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGU9dGhpcy5yb290K2Uscy5jYWxsKHRoaXMsZSx0LHIpLHRoaXM7aWYoaChlKSl7dmFyIG49ZTtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oZSx0KXtyZXR1cm4hdC5kaXImJm4udGVzdChlKX0pfXZhciBpPXRoaXMuZmlsZXNbdGhpcy5yb290K2VdO3JldHVybiBpJiYhaS5kaXI/aTpudWxsfSxmb2xkZXI6ZnVuY3Rpb24ocil7aWYoIXIpcmV0dXJuIHRoaXM7aWYoaChyKSlyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5kaXImJnIudGVzdChlKX0pO3ZhciBlPXRoaXMucm9vdCtyLHQ9Yi5jYWxsKHRoaXMsZSksbj10aGlzLmNsb25lKCk7cmV0dXJuIG4ucm9vdD10Lm5hbWUsbn0scmVtb3ZlOmZ1bmN0aW9uKHIpe3I9dGhpcy5yb290K3I7dmFyIGU9dGhpcy5maWxlc1tyXTtpZihlfHwoXCIvXCIhPT1yLnNsaWNlKC0xKSYmKHIrPVwiL1wiKSxlPXRoaXMuZmlsZXNbcl0pLGUmJiFlLmRpcilkZWxldGUgdGhpcy5maWxlc1tyXTtlbHNlIGZvcih2YXIgdD10aGlzLmZpbHRlcihmdW5jdGlvbihlLHQpe3JldHVybiB0Lm5hbWUuc2xpY2UoMCxyLmxlbmd0aCk9PT1yfSksbj0wO248dC5sZW5ndGg7bisrKWRlbGV0ZSB0aGlzLmZpbGVzW3Rbbl0ubmFtZV07cmV0dXJuIHRoaXN9LGdlbmVyYXRlOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihcIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpfSxnZW5lcmF0ZUludGVybmFsU3RyZWFtOmZ1bmN0aW9uKGUpe3ZhciB0LHI9e307dHJ5e2lmKChyPXUuZXh0ZW5kKGV8fHt9LHtzdHJlYW1GaWxlczohMSxjb21wcmVzc2lvbjpcIlNUT1JFXCIsY29tcHJlc3Npb25PcHRpb25zOm51bGwsdHlwZTpcIlwiLHBsYXRmb3JtOlwiRE9TXCIsY29tbWVudDpudWxsLG1pbWVUeXBlOlwiYXBwbGljYXRpb24vemlwXCIsZW5jb2RlRmlsZU5hbWU6aS51dGY4ZW5jb2RlfSkpLnR5cGU9ci50eXBlLnRvTG93ZXJDYXNlKCksci5jb21wcmVzc2lvbj1yLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCksXCJiaW5hcnlzdHJpbmdcIj09PXIudHlwZSYmKHIudHlwZT1cInN0cmluZ1wiKSwhci50eXBlKXRocm93IG5ldyBFcnJvcihcIk5vIG91dHB1dCB0eXBlIHNwZWNpZmllZC5cIik7dS5jaGVja1N1cHBvcnQoci50eXBlKSxcImRhcndpblwiIT09ci5wbGF0Zm9ybSYmXCJmcmVlYnNkXCIhPT1yLnBsYXRmb3JtJiZcImxpbnV4XCIhPT1yLnBsYXRmb3JtJiZcInN1bm9zXCIhPT1yLnBsYXRmb3JtfHwoci5wbGF0Zm9ybT1cIlVOSVhcIiksXCJ3aW4zMlwiPT09ci5wbGF0Zm9ybSYmKHIucGxhdGZvcm09XCJET1NcIik7dmFyIG49ci5jb21tZW50fHx0aGlzLmNvbW1lbnR8fFwiXCI7dD1vLmdlbmVyYXRlV29ya2VyKHRoaXMscixuKX1jYXRjaChlKXsodD1uZXcgbChcImVycm9yXCIpKS5lcnJvcihlKX1yZXR1cm4gbmV3IGEodCxyLnR5cGV8fFwic3RyaW5nXCIsci5taW1lVHlwZSl9LGdlbmVyYXRlQXN5bmM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5nZW5lcmF0ZUludGVybmFsU3RyZWFtKGUpLmFjY3VtdWxhdGUodCl9LGdlbmVyYXRlTm9kZVN0cmVhbTpmdW5jdGlvbihlLHQpe3JldHVybihlPWV8fHt9KS50eXBlfHwoZS50eXBlPVwibm9kZWJ1ZmZlclwiKSx0aGlzLmdlbmVyYXRlSW50ZXJuYWxTdHJlYW0oZSkudG9Ob2RlanNTdHJlYW0odCl9fTt0LmV4cG9ydHM9bn0se1wiLi9jb21wcmVzc2VkT2JqZWN0XCI6MixcIi4vZGVmYXVsdHNcIjo1LFwiLi9nZW5lcmF0ZVwiOjksXCIuL25vZGVqcy9Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXJcIjoxMixcIi4vbm9kZWpzVXRpbHNcIjoxNCxcIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXJcIjoyOCxcIi4vc3RyZWFtL1N0cmVhbUhlbHBlclwiOjI5LFwiLi91dGY4XCI6MzEsXCIuL3V0aWxzXCI6MzIsXCIuL3ppcE9iamVjdFwiOjM1fV0sMTY6W2Z1bmN0aW9uKGUsdCxyKXt0LmV4cG9ydHM9ZShcInN0cmVhbVwiKX0se3N0cmVhbTp2b2lkIDB9XSwxNzpbZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3ZhciBuPWUoXCIuL0RhdGFSZWFkZXJcIik7ZnVuY3Rpb24gaShlKXtuLmNhbGwodGhpcyxlKTtmb3IodmFyIHQ9MDt0PHRoaXMuZGF0YS5sZW5ndGg7dCsrKWVbdF09MjU1JmVbdF19ZShcIi4uL3V0aWxzXCIpLmluaGVyaXRzKGksbiksaS5wcm90b3R5cGUuYnl0ZUF0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRhdGFbdGhpcy56ZXJvK2VdfSxpLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5jaGFyQ29kZUF0KDApLHI9ZS5jaGFyQ29kZUF0KDEpLG49ZS5jaGFyQ29kZUF0KDIpLGk9ZS5jaGFyQ29kZUF0KDMpLHM9dGhpcy5sZW5ndGgtNDswPD1zOy0tcylpZih0aGlzLmRhdGFbc109PT10JiZ0aGlzLmRhdGFbcysxXT09PXImJnRoaXMuZGF0YVtzKzJdPT09biYmdGhpcy5kYXRhW3MrM109PT1pKXJldHVybiBzLXRoaXMuemVybztyZXR1cm4tMX0saS5wcm90b3R5cGUucmVhZEFuZENoZWNrU2lnbmF0dXJlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2hhckNvZGVBdCgwKSxyPWUuY2hhckNvZGVBdCgxKSxuPWUuY2hhckNvZGVBdCgyKSxpPWUuY2hhckNvZGVBdCgzKSxzPXRoaXMucmVhZERhdGEoNCk7cmV0dXJuIHQ9PT1zWzBdJiZyPT09c1sxXSYmbj09PXNbMl0mJmk9PT1zWzNdfSxpLnByb3RvdHlwZS5yZWFkRGF0YT1mdW5jdGlvbihlKXtpZih0aGlzLmNoZWNrT2Zmc2V0KGUpLDA9PT1lKXJldHVybltdO3ZhciB0PXRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8rdGhpcy5pbmRleCx0aGlzLnplcm8rdGhpcy5pbmRleCtlKTtyZXR1cm4gdGhpcy5pbmRleCs9ZSx0fSx0LmV4cG9ydHM9aX0se1wiLi4vdXRpbHNcIjozMixcIi4vRGF0YVJlYWRlclwiOjE4fV0sMTg6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1lKFwiLi4vdXRpbHNcIik7ZnVuY3Rpb24gaShlKXt0aGlzLmRhdGE9ZSx0aGlzLmxlbmd0aD1lLmxlbmd0aCx0aGlzLmluZGV4PTAsdGhpcy56ZXJvPTB9aS5wcm90b3R5cGU9e2NoZWNrT2Zmc2V0OmZ1bmN0aW9uKGUpe3RoaXMuY2hlY2tJbmRleCh0aGlzLmluZGV4K2UpfSxjaGVja0luZGV4OmZ1bmN0aW9uKGUpe2lmKHRoaXMubGVuZ3RoPHRoaXMuemVybytlfHxlPDApdGhyb3cgbmV3IEVycm9yKFwiRW5kIG9mIGRhdGEgcmVhY2hlZCAoZGF0YSBsZW5ndGggPSBcIit0aGlzLmxlbmd0aCtcIiwgYXNrZWQgaW5kZXggPSBcIitlK1wiKS4gQ29ycnVwdGVkIHppcCA/XCIpfSxzZXRJbmRleDpmdW5jdGlvbihlKXt0aGlzLmNoZWNrSW5kZXgoZSksdGhpcy5pbmRleD1lfSxza2lwOmZ1bmN0aW9uKGUpe3RoaXMuc2V0SW5kZXgodGhpcy5pbmRleCtlKX0sYnl0ZUF0OmZ1bmN0aW9uKGUpe30scmVhZEludDpmdW5jdGlvbihlKXt2YXIgdCxyPTA7Zm9yKHRoaXMuY2hlY2tPZmZzZXQoZSksdD10aGlzLmluZGV4K2UtMTt0Pj10aGlzLmluZGV4O3QtLSlyPShyPDw4KSt0aGlzLmJ5dGVBdCh0KTtyZXR1cm4gdGhpcy5pbmRleCs9ZSxyfSxyZWFkU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiBuLnRyYW5zZm9ybVRvKFwic3RyaW5nXCIsdGhpcy5yZWFkRGF0YShlKSl9LHJlYWREYXRhOmZ1bmN0aW9uKGUpe30sbGFzdEluZGV4T2ZTaWduYXR1cmU6ZnVuY3Rpb24oZSl7fSxyZWFkQW5kQ2hlY2tTaWduYXR1cmU6ZnVuY3Rpb24oZSl7fSxyZWFkRGF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVhZEludCg0KTtyZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoMTk4MCsoZT4+MjUmMTI3KSwoZT4+MjEmMTUpLTEsZT4+MTYmMzEsZT4+MTEmMzEsZT4+NSY2MywoMzEmZSk8PDEpKX19LHQuZXhwb3J0cz1pfSx7XCIuLi91dGlsc1wiOjMyfV0sMTk6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1lKFwiLi9VaW50OEFycmF5UmVhZGVyXCIpO2Z1bmN0aW9uIGkoZSl7bi5jYWxsKHRoaXMsZSl9ZShcIi4uL3V0aWxzXCIpLmluaGVyaXRzKGksbiksaS5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oZSl7dGhpcy5jaGVja09mZnNldChlKTt2YXIgdD10aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvK3RoaXMuaW5kZXgsdGhpcy56ZXJvK3RoaXMuaW5kZXgrZSk7cmV0dXJuIHRoaXMuaW5kZXgrPWUsdH0sdC5leHBvcnRzPWl9LHtcIi4uL3V0aWxzXCI6MzIsXCIuL1VpbnQ4QXJyYXlSZWFkZXJcIjoyMX1dLDIwOltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49ZShcIi4vRGF0YVJlYWRlclwiKTtmdW5jdGlvbiBpKGUpe24uY2FsbCh0aGlzLGUpfWUoXCIuLi91dGlsc1wiKS5pbmhlcml0cyhpLG4pLGkucHJvdG90eXBlLmJ5dGVBdD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy56ZXJvK2UpfSxpLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kYXRhLmxhc3RJbmRleE9mKGUpLXRoaXMuemVyb30saS5wcm90b3R5cGUucmVhZEFuZENoZWNrU2lnbmF0dXJlPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dGhpcy5yZWFkRGF0YSg0KX0saS5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oZSl7dGhpcy5jaGVja09mZnNldChlKTt2YXIgdD10aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvK3RoaXMuaW5kZXgsdGhpcy56ZXJvK3RoaXMuaW5kZXgrZSk7cmV0dXJuIHRoaXMuaW5kZXgrPWUsdH0sdC5leHBvcnRzPWl9LHtcIi4uL3V0aWxzXCI6MzIsXCIuL0RhdGFSZWFkZXJcIjoxOH1dLDIxOltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49ZShcIi4vQXJyYXlSZWFkZXJcIik7ZnVuY3Rpb24gaShlKXtuLmNhbGwodGhpcyxlKX1lKFwiLi4vdXRpbHNcIikuaW5oZXJpdHMoaSxuKSxpLnByb3RvdHlwZS5yZWFkRGF0YT1mdW5jdGlvbihlKXtpZih0aGlzLmNoZWNrT2Zmc2V0KGUpLDA9PT1lKXJldHVybiBuZXcgVWludDhBcnJheSgwKTt2YXIgdD10aGlzLmRhdGEuc3ViYXJyYXkodGhpcy56ZXJvK3RoaXMuaW5kZXgsdGhpcy56ZXJvK3RoaXMuaW5kZXgrZSk7cmV0dXJuIHRoaXMuaW5kZXgrPWUsdH0sdC5leHBvcnRzPWl9LHtcIi4uL3V0aWxzXCI6MzIsXCIuL0FycmF5UmVhZGVyXCI6MTd9XSwyMjpbZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3ZhciBuPWUoXCIuLi91dGlsc1wiKSxpPWUoXCIuLi9zdXBwb3J0XCIpLHM9ZShcIi4vQXJyYXlSZWFkZXJcIiksYT1lKFwiLi9TdHJpbmdSZWFkZXJcIiksbz1lKFwiLi9Ob2RlQnVmZmVyUmVhZGVyXCIpLGg9ZShcIi4vVWludDhBcnJheVJlYWRlclwiKTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bi5nZXRUeXBlT2YoZSk7cmV0dXJuIG4uY2hlY2tTdXBwb3J0KHQpLFwic3RyaW5nXCIhPT10fHxpLnVpbnQ4YXJyYXk/XCJub2RlYnVmZmVyXCI9PT10P25ldyBvKGUpOmkudWludDhhcnJheT9uZXcgaChuLnRyYW5zZm9ybVRvKFwidWludDhhcnJheVwiLGUpKTpuZXcgcyhuLnRyYW5zZm9ybVRvKFwiYXJyYXlcIixlKSk6bmV3IGEoZSl9fSx7XCIuLi9zdXBwb3J0XCI6MzAsXCIuLi91dGlsc1wiOjMyLFwiLi9BcnJheVJlYWRlclwiOjE3LFwiLi9Ob2RlQnVmZmVyUmVhZGVyXCI6MTksXCIuL1N0cmluZ1JlYWRlclwiOjIwLFwiLi9VaW50OEFycmF5UmVhZGVyXCI6MjF9XSwyMzpbZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3IuTE9DQUxfRklMRV9IRUFERVI9XCJQS1x1MDAwM1x1MDAwNFwiLHIuQ0VOVFJBTF9GSUxFX0hFQURFUj1cIlBLXHUwMDAxXHUwMDAyXCIsci5DRU5UUkFMX0RJUkVDVE9SWV9FTkQ9XCJQS1x1MDAwNVx1MDAwNlwiLHIuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUj1cIlBLXHUwMDA2XHUwMDA3XCIsci5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQ9XCJQS1x1MDAwNlx1MDAwNlwiLHIuREFUQV9ERVNDUklQVE9SPVwiUEtcdTAwMDdcXGJcIn0se31dLDI0OltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49ZShcIi4vR2VuZXJpY1dvcmtlclwiKSxpPWUoXCIuLi91dGlsc1wiKTtmdW5jdGlvbiBzKGUpe24uY2FsbCh0aGlzLFwiQ29udmVydFdvcmtlciB0byBcIitlKSx0aGlzLmRlc3RUeXBlPWV9aS5pbmhlcml0cyhzLG4pLHMucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihlKXt0aGlzLnB1c2goe2RhdGE6aS50cmFuc2Zvcm1Ubyh0aGlzLmRlc3RUeXBlLGUuZGF0YSksbWV0YTplLm1ldGF9KX0sdC5leHBvcnRzPXN9LHtcIi4uL3V0aWxzXCI6MzIsXCIuL0dlbmVyaWNXb3JrZXJcIjoyOH1dLDI1OltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49ZShcIi4vR2VuZXJpY1dvcmtlclwiKSxpPWUoXCIuLi9jcmMzMlwiKTtmdW5jdGlvbiBzKCl7bi5jYWxsKHRoaXMsXCJDcmMzMlByb2JlXCIpLHRoaXMud2l0aFN0cmVhbUluZm8oXCJjcmMzMlwiLDApfWUoXCIuLi91dGlsc1wiKS5pbmhlcml0cyhzLG4pLHMucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihlKXt0aGlzLnN0cmVhbUluZm8uY3JjMzI9aShlLmRhdGEsdGhpcy5zdHJlYW1JbmZvLmNyYzMyfHwwKSx0aGlzLnB1c2goZSl9LHQuZXhwb3J0cz1zfSx7XCIuLi9jcmMzMlwiOjQsXCIuLi91dGlsc1wiOjMyLFwiLi9HZW5lcmljV29ya2VyXCI6Mjh9XSwyNjpbZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3ZhciBuPWUoXCIuLi91dGlsc1wiKSxpPWUoXCIuL0dlbmVyaWNXb3JrZXJcIik7ZnVuY3Rpb24gcyhlKXtpLmNhbGwodGhpcyxcIkRhdGFMZW5ndGhQcm9iZSBmb3IgXCIrZSksdGhpcy5wcm9wTmFtZT1lLHRoaXMud2l0aFN0cmVhbUluZm8oZSwwKX1uLmluaGVyaXRzKHMsaSkscy5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PXRoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXXx8MDt0aGlzLnN0cmVhbUluZm9bdGhpcy5wcm9wTmFtZV09dCtlLmRhdGEubGVuZ3RofWkucHJvdG90eXBlLnByb2Nlc3NDaHVuay5jYWxsKHRoaXMsZSl9LHQuZXhwb3J0cz1zfSx7XCIuLi91dGlsc1wiOjMyLFwiLi9HZW5lcmljV29ya2VyXCI6Mjh9XSwyNzpbZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3ZhciBuPWUoXCIuLi91dGlsc1wiKSxpPWUoXCIuL0dlbmVyaWNXb3JrZXJcIik7ZnVuY3Rpb24gcyhlKXtpLmNhbGwodGhpcyxcIkRhdGFXb3JrZXJcIik7dmFyIHQ9dGhpczt0aGlzLmRhdGFJc1JlYWR5PSExLHRoaXMuaW5kZXg9MCx0aGlzLm1heD0wLHRoaXMuZGF0YT1udWxsLHRoaXMudHlwZT1cIlwiLHRoaXMuX3RpY2tTY2hlZHVsZWQ9ITEsZS50aGVuKGZ1bmN0aW9uKGUpe3QuZGF0YUlzUmVhZHk9ITAsdC5kYXRhPWUsdC5tYXg9ZSYmZS5sZW5ndGh8fDAsdC50eXBlPW4uZ2V0VHlwZU9mKGUpLHQuaXNQYXVzZWR8fHQuX3RpY2tBbmRSZXBlYXQoKX0sZnVuY3Rpb24oZSl7dC5lcnJvcihlKX0pfW4uaW5oZXJpdHMocyxpKSxzLnByb3RvdHlwZS5jbGVhblVwPWZ1bmN0aW9uKCl7aS5wcm90b3R5cGUuY2xlYW5VcC5jYWxsKHRoaXMpLHRoaXMuZGF0YT1udWxsfSxzLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIWkucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYoIXRoaXMuX3RpY2tTY2hlZHVsZWQmJnRoaXMuZGF0YUlzUmVhZHkmJih0aGlzLl90aWNrU2NoZWR1bGVkPSEwLG4uZGVsYXkodGhpcy5fdGlja0FuZFJlcGVhdCxbXSx0aGlzKSksITApfSxzLnByb3RvdHlwZS5fdGlja0FuZFJlcGVhdD1mdW5jdGlvbigpe3RoaXMuX3RpY2tTY2hlZHVsZWQ9ITEsdGhpcy5pc1BhdXNlZHx8dGhpcy5pc0ZpbmlzaGVkfHwodGhpcy5fdGljaygpLHRoaXMuaXNGaW5pc2hlZHx8KG4uZGVsYXkodGhpcy5fdGlja0FuZFJlcGVhdCxbXSx0aGlzKSx0aGlzLl90aWNrU2NoZWR1bGVkPSEwKSl9LHMucHJvdG90eXBlLl90aWNrPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1BhdXNlZHx8dGhpcy5pc0ZpbmlzaGVkKXJldHVybiExO3ZhciBlPW51bGwsdD1NYXRoLm1pbih0aGlzLm1heCx0aGlzLmluZGV4KzE2Mzg0KTtpZih0aGlzLmluZGV4Pj10aGlzLm1heClyZXR1cm4gdGhpcy5lbmQoKTtzd2l0Y2godGhpcy50eXBlKXtjYXNlXCJzdHJpbmdcIjplPXRoaXMuZGF0YS5zdWJzdHJpbmcodGhpcy5pbmRleCx0KTticmVhaztjYXNlXCJ1aW50OGFycmF5XCI6ZT10aGlzLmRhdGEuc3ViYXJyYXkodGhpcy5pbmRleCx0KTticmVhaztjYXNlXCJhcnJheVwiOmNhc2VcIm5vZGVidWZmZXJcIjplPXRoaXMuZGF0YS5zbGljZSh0aGlzLmluZGV4LHQpfXJldHVybiB0aGlzLmluZGV4PXQsdGhpcy5wdXNoKHtkYXRhOmUsbWV0YTp7cGVyY2VudDp0aGlzLm1heD90aGlzLmluZGV4L3RoaXMubWF4KjEwMDowfX0pfSx0LmV4cG9ydHM9c30se1wiLi4vdXRpbHNcIjozMixcIi4vR2VuZXJpY1dvcmtlclwiOjI4fV0sMjg6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKGUpe3RoaXMubmFtZT1lfHxcImRlZmF1bHRcIix0aGlzLnN0cmVhbUluZm89e30sdGhpcy5nZW5lcmF0ZWRFcnJvcj1udWxsLHRoaXMuZXh0cmFTdHJlYW1JbmZvPXt9LHRoaXMuaXNQYXVzZWQ9ITAsdGhpcy5pc0ZpbmlzaGVkPSExLHRoaXMuaXNMb2NrZWQ9ITEsdGhpcy5fbGlzdGVuZXJzPXtkYXRhOltdLGVuZDpbXSxlcnJvcjpbXX0sdGhpcy5wcmV2aW91cz1udWxsfW4ucHJvdG90eXBlPXtwdXNoOmZ1bmN0aW9uKGUpe3RoaXMuZW1pdChcImRhdGFcIixlKX0sZW5kOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0ZpbmlzaGVkKXJldHVybiExO3RoaXMuZmx1c2goKTt0cnl7dGhpcy5lbWl0KFwiZW5kXCIpLHRoaXMuY2xlYW5VcCgpLHRoaXMuaXNGaW5pc2hlZD0hMH1jYXRjaChlKXt0aGlzLmVtaXQoXCJlcnJvclwiLGUpfXJldHVybiEwfSxlcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4hdGhpcy5pc0ZpbmlzaGVkJiYodGhpcy5pc1BhdXNlZD90aGlzLmdlbmVyYXRlZEVycm9yPWU6KHRoaXMuaXNGaW5pc2hlZD0hMCx0aGlzLmVtaXQoXCJlcnJvclwiLGUpLHRoaXMucHJldmlvdXMmJnRoaXMucHJldmlvdXMuZXJyb3IoZSksdGhpcy5jbGVhblVwKCkpLCEwKX0sb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fbGlzdGVuZXJzW2VdLnB1c2godCksdGhpc30sY2xlYW5VcDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtSW5mbz10aGlzLmdlbmVyYXRlZEVycm9yPXRoaXMuZXh0cmFTdHJlYW1JbmZvPW51bGwsdGhpcy5fbGlzdGVuZXJzPVtdfSxlbWl0OmZ1bmN0aW9uKGUsdCl7aWYodGhpcy5fbGlzdGVuZXJzW2VdKWZvcih2YXIgcj0wO3I8dGhpcy5fbGlzdGVuZXJzW2VdLmxlbmd0aDtyKyspdGhpcy5fbGlzdGVuZXJzW2VdW3JdLmNhbGwodGhpcyx0KX0scGlwZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWdpc3RlclByZXZpb3VzKHRoaXMpfSxyZWdpc3RlclByZXZpb3VzOmZ1bmN0aW9uKGUpe2lmKHRoaXMuaXNMb2NrZWQpdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0cmVhbSAnXCIrdGhpcytcIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLlwiKTt0aGlzLnN0cmVhbUluZm89ZS5zdHJlYW1JbmZvLHRoaXMubWVyZ2VTdHJlYW1JbmZvKCksdGhpcy5wcmV2aW91cz1lO3ZhciB0PXRoaXM7cmV0dXJuIGUub24oXCJkYXRhXCIsZnVuY3Rpb24oZSl7dC5wcm9jZXNzQ2h1bmsoZSl9KSxlLm9uKFwiZW5kXCIsZnVuY3Rpb24oKXt0LmVuZCgpfSksZS5vbihcImVycm9yXCIsZnVuY3Rpb24oZSl7dC5lcnJvcihlKX0pLHRoaXN9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNQYXVzZWQmJiF0aGlzLmlzRmluaXNoZWQmJih0aGlzLmlzUGF1c2VkPSEwLHRoaXMucHJldmlvdXMmJnRoaXMucHJldmlvdXMucGF1c2UoKSwhMCl9LHJlc3VtZTpmdW5jdGlvbigpe2lmKCF0aGlzLmlzUGF1c2VkfHx0aGlzLmlzRmluaXNoZWQpcmV0dXJuITE7dmFyIGU9dGhpcy5pc1BhdXNlZD0hMTtyZXR1cm4gdGhpcy5nZW5lcmF0ZWRFcnJvciYmKHRoaXMuZXJyb3IodGhpcy5nZW5lcmF0ZWRFcnJvciksZT0hMCksdGhpcy5wcmV2aW91cyYmdGhpcy5wcmV2aW91cy5yZXN1bWUoKSwhZX0sZmx1c2g6ZnVuY3Rpb24oKXt9LHByb2Nlc3NDaHVuazpmdW5jdGlvbihlKXt0aGlzLnB1c2goZSl9LHdpdGhTdHJlYW1JbmZvOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZXh0cmFTdHJlYW1JbmZvW2VdPXQsdGhpcy5tZXJnZVN0cmVhbUluZm8oKSx0aGlzfSxtZXJnZVN0cmVhbUluZm86ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5leHRyYVN0cmVhbUluZm8pdGhpcy5leHRyYVN0cmVhbUluZm8uaGFzT3duUHJvcGVydHkoZSkmJih0aGlzLnN0cmVhbUluZm9bZV09dGhpcy5leHRyYVN0cmVhbUluZm9bZV0pfSxsb2NrOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0xvY2tlZCl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3RyZWFtICdcIit0aGlzK1wiJyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuXCIpO3RoaXMuaXNMb2NrZWQ9ITAsdGhpcy5wcmV2aW91cyYmdGhpcy5wcmV2aW91cy5sb2NrKCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGU9XCJXb3JrZXIgXCIrdGhpcy5uYW1lO3JldHVybiB0aGlzLnByZXZpb3VzP3RoaXMucHJldmlvdXMrXCIgLT4gXCIrZTplfX0sdC5leHBvcnRzPW59LHt9XSwyOTpbZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3ZhciBoPWUoXCIuLi91dGlsc1wiKSxpPWUoXCIuL0NvbnZlcnRXb3JrZXJcIikscz1lKFwiLi9HZW5lcmljV29ya2VyXCIpLHU9ZShcIi4uL2Jhc2U2NFwiKSxuPWUoXCIuLi9zdXBwb3J0XCIpLGE9ZShcIi4uL2V4dGVybmFsXCIpLG89bnVsbDtpZihuLm5vZGVzdHJlYW0pdHJ5e289ZShcIi4uL25vZGVqcy9Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyXCIpfWNhdGNoKGUpe31mdW5jdGlvbiBsKGUsbyl7cmV0dXJuIG5ldyBhLlByb21pc2UoZnVuY3Rpb24odCxyKXt2YXIgbj1bXSxpPWUuX2ludGVybmFsVHlwZSxzPWUuX291dHB1dFR5cGUsYT1lLl9taW1lVHlwZTtlLm9uKFwiZGF0YVwiLGZ1bmN0aW9uKGUsdCl7bi5wdXNoKGUpLG8mJm8odCl9KS5vbihcImVycm9yXCIsZnVuY3Rpb24oZSl7bj1bXSxyKGUpfSkub24oXCJlbmRcIixmdW5jdGlvbigpe3RyeXt2YXIgZT1mdW5jdGlvbihlLHQscil7c3dpdGNoKGUpe2Nhc2VcImJsb2JcIjpyZXR1cm4gaC5uZXdCbG9iKGgudHJhbnNmb3JtVG8oXCJhcnJheWJ1ZmZlclwiLHQpLHIpO2Nhc2VcImJhc2U2NFwiOnJldHVybiB1LmVuY29kZSh0KTtkZWZhdWx0OnJldHVybiBoLnRyYW5zZm9ybVRvKGUsdCl9fShzLGZ1bmN0aW9uKGUsdCl7dmFyIHIsbj0wLGk9bnVsbCxzPTA7Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKylzKz10W3JdLmxlbmd0aDtzd2l0Y2goZSl7Y2FzZVwic3RyaW5nXCI6cmV0dXJuIHQuam9pbihcIlwiKTtjYXNlXCJhcnJheVwiOnJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLHQpO2Nhc2VcInVpbnQ4YXJyYXlcIjpmb3IoaT1uZXcgVWludDhBcnJheShzKSxyPTA7cjx0Lmxlbmd0aDtyKyspaS5zZXQodFtyXSxuKSxuKz10W3JdLmxlbmd0aDtyZXR1cm4gaTtjYXNlXCJub2RlYnVmZmVyXCI6cmV0dXJuIEJ1ZmZlci5jb25jYXQodCk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoXCJjb25jYXQgOiB1bnN1cHBvcnRlZCB0eXBlICdcIitlK1wiJ1wiKX19KGksbiksYSk7dChlKX1jYXRjaChlKXtyKGUpfW49W119KS5yZXN1bWUoKX0pfWZ1bmN0aW9uIGYoZSx0LHIpe3ZhciBuPXQ7c3dpdGNoKHQpe2Nhc2VcImJsb2JcIjpjYXNlXCJhcnJheWJ1ZmZlclwiOm49XCJ1aW50OGFycmF5XCI7YnJlYWs7Y2FzZVwiYmFzZTY0XCI6bj1cInN0cmluZ1wifXRyeXt0aGlzLl9pbnRlcm5hbFR5cGU9bix0aGlzLl9vdXRwdXRUeXBlPXQsdGhpcy5fbWltZVR5cGU9cixoLmNoZWNrU3VwcG9ydChuKSx0aGlzLl93b3JrZXI9ZS5waXBlKG5ldyBpKG4pKSxlLmxvY2soKX1jYXRjaChlKXt0aGlzLl93b3JrZXI9bmV3IHMoXCJlcnJvclwiKSx0aGlzLl93b3JrZXIuZXJyb3IoZSl9fWYucHJvdG90eXBlPXthY2N1bXVsYXRlOmZ1bmN0aW9uKGUpe3JldHVybiBsKHRoaXMsZSl9LG9uOmZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcztyZXR1cm5cImRhdGFcIj09PWU/dGhpcy5fd29ya2VyLm9uKGUsZnVuY3Rpb24oZSl7dC5jYWxsKHIsZS5kYXRhLGUubWV0YSl9KTp0aGlzLl93b3JrZXIub24oZSxmdW5jdGlvbigpe2guZGVsYXkodCxhcmd1bWVudHMscil9KSx0aGlzfSxyZXN1bWU6ZnVuY3Rpb24oKXtyZXR1cm4gaC5kZWxheSh0aGlzLl93b3JrZXIucmVzdW1lLFtdLHRoaXMuX3dvcmtlciksdGhpc30scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd29ya2VyLnBhdXNlKCksdGhpc30sdG9Ob2RlanNTdHJlYW06ZnVuY3Rpb24oZSl7aWYoaC5jaGVja1N1cHBvcnQoXCJub2Rlc3RyZWFtXCIpLFwibm9kZWJ1ZmZlclwiIT09dGhpcy5fb3V0cHV0VHlwZSl0aHJvdyBuZXcgRXJyb3IodGhpcy5fb3V0cHV0VHlwZStcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbWV0aG9kXCIpO3JldHVybiBuZXcgbyh0aGlzLHtvYmplY3RNb2RlOlwibm9kZWJ1ZmZlclwiIT09dGhpcy5fb3V0cHV0VHlwZX0sZSl9fSx0LmV4cG9ydHM9Zn0se1wiLi4vYmFzZTY0XCI6MSxcIi4uL2V4dGVybmFsXCI6NixcIi4uL25vZGVqcy9Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyXCI6MTMsXCIuLi9zdXBwb3J0XCI6MzAsXCIuLi91dGlsc1wiOjMyLFwiLi9Db252ZXJ0V29ya2VyXCI6MjQsXCIuL0dlbmVyaWNXb3JrZXJcIjoyOH1dLDMwOltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7aWYoci5iYXNlNjQ9ITAsci5hcnJheT0hMCxyLnN0cmluZz0hMCxyLmFycmF5YnVmZmVyPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFVpbnQ4QXJyYXksci5ub2RlYnVmZmVyPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBCdWZmZXIsci51aW50OGFycmF5PVwidW5kZWZpbmVkXCIhPXR5cGVvZiBVaW50OEFycmF5LFwidW5kZWZpbmVkXCI9PXR5cGVvZiBBcnJheUJ1ZmZlcilyLmJsb2I9ITE7ZWxzZXt2YXIgbj1uZXcgQXJyYXlCdWZmZXIoMCk7dHJ5e3IuYmxvYj0wPT09bmV3IEJsb2IoW25dLHt0eXBlOlwiYXBwbGljYXRpb24vemlwXCJ9KS5zaXplfWNhdGNoKGUpe3RyeXt2YXIgaT1uZXcoc2VsZi5CbG9iQnVpbGRlcnx8c2VsZi5XZWJLaXRCbG9iQnVpbGRlcnx8c2VsZi5Nb3pCbG9iQnVpbGRlcnx8c2VsZi5NU0Jsb2JCdWlsZGVyKTtpLmFwcGVuZChuKSxyLmJsb2I9MD09PWkuZ2V0QmxvYihcImFwcGxpY2F0aW9uL3ppcFwiKS5zaXplfWNhdGNoKGUpe3IuYmxvYj0hMX19fXRyeXtyLm5vZGVzdHJlYW09ISFlKFwicmVhZGFibGUtc3RyZWFtXCIpLlJlYWRhYmxlfWNhdGNoKGUpe3Iubm9kZXN0cmVhbT0hMX19LHtcInJlYWRhYmxlLXN0cmVhbVwiOjE2fV0sMzE6W2Z1bmN0aW9uKGUsdCxzKXtcInVzZSBzdHJpY3RcIjtmb3IodmFyIG89ZShcIi4vdXRpbHNcIiksaD1lKFwiLi9zdXBwb3J0XCIpLHI9ZShcIi4vbm9kZWpzVXRpbHNcIiksbj1lKFwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlclwiKSx1PW5ldyBBcnJheSgyNTYpLGk9MDtpPDI1NjtpKyspdVtpXT0yNTI8PWk/NjoyNDg8PWk/NToyNDA8PWk/NDoyMjQ8PWk/MzoxOTI8PWk/MjoxO3VbMjU0XT11WzI1NF09MTtmdW5jdGlvbiBhKCl7bi5jYWxsKHRoaXMsXCJ1dGYtOCBkZWNvZGVcIiksdGhpcy5sZWZ0T3Zlcj1udWxsfWZ1bmN0aW9uIGwoKXtuLmNhbGwodGhpcyxcInV0Zi04IGVuY29kZVwiKX1zLnV0ZjhlbmNvZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGgubm9kZWJ1ZmZlcj9yLm5ld0J1ZmZlckZyb20oZSxcInV0Zi04XCIpOmZ1bmN0aW9uKGUpe3ZhciB0LHIsbixpLHMsYT1lLmxlbmd0aCxvPTA7Zm9yKGk9MDtpPGE7aSsrKTU1Mjk2PT0oNjQ1MTImKHI9ZS5jaGFyQ29kZUF0KGkpKSkmJmkrMTxhJiY1NjMyMD09KDY0NTEyJihuPWUuY2hhckNvZGVBdChpKzEpKSkmJihyPTY1NTM2KyhyLTU1Mjk2PDwxMCkrKG4tNTYzMjApLGkrKyksbys9cjwxMjg/MTpyPDIwNDg/MjpyPDY1NTM2PzM6NDtmb3IodD1oLnVpbnQ4YXJyYXk/bmV3IFVpbnQ4QXJyYXkobyk6bmV3IEFycmF5KG8pLGk9cz0wO3M8bztpKyspNTUyOTY9PSg2NDUxMiYocj1lLmNoYXJDb2RlQXQoaSkpKSYmaSsxPGEmJjU2MzIwPT0oNjQ1MTImKG49ZS5jaGFyQ29kZUF0KGkrMSkpKSYmKHI9NjU1MzYrKHItNTUyOTY8PDEwKSsobi01NjMyMCksaSsrKSxyPDEyOD90W3MrK109cjoocjwyMDQ4P3RbcysrXT0xOTJ8cj4+PjY6KHI8NjU1MzY/dFtzKytdPTIyNHxyPj4+MTI6KHRbcysrXT0yNDB8cj4+PjE4LHRbcysrXT0xMjh8cj4+PjEyJjYzKSx0W3MrK109MTI4fHI+Pj42JjYzKSx0W3MrK109MTI4fDYzJnIpO3JldHVybiB0fShlKX0scy51dGY4ZGVjb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBoLm5vZGVidWZmZXI/by50cmFuc2Zvcm1UbyhcIm5vZGVidWZmZXJcIixlKS50b1N0cmluZyhcInV0Zi04XCIpOmZ1bmN0aW9uKGUpe3ZhciB0LHIsbixpLHM9ZS5sZW5ndGgsYT1uZXcgQXJyYXkoMipzKTtmb3IodD1yPTA7dDxzOylpZigobj1lW3QrK10pPDEyOClhW3IrK109bjtlbHNlIGlmKDQ8KGk9dVtuXSkpYVtyKytdPTY1NTMzLHQrPWktMTtlbHNle2ZvcihuJj0yPT09aT8zMTozPT09aT8xNTo3OzE8aSYmdDxzOyluPW48PDZ8NjMmZVt0KytdLGktLTsxPGk/YVtyKytdPTY1NTMzOm48NjU1MzY/YVtyKytdPW46KG4tPTY1NTM2LGFbcisrXT01NTI5NnxuPj4xMCYxMDIzLGFbcisrXT01NjMyMHwxMDIzJm4pfXJldHVybiBhLmxlbmd0aCE9PXImJihhLnN1YmFycmF5P2E9YS5zdWJhcnJheSgwLHIpOmEubGVuZ3RoPXIpLG8uYXBwbHlGcm9tQ2hhckNvZGUoYSl9KGU9by50cmFuc2Zvcm1UbyhoLnVpbnQ4YXJyYXk/XCJ1aW50OGFycmF5XCI6XCJhcnJheVwiLGUpKX0sby5pbmhlcml0cyhhLG4pLGEucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihlKXt2YXIgdD1vLnRyYW5zZm9ybVRvKGgudWludDhhcnJheT9cInVpbnQ4YXJyYXlcIjpcImFycmF5XCIsZS5kYXRhKTtpZih0aGlzLmxlZnRPdmVyJiZ0aGlzLmxlZnRPdmVyLmxlbmd0aCl7aWYoaC51aW50OGFycmF5KXt2YXIgcj10Oyh0PW5ldyBVaW50OEFycmF5KHIubGVuZ3RoK3RoaXMubGVmdE92ZXIubGVuZ3RoKSkuc2V0KHRoaXMubGVmdE92ZXIsMCksdC5zZXQocix0aGlzLmxlZnRPdmVyLmxlbmd0aCl9ZWxzZSB0PXRoaXMubGVmdE92ZXIuY29uY2F0KHQpO3RoaXMubGVmdE92ZXI9bnVsbH12YXIgbj1mdW5jdGlvbihlLHQpe3ZhciByO2ZvcigodD10fHxlLmxlbmd0aCk+ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSxyPXQtMTswPD1yJiYxMjg9PSgxOTImZVtyXSk7KXItLTtyZXR1cm4gcjwwP3Q6MD09PXI/dDpyK3VbZVtyXV0+dD9yOnR9KHQpLGk9dDtuIT09dC5sZW5ndGgmJihoLnVpbnQ4YXJyYXk/KGk9dC5zdWJhcnJheSgwLG4pLHRoaXMubGVmdE92ZXI9dC5zdWJhcnJheShuLHQubGVuZ3RoKSk6KGk9dC5zbGljZSgwLG4pLHRoaXMubGVmdE92ZXI9dC5zbGljZShuLHQubGVuZ3RoKSkpLHRoaXMucHVzaCh7ZGF0YTpzLnV0ZjhkZWNvZGUoaSksbWV0YTplLm1ldGF9KX0sYS5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXt0aGlzLmxlZnRPdmVyJiZ0aGlzLmxlZnRPdmVyLmxlbmd0aCYmKHRoaXMucHVzaCh7ZGF0YTpzLnV0ZjhkZWNvZGUodGhpcy5sZWZ0T3ZlciksbWV0YTp7fX0pLHRoaXMubGVmdE92ZXI9bnVsbCl9LHMuVXRmOERlY29kZVdvcmtlcj1hLG8uaW5oZXJpdHMobCxuKSxsLnByb3RvdHlwZS5wcm9jZXNzQ2h1bms9ZnVuY3Rpb24oZSl7dGhpcy5wdXNoKHtkYXRhOnMudXRmOGVuY29kZShlLmRhdGEpLG1ldGE6ZS5tZXRhfSl9LHMuVXRmOEVuY29kZVdvcmtlcj1sfSx7XCIuL25vZGVqc1V0aWxzXCI6MTQsXCIuL3N0cmVhbS9HZW5lcmljV29ya2VyXCI6MjgsXCIuL3N1cHBvcnRcIjozMCxcIi4vdXRpbHNcIjozMn1dLDMyOltmdW5jdGlvbihlLHQsYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIG89ZShcIi4vc3VwcG9ydFwiKSxoPWUoXCIuL2Jhc2U2NFwiKSxyPWUoXCIuL25vZGVqc1V0aWxzXCIpLHU9ZShcIi4vZXh0ZXJuYWxcIik7ZnVuY3Rpb24gbihlKXtyZXR1cm4gZX1mdW5jdGlvbiBsKGUsdCl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDsrK3IpdFtyXT0yNTUmZS5jaGFyQ29kZUF0KHIpO3JldHVybiB0fWUoXCJzZXRpbW1lZGlhdGVcIiksYS5uZXdCbG9iPWZ1bmN0aW9uKHQscil7YS5jaGVja1N1cHBvcnQoXCJibG9iXCIpO3RyeXtyZXR1cm4gbmV3IEJsb2IoW3RdLHt0eXBlOnJ9KX1jYXRjaChlKXt0cnl7dmFyIG49bmV3KHNlbGYuQmxvYkJ1aWxkZXJ8fHNlbGYuV2ViS2l0QmxvYkJ1aWxkZXJ8fHNlbGYuTW96QmxvYkJ1aWxkZXJ8fHNlbGYuTVNCbG9iQnVpbGRlcik7cmV0dXJuIG4uYXBwZW5kKHQpLG4uZ2V0QmxvYihyKX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoXCJCdWcgOiBjYW4ndCBjb25zdHJ1Y3QgdGhlIEJsb2IuXCIpfX19O3ZhciBpPXtzdHJpbmdpZnlCeUNodW5rOmZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1bXSxpPTAscz1lLmxlbmd0aDtpZihzPD1yKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZSk7Zm9yKDtpPHM7KVwiYXJyYXlcIj09PXR8fFwibm9kZWJ1ZmZlclwiPT09dD9uLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGUuc2xpY2UoaSxNYXRoLm1pbihpK3IscykpKSk6bi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxlLnN1YmFycmF5KGksTWF0aC5taW4oaStyLHMpKSkpLGkrPXI7cmV0dXJuIG4uam9pbihcIlwiKX0sc3RyaW5naWZ5QnlDaGFyOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1cIlwiLHI9MDtyPGUubGVuZ3RoO3IrKyl0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbcl0pO3JldHVybiB0fSxhcHBseUNhbkJlVXNlZDp7dWludDhhcnJheTpmdW5jdGlvbigpe3RyeXtyZXR1cm4gby51aW50OGFycmF5JiYxPT09U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50OEFycmF5KDEpKS5sZW5ndGh9Y2F0Y2goZSl7cmV0dXJuITF9fSgpLG5vZGVidWZmZXI6ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG8ubm9kZWJ1ZmZlciYmMT09PVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxyLmFsbG9jQnVmZmVyKDEpKS5sZW5ndGh9Y2F0Y2goZSl7cmV0dXJuITF9fSgpfX07ZnVuY3Rpb24gcyhlKXt2YXIgdD02NTUzNixyPWEuZ2V0VHlwZU9mKGUpLG49ITA7aWYoXCJ1aW50OGFycmF5XCI9PT1yP249aS5hcHBseUNhbkJlVXNlZC51aW50OGFycmF5Olwibm9kZWJ1ZmZlclwiPT09ciYmKG49aS5hcHBseUNhbkJlVXNlZC5ub2RlYnVmZmVyKSxuKWZvcig7MTx0Oyl0cnl7cmV0dXJuIGkuc3RyaW5naWZ5QnlDaHVuayhlLHIsdCl9Y2F0Y2goZSl7dD1NYXRoLmZsb29yKHQvMil9cmV0dXJuIGkuc3RyaW5naWZ5QnlDaGFyKGUpfWZ1bmN0aW9uIGYoZSx0KXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl0W3JdPWVbcl07cmV0dXJuIHR9YS5hcHBseUZyb21DaGFyQ29kZT1zO3ZhciBjPXt9O2Muc3RyaW5nPXtzdHJpbmc6bixhcnJheTpmdW5jdGlvbihlKXtyZXR1cm4gbChlLG5ldyBBcnJheShlLmxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gYy5zdHJpbmcudWludDhhcnJheShlKS5idWZmZXJ9LHVpbnQ4YXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIGwoZSxuZXcgVWludDhBcnJheShlLmxlbmd0aCkpfSxub2RlYnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBsKGUsci5hbGxvY0J1ZmZlcihlLmxlbmd0aCkpfX0sYy5hcnJheT17c3RyaW5nOnMsYXJyYXk6bixhcnJheWJ1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSkuYnVmZmVyfSx1aW50OGFycmF5OmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgVWludDhBcnJheShlKX0sbm9kZWJ1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gci5uZXdCdWZmZXJGcm9tKGUpfX0sYy5hcnJheWJ1ZmZlcj17c3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiBzKG5ldyBVaW50OEFycmF5KGUpKX0sYXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIGYobmV3IFVpbnQ4QXJyYXkoZSksbmV3IEFycmF5KGUuYnl0ZUxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpuLHVpbnQ4YXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KGUpfSxub2RlYnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiByLm5ld0J1ZmZlckZyb20obmV3IFVpbnQ4QXJyYXkoZSkpfX0sYy51aW50OGFycmF5PXtzdHJpbmc6cyxhcnJheTpmdW5jdGlvbihlKXtyZXR1cm4gZihlLG5ldyBBcnJheShlLmxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gZS5idWZmZXJ9LHVpbnQ4YXJyYXk6bixub2RlYnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiByLm5ld0J1ZmZlckZyb20oZSl9fSxjLm5vZGVidWZmZXI9e3N0cmluZzpzLGFycmF5OmZ1bmN0aW9uKGUpe3JldHVybiBmKGUsbmV3IEFycmF5KGUubGVuZ3RoKSl9LGFycmF5YnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBjLm5vZGVidWZmZXIudWludDhhcnJheShlKS5idWZmZXJ9LHVpbnQ4YXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSxuZXcgVWludDhBcnJheShlLmxlbmd0aCkpfSxub2RlYnVmZmVyOm59LGEudHJhbnNmb3JtVG89ZnVuY3Rpb24oZSx0KXtpZih0PXR8fFwiXCIsIWUpcmV0dXJuIHQ7YS5jaGVja1N1cHBvcnQoZSk7dmFyIHI9YS5nZXRUeXBlT2YodCk7cmV0dXJuIGNbcl1bZV0odCl9LGEucmVzb2x2ZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5zcGxpdChcIi9cIikscj1bXSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl07XCIuXCI9PT1pfHxcIlwiPT09aSYmMCE9PW4mJm4hPT10Lmxlbmd0aC0xfHwoXCIuLlwiPT09aT9yLnBvcCgpOnIucHVzaChpKSl9cmV0dXJuIHIuam9pbihcIi9cIil9LGEuZ2V0VHlwZU9mPWZ1bmN0aW9uKGUpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBlP1wic3RyaW5nXCI6XCJbb2JqZWN0IEFycmF5XVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpP1wiYXJyYXlcIjpvLm5vZGVidWZmZXImJnIuaXNCdWZmZXIoZSk/XCJub2RlYnVmZmVyXCI6by51aW50OGFycmF5JiZlIGluc3RhbmNlb2YgVWludDhBcnJheT9cInVpbnQ4YXJyYXlcIjpvLmFycmF5YnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/XCJhcnJheWJ1ZmZlclwiOnZvaWQgMH0sYS5jaGVja1N1cHBvcnQ9ZnVuY3Rpb24oZSl7aWYoIW9bZS50b0xvd2VyQ2FzZSgpXSl0aHJvdyBuZXcgRXJyb3IoZStcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcGxhdGZvcm1cIil9LGEuTUFYX1ZBTFVFXzE2QklUUz02NTUzNSxhLk1BWF9WQUxVRV8zMkJJVFM9LTEsYS5wcmV0dHk9ZnVuY3Rpb24oZSl7dmFyIHQscixuPVwiXCI7Zm9yKHI9MDtyPChlfHxcIlwiKS5sZW5ndGg7cisrKW4rPVwiXFxcXHhcIisoKHQ9ZS5jaGFyQ29kZUF0KHIpKTwxNj9cIjBcIjpcIlwiKSt0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO3JldHVybiBufSxhLmRlbGF5PWZ1bmN0aW9uKGUsdCxyKXtzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKXtlLmFwcGx5KHJ8fG51bGwsdHx8W10pfSl9LGEuaW5oZXJpdHM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKCl7fXIucHJvdG90eXBlPXQucHJvdG90eXBlLGUucHJvdG90eXBlPW5ldyByfSxhLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBlLHQscj17fTtmb3IoZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspZm9yKHQgaW4gYXJndW1lbnRzW2VdKWFyZ3VtZW50c1tlXS5oYXNPd25Qcm9wZXJ0eSh0KSYmdm9pZCAwPT09clt0XSYmKHJbdF09YXJndW1lbnRzW2VdW3RdKTtyZXR1cm4gcn0sYS5wcmVwYXJlQ29udGVudD1mdW5jdGlvbihyLGUsbixpLHMpe3JldHVybiB1LlByb21pc2UucmVzb2x2ZShlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiBvLmJsb2ImJihuIGluc3RhbmNlb2YgQmxvYnx8LTEhPT1bXCJbb2JqZWN0IEZpbGVdXCIsXCJbb2JqZWN0IEJsb2JdXCJdLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG4pKSkmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBGaWxlUmVhZGVyP25ldyB1LlByb21pc2UoZnVuY3Rpb24odCxyKXt2YXIgZT1uZXcgRmlsZVJlYWRlcjtlLm9ubG9hZD1mdW5jdGlvbihlKXt0KGUudGFyZ2V0LnJlc3VsdCl9LGUub25lcnJvcj1mdW5jdGlvbihlKXtyKGUudGFyZ2V0LmVycm9yKX0sZS5yZWFkQXNBcnJheUJ1ZmZlcihuKX0pOm59KS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWEuZ2V0VHlwZU9mKGUpO3JldHVybiB0PyhcImFycmF5YnVmZmVyXCI9PT10P2U9YS50cmFuc2Zvcm1UbyhcInVpbnQ4YXJyYXlcIixlKTpcInN0cmluZ1wiPT09dCYmKHM/ZT1oLmRlY29kZShlKTpuJiYhMCE9PWkmJihlPWZ1bmN0aW9uKGUpe3JldHVybiBsKGUsby51aW50OGFycmF5P25ldyBVaW50OEFycmF5KGUubGVuZ3RoKTpuZXcgQXJyYXkoZS5sZW5ndGgpKX0oZSkpKSxlKTp1LlByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkNhbid0IHJlYWQgdGhlIGRhdGEgb2YgJ1wiK3IrXCInLiBJcyBpdCBpbiBhIHN1cHBvcnRlZCBKYXZhU2NyaXB0IHR5cGUgKFN0cmluZywgQmxvYiwgQXJyYXlCdWZmZXIsIGV0YykgP1wiKSl9KX19LHtcIi4vYmFzZTY0XCI6MSxcIi4vZXh0ZXJuYWxcIjo2LFwiLi9ub2RlanNVdGlsc1wiOjE0LFwiLi9zdXBwb3J0XCI6MzAsc2V0aW1tZWRpYXRlOjU0fV0sMzM6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1lKFwiLi9yZWFkZXIvcmVhZGVyRm9yXCIpLGk9ZShcIi4vdXRpbHNcIikscz1lKFwiLi9zaWduYXR1cmVcIiksYT1lKFwiLi96aXBFbnRyeVwiKSxvPShlKFwiLi91dGY4XCIpLGUoXCIuL3N1cHBvcnRcIikpO2Z1bmN0aW9uIGgoZSl7dGhpcy5maWxlcz1bXSx0aGlzLmxvYWRPcHRpb25zPWV9aC5wcm90b3R5cGU9e2NoZWNrU2lnbmF0dXJlOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLnJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmUoZSkpe3RoaXMucmVhZGVyLmluZGV4LT00O3ZhciB0PXRoaXMucmVhZGVyLnJlYWRTdHJpbmcoNCk7dGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCBvciBidWc6IHVuZXhwZWN0ZWQgc2lnbmF0dXJlIChcIitpLnByZXR0eSh0KStcIiwgZXhwZWN0ZWQgXCIraS5wcmV0dHkoZSkrXCIpXCIpfX0saXNTaWduYXR1cmU6ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzLnJlYWRlci5pbmRleDt0aGlzLnJlYWRlci5zZXRJbmRleChlKTt2YXIgbj10aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpPT09dDtyZXR1cm4gdGhpcy5yZWFkZXIuc2V0SW5kZXgociksbn0scmVhZEJsb2NrRW5kT2ZDZW50cmFsOmZ1bmN0aW9uKCl7dGhpcy5kaXNrTnVtYmVyPXRoaXMucmVhZGVyLnJlYWRJbnQoMiksdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrPXRoaXMucmVhZGVyLnJlYWRJbnQoMiksdGhpcy5jZW50cmFsRGlyUmVjb3Jkcz10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuY2VudHJhbERpclNpemU9dGhpcy5yZWFkZXIucmVhZEludCg0KSx0aGlzLmNlbnRyYWxEaXJPZmZzZXQ9dGhpcy5yZWFkZXIucmVhZEludCg0KSx0aGlzLnppcENvbW1lbnRMZW5ndGg9dGhpcy5yZWFkZXIucmVhZEludCgyKTt2YXIgZT10aGlzLnJlYWRlci5yZWFkRGF0YSh0aGlzLnppcENvbW1lbnRMZW5ndGgpLHQ9by51aW50OGFycmF5P1widWludDhhcnJheVwiOlwiYXJyYXlcIixyPWkudHJhbnNmb3JtVG8odCxlKTt0aGlzLnppcENvbW1lbnQ9dGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShyKX0scmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWw6ZnVuY3Rpb24oKXt0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZT10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMucmVhZGVyLnNraXAoNCksdGhpcy5kaXNrTnVtYmVyPXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD10aGlzLnJlYWRlci5yZWFkSW50KDQpLHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5jZW50cmFsRGlyUmVjb3Jkcz10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMuY2VudHJhbERpclNpemU9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLmNlbnRyYWxEaXJPZmZzZXQ9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLnppcDY0RXh0ZW5zaWJsZURhdGE9e307Zm9yKHZhciBlLHQscixuPXRoaXMuemlwNjRFbmRPZkNlbnRyYWxTaXplLTQ0OzA8bjspZT10aGlzLnJlYWRlci5yZWFkSW50KDIpLHQ9dGhpcy5yZWFkZXIucmVhZEludCg0KSxyPXRoaXMucmVhZGVyLnJlYWREYXRhKHQpLHRoaXMuemlwNjRFeHRlbnNpYmxlRGF0YVtlXT17aWQ6ZSxsZW5ndGg6dCx2YWx1ZTpyfX0scmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWxMb2NhdG9yOmZ1bmN0aW9uKCl7aWYodGhpcy5kaXNrV2l0aFppcDY0Q2VudHJhbERpclN0YXJ0PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5kaXNrc0NvdW50PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksMTx0aGlzLmRpc2tzQ291bnQpdGhyb3cgbmV3IEVycm9yKFwiTXVsdGktdm9sdW1lcyB6aXAgYXJlIG5vdCBzdXBwb3J0ZWRcIil9LHJlYWRMb2NhbEZpbGVzOmZ1bmN0aW9uKCl7dmFyIGUsdDtmb3IoZT0wO2U8dGhpcy5maWxlcy5sZW5ndGg7ZSsrKXQ9dGhpcy5maWxlc1tlXSx0aGlzLnJlYWRlci5zZXRJbmRleCh0LmxvY2FsSGVhZGVyT2Zmc2V0KSx0aGlzLmNoZWNrU2lnbmF0dXJlKHMuTE9DQUxfRklMRV9IRUFERVIpLHQucmVhZExvY2FsUGFydCh0aGlzLnJlYWRlciksdC5oYW5kbGVVVEY4KCksdC5wcm9jZXNzQXR0cmlidXRlcygpfSxyZWFkQ2VudHJhbERpcjpmdW5jdGlvbigpe3ZhciBlO2Zvcih0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLmNlbnRyYWxEaXJPZmZzZXQpO3RoaXMucmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZShzLkNFTlRSQUxfRklMRV9IRUFERVIpOykoZT1uZXcgYSh7emlwNjQ6dGhpcy56aXA2NH0sdGhpcy5sb2FkT3B0aW9ucykpLnJlYWRDZW50cmFsUGFydCh0aGlzLnJlYWRlciksdGhpcy5maWxlcy5wdXNoKGUpO2lmKHRoaXMuY2VudHJhbERpclJlY29yZHMhPT10aGlzLmZpbGVzLmxlbmd0aCYmMCE9PXRoaXMuY2VudHJhbERpclJlY29yZHMmJjA9PT10aGlzLmZpbGVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIG9yIGJ1ZzogZXhwZWN0ZWQgXCIrdGhpcy5jZW50cmFsRGlyUmVjb3JkcytcIiByZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3QgXCIrdGhpcy5maWxlcy5sZW5ndGgpfSxyZWFkRW5kT2ZDZW50cmFsOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUocy5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO2lmKGU8MCl0aHJvdyF0aGlzLmlzU2lnbmF0dXJlKDAscy5MT0NBTF9GSUxFX0hFQURFUik/bmV3IEVycm9yKFwiQ2FuJ3QgZmluZCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgOiBpcyB0aGlzIGEgemlwIGZpbGUgPyBJZiBpdCBpcywgc2VlIGh0dHBzOi8vc3R1ay5naXRodWIuaW8vanN6aXAvZG9jdW1lbnRhdGlvbi9ob3d0by9yZWFkX3ppcC5odG1sXCIpOm5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXA6IGNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XCIpO3RoaXMucmVhZGVyLnNldEluZGV4KGUpO3ZhciB0PWU7aWYodGhpcy5jaGVja1NpZ25hdHVyZShzLkNFTlRSQUxfRElSRUNUT1JZX0VORCksdGhpcy5yZWFkQmxvY2tFbmRPZkNlbnRyYWwoKSx0aGlzLmRpc2tOdW1iZXI9PT1pLk1BWF9WQUxVRV8xNkJJVFN8fHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQ9PT1pLk1BWF9WQUxVRV8xNkJJVFN8fHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrPT09aS5NQVhfVkFMVUVfMTZCSVRTfHx0aGlzLmNlbnRyYWxEaXJSZWNvcmRzPT09aS5NQVhfVkFMVUVfMTZCSVRTfHx0aGlzLmNlbnRyYWxEaXJTaXplPT09aS5NQVhfVkFMVUVfMzJCSVRTfHx0aGlzLmNlbnRyYWxEaXJPZmZzZXQ9PT1pLk1BWF9WQUxVRV8zMkJJVFMpe2lmKHRoaXMuemlwNjQ9ITAsKGU9dGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUocy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKSk8MCl0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwOiBjYW4ndCBmaW5kIHRoZSBaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvclwiKTtpZih0aGlzLnJlYWRlci5zZXRJbmRleChlKSx0aGlzLmNoZWNrU2lnbmF0dXJlKHMuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiksdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3IoKSwhdGhpcy5pc1NpZ25hdHVyZSh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIscy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpJiYodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyPXRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKHMuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSx0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXI8MCkpdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcDogY2FuJ3QgZmluZCB0aGUgWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XCIpO3RoaXMucmVhZGVyLnNldEluZGV4KHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciksdGhpcy5jaGVja1NpZ25hdHVyZShzLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCksdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbCgpfXZhciByPXRoaXMuY2VudHJhbERpck9mZnNldCt0aGlzLmNlbnRyYWxEaXJTaXplO3RoaXMuemlwNjQmJihyKz0yMCxyKz0xMit0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZSk7dmFyIG49dC1yO2lmKDA8bil0aGlzLmlzU2lnbmF0dXJlKHQscy5DRU5UUkFMX0ZJTEVfSEVBREVSKXx8KHRoaXMucmVhZGVyLnplcm89bik7ZWxzZSBpZihuPDApdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcDogbWlzc2luZyBcIitNYXRoLmFicyhuKStcIiBieXRlcy5cIil9LHByZXBhcmVSZWFkZXI6ZnVuY3Rpb24oZSl7dGhpcy5yZWFkZXI9bihlKX0sbG9hZDpmdW5jdGlvbihlKXt0aGlzLnByZXBhcmVSZWFkZXIoZSksdGhpcy5yZWFkRW5kT2ZDZW50cmFsKCksdGhpcy5yZWFkQ2VudHJhbERpcigpLHRoaXMucmVhZExvY2FsRmlsZXMoKX19LHQuZXhwb3J0cz1ofSx7XCIuL3JlYWRlci9yZWFkZXJGb3JcIjoyMixcIi4vc2lnbmF0dXJlXCI6MjMsXCIuL3N1cHBvcnRcIjozMCxcIi4vdXRmOFwiOjMxLFwiLi91dGlsc1wiOjMyLFwiLi96aXBFbnRyeVwiOjM0fV0sMzQ6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1lKFwiLi9yZWFkZXIvcmVhZGVyRm9yXCIpLHM9ZShcIi4vdXRpbHNcIiksaT1lKFwiLi9jb21wcmVzc2VkT2JqZWN0XCIpLGE9ZShcIi4vY3JjMzJcIiksbz1lKFwiLi91dGY4XCIpLGg9ZShcIi4vY29tcHJlc3Npb25zXCIpLHU9ZShcIi4vc3VwcG9ydFwiKTtmdW5jdGlvbiBsKGUsdCl7dGhpcy5vcHRpb25zPWUsdGhpcy5sb2FkT3B0aW9ucz10fWwucHJvdG90eXBlPXtpc0VuY3J5cHRlZDpmdW5jdGlvbigpe3JldHVybiAxPT0oMSZ0aGlzLmJpdEZsYWcpfSx1c2VVVEY4OmZ1bmN0aW9uKCl7cmV0dXJuIDIwNDg9PSgyMDQ4JnRoaXMuYml0RmxhZyl9LHJlYWRMb2NhbFBhcnQ6ZnVuY3Rpb24oZSl7dmFyIHQscjtpZihlLnNraXAoMjIpLHRoaXMuZmlsZU5hbWVMZW5ndGg9ZS5yZWFkSW50KDIpLHI9ZS5yZWFkSW50KDIpLHRoaXMuZmlsZU5hbWU9ZS5yZWFkRGF0YSh0aGlzLmZpbGVOYW1lTGVuZ3RoKSxlLnNraXAociksLTE9PT10aGlzLmNvbXByZXNzZWRTaXplfHwtMT09PXRoaXMudW5jb21wcmVzc2VkU2l6ZSl0aHJvdyBuZXcgRXJyb3IoXCJCdWcgb3IgY29ycnVwdGVkIHppcCA6IGRpZG4ndCBnZXQgZW5vdWdoIGluZm9ybWF0aW9uIGZyb20gdGhlIGNlbnRyYWwgZGlyZWN0b3J5IChjb21wcmVzc2VkU2l6ZSA9PT0gLTEgfHwgdW5jb21wcmVzc2VkU2l6ZSA9PT0gLTEpXCIpO2lmKG51bGw9PT0odD1mdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gaClpZihoLmhhc093blByb3BlcnR5KHQpJiZoW3RdLm1hZ2ljPT09ZSlyZXR1cm4gaFt0XTtyZXR1cm4gbnVsbH0odGhpcy5jb21wcmVzc2lvbk1ldGhvZCkpKXRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBjb21wcmVzc2lvbiBcIitzLnByZXR0eSh0aGlzLmNvbXByZXNzaW9uTWV0aG9kKStcIiB1bmtub3duIChpbm5lciBmaWxlIDogXCIrcy50cmFuc2Zvcm1UbyhcInN0cmluZ1wiLHRoaXMuZmlsZU5hbWUpK1wiKVwiKTt0aGlzLmRlY29tcHJlc3NlZD1uZXcgaSh0aGlzLmNvbXByZXNzZWRTaXplLHRoaXMudW5jb21wcmVzc2VkU2l6ZSx0aGlzLmNyYzMyLHQsZS5yZWFkRGF0YSh0aGlzLmNvbXByZXNzZWRTaXplKSl9LHJlYWRDZW50cmFsUGFydDpmdW5jdGlvbihlKXt0aGlzLnZlcnNpb25NYWRlQnk9ZS5yZWFkSW50KDIpLGUuc2tpcCgyKSx0aGlzLmJpdEZsYWc9ZS5yZWFkSW50KDIpLHRoaXMuY29tcHJlc3Npb25NZXRob2Q9ZS5yZWFkU3RyaW5nKDIpLHRoaXMuZGF0ZT1lLnJlYWREYXRlKCksdGhpcy5jcmMzMj1lLnJlYWRJbnQoNCksdGhpcy5jb21wcmVzc2VkU2l6ZT1lLnJlYWRJbnQoNCksdGhpcy51bmNvbXByZXNzZWRTaXplPWUucmVhZEludCg0KTt2YXIgdD1lLnJlYWRJbnQoMik7aWYodGhpcy5leHRyYUZpZWxkc0xlbmd0aD1lLnJlYWRJbnQoMiksdGhpcy5maWxlQ29tbWVudExlbmd0aD1lLnJlYWRJbnQoMiksdGhpcy5kaXNrTnVtYmVyU3RhcnQ9ZS5yZWFkSW50KDIpLHRoaXMuaW50ZXJuYWxGaWxlQXR0cmlidXRlcz1lLnJlYWRJbnQoMiksdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzPWUucmVhZEludCg0KSx0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0PWUucmVhZEludCg0KSx0aGlzLmlzRW5jcnlwdGVkKCkpdGhyb3cgbmV3IEVycm9yKFwiRW5jcnlwdGVkIHppcCBhcmUgbm90IHN1cHBvcnRlZFwiKTtlLnNraXAodCksdGhpcy5yZWFkRXh0cmFGaWVsZHMoZSksdGhpcy5wYXJzZVpJUDY0RXh0cmFGaWVsZChlKSx0aGlzLmZpbGVDb21tZW50PWUucmVhZERhdGEodGhpcy5maWxlQ29tbWVudExlbmd0aCl9LHByb2Nlc3NBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7dGhpcy51bml4UGVybWlzc2lvbnM9bnVsbCx0aGlzLmRvc1Blcm1pc3Npb25zPW51bGw7dmFyIGU9dGhpcy52ZXJzaW9uTWFkZUJ5Pj44O3RoaXMuZGlyPSEhKDE2JnRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyksMD09ZSYmKHRoaXMuZG9zUGVybWlzc2lvbnM9NjMmdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzKSwzPT1lJiYodGhpcy51bml4UGVybWlzc2lvbnM9dGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzPj4xNiY2NTUzNSksdGhpcy5kaXJ8fFwiL1wiIT09dGhpcy5maWxlTmFtZVN0ci5zbGljZSgtMSl8fCh0aGlzLmRpcj0hMCl9LHBhcnNlWklQNjRFeHRyYUZpZWxkOmZ1bmN0aW9uKGUpe2lmKHRoaXMuZXh0cmFGaWVsZHNbMV0pe3ZhciB0PW4odGhpcy5leHRyYUZpZWxkc1sxXS52YWx1ZSk7dGhpcy51bmNvbXByZXNzZWRTaXplPT09cy5NQVhfVkFMVUVfMzJCSVRTJiYodGhpcy51bmNvbXByZXNzZWRTaXplPXQucmVhZEludCg4KSksdGhpcy5jb21wcmVzc2VkU2l6ZT09PXMuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMuY29tcHJlc3NlZFNpemU9dC5yZWFkSW50KDgpKSx0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0PT09cy5NQVhfVkFMVUVfMzJCSVRTJiYodGhpcy5sb2NhbEhlYWRlck9mZnNldD10LnJlYWRJbnQoOCkpLHRoaXMuZGlza051bWJlclN0YXJ0PT09cy5NQVhfVkFMVUVfMzJCSVRTJiYodGhpcy5kaXNrTnVtYmVyU3RhcnQ9dC5yZWFkSW50KDQpKX19LHJlYWRFeHRyYUZpZWxkczpmdW5jdGlvbihlKXt2YXIgdCxyLG4saT1lLmluZGV4K3RoaXMuZXh0cmFGaWVsZHNMZW5ndGg7Zm9yKHRoaXMuZXh0cmFGaWVsZHN8fCh0aGlzLmV4dHJhRmllbGRzPXt9KTtlLmluZGV4KzQ8aTspdD1lLnJlYWRJbnQoMikscj1lLnJlYWRJbnQoMiksbj1lLnJlYWREYXRhKHIpLHRoaXMuZXh0cmFGaWVsZHNbdF09e2lkOnQsbGVuZ3RoOnIsdmFsdWU6bn07ZS5zZXRJbmRleChpKX0saGFuZGxlVVRGODpmdW5jdGlvbigpe3ZhciBlPXUudWludDhhcnJheT9cInVpbnQ4YXJyYXlcIjpcImFycmF5XCI7aWYodGhpcy51c2VVVEY4KCkpdGhpcy5maWxlTmFtZVN0cj1vLnV0ZjhkZWNvZGUodGhpcy5maWxlTmFtZSksdGhpcy5maWxlQ29tbWVudFN0cj1vLnV0ZjhkZWNvZGUodGhpcy5maWxlQ29tbWVudCk7ZWxzZXt2YXIgdD10aGlzLmZpbmRFeHRyYUZpZWxkVW5pY29kZVBhdGgoKTtpZihudWxsIT09dCl0aGlzLmZpbGVOYW1lU3RyPXQ7ZWxzZXt2YXIgcj1zLnRyYW5zZm9ybVRvKGUsdGhpcy5maWxlTmFtZSk7dGhpcy5maWxlTmFtZVN0cj10aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKHIpfXZhciBuPXRoaXMuZmluZEV4dHJhRmllbGRVbmljb2RlQ29tbWVudCgpO2lmKG51bGwhPT1uKXRoaXMuZmlsZUNvbW1lbnRTdHI9bjtlbHNle3ZhciBpPXMudHJhbnNmb3JtVG8oZSx0aGlzLmZpbGVDb21tZW50KTt0aGlzLmZpbGVDb21tZW50U3RyPXRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoaSl9fX0sZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZXh0cmFGaWVsZHNbMjg3ODldO2lmKGUpe3ZhciB0PW4oZS52YWx1ZSk7cmV0dXJuIDEhPT10LnJlYWRJbnQoMSk/bnVsbDphKHRoaXMuZmlsZU5hbWUpIT09dC5yZWFkSW50KDQpP251bGw6by51dGY4ZGVjb2RlKHQucmVhZERhdGEoZS5sZW5ndGgtNSkpfXJldHVybiBudWxsfSxmaW5kRXh0cmFGaWVsZFVuaWNvZGVDb21tZW50OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5leHRyYUZpZWxkc1syNTQ2MV07aWYoZSl7dmFyIHQ9bihlLnZhbHVlKTtyZXR1cm4gMSE9PXQucmVhZEludCgxKT9udWxsOmEodGhpcy5maWxlQ29tbWVudCkhPT10LnJlYWRJbnQoNCk/bnVsbDpvLnV0ZjhkZWNvZGUodC5yZWFkRGF0YShlLmxlbmd0aC01KSl9cmV0dXJuIG51bGx9fSx0LmV4cG9ydHM9bH0se1wiLi9jb21wcmVzc2VkT2JqZWN0XCI6MixcIi4vY29tcHJlc3Npb25zXCI6MyxcIi4vY3JjMzJcIjo0LFwiLi9yZWFkZXIvcmVhZGVyRm9yXCI6MjIsXCIuL3N1cHBvcnRcIjozMCxcIi4vdXRmOFwiOjMxLFwiLi91dGlsc1wiOjMyfV0sMzU6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKGUsdCxyKXt0aGlzLm5hbWU9ZSx0aGlzLmRpcj1yLmRpcix0aGlzLmRhdGU9ci5kYXRlLHRoaXMuY29tbWVudD1yLmNvbW1lbnQsdGhpcy51bml4UGVybWlzc2lvbnM9ci51bml4UGVybWlzc2lvbnMsdGhpcy5kb3NQZXJtaXNzaW9ucz1yLmRvc1Blcm1pc3Npb25zLHRoaXMuX2RhdGE9dCx0aGlzLl9kYXRhQmluYXJ5PXIuYmluYXJ5LHRoaXMub3B0aW9ucz17Y29tcHJlc3Npb246ci5jb21wcmVzc2lvbixjb21wcmVzc2lvbk9wdGlvbnM6ci5jb21wcmVzc2lvbk9wdGlvbnN9fXZhciBzPWUoXCIuL3N0cmVhbS9TdHJlYW1IZWxwZXJcIiksaT1lKFwiLi9zdHJlYW0vRGF0YVdvcmtlclwiKSxhPWUoXCIuL3V0ZjhcIiksbz1lKFwiLi9jb21wcmVzc2VkT2JqZWN0XCIpLGg9ZShcIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXJcIik7bi5wcm90b3R5cGU9e2ludGVybmFsU3RyZWFtOmZ1bmN0aW9uKGUpe3ZhciB0PW51bGwscj1cInN0cmluZ1wiO3RyeXtpZighZSl0aHJvdyBuZXcgRXJyb3IoXCJObyBvdXRwdXQgdHlwZSBzcGVjaWZpZWQuXCIpO3ZhciBuPVwic3RyaW5nXCI9PT0ocj1lLnRvTG93ZXJDYXNlKCkpfHxcInRleHRcIj09PXI7XCJiaW5hcnlzdHJpbmdcIiE9PXImJlwidGV4dFwiIT09cnx8KHI9XCJzdHJpbmdcIiksdD10aGlzLl9kZWNvbXByZXNzV29ya2VyKCk7dmFyIGk9IXRoaXMuX2RhdGFCaW5hcnk7aSYmIW4mJih0PXQucGlwZShuZXcgYS5VdGY4RW5jb2RlV29ya2VyKSksIWkmJm4mJih0PXQucGlwZShuZXcgYS5VdGY4RGVjb2RlV29ya2VyKSl9Y2F0Y2goZSl7KHQ9bmV3IGgoXCJlcnJvclwiKSkuZXJyb3IoZSl9cmV0dXJuIG5ldyBzKHQscixcIlwiKX0sYXN5bmM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5pbnRlcm5hbFN0cmVhbShlKS5hY2N1bXVsYXRlKHQpfSxub2RlU3RyZWFtOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuaW50ZXJuYWxTdHJlYW0oZXx8XCJub2RlYnVmZmVyXCIpLnRvTm9kZWpzU3RyZWFtKHQpfSxfY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLl9kYXRhIGluc3RhbmNlb2YgbyYmdGhpcy5fZGF0YS5jb21wcmVzc2lvbi5tYWdpYz09PWUubWFnaWMpcmV0dXJuIHRoaXMuX2RhdGEuZ2V0Q29tcHJlc3NlZFdvcmtlcigpO3ZhciByPXRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTtyZXR1cm4gdGhpcy5fZGF0YUJpbmFyeXx8KHI9ci5waXBlKG5ldyBhLlV0ZjhFbmNvZGVXb3JrZXIpKSxvLmNyZWF0ZVdvcmtlckZyb20ocixlLHQpfSxfZGVjb21wcmVzc1dvcmtlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhIGluc3RhbmNlb2Ygbz90aGlzLl9kYXRhLmdldENvbnRlbnRXb3JrZXIoKTp0aGlzLl9kYXRhIGluc3RhbmNlb2YgaD90aGlzLl9kYXRhOm5ldyBpKHRoaXMuX2RhdGEpfX07Zm9yKHZhciB1PVtcImFzVGV4dFwiLFwiYXNCaW5hcnlcIixcImFzTm9kZUJ1ZmZlclwiLFwiYXNVaW50OEFycmF5XCIsXCJhc0FycmF5QnVmZmVyXCJdLGw9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLlwiKX0sZj0wO2Y8dS5sZW5ndGg7ZisrKW4ucHJvdG90eXBlW3VbZl1dPWw7dC5leHBvcnRzPW59LHtcIi4vY29tcHJlc3NlZE9iamVjdFwiOjIsXCIuL3N0cmVhbS9EYXRhV29ya2VyXCI6MjcsXCIuL3N0cmVhbS9HZW5lcmljV29ya2VyXCI6MjgsXCIuL3N0cmVhbS9TdHJlYW1IZWxwZXJcIjoyOSxcIi4vdXRmOFwiOjMxfV0sMzY6W2Z1bmN0aW9uKGUsbCx0KXsoZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHIsbixlPXQuTXV0YXRpb25PYnNlcnZlcnx8dC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO2lmKGUpe3ZhciBpPTAscz1uZXcgZSh1KSxhPXQuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7cy5vYnNlcnZlKGEse2NoYXJhY3RlckRhdGE6ITB9KSxyPWZ1bmN0aW9uKCl7YS5kYXRhPWk9KytpJTJ9fWVsc2UgaWYodC5zZXRJbW1lZGlhdGV8fHZvaWQgMD09PXQuTWVzc2FnZUNoYW5uZWwpcj1cImRvY3VtZW50XCJpbiB0JiZcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiaW4gdC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpP2Z1bmN0aW9uKCl7dmFyIGU9dC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7dSgpLGUub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLGU9bnVsbH0sdC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZSl9OmZ1bmN0aW9uKCl7c2V0VGltZW91dCh1LDApfTtlbHNle3ZhciBvPW5ldyB0Lk1lc3NhZ2VDaGFubmVsO28ucG9ydDEub25tZXNzYWdlPXUscj1mdW5jdGlvbigpe28ucG9ydDIucG9zdE1lc3NhZ2UoMCl9fXZhciBoPVtdO2Z1bmN0aW9uIHUoKXt2YXIgZSx0O249ITA7Zm9yKHZhciByPWgubGVuZ3RoO3I7KXtmb3IodD1oLGg9W10sZT0tMTsrK2U8cjspdFtlXSgpO3I9aC5sZW5ndGh9bj0hMX1sLmV4cG9ydHM9ZnVuY3Rpb24oZSl7MSE9PWgucHVzaChlKXx8bnx8cigpfX0pLmNhbGwodGhpcyxcInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0se31dLDM3OltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGk9ZShcImltbWVkaWF0ZVwiKTtmdW5jdGlvbiB1KCl7fXZhciBsPXt9LHM9W1wiUkVKRUNURURcIl0sYT1bXCJGVUxGSUxMRURcIl0sbj1bXCJQRU5ESU5HXCJdO2Z1bmN0aW9uIG8oZSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwicmVzb2x2ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO3RoaXMuc3RhdGU9bix0aGlzLnF1ZXVlPVtdLHRoaXMub3V0Y29tZT12b2lkIDAsZSE9PXUmJmQodGhpcyxlKX1mdW5jdGlvbiBoKGUsdCxyKXt0aGlzLnByb21pc2U9ZSxcImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiYodGhpcy5vbkZ1bGZpbGxlZD10LHRoaXMuY2FsbEZ1bGZpbGxlZD10aGlzLm90aGVyQ2FsbEZ1bGZpbGxlZCksXCJmdW5jdGlvblwiPT10eXBlb2YgciYmKHRoaXMub25SZWplY3RlZD1yLHRoaXMuY2FsbFJlamVjdGVkPXRoaXMub3RoZXJDYWxsUmVqZWN0ZWQpfWZ1bmN0aW9uIGYodCxyLG4pe2koZnVuY3Rpb24oKXt2YXIgZTt0cnl7ZT1yKG4pfWNhdGNoKGUpe3JldHVybiBsLnJlamVjdCh0LGUpfWU9PT10P2wucmVqZWN0KHQsbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZXNvbHZlIHByb21pc2Ugd2l0aCBpdHNlbGZcIikpOmwucmVzb2x2ZSh0LGUpfSl9ZnVuY3Rpb24gYyhlKXt2YXIgdD1lJiZlLnRoZW47aWYoZSYmKFwib2JqZWN0XCI9PXR5cGVvZiBlfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBlKSYmXCJmdW5jdGlvblwiPT10eXBlb2YgdClyZXR1cm4gZnVuY3Rpb24oKXt0LmFwcGx5KGUsYXJndW1lbnRzKX19ZnVuY3Rpb24gZCh0LGUpe3ZhciByPSExO2Z1bmN0aW9uIG4oZSl7cnx8KHI9ITAsbC5yZWplY3QodCxlKSl9ZnVuY3Rpb24gaShlKXtyfHwocj0hMCxsLnJlc29sdmUodCxlKSl9dmFyIHM9cChmdW5jdGlvbigpe2UoaSxuKX0pO1wiZXJyb3JcIj09PXMuc3RhdHVzJiZuKHMudmFsdWUpfWZ1bmN0aW9uIHAoZSx0KXt2YXIgcj17fTt0cnl7ci52YWx1ZT1lKHQpLHIuc3RhdHVzPVwic3VjY2Vzc1wifWNhdGNoKGUpe3Iuc3RhdHVzPVwiZXJyb3JcIixyLnZhbHVlPWV9cmV0dXJuIHJ9KHQuZXhwb3J0cz1vKS5wcm90b3R5cGUuZmluYWxseT1mdW5jdGlvbih0KXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0KXJldHVybiB0aGlzO3ZhciByPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gci5yZXNvbHZlKHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBlfSl9LGZ1bmN0aW9uKGUpe3JldHVybiByLnJlc29sdmUodCgpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgZX0pfSl9LG8ucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRoZW4obnVsbCxlKX0sby5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihlLHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUmJnRoaXMuc3RhdGU9PT1hfHxcImZ1bmN0aW9uXCIhPXR5cGVvZiB0JiZ0aGlzLnN0YXRlPT09cylyZXR1cm4gdGhpczt2YXIgcj1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih1KTt0aGlzLnN0YXRlIT09bj9mKHIsdGhpcy5zdGF0ZT09PWE/ZTp0LHRoaXMub3V0Y29tZSk6dGhpcy5xdWV1ZS5wdXNoKG5ldyBoKHIsZSx0KSk7cmV0dXJuIHJ9LGgucHJvdG90eXBlLmNhbGxGdWxmaWxsZWQ9ZnVuY3Rpb24oZSl7bC5yZXNvbHZlKHRoaXMucHJvbWlzZSxlKX0saC5wcm90b3R5cGUub3RoZXJDYWxsRnVsZmlsbGVkPWZ1bmN0aW9uKGUpe2YodGhpcy5wcm9taXNlLHRoaXMub25GdWxmaWxsZWQsZSl9LGgucHJvdG90eXBlLmNhbGxSZWplY3RlZD1mdW5jdGlvbihlKXtsLnJlamVjdCh0aGlzLnByb21pc2UsZSl9LGgucHJvdG90eXBlLm90aGVyQ2FsbFJlamVjdGVkPWZ1bmN0aW9uKGUpe2YodGhpcy5wcm9taXNlLHRoaXMub25SZWplY3RlZCxlKX0sbC5yZXNvbHZlPWZ1bmN0aW9uKGUsdCl7dmFyIHI9cChjLHQpO2lmKFwiZXJyb3JcIj09PXIuc3RhdHVzKXJldHVybiBsLnJlamVjdChlLHIudmFsdWUpO3ZhciBuPXIudmFsdWU7aWYobilkKGUsbik7ZWxzZXtlLnN0YXRlPWEsZS5vdXRjb21lPXQ7Zm9yKHZhciBpPS0xLHM9ZS5xdWV1ZS5sZW5ndGg7KytpPHM7KWUucXVldWVbaV0uY2FsbEZ1bGZpbGxlZCh0KX1yZXR1cm4gZX0sbC5yZWplY3Q9ZnVuY3Rpb24oZSx0KXtlLnN0YXRlPXMsZS5vdXRjb21lPXQ7Zm9yKHZhciByPS0xLG49ZS5xdWV1ZS5sZW5ndGg7KytyPG47KWUucXVldWVbcl0uY2FsbFJlamVjdGVkKHQpO3JldHVybiBlfSxvLnJlc29sdmU9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIHRoaXMpcmV0dXJuIGU7cmV0dXJuIGwucmVzb2x2ZShuZXcgdGhpcyh1KSxlKX0sby5yZWplY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHRoaXModSk7cmV0dXJuIGwucmVqZWN0KHQsZSl9LG8uYWxsPWZ1bmN0aW9uKGUpe3ZhciByPXRoaXM7aWYoXCJbb2JqZWN0IEFycmF5XVwiIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKXJldHVybiB0aGlzLnJlamVjdChuZXcgVHlwZUVycm9yKFwibXVzdCBiZSBhbiBhcnJheVwiKSk7dmFyIG49ZS5sZW5ndGgsaT0hMTtpZighbilyZXR1cm4gdGhpcy5yZXNvbHZlKFtdKTt2YXIgcz1uZXcgQXJyYXkobiksYT0wLHQ9LTEsbz1uZXcgdGhpcyh1KTtmb3IoOysrdDxuOyloKGVbdF0sdCk7cmV0dXJuIG87ZnVuY3Rpb24gaChlLHQpe3IucmVzb2x2ZShlKS50aGVuKGZ1bmN0aW9uKGUpe3NbdF09ZSwrK2EhPT1ufHxpfHwoaT0hMCxsLnJlc29sdmUobyxzKSl9LGZ1bmN0aW9uKGUpe2l8fChpPSEwLGwucmVqZWN0KG8sZSkpfSl9fSxvLnJhY2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZihcIltvYmplY3QgQXJyYXldXCIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpcmV0dXJuIHRoaXMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJtdXN0IGJlIGFuIGFycmF5XCIpKTt2YXIgcj1lLmxlbmd0aCxuPSExO2lmKCFyKXJldHVybiB0aGlzLnJlc29sdmUoW10pO3ZhciBpPS0xLHM9bmV3IHRoaXModSk7Zm9yKDsrK2k8cjspYT1lW2ldLHQucmVzb2x2ZShhKS50aGVuKGZ1bmN0aW9uKGUpe258fChuPSEwLGwucmVzb2x2ZShzLGUpKX0sZnVuY3Rpb24oZSl7bnx8KG49ITAsbC5yZWplY3QocyxlKSl9KTt2YXIgYTtyZXR1cm4gc319LHtpbW1lZGlhdGU6MzZ9XSwzODpbZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXt9OygwLGUoXCIuL2xpYi91dGlscy9jb21tb25cIikuYXNzaWduKShuLGUoXCIuL2xpYi9kZWZsYXRlXCIpLGUoXCIuL2xpYi9pbmZsYXRlXCIpLGUoXCIuL2xpYi96bGliL2NvbnN0YW50c1wiKSksdC5leHBvcnRzPW59LHtcIi4vbGliL2RlZmxhdGVcIjozOSxcIi4vbGliL2luZmxhdGVcIjo0MCxcIi4vbGliL3V0aWxzL2NvbW1vblwiOjQxLFwiLi9saWIvemxpYi9jb25zdGFudHNcIjo0NH1dLDM5OltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9ZShcIi4vemxpYi9kZWZsYXRlXCIpLG89ZShcIi4vdXRpbHMvY29tbW9uXCIpLGg9ZShcIi4vdXRpbHMvc3RyaW5nc1wiKSxpPWUoXCIuL3psaWIvbWVzc2FnZXNcIikscz1lKFwiLi96bGliL3pzdHJlYW1cIiksdT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGw9MCxmPS0xLGM9MCxkPTg7ZnVuY3Rpb24gcChlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBwKSlyZXR1cm4gbmV3IHAoZSk7dGhpcy5vcHRpb25zPW8uYXNzaWduKHtsZXZlbDpmLG1ldGhvZDpkLGNodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjE1LG1lbUxldmVsOjgsc3RyYXRlZ3k6Yyx0bzpcIlwifSxlfHx7fSk7dmFyIHQ9dGhpcy5vcHRpb25zO3QucmF3JiYwPHQud2luZG93Qml0cz90LndpbmRvd0JpdHM9LXQud2luZG93Qml0czp0Lmd6aXAmJjA8dC53aW5kb3dCaXRzJiZ0LndpbmRvd0JpdHM8MTYmJih0LndpbmRvd0JpdHMrPTE2KSx0aGlzLmVycj0wLHRoaXMubXNnPVwiXCIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IHMsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciByPWEuZGVmbGF0ZUluaXQyKHRoaXMuc3RybSx0LmxldmVsLHQubWV0aG9kLHQud2luZG93Qml0cyx0Lm1lbUxldmVsLHQuc3RyYXRlZ3kpO2lmKHIhPT1sKXRocm93IG5ldyBFcnJvcihpW3JdKTtpZih0LmhlYWRlciYmYS5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSx0LmhlYWRlciksdC5kaWN0aW9uYXJ5KXt2YXIgbjtpZihuPVwic3RyaW5nXCI9PXR5cGVvZiB0LmRpY3Rpb25hcnk/aC5zdHJpbmcyYnVmKHQuZGljdGlvbmFyeSk6XCJbb2JqZWN0IEFycmF5QnVmZmVyXVwiPT09dS5jYWxsKHQuZGljdGlvbmFyeSk/bmV3IFVpbnQ4QXJyYXkodC5kaWN0aW9uYXJ5KTp0LmRpY3Rpb25hcnksKHI9YS5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sbikpIT09bCl0aHJvdyBuZXcgRXJyb3IoaVtyXSk7dGhpcy5fZGljdF9zZXQ9ITB9fWZ1bmN0aW9uIG4oZSx0KXt2YXIgcj1uZXcgcCh0KTtpZihyLnB1c2goZSwhMCksci5lcnIpdGhyb3cgci5tc2d8fGlbci5lcnJdO3JldHVybiByLnJlc3VsdH1wLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCl7dmFyIHIsbixpPXRoaXMuc3RybSxzPXRoaXMub3B0aW9ucy5jaHVua1NpemU7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtuPXQ9PT1+fnQ/dDohMD09PXQ/NDowLFwic3RyaW5nXCI9PXR5cGVvZiBlP2kuaW5wdXQ9aC5zdHJpbmcyYnVmKGUpOlwiW29iamVjdCBBcnJheUJ1ZmZlcl1cIj09PXUuY2FsbChlKT9pLmlucHV0PW5ldyBVaW50OEFycmF5KGUpOmkuaW5wdXQ9ZSxpLm5leHRfaW49MCxpLmF2YWlsX2luPWkuaW5wdXQubGVuZ3RoO2Rve2lmKDA9PT1pLmF2YWlsX291dCYmKGkub3V0cHV0PW5ldyBvLkJ1ZjgocyksaS5uZXh0X291dD0wLGkuYXZhaWxfb3V0PXMpLDEhPT0ocj1hLmRlZmxhdGUoaSxuKSkmJnIhPT1sKXJldHVybiB0aGlzLm9uRW5kKHIpLCEodGhpcy5lbmRlZD0hMCk7MCE9PWkuYXZhaWxfb3V0JiYoMCE9PWkuYXZhaWxfaW58fDQhPT1uJiYyIT09bil8fChcInN0cmluZ1wiPT09dGhpcy5vcHRpb25zLnRvP3RoaXMub25EYXRhKGguYnVmMmJpbnN0cmluZyhvLnNocmlua0J1ZihpLm91dHB1dCxpLm5leHRfb3V0KSkpOnRoaXMub25EYXRhKG8uc2hyaW5rQnVmKGkub3V0cHV0LGkubmV4dF9vdXQpKSl9d2hpbGUoKDA8aS5hdmFpbF9pbnx8MD09PWkuYXZhaWxfb3V0KSYmMSE9PXIpO3JldHVybiA0PT09bj8ocj1hLmRlZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKHIpLHRoaXMuZW5kZWQ9ITAscj09PWwpOjIhPT1ufHwodGhpcy5vbkVuZChsKSwhKGkuYXZhaWxfb3V0PTApKX0scC5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKGUpe3RoaXMuY2h1bmtzLnB1c2goZSl9LHAucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKGUpe2U9PT1sJiYoXCJzdHJpbmdcIj09PXRoaXMub3B0aW9ucy50bz90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKFwiXCIpOnRoaXMucmVzdWx0PW8uZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ30sci5EZWZsYXRlPXAsci5kZWZsYXRlPW4sci5kZWZsYXRlUmF3PWZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQ9dHx8e30pLnJhdz0hMCxuKGUsdCl9LHIuZ3ppcD1mdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5nemlwPSEwLG4oZSx0KX19LHtcIi4vdXRpbHMvY29tbW9uXCI6NDEsXCIuL3V0aWxzL3N0cmluZ3NcIjo0MixcIi4vemxpYi9kZWZsYXRlXCI6NDYsXCIuL3psaWIvbWVzc2FnZXNcIjo1MSxcIi4vemxpYi96c3RyZWFtXCI6NTN9XSw0MDpbZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3ZhciBjPWUoXCIuL3psaWIvaW5mbGF0ZVwiKSxkPWUoXCIuL3V0aWxzL2NvbW1vblwiKSxwPWUoXCIuL3V0aWxzL3N0cmluZ3NcIiksbT1lKFwiLi96bGliL2NvbnN0YW50c1wiKSxuPWUoXCIuL3psaWIvbWVzc2FnZXNcIiksaT1lKFwiLi96bGliL3pzdHJlYW1cIikscz1lKFwiLi96bGliL2d6aGVhZGVyXCIpLF89T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBhKGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGEpKXJldHVybiBuZXcgYShlKTt0aGlzLm9wdGlvbnM9ZC5hc3NpZ24oe2NodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjAsdG86XCJcIn0sZXx8e30pO3ZhciB0PXRoaXMub3B0aW9uczt0LnJhdyYmMDw9dC53aW5kb3dCaXRzJiZ0LndpbmRvd0JpdHM8MTYmJih0LndpbmRvd0JpdHM9LXQud2luZG93Qml0cywwPT09dC53aW5kb3dCaXRzJiYodC53aW5kb3dCaXRzPS0xNSkpLCEoMDw9dC53aW5kb3dCaXRzJiZ0LndpbmRvd0JpdHM8MTYpfHxlJiZlLndpbmRvd0JpdHN8fCh0LndpbmRvd0JpdHMrPTMyKSwxNTx0LndpbmRvd0JpdHMmJnQud2luZG93Qml0czw0OCYmMD09KDE1JnQud2luZG93Qml0cykmJih0LndpbmRvd0JpdHN8PTE1KSx0aGlzLmVycj0wLHRoaXMubXNnPVwiXCIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IGksdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciByPWMuaW5mbGF0ZUluaXQyKHRoaXMuc3RybSx0LndpbmRvd0JpdHMpO2lmKHIhPT1tLlpfT0spdGhyb3cgbmV3IEVycm9yKG5bcl0pO3RoaXMuaGVhZGVyPW5ldyBzLGMuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sdGhpcy5oZWFkZXIpfWZ1bmN0aW9uIG8oZSx0KXt2YXIgcj1uZXcgYSh0KTtpZihyLnB1c2goZSwhMCksci5lcnIpdGhyb3cgci5tc2d8fG5bci5lcnJdO3JldHVybiByLnJlc3VsdH1hLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCl7dmFyIHIsbixpLHMsYSxvLGg9dGhpcy5zdHJtLHU9dGhpcy5vcHRpb25zLmNodW5rU2l6ZSxsPXRoaXMub3B0aW9ucy5kaWN0aW9uYXJ5LGY9ITE7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtuPXQ9PT1+fnQ/dDohMD09PXQ/bS5aX0ZJTklTSDptLlpfTk9fRkxVU0gsXCJzdHJpbmdcIj09dHlwZW9mIGU/aC5pbnB1dD1wLmJpbnN0cmluZzJidWYoZSk6XCJbb2JqZWN0IEFycmF5QnVmZmVyXVwiPT09Xy5jYWxsKGUpP2guaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoZSk6aC5pbnB1dD1lLGgubmV4dF9pbj0wLGguYXZhaWxfaW49aC5pbnB1dC5sZW5ndGg7ZG97aWYoMD09PWguYXZhaWxfb3V0JiYoaC5vdXRwdXQ9bmV3IGQuQnVmOCh1KSxoLm5leHRfb3V0PTAsaC5hdmFpbF9vdXQ9dSksKHI9Yy5pbmZsYXRlKGgsbS5aX05PX0ZMVVNIKSk9PT1tLlpfTkVFRF9ESUNUJiZsJiYobz1cInN0cmluZ1wiPT10eXBlb2YgbD9wLnN0cmluZzJidWYobCk6XCJbb2JqZWN0IEFycmF5QnVmZmVyXVwiPT09Xy5jYWxsKGwpP25ldyBVaW50OEFycmF5KGwpOmwscj1jLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSxvKSkscj09PW0uWl9CVUZfRVJST1ImJiEwPT09ZiYmKHI9bS5aX09LLGY9ITEpLHIhPT1tLlpfU1RSRUFNX0VORCYmciE9PW0uWl9PSylyZXR1cm4gdGhpcy5vbkVuZChyKSwhKHRoaXMuZW5kZWQ9ITApO2gubmV4dF9vdXQmJigwIT09aC5hdmFpbF9vdXQmJnIhPT1tLlpfU1RSRUFNX0VORCYmKDAhPT1oLmF2YWlsX2lufHxuIT09bS5aX0ZJTklTSCYmbiE9PW0uWl9TWU5DX0ZMVVNIKXx8KFwic3RyaW5nXCI9PT10aGlzLm9wdGlvbnMudG8/KGk9cC51dGY4Ym9yZGVyKGgub3V0cHV0LGgubmV4dF9vdXQpLHM9aC5uZXh0X291dC1pLGE9cC5idWYyc3RyaW5nKGgub3V0cHV0LGkpLGgubmV4dF9vdXQ9cyxoLmF2YWlsX291dD11LXMscyYmZC5hcnJheVNldChoLm91dHB1dCxoLm91dHB1dCxpLHMsMCksdGhpcy5vbkRhdGEoYSkpOnRoaXMub25EYXRhKGQuc2hyaW5rQnVmKGgub3V0cHV0LGgubmV4dF9vdXQpKSkpLDA9PT1oLmF2YWlsX2luJiYwPT09aC5hdmFpbF9vdXQmJihmPSEwKX13aGlsZSgoMDxoLmF2YWlsX2lufHwwPT09aC5hdmFpbF9vdXQpJiZyIT09bS5aX1NUUkVBTV9FTkQpO3JldHVybiByPT09bS5aX1NUUkVBTV9FTkQmJihuPW0uWl9GSU5JU0gpLG49PT1tLlpfRklOSVNIPyhyPWMuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMub25FbmQociksdGhpcy5lbmRlZD0hMCxyPT09bS5aX09LKTpuIT09bS5aX1NZTkNfRkxVU0h8fCh0aGlzLm9uRW5kKG0uWl9PSyksIShoLmF2YWlsX291dD0wKSl9LGEucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihlKXt0aGlzLmNodW5rcy5wdXNoKGUpfSxhLnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbihlKXtlPT09bS5aX09LJiYoXCJzdHJpbmdcIj09PXRoaXMub3B0aW9ucy50bz90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKFwiXCIpOnRoaXMucmVzdWx0PWQuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ30sci5JbmZsYXRlPWEsci5pbmZsYXRlPW8sci5pbmZsYXRlUmF3PWZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQ9dHx8e30pLnJhdz0hMCxvKGUsdCl9LHIudW5nemlwPW99LHtcIi4vdXRpbHMvY29tbW9uXCI6NDEsXCIuL3V0aWxzL3N0cmluZ3NcIjo0MixcIi4vemxpYi9jb25zdGFudHNcIjo0NCxcIi4vemxpYi9nemhlYWRlclwiOjQ3LFwiLi96bGliL2luZmxhdGVcIjo0OSxcIi4vemxpYi9tZXNzYWdlc1wiOjUxLFwiLi96bGliL3pzdHJlYW1cIjo1M31dLDQxOltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFVpbnQ4QXJyYXkmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBVaW50MTZBcnJheSYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIEludDMyQXJyYXk7ci5hc3NpZ249ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTt0Lmxlbmd0aDspe3ZhciByPXQuc2hpZnQoKTtpZihyKXtpZihcIm9iamVjdFwiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKHIrXCJtdXN0IGJlIG5vbi1vYmplY3RcIik7Zm9yKHZhciBuIGluIHIpci5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09cltuXSl9fXJldHVybiBlfSxyLnNocmlua0J1Zj1mdW5jdGlvbihlLHQpe3JldHVybiBlLmxlbmd0aD09PXQ/ZTplLnN1YmFycmF5P2Uuc3ViYXJyYXkoMCx0KTooZS5sZW5ndGg9dCxlKX07dmFyIGk9e2FycmF5U2V0OmZ1bmN0aW9uKGUsdCxyLG4saSl7aWYodC5zdWJhcnJheSYmZS5zdWJhcnJheSllLnNldCh0LnN1YmFycmF5KHIscituKSxpKTtlbHNlIGZvcih2YXIgcz0wO3M8bjtzKyspZVtpK3NdPXRbcitzXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihlKXt2YXIgdCxyLG4saSxzLGE7Zm9yKHQ9bj0wLHI9ZS5sZW5ndGg7dDxyO3QrKyluKz1lW3RdLmxlbmd0aDtmb3IoYT1uZXcgVWludDhBcnJheShuKSx0PWk9MCxyPWUubGVuZ3RoO3Q8cjt0Kyspcz1lW3RdLGEuc2V0KHMsaSksaSs9cy5sZW5ndGg7cmV0dXJuIGF9fSxzPXthcnJheVNldDpmdW5jdGlvbihlLHQscixuLGkpe2Zvcih2YXIgcz0wO3M8bjtzKyspZVtpK3NdPXRbcitzXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihlKXtyZXR1cm5bXS5jb25jYXQuYXBwbHkoW10sZSl9fTtyLnNldFR5cGVkPWZ1bmN0aW9uKGUpe2U/KHIuQnVmOD1VaW50OEFycmF5LHIuQnVmMTY9VWludDE2QXJyYXksci5CdWYzMj1JbnQzMkFycmF5LHIuYXNzaWduKHIsaSkpOihyLkJ1Zjg9QXJyYXksci5CdWYxNj1BcnJheSxyLkJ1ZjMyPUFycmF5LHIuYXNzaWduKHIscykpfSxyLnNldFR5cGVkKG4pfSx7fV0sNDI6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt2YXIgaD1lKFwiLi9jb21tb25cIiksaT0hMCxzPSEwO3RyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsWzBdKX1jYXRjaChlKXtpPSExfXRyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkoMSkpfWNhdGNoKGUpe3M9ITF9Zm9yKHZhciB1PW5ldyBoLkJ1ZjgoMjU2KSxuPTA7bjwyNTY7bisrKXVbbl09MjUyPD1uPzY6MjQ4PD1uPzU6MjQwPD1uPzQ6MjI0PD1uPzM6MTkyPD1uPzI6MTtmdW5jdGlvbiBsKGUsdCl7aWYodDw2NTUzNyYmKGUuc3ViYXJyYXkmJnN8fCFlLnN1YmFycmF5JiZpKSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGguc2hyaW5rQnVmKGUsdCkpO2Zvcih2YXIgcj1cIlwiLG49MDtuPHQ7bisrKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtuXSk7cmV0dXJuIHJ9dVsyNTRdPXVbMjU0XT0xLHIuc3RyaW5nMmJ1Zj1mdW5jdGlvbihlKXt2YXIgdCxyLG4saSxzLGE9ZS5sZW5ndGgsbz0wO2ZvcihpPTA7aTxhO2krKyk1NTI5Nj09KDY0NTEyJihyPWUuY2hhckNvZGVBdChpKSkpJiZpKzE8YSYmNTYzMjA9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQoaSsxKSkpJiYocj02NTUzNisoci01NTI5Njw8MTApKyhuLTU2MzIwKSxpKyspLG8rPXI8MTI4PzE6cjwyMDQ4PzI6cjw2NTUzNj8zOjQ7Zm9yKHQ9bmV3IGguQnVmOChvKSxpPXM9MDtzPG87aSsrKTU1Mjk2PT0oNjQ1MTImKHI9ZS5jaGFyQ29kZUF0KGkpKSkmJmkrMTxhJiY1NjMyMD09KDY0NTEyJihuPWUuY2hhckNvZGVBdChpKzEpKSkmJihyPTY1NTM2KyhyLTU1Mjk2PDwxMCkrKG4tNTYzMjApLGkrKykscjwxMjg/dFtzKytdPXI6KHI8MjA0OD90W3MrK109MTkyfHI+Pj42OihyPDY1NTM2P3RbcysrXT0yMjR8cj4+PjEyOih0W3MrK109MjQwfHI+Pj4xOCx0W3MrK109MTI4fHI+Pj4xMiY2MyksdFtzKytdPTEyOHxyPj4+NiY2MyksdFtzKytdPTEyOHw2MyZyKTtyZXR1cm4gdH0sci5idWYyYmluc3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiBsKGUsZS5sZW5ndGgpfSxyLmJpbnN0cmluZzJidWY9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PW5ldyBoLkJ1ZjgoZS5sZW5ndGgpLHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspdFtyXT1lLmNoYXJDb2RlQXQocik7cmV0dXJuIHR9LHIuYnVmMnN0cmluZz1mdW5jdGlvbihlLHQpe3ZhciByLG4saSxzLGE9dHx8ZS5sZW5ndGgsbz1uZXcgQXJyYXkoMiphKTtmb3Iocj1uPTA7cjxhOylpZigoaT1lW3IrK10pPDEyOClvW24rK109aTtlbHNlIGlmKDQ8KHM9dVtpXSkpb1tuKytdPTY1NTMzLHIrPXMtMTtlbHNle2ZvcihpJj0yPT09cz8zMTozPT09cz8xNTo3OzE8cyYmcjxhOylpPWk8PDZ8NjMmZVtyKytdLHMtLTsxPHM/b1tuKytdPTY1NTMzOmk8NjU1MzY/b1tuKytdPWk6KGktPTY1NTM2LG9bbisrXT01NTI5NnxpPj4xMCYxMDIzLG9bbisrXT01NjMyMHwxMDIzJmkpfXJldHVybiBsKG8sbil9LHIudXRmOGJvcmRlcj1mdW5jdGlvbihlLHQpe3ZhciByO2ZvcigodD10fHxlLmxlbmd0aCk+ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSxyPXQtMTswPD1yJiYxMjg9PSgxOTImZVtyXSk7KXItLTtyZXR1cm4gcjwwP3Q6MD09PXI/dDpyK3VbZVtyXV0+dD9yOnR9fSx7XCIuL2NvbW1vblwiOjQxfV0sNDM6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIsbil7Zm9yKHZhciBpPTY1NTM1JmV8MCxzPWU+Pj4xNiY2NTUzNXwwLGE9MDswIT09cjspe2ZvcihyLT1hPTJlMzxyPzJlMzpyO3M9cysoaT1pK3RbbisrXXwwKXwwLC0tYTspO2klPTY1NTIxLHMlPTY1NTIxfXJldHVybiBpfHM8PDE2fDB9fSx7fV0sNDQ6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt0LmV4cG9ydHM9e1pfTk9fRkxVU0g6MCxaX1BBUlRJQUxfRkxVU0g6MSxaX1NZTkNfRkxVU0g6MixaX0ZVTExfRkxVU0g6MyxaX0ZJTklTSDo0LFpfQkxPQ0s6NSxaX1RSRUVTOjYsWl9PSzowLFpfU1RSRUFNX0VORDoxLFpfTkVFRF9ESUNUOjIsWl9FUlJOTzotMSxaX1NUUkVBTV9FUlJPUjotMixaX0RBVEFfRVJST1I6LTMsWl9CVUZfRVJST1I6LTUsWl9OT19DT01QUkVTU0lPTjowLFpfQkVTVF9TUEVFRDoxLFpfQkVTVF9DT01QUkVTU0lPTjo5LFpfREVGQVVMVF9DT01QUkVTU0lPTjotMSxaX0ZJTFRFUkVEOjEsWl9IVUZGTUFOX09OTFk6MixaX1JMRTozLFpfRklYRUQ6NCxaX0RFRkFVTFRfU1RSQVRFR1k6MCxaX0JJTkFSWTowLFpfVEVYVDoxLFpfVU5LTk9XTjoyLFpfREVGTEFURUQ6OH19LHt9XSw0NTpbZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3ZhciBvPWZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9W10scj0wO3I8MjU2O3IrKyl7ZT1yO2Zvcih2YXIgbj0wO248ODtuKyspZT0xJmU/Mzk4ODI5MjM4NF5lPj4+MTplPj4+MTt0W3JdPWV9cmV0dXJuIHR9KCk7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBpPW8scz1uK3I7ZV49LTE7Zm9yKHZhciBhPW47YTxzO2ErKyllPWU+Pj44XmlbMjU1JihlXnRbYV0pXTtyZXR1cm4tMV5lfX0se31dLDQ2OltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGgsYz1lKFwiLi4vdXRpbHMvY29tbW9uXCIpLHU9ZShcIi4vdHJlZXNcIiksZD1lKFwiLi9hZGxlcjMyXCIpLHA9ZShcIi4vY3JjMzJcIiksbj1lKFwiLi9tZXNzYWdlc1wiKSxsPTAsZj00LG09MCxfPS0yLGc9LTEsYj00LGk9Mix2PTgseT05LHM9Mjg2LGE9MzAsbz0xOSx3PTIqcysxLGs9MTUseD0zLFM9MjU4LHo9Uyt4KzEsQz00MixFPTExMyxBPTEsST0yLE89MyxCPTQ7ZnVuY3Rpb24gUihlLHQpe3JldHVybiBlLm1zZz1uW3RdLHR9ZnVuY3Rpb24gVChlKXtyZXR1cm4oZTw8MSktKDQ8ZT85OjApfWZ1bmN0aW9uIEQoZSl7Zm9yKHZhciB0PWUubGVuZ3RoOzA8PS0tdDspZVt0XT0wfWZ1bmN0aW9uIEYoZSl7dmFyIHQ9ZS5zdGF0ZSxyPXQucGVuZGluZztyPmUuYXZhaWxfb3V0JiYocj1lLmF2YWlsX291dCksMCE9PXImJihjLmFycmF5U2V0KGUub3V0cHV0LHQucGVuZGluZ19idWYsdC5wZW5kaW5nX291dCxyLGUubmV4dF9vdXQpLGUubmV4dF9vdXQrPXIsdC5wZW5kaW5nX291dCs9cixlLnRvdGFsX291dCs9cixlLmF2YWlsX291dC09cix0LnBlbmRpbmctPXIsMD09PXQucGVuZGluZyYmKHQucGVuZGluZ19vdXQ9MCkpfWZ1bmN0aW9uIE4oZSx0KXt1Ll90cl9mbHVzaF9ibG9jayhlLDA8PWUuYmxvY2tfc3RhcnQ/ZS5ibG9ja19zdGFydDotMSxlLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQsdCksZS5ibG9ja19zdGFydD1lLnN0cnN0YXJ0LEYoZS5zdHJtKX1mdW5jdGlvbiBVKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dH1mdW5jdGlvbiBQKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dD4+PjgmMjU1LGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPTI1NSZ0fWZ1bmN0aW9uIEwoZSx0KXt2YXIgcixuLGk9ZS5tYXhfY2hhaW5fbGVuZ3RoLHM9ZS5zdHJzdGFydCxhPWUucHJldl9sZW5ndGgsbz1lLm5pY2VfbWF0Y2gsaD1lLnN0cnN0YXJ0PmUud19zaXplLXo/ZS5zdHJzdGFydC0oZS53X3NpemUteik6MCx1PWUud2luZG93LGw9ZS53X21hc2ssZj1lLnByZXYsYz1lLnN0cnN0YXJ0K1MsZD11W3MrYS0xXSxwPXVbcythXTtlLnByZXZfbGVuZ3RoPj1lLmdvb2RfbWF0Y2gmJihpPj49Miksbz5lLmxvb2thaGVhZCYmKG89ZS5sb29rYWhlYWQpO2Rve2lmKHVbKHI9dCkrYV09PT1wJiZ1W3IrYS0xXT09PWQmJnVbcl09PT11W3NdJiZ1Wysrcl09PT11W3MrMV0pe3MrPTIscisrO2Rve313aGlsZSh1Wysrc109PT11Wysrcl0mJnVbKytzXT09PXVbKytyXSYmdVsrK3NdPT09dVsrK3JdJiZ1Wysrc109PT11Wysrcl0mJnVbKytzXT09PXVbKytyXSYmdVsrK3NdPT09dVsrK3JdJiZ1Wysrc109PT11Wysrcl0mJnVbKytzXT09PXVbKytyXSYmczxjKTtpZihuPVMtKGMtcykscz1jLVMsYTxuKXtpZihlLm1hdGNoX3N0YXJ0PXQsbzw9KGE9bikpYnJlYWs7ZD11W3MrYS0xXSxwPXVbcythXX19fXdoaWxlKCh0PWZbdCZsXSk+aCYmMCE9LS1pKTtyZXR1cm4gYTw9ZS5sb29rYWhlYWQ/YTplLmxvb2thaGVhZH1mdW5jdGlvbiBqKGUpe3ZhciB0LHIsbixpLHMsYSxvLGgsdSxsLGY9ZS53X3NpemU7ZG97aWYoaT1lLndpbmRvd19zaXplLWUubG9va2FoZWFkLWUuc3Ryc3RhcnQsZS5zdHJzdGFydD49ZisoZi16KSl7Zm9yKGMuYXJyYXlTZXQoZS53aW5kb3csZS53aW5kb3csZixmLDApLGUubWF0Y2hfc3RhcnQtPWYsZS5zdHJzdGFydC09ZixlLmJsb2NrX3N0YXJ0LT1mLHQ9cj1lLmhhc2hfc2l6ZTtuPWUuaGVhZFstLXRdLGUuaGVhZFt0XT1mPD1uP24tZjowLC0tcjspO2Zvcih0PXI9ZjtuPWUucHJldlstLXRdLGUucHJldlt0XT1mPD1uP24tZjowLC0tcjspO2krPWZ9aWYoMD09PWUuc3RybS5hdmFpbF9pbilicmVhaztpZihhPWUuc3RybSxvPWUud2luZG93LGg9ZS5zdHJzdGFydCtlLmxvb2thaGVhZCx1PWksbD12b2lkIDAsbD1hLmF2YWlsX2luLHU8bCYmKGw9dSkscj0wPT09bD8wOihhLmF2YWlsX2luLT1sLGMuYXJyYXlTZXQobyxhLmlucHV0LGEubmV4dF9pbixsLGgpLDE9PT1hLnN0YXRlLndyYXA/YS5hZGxlcj1kKGEuYWRsZXIsbyxsLGgpOjI9PT1hLnN0YXRlLndyYXAmJihhLmFkbGVyPXAoYS5hZGxlcixvLGwsaCkpLGEubmV4dF9pbis9bCxhLnRvdGFsX2luKz1sLGwpLGUubG9va2FoZWFkKz1yLGUubG9va2FoZWFkK2UuaW5zZXJ0Pj14KWZvcihzPWUuc3Ryc3RhcnQtZS5pbnNlcnQsZS5pbnNfaD1lLndpbmRvd1tzXSxlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbcysxXSkmZS5oYXNoX21hc2s7ZS5pbnNlcnQmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbcyt4LTFdKSZlLmhhc2hfbWFzayxlLnByZXZbcyZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1zLHMrKyxlLmluc2VydC0tLCEoZS5sb29rYWhlYWQrZS5pbnNlcnQ8eCkpOyk7fXdoaWxlKGUubG9va2FoZWFkPHomJjAhPT1lLnN0cm0uYXZhaWxfaW4pfWZ1bmN0aW9uIFooZSx0KXtmb3IodmFyIHIsbjs7KXtpZihlLmxvb2thaGVhZDx6KXtpZihqKGUpLGUubG9va2FoZWFkPHomJnQ9PT1sKXJldHVybiBBO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31pZihyPTAsZS5sb29rYWhlYWQ+PXgmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCt4LTFdKSZlLmhhc2hfbWFzayxyPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLDAhPT1yJiZlLnN0cnN0YXJ0LXI8PWUud19zaXplLXomJihlLm1hdGNoX2xlbmd0aD1MKGUscikpLGUubWF0Y2hfbGVuZ3RoPj14KWlmKG49dS5fdHJfdGFsbHkoZSxlLnN0cnN0YXJ0LWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGgteCksZS5sb29rYWhlYWQtPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPD1lLm1heF9sYXp5X21hdGNoJiZlLmxvb2thaGVhZD49eCl7Zm9yKGUubWF0Y2hfbGVuZ3RoLS07ZS5zdHJzdGFydCsrLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K3gtMV0pJmUuaGFzaF9tYXNrLHI9ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCwwIT0tLWUubWF0Y2hfbGVuZ3RoOyk7ZS5zdHJzdGFydCsrfWVsc2UgZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCxlLmluc19oPWUud2luZG93W2Uuc3Ryc3RhcnRdLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0KzFdKSZlLmhhc2hfbWFzaztlbHNlIG49dS5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKztpZihuJiYoTihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIEF9cmV0dXJuIGUuaW5zZXJ0PWUuc3Ryc3RhcnQ8eC0xP2Uuc3Ryc3RhcnQ6eC0xLHQ9PT1mPyhOKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P086Qik6ZS5sYXN0X2xpdCYmKE4oZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP0E6SX1mdW5jdGlvbiBXKGUsdCl7Zm9yKHZhciByLG4saTs7KXtpZihlLmxvb2thaGVhZDx6KXtpZihqKGUpLGUubG9va2FoZWFkPHomJnQ9PT1sKXJldHVybiBBO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31pZihyPTAsZS5sb29rYWhlYWQ+PXgmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCt4LTFdKSZlLmhhc2hfbWFzayxyPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLGUucHJldl9sZW5ndGg9ZS5tYXRjaF9sZW5ndGgsZS5wcmV2X21hdGNoPWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGg9eC0xLDAhPT1yJiZlLnByZXZfbGVuZ3RoPGUubWF4X2xhenlfbWF0Y2gmJmUuc3Ryc3RhcnQtcjw9ZS53X3NpemUteiYmKGUubWF0Y2hfbGVuZ3RoPUwoZSxyKSxlLm1hdGNoX2xlbmd0aDw9NSYmKDE9PT1lLnN0cmF0ZWd5fHxlLm1hdGNoX2xlbmd0aD09PXgmJjQwOTY8ZS5zdHJzdGFydC1lLm1hdGNoX3N0YXJ0KSYmKGUubWF0Y2hfbGVuZ3RoPXgtMSkpLGUucHJldl9sZW5ndGg+PXgmJmUubWF0Y2hfbGVuZ3RoPD1lLnByZXZfbGVuZ3RoKXtmb3IoaT1lLnN0cnN0YXJ0K2UubG9va2FoZWFkLXgsbj11Ll90cl90YWxseShlLGUuc3Ryc3RhcnQtMS1lLnByZXZfbWF0Y2gsZS5wcmV2X2xlbmd0aC14KSxlLmxvb2thaGVhZC09ZS5wcmV2X2xlbmd0aC0xLGUucHJldl9sZW5ndGgtPTI7KytlLnN0cnN0YXJ0PD1pJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQreC0xXSkmZS5oYXNoX21hc2sscj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0KSwwIT0tLWUucHJldl9sZW5ndGg7KTtpZihlLm1hdGNoX2F2YWlsYWJsZT0wLGUubWF0Y2hfbGVuZ3RoPXgtMSxlLnN0cnN0YXJ0KyssbiYmKE4oZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBBfWVsc2UgaWYoZS5tYXRjaF9hdmFpbGFibGUpe2lmKChuPXUuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0LTFdKSkmJk4oZSwhMSksZS5zdHJzdGFydCsrLGUubG9va2FoZWFkLS0sMD09PWUuc3RybS5hdmFpbF9vdXQpcmV0dXJuIEF9ZWxzZSBlLm1hdGNoX2F2YWlsYWJsZT0xLGUuc3Ryc3RhcnQrKyxlLmxvb2thaGVhZC0tfXJldHVybiBlLm1hdGNoX2F2YWlsYWJsZSYmKG49dS5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnQtMV0pLGUubWF0Y2hfYXZhaWxhYmxlPTApLGUuaW5zZXJ0PWUuc3Ryc3RhcnQ8eC0xP2Uuc3Ryc3RhcnQ6eC0xLHQ9PT1mPyhOKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P086Qik6ZS5sYXN0X2xpdCYmKE4oZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP0E6SX1mdW5jdGlvbiBNKGUsdCxyLG4saSl7dGhpcy5nb29kX2xlbmd0aD1lLHRoaXMubWF4X2xhenk9dCx0aGlzLm5pY2VfbGVuZ3RoPXIsdGhpcy5tYXhfY2hhaW49bix0aGlzLmZ1bmM9aX1mdW5jdGlvbiBIKCl7dGhpcy5zdHJtPW51bGwsdGhpcy5zdGF0dXM9MCx0aGlzLnBlbmRpbmdfYnVmPW51bGwsdGhpcy5wZW5kaW5nX2J1Zl9zaXplPTAsdGhpcy5wZW5kaW5nX291dD0wLHRoaXMucGVuZGluZz0wLHRoaXMud3JhcD0wLHRoaXMuZ3poZWFkPW51bGwsdGhpcy5nemluZGV4PTAsdGhpcy5tZXRob2Q9dix0aGlzLmxhc3RfZmx1c2g9LTEsdGhpcy53X3NpemU9MCx0aGlzLndfYml0cz0wLHRoaXMud19tYXNrPTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLndpbmRvd19zaXplPTAsdGhpcy5wcmV2PW51bGwsdGhpcy5oZWFkPW51bGwsdGhpcy5pbnNfaD0wLHRoaXMuaGFzaF9zaXplPTAsdGhpcy5oYXNoX2JpdHM9MCx0aGlzLmhhc2hfbWFzaz0wLHRoaXMuaGFzaF9zaGlmdD0wLHRoaXMuYmxvY2tfc3RhcnQ9MCx0aGlzLm1hdGNoX2xlbmd0aD0wLHRoaXMucHJldl9tYXRjaD0wLHRoaXMubWF0Y2hfYXZhaWxhYmxlPTAsdGhpcy5zdHJzdGFydD0wLHRoaXMubWF0Y2hfc3RhcnQ9MCx0aGlzLmxvb2thaGVhZD0wLHRoaXMucHJldl9sZW5ndGg9MCx0aGlzLm1heF9jaGFpbl9sZW5ndGg9MCx0aGlzLm1heF9sYXp5X21hdGNoPTAsdGhpcy5sZXZlbD0wLHRoaXMuc3RyYXRlZ3k9MCx0aGlzLmdvb2RfbWF0Y2g9MCx0aGlzLm5pY2VfbWF0Y2g9MCx0aGlzLmR5bl9sdHJlZT1uZXcgYy5CdWYxNigyKncpLHRoaXMuZHluX2R0cmVlPW5ldyBjLkJ1ZjE2KDIqKDIqYSsxKSksdGhpcy5ibF90cmVlPW5ldyBjLkJ1ZjE2KDIqKDIqbysxKSksRCh0aGlzLmR5bl9sdHJlZSksRCh0aGlzLmR5bl9kdHJlZSksRCh0aGlzLmJsX3RyZWUpLHRoaXMubF9kZXNjPW51bGwsdGhpcy5kX2Rlc2M9bnVsbCx0aGlzLmJsX2Rlc2M9bnVsbCx0aGlzLmJsX2NvdW50PW5ldyBjLkJ1ZjE2KGsrMSksdGhpcy5oZWFwPW5ldyBjLkJ1ZjE2KDIqcysxKSxEKHRoaXMuaGVhcCksdGhpcy5oZWFwX2xlbj0wLHRoaXMuaGVhcF9tYXg9MCx0aGlzLmRlcHRoPW5ldyBjLkJ1ZjE2KDIqcysxKSxEKHRoaXMuZGVwdGgpLHRoaXMubF9idWY9MCx0aGlzLmxpdF9idWZzaXplPTAsdGhpcy5sYXN0X2xpdD0wLHRoaXMuZF9idWY9MCx0aGlzLm9wdF9sZW49MCx0aGlzLnN0YXRpY19sZW49MCx0aGlzLm1hdGNoZXM9MCx0aGlzLmluc2VydD0wLHRoaXMuYmlfYnVmPTAsdGhpcy5iaV92YWxpZD0wfWZ1bmN0aW9uIEcoZSl7dmFyIHQ7cmV0dXJuIGUmJmUuc3RhdGU/KGUudG90YWxfaW49ZS50b3RhbF9vdXQ9MCxlLmRhdGFfdHlwZT1pLCh0PWUuc3RhdGUpLnBlbmRpbmc9MCx0LnBlbmRpbmdfb3V0PTAsdC53cmFwPDAmJih0LndyYXA9LXQud3JhcCksdC5zdGF0dXM9dC53cmFwP0M6RSxlLmFkbGVyPTI9PT10LndyYXA/MDoxLHQubGFzdF9mbHVzaD1sLHUuX3RyX2luaXQodCksbSk6UihlLF8pfWZ1bmN0aW9uIEsoZSl7dmFyIHQ9RyhlKTtyZXR1cm4gdD09PW0mJmZ1bmN0aW9uKGUpe2Uud2luZG93X3NpemU9MiplLndfc2l6ZSxEKGUuaGVhZCksZS5tYXhfbGF6eV9tYXRjaD1oW2UubGV2ZWxdLm1heF9sYXp5LGUuZ29vZF9tYXRjaD1oW2UubGV2ZWxdLmdvb2RfbGVuZ3RoLGUubmljZV9tYXRjaD1oW2UubGV2ZWxdLm5pY2VfbGVuZ3RoLGUubWF4X2NoYWluX2xlbmd0aD1oW2UubGV2ZWxdLm1heF9jaGFpbixlLnN0cnN0YXJ0PTAsZS5ibG9ja19zdGFydD0wLGUubG9va2FoZWFkPTAsZS5pbnNlcnQ9MCxlLm1hdGNoX2xlbmd0aD1lLnByZXZfbGVuZ3RoPXgtMSxlLm1hdGNoX2F2YWlsYWJsZT0wLGUuaW5zX2g9MH0oZS5zdGF0ZSksdH1mdW5jdGlvbiBZKGUsdCxyLG4saSxzKXtpZighZSlyZXR1cm4gXzt2YXIgYT0xO2lmKHQ9PT1nJiYodD02KSxuPDA/KGE9MCxuPS1uKToxNTxuJiYoYT0yLG4tPTE2KSxpPDF8fHk8aXx8ciE9PXZ8fG48OHx8MTU8bnx8dDwwfHw5PHR8fHM8MHx8YjxzKXJldHVybiBSKGUsXyk7OD09PW4mJihuPTkpO3ZhciBvPW5ldyBIO3JldHVybihlLnN0YXRlPW8pLnN0cm09ZSxvLndyYXA9YSxvLmd6aGVhZD1udWxsLG8ud19iaXRzPW4sby53X3NpemU9MTw8by53X2JpdHMsby53X21hc2s9by53X3NpemUtMSxvLmhhc2hfYml0cz1pKzcsby5oYXNoX3NpemU9MTw8by5oYXNoX2JpdHMsby5oYXNoX21hc2s9by5oYXNoX3NpemUtMSxvLmhhc2hfc2hpZnQ9fn4oKG8uaGFzaF9iaXRzK3gtMSkveCksby53aW5kb3c9bmV3IGMuQnVmOCgyKm8ud19zaXplKSxvLmhlYWQ9bmV3IGMuQnVmMTYoby5oYXNoX3NpemUpLG8ucHJldj1uZXcgYy5CdWYxNihvLndfc2l6ZSksby5saXRfYnVmc2l6ZT0xPDxpKzYsby5wZW5kaW5nX2J1Zl9zaXplPTQqby5saXRfYnVmc2l6ZSxvLnBlbmRpbmdfYnVmPW5ldyBjLkJ1Zjgoby5wZW5kaW5nX2J1Zl9zaXplKSxvLmRfYnVmPTEqby5saXRfYnVmc2l6ZSxvLmxfYnVmPTMqby5saXRfYnVmc2l6ZSxvLmxldmVsPXQsby5zdHJhdGVneT1zLG8ubWV0aG9kPXIsSyhlKX1oPVtuZXcgTSgwLDAsMCwwLGZ1bmN0aW9uKGUsdCl7dmFyIHI9NjU1MzU7Zm9yKHI+ZS5wZW5kaW5nX2J1Zl9zaXplLTUmJihyPWUucGVuZGluZ19idWZfc2l6ZS01KTs7KXtpZihlLmxvb2thaGVhZDw9MSl7aWYoaihlKSwwPT09ZS5sb29rYWhlYWQmJnQ9PT1sKXJldHVybiBBO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31lLnN0cnN0YXJ0Kz1lLmxvb2thaGVhZCxlLmxvb2thaGVhZD0wO3ZhciBuPWUuYmxvY2tfc3RhcnQrcjtpZigoMD09PWUuc3Ryc3RhcnR8fGUuc3Ryc3RhcnQ+PW4pJiYoZS5sb29rYWhlYWQ9ZS5zdHJzdGFydC1uLGUuc3Ryc3RhcnQ9bixOKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gQTtpZihlLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQ+PWUud19zaXplLXomJihOKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gQX1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09Zj8oTihlLCEwKSwwPT09ZS5zdHJtLmF2YWlsX291dD9POkIpOihlLnN0cnN0YXJ0PmUuYmxvY2tfc3RhcnQmJihOKGUsITEpLGUuc3RybS5hdmFpbF9vdXQpLEEpfSksbmV3IE0oNCw0LDgsNCxaKSxuZXcgTSg0LDUsMTYsOCxaKSxuZXcgTSg0LDYsMzIsMzIsWiksbmV3IE0oNCw0LDE2LDE2LFcpLG5ldyBNKDgsMTYsMzIsMzIsVyksbmV3IE0oOCwxNiwxMjgsMTI4LFcpLG5ldyBNKDgsMzIsMTI4LDI1NixXKSxuZXcgTSgzMiwxMjgsMjU4LDEwMjQsVyksbmV3IE0oMzIsMjU4LDI1OCw0MDk2LFcpXSxyLmRlZmxhdGVJbml0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFkoZSx0LHYsMTUsOCwwKX0sci5kZWZsYXRlSW5pdDI9WSxyLmRlZmxhdGVSZXNldD1LLHIuZGVmbGF0ZVJlc2V0S2VlcD1HLHIuZGVmbGF0ZVNldEhlYWRlcj1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZlLnN0YXRlPzIhPT1lLnN0YXRlLndyYXA/XzooZS5zdGF0ZS5nemhlYWQ9dCxtKTpffSxyLmRlZmxhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgcixuLGkscztpZighZXx8IWUuc3RhdGV8fDU8dHx8dDwwKXJldHVybiBlP1IoZSxfKTpfO2lmKG49ZS5zdGF0ZSwhZS5vdXRwdXR8fCFlLmlucHV0JiYwIT09ZS5hdmFpbF9pbnx8NjY2PT09bi5zdGF0dXMmJnQhPT1mKXJldHVybiBSKGUsMD09PWUuYXZhaWxfb3V0Py01Ol8pO2lmKG4uc3RybT1lLHI9bi5sYXN0X2ZsdXNoLG4ubGFzdF9mbHVzaD10LG4uc3RhdHVzPT09QylpZigyPT09bi53cmFwKWUuYWRsZXI9MCxVKG4sMzEpLFUobiwxMzkpLFUobiw4KSxuLmd6aGVhZD8oVShuLChuLmd6aGVhZC50ZXh0PzE6MCkrKG4uZ3poZWFkLmhjcmM/MjowKSsobi5nemhlYWQuZXh0cmE/NDowKSsobi5nemhlYWQubmFtZT84OjApKyhuLmd6aGVhZC5jb21tZW50PzE2OjApKSxVKG4sMjU1Jm4uZ3poZWFkLnRpbWUpLFUobixuLmd6aGVhZC50aW1lPj44JjI1NSksVShuLG4uZ3poZWFkLnRpbWU+PjE2JjI1NSksVShuLG4uZ3poZWFkLnRpbWU+PjI0JjI1NSksVShuLDk9PT1uLmxldmVsPzI6Mjw9bi5zdHJhdGVneXx8bi5sZXZlbDwyPzQ6MCksVShuLDI1NSZuLmd6aGVhZC5vcyksbi5nemhlYWQuZXh0cmEmJm4uZ3poZWFkLmV4dHJhLmxlbmd0aCYmKFUobiwyNTUmbi5nemhlYWQuZXh0cmEubGVuZ3RoKSxVKG4sbi5nemhlYWQuZXh0cmEubGVuZ3RoPj44JjI1NSkpLG4uZ3poZWFkLmhjcmMmJihlLmFkbGVyPXAoZS5hZGxlcixuLnBlbmRpbmdfYnVmLG4ucGVuZGluZywwKSksbi5nemluZGV4PTAsbi5zdGF0dXM9NjkpOihVKG4sMCksVShuLDApLFUobiwwKSxVKG4sMCksVShuLDApLFUobiw5PT09bi5sZXZlbD8yOjI8PW4uc3RyYXRlZ3l8fG4ubGV2ZWw8Mj80OjApLFUobiwzKSxuLnN0YXR1cz1FKTtlbHNle3ZhciBhPXYrKG4ud19iaXRzLTg8PDQpPDw4O2F8PSgyPD1uLnN0cmF0ZWd5fHxuLmxldmVsPDI/MDpuLmxldmVsPDY/MTo2PT09bi5sZXZlbD8yOjMpPDw2LDAhPT1uLnN0cnN0YXJ0JiYoYXw9MzIpLGErPTMxLWElMzEsbi5zdGF0dXM9RSxQKG4sYSksMCE9PW4uc3Ryc3RhcnQmJihQKG4sZS5hZGxlcj4+PjE2KSxQKG4sNjU1MzUmZS5hZGxlcikpLGUuYWRsZXI9MX1pZig2OT09PW4uc3RhdHVzKWlmKG4uZ3poZWFkLmV4dHJhKXtmb3IoaT1uLnBlbmRpbmc7bi5nemluZGV4PCg2NTUzNSZuLmd6aGVhZC5leHRyYS5sZW5ndGgpJiYobi5wZW5kaW5nIT09bi5wZW5kaW5nX2J1Zl9zaXplfHwobi5nemhlYWQuaGNyYyYmbi5wZW5kaW5nPmkmJihlLmFkbGVyPXAoZS5hZGxlcixuLnBlbmRpbmdfYnVmLG4ucGVuZGluZy1pLGkpKSxGKGUpLGk9bi5wZW5kaW5nLG4ucGVuZGluZyE9PW4ucGVuZGluZ19idWZfc2l6ZSkpOylVKG4sMjU1Jm4uZ3poZWFkLmV4dHJhW24uZ3ppbmRleF0pLG4uZ3ppbmRleCsrO24uZ3poZWFkLmhjcmMmJm4ucGVuZGluZz5pJiYoZS5hZGxlcj1wKGUuYWRsZXIsbi5wZW5kaW5nX2J1ZixuLnBlbmRpbmctaSxpKSksbi5nemluZGV4PT09bi5nemhlYWQuZXh0cmEubGVuZ3RoJiYobi5nemluZGV4PTAsbi5zdGF0dXM9NzMpfWVsc2Ugbi5zdGF0dXM9NzM7aWYoNzM9PT1uLnN0YXR1cylpZihuLmd6aGVhZC5uYW1lKXtpPW4ucGVuZGluZztkb3tpZihuLnBlbmRpbmc9PT1uLnBlbmRpbmdfYnVmX3NpemUmJihuLmd6aGVhZC5oY3JjJiZuLnBlbmRpbmc+aSYmKGUuYWRsZXI9cChlLmFkbGVyLG4ucGVuZGluZ19idWYsbi5wZW5kaW5nLWksaSkpLEYoZSksaT1uLnBlbmRpbmcsbi5wZW5kaW5nPT09bi5wZW5kaW5nX2J1Zl9zaXplKSl7cz0xO2JyZWFrfXM9bi5nemluZGV4PG4uZ3poZWFkLm5hbWUubGVuZ3RoPzI1NSZuLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQobi5nemluZGV4KyspOjAsVShuLHMpfXdoaWxlKDAhPT1zKTtuLmd6aGVhZC5oY3JjJiZuLnBlbmRpbmc+aSYmKGUuYWRsZXI9cChlLmFkbGVyLG4ucGVuZGluZ19idWYsbi5wZW5kaW5nLWksaSkpLDA9PT1zJiYobi5nemluZGV4PTAsbi5zdGF0dXM9OTEpfWVsc2Ugbi5zdGF0dXM9OTE7aWYoOTE9PT1uLnN0YXR1cylpZihuLmd6aGVhZC5jb21tZW50KXtpPW4ucGVuZGluZztkb3tpZihuLnBlbmRpbmc9PT1uLnBlbmRpbmdfYnVmX3NpemUmJihuLmd6aGVhZC5oY3JjJiZuLnBlbmRpbmc+aSYmKGUuYWRsZXI9cChlLmFkbGVyLG4ucGVuZGluZ19idWYsbi5wZW5kaW5nLWksaSkpLEYoZSksaT1uLnBlbmRpbmcsbi5wZW5kaW5nPT09bi5wZW5kaW5nX2J1Zl9zaXplKSl7cz0xO2JyZWFrfXM9bi5nemluZGV4PG4uZ3poZWFkLmNvbW1lbnQubGVuZ3RoPzI1NSZuLmd6aGVhZC5jb21tZW50LmNoYXJDb2RlQXQobi5nemluZGV4KyspOjAsVShuLHMpfXdoaWxlKDAhPT1zKTtuLmd6aGVhZC5oY3JjJiZuLnBlbmRpbmc+aSYmKGUuYWRsZXI9cChlLmFkbGVyLG4ucGVuZGluZ19idWYsbi5wZW5kaW5nLWksaSkpLDA9PT1zJiYobi5zdGF0dXM9MTAzKX1lbHNlIG4uc3RhdHVzPTEwMztpZigxMDM9PT1uLnN0YXR1cyYmKG4uZ3poZWFkLmhjcmM/KG4ucGVuZGluZysyPm4ucGVuZGluZ19idWZfc2l6ZSYmRihlKSxuLnBlbmRpbmcrMjw9bi5wZW5kaW5nX2J1Zl9zaXplJiYoVShuLDI1NSZlLmFkbGVyKSxVKG4sZS5hZGxlcj4+OCYyNTUpLGUuYWRsZXI9MCxuLnN0YXR1cz1FKSk6bi5zdGF0dXM9RSksMCE9PW4ucGVuZGluZyl7aWYoRihlKSwwPT09ZS5hdmFpbF9vdXQpcmV0dXJuIG4ubGFzdF9mbHVzaD0tMSxtfWVsc2UgaWYoMD09PWUuYXZhaWxfaW4mJlQodCk8PVQocikmJnQhPT1mKXJldHVybiBSKGUsLTUpO2lmKDY2Nj09PW4uc3RhdHVzJiYwIT09ZS5hdmFpbF9pbilyZXR1cm4gUihlLC01KTtpZigwIT09ZS5hdmFpbF9pbnx8MCE9PW4ubG9va2FoZWFkfHx0IT09bCYmNjY2IT09bi5zdGF0dXMpe3ZhciBvPTI9PT1uLnN0cmF0ZWd5P2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciByOzspe2lmKDA9PT1lLmxvb2thaGVhZCYmKGooZSksMD09PWUubG9va2FoZWFkKSl7aWYodD09PWwpcmV0dXJuIEE7YnJlYWt9aWYoZS5tYXRjaF9sZW5ndGg9MCxyPXUuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0KyssciYmKE4oZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBBfXJldHVybiBlLmluc2VydD0wLHQ9PT1mPyhOKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P086Qik6ZS5sYXN0X2xpdCYmKE4oZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP0E6SX0obix0KTozPT09bi5zdHJhdGVneT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuLGkscyxhPWUud2luZG93Ozspe2lmKGUubG9va2FoZWFkPD1TKXtpZihqKGUpLGUubG9va2FoZWFkPD1TJiZ0PT09bClyZXR1cm4gQTtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9aWYoZS5tYXRjaF9sZW5ndGg9MCxlLmxvb2thaGVhZD49eCYmMDxlLnN0cnN0YXJ0JiYobj1hW2k9ZS5zdHJzdGFydC0xXSk9PT1hWysraV0mJm49PT1hWysraV0mJm49PT1hWysraV0pe3M9ZS5zdHJzdGFydCtTO2Rve313aGlsZShuPT09YVsrK2ldJiZuPT09YVsrK2ldJiZuPT09YVsrK2ldJiZuPT09YVsrK2ldJiZuPT09YVsrK2ldJiZuPT09YVsrK2ldJiZuPT09YVsrK2ldJiZuPT09YVsrK2ldJiZpPHMpO2UubWF0Y2hfbGVuZ3RoPVMtKHMtaSksZS5tYXRjaF9sZW5ndGg+ZS5sb29rYWhlYWQmJihlLm1hdGNoX2xlbmd0aD1lLmxvb2thaGVhZCl9aWYoZS5tYXRjaF9sZW5ndGg+PXg/KHI9dS5fdHJfdGFsbHkoZSwxLGUubWF0Y2hfbGVuZ3RoLXgpLGUubG9va2FoZWFkLT1lLm1hdGNoX2xlbmd0aCxlLnN0cnN0YXJ0Kz1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aD0wKToocj11Ll90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrKSxyJiYoTihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIEF9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PWY/KE4oZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/TzpCKTplLmxhc3RfbGl0JiYoTihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCk/QTpJfShuLHQpOmhbbi5sZXZlbF0uZnVuYyhuLHQpO2lmKG8hPT1PJiZvIT09Qnx8KG4uc3RhdHVzPTY2Niksbz09PUF8fG89PT1PKXJldHVybiAwPT09ZS5hdmFpbF9vdXQmJihuLmxhc3RfZmx1c2g9LTEpLG07aWYobz09PUkmJigxPT09dD91Ll90cl9hbGlnbihuKTo1IT09dCYmKHUuX3RyX3N0b3JlZF9ibG9jayhuLDAsMCwhMSksMz09PXQmJihEKG4uaGVhZCksMD09PW4ubG9va2FoZWFkJiYobi5zdHJzdGFydD0wLG4uYmxvY2tfc3RhcnQ9MCxuLmluc2VydD0wKSkpLEYoZSksMD09PWUuYXZhaWxfb3V0KSlyZXR1cm4gbi5sYXN0X2ZsdXNoPS0xLG19cmV0dXJuIHQhPT1mP206bi53cmFwPD0wPzE6KDI9PT1uLndyYXA/KFUobiwyNTUmZS5hZGxlciksVShuLGUuYWRsZXI+PjgmMjU1KSxVKG4sZS5hZGxlcj4+MTYmMjU1KSxVKG4sZS5hZGxlcj4+MjQmMjU1KSxVKG4sMjU1JmUudG90YWxfaW4pLFUobixlLnRvdGFsX2luPj44JjI1NSksVShuLGUudG90YWxfaW4+PjE2JjI1NSksVShuLGUudG90YWxfaW4+PjI0JjI1NSkpOihQKG4sZS5hZGxlcj4+PjE2KSxQKG4sNjU1MzUmZS5hZGxlcikpLEYoZSksMDxuLndyYXAmJihuLndyYXA9LW4ud3JhcCksMCE9PW4ucGVuZGluZz9tOjEpfSxyLmRlZmxhdGVFbmQ9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGUmJmUuc3RhdGU/KHQ9ZS5zdGF0ZS5zdGF0dXMpIT09QyYmNjkhPT10JiY3MyE9PXQmJjkxIT09dCYmMTAzIT09dCYmdCE9PUUmJjY2NiE9PXQ/UihlLF8pOihlLnN0YXRlPW51bGwsdD09PUU/UihlLC0zKTptKTpffSxyLmRlZmxhdGVTZXREaWN0aW9uYXJ5PWZ1bmN0aW9uKGUsdCl7dmFyIHIsbixpLHMsYSxvLGgsdSxsPXQubGVuZ3RoO2lmKCFlfHwhZS5zdGF0ZSlyZXR1cm4gXztpZigyPT09KHM9KHI9ZS5zdGF0ZSkud3JhcCl8fDE9PT1zJiZyLnN0YXR1cyE9PUN8fHIubG9va2FoZWFkKXJldHVybiBfO2ZvcigxPT09cyYmKGUuYWRsZXI9ZChlLmFkbGVyLHQsbCwwKSksci53cmFwPTAsbD49ci53X3NpemUmJigwPT09cyYmKEQoci5oZWFkKSxyLnN0cnN0YXJ0PTAsci5ibG9ja19zdGFydD0wLHIuaW5zZXJ0PTApLHU9bmV3IGMuQnVmOChyLndfc2l6ZSksYy5hcnJheVNldCh1LHQsbC1yLndfc2l6ZSxyLndfc2l6ZSwwKSx0PXUsbD1yLndfc2l6ZSksYT1lLmF2YWlsX2luLG89ZS5uZXh0X2luLGg9ZS5pbnB1dCxlLmF2YWlsX2luPWwsZS5uZXh0X2luPTAsZS5pbnB1dD10LGoocik7ci5sb29rYWhlYWQ+PXg7KXtmb3Iobj1yLnN0cnN0YXJ0LGk9ci5sb29rYWhlYWQtKHgtMSk7ci5pbnNfaD0oci5pbnNfaDw8ci5oYXNoX3NoaWZ0XnIud2luZG93W24reC0xXSkmci5oYXNoX21hc2ssci5wcmV2W24mci53X21hc2tdPXIuaGVhZFtyLmluc19oXSxyLmhlYWRbci5pbnNfaF09bixuKyssLS1pOyk7ci5zdHJzdGFydD1uLHIubG9va2FoZWFkPXgtMSxqKHIpfXJldHVybiByLnN0cnN0YXJ0Kz1yLmxvb2thaGVhZCxyLmJsb2NrX3N0YXJ0PXIuc3Ryc3RhcnQsci5pbnNlcnQ9ci5sb29rYWhlYWQsci5sb29rYWhlYWQ9MCxyLm1hdGNoX2xlbmd0aD1yLnByZXZfbGVuZ3RoPXgtMSxyLm1hdGNoX2F2YWlsYWJsZT0wLGUubmV4dF9pbj1vLGUuaW5wdXQ9aCxlLmF2YWlsX2luPWEsci53cmFwPXMsbX0sci5kZWZsYXRlSW5mbz1cInBha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdClcIn0se1wiLi4vdXRpbHMvY29tbW9uXCI6NDEsXCIuL2FkbGVyMzJcIjo0MyxcIi4vY3JjMzJcIjo0NSxcIi4vbWVzc2FnZXNcIjo1MSxcIi4vdHJlZXNcIjo1Mn1dLDQ3OltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dGhpcy50ZXh0PTAsdGhpcy50aW1lPTAsdGhpcy54ZmxhZ3M9MCx0aGlzLm9zPTAsdGhpcy5leHRyYT1udWxsLHRoaXMuZXh0cmFfbGVuPTAsdGhpcy5uYW1lPVwiXCIsdGhpcy5jb21tZW50PVwiXCIsdGhpcy5oY3JjPTAsdGhpcy5kb25lPSExfX0se31dLDQ4OltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHIsbixpLHMsYSxvLGgsdSxsLGYsYyxkLHAsbSxfLGcsYix2LHksdyxrLHgsUyx6LEM7cj1lLnN0YXRlLG49ZS5uZXh0X2luLHo9ZS5pbnB1dCxpPW4rKGUuYXZhaWxfaW4tNSkscz1lLm5leHRfb3V0LEM9ZS5vdXRwdXQsYT1zLSh0LWUuYXZhaWxfb3V0KSxvPXMrKGUuYXZhaWxfb3V0LTI1NyksaD1yLmRtYXgsdT1yLndzaXplLGw9ci53aGF2ZSxmPXIud25leHQsYz1yLndpbmRvdyxkPXIuaG9sZCxwPXIuYml0cyxtPXIubGVuY29kZSxfPXIuZGlzdGNvZGUsZz0oMTw8ci5sZW5iaXRzKS0xLGI9KDE8PHIuZGlzdGJpdHMpLTE7ZTpkb3twPDE1JiYoZCs9eltuKytdPDxwLHArPTgsZCs9eltuKytdPDxwLHArPTgpLHY9bVtkJmddO3Q6Zm9yKDs7KXtpZihkPj4+PXk9dj4+PjI0LHAtPXksMD09PSh5PXY+Pj4xNiYyNTUpKUNbcysrXT02NTUzNSZ2O2Vsc2V7aWYoISgxNiZ5KSl7aWYoMD09KDY0JnkpKXt2PW1bKDY1NTM1JnYpKyhkJigxPDx5KS0xKV07Y29udGludWUgdH1pZigzMiZ5KXtyLm1vZGU9MTI7YnJlYWsgZX1lLm1zZz1cImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZVwiLHIubW9kZT0zMDticmVhayBlfXc9NjU1MzUmdiwoeSY9MTUpJiYocDx5JiYoZCs9eltuKytdPDxwLHArPTgpLHcrPWQmKDE8PHkpLTEsZD4+Pj15LHAtPXkpLHA8MTUmJihkKz16W24rK108PHAscCs9OCxkKz16W24rK108PHAscCs9OCksdj1fW2QmYl07cjpmb3IoOzspe2lmKGQ+Pj49eT12Pj4+MjQscC09eSwhKDE2Jih5PXY+Pj4xNiYyNTUpKSl7aWYoMD09KDY0JnkpKXt2PV9bKDY1NTM1JnYpKyhkJigxPDx5KS0xKV07Y29udGludWUgcn1lLm1zZz1cImludmFsaWQgZGlzdGFuY2UgY29kZVwiLHIubW9kZT0zMDticmVhayBlfWlmKGs9NjU1MzUmdixwPCh5Jj0xNSkmJihkKz16W24rK108PHAsKHArPTgpPHkmJihkKz16W24rK108PHAscCs9OCkpLGg8KGsrPWQmKDE8PHkpLTEpKXtlLm1zZz1cImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrXCIsci5tb2RlPTMwO2JyZWFrIGV9aWYoZD4+Pj15LHAtPXksKHk9cy1hKTxrKXtpZihsPCh5PWsteSkmJnIuc2FuZSl7ZS5tc2c9XCJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFja1wiLHIubW9kZT0zMDticmVhayBlfWlmKFM9YywoeD0wKT09PWYpe2lmKHgrPXUteSx5PHcpe2Zvcih3LT15O0NbcysrXT1jW3grK10sLS15Oyk7eD1zLWssUz1DfX1lbHNlIGlmKGY8eSl7aWYoeCs9dStmLXksKHktPWYpPHcpe2Zvcih3LT15O0NbcysrXT1jW3grK10sLS15Oyk7aWYoeD0wLGY8dyl7Zm9yKHctPXk9ZjtDW3MrK109Y1t4KytdLC0teTspO3g9cy1rLFM9Q319fWVsc2UgaWYoeCs9Zi15LHk8dyl7Zm9yKHctPXk7Q1tzKytdPWNbeCsrXSwtLXk7KTt4PXMtayxTPUN9Zm9yKDsyPHc7KUNbcysrXT1TW3grK10sQ1tzKytdPVNbeCsrXSxDW3MrK109U1t4KytdLHctPTM7dyYmKENbcysrXT1TW3grK10sMTx3JiYoQ1tzKytdPVNbeCsrXSkpfWVsc2V7Zm9yKHg9cy1rO0NbcysrXT1DW3grK10sQ1tzKytdPUNbeCsrXSxDW3MrK109Q1t4KytdLDI8KHctPTMpOyk7dyYmKENbcysrXT1DW3grK10sMTx3JiYoQ1tzKytdPUNbeCsrXSkpfWJyZWFrfX1icmVha319d2hpbGUobjxpJiZzPG8pO24tPXc9cD4+MyxkJj0oMTw8KHAtPXc8PDMpKS0xLGUubmV4dF9pbj1uLGUubmV4dF9vdXQ9cyxlLmF2YWlsX2luPW48aT9pLW4rNTo1LShuLWkpLGUuYXZhaWxfb3V0PXM8bz9vLXMrMjU3OjI1Ny0ocy1vKSxyLmhvbGQ9ZCxyLmJpdHM9cH19LHt9XSw0OTpbZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3ZhciBJPWUoXCIuLi91dGlscy9jb21tb25cIiksTz1lKFwiLi9hZGxlcjMyXCIpLEI9ZShcIi4vY3JjMzJcIiksUj1lKFwiLi9pbmZmYXN0XCIpLFQ9ZShcIi4vaW5mdHJlZXNcIiksRD0xLEY9MixOPTAsVT0tMixQPTEsbj04NTIsaT01OTI7ZnVuY3Rpb24gTChlKXtyZXR1cm4oZT4+PjI0JjI1NSkrKGU+Pj44JjY1MjgwKSsoKDY1MjgwJmUpPDw4KSsoKDI1NSZlKTw8MjQpfWZ1bmN0aW9uIHMoKXt0aGlzLm1vZGU9MCx0aGlzLmxhc3Q9ITEsdGhpcy53cmFwPTAsdGhpcy5oYXZlZGljdD0hMSx0aGlzLmZsYWdzPTAsdGhpcy5kbWF4PTAsdGhpcy5jaGVjaz0wLHRoaXMudG90YWw9MCx0aGlzLmhlYWQ9bnVsbCx0aGlzLndiaXRzPTAsdGhpcy53c2l6ZT0wLHRoaXMud2hhdmU9MCx0aGlzLnduZXh0PTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLmhvbGQ9MCx0aGlzLmJpdHM9MCx0aGlzLmxlbmd0aD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5leHRyYT0wLHRoaXMubGVuY29kZT1udWxsLHRoaXMuZGlzdGNvZGU9bnVsbCx0aGlzLmxlbmJpdHM9MCx0aGlzLmRpc3RiaXRzPTAsdGhpcy5uY29kZT0wLHRoaXMubmxlbj0wLHRoaXMubmRpc3Q9MCx0aGlzLmhhdmU9MCx0aGlzLm5leHQ9bnVsbCx0aGlzLmxlbnM9bmV3IEkuQnVmMTYoMzIwKSx0aGlzLndvcms9bmV3IEkuQnVmMTYoMjg4KSx0aGlzLmxlbmR5bj1udWxsLHRoaXMuZGlzdGR5bj1udWxsLHRoaXMuc2FuZT0wLHRoaXMuYmFjaz0wLHRoaXMud2FzPTB9ZnVuY3Rpb24gYShlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8odD1lLnN0YXRlLGUudG90YWxfaW49ZS50b3RhbF9vdXQ9dC50b3RhbD0wLGUubXNnPVwiXCIsdC53cmFwJiYoZS5hZGxlcj0xJnQud3JhcCksdC5tb2RlPVAsdC5sYXN0PTAsdC5oYXZlZGljdD0wLHQuZG1heD0zMjc2OCx0LmhlYWQ9bnVsbCx0LmhvbGQ9MCx0LmJpdHM9MCx0LmxlbmNvZGU9dC5sZW5keW49bmV3IEkuQnVmMzIobiksdC5kaXN0Y29kZT10LmRpc3RkeW49bmV3IEkuQnVmMzIoaSksdC5zYW5lPTEsdC5iYWNrPS0xLE4pOlV9ZnVuY3Rpb24gbyhlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8oKHQ9ZS5zdGF0ZSkud3NpemU9MCx0LndoYXZlPTAsdC53bmV4dD0wLGEoZSkpOlV9ZnVuY3Rpb24gaChlLHQpe3ZhciByLG47cmV0dXJuIGUmJmUuc3RhdGU/KG49ZS5zdGF0ZSx0PDA/KHI9MCx0PS10KToocj0xKyh0Pj40KSx0PDQ4JiYodCY9MTUpKSx0JiYodDw4fHwxNTx0KT9VOihudWxsIT09bi53aW5kb3cmJm4ud2JpdHMhPT10JiYobi53aW5kb3c9bnVsbCksbi53cmFwPXIsbi53Yml0cz10LG8oZSkpKTpVfWZ1bmN0aW9uIHUoZSx0KXt2YXIgcixuO3JldHVybiBlPyhuPW5ldyBzLChlLnN0YXRlPW4pLndpbmRvdz1udWxsLChyPWgoZSx0KSkhPT1OJiYoZS5zdGF0ZT1udWxsKSxyKTpVfXZhciBsLGYsYz0hMDtmdW5jdGlvbiBqKGUpe2lmKGMpe3ZhciB0O2ZvcihsPW5ldyBJLkJ1ZjMyKDUxMiksZj1uZXcgSS5CdWYzMigzMiksdD0wO3Q8MTQ0OyllLmxlbnNbdCsrXT04O2Zvcig7dDwyNTY7KWUubGVuc1t0KytdPTk7Zm9yKDt0PDI4MDspZS5sZW5zW3QrK109Nztmb3IoO3Q8Mjg4OyllLmxlbnNbdCsrXT04O2ZvcihUKEQsZS5sZW5zLDAsMjg4LGwsMCxlLndvcmsse2JpdHM6OX0pLHQ9MDt0PDMyOyllLmxlbnNbdCsrXT01O1QoRixlLmxlbnMsMCwzMixmLDAsZS53b3JrLHtiaXRzOjV9KSxjPSExfWUubGVuY29kZT1sLGUubGVuYml0cz05LGUuZGlzdGNvZGU9ZixlLmRpc3RiaXRzPTV9ZnVuY3Rpb24gWihlLHQscixuKXt2YXIgaSxzPWUuc3RhdGU7cmV0dXJuIG51bGw9PT1zLndpbmRvdyYmKHMud3NpemU9MTw8cy53Yml0cyxzLnduZXh0PTAscy53aGF2ZT0wLHMud2luZG93PW5ldyBJLkJ1Zjgocy53c2l6ZSkpLG4+PXMud3NpemU/KEkuYXJyYXlTZXQocy53aW5kb3csdCxyLXMud3NpemUscy53c2l6ZSwwKSxzLnduZXh0PTAscy53aGF2ZT1zLndzaXplKToobjwoaT1zLndzaXplLXMud25leHQpJiYoaT1uKSxJLmFycmF5U2V0KHMud2luZG93LHQsci1uLGkscy53bmV4dCksKG4tPWkpPyhJLmFycmF5U2V0KHMud2luZG93LHQsci1uLG4sMCkscy53bmV4dD1uLHMud2hhdmU9cy53c2l6ZSk6KHMud25leHQrPWkscy53bmV4dD09PXMud3NpemUmJihzLnduZXh0PTApLHMud2hhdmU8cy53c2l6ZSYmKHMud2hhdmUrPWkpKSksMH1yLmluZmxhdGVSZXNldD1vLHIuaW5mbGF0ZVJlc2V0Mj1oLHIuaW5mbGF0ZVJlc2V0S2VlcD1hLHIuaW5mbGF0ZUluaXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHUoZSwxNSl9LHIuaW5mbGF0ZUluaXQyPXUsci5pbmZsYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIHIsbixpLHMsYSxvLGgsdSxsLGYsYyxkLHAsbSxfLGcsYix2LHksdyxrLHgsUyx6LEM9MCxFPW5ldyBJLkJ1ZjgoNCksQT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07aWYoIWV8fCFlLnN0YXRlfHwhZS5vdXRwdXR8fCFlLmlucHV0JiYwIT09ZS5hdmFpbF9pbilyZXR1cm4gVTsxMj09PShyPWUuc3RhdGUpLm1vZGUmJihyLm1vZGU9MTMpLGE9ZS5uZXh0X291dCxpPWUub3V0cHV0LGg9ZS5hdmFpbF9vdXQscz1lLm5leHRfaW4sbj1lLmlucHV0LG89ZS5hdmFpbF9pbix1PXIuaG9sZCxsPXIuYml0cyxmPW8sYz1oLHg9TjtlOmZvcig7Oylzd2l0Y2goci5tb2RlKXtjYXNlIFA6aWYoMD09PXIud3JhcCl7ci5tb2RlPTEzO2JyZWFrfWZvcig7bDwxNjspe2lmKDA9PT1vKWJyZWFrIGU7by0tLHUrPW5bcysrXTw8bCxsKz04fWlmKDImci53cmFwJiYzNTYxNT09PXUpe0Vbci5jaGVjaz0wXT0yNTUmdSxFWzFdPXU+Pj44JjI1NSxyLmNoZWNrPUIoci5jaGVjayxFLDIsMCksbD11PTAsci5tb2RlPTI7YnJlYWt9aWYoci5mbGFncz0wLHIuaGVhZCYmKHIuaGVhZC5kb25lPSExKSwhKDEmci53cmFwKXx8KCgoMjU1JnUpPDw4KSsodT4+OCkpJTMxKXtlLm1zZz1cImluY29ycmVjdCBoZWFkZXIgY2hlY2tcIixyLm1vZGU9MzA7YnJlYWt9aWYoOCE9KDE1JnUpKXtlLm1zZz1cInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kXCIsci5tb2RlPTMwO2JyZWFrfWlmKGwtPTQsaz04KygxNSYodT4+Pj00KSksMD09PXIud2JpdHMpci53Yml0cz1rO2Vsc2UgaWYoaz5yLndiaXRzKXtlLm1zZz1cImludmFsaWQgd2luZG93IHNpemVcIixyLm1vZGU9MzA7YnJlYWt9ci5kbWF4PTE8PGssZS5hZGxlcj1yLmNoZWNrPTEsci5tb2RlPTUxMiZ1PzEwOjEyLGw9dT0wO2JyZWFrO2Nhc2UgMjpmb3IoO2w8MTY7KXtpZigwPT09bylicmVhayBlO28tLSx1Kz1uW3MrK108PGwsbCs9OH1pZihyLmZsYWdzPXUsOCE9KDI1NSZyLmZsYWdzKSl7ZS5tc2c9XCJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZFwiLHIubW9kZT0zMDticmVha31pZig1NzM0NCZyLmZsYWdzKXtlLm1zZz1cInVua25vd24gaGVhZGVyIGZsYWdzIHNldFwiLHIubW9kZT0zMDticmVha31yLmhlYWQmJihyLmhlYWQudGV4dD11Pj44JjEpLDUxMiZyLmZsYWdzJiYoRVswXT0yNTUmdSxFWzFdPXU+Pj44JjI1NSxyLmNoZWNrPUIoci5jaGVjayxFLDIsMCkpLGw9dT0wLHIubW9kZT0zO2Nhc2UgMzpmb3IoO2w8MzI7KXtpZigwPT09bylicmVhayBlO28tLSx1Kz1uW3MrK108PGwsbCs9OH1yLmhlYWQmJihyLmhlYWQudGltZT11KSw1MTImci5mbGFncyYmKEVbMF09MjU1JnUsRVsxXT11Pj4+OCYyNTUsRVsyXT11Pj4+MTYmMjU1LEVbM109dT4+PjI0JjI1NSxyLmNoZWNrPUIoci5jaGVjayxFLDQsMCkpLGw9dT0wLHIubW9kZT00O2Nhc2UgNDpmb3IoO2w8MTY7KXtpZigwPT09bylicmVhayBlO28tLSx1Kz1uW3MrK108PGwsbCs9OH1yLmhlYWQmJihyLmhlYWQueGZsYWdzPTI1NSZ1LHIuaGVhZC5vcz11Pj44KSw1MTImci5mbGFncyYmKEVbMF09MjU1JnUsRVsxXT11Pj4+OCYyNTUsci5jaGVjaz1CKHIuY2hlY2ssRSwyLDApKSxsPXU9MCxyLm1vZGU9NTtjYXNlIDU6aWYoMTAyNCZyLmZsYWdzKXtmb3IoO2w8MTY7KXtpZigwPT09bylicmVhayBlO28tLSx1Kz1uW3MrK108PGwsbCs9OH1yLmxlbmd0aD11LHIuaGVhZCYmKHIuaGVhZC5leHRyYV9sZW49dSksNTEyJnIuZmxhZ3MmJihFWzBdPTI1NSZ1LEVbMV09dT4+PjgmMjU1LHIuY2hlY2s9QihyLmNoZWNrLEUsMiwwKSksbD11PTB9ZWxzZSByLmhlYWQmJihyLmhlYWQuZXh0cmE9bnVsbCk7ci5tb2RlPTY7Y2FzZSA2OmlmKDEwMjQmci5mbGFncyYmKG88KGQ9ci5sZW5ndGgpJiYoZD1vKSxkJiYoci5oZWFkJiYoaz1yLmhlYWQuZXh0cmFfbGVuLXIubGVuZ3RoLHIuaGVhZC5leHRyYXx8KHIuaGVhZC5leHRyYT1uZXcgQXJyYXkoci5oZWFkLmV4dHJhX2xlbikpLEkuYXJyYXlTZXQoci5oZWFkLmV4dHJhLG4scyxkLGspKSw1MTImci5mbGFncyYmKHIuY2hlY2s9QihyLmNoZWNrLG4sZCxzKSksby09ZCxzKz1kLHIubGVuZ3RoLT1kKSxyLmxlbmd0aCkpYnJlYWsgZTtyLmxlbmd0aD0wLHIubW9kZT03O2Nhc2UgNzppZigyMDQ4JnIuZmxhZ3Mpe2lmKDA9PT1vKWJyZWFrIGU7Zm9yKGQ9MDtrPW5bcytkKytdLHIuaGVhZCYmayYmci5sZW5ndGg8NjU1MzYmJihyLmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShrKSksayYmZDxvOyk7aWYoNTEyJnIuZmxhZ3MmJihyLmNoZWNrPUIoci5jaGVjayxuLGQscykpLG8tPWQscys9ZCxrKWJyZWFrIGV9ZWxzZSByLmhlYWQmJihyLmhlYWQubmFtZT1udWxsKTtyLmxlbmd0aD0wLHIubW9kZT04O2Nhc2UgODppZig0MDk2JnIuZmxhZ3Mpe2lmKDA9PT1vKWJyZWFrIGU7Zm9yKGQ9MDtrPW5bcytkKytdLHIuaGVhZCYmayYmci5sZW5ndGg8NjU1MzYmJihyLmhlYWQuY29tbWVudCs9U3RyaW5nLmZyb21DaGFyQ29kZShrKSksayYmZDxvOyk7aWYoNTEyJnIuZmxhZ3MmJihyLmNoZWNrPUIoci5jaGVjayxuLGQscykpLG8tPWQscys9ZCxrKWJyZWFrIGV9ZWxzZSByLmhlYWQmJihyLmhlYWQuY29tbWVudD1udWxsKTtyLm1vZGU9OTtjYXNlIDk6aWYoNTEyJnIuZmxhZ3Mpe2Zvcig7bDwxNjspe2lmKDA9PT1vKWJyZWFrIGU7by0tLHUrPW5bcysrXTw8bCxsKz04fWlmKHUhPT0oNjU1MzUmci5jaGVjaykpe2UubXNnPVwiaGVhZGVyIGNyYyBtaXNtYXRjaFwiLHIubW9kZT0zMDticmVha31sPXU9MH1yLmhlYWQmJihyLmhlYWQuaGNyYz1yLmZsYWdzPj45JjEsci5oZWFkLmRvbmU9ITApLGUuYWRsZXI9ci5jaGVjaz0wLHIubW9kZT0xMjticmVhaztjYXNlIDEwOmZvcig7bDwzMjspe2lmKDA9PT1vKWJyZWFrIGU7by0tLHUrPW5bcysrXTw8bCxsKz04fWUuYWRsZXI9ci5jaGVjaz1MKHUpLGw9dT0wLHIubW9kZT0xMTtjYXNlIDExOmlmKDA9PT1yLmhhdmVkaWN0KXJldHVybiBlLm5leHRfb3V0PWEsZS5hdmFpbF9vdXQ9aCxlLm5leHRfaW49cyxlLmF2YWlsX2luPW8sci5ob2xkPXUsci5iaXRzPWwsMjtlLmFkbGVyPXIuY2hlY2s9MSxyLm1vZGU9MTI7Y2FzZSAxMjppZig1PT09dHx8Nj09PXQpYnJlYWsgZTtjYXNlIDEzOmlmKHIubGFzdCl7dT4+Pj03JmwsbC09NyZsLHIubW9kZT0yNzticmVha31mb3IoO2w8Mzspe2lmKDA9PT1vKWJyZWFrIGU7by0tLHUrPW5bcysrXTw8bCxsKz04fXN3aXRjaChyLmxhc3Q9MSZ1LGwtPTEsMyYodT4+Pj0xKSl7Y2FzZSAwOnIubW9kZT0xNDticmVhaztjYXNlIDE6aWYoaihyKSxyLm1vZGU9MjAsNiE9PXQpYnJlYWs7dT4+Pj0yLGwtPTI7YnJlYWsgZTtjYXNlIDI6ci5tb2RlPTE3O2JyZWFrO2Nhc2UgMzplLm1zZz1cImludmFsaWQgYmxvY2sgdHlwZVwiLHIubW9kZT0zMH11Pj4+PTIsbC09MjticmVhaztjYXNlIDE0OmZvcih1Pj4+PTcmbCxsLT03Jmw7bDwzMjspe2lmKDA9PT1vKWJyZWFrIGU7by0tLHUrPW5bcysrXTw8bCxsKz04fWlmKCg2NTUzNSZ1KSE9KHU+Pj4xNl42NTUzNSkpe2UubXNnPVwiaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3Roc1wiLHIubW9kZT0zMDticmVha31pZihyLmxlbmd0aD02NTUzNSZ1LGw9dT0wLHIubW9kZT0xNSw2PT09dClicmVhayBlO2Nhc2UgMTU6ci5tb2RlPTE2O2Nhc2UgMTY6aWYoZD1yLmxlbmd0aCl7aWYobzxkJiYoZD1vKSxoPGQmJihkPWgpLDA9PT1kKWJyZWFrIGU7SS5hcnJheVNldChpLG4scyxkLGEpLG8tPWQscys9ZCxoLT1kLGErPWQsci5sZW5ndGgtPWQ7YnJlYWt9ci5tb2RlPTEyO2JyZWFrO2Nhc2UgMTc6Zm9yKDtsPDE0Oyl7aWYoMD09PW8pYnJlYWsgZTtvLS0sdSs9bltzKytdPDxsLGwrPTh9aWYoci5ubGVuPTI1NysoMzEmdSksdT4+Pj01LGwtPTUsci5uZGlzdD0xKygzMSZ1KSx1Pj4+PTUsbC09NSxyLm5jb2RlPTQrKDE1JnUpLHU+Pj49NCxsLT00LDI4NjxyLm5sZW58fDMwPHIubmRpc3Qpe2UubXNnPVwidG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHNcIixyLm1vZGU9MzA7YnJlYWt9ci5oYXZlPTAsci5tb2RlPTE4O2Nhc2UgMTg6Zm9yKDtyLmhhdmU8ci5uY29kZTspe2Zvcig7bDwzOyl7aWYoMD09PW8pYnJlYWsgZTtvLS0sdSs9bltzKytdPDxsLGwrPTh9ci5sZW5zW0Fbci5oYXZlKytdXT03JnUsdT4+Pj0zLGwtPTN9Zm9yKDtyLmhhdmU8MTk7KXIubGVuc1tBW3IuaGF2ZSsrXV09MDtpZihyLmxlbmNvZGU9ci5sZW5keW4sci5sZW5iaXRzPTcsUz17Yml0czpyLmxlbmJpdHN9LHg9VCgwLHIubGVucywwLDE5LHIubGVuY29kZSwwLHIud29yayxTKSxyLmxlbmJpdHM9Uy5iaXRzLHgpe2UubXNnPVwiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0XCIsci5tb2RlPTMwO2JyZWFrfXIuaGF2ZT0wLHIubW9kZT0xOTtjYXNlIDE5OmZvcig7ci5oYXZlPHIubmxlbityLm5kaXN0Oyl7Zm9yKDtnPShDPXIubGVuY29kZVt1JigxPDxyLmxlbmJpdHMpLTFdKT4+PjE2JjI1NSxiPTY1NTM1JkMsISgoXz1DPj4+MjQpPD1sKTspe2lmKDA9PT1vKWJyZWFrIGU7by0tLHUrPW5bcysrXTw8bCxsKz04fWlmKGI8MTYpdT4+Pj1fLGwtPV8sci5sZW5zW3IuaGF2ZSsrXT1iO2Vsc2V7aWYoMTY9PT1iKXtmb3Ioej1fKzI7bDx6Oyl7aWYoMD09PW8pYnJlYWsgZTtvLS0sdSs9bltzKytdPDxsLGwrPTh9aWYodT4+Pj1fLGwtPV8sMD09PXIuaGF2ZSl7ZS5tc2c9XCJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0XCIsci5tb2RlPTMwO2JyZWFrfWs9ci5sZW5zW3IuaGF2ZS0xXSxkPTMrKDMmdSksdT4+Pj0yLGwtPTJ9ZWxzZSBpZigxNz09PWIpe2Zvcih6PV8rMztsPHo7KXtpZigwPT09bylicmVhayBlO28tLSx1Kz1uW3MrK108PGwsbCs9OH1sLT1fLGs9MCxkPTMrKDcmKHU+Pj49XykpLHU+Pj49MyxsLT0zfWVsc2V7Zm9yKHo9Xys3O2w8ejspe2lmKDA9PT1vKWJyZWFrIGU7by0tLHUrPW5bcysrXTw8bCxsKz04fWwtPV8saz0wLGQ9MTErKDEyNyYodT4+Pj1fKSksdT4+Pj03LGwtPTd9aWYoci5oYXZlK2Q+ci5ubGVuK3IubmRpc3Qpe2UubXNnPVwiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdFwiLHIubW9kZT0zMDticmVha31mb3IoO2QtLTspci5sZW5zW3IuaGF2ZSsrXT1rfX1pZigzMD09PXIubW9kZSlicmVhaztpZigwPT09ci5sZW5zWzI1Nl0pe2UubXNnPVwiaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrXCIsci5tb2RlPTMwO2JyZWFrfWlmKHIubGVuYml0cz05LFM9e2JpdHM6ci5sZW5iaXRzfSx4PVQoRCxyLmxlbnMsMCxyLm5sZW4sci5sZW5jb2RlLDAsci53b3JrLFMpLHIubGVuYml0cz1TLmJpdHMseCl7ZS5tc2c9XCJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXRcIixyLm1vZGU9MzA7YnJlYWt9aWYoci5kaXN0Yml0cz02LHIuZGlzdGNvZGU9ci5kaXN0ZHluLFM9e2JpdHM6ci5kaXN0Yml0c30seD1UKEYsci5sZW5zLHIubmxlbixyLm5kaXN0LHIuZGlzdGNvZGUsMCxyLndvcmssUyksci5kaXN0Yml0cz1TLmJpdHMseCl7ZS5tc2c9XCJpbnZhbGlkIGRpc3RhbmNlcyBzZXRcIixyLm1vZGU9MzA7YnJlYWt9aWYoci5tb2RlPTIwLDY9PT10KWJyZWFrIGU7Y2FzZSAyMDpyLm1vZGU9MjE7Y2FzZSAyMTppZig2PD1vJiYyNTg8PWgpe2UubmV4dF9vdXQ9YSxlLmF2YWlsX291dD1oLGUubmV4dF9pbj1zLGUuYXZhaWxfaW49byxyLmhvbGQ9dSxyLmJpdHM9bCxSKGUsYyksYT1lLm5leHRfb3V0LGk9ZS5vdXRwdXQsaD1lLmF2YWlsX291dCxzPWUubmV4dF9pbixuPWUuaW5wdXQsbz1lLmF2YWlsX2luLHU9ci5ob2xkLGw9ci5iaXRzLDEyPT09ci5tb2RlJiYoci5iYWNrPS0xKTticmVha31mb3Ioci5iYWNrPTA7Zz0oQz1yLmxlbmNvZGVbdSYoMTw8ci5sZW5iaXRzKS0xXSk+Pj4xNiYyNTUsYj02NTUzNSZDLCEoKF89Qz4+PjI0KTw9bCk7KXtpZigwPT09bylicmVhayBlO28tLSx1Kz1uW3MrK108PGwsbCs9OH1pZihnJiYwPT0oMjQwJmcpKXtmb3Iodj1fLHk9Zyx3PWI7Zz0oQz1yLmxlbmNvZGVbdysoKHUmKDE8PHYreSktMSk+PnYpXSk+Pj4xNiYyNTUsYj02NTUzNSZDLCEodisoXz1DPj4+MjQpPD1sKTspe2lmKDA9PT1vKWJyZWFrIGU7by0tLHUrPW5bcysrXTw8bCxsKz04fXU+Pj49dixsLT12LHIuYmFjays9dn1pZih1Pj4+PV8sbC09XyxyLmJhY2srPV8sci5sZW5ndGg9YiwwPT09Zyl7ci5tb2RlPTI2O2JyZWFrfWlmKDMyJmcpe3IuYmFjaz0tMSxyLm1vZGU9MTI7YnJlYWt9aWYoNjQmZyl7ZS5tc2c9XCJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGVcIixyLm1vZGU9MzA7YnJlYWt9ci5leHRyYT0xNSZnLHIubW9kZT0yMjtjYXNlIDIyOmlmKHIuZXh0cmEpe2Zvcih6PXIuZXh0cmE7bDx6Oyl7aWYoMD09PW8pYnJlYWsgZTtvLS0sdSs9bltzKytdPDxsLGwrPTh9ci5sZW5ndGgrPXUmKDE8PHIuZXh0cmEpLTEsdT4+Pj1yLmV4dHJhLGwtPXIuZXh0cmEsci5iYWNrKz1yLmV4dHJhfXIud2FzPXIubGVuZ3RoLHIubW9kZT0yMztjYXNlIDIzOmZvcig7Zz0oQz1yLmRpc3Rjb2RlW3UmKDE8PHIuZGlzdGJpdHMpLTFdKT4+PjE2JjI1NSxiPTY1NTM1JkMsISgoXz1DPj4+MjQpPD1sKTspe2lmKDA9PT1vKWJyZWFrIGU7by0tLHUrPW5bcysrXTw8bCxsKz04fWlmKDA9PSgyNDAmZykpe2Zvcih2PV8seT1nLHc9YjtnPShDPXIuZGlzdGNvZGVbdysoKHUmKDE8PHYreSktMSk+PnYpXSk+Pj4xNiYyNTUsYj02NTUzNSZDLCEodisoXz1DPj4+MjQpPD1sKTspe2lmKDA9PT1vKWJyZWFrIGU7by0tLHUrPW5bcysrXTw8bCxsKz04fXU+Pj49dixsLT12LHIuYmFjays9dn1pZih1Pj4+PV8sbC09XyxyLmJhY2srPV8sNjQmZyl7ZS5tc2c9XCJpbnZhbGlkIGRpc3RhbmNlIGNvZGVcIixyLm1vZGU9MzA7YnJlYWt9ci5vZmZzZXQ9YixyLmV4dHJhPTE1Jmcsci5tb2RlPTI0O2Nhc2UgMjQ6aWYoci5leHRyYSl7Zm9yKHo9ci5leHRyYTtsPHo7KXtpZigwPT09bylicmVhayBlO28tLSx1Kz1uW3MrK108PGwsbCs9OH1yLm9mZnNldCs9dSYoMTw8ci5leHRyYSktMSx1Pj4+PXIuZXh0cmEsbC09ci5leHRyYSxyLmJhY2srPXIuZXh0cmF9aWYoci5vZmZzZXQ+ci5kbWF4KXtlLm1zZz1cImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrXCIsci5tb2RlPTMwO2JyZWFrfXIubW9kZT0yNTtjYXNlIDI1OmlmKDA9PT1oKWJyZWFrIGU7aWYoZD1jLWgsci5vZmZzZXQ+ZCl7aWYoKGQ9ci5vZmZzZXQtZCk+ci53aGF2ZSYmci5zYW5lKXtlLm1zZz1cImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrXCIsci5tb2RlPTMwO2JyZWFrfXA9ZD5yLnduZXh0PyhkLT1yLnduZXh0LHIud3NpemUtZCk6ci53bmV4dC1kLGQ+ci5sZW5ndGgmJihkPXIubGVuZ3RoKSxtPXIud2luZG93fWVsc2UgbT1pLHA9YS1yLm9mZnNldCxkPXIubGVuZ3RoO2ZvcihoPGQmJihkPWgpLGgtPWQsci5sZW5ndGgtPWQ7aVthKytdPW1bcCsrXSwtLWQ7KTswPT09ci5sZW5ndGgmJihyLm1vZGU9MjEpO2JyZWFrO2Nhc2UgMjY6aWYoMD09PWgpYnJlYWsgZTtpW2ErK109ci5sZW5ndGgsaC0tLHIubW9kZT0yMTticmVhaztjYXNlIDI3OmlmKHIud3JhcCl7Zm9yKDtsPDMyOyl7aWYoMD09PW8pYnJlYWsgZTtvLS0sdXw9bltzKytdPDxsLGwrPTh9aWYoYy09aCxlLnRvdGFsX291dCs9YyxyLnRvdGFsKz1jLGMmJihlLmFkbGVyPXIuY2hlY2s9ci5mbGFncz9CKHIuY2hlY2ssaSxjLGEtYyk6TyhyLmNoZWNrLGksYyxhLWMpKSxjPWgsKHIuZmxhZ3M/dTpMKHUpKSE9PXIuY2hlY2spe2UubXNnPVwiaW5jb3JyZWN0IGRhdGEgY2hlY2tcIixyLm1vZGU9MzA7YnJlYWt9bD11PTB9ci5tb2RlPTI4O2Nhc2UgMjg6aWYoci53cmFwJiZyLmZsYWdzKXtmb3IoO2w8MzI7KXtpZigwPT09bylicmVhayBlO28tLSx1Kz1uW3MrK108PGwsbCs9OH1pZih1IT09KDQyOTQ5NjcyOTUmci50b3RhbCkpe2UubXNnPVwiaW5jb3JyZWN0IGxlbmd0aCBjaGVja1wiLHIubW9kZT0zMDticmVha31sPXU9MH1yLm1vZGU9Mjk7Y2FzZSAyOTp4PTE7YnJlYWsgZTtjYXNlIDMwOng9LTM7YnJlYWsgZTtjYXNlIDMxOnJldHVybi00O2Nhc2UgMzI6ZGVmYXVsdDpyZXR1cm4gVX1yZXR1cm4gZS5uZXh0X291dD1hLGUuYXZhaWxfb3V0PWgsZS5uZXh0X2luPXMsZS5hdmFpbF9pbj1vLHIuaG9sZD11LHIuYml0cz1sLChyLndzaXplfHxjIT09ZS5hdmFpbF9vdXQmJnIubW9kZTwzMCYmKHIubW9kZTwyN3x8NCE9PXQpKSYmWihlLGUub3V0cHV0LGUubmV4dF9vdXQsYy1lLmF2YWlsX291dCk/KHIubW9kZT0zMSwtNCk6KGYtPWUuYXZhaWxfaW4sYy09ZS5hdmFpbF9vdXQsZS50b3RhbF9pbis9ZixlLnRvdGFsX291dCs9YyxyLnRvdGFsKz1jLHIud3JhcCYmYyYmKGUuYWRsZXI9ci5jaGVjaz1yLmZsYWdzP0Ioci5jaGVjayxpLGMsZS5uZXh0X291dC1jKTpPKHIuY2hlY2ssaSxjLGUubmV4dF9vdXQtYykpLGUuZGF0YV90eXBlPXIuYml0cysoci5sYXN0PzY0OjApKygxMj09PXIubW9kZT8xMjg6MCkrKDIwPT09ci5tb2RlfHwxNT09PXIubW9kZT8yNTY6MCksKDA9PWYmJjA9PT1jfHw0PT09dCkmJng9PT1OJiYoeD0tNSkseCl9LHIuaW5mbGF0ZUVuZD1mdW5jdGlvbihlKXtpZighZXx8IWUuc3RhdGUpcmV0dXJuIFU7dmFyIHQ9ZS5zdGF0ZTtyZXR1cm4gdC53aW5kb3cmJih0LndpbmRvdz1udWxsKSxlLnN0YXRlPW51bGwsTn0sci5pbmZsYXRlR2V0SGVhZGVyPWZ1bmN0aW9uKGUsdCl7dmFyIHI7cmV0dXJuIGUmJmUuc3RhdGU/MD09KDImKHI9ZS5zdGF0ZSkud3JhcCk/VTooKHIuaGVhZD10KS5kb25lPSExLE4pOlV9LHIuaW5mbGF0ZVNldERpY3Rpb25hcnk9ZnVuY3Rpb24oZSx0KXt2YXIgcixuPXQubGVuZ3RoO3JldHVybiBlJiZlLnN0YXRlPzAhPT0ocj1lLnN0YXRlKS53cmFwJiYxMSE9PXIubW9kZT9VOjExPT09ci5tb2RlJiZPKDEsdCxuLDApIT09ci5jaGVjaz8tMzpaKGUsdCxuLG4pPyhyLm1vZGU9MzEsLTQpOihyLmhhdmVkaWN0PTEsTik6VX0sci5pbmZsYXRlSW5mbz1cInBha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdClcIn0se1wiLi4vdXRpbHMvY29tbW9uXCI6NDEsXCIuL2FkbGVyMzJcIjo0MyxcIi4vY3JjMzJcIjo0NSxcIi4vaW5mZmFzdFwiOjQ4LFwiLi9pbmZ0cmVlc1wiOjUwfV0sNTA6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt2YXIgRD1lKFwiLi4vdXRpbHMvY29tbW9uXCIpLEY9WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSxOPVsxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNywxNywxNywxNywxOCwxOCwxOCwxOCwxOSwxOSwxOSwxOSwyMCwyMCwyMCwyMCwyMSwyMSwyMSwyMSwxNiw3Miw3OF0sVT1bMSwyLDMsNCw1LDcsOSwxMywxNywyNSwzMyw0OSw2NSw5NywxMjksMTkzLDI1NywzODUsNTEzLDc2OSwxMDI1LDE1MzcsMjA0OSwzMDczLDQwOTcsNjE0NSw4MTkzLDEyMjg5LDE2Mzg1LDI0NTc3LDAsMF0sUD1bMTYsMTYsMTYsMTYsMTcsMTcsMTgsMTgsMTksMTksMjAsMjAsMjEsMjEsMjIsMjIsMjMsMjMsMjQsMjQsMjUsMjUsMjYsMjYsMjcsMjcsMjgsMjgsMjksMjksNjQsNjRdO3QuZXhwb3J0cz1mdW5jdGlvbihlLHQscixuLGkscyxhLG8pe3ZhciBoLHUsbCxmLGMsZCxwLG0sXyxnPW8uYml0cyxiPTAsdj0wLHk9MCx3PTAsaz0wLHg9MCxTPTAsej0wLEM9MCxFPTAsQT1udWxsLEk9MCxPPW5ldyBELkJ1ZjE2KDE2KSxCPW5ldyBELkJ1ZjE2KDE2KSxSPW51bGwsVD0wO2ZvcihiPTA7Yjw9MTU7YisrKU9bYl09MDtmb3Iodj0wO3Y8bjt2KyspT1t0W3Irdl1dKys7Zm9yKGs9Zyx3PTE1OzE8PXcmJjA9PT1PW3ddO3ctLSk7aWYodzxrJiYoaz13KSwwPT09dylyZXR1cm4gaVtzKytdPTIwOTcxNTIwLGlbcysrXT0yMDk3MTUyMCxvLmJpdHM9MSwwO2Zvcih5PTE7eTx3JiYwPT09T1t5XTt5KyspO2ZvcihrPHkmJihrPXkpLGI9ej0xO2I8PTE1O2IrKylpZih6PDw9MSwoei09T1tiXSk8MClyZXR1cm4tMTtpZigwPHomJigwPT09ZXx8MSE9PXcpKXJldHVybi0xO2ZvcihCWzFdPTAsYj0xO2I8MTU7YisrKUJbYisxXT1CW2JdK09bYl07Zm9yKHY9MDt2PG47disrKTAhPT10W3Irdl0mJihhW0JbdFtyK3ZdXSsrXT12KTtpZihkPTA9PT1lPyhBPVI9YSwxOSk6MT09PWU/KEE9RixJLT0yNTcsUj1OLFQtPTI1NywyNTYpOihBPVUsUj1QLC0xKSxiPXksYz1zLFM9dj1FPTAsbD0tMSxmPShDPTE8PCh4PWspKS0xLDE9PT1lJiY4NTI8Q3x8Mj09PWUmJjU5MjxDKXJldHVybiAxO2Zvcig7Oyl7Zm9yKHA9Yi1TLF89YVt2XTxkPyhtPTAsYVt2XSk6YVt2XT5kPyhtPVJbVCthW3ZdXSxBW0krYVt2XV0pOihtPTk2LDApLGg9MTw8Yi1TLHk9dT0xPDx4O2lbYysoRT4+UykrKHUtPWgpXT1wPDwyNHxtPDwxNnxffDAsMCE9PXU7KTtmb3IoaD0xPDxiLTE7RSZoOyloPj49MTtpZigwIT09aD8oRSY9aC0xLEUrPWgpOkU9MCx2KyssMD09LS1PW2JdKXtpZihiPT09dylicmVhaztiPXRbcithW3ZdXX1pZihrPGImJihFJmYpIT09bCl7Zm9yKDA9PT1TJiYoUz1rKSxjKz15LHo9MTw8KHg9Yi1TKTt4K1M8dyYmISgoei09T1t4K1NdKTw9MCk7KXgrKyx6PDw9MTtpZihDKz0xPDx4LDE9PT1lJiY4NTI8Q3x8Mj09PWUmJjU5MjxDKXJldHVybiAxO2lbbD1FJmZdPWs8PDI0fHg8PDE2fGMtc3wwfX1yZXR1cm4gMCE9PUUmJihpW2MrRV09Yi1TPDwyNHw2NDw8MTZ8MCksby5iaXRzPWssMH19LHtcIi4uL3V0aWxzL2NvbW1vblwiOjQxfV0sNTE6W2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt0LmV4cG9ydHM9ezI6XCJuZWVkIGRpY3Rpb25hcnlcIiwxOlwic3RyZWFtIGVuZFwiLDA6XCJcIixcIi0xXCI6XCJmaWxlIGVycm9yXCIsXCItMlwiOlwic3RyZWFtIGVycm9yXCIsXCItM1wiOlwiZGF0YSBlcnJvclwiLFwiLTRcIjpcImluc3VmZmljaWVudCBtZW1vcnlcIixcIi01XCI6XCJidWZmZXIgZXJyb3JcIixcIi02XCI6XCJpbmNvbXBhdGlibGUgdmVyc2lvblwifX0se31dLDUyOltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGk9ZShcIi4uL3V0aWxzL2NvbW1vblwiKSxvPTAsaD0xO2Z1bmN0aW9uIG4oZSl7Zm9yKHZhciB0PWUubGVuZ3RoOzA8PS0tdDspZVt0XT0wfXZhciBzPTAsYT0yOSx1PTI1NixsPXUrMSthLGY9MzAsYz0xOSxfPTIqbCsxLGc9MTUsZD0xNixwPTcsbT0yNTYsYj0xNix2PTE3LHk9MTgsdz1bMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXSxrPVswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXSx4PVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XSxTPVsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSx6PW5ldyBBcnJheSgyKihsKzIpKTtuKHopO3ZhciBDPW5ldyBBcnJheSgyKmYpO24oQyk7dmFyIEU9bmV3IEFycmF5KDUxMik7bihFKTt2YXIgQT1uZXcgQXJyYXkoMjU2KTtuKEEpO3ZhciBJPW5ldyBBcnJheShhKTtuKEkpO3ZhciBPLEIsUixUPW5ldyBBcnJheShmKTtmdW5jdGlvbiBEKGUsdCxyLG4saSl7dGhpcy5zdGF0aWNfdHJlZT1lLHRoaXMuZXh0cmFfYml0cz10LHRoaXMuZXh0cmFfYmFzZT1yLHRoaXMuZWxlbXM9bix0aGlzLm1heF9sZW5ndGg9aSx0aGlzLmhhc19zdHJlZT1lJiZlLmxlbmd0aH1mdW5jdGlvbiBGKGUsdCl7dGhpcy5keW5fdHJlZT1lLHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz10fWZ1bmN0aW9uIE4oZSl7cmV0dXJuIGU8MjU2P0VbZV06RVsyNTYrKGU+Pj43KV19ZnVuY3Rpb24gVShlLHQpe2UucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPTI1NSZ0LGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPXQ+Pj44JjI1NX1mdW5jdGlvbiBQKGUsdCxyKXtlLmJpX3ZhbGlkPmQtcj8oZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsVShlLGUuYmlfYnVmKSxlLmJpX2J1Zj10Pj5kLWUuYmlfdmFsaWQsZS5iaV92YWxpZCs9ci1kKTooZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsZS5iaV92YWxpZCs9cil9ZnVuY3Rpb24gTChlLHQscil7UChlLHJbMip0XSxyWzIqdCsxXSl9ZnVuY3Rpb24gaihlLHQpe2Zvcih2YXIgcj0wO3J8PTEmZSxlPj4+PTEscjw8PTEsMDwtLXQ7KTtyZXR1cm4gcj4+PjF9ZnVuY3Rpb24gWihlLHQscil7dmFyIG4saSxzPW5ldyBBcnJheShnKzEpLGE9MDtmb3Iobj0xO248PWc7bisrKXNbbl09YT1hK3Jbbi0xXTw8MTtmb3IoaT0wO2k8PXQ7aSsrKXt2YXIgbz1lWzIqaSsxXTswIT09byYmKGVbMippXT1qKHNbb10rKyxvKSl9fWZ1bmN0aW9uIFcoZSl7dmFyIHQ7Zm9yKHQ9MDt0PGw7dCsrKWUuZHluX2x0cmVlWzIqdF09MDtmb3IodD0wO3Q8Zjt0KyspZS5keW5fZHRyZWVbMip0XT0wO2Zvcih0PTA7dDxjO3QrKyllLmJsX3RyZWVbMip0XT0wO2UuZHluX2x0cmVlWzIqbV09MSxlLm9wdF9sZW49ZS5zdGF0aWNfbGVuPTAsZS5sYXN0X2xpdD1lLm1hdGNoZXM9MH1mdW5jdGlvbiBNKGUpezg8ZS5iaV92YWxpZD9VKGUsZS5iaV9idWYpOjA8ZS5iaV92YWxpZCYmKGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPWUuYmlfYnVmKSxlLmJpX2J1Zj0wLGUuYmlfdmFsaWQ9MH1mdW5jdGlvbiBIKGUsdCxyLG4pe3ZhciBpPTIqdCxzPTIqcjtyZXR1cm4gZVtpXTxlW3NdfHxlW2ldPT09ZVtzXSYmblt0XTw9bltyXX1mdW5jdGlvbiBHKGUsdCxyKXtmb3IodmFyIG49ZS5oZWFwW3JdLGk9cjw8MTtpPD1lLmhlYXBfbGVuJiYoaTxlLmhlYXBfbGVuJiZIKHQsZS5oZWFwW2krMV0sZS5oZWFwW2ldLGUuZGVwdGgpJiZpKyssIUgodCxuLGUuaGVhcFtpXSxlLmRlcHRoKSk7KWUuaGVhcFtyXT1lLmhlYXBbaV0scj1pLGk8PD0xO2UuaGVhcFtyXT1ufWZ1bmN0aW9uIEsoZSx0LHIpe3ZhciBuLGkscyxhLG89MDtpZigwIT09ZS5sYXN0X2xpdClmb3IoO249ZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqb108PDh8ZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqbysxXSxpPWUucGVuZGluZ19idWZbZS5sX2J1ZitvXSxvKyssMD09PW4/TChlLGksdCk6KEwoZSwocz1BW2ldKSt1KzEsdCksMCE9PShhPXdbc10pJiZQKGUsaS09SVtzXSxhKSxMKGUscz1OKC0tbiksciksMCE9PShhPWtbc10pJiZQKGUsbi09VFtzXSxhKSksbzxlLmxhc3RfbGl0Oyk7TChlLG0sdCl9ZnVuY3Rpb24gWShlLHQpe3ZhciByLG4saSxzPXQuZHluX3RyZWUsYT10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxvPXQuc3RhdF9kZXNjLmhhc19zdHJlZSxoPXQuc3RhdF9kZXNjLmVsZW1zLHU9LTE7Zm9yKGUuaGVhcF9sZW49MCxlLmhlYXBfbWF4PV8scj0wO3I8aDtyKyspMCE9PXNbMipyXT8oZS5oZWFwWysrZS5oZWFwX2xlbl09dT1yLGUuZGVwdGhbcl09MCk6c1syKnIrMV09MDtmb3IoO2UuaGVhcF9sZW48Mjspc1syKihpPWUuaGVhcFsrK2UuaGVhcF9sZW5dPXU8Mj8rK3U6MCldPTEsZS5kZXB0aFtpXT0wLGUub3B0X2xlbi0tLG8mJihlLnN0YXRpY19sZW4tPWFbMippKzFdKTtmb3IodC5tYXhfY29kZT11LHI9ZS5oZWFwX2xlbj4+MTsxPD1yO3ItLSlHKGUscyxyKTtmb3IoaT1oO3I9ZS5oZWFwWzFdLGUuaGVhcFsxXT1lLmhlYXBbZS5oZWFwX2xlbi0tXSxHKGUscywxKSxuPWUuaGVhcFsxXSxlLmhlYXBbLS1lLmhlYXBfbWF4XT1yLGUuaGVhcFstLWUuaGVhcF9tYXhdPW4sc1syKmldPXNbMipyXStzWzIqbl0sZS5kZXB0aFtpXT0oZS5kZXB0aFtyXT49ZS5kZXB0aFtuXT9lLmRlcHRoW3JdOmUuZGVwdGhbbl0pKzEsc1syKnIrMV09c1syKm4rMV09aSxlLmhlYXBbMV09aSsrLEcoZSxzLDEpLDI8PWUuaGVhcF9sZW47KTtlLmhlYXBbLS1lLmhlYXBfbWF4XT1lLmhlYXBbMV0sZnVuY3Rpb24oZSx0KXt2YXIgcixuLGkscyxhLG8saD10LmR5bl90cmVlLHU9dC5tYXhfY29kZSxsPXQuc3RhdF9kZXNjLnN0YXRpY190cmVlLGY9dC5zdGF0X2Rlc2MuaGFzX3N0cmVlLGM9dC5zdGF0X2Rlc2MuZXh0cmFfYml0cyxkPXQuc3RhdF9kZXNjLmV4dHJhX2Jhc2UscD10LnN0YXRfZGVzYy5tYXhfbGVuZ3RoLG09MDtmb3Iocz0wO3M8PWc7cysrKWUuYmxfY291bnRbc109MDtmb3IoaFsyKmUuaGVhcFtlLmhlYXBfbWF4XSsxXT0wLHI9ZS5oZWFwX21heCsxO3I8XztyKyspcDwocz1oWzIqaFsyKihuPWUuaGVhcFtyXSkrMV0rMV0rMSkmJihzPXAsbSsrKSxoWzIqbisxXT1zLHU8bnx8KGUuYmxfY291bnRbc10rKyxhPTAsZDw9biYmKGE9Y1tuLWRdKSxvPWhbMipuXSxlLm9wdF9sZW4rPW8qKHMrYSksZiYmKGUuc3RhdGljX2xlbis9byoobFsyKm4rMV0rYSkpKTtpZigwIT09bSl7ZG97Zm9yKHM9cC0xOzA9PT1lLmJsX2NvdW50W3NdOylzLS07ZS5ibF9jb3VudFtzXS0tLGUuYmxfY291bnRbcysxXSs9MixlLmJsX2NvdW50W3BdLS0sbS09Mn13aGlsZSgwPG0pO2ZvcihzPXA7MCE9PXM7cy0tKWZvcihuPWUuYmxfY291bnRbc107MCE9PW47KXU8KGk9ZS5oZWFwWy0tcl0pfHwoaFsyKmkrMV0hPT1zJiYoZS5vcHRfbGVuKz0ocy1oWzIqaSsxXSkqaFsyKmldLGhbMippKzFdPXMpLG4tLSl9fShlLHQpLFoocyx1LGUuYmxfY291bnQpfWZ1bmN0aW9uIFgoZSx0LHIpe3ZhciBuLGkscz0tMSxhPXRbMV0sbz0wLGg9Nyx1PTQ7Zm9yKDA9PT1hJiYoaD0xMzgsdT0zKSx0WzIqKHIrMSkrMV09NjU1MzUsbj0wO248PXI7bisrKWk9YSxhPXRbMioobisxKSsxXSwrK288aCYmaT09PWF8fChvPHU/ZS5ibF90cmVlWzIqaV0rPW86MCE9PWk/KGkhPT1zJiZlLmJsX3RyZWVbMippXSsrLGUuYmxfdHJlZVsyKmJdKyspOm88PTEwP2UuYmxfdHJlZVsyKnZdKys6ZS5ibF90cmVlWzIqeV0rKyxzPWksdT0obz0wKT09PWE/KGg9MTM4LDMpOmk9PT1hPyhoPTYsMyk6KGg9Nyw0KSl9ZnVuY3Rpb24gVihlLHQscil7dmFyIG4saSxzPS0xLGE9dFsxXSxvPTAsaD03LHU9NDtmb3IoMD09PWEmJihoPTEzOCx1PTMpLG49MDtuPD1yO24rKylpZihpPWEsYT10WzIqKG4rMSkrMV0sISgrK288aCYmaT09PWEpKXtpZihvPHUpZm9yKDtMKGUsaSxlLmJsX3RyZWUpLDAhPS0tbzspO2Vsc2UgMCE9PWk/KGkhPT1zJiYoTChlLGksZS5ibF90cmVlKSxvLS0pLEwoZSxiLGUuYmxfdHJlZSksUChlLG8tMywyKSk6bzw9MTA/KEwoZSx2LGUuYmxfdHJlZSksUChlLG8tMywzKSk6KEwoZSx5LGUuYmxfdHJlZSksUChlLG8tMTEsNykpO3M9aSx1PShvPTApPT09YT8oaD0xMzgsMyk6aT09PWE/KGg9NiwzKTooaD03LDQpfX1uKFQpO3ZhciBxPSExO2Z1bmN0aW9uIEooZSx0LHIsbil7UChlLChzPDwxKSsobj8xOjApLDMpLGZ1bmN0aW9uKGUsdCxyLG4pe00oZSksbiYmKFUoZSxyKSxVKGUsfnIpKSxpLmFycmF5U2V0KGUucGVuZGluZ19idWYsZS53aW5kb3csdCxyLGUucGVuZGluZyksZS5wZW5kaW5nKz1yfShlLHQsciwhMCl9ci5fdHJfaW5pdD1mdW5jdGlvbihlKXtxfHwoZnVuY3Rpb24oKXt2YXIgZSx0LHIsbixpLHM9bmV3IEFycmF5KGcrMSk7Zm9yKG49cj0wO248YS0xO24rKylmb3IoSVtuXT1yLGU9MDtlPDE8PHdbbl07ZSsrKUFbcisrXT1uO2ZvcihBW3ItMV09bixuPWk9MDtuPDE2O24rKylmb3IoVFtuXT1pLGU9MDtlPDE8PGtbbl07ZSsrKUVbaSsrXT1uO2ZvcihpPj49NztuPGY7bisrKWZvcihUW25dPWk8PDcsZT0wO2U8MTw8a1tuXS03O2UrKylFWzI1NitpKytdPW47Zm9yKHQ9MDt0PD1nO3QrKylzW3RdPTA7Zm9yKGU9MDtlPD0xNDM7KXpbMiplKzFdPTgsZSsrLHNbOF0rKztmb3IoO2U8PTI1NTspelsyKmUrMV09OSxlKyssc1s5XSsrO2Zvcig7ZTw9Mjc5Oyl6WzIqZSsxXT03LGUrKyxzWzddKys7Zm9yKDtlPD0yODc7KXpbMiplKzFdPTgsZSsrLHNbOF0rKztmb3IoWih6LGwrMSxzKSxlPTA7ZTxmO2UrKylDWzIqZSsxXT01LENbMiplXT1qKGUsNSk7Tz1uZXcgRCh6LHcsdSsxLGwsZyksQj1uZXcgRChDLGssMCxmLGcpLFI9bmV3IEQobmV3IEFycmF5KDApLHgsMCxjLHApfSgpLHE9ITApLGUubF9kZXNjPW5ldyBGKGUuZHluX2x0cmVlLE8pLGUuZF9kZXNjPW5ldyBGKGUuZHluX2R0cmVlLEIpLGUuYmxfZGVzYz1uZXcgRihlLmJsX3RyZWUsUiksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTAsVyhlKX0sci5fdHJfc3RvcmVkX2Jsb2NrPUosci5fdHJfZmx1c2hfYmxvY2s9ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGkscyxhPTA7MDxlLmxldmVsPygyPT09ZS5zdHJtLmRhdGFfdHlwZSYmKGUuc3RybS5kYXRhX3R5cGU9ZnVuY3Rpb24oZSl7dmFyIHQscj00MDkzNjI0NDQ3O2Zvcih0PTA7dDw9MzE7dCsrLHI+Pj49MSlpZigxJnImJjAhPT1lLmR5bl9sdHJlZVsyKnRdKXJldHVybiBvO2lmKDAhPT1lLmR5bl9sdHJlZVsxOF18fDAhPT1lLmR5bl9sdHJlZVsyMF18fDAhPT1lLmR5bl9sdHJlZVsyNl0pcmV0dXJuIGg7Zm9yKHQ9MzI7dDx1O3QrKylpZigwIT09ZS5keW5fbHRyZWVbMip0XSlyZXR1cm4gaDtyZXR1cm4gb30oZSkpLFkoZSxlLmxfZGVzYyksWShlLGUuZF9kZXNjKSxhPWZ1bmN0aW9uKGUpe3ZhciB0O2ZvcihYKGUsZS5keW5fbHRyZWUsZS5sX2Rlc2MubWF4X2NvZGUpLFgoZSxlLmR5bl9kdHJlZSxlLmRfZGVzYy5tYXhfY29kZSksWShlLGUuYmxfZGVzYyksdD1jLTE7Mzw9dCYmMD09PWUuYmxfdHJlZVsyKlNbdF0rMV07dC0tKTtyZXR1cm4gZS5vcHRfbGVuKz0zKih0KzEpKzUrNSs0LHR9KGUpLGk9ZS5vcHRfbGVuKzMrNz4+PjMsKHM9ZS5zdGF0aWNfbGVuKzMrNz4+PjMpPD1pJiYoaT1zKSk6aT1zPXIrNSxyKzQ8PWkmJi0xIT09dD9KKGUsdCxyLG4pOjQ9PT1lLnN0cmF0ZWd5fHxzPT09aT8oUChlLDIrKG4/MTowKSwzKSxLKGUseixDKSk6KFAoZSw0KyhuPzE6MCksMyksZnVuY3Rpb24oZSx0LHIsbil7dmFyIGk7Zm9yKFAoZSx0LTI1Nyw1KSxQKGUsci0xLDUpLFAoZSxuLTQsNCksaT0wO2k8bjtpKyspUChlLGUuYmxfdHJlZVsyKlNbaV0rMV0sMyk7VihlLGUuZHluX2x0cmVlLHQtMSksVihlLGUuZHluX2R0cmVlLHItMSl9KGUsZS5sX2Rlc2MubWF4X2NvZGUrMSxlLmRfZGVzYy5tYXhfY29kZSsxLGErMSksSyhlLGUuZHluX2x0cmVlLGUuZHluX2R0cmVlKSksVyhlKSxuJiZNKGUpfSxyLl90cl90YWxseT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGUucGVuZGluZ19idWZbZS5kX2J1ZisyKmUubGFzdF9saXRdPXQ+Pj44JjI1NSxlLnBlbmRpbmdfYnVmW2UuZF9idWYrMiplLmxhc3RfbGl0KzFdPTI1NSZ0LGUucGVuZGluZ19idWZbZS5sX2J1ZitlLmxhc3RfbGl0XT0yNTUmcixlLmxhc3RfbGl0KyssMD09PXQ/ZS5keW5fbHRyZWVbMipyXSsrOihlLm1hdGNoZXMrKyx0LS0sZS5keW5fbHRyZWVbMiooQVtyXSt1KzEpXSsrLGUuZHluX2R0cmVlWzIqTih0KV0rKyksZS5sYXN0X2xpdD09PWUubGl0X2J1ZnNpemUtMX0sci5fdHJfYWxpZ249ZnVuY3Rpb24oZSl7UChlLDIsMyksTChlLG0seiksZnVuY3Rpb24oZSl7MTY9PT1lLmJpX3ZhbGlkPyhVKGUsZS5iaV9idWYpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wKTo4PD1lLmJpX3ZhbGlkJiYoZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109MjU1JmUuYmlfYnVmLGUuYmlfYnVmPj49OCxlLmJpX3ZhbGlkLT04KX0oZSl9fSx7XCIuLi91dGlscy9jb21tb25cIjo0MX1dLDUzOltmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dGhpcy5pbnB1dD1udWxsLHRoaXMubmV4dF9pbj0wLHRoaXMuYXZhaWxfaW49MCx0aGlzLnRvdGFsX2luPTAsdGhpcy5vdXRwdXQ9bnVsbCx0aGlzLm5leHRfb3V0PTAsdGhpcy5hdmFpbF9vdXQ9MCx0aGlzLnRvdGFsX291dD0wLHRoaXMubXNnPVwiXCIsdGhpcy5zdGF0ZT1udWxsLHRoaXMuZGF0YV90eXBlPTIsdGhpcy5hZGxlcj0wfX0se31dLDU0OltmdW5jdGlvbihlLHQscil7KGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihyLG4pe1widXNlIHN0cmljdFwiO2lmKCFyLnNldEltbWVkaWF0ZSl7dmFyIGkscyx0LGEsbz0xLGg9e30sdT0hMSxsPXIuZG9jdW1lbnQsZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YmJk9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtlPWUmJmUuc2V0VGltZW91dD9lOnIsaT1cIltvYmplY3QgcHJvY2Vzc11cIj09PXt9LnRvU3RyaW5nLmNhbGwoci5wcm9jZXNzKT9mdW5jdGlvbihlKXtwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCl7YyhlKX0pfTpmdW5jdGlvbigpe2lmKHIucG9zdE1lc3NhZ2UmJiFyLmltcG9ydFNjcmlwdHMpe3ZhciBlPSEwLHQ9ci5vbm1lc3NhZ2U7cmV0dXJuIHIub25tZXNzYWdlPWZ1bmN0aW9uKCl7ZT0hMX0sci5wb3N0TWVzc2FnZShcIlwiLFwiKlwiKSxyLm9ubWVzc2FnZT10LGV9fSgpPyhhPVwic2V0SW1tZWRpYXRlJFwiK01hdGgucmFuZG9tKCkrXCIkXCIsci5hZGRFdmVudExpc3RlbmVyP3IuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIixkLCExKTpyLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsZCksZnVuY3Rpb24oZSl7ci5wb3N0TWVzc2FnZShhK2UsXCIqXCIpfSk6ci5NZXNzYWdlQ2hhbm5lbD8oKHQ9bmV3IE1lc3NhZ2VDaGFubmVsKS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24oZSl7YyhlLmRhdGEpfSxmdW5jdGlvbihlKXt0LnBvcnQyLnBvc3RNZXNzYWdlKGUpfSk6bCYmXCJvbnJlYWR5c3RhdGVjaGFuZ2VcImluIGwuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKT8ocz1sLmRvY3VtZW50RWxlbWVudCxmdW5jdGlvbihlKXt2YXIgdD1sLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7dC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtjKGUpLHQub25yZWFkeXN0YXRlY2hhbmdlPW51bGwscy5yZW1vdmVDaGlsZCh0KSx0PW51bGx9LHMuYXBwZW5kQ2hpbGQodCl9KTpmdW5jdGlvbihlKXtzZXRUaW1lb3V0KGMsMCxlKX0sZS5zZXRJbW1lZGlhdGU9ZnVuY3Rpb24oZSl7XCJmdW5jdGlvblwiIT10eXBlb2YgZSYmKGU9bmV3IEZ1bmN0aW9uKFwiXCIrZSkpO2Zvcih2YXIgdD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxyPTA7cjx0Lmxlbmd0aDtyKyspdFtyXT1hcmd1bWVudHNbcisxXTt2YXIgbj17Y2FsbGJhY2s6ZSxhcmdzOnR9O3JldHVybiBoW29dPW4saShvKSxvKyt9LGUuY2xlYXJJbW1lZGlhdGU9Zn1mdW5jdGlvbiBmKGUpe2RlbGV0ZSBoW2VdfWZ1bmN0aW9uIGMoZSl7aWYodSlzZXRUaW1lb3V0KGMsMCxlKTtlbHNle3ZhciB0PWhbZV07aWYodCl7dT0hMDt0cnl7IWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2sscj1lLmFyZ3M7c3dpdGNoKHIubGVuZ3RoKXtjYXNlIDA6dCgpO2JyZWFrO2Nhc2UgMTp0KHJbMF0pO2JyZWFrO2Nhc2UgMjp0KHJbMF0sclsxXSk7YnJlYWs7Y2FzZSAzOnQoclswXSxyWzFdLHJbMl0pO2JyZWFrO2RlZmF1bHQ6dC5hcHBseShuLHIpfX0odCl9ZmluYWxseXtmKGUpLHU9ITF9fX19ZnVuY3Rpb24gZChlKXtlLnNvdXJjZT09PXImJlwic3RyaW5nXCI9PXR5cGVvZiBlLmRhdGEmJjA9PT1lLmRhdGEuaW5kZXhPZihhKSYmYygrZS5kYXRhLnNsaWNlKGEubGVuZ3RoKSl9fShcInVuZGVmaW5lZFwiPT10eXBlb2Ygc2VsZj92b2lkIDA9PT1lP3RoaXM6ZTpzZWxmKX0pLmNhbGwodGhpcyxcInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0se31dfSx7fSxbMTBdKSgxMCl9KTsiLCAibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFxdWE6IC8jMDBmZmZmKGZmKT8oPyFcXHcpfCMwZmYoZik/KD8hXFx3KS9naSxcbiAgYXp1cmU6IC8jZjBmZmZmKGZmKT8oPyFcXHcpL2dpLFxuICBiZWlnZTogLyNmNWY1ZGMoZmYpPyg/IVxcdykvZ2ksXG4gIGJpc3F1ZTogLyNmZmU0YzQoZmYpPyg/IVxcdykvZ2ksXG4gIGJsYWNrOiAvIzAwMDAwMChmZik/KD8hXFx3KXwjMDAwKGYpPyg/IVxcdykvZ2ksXG4gIGJsdWU6IC8jMDAwMGZmKGZmKT8oPyFcXHcpfCMwMGYoZik/KD8hXFx3KS9naSxcbiAgYnJvd246IC8jYTUyYTJhKGZmKT8oPyFcXHcpL2dpLFxuICBjb3JhbDogLyNmZjdmNTAoZmYpPyg/IVxcdykvZ2ksXG4gIGNvcm5zaWxrOiAvI2ZmZjhkYyhmZik/KD8hXFx3KS9naSxcbiAgY3JpbXNvbjogLyNkYzE0M2MoZmYpPyg/IVxcdykvZ2ksXG4gIGN5YW46IC8jMDBmZmZmKGZmKT8oPyFcXHcpfCMwZmYoZik/KD8hXFx3KS9naSxcbiAgZGFya2JsdWU6IC8jMDAwMDhiKGZmKT8oPyFcXHcpL2dpLFxuICBkYXJrY3lhbjogLyMwMDhiOGIoZmYpPyg/IVxcdykvZ2ksXG4gIGRhcmtncmV5OiAvI2E5YTlhOShmZik/KD8hXFx3KS9naSxcbiAgZGFya3JlZDogLyM4YjAwMDAoZmYpPyg/IVxcdykvZ2ksXG4gIGRlZXBwaW5rOiAvI2ZmMTQ5MyhmZik/KD8hXFx3KS9naSxcbiAgZGltZ3JleTogLyM2OTY5NjkoZmYpPyg/IVxcdykvZ2ksXG4gIGdvbGQ6IC8jZmZkNzAwKGZmKT8oPyFcXHcpL2dpLFxuICBncmVlbjogLyMwMDgwMDAoZmYpPyg/IVxcdykvZ2ksXG4gIGdyZXk6IC8jODA4MDgwKGZmKT8oPyFcXHcpL2dpLFxuICBob25leWRldzogLyNmMGZmZjAoZmYpPyg/IVxcdykvZ2ksXG4gIGhvdHBpbms6IC8jZmY2OWI0KGZmKT8oPyFcXHcpL2dpLFxuICBpbmRpZ286IC8jNGIwMDgyKGZmKT8oPyFcXHcpL2dpLFxuICBpdm9yeTogLyNmZmZmZjAoZmYpPyg/IVxcdykvZ2ksXG4gIGtoYWtpOiAvI2YwZTY4YyhmZik/KD8hXFx3KS9naSxcbiAgbGF2ZW5kZXI6IC8jZTZlNmZhKGZmKT8oPyFcXHcpL2dpLFxuICBsaW1lOiAvIzAwZmYwMChmZik/KD8hXFx3KXwjMGYwKGYpPyg/IVxcdykvZ2ksXG4gIGxpbmVuOiAvI2ZhZjBlNihmZik/KD8hXFx3KS9naSxcbiAgbWFyb29uOiAvIzgwMDAwMChmZik/KD8hXFx3KS9naSxcbiAgbW9jY2FzaW46IC8jZmZlNGI1KGZmKT8oPyFcXHcpL2dpLFxuICBuYXZ5OiAvIzAwMDA4MChmZik/KD8hXFx3KS9naSxcbiAgb2xkbGFjZTogLyNmZGY1ZTYoZmYpPyg/IVxcdykvZ2ksXG4gIG9saXZlOiAvIzgwODAwMChmZik/KD8hXFx3KS9naSxcbiAgb3JhbmdlOiAvI2ZmYTUwMChmZik/KD8hXFx3KS9naSxcbiAgb3JjaGlkOiAvI2RhNzBkNihmZik/KD8hXFx3KS9naSxcbiAgcGVydTogLyNjZDg1M2YoZmYpPyg/IVxcdykvZ2ksXG4gIHBpbms6IC8jZmZjMGNiKGZmKT8oPyFcXHcpL2dpLFxuICBwbHVtOiAvI2RkYTBkZChmZik/KD8hXFx3KS9naSxcbiAgcHVycGxlOiAvIzgwMDA4MChmZik/KD8hXFx3KS9naSxcbiAgcmVkOiAvI2ZmMDAwMChmZik/KD8hXFx3KXwjZjAwKGYpPyg/IVxcdykvZ2ksXG4gIHNhbG1vbjogLyNmYTgwNzIoZmYpPyg/IVxcdykvZ2ksXG4gIHNlYWdyZWVuOiAvIzJlOGI1NyhmZik/KD8hXFx3KS9naSxcbiAgc2Vhc2hlbGw6IC8jZmZmNWVlKGZmKT8oPyFcXHcpL2dpLFxuICBzaWVubmE6IC8jYTA1MjJkKGZmKT8oPyFcXHcpL2dpLFxuICBzaWx2ZXI6IC8jYzBjMGMwKGZmKT8oPyFcXHcpL2dpLFxuICBza3libHVlOiAvIzg3Y2VlYihmZik/KD8hXFx3KS9naSxcbiAgc25vdzogLyNmZmZhZmEoZmYpPyg/IVxcdykvZ2ksXG4gIHRhbjogLyNkMmI0OGMoZmYpPyg/IVxcdykvZ2ksXG4gIHRlYWw6IC8jMDA4MDgwKGZmKT8oPyFcXHcpL2dpLFxuICB0aGlzdGxlOiAvI2Q4YmZkOChmZik/KD8hXFx3KS9naSxcbiAgdG9tYXRvOiAvI2ZmNjM0NyhmZik/KD8hXFx3KS9naSxcbiAgdmlvbGV0OiAvI2VlODJlZShmZik/KD8hXFx3KS9naSxcbiAgd2hlYXQ6IC8jZjVkZWIzKGZmKT8oPyFcXHcpL2dpLFxuICB3aGl0ZTogLyNmZmZmZmYoZmYpPyg/IVxcdyl8I2ZmZihmKT8oPyFcXHcpL2dpLFxufTtcbiIsICJ2YXIgc2hvcnRlck5hbWVzID0gcmVxdWlyZSgnLi9zaG9ydGVyLWNzcy1jb2xvci1uYW1lcycpO1xudmFyIFJFR0VYID0ge1xuICB3aGl0ZXNwYWNlOiAvXFxzKy9nLFxuICB1cmxIZXhQYWlyczogLyVbXFxkQS1GXXsyfS9nLFxuICBxdW90ZXM6IC9cIi9nLFxufVxuXG5mdW5jdGlvbiBjb2xsYXBzZVdoaXRlc3BhY2Uoc3RyKSB7XG4gIHJldHVybiBzdHIudHJpbSgpLnJlcGxhY2UoUkVHRVgud2hpdGVzcGFjZSwgJyAnKTtcbn1cblxuZnVuY3Rpb24gZGF0YVVSSVBheWxvYWQoc3RyaW5nKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5nKVxuICAgIC5yZXBsYWNlKFJFR0VYLnVybEhleFBhaXJzLCBzcGVjaWFsSGV4RW5jb2RlKTtcbn1cblxuLy8gYCNgIGdldHMgY29udmVydGVkIHRvIGAlMjNgLCBzbyBxdWl0ZSBhIGZldyBDU1MgbmFtZWQgY29sb3JzIGFyZSBzaG9ydGVyIHRoYW5cbi8vIHRoZWlyIGVxdWl2YWxlbnQgVVJMLWVuY29kZWQgaGV4IGNvZGVzLlxuZnVuY3Rpb24gY29sb3JDb2RlVG9TaG9ydGVyTmFtZXMoc3RyaW5nKSB7XG4gIE9iamVjdC5rZXlzKHNob3J0ZXJOYW1lcykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoc2hvcnRlck5hbWVzW2tleV0udGVzdChzdHJpbmcpKSB7XG4gICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShzaG9ydGVyTmFtZXNba2V5XSwga2V5KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIHNwZWNpYWxIZXhFbmNvZGUobWF0Y2gpIHtcbiAgc3dpdGNoIChtYXRjaCkgeyAvLyBCcm93c2VycyB0b2xlcmF0ZSB0aGVzZSBjaGFyYWN0ZXJzLCBhbmQgdGhleSdyZSBmcmVxdWVudFxuICAgIGNhc2UgJyUyMCc6IHJldHVybiAnICc7XG4gICAgY2FzZSAnJTNEJzogcmV0dXJuICc9JztcbiAgICBjYXNlICclM0EnOiByZXR1cm4gJzonO1xuICAgIGNhc2UgJyUyRic6IHJldHVybiAnLyc7XG4gICAgZGVmYXVsdDogcmV0dXJuIG1hdGNoLnRvTG93ZXJDYXNlKCk7IC8vIGNvbXByZXNzZXMgYmV0dGVyXG4gIH1cbn1cblxuZnVuY3Rpb24gc3ZnVG9UaW55RGF0YVVyaShzdmdTdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdmdTdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcsIGJ1dCByZWNlaXZlZCAnICsgdHlwZW9mIHN2Z1N0cmluZyk7XG4gIH1cbiAgLy8gU3RyaXAgdGhlIEJ5dGUtT3JkZXIgTWFyayBpZiB0aGUgU1ZHIGhhcyBvbmVcbiAgaWYgKHN2Z1N0cmluZy5jaGFyQ29kZUF0KDApID09PSAweGZlZmYpIHsgc3ZnU3RyaW5nID0gc3ZnU3RyaW5nLnNsaWNlKDEpIH1cblxuICB2YXIgYm9keSA9IGNvbG9yQ29kZVRvU2hvcnRlck5hbWVzKGNvbGxhcHNlV2hpdGVzcGFjZShzdmdTdHJpbmcpKVxuICAgIC5yZXBsYWNlKFJFR0VYLnF1b3RlcywgXCInXCIpO1xuICByZXR1cm4gJ2RhdGE6aW1hZ2Uvc3ZnK3htbCwnICsgZGF0YVVSSVBheWxvYWQoYm9keSk7XG59XG5cbnN2Z1RvVGlueURhdGFVcmkudG9TcmNzZXQgPSBmdW5jdGlvbiB0b1NyY3NldChzdmdTdHJpbmcpIHtcbiAgcmV0dXJuIHN2Z1RvVGlueURhdGFVcmkoc3ZnU3RyaW5nKS5yZXBsYWNlKC8gL2csICclMjAnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdmdUb1RpbnlEYXRhVXJpO1xuIiwgImltcG9ydCB7IFBsdWdpbiwgc2V0SWNvbiB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgYnVpbGRJY29uUGx1Z2luIGZyb20gXCIuL2ljb24taW4tZWRpdG9yXCI7XG5pbXBvcnQgdHlwZSB7IFNob3J0Y29kZVBvc0ZpZWxkIH0gZnJvbSBcIi4vaWNvbi1pbi1lZGl0b3Ivc3RhdGVcIjtcbmltcG9ydCBnZXRTaG9ydGNvZGVQb3NGaWVsZCBmcm9tIFwiLi9pY29uLWluLWVkaXRvci9zdGF0ZVwiO1xuaW1wb3J0IEZpbGVJY29uQ2FjaGUgZnJvbSBcIi4vaWNvbi1wYWNrcy9pY29uLWNhY2hlXCI7XG5pbXBvcnQgUGFja01hbmFnZXIgZnJvbSBcIi4vaWNvbi1wYWNrcy9wYWNrLW1hbmFnZXJcIjtcbmltcG9ydCB0cnlVcGRhdGVJY29ucyBmcm9tIFwiLi9tb2R1bGVzL2pzb24tdG8tc3ZnXCI7XG5pbXBvcnQgeyBFbW9qaVN1Z2dlc3RlciB9IGZyb20gXCIuL21vZHVsZXMvc3VnZ2VzdGVyXCI7XG5pbXBvcnQgeyBnZXRNRFBvc3RQcm9jZXNzb3IsIGdldE5vZGVQb3N0UHJvY2Vzc29yIH0gZnJvbSBcIi4vcG9zdC1wc1wiO1xuaW1wb3J0IHsgc2V0dXBQb3N0UHJvY2Vzc29ycyB9IGZyb20gXCIuL3Bvc3QtcHNcIjtcbmltcG9ydCB7IERFRkFVTFRfU0VUVElOR1MsIEljb25TQ1NldHRpbmdzLCBJY29uU0NTZXR0aW5nVGFiIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcbmltcG9ydCB7IGdldEFwaSB9IGZyb20gXCIuL3R5cGluZ3MvYXBpXCI7XG5pbXBvcnQgQVBJLCB7IEFQSV9OQU1FIH0gZnJvbSBcIi4vdHlwaW5ncy9hcGlcIjtcblxuY29uc3QgQVBJX05BTUU6IEFQSV9OQU1FIGV4dGVuZHMga2V5b2YgdHlwZW9mIHdpbmRvdyA/IEFQSV9OQU1FIDogbmV2ZXIgPVxuICBcIkljb25TQ0FQSXYwXCIgYXMgY29uc3Q7IC8vIHRoaXMgbGluZSB3aWxsIHRocm93IGVycm9yIGlmIG5hbWUgb3V0IG9mIHN5bmNcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSWNvblNDIGV4dGVuZHMgUGx1Z2luIHtcbiAgc2V0dGluZ3M6IEljb25TQ1NldHRpbmdzID0gREVGQVVMVF9TRVRUSU5HUztcblxuICBwYWNrTWFuYWdlciA9IG5ldyBQYWNrTWFuYWdlcih0aGlzKTtcblxuICBfbm9kZVByb2Nlc3NvciA9IGdldE5vZGVQb3N0UHJvY2Vzc29yKHRoaXMpO1xuICBfbWRQcm9jZXNzb3IgPSBnZXRNRFBvc3RQcm9jZXNzb3IodGhpcyk7XG5cbiAgc2hvcnRjb2RlUG9zRmllbGQ6IFNob3J0Y29kZVBvc0ZpZWxkID0gZ2V0U2hvcnRjb2RlUG9zRmllbGQodGhpcyk7XG5cbiAgcG9zdFByb2Nlc3NvcihpbnB1dDogc3RyaW5nLCByZXBsYWNlcjogKHNob3J0Y29kZTogc3RyaW5nKSA9PiBzdHJpbmcpOiBzdHJpbmc7XG4gIHBvc3RQcm9jZXNzb3IoaW5wdXQ6IEhUTUxFbGVtZW50KTogdm9pZDtcbiAgcG9zdFByb2Nlc3NvcihcbiAgICBpbnB1dDogSFRNTEVsZW1lbnQgfCBzdHJpbmcsXG4gICAgcmVwbGFjZXI/OiAoc2hvcnRjb2RlOiBzdHJpbmcpID0+IHN0cmluZyxcbiAgKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiAmJiByZXBsYWNlcikge1xuICAgICAgcmV0dXJuIHRoaXMuX21kUHJvY2Vzc29yKGlucHV0LCByZXBsYWNlcik7XG4gICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5fbm9kZVByb2Nlc3NvcihpbnB1dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGFyZ3MgZ2l2ZW4gdG8gcG9zdFByb2Nlc3NvclwiKTtcbiAgICB9XG4gIH1cblxuICBhcGkgPSBnZXRBcGkodGhpcy5wYWNrTWFuYWdlciwgdGhpcyk7XG4gIGZpbGVJY29uQ2FjaGUgPSBuZXcgRmlsZUljb25DYWNoZSh0aGlzKTtcblxuICBhc3luYyBvbmxvYWQoKSB7XG4gICAgY29uc29sZS5sb2coXCJsb2FkaW5nIEljb24gU2hvcnRjb2Rlc1wiKTtcblxuICAgIGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG4gICAgYXdhaXQgdHJ5VXBkYXRlSWNvbnModGhpcyk7XG4gICAgYXdhaXQgdGhpcy5wYWNrTWFuYWdlci5sb2FkSWNvbnMoKTtcblxuICAgICh3aW5kb3dbQVBJX05BTUVdID0gdGhpcy5hcGkpICYmXG4gICAgICB0aGlzLnJlZ2lzdGVyKCgpID0+ICh3aW5kb3dbQVBJX05BTUVdID0gdW5kZWZpbmVkKSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyRWRpdG9yU3VnZ2VzdChuZXcgRW1vamlTdWdnZXN0ZXIodGhpcykpO1xuICAgIHNldHVwUG9zdFByb2Nlc3NvcnModGhpcyk7XG4gICAgYnVpbGRJY29uUGx1Z2luKHRoaXMpO1xuXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBJY29uU0NTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG4gIH1cblxuICAvLyBvbnVubG9hZCgpIHtcbiAgLy8gICBjb25zb2xlLmxvZyhcInVubG9hZGluZyBJY29uIFNob3J0Y29kZXNcIik7XG4gIC8vIH1cblxuICBhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG4gICAgbGV0IGxvYWRlZCA9IChhd2FpdCB0aGlzLmxvYWREYXRhKCkpIGFzIEljb25TQ1NldHRpbmdzIHwgdW5kZWZpbmVkO1xuICAgIGlmIChsb2FkZWQpIHtcbiAgICAgIGlmICgobG9hZGVkIGFzIGFueSkuaWNvbnBhY2spIHtcbiAgICAgICAgZGVsZXRlIChsb2FkZWQgYXMgYW55KVtcImljb25wYWNrXCJdO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXR0aW5ncyA9IHtcbiAgICAgICAgLi4udGhpcy5zZXR0aW5ncyxcbiAgICAgICAgLi4ubG9hZGVkLFxuICAgICAgICBkaXNhYmxlZFBhY2tzOiBsb2FkZWQuZGlzYWJsZWRQYWNrc1xuICAgICAgICAgID8gbmV3IFNldChsb2FkZWQuZGlzYWJsZWRQYWNrcylcbiAgICAgICAgICA6IHRoaXMuc2V0dGluZ3MuZGlzYWJsZWRQYWNrcyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEoe1xuICAgICAgLi4udGhpcy5zZXR0aW5ncyxcbiAgICAgIGRpc2FibGVkUGFja3M6IFsuLi50aGlzLnNldHRpbmdzLmRpc2FibGVkUGFja3NdLFxuICAgIH0pO1xuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgRGVjb3JhdGlvbixcbiAgRGVjb3JhdGlvblNldCxcbiAgRWRpdG9yVmlldyxcbiAgVmlld1BsdWdpbixcbiAgVmlld1VwZGF0ZSxcbn0gZnJvbSBcIkBjb2RlbWlycm9yL3ZpZXdcIjtcbmltcG9ydCB7IGVkaXRvckxpdmVQcmV2aWV3RmllbGQgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IHR5cGUgSWNvblNDIGZyb20gXCIuLi9pc2MtbWFpblwiO1xuaW1wb3J0IGljb25zIGZyb20gXCIuL2RlY29cIjtcbmltcG9ydCBnZXRNZW51IGZyb20gXCIuL2dldC1tZW51XCI7XG5cbmludGVyZmFjZSBJY29uUGx1Z2luIHtcbiAgY29uc3RydWN0b3IodmlldzogRWRpdG9yVmlldyk6IEljb25QbHVnaW47XG4gIHVwZGF0ZSh1cGRhdGU6IFZpZXdVcGRhdGUpOiB2b2lkO1xufVxuXG5jb25zdCBnZXRJY29uTGl2ZVByZXZpZXdQbHVnaW4gPSAocGx1Z2luOiBJY29uU0MpOiBWaWV3UGx1Z2luPEljb25QbHVnaW4+ID0+IHtcbiAgY2xhc3MgSWNvblBsdWdpbiB7XG4gICAgZGVjb3JhdGlvbnM6IERlY29yYXRpb25TZXQ7XG4gICAgcGx1Z2luOiBJY29uU0M7XG5cbiAgICBjb25zdHJ1Y3Rvcih2aWV3OiBFZGl0b3JWaWV3KSB7XG4gICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSBpY29ucyh2aWV3LCB0aGlzLnBsdWdpbik7XG4gICAgfVxuXG4gICAgdXBkYXRlKHVwZGF0ZTogVmlld1VwZGF0ZSkge1xuICAgICAgY29uc3QgcHJldk1vZGUgPSB1cGRhdGUuc3RhcnRTdGF0ZS5maWVsZChlZGl0b3JMaXZlUHJldmlld0ZpZWxkKSxcbiAgICAgICAgY3Vyck1vZGUgPSB1cGRhdGUuc3RhdGUuZmllbGQoZWRpdG9yTGl2ZVByZXZpZXdGaWVsZCk7XG4gICAgICBpZiAoXG4gICAgICAgIHVwZGF0ZS5kb2NDaGFuZ2VkIHx8XG4gICAgICAgIHVwZGF0ZS52aWV3cG9ydENoYW5nZWQgfHxcbiAgICAgICAgcHJldk1vZGUgIT09IGN1cnJNb2RlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IGljb25zKHVwZGF0ZS52aWV3LCBwbHVnaW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBWaWV3UGx1Z2luLmZyb21DbGFzcyhJY29uUGx1Z2luLCB7XG4gICAgZXZlbnRIYW5kbGVyczoge1xuICAgICAgbW91c2Vkb3duOiBJY29uQ2xpY2tIYW5kbGVyLFxuICAgIH0sXG4gICAgZGVjb3JhdGlvbnM6ICh2KSA9PiB2LmRlY29yYXRpb25zLFxuICAgIHByb3ZpZGU6IChwbHVnaW4pID0+XG4gICAgICBFZGl0b3JWaWV3LmF0b21pY1Jhbmdlcy5vZigodmlldykgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSB2aWV3LnBsdWdpbihwbHVnaW4pO1xuICAgICAgICByZXR1cm4gdmFsdWUgPyB2YWx1ZS5kZWNvcmF0aW9ucyA6IERlY29yYXRpb24ubm9uZTtcbiAgICAgIH0pLFxuICB9KTtcbiAgLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLWFycm93L3ByZWZlci1hcnJvdy1mdW5jdGlvbnMgKi9cbiAgZnVuY3Rpb24gSWNvbkNsaWNrSGFuZGxlcihcbiAgICB0aGlzOiBJY29uUGx1Z2luLFxuICAgIGV2dDogTW91c2VFdmVudCxcbiAgICB2aWV3OiBFZGl0b3JWaWV3LFxuICApIHtcbiAgICBsZXQgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0Lm1hdGNoUGFyZW50KFwiLmNtLWlzYy1pY29uXCIsIHZpZXcuY29udGVudERPTSkpIHtcbiAgICAgIGNvbnN0IGVsRnJvbSA9IHZpZXcucG9zQXRET00odGFyZ2V0KTtcbiAgICAgIGxldCBhbmNob3I6IG51bWJlciA9IC0xLFxuICAgICAgICBoZWFkOiBudW1iZXIgPSAtMTtcbiAgICAgIHRoaXMuZGVjb3JhdGlvbnMuYmV0d2VlbihlbEZyb20gLSAxLCBlbEZyb20gKyAxLCAoZnJvbSwgdG8sIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChlbEZyb20gPj0gZnJvbSAmJiBlbEZyb20gPD0gdG8pIHtcbiAgICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgICAgICAgIGFuY2hvciA9IHZhbHVlLnNwZWMuZnJvbTtcbiAgICAgICAgICAgIGhlYWQgPSB2YWx1ZS5zcGVjLnRvO1xuICAgICAgICAgIH0gZWxzZSAoYW5jaG9yID0gZnJvbSksIChoZWFkID0gdG8pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoYW5jaG9yIDwgMCB8fCBoZWFkIDwgMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwibm8gcmFuZ2UgZm91bmQgZm9yXCIsIHRhcmdldCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHdhaXQoMCkudGhlbigoKSA9PiB2aWV3LmRpc3BhdGNoKHsgc2VsZWN0aW9uOiB7IGFuY2hvciwgaGVhZCB9IH0pKTtcbiAgICAgIGlmIChldnQuYnV0dG9uID09PSAwIHx8IGV2dC5idXR0b24gPT09IDEpIHtcbiAgICAgICAgY29uc3QgbWVudSA9IGdldE1lbnUoYW5jaG9yLCBoZWFkLCBwbHVnaW4sIHZpZXcpO1xuICAgICAgICB3YWl0KDIwMCkudGhlbigoKSA9PiBtZW51LnNob3dBdE1vdXNlRXZlbnQoZXZ0KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCB3YWl0ID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5leHBvcnQgZGVmYXVsdCBnZXRJY29uTGl2ZVByZXZpZXdQbHVnaW47XG4iLCAiaW1wb3J0IHR5cGUgeyBFZGl0b3JWaWV3IH0gZnJvbSBcIkBjb2RlbWlycm9yL3ZpZXdcIjtcbmltcG9ydCB7IERlY29yYXRpb24gfSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuaW1wb3J0IHsgZWRpdG9yTGl2ZVByZXZpZXdGaWVsZCB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgdHlwZSBJY29uU0MgZnJvbSBcIi4uL2lzYy1tYWluXCI7XG5pbXBvcnQgSWNvbldpZGdldCBmcm9tIFwiLi93aWRnZXRcIjtcblxuY29uc3QgaWNvbnMgPSAodmlldzogRWRpdG9yVmlldywgcGx1Z2luOiBJY29uU0MpID0+IHtcbiAgbGV0IHJhbmdlczogW2ljb25JZDogc3RyaW5nLCBmcm9tOiBudW1iZXIsIHRvOiBudW1iZXJdW10gPSBbXTtcbiAgY29uc3QgU0NJbmZvID0gdmlldy5zdGF0ZS5maWVsZChwbHVnaW4uc2hvcnRjb2RlUG9zRmllbGQpO1xuICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2Ygdmlldy52aXNpYmxlUmFuZ2VzKSB7XG4gICAgU0NJbmZvLmJldHdlZW4oZnJvbSwgdG8sIChmcm9tLCB0bywgeyBpY29uSWQgfSkgPT4ge1xuICAgICAgcmFuZ2VzLnB1c2goW2ljb25JZCwgZnJvbSwgdG9dKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gRGVjb3JhdGlvbi5zZXQoXG4gICAgcmFuZ2VzLm1hcCgoW2ljb25JZCwgZnJvbSwgdG9dKSA9PiB7XG4gICAgICBjb25zdCB3aWRnZXQgPSBuZXcgSWNvbldpZGdldChpY29uSWQsIHBsdWdpbik7XG4gICAgICBjb25zdCBzcGVjID0geyB3aWRnZXQsIHNpZGU6IC0xLCBmcm9tLCB0byB9O1xuICAgICAgaWYgKHZpZXcuc3RhdGUuZmllbGQoZWRpdG9yTGl2ZVByZXZpZXdGaWVsZCkpIHtcbiAgICAgICAgcmV0dXJuIERlY29yYXRpb24ucmVwbGFjZShzcGVjKS5yYW5nZShmcm9tLCB0byk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi53aWRnZXQoc3BlYykucmFuZ2UodG8pO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHRydWUsXG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBpY29ucztcbiIsICJpbXBvcnQgdHlwZSB7IEVkaXRvclZpZXcgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuaW1wb3J0IHsgV2lkZ2V0VHlwZSB9IGZyb20gXCJAY29kZW1pcnJvci92aWV3XCI7XG5pbXBvcnQgY2xzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5cbmltcG9ydCB0eXBlIEljb25TQyBmcm9tIFwiLi4vaXNjLW1haW5cIjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEljb25XaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgY29uc3RydWN0b3IocHVibGljIGlkOiBzdHJpbmcsIHB1YmxpYyBwbHVnaW46IEljb25TQykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBlcShvdGhlcjogSWNvbldpZGdldCkge1xuICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIEljb25XaWRnZXQgJiYgb3RoZXIuaWQgPT09IHRoaXMuaWQ7XG4gIH1cblxuICB0b0RPTSh2aWV3OiBFZGl0b3JWaWV3KSB7XG4gICAgbGV0IHdyYXAgPSBjcmVhdGVTcGFuKHtcbiAgICAgIGNsczogXCJjbS1pc2MtaWNvblwiLFxuICAgICAgYXR0cjogeyBcImFyaWEtbGFiZWxcIjogdGhpcy5pZC5yZXBsYWNlKC9fL2csIFwiIFwiKSB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5wbHVnaW4ucGFja01hbmFnZXIuZ2V0U1ZHSWNvbih0aGlzLmlkKS50aGVuKChzcGFuKSA9PiB7XG4gICAgICBpZiAoIXNwYW4pIHtcbiAgICAgICAgd3JhcC5hcHBlbmQoYDoke3RoaXMuaWR9OmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuZm9yRWFjaCgoY2xzKSA9PiB3cmFwLmFkZENsYXNzKGNscykpO1xuICAgICAgICB3cmFwLnJlcGxhY2VDaGlsZHJlbiguLi5zcGFuLmNoaWxkTm9kZXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB3cmFwO1xuICB9XG5cbiAgaWdub3JlRXZlbnQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRWRpdG9yVmlldyB9IGZyb20gXCJAY29kZW1pcnJvci92aWV3XCI7XG5pbXBvcnQgeyBNZW51IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmltcG9ydCBJY29uU0MgZnJvbSBcIi4uL2lzYy1tYWluXCI7XG5cbmNvbnN0IGdldE1lbnUgPSAoXG4gIHN0YXJ0OiBudW1iZXIsXG4gIGVuZDogbnVtYmVyLFxuICBwbHVnaW46IEljb25TQyxcbiAgdmlldzogRWRpdG9yVmlldyxcbikgPT4ge1xuICByZXR1cm4gbmV3IE1lbnUocGx1Z2luLmFwcClcbiAgICAuYWRkSXRlbSgoaXRlbSkgPT5cbiAgICAgIGl0ZW1cbiAgICAgICAgLnNldEljb24oXCJpbWFnZS1nbHlwaFwiKVxuICAgICAgICAuc2V0VGl0bGUoXCJDaGFuZ2UgSWNvblwiKVxuICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWNvbiA9IGF3YWl0IHBsdWdpbi5hcGkuZ2V0SWNvbkZyb21Vc2VyKCk7XG4gICAgICAgICAgaWYgKCFpY29uKSByZXR1cm47XG4gICAgICAgICAgdmlldy5kaXNwYXRjaCh7XG4gICAgICAgICAgICBjaGFuZ2VzOiB7IGZyb206IHN0YXJ0LCB0bzogZW5kLCBpbnNlcnQ6IGA6JHtpY29uLmlkfTpgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgIClcbiAgICAuYWRkSXRlbSgoaXRlbSkgPT5cbiAgICAgIGl0ZW1cbiAgICAgICAgLnNldEljb24oXCJ0cmFzaFwiKVxuICAgICAgICAuc2V0VGl0bGUoXCJEZWxldGUgSWNvblwiKVxuICAgICAgICAub25DbGljaygoKSA9PiB7XG4gICAgICAgICAgdmlldy5kaXNwYXRjaCh7XG4gICAgICAgICAgICBjaGFuZ2VzOiB7IGZyb206IHN0YXJ0LCB0bzogZW5kLCBpbnNlcnQ6IFwiXCIgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgKTtcbn07XG5leHBvcnQgZGVmYXVsdCBnZXRNZW51O1xuIiwgImltcG9ydCB0eXBlIEljb25TQyBmcm9tIFwiLi4vaXNjLW1haW5cIjtcbmltcG9ydCBnZXRJY29uTGl2ZVByZXZpZXdQbHVnaW4gZnJvbSBcIi4vdmlldy1wbHVnaW5cIjtcblxuY29uc3Qgc2V0dXBJY29uUGx1Z2luID0gKHBsdWdpbjogSWNvblNDKSA9PiB7XG4gIHBsdWdpbi5yZWdpc3RlckVkaXRvckV4dGVuc2lvbihbXG4gICAgcGx1Z2luLnNob3J0Y29kZVBvc0ZpZWxkLFxuICAgIGdldEljb25MaXZlUHJldmlld1BsdWdpbihwbHVnaW4pLFxuICBdKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNldHVwSWNvblBsdWdpbjtcbiIsICJpbXBvcnQgeyBzeW50YXhUcmVlIH0gZnJvbSBcIkBjb2RlbWlycm9yL2xhbmd1YWdlXCI7XG5pbXBvcnQgeyB0b2tlbkNsYXNzTm9kZVByb3AgfSBmcm9tIFwiQGNvZGVtaXJyb3IvbGFuZ3VhZ2VcIjtcbmltcG9ydCB7XG4gIFJhbmdlLFxuICBSYW5nZVNldCxcbiAgUmFuZ2VTZXRCdWlsZGVyLFxuICBSYW5nZVZhbHVlLFxufSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7IEVkaXRvclN0YXRlLCBTdGF0ZUZpZWxkIH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IE5vZGVUeXBlIH0gZnJvbSBcIkBsZXplci9jb21tb25cIjtcblxuaW1wb3J0IHtcbiAgZ2V0R2xvYmFsUmVnZXhwLFxuICBSRV9TSE9SVENPREUsXG4gIHN0cmlwQ29sb25zLFxufSBmcm9tIFwiLi4vaWNvbi1wYWNrcy91dGlsc1wiO1xuaW1wb3J0IHR5cGUgSWNvblNDIGZyb20gXCIuLi9pc2MtbWFpblwiO1xuaW1wb3J0IFVuaW9uUmFuZ2VzIGZyb20gXCIuLi9tb2R1bGVzL3VuaW9uXCI7XG5cbmNsYXNzIFNob3J0Y29kZVBvcyBleHRlbmRzIFJhbmdlVmFsdWUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGV4dDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBnZXQgaWNvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0cmlwQ29sb25zKHRoaXMudGV4dCk7XG4gIH1cbiAgZXEob3RoZXI6IFJhbmdlVmFsdWUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBTaG9ydGNvZGVQb3MgJiYgb3RoZXIudGV4dCA9PT0gdGhpcy50ZXh0O1xuICB9XG59XG5cbmNvbnN0IGFsbG93ZWRUeXBlcyA9IFtcbiAgXCJsaW5rLWFsaWFzXCIsXG4gIFwiY29tbWVudFwiLFxuICBcImhlYWRlclwiLFxuICBcInN0cm9uZ1wiLFxuICBcImVtXCIsXG4gIFwic3RyaWtldGhyb3VnaFwiLFxuICBcInF1b3RlXCIsXG4gIFwibGlua1wiLFxuICBcImxpc3QtMVwiLFxuICBcImxpc3QtMlwiLFxuICBcImxpc3QtM1wiLFxuICBcImhpZ2hsaWdodFwiLFxuICBcImhtZC1mb290cmVmMlwiLFxuICBcImZvb3RyZWZcIixcbl07XG5jb25zdCBleGNsdWRlVHlwZXMgPSBbXCJmb3JtYXR0aW5nXCIsIFwiY29tbWVudC1zdGFydFwiLCBcImNvbW1lbnQtZW5kXCJdO1xuY29uc3Qgc2hvdWxkTm9kZUhhdmVJY29uID0gKHR5cGU6IE5vZGVUeXBlKSA9PiB7XG4gIGNvbnN0IG5vZGVQcm9wcyA9IHR5cGUucHJvcCh0b2tlbkNsYXNzTm9kZVByb3ApO1xuICBpZiAoIW5vZGVQcm9wcykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwcm9wcyA9IG5ldyBTZXQobm9kZVByb3BzPy5zcGxpdChcIiBcIikpO1xuICByZXR1cm4gKFxuICAgIGV4Y2x1ZGVUeXBlcy5ldmVyeSgodCkgPT4gIXByb3BzLmhhcyh0KSkgJiZcbiAgICBhbGxvd2VkVHlwZXMuc29tZSgodCkgPT4gcHJvcHMuaGFzKHQpKVxuICApO1xufTtcblxuY29uc3QgZ2V0U2hvcnRjb2RlUG9zRmllbGQgPSAocGx1Z2luOiBJY29uU0MpID0+IHtcbiAgY29uc3QgZ2V0U2hvcnRjb2RlUmFuZ2VzID0gKFxuICAgIHN0YXRlOiBFZGl0b3JTdGF0ZSxcbiAgICBmcm9tOiBudW1iZXIsXG4gICAgdG86IG51bWJlcixcbiAgICBhZGRUb1JhbmdlQXJyOiAoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB2YWx1ZTogU2hvcnRjb2RlUG9zKSA9PiB2b2lkLFxuICApID0+IHtcbiAgICBjb25zdCBzYXZlUmFuZ2UgPSAoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gc3RhdGUuZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvKTtcbiAgICAgIGlmICghdGV4dC50cmltKCkpIHJldHVybjtcbiAgICAgIGZvciAoY29uc3QgeyAwOiByYXdDb2RlLCBpbmRleDogb2Zmc2V0IH0gb2YgdGV4dC5tYXRjaEFsbChcbiAgICAgICAgZ2V0R2xvYmFsUmVnZXhwKFJFX1NIT1JUQ09ERSksXG4gICAgICApKSB7XG4gICAgICAgIGlmIChwbHVnaW4ucGFja01hbmFnZXIuaGFzSWNvbihzdHJpcENvbG9ucyhyYXdDb2RlKSkpIHtcbiAgICAgICAgICBhZGRUb1JhbmdlQXJyKFxuICAgICAgICAgICAgZnJvbSArIG9mZnNldCEsXG4gICAgICAgICAgICBmcm9tICsgb2Zmc2V0ISArIHJhd0NvZGUubGVuZ3RoLFxuICAgICAgICAgICAgbmV3IFNob3J0Y29kZVBvcyhyYXdDb2RlKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBsZXQgcHJldlRvID0gZnJvbTtcbiAgICBzeW50YXhUcmVlKHN0YXRlKS5pdGVyYXRlKHtcbiAgICAgIGZyb206IGZyb20gLSAxLFxuICAgICAgdG86IHRvICsgMSxcbiAgICAgIGVudGVyOiAoeyB0eXBlLCBmcm9tLCB0byB9KSA9PiB7XG4gICAgICAgIGlmICh0eXBlLm5hbWUgPT09IFwiRG9jdW1lbnRcIikgcmV0dXJuO1xuICAgICAgICBpZiAoZnJvbSAhPT0gcHJldlRvKSBzYXZlUmFuZ2UocHJldlRvLCBmcm9tKTtcbiAgICAgICAgcHJldlRvID0gdG87XG4gICAgICAgIGlmIChzaG91bGROb2RlSGF2ZUljb24odHlwZSkpIHtcbiAgICAgICAgICBzYXZlUmFuZ2UoZnJvbSwgdG8pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmIChwcmV2VG8gIT09IHRvKSBzYXZlUmFuZ2UocHJldlRvLCB0byk7XG4gIH07XG4gIHJldHVybiBTdGF0ZUZpZWxkLmRlZmluZTxSYW5nZVNldDxTaG9ydGNvZGVQb3M+Pih7XG4gICAgY3JlYXRlOiAoc3RhdGUpID0+IHtcbiAgICAgIGxldCByYW5nZXNldCA9IG5ldyBSYW5nZVNldEJ1aWxkZXI8U2hvcnRjb2RlUG9zPigpO1xuICAgICAgZ2V0U2hvcnRjb2RlUmFuZ2VzKFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgMCxcbiAgICAgICAgc3RhdGUuZG9jLmxlbmd0aCxcbiAgICAgICAgcmFuZ2VzZXQuYWRkLmJpbmQocmFuZ2VzZXQpLFxuICAgICAgKTtcbiAgICAgIHJldHVybiByYW5nZXNldC5maW5pc2goKTtcbiAgICB9LFxuICAgIHVwZGF0ZTogKHJhbmdlc2V0LCB0cikgPT4ge1xuICAgICAgaWYgKCF0ci5kb2NDaGFuZ2VkKSByZXR1cm4gcmFuZ2VzZXQ7XG4gICAgICByYW5nZXNldCA9IHJhbmdlc2V0Lm1hcCh0ci5jaGFuZ2VzKTtcbiAgICAgIGxldCBjaGFuZ2VkTGluZXM6IFtsaW5lU3RhcnQ6IG51bWJlciwgbGluZUVuZDogbnVtYmVyXVtdID0gW107XG4gICAgICB0ci5jaGFuZ2VzLml0ZXJDaGFuZ2VkUmFuZ2VzKChfZiwgX3QsIGZyb20sIHRvKSA9PiB7XG4gICAgICAgIC8vIGxpbmVzIHRoYXQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgIGNoYW5nZWRMaW5lcy5wdXNoKFtcbiAgICAgICAgICB0ci5zdGF0ZS5kb2MubGluZUF0KGZyb20pLm51bWJlcixcbiAgICAgICAgICB0ci5zdGF0ZS5kb2MubGluZUF0KHRvKS5udW1iZXIsXG4gICAgICAgIF0pO1xuICAgICAgfSk7XG4gICAgICBsZXQgbmV3U2hvcnRjb2RlUmFuZ2VzOiBSYW5nZTxTaG9ydGNvZGVQb3M+W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgW3N0YXJ0LCBlbmRdIG9mIFVuaW9uUmFuZ2VzKGNoYW5nZWRMaW5lcykpIHtcbiAgICAgICAgY29uc3QgeyBmcm9tIH0gPSB0ci5zdGF0ZS5kb2MubGluZShzdGFydCksXG4gICAgICAgICAgeyB0byB9ID0gdHIuc3RhdGUuZG9jLmxpbmUoZW5kKTtcbiAgICAgICAgLy8gZmlsdGVyIG91dCBzaG9ydGNvZGUgcG9zIGluIGN1cnJlbnQgbGluZSByYW5nZVxuICAgICAgICByYW5nZXNldCA9IHJhbmdlc2V0LnVwZGF0ZSh7XG4gICAgICAgICAgZmlsdGVyRnJvbTogZnJvbSxcbiAgICAgICAgICBmaWx0ZXJUbzogdG8sXG4gICAgICAgICAgZmlsdGVyOiAoKSA9PiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHJlY29tcHV0ZSBzaG9ydGNvZGUgcG9zIGluIGN1cnJlbnQgbGluZSByYW5nZVxuICAgICAgICBnZXRTaG9ydGNvZGVSYW5nZXModHIuc3RhdGUsIGZyb20sIHRvLCAoZnJvbSwgdG8sIHZhbHVlKSA9PiB7XG4gICAgICAgICAgbmV3U2hvcnRjb2RlUmFuZ2VzLnB1c2godmFsdWUucmFuZ2UoZnJvbSwgdG8pKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByYW5nZXNldCA9IHJhbmdlc2V0LnVwZGF0ZSh7IGFkZDogbmV3U2hvcnRjb2RlUmFuZ2VzIH0pO1xuICAgICAgcmV0dXJuIHJhbmdlc2V0O1xuICAgIH0sXG4gIH0pO1xufTtcbmV4cG9ydCB0eXBlIFNob3J0Y29kZVBvc0ZpZWxkID0gU3RhdGVGaWVsZDxSYW5nZVNldDxTaG9ydGNvZGVQb3M+PjtcblxuZXhwb3J0IGRlZmF1bHQgZ2V0U2hvcnRjb2RlUG9zRmllbGQ7XG4iLCAiaW1wb3J0IHsgZXh0ZW5zaW9uLCBsb29rdXAgfSBmcm9tIFwibWltZS10eXBlc1wiO1xuaW1wb3J0IGVtb2ppIGZyb20gXCJub2RlLWVtb2ppXCI7XG5pbXBvcnQgeyBleHRuYW1lIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgRmlsZUljb25JbmZvLCBJY29uSW5mbyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIEVudHJpZXNGcm9tUmVjb3JkPFQ+ID0gW2tleToga2V5b2YgVCwgdmFsdWU6IFRba2V5b2YgVF1dW107XG5cbmV4cG9ydCBjb25zdCBPYmp0b0VudHJpZXMgPSA8VCBleHRlbmRzIE9iamVjdD4ob2JqOiBUKSA9PlxuICBPYmplY3QuZW50cmllcyhvYmopIGFzIEVudHJpZXNGcm9tUmVjb3JkPFQ+O1xuXG4vKipcbiAqIFJlbW92ZXMgY29sb25zIG9uIGVpdGhlciBzaWRlXG4gKiBvZiB0aGUgc3RyaW5nIGlmIHByZXNlbnRcbiAqIEBwYXJhbSAge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuZXhwb3J0IGNvbnN0IHN0cmlwQ29sb25zID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdmFyIGNvbG9uSW5kZXggPSBzdHIuaW5kZXhPZihcIjpcIik7XG4gIGlmIChjb2xvbkluZGV4ID4gLTEpIHtcbiAgICAvLyA6ZW1vamk6IChodHRwOi8vd3d3LmVtb2ppLWNoZWF0LXNoZWV0LmNvbS8pXG4gICAgaWYgKGNvbG9uSW5kZXggPT09IHN0ci5sZW5ndGggLSAxKSB7XG4gICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIGNvbG9uSW5kZXgpO1xuICAgICAgcmV0dXJuIHN0cmlwQ29sb25zKHN0cik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoY29sb25JbmRleCArIDEpO1xuICAgICAgcmV0dXJuIHN0cmlwQ29sb25zKHN0cik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0cjtcbn07XG5cbmV4cG9ydCBjb25zdCBQYWNrUHJlZml4UGF0dGVybiA9IC9eKFtBLVphLXowLTldKz8pXy87XG5cbmV4cG9ydCBjb25zdCBnZXRQYWNrbk5hbWVGcm9tSWQgPSAoXG4gIGlkOiBzdHJpbmcsXG4pOiB7IHBhY2s6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0gfCBudWxsID0+IHtcbiAgaWYgKGVtb2ppLmhhc0Vtb2ppKGlkKSkgcmV0dXJuIHsgcGFjazogXCJlbW9qaVwiLCBuYW1lOiBpZCB9O1xuICBjb25zdCBtYXRjaCA9IGlkLm1hdGNoKFBhY2tQcmVmaXhQYXR0ZXJuKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJObyB2YWlsZCBwYWNrIGlkIGZvdW5kIGluOiBcIiwgaWQpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IFtzdHIsIHBhY2tuYW1lXSA9IG1hdGNoO1xuICByZXR1cm4geyBwYWNrOiBwYWNrbmFtZSwgbmFtZTogaWQuc3Vic3RyaW5nKHN0ci5sZW5ndGgpIH07XG59O1xuXG5leHBvcnQgY29uc3Qgc2FuaXRpemVJZCA9IChpZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGdldFBhY2tuTmFtZUZyb21JZChpZCk7XG4gIGlmICghcmVzdWx0KSB7XG4gICAgY29uc29sZS5sb2coXCJmYWlsZWQgdG8gcmVuYW1lIGljb246IGlkICVzIGludmFsaWRcIiwgaWQpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBgJHtyZXN1bHQucGFja31fJHtzYW5pdGl6ZU5hbWUocmVzdWx0Lm5hbWUpfWA7XG59O1xuZXhwb3J0IGNvbnN0IHNhbml0aXplTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgbmFtZS50cmltKCkucmVwbGFjZSgvWyAtXSsvZywgXCJfXCIpLnJlcGxhY2UoL1xccysvZywgXCJcIikudG9Mb2NhbGVMb3dlckNhc2UoKTtcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEljb25FeHQgPSBbXG4gIFwiLmJtcFwiLFxuICBcIi5wbmdcIixcbiAgXCIuanBnXCIsXG4gIFwiLmpwZWdcIixcbiAgXCIuZ2lmXCIsXG4gIFwiLnN2Z1wiLFxuICBcIi53ZWJwXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IGljb25GaWxlUGF0dGVybiA9IC9eW1xcdy1dK1xcLig/OmJtcHxwbmd8anBnfGpwZWd8Z2lmfHN2Z3x3ZWJwKSQvO1xuZXhwb3J0IGNvbnN0IGV4dFBhdHRlcm4gPSAvXFwuKD86Ym1wfHBuZ3xqcGd8anBlZ3xnaWZ8c3ZnfHdlYnApJC87XG5jb25zdCBtaW1lcyA9IFN1cHBvcnRlZEljb25FeHQubWFwKChleHQpID0+IGxvb2t1cChleHQpKTtcbmV4cG9ydCBjb25zdCBnZXRJY29uc0Zyb21GaWxlTGlzdCA9IGFzeW5jIChcbiAgbGlzdDogRmlsZUxpc3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgZXh0OiBzdHJpbmc7IGRhdGE6IEFycmF5QnVmZmVyIH1bXSB8IG51bGw+ID0+IHtcbiAgaWYgKCFsaXN0IHx8IGxpc3QubGVuZ3RoIDw9IDApIHJldHVybiBudWxsO1xuICBjb25zdCBnZXRJY29uID0gYXN5bmMgKGZpbGU6IEZpbGUpID0+ICh7XG4gICAgbmFtZTogZmlsZS5uYW1lLnJlcGxhY2UoZXh0UGF0dGVybiwgXCJcIiksXG4gICAgZXh0OiBcIi5cIiArIChleHRlbnNpb24oZmlsZS50eXBlKSBhcyBzdHJpbmcpLFxuICAgIGRhdGE6IGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKSxcbiAgfSk7XG4gIGxldCBwcm9taXNlcyA9IFtdIGFzIFJldHVyblR5cGU8dHlwZW9mIGdldEljb24+W107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGZpbGUgPSBsaXN0W2ldO1xuICAgIGlmIChtaW1lcy5pbmNsdWRlcyhmaWxlLnR5cGUpKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKGdldEljb24oZmlsZSkpO1xuICAgIH1cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIHJldHVybiByZXN1bHQubGVuZ3RoID4gMCA/IHJlc3VsdCA6IG51bGw7XG59O1xuXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IGNsb25lUmVnZXhwIGZyb20gXCJjbG9uZS1yZWdleHBcIjtcblxuaW1wb3J0IEljb25TQyBmcm9tIFwiLi4vaXNjLW1haW5cIjtcblxuZXhwb3J0IGNvbnN0IFJFX1NIT1JUQ09ERSA9IC86XFwrMTp8Oi0xOnw6W1xcdy1dKzovO1xuZXhwb3J0IGNvbnN0IGdldEdsb2JhbFJlZ2V4cCA9IChwYXR0ZXJuOiBSZWdFeHApID0+XG4gIGNsb25lUmVnZXhwKHBhdHRlcm4sIHsgZ2xvYmFsOiB0cnVlIH0pO1xuXG5leHBvcnQgY29uc3QgZ2V0Q2xzRm9ySWNvbiA9IChpY29uOiBJY29uSW5mbykgPT5cbiAgY2xhc3NOYW1lcyhbXCJpc2MtaWNvblwiLCBgaXNjLSR7aWNvbi5wYWNrfWBdKTtcbiIsICJjb25zdCB7dG9TdHJpbmd9ID0gT2JqZWN0LnByb3RvdHlwZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNSZWdleHAodmFsdWUpIHtcblx0cmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbiIsICJpbXBvcnQgaXNSZWdleHAgZnJvbSAnaXMtcmVnZXhwJztcblxuY29uc3QgZmxhZ01hcCA9IHtcblx0Z2xvYmFsOiAnZycsXG5cdGlnbm9yZUNhc2U6ICdpJyxcblx0bXVsdGlsaW5lOiAnbScsXG5cdGRvdEFsbDogJ3MnLFxuXHRzdGlja3k6ICd5Jyxcblx0dW5pY29kZTogJ3UnXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbG9uZWRSZWdleHAocmVnZXhwLCBvcHRpb25zID0ge30pIHtcblx0aWYgKCFpc1JlZ2V4cChyZWdleHApKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBSZWdFeHAgaW5zdGFuY2UnKTtcblx0fVxuXG5cdGNvbnN0IGZsYWdzID0gT2JqZWN0LmtleXMoZmxhZ01hcCkubWFwKGZsYWcgPT4gKFxuXHRcdCh0eXBlb2Ygb3B0aW9uc1tmbGFnXSA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9uc1tmbGFnXSA6IHJlZ2V4cFtmbGFnXSkgPyBmbGFnTWFwW2ZsYWddIDogJydcblx0KSkuam9pbignJyk7XG5cblx0Y29uc3QgY2xvbmVkUmVnZXhwID0gbmV3IFJlZ0V4cChvcHRpb25zLnNvdXJjZSB8fCByZWdleHAuc291cmNlLCBmbGFncyk7XG5cblx0Y2xvbmVkUmVnZXhwLmxhc3RJbmRleCA9IHR5cGVvZiBvcHRpb25zLmxhc3RJbmRleCA9PT0gJ251bWJlcicgP1xuXHRcdG9wdGlvbnMubGFzdEluZGV4IDpcblx0XHRyZWdleHAubGFzdEluZGV4O1xuXG5cdHJldHVybiBjbG9uZWRSZWdleHA7XG59XG4iLCAidHlwZSBQb3NSYW5nZSA9IFtzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcl07XG5cbmNvbnN0IGlzUmFuZ2VPdmVybGFwID0gKGE6IFBvc1JhbmdlLCBiOiBQb3NSYW5nZSkgPT5cbiAgaXNXaXRoaW5SYW5nZShhLCBiWzBdKSB8fCBpc1dpdGhpblJhbmdlKGEsIGJbMV0pO1xuY29uc3QgaXNXaXRoaW5SYW5nZSA9IChyOiBQb3NSYW5nZSwgcG9zOiBudW1iZXIpID0+IHJbMF0gPCBwb3MgJiYgclsxXSA+IHBvcztcblxuY29uc3QgbWVyZ2VSYW5nZXMgPSAoYTogUG9zUmFuZ2UsIGI6IFBvc1JhbmdlKSA9PiB7XG4gIGNvbnN0IHN0YXJ0ID0gaXNXaXRoaW5SYW5nZShhLCBiWzBdKSA/IGFbMF0gOiBiWzBdLFxuICAgIGVuZCA9IGlzV2l0aGluUmFuZ2UoYSwgYlsxXSkgPyBhWzFdIDogYlsxXTtcbiAgcmV0dXJuIFtzdGFydCwgZW5kXSBhcyBQb3NSYW5nZTtcbn07XG5cbmNvbnN0IFVuaW9uUmFuZ2VzID0gKHJhbmdlczogUG9zUmFuZ2VbXSkgPT5cbiAgcmFuZ2VzXG4gICAgLnNvcnQoKGEsIGIpID0+IGFbMF0gLSBiWzBdKVxuICAgIC5yZWR1Y2UoKGFyciwgcmFuZ2UpID0+IHtcbiAgICAgIGxldCBpbmRleCA9IGFyci5maW5kSW5kZXgoKHJhbmdlVG9DaGVjaykgPT5cbiAgICAgICAgaXNSYW5nZU92ZXJsYXAocmFuZ2VUb0NoZWNrLCByYW5nZSksXG4gICAgICApO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBhcnJbaW5kZXhdID0gbWVyZ2VSYW5nZXMoYXJyW2luZGV4XSwgcmFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyLnB1c2gocmFuZ2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycjtcbiAgICB9LCBbXSBhcyBQb3NSYW5nZVtdKTtcblxuZXhwb3J0IGRlZmF1bHQgVW5pb25SYW5nZXM7XG4iLCAiaW1wb3J0IHsgU3RhdCB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgdHlwZSBJY29uU0MgZnJvbSBcIi4uL2lzYy1tYWluXCI7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgY29uc3QgRE9NUHVyaWZ5OiB0eXBlb2YgaW1wb3J0KFwiZG9tcHVyaWZ5XCIpO1xufVxuXG5pbnRlcmZhY2UgSWNvbkNhY2hlIHtcbiAgY3RpbWU6IG51bWJlcjtcbiAgbXRpbWU6IG51bWJlcjtcbiAgc2l6ZTogbnVtYmVyO1xuICBzdmc6IFNWR0VsZW1lbnQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVJY29uQ2FjaGUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGx1Z2luOiBJY29uU0MpIHt9XG4gIHByaXZhdGUgZ2V0IHZhdWx0KCkge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5hcHAudmF1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBJY29uQ2FjaGU+KCk7XG4gIGFzeW5jIGdldEljb24obm9ybWFsaXplZFBhdGg6IHN0cmluZyk6IFByb21pc2U8U1ZHRWxlbWVudCB8IG51bGw+IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgdGhpcy52YXVsdC5hZGFwdGVyLnN0YXQobm9ybWFsaXplZFBhdGgpO1xuICAgIGlmICghc3RhdCB8fCBzdGF0LnR5cGUgIT09IFwiZmlsZVwiKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5jYWNoZS5oYXMobm9ybWFsaXplZFBhdGgpKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGUuZ2V0KG5vcm1hbGl6ZWRQYXRoKSE7XG4gICAgICBpZiAoXG4gICAgICAgIGNhY2hlLmN0aW1lID09PSBzdGF0LmN0aW1lICYmXG4gICAgICAgIGNhY2hlLm10aW1lID09PSBzdGF0Lm10aW1lICYmXG4gICAgICAgIGNhY2hlLnNpemUgPT09IHN0YXQuc2l6ZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBjYWNoZS5zdmcuY2xvbmVOb2RlKHRydWUpIGFzIFNWR0VsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHN2ZyA9IGF3YWl0IHRoaXMucmVhZEludG9DYWNoZShub3JtYWxpemVkUGF0aCwgc3RhdCk7XG4gICAgcmV0dXJuIHN2Zy5jbG9uZU5vZGUodHJ1ZSkgYXMgU1ZHRWxlbWVudDtcbiAgfVxuICBwcml2YXRlIGFzeW5jIHJlYWRJbnRvQ2FjaGUoXG4gICAgbm9ybWFsaXplZFBhdGg6IHN0cmluZyxcbiAgICBzdGF0OiBTdGF0LFxuICApOiBQcm9taXNlPFNWR0VsZW1lbnQ+IHtcbiAgICBjb25zdCBkYXRhID0gRE9NUHVyaWZ5LnNhbml0aXplKFxuICAgICAgICBhd2FpdCB0aGlzLnZhdWx0LmFkYXB0ZXIucmVhZChub3JtYWxpemVkUGF0aCksXG4gICAgICApLFxuICAgICAgc3ZnID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhkYXRhLCBcImltYWdlL3N2Zyt4bWxcIilcbiAgICAgICAgLmRvY3VtZW50RWxlbWVudCBhcyB1bmtub3duIGFzIFNWR0VsZW1lbnQ7XG4gICAgdGhpcy5jYWNoZS5zZXQobm9ybWFsaXplZFBhdGgsIHsgLi4uc3RhdCwgc3ZnIH0pO1xuICAgIHJldHVybiBzdmc7XG4gIH1cbiAgcmVmcmVzaCgpIHtcbiAgICBjb25zdCByZWZyZXNoID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IHRoaXMudmF1bHQuYWRhcHRlci5zdGF0KHBhdGgpO1xuICAgICAgaWYgKCFzdGF0IHx8IHN0YXQudHlwZSAhPT0gXCJmaWxlXCIpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUocGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLnJlYWRJbnRvQ2FjaGUocGF0aCwgc3RhdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9O1xuICAgIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoWy4uLnRoaXMuY2FjaGUua2V5cygpXS5tYXAocmVmcmVzaCkpO1xuICB9XG4gIGNsZWFyKCkge1xuICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgfVxufVxuIiwgImltcG9ydCBcIi4vaWNvbi5sZXNzXCI7XG5cbmltcG9ydCBhc3NlcnROZXZlciBmcm9tIFwiYXNzZXJ0LW5ldmVyXCI7XG5pbXBvcnQgRnVzZSBmcm9tIFwiZnVzZS5qc1wiO1xuaW1wb3J0IEpTWmlwIGZyb20gXCJqc3ppcFwiO1xuaW1wb3J0IGVtb2ppIGZyb20gXCJub2RlLWVtb2ppXCI7XG5pbXBvcnQgeyBFdmVudFJlZiwgRXZlbnRzLCBub3JtYWxpemVQYXRoLCBOb3RpY2UsIFBsYXRmb3JtIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBJY29uU0MgZnJvbSBcIi4uL2lzYy1tYWluXCI7XG5pbXBvcnQgeyBldnRQcmVmaXgsIFBNRXZlbnRzIH0gZnJvbSBcIi4uL3R5cGluZ3MvYXBpXCI7XG5pbXBvcnQge1xuICBCdWlsdEluSWNvbklkcyxcbiAgQnVpbHRJbkljb25QYWNrbmFtZXMsXG4gIEJ1aWx0SW5TVkdJY29uUGFja3MsXG59IGZyb20gXCIuL2J1aWx0LWluc1wiO1xuaW1wb3J0IEVtb2ppSWNvbkRhdGEgZnJvbSBcIi4vZW1vamlcIjtcbmltcG9ydCBGaWxlSWNvbkRhdGEgZnJvbSBcIi4vZmlsZS1pY29uXCI7XG5pbXBvcnQgeyBCdWx0aUluSWNvbkRhdGEsIEljb25EYXRhLCBJY29uSW5mbywgaXNGaWxlSWNvbkluZm8gfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZXh0UGF0dGVybixcbiAgZ2V0SWNvbnNGcm9tRmlsZUxpc3QsXG4gIGljb25GaWxlUGF0dGVybixcbiAgc2FuaXRpemVJZCxcbiAgc3RyaXBDb2xvbnMsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmNvbnN0IENVU1RPTV9JQ09OX1BBVEggPSBcIi9pY29ucy5qc29uXCI7XG5jb25zdCBDVVNUT01fSUNPTl9ESVIgPSBcImljb25zXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhY2tNYW5hZ2VyIGV4dGVuZHMgRXZlbnRzIHtcbiAgcHJpdmF0ZSBfY3VzdG9tSWNvbnMgPSBuZXcgTWFwPHN0cmluZywgRmlsZUljb25EYXRhPigpO1xuICBwcml2YXRlIF9jdXRvbXNJY29uUGFja25hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgZ2V0IHZhdWx0KCkge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5hcHAudmF1bHQ7XG4gIH1cbiAgYXN5bmMgcmVuYW1lSWNvbkZpbGUoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBleHQ6IHN0cmluZyxcbiAgICBuZXdJZDogc3RyaW5nLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG5ld1BhdGggPSBqb2luKHRoaXMuY3VzdG9tSWNvbnNEaXIsIG5ld0lkICsgZXh0KSxcbiAgICAgIHBhdGggPSBqb2luKHRoaXMuY3VzdG9tSWNvbnNEaXIsIGlkICsgZXh0KTtcbiAgICBhd2FpdCB0aGlzLnZhdWx0LmFkYXB0ZXIucmVuYW1lKHBhdGgsIG5ld1BhdGgpO1xuICAgIHJldHVybiBuZXdQYXRoO1xuICB9XG4gIHJlbW92ZUljb25GaWxlKGlkOiBzdHJpbmcsIGV4dDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGF0aCA9IGpvaW4odGhpcy5jdXN0b21JY29uc0RpciwgaWQgKyBleHQpO1xuICAgIHJldHVybiB0aGlzLnZhdWx0LmFkYXB0ZXIucmVtb3ZlKHBhdGgpO1xuICB9XG4gIGFzeW5jIGFkZEljb24oaWQ6IHN0cmluZywgZXh0OiBzdHJpbmcsIGRhdGE6IEFycmF5QnVmZmVyKSB7XG4gICAgY29uc3QgcGF0aCA9IGpvaW4odGhpcy5jdXN0b21JY29uc0RpciwgaWQgKyBleHQpO1xuICAgIGF3YWl0IHRoaXMudmF1bHQuYWRhcHRlci53cml0ZUJpbmFyeShwYXRoLCBkYXRhKTtcbiAgICByZXR1cm4gcGF0aDtcbiAgfVxuICBnZXQgY3VzdG9tUGFja25hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX2N1dG9tc0ljb25QYWNrbmFtZXNdO1xuICB9XG4gIGdldCBjdXN0b21JY29uc0ZpbGVQYXRoKCkge1xuICAgIHJldHVybiBub3JtYWxpemVQYXRoKHRoaXMucGx1Z2luLm1hbmlmZXN0LmRpciArIENVU1RPTV9JQ09OX1BBVEgpO1xuICB9XG4gIGdldCBjdXN0b21JY29uc0RpcigpIHtcbiAgICByZXR1cm4gam9pbih0aGlzLnZhdWx0LmNvbmZpZ0RpciwgQ1VTVE9NX0lDT05fRElSKTtcbiAgfVxuICBpc1BhY2tuYW1lRXhpc3RzKHBhY2tuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgQnVpbHRJbkljb25QYWNrbmFtZXMuaW5jbHVkZXMocGFja25hbWUpIHx8XG4gICAgICB0aGlzLl9jdXRvbXNJY29uUGFja25hbWVzLmhhcyhwYWNrbmFtZSlcbiAgICApO1xuICB9XG4gIGdldCBlbmFibGVkUGFja25hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLkJ1aWx0SW5JY29uUGFja25hbWVzLCAuLi50aGlzLl9jdXRvbXNJY29uUGFja25hbWVzXS5maWx0ZXIoXG4gICAgICAocGFjaykgPT4gdGhpcy5pc1BhY2tFbmFibGVkKHBhY2spLFxuICAgICk7XG4gIH1cblxuICBoYXNJY29uKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNCdWlsdEluKGlkKSB8fCB0aGlzLl9jdXN0b21JY29ucy5oYXMoaWQpO1xuICB9XG4gIHByaXZhdGUgX2lzQnVpbHRJbihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVtb2ppLmhhc0Vtb2ppKGlkKSB8fCBCdWlsdEluU1ZHSWNvblBhY2tzLmhhcyhpZCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGlkIGFjY2VwdCBzaG9ydGNvZGUgd2l0aCBjb2xvbnNcbiAgICogQHBhcmFtIHJhdyBpZiBnaXZlbiwgcmV0dXJuIHJlc291cmNlIHBhdGggdG8gaWNvbiBmaWxlIGluc3RlYWQgb2YgaW1nIGVsZW1lbnRcbiAgICovXG4gIGdldEljb24oaWQ6IHN0cmluZywgcmF3OiB0cnVlKTogc3RyaW5nIHwgbnVsbDtcbiAgZ2V0SWNvbihpZDogc3RyaW5nLCByYXc/OiBmYWxzZSk6IEhUTUxTcGFuRWxlbWVudCB8IG51bGw7XG4gIGdldEljb24oaWQ6IHN0cmluZywgcmF3ID0gZmFsc2UpOiBzdHJpbmcgfCBIVE1MU3BhbkVsZW1lbnQgfCBudWxsIHtcbiAgICBpZCA9IHN0cmlwQ29sb25zKGlkKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRJY29uRGF0YShpZCk7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBnZXRET00gPSAoKSA9PiBkYXRhLmdldERPTShmYWxzZSk7XG4gICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJlbW9qaVwiOlxuICAgICAgICByZXR1cm4gcmF3ID8gZGF0YS5jaGFyIDogZ2V0RE9NKCk7XG4gICAgICBjYXNlIFwiYnVsdGktaW5cIjpcbiAgICAgICAgcmV0dXJuIHJhdyA/IGRhdGEuZGF0YVVyaSA6IGdldERPTSgpO1xuICAgICAgY2FzZSBcImZpbGVcIjpcbiAgICAgICAgcmV0dXJuIHJhdyA/IGRhdGEucmVzb3VyY2VQYXRoIDogZ2V0RE9NKCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnROZXZlcihkYXRhKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRTVkdJY29uKGlkOiBzdHJpbmcsIHJhdzogdHJ1ZSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIGFzeW5jIGdldFNWR0ljb24oaWQ6IHN0cmluZywgcmF3PzogZmFsc2UpOiBQcm9taXNlPEhUTUxTcGFuRWxlbWVudCB8IG51bGw+O1xuICBhc3luYyBnZXRTVkdJY29uKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcmF3ID0gZmFsc2UsXG4gICk6IFByb21pc2U8c3RyaW5nIHwgSFRNTFNwYW5FbGVtZW50IHwgbnVsbD4ge1xuICAgIGlkID0gc3RyaXBDb2xvbnMoaWQpO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldEljb25EYXRhKGlkKTtcbiAgICBpZiAoIWRhdGEpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGdldERPTSA9ICgpID0+IGRhdGEuZ2V0RE9NKHRydWUpO1xuICAgIGlmIChkYXRhLnR5cGUgPT09IFwiZW1vamlcIikge1xuICAgICAgcmV0dXJuIHJhdyA/IGRhdGEuY2hhciA6IGdldERPTSgpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBkYXRhLnR5cGUgPT09IFwiYnVsdGktaW5cIiB8fFxuICAgICAgKGRhdGEudHlwZSA9PT0gXCJmaWxlXCIgJiYgZGF0YS5pc1NWRylcbiAgICApIHtcbiAgICAgIGNvbnN0IGVsID0gYXdhaXQgZ2V0RE9NKCk7XG4gICAgICByZXR1cm4gcmF3ID8gZWwuaW5uZXJIVE1MIDogZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByYXcgPyBkYXRhLnJlc291cmNlUGF0aCA6IGdldERPTSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldEljb25EYXRhKGlkOiBzdHJpbmcpOiBJY29uRGF0YSB8IG51bGwge1xuICAgIGlkID0gc3RyaXBDb2xvbnMoaWQpO1xuICAgIGxldCBkYXRhOiBJY29uRGF0YSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgKGRhdGEgPSBFbW9qaUljb25EYXRhLmdldERhdGEoaWQpKSB8fFxuICAgICAgKGRhdGEgPSBCdWlsdEluU1ZHSWNvblBhY2tzLmdldChpZCkpIHx8XG4gICAgICAoZGF0YSA9IHRoaXMuX2N1c3RvbUljb25zLmdldChpZCkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGVsc2UgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpc1BhY2tFbmFibGVkKHBhY2s6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChwYWNrID09PSBcImVtb2ppXCIpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiAhdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGlzYWJsZWRQYWNrcy5oYXMocGFjayk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hQYWNrTmFtZXMoKSB7XG4gICAgdGhpcy5fY3V0b21zSWNvblBhY2tuYW1lcy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgWywgeyBwYWNrIH1dIG9mIHRoaXMuX2N1c3RvbUljb25zKSB7XG4gICAgICB0aGlzLl9jdXRvbXNJY29uUGFja25hbWVzLmFkZChwYWNrKTtcbiAgICB9XG4gIH1cbiAgY29uc3RydWN0b3IocHVibGljIHBsdWdpbjogSWNvblNDKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xvYWRlZCA9IGZhbHNlO1xuICBhc3luYyBsb2FkSWNvbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX2xvYWRlZCkge1xuICAgICAgdGhpcy5fZnVzZS5zZXRDb2xsZWN0aW9uKFtdKTtcbiAgICAgIHRoaXMuX2N1c3RvbUljb25zLmNsZWFyKCk7XG4gICAgICB0aGlzLl9jdXRvbXNJY29uUGFja25hbWVzLmNsZWFyKCk7XG4gICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgdGhpcy52YXVsdC5hZGFwdGVyLmV4aXN0cyh0aGlzLmN1c3RvbUljb25zRGlyKSkpIHtcbiAgICAgIGF3YWl0IHRoaXMudmF1bHQuYWRhcHRlci5ta2Rpcih0aGlzLmN1c3RvbUljb25zRGlyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaWNvbmxpc3QgPSBhd2FpdCB0aGlzLnZhdWx0LmFkYXB0ZXIubGlzdCh0aGlzLmN1c3RvbUljb25zRGlyKTtcblxuICAgIGxldCBpbmZvO1xuICAgIGNvbnN0IHF1ZXVlID0gaWNvbmxpc3QuZmlsZXMubWFwKGFzeW5jIChwYXRoKSA9PiB7XG4gICAgICBpZiAoIWV4dFBhdHRlcm4udGVzdChwYXRoKSkgcmV0dXJuO1xuICAgICAgY29uc3QgaWQgPSBiYXNlbmFtZShwYXRoKS5yZXBsYWNlKGV4dFBhdHRlcm4sIFwiXCIpO1xuICAgICAgY29uc3QgaWNvbiA9IEZpbGVJY29uRGF0YS5nZXREYXRhKGlkLCBwYXRoLCB0aGlzLnBsdWdpbik7XG4gICAgICBpZiAoIWljb24pIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiRmFpbGVkIHRvIGxvYWQgaWNvbiBkYXRhIChyYXcgdmFsdWU6ICVvKSBmb3IgaWQgJXMsIHNraXBwaW5nLi4uXCIsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBpZCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2N1c3RvbUljb25zLnNldChpZCwgaWNvbik7XG4gICAgICAgIHRoaXMuX2Z1c2UuYWRkKGljb24pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChxdWV1ZSkpIHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCBpY29uXCIsIHJlc3VsdC5yZWFzb24pO1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgIHRoaXMucmVmcmVzaFBhY2tOYW1lcygpO1xuICAgIHRoaXMudHJpZ2dlcihcImluaXRpYWxpemVkXCIsIHRoaXMucGx1Z2luLmFwaSk7XG4gIH1cbiAgYXN5bmMgYmFja3VwSWNvbnMocGFjaz86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB6aXAgPSBuZXcgSlNaaXAoKTtcbiAgICBjb25zdCBpY29ubGlzdCA9IGF3YWl0IHRoaXMudmF1bHQuYWRhcHRlci5saXN0KHRoaXMuY3VzdG9tSWNvbnNEaXIpO1xuICAgIGZvciAoY29uc3QgZmlsZXBhdGggb2YgaWNvbmxpc3QuZmlsZXMpIHtcbiAgICAgIGlmICghcGFjayB8fCBiYXNlbmFtZShmaWxlcGF0aCkuc3RhcnRzV2l0aChwYWNrICsgXCJfXCIpKSB7XG4gICAgICAgIHppcC5maWxlKGJhc2VuYW1lKGZpbGVwYXRoKSwgdGhpcy52YXVsdC5hZGFwdGVyLnJlYWRCaW5hcnkoZmlsZXBhdGgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYmFrRmlsZVBhdGggPSBgJHtwYWNrID8/IFwiY3VzdG9tLWljb25zXCJ9LnppcGA7XG4gICAgYXdhaXQgdGhpcy52YXVsdC5jcmVhdGVCaW5hcnkoXG4gICAgICBiYWtGaWxlUGF0aCxcbiAgICAgIGF3YWl0IHppcC5nZW5lcmF0ZUFzeW5jKHsgdHlwZTogXCJhcnJheWJ1ZmZlclwiIH0pLFxuICAgICk7XG4gICAgaWYgKFBsYXRmb3JtLmlzRGVza3RvcEFwcCkge1xuICAgICAgLy8gb3BlbiB2YXVsdCBkaXIgaW4gZXhwbG9yZXJcbiAgICAgIHRoaXMucGx1Z2luLmFwcC5vcGVuV2l0aERlZmF1bHRBcHAoXCJcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ldyBOb3RpY2UoXG4gICAgICAgIGBpY29ucyBoYXZlIGJlZW4gc2F2ZWQgdG8gJHtiYWtGaWxlUGF0aH0sIGAgK1xuICAgICAgICAgIFwiZW5hYmxlICdEZXRlY3QgYWxsIGZpbGUgZXh0ZW5zaW9uJyBpbiAnRmlsZXMgJiBMaW5rcycgdG8gdmlzaXQgaXRcIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW1wb3J0SWNvbnNGcm9tRmlsZUxpc3QobGlzdDogRmlsZUxpc3QsIHppcE5hbWVBc1BhY2sgPSBmYWxzZSkge1xuICAgIGxldCBxdWV1ZSA9IFtdIGFzIFByb21pc2U8c3RyaW5nPltdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZmlsZSA9IGxpc3RbaV07XG4gICAgICBpZiAoZmlsZS50eXBlICE9PSBcImFwcGxpY2F0aW9uL3ppcFwiKSBjb250aW51ZTtcbiAgICAgIHF1ZXVlLnB1c2godGhpcy5pbXBvcnRJY29ucyhmaWxlLCB6aXBOYW1lQXNQYWNrKSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQocXVldWUpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlc1xuICAgKiBAcGFyYW0gemlwTmFtZUFzUGFjayBpZiB0cnVlLCB1c2UgemlwIGZpbGVuYW1lIGFzIHBhY2sgbmFtZTsgb3RoZXJ3aXNlLCBnZXQgcGFjayBuYW1lIGZyb20gZWFjaCBpY29uJ3MgaWRcbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIGltcG9ydEljb25zKFxuICAgIGZpbGU6IEZpbGUgfCB7IG5hbWU6IHN0cmluZzsgZGF0YTogQXJyYXlCdWZmZXIgfSxcbiAgICB6aXBOYW1lQXNQYWNrOiBib29sZWFuLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBhY2tOYW1lRnJvbVppcCA9IGZpbGUubmFtZS5yZXBsYWNlKC9cXC56aXAkLywgXCJcIik7XG4gICAgbGV0IHppcDtcbiAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgIHppcCA9IGF3YWl0IEpTWmlwLmxvYWRBc3luYyhmaWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgemlwID0gYXdhaXQgSlNaaXAubG9hZEFzeW5jKGZpbGUuZGF0YSk7XG4gICAgfVxuICAgIGNvbnN0IHF1ZXVlID0gemlwLmZpbGUoaWNvbkZpbGVQYXR0ZXJuKS5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgIGxldCB7IG5hbWUgfSA9IGZpbGU7XG4gICAgICBpZiAoemlwTmFtZUFzUGFjayAmJiAhbmFtZS5zdGFydHNXaXRoKHBhY2tOYW1lRnJvbVppcCArIFwiX1wiKSlcbiAgICAgICAgbmFtZSA9IHBhY2tOYW1lRnJvbVppcCArIFwiX1wiICsgbmFtZTtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRBdmFpbGFibGVJZChuYW1lKTtcbiAgICAgIGNvbnN0IHdyaXRlVG8gPSBqb2luKHRoaXMuY3VzdG9tSWNvbnNEaXIsIGlkKTtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHdyaXRlVG8pKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChgaWNvbiAke2lkfSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcuLmApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy52YXVsdC5hZGFwdGVyLndyaXRlQmluYXJ5KFxuICAgICAgICB3cml0ZVRvLFxuICAgICAgICBhd2FpdCBmaWxlLmFzeW5jKFwiYXJyYXlidWZmZXJcIiksXG4gICAgICApO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH0pO1xuICAgIGNvbnN0IGFkZGVkSWNvbnMgPSAoYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHF1ZXVlKSkucmVkdWNlKFxuICAgICAgKGFyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGltcG9ydCBpY29uXCIsIHJlc3VsdC5yZWFzb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFyci5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICAgIH0sXG4gICAgICBbXSBhcyBzdHJpbmdbXSxcbiAgICApO1xuICAgIG5ldyBOb3RpY2UoYWRkZWRJY29ucy5sZW5ndGggKyBcIiBpY29ucyBpbXBvcnRlZFwiKTtcbiAgICByZXR1cm4gZmlsZS5uYW1lO1xuICB9XG5cbiAgYXN5bmMgYWRkRnJvbUZpbGVzKHBhY2s6IHN0cmluZywgZmlsZXM6IEZpbGVMaXN0KSB7XG4gICAgY29uc3QgaWNvbnMgPSBhd2FpdCBnZXRJY29uc0Zyb21GaWxlTGlzdChmaWxlcyk7XG4gICAgaWYgKCFpY29ucykge1xuICAgICAgbmV3IE5vdGljZShcIk5vIFNWRyBmaWxlIGZvdW5kIGluIGRyb3BwZWQgaXRlbXNcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKEJ1aWx0SW5JY29uUGFja25hbWVzLmluY2x1ZGVzKHBhY2spKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiZmFpbGVkIHRvIGFkZCBwYWNrOiBwYWNrIG5hbWUgJXMgcmVzZXJ2ZWRcIiwgcGFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHdyaXRlUXVldWUgPSBpY29ucy5yZWR1Y2UoKGFyciwgeyBuYW1lLCBleHQsIGRhdGEgfSkgPT4ge1xuICAgICAgbGV0IGlkID0gc2FuaXRpemVJZChgJHtwYWNrfV8ke25hbWV9YCk7XG4gICAgICBpZiAoIWlkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcImZhaWxlZCB0byBhZGQgaWNvbjogaWQgJXMgaW52YWxpZCwgc2tpcHBpbmcuLi5cIiwgaWQpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgICAgfVxuICAgICAgaWQgPSB0aGlzLmdldEF2YWlsYWJsZUlkKGlkKTtcbiAgICAgIGlmICh0aGlzLl9jdXN0b21JY29ucy5oYXMoaWQpKSB7XG4gICAgICAgIGFyci5wdXNoKFByb21pc2UucmVqZWN0KGBpY29uICR7aWR9IGFscmVhZHkgZXhpc3RzLCBza2lwcGluZy4uYCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgICAgfVxuICAgICAgYXJyLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCB0aGlzLmFkZEljb24oaWQsIGV4dCwgZGF0YSk7XG4gICAgICAgICAgICB0aGlzLnNldChcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIG5ldyBGaWxlSWNvbkRhdGEoaWQsIG5hbWUsIHBhY2ssIHBhdGgsIHRoaXMucGx1Z2luKSxcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSWNvbkZpbGVPcEVycm9yKFwiYWRkXCIsIGlkLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfSkoKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH0sIFtdIGFzIFByb21pc2U8c3RyaW5nPltdKTtcbiAgICBsZXQgYWRkZWRJZHMgPSBbXSBhcyBzdHJpbmdbXTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQod3JpdGVRdWV1ZSkpIHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBhZGQgaWNvbiwgZGV0YWlsczogXCIsIHJlc3VsdC5yZWFzb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkZWRJZHMucHVzaChyZXN1bHQudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hQYWNrTmFtZXMoKTtcbiAgICB0aGlzLnRyaWdnZXIoXCJjaGFuZ2VkXCIsIHRoaXMucGx1Z2luLmFwaSwgYWRkZWRJZHMpO1xuICAgIG5ldyBOb3RpY2UoYWRkZWRJZHMubGVuZ3RoLnRvU3RyaW5nKCkgKyBcIiBpY29ucyBhZGRlZFwiKTtcbiAgfVxuICBhc3luYyBkZWxldGVNdWx0aXBsZSguLi5pZHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fZnVzZS5yZW1vdmUoKGljb24pID0+IGlzRmlsZUljb25JbmZvKGljb24pICYmIGlkcy5pbmNsdWRlcyhpY29uLmlkKSk7XG4gICAgY29uc3QgcXVldWUgPSBpZHMubWFwKGFzeW5jIChpZCkgPT4ge1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuX2N1c3RvbUljb25zLmdldChpZCk7XG4gICAgICBpZiAoIWluZm8pXG4gICAgICAgIHRocm93IG5ldyBJY29uRmlsZU9wRXJyb3IoXG4gICAgICAgICAgXCJkZWxldGVcIixcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBcIk5vIGljb24gZm91bmQgaW4gX2N1c3RvbUljb25zXCIsXG4gICAgICAgICk7XG4gICAgICB0aGlzLl9jdXN0b21JY29ucy5kZWxldGUoaWQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVJY29uRmlsZShpZCwgaW5mby5leHQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEljb25GaWxlT3BFcnJvcihcImRlbGV0ZVwiLCBpZCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHF1ZXVlKSkge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHJlbW92ZSBpY29uIGZpbGUsIGRldGFpbHM6IFwiLCByZXN1bHQucmVhc29uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoYW5nZWQgfHwgKGNoYW5nZWQgPSB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgIHRoaXMucmVmcmVzaFBhY2tOYW1lcygpO1xuICAgICAgdGhpcy50cmlnZ2VyKFwiY2hhbmdlZFwiLCB0aGlzLnBsdWdpbi5hcGksIGlkcyk7XG4gICAgfVxuICB9XG4gIGFzeW5jIGZpbHRlcihcbiAgICBwcmVkaWNhdGU6IChrZXk6IHN0cmluZywgdmFsdWU6IE9taXQ8RmlsZUljb25EYXRhLCBcImlkXCI+KSA9PiBib29sZWFuLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBpZCAtIHBhdGggbWFwXG4gICAgbGV0IEljb25zVG9EZWxldGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgW2lkLCBkYXRhXSBvZiB0aGlzLl9jdXN0b21JY29ucykge1xuICAgICAgaWYgKCFwcmVkaWNhdGUoaWQsIGRhdGEpKSB7XG4gICAgICAgIHRoaXMuX2N1c3RvbUljb25zLmRlbGV0ZShpZCk7XG4gICAgICAgIEljb25zVG9EZWxldGUuc2V0KGlkLCBkYXRhLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9mdXNlLnJlbW92ZSgoaWNvbikgPT4gSWNvbnNUb0RlbGV0ZS5oYXMoaWNvbi5pZCkpO1xuICAgIGlmIChJY29uc1RvRGVsZXRlLnNpemUgPT09IDApIHJldHVybjtcbiAgICB0aGlzLnJlZnJlc2hQYWNrTmFtZXMoKTtcbiAgICB0aGlzLnRyaWdnZXIoXCJjaGFuZ2VkXCIsIHRoaXMucGx1Z2luLmFwaSwgWy4uLkljb25zVG9EZWxldGUua2V5cygpXSk7XG4gICAgY29uc3QgcXVldWUgPSBbLi4uSWNvbnNUb0RlbGV0ZS52YWx1ZXMoKV0ubWFwKGFzeW5jIChwYXRoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnZhdWx0LmFkYXB0ZXIucmVtb3ZlKHBhdGgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEljb25GaWxlT3BFcnJvcihcImRlbGV0ZVwiLCBiYXNlbmFtZShwYXRoKSwgZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChxdWV1ZSkpIHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byByZW1vdmUgaWNvbiBmaWxlLCBkZXRhaWxzOiBcIiwgcmVzdWx0LnJlYXNvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGFzeW5jIHJlbmFtZShpZDogc3RyaW5nLCBuZXdJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgaWYgKHRoaXMuaGFzSWNvbihuZXdJZCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZmFpbGVkIHRvIHJlbmFtZSBpY29uOiBpZCAlcyBhbHJlYWR5IGV4aXN0c1wiLCBuZXdJZCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbGV0IGluZm8gPSB0aGlzLl9jdXN0b21JY29ucy5nZXQoaWQpO1xuICAgIGlmICghaW5mbykge1xuICAgICAgY29uc29sZS5sb2coXCJmYWlsZWQgdG8gcmVuYW1lIGljb246IGlkICVzIG5vdCBmb3VuZCBpbiBjdXN0b20gaWNvbnNcIiwgaWQpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlbmFtZVRvID0gc2FuaXRpemVJZChuZXdJZCk7XG4gICAgaWYgKCFyZW5hbWVUbykge1xuICAgICAgY29uc29sZS5sb2coXCJmYWlsZWQgdG8gcmVuYW1lIGljb246IGlkICVzIGludmFsaWRcIiwgaWQpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBpbmZvLnBhdGggPSBhd2FpdCB0aGlzLnJlbmFtZUljb25GaWxlKGlkLCBpbmZvLmV4dCwgbmV3SWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgSWNvbkZpbGVPcEVycm9yKFwicmVuYW1lXCIsIGlkLCBlcnJvciwgbmV3SWQpO1xuICAgIH1cbiAgICB0aGlzLnNldChyZW5hbWVUbywgaW5mbywgZmFsc2UpO1xuICAgIHRoaXMuZGVsZXRlKGlkLCBmYWxzZSwgZmFsc2UpO1xuICAgIHRoaXMucmVmcmVzaFBhY2tOYW1lcygpO1xuICAgIHRoaXMudHJpZ2dlcihcImNoYW5nZWRcIiwgdGhpcy5wbHVnaW4uYXBpLCBbaWQsIG5ld0lkXSk7XG4gICAgcmV0dXJuIG5ld0lkO1xuICB9XG4gIGFzeW5jIHN0YXIoaWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IHRhcmdldElkID0gaWQucmVwbGFjZSgvX1xcZD8kLywgXCJcIik7XG4gICAgaWYgKHRhcmdldElkID09PSBpZCkge1xuICAgICAgY29uc29sZS5sb2coXCJmYWlsZWQgdG8gc3RhciBpY29uOiBubyBzdWZmaXggZm91bmQgZm9yIGlkICVzXCIsIGlkKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBpbmZvID0gdGhpcy5fY3VzdG9tSWNvbnMuZ2V0KGlkKTtcbiAgICBpZiAoIWluZm8pIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZmFpbGVkIHRvIHN0YXIgaWNvbjogaWQgJXMgbm90IGZvdW5kIGluIGN1c3RvbSBpY29uc1wiLCBpZCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzQnVpbHRJbih0YXJnZXRJZCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBcImZhaWxlZCB0byBzdGFyIGljb246IG5ldyBpZCAlcyBleGlzdHMgaW4gYnVpbHQtaW4gaWNvbnNcIixcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZXh0IH0gPSBpbmZvO1xuICAgICAgaWYgKHRoaXMuX2N1c3RvbUljb25zLmhhcyh0YXJnZXRJZCkpIHtcbiAgICAgICAgY29uc3QgdGVtcCA9IHRoaXMuX2N1c3RvbUljb25zLmdldCh0YXJnZXRJZCkgYXMgRmlsZUljb25EYXRhLFxuICAgICAgICAgIHsgZXh0OiB0YXJnZXRFeHQgfSA9IHRlbXA7XG4gICAgICAgIGF3YWl0IHRoaXMucmVuYW1lSWNvbkZpbGUodGFyZ2V0SWQsIHRhcmdldEV4dCwgdGFyZ2V0SWQgKyBcIl90ZW1wXCIpO1xuICAgICAgICBpbmZvLnBhdGggPSBhd2FpdCB0aGlzLnJlbmFtZUljb25GaWxlKGlkLCBleHQsIHRhcmdldElkKTtcbiAgICAgICAgdGhpcy5zZXQodGFyZ2V0SWQsIGluZm8sIGZhbHNlKTtcbiAgICAgICAgdGVtcC5wYXRoID0gYXdhaXQgdGhpcy5yZW5hbWVJY29uRmlsZShcbiAgICAgICAgICB0YXJnZXRJZCArIFwiX3RlbXBcIixcbiAgICAgICAgICB0YXJnZXRFeHQsXG4gICAgICAgICAgaWQsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0KGlkLCB0ZW1wLCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmZvLnBhdGggPSBhd2FpdCB0aGlzLnJlbmFtZUljb25GaWxlKGlkLCBleHQsIHRhcmdldElkKTtcbiAgICAgICAgdGhpcy5zZXQodGFyZ2V0SWQsIGluZm8sIGZhbHNlKTtcbiAgICAgICAgdGhpcy5kZWxldGUoaWQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIG5ldyBJY29uRmlsZU9wRXJyb3IoXCJyZW5hbWVcIiwgaWQsIGVycm9yLCB0YXJnZXRJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWZyZXNoUGFja05hbWVzKCk7XG4gICAgdGhpcy50cmlnZ2VyKFwiY2hhbmdlZFwiLCB0aGlzLnBsdWdpbi5hcGksIFtpZCwgdGFyZ2V0SWRdKTtcbiAgICByZXR1cm4gdGFyZ2V0SWQ7XG4gIH1cblxuICBwcml2YXRlIGdldEF2YWlsYWJsZUlkKGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5oYXNJY29uKGlkKSkgcmV0dXJuIGlkO1xuICAgIGxldCBpID0gMSxcbiAgICAgIG5ld0lkID0gYCR7aWR9XyR7aX1gO1xuICAgIHdoaWxlICh0aGlzLmhhc0ljb24obmV3SWQpKSB7XG4gICAgICBuZXdJZCA9IGAke2lkfV8keysraX1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7aWR9XyR7aX1gO1xuICB9XG5cbiAgLyoqIHNldCBpbmZvIGluIGRhdGFiYXNlLCBubyBmaWxlIGNoYW5nZXMgKi9cbiAgc2V0KGlkOiBzdHJpbmcsIGluZm86IEZpbGVJY29uRGF0YSwgcmVmcmVzaCA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY3VzdG9tSWNvbnMuZ2V0KGlkKSA9PT0gaW5mbykgcmV0dXJuO1xuICAgIHRoaXMuX2N1c3RvbUljb25zLnNldChpZCwgaW5mbyk7XG4gICAgdGhpcy5fZnVzZS5yZW1vdmUoKGljb24pID0+IGljb24uaWQgPT09IGlkKTtcbiAgICB0aGlzLl9mdXNlLmFkZChpbmZvKTtcbiAgICBpZiAocmVmcmVzaCkge1xuICAgICAgdGhpcy5yZWZyZXNoUGFja05hbWVzKCk7XG4gICAgICB0aGlzLnRyaWdnZXIoXCJjaGFuZ2VkXCIsIHRoaXMucGx1Z2luLmFwaSwgW2lkXSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcmVmcmVzaCA9IHRydWUsXG4gICAgZGVsZXRlRmlsZSA9IHRydWUsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLl9jdXN0b21JY29ucy5nZXQoaWQpO1xuICAgIGlmICghaW5mbykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkZWxldGVGaWxlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUljb25GaWxlKGlkLCBpbmZvLmV4dCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgSWNvbkZpbGVPcEVycm9yKFwiZGVsZXRlXCIsIGlkLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2N1c3RvbUljb25zLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5fZnVzZS5yZW1vdmUoKGljb24pID0+IGljb24uaWQgPT09IGlkKTtcbiAgICBpZiAocmVmcmVzaCkge1xuICAgICAgdGhpcy5yZWZyZXNoUGFja05hbWVzKCk7XG4gICAgICB0aGlzLnRyaWdnZXIoXCJjaGFuZ2VkXCIsIHRoaXMucGx1Z2luLmFwaSwgW2lkXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgYXN5bmMgY2xlYXIoKSB7XG4gICAgY29uc3QgcXVldWUgPSAoXG4gICAgICBhd2FpdCB0aGlzLnZhdWx0LmFkYXB0ZXIubGlzdCh0aGlzLmN1c3RvbUljb25zRGlyKVxuICAgICkuZmlsZXMubWFwKChwYXRoKSA9PiB0aGlzLnZhdWx0LmFkYXB0ZXIucmVtb3ZlKHBhdGgpKTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocXVldWUpKSB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gcmVtb3ZlIGljb24gZmlsZSwgZGV0YWlsczogXCIsIHJlc3VsdC5yZWFzb24pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9jdXN0b21JY29ucy5jbGVhcigpO1xuICAgIHRoaXMuX2Z1c2UucmVtb3ZlKChpZCkgPT4gIUJ1aWx0SW5JY29uSWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgdGhpcy5yZWZyZXNoUGFja05hbWVzKCk7XG4gICAgdGhpcy50cmlnZ2VyKFwiY2hhbmdlZFwiLCB0aGlzLnBsdWdpbi5hcGkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZnVzZSA9IG5ldyBGdXNlPEljb25JbmZvPihCdWlsdEluSWNvbklkcywge1xuICAgIGtleXM6IFtcIm5hbWVcIiwgXCJwYWNrXCJdLFxuICAgIGluY2x1ZGVTY29yZTogdHJ1ZSxcbiAgICAvLyBpZ25vcmVMb2NhdGlvbjogdHJ1ZSxcbiAgICBmaW5kQWxsTWF0Y2hlczogdHJ1ZSxcbiAgICB0aHJlc2hvbGQ6IDAuNSxcbiAgICBzaG91bGRTb3J0OiB0cnVlLFxuICAgIGluY2x1ZGVNYXRjaGVzOiB0cnVlLFxuICAgIHVzZUV4dGVuZGVkU2VhcmNoOiB0cnVlLFxuICB9KTtcbiAgc2VhcmNoKHF1ZXJ5OiBzdHJpbmdbXSwgcGFja3M/OiBzdHJpbmdbXSwgbGltaXQ/OiBudW1iZXIpIHtcbiAgICBsZXQgZXhwID0gcXVlcnkubWFwPEZ1c2UuRXhwcmVzc2lvbj4oKHMpID0+ICh7IG5hbWU6IHMgfSkpO1xuICAgIHBhY2tzID0gcGFja3MgPz8gdGhpcy5lbmFibGVkUGFja25hbWVzO1xuICAgIGV4cC5wdXNoKHsgJG9yOiBwYWNrcy5tYXAoKHApID0+ICh7IHBhY2s6IGA9JHtwfWAgfSkpIH0pO1xuICAgIHJldHVybiB0aGlzLl9mdXNlLnNlYXJjaCh7ICRhbmQ6IGV4cCB9LCB7IGxpbWl0OiBsaW1pdCA/PyAyMCB9KTtcbiAgfVxuICBnZXRBbGxJZHMocGFja3M/OiBzdHJpbmdbXSwgbGltaXQ/OiBudW1iZXIpIHtcbiAgICBsZXQgZXhwID0gKHBhY2tzID8/IHRoaXMuZW5hYmxlZFBhY2tuYW1lcykubWFwKChwKSA9PiAoe1xuICAgICAgcGFjazogYD0ke3B9YCxcbiAgICB9KSk7XG4gICAgcmV0dXJuIHRoaXMuX2Z1c2Uuc2VhcmNoKHsgJG9yOiBleHAgfSwgeyBsaW1pdDogbGltaXQgPz8gMjAgfSk7XG4gIH1cblxuICB0cmlnZ2VyKC4uLmFyZ3M6IFBNRXZlbnRzKTogdm9pZCB7XG4gICAgY29uc3QgW25hbWUsIC4uLnJlc3RdID0gYXJncztcbiAgICBzdXBlci50cmlnZ2VyKG5hbWUsIC4uLnJlc3QpO1xuICAgIHRoaXMucGx1Z2luLmFwcC52YXVsdC50cmlnZ2VyKGV2dFByZWZpeCArIG5hbWUsIC4uLnJlc3QpO1xuICB9XG4gIG9uKC4uLmFyZ3M6IE9uQXJnczxQTUV2ZW50cz4pOiBFdmVudFJlZiB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHJldHVybiBzdXBlci5vbiguLi5hcmdzKTtcbiAgfVxufVxuXG50eXBlIE9uQXJnczxUPiA9IFQgZXh0ZW5kcyBbaW5mZXIgQSwgLi4uaW5mZXIgQl1cbiAgPyBBIGV4dGVuZHMgc3RyaW5nXG4gICAgPyBbbmFtZTogQSwgY2FsbGJhY2s6ICguLi5hcmdzOiBCKSA9PiBhbnldXG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG5jbGFzcyBJY29uRmlsZU9wRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG9wOiBzdHJpbmcsIGlkOiBzdHJpbmcsIHNyY0VycjogYW55LCBuZXdJZD86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgYEVycm9yIHdoaWxlICR7b3B9IG9uICR7aWR9JHtuZXdJZCA/IFwiPT5cIiArIG5ld0lkIDogXCJcIn06ICR7XG4gICAgICAgIHNyY0VyciBpbnN0YW5jZW9mIEVycm9yID8gYCR7c3JjRXJyLm5hbWV9OiAke3NyY0Vyci5tZXNzYWdlfWAgOiBzcmNFcnJcbiAgICAgIH1gLFxuICAgICk7XG4gICAgY29uc29sZS5lcnJvcihgJHtvcH0gb24gJHtpZH0ke25ld0lkID8gXCI9PlwiICsgbmV3SWQgOiBcIlwifWAsIHNyY0Vycik7XG4gICAgdGhpcy5uYW1lID0gXCJTYXZlSWNvbkVycm9yXCI7XG4gIH1cbn1cbiIsICIvKipcbiAqIEZ1c2UuanMgdjYuNi4yIC0gTGlnaHR3ZWlnaHQgZnV6enktc2VhcmNoIChodHRwOi8vZnVzZWpzLmlvKVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMiBLaXJvIFJpc2sgKGh0dHA6Ly9raXJvLm1lKVxuICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wXG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKi9cblxuZnVuY3Rpb24gaXNBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gIUFycmF5LmlzQXJyYXlcbiAgICA/IGdldFRhZyh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XSdcbiAgICA6IEFycmF5LmlzQXJyYXkodmFsdWUpXG59XG5cbi8vIEFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9tYXN0ZXIvLmludGVybmFsL2Jhc2VUb1N0cmluZy5qc1xuY29uc3QgSU5GSU5JVFkgPSAxIC8gMDtcbmZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAvLyBFeGl0IGVhcmx5IGZvciBzdHJpbmdzIHRvIGF2b2lkIGEgcGVyZm9ybWFuY2UgaGl0IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbiAgbGV0IHJlc3VsdCA9IHZhbHVlICsgJyc7XG4gIHJldHVybiByZXN1bHQgPT0gJzAnICYmIDEgLyB2YWx1ZSA9PSAtSU5GSU5JVFkgPyAnLTAnIDogcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBiYXNlVG9TdHJpbmcodmFsdWUpXG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInXG59XG5cbi8vIEFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9tYXN0ZXIvaXNCb29sZWFuLmpzXG5mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSA9PT0gdHJ1ZSB8fFxuICAgIHZhbHVlID09PSBmYWxzZSB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gJ1tvYmplY3QgQm9vbGVhbl0nKVxuICApXG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG59XG5cbi8vIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLlxuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdCh2YWx1ZSkgJiYgdmFsdWUgIT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsXG59XG5cbmZ1bmN0aW9uIGlzQmxhbmsodmFsdWUpIHtcbiAgcmV0dXJuICF2YWx1ZS50cmltKCkubGVuZ3RoXG59XG5cbi8vIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbi8vIEFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9tYXN0ZXIvLmludGVybmFsL2dldFRhZy5qc1xuZnVuY3Rpb24gZ2V0VGFnKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsXG4gICAgPyB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/ICdbb2JqZWN0IFVuZGVmaW5lZF0nXG4gICAgICA6ICdbb2JqZWN0IE51bGxdJ1xuICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKVxufVxuXG5jb25zdCBFWFRFTkRFRF9TRUFSQ0hfVU5BVkFJTEFCTEUgPSAnRXh0ZW5kZWQgc2VhcmNoIGlzIG5vdCBhdmFpbGFibGUnO1xuXG5jb25zdCBJTkNPUlJFQ1RfSU5ERVhfVFlQRSA9IFwiSW5jb3JyZWN0ICdpbmRleCcgdHlwZVwiO1xuXG5jb25zdCBMT0dJQ0FMX1NFQVJDSF9JTlZBTElEX1FVRVJZX0ZPUl9LRVkgPSAoa2V5KSA9PlxuICBgSW52YWxpZCB2YWx1ZSBmb3Iga2V5ICR7a2V5fWA7XG5cbmNvbnN0IFBBVFRFUk5fTEVOR1RIX1RPT19MQVJHRSA9IChtYXgpID0+XG4gIGBQYXR0ZXJuIGxlbmd0aCBleGNlZWRzIG1heCBvZiAke21heH0uYDtcblxuY29uc3QgTUlTU0lOR19LRVlfUFJPUEVSVFkgPSAobmFtZSkgPT4gYE1pc3NpbmcgJHtuYW1lfSBwcm9wZXJ0eSBpbiBrZXlgO1xuXG5jb25zdCBJTlZBTElEX0tFWV9XRUlHSFRfVkFMVUUgPSAoa2V5KSA9PlxuICBgUHJvcGVydHkgJ3dlaWdodCcgaW4ga2V5ICcke2tleX0nIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyYDtcblxuY29uc3QgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuY2xhc3MgS2V5U3RvcmUge1xuICBjb25zdHJ1Y3RvcihrZXlzKSB7XG4gICAgdGhpcy5fa2V5cyA9IFtdO1xuICAgIHRoaXMuX2tleU1hcCA9IHt9O1xuXG4gICAgbGV0IHRvdGFsV2VpZ2h0ID0gMDtcblxuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBsZXQgb2JqID0gY3JlYXRlS2V5KGtleSk7XG5cbiAgICAgIHRvdGFsV2VpZ2h0ICs9IG9iai53ZWlnaHQ7XG5cbiAgICAgIHRoaXMuX2tleXMucHVzaChvYmopO1xuICAgICAgdGhpcy5fa2V5TWFwW29iai5pZF0gPSBvYmo7XG5cbiAgICAgIHRvdGFsV2VpZ2h0ICs9IG9iai53ZWlnaHQ7XG4gICAgfSk7XG5cbiAgICAvLyBOb3JtYWxpemUgd2VpZ2h0cyBzbyB0aGF0IHRoZWlyIHN1bSBpcyBlcXVhbCB0byAxXG4gICAgdGhpcy5fa2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGtleS53ZWlnaHQgLz0gdG90YWxXZWlnaHQ7XG4gICAgfSk7XG4gIH1cbiAgZ2V0KGtleUlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2tleU1hcFtrZXlJZF1cbiAgfVxuICBrZXlzKCkge1xuICAgIHJldHVybiB0aGlzLl9rZXlzXG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLl9rZXlzKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleShrZXkpIHtcbiAgbGV0IHBhdGggPSBudWxsO1xuICBsZXQgaWQgPSBudWxsO1xuICBsZXQgc3JjID0gbnVsbDtcbiAgbGV0IHdlaWdodCA9IDE7XG4gIGxldCBnZXRGbiA9IG51bGw7XG5cbiAgaWYgKGlzU3RyaW5nKGtleSkgfHwgaXNBcnJheShrZXkpKSB7XG4gICAgc3JjID0ga2V5O1xuICAgIHBhdGggPSBjcmVhdGVLZXlQYXRoKGtleSk7XG4gICAgaWQgPSBjcmVhdGVLZXlJZChrZXkpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaGFzT3duLmNhbGwoa2V5LCAnbmFtZScpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoTUlTU0lOR19LRVlfUFJPUEVSVFkoJ25hbWUnKSlcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lID0ga2V5Lm5hbWU7XG4gICAgc3JjID0gbmFtZTtcblxuICAgIGlmIChoYXNPd24uY2FsbChrZXksICd3ZWlnaHQnKSkge1xuICAgICAgd2VpZ2h0ID0ga2V5LndlaWdodDtcblxuICAgICAgaWYgKHdlaWdodCA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihJTlZBTElEX0tFWV9XRUlHSFRfVkFMVUUobmFtZSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcGF0aCA9IGNyZWF0ZUtleVBhdGgobmFtZSk7XG4gICAgaWQgPSBjcmVhdGVLZXlJZChuYW1lKTtcbiAgICBnZXRGbiA9IGtleS5nZXRGbjtcbiAgfVxuXG4gIHJldHVybiB7IHBhdGgsIGlkLCB3ZWlnaHQsIHNyYywgZ2V0Rm4gfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVLZXlQYXRoKGtleSkge1xuICByZXR1cm4gaXNBcnJheShrZXkpID8ga2V5IDoga2V5LnNwbGl0KCcuJylcbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5SWQoa2V5KSB7XG4gIHJldHVybiBpc0FycmF5KGtleSkgPyBrZXkuam9pbignLicpIDoga2V5XG59XG5cbmZ1bmN0aW9uIGdldChvYmosIHBhdGgpIHtcbiAgbGV0IGxpc3QgPSBbXTtcbiAgbGV0IGFyciA9IGZhbHNlO1xuXG4gIGNvbnN0IGRlZXBHZXQgPSAob2JqLCBwYXRoLCBpbmRleCkgPT4ge1xuICAgIGlmICghaXNEZWZpbmVkKG9iaikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXBhdGhbaW5kZXhdKSB7XG4gICAgICAvLyBJZiB0aGVyZSdzIG5vIHBhdGggbGVmdCwgd2UndmUgYXJyaXZlZCBhdCB0aGUgb2JqZWN0IHdlIGNhcmUgYWJvdXQuXG4gICAgICBsaXN0LnB1c2gob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGtleSA9IHBhdGhbaW5kZXhdO1xuXG4gICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuXG4gICAgICBpZiAoIWlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIElmIHdlJ3JlIGF0IHRoZSBsYXN0IHZhbHVlIGluIHRoZSBwYXRoLCBhbmQgaWYgaXQncyBhIHN0cmluZy9udW1iZXIvYm9vbCxcbiAgICAgIC8vIGFkZCBpdCB0byB0aGUgbGlzdFxuICAgICAgaWYgKFxuICAgICAgICBpbmRleCA9PT0gcGF0aC5sZW5ndGggLSAxICYmXG4gICAgICAgIChpc1N0cmluZyh2YWx1ZSkgfHwgaXNOdW1iZXIodmFsdWUpIHx8IGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgICApIHtcbiAgICAgICAgbGlzdC5wdXNoKHRvU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGFyciA9IHRydWU7XG4gICAgICAgIC8vIFNlYXJjaCBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICBkZWVwR2V0KHZhbHVlW2ldLCBwYXRoLCBpbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhdGgubGVuZ3RoKSB7XG4gICAgICAgIC8vIEFuIG9iamVjdC4gUmVjdXJzZSBmdXJ0aGVyLlxuICAgICAgICBkZWVwR2V0KHZhbHVlLCBwYXRoLCBpbmRleCArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoc2luY2UgcGF0aCB1c2VkIHRvIGJlIGEgc3RyaW5nKVxuICBkZWVwR2V0KG9iaiwgaXNTdHJpbmcocGF0aCkgPyBwYXRoLnNwbGl0KCcuJykgOiBwYXRoLCAwKTtcblxuICByZXR1cm4gYXJyID8gbGlzdCA6IGxpc3RbMF1cbn1cblxuY29uc3QgTWF0Y2hPcHRpb25zID0ge1xuICAvLyBXaGV0aGVyIHRoZSBtYXRjaGVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0IHNldC4gV2hlbiBgdHJ1ZWAsIGVhY2ggcmVjb3JkIGluIHRoZSByZXN1bHRcbiAgLy8gc2V0IHdpbGwgaW5jbHVkZSB0aGUgaW5kaWNlcyBvZiB0aGUgbWF0Y2hlZCBjaGFyYWN0ZXJzLlxuICAvLyBUaGVzZSBjYW4gY29uc2VxdWVudGx5IGJlIHVzZWQgZm9yIGhpZ2hsaWdodGluZyBwdXJwb3Nlcy5cbiAgaW5jbHVkZU1hdGNoZXM6IGZhbHNlLFxuICAvLyBXaGVuIGB0cnVlYCwgdGhlIG1hdGNoaW5nIGZ1bmN0aW9uIHdpbGwgY29udGludWUgdG8gdGhlIGVuZCBvZiBhIHNlYXJjaCBwYXR0ZXJuIGV2ZW4gaWZcbiAgLy8gYSBwZXJmZWN0IG1hdGNoIGhhcyBhbHJlYWR5IGJlZW4gbG9jYXRlZCBpbiB0aGUgc3RyaW5nLlxuICBmaW5kQWxsTWF0Y2hlczogZmFsc2UsXG4gIC8vIE1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBtdXN0IGJlIG1hdGNoZWQgYmVmb3JlIGEgcmVzdWx0IGlzIGNvbnNpZGVyZWQgYSBtYXRjaFxuICBtaW5NYXRjaENoYXJMZW5ndGg6IDFcbn07XG5cbmNvbnN0IEJhc2ljT3B0aW9ucyA9IHtcbiAgLy8gV2hlbiBgdHJ1ZWAsIHRoZSBhbGdvcml0aG0gY29udGludWVzIHNlYXJjaGluZyB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCBldmVuIGlmIGEgcGVyZmVjdFxuICAvLyBtYXRjaCBpcyBmb3VuZCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgc2FtZSBpbnB1dC5cbiAgaXNDYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgLy8gV2hlbiB0cnVlLCB0aGUgbWF0Y2hpbmcgZnVuY3Rpb24gd2lsbCBjb250aW51ZSB0byB0aGUgZW5kIG9mIGEgc2VhcmNoIHBhdHRlcm4gZXZlbiBpZlxuICBpbmNsdWRlU2NvcmU6IGZhbHNlLFxuICAvLyBMaXN0IG9mIHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIHNlYXJjaGVkLiBUaGlzIGFsc28gc3VwcG9ydHMgbmVzdGVkIHByb3BlcnRpZXMuXG4gIGtleXM6IFtdLFxuICAvLyBXaGV0aGVyIHRvIHNvcnQgdGhlIHJlc3VsdCBsaXN0LCBieSBzY29yZVxuICBzaG91bGRTb3J0OiB0cnVlLFxuICAvLyBEZWZhdWx0IHNvcnQgZnVuY3Rpb246IHNvcnQgYnkgYXNjZW5kaW5nIHNjb3JlLCBhc2NlbmRpbmcgaW5kZXhcbiAgc29ydEZuOiAoYSwgYikgPT5cbiAgICBhLnNjb3JlID09PSBiLnNjb3JlID8gKGEuaWR4IDwgYi5pZHggPyAtMSA6IDEpIDogYS5zY29yZSA8IGIuc2NvcmUgPyAtMSA6IDFcbn07XG5cbmNvbnN0IEZ1enp5T3B0aW9ucyA9IHtcbiAgLy8gQXBwcm94aW1hdGVseSB3aGVyZSBpbiB0aGUgdGV4dCBpcyB0aGUgcGF0dGVybiBleHBlY3RlZCB0byBiZSBmb3VuZD9cbiAgbG9jYXRpb246IDAsXG4gIC8vIEF0IHdoYXQgcG9pbnQgZG9lcyB0aGUgbWF0Y2ggYWxnb3JpdGhtIGdpdmUgdXAuIEEgdGhyZXNob2xkIG9mICcwLjAnIHJlcXVpcmVzIGEgcGVyZmVjdCBtYXRjaFxuICAvLyAob2YgYm90aCBsZXR0ZXJzIGFuZCBsb2NhdGlvbiksIGEgdGhyZXNob2xkIG9mICcxLjAnIHdvdWxkIG1hdGNoIGFueXRoaW5nLlxuICB0aHJlc2hvbGQ6IDAuNixcbiAgLy8gRGV0ZXJtaW5lcyBob3cgY2xvc2UgdGhlIG1hdGNoIG11c3QgYmUgdG8gdGhlIGZ1enp5IGxvY2F0aW9uIChzcGVjaWZpZWQgYWJvdmUpLlxuICAvLyBBbiBleGFjdCBsZXR0ZXIgbWF0Y2ggd2hpY2ggaXMgJ2Rpc3RhbmNlJyBjaGFyYWN0ZXJzIGF3YXkgZnJvbSB0aGUgZnV6enkgbG9jYXRpb25cbiAgLy8gd291bGQgc2NvcmUgYXMgYSBjb21wbGV0ZSBtaXNtYXRjaC4gQSBkaXN0YW5jZSBvZiAnMCcgcmVxdWlyZXMgdGhlIG1hdGNoIGJlIGF0XG4gIC8vIHRoZSBleGFjdCBsb2NhdGlvbiBzcGVjaWZpZWQsIGEgdGhyZXNob2xkIG9mICcxMDAwJyB3b3VsZCByZXF1aXJlIGEgcGVyZmVjdCBtYXRjaFxuICAvLyB0byBiZSB3aXRoaW4gODAwIGNoYXJhY3RlcnMgb2YgdGhlIGZ1enp5IGxvY2F0aW9uIHRvIGJlIGZvdW5kIHVzaW5nIGEgMC44IHRocmVzaG9sZC5cbiAgZGlzdGFuY2U6IDEwMFxufTtcblxuY29uc3QgQWR2YW5jZWRPcHRpb25zID0ge1xuICAvLyBXaGVuIGB0cnVlYCwgaXQgZW5hYmxlcyB0aGUgdXNlIG9mIHVuaXgtbGlrZSBzZWFyY2ggY29tbWFuZHNcbiAgdXNlRXh0ZW5kZWRTZWFyY2g6IGZhbHNlLFxuICAvLyBUaGUgZ2V0IGZ1bmN0aW9uIHRvIHVzZSB3aGVuIGZldGNoaW5nIGFuIG9iamVjdCdzIHByb3BlcnRpZXMuXG4gIC8vIFRoZSBkZWZhdWx0IHdpbGwgc2VhcmNoIG5lc3RlZCBwYXRocyAqaWUgZm9vLmJhci5iYXoqXG4gIGdldEZuOiBnZXQsXG4gIC8vIFdoZW4gYHRydWVgLCBzZWFyY2ggd2lsbCBpZ25vcmUgYGxvY2F0aW9uYCBhbmQgYGRpc3RhbmNlYCwgc28gaXQgd29uJ3QgbWF0dGVyXG4gIC8vIHdoZXJlIGluIHRoZSBzdHJpbmcgdGhlIHBhdHRlcm4gYXBwZWFycy5cbiAgLy8gTW9yZSBpbmZvOiBodHRwczovL2Z1c2Vqcy5pby9jb25jZXB0cy9zY29yaW5nLXRoZW9yeS5odG1sI2Z1enppbmVzcy1zY29yZVxuICBpZ25vcmVMb2NhdGlvbjogZmFsc2UsXG4gIC8vIFdoZW4gYHRydWVgLCB0aGUgY2FsY3VsYXRpb24gZm9yIHRoZSByZWxldmFuY2Ugc2NvcmUgKHVzZWQgZm9yIHNvcnRpbmcpIHdpbGxcbiAgLy8gaWdub3JlIHRoZSBmaWVsZC1sZW5ndGggbm9ybS5cbiAgLy8gTW9yZSBpbmZvOiBodHRwczovL2Z1c2Vqcy5pby9jb25jZXB0cy9zY29yaW5nLXRoZW9yeS5odG1sI2ZpZWxkLWxlbmd0aC1ub3JtXG4gIGlnbm9yZUZpZWxkTm9ybTogZmFsc2UsXG4gIC8vIFRoZSB3ZWlnaHQgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIGZpZWxkIGxlbmd0aCBub3JtIGVmZmVjdHMgc2NvcmluZy5cbiAgZmllbGROb3JtV2VpZ2h0OiAxXG59O1xuXG52YXIgQ29uZmlnID0ge1xuICAuLi5CYXNpY09wdGlvbnMsXG4gIC4uLk1hdGNoT3B0aW9ucyxcbiAgLi4uRnV6enlPcHRpb25zLFxuICAuLi5BZHZhbmNlZE9wdGlvbnNcbn07XG5cbmNvbnN0IFNQQUNFID0gL1teIF0rL2c7XG5cbi8vIEZpZWxkLWxlbmd0aCBub3JtOiB0aGUgc2hvcnRlciB0aGUgZmllbGQsIHRoZSBoaWdoZXIgdGhlIHdlaWdodC5cbi8vIFNldCB0byAzIGRlY2ltYWxzIHRvIHJlZHVjZSBpbmRleCBzaXplLlxuZnVuY3Rpb24gbm9ybSh3ZWlnaHQgPSAxLCBtYW50aXNzYSA9IDMpIHtcbiAgY29uc3QgY2FjaGUgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG0gPSBNYXRoLnBvdygxMCwgbWFudGlzc2EpO1xuXG4gIHJldHVybiB7XG4gICAgZ2V0KHZhbHVlKSB7XG4gICAgICBjb25zdCBudW1Ub2tlbnMgPSB2YWx1ZS5tYXRjaChTUEFDRSkubGVuZ3RoO1xuXG4gICAgICBpZiAoY2FjaGUuaGFzKG51bVRva2VucykpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlLmdldChudW1Ub2tlbnMpXG4gICAgICB9XG5cbiAgICAgIC8vIERlZmF1bHQgZnVuY3Rpb24gaXMgMS9zcXJ0KHgpLCB3ZWlnaHQgbWFrZXMgdGhhdCB2YXJpYWJsZVxuICAgICAgY29uc3Qgbm9ybSA9IDEgLyBNYXRoLnBvdyhudW1Ub2tlbnMsIDAuNSAqIHdlaWdodCk7XG5cbiAgICAgIC8vIEluIHBsYWNlIG9mIGB0b0ZpeGVkKG1hbnRpc3NhKWAsIGZvciBmYXN0ZXIgY29tcHV0YXRpb25cbiAgICAgIGNvbnN0IG4gPSBwYXJzZUZsb2F0KE1hdGgucm91bmQobm9ybSAqIG0pIC8gbSk7XG5cbiAgICAgIGNhY2hlLnNldChudW1Ub2tlbnMsIG4pO1xuXG4gICAgICByZXR1cm4gblxuICAgIH0sXG4gICAgY2xlYXIoKSB7XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBGdXNlSW5kZXgge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgZ2V0Rm4gPSBDb25maWcuZ2V0Rm4sXG4gICAgZmllbGROb3JtV2VpZ2h0ID0gQ29uZmlnLmZpZWxkTm9ybVdlaWdodFxuICB9ID0ge30pIHtcbiAgICB0aGlzLm5vcm0gPSBub3JtKGZpZWxkTm9ybVdlaWdodCwgMyk7XG4gICAgdGhpcy5nZXRGbiA9IGdldEZuO1xuICAgIHRoaXMuaXNDcmVhdGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLnNldEluZGV4UmVjb3JkcygpO1xuICB9XG4gIHNldFNvdXJjZXMoZG9jcyA9IFtdKSB7XG4gICAgdGhpcy5kb2NzID0gZG9jcztcbiAgfVxuICBzZXRJbmRleFJlY29yZHMocmVjb3JkcyA9IFtdKSB7XG4gICAgdGhpcy5yZWNvcmRzID0gcmVjb3JkcztcbiAgfVxuICBzZXRLZXlzKGtleXMgPSBbXSkge1xuICAgIHRoaXMua2V5cyA9IGtleXM7XG4gICAgdGhpcy5fa2V5c01hcCA9IHt9O1xuICAgIGtleXMuZm9yRWFjaCgoa2V5LCBpZHgpID0+IHtcbiAgICAgIHRoaXMuX2tleXNNYXBba2V5LmlkXSA9IGlkeDtcbiAgICB9KTtcbiAgfVxuICBjcmVhdGUoKSB7XG4gICAgaWYgKHRoaXMuaXNDcmVhdGVkIHx8ICF0aGlzLmRvY3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmlzQ3JlYXRlZCA9IHRydWU7XG5cbiAgICAvLyBMaXN0IGlzIEFycmF5PFN0cmluZz5cbiAgICBpZiAoaXNTdHJpbmcodGhpcy5kb2NzWzBdKSkge1xuICAgICAgdGhpcy5kb2NzLmZvckVhY2goKGRvYywgZG9jSW5kZXgpID0+IHtcbiAgICAgICAgdGhpcy5fYWRkU3RyaW5nKGRvYywgZG9jSW5kZXgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExpc3QgaXMgQXJyYXk8T2JqZWN0PlxuICAgICAgdGhpcy5kb2NzLmZvckVhY2goKGRvYywgZG9jSW5kZXgpID0+IHtcbiAgICAgICAgdGhpcy5fYWRkT2JqZWN0KGRvYywgZG9jSW5kZXgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5ub3JtLmNsZWFyKCk7XG4gIH1cbiAgLy8gQWRkcyBhIGRvYyB0byB0aGUgZW5kIG9mIHRoZSBpbmRleFxuICBhZGQoZG9jKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5zaXplKCk7XG5cbiAgICBpZiAoaXNTdHJpbmcoZG9jKSkge1xuICAgICAgdGhpcy5fYWRkU3RyaW5nKGRvYywgaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYWRkT2JqZWN0KGRvYywgaWR4KTtcbiAgICB9XG4gIH1cbiAgLy8gUmVtb3ZlcyB0aGUgZG9jIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhlIGluZGV4XG4gIHJlbW92ZUF0KGlkeCkge1xuICAgIHRoaXMucmVjb3Jkcy5zcGxpY2UoaWR4LCAxKTtcblxuICAgIC8vIENoYW5nZSByZWYgaW5kZXggb2YgZXZlcnkgc3Vic3F1ZW50IGRvY1xuICAgIGZvciAobGV0IGkgPSBpZHgsIGxlbiA9IHRoaXMuc2l6ZSgpOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIHRoaXMucmVjb3Jkc1tpXS5pIC09IDE7XG4gICAgfVxuICB9XG4gIGdldFZhbHVlRm9ySXRlbUF0S2V5SWQoaXRlbSwga2V5SWQpIHtcbiAgICByZXR1cm4gaXRlbVt0aGlzLl9rZXlzTWFwW2tleUlkXV1cbiAgfVxuICBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnJlY29yZHMubGVuZ3RoXG4gIH1cbiAgX2FkZFN0cmluZyhkb2MsIGRvY0luZGV4KSB7XG4gICAgaWYgKCFpc0RlZmluZWQoZG9jKSB8fCBpc0JsYW5rKGRvYykpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCByZWNvcmQgPSB7XG4gICAgICB2OiBkb2MsXG4gICAgICBpOiBkb2NJbmRleCxcbiAgICAgIG46IHRoaXMubm9ybS5nZXQoZG9jKVxuICAgIH07XG5cbiAgICB0aGlzLnJlY29yZHMucHVzaChyZWNvcmQpO1xuICB9XG4gIF9hZGRPYmplY3QoZG9jLCBkb2NJbmRleCkge1xuICAgIGxldCByZWNvcmQgPSB7IGk6IGRvY0luZGV4LCAkOiB7fSB9O1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGV2ZXJ5IGtleSAoaS5lLCBwYXRoKSwgYW5kIGZldGNoIHRoZSB2YWx1ZSBhdCB0aGF0IGtleVxuICAgIHRoaXMua2V5cy5mb3JFYWNoKChrZXksIGtleUluZGV4KSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBrZXkuZ2V0Rm4gPyBrZXkuZ2V0Rm4oZG9jKSA6IHRoaXMuZ2V0Rm4oZG9jLCBrZXkucGF0aCk7XG5cbiAgICAgIGlmICghaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGxldCBzdWJSZWNvcmRzID0gW107XG4gICAgICAgIGNvbnN0IHN0YWNrID0gW3sgbmVzdGVkQXJySW5kZXg6IC0xLCB2YWx1ZSB9XTtcblxuICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgeyBuZXN0ZWRBcnJJbmRleCwgdmFsdWUgfSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgICAgaWYgKCFpc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkgJiYgIWlzQmxhbmsodmFsdWUpKSB7XG4gICAgICAgICAgICBsZXQgc3ViUmVjb3JkID0ge1xuICAgICAgICAgICAgICB2OiB2YWx1ZSxcbiAgICAgICAgICAgICAgaTogbmVzdGVkQXJySW5kZXgsXG4gICAgICAgICAgICAgIG46IHRoaXMubm9ybS5nZXQodmFsdWUpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzdWJSZWNvcmRzLnB1c2goc3ViUmVjb3JkKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKChpdGVtLCBrKSA9PiB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICAgIG5lc3RlZEFyckluZGV4OiBrLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIDtcbiAgICAgICAgfVxuICAgICAgICByZWNvcmQuJFtrZXlJbmRleF0gPSBzdWJSZWNvcmRzO1xuICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyh2YWx1ZSkgJiYgIWlzQmxhbmsodmFsdWUpKSB7XG4gICAgICAgIGxldCBzdWJSZWNvcmQgPSB7XG4gICAgICAgICAgdjogdmFsdWUsXG4gICAgICAgICAgbjogdGhpcy5ub3JtLmdldCh2YWx1ZSlcbiAgICAgICAgfTtcblxuICAgICAgICByZWNvcmQuJFtrZXlJbmRleF0gPSBzdWJSZWNvcmQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlY29yZHMucHVzaChyZWNvcmQpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5czogdGhpcy5rZXlzLFxuICAgICAgcmVjb3JkczogdGhpcy5yZWNvcmRzXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUluZGV4KFxuICBrZXlzLFxuICBkb2NzLFxuICB7IGdldEZuID0gQ29uZmlnLmdldEZuLCBmaWVsZE5vcm1XZWlnaHQgPSBDb25maWcuZmllbGROb3JtV2VpZ2h0IH0gPSB7fVxuKSB7XG4gIGNvbnN0IG15SW5kZXggPSBuZXcgRnVzZUluZGV4KHsgZ2V0Rm4sIGZpZWxkTm9ybVdlaWdodCB9KTtcbiAgbXlJbmRleC5zZXRLZXlzKGtleXMubWFwKGNyZWF0ZUtleSkpO1xuICBteUluZGV4LnNldFNvdXJjZXMoZG9jcyk7XG4gIG15SW5kZXguY3JlYXRlKCk7XG4gIHJldHVybiBteUluZGV4XG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5kZXgoXG4gIGRhdGEsXG4gIHsgZ2V0Rm4gPSBDb25maWcuZ2V0Rm4sIGZpZWxkTm9ybVdlaWdodCA9IENvbmZpZy5maWVsZE5vcm1XZWlnaHQgfSA9IHt9XG4pIHtcbiAgY29uc3QgeyBrZXlzLCByZWNvcmRzIH0gPSBkYXRhO1xuICBjb25zdCBteUluZGV4ID0gbmV3IEZ1c2VJbmRleCh7IGdldEZuLCBmaWVsZE5vcm1XZWlnaHQgfSk7XG4gIG15SW5kZXguc2V0S2V5cyhrZXlzKTtcbiAgbXlJbmRleC5zZXRJbmRleFJlY29yZHMocmVjb3Jkcyk7XG4gIHJldHVybiBteUluZGV4XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTY29yZSQxKFxuICBwYXR0ZXJuLFxuICB7XG4gICAgZXJyb3JzID0gMCxcbiAgICBjdXJyZW50TG9jYXRpb24gPSAwLFxuICAgIGV4cGVjdGVkTG9jYXRpb24gPSAwLFxuICAgIGRpc3RhbmNlID0gQ29uZmlnLmRpc3RhbmNlLFxuICAgIGlnbm9yZUxvY2F0aW9uID0gQ29uZmlnLmlnbm9yZUxvY2F0aW9uXG4gIH0gPSB7fVxuKSB7XG4gIGNvbnN0IGFjY3VyYWN5ID0gZXJyb3JzIC8gcGF0dGVybi5sZW5ndGg7XG5cbiAgaWYgKGlnbm9yZUxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIGFjY3VyYWN5XG4gIH1cblxuICBjb25zdCBwcm94aW1pdHkgPSBNYXRoLmFicyhleHBlY3RlZExvY2F0aW9uIC0gY3VycmVudExvY2F0aW9uKTtcblxuICBpZiAoIWRpc3RhbmNlKSB7XG4gICAgLy8gRG9kZ2UgZGl2aWRlIGJ5IHplcm8gZXJyb3IuXG4gICAgcmV0dXJuIHByb3hpbWl0eSA/IDEuMCA6IGFjY3VyYWN5XG4gIH1cblxuICByZXR1cm4gYWNjdXJhY3kgKyBwcm94aW1pdHkgLyBkaXN0YW5jZVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0TWFza1RvSW5kaWNlcyhcbiAgbWF0Y2htYXNrID0gW10sXG4gIG1pbk1hdGNoQ2hhckxlbmd0aCA9IENvbmZpZy5taW5NYXRjaENoYXJMZW5ndGhcbikge1xuICBsZXQgaW5kaWNlcyA9IFtdO1xuICBsZXQgc3RhcnQgPSAtMTtcbiAgbGV0IGVuZCA9IC0xO1xuICBsZXQgaSA9IDA7XG5cbiAgZm9yIChsZXQgbGVuID0gbWF0Y2htYXNrLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgbGV0IG1hdGNoID0gbWF0Y2htYXNrW2ldO1xuICAgIGlmIChtYXRjaCAmJiBzdGFydCA9PT0gLTEpIHtcbiAgICAgIHN0YXJ0ID0gaTtcbiAgICB9IGVsc2UgaWYgKCFtYXRjaCAmJiBzdGFydCAhPT0gLTEpIHtcbiAgICAgIGVuZCA9IGkgLSAxO1xuICAgICAgaWYgKGVuZCAtIHN0YXJ0ICsgMSA+PSBtaW5NYXRjaENoYXJMZW5ndGgpIHtcbiAgICAgICAgaW5kaWNlcy5wdXNoKFtzdGFydCwgZW5kXSk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IC0xO1xuICAgIH1cbiAgfVxuXG4gIC8vIChpLTEgLSBzdGFydCkgKyAxID0+IGkgLSBzdGFydFxuICBpZiAobWF0Y2htYXNrW2kgLSAxXSAmJiBpIC0gc3RhcnQgPj0gbWluTWF0Y2hDaGFyTGVuZ3RoKSB7XG4gICAgaW5kaWNlcy5wdXNoKFtzdGFydCwgaSAtIDFdKTtcbiAgfVxuXG4gIHJldHVybiBpbmRpY2VzXG59XG5cbi8vIE1hY2hpbmUgd29yZCBzaXplXG5jb25zdCBNQVhfQklUUyA9IDMyO1xuXG5mdW5jdGlvbiBzZWFyY2goXG4gIHRleHQsXG4gIHBhdHRlcm4sXG4gIHBhdHRlcm5BbHBoYWJldCxcbiAge1xuICAgIGxvY2F0aW9uID0gQ29uZmlnLmxvY2F0aW9uLFxuICAgIGRpc3RhbmNlID0gQ29uZmlnLmRpc3RhbmNlLFxuICAgIHRocmVzaG9sZCA9IENvbmZpZy50aHJlc2hvbGQsXG4gICAgZmluZEFsbE1hdGNoZXMgPSBDb25maWcuZmluZEFsbE1hdGNoZXMsXG4gICAgbWluTWF0Y2hDaGFyTGVuZ3RoID0gQ29uZmlnLm1pbk1hdGNoQ2hhckxlbmd0aCxcbiAgICBpbmNsdWRlTWF0Y2hlcyA9IENvbmZpZy5pbmNsdWRlTWF0Y2hlcyxcbiAgICBpZ25vcmVMb2NhdGlvbiA9IENvbmZpZy5pZ25vcmVMb2NhdGlvblxuICB9ID0ge31cbikge1xuICBpZiAocGF0dGVybi5sZW5ndGggPiBNQVhfQklUUykge1xuICAgIHRocm93IG5ldyBFcnJvcihQQVRURVJOX0xFTkdUSF9UT09fTEFSR0UoTUFYX0JJVFMpKVxuICB9XG5cbiAgY29uc3QgcGF0dGVybkxlbiA9IHBhdHRlcm4ubGVuZ3RoO1xuICAvLyBTZXQgc3RhcnRpbmcgbG9jYXRpb24gYXQgYmVnaW5uaW5nIHRleHQgYW5kIGluaXRpYWxpemUgdGhlIGFscGhhYmV0LlxuICBjb25zdCB0ZXh0TGVuID0gdGV4dC5sZW5ndGg7XG4gIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVuIGxvY2F0aW9uID4gdGV4dC5sZW5ndGhcbiAgY29uc3QgZXhwZWN0ZWRMb2NhdGlvbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKGxvY2F0aW9uLCB0ZXh0TGVuKSk7XG4gIC8vIEhpZ2hlc3Qgc2NvcmUgYmV5b25kIHdoaWNoIHdlIGdpdmUgdXAuXG4gIGxldCBjdXJyZW50VGhyZXNob2xkID0gdGhyZXNob2xkO1xuICAvLyBJcyB0aGVyZSBhIG5lYXJieSBleGFjdCBtYXRjaD8gKHNwZWVkdXApXG4gIGxldCBiZXN0TG9jYXRpb24gPSBleHBlY3RlZExvY2F0aW9uO1xuXG4gIC8vIFBlcmZvcm1hbmNlOiBvbmx5IGNvbXB1dGVyIG1hdGNoZXMgd2hlbiB0aGUgbWluTWF0Y2hDaGFyTGVuZ3RoID4gMVxuICAvLyBPUiBpZiBgaW5jbHVkZU1hdGNoZXNgIGlzIHRydWUuXG4gIGNvbnN0IGNvbXB1dGVNYXRjaGVzID0gbWluTWF0Y2hDaGFyTGVuZ3RoID4gMSB8fCBpbmNsdWRlTWF0Y2hlcztcbiAgLy8gQSBtYXNrIG9mIHRoZSBtYXRjaGVzLCB1c2VkIGZvciBidWlsZGluZyB0aGUgaW5kaWNlc1xuICBjb25zdCBtYXRjaE1hc2sgPSBjb21wdXRlTWF0Y2hlcyA/IEFycmF5KHRleHRMZW4pIDogW107XG5cbiAgbGV0IGluZGV4O1xuXG4gIC8vIEdldCBhbGwgZXhhY3QgbWF0Y2hlcywgaGVyZSBmb3Igc3BlZWQgdXBcbiAgd2hpbGUgKChpbmRleCA9IHRleHQuaW5kZXhPZihwYXR0ZXJuLCBiZXN0TG9jYXRpb24pKSA+IC0xKSB7XG4gICAgbGV0IHNjb3JlID0gY29tcHV0ZVNjb3JlJDEocGF0dGVybiwge1xuICAgICAgY3VycmVudExvY2F0aW9uOiBpbmRleCxcbiAgICAgIGV4cGVjdGVkTG9jYXRpb24sXG4gICAgICBkaXN0YW5jZSxcbiAgICAgIGlnbm9yZUxvY2F0aW9uXG4gICAgfSk7XG5cbiAgICBjdXJyZW50VGhyZXNob2xkID0gTWF0aC5taW4oc2NvcmUsIGN1cnJlbnRUaHJlc2hvbGQpO1xuICAgIGJlc3RMb2NhdGlvbiA9IGluZGV4ICsgcGF0dGVybkxlbjtcblxuICAgIGlmIChjb21wdXRlTWF0Y2hlcykge1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgd2hpbGUgKGkgPCBwYXR0ZXJuTGVuKSB7XG4gICAgICAgIG1hdGNoTWFza1tpbmRleCArIGldID0gMTtcbiAgICAgICAgaSArPSAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlc2V0IHRoZSBiZXN0IGxvY2F0aW9uXG4gIGJlc3RMb2NhdGlvbiA9IC0xO1xuXG4gIGxldCBsYXN0Qml0QXJyID0gW107XG4gIGxldCBmaW5hbFNjb3JlID0gMTtcbiAgbGV0IGJpbk1heCA9IHBhdHRlcm5MZW4gKyB0ZXh0TGVuO1xuXG4gIGNvbnN0IG1hc2sgPSAxIDw8IChwYXR0ZXJuTGVuIC0gMSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuTGVuOyBpICs9IDEpIHtcbiAgICAvLyBTY2FuIGZvciB0aGUgYmVzdCBtYXRjaDsgZWFjaCBpdGVyYXRpb24gYWxsb3dzIGZvciBvbmUgbW9yZSBlcnJvci5cbiAgICAvLyBSdW4gYSBiaW5hcnkgc2VhcmNoIHRvIGRldGVybWluZSBob3cgZmFyIGZyb20gdGhlIG1hdGNoIGxvY2F0aW9uIHdlIGNhbiBzdHJheVxuICAgIC8vIGF0IHRoaXMgZXJyb3IgbGV2ZWwuXG4gICAgbGV0IGJpbk1pbiA9IDA7XG4gICAgbGV0IGJpbk1pZCA9IGJpbk1heDtcblxuICAgIHdoaWxlIChiaW5NaW4gPCBiaW5NaWQpIHtcbiAgICAgIGNvbnN0IHNjb3JlID0gY29tcHV0ZVNjb3JlJDEocGF0dGVybiwge1xuICAgICAgICBlcnJvcnM6IGksXG4gICAgICAgIGN1cnJlbnRMb2NhdGlvbjogZXhwZWN0ZWRMb2NhdGlvbiArIGJpbk1pZCxcbiAgICAgICAgZXhwZWN0ZWRMb2NhdGlvbixcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIGlnbm9yZUxvY2F0aW9uXG4gICAgICB9KTtcblxuICAgICAgaWYgKHNjb3JlIDw9IGN1cnJlbnRUaHJlc2hvbGQpIHtcbiAgICAgICAgYmluTWluID0gYmluTWlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmluTWF4ID0gYmluTWlkO1xuICAgICAgfVxuXG4gICAgICBiaW5NaWQgPSBNYXRoLmZsb29yKChiaW5NYXggLSBiaW5NaW4pIC8gMiArIGJpbk1pbik7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSByZXN1bHQgZnJvbSB0aGlzIGl0ZXJhdGlvbiBhcyB0aGUgbWF4aW11bSBmb3IgdGhlIG5leHQuXG4gICAgYmluTWF4ID0gYmluTWlkO1xuXG4gICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgoMSwgZXhwZWN0ZWRMb2NhdGlvbiAtIGJpbk1pZCArIDEpO1xuICAgIGxldCBmaW5pc2ggPSBmaW5kQWxsTWF0Y2hlc1xuICAgICAgPyB0ZXh0TGVuXG4gICAgICA6IE1hdGgubWluKGV4cGVjdGVkTG9jYXRpb24gKyBiaW5NaWQsIHRleHRMZW4pICsgcGF0dGVybkxlbjtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIGJpdCBhcnJheVxuICAgIGxldCBiaXRBcnIgPSBBcnJheShmaW5pc2ggKyAyKTtcblxuICAgIGJpdEFycltmaW5pc2ggKyAxXSA9ICgxIDw8IGkpIC0gMTtcblxuICAgIGZvciAobGV0IGogPSBmaW5pc2g7IGogPj0gc3RhcnQ7IGogLT0gMSkge1xuICAgICAgbGV0IGN1cnJlbnRMb2NhdGlvbiA9IGogLSAxO1xuICAgICAgbGV0IGNoYXJNYXRjaCA9IHBhdHRlcm5BbHBoYWJldFt0ZXh0LmNoYXJBdChjdXJyZW50TG9jYXRpb24pXTtcblxuICAgICAgaWYgKGNvbXB1dGVNYXRjaGVzKSB7XG4gICAgICAgIC8vIFNwZWVkIHVwOiBxdWljayBib29sIHRvIGludCBjb252ZXJzaW9uIChpLmUsIGBjaGFyTWF0Y2ggPyAxIDogMGApXG4gICAgICAgIG1hdGNoTWFza1tjdXJyZW50TG9jYXRpb25dID0gKyEhY2hhck1hdGNoO1xuICAgICAgfVxuXG4gICAgICAvLyBGaXJzdCBwYXNzOiBleGFjdCBtYXRjaFxuICAgICAgYml0QXJyW2pdID0gKChiaXRBcnJbaiArIDFdIDw8IDEpIHwgMSkgJiBjaGFyTWF0Y2g7XG5cbiAgICAgIC8vIFN1YnNlcXVlbnQgcGFzc2VzOiBmdXp6eSBtYXRjaFxuICAgICAgaWYgKGkpIHtcbiAgICAgICAgYml0QXJyW2pdIHw9XG4gICAgICAgICAgKChsYXN0Qml0QXJyW2ogKyAxXSB8IGxhc3RCaXRBcnJbal0pIDw8IDEpIHwgMSB8IGxhc3RCaXRBcnJbaiArIDFdO1xuICAgICAgfVxuXG4gICAgICBpZiAoYml0QXJyW2pdICYgbWFzaykge1xuICAgICAgICBmaW5hbFNjb3JlID0gY29tcHV0ZVNjb3JlJDEocGF0dGVybiwge1xuICAgICAgICAgIGVycm9yczogaSxcbiAgICAgICAgICBjdXJyZW50TG9jYXRpb24sXG4gICAgICAgICAgZXhwZWN0ZWRMb2NhdGlvbixcbiAgICAgICAgICBkaXN0YW5jZSxcbiAgICAgICAgICBpZ25vcmVMb2NhdGlvblxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUaGlzIG1hdGNoIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBiZXR0ZXIgdGhhbiBhbnkgZXhpc3RpbmcgbWF0Y2guXG4gICAgICAgIC8vIEJ1dCBjaGVjayBhbnl3YXkuXG4gICAgICAgIGlmIChmaW5hbFNjb3JlIDw9IGN1cnJlbnRUaHJlc2hvbGQpIHtcbiAgICAgICAgICAvLyBJbmRlZWQgaXQgaXNcbiAgICAgICAgICBjdXJyZW50VGhyZXNob2xkID0gZmluYWxTY29yZTtcbiAgICAgICAgICBiZXN0TG9jYXRpb24gPSBjdXJyZW50TG9jYXRpb247XG5cbiAgICAgICAgICAvLyBBbHJlYWR5IHBhc3NlZCBgbG9jYCwgZG93bmhpbGwgZnJvbSBoZXJlIG9uIGluLlxuICAgICAgICAgIGlmIChiZXN0TG9jYXRpb24gPD0gZXhwZWN0ZWRMb2NhdGlvbikge1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBXaGVuIHBhc3NpbmcgYGJlc3RMb2NhdGlvbmAsIGRvbid0IGV4Y2VlZCBvdXIgY3VycmVudCBkaXN0YW5jZSBmcm9tIGBleHBlY3RlZExvY2F0aW9uYC5cbiAgICAgICAgICBzdGFydCA9IE1hdGgubWF4KDEsIDIgKiBleHBlY3RlZExvY2F0aW9uIC0gYmVzdExvY2F0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIGhvcGUgZm9yIGEgKGJldHRlcikgbWF0Y2ggYXQgZ3JlYXRlciBlcnJvciBsZXZlbHMuXG4gICAgY29uc3Qgc2NvcmUgPSBjb21wdXRlU2NvcmUkMShwYXR0ZXJuLCB7XG4gICAgICBlcnJvcnM6IGkgKyAxLFxuICAgICAgY3VycmVudExvY2F0aW9uOiBleHBlY3RlZExvY2F0aW9uLFxuICAgICAgZXhwZWN0ZWRMb2NhdGlvbixcbiAgICAgIGRpc3RhbmNlLFxuICAgICAgaWdub3JlTG9jYXRpb25cbiAgICB9KTtcblxuICAgIGlmIChzY29yZSA+IGN1cnJlbnRUaHJlc2hvbGQpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgbGFzdEJpdEFyciA9IGJpdEFycjtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBpc01hdGNoOiBiZXN0TG9jYXRpb24gPj0gMCxcbiAgICAvLyBDb3VudCBleGFjdCBtYXRjaGVzICh0aG9zZSB3aXRoIGEgc2NvcmUgb2YgMCkgdG8gYmUgXCJhbG1vc3RcIiBleGFjdFxuICAgIHNjb3JlOiBNYXRoLm1heCgwLjAwMSwgZmluYWxTY29yZSlcbiAgfTtcblxuICBpZiAoY29tcHV0ZU1hdGNoZXMpIHtcbiAgICBjb25zdCBpbmRpY2VzID0gY29udmVydE1hc2tUb0luZGljZXMobWF0Y2hNYXNrLCBtaW5NYXRjaENoYXJMZW5ndGgpO1xuICAgIGlmICghaW5kaWNlcy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5pc01hdGNoID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpbmNsdWRlTWF0Y2hlcykge1xuICAgICAgcmVzdWx0LmluZGljZXMgPSBpbmRpY2VzO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gY3JlYXRlUGF0dGVybkFscGhhYmV0KHBhdHRlcm4pIHtcbiAgbGV0IG1hc2sgPSB7fTtcblxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gcGF0dGVybi5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgIGNvbnN0IGNoYXIgPSBwYXR0ZXJuLmNoYXJBdChpKTtcbiAgICBtYXNrW2NoYXJdID0gKG1hc2tbY2hhcl0gfHwgMCkgfCAoMSA8PCAobGVuIC0gaSAtIDEpKTtcbiAgfVxuXG4gIHJldHVybiBtYXNrXG59XG5cbmNsYXNzIEJpdGFwU2VhcmNoIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGF0dGVybixcbiAgICB7XG4gICAgICBsb2NhdGlvbiA9IENvbmZpZy5sb2NhdGlvbixcbiAgICAgIHRocmVzaG9sZCA9IENvbmZpZy50aHJlc2hvbGQsXG4gICAgICBkaXN0YW5jZSA9IENvbmZpZy5kaXN0YW5jZSxcbiAgICAgIGluY2x1ZGVNYXRjaGVzID0gQ29uZmlnLmluY2x1ZGVNYXRjaGVzLFxuICAgICAgZmluZEFsbE1hdGNoZXMgPSBDb25maWcuZmluZEFsbE1hdGNoZXMsXG4gICAgICBtaW5NYXRjaENoYXJMZW5ndGggPSBDb25maWcubWluTWF0Y2hDaGFyTGVuZ3RoLFxuICAgICAgaXNDYXNlU2Vuc2l0aXZlID0gQ29uZmlnLmlzQ2FzZVNlbnNpdGl2ZSxcbiAgICAgIGlnbm9yZUxvY2F0aW9uID0gQ29uZmlnLmlnbm9yZUxvY2F0aW9uXG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgZGlzdGFuY2UsXG4gICAgICBpbmNsdWRlTWF0Y2hlcyxcbiAgICAgIGZpbmRBbGxNYXRjaGVzLFxuICAgICAgbWluTWF0Y2hDaGFyTGVuZ3RoLFxuICAgICAgaXNDYXNlU2Vuc2l0aXZlLFxuICAgICAgaWdub3JlTG9jYXRpb25cbiAgICB9O1xuXG4gICAgdGhpcy5wYXR0ZXJuID0gaXNDYXNlU2Vuc2l0aXZlID8gcGF0dGVybiA6IHBhdHRlcm4udG9Mb3dlckNhc2UoKTtcblxuICAgIHRoaXMuY2h1bmtzID0gW107XG5cbiAgICBpZiAoIXRoaXMucGF0dGVybi5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFkZENodW5rID0gKHBhdHRlcm4sIHN0YXJ0SW5kZXgpID0+IHtcbiAgICAgIHRoaXMuY2h1bmtzLnB1c2goe1xuICAgICAgICBwYXR0ZXJuLFxuICAgICAgICBhbHBoYWJldDogY3JlYXRlUGF0dGVybkFscGhhYmV0KHBhdHRlcm4pLFxuICAgICAgICBzdGFydEluZGV4XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgbGVuID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDtcblxuICAgIGlmIChsZW4gPiBNQVhfQklUUykge1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgY29uc3QgcmVtYWluZGVyID0gbGVuICUgTUFYX0JJVFM7XG4gICAgICBjb25zdCBlbmQgPSBsZW4gLSByZW1haW5kZXI7XG5cbiAgICAgIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgICAgIGFkZENodW5rKHRoaXMucGF0dGVybi5zdWJzdHIoaSwgTUFYX0JJVFMpLCBpKTtcbiAgICAgICAgaSArPSBNQVhfQklUUztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlbWFpbmRlcikge1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gbGVuIC0gTUFYX0JJVFM7XG4gICAgICAgIGFkZENodW5rKHRoaXMucGF0dGVybi5zdWJzdHIoc3RhcnRJbmRleCksIHN0YXJ0SW5kZXgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRDaHVuayh0aGlzLnBhdHRlcm4sIDApO1xuICAgIH1cbiAgfVxuXG4gIHNlYXJjaEluKHRleHQpIHtcbiAgICBjb25zdCB7IGlzQ2FzZVNlbnNpdGl2ZSwgaW5jbHVkZU1hdGNoZXMgfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmICghaXNDYXNlU2Vuc2l0aXZlKSB7XG4gICAgICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8vIEV4YWN0IG1hdGNoXG4gICAgaWYgKHRoaXMucGF0dGVybiA9PT0gdGV4dCkge1xuICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgaXNNYXRjaDogdHJ1ZSxcbiAgICAgICAgc2NvcmU6IDBcbiAgICAgIH07XG5cbiAgICAgIGlmIChpbmNsdWRlTWF0Y2hlcykge1xuICAgICAgICByZXN1bHQuaW5kaWNlcyA9IFtbMCwgdGV4dC5sZW5ndGggLSAxXV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHVzZSBCaXRhcCBhbGdvcml0aG1cbiAgICBjb25zdCB7XG4gICAgICBsb2NhdGlvbixcbiAgICAgIGRpc3RhbmNlLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgZmluZEFsbE1hdGNoZXMsXG4gICAgICBtaW5NYXRjaENoYXJMZW5ndGgsXG4gICAgICBpZ25vcmVMb2NhdGlvblxuICAgIH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBsZXQgYWxsSW5kaWNlcyA9IFtdO1xuICAgIGxldCB0b3RhbFNjb3JlID0gMDtcbiAgICBsZXQgaGFzTWF0Y2hlcyA9IGZhbHNlO1xuXG4gICAgdGhpcy5jaHVua3MuZm9yRWFjaCgoeyBwYXR0ZXJuLCBhbHBoYWJldCwgc3RhcnRJbmRleCB9KSA9PiB7XG4gICAgICBjb25zdCB7IGlzTWF0Y2gsIHNjb3JlLCBpbmRpY2VzIH0gPSBzZWFyY2godGV4dCwgcGF0dGVybiwgYWxwaGFiZXQsIHtcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uICsgc3RhcnRJbmRleCxcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIHRocmVzaG9sZCxcbiAgICAgICAgZmluZEFsbE1hdGNoZXMsXG4gICAgICAgIG1pbk1hdGNoQ2hhckxlbmd0aCxcbiAgICAgICAgaW5jbHVkZU1hdGNoZXMsXG4gICAgICAgIGlnbm9yZUxvY2F0aW9uXG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzTWF0Y2gpIHtcbiAgICAgICAgaGFzTWF0Y2hlcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRvdGFsU2NvcmUgKz0gc2NvcmU7XG5cbiAgICAgIGlmIChpc01hdGNoICYmIGluZGljZXMpIHtcbiAgICAgICAgYWxsSW5kaWNlcyA9IFsuLi5hbGxJbmRpY2VzLCAuLi5pbmRpY2VzXTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCByZXN1bHQgPSB7XG4gICAgICBpc01hdGNoOiBoYXNNYXRjaGVzLFxuICAgICAgc2NvcmU6IGhhc01hdGNoZXMgPyB0b3RhbFNjb3JlIC8gdGhpcy5jaHVua3MubGVuZ3RoIDogMVxuICAgIH07XG5cbiAgICBpZiAoaGFzTWF0Y2hlcyAmJiBpbmNsdWRlTWF0Y2hlcykge1xuICAgICAgcmVzdWx0LmluZGljZXMgPSBhbGxJbmRpY2VzO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxufVxuXG5jbGFzcyBCYXNlTWF0Y2gge1xuICBjb25zdHJ1Y3RvcihwYXR0ZXJuKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgfVxuICBzdGF0aWMgaXNNdWx0aU1hdGNoKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gZ2V0TWF0Y2gocGF0dGVybiwgdGhpcy5tdWx0aVJlZ2V4KVxuICB9XG4gIHN0YXRpYyBpc1NpbmdsZU1hdGNoKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gZ2V0TWF0Y2gocGF0dGVybiwgdGhpcy5zaW5nbGVSZWdleClcbiAgfVxuICBzZWFyY2goLyp0ZXh0Ki8pIHt9XG59XG5cbmZ1bmN0aW9uIGdldE1hdGNoKHBhdHRlcm4sIGV4cCkge1xuICBjb25zdCBtYXRjaGVzID0gcGF0dGVybi5tYXRjaChleHApO1xuICByZXR1cm4gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiBudWxsXG59XG5cbi8vIFRva2VuOiAnZmlsZVxuXG5jbGFzcyBFeGFjdE1hdGNoIGV4dGVuZHMgQmFzZU1hdGNoIHtcbiAgY29uc3RydWN0b3IocGF0dGVybikge1xuICAgIHN1cGVyKHBhdHRlcm4pO1xuICB9XG4gIHN0YXRpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2V4YWN0J1xuICB9XG4gIHN0YXRpYyBnZXQgbXVsdGlSZWdleCgpIHtcbiAgICByZXR1cm4gL149XCIoLiopXCIkL1xuICB9XG4gIHN0YXRpYyBnZXQgc2luZ2xlUmVnZXgoKSB7XG4gICAgcmV0dXJuIC9ePSguKikkL1xuICB9XG4gIHNlYXJjaCh0ZXh0KSB7XG4gICAgY29uc3QgaXNNYXRjaCA9IHRleHQgPT09IHRoaXMucGF0dGVybjtcblxuICAgIHJldHVybiB7XG4gICAgICBpc01hdGNoLFxuICAgICAgc2NvcmU6IGlzTWF0Y2ggPyAwIDogMSxcbiAgICAgIGluZGljZXM6IFswLCB0aGlzLnBhdHRlcm4ubGVuZ3RoIC0gMV1cbiAgICB9XG4gIH1cbn1cblxuLy8gVG9rZW46ICFmaXJlXG5cbmNsYXNzIEludmVyc2VFeGFjdE1hdGNoIGV4dGVuZHMgQmFzZU1hdGNoIHtcbiAgY29uc3RydWN0b3IocGF0dGVybikge1xuICAgIHN1cGVyKHBhdHRlcm4pO1xuICB9XG4gIHN0YXRpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2ludmVyc2UtZXhhY3QnXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXiFcIiguKilcIiQvXG4gIH1cbiAgc3RhdGljIGdldCBzaW5nbGVSZWdleCgpIHtcbiAgICByZXR1cm4gL14hKC4qKSQvXG4gIH1cbiAgc2VhcmNoKHRleHQpIHtcbiAgICBjb25zdCBpbmRleCA9IHRleHQuaW5kZXhPZih0aGlzLnBhdHRlcm4pO1xuICAgIGNvbnN0IGlzTWF0Y2ggPSBpbmRleCA9PT0gLTE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNNYXRjaCxcbiAgICAgIHNjb3JlOiBpc01hdGNoID8gMCA6IDEsXG4gICAgICBpbmRpY2VzOiBbMCwgdGV4dC5sZW5ndGggLSAxXVxuICAgIH1cbiAgfVxufVxuXG4vLyBUb2tlbjogXmZpbGVcblxuY2xhc3MgUHJlZml4RXhhY3RNYXRjaCBleHRlbmRzIEJhc2VNYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHBhdHRlcm4pIHtcbiAgICBzdXBlcihwYXR0ZXJuKTtcbiAgfVxuICBzdGF0aWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdwcmVmaXgtZXhhY3QnXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXlxcXlwiKC4qKVwiJC9cbiAgfVxuICBzdGF0aWMgZ2V0IHNpbmdsZVJlZ2V4KCkge1xuICAgIHJldHVybiAvXlxcXiguKikkL1xuICB9XG4gIHNlYXJjaCh0ZXh0KSB7XG4gICAgY29uc3QgaXNNYXRjaCA9IHRleHQuc3RhcnRzV2l0aCh0aGlzLnBhdHRlcm4pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTWF0Y2gsXG4gICAgICBzY29yZTogaXNNYXRjaCA/IDAgOiAxLFxuICAgICAgaW5kaWNlczogWzAsIHRoaXMucGF0dGVybi5sZW5ndGggLSAxXVxuICAgIH1cbiAgfVxufVxuXG4vLyBUb2tlbjogIV5maXJlXG5cbmNsYXNzIEludmVyc2VQcmVmaXhFeGFjdE1hdGNoIGV4dGVuZHMgQmFzZU1hdGNoIHtcbiAgY29uc3RydWN0b3IocGF0dGVybikge1xuICAgIHN1cGVyKHBhdHRlcm4pO1xuICB9XG4gIHN0YXRpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2ludmVyc2UtcHJlZml4LWV4YWN0J1xuICB9XG4gIHN0YXRpYyBnZXQgbXVsdGlSZWdleCgpIHtcbiAgICByZXR1cm4gL14hXFxeXCIoLiopXCIkL1xuICB9XG4gIHN0YXRpYyBnZXQgc2luZ2xlUmVnZXgoKSB7XG4gICAgcmV0dXJuIC9eIVxcXiguKikkL1xuICB9XG4gIHNlYXJjaCh0ZXh0KSB7XG4gICAgY29uc3QgaXNNYXRjaCA9ICF0ZXh0LnN0YXJ0c1dpdGgodGhpcy5wYXR0ZXJuKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpc01hdGNoLFxuICAgICAgc2NvcmU6IGlzTWF0Y2ggPyAwIDogMSxcbiAgICAgIGluZGljZXM6IFswLCB0ZXh0Lmxlbmd0aCAtIDFdXG4gICAgfVxuICB9XG59XG5cbi8vIFRva2VuOiAuZmlsZSRcblxuY2xhc3MgU3VmZml4RXhhY3RNYXRjaCBleHRlbmRzIEJhc2VNYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHBhdHRlcm4pIHtcbiAgICBzdXBlcihwYXR0ZXJuKTtcbiAgfVxuICBzdGF0aWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdzdWZmaXgtZXhhY3QnXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXlwiKC4qKVwiXFwkJC9cbiAgfVxuICBzdGF0aWMgZ2V0IHNpbmdsZVJlZ2V4KCkge1xuICAgIHJldHVybiAvXiguKilcXCQkL1xuICB9XG4gIHNlYXJjaCh0ZXh0KSB7XG4gICAgY29uc3QgaXNNYXRjaCA9IHRleHQuZW5kc1dpdGgodGhpcy5wYXR0ZXJuKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpc01hdGNoLFxuICAgICAgc2NvcmU6IGlzTWF0Y2ggPyAwIDogMSxcbiAgICAgIGluZGljZXM6IFt0ZXh0Lmxlbmd0aCAtIHRoaXMucGF0dGVybi5sZW5ndGgsIHRleHQubGVuZ3RoIC0gMV1cbiAgICB9XG4gIH1cbn1cblxuLy8gVG9rZW46ICEuZmlsZSRcblxuY2xhc3MgSW52ZXJzZVN1ZmZpeEV4YWN0TWF0Y2ggZXh0ZW5kcyBCYXNlTWF0Y2gge1xuICBjb25zdHJ1Y3RvcihwYXR0ZXJuKSB7XG4gICAgc3VwZXIocGF0dGVybik7XG4gIH1cbiAgc3RhdGljIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAnaW52ZXJzZS1zdWZmaXgtZXhhY3QnXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXiFcIiguKilcIlxcJCQvXG4gIH1cbiAgc3RhdGljIGdldCBzaW5nbGVSZWdleCgpIHtcbiAgICByZXR1cm4gL14hKC4qKVxcJCQvXG4gIH1cbiAgc2VhcmNoKHRleHQpIHtcbiAgICBjb25zdCBpc01hdGNoID0gIXRleHQuZW5kc1dpdGgodGhpcy5wYXR0ZXJuKTtcbiAgICByZXR1cm4ge1xuICAgICAgaXNNYXRjaCxcbiAgICAgIHNjb3JlOiBpc01hdGNoID8gMCA6IDEsXG4gICAgICBpbmRpY2VzOiBbMCwgdGV4dC5sZW5ndGggLSAxXVxuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBGdXp6eU1hdGNoIGV4dGVuZHMgQmFzZU1hdGNoIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGF0dGVybixcbiAgICB7XG4gICAgICBsb2NhdGlvbiA9IENvbmZpZy5sb2NhdGlvbixcbiAgICAgIHRocmVzaG9sZCA9IENvbmZpZy50aHJlc2hvbGQsXG4gICAgICBkaXN0YW5jZSA9IENvbmZpZy5kaXN0YW5jZSxcbiAgICAgIGluY2x1ZGVNYXRjaGVzID0gQ29uZmlnLmluY2x1ZGVNYXRjaGVzLFxuICAgICAgZmluZEFsbE1hdGNoZXMgPSBDb25maWcuZmluZEFsbE1hdGNoZXMsXG4gICAgICBtaW5NYXRjaENoYXJMZW5ndGggPSBDb25maWcubWluTWF0Y2hDaGFyTGVuZ3RoLFxuICAgICAgaXNDYXNlU2Vuc2l0aXZlID0gQ29uZmlnLmlzQ2FzZVNlbnNpdGl2ZSxcbiAgICAgIGlnbm9yZUxvY2F0aW9uID0gQ29uZmlnLmlnbm9yZUxvY2F0aW9uXG4gICAgfSA9IHt9XG4gICkge1xuICAgIHN1cGVyKHBhdHRlcm4pO1xuICAgIHRoaXMuX2JpdGFwU2VhcmNoID0gbmV3IEJpdGFwU2VhcmNoKHBhdHRlcm4sIHtcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgZGlzdGFuY2UsXG4gICAgICBpbmNsdWRlTWF0Y2hlcyxcbiAgICAgIGZpbmRBbGxNYXRjaGVzLFxuICAgICAgbWluTWF0Y2hDaGFyTGVuZ3RoLFxuICAgICAgaXNDYXNlU2Vuc2l0aXZlLFxuICAgICAgaWdub3JlTG9jYXRpb25cbiAgICB9KTtcbiAgfVxuICBzdGF0aWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdmdXp6eSdcbiAgfVxuICBzdGF0aWMgZ2V0IG11bHRpUmVnZXgoKSB7XG4gICAgcmV0dXJuIC9eXCIoLiopXCIkL1xuICB9XG4gIHN0YXRpYyBnZXQgc2luZ2xlUmVnZXgoKSB7XG4gICAgcmV0dXJuIC9eKC4qKSQvXG4gIH1cbiAgc2VhcmNoKHRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYml0YXBTZWFyY2guc2VhcmNoSW4odGV4dClcbiAgfVxufVxuXG4vLyBUb2tlbjogJ2ZpbGVcblxuY2xhc3MgSW5jbHVkZU1hdGNoIGV4dGVuZHMgQmFzZU1hdGNoIHtcbiAgY29uc3RydWN0b3IocGF0dGVybikge1xuICAgIHN1cGVyKHBhdHRlcm4pO1xuICB9XG4gIHN0YXRpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2luY2x1ZGUnXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXidcIiguKilcIiQvXG4gIH1cbiAgc3RhdGljIGdldCBzaW5nbGVSZWdleCgpIHtcbiAgICByZXR1cm4gL14nKC4qKSQvXG4gIH1cbiAgc2VhcmNoKHRleHQpIHtcbiAgICBsZXQgbG9jYXRpb24gPSAwO1xuICAgIGxldCBpbmRleDtcblxuICAgIGNvbnN0IGluZGljZXMgPSBbXTtcbiAgICBjb25zdCBwYXR0ZXJuTGVuID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDtcblxuICAgIC8vIEdldCBhbGwgZXhhY3QgbWF0Y2hlc1xuICAgIHdoaWxlICgoaW5kZXggPSB0ZXh0LmluZGV4T2YodGhpcy5wYXR0ZXJuLCBsb2NhdGlvbikpID4gLTEpIHtcbiAgICAgIGxvY2F0aW9uID0gaW5kZXggKyBwYXR0ZXJuTGVuO1xuICAgICAgaW5kaWNlcy5wdXNoKFtpbmRleCwgbG9jYXRpb24gLSAxXSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNNYXRjaCA9ICEhaW5kaWNlcy5sZW5ndGg7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNNYXRjaCxcbiAgICAgIHNjb3JlOiBpc01hdGNoID8gMCA6IDEsXG4gICAgICBpbmRpY2VzXG4gICAgfVxuICB9XG59XG5cbi8vIFx1Mjc1N09yZGVyIGlzIGltcG9ydGFudC4gRE8gTk9UIENIQU5HRS5cbmNvbnN0IHNlYXJjaGVycyA9IFtcbiAgRXhhY3RNYXRjaCxcbiAgSW5jbHVkZU1hdGNoLFxuICBQcmVmaXhFeGFjdE1hdGNoLFxuICBJbnZlcnNlUHJlZml4RXhhY3RNYXRjaCxcbiAgSW52ZXJzZVN1ZmZpeEV4YWN0TWF0Y2gsXG4gIFN1ZmZpeEV4YWN0TWF0Y2gsXG4gIEludmVyc2VFeGFjdE1hdGNoLFxuICBGdXp6eU1hdGNoXG5dO1xuXG5jb25zdCBzZWFyY2hlcnNMZW4gPSBzZWFyY2hlcnMubGVuZ3RoO1xuXG4vLyBSZWdleCB0byBzcGxpdCBieSBzcGFjZXMsIGJ1dCBrZWVwIGFueXRoaW5nIGluIHF1b3RlcyB0b2dldGhlclxuY29uc3QgU1BBQ0VfUkUgPSAvICsoPz0oPzpbXlxcXCJdKlxcXCJbXlxcXCJdKlxcXCIpKlteXFxcIl0qJCkvO1xuY29uc3QgT1JfVE9LRU4gPSAnfCc7XG5cbi8vIFJldHVybiBhIDJEIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBxdWVyeSwgZm9yIHNpbXBsZXIgcGFyc2luZy5cbi8vIEV4YW1wbGU6XG4vLyBcIl5jb3JlIGdvJCB8IHJiJCB8IHB5JCB4eSRcIiA9PiBbW1wiXmNvcmVcIiwgXCJnbyRcIl0sIFtcInJiJFwiXSwgW1wicHkkXCIsIFwieHkkXCJdXVxuZnVuY3Rpb24gcGFyc2VRdWVyeShwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoT1JfVE9LRU4pLm1hcCgoaXRlbSkgPT4ge1xuICAgIGxldCBxdWVyeSA9IGl0ZW1cbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdChTUEFDRV9SRSlcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gJiYgISFpdGVtLnRyaW0oKSk7XG5cbiAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBxdWVyeS5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgY29uc3QgcXVlcnlJdGVtID0gcXVlcnlbaV07XG5cbiAgICAgIC8vIDEuIEhhbmRsZSBtdWx0aXBsZSBxdWVyeSBtYXRjaCAoaS5lLCBvbmNlIHRoYXQgYXJlIHF1b3RlZCwgbGlrZSBgXCJoZWxsbyB3b3JsZFwiYClcbiAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgbGV0IGlkeCA9IC0xO1xuICAgICAgd2hpbGUgKCFmb3VuZCAmJiArK2lkeCA8IHNlYXJjaGVyc0xlbikge1xuICAgICAgICBjb25zdCBzZWFyY2hlciA9IHNlYXJjaGVyc1tpZHhdO1xuICAgICAgICBsZXQgdG9rZW4gPSBzZWFyY2hlci5pc011bHRpTWF0Y2gocXVlcnlJdGVtKTtcbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKG5ldyBzZWFyY2hlcih0b2tlbiwgb3B0aW9ucykpO1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMi4gSGFuZGxlIHNpbmdsZSBxdWVyeSBtYXRjaGVzIChpLmUsIG9uY2UgdGhhdCBhcmUgKm5vdCogcXVvdGVkKVxuICAgICAgaWR4ID0gLTE7XG4gICAgICB3aGlsZSAoKytpZHggPCBzZWFyY2hlcnNMZW4pIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoZXIgPSBzZWFyY2hlcnNbaWR4XTtcbiAgICAgICAgbGV0IHRva2VuID0gc2VhcmNoZXIuaXNTaW5nbGVNYXRjaChxdWVyeUl0ZW0pO1xuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2gobmV3IHNlYXJjaGVyKHRva2VuLCBvcHRpb25zKSk7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzXG4gIH0pXG59XG5cbi8vIFRoZXNlIGV4dGVuZGVkIG1hdGNoZXJzIGNhbiByZXR1cm4gYW4gYXJyYXkgb2YgbWF0Y2hlcywgYXMgb3Bwb3NlZFxuLy8gdG8gYSBzaW5nbCBtYXRjaFxuY29uc3QgTXVsdGlNYXRjaFNldCA9IG5ldyBTZXQoW0Z1enp5TWF0Y2gudHlwZSwgSW5jbHVkZU1hdGNoLnR5cGVdKTtcblxuLyoqXG4gKiBDb21tYW5kLWxpa2Ugc2VhcmNoaW5nXG4gKiA9PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogR2l2ZW4gbXVsdGlwbGUgc2VhcmNoIHRlcm1zIGRlbGltaXRlZCBieSBzcGFjZXMuZS5nLiBgXmpzY3JpcHQgLnB5dGhvbiQgcnVieSAhamF2YWAsXG4gKiBzZWFyY2ggaW4gYSBnaXZlbiB0ZXh0LlxuICpcbiAqIFNlYXJjaCBzeW50YXg6XG4gKlxuICogfCBUb2tlbiAgICAgICB8IE1hdGNoIHR5cGUgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICogfCBganNjcmlwdGAgICB8IGZ1enp5LW1hdGNoICAgICAgICAgICAgICAgIHwgSXRlbXMgdGhhdCBmdXp6eSBtYXRjaCBganNjcmlwdGAgICAgICAgfFxuICogfCBgPXNjaGVtZWAgICB8IGV4YWN0LW1hdGNoICAgICAgICAgICAgICAgIHwgSXRlbXMgdGhhdCBhcmUgYHNjaGVtZWAgICAgICAgICAgICAgICAgfFxuICogfCBgJ3B5dGhvbmAgICB8IGluY2x1ZGUtbWF0Y2ggICAgICAgICAgICAgIHwgSXRlbXMgdGhhdCBpbmNsdWRlIGBweXRob25gICAgICAgICAgICAgfFxuICogfCBgIXJ1YnlgICAgICB8IGludmVyc2UtZXhhY3QtbWF0Y2ggICAgICAgIHwgSXRlbXMgdGhhdCBkbyBub3QgaW5jbHVkZSBgcnVieWAgICAgICAgfFxuICogfCBgXmphdmFgICAgICB8IHByZWZpeC1leGFjdC1tYXRjaCAgICAgICAgIHwgSXRlbXMgdGhhdCBzdGFydCB3aXRoIGBqYXZhYCAgICAgICAgICAgfFxuICogfCBgIV5lYXJsYW5nYCB8IGludmVyc2UtcHJlZml4LWV4YWN0LW1hdGNoIHwgSXRlbXMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBgZWFybGFuZ2AgfFxuICogfCBgLmpzJGAgICAgICB8IHN1ZmZpeC1leGFjdC1tYXRjaCAgICAgICAgIHwgSXRlbXMgdGhhdCBlbmQgd2l0aCBgLmpzYCAgICAgICAgICAgICAgfFxuICogfCBgIS5nbyRgICAgICB8IGludmVyc2Utc3VmZml4LWV4YWN0LW1hdGNoIHwgSXRlbXMgdGhhdCBkbyBub3QgZW5kIHdpdGggYC5nb2AgICAgICAgfFxuICpcbiAqIEEgc2luZ2xlIHBpcGUgY2hhcmFjdGVyIGFjdHMgYXMgYW4gT1Igb3BlcmF0b3IuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nXG4gKiBxdWVyeSBtYXRjaGVzIGVudHJpZXMgdGhhdCBzdGFydCB3aXRoIGBjb3JlYCBhbmQgZW5kIHdpdGggZWl0aGVyYGdvYCwgYHJiYCxcbiAqIG9yYHB5YC5cbiAqXG4gKiBgYGBcbiAqIF5jb3JlIGdvJCB8IHJiJCB8IHB5JFxuICogYGBgXG4gKi9cbmNsYXNzIEV4dGVuZGVkU2VhcmNoIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGF0dGVybixcbiAgICB7XG4gICAgICBpc0Nhc2VTZW5zaXRpdmUgPSBDb25maWcuaXNDYXNlU2Vuc2l0aXZlLFxuICAgICAgaW5jbHVkZU1hdGNoZXMgPSBDb25maWcuaW5jbHVkZU1hdGNoZXMsXG4gICAgICBtaW5NYXRjaENoYXJMZW5ndGggPSBDb25maWcubWluTWF0Y2hDaGFyTGVuZ3RoLFxuICAgICAgaWdub3JlTG9jYXRpb24gPSBDb25maWcuaWdub3JlTG9jYXRpb24sXG4gICAgICBmaW5kQWxsTWF0Y2hlcyA9IENvbmZpZy5maW5kQWxsTWF0Y2hlcyxcbiAgICAgIGxvY2F0aW9uID0gQ29uZmlnLmxvY2F0aW9uLFxuICAgICAgdGhyZXNob2xkID0gQ29uZmlnLnRocmVzaG9sZCxcbiAgICAgIGRpc3RhbmNlID0gQ29uZmlnLmRpc3RhbmNlXG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMucXVlcnkgPSBudWxsO1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGlzQ2FzZVNlbnNpdGl2ZSxcbiAgICAgIGluY2x1ZGVNYXRjaGVzLFxuICAgICAgbWluTWF0Y2hDaGFyTGVuZ3RoLFxuICAgICAgZmluZEFsbE1hdGNoZXMsXG4gICAgICBpZ25vcmVMb2NhdGlvbixcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgZGlzdGFuY2VcbiAgICB9O1xuXG4gICAgdGhpcy5wYXR0ZXJuID0gaXNDYXNlU2Vuc2l0aXZlID8gcGF0dGVybiA6IHBhdHRlcm4udG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcGFyc2VRdWVyeSh0aGlzLnBhdHRlcm4sIHRoaXMub3B0aW9ucyk7XG4gIH1cblxuICBzdGF0aWMgY29uZGl0aW9uKF8sIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucy51c2VFeHRlbmRlZFNlYXJjaFxuICB9XG5cbiAgc2VhcmNoSW4odGV4dCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyeTtcblxuICAgIGlmICghcXVlcnkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzTWF0Y2g6IGZhbHNlLFxuICAgICAgICBzY29yZTogMVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgaW5jbHVkZU1hdGNoZXMsIGlzQ2FzZVNlbnNpdGl2ZSB9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgdGV4dCA9IGlzQ2FzZVNlbnNpdGl2ZSA/IHRleHQgOiB0ZXh0LnRvTG93ZXJDYXNlKCk7XG5cbiAgICBsZXQgbnVtTWF0Y2hlcyA9IDA7XG4gICAgbGV0IGFsbEluZGljZXMgPSBbXTtcbiAgICBsZXQgdG90YWxTY29yZSA9IDA7XG5cbiAgICAvLyBPUnNcbiAgICBmb3IgKGxldCBpID0gMCwgcUxlbiA9IHF1ZXJ5Lmxlbmd0aDsgaSA8IHFMZW47IGkgKz0gMSkge1xuICAgICAgY29uc3Qgc2VhcmNoZXJzID0gcXVlcnlbaV07XG5cbiAgICAgIC8vIFJlc2V0IGluZGljZXNcbiAgICAgIGFsbEluZGljZXMubGVuZ3RoID0gMDtcbiAgICAgIG51bU1hdGNoZXMgPSAwO1xuXG4gICAgICAvLyBBTkRzXG4gICAgICBmb3IgKGxldCBqID0gMCwgcExlbiA9IHNlYXJjaGVycy5sZW5ndGg7IGogPCBwTGVuOyBqICs9IDEpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoZXIgPSBzZWFyY2hlcnNbal07XG4gICAgICAgIGNvbnN0IHsgaXNNYXRjaCwgaW5kaWNlcywgc2NvcmUgfSA9IHNlYXJjaGVyLnNlYXJjaCh0ZXh0KTtcblxuICAgICAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgICAgIG51bU1hdGNoZXMgKz0gMTtcbiAgICAgICAgICB0b3RhbFNjb3JlICs9IHNjb3JlO1xuICAgICAgICAgIGlmIChpbmNsdWRlTWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHNlYXJjaGVyLmNvbnN0cnVjdG9yLnR5cGU7XG4gICAgICAgICAgICBpZiAoTXVsdGlNYXRjaFNldC5oYXModHlwZSkpIHtcbiAgICAgICAgICAgICAgYWxsSW5kaWNlcyA9IFsuLi5hbGxJbmRpY2VzLCAuLi5pbmRpY2VzXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFsbEluZGljZXMucHVzaChpbmRpY2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG90YWxTY29yZSA9IDA7XG4gICAgICAgICAgbnVtTWF0Y2hlcyA9IDA7XG4gICAgICAgICAgYWxsSW5kaWNlcy5sZW5ndGggPSAwO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gT1IgY29uZGl0aW9uLCBzbyBpZiBUUlVFLCByZXR1cm5cbiAgICAgIGlmIChudW1NYXRjaGVzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgaXNNYXRjaDogdHJ1ZSxcbiAgICAgICAgICBzY29yZTogdG90YWxTY29yZSAvIG51bU1hdGNoZXNcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoaW5jbHVkZU1hdGNoZXMpIHtcbiAgICAgICAgICByZXN1bHQuaW5kaWNlcyA9IGFsbEluZGljZXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm90aGluZyB3YXMgbWF0Y2hlZFxuICAgIHJldHVybiB7XG4gICAgICBpc01hdGNoOiBmYWxzZSxcbiAgICAgIHNjb3JlOiAxXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHJlZ2lzdGVyZWRTZWFyY2hlcnMgPSBbXTtcblxuZnVuY3Rpb24gcmVnaXN0ZXIoLi4uYXJncykge1xuICByZWdpc3RlcmVkU2VhcmNoZXJzLnB1c2goLi4uYXJncyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNlYXJjaGVyKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJlZ2lzdGVyZWRTZWFyY2hlcnMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICBsZXQgc2VhcmNoZXJDbGFzcyA9IHJlZ2lzdGVyZWRTZWFyY2hlcnNbaV07XG4gICAgaWYgKHNlYXJjaGVyQ2xhc3MuY29uZGl0aW9uKHBhdHRlcm4sIG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gbmV3IHNlYXJjaGVyQ2xhc3MocGF0dGVybiwgb3B0aW9ucylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IEJpdGFwU2VhcmNoKHBhdHRlcm4sIG9wdGlvbnMpXG59XG5cbmNvbnN0IExvZ2ljYWxPcGVyYXRvciA9IHtcbiAgQU5EOiAnJGFuZCcsXG4gIE9SOiAnJG9yJ1xufTtcblxuY29uc3QgS2V5VHlwZSA9IHtcbiAgUEFUSDogJyRwYXRoJyxcbiAgUEFUVEVSTjogJyR2YWwnXG59O1xuXG5jb25zdCBpc0V4cHJlc3Npb24gPSAocXVlcnkpID0+XG4gICEhKHF1ZXJ5W0xvZ2ljYWxPcGVyYXRvci5BTkRdIHx8IHF1ZXJ5W0xvZ2ljYWxPcGVyYXRvci5PUl0pO1xuXG5jb25zdCBpc1BhdGggPSAocXVlcnkpID0+ICEhcXVlcnlbS2V5VHlwZS5QQVRIXTtcblxuY29uc3QgaXNMZWFmID0gKHF1ZXJ5KSA9PlxuICAhaXNBcnJheShxdWVyeSkgJiYgaXNPYmplY3QocXVlcnkpICYmICFpc0V4cHJlc3Npb24ocXVlcnkpO1xuXG5jb25zdCBjb252ZXJ0VG9FeHBsaWNpdCA9IChxdWVyeSkgPT4gKHtcbiAgW0xvZ2ljYWxPcGVyYXRvci5BTkRdOiBPYmplY3Qua2V5cyhxdWVyeSkubWFwKChrZXkpID0+ICh7XG4gICAgW2tleV06IHF1ZXJ5W2tleV1cbiAgfSkpXG59KTtcblxuLy8gV2hlbiBgYXV0b2AgaXMgYHRydWVgLCB0aGUgcGFyc2UgZnVuY3Rpb24gd2lsbCBpbmZlciBhbmQgaW5pdGlhbGl6ZSBhbmQgYWRkXG4vLyB0aGUgYXBwcm9wcmlhdGUgYFNlYXJjaGVyYCBpbnN0YW5jZVxuZnVuY3Rpb24gcGFyc2UocXVlcnksIG9wdGlvbnMsIHsgYXV0byA9IHRydWUgfSA9IHt9KSB7XG4gIGNvbnN0IG5leHQgPSAocXVlcnkpID0+IHtcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHF1ZXJ5KTtcblxuICAgIGNvbnN0IGlzUXVlcnlQYXRoID0gaXNQYXRoKHF1ZXJ5KTtcblxuICAgIGlmICghaXNRdWVyeVBhdGggJiYga2V5cy5sZW5ndGggPiAxICYmICFpc0V4cHJlc3Npb24ocXVlcnkpKSB7XG4gICAgICByZXR1cm4gbmV4dChjb252ZXJ0VG9FeHBsaWNpdChxdWVyeSkpXG4gICAgfVxuXG4gICAgaWYgKGlzTGVhZihxdWVyeSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IGlzUXVlcnlQYXRoID8gcXVlcnlbS2V5VHlwZS5QQVRIXSA6IGtleXNbMF07XG5cbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBpc1F1ZXJ5UGF0aCA/IHF1ZXJ5W0tleVR5cGUuUEFUVEVSTl0gOiBxdWVyeVtrZXldO1xuXG4gICAgICBpZiAoIWlzU3RyaW5nKHBhdHRlcm4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihMT0dJQ0FMX1NFQVJDSF9JTlZBTElEX1FVRVJZX0ZPUl9LRVkoa2V5KSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2JqID0ge1xuICAgICAgICBrZXlJZDogY3JlYXRlS2V5SWQoa2V5KSxcbiAgICAgICAgcGF0dGVyblxuICAgICAgfTtcblxuICAgICAgaWYgKGF1dG8pIHtcbiAgICAgICAgb2JqLnNlYXJjaGVyID0gY3JlYXRlU2VhcmNoZXIocGF0dGVybiwgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmpcbiAgICB9XG5cbiAgICBsZXQgbm9kZSA9IHtcbiAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgIG9wZXJhdG9yOiBrZXlzWzBdXG4gICAgfTtcblxuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHF1ZXJ5W2tleV07XG5cbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgbm9kZS5jaGlsZHJlbi5wdXNoKG5leHQoaXRlbSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBub2RlXG4gIH07XG5cbiAgaWYgKCFpc0V4cHJlc3Npb24ocXVlcnkpKSB7XG4gICAgcXVlcnkgPSBjb252ZXJ0VG9FeHBsaWNpdChxdWVyeSk7XG4gIH1cblxuICByZXR1cm4gbmV4dChxdWVyeSlcbn1cblxuLy8gUHJhY3RpY2FsIHNjb3JpbmcgZnVuY3Rpb25cbmZ1bmN0aW9uIGNvbXB1dGVTY29yZShcbiAgcmVzdWx0cyxcbiAgeyBpZ25vcmVGaWVsZE5vcm0gPSBDb25maWcuaWdub3JlRmllbGROb3JtIH1cbikge1xuICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgIGxldCB0b3RhbFNjb3JlID0gMTtcblxuICAgIHJlc3VsdC5tYXRjaGVzLmZvckVhY2goKHsga2V5LCBub3JtLCBzY29yZSB9KSA9PiB7XG4gICAgICBjb25zdCB3ZWlnaHQgPSBrZXkgPyBrZXkud2VpZ2h0IDogbnVsbDtcblxuICAgICAgdG90YWxTY29yZSAqPSBNYXRoLnBvdyhcbiAgICAgICAgc2NvcmUgPT09IDAgJiYgd2VpZ2h0ID8gTnVtYmVyLkVQU0lMT04gOiBzY29yZSxcbiAgICAgICAgKHdlaWdodCB8fCAxKSAqIChpZ25vcmVGaWVsZE5vcm0gPyAxIDogbm9ybSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXN1bHQuc2NvcmUgPSB0b3RhbFNjb3JlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtTWF0Y2hlcyhyZXN1bHQsIGRhdGEpIHtcbiAgY29uc3QgbWF0Y2hlcyA9IHJlc3VsdC5tYXRjaGVzO1xuICBkYXRhLm1hdGNoZXMgPSBbXTtcblxuICBpZiAoIWlzRGVmaW5lZChtYXRjaGVzKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgbWF0Y2hlcy5mb3JFYWNoKChtYXRjaCkgPT4ge1xuICAgIGlmICghaXNEZWZpbmVkKG1hdGNoLmluZGljZXMpIHx8ICFtYXRjaC5pbmRpY2VzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgeyBpbmRpY2VzLCB2YWx1ZSB9ID0gbWF0Y2g7XG5cbiAgICBsZXQgb2JqID0ge1xuICAgICAgaW5kaWNlcyxcbiAgICAgIHZhbHVlXG4gICAgfTtcblxuICAgIGlmIChtYXRjaC5rZXkpIHtcbiAgICAgIG9iai5rZXkgPSBtYXRjaC5rZXkuc3JjO1xuICAgIH1cblxuICAgIGlmIChtYXRjaC5pZHggPiAtMSkge1xuICAgICAgb2JqLnJlZkluZGV4ID0gbWF0Y2guaWR4O1xuICAgIH1cblxuICAgIGRhdGEubWF0Y2hlcy5wdXNoKG9iaik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1TY29yZShyZXN1bHQsIGRhdGEpIHtcbiAgZGF0YS5zY29yZSA9IHJlc3VsdC5zY29yZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0KFxuICByZXN1bHRzLFxuICBkb2NzLFxuICB7XG4gICAgaW5jbHVkZU1hdGNoZXMgPSBDb25maWcuaW5jbHVkZU1hdGNoZXMsXG4gICAgaW5jbHVkZVNjb3JlID0gQ29uZmlnLmluY2x1ZGVTY29yZVxuICB9ID0ge31cbikge1xuICBjb25zdCB0cmFuc2Zvcm1lcnMgPSBbXTtcblxuICBpZiAoaW5jbHVkZU1hdGNoZXMpIHRyYW5zZm9ybWVycy5wdXNoKHRyYW5zZm9ybU1hdGNoZXMpO1xuICBpZiAoaW5jbHVkZVNjb3JlKSB0cmFuc2Zvcm1lcnMucHVzaCh0cmFuc2Zvcm1TY29yZSk7XG5cbiAgcmV0dXJuIHJlc3VsdHMubWFwKChyZXN1bHQpID0+IHtcbiAgICBjb25zdCB7IGlkeCB9ID0gcmVzdWx0O1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGl0ZW06IGRvY3NbaWR4XSxcbiAgICAgIHJlZkluZGV4OiBpZHhcbiAgICB9O1xuXG4gICAgaWYgKHRyYW5zZm9ybWVycy5sZW5ndGgpIHtcbiAgICAgIHRyYW5zZm9ybWVycy5mb3JFYWNoKCh0cmFuc2Zvcm1lcikgPT4ge1xuICAgICAgICB0cmFuc2Zvcm1lcihyZXN1bHQsIGRhdGEpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFcbiAgfSlcbn1cblxuY2xhc3MgRnVzZSB7XG4gIGNvbnN0cnVjdG9yKGRvY3MsIG9wdGlvbnMgPSB7fSwgaW5kZXgpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7IC4uLkNvbmZpZywgLi4ub3B0aW9ucyB9O1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5vcHRpb25zLnVzZUV4dGVuZGVkU2VhcmNoICYmXG4gICAgICAhdHJ1ZVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKEVYVEVOREVEX1NFQVJDSF9VTkFWQUlMQUJMRSlcbiAgICB9XG5cbiAgICB0aGlzLl9rZXlTdG9yZSA9IG5ldyBLZXlTdG9yZSh0aGlzLm9wdGlvbnMua2V5cyk7XG5cbiAgICB0aGlzLnNldENvbGxlY3Rpb24oZG9jcywgaW5kZXgpO1xuICB9XG5cbiAgc2V0Q29sbGVjdGlvbihkb2NzLCBpbmRleCkge1xuICAgIHRoaXMuX2RvY3MgPSBkb2NzO1xuXG4gICAgaWYgKGluZGV4ICYmICEoaW5kZXggaW5zdGFuY2VvZiBGdXNlSW5kZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoSU5DT1JSRUNUX0lOREVYX1RZUEUpXG4gICAgfVxuXG4gICAgdGhpcy5fbXlJbmRleCA9XG4gICAgICBpbmRleCB8fFxuICAgICAgY3JlYXRlSW5kZXgodGhpcy5vcHRpb25zLmtleXMsIHRoaXMuX2RvY3MsIHtcbiAgICAgICAgZ2V0Rm46IHRoaXMub3B0aW9ucy5nZXRGbixcbiAgICAgICAgZmllbGROb3JtV2VpZ2h0OiB0aGlzLm9wdGlvbnMuZmllbGROb3JtV2VpZ2h0XG4gICAgICB9KTtcbiAgfVxuXG4gIGFkZChkb2MpIHtcbiAgICBpZiAoIWlzRGVmaW5lZChkb2MpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9kb2NzLnB1c2goZG9jKTtcbiAgICB0aGlzLl9teUluZGV4LmFkZChkb2MpO1xuICB9XG5cbiAgcmVtb3ZlKHByZWRpY2F0ZSA9ICgvKiBkb2MsIGlkeCAqLykgPT4gZmFsc2UpIHtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5fZG9jcy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgY29uc3QgZG9jID0gdGhpcy5fZG9jc1tpXTtcbiAgICAgIGlmIChwcmVkaWNhdGUoZG9jLCBpKSkge1xuICAgICAgICB0aGlzLnJlbW92ZUF0KGkpO1xuICAgICAgICBpIC09IDE7XG4gICAgICAgIGxlbiAtPSAxO1xuXG4gICAgICAgIHJlc3VsdHMucHVzaChkb2MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzXG4gIH1cblxuICByZW1vdmVBdChpZHgpIHtcbiAgICB0aGlzLl9kb2NzLnNwbGljZShpZHgsIDEpO1xuICAgIHRoaXMuX215SW5kZXgucmVtb3ZlQXQoaWR4KTtcbiAgfVxuXG4gIGdldEluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLl9teUluZGV4XG4gIH1cblxuICBzZWFyY2gocXVlcnksIHsgbGltaXQgPSAtMSB9ID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBpbmNsdWRlTWF0Y2hlcyxcbiAgICAgIGluY2x1ZGVTY29yZSxcbiAgICAgIHNob3VsZFNvcnQsXG4gICAgICBzb3J0Rm4sXG4gICAgICBpZ25vcmVGaWVsZE5vcm1cbiAgICB9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgbGV0IHJlc3VsdHMgPSBpc1N0cmluZyhxdWVyeSlcbiAgICAgID8gaXNTdHJpbmcodGhpcy5fZG9jc1swXSlcbiAgICAgICAgPyB0aGlzLl9zZWFyY2hTdHJpbmdMaXN0KHF1ZXJ5KVxuICAgICAgICA6IHRoaXMuX3NlYXJjaE9iamVjdExpc3QocXVlcnkpXG4gICAgICA6IHRoaXMuX3NlYXJjaExvZ2ljYWwocXVlcnkpO1xuXG4gICAgY29tcHV0ZVNjb3JlKHJlc3VsdHMsIHsgaWdub3JlRmllbGROb3JtIH0pO1xuXG4gICAgaWYgKHNob3VsZFNvcnQpIHtcbiAgICAgIHJlc3VsdHMuc29ydChzb3J0Rm4pO1xuICAgIH1cblxuICAgIGlmIChpc051bWJlcihsaW1pdCkgJiYgbGltaXQgPiAtMSkge1xuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc2xpY2UoMCwgbGltaXQpO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXQocmVzdWx0cywgdGhpcy5fZG9jcywge1xuICAgICAgaW5jbHVkZU1hdGNoZXMsXG4gICAgICBpbmNsdWRlU2NvcmVcbiAgICB9KVxuICB9XG5cbiAgX3NlYXJjaFN0cmluZ0xpc3QocXVlcnkpIHtcbiAgICBjb25zdCBzZWFyY2hlciA9IGNyZWF0ZVNlYXJjaGVyKHF1ZXJ5LCB0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHsgcmVjb3JkcyB9ID0gdGhpcy5fbXlJbmRleDtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgZXZlcnkgc3RyaW5nIGluIHRoZSBpbmRleFxuICAgIHJlY29yZHMuZm9yRWFjaCgoeyB2OiB0ZXh0LCBpOiBpZHgsIG46IG5vcm0gfSkgPT4ge1xuICAgICAgaWYgKCFpc0RlZmluZWQodGV4dCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgaXNNYXRjaCwgc2NvcmUsIGluZGljZXMgfSA9IHNlYXJjaGVyLnNlYXJjaEluKHRleHQpO1xuXG4gICAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgIGl0ZW06IHRleHQsXG4gICAgICAgICAgaWR4LFxuICAgICAgICAgIG1hdGNoZXM6IFt7IHNjb3JlLCB2YWx1ZTogdGV4dCwgbm9ybSwgaW5kaWNlcyB9XVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHRzXG4gIH1cblxuICBfc2VhcmNoTG9naWNhbChxdWVyeSkge1xuXG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHBhcnNlKHF1ZXJ5LCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgY29uc3QgZXZhbHVhdGUgPSAobm9kZSwgaXRlbSwgaWR4KSA9PiB7XG4gICAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgeyBrZXlJZCwgc2VhcmNoZXIgfSA9IG5vZGU7XG5cbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuX2ZpbmRNYXRjaGVzKHtcbiAgICAgICAgICBrZXk6IHRoaXMuX2tleVN0b3JlLmdldChrZXlJZCksXG4gICAgICAgICAgdmFsdWU6IHRoaXMuX215SW5kZXguZ2V0VmFsdWVGb3JJdGVtQXRLZXlJZChpdGVtLCBrZXlJZCksXG4gICAgICAgICAgc2VhcmNoZXJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZHgsXG4gICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgIG1hdGNoZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW11cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV2YWx1YXRlKGNoaWxkLCBpdGVtLCBpZHgpO1xuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgIHJlcy5wdXNoKC4uLnJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5vcGVyYXRvciA9PT0gTG9naWNhbE9wZXJhdG9yLkFORCkge1xuICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzXG4gICAgfTtcblxuICAgIGNvbnN0IHJlY29yZHMgPSB0aGlzLl9teUluZGV4LnJlY29yZHM7XG4gICAgY29uc3QgcmVzdWx0TWFwID0ge307XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuXG4gICAgcmVjb3Jkcy5mb3JFYWNoKCh7ICQ6IGl0ZW0sIGk6IGlkeCB9KSA9PiB7XG4gICAgICBpZiAoaXNEZWZpbmVkKGl0ZW0pKSB7XG4gICAgICAgIGxldCBleHBSZXN1bHRzID0gZXZhbHVhdGUoZXhwcmVzc2lvbiwgaXRlbSwgaWR4KTtcblxuICAgICAgICBpZiAoZXhwUmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBEZWR1cGUgd2hlbiBhZGRpbmdcbiAgICAgICAgICBpZiAoIXJlc3VsdE1hcFtpZHhdKSB7XG4gICAgICAgICAgICByZXN1bHRNYXBbaWR4XSA9IHsgaWR4LCBpdGVtLCBtYXRjaGVzOiBbXSB9O1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdE1hcFtpZHhdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXhwUmVzdWx0cy5mb3JFYWNoKCh7IG1hdGNoZXMgfSkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0TWFwW2lkeF0ubWF0Y2hlcy5wdXNoKC4uLm1hdGNoZXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0c1xuICB9XG5cbiAgX3NlYXJjaE9iamVjdExpc3QocXVlcnkpIHtcbiAgICBjb25zdCBzZWFyY2hlciA9IGNyZWF0ZVNlYXJjaGVyKHF1ZXJ5LCB0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHsga2V5cywgcmVjb3JkcyB9ID0gdGhpcy5fbXlJbmRleDtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG5cbiAgICAvLyBMaXN0IGlzIEFycmF5PE9iamVjdD5cbiAgICByZWNvcmRzLmZvckVhY2goKHsgJDogaXRlbSwgaTogaWR4IH0pID0+IHtcbiAgICAgIGlmICghaXNEZWZpbmVkKGl0ZW0pKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBsZXQgbWF0Y2hlcyA9IFtdO1xuXG4gICAgICAvLyBJdGVyYXRlIG92ZXIgZXZlcnkga2V5IChpLmUsIHBhdGgpLCBhbmQgZmV0Y2ggdGhlIHZhbHVlIGF0IHRoYXQga2V5XG4gICAgICBrZXlzLmZvckVhY2goKGtleSwga2V5SW5kZXgpID0+IHtcbiAgICAgICAgbWF0Y2hlcy5wdXNoKFxuICAgICAgICAgIC4uLnRoaXMuX2ZpbmRNYXRjaGVzKHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtW2tleUluZGV4XSxcbiAgICAgICAgICAgIHNlYXJjaGVyXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobWF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICBpZHgsXG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBtYXRjaGVzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfVxuICBfZmluZE1hdGNoZXMoeyBrZXksIHZhbHVlLCBzZWFyY2hlciB9KSB7XG4gICAgaWYgKCFpc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICBsZXQgbWF0Y2hlcyA9IFtdO1xuXG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB2YWx1ZS5mb3JFYWNoKCh7IHY6IHRleHQsIGk6IGlkeCwgbjogbm9ybSB9KSA9PiB7XG4gICAgICAgIGlmICghaXNEZWZpbmVkKHRleHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGlzTWF0Y2gsIHNjb3JlLCBpbmRpY2VzIH0gPSBzZWFyY2hlci5zZWFyY2hJbih0ZXh0KTtcblxuICAgICAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgICAgIG1hdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBzY29yZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlOiB0ZXh0LFxuICAgICAgICAgICAgaWR4LFxuICAgICAgICAgICAgbm9ybSxcbiAgICAgICAgICAgIGluZGljZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgdjogdGV4dCwgbjogbm9ybSB9ID0gdmFsdWU7XG5cbiAgICAgIGNvbnN0IHsgaXNNYXRjaCwgc2NvcmUsIGluZGljZXMgfSA9IHNlYXJjaGVyLnNlYXJjaEluKHRleHQpO1xuXG4gICAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgICBtYXRjaGVzLnB1c2goeyBzY29yZSwga2V5LCB2YWx1ZTogdGV4dCwgbm9ybSwgaW5kaWNlcyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hlc1xuICB9XG59XG5cbkZ1c2UudmVyc2lvbiA9ICc2LjYuMic7XG5GdXNlLmNyZWF0ZUluZGV4ID0gY3JlYXRlSW5kZXg7XG5GdXNlLnBhcnNlSW5kZXggPSBwYXJzZUluZGV4O1xuRnVzZS5jb25maWcgPSBDb25maWc7XG5cbntcbiAgRnVzZS5wYXJzZVF1ZXJ5ID0gcGFyc2U7XG59XG5cbntcbiAgcmVnaXN0ZXIoRXh0ZW5kZWRTZWFyY2gpO1xufVxuXG5leHBvcnQgeyBGdXNlIGFzIGRlZmF1bHQgfTtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wYXJlVmVyc2lvbnModjEsIHYyKSB7XG4gIC8vIHZhbGlkYXRlIGlucHV0IGFuZCBzcGxpdCBpbnRvIHNlZ21lbnRzXG4gIGNvbnN0IG4xID0gdmFsaWRhdGVBbmRQYXJzZSh2MSk7XG4gIGNvbnN0IG4yID0gdmFsaWRhdGVBbmRQYXJzZSh2Mik7XG5cbiAgLy8gcG9wIG9mZiB0aGUgcGF0Y2hcbiAgY29uc3QgcDEgPSBuMS5wb3AoKTtcbiAgY29uc3QgcDIgPSBuMi5wb3AoKTtcblxuICAvLyB2YWxpZGF0ZSBudW1iZXJzXG4gIGNvbnN0IHIgPSBjb21wYXJlU2VnbWVudHMobjEsIG4yKTtcbiAgaWYgKHIgIT09IDApIHJldHVybiByO1xuXG4gIC8vIHZhbGlkYXRlIHByZS1yZWxlYXNlXG4gIGlmIChwMSAmJiBwMikge1xuICAgIHJldHVybiBjb21wYXJlU2VnbWVudHMocDEuc3BsaXQoJy4nKSwgcDIuc3BsaXQoJy4nKSk7XG4gIH0gZWxzZSBpZiAocDEgfHwgcDIpIHtcbiAgICByZXR1cm4gcDEgPyAtMSA6IDE7XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlID0gKHYpID0+XG4gIHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiAvXlt2XFxkXS8udGVzdCh2KSAmJiBzZW12ZXIudGVzdCh2KTtcblxuZXhwb3J0IGNvbnN0IGNvbXBhcmUgPSAodjEsIHYyLCBvcGVyYXRvcikgPT4ge1xuICAvLyB2YWxpZGF0ZSBpbnB1dCBvcGVyYXRvclxuICBhc3NlcnRWYWxpZE9wZXJhdG9yKG9wZXJhdG9yKTtcblxuICAvLyBzaW5jZSByZXN1bHQgb2YgY29tcGFyZVZlcnNpb25zIGNhbiBvbmx5IGJlIC0xIG9yIDAgb3IgMVxuICAvLyBhIHNpbXBsZSBtYXAgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSBzd2l0Y2hcbiAgY29uc3QgcmVzID0gY29tcGFyZVZlcnNpb25zKHYxLCB2Mik7XG5cbiAgcmV0dXJuIG9wZXJhdG9yUmVzTWFwW29wZXJhdG9yXS5pbmNsdWRlcyhyZXMpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNhdGlzZmllcyA9ICh2LCByKSA9PiB7XG4gIC8vIGlmIG5vIHJhbmdlIG9wZXJhdG9yIHRoZW4gXCI9XCJcbiAgY29uc3QgbSA9IHIubWF0Y2goL14oWzw+PX5eXSspLyk7XG4gIGNvbnN0IG9wID0gbSA/IG1bMV0gOiAnPSc7XG5cbiAgLy8gaWYgZ3QvbHQvZXEgdGhlbiBvcGVyYXRvciBjb21wYXJlXG4gIGlmIChvcCAhPT0gJ14nICYmIG9wICE9PSAnficpIHJldHVybiBjb21wYXJlKHYsIHIsIG9wKTtcblxuICAvLyBlbHNlIHJhbmdlIG9mIGVpdGhlciBcIn5cIiBvciBcIl5cIiBpcyBhc3N1bWVkXG4gIGNvbnN0IFt2MSwgdjIsIHYzXSA9IHZhbGlkYXRlQW5kUGFyc2Uodik7XG4gIGNvbnN0IFtyMSwgcjIsIHIzXSA9IHZhbGlkYXRlQW5kUGFyc2Uocik7XG4gIGlmIChjb21wYXJlU3RyaW5ncyh2MSwgcjEpICE9PSAwKSByZXR1cm4gZmFsc2U7XG4gIGlmIChvcCA9PT0gJ14nKSB7XG4gICAgcmV0dXJuIGNvbXBhcmVTZWdtZW50cyhbdjIsIHYzXSwgW3IyLCByM10pID49IDA7XG4gIH1cbiAgaWYgKGNvbXBhcmVTdHJpbmdzKHYyLCByMikgIT09IDApIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGNvbXBhcmVTdHJpbmdzKHYzLCByMykgPj0gMDtcbn07XG5cbi8vIGV4cG9ydCBDSlMgc3R5bGUgZm9yIHBhcml0eVxuY29tcGFyZVZlcnNpb25zLnZhbGlkYXRlID0gdmFsaWRhdGU7XG5jb21wYXJlVmVyc2lvbnMuY29tcGFyZSA9IGNvbXBhcmU7XG5jb21wYXJlVmVyc2lvbnMuc2FzdGlzZmllcyA9IHNhdGlzZmllcztcblxuY29uc3Qgc2VtdmVyID1cbiAgL15bdl5+PD49XSo/KFxcZCspKD86XFwuKFt4Kl18XFxkKykoPzpcXC4oW3gqXXxcXGQrKSg/OlxcLihbeCpdfFxcZCspKT8oPzotKFtcXGRhLXpcXC1dKyg/OlxcLltcXGRhLXpcXC1dKykqKSk/KD86XFwrW1xcZGEtelxcLV0rKD86XFwuW1xcZGEtelxcLV0rKSopPyk/KT8kL2k7XG5cbmNvbnN0IHZhbGlkYXRlQW5kUGFyc2UgPSAodikgPT4ge1xuICBpZiAodHlwZW9mIHYgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudCBleHBlY3RlZCBzdHJpbmcnKTtcbiAgfVxuICBjb25zdCBtYXRjaCA9IHYubWF0Y2goc2VtdmVyKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcmd1bWVudCBub3QgdmFsaWQgc2VtdmVyICgnJHt2fScgcmVjZWl2ZWQpYCk7XG4gIH1cbiAgbWF0Y2guc2hpZnQoKTtcbiAgcmV0dXJuIG1hdGNoO1xufTtcblxuY29uc3QgaXNXaWxkY2FyZCA9IChzKSA9PiBzID09PSAnKicgfHwgcyA9PT0gJ3gnIHx8IHMgPT09ICdYJztcblxuY29uc3QgdHJ5UGFyc2UgPSAodikgPT4ge1xuICBjb25zdCBuID0gcGFyc2VJbnQodiwgMTApO1xuICByZXR1cm4gaXNOYU4obikgPyB2IDogbjtcbn07XG5cbmNvbnN0IGZvcmNlVHlwZSA9IChhLCBiKSA9PlxuICB0eXBlb2YgYSAhPT0gdHlwZW9mIGIgPyBbU3RyaW5nKGEpLCBTdHJpbmcoYildIDogW2EsIGJdO1xuXG5jb25zdCBjb21wYXJlU3RyaW5ncyA9IChhLCBiKSA9PiB7XG4gIGlmIChpc1dpbGRjYXJkKGEpIHx8IGlzV2lsZGNhcmQoYikpIHJldHVybiAwO1xuICBjb25zdCBbYXAsIGJwXSA9IGZvcmNlVHlwZSh0cnlQYXJzZShhKSwgdHJ5UGFyc2UoYikpO1xuICBpZiAoYXAgPiBicCkgcmV0dXJuIDE7XG4gIGlmIChhcCA8IGJwKSByZXR1cm4gLTE7XG4gIHJldHVybiAwO1xufTtcblxuY29uc3QgY29tcGFyZVNlZ21lbnRzID0gKGEsIGIpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpOyBpKyspIHtcbiAgICBjb25zdCByID0gY29tcGFyZVN0cmluZ3MoYVtpXSB8fCAwLCBiW2ldIHx8IDApO1xuICAgIGlmIChyICE9PSAwKSByZXR1cm4gcjtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbmNvbnN0IG9wZXJhdG9yUmVzTWFwID0ge1xuICAnPic6IFsxXSxcbiAgJz49JzogWzAsIDFdLFxuICAnPSc6IFswXSxcbiAgJzw9JzogWy0xLCAwXSxcbiAgJzwnOiBbLTFdLFxufTtcblxuY29uc3QgYWxsb3dlZE9wZXJhdG9ycyA9IE9iamVjdC5rZXlzKG9wZXJhdG9yUmVzTWFwKTtcblxuY29uc3QgYXNzZXJ0VmFsaWRPcGVyYXRvciA9IChvcCkgPT4ge1xuICBpZiAodHlwZW9mIG9wICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgSW52YWxpZCBvcGVyYXRvciB0eXBlLCBleHBlY3RlZCBzdHJpbmcgYnV0IGdvdCAke3R5cGVvZiBvcH1gXG4gICAgKTtcbiAgfVxuICBpZiAoYWxsb3dlZE9wZXJhdG9ycy5pbmRleE9mKG9wKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBvcGVyYXRvciwgZXhwZWN0ZWQgb25lIG9mICR7YWxsb3dlZE9wZXJhdG9ycy5qb2luKCd8Jyl9YFxuICAgICk7XG4gIH1cbn07XG4iLCAiaW1wb3J0IGNvbXBhcmVWZXJzaW9ucywgeyBjb21wYXJlLCBzYXRpc2ZpZXMgfSBmcm9tIFwiY29tcGFyZS12ZXJzaW9uc1wiO1xuaW1wb3J0IGVtb2ppIGZyb20gXCJub2RlLWVtb2ppXCI7XG5cbmltcG9ydCBQYWNrTWFuYWdlciBmcm9tIFwiLi4vaWNvbi1wYWNrcy9wYWNrLW1hbmFnZXJcIjtcbmltcG9ydCB7IEljb25EYXRhLCBJY29uSW5mbyB9IGZyb20gXCIuLi9pY29uLXBhY2tzL3R5cGVzXCI7XG5pbXBvcnQgSWNvblNDIGZyb20gXCIuLi9pc2MtbWFpblwiO1xuaW1wb3J0IHsgRW1vamlTdWdnZXN0ZXJNb2RhbCB9IGZyb20gXCIuLi9tb2R1bGVzL3N1Z2dlc3RlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgSWNvblNDQVBJIHtcbiAgaGFzSWNvbjogKGlkOiBzdHJpbmcpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpZCBhY2NlcHQgc2hvcnRjb2RlIHdpdGggY29sb25zXG4gICAqIEBwYXJhbSByYXcgaWYgdHJ1ZSwgcmV0dXJuIHN0cmluZyAoZW1vamkpIG9yIGRhdGEgdXJpL3Jlc291cmNlIHBhdGggaW5zdGVhZCBvZiBzcGFuIGVsZW1lbnRcbiAgICogQHJldHVybnMgc3RyaW5nIChlbW9qaSkgb3IgZGF0YSB1cmkvcmVzb3VyY2UgcGF0aCAoaWNvbnMpOyBudWxsIGlmIGdpdmVuIGlkIGlzIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0SWNvbihpZDogc3RyaW5nLCByYXc6IHRydWUpOiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogQHBhcmFtIGlkIGFjY2VwdCBzaG9ydGNvZGUgd2l0aCBjb2xvbnNcbiAgICogQHBhcmFtIHJhdyBpZiB0cnVlLCByZXR1cm4gc3ZnIGRhdGEgdXJpIGluc3RlYWQgb2Ygc3BhbiBlbGVtZW50XG4gICAqIEByZXR1cm5zIHNwYW4gZWxlbWVudCBjb250YWluaW5nIHRoZSBpY29uIHN0cmluZyhlbW9qaSkgb3IgaW1nIGVsZW1lbnQ7IG51bGwgaWYgZ2l2ZW4gaWQgaXMgbm90IGZvdW5kXG4gICAqL1xuICBnZXRJY29uKGlkOiBzdHJpbmcsIHJhdz86IGZhbHNlKTogSFRNTFNwYW5FbGVtZW50IHwgbnVsbDtcblxuICAvKipcbiAgICogZ2V0IHJhdyBzdmcgY29udGVudCBvZiBpY29uIHdoZW4gYXZhaWxhYmxlXG4gICAqIEBwYXJhbSBpZCBhY2NlcHQgc2hvcnRjb2RlIHdpdGggY29sb25zXG4gICAqIEBwYXJhbSByYXcgaWYgdHJ1ZSwgcmV0dXJuIHN2ZyBjb250ZW50ICh3aGVuIGdpdmVuIHN2ZyBpY29uKSAvICBpbnN0ZWFkIG9mIHNwYW4gZWxlbWVudFxuICAgKiBAcmV0dXJucyBzdHJpbmcgKGVtb2ppKSBvciBzdmcgY29udGVudCAoc3ZnIGljb24pIG9yIHJlc291cmNlIHBhdGggKGJpdG1hcCBpY29uKTsgbnVsbCBpZiBnaXZlbiBpZCBpcyBub3QgZm91bmRcbiAgICovXG4gIGdldFNWR0ljb24oaWQ6IHN0cmluZywgcmF3OiB0cnVlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgLyoqXG4gICAqIGdldCBpbmxpbmUgc3ZnIHZlcnNpb24gb2YgaWNvbiB3aGVuIGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gaWQgYWNjZXB0IHNob3J0Y29kZSB3aXRoIGNvbG9uc1xuICAgKiBAcGFyYW0gcmF3IGlmIHRydWUsIHJldHVybiBzdHJpbmcgKGVtb2ppKSBvciBzdmcgY29udGVudCAoc3ZnIGljb24pIG9yIHJlc291cmNlIHBhdGggKGJpdG1hcCBpY29uKSBpbnN0ZWFkIG9mIHNwYW4gZWxlbWVudFxuICAgKiBAcmV0dXJucyBzcGFuIGVsZW1lbnQgY29udGFpbmluZyB0aGUgZW1vamkgc3RyaW5nIG9yIHN2ZyBlbGVtZW50IChzdmcgaWNvbikgb3IgaW1nIGVsZW1lbnQgKGJpdG1hcCBpY29uKTsgbnVsbCBpZiBnaXZlbiBpZCBpcyBub3QgZm91bmRcbiAgICovXG4gIGdldFNWR0ljb24oaWQ6IHN0cmluZywgcmF3PzogZmFsc2UpOiBQcm9taXNlPEhUTUxTcGFuRWxlbWVudCB8IG51bGw+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gaWQgYWNjZXB0IHNob3J0Y29kZSB3aXRoIGNvbG9uc1xuICAgKiBAcmV0dXJucyBmdWxsIGRhdGEgKGluY2x1ZGluZyBjaGFyYWN0ZXIvcGF0aC9zdmcgY29udGVudCBkZXBlbmRpbmcgb24gc3BlY2lmaWMgdHlwZSkgYWJvdXQgaWNvblxuICAgKiBpZiBnaXZlbiBpZCBpcyBmb3VuZDsgbnVsbCBpZiBnaXZlbiBpZCBpcyBub3QgZm91bmRcbiAgICovXG4gIGdldEljb25EYXRhKGlkOiBzdHJpbmcpOiBJY29uRGF0YSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFByb21wdCB1c2VyIGZvciBpY29uLCBhdmFpbGFibGUgc2luY2UgdjAuNi4xXG4gICAqIEByZXR1cm5zIGljb24gaW5mbyBpbmNsdWRpbmcgaWQgaWYgdXNlciBjaG9vc2Ugb25lOyBudWxsIGlmIHVzZXIgY2FuY2VsXG4gICAqL1xuICBnZXRJY29uRnJvbVVzZXIoKTogUHJvbWlzZTxJY29uSW5mbyB8IG51bGw+O1xuXG4gIGlzRW1vamk6IChzdHI6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogQHBhcmFtIHJlcGxhY2VyIHRha2VzIGEgdmFpbGQgYW5kIGV4aXN0aW5nIDpzaG9ydGNvZGU6IGFuZCByZXR1cm5zIGEgc3RyaW5nXG4gICAqL1xuICBwb3N0UHJvY2Vzc29yKGlucHV0OiBzdHJpbmcsIHJlcGxhY2VyOiAoc2hvcnRjb2RlOiBzdHJpbmcpID0+IHN0cmluZyk6IHN0cmluZztcbiAgcG9zdFByb2Nlc3NvcihpbnB1dDogSFRNTEVsZW1lbnQpOiB2b2lkO1xuXG4gIHZlcnNpb246IHtcbiAgICBjdXJyZW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ29tcGFyZSBbc2VtdmVyXShodHRwczovL3NlbXZlci5vcmcvKSB2ZXJzaW9uIHN0cmluZ3MgdXNpbmcgdGhlIHNwZWNpZmllZCBvcGVyYXRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2ZXJUb0NvbXBhcmUgdmVyc2lvbiB0byBjb21wYXJlXG4gICAgICogQHBhcmFtIG9wZXJhdG9yIEFsbG93ZWQgYXJpdGhtZXRpYyBvcGVyYXRvciB0byB1c2VcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgdmVyVG9Db21wYXJlIGFuZCB0aGUgY3VycmVudCB2ZXJzaW9uIHNhdGlzZmllcyB0aGUgb3BlcmF0b3IsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiBjdXJyVmVyID0gJzEwLjEuMSc7XG4gICAgICogY29tcGFyZSgnPCcsICcxMC4yLjInKTsgLy8gcmV0dXJuIHRydWVcbiAgICAgKiBjb21wYXJlKCc8PScsICcxMC4yLjInKTsgLy8gcmV0dXJuIHRydWVcbiAgICAgKiBjb21wYXJlKCc+PScgJzEwLjIuMicpOyAvLyByZXR1cm4gZmFsc2VcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb21wYXJlKFxuICAgICAgb3BlcmF0b3I6IGNvbXBhcmVWZXJzaW9ucy5Db21wYXJlT3BlcmF0b3IsXG4gICAgICB2ZXJUb0NvbXBhcmU6IHN0cmluZyxcbiAgICApOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIE1hdGNoIFtucG0gc2VtdmVyXShodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92Ni91c2luZy1ucG0vc2VtdmVyKSB2ZXJzaW9uIHJhbmdlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhbmdlIFJhbmdlIHBhdHRlcm4gZm9yIHZlcnNpb25cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGN1cnJlbnQgdmVyc2lvbiBudW1iZXIgaXMgd2l0aGluIHRoZSByYW5nZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIGN1cnJWZXIgPSAnMS4xLjAnO1xuICAgICAqIHNhdGlzZmllcygnXjEuMC4wJyk7IC8vIHJldHVybiB0cnVlXG4gICAgICogc2F0aXNmaWVzKCd+MS4wLjAnKTsgLy8gcmV0dXJuIGZhbHNlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2F0aXNmaWVzKHJhbmdlOiBzdHJpbmcpOiBib29sZWFuO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgZXZ0UHJlZml4ID0gXCJpY29uc2M6XCIgYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBQTUV2ZW50cyA9XG4gIHwgW25hbWU6IFwiY2hhbmdlZFwiLCBhcGk6IEljb25TQ0FQSSwgYWZmZWN0ZWQ/OiBzdHJpbmdbXV1cbiAgfCBbbmFtZTogXCJpbml0aWFsaXplZFwiLCBhcGk6IEljb25TQ0FQSV07XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgLy8gTXVzdCB1c2UgdmFyLCBubyBjb25zdC9sZXRcbiAgdmFyIEljb25TQ0FQSXYwOiBJY29uU0NBUEkgfCB1bmRlZmluZWQ7XG59XG5leHBvcnQgdHlwZSBBUElfTkFNRSA9IFwiSWNvblNDQVBJdjBcIjtcblxuZXhwb3J0IGNvbnN0IGdldEFwaSA9IChcbiAgcGFja01hbmFnZXI6IFBhY2tNYW5hZ2VyLFxuICBwbHVnaW46IEljb25TQyxcbik6IEljb25TQ0FQSSA9PiAoe1xuICBoYXNJY29uOiBwYWNrTWFuYWdlci5oYXNJY29uLmJpbmQocGFja01hbmFnZXIpLFxuICBnZXRJY29uOiBwYWNrTWFuYWdlci5nZXRJY29uLmJpbmQocGFja01hbmFnZXIpLFxuICBnZXRJY29uRGF0YTogcGFja01hbmFnZXIuZ2V0SWNvbkRhdGEuYmluZChwYWNrTWFuYWdlciksXG4gIGdldFNWR0ljb246IHBhY2tNYW5hZ2VyLmdldFNWR0ljb24uYmluZChwYWNrTWFuYWdlciksXG4gIGdldEljb25Gcm9tVXNlcjogKCkgPT4gbmV3IEVtb2ppU3VnZ2VzdGVyTW9kYWwocGx1Z2luKS5vcGVuKCksXG4gIGlzRW1vamk6IGVtb2ppLmhhc0Vtb2ppLmJpbmQoZW1vamkpLFxuICBwb3N0UHJvY2Vzc29yOiBwbHVnaW4ucG9zdFByb2Nlc3Nvci5iaW5kKHBsdWdpbiksXG4gIHZlcnNpb246IHtcbiAgICBnZXQgY3VycmVudCgpIHtcbiAgICAgIHJldHVybiBwbHVnaW4ubWFuaWZlc3QudmVyc2lvbjtcbiAgICB9LFxuICAgIGNvbXBhcmU6IChvcCwgdmVyKSA9PiBjb21wYXJlKHBsdWdpbi5tYW5pZmVzdC52ZXJzaW9uLCB2ZXIsIG9wKSxcbiAgICBzYXRpc2ZpZXM6IChyYW5nZSkgPT4gc2F0aXNmaWVzKHBsdWdpbi5tYW5pZmVzdC52ZXJzaW9uLCByYW5nZSksXG4gIH0sXG59KTtcbiIsICJpbXBvcnQgRnVzZSBmcm9tIFwiZnVzZS5qc1wiO1xuaW1wb3J0IHtcbiAgRWRpdG9yLFxuICBFZGl0b3JQb3NpdGlvbixcbiAgRWRpdG9yU3VnZ2VzdCxcbiAgRWRpdG9yU3VnZ2VzdENvbnRleHQsXG4gIEVkaXRvclN1Z2dlc3RUcmlnZ2VySW5mbyxcbiAgU3VnZ2VzdE1vZGFsLFxufSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IFBhY2tNYW5hZ2VyIGZyb20gXCIuLi9pY29uLXBhY2tzL3BhY2stbWFuYWdlclwiO1xuaW1wb3J0IHsgRnV6enlNYXRjaCwgSWNvbkluZm8gfSBmcm9tIFwiLi4vaWNvbi1wYWNrcy90eXBlc1wiO1xuaW1wb3J0IEljb25TQyBmcm9tIFwiLi4vaXNjLW1haW5cIjtcbmltcG9ydCBVbmlvblJhbmdlcyBmcm9tIFwiLi91bmlvblwiO1xuXG5jb25zdCBDTEFTU19JRCA9IFwiaXNjXCI7XG5cbmludGVyZmFjZSBTdWdnZXN0ZXJCYXNlIHtcbiAgcGFja01hbmFnZXI6IFBhY2tNYW5hZ2VyO1xufVxuY29uc3QgZ2V0U3VnZ2VzdGlvbnMgPSAoaW5wdXQ6IHN0cmluZywgcGFja01hbmFnZXI6IFBhY2tNYW5hZ2VyKSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIgJiYgaW5wdXQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFja01hbmFnZXIuc2VhcmNoKGlucHV0LnJlcGxhY2UoL15cXCt8XFwrJC9nLCBcIlwiKS5zcGxpdCgvWytdL2cpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcGFja01hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gIH1cbn07XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWFycm93L3ByZWZlci1hcnJvdy1mdW5jdGlvbnNcbmFzeW5jIGZ1bmN0aW9uIHJlbmRlclN1Z2dlc3Rpb24oXG4gIHRoaXM6IFN1Z2dlc3RlckJhc2UsXG4gIHN1Z2dlc3Rpb246IEZ1enp5TWF0Y2g8SWNvbkluZm8+LFxuICBlbDogSFRNTEVsZW1lbnQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBpZCwgbmFtZSB9ID0gc3VnZ2VzdGlvbi5pdGVtLFxuICAgIHsgbWF0Y2hlcyB9ID0gc3VnZ2VzdGlvbixcbiAgICBpY29uRWwgPSBhd2FpdCB0aGlzLnBhY2tNYW5hZ2VyLmdldFNWR0ljb24oaWQpO1xuICBpZiAoIWljb25FbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBnZXQgaWNvbiBmb3Iga2V5OiBcIiArIGlkKTtcblxuICBjb25zdCBzaG9ydGNvZGUgPSBlbDtcbiAgaWYgKG1hdGNoZXMpIHtcbiAgICBjb25zdCBpbmRpY2VzID1cbiAgICAgIG1hdGNoZXMubGVuZ3RoID09PSAxXG4gICAgICAgID8gbWF0Y2hlc1swXS5rZXkgPT09IFwibmFtZVwiXG4gICAgICAgICAgPyBtYXRjaGVzWzBdLmluZGljZXNcbiAgICAgICAgICA6IFtdXG4gICAgICAgIDogVW5pb25SYW5nZXMoXG4gICAgICAgICAgICBtYXRjaGVzLmZsYXRNYXAoKG0pID0+IChtLmtleSA9PT0gXCJuYW1lXCIgPyBtLmluZGljZXMgOiBbXSkpLFxuICAgICAgICAgICk7XG4gICAgcmVuZGVyTWF0Y2hlcyhzaG9ydGNvZGUsIG5hbWUucmVwbGFjZSgvW18tXS9nLCBcIiBcIiksIGluZGljZXMpO1xuICB9IGVsc2Uge1xuICAgIHNob3J0Y29kZS5zZXRUZXh0KG5hbWUucmVwbGFjZSgvW18tXS9nLCBcIiBcIikpO1xuICB9XG4gIGVsLmNyZWF0ZVNwYW4oeyBjbHM6IGBzdWdnZXN0aW9uLWZsYWlyYCB9LCAoZWwpID0+IGVsLmFwcGVuZENoaWxkKGljb25FbCkpO1xufVxuXG5leHBvcnQgY2xhc3MgRW1vamlTdWdnZXN0ZXJNb2RhbFxuICBleHRlbmRzIFN1Z2dlc3RNb2RhbDxGdXp6eU1hdGNoPEljb25JbmZvPj5cbiAgaW1wbGVtZW50cyBTdWdnZXN0ZXJCYXNlXG57XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwbHVnaW46IEljb25TQykge1xuICAgIHN1cGVyKHBsdWdpbi5hcHApO1xuICAgIHRoaXMubW9kYWxFbC5hZGRDbGFzcyhDTEFTU19JRCk7XG4gIH1cbiAgZ2V0IHBhY2tNYW5hZ2VyKCkge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5wYWNrTWFuYWdlcjtcbiAgfVxuXG4gIGdldFN1Z2dlc3Rpb25zKGlucHV0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZ2V0U3VnZ2VzdGlvbnMoaW5wdXQsIHRoaXMucGFja01hbmFnZXIpO1xuICB9XG4gIHJlbmRlclN1Z2dlc3Rpb24gPSByZW5kZXJTdWdnZXN0aW9uO1xuXG4gIC8vIFByb21pc2lmeSB0aGUgbW9kYWxcbiAgcmVzb2x2ZTogKCh2YWx1ZTogSWNvbkluZm8gfCBudWxsKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBvcGVuKCk6IFByb21pc2U8SWNvbkluZm8gfCBudWxsPiB7XG4gICAgc3VwZXIub3BlbigpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB9KTtcbiAgfVxuICBvbkNsb3NlKCkge1xuICAgIGlmICh0aGlzLnJlc29sdmUpIHtcbiAgICAgIHRoaXMucmVzb2x2ZShudWxsKTtcbiAgICAgIHRoaXMucmVzb2x2ZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgb25DaG9vc2VTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IEZ1enp5TWF0Y2g8SWNvbkluZm8+KTogdm9pZCB7XG4gICAgLy8gY29uc29sZS5sb2coc3VnZ2VzdGlvbik7XG4gIH1cbiAgc2VsZWN0U3VnZ2VzdGlvbihcbiAgICB2YWx1ZTogRnV6enlNYXRjaDxJY29uSW5mbz4gfCBudWxsLFxuICAgIGV2dDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc29sdmUpIHtcbiAgICAgIGlmICh2YWx1ZT8uaXRlbSkge1xuICAgICAgICB0aGlzLnJlc29sdmUodmFsdWUuaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlc29sdmUobnVsbCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlc29sdmUgPSBudWxsO1xuICAgIH1cblxuICAgIHN1cGVyLnNlbGVjdFN1Z2dlc3Rpb24odmFsdWUgYXMgYW55LCBldnQpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbW9qaVN1Z2dlc3RlclxuICBleHRlbmRzIEVkaXRvclN1Z2dlc3Q8RnV6enlNYXRjaDxJY29uSW5mbz4+XG4gIGltcGxlbWVudHMgU3VnZ2VzdGVyQmFzZVxue1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGx1Z2luOiBJY29uU0MpIHtcbiAgICBzdXBlcihwbHVnaW4uYXBwKTtcbiAgICB0aGlzLnN1Z2dlc3RFbC5hZGRDbGFzcyhDTEFTU19JRCk7XG4gIH1cblxuICBnZXQgcGFja01hbmFnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucGx1Z2luLnBhY2tNYW5hZ2VyO1xuICB9XG5cbiAgb25UcmlnZ2VyKFxuICAgIGN1cnNvcjogRWRpdG9yUG9zaXRpb24sXG4gICAgZWRpdG9yOiBFZGl0b3IsXG4gICk6IEVkaXRvclN1Z2dlc3RUcmlnZ2VySW5mbyB8IG51bGwge1xuICAgIGlmICghdGhpcy5wbHVnaW4uc2V0dGluZ3Muc3VnZ2VzdGVyKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzdWIgPSBlZGl0b3IuZ2V0TGluZShjdXJzb3IubGluZSkuc3Vic3RyaW5nKDAsIGN1cnNvci5jaCk7XG4gICAgY29uc3QgdHJhaWxpbmdTcGFjZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnRyaWdnZXJXaXRoVHJhaWxpbmdTcGFjZVxuICAgICAgPyBcIiBcIlxuICAgICAgOiBcIlwiO1xuICAgIGxldCBwYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzoke3RyYWlsaW5nU3BhY2V9OnxcdUZGMUFcdUZGMUEpKFteOlxcc10rJClgO1xuICAgIGNvbnN0IG1hdGNoID0gc3ViLm1hdGNoKG5ldyBSZWdFeHAocGF0dGVybiwgXCJpXCIpKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBwcmV2U0MgPSAobWF0Y2guaW5wdXQgYXMgc3RyaW5nKVxuICAgICAgLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleClcbiAgICAgIC5tYXRjaCgvOihbXlxcczpdKyQpLyk7XG4gICAgaWYgKHByZXZTQyAmJiB0aGlzLnBhY2tNYW5hZ2VyLmhhc0ljb24ocHJldlNDWzFdKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuZDogY3Vyc29yLFxuICAgICAgc3RhcnQ6IHtcbiAgICAgICAgY2g6IG1hdGNoLmluZGV4IGFzIG51bWJlcixcbiAgICAgICAgbGluZTogY3Vyc29yLmxpbmUsXG4gICAgICB9LFxuICAgICAgcXVlcnk6IG1hdGNoWzFdLFxuICAgIH07XG4gIH1cblxuICBnZXRTdWdnZXN0aW9ucyhjb250ZXh0OiBFZGl0b3JTdWdnZXN0Q29udGV4dCkge1xuICAgIHJldHVybiBnZXRTdWdnZXN0aW9ucyhjb250ZXh0LnF1ZXJ5LCB0aGlzLnBhY2tNYW5hZ2VyKTtcbiAgfVxuXG4gIHJlbmRlclN1Z2dlc3Rpb24gPSByZW5kZXJTdWdnZXN0aW9uO1xuICBzZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IEZ1enp5TWF0Y2g8SWNvbkluZm8+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRleHQpIHJldHVybjtcbiAgICBjb25zdCB7IGlkLCBwYWNrIH0gPSBzdWdnZXN0aW9uLml0ZW07XG4gICAgdGhpcy5jb250ZXh0LmVkaXRvci5yZXBsYWNlUmFuZ2UoXG4gICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb2RlMmVtb2ppICYmIHBhY2sgPT09IFwiZW1vamlcIlxuICAgICAgICA/ICh0aGlzLnBhY2tNYW5hZ2VyLmdldEljb24oaWQsIHRydWUpIGFzIHN0cmluZylcbiAgICAgICAgOiBgOiR7aWR9OmAgKyAodGhpcy5wbHVnaW4uc2V0dGluZ3Muc3BhY2VBZnRlclNDID8gXCIgXCIgOiBcIlwiKSxcbiAgICAgIHRoaXMuY29udGV4dC5zdGFydCxcbiAgICAgIHRoaXMuY29udGV4dC5lbmQsXG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCByZW5kZXJNYXRjaGVzID0gKFxuICBlbDogSFRNTEVsZW1lbnQsXG4gIHRleHQ6IHN0cmluZyxcbiAgaW5kaWNlcz86IHJlYWRvbmx5IEZ1c2UuUmFuZ2VUdXBsZVtdLFxuICBvZmZzZXQ/OiBudW1iZXIsXG4pID0+IHtcbiAgaWYgKGluZGljZXMpIHtcbiAgICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIG9mZnNldCA9IDA7XG4gICAgbGV0IHRleHRJbmRleCA9IDA7XG4gICAgZm9yIChcbiAgICAgIGxldCByYW5nZUluZGV4ID0gMDtcbiAgICAgIHJhbmdlSW5kZXggPCBpbmRpY2VzLmxlbmd0aCAmJiB0ZXh0SW5kZXggPCB0ZXh0Lmxlbmd0aDtcbiAgICAgIHJhbmdlSW5kZXgrK1xuICAgICkge1xuICAgICAgbGV0IHJhbmdlID0gaW5kaWNlc1tyYW5nZUluZGV4XSxcbiAgICAgICAgc3RhcnQgPSByYW5nZVswXSArIG9mZnNldCxcbiAgICAgICAgZW5kID0gcmFuZ2VbMV0gKyBvZmZzZXQgKyAxOyAvLyBwYXRjaCBmb3IgRnVzZS5SYW5nZVR1cGxlXG4gICAgICBpZiAoIShlbmQgPD0gMCkpIHtcbiAgICAgICAgaWYgKHN0YXJ0ID49IHRleHQubGVuZ3RoKSBicmVhaztcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwO1xuICAgICAgICBpZiAoc3RhcnQgIT09IHRleHRJbmRleClcbiAgICAgICAgICBlbC5hcHBlbmRUZXh0KHRleHQuc3Vic3RyaW5nKHRleHRJbmRleCwgc3RhcnQpKTtcbiAgICAgICAgZWwuY3JlYXRlU3Bhbih7XG4gICAgICAgICAgY2xzOiBcInN1Z2dlc3Rpb24taGlnaGxpZ2h0XCIsXG4gICAgICAgICAgdGV4dDogdGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCksXG4gICAgICAgIH0pO1xuICAgICAgICB0ZXh0SW5kZXggPSBlbmQ7XG4gICAgICB9XG4gICAgfVxuICAgIHRleHRJbmRleCA8IHRleHQubGVuZ3RoICYmIGVsLmFwcGVuZFRleHQodGV4dC5zdWJzdHJpbmcodGV4dEluZGV4KSk7XG4gIH0gZWxzZSBlbC5hcHBlbmRUZXh0KHRleHQpO1xufTtcbiIsICJpbXBvcnQgc3ZnMnVyaSBmcm9tIFwibWluaS1zdmctZGF0YS11cmlcIjtcbmltcG9ydCBlbW9qaUJ5TmFtZSBmcm9tIFwibm9kZS1lbW9qaS9saWIvZW1vamkuanNvblwiO1xuaW1wb3J0IHsgc2V0SWNvbiB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgeyBMdWNpZGVJY29uLCBPYnNpZGlhbkljb24gfSBmcm9tIFwiLi4vaWNvbnNcIjtcbmltcG9ydCB7IEJ1bHRpSW5JY29uRGF0YSBhcyBCdWx0aUluSWNvbkRhdGFUeXBlLCBJY29uSW5mbyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRDbHNGb3JJY29uIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3Qga2Fib2JUb1NuYWtlID0gKG5hbWU6IHN0cmluZykgPT4gbmFtZS5yZXBsYWNlKC8tL2csIFwiX1wiKTtcblxuY29uc3QgTHVjaWRlUGFja05hbWUgPSBcImx1Y1wiLFxuICBPYnNpZGlhblBhY2tOYW1lID0gXCJvYnNcIjtcblxuZXhwb3J0IHR5cGUgU1ZHUGFja25hbWVzID0gdHlwZW9mIEx1Y2lkZVBhY2tOYW1lIHwgdHlwZW9mIE9ic2lkaWFuUGFja05hbWU7XG5cbmNvbnN0IHJlbW92ZUJ1bHRpSW5JY29uQXR0cnMgPSAoZWw6IEhUTUxFbGVtZW50KSA9PlxuICBbXCJjbGFzc1wiLCBcImhlaWdodFwiLCBcIndpZHRoXCJdLmZvckVhY2goKGspID0+XG4gICAgZWwuZmlyc3RFbGVtZW50Q2hpbGQ/LnJlbW92ZUF0dHJpYnV0ZShrKSxcbiAgKTtcbmNsYXNzIEJ1bHRpSW5JY29uRGF0YSBpbXBsZW1lbnRzIEJ1bHRpSW5JY29uRGF0YVR5cGUge1xuICBwdWJsaWMgdHlwZSA9IFwiYnVsdGktaW5cIiBhcyBjb25zdDtcbiAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgLyoqIGljb24gc2hvcnRjb2RlICovXG4gIHB1YmxpYyBpZDogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFjazogc3RyaW5nLCBwcml2YXRlIG9ic2lkaWFuSWQ6IHN0cmluZykge1xuICAgIHRoaXMubmFtZSA9IGthYm9iVG9TbmFrZShvYnNpZGlhbklkKTtcbiAgICB0aGlzLmlkID0gYCR7cGFja31fJHt0aGlzLm5hbWV9YDtcbiAgfVxuICBwdWJsaWMgZ2V0IGRhdGEoKSB7XG4gICAgY29uc3QgZWwgPSBjcmVhdGVEaXYoKTtcbiAgICBzZXRJY29uKFxuICAgICAgZWwsXG4gICAgICAodGhpcy5wYWNrID09PSBMdWNpZGVQYWNrTmFtZSA/IFwibHVjaWRlLVwiIDogXCJcIikgKyB0aGlzLm9ic2lkaWFuSWQsXG4gICAgKTtcbiAgICByZW1vdmVCdWx0aUluSWNvbkF0dHJzKGVsKTtcbiAgICBlbC5maXJzdEVsZW1lbnRDaGlsZD8uc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiKTtcbiAgICByZXR1cm4gZWwuaW5uZXJIVE1MO1xuICB9XG4gIHB1YmxpYyBnZXQgZGF0YVVyaSgpIHtcbiAgICByZXR1cm4gc3ZnMnVyaSh0aGlzLmRhdGEpO1xuICB9XG4gIHB1YmxpYyBnZXRET00oc3ZnID0gdHJ1ZSk6IEhUTUxTcGFuRWxlbWVudCB7XG4gICAgY29uc3QgZWwgPSBjcmVhdGVTcGFuKHsgY2xzOiBnZXRDbHNGb3JJY29uKHRoaXMpIH0pO1xuICAgIGlmIChzdmcpIHtcbiAgICAgIGVsLmFkZENsYXNzKFwiaXNjLXN2Zy1pY29uXCIpO1xuICAgICAgc2V0SWNvbihcbiAgICAgICAgZWwsXG4gICAgICAgICh0aGlzLnBhY2sgPT09IEx1Y2lkZVBhY2tOYW1lID8gXCJsdWNpZGUtXCIgOiBcIlwiKSArIHRoaXMub2JzaWRpYW5JZCxcbiAgICAgICk7XG4gICAgICByZW1vdmVCdWx0aUluSWNvbkF0dHJzKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuYWRkQ2xhc3MoXCJpc2MtaW1nLWljb25cIik7XG4gICAgICBlbC5jcmVhdGVFbChcImltZ1wiLCB7IGF0dHI6IHsgc3JjOiB0aGlzLmRhdGFVcmkgfSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGVsO1xuICB9XG59XG5cbmNvbnN0IEVNT0pJX1BBQ0tfTkFNRSA9IFwiZW1vamlcIjtcbmNvbnN0IGdldEJ1aWx0SW5zID0gKCk6IHtcbiAgcGFja3M6IFJlYWRvbmx5TWFwPHN0cmluZywgQnVsdGlJbkljb25EYXRhPjtcbiAgaWRzOiBSZWFkb25seUFycmF5PEljb25JbmZvPjtcbiAgcGFja25hbWVzOiBSZWFkb25seUFycmF5PHN0cmluZz47XG59ID0+IHtcbiAgbGV0IHBhY2tzID0gbmV3IE1hcDxzdHJpbmcsIEJ1bHRpSW5JY29uRGF0YT4oKSxcbiAgICBpZHMgPSBbXSBhcyBJY29uSW5mb1tdLFxuICAgIHBhY2tuYW1lcyA9IFtdIGFzIHN0cmluZ1tdO1xuXG4gIGZvciAoY29uc3QgW3BhY2ssIGljb25zXSBvZiBbXG4gICAgW09ic2lkaWFuUGFja05hbWUsIE9ic2lkaWFuSWNvbl0sXG4gICAgW0x1Y2lkZVBhY2tOYW1lLCBMdWNpZGVJY29uXSxcbiAgXSBhcyBjb25zdCkge1xuICAgIHBhY2tuYW1lcy5wdXNoKHBhY2spO1xuICAgIGZvciAoY29uc3Qgb2JzaWRpYW5JZCBvZiBpY29ucykge1xuICAgICAgY29uc3QgaWNvbiA9IG5ldyBCdWx0aUluSWNvbkRhdGEocGFjaywgb2JzaWRpYW5JZCk7XG4gICAgICBwYWNrcy5zZXQoaWNvbi5pZCwgaWNvbik7XG4gICAgICBpZHMucHVzaChpY29uKTtcbiAgICB9XG4gIH1cbiAgcGFja25hbWVzLnB1c2goRU1PSklfUEFDS19OQU1FKTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW1vamlCeU5hbWUpKSB7XG4gICAgaWRzLnB1c2goeyBwYWNrOiBFTU9KSV9QQUNLX05BTUUsIGlkOiBrZXksIG5hbWU6IGtleSB9KTtcbiAgfVxuICByZXR1cm4geyBwYWNrcywgaWRzLCBwYWNrbmFtZXMgfTtcbn07XG5cbmNvbnN0IHJlc3VsdCA9IGdldEJ1aWx0SW5zKCk7XG5leHBvcnQgY29uc3QgQnVpbHRJblNWR0ljb25QYWNrcyA9IHJlc3VsdC5wYWNrcztcbmV4cG9ydCBjb25zdCBCdWlsdEluSWNvbklkcyA9IHJlc3VsdC5pZHM7XG5leHBvcnQgY29uc3QgQnVpbHRJbkljb25QYWNrbmFtZXMgPSByZXN1bHQucGFja25hbWVzO1xuIiwgImltcG9ydCBlbW9qaSBmcm9tIFwibm9kZS1lbW9qaVwiO1xuXG5pbXBvcnQgdHlwZSB7IEVtb2ppSWNvbkRhdGEgYXMgRW1vamlJY29uRGF0YVR5cGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Q2xzRm9ySWNvbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtb2ppSWNvbkRhdGEgaW1wbGVtZW50cyBFbW9qaUljb25EYXRhVHlwZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHt9XG4gIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHBhY2soKSB7XG4gICAgcmV0dXJuIFwiZW1vamlcIiBhcyBjb25zdDtcbiAgfVxuICBwdWJsaWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIFwiZW1vamlcIiBhcyBjb25zdDtcbiAgfVxuICBwdWJsaWMgZ2V0IGNoYXIoKSB7XG4gICAgcmV0dXJuIGVtb2ppLmdldCh0aGlzLm5hbWUpO1xuICB9XG5cbiAgc3RhdGljIGdldERhdGEobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGVtb2ppLmhhc0Vtb2ppKG5hbWUpKSB7XG4gICAgICByZXR1cm4gbmV3IEVtb2ppSWNvbkRhdGEobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRET00oc3ZnID0gdHJ1ZSkge1xuICAgIHJldHVybiBjcmVhdGVTcGFuKHtcbiAgICAgIGNsczogW2dldENsc0Zvckljb24odGhpcyksIFwiaXNjLWNoYXItaWNvblwiXSxcbiAgICAgIHRleHQ6IHRoaXMuY2hhcixcbiAgICB9KTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEZpbGVTeXN0ZW1BZGFwdGVyIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBleHRuYW1lIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IEljb25TQyBmcm9tIFwiLi4vaXNjLW1haW5cIjtcbmltcG9ydCB7IEZpbGVJY29uRGF0YSBhcyBGaWxlSWNvbkRhdGFUeXBlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldENsc0Zvckljb24sIGdldFBhY2tuTmFtZUZyb21JZCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVJY29uRGF0YSBpbXBsZW1lbnRzIEZpbGVJY29uRGF0YVR5cGUge1xuICBzdGF0aWMgZ2V0RGF0YShcbiAgICBpZDogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBwbHVnaW46IEljb25TQyxcbiAgKTogRmlsZUljb25EYXRhIHwgbnVsbCB7XG4gICAgY29uc3QgcmVzdWx0ID0gZ2V0UGFja25OYW1lRnJvbUlkKGlkKTtcbiAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQucGFjayA9PT0gXCJlbW9qaVwiKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbmV3IEZpbGVJY29uRGF0YShpZCwgcmVzdWx0Lm5hbWUsIHJlc3VsdC5wYWNrLCBwYXRoLCBwbHVnaW4pO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBcImZpbGVcIiBhcyBjb25zdDtcbiAgfVxuICBwdWJsaWMgcGF0aDogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9pZDogc3RyaW5nLFxuICAgIHByaXZhdGUgX25hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9wYWNrOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHByaXZhdGUgcGx1Z2luOiBJY29uU0MsXG4gICkge1xuICAgIHRoaXMucGF0aCA9IHBhdGgudHJpbSgpO1xuICB9XG4gIHByaXZhdGUgZ2V0IHZhdWx0KCkge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5hcHAudmF1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuICBwdWJsaWMgZ2V0IHBhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhY2s7XG4gIH1cbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgZXh0KCkge1xuICAgIHJldHVybiBleHRuYW1lKHRoaXMucGF0aCk7XG4gIH1cbiAgcHVibGljIGdldCBmc1BhdGgoKSB7XG4gICAgaWYgKHRoaXMudmF1bHQuYWRhcHRlciBpbnN0YW5jZW9mIEZpbGVTeXN0ZW1BZGFwdGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy52YXVsdC5hZGFwdGVyLmdldEZ1bGxQYXRoKHRoaXMucGF0aCk7XG4gICAgfSBlbHNlIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVzb3VyY2VQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLnZhdWx0LmFkYXB0ZXIuZ2V0UmVzb3VyY2VQYXRoKHRoaXMucGF0aCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzU1ZHKCkge1xuICAgIHJldHVybiB0aGlzLmV4dCA9PT0gXCIuc3ZnXCI7XG4gIH1cbiAgcHVibGljIGdldERPTShzdmc6IHRydWUpOiBQcm9taXNlPEhUTUxTcGFuRWxlbWVudD47XG4gIHB1YmxpYyBnZXRET00oc3ZnOiBmYWxzZSk6IEhUTUxTcGFuRWxlbWVudDtcbiAgcHVibGljIGdldERPTShzdmcgPSB0cnVlKTogUHJvbWlzZTxIVE1MU3BhbkVsZW1lbnQ+IHwgSFRNTFNwYW5FbGVtZW50IHtcbiAgICBjb25zdCBlbCA9IGNyZWF0ZVNwYW4oeyBjbHM6IGdldENsc0Zvckljb24odGhpcykgfSk7XG4gICAgaWYgKHN2ZyAmJiB0aGlzLmlzU1ZHKSB7XG4gICAgICBlbC5hZGRDbGFzcyhcImlzYy1zdmctaWNvblwiKTtcbiAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzdmdFbCA9IGF3YWl0IHRoaXMucGx1Z2luLmZpbGVJY29uQ2FjaGUuZ2V0SWNvbih0aGlzLnBhdGgpO1xuICAgICAgICBpZiAoc3ZnRWwpIHtcbiAgICAgICAgICB0aGlzLmZpeEZpbGxDb2xvcihzdmdFbCk7XG4gICAgICAgICAgZWwuYXBwZW5kKHN2Z0VsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZmFpbGVkIHRvIGdldCBpY29uIGRhdGEgZm9yXCIsIHRoaXMucGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgfSkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuYWRkQ2xhc3MoXCJpc2MtaW1nLWljb25cIik7XG4gICAgICBlbC5jcmVhdGVFbChcImltZ1wiLCB7IGF0dHI6IHsgc3JjOiB0aGlzLnJlc291cmNlUGF0aCB9IH0pO1xuICAgICAgcmV0dXJuIGVsO1xuICAgIH1cbiAgfVxuXG4gIGZpeEZpbGxDb2xvcihzdmc6IFNWR0VsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoIXBhY2tUb1BhdGNoLmluY2x1ZGVzKHRoaXMucGFjaykpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IHBhdGhFbCBvZiBzdmcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJwYXRoXCIpKSB7XG4gICAgICBpZiAoIXBhdGhFbC5oYXNBdHRyaWJ1dGUoXCJmaWxsXCIpKSB7XG4gICAgICAgIHBhdGhFbC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwiY3VycmVudENvbG9yXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuY29uc3QgcGFja1RvUGF0Y2ggPSBbXCJmYWJcIiwgXCJmYXJcIiwgXCJmYXNcIiwgXCJyaWZcIiwgXCJyaWxcIl07XG4iLCAiaW1wb3J0IEZ1c2UgZnJvbSBcImZ1c2UuanNcIjtcblxuaW50ZXJmYWNlIEljb25CYXNpY0luZm8ge1xuICBwYWNrOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgSWNvbkluZm8gPSBGaWxlSWNvbkluZm8gfCBFbW9qaUljb25JbmZvIHwgQnVsdGlJbkljb25JbmZvO1xuZXhwb3J0IHR5cGUgSWNvbkRhdGEgPSBGaWxlSWNvbkRhdGEgfCBFbW9qaUljb25EYXRhIHwgQnVsdGlJbkljb25EYXRhO1xuXG50eXBlIHdpdGhJZCA9IHsgaWQ6IHN0cmluZyB9O1xuXG50eXBlIEVtb2ppSWNvbkluZm8gPSBJY29uQmFzaWNJbmZvICYgeyBwYWNrOiBcImVtb2ppXCIgfSAmIHdpdGhJZDtcbmV4cG9ydCB0eXBlIEVtb2ppSWNvbkRhdGEgPSBFbW9qaUljb25JbmZvICZcbiAgSWNvbkJhc2ljRGF0YSAmIHsgY2hhcjogc3RyaW5nOyB0eXBlOiBcImVtb2ppXCIgfTtcblxudHlwZSBGaWxlQmFzaWNJbmZvID0gSWNvbkJhc2ljSW5mbyAmIHtcbiAgLyoqIHBhdGggcmVsYXRpdmUgdG8gdmF1bHQgKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKiogd2l0aCBkb3QgKi9cbiAgZXh0OiBzdHJpbmc7XG59O1xuXG50eXBlIEljb25CYXNpY0RhdGEgPSB7XG4gIGdldERPTShzdmc6IHRydWUpOiBIVE1MU3BhbkVsZW1lbnQgfCBQcm9taXNlPEhUTUxTcGFuRWxlbWVudD47XG4gIGdldERPTShzdmc/OiBmYWxzZSk6IEhUTUxTcGFuRWxlbWVudDtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbGVJY29uSW5mbyA9IEZpbGVCYXNpY0luZm8gJiB3aXRoSWQ7XG5leHBvcnQgdHlwZSBGaWxlSWNvbkRhdGEgPSBGaWxlQmFzaWNJbmZvICZcbiAgSWNvbkJhc2ljRGF0YSAmIHtcbiAgICAvKiogcmVhbCBwYXRoIGluIGZpbGUgc3lzdGVtLCBudWxsIGlmIG5vdCBpbiBEZXNrdG9wICovXG4gICAgZnNQYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiByZXNvdXJjZSBwYXRoIHRvIGljb24gZmlsZSAqL1xuICAgIHJlc291cmNlUGF0aDogc3RyaW5nO1xuICAgIHR5cGU6IFwiZmlsZVwiO1xuICAgIGlzU1ZHOiBib29sZWFuO1xuICB9O1xuZXhwb3J0IGNvbnN0IGlzRmlsZUljb25JbmZvID0gKGlkOiBJY29uSW5mbyk6IGlkIGlzIEZpbGVJY29uSW5mbyA9PlxuICAhIShpZCBhcyBGaWxlSWNvbkluZm8pLmV4dDtcblxuZXhwb3J0IHR5cGUgQnVsdGlJbkljb25JbmZvID0gSWNvbkJhc2ljSW5mbyAmIHdpdGhJZDtcbmV4cG9ydCB0eXBlIEJ1bHRpSW5JY29uRGF0YSA9IEljb25CYXNpY0luZm8gJlxuICBJY29uQmFzaWNEYXRhICYge1xuICAgIC8qKiBkYXRhIHVyaSBvZiBzdmcgaWNvbiAqL1xuICAgIGRhdGFVcmk6IHN0cmluZztcbiAgICAvKiogc3ZnIGljb24gcmF3IGNvbnRlbnQgKi9cbiAgICBkYXRhOiBzdHJpbmc7XG4gICAgdHlwZTogXCJidWx0aS1pblwiO1xuICB9O1xuXG5leHBvcnQgdHlwZSBGdXp6eU1hdGNoPFQ+ID0gRnVzZS5GdXNlUmVzdWx0PFQ+O1xuIiwgImltcG9ydCB7IE5vdGljZSwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgSWNvblNDIGZyb20gXCIuLi9pc2MtbWFpblwiO1xuaW1wb3J0IHsgY29uZmlybSB9IGZyb20gXCIuL2RpYWxvZ1wiO1xuXG5jb25zdCBqc29uVG9TdmcgPSBhc3luYyAocGx1Z2luOiBJY29uU0MpID0+IHtcbiAgY29uc3QgeyB2YXVsdCB9ID0gcGx1Z2luLmFwcDtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IHZhdWx0LnJlYWRKc29uKHBsdWdpbi5wYWNrTWFuYWdlci5jdXN0b21JY29uc0ZpbGVQYXRoKTtcbiAgbGV0IHBhdGggPSBwbHVnaW4ucGFja01hbmFnZXIuY3VzdG9tSWNvbnNEaXI7XG4gIGlmICghKGF3YWl0IHZhdWx0LmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSkge1xuICAgIGF3YWl0IHZhdWx0LmFkYXB0ZXIubWtkaXIocGF0aCk7XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLnJlZHVjZSgoYXJyLCBbaWQsIHN2Z10pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHN2ZyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4ocGF0aCwgYCR7aWR9LnN2Z2ApO1xuICAgICAgICBhcnIucHVzaCh2YXVsdC5jcmVhdGUoZmlsZVBhdGgsIHN2ZykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycjtcbiAgICB9LCBbXSBhcyBQcm9taXNlPFRGaWxlPltdKSxcbiAgKTtcbn07XG5cbmNvbnN0IHRyeVVwZGF0ZUljb25zID0gYXN5bmMgKHBsdWdpbjogSWNvblNDKSA9PiB7XG4gIGlmIChcbiAgICAoYXdhaXQgcGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhcbiAgICAgIHBsdWdpbi5wYWNrTWFuYWdlci5jdXN0b21JY29uc0ZpbGVQYXRoLFxuICAgICkpICYmXG4gICAgIXBsdWdpbi5zZXR0aW5ncy5pc01pZ3JhdGVkXG4gICkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgXCJGb3VuZCBjdXN0b20gaWNvbnMgdGhhdCBoYXZlIG5vdCBiZWVuIHVwZ3JhZGVkLCB1cGRhdGUgaWNvbnMgbm93P1wiO1xuICAgIGlmIChhd2FpdCBjb25maXJtKG1lc3NhZ2UsIHBsdWdpbi5hcHApKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBqc29uVG9TdmcocGx1Z2luKTtcbiAgICAgICAgcGx1Z2luLnNldHRpbmdzLmlzTWlncmF0ZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgIG5ldyBOb3RpY2UoXG4gICAgICAgICAgXCJJY29uIHVwZGF0ZSBjb21wbGV0ZSwgeW91IGNhbiBub3cgZmluZCBpY29uIGZpbGVzIGluIFwiICtcbiAgICAgICAgICAgIHBsdWdpbi5wYWNrTWFuYWdlci5jdXN0b21JY29uc0RpcixcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG5ldyBOb3RpY2UoXCJGYWlsZWQgdG8gdXBkYXRlIGljb25zLCBjaGVjayBjb25zb2xlIGZvciBtb3JlIGRldGFpbHNcIik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgdHJ5VXBkYXRlSWNvbnM7XG4iLCAiaW1wb3J0IHsgQXBwLCBNb2RhbCB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG50eXBlIFByb21pc2VWYWw8VCA9IHZvaWQ+ID0gVCB8IFByb21pc2VMaWtlPFQ+O1xuXG5jbGFzcyBDb25maXJtTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG4gIGJ1dHRvbkNvbnRhaW5lckVsID0gdGhpcy5tb2RhbEVsLmNyZWF0ZURpdihcIm1vZGFsLWJ1dHRvbi1jb250YWluZXJcIik7XG4gIHByaXZhdGUgcmVzb2x2ZTogKCh2YWx1ZTogUHJvbWlzZVZhbDxib29sZWFuPikgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgY29uc3RydWN0b3IoYXBwOiBBcHApIHtcbiAgICBzdXBlcihhcHApO1xuICAgIHRoaXMuY29udGFpbmVyRWwuYWRkQ2xhc3MoXCJtb2QtY29uZmlybWF0aW9uXCIpO1xuICAgIHRoaXMuYWRkQnV0dG9uKFwibW9kLWN0YVwiLCBcIk9LXCIsICgpID0+IHRoaXMucmVzb2x2ZSAmJiB0aGlzLnJlc29sdmUodHJ1ZSkpO1xuICAgIHRoaXMuYWRkQ2FuY2VsQnV0dG9uKCk7XG4gIH1cbiAgb3BlbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBzdXBlci5vcGVuKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiAodGhpcy5yZXNvbHZlID0gcmVzb2x2ZSkpO1xuICB9XG4gIGFkZEJ1dHRvbihcbiAgICBjbHM6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBjYWxsYmFjaz86IChldnQ6IE1vdXNlRXZlbnQpID0+IGFueSxcbiAgKSB7XG4gICAgdGhpcy5idXR0b25Db250YWluZXJFbFxuICAgICAgLmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHsgY2xzLCB0ZXh0IH0pXG4gICAgICAuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGFzeW5jIChldnQpID0+IHtcbiAgICAgICAgY2FsbGJhY2sgJiYgKGF3YWl0IGNhbGxiYWNrKGV2dCkpO1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvbkNsb3NlKCkge1xuICAgIHRoaXMucmVzb2x2ZSAmJiB0aGlzLnJlc29sdmUoZmFsc2UpO1xuICB9XG5cbiAgYWRkQ2FuY2VsQnV0dG9uKCkge1xuICAgIHJldHVybiB0aGlzLmFkZEJ1dHRvbihcIlwiLCBcIkNhbmNlbFwiLCB0aGlzLmNsb3NlLmJpbmQodGhpcykpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjb25maXJtID0gKG1lc3NhZ2U6IHN0cmluZyB8IERvY3VtZW50RnJhZ21lbnQsIGFwcDogQXBwKSA9PiB7XG4gIGNvbnN0IG1vZGFsID0gbmV3IENvbmZpcm1Nb2RhbChhcHApO1xuICBtb2RhbC5jb250ZW50RWwuc2V0VGV4dChtZXNzYWdlKTtcbiAgcmV0dXJuIG1vZGFsLm9wZW4oKTtcbn07XG4iLCAiaW1wb3J0IHsgTWFya2Rvd25Qb3N0UHJvY2Vzc29yIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmltcG9ydCB0eXBlIEljb25TQyBmcm9tIFwiLi4vaXNjLW1haW5cIjtcblxuY29uc3QgZ2V0Q2FsbG91dEljb25Qb3N0UHJvY2Vzc29yID1cbiAgKHBsdWdpbjogSWNvblNDKTogTWFya2Rvd25Qb3N0UHJvY2Vzc29yID0+XG4gIChlbCwgY3R4KSA9PiB7XG4gICAgZm9yIChjb25zdCBjYWxsb3V0RWwgb2YgZWwucXVlcnlTZWxlY3RvckFsbChcIi5jYWxsb3V0XCIpKSB7XG4gICAgICBjb25zdCBpY29uRWwgPSBjYWxsb3V0RWwucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCIuY2FsbG91dC10aXRsZSA+IC5jYWxsb3V0LWljb25cIixcbiAgICAgICkhIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihhc3luYyAobSkgPT4ge1xuICAgICAgICBpZiAoaWNvbkVsLmNoaWxkRWxlbWVudENvdW50ID4gMCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBpZCA9IGdldENzc1Byb3BlcnR5VmFsdWUoaWNvbkVsLCBcIi0tY2FsbG91dC1pY29uXCIpLFxuICAgICAgICAgIGljb24gPSBhd2FpdCBwbHVnaW4uYXBpLmdldFNWR0ljb24oaWQpO1xuICAgICAgICBpZiAoIWljb24pIHJldHVybjtcbiAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICBpY29uRWwuY2xhc3NOYW1lICs9IFwiIFwiICsgaWNvbi5jbGFzc05hbWU7XG4gICAgICAgIGljb25FbC5yZXBsYWNlQ2hpbGRyZW4oLi4uaWNvbi5jaGlsZE5vZGVzKTtcbiAgICAgIH0pO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShpY29uRWwsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgIH1cbiAgfTtcbmV4cG9ydCBkZWZhdWx0IGdldENhbGxvdXRJY29uUG9zdFByb2Nlc3NvcjtcblxuY29uc3QgZ2V0Q3NzUHJvcGVydHlWYWx1ZSA9IChcbiAgZWw6IEhUTUxFbGVtZW50LFxuICBwcm9wOiBzdHJpbmcsXG4gIHBzZXVkb0VsPzogc3RyaW5nIHwgbnVsbCxcbikgPT4gZ2V0Q29tcHV0ZWRTdHlsZShlbCwgcHNldWRvRWwpLmdldFByb3BlcnR5VmFsdWUocHJvcCkudHJpbSgpO1xuIiwgImltcG9ydCB7XG4gIGdldEdsb2JhbFJlZ2V4cCxcbiAgUkVfU0hPUlRDT0RFLFxuICBzdHJpcENvbG9ucyxcbn0gZnJvbSBcIi4uL2ljb24tcGFja3MvdXRpbHNcIjtcbmltcG9ydCBJY29uU0MgZnJvbSBcIi4uL2lzYy1tYWluXCI7XG5cbmNvbnN0IGFjY2VwdE5vZGUgPSAobm9kZTogTm9kZSk6IG51bWJlciA9PiB7XG4gIHN3aXRjaCAobm9kZS5ub2RlTmFtZSkge1xuICAgIGNhc2UgXCJDT0RFXCI6XG4gICAgY2FzZSBcIk1KWC1DT05UQUlORVJcIjpcbiAgICAgIHJldHVybiBOb2RlRmlsdGVyLkZJTFRFUl9SRUpFQ1Q7XG4gICAgY2FzZSBcIiN0ZXh0XCI6IHtcbiAgICAgIGlmIChub2RlLm5vZGVWYWx1ZSAmJiBSRV9TSE9SVENPREUudGVzdChub2RlLm5vZGVWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVDtcbiAgICAgIH0gZWxzZSByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfUkVKRUNUO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX1NLSVA7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXROb2RlUG9zdFByb2Nlc3NvciA9IChcbiAgcGx1Z2luOiBJY29uU0MsXG4pOiAoKGVsOiBIVE1MRWxlbWVudCkgPT4gdm9pZCkgPT4ge1xuICBjb25zdCBzY1JlcGxhY2UgPSBhc3luYyAodGV4dDogVGV4dCkgPT4ge1xuICAgIGZvciAoY29uc3QgY29kZSBvZiBbXG4gICAgICAuLi50ZXh0Lndob2xlVGV4dC5tYXRjaEFsbChnZXRHbG9iYWxSZWdleHAoUkVfU0hPUlRDT0RFKSksXG4gICAgXVxuICAgICAgLnNvcnQoKGEsIGIpID0+IChiLmluZGV4IGFzIG51bWJlcikgLSAoYS5pbmRleCBhcyBudW1iZXIpKVxuICAgICAgLm1hcCgoYXJyKSA9PiAoeyB0ZXh0OiBhcnJbMF0sIGluZGV4OiBhcnIuaW5kZXghIH0pKSkge1xuICAgICAgYXdhaXQgaW5zZXJ0RWxUb1RleHQodGV4dCwgY29kZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBpbnNlcnRFbFRvVGV4dCA9IGFzeW5jIChcbiAgICB0ZXh0OiBUZXh0LFxuICAgIHsgdGV4dDogcGF0dGVybiwgaW5kZXggfTogeyB0ZXh0OiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfSxcbiAgKSA9PiB7XG4gICAgY29uc3QgaWNvbiA9IGF3YWl0IHBsdWdpbi5wYWNrTWFuYWdlci5nZXRTVkdJY29uKHN0cmlwQ29sb25zKHBhdHRlcm4pKTtcbiAgICBpZiAoIWljb24pIHJldHVybiB0ZXh0O1xuICAgIGlmICh0eXBlb2YgaWNvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGV4dC50ZXh0Q29udGVudCAmJlxuICAgICAgICAodGV4dC50ZXh0Q29udGVudCA9IHRleHQudGV4dENvbnRlbnQ/LnJlcGxhY2UocGF0dGVybiwgaWNvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0b1JlcGxhY2UgPSB0ZXh0LnNwbGl0VGV4dChpbmRleCk7XG4gICAgICB0b1JlcGxhY2UucGFyZW50RWxlbWVudD8uaW5zZXJ0QmVmb3JlKGljb24sIHRvUmVwbGFjZSk7XG4gICAgICB0b1JlcGxhY2UudGV4dENvbnRlbnQgPSB0b1JlcGxhY2Uud2hvbGVUZXh0LnN1YnN0cmluZyhwYXR0ZXJuLmxlbmd0aCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoZWw6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlbCwgTm9kZUZpbHRlci5TSE9XX0FMTCwge1xuICAgICAgYWNjZXB0Tm9kZSxcbiAgICB9KTtcbiAgICBsZXQgY3VycmVudE5vZGU6IE5vZGUgfCBudWxsID0gd2Fsa2VyLmN1cnJlbnROb2RlO1xuICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBjdXJyZW50Tm9kZSBhcyBUZXh0ICYgeyBfX1BFTkRJTkdfXz86IFByb21pc2U8YW55PiB9O1xuICAgICAgICAvLyBkb24ndCB3YWl0IGZvciBuZXcgbm9kZSB0byBiZSBpbnNlcnRlZFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGxldCB0ZXh0Tm9kZXMgPSBbdGV4dF07XG4gICAgICAgICAgaWYgKHRleHQuX19QRU5ESU5HX18pIHtcbiAgICAgICAgICAgIC8vIHdhaXQgZm9yIHByZXZvdXMgcG9zdCBwcm9jZXNzb3IgdG8gZmluaXNoXG4gICAgICAgICAgICBhd2FpdCB0ZXh0Ll9fUEVORElOR19fO1xuICAgICAgICAgICAgLy8gcmVzY2FuIGZvciBuZXcgdGV4dCBub2Rlc1xuICAgICAgICAgICAgdGV4dE5vZGVzID0gWy4uLnRleHQucGFyZW50RWxlbWVudCEuY2hpbGROb2Rlc10uZmlsdGVyKFxuICAgICAgICAgICAgICAobik6IG4gaXMgVGV4dCA9PiBuIGluc3RhbmNlb2YgVGV4dCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHBlbmRpbmcgPSBQcm9taXNlLmFsbCh0ZXh0Tm9kZXMubWFwKHNjUmVwbGFjZSkpO1xuICAgICAgICAgIC8vIHNhdmUgcHJvbWlzZSB0byBfX1BFTkRJTkdfXyB0byBub3RpZnkgb3RoZXIgYXN5bmMgcG9zdCBwcm9jZXNzb3JcbiAgICAgICAgICB0ZXh0Ll9fUEVORElOR19fID0gcGVuZGluZztcbiAgICAgICAgICBhd2FpdCBwZW5kaW5nO1xuICAgICAgICAgIGRlbGV0ZSB0ZXh0Ll9fUEVORElOR19fO1xuICAgICAgICB9KSgpO1xuICAgICAgfVxuICAgICAgY3VycmVudE5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TURQb3N0UHJvY2Vzc29yID1cbiAgKHBsdWdpbjogSWNvblNDKSA9PiAoc3RyOiBzdHJpbmcsIHJlcGxhY2VyOiAoc2hvcnRjb2RlOiBzdHJpbmcpID0+IHN0cmluZykgPT5cbiAgICBzdHIucmVwbGFjZShnZXRHbG9iYWxSZWdleHAoUkVfU0hPUlRDT0RFKSwgKGNvZGUpID0+IHtcbiAgICAgIGlmIChwbHVnaW4ucGFja01hbmFnZXIuaGFzSWNvbihzdHJpcENvbG9ucyhjb2RlKSkpIHtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2VyKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvZGU7XG4gICAgICB9XG4gICAgfSk7XG4iLCAiaW1wb3J0IHR5cGUgSWNvblNDIGZyb20gXCIuLi9pc2MtbWFpblwiO1xuaW1wb3J0IGdldENhbGxvdXRJY29uUG9zdFByb2Nlc3NvciBmcm9tIFwiLi9jYWxsb3V0LWljb25cIjtcbmltcG9ydCB7IGdldE1EUG9zdFByb2Nlc3NvciwgZ2V0Tm9kZVBvc3RQcm9jZXNzb3IgfSBmcm9tIFwiLi90ZXh0XCI7XG5cbmNvbnN0IHNldHVwUG9zdFByb2Nlc3NvcnMgPSAocGx1Z2luOiBJY29uU0MpID0+IHtcbiAgcGx1Z2luLnJlZ2lzdGVyTWFya2Rvd25Qb3N0UHJvY2Vzc29yKHBsdWdpbi5fbm9kZVByb2Nlc3Nvcik7XG4gIHBsdWdpbi5yZWdpc3Rlck1hcmtkb3duUG9zdFByb2Nlc3NvcihnZXRDYWxsb3V0SWNvblBvc3RQcm9jZXNzb3IocGx1Z2luKSk7XG59O1xuXG5leHBvcnQgeyBnZXRNRFBvc3RQcm9jZXNzb3IsIGdldE5vZGVQb3N0UHJvY2Vzc29yLCBzZXR1cFBvc3RQcm9jZXNzb3JzIH07XG4iLCAiY2xhc3MgQmFzZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuZXhwb3J0IGNsYXNzIE5vdFJlY2VpdmVGaWxlTGlzdCBleHRlbmRzIEJhc2VFcnJvciB7fVxuXG5leHBvcnQgY2xhc3MgVW5rbm93bkVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHt9XG4iLCAiZXhwb3J0IGNvbnN0IGpvaW5BcnJheVN0cmluZyA9IChcbiAgYXJyOiBzdHJpbmdbXSxcbiAgc2VwYXJhdG9yOiBzdHJpbmcgPSAnLCdcbik6IHN0cmluZyA9PiBhcnIuam9pbihzZXBhcmF0b3IpXG4iLCAiaW1wb3J0IHsgVW5rbm93bkVycm9yLCBOb3RSZWNlaXZlRmlsZUxpc3QgfSBmcm9tICcuL2Vycm9yJ1xuaW1wb3J0IHsgam9pbkFycmF5U3RyaW5nIH0gZnJvbSAnLi91dGlsJ1xuY29uc3QgREVGQVVMVF9QQVJBTUVURVJTOiBQYXJhbWV0ZXJzID0ge1xuICBhY2NlcHQ6ICcqJyxcbiAgbXVsdGlwbGU6IGZhbHNlLFxuICBzdHJpY3Q6IGZhbHNlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVyczxcbiAgVCBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbiAgVSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZVxuPiB7XG4gIGFjY2VwdDogc3RyaW5nIHwgc3RyaW5nW11cbiAgbXVsdGlwbGU6IFRcbiAgc3RyaWN0OiBVXG59XG5cbnR5cGUgUGlja0ZpbGU8XG4gIFQgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4gIFUgZXh0ZW5kcyBib29sZWFuID0gZmFsc2Vcbj4gPSBUIGV4dGVuZHMgZmFsc2UgPyAoVSBleHRlbmRzIHRydWUgPyBGaWxlIDogRmlsZUxpc3QpIDogRmlsZUxpc3RcblxuLyoqXG4gKiBDYWxsIGZpbGUgc2VsZWN0IGRpYWxvZyBwcm9ncmFtbWF0aWNhbGx5LlxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbWV0ZXJzXSBvcHRpb25hbFxuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgPEZpbGUgfCBGaWxlTGlzdD4gaWYgc3RyaWN0IGlzIGZhbHNlLCByZXR1cm4gRmlsZUxpc3Qgb2JqZWN0LCBpZiBtdWx0aXBsZSBpcyBmYWxzZSBhbmQgc3RyaWN0IGlzIHRydWUgcmV0dXJuIEZpbGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBmaWxlRGlhbG9nID0gPFxuICBUIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuICBVIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlXG4+KFxuICBwYXJhbWV0ZXJzPzogUGFydGlhbDxQYXJhbWV0ZXJzPFQsIFU+PlxuKTogUHJvbWlzZTxQaWNrRmlsZTxULCBVPj4gPT4ge1xuICBjb25zdCB7IGFjY2VwdCwgbXVsdGlwbGUsIHN0cmljdCB9ID0geyAuLi5ERUZBVUxUX1BBUkFNRVRFUlMsIC4uLnBhcmFtZXRlcnMgfVxuICBjb25zdCBpbnB1dCA9IGNyZWF0ZUZpbGVJbnB1dEVsZW1lbnQoe1xuICAgIG11bHRpcGxlLFxuICAgIGFjY2VwdDogQXJyYXkuaXNBcnJheShhY2NlcHQpID8gam9pbkFycmF5U3RyaW5nKGFjY2VwdCkgOiBhY2NlcHRcbiAgfSlcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFBpY2tGaWxlPFQsIFU+PigocmVzb2x2ZSkgPT4ge1xuICAgIGlucHV0Lm9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgcmVzb2x2ZShyZXNvbHZlcihpbnB1dC5maWxlcywgbXVsdGlwbGUgYXMgVCwgc3RyaWN0IGFzIFUpKVxuICAgICAgaW5wdXQucmVtb3ZlKClcbiAgICB9XG4gICAgaW5wdXQuY2xpY2soKVxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZXIgPSA8VCBleHRlbmRzIGJvb2xlYW4sIFUgZXh0ZW5kcyBib29sZWFuPihcbiAgZmlsZUxpc3Q6IEhUTUxJbnB1dEVsZW1lbnRbJ2ZpbGVzJ10sXG4gIG11bHRpcGxlOiBULFxuICBzdHJpY3Q6IFVcbikgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8UGlja0ZpbGU8VCwgVT4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAoIWZpbGVMaXN0KSByZXR1cm4gcmVqZWN0KG5ldyBOb3RSZWNlaXZlRmlsZUxpc3QoKSlcbiAgICBjb25zdCBmaWxlID0gZ2V0RmlsZUxpc3RPYmooZmlsZUxpc3QsIG11bHRpcGxlLCBzdHJpY3QpXG4gICAgaWYgKCFmaWxlKSByZXR1cm4gcmVqZWN0KG5ldyBVbmtub3duRXJyb3IoKSlcblxuICAgIHJlc29sdmUoZmlsZSlcbiAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpbGVMaXN0T2JqID0gPFQgZXh0ZW5kcyBib29sZWFuLCBVIGV4dGVuZHMgYm9vbGVhbj4oXG4gIGZpbGVzOiBOb25OdWxsYWJsZTxIVE1MSW5wdXRFbGVtZW50WydmaWxlcyddPixcbiAgbXVsdGlwbGU6IFQsXG4gIHN0cmljdDogVVxuKTogUGlja0ZpbGU8VCwgVT4gfCBudWxsID0+IHtcbiAgaWYgKCFtdWx0aXBsZSAmJiBzdHJpY3QpIHtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gPFBpY2tGaWxlPFQsIFU+PmZpbGVzWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9IGVsc2UgaWYgKGZpbGVzLmxlbmd0aCkge1xuICAgIHJldHVybiA8UGlja0ZpbGU8VCwgVT4+ZmlsZXNcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVGaWxlSW5wdXRFbGVtZW50ID0gKHtcbiAgYWNjZXB0LFxuICBtdWx0aXBsZVxufTogUGljazxIVE1MSW5wdXRFbGVtZW50LCAnYWNjZXB0JyB8ICdtdWx0aXBsZSc+KTogSFRNTElucHV0RWxlbWVudCA9PiB7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxuICBpbnB1dC50eXBlID0gJ2ZpbGUnXG4gIGlucHV0Lm11bHRpcGxlID0gbXVsdGlwbGVcbiAgaW5wdXQuYWNjZXB0ID0gYWNjZXB0XG4gIHJldHVybiBpbnB1dFxufVxuIiwgImltcG9ydCBcInNldHRpbmdzLmxlc3NcIjtcbmltcG9ydCBcImludmFsaWQubGVzc1wiO1xuXG5pbXBvcnQgeyBmaWxlRGlhbG9nIH0gZnJvbSBcImZpbGUtc2VsZWN0LWRpYWxvZ1wiO1xuaW1wb3J0IHtcbiAgQXBwLFxuICBCdXR0b25Db21wb25lbnQsXG4gIE5vdGljZSxcbiAgUGxhdGZvcm0sXG4gIFBsdWdpblNldHRpbmdUYWIsXG4gIFNldHRpbmcsXG4gIFRleHRDb21wb25lbnQsXG59IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgQnJvd3NlclBhY2tzIGZyb20gXCIuL2NvbXBvbmVudC9icm93c2VyLXBhY2tzXCI7XG5pbXBvcnQgSWNvbk1hbmFnZXIgZnJvbSBcIi4vY29tcG9uZW50L2ljb24tbWFuYWdlclwiO1xuaW1wb3J0IHsgQnVpbHRJbkljb25QYWNrbmFtZXMsIFNWR1BhY2tuYW1lcyB9IGZyb20gXCIuL2ljb24tcGFja3MvYnVpbHQtaW5zXCI7XG5pbXBvcnQgeyBTdXBwb3J0ZWRJY29uRXh0IH0gZnJvbSBcIi4vaWNvbi1wYWNrcy91dGlsc1wiO1xuaW1wb3J0IEljb25TQyBmcm9tIFwiLi9pc2MtbWFpblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEljb25TQ1NldHRpbmdzIHtcbiAgY29kZTJlbW9qaTogYm9vbGVhbjtcbiAgc3VnZ2VzdGVyOiBib29sZWFuO1xuICBkaXNhYmxlZFBhY2tzOiBTZXQ8c3RyaW5nPjtcbiAgc3BhY2VBZnRlclNDOiBib29sZWFuO1xuICB0cmlnZ2VyV2l0aFRyYWlsaW5nU3BhY2U6IGJvb2xlYW47XG4gIGlzTWlncmF0ZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBJY29uU0NTZXR0aW5ncyA9IHtcbiAgY29kZTJlbW9qaTogdHJ1ZSxcbiAgc3VnZ2VzdGVyOiB0cnVlLFxuICBkaXNhYmxlZFBhY2tzOiBuZXcgU2V0KFtcIm9ic1wiXSksXG4gIHRyaWdnZXJXaXRoVHJhaWxpbmdTcGFjZTogZmFsc2UsXG4gIHNwYWNlQWZ0ZXJTQzogZmFsc2UsXG4gIGlzTWlncmF0ZWQ6IGZhbHNlLFxufTtcblxuZXhwb3J0IGNsYXNzIEljb25TQ1NldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgcGx1Z2luOiBJY29uU0M7XG5cbiAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogSWNvblNDKSB7XG4gICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICB9XG5cbiAgZGlzcGxheSgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG4gICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpLnNldEhlYWRpbmcoKS5zZXROYW1lKFwiSWNvbiBTdWdnZXN0ZXJcIik7XG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0RGVzYyhcbiAgICAgICAgXCJJZiB0aGlzIGlzIHR1cm5lZCBvbiwgYSBTdWdnZXN0ZXIgd2lsbCBhcHBlYXIgZXZlcnl0aW1lIHlvdSB0eXBlIDoob3IgXHVGRjFBXHVGRjFBIGlmIGZ1bGwtd2lkdGgpIGZvbGxvd2VkIGJ5IGEgbGV0dGVyLiBUaGlzIHdpbGwgaGVscCB5b3UgaW5zZXJ0IEVtb2ppcy4gXCIsXG4gICAgICApXG4gICAgICAuYWRkVG9nZ2xlKChjYikgPT4ge1xuICAgICAgICBjYi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zdWdnZXN0ZXIpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnN1Z2dlc3RlciA9IHZhbHVlO1xuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUoXCJSZXBsYWNlIGVtb2ppIHNob3J0Y29kZSB3aXRoIGVtb2ppIGNoYXJhY3RlclwiKVxuICAgICAgLnNldERlc2MoXG4gICAgICAgIFwiSWYgdGhpcyBpcyB0dXJuZWQgb24sIGVtb2ppIHNob3J0Y29kZXMgd2lsbCBiZSBpbW1lZGlhdGVseSByZXBsYWNlZCBieSBlbW9qaSBhZnRlciB0eXBpbmcuIFwiICtcbiAgICAgICAgICBcIk90aGVyd2lzZSB0aGV5IGFyZSBzdGlsbCBzdG9yZWQgYXMgYSBzaG9ydGNvZGUgYW5kIHlvdSBvbmx5IHNlZSB0aGUgRW1vamkgaW4gUHJldmlldyBNb2RlLlwiLFxuICAgICAgKVxuICAgICAgLmFkZFRvZ2dsZSgoY2IpID0+IHtcbiAgICAgICAgY2Iuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuY29kZTJlbW9qaSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuY29kZTJlbW9qaSA9IHZhbHVlO1xuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUoXCJUcmlnZ2VyIHdpdGggdHJhaWxpbmcgc3BhY2VcIilcbiAgICAgIC5zZXREZXNjKFxuICAgICAgICBcIm9ubHkgdHJpZ2dlciBzdWdnZXN0ZXIgaWYgdGhlcmUgaXMgYSB0cmFpbGluZyBzcGFjZSBiZWZvcmUgdGhlIGNvbG9uXCIsXG4gICAgICApXG4gICAgICAuYWRkVG9nZ2xlKChjYikgPT4ge1xuICAgICAgICBjYi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy50cmlnZ2VyV2l0aFRyYWlsaW5nU3BhY2UpLm9uQ2hhbmdlKFxuICAgICAgICAgIGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudHJpZ2dlcldpdGhUcmFpbGluZ1NwYWNlID0gdmFsdWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZShcIkFkZCBzcGFjZSBhZnRlciBpbnNlcnRlZCBzaG9ydGNvZGVcIilcbiAgICAgIC5hZGRUb2dnbGUoKGNiKSA9PiB7XG4gICAgICAgIGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNwYWNlQWZ0ZXJTQykub25DaGFuZ2UoXG4gICAgICAgICAgYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5zcGFjZUFmdGVyU0MgPSB2YWx1ZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuc2tpcEljb25QYWNrKCk7XG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZShcIkljb24gUGFja3NcIilcbiAgICAgIC5zZXREZXNjKFwiQnJvd3NlIGFuZCBkb3dubG9hZCBpY29uIHBhY2tzXCIpXG4gICAgICAuYWRkQnV0dG9uKChidG4pID0+XG4gICAgICAgIGJ0blxuICAgICAgICAgIC5zZXRCdXR0b25UZXh0KFwiQnJvd3NlclwiKVxuICAgICAgICAgIC5vbkNsaWNrKCgpID0+IG5ldyBCcm93c2VyUGFja3ModGhpcy5wbHVnaW4pLm9wZW4oKSksXG4gICAgICApO1xuXG4gICAgLy8gY3VzdG9tIGljb24gbWFuYWdlIHNlY3Rpb25cbiAgICBjb25zdCBtYW5hZ2VyQ29udGFpbmVyID0gY3JlYXRlRGl2KHtcbiAgICAgIGNsczogW1wiaXNjLXNldHRpbmdzLWN1c3RvbS1pY29uXCIsIFwiaW5zdGFsbGVkLXBsdWdpbnMtY29udGFpbmVyXCJdLFxuICAgIH0pO1xuICAgIG5ldyBTZXR0aW5nKHRoaXMuY29udGFpbmVyRWwpXG4gICAgICAuc2V0SGVhZGluZygpXG4gICAgICAuc2V0TmFtZShcIkN1c3RvbSBJY29uc1wiKVxuICAgICAgLmFkZEV4dHJhQnV0dG9uKChidG4pID0+XG4gICAgICAgIGJ0blxuICAgICAgICAgIC5zZXRJY29uKFwic2hlZXRzLWluLWJveFwiKVxuICAgICAgICAgIC5zZXRUb29sdGlwKFwiQmFja3VwIGljb25zXCIpXG4gICAgICAgICAgLm9uQ2xpY2soKCkgPT4gdGhpcy5wbHVnaW4ucGFja01hbmFnZXIuYmFja3VwSWNvbnMoKSksXG4gICAgICApXG4gICAgICAuYWRkRXh0cmFCdXR0b24oKGJ0bikgPT5cbiAgICAgICAgYnRuXG4gICAgICAgICAgLnNldEljb24oXCJyZXN0b3JlLWZpbGUtZ2x5cGhcIilcbiAgICAgICAgICAuc2V0VG9vbHRpcChcIlJlc3RvcmUgYmFja3VwXCIpXG4gICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4ucGFja01hbmFnZXIuaW1wb3J0SWNvbnNGcm9tRmlsZUxpc3QoXG4gICAgICAgICAgICAgIGF3YWl0IGZpbGVEaWFsb2coeyBtdWx0aXBsZTogdHJ1ZSwgYWNjZXB0OiBcIi56aXBcIiB9KSxcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4ucGFja01hbmFnZXIubG9hZEljb25zKCk7XG4gICAgICAgICAgICB0aGlzLm1hbmFnZUN1c3RvbUljb25zKG1hbmFnZXJDb250YWluZXIpO1xuICAgICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLmFkZEV4dHJhQnV0dG9uKChidG4pID0+XG4gICAgICAgIGJ0blxuICAgICAgICAgIC5zZXRJY29uKFwic3dpdGNoXCIpXG4gICAgICAgICAgLnNldFRvb2x0aXAoXCJSZWxvYWQgY3VzdG9tIGljb25zXCIpXG4gICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4ucGFja01hbmFnZXIubG9hZEljb25zKCk7XG4gICAgICAgICAgICB0aGlzLm1hbmFnZUN1c3RvbUljb25zKG1hbmFnZXJDb250YWluZXIpO1xuICAgICAgICAgICAgbmV3IE5vdGljZShcIkN1c3RvbSBpY29ucyByZWxvYWRlZFwiKTtcbiAgICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC50aGVuKFxuICAgICAgICAocykgPT5cbiAgICAgICAgICBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHAgJiZcbiAgICAgICAgICBzLmFkZEV4dHJhQnV0dG9uKChidG4pID0+XG4gICAgICAgICAgICBidG5cbiAgICAgICAgICAgICAgLnNldEljb24oXCJmb2xkZXJcIilcbiAgICAgICAgICAgICAgLnNldFRvb2x0aXAoXCJPcGVuIEljb25zIEZvbGRlclwiKVxuICAgICAgICAgICAgICAub25DbGljaygoKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuYXBwLm9wZW5XaXRoRGVmYXVsdEFwcChcbiAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnBhY2tNYW5hZ2VyLmN1c3RvbUljb25zRGlyLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgdGhpcy5jb250YWluZXJFbC5hcHBlbmRDaGlsZChtYW5hZ2VyQ29udGFpbmVyKTtcbiAgICB0aGlzLm1hbmFnZUN1c3RvbUljb25zKG1hbmFnZXJDb250YWluZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0RGlzYWJsZWRQYWNrKHRhcmdldDogc3RyaW5nLCBzZXR0aW5nOiBTZXR0aW5nKSB7XG4gICAgcmV0dXJuIHNldHRpbmcuYWRkVG9nZ2xlKChjYikgPT4ge1xuICAgICAgY2Iuc2V0VmFsdWUoIXRoaXMucGx1Z2luLnNldHRpbmdzLmRpc2FibGVkUGFja3MuaGFzKHRhcmdldCkpLm9uQ2hhbmdlKFxuICAgICAgICBhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmRpc2FibGVkUGFja3MuZGVsZXRlKHRhcmdldCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmRpc2FibGVkUGFja3MuYWRkKHRhcmdldCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIGNiLnRvZ2dsZUVsLnNldEF0dHIoXCJhcmlhLWxhYmVsXCIsIGBFbmFibGUvRGlzYWJsZSAke3RhcmdldH0gSWNvbiBQYWNrYCk7XG4gICAgfSk7XG4gIH1cbiAgc2tpcEljb25QYWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XG5cbiAgICBjb25zdCBnZXRTZXR0aW5nID0gKFxuICAgICAgcGFjazogU1ZHUGFja25hbWVzLFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgZ2V0RGVzYz86IChlbDogRG9jdW1lbnRGcmFnbWVudCkgPT4gdm9pZCxcbiAgICApID0+XG4gICAgICB0aGlzLl9zZXREaXNhYmxlZFBhY2soXG4gICAgICAgIHBhY2ssXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKS5zZXROYW1lKG5hbWUpLnNldERlc2MoY3JlYXRlRnJhZ21lbnQoZ2V0RGVzYykpLFxuICAgICAgKTtcblxuICAgIG5ldyBTZXR0aW5nKHRoaXMuY29udGFpbmVyRWwpLnNldEhlYWRpbmcoKS5zZXROYW1lKFwiSWNvbiBQYWNrc1wiKTtcblxuICAgIGdldFNldHRpbmcoXCJsdWNcIiwgXCJMdWNpZGVcIiwgKGVsKSA9PlxuICAgICAgZWwuY3JlYXRlRWwoXCJhXCIsIHtcbiAgICAgICAgaHJlZjogXCJodHRwczovL2x1Y2lkZS5kZXZcIixcbiAgICAgICAgdGV4dDogXCJvZmZpY2lhbCB3ZWJzaXRlXCIsXG4gICAgICB9KSxcbiAgICApO1xuICAgIGdldFNldHRpbmcoXCJvYnNcIiwgXCJPYnNpZGlhbidzIGJ1aWx0LWluIGljb25zXCIsIChlbCkgPT5cbiAgICAgIGVsLmFwcGVuZFRleHQoXG4gICAgICAgIFwiT2JzaWRpYW4ncyBidWlsdC1pbiBpY29ucyBhcmUgbW9zdGx5IHVzZWQgZm9yIFVJIGNvbXBvbmVudHMuIFwiLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgbWFuYWdlQ3VzdG9tSWNvbnMoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKGNvbnRhaW5lckVsLmhhc0NoaWxkTm9kZXMoKSkgY29udGFpbmVyRWwuZW1wdHkoKTtcblxuICAgIGNvbnN0IGlzUGFja25hbWVJbnZhbGlkID0gKG5hbWU6IHN0cmluZykgPT5cbiAgICAgICEvXltBLVphLXowLTldKyQvLnRlc3QobmFtZSkgfHxcbiAgICAgIHRoaXMucGx1Z2luLnBhY2tNYW5hZ2VyLmlzUGFja25hbWVFeGlzdHMobmFtZSk7XG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZShcIkFkZCBuZXcgaWNvbiBwYWNrXCIpXG4gICAgICAuc2V0RGVzYyhcIlJlc2VydmVkIG5hbWVzOiBcIiArIEJ1aWx0SW5JY29uUGFja25hbWVzLmpvaW4oXCIsIFwiKSlcbiAgICAgIC50aGVuKChzKSA9PiB7XG4gICAgICAgIGxldCBidXR0b246IEJ1dHRvbkNvbXBvbmVudCB8IG51bGwgPSBudWxsLFxuICAgICAgICAgIGlucHV0OiBUZXh0Q29tcG9uZW50IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIHMuYWRkVGV4dCgodHh0KSA9PiB7XG4gICAgICAgICAgdHh0XG4gICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJFbnRlciBuYW1lXCIpXG4gICAgICAgICAgICAub25DaGFuZ2UoKG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaXNJbnZhbGlkID0gaXNQYWNrbmFtZUludmFsaWQobmFtZSk7XG4gICAgICAgICAgICAgIHR4dC5pbnB1dEVsLnRvZ2dsZUNsYXNzKFwiaW52YWxpZFwiLCAhIW5hbWUgJiYgaXNJbnZhbGlkKTtcbiAgICAgICAgICAgICAgYnV0dG9uPy5zZXREaXNhYmxlZChpc0ludmFsaWQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKCh0eHQpID0+IHR4dC5pbnB1dEVsLmFkZENsYXNzKFwiaXNjLWFkZC1wYWNrLWlucHV0XCIpKSxcbiAgICAgICAgICAgIChpbnB1dCA9IHR4dCk7XG4gICAgICAgIH0pLmFkZEJ1dHRvbihcbiAgICAgICAgICAoYnRuKSA9PiAoXG4gICAgICAgICAgICBidG5cbiAgICAgICAgICAgICAgLnNldEN0YSgpXG4gICAgICAgICAgICAgIC5zZXRJY29uKFwicGx1cy13aXRoLWNpcmNsZVwiKVxuICAgICAgICAgICAgICAub25DbGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFja05hbWUgPSBpbnB1dD8uZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhY2tOYW1lKSByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGlzUGFja25hbWVJbnZhbGlkKHBhY2tOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIlRoaXMgbmFtZSBpcyBpbnZhbGlkLlwiKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hZGROZXdDdXN0b21JY29uRW50cnkoXG4gICAgICAgICAgICAgICAgICBwYWNrTmFtZSxcbiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsLFxuICAgICAgICAgICAgICAgICkuc2V0dGluZ0VsLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgICAgICAgaW5wdXQ/LnNldFZhbHVlKFwiXCIpO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIChidXR0b24gPSBidG4pXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5wbHVnaW4ucGFja01hbmFnZXIuY3VzdG9tUGFja25hbWVzLmZvckVhY2goKHBhY2spID0+XG4gICAgICB0aGlzLmFkZE5ld0N1c3RvbUljb25FbnRyeShwYWNrLCBjb250YWluZXJFbCksXG4gICAgKTtcbiAgfVxuICBhZGROZXdDdXN0b21JY29uRW50cnkocGFjazogc3RyaW5nLCBjb250YWluZXJFbDogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBzZXR0aW5nID0gbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZShwYWNrKVxuICAgICAgLnNldERlc2MoXG4gICAgICAgIGNyZWF0ZUZyYWdtZW50KChlbCkgPT4ge1xuICAgICAgICAgIGVsLmFwcGVuZFRleHQoXCJEcmFnIGZpbGVzIGluIHRvIGltcG9ydCBjdXN0b20gaWNvbnNcIik7XG4gICAgICAgICAgZWwuY3JlYXRlRWwoXCJiclwiKTtcbiAgICAgICAgICBlbC5hcHBlbmRUZXh0KFwiU3VwcG9ydGVkIGZvcm1hdDogXCIpO1xuICAgICAgICAgIFN1cHBvcnRlZEljb25FeHQuZm9yRWFjaCgoZXh0LCBpbmRleCwgYXJyKSA9PiB7XG4gICAgICAgICAgICBlbC5jcmVhdGVFbChcImNvZGVcIiwgeyB0ZXh0OiBleHQgfSk7XG4gICAgICAgICAgICBpZiAoYXJyLmxlbmd0aCAtIDEgIT09IGluZGV4KSBlbC5hcHBlbmRUZXh0KFwiLCBcIik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLmFkZEJ1dHRvbigoYnRuKSA9PlxuICAgICAgICBidG5cbiAgICAgICAgICAuc2V0SWNvbihcInNoZWV0cy1pbi1ib3hcIilcbiAgICAgICAgICAuc2V0VG9vbHRpcChcIkJhY2t1cCBpY29uc1wiKVxuICAgICAgICAgIC5vbkNsaWNrKCgpID0+IHRoaXMucGx1Z2luLnBhY2tNYW5hZ2VyLmJhY2t1cEljb25zKHBhY2spKSxcbiAgICAgIClcbiAgICAgIC5hZGRCdXR0b24oKGJ0bikgPT5cbiAgICAgICAgYnRuXG4gICAgICAgICAgLnNldEljb24oXCJnby10by1maWxlXCIpXG4gICAgICAgICAgLnNldFRvb2x0aXAoXCJzZWxlY3QgZmlsZXMgdG8gaW1wb3J0XCIpXG4gICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT5cbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnBhY2tNYW5hZ2VyLmFkZEZyb21GaWxlcyhcbiAgICAgICAgICAgICAgcGFjayxcbiAgICAgICAgICAgICAgYXdhaXQgZmlsZURpYWxvZyh7XG4gICAgICAgICAgICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICAgICAgICAgICAgYWNjZXB0OiBTdXBwb3J0ZWRJY29uRXh0IGFzIGFueSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICApXG4gICAgICAuYWRkQnV0dG9uKChidG4pID0+XG4gICAgICAgIGJ0blxuICAgICAgICAgIC5zZXRJY29uKFwidHJhc2hcIilcbiAgICAgICAgICAuc2V0VG9vbHRpcChcImRlbGV0ZVwiKVxuICAgICAgICAgIC5zZXRXYXJuaW5nKClcbiAgICAgICAgICAub25DbGljaygoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5wYWNrTWFuYWdlci5maWx0ZXIoKGssIHYpID0+IHYucGFjayAhPT0gcGFjayk7XG4gICAgICAgICAgICBjb250YWluZXJFbC5yZW1vdmVDaGlsZChzZXR0aW5nLnNldHRpbmdFbCk7XG4gICAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuYWRkQnV0dG9uKChidG4pID0+XG4gICAgICAgIGJ0blxuICAgICAgICAgIC5zZXRJY29uKFwicG9wdXAtb3BlblwiKVxuICAgICAgICAgIC5zZXRUb29sdGlwKFwibWFuYWdlIGljb25zXCIpXG4gICAgICAgICAgLnNldEN0YSgpXG4gICAgICAgICAgLm9uQ2xpY2soKCkgPT4gbmV3IEljb25NYW5hZ2VyKHRoaXMucGx1Z2luLCBwYWNrKS5vcGVuKCkpLFxuICAgICAgKVxuICAgICAgLnRoZW4oKHMpID0+XG4gICAgICAgIHNldHVwRG5kKHMuc2V0dGluZ0VsLCBhc3luYyAoZXZ0KSA9PiB7XG4gICAgICAgICAgaWYgKCFldnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgICAgICBuZXcgTm90aWNlKFwiRmFpbGVkIHRvIGdldCBkcm9wcGVkIGl0ZW1zXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnBsdWdpbi5wYWNrTWFuYWdlci5hZGRGcm9tRmlsZXMocGFjaywgZXZ0LmRhdGFUcmFuc2Zlci5maWxlcyk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB0aGlzLl9zZXREaXNhYmxlZFBhY2socGFjaywgc2V0dGluZyk7XG4gICAgcmV0dXJuIHNldHRpbmc7XG4gIH1cbn1cblxuY29uc3Qgc2V0dXBEbmQgPSAoZWw6IEhUTUxFbGVtZW50LCBkcm9wcGVkSGFuZGxlcjogKGV2dDogRHJhZ0V2ZW50KSA9PiBhbnkpID0+IHtcbiAgY29uc3QgZHJhZ292ZXJDbGFzcyA9IFwiZHJhZ292ZXJcIjtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsIChldnQpID0+IHtcbiAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAoZXZ0LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmFkZENsYXNzKGRyYWdvdmVyQ2xhc3MpO1xuICB9KTtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcImRyb3BcIiwgKGV2dCkgPT4ge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIChldnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkucmVtb3ZlQ2xhc3MoZHJhZ292ZXJDbGFzcyk7XG4gICAgZHJvcHBlZEhhbmRsZXIoZXZ0KTtcbiAgfSk7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnbGVhdmVcIiwgKGV2dCkgPT4ge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIChldnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkucmVtb3ZlQ2xhc3MoZHJhZ292ZXJDbGFzcyk7XG4gIH0pO1xufTtcbiIsICJpbXBvcnQgXCIuL2Jyb3dzZXItcGFja3MubGVzc1wiO1xuXG5pbXBvcnQgYXNzZXJ0TmV2ZXIgZnJvbSBcImFzc2VydC1uZXZlclwiO1xuaW1wb3J0IGNscyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IHsgTW9kYWwsIHJlcXVlc3RVcmwgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7XG4gIEZpQXdhcmQsXG4gIEZpRG93bmxvYWQsXG4gIEZpRXh0ZXJuYWxMaW5rLFxuICBGaUhvbWUsXG4gIEZpSW1hZ2UsXG59IGZyb20gXCJyZWFjdC1pY29ucy9maVwiO1xuXG5pbXBvcnQgSWNvblNDIGZyb20gXCIuLi9pc2MtbWFpblwiO1xuaW1wb3J0IHtcbiAgZ2V0SWNvblBhY2tCdW5kbGVVcmwsXG4gIGdldE1hbmlmZXN0VmlhQVBJLFxuICBJY29uUGFja01hbmlmZXN0UmF3LFxufSBmcm9tIFwiLi4vbW9kdWxlcy9pY29uLXBhY2tzXCI7XG5pbXBvcnQgTG9hZGluZyBmcm9tIFwiLi9sb2FkaW5nXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJyb3dzZXJQYWNrcyBleHRlbmRzIE1vZGFsIHtcbiAgY29uc3RydWN0b3IocHVibGljIHBsdWdpbjogSWNvblNDKSB7XG4gICAgc3VwZXIocGx1Z2luLmFwcCk7XG4gICAgdGhpcy5tb2RhbEVsLmFkZENsYXNzKFwibW9kLWJyb3dzZXItcGFja3NcIik7XG4gIH1cbiAgb25PcGVuKCk6IHZvaWQge1xuICAgIFJlYWN0RE9NLnJlbmRlcihcbiAgICAgIDxCcm93c2VyUGFja1ZpZXcgZ2V0SWNvblBhY2s9e3RoaXMuZ2V0SWNvblBhY2suYmluZCh0aGlzKX0gLz4sXG4gICAgICB0aGlzLmNvbnRlbnRFbCxcbiAgICApO1xuICB9XG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSh0aGlzLmNvbnRlbnRFbCk7XG4gIH1cblxuICBhc3luYyBnZXRJY29uUGFjayhwYXRoOiBzdHJpbmcsIGJyYW5jaD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRvd25sb2FkID0gYXN5bmMgKGFsdCA9IGZhbHNlKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSBnZXRJY29uUGFja0J1bmRsZVVybChwYXRoLCBicmFuY2gsIGFsdCksXG4gICAgICAgIHppcCA9IChhd2FpdCByZXF1ZXN0VXJsKHsgdXJsIH0pKS5hcnJheUJ1ZmZlcjtcbiAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnBhY2tNYW5hZ2VyLmltcG9ydEljb25zKFxuICAgICAgICB7IG5hbWU6IHVybC5zcGxpdChcIi9cIikucG9wKCkhLCBkYXRhOiB6aXAgfSxcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRvd25sb2FkKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJzd2l0Y2ggdG8gYWx0ZXJuYXRpdmUgbGlua1wiLCBlcnJvcik7XG4gICAgICBhd2FpdCBkb3dubG9hZCh0cnVlKTtcbiAgICB9XG4gIH1cbn1cblxudHlwZSBjb21tb25LZXlzID0gXCJzZXJpZXNcIiB8IFwiZGVzY3JpcHRpb25cIiB8IFwiaG9tZXBhZ2VcIiB8IFwibGljZW5zZVwiO1xudHlwZSBTdHlsZUluZm8gPSBPbWl0PEljb25QYWNrTWFuaWZlc3RSYXcsIGNvbW1vbktleXM+O1xudHlwZSBJY29uUGFja01hbmlmZXN0ID0gUGljazxJY29uUGFja01hbmlmZXN0UmF3LCBjb21tb25LZXlzPiAmXG4gIFJlY29yZDxcInN0eWxlc1wiLCBTdHlsZUluZm9bXT4gJlxuICBSZWNvcmQ8XCJjb3VudFwiLCBudW1iZXI+O1xuXG5jb25zdCBnZXRNYW5pZmVzdExpc3QgPSBhc3luYyAoXG4gIGJyYW5jaCA9IFwibWFzdGVyXCIsXG4pOiBQcm9taXNlPEljb25QYWNrTWFuaWZlc3RbXT4gPT4ge1xuICBjb25zdCByYXdMaXN0ID0gKGF3YWl0IGdldE1hbmlmZXN0VmlhQVBJKGJyYW5jaCkpIGFzIEljb25QYWNrTWFuaWZlc3RSYXdbXTtcbiAgbGV0IGxpc3Q6IEljb25QYWNrTWFuaWZlc3RbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG1hbmlmZXN0IG9mIHJhd0xpc3QpIHtcbiAgICBsZXQgbGFzdCA9IGxpc3QubGFzdCgpO1xuICAgIGlmIChsYXN0Py5zZXJpZXMgPT09IG1hbmlmZXN0LnNlcmllcykge1xuICAgICAgbGFzdC5zdHlsZXMucHVzaChtYW5pZmVzdCk7XG4gICAgICBsYXN0LmNvdW50ICs9IG1hbmlmZXN0LmNvdW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnB1c2goe1xuICAgICAgICBob21lcGFnZTogbWFuaWZlc3QuaG9tZXBhZ2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBtYW5pZmVzdC5kZXNjcmlwdGlvbixcbiAgICAgICAgc2VyaWVzOiBtYW5pZmVzdC5zZXJpZXMsXG4gICAgICAgIGxpY2Vuc2U6IG1hbmlmZXN0LmxpY2Vuc2UsXG4gICAgICAgIHN0eWxlczogW21hbmlmZXN0XSxcbiAgICAgICAgY291bnQ6IG1hbmlmZXN0LmNvdW50LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBsaXN0O1xufTtcblxuY29uc3QgQnJvd3NlclBhY2tWaWV3ID0gKHtcbiAgZ2V0SWNvblBhY2ssXG59OiB7XG4gIGdldEljb25QYWNrOiAocGF0aDogc3RyaW5nLCBicmFuY2g/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG59KSA9PiB7XG4gIGNvbnN0IFttYW5pZmVzdExpc3QsIHNldE1hbmlmZXN0TGlzdF0gPSB1c2VTdGF0ZTxcbiAgICBJY29uUGFja01hbmlmZXN0W10gfCBudWxsIHwgRXJyb3JcbiAgPihudWxsKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBnZXRNYW5pZmVzdExpc3QoKS50aGVuKHNldE1hbmlmZXN0TGlzdCkuY2F0Y2goc2V0TWFuaWZlc3RMaXN0KTtcbiAgfSwgW10pO1xuICBpZiAobWFuaWZlc3RMaXN0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibG9hZGluZ1wiPlxuICAgICAgICA8TG9hZGluZyB0eXBlPVwic3BpblwiIGNsYXNzTmFtZT1cImxvYWRpbmctaW5kaWNhdG9yXCIgLz5cbiAgICAgICAgPGRpdj5Mb2FkaW5nIEljb24gUGFjayBMaXN0Li4uPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobWFuaWZlc3RMaXN0KSkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImljb24tcGFjay1saXN0XCI+XG4gICAgICAgIHttYW5pZmVzdExpc3QubWFwKChtYW5pZmVzdCkgPT4gKFxuICAgICAgICAgIDxJY29uUGFja01hbmlmZXN0XG4gICAgICAgICAgICBrZXk9e21hbmlmZXN0LmhvbWVwYWdlfVxuICAgICAgICAgICAgbWFuaWZlc3Q9e21hbmlmZXN0fVxuICAgICAgICAgICAgb25Eb3dubG9hZD17KHBhdGgpID0+IGdldEljb25QYWNrKHBhdGgpfVxuICAgICAgICAgIC8+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKG1hbmlmZXN0TGlzdCk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZXJyb3JcIj5cbiAgICAgICAgRmFpbGVkIHRvIExvYWQgSWNvbiBQYWNrIExpc3Q6XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kLXdhcm5pbmdcIj5cbiAgICAgICAgICB7bWFuaWZlc3RMaXN0Lm1lc3NhZ2UgPz8gbWFuaWZlc3RMaXN0LnRvU3RyaW5nKCl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufTtcblxuaW50ZXJmYWNlIE1hbmlmZXN0RXJyb3JTdGF0ZSB7XG4gIHN0YXRlOiBcImVycm9yXCI7XG4gIGVycm9yOiB1bmtub3duO1xufVxudHlwZSBNYW5pZmVzdFN0YXRlID1cbiAgfCBNYW5pZmVzdEVycm9yU3RhdGVcbiAgfCBSZWNvcmQ8XCJzdGF0ZVwiLCBcImRpc3BsYXlcIiB8IFwiZG93bmxvYWRpbmdcIiB8IFwiZG9uZVwiPjtcblxuY29uc3QgUGFja01hbmlmZXN0Q2xhc3MgPSBcInBhY2stbWFuaWZlc3RcIjtcbmNvbnN0IEljb25QYWNrTWFuaWZlc3QgPSAoe1xuICBtYW5pZmVzdDogeyBzZXJpZXMsIHN0eWxlcywgZGVzY3JpcHRpb24sIGNvdW50LCBob21lcGFnZSwgbGljZW5zZSB9LFxuICBvbkRvd25sb2FkLFxufToge1xuICBtYW5pZmVzdDogSWNvblBhY2tNYW5pZmVzdDtcbiAgb25Eb3dubG9hZDogKHBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbn0pID0+IHtcbiAgY29uc3QgZ2V0U3ViQ2xhc3MgPSB1c2VDYWxsYmFjayhcbiAgICAoY2xhc3NOYW1lOiBzdHJpbmcpID0+IGAke1BhY2tNYW5pZmVzdENsYXNzfS0ke2NsYXNzTmFtZX1gLFxuICAgIFtdLFxuICApO1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtQYWNrTWFuaWZlc3RDbGFzc30+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Z2V0U3ViQ2xhc3MoXCJ0aXRsZVwiKX0+e3Nlcmllc308L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtnZXRTdWJDbGFzcyhcImRldGFpbHNcIil9PlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzTmFtZT17Z2V0U3ViQ2xhc3MoXCJsaWNlbnNlXCIpfVxuICAgICAgICAgIGFyaWEtbGFiZWw9e1wiTGljZW5zZTogXCIgKyBsaWNlbnNlfVxuICAgICAgICA+XG4gICAgICAgICAgPEZpQXdhcmQgc2l6ZT1cIjAuOWVtXCIgLz5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzTmFtZT17Z2V0U3ViQ2xhc3MoXCJjb3VudFwiKX1cbiAgICAgICAgICBhcmlhLWxhYmVsPXtgJHtjb3VudH0gaWNvbnMgaW4gdG90YWxgfVxuICAgICAgICA+XG4gICAgICAgICAgPEZpSW1hZ2Ugc2l6ZT1cIjAuOWVtXCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e1wiaWNvbi10ZXh0XCJ9Pntjb3VudH08L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9e2dldFN1YkNsYXNzKFwiZGVzY1wiKX0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9e2dldFN1YkNsYXNzKFwiaG9tZXBhZ2VcIil9XG4gICAgICAgICAgYXJpYS1sYWJlbD17aG9tZXBhZ2V9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gd2luZG93Lm9wZW4oaG9tZXBhZ2UpfVxuICAgICAgICA+XG4gICAgICAgICAgPEZpSG9tZSAvPlxuICAgICAgICAgIDxhIGNsYXNzTmFtZT17XCJpY29uLXRleHRcIn0+SG9tZSBQYWdlPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAge2Rlc2NyaXB0aW9ufVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInN0eWxlcy1saXN0XCI+XG4gICAgICAgIHtzdHlsZXMubWFwKChzdHlsZSkgPT4gKFxuICAgICAgICAgIDxJY29uUGFja1N0eWxlXG4gICAgICAgICAgICBrZXk9e3N0eWxlLmJ1bmRsZU5hbWV9XG4gICAgICAgICAgICBzdHlsZUluZm89e3N0eWxlfVxuICAgICAgICAgICAgb25Eb3dubG9hZD17b25Eb3dubG9hZH1cbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuY29uc3QgU3R5bGVJbmZvQ2xhc3MgPSBcInN0eWxlLWluZm9cIixcbiAgZ2V0U3R5bGVJbmZvQ2xhc3MgPSAoLi4uY2xhc3Nlczogc3RyaW5nW10pID0+IGNscyhTdHlsZUluZm9DbGFzcywgLi4uY2xhc3Nlcyk7XG5jb25zdCBJY29uUGFja1N0eWxlID0gKHtcbiAgc3R5bGVJbmZvOiB7IGNvdW50LCBwYWNrSWQsIHBhdGgsIHN0eWxlIH0sXG4gIG9uRG93bmxvYWQsXG59OiB7XG4gIHN0eWxlSW5mbzogU3R5bGVJbmZvO1xuICBvbkRvd25sb2FkOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xufSkgPT4ge1xuICBjb25zdCBnZXRTdWJDbGFzcyA9IHVzZUNhbGxiYWNrKFxuICAgIChjbGFzc05hbWU6IHN0cmluZykgPT4gYCR7U3R5bGVJbmZvQ2xhc3N9LSR7Y2xhc3NOYW1lfWAsXG4gICAgW10sXG4gICk7XG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gdXNlU3RhdGU8TWFuaWZlc3RTdGF0ZT4oeyBzdGF0ZTogXCJkaXNwbGF5XCIgfSk7XG4gIHN3aXRjaCAoc3RhdGUuc3RhdGUpIHtcbiAgICBjYXNlIFwiZGlzcGxheVwiOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2dldFN0eWxlSW5mb0NsYXNzKCl9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtnZXRTdWJDbGFzcyhcInRpdGxlXCIpfT5cbiAgICAgICAgICAgIHtzdHlsZSA/IHN0eWxlIDogXCJyZWd1bGFyXCJ9XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2dldFN1YkNsYXNzKFwicGFjay1pZFwiKX1cbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlBhY2sgaWQgdXNlZCBhcyBzaG9ydGNvZGUgcHJlZml4XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3BhY2tJZH1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtnZXRTdWJDbGFzcyhcImRldGFpbHNcIil9PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2dldFN1YkNsYXNzKFwiY291bnRcIil9XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2Ake2NvdW50fSBpY29ucyBpbiB0b3RhbGB9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxGaUltYWdlIHNpemU9XCIwLjllbVwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17XCJpY29uLXRleHRcIn0+e2NvdW50fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtnZXRTdWJDbGFzcyhcImJ1dHRvbi1jb250YWluZXJcIil9PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2dldFN1YkNsYXNzKFwiZG93bmxvYWRcIil9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRTdGF0ZSh7IHN0YXRlOiBcImRvd25sb2FkaW5nXCIgfSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IG9uRG93bmxvYWQocGF0aCk7XG4gICAgICAgICAgICAgICAgICBzZXRTdGF0ZSh7IHN0YXRlOiBcImRvbmVcIiB9KTtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZG9uZVwiKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICBzZXRTdGF0ZSh7IHN0YXRlOiBcImVycm9yXCIsIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkRvd25sb2FkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEZpRG93bmxvYWQgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRG93bmxvYWQgdmlhIEJyb3dzZXJcIlxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB3aW5kb3cub3BlbihnZXRJY29uUGFja0J1bmRsZVVybChwYXRoKSl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxGaUV4dGVybmFsTGluayAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIFwiZG93bmxvYWRpbmdcIjpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtnZXRTdHlsZUluZm9DbGFzcyhcImRvd25sb2FkaW5nXCIpfT5cbiAgICAgICAgICA8TG9hZGluZyB0eXBlPVwiYnViYmxlc1wiIGNsYXNzTmFtZT1cImxvYWRpbmctaW5kaWNhdG9yXCIgLz5cbiAgICAgICAgICA8ZGl2PkRvd25sb2FkaW5nLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIFwiZG9uZVwiOlxuICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXtnZXRTdHlsZUluZm9DbGFzcyhcImRvbmVcIil9PkRvd25sb2FkZWQ8L2Rpdj47XG4gICAgY2FzZSBcImVycm9yXCI6XG4gICAgICBjb25zb2xlLmVycm9yKHN0YXRlLmVycm9yKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtnZXRTdHlsZUluZm9DbGFzcyhcImVycm9yXCIpfT5cbiAgICAgICAgICBGYWlsZWQgdG8gRG93bmxvYWQ6XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2Qtd2FybmluZ1wiPlxuICAgICAgICAgICAge3N0YXRlLmVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgPyBzdGF0ZS5lcnJvci5tZXNzYWdlXG4gICAgICAgICAgICAgIDogKHN0YXRlLmVycm9yIGFzIGFueSk/LnRvU3RyaW5nKCl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIoc3RhdGUpO1xuICB9XG59O1xuIiwgImV4cG9ydCBjb25zdCBFTVBUWV9PQkogPSB7fTtcbmV4cG9ydCBjb25zdCBFTVBUWV9BUlIgPSBbXTtcbmV4cG9ydCBjb25zdCBJU19OT05fRElNRU5TSU9OQUwgPSAvYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pO1xuIiwgImltcG9ydCB7IEVNUFRZX0FSUiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEFzc2lnbiBwcm9wZXJ0aWVzIGZyb20gYHByb3BzYCB0byBgb2JqYFxuICogQHRlbXBsYXRlIE8sIFAgVGhlIG9iaiBhbmQgcHJvcHMgdHlwZXNcbiAqIEBwYXJhbSB7T30gb2JqIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvXG4gKiBAcGFyYW0ge1B9IHByb3BzIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIEByZXR1cm5zIHtPICYgUH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnbihvYmosIHByb3BzKSB7XG5cdC8vIEB0cy1pZ25vcmUgV2UgY2hhbmdlIHRoZSB0eXBlIG9mIGBvYmpgIHRvIGJlIGBPICYgUGBcblx0Zm9yIChsZXQgaSBpbiBwcm9wcykgb2JqW2ldID0gcHJvcHNbaV07XG5cdHJldHVybiAvKiogQHR5cGUge08gJiBQfSAqLyAob2JqKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYSBjaGlsZCBub2RlIGZyb20gaXRzIHBhcmVudCBpZiBhdHRhY2hlZC4gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yXG4gKiBJRTExIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBgRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlKClgLiBVc2luZyB0aGlzIGZ1bmN0aW9uXG4gKiBpcyBzbWFsbGVyIHRoYW4gaW5jbHVkaW5nIGEgZGVkaWNhdGVkIHBvbHlmaWxsLlxuICogQHBhcmFtIHtOb2RlfSBub2RlIFRoZSBub2RlIHRvIHJlbW92ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlKSB7XG5cdGxldCBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXHRpZiAocGFyZW50Tm9kZSkgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNsaWNlID0gRU1QVFlfQVJSLnNsaWNlO1xuIiwgImltcG9ydCB7IF9jYXRjaEVycm9yIH0gZnJvbSAnLi9kaWZmL2NhdGNoLWVycm9yJztcblxuLyoqXG4gKiBUaGUgYG9wdGlvbmAgb2JqZWN0IGNhbiBwb3RlbnRpYWxseSBjb250YWluIGNhbGxiYWNrIGZ1bmN0aW9uc1xuICogdGhhdCBhcmUgY2FsbGVkIGR1cmluZyB2YXJpb3VzIHN0YWdlcyBvZiBvdXIgcmVuZGVyZXIuIFRoaXMgaXMgdGhlXG4gKiBmb3VuZGF0aW9uIG9uIHdoaWNoIGFsbCBvdXIgYWRkb25zIGxpa2UgYHByZWFjdC9kZWJ1Z2AsIGBwcmVhY3QvY29tcGF0YCxcbiAqIGFuZCBgcHJlYWN0L2hvb2tzYCBhcmUgYmFzZWQgb24uIFNlZSB0aGUgYE9wdGlvbnNgIHR5cGUgaW4gYGludGVybmFsLmQudHNgXG4gKiBmb3IgYSBmdWxsIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbiBob29rcyAobW9zdCBlZGl0b3JzL0lERXMgYWxsb3cgeW91IHRvXG4gKiBjdHJsK2NsaWNrIG9yIGNtZCtjbGljayBvbiBtYWMgdGhlIHR5cGUgZGVmaW5pdGlvbiBiZWxvdykuXG4gKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuT3B0aW9uc31cbiAqL1xuY29uc3Qgb3B0aW9ucyA9IHtcblx0X2NhdGNoRXJyb3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG9wdGlvbnM7XG4iLCAiaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi9vcHRpb25zJztcblxubGV0IHZub2RlSWQgPSAwO1xuXG4vKipcbiAqIENyZWF0ZSBhbiB2aXJ0dWFsIG5vZGUgKHVzZWQgZm9yIEpTWClcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGVbXCJ0eXBlXCJdfSB0eXBlIFRoZSBub2RlIG5hbWUgb3IgQ29tcG9uZW50XG4gKiBjb25zdHJ1Y3RvciBmb3IgdGhpcyB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZH0gW3Byb3BzXSBUaGUgcHJvcGVydGllcyBvZiB0aGUgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge0FycmF5PGltcG9ydCgnLicpLkNvbXBvbmVudENoaWxkcmVuPn0gW2NoaWxkcmVuXSBUaGUgY2hpbGRyZW4gb2YgdGhlIHZpcnR1YWwgbm9kZVxuICogQHJldHVybnMge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlZOb2RlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcblx0bGV0IG5vcm1hbGl6ZWRQcm9wcyA9IHt9LFxuXHRcdGtleSxcblx0XHRyZWYsXG5cdFx0aTtcblx0Zm9yIChpIGluIHByb3BzKSB7XG5cdFx0aWYgKGkgPT0gJ2tleScpIGtleSA9IHByb3BzW2ldO1xuXHRcdGVsc2UgaWYgKGkgPT0gJ3JlZicpIHJlZiA9IHByb3BzW2ldO1xuXHRcdGVsc2Ugbm9ybWFsaXplZFByb3BzW2ldID0gcHJvcHNbaV07XG5cdH1cblxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcblx0XHRub3JtYWxpemVkUHJvcHMuY2hpbGRyZW4gPVxuXHRcdFx0YXJndW1lbnRzLmxlbmd0aCA+IDMgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMikgOiBjaGlsZHJlbjtcblx0fVxuXG5cdC8vIElmIGEgQ29tcG9uZW50IFZOb2RlLCBjaGVjayBmb3IgYW5kIGFwcGx5IGRlZmF1bHRQcm9wc1xuXHQvLyBOb3RlOiB0eXBlIG1heSBiZSB1bmRlZmluZWQgaW4gZGV2ZWxvcG1lbnQsIG11c3QgbmV2ZXIgZXJyb3IgaGVyZS5cblx0aWYgKHR5cGVvZiB0eXBlID09ICdmdW5jdGlvbicgJiYgdHlwZS5kZWZhdWx0UHJvcHMgIT0gbnVsbCkge1xuXHRcdGZvciAoaSBpbiB0eXBlLmRlZmF1bHRQcm9wcykge1xuXHRcdFx0aWYgKG5vcm1hbGl6ZWRQcm9wc1tpXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG5vcm1hbGl6ZWRQcm9wc1tpXSA9IHR5cGUuZGVmYXVsdFByb3BzW2ldO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBub3JtYWxpemVkUHJvcHMsIGtleSwgcmVmLCBudWxsKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBWTm9kZSAodXNlZCBpbnRlcm5hbGx5IGJ5IFByZWFjdClcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGVbXCJ0eXBlXCJdfSB0eXBlIFRoZSBub2RlIG5hbWUgb3IgQ29tcG9uZW50XG4gKiBDb25zdHJ1Y3RvciBmb3IgdGhpcyB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0IHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgb2YgdGhpcyB2aXJ0dWFsIG5vZGUuXG4gKiBJZiB0aGlzIHZpcnR1YWwgbm9kZSByZXByZXNlbnRzIGEgdGV4dCBub2RlLCB0aGlzIGlzIHRoZSB0ZXh0IG9mIHRoZSBub2RlIChzdHJpbmcgb3IgbnVtYmVyKS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0ga2V5IFRoZSBrZXkgZm9yIHRoaXMgdmlydHVhbCBub2RlLCB1c2VkIHdoZW5cbiAqIGRpZmZpbmcgaXQgYWdhaW5zdCBpdHMgY2hpbGRyZW5cbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGVbXCJyZWZcIl19IHJlZiBUaGUgcmVmIHByb3BlcnR5IHRoYXQgd2lsbFxuICogcmVjZWl2ZSBhIHJlZmVyZW5jZSB0byBpdHMgY3JlYXRlZCBjaGlsZFxuICogQHJldHVybnMge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlZOb2RlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVk5vZGUodHlwZSwgcHJvcHMsIGtleSwgcmVmLCBvcmlnaW5hbCkge1xuXHQvLyBWOCBzZWVtcyB0byBiZSBiZXR0ZXIgYXQgZGV0ZWN0aW5nIHR5cGUgc2hhcGVzIGlmIHRoZSBvYmplY3QgaXMgYWxsb2NhdGVkIGZyb20gdGhlIHNhbWUgY2FsbCBzaXRlXG5cdC8vIERvIG5vdCBpbmxpbmUgaW50byBjcmVhdGVFbGVtZW50IGFuZCBjb2VyY2VUb1ZOb2RlIVxuXHRjb25zdCB2bm9kZSA9IHtcblx0XHR0eXBlLFxuXHRcdHByb3BzLFxuXHRcdGtleSxcblx0XHRyZWYsXG5cdFx0X2NoaWxkcmVuOiBudWxsLFxuXHRcdF9wYXJlbnQ6IG51bGwsXG5cdFx0X2RlcHRoOiAwLFxuXHRcdF9kb206IG51bGwsXG5cdFx0Ly8gX25leHREb20gbXVzdCBiZSBpbml0aWFsaXplZCB0byB1bmRlZmluZWQgYi9jIGl0IHdpbGwgZXZlbnR1YWxseVxuXHRcdC8vIGJlIHNldCB0byBkb20ubmV4dFNpYmxpbmcgd2hpY2ggY2FuIHJldHVybiBgbnVsbGAgYW5kIGl0IGlzIGltcG9ydGFudFxuXHRcdC8vIHRvIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbiB1bmluaXRpYWxpemVkIF9uZXh0RG9tIGFuZFxuXHRcdC8vIGEgX25leHREb20gdGhhdCBoYXMgYmVlbiBzZXQgdG8gYG51bGxgXG5cdFx0X25leHREb206IHVuZGVmaW5lZCxcblx0XHRfY29tcG9uZW50OiBudWxsLFxuXHRcdF9oeWRyYXRpbmc6IG51bGwsXG5cdFx0Y29uc3RydWN0b3I6IHVuZGVmaW5lZCxcblx0XHRfb3JpZ2luYWw6IG9yaWdpbmFsID09IG51bGwgPyArK3Zub2RlSWQgOiBvcmlnaW5hbFxuXHR9O1xuXG5cdC8vIE9ubHkgaW52b2tlIHRoZSB2bm9kZSBob29rIGlmIHRoaXMgd2FzICpub3QqIGEgZGlyZWN0IGNvcHk6XG5cdGlmIChvcmlnaW5hbCA9PSBudWxsICYmIG9wdGlvbnMudm5vZGUgIT0gbnVsbCkgb3B0aW9ucy52bm9kZSh2bm9kZSk7XG5cblx0cmV0dXJuIHZub2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVmKCkge1xuXHRyZXR1cm4geyBjdXJyZW50OiBudWxsIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGcmFnbWVudChwcm9wcykge1xuXHRyZXR1cm4gcHJvcHMuY2hpbGRyZW47XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSB0aGUgYXJndW1lbnQgaXMgYSB2YWxpZCBQcmVhY3QgVk5vZGUuXG4gKiBAcGFyYW0geyp9IHZub2RlXG4gKiBAcmV0dXJucyB7dm5vZGUgaXMgaW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9XG4gKi9cbmV4cG9ydCBjb25zdCBpc1ZhbGlkRWxlbWVudCA9IHZub2RlID0+XG5cdHZub2RlICE9IG51bGwgJiYgdm5vZGUuY29uc3RydWN0b3IgPT09IHVuZGVmaW5lZDtcbiIsICJpbXBvcnQgeyBhc3NpZ24gfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgZGlmZiwgY29tbWl0Um9vdCB9IGZyb20gJy4vZGlmZi9pbmRleCc7XG5pbXBvcnQgb3B0aW9ucyBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgRnJhZ21lbnQgfSBmcm9tICcuL2NyZWF0ZS1lbGVtZW50JztcblxuLyoqXG4gKiBCYXNlIENvbXBvbmVudCBjbGFzcy4gUHJvdmlkZXMgYHNldFN0YXRlKClgIGFuZCBgZm9yY2VVcGRhdGUoKWAsIHdoaWNoXG4gKiB0cmlnZ2VyIHJlbmRlcmluZ1xuICogQHBhcmFtIHtvYmplY3R9IHByb3BzIFRoZSBpbml0aWFsIGNvbXBvbmVudCBwcm9wc1xuICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgVGhlIGluaXRpYWwgY29udGV4dCBmcm9tIHBhcmVudCBjb21wb25lbnRzJ1xuICogZ2V0Q2hpbGRDb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb21wb25lbnQocHJvcHMsIGNvbnRleHQpIHtcblx0dGhpcy5wcm9wcyA9IHByb3BzO1xuXHR0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xufVxuXG4vKipcbiAqIFVwZGF0ZSBjb21wb25lbnQgc3RhdGUgYW5kIHNjaGVkdWxlIGEgcmUtcmVuZGVyLlxuICogQHRoaXMge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbXBvbmVudH1cbiAqIEBwYXJhbSB7b2JqZWN0IHwgKChzOiBvYmplY3QsIHA6IG9iamVjdCkgPT4gb2JqZWN0KX0gdXBkYXRlIEEgaGFzaCBvZiBzdGF0ZVxuICogcHJvcGVydGllcyB0byB1cGRhdGUgd2l0aCBuZXcgdmFsdWVzIG9yIGEgZnVuY3Rpb24gdGhhdCBnaXZlbiB0aGUgY3VycmVudFxuICogc3RhdGUgYW5kIHByb3BzIHJldHVybnMgYSBuZXcgcGFydGlhbCBzdGF0ZVxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBbY2FsbGJhY2tdIEEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uY2UgY29tcG9uZW50IHN0YXRlIGlzXG4gKiB1cGRhdGVkXG4gKi9cbkNvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbih1cGRhdGUsIGNhbGxiYWNrKSB7XG5cdC8vIG9ubHkgY2xvbmUgc3RhdGUgd2hlbiBjb3B5aW5nIHRvIG5leHRTdGF0ZSB0aGUgZmlyc3QgdGltZS5cblx0bGV0IHM7XG5cdGlmICh0aGlzLl9uZXh0U3RhdGUgIT0gbnVsbCAmJiB0aGlzLl9uZXh0U3RhdGUgIT09IHRoaXMuc3RhdGUpIHtcblx0XHRzID0gdGhpcy5fbmV4dFN0YXRlO1xuXHR9IGVsc2Uge1xuXHRcdHMgPSB0aGlzLl9uZXh0U3RhdGUgPSBhc3NpZ24oe30sIHRoaXMuc3RhdGUpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiB1cGRhdGUgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdC8vIFNvbWUgbGlicmFyaWVzIGxpa2UgYGltbWVyYCBtYXJrIHRoZSBjdXJyZW50IHN0YXRlIGFzIHJlYWRvbmx5LFxuXHRcdC8vIHByZXZlbnRpbmcgdXMgZnJvbSBtdXRhdGluZyBpdCwgc28gd2UgbmVlZCB0byBjbG9uZSBpdC4gU2VlICMyNzE2XG5cdFx0dXBkYXRlID0gdXBkYXRlKGFzc2lnbih7fSwgcyksIHRoaXMucHJvcHMpO1xuXHR9XG5cblx0aWYgKHVwZGF0ZSkge1xuXHRcdGFzc2lnbihzLCB1cGRhdGUpO1xuXHR9XG5cblx0Ly8gU2tpcCB1cGRhdGUgaWYgdXBkYXRlciBmdW5jdGlvbiByZXR1cm5lZCBudWxsXG5cdGlmICh1cGRhdGUgPT0gbnVsbCkgcmV0dXJuO1xuXG5cdGlmICh0aGlzLl92bm9kZSkge1xuXHRcdGlmIChjYWxsYmFjaykgdGhpcy5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuXHRcdGVucXVldWVSZW5kZXIodGhpcyk7XG5cdH1cbn07XG5cbi8qKlxuICogSW1tZWRpYXRlbHkgcGVyZm9ybSBhIHN5bmNocm9ub3VzIHJlLXJlbmRlciBvZiB0aGUgY29tcG9uZW50XG4gKiBAdGhpcyB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fVxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBbY2FsbGJhY2tdIEEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpc1xuICogcmUtcmVuZGVyZWRcbiAqL1xuQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG5cdGlmICh0aGlzLl92bm9kZSkge1xuXHRcdC8vIFNldCByZW5kZXIgbW9kZSBzbyB0aGF0IHdlIGNhbiBkaWZmZXJlbnRpYXRlIHdoZXJlIHRoZSByZW5kZXIgcmVxdWVzdFxuXHRcdC8vIGlzIGNvbWluZyBmcm9tLiBXZSBuZWVkIHRoaXMgYmVjYXVzZSBmb3JjZVVwZGF0ZSBzaG91bGQgbmV2ZXIgY2FsbFxuXHRcdC8vIHNob3VsZENvbXBvbmVudFVwZGF0ZVxuXHRcdHRoaXMuX2ZvcmNlID0gdHJ1ZTtcblx0XHRpZiAoY2FsbGJhY2spIHRoaXMuX3JlbmRlckNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcblx0XHRlbnF1ZXVlUmVuZGVyKHRoaXMpO1xuXHR9XG59O1xuXG4vKipcbiAqIEFjY2VwdHMgYHByb3BzYCBhbmQgYHN0YXRlYCwgYW5kIHJldHVybnMgYSBuZXcgVmlydHVhbCBET00gdHJlZSB0byBidWlsZC5cbiAqIFZpcnR1YWwgRE9NIGlzIGdlbmVyYWxseSBjb25zdHJ1Y3RlZCB2aWEgW0pTWF0oaHR0cDovL2phc29uZm9ybWF0LmNvbS93dGYtaXMtanN4KS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wcyBQcm9wcyAoZWc6IEpTWCBhdHRyaWJ1dGVzKSByZWNlaXZlZCBmcm9tIHBhcmVudFxuICogZWxlbWVudC9jb21wb25lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0ZSBUaGUgY29tcG9uZW50J3MgY3VycmVudCBzdGF0ZVxuICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgQ29udGV4dCBvYmplY3QsIGFzIHJldHVybmVkIGJ5IHRoZSBuZWFyZXN0XG4gKiBhbmNlc3RvcidzIGBnZXRDaGlsZENvbnRleHQoKWBcbiAqIEByZXR1cm5zIHtpbXBvcnQoJy4vaW5kZXgnKS5Db21wb25lbnRDaGlsZHJlbiB8IHZvaWR9XG4gKi9cbkNvbXBvbmVudC5wcm90b3R5cGUucmVuZGVyID0gRnJhZ21lbnQ7XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5WTm9kZX0gdm5vZGVcbiAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbH0gW2NoaWxkSW5kZXhdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREb21TaWJsaW5nKHZub2RlLCBjaGlsZEluZGV4KSB7XG5cdGlmIChjaGlsZEluZGV4ID09IG51bGwpIHtcblx0XHQvLyBVc2UgY2hpbGRJbmRleD09bnVsbCBhcyBhIHNpZ25hbCB0byByZXN1bWUgdGhlIHNlYXJjaCBmcm9tIHRoZSB2bm9kZSdzIHNpYmxpbmdcblx0XHRyZXR1cm4gdm5vZGUuX3BhcmVudFxuXHRcdFx0PyBnZXREb21TaWJsaW5nKHZub2RlLl9wYXJlbnQsIHZub2RlLl9wYXJlbnQuX2NoaWxkcmVuLmluZGV4T2Yodm5vZGUpICsgMSlcblx0XHRcdDogbnVsbDtcblx0fVxuXG5cdGxldCBzaWJsaW5nO1xuXHRmb3IgKDsgY2hpbGRJbmRleCA8IHZub2RlLl9jaGlsZHJlbi5sZW5ndGg7IGNoaWxkSW5kZXgrKykge1xuXHRcdHNpYmxpbmcgPSB2bm9kZS5fY2hpbGRyZW5bY2hpbGRJbmRleF07XG5cblx0XHRpZiAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuX2RvbSAhPSBudWxsKSB7XG5cdFx0XHQvLyBTaW5jZSB1cGRhdGVQYXJlbnREb21Qb2ludGVycyBrZWVwcyBfZG9tIHBvaW50ZXIgY29ycmVjdCxcblx0XHRcdC8vIHdlIGNhbiByZWx5IG9uIF9kb20gdG8gdGVsbCB1cyBpZiB0aGlzIHN1YnRyZWUgY29udGFpbnMgYVxuXHRcdFx0Ly8gcmVuZGVyZWQgRE9NIG5vZGUsIGFuZCB3aGF0IHRoZSBmaXJzdCByZW5kZXJlZCBET00gbm9kZSBpc1xuXHRcdFx0cmV0dXJuIHNpYmxpbmcuX2RvbTtcblx0XHR9XG5cdH1cblxuXHQvLyBJZiB3ZSBnZXQgaGVyZSwgd2UgaGF2ZSBub3QgZm91bmQgYSBET00gbm9kZSBpbiB0aGlzIHZub2RlJ3MgY2hpbGRyZW4uXG5cdC8vIFdlIG11c3QgcmVzdW1lIGZyb20gdGhpcyB2bm9kZSdzIHNpYmxpbmcgKGluIGl0J3MgcGFyZW50IF9jaGlsZHJlbiBhcnJheSlcblx0Ly8gT25seSBjbGltYiB1cCBhbmQgc2VhcmNoIHRoZSBwYXJlbnQgaWYgd2UgYXJlbid0IHNlYXJjaGluZyB0aHJvdWdoIGEgRE9NXG5cdC8vIFZOb2RlIChtZWFuaW5nIHdlIHJlYWNoZWQgdGhlIERPTSBwYXJlbnQgb2YgdGhlIG9yaWdpbmFsIHZub2RlIHRoYXQgYmVnYW5cblx0Ly8gdGhlIHNlYXJjaClcblx0cmV0dXJuIHR5cGVvZiB2bm9kZS50eXBlID09ICdmdW5jdGlvbicgPyBnZXREb21TaWJsaW5nKHZub2RlKSA6IG51bGw7XG59XG5cbi8qKlxuICogVHJpZ2dlciBpbi1wbGFjZSByZS1yZW5kZXJpbmcgb2YgYSBjb21wb25lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbXBvbmVudH0gY29tcG9uZW50IFRoZSBjb21wb25lbnQgdG8gcmVyZW5kZXJcbiAqL1xuZnVuY3Rpb24gcmVuZGVyQ29tcG9uZW50KGNvbXBvbmVudCkge1xuXHRsZXQgdm5vZGUgPSBjb21wb25lbnQuX3Zub2RlLFxuXHRcdG9sZERvbSA9IHZub2RlLl9kb20sXG5cdFx0cGFyZW50RG9tID0gY29tcG9uZW50Ll9wYXJlbnREb207XG5cblx0aWYgKHBhcmVudERvbSkge1xuXHRcdGxldCBjb21taXRRdWV1ZSA9IFtdO1xuXHRcdGNvbnN0IG9sZFZOb2RlID0gYXNzaWduKHt9LCB2bm9kZSk7XG5cdFx0b2xkVk5vZGUuX29yaWdpbmFsID0gdm5vZGUuX29yaWdpbmFsICsgMTtcblxuXHRcdGRpZmYoXG5cdFx0XHRwYXJlbnREb20sXG5cdFx0XHR2bm9kZSxcblx0XHRcdG9sZFZOb2RlLFxuXHRcdFx0Y29tcG9uZW50Ll9nbG9iYWxDb250ZXh0LFxuXHRcdFx0cGFyZW50RG9tLm93bmVyU1ZHRWxlbWVudCAhPT0gdW5kZWZpbmVkLFxuXHRcdFx0dm5vZGUuX2h5ZHJhdGluZyAhPSBudWxsID8gW29sZERvbV0gOiBudWxsLFxuXHRcdFx0Y29tbWl0UXVldWUsXG5cdFx0XHRvbGREb20gPT0gbnVsbCA/IGdldERvbVNpYmxpbmcodm5vZGUpIDogb2xkRG9tLFxuXHRcdFx0dm5vZGUuX2h5ZHJhdGluZ1xuXHRcdCk7XG5cdFx0Y29tbWl0Um9vdChjb21taXRRdWV1ZSwgdm5vZGUpO1xuXG5cdFx0aWYgKHZub2RlLl9kb20gIT0gb2xkRG9tKSB7XG5cdFx0XHR1cGRhdGVQYXJlbnREb21Qb2ludGVycyh2bm9kZSk7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5WTm9kZX0gdm5vZGVcbiAqL1xuZnVuY3Rpb24gdXBkYXRlUGFyZW50RG9tUG9pbnRlcnModm5vZGUpIHtcblx0aWYgKCh2bm9kZSA9IHZub2RlLl9wYXJlbnQpICE9IG51bGwgJiYgdm5vZGUuX2NvbXBvbmVudCAhPSBudWxsKSB7XG5cdFx0dm5vZGUuX2RvbSA9IHZub2RlLl9jb21wb25lbnQuYmFzZSA9IG51bGw7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2bm9kZS5fY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCBjaGlsZCA9IHZub2RlLl9jaGlsZHJlbltpXTtcblx0XHRcdGlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLl9kb20gIT0gbnVsbCkge1xuXHRcdFx0XHR2bm9kZS5fZG9tID0gdm5vZGUuX2NvbXBvbmVudC5iYXNlID0gY2hpbGQuX2RvbTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVwZGF0ZVBhcmVudERvbVBvaW50ZXJzKHZub2RlKTtcblx0fVxufVxuXG4vKipcbiAqIFRoZSByZW5kZXIgcXVldWVcbiAqIEB0eXBlIHtBcnJheTxpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnQ+fVxuICovXG5sZXQgcmVyZW5kZXJRdWV1ZSA9IFtdO1xuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHNjaGVkdWxlIGEgY2FsbGJhY2tcbiAqIEB0eXBlIHsoY2I6ICgpID0+IHZvaWQpID0+IHZvaWR9XG4gKi9cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vLyBOb3RlIHRoZSBmb2xsb3dpbmcgbGluZSBpc24ndCB0cmVlLXNoYWtlbiBieSByb2xsdXAgY3V6IG9mIHJvbGx1cC9yb2xsdXAjMjU2NlxuY29uc3QgZGVmZXIgPVxuXHR0eXBlb2YgUHJvbWlzZSA9PSAnZnVuY3Rpb24nXG5cdFx0PyBQcm9taXNlLnByb3RvdHlwZS50aGVuLmJpbmQoUHJvbWlzZS5yZXNvbHZlKCkpXG5cdFx0OiBzZXRUaW1lb3V0O1xuXG4vKlxuICogVGhlIHZhbHVlIG9mIGBDb21wb25lbnQuZGVib3VuY2VgIG11c3QgYXN5bmNocm9ub3VzbHkgaW52b2tlIHRoZSBwYXNzZWQgaW4gY2FsbGJhY2suIEl0IGlzXG4gKiBpbXBvcnRhbnQgdGhhdCBjb250cmlidXRvcnMgdG8gUHJlYWN0IGNhbiBjb25zaXN0ZW50bHkgcmVhc29uIGFib3V0IHdoYXQgY2FsbHMgdG8gYHNldFN0YXRlYCwgZXRjLlxuICogZG8sIGFuZCB3aGVuIHRoZWlyIGVmZmVjdHMgd2lsbCBiZSBhcHBsaWVkLiBTZWUgdGhlIGxpbmtzIGJlbG93IGZvciBzb21lIGZ1cnRoZXIgcmVhZGluZyBvbiBkZXNpZ25pbmdcbiAqIGFzeW5jaHJvbm91cyBBUElzLlxuICogKiBbRGVzaWduaW5nIEFQSXMgZm9yIEFzeW5jaHJvbnldKGh0dHBzOi8vYmxvZy5penMubWUvMjAxMy8wOC9kZXNpZ25pbmctYXBpcy1mb3ItYXN5bmNocm9ueSlcbiAqICogW0NhbGxiYWNrcyBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzXShodHRwczovL2Jsb2cub21ldGVyLmNvbS8yMDExLzA3LzI0L2NhbGxiYWNrcy1zeW5jaHJvbm91cy1hbmQtYXN5bmNocm9ub3VzLylcbiAqL1xuXG5sZXQgcHJldkRlYm91bmNlO1xuXG4vKipcbiAqIEVucXVldWUgYSByZXJlbmRlciBvZiBhIGNvbXBvbmVudFxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnR9IGMgVGhlIGNvbXBvbmVudCB0byByZXJlbmRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5xdWV1ZVJlbmRlcihjKSB7XG5cdGlmIChcblx0XHQoIWMuX2RpcnR5ICYmXG5cdFx0XHQoYy5fZGlydHkgPSB0cnVlKSAmJlxuXHRcdFx0cmVyZW5kZXJRdWV1ZS5wdXNoKGMpICYmXG5cdFx0XHQhcHJvY2Vzcy5fcmVyZW5kZXJDb3VudCsrKSB8fFxuXHRcdHByZXZEZWJvdW5jZSAhPT0gb3B0aW9ucy5kZWJvdW5jZVJlbmRlcmluZ1xuXHQpIHtcblx0XHRwcmV2RGVib3VuY2UgPSBvcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nO1xuXHRcdChwcmV2RGVib3VuY2UgfHwgZGVmZXIpKHByb2Nlc3MpO1xuXHR9XG59XG5cbi8qKiBGbHVzaCB0aGUgcmVuZGVyIHF1ZXVlIGJ5IHJlcmVuZGVyaW5nIGFsbCBxdWV1ZWQgY29tcG9uZW50cyAqL1xuZnVuY3Rpb24gcHJvY2VzcygpIHtcblx0bGV0IHF1ZXVlO1xuXHR3aGlsZSAoKHByb2Nlc3MuX3JlcmVuZGVyQ291bnQgPSByZXJlbmRlclF1ZXVlLmxlbmd0aCkpIHtcblx0XHRxdWV1ZSA9IHJlcmVuZGVyUXVldWUuc29ydCgoYSwgYikgPT4gYS5fdm5vZGUuX2RlcHRoIC0gYi5fdm5vZGUuX2RlcHRoKTtcblx0XHRyZXJlbmRlclF1ZXVlID0gW107XG5cdFx0Ly8gRG9uJ3QgdXBkYXRlIGByZW5kZXJDb3VudGAgeWV0LiBLZWVwIGl0cyB2YWx1ZSBub24temVybyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5XG5cdFx0Ly8gcHJvY2VzcygpIGNhbGxzIGZyb20gZ2V0dGluZyBzY2hlZHVsZWQgd2hpbGUgYHF1ZXVlYCBpcyBzdGlsbCBiZWluZyBjb25zdW1lZC5cblx0XHRxdWV1ZS5zb21lKGMgPT4ge1xuXHRcdFx0aWYgKGMuX2RpcnR5KSByZW5kZXJDb21wb25lbnQoYyk7XG5cdFx0fSk7XG5cdH1cbn1cbnByb2Nlc3MuX3JlcmVuZGVyQ291bnQgPSAwO1xuIiwgImltcG9ydCB7IGVucXVldWVSZW5kZXIgfSBmcm9tICcuL2NvbXBvbmVudCc7XG5cbmV4cG9ydCBsZXQgaSA9IDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0KGRlZmF1bHRWYWx1ZSwgY29udGV4dElkKSB7XG5cdGNvbnRleHRJZCA9ICdfX2NDJyArIGkrKztcblxuXHRjb25zdCBjb250ZXh0ID0ge1xuXHRcdF9pZDogY29udGV4dElkLFxuXHRcdF9kZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZSxcblx0XHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkZ1bmN0aW9uQ29tcG9uZW50fSAqL1xuXHRcdENvbnN1bWVyKHByb3BzLCBjb250ZXh0VmFsdWUpIHtcblx0XHRcdC8vIHJldHVybiBwcm9wcy5jaGlsZHJlbihcblx0XHRcdC8vIFx0Y29udGV4dFtjb250ZXh0SWRdID8gY29udGV4dFtjb250ZXh0SWRdLnByb3BzLnZhbHVlIDogZGVmYXVsdFZhbHVlXG5cdFx0XHQvLyApO1xuXHRcdFx0cmV0dXJuIHByb3BzLmNoaWxkcmVuKGNvbnRleHRWYWx1ZSk7XG5cdFx0fSxcblx0XHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkZ1bmN0aW9uQ29tcG9uZW50fSAqL1xuXHRcdFByb3ZpZGVyKHByb3BzKSB7XG5cdFx0XHRpZiAoIXRoaXMuZ2V0Q2hpbGRDb250ZXh0KSB7XG5cdFx0XHRcdGxldCBzdWJzID0gW107XG5cdFx0XHRcdGxldCBjdHggPSB7fTtcblx0XHRcdFx0Y3R4W2NvbnRleHRJZF0gPSB0aGlzO1xuXG5cdFx0XHRcdHRoaXMuZ2V0Q2hpbGRDb250ZXh0ID0gKCkgPT4gY3R4O1xuXG5cdFx0XHRcdHRoaXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24oX3Byb3BzKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMucHJvcHMudmFsdWUgIT09IF9wcm9wcy52YWx1ZSkge1xuXHRcdFx0XHRcdFx0Ly8gSSB0aGluayB0aGUgZm9yY2VkIHZhbHVlIHByb3BhZ2F0aW9uIGhlcmUgd2FzIG9ubHkgbmVlZGVkIHdoZW4gYG9wdGlvbnMuZGVib3VuY2VSZW5kZXJpbmdgIHdhcyBiZWluZyBieXBhc3NlZDpcblx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcmVhY3Rqcy9wcmVhY3QvY29tbWl0LzRkMzM5ZmI4MDNiZWEwOWU5ZjE5OGFiZjM4Y2ExYmY4ZWE0Yjc3NzEjZGlmZi01NDY4MmNlMzgwOTM1YTcxN2U0MWI4YmZjNTQ3MzdmNlIzNThcblx0XHRcdFx0XHRcdC8vIEluIHRob3NlIGNhc2VzIHRob3VnaCwgZXZlbiB3aXRoIHRoZSB2YWx1ZSBjb3JyZWN0ZWQsIHdlJ3JlIGRvdWJsZS1yZW5kZXJpbmcgYWxsIG5vZGVzLlxuXHRcdFx0XHRcdFx0Ly8gSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGp1c3QgdGVsbCBmb2xrcyBub3QgdG8gdXNlIGZvcmNlLXN5bmMgbW9kZS5cblx0XHRcdFx0XHRcdC8vIEN1cnJlbnRseSwgdXNpbmcgYHVzZUNvbnRleHQoKWAgaW4gYSBjbGFzcyBjb21wb25lbnQgd2lsbCBvdmVyd3JpdGUgaXRzIGB0aGlzLmNvbnRleHRgIHZhbHVlLlxuXHRcdFx0XHRcdFx0Ly8gc3Vicy5zb21lKGMgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gXHRjLmNvbnRleHQgPSBfcHJvcHMudmFsdWU7XG5cdFx0XHRcdFx0XHQvLyBcdGVucXVldWVSZW5kZXIoYyk7XG5cdFx0XHRcdFx0XHQvLyB9KTtcblxuXHRcdFx0XHRcdFx0Ly8gc3Vicy5zb21lKGMgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gXHRjLmNvbnRleHRbY29udGV4dElkXSA9IF9wcm9wcy52YWx1ZTtcblx0XHRcdFx0XHRcdC8vIFx0ZW5xdWV1ZVJlbmRlcihjKTtcblx0XHRcdFx0XHRcdC8vIH0pO1xuXHRcdFx0XHRcdFx0c3Vicy5zb21lKGVucXVldWVSZW5kZXIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblxuXHRcdFx0XHR0aGlzLnN1YiA9IGMgPT4ge1xuXHRcdFx0XHRcdHN1YnMucHVzaChjKTtcblx0XHRcdFx0XHRsZXQgb2xkID0gYy5jb21wb25lbnRXaWxsVW5tb3VudDtcblx0XHRcdFx0XHRjLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gKCkgPT4ge1xuXHRcdFx0XHRcdFx0c3Vicy5zcGxpY2Uoc3Vicy5pbmRleE9mKGMpLCAxKTtcblx0XHRcdFx0XHRcdGlmIChvbGQpIG9sZC5jYWxsKGMpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBwcm9wcy5jaGlsZHJlbjtcblx0XHR9XG5cdH07XG5cblx0Ly8gRGV2dG9vbHMgbmVlZHMgYWNjZXNzIHRvIHRoZSBjb250ZXh0IG9iamVjdCB3aGVuIGl0XG5cdC8vIGVuY291bnRlcnMgYSBQcm92aWRlci4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gc3VwcG9ydFxuXHQvLyBzZXR0aW5nIGBkaXNwbGF5TmFtZWAgb24gdGhlIGNvbnRleHQgb2JqZWN0IGluc3RlYWRcblx0Ly8gb2Ygb24gdGhlIGNvbXBvbmVudCBpdHNlbGYuIFNlZTpcblx0Ly8gaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2NvbnRleHQuaHRtbCNjb250ZXh0ZGlzcGxheW5hbWVcblxuXHRyZXR1cm4gKGNvbnRleHQuUHJvdmlkZXIuX2NvbnRleHRSZWYgPSBjb250ZXh0LkNvbnN1bWVyLmNvbnRleHRUeXBlID0gY29udGV4dCk7XG59XG4iLCAiaW1wb3J0IHsgZGlmZiwgdW5tb3VudCwgYXBwbHlSZWYgfSBmcm9tICcuL2luZGV4JztcbmltcG9ydCB7IGNyZWF0ZVZOb2RlLCBGcmFnbWVudCB9IGZyb20gJy4uL2NyZWF0ZS1lbGVtZW50JztcbmltcG9ydCB7IEVNUFRZX09CSiwgRU1QVFlfQVJSIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGdldERvbVNpYmxpbmcgfSBmcm9tICcuLi9jb21wb25lbnQnO1xuXG4vKipcbiAqIERpZmYgdGhlIGNoaWxkcmVuIG9mIGEgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBwYXJlbnREb20gVGhlIERPTSBlbGVtZW50IHdob3NlXG4gKiBjaGlsZHJlbiBhcmUgYmVpbmcgZGlmZmVkXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5Db21wb25lbnRDaGlsZHJlbltdfSByZW5kZXJSZXN1bHRcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLlZOb2RlfSBuZXdQYXJlbnRWTm9kZSBUaGUgbmV3IHZpcnR1YWxcbiAqIG5vZGUgd2hvc2UgY2hpbGRyZW4gc2hvdWxkIGJlIGRpZmYnZWQgYWdhaW5zdCBvbGRQYXJlbnRWTm9kZVxuICogQHBhcmFtIHtpbXBvcnQoJy4uL2ludGVybmFsJykuVk5vZGV9IG9sZFBhcmVudFZOb2RlIFRoZSBvbGQgdmlydHVhbFxuICogbm9kZSB3aG9zZSBjaGlsZHJlbiBzaG91bGQgYmUgZGlmZidlZCBhZ2FpbnN0IG5ld1BhcmVudFZOb2RlXG4gKiBAcGFyYW0ge29iamVjdH0gZ2xvYmFsQ29udGV4dCBUaGUgY3VycmVudCBjb250ZXh0IG9iamVjdCAtIG1vZGlmaWVkIGJ5IGdldENoaWxkQ29udGV4dFxuICogQHBhcmFtIHtib29sZWFufSBpc1N2ZyBXaGV0aGVyIG9yIG5vdCB0aGlzIERPTSBub2RlIGlzIGFuIFNWRyBub2RlXG4gKiBAcGFyYW0ge0FycmF5PGltcG9ydCgnLi4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50Pn0gZXhjZXNzRG9tQ2hpbGRyZW5cbiAqIEBwYXJhbSB7QXJyYXk8aW1wb3J0KCcuLi9pbnRlcm5hbCcpLkNvbXBvbmVudD59IGNvbW1pdFF1ZXVlIExpc3Qgb2YgY29tcG9uZW50c1xuICogd2hpY2ggaGF2ZSBjYWxsYmFja3MgdG8gaW52b2tlIGluIGNvbW1pdFJvb3RcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLlByZWFjdEVsZW1lbnR9IG9sZERvbSBUaGUgY3VycmVudCBhdHRhY2hlZCBET01cbiAqIGVsZW1lbnQgYW55IG5ldyBkb20gZWxlbWVudHMgc2hvdWxkIGJlIHBsYWNlZCBhcm91bmQuIExpa2VseSBgbnVsbGAgb24gZmlyc3RcbiAqIHJlbmRlciAoZXhjZXB0IHdoZW4gaHlkcmF0aW5nKS4gQ2FuIGJlIGEgc2libGluZyBET00gZWxlbWVudCB3aGVuIGRpZmZpbmdcbiAqIEZyYWdtZW50cyB0aGF0IGhhdmUgc2libGluZ3MuIEluIG1vc3QgY2FzZXMsIGl0IHN0YXJ0cyBvdXQgYXMgYG9sZENoaWxkcmVuWzBdLl9kb21gLlxuICogQHBhcmFtIHtib29sZWFufSBpc0h5ZHJhdGluZyBXaGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gaHlkcmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmQ2hpbGRyZW4oXG5cdHBhcmVudERvbSxcblx0cmVuZGVyUmVzdWx0LFxuXHRuZXdQYXJlbnRWTm9kZSxcblx0b2xkUGFyZW50Vk5vZGUsXG5cdGdsb2JhbENvbnRleHQsXG5cdGlzU3ZnLFxuXHRleGNlc3NEb21DaGlsZHJlbixcblx0Y29tbWl0UXVldWUsXG5cdG9sZERvbSxcblx0aXNIeWRyYXRpbmdcbikge1xuXHRsZXQgaSwgaiwgb2xkVk5vZGUsIGNoaWxkVk5vZGUsIG5ld0RvbSwgZmlyc3RDaGlsZERvbSwgcmVmcztcblxuXHQvLyBUaGlzIGlzIGEgY29tcHJlc3Npb24gb2Ygb2xkUGFyZW50Vk5vZGUhPW51bGwgJiYgb2xkUGFyZW50Vk5vZGUgIT0gRU1QVFlfT0JKICYmIG9sZFBhcmVudFZOb2RlLl9jaGlsZHJlbiB8fCBFTVBUWV9BUlJcblx0Ly8gYXMgRU1QVFlfT0JKLl9jaGlsZHJlbiBzaG91bGQgYmUgYHVuZGVmaW5lZGAuXG5cdGxldCBvbGRDaGlsZHJlbiA9IChvbGRQYXJlbnRWTm9kZSAmJiBvbGRQYXJlbnRWTm9kZS5fY2hpbGRyZW4pIHx8IEVNUFRZX0FSUjtcblxuXHRsZXQgb2xkQ2hpbGRyZW5MZW5ndGggPSBvbGRDaGlsZHJlbi5sZW5ndGg7XG5cblx0bmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuID0gW107XG5cdGZvciAoaSA9IDA7IGkgPCByZW5kZXJSZXN1bHQubGVuZ3RoOyBpKyspIHtcblx0XHRjaGlsZFZOb2RlID0gcmVuZGVyUmVzdWx0W2ldO1xuXG5cdFx0aWYgKGNoaWxkVk5vZGUgPT0gbnVsbCB8fCB0eXBlb2YgY2hpbGRWTm9kZSA9PSAnYm9vbGVhbicpIHtcblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBudWxsO1xuXHRcdH1cblx0XHQvLyBJZiB0aGlzIG5ld1ZOb2RlIGlzIGJlaW5nIHJldXNlZCAoZS5nLiA8ZGl2PntyZXVzZX17cmV1c2V9PC9kaXY+KSBpbiB0aGUgc2FtZSBkaWZmLFxuXHRcdC8vIG9yIHdlIGFyZSByZW5kZXJpbmcgYSBjb21wb25lbnQgKGUuZy4gc2V0U3RhdGUpIGNvcHkgdGhlIG9sZFZOb2RlcyBzbyBpdCBjYW4gaGF2ZVxuXHRcdC8vIGl0J3Mgb3duIERPTSAmIGV0Yy4gcG9pbnRlcnNcblx0XHRlbHNlIGlmIChcblx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlID09ICdzdHJpbmcnIHx8XG5cdFx0XHR0eXBlb2YgY2hpbGRWTm9kZSA9PSAnbnVtYmVyJyB8fFxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZhbGlkLXR5cGVvZlxuXHRcdFx0dHlwZW9mIGNoaWxkVk5vZGUgPT0gJ2JpZ2ludCdcblx0XHQpIHtcblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBjcmVhdGVWTm9kZShcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0Y2hpbGRWTm9kZSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0Y2hpbGRWTm9kZVxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRWTm9kZSkpIHtcblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBjcmVhdGVWTm9kZShcblx0XHRcdFx0RnJhZ21lbnQsXG5cdFx0XHRcdHsgY2hpbGRyZW46IGNoaWxkVk5vZGUgfSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bnVsbFxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGNoaWxkVk5vZGUuX2RlcHRoID4gMCkge1xuXHRcdFx0Ly8gVk5vZGUgaXMgYWxyZWFkeSBpbiB1c2UsIGNsb25lIGl0LiBUaGlzIGNhbiBoYXBwZW4gaW4gdGhlIGZvbGxvd2luZ1xuXHRcdFx0Ly8gc2NlbmFyaW86XG5cdFx0XHQvLyAgIGNvbnN0IHJldXNlID0gPGRpdiAvPlxuXHRcdFx0Ly8gICA8ZGl2PntyZXVzZX08c3BhbiAvPntyZXVzZX08L2Rpdj5cblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBjcmVhdGVWTm9kZShcblx0XHRcdFx0Y2hpbGRWTm9kZS50eXBlLFxuXHRcdFx0XHRjaGlsZFZOb2RlLnByb3BzLFxuXHRcdFx0XHRjaGlsZFZOb2RlLmtleSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0Y2hpbGRWTm9kZS5fb3JpZ2luYWxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBjaGlsZFZOb2RlO1xuXHRcdH1cblxuXHRcdC8vIFRlcnNlciByZW1vdmVzIHRoZSBgY29udGludWVgIGhlcmUgYW5kIHdyYXBzIHRoZSBsb29wIGJvZHlcblx0XHQvLyBpbiBhIGBpZiAoY2hpbGRWTm9kZSkgeyAuLi4gfSBjb25kaXRpb25cblx0XHRpZiAoY2hpbGRWTm9kZSA9PSBudWxsKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjaGlsZFZOb2RlLl9wYXJlbnQgPSBuZXdQYXJlbnRWTm9kZTtcblx0XHRjaGlsZFZOb2RlLl9kZXB0aCA9IG5ld1BhcmVudFZOb2RlLl9kZXB0aCArIDE7XG5cblx0XHQvLyBDaGVjayBpZiB3ZSBmaW5kIGEgY29ycmVzcG9uZGluZyBlbGVtZW50IGluIG9sZENoaWxkcmVuLlxuXHRcdC8vIElmIGZvdW5kLCBkZWxldGUgdGhlIGFycmF5IGl0ZW0gYnkgc2V0dGluZyB0byBgdW5kZWZpbmVkYC5cblx0XHQvLyBXZSB1c2UgYHVuZGVmaW5lZGAsIGFzIGBudWxsYCBpcyByZXNlcnZlZCBmb3IgZW1wdHkgcGxhY2Vob2xkZXJzXG5cdFx0Ly8gKGhvbGVzKS5cblx0XHRvbGRWTm9kZSA9IG9sZENoaWxkcmVuW2ldO1xuXG5cdFx0aWYgKFxuXHRcdFx0b2xkVk5vZGUgPT09IG51bGwgfHxcblx0XHRcdChvbGRWTm9kZSAmJlxuXHRcdFx0XHRjaGlsZFZOb2RlLmtleSA9PSBvbGRWTm9kZS5rZXkgJiZcblx0XHRcdFx0Y2hpbGRWTm9kZS50eXBlID09PSBvbGRWTm9kZS50eXBlKVxuXHRcdCkge1xuXHRcdFx0b2xkQ2hpbGRyZW5baV0gPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEVpdGhlciBvbGRWTm9kZSA9PT0gdW5kZWZpbmVkIG9yIG9sZENoaWxkcmVuTGVuZ3RoID4gMCxcblx0XHRcdC8vIHNvIGFmdGVyIHRoaXMgbG9vcCBvbGRWTm9kZSA9PSBudWxsIG9yIG9sZFZOb2RlIGlzIGEgdmFsaWQgdmFsdWUuXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgb2xkQ2hpbGRyZW5MZW5ndGg7IGorKykge1xuXHRcdFx0XHRvbGRWTm9kZSA9IG9sZENoaWxkcmVuW2pdO1xuXHRcdFx0XHQvLyBJZiBjaGlsZFZOb2RlIGlzIHVua2V5ZWQsIHdlIG9ubHkgbWF0Y2ggc2ltaWxhcmx5IHVua2V5ZWQgbm9kZXMsIG90aGVyd2lzZSB3ZSBtYXRjaCBieSBrZXkuXG5cdFx0XHRcdC8vIFdlIGFsd2F5cyBtYXRjaCBieSB0eXBlIChpbiBlaXRoZXIgY2FzZSkuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvbGRWTm9kZSAmJlxuXHRcdFx0XHRcdGNoaWxkVk5vZGUua2V5ID09IG9sZFZOb2RlLmtleSAmJlxuXHRcdFx0XHRcdGNoaWxkVk5vZGUudHlwZSA9PT0gb2xkVk5vZGUudHlwZVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRvbGRDaGlsZHJlbltqXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRvbGRWTm9kZSA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b2xkVk5vZGUgPSBvbGRWTm9kZSB8fCBFTVBUWV9PQko7XG5cblx0XHQvLyBNb3JwaCB0aGUgb2xkIGVsZW1lbnQgaW50byB0aGUgbmV3IG9uZSwgYnV0IGRvbid0IGFwcGVuZCBpdCB0byB0aGUgZG9tIHlldFxuXHRcdGRpZmYoXG5cdFx0XHRwYXJlbnREb20sXG5cdFx0XHRjaGlsZFZOb2RlLFxuXHRcdFx0b2xkVk5vZGUsXG5cdFx0XHRnbG9iYWxDb250ZXh0LFxuXHRcdFx0aXNTdmcsXG5cdFx0XHRleGNlc3NEb21DaGlsZHJlbixcblx0XHRcdGNvbW1pdFF1ZXVlLFxuXHRcdFx0b2xkRG9tLFxuXHRcdFx0aXNIeWRyYXRpbmdcblx0XHQpO1xuXG5cdFx0bmV3RG9tID0gY2hpbGRWTm9kZS5fZG9tO1xuXG5cdFx0aWYgKChqID0gY2hpbGRWTm9kZS5yZWYpICYmIG9sZFZOb2RlLnJlZiAhPSBqKSB7XG5cdFx0XHRpZiAoIXJlZnMpIHJlZnMgPSBbXTtcblx0XHRcdGlmIChvbGRWTm9kZS5yZWYpIHJlZnMucHVzaChvbGRWTm9kZS5yZWYsIG51bGwsIGNoaWxkVk5vZGUpO1xuXHRcdFx0cmVmcy5wdXNoKGosIGNoaWxkVk5vZGUuX2NvbXBvbmVudCB8fCBuZXdEb20sIGNoaWxkVk5vZGUpO1xuXHRcdH1cblxuXHRcdGlmIChuZXdEb20gIT0gbnVsbCkge1xuXHRcdFx0aWYgKGZpcnN0Q2hpbGREb20gPT0gbnVsbCkge1xuXHRcdFx0XHRmaXJzdENoaWxkRG9tID0gbmV3RG9tO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlLnR5cGUgPT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdFx0XHRjaGlsZFZOb2RlLl9jaGlsZHJlbiA9PT0gb2xkVk5vZGUuX2NoaWxkcmVuXG5cdFx0XHQpIHtcblx0XHRcdFx0Y2hpbGRWTm9kZS5fbmV4dERvbSA9IG9sZERvbSA9IHJlb3JkZXJDaGlsZHJlbihcblx0XHRcdFx0XHRjaGlsZFZOb2RlLFxuXHRcdFx0XHRcdG9sZERvbSxcblx0XHRcdFx0XHRwYXJlbnREb21cblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9sZERvbSA9IHBsYWNlQ2hpbGQoXG5cdFx0XHRcdFx0cGFyZW50RG9tLFxuXHRcdFx0XHRcdGNoaWxkVk5vZGUsXG5cdFx0XHRcdFx0b2xkVk5vZGUsXG5cdFx0XHRcdFx0b2xkQ2hpbGRyZW4sXG5cdFx0XHRcdFx0bmV3RG9tLFxuXHRcdFx0XHRcdG9sZERvbVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodHlwZW9mIG5ld1BhcmVudFZOb2RlLnR5cGUgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHQvLyBCZWNhdXNlIHRoZSBuZXdQYXJlbnRWTm9kZSBpcyBGcmFnbWVudC1saWtlLCB3ZSBuZWVkIHRvIHNldCBpdCdzXG5cdFx0XHRcdC8vIF9uZXh0RG9tIHByb3BlcnR5IHRvIHRoZSBuZXh0U2libGluZyBvZiBpdHMgbGFzdCBjaGlsZCBET00gbm9kZS5cblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gYG9sZERvbWAgY29udGFpbnMgdGhlIGNvcnJlY3QgdmFsdWUgaGVyZSBiZWNhdXNlIGlmIHRoZSBsYXN0IGNoaWxkXG5cdFx0XHRcdC8vIGlzIGEgRnJhZ21lbnQtbGlrZSwgdGhlbiBvbGREb20gaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gdGhhdCBjaGlsZCdzIF9uZXh0RG9tLlxuXHRcdFx0XHQvLyBJZiB0aGUgbGFzdCBjaGlsZCBpcyBhIERPTSBWTm9kZSwgdGhlbiBvbGREb20gd2lsbCBiZSBzZXQgdG8gdGhhdCBET01cblx0XHRcdFx0Ly8gbm9kZSdzIG5leHRTaWJsaW5nLlxuXHRcdFx0XHRuZXdQYXJlbnRWTm9kZS5fbmV4dERvbSA9IG9sZERvbTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b2xkRG9tICYmXG5cdFx0XHRvbGRWTm9kZS5fZG9tID09IG9sZERvbSAmJlxuXHRcdFx0b2xkRG9tLnBhcmVudE5vZGUgIT0gcGFyZW50RG9tXG5cdFx0KSB7XG5cdFx0XHQvLyBUaGUgYWJvdmUgY29uZGl0aW9uIGlzIHRvIGhhbmRsZSBudWxsIHBsYWNlaG9sZGVycy4gU2VlIHRlc3QgaW4gcGxhY2Vob2xkZXIudGVzdC5qczpcblx0XHRcdC8vIGBlZmZpY2llbnRseSByZXBsYWNlIG51bGwgcGxhY2Vob2xkZXJzIGluIHBhcmVudCByZXJlbmRlcnNgXG5cdFx0XHRvbGREb20gPSBnZXREb21TaWJsaW5nKG9sZFZOb2RlKTtcblx0XHR9XG5cdH1cblxuXHRuZXdQYXJlbnRWTm9kZS5fZG9tID0gZmlyc3RDaGlsZERvbTtcblxuXHQvLyBSZW1vdmUgcmVtYWluaW5nIG9sZENoaWxkcmVuIGlmIHRoZXJlIGFyZSBhbnkuXG5cdGZvciAoaSA9IG9sZENoaWxkcmVuTGVuZ3RoOyBpLS07ICkge1xuXHRcdGlmIChvbGRDaGlsZHJlbltpXSAhPSBudWxsKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHR5cGVvZiBuZXdQYXJlbnRWTm9kZS50eXBlID09ICdmdW5jdGlvbicgJiZcblx0XHRcdFx0b2xkQ2hpbGRyZW5baV0uX2RvbSAhPSBudWxsICYmXG5cdFx0XHRcdG9sZENoaWxkcmVuW2ldLl9kb20gPT0gbmV3UGFyZW50Vk5vZGUuX25leHREb21cblx0XHRcdCkge1xuXHRcdFx0XHQvLyBJZiB0aGUgbmV3UGFyZW50Vk5vZGUuX19uZXh0RG9tIHBvaW50cyB0byBhIGRvbSBub2RlIHRoYXQgaXMgYWJvdXQgdG9cblx0XHRcdFx0Ly8gYmUgdW5tb3VudGVkLCB0aGVuIGdldCB0aGUgbmV4dCBzaWJsaW5nIG9mIHRoYXQgdm5vZGUgYW5kIHNldFxuXHRcdFx0XHQvLyBfbmV4dERvbSB0byBpdFxuXHRcdFx0XHRuZXdQYXJlbnRWTm9kZS5fbmV4dERvbSA9IGdldERvbVNpYmxpbmcob2xkUGFyZW50Vk5vZGUsIGkgKyAxKTtcblx0XHRcdH1cblxuXHRcdFx0dW5tb3VudChvbGRDaGlsZHJlbltpXSwgb2xkQ2hpbGRyZW5baV0pO1xuXHRcdH1cblx0fVxuXG5cdC8vIFNldCByZWZzIG9ubHkgYWZ0ZXIgdW5tb3VudFxuXHRpZiAocmVmcykge1xuXHRcdGZvciAoaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRhcHBseVJlZihyZWZzW2ldLCByZWZzWysraV0sIHJlZnNbKytpXSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHJlb3JkZXJDaGlsZHJlbihjaGlsZFZOb2RlLCBvbGREb20sIHBhcmVudERvbSkge1xuXHQvLyBOb3RlOiBWTm9kZXMgaW4gbmVzdGVkIHN1c3BlbmRlZCB0cmVlcyBtYXkgYmUgbWlzc2luZyBfY2hpbGRyZW4uXG5cdGxldCBjID0gY2hpbGRWTm9kZS5fY2hpbGRyZW47XG5cdGxldCB0bXAgPSAwO1xuXHRmb3IgKDsgYyAmJiB0bXAgPCBjLmxlbmd0aDsgdG1wKyspIHtcblx0XHRsZXQgdm5vZGUgPSBjW3RtcF07XG5cdFx0aWYgKHZub2RlKSB7XG5cdFx0XHQvLyBXZSB0eXBpY2FsbHkgZW50ZXIgdGhpcyBjb2RlIHBhdGggb24gc0NVIGJhaWxvdXQsIHdoZXJlIHdlIGNvcHlcblx0XHRcdC8vIG9sZFZOb2RlLl9jaGlsZHJlbiB0byBuZXdWTm9kZS5fY2hpbGRyZW4uIElmIHRoYXQgaXMgdGhlIGNhc2UsIHdlIG5lZWRcblx0XHRcdC8vIHRvIHVwZGF0ZSB0aGUgb2xkIGNoaWxkcmVuJ3MgX3BhcmVudCBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBuZXdWTm9kZVxuXHRcdFx0Ly8gKGNoaWxkVk5vZGUgaGVyZSkuXG5cdFx0XHR2bm9kZS5fcGFyZW50ID0gY2hpbGRWTm9kZTtcblxuXHRcdFx0aWYgKHR5cGVvZiB2bm9kZS50eXBlID09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0b2xkRG9tID0gcmVvcmRlckNoaWxkcmVuKHZub2RlLCBvbGREb20sIHBhcmVudERvbSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvbGREb20gPSBwbGFjZUNoaWxkKFxuXHRcdFx0XHRcdHBhcmVudERvbSxcblx0XHRcdFx0XHR2bm9kZSxcblx0XHRcdFx0XHR2bm9kZSxcblx0XHRcdFx0XHRjLFxuXHRcdFx0XHRcdHZub2RlLl9kb20sXG5cdFx0XHRcdFx0b2xkRG9tXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG9sZERvbTtcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGFuZCBsb29wIHRocm91Z2ggdGhlIGNoaWxkcmVuIG9mIGEgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW5kZXgnKS5Db21wb25lbnRDaGlsZHJlbn0gY2hpbGRyZW4gVGhlIHVuZmxhdHRlbmVkXG4gKiBjaGlsZHJlbiBvZiBhIHZpcnR1YWwgbm9kZVxuICogQHJldHVybnMge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5WTm9kZVtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9DaGlsZEFycmF5KGNoaWxkcmVuLCBvdXQpIHtcblx0b3V0ID0gb3V0IHx8IFtdO1xuXHRpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCB0eXBlb2YgY2hpbGRyZW4gPT0gJ2Jvb2xlYW4nKSB7XG5cdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcblx0XHRjaGlsZHJlbi5zb21lKGNoaWxkID0+IHtcblx0XHRcdHRvQ2hpbGRBcnJheShjaGlsZCwgb3V0KTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvdXQucHVzaChjaGlsZHJlbik7XG5cdH1cblx0cmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gcGxhY2VDaGlsZChcblx0cGFyZW50RG9tLFxuXHRjaGlsZFZOb2RlLFxuXHRvbGRWTm9kZSxcblx0b2xkQ2hpbGRyZW4sXG5cdG5ld0RvbSxcblx0b2xkRG9tXG4pIHtcblx0bGV0IG5leHREb207XG5cdGlmIChjaGlsZFZOb2RlLl9uZXh0RG9tICE9PSB1bmRlZmluZWQpIHtcblx0XHQvLyBPbmx5IEZyYWdtZW50cyBvciBjb21wb25lbnRzIHRoYXQgcmV0dXJuIEZyYWdtZW50IGxpa2UgVk5vZGVzIHdpbGxcblx0XHQvLyBoYXZlIGEgbm9uLXVuZGVmaW5lZCBfbmV4dERvbS4gQ29udGludWUgdGhlIGRpZmYgZnJvbSB0aGUgc2libGluZ1xuXHRcdC8vIG9mIGxhc3QgRE9NIGNoaWxkIG9mIHRoaXMgY2hpbGQgVk5vZGVcblx0XHRuZXh0RG9tID0gY2hpbGRWTm9kZS5fbmV4dERvbTtcblxuXHRcdC8vIEVhZ2VybHkgY2xlYW51cCBfbmV4dERvbS4gV2UgZG9uJ3QgbmVlZCB0byBwZXJzaXN0IHRoZSB2YWx1ZSBiZWNhdXNlXG5cdFx0Ly8gaXQgaXMgb25seSB1c2VkIGJ5IGBkaWZmQ2hpbGRyZW5gIHRvIGRldGVybWluZSB3aGVyZSB0byByZXN1bWUgdGhlIGRpZmYgYWZ0ZXJcblx0XHQvLyBkaWZmaW5nIENvbXBvbmVudHMgYW5kIEZyYWdtZW50cy4gT25jZSB3ZSBzdG9yZSBpdCB0aGUgbmV4dERPTSBsb2NhbCB2YXIsIHdlXG5cdFx0Ly8gY2FuIGNsZWFuIHVwIHRoZSBwcm9wZXJ0eVxuXHRcdGNoaWxkVk5vZGUuX25leHREb20gPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoXG5cdFx0b2xkVk5vZGUgPT0gbnVsbCB8fFxuXHRcdG5ld0RvbSAhPSBvbGREb20gfHxcblx0XHRuZXdEb20ucGFyZW50Tm9kZSA9PSBudWxsXG5cdCkge1xuXHRcdG91dGVyOiBpZiAob2xkRG9tID09IG51bGwgfHwgb2xkRG9tLnBhcmVudE5vZGUgIT09IHBhcmVudERvbSkge1xuXHRcdFx0cGFyZW50RG9tLmFwcGVuZENoaWxkKG5ld0RvbSk7XG5cdFx0XHRuZXh0RG9tID0gbnVsbDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gYGo8b2xkQ2hpbGRyZW5MZW5ndGg7IGorPTJgIGlzIGFuIGFsdGVybmF0aXZlIHRvIGBqKys8b2xkQ2hpbGRyZW5MZW5ndGgvMmBcblx0XHRcdGZvciAoXG5cdFx0XHRcdGxldCBzaWJEb20gPSBvbGREb20sIGogPSAwO1xuXHRcdFx0XHQoc2liRG9tID0gc2liRG9tLm5leHRTaWJsaW5nKSAmJiBqIDwgb2xkQ2hpbGRyZW4ubGVuZ3RoO1xuXHRcdFx0XHRqICs9IDJcblx0XHRcdCkge1xuXHRcdFx0XHRpZiAoc2liRG9tID09IG5ld0RvbSkge1xuXHRcdFx0XHRcdGJyZWFrIG91dGVyO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRwYXJlbnREb20uaW5zZXJ0QmVmb3JlKG5ld0RvbSwgb2xkRG9tKTtcblx0XHRcdG5leHREb20gPSBvbGREb207XG5cdFx0fVxuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBwcmUtY2FsY3VsYXRlZCB0aGUgbmV4dERPTSBub2RlLCB1c2UgaXQuIEVsc2UgY2FsY3VsYXRlIGl0IG5vd1xuXHQvLyBTdHJpY3RseSBjaGVjayBmb3IgYHVuZGVmaW5lZGAgaGVyZSBjdXogYG51bGxgIGlzIGEgdmFsaWQgdmFsdWUgb2YgYG5leHREb21gLlxuXHQvLyBTZWUgbW9yZSBkZXRhaWwgaW4gY3JlYXRlLWVsZW1lbnQuanM6Y3JlYXRlVk5vZGVcblx0aWYgKG5leHREb20gIT09IHVuZGVmaW5lZCkge1xuXHRcdG9sZERvbSA9IG5leHREb207XG5cdH0gZWxzZSB7XG5cdFx0b2xkRG9tID0gbmV3RG9tLm5leHRTaWJsaW5nO1xuXHR9XG5cblx0cmV0dXJuIG9sZERvbTtcbn1cbiIsICJpbXBvcnQgeyBJU19OT05fRElNRU5TSU9OQUwgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi4vb3B0aW9ucyc7XG5cbi8qKlxuICogRGlmZiB0aGUgb2xkIGFuZCBuZXcgcHJvcGVydGllcyBvZiBhIFZOb2RlIGFuZCBhcHBseSBjaGFuZ2VzIHRvIHRoZSBET00gbm9kZVxuICogQHBhcmFtIHtpbXBvcnQoJy4uL2ludGVybmFsJykuUHJlYWN0RWxlbWVudH0gZG9tIFRoZSBET00gbm9kZSB0byBhcHBseVxuICogY2hhbmdlcyB0b1xuICogQHBhcmFtIHtvYmplY3R9IG5ld1Byb3BzIFRoZSBuZXcgcHJvcHNcbiAqIEBwYXJhbSB7b2JqZWN0fSBvbGRQcm9wcyBUaGUgb2xkIHByb3BzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzU3ZnIFdoZXRoZXIgb3Igbm90IHRoaXMgbm9kZSBpcyBhbiBTVkcgbm9kZVxuICogQHBhcmFtIHtib29sZWFufSBoeWRyYXRlIFdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiBoeWRyYXRpb24gbW9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZlByb3BzKGRvbSwgbmV3UHJvcHMsIG9sZFByb3BzLCBpc1N2ZywgaHlkcmF0ZSkge1xuXHRsZXQgaTtcblxuXHRmb3IgKGkgaW4gb2xkUHJvcHMpIHtcblx0XHRpZiAoaSAhPT0gJ2NoaWxkcmVuJyAmJiBpICE9PSAna2V5JyAmJiAhKGkgaW4gbmV3UHJvcHMpKSB7XG5cdFx0XHRzZXRQcm9wZXJ0eShkb20sIGksIG51bGwsIG9sZFByb3BzW2ldLCBpc1N2Zyk7XG5cdFx0fVxuXHR9XG5cblx0Zm9yIChpIGluIG5ld1Byb3BzKSB7XG5cdFx0aWYgKFxuXHRcdFx0KCFoeWRyYXRlIHx8IHR5cGVvZiBuZXdQcm9wc1tpXSA9PSAnZnVuY3Rpb24nKSAmJlxuXHRcdFx0aSAhPT0gJ2NoaWxkcmVuJyAmJlxuXHRcdFx0aSAhPT0gJ2tleScgJiZcblx0XHRcdGkgIT09ICd2YWx1ZScgJiZcblx0XHRcdGkgIT09ICdjaGVja2VkJyAmJlxuXHRcdFx0b2xkUHJvcHNbaV0gIT09IG5ld1Byb3BzW2ldXG5cdFx0KSB7XG5cdFx0XHRzZXRQcm9wZXJ0eShkb20sIGksIG5ld1Byb3BzW2ldLCBvbGRQcm9wc1tpXSwgaXNTdmcpO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBzZXRTdHlsZShzdHlsZSwga2V5LCB2YWx1ZSkge1xuXHRpZiAoa2V5WzBdID09PSAnLScpIHtcblx0XHRzdHlsZS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTtcblx0fSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7XG5cdFx0c3R5bGVba2V5XSA9ICcnO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnbnVtYmVyJyB8fCBJU19OT05fRElNRU5TSU9OQUwudGVzdChrZXkpKSB7XG5cdFx0c3R5bGVba2V5XSA9IHZhbHVlO1xuXHR9IGVsc2Uge1xuXHRcdHN0eWxlW2tleV0gPSB2YWx1ZSArICdweCc7XG5cdH1cbn1cblxuLyoqXG4gKiBTZXQgYSBwcm9wZXJ0eSB2YWx1ZSBvbiBhIERPTSBub2RlXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBkb20gVGhlIERPTSBub2RlIHRvIG1vZGlmeVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IHRoZSBwcm9wZXJ0eSB0b1xuICogQHBhcmFtIHsqfSBvbGRWYWx1ZSBUaGUgb2xkIHZhbHVlIHRoZSBwcm9wZXJ0eSBoYWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTdmcgV2hldGhlciBvciBub3QgdGhpcyBET00gbm9kZSBpcyBhbiBTVkcgbm9kZSBvciBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFByb3BlcnR5KGRvbSwgbmFtZSwgdmFsdWUsIG9sZFZhbHVlLCBpc1N2Zykge1xuXHRsZXQgdXNlQ2FwdHVyZTtcblxuXHRvOiBpZiAobmFtZSA9PT0gJ3N0eWxlJykge1xuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcblx0XHRcdGRvbS5zdHlsZS5jc3NUZXh0ID0gdmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0eXBlb2Ygb2xkVmFsdWUgPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0ZG9tLnN0eWxlLmNzc1RleHQgPSBvbGRWYWx1ZSA9ICcnO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob2xkVmFsdWUpIHtcblx0XHRcdFx0Zm9yIChuYW1lIGluIG9sZFZhbHVlKSB7XG5cdFx0XHRcdFx0aWYgKCEodmFsdWUgJiYgbmFtZSBpbiB2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdHNldFN0eWxlKGRvbS5zdHlsZSwgbmFtZSwgJycpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodmFsdWUpIHtcblx0XHRcdFx0Zm9yIChuYW1lIGluIHZhbHVlKSB7XG5cdFx0XHRcdFx0aWYgKCFvbGRWYWx1ZSB8fCB2YWx1ZVtuYW1lXSAhPT0gb2xkVmFsdWVbbmFtZV0pIHtcblx0XHRcdFx0XHRcdHNldFN0eWxlKGRvbS5zdHlsZSwgbmFtZSwgdmFsdWVbbmFtZV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHQvLyBCZW5jaG1hcmsgZm9yIGNvbXBhcmlzb246IGh0dHBzOi8vZXNiZW5jaC5jb20vYmVuY2gvNTc0Yzk1NGJkYjk2NWI5YTAwOTY1YWM2XG5cdGVsc2UgaWYgKG5hbWVbMF0gPT09ICdvJyAmJiBuYW1lWzFdID09PSAnbicpIHtcblx0XHR1c2VDYXB0dXJlID0gbmFtZSAhPT0gKG5hbWUgPSBuYW1lLnJlcGxhY2UoL0NhcHR1cmUkLywgJycpKTtcblxuXHRcdC8vIEluZmVyIGNvcnJlY3QgY2FzaW5nIGZvciBET00gYnVpbHQtaW4gZXZlbnRzOlxuXHRcdGlmIChuYW1lLnRvTG93ZXJDYXNlKCkgaW4gZG9tKSBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpLnNsaWNlKDIpO1xuXHRcdGVsc2UgbmFtZSA9IG5hbWUuc2xpY2UoMik7XG5cblx0XHRpZiAoIWRvbS5fbGlzdGVuZXJzKSBkb20uX2xpc3RlbmVycyA9IHt9O1xuXHRcdGRvbS5fbGlzdGVuZXJzW25hbWUgKyB1c2VDYXB0dXJlXSA9IHZhbHVlO1xuXG5cdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRpZiAoIW9sZFZhbHVlKSB7XG5cdFx0XHRcdGNvbnN0IGhhbmRsZXIgPSB1c2VDYXB0dXJlID8gZXZlbnRQcm94eUNhcHR1cmUgOiBldmVudFByb3h5O1xuXHRcdFx0XHRkb20uYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBoYW5kbGVyLCB1c2VDYXB0dXJlKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgaGFuZGxlciA9IHVzZUNhcHR1cmUgPyBldmVudFByb3h5Q2FwdHVyZSA6IGV2ZW50UHJveHk7XG5cdFx0XHRkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBoYW5kbGVyLCB1c2VDYXB0dXJlKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobmFtZSAhPT0gJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJykge1xuXHRcdGlmIChpc1N2Zykge1xuXHRcdFx0Ly8gTm9ybWFsaXplIGluY29ycmVjdCBwcm9wIHVzYWdlIGZvciBTVkc6XG5cdFx0XHQvLyAtIHhsaW5rOmhyZWYgLyB4bGlua0hyZWYgLS0+IGhyZWYgKHhsaW5rOmhyZWYgd2FzIHJlbW92ZWQgZnJvbSBTVkcgYW5kIGlzbid0IG5lZWRlZClcblx0XHRcdC8vIC0gY2xhc3NOYW1lIC0tPiBjbGFzc1xuXHRcdFx0bmFtZSA9IG5hbWUucmVwbGFjZSgveGxpbmsoSHw6aCkvLCAnaCcpLnJlcGxhY2UoL3NOYW1lJC8sICdzJyk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG5hbWUgIT09ICdocmVmJyAmJlxuXHRcdFx0bmFtZSAhPT0gJ2xpc3QnICYmXG5cdFx0XHRuYW1lICE9PSAnZm9ybScgJiZcblx0XHRcdC8vIERlZmF1bHQgdmFsdWUgaW4gYnJvd3NlcnMgaXMgYC0xYCBhbmQgYW4gZW1wdHkgc3RyaW5nIGlzXG5cdFx0XHQvLyBjYXN0IHRvIGAwYCBpbnN0ZWFkXG5cdFx0XHRuYW1lICE9PSAndGFiSW5kZXgnICYmXG5cdFx0XHRuYW1lICE9PSAnZG93bmxvYWQnICYmXG5cdFx0XHRuYW1lIGluIGRvbVxuXHRcdCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZG9tW25hbWVdID0gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7XG5cdFx0XHRcdC8vIGxhYmVsbGVkIGJyZWFrIGlzIDFiIHNtYWxsZXIgaGVyZSB0aGFuIGEgcmV0dXJuIHN0YXRlbWVudCAoc29ycnkpXG5cdFx0XHRcdGJyZWFrIG87XG5cdFx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdH1cblxuXHRcdC8vIEFSSUEtYXR0cmlidXRlcyBoYXZlIGEgZGlmZmVyZW50IG5vdGlvbiBvZiBib29sZWFuIHZhbHVlcy5cblx0XHQvLyBUaGUgdmFsdWUgYGZhbHNlYCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYXR0cmlidXRlIG5vdFxuXHRcdC8vIGV4aXN0aW5nIG9uIHRoZSBET00sIHNvIHdlIGNhbid0IHJlbW92ZSBpdC4gRm9yIG5vbi1ib29sZWFuXG5cdFx0Ly8gQVJJQS1hdHRyaWJ1dGVzIHdlIGNvdWxkIHRyZWF0IGZhbHNlIGFzIGEgcmVtb3ZhbCwgYnV0IHRoZVxuXHRcdC8vIGFtb3VudCBvZiBleGNlcHRpb25zIHdvdWxkIGNvc3QgdXMgdG9vIG1hbnkgYnl0ZXMuIE9uIHRvcCBvZlxuXHRcdC8vIHRoYXQgb3RoZXIgVkRPTSBmcmFtZXdvcmtzIGFsc28gYWx3YXlzIHN0cmluZ2lmeSBgZmFsc2VgLlxuXG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Ly8gbmV2ZXIgc2VyaWFsaXplIGZ1bmN0aW9ucyBhcyBhdHRyaWJ1dGUgdmFsdWVzXG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdHZhbHVlICE9IG51bGwgJiZcblx0XHRcdCh2YWx1ZSAhPT0gZmFsc2UgfHwgKG5hbWVbMF0gPT09ICdhJyAmJiBuYW1lWzFdID09PSAncicpKVxuXHRcdCkge1xuXHRcdFx0ZG9tLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRvbS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogUHJveHkgYW4gZXZlbnQgdG8gaG9va2VkIGV2ZW50IGhhbmRsZXJzXG4gKiBAcGFyYW0ge0V2ZW50fSBlIFRoZSBldmVudCBvYmplY3QgZnJvbSB0aGUgYnJvd3NlclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZXZlbnRQcm94eShlKSB7XG5cdHRoaXMuX2xpc3RlbmVyc1tlLnR5cGUgKyBmYWxzZV0ob3B0aW9ucy5ldmVudCA/IG9wdGlvbnMuZXZlbnQoZSkgOiBlKTtcbn1cblxuZnVuY3Rpb24gZXZlbnRQcm94eUNhcHR1cmUoZSkge1xuXHR0aGlzLl9saXN0ZW5lcnNbZS50eXBlICsgdHJ1ZV0ob3B0aW9ucy5ldmVudCA/IG9wdGlvbnMuZXZlbnQoZSkgOiBlKTtcbn1cbiIsICJpbXBvcnQgeyBFTVBUWV9PQkogfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBnZXREb21TaWJsaW5nIH0gZnJvbSAnLi4vY29tcG9uZW50JztcbmltcG9ydCB7IEZyYWdtZW50IH0gZnJvbSAnLi4vY3JlYXRlLWVsZW1lbnQnO1xuaW1wb3J0IHsgZGlmZkNoaWxkcmVuIH0gZnJvbSAnLi9jaGlsZHJlbic7XG5pbXBvcnQgeyBkaWZmUHJvcHMsIHNldFByb3BlcnR5IH0gZnJvbSAnLi9wcm9wcyc7XG5pbXBvcnQgeyBhc3NpZ24sIHJlbW92ZU5vZGUsIHNsaWNlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgb3B0aW9ucyBmcm9tICcuLi9vcHRpb25zJztcblxuLyoqXG4gKiBEaWZmIHR3byB2aXJ0dWFsIG5vZGVzIGFuZCBhcHBseSBwcm9wZXIgY2hhbmdlcyB0byB0aGUgRE9NXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBwYXJlbnREb20gVGhlIHBhcmVudCBvZiB0aGUgRE9NIGVsZW1lbnRcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLlZOb2RlfSBuZXdWTm9kZSBUaGUgbmV3IHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtpbXBvcnQoJy4uL2ludGVybmFsJykuVk5vZGV9IG9sZFZOb2RlIFRoZSBvbGQgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gZ2xvYmFsQ29udGV4dCBUaGUgY3VycmVudCBjb250ZXh0IG9iamVjdC4gTW9kaWZpZWQgYnkgZ2V0Q2hpbGRDb250ZXh0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzU3ZnIFdoZXRoZXIgb3Igbm90IHRoaXMgZWxlbWVudCBpcyBhbiBTVkcgbm9kZVxuICogQHBhcmFtIHtBcnJheTxpbXBvcnQoJy4uL2ludGVybmFsJykuUHJlYWN0RWxlbWVudD59IGV4Y2Vzc0RvbUNoaWxkcmVuXG4gKiBAcGFyYW0ge0FycmF5PGltcG9ydCgnLi4vaW50ZXJuYWwnKS5Db21wb25lbnQ+fSBjb21taXRRdWV1ZSBMaXN0IG9mIGNvbXBvbmVudHNcbiAqIHdoaWNoIGhhdmUgY2FsbGJhY2tzIHRvIGludm9rZSBpbiBjb21taXRSb290XG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBvbGREb20gVGhlIGN1cnJlbnQgYXR0YWNoZWQgRE9NXG4gKiBlbGVtZW50IGFueSBuZXcgZG9tIGVsZW1lbnRzIHNob3VsZCBiZSBwbGFjZWQgYXJvdW5kLiBMaWtlbHkgYG51bGxgIG9uIGZpcnN0XG4gKiByZW5kZXIgKGV4Y2VwdCB3aGVuIGh5ZHJhdGluZykuIENhbiBiZSBhIHNpYmxpbmcgRE9NIGVsZW1lbnQgd2hlbiBkaWZmaW5nXG4gKiBGcmFnbWVudHMgdGhhdCBoYXZlIHNpYmxpbmdzLiBJbiBtb3N0IGNhc2VzLCBpdCBzdGFydHMgb3V0IGFzIGBvbGRDaGlsZHJlblswXS5fZG9tYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzSHlkcmF0aW5nXSBXaGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gaHlkcmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmKFxuXHRwYXJlbnREb20sXG5cdG5ld1ZOb2RlLFxuXHRvbGRWTm9kZSxcblx0Z2xvYmFsQ29udGV4dCxcblx0aXNTdmcsXG5cdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRjb21taXRRdWV1ZSxcblx0b2xkRG9tLFxuXHRpc0h5ZHJhdGluZ1xuKSB7XG5cdGxldCB0bXAsXG5cdFx0bmV3VHlwZSA9IG5ld1ZOb2RlLnR5cGU7XG5cblx0Ly8gV2hlbiBwYXNzaW5nIHRocm91Z2ggY3JlYXRlRWxlbWVudCBpdCBhc3NpZ25zIHRoZSBvYmplY3Rcblx0Ly8gY29uc3RydWN0b3IgYXMgdW5kZWZpbmVkLiBUaGlzIHRvIHByZXZlbnQgSlNPTi1pbmplY3Rpb24uXG5cdGlmIChuZXdWTm9kZS5jb25zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcblxuXHQvLyBJZiB0aGUgcHJldmlvdXMgZGlmZiBiYWlsZWQgb3V0LCByZXN1bWUgY3JlYXRpbmcvaHlkcmF0aW5nLlxuXHRpZiAob2xkVk5vZGUuX2h5ZHJhdGluZyAhPSBudWxsKSB7XG5cdFx0aXNIeWRyYXRpbmcgPSBvbGRWTm9kZS5faHlkcmF0aW5nO1xuXHRcdG9sZERvbSA9IG5ld1ZOb2RlLl9kb20gPSBvbGRWTm9kZS5fZG9tO1xuXHRcdC8vIGlmIHdlIHJlc3VtZSwgd2Ugd2FudCB0aGUgdHJlZSB0byBiZSBcInVubG9ja2VkXCJcblx0XHRuZXdWTm9kZS5faHlkcmF0aW5nID0gbnVsbDtcblx0XHRleGNlc3NEb21DaGlsZHJlbiA9IFtvbGREb21dO1xuXHR9XG5cblx0aWYgKCh0bXAgPSBvcHRpb25zLl9kaWZmKSkgdG1wKG5ld1ZOb2RlKTtcblxuXHR0cnkge1xuXHRcdG91dGVyOiBpZiAodHlwZW9mIG5ld1R5cGUgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0bGV0IGMsIGlzTmV3LCBvbGRQcm9wcywgb2xkU3RhdGUsIHNuYXBzaG90LCBjbGVhclByb2Nlc3NpbmdFeGNlcHRpb247XG5cdFx0XHRsZXQgbmV3UHJvcHMgPSBuZXdWTm9kZS5wcm9wcztcblxuXHRcdFx0Ly8gTmVjZXNzYXJ5IGZvciBjcmVhdGVDb250ZXh0IGFwaS4gU2V0dGluZyB0aGlzIHByb3BlcnR5IHdpbGwgcGFzc1xuXHRcdFx0Ly8gdGhlIGNvbnRleHQgdmFsdWUgYXMgYHRoaXMuY29udGV4dGAganVzdCBmb3IgdGhpcyBjb21wb25lbnQuXG5cdFx0XHR0bXAgPSBuZXdUeXBlLmNvbnRleHRUeXBlO1xuXHRcdFx0bGV0IHByb3ZpZGVyID0gdG1wICYmIGdsb2JhbENvbnRleHRbdG1wLl9pZF07XG5cdFx0XHRsZXQgY29tcG9uZW50Q29udGV4dCA9IHRtcFxuXHRcdFx0XHQ/IHByb3ZpZGVyXG5cdFx0XHRcdFx0PyBwcm92aWRlci5wcm9wcy52YWx1ZVxuXHRcdFx0XHRcdDogdG1wLl9kZWZhdWx0VmFsdWVcblx0XHRcdFx0OiBnbG9iYWxDb250ZXh0O1xuXG5cdFx0XHQvLyBHZXQgY29tcG9uZW50IGFuZCBzZXQgaXQgdG8gYGNgXG5cdFx0XHRpZiAob2xkVk5vZGUuX2NvbXBvbmVudCkge1xuXHRcdFx0XHRjID0gbmV3Vk5vZGUuX2NvbXBvbmVudCA9IG9sZFZOb2RlLl9jb21wb25lbnQ7XG5cdFx0XHRcdGNsZWFyUHJvY2Vzc2luZ0V4Y2VwdGlvbiA9IGMuX3Byb2Nlc3NpbmdFeGNlcHRpb24gPSBjLl9wZW5kaW5nRXJyb3I7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJbnN0YW50aWF0ZSB0aGUgbmV3IGNvbXBvbmVudFxuXHRcdFx0XHRpZiAoJ3Byb3RvdHlwZScgaW4gbmV3VHlwZSAmJiBuZXdUeXBlLnByb3RvdHlwZS5yZW5kZXIpIHtcblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlIFRoZSBjaGVjayBhYm92ZSB2ZXJpZmllcyB0aGF0IG5ld1R5cGUgaXMgc3VwcG9zZSB0byBiZSBjb25zdHJ1Y3RlZFxuXHRcdFx0XHRcdG5ld1ZOb2RlLl9jb21wb25lbnQgPSBjID0gbmV3IG5ld1R5cGUobmV3UHJvcHMsIGNvbXBvbmVudENvbnRleHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlIFRydXN0IG1lLCBDb21wb25lbnQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIHdlIHdhbnRcblx0XHRcdFx0XHRuZXdWTm9kZS5fY29tcG9uZW50ID0gYyA9IG5ldyBDb21wb25lbnQobmV3UHJvcHMsIGNvbXBvbmVudENvbnRleHQpO1xuXHRcdFx0XHRcdGMuY29uc3RydWN0b3IgPSBuZXdUeXBlO1xuXHRcdFx0XHRcdGMucmVuZGVyID0gZG9SZW5kZXI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb3ZpZGVyKSBwcm92aWRlci5zdWIoYyk7XG5cblx0XHRcdFx0Yy5wcm9wcyA9IG5ld1Byb3BzO1xuXHRcdFx0XHRpZiAoIWMuc3RhdGUpIGMuc3RhdGUgPSB7fTtcblx0XHRcdFx0Yy5jb250ZXh0ID0gY29tcG9uZW50Q29udGV4dDtcblx0XHRcdFx0Yy5fZ2xvYmFsQ29udGV4dCA9IGdsb2JhbENvbnRleHQ7XG5cdFx0XHRcdGlzTmV3ID0gYy5fZGlydHkgPSB0cnVlO1xuXHRcdFx0XHRjLl9yZW5kZXJDYWxsYmFja3MgPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSW52b2tlIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1xuXHRcdFx0aWYgKGMuX25leHRTdGF0ZSA9PSBudWxsKSB7XG5cdFx0XHRcdGMuX25leHRTdGF0ZSA9IGMuc3RhdGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAobmV3VHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT0gbnVsbCkge1xuXHRcdFx0XHRpZiAoYy5fbmV4dFN0YXRlID09IGMuc3RhdGUpIHtcblx0XHRcdFx0XHRjLl9uZXh0U3RhdGUgPSBhc3NpZ24oe30sIGMuX25leHRTdGF0ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhc3NpZ24oXG5cdFx0XHRcdFx0Yy5fbmV4dFN0YXRlLFxuXHRcdFx0XHRcdG5ld1R5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5ld1Byb3BzLCBjLl9uZXh0U3RhdGUpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdG9sZFByb3BzID0gYy5wcm9wcztcblx0XHRcdG9sZFN0YXRlID0gYy5zdGF0ZTtcblxuXHRcdFx0Ly8gSW52b2tlIHByZS1yZW5kZXIgbGlmZWN5Y2xlIG1ldGhvZHNcblx0XHRcdGlmIChpc05ldykge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0bmV3VHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT0gbnVsbCAmJlxuXHRcdFx0XHRcdGMuY29tcG9uZW50V2lsbE1vdW50ICE9IG51bGxcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Yy5jb21wb25lbnRXaWxsTW91bnQoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjLmNvbXBvbmVudERpZE1vdW50ICE9IG51bGwpIHtcblx0XHRcdFx0XHRjLl9yZW5kZXJDYWxsYmFja3MucHVzaChjLmNvbXBvbmVudERpZE1vdW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG5ld1R5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09IG51bGwgJiZcblx0XHRcdFx0XHRuZXdQcm9wcyAhPT0gb2xkUHJvcHMgJiZcblx0XHRcdFx0XHRjLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgIT0gbnVsbFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIGNvbXBvbmVudENvbnRleHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCghYy5fZm9yY2UgJiZcblx0XHRcdFx0XHRcdGMuc2hvdWxkQ29tcG9uZW50VXBkYXRlICE9IG51bGwgJiZcblx0XHRcdFx0XHRcdGMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKFxuXHRcdFx0XHRcdFx0XHRuZXdQcm9wcyxcblx0XHRcdFx0XHRcdFx0Yy5fbmV4dFN0YXRlLFxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRDb250ZXh0XG5cdFx0XHRcdFx0XHQpID09PSBmYWxzZSkgfHxcblx0XHRcdFx0XHRuZXdWTm9kZS5fb3JpZ2luYWwgPT09IG9sZFZOb2RlLl9vcmlnaW5hbFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjLnByb3BzID0gbmV3UHJvcHM7XG5cdFx0XHRcdFx0Yy5zdGF0ZSA9IGMuX25leHRTdGF0ZTtcblx0XHRcdFx0XHQvLyBNb3JlIGluZm8gYWJvdXQgdGhpcyBoZXJlOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9Kb3ZpRGVDcm9vY2svYmVjNWYyY2U5MzU0NGQyZTYwNzBlZjhlMDAzNmU0ZThcblx0XHRcdFx0XHRpZiAobmV3Vk5vZGUuX29yaWdpbmFsICE9PSBvbGRWTm9kZS5fb3JpZ2luYWwpIGMuX2RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0Yy5fdm5vZGUgPSBuZXdWTm9kZTtcblx0XHRcdFx0XHRuZXdWTm9kZS5fZG9tID0gb2xkVk5vZGUuX2RvbTtcblx0XHRcdFx0XHRuZXdWTm9kZS5fY2hpbGRyZW4gPSBvbGRWTm9kZS5fY2hpbGRyZW47XG5cdFx0XHRcdFx0bmV3Vk5vZGUuX2NoaWxkcmVuLmZvckVhY2godm5vZGUgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHZub2RlKSB2bm9kZS5fcGFyZW50ID0gbmV3Vk5vZGU7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKGMuX3JlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGNvbW1pdFF1ZXVlLnB1c2goYyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWsgb3V0ZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYy5jb21wb25lbnRXaWxsVXBkYXRlICE9IG51bGwpIHtcblx0XHRcdFx0XHRjLmNvbXBvbmVudFdpbGxVcGRhdGUobmV3UHJvcHMsIGMuX25leHRTdGF0ZSwgY29tcG9uZW50Q29udGV4dCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYy5jb21wb25lbnREaWRVcGRhdGUgIT0gbnVsbCkge1xuXHRcdFx0XHRcdGMuX3JlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcblx0XHRcdFx0XHRcdGMuY29tcG9uZW50RGlkVXBkYXRlKG9sZFByb3BzLCBvbGRTdGF0ZSwgc25hcHNob3QpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGMuY29udGV4dCA9IGNvbXBvbmVudENvbnRleHQ7XG5cdFx0XHRjLnByb3BzID0gbmV3UHJvcHM7XG5cdFx0XHRjLl92bm9kZSA9IG5ld1ZOb2RlO1xuXHRcdFx0Yy5fcGFyZW50RG9tID0gcGFyZW50RG9tO1xuXG5cdFx0XHRsZXQgcmVuZGVySG9vayA9IG9wdGlvbnMuX3JlbmRlcixcblx0XHRcdFx0Y291bnQgPSAwO1xuXHRcdFx0aWYgKCdwcm90b3R5cGUnIGluIG5ld1R5cGUgJiYgbmV3VHlwZS5wcm90b3R5cGUucmVuZGVyKSB7XG5cdFx0XHRcdGMuc3RhdGUgPSBjLl9uZXh0U3RhdGU7XG5cdFx0XHRcdGMuX2RpcnR5ID0gZmFsc2U7XG5cblx0XHRcdFx0aWYgKHJlbmRlckhvb2spIHJlbmRlckhvb2sobmV3Vk5vZGUpO1xuXG5cdFx0XHRcdHRtcCA9IGMucmVuZGVyKGMucHJvcHMsIGMuc3RhdGUsIGMuY29udGV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0Yy5fZGlydHkgPSBmYWxzZTtcblx0XHRcdFx0XHRpZiAocmVuZGVySG9vaykgcmVuZGVySG9vayhuZXdWTm9kZSk7XG5cblx0XHRcdFx0XHR0bXAgPSBjLnJlbmRlcihjLnByb3BzLCBjLnN0YXRlLCBjLmNvbnRleHQpO1xuXG5cdFx0XHRcdFx0Ly8gSGFuZGxlIHNldFN0YXRlIGNhbGxlZCBpbiByZW5kZXIsIHNlZSAjMjU1M1xuXHRcdFx0XHRcdGMuc3RhdGUgPSBjLl9uZXh0U3RhdGU7XG5cdFx0XHRcdH0gd2hpbGUgKGMuX2RpcnR5ICYmICsrY291bnQgPCAyNSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhhbmRsZSBzZXRTdGF0ZSBjYWxsZWQgaW4gcmVuZGVyLCBzZWUgIzI1NTNcblx0XHRcdGMuc3RhdGUgPSBjLl9uZXh0U3RhdGU7XG5cblx0XHRcdGlmIChjLmdldENoaWxkQ29udGV4dCAhPSBudWxsKSB7XG5cdFx0XHRcdGdsb2JhbENvbnRleHQgPSBhc3NpZ24oYXNzaWduKHt9LCBnbG9iYWxDb250ZXh0KSwgYy5nZXRDaGlsZENvbnRleHQoKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXNOZXcgJiYgYy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAhPSBudWxsKSB7XG5cdFx0XHRcdHNuYXBzaG90ID0gYy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShvbGRQcm9wcywgb2xkU3RhdGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgaXNUb3BMZXZlbEZyYWdtZW50ID1cblx0XHRcdFx0dG1wICE9IG51bGwgJiYgdG1wLnR5cGUgPT09IEZyYWdtZW50ICYmIHRtcC5rZXkgPT0gbnVsbDtcblx0XHRcdGxldCByZW5kZXJSZXN1bHQgPSBpc1RvcExldmVsRnJhZ21lbnQgPyB0bXAucHJvcHMuY2hpbGRyZW4gOiB0bXA7XG5cblx0XHRcdGRpZmZDaGlsZHJlbihcblx0XHRcdFx0cGFyZW50RG9tLFxuXHRcdFx0XHRBcnJheS5pc0FycmF5KHJlbmRlclJlc3VsdCkgPyByZW5kZXJSZXN1bHQgOiBbcmVuZGVyUmVzdWx0XSxcblx0XHRcdFx0bmV3Vk5vZGUsXG5cdFx0XHRcdG9sZFZOb2RlLFxuXHRcdFx0XHRnbG9iYWxDb250ZXh0LFxuXHRcdFx0XHRpc1N2Zyxcblx0XHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW4sXG5cdFx0XHRcdGNvbW1pdFF1ZXVlLFxuXHRcdFx0XHRvbGREb20sXG5cdFx0XHRcdGlzSHlkcmF0aW5nXG5cdFx0XHQpO1xuXG5cdFx0XHRjLmJhc2UgPSBuZXdWTm9kZS5fZG9tO1xuXG5cdFx0XHQvLyBXZSBzdWNjZXNzZnVsbHkgcmVuZGVyZWQgdGhpcyBWTm9kZSwgdW5zZXQgYW55IHN0b3JlZCBoeWRyYXRpb24vYmFpbG91dCBzdGF0ZTpcblx0XHRcdG5ld1ZOb2RlLl9oeWRyYXRpbmcgPSBudWxsO1xuXG5cdFx0XHRpZiAoYy5fcmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuXHRcdFx0XHRjb21taXRRdWV1ZS5wdXNoKGMpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2xlYXJQcm9jZXNzaW5nRXhjZXB0aW9uKSB7XG5cdFx0XHRcdGMuX3BlbmRpbmdFcnJvciA9IGMuX3Byb2Nlc3NpbmdFeGNlcHRpb24gPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRjLl9mb3JjZSA9IGZhbHNlO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRleGNlc3NEb21DaGlsZHJlbiA9PSBudWxsICYmXG5cdFx0XHRuZXdWTm9kZS5fb3JpZ2luYWwgPT09IG9sZFZOb2RlLl9vcmlnaW5hbFxuXHRcdCkge1xuXHRcdFx0bmV3Vk5vZGUuX2NoaWxkcmVuID0gb2xkVk5vZGUuX2NoaWxkcmVuO1xuXHRcdFx0bmV3Vk5vZGUuX2RvbSA9IG9sZFZOb2RlLl9kb207XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5ld1ZOb2RlLl9kb20gPSBkaWZmRWxlbWVudE5vZGVzKFxuXHRcdFx0XHRvbGRWTm9kZS5fZG9tLFxuXHRcdFx0XHRuZXdWTm9kZSxcblx0XHRcdFx0b2xkVk5vZGUsXG5cdFx0XHRcdGdsb2JhbENvbnRleHQsXG5cdFx0XHRcdGlzU3ZnLFxuXHRcdFx0XHRleGNlc3NEb21DaGlsZHJlbixcblx0XHRcdFx0Y29tbWl0UXVldWUsXG5cdFx0XHRcdGlzSHlkcmF0aW5nXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmICgodG1wID0gb3B0aW9ucy5kaWZmZWQpKSB0bXAobmV3Vk5vZGUpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0bmV3Vk5vZGUuX29yaWdpbmFsID0gbnVsbDtcblx0XHQvLyBpZiBoeWRyYXRpbmcgb3IgY3JlYXRpbmcgaW5pdGlhbCB0cmVlLCBiYWlsb3V0IHByZXNlcnZlcyBET006XG5cdFx0aWYgKGlzSHlkcmF0aW5nIHx8IGV4Y2Vzc0RvbUNoaWxkcmVuICE9IG51bGwpIHtcblx0XHRcdG5ld1ZOb2RlLl9kb20gPSBvbGREb207XG5cdFx0XHRuZXdWTm9kZS5faHlkcmF0aW5nID0gISFpc0h5ZHJhdGluZztcblx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuW2V4Y2Vzc0RvbUNoaWxkcmVuLmluZGV4T2Yob2xkRG9tKV0gPSBudWxsO1xuXHRcdFx0Ly8gXiBjb3VsZCBwb3NzaWJseSBiZSBzaW1wbGlmaWVkIHRvOlxuXHRcdFx0Ly8gZXhjZXNzRG9tQ2hpbGRyZW4ubGVuZ3RoID0gMDtcblx0XHR9XG5cdFx0b3B0aW9ucy5fY2F0Y2hFcnJvcihlLCBuZXdWTm9kZSwgb2xkVk5vZGUpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheTxpbXBvcnQoJy4uL2ludGVybmFsJykuQ29tcG9uZW50Pn0gY29tbWl0UXVldWUgTGlzdCBvZiBjb21wb25lbnRzXG4gKiB3aGljaCBoYXZlIGNhbGxiYWNrcyB0byBpbnZva2UgaW4gY29tbWl0Um9vdFxuICogQHBhcmFtIHtpbXBvcnQoJy4uL2ludGVybmFsJykuVk5vZGV9IHJvb3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdFJvb3QoY29tbWl0UXVldWUsIHJvb3QpIHtcblx0aWYgKG9wdGlvbnMuX2NvbW1pdCkgb3B0aW9ucy5fY29tbWl0KHJvb3QsIGNvbW1pdFF1ZXVlKTtcblxuXHRjb21taXRRdWV1ZS5zb21lKGMgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBAdHMtaWdub3JlIFJldXNlIHRoZSBjb21taXRRdWV1ZSB2YXJpYWJsZSBoZXJlIHNvIHRoZSB0eXBlIGNoYW5nZXNcblx0XHRcdGNvbW1pdFF1ZXVlID0gYy5fcmVuZGVyQ2FsbGJhY2tzO1xuXHRcdFx0Yy5fcmVuZGVyQ2FsbGJhY2tzID0gW107XG5cdFx0XHRjb21taXRRdWV1ZS5zb21lKGNiID0+IHtcblx0XHRcdFx0Ly8gQHRzLWlnbm9yZSBTZWUgYWJvdmUgdHMtaWdub3JlIG9uIGNvbW1pdFF1ZXVlXG5cdFx0XHRcdGNiLmNhbGwoYyk7XG5cdFx0XHR9KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvcHRpb25zLl9jYXRjaEVycm9yKGUsIGMuX3Zub2RlKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIERpZmYgdHdvIHZpcnR1YWwgbm9kZXMgcmVwcmVzZW50aW5nIERPTSBlbGVtZW50XG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBkb20gVGhlIERPTSBlbGVtZW50IHJlcHJlc2VudGluZ1xuICogdGhlIHZpcnR1YWwgbm9kZXMgYmVpbmcgZGlmZmVkXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5WTm9kZX0gbmV3Vk5vZGUgVGhlIG5ldyB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLlZOb2RlfSBvbGRWTm9kZSBUaGUgb2xkIHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IGdsb2JhbENvbnRleHQgVGhlIGN1cnJlbnQgY29udGV4dCBvYmplY3RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTdmcgV2hldGhlciBvciBub3QgdGhpcyBET00gbm9kZSBpcyBhbiBTVkcgbm9kZVxuICogQHBhcmFtIHsqfSBleGNlc3NEb21DaGlsZHJlblxuICogQHBhcmFtIHtBcnJheTxpbXBvcnQoJy4uL2ludGVybmFsJykuQ29tcG9uZW50Pn0gY29tbWl0UXVldWUgTGlzdCBvZiBjb21wb25lbnRzXG4gKiB3aGljaCBoYXZlIGNhbGxiYWNrcyB0byBpbnZva2UgaW4gY29tbWl0Um9vdFxuICogQHBhcmFtIHtib29sZWFufSBpc0h5ZHJhdGluZyBXaGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gaHlkcmF0aW9uXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLlByZWFjdEVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGRpZmZFbGVtZW50Tm9kZXMoXG5cdGRvbSxcblx0bmV3Vk5vZGUsXG5cdG9sZFZOb2RlLFxuXHRnbG9iYWxDb250ZXh0LFxuXHRpc1N2Zyxcblx0ZXhjZXNzRG9tQ2hpbGRyZW4sXG5cdGNvbW1pdFF1ZXVlLFxuXHRpc0h5ZHJhdGluZ1xuKSB7XG5cdGxldCBvbGRQcm9wcyA9IG9sZFZOb2RlLnByb3BzO1xuXHRsZXQgbmV3UHJvcHMgPSBuZXdWTm9kZS5wcm9wcztcblx0bGV0IG5vZGVUeXBlID0gbmV3Vk5vZGUudHlwZTtcblx0bGV0IGkgPSAwO1xuXG5cdC8vIFRyYWNrcyBlbnRlcmluZyBhbmQgZXhpdGluZyBTVkcgbmFtZXNwYWNlIHdoZW4gZGVzY2VuZGluZyB0aHJvdWdoIHRoZSB0cmVlLlxuXHRpZiAobm9kZVR5cGUgPT09ICdzdmcnKSBpc1N2ZyA9IHRydWU7XG5cblx0aWYgKGV4Y2Vzc0RvbUNoaWxkcmVuICE9IG51bGwpIHtcblx0XHRmb3IgKDsgaSA8IGV4Y2Vzc0RvbUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBjaGlsZCA9IGV4Y2Vzc0RvbUNoaWxkcmVuW2ldO1xuXG5cdFx0XHQvLyBpZiBuZXdWTm9kZSBtYXRjaGVzIGFuIGVsZW1lbnQgaW4gZXhjZXNzRG9tQ2hpbGRyZW4gb3IgdGhlIGBkb21gXG5cdFx0XHQvLyBhcmd1bWVudCBtYXRjaGVzIGFuIGVsZW1lbnQgaW4gZXhjZXNzRG9tQ2hpbGRyZW4sIHJlbW92ZSBpdCBmcm9tXG5cdFx0XHQvLyBleGNlc3NEb21DaGlsZHJlbiBzbyBpdCBpc24ndCBsYXRlciByZW1vdmVkIGluIGRpZmZDaGlsZHJlblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjaGlsZCAmJlxuXHRcdFx0XHQnc2V0QXR0cmlidXRlJyBpbiBjaGlsZCA9PT0gISFub2RlVHlwZSAmJlxuXHRcdFx0XHQobm9kZVR5cGUgPyBjaGlsZC5sb2NhbE5hbWUgPT09IG5vZGVUeXBlIDogY2hpbGQubm9kZVR5cGUgPT09IDMpXG5cdFx0XHQpIHtcblx0XHRcdFx0ZG9tID0gY2hpbGQ7XG5cdFx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuW2ldID0gbnVsbDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGRvbSA9PSBudWxsKSB7XG5cdFx0aWYgKG5vZGVUeXBlID09PSBudWxsKSB7XG5cdFx0XHQvLyBAdHMtaWdub3JlIGNyZWF0ZVRleHROb2RlIHJldHVybnMgVGV4dCwgd2UgZXhwZWN0IFByZWFjdEVsZW1lbnRcblx0XHRcdHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuZXdQcm9wcyk7XG5cdFx0fVxuXG5cdFx0aWYgKGlzU3ZnKSB7XG5cdFx0XHRkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXG5cdFx0XHRcdCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsXG5cdFx0XHRcdC8vIEB0cy1pZ25vcmUgV2Uga25vdyBgbmV3Vk5vZGUudHlwZWAgaXMgYSBzdHJpbmdcblx0XHRcdFx0bm9kZVR5cGVcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdC8vIEB0cy1pZ25vcmUgV2Uga25vdyBgbmV3Vk5vZGUudHlwZWAgaXMgYSBzdHJpbmdcblx0XHRcdFx0bm9kZVR5cGUsXG5cdFx0XHRcdG5ld1Byb3BzLmlzICYmIG5ld1Byb3BzXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdC8vIHdlIGNyZWF0ZWQgYSBuZXcgcGFyZW50LCBzbyBub25lIG9mIHRoZSBwcmV2aW91c2x5IGF0dGFjaGVkIGNoaWxkcmVuIGNhbiBiZSByZXVzZWQ6XG5cdFx0ZXhjZXNzRG9tQ2hpbGRyZW4gPSBudWxsO1xuXHRcdC8vIHdlIGFyZSBjcmVhdGluZyBhIG5ldyBub2RlLCBzbyB3ZSBjYW4gYXNzdW1lIHRoaXMgaXMgYSBuZXcgc3VidHJlZSAoaW4gY2FzZSB3ZSBhcmUgaHlkcmF0aW5nKSwgdGhpcyBkZW9wdHMgdGhlIGh5ZHJhdGVcblx0XHRpc0h5ZHJhdGluZyA9IGZhbHNlO1xuXHR9XG5cblx0aWYgKG5vZGVUeXBlID09PSBudWxsKSB7XG5cdFx0Ly8gRHVyaW5nIGh5ZHJhdGlvbiwgd2Ugc3RpbGwgaGF2ZSB0byBzcGxpdCBtZXJnZWQgdGV4dCBmcm9tIFNTUidkIEhUTUwuXG5cdFx0aWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyAmJiAoIWlzSHlkcmF0aW5nIHx8IGRvbS5kYXRhICE9PSBuZXdQcm9wcykpIHtcblx0XHRcdGRvbS5kYXRhID0gbmV3UHJvcHM7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIElmIGV4Y2Vzc0RvbUNoaWxkcmVuIHdhcyBub3QgbnVsbCwgcmVwb3B1bGF0ZSBpdCB3aXRoIHRoZSBjdXJyZW50IGVsZW1lbnQncyBjaGlsZHJlbjpcblx0XHRleGNlc3NEb21DaGlsZHJlbiA9IGV4Y2Vzc0RvbUNoaWxkcmVuICYmIHNsaWNlLmNhbGwoZG9tLmNoaWxkTm9kZXMpO1xuXG5cdFx0b2xkUHJvcHMgPSBvbGRWTm9kZS5wcm9wcyB8fCBFTVBUWV9PQko7XG5cblx0XHRsZXQgb2xkSHRtbCA9IG9sZFByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MO1xuXHRcdGxldCBuZXdIdG1sID0gbmV3UHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw7XG5cblx0XHQvLyBEdXJpbmcgaHlkcmF0aW9uLCBwcm9wcyBhcmUgbm90IGRpZmZlZCBhdCBhbGwgKGluY2x1ZGluZyBkYW5nZXJvdXNseVNldElubmVySFRNTClcblx0XHQvLyBAVE9ETyB3ZSBzaG91bGQgd2FybiBpbiBkZWJ1ZyBtb2RlIHdoZW4gcHJvcHMgZG9uJ3QgbWF0Y2ggaGVyZS5cblx0XHRpZiAoIWlzSHlkcmF0aW5nKSB7XG5cdFx0XHQvLyBCdXQsIGlmIHdlIGFyZSBpbiBhIHNpdHVhdGlvbiB3aGVyZSB3ZSBhcmUgdXNpbmcgZXhpc3RpbmcgRE9NIChlLmcuIHJlcGxhY2VOb2RlKVxuXHRcdFx0Ly8gd2Ugc2hvdWxkIHJlYWQgdGhlIGV4aXN0aW5nIERPTSBhdHRyaWJ1dGVzIHRvIGRpZmYgdGhlbVxuXHRcdFx0aWYgKGV4Y2Vzc0RvbUNoaWxkcmVuICE9IG51bGwpIHtcblx0XHRcdFx0b2xkUHJvcHMgPSB7fTtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGRvbS5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0b2xkUHJvcHNbZG9tLmF0dHJpYnV0ZXNbaV0ubmFtZV0gPSBkb20uYXR0cmlidXRlc1tpXS52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV3SHRtbCB8fCBvbGRIdG1sKSB7XG5cdFx0XHRcdC8vIEF2b2lkIHJlLWFwcGx5aW5nIHRoZSBzYW1lICdfX2h0bWwnIGlmIGl0IGRpZCBub3QgY2hhbmdlZCBiZXR3ZWVuIHJlLXJlbmRlclxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IW5ld0h0bWwgfHxcblx0XHRcdFx0XHQoKCFvbGRIdG1sIHx8IG5ld0h0bWwuX19odG1sICE9IG9sZEh0bWwuX19odG1sKSAmJlxuXHRcdFx0XHRcdFx0bmV3SHRtbC5fX2h0bWwgIT09IGRvbS5pbm5lckhUTUwpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGRvbS5pbm5lckhUTUwgPSAobmV3SHRtbCAmJiBuZXdIdG1sLl9faHRtbCkgfHwgJyc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRkaWZmUHJvcHMoZG9tLCBuZXdQcm9wcywgb2xkUHJvcHMsIGlzU3ZnLCBpc0h5ZHJhdGluZyk7XG5cblx0XHQvLyBJZiB0aGUgbmV3IHZub2RlIGRpZG4ndCBoYXZlIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLCBkaWZmIGl0cyBjaGlsZHJlblxuXHRcdGlmIChuZXdIdG1sKSB7XG5cdFx0XHRuZXdWTm9kZS5fY2hpbGRyZW4gPSBbXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aSA9IG5ld1ZOb2RlLnByb3BzLmNoaWxkcmVuO1xuXHRcdFx0ZGlmZkNoaWxkcmVuKFxuXHRcdFx0XHRkb20sXG5cdFx0XHRcdEFycmF5LmlzQXJyYXkoaSkgPyBpIDogW2ldLFxuXHRcdFx0XHRuZXdWTm9kZSxcblx0XHRcdFx0b2xkVk5vZGUsXG5cdFx0XHRcdGdsb2JhbENvbnRleHQsXG5cdFx0XHRcdGlzU3ZnICYmIG5vZGVUeXBlICE9PSAnZm9yZWlnbk9iamVjdCcsXG5cdFx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRcdFx0XHRjb21taXRRdWV1ZSxcblx0XHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW5cblx0XHRcdFx0XHQ/IGV4Y2Vzc0RvbUNoaWxkcmVuWzBdXG5cdFx0XHRcdFx0OiBvbGRWTm9kZS5fY2hpbGRyZW4gJiYgZ2V0RG9tU2libGluZyhvbGRWTm9kZSwgMCksXG5cdFx0XHRcdGlzSHlkcmF0aW5nXG5cdFx0XHQpO1xuXG5cdFx0XHQvLyBSZW1vdmUgY2hpbGRyZW4gdGhhdCBhcmUgbm90IHBhcnQgb2YgYW55IHZub2RlLlxuXHRcdFx0aWYgKGV4Y2Vzc0RvbUNoaWxkcmVuICE9IG51bGwpIHtcblx0XHRcdFx0Zm9yIChpID0gZXhjZXNzRG9tQ2hpbGRyZW4ubGVuZ3RoOyBpLS07ICkge1xuXHRcdFx0XHRcdGlmIChleGNlc3NEb21DaGlsZHJlbltpXSAhPSBudWxsKSByZW1vdmVOb2RlKGV4Y2Vzc0RvbUNoaWxkcmVuW2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIChhcyBhYm92ZSwgZG9uJ3QgZGlmZiBwcm9wcyBkdXJpbmcgaHlkcmF0aW9uKVxuXHRcdGlmICghaXNIeWRyYXRpbmcpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0J3ZhbHVlJyBpbiBuZXdQcm9wcyAmJlxuXHRcdFx0XHQoaSA9IG5ld1Byb3BzLnZhbHVlKSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdC8vICMyNzU2IEZvciB0aGUgPHByb2dyZXNzPi1lbGVtZW50IHRoZSBpbml0aWFsIHZhbHVlIGlzIDAsXG5cdFx0XHRcdC8vIGRlc3BpdGUgdGhlIGF0dHJpYnV0ZSBub3QgYmVpbmcgcHJlc2VudC4gV2hlbiB0aGUgYXR0cmlidXRlXG5cdFx0XHRcdC8vIGlzIG1pc3NpbmcgdGhlIHByb2dyZXNzIGJhciBpcyB0cmVhdGVkIGFzIGluZGV0ZXJtaW5hdGUuXG5cdFx0XHRcdC8vIFRvIGZpeCB0aGF0IHdlJ2xsIGFsd2F5cyB1cGRhdGUgaXQgd2hlbiBpdCBpcyAwIGZvciBwcm9ncmVzcyBlbGVtZW50c1xuXHRcdFx0XHQoaSAhPT0gZG9tLnZhbHVlIHx8XG5cdFx0XHRcdFx0KG5vZGVUeXBlID09PSAncHJvZ3Jlc3MnICYmICFpKSB8fFxuXHRcdFx0XHRcdC8vIFRoaXMgaXMgb25seSBmb3IgSUUgMTEgdG8gZml4IDxzZWxlY3Q+IHZhbHVlIG5vdCBiZWluZyB1cGRhdGVkLlxuXHRcdFx0XHRcdC8vIFRvIGF2b2lkIGEgc3RhbGUgc2VsZWN0IHZhbHVlIHdlIG5lZWQgdG8gc2V0IHRoZSBvcHRpb24udmFsdWVcblx0XHRcdFx0XHQvLyBhZ2Fpbiwgd2hpY2ggdHJpZ2dlcnMgSUUxMSB0byByZS1ldmFsdWF0ZSB0aGUgc2VsZWN0IHZhbHVlXG5cdFx0XHRcdFx0KG5vZGVUeXBlID09PSAnb3B0aW9uJyAmJiBpICE9PSBvbGRQcm9wcy52YWx1ZSkpXG5cdFx0XHQpIHtcblx0XHRcdFx0c2V0UHJvcGVydHkoZG9tLCAndmFsdWUnLCBpLCBvbGRQcm9wcy52YWx1ZSwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFxuXHRcdFx0XHQnY2hlY2tlZCcgaW4gbmV3UHJvcHMgJiZcblx0XHRcdFx0KGkgPSBuZXdQcm9wcy5jaGVja2VkKSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdGkgIT09IGRvbS5jaGVja2VkXG5cdFx0XHQpIHtcblx0XHRcdFx0c2V0UHJvcGVydHkoZG9tLCAnY2hlY2tlZCcsIGksIG9sZFByb3BzLmNoZWNrZWQsIGZhbHNlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZG9tO1xufVxuXG4vKipcbiAqIEludm9rZSBvciB1cGRhdGUgYSByZWYsIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IGlzIGEgZnVuY3Rpb24gb3Igb2JqZWN0IHJlZi5cbiAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSByZWZcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtpbXBvcnQoJy4uL2ludGVybmFsJykuVk5vZGV9IHZub2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVJlZihyZWYsIHZhbHVlLCB2bm9kZSkge1xuXHR0cnkge1xuXHRcdGlmICh0eXBlb2YgcmVmID09ICdmdW5jdGlvbicpIHJlZih2YWx1ZSk7XG5cdFx0ZWxzZSByZWYuY3VycmVudCA9IHZhbHVlO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0b3B0aW9ucy5fY2F0Y2hFcnJvcihlLCB2bm9kZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBVbm1vdW50IGEgdmlydHVhbCBub2RlIGZyb20gdGhlIHRyZWUgYW5kIGFwcGx5IERPTSBjaGFuZ2VzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5WTm9kZX0gdm5vZGUgVGhlIHZpcnR1YWwgbm9kZSB0byB1bm1vdW50XG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5WTm9kZX0gcGFyZW50Vk5vZGUgVGhlIHBhcmVudCBvZiB0aGUgVk5vZGUgdGhhdFxuICogaW5pdGlhdGVkIHRoZSB1bm1vdW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtza2lwUmVtb3ZlXSBGbGFnIHRoYXQgaW5kaWNhdGVzIHRoYXQgYSBwYXJlbnQgbm9kZSBvZiB0aGVcbiAqIGN1cnJlbnQgZWxlbWVudCBpcyBhbHJlYWR5IGRldGFjaGVkIGZyb20gdGhlIERPTS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubW91bnQodm5vZGUsIHBhcmVudFZOb2RlLCBza2lwUmVtb3ZlKSB7XG5cdGxldCByO1xuXHRpZiAob3B0aW9ucy51bm1vdW50KSBvcHRpb25zLnVubW91bnQodm5vZGUpO1xuXG5cdGlmICgociA9IHZub2RlLnJlZikpIHtcblx0XHRpZiAoIXIuY3VycmVudCB8fCByLmN1cnJlbnQgPT09IHZub2RlLl9kb20pIGFwcGx5UmVmKHIsIG51bGwsIHBhcmVudFZOb2RlKTtcblx0fVxuXG5cdGlmICgociA9IHZub2RlLl9jb21wb25lbnQpICE9IG51bGwpIHtcblx0XHRpZiAoci5jb21wb25lbnRXaWxsVW5tb3VudCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ci5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRvcHRpb25zLl9jYXRjaEVycm9yKGUsIHBhcmVudFZOb2RlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyLmJhc2UgPSByLl9wYXJlbnREb20gPSBudWxsO1xuXHR9XG5cblx0aWYgKChyID0gdm5vZGUuX2NoaWxkcmVuKSkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgci5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHJbaV0pIHtcblx0XHRcdFx0dW5tb3VudChyW2ldLCBwYXJlbnRWTm9kZSwgdHlwZW9mIHZub2RlLnR5cGUgIT0gJ2Z1bmN0aW9uJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCFza2lwUmVtb3ZlICYmIHZub2RlLl9kb20gIT0gbnVsbCkgcmVtb3ZlTm9kZSh2bm9kZS5fZG9tKTtcblxuXHQvLyBNdXN0IGJlIHNldCB0byBgdW5kZWZpbmVkYCB0byBwcm9wZXJseSBjbGVhbiB1cCBgX25leHREb21gXG5cdC8vIGZvciB3aGljaCBgbnVsbGAgaXMgYSB2YWxpZCB2YWx1ZS4gU2VlIGNvbW1lbnQgaW4gYGNyZWF0ZS1lbGVtZW50LmpzYFxuXHR2bm9kZS5fZG9tID0gdm5vZGUuX25leHREb20gPSB1bmRlZmluZWQ7XG59XG5cbi8qKiBUaGUgYC5yZW5kZXIoKWAgbWV0aG9kIGZvciBhIFBGQyBiYWNraW5nIGluc3RhbmNlLiAqL1xuZnVuY3Rpb24gZG9SZW5kZXIocHJvcHMsIHN0YXRlLCBjb250ZXh0KSB7XG5cdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKHByb3BzLCBjb250ZXh0KTtcbn1cbiIsICJpbXBvcnQgeyBFTVBUWV9PQkogfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBjb21taXRSb290LCBkaWZmIH0gZnJvbSAnLi9kaWZmL2luZGV4JztcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIEZyYWdtZW50IH0gZnJvbSAnLi9jcmVhdGUtZWxlbWVudCc7XG5pbXBvcnQgb3B0aW9ucyBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL3V0aWwnO1xuXG4vKipcbiAqIFJlbmRlciBhIFByZWFjdCB2aXJ0dWFsIG5vZGUgaW50byBhIERPTSBlbGVtZW50XG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbXBvbmVudENoaWxkfSB2bm9kZSBUaGUgdmlydHVhbCBub2RlIHRvIHJlbmRlclxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBwYXJlbnREb20gVGhlIERPTSBlbGVtZW50IHRvXG4gKiByZW5kZXIgaW50b1xuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50IHwgb2JqZWN0fSBbcmVwbGFjZU5vZGVdIE9wdGlvbmFsOiBBdHRlbXB0IHRvIHJlLXVzZSBhblxuICogZXhpc3RpbmcgRE9NIHRyZWUgcm9vdGVkIGF0IGByZXBsYWNlTm9kZWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcih2bm9kZSwgcGFyZW50RG9tLCByZXBsYWNlTm9kZSkge1xuXHRpZiAob3B0aW9ucy5fcm9vdCkgb3B0aW9ucy5fcm9vdCh2bm9kZSwgcGFyZW50RG9tKTtcblxuXHQvLyBXZSBhYnVzZSB0aGUgYHJlcGxhY2VOb2RlYCBwYXJhbWV0ZXIgaW4gYGh5ZHJhdGUoKWAgdG8gc2lnbmFsIGlmIHdlIGFyZSBpblxuXHQvLyBoeWRyYXRpb24gbW9kZSBvciBub3QgYnkgcGFzc2luZyB0aGUgYGh5ZHJhdGVgIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSBET01cblx0Ly8gZWxlbWVudC4uXG5cdGxldCBpc0h5ZHJhdGluZyA9IHR5cGVvZiByZXBsYWNlTm9kZSA9PT0gJ2Z1bmN0aW9uJztcblxuXHQvLyBUbyBiZSBhYmxlIHRvIHN1cHBvcnQgY2FsbGluZyBgcmVuZGVyKClgIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lXG5cdC8vIERPTSBub2RlLCB3ZSBuZWVkIHRvIG9idGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgdHJlZS4gV2UgZG9cblx0Ly8gdGhpcyBieSBhc3NpZ25pbmcgYSBuZXcgYF9jaGlsZHJlbmAgcHJvcGVydHkgdG8gRE9NIG5vZGVzIHdoaWNoIHBvaW50c1xuXHQvLyB0byB0aGUgbGFzdCByZW5kZXJlZCB0cmVlLiBCeSBkZWZhdWx0IHRoaXMgcHJvcGVydHkgaXMgbm90IHByZXNlbnQsIHdoaWNoXG5cdC8vIG1lYW5zIHRoYXQgd2UgYXJlIG1vdW50aW5nIGEgbmV3IHRyZWUgZm9yIHRoZSBmaXJzdCB0aW1lLlxuXHRsZXQgb2xkVk5vZGUgPSBpc0h5ZHJhdGluZ1xuXHRcdD8gbnVsbFxuXHRcdDogKHJlcGxhY2VOb2RlICYmIHJlcGxhY2VOb2RlLl9jaGlsZHJlbikgfHwgcGFyZW50RG9tLl9jaGlsZHJlbjtcblxuXHR2bm9kZSA9IChcblx0XHQoIWlzSHlkcmF0aW5nICYmIHJlcGxhY2VOb2RlKSB8fFxuXHRcdHBhcmVudERvbVxuXHQpLl9jaGlsZHJlbiA9IGNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIFt2bm9kZV0pO1xuXG5cdC8vIExpc3Qgb2YgZWZmZWN0cyB0aGF0IG5lZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGRpZmZpbmcuXG5cdGxldCBjb21taXRRdWV1ZSA9IFtdO1xuXHRkaWZmKFxuXHRcdHBhcmVudERvbSxcblx0XHQvLyBEZXRlcm1pbmUgdGhlIG5ldyB2bm9kZSB0cmVlIGFuZCBzdG9yZSBpdCBvbiB0aGUgRE9NIGVsZW1lbnQgb25cblx0XHQvLyBvdXIgY3VzdG9tIGBfY2hpbGRyZW5gIHByb3BlcnR5LlxuXHRcdHZub2RlLFxuXHRcdG9sZFZOb2RlIHx8IEVNUFRZX09CSixcblx0XHRFTVBUWV9PQkosXG5cdFx0cGFyZW50RG9tLm93bmVyU1ZHRWxlbWVudCAhPT0gdW5kZWZpbmVkLFxuXHRcdCFpc0h5ZHJhdGluZyAmJiByZXBsYWNlTm9kZVxuXHRcdFx0PyBbcmVwbGFjZU5vZGVdXG5cdFx0XHQ6IG9sZFZOb2RlXG5cdFx0XHQ/IG51bGxcblx0XHRcdDogcGFyZW50RG9tLmZpcnN0Q2hpbGRcblx0XHRcdD8gc2xpY2UuY2FsbChwYXJlbnREb20uY2hpbGROb2Rlcylcblx0XHRcdDogbnVsbCxcblx0XHRjb21taXRRdWV1ZSxcblx0XHQhaXNIeWRyYXRpbmcgJiYgcmVwbGFjZU5vZGVcblx0XHRcdD8gcmVwbGFjZU5vZGVcblx0XHRcdDogb2xkVk5vZGVcblx0XHRcdD8gb2xkVk5vZGUuX2RvbVxuXHRcdFx0OiBwYXJlbnREb20uZmlyc3RDaGlsZCxcblx0XHRpc0h5ZHJhdGluZ1xuXHQpO1xuXG5cdC8vIEZsdXNoIGFsbCBxdWV1ZWQgZWZmZWN0c1xuXHRjb21taXRSb290KGNvbW1pdFF1ZXVlLCB2bm9kZSk7XG59XG5cbi8qKlxuICogVXBkYXRlIGFuIGV4aXN0aW5nIERPTSBlbGVtZW50IHdpdGggZGF0YSBmcm9tIGEgUHJlYWN0IHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnRDaGlsZH0gdm5vZGUgVGhlIHZpcnR1YWwgbm9kZSB0byByZW5kZXJcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuUHJlYWN0RWxlbWVudH0gcGFyZW50RG9tIFRoZSBET00gZWxlbWVudCB0b1xuICogdXBkYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlKHZub2RlLCBwYXJlbnREb20pIHtcblx0cmVuZGVyKHZub2RlLCBwYXJlbnREb20sIGh5ZHJhdGUpO1xufVxuIiwgImltcG9ydCB7IGFzc2lnbiwgc2xpY2UgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgY3JlYXRlVk5vZGUgfSBmcm9tICcuL2NyZWF0ZS1lbGVtZW50JztcblxuLyoqXG4gKiBDbG9uZXMgdGhlIGdpdmVuIFZOb2RlLCBvcHRpb25hbGx5IGFkZGluZyBhdHRyaWJ1dGVzL3Byb3BzIGFuZCByZXBsYWNpbmcgaXRzIGNoaWxkcmVuLlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5WTm9kZX0gdm5vZGUgVGhlIHZpcnR1YWwgRE9NIGVsZW1lbnQgdG8gY2xvbmVcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wcyBBdHRyaWJ1dGVzL3Byb3BzIHRvIGFkZCB3aGVuIGNsb25pbmdcbiAqIEBwYXJhbSB7QXJyYXk8aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50Q2hpbGRyZW4+fSByZXN0IEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB3aWxsIGJlIHVzZWQgYXMgcmVwbGFjZW1lbnQgY2hpbGRyZW4uXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZUVsZW1lbnQodm5vZGUsIHByb3BzLCBjaGlsZHJlbikge1xuXHRsZXQgbm9ybWFsaXplZFByb3BzID0gYXNzaWduKHt9LCB2bm9kZS5wcm9wcyksXG5cdFx0a2V5LFxuXHRcdHJlZixcblx0XHRpO1xuXHRmb3IgKGkgaW4gcHJvcHMpIHtcblx0XHRpZiAoaSA9PSAna2V5Jykga2V5ID0gcHJvcHNbaV07XG5cdFx0ZWxzZSBpZiAoaSA9PSAncmVmJykgcmVmID0gcHJvcHNbaV07XG5cdFx0ZWxzZSBub3JtYWxpemVkUHJvcHNbaV0gPSBwcm9wc1tpXTtcblx0fVxuXG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuXHRcdG5vcm1hbGl6ZWRQcm9wcy5jaGlsZHJlbiA9XG5cdFx0XHRhcmd1bWVudHMubGVuZ3RoID4gMyA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSA6IGNoaWxkcmVuO1xuXHR9XG5cblx0cmV0dXJuIGNyZWF0ZVZOb2RlKFxuXHRcdHZub2RlLnR5cGUsXG5cdFx0bm9ybWFsaXplZFByb3BzLFxuXHRcdGtleSB8fCB2bm9kZS5rZXksXG5cdFx0cmVmIHx8IHZub2RlLnJlZixcblx0XHRudWxsXG5cdCk7XG59XG4iLCAiLyoqXG4gKiBGaW5kIHRoZSBjbG9zZXN0IGVycm9yIGJvdW5kYXJ5IHRvIGEgdGhyb3duIGVycm9yIGFuZCBjYWxsIGl0XG4gKiBAcGFyYW0ge29iamVjdH0gZXJyb3IgVGhlIHRocm93biB2YWx1ZVxuICogQHBhcmFtIHtpbXBvcnQoJy4uL2ludGVybmFsJykuVk5vZGV9IHZub2RlIFRoZSB2bm9kZSB0aGF0IHRocmV3XG4gKiB0aGUgZXJyb3IgdGhhdCB3YXMgY2F1Z2h0IChleGNlcHQgZm9yIHVubW91bnRpbmcgd2hlbiB0aGlzIHBhcmFtZXRlclxuICogaXMgdGhlIGhpZ2hlc3QgcGFyZW50IHRoYXQgd2FzIGJlaW5nIHVubW91bnRlZClcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLlZOb2RlfSBbb2xkVk5vZGVdXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5FcnJvckluZm99IFtlcnJvckluZm9dXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2F0Y2hFcnJvcihlcnJvciwgdm5vZGUsIG9sZFZOb2RlLCBlcnJvckluZm8pIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4uL2ludGVybmFsJykuQ29tcG9uZW50fSAqL1xuXHRsZXQgY29tcG9uZW50LCBjdG9yLCBoYW5kbGVkO1xuXG5cdGZvciAoOyAodm5vZGUgPSB2bm9kZS5fcGFyZW50KTsgKSB7XG5cdFx0aWYgKChjb21wb25lbnQgPSB2bm9kZS5fY29tcG9uZW50KSAmJiAhY29tcG9uZW50Ll9wcm9jZXNzaW5nRXhjZXB0aW9uKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjdG9yID0gY29tcG9uZW50LmNvbnN0cnVjdG9yO1xuXG5cdFx0XHRcdGlmIChjdG9yICYmIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9IG51bGwpIHtcblx0XHRcdFx0XHRjb21wb25lbnQuc2V0U3RhdGUoY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IpKTtcblx0XHRcdFx0XHRoYW5kbGVkID0gY29tcG9uZW50Ll9kaXJ0eTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjb21wb25lbnQuY29tcG9uZW50RGlkQ2F0Y2ggIT0gbnVsbCkge1xuXHRcdFx0XHRcdGNvbXBvbmVudC5jb21wb25lbnREaWRDYXRjaChlcnJvciwgZXJyb3JJbmZvIHx8IHt9KTtcblx0XHRcdFx0XHRoYW5kbGVkID0gY29tcG9uZW50Ll9kaXJ0eTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRoaXMgaXMgYW4gZXJyb3IgYm91bmRhcnkuIE1hcmsgaXQgYXMgaGF2aW5nIGJhaWxlZCBvdXQsIGFuZCB3aGV0aGVyIGl0IHdhcyBtaWQtaHlkcmF0aW9uLlxuXHRcdFx0XHRpZiAoaGFuZGxlZCkge1xuXHRcdFx0XHRcdHJldHVybiAoY29tcG9uZW50Ll9wZW5kaW5nRXJyb3IgPSBjb21wb25lbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGVycm9yID0gZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHR0aHJvdyBlcnJvcjtcbn1cbiIsICJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAncHJlYWN0JztcblxuLyoqIEB0eXBlIHtudW1iZXJ9ICovXG5sZXQgY3VycmVudEluZGV4O1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbXBvbmVudH0gKi9cbmxldCBjdXJyZW50Q29tcG9uZW50O1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbXBvbmVudH0gKi9cbmxldCBwcmV2aW91c0NvbXBvbmVudDtcblxuLyoqIEB0eXBlIHtudW1iZXJ9ICovXG5sZXQgY3VycmVudEhvb2sgPSAwO1xuXG4vKiogQHR5cGUge0FycmF5PGltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbXBvbmVudD59ICovXG5sZXQgYWZ0ZXJQYWludEVmZmVjdHMgPSBbXTtcblxubGV0IG9sZEJlZm9yZURpZmYgPSBvcHRpb25zLl9kaWZmO1xubGV0IG9sZEJlZm9yZVJlbmRlciA9IG9wdGlvbnMuX3JlbmRlcjtcbmxldCBvbGRBZnRlckRpZmYgPSBvcHRpb25zLmRpZmZlZDtcbmxldCBvbGRDb21taXQgPSBvcHRpb25zLl9jb21taXQ7XG5sZXQgb2xkQmVmb3JlVW5tb3VudCA9IG9wdGlvbnMudW5tb3VudDtcblxuY29uc3QgUkFGX1RJTUVPVVQgPSAxMDA7XG5sZXQgcHJldlJhZjtcblxub3B0aW9ucy5fZGlmZiA9IHZub2RlID0+IHtcblx0Y3VycmVudENvbXBvbmVudCA9IG51bGw7XG5cdGlmIChvbGRCZWZvcmVEaWZmKSBvbGRCZWZvcmVEaWZmKHZub2RlKTtcbn07XG5cbm9wdGlvbnMuX3JlbmRlciA9IHZub2RlID0+IHtcblx0aWYgKG9sZEJlZm9yZVJlbmRlcikgb2xkQmVmb3JlUmVuZGVyKHZub2RlKTtcblxuXHRjdXJyZW50Q29tcG9uZW50ID0gdm5vZGUuX2NvbXBvbmVudDtcblx0Y3VycmVudEluZGV4ID0gMDtcblxuXHRjb25zdCBob29rcyA9IGN1cnJlbnRDb21wb25lbnQuX19ob29rcztcblx0aWYgKGhvb2tzKSB7XG5cdFx0aWYgKHByZXZpb3VzQ29tcG9uZW50ID09PSBjdXJyZW50Q29tcG9uZW50KSB7XG5cdFx0XHRob29rcy5fcGVuZGluZ0VmZmVjdHMgPSBbXTtcblx0XHRcdGN1cnJlbnRDb21wb25lbnQuX3JlbmRlckNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0aG9va3MuX2xpc3QuZm9yRWFjaChob29rSXRlbSA9PiB7XG5cdFx0XHRcdGlmIChob29rSXRlbS5fYXJncykgaG9va0l0ZW0uX2FyZ3MgPSB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aG9va3MuX3BlbmRpbmdFZmZlY3RzLmZvckVhY2goaW52b2tlQ2xlYW51cCk7XG5cdFx0XHRob29rcy5fcGVuZGluZ0VmZmVjdHMuZm9yRWFjaChpbnZva2VFZmZlY3QpO1xuXHRcdFx0aG9va3MuX3BlbmRpbmdFZmZlY3RzID0gW107XG5cdFx0fVxuXHR9XG5cdHByZXZpb3VzQ29tcG9uZW50ID0gY3VycmVudENvbXBvbmVudDtcbn07XG5cbm9wdGlvbnMuZGlmZmVkID0gdm5vZGUgPT4ge1xuXHRpZiAob2xkQWZ0ZXJEaWZmKSBvbGRBZnRlckRpZmYodm5vZGUpO1xuXG5cdGNvbnN0IGMgPSB2bm9kZS5fY29tcG9uZW50O1xuXHRpZiAoYyAmJiBjLl9faG9va3MgJiYgYy5fX2hvb2tzLl9wZW5kaW5nRWZmZWN0cy5sZW5ndGgpIHtcblx0XHRhZnRlclBhaW50KGFmdGVyUGFpbnRFZmZlY3RzLnB1c2goYykpO1xuXHR9XG5cdGN1cnJlbnRDb21wb25lbnQgPSBudWxsO1xuXHRwcmV2aW91c0NvbXBvbmVudCA9IG51bGw7XG59O1xuXG5vcHRpb25zLl9jb21taXQgPSAodm5vZGUsIGNvbW1pdFF1ZXVlKSA9PiB7XG5cdGNvbW1pdFF1ZXVlLnNvbWUoY29tcG9uZW50ID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29tcG9uZW50Ll9yZW5kZXJDYWxsYmFja3MuZm9yRWFjaChpbnZva2VDbGVhbnVwKTtcblx0XHRcdGNvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzID0gY29tcG9uZW50Ll9yZW5kZXJDYWxsYmFja3MuZmlsdGVyKGNiID0+XG5cdFx0XHRcdGNiLl92YWx1ZSA/IGludm9rZUVmZmVjdChjYikgOiB0cnVlXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGNvbW1pdFF1ZXVlLnNvbWUoYyA9PiB7XG5cdFx0XHRcdGlmIChjLl9yZW5kZXJDYWxsYmFja3MpIGMuX3JlbmRlckNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0fSk7XG5cdFx0XHRjb21taXRRdWV1ZSA9IFtdO1xuXHRcdFx0b3B0aW9ucy5fY2F0Y2hFcnJvcihlLCBjb21wb25lbnQuX3Zub2RlKTtcblx0XHR9XG5cdH0pO1xuXG5cdGlmIChvbGRDb21taXQpIG9sZENvbW1pdCh2bm9kZSwgY29tbWl0UXVldWUpO1xufTtcblxub3B0aW9ucy51bm1vdW50ID0gdm5vZGUgPT4ge1xuXHRpZiAob2xkQmVmb3JlVW5tb3VudCkgb2xkQmVmb3JlVW5tb3VudCh2bm9kZSk7XG5cblx0Y29uc3QgYyA9IHZub2RlLl9jb21wb25lbnQ7XG5cdGlmIChjICYmIGMuX19ob29rcykge1xuXHRcdGxldCBoYXNFcnJvcmVkO1xuXHRcdGMuX19ob29rcy5fbGlzdC5mb3JFYWNoKHMgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aW52b2tlQ2xlYW51cChzKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0aGFzRXJyb3JlZCA9IGU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aWYgKGhhc0Vycm9yZWQpIG9wdGlvbnMuX2NhdGNoRXJyb3IoaGFzRXJyb3JlZCwgYy5fdm5vZGUpO1xuXHR9XG59O1xuXG4vKipcbiAqIEdldCBhIGhvb2sncyBzdGF0ZSBmcm9tIHRoZSBjdXJyZW50Q29tcG9uZW50XG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBob29rIHRvIGdldFxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgVGhlIGluZGV4IG9mIHRoZSBob29rIHRvIGdldFxuICogQHJldHVybnMge2FueX1cbiAqL1xuZnVuY3Rpb24gZ2V0SG9va1N0YXRlKGluZGV4LCB0eXBlKSB7XG5cdGlmIChvcHRpb25zLl9ob29rKSB7XG5cdFx0b3B0aW9ucy5faG9vayhjdXJyZW50Q29tcG9uZW50LCBpbmRleCwgY3VycmVudEhvb2sgfHwgdHlwZSk7XG5cdH1cblx0Y3VycmVudEhvb2sgPSAwO1xuXG5cdC8vIExhcmdlbHkgaW5zcGlyZWQgYnk6XG5cdC8vICogaHR0cHM6Ly9naXRodWIuY29tL21pY2hhZWwta2xlaW4vZnVuY3kuanMvYmxvYi9mNmJlNzM0NjhlNmVjNDZiMGZmNWFhM2NjNGM5YmFmNzJhMjkwMjVhL3NyYy9ob29rcy9jb3JlX2hvb2tzLm1qc1xuXHQvLyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNoYWVsLWtsZWluL2Z1bmN5LmpzL2Jsb2IvNjUwYmVhYTU4YzQzYzMzYTc0ODIwYTNjOThiM2M3MDc5Y2YyZTMzMy9zcmMvcmVuZGVyZXIubWpzXG5cdC8vIE90aGVyIGltcGxlbWVudGF0aW9ucyB0byBsb29rIGF0OlxuXHQvLyAqIGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9tbm94MDVxcDhcblx0Y29uc3QgaG9va3MgPVxuXHRcdGN1cnJlbnRDb21wb25lbnQuX19ob29rcyB8fFxuXHRcdChjdXJyZW50Q29tcG9uZW50Ll9faG9va3MgPSB7XG5cdFx0XHRfbGlzdDogW10sXG5cdFx0XHRfcGVuZGluZ0VmZmVjdHM6IFtdXG5cdFx0fSk7XG5cblx0aWYgKGluZGV4ID49IGhvb2tzLl9saXN0Lmxlbmd0aCkge1xuXHRcdGhvb2tzLl9saXN0LnB1c2goe30pO1xuXHR9XG5cdHJldHVybiBob29rcy5fbGlzdFtpbmRleF07XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW5kZXgnKS5TdGF0ZVVwZGF0ZXI8YW55Pn0gW2luaXRpYWxTdGF0ZV1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuXHRjdXJyZW50SG9vayA9IDE7XG5cdHJldHVybiB1c2VSZWR1Y2VyKGludm9rZU9yUmV0dXJuLCBpbml0aWFsU3RhdGUpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2luZGV4JykuUmVkdWNlcjxhbnksIGFueT59IHJlZHVjZXJcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2luZGV4JykuU3RhdGVVcGRhdGVyPGFueT59IGluaXRpYWxTdGF0ZVxuICogQHBhcmFtIHsoaW5pdGlhbFN0YXRlOiBhbnkpID0+IHZvaWR9IFtpbml0XVxuICogQHJldHVybnMge1sgYW55LCAoc3RhdGU6IGFueSkgPT4gdm9pZCBdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsU3RhdGUsIGluaXQpIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5SZWR1Y2VySG9va1N0YXRlfSAqL1xuXHRjb25zdCBob29rU3RhdGUgPSBnZXRIb29rU3RhdGUoY3VycmVudEluZGV4KyssIDIpO1xuXHRob29rU3RhdGUuX3JlZHVjZXIgPSByZWR1Y2VyO1xuXHRpZiAoIWhvb2tTdGF0ZS5fY29tcG9uZW50KSB7XG5cdFx0aG9va1N0YXRlLl92YWx1ZSA9IFtcblx0XHRcdCFpbml0ID8gaW52b2tlT3JSZXR1cm4odW5kZWZpbmVkLCBpbml0aWFsU3RhdGUpIDogaW5pdChpbml0aWFsU3RhdGUpLFxuXG5cdFx0XHRhY3Rpb24gPT4ge1xuXHRcdFx0XHRjb25zdCBuZXh0VmFsdWUgPSBob29rU3RhdGUuX3JlZHVjZXIoaG9va1N0YXRlLl92YWx1ZVswXSwgYWN0aW9uKTtcblx0XHRcdFx0aWYgKGhvb2tTdGF0ZS5fdmFsdWVbMF0gIT09IG5leHRWYWx1ZSkge1xuXHRcdFx0XHRcdGhvb2tTdGF0ZS5fdmFsdWUgPSBbbmV4dFZhbHVlLCBob29rU3RhdGUuX3ZhbHVlWzFdXTtcblx0XHRcdFx0XHRob29rU3RhdGUuX2NvbXBvbmVudC5zZXRTdGF0ZSh7fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdO1xuXG5cdFx0aG9va1N0YXRlLl9jb21wb25lbnQgPSBjdXJyZW50Q29tcG9uZW50O1xuXHR9XG5cblx0cmV0dXJuIGhvb2tTdGF0ZS5fdmFsdWU7XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3R9IGNhbGxiYWNrXG4gKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VFZmZlY3QoY2FsbGJhY2ssIGFyZ3MpIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3RIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCAzKTtcblx0aWYgKCFvcHRpb25zLl9za2lwRWZmZWN0cyAmJiBhcmdzQ2hhbmdlZChzdGF0ZS5fYXJncywgYXJncykpIHtcblx0XHRzdGF0ZS5fdmFsdWUgPSBjYWxsYmFjaztcblx0XHRzdGF0ZS5fYXJncyA9IGFyZ3M7XG5cblx0XHRjdXJyZW50Q29tcG9uZW50Ll9faG9va3MuX3BlbmRpbmdFZmZlY3RzLnB1c2goc3RhdGUpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3R9IGNhbGxiYWNrXG4gKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY2FsbGJhY2ssIGFyZ3MpIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3RIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCA0KTtcblx0aWYgKCFvcHRpb25zLl9za2lwRWZmZWN0cyAmJiBhcmdzQ2hhbmdlZChzdGF0ZS5fYXJncywgYXJncykpIHtcblx0XHRzdGF0ZS5fdmFsdWUgPSBjYWxsYmFjaztcblx0XHRzdGF0ZS5fYXJncyA9IGFyZ3M7XG5cblx0XHRjdXJyZW50Q29tcG9uZW50Ll9yZW5kZXJDYWxsYmFja3MucHVzaChzdGF0ZSk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlZihpbml0aWFsVmFsdWUpIHtcblx0Y3VycmVudEhvb2sgPSA1O1xuXHRyZXR1cm4gdXNlTWVtbygoKSA9PiAoeyBjdXJyZW50OiBpbml0aWFsVmFsdWUgfSksIFtdKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVmXG4gKiBAcGFyYW0geygpID0+IG9iamVjdH0gY3JlYXRlSGFuZGxlXG4gKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlSGFuZGxlLCBhcmdzKSB7XG5cdGN1cnJlbnRIb29rID0gNjtcblx0dXNlTGF5b3V0RWZmZWN0KFxuXHRcdCgpID0+IHtcblx0XHRcdGlmICh0eXBlb2YgcmVmID09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0cmVmKGNyZWF0ZUhhbmRsZSgpKTtcblx0XHRcdFx0cmV0dXJuICgpID0+IHJlZihudWxsKTtcblx0XHRcdH0gZWxzZSBpZiAocmVmKSB7XG5cdFx0XHRcdHJlZi5jdXJyZW50ID0gY3JlYXRlSGFuZGxlKCk7XG5cdFx0XHRcdHJldHVybiAoKSA9PiAocmVmLmN1cnJlbnQgPSBudWxsKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGFyZ3MgPT0gbnVsbCA/IGFyZ3MgOiBhcmdzLmNvbmNhdChyZWYpXG5cdCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHsoKSA9PiBhbnl9IGZhY3RvcnlcbiAqIEBwYXJhbSB7YW55W119IGFyZ3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1lbW8oZmFjdG9yeSwgYXJncykge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLk1lbW9Ib29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCA3KTtcblx0aWYgKGFyZ3NDaGFuZ2VkKHN0YXRlLl9hcmdzLCBhcmdzKSkge1xuXHRcdHN0YXRlLl92YWx1ZSA9IGZhY3RvcnkoKTtcblx0XHRzdGF0ZS5fYXJncyA9IGFyZ3M7XG5cdFx0c3RhdGUuX2ZhY3RvcnkgPSBmYWN0b3J5O1xuXHR9XG5cblx0cmV0dXJuIHN0YXRlLl92YWx1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0geygpID0+IHZvaWR9IGNhbGxiYWNrXG4gKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgYXJncykge1xuXHRjdXJyZW50SG9vayA9IDg7XG5cdHJldHVybiB1c2VNZW1vKCgpID0+IGNhbGxiYWNrLCBhcmdzKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlByZWFjdENvbnRleHR9IGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbnRleHQoY29udGV4dCkge1xuXHRjb25zdCBwcm92aWRlciA9IGN1cnJlbnRDb21wb25lbnQuY29udGV4dFtjb250ZXh0Ll9pZF07XG5cdC8vIFdlIGNvdWxkIHNraXAgdGhpcyBjYWxsIGhlcmUsIGJ1dCB0aGFuIHdlJ2Qgbm90IGNhbGxcblx0Ly8gYG9wdGlvbnMuX2hvb2tgLiBXZSBuZWVkIHRvIGRvIHRoYXQgaW4gb3JkZXIgdG8gbWFrZVxuXHQvLyB0aGUgZGV2dG9vbHMgYXdhcmUgb2YgdGhpcyBob29rLlxuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbnRleHRIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCA5KTtcblx0Ly8gVGhlIGRldnRvb2xzIG5lZWRzIGFjY2VzcyB0byB0aGUgY29udGV4dCBvYmplY3QgdG9cblx0Ly8gYmUgYWJsZSB0byBwdWxsIG9mIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gbm8gcHJvdmlkZXJcblx0Ly8gaXMgcHJlc2VudCBpbiB0aGUgdHJlZS5cblx0c3RhdGUuX2NvbnRleHQgPSBjb250ZXh0O1xuXHRpZiAoIXByb3ZpZGVyKSByZXR1cm4gY29udGV4dC5fZGVmYXVsdFZhbHVlO1xuXHQvLyBUaGlzIGlzIHByb2JhYmx5IG5vdCBzYWZlIHRvIGNvbnZlcnQgdG8gXCIhXCJcblx0aWYgKHN0YXRlLl92YWx1ZSA9PSBudWxsKSB7XG5cdFx0c3RhdGUuX3ZhbHVlID0gdHJ1ZTtcblx0XHRwcm92aWRlci5zdWIoY3VycmVudENvbXBvbmVudCk7XG5cdH1cblx0cmV0dXJuIHByb3ZpZGVyLnByb3BzLnZhbHVlO1xufVxuXG4vKipcbiAqIERpc3BsYXkgYSBjdXN0b20gbGFiZWwgZm9yIGEgY3VzdG9tIGhvb2sgZm9yIHRoZSBkZXZ0b29scyBwYW5lbFxuICogQHR5cGUgezxUPih2YWx1ZTogVCwgY2I/OiAodmFsdWU6IFQpID0+IHN0cmluZyB8IG51bWJlcikgPT4gdm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlcikge1xuXHRpZiAob3B0aW9ucy51c2VEZWJ1Z1ZhbHVlKSB7XG5cdFx0b3B0aW9ucy51c2VEZWJ1Z1ZhbHVlKGZvcm1hdHRlciA/IGZvcm1hdHRlcih2YWx1ZSkgOiB2YWx1ZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0geyhlcnJvcjogYW55KSA9PiB2b2lkfSBjYlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRXJyb3JCb3VuZGFyeShjYikge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVycm9yQm91bmRhcnlIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCAxMCk7XG5cdGNvbnN0IGVyclN0YXRlID0gdXNlU3RhdGUoKTtcblx0c3RhdGUuX3ZhbHVlID0gY2I7XG5cdGlmICghY3VycmVudENvbXBvbmVudC5jb21wb25lbnREaWRDYXRjaCkge1xuXHRcdGN1cnJlbnRDb21wb25lbnQuY29tcG9uZW50RGlkQ2F0Y2ggPSBlcnIgPT4ge1xuXHRcdFx0aWYgKHN0YXRlLl92YWx1ZSkgc3RhdGUuX3ZhbHVlKGVycik7XG5cdFx0XHRlcnJTdGF0ZVsxXShlcnIpO1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIFtcblx0XHRlcnJTdGF0ZVswXSxcblx0XHQoKSA9PiB7XG5cdFx0XHRlcnJTdGF0ZVsxXSh1bmRlZmluZWQpO1xuXHRcdH1cblx0XTtcbn1cblxuLyoqXG4gKiBBZnRlciBwYWludCBlZmZlY3RzIGNvbnN1bWVyLlxuICovXG5mdW5jdGlvbiBmbHVzaEFmdGVyUGFpbnRFZmZlY3RzKCkge1xuXHRsZXQgY29tcG9uZW50O1xuXHR3aGlsZSAoKGNvbXBvbmVudCA9IGFmdGVyUGFpbnRFZmZlY3RzLnNoaWZ0KCkpKSB7XG5cdFx0aWYgKCFjb21wb25lbnQuX3BhcmVudERvbSkgY29udGludWU7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbXBvbmVudC5fX2hvb2tzLl9wZW5kaW5nRWZmZWN0cy5mb3JFYWNoKGludm9rZUNsZWFudXApO1xuXHRcdFx0Y29tcG9uZW50Ll9faG9va3MuX3BlbmRpbmdFZmZlY3RzLmZvckVhY2goaW52b2tlRWZmZWN0KTtcblx0XHRcdGNvbXBvbmVudC5fX2hvb2tzLl9wZW5kaW5nRWZmZWN0cyA9IFtdO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGNvbXBvbmVudC5fX2hvb2tzLl9wZW5kaW5nRWZmZWN0cyA9IFtdO1xuXHRcdFx0b3B0aW9ucy5fY2F0Y2hFcnJvcihlLCBjb21wb25lbnQuX3Zub2RlKTtcblx0XHR9XG5cdH1cbn1cblxubGV0IEhBU19SQUYgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09ICdmdW5jdGlvbic7XG5cbi8qKlxuICogU2NoZWR1bGUgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGFmdGVyIHRoZSBicm93c2VyIGhhcyBhIGNoYW5jZSB0byBwYWludCBhIG5ldyBmcmFtZS5cbiAqIERvIHRoaXMgYnkgY29tYmluaW5nIHJlcXVlc3RBbmltYXRpb25GcmFtZSAockFGKSArIHNldFRpbWVvdXQgdG8gaW52b2tlIGEgY2FsbGJhY2sgYWZ0ZXJcbiAqIHRoZSBuZXh0IGJyb3dzZXIgZnJhbWUuXG4gKlxuICogQWxzbywgc2NoZWR1bGUgYSB0aW1lb3V0IGluIHBhcmFsbGVsIHRvIHRoZSB0aGUgckFGIHRvIGVuc3VyZSB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZFxuICogZXZlbiBpZiBSQUYgZG9lc24ndCBmaXJlIChmb3IgZXhhbXBsZSBpZiB0aGUgYnJvd3NlciB0YWIgaXMgbm90IHZpc2libGUpXG4gKlxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBjYWxsYmFja1xuICovXG5mdW5jdGlvbiBhZnRlck5leHRGcmFtZShjYWxsYmFjaykge1xuXHRjb25zdCBkb25lID0gKCkgPT4ge1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHRpZiAoSEFTX1JBRikgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTtcblx0XHRzZXRUaW1lb3V0KGNhbGxiYWNrKTtcblx0fTtcblx0Y29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoZG9uZSwgUkFGX1RJTUVPVVQpO1xuXG5cdGxldCByYWY7XG5cdGlmIChIQVNfUkFGKSB7XG5cdFx0cmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRvbmUpO1xuXHR9XG59XG5cbi8vIE5vdGU6IGlmIHNvbWVvbmUgdXNlZCBvcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lLFxuLy8gdGhlbiBlZmZlY3RzIHdpbGwgQUxXQVlTIHJ1biBvbiB0aGUgTkVYVCBmcmFtZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IG9uZSwgaW5jdXJyaW5nIGEgfjE2bXMgZGVsYXkuXG4vLyBQZXJoYXBzIHRoaXMgaXMgbm90IHN1Y2ggYSBiaWcgZGVhbC5cbi8qKlxuICogU2NoZWR1bGUgYWZ0ZXJQYWludEVmZmVjdHMgZmx1c2ggYWZ0ZXIgdGhlIGJyb3dzZXIgcGFpbnRzXG4gKiBAcGFyYW0ge251bWJlcn0gbmV3UXVldWVMZW5ndGhcbiAqL1xuZnVuY3Rpb24gYWZ0ZXJQYWludChuZXdRdWV1ZUxlbmd0aCkge1xuXHRpZiAobmV3UXVldWVMZW5ndGggPT09IDEgfHwgcHJldlJhZiAhPT0gb3B0aW9ucy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcblx0XHRwcmV2UmFmID0gb3B0aW9ucy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cdFx0KHByZXZSYWYgfHwgYWZ0ZXJOZXh0RnJhbWUpKGZsdXNoQWZ0ZXJQYWludEVmZmVjdHMpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3RIb29rU3RhdGV9IGhvb2tcbiAqL1xuZnVuY3Rpb24gaW52b2tlQ2xlYW51cChob29rKSB7XG5cdC8vIEEgaG9vayBjbGVhbnVwIGNhbiBpbnRyb2R1Y2UgYSBjYWxsIHRvIHJlbmRlciB3aGljaCBjcmVhdGVzIGEgbmV3IHJvb3QsIHRoaXMgd2lsbCBjYWxsIG9wdGlvbnMudm5vZGVcblx0Ly8gYW5kIG1vdmUgdGhlIGN1cnJlbnRDb21wb25lbnQgYXdheS5cblx0Y29uc3QgY29tcCA9IGN1cnJlbnRDb21wb25lbnQ7XG5cdGxldCBjbGVhbnVwID0gaG9vay5fY2xlYW51cDtcblx0aWYgKHR5cGVvZiBjbGVhbnVwID09ICdmdW5jdGlvbicpIHtcblx0XHRob29rLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuXHRcdGNsZWFudXAoKTtcblx0fVxuXHRjdXJyZW50Q29tcG9uZW50ID0gY29tcDtcbn1cblxuLyoqXG4gKiBJbnZva2UgYSBIb29rJ3MgZWZmZWN0XG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVmZmVjdEhvb2tTdGF0ZX0gaG9va1xuICovXG5mdW5jdGlvbiBpbnZva2VFZmZlY3QoaG9vaykge1xuXHQvLyBBIGhvb2sgY2FsbCBjYW4gaW50cm9kdWNlIGEgY2FsbCB0byByZW5kZXIgd2hpY2ggY3JlYXRlcyBhIG5ldyByb290LCB0aGlzIHdpbGwgY2FsbCBvcHRpb25zLnZub2RlXG5cdC8vIGFuZCBtb3ZlIHRoZSBjdXJyZW50Q29tcG9uZW50IGF3YXkuXG5cdGNvbnN0IGNvbXAgPSBjdXJyZW50Q29tcG9uZW50O1xuXHRob29rLl9jbGVhbnVwID0gaG9vay5fdmFsdWUoKTtcblx0Y3VycmVudENvbXBvbmVudCA9IGNvbXA7XG59XG5cbi8qKlxuICogQHBhcmFtIHthbnlbXX0gb2xkQXJnc1xuICogQHBhcmFtIHthbnlbXX0gbmV3QXJnc1xuICovXG5mdW5jdGlvbiBhcmdzQ2hhbmdlZChvbGRBcmdzLCBuZXdBcmdzKSB7XG5cdHJldHVybiAoXG5cdFx0IW9sZEFyZ3MgfHxcblx0XHRvbGRBcmdzLmxlbmd0aCAhPT0gbmV3QXJncy5sZW5ndGggfHxcblx0XHRuZXdBcmdzLnNvbWUoKGFyZywgaW5kZXgpID0+IGFyZyAhPT0gb2xkQXJnc1tpbmRleF0pXG5cdCk7XG59XG5cbmZ1bmN0aW9uIGludm9rZU9yUmV0dXJuKGFyZywgZikge1xuXHRyZXR1cm4gdHlwZW9mIGYgPT0gJ2Z1bmN0aW9uJyA/IGYoYXJnKSA6IGY7XG59XG4iLCAiLyoqXG4gKiBBc3NpZ24gcHJvcGVydGllcyBmcm9tIGBwcm9wc2AgdG8gYG9iamBcbiAqIEB0ZW1wbGF0ZSBPLCBQIFRoZSBvYmogYW5kIHByb3BzIHR5cGVzXG4gKiBAcGFyYW0ge099IG9iaiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0b1xuICogQHBhcmFtIHtQfSBwcm9wcyBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gKiBAcmV0dXJucyB7TyAmIFB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ24ob2JqLCBwcm9wcykge1xuXHRmb3IgKGxldCBpIGluIHByb3BzKSBvYmpbaV0gPSBwcm9wc1tpXTtcblx0cmV0dXJuIC8qKiBAdHlwZSB7TyAmIFB9ICovIChvYmopO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHR3byBvYmplY3RzIGhhdmUgYSBkaWZmZXJlbnQgc2hhcGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBhXG4gKiBAcGFyYW0ge29iamVjdH0gYlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93RGlmZmVycyhhLCBiKSB7XG5cdGZvciAobGV0IGkgaW4gYSkgaWYgKGkgIT09ICdfX3NvdXJjZScgJiYgIShpIGluIGIpKSByZXR1cm4gdHJ1ZTtcblx0Zm9yIChsZXQgaSBpbiBiKSBpZiAoaSAhPT0gJ19fc291cmNlJyAmJiBhW2ldICE9PSBiW2ldKSByZXR1cm4gdHJ1ZTtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlKSB7XG5cdGxldCBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXHRpZiAocGFyZW50Tm9kZSkgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbn1cbiIsICJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdwcmVhY3QnO1xuaW1wb3J0IHsgc2hhbGxvd0RpZmZlcnMgfSBmcm9tICcuL3V0aWwnO1xuXG4vKipcbiAqIENvbXBvbmVudCBjbGFzcyB3aXRoIGEgcHJlZGVmaW5lZCBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCBpbXBsZW1lbnRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwKSB7XG5cdHRoaXMucHJvcHMgPSBwO1xufVxuUHVyZUNvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50KCk7XG4vLyBTb21lIHRoaXJkLXBhcnR5IGxpYnJhcmllcyBjaGVjayBpZiB0aGlzIHByb3BlcnR5IGlzIHByZXNlbnRcblB1cmVDb21wb25lbnQucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ID0gdHJ1ZTtcblB1cmVDb21wb25lbnQucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IGZ1bmN0aW9uKHByb3BzLCBzdGF0ZSkge1xuXHRyZXR1cm4gc2hhbGxvd0RpZmZlcnModGhpcy5wcm9wcywgcHJvcHMpIHx8IHNoYWxsb3dEaWZmZXJzKHRoaXMuc3RhdGUsIHN0YXRlKTtcbn07XG4iLCAiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCB9IGZyb20gJ3ByZWFjdCc7XG5pbXBvcnQgeyBzaGFsbG93RGlmZmVycyB9IGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogTWVtb2l6ZSBhIGNvbXBvbmVudCwgc28gdGhhdCBpdCBvbmx5IHVwZGF0ZXMgd2hlbiB0aGUgcHJvcHMgYWN0dWFsbHkgaGF2ZVxuICogY2hhbmdlZC4gVGhpcyB3YXMgcHJldmlvdXNseSBrbm93biBhcyBgUmVhY3QucHVyZWAuXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkZ1bmN0aW9uQ29tcG9uZW50fSBjIGZ1bmN0aW9uYWwgY29tcG9uZW50XG4gKiBAcGFyYW0geyhwcmV2OiBvYmplY3QsIG5leHQ6IG9iamVjdCkgPT4gYm9vbGVhbn0gW2NvbXBhcmVyXSBDdXN0b20gZXF1YWxpdHkgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5GdW5jdGlvbkNvbXBvbmVudH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW8oYywgY29tcGFyZXIpIHtcblx0ZnVuY3Rpb24gc2hvdWxkVXBkYXRlKG5leHRQcm9wcykge1xuXHRcdGxldCByZWYgPSB0aGlzLnByb3BzLnJlZjtcblx0XHRsZXQgdXBkYXRlUmVmID0gcmVmID09IG5leHRQcm9wcy5yZWY7XG5cdFx0aWYgKCF1cGRhdGVSZWYgJiYgcmVmKSB7XG5cdFx0XHRyZWYuY2FsbCA/IHJlZihudWxsKSA6IChyZWYuY3VycmVudCA9IG51bGwpO1xuXHRcdH1cblxuXHRcdGlmICghY29tcGFyZXIpIHtcblx0XHRcdHJldHVybiBzaGFsbG93RGlmZmVycyh0aGlzLnByb3BzLCBuZXh0UHJvcHMpO1xuXHRcdH1cblxuXHRcdHJldHVybiAhY29tcGFyZXIodGhpcy5wcm9wcywgbmV4dFByb3BzKSB8fCAhdXBkYXRlUmVmO1xuXHR9XG5cblx0ZnVuY3Rpb24gTWVtb2VkKHByb3BzKSB7XG5cdFx0dGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBzaG91bGRVcGRhdGU7XG5cdFx0cmV0dXJuIGNyZWF0ZUVsZW1lbnQoYywgcHJvcHMpO1xuXHR9XG5cdE1lbW9lZC5kaXNwbGF5TmFtZSA9ICdNZW1vKCcgKyAoYy5kaXNwbGF5TmFtZSB8fCBjLm5hbWUpICsgJyknO1xuXHRNZW1vZWQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB0cnVlO1xuXHRNZW1vZWQuX2ZvcndhcmRlZCA9IHRydWU7XG5cdHJldHVybiBNZW1vZWQ7XG59XG4iLCAiaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJ3ByZWFjdCc7XG5pbXBvcnQgeyBhc3NpZ24gfSBmcm9tICcuL3V0aWwnO1xuXG5sZXQgb2xkRGlmZkhvb2sgPSBvcHRpb25zLl9kaWZmO1xub3B0aW9ucy5fZGlmZiA9IHZub2RlID0+IHtcblx0aWYgKHZub2RlLnR5cGUgJiYgdm5vZGUudHlwZS5fZm9yd2FyZGVkICYmIHZub2RlLnJlZikge1xuXHRcdHZub2RlLnByb3BzLnJlZiA9IHZub2RlLnJlZjtcblx0XHR2bm9kZS5yZWYgPSBudWxsO1xuXHR9XG5cdGlmIChvbGREaWZmSG9vaykgb2xkRGlmZkhvb2sodm5vZGUpO1xufTtcblxuZXhwb3J0IGNvbnN0IFJFQUNUX0ZPUldBUkRfU1lNQk9MID1cblx0KHR5cGVvZiBTeW1ib2wgIT0gJ3VuZGVmaW5lZCcgJiZcblx0XHRTeW1ib2wuZm9yICYmXG5cdFx0U3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKSkgfHxcblx0MHhmNDc7XG5cbi8qKlxuICogUGFzcyByZWYgZG93biB0byBhIGNoaWxkLiBUaGlzIGlzIG1haW5seSB1c2VkIGluIGxpYnJhcmllcyB3aXRoIEhPQ3MgdGhhdFxuICogd3JhcCBjb21wb25lbnRzLiBVc2luZyBgZm9yd2FyZFJlZmAgdGhlcmUgaXMgYW4gZWFzeSB3YXkgdG8gZ2V0IGEgcmVmZXJlbmNlXG4gKiBvZiB0aGUgd3JhcHBlZCBjb21wb25lbnQgaW5zdGVhZCBvZiBvbmUgb2YgdGhlIHdyYXBwZXIgaXRzZWxmLlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW5kZXgnKS5Gb3J3YXJkRm59IGZuXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuL2ludGVybmFsJykuRnVuY3Rpb25Db21wb25lbnR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkUmVmKGZuKSB7XG5cdGZ1bmN0aW9uIEZvcndhcmRlZChwcm9wcykge1xuXHRcdGxldCBjbG9uZSA9IGFzc2lnbih7fSwgcHJvcHMpO1xuXHRcdGRlbGV0ZSBjbG9uZS5yZWY7XG5cdFx0cmV0dXJuIGZuKGNsb25lLCBwcm9wcy5yZWYgfHwgbnVsbCk7XG5cdH1cblxuXHQvLyBtb2J4LXJlYWN0IGNoZWNrcyBmb3IgdGhpcyBiZWluZyBwcmVzZW50XG5cdEZvcndhcmRlZC4kJHR5cGVvZiA9IFJFQUNUX0ZPUldBUkRfU1lNQk9MO1xuXHQvLyBtb2J4LXJlYWN0IGhlYXZpbHkgcmVsaWVzIG9uIGltcGxlbWVudGF0aW9uIGRldGFpbHMuXG5cdC8vIEl0IGV4cGVjdHMgYW4gb2JqZWN0IGhlcmUgd2l0aCBhIGByZW5kZXJgIHByb3BlcnR5LFxuXHQvLyBhbmQgcHJvdG90eXBlLnJlbmRlciB3aWxsIGZhaWwuIFdpdGhvdXQgdGhpc1xuXHQvLyBtb2J4LXJlYWN0IHRocm93cy5cblx0Rm9yd2FyZGVkLnJlbmRlciA9IEZvcndhcmRlZDtcblxuXHRGb3J3YXJkZWQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSBGb3J3YXJkZWQuX2ZvcndhcmRlZCA9IHRydWU7XG5cdEZvcndhcmRlZC5kaXNwbGF5TmFtZSA9ICdGb3J3YXJkUmVmKCcgKyAoZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSkgKyAnKSc7XG5cdHJldHVybiBGb3J3YXJkZWQ7XG59XG4iLCAiaW1wb3J0IHsgdG9DaGlsZEFycmF5IH0gZnJvbSAncHJlYWN0JztcblxuY29uc3QgbWFwRm4gPSAoY2hpbGRyZW4sIGZuKSA9PiB7XG5cdGlmIChjaGlsZHJlbiA9PSBudWxsKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIHRvQ2hpbGRBcnJheSh0b0NoaWxkQXJyYXkoY2hpbGRyZW4pLm1hcChmbikpO1xufTtcblxuLy8gVGhpcyBBUEkgaXMgY29tcGxldGVseSB1bm5lY2Vzc2FyeSBmb3IgUHJlYWN0LCBzbyBpdCdzIGJhc2ljYWxseSBwYXNzdGhyb3VnaC5cbmV4cG9ydCBjb25zdCBDaGlsZHJlbiA9IHtcblx0bWFwOiBtYXBGbixcblx0Zm9yRWFjaDogbWFwRm4sXG5cdGNvdW50KGNoaWxkcmVuKSB7XG5cdFx0cmV0dXJuIGNoaWxkcmVuID8gdG9DaGlsZEFycmF5KGNoaWxkcmVuKS5sZW5ndGggOiAwO1xuXHR9LFxuXHRvbmx5KGNoaWxkcmVuKSB7XG5cdFx0Y29uc3Qgbm9ybWFsaXplZCA9IHRvQ2hpbGRBcnJheShjaGlsZHJlbik7XG5cdFx0aWYgKG5vcm1hbGl6ZWQubGVuZ3RoICE9PSAxKSB0aHJvdyAnQ2hpbGRyZW4ub25seSc7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZWRbMF07XG5cdH0sXG5cdHRvQXJyYXk6IHRvQ2hpbGRBcnJheVxufTtcbiIsICJpbXBvcnQgeyBDb21wb25lbnQsIGNyZWF0ZUVsZW1lbnQsIG9wdGlvbnMsIEZyYWdtZW50IH0gZnJvbSAncHJlYWN0JztcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gJy4vdXRpbCc7XG5cbmNvbnN0IG9sZENhdGNoRXJyb3IgPSBvcHRpb25zLl9jYXRjaEVycm9yO1xub3B0aW9ucy5fY2F0Y2hFcnJvciA9IGZ1bmN0aW9uKGVycm9yLCBuZXdWTm9kZSwgb2xkVk5vZGUsIGVycm9ySW5mbykge1xuXHRpZiAoZXJyb3IudGhlbikge1xuXHRcdC8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fSAqL1xuXHRcdGxldCBjb21wb25lbnQ7XG5cdFx0bGV0IHZub2RlID0gbmV3Vk5vZGU7XG5cblx0XHRmb3IgKDsgKHZub2RlID0gdm5vZGUuX3BhcmVudCk7ICkge1xuXHRcdFx0aWYgKChjb21wb25lbnQgPSB2bm9kZS5fY29tcG9uZW50KSAmJiBjb21wb25lbnQuX2NoaWxkRGlkU3VzcGVuZCkge1xuXHRcdFx0XHRpZiAobmV3Vk5vZGUuX2RvbSA9PSBudWxsKSB7XG5cdFx0XHRcdFx0bmV3Vk5vZGUuX2RvbSA9IG9sZFZOb2RlLl9kb207XG5cdFx0XHRcdFx0bmV3Vk5vZGUuX2NoaWxkcmVuID0gb2xkVk5vZGUuX2NoaWxkcmVuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIERvbid0IGNhbGwgb2xkQ2F0Y2hFcnJvciBpZiB3ZSBmb3VuZCBhIFN1c3BlbnNlXG5cdFx0XHRcdHJldHVybiBjb21wb25lbnQuX2NoaWxkRGlkU3VzcGVuZChlcnJvciwgbmV3Vk5vZGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRvbGRDYXRjaEVycm9yKGVycm9yLCBuZXdWTm9kZSwgb2xkVk5vZGUsIGVycm9ySW5mbyk7XG59O1xuXG5jb25zdCBvbGRVbm1vdW50ID0gb3B0aW9ucy51bm1vdW50O1xub3B0aW9ucy51bm1vdW50ID0gZnVuY3Rpb24odm5vZGUpIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnR9ICovXG5cdGNvbnN0IGNvbXBvbmVudCA9IHZub2RlLl9jb21wb25lbnQ7XG5cdGlmIChjb21wb25lbnQgJiYgY29tcG9uZW50Ll9vblJlc29sdmUpIHtcblx0XHRjb21wb25lbnQuX29uUmVzb2x2ZSgpO1xuXHR9XG5cblx0Ly8gaWYgdGhlIGNvbXBvbmVudCBpcyBzdGlsbCBoeWRyYXRpbmdcblx0Ly8gbW9zdCBsaWtlbHkgaXQgaXMgYmVjYXVzZSB0aGUgY29tcG9uZW50IGlzIHN1c3BlbmRlZFxuXHQvLyB3ZSBzZXQgdGhlIHZub2RlLnR5cGUgYXMgYG51bGxgIHNvIHRoYXQgaXQgaXMgbm90IGEgdHlwZW9mIGZ1bmN0aW9uXG5cdC8vIHNvIHRoZSB1bm1vdW50IHdpbGwgcmVtb3ZlIHRoZSB2bm9kZS5fZG9tXG5cdGlmIChjb21wb25lbnQgJiYgdm5vZGUuX2h5ZHJhdGluZyA9PT0gdHJ1ZSkge1xuXHRcdHZub2RlLnR5cGUgPSBudWxsO1xuXHR9XG5cblx0aWYgKG9sZFVubW91bnQpIG9sZFVubW91bnQodm5vZGUpO1xufTtcblxuZnVuY3Rpb24gZGV0YWNoZWRDbG9uZSh2bm9kZSwgZGV0YWNoZWRQYXJlbnQsIHBhcmVudERvbSkge1xuXHRpZiAodm5vZGUpIHtcblx0XHRpZiAodm5vZGUuX2NvbXBvbmVudCAmJiB2bm9kZS5fY29tcG9uZW50Ll9faG9va3MpIHtcblx0XHRcdHZub2RlLl9jb21wb25lbnQuX19ob29rcy5fbGlzdC5mb3JFYWNoKGVmZmVjdCA9PiB7XG5cdFx0XHRcdGlmICh0eXBlb2YgZWZmZWN0Ll9jbGVhbnVwID09ICdmdW5jdGlvbicpIGVmZmVjdC5fY2xlYW51cCgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHZub2RlLl9jb21wb25lbnQuX19ob29rcyA9IG51bGw7XG5cdFx0fVxuXG5cdFx0dm5vZGUgPSBhc3NpZ24oe30sIHZub2RlKTtcblx0XHRpZiAodm5vZGUuX2NvbXBvbmVudCAhPSBudWxsKSB7XG5cdFx0XHRpZiAodm5vZGUuX2NvbXBvbmVudC5fcGFyZW50RG9tID09PSBwYXJlbnREb20pIHtcblx0XHRcdFx0dm5vZGUuX2NvbXBvbmVudC5fcGFyZW50RG9tID0gZGV0YWNoZWRQYXJlbnQ7XG5cdFx0XHR9XG5cdFx0XHR2bm9kZS5fY29tcG9uZW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHR2bm9kZS5fY2hpbGRyZW4gPVxuXHRcdFx0dm5vZGUuX2NoaWxkcmVuICYmXG5cdFx0XHR2bm9kZS5fY2hpbGRyZW4ubWFwKGNoaWxkID0+XG5cdFx0XHRcdGRldGFjaGVkQ2xvbmUoY2hpbGQsIGRldGFjaGVkUGFyZW50LCBwYXJlbnREb20pXG5cdFx0XHQpO1xuXHR9XG5cblx0cmV0dXJuIHZub2RlO1xufVxuXG5mdW5jdGlvbiByZW1vdmVPcmlnaW5hbCh2bm9kZSwgZGV0YWNoZWRQYXJlbnQsIG9yaWdpbmFsUGFyZW50KSB7XG5cdGlmICh2bm9kZSkge1xuXHRcdHZub2RlLl9vcmlnaW5hbCA9IG51bGw7XG5cdFx0dm5vZGUuX2NoaWxkcmVuID1cblx0XHRcdHZub2RlLl9jaGlsZHJlbiAmJlxuXHRcdFx0dm5vZGUuX2NoaWxkcmVuLm1hcChjaGlsZCA9PlxuXHRcdFx0XHRyZW1vdmVPcmlnaW5hbChjaGlsZCwgZGV0YWNoZWRQYXJlbnQsIG9yaWdpbmFsUGFyZW50KVxuXHRcdFx0KTtcblxuXHRcdGlmICh2bm9kZS5fY29tcG9uZW50KSB7XG5cdFx0XHRpZiAodm5vZGUuX2NvbXBvbmVudC5fcGFyZW50RG9tID09PSBkZXRhY2hlZFBhcmVudCkge1xuXHRcdFx0XHRpZiAodm5vZGUuX2RvbSkge1xuXHRcdFx0XHRcdG9yaWdpbmFsUGFyZW50Lmluc2VydEJlZm9yZSh2bm9kZS5fZG9tLCB2bm9kZS5fbmV4dERvbSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dm5vZGUuX2NvbXBvbmVudC5fZm9yY2UgPSB0cnVlO1xuXHRcdFx0XHR2bm9kZS5fY29tcG9uZW50Ll9wYXJlbnREb20gPSBvcmlnaW5hbFBhcmVudDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdm5vZGU7XG59XG5cbi8vIGhhdmluZyBjdXN0b20gaW5oZXJpdGFuY2UgaW5zdGVhZCBvZiBhIGNsYXNzIGhlcmUgc2F2ZXMgYSBsb3Qgb2YgYnl0ZXNcbmV4cG9ydCBmdW5jdGlvbiBTdXNwZW5zZSgpIHtcblx0Ly8gd2UgZG8gbm90IGNhbGwgc3VwZXIgaGVyZSB0byBnb2xmIHNvbWUgYnl0ZXMuLi5cblx0dGhpcy5fcGVuZGluZ1N1c3BlbnNpb25Db3VudCA9IDA7XG5cdHRoaXMuX3N1c3BlbmRlcnMgPSBudWxsO1xuXHR0aGlzLl9kZXRhY2hPbk5leHRSZW5kZXIgPSBudWxsO1xufVxuXG4vLyBUaGluZ3Mgd2UgZG8gaGVyZSB0byBzYXZlIHNvbWUgYnl0ZXMgYnV0IGFyZSBub3QgcHJvcGVyIEpTIGluaGVyaXRhbmNlOlxuLy8gLSBjYWxsIGBuZXcgQ29tcG9uZW50KClgIGFzIHRoZSBwcm90b3R5cGVcbi8vIC0gZG8gbm90IHNldCBgU3VzcGVuc2UucHJvdG90eXBlLmNvbnN0cnVjdG9yYCB0byBgU3VzcGVuc2VgXG5TdXNwZW5zZS5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50KCk7XG5cbi8qKlxuICogQHRoaXMge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlN1c3BlbnNlQ29tcG9uZW50fVxuICogQHBhcmFtIHtQcm9taXNlfSBwcm9taXNlIFRoZSB0aHJvd24gcHJvbWlzZVxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5WTm9kZTxhbnksIGFueT59IHN1c3BlbmRpbmdWTm9kZSBUaGUgc3VzcGVuZGluZyBjb21wb25lbnRcbiAqL1xuU3VzcGVuc2UucHJvdG90eXBlLl9jaGlsZERpZFN1c3BlbmQgPSBmdW5jdGlvbihwcm9taXNlLCBzdXNwZW5kaW5nVk5vZGUpIHtcblx0Y29uc3Qgc3VzcGVuZGluZ0NvbXBvbmVudCA9IHN1c3BlbmRpbmdWTm9kZS5fY29tcG9uZW50O1xuXG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuU3VzcGVuc2VDb21wb25lbnR9ICovXG5cdGNvbnN0IGMgPSB0aGlzO1xuXG5cdGlmIChjLl9zdXNwZW5kZXJzID09IG51bGwpIHtcblx0XHRjLl9zdXNwZW5kZXJzID0gW107XG5cdH1cblx0Yy5fc3VzcGVuZGVycy5wdXNoKHN1c3BlbmRpbmdDb21wb25lbnQpO1xuXG5cdGNvbnN0IHJlc29sdmUgPSBzdXNwZW5kZWQoYy5fdm5vZGUpO1xuXG5cdGxldCByZXNvbHZlZCA9IGZhbHNlO1xuXHRjb25zdCBvblJlc29sdmVkID0gKCkgPT4ge1xuXHRcdGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuXG5cdFx0cmVzb2x2ZWQgPSB0cnVlO1xuXHRcdHN1c3BlbmRpbmdDb21wb25lbnQuX29uUmVzb2x2ZSA9IG51bGw7XG5cblx0XHRpZiAocmVzb2x2ZSkge1xuXHRcdFx0cmVzb2x2ZShvblN1c3BlbnNpb25Db21wbGV0ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9uU3VzcGVuc2lvbkNvbXBsZXRlKCk7XG5cdFx0fVxuXHR9O1xuXG5cdHN1c3BlbmRpbmdDb21wb25lbnQuX29uUmVzb2x2ZSA9IG9uUmVzb2x2ZWQ7XG5cblx0Y29uc3Qgb25TdXNwZW5zaW9uQ29tcGxldGUgPSAoKSA9PiB7XG5cdFx0aWYgKCEtLWMuX3BlbmRpbmdTdXNwZW5zaW9uQ291bnQpIHtcblx0XHRcdC8vIElmIHRoZSBzdXNwZW5zaW9uIHdhcyBkdXJpbmcgaHlkcmF0aW9uIHdlIGRvbid0IG5lZWQgdG8gcmVzdG9yZSB0aGVcblx0XHRcdC8vIHN1c3BlbmRlZCBjaGlsZHJlbiBpbnRvIHRoZSBfY2hpbGRyZW4gYXJyYXlcblx0XHRcdGlmIChjLnN0YXRlLl9zdXNwZW5kZWQpIHtcblx0XHRcdFx0Y29uc3Qgc3VzcGVuZGVkVk5vZGUgPSBjLnN0YXRlLl9zdXNwZW5kZWQ7XG5cdFx0XHRcdGMuX3Zub2RlLl9jaGlsZHJlblswXSA9IHJlbW92ZU9yaWdpbmFsKFxuXHRcdFx0XHRcdHN1c3BlbmRlZFZOb2RlLFxuXHRcdFx0XHRcdHN1c3BlbmRlZFZOb2RlLl9jb21wb25lbnQuX3BhcmVudERvbSxcblx0XHRcdFx0XHRzdXNwZW5kZWRWTm9kZS5fY29tcG9uZW50Ll9vcmlnaW5hbFBhcmVudERvbVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjLnNldFN0YXRlKHsgX3N1c3BlbmRlZDogKGMuX2RldGFjaE9uTmV4dFJlbmRlciA9IG51bGwpIH0pO1xuXG5cdFx0XHRsZXQgc3VzcGVuZGVkO1xuXHRcdFx0d2hpbGUgKChzdXNwZW5kZWQgPSBjLl9zdXNwZW5kZXJzLnBvcCgpKSkge1xuXHRcdFx0XHRzdXNwZW5kZWQuZm9yY2VVcGRhdGUoKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFdlIGRvIG5vdCBzZXQgYHN1c3BlbmRlZDogdHJ1ZWAgZHVyaW5nIGh5ZHJhdGlvbiBiZWNhdXNlIHdlIHdhbnQgdGhlIGFjdHVhbCBtYXJrdXBcblx0ICogdG8gcmVtYWluIG9uIHNjcmVlbiBhbmQgaHlkcmF0ZSBpdCB3aGVuIHRoZSBzdXNwZW5zZSBhY3R1YWxseSBnZXRzIHJlc29sdmVkLlxuXHQgKiBXaGlsZSBpbiBub24taHlkcmF0aW9uIGNhc2VzIHRoZSB1c3VhbCBmYWxsYmFjayAtPiBjb21wb25lbnQgZmxvdyB3b3VsZCBvY2NvdXIuXG5cdCAqL1xuXHRjb25zdCB3YXNIeWRyYXRpbmcgPSBzdXNwZW5kaW5nVk5vZGUuX2h5ZHJhdGluZyA9PT0gdHJ1ZTtcblx0aWYgKCFjLl9wZW5kaW5nU3VzcGVuc2lvbkNvdW50KysgJiYgIXdhc0h5ZHJhdGluZykge1xuXHRcdGMuc2V0U3RhdGUoeyBfc3VzcGVuZGVkOiAoYy5fZGV0YWNoT25OZXh0UmVuZGVyID0gYy5fdm5vZGUuX2NoaWxkcmVuWzBdKSB9KTtcblx0fVxuXHRwcm9taXNlLnRoZW4ob25SZXNvbHZlZCwgb25SZXNvbHZlZCk7XG59O1xuXG5TdXNwZW5zZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5fc3VzcGVuZGVycyA9IFtdO1xufTtcblxuLyoqXG4gKiBAdGhpcyB7aW1wb3J0KCcuL2ludGVybmFsJykuU3VzcGVuc2VDb21wb25lbnR9XG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlN1c3BlbnNlQ29tcG9uZW50W1wicHJvcHNcIl19IHByb3BzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlN1c3BlbnNlU3RhdGV9IHN0YXRlXG4gKi9cblN1c3BlbnNlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbihwcm9wcywgc3RhdGUpIHtcblx0aWYgKHRoaXMuX2RldGFjaE9uTmV4dFJlbmRlcikge1xuXHRcdC8vIFdoZW4gdGhlIFN1c3BlbnNlJ3MgX3Zub2RlIHdhcyBjcmVhdGVkIGJ5IGEgY2FsbCB0byBjcmVhdGVWTm9kZVxuXHRcdC8vIChpLmUuIGR1ZSB0byBhIHNldFN0YXRlIGZ1cnRoZXIgdXAgaW4gdGhlIHRyZWUpXG5cdFx0Ly8gaXQncyBfY2hpbGRyZW4gcHJvcCBpcyBudWxsLCBpbiB0aGlzIGNhc2Ugd2UgXCJmb3JnZXRcIiBhYm91dCB0aGUgcGFya2VkIHZub2RlcyB0byBkZXRhY2hcblx0XHRpZiAodGhpcy5fdm5vZGUuX2NoaWxkcmVuKSB7XG5cdFx0XHRjb25zdCBkZXRhY2hlZFBhcmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0Y29uc3QgZGV0YWNoZWRDb21wb25lbnQgPSB0aGlzLl92bm9kZS5fY2hpbGRyZW5bMF0uX2NvbXBvbmVudDtcblx0XHRcdHRoaXMuX3Zub2RlLl9jaGlsZHJlblswXSA9IGRldGFjaGVkQ2xvbmUoXG5cdFx0XHRcdHRoaXMuX2RldGFjaE9uTmV4dFJlbmRlcixcblx0XHRcdFx0ZGV0YWNoZWRQYXJlbnQsXG5cdFx0XHRcdChkZXRhY2hlZENvbXBvbmVudC5fb3JpZ2luYWxQYXJlbnREb20gPSBkZXRhY2hlZENvbXBvbmVudC5fcGFyZW50RG9tKVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHR0aGlzLl9kZXRhY2hPbk5leHRSZW5kZXIgPSBudWxsO1xuXHR9XG5cblx0Ly8gV3JhcCBmYWxsYmFjayB0cmVlIGluIGEgVk5vZGUgdGhhdCBwcmV2ZW50cyBpdHNlbGYgZnJvbSBiZWluZyBtYXJrZWQgYXMgYWJvcnRpbmcgbWlkLWh5ZHJhdGlvbjpcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5WTm9kZX0gKi9cblx0Y29uc3QgZmFsbGJhY2sgPVxuXHRcdHN0YXRlLl9zdXNwZW5kZWQgJiYgY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgcHJvcHMuZmFsbGJhY2spO1xuXHRpZiAoZmFsbGJhY2spIGZhbGxiYWNrLl9oeWRyYXRpbmcgPSBudWxsO1xuXG5cdHJldHVybiBbXG5cdFx0Y3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgc3RhdGUuX3N1c3BlbmRlZCA/IG51bGwgOiBwcm9wcy5jaGlsZHJlbiksXG5cdFx0ZmFsbGJhY2tcblx0XTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGFuZCBjYWxscyB0aGUgcGFyZW50IGNvbXBvbmVudCdzIF9zdXNwZW5kZWQgbWV0aG9kLCBwYXNzaW5nIGluIHRoZVxuICogc3VzcGVuZGVkIHZub2RlLiBUaGlzIGlzIGEgd2F5IGZvciBhIHBhcmVudCAoZS5nLiBTdXNwZW5zZUxpc3QpIHRvIGdldCBub3RpZmllZFxuICogdGhhdCBvbmUgb2YgaXRzIGNoaWxkcmVuL2Rlc2NlbmRhbnRzIHN1c3BlbmRlZC5cbiAqXG4gKiBUaGUgcGFyZW50IE1BWSByZXR1cm4gYSBjYWxsYmFjay4gVGhlIGNhbGxiYWNrIHdpbGwgZ2V0IGNhbGxlZCB3aGVuIHRoZVxuICogc3VzcGVuc2lvbiByZXNvbHZlcywgbm90aWZ5aW5nIHRoZSBwYXJlbnQgb2YgdGhlIGZhY3QuXG4gKiBNb3Jlb3ZlciwgdGhlIGNhbGxiYWNrIGdldHMgZnVuY3Rpb24gYHVuc3VzcGVuZGAgYXMgYSBwYXJhbWV0ZXIuIFRoZSByZXNvbHZlZFxuICogY2hpbGQgZGVzY2VuZGFudCB3aWxsIG5vdCBhY3R1YWxseSBnZXQgdW5zdXNwZW5kZWQgdW50aWwgYHVuc3VzcGVuZGAgZ2V0cyBjYWxsZWQuXG4gKiBUaGlzIGlzIGEgd2F5IGZvciB0aGUgcGFyZW50IHRvIGRlbGF5IHVuc3VzcGVuZGluZy5cbiAqXG4gKiBJZiB0aGUgcGFyZW50IGRvZXMgbm90IHJldHVybiBhIGNhbGxiYWNrIHRoZW4gdGhlIHJlc29sdmVkIHZub2RlXG4gKiBnZXRzIHVuc3VzcGVuZGVkIGltbWVkaWF0ZWx5IHdoZW4gaXQgcmVzb2x2ZXMuXG4gKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5WTm9kZX0gdm5vZGVcbiAqIEByZXR1cm5zIHsoKHVuc3VzcGVuZDogKCkgPT4gdm9pZCkgPT4gdm9pZCk/fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VzcGVuZGVkKHZub2RlKSB7XG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fSAqL1xuXHRsZXQgY29tcG9uZW50ID0gdm5vZGUuX3BhcmVudC5fY29tcG9uZW50O1xuXHRyZXR1cm4gY29tcG9uZW50ICYmIGNvbXBvbmVudC5fc3VzcGVuZGVkICYmIGNvbXBvbmVudC5fc3VzcGVuZGVkKHZub2RlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxhenkobG9hZGVyKSB7XG5cdGxldCBwcm9tO1xuXHRsZXQgY29tcG9uZW50O1xuXHRsZXQgZXJyb3I7XG5cblx0ZnVuY3Rpb24gTGF6eShwcm9wcykge1xuXHRcdGlmICghcHJvbSkge1xuXHRcdFx0cHJvbSA9IGxvYWRlcigpO1xuXHRcdFx0cHJvbS50aGVuKFxuXHRcdFx0XHRleHBvcnRzID0+IHtcblx0XHRcdFx0XHRjb21wb25lbnQgPSBleHBvcnRzLmRlZmF1bHQgfHwgZXhwb3J0cztcblx0XHRcdFx0fSxcblx0XHRcdFx0ZSA9PiB7XG5cdFx0XHRcdFx0ZXJyb3IgPSBlO1xuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChlcnJvcikge1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXG5cdFx0aWYgKCFjb21wb25lbnQpIHtcblx0XHRcdHRocm93IHByb207XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNyZWF0ZUVsZW1lbnQoY29tcG9uZW50LCBwcm9wcyk7XG5cdH1cblxuXHRMYXp5LmRpc3BsYXlOYW1lID0gJ0xhenknO1xuXHRMYXp5Ll9mb3J3YXJkZWQgPSB0cnVlO1xuXHRyZXR1cm4gTGF6eTtcbn1cbiIsICJpbXBvcnQgeyBDb21wb25lbnQsIHRvQ2hpbGRBcnJheSB9IGZyb20gJ3ByZWFjdCc7XG5pbXBvcnQgeyBzdXNwZW5kZWQgfSBmcm9tICcuL3N1c3BlbnNlLmpzJztcblxuLy8gSW5kZXhlcyB0byBsaW5rZWQgbGlzdCBub2RlcyAobm9kZXMgYXJlIHN0b3JlZCBhcyBhcnJheXMgdG8gc2F2ZSBieXRlcykuXG5jb25zdCBTVVNQRU5ERURfQ09VTlQgPSAwO1xuY29uc3QgUkVTT0xWRURfQ09VTlQgPSAxO1xuY29uc3QgTkVYVF9OT0RFID0gMjtcblxuLy8gSGF2aW5nIGN1c3RvbSBpbmhlcml0YW5jZSBpbnN0ZWFkIG9mIGEgY2xhc3MgaGVyZSBzYXZlcyBhIGxvdCBvZiBieXRlcy5cbmV4cG9ydCBmdW5jdGlvbiBTdXNwZW5zZUxpc3QoKSB7XG5cdHRoaXMuX25leHQgPSBudWxsO1xuXHR0aGlzLl9tYXAgPSBudWxsO1xufVxuXG4vLyBNYXJrIG9uZSBvZiBjaGlsZCdzIGVhcmxpZXIgc3VzcGVuc2lvbnMgYXMgcmVzb2x2ZWQuXG4vLyBTb21lIHBlbmRpbmcgY2FsbGJhY2tzIG1heSBiZWNvbWUgY2FsbGFibGUgZHVlIHRvIHRoaXNcbi8vIChlLmcuIHRoZSBsYXN0IHN1c3BlbmRlZCBkZXNjZW5kYW50IGdldHMgcmVzb2x2ZWQgd2hlblxuLy8gcmV2ZWFsT3JkZXIgPT09ICd0b2dldGhlcicpLiBQcm9jZXNzIHRob3NlIGNhbGxiYWNrcyBhcyB3ZWxsLlxuY29uc3QgcmVzb2x2ZSA9IChsaXN0LCBjaGlsZCwgbm9kZSkgPT4ge1xuXHRpZiAoKytub2RlW1JFU09MVkVEX0NPVU5UXSA9PT0gbm9kZVtTVVNQRU5ERURfQ09VTlRdKSB7XG5cdFx0Ly8gVGhlIG51bWJlciBhIGNoaWxkIChvciBhbnkgb2YgaXRzIGRlc2NlbmRhbnRzKSBoYXMgYmVlbiBzdXNwZW5kZWRcblx0XHQvLyBtYXRjaGVzIHRoZSBudW1iZXIgb2YgdGltZXMgaXQncyBiZWVuIHJlc29sdmVkLiBUaGVyZWZvcmUgd2Vcblx0XHQvLyBtYXJrIHRoZSBjaGlsZCBhcyBjb21wbGV0ZWx5IHJlc29sdmVkIGJ5IGRlbGV0aW5nIGl0IGZyb20gLl9tYXAuXG5cdFx0Ly8gVGhpcyBpcyB1c2VkIHRvIGZpZ3VyZSBvdXQgd2hlbiAqYWxsKiBjaGlsZHJlbiBoYXZlIGJlZW4gY29tcGxldGVseVxuXHRcdC8vIHJlc29sdmVkIHdoZW4gcmV2ZWFsT3JkZXIgaXMgJ3RvZ2V0aGVyJy5cblx0XHRsaXN0Ll9tYXAuZGVsZXRlKGNoaWxkKTtcblx0fVxuXG5cdC8vIElmIHJldmVhbE9yZGVyIGlzIGZhbHN5IHRoZW4gd2UgY2FuIGRvIGFuIGVhcmx5IGV4aXQsIGFzIHRoZVxuXHQvLyBjYWxsYmFja3Mgd29uJ3QgZ2V0IHF1ZXVlZCBpbiB0aGUgbm9kZSBhbnl3YXkuXG5cdC8vIElmIHJldmVhbE9yZGVyIGlzICd0b2dldGhlcicgdGhlbiBhbHNvIGRvIGFuIGVhcmx5IGV4aXRcblx0Ly8gaWYgYWxsIHN1c3BlbmRlZCBkZXNjZW5kYW50cyBoYXZlIG5vdCB5ZXQgYmVlbiByZXNvbHZlZC5cblx0aWYgKFxuXHRcdCFsaXN0LnByb3BzLnJldmVhbE9yZGVyIHx8XG5cdFx0KGxpc3QucHJvcHMucmV2ZWFsT3JkZXJbMF0gPT09ICd0JyAmJiBsaXN0Ll9tYXAuc2l6ZSlcblx0KSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gV2FsayB0aGUgY3VycmVudGx5IHN1c3BlbmRlZCBjaGlsZHJlbiBpbiBvcmRlciwgY2FsbGluZyB0aGVpclxuXHQvLyBzdG9yZWQgY2FsbGJhY2tzIG9uIHRoZSB3YXkuIFN0b3AgaWYgd2UgZW5jb3VudGVyIGEgY2hpbGQgdGhhdFxuXHQvLyBoYXMgbm90IGJlZW4gY29tcGxldGVseSByZXNvbHZlZCB5ZXQuXG5cdG5vZGUgPSBsaXN0Ll9uZXh0O1xuXHR3aGlsZSAobm9kZSkge1xuXHRcdHdoaWxlIChub2RlLmxlbmd0aCA+IDMpIHtcblx0XHRcdG5vZGUucG9wKCkoKTtcblx0XHR9XG5cdFx0aWYgKG5vZGVbUkVTT0xWRURfQ09VTlRdIDwgbm9kZVtTVVNQRU5ERURfQ09VTlRdKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdFx0bGlzdC5fbmV4dCA9IG5vZGUgPSBub2RlW05FWFRfTk9ERV07XG5cdH1cbn07XG5cbi8vIFRoaW5ncyB3ZSBkbyBoZXJlIHRvIHNhdmUgc29tZSBieXRlcyBidXQgYXJlIG5vdCBwcm9wZXIgSlMgaW5oZXJpdGFuY2U6XG4vLyAtIGNhbGwgYG5ldyBDb21wb25lbnQoKWAgYXMgdGhlIHByb3RvdHlwZVxuLy8gLSBkbyBub3Qgc2V0IGBTdXNwZW5zZS5wcm90b3R5cGUuY29uc3RydWN0b3JgIHRvIGBTdXNwZW5zZWBcblN1c3BlbnNlTGlzdC5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50KCk7XG5cblN1c3BlbnNlTGlzdC5wcm90b3R5cGUuX3N1c3BlbmRlZCA9IGZ1bmN0aW9uKGNoaWxkKSB7XG5cdGNvbnN0IGxpc3QgPSB0aGlzO1xuXHRjb25zdCBkZWxlZ2F0ZWQgPSBzdXNwZW5kZWQobGlzdC5fdm5vZGUpO1xuXG5cdGxldCBub2RlID0gbGlzdC5fbWFwLmdldChjaGlsZCk7XG5cdG5vZGVbU1VTUEVOREVEX0NPVU5UXSsrO1xuXG5cdHJldHVybiB1bnN1c3BlbmQgPT4ge1xuXHRcdGNvbnN0IHdyYXBwZWRVbnN1c3BlbmQgPSAoKSA9PiB7XG5cdFx0XHRpZiAoIWxpc3QucHJvcHMucmV2ZWFsT3JkZXIpIHtcblx0XHRcdFx0Ly8gU3BlY2lhbCBjYXNlIHRoZSB1bmRlZmluZWQgKGZhbHN5KSByZXZlYWxPcmRlciwgYXMgdGhlcmVcblx0XHRcdFx0Ly8gaXMgbm8gbmVlZCB0byBjb29yZGluYXRlIGEgc3BlY2lmaWMgb3JkZXIgb3IgdW5zdXNwZW5kcy5cblx0XHRcdFx0dW5zdXNwZW5kKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRub2RlLnB1c2godW5zdXNwZW5kKTtcblx0XHRcdFx0cmVzb2x2ZShsaXN0LCBjaGlsZCwgbm9kZSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRpZiAoZGVsZWdhdGVkKSB7XG5cdFx0XHRkZWxlZ2F0ZWQod3JhcHBlZFVuc3VzcGVuZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdyYXBwZWRVbnN1c3BlbmQoKTtcblx0XHR9XG5cdH07XG59O1xuXG5TdXNwZW5zZUxpc3QucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uKHByb3BzKSB7XG5cdHRoaXMuX25leHQgPSBudWxsO1xuXHR0aGlzLl9tYXAgPSBuZXcgTWFwKCk7XG5cblx0Y29uc3QgY2hpbGRyZW4gPSB0b0NoaWxkQXJyYXkocHJvcHMuY2hpbGRyZW4pO1xuXHRpZiAocHJvcHMucmV2ZWFsT3JkZXIgJiYgcHJvcHMucmV2ZWFsT3JkZXJbMF0gPT09ICdiJykge1xuXHRcdC8vIElmIG9yZGVyID09PSAnYmFja3dhcmRzJyAob3IsIHdlbGwsIGFueXRoaW5nIHN0YXJ0aW5nIHdpdGggYSAnYicpXG5cdFx0Ly8gdGhlbiBmbGlwIHRoZSBjaGlsZCBsaXN0IGFyb3VuZCBzbyB0aGF0IHRoZSBsYXN0IGNoaWxkIHdpbGwgYmVcblx0XHQvLyB0aGUgZmlyc3QgaW4gdGhlIGxpbmtlZCBsaXN0LlxuXHRcdGNoaWxkcmVuLnJldmVyc2UoKTtcblx0fVxuXHQvLyBCdWlsZCB0aGUgbGlua2VkIGxpc3QuIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY2hpbGRyZW4gaW4gcmV2ZXJzZSBvcmRlclxuXHQvLyBzbyB0aGF0IGBfbmV4dGAgcG9pbnRzIHRvIHRoZSBmaXJzdCBsaW5rZWQgbGlzdCBub2RlIHRvIGJlIHJlc29sdmVkLlxuXHRmb3IgKGxldCBpID0gY2hpbGRyZW4ubGVuZ3RoOyBpLS07ICkge1xuXHRcdC8vIENyZWF0ZSBhIG5ldyBsaW5rZWQgbGlzdCBub2RlIGFzIGFuIGFycmF5IG9mIGZvcm06XG5cdFx0Ly8gXHRbc3VzcGVuZGVkX2NvdW50LCByZXNvbHZlZF9jb3VudCwgbmV4dF9ub2RlXVxuXHRcdC8vIHdoZXJlIHN1c3BlbmRlZF9jb3VudCBhbmQgcmVzb2x2ZWRfY291bnQgYXJlIG51bWVyaWMgY291bnRlcnMgZm9yXG5cdFx0Ly8ga2VlcGluZyB0cmFjayBob3cgbWFueSB0aW1lcyBhIG5vZGUgaGFzIGJlZW4gc3VzcGVuZGVkIGFuZCByZXNvbHZlZC5cblx0XHQvL1xuXHRcdC8vIE5vdGUgdGhhdCBzdXNwZW5kZWRfY291bnQgc3RhcnRzIGZyb20gMSBpbnN0ZWFkIG9mIDAsIHNvIHdlIGNhbiBibG9ja1xuXHRcdC8vIHByb2Nlc3NpbmcgY2FsbGJhY2tzIHVudGlsIGNvbXBvbmVudERpZE1vdW50IGhhcyBiZWVuIGNhbGxlZC4gSW4gYSBzZW5zZVxuXHRcdC8vIG5vZGUgaXMgc3VzcGVuZGVkIGF0IGxlYXN0IHVudGlsIGNvbXBvbmVudERpZE1vdW50IGdldHMgY2FsbGVkIVxuXHRcdC8vXG5cdFx0Ly8gUGVuZGluZyBjYWxsYmFja3MgYXJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIG5vZGU6XG5cdFx0Ly8gXHRbc3VzcGVuZGVkX2NvdW50LCByZXNvbHZlZF9jb3VudCwgbmV4dF9ub2RlLCBjYWxsYmFja18wLCBjYWxsYmFja18xLCAuLi5dXG5cdFx0dGhpcy5fbWFwLnNldChjaGlsZHJlbltpXSwgKHRoaXMuX25leHQgPSBbMSwgMCwgdGhpcy5fbmV4dF0pKTtcblx0fVxuXHRyZXR1cm4gcHJvcHMuY2hpbGRyZW47XG59O1xuXG5TdXNwZW5zZUxpc3QucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IFN1c3BlbnNlTGlzdC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbigpIHtcblx0Ly8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBjaGlsZHJlbiBhZnRlciBtb3VudGluZyBmb3IgdHdvIHJlYXNvbnM6XG5cdC8vIDEuIEFzIGVhY2ggbm9kZVtTVVNQRU5ERURfQ09VTlRdIHN0YXJ0cyBmcm9tIDEsIHRoaXMgaXRlcmF0aW9uIGluY3JlYXNlc1xuXHQvLyAgICBlYWNoIG5vZGVbUkVMRUFTRURfQ09VTlRdIGJ5IDEsIHRoZXJlZm9yZSBiYWxhbmNpbmcgdGhlIGNvdW50ZXJzLlxuXHQvLyAgICBUaGUgbm9kZXMgY2FuIG5vdyBiZSBjb21wbGV0ZWx5IGNvbnN1bWVkIGZyb20gdGhlIGxpbmtlZCBsaXN0LlxuXHQvLyAyLiBIYW5kbGUgbm9kZXMgdGhhdCBtaWdodCBoYXZlIGdvdHRlbiByZXNvbHZlZCBiZXR3ZWVuIHJlbmRlciBhbmRcblx0Ly8gICAgY29tcG9uZW50RGlkTW91bnQuXG5cdHRoaXMuX21hcC5mb3JFYWNoKChub2RlLCBjaGlsZCkgPT4ge1xuXHRcdHJlc29sdmUodGhpcywgY2hpbGQsIG5vZGUpO1xuXHR9KTtcbn07XG4iLCAiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgcmVuZGVyIH0gZnJvbSAncHJlYWN0JztcblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vLi4vc3JjL2luZGV4JykuUmVuZGVyYWJsZVByb3BzPHsgY29udGV4dDogYW55IH0+fSBwcm9wc1xuICovXG5mdW5jdGlvbiBDb250ZXh0UHJvdmlkZXIocHJvcHMpIHtcblx0dGhpcy5nZXRDaGlsZENvbnRleHQgPSAoKSA9PiBwcm9wcy5jb250ZXh0O1xuXHRyZXR1cm4gcHJvcHMuY2hpbGRyZW47XG59XG5cbi8qKlxuICogUG9ydGFsIGNvbXBvbmVudFxuICogQHRoaXMge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbXBvbmVudH1cbiAqIEBwYXJhbSB7b2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZH0gcHJvcHNcbiAqXG4gKiBUT0RPOiB1c2UgY3JlYXRlUm9vdCgpIGluc3RlYWQgb2YgZmFrZSByb290XG4gKi9cbmZ1bmN0aW9uIFBvcnRhbChwcm9wcykge1xuXHRjb25zdCBfdGhpcyA9IHRoaXM7XG5cdGxldCBjb250YWluZXIgPSBwcm9wcy5fY29udGFpbmVyO1xuXG5cdF90aGlzLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmVuZGVyKG51bGwsIF90aGlzLl90ZW1wKTtcblx0XHRfdGhpcy5fdGVtcCA9IG51bGw7XG5cdFx0X3RoaXMuX2NvbnRhaW5lciA9IG51bGw7XG5cdH07XG5cblx0Ly8gV2hlbiB3ZSBjaGFuZ2UgY29udGFpbmVyIHdlIHNob3VsZCBjbGVhciBvdXIgb2xkIGNvbnRhaW5lciBhbmRcblx0Ly8gaW5kaWNhdGUgYSBuZXcgbW91bnQuXG5cdGlmIChfdGhpcy5fY29udGFpbmVyICYmIF90aGlzLl9jb250YWluZXIgIT09IGNvbnRhaW5lcikge1xuXHRcdF90aGlzLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG5cdH1cblxuXHQvLyBXaGVuIHByb3BzLnZub2RlIGlzIHVuZGVmaW5lZC9mYWxzZS9udWxsIHdlIGFyZSBkZWFsaW5nIHdpdGggc29tZSBraW5kIG9mXG5cdC8vIGNvbmRpdGlvbmFsIHZub2RlLiBUaGlzIHNob3VsZCBub3QgdHJpZ2dlciBhIHJlbmRlci5cblx0aWYgKHByb3BzLl92bm9kZSkge1xuXHRcdGlmICghX3RoaXMuX3RlbXApIHtcblx0XHRcdF90aGlzLl9jb250YWluZXIgPSBjb250YWluZXI7XG5cblx0XHRcdC8vIENyZWF0ZSBhIGZha2UgRE9NIHBhcmVudCBub2RlIHRoYXQgbWFuYWdlcyBhIHN1YnNldCBvZiBgY29udGFpbmVyYCdzIGNoaWxkcmVuOlxuXHRcdFx0X3RoaXMuX3RlbXAgPSB7XG5cdFx0XHRcdG5vZGVUeXBlOiAxLFxuXHRcdFx0XHRwYXJlbnROb2RlOiBjb250YWluZXIsXG5cdFx0XHRcdGNoaWxkTm9kZXM6IFtdLFxuXHRcdFx0XHRhcHBlbmRDaGlsZChjaGlsZCkge1xuXHRcdFx0XHRcdHRoaXMuY2hpbGROb2Rlcy5wdXNoKGNoaWxkKTtcblx0XHRcdFx0XHRfdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKGNoaWxkKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0aW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmUpIHtcblx0XHRcdFx0XHR0aGlzLmNoaWxkTm9kZXMucHVzaChjaGlsZCk7XG5cdFx0XHRcdFx0X3RoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZChjaGlsZCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJlbW92ZUNoaWxkKGNoaWxkKSB7XG5cdFx0XHRcdFx0dGhpcy5jaGlsZE5vZGVzLnNwbGljZSh0aGlzLmNoaWxkTm9kZXMuaW5kZXhPZihjaGlsZCkgPj4+IDEsIDEpO1xuXHRcdFx0XHRcdF90aGlzLl9jb250YWluZXIucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIFJlbmRlciBvdXIgd3JhcHBpbmcgZWxlbWVudCBpbnRvIHRlbXAuXG5cdFx0cmVuZGVyKFxuXHRcdFx0Y3JlYXRlRWxlbWVudChDb250ZXh0UHJvdmlkZXIsIHsgY29udGV4dDogX3RoaXMuY29udGV4dCB9LCBwcm9wcy5fdm5vZGUpLFxuXHRcdFx0X3RoaXMuX3RlbXBcblx0XHQpO1xuXHR9XG5cdC8vIFdoZW4gd2UgY29tZSBmcm9tIGEgY29uZGl0aW9uYWwgcmVuZGVyLCBvbiBhIG1vdW50ZWRcblx0Ly8gcG9ydGFsIHdlIHNob3VsZCBjbGVhciB0aGUgRE9NLlxuXHRlbHNlIGlmIChfdGhpcy5fdGVtcCkge1xuXHRcdF90aGlzLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG5cdH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgUG9ydGFsYCB0byBjb250aW51ZSByZW5kZXJpbmcgdGhlIHZub2RlIHRyZWUgYXQgYSBkaWZmZXJlbnQgRE9NIG5vZGVcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9IHZub2RlIFRoZSB2bm9kZSB0byByZW5kZXJcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuUHJlYWN0RWxlbWVudH0gY29udGFpbmVyIFRoZSBET00gbm9kZSB0byBjb250aW51ZSByZW5kZXJpbmcgaW4gdG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQb3J0YWwodm5vZGUsIGNvbnRhaW5lcikge1xuXHRjb25zdCBlbCA9IGNyZWF0ZUVsZW1lbnQoUG9ydGFsLCB7IF92bm9kZTogdm5vZGUsIF9jb250YWluZXI6IGNvbnRhaW5lciB9KTtcblx0ZWwuY29udGFpbmVySW5mbyA9IGNvbnRhaW5lcjtcblx0cmV0dXJuIGVsO1xufVxuIiwgImltcG9ydCB7XG5cdHJlbmRlciBhcyBwcmVhY3RSZW5kZXIsXG5cdGh5ZHJhdGUgYXMgcHJlYWN0SHlkcmF0ZSxcblx0b3B0aW9ucyxcblx0dG9DaGlsZEFycmF5LFxuXHRDb21wb25lbnRcbn0gZnJvbSAncHJlYWN0JztcblxuZXhwb3J0IGNvbnN0IFJFQUNUX0VMRU1FTlRfVFlQRSA9XG5cdCh0eXBlb2YgU3ltYm9sICE9ICd1bmRlZmluZWQnICYmIFN5bWJvbC5mb3IgJiYgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpKSB8fFxuXHQweGVhYzc7XG5cbmNvbnN0IENBTUVMX1BST1BTID0gL14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxtYXJrZXIoPyFIfFd8VSl8b3ZlcmxpbmV8cGFpbnR8c3RvcHxzdHJpa2V0aHJvdWdofHN0cm9rZXx0ZXh0KD8hTCl8dW5kZXJsaW5lfHVuaWNvZGV8dW5pdHN8dnx2ZWN0b3J8dmVydHx3b3JkfHdyaXRpbmd8eCg/IUMpKVtBLVpdLztcblxuY29uc3QgSVNfRE9NID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcblxuLy8gSW5wdXQgdHlwZXMgZm9yIHdoaWNoIG9uY2hhbmdlIHNob3VsZCBub3QgYmUgY29udmVydGVkIHRvIG9uaW5wdXQuXG4vLyB0eXBlPVwiZmlsZXxjaGVja2JveHxyYWRpb1wiLCBwbHVzIFwicmFuZ2VcIiBpbiBJRTExLlxuLy8gKElFMTEgZG9lc24ndCBzdXBwb3J0IFN5bWJvbCwgd2hpY2ggd2UgdXNlIGhlcmUgdG8gdHVybiBgcmFkYCBpbnRvIGByYWAgd2hpY2ggbWF0Y2hlcyBcInJhbmdlXCIpXG5jb25zdCBvbkNoYW5nZUlucHV0VHlwZSA9IHR5cGUgPT5cblx0KHR5cGVvZiBTeW1ib2wgIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFN5bWJvbCgpID09ICdzeW1ib2wnXG5cdFx0PyAvZmlsfGNoZXxyYWQvaVxuXHRcdDogL2ZpbHxjaGV8cmEvaVxuXHQpLnRlc3QodHlwZSk7XG5cbi8vIFNvbWUgbGlicmFyaWVzIGxpa2UgYHJlYWN0LXZpcnR1YWxpemVkYCBleHBsaWNpdGx5IGNoZWNrIGZvciB0aGlzLlxuQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307XG5cbi8vIGBVTlNBRkVfKmAgbGlmZWN5Y2xlIGhvb2tzXG4vLyBQcmVhY3Qgb25seSBldmVyIGludm9rZXMgdGhlIHVucHJlZml4ZWQgbWV0aG9kcy5cbi8vIEhlcmUgd2UgcHJvdmlkZSBhIGJhc2UgXCJmYWxsYmFja1wiIGltcGxlbWVudGF0aW9uIHRoYXQgY2FsbHMgYW55IGRlZmluZWQgVU5TQUZFXyBwcmVmaXhlZCBtZXRob2QuXG4vLyAtIElmIGEgY29tcG9uZW50IGRlZmluZXMgaXRzIG93biBgY29tcG9uZW50RGlkTW91bnQoKWAgKGluY2x1ZGluZyB2aWEgZGVmaW5lUHJvcGVydHkpLCB1c2UgdGhhdC5cbi8vIC0gSWYgYSBjb21wb25lbnQgZGVmaW5lcyBgVU5TQUZFX2NvbXBvbmVudERpZE1vdW50KClgLCBgY29tcG9uZW50RGlkTW91bnRgIGlzIHRoZSBhbGlhcyBnZXR0ZXIvc2V0dGVyLlxuLy8gLSBJZiBhbnl0aGluZyBhc3NpZ25zIHRvIGFuIGBVTlNBRkVfKmAgcHJvcGVydHksIHRoZSBhc3NpZ25tZW50IGlzIGZvcndhcmRlZCB0byB0aGUgdW5wcmVmaXhlZCBwcm9wZXJ0eS5cbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJlYWN0anMvcHJlYWN0L2lzc3Vlcy8xOTQxXG5bXG5cdCdjb21wb25lbnRXaWxsTW91bnQnLFxuXHQnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcycsXG5cdCdjb21wb25lbnRXaWxsVXBkYXRlJ1xuXS5mb3JFYWNoKGtleSA9PiB7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnQucHJvdG90eXBlLCBrZXksIHtcblx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHRoaXNbJ1VOU0FGRV8nICsga2V5XTtcblx0XHR9LFxuXHRcdHNldCh2KSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCB7XG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0d3JpdGFibGU6IHRydWUsXG5cdFx0XHRcdHZhbHVlOiB2XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0pO1xufSk7XG5cbi8qKlxuICogUHJveHkgcmVuZGVyKCkgc2luY2UgUmVhY3QgcmV0dXJucyBhIENvbXBvbmVudCByZWZlcmVuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlZOb2RlfSB2bm9kZSBWTm9kZSB0cmVlIHRvIHJlbmRlclxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBwYXJlbnQgRE9NIG5vZGUgdG8gcmVuZGVyIHZub2RlIHRyZWUgaW50b1xuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBbY2FsbGJhY2tdIE9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgcmVuZGVyaW5nXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50IHwgbnVsbH0gVGhlIHJvb3QgY29tcG9uZW50IHJlZmVyZW5jZSBvciBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXIodm5vZGUsIHBhcmVudCwgY2FsbGJhY2spIHtcblx0Ly8gUmVhY3QgZGVzdHJveXMgYW55IGV4aXN0aW5nIERPTSBub2Rlcywgc2VlICMxNzI3XG5cdC8vIC4uLmJ1dCBvbmx5IG9uIHRoZSBmaXJzdCByZW5kZXIsIHNlZSAjMTgyOFxuXHRpZiAocGFyZW50Ll9jaGlsZHJlbiA9PSBudWxsKSB7XG5cdFx0cGFyZW50LnRleHRDb250ZW50ID0gJyc7XG5cdH1cblxuXHRwcmVhY3RSZW5kZXIodm5vZGUsIHBhcmVudCk7XG5cdGlmICh0eXBlb2YgY2FsbGJhY2sgPT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2soKTtcblxuXHRyZXR1cm4gdm5vZGUgPyB2bm9kZS5fY29tcG9uZW50IDogbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGUodm5vZGUsIHBhcmVudCwgY2FsbGJhY2spIHtcblx0cHJlYWN0SHlkcmF0ZSh2bm9kZSwgcGFyZW50KTtcblx0aWYgKHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nKSBjYWxsYmFjaygpO1xuXG5cdHJldHVybiB2bm9kZSA/IHZub2RlLl9jb21wb25lbnQgOiBudWxsO1xufVxuXG5sZXQgb2xkRXZlbnRIb29rID0gb3B0aW9ucy5ldmVudDtcbm9wdGlvbnMuZXZlbnQgPSBlID0+IHtcblx0aWYgKG9sZEV2ZW50SG9vaykgZSA9IG9sZEV2ZW50SG9vayhlKTtcblx0ZS5wZXJzaXN0ID0gZW1wdHk7XG5cdGUuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBpc1Byb3BhZ2F0aW9uU3RvcHBlZDtcblx0ZS5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBpc0RlZmF1bHRQcmV2ZW50ZWQ7XG5cdHJldHVybiAoZS5uYXRpdmVFdmVudCA9IGUpO1xufTtcblxuZnVuY3Rpb24gZW1wdHkoKSB7fVxuXG5mdW5jdGlvbiBpc1Byb3BhZ2F0aW9uU3RvcHBlZCgpIHtcblx0cmV0dXJuIHRoaXMuY2FuY2VsQnViYmxlO1xufVxuXG5mdW5jdGlvbiBpc0RlZmF1bHRQcmV2ZW50ZWQoKSB7XG5cdHJldHVybiB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ7XG59XG5cbmxldCBjbGFzc05hbWVEZXNjcmlwdG9yID0ge1xuXHRjb25maWd1cmFibGU6IHRydWUsXG5cdGdldCgpIHtcblx0XHRyZXR1cm4gdGhpcy5jbGFzcztcblx0fVxufTtcblxubGV0IG9sZFZOb2RlSG9vayA9IG9wdGlvbnMudm5vZGU7XG5vcHRpb25zLnZub2RlID0gdm5vZGUgPT4ge1xuXHRsZXQgdHlwZSA9IHZub2RlLnR5cGU7XG5cdGxldCBwcm9wcyA9IHZub2RlLnByb3BzO1xuXHRsZXQgbm9ybWFsaXplZFByb3BzID0gcHJvcHM7XG5cblx0Ly8gb25seSBub3JtYWxpemUgcHJvcHMgb24gRWxlbWVudCBub2Rlc1xuXHRpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG5cdFx0Y29uc3Qgbm9uQ3VzdG9tRWxlbWVudCA9IHR5cGUuaW5kZXhPZignLScpID09PSAtMTtcblx0XHRub3JtYWxpemVkUHJvcHMgPSB7fTtcblxuXHRcdGZvciAobGV0IGkgaW4gcHJvcHMpIHtcblx0XHRcdGxldCB2YWx1ZSA9IHByb3BzW2ldO1xuXG5cdFx0XHRpZiAoSVNfRE9NICYmIGkgPT09ICdjaGlsZHJlbicgJiYgdHlwZSA9PT0gJ25vc2NyaXB0Jykge1xuXHRcdFx0XHQvLyBFbXVsYXRlIFJlYWN0J3MgYmVoYXZpb3Igb2Ygbm90IHJlbmRlcmluZyB0aGUgY29udGVudHMgb2Ygbm9zY3JpcHQgdGFncyBvbiB0aGUgY2xpZW50LlxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH0gZWxzZSBpZiAoaSA9PT0gJ3ZhbHVlJyAmJiAnZGVmYXVsdFZhbHVlJyBpbiBwcm9wcyAmJiB2YWx1ZSA9PSBudWxsKSB7XG5cdFx0XHRcdC8vIFNraXAgYXBwbHlpbmcgdmFsdWUgaWYgaXQgaXMgbnVsbC91bmRlZmluZWQgYW5kIHdlIGFscmVhZHkgc2V0XG5cdFx0XHRcdC8vIGEgZGVmYXVsdCB2YWx1ZVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdGkgPT09ICdkZWZhdWx0VmFsdWUnICYmXG5cdFx0XHRcdCd2YWx1ZScgaW4gcHJvcHMgJiZcblx0XHRcdFx0cHJvcHMudmFsdWUgPT0gbnVsbFxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIGBkZWZhdWx0VmFsdWVgIGlzIHRyZWF0ZWQgYXMgYSBmYWxsYmFjayBgdmFsdWVgIHdoZW4gYSB2YWx1ZSBwcm9wIGlzIHByZXNlbnQgYnV0IG51bGwvdW5kZWZpbmVkLlxuXHRcdFx0XHQvLyBgZGVmYXVsdFZhbHVlYCBmb3IgRWxlbWVudHMgd2l0aCBubyB2YWx1ZSBwcm9wIGlzIHRoZSBzYW1lIGFzIHRoZSBET00gZGVmYXVsdFZhbHVlIHByb3BlcnR5LlxuXHRcdFx0XHRpID0gJ3ZhbHVlJztcblx0XHRcdH0gZWxzZSBpZiAoaSA9PT0gJ2Rvd25sb2FkJyAmJiB2YWx1ZSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHQvLyBDYWxsaW5nIGBzZXRBdHRyaWJ1dGVgIHdpdGggYSB0cnV0aHkgdmFsdWUgd2lsbCBsZWFkIHRvIGl0IGJlaW5nXG5cdFx0XHRcdC8vIHBhc3NlZCBhcyBhIHN0cmluZ2lmaWVkIHZhbHVlLCBlLmcuIGBkb3dubG9hZD1cInRydWVcImAuIFJlYWN0XG5cdFx0XHRcdC8vIGNvbnZlcnRzIGl0IHRvIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkLCBvdGhlcndpc2UgdGhlIGF0dHJpYnV0ZVxuXHRcdFx0XHQvLyB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgdGhlIGZpbGUgbmFtZSBhbmQgdGhlIGZpbGUgd2lsbCBiZSBjYWxsZWRcblx0XHRcdFx0Ly8gXCJ0cnVlXCIgdXBvbiBkb3dubG9hZGluZyBpdC5cblx0XHRcdFx0dmFsdWUgPSAnJztcblx0XHRcdH0gZWxzZSBpZiAoL29uZG91YmxlY2xpY2svaS50ZXN0KGkpKSB7XG5cdFx0XHRcdGkgPSAnb25kYmxjbGljayc7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHQvXm9uY2hhbmdlKHRleHRhcmVhfGlucHV0KS9pLnRlc3QoaSArIHR5cGUpICYmXG5cdFx0XHRcdCFvbkNoYW5nZUlucHV0VHlwZShwcm9wcy50eXBlKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGkgPSAnb25pbnB1dCc7XG5cdFx0XHR9IGVsc2UgaWYgKC9eb25mb2N1cyQvaS50ZXN0KGkpKSB7XG5cdFx0XHRcdGkgPSAnb25mb2N1c2luJztcblx0XHRcdH0gZWxzZSBpZiAoL15vbmJsdXIkL2kudGVzdChpKSkge1xuXHRcdFx0XHRpID0gJ29uZm9jdXNvdXQnO1xuXHRcdFx0fSBlbHNlIGlmICgvXm9uKEFuaXxUcmF8VG91fEJlZm9yZUlucHxDb21wbykvLnRlc3QoaSkpIHtcblx0XHRcdFx0aSA9IGkudG9Mb3dlckNhc2UoKTtcblx0XHRcdH0gZWxzZSBpZiAobm9uQ3VzdG9tRWxlbWVudCAmJiBDQU1FTF9QUk9QUy50ZXN0KGkpKSB7XG5cdFx0XHRcdGkgPSBpLnJlcGxhY2UoL1tBLVowLTldLywgJy0kJicpLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHR9IGVsc2UgaWYgKHZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdHZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgc3VwcG9ydCBmb3Igb25JbnB1dCBhbmQgb25DaGFuZ2UsIHNlZSAjMzU2MVxuXHRcdFx0Ly8gaWYgd2UgaGF2ZSBhbiBvbmlucHV0IHByb3AgYWxyZWFkeSBjaGFuZ2UgaXQgdG8gb25pbnB1dENhcHR1cmVcblx0XHRcdGlmICgvXm9uaW5wdXQvaS50ZXN0KGkpKSB7XG5cdFx0XHRcdGkgPSBpLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdGlmIChub3JtYWxpemVkUHJvcHNbaV0pIHtcblx0XHRcdFx0XHRpID0gJ29uaW5wdXRDYXB0dXJlJztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRub3JtYWxpemVkUHJvcHNbaV0gPSB2YWx1ZTtcblx0XHR9XG5cblx0XHQvLyBBZGQgc3VwcG9ydCBmb3IgYXJyYXkgc2VsZWN0IHZhbHVlczogPHNlbGVjdCBtdWx0aXBsZSB2YWx1ZT17W119IC8+XG5cdFx0aWYgKFxuXHRcdFx0dHlwZSA9PSAnc2VsZWN0JyAmJlxuXHRcdFx0bm9ybWFsaXplZFByb3BzLm11bHRpcGxlICYmXG5cdFx0XHRBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWRQcm9wcy52YWx1ZSlcblx0XHQpIHtcblx0XHRcdC8vIGZvckVhY2goKSBhbHdheXMgcmV0dXJucyB1bmRlZmluZWQsIHdoaWNoIHdlIGFidXNlIGhlcmUgdG8gdW5zZXQgdGhlIHZhbHVlIHByb3AuXG5cdFx0XHRub3JtYWxpemVkUHJvcHMudmFsdWUgPSB0b0NoaWxkQXJyYXkocHJvcHMuY2hpbGRyZW4pLmZvckVhY2goY2hpbGQgPT4ge1xuXHRcdFx0XHRjaGlsZC5wcm9wcy5zZWxlY3RlZCA9XG5cdFx0XHRcdFx0bm9ybWFsaXplZFByb3BzLnZhbHVlLmluZGV4T2YoY2hpbGQucHJvcHMudmFsdWUpICE9IC0xO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkaW5nIHN1cHBvcnQgZm9yIGRlZmF1bHRWYWx1ZSBpbiBzZWxlY3QgdGFnXG5cdFx0aWYgKHR5cGUgPT0gJ3NlbGVjdCcgJiYgbm9ybWFsaXplZFByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRub3JtYWxpemVkUHJvcHMudmFsdWUgPSB0b0NoaWxkQXJyYXkocHJvcHMuY2hpbGRyZW4pLmZvckVhY2goY2hpbGQgPT4ge1xuXHRcdFx0XHRpZiAobm9ybWFsaXplZFByb3BzLm11bHRpcGxlKSB7XG5cdFx0XHRcdFx0Y2hpbGQucHJvcHMuc2VsZWN0ZWQgPVxuXHRcdFx0XHRcdFx0bm9ybWFsaXplZFByb3BzLmRlZmF1bHRWYWx1ZS5pbmRleE9mKGNoaWxkLnByb3BzLnZhbHVlKSAhPSAtMTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjaGlsZC5wcm9wcy5zZWxlY3RlZCA9XG5cdFx0XHRcdFx0XHRub3JtYWxpemVkUHJvcHMuZGVmYXVsdFZhbHVlID09IGNoaWxkLnByb3BzLnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHR2bm9kZS5wcm9wcyA9IG5vcm1hbGl6ZWRQcm9wcztcblxuXHRcdGlmIChwcm9wcy5jbGFzcyAhPSBwcm9wcy5jbGFzc05hbWUpIHtcblx0XHRcdGNsYXNzTmFtZURlc2NyaXB0b3IuZW51bWVyYWJsZSA9ICdjbGFzc05hbWUnIGluIHByb3BzO1xuXHRcdFx0aWYgKHByb3BzLmNsYXNzTmFtZSAhPSBudWxsKSBub3JtYWxpemVkUHJvcHMuY2xhc3MgPSBwcm9wcy5jbGFzc05hbWU7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobm9ybWFsaXplZFByb3BzLCAnY2xhc3NOYW1lJywgY2xhc3NOYW1lRGVzY3JpcHRvcik7XG5cdFx0fVxuXHR9XG5cblx0dm5vZGUuJCR0eXBlb2YgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG5cblx0aWYgKG9sZFZOb2RlSG9vaykgb2xkVk5vZGVIb29rKHZub2RlKTtcbn07XG5cbi8vIE9ubHkgbmVlZGVkIGZvciByZWFjdC1yZWxheVxubGV0IGN1cnJlbnRDb21wb25lbnQ7XG5jb25zdCBvbGRCZWZvcmVSZW5kZXIgPSBvcHRpb25zLl9yZW5kZXI7XG5vcHRpb25zLl9yZW5kZXIgPSBmdW5jdGlvbih2bm9kZSkge1xuXHRpZiAob2xkQmVmb3JlUmVuZGVyKSB7XG5cdFx0b2xkQmVmb3JlUmVuZGVyKHZub2RlKTtcblx0fVxuXHRjdXJyZW50Q29tcG9uZW50ID0gdm5vZGUuX2NvbXBvbmVudDtcbn07XG5cbi8vIFRoaXMgaXMgYSB2ZXJ5IHZlcnkgcHJpdmF0ZSBpbnRlcm5hbCBmdW5jdGlvbiBmb3IgUmVhY3QgaXRcbi8vIGlzIHVzZWQgdG8gc29ydC1vZiBkbyBydW50aW1lIGRlcGVuZGVuY3kgaW5qZWN0aW9uLiBTbyBmYXJcbi8vIG9ubHkgYHJlYWN0LXJlbGF5YCBtYWtlcyB1c2Ugb2YgaXQuIEl0IHVzZXMgaXQgdG8gcmVhZCB0aGVcbi8vIGNvbnRleHQgdmFsdWUuXG5leHBvcnQgY29uc3QgX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSB7XG5cdFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IHtcblx0XHRjdXJyZW50OiB7XG5cdFx0XHRyZWFkQ29udGV4dChjb250ZXh0KSB7XG5cdFx0XHRcdHJldHVybiBjdXJyZW50Q29tcG9uZW50Ll9nbG9iYWxDb250ZXh0W2NvbnRleHQuX2lkXS5wcm9wcy52YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG4iLCAiaW1wb3J0IHtcblx0Y3JlYXRlRWxlbWVudCxcblx0cmVuZGVyIGFzIHByZWFjdFJlbmRlcixcblx0Y2xvbmVFbGVtZW50IGFzIHByZWFjdENsb25lRWxlbWVudCxcblx0Y3JlYXRlUmVmLFxuXHRDb21wb25lbnQsXG5cdGNyZWF0ZUNvbnRleHQsXG5cdEZyYWdtZW50XG59IGZyb20gJ3ByZWFjdCc7XG5pbXBvcnQge1xuXHR1c2VTdGF0ZSxcblx0dXNlUmVkdWNlcixcblx0dXNlRWZmZWN0LFxuXHR1c2VMYXlvdXRFZmZlY3QsXG5cdHVzZVJlZixcblx0dXNlSW1wZXJhdGl2ZUhhbmRsZSxcblx0dXNlTWVtbyxcblx0dXNlQ2FsbGJhY2ssXG5cdHVzZUNvbnRleHQsXG5cdHVzZURlYnVnVmFsdWVcbn0gZnJvbSAncHJlYWN0L2hvb2tzJztcbmltcG9ydCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICcuL1B1cmVDb21wb25lbnQnO1xuaW1wb3J0IHsgbWVtbyB9IGZyb20gJy4vbWVtbyc7XG5pbXBvcnQgeyBmb3J3YXJkUmVmIH0gZnJvbSAnLi9mb3J3YXJkUmVmJztcbmltcG9ydCB7IENoaWxkcmVuIH0gZnJvbSAnLi9DaGlsZHJlbic7XG5pbXBvcnQgeyBTdXNwZW5zZSwgbGF6eSB9IGZyb20gJy4vc3VzcGVuc2UnO1xuaW1wb3J0IHsgU3VzcGVuc2VMaXN0IH0gZnJvbSAnLi9zdXNwZW5zZS1saXN0JztcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJy4vcG9ydGFscyc7XG5pbXBvcnQge1xuXHRoeWRyYXRlLFxuXHRyZW5kZXIsXG5cdFJFQUNUX0VMRU1FTlRfVFlQRSxcblx0X19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRURcbn0gZnJvbSAnLi9yZW5kZXInO1xuXG5jb25zdCB2ZXJzaW9uID0gJzE3LjAuMic7IC8vIHRyaWNrIGxpYnJhcmllcyB0byB0aGluayB3ZSBhcmUgcmVhY3RcblxuLyoqXG4gKiBMZWdhY3kgdmVyc2lvbiBvZiBjcmVhdGVFbGVtZW50LlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5WTm9kZVtcInR5cGVcIl19IHR5cGUgVGhlIG5vZGUgbmFtZSBvciBDb21wb25lbnQgY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmFjdG9yeSh0eXBlKSB7XG5cdHJldHVybiBjcmVhdGVFbGVtZW50LmJpbmQobnVsbCwgdHlwZSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHBhc3NlZCBlbGVtZW50IGlzIGEgdmFsaWQgKHApcmVhY3Qgbm9kZS5cbiAqIEBwYXJhbSB7Kn0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KGVsZW1lbnQpIHtcblx0cmV0dXJuICEhZWxlbWVudCAmJiBlbGVtZW50LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5cbi8qKlxuICogV3JhcCBgY2xvbmVFbGVtZW50YCB0byBhYm9ydCBpZiB0aGUgcGFzc2VkIGVsZW1lbnQgaXMgbm90IGEgdmFsaWQgZWxlbWVudCBhbmQgYXBwbHlcbiAqIGFsbCB2bm9kZSBub3JtYWxpemF0aW9ucy5cbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9IGVsZW1lbnQgVGhlIHZub2RlIHRvIGNsb25lXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHMgUHJvcHMgdG8gYWRkIHdoZW4gY2xvbmluZ1xuICogQHBhcmFtIHtBcnJheTxpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnRDaGlsZHJlbj59IHJlc3QgT3B0aW9uYWwgY29tcG9uZW50IGNoaWxkcmVuXG4gKi9cbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50KSB7XG5cdGlmICghaXNWYWxpZEVsZW1lbnQoZWxlbWVudCkpIHJldHVybiBlbGVtZW50O1xuXHRyZXR1cm4gcHJlYWN0Q2xvbmVFbGVtZW50LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgY29tcG9uZW50IHRyZWUgZnJvbSB0aGUgRE9NLCBpbmNsdWRpbmcgc3RhdGUgYW5kIGV2ZW50IGhhbmRsZXJzLlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBjb250YWluZXJcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50QXROb2RlKGNvbnRhaW5lcikge1xuXHRpZiAoY29udGFpbmVyLl9jaGlsZHJlbikge1xuXHRcdHByZWFjdFJlbmRlcihudWxsLCBjb250YWluZXIpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG1hdGNoaW5nIERPTSBub2RlIGZvciBhIGNvbXBvbmVudFxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnR9IGNvbXBvbmVudFxuICogQHJldHVybnMge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlByZWFjdEVsZW1lbnQgfCBudWxsfVxuICovXG5mdW5jdGlvbiBmaW5kRE9NTm9kZShjb21wb25lbnQpIHtcblx0cmV0dXJuIChcblx0XHQoY29tcG9uZW50ICYmXG5cdFx0XHQoY29tcG9uZW50LmJhc2UgfHwgKGNvbXBvbmVudC5ub2RlVHlwZSA9PT0gMSAmJiBjb21wb25lbnQpKSkgfHxcblx0XHRudWxsXG5cdCk7XG59XG5cbi8qKlxuICogRGVwcmVjYXRlZCB3YXkgdG8gY29udHJvbCBiYXRjaGVkIHJlbmRlcmluZyBpbnNpZGUgdGhlIHJlY29uY2lsZXIsIGJ1dCB3ZVxuICogYWxyZWFkeSBzY2hlZHVsZSBpbiBiYXRjaGVzIGluc2lkZSBvdXIgcmVuZGVyaW5nIGNvZGVcbiAqIEB0ZW1wbGF0ZSBBcmdcbiAqIEBwYXJhbSB7KGFyZzogQXJnKSA9PiB2b2lkfSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzIHRoZSB1cGRhdGVkXG4gKiBAcGFyYW0ge0FyZ30gW2FyZ10gT3B0aW9uYWwgYXJndW1lbnQgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFja1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlXG5jb25zdCB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyA9IChjYWxsYmFjaywgYXJnKSA9PiBjYWxsYmFjayhhcmcpO1xuXG4vKipcbiAqIEluIFJlYWN0LCBgZmx1c2hTeW5jYCBmbHVzaGVzIHRoZSBlbnRpcmUgdHJlZSBhbmQgZm9yY2VzIGEgcmVyZW5kZXIuIEl0J3NcbiAqIGltcGxtZW50ZWQgaGVyZSBhcyBhIG5vLW9wLlxuICogQHRlbXBsYXRlIEFyZ1xuICogQHRlbXBsYXRlIFJlc3VsdFxuICogQHBhcmFtIHsoYXJnOiBBcmcpID0+IFJlc3VsdH0gY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBydW5zIGJlZm9yZSB0aGUgZmx1c2hcbiAqIEBwYXJhbSB7QXJnfSBbYXJnXSBPcHRpb25hbCBhcnVnbWVudCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrXG4gKiBAcmV0dXJuc1xuICovXG5jb25zdCBmbHVzaFN5bmMgPSAoY2FsbGJhY2ssIGFyZykgPT4gY2FsbGJhY2soYXJnKTtcblxuLyoqXG4gKiBTdHJpY3QgTW9kZSBpcyBub3QgaW1wbGVtZW50ZWQgaW4gUHJlYWN0LCBzbyB3ZSBwcm92aWRlIGEgc3RhbmQtaW4gZm9yIGl0XG4gKiB0aGF0IGp1c3QgcmVuZGVycyBpdHMgY2hpbGRyZW4gd2l0aG91dCBpbXBvc2luZyBhbnkgcmVzdHJpY3Rpb25zLlxuICovXG5jb25zdCBTdHJpY3RNb2RlID0gRnJhZ21lbnQ7XG5cbmV4cG9ydCAqIGZyb20gJ3ByZWFjdC9ob29rcyc7XG5leHBvcnQge1xuXHR2ZXJzaW9uLFxuXHRDaGlsZHJlbixcblx0cmVuZGVyLFxuXHRoeWRyYXRlLFxuXHR1bm1vdW50Q29tcG9uZW50QXROb2RlLFxuXHRjcmVhdGVQb3J0YWwsXG5cdGNyZWF0ZUVsZW1lbnQsXG5cdGNyZWF0ZUNvbnRleHQsXG5cdGNyZWF0ZUZhY3RvcnksXG5cdGNsb25lRWxlbWVudCxcblx0Y3JlYXRlUmVmLFxuXHRGcmFnbWVudCxcblx0aXNWYWxpZEVsZW1lbnQsXG5cdGZpbmRET01Ob2RlLFxuXHRDb21wb25lbnQsXG5cdFB1cmVDb21wb25lbnQsXG5cdG1lbW8sXG5cdGZvcndhcmRSZWYsXG5cdGZsdXNoU3luYyxcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNhbWVsY2FzZVxuXHR1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyxcblx0U3RyaWN0TW9kZSxcblx0U3VzcGVuc2UsXG5cdFN1c3BlbnNlTGlzdCxcblx0bGF6eSxcblx0X19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRURcbn07XG5cbi8vIFJlYWN0IGNvcGllcyB0aGUgbmFtZWQgZXhwb3J0cyB0byB0aGUgZGVmYXVsdCBvbmUuXG5leHBvcnQgZGVmYXVsdCB7XG5cdHVzZVN0YXRlLFxuXHR1c2VSZWR1Y2VyLFxuXHR1c2VFZmZlY3QsXG5cdHVzZUxheW91dEVmZmVjdCxcblx0dXNlUmVmLFxuXHR1c2VJbXBlcmF0aXZlSGFuZGxlLFxuXHR1c2VNZW1vLFxuXHR1c2VDYWxsYmFjayxcblx0dXNlQ29udGV4dCxcblx0dXNlRGVidWdWYWx1ZSxcblx0dmVyc2lvbixcblx0Q2hpbGRyZW4sXG5cdHJlbmRlcixcblx0aHlkcmF0ZSxcblx0dW5tb3VudENvbXBvbmVudEF0Tm9kZSxcblx0Y3JlYXRlUG9ydGFsLFxuXHRjcmVhdGVFbGVtZW50LFxuXHRjcmVhdGVDb250ZXh0LFxuXHRjcmVhdGVGYWN0b3J5LFxuXHRjbG9uZUVsZW1lbnQsXG5cdGNyZWF0ZVJlZixcblx0RnJhZ21lbnQsXG5cdGlzVmFsaWRFbGVtZW50LFxuXHRmaW5kRE9NTm9kZSxcblx0Q29tcG9uZW50LFxuXHRQdXJlQ29tcG9uZW50LFxuXHRtZW1vLFxuXHRmb3J3YXJkUmVmLFxuXHRmbHVzaFN5bmMsXG5cdHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzLFxuXHRTdHJpY3RNb2RlLFxuXHRTdXNwZW5zZSxcblx0U3VzcGVuc2VMaXN0LFxuXHRsYXp5LFxuXHRfX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRFxufTtcbiIsICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBEZWZhdWx0Q29udGV4dCA9IHtcbiAgY29sb3I6IHVuZGVmaW5lZCxcbiAgc2l6ZTogdW5kZWZpbmVkLFxuICBjbGFzc05hbWU6IHVuZGVmaW5lZCxcbiAgc3R5bGU6IHVuZGVmaW5lZCxcbiAgYXR0cjogdW5kZWZpbmVkXG59O1xuZXhwb3J0IHZhciBJY29uQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQgJiYgUmVhY3QuY3JlYXRlQ29udGV4dChEZWZhdWx0Q29udGV4dCk7IiwgInZhciBfX2Fzc2lnbiA9IHRoaXMgJiYgdGhpcy5fX2Fzc2lnbiB8fCBmdW5jdGlvbiAoKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodCkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSWNvbkNvbnRleHQsIERlZmF1bHRDb250ZXh0IH0gZnJvbSAnLi9pY29uQ29udGV4dCc7XG5cbmZ1bmN0aW9uIFRyZWUyRWxlbWVudCh0cmVlKSB7XG4gIHJldHVybiB0cmVlICYmIHRyZWUubWFwKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQobm9kZS50YWcsIF9fYXNzaWduKHtcbiAgICAgIGtleTogaVxuICAgIH0sIG5vZGUuYXR0ciksIFRyZWUyRWxlbWVudChub2RlLmNoaWxkKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gR2VuSWNvbihkYXRhKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChJY29uQmFzZSwgX19hc3NpZ24oe1xuICAgICAgYXR0cjogX19hc3NpZ24oe30sIGRhdGEuYXR0cilcbiAgICB9LCBwcm9wcyksIFRyZWUyRWxlbWVudChkYXRhLmNoaWxkKSk7XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gSWNvbkJhc2UocHJvcHMpIHtcbiAgdmFyIGVsZW0gPSBmdW5jdGlvbiAoY29uZikge1xuICAgIHZhciBhdHRyID0gcHJvcHMuYXR0cixcbiAgICAgICAgc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICAgIHRpdGxlID0gcHJvcHMudGl0bGUsXG4gICAgICAgIHN2Z1Byb3BzID0gX19yZXN0KHByb3BzLCBbXCJhdHRyXCIsIFwic2l6ZVwiLCBcInRpdGxlXCJdKTtcblxuICAgIHZhciBjb21wdXRlZFNpemUgPSBzaXplIHx8IGNvbmYuc2l6ZSB8fCBcIjFlbVwiO1xuICAgIHZhciBjbGFzc05hbWU7XG4gICAgaWYgKGNvbmYuY2xhc3NOYW1lKSBjbGFzc05hbWUgPSBjb25mLmNsYXNzTmFtZTtcbiAgICBpZiAocHJvcHMuY2xhc3NOYW1lKSBjbGFzc05hbWUgPSAoY2xhc3NOYW1lID8gY2xhc3NOYW1lICsgJyAnIDogJycpICsgcHJvcHMuY2xhc3NOYW1lO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9fYXNzaWduKHtcbiAgICAgIHN0cm9rZTogXCJjdXJyZW50Q29sb3JcIixcbiAgICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgICBzdHJva2VXaWR0aDogXCIwXCJcbiAgICB9LCBjb25mLmF0dHIsIGF0dHIsIHN2Z1Byb3BzLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgIHN0eWxlOiBfX2Fzc2lnbihfX2Fzc2lnbih7XG4gICAgICAgIGNvbG9yOiBwcm9wcy5jb2xvciB8fCBjb25mLmNvbG9yXG4gICAgICB9LCBjb25mLnN0eWxlKSwgcHJvcHMuc3R5bGUpLFxuICAgICAgaGVpZ2h0OiBjb21wdXRlZFNpemUsXG4gICAgICB3aWR0aDogY29tcHV0ZWRTaXplLFxuICAgICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgIH0pLCB0aXRsZSAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KFwidGl0bGVcIiwgbnVsbCwgdGl0bGUpLCBwcm9wcy5jaGlsZHJlbik7XG4gIH07XG5cbiAgcmV0dXJuIEljb25Db250ZXh0ICE9PSB1bmRlZmluZWQgPyBSZWFjdC5jcmVhdGVFbGVtZW50KEljb25Db250ZXh0LkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoY29uZikge1xuICAgIHJldHVybiBlbGVtKGNvbmYpO1xuICB9KSA6IGVsZW0oRGVmYXVsdENvbnRleHQpO1xufSIsICIvLyBUSElTIEZJTEUgSVMgQVVUTyBHRU5FUkFURURcbmltcG9ydCB7IEdlbkljb24gfSBmcm9tICcuLi9saWInO1xuZXhwb3J0IGZ1bmN0aW9uIEZpQWN0aXZpdHkgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIyMiAxMiAxOCAxMiAxNSAyMSA5IDMgNiAxMiAyIDEyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQWlycGxheSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk01IDE3SDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnYxMGEyIDIgMCAwIDEtMiAyaC0xXCJ9fSx7XCJ0YWdcIjpcInBvbHlnb25cIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjEyIDE1IDE3IDIxIDcgMjEgMTIgMTVcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlBbGVydENpcmNsZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCI4XCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCIxMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiMTZcIixcIngyXCI6XCIxMi4wMVwiLFwieTJcIjpcIjE2XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQWxlcnRPY3RhZ29uIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5Z29uXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCI3Ljg2IDIgMTYuMTQgMiAyMiA3Ljg2IDIyIDE2LjE0IDE2LjE0IDIyIDcuODYgMjIgMiAxNi4xNCAyIDcuODYgNy44NiAyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCI4XCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCIxMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiMTZcIixcIngyXCI6XCIxMi4wMVwiLFwieTJcIjpcIjE2XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQWxlcnRUcmlhbmdsZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xMC4yOSAzLjg2TDEuODIgMThhMiAyIDAgMCAwIDEuNzEgM2gxNi45NGEyIDIgMCAwIDAgMS43MS0zTDEzLjcxIDMuODZhMiAyIDAgMCAwLTMuNDIgMHpcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjlcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjEzXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIxN1wiLFwieDJcIjpcIjEyLjAxXCIsXCJ5MlwiOlwiMTdcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlBbGlnbkNlbnRlciAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxOFwiLFwieTFcIjpcIjEwXCIsXCJ4MlwiOlwiNlwiLFwieTJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMjFcIixcInkxXCI6XCI2XCIsXCJ4MlwiOlwiM1wiLFwieTJcIjpcIjZcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyMVwiLFwieTFcIjpcIjE0XCIsXCJ4MlwiOlwiM1wiLFwieTJcIjpcIjE0XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMThcIixcInkxXCI6XCIxOFwiLFwieDJcIjpcIjZcIixcInkyXCI6XCIxOFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUFsaWduSnVzdGlmeSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyMVwiLFwieTFcIjpcIjEwXCIsXCJ4MlwiOlwiM1wiLFwieTJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMjFcIixcInkxXCI6XCI2XCIsXCJ4MlwiOlwiM1wiLFwieTJcIjpcIjZcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyMVwiLFwieTFcIjpcIjE0XCIsXCJ4MlwiOlwiM1wiLFwieTJcIjpcIjE0XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMjFcIixcInkxXCI6XCIxOFwiLFwieDJcIjpcIjNcIixcInkyXCI6XCIxOFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUFsaWduTGVmdCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxN1wiLFwieTFcIjpcIjEwXCIsXCJ4MlwiOlwiM1wiLFwieTJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMjFcIixcInkxXCI6XCI2XCIsXCJ4MlwiOlwiM1wiLFwieTJcIjpcIjZcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyMVwiLFwieTFcIjpcIjE0XCIsXCJ4MlwiOlwiM1wiLFwieTJcIjpcIjE0XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTdcIixcInkxXCI6XCIxOFwiLFwieDJcIjpcIjNcIixcInkyXCI6XCIxOFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUFsaWduUmlnaHQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMjFcIixcInkxXCI6XCIxMFwiLFwieDJcIjpcIjdcIixcInkyXCI6XCIxMFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjIxXCIsXCJ5MVwiOlwiNlwiLFwieDJcIjpcIjNcIixcInkyXCI6XCI2XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMjFcIixcInkxXCI6XCIxNFwiLFwieDJcIjpcIjNcIixcInkyXCI6XCIxNFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjIxXCIsXCJ5MVwiOlwiMThcIixcIngyXCI6XCI3XCIsXCJ5MlwiOlwiMThcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlBbmNob3IgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxMlwiLFwiY3lcIjpcIjVcIixcInJcIjpcIjNcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjIyXCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCI4XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNNSAxMkgyYTEwIDEwIDAgMCAwIDIwIDBoLTNcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlBcGVydHVyZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTQuMzFcIixcInkxXCI6XCI4XCIsXCJ4MlwiOlwiMjAuMDVcIixcInkyXCI6XCIxNy45NFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjkuNjlcIixcInkxXCI6XCI4XCIsXCJ4MlwiOlwiMjEuMTdcIixcInkyXCI6XCI4XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiNy4zOFwiLFwieTFcIjpcIjEyXCIsXCJ4MlwiOlwiMTMuMTJcIixcInkyXCI6XCIyLjA2XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiOS42OVwiLFwieTFcIjpcIjE2XCIsXCJ4MlwiOlwiMy45NVwiLFwieTJcIjpcIjYuMDZcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNC4zMVwiLFwieTFcIjpcIjE2XCIsXCJ4MlwiOlwiMi44M1wiLFwieTJcIjpcIjE2XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTYuNjJcIixcInkxXCI6XCIxMlwiLFwieDJcIjpcIjEwLjg4XCIsXCJ5MlwiOlwiMjEuOTRcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlBcmNoaXZlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMjEgOCAyMSAyMSAzIDIxIDMgOFwifX0se1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiMVwiLFwieVwiOlwiM1wiLFwid2lkdGhcIjpcIjIyXCIsXCJoZWlnaHRcIjpcIjVcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMFwiLFwieTFcIjpcIjEyXCIsXCJ4MlwiOlwiMTRcIixcInkyXCI6XCIxMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUFycm93RG93bkNpcmNsZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCI4IDEyIDEyIDE2IDE2IDEyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCI4XCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCIxNlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUFycm93RG93bkxlZnQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTdcIixcInkxXCI6XCI3XCIsXCJ4MlwiOlwiN1wiLFwieTJcIjpcIjE3XCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxNyAxNyA3IDE3IDcgN1wifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUFycm93RG93blJpZ2h0IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjdcIixcInkxXCI6XCI3XCIsXCJ4MlwiOlwiMTdcIixcInkyXCI6XCIxN1wifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTcgNyAxNyAxNyA3IDE3XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQXJyb3dEb3duIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiNVwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMTlcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjE5IDEyIDEyIDE5IDUgMTJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlBcnJvd0xlZnRDaXJjbGUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxMlwiLFwiY3lcIjpcIjEyXCIsXCJyXCI6XCIxMFwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTIgOCA4IDEyIDEyIDE2XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTZcIixcInkxXCI6XCIxMlwiLFwieDJcIjpcIjhcIixcInkyXCI6XCIxMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUFycm93TGVmdCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxOVwiLFwieTFcIjpcIjEyXCIsXCJ4MlwiOlwiNVwiLFwieTJcIjpcIjEyXCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxMiAxOSA1IDEyIDEyIDVcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlBcnJvd1JpZ2h0Q2lyY2xlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjEyIDE2IDE2IDEyIDEyIDhcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI4XCIsXCJ5MVwiOlwiMTJcIixcIngyXCI6XCIxNlwiLFwieTJcIjpcIjEyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQXJyb3dSaWdodCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI1XCIsXCJ5MVwiOlwiMTJcIixcIngyXCI6XCIxOVwiLFwieTJcIjpcIjEyXCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxMiA1IDE5IDEyIDEyIDE5XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQXJyb3dVcENpcmNsZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxNiAxMiAxMiA4IDggMTJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjE2XCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCI4XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQXJyb3dVcExlZnQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTdcIixcInkxXCI6XCIxN1wiLFwieDJcIjpcIjdcIixcInkyXCI6XCI3XCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCI3IDE3IDcgNyAxNyA3XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQXJyb3dVcFJpZ2h0IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjdcIixcInkxXCI6XCIxN1wiLFwieDJcIjpcIjE3XCIsXCJ5MlwiOlwiN1wifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiNyA3IDE3IDcgMTcgMTdcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlBcnJvd1VwIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiMTlcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjVcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjUgMTIgMTIgNSAxOSAxMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUF0U2lnbiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjRcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNiA4djVhMyAzIDAgMCAwIDYgMHYtMWExMCAxMCAwIDEgMC0zLjkyIDcuOTRcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlBd2FyZCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiOFwiLFwiclwiOlwiN1wifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiOC4yMSAxMy44OSA3IDIzIDEyIDIwIDE3IDIzIDE1Ljc5IDEzLjg4XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQmFyQ2hhcnQyIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE4XCIsXCJ5MVwiOlwiMjBcIixcIngyXCI6XCIxOFwiLFwieTJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIyMFwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiNFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjZcIixcInkxXCI6XCIyMFwiLFwieDJcIjpcIjZcIixcInkyXCI6XCIxNFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUJhckNoYXJ0IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiMjBcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMThcIixcInkxXCI6XCIyMFwiLFwieDJcIjpcIjE4XCIsXCJ5MlwiOlwiNFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjZcIixcInkxXCI6XCIyMFwiLFwieDJcIjpcIjZcIixcInkyXCI6XCIxNlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUJhdHRlcnlDaGFyZ2luZyAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk01IDE4SDNhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoMy4xOU0xNSA2aDJhMiAyIDAgMCAxIDIgMnY4YTIgMiAwIDAgMS0yIDJoLTMuMTlcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyM1wiLFwieTFcIjpcIjEzXCIsXCJ4MlwiOlwiMjNcIixcInkyXCI6XCIxMVwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTEgNiA3IDEyIDEzIDEyIDkgMThcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlCYXR0ZXJ5IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiMVwiLFwieVwiOlwiNlwiLFwid2lkdGhcIjpcIjE4XCIsXCJoZWlnaHRcIjpcIjEyXCIsXCJyeFwiOlwiMlwiLFwicnlcIjpcIjJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyM1wiLFwieTFcIjpcIjEzXCIsXCJ4MlwiOlwiMjNcIixcInkyXCI6XCIxMVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUJlbGxPZmYgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTMuNzMgMjFhMiAyIDAgMCAxLTMuNDYgMFwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE4LjYzIDEzQTE3Ljg5IDE3Ljg5IDAgMCAxIDE4IDhcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk02LjI2IDYuMjZBNS44NiA1Ljg2IDAgMCAwIDYgOGMwIDctMyA5LTMgOWgxNFwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE4IDhhNiA2IDAgMCAwLTkuMzMtNVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjFcIixcInkxXCI6XCIxXCIsXCJ4MlwiOlwiMjNcIixcInkyXCI6XCIyM1wifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUJlbGwgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTggOEE2IDYgMCAwIDAgNiA4YzAgNy0zIDktMyA5aDE4cy0zLTItMy05XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTMuNzMgMjFhMiAyIDAgMCAxLTMuNDYgMFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUJsdWV0b290aCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjYuNSA2LjUgMTcuNSAxNy41IDEyIDIzIDEyIDEgMTcuNSA2LjUgNi41IDE3LjVcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlCb2xkIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTYgNGg4YTQgNCAwIDAgMSA0IDQgNCA0IDAgMCAxLTQgNEg2elwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTYgMTJoOWE0IDQgMCAwIDEgNCA0IDQgNCAwIDAgMS00IDRINnpcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlCb29rT3BlbiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yIDNoNmE0IDQgMCAwIDEgNCA0djE0YTMgMyAwIDAgMC0zLTNIMnpcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMiAzaC02YTQgNCAwIDAgMC00IDR2MTRhMyAzIDAgMCAxIDMtM2g3elwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUJvb2sgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNNCAxOS41QTIuNSAyLjUgMCAwIDEgNi41IDE3SDIwXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNNi41IDJIMjB2MjBINi41QTIuNSAyLjUgMCAwIDEgNCAxOS41di0xNUEyLjUgMi41IDAgMCAxIDYuNSAyelwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUJvb2ttYXJrIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE5IDIxbC03LTUtNyA1VjVhMiAyIDAgMCAxIDItMmgxMGEyIDIgMCAwIDEgMiAyelwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUJveCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMSAxNlY4YTIgMiAwIDAgMC0xLTEuNzNsLTctNGEyIDIgMCAwIDAtMiAwbC03IDRBMiAyIDAgMCAwIDMgOHY4YTIgMiAwIDAgMCAxIDEuNzNsNyA0YTIgMiAwIDAgMCAyIDBsNy00QTIgMiAwIDAgMCAyMSAxNnpcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjMuMjcgNi45NiAxMiAxMi4wMSAyMC43MyA2Ljk2XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIyMi4wOFwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMTJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlCcmllZmNhc2UgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCIyXCIsXCJ5XCI6XCI3XCIsXCJ3aWR0aFwiOlwiMjBcIixcImhlaWdodFwiOlwiMTRcIixcInJ4XCI6XCIyXCIsXCJyeVwiOlwiMlwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE2IDIxVjVhMiAyIDAgMCAwLTItMmgtNGEyIDIgMCAwIDAtMiAydjE2XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ2FsZW5kYXIgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCIzXCIsXCJ5XCI6XCI0XCIsXCJ3aWR0aFwiOlwiMThcIixcImhlaWdodFwiOlwiMThcIixcInJ4XCI6XCIyXCIsXCJyeVwiOlwiMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE2XCIsXCJ5MVwiOlwiMlwiLFwieDJcIjpcIjE2XCIsXCJ5MlwiOlwiNlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjhcIixcInkxXCI6XCIyXCIsXCJ4MlwiOlwiOFwiLFwieTJcIjpcIjZcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIzXCIsXCJ5MVwiOlwiMTBcIixcIngyXCI6XCIyMVwiLFwieTJcIjpcIjEwXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ2FtZXJhT2ZmIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjFcIixcInkxXCI6XCIxXCIsXCJ4MlwiOlwiMjNcIixcInkyXCI6XCIyM1wifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTIxIDIxSDNhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoM20zLTNoNmwyIDNoNGEyIDIgMCAwIDEgMiAydjkuMzRtLTcuNzItMi4wNmE0IDQgMCAxIDEtNS41Ni01LjU2XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ2FtZXJhIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTIzIDE5YTIgMiAwIDAgMS0yIDJIM2EyIDIgMCAwIDEtMi0yVjhhMiAyIDAgMCAxIDItMmg0bDItM2g2bDIgM2g0YTIgMiAwIDAgMSAyIDJ6XCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxMlwiLFwiY3lcIjpcIjEzXCIsXCJyXCI6XCI0XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ2FzdCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yIDE2LjFBNSA1IDAgMCAxIDUuOSAyME0yIDEyLjA1QTkgOSAwIDAgMSA5Ljk1IDIwTTIgOFY2YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnYxMmEyIDIgMCAwIDEtMiAyaC02XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMlwiLFwieTFcIjpcIjIwXCIsXCJ4MlwiOlwiMi4wMVwiLFwieTJcIjpcIjIwXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ2hlY2tDaXJjbGUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjIgMTEuMDhWMTJhMTAgMTAgMCAxIDEtNS45My05LjE0XCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIyMiA0IDEyIDE0LjAxIDkgMTEuMDFcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDaGVja1NxdWFyZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjkgMTEgMTIgMTQgMjIgNFwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTIxIDEydjdhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDExXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ2hlY2sgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIyMCA2IDkgMTcgNCAxMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUNoZXZyb25Eb3duIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiNiA5IDEyIDE1IDE4IDlcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDaGV2cm9uTGVmdCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjE1IDE4IDkgMTIgMTUgNlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUNoZXZyb25SaWdodCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjkgMTggMTUgMTIgOSA2XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ2hldnJvblVwIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTggMTUgMTIgOSA2IDE1XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ2hldnJvbnNEb3duIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiNyAxMyAxMiAxOCAxNyAxM1wifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiNyA2IDEyIDExIDE3IDZcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDaGV2cm9uc0xlZnQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxMSAxNyA2IDEyIDExIDdcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjE4IDE3IDEzIDEyIDE4IDdcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDaGV2cm9uc1JpZ2h0IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTMgMTcgMTggMTIgMTMgN1wifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiNiAxNyAxMSAxMiA2IDdcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDaGV2cm9uc1VwIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTcgMTEgMTIgNiA3IDExXCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxNyAxOCAxMiAxMyA3IDE4XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ2hyb21lIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjRcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyMS4xN1wiLFwieTFcIjpcIjhcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjhcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIzLjk1XCIsXCJ5MVwiOlwiNi4wNlwiLFwieDJcIjpcIjguNTRcIixcInkyXCI6XCIxNFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEwLjg4XCIsXCJ5MVwiOlwiMjEuOTRcIixcIngyXCI6XCIxNS40NlwiLFwieTJcIjpcIjE0XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ2lyY2xlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDbGlwYm9hcmQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTYgNGgyYTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJWNmEyIDIgMCAwIDEgMi0yaDJcIn19LHtcInRhZ1wiOlwicmVjdFwiLFwiYXR0clwiOntcInhcIjpcIjhcIixcInlcIjpcIjJcIixcIndpZHRoXCI6XCI4XCIsXCJoZWlnaHRcIjpcIjRcIixcInJ4XCI6XCIxXCIsXCJyeVwiOlwiMVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUNsb2NrIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjEyIDYgMTIgMTIgMTYgMTRcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDbG91ZERyaXp6bGUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiOFwiLFwieTFcIjpcIjE5XCIsXCJ4MlwiOlwiOFwiLFwieTJcIjpcIjIxXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiOFwiLFwieTFcIjpcIjEzXCIsXCJ4MlwiOlwiOFwiLFwieTJcIjpcIjE1XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTZcIixcInkxXCI6XCIxOVwiLFwieDJcIjpcIjE2XCIsXCJ5MlwiOlwiMjFcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNlwiLFwieTFcIjpcIjEzXCIsXCJ4MlwiOlwiMTZcIixcInkyXCI6XCIxNVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiMjFcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjIzXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIxNVwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMTdcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMCAxNi41OEE1IDUgMCAwIDAgMTggN2gtMS4yNkE4IDggMCAxIDAgNCAxNS4yNVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUNsb3VkTGlnaHRuaW5nIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE5IDE2LjlBNSA1IDAgMCAwIDE4IDdoLTEuMjZhOCA4IDAgMSAwLTExLjYyIDlcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjEzIDExIDkgMTcgMTUgMTcgMTEgMjNcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDbG91ZE9mZiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMi42MSAxNi45NUE1IDUgMCAwIDAgMTggMTBoLTEuMjZhOCA4IDAgMCAwLTcuMDUtNk01IDVhOCA4IDAgMCAwIDQgMTVoOWE1IDUgMCAwIDAgMS43LS4zXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMVwiLFwieTFcIjpcIjFcIixcIngyXCI6XCIyM1wiLFwieTJcIjpcIjIzXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ2xvdWRSYWluIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE2XCIsXCJ5MVwiOlwiMTNcIixcIngyXCI6XCIxNlwiLFwieTJcIjpcIjIxXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiOFwiLFwieTFcIjpcIjEzXCIsXCJ4MlwiOlwiOFwiLFwieTJcIjpcIjIxXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIxNVwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMjNcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMCAxNi41OEE1IDUgMCAwIDAgMTggN2gtMS4yNkE4IDggMCAxIDAgNCAxNS4yNVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUNsb3VkU25vdyAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMCAxNy41OEE1IDUgMCAwIDAgMTggOGgtMS4yNkE4IDggMCAxIDAgNCAxNi4yNVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjhcIixcInkxXCI6XCIxNlwiLFwieDJcIjpcIjguMDFcIixcInkyXCI6XCIxNlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjhcIixcInkxXCI6XCIyMFwiLFwieDJcIjpcIjguMDFcIixcInkyXCI6XCIyMFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiMThcIixcIngyXCI6XCIxMi4wMVwiLFwieTJcIjpcIjE4XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIyMlwiLFwieDJcIjpcIjEyLjAxXCIsXCJ5MlwiOlwiMjJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNlwiLFwieTFcIjpcIjE2XCIsXCJ4MlwiOlwiMTYuMDFcIixcInkyXCI6XCIxNlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE2XCIsXCJ5MVwiOlwiMjBcIixcIngyXCI6XCIxNi4wMVwiLFwieTJcIjpcIjIwXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ2xvdWQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTggMTBoLTEuMjZBOCA4IDAgMSAwIDkgMjBoOWE1IDUgMCAwIDAgMC0xMHpcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDb2RlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTYgMTggMjIgMTIgMTYgNlwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiOCA2IDIgMTIgOCAxOFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUNvZGVwZW4gKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlnb25cIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjEyIDIgMjIgOC41IDIyIDE1LjUgMTIgMjIgMiAxNS41IDIgOC41IDEyIDJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjIyXCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCIxNS41XCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIyMiA4LjUgMTIgMTUuNSAyIDguNVwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMiAxNS41IDEyIDguNSAyMiAxNS41XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIyXCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCI4LjVcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDb2Rlc2FuZGJveCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMSAxNlY4YTIgMiAwIDAgMC0xLTEuNzNsLTctNGEyIDIgMCAwIDAtMiAwbC03IDRBMiAyIDAgMCAwIDMgOHY4YTIgMiAwIDAgMCAxIDEuNzNsNyA0YTIgMiAwIDAgMCAyIDBsNy00QTIgMiAwIDAgMCAyMSAxNnpcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjcuNSA0LjIxIDEyIDYuODEgMTYuNSA0LjIxXCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCI3LjUgMTkuNzkgNy41IDE0LjYgMyAxMlwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMjEgMTIgMTYuNSAxNC42IDE2LjUgMTkuNzlcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjMuMjcgNi45NiAxMiAxMi4wMSAyMC43MyA2Ljk2XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIyMi4wOFwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMTJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDb2ZmZWUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTggOGgxYTQgNCAwIDAgMSAwIDhoLTFcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yIDhoMTZ2OWE0IDQgMCAwIDEtNCA0SDZhNCA0IDAgMCAxLTQtNFY4elwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjZcIixcInkxXCI6XCIxXCIsXCJ4MlwiOlwiNlwiLFwieTJcIjpcIjRcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMFwiLFwieTFcIjpcIjFcIixcIngyXCI6XCIxMFwiLFwieTJcIjpcIjRcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNFwiLFwieTFcIjpcIjFcIixcIngyXCI6XCIxNFwiLFwieTJcIjpcIjRcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDb2x1bW5zIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTEyIDNoN2EyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJoLTdtMC0xOEg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg3bTAtMTh2MThcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDb21tYW5kIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE4IDNhMyAzIDAgMCAwLTMgM3YxMmEzIDMgMCAwIDAgMyAzIDMgMyAwIDAgMCAzLTMgMyAzIDAgMCAwLTMtM0g2YTMgMyAwIDAgMC0zIDMgMyAzIDAgMCAwIDMgMyAzIDMgMCAwIDAgMy0zVjZhMyAzIDAgMCAwLTMtMyAzIDMgMCAwIDAtMyAzIDMgMyAwIDAgMCAzIDNoMTJhMyAzIDAgMCAwIDMtMyAzIDMgMCAwIDAtMy0zelwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUNvbXBhc3MgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxMlwiLFwiY3lcIjpcIjEyXCIsXCJyXCI6XCIxMFwifX0se1widGFnXCI6XCJwb2x5Z29uXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxNi4yNCA3Ljc2IDE0LjEyIDE0LjEyIDcuNzYgMTYuMjQgOS44OCA5Ljg4IDE2LjI0IDcuNzZcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDb3B5IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiOVwiLFwieVwiOlwiOVwiLFwid2lkdGhcIjpcIjEzXCIsXCJoZWlnaHRcIjpcIjEzXCIsXCJyeFwiOlwiMlwiLFwicnlcIjpcIjJcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk01IDE1SDRhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOWEyIDIgMCAwIDEgMiAydjFcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDb3JuZXJEb3duTGVmdCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjkgMTAgNCAxNSA5IDIwXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjAgNHY3YTQgNCAwIDAgMS00IDRINFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUNvcm5lckRvd25SaWdodCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjE1IDEwIDIwIDE1IDE1IDIwXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNNCA0djdhNCA0IDAgMCAwIDQgNGgxMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUNvcm5lckxlZnREb3duIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTQgMTUgOSAyMCA0IDE1XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjAgNGgtN2E0IDQgMCAwIDAtNCA0djEyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ29ybmVyTGVmdFVwIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTQgOSA5IDQgNCA5XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjAgMjBoLTdhNCA0IDAgMCAxLTQtNFY0XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ29ybmVyUmlnaHREb3duIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTAgMTUgMTUgMjAgMjAgMTVcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk00IDRoN2E0IDQgMCAwIDEgNCA0djEyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ29ybmVyUmlnaHRVcCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjEwIDkgMTUgNCAyMCA5XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNNCAyMGg3YTQgNCAwIDAgMCA0LTRWNFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUNvcm5lclVwTGVmdCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjkgMTQgNCA5IDkgNFwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTIwIDIwdi03YTQgNCAwIDAgMC00LTRINFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUNvcm5lclVwUmlnaHQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxNSAxNCAyMCA5IDE1IDRcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk00IDIwdi03YTQgNCAwIDAgMSA0LTRoMTJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDcHUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCI0XCIsXCJ5XCI6XCI0XCIsXCJ3aWR0aFwiOlwiMTZcIixcImhlaWdodFwiOlwiMTZcIixcInJ4XCI6XCIyXCIsXCJyeVwiOlwiMlwifX0se1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiOVwiLFwieVwiOlwiOVwiLFwid2lkdGhcIjpcIjZcIixcImhlaWdodFwiOlwiNlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjlcIixcInkxXCI6XCIxXCIsXCJ4MlwiOlwiOVwiLFwieTJcIjpcIjRcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNVwiLFwieTFcIjpcIjFcIixcIngyXCI6XCIxNVwiLFwieTJcIjpcIjRcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI5XCIsXCJ5MVwiOlwiMjBcIixcIngyXCI6XCI5XCIsXCJ5MlwiOlwiMjNcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNVwiLFwieTFcIjpcIjIwXCIsXCJ4MlwiOlwiMTVcIixcInkyXCI6XCIyM1wifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjIwXCIsXCJ5MVwiOlwiOVwiLFwieDJcIjpcIjIzXCIsXCJ5MlwiOlwiOVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjIwXCIsXCJ5MVwiOlwiMTRcIixcIngyXCI6XCIyM1wiLFwieTJcIjpcIjE0XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMVwiLFwieTFcIjpcIjlcIixcIngyXCI6XCI0XCIsXCJ5MlwiOlwiOVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjFcIixcInkxXCI6XCIxNFwiLFwieDJcIjpcIjRcIixcInkyXCI6XCIxNFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUNyZWRpdENhcmQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCIxXCIsXCJ5XCI6XCI0XCIsXCJ3aWR0aFwiOlwiMjJcIixcImhlaWdodFwiOlwiMTZcIixcInJ4XCI6XCIyXCIsXCJyeVwiOlwiMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjFcIixcInkxXCI6XCIxMFwiLFwieDJcIjpcIjIzXCIsXCJ5MlwiOlwiMTBcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlDcm9wIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTYuMTMgMUw2IDE2YTIgMiAwIDAgMCAyIDJoMTVcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xIDYuMTNMMTYgNmEyIDIgMCAwIDEgMiAydjE1XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpQ3Jvc3NoYWlyIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyMlwiLFwieTFcIjpcIjEyXCIsXCJ4MlwiOlwiMThcIixcInkyXCI6XCIxMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjZcIixcInkxXCI6XCIxMlwiLFwieDJcIjpcIjJcIixcInkyXCI6XCIxMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiNlwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiMjJcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjE4XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpRGF0YWJhc2UgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImVsbGlwc2VcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCI1XCIsXCJyeFwiOlwiOVwiLFwicnlcIjpcIjNcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMSAxMmMwIDEuNjYtNCAzLTkgM3MtOS0xLjM0LTktM1wifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTMgNXYxNGMwIDEuNjYgNCAzIDkgM3M5LTEuMzQgOS0zVjVcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlEZWxldGUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjEgNEg4bC03IDggNyA4aDEzYTIgMiAwIDAgMCAyLTJWNmEyIDIgMCAwIDAtMi0yelwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE4XCIsXCJ5MVwiOlwiOVwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMTVcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjlcIixcIngyXCI6XCIxOFwiLFwieTJcIjpcIjE1XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpRGlzYyAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxMlwiLFwiY3lcIjpcIjEyXCIsXCJyXCI6XCIzXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpRGl2aWRlQ2lyY2xlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjhcIixcInkxXCI6XCIxMlwiLFwieDJcIjpcIjE2XCIsXCJ5MlwiOlwiMTJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjE2XCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCIxNlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiOFwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiOFwifX0se1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlEaXZpZGVTcXVhcmUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCIzXCIsXCJ5XCI6XCIzXCIsXCJ3aWR0aFwiOlwiMThcIixcImhlaWdodFwiOlwiMThcIixcInJ4XCI6XCIyXCIsXCJyeVwiOlwiMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjhcIixcInkxXCI6XCIxMlwiLFwieDJcIjpcIjE2XCIsXCJ5MlwiOlwiMTJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjE2XCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCIxNlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiOFwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiOFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaURpdmlkZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiNlwiLFwiclwiOlwiMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjVcIixcInkxXCI6XCIxMlwiLFwieDJcIjpcIjE5XCIsXCJ5MlwiOlwiMTJcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMThcIixcInJcIjpcIjJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlEb2xsYXJTaWduIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiMVwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMjNcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNyA1SDkuNWEzLjUgMy41IDAgMCAwIDAgN2g1YTMuNSAzLjUgMCAwIDEgMCA3SDZcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlEb3dubG9hZENsb3VkIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiOCAxNyAxMiAyMSAxNiAxN1wifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiMTJcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjIxXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjAuODggMTguMDlBNSA1IDAgMCAwIDE4IDloLTEuMjZBOCA4IDAgMSAwIDMgMTYuMjlcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlEb3dubG9hZCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00XCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCI3IDEwIDEyIDE1IDE3IDEwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIxNVwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiM1wifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaURyaWJiYmxlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk04LjU2IDIuNzVjNC4zNyA2LjAzIDYuMDIgOS40MiA4LjAzIDE3LjcybTIuNTQtMTUuMzhjLTMuNzIgNC4zNS04Ljk0IDUuNjYtMTYuODggNS44NW0xOS41IDEuOWMtMy41LS45My02LjYzLS44Mi04Ljk0IDAtMi41OC45Mi01LjAxIDIuODYtNy40NCA2LjMyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpRHJvcGxldCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xMiAyLjY5bDUuNjYgNS42NmE4IDggMCAxIDEtMTEuMzEgMHpcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlFZGl0MiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNyAzYTIuODI4IDIuODI4IDAgMSAxIDQgNEw3LjUgMjAuNSAyIDIybDEuNS01LjVMMTcgM3pcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlFZGl0MyAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xMiAyMGg5XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTYuNSAzLjVhMi4xMjEgMi4xMjEgMCAwIDEgMyAzTDcgMTlsLTQgMSAxLTRMMTYuNSAzLjV6XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpRWRpdCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xMSA0SDRhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDE0YTIgMiAwIDAgMCAyLTJ2LTdcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xOC41IDIuNWEyLjEyMSAyLjEyMSAwIDAgMSAzIDNMMTIgMTVsLTQgMSAxLTQgOS41LTkuNXpcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlFeHRlcm5hbExpbmsgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTggMTN2NmEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoNlwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTUgMyAyMSAzIDIxIDlcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMFwiLFwieTFcIjpcIjE0XCIsXCJ4MlwiOlwiMjFcIixcInkyXCI6XCIzXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpRXllT2ZmIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE3Ljk0IDE3Ljk0QTEwLjA3IDEwLjA3IDAgMCAxIDEyIDIwYy03IDAtMTEtOC0xMS04YTE4LjQ1IDE4LjQ1IDAgMCAxIDUuMDYtNS45NE05LjkgNC4yNEE5LjEyIDkuMTIgMCAwIDEgMTIgNGM3IDAgMTEgOCAxMSA4YTE4LjUgMTguNSAwIDAgMS0yLjE2IDMuMTltLTYuNzItMS4wN2EzIDMgMCAxIDEtNC4yNC00LjI0XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMVwiLFwieTFcIjpcIjFcIixcIngyXCI6XCIyM1wiLFwieTJcIjpcIjIzXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpRXllIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTEgMTJzNC04IDExLTggMTEgOCAxMSA4LTQgOC0xMSA4LTExLTgtMTEtOHpcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjNcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlGYWNlYm9vayAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xOCAyaC0zYTUgNSAwIDAgMC01IDV2M0g3djRoM3Y4aDR2LThoM2wxLTRoLTRWN2ExIDEgMCAwIDEgMS0xaDN6XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpRmFzdEZvcndhcmQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlnb25cIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjEzIDE5IDIyIDEyIDEzIDUgMTMgMTlcIn19LHtcInRhZ1wiOlwicG9seWdvblwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMiAxOSAxMSAxMiAyIDUgMiAxOVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUZlYXRoZXIgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjAuMjQgMTIuMjRhNiA2IDAgMCAwLTguNDktOC40OUw1IDEwLjVWMTloOC41elwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE2XCIsXCJ5MVwiOlwiOFwiLFwieDJcIjpcIjJcIixcInkyXCI6XCIyMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE3LjVcIixcInkxXCI6XCIxNVwiLFwieDJcIjpcIjlcIixcInkyXCI6XCIxNVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUZpZ21hIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTUgNS41QTMuNSAzLjUgMCAwIDEgOC41IDJIMTJ2N0g4LjVBMy41IDMuNSAwIDAgMSA1IDUuNXpcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xMiAyaDMuNWEzLjUgMy41IDAgMSAxIDAgN0gxMlYyelwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTEyIDEyLjVhMy41IDMuNSAwIDEgMSA3IDAgMy41IDMuNSAwIDEgMS03IDB6XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNNSAxOS41QTMuNSAzLjUgMCAwIDEgOC41IDE2SDEydjMuNWEzLjUgMy41IDAgMSAxLTcgMHpcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk01IDEyLjVBMy41IDMuNSAwIDAgMSA4LjUgOUgxMnY3SDguNUEzLjUgMy41IDAgMCAxIDUgMTIuNXpcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlGaWxlTWludXMgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTQgMkg2YTIgMiAwIDAgMC0yIDJ2MTZhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0yVjh6XCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxNCAyIDE0IDggMjAgOFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjlcIixcInkxXCI6XCIxNVwiLFwieDJcIjpcIjE1XCIsXCJ5MlwiOlwiMTVcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlGaWxlUGx1cyAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNCAySDZhMiAyIDAgMCAwLTIgMnYxNmEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJWOHpcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjE0IDIgMTQgOCAyMCA4XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIxOFwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMTJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI5XCIsXCJ5MVwiOlwiMTVcIixcIngyXCI6XCIxNVwiLFwieTJcIjpcIjE1XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpRmlsZVRleHQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTQgMkg2YTIgMiAwIDAgMC0yIDJ2MTZhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0yVjh6XCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxNCAyIDE0IDggMjAgOFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE2XCIsXCJ5MVwiOlwiMTNcIixcIngyXCI6XCI4XCIsXCJ5MlwiOlwiMTNcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNlwiLFwieTFcIjpcIjE3XCIsXCJ4MlwiOlwiOFwiLFwieTJcIjpcIjE3XCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxMCA5IDkgOSA4IDlcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlGaWxlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTEzIDJINmEyIDIgMCAwIDAtMiAydjE2YTIgMiAwIDAgMCAyIDJoMTJhMiAyIDAgMCAwIDItMlY5elwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTMgMiAxMyA5IDIwIDlcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlGaWxtIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiMlwiLFwieVwiOlwiMlwiLFwid2lkdGhcIjpcIjIwXCIsXCJoZWlnaHRcIjpcIjIwXCIsXCJyeFwiOlwiMi4xOFwiLFwicnlcIjpcIjIuMThcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI3XCIsXCJ5MVwiOlwiMlwiLFwieDJcIjpcIjdcIixcInkyXCI6XCIyMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE3XCIsXCJ5MVwiOlwiMlwiLFwieDJcIjpcIjE3XCIsXCJ5MlwiOlwiMjJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyXCIsXCJ5MVwiOlwiMTJcIixcIngyXCI6XCIyMlwiLFwieTJcIjpcIjEyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMlwiLFwieTFcIjpcIjdcIixcIngyXCI6XCI3XCIsXCJ5MlwiOlwiN1wifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjJcIixcInkxXCI6XCIxN1wiLFwieDJcIjpcIjdcIixcInkyXCI6XCIxN1wifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE3XCIsXCJ5MVwiOlwiMTdcIixcIngyXCI6XCIyMlwiLFwieTJcIjpcIjE3XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTdcIixcInkxXCI6XCI3XCIsXCJ4MlwiOlwiMjJcIixcInkyXCI6XCI3XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpRmlsdGVyIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5Z29uXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIyMiAzIDIgMyAxMCAxMi40NiAxMCAxOSAxNCAyMSAxNCAxMi40NiAyMiAzXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpRmxhZyAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk00IDE1czEtMSA0LTEgNSAyIDggMiA0LTEgNC0xVjNzLTEgMS00IDEtNS0yLTgtMi00IDEtNCAxelwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjRcIixcInkxXCI6XCIyMlwiLFwieDJcIjpcIjRcIixcInkyXCI6XCIxNVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUZvbGRlck1pbnVzIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTIyIDE5YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmg1bDIgM2g5YTIgMiAwIDAgMSAyIDJ6XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiOVwiLFwieTFcIjpcIjE0XCIsXCJ4MlwiOlwiMTVcIixcInkyXCI6XCIxNFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUZvbGRlclBsdXMgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjIgMTlhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDVsMiAzaDlhMiAyIDAgMCAxIDIgMnpcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjExXCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCIxN1wifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjlcIixcInkxXCI6XCIxNFwiLFwieDJcIjpcIjE1XCIsXCJ5MlwiOlwiMTRcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlGb2xkZXIgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjIgMTlhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDVsMiAzaDlhMiAyIDAgMCAxIDIgMnpcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlGcmFtZXIgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNNSAxNlY5aDE0VjJINWwxNCAxNGgtN20tNyAwbDcgN3YtN20tNyAwaDdcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlGcm93biAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTYgMTZzLTEuNS0yLTQtMi00IDItNCAyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiOVwiLFwieTFcIjpcIjlcIixcIngyXCI6XCI5LjAxXCIsXCJ5MlwiOlwiOVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE1XCIsXCJ5MVwiOlwiOVwiLFwieDJcIjpcIjE1LjAxXCIsXCJ5MlwiOlwiOVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUdpZnQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIyMCAxMiAyMCAyMiA0IDIyIDQgMTJcIn19LHtcInRhZ1wiOlwicmVjdFwiLFwiYXR0clwiOntcInhcIjpcIjJcIixcInlcIjpcIjdcIixcIndpZHRoXCI6XCIyMFwiLFwiaGVpZ2h0XCI6XCI1XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIyMlwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiN1wifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTEyIDdINy41YTIuNSAyLjUgMCAwIDEgMC01QzExIDIgMTIgNyAxMiA3elwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTEyIDdoNC41YTIuNSAyLjUgMCAwIDAgMC01QzEzIDIgMTIgNyAxMiA3elwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUdpdEJyYW5jaCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI2XCIsXCJ5MVwiOlwiM1wiLFwieDJcIjpcIjZcIixcInkyXCI6XCIxNVwifX0se1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMThcIixcImN5XCI6XCI2XCIsXCJyXCI6XCIzXCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCI2XCIsXCJjeVwiOlwiMThcIixcInJcIjpcIjNcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xOCA5YTkgOSAwIDAgMS05IDlcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlHaXRDb21taXQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxMlwiLFwiY3lcIjpcIjEyXCIsXCJyXCI6XCI0XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMS4wNVwiLFwieTFcIjpcIjEyXCIsXCJ4MlwiOlwiN1wiLFwieTJcIjpcIjEyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTcuMDFcIixcInkxXCI6XCIxMlwiLFwieDJcIjpcIjIyLjk2XCIsXCJ5MlwiOlwiMTJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlHaXRNZXJnZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjE4XCIsXCJjeVwiOlwiMThcIixcInJcIjpcIjNcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjZcIixcImN5XCI6XCI2XCIsXCJyXCI6XCIzXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNNiAyMVY5YTkgOSAwIDAgMCA5IDlcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlHaXRQdWxsUmVxdWVzdCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjE4XCIsXCJjeVwiOlwiMThcIixcInJcIjpcIjNcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjZcIixcImN5XCI6XCI2XCIsXCJyXCI6XCIzXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTMgNmgzYTIgMiAwIDAgMSAyIDJ2N1wifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjZcIixcInkxXCI6XCI5XCIsXCJ4MlwiOlwiNlwiLFwieTJcIjpcIjIxXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpR2l0aHViIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTkgMTljLTUgMS41LTUtMi41LTctM20xNCA2di0zLjg3YTMuMzcgMy4zNyAwIDAgMC0uOTQtMi42MWMzLjE0LS4zNSA2LjQ0LTEuNTQgNi40NC03QTUuNDQgNS40NCAwIDAgMCAyMCA0Ljc3IDUuMDcgNS4wNyAwIDAgMCAxOS45MSAxUzE4LjczLjY1IDE2IDIuNDhhMTMuMzggMTMuMzggMCAwIDAtNyAwQzYuMjcuNjUgNS4wOSAxIDUuMDkgMUE1LjA3IDUuMDcgMCAwIDAgNSA0Ljc3YTUuNDQgNS40NCAwIDAgMC0xLjUgMy43OGMwIDUuNDIgMy4zIDYuNjEgNi40NCA3QTMuMzcgMy4zNyAwIDAgMCA5IDE4LjEzVjIyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpR2l0bGFiIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTIyLjY1IDE0LjM5TDEyIDIyLjEzIDEuMzUgMTQuMzlhLjg0Ljg0IDAgMCAxLS4zLS45NGwxLjIyLTMuNzggMi40NC03LjUxQS40Mi40MiAwIDAgMSA0LjgyIDJhLjQzLjQzIDAgMCAxIC41OCAwIC40Mi40MiAwIDAgMSAuMTEuMThsMi40NCA3LjQ5aDguMWwyLjQ0LTcuNTFBLjQyLjQyIDAgMCAxIDE4LjYgMmEuNDMuNDMgMCAwIDEgLjU4IDAgLjQyLjQyIDAgMCAxIC4xMS4xOGwyLjQ0IDcuNTFMMjMgMTMuNDVhLjg0Ljg0IDAgMCAxLS4zNS45NHpcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlHbG9iZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMlwiLFwieTFcIjpcIjEyXCIsXCJ4MlwiOlwiMjJcIixcInkyXCI6XCIxMlwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTEyIDJhMTUuMyAxNS4zIDAgMCAxIDQgMTAgMTUuMyAxNS4zIDAgMCAxLTQgMTAgMTUuMyAxNS4zIDAgMCAxLTQtMTAgMTUuMyAxNS4zIDAgMCAxIDQtMTB6XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpR3JpZCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicmVjdFwiLFwiYXR0clwiOntcInhcIjpcIjNcIixcInlcIjpcIjNcIixcIndpZHRoXCI6XCI3XCIsXCJoZWlnaHRcIjpcIjdcIn19LHtcInRhZ1wiOlwicmVjdFwiLFwiYXR0clwiOntcInhcIjpcIjE0XCIsXCJ5XCI6XCIzXCIsXCJ3aWR0aFwiOlwiN1wiLFwiaGVpZ2h0XCI6XCI3XCJ9fSx7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCIxNFwiLFwieVwiOlwiMTRcIixcIndpZHRoXCI6XCI3XCIsXCJoZWlnaHRcIjpcIjdcIn19LHtcInRhZ1wiOlwicmVjdFwiLFwiYXR0clwiOntcInhcIjpcIjNcIixcInlcIjpcIjE0XCIsXCJ3aWR0aFwiOlwiN1wiLFwiaGVpZ2h0XCI6XCI3XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpSGFyZERyaXZlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjIyXCIsXCJ5MVwiOlwiMTJcIixcIngyXCI6XCIyXCIsXCJ5MlwiOlwiMTJcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk01LjQ1IDUuMTFMMiAxMnY2YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMnYtNmwtMy40NS02Ljg5QTIgMiAwIDAgMCAxNi43NiA0SDcuMjRhMiAyIDAgMCAwLTEuNzkgMS4xMXpcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI2XCIsXCJ5MVwiOlwiMTZcIixcIngyXCI6XCI2LjAxXCIsXCJ5MlwiOlwiMTZcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMFwiLFwieTFcIjpcIjE2XCIsXCJ4MlwiOlwiMTAuMDFcIixcInkyXCI6XCIxNlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUhhc2ggKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiNFwiLFwieTFcIjpcIjlcIixcIngyXCI6XCIyMFwiLFwieTJcIjpcIjlcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI0XCIsXCJ5MVwiOlwiMTVcIixcIngyXCI6XCIyMFwiLFwieTJcIjpcIjE1XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTBcIixcInkxXCI6XCIzXCIsXCJ4MlwiOlwiOFwiLFwieTJcIjpcIjIxXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTZcIixcInkxXCI6XCIzXCIsXCJ4MlwiOlwiMTRcIixcInkyXCI6XCIyMVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUhlYWRwaG9uZXMgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMyAxOHYtNmE5IDkgMCAwIDEgMTggMHY2XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjEgMTlhMiAyIDAgMCAxLTIgMmgtMWEyIDIgMCAwIDEtMi0ydi0zYTIgMiAwIDAgMSAyLTJoM3pNMyAxOWEyIDIgMCAwIDAgMiAyaDFhMiAyIDAgMCAwIDItMnYtM2EyIDIgMCAwIDAtMi0ySDN6XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpSGVhcnQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjAuODQgNC42MWE1LjUgNS41IDAgMCAwLTcuNzggMEwxMiA1LjY3bC0xLjA2LTEuMDZhNS41IDUuNSAwIDAgMC03Ljc4IDcuNzhsMS4wNiAxLjA2TDEyIDIxLjIzbDcuNzgtNy43OCAxLjA2LTEuMDZhNS41IDUuNSAwIDAgMCAwLTcuNzh6XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpSGVscENpcmNsZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNOS4wOSA5YTMgMyAwIDAgMSA1LjgzIDFjMCAyLTMgMy0zIDNcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjE3XCIsXCJ4MlwiOlwiMTIuMDFcIixcInkyXCI6XCIxN1wifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUhleGFnb24gKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjEgMTZWOGEyIDIgMCAwIDAtMS0xLjczbC03LTRhMiAyIDAgMCAwLTIgMGwtNyA0QTIgMiAwIDAgMCAzIDh2OGEyIDIgMCAwIDAgMSAxLjczbDcgNGEyIDIgMCAwIDAgMiAwbDctNEEyIDIgMCAwIDAgMjEgMTZ6XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpSG9tZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0zIDlsOS03IDkgN3YxMWEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnpcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjkgMjIgOSAxMiAxNSAxMiAxNSAyMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUltYWdlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiM1wiLFwieVwiOlwiM1wiLFwid2lkdGhcIjpcIjE4XCIsXCJoZWlnaHRcIjpcIjE4XCIsXCJyeFwiOlwiMlwiLFwicnlcIjpcIjJcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjguNVwiLFwiY3lcIjpcIjguNVwiLFwiclwiOlwiMS41XCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIyMSAxNSAxNiAxMCA1IDIxXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpSW5ib3ggKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIyMiAxMiAxNiAxMiAxNCAxNSAxMCAxNSA4IDEyIDIgMTJcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk01LjQ1IDUuMTFMMiAxMnY2YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMnYtNmwtMy40NS02Ljg5QTIgMiAwIDAgMCAxNi43NiA0SDcuMjRhMiAyIDAgMCAwLTEuNzkgMS4xMXpcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlJbmZvIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjE2XCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCIxMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiOFwiLFwieDJcIjpcIjEyLjAxXCIsXCJ5MlwiOlwiOFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUluc3RhZ3JhbSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicmVjdFwiLFwiYXR0clwiOntcInhcIjpcIjJcIixcInlcIjpcIjJcIixcIndpZHRoXCI6XCIyMFwiLFwiaGVpZ2h0XCI6XCIyMFwiLFwicnhcIjpcIjVcIixcInJ5XCI6XCI1XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTYgMTEuMzdBNCA0IDAgMSAxIDEyLjYzIDggNCA0IDAgMCAxIDE2IDExLjM3elwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE3LjVcIixcInkxXCI6XCI2LjVcIixcIngyXCI6XCIxNy41MVwiLFwieTJcIjpcIjYuNVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUl0YWxpYyAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxOVwiLFwieTFcIjpcIjRcIixcIngyXCI6XCIxMFwiLFwieTJcIjpcIjRcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNFwiLFwieTFcIjpcIjIwXCIsXCJ4MlwiOlwiNVwiLFwieTJcIjpcIjIwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTVcIixcInkxXCI6XCI0XCIsXCJ4MlwiOlwiOVwiLFwieTJcIjpcIjIwXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpS2V5IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTIxIDJsLTIgMm0tNy42MSA3LjYxYTUuNSA1LjUgMCAxIDEtNy43NzggNy43NzggNS41IDUuNSAwIDAgMSA3Ljc3Ny03Ljc3N3ptMCAwTDE1LjUgNy41bTAgMGwzIDNMMjIgN2wtMy0zbS0zLjUgMy41TDE5IDRcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlMYXllcnMgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlnb25cIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjEyIDIgMiA3IDEyIDEyIDIyIDcgMTIgMlwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMiAxNyAxMiAyMiAyMiAxN1wifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMiAxMiAxMiAxNyAyMiAxMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUxheW91dCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicmVjdFwiLFwiYXR0clwiOntcInhcIjpcIjNcIixcInlcIjpcIjNcIixcIndpZHRoXCI6XCIxOFwiLFwiaGVpZ2h0XCI6XCIxOFwiLFwicnhcIjpcIjJcIixcInJ5XCI6XCIyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiM1wiLFwieTFcIjpcIjlcIixcIngyXCI6XCIyMVwiLFwieTJcIjpcIjlcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI5XCIsXCJ5MVwiOlwiMjFcIixcIngyXCI6XCI5XCIsXCJ5MlwiOlwiOVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUxpZmVCdW95IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjRcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI0LjkzXCIsXCJ5MVwiOlwiNC45M1wiLFwieDJcIjpcIjkuMTdcIixcInkyXCI6XCI5LjE3XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTQuODNcIixcInkxXCI6XCIxNC44M1wiLFwieDJcIjpcIjE5LjA3XCIsXCJ5MlwiOlwiMTkuMDdcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNC44M1wiLFwieTFcIjpcIjkuMTdcIixcIngyXCI6XCIxOS4wN1wiLFwieTJcIjpcIjQuOTNcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNC44M1wiLFwieTFcIjpcIjkuMTdcIixcIngyXCI6XCIxOC4zNlwiLFwieTJcIjpcIjUuNjRcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI0LjkzXCIsXCJ5MVwiOlwiMTkuMDdcIixcIngyXCI6XCI5LjE3XCIsXCJ5MlwiOlwiMTQuODNcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlMaW5rMiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNSA3aDNhNSA1IDAgMCAxIDUgNSA1IDUgMCAwIDEtNSA1aC0zbS02IDBINmE1IDUgMCAwIDEtNS01IDUgNSAwIDAgMSA1LTVoM1wifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjhcIixcInkxXCI6XCIxMlwiLFwieDJcIjpcIjE2XCIsXCJ5MlwiOlwiMTJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlMaW5rIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTEwIDEzYTUgNSAwIDAgMCA3LjU0LjU0bDMtM2E1IDUgMCAwIDAtNy4wNy03LjA3bC0xLjcyIDEuNzFcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNCAxMWE1IDUgMCAwIDAtNy41NC0uNTRsLTMgM2E1IDUgMCAwIDAgNy4wNyA3LjA3bDEuNzEtMS43MVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUxpbmtlZGluIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE2IDhhNiA2IDAgMCAxIDYgNnY3aC00di03YTIgMiAwIDAgMC0yLTIgMiAyIDAgMCAwLTIgMnY3aC00di03YTYgNiAwIDAgMSA2LTZ6XCJ9fSx7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCIyXCIsXCJ5XCI6XCI5XCIsXCJ3aWR0aFwiOlwiNFwiLFwiaGVpZ2h0XCI6XCIxMlwifX0se1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiNFwiLFwiY3lcIjpcIjRcIixcInJcIjpcIjJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlMaXN0IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjhcIixcInkxXCI6XCI2XCIsXCJ4MlwiOlwiMjFcIixcInkyXCI6XCI2XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiOFwiLFwieTFcIjpcIjEyXCIsXCJ4MlwiOlwiMjFcIixcInkyXCI6XCIxMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjhcIixcInkxXCI6XCIxOFwiLFwieDJcIjpcIjIxXCIsXCJ5MlwiOlwiMThcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIzXCIsXCJ5MVwiOlwiNlwiLFwieDJcIjpcIjMuMDFcIixcInkyXCI6XCI2XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiM1wiLFwieTFcIjpcIjEyXCIsXCJ4MlwiOlwiMy4wMVwiLFwieTJcIjpcIjEyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiM1wiLFwieTFcIjpcIjE4XCIsXCJ4MlwiOlwiMy4wMVwiLFwieTJcIjpcIjE4XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpTG9hZGVyIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiMlwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiNlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiMThcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjIyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiNC45M1wiLFwieTFcIjpcIjQuOTNcIixcIngyXCI6XCI3Ljc2XCIsXCJ5MlwiOlwiNy43NlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE2LjI0XCIsXCJ5MVwiOlwiMTYuMjRcIixcIngyXCI6XCIxOS4wN1wiLFwieTJcIjpcIjE5LjA3XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMlwiLFwieTFcIjpcIjEyXCIsXCJ4MlwiOlwiNlwiLFwieTJcIjpcIjEyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMThcIixcInkxXCI6XCIxMlwiLFwieDJcIjpcIjIyXCIsXCJ5MlwiOlwiMTJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI0LjkzXCIsXCJ5MVwiOlwiMTkuMDdcIixcIngyXCI6XCI3Ljc2XCIsXCJ5MlwiOlwiMTYuMjRcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNi4yNFwiLFwieTFcIjpcIjcuNzZcIixcIngyXCI6XCIxOS4wN1wiLFwieTJcIjpcIjQuOTNcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlMb2NrIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiM1wiLFwieVwiOlwiMTFcIixcIndpZHRoXCI6XCIxOFwiLFwiaGVpZ2h0XCI6XCIxMVwiLFwicnhcIjpcIjJcIixcInJ5XCI6XCIyXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNNyAxMVY3YTUgNSAwIDAgMSAxMCAwdjRcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlMb2dJbiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNSAzaDRhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAyaC00XCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxMCAxNyAxNSAxMiAxMCA3XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTVcIixcInkxXCI6XCIxMlwiLFwieDJcIjpcIjNcIixcInkyXCI6XCIxMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaUxvZ091dCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk05IDIxSDVhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoNFwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTYgMTcgMjEgMTIgMTYgN1wifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjIxXCIsXCJ5MVwiOlwiMTJcIixcIngyXCI6XCI5XCIsXCJ5MlwiOlwiMTJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlNYWlsIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6XCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIyMiw2IDEyLDEzIDIsNlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaU1hcFBpbiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMSAxMGMwIDctOSAxMy05IDEzcy05LTYtOS0xM2E5IDkgMCAwIDEgMTggMHpcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTBcIixcInJcIjpcIjNcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlNYXAgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlnb25cIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjEgNiAxIDIyIDggMTggMTYgMjIgMjMgMTggMjMgMiAxNiA2IDggMiAxIDZcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI4XCIsXCJ5MVwiOlwiMlwiLFwieDJcIjpcIjhcIixcInkyXCI6XCIxOFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE2XCIsXCJ5MVwiOlwiNlwiLFwieDJcIjpcIjE2XCIsXCJ5MlwiOlwiMjJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlNYXhpbWl6ZTIgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxNSAzIDIxIDMgMjEgOVwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiOSAyMSAzIDIxIDMgMTVcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyMVwiLFwieTFcIjpcIjNcIixcIngyXCI6XCIxNFwiLFwieTJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiM1wiLFwieTFcIjpcIjIxXCIsXCJ4MlwiOlwiMTBcIixcInkyXCI6XCIxNFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaU1heGltaXplIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTggM0g1YTIgMiAwIDAgMC0yIDJ2M20xOCAwVjVhMiAyIDAgMCAwLTItMmgtM20wIDE4aDNhMiAyIDAgMCAwIDItMnYtM00zIDE2djNhMiAyIDAgMCAwIDIgMmgzXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpTWVoIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI4XCIsXCJ5MVwiOlwiMTVcIixcIngyXCI6XCIxNlwiLFwieTJcIjpcIjE1XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiOVwiLFwieTFcIjpcIjlcIixcIngyXCI6XCI5LjAxXCIsXCJ5MlwiOlwiOVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE1XCIsXCJ5MVwiOlwiOVwiLFwieDJcIjpcIjE1LjAxXCIsXCJ5MlwiOlwiOVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaU1lbnUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiM1wiLFwieTFcIjpcIjEyXCIsXCJ4MlwiOlwiMjFcIixcInkyXCI6XCIxMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjNcIixcInkxXCI6XCI2XCIsXCJ4MlwiOlwiMjFcIixcInkyXCI6XCI2XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiM1wiLFwieTFcIjpcIjE4XCIsXCJ4MlwiOlwiMjFcIixcInkyXCI6XCIxOFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaU1lc3NhZ2VDaXJjbGUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjEgMTEuNWE4LjM4IDguMzggMCAwIDEtLjkgMy44IDguNSA4LjUgMCAwIDEtNy42IDQuNyA4LjM4IDguMzggMCAwIDEtMy44LS45TDMgMjFsMS45LTUuN2E4LjM4IDguMzggMCAwIDEtLjktMy44IDguNSA4LjUgMCAwIDEgNC43LTcuNiA4LjM4IDguMzggMCAwIDEgMy44LS45aC41YTguNDggOC40OCAwIDAgMSA4IDh2LjV6XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpTWVzc2FnZVNxdWFyZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMSAxNWEyIDIgMCAwIDEtMiAySDdsLTQgNFY1YTIgMiAwIDAgMSAyLTJoMTRhMiAyIDAgMCAxIDIgMnpcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlNaWNPZmYgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMVwiLFwieTFcIjpcIjFcIixcIngyXCI6XCIyM1wiLFwieTJcIjpcIjIzXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNOSA5djNhMyAzIDAgMCAwIDUuMTIgMi4xMk0xNSA5LjM0VjRhMyAzIDAgMCAwLTUuOTQtLjZcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNyAxNi45NUE3IDcgMCAwIDEgNSAxMnYtMm0xNCAwdjJhNyA3IDAgMCAxLS4xMSAxLjIzXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIxOVwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMjNcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI4XCIsXCJ5MVwiOlwiMjNcIixcIngyXCI6XCIxNlwiLFwieTJcIjpcIjIzXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpTWljIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTEyIDFhMyAzIDAgMCAwLTMgM3Y4YTMgMyAwIDAgMCA2IDBWNGEzIDMgMCAwIDAtMy0zelwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE5IDEwdjJhNyA3IDAgMCAxLTE0IDB2LTJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjE5XCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCIyM1wifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjhcIixcInkxXCI6XCIyM1wiLFwieDJcIjpcIjE2XCIsXCJ5MlwiOlwiMjNcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlNaW5pbWl6ZTIgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCI0IDE0IDEwIDE0IDEwIDIwXCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIyMCAxMCAxNCAxMCAxNCA0XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTRcIixcInkxXCI6XCIxMFwiLFwieDJcIjpcIjIxXCIsXCJ5MlwiOlwiM1wifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjNcIixcInkxXCI6XCIyMVwiLFwieDJcIjpcIjEwXCIsXCJ5MlwiOlwiMTRcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlNaW5pbWl6ZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk04IDN2M2EyIDIgMCAwIDEtMiAySDNtMTggMGgtM2EyIDIgMCAwIDEtMi0yVjNtMCAxOHYtM2EyIDIgMCAwIDEgMi0yaDNNMyAxNmgzYTIgMiAwIDAgMSAyIDJ2M1wifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaU1pbnVzQ2lyY2xlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI4XCIsXCJ5MVwiOlwiMTJcIixcIngyXCI6XCIxNlwiLFwieTJcIjpcIjEyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpTWludXNTcXVhcmUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCIzXCIsXCJ5XCI6XCIzXCIsXCJ3aWR0aFwiOlwiMThcIixcImhlaWdodFwiOlwiMThcIixcInJ4XCI6XCIyXCIsXCJyeVwiOlwiMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjhcIixcInkxXCI6XCIxMlwiLFwieDJcIjpcIjE2XCIsXCJ5MlwiOlwiMTJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlNaW51cyAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI1XCIsXCJ5MVwiOlwiMTJcIixcIngyXCI6XCIxOVwiLFwieTJcIjpcIjEyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpTW9uaXRvciAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicmVjdFwiLFwiYXR0clwiOntcInhcIjpcIjJcIixcInlcIjpcIjNcIixcIndpZHRoXCI6XCIyMFwiLFwiaGVpZ2h0XCI6XCIxNFwiLFwicnhcIjpcIjJcIixcInJ5XCI6XCIyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiOFwiLFwieTFcIjpcIjIxXCIsXCJ4MlwiOlwiMTZcIixcInkyXCI6XCIyMVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiMTdcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjIxXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpTW9vbiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMSAxMi43OUE5IDkgMCAxIDEgMTEuMjEgMyA3IDcgMCAwIDAgMjEgMTIuNzl6XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpTW9yZUhvcml6b250YWwgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxMlwiLFwiY3lcIjpcIjEyXCIsXCJyXCI6XCIxXCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxOVwiLFwiY3lcIjpcIjEyXCIsXCJyXCI6XCIxXCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCI1XCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjFcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlNb3JlVmVydGljYWwgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxMlwiLFwiY3lcIjpcIjEyXCIsXCJyXCI6XCIxXCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxMlwiLFwiY3lcIjpcIjVcIixcInJcIjpcIjFcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTlcIixcInJcIjpcIjFcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlNb3VzZVBvaW50ZXIgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMyAzbDcuMDcgMTYuOTcgMi41MS03LjM5IDcuMzktMi41MUwzIDN6XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTMgMTNsNiA2XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpTW92ZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjUgOSAyIDEyIDUgMTVcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjkgNSAxMiAyIDE1IDVcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjE1IDE5IDEyIDIyIDkgMTlcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjE5IDkgMjIgMTIgMTkgMTVcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyXCIsXCJ5MVwiOlwiMTJcIixcIngyXCI6XCIyMlwiLFwieTJcIjpcIjEyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIyXCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCIyMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaU11c2ljIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTkgMThWNWwxMi0ydjEzXCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCI2XCIsXCJjeVwiOlwiMThcIixcInJcIjpcIjNcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjE4XCIsXCJjeVwiOlwiMTZcIixcInJcIjpcIjNcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlOYXZpZ2F0aW9uMiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWdvblwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTIgMiAxOSAyMSAxMiAxNyA1IDIxIDEyIDJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlOYXZpZ2F0aW9uIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5Z29uXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIzIDExIDIyIDIgMTMgMjEgMTEgMTMgMyAxMVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaU9jdGFnb24gKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlnb25cIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjcuODYgMiAxNi4xNCAyIDIyIDcuODYgMjIgMTYuMTQgMTYuMTQgMjIgNy44NiAyMiAyIDE2LjE0IDIgNy44NiA3Ljg2IDJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlQYWNrYWdlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE2LjVcIixcInkxXCI6XCI5LjRcIixcIngyXCI6XCI3LjVcIixcInkyXCI6XCI0LjIxXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjEgMTZWOGEyIDIgMCAwIDAtMS0xLjczbC03LTRhMiAyIDAgMCAwLTIgMGwtNyA0QTIgMiAwIDAgMCAzIDh2OGEyIDIgMCAwIDAgMSAxLjczbDcgNGEyIDIgMCAwIDAgMiAwbDctNEEyIDIgMCAwIDAgMjEgMTZ6XCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIzLjI3IDYuOTYgMTIgMTIuMDEgMjAuNzMgNi45NlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiMjIuMDhcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjEyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpUGFwZXJjbGlwIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTIxLjQ0IDExLjA1bC05LjE5IDkuMTlhNiA2IDAgMCAxLTguNDktOC40OWw5LjE5LTkuMTlhNCA0IDAgMCAxIDUuNjYgNS42NmwtOS4yIDkuMTlhMiAyIDAgMCAxLTIuODMtMi44M2w4LjQ5LTguNDhcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlQYXVzZUNpcmNsZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTBcIixcInkxXCI6XCIxNVwiLFwieDJcIjpcIjEwXCIsXCJ5MlwiOlwiOVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE0XCIsXCJ5MVwiOlwiMTVcIixcIngyXCI6XCIxNFwiLFwieTJcIjpcIjlcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlQYXVzZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicmVjdFwiLFwiYXR0clwiOntcInhcIjpcIjZcIixcInlcIjpcIjRcIixcIndpZHRoXCI6XCI0XCIsXCJoZWlnaHRcIjpcIjE2XCJ9fSx7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCIxNFwiLFwieVwiOlwiNFwiLFwid2lkdGhcIjpcIjRcIixcImhlaWdodFwiOlwiMTZcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlQZW5Ub29sIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTEyIDE5bDctNyAzIDMtNyA3LTMtM3pcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xOCAxM2wtMS41LTcuNUwyIDJsMy41IDE0LjVMMTMgMThsNS01elwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTIgMmw3LjU4NiA3LjU4NlwifX0se1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTFcIixcImN5XCI6XCIxMVwiLFwiclwiOlwiMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVBlcmNlbnQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTlcIixcInkxXCI6XCI1XCIsXCJ4MlwiOlwiNVwiLFwieTJcIjpcIjE5XCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCI2LjVcIixcImN5XCI6XCI2LjVcIixcInJcIjpcIjIuNVwifX0se1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTcuNVwiLFwiY3lcIjpcIjE3LjVcIixcInJcIjpcIjIuNVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVBob25lQ2FsbCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNS4wNSA1QTUgNSAwIDAgMSAxOSA4Ljk1TTE1LjA1IDFBOSA5IDAgMCAxIDIzIDguOTRtLTEgNy45OHYzYTIgMiAwIDAgMS0yLjE4IDIgMTkuNzkgMTkuNzkgMCAwIDEtOC42My0zLjA3IDE5LjUgMTkuNSAwIDAgMS02LTYgMTkuNzkgMTkuNzkgMCAwIDEtMy4wNy04LjY3QTIgMiAwIDAgMSA0LjExIDJoM2EyIDIgMCAwIDEgMiAxLjcyIDEyLjg0IDEyLjg0IDAgMCAwIC43IDIuODEgMiAyIDAgMCAxLS40NSAyLjExTDguMDkgOS45MWExNiAxNiAwIDAgMCA2IDZsMS4yNy0xLjI3YTIgMiAwIDAgMSAyLjExLS40NSAxMi44NCAxMi44NCAwIDAgMCAyLjgxLjdBMiAyIDAgMCAxIDIyIDE2LjkyelwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVBob25lRm9yd2FyZGVkIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTkgMSAyMyA1IDE5IDlcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNVwiLFwieTFcIjpcIjVcIixcIngyXCI6XCIyM1wiLFwieTJcIjpcIjVcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMiAxNi45MnYzYTIgMiAwIDAgMS0yLjE4IDIgMTkuNzkgMTkuNzkgMCAwIDEtOC42My0zLjA3IDE5LjUgMTkuNSAwIDAgMS02LTYgMTkuNzkgMTkuNzkgMCAwIDEtMy4wNy04LjY3QTIgMiAwIDAgMSA0LjExIDJoM2EyIDIgMCAwIDEgMiAxLjcyIDEyLjg0IDEyLjg0IDAgMCAwIC43IDIuODEgMiAyIDAgMCAxLS40NSAyLjExTDguMDkgOS45MWExNiAxNiAwIDAgMCA2IDZsMS4yNy0xLjI3YTIgMiAwIDAgMSAyLjExLS40NSAxMi44NCAxMi44NCAwIDAgMCAyLjgxLjdBMiAyIDAgMCAxIDIyIDE2LjkyelwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVBob25lSW5jb21pbmcgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxNiAyIDE2IDggMjIgOFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjIzXCIsXCJ5MVwiOlwiMVwiLFwieDJcIjpcIjE2XCIsXCJ5MlwiOlwiOFwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTIyIDE2LjkydjNhMiAyIDAgMCAxLTIuMTggMiAxOS43OSAxOS43OSAwIDAgMS04LjYzLTMuMDcgMTkuNSAxOS41IDAgMCAxLTYtNiAxOS43OSAxOS43OSAwIDAgMS0zLjA3LTguNjdBMiAyIDAgMCAxIDQuMTEgMmgzYTIgMiAwIDAgMSAyIDEuNzIgMTIuODQgMTIuODQgMCAwIDAgLjcgMi44MSAyIDIgMCAwIDEtLjQ1IDIuMTFMOC4wOSA5LjkxYTE2IDE2IDAgMCAwIDYgNmwxLjI3LTEuMjdhMiAyIDAgMCAxIDIuMTEtLjQ1IDEyLjg0IDEyLjg0IDAgMCAwIDIuODEuN0EyIDIgMCAwIDEgMjIgMTYuOTJ6XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpUGhvbmVNaXNzZWQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMjNcIixcInkxXCI6XCIxXCIsXCJ4MlwiOlwiMTdcIixcInkyXCI6XCI3XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTdcIixcInkxXCI6XCIxXCIsXCJ4MlwiOlwiMjNcIixcInkyXCI6XCI3XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjIgMTYuOTJ2M2EyIDIgMCAwIDEtMi4xOCAyIDE5Ljc5IDE5Ljc5IDAgMCAxLTguNjMtMy4wNyAxOS41IDE5LjUgMCAwIDEtNi02IDE5Ljc5IDE5Ljc5IDAgMCAxLTMuMDctOC42N0EyIDIgMCAwIDEgNC4xMSAyaDNhMiAyIDAgMCAxIDIgMS43MiAxMi44NCAxMi44NCAwIDAgMCAuNyAyLjgxIDIgMiAwIDAgMS0uNDUgMi4xMUw4LjA5IDkuOTFhMTYgMTYgMCAwIDAgNiA2bDEuMjctMS4yN2EyIDIgMCAwIDEgMi4xMS0uNDUgMTIuODQgMTIuODQgMCAwIDAgMi44MS43QTIgMiAwIDAgMSAyMiAxNi45MnpcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlQaG9uZU9mZiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xMC42OCAxMy4zMWExNiAxNiAwIDAgMCAzLjQxIDIuNmwxLjI3LTEuMjdhMiAyIDAgMCAxIDIuMTEtLjQ1IDEyLjg0IDEyLjg0IDAgMCAwIDIuODEuNyAyIDIgMCAwIDEgMS43MiAydjNhMiAyIDAgMCAxLTIuMTggMiAxOS43OSAxOS43OSAwIDAgMS04LjYzLTMuMDcgMTkuNDIgMTkuNDIgMCAwIDEtMy4zMy0yLjY3bS0yLjY3LTMuMzRhMTkuNzkgMTkuNzkgMCAwIDEtMy4wNy04LjYzQTIgMiAwIDAgMSA0LjExIDJoM2EyIDIgMCAwIDEgMiAxLjcyIDEyLjg0IDEyLjg0IDAgMCAwIC43IDIuODEgMiAyIDAgMCAxLS40NSAyLjExTDguMDkgOS45MVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjIzXCIsXCJ5MVwiOlwiMVwiLFwieDJcIjpcIjFcIixcInkyXCI6XCIyM1wifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVBob25lT3V0Z29pbmcgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIyMyA3IDIzIDEgMTcgMVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE2XCIsXCJ5MVwiOlwiOFwiLFwieDJcIjpcIjIzXCIsXCJ5MlwiOlwiMVwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTIyIDE2LjkydjNhMiAyIDAgMCAxLTIuMTggMiAxOS43OSAxOS43OSAwIDAgMS04LjYzLTMuMDcgMTkuNSAxOS41IDAgMCAxLTYtNiAxOS43OSAxOS43OSAwIDAgMS0zLjA3LTguNjdBMiAyIDAgMCAxIDQuMTEgMmgzYTIgMiAwIDAgMSAyIDEuNzIgMTIuODQgMTIuODQgMCAwIDAgLjcgMi44MSAyIDIgMCAwIDEtLjQ1IDIuMTFMOC4wOSA5LjkxYTE2IDE2IDAgMCAwIDYgNmwxLjI3LTEuMjdhMiAyIDAgMCAxIDIuMTEtLjQ1IDEyLjg0IDEyLjg0IDAgMCAwIDIuODEuN0EyIDIgMCAwIDEgMjIgMTYuOTJ6XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpUGhvbmUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjIgMTYuOTJ2M2EyIDIgMCAwIDEtMi4xOCAyIDE5Ljc5IDE5Ljc5IDAgMCAxLTguNjMtMy4wNyAxOS41IDE5LjUgMCAwIDEtNi02IDE5Ljc5IDE5Ljc5IDAgMCAxLTMuMDctOC42N0EyIDIgMCAwIDEgNC4xMSAyaDNhMiAyIDAgMCAxIDIgMS43MiAxMi44NCAxMi44NCAwIDAgMCAuNyAyLjgxIDIgMiAwIDAgMS0uNDUgMi4xMUw4LjA5IDkuOTFhMTYgMTYgMCAwIDAgNiA2bDEuMjctMS4yN2EyIDIgMCAwIDEgMi4xMS0uNDUgMTIuODQgMTIuODQgMCAwIDAgMi44MS43QTIgMiAwIDAgMSAyMiAxNi45MnpcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlQaWVDaGFydCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMS4yMSAxNS44OUExMCAxMCAwIDEgMSA4IDIuODNcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMiAxMkExMCAxMCAwIDAgMCAxMiAydjEwelwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVBsYXlDaXJjbGUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxMlwiLFwiY3lcIjpcIjEyXCIsXCJyXCI6XCIxMFwifX0se1widGFnXCI6XCJwb2x5Z29uXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxMCA4IDE2IDEyIDEwIDE2IDEwIDhcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlQbGF5IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5Z29uXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCI1IDMgMTkgMTIgNSAyMSA1IDNcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlQbHVzQ2lyY2xlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjhcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjE2XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiOFwiLFwieTFcIjpcIjEyXCIsXCJ4MlwiOlwiMTZcIixcInkyXCI6XCIxMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVBsdXNTcXVhcmUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCIzXCIsXCJ5XCI6XCIzXCIsXCJ3aWR0aFwiOlwiMThcIixcImhlaWdodFwiOlwiMThcIixcInJ4XCI6XCIyXCIsXCJyeVwiOlwiMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiOFwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMTZcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI4XCIsXCJ5MVwiOlwiMTJcIixcIngyXCI6XCIxNlwiLFwieTJcIjpcIjEyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpUGx1cyAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjVcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjE5XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiNVwiLFwieTFcIjpcIjEyXCIsXCJ4MlwiOlwiMTlcIixcInkyXCI6XCIxMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVBvY2tldCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk00IDNoMTZhMiAyIDAgMCAxIDIgMnY2YTEwIDEwIDAgMCAxLTEwIDEwQTEwIDEwIDAgMCAxIDIgMTFWNWEyIDIgMCAwIDEgMi0yelwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiOCAxMCAxMiAxNCAxNiAxMFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVBvd2VyIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE4LjM2IDYuNjRhOSA5IDAgMSAxLTEyLjczIDBcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjJcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjEyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpUHJpbnRlciAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjYgOSA2IDIgMTggMiAxOCA5XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNNiAxOEg0YTIgMiAwIDAgMS0yLTJ2LTVhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAydjVhMiAyIDAgMCAxLTIgMmgtMlwifX0se1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiNlwiLFwieVwiOlwiMTRcIixcIndpZHRoXCI6XCIxMlwiLFwiaGVpZ2h0XCI6XCI4XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpUmFkaW8gKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxMlwiLFwiY3lcIjpcIjEyXCIsXCJyXCI6XCIyXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTYuMjQgNy43NmE2IDYgMCAwIDEgMCA4LjQ5bS04LjQ4LS4wMWE2IDYgMCAwIDEgMC04LjQ5bTExLjMxLTIuODJhMTAgMTAgMCAwIDEgMCAxNC4xNG0tMTQuMTQgMGExMCAxMCAwIDAgMSAwLTE0LjE0XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpUmVmcmVzaENjdyAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjEgNCAxIDEwIDcgMTBcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjIzIDIwIDIzIDE0IDE3IDE0XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjAuNDkgOUE5IDkgMCAwIDAgNS42NCA1LjY0TDEgMTBtMjIgNGwtNC42NCA0LjM2QTkgOSAwIDAgMSAzLjUxIDE1XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpUmVmcmVzaEN3IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMjMgNCAyMyAxMCAxNyAxMFwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMSAyMCAxIDE0IDcgMTRcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0zLjUxIDlhOSA5IDAgMCAxIDE0Ljg1LTMuMzZMMjMgMTBNMSAxNGw0LjY0IDQuMzZBOSA5IDAgMCAwIDIwLjQ5IDE1XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpUmVwZWF0IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTcgMSAyMSA1IDE3IDlcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0zIDExVjlhNCA0IDAgMCAxIDQtNGgxNFwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiNyAyMyAzIDE5IDcgMTVcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMSAxM3YyYTQgNCAwIDAgMS00IDRIM1wifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVJld2luZCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWdvblwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTEgMTkgMiAxMiAxMSA1IDExIDE5XCJ9fSx7XCJ0YWdcIjpcInBvbHlnb25cIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjIyIDE5IDEzIDEyIDIyIDUgMjIgMTlcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlSb3RhdGVDY3cgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxIDQgMSAxMCA3IDEwXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMy41MSAxNWE5IDkgMCAxIDAgMi4xMy05LjM2TDEgMTBcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlSb3RhdGVDdyAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjIzIDQgMjMgMTAgMTcgMTBcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMC40OSAxNWE5IDkgMCAxIDEtMi4xMi05LjM2TDIzIDEwXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpUnNzIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTQgMTFhOSA5IDAgMCAxIDkgOVwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTQgNGExNiAxNiAwIDAgMSAxNiAxNlwifX0se1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiNVwiLFwiY3lcIjpcIjE5XCIsXCJyXCI6XCIxXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpU2F2ZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xOSAyMUg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDExbDUgNXYxMWEyIDIgMCAwIDEtMiAyelwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTcgMjEgMTcgMTMgNyAxMyA3IDIxXCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCI3IDMgNyA4IDE1IDhcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlTY2lzc29ycyAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjZcIixcImN5XCI6XCI2XCIsXCJyXCI6XCIzXCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCI2XCIsXCJjeVwiOlwiMThcIixcInJcIjpcIjNcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyMFwiLFwieTFcIjpcIjRcIixcIngyXCI6XCI4LjEyXCIsXCJ5MlwiOlwiMTUuODhcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNC40N1wiLFwieTFcIjpcIjE0LjQ4XCIsXCJ4MlwiOlwiMjBcIixcInkyXCI6XCIyMFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjguMTJcIixcInkxXCI6XCI4LjEyXCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCIxMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVNlYXJjaCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjExXCIsXCJjeVwiOlwiMTFcIixcInJcIjpcIjhcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyMVwiLFwieTFcIjpcIjIxXCIsXCJ4MlwiOlwiMTYuNjVcIixcInkyXCI6XCIxNi42NVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVNlbmQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMjJcIixcInkxXCI6XCIyXCIsXCJ4MlwiOlwiMTFcIixcInkyXCI6XCIxM1wifX0se1widGFnXCI6XCJwb2x5Z29uXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIyMiAyIDE1IDIyIDExIDEzIDIgOSAyMiAyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpU2VydmVyIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiMlwiLFwieVwiOlwiMlwiLFwid2lkdGhcIjpcIjIwXCIsXCJoZWlnaHRcIjpcIjhcIixcInJ4XCI6XCIyXCIsXCJyeVwiOlwiMlwifX0se1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiMlwiLFwieVwiOlwiMTRcIixcIndpZHRoXCI6XCIyMFwiLFwiaGVpZ2h0XCI6XCI4XCIsXCJyeFwiOlwiMlwiLFwicnlcIjpcIjJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI2XCIsXCJ5MVwiOlwiNlwiLFwieDJcIjpcIjYuMDFcIixcInkyXCI6XCI2XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiNlwiLFwieTFcIjpcIjE4XCIsXCJ4MlwiOlwiNi4wMVwiLFwieTJcIjpcIjE4XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpU2V0dGluZ3MgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxMlwiLFwiY3lcIjpcIjEyXCIsXCJyXCI6XCIzXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTkuNCAxNWExLjY1IDEuNjUgMCAwIDAgLjMzIDEuODJsLjA2LjA2YTIgMiAwIDAgMSAwIDIuODMgMiAyIDAgMCAxLTIuODMgMGwtLjA2LS4wNmExLjY1IDEuNjUgMCAwIDAtMS44Mi0uMzMgMS42NSAxLjY1IDAgMCAwLTEgMS41MVYyMWEyIDIgMCAwIDEtMiAyIDIgMiAwIDAgMS0yLTJ2LS4wOUExLjY1IDEuNjUgMCAwIDAgOSAxOS40YTEuNjUgMS42NSAwIDAgMC0xLjgyLjMzbC0uMDYuMDZhMiAyIDAgMCAxLTIuODMgMCAyIDIgMCAwIDEgMC0yLjgzbC4wNi0uMDZhMS42NSAxLjY1IDAgMCAwIC4zMy0xLjgyIDEuNjUgMS42NSAwIDAgMC0xLjUxLTFIM2EyIDIgMCAwIDEtMi0yIDIgMiAwIDAgMSAyLTJoLjA5QTEuNjUgMS42NSAwIDAgMCA0LjYgOWExLjY1IDEuNjUgMCAwIDAtLjMzLTEuODJsLS4wNi0uMDZhMiAyIDAgMCAxIDAtMi44MyAyIDIgMCAwIDEgMi44MyAwbC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMS44Mi4zM0g5YTEuNjUgMS42NSAwIDAgMCAxLTEuNTFWM2EyIDIgMCAwIDEgMi0yIDIgMiAwIDAgMSAyIDJ2LjA5YTEuNjUgMS42NSAwIDAgMCAxIDEuNTEgMS42NSAxLjY1IDAgMCAwIDEuODItLjMzbC4wNi0uMDZhMiAyIDAgMCAxIDIuODMgMCAyIDIgMCAwIDEgMCAyLjgzbC0uMDYuMDZhMS42NSAxLjY1IDAgMCAwLS4zMyAxLjgyVjlhMS42NSAxLjY1IDAgMCAwIDEuNTEgMUgyMWEyIDIgMCAwIDEgMiAyIDIgMiAwIDAgMS0yIDJoLS4wOWExLjY1IDEuNjUgMCAwIDAtMS41MSAxelwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVNoYXJlMiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjE4XCIsXCJjeVwiOlwiNVwiLFwiclwiOlwiM1wifX0se1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiNlwiLFwiY3lcIjpcIjEyXCIsXCJyXCI6XCIzXCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxOFwiLFwiY3lcIjpcIjE5XCIsXCJyXCI6XCIzXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiOC41OVwiLFwieTFcIjpcIjEzLjUxXCIsXCJ4MlwiOlwiMTUuNDJcIixcInkyXCI6XCIxNy40OVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE1LjQxXCIsXCJ5MVwiOlwiNi41MVwiLFwieDJcIjpcIjguNTlcIixcInkyXCI6XCIxMC40OVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVNoYXJlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTQgMTJ2OGEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJ2LThcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjE2IDYgMTIgMiA4IDZcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjJcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjE1XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpU2hpZWxkT2ZmIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE5LjY5IDE0YTYuOSA2LjkgMCAwIDAgLjMxLTJWNWwtOC0zLTMuMTYgMS4xOFwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTQuNzMgNC43M0w0IDV2N2MwIDYgOCAxMCA4IDEwYTIwLjI5IDIwLjI5IDAgMCAwIDUuNjItNC4zOFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjFcIixcInkxXCI6XCIxXCIsXCJ4MlwiOlwiMjNcIixcInkyXCI6XCIyM1wifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVNoaWVsZCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xMiAyMnM4LTQgOC0xMFY1bC04LTMtOCAzdjdjMCA2IDggMTAgOCAxMHpcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlTaG9wcGluZ0JhZyAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk02IDJMMyA2djE0YTIgMiAwIDAgMCAyIDJoMTRhMiAyIDAgMCAwIDItMlY2bC0zLTR6XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiM1wiLFwieTFcIjpcIjZcIixcIngyXCI6XCIyMVwiLFwieTJcIjpcIjZcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNiAxMGE0IDQgMCAwIDEtOCAwXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpU2hvcHBpbmdDYXJ0IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiOVwiLFwiY3lcIjpcIjIxXCIsXCJyXCI6XCIxXCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIyMFwiLFwiY3lcIjpcIjIxXCIsXCJyXCI6XCIxXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMSAxaDRsMi42OCAxMy4zOWEyIDIgMCAwIDAgMiAxLjYxaDkuNzJhMiAyIDAgMCAwIDItMS42MUwyMyA2SDZcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlTaHVmZmxlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTYgMyAyMSAzIDIxIDhcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI0XCIsXCJ5MVwiOlwiMjBcIixcIngyXCI6XCIyMVwiLFwieTJcIjpcIjNcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjIxIDE2IDIxIDIxIDE2IDIxXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTVcIixcInkxXCI6XCIxNVwiLFwieDJcIjpcIjIxXCIsXCJ5MlwiOlwiMjFcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI0XCIsXCJ5MVwiOlwiNFwiLFwieDJcIjpcIjlcIixcInkyXCI6XCI5XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpU2lkZWJhciAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicmVjdFwiLFwiYXR0clwiOntcInhcIjpcIjNcIixcInlcIjpcIjNcIixcIndpZHRoXCI6XCIxOFwiLFwiaGVpZ2h0XCI6XCIxOFwiLFwicnhcIjpcIjJcIixcInJ5XCI6XCIyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiOVwiLFwieTFcIjpcIjNcIixcIngyXCI6XCI5XCIsXCJ5MlwiOlwiMjFcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlTa2lwQmFjayAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWdvblwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTkgMjAgOSAxMiAxOSA0IDE5IDIwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiNVwiLFwieTFcIjpcIjE5XCIsXCJ4MlwiOlwiNVwiLFwieTJcIjpcIjVcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlTa2lwRm9yd2FyZCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWdvblwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiNSA0IDE1IDEyIDUgMjAgNSA0XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTlcIixcInkxXCI6XCI1XCIsXCJ4MlwiOlwiMTlcIixcInkyXCI6XCIxOVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVNsYWNrIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE0LjUgMTBjLS44MyAwLTEuNS0uNjctMS41LTEuNXYtNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNXY1YzAgLjgzLS42NyAxLjUtMS41IDEuNXpcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMC41IDEwSDE5VjguNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNOS41IDE0Yy44MyAwIDEuNS42NyAxLjUgMS41djVjMCAuODMtLjY3IDEuNS0xLjUgMS41UzggMjEuMzMgOCAyMC41di01YzAtLjgzLjY3LTEuNSAxLjUtMS41elwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTMuNSAxNEg1djEuNWMwIC44My0uNjcgMS41LTEuNSAxLjVTMiAxNi4zMyAyIDE1LjUgMi42NyAxNCAzLjUgMTR6XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTQgMTQuNWMwLS44My42Ny0xLjUgMS41LTEuNWg1Yy44MyAwIDEuNS42NyAxLjUgMS41cy0uNjcgMS41LTEuNSAxLjVoLTVjLS44MyAwLTEuNS0uNjctMS41LTEuNXpcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNS41IDE5SDE0djEuNWMwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41elwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTEwIDkuNUMxMCA4LjY3IDkuMzMgOCA4LjUgOGgtNUMyLjY3IDggMiA4LjY3IDIgOS41UzIuNjcgMTEgMy41IDExaDVjLjgzIDAgMS41LS42NyAxLjUtMS41elwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTguNSA1SDEwVjMuNUMxMCAyLjY3IDkuMzMgMiA4LjUgMlM3IDIuNjcgNyAzLjUgNy42NyA1IDguNSA1elwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVNsYXNoIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI0LjkzXCIsXCJ5MVwiOlwiNC45M1wiLFwieDJcIjpcIjE5LjA3XCIsXCJ5MlwiOlwiMTkuMDdcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlTbGlkZXJzIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjRcIixcInkxXCI6XCIyMVwiLFwieDJcIjpcIjRcIixcInkyXCI6XCIxNFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjRcIixcInkxXCI6XCIxMFwiLFwieDJcIjpcIjRcIixcInkyXCI6XCIzXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIyMVwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMTJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjhcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjNcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyMFwiLFwieTFcIjpcIjIxXCIsXCJ4MlwiOlwiMjBcIixcInkyXCI6XCIxNlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjIwXCIsXCJ5MVwiOlwiMTJcIixcIngyXCI6XCIyMFwiLFwieTJcIjpcIjNcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxXCIsXCJ5MVwiOlwiMTRcIixcIngyXCI6XCI3XCIsXCJ5MlwiOlwiMTRcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI5XCIsXCJ5MVwiOlwiOFwiLFwieDJcIjpcIjE1XCIsXCJ5MlwiOlwiOFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE3XCIsXCJ5MVwiOlwiMTZcIixcIngyXCI6XCIyM1wiLFwieTJcIjpcIjE2XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpU21hcnRwaG9uZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicmVjdFwiLFwiYXR0clwiOntcInhcIjpcIjVcIixcInlcIjpcIjJcIixcIndpZHRoXCI6XCIxNFwiLFwiaGVpZ2h0XCI6XCIyMFwiLFwicnhcIjpcIjJcIixcInJ5XCI6XCIyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIxOFwiLFwieDJcIjpcIjEyLjAxXCIsXCJ5MlwiOlwiMThcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlTbWlsZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTJcIixcInJcIjpcIjEwXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNOCAxNHMxLjUgMiA0IDIgNC0yIDQtMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjlcIixcInkxXCI6XCI5XCIsXCJ4MlwiOlwiOS4wMVwiLFwieTJcIjpcIjlcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNVwiLFwieTFcIjpcIjlcIixcIngyXCI6XCIxNS4wMVwiLFwieTJcIjpcIjlcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlTcGVha2VyIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiNFwiLFwieVwiOlwiMlwiLFwid2lkdGhcIjpcIjE2XCIsXCJoZWlnaHRcIjpcIjIwXCIsXCJyeFwiOlwiMlwiLFwicnlcIjpcIjJcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiMTRcIixcInJcIjpcIjRcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjZcIixcIngyXCI6XCIxMi4wMVwiLFwieTJcIjpcIjZcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlTcXVhcmUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCIzXCIsXCJ5XCI6XCIzXCIsXCJ3aWR0aFwiOlwiMThcIixcImhlaWdodFwiOlwiMThcIixcInJ4XCI6XCIyXCIsXCJyeVwiOlwiMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVN0YXIgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlnb25cIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjEyIDIgMTUuMDkgOC4yNiAyMiA5LjI3IDE3IDE0LjE0IDE4LjE4IDIxLjAyIDEyIDE3Ljc3IDUuODIgMjEuMDIgNyAxNC4xNCAyIDkuMjcgOC45MSA4LjI2IDEyIDJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlTdG9wQ2lyY2xlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19LHtcInRhZ1wiOlwicmVjdFwiLFwiYXR0clwiOntcInhcIjpcIjlcIixcInlcIjpcIjlcIixcIndpZHRoXCI6XCI2XCIsXCJoZWlnaHRcIjpcIjZcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlTdW4gKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxMlwiLFwiY3lcIjpcIjEyXCIsXCJyXCI6XCI1XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIxXCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCIzXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIyMVwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMjNcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI0LjIyXCIsXCJ5MVwiOlwiNC4yMlwiLFwieDJcIjpcIjUuNjRcIixcInkyXCI6XCI1LjY0XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTguMzZcIixcInkxXCI6XCIxOC4zNlwiLFwieDJcIjpcIjE5Ljc4XCIsXCJ5MlwiOlwiMTkuNzhcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxXCIsXCJ5MVwiOlwiMTJcIixcIngyXCI6XCIzXCIsXCJ5MlwiOlwiMTJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyMVwiLFwieTFcIjpcIjEyXCIsXCJ4MlwiOlwiMjNcIixcInkyXCI6XCIxMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjQuMjJcIixcInkxXCI6XCIxOS43OFwiLFwieDJcIjpcIjUuNjRcIixcInkyXCI6XCIxOC4zNlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE4LjM2XCIsXCJ5MVwiOlwiNS42NFwiLFwieDJcIjpcIjE5Ljc4XCIsXCJ5MlwiOlwiNC4yMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVN1bnJpc2UgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTcgMThhNSA1IDAgMCAwLTEwIDBcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjJcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjlcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI0LjIyXCIsXCJ5MVwiOlwiMTAuMjJcIixcIngyXCI6XCI1LjY0XCIsXCJ5MlwiOlwiMTEuNjRcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxXCIsXCJ5MVwiOlwiMThcIixcIngyXCI6XCIzXCIsXCJ5MlwiOlwiMThcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyMVwiLFwieTFcIjpcIjE4XCIsXCJ4MlwiOlwiMjNcIixcInkyXCI6XCIxOFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE4LjM2XCIsXCJ5MVwiOlwiMTEuNjRcIixcIngyXCI6XCIxOS43OFwiLFwieTJcIjpcIjEwLjIyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMjNcIixcInkxXCI6XCIyMlwiLFwieDJcIjpcIjFcIixcInkyXCI6XCIyMlwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiOCA2IDEyIDIgMTYgNlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVN1bnNldCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNyAxOGE1IDUgMCAwIDAtMTAgMFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiOVwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjQuMjJcIixcInkxXCI6XCIxMC4yMlwiLFwieDJcIjpcIjUuNjRcIixcInkyXCI6XCIxMS42NFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjFcIixcInkxXCI6XCIxOFwiLFwieDJcIjpcIjNcIixcInkyXCI6XCIxOFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjIxXCIsXCJ5MVwiOlwiMThcIixcIngyXCI6XCIyM1wiLFwieTJcIjpcIjE4XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTguMzZcIixcInkxXCI6XCIxMS42NFwiLFwieDJcIjpcIjE5Ljc4XCIsXCJ5MlwiOlwiMTAuMjJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyM1wiLFwieTFcIjpcIjIyXCIsXCJ4MlwiOlwiMVwiLFwieTJcIjpcIjIyXCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxNiA1IDEyIDkgOCA1XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpVGFibGV0IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiNFwiLFwieVwiOlwiMlwiLFwid2lkdGhcIjpcIjE2XCIsXCJoZWlnaHRcIjpcIjIwXCIsXCJyeFwiOlwiMlwiLFwicnlcIjpcIjJcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjE4XCIsXCJ4MlwiOlwiMTIuMDFcIixcInkyXCI6XCIxOFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVRhZyAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMC41OSAxMy40MWwtNy4xNyA3LjE3YTIgMiAwIDAgMS0yLjgzIDBMMiAxMlYyaDEwbDguNTkgOC41OWEyIDIgMCAwIDEgMCAyLjgyelwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjdcIixcInkxXCI6XCI3XCIsXCJ4MlwiOlwiNy4wMVwiLFwieTJcIjpcIjdcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlUYXJnZXQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxMlwiLFwiY3lcIjpcIjEyXCIsXCJyXCI6XCIxMFwifX0se1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiNlwifX0se1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVRlcm1pbmFsIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiNCAxNyAxMCAxMSA0IDVcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxMlwiLFwieTFcIjpcIjE5XCIsXCJ4MlwiOlwiMjBcIixcInkyXCI6XCIxOVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVRoZXJtb21ldGVyIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE0IDE0Ljc2VjMuNWEyLjUgMi41IDAgMCAwLTUgMHYxMS4yNmE0LjUgNC41IDAgMSAwIDUgMHpcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlUaHVtYnNEb3duIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTEwIDE1djRhMyAzIDAgMCAwIDMgM2w0LTlWMkg1LjcyYTIgMiAwIDAgMC0yIDEuN2wtMS4zOCA5YTIgMiAwIDAgMCAyIDIuM3ptNy0xM2gyLjY3QTIuMzEgMi4zMSAwIDAgMSAyMiA0djdhMi4zMSAyLjMxIDAgMCAxLTIuMzMgMkgxN1wifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVRodW1ic1VwIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoM1wifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVRvZ2dsZUxlZnQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCIxXCIsXCJ5XCI6XCI1XCIsXCJ3aWR0aFwiOlwiMjJcIixcImhlaWdodFwiOlwiMTRcIixcInJ4XCI6XCI3XCIsXCJyeVwiOlwiN1wifX0se1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiOFwiLFwiY3lcIjpcIjEyXCIsXCJyXCI6XCIzXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpVG9nZ2xlUmlnaHQgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCIxXCIsXCJ5XCI6XCI1XCIsXCJ3aWR0aFwiOlwiMjJcIixcImhlaWdodFwiOlwiMTRcIixcInJ4XCI6XCI3XCIsXCJyeVwiOlwiN1wifX0se1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTZcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiM1wifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVRvb2wgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTQuNyA2LjNhMSAxIDAgMCAwIDAgMS40bDEuNiAxLjZhMSAxIDAgMCAwIDEuNCAwbDMuNzctMy43N2E2IDYgMCAwIDEtNy45NCA3Ljk0bC02LjkxIDYuOTFhMi4xMiAyLjEyIDAgMCAxLTMtM2w2LjkxLTYuOTFhNiA2IDAgMCAxIDcuOTQtNy45NGwtMy43NiAzLjc2elwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVRyYXNoMiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjMgNiA1IDYgMjEgNlwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE5IDZ2MTRhMiAyIDAgMCAxLTIgMkg3YTIgMiAwIDAgMS0yLTJWNm0zIDBWNGEyIDIgMCAwIDEgMi0yaDRhMiAyIDAgMCAxIDIgMnYyXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTBcIixcInkxXCI6XCIxMVwiLFwieDJcIjpcIjEwXCIsXCJ5MlwiOlwiMTdcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNFwiLFwieTFcIjpcIjExXCIsXCJ4MlwiOlwiMTRcIixcInkyXCI6XCIxN1wifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVRyYXNoIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMyA2IDUgNiAyMSA2XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTkgNnYxNGEyIDIgMCAwIDEtMiAySDdhMiAyIDAgMCAxLTItMlY2bTMgMFY0YTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAydjJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlUcmVsbG8gKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCIzXCIsXCJ5XCI6XCIzXCIsXCJ3aWR0aFwiOlwiMThcIixcImhlaWdodFwiOlwiMThcIixcInJ4XCI6XCIyXCIsXCJyeVwiOlwiMlwifX0se1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiN1wiLFwieVwiOlwiN1wiLFwid2lkdGhcIjpcIjNcIixcImhlaWdodFwiOlwiOVwifX0se1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiMTRcIixcInlcIjpcIjdcIixcIndpZHRoXCI6XCIzXCIsXCJoZWlnaHRcIjpcIjVcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlUcmVuZGluZ0Rvd24gKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIyMyAxOCAxMy41IDguNSA4LjUgMTMuNSAxIDZcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjE3IDE4IDIzIDE4IDIzIDEyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpVHJlbmRpbmdVcCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjIzIDYgMTMuNSAxNS41IDguNSAxMC41IDEgMThcIn19LHtcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjE3IDYgMjMgNiAyMyAxMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVRyaWFuZ2xlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTEwLjI5IDMuODZMMS44MiAxOGEyIDIgMCAwIDAgMS43MSAzaDE2Ljk0YTIgMiAwIDAgMCAxLjcxLTNMMTMuNzEgMy44NmEyIDIgMCAwIDAtMy40MiAwelwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVRydWNrIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiMVwiLFwieVwiOlwiM1wiLFwid2lkdGhcIjpcIjE1XCIsXCJoZWlnaHRcIjpcIjEzXCJ9fSx7XCJ0YWdcIjpcInBvbHlnb25cIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjE2IDggMjAgOCAyMyAxMSAyMyAxNiAxNiAxNiAxNiA4XCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCI1LjVcIixcImN5XCI6XCIxOC41XCIsXCJyXCI6XCIyLjVcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjE4LjVcIixcImN5XCI6XCIxOC41XCIsXCJyXCI6XCIyLjVcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlUdiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicmVjdFwiLFwiYXR0clwiOntcInhcIjpcIjJcIixcInlcIjpcIjdcIixcIndpZHRoXCI6XCIyMFwiLFwiaGVpZ2h0XCI6XCIxNVwiLFwicnhcIjpcIjJcIixcInJ5XCI6XCIyXCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxNyAyIDEyIDcgNyAyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpVHdpdGNoIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTIxIDJIM3YxNmg1djRsNC00aDVsNC00VjJ6bS0xMCA5VjdtNSA0VjdcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlUd2l0dGVyIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTIzIDNhMTAuOSAxMC45IDAgMCAxLTMuMTQgMS41MyA0LjQ4IDQuNDggMCAwIDAtNy44NiAzdjFBMTAuNjYgMTAuNjYgMCAwIDEgMyA0cy00IDkgNSAxM2ExMS42NCAxMS42NCAwIDAgMS03IDJjOSA1IDIwIDAgMjAtMTEuNWE0LjUgNC41IDAgMCAwLS4wOC0uODNBNy43MiA3LjcyIDAgMCAwIDIzIDN6XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpVHlwZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjQgNyA0IDQgMjAgNCAyMCA3XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiOVwiLFwieTFcIjpcIjIwXCIsXCJ4MlwiOlwiMTVcIixcInkyXCI6XCIyMFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiNFwiLFwieDJcIjpcIjEyXCIsXCJ5MlwiOlwiMjBcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlVbWJyZWxsYSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMyAxMmExMS4wNSAxMS4wNSAwIDAgMC0yMiAwem0tNSA3YTMgMyAwIDAgMS02IDB2LTdcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlVbmRlcmxpbmUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNNiAzdjdhNiA2IDAgMCAwIDYgNiA2IDYgMCAwIDAgNi02VjNcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI0XCIsXCJ5MVwiOlwiMjFcIixcIngyXCI6XCIyMFwiLFwieTJcIjpcIjIxXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpVW5sb2NrIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJyZWN0XCIsXCJhdHRyXCI6e1wieFwiOlwiM1wiLFwieVwiOlwiMTFcIixcIndpZHRoXCI6XCIxOFwiLFwiaGVpZ2h0XCI6XCIxMVwiLFwicnhcIjpcIjJcIixcInJ5XCI6XCIyXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNNyAxMVY3YTUgNSAwIDAgMSA5LjktMVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVVwbG9hZENsb3VkIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTYgMTYgMTIgMTIgOCAxNlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjEyXCIsXCJ5MVwiOlwiMTJcIixcIngyXCI6XCIxMlwiLFwieTJcIjpcIjIxXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjAuMzkgMTguMzlBNSA1IDAgMCAwIDE4IDloLTEuMjZBOCA4IDAgMSAwIDMgMTYuM1wifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTYgMTYgMTIgMTIgOCAxNlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVVwbG9hZCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00XCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxNyA4IDEyIDMgNyA4XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIzXCIsXCJ4MlwiOlwiMTJcIixcInkyXCI6XCIxNVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVVzZXJDaGVjayAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNiAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyXCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCI4LjVcIixcImN5XCI6XCI3XCIsXCJyXCI6XCI0XCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxNyAxMSAxOSAxMyAyMyA5XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpVXNlck1pbnVzIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE2IDIxdi0yYTQgNCAwIDAgMC00LTRINWE0IDQgMCAwIDAtNCA0djJcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjguNVwiLFwiY3lcIjpcIjdcIixcInJcIjpcIjRcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyM1wiLFwieTFcIjpcIjExXCIsXCJ4MlwiOlwiMTdcIixcInkyXCI6XCIxMVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVVzZXJQbHVzIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE2IDIxdi0yYTQgNCAwIDAgMC00LTRINWE0IDQgMCAwIDAtNCA0djJcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjguNVwiLFwiY3lcIjpcIjdcIixcInJcIjpcIjRcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIyMFwiLFwieTFcIjpcIjhcIixcIngyXCI6XCIyMFwiLFwieTJcIjpcIjE0XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMjNcIixcInkxXCI6XCIxMVwiLFwieDJcIjpcIjE3XCIsXCJ5MlwiOlwiMTFcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlVc2VyWCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNiAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyXCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCI4LjVcIixcImN5XCI6XCI3XCIsXCJyXCI6XCI0XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMThcIixcInkxXCI6XCI4XCIsXCJ4MlwiOlwiMjNcIixcInkyXCI6XCIxM1wifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjIzXCIsXCJ5MVwiOlwiOFwiLFwieDJcIjpcIjE4XCIsXCJ5MlwiOlwiMTNcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlVc2VyIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTIwIDIxdi0yYTQgNCAwIDAgMC00LTRIOGE0IDQgMCAwIDAtNCA0djJcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjEyXCIsXCJjeVwiOlwiN1wiLFwiclwiOlwiNFwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVVzZXJzIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE3IDIxdi0yYTQgNCAwIDAgMC00LTRINWE0IDQgMCAwIDAtNCA0djJcIn19LHtcInRhZ1wiOlwiY2lyY2xlXCIsXCJhdHRyXCI6e1wiY3hcIjpcIjlcIixcImN5XCI6XCI3XCIsXCJyXCI6XCI0XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N1wifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE2IDMuMTNhNCA0IDAgMCAxIDAgNy43NVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVZpZGVvT2ZmIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTE2IDE2djFhMiAyIDAgMCAxLTIgMkgzYTIgMiAwIDAgMS0yLTJWN2EyIDIgMCAwIDEgMi0yaDJtNS42NiAwSDE0YTIgMiAwIDAgMSAyIDJ2My4zNGwxIDFMMjMgN3YxMFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjFcIixcInkxXCI6XCIxXCIsXCJ4MlwiOlwiMjNcIixcInkyXCI6XCIyM1wifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVZpZGVvIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5Z29uXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIyMyA3IDE2IDEyIDIzIDE3IDIzIDdcIn19LHtcInRhZ1wiOlwicmVjdFwiLFwiYXR0clwiOntcInhcIjpcIjFcIixcInlcIjpcIjVcIixcIndpZHRoXCI6XCIxNVwiLFwiaGVpZ2h0XCI6XCIxNFwiLFwicnhcIjpcIjJcIixcInJ5XCI6XCIyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpVm9pY2VtYWlsIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiNS41XCIsXCJjeVwiOlwiMTEuNVwiLFwiclwiOlwiNC41XCJ9fSx7XCJ0YWdcIjpcImNpcmNsZVwiLFwiYXR0clwiOntcImN4XCI6XCIxOC41XCIsXCJjeVwiOlwiMTEuNVwiLFwiclwiOlwiNC41XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiNS41XCIsXCJ5MVwiOlwiMTZcIixcIngyXCI6XCIxOC41XCIsXCJ5MlwiOlwiMTZcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlWb2x1bWUxIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5Z29uXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxMSA1IDYgOSAyIDkgMiAxNSA2IDE1IDExIDE5IDExIDVcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNS41NCA4LjQ2YTUgNSAwIDAgMSAwIDcuMDdcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlWb2x1bWUyIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwb2x5Z29uXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxMSA1IDYgOSAyIDkgMiAxNSA2IDE1IDExIDE5IDExIDVcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xOS4wNyA0LjkzYTEwIDEwIDAgMCAxIDAgMTQuMTRNMTUuNTQgOC40NmE1IDUgMCAwIDEgMCA3LjA3XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpVm9sdW1lWCAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWdvblwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTEgNSA2IDkgMiA5IDIgMTUgNiAxNSAxMSAxOSAxMSA1XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMjNcIixcInkxXCI6XCI5XCIsXCJ4MlwiOlwiMTdcIixcInkyXCI6XCIxNVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE3XCIsXCJ5MVwiOlwiOVwiLFwieDJcIjpcIjIzXCIsXCJ5MlwiOlwiMTVcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlWb2x1bWUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlnb25cIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjExIDUgNiA5IDIgOSAyIDE1IDYgMTUgMTEgMTkgMTEgNVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVdhdGNoIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiN1wifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiMTIgOSAxMiAxMiAxMy41IDEzLjVcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNi41MSAxNy4zNWwtLjM1IDMuODNhMiAyIDAgMCAxLTIgMS44Mkg5LjgzYTIgMiAwIDAgMS0yLTEuODJsLS4zNS0zLjgzbS4wMS0xMC43bC4zNS0zLjgzQTIgMiAwIDAgMSA5LjgzIDFoNC4zNWEyIDIgMCAwIDEgMiAxLjgybC4zNSAzLjgzXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpV2lmaU9mZiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxXCIsXCJ5MVwiOlwiMVwiLFwieDJcIjpcIjIzXCIsXCJ5MlwiOlwiMjNcIn19LHtcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0xNi43MiAxMS4wNkExMC45NCAxMC45NCAwIDAgMSAxOSAxMi41NVwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTUgMTIuNTVhMTAuOTQgMTAuOTQgMCAwIDEgNS4xNy0yLjM5XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMTAuNzEgNS4wNUExNiAxNiAwIDAgMSAyMi41OCA5XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNMS40MiA5YTE1LjkxIDE1LjkxIDAgMCAxIDQuNy0yLjg4XCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNOC41MyAxNi4xMWE2IDYgMCAwIDEgNi45NSAwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIyMFwiLFwieDJcIjpcIjEyLjAxXCIsXCJ5MlwiOlwiMjBcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlXaWZpIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTUgMTIuNTVhMTEgMTEgMCAwIDEgMTQuMDggMFwifX0se1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTEuNDIgOWExNiAxNiAwIDAgMSAyMS4xNiAwXCJ9fSx7XCJ0YWdcIjpcInBhdGhcIixcImF0dHJcIjp7XCJkXCI6XCJNOC41MyAxNi4xMWE2IDYgMCAwIDEgNi45NSAwXCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTJcIixcInkxXCI6XCIyMFwiLFwieDJcIjpcIjEyLjAxXCIsXCJ5MlwiOlwiMjBcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlXaW5kIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJwYXRoXCIsXCJhdHRyXCI6e1wiZFwiOlwiTTkuNTkgNC41OUEyIDIgMCAxIDEgMTEgOEgybTEwLjU5IDExLjQxQTIgMiAwIDEgMCAxNCAxNkgybTE1LjczLTguMjdBMi41IDIuNSAwIDEgMSAxOS41IDEySDJcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlYQ2lyY2xlIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTJcIixcImN5XCI6XCIxMlwiLFwiclwiOlwiMTBcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxNVwiLFwieTFcIjpcIjlcIixcIngyXCI6XCI5XCIsXCJ5MlwiOlwiMTVcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCI5XCIsXCJ5MVwiOlwiOVwiLFwieDJcIjpcIjE1XCIsXCJ5MlwiOlwiMTVcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlYT2N0YWdvbiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWdvblwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiNy44NiAyIDE2LjE0IDIgMjIgNy44NiAyMiAxNi4xNCAxNi4xNCAyMiA3Ljg2IDIyIDIgMTYuMTQgMiA3Ljg2IDcuODYgMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE1XCIsXCJ5MVwiOlwiOVwiLFwieDJcIjpcIjlcIixcInkyXCI6XCIxNVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjlcIixcInkxXCI6XCI5XCIsXCJ4MlwiOlwiMTVcIixcInkyXCI6XCIxNVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVhTcXVhcmUgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInJlY3RcIixcImF0dHJcIjp7XCJ4XCI6XCIzXCIsXCJ5XCI6XCIzXCIsXCJ3aWR0aFwiOlwiMThcIixcImhlaWdodFwiOlwiMThcIixcInJ4XCI6XCIyXCIsXCJyeVwiOlwiMlwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjlcIixcInkxXCI6XCI5XCIsXCJ4MlwiOlwiMTVcIixcInkyXCI6XCIxNVwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjE1XCIsXCJ5MVwiOlwiOVwiLFwieDJcIjpcIjlcIixcInkyXCI6XCIxNVwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVggKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMThcIixcInkxXCI6XCI2XCIsXCJ4MlwiOlwiNlwiLFwieTJcIjpcIjE4XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiNlwiLFwieTFcIjpcIjZcIixcIngyXCI6XCIxOFwiLFwieTJcIjpcIjE4XCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpWW91dHViZSAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicGF0aFwiLFwiYXR0clwiOntcImRcIjpcIk0yMi41NCA2LjQyYTIuNzggMi43OCAwIDAgMC0xLjk0LTJDMTguODggNCAxMiA0IDEyIDRzLTYuODggMC04LjYuNDZhMi43OCAyLjc4IDAgMCAwLTEuOTQgMkEyOSAyOSAwIDAgMCAxIDExLjc1YTI5IDI5IDAgMCAwIC40NiA1LjMzQTIuNzggMi43OCAwIDAgMCAzLjQgMTljMS43Mi40NiA4LjYuNDYgOC42LjQ2czYuODggMCA4LjYtLjQ2YTIuNzggMi43OCAwIDAgMCAxLjk0LTIgMjkgMjkgMCAwIDAgLjQ2LTUuMjUgMjkgMjkgMCAwIDAtLjQ2LTUuMzN6XCJ9fSx7XCJ0YWdcIjpcInBvbHlnb25cIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjkuNzUgMTUuMDIgMTUuNSAxMS43NSA5Ljc1IDguNDggOS43NSAxNS4wMlwifX1dfSkocHJvcHMpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBGaVphcE9mZiAocHJvcHMpIHtcbiAgcmV0dXJuIEdlbkljb24oe1widGFnXCI6XCJzdmdcIixcImF0dHJcIjp7XCJ2aWV3Qm94XCI6XCIwIDAgMjQgMjRcIixcImZpbGxcIjpcIm5vbmVcIixcInN0cm9rZVwiOlwiY3VycmVudENvbG9yXCIsXCJzdHJva2VXaWR0aFwiOlwiMlwiLFwic3Ryb2tlTGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZUxpbmVqb2luXCI6XCJyb3VuZFwifSxcImNoaWxkXCI6W3tcInRhZ1wiOlwicG9seWxpbmVcIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjEyLjQxIDYuNzUgMTMgMiAxMC41NyA0LjkyXCJ9fSx7XCJ0YWdcIjpcInBvbHlsaW5lXCIsXCJhdHRyXCI6e1wicG9pbnRzXCI6XCIxOC41NyAxMi45MSAyMSAxMCAxNS42NiAxMFwifX0se1widGFnXCI6XCJwb2x5bGluZVwiLFwiYXR0clwiOntcInBvaW50c1wiOlwiOCA4IDMgMTQgMTIgMTQgMTEgMjIgMTYgMTZcIn19LHtcInRhZ1wiOlwibGluZVwiLFwiYXR0clwiOntcIngxXCI6XCIxXCIsXCJ5MVwiOlwiMVwiLFwieDJcIjpcIjIzXCIsXCJ5MlwiOlwiMjNcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlaYXAgKHByb3BzKSB7XG4gIHJldHVybiBHZW5JY29uKHtcInRhZ1wiOlwic3ZnXCIsXCJhdHRyXCI6e1widmlld0JveFwiOlwiMCAwIDI0IDI0XCIsXCJmaWxsXCI6XCJub25lXCIsXCJzdHJva2VcIjpcImN1cnJlbnRDb2xvclwiLFwic3Ryb2tlV2lkdGhcIjpcIjJcIixcInN0cm9rZUxpbmVjYXBcIjpcInJvdW5kXCIsXCJzdHJva2VMaW5lam9pblwiOlwicm91bmRcIn0sXCJjaGlsZFwiOlt7XCJ0YWdcIjpcInBvbHlnb25cIixcImF0dHJcIjp7XCJwb2ludHNcIjpcIjEzIDIgMyAxNCAxMiAxNCAxMSAyMiAyMSAxMCAxMiAxMCAxMyAyXCJ9fV19KShwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIEZpWm9vbUluIChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTFcIixcImN5XCI6XCIxMVwiLFwiclwiOlwiOFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjIxXCIsXCJ5MVwiOlwiMjFcIixcIngyXCI6XCIxNi42NVwiLFwieTJcIjpcIjE2LjY1XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiMTFcIixcInkxXCI6XCI4XCIsXCJ4MlwiOlwiMTFcIixcInkyXCI6XCIxNFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjhcIixcInkxXCI6XCIxMVwiLFwieDJcIjpcIjE0XCIsXCJ5MlwiOlwiMTFcIn19XX0pKHByb3BzKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gRmlab29tT3V0IChwcm9wcykge1xuICByZXR1cm4gR2VuSWNvbih7XCJ0YWdcIjpcInN2Z1wiLFwiYXR0clwiOntcInZpZXdCb3hcIjpcIjAgMCAyNCAyNFwiLFwiZmlsbFwiOlwibm9uZVwiLFwic3Ryb2tlXCI6XCJjdXJyZW50Q29sb3JcIixcInN0cm9rZVdpZHRoXCI6XCIyXCIsXCJzdHJva2VMaW5lY2FwXCI6XCJyb3VuZFwiLFwic3Ryb2tlTGluZWpvaW5cIjpcInJvdW5kXCJ9LFwiY2hpbGRcIjpbe1widGFnXCI6XCJjaXJjbGVcIixcImF0dHJcIjp7XCJjeFwiOlwiMTFcIixcImN5XCI6XCIxMVwiLFwiclwiOlwiOFwifX0se1widGFnXCI6XCJsaW5lXCIsXCJhdHRyXCI6e1wieDFcIjpcIjIxXCIsXCJ5MVwiOlwiMjFcIixcIngyXCI6XCIxNi42NVwiLFwieTJcIjpcIjE2LjY1XCJ9fSx7XCJ0YWdcIjpcImxpbmVcIixcImF0dHJcIjp7XCJ4MVwiOlwiOFwiLFwieTFcIjpcIjExXCIsXCJ4MlwiOlwiMTRcIixcInkyXCI6XCIxMVwifX1dfSkocHJvcHMpO1xufTtcbiIsICIvKipcbiAqICBiYXNlNjQudHNcbiAqXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEJTRCAzLUNsYXVzZSBMaWNlbnNlLlxuICogICAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICpcbiAqICBSZWZlcmVuY2VzOlxuICogICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjRcbiAqXG4gKiBAYXV0aG9yIERhbiBLb2dhaSAoaHR0cHM6Ly9naXRodWIuY29tL2RhbmtvZ2FpKVxuICovXG5jb25zdCB2ZXJzaW9uID0gJzMuNy4yJztcbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGxvd2VyY2FzZSBgdmVyc2lvbmAuXG4gKi9cbmNvbnN0IFZFUlNJT04gPSB2ZXJzaW9uO1xuY29uc3QgX2hhc2F0b2IgPSB0eXBlb2YgYXRvYiA9PT0gJ2Z1bmN0aW9uJztcbmNvbnN0IF9oYXNidG9hID0gdHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbic7XG5jb25zdCBfaGFzQnVmZmVyID0gdHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJztcbmNvbnN0IF9URCA9IHR5cGVvZiBUZXh0RGVjb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBUZXh0RGVjb2RlcigpIDogdW5kZWZpbmVkO1xuY29uc3QgX1RFID0gdHlwZW9mIFRleHRFbmNvZGVyID09PSAnZnVuY3Rpb24nID8gbmV3IFRleHRFbmNvZGVyKCkgOiB1bmRlZmluZWQ7XG5jb25zdCBiNjRjaCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7XG5jb25zdCBiNjRjaHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChiNjRjaCk7XG5jb25zdCBiNjR0YWIgPSAoKGEpID0+IHtcbiAgICBsZXQgdGFiID0ge307XG4gICAgYS5mb3JFYWNoKChjLCBpKSA9PiB0YWJbY10gPSBpKTtcbiAgICByZXR1cm4gdGFiO1xufSkoYjY0Y2hzKTtcbmNvbnN0IGI2NHJlID0gL14oPzpbQS1aYS16XFxkK1xcL117NH0pKj8oPzpbQS1aYS16XFxkK1xcL117Mn0oPzo9PSk/fFtBLVphLXpcXGQrXFwvXXszfT0/KT8kLztcbmNvbnN0IF9mcm9tQ0MgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmJpbmQoU3RyaW5nKTtcbmNvbnN0IF9VOEFmcm9tID0gdHlwZW9mIFVpbnQ4QXJyYXkuZnJvbSA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gVWludDhBcnJheS5mcm9tLmJpbmQoVWludDhBcnJheSlcbiAgICA6IChpdCwgZm4gPSAoeCkgPT4geCkgPT4gbmV3IFVpbnQ4QXJyYXkoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaXQsIDApLm1hcChmbikpO1xuY29uc3QgX21rVXJpU2FmZSA9IChzcmMpID0+IHNyY1xuICAgIC5yZXBsYWNlKC89L2csICcnKS5yZXBsYWNlKC9bK1xcL10vZywgKG0wKSA9PiBtMCA9PSAnKycgPyAnLScgOiAnXycpO1xuY29uc3QgX3RpZHlCNjQgPSAocykgPT4gcy5yZXBsYWNlKC9bXkEtWmEtejAtOVxcK1xcL10vZywgJycpO1xuLyoqXG4gKiBwb2x5ZmlsbCB2ZXJzaW9uIG9mIGBidG9hYFxuICovXG5jb25zdCBidG9hUG9seWZpbGwgPSAoYmluKSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coJ3BvbHlmaWxsZWQnKTtcbiAgICBsZXQgdTMyLCBjMCwgYzEsIGMyLCBhc2MgPSAnJztcbiAgICBjb25zdCBwYWQgPSBiaW4ubGVuZ3RoICUgMztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbi5sZW5ndGg7KSB7XG4gICAgICAgIGlmICgoYzAgPSBiaW4uY2hhckNvZGVBdChpKyspKSA+IDI1NSB8fFxuICAgICAgICAgICAgKGMxID0gYmluLmNoYXJDb2RlQXQoaSsrKSkgPiAyNTUgfHxcbiAgICAgICAgICAgIChjMiA9IGJpbi5jaGFyQ29kZUF0KGkrKykpID4gMjU1KVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBjaGFyYWN0ZXIgZm91bmQnKTtcbiAgICAgICAgdTMyID0gKGMwIDw8IDE2KSB8IChjMSA8PCA4KSB8IGMyO1xuICAgICAgICBhc2MgKz0gYjY0Y2hzW3UzMiA+PiAxOCAmIDYzXVxuICAgICAgICAgICAgKyBiNjRjaHNbdTMyID4+IDEyICYgNjNdXG4gICAgICAgICAgICArIGI2NGNoc1t1MzIgPj4gNiAmIDYzXVxuICAgICAgICAgICAgKyBiNjRjaHNbdTMyICYgNjNdO1xuICAgIH1cbiAgICByZXR1cm4gcGFkID8gYXNjLnNsaWNlKDAsIHBhZCAtIDMpICsgXCI9PT1cIi5zdWJzdHJpbmcocGFkKSA6IGFzYztcbn07XG4vKipcbiAqIGRvZXMgd2hhdCBgd2luZG93LmJ0b2FgIG9mIHdlYiBicm93c2VycyBkby5cbiAqIEBwYXJhbSB7U3RyaW5nfSBiaW4gYmluYXJ5IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0LWVuY29kZWQgc3RyaW5nXG4gKi9cbmNvbnN0IF9idG9hID0gX2hhc2J0b2EgPyAoYmluKSA9PiBidG9hKGJpbilcbiAgICA6IF9oYXNCdWZmZXIgPyAoYmluKSA9PiBCdWZmZXIuZnJvbShiaW4sICdiaW5hcnknKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgOiBidG9hUG9seWZpbGw7XG5jb25zdCBfZnJvbVVpbnQ4QXJyYXkgPSBfaGFzQnVmZmVyXG4gICAgPyAodThhKSA9PiBCdWZmZXIuZnJvbSh1OGEpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIDogKHU4YSkgPT4ge1xuICAgICAgICAvLyBjZi4gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTI3MTAwMDEvaG93LXRvLWNvbnZlcnQtdWludDgtYXJyYXktdG8tYmFzZTY0LWVuY29kZWQtc3RyaW5nLzEyNzEzMzI2IzEyNzEzMzI2XG4gICAgICAgIGNvbnN0IG1heGFyZ3MgPSAweDEwMDA7XG4gICAgICAgIGxldCBzdHJzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdThhLmxlbmd0aDsgaSA8IGw7IGkgKz0gbWF4YXJncykge1xuICAgICAgICAgICAgc3Rycy5wdXNoKF9mcm9tQ0MuYXBwbHkobnVsbCwgdThhLnN1YmFycmF5KGksIGkgKyBtYXhhcmdzKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfYnRvYShzdHJzLmpvaW4oJycpKTtcbiAgICB9O1xuLyoqXG4gKiBjb252ZXJ0cyBhIFVpbnQ4QXJyYXkgdG8gYSBCYXNlNjQgc3RyaW5nLlxuICogQHBhcmFtIHtib29sZWFufSBbdXJsc2FmZV0gVVJMLWFuZC1maWxlbmFtZS1zYWZlIGEgbGEgUkZDNDY0OCBcdTAwQTc1XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQgc3RyaW5nXG4gKi9cbmNvbnN0IGZyb21VaW50OEFycmF5ID0gKHU4YSwgdXJsc2FmZSA9IGZhbHNlKSA9PiB1cmxzYWZlID8gX21rVXJpU2FmZShfZnJvbVVpbnQ4QXJyYXkodThhKSkgOiBfZnJvbVVpbnQ4QXJyYXkodThhKTtcbi8vIFRoaXMgdHJpY2sgaXMgZm91bmQgYnJva2VuIGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5rb2dhaS9qcy1iYXNlNjQvaXNzdWVzLzEzMFxuLy8gY29uc3QgdXRvYiA9IChzcmM6IHN0cmluZykgPT4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHNyYykpO1xuLy8gcmV2ZXJ0aW5nIGdvb2Qgb2xkIGZhdGlvbmVkIHJlZ2V4cFxuY29uc3QgY2JfdXRvYiA9IChjKSA9PiB7XG4gICAgaWYgKGMubGVuZ3RoIDwgMikge1xuICAgICAgICB2YXIgY2MgPSBjLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIHJldHVybiBjYyA8IDB4ODAgPyBjXG4gICAgICAgICAgICA6IGNjIDwgMHg4MDAgPyAoX2Zyb21DQygweGMwIHwgKGNjID4+PiA2KSlcbiAgICAgICAgICAgICAgICArIF9mcm9tQ0MoMHg4MCB8IChjYyAmIDB4M2YpKSlcbiAgICAgICAgICAgICAgICA6IChfZnJvbUNDKDB4ZTAgfCAoKGNjID4+PiAxMikgJiAweDBmKSlcbiAgICAgICAgICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoKGNjID4+PiA2KSAmIDB4M2YpKVxuICAgICAgICAgICAgICAgICAgICArIF9mcm9tQ0MoMHg4MCB8IChjYyAmIDB4M2YpKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgY2MgPSAweDEwMDAwXG4gICAgICAgICAgICArIChjLmNoYXJDb2RlQXQoMCkgLSAweEQ4MDApICogMHg0MDBcbiAgICAgICAgICAgICsgKGMuY2hhckNvZGVBdCgxKSAtIDB4REMwMCk7XG4gICAgICAgIHJldHVybiAoX2Zyb21DQygweGYwIHwgKChjYyA+Pj4gMTgpICYgMHgwNykpXG4gICAgICAgICAgICArIF9mcm9tQ0MoMHg4MCB8ICgoY2MgPj4+IDEyKSAmIDB4M2YpKVxuICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoKGNjID4+PiA2KSAmIDB4M2YpKVxuICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoY2MgJiAweDNmKSkpO1xuICAgIH1cbn07XG5jb25zdCByZV91dG9iID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRkZdfFteXFx4MDAtXFx4N0ZdL2c7XG4vKipcbiAqIEBkZXByZWNhdGVkIHNob3VsZCBoYXZlIGJlZW4gaW50ZXJuYWwgdXNlIG9ubHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjIFVURi04IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gVVRGLTE2IHN0cmluZ1xuICovXG5jb25zdCB1dG9iID0gKHUpID0+IHUucmVwbGFjZShyZV91dG9iLCBjYl91dG9iKTtcbi8vXG5jb25zdCBfZW5jb2RlID0gX2hhc0J1ZmZlclxuICAgID8gKHMpID0+IEJ1ZmZlci5mcm9tKHMsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgOiBfVEVcbiAgICAgICAgPyAocykgPT4gX2Zyb21VaW50OEFycmF5KF9URS5lbmNvZGUocykpXG4gICAgICAgIDogKHMpID0+IF9idG9hKHV0b2IocykpO1xuLyoqXG4gKiBjb252ZXJ0cyBhIFVURi04LWVuY29kZWQgc3RyaW5nIHRvIGEgQmFzZTY0IHN0cmluZy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VybHNhZmVdIGlmIGB0cnVlYCBtYWtlIHRoZSByZXN1bHQgVVJMLXNhZmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NCBzdHJpbmdcbiAqL1xuY29uc3QgZW5jb2RlID0gKHNyYywgdXJsc2FmZSA9IGZhbHNlKSA9PiB1cmxzYWZlXG4gICAgPyBfbWtVcmlTYWZlKF9lbmNvZGUoc3JjKSlcbiAgICA6IF9lbmNvZGUoc3JjKTtcbi8qKlxuICogY29udmVydHMgYSBVVEYtOC1lbmNvZGVkIHN0cmluZyB0byBVUkwtc2FmZSBCYXNlNjQgUkZDNDY0OCBcdTAwQTc1LlxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IHN0cmluZ1xuICovXG5jb25zdCBlbmNvZGVVUkkgPSAoc3JjKSA9PiBlbmNvZGUoc3JjLCB0cnVlKTtcbi8vIFRoaXMgdHJpY2sgaXMgZm91bmQgYnJva2VuIGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5rb2dhaS9qcy1iYXNlNjQvaXNzdWVzLzEzMFxuLy8gY29uc3QgYnRvdSA9IChzcmM6IHN0cmluZykgPT4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShzcmMpKTtcbi8vIHJldmVydGluZyBnb29kIG9sZCBmYXRpb25lZCByZWdleHBcbmNvbnN0IHJlX2J0b3UgPSAvW1xceEMwLVxceERGXVtcXHg4MC1cXHhCRl18W1xceEUwLVxceEVGXVtcXHg4MC1cXHhCRl17Mn18W1xceEYwLVxceEY3XVtcXHg4MC1cXHhCRl17M30vZztcbmNvbnN0IGNiX2J0b3UgPSAoY2NjYykgPT4ge1xuICAgIHN3aXRjaCAoY2NjYy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgdmFyIGNwID0gKCgweDA3ICYgY2NjYy5jaGFyQ29kZUF0KDApKSA8PCAxOClcbiAgICAgICAgICAgICAgICB8ICgoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgxKSkgPDwgMTIpXG4gICAgICAgICAgICAgICAgfCAoKDB4M2YgJiBjY2NjLmNoYXJDb2RlQXQoMikpIDw8IDYpXG4gICAgICAgICAgICAgICAgfCAoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgzKSksIG9mZnNldCA9IGNwIC0gMHgxMDAwMDtcbiAgICAgICAgICAgIHJldHVybiAoX2Zyb21DQygob2Zmc2V0ID4+PiAxMCkgKyAweEQ4MDApXG4gICAgICAgICAgICAgICAgKyBfZnJvbUNDKChvZmZzZXQgJiAweDNGRikgKyAweERDMDApKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIF9mcm9tQ0MoKCgweDBmICYgY2NjYy5jaGFyQ29kZUF0KDApKSA8PCAxMilcbiAgICAgICAgICAgICAgICB8ICgoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgxKSkgPDwgNilcbiAgICAgICAgICAgICAgICB8ICgweDNmICYgY2NjYy5jaGFyQ29kZUF0KDIpKSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gX2Zyb21DQygoKDB4MWYgJiBjY2NjLmNoYXJDb2RlQXQoMCkpIDw8IDYpXG4gICAgICAgICAgICAgICAgfCAoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgxKSkpO1xuICAgIH1cbn07XG4vKipcbiAqIEBkZXByZWNhdGVkIHNob3VsZCBoYXZlIGJlZW4gaW50ZXJuYWwgdXNlIG9ubHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjIFVURi0xNiBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVURi04IHN0cmluZ1xuICovXG5jb25zdCBidG91ID0gKGIpID0+IGIucmVwbGFjZShyZV9idG91LCBjYl9idG91KTtcbi8qKlxuICogcG9seWZpbGwgdmVyc2lvbiBvZiBgYXRvYmBcbiAqL1xuY29uc3QgYXRvYlBvbHlmaWxsID0gKGFzYykgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKCdwb2x5ZmlsbGVkJyk7XG4gICAgYXNjID0gYXNjLnJlcGxhY2UoL1xccysvZywgJycpO1xuICAgIGlmICghYjY0cmUudGVzdChhc2MpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYWxmb3JtZWQgYmFzZTY0LicpO1xuICAgIGFzYyArPSAnPT0nLnNsaWNlKDIgLSAoYXNjLmxlbmd0aCAmIDMpKTtcbiAgICBsZXQgdTI0LCBiaW4gPSAnJywgcjEsIHIyO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXNjLmxlbmd0aDspIHtcbiAgICAgICAgdTI0ID0gYjY0dGFiW2FzYy5jaGFyQXQoaSsrKV0gPDwgMThcbiAgICAgICAgICAgIHwgYjY0dGFiW2FzYy5jaGFyQXQoaSsrKV0gPDwgMTJcbiAgICAgICAgICAgIHwgKHIxID0gYjY0dGFiW2FzYy5jaGFyQXQoaSsrKV0pIDw8IDZcbiAgICAgICAgICAgIHwgKHIyID0gYjY0dGFiW2FzYy5jaGFyQXQoaSsrKV0pO1xuICAgICAgICBiaW4gKz0gcjEgPT09IDY0ID8gX2Zyb21DQyh1MjQgPj4gMTYgJiAyNTUpXG4gICAgICAgICAgICA6IHIyID09PSA2NCA/IF9mcm9tQ0ModTI0ID4+IDE2ICYgMjU1LCB1MjQgPj4gOCAmIDI1NSlcbiAgICAgICAgICAgICAgICA6IF9mcm9tQ0ModTI0ID4+IDE2ICYgMjU1LCB1MjQgPj4gOCAmIDI1NSwgdTI0ICYgMjU1KTtcbiAgICB9XG4gICAgcmV0dXJuIGJpbjtcbn07XG4vKipcbiAqIGRvZXMgd2hhdCBgd2luZG93LmF0b2JgIG9mIHdlYiBicm93c2VycyBkby5cbiAqIEBwYXJhbSB7U3RyaW5nfSBhc2MgQmFzZTY0LWVuY29kZWQgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBiaW5hcnkgc3RyaW5nXG4gKi9cbmNvbnN0IF9hdG9iID0gX2hhc2F0b2IgPyAoYXNjKSA9PiBhdG9iKF90aWR5QjY0KGFzYykpXG4gICAgOiBfaGFzQnVmZmVyID8gKGFzYykgPT4gQnVmZmVyLmZyb20oYXNjLCAnYmFzZTY0JykudG9TdHJpbmcoJ2JpbmFyeScpXG4gICAgICAgIDogYXRvYlBvbHlmaWxsO1xuLy9cbmNvbnN0IF90b1VpbnQ4QXJyYXkgPSBfaGFzQnVmZmVyXG4gICAgPyAoYSkgPT4gX1U4QWZyb20oQnVmZmVyLmZyb20oYSwgJ2Jhc2U2NCcpKVxuICAgIDogKGEpID0+IF9VOEFmcm9tKF9hdG9iKGEpLCBjID0+IGMuY2hhckNvZGVBdCgwKSk7XG4vKipcbiAqIGNvbnZlcnRzIGEgQmFzZTY0IHN0cmluZyB0byBhIFVpbnQ4QXJyYXkuXG4gKi9cbmNvbnN0IHRvVWludDhBcnJheSA9IChhKSA9PiBfdG9VaW50OEFycmF5KF91blVSSShhKSk7XG4vL1xuY29uc3QgX2RlY29kZSA9IF9oYXNCdWZmZXJcbiAgICA/IChhKSA9PiBCdWZmZXIuZnJvbShhLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKVxuICAgIDogX1REXG4gICAgICAgID8gKGEpID0+IF9URC5kZWNvZGUoX3RvVWludDhBcnJheShhKSlcbiAgICAgICAgOiAoYSkgPT4gYnRvdShfYXRvYihhKSk7XG5jb25zdCBfdW5VUkkgPSAoYSkgPT4gX3RpZHlCNjQoYS5yZXBsYWNlKC9bLV9dL2csIChtMCkgPT4gbTAgPT0gJy0nID8gJysnIDogJy8nKSk7XG4vKipcbiAqIGNvbnZlcnRzIGEgQmFzZTY0IHN0cmluZyB0byBhIFVURi04IHN0cmluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgQmFzZTY0IHN0cmluZy4gIEJvdGggbm9ybWFsIGFuZCBVUkwtc2FmZSBhcmUgc3VwcG9ydGVkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVVEYtOCBzdHJpbmdcbiAqL1xuY29uc3QgZGVjb2RlID0gKHNyYykgPT4gX2RlY29kZShfdW5VUkkoc3JjKSk7XG4vKipcbiAqIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBCYXNlNjQgc3RyaW5nXG4gKiBAcGFyYW0ge1N0cmluZ30gc3JjIGEgdmFsdWUgdG8gY2hlY2tcbiAgKi9cbmNvbnN0IGlzVmFsaWQgPSAoc3JjKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzcmMgIT09ICdzdHJpbmcnKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcyA9IHNyYy5yZXBsYWNlKC9cXHMrL2csICcnKS5yZXBsYWNlKC89ezAsMn0kLywgJycpO1xuICAgIHJldHVybiAhL1teXFxzMC05YS16QS1aXFwrL10vLnRlc3QocykgfHwgIS9bXlxcczAtOWEtekEtWlxcLV9dLy50ZXN0KHMpO1xufTtcbi8vXG5jb25zdCBfbm9FbnVtID0gKHYpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdiwgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWVcbiAgICB9O1xufTtcbi8qKlxuICogZXh0ZW5kIFN0cmluZy5wcm90b3R5cGUgd2l0aCByZWxldmFudCBtZXRob2RzXG4gKi9cbmNvbnN0IGV4dGVuZFN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBfYWRkID0gKG5hbWUsIGJvZHkpID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLCBuYW1lLCBfbm9FbnVtKGJvZHkpKTtcbiAgICBfYWRkKCdmcm9tQmFzZTY0JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZGVjb2RlKHRoaXMpOyB9KTtcbiAgICBfYWRkKCd0b0Jhc2U2NCcsIGZ1bmN0aW9uICh1cmxzYWZlKSB7IHJldHVybiBlbmNvZGUodGhpcywgdXJsc2FmZSk7IH0pO1xuICAgIF9hZGQoJ3RvQmFzZTY0VVJJJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZW5jb2RlKHRoaXMsIHRydWUpOyB9KTtcbiAgICBfYWRkKCd0b0Jhc2U2NFVSTCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVuY29kZSh0aGlzLCB0cnVlKTsgfSk7XG4gICAgX2FkZCgndG9VaW50OEFycmF5JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdG9VaW50OEFycmF5KHRoaXMpOyB9KTtcbn07XG4vKipcbiAqIGV4dGVuZCBVaW50OEFycmF5LnByb3RvdHlwZSB3aXRoIHJlbGV2YW50IG1ldGhvZHNcbiAqL1xuY29uc3QgZXh0ZW5kVWludDhBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBfYWRkID0gKG5hbWUsIGJvZHkpID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShVaW50OEFycmF5LnByb3RvdHlwZSwgbmFtZSwgX25vRW51bShib2R5KSk7XG4gICAgX2FkZCgndG9CYXNlNjQnLCBmdW5jdGlvbiAodXJsc2FmZSkgeyByZXR1cm4gZnJvbVVpbnQ4QXJyYXkodGhpcywgdXJsc2FmZSk7IH0pO1xuICAgIF9hZGQoJ3RvQmFzZTY0VVJJJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZnJvbVVpbnQ4QXJyYXkodGhpcywgdHJ1ZSk7IH0pO1xuICAgIF9hZGQoJ3RvQmFzZTY0VVJMJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZnJvbVVpbnQ4QXJyYXkodGhpcywgdHJ1ZSk7IH0pO1xufTtcbi8qKlxuICogZXh0ZW5kIEJ1aWx0aW4gcHJvdG90eXBlcyB3aXRoIHJlbGV2YW50IG1ldGhvZHNcbiAqL1xuY29uc3QgZXh0ZW5kQnVpbHRpbnMgPSAoKSA9PiB7XG4gICAgZXh0ZW5kU3RyaW5nKCk7XG4gICAgZXh0ZW5kVWludDhBcnJheSgpO1xufTtcbmNvbnN0IGdCYXNlNjQgPSB7XG4gICAgdmVyc2lvbjogdmVyc2lvbixcbiAgICBWRVJTSU9OOiBWRVJTSU9OLFxuICAgIGF0b2I6IF9hdG9iLFxuICAgIGF0b2JQb2x5ZmlsbDogYXRvYlBvbHlmaWxsLFxuICAgIGJ0b2E6IF9idG9hLFxuICAgIGJ0b2FQb2x5ZmlsbDogYnRvYVBvbHlmaWxsLFxuICAgIGZyb21CYXNlNjQ6IGRlY29kZSxcbiAgICB0b0Jhc2U2NDogZW5jb2RlLFxuICAgIGVuY29kZTogZW5jb2RlLFxuICAgIGVuY29kZVVSSTogZW5jb2RlVVJJLFxuICAgIGVuY29kZVVSTDogZW5jb2RlVVJJLFxuICAgIHV0b2I6IHV0b2IsXG4gICAgYnRvdTogYnRvdSxcbiAgICBkZWNvZGU6IGRlY29kZSxcbiAgICBpc1ZhbGlkOiBpc1ZhbGlkLFxuICAgIGZyb21VaW50OEFycmF5OiBmcm9tVWludDhBcnJheSxcbiAgICB0b1VpbnQ4QXJyYXk6IHRvVWludDhBcnJheSxcbiAgICBleHRlbmRTdHJpbmc6IGV4dGVuZFN0cmluZyxcbiAgICBleHRlbmRVaW50OEFycmF5OiBleHRlbmRVaW50OEFycmF5LFxuICAgIGV4dGVuZEJ1aWx0aW5zOiBleHRlbmRCdWlsdGlucyxcbn07XG4vLyBtYWtlY2pzOkNVVCAvL1xuZXhwb3J0IHsgdmVyc2lvbiB9O1xuZXhwb3J0IHsgVkVSU0lPTiB9O1xuZXhwb3J0IHsgX2F0b2IgYXMgYXRvYiB9O1xuZXhwb3J0IHsgYXRvYlBvbHlmaWxsIH07XG5leHBvcnQgeyBfYnRvYSBhcyBidG9hIH07XG5leHBvcnQgeyBidG9hUG9seWZpbGwgfTtcbmV4cG9ydCB7IGRlY29kZSBhcyBmcm9tQmFzZTY0IH07XG5leHBvcnQgeyBlbmNvZGUgYXMgdG9CYXNlNjQgfTtcbmV4cG9ydCB7IHV0b2IgfTtcbmV4cG9ydCB7IGVuY29kZSB9O1xuZXhwb3J0IHsgZW5jb2RlVVJJIH07XG5leHBvcnQgeyBlbmNvZGVVUkkgYXMgZW5jb2RlVVJMIH07XG5leHBvcnQgeyBidG91IH07XG5leHBvcnQgeyBkZWNvZGUgfTtcbmV4cG9ydCB7IGlzVmFsaWQgfTtcbmV4cG9ydCB7IGZyb21VaW50OEFycmF5IH07XG5leHBvcnQgeyB0b1VpbnQ4QXJyYXkgfTtcbmV4cG9ydCB7IGV4dGVuZFN0cmluZyB9O1xuZXhwb3J0IHsgZXh0ZW5kVWludDhBcnJheSB9O1xuZXhwb3J0IHsgZXh0ZW5kQnVpbHRpbnMgfTtcbi8vIGFuZCBmaW5hbGx5LFxuZXhwb3J0IHsgZ0Jhc2U2NCBhcyBCYXNlNjQgfTtcbiIsICJpbXBvcnQgeyBkZWNvZGUgfSBmcm9tIFwianMtYmFzZTY0XCI7XG5pbXBvcnQgeyByZXF1ZXN0VXJsIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRJY29uUGFja0J1bmRsZVVybCA9IChcbiAgcGF0aDogc3RyaW5nLFxuICBicmFuY2ggPSBcIm1hc3RlclwiLFxuICBhbHQgPSBmYWxzZSxcbikgPT5cbiAgYGh0dHBzOi8vJHtcbiAgICBhbHQgPyBcInJhdy5zdGF0aWNkbi5uZXRcIiA6IFwicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbVwiXG4gIH0vYWlkZW5seC9vYnNpZGlhbi1pY29uLXNob3J0Y29kZXMvJHticmFuY2h9LyR7cGF0aH1gO1xuXG5leHBvcnQgaW50ZXJmYWNlIEljb25QYWNrTWFuaWZlc3RSYXcge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvdW50OiBudW1iZXI7XG4gIHNlcmllczogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBsaWNlbnNlOiBzdHJpbmc7XG4gIGJ1bmRsZU5hbWU6IHN0cmluZztcbiAgcGFja0lkOiBzdHJpbmc7XG4gIGhvbWVwYWdlOiBzdHJpbmc7XG4gIHN0eWxlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBHaXRIdWJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlc3BvbnNlOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoXCJHaXRIdWI6IFwiICsgcmVzcG9uc2UubWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldE1hbmlmZXN0VmlhQVBJID0gYXN5bmMgKGJyYW5jaCA9IFwibWFzdGVyXCIpID0+IHtcbiAgY29uc3QgdXJsID0gYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYWlkZW5seC9vYnNpZGlhbi1pY29uLXNob3J0Y29kZXMvZ2l0L3RyZWVzLyR7YnJhbmNofT9yZWN1cnNpdmU9MSYke0RhdGUubm93KCl9YDtcbiAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgcmVxdWVzdFVybCh7IHVybCB9KSkuanNvbjtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2UudHJlZSkpIHtcbiAgICBjb25zdCBtYW5pZmVzdFVybCA9IHJlc3BvbnNlLnRyZWUuZmluZChcbiAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0ucGF0aCA9PT0gXCJhc3NldHMvbWFuaWZlc3QuanNvblwiLFxuICAgICk/LnVybDtcbiAgICBpZiAoIW1hbmlmZXN0VXJsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKHJlc3BvbnNlKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG1hbmlmZXN0Lmpzb24gZm9yIGljb24gcGFjayBmb3VuZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGF3YWl0IGdldEpTT05mcm9tQmxvYlVybChtYW5pZmVzdFVybCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBHaXRIdWJFcnJvcihyZXNwb25zZSk7XG4gIH1cbn07XG5cbmNvbnN0IGdldEpTT05mcm9tQmxvYlVybCA9IGFzeW5jIChcbiAgbWFuaWZlc3RVcmw6IHN0cmluZyxcbik6IFByb21pc2U8SWNvblBhY2tNYW5pZmVzdFJhd1tdPiA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IHJlcXVlc3RVcmwoeyB1cmw6IG1hbmlmZXN0VXJsIH0pKS5qc29uO1xuICBpZiAocmVzcG9uc2UuZW5jb2RpbmcgJiYgcmVzcG9uc2UuY29udGVudCkge1xuICAgIGlmIChyZXNwb25zZS5lbmNvZGluZyA9PT0gXCJiYXNlNjRcIikge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlKHJlc3BvbnNlLmNvbnRlbnQpKSBhcyBJY29uUGFja01hbmlmZXN0UmF3W107XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IocmVzcG9uc2UpO1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVuc3VwcG9ydGVkIGVuY29kaW5nXCIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgR2l0SHViRXJyb3IocmVzcG9uc2UpO1xuICB9XG59O1xuIiwgImV4cG9ydCB7IGRlZmF1bHQgYXMgYmxhbmsgfSBmcm9tICcuL2JsYW5rLnN2Zyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGJhbGxzIH0gZnJvbSAnLi9sb2FkaW5nLWJhbGxzLnN2Zyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGJhcnMgfSBmcm9tICcuL2xvYWRpbmctYmFycy5zdmcnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBidWJibGVzIH0gZnJvbSAnLi9sb2FkaW5nLWJ1YmJsZXMuc3ZnJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY3ViZXMgfSBmcm9tICcuL2xvYWRpbmctY3ViZXMuc3ZnJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY3lsb24gfSBmcm9tICcuL2xvYWRpbmctY3lsb24uc3ZnJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3BpbiB9IGZyb20gJy4vbG9hZGluZy1zcGluLnN2Zyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHNwaW5uaW5nQnViYmxlcyB9IGZyb20gJy4vbG9hZGluZy1zcGlubmluZy1idWJibGVzLnN2Zyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHNwb2tlcyB9IGZyb20gJy4vbG9hZGluZy1zcG9rZXMuc3ZnJztcbiIsICJpbXBvcnQgdHlwZSB7IEhUTUxQcm9wcyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCAqIGFzIHN2Z1NvdXJjZXMgZnJvbSBcInJlYWN0LWxvYWRpbmcvbGliL3N2Z1wiO1xuXG50eXBlIExvYWRpbmdUeXBlID1cbiAgfCBcImJsYW5rXCJcbiAgfCBcImJhbGxzXCJcbiAgfCBcImJhcnNcIlxuICB8IFwiYnViYmxlc1wiXG4gIHwgXCJjdWJlc1wiXG4gIHwgXCJjeWxvblwiXG4gIHwgXCJzcGluXCJcbiAgfCBcInNwaW5uaW5nQnViYmxlc1wiXG4gIHwgXCJzcG9rZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBMb2FkaW5nUHJvcHMgZXh0ZW5kcyBIVE1MUHJvcHM8SFRNTERpdkVsZW1lbnQ+IHtcbiAgY29sb3I/OiBzdHJpbmc7XG4gIC8qKiBpbiBtaWxpc2Vjb25kICovXG4gIGRlbGF5PzogbnVtYmVyO1xuICB0eXBlPzogTG9hZGluZ1R5cGU7XG4gIGhlaWdodD86IHN0cmluZyB8IG51bWJlcjtcbiAgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7XG59XG5cbmNvbnN0IExvYWRpbmcgPSAoe1xuICBjb2xvciA9IFwidmFyKC0taW50ZXJhY3RpdmUtYWNjZW50KVwiLFxuICBkZWxheSA9IDAsXG4gIHR5cGUgPSBcImJhbGxzXCIsXG4gIGhlaWdodCA9IDY0LFxuICB3aWR0aCA9IDY0LFxuICAuLi5yZXN0UHJvcHNcbn06IExvYWRpbmdQcm9wcykgPT4ge1xuICBjb25zdCBbZGVsYXllZCwgc2V0RGVsYXllZF0gPSB1c2VTdGF0ZShkZWxheSA+IDApO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCB0aW1lb3V0ID0gLTE7XG4gICAgaWYgKGRlbGF5ZWQpIHtcbiAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiBzZXREZWxheWVkKGZhbHNlKSwgZGVsYXkpO1xuICAgIH1cbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB9LCBbXSk7XG4gIGNvbnN0IHNlbGVjdGVkVHlwZSA9IGRlbGF5ZWQgPyBcImJsYW5rXCIgOiB0eXBlO1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGZpbGw6IGNvbG9yLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHdpZHRoLFxuICAgICAgfX1cbiAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogc3ZnU291cmNlc1tzZWxlY3RlZFR5cGVdIH19XG4gICAgICB7Li4ucmVzdFByb3BzfVxuICAgIC8+XG4gICk7XG59O1xuZXhwb3J0IGRlZmF1bHQgTG9hZGluZztcbiIsICJjb25zdCBlcnJvcnMgPSB7XG5cdDA6IFwiSWxsZWdhbCBzdGF0ZVwiLFxuXHQxOiBcIkltbWVyIGRyYWZ0cyBjYW5ub3QgaGF2ZSBjb21wdXRlZCBwcm9wZXJ0aWVzXCIsXG5cdDI6IFwiVGhpcyBvYmplY3QgaGFzIGJlZW4gZnJvemVuIGFuZCBzaG91bGQgbm90IGJlIG11dGF0ZWRcIixcblx0MyhkYXRhOiBhbnkpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0XCJDYW5ub3QgdXNlIGEgcHJveHkgdGhhdCBoYXMgYmVlbiByZXZva2VkLiBEaWQgeW91IHBhc3MgYW4gb2JqZWN0IGZyb20gaW5zaWRlIGFuIGltbWVyIGZ1bmN0aW9uIHRvIGFuIGFzeW5jIHByb2Nlc3M/IFwiICtcblx0XHRcdGRhdGFcblx0XHQpXG5cdH0sXG5cdDQ6IFwiQW4gaW1tZXIgcHJvZHVjZXIgcmV0dXJuZWQgYSBuZXcgdmFsdWUgKmFuZCogbW9kaWZpZWQgaXRzIGRyYWZ0LiBFaXRoZXIgcmV0dXJuIGEgbmV3IHZhbHVlICpvciogbW9kaWZ5IHRoZSBkcmFmdC5cIixcblx0NTogXCJJbW1lciBmb3JiaWRzIGNpcmN1bGFyIHJlZmVyZW5jZXNcIixcblx0NjogXCJUaGUgZmlyc3Qgb3Igc2Vjb25kIGFyZ3VtZW50IHRvIGBwcm9kdWNlYCBtdXN0IGJlIGEgZnVuY3Rpb25cIixcblx0NzogXCJUaGUgdGhpcmQgYXJndW1lbnQgdG8gYHByb2R1Y2VgIG11c3QgYmUgYSBmdW5jdGlvbiBvciB1bmRlZmluZWRcIixcblx0ODogXCJGaXJzdCBhcmd1bWVudCB0byBgY3JlYXRlRHJhZnRgIG11c3QgYmUgYSBwbGFpbiBvYmplY3QsIGFuIGFycmF5LCBvciBhbiBpbW1lcmFibGUgb2JqZWN0XCIsXG5cdDk6IFwiRmlyc3QgYXJndW1lbnQgdG8gYGZpbmlzaERyYWZ0YCBtdXN0IGJlIGEgZHJhZnQgcmV0dXJuZWQgYnkgYGNyZWF0ZURyYWZ0YFwiLFxuXHQxMDogXCJUaGUgZ2l2ZW4gZHJhZnQgaXMgYWxyZWFkeSBmaW5hbGl6ZWRcIixcblx0MTE6IFwiT2JqZWN0LmRlZmluZVByb3BlcnR5KCkgY2Fubm90IGJlIHVzZWQgb24gYW4gSW1tZXIgZHJhZnRcIixcblx0MTI6IFwiT2JqZWN0LnNldFByb3RvdHlwZU9mKCkgY2Fubm90IGJlIHVzZWQgb24gYW4gSW1tZXIgZHJhZnRcIixcblx0MTM6IFwiSW1tZXIgb25seSBzdXBwb3J0cyBkZWxldGluZyBhcnJheSBpbmRpY2VzXCIsXG5cdDE0OiBcIkltbWVyIG9ubHkgc3VwcG9ydHMgc2V0dGluZyBhcnJheSBpbmRpY2VzIGFuZCB0aGUgJ2xlbmd0aCcgcHJvcGVydHlcIixcblx0MTUocGF0aDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIFwiQ2Fubm90IGFwcGx5IHBhdGNoLCBwYXRoIGRvZXNuJ3QgcmVzb2x2ZTogXCIgKyBwYXRoXG5cdH0sXG5cdDE2OiAnU2V0cyBjYW5ub3QgaGF2ZSBcInJlcGxhY2VcIiBwYXRjaGVzLicsXG5cdDE3KG9wOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gXCJVbnN1cHBvcnRlZCBwYXRjaCBvcGVyYXRpb246IFwiICsgb3Bcblx0fSxcblx0MTgocGx1Z2luOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gYFRoZSBwbHVnaW4gZm9yICcke3BsdWdpbn0nIGhhcyBub3QgYmVlbiBsb2FkZWQgaW50byBJbW1lci4gVG8gZW5hYmxlIHRoZSBwbHVnaW4sIGltcG9ydCBhbmQgY2FsbCBcXGBlbmFibGUke3BsdWdpbn0oKVxcYCB3aGVuIGluaXRpYWxpemluZyB5b3VyIGFwcGxpY2F0aW9uLmBcblx0fSxcblx0MjA6IFwiQ2Fubm90IHVzZSBwcm94aWVzIGlmIFByb3h5LCBQcm94eS5yZXZvY2FibGUgb3IgUmVmbGVjdCBhcmUgbm90IGF2YWlsYWJsZVwiLFxuXHQyMSh0aGluZzogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGBwcm9kdWNlIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiB0aGluZ3MgdGhhdCBhcmUgZHJhZnRhYmxlOiBwbGFpbiBvYmplY3RzLCBhcnJheXMsIE1hcCwgU2V0IG9yIGNsYXNzZXMgdGhhdCBhcmUgbWFya2VkIHdpdGggJ1tpbW1lcmFibGVdOiB0cnVlJy4gR290ICcke3RoaW5nfSdgXG5cdH0sXG5cdDIyKHRoaW5nOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gYCdjdXJyZW50JyBleHBlY3RzIGEgZHJhZnQsIGdvdDogJHt0aGluZ31gXG5cdH0sXG5cdDIzKHRoaW5nOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gYCdvcmlnaW5hbCcgZXhwZWN0cyBhIGRyYWZ0LCBnb3Q6ICR7dGhpbmd9YFxuXHR9LFxuXHQyNDogXCJQYXRjaGluZyByZXNlcnZlZCBhdHRyaWJ1dGVzIGxpa2UgX19wcm90b19fLCBwcm90b3R5cGUgYW5kIGNvbnN0cnVjdG9yIGlzIG5vdCBhbGxvd2VkXCJcbn0gYXMgY29uc3RcblxuZXhwb3J0IGZ1bmN0aW9uIGRpZShlcnJvcjoga2V5b2YgdHlwZW9mIGVycm9ycywgLi4uYXJnczogYW55W10pOiBuZXZlciB7XG5cdGlmIChfX0RFVl9fKSB7XG5cdFx0Y29uc3QgZSA9IGVycm9yc1tlcnJvcl1cblx0XHRjb25zdCBtc2cgPSAhZVxuXHRcdFx0PyBcInVua25vd24gZXJyb3IgbnI6IFwiICsgZXJyb3Jcblx0XHRcdDogdHlwZW9mIGUgPT09IFwiZnVuY3Rpb25cIlxuXHRcdFx0PyBlLmFwcGx5KG51bGwsIGFyZ3MgYXMgYW55KVxuXHRcdFx0OiBlXG5cdFx0dGhyb3cgbmV3IEVycm9yKGBbSW1tZXJdICR7bXNnfWApXG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdGBbSW1tZXJdIG1pbmlmaWVkIGVycm9yIG5yOiAke2Vycm9yfSR7XG5cdFx0XHRhcmdzLmxlbmd0aCA/IFwiIFwiICsgYXJncy5tYXAocyA9PiBgJyR7c30nYCkuam9pbihcIixcIikgOiBcIlwiXG5cdFx0fS4gRmluZCB0aGUgZnVsbCBlcnJvciBhdDogaHR0cHM6Ly9iaXQubHkvM2NYRUtXZmBcblx0KVxufVxuIiwgImltcG9ydCB7XG5cdERSQUZUX1NUQVRFLFxuXHREUkFGVEFCTEUsXG5cdGhhc1NldCxcblx0T2JqZWN0aXNoLFxuXHREcmFmdGVkLFxuXHRBbnlPYmplY3QsXG5cdEFueU1hcCxcblx0QW55U2V0LFxuXHRJbW1lclN0YXRlLFxuXHRoYXNNYXAsXG5cdEFyY2h0eXBlLFxuXHRkaWVcbn0gZnJvbSBcIi4uL2ludGVybmFsXCJcblxuLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gSW1tZXIgZHJhZnQgKi9cbi8qI19fUFVSRV9fKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RyYWZ0KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcblx0cmV0dXJuICEhdmFsdWUgJiYgISF2YWx1ZVtEUkFGVF9TVEFURV1cbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgY2FuIGJlIGRyYWZ0ZWQgYnkgSW1tZXIgKi9cbi8qI19fUFVSRV9fKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RyYWZ0YWJsZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG5cdGlmICghdmFsdWUpIHJldHVybiBmYWxzZVxuXHRyZXR1cm4gKFxuXHRcdGlzUGxhaW5PYmplY3QodmFsdWUpIHx8XG5cdFx0QXJyYXkuaXNBcnJheSh2YWx1ZSkgfHxcblx0XHQhIXZhbHVlW0RSQUZUQUJMRV0gfHxcblx0XHQhIXZhbHVlLmNvbnN0cnVjdG9yW0RSQUZUQUJMRV0gfHxcblx0XHRpc01hcCh2YWx1ZSkgfHxcblx0XHRpc1NldCh2YWx1ZSlcblx0KVxufVxuXG5jb25zdCBvYmplY3RDdG9yU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci50b1N0cmluZygpXG4vKiNfX1BVUkVfXyovXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG5cdGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2Vcblx0Y29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG5cdGlmIChwcm90byA9PT0gbnVsbCkge1xuXHRcdHJldHVybiB0cnVlXG5cdH1cblx0Y29uc3QgQ3RvciA9XG5cdFx0T2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwocHJvdG8sIFwiY29uc3RydWN0b3JcIikgJiYgcHJvdG8uY29uc3RydWN0b3JcblxuXHRpZiAoQ3RvciA9PT0gT2JqZWN0KSByZXR1cm4gdHJ1ZVxuXG5cdHJldHVybiAoXG5cdFx0dHlwZW9mIEN0b3IgPT0gXCJmdW5jdGlvblwiICYmXG5cdFx0RnVuY3Rpb24udG9TdHJpbmcuY2FsbChDdG9yKSA9PT0gb2JqZWN0Q3RvclN0cmluZ1xuXHQpXG59XG5cbi8qKiBHZXQgdGhlIHVuZGVybHlpbmcgb2JqZWN0IHRoYXQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGRyYWZ0ICovXG4vKiNfX1BVUkVfXyovXG5leHBvcnQgZnVuY3Rpb24gb3JpZ2luYWw8VD4odmFsdWU6IFQpOiBUIHwgdW5kZWZpbmVkXG5leHBvcnQgZnVuY3Rpb24gb3JpZ2luYWwodmFsdWU6IERyYWZ0ZWQ8YW55Pik6IGFueSB7XG5cdGlmICghaXNEcmFmdCh2YWx1ZSkpIGRpZSgyMywgdmFsdWUpXG5cdHJldHVybiB2YWx1ZVtEUkFGVF9TVEFURV0uYmFzZV9cbn1cblxuLyojX19QVVJFX18qL1xuZXhwb3J0IGNvbnN0IG93bktleXM6ICh0YXJnZXQ6IEFueU9iamVjdCkgPT4gUHJvcGVydHlLZXlbXSA9XG5cdHR5cGVvZiBSZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmIFJlZmxlY3Qub3duS2V5c1xuXHRcdD8gUmVmbGVjdC5vd25LZXlzXG5cdFx0OiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gXCJ1bmRlZmluZWRcIlxuXHRcdD8gb2JqID0+XG5cdFx0XHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikuY29uY2F0KFxuXHRcdFx0XHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKSBhcyBhbnlcblx0XHRcdFx0KVxuXHRcdDogLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcblxuZXhwb3J0IGNvbnN0IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPVxuXHRPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyB8fFxuXHRmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRhcmdldDogYW55KSB7XG5cdFx0Ly8gUG9seWZpbGwgbmVlZGVkIGZvciBIZXJtZXMgYW5kIElFLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2hlcm1lcy9pc3N1ZXMvMjc0XG5cdFx0Y29uc3QgcmVzOiBhbnkgPSB7fVxuXHRcdG93bktleXModGFyZ2V0KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0XHRyZXNba2V5XSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpXG5cdFx0fSlcblx0XHRyZXR1cm4gcmVzXG5cdH1cblxuZXhwb3J0IGZ1bmN0aW9uIGVhY2g8VCBleHRlbmRzIE9iamVjdGlzaD4oXG5cdG9iajogVCxcblx0aXRlcjogKGtleTogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZTogYW55LCBzb3VyY2U6IFQpID0+IHZvaWQsXG5cdGVudW1lcmFibGVPbmx5PzogYm9vbGVhblxuKTogdm9pZFxuZXhwb3J0IGZ1bmN0aW9uIGVhY2gob2JqOiBhbnksIGl0ZXI6IGFueSwgZW51bWVyYWJsZU9ubHkgPSBmYWxzZSkge1xuXHRpZiAoZ2V0QXJjaHR5cGUob2JqKSA9PT0gQXJjaHR5cGUuT2JqZWN0KSB7XG5cdFx0OyhlbnVtZXJhYmxlT25seSA/IE9iamVjdC5rZXlzIDogb3duS2V5cykob2JqKS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0XHRpZiAoIWVudW1lcmFibGVPbmx5IHx8IHR5cGVvZiBrZXkgIT09IFwic3ltYm9sXCIpIGl0ZXIoa2V5LCBvYmpba2V5XSwgb2JqKVxuXHRcdH0pXG5cdH0gZWxzZSB7XG5cdFx0b2JqLmZvckVhY2goKGVudHJ5OiBhbnksIGluZGV4OiBhbnkpID0+IGl0ZXIoaW5kZXgsIGVudHJ5LCBvYmopKVxuXHR9XG59XG5cbi8qI19fUFVSRV9fKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcmNodHlwZSh0aGluZzogYW55KTogQXJjaHR5cGUge1xuXHQvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRjb25zdCBzdGF0ZTogdW5kZWZpbmVkIHwgSW1tZXJTdGF0ZSA9IHRoaW5nW0RSQUZUX1NUQVRFXVxuXHRyZXR1cm4gc3RhdGVcblx0XHQ/IHN0YXRlLnR5cGVfID4gM1xuXHRcdFx0PyBzdGF0ZS50eXBlXyAtIDQgLy8gY2F1c2UgT2JqZWN0IGFuZCBBcnJheSBtYXAgYmFjayBmcm9tIDQgYW5kIDVcblx0XHRcdDogKHN0YXRlLnR5cGVfIGFzIGFueSkgLy8gb3RoZXJzIGFyZSB0aGUgc2FtZVxuXHRcdDogQXJyYXkuaXNBcnJheSh0aGluZylcblx0XHQ/IEFyY2h0eXBlLkFycmF5XG5cdFx0OiBpc01hcCh0aGluZylcblx0XHQ/IEFyY2h0eXBlLk1hcFxuXHRcdDogaXNTZXQodGhpbmcpXG5cdFx0PyBBcmNodHlwZS5TZXRcblx0XHQ6IEFyY2h0eXBlLk9iamVjdFxufVxuXG4vKiNfX1BVUkVfXyovXG5leHBvcnQgZnVuY3Rpb24gaGFzKHRoaW5nOiBhbnksIHByb3A6IFByb3BlcnR5S2V5KTogYm9vbGVhbiB7XG5cdHJldHVybiBnZXRBcmNodHlwZSh0aGluZykgPT09IEFyY2h0eXBlLk1hcFxuXHRcdD8gdGhpbmcuaGFzKHByb3ApXG5cdFx0OiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpbmcsIHByb3ApXG59XG5cbi8qI19fUFVSRV9fKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXQodGhpbmc6IEFueU1hcCB8IEFueU9iamVjdCwgcHJvcDogUHJvcGVydHlLZXkpOiBhbnkge1xuXHQvLyBAdHMtaWdub3JlXG5cdHJldHVybiBnZXRBcmNodHlwZSh0aGluZykgPT09IEFyY2h0eXBlLk1hcCA/IHRoaW5nLmdldChwcm9wKSA6IHRoaW5nW3Byb3BdXG59XG5cbi8qI19fUFVSRV9fKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQodGhpbmc6IGFueSwgcHJvcE9yT2xkVmFsdWU6IFByb3BlcnR5S2V5LCB2YWx1ZTogYW55KSB7XG5cdGNvbnN0IHQgPSBnZXRBcmNodHlwZSh0aGluZylcblx0aWYgKHQgPT09IEFyY2h0eXBlLk1hcCkgdGhpbmcuc2V0KHByb3BPck9sZFZhbHVlLCB2YWx1ZSlcblx0ZWxzZSBpZiAodCA9PT0gQXJjaHR5cGUuU2V0KSB7XG5cdFx0dGhpbmcuZGVsZXRlKHByb3BPck9sZFZhbHVlKVxuXHRcdHRoaW5nLmFkZCh2YWx1ZSlcblx0fSBlbHNlIHRoaW5nW3Byb3BPck9sZFZhbHVlXSA9IHZhbHVlXG59XG5cbi8qI19fUFVSRV9fKi9cbmV4cG9ydCBmdW5jdGlvbiBpcyh4OiBhbnksIHk6IGFueSk6IGJvb2xlYW4ge1xuXHQvLyBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmJqcy9ibG9iL2M2OTkwNGE1MTFiOTAwMjY2OTM1MTY4MjIzMDYzZGQ4NzcyZGZjNDAvcGFja2FnZXMvZmJqcy9zcmMvY29yZS9zaGFsbG93RXF1YWwuanNcblx0aWYgKHggPT09IHkpIHtcblx0XHRyZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHlcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5XG5cdH1cbn1cblxuLyojX19QVVJFX18qL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWFwKHRhcmdldDogYW55KTogdGFyZ2V0IGlzIEFueU1hcCB7XG5cdHJldHVybiBoYXNNYXAgJiYgdGFyZ2V0IGluc3RhbmNlb2YgTWFwXG59XG5cbi8qI19fUFVSRV9fKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NldCh0YXJnZXQ6IGFueSk6IHRhcmdldCBpcyBBbnlTZXQge1xuXHRyZXR1cm4gaGFzU2V0ICYmIHRhcmdldCBpbnN0YW5jZW9mIFNldFxufVxuLyojX19QVVJFX18qL1xuZXhwb3J0IGZ1bmN0aW9uIGxhdGVzdChzdGF0ZTogSW1tZXJTdGF0ZSk6IGFueSB7XG5cdHJldHVybiBzdGF0ZS5jb3B5XyB8fCBzdGF0ZS5iYXNlX1xufVxuXG4vKiNfX1BVUkVfXyovXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0NvcHkoYmFzZTogYW55KSB7XG5cdGlmIChBcnJheS5pc0FycmF5KGJhc2UpKSByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYmFzZSlcblx0Y29uc3QgZGVzY3JpcHRvcnMgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGJhc2UpXG5cdGRlbGV0ZSBkZXNjcmlwdG9yc1tEUkFGVF9TVEFURSBhcyBhbnldXG5cdGxldCBrZXlzID0gb3duS2V5cyhkZXNjcmlwdG9ycylcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3Qga2V5OiBhbnkgPSBrZXlzW2ldXG5cdFx0Y29uc3QgZGVzYyA9IGRlc2NyaXB0b3JzW2tleV1cblx0XHRpZiAoZGVzYy53cml0YWJsZSA9PT0gZmFsc2UpIHtcblx0XHRcdGRlc2Mud3JpdGFibGUgPSB0cnVlXG5cdFx0XHRkZXNjLmNvbmZpZ3VyYWJsZSA9IHRydWVcblx0XHR9XG5cdFx0Ly8gbGlrZSBvYmplY3QuYXNzaWduLCB3ZSB3aWxsIHJlYWQgYW55IF9vd25fLCBnZXQvc2V0IGFjY2Vzc29ycy4gVGhpcyBoZWxwcyBpbiBkZWFsaW5nXG5cdFx0Ly8gd2l0aCBsaWJyYXJpZXMgdGhhdCB0cmFwIHZhbHVlcywgbGlrZSBtb2J4IG9yIHZ1ZVxuXHRcdC8vIHVubGlrZSBvYmplY3QuYXNzaWduLCBub24tZW51bWVyYWJsZXMgd2lsbCBiZSBjb3BpZWQgYXMgd2VsbFxuXHRcdGlmIChkZXNjLmdldCB8fCBkZXNjLnNldClcblx0XHRcdGRlc2NyaXB0b3JzW2tleV0gPSB7XG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0d3JpdGFibGU6IHRydWUsIC8vIGNvdWxkIGxpdmUgd2l0aCAhIWRlc2Muc2V0IGFzIHdlbGwgaGVyZS4uLlxuXHRcdFx0XHRlbnVtZXJhYmxlOiBkZXNjLmVudW1lcmFibGUsXG5cdFx0XHRcdHZhbHVlOiBiYXNlW2tleV1cblx0XHRcdH1cblx0fVxuXHRyZXR1cm4gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YoYmFzZSksIGRlc2NyaXB0b3JzKVxufVxuXG4vKipcbiAqIEZyZWV6ZXMgZHJhZnRhYmxlIG9iamVjdHMuIFJldHVybnMgdGhlIG9yaWdpbmFsIG9iamVjdC5cbiAqIEJ5IGRlZmF1bHQgZnJlZXplcyBzaGFsbG93bHksIGJ1dCBpZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIGB0cnVlYCBpdCB3aWxsIGZyZWV6ZSByZWN1cnNpdmVseS5cbiAqXG4gKiBAcGFyYW0gb2JqXG4gKiBAcGFyYW0gZGVlcFxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJlZXplPFQ+KG9iajogVCwgZGVlcD86IGJvb2xlYW4pOiBUXG5leHBvcnQgZnVuY3Rpb24gZnJlZXplPFQ+KG9iajogYW55LCBkZWVwOiBib29sZWFuID0gZmFsc2UpOiBUIHtcblx0aWYgKGlzRnJvemVuKG9iaikgfHwgaXNEcmFmdChvYmopIHx8ICFpc0RyYWZ0YWJsZShvYmopKSByZXR1cm4gb2JqXG5cdGlmIChnZXRBcmNodHlwZShvYmopID4gMSAvKiBNYXAgb3IgU2V0ICovKSB7XG5cdFx0b2JqLnNldCA9IG9iai5hZGQgPSBvYmouY2xlYXIgPSBvYmouZGVsZXRlID0gZG9udE11dGF0ZUZyb3plbkNvbGxlY3Rpb25zIGFzIGFueVxuXHR9XG5cdE9iamVjdC5mcmVlemUob2JqKVxuXHRpZiAoZGVlcCkgZWFjaChvYmosIChrZXksIHZhbHVlKSA9PiBmcmVlemUodmFsdWUsIHRydWUpLCB0cnVlKVxuXHRyZXR1cm4gb2JqXG59XG5cbmZ1bmN0aW9uIGRvbnRNdXRhdGVGcm96ZW5Db2xsZWN0aW9ucygpIHtcblx0ZGllKDIpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Zyb3plbihvYmo6IGFueSk6IGJvb2xlYW4ge1xuXHRpZiAob2JqID09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHRydWVcblx0Ly8gU2VlICM2MDAsIElFIGRpZXMgb24gbm9uLW9iamVjdHMgaW4gT2JqZWN0LmlzRnJvemVuXG5cdHJldHVybiBPYmplY3QuaXNGcm96ZW4ob2JqKVxufVxuIiwgImltcG9ydCB7XG5cdEltbWVyU3RhdGUsXG5cdFBhdGNoLFxuXHRJbW1lclNjb3BlLFxuXHREcmFmdGVkLFxuXHRBbnlPYmplY3QsXG5cdEltbWVyQmFzZVN0YXRlLFxuXHRBbnlNYXAsXG5cdEFueVNldCxcblx0UHJveHlUeXBlLFxuXHRkaWVcbn0gZnJvbSBcIi4uL2ludGVybmFsXCJcblxuLyoqIFBsdWdpbiB1dGlsaXRpZXMgKi9cbmNvbnN0IHBsdWdpbnM6IHtcblx0UGF0Y2hlcz86IHtcblx0XHRnZW5lcmF0ZVBhdGNoZXNfKFxuXHRcdFx0c3RhdGU6IEltbWVyU3RhdGUsXG5cdFx0XHRiYXNlUGF0aDogUGF0Y2hQYXRoLFxuXHRcdFx0cGF0Y2hlczogUGF0Y2hbXSxcblx0XHRcdGludmVyc2VQYXRjaGVzOiBQYXRjaFtdXG5cdFx0KTogdm9pZFxuXHRcdGdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzXyhcblx0XHRcdGJhc2U6IGFueSxcblx0XHRcdHJlcGxhY2VtZW50OiBhbnksXG5cdFx0XHRwYXRjaGVzOiBQYXRjaFtdLFxuXHRcdFx0aW52ZXJzZVBhdGNoZXM6IFBhdGNoW11cblx0XHQpOiB2b2lkXG5cdFx0YXBwbHlQYXRjaGVzXzxUPihkcmFmdDogVCwgcGF0Y2hlczogUGF0Y2hbXSk6IFRcblx0fVxuXHRFUzU/OiB7XG5cdFx0d2lsbEZpbmFsaXplRVM1XyhzY29wZTogSW1tZXJTY29wZSwgcmVzdWx0OiBhbnksIGlzUmVwbGFjZWQ6IGJvb2xlYW4pOiB2b2lkXG5cdFx0Y3JlYXRlRVM1UHJveHlfPFQ+KFxuXHRcdFx0YmFzZTogVCxcblx0XHRcdHBhcmVudD86IEltbWVyU3RhdGVcblx0XHQpOiBEcmFmdGVkPFQsIEVTNU9iamVjdFN0YXRlIHwgRVM1QXJyYXlTdGF0ZT5cblx0XHRoYXNDaGFuZ2VzXyhzdGF0ZTogRVM1QXJyYXlTdGF0ZSB8IEVTNU9iamVjdFN0YXRlKTogYm9vbGVhblxuXHR9XG5cdE1hcFNldD86IHtcblx0XHRwcm94eU1hcF88VCBleHRlbmRzIEFueU1hcD4odGFyZ2V0OiBULCBwYXJlbnQ/OiBJbW1lclN0YXRlKTogVFxuXHRcdHByb3h5U2V0XzxUIGV4dGVuZHMgQW55U2V0Pih0YXJnZXQ6IFQsIHBhcmVudD86IEltbWVyU3RhdGUpOiBUXG5cdH1cbn0gPSB7fVxuXG50eXBlIFBsdWdpbnMgPSB0eXBlb2YgcGx1Z2luc1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGx1Z2luPEsgZXh0ZW5kcyBrZXlvZiBQbHVnaW5zPihcblx0cGx1Z2luS2V5OiBLXG4pOiBFeGNsdWRlPFBsdWdpbnNbS10sIHVuZGVmaW5lZD4ge1xuXHRjb25zdCBwbHVnaW4gPSBwbHVnaW5zW3BsdWdpbktleV1cblx0aWYgKCFwbHVnaW4pIHtcblx0XHRkaWUoMTgsIHBsdWdpbktleSlcblx0fVxuXHQvLyBAdHMtaWdub3JlXG5cdHJldHVybiBwbHVnaW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRQbHVnaW48SyBleHRlbmRzIGtleW9mIFBsdWdpbnM+KFxuXHRwbHVnaW5LZXk6IEssXG5cdGltcGxlbWVudGF0aW9uOiBQbHVnaW5zW0tdXG4pOiB2b2lkIHtcblx0aWYgKCFwbHVnaW5zW3BsdWdpbktleV0pIHBsdWdpbnNbcGx1Z2luS2V5XSA9IGltcGxlbWVudGF0aW9uXG59XG5cbi8qKiBFUzUgUGx1Z2luICovXG5cbmludGVyZmFjZSBFUzVCYXNlU3RhdGUgZXh0ZW5kcyBJbW1lckJhc2VTdGF0ZSB7XG5cdGFzc2lnbmVkXzoge1trZXk6IHN0cmluZ106IGFueX1cblx0cGFyZW50Xz86IEltbWVyU3RhdGVcblx0cmV2b2tlZF86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBFUzVPYmplY3RTdGF0ZSBleHRlbmRzIEVTNUJhc2VTdGF0ZSB7XG5cdHR5cGVfOiBQcm94eVR5cGUuRVM1T2JqZWN0XG5cdGRyYWZ0XzogRHJhZnRlZDxBbnlPYmplY3QsIEVTNU9iamVjdFN0YXRlPlxuXHRiYXNlXzogQW55T2JqZWN0XG5cdGNvcHlfOiBBbnlPYmplY3QgfCBudWxsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRVM1QXJyYXlTdGF0ZSBleHRlbmRzIEVTNUJhc2VTdGF0ZSB7XG5cdHR5cGVfOiBQcm94eVR5cGUuRVM1QXJyYXlcblx0ZHJhZnRfOiBEcmFmdGVkPEFueU9iamVjdCwgRVM1QXJyYXlTdGF0ZT5cblx0YmFzZV86IGFueVxuXHRjb3B5XzogYW55XG59XG5cbi8qKiBNYXAgLyBTZXQgcGx1Z2luICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFwU3RhdGUgZXh0ZW5kcyBJbW1lckJhc2VTdGF0ZSB7XG5cdHR5cGVfOiBQcm94eVR5cGUuTWFwXG5cdGNvcHlfOiBBbnlNYXAgfCB1bmRlZmluZWRcblx0YXNzaWduZWRfOiBNYXA8YW55LCBib29sZWFuPiB8IHVuZGVmaW5lZFxuXHRiYXNlXzogQW55TWFwXG5cdHJldm9rZWRfOiBib29sZWFuXG5cdGRyYWZ0XzogRHJhZnRlZDxBbnlNYXAsIE1hcFN0YXRlPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldFN0YXRlIGV4dGVuZHMgSW1tZXJCYXNlU3RhdGUge1xuXHR0eXBlXzogUHJveHlUeXBlLlNldFxuXHRjb3B5XzogQW55U2V0IHwgdW5kZWZpbmVkXG5cdGJhc2VfOiBBbnlTZXRcblx0ZHJhZnRzXzogTWFwPGFueSwgRHJhZnRlZD4gLy8gbWFwcyB0aGUgb3JpZ2luYWwgdmFsdWUgdG8gdGhlIGRyYWZ0IHZhbHVlIGluIHRoZSBuZXcgc2V0XG5cdHJldm9rZWRfOiBib29sZWFuXG5cdGRyYWZ0XzogRHJhZnRlZDxBbnlTZXQsIFNldFN0YXRlPlxufVxuXG4vKiogUGF0Y2hlcyBwbHVnaW4gKi9cblxuZXhwb3J0IHR5cGUgUGF0Y2hQYXRoID0gKHN0cmluZyB8IG51bWJlcilbXVxuIiwgImltcG9ydCB7XG5cdFBhdGNoLFxuXHRQYXRjaExpc3RlbmVyLFxuXHREcmFmdGVkLFxuXHRJbW1lcixcblx0RFJBRlRfU1RBVEUsXG5cdEltbWVyU3RhdGUsXG5cdFByb3h5VHlwZSxcblx0Z2V0UGx1Z2luXG59IGZyb20gXCIuLi9pbnRlcm5hbFwiXG5pbXBvcnQge2RpZX0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yc1wiXG5cbi8qKiBFYWNoIHNjb3BlIHJlcHJlc2VudHMgYSBgcHJvZHVjZWAgY2FsbC4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBJbW1lclNjb3BlIHtcblx0cGF0Y2hlc18/OiBQYXRjaFtdXG5cdGludmVyc2VQYXRjaGVzXz86IFBhdGNoW11cblx0Y2FuQXV0b0ZyZWV6ZV86IGJvb2xlYW5cblx0ZHJhZnRzXzogYW55W11cblx0cGFyZW50Xz86IEltbWVyU2NvcGVcblx0cGF0Y2hMaXN0ZW5lcl8/OiBQYXRjaExpc3RlbmVyXG5cdGltbWVyXzogSW1tZXJcblx0dW5maW5hbGl6ZWREcmFmdHNfOiBudW1iZXJcbn1cblxubGV0IGN1cnJlbnRTY29wZTogSW1tZXJTY29wZSB8IHVuZGVmaW5lZFxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudFNjb3BlKCkge1xuXHRpZiAoX19ERVZfXyAmJiAhY3VycmVudFNjb3BlKSBkaWUoMClcblx0cmV0dXJuIGN1cnJlbnRTY29wZSFcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2NvcGUoXG5cdHBhcmVudF86IEltbWVyU2NvcGUgfCB1bmRlZmluZWQsXG5cdGltbWVyXzogSW1tZXJcbik6IEltbWVyU2NvcGUge1xuXHRyZXR1cm4ge1xuXHRcdGRyYWZ0c186IFtdLFxuXHRcdHBhcmVudF8sXG5cdFx0aW1tZXJfLFxuXHRcdC8vIFdoZW5ldmVyIHRoZSBtb2RpZmllZCBkcmFmdCBjb250YWlucyBhIGRyYWZ0IGZyb20gYW5vdGhlciBzY29wZSwgd2Vcblx0XHQvLyBuZWVkIHRvIHByZXZlbnQgYXV0by1mcmVlemluZyBzbyB0aGUgdW5vd25lZCBkcmFmdCBjYW4gYmUgZmluYWxpemVkLlxuXHRcdGNhbkF1dG9GcmVlemVfOiB0cnVlLFxuXHRcdHVuZmluYWxpemVkRHJhZnRzXzogMFxuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQYXRjaGVzSW5TY29wZShcblx0c2NvcGU6IEltbWVyU2NvcGUsXG5cdHBhdGNoTGlzdGVuZXI/OiBQYXRjaExpc3RlbmVyXG4pIHtcblx0aWYgKHBhdGNoTGlzdGVuZXIpIHtcblx0XHRnZXRQbHVnaW4oXCJQYXRjaGVzXCIpIC8vIGFzc2VydCB3ZSBoYXZlIHRoZSBwbHVnaW5cblx0XHRzY29wZS5wYXRjaGVzXyA9IFtdXG5cdFx0c2NvcGUuaW52ZXJzZVBhdGNoZXNfID0gW11cblx0XHRzY29wZS5wYXRjaExpc3RlbmVyXyA9IHBhdGNoTGlzdGVuZXJcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmV2b2tlU2NvcGUoc2NvcGU6IEltbWVyU2NvcGUpIHtcblx0bGVhdmVTY29wZShzY29wZSlcblx0c2NvcGUuZHJhZnRzXy5mb3JFYWNoKHJldm9rZURyYWZ0KVxuXHQvLyBAdHMtaWdub3JlXG5cdHNjb3BlLmRyYWZ0c18gPSBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsZWF2ZVNjb3BlKHNjb3BlOiBJbW1lclNjb3BlKSB7XG5cdGlmIChzY29wZSA9PT0gY3VycmVudFNjb3BlKSB7XG5cdFx0Y3VycmVudFNjb3BlID0gc2NvcGUucGFyZW50X1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnRlclNjb3BlKGltbWVyOiBJbW1lcikge1xuXHRyZXR1cm4gKGN1cnJlbnRTY29wZSA9IGNyZWF0ZVNjb3BlKGN1cnJlbnRTY29wZSwgaW1tZXIpKVxufVxuXG5mdW5jdGlvbiByZXZva2VEcmFmdChkcmFmdDogRHJhZnRlZCkge1xuXHRjb25zdCBzdGF0ZTogSW1tZXJTdGF0ZSA9IGRyYWZ0W0RSQUZUX1NUQVRFXVxuXHRpZiAoXG5cdFx0c3RhdGUudHlwZV8gPT09IFByb3h5VHlwZS5Qcm94eU9iamVjdCB8fFxuXHRcdHN0YXRlLnR5cGVfID09PSBQcm94eVR5cGUuUHJveHlBcnJheVxuXHQpXG5cdFx0c3RhdGUucmV2b2tlXygpXG5cdGVsc2Ugc3RhdGUucmV2b2tlZF8gPSB0cnVlXG59XG4iLCAiaW1wb3J0IHtcblx0SW1tZXJTY29wZSxcblx0RFJBRlRfU1RBVEUsXG5cdGlzRHJhZnRhYmxlLFxuXHROT1RISU5HLFxuXHRQYXRjaFBhdGgsXG5cdGVhY2gsXG5cdGhhcyxcblx0ZnJlZXplLFxuXHRJbW1lclN0YXRlLFxuXHRpc0RyYWZ0LFxuXHRTZXRTdGF0ZSxcblx0c2V0LFxuXHRQcm94eVR5cGUsXG5cdGdldFBsdWdpbixcblx0ZGllLFxuXHRyZXZva2VTY29wZSxcblx0aXNGcm96ZW4sXG5cdHNoYWxsb3dDb3B5XG59IGZyb20gXCIuLi9pbnRlcm5hbFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzUmVzdWx0KHJlc3VsdDogYW55LCBzY29wZTogSW1tZXJTY29wZSkge1xuXHRzY29wZS51bmZpbmFsaXplZERyYWZ0c18gPSBzY29wZS5kcmFmdHNfLmxlbmd0aFxuXHRjb25zdCBiYXNlRHJhZnQgPSBzY29wZS5kcmFmdHNfIVswXVxuXHRjb25zdCBpc1JlcGxhY2VkID0gcmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSBiYXNlRHJhZnRcblx0aWYgKCFzY29wZS5pbW1lcl8udXNlUHJveGllc18pXG5cdFx0Z2V0UGx1Z2luKFwiRVM1XCIpLndpbGxGaW5hbGl6ZUVTNV8oc2NvcGUsIHJlc3VsdCwgaXNSZXBsYWNlZClcblx0aWYgKGlzUmVwbGFjZWQpIHtcblx0XHRpZiAoYmFzZURyYWZ0W0RSQUZUX1NUQVRFXS5tb2RpZmllZF8pIHtcblx0XHRcdHJldm9rZVNjb3BlKHNjb3BlKVxuXHRcdFx0ZGllKDQpXG5cdFx0fVxuXHRcdGlmIChpc0RyYWZ0YWJsZShyZXN1bHQpKSB7XG5cdFx0XHQvLyBGaW5hbGl6ZSB0aGUgcmVzdWx0IGluIGNhc2UgaXQgY29udGFpbnMgKG9yIGlzKSBhIHN1YnNldCBvZiB0aGUgZHJhZnQuXG5cdFx0XHRyZXN1bHQgPSBmaW5hbGl6ZShzY29wZSwgcmVzdWx0KVxuXHRcdFx0aWYgKCFzY29wZS5wYXJlbnRfKSBtYXliZUZyZWV6ZShzY29wZSwgcmVzdWx0KVxuXHRcdH1cblx0XHRpZiAoc2NvcGUucGF0Y2hlc18pIHtcblx0XHRcdGdldFBsdWdpbihcIlBhdGNoZXNcIikuZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfKFxuXHRcdFx0XHRiYXNlRHJhZnRbRFJBRlRfU1RBVEVdLmJhc2VfLFxuXHRcdFx0XHRyZXN1bHQsXG5cdFx0XHRcdHNjb3BlLnBhdGNoZXNfLFxuXHRcdFx0XHRzY29wZS5pbnZlcnNlUGF0Y2hlc18hXG5cdFx0XHQpXG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIEZpbmFsaXplIHRoZSBiYXNlIGRyYWZ0LlxuXHRcdHJlc3VsdCA9IGZpbmFsaXplKHNjb3BlLCBiYXNlRHJhZnQsIFtdKVxuXHR9XG5cdHJldm9rZVNjb3BlKHNjb3BlKVxuXHRpZiAoc2NvcGUucGF0Y2hlc18pIHtcblx0XHRzY29wZS5wYXRjaExpc3RlbmVyXyEoc2NvcGUucGF0Y2hlc18sIHNjb3BlLmludmVyc2VQYXRjaGVzXyEpXG5cdH1cblx0cmV0dXJuIHJlc3VsdCAhPT0gTk9USElORyA/IHJlc3VsdCA6IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBmaW5hbGl6ZShyb290U2NvcGU6IEltbWVyU2NvcGUsIHZhbHVlOiBhbnksIHBhdGg/OiBQYXRjaFBhdGgpIHtcblx0Ly8gRG9uJ3QgcmVjdXJzZSBpbiB0aG8gcmVjdXJzaXZlIGRhdGEgc3RydWN0dXJlc1xuXHRpZiAoaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gdmFsdWVcblxuXHRjb25zdCBzdGF0ZTogSW1tZXJTdGF0ZSA9IHZhbHVlW0RSQUZUX1NUQVRFXVxuXHQvLyBBIHBsYWluIG9iamVjdCwgbWlnaHQgbmVlZCBmcmVlemluZywgbWlnaHQgY29udGFpbiBkcmFmdHNcblx0aWYgKCFzdGF0ZSkge1xuXHRcdGVhY2goXG5cdFx0XHR2YWx1ZSxcblx0XHRcdChrZXksIGNoaWxkVmFsdWUpID0+XG5cdFx0XHRcdGZpbmFsaXplUHJvcGVydHkocm9vdFNjb3BlLCBzdGF0ZSwgdmFsdWUsIGtleSwgY2hpbGRWYWx1ZSwgcGF0aCksXG5cdFx0XHR0cnVlIC8vIFNlZSAjNTkwLCBkb24ndCByZWN1cnNlIGludG8gbm9uLWVudW1lcmFibGUgb2Ygbm9uIGRyYWZ0ZWQgb2JqZWN0c1xuXHRcdClcblx0XHRyZXR1cm4gdmFsdWVcblx0fVxuXHQvLyBOZXZlciBmaW5hbGl6ZSBkcmFmdHMgb3duZWQgYnkgYW5vdGhlciBzY29wZS5cblx0aWYgKHN0YXRlLnNjb3BlXyAhPT0gcm9vdFNjb3BlKSByZXR1cm4gdmFsdWVcblx0Ly8gVW5tb2RpZmllZCBkcmFmdCwgcmV0dXJuIHRoZSAoZnJvemVuKSBvcmlnaW5hbFxuXHRpZiAoIXN0YXRlLm1vZGlmaWVkXykge1xuXHRcdG1heWJlRnJlZXplKHJvb3RTY29wZSwgc3RhdGUuYmFzZV8sIHRydWUpXG5cdFx0cmV0dXJuIHN0YXRlLmJhc2VfXG5cdH1cblx0Ly8gTm90IGZpbmFsaXplZCB5ZXQsIGxldCdzIGRvIHRoYXQgbm93XG5cdGlmICghc3RhdGUuZmluYWxpemVkXykge1xuXHRcdHN0YXRlLmZpbmFsaXplZF8gPSB0cnVlXG5cdFx0c3RhdGUuc2NvcGVfLnVuZmluYWxpemVkRHJhZnRzXy0tXG5cdFx0Y29uc3QgcmVzdWx0ID1cblx0XHRcdC8vIEZvciBFUzUsIGNyZWF0ZSBhIGdvb2QgY29weSBmcm9tIHRoZSBkcmFmdCBmaXJzdCwgd2l0aCBhZGRlZCBrZXlzIGFuZCB3aXRob3V0IGRlbGV0ZWQga2V5cy5cblx0XHRcdHN0YXRlLnR5cGVfID09PSBQcm94eVR5cGUuRVM1T2JqZWN0IHx8IHN0YXRlLnR5cGVfID09PSBQcm94eVR5cGUuRVM1QXJyYXlcblx0XHRcdFx0PyAoc3RhdGUuY29weV8gPSBzaGFsbG93Q29weShzdGF0ZS5kcmFmdF8pKVxuXHRcdFx0XHQ6IHN0YXRlLmNvcHlfXG5cdFx0Ly8gRmluYWxpemUgYWxsIGNoaWxkcmVuIG9mIHRoZSBjb3B5XG5cdFx0Ly8gRm9yIHNldHMgd2UgY2xvbmUgYmVmb3JlIGl0ZXJhdGluZywgb3RoZXJ3aXNlIHdlIGNhbiBnZXQgaW4gZW5kbGVzcyBsb29wIGR1ZSB0byBtb2RpZnlpbmcgZHVyaW5nIGl0ZXJhdGlvbiwgc2VlICM2Mjhcblx0XHQvLyBBbHRob3VnaCB0aGUgb3JpZ2luYWwgdGVzdCBjYXNlIGRvZXNuJ3Qgc2VlbSB2YWxpZCBhbnl3YXksIHNvIGlmIHRoaXMgaW4gdGhlIHdheSB3ZSBjYW4gdHVybiB0aGUgbmV4dCBsaW5lXG5cdFx0Ly8gYmFjayB0byBlYWNoKHJlc3VsdCwgLi4uLilcblx0XHRlYWNoKFxuXHRcdFx0c3RhdGUudHlwZV8gPT09IFByb3h5VHlwZS5TZXQgPyBuZXcgU2V0KHJlc3VsdCkgOiByZXN1bHQsXG5cdFx0XHQoa2V5LCBjaGlsZFZhbHVlKSA9PlxuXHRcdFx0XHRmaW5hbGl6ZVByb3BlcnR5KHJvb3RTY29wZSwgc3RhdGUsIHJlc3VsdCwga2V5LCBjaGlsZFZhbHVlLCBwYXRoKVxuXHRcdClcblx0XHQvLyBldmVyeXRoaW5nIGluc2lkZSBpcyBmcm96ZW4sIHdlIGNhbiBmcmVlemUgaGVyZVxuXHRcdG1heWJlRnJlZXplKHJvb3RTY29wZSwgcmVzdWx0LCBmYWxzZSlcblx0XHQvLyBmaXJzdCB0aW1lIGZpbmFsaXppbmcsIGxldCdzIGNyZWF0ZSB0aG9zZSBwYXRjaGVzXG5cdFx0aWYgKHBhdGggJiYgcm9vdFNjb3BlLnBhdGNoZXNfKSB7XG5cdFx0XHRnZXRQbHVnaW4oXCJQYXRjaGVzXCIpLmdlbmVyYXRlUGF0Y2hlc18oXG5cdFx0XHRcdHN0YXRlLFxuXHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRyb290U2NvcGUucGF0Y2hlc18sXG5cdFx0XHRcdHJvb3RTY29wZS5pbnZlcnNlUGF0Y2hlc18hXG5cdFx0XHQpXG5cdFx0fVxuXHR9XG5cdHJldHVybiBzdGF0ZS5jb3B5X1xufVxuXG5mdW5jdGlvbiBmaW5hbGl6ZVByb3BlcnR5KFxuXHRyb290U2NvcGU6IEltbWVyU2NvcGUsXG5cdHBhcmVudFN0YXRlOiB1bmRlZmluZWQgfCBJbW1lclN0YXRlLFxuXHR0YXJnZXRPYmplY3Q6IGFueSxcblx0cHJvcDogc3RyaW5nIHwgbnVtYmVyLFxuXHRjaGlsZFZhbHVlOiBhbnksXG5cdHJvb3RQYXRoPzogUGF0Y2hQYXRoXG4pIHtcblx0aWYgKF9fREVWX18gJiYgY2hpbGRWYWx1ZSA9PT0gdGFyZ2V0T2JqZWN0KSBkaWUoNSlcblx0aWYgKGlzRHJhZnQoY2hpbGRWYWx1ZSkpIHtcblx0XHRjb25zdCBwYXRoID1cblx0XHRcdHJvb3RQYXRoICYmXG5cdFx0XHRwYXJlbnRTdGF0ZSAmJlxuXHRcdFx0cGFyZW50U3RhdGUhLnR5cGVfICE9PSBQcm94eVR5cGUuU2V0ICYmIC8vIFNldCBvYmplY3RzIGFyZSBhdG9taWMgc2luY2UgdGhleSBoYXZlIG5vIGtleXMuXG5cdFx0XHQhaGFzKChwYXJlbnRTdGF0ZSBhcyBFeGNsdWRlPEltbWVyU3RhdGUsIFNldFN0YXRlPikuYXNzaWduZWRfISwgcHJvcCkgLy8gU2tpcCBkZWVwIHBhdGNoZXMgZm9yIGFzc2lnbmVkIGtleXMuXG5cdFx0XHRcdD8gcm9vdFBhdGghLmNvbmNhdChwcm9wKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdC8vIERyYWZ0cyBvd25lZCBieSBgc2NvcGVgIGFyZSBmaW5hbGl6ZWQgaGVyZS5cblx0XHRjb25zdCByZXMgPSBmaW5hbGl6ZShyb290U2NvcGUsIGNoaWxkVmFsdWUsIHBhdGgpXG5cdFx0c2V0KHRhcmdldE9iamVjdCwgcHJvcCwgcmVzKVxuXHRcdC8vIERyYWZ0cyBmcm9tIGFub3RoZXIgc2NvcGUgbXVzdCBwcmV2ZW50ZWQgdG8gYmUgZnJvemVuXG5cdFx0Ly8gaWYgd2UgZ290IGEgZHJhZnQgYmFjayBmcm9tIGZpbmFsaXplLCB3ZSdyZSBpbiBhIG5lc3RlZCBwcm9kdWNlIGFuZCBzaG91bGRuJ3QgZnJlZXplXG5cdFx0aWYgKGlzRHJhZnQocmVzKSkge1xuXHRcdFx0cm9vdFNjb3BlLmNhbkF1dG9GcmVlemVfID0gZmFsc2Vcblx0XHR9IGVsc2UgcmV0dXJuXG5cdH1cblx0Ly8gU2VhcmNoIG5ldyBvYmplY3RzIGZvciB1bmZpbmFsaXplZCBkcmFmdHMuIEZyb3plbiBvYmplY3RzIHNob3VsZCBuZXZlciBjb250YWluIGRyYWZ0cy5cblx0aWYgKGlzRHJhZnRhYmxlKGNoaWxkVmFsdWUpICYmICFpc0Zyb3plbihjaGlsZFZhbHVlKSkge1xuXHRcdGlmICghcm9vdFNjb3BlLmltbWVyXy5hdXRvRnJlZXplXyAmJiByb290U2NvcGUudW5maW5hbGl6ZWREcmFmdHNfIDwgMSkge1xuXHRcdFx0Ly8gb3B0aW1pemF0aW9uOiBpZiBhbiBvYmplY3QgaXMgbm90IGEgZHJhZnQsIGFuZCB3ZSBkb24ndCBoYXZlIHRvXG5cdFx0XHQvLyBkZWVwZnJlZXplIGV2ZXJ5dGhpbmcsIGFuZCB3ZSBhcmUgc3VyZSB0aGF0IG5vIGRyYWZ0cyBhcmUgbGVmdCBpbiB0aGUgcmVtYWluaW5nIG9iamVjdFxuXHRcdFx0Ly8gY2F1c2Ugd2Ugc2F3IGFuZCBmaW5hbGl6ZWQgYWxsIGRyYWZ0cyBhbHJlYWR5OyB3ZSBjYW4gc3RvcCB2aXNpdGluZyB0aGUgcmVzdCBvZiB0aGUgdHJlZS5cblx0XHRcdC8vIFRoaXMgYmVuZWZpdHMgZXNwZWNpYWxseSBhZGRpbmcgbGFyZ2UgZGF0YSB0cmVlJ3Mgd2l0aG91dCBmdXJ0aGVyIHByb2Nlc3NpbmcuXG5cdFx0XHQvLyBTZWUgYWRkLWRhdGEuanMgcGVyZiB0ZXN0XG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cdFx0ZmluYWxpemUocm9vdFNjb3BlLCBjaGlsZFZhbHVlKVxuXHRcdC8vIGltbWVyIGRlZXAgZnJlZXplcyBwbGFpbiBvYmplY3RzLCBzbyBpZiB0aGVyZSBpcyBubyBwYXJlbnQgc3RhdGUsIHdlIGZyZWV6ZSBhcyB3ZWxsXG5cdFx0aWYgKCFwYXJlbnRTdGF0ZSB8fCAhcGFyZW50U3RhdGUuc2NvcGVfLnBhcmVudF8pXG5cdFx0XHRtYXliZUZyZWV6ZShyb290U2NvcGUsIGNoaWxkVmFsdWUpXG5cdH1cbn1cblxuZnVuY3Rpb24gbWF5YmVGcmVlemUoc2NvcGU6IEltbWVyU2NvcGUsIHZhbHVlOiBhbnksIGRlZXAgPSBmYWxzZSkge1xuXHRpZiAoc2NvcGUuaW1tZXJfLmF1dG9GcmVlemVfICYmIHNjb3BlLmNhbkF1dG9GcmVlemVfKSB7XG5cdFx0ZnJlZXplKHZhbHVlLCBkZWVwKVxuXHR9XG59XG4iLCAiaW1wb3J0IHtcblx0ZWFjaCxcblx0aGFzLFxuXHRpcyxcblx0aXNEcmFmdGFibGUsXG5cdHNoYWxsb3dDb3B5LFxuXHRsYXRlc3QsXG5cdEltbWVyQmFzZVN0YXRlLFxuXHRJbW1lclN0YXRlLFxuXHREcmFmdGVkLFxuXHRBbnlPYmplY3QsXG5cdEFueUFycmF5LFxuXHRPYmplY3Rpc2gsXG5cdGdldEN1cnJlbnRTY29wZSxcblx0RFJBRlRfU1RBVEUsXG5cdGRpZSxcblx0Y3JlYXRlUHJveHksXG5cdFByb3h5VHlwZVxufSBmcm9tIFwiLi4vaW50ZXJuYWxcIlxuXG5pbnRlcmZhY2UgUHJveHlCYXNlU3RhdGUgZXh0ZW5kcyBJbW1lckJhc2VTdGF0ZSB7XG5cdGFzc2lnbmVkXzoge1xuXHRcdFtwcm9wZXJ0eTogc3RyaW5nXTogYm9vbGVhblxuXHR9XG5cdHBhcmVudF8/OiBJbW1lclN0YXRlXG5cdHJldm9rZV8oKTogdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb3h5T2JqZWN0U3RhdGUgZXh0ZW5kcyBQcm94eUJhc2VTdGF0ZSB7XG5cdHR5cGVfOiBQcm94eVR5cGUuUHJveHlPYmplY3Rcblx0YmFzZV86IGFueVxuXHRjb3B5XzogYW55XG5cdGRyYWZ0XzogRHJhZnRlZDxBbnlPYmplY3QsIFByb3h5T2JqZWN0U3RhdGU+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJveHlBcnJheVN0YXRlIGV4dGVuZHMgUHJveHlCYXNlU3RhdGUge1xuXHR0eXBlXzogUHJveHlUeXBlLlByb3h5QXJyYXlcblx0YmFzZV86IEFueUFycmF5XG5cdGNvcHlfOiBBbnlBcnJheSB8IG51bGxcblx0ZHJhZnRfOiBEcmFmdGVkPEFueUFycmF5LCBQcm94eUFycmF5U3RhdGU+XG59XG5cbnR5cGUgUHJveHlTdGF0ZSA9IFByb3h5T2JqZWN0U3RhdGUgfCBQcm94eUFycmF5U3RhdGVcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGRyYWZ0IG9mIHRoZSBgYmFzZWAgb2JqZWN0LlxuICpcbiAqIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHBhcmVudCBkcmFmdC1zdGF0ZSAodXNlZCBpbnRlcm5hbGx5KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3h5UHJveHk8VCBleHRlbmRzIE9iamVjdGlzaD4oXG5cdGJhc2U6IFQsXG5cdHBhcmVudD86IEltbWVyU3RhdGVcbik6IERyYWZ0ZWQ8VCwgUHJveHlTdGF0ZT4ge1xuXHRjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShiYXNlKVxuXHRjb25zdCBzdGF0ZTogUHJveHlTdGF0ZSA9IHtcblx0XHR0eXBlXzogaXNBcnJheSA/IFByb3h5VHlwZS5Qcm94eUFycmF5IDogKFByb3h5VHlwZS5Qcm94eU9iamVjdCBhcyBhbnkpLFxuXHRcdC8vIFRyYWNrIHdoaWNoIHByb2R1Y2UgY2FsbCB0aGlzIGlzIGFzc29jaWF0ZWQgd2l0aC5cblx0XHRzY29wZV86IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKSEsXG5cdFx0Ly8gVHJ1ZSBmb3IgYm90aCBzaGFsbG93IGFuZCBkZWVwIGNoYW5nZXMuXG5cdFx0bW9kaWZpZWRfOiBmYWxzZSxcblx0XHQvLyBVc2VkIGR1cmluZyBmaW5hbGl6YXRpb24uXG5cdFx0ZmluYWxpemVkXzogZmFsc2UsXG5cdFx0Ly8gVHJhY2sgd2hpY2ggcHJvcGVydGllcyBoYXZlIGJlZW4gYXNzaWduZWQgKHRydWUpIG9yIGRlbGV0ZWQgKGZhbHNlKS5cblx0XHRhc3NpZ25lZF86IHt9LFxuXHRcdC8vIFRoZSBwYXJlbnQgZHJhZnQgc3RhdGUuXG5cdFx0cGFyZW50XzogcGFyZW50LFxuXHRcdC8vIFRoZSBiYXNlIHN0YXRlLlxuXHRcdGJhc2VfOiBiYXNlLFxuXHRcdC8vIFRoZSBiYXNlIHByb3h5LlxuXHRcdGRyYWZ0XzogbnVsbCBhcyBhbnksIC8vIHNldCBiZWxvd1xuXHRcdC8vIFRoZSBiYXNlIGNvcHkgd2l0aCBhbnkgdXBkYXRlZCB2YWx1ZXMuXG5cdFx0Y29weV86IG51bGwsXG5cdFx0Ly8gQ2FsbGVkIGJ5IHRoZSBgcHJvZHVjZWAgZnVuY3Rpb24uXG5cdFx0cmV2b2tlXzogbnVsbCBhcyBhbnksXG5cdFx0aXNNYW51YWxfOiBmYWxzZVxuXHR9XG5cblx0Ly8gdGhlIHRyYXBzIG11c3QgdGFyZ2V0IHNvbWV0aGluZywgYSBiaXQgbGlrZSB0aGUgJ3JlYWwnIGJhc2UuXG5cdC8vIGJ1dCBhbHNvLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIGZyb20gdGhlIHRhcmdldCB3aGF0IHRoZSByZWxldmFudCBzdGF0ZSBpc1xuXHQvLyAodG8gYXZvaWQgY3JlYXRpbmcgdHJhcHMgcGVyIGluc3RhbmNlIHRvIGNhcHR1cmUgdGhlIHN0YXRlIGluIGNsb3N1cmUsXG5cdC8vIGFuZCB0byBhdm9pZCBjcmVhdGluZyB3ZWlyZCBoaWRkZW4gcHJvcGVydGllcyBhcyB3ZWxsKVxuXHQvLyBTbyB0aGUgdHJpY2sgaXMgdG8gdXNlICdzdGF0ZScgYXMgdGhlIGFjdHVhbCAndGFyZ2V0JyEgKGFuZCBtYWtlIHN1cmUgd2UgaW50ZXJjZXB0IGV2ZXJ5dGhpbmcpXG5cdC8vIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSBvZiBhbiBhcnJheSwgd2UgcHV0IHRoZSBzdGF0ZSBpbiBhbiBhcnJheSB0byBoYXZlIGJldHRlciBSZWZsZWN0IGRlZmF1bHRzIG9vdGJcblx0bGV0IHRhcmdldDogVCA9IHN0YXRlIGFzIGFueVxuXHRsZXQgdHJhcHM6IFByb3h5SGFuZGxlcjxvYmplY3QgfCBBcnJheTxhbnk+PiA9IG9iamVjdFRyYXBzXG5cdGlmIChpc0FycmF5KSB7XG5cdFx0dGFyZ2V0ID0gW3N0YXRlXSBhcyBhbnlcblx0XHR0cmFwcyA9IGFycmF5VHJhcHNcblx0fVxuXG5cdGNvbnN0IHtyZXZva2UsIHByb3h5fSA9IFByb3h5LnJldm9jYWJsZSh0YXJnZXQsIHRyYXBzKVxuXHRzdGF0ZS5kcmFmdF8gPSBwcm94eSBhcyBhbnlcblx0c3RhdGUucmV2b2tlXyA9IHJldm9rZVxuXHRyZXR1cm4gcHJveHkgYXMgYW55XG59XG5cbi8qKlxuICogT2JqZWN0IGRyYWZ0c1xuICovXG5leHBvcnQgY29uc3Qgb2JqZWN0VHJhcHM6IFByb3h5SGFuZGxlcjxQcm94eVN0YXRlPiA9IHtcblx0Z2V0KHN0YXRlLCBwcm9wKSB7XG5cdFx0aWYgKHByb3AgPT09IERSQUZUX1NUQVRFKSByZXR1cm4gc3RhdGVcblxuXHRcdGNvbnN0IHNvdXJjZSA9IGxhdGVzdChzdGF0ZSlcblx0XHRpZiAoIWhhcyhzb3VyY2UsIHByb3ApKSB7XG5cdFx0XHQvLyBub24tZXhpc3Rpbmcgb3Igbm9uLW93biBwcm9wZXJ0eS4uLlxuXHRcdFx0cmV0dXJuIHJlYWRQcm9wRnJvbVByb3RvKHN0YXRlLCBzb3VyY2UsIHByb3ApXG5cdFx0fVxuXHRcdGNvbnN0IHZhbHVlID0gc291cmNlW3Byb3BdXG5cdFx0aWYgKHN0YXRlLmZpbmFsaXplZF8gfHwgIWlzRHJhZnRhYmxlKHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIHZhbHVlXG5cdFx0fVxuXHRcdC8vIENoZWNrIGZvciBleGlzdGluZyBkcmFmdCBpbiBtb2RpZmllZCBzdGF0ZS5cblx0XHQvLyBBc3NpZ25lZCB2YWx1ZXMgYXJlIG5ldmVyIGRyYWZ0ZWQuIFRoaXMgY2F0Y2hlcyBhbnkgZHJhZnRzIHdlIGNyZWF0ZWQsIHRvby5cblx0XHRpZiAodmFsdWUgPT09IHBlZWsoc3RhdGUuYmFzZV8sIHByb3ApKSB7XG5cdFx0XHRwcmVwYXJlQ29weShzdGF0ZSlcblx0XHRcdHJldHVybiAoc3RhdGUuY29weV8hW3Byb3AgYXMgYW55XSA9IGNyZWF0ZVByb3h5KFxuXHRcdFx0XHRzdGF0ZS5zY29wZV8uaW1tZXJfLFxuXHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0c3RhdGVcblx0XHRcdCkpXG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZVxuXHR9LFxuXHRoYXMoc3RhdGUsIHByb3ApIHtcblx0XHRyZXR1cm4gcHJvcCBpbiBsYXRlc3Qoc3RhdGUpXG5cdH0sXG5cdG93bktleXMoc3RhdGUpIHtcblx0XHRyZXR1cm4gUmVmbGVjdC5vd25LZXlzKGxhdGVzdChzdGF0ZSkpXG5cdH0sXG5cdHNldChcblx0XHRzdGF0ZTogUHJveHlPYmplY3RTdGF0ZSxcblx0XHRwcm9wOiBzdHJpbmcgLyogc3RyaWN0bHkgbm90LCBidXQgaGVscHMgVFMgKi8sXG5cdFx0dmFsdWVcblx0KSB7XG5cdFx0Y29uc3QgZGVzYyA9IGdldERlc2NyaXB0b3JGcm9tUHJvdG8obGF0ZXN0KHN0YXRlKSwgcHJvcClcblx0XHRpZiAoZGVzYz8uc2V0KSB7XG5cdFx0XHQvLyBzcGVjaWFsIGNhc2U6IGlmIHRoaXMgd3JpdGUgaXMgY2FwdHVyZWQgYnkgYSBzZXR0ZXIsIHdlIGhhdmVcblx0XHRcdC8vIHRvIHRyaWdnZXIgaXQgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG5cdFx0XHRkZXNjLnNldC5jYWxsKHN0YXRlLmRyYWZ0XywgdmFsdWUpXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdH1cblx0XHRpZiAoIXN0YXRlLm1vZGlmaWVkXykge1xuXHRcdFx0Ly8gdGhlIGxhc3QgY2hlY2sgaXMgYmVjYXVzZSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggc2V0dGluZyBhIG5vbi1leGlzdGluZyB0byB1bmRlZmluZWQgKHdoaWNoIGlzIGEgY2hhbmdlKVxuXHRcdFx0Ly8gZnJvbSBzZXR0aW5nIGFuIGV4aXN0aW5nIHByb3BlcnR5IHdpdGggdmFsdWUgdW5kZWZpbmVkIHRvIHVuZGVmaW5lZCAod2hpY2ggaXMgbm90IGEgY2hhbmdlKVxuXHRcdFx0Y29uc3QgY3VycmVudCA9IHBlZWsobGF0ZXN0KHN0YXRlKSwgcHJvcClcblx0XHRcdC8vIHNwZWNpYWwgY2FzZSwgaWYgd2UgYXNzaWduaW5nIHRoZSBvcmlnaW5hbCB2YWx1ZSB0byBhIGRyYWZ0LCB3ZSBjYW4gaWdub3JlIHRoZSBhc3NpZ25tZW50XG5cdFx0XHRjb25zdCBjdXJyZW50U3RhdGU6IFByb3h5T2JqZWN0U3RhdGUgPSBjdXJyZW50Py5bRFJBRlRfU1RBVEVdXG5cdFx0XHRpZiAoY3VycmVudFN0YXRlICYmIGN1cnJlbnRTdGF0ZS5iYXNlXyA9PT0gdmFsdWUpIHtcblx0XHRcdFx0c3RhdGUuY29weV8hW3Byb3BdID0gdmFsdWVcblx0XHRcdFx0c3RhdGUuYXNzaWduZWRfW3Byb3BdID0gZmFsc2Vcblx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRcdH1cblx0XHRcdGlmIChpcyh2YWx1ZSwgY3VycmVudCkgJiYgKHZhbHVlICE9PSB1bmRlZmluZWQgfHwgaGFzKHN0YXRlLmJhc2VfLCBwcm9wKSkpXG5cdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0XHRwcmVwYXJlQ29weShzdGF0ZSlcblx0XHRcdG1hcmtDaGFuZ2VkKHN0YXRlKVxuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHN0YXRlLmNvcHlfIVtwcm9wXSA9PT0gdmFsdWUgJiZcblx0XHRcdC8vIHNwZWNpYWwgY2FzZTogTmFOXG5cdFx0XHR0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgJiZcblx0XHRcdC8vIHNwZWNpYWwgY2FzZTogaGFuZGxlIG5ldyBwcm9wcyB3aXRoIHZhbHVlICd1bmRlZmluZWQnXG5cdFx0XHQodmFsdWUgIT09IHVuZGVmaW5lZCB8fCBwcm9wIGluIHN0YXRlLmNvcHlfKVxuXHRcdClcblx0XHRcdHJldHVybiB0cnVlXG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0c3RhdGUuY29weV8hW3Byb3BdID0gdmFsdWVcblx0XHRzdGF0ZS5hc3NpZ25lZF9bcHJvcF0gPSB0cnVlXG5cdFx0cmV0dXJuIHRydWVcblx0fSxcblx0ZGVsZXRlUHJvcGVydHkoc3RhdGUsIHByb3A6IHN0cmluZykge1xuXHRcdC8vIFRoZSBgdW5kZWZpbmVkYCBjaGVjayBpcyBhIGZhc3QgcGF0aCBmb3IgcHJlLWV4aXN0aW5nIGtleXMuXG5cdFx0aWYgKHBlZWsoc3RhdGUuYmFzZV8sIHByb3ApICE9PSB1bmRlZmluZWQgfHwgcHJvcCBpbiBzdGF0ZS5iYXNlXykge1xuXHRcdFx0c3RhdGUuYXNzaWduZWRfW3Byb3BdID0gZmFsc2Vcblx0XHRcdHByZXBhcmVDb3B5KHN0YXRlKVxuXHRcdFx0bWFya0NoYW5nZWQoc3RhdGUpXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGlmIGFuIG9yaWdpbmFsbHkgbm90IGFzc2lnbmVkIHByb3BlcnR5IHdhcyBkZWxldGVkXG5cdFx0XHRkZWxldGUgc3RhdGUuYXNzaWduZWRfW3Byb3BdXG5cdFx0fVxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAoc3RhdGUuY29weV8pIGRlbGV0ZSBzdGF0ZS5jb3B5X1twcm9wXVxuXHRcdHJldHVybiB0cnVlXG5cdH0sXG5cdC8vIE5vdGU6IFdlIG5ldmVyIGNvZXJjZSBgZGVzYy52YWx1ZWAgaW50byBhbiBJbW1lciBkcmFmdCwgYmVjYXVzZSB3ZSBjYW4ndCBtYWtlXG5cdC8vIHRoZSBzYW1lIGd1YXJhbnRlZSBpbiBFUzUgbW9kZS5cblx0Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHN0YXRlLCBwcm9wKSB7XG5cdFx0Y29uc3Qgb3duZXIgPSBsYXRlc3Qoc3RhdGUpXG5cdFx0Y29uc3QgZGVzYyA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG93bmVyLCBwcm9wKVxuXHRcdGlmICghZGVzYykgcmV0dXJuIGRlc2Ncblx0XHRyZXR1cm4ge1xuXHRcdFx0d3JpdGFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHN0YXRlLnR5cGVfICE9PSBQcm94eVR5cGUuUHJveHlBcnJheSB8fCBwcm9wICE9PSBcImxlbmd0aFwiLFxuXHRcdFx0ZW51bWVyYWJsZTogZGVzYy5lbnVtZXJhYmxlLFxuXHRcdFx0dmFsdWU6IG93bmVyW3Byb3BdXG5cdFx0fVxuXHR9LFxuXHRkZWZpbmVQcm9wZXJ0eSgpIHtcblx0XHRkaWUoMTEpXG5cdH0sXG5cdGdldFByb3RvdHlwZU9mKHN0YXRlKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihzdGF0ZS5iYXNlXylcblx0fSxcblx0c2V0UHJvdG90eXBlT2YoKSB7XG5cdFx0ZGllKDEyKVxuXHR9XG59XG5cbi8qKlxuICogQXJyYXkgZHJhZnRzXG4gKi9cblxuY29uc3QgYXJyYXlUcmFwczogUHJveHlIYW5kbGVyPFtQcm94eUFycmF5U3RhdGVdPiA9IHt9XG5lYWNoKG9iamVjdFRyYXBzLCAoa2V5LCBmbikgPT4ge1xuXHQvLyBAdHMtaWdub3JlXG5cdGFycmF5VHJhcHNba2V5XSA9IGZ1bmN0aW9uKCkge1xuXHRcdGFyZ3VtZW50c1swXSA9IGFyZ3VtZW50c1swXVswXVxuXHRcdHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH1cbn0pXG5hcnJheVRyYXBzLmRlbGV0ZVByb3BlcnR5ID0gZnVuY3Rpb24oc3RhdGUsIHByb3ApIHtcblx0aWYgKF9fREVWX18gJiYgaXNOYU4ocGFyc2VJbnQocHJvcCBhcyBhbnkpKSkgZGllKDEzKVxuXHQvLyBAdHMtaWdub3JlXG5cdHJldHVybiBhcnJheVRyYXBzLnNldCEuY2FsbCh0aGlzLCBzdGF0ZSwgcHJvcCwgdW5kZWZpbmVkKVxufVxuYXJyYXlUcmFwcy5zZXQgPSBmdW5jdGlvbihzdGF0ZSwgcHJvcCwgdmFsdWUpIHtcblx0aWYgKF9fREVWX18gJiYgcHJvcCAhPT0gXCJsZW5ndGhcIiAmJiBpc05hTihwYXJzZUludChwcm9wIGFzIGFueSkpKSBkaWUoMTQpXG5cdHJldHVybiBvYmplY3RUcmFwcy5zZXQhLmNhbGwodGhpcywgc3RhdGVbMF0sIHByb3AsIHZhbHVlLCBzdGF0ZVswXSlcbn1cblxuLy8gQWNjZXNzIGEgcHJvcGVydHkgd2l0aG91dCBjcmVhdGluZyBhbiBJbW1lciBkcmFmdC5cbmZ1bmN0aW9uIHBlZWsoZHJhZnQ6IERyYWZ0ZWQsIHByb3A6IFByb3BlcnR5S2V5KSB7XG5cdGNvbnN0IHN0YXRlID0gZHJhZnRbRFJBRlRfU1RBVEVdXG5cdGNvbnN0IHNvdXJjZSA9IHN0YXRlID8gbGF0ZXN0KHN0YXRlKSA6IGRyYWZ0XG5cdHJldHVybiBzb3VyY2VbcHJvcF1cbn1cblxuZnVuY3Rpb24gcmVhZFByb3BGcm9tUHJvdG8oc3RhdGU6IEltbWVyU3RhdGUsIHNvdXJjZTogYW55LCBwcm9wOiBQcm9wZXJ0eUtleSkge1xuXHRjb25zdCBkZXNjID0gZ2V0RGVzY3JpcHRvckZyb21Qcm90byhzb3VyY2UsIHByb3ApXG5cdHJldHVybiBkZXNjXG5cdFx0PyBgdmFsdWVgIGluIGRlc2Ncblx0XHRcdD8gZGVzYy52YWx1ZVxuXHRcdFx0OiAvLyBUaGlzIGlzIGEgdmVyeSBzcGVjaWFsIGNhc2UsIGlmIHRoZSBwcm9wIGlzIGEgZ2V0dGVyIGRlZmluZWQgYnkgdGhlXG5cdFx0XHQgIC8vIHByb3RvdHlwZSwgd2Ugc2hvdWxkIGludm9rZSBpdCB3aXRoIHRoZSBkcmFmdCBhcyBjb250ZXh0IVxuXHRcdFx0ICBkZXNjLmdldD8uY2FsbChzdGF0ZS5kcmFmdF8pXG5cdFx0OiB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gZ2V0RGVzY3JpcHRvckZyb21Qcm90byhcblx0c291cmNlOiBhbnksXG5cdHByb3A6IFByb3BlcnR5S2V5XG4pOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xuXHQvLyAnaW4nIGNoZWNrcyBwcm90byFcblx0aWYgKCEocHJvcCBpbiBzb3VyY2UpKSByZXR1cm4gdW5kZWZpbmVkXG5cdGxldCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpXG5cdHdoaWxlIChwcm90bykge1xuXHRcdGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBwcm9wKVxuXHRcdGlmIChkZXNjKSByZXR1cm4gZGVzY1xuXHRcdHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKVxuXHR9XG5cdHJldHVybiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcmtDaGFuZ2VkKHN0YXRlOiBJbW1lclN0YXRlKSB7XG5cdGlmICghc3RhdGUubW9kaWZpZWRfKSB7XG5cdFx0c3RhdGUubW9kaWZpZWRfID0gdHJ1ZVxuXHRcdGlmIChzdGF0ZS5wYXJlbnRfKSB7XG5cdFx0XHRtYXJrQ2hhbmdlZChzdGF0ZS5wYXJlbnRfKVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUNvcHkoc3RhdGU6IHtiYXNlXzogYW55OyBjb3B5XzogYW55fSkge1xuXHRpZiAoIXN0YXRlLmNvcHlfKSB7XG5cdFx0c3RhdGUuY29weV8gPSBzaGFsbG93Q29weShzdGF0ZS5iYXNlXylcblx0fVxufVxuIiwgImltcG9ydCB7XG5cdElQcm9kdWNlV2l0aFBhdGNoZXMsXG5cdElQcm9kdWNlLFxuXHRJbW1lclN0YXRlLFxuXHREcmFmdGVkLFxuXHRpc0RyYWZ0YWJsZSxcblx0cHJvY2Vzc1Jlc3VsdCxcblx0UGF0Y2gsXG5cdE9iamVjdGlzaCxcblx0RFJBRlRfU1RBVEUsXG5cdERyYWZ0LFxuXHRQYXRjaExpc3RlbmVyLFxuXHRpc0RyYWZ0LFxuXHRpc01hcCxcblx0aXNTZXQsXG5cdGNyZWF0ZVByb3h5UHJveHksXG5cdGdldFBsdWdpbixcblx0ZGllLFxuXHRoYXNQcm94aWVzLFxuXHRlbnRlclNjb3BlLFxuXHRyZXZva2VTY29wZSxcblx0bGVhdmVTY29wZSxcblx0dXNlUGF0Y2hlc0luU2NvcGUsXG5cdGdldEN1cnJlbnRTY29wZSxcblx0Tk9USElORyxcblx0ZnJlZXplLFxuXHRjdXJyZW50XG59IGZyb20gXCIuLi9pbnRlcm5hbFwiXG5cbmludGVyZmFjZSBQcm9kdWNlcnNGbnMge1xuXHRwcm9kdWNlOiBJUHJvZHVjZVxuXHRwcm9kdWNlV2l0aFBhdGNoZXM6IElQcm9kdWNlV2l0aFBhdGNoZXNcbn1cblxuZXhwb3J0IGNsYXNzIEltbWVyIGltcGxlbWVudHMgUHJvZHVjZXJzRm5zIHtcblx0dXNlUHJveGllc186IGJvb2xlYW4gPSBoYXNQcm94aWVzXG5cblx0YXV0b0ZyZWV6ZV86IGJvb2xlYW4gPSB0cnVlXG5cblx0Y29uc3RydWN0b3IoY29uZmlnPzoge3VzZVByb3hpZXM/OiBib29sZWFuOyBhdXRvRnJlZXplPzogYm9vbGVhbn0pIHtcblx0XHRpZiAodHlwZW9mIGNvbmZpZz8udXNlUHJveGllcyA9PT0gXCJib29sZWFuXCIpXG5cdFx0XHR0aGlzLnNldFVzZVByb3hpZXMoY29uZmlnIS51c2VQcm94aWVzKVxuXHRcdGlmICh0eXBlb2YgY29uZmlnPy5hdXRvRnJlZXplID09PSBcImJvb2xlYW5cIilcblx0XHRcdHRoaXMuc2V0QXV0b0ZyZWV6ZShjb25maWchLmF1dG9GcmVlemUpXG5cdH1cblxuXHQvKipcblx0ICogVGhlIGBwcm9kdWNlYCBmdW5jdGlvbiB0YWtlcyBhIHZhbHVlIGFuZCBhIFwicmVjaXBlIGZ1bmN0aW9uXCIgKHdob3NlXG5cdCAqIHJldHVybiB2YWx1ZSBvZnRlbiBkZXBlbmRzIG9uIHRoZSBiYXNlIHN0YXRlKS4gVGhlIHJlY2lwZSBmdW5jdGlvbiBpc1xuXHQgKiBmcmVlIHRvIG11dGF0ZSBpdHMgZmlyc3QgYXJndW1lbnQgaG93ZXZlciBpdCB3YW50cy4gQWxsIG11dGF0aW9ucyBhcmVcblx0ICogb25seSBldmVyIGFwcGxpZWQgdG8gYSBfX2NvcHlfXyBvZiB0aGUgYmFzZSBzdGF0ZS5cblx0ICpcblx0ICogUGFzcyBvbmx5IGEgZnVuY3Rpb24gdG8gY3JlYXRlIGEgXCJjdXJyaWVkIHByb2R1Y2VyXCIgd2hpY2ggcmVsaWV2ZXMgeW91XG5cdCAqIGZyb20gcGFzc2luZyB0aGUgcmVjaXBlIGZ1bmN0aW9uIGV2ZXJ5IHRpbWUuXG5cdCAqXG5cdCAqIE9ubHkgcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzIGFyZSBtYWRlIG11dGFibGUuIEFsbCBvdGhlciBvYmplY3RzIGFyZVxuXHQgKiBjb25zaWRlcmVkIHVuY29weWFibGUuXG5cdCAqXG5cdCAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgX19ib3VuZF9fIHRvIGl0cyBgSW1tZXJgIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge2FueX0gYmFzZSAtIHRoZSBpbml0aWFsIHN0YXRlXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IHByb2R1Y2VyIC0gZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBhIHByb3h5IG9mIHRoZSBiYXNlIHN0YXRlIGFzIGZpcnN0IGFyZ3VtZW50IGFuZCB3aGljaCBjYW4gYmUgZnJlZWx5IG1vZGlmaWVkXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IHBhdGNoTGlzdGVuZXIgLSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggYWxsIHRoZSBwYXRjaGVzIHByb2R1Y2VkIGhlcmVcblx0ICogQHJldHVybnMge2FueX0gYSBuZXcgc3RhdGUsIG9yIHRoZSBpbml0aWFsIHN0YXRlIGlmIG5vdGhpbmcgd2FzIG1vZGlmaWVkXG5cdCAqL1xuXHRwcm9kdWNlOiBJUHJvZHVjZSA9IChiYXNlOiBhbnksIHJlY2lwZT86IGFueSwgcGF0Y2hMaXN0ZW5lcj86IGFueSkgPT4ge1xuXHRcdC8vIGN1cnJpZWQgaW52b2NhdGlvblxuXHRcdGlmICh0eXBlb2YgYmFzZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiByZWNpcGUgIT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0Y29uc3QgZGVmYXVsdEJhc2UgPSByZWNpcGVcblx0XHRcdHJlY2lwZSA9IGJhc2VcblxuXHRcdFx0Y29uc3Qgc2VsZiA9IHRoaXNcblx0XHRcdHJldHVybiBmdW5jdGlvbiBjdXJyaWVkUHJvZHVjZShcblx0XHRcdFx0dGhpczogYW55LFxuXHRcdFx0XHRiYXNlID0gZGVmYXVsdEJhc2UsXG5cdFx0XHRcdC4uLmFyZ3M6IGFueVtdXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHNlbGYucHJvZHVjZShiYXNlLCAoZHJhZnQ6IERyYWZ0ZWQpID0+IHJlY2lwZS5jYWxsKHRoaXMsIGRyYWZ0LCAuLi5hcmdzKSkgLy8gcHJldHRpZXItaWdub3JlXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiByZWNpcGUgIT09IFwiZnVuY3Rpb25cIikgZGllKDYpXG5cdFx0aWYgKHBhdGNoTGlzdGVuZXIgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcGF0Y2hMaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiKVxuXHRcdFx0ZGllKDcpXG5cblx0XHRsZXQgcmVzdWx0XG5cblx0XHQvLyBPbmx5IHBsYWluIG9iamVjdHMsIGFycmF5cywgYW5kIFwiaW1tZXJhYmxlIGNsYXNzZXNcIiBhcmUgZHJhZnRlZC5cblx0XHRpZiAoaXNEcmFmdGFibGUoYmFzZSkpIHtcblx0XHRcdGNvbnN0IHNjb3BlID0gZW50ZXJTY29wZSh0aGlzKVxuXHRcdFx0Y29uc3QgcHJveHkgPSBjcmVhdGVQcm94eSh0aGlzLCBiYXNlLCB1bmRlZmluZWQpXG5cdFx0XHRsZXQgaGFzRXJyb3IgPSB0cnVlXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXN1bHQgPSByZWNpcGUocHJveHkpXG5cdFx0XHRcdGhhc0Vycm9yID0gZmFsc2Vcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdC8vIGZpbmFsbHkgaW5zdGVhZCBvZiBjYXRjaCArIHJldGhyb3cgYmV0dGVyIHByZXNlcnZlcyBvcmlnaW5hbCBzdGFja1xuXHRcdFx0XHRpZiAoaGFzRXJyb3IpIHJldm9rZVNjb3BlKHNjb3BlKVxuXHRcdFx0XHRlbHNlIGxlYXZlU2NvcGUoc2NvcGUpXG5cdFx0XHR9XG5cdFx0XHRpZiAodHlwZW9mIFByb21pc2UgIT09IFwidW5kZWZpbmVkXCIgJiYgcmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0LnRoZW4oXG5cdFx0XHRcdFx0cmVzdWx0ID0+IHtcblx0XHRcdFx0XHRcdHVzZVBhdGNoZXNJblNjb3BlKHNjb3BlLCBwYXRjaExpc3RlbmVyKVxuXHRcdFx0XHRcdFx0cmV0dXJuIHByb2Nlc3NSZXN1bHQocmVzdWx0LCBzY29wZSlcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGVycm9yID0+IHtcblx0XHRcdFx0XHRcdHJldm9rZVNjb3BlKHNjb3BlKVxuXHRcdFx0XHRcdFx0dGhyb3cgZXJyb3Jcblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdH1cblx0XHRcdHVzZVBhdGNoZXNJblNjb3BlKHNjb3BlLCBwYXRjaExpc3RlbmVyKVxuXHRcdFx0cmV0dXJuIHByb2Nlc3NSZXN1bHQocmVzdWx0LCBzY29wZSlcblx0XHR9IGVsc2UgaWYgKCFiYXNlIHx8IHR5cGVvZiBiYXNlICE9PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRyZXN1bHQgPSByZWNpcGUoYmFzZSlcblx0XHRcdGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkgcmVzdWx0ID0gYmFzZVxuXHRcdFx0aWYgKHJlc3VsdCA9PT0gTk9USElORykgcmVzdWx0ID0gdW5kZWZpbmVkXG5cdFx0XHRpZiAodGhpcy5hdXRvRnJlZXplXykgZnJlZXplKHJlc3VsdCwgdHJ1ZSlcblx0XHRcdGlmIChwYXRjaExpc3RlbmVyKSB7XG5cdFx0XHRcdGNvbnN0IHA6IFBhdGNoW10gPSBbXVxuXHRcdFx0XHRjb25zdCBpcDogUGF0Y2hbXSA9IFtdXG5cdFx0XHRcdGdldFBsdWdpbihcIlBhdGNoZXNcIikuZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfKGJhc2UsIHJlc3VsdCwgcCwgaXApXG5cdFx0XHRcdHBhdGNoTGlzdGVuZXIocCwgaXApXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0XG5cdFx0fSBlbHNlIGRpZSgyMSwgYmFzZSlcblx0fVxuXG5cdHByb2R1Y2VXaXRoUGF0Y2hlczogSVByb2R1Y2VXaXRoUGF0Y2hlcyA9IChcblx0XHRhcmcxOiBhbnksXG5cdFx0YXJnMj86IGFueSxcblx0XHRhcmczPzogYW55XG5cdCk6IGFueSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBhcmcxID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdHJldHVybiAoc3RhdGU6IGFueSwgLi4uYXJnczogYW55W10pID0+XG5cdFx0XHRcdHRoaXMucHJvZHVjZVdpdGhQYXRjaGVzKHN0YXRlLCAoZHJhZnQ6IGFueSkgPT4gYXJnMShkcmFmdCwgLi4uYXJncykpXG5cdFx0fVxuXG5cdFx0bGV0IHBhdGNoZXM6IFBhdGNoW10sIGludmVyc2VQYXRjaGVzOiBQYXRjaFtdXG5cdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5wcm9kdWNlKGFyZzEsIGFyZzIsIChwOiBQYXRjaFtdLCBpcDogUGF0Y2hbXSkgPT4ge1xuXHRcdFx0cGF0Y2hlcyA9IHBcblx0XHRcdGludmVyc2VQYXRjaGVzID0gaXBcblx0XHR9KVxuXG5cdFx0aWYgKHR5cGVvZiBQcm9taXNlICE9PSBcInVuZGVmaW5lZFwiICYmIHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcblx0XHRcdHJldHVybiByZXN1bHQudGhlbihuZXh0U3RhdGUgPT4gW25leHRTdGF0ZSwgcGF0Y2hlcyEsIGludmVyc2VQYXRjaGVzIV0pXG5cdFx0fVxuXHRcdHJldHVybiBbcmVzdWx0LCBwYXRjaGVzISwgaW52ZXJzZVBhdGNoZXMhXVxuXHR9XG5cblx0Y3JlYXRlRHJhZnQ8VCBleHRlbmRzIE9iamVjdGlzaD4oYmFzZTogVCk6IERyYWZ0PFQ+IHtcblx0XHRpZiAoIWlzRHJhZnRhYmxlKGJhc2UpKSBkaWUoOClcblx0XHRpZiAoaXNEcmFmdChiYXNlKSkgYmFzZSA9IGN1cnJlbnQoYmFzZSlcblx0XHRjb25zdCBzY29wZSA9IGVudGVyU2NvcGUodGhpcylcblx0XHRjb25zdCBwcm94eSA9IGNyZWF0ZVByb3h5KHRoaXMsIGJhc2UsIHVuZGVmaW5lZClcblx0XHRwcm94eVtEUkFGVF9TVEFURV0uaXNNYW51YWxfID0gdHJ1ZVxuXHRcdGxlYXZlU2NvcGUoc2NvcGUpXG5cdFx0cmV0dXJuIHByb3h5IGFzIGFueVxuXHR9XG5cblx0ZmluaXNoRHJhZnQ8RCBleHRlbmRzIERyYWZ0PGFueT4+KFxuXHRcdGRyYWZ0OiBELFxuXHRcdHBhdGNoTGlzdGVuZXI/OiBQYXRjaExpc3RlbmVyXG5cdCk6IEQgZXh0ZW5kcyBEcmFmdDxpbmZlciBUPiA/IFQgOiBuZXZlciB7XG5cdFx0Y29uc3Qgc3RhdGU6IEltbWVyU3RhdGUgPSBkcmFmdCAmJiAoZHJhZnQgYXMgYW55KVtEUkFGVF9TVEFURV1cblx0XHRpZiAoX19ERVZfXykge1xuXHRcdFx0aWYgKCFzdGF0ZSB8fCAhc3RhdGUuaXNNYW51YWxfKSBkaWUoOSlcblx0XHRcdGlmIChzdGF0ZS5maW5hbGl6ZWRfKSBkaWUoMTApXG5cdFx0fVxuXHRcdGNvbnN0IHtzY29wZV86IHNjb3BlfSA9IHN0YXRlXG5cdFx0dXNlUGF0Y2hlc0luU2NvcGUoc2NvcGUsIHBhdGNoTGlzdGVuZXIpXG5cdFx0cmV0dXJuIHByb2Nlc3NSZXN1bHQodW5kZWZpbmVkLCBzY29wZSlcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXNzIHRydWUgdG8gYXV0b21hdGljYWxseSBmcmVlemUgYWxsIGNvcGllcyBjcmVhdGVkIGJ5IEltbWVyLlxuXHQgKlxuXHQgKiBCeSBkZWZhdWx0LCBhdXRvLWZyZWV6aW5nIGlzIGVuYWJsZWQuXG5cdCAqL1xuXHRzZXRBdXRvRnJlZXplKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5hdXRvRnJlZXplXyA9IHZhbHVlXG5cdH1cblxuXHQvKipcblx0ICogUGFzcyB0cnVlIHRvIHVzZSB0aGUgRVMyMDE1IGBQcm94eWAgY2xhc3Mgd2hlbiBjcmVhdGluZyBkcmFmdHMsIHdoaWNoIGlzXG5cdCAqIGFsd2F5cyBmYXN0ZXIgdGhhbiB1c2luZyBFUzUgcHJveGllcy5cblx0ICpcblx0ICogQnkgZGVmYXVsdCwgZmVhdHVyZSBkZXRlY3Rpb24gaXMgdXNlZCwgc28gY2FsbGluZyB0aGlzIGlzIHJhcmVseSBuZWNlc3NhcnkuXG5cdCAqL1xuXHRzZXRVc2VQcm94aWVzKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0aWYgKHZhbHVlICYmICFoYXNQcm94aWVzKSB7XG5cdFx0XHRkaWUoMjApXG5cdFx0fVxuXHRcdHRoaXMudXNlUHJveGllc18gPSB2YWx1ZVxuXHR9XG5cblx0YXBwbHlQYXRjaGVzPFQgZXh0ZW5kcyBPYmplY3Rpc2g+KGJhc2U6IFQsIHBhdGNoZXM6IFBhdGNoW10pOiBUIHtcblx0XHQvLyBJZiBhIHBhdGNoIHJlcGxhY2VzIHRoZSBlbnRpcmUgc3RhdGUsIHRha2UgdGhhdCByZXBsYWNlbWVudCBhcyBiYXNlXG5cdFx0Ly8gYmVmb3JlIGFwcGx5aW5nIHBhdGNoZXNcblx0XHRsZXQgaTogbnVtYmVyXG5cdFx0Zm9yIChpID0gcGF0Y2hlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0Y29uc3QgcGF0Y2ggPSBwYXRjaGVzW2ldXG5cdFx0XHRpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDAgJiYgcGF0Y2gub3AgPT09IFwicmVwbGFjZVwiKSB7XG5cdFx0XHRcdGJhc2UgPSBwYXRjaC52YWx1ZVxuXHRcdFx0XHRicmVha1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBJZiB0aGVyZSB3YXMgYSBwYXRjaCB0aGF0IHJlcGxhY2VkIHRoZSBlbnRpcmUgc3RhdGUsIHN0YXJ0IGZyb20gdGhlXG5cdFx0Ly8gcGF0Y2ggYWZ0ZXIgdGhhdC5cblx0XHRpZiAoaSA+IC0xKSB7XG5cdFx0XHRwYXRjaGVzID0gcGF0Y2hlcy5zbGljZShpICsgMSlcblx0XHR9XG5cblx0XHRjb25zdCBhcHBseVBhdGNoZXNJbXBsID0gZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKS5hcHBseVBhdGNoZXNfXG5cdFx0aWYgKGlzRHJhZnQoYmFzZSkpIHtcblx0XHRcdC8vIE4uQjogbmV2ZXIgaGl0cyBpZiBzb21lIHBhdGNoIGEgcmVwbGFjZW1lbnQsIHBhdGNoZXMgYXJlIG5ldmVyIGRyYWZ0c1xuXHRcdFx0cmV0dXJuIGFwcGx5UGF0Y2hlc0ltcGwoYmFzZSwgcGF0Y2hlcylcblx0XHR9XG5cdFx0Ly8gT3RoZXJ3aXNlLCBwcm9kdWNlIGEgY29weSBvZiB0aGUgYmFzZSBzdGF0ZS5cblx0XHRyZXR1cm4gdGhpcy5wcm9kdWNlKGJhc2UsIChkcmFmdDogRHJhZnRlZCkgPT5cblx0XHRcdGFwcGx5UGF0Y2hlc0ltcGwoZHJhZnQsIHBhdGNoZXMpXG5cdFx0KVxuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm94eTxUIGV4dGVuZHMgT2JqZWN0aXNoPihcblx0aW1tZXI6IEltbWVyLFxuXHR2YWx1ZTogVCxcblx0cGFyZW50PzogSW1tZXJTdGF0ZVxuKTogRHJhZnRlZDxULCBJbW1lclN0YXRlPiB7XG5cdC8vIHByZWNvbmRpdGlvbjogY3JlYXRlUHJveHkgc2hvdWxkIGJlIGd1YXJkZWQgYnkgaXNEcmFmdGFibGUsIHNvIHdlIGtub3cgd2UgY2FuIHNhZmVseSBkcmFmdFxuXHRjb25zdCBkcmFmdDogRHJhZnRlZCA9IGlzTWFwKHZhbHVlKVxuXHRcdD8gZ2V0UGx1Z2luKFwiTWFwU2V0XCIpLnByb3h5TWFwXyh2YWx1ZSwgcGFyZW50KVxuXHRcdDogaXNTZXQodmFsdWUpXG5cdFx0PyBnZXRQbHVnaW4oXCJNYXBTZXRcIikucHJveHlTZXRfKHZhbHVlLCBwYXJlbnQpXG5cdFx0OiBpbW1lci51c2VQcm94aWVzX1xuXHRcdD8gY3JlYXRlUHJveHlQcm94eSh2YWx1ZSwgcGFyZW50KVxuXHRcdDogZ2V0UGx1Z2luKFwiRVM1XCIpLmNyZWF0ZUVTNVByb3h5Xyh2YWx1ZSwgcGFyZW50KVxuXG5cdGNvbnN0IHNjb3BlID0gcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpXG5cdHNjb3BlLmRyYWZ0c18ucHVzaChkcmFmdClcblx0cmV0dXJuIGRyYWZ0XG59XG4iLCAiaW1wb3J0IHtcblx0ZGllLFxuXHRpc0RyYWZ0LFxuXHRzaGFsbG93Q29weSxcblx0ZWFjaCxcblx0RFJBRlRfU1RBVEUsXG5cdGdldCxcblx0c2V0LFxuXHRJbW1lclN0YXRlLFxuXHRpc0RyYWZ0YWJsZSxcblx0QXJjaHR5cGUsXG5cdGdldEFyY2h0eXBlLFxuXHRnZXRQbHVnaW5cbn0gZnJvbSBcIi4uL2ludGVybmFsXCJcblxuLyoqIFRha2VzIGEgc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBkcmFmdCBhbmQgZmluYWxpemVzIGl0IChidXQgd2l0aG91dCBmcmVlemluZykuIFRoaXMgaXMgYSBncmVhdCB1dGlsaXR5IHRvIHByaW50IHRoZSBjdXJyZW50IHN0YXRlIGR1cmluZyBkZWJ1Z2dpbmcgKG5vIFByb3hpZXMgaW4gdGhlIHdheSkuIFRoZSBvdXRwdXQgb2YgY3VycmVudCBjYW4gYWxzbyBiZSBzYWZlbHkgbGVha2VkIG91dHNpZGUgdGhlIHByb2R1Y2VyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnQ8VD4odmFsdWU6IFQpOiBUXG5leHBvcnQgZnVuY3Rpb24gY3VycmVudCh2YWx1ZTogYW55KTogYW55IHtcblx0aWYgKCFpc0RyYWZ0KHZhbHVlKSkgZGllKDIyLCB2YWx1ZSlcblx0cmV0dXJuIGN1cnJlbnRJbXBsKHZhbHVlKVxufVxuXG5mdW5jdGlvbiBjdXJyZW50SW1wbCh2YWx1ZTogYW55KTogYW55IHtcblx0aWYgKCFpc0RyYWZ0YWJsZSh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXHRjb25zdCBzdGF0ZTogSW1tZXJTdGF0ZSB8IHVuZGVmaW5lZCA9IHZhbHVlW0RSQUZUX1NUQVRFXVxuXHRsZXQgY29weTogYW55XG5cdGNvbnN0IGFyY2hUeXBlID0gZ2V0QXJjaHR5cGUodmFsdWUpXG5cdGlmIChzdGF0ZSkge1xuXHRcdGlmIChcblx0XHRcdCFzdGF0ZS5tb2RpZmllZF8gJiZcblx0XHRcdChzdGF0ZS50eXBlXyA8IDQgfHwgIWdldFBsdWdpbihcIkVTNVwiKS5oYXNDaGFuZ2VzXyhzdGF0ZSBhcyBhbnkpKVxuXHRcdClcblx0XHRcdHJldHVybiBzdGF0ZS5iYXNlX1xuXHRcdC8vIE9wdGltaXphdGlvbjogYXZvaWQgZ2VuZXJhdGluZyBuZXcgZHJhZnRzIGR1cmluZyBjb3B5aW5nXG5cdFx0c3RhdGUuZmluYWxpemVkXyA9IHRydWVcblx0XHRjb3B5ID0gY29weUhlbHBlcih2YWx1ZSwgYXJjaFR5cGUpXG5cdFx0c3RhdGUuZmluYWxpemVkXyA9IGZhbHNlXG5cdH0gZWxzZSB7XG5cdFx0Y29weSA9IGNvcHlIZWxwZXIodmFsdWUsIGFyY2hUeXBlKVxuXHR9XG5cblx0ZWFjaChjb3B5LCAoa2V5LCBjaGlsZFZhbHVlKSA9PiB7XG5cdFx0aWYgKHN0YXRlICYmIGdldChzdGF0ZS5iYXNlXywga2V5KSA9PT0gY2hpbGRWYWx1ZSkgcmV0dXJuIC8vIG5vIG5lZWQgdG8gY29weSBvciBzZWFyY2ggaW4gc29tZXRoaW5nIHRoYXQgZGlkbid0IGNoYW5nZVxuXHRcdHNldChjb3B5LCBrZXksIGN1cnJlbnRJbXBsKGNoaWxkVmFsdWUpKVxuXHR9KVxuXHQvLyBJbiB0aGUgZnV0dXJlLCB3ZSBtaWdodCBjb25zaWRlciBmcmVlemluZyBoZXJlLCBiYXNlZCBvbiB0aGUgY3VycmVudCBzZXR0aW5nc1xuXHRyZXR1cm4gYXJjaFR5cGUgPT09IEFyY2h0eXBlLlNldCA/IG5ldyBTZXQoY29weSkgOiBjb3B5XG59XG5cbmZ1bmN0aW9uIGNvcHlIZWxwZXIodmFsdWU6IGFueSwgYXJjaFR5cGU6IG51bWJlcik6IGFueSB7XG5cdC8vIGNyZWF0ZXMgYSBzaGFsbG93IGNvcHksIGV2ZW4gaWYgaXQgaXMgYSBtYXAgb3Igc2V0XG5cdHN3aXRjaCAoYXJjaFR5cGUpIHtcblx0XHRjYXNlIEFyY2h0eXBlLk1hcDpcblx0XHRcdHJldHVybiBuZXcgTWFwKHZhbHVlKVxuXHRcdGNhc2UgQXJjaHR5cGUuU2V0OlxuXHRcdFx0Ly8gU2V0IHdpbGwgYmUgY2xvbmVkIGFzIGFycmF5IHRlbXBvcmFyaWx5LCBzbyB0aGF0IHdlIGNhbiByZXBsYWNlIGluZGl2aWR1YWwgaXRlbXNcblx0XHRcdHJldHVybiBBcnJheS5mcm9tKHZhbHVlKVxuXHR9XG5cdHJldHVybiBzaGFsbG93Q29weSh2YWx1ZSlcbn1cbiIsICJpbXBvcnQge1xuXHRJbW1lclN0YXRlLFxuXHREcmFmdGVkLFxuXHRFUzVBcnJheVN0YXRlLFxuXHRFUzVPYmplY3RTdGF0ZSxcblx0ZWFjaCxcblx0aGFzLFxuXHRpc0RyYWZ0LFxuXHRsYXRlc3QsXG5cdERSQUZUX1NUQVRFLFxuXHRpcyxcblx0bG9hZFBsdWdpbixcblx0SW1tZXJTY29wZSxcblx0UHJveHlUeXBlLFxuXHRnZXRDdXJyZW50U2NvcGUsXG5cdGRpZSxcblx0bWFya0NoYW5nZWQsXG5cdG9iamVjdFRyYXBzLFxuXHRvd25LZXlzLFxuXHRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzXG59IGZyb20gXCIuLi9pbnRlcm5hbFwiXG5cbnR5cGUgRVM1U3RhdGUgPSBFUzVBcnJheVN0YXRlIHwgRVM1T2JqZWN0U3RhdGVcblxuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZUVTNSgpIHtcblx0ZnVuY3Rpb24gd2lsbEZpbmFsaXplRVM1Xyhcblx0XHRzY29wZTogSW1tZXJTY29wZSxcblx0XHRyZXN1bHQ6IGFueSxcblx0XHRpc1JlcGxhY2VkOiBib29sZWFuXG5cdCkge1xuXHRcdGlmICghaXNSZXBsYWNlZCkge1xuXHRcdFx0aWYgKHNjb3BlLnBhdGNoZXNfKSB7XG5cdFx0XHRcdG1hcmtDaGFuZ2VzUmVjdXJzaXZlbHkoc2NvcGUuZHJhZnRzXyFbMF0pXG5cdFx0XHR9XG5cdFx0XHQvLyBUaGlzIGlzIGZhc3RlciB3aGVuIHdlIGRvbid0IGNhcmUgYWJvdXQgd2hpY2ggYXR0cmlidXRlcyBjaGFuZ2VkLlxuXHRcdFx0bWFya0NoYW5nZXNTd2VlcChzY29wZS5kcmFmdHNfKVxuXHRcdH1cblx0XHQvLyBXaGVuIGEgY2hpbGQgZHJhZnQgaXMgcmV0dXJuZWQsIGxvb2sgZm9yIGNoYW5nZXMuXG5cdFx0ZWxzZSBpZiAoXG5cdFx0XHRpc0RyYWZ0KHJlc3VsdCkgJiZcblx0XHRcdChyZXN1bHRbRFJBRlRfU1RBVEVdIGFzIEVTNVN0YXRlKS5zY29wZV8gPT09IHNjb3BlXG5cdFx0KSB7XG5cdFx0XHRtYXJrQ2hhbmdlc1N3ZWVwKHNjb3BlLmRyYWZ0c18pXG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gY3JlYXRlRVM1RHJhZnQoaXNBcnJheTogYm9vbGVhbiwgYmFzZTogYW55KSB7XG5cdFx0aWYgKGlzQXJyYXkpIHtcblx0XHRcdGNvbnN0IGRyYWZ0ID0gbmV3IEFycmF5KGJhc2UubGVuZ3RoKVxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBiYXNlLmxlbmd0aDsgaSsrKVxuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZHJhZnQsIFwiXCIgKyBpLCBwcm94eVByb3BlcnR5KGksIHRydWUpKVxuXHRcdFx0cmV0dXJuIGRyYWZ0XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGRlc2NyaXB0b3JzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhiYXNlKVxuXHRcdFx0ZGVsZXRlIGRlc2NyaXB0b3JzW0RSQUZUX1NUQVRFIGFzIGFueV1cblx0XHRcdGNvbnN0IGtleXMgPSBvd25LZXlzKGRlc2NyaXB0b3JzKVxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IGtleTogYW55ID0ga2V5c1tpXVxuXHRcdFx0XHRkZXNjcmlwdG9yc1trZXldID0gcHJveHlQcm9wZXJ0eShcblx0XHRcdFx0XHRrZXksXG5cdFx0XHRcdFx0aXNBcnJheSB8fCAhIWRlc2NyaXB0b3JzW2tleV0uZW51bWVyYWJsZVxuXHRcdFx0XHQpXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YoYmFzZSksIGRlc2NyaXB0b3JzKVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGNyZWF0ZUVTNVByb3h5XzxUPihcblx0XHRiYXNlOiBULFxuXHRcdHBhcmVudD86IEltbWVyU3RhdGVcblx0KTogRHJhZnRlZDxULCBFUzVPYmplY3RTdGF0ZSB8IEVTNUFycmF5U3RhdGU+IHtcblx0XHRjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShiYXNlKVxuXHRcdGNvbnN0IGRyYWZ0ID0gY3JlYXRlRVM1RHJhZnQoaXNBcnJheSwgYmFzZSlcblxuXHRcdGNvbnN0IHN0YXRlOiBFUzVPYmplY3RTdGF0ZSB8IEVTNUFycmF5U3RhdGUgPSB7XG5cdFx0XHR0eXBlXzogaXNBcnJheSA/IFByb3h5VHlwZS5FUzVBcnJheSA6IChQcm94eVR5cGUuRVM1T2JqZWN0IGFzIGFueSksXG5cdFx0XHRzY29wZV86IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKSxcblx0XHRcdG1vZGlmaWVkXzogZmFsc2UsXG5cdFx0XHRmaW5hbGl6ZWRfOiBmYWxzZSxcblx0XHRcdGFzc2lnbmVkXzoge30sXG5cdFx0XHRwYXJlbnRfOiBwYXJlbnQsXG5cdFx0XHQvLyBiYXNlIGlzIHRoZSBvYmplY3Qgd2UgYXJlIGRyYWZ0aW5nXG5cdFx0XHRiYXNlXzogYmFzZSxcblx0XHRcdC8vIGRyYWZ0IGlzIHRoZSBkcmFmdCBvYmplY3QgaXRzZWxmLCB0aGF0IHRyYXBzIGFsbCByZWFkcyBhbmQgcmVhZHMgZnJvbSBlaXRoZXIgdGhlIGJhc2UgKGlmIHVubW9kaWZpZWQpIG9yIGNvcHkgKGlmIG1vZGlmaWVkKVxuXHRcdFx0ZHJhZnRfOiBkcmFmdCxcblx0XHRcdGNvcHlfOiBudWxsLFxuXHRcdFx0cmV2b2tlZF86IGZhbHNlLFxuXHRcdFx0aXNNYW51YWxfOiBmYWxzZVxuXHRcdH1cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkcmFmdCwgRFJBRlRfU1RBVEUsIHtcblx0XHRcdHZhbHVlOiBzdGF0ZSxcblx0XHRcdC8vIGVudW1lcmFibGU6IGZhbHNlIDwtIHRoZSBkZWZhdWx0XG5cdFx0XHR3cml0YWJsZTogdHJ1ZVxuXHRcdH0pXG5cdFx0cmV0dXJuIGRyYWZ0XG5cdH1cblxuXHQvLyBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBhcmUgcmVjeWNsZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGNyZWF0ZSBhIGdldCBhbmQgc2V0IGNsb3N1cmUgcGVyIHByb3BlcnR5LFxuXHQvLyBidXQgc2hhcmUgdGhlbSBhbGwgaW5zdGVhZFxuXHRjb25zdCBkZXNjcmlwdG9yczoge1twcm9wOiBzdHJpbmddOiBQcm9wZXJ0eURlc2NyaXB0b3J9ID0ge31cblxuXHRmdW5jdGlvbiBwcm94eVByb3BlcnR5KFxuXHRcdHByb3A6IHN0cmluZyB8IG51bWJlcixcblx0XHRlbnVtZXJhYmxlOiBib29sZWFuXG5cdCk6IFByb3BlcnR5RGVzY3JpcHRvciB7XG5cdFx0bGV0IGRlc2MgPSBkZXNjcmlwdG9yc1twcm9wXVxuXHRcdGlmIChkZXNjKSB7XG5cdFx0XHRkZXNjLmVudW1lcmFibGUgPSBlbnVtZXJhYmxlXG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlc2NyaXB0b3JzW3Byb3BdID0gZGVzYyA9IHtcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRlbnVtZXJhYmxlLFxuXHRcdFx0XHRnZXQodGhpczogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXVxuXHRcdFx0XHRcdGlmIChfX0RFVl9fKSBhc3NlcnRVbnJldm9rZWQoc3RhdGUpXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdHJldHVybiBvYmplY3RUcmFwcy5nZXQoc3RhdGUsIHByb3ApXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNldCh0aGlzOiBhbnksIHZhbHVlKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXVxuXHRcdFx0XHRcdGlmIChfX0RFVl9fKSBhc3NlcnRVbnJldm9rZWQoc3RhdGUpXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdG9iamVjdFRyYXBzLnNldChzdGF0ZSwgcHJvcCwgdmFsdWUpXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRlc2Ncblx0fVxuXG5cdC8vIFRoaXMgbG9va3MgZXhwZW5zaXZlLCBidXQgb25seSBwcm94aWVzIGFyZSB2aXNpdGVkLCBhbmQgb25seSBvYmplY3RzIHdpdGhvdXQga25vd24gY2hhbmdlcyBhcmUgc2Nhbm5lZC5cblx0ZnVuY3Rpb24gbWFya0NoYW5nZXNTd2VlcChkcmFmdHM6IERyYWZ0ZWQ8YW55LCBJbW1lclN0YXRlPltdKSB7XG5cdFx0Ly8gVGhlIG5hdHVyYWwgb3JkZXIgb2YgZHJhZnRzIGluIHRoZSBgc2NvcGVgIGFycmF5IGlzIGJhc2VkIG9uIHdoZW4gdGhleVxuXHRcdC8vIHdlcmUgYWNjZXNzZWQuIEJ5IHByb2Nlc3NpbmcgZHJhZnRzIGluIHJldmVyc2UgbmF0dXJhbCBvcmRlciwgd2UgaGF2ZSBhXG5cdFx0Ly8gYmV0dGVyIGNoYW5jZSBvZiBwcm9jZXNzaW5nIGxlYWYgbm9kZXMgZmlyc3QuIFdoZW4gYSBsZWFmIG5vZGUgaXMga25vd24gdG9cblx0XHQvLyBoYXZlIGNoYW5nZWQsIHdlIGNhbiBhdm9pZCBhbnkgdHJhdmVyc2FsIG9mIGl0cyBhbmNlc3RvciBub2Rlcy5cblx0XHRmb3IgKGxldCBpID0gZHJhZnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdFx0XHRjb25zdCBzdGF0ZTogRVM1U3RhdGUgPSBkcmFmdHNbaV1bRFJBRlRfU1RBVEVdXG5cdFx0XHRpZiAoIXN0YXRlLm1vZGlmaWVkXykge1xuXHRcdFx0XHRzd2l0Y2ggKHN0YXRlLnR5cGVfKSB7XG5cdFx0XHRcdFx0Y2FzZSBQcm94eVR5cGUuRVM1QXJyYXk6XG5cdFx0XHRcdFx0XHRpZiAoaGFzQXJyYXlDaGFuZ2VzKHN0YXRlKSkgbWFya0NoYW5nZWQoc3RhdGUpXG5cdFx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHRcdGNhc2UgUHJveHlUeXBlLkVTNU9iamVjdDpcblx0XHRcdFx0XHRcdGlmIChoYXNPYmplY3RDaGFuZ2VzKHN0YXRlKSkgbWFya0NoYW5nZWQoc3RhdGUpXG5cdFx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gbWFya0NoYW5nZXNSZWN1cnNpdmVseShvYmplY3Q6IGFueSkge1xuXHRcdGlmICghb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09IFwib2JqZWN0XCIpIHJldHVyblxuXHRcdGNvbnN0IHN0YXRlOiBFUzVTdGF0ZSB8IHVuZGVmaW5lZCA9IG9iamVjdFtEUkFGVF9TVEFURV1cblx0XHRpZiAoIXN0YXRlKSByZXR1cm5cblx0XHRjb25zdCB7YmFzZV8sIGRyYWZ0XywgYXNzaWduZWRfLCB0eXBlX30gPSBzdGF0ZVxuXHRcdGlmICh0eXBlXyA9PT0gUHJveHlUeXBlLkVTNU9iamVjdCkge1xuXHRcdFx0Ly8gTG9vayBmb3IgYWRkZWQga2V5cy5cblx0XHRcdC8vIHByb2JhYmx5IHRoZXJlIGlzIGEgZmFzdGVyIHdheSB0byBkZXRlY3QgY2hhbmdlcywgYXMgc3dlZXAgKyByZWN1cnNlIHNlZW1zIHRvIGRvIHNvbWVcblx0XHRcdC8vIHVubmVjZXNzYXJ5IHdvcmsuXG5cdFx0XHQvLyBhbHNvOiBwcm9iYWJseSB3ZSBjYW4gc3RvcmUgdGhlIGluZm9ybWF0aW9uIHdlIGRldGVjdCBoZXJlLCB0byBzcGVlZCB1cCB0cmVlIGZpbmFsaXphdGlvbiFcblx0XHRcdGVhY2goZHJhZnRfLCBrZXkgPT4ge1xuXHRcdFx0XHRpZiAoKGtleSBhcyBhbnkpID09PSBEUkFGVF9TVEFURSkgcmV0dXJuXG5cdFx0XHRcdC8vIFRoZSBgdW5kZWZpbmVkYCBjaGVjayBpcyBhIGZhc3QgcGF0aCBmb3IgcHJlLWV4aXN0aW5nIGtleXMuXG5cdFx0XHRcdGlmICgoYmFzZV8gYXMgYW55KVtrZXldID09PSB1bmRlZmluZWQgJiYgIWhhcyhiYXNlXywga2V5KSkge1xuXHRcdFx0XHRcdGFzc2lnbmVkX1trZXldID0gdHJ1ZVxuXHRcdFx0XHRcdG1hcmtDaGFuZ2VkKHN0YXRlKVxuXHRcdFx0XHR9IGVsc2UgaWYgKCFhc3NpZ25lZF9ba2V5XSkge1xuXHRcdFx0XHRcdC8vIE9ubHkgdW50b3VjaGVkIHByb3BlcnRpZXMgdHJpZ2dlciByZWN1cnNpb24uXG5cdFx0XHRcdFx0bWFya0NoYW5nZXNSZWN1cnNpdmVseShkcmFmdF9ba2V5XSlcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC8vIExvb2sgZm9yIHJlbW92ZWQga2V5cy5cblx0XHRcdGVhY2goYmFzZV8sIGtleSA9PiB7XG5cdFx0XHRcdC8vIFRoZSBgdW5kZWZpbmVkYCBjaGVjayBpcyBhIGZhc3QgcGF0aCBmb3IgcHJlLWV4aXN0aW5nIGtleXMuXG5cdFx0XHRcdGlmIChkcmFmdF9ba2V5XSA9PT0gdW5kZWZpbmVkICYmICFoYXMoZHJhZnRfLCBrZXkpKSB7XG5cdFx0XHRcdFx0YXNzaWduZWRfW2tleV0gPSBmYWxzZVxuXHRcdFx0XHRcdG1hcmtDaGFuZ2VkKHN0YXRlKVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdH0gZWxzZSBpZiAodHlwZV8gPT09IFByb3h5VHlwZS5FUzVBcnJheSkge1xuXHRcdFx0aWYgKGhhc0FycmF5Q2hhbmdlcyhzdGF0ZSBhcyBFUzVBcnJheVN0YXRlKSkge1xuXHRcdFx0XHRtYXJrQ2hhbmdlZChzdGF0ZSlcblx0XHRcdFx0YXNzaWduZWRfLmxlbmd0aCA9IHRydWVcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRyYWZ0Xy5sZW5ndGggPCBiYXNlXy5sZW5ndGgpIHtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IGRyYWZ0Xy5sZW5ndGg7IGkgPCBiYXNlXy5sZW5ndGg7IGkrKykgYXNzaWduZWRfW2ldID0gZmFsc2Vcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSBiYXNlXy5sZW5ndGg7IGkgPCBkcmFmdF8ubGVuZ3RoOyBpKyspIGFzc2lnbmVkX1tpXSA9IHRydWVcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWluaW11bSBjb3VudCBpcyBlbm91Z2gsIHRoZSBvdGhlciBwYXJ0cyBoYXMgYmVlbiBwcm9jZXNzZWQuXG5cdFx0XHRjb25zdCBtaW4gPSBNYXRoLm1pbihkcmFmdF8ubGVuZ3RoLCBiYXNlXy5sZW5ndGgpXG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbWluOyBpKyspIHtcblx0XHRcdFx0Ly8gT25seSB1bnRvdWNoZWQgaW5kaWNlcyB0cmlnZ2VyIHJlY3Vyc2lvbi5cblx0XHRcdFx0aWYgKCFkcmFmdF8uaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdFx0XHRhc3NpZ25lZF9baV0gPSB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGFzc2lnbmVkX1tpXSA9PT0gdW5kZWZpbmVkKSBtYXJrQ2hhbmdlc1JlY3Vyc2l2ZWx5KGRyYWZ0X1tpXSlcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBoYXNPYmplY3RDaGFuZ2VzKHN0YXRlOiBFUzVPYmplY3RTdGF0ZSkge1xuXHRcdGNvbnN0IHtiYXNlXywgZHJhZnRffSA9IHN0YXRlXG5cblx0XHQvLyBTZWFyY2ggZm9yIGFkZGVkIGtleXMgYW5kIGNoYW5nZWQga2V5cy4gU3RhcnQgYXQgdGhlIGJhY2ssIGJlY2F1c2Vcblx0XHQvLyBub24tbnVtZXJpYyBrZXlzIGFyZSBvcmRlcmVkIGJ5IHRpbWUgb2YgZGVmaW5pdGlvbiBvbiB0aGUgb2JqZWN0LlxuXHRcdGNvbnN0IGtleXMgPSBvd25LZXlzKGRyYWZ0Xylcblx0XHRmb3IgKGxldCBpID0ga2V5cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0Y29uc3Qga2V5OiBhbnkgPSBrZXlzW2ldXG5cdFx0XHRpZiAoa2V5ID09PSBEUkFGVF9TVEFURSkgY29udGludWVcblx0XHRcdGNvbnN0IGJhc2VWYWx1ZSA9IGJhc2VfW2tleV1cblx0XHRcdC8vIFRoZSBgdW5kZWZpbmVkYCBjaGVjayBpcyBhIGZhc3QgcGF0aCBmb3IgcHJlLWV4aXN0aW5nIGtleXMuXG5cdFx0XHRpZiAoYmFzZVZhbHVlID09PSB1bmRlZmluZWQgJiYgIWhhcyhiYXNlXywga2V5KSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdFx0fVxuXHRcdFx0Ly8gT25jZSBhIGJhc2Uga2V5IGlzIGRlbGV0ZWQsIGZ1dHVyZSBjaGFuZ2VzIGdvIHVuZGV0ZWN0ZWQsIGJlY2F1c2UgaXRzXG5cdFx0XHQvLyBkZXNjcmlwdG9yIGlzIGVyYXNlZC4gVGhpcyBicmFuY2ggZGV0ZWN0cyBhbnkgbWlzc2VkIGNoYW5nZXMuXG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSBkcmFmdF9ba2V5XVxuXHRcdFx0XHRjb25zdCBzdGF0ZTogSW1tZXJTdGF0ZSA9IHZhbHVlICYmIHZhbHVlW0RSQUZUX1NUQVRFXVxuXHRcdFx0XHRpZiAoc3RhdGUgPyBzdGF0ZS5iYXNlXyAhPT0gYmFzZVZhbHVlIDogIWlzKHZhbHVlLCBiYXNlVmFsdWUpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEF0IHRoaXMgcG9pbnQsIG5vIGtleXMgd2VyZSBhZGRlZCBvciBjaGFuZ2VkLlxuXHRcdC8vIENvbXBhcmUga2V5IGNvdW50IHRvIGRldGVybWluZSBpZiBrZXlzIHdlcmUgZGVsZXRlZC5cblx0XHRjb25zdCBiYXNlSXNEcmFmdCA9ICEhYmFzZV9bRFJBRlRfU1RBVEUgYXMgYW55XVxuXHRcdHJldHVybiBrZXlzLmxlbmd0aCAhPT0gb3duS2V5cyhiYXNlXykubGVuZ3RoICsgKGJhc2VJc0RyYWZ0ID8gMCA6IDEpIC8vICsgMSB0byBjb3JyZWN0IGZvciBEUkFGVF9TVEFURVxuXHR9XG5cblx0ZnVuY3Rpb24gaGFzQXJyYXlDaGFuZ2VzKHN0YXRlOiBFUzVBcnJheVN0YXRlKSB7XG5cdFx0Y29uc3Qge2RyYWZ0X30gPSBzdGF0ZVxuXHRcdGlmIChkcmFmdF8ubGVuZ3RoICE9PSBzdGF0ZS5iYXNlXy5sZW5ndGgpIHJldHVybiB0cnVlXG5cdFx0Ly8gU2VlICMxMTZcblx0XHQvLyBJZiB3ZSBmaXJzdCBzaG9ydGVuIHRoZSBsZW5ndGgsIG91ciBhcnJheSBpbnRlcmNlcHRvcnMgd2lsbCBiZSByZW1vdmVkLlxuXHRcdC8vIElmIGFmdGVyIHRoYXQgbmV3IGl0ZW1zIGFyZSBhZGRlZCwgcmVzdWx0IGluIHRoZSBzYW1lIG9yaWdpbmFsIGxlbmd0aCxcblx0XHQvLyB0aG9zZSBsYXN0IGl0ZW1zIHdpbGwgaGF2ZSBubyBpbnRlcmNlcHRpbmcgcHJvcGVydHkuXG5cdFx0Ly8gU28gaWYgdGhlcmUgaXMgbm8gb3duIGRlc2NyaXB0b3Igb24gdGhlIGxhc3QgcG9zaXRpb24sIHdlIGtub3cgdGhhdCBpdGVtcyB3ZXJlIHJlbW92ZWQgYW5kIGFkZGVkXG5cdFx0Ly8gTi5CLjogc3BsaWNlLCB1bnNoaWZ0LCBldGMgb25seSBzaGlmdCB2YWx1ZXMgYXJvdW5kLCBidXQgbm90IHByb3AgZGVzY3JpcHRvcnMsIHNvIHdlIG9ubHkgaGF2ZSB0byBjaGVja1xuXHRcdC8vIHRoZSBsYXN0IG9uZVxuXHRcdC8vIGxhc3QgZGVzY3JpcHRvciBjYW4gYmUgbm90IGEgdHJhcCwgaWYgdGhlIGFycmF5IHdhcyBleHRlbmRlZFxuXHRcdGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuXHRcdFx0ZHJhZnRfLFxuXHRcdFx0ZHJhZnRfLmxlbmd0aCAtIDFcblx0XHQpXG5cdFx0Ly8gZGVzY3JpcHRvciBjYW4gYmUgbnVsbCwgYnV0IG9ubHkgZm9yIG5ld2x5IGNyZWF0ZWQgc3BhcnNlIGFycmF5cywgZWcuIG5ldyBBcnJheSgxMClcblx0XHRpZiAoZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5nZXQpIHJldHVybiB0cnVlXG5cdFx0Ly8gaWYgd2UgbWlzcyBhIHByb3BlcnR5LCBpdCBoYXMgYmVlbiBkZWxldGVkLCBzbyBhcnJheSBwcm9ib2JhbHkgY2hhbmdlZFxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZHJhZnRfLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoIWRyYWZ0Xy5oYXNPd25Qcm9wZXJ0eShpKSkgcmV0dXJuIHRydWVcblx0XHR9XG5cdFx0Ly8gRm9yIGFsbCBvdGhlciBjYXNlcywgd2UgZG9uJ3QgaGF2ZSB0byBjb21wYXJlLCBhcyB0aGV5IHdvdWxkIGhhdmUgYmVlbiBwaWNrZWQgdXAgYnkgdGhlIGluZGV4IHNldHRlcnNcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxuXG5cdGZ1bmN0aW9uIGhhc0NoYW5nZXNfKHN0YXRlOiBFUzVTdGF0ZSkge1xuXHRcdHJldHVybiBzdGF0ZS50eXBlXyA9PT0gUHJveHlUeXBlLkVTNU9iamVjdFxuXHRcdFx0PyBoYXNPYmplY3RDaGFuZ2VzKHN0YXRlKVxuXHRcdFx0OiBoYXNBcnJheUNoYW5nZXMoc3RhdGUpXG5cdH1cblxuXHRmdW5jdGlvbiBhc3NlcnRVbnJldm9rZWQoc3RhdGU6IGFueSAvKkVTNVN0YXRlIHwgTWFwU3RhdGUgfCBTZXRTdGF0ZSovKSB7XG5cdFx0aWYgKHN0YXRlLnJldm9rZWRfKSBkaWUoMywgSlNPTi5zdHJpbmdpZnkobGF0ZXN0KHN0YXRlKSkpXG5cdH1cblxuXHRsb2FkUGx1Z2luKFwiRVM1XCIsIHtcblx0XHRjcmVhdGVFUzVQcm94eV8sXG5cdFx0d2lsbEZpbmFsaXplRVM1Xyxcblx0XHRoYXNDaGFuZ2VzX1xuXHR9KVxufVxuIiwgImltcG9ydCB7aW1tZXJhYmxlfSBmcm9tIFwiLi4vaW1tZXJcIlxuaW1wb3J0IHtcblx0SW1tZXJTdGF0ZSxcblx0UGF0Y2gsXG5cdFNldFN0YXRlLFxuXHRFUzVBcnJheVN0YXRlLFxuXHRQcm94eUFycmF5U3RhdGUsXG5cdE1hcFN0YXRlLFxuXHRFUzVPYmplY3RTdGF0ZSxcblx0UHJveHlPYmplY3RTdGF0ZSxcblx0UGF0Y2hQYXRoLFxuXHRnZXQsXG5cdGVhY2gsXG5cdGhhcyxcblx0Z2V0QXJjaHR5cGUsXG5cdGlzU2V0LFxuXHRpc01hcCxcblx0bG9hZFBsdWdpbixcblx0UHJveHlUeXBlLFxuXHRBcmNodHlwZSxcblx0ZGllLFxuXHRpc0RyYWZ0LFxuXHRpc0RyYWZ0YWJsZSxcblx0Tk9USElOR1xufSBmcm9tIFwiLi4vaW50ZXJuYWxcIlxuXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlUGF0Y2hlcygpIHtcblx0Y29uc3QgUkVQTEFDRSA9IFwicmVwbGFjZVwiXG5cdGNvbnN0IEFERCA9IFwiYWRkXCJcblx0Y29uc3QgUkVNT1ZFID0gXCJyZW1vdmVcIlxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlUGF0Y2hlc18oXG5cdFx0c3RhdGU6IEltbWVyU3RhdGUsXG5cdFx0YmFzZVBhdGg6IFBhdGNoUGF0aCxcblx0XHRwYXRjaGVzOiBQYXRjaFtdLFxuXHRcdGludmVyc2VQYXRjaGVzOiBQYXRjaFtdXG5cdCk6IHZvaWQge1xuXHRcdHN3aXRjaCAoc3RhdGUudHlwZV8pIHtcblx0XHRcdGNhc2UgUHJveHlUeXBlLlByb3h5T2JqZWN0OlxuXHRcdFx0Y2FzZSBQcm94eVR5cGUuRVM1T2JqZWN0OlxuXHRcdFx0Y2FzZSBQcm94eVR5cGUuTWFwOlxuXHRcdFx0XHRyZXR1cm4gZ2VuZXJhdGVQYXRjaGVzRnJvbUFzc2lnbmVkKFxuXHRcdFx0XHRcdHN0YXRlLFxuXHRcdFx0XHRcdGJhc2VQYXRoLFxuXHRcdFx0XHRcdHBhdGNoZXMsXG5cdFx0XHRcdFx0aW52ZXJzZVBhdGNoZXNcblx0XHRcdFx0KVxuXHRcdFx0Y2FzZSBQcm94eVR5cGUuRVM1QXJyYXk6XG5cdFx0XHRjYXNlIFByb3h5VHlwZS5Qcm94eUFycmF5OlxuXHRcdFx0XHRyZXR1cm4gZ2VuZXJhdGVBcnJheVBhdGNoZXMoc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcylcblx0XHRcdGNhc2UgUHJveHlUeXBlLlNldDpcblx0XHRcdFx0cmV0dXJuIGdlbmVyYXRlU2V0UGF0Y2hlcyhcblx0XHRcdFx0XHQoc3RhdGUgYXMgYW55KSBhcyBTZXRTdGF0ZSxcblx0XHRcdFx0XHRiYXNlUGF0aCxcblx0XHRcdFx0XHRwYXRjaGVzLFxuXHRcdFx0XHRcdGludmVyc2VQYXRjaGVzXG5cdFx0XHRcdClcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZUFycmF5UGF0Y2hlcyhcblx0XHRzdGF0ZTogRVM1QXJyYXlTdGF0ZSB8IFByb3h5QXJyYXlTdGF0ZSxcblx0XHRiYXNlUGF0aDogUGF0Y2hQYXRoLFxuXHRcdHBhdGNoZXM6IFBhdGNoW10sXG5cdFx0aW52ZXJzZVBhdGNoZXM6IFBhdGNoW11cblx0KSB7XG5cdFx0bGV0IHtiYXNlXywgYXNzaWduZWRffSA9IHN0YXRlXG5cdFx0bGV0IGNvcHlfID0gc3RhdGUuY29weV8hXG5cblx0XHQvLyBSZWR1Y2UgY29tcGxleGl0eSBieSBlbnN1cmluZyBgYmFzZWAgaXMgbmV2ZXIgbG9uZ2VyLlxuXHRcdGlmIChjb3B5Xy5sZW5ndGggPCBiYXNlXy5sZW5ndGgpIHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdDtbYmFzZV8sIGNvcHlfXSA9IFtjb3B5XywgYmFzZV9dXG5cdFx0XHQ7W3BhdGNoZXMsIGludmVyc2VQYXRjaGVzXSA9IFtpbnZlcnNlUGF0Y2hlcywgcGF0Y2hlc11cblx0XHR9XG5cblx0XHQvLyBQcm9jZXNzIHJlcGxhY2VkIGluZGljZXMuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBiYXNlXy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKGFzc2lnbmVkX1tpXSAmJiBjb3B5X1tpXSAhPT0gYmFzZV9baV0pIHtcblx0XHRcdFx0Y29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pXG5cdFx0XHRcdHBhdGNoZXMucHVzaCh7XG5cdFx0XHRcdFx0b3A6IFJFUExBQ0UsXG5cdFx0XHRcdFx0cGF0aCxcblx0XHRcdFx0XHQvLyBOZWVkIHRvIG1heWJlIGNsb25lIGl0LCBhcyBpdCBjYW4gaW4gZmFjdCBiZSB0aGUgb3JpZ2luYWwgdmFsdWVcblx0XHRcdFx0XHQvLyBkdWUgdG8gdGhlIGJhc2UvY29weSBpbnZlcnNpb24gYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb25cblx0XHRcdFx0XHR2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQoY29weV9baV0pXG5cdFx0XHRcdH0pXG5cdFx0XHRcdGludmVyc2VQYXRjaGVzLnB1c2goe1xuXHRcdFx0XHRcdG9wOiBSRVBMQUNFLFxuXHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0dmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKGJhc2VfW2ldKVxuXHRcdFx0XHR9KVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByb2Nlc3MgYWRkZWQgaW5kaWNlcy5cblx0XHRmb3IgKGxldCBpID0gYmFzZV8ubGVuZ3RoOyBpIDwgY29weV8ubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKVxuXHRcdFx0cGF0Y2hlcy5wdXNoKHtcblx0XHRcdFx0b3A6IEFERCxcblx0XHRcdFx0cGF0aCxcblx0XHRcdFx0Ly8gTmVlZCB0byBtYXliZSBjbG9uZSBpdCwgYXMgaXQgY2FuIGluIGZhY3QgYmUgdGhlIG9yaWdpbmFsIHZhbHVlXG5cdFx0XHRcdC8vIGR1ZSB0byB0aGUgYmFzZS9jb3B5IGludmVyc2lvbiBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvblxuXHRcdFx0XHR2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQoY29weV9baV0pXG5cdFx0XHR9KVxuXHRcdH1cblx0XHRpZiAoYmFzZV8ubGVuZ3RoIDwgY29weV8ubGVuZ3RoKSB7XG5cdFx0XHRpbnZlcnNlUGF0Y2hlcy5wdXNoKHtcblx0XHRcdFx0b3A6IFJFUExBQ0UsXG5cdFx0XHRcdHBhdGg6IGJhc2VQYXRoLmNvbmNhdChbXCJsZW5ndGhcIl0pLFxuXHRcdFx0XHR2YWx1ZTogYmFzZV8ubGVuZ3RoXG5cdFx0XHR9KVxuXHRcdH1cblx0fVxuXG5cdC8vIFRoaXMgaXMgdXNlZCBmb3IgYm90aCBNYXAgb2JqZWN0cyBhbmQgbm9ybWFsIG9iamVjdHMuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlUGF0Y2hlc0Zyb21Bc3NpZ25lZChcblx0XHRzdGF0ZTogTWFwU3RhdGUgfCBFUzVPYmplY3RTdGF0ZSB8IFByb3h5T2JqZWN0U3RhdGUsXG5cdFx0YmFzZVBhdGg6IFBhdGNoUGF0aCxcblx0XHRwYXRjaGVzOiBQYXRjaFtdLFxuXHRcdGludmVyc2VQYXRjaGVzOiBQYXRjaFtdXG5cdCkge1xuXHRcdGNvbnN0IHtiYXNlXywgY29weV99ID0gc3RhdGVcblx0XHRlYWNoKHN0YXRlLmFzc2lnbmVkXyEsIChrZXksIGFzc2lnbmVkVmFsdWUpID0+IHtcblx0XHRcdGNvbnN0IG9yaWdWYWx1ZSA9IGdldChiYXNlXywga2V5KVxuXHRcdFx0Y29uc3QgdmFsdWUgPSBnZXQoY29weV8hLCBrZXkpXG5cdFx0XHRjb25zdCBvcCA9ICFhc3NpZ25lZFZhbHVlID8gUkVNT1ZFIDogaGFzKGJhc2VfLCBrZXkpID8gUkVQTEFDRSA6IEFERFxuXHRcdFx0aWYgKG9yaWdWYWx1ZSA9PT0gdmFsdWUgJiYgb3AgPT09IFJFUExBQ0UpIHJldHVyblxuXHRcdFx0Y29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChrZXkgYXMgYW55KVxuXHRcdFx0cGF0Y2hlcy5wdXNoKG9wID09PSBSRU1PVkUgPyB7b3AsIHBhdGh9IDoge29wLCBwYXRoLCB2YWx1ZX0pXG5cdFx0XHRpbnZlcnNlUGF0Y2hlcy5wdXNoKFxuXHRcdFx0XHRvcCA9PT0gQUREXG5cdFx0XHRcdFx0PyB7b3A6IFJFTU9WRSwgcGF0aH1cblx0XHRcdFx0XHQ6IG9wID09PSBSRU1PVkVcblx0XHRcdFx0XHQ/IHtvcDogQURELCBwYXRoLCB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQob3JpZ1ZhbHVlKX1cblx0XHRcdFx0XHQ6IHtvcDogUkVQTEFDRSwgcGF0aCwgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKG9yaWdWYWx1ZSl9XG5cdFx0XHQpXG5cdFx0fSlcblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlU2V0UGF0Y2hlcyhcblx0XHRzdGF0ZTogU2V0U3RhdGUsXG5cdFx0YmFzZVBhdGg6IFBhdGNoUGF0aCxcblx0XHRwYXRjaGVzOiBQYXRjaFtdLFxuXHRcdGludmVyc2VQYXRjaGVzOiBQYXRjaFtdXG5cdCkge1xuXHRcdGxldCB7YmFzZV8sIGNvcHlffSA9IHN0YXRlXG5cblx0XHRsZXQgaSA9IDBcblx0XHRiYXNlXy5mb3JFYWNoKCh2YWx1ZTogYW55KSA9PiB7XG5cdFx0XHRpZiAoIWNvcHlfIS5oYXModmFsdWUpKSB7XG5cdFx0XHRcdGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKVxuXHRcdFx0XHRwYXRjaGVzLnB1c2goe1xuXHRcdFx0XHRcdG9wOiBSRU1PVkUsXG5cdFx0XHRcdFx0cGF0aCxcblx0XHRcdFx0XHR2YWx1ZVxuXHRcdFx0XHR9KVxuXHRcdFx0XHRpbnZlcnNlUGF0Y2hlcy51bnNoaWZ0KHtcblx0XHRcdFx0XHRvcDogQURELFxuXHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0dmFsdWVcblx0XHRcdFx0fSlcblx0XHRcdH1cblx0XHRcdGkrK1xuXHRcdH0pXG5cdFx0aSA9IDBcblx0XHRjb3B5XyEuZm9yRWFjaCgodmFsdWU6IGFueSkgPT4ge1xuXHRcdFx0aWYgKCFiYXNlXy5oYXModmFsdWUpKSB7XG5cdFx0XHRcdGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKVxuXHRcdFx0XHRwYXRjaGVzLnB1c2goe1xuXHRcdFx0XHRcdG9wOiBBREQsXG5cdFx0XHRcdFx0cGF0aCxcblx0XHRcdFx0XHR2YWx1ZVxuXHRcdFx0XHR9KVxuXHRcdFx0XHRpbnZlcnNlUGF0Y2hlcy51bnNoaWZ0KHtcblx0XHRcdFx0XHRvcDogUkVNT1ZFLFxuXHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0dmFsdWVcblx0XHRcdFx0fSlcblx0XHRcdH1cblx0XHRcdGkrK1xuXHRcdH0pXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc18oXG5cdFx0YmFzZVZhbHVlOiBhbnksXG5cdFx0cmVwbGFjZW1lbnQ6IGFueSxcblx0XHRwYXRjaGVzOiBQYXRjaFtdLFxuXHRcdGludmVyc2VQYXRjaGVzOiBQYXRjaFtdXG5cdCk6IHZvaWQge1xuXHRcdHBhdGNoZXMucHVzaCh7XG5cdFx0XHRvcDogUkVQTEFDRSxcblx0XHRcdHBhdGg6IFtdLFxuXHRcdFx0dmFsdWU6IHJlcGxhY2VtZW50ID09PSBOT1RISU5HID8gdW5kZWZpbmVkIDogcmVwbGFjZW1lbnRcblx0XHR9KVxuXHRcdGludmVyc2VQYXRjaGVzLnB1c2goe1xuXHRcdFx0b3A6IFJFUExBQ0UsXG5cdFx0XHRwYXRoOiBbXSxcblx0XHRcdHZhbHVlOiBiYXNlVmFsdWVcblx0XHR9KVxuXHR9XG5cblx0ZnVuY3Rpb24gYXBwbHlQYXRjaGVzXzxUPihkcmFmdDogVCwgcGF0Y2hlczogUGF0Y2hbXSk6IFQge1xuXHRcdHBhdGNoZXMuZm9yRWFjaChwYXRjaCA9PiB7XG5cdFx0XHRjb25zdCB7cGF0aCwgb3B9ID0gcGF0Y2hcblxuXHRcdFx0bGV0IGJhc2U6IGFueSA9IGRyYWZ0XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IHBhcmVudFR5cGUgPSBnZXRBcmNodHlwZShiYXNlKVxuXHRcdFx0XHRjb25zdCBwID0gXCJcIiArIHBhdGhbaV1cblx0XHRcdFx0Ly8gU2VlICM3MzgsIGF2b2lkIHByb3RvdHlwZSBwb2xsdXRpb25cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdChwYXJlbnRUeXBlID09PSBBcmNodHlwZS5PYmplY3QgfHwgcGFyZW50VHlwZSA9PT0gQXJjaHR5cGUuQXJyYXkpICYmXG5cdFx0XHRcdFx0KHAgPT09IFwiX19wcm90b19fXCIgfHwgcCA9PT0gXCJjb25zdHJ1Y3RvclwiKVxuXHRcdFx0XHQpXG5cdFx0XHRcdFx0ZGllKDI0KVxuXHRcdFx0XHRpZiAodHlwZW9mIGJhc2UgPT09IFwiZnVuY3Rpb25cIiAmJiBwID09PSBcInByb3RvdHlwZVwiKSBkaWUoMjQpXG5cdFx0XHRcdGJhc2UgPSBnZXQoYmFzZSwgcClcblx0XHRcdFx0aWYgKHR5cGVvZiBiYXNlICE9PSBcIm9iamVjdFwiKSBkaWUoMTUsIHBhdGguam9pbihcIi9cIikpXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHR5cGUgPSBnZXRBcmNodHlwZShiYXNlKVxuXHRcdFx0Y29uc3QgdmFsdWUgPSBkZWVwQ2xvbmVQYXRjaFZhbHVlKHBhdGNoLnZhbHVlKSAvLyB1c2VkIHRvIGNsb25lIHBhdGNoIHRvIGVuc3VyZSBvcmlnaW5hbCBwYXRjaCBpcyBub3QgbW9kaWZpZWQsIHNlZSAjNDExXG5cdFx0XHRjb25zdCBrZXkgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV1cblx0XHRcdHN3aXRjaCAob3ApIHtcblx0XHRcdFx0Y2FzZSBSRVBMQUNFOlxuXHRcdFx0XHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBBcmNodHlwZS5NYXA6XG5cdFx0XHRcdFx0XHRcdHJldHVybiBiYXNlLnNldChrZXksIHZhbHVlKVxuXHRcdFx0XHRcdFx0LyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0XHRcdFx0XHRcdGNhc2UgQXJjaHR5cGUuU2V0OlxuXHRcdFx0XHRcdFx0XHRkaWUoMTYpXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHQvLyBpZiB2YWx1ZSBpcyBhbiBvYmplY3QsIHRoZW4gaXQncyBhc3NpZ25lZCBieSByZWZlcmVuY2Vcblx0XHRcdFx0XHRcdFx0Ly8gaW4gdGhlIGZvbGxvd2luZyBhZGQgb3IgcmVtb3ZlIG9wcywgdGhlIHZhbHVlIGZpZWxkIGluc2lkZSB0aGUgcGF0Y2ggd2lsbCBhbHNvIGJlIG1vZGlmeWVkXG5cdFx0XHRcdFx0XHRcdC8vIHNvIHdlIHVzZSB2YWx1ZSBmcm9tIHRoZSBjbG9uZWQgcGF0Y2hcblx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKGJhc2Vba2V5XSA9IHZhbHVlKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0Y2FzZSBBREQ6XG5cdFx0XHRcdFx0c3dpdGNoICh0eXBlKSB7XG5cdFx0XHRcdFx0XHRjYXNlIEFyY2h0eXBlLkFycmF5OlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4ga2V5ID09PSBcIi1cIlxuXHRcdFx0XHRcdFx0XHRcdD8gYmFzZS5wdXNoKHZhbHVlKVxuXHRcdFx0XHRcdFx0XHRcdDogYmFzZS5zcGxpY2Uoa2V5IGFzIGFueSwgMCwgdmFsdWUpXG5cdFx0XHRcdFx0XHRjYXNlIEFyY2h0eXBlLk1hcDpcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGJhc2Uuc2V0KGtleSwgdmFsdWUpXG5cdFx0XHRcdFx0XHRjYXNlIEFyY2h0eXBlLlNldDpcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGJhc2UuYWRkKHZhbHVlKVxuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0cmV0dXJuIChiYXNlW2tleV0gPSB2YWx1ZSlcblx0XHRcdFx0XHR9XG5cdFx0XHRcdGNhc2UgUkVNT1ZFOlxuXHRcdFx0XHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBBcmNodHlwZS5BcnJheTpcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGJhc2Uuc3BsaWNlKGtleSBhcyBhbnksIDEpXG5cdFx0XHRcdFx0XHRjYXNlIEFyY2h0eXBlLk1hcDpcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGJhc2UuZGVsZXRlKGtleSlcblx0XHRcdFx0XHRcdGNhc2UgQXJjaHR5cGUuU2V0OlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYmFzZS5kZWxldGUocGF0Y2gudmFsdWUpXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZGVsZXRlIGJhc2Vba2V5XVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRkaWUoMTcsIG9wKVxuXHRcdFx0fVxuXHRcdH0pXG5cblx0XHRyZXR1cm4gZHJhZnRcblx0fVxuXG5cdC8vIG9wdGltaXplOiB0aGlzIGlzIHF1aXRlIGEgcGVyZm9ybWFuY2UgaGl0LCBjYW4gd2UgZGV0ZWN0IGludGVsbGlnZW50bHkgd2hlbiBpdCBpcyBuZWVkZWQ/XG5cdC8vIEUuZy4gYXV0by1kcmFmdCB3aGVuIG5ldyBvYmplY3RzIGZyb20gb3V0c2lkZSBhcmUgYXNzaWduZWQgYW5kIG1vZGlmaWVkP1xuXHQvLyAoU2VlIGZhaWxpbmcgdGVzdCB3aGVuIGRlZXBDbG9uZSBqdXN0IHJldHVybnMgb2JqKVxuXHRmdW5jdGlvbiBkZWVwQ2xvbmVQYXRjaFZhbHVlPFQ+KG9iajogVCk6IFRcblx0ZnVuY3Rpb24gZGVlcENsb25lUGF0Y2hWYWx1ZShvYmo6IGFueSkge1xuXHRcdGlmICghaXNEcmFmdGFibGUob2JqKSkgcmV0dXJuIG9ialxuXHRcdGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubWFwKGRlZXBDbG9uZVBhdGNoVmFsdWUpXG5cdFx0aWYgKGlzTWFwKG9iaikpXG5cdFx0XHRyZXR1cm4gbmV3IE1hcChcblx0XHRcdFx0QXJyYXkuZnJvbShvYmouZW50cmllcygpKS5tYXAoKFtrLCB2XSkgPT4gW2ssIGRlZXBDbG9uZVBhdGNoVmFsdWUodildKVxuXHRcdFx0KVxuXHRcdGlmIChpc1NldChvYmopKSByZXR1cm4gbmV3IFNldChBcnJheS5mcm9tKG9iaikubWFwKGRlZXBDbG9uZVBhdGNoVmFsdWUpKVxuXHRcdGNvbnN0IGNsb25lZCA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikpXG5cdFx0Zm9yIChjb25zdCBrZXkgaW4gb2JqKSBjbG9uZWRba2V5XSA9IGRlZXBDbG9uZVBhdGNoVmFsdWUob2JqW2tleV0pXG5cdFx0aWYgKGhhcyhvYmosIGltbWVyYWJsZSkpIGNsb25lZFtpbW1lcmFibGVdID0gb2JqW2ltbWVyYWJsZV1cblx0XHRyZXR1cm4gY2xvbmVkXG5cdH1cblxuXHRmdW5jdGlvbiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZDxUPihvYmo6IFQpOiBUIHtcblx0XHRpZiAoaXNEcmFmdChvYmopKSB7XG5cdFx0XHRyZXR1cm4gZGVlcENsb25lUGF0Y2hWYWx1ZShvYmopXG5cdFx0fSBlbHNlIHJldHVybiBvYmpcblx0fVxuXG5cdGxvYWRQbHVnaW4oXCJQYXRjaGVzXCIsIHtcblx0XHRhcHBseVBhdGNoZXNfLFxuXHRcdGdlbmVyYXRlUGF0Y2hlc18sXG5cdFx0Z2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfXG5cdH0pXG59XG4iLCAiLy8gdHlwZXMgb25seSFcbmltcG9ydCB7XG5cdEltbWVyU3RhdGUsXG5cdEFueU1hcCxcblx0QW55U2V0LFxuXHRNYXBTdGF0ZSxcblx0U2V0U3RhdGUsXG5cdERSQUZUX1NUQVRFLFxuXHRnZXRDdXJyZW50U2NvcGUsXG5cdGxhdGVzdCxcblx0aXRlcmF0b3JTeW1ib2wsXG5cdGlzRHJhZnRhYmxlLFxuXHRjcmVhdGVQcm94eSxcblx0bG9hZFBsdWdpbixcblx0bWFya0NoYW5nZWQsXG5cdFByb3h5VHlwZSxcblx0ZGllLFxuXHRlYWNoXG59IGZyb20gXCIuLi9pbnRlcm5hbFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVNYXBTZXQoKSB7XG5cdC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZDogYW55LCBiOiBhbnkpOiBhbnkge1xuXHRcdGV4dGVuZFN0YXRpY3MgPVxuXHRcdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG5cdFx0XHQoe19fcHJvdG9fXzogW119IGluc3RhbmNlb2YgQXJyYXkgJiZcblx0XHRcdFx0ZnVuY3Rpb24oZCwgYikge1xuXHRcdFx0XHRcdGQuX19wcm90b19fID0gYlxuXHRcdFx0XHR9KSB8fFxuXHRcdFx0ZnVuY3Rpb24oZCwgYikge1xuXHRcdFx0XHRmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXVxuXHRcdFx0fVxuXHRcdHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpXG5cdH1cblxuXHQvLyBVZ2x5IGhhY2sgdG8gcmVzb2x2ZSAjNTAyIGFuZCBpbmhlcml0IGJ1aWx0IGluIE1hcCAvIFNldFxuXHRmdW5jdGlvbiBfX2V4dGVuZHMoZDogYW55LCBiOiBhbnkpOiBhbnkge1xuXHRcdGV4dGVuZFN0YXRpY3MoZCwgYilcblx0XHRmdW5jdGlvbiBfXyh0aGlzOiBhbnkpOiBhbnkge1xuXHRcdFx0dGhpcy5jb25zdHJ1Y3RvciA9IGRcblx0XHR9XG5cdFx0ZC5wcm90b3R5cGUgPVxuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0KChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSksIG5ldyBfXygpKVxuXHR9XG5cblx0Y29uc3QgRHJhZnRNYXAgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG5cdFx0X19leHRlbmRzKERyYWZ0TWFwLCBfc3VwZXIpXG5cdFx0Ly8gQ3JlYXRlIGNsYXNzIG1hbnVhbGx5LCBjYXVzZSAjNTAyXG5cdFx0ZnVuY3Rpb24gRHJhZnRNYXAodGhpczogYW55LCB0YXJnZXQ6IEFueU1hcCwgcGFyZW50PzogSW1tZXJTdGF0ZSk6IGFueSB7XG5cdFx0XHR0aGlzW0RSQUZUX1NUQVRFXSA9IHtcblx0XHRcdFx0dHlwZV86IFByb3h5VHlwZS5NYXAsXG5cdFx0XHRcdHBhcmVudF86IHBhcmVudCxcblx0XHRcdFx0c2NvcGVfOiBwYXJlbnQgPyBwYXJlbnQuc2NvcGVfIDogZ2V0Q3VycmVudFNjb3BlKCkhLFxuXHRcdFx0XHRtb2RpZmllZF86IGZhbHNlLFxuXHRcdFx0XHRmaW5hbGl6ZWRfOiBmYWxzZSxcblx0XHRcdFx0Y29weV86IHVuZGVmaW5lZCxcblx0XHRcdFx0YXNzaWduZWRfOiB1bmRlZmluZWQsXG5cdFx0XHRcdGJhc2VfOiB0YXJnZXQsXG5cdFx0XHRcdGRyYWZ0XzogdGhpcyBhcyBhbnksXG5cdFx0XHRcdGlzTWFudWFsXzogZmFsc2UsXG5cdFx0XHRcdHJldm9rZWRfOiBmYWxzZVxuXHRcdFx0fSBhcyBNYXBTdGF0ZVxuXHRcdFx0cmV0dXJuIHRoaXNcblx0XHR9XG5cdFx0Y29uc3QgcCA9IERyYWZ0TWFwLnByb3RvdHlwZVxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHAsIFwic2l6ZVwiLCB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5zaXplXG5cdFx0XHR9XG5cdFx0XHQvLyBlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHRcdC8vIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdH0pXG5cblx0XHRwLmhhcyA9IGZ1bmN0aW9uKGtleTogYW55KTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5oYXMoa2V5KVxuXHRcdH1cblxuXHRcdHAuc2V0ID0gZnVuY3Rpb24oa2V5OiBhbnksIHZhbHVlOiBhbnkpIHtcblx0XHRcdGNvbnN0IHN0YXRlOiBNYXBTdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdXG5cdFx0XHRhc3NlcnRVbnJldm9rZWQoc3RhdGUpXG5cdFx0XHRpZiAoIWxhdGVzdChzdGF0ZSkuaGFzKGtleSkgfHwgbGF0ZXN0KHN0YXRlKS5nZXQoa2V5KSAhPT0gdmFsdWUpIHtcblx0XHRcdFx0cHJlcGFyZU1hcENvcHkoc3RhdGUpXG5cdFx0XHRcdG1hcmtDaGFuZ2VkKHN0YXRlKVxuXHRcdFx0XHRzdGF0ZS5hc3NpZ25lZF8hLnNldChrZXksIHRydWUpXG5cdFx0XHRcdHN0YXRlLmNvcHlfIS5zZXQoa2V5LCB2YWx1ZSlcblx0XHRcdFx0c3RhdGUuYXNzaWduZWRfIS5zZXQoa2V5LCB0cnVlKVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXNcblx0XHR9XG5cblx0XHRwLmRlbGV0ZSA9IGZ1bmN0aW9uKGtleTogYW55KTogYm9vbGVhbiB7XG5cdFx0XHRpZiAoIXRoaXMuaGFzKGtleSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHN0YXRlOiBNYXBTdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdXG5cdFx0XHRhc3NlcnRVbnJldm9rZWQoc3RhdGUpXG5cdFx0XHRwcmVwYXJlTWFwQ29weShzdGF0ZSlcblx0XHRcdG1hcmtDaGFuZ2VkKHN0YXRlKVxuXHRcdFx0aWYgKHN0YXRlLmJhc2VfLmhhcyhrZXkpKSB7XG5cdFx0XHRcdHN0YXRlLmFzc2lnbmVkXyEuc2V0KGtleSwgZmFsc2UpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdGF0ZS5hc3NpZ25lZF8hLmRlbGV0ZShrZXkpXG5cdFx0XHR9XG5cdFx0XHRzdGF0ZS5jb3B5XyEuZGVsZXRlKGtleSlcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0fVxuXG5cdFx0cC5jbGVhciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3Qgc3RhdGU6IE1hcFN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV1cblx0XHRcdGFzc2VydFVucmV2b2tlZChzdGF0ZSlcblx0XHRcdGlmIChsYXRlc3Qoc3RhdGUpLnNpemUpIHtcblx0XHRcdFx0cHJlcGFyZU1hcENvcHkoc3RhdGUpXG5cdFx0XHRcdG1hcmtDaGFuZ2VkKHN0YXRlKVxuXHRcdFx0XHRzdGF0ZS5hc3NpZ25lZF8gPSBuZXcgTWFwKClcblx0XHRcdFx0ZWFjaChzdGF0ZS5iYXNlXywga2V5ID0+IHtcblx0XHRcdFx0XHRzdGF0ZS5hc3NpZ25lZF8hLnNldChrZXksIGZhbHNlKVxuXHRcdFx0XHR9KVxuXHRcdFx0XHRzdGF0ZS5jb3B5XyEuY2xlYXIoKVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHAuZm9yRWFjaCA9IGZ1bmN0aW9uKFxuXHRcdFx0Y2I6ICh2YWx1ZTogYW55LCBrZXk6IGFueSwgc2VsZjogYW55KSA9PiB2b2lkLFxuXHRcdFx0dGhpc0FyZz86IGFueVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgc3RhdGU6IE1hcFN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV1cblx0XHRcdGxhdGVzdChzdGF0ZSkuZm9yRWFjaCgoX3ZhbHVlOiBhbnksIGtleTogYW55LCBfbWFwOiBhbnkpID0+IHtcblx0XHRcdFx0Y2IuY2FsbCh0aGlzQXJnLCB0aGlzLmdldChrZXkpLCBrZXksIHRoaXMpXG5cdFx0XHR9KVxuXHRcdH1cblxuXHRcdHAuZ2V0ID0gZnVuY3Rpb24oa2V5OiBhbnkpOiBhbnkge1xuXHRcdFx0Y29uc3Qgc3RhdGU6IE1hcFN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV1cblx0XHRcdGFzc2VydFVucmV2b2tlZChzdGF0ZSlcblx0XHRcdGNvbnN0IHZhbHVlID0gbGF0ZXN0KHN0YXRlKS5nZXQoa2V5KVxuXHRcdFx0aWYgKHN0YXRlLmZpbmFsaXplZF8gfHwgIWlzRHJhZnRhYmxlKHZhbHVlKSkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWVcblx0XHRcdH1cblx0XHRcdGlmICh2YWx1ZSAhPT0gc3RhdGUuYmFzZV8uZ2V0KGtleSkpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlIC8vIGVpdGhlciBhbHJlYWR5IGRyYWZ0ZWQgb3IgcmVhc3NpZ25lZFxuXHRcdFx0fVxuXHRcdFx0Ly8gZGVzcGl0ZSB3aGF0IGl0IGxvb2tzLCB0aGlzIGNyZWF0ZXMgYSBkcmFmdCBvbmx5IG9uY2UsIHNlZSBhYm92ZSBjb25kaXRpb25cblx0XHRcdGNvbnN0IGRyYWZ0ID0gY3JlYXRlUHJveHkoc3RhdGUuc2NvcGVfLmltbWVyXywgdmFsdWUsIHN0YXRlKVxuXHRcdFx0cHJlcGFyZU1hcENvcHkoc3RhdGUpXG5cdFx0XHRzdGF0ZS5jb3B5XyEuc2V0KGtleSwgZHJhZnQpXG5cdFx0XHRyZXR1cm4gZHJhZnRcblx0XHR9XG5cblx0XHRwLmtleXMgPSBmdW5jdGlvbigpOiBJdGVyYWJsZUl0ZXJhdG9yPGFueT4ge1xuXHRcdFx0cmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkua2V5cygpXG5cdFx0fVxuXG5cdFx0cC52YWx1ZXMgPSBmdW5jdGlvbigpOiBJdGVyYWJsZUl0ZXJhdG9yPGFueT4ge1xuXHRcdFx0Y29uc3QgaXRlcmF0b3IgPSB0aGlzLmtleXMoKVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0W2l0ZXJhdG9yU3ltYm9sXTogKCkgPT4gdGhpcy52YWx1ZXMoKSxcblx0XHRcdFx0bmV4dDogKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHIgPSBpdGVyYXRvci5uZXh0KClcblx0XHRcdFx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRcdFx0XHRcdGlmIChyLmRvbmUpIHJldHVybiByXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmdldChyLnZhbHVlKVxuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRkb25lOiBmYWxzZSxcblx0XHRcdFx0XHRcdHZhbHVlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGFzIGFueVxuXHRcdH1cblxuXHRcdHAuZW50cmllcyA9IGZ1bmN0aW9uKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W2FueSwgYW55XT4ge1xuXHRcdFx0Y29uc3QgaXRlcmF0b3IgPSB0aGlzLmtleXMoKVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0W2l0ZXJhdG9yU3ltYm9sXTogKCkgPT4gdGhpcy5lbnRyaWVzKCksXG5cdFx0XHRcdG5leHQ6ICgpID0+IHtcblx0XHRcdFx0XHRjb25zdCByID0gaXRlcmF0b3IubmV4dCgpXG5cdFx0XHRcdFx0LyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0XHRcdFx0XHRpZiAoci5kb25lKSByZXR1cm4gclxuXHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoci52YWx1ZSlcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0ZG9uZTogZmFsc2UsXG5cdFx0XHRcdFx0XHR2YWx1ZTogW3IudmFsdWUsIHZhbHVlXVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBhcyBhbnlcblx0XHR9XG5cblx0XHRwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZW50cmllcygpXG5cdFx0fVxuXG5cdFx0cmV0dXJuIERyYWZ0TWFwXG5cdH0pKE1hcClcblxuXHRmdW5jdGlvbiBwcm94eU1hcF88VCBleHRlbmRzIEFueU1hcD4odGFyZ2V0OiBULCBwYXJlbnQ/OiBJbW1lclN0YXRlKTogVCB7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHJldHVybiBuZXcgRHJhZnRNYXAodGFyZ2V0LCBwYXJlbnQpXG5cdH1cblxuXHRmdW5jdGlvbiBwcmVwYXJlTWFwQ29weShzdGF0ZTogTWFwU3RhdGUpIHtcblx0XHRpZiAoIXN0YXRlLmNvcHlfKSB7XG5cdFx0XHRzdGF0ZS5hc3NpZ25lZF8gPSBuZXcgTWFwKClcblx0XHRcdHN0YXRlLmNvcHlfID0gbmV3IE1hcChzdGF0ZS5iYXNlXylcblx0XHR9XG5cdH1cblxuXHRjb25zdCBEcmFmdFNldCA9IChmdW5jdGlvbihfc3VwZXIpIHtcblx0XHRfX2V4dGVuZHMoRHJhZnRTZXQsIF9zdXBlcilcblx0XHQvLyBDcmVhdGUgY2xhc3MgbWFudWFsbHksIGNhdXNlICM1MDJcblx0XHRmdW5jdGlvbiBEcmFmdFNldCh0aGlzOiBhbnksIHRhcmdldDogQW55U2V0LCBwYXJlbnQ/OiBJbW1lclN0YXRlKSB7XG5cdFx0XHR0aGlzW0RSQUZUX1NUQVRFXSA9IHtcblx0XHRcdFx0dHlwZV86IFByb3h5VHlwZS5TZXQsXG5cdFx0XHRcdHBhcmVudF86IHBhcmVudCxcblx0XHRcdFx0c2NvcGVfOiBwYXJlbnQgPyBwYXJlbnQuc2NvcGVfIDogZ2V0Q3VycmVudFNjb3BlKCkhLFxuXHRcdFx0XHRtb2RpZmllZF86IGZhbHNlLFxuXHRcdFx0XHRmaW5hbGl6ZWRfOiBmYWxzZSxcblx0XHRcdFx0Y29weV86IHVuZGVmaW5lZCxcblx0XHRcdFx0YmFzZV86IHRhcmdldCxcblx0XHRcdFx0ZHJhZnRfOiB0aGlzLFxuXHRcdFx0XHRkcmFmdHNfOiBuZXcgTWFwKCksXG5cdFx0XHRcdHJldm9rZWRfOiBmYWxzZSxcblx0XHRcdFx0aXNNYW51YWxfOiBmYWxzZVxuXHRcdFx0fSBhcyBTZXRTdGF0ZVxuXHRcdFx0cmV0dXJuIHRoaXNcblx0XHR9XG5cdFx0Y29uc3QgcCA9IERyYWZ0U2V0LnByb3RvdHlwZVxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHAsIFwic2l6ZVwiLCB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5zaXplXG5cdFx0XHR9XG5cdFx0XHQvLyBlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdH0pXG5cblx0XHRwLmhhcyA9IGZ1bmN0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcblx0XHRcdGNvbnN0IHN0YXRlOiBTZXRTdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdXG5cdFx0XHRhc3NlcnRVbnJldm9rZWQoc3RhdGUpXG5cdFx0XHQvLyBiaXQgb2YgdHJpY2tlcnkgaGVyZSwgdG8gYmUgYWJsZSB0byByZWNvZ25pemUgYm90aCB0aGUgdmFsdWUsIGFuZCB0aGUgZHJhZnQgb2YgaXRzIHZhbHVlXG5cdFx0XHRpZiAoIXN0YXRlLmNvcHlfKSB7XG5cdFx0XHRcdHJldHVybiBzdGF0ZS5iYXNlXy5oYXModmFsdWUpXG5cdFx0XHR9XG5cdFx0XHRpZiAoc3RhdGUuY29weV8uaGFzKHZhbHVlKSkgcmV0dXJuIHRydWVcblx0XHRcdGlmIChzdGF0ZS5kcmFmdHNfLmhhcyh2YWx1ZSkgJiYgc3RhdGUuY29weV8uaGFzKHN0YXRlLmRyYWZ0c18uZ2V0KHZhbHVlKSkpXG5cdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHR9XG5cblx0XHRwLmFkZCA9IGZ1bmN0aW9uKHZhbHVlOiBhbnkpOiBhbnkge1xuXHRcdFx0Y29uc3Qgc3RhdGU6IFNldFN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV1cblx0XHRcdGFzc2VydFVucmV2b2tlZChzdGF0ZSlcblx0XHRcdGlmICghdGhpcy5oYXModmFsdWUpKSB7XG5cdFx0XHRcdHByZXBhcmVTZXRDb3B5KHN0YXRlKVxuXHRcdFx0XHRtYXJrQ2hhbmdlZChzdGF0ZSlcblx0XHRcdFx0c3RhdGUuY29weV8hLmFkZCh2YWx1ZSlcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzXG5cdFx0fVxuXG5cdFx0cC5kZWxldGUgPSBmdW5jdGlvbih2YWx1ZTogYW55KTogYW55IHtcblx0XHRcdGlmICghdGhpcy5oYXModmFsdWUpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzdGF0ZTogU2V0U3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXVxuXHRcdFx0YXNzZXJ0VW5yZXZva2VkKHN0YXRlKVxuXHRcdFx0cHJlcGFyZVNldENvcHkoc3RhdGUpXG5cdFx0XHRtYXJrQ2hhbmdlZChzdGF0ZSlcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdHN0YXRlLmNvcHlfIS5kZWxldGUodmFsdWUpIHx8XG5cdFx0XHRcdChzdGF0ZS5kcmFmdHNfLmhhcyh2YWx1ZSlcblx0XHRcdFx0XHQ/IHN0YXRlLmNvcHlfIS5kZWxldGUoc3RhdGUuZHJhZnRzXy5nZXQodmFsdWUpKVxuXHRcdFx0XHRcdDogLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZmFsc2UpXG5cdFx0XHQpXG5cdFx0fVxuXG5cdFx0cC5jbGVhciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3Qgc3RhdGU6IFNldFN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV1cblx0XHRcdGFzc2VydFVucmV2b2tlZChzdGF0ZSlcblx0XHRcdGlmIChsYXRlc3Qoc3RhdGUpLnNpemUpIHtcblx0XHRcdFx0cHJlcGFyZVNldENvcHkoc3RhdGUpXG5cdFx0XHRcdG1hcmtDaGFuZ2VkKHN0YXRlKVxuXHRcdFx0XHRzdGF0ZS5jb3B5XyEuY2xlYXIoKVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHAudmFsdWVzID0gZnVuY3Rpb24oKTogSXRlcmFibGVJdGVyYXRvcjxhbnk+IHtcblx0XHRcdGNvbnN0IHN0YXRlOiBTZXRTdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdXG5cdFx0XHRhc3NlcnRVbnJldm9rZWQoc3RhdGUpXG5cdFx0XHRwcmVwYXJlU2V0Q29weShzdGF0ZSlcblx0XHRcdHJldHVybiBzdGF0ZS5jb3B5XyEudmFsdWVzKClcblx0XHR9XG5cblx0XHRwLmVudHJpZXMgPSBmdW5jdGlvbiBlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W2FueSwgYW55XT4ge1xuXHRcdFx0Y29uc3Qgc3RhdGU6IFNldFN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV1cblx0XHRcdGFzc2VydFVucmV2b2tlZChzdGF0ZSlcblx0XHRcdHByZXBhcmVTZXRDb3B5KHN0YXRlKVxuXHRcdFx0cmV0dXJuIHN0YXRlLmNvcHlfIS5lbnRyaWVzKClcblx0XHR9XG5cblx0XHRwLmtleXMgPSBmdW5jdGlvbigpOiBJdGVyYWJsZUl0ZXJhdG9yPGFueT4ge1xuXHRcdFx0cmV0dXJuIHRoaXMudmFsdWVzKClcblx0XHR9XG5cblx0XHRwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMudmFsdWVzKClcblx0XHR9XG5cblx0XHRwLmZvckVhY2ggPSBmdW5jdGlvbiBmb3JFYWNoKGNiOiBhbnksIHRoaXNBcmc/OiBhbnkpIHtcblx0XHRcdGNvbnN0IGl0ZXJhdG9yID0gdGhpcy52YWx1ZXMoKVxuXHRcdFx0bGV0IHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKVxuXHRcdFx0d2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuXHRcdFx0XHRjYi5jYWxsKHRoaXNBcmcsIHJlc3VsdC52YWx1ZSwgcmVzdWx0LnZhbHVlLCB0aGlzKVxuXHRcdFx0XHRyZXN1bHQgPSBpdGVyYXRvci5uZXh0KClcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gRHJhZnRTZXRcblx0fSkoU2V0KVxuXG5cdGZ1bmN0aW9uIHByb3h5U2V0XzxUIGV4dGVuZHMgQW55U2V0Pih0YXJnZXQ6IFQsIHBhcmVudD86IEltbWVyU3RhdGUpOiBUIHtcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0cmV0dXJuIG5ldyBEcmFmdFNldCh0YXJnZXQsIHBhcmVudClcblx0fVxuXG5cdGZ1bmN0aW9uIHByZXBhcmVTZXRDb3B5KHN0YXRlOiBTZXRTdGF0ZSkge1xuXHRcdGlmICghc3RhdGUuY29weV8pIHtcblx0XHRcdC8vIGNyZWF0ZSBkcmFmdHMgZm9yIGFsbCBlbnRyaWVzIHRvIHByZXNlcnZlIGluc2VydGlvbiBvcmRlclxuXHRcdFx0c3RhdGUuY29weV8gPSBuZXcgU2V0KClcblx0XHRcdHN0YXRlLmJhc2VfLmZvckVhY2godmFsdWUgPT4ge1xuXHRcdFx0XHRpZiAoaXNEcmFmdGFibGUodmFsdWUpKSB7XG5cdFx0XHRcdFx0Y29uc3QgZHJhZnQgPSBjcmVhdGVQcm94eShzdGF0ZS5zY29wZV8uaW1tZXJfLCB2YWx1ZSwgc3RhdGUpXG5cdFx0XHRcdFx0c3RhdGUuZHJhZnRzXy5zZXQodmFsdWUsIGRyYWZ0KVxuXHRcdFx0XHRcdHN0YXRlLmNvcHlfIS5hZGQoZHJhZnQpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3RhdGUuY29weV8hLmFkZCh2YWx1ZSlcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBhc3NlcnRVbnJldm9rZWQoc3RhdGU6IGFueSAvKkVTNVN0YXRlIHwgTWFwU3RhdGUgfCBTZXRTdGF0ZSovKSB7XG5cdFx0aWYgKHN0YXRlLnJldm9rZWRfKSBkaWUoMywgSlNPTi5zdHJpbmdpZnkobGF0ZXN0KHN0YXRlKSkpXG5cdH1cblxuXHRsb2FkUGx1Z2luKFwiTWFwU2V0XCIsIHtwcm94eU1hcF8sIHByb3h5U2V0X30pXG59XG4iLCAiaW1wb3J0IHtlbmFibGVFUzV9IGZyb20gXCIuL2VzNVwiXG5pbXBvcnQge2VuYWJsZU1hcFNldH0gZnJvbSBcIi4vbWFwc2V0XCJcbmltcG9ydCB7ZW5hYmxlUGF0Y2hlc30gZnJvbSBcIi4vcGF0Y2hlc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVBbGxQbHVnaW5zKCkge1xuXHRlbmFibGVFUzUoKVxuXHRlbmFibGVNYXBTZXQoKVxuXHRlbmFibGVQYXRjaGVzKClcbn1cbiIsICJpbXBvcnQge1xuXHRJUHJvZHVjZSxcblx0SVByb2R1Y2VXaXRoUGF0Y2hlcyxcblx0SW1tZXIsXG5cdERyYWZ0LFxuXHRJbW11dGFibGVcbn0gZnJvbSBcIi4vaW50ZXJuYWxcIlxuXG5leHBvcnQge1xuXHREcmFmdCxcblx0SW1tdXRhYmxlLFxuXHRQYXRjaCxcblx0UGF0Y2hMaXN0ZW5lcixcblx0b3JpZ2luYWwsXG5cdGN1cnJlbnQsXG5cdGlzRHJhZnQsXG5cdGlzRHJhZnRhYmxlLFxuXHROT1RISU5HIGFzIG5vdGhpbmcsXG5cdERSQUZUQUJMRSBhcyBpbW1lcmFibGUsXG5cdGZyZWV6ZVxufSBmcm9tIFwiLi9pbnRlcm5hbFwiXG5cbmNvbnN0IGltbWVyID0gbmV3IEltbWVyKClcblxuLyoqXG4gKiBUaGUgYHByb2R1Y2VgIGZ1bmN0aW9uIHRha2VzIGEgdmFsdWUgYW5kIGEgXCJyZWNpcGUgZnVuY3Rpb25cIiAod2hvc2VcbiAqIHJldHVybiB2YWx1ZSBvZnRlbiBkZXBlbmRzIG9uIHRoZSBiYXNlIHN0YXRlKS4gVGhlIHJlY2lwZSBmdW5jdGlvbiBpc1xuICogZnJlZSB0byBtdXRhdGUgaXRzIGZpcnN0IGFyZ3VtZW50IGhvd2V2ZXIgaXQgd2FudHMuIEFsbCBtdXRhdGlvbnMgYXJlXG4gKiBvbmx5IGV2ZXIgYXBwbGllZCB0byBhIF9fY29weV9fIG9mIHRoZSBiYXNlIHN0YXRlLlxuICpcbiAqIFBhc3Mgb25seSBhIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIFwiY3VycmllZCBwcm9kdWNlclwiIHdoaWNoIHJlbGlldmVzIHlvdVxuICogZnJvbSBwYXNzaW5nIHRoZSByZWNpcGUgZnVuY3Rpb24gZXZlcnkgdGltZS5cbiAqXG4gKiBPbmx5IHBsYWluIG9iamVjdHMgYW5kIGFycmF5cyBhcmUgbWFkZSBtdXRhYmxlLiBBbGwgb3RoZXIgb2JqZWN0cyBhcmVcbiAqIGNvbnNpZGVyZWQgdW5jb3B5YWJsZS5cbiAqXG4gKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIF9fYm91bmRfXyB0byBpdHMgYEltbWVyYCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gYmFzZSAtIHRoZSBpbml0aWFsIHN0YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcm9kdWNlciAtIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSBwcm94eSBvZiB0aGUgYmFzZSBzdGF0ZSBhcyBmaXJzdCBhcmd1bWVudCBhbmQgd2hpY2ggY2FuIGJlIGZyZWVseSBtb2RpZmllZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcGF0Y2hMaXN0ZW5lciAtIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBhbGwgdGhlIHBhdGNoZXMgcHJvZHVjZWQgaGVyZVxuICogQHJldHVybnMge2FueX0gYSBuZXcgc3RhdGUsIG9yIHRoZSBpbml0aWFsIHN0YXRlIGlmIG5vdGhpbmcgd2FzIG1vZGlmaWVkXG4gKi9cbmV4cG9ydCBjb25zdCBwcm9kdWNlOiBJUHJvZHVjZSA9IGltbWVyLnByb2R1Y2VcbmV4cG9ydCBkZWZhdWx0IHByb2R1Y2VcblxuLyoqXG4gKiBMaWtlIGBwcm9kdWNlYCwgYnV0IGBwcm9kdWNlV2l0aFBhdGNoZXNgIGFsd2F5cyByZXR1cm5zIGEgdHVwbGVcbiAqIFtuZXh0U3RhdGUsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzXSAoaW5zdGVhZCBvZiBqdXN0IHRoZSBuZXh0IHN0YXRlKVxuICovXG5leHBvcnQgY29uc3QgcHJvZHVjZVdpdGhQYXRjaGVzOiBJUHJvZHVjZVdpdGhQYXRjaGVzID0gaW1tZXIucHJvZHVjZVdpdGhQYXRjaGVzLmJpbmQoXG5cdGltbWVyXG4pXG5cbi8qKlxuICogUGFzcyB0cnVlIHRvIGF1dG9tYXRpY2FsbHkgZnJlZXplIGFsbCBjb3BpZXMgY3JlYXRlZCBieSBJbW1lci5cbiAqXG4gKiBBbHdheXMgZnJlZXplIGJ5IGRlZmF1bHQsIGV2ZW4gaW4gcHJvZHVjdGlvbiBtb2RlXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRBdXRvRnJlZXplID0gaW1tZXIuc2V0QXV0b0ZyZWV6ZS5iaW5kKGltbWVyKVxuXG4vKipcbiAqIFBhc3MgdHJ1ZSB0byB1c2UgdGhlIEVTMjAxNSBgUHJveHlgIGNsYXNzIHdoZW4gY3JlYXRpbmcgZHJhZnRzLCB3aGljaCBpc1xuICogYWx3YXlzIGZhc3RlciB0aGFuIHVzaW5nIEVTNSBwcm94aWVzLlxuICpcbiAqIEJ5IGRlZmF1bHQsIGZlYXR1cmUgZGV0ZWN0aW9uIGlzIHVzZWQsIHNvIGNhbGxpbmcgdGhpcyBpcyByYXJlbHkgbmVjZXNzYXJ5LlxuICovXG5leHBvcnQgY29uc3Qgc2V0VXNlUHJveGllcyA9IGltbWVyLnNldFVzZVByb3hpZXMuYmluZChpbW1lcilcblxuLyoqXG4gKiBBcHBseSBhbiBhcnJheSBvZiBJbW1lciBwYXRjaGVzIHRvIHRoZSBmaXJzdCBhcmd1bWVudC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGEgcHJvZHVjZXIsIHdoaWNoIG1lYW5zIGNvcHktb24td3JpdGUgaXMgaW4gZWZmZWN0LlxuICovXG5leHBvcnQgY29uc3QgYXBwbHlQYXRjaGVzID0gaW1tZXIuYXBwbHlQYXRjaGVzLmJpbmQoaW1tZXIpXG5cbi8qKlxuICogQ3JlYXRlIGFuIEltbWVyIGRyYWZ0IGZyb20gdGhlIGdpdmVuIGJhc2Ugc3RhdGUsIHdoaWNoIG1heSBiZSBhIGRyYWZ0IGl0c2VsZi5cbiAqIFRoZSBkcmFmdCBjYW4gYmUgbW9kaWZpZWQgdW50aWwgeW91IGZpbmFsaXplIGl0IHdpdGggdGhlIGBmaW5pc2hEcmFmdGAgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVEcmFmdCA9IGltbWVyLmNyZWF0ZURyYWZ0LmJpbmQoaW1tZXIpXG5cbi8qKlxuICogRmluYWxpemUgYW4gSW1tZXIgZHJhZnQgZnJvbSBhIGBjcmVhdGVEcmFmdGAgY2FsbCwgcmV0dXJuaW5nIHRoZSBiYXNlIHN0YXRlXG4gKiAoaWYgbm8gY2hhbmdlcyB3ZXJlIG1hZGUpIG9yIGEgbW9kaWZpZWQgY29weS4gVGhlIGRyYWZ0IG11c3QgKm5vdCogYmVcbiAqIG11dGF0ZWQgYWZ0ZXJ3YXJkcy5cbiAqXG4gKiBQYXNzIGEgZnVuY3Rpb24gYXMgdGhlIDJuZCBhcmd1bWVudCB0byBnZW5lcmF0ZSBJbW1lciBwYXRjaGVzIGJhc2VkIG9uIHRoZVxuICogY2hhbmdlcyB0aGF0IHdlcmUgbWFkZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGZpbmlzaERyYWZ0ID0gaW1tZXIuZmluaXNoRHJhZnQuYmluZChpbW1lcilcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGEgbm8tb3AsIGJ1dCBjYW4gYmUgdXNlZCB0byBjYXN0IGFuIGltbXV0YWJsZSB0eXBlXG4gKiB0byBhbiBkcmFmdCB0eXBlIGFuZCBtYWtlIFR5cGVTY3JpcHQgaGFwcHlcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhc3REcmFmdDxUPih2YWx1ZTogVCk6IERyYWZ0PFQ+IHtcblx0cmV0dXJuIHZhbHVlIGFzIGFueVxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgYSBuby1vcCwgYnV0IGNhbiBiZSB1c2VkIHRvIGNhc3QgYSBtdXRhYmxlIHR5cGVcbiAqIHRvIGFuIGltbXV0YWJsZSB0eXBlIGFuZCBtYWtlIFR5cGVTY3JpcHQgaGFwcHlcbiAqIEBwYXJhbSB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FzdEltbXV0YWJsZTxUPih2YWx1ZTogVCk6IEltbXV0YWJsZTxUPiB7XG5cdHJldHVybiB2YWx1ZSBhcyBhbnlcbn1cblxuZXhwb3J0IHtJbW1lcn1cblxuZXhwb3J0IHtlbmFibGVFUzV9IGZyb20gXCIuL3BsdWdpbnMvZXM1XCJcbmV4cG9ydCB7ZW5hYmxlUGF0Y2hlc30gZnJvbSBcIi4vcGx1Z2lucy9wYXRjaGVzXCJcbmV4cG9ydCB7ZW5hYmxlTWFwU2V0fSBmcm9tIFwiLi9wbHVnaW5zL21hcHNldFwiXG5leHBvcnQge2VuYWJsZUFsbFBsdWdpbnN9IGZyb20gXCIuL3BsdWdpbnMvYWxsXCJcbiIsICIvLyBTaG91bGQgYmUgbm8gaW1wb3J0cyBoZXJlIVxuXG4vLyBTb21lIHRoaW5ncyB0aGF0IHNob3VsZCBiZSBldmFsdWF0ZWQgYmVmb3JlIGFsbCBlbHNlLi4uXG5cbi8vIFdlIG9ubHkgd2FudCB0byBrbm93IGlmIG5vbi1wb2x5ZmlsbGVkIHN5bWJvbHMgYXJlIGF2YWlsYWJsZVxuY29uc3QgaGFzU3ltYm9sID1cblx0dHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgU3ltYm9sKFwieFwiKSA9PT0gXCJzeW1ib2xcIlxuZXhwb3J0IGNvbnN0IGhhc01hcCA9IHR5cGVvZiBNYXAgIT09IFwidW5kZWZpbmVkXCJcbmV4cG9ydCBjb25zdCBoYXNTZXQgPSB0eXBlb2YgU2V0ICE9PSBcInVuZGVmaW5lZFwiXG5leHBvcnQgY29uc3QgaGFzUHJveGllcyA9XG5cdHR5cGVvZiBQcm94eSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHR0eXBlb2YgUHJveHkucmV2b2NhYmxlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdHR5cGVvZiBSZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiXG5cbi8qKlxuICogVGhlIHNlbnRpbmVsIHZhbHVlIHJldHVybmVkIGJ5IHByb2R1Y2VycyB0byByZXBsYWNlIHRoZSBkcmFmdCB3aXRoIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE5PVEhJTkc6IE5vdGhpbmcgPSBoYXNTeW1ib2xcblx0PyBTeW1ib2wuZm9yKFwiaW1tZXItbm90aGluZ1wiKVxuXHQ6ICh7W1wiaW1tZXItbm90aGluZ1wiXTogdHJ1ZX0gYXMgYW55KVxuXG4vKipcbiAqIFRvIGxldCBJbW1lciB0cmVhdCB5b3VyIGNsYXNzIGluc3RhbmNlcyBhcyBwbGFpbiBpbW11dGFibGUgb2JqZWN0c1xuICogKGFsYmVpdCB3aXRoIGEgY3VzdG9tIHByb3RvdHlwZSksIHlvdSBtdXN0IGRlZmluZSBlaXRoZXIgYW4gaW5zdGFuY2UgcHJvcGVydHlcbiAqIG9yIGEgc3RhdGljIHByb3BlcnR5IG9uIGVhY2ggb2YgeW91ciBjdXN0b20gY2xhc3Nlcy5cbiAqXG4gKiBPdGhlcndpc2UsIHlvdXIgY2xhc3MgaW5zdGFuY2Ugd2lsbCBuZXZlciBiZSBkcmFmdGVkLCB3aGljaCBtZWFucyBpdCB3b24ndCBiZVxuICogc2FmZSB0byBtdXRhdGUgaW4gYSBwcm9kdWNlIGNhbGxiYWNrLlxuICovXG5leHBvcnQgY29uc3QgRFJBRlRBQkxFOiB1bmlxdWUgc3ltYm9sID0gaGFzU3ltYm9sXG5cdD8gU3ltYm9sLmZvcihcImltbWVyLWRyYWZ0YWJsZVwiKVxuXHQ6IChcIl9fJGltbWVyX2RyYWZ0YWJsZVwiIGFzIGFueSlcblxuZXhwb3J0IGNvbnN0IERSQUZUX1NUQVRFOiB1bmlxdWUgc3ltYm9sID0gaGFzU3ltYm9sXG5cdD8gU3ltYm9sLmZvcihcImltbWVyLXN0YXRlXCIpXG5cdDogKFwiX18kaW1tZXJfc3RhdGVcIiBhcyBhbnkpXG5cbi8vIEV2ZW4gYSBwb2x5ZmlsbGVkIFN5bWJvbCBtaWdodCBwcm92aWRlIFN5bWJvbC5pdGVyYXRvclxuZXhwb3J0IGNvbnN0IGl0ZXJhdG9yU3ltYm9sOiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID1cblx0KHR5cGVvZiBTeW1ib2wgIT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wuaXRlcmF0b3IpIHx8IChcIkBAaXRlcmF0b3JcIiBhcyBhbnkpXG5cbi8qKiBVc2UgYSBjbGFzcyB0eXBlIGZvciBgbm90aGluZ2Agc28gaXRzIHR5cGUgaXMgdW5pcXVlICovXG5leHBvcnQgY2xhc3MgTm90aGluZyB7XG5cdC8vIFRoaXMgbGV0cyB1cyBkbyBgRXhjbHVkZTxULCBOb3RoaW5nPmBcblx0Ly8gQHRzLWlnbm9yZVxuXHRwcml2YXRlIF8hOiB1bmlxdWUgc3ltYm9sXG59XG4iLCAiaW1wb3J0IFwiLi9pY29uLW1hbmFnZXIubGVzc1wiO1xuXG5pbXBvcnQgeyBlbmFibGVNYXBTZXQgfSBmcm9tIFwiaW1tZXJcIjtcbmltcG9ydCB7IE1vZGFsLCBzZXRJY29uIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgUmVhY3QsIHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ29udGV4dCxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3RET00gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgdXNlSW1tZXIgfSBmcm9tIFwidXNlLWltbWVyXCI7XG5cbmltcG9ydCBQYWNrTWFuYWdlciBmcm9tIFwiLi4vaWNvbi1wYWNrcy9wYWNrLW1hbmFnZXJcIjtcbmltcG9ydCB7IEZpbGVJY29uSW5mbywgSWNvbkluZm8gfSBmcm9tIFwiLi4vaWNvbi1wYWNrcy90eXBlc1wiO1xuaW1wb3J0IEljb25TQyBmcm9tIFwiLi4vaXNjLW1haW5cIjtcbmltcG9ydCBJY29uUHJldmlldyBmcm9tIFwiLi9pY29uLXByZXZpZXdcIjtcblxuZW5hYmxlTWFwU2V0KCk7XG5cbnR5cGUgaWNvbnMgPSBSZWNvcmQ8XCJ0cmFzaFwiIHwgXCJwZW5jaWxcIiB8IFwic3RhclwiIHwgXCJjaGVja21hcmtcIiwgc3RyaW5nPjtcbmNvbnN0IGdldEljb25zID0gKCk6IGljb25zID0+IHtcbiAgY29uc3QgdGVtcEVsID0gY3JlYXRlRGl2KCksXG4gICAgcmV0dXJuczogUGFydGlhbDxpY29ucz4gPSB7fTtcbiAgZm9yIChjb25zdCBpY29uIG9mIFtcInRyYXNoXCIsIFwicGVuY2lsXCIsIFwic3RhclwiLCBcImNoZWNrbWFya1wiXSBhcyBjb25zdCkge1xuICAgIHRlbXBFbC5lbXB0eSgpO1xuICAgIHNldEljb24odGVtcEVsLCBpY29uLCAxNCk7XG4gICAgcmV0dXJuc1tpY29uXSA9IHRlbXBFbC5pbm5lckhUTUw7XG4gIH1cbiAgcmV0dXJuIHJldHVybnMgYXMgaWNvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8eyBwYWNrczogUGFja01hbmFnZXI7IGljb25zOiBpY29ucyB9PihcbiAgbnVsbCBhcyBhbnksXG4pO1xuXG5jb25zdCBBTExfVVBEQVRFX0tFWSA9IFwiJUFMTCVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSWNvbk1hbmFnZXIgZXh0ZW5kcyBNb2RhbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwbHVnaW46IEljb25TQywgcHVibGljIHBhY2s6IHN0cmluZykge1xuICAgIHN1cGVyKHBsdWdpbi5hcHApO1xuICAgIHRoaXMudGl0bGVFbC5zZXRUZXh0KGAke3BhY2t9IEljb25zYCk7XG4gICAgdGhpcy5tb2RhbEVsLmFkZENsYXNzZXMoW1wiaXNjLWljb24tbWFuYWdlclwiLCBcIm1vZC1jb21tdW5pdHktdGhlbWVcIl0pO1xuICB9XG5cbiAgYXN5bmMgb25PcGVuKCkge1xuICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XG4gICAgUmVhY3RET00ucmVuZGVyKFxuICAgICAgPENvbnRleHQuUHJvdmlkZXJcbiAgICAgICAgdmFsdWU9e3sgcGFja3M6IHRoaXMucGx1Z2luLnBhY2tNYW5hZ2VyLCBpY29uczogZ2V0SWNvbnMoKSB9fVxuICAgICAgPlxuICAgICAgICA8SWNvbnMgcGFjaz17dGhpcy5wYWNrfSAvPlxuICAgICAgPC9Db250ZXh0LlByb3ZpZGVyPixcbiAgICAgIHRoaXMuY29udGVudEVsLFxuICAgICk7XG4gIH1cbiAgb25DbG9zZSgpIHtcbiAgICBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKHRoaXMuY29udGVudEVsKTtcbiAgfVxufVxuY29uc3QgY29tcGFyZUljb25JZCA9IChhOiBJY29uSW5mbywgYjogSWNvbkluZm8pOiBudW1iZXIgPT5cbiAgYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbmNvbnN0IEljb25zID0gKHsgcGFjayB9OiB7IHBhY2s6IHN0cmluZyB9KSA9PiB7XG4gIGlmIChwYWNrID09PSBcImVtb2ppXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFbW9qaSBub3Qgc3VwcG9ydGVkXCIpO1xuXG4gIGNvbnN0IHsgcGFja3MgfSA9IHVzZUNvbnRleHQoQ29udGV4dCk7XG4gIGNvbnN0IFtmaWx0ZXIsIHNldEZpbHRlcl0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW2FmZmVjdGVkLCBzZXRBZmZlY3RlZF0gPSB1c2VJbW1lcihuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpKTtcbiAgY29uc3QgaWRzID0gdXNlTWVtbyhcbiAgICAoKSA9PiB7XG4gICAgICBsZXQgYXJyID0gcGFja3NcbiAgICAgICAgLnNlYXJjaChmaWx0ZXIgPyBmaWx0ZXIudHJpbSgpLnNwbGl0KFwiIFwiKSA6IFtdLCBbcGFja10sIEluZmluaXR5KVxuICAgICAgICAvLyBhZGQgYW4gdXBkYXRlZCBwcm9wZXJ0eSB0byBmb3JjZSBhbiBpY29uIHVwZGF0ZSBpbnRlcm5hbGx5XG4gICAgICAgIC5tYXAoKHsgaXRlbSB9KSA9PiBpdGVtIGFzIEZpbGVJY29uSW5mbyk7XG4gICAgICBpZiAoIWZpbHRlcikgYXJyLnNvcnQoY29tcGFyZUljb25JZCk7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICAgIFtmaWx0ZXIsIHBhY2ssIGFmZmVjdGVkXSxcbiAgKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBldmVudFJlZiA9IHBhY2tzLm9uKFwiY2hhbmdlZFwiLCAoX2FwaSwgYWZmZWN0ZWQpID0+XG4gICAgICBzZXRBZmZlY3RlZCgoZHJhZnQpID0+IHtcbiAgICAgICAgaWYgKGFmZmVjdGVkKVxuICAgICAgICAgIGFmZmVjdGVkLmZvckVhY2goKGlkOiBzdHJpbmcpID0+XG4gICAgICAgICAgICBkcmFmdC5zZXQoaWQsIChkcmFmdC5nZXQoaWQpIHx8IDApICsgMSksXG4gICAgICAgICAgKTtcbiAgICAgICAgZWxzZSBkcmFmdC5zZXQoQUxMX1VQREFURV9LRVksIChkcmFmdC5nZXQoQUxMX1VQREFURV9LRVkpIHx8IDApICsgMSk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiAoKSA9PiBwYWNrcy5vZmZyZWYoZXZlbnRSZWYpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW3BhY2tzXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmaWx0ZXJcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyXCJcbiAgICAgICAgICB2YWx1ZT17ZmlsdGVyfVxuICAgICAgICAgIG9uQ2hhbmdlPXsoZXZ0KSA9PiBzZXRGaWx0ZXIoZXZ0LnRhcmdldC52YWx1ZSl9XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaWNvbnNcIj5cbiAgICAgICAge2lkcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkID1cbiAgICAgICAgICAgIChhZmZlY3RlZC5nZXQoaXRlbS5pZCkgPz8gMCkgKyAoYWZmZWN0ZWQuZ2V0KEFMTF9VUERBVEVfS0VZKSA/PyAwKTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEljb25QcmV2aWV3XG4gICAgICAgICAgICAgIGljb25JbmZvPXtpdGVtfVxuICAgICAgICAgICAgICB1cGRhdGVkPXt1cGRhdGVkfVxuICAgICAgICAgICAgICBrZXk9e2l0ZW0uaWQgKyB1cGRhdGVkfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApO1xuICAgICAgICB9KX1cbiAgICAgIDwvZGl2PlxuICAgIDwvPlxuICApO1xufTtcbiIsICJpbXBvcnQgcHJvZHVjZSwgeyBEcmFmdCwgbm90aGluZywgZnJlZXplIH0gZnJvbSBcImltbWVyXCI7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlUmVkdWNlciwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8sIERpc3BhdGNoIH0gZnJvbSBcInJlYWN0XCI7XG5cbmV4cG9ydCB0eXBlIFJlZHVjZXI8UyA9IGFueSwgQSA9IGFueT4gPSAoXG4gIGRyYWZ0U3RhdGU6IERyYWZ0PFM+LFxuICBhY3Rpb246IEFcbikgPT4gdm9pZCB8IChTIGV4dGVuZHMgdW5kZWZpbmVkID8gdHlwZW9mIG5vdGhpbmcgOiBTKTtcbmV4cG9ydCB0eXBlIERyYWZ0RnVuY3Rpb248Uz4gPSAoZHJhZnQ6IERyYWZ0PFM+KSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgVXBkYXRlcjxTPiA9IChhcmc6IFMgfCBEcmFmdEZ1bmN0aW9uPFM+KSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgSW1tZXJIb29rPFM+ID0gW1MsIFVwZGF0ZXI8Uz5dO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUltbWVyPFMgPSBhbnk+KGluaXRpYWxWYWx1ZTogUyB8ICgoKSA9PiBTKSk6IEltbWVySG9vazxTPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUltbWVyKGluaXRpYWxWYWx1ZTogYW55KSB7XG4gIGNvbnN0IFt2YWwsIHVwZGF0ZVZhbHVlXSA9IHVzZVN0YXRlKCgpID0+XG4gICAgZnJlZXplKFxuICAgICAgdHlwZW9mIGluaXRpYWxWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gaW5pdGlhbFZhbHVlKCkgOiBpbml0aWFsVmFsdWUsXG4gICAgICB0cnVlXG4gICAgKVxuICApO1xuICByZXR1cm4gW1xuICAgIHZhbCxcbiAgICB1c2VDYWxsYmFjaygodXBkYXRlcikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB1cGRhdGVyID09PSBcImZ1bmN0aW9uXCIpIHVwZGF0ZVZhbHVlKHByb2R1Y2UodXBkYXRlcikpO1xuICAgICAgZWxzZSB1cGRhdGVWYWx1ZShmcmVlemUodXBkYXRlcikpO1xuICAgIH0sIFtdKSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUltbWVyUmVkdWNlcjxTID0gYW55LCBBID0gYW55PihcbiAgcmVkdWNlcjogUmVkdWNlcjxTLCBBPixcbiAgaW5pdGlhbFN0YXRlOiBTLFxuICBpbml0aWFsQWN0aW9uPzogKGluaXRpYWw6IGFueSkgPT4gU1xuKTogW1MsIERpc3BhdGNoPEE+XTtcbmV4cG9ydCBmdW5jdGlvbiB1c2VJbW1lclJlZHVjZXIoXG4gIHJlZHVjZXI6IGFueSxcbiAgaW5pdGlhbFN0YXRlOiBhbnksXG4gIGluaXRpYWxBY3Rpb246IGFueVxuKSB7XG4gIGNvbnN0IGNhY2hlZFJlZHVjZXIgPSB1c2VNZW1vKCgpID0+IHByb2R1Y2UocmVkdWNlciksIFtyZWR1Y2VyXSk7XG4gIHJldHVybiB1c2VSZWR1Y2VyKGNhY2hlZFJlZHVjZXIsIGluaXRpYWxTdGF0ZSBhcyBhbnksIGluaXRpYWxBY3Rpb24pO1xufVxuIiwgImltcG9ydCBcIi4uL2ludmFsaWQubGVzc1wiO1xuXG5pbXBvcnQgY2xzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5pbXBvcnQgeyBOb3RpY2UgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCBSZWFjdCwge1xuICBIVE1MQXR0cmlidXRlcyxcbiAgVGV4dGFyZWFIVE1MQXR0cmlidXRlcyxcbiAgdXNlQ29udGV4dCxcbiAgdXNlTWVtbyxcbiAgdXNlU3RhdGUsXG59IGZyb20gXCJyZWFjdFwiO1xuXG5pbXBvcnQgeyBGaWxlSWNvbkluZm8gfSBmcm9tIFwiLi4vaWNvbi1wYWNrcy90eXBlc1wiO1xuaW1wb3J0IHsgc2FuaXRpemVOYW1lIH0gZnJvbSBcIi4uL2ljb24tcGFja3MvdXRpbHNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi9pY29uLW1hbmFnZXJcIjtcblxuaW50ZXJmYWNlIEljb25QcmV2aWV3UHJvcHMge1xuICBpY29uSW5mbzogRmlsZUljb25JbmZvO1xuICB1cGRhdGVkOiBudW1iZXI7XG59XG5cbmNvbnN0IEljb25QcmV2aWV3ID0gKHsgaWNvbkluZm8sIHVwZGF0ZWQgfTogSWNvblByZXZpZXdQcm9wcykgPT4ge1xuICBjb25zdCB7IHBhY2tzLCBpY29ucyB9ID0gdXNlQ29udGV4dChDb250ZXh0KSxcbiAgICB7IHRyYXNoLCBwZW5jaWwsIHN0YXIsIGNoZWNrbWFyayB9ID0gaWNvbnM7XG5cbiAgY29uc3QgW2lucHV0LCBzZXRJbnB1dF0gPSB1c2VTdGF0ZShpY29uSW5mby5uYW1lLnJlcGxhY2UoL1stX10vZywgXCIgXCIpKSxcbiAgICBbaXNFZGl0aW5nLCBzZXRJc0VkaXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIGNvbnN0IGlucHV0SWQgPSBgJHtpY29uSW5mby5wYWNrfV8ke3Nhbml0aXplTmFtZShpbnB1dCl9YCxcbiAgICBpc0lucHV0VmFpbGQgPSBpbnB1dElkID09PSBpY29uSW5mby5pZCB8fCAhcGFja3MuaGFzSWNvbihpbnB1dElkKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIGNvbnN0IGljb25TcmMgPSB1c2VNZW1vKFxuICAgICgpID0+IHBhY2tzLmdldEljb24oaWNvbkluZm8uaWQsIHRydWUpLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbaWNvbkluZm8uaWQsIHVwZGF0ZWRdLFxuICApO1xuICBjb25zdCByZW5hbWVJY29uID0gYXN5bmMgKHJlbmFtZVRvOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBuZXdOYW1lID0gYXdhaXQgcGFja3MucmVuYW1lKGljb25JbmZvLmlkLCByZW5hbWVUbyk7XG4gICAgaWYgKCFuZXdOYW1lKVxuICAgICAgbmV3IE5vdGljZShgRmFpbGVkIHRvIHJlbmFtZSB0byAke2lucHV0fSwgY2hlY2sgbG9nIGZvciBkZXRhaWxzYCk7XG4gICAgZWxzZSB7XG4gICAgICBuZXcgTm90aWNlKGBUaGUgaWNvbiBpcyByZW5hbWVkIHRvICR7bmV3TmFtZX1gKTtcbiAgICAgIHNldElzRWRpdGluZyhmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJpdGVtXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImljb25cIj5cbiAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpc2MtaWNvblwiIHNyYz17aWNvblNyYyA/PyB1bmRlZmluZWR9IC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibmFtZVwiPlxuICAgICAgICB7aXNFZGl0aW5nID8gKFxuICAgICAgICAgIDxUZXh0XG4gICAgICAgICAgICBjbGFzc05hbWU9e2Nscyh7IGludmFsaWQ6ICFpc0lucHV0VmFpbGQgfSl9XG4gICAgICAgICAgICBvbkNoYW5nZT17KGV2dCkgPT4gc2V0SW5wdXQoZXZ0LnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICB2YWx1ZT17aW5wdXR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8c3Bhbj57aW5wdXR9PC9zcGFuPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ1dHRvbnNcIj5cbiAgICAgICAgPE9iQnV0dG9uXG4gICAgICAgICAgYnRuVHlwZT1cImN0YVwiXG4gICAgICAgICAgaWNvbj17c3Rhcn1cbiAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbmV3TmFtZTtcbiAgICAgICAgICAgIGlmICgobmV3TmFtZSA9IGF3YWl0IHBhY2tzLnN0YXIoaWNvbkluZm8uaWQpKSkge1xuICAgICAgICAgICAgICBuZXcgTm90aWNlKGAke2ljb25JbmZvLmlkfSBpcyBub3cgJHtuZXdOYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICAgIDxPYkJ1dHRvblxuICAgICAgICAgIGJ0blR5cGU9XCJjdGFcIlxuICAgICAgICAgIGljb249e2lzRWRpdGluZyA/IGNoZWNrbWFyayA6IHBlbmNpbH1cbiAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNFZGl0aW5nKSB7XG4gICAgICAgICAgICAgIGlmIChpc0lucHV0VmFpbGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXRJZCAhPT0gaWNvbkluZm8uaWQpIHtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHJlbmFtZUljb24oaW5wdXRJZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHNldElzRWRpdGluZyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoYFVuYWJsZSB0byByZW5hbWUgdG8gJHtpbnB1dH0sIGdpdmVuIGlkIGludmFsaWRgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2V0SXNFZGl0aW5nKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICAgIDxPYkJ1dHRvblxuICAgICAgICAgIGJ0blR5cGU9XCJ3YXJuaW5nXCJcbiAgICAgICAgICBpY29uPXt0cmFzaH1cbiAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXdhaXQgcGFja3MuZGVsZXRlKGljb25JbmZvLmlkKSkge1xuICAgICAgICAgICAgICBuZXcgTm90aWNlKGAke2ljb25JbmZvLmlkfSBpcyByZW1vdmVkIGZyb20gdGhlIHBhY2tgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBJY29uUHJldmlldztcblxuY29uc3QgT2JCdXR0b24gPSAoXG4gIHByb3BzOiBIVE1MQXR0cmlidXRlczxIVE1MQnV0dG9uRWxlbWVudD4gJiB7XG4gICAgYnRuVHlwZT86IFwid2FybmluZ1wiIHwgXCJjdGFcIjtcbiAgICBpbnZhbGlkPzogYm9vbGVhbjtcbiAgICBpY29uOiBzdHJpbmc7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgeyBidG5UeXBlLCBpY29uLCAuLi5yZXN0IH0gPSBwcm9wcztcbiAgcmV0dXJuIChcbiAgICA8YnV0dG9uXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGNsYXNzTmFtZT17Y2xzKHsgW1wibW9kLVwiICsgYnRuVHlwZV06ICEhYnRuVHlwZSB9KX1cbiAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogaWNvbiB9fVxuICAgIC8+XG4gICk7XG59O1xuXG5jb25zdCBUZXh0ID0gKFxuICBwcm9wczogUGljazxcbiAgICBUZXh0YXJlYUhUTUxBdHRyaWJ1dGVzPEhUTUxUZXh0QXJlYUVsZW1lbnQ+LFxuICAgIFwib25DaGFuZ2VcIiB8IFwidmFsdWVcIiB8IFwiY2xhc3NOYW1lXCJcbiAgPixcbikgPT4gPHRleHRhcmVhIHNwZWxsQ2hlY2s9XCJmYWxzZVwiIHJvd3M9ezJ9IHsuLi5wcm9wc30gLz47XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OzswMHRJQUFBLG1CQVdBLEdBQU8sUUFBVSxPQ1hqQixnQ0EwQkEsWUFBb0IsRUFBTSxDQUN4QixHQUFJLE1BQU8sSUFBUyxTQUNsQixLQUFNLElBQUksV0FBVSxtQ0FBcUMsS0FBSyxVQUFVLENBQUksQ0FBQyxDQUVqRixDQUdBLFlBQThCLEVBQU0sRUFBZ0IsQ0FNbEQsT0FMSSxHQUFNLEdBQ04sRUFBb0IsRUFDcEIsRUFBWSxHQUNaLEVBQU8sRUFDUCxFQUNLLEVBQUksRUFBRyxHQUFLLEVBQUssT0FBUSxFQUFFLEVBQUcsQ0FDckMsR0FBSSxFQUFJLEVBQUssT0FDWCxFQUFPLEVBQUssV0FBVyxDQUFDLE1BQ3JCLElBQUksSUFBUyxHQUNoQixNQUVBLEVBQU8sR0FDVCxHQUFJLElBQVMsR0FBVSxDQUNyQixHQUFJLE1BQWMsRUFBSSxHQUFLLElBQVMsR0FFN0IsR0FBSSxJQUFjLEVBQUksR0FBSyxJQUFTLEVBQUcsQ0FDNUMsR0FBSSxFQUFJLE9BQVMsR0FBSyxJQUFzQixHQUFLLEVBQUksV0FBVyxFQUFJLE9BQVMsQ0FBQyxJQUFNLElBQVksRUFBSSxXQUFXLEVBQUksT0FBUyxDQUFDLElBQU0sSUFDakksR0FBSSxFQUFJLE9BQVMsRUFBRyxDQUNsQixHQUFJLEdBQWlCLEVBQUksWUFBWSxHQUFHLEVBQ3hDLEdBQUksSUFBbUIsRUFBSSxPQUFTLEVBQUcsQ0FDckMsQUFBSSxJQUFtQixHQUNyQixHQUFNLEdBQ04sRUFBb0IsR0FFcEIsR0FBTSxFQUFJLE1BQU0sRUFBRyxDQUFjLEVBQ2pDLEVBQW9CLEVBQUksT0FBUyxFQUFJLEVBQUksWUFBWSxHQUFHLEdBRTFELEVBQVksRUFDWixFQUFPLEVBQ1AsUUFDRixDQUNGLFNBQVcsRUFBSSxTQUFXLEdBQUssRUFBSSxTQUFXLEVBQUcsQ0FDL0MsRUFBTSxHQUNOLEVBQW9CLEVBQ3BC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RUFBRSxFQUFFLE1BQU8sRUFBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUksR0FBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsb0VBQW9FLEVBQUUsT0FBTyxTQUFTLEVBQUUsQ0FBQyxPQUFRLEdBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEFBQVcsRUFBRSxVQUFVLENBQUMsSUFBeEIsU0FBMEIsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFHLEdBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBSSxHQUFFLEVBQUUsV0FBVyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxXQUFXLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFdBQVcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRyxHQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUcsSUFBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxNQUFPLEdBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sU0FBUyxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsTUFBTSxJQUFJLEVBQUUsS0FBTSxJQUFJLE9BQU0saURBQWlELEVBQUUsR0FBSSxHQUFFLEVBQUUsRUFBRyxHQUFFLEVBQUUsUUFBUSxzQkFBc0IsRUFBRSxHQUFHLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBTSxJQUFJLE9BQU0sMkNBQTJDLEVBQUUsSUFBSSxFQUFFLEVBQUUsV0FBVyxHQUFJLFlBQVcsRUFBRSxDQUFDLEVBQUUsR0FBSSxPQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxHQUFHLENBQUMsR0FBRyxFQUFHLEdBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUcsSUFBRyxJQUFJLEVBQUcsR0FBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRyxHQUFFLElBQUksRUFBRyxHQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQUFBSyxJQUFMLElBQVMsR0FBRSxLQUFLLEdBQUcsQUFBSyxJQUFMLElBQVMsR0FBRSxLQUFLLEdBQUcsTUFBTyxFQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFJLEdBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLHFCQUFxQixFQUFFLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxFQUFFLEVBQUUsMEJBQTBCLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssWUFBWSxFQUFFLEtBQUssa0JBQWtCLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxpQkFBaUIsVUFBVSxDQUFDLEdBQUksR0FBRSxHQUFJLEdBQUUsRUFBRSxRQUFRLFFBQVEsS0FBSyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssS0FBSyxZQUFZLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxHQUFJLEdBQUUsYUFBYSxDQUFDLEVBQUUsRUFBRSxLQUFLLE1BQU8sR0FBRSxHQUFHLE1BQU0sVUFBVSxDQUFDLEdBQUcsS0FBSyxXQUFXLGNBQWMsRUFBRSxpQkFBaUIsS0FBTSxJQUFJLE9BQU0sdUNBQXVDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxvQkFBb0IsVUFBVSxDQUFDLE1BQU8sSUFBSSxHQUFFLEVBQUUsUUFBUSxRQUFRLEtBQUssaUJBQWlCLENBQUMsRUFBRSxlQUFlLGlCQUFpQixLQUFLLGNBQWMsRUFBRSxlQUFlLG1CQUFtQixLQUFLLGdCQUFnQixFQUFFLGVBQWUsUUFBUSxLQUFLLEtBQUssRUFBRSxlQUFlLGNBQWMsS0FBSyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFPLEdBQUUsS0FBSyxHQUFJLEVBQUMsRUFBRSxLQUFLLEdBQUksR0FBRSxrQkFBa0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBSSxHQUFFLGdCQUFnQixDQUFDLEVBQUUsZUFBZSxjQUFjLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsc0JBQXNCLEdBQUcsMkJBQTJCLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFJLEdBQUUsRUFBRSx3QkFBd0IsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLE9BQU8sZUFBZSxTQUFTLEVBQUUsQ0FBQyxNQUFPLElBQUksR0FBRSxtQkFBbUIsQ0FBQyxFQUFFLGlCQUFpQixVQUFVLENBQUMsTUFBTyxJQUFJLEdBQUUscUJBQXFCLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLHlCQUF5QixFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBSSxHQUFFLEVBQUUsU0FBUyxFQUFNLEVBQUUsVUFBVSxDQUFDLE9BQVEsR0FBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsT0FBUSxHQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsTUFBTyxFQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFPLEFBQVMsS0FBVCxRQUFZLEVBQUUsT0FBTyxBQUFXLEVBQUUsVUFBVSxDQUFDLElBQXhCLFNBQTBCLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxPQUFRLEdBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUssR0FBRSxFQUFFLEtBQUssTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxPQUFRLEdBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUssR0FBRSxFQUFFLFdBQVcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsT0FBTyxHQUFHLEVBQUUsT0FBTyxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsY0FBYyxHQUFHLEVBQUUsS0FBSyxLQUFLLEVBQUUsWUFBWSxLQUFLLEVBQUUsbUJBQW1CLEtBQUssRUFBRSxRQUFRLEtBQUssRUFBRSxnQkFBZ0IsS0FBSyxFQUFFLGVBQWUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFJLEdBQUUsS0FBSyxFQUFFLEFBQWEsTUFBTyxTQUFwQixJQUE0QixRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFJLEdBQUUsQUFBYSxNQUFPLFlBQXBCLEtBQWdDLEFBQWEsTUFBTyxhQUFwQixLQUFpQyxBQUFhLE1BQU8sYUFBcEIsSUFBZ0MsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSx3QkFBd0IsRUFBRSxFQUFFLEVBQUUsYUFBYSxRQUFRLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEtBQUssZUFBZSxDQUFDLEVBQUUsS0FBSyxNQUFNLEtBQUssS0FBSyxZQUFZLEVBQUUsS0FBSyxhQUFhLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsYUFBYSxTQUFTLEVBQUUsQ0FBQyxLQUFLLEtBQUssRUFBRSxLQUFLLEFBQU8sS0FBSyxRQUFaLE1BQW1CLEtBQUssWUFBWSxFQUFFLEtBQUssTUFBTSxLQUFLLEVBQUUsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxNQUFNLFVBQVUsQ0FBQyxFQUFFLFVBQVUsTUFBTSxLQUFLLElBQUksRUFBRSxBQUFPLEtBQUssUUFBWixNQUFtQixLQUFLLFlBQVksRUFBRSxLQUFLLE1BQU0sS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLFFBQVEsVUFBVSxDQUFDLEVBQUUsVUFBVSxRQUFRLEtBQUssSUFBSSxFQUFFLEtBQUssTUFBTSxJQUFJLEVBQUUsRUFBRSxVQUFVLFlBQVksVUFBVSxDQUFDLEtBQUssTUFBTSxHQUFJLEdBQUUsS0FBSyxhQUFhLENBQUMsSUFBSSxHQUFHLE1BQU0sS0FBSyxhQUFhLE9BQU8sRUFBRSxDQUFDLEVBQUUsR0FBSSxHQUFFLEtBQUssS0FBSyxNQUFNLE9BQU8sU0FBUyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxlQUFlLFNBQVMsRUFBRSxDQUFDLE1BQU8sSUFBSSxHQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxpQkFBaUIsVUFBVSxDQUFDLE1BQU8sSUFBSSxHQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMseUJBQXlCLEdBQUcsVUFBVSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLFdBQVcsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLE9BQU8sYUFBYSxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTyxFQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLFlBQVksU0FBUyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLFlBQVksU0FBUyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsWUFBWSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFlBQVksU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEdBQUUsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUksSUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFFLGVBQWUsRUFBRSxlQUFlLEdBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEdBQUksR0FBRSxFQUFFLEdBQUksSUFBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBSSxJQUFHLE1BQU0sR0FBSSxHQUFFLEVBQUUsR0FBRSxFQUFFLElBQUksSUFBRyxJQUFJLEFBQVMsSUFBVCxPQUFZLElBQUUsSUFBSSxHQUFHLFNBQVMsRUFBRSxHQUFFLENBQUMsR0FBSSxJQUFFLEVBQUUsTUFBTyxJQUFJLElBQUUsR0FBRSxNQUFNLE9BQVEsT0FBTSxLQUFJLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFDLEdBQUksSUFBRSxHQUFHLEdBQUcsU0FBUyxFQUFFLENBQUMsTUFBTyxJQUFJLElBQUcsRUFBRSxFQUFFLEVBQUUsY0FBYyxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLEtBQUssSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxHQUFJLEdBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxHQUFJLEdBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxHQUFJLEdBQUUsR0FBRyxNQUFPLElBQUc7QUFBQSxJQUFPLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFFLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFFLGVBQWUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFFLGlCQUFpQixDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxHQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBSSxHQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSx5QkFBeUIsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssS0FBSyxlQUFlLEVBQUUsS0FBSyxhQUFhLEVBQUUsS0FBSyxXQUFXLEVBQUUsS0FBSyxZQUFZLEVBQUUsS0FBSyxlQUFlLEVBQUUsS0FBSyxZQUFZLEVBQUUsS0FBSyxXQUFXLEdBQUcsS0FBSyxjQUFjLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxFQUFFLEtBQUssb0JBQW9CLEVBQUUsS0FBSyxhQUFhLEVBQUUsS0FBSyxZQUFZLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxLQUFLLFNBQVMsRUFBRSxFQUFFLEtBQUssYUFBYSxFQUFFLEtBQUssU0FBUyxPQUFPLEtBQUssV0FBVyxLQUFLLGNBQWMsS0FBSyxDQUFDLEVBQUcsTUFBSyxjQUFjLEVBQUUsS0FBSyxPQUFPLEVBQUUsVUFBVSxLQUFLLEtBQUssS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEtBQUssQ0FBQyxZQUFZLEtBQUssWUFBWSxRQUFRLEVBQUcsR0FBRSxJQUFLLEdBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxhQUFhLFNBQVMsRUFBRSxDQUFDLEtBQUssb0JBQW9CLEtBQUssYUFBYSxLQUFLLFlBQVksRUFBRSxLQUFLLEtBQUssR0FBSSxHQUFFLEtBQUssYUFBYSxDQUFDLEVBQUUsS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssb0JBQW9CLEtBQUssWUFBWSxLQUFLLGNBQWMsRUFBRSxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQU0sTUFBSyxXQUFXLEVBQUUsRUFBRSxFQUFFLFVBQVUsYUFBYSxTQUFTLEVBQUUsQ0FBQyxLQUFLLFdBQVcsR0FBRyxHQUFJLEdBQUUsS0FBSyxhQUFhLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssb0JBQW9CLEtBQUssWUFBWSxLQUFLLGNBQWMsRUFBRSxHQUFHLEtBQUssV0FBVyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsS0FBSyxLQUFLLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQyxNQUFPLEdBQUUsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsZUFBZSxDQUFDLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsTUFBTyxLQUFJLEtBQUssS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxjQUFjLFFBQVEsS0FBSyxLQUFLLEtBQUssY0FBYyxNQUFNLENBQUMsRUFBRSxLQUFLLFlBQVksSUFBSSxFQUFFLEVBQUUsVUFBVSxNQUFNLFVBQVUsQ0FBQyxPQUFRLEdBQUUsS0FBSyxhQUFhLEVBQUUsRUFBRSxFQUFFLEtBQUssV0FBVyxPQUFPLElBQUksS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLFdBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUksR0FBRSxLQUFLLGFBQWEsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsWUFBWSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTyxHQUFFLHNCQUFzQixXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLFdBQVcsT0FBTyxFQUFFLEVBQUUsS0FBSyxXQUFXLEtBQUssY0FBYyxFQUFFLEtBQUssS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxVQUFVLGtCQUFrQixVQUFVLENBQUMsS0FBSyxTQUFTLEtBQUssU0FBUyxNQUFNLEVBQUUsS0FBSyxhQUFhLEtBQUssU0FBUyxVQUFVLEVBQUUsS0FBSyxTQUFTLEtBQUssU0FBUyxNQUFNLEVBQUUsS0FBSyxTQUFTLE9BQU8sQ0FBQyxFQUFFLEVBQUUsVUFBVSxpQkFBaUIsU0FBUyxFQUFFLENBQUMsS0FBSyxTQUFTLEtBQUssQ0FBQyxFQUFFLEdBQUksR0FBRSxLQUFLLE1BQU8sR0FBRSxHQUFHLE9BQU8sU0FBUyxFQUFFLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sVUFBVSxDQUFDLEVBQUUsYUFBYSxFQUFFLFNBQVMsVUFBVSxFQUFFLEVBQUUsU0FBUyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLFNBQVMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLFVBQVUsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxVQUFVLE9BQU8sS0FBSyxJQUFJLEdBQUksRUFBQyxLQUFLLFVBQVUsS0FBSyxTQUFTLE9BQVEsTUFBSyxrQkFBa0IsRUFBRSxJQUFJLEtBQUssVUFBVSxLQUFLLFNBQVMsUUFBUSxLQUFLLGVBQWUsT0FBUSxNQUFLLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxVQUFVLE1BQU0sU0FBUyxFQUFFLENBQUMsR0FBSSxHQUFFLEtBQUssU0FBUyxHQUFHLENBQUMsRUFBRSxVQUFVLE1BQU0sS0FBSyxLQUFLLENBQUMsRUFBRSxNQUFNLEdBQUcsT0FBUSxHQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLE1BQUMsQ0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsVUFBVSxLQUFLLFVBQVUsQ0FBQyxFQUFFLFVBQVUsS0FBSyxLQUFLLElBQUksRUFBRSxPQUFRLEdBQUUsS0FBSyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLGVBQWUsR0FBRywwQkFBMEIsR0FBRyxVQUFVLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBSSxHQUFFLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLEVBQUUsZUFBZSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEdBQUksR0FBRSxFQUFFLFlBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLFFBQVEsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUksR0FBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUksR0FBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsS0FBTSxJQUFJLE9BQU0sRUFBRSxzQ0FBc0MsRUFBRSxNQUFPLEVBQUMsRUFBRSxFQUFFLFFBQVEsWUFBWSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsUUFBUSxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLGVBQWUsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEdBQUcsZ0JBQWdCLEVBQUUsZ0JBQWdCLGVBQWUsRUFBRSxjQUFjLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsT0FBTyxFQUFOLENBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU8sRUFBQyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLFlBQVksQ0FBQyxHQUFHLENBQUUsZ0JBQWdCLElBQUcsTUFBTyxJQUFJLEdBQUUsR0FBRyxVQUFVLE9BQU8sS0FBTSxJQUFJLE9BQU0sZ0dBQWdHLEVBQUUsS0FBSyxNQUFNLE9BQU8sT0FBTyxJQUFJLEVBQUUsS0FBSyxRQUFRLEtBQUssS0FBSyxLQUFLLEdBQUcsS0FBSyxNQUFNLFVBQVUsQ0FBQyxHQUFJLEdBQUUsR0FBSSxHQUFFLE9BQVEsS0FBSyxNQUFLLEFBQVksTUFBTyxNQUFLLElBQXhCLFlBQTZCLEdBQUUsR0FBRyxLQUFLLElBQUksTUFBTyxFQUFDLENBQUMsQ0FBQyxBQUFDLEdBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRyxVQUFVLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsRUFBRSxRQUFRLFNBQVMsRUFBRSxVQUFVLFNBQVMsRUFBRSxFQUFFLENBQUMsTUFBTyxJQUFJLEtBQUcsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxTQUFTLEdBQUcsV0FBVyxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUksR0FBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxNQUFPLElBQUksR0FBRSxRQUFRLFNBQVMsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsYUFBYSxpQkFBaUIsRUFBRSxLQUFLLEdBQUksRUFBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sVUFBVSxDQUFDLEVBQUUsV0FBVyxRQUFRLEVBQUUsYUFBYSxNQUFNLEVBQUUsR0FBSSxPQUFNLGdDQUFnQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLFNBQVMsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEtBQUssTUFBTyxHQUFFLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBRyxXQUFXLEdBQUcsc0JBQXNCLEdBQUcsY0FBYyxHQUFHLGVBQWUsRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLFFBQVEsT0FBTyxHQUFJLE9BQU0sc0RBQXNELENBQUMsRUFBRSxFQUFFLGVBQWUsc0JBQXNCLEVBQUUsR0FBRyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sRUFBRSxLQUFLLFNBQVMsRUFBRSxDQUFDLEdBQUksR0FBRSxHQUFJLEdBQUUsQ0FBQyxFQUFFLE1BQU8sR0FBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLFNBQVMsRUFBRSxDQUFDLEdBQUksR0FBRSxDQUFDLEVBQUUsUUFBUSxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxXQUFXLE9BQVEsR0FBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFPLEdBQUUsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQyxPQUFRLEdBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFJLEdBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsYUFBYSxDQUFDLE9BQU8sR0FBRyxzQkFBc0IsR0FBRyxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUUsSUFBSSxRQUFRLEVBQUUsZUFBZSxPQUFPLEVBQUUsZUFBZSxLQUFL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QVQsT0FBVyxFQUFFLEVBQUUsY0FBYyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssTUFBTSxJQUFJLEVBQUUsS0FBSyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsQ0FBQyxFQUFFLEtBQUssTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsTUFBTSxBQUFvQixRQUFPLFVBQVUsU0FBUyxLQUFLLENBQUMsSUFBcEQsaUJBQXFELENBQUMsR0FBSSxHQUFFLENBQUMsS0FBSyxVQUFVLENBQUMsS0FBTSxJQUFJLE9BQU0sNEVBQTRFLENBQUMsRUFBRSxRQUFRLFNBQVMsRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsSUFBSSxJQUFLLE1BQUssTUFBTSxFQUFFLEtBQUssTUFBTSxHQUFJLEdBQUUsRUFBRSxNQUFNLEtBQUssS0FBSyxPQUFPLEVBQUUsTUFBTSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssS0FBSyxNQUFNLElBQUksS0FBSyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLFNBQVMsRUFBRSxDQUFDLEdBQUksR0FBRSxDQUFDLEVBQUUsTUFBTyxNQUFLLFFBQVEsU0FBUyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEFBQUksVUFBVSxTQUFkLEVBQXFCLE1BQU8sR0FBRSxLQUFLLEtBQUssRUFBRSxFQUFFLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLE1BQU8sTUFBSyxPQUFPLFNBQVMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUksR0FBRSxLQUFLLE1BQU0sS0FBSyxLQUFLLEdBQUcsTUFBTyxJQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTyxNQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTyxNQUFLLE9BQU8sU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFPLEdBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFJLEdBQUUsS0FBSyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLE1BQU0sRUFBRSxNQUFPLEdBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sU0FBUyxFQUFFLENBQUMsRUFBRSxLQUFLLEtBQUssRUFBRSxHQUFJLEdBQUUsS0FBSyxNQUFNLEdBQUcsR0FBRyxHQUFJLENBQU0sRUFBRSxNQUFNLEVBQUUsSUFBaEIsS0FBb0IsSUFBRyxLQUFLLEVBQUUsS0FBSyxNQUFNLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxNQUFPLE1BQUssTUFBTSxPQUFRLFFBQVEsR0FBRSxLQUFLLE9BQU8sU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFPLEdBQUUsS0FBSyxNQUFNLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLElBQUksTUFBTyxNQUFLLE1BQU0sRUFBRSxHQUFHLE1BQU0sTUFBTyxLQUFJLEVBQUUsU0FBUyxTQUFTLEVBQUUsQ0FBQyxLQUFNLElBQUksT0FBTSw0RUFBNEUsQ0FBQyxFQUFFLHVCQUF1QixTQUFTLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUksR0FBRSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEdBQUcsWUFBWSxRQUFRLG1CQUFtQixLQUFLLEtBQUssR0FBRyxTQUFTLE1BQU0sUUFBUSxLQUFLLFNBQVMsa0JBQWtCLGVBQWUsRUFBRSxVQUFVLENBQUMsR0FBRyxLQUFLLEVBQUUsS0FBSyxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUUsWUFBWSxZQUFZLEVBQUUsQUFBaUIsRUFBRSxPQUFuQixnQkFBMEIsR0FBRSxLQUFLLFVBQVUsQ0FBQyxFQUFFLEtBQUssS0FBTSxJQUFJLE9BQU0sMkJBQTJCLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEFBQVcsRUFBRSxXQUFiLFVBQXVCLEFBQVksRUFBRSxXQUFkLFdBQXdCLEFBQVUsRUFBRSxXQUFaLFNBQXNCLEFBQVUsRUFBRSxXQUFaLFNBQXVCLEdBQUUsU0FBUyxRQUFRLEFBQVUsRUFBRSxXQUFaLFNBQXVCLEdBQUUsU0FBUyxPQUFPLEdBQUksR0FBRSxFQUFFLFNBQVMsS0FBSyxTQUFTLEdBQUcsRUFBRSxFQUFFLGVBQWUsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQU4sQ0FBUyxBQUFDLEdBQUUsR0FBSSxHQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU8sSUFBSSxHQUFFLEVBQUUsRUFBRSxNQUFNLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRSxjQUFjLFNBQVMsRUFBRSxFQUFFLENBQUMsTUFBTyxNQUFLLHVCQUF1QixDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFPLEdBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTyxHQUFFLEtBQUssY0FBYyxLQUFLLHVCQUF1QixDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLG9DQUFvQyxHQUFHLGdCQUFnQixHQUFHLHlCQUF5QixHQUFHLHdCQUF3QixHQUFHLFNBQVMsR0FBRyxVQUFVLEdBQUcsY0FBYyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsT0FBTyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBSSxHQUFFLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsRUFBRSxPQUFRLEdBQUUsRUFBRSxFQUFFLEtBQUssS0FBSyxPQUFPLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsT0FBTyxTQUFTLEVBQUUsQ0FBQyxNQUFPLE1BQUssS0FBSyxLQUFLLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxxQkFBcUIsU0FBUyxFQUFFLENBQUMsT0FBUSxHQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxLQUFLLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsS0FBSyxLQUFLLEtBQUssR0FBRyxLQUFLLEtBQUssRUFBRSxLQUFLLEdBQUcsS0FBSyxLQUFLLEVBQUUsS0FBSyxHQUFHLEtBQUssS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFPLEdBQUUsS0FBSyxLQUFLLE1BQU0sRUFBRSxFQUFFLEVBQUUsVUFBVSxzQkFBc0IsU0FBUyxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxLQUFLLFNBQVMsQ0FBQyxFQUFFLE1BQU8sS0FBSSxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLFVBQVUsU0FBUyxTQUFTLEVBQUUsQ0FBQyxHQUFHLEtBQUssWUFBWSxDQUFDLEVBQUUsQUFBSSxJQUFKLEVBQU0sTUFBTSxDQUFDLEVBQUUsR0FBSSxHQUFFLEtBQUssS0FBSyxNQUFNLEtBQUssS0FBSyxLQUFLLE1BQU0sS0FBSyxLQUFLLEtBQUssTUFBTSxDQUFDLEVBQUUsTUFBTyxNQUFLLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLFdBQVcsR0FBRyxlQUFlLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFJLEdBQUUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUMsS0FBSyxLQUFLLEVBQUUsS0FBSyxPQUFPLEVBQUUsT0FBTyxLQUFLLE1BQU0sRUFBRSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFlBQVksU0FBUyxFQUFFLENBQUMsS0FBSyxXQUFXLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxXQUFXLFNBQVMsRUFBRSxDQUFDLEdBQUcsS0FBSyxPQUFPLEtBQUssS0FBSyxHQUFHLEVBQUUsRUFBRSxLQUFNLElBQUksT0FBTSxzQ0FBc0MsS0FBSyxPQUFPLG1CQUFtQixFQUFFLG9CQUFvQixDQUFDLEVBQUUsU0FBUyxTQUFTLEVBQUUsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxFQUFFLEtBQUssTUFBTSxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQyxLQUFLLFNBQVMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sU0FBUyxFQUFFLENBQUMsRUFBRSxRQUFRLFNBQVMsRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsSUFBSSxLQUFLLFlBQVksQ0FBQyxFQUFFLEVBQUUsS0FBSyxNQUFNLEVBQUUsRUFBRSxHQUFHLEtBQUssTUFBTSxJQUFJLEVBQUcsSUFBRyxHQUFHLEtBQUssT0FBTyxDQUFDLEVBQUUsTUFBTyxNQUFLLE9BQU8sRUFBRSxDQUFDLEVBQUUsV0FBVyxTQUFTLEVBQUUsQ0FBQyxNQUFPLEdBQUUsWUFBWSxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsU0FBUyxFQUFFLENBQUMsRUFBRSxxQkFBcUIsU0FBUyxFQUFFLENBQUMsRUFBRSxzQkFBc0IsU0FBUyxFQUFFLENBQUMsRUFBRSxTQUFTLFVBQVUsQ0FBQyxHQUFJLEdBQUUsS0FBSyxRQUFRLENBQUMsRUFBRSxNQUFPLElBQUksTUFBSyxLQUFLLElBQUksS0FBTSxJQUFHLEdBQUcsS0FBTSxJQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFJLElBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUksR0FBRSxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLFNBQVMsU0FBUyxFQUFFLENBQUMsS0FBSyxZQUFZLENBQUMsRUFBRSxHQUFJLEdBQUUsS0FBSyxLQUFLLE1BQU0sS0FBSyxLQUFLLEtBQUssTUFBTSxLQUFLLEtBQUssS0FBSyxNQUFNLENBQUMsRUFBRSxNQUFPLE1BQUssT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsV0FBVyxHQUFHLHFCQUFxQixFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBSSxHQUFFLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLE9BQU8sU0FBUyxFQUFFLENBQUMsTUFBTyxNQUFLLEtBQUssV0FBVyxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxVQUFVLHFCQUFxQixTQUFTLEVBQUUsQ0FB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QUFFLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxZQUFZLENBQUMsRUFBRSxLQUFLLEtBQUssWUFBWSxFQUFFLEtBQUssZUFBZSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLGFBQWEsU0FBUyxFQUFFLENBQUMsS0FBSyxXQUFXLE1BQU0sRUFBRSxFQUFFLEtBQUssS0FBSyxXQUFXLE9BQU8sQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUksR0FBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLEtBQUssdUJBQXVCLENBQUMsRUFBRSxLQUFLLFNBQVMsRUFBRSxLQUFLLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLGFBQWEsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBSSxHQUFFLEtBQUssV0FBVyxLQUFLLFdBQVcsRUFBRSxLQUFLLFdBQVcsS0FBSyxVQUFVLEVBQUUsRUFBRSxLQUFLLE1BQU0sQ0FBQyxFQUFFLFVBQVUsYUFBYSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLFdBQVcsR0FBRyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUksR0FBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLEtBQUssWUFBWSxFQUFFLEdBQUksR0FBRSxLQUFLLEtBQUssWUFBWSxHQUFHLEtBQUssTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLEtBQUssZUFBZSxHQUFHLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQyxFQUFFLFlBQVksR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsUUFBUSxVQUFVLENBQUMsRUFBRSxVQUFVLFFBQVEsS0FBSyxJQUFJLEVBQUUsS0FBSyxLQUFLLElBQUksRUFBRSxFQUFFLFVBQVUsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxVQUFVLE9BQU8sS0FBSyxJQUFJLEdBQUksRUFBQyxLQUFLLGdCQUFnQixLQUFLLGFBQWMsTUFBSyxlQUFlLEdBQUcsRUFBRSxNQUFNLEtBQUssZUFBZSxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLFVBQVUsZUFBZSxVQUFVLENBQUMsS0FBSyxlQUFlLEdBQUcsS0FBSyxVQUFVLEtBQUssWUFBYSxNQUFLLE1BQU0sRUFBRSxLQUFLLFlBQWEsR0FBRSxNQUFNLEtBQUssZUFBZSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssZUFBZSxJQUFJLEVBQUUsRUFBRSxVQUFVLE1BQU0sVUFBVSxDQUFDLEdBQUcsS0FBSyxVQUFVLEtBQUssV0FBVyxNQUFNLEdBQUcsR0FBSSxHQUFFLEtBQUssRUFBRSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssTUFBTSxLQUFLLEVBQUUsR0FBRyxLQUFLLE9BQU8sS0FBSyxJQUFJLE1BQU8sTUFBSyxJQUFJLEVBQUUsT0FBTyxLQUFLLFVBQVUsU0FBUyxFQUFFLEtBQUssS0FBSyxVQUFVLEtBQUssTUFBTSxDQUFDLEVBQUUsVUFBVSxhQUFhLEVBQUUsS0FBSyxLQUFLLFNBQVMsS0FBSyxNQUFNLENBQUMsRUFBRSxVQUFVLFlBQVksYUFBYSxFQUFFLEtBQUssS0FBSyxNQUFNLEtBQUssTUFBTSxDQUFDLEVBQUUsTUFBTyxNQUFLLE1BQU0sRUFBRSxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLFdBQVcsR0FBRyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLFdBQVcsRUFBRSxDQUFDLEtBQUssS0FBSyxHQUFHLFVBQVUsS0FBSyxXQUFXLENBQUMsRUFBRSxLQUFLLGVBQWUsS0FBSyxLQUFLLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxTQUFTLEdBQUcsS0FBSyxXQUFXLEdBQUcsS0FBSyxTQUFTLEdBQUcsS0FBSyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLFNBQVMsSUFBSSxDQUFDLEVBQUUsVUFBVSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxVQUFVLENBQUMsR0FBRyxLQUFLLFdBQVcsTUFBTSxHQUFHLEtBQUssTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFLEtBQUssUUFBUSxFQUFFLEtBQUssV0FBVyxFQUFFLE9BQU8sRUFBTixDQUFTLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssWUFBYSxNQUFLLFNBQVMsS0FBSyxlQUFlLEVBQUcsTUFBSyxXQUFXLEdBQUcsS0FBSyxLQUFLLFFBQVEsQ0FBQyxFQUFFLEtBQUssVUFBVSxLQUFLLFNBQVMsTUFBTSxDQUFDLEVBQUUsS0FBSyxRQUFRLEdBQUcsR0FBRyxFQUFFLEdBQUcsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFPLE1BQUssV0FBVyxHQUFHLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLFVBQVUsQ0FBQyxLQUFLLFdBQVcsS0FBSyxlQUFlLEtBQUssZ0JBQWdCLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssV0FBVyxHQUFHLE9BQVEsR0FBRSxFQUFFLEVBQUUsS0FBSyxXQUFXLEdBQUcsT0FBTyxJQUFJLEtBQUssV0FBVyxHQUFHLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUMsTUFBTyxHQUFFLGlCQUFpQixJQUFJLENBQUMsRUFBRSxpQkFBaUIsU0FBUyxFQUFFLENBQUMsR0FBRyxLQUFLLFNBQVMsS0FBTSxJQUFJLE9BQU0sZUFBZSxLQUFLLDBCQUEwQixFQUFFLEtBQUssV0FBVyxFQUFFLFdBQVcsS0FBSyxnQkFBZ0IsRUFBRSxLQUFLLFNBQVMsRUFBRSxHQUFJLEdBQUUsS0FBSyxNQUFPLEdBQUUsR0FBRyxPQUFPLFNBQVMsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLFFBQVEsU0FBUyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLFlBQWEsTUFBSyxTQUFTLEdBQUcsS0FBSyxVQUFVLEtBQUssU0FBUyxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFVBQVUsS0FBSyxXQUFXLE1BQU0sR0FBRyxHQUFJLEdBQUUsS0FBSyxTQUFTLEdBQUcsTUFBTyxNQUFLLGdCQUFpQixNQUFLLE1BQU0sS0FBSyxjQUFjLEVBQUUsRUFBRSxJQUFJLEtBQUssVUFBVSxLQUFLLFNBQVMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sVUFBVSxDQUFDLEVBQUUsYUFBYSxTQUFTLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsZUFBZSxTQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU8sTUFBSyxnQkFBZ0IsR0FBRyxFQUFFLEtBQUssZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixVQUFVLENBQUMsT0FBUSxLQUFLLE1BQUssZ0JBQWdCLEtBQUssZ0JBQWdCLGVBQWUsQ0FBQyxHQUFJLE1BQUssV0FBVyxHQUFHLEtBQUssZ0JBQWdCLEdBQUcsRUFBRSxLQUFLLFVBQVUsQ0FBQyxHQUFHLEtBQUssU0FBUyxLQUFNLElBQUksT0FBTSxlQUFlLEtBQUssMEJBQTBCLEVBQUUsS0FBSyxTQUFTLEdBQUcsS0FBSyxVQUFVLEtBQUssU0FBUyxLQUFLLENBQUMsRUFBRSxTQUFTLFVBQVUsQ0FBQyxHQUFJLEdBQUUsVUFBVSxLQUFLLEtBQUssTUFBTyxNQUFLLFNBQVMsS0FBSyxTQUFTLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFJLEdBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLFdBQVcsR0FBRyxDQUFDLEVBQUUsRUFBRSxxQ0FBcUMsQ0FBQyxNQUFDLENBQVMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU8sSUFBSSxHQUFFLFFBQVEsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFFBQVEsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUksR0FBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBTyxPQUFPLE9BQU8sTUFBTyxHQUFFLFFBQVEsRUFBRSxZQUFZLGNBQWMsQ0FBQyxFQUFFLENBQUMsTUFBTSxTQUFTLE1BQU8sR0FBRSxPQUFPLENBQUMsVUFBVSxNQUFPLEdBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sSUFBSSxHQUFHLEVBQUUsR0FBRyxPQUFPLE9BQU8sT0FBTyxTQUFTLE1BQU8sR0FBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLE1BQU8sT0FBTSxVQUFVLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLGFBQWEsSUFBSSxFQUFFLEdBQUksWUFBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxNQUFPLE9BQU0sYUFBYSxNQUFPLFFBQU8sT0FBTyxDQUFDLFVBQVUsS0FBTSxJQUFJLE9BQU0sOEJBQThCLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBTixDQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFF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QUFFLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSx3QkFBd0IsRUFBRSxFQUFFLEdBQUksT0FBTSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsRUFBRSxLQUFLLEtBQUssY0FBYyxFQUFFLEtBQUssU0FBUyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxLQUFLLGNBQWMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxTQUFTLEVBQUUsQ0FBQyxNQUFPLEdBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEFBQVEsT0FBTyxHQUFFLEVBQUUsV0FBVyxDQUFDLEtBQS9CLE9BQW9DLEVBQUUsRUFBRSxHQUFHLEFBQVEsT0FBTyxHQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsS0FBakMsT0FBdUMsR0FBRSxNQUFPLEdBQUUsT0FBTyxJQUFLLEdBQUUsT0FBTyxLQUFLLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxXQUFXLEdBQUksWUFBVyxDQUFDLEVBQUUsR0FBSSxPQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxBQUFRLE9BQU8sR0FBRSxFQUFFLFdBQVcsQ0FBQyxLQUEvQixPQUFvQyxFQUFFLEVBQUUsR0FBRyxBQUFRLE9BQU8sR0FBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEtBQWpDLE9BQXVDLEdBQUUsTUFBTyxHQUFFLE9BQU8sSUFBSyxHQUFFLE9BQU8sS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUcsR0FBRSxLQUFLLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRyxHQUFFLE1BQU0sRUFBRSxLQUFLLElBQUksSUFBSSxHQUFJLEdBQUUsS0FBSyxJQUFJLElBQUksR0FBRyxFQUFFLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxHQUFHLEdBQUcsTUFBTyxFQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxXQUFXLFNBQVMsRUFBRSxDQUFDLE1BQU8sR0FBRSxXQUFXLEVBQUUsWUFBWSxhQUFhLENBQUMsRUFBRSxTQUFTLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFJLE9BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBSSxHQUFFLEVBQUUsTUFBTSxJQUFJLEVBQUUsS0FBSyxVQUFVLEVBQUcsR0FBRSxFQUFFLElBQUksRUFBRSxLQUFLLE1BQU0sR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQUFBSSxJQUFKLEVBQU0sR0FBRyxBQUFJLElBQUosRUFBTSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUcsSUFBRyxNQUFNLEVBQUUsS0FBSyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsS0FBSyxNQUFNLEtBQUssRUFBRSxDQUFDLE1BQU8sR0FBRSxTQUFTLEdBQUksR0FBRSxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsV0FBVyxhQUFhLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLGFBQWEsU0FBUyxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsWUFBWSxFQUFFLFdBQVcsYUFBYSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBSyxVQUFVLEtBQUssU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFJLEdBQUUsRUFBRSxBQUFDLEdBQUUsR0FBSSxZQUFXLEVBQUUsT0FBTyxLQUFLLFNBQVMsTUFBTSxHQUFHLElBQUksS0FBSyxTQUFTLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLFNBQVMsTUFBTSxDQUFDLEtBQU0sR0FBRSxLQUFLLFNBQVMsT0FBTyxDQUFDLEVBQUUsS0FBSyxTQUFTLElBQUksQ0FBQyxHQUFJLEdBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsSUFBSyxHQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUyxHQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQUFBTSxLQUFJLEVBQUUsS0FBWixLQUFpQixJQUFJLE1BQU8sR0FBRSxHQUFJLEFBQUksSUFBSixFQUFGLEVBQVUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVMsR0FBRSxXQUFZLEdBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLE1BQU0sR0FBSSxHQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLElBQUksS0FBSyxLQUFLLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsVUFBVSxNQUFNLFVBQVUsQ0FBQyxLQUFLLFVBQVUsS0FBSyxTQUFTLFFBQVMsTUFBSyxLQUFLLENBQUMsS0FB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QUksWUFBVyxDQUFDLEVBQUUsR0FBSSxPQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsV0FBVyxTQUFTLEVBQUUsQ0FBQyxNQUFPLElBQUksWUFBVyxDQUFDLENBQUMsRUFBRSxXQUFXLFNBQVMsRUFBRSxDQUFDLE1BQU8sR0FBRSxjQUFjLEdBQUksWUFBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFLE1BQU0sU0FBUyxFQUFFLENBQUMsTUFBTyxHQUFFLEVBQUUsR0FBSSxPQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxZQUFZLFNBQVMsRUFBRSxDQUFDLE1BQU8sR0FBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFdBQVcsU0FBUyxFQUFFLENBQUMsTUFBTyxHQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxTQUFTLEVBQUUsQ0FBQyxNQUFPLEdBQUUsRUFBRSxHQUFJLE9BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLFlBQVksU0FBUyxFQUFFLENBQUMsTUFBTyxHQUFFLFdBQVcsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsU0FBUyxFQUFFLENBQUMsTUFBTyxHQUFFLEVBQUUsR0FBSSxZQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLFlBQVksU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxNQUFPLEdBQUUsRUFBRSxhQUFhLENBQUMsRUFBRSxHQUFJLEdBQUUsRUFBRSxVQUFVLENBQUMsRUFBRSxNQUFPLEdBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxTQUFTLEVBQUUsQ0FBQyxPQUFRLEdBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUksR0FBRSxFQUFFLEdBQUcsQUFBTSxJQUFOLEtBQVMsQUFBSyxJQUFMLElBQVEsQUFBSSxJQUFKLEdBQU8sSUFBSSxFQUFFLE9BQU8sR0FBSSxDQUFPLElBQVAsS0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTyxHQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLFNBQVMsRUFBRSxDQUFDLE1BQU0sQUFBVSxPQUFPLElBQWpCLFNBQW1CLFNBQVMsQUFBbUIsT0FBTyxVQUFVLFNBQVMsS0FBSyxDQUFDLElBQW5ELGlCQUFxRCxRQUFRLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxZQUFZLFlBQWEsWUFBVyxhQUFhLEVBQUUsYUFBYSxZQUFhLGFBQVksY0FBYyxNQUFNLEVBQUUsRUFBRSxhQUFhLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsWUFBWSxHQUFHLEtBQU0sSUFBSSxPQUFNLEVBQUUsb0NBQW9DLENBQUMsRUFBRSxFQUFFLGlCQUFpQixNQUFNLEVBQUUsaUJBQWlCLEdBQUcsRUFBRSxPQUFPLFNBQVMsRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFHLElBQUcsSUFBSSxPQUFPLElBQUksR0FBRyxNQUFRLElBQUUsRUFBRSxXQUFXLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFPLEVBQUMsRUFBRSxFQUFFLE1BQU0sU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLGFBQWEsVUFBVSxDQUFDLEVBQUUsTUFBTSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFNBQVMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFJLEVBQUMsRUFBRSxFQUFFLE9BQU8sVUFBVSxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxPQUFPLElBQUksSUFBSSxJQUFLLFdBQVUsR0FBRyxVQUFVLEdBQUcsZUFBZSxDQUFDLEdBQUcsQUFBUyxFQUFFLEtBQVgsUUFBZ0IsR0FBRSxHQUFHLFVBQVUsR0FBRyxJQUFJLE1BQU8sRUFBQyxFQUFFLEVBQUUsZUFBZSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU8sR0FBRSxRQUFRLFFBQVEsQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUMsTUFBTyxHQUFFLE1BQU8sYUFBYSxPQUFNLEFBQUssQ0FBQyxnQkFBZ0IsZUFBZSxFQUFFLFFBQVEsT0FBTyxVQUFVLFNBQVMsS0FBSyxDQUFDLENBQUMsSUFBaEYsS0FBb0YsQUFBYSxNQUFPLFlBQXBCLElBQStCLEdBQUksR0FBRSxRQUFRLFNBQVMsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEdBQUksWUFBVyxFQUFFLE9BQU8sU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sTUFBTSxDQUFDLEVBQUUsRUFBRSxRQUFRLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLEtBQUssQ0FBQyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxVQUFVLENBQUMsRUFBRSxNQUFPLEdBQUcsQ0FBZ0IsSUFBaEIsY0FBa0IsRUFBRSxFQUFFLFlBQVksYUFBYSxDQUFDLEVBQUUsQUFBVyxJQUFYLFVBQWUsR0FBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxBQUFLLElBQUwsSUFBUyxHQUFFLFNBQVMsRUFBRSxDQUFDLE1BQU8sR0FBRSxFQUFFLEVBQUUsV0FBVyxHQUFJLFlBQVcsRUFBRSxNQUFNLEVBQUUsR0FBSSxPQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLFFBQVEsT0FBTyxHQUFJLE9BQU0sMkJB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QyxDQUFDLENBQUMsRUFBRSxBQUFVLEVBQUUsU0FBWixTQUFvQixFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLFNBQVMsT0FBTyxFQUFOLENBQVMsRUFBRSxPQUFPLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxNQUFPLEVBQUMsQ0FBQyxBQUFDLEdBQUUsUUFBUSxHQUFHLFVBQVUsUUFBUSxTQUFTLEVBQUUsQ0FBQyxHQUFHLEFBQVksTUFBTyxJQUFuQixXQUFxQixNQUFPLE1BQUssR0FBSSxHQUFFLEtBQUssWUFBWSxNQUFPLE1BQUssS0FBSyxTQUFTLEVBQUUsQ0FBQyxNQUFPLEdBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQyxNQUFPLEVBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBTyxHQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsS0FBTSxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFVBQVUsTUFBTSxTQUFTLEVBQUUsQ0FBQyxNQUFPLE1BQUssS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsVUFBVSxLQUFLLFNBQVMsRUFBRSxFQUFFLENBQUMsR0FBRyxBQUFZLE1BQU8sSUFBbkIsWUFBc0IsS0FBSyxRQUFRLEdBQUcsQUFBWSxNQUFPLElBQW5CLFlBQXNCLEtBQUssUUFBUSxFQUFFLE1BQU8sTUFBSyxHQUFJLEdBQUUsR0FBSSxNQUFLLFlBQVksQ0FBQyxFQUFFLFlBQUssUUFBUSxFQUFFLEVBQUUsRUFBRSxLQUFLLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxPQUFPLEVBQUUsS0FBSyxNQUFNLEtBQUssR0FBSSxHQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBUyxDQUFDLEVBQUUsRUFBRSxVQUFVLGNBQWMsU0FBUyxFQUFFLENBQUMsRUFBRSxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLFVBQVUsbUJBQW1CLFNBQVMsRUFBRSxDQUFDLEVBQUUsS0FBSyxRQUFRLEtBQUssWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLFVBQVUsYUFBYSxTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsVUFBVSxrQkFBa0IsU0FBUyxFQUFFLENBQUMsRUFBRSxLQUFLLFFBQVEsS0FBSyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxTQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQUFBVSxFQUFFLFNBQVosUUFBbUIsTUFBTyxHQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFJLEdBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBUSxHQUFFLEdBQUcsRUFBRSxFQUFFLE1BQU0sT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU8sRUFBQyxFQUFFLEVBQUUsT0FBTyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQVEsR0FBRSxHQUFHLEVBQUUsRUFBRSxNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEdBQUcsYUFBYSxDQUFDLEVBQUUsTUFBTyxFQUFDLEVBQUUsRUFBRSxRQUFRLFNBQVMsRUFBRSxDQUFDLE1BQUcsYUFBYSxNQUFZLEVBQVMsRUFBRSxRQUFRLEdBQUksTUFBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLFNBQVMsRUFBRSxDQUFDLEdBQUksR0FBRSxHQUFJLE1BQUssQ0FBQyxFQUFFLE1BQU8sR0FBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLFNBQVMsRUFBRSxDQUFDLEdBQUksR0FBRSxLQUFLLEdBQUcsQUFBbUIsT0FBTyxVQUFVLFNBQVMsS0FBSyxDQUFDLElBQW5ELGlCQUFxRCxNQUFPLE1BQUssT0FBTyxHQUFJLFdBQVUsa0JBQWtCLENBQUMsRUFBRSxHQUFJLEdBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxNQUFPLE1BQUssUUFBUSxDQUFDLENBQUMsRUFBNEMsT0FBdEMsR0FBRSxHQUFJLE9BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFJLE1BQUssQ0FBQyxFQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxNQUFPLEdBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsR0FBSSxHQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBSSxHQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLFNBQVMsRUFBRSxDQUFDLEdBQUksR0FBRSxLQUFLLEdBQUcsQUFBbUIsT0FBTyxVQUFVLFNBQVMsS0FBSyxDQUFDLElBQW5ELGlCQUFxRCxNQUFPLE1BQUssT0FBTyxHQUFJLFdBQVUsa0JBQWtCLENBQUMsRUFBRSxHQUFJLEdBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxNQUFPLE1BQUssUUFBUSxDQUFDLENBQUMsRUFBeUIsT0FBbkIsR0FBRSxHQUFHLEVBQUUsR0FBSSxNQUFLLENBQUMsRUFBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUMsR0FBSSxHQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBSSxHQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFJLEdBQUUsTUFBTyxFQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUksR0FBRSxDQUFDLEVBQUUsQUFBQyxBQVpodWlELEdBWWt1aUQsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUUsRUFBRSxlQUFlLEVBQUUsRUFBRSxlQUFlLEVBQUUsRUFBRSxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsR0FBRyxxQkFBcUIsR0FBRyx1QkFBdUIsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUksR0FBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLE9BQU8sVUFBVSxTQUFTLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUUsZ0JBQWdCLElBQUcsTUFBTyxJQUFJLEdBQUUsQ0FBQyxFQUFFLEtBQUssUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsTUFBTSxXQUFXLEdBQUcsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUksR0FBRSxLQUFLLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxFQUFFLFlBQVksRUFBRSxXQUFXLElBQUssR0FBRSxZQUFZLElBQUksS0FBSyxJQUFJLEVBQUUsS0FBSyxJQUFJLEdBQUcsS0FBSyxNQUFNLEdBQUcsS0FBSyxPQUFPLENBQUMsRUFBRSxLQUFLLEtBQUssR0FBSSxHQUFFLEtBQUssS0FBSyxVQUFVLEVBQUUsR0FBSSxHQUFFLEVBQUUsYUFBYSxLQUFLLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQU0sSUFBSSxPQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEtBQUssS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLFdBQVcsQ0FBQyxHQUFJLEdBQUUsR0FBRyxFQUFFLEFBQVUsTUFBTyxHQUFFLFlBQW5CLFNBQThCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxBQUF5QixFQUFFLEtBQUssRUFBRSxVQUFVLElBQTVDLHVCQUE4QyxHQUFJLFlBQVcsRUFBRSxVQUFVLEVBQUUsRUFBRSxXQUFZLEdBQUUsRUFBRSxxQkFBcUIsS0FBSyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQU0sSUFBSSxPQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssVUFBVSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEdBQUksR0FBRSxHQUFJLEdBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxLQUFNLEdBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxNQUFPLEdBQUUsTUFBTSxDQUFDLEVBQUUsVUFBVSxLQUFLLFNBQVMsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsRUFBRSxLQUFLLEtBQUssRUFBRSxLQUFLLFFBQVEsVUFBVSxHQUFHLEtBQUssTUFBTSxNQUFNLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQUFBSyxJQUFMLEdBQU8sRUFBRSxFQUFFLEFBQVUsTUFBTyxJQUFqQixTQUFtQixFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBRSxBQUF5QixFQUFFLEtBQUssQ0FBQyxJQUFqQyx1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QUUsWUFBWSxJQUFJLEdBQUcsRUFBRSxZQUFZLEVBQUUsV0FBVyxJQUFJLEFBQUksSUFBRyxFQUFFLGFBQVQsR0FBdUIsR0FBRSxZQUFZLElBQUksS0FBSyxJQUFJLEVBQUUsS0FBSyxJQUFJLEdBQUcsS0FBSyxNQUFNLEdBQUcsS0FBSyxPQUFPLENBQUMsRUFBRSxLQUFLLEtBQUssR0FBSSxHQUFFLEtBQUssS0FBSyxVQUFVLEVBQUUsR0FBSSxHQUFFLEVBQUUsYUFBYSxLQUFLLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxLQUFNLElBQUksT0FBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLE9BQU8sR0FBSSxHQUFFLEVBQUUsaUJBQWlCLEtBQUssS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEdBQUksR0FBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEtBQU0sR0FBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLE1BQU8sR0FBRSxNQUFNLENBQUMsRUFBRSxVQUFVLEtBQUssU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxLQUFLLEVBQUUsS0FBSyxRQUFRLFVBQVUsRUFBRSxLQUFLLFFBQVEsV0FBVyxFQUFFLEdBQUcsR0FBRyxLQUFLLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEFBQUssSUFBTCxHQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsQUFBVSxNQUFPLElBQWpCLFNBQW1CLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxFQUFFLEFBQXlCLEVBQUUsS0FBSyxDQUFDLElBQWpDLHVCQUFtQyxFQUFFLE1BQU0sR0FBSSxZQUFXLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE9BQU8sRUFBRSxDQUFDLEdBQUcsQUFB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LEdBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxBQUFVLE1BQU8sSUFBakIsU0FBbUIsS0FBTSxJQUFJLFdBQVUsRUFBRSxvQkFBb0IsRUFBRSxPQUFRLEtBQUssR0FBRSxFQUFFLGVBQWUsQ0FBQyxHQUFJLEdBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU8sRUFBQyxFQUFFLEVBQUUsVUFBVSxTQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU8sR0FBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFHLEdBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFJLEdBQUUsQ0FBQyxTQUFTLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU8sUUFBUSxHQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxjQUFjLFNBQVMsRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxHQUFJLFlBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxNQUFPLEVBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBUSxHQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxjQUFjLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFNBQVMsU0FBUyxFQUFFLENBQUMsRUFBRyxHQUFFLEtBQUssV0FBVyxFQUFFLE1BQU0sWUFBWSxFQUFFLE1BQU0sV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUksR0FBRSxLQUFLLE1BQU0sRUFBRSxNQUFNLE1BQU0sRUFBRSxNQUFNLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFJLEdBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsT0FBTyxhQUFhLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxhQUFhLE1BQU0sS0FBSyxHQUFJLFlBQVcsQ0FBQyxDQUFDLENBQUMsTUFBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLE9BQVEsR0FBRSxHQUFJLEdBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLE9BQVEsR0FBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxNQUFPLFFBQU8sYUFBYSxNQUFNLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBUSxHQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsT0FBTyxhQUFhLEVBQUUsRUFBRSxFQUFFLE1BQU8sRUFBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLFdBQVcsU0FBUyxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEFBQVEsT0FBTyxHQUFFLEVBQUUsV0FBVyxDQUFDLEtBQS9CLE9BQW9DLEVBQUUsRUFBRSxHQUFHLEFBQVEsT0FBTyxHQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsS0FBakMsT0FBdUMsR0FBRSxNQUFPLEdBQUUsT0FBTyxJQUFLLEdBQUUsT0FBTyxLQUFLLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBSSxHQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEFBQVEsT0FBTyxHQUFFLEVBQUUsV0FBVyxDQUFDLEtBQS9CLE9BQW9DLEVBQUUsRUFBRSxHQUFHLEFBQVEsT0FBTyxHQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsS0FBakMsT0FBdUMsR0FBRSxNQUFPLEdBQUUsT0FBTyxJQUFLLEdBQUUsT0FBTyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRyxHQUFFLEtBQUssRUFBRSxLQUFLLElBQUksSUFBSSxFQUFHLEdBQUUsTUFBTSxFQUFFLEtBQUssSUFBSSxJQUFJLEdBQUksR0FBRSxLQUFLLElBQUksSUFBSSxHQUFHLEVBQUUsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxJQUFJLEdBQUcsR0FBRyxNQUFPLEVBQUMsRUFBRSxFQUFFLGNBQWMsU0FBUyxFQUFFLENBQUMsTUFBTyxHQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLGNBQWMsU0FBUyxFQUFFLENBQUMsT0FBUSxHQUFFLEdBQUksR0FBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsRUFBRSxNQUFPLEVBQUMsRUFBRSxFQUFFLFdBQVcsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUksT0FBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFJLEdBQUUsRUFBRSxNQUFNLElBQUksRUFBRSxLQUFLLFVBQVUsRUFBRyxHQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssTUFBTSxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxBQUFJLElBQUosRUFBTSxHQUFHLEFBQUksSUFBSixFQUFNLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRyxJQUFHLE1BQU0sRUFBRSxLQUFLLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxLQUFLLE1BQU0sS0FBSyxFQUFFLENBQUMsTUFBTyxHQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxXQUFXLFNBQVMsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLElBQUssR0FBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFFBQVMsR0FBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEFBQU0sS0FBSSxFQUFFLEtBQVosS0FBaUIsSUFBSSxNQUFPLEdBQUUsR0FBSSxBQUFJLElBQUosRUFBRixFQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxRQUFRLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQVEsR0FBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxNQUFNLEVBQUUsRUFBRSxFQUFFLEFBQUksSUFBSixHQUFPLENBQUMsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUcsR0FBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU8sR0FBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFFBQVEsR0FBRyxlQUFlLEdBQUcsYUFBYSxHQUFHLFlBQVksR0FBRyxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLEdBQUcsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUksR0FBRSxVQUFVLENBQUMsT0FBUSxHQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxPQUFRLEdBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFPLEVBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsT0FBUSxHQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFLLEdBQUUsRUFBRSxLQUFLLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBSSxHQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxZQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU8sR0FBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTyxJQUFHLEdBQUksR0FBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLFlBQVcsRUFBRSxDQUFDLE9BQVEsR0FBRSxFQUFFLE9BQU8sR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxXQUFZLEdBQUUsRUFBRSxXQUFXLEFBQUksSUFBSixHQUFRLEdBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsYUFBYSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsU0FBUyxFQUFFLEFBQUksRUFBRSxVQUFOLEdBQWdCLEdBQUUsWUFBWSxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsWUFBWSxHQUFHLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLFlBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxXQUFXLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsU0FBVSxHQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsWUFBYSxLQUFJLEdBQUcsRUFBRSxFQUFFLFdBQVksR0FBRSxFQUFFLFdBQVcsRUFBRyxJQUFHLEVBQUcsR0FBRSxHQUFHLEtBQUssSUFBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLElBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUcsR0FBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBSSxHQUFFLEdBQUcsTUFBTSxHQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQVMsR0FBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEFBQUcsRUFBRSxHQUFMLEdBQVEsTUFBTyxJQUFHLEVBQUUsVUFBVSxFQUFFLEVBQUUsU0FBUyxDQUFDLFlBQVcsRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFHLEdBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQUFBSSxFQUFFLEtBQUssV0FBWCxFQUFvQixNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFJLEdBQUUsR0FBRyxFQUFFLEFBQUksSUFBSixFQUFNLEVBQUcsR0FBRSxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxBQUFJLEVBQUUsTUFBTSxPQUFaLEVBQWlCLEVBQUUsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEFBQUksRUFBRSxNQUFNLE9BQVosR0FBbUIsR0FBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxHQUFHLEVBQUUsTUFBTyxHQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUyxHQUFFLE1BQU8sR0FBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFFLEdBQUUsVUFBVSxFQUFFLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLEdBQUcsQUFBSSxFQUFFLEtBQUssV0FBWCxFQUFvQixDQUFDLFlBQVcsRUFBRSxFQUFFLENBQUMsT0FBUSxHQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxHQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsR0FBRyxJQUFJLEVBQUUsTUFBTyxHQUFFLEdBQUcsQUFBSSxFQUFFLFlBQU4sRUFBZ0IsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsV0FBVyxHQUFJLEdBQUUsTUFBTyxHQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFVBQVUsQUFBSSxJQUFKLEdBQU8sRUFBRSxTQUFTLEdBQUcsRUFBRSxPQUFPLEdBQUksR0FBRSxhQUFhLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxhQUFhLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLE1BQU8sR0FBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEFBQUcsRUFBRSxFQUFFLGNBQVAsR0FBcUIsQ0FBQyxFQUFFLFVBQVUsS0FBTSxHQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTyxHQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsSUFBSSxFQUFFLGNBQWUsR0FBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLFlBQVksRUFBRSxXQUFXLEdBQUcsR0FBSSxHQUFFLEVBQUUsRUFBRSxFQUFFLEFBQUksRUFBRSxLQUFLLFlBQVgsR0FBc0IsTUFBTyxFQUFDLENBQUMsTUFBTyxHQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRyxHQUFFLEVBQUUsRUFBRSxFQUFFLEFBQUksRUFBRSxLQUFLLFlBQVgsRUFBcUIsRUFBRSxHQUFHLEVBQUUsVUFBVyxHQUFFLEVBQUUsRUFBRSxFQUFFLEFBQUksRUFBRSxLQUFLLFlBQVgsR0FBc0IsRUFBRSxDQUFDLENBQUMsWUFBVyxFQUFFLEVBQUUsQ0FBQyxPQUFRLEdBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsR0FBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLEdBQUcsSUFBSSxFQUFFLE1BQU8sR0FBRSxHQUFHLEFBQUksRUFBRSxZQUFOLEVBQWdCLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLFdBQVcsR0FBSSxHQUFFLE1BQU8sR0FBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxFQUFFLEFBQUksSUFBSixHQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsR0FBRyxFQUFFLE9BQU8sR0FBSSxHQUFFLGFBQWEsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLGNBQWMsR0FBSSxDQUFJLEVBQUUsV0FBTixHQUFnQixFQUFFLGVBQWUsR0FBRyxLQUFLLEVBQUUsU0FBUyxFQUFFLGNBQWUsR0FBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWEsR0FBRyxFQUFFLGNBQWMsRUFBRSxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsVUFBVSxHQUFJLEdBQUUsTUFBTyxHQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFVBQVUsQUFBRyxFQUFFLEVBQUUsYUFBUCxHQUFvQixDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsV0FBVyxHQUFJLEdBQUUsRUFBRSxFQUFFLEVBQUUsQUFBSSxFQUFFLEtBQUssWUFBWCxHQUFzQixNQUFPLEVBQUMsU0FBUyxFQUFFLGlCQUFpQixHQUFJLEdBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLFlBQVksQUFBSSxFQUFFLEtBQUssWUFBWCxFQUFxQixNQUFPLE9BQU8sR0FBRSxnQkFBZ0IsRUFBRSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsTUFBTyxHQUFFLGlCQUFrQixHQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsR0FBRyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRyxHQUFFLEVBQUUsRUFBRSxFQUFFLEFBQUksRUFBRSxLQUFLLFlBQVgsRUFBcUIsRUFBRSxHQUFHLEVBQUUsVUFBVyxHQUFFLEVBQUUsRUFBRSxFQUFFLEFBQUksRUFBRSxLQUFLLFlBQVgsR0FBc0IsRUFBRSxDQUFDLENBQUMsWUFBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLFlBQVksRUFBRSxLQUFLLFNBQVMsRUFBRSxLQUFLLFlBQVksRUFBRSxLQUFLLFVBQVUsRUFBRSxLQUFLLEtBQUssQ0FBQyxDQUFDLGFBQVksQ0FBQyxLQUFLLEtBQUssS0FBSyxLQUFLLE9BQU8sRUFBRSxLQUFLLFlBQVksS0FBSyxLQUFLLGlCQUFpQixFQUFFLEtBQUssWUFBWSxFQUFFLEtBQUssUUFBUSxFQUFFLEtBQUssS0FBSyxFQUFFLEtBQUssT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssV0FBVyxHQUFHLEtBQUssT0FBTyxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssT0FBTyxLQUFLLEtBQUssWUFBWSxFQUFFLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssTUFBTSxFQUFFLEtBQUssVUFBVSxFQUFFLEtBQUssVUFBVSxFQUFFLEtBQUssVUFBVSxFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssWUFBWSxFQUFFLEtBQUssYUFBYSxFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssZ0JBQWdCLEVBQUUsS0FBSyxTQUFTLEVBQUUsS0FBSyxZQUFZLEVBQUUsS0FBSyxVQUFVLEVBQUUsS0FBSyxZQUFZLEVBQUUsS0FBSyxpQkFBaUIsRUFBRSxLQUFLLGVBQWUsRUFBRSxLQUFLLE1BQU0sRUFBRSxLQUFLLFNBQVMsRUFBRSxLQUFLLFdBQVcsRUFBRSxLQUFLLFdBQVcsRUFBRSxLQUFLLFVBQVUsR0FBSSxHQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxVQUFVLEdBQUksR0FBRSxNQUFNLEVBQUcsR0FBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLFFBQVEsR0FBSSxHQUFFLE1BQU0sRUFBRyxHQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUUsS0FBSyxTQUFTLEVBQUUsR0FBRSxLQUFLLFNBQVMsRUFBRSxHQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxLQUFLLEtBQUssUUFBUSxLQUFLLEtBQUssU0FBUyxHQUFJLEdBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEtBQUssR0FBSSxHQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFFLEtBQUssSUFBSSxFQUFFLEtBQUssU0FBUyxFQUFFLEtBQUssU0FBUyxFQUFFLEtBQUssTUFBTSxHQUFJLEdBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUUsS0FBSyxLQUFLLEVBQUUsS0FBSyxNQUFNLEVBQUUsS0FBSyxZQUFZLEVBQUUsS0FBSyxTQUFTLEVBQUUsS0FBSyxNQUFNLEVBQUUsS0FBSyxRQUFRLEVBQUUsS0FBSyxXQUFXLEVBQUUsS0FBSyxRQUFRLEVBQUUsS0FBSyxPQUFPLEVBQUUsS0FBSyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQyxZQUFXLEVBQUUsQ0FBQyxHQUFJLEdBQUUsTUFBTyxJQUFHLEVBQUUsTUFBTyxHQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUcsR0FBRSxFQUFFLE9BQU8sUUFBUSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxHQUFJLEdBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sQUFBSSxFQUFFLE9BQU4sRUFBVyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxTQUFTLENBQUMsRUFBRSxHQUFHLEdBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFXLEVBQUUsQ0FBQyxHQUFJLEdBQUUsR0FBRSxDQUFDLEVBQUUsTUFBTyxLQUFJLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRSxPQUFPLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxlQUFlLEVBQUUsRUFBRSxPQUFPLFNBQVMsRUFBRSxXQUFXLEVBQUUsRUFBRSxPQUFPLFlBQVksRUFBRSxXQUFXLEVBQUUsRUFBRSxPQUFPLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxFQUFFLE9BQU8sVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLFlBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFPLEdBQUUsR0FBSSxHQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUksR0FBRSxHQUFHLEVBQUUsRUFBRyxHQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFJLEdBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsTUFBTyxJQUFFLEVBQUUsQ0FBQyxFQUFFLEFBQUksSUFBSixHQUFRLEdBQUUsR0FBRyxHQUFJLEdBQUUsR0FBSSxJQUFFLE1BQU8sR0FBRSxNQUFNLEdBQUcsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFVBQVUsR0FBRyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUcsSUFBRSxVQUFVLEVBQUUsR0FBRyxHQUFHLEVBQUUsT0FBTyxHQUFJLEdBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxHQUFJLEdBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEtBQUssR0FBSSxHQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxZQUFZLEdBQUcsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxZQUFZLEVBQUUsWUFBWSxHQUFJLEdBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBSSxJQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsTUFBTSxJQUFJLEVBQUUsRUFBRSxpQkFBaUIsR0FBSSxHQUFFLEVBQUUsaUJBQWlCLEtBQUssQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxHQUFFLENBQUMsRUFBRSxBQUFJLEVBQUUsWUFBTixHQUFpQixJQUFJLEVBQUUsTUFBTyxHQUFFLEdBQUcsQUFBSSxFQUFFLFlBQU4sRUFBZ0IsS0FBSyxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBSSxHQUFFLEVBQUUsWUFBWSxFQUFvSCxHQUE5RyxDQUFJLEVBQUUsV0FBTixHQUFnQixFQUFFLFVBQVUsSUFBSyxHQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxBQUFJLEVBQUUsS0FBSyxZQUFYLElBQWtDLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxPQUFPLEdBQUksR0FBRSxFQUFFLEVBQUUsRUFBRSxBQUFJLEVBQUUsS0FBSyxZQUFYLEdBQXNCLE1BQU8sRUFBQyxDQUFDLE1BQU8sR0FBRSxPQUFPLEVBQUUsSUFBSSxFQUFHLEdBQUUsRUFBRSxFQUFFLEVBQUUsQUFBSSxFQUFFLEtBQUssWUFBWCxFQUFxQixFQUFFLEdBQUksR0FBRSxTQUFTLEVBQUUsYUFBYyxHQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUksSUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUMsRUFBRSxHQUFJLElBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFDLEVBQUUsR0FBSSxJQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBQyxFQUFFLEdBQUksSUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUMsRUFBRSxHQUFJLElBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFDLEVBQUUsR0FBSSxJQUFFLEVBQUUsR0FBRyxJQUFJLElBQUksRUFBQyxFQUFFLEdBQUksSUFBRSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUMsRUFBRSxHQUFJLElBQUUsR0FBRyxJQUFJLElBQUksS0FBSyxFQUFDLEVBQUUsR0FBSSxJQUFFLEdBQUcsSUFBSSxJQUFJLEtBQUssRUFBQyxDQUFDLEVBQUUsRUFBRSxZQUFZLFNBQVMsRUFBRSxFQUFFLENBQUMsTUFBTyxJQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLGFBQWEsR0FBRSxFQUFFLGFBQWEsR0FBRSxFQUFFLGlCQUFpQixHQUFFLEVBQUUsaUJBQWlCLFNBQVMsRUFBRSxFQUFFLENBQUMsTUFBTyxJQUFHLEVBQUUsTUFBTSxBQUFJLEVBQUUsTUFBTSxPQUFaLEVBQWlCLEVBQUcsR0FBRSxNQUFNLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxNQUFPLEdBQUUsR0FBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQUFBSSxFQUFFLFdBQU4sR0FBZ0IsQUFBTSxFQUFFLFNBQVIsS0FBZ0IsSUFBSSxFQUFFLE1BQU8sSUFBRSxFQUFFLEFBQUksRUFBRSxZQUFOLEVBQWdCLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxBQUFJLEVBQUUsT0FBTixFQUFXLEVBQUUsTUFBTSxFQUFFLEdBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRSxFQUFFLEdBQUcsRUFBRSxHQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBUSxJQUFFLEVBQUcsR0FBRSxPQUFPLEtBQUssRUFBRSxHQUFJLEdBQUUsT0FBTyxLQUFLLEVBQUUsR0FBSSxHQUFFLE9BQU8sTUFBTSxFQUFFLEdBQUksR0FBRSxPQUFPLEtBQUssRUFBRSxHQUFJLEdBQUUsT0FBTyxRQUFRLEdBQUcsRUFBRSxFQUFFLEdBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxJQUFJLEVBQUUsR0FBRSxFQUFFLEVBQUUsT0FBTyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUUsRUFBRSxFQUFFLE9BQU8sTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFFLEVBQUUsRUFBRSxPQUFPLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRSxFQUFFLEFBQUksRUFBRSxRQUFOLEVBQVksRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxPQUFPLEVBQUUsT0FBTyxNQUFNLFFBQVMsSUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLE1BQU0sTUFBTSxFQUFFLEdBQUUsRUFBRSxFQUFFLE9BQU8sTUFBTSxRQUFRLEVBQUUsR0FBRyxHQUFHLEVBQUUsT0FBTyxNQUFPLEdBQUUsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sSUFBSyxJQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLENBQUMsRUFBRSxHQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLEFBQUksRUFBRSxRQUFOLEVBQVks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LGFBQWEsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsWUFBWSxFQUFFLFdBQVcsR0FBSSxHQUFFLEVBQUUsRUFBRSxFQUFFLEFBQUksRUFBRSxLQUFLLFlBQVgsR0FBc0IsTUFBTyxFQUFDLENBQUMsTUFBTyxHQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUcsR0FBRSxFQUFFLEVBQUUsRUFBRSxBQUFJLEVBQUUsS0FBSyxZQUFYLEVBQXFCLEVBQUUsR0FBRyxFQUFFLFVBQVcsR0FBRSxFQUFFLEVBQUUsRUFBRSxBQUFJLEVBQUUsS0FBSyxZQUFYLEdBQXNCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEFBQUksRUFBRSxXQUFOLEVBQWUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFRLEdBQUUsRUFBRSxFQUFFLEdBQUUsR0FBRSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxHQUFFLENBQUMsRUFBRSxFQUFFLFdBQVcsR0FBRyxJQUFJLEVBQUUsTUFBTyxHQUFFLEdBQUcsQUFBSSxFQUFFLFlBQU4sRUFBZ0IsS0FBSyxDQUFDLEdBQUcsRUFBRSxhQUFhLEVBQUUsRUFBRSxXQUFXLEdBQUcsRUFBRSxFQUFFLFVBQVcsR0FBRSxHQUFFLEVBQUUsRUFBRSxTQUFTLE1BQU0sR0FBRSxFQUFFLElBQUksSUFBSSxHQUFFLEVBQUUsSUFBSSxJQUFJLEdBQUUsRUFBRSxHQUFHLENBQUMsR0FBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLE9BQVEsSUFBSSxHQUFFLEVBQUUsSUFBSSxJQUFJLEdBQUUsRUFBRSxJQUFJLElBQUksR0FBRSxFQUFFLElBQUksSUFBSSxHQUFFLEVBQUUsSUFBSSxJQUFJLEdBQUUsRUFBRSxJQUFJLElBQUksR0FBRSxFQUFFLElBQUksSUFBSSxHQUFFLEVBQUUsSUFBSSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsSUFBRyxFQUFFLGFBQWEsRUFBRyxJQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsV0FBWSxHQUFFLGFBQWEsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGNBQWMsRUFBRyxHQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxhQUFhLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxhQUFhLEdBQUksR0FBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLFlBQVksRUFBRSxZQUFZLEdBQUksR0FBRSxFQUFFLEVBQUUsRUFBRSxBQUFJLEVBQUUsS0FBSyxZQUFYLEdBQXNCLE1BQU8sRUFBQyxDQUFDLE1BQU8sR0FBRSxPQUFPLEVBQUUsSUFBSSxFQUFHLEdBQUUsRUFBRSxFQUFFLEVBQUUsQUFBSSxFQUFFLEtBQUssWUFBWCxFQUFxQixFQUFFLEdBQUcsRUFBRSxVQUFXLEdBQUUsRUFBRSxFQUFFLEVBQUUsQUFBSSxFQUFFLEtBQUssWUFBWCxHQUFzQixFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBSSxHQUFFLE9BQU8sS0FBSyxJQUFJLEdBQUcsSUFBSSxFQUFFLE1BQU8sQUFBSSxHQUFFLFlBQU4sR0FBa0IsR0FBRSxXQUFXLElBQUksRUFBRSxHQUFHLElBQUksR0FBSSxDQUFJLElBQUosRUFBTSxFQUFFLFVBQVUsQ0FBQyxFQUFFLEFBQUksSUFBSixHQUFRLEdBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxBQUFJLElBQUosR0FBUSxJQUFFLEVBQUUsSUFBSSxFQUFFLEFBQUksRUFBRSxZQUFOLEdBQWtCLEdBQUUsU0FBUyxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsT0FBTyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEFBQUksRUFBRSxZQUFOLEdBQWlCLE1BQU8sR0FBRSxXQUFXLEdBQUcsQ0FBQyxDQUFDLE1BQU8sS0FBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRyxDQUFJLEVBQUUsT0FBTixFQUFZLElBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRSxFQUFFLEVBQUUsT0FBTyxHQUFHLEdBQUcsRUFBRSxHQUFFLEVBQUUsRUFBRSxPQUFPLEdBQUcsR0FBRyxFQUFFLEdBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRSxFQUFFLEVBQUUsVUFBVSxHQUFHLEdBQUcsRUFBRSxHQUFFLEVBQUUsRUFBRSxVQUFVLEdBQUcsR0FBRyxHQUFJLEdBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFPLEdBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxBQUFJLEVBQUUsVUFBTixFQUFjLEVBQUUsRUFBRSxFQUFFLEVBQUUsV0FBVyxTQUFTLEVBQUUsQ0FBQyxHQUFJLEdBQUUsTUFBTyxJQUFHLEVBQUUsTUFBTyxHQUFFLEVBQUUsTUFBTSxVQUFVLEdBQUcsQUFBSyxJQUFMLElBQVEsQUFBSyxJQUFMLElBQVEsQUFBSyxJQUFMLElBQVEsQUFBTSxJQUFOLEtBQVMsSUFBSSxHQUFHLEFBQU0sSUFBTixJQUFRLEdBQUUsRUFBRSxDQUFDLEVBQUcsR0FBRSxNQUFNLEtBQUssSUFBSSxFQUFFLEdBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxxQkFBcUIsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBZ0MsR0FBdEIsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFrQixBQUFLLEdBQUcsR0FBRSxFQUFFLE9BQU8sUUFBbkIsR0FBMEIsQUFBSSxJQUFKLEdBQU8sRUFBRSxTQUFTLEdBQUcsRUFBRSxVQUFVLE1BQU8sR0FBRSxJQUFJLEFBQUksSUFBSixHQUFRLEdBQUUsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFTLENBQUksSUFBSixHQUFRLElBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxPQUFPLEdBQUcsRUFBRSxHQUFJLEdBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUUsQ0FBQyxFQUFFLEVBQUUsV0FBVyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsVUFBVyxHQUFFLEdBQUcsRUFBRSxNQUFPLEdBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTyxHQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLFlBQVksb0NBQW9DLEVBQUUsQ0FBQyxrQkFBa0IsR0FBRyxZQUFZLEdBQUcsVUFBVSxHQUFHLGFBQWEsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLFFBQVEsVUFBVSxDQUFDLEtBQUssS0FBSyxFQUFFLEtBQUssS0FBSyxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssR0FBRyxFQUFFLEtBQUssTUFBTSxLQUFLLEtBQUssVUFBVSxFQUFFLEtBQUssS0FBSyxHQUFHLEtBQUssUUFBUSxHQUFHLEtBQUssS0FBSyxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxRQUFRLFNBQVMsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRyxHQUFFLFNBQVMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUcsR0FBRSxFQUFFLFdBQVcsRUFBRSxFQUFHLEdBQUUsVUFBVSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUcsSUFBRyxFQUFFLFNBQVMsRUFBRSxFQUFHLElBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFLLElBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxLQUFLLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxBQUFLLEdBQUUsSUFBSSxHQUFHLE9BQWQsRUFBbUIsRUFBRSxLQUFLLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBRSxJQUFHLEdBQUcsQ0FBQyxHQUFHLEFBQUksSUFBRyxJQUFQLEVBQVUsQ0FBQyxFQUFFLEVBQUcsT0FBTSxHQUFJLEdBQUcsSUFBRyxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEdBQUcsT0FBTyxDQUFDLEVBQUUsSUFBSSw4QkFBOEIsRUFBRSxLQUFLLEdBQUcsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFHLElBQUcsS0FBTSxHQUFFLEdBQUksSUFBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFHLElBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFLLElBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxLQUFLLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFFLElBQUksR0FBRSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQUFBSSxJQUFHLElBQVAsRUFBVSxDQUFDLEVBQUUsRUFBRyxPQUFNLEdBQUksR0FBRyxJQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRSxJQUFJLHdCQUF3QixFQUFFLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFHLElBQUcsS0FBTSxJQUFHLEVBQUUsTUFBTSxFQUFHLElBQUcsR0FBRyxHQUFJLElBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUcsSUFBRyxFQUFHLElBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxJQUFJLGdDQUFnQyxFQUFFLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFHLEdBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUcsR0FBRSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLGdDQUFnQyxFQUFFLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUcsR0FBRSxLQUFLLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUcsSUFBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxFQUFFLEdBQUksR0FBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUksR0FBRSxLQUFLLEVBQUUsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFHLElBQUcsSUFBSSxDQUFDLEdBQUksR0FBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUksR0FBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFJLElBQUksSUFBRyxHQUFHLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUcsR0FBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSyxHQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFJLEdBQUUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFPLEtBQUksR0FBRyxLQUFNLEtBQUksRUFBRSxPQUFTLFFBQU0sSUFBSSxHQUFLLE1BQUksSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxFQUFFLEtBQUssS0FBSyxHQUFHLEtBQUssS0FBSyxFQUFFLEtBQUssU0FBUyxHQUFHLEtBQUssTUFBTSxFQUFFLEtBQUssS0FBSyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssS0FBSyxLQUFLLEtBQUssTUFBTSxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssT0FBTyxLQUFLLEtBQUssS0FBSyxFQUFFLEtBQUssS0FBSyxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssUUFBUSxLQUFLLEtBQUssU0FBUyxLQUFLLEtBQUssUUFBUSxFQUFFLEtBQUssU0FBUyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssS0FBSyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssS0FBSyxFQUFFLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFJLEdBQUUsTUFBTSxHQUFHLEVBQUUsS0FBSyxLQUFLLEdBQUksR0FBRSxNQUFNLEdBQUcsRUFBRSxLQUFLLE9BQU8sS0FBSyxLQUFLLFFBQVEsS0FBSyxLQUFLLEtBQUssRUFBRSxLQUFLLEtBQUssRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUksR0FBRSxNQUFPLElBQUcsRUFBRSxNQUFPLEdBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxNQUFPLEdBQUUsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEdBQUksR0FBRSxNQUFNLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxRQUFRLEdBQUksR0FBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFJLEdBQUUsTUFBTyxJQUFHLEVBQUUsTUFBUSxJQUFFLEVBQUUsT0FBTyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsTUFBTyxJQUFHLEVBQUUsTUFBTyxHQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUcsR0FBRSxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRyxJQUFHLEdBQUcsRUFBRSxJQUFLLElBQUcsS0FBSyxHQUFJLEdBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRyxDQUFPLEVBQUUsU0FBVCxNQUFpQixFQUFFLFFBQVEsR0FBSSxHQUFFLE9BQU8sTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxNQUFPLEdBQUcsR0FBRSxHQUFJLEdBQUcsR0FBRSxNQUFNLEdBQUcsT0FBTyxLQUFNLEdBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFJLEdBQUUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFJLEdBQUUsSUFBSSxFQUFFLEdBQUksR0FBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEdBQUksR0FBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTyxBQUFPLEdBQUUsU0FBVCxNQUFrQixHQUFFLE1BQU0sR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEdBQUksR0FBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFBRSxNQUFPLEdBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQVEsR0FBRyxHQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVMsR0FBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRyxJQUFHLEdBQUksR0FBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFRLEdBQUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQVEsR0FBRSxNQUFNLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBUSxHQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsRUFBRSxjQUFjLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLFlBQVksU0FBUyxFQUFFLENBQUMsTUFBTyxHQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxhQUFhLEVBQUUsRUFBRSxRQUFRLFNBQVMsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUUsRUFBRSxHQUFFLEVBQUUsRUFBRSxHQUFFLEVBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFJLEdBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxBQUFJLEVBQUUsV0FBTixFQUFlLE1BQU8sR0FBRSxBQUFNLEdBQUUsRUFBRSxPQUFPLE9BQWpCLElBQXdCLEdBQUUsS0FBSyxJQUFJLEdBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEdBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEdBQUUsRUFBRSxFQUFFLEdBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxPQUFPLEVBQUUsVUFBVyxHQUFFLEdBQUcsQUFBSSxFQUFFLE9BQU4sRUFBVyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQUFBSSxJQUFKLEVBQU0sUUFBUSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxBQUFRLElBQVIsTUFBVSxDQUFDLEVBQUUsRUFBRSxNQUFNLEdBQUcsSUFBSSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLE1BQU8sR0FBRSxLQUFLLEtBQUssSUFBSSxDQUFFLEdBQUUsRUFBRSxPQUFVLE9BQUksSUFBSSxHQUFJLElBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLHlCQUF5QixFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxBQUFJLElBQUcsSUFBUCxFQUFVLENBQUMsRUFBRSxJQUFJLDZCQUE2QixFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFHLElBQUksTUFBSyxJQUFJLEFBQUksRUFBRSxRQUFOLEVBQVksRUFBRSxNQUFNLFVBQVUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLElBQUksc0JBQXNCLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxFQUFFLEtBQUssR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxVQUFXLEdBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEFBQUksSUFBSixFQUFNLFFBQVEsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQUFBSSxLQUFJLEVBQUUsUUFBVixFQUFpQixDQUFDLEVBQUUsSUFBSSw2QkFBNkIsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLElBQUksMkJBQTJCLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxFQUFFLE1BQU8sR0FBRSxLQUFLLEtBQUssR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQVEsR0FBRSxHQUFHLElBQUksRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLE1BQU8sR0FBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQUFBSSxJQUFKLEVBQU0sUUFBUSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFPLEdBQUUsS0FBSyxLQUFLLEdBQUcsSUFBSSxFQUFFLE9BQVEsR0FBRSxHQUFHLElBQUksRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssTUFBTyxHQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxBQUFJLElBQUosRUFBTSxRQUFRLElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU8sR0FBRSxLQUFLLE9BQU8sSUFBSSxFQUFFLEVBQUUsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsT0FBUSxHQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssTUFBTyxHQUFFLEdBQUcsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQUFBSSxJQUFKLEVBQU0sUUFBUSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxNQUFPLEdBQUUsS0FBSyxVQUFVLEdBQUcsSUFBSSxFQUFFLE9BQVEsR0FBRSxHQUFHLElBQUksRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsS0FBTSxHQUFFLE1BQU8sR0FBRSxLQUFLLE1BQU0sTUFBTSxFQUFFLEtBQUssTUFBTyxHQUFFLEdBQUcsS0FBSyxFQUFFLE9BQVEsR0FBRyxHQUFFLEVBQUUsU0FBVSxHQUFFLEdBQUcsR0FBSSxHQUFFLE1BQU8sR0FBRSxFQUFFLEtBQUssVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLE9BQVEsR0FBRSxLQUFLLE1BQU0sR0FBSSxPQUFNLEVBQUUsS0FBSyxTQUFTLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsT0FBUSxHQUFFLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsUUFBUSxHQUFHLEVBQUUsUUFBUSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsS0FBSyxNQUFPLEdBQUUsR0FBRyxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQUFBSSxJQUFKLEVBQU0sUUFBUSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsT0FBTyxPQUFRLEdBQUUsS0FBSyxNQUFNLE9BQU8sYUFBYSxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxPQUFRLEdBQUUsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxPQUFPLEtBQU0sR0FBRSxNQUFPLEdBQUUsS0FBSyxLQUFLLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxLQUFLLE1BQU8sR0FBRSxHQUFHLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxBQUFJLElBQUosRUFBTSxRQUFRLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxPQUFPLE9BQVEsR0FBRSxLQUFLLFNBQVMsT0FBTyxhQUFhLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLE9BQVEsR0FBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLE9BQU8sS0FBTSxHQUFFLE1BQU8sR0FBRSxLQUFLLFFBQVEsTUFBTSxFQUFFLEtBQUssTUFBTyxHQUFFLEdBQUcsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQUFBSSxJQUFKLEVBQU0sUUFBUSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFLLE9BQU0sRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFJLHNCQUFzQixFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU8sR0FBRSxLQUFLLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssS0FBSyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssR0FBRyxVQUFXLElBQUcsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEFBQUksSUFBSixFQUFNLFFBQVEsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLE9BQVEsSUFBRyxHQUFHLEFBQUksRUFBRSxXQUFOLEVBQWUsTUFBTyxHQUFFLFNBQVMsR0FBRSxFQUFFLFVBQVUsR0FBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssT0FBUSxJQUFHLEdBQUcsQUFBSSxJQUFKLEdBQU8sQUFBSSxJQUFKLEVBQU0sWUFBYSxJQUFHLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxBQUFJLElBQUosRUFBTSxRQUFRLElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUcsTUFBSyxRQUFTLEdBQUUsRUFBRSxLQUFLLEdBQUcsVUFBVyxHQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLEdBQUcsQUFBSSxJQUFKLEVBQU0sTUFBTSxLQUFLLEVBQUUsR0FBRyxFQUFFLFlBQWEsR0FBRSxFQUFFLEtBQUssR0FBRyxVQUFXLEdBQUUsRUFBRSxJQUFJLHFCQUFxQixFQUFFLEtBQUssR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLFVBQVcsSUFBRyxJQUFJLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQUFBSSxJQUFKLEVBQU0sUUFBUSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBSSxPQUFNLElBQUssS0FBSSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksK0JBQStCLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsQUFBSSxJQUFKLEVBQU0sWUFBYSxJQUFHLEVBQUUsS0FBSyxPQUFRLElBQUcsR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFJLEdBQUUsR0FBRyxHQUFFLEdBQUksR0FBRSxJQUFHLEFBQUksSUFBSixFQUFNLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLEdBQUcsVUFBVyxJQUFHLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxBQUFJLElBQUosRUFBTSxRQUFRLElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxJQUFLLElBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFHLElBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFHLElBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLHNDQUFzQyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLE9BQVEsSUFBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQUFBSSxJQUFKLEVBQU0sUUFBUSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSwyQkFBMkIsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxPQUFRLElBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssR0FBRyxHQUFFLEVBQUUsUUFBUSxFQUFHLElBQUcsRUFBRSxTQUFTLE1BQU0sR0FBRyxJQUFJLEdBQUUsTUFBTSxFQUFFLENBQUcsS0FBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQUFBSSxJQUFKLEVBQU0sUUFBUSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFFLEdBQUcsS0FBSyxHQUFFLEdBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxRQUFRLE9BQU0sQ0FBQyxHQUFHLEFBQUssS0FBTCxHQUFPLENBQUMsSUFBSSxFQUFFLEdBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEFBQUksSUFBSixFQUFNLFFBQVEsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFFLEdBQUcsR0FBRSxBQUFJLEVBQUUsT0FBTixFQUFXLENBQUMsRUFBRSxJQUFJLDRCQUE0QixFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUcsRUFBRSxFQUFHLEdBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDLFNBQVMsQUFBSyxLQUFMLEdBQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQUFBSSxJQUFKLEVBQU0sUUFBUSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUcsR0FBRyxNQUFLLEtBQUksS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEFBQUksSUFBSixFQUFNLFFBQVEsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRSxFQUFFLEVBQUUsRUFBRSxHQUFJLEtBQUssTUFBSyxLQUFJLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLElBQUksNEJBQTRCLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEFBQUssRUFBRSxPQUFQLEdBQVksTUFBTSxHQUFHLEFBQUksRUFBRSxLQUFLLE9BQVgsRUFBZ0IsQ0FBQyxFQUFFLElBQUksdUNBQXVDLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSw4QkFBOEIsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSx3QkFBd0IsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQUFBSSxJQUFKLEVBQU0sWUFBYSxJQUFHLEVBQUUsS0FBSyxPQUFRLElBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFFLENBQUMsRUFBRSxTQUFTLEdBQUUsRUFBRSxVQUFVLEdBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsT0FBTyxHQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxBQUFLLEVBQUUsT0FBUCxJQUFjLEdBQUUsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRSxFQUFFLFFBQVEsRUFBRyxJQUFHLEVBQUUsU0FBUyxNQUFNLEdBQUcsSUFBSSxHQUFFLE1BQU0sRUFBRSxDQUFHLEtBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEFBQUksSUFBSixFQUFNLFFBQVEsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBRyxBQUFJLEtBQUksS0FBUixFQUFXLENBQUMsSUFBSSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFHLEdBQUUsRUFBRSxRQUFRLEdBQUksSUFBRyxJQUFHLEdBQUUsSUFBRyxJQUFJLFFBQU8sR0FBRyxJQUFJLEdBQUUsTUFBTSxFQUFFLENBQUUsSUFBRyxJQUFFLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxBQUFJLElBQUosRUFBTSxRQUFRLElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUUsR0FBRyxHQUFFLEVBQUUsTUFBTSxFQUFDLENBQUMsR0FBRyxLQUFLLEdBQUUsR0FBRyxHQUFFLEVBQUUsTUFBTSxHQUFFLEVBQUUsT0FBTyxHQUFFLEFBQUksS0FBSixFQUFNLENBQUMsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFFLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFFLENBQUMsRUFBRSxJQUFJLDhCQUE4QixFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssT0FBUSxJQUFHLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEFBQUksSUFBSixFQUFNLFFBQVEsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFHLElBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLE9BQVEsSUFBRyxLQUFLLEdBQUcsR0FBRSxFQUFFLFNBQVMsRUFBRyxJQUFHLEVBQUUsVUFBVSxNQUFNLEdBQUcsSUFBSSxHQUFFLE1BQU0sRUFBRSxDQUFHLEtBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEFBQUksSUFBSixFQUFNLFFBQVEsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQUFBSSxLQUFJLEtBQVIsRUFBVyxDQUFDLElBQUksR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRyxHQUFFLEVBQUUsU0FBUyxHQUFJLElBQUcsSUFBRyxHQUFFLElBQUcsSUFBSSxRQUFPLEdBQUcsSUFBSSxHQUFFLE1BQU0sRUFBRSxDQUFFLElBQUcsSUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQUFBSSxJQUFKLEVBQU0sUUFBUSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFFLEdBQUcsR0FBRSxFQUFFLE1BQU0sRUFBQyxDQUFDLEdBQUcsS0FBSyxHQUFFLEdBQUcsR0FBRSxFQUFFLE1BQU0sR0FBRSxHQUFHLEdBQUUsQ0FBQyxFQUFFLElBQUksd0JBQXdCLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxFQUFFLE9BQU8sR0FBRSxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxPQUFRLElBQUcsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQUFBSSxJQUFKLEVBQU0sUUFBUSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUcsSUFBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLGdDQUFnQyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsRUFBRSxLQUFLLE9BQVEsSUFBRyxHQUFHLEFBQUksS0FBSixFQUFNLFFBQVEsR0FBRyxFQUFFLEVBQUUsR0FBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLGdDQUFnQyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRSxFQUFFLEVBQUUsTUFBTyxJQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsUUFBUyxHQUFFLEVBQUUsUUFBUSxHQUFFLEVBQUUsTUFBTSxLQUFNLElBQUUsRUFBRSxHQUFFLEdBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLElBQUksR0FBRSxHQUFJLEdBQUUsSUFBRyxJQUFHLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxNQUFLLEdBQUUsTUFBSyxFQUFFLEdBQUcsQ0FBQyxBQUFJLEVBQUUsU0FBTixHQUFlLEdBQUUsS0FBSyxJQUFJLFVBQVcsSUFBRyxHQUFHLEFBQUksS0FBSixFQUFNLFFBQVEsRUFBRSxNQUFLLEVBQUUsT0FBTyxLQUFJLEVBQUUsS0FBSyxHQUFHLFVBQVcsSUFBRyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxBQUFJLElBQUosRUFBTSxRQUFRLElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFJLEdBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSx1QkFBdUIsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLE9BQVEsSUFBRyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQUFBSSxJQUFKLEVBQU0sUUFBUSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFLLFlBQVcsRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFJLHlCQUF5QixFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssT0FBUSxJQUFHLEVBQUUsRUFBRSxZQUFhLElBQUcsRUFBRSxHQUFHLFlBQWEsSUFBRyxNQUFNLE9BQVEsWUFBVyxNQUFPLEdBQUUsTUFBTyxHQUFFLFNBQVMsR0FBRSxFQUFFLFVBQVUsR0FBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRyxHQUFFLE9BQU8sSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLElBQUssR0FBRSxLQUFLLElBQUksQUFBSSxJQUFKLEtBQVMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRyxHQUFFLEtBQUssR0FBRyxJQUFLLEtBQUcsRUFBRSxTQUFTLEdBQUcsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsTUFBTSxHQUFJLEdBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQU0sR0FBRSxLQUFLLEdBQUcsR0FBSSxDQUFLLEVBQUUsT0FBUCxHQUFZLElBQUksR0FBSSxDQUFLLEVBQUUsT0FBUCxJQUFhLEFBQUssRUFBRSxPQUFQLEdBQVksSUFBSSxHQUFJLENBQUcsSUFBSCxHQUFNLEFBQUksSUFBSixHQUFPLEFBQUksSUFBSixJQUFRLElBQUksR0FBSSxHQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxNQUFPLEdBQUUsR0FBSSxHQUFFLEVBQUUsTUFBTSxNQUFPLEdBQUUsUUFBUyxHQUFFLE9BQU8sTUFBTSxFQUFFLE1BQU0sS0FBSyxDQUFDLEVBQUUsRUFBRSxpQkFBaUIsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsTUFBTyxJQUFHLEVBQUUsTUFBTSxBQUFJLEdBQUcsR0FBRSxFQUFFLE9BQU8sT0FBbEIsRUFBd0IsRUFBSSxJQUFFLEtBQUssR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxxQkFBcUIsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLE9BQU8sTUFBTyxJQUFHLEVBQUUsTUFBTSxBQUFLLEdBQUUsRUFBRSxPQUFPLE9BQWhCLEdBQXNCLEFBQUssRUFBRSxPQUFQLEdBQVksRUFBRSxBQUFLLEVBQUUsT0FBUCxJQUFhLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFHLEdBQUUsS0FBSyxHQUFHLElBQUssR0FBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxZQUFZLG9DQUFvQyxFQUFFLENBQUMsa0JBQWtCLEdBQUcsWUFBWSxHQUFHLFVBQVUsR0FBRyxZQUFZLEdBQUcsYUFBYSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBSSxHQUFFLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxNQUFNLE1BQU0sTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxRQUFRLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUUsRUFBRSxFQUFFLEdBQUksR0FBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUksR0FBRSxNQUFNLEVBQUUsRUFBRSxHQUFFLEtBQUssR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxBQUFJLEVBQUUsS0FBTixFQUFTLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBSSxHQUFFLEdBQUcsQUFBSSxJQUFKLEVBQU0sTUFBTyxHQUFFLEtBQUssU0FBUyxFQUFFLEtBQUssU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxBQUFJLEVBQUUsS0FBTixFQUFTLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBSSxHQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUcsSUFBRyxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUksQ0FBSSxJQUFKLEdBQU8sQUFBSSxJQUFKLEdBQU8sTUFBTSxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQUFBSSxFQUFFLEVBQUUsS0FBUixHQUFhLEdBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxHQUFHLEdBQUcsRUFBRSxBQUFJLElBQUosRUFBTyxHQUFFLEdBQUUsRUFBRSxJQUFJLEFBQUksSUFBSixFQUFPLEdBQUUsRUFBRSxJQUFHLElBQUksR0FBRSxFQUFFLElBQUcsSUFBSSxLQUFNLEdBQUUsRUFBRSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUcsSUFBRSxHQUFJLEdBQUUsSUFBSSxFQUFFLEFBQUksSUFBSixHQUFPLElBQUksSUFBRyxBQUFJLElBQUosR0FBTyxJQUFJLEdBQUUsTUFBTyxHQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUcsR0FBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRyxHQUFFLEdBQUUsR0FBRSxFQUFFLElBQUksRUFBRSxHQUFFLEVBQUUsS0FBTSxHQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFHLElBQUcsSUFBSSxJQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsQUFBSSxJQUFKLEdBQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEFBQUksSUFBSixFQUFPLElBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxBQUFHLEVBQUUsRUFBRSxJQUFQLEVBQVUsQ0FBQyxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFJLEdBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxBQUFJLEtBQUosR0FBUSxJQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBSSxHQUFFLEVBQUUsSUFBRyxFQUFFLEdBQUUsR0FBRyxDQUFHLEtBQUcsRUFBRSxFQUFFLE1BQUssSUFBSSxJQUFJLElBQUksRUFBRSxHQUFHLElBQUcsR0FBRyxFQUFFLEFBQUksSUFBSixHQUFPLElBQUksSUFBRyxBQUFJLElBQUosR0FBTyxJQUFJLEdBQUUsTUFBTyxHQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTyxBQUFJLEtBQUosR0FBUSxHQUFFLEVBQUUsR0FBRyxFQUFFLElBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsR0FBRyxLQUFLLGFBQWEsS0FBSyxlQUFlLEtBQUssYUFBYSxLQUFLLHNCQUFzQixLQUFLLGVBQWUsS0FBSyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFJLEdBQUUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLE9BQVEsR0FBRSxFQUFFLE9BQU8sR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBSSxPQUFNLEVBQUcsR0FBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBSSxHQUFFLEdBQUksT0FBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFJLEdBQUUsR0FBSSxPQUFNLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFJLEdBQUUsR0FBSSxPQUFNLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFJLEdBQUUsR0FBSSxPQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFJLEdBQUUsRUFBRSxHQUFFLEVBQUUsR0FBSSxPQUFNLENBQUMsRUFBRSxZQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssWUFBWSxFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssVUFBVSxHQUFHLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsS0FBSyxTQUFTLEVBQUUsS0FBSyxTQUFTLEVBQUUsS0FBSyxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFPLEdBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFLLEtBQUksR0FBRyxDQUFDLFlBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsV0FBVyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsV0FBVyxJQUFJLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFHLEdBQUUsUUFBUSxHQUFHLEVBQUUsU0FBUyxNQUFNLEdBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFJLEdBQUUsUUFBUSxHQUFHLEVBQUUsU0FBUyxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFXLEVBQUUsRUFBRSxDQUFDLE9BQVEsR0FBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxNQUFPLEtBQUksQ0FBQyxDQUFDLFlBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLEdBQUksT0FBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBSSxHQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQUFBSSxJQUFKLEdBQVEsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFXLEVBQUUsQ0FBQyxHQUFJLEdBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxZQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsU0FBUyxHQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFVBQVcsR0FBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxZQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU8sR0FBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBUSxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxVQUFXLEdBQUUsRUFBRSxVQUFVLEdBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxHQUFHLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLEtBQUssSUFBSSxFQUFFLEtBQUssR0FBRyxFQUFFLEtBQUssR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxZQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEFBQUksRUFBRSxXQUFOLEVBQWUsS0FBSyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sR0FBRyxJQUFJLEFBQUksSUFBSixFQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRyxHQUFFLEVBQUcsR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxBQUFLLEdBQUUsRUFBRSxNQUFULEdBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxBQUFLLEdBQUUsRUFBRSxNQUFULEdBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVcsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsVUFBVSxZQUFZLEVBQUUsRUFBRSxVQUFVLFVBQVUsRUFBRSxFQUFFLFVBQVUsTUFBTSxHQUFFLEdBQUcsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQUFBSSxFQUFFLEVBQUUsS0FBUixFQUFZLEdBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxHQUFFLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FBRyxFQUFFLEVBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsR0FBRSxFQUFFLEVBQUUsR0FBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLFVBQVUsR0FBSSxHQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsU0FBUyxHQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsWUFBWSxHQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sR0FBSSxHQUFFLE1BQU0sSUFBSSxFQUFFLE1BQU0sR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLE1BQU0sSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLElBQUksR0FBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxHQUFHLFNBQVMsR0FBRSxHQUFFLENBQUMsR0FBSSxJQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsU0FBUyxHQUFFLEdBQUUsU0FBUyxHQUFFLEdBQUUsVUFBVSxZQUFZLEdBQUUsR0FBRSxVQUFVLFVBQVUsR0FBRSxHQUFFLFVBQVUsV0FBVyxHQUFFLEdBQUUsVUFBVSxXQUFXLEdBQUUsR0FBRSxVQUFVLFdBQVcsR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUcsRUFBRSxLQUFJLEdBQUUsU0FBUyxJQUFHLEVBQUUsSUFBSSxHQUFFLEVBQUUsR0FBRSxLQUFLLEdBQUUsVUFBVSxHQUFHLEVBQUUsR0FBRSxHQUFFLFNBQVMsRUFBRSxHQUFFLEVBQUUsS0FBSSxHQUFHLElBQUUsR0FBRSxFQUFFLEdBQUUsRUFBRyxJQUFFLEdBQUUsS0FBSyxLQUFJLEdBQUcsR0FBRyxJQUFLLElBQUUsR0FBRSxNQUFLLEdBQUUsRUFBRSxHQUFFLEdBQUcsR0FBRSxHQUFFLElBQUksSUFBRSxTQUFTLE1BQUssR0FBRSxFQUFFLElBQUcsSUFBSSxJQUFFLEdBQUUsR0FBRSxLQUFJLEdBQUUsR0FBRSxFQUFFLElBQUcsR0FBRSxTQUFTLEdBQUcsSUFBRSxJQUFHLElBQUksSUFBRSxZQUFZLEdBQUcsSUFBRSxFQUFFLEdBQUUsR0FBRyxNQUFLLEdBQUcsQUFBSSxLQUFKLEVBQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFFLEdBQUUsRUFBRSxBQUFJLEdBQUUsU0FBUyxNQUFmLEdBQW1CLEtBQUksR0FBRSxTQUFTLE1BQUssR0FBRSxTQUFTLEdBQUUsSUFBSSxFQUFFLEdBQUUsU0FBUyxNQUFLLElBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBRyxJQUFJLEdBQUUsR0FBRSxBQUFJLEtBQUosRUFBTSxLQUFJLElBQUksR0FBRSxHQUFFLFNBQVMsSUFBRyxBQUFJLEtBQUosR0FBTyxHQUFHLElBQUUsR0FBRSxLQUFLLEVBQUUsTUFBTSxJQUFFLEVBQUUsR0FBRSxLQUFLLElBQUksSUFBRSxTQUFVLElBQUUsR0FBRSxFQUFFLEdBQUUsSUFBSSxHQUFFLEVBQUUsSUFBRyxHQUFFLEVBQUUsR0FBRSxHQUFHLElBQUcsS0FBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLEdBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRSxFQUFFLElBQUksQUFBSSxJQUFKLEdBQVEsR0FBRSxJQUFJLEdBQUUsR0FBRyxFQUFFLEVBQUcsR0FBRSxHQUFHLEdBQUcsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFHLEdBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBSSxHQUFFLEdBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEFBQUksSUFBSixFQUFPLEtBQUksR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxHQUFFLEtBQUssRUFBRyxHQUFFLElBQUksR0FBRyxJQUFJLEVBQUcsR0FBRSxFQUFFLEdBQUksR0FBRSxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRSxFQUFFLElBQUksQUFBSSxJQUFKLEdBQVEsR0FBRSxJQUFJLEdBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUcsR0FBRSxHQUFHLEdBQUcsQ0FBRSxHQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEFBQUcsRUFBRSxHQUFMLEdBQVEsS0FBTSxBQUFJLEtBQUosRUFBTyxLQUFJLEdBQUksR0FBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUksR0FBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRSxLQUFLLEVBQUcsR0FBRSxJQUFJLEdBQUcsSUFBSSxFQUFHLEdBQUUsRUFBRSxHQUFJLEdBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFJLEdBQUUsR0FBRyxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUcsSUFBRyxHQUFJLEdBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFFLENBQUMsRUFBRSxHQUFJLElBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxTQUFTLEVBQUUsQ0FBQyxHQUFJLFdBQVUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUksT0FBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssS0FBSyxHQUFHLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEtBQUssR0FBRyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxLQUFLLEdBQUcsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxHQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFJLElBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUksSUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFFLEdBQUksSUFBRSxHQUFJLE9BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxHQUFJLEdBQUUsRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLE9BQU8sR0FBSSxHQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxRQUFRLEdBQUksR0FBRSxFQUFFLFFBQVEsRUFBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLGdCQUFnQixTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU8sQ0FBSSxFQUFFLEtBQUssWUFBWCxHQUF1QixHQUFFLEtBQUssVUFBVSxTQUFTLEVBQUUsQ0FBQyxHQUFJLEdBQUUsR0FBRSxXQUFXLElBQUksRUFBRSxFQUFFLEdBQUcsR0FBRyxJQUFJLE1BQUssRUFBRSxHQUFHLEVBQUUsSUFBRyxBQUFJLEVBQUUsVUFBVSxFQUFFLEtBQWxCLEVBQXFCLE1BQU8sR0FBRSxHQUFHLEFBQUksRUFBRSxVQUFVLE1BQWhCLEdBQXFCLEFBQUksRUFBRSxVQUFVLE1BQWhCLEdBQXFCLEFBQUksRUFBRSxVQUFVLE1BQWhCLEVBQW9CLE1BQU8sR0FBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLEFBQUksRUFBRSxVQUFVLEVBQUUsS0FBbEIsRUFBcUIsTUFBTyxHQUFFLE1BQU8sRUFBQyxFQUFFLENBQUMsR0FBRyxHQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBSSxHQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLE9BQU8sUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLFFBQVEsRUFBRSxHQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEFBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxHQUFHLEtBQXJCLEVBQXdCLElBQUksQ0FBQyxNQUFPLEdBQUUsU0FBUyxFQUFHLEdBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFHLEdBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxJQUFJLEdBQUksR0FBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQUFBSyxJQUFMLEdBQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQUFBSSxFQUFFLFdBQU4sR0FBZ0IsSUFBSSxFQUFHLEdBQUUsRUFBRSxFQUFHLEdBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUcsR0FBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEdBQUUsR0FBRSxDQUFDLEdBQUksSUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUUsRUFBRSxHQUFFLEdBQUUsS0FBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsVUFBVSxHQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLFNBQVMsRUFBRSxFQUFFLE9BQU8sU0FBUyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxTQUFTLEdBQUcsR0FBRSxDQUFDLEVBQUUsR0FBRyxHQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsVUFBVSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTyxHQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFBRSxVQUFVLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxFQUFFLFNBQVMsR0FBRyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsSUFBSSxFQUFFLEVBQUUsV0FBVyxBQUFJLElBQUosRUFBTSxFQUFFLFVBQVUsRUFBRSxLQUFNLEdBQUUsVUFBVSxJQUFJLEVBQUUsVUFBVSxFQUFHLEdBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxVQUFVLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQUFBSyxFQUFFLFdBQVAsR0FBaUIsSUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsU0FBUyxHQUFHLEdBQUcsRUFBRSxVQUFXLEdBQUUsWUFBWSxFQUFFLFdBQVcsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLFFBQVEsVUFBVSxDQUFDLEtBQUssTUFBTSxLQUFLLEtBQUssUUFBUSxFQUFFLEtBQUssU0FBUyxFQUFFLEtBQUssU0FBUyxFQUFFLEtBQUssT0FBTyxLQUFLLEtBQUssU0FBUyxFQUFFLEtBQUssVUFBVSxFQUFFLEtBQUssVUFBVSxFQUFFLEtBQUssSUFBSSxHQUFHLEtBQUssTUFBTSxLQUFLLEtBQUssVUFBVSxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLEFBQUMsVUFBUyxFQUFFLENBQUMsQUFBQyxVQUFTLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQUUsYUFBYSxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxnQkFBZ0IsT0FBTyxlQUFlLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEFBQXFCLENBQUMsRUFBRSxTQUFTLEtBQUssRUFBRSxPQUFPLElBQS9DLG1CQUFpRCxTQUFTLEVBQUUsQ0FBQyxRQUFRLFNBQVMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLEVBQUUsY0FBYyxDQUFDLEdBQUksR0FBRSxHQUFHLEVBQUUsRUFBRSxVQUFVLE1BQU8sR0FBRSxVQUFVLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLFlBQVksR0FBRyxHQUFHLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRyxHQUFFLGdCQUFnQixLQUFLLE9BQU8sRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxZQUFZLFlBQVksQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxlQUFpQixJQUFFLEdBQUksaUJBQWdCLE1BQU0sVUFBVSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxNQUFNLFlBQVksQ0FBQyxDQUFDLEdBQUcsR0FBRyxzQkFBdUIsR0FBRSxjQUFjLFFBQVEsRUFBRyxHQUFFLEVBQUUsZ0JBQWdCLFNBQVMsRUFBRSxDQUFDLEdBQUksR0FBRSxFQUFFLGNBQWMsUUFBUSxFQUFFLEVBQUUsbUJBQW1CLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLG1CQUFtQixLQUFLLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsYUFBYSxTQUFTLEVBQUUsQ0FBQyxBQUFZLE1BQU8sSUFBbkIsWUFBdUIsR0FBRSxHQUFJLFVBQVMsR0FBRyxDQUFDLEdBQUcsT0FBUSxHQUFFLEdBQUksT0FBTSxVQUFVLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsR0FBRyxVQUFVLEVBQUUsR0FBRyxHQUFJLEdBQUUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTyxHQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFPLEdBQUUsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFJLEdBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQUFBQyxVQUFTLEVBQUUsQ0FBQyxHQUFJLEdBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxLQUFLLE9BQU8sRUFBRSxZQUFhLEdBQUUsRUFBRSxFQUFFLFVBQVcsR0FBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFVBQVcsR0FBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxVQUFXLEdBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUUsQ0FBQyxDQUFDLFFBQUMsQ0FBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLFNBQVMsR0FBRyxBQUFVLE1BQU8sR0FBRSxNQUFuQixVQUF5QixBQUFJLEVBQUUsS0FBSyxRQUFRLENBQUMsSUFBcEIsR0FBdUIsRUFBRSxDQUFDLEVBQUUsS0FBSyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFFLEFBQWEsTUFBTyxNQUFwQixJQUF5QixBQUFTLElBQVQsT0FBVyxL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 diff --git a/.obsidian/plugins/obsidian-icon-shortcodes/manifest.json b/.obsidian/plugins/obsidian-icon-shortcodes/manifest.json deleted file mode 100644 index a4e7bc56..00000000 --- a/.obsidian/plugins/obsidian-icon-shortcodes/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "obsidian-icon-shortcodes", - "name": "Icon Shortcodes", - "version": "0.9.6", - "minAppVersion": "0.15.0", - "description": "Insert emoji and custom icons with shortcodes", - "author": "AidenLx", - "authorUrl": "https://github.com/aidenlx", - "isDesktopOnly": false -} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-icon-shortcodes/styles.css b/.obsidian/plugins/obsidian-icon-shortcodes/styles.css deleted file mode 100644 index d04634d2..00000000 --- a/.obsidian/plugins/obsidian-icon-shortcodes/styles.css +++ /dev/null @@ -1,2 +0,0 @@ -.isc-icon{vertical-align:middle}.isc-icon.isc-char-icon{vertical-align:baseline}.isc-icon>img,.isc-icon>svg{cursor:default!important;height:1em;width:1em}.view-content .mod-cm6 .cm-isc>.isc-icon>img,.view-content .mod-cm6 .cm-isc>.isc-icon>svg{cursor:pointer}.markdown-source-view .isc-icon>img,.markdown-source-view .isc-icon>svg,.markdown-preview-view .isc-icon>img,.markdown-preview-view .isc-icon>svg{height:var(--font-text-size, var(--editor-font-size, 1em));width:var(--font-text-size, var(--editor-font-size, 1em))}.markdown-source-view .HyperMD-header-1 .isc-icon>img,.markdown-source-view .HyperMD-header-1 .isc-icon>svg,.markdown-preview-view h1 .isc-icon>img,.markdown-preview-view h1 .isc-icon>svg{height:var(--h1);width:var(--h1)}.markdown-source-view .HyperMD-header-2 .isc-icon>img,.markdown-source-view .HyperMD-header-2 .isc-icon>svg,.markdown-preview-view h2 .isc-icon>img,.markdown-preview-view h2 .isc-icon>svg{height:var(--h2);width:var(--h2)}.markdown-source-view .HyperMD-header-3 .isc-icon>img,.markdown-source-view .HyperMD-header-3 .isc-icon>svg,.markdown-preview-view h3 .isc-icon>img,.markdown-preview-view h3 .isc-icon>svg{height:var(--h3);width:var(--h3)}.markdown-source-view .HyperMD-header-4 .isc-icon>img,.markdown-source-view .HyperMD-header-4 .isc-icon>svg,.markdown-preview-view h4 .isc-icon>img,.markdown-preview-view h4 .isc-icon>svg{height:var(--h4);width:var(--h4)}.markdown-source-view .HyperMD-header-5 .isc-icon>img,.markdown-source-view .HyperMD-header-5 .isc-icon>svg,.markdown-preview-view h5 .isc-icon>img,.markdown-preview-view h5 .isc-icon>svg{height:var(--h5);width:var(--h5)}.markdown-source-view .HyperMD-header-6 .isc-icon>img,.markdown-source-view .HyperMD-header-6 .isc-icon>svg,.markdown-preview-view h6 .isc-icon>img,.markdown-preview-view h6 .isc-icon>svg{height:var(--h6);width:var(--h6)}.callout .callout-icon.isc-icon>img,.callout .callout-icon.isc-icon>svg{height:16px;width:16px}.suggestion-container.isc .suggestion-flair{opacity:1}.suggestion-container.isc .suggestion-flair>.isc-icon{color:var(--text-normal)}.mod-settings .isc-add-pack-input{margin-right:5px}.mod-settings .isc-settings-custom-icon .dragover{position:relative;background-color:var(--shade-10);border-radius:5px}.mod-settings .isc-settings-custom-icon .dragover:before{content:"Drop SVG icon(s) here";font-size:16px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--text-normal)}.theme-dark .mod-settings .isc-settings-custom-icon .dragover{background-color:var(--shade-40)}.mod-settings .isc-settings-custom-icon .dragover>*{filter:blur(50px)}.mod-settings .isc-add-pack-input.invalid,.isc-icon-manager .icons .name textarea.invalid{color:var(--text-error);background:var(--background-primary-alt)}.modal.mod-browser-packs{width:80vw;max-width:80vw}.modal.mod-browser-packs .modal-content{justify-content:center}.modal.mod-browser-packs .modal-content .icon-text{margin-left:4px;position:relative;top:-1px}.modal.mod-browser-packs .modal-content>.loading{display:flex;flex:auto;flex-direction:row;align-items:center;justify-content:center}.modal.mod-browser-packs .modal-content>.loading>.loading-indicator+div{margin:0 20px;font-size:medium}.modal.mod-browser-packs .modal-content>.icon-pack-list{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center}.modal.mod-browser-packs .modal-content>.icon-pack-list .pack-manifest{display:flex;flex-direction:column;align-items:center;width:260px;padding:15px 10px;background:var(--background-secondary-alt);margin:15px 10px;border-radius:10px}.modal.mod-browser-packs .modal-content>.icon-pack-list .pack-manifest .pack-manifest-title{text-align:center;font-weight:700}.modal.mod-browser-packs .modal-content>.icon-pack-list .pack-manifest .pack-manifest-details{font-size:.9em;color:var(--text-muted);display:flex;text-align:center}.modal.mod-browser-packs .modal-content>.icon-pack-list .pack-manifest .pack-manifest-details>:not(:last-child){margin-right:5px}.modal.mod-browser-packs .modal-content>.icon-pack-list .pack-manifest .pack-manifest-desc{max-width:200px;height:auto}.modal.mod-browser-packs .modal-content>.icon-pack-list .styles-list{border-radius:10px;padding:5px;background-color:var(--background-primary);display:flex;align-self:stretch;flex-direction:column;flex-wrap:nowrap;margin:10px 10px 0;text-align:center}.modal.mod-browser-packs .modal-content>.icon-pack-list .styles-list>:not(:last-child){margin-bottom:5px}.modal.mod-browser-packs .modal-content>.icon-pack-list .style-info{border-radius:10px;background-color:var(--background-primary-alt);font-size:small;display:flex;flex-direction:row;flex-wrap:nowrap}.modal.mod-browser-packs .modal-content>.icon-pack-list .style-info>*{display:flex;flex-wrap:wrap;align-content:center;justify-content:space-evenly}.modal.mod-browser-packs .modal-content>.icon-pack-list .style-info .style-info-title{flex-grow:1;max-width:5em;line-height:1.2em;margin-left:10px;text-transform:capitalize}.modal.mod-browser-packs .modal-content>.icon-pack-list .style-info .style-info-title .style-info-pack-id{text-transform:none}.modal.mod-browser-packs .modal-content>.icon-pack-list .style-info .style-info-title .style-info-pack-id:before{content:"("}.modal.mod-browser-packs .modal-content>.icon-pack-list .style-info .style-info-title .style-info-pack-id:after{content:")"}.modal.mod-browser-packs .modal-content>.icon-pack-list .style-info .style-info-details{flex-grow:1}.modal.mod-browser-packs .modal-content>.icon-pack-list .style-info .style-info-button-container{flex-shrink:0}.modal.mod-browser-packs .modal-content>.icon-pack-list .style-info .style-info-button-container button{padding:6px;margin:5px 5px 5px 0}.isc-icon-manager .icons{margin-top:10px;display:grid;grid-auto-rows:auto;grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content;grid-template-columns:repeat(auto-fill,minmax(90px,1fr));grid-column-gap:1rem;grid-row-gap:1rem;text-align:center}.isc-icon-manager .icons .item{outline:none}.isc-icon-manager .icons .item .icon{min-height:64px;display:flex;align-items:center;justify-content:center;background:white;border-radius:6px;box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f;border:2px solid transparent;font-size:1.6em}.isc-icon-manager .icons .item .icon>img{width:1em;height:1em}.isc-icon-manager .icons .item .name{height:49px;display:flex;justify-content:center;align-content:center;flex-direction:column}.isc-icon-manager .icons .item .name span{font-size:.7em;overflow:hidden;word-wrap:break-word}.isc-icon-manager .icons .item .name textarea{margin-top:5px;width:100%;padding:0 .5em;font-size:14px}.isc-icon-manager .icons .item .name textarea:disabled{padding:0;font-size:16px;border:hidden;text-align:center;background:transparent}.isc-icon-manager .icons .item .buttons button{padding:4px 6px;margin:0 1px} -/*# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2ljb24tcGFja3MvaWNvbi5sZXNzIiwgIi4uL3NyYy9zZXR0aW5ncy5sZXNzIiwgIi4uL3NyYy9pbnZhbGlkLmxlc3MiLCAiLi4vc3JjL2NvbXBvbmVudC9icm93c2VyLXBhY2tzLmxlc3MiLCAiLi4vc3JjL2NvbXBvbmVudC9pY29uLW1hbmFnZXIubGVzcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLmlzYy1pY29uIHtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cbi5pc2MtaWNvbi5pc2MtY2hhci1pY29uIHtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuLmlzYy1pY29uID4gaW1nLFxuLmlzYy1pY29uID4gc3ZnIHtcbiAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XG4gIGhlaWdodDogMWVtO1xuICB3aWR0aDogMWVtO1xufVxuLnZpZXctY29udGVudCAubW9kLWNtNiAuY20taXNjID4gLmlzYy1pY29uID4gaW1nLFxuLnZpZXctY29udGVudCAubW9kLWNtNiAuY20taXNjID4gLmlzYy1pY29uID4gc3ZnIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLm1hcmtkb3duLXNvdXJjZS12aWV3IC5pc2MtaWNvbiA+IGltZyxcbi5tYXJrZG93bi1zb3VyY2UtdmlldyAuaXNjLWljb24gPiBzdmcsXG4ubWFya2Rvd24tcHJldmlldy12aWV3IC5pc2MtaWNvbiA+IGltZyxcbi5tYXJrZG93bi1wcmV2aWV3LXZpZXcgLmlzYy1pY29uID4gc3ZnIHtcbiAgaGVpZ2h0OiB2YXIoLS1mb250LXRleHQtc2l6ZSwgdmFyKC0tZWRpdG9yLWZvbnQtc2l6ZSwgMWVtKSk7XG4gIHdpZHRoOiB2YXIoLS1mb250LXRleHQtc2l6ZSwgdmFyKC0tZWRpdG9yLWZvbnQtc2l6ZSwgMWVtKSk7XG59XG4ubWFya2Rvd24tc291cmNlLXZpZXcgLkh5cGVyTUQtaGVhZGVyLTEgLmlzYy1pY29uID4gaW1nLFxuLm1hcmtkb3duLXNvdXJjZS12aWV3IC5IeXBlck1ELWhlYWRlci0xIC5pc2MtaWNvbiA+IHN2Zyxcbi5tYXJrZG93bi1wcmV2aWV3LXZpZXcgaDEgLmlzYy1pY29uID4gaW1nLFxuLm1hcmtkb3duLXByZXZpZXctdmlldyBoMSAuaXNjLWljb24gPiBzdmcge1xuICBoZWlnaHQ6IHZhcigtLWgxKTtcbiAgd2lkdGg6IHZhcigtLWgxKTtcbn1cbi5tYXJrZG93bi1zb3VyY2UtdmlldyAuSHlwZXJNRC1oZWFkZXItMiAuaXNjLWljb24gPiBpbWcsXG4ubWFya2Rvd24tc291cmNlLXZpZXcgLkh5cGVyTUQtaGVhZGVyLTIgLmlzYy1pY29uID4gc3ZnLFxuLm1hcmtkb3duLXByZXZpZXctdmlldyBoMiAuaXNjLWljb24gPiBpbWcsXG4ubWFya2Rvd24tcHJldmlldy12aWV3IGgyIC5pc2MtaWNvbiA+IHN2ZyB7XG4gIGhlaWdodDogdmFyKC0taDIpO1xuICB3aWR0aDogdmFyKC0taDIpO1xufVxuLm1hcmtkb3duLXNvdXJjZS12aWV3IC5IeXBlck1ELWhlYWRlci0zIC5pc2MtaWNvbiA+IGltZyxcbi5tYXJrZG93bi1zb3VyY2UtdmlldyAuSHlwZXJNRC1oZWFkZXItMyAuaXNjLWljb24gPiBzdmcsXG4ubWFya2Rvd24tcHJldmlldy12aWV3IGgzIC5pc2MtaWNvbiA+IGltZyxcbi5tYXJrZG93bi1wcmV2aWV3LXZpZXcgaDMgLmlzYy1pY29uID4gc3ZnIHtcbiAgaGVpZ2h0OiB2YXIoLS1oMyk7XG4gIHdpZHRoOiB2YXIoLS1oMyk7XG59XG4ubWFya2Rvd24tc291cmNlLXZpZXcgLkh5cGVyTUQtaGVhZGVyLTQgLmlzYy1pY29uID4gaW1nLFxuLm1hcmtkb3duLXNvdXJjZS12aWV3IC5IeXBlck1ELWhlYWRlci00IC5pc2MtaWNvbiA+IHN2Zyxcbi5tYXJrZG93bi1wcmV2aWV3LXZpZXcgaDQgLmlzYy1pY29uID4gaW1nLFxuLm1hcmtkb3duLXByZXZpZXctdmlldyBoNCAuaXNjLWljb24gPiBzdmcge1xuICBoZWlnaHQ6IHZhcigtLWg0KTtcbiAgd2lkdGg6IHZhcigtLWg0KTtcbn1cbi5tYXJrZG93bi1zb3VyY2UtdmlldyAuSHlwZXJNRC1oZWFkZXItNSAuaXNjLWljb24gPiBpbWcsXG4ubWFya2Rvd24tc291cmNlLXZpZXcgLkh5cGVyTUQtaGVhZGVyLTUgLmlzYy1pY29uID4gc3ZnLFxuLm1hcmtkb3duLXByZXZpZXctdmlldyBoNSAuaXNjLWljb24gPiBpbWcsXG4ubWFya2Rvd24tcHJldmlldy12aWV3IGg1IC5pc2MtaWNvbiA+IHN2ZyB7XG4gIGhlaWdodDogdmFyKC0taDUpO1xuICB3aWR0aDogdmFyKC0taDUpO1xufVxuLm1hcmtkb3duLXNvdXJjZS12aWV3IC5IeXBlck1ELWhlYWRlci02IC5pc2MtaWNvbiA+IGltZyxcbi5tYXJrZG93bi1zb3VyY2UtdmlldyAuSHlwZXJNRC1oZWFkZXItNiAuaXNjLWljb24gPiBzdmcsXG4ubWFya2Rvd24tcHJldmlldy12aWV3IGg2IC5pc2MtaWNvbiA+IGltZyxcbi5tYXJrZG93bi1wcmV2aWV3LXZpZXcgaDYgLmlzYy1pY29uID4gc3ZnIHtcbiAgaGVpZ2h0OiB2YXIoLS1oNik7XG4gIHdpZHRoOiB2YXIoLS1oNik7XG59XG4uY2FsbG91dCAuY2FsbG91dC1pY29uLmlzYy1pY29uID4gaW1nLFxuLmNhbGxvdXQgLmNhbGxvdXQtaWNvbi5pc2MtaWNvbiA+IHN2ZyB7XG4gIGhlaWdodDogMTZweDtcbiAgd2lkdGg6IDE2cHg7XG59XG4uc3VnZ2VzdGlvbi1jb250YWluZXIuaXNjIC5zdWdnZXN0aW9uLWZsYWlyIHtcbiAgb3BhY2l0eTogMTtcbn1cbi5zdWdnZXN0aW9uLWNvbnRhaW5lci5pc2MgLnN1Z2dlc3Rpb24tZmxhaXIgPiAuaXNjLWljb24ge1xuICBjb2xvcjogdmFyKC0tdGV4dC1ub3JtYWwpO1xufVxuIiwgIi5tb2Qtc2V0dGluZ3MgLmlzYy1hZGQtcGFjay1pbnB1dCB7XG4gIG1hcmdpbi1yaWdodDogNXB4O1xufVxuLm1vZC1zZXR0aW5ncyAuaXNjLXNldHRpbmdzLWN1c3RvbS1pY29uIC5kcmFnb3ZlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2hhZGUtMTApO1xuICBib3JkZXItcmFkaXVzOiA1cHg7XG59XG4ubW9kLXNldHRpbmdzIC5pc2Mtc2V0dGluZ3MtY3VzdG9tLWljb24gLmRyYWdvdmVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiRHJvcCBTVkcgaWNvbihzKSBoZXJlXCI7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgY29sb3I6IHZhcigtLXRleHQtbm9ybWFsKTtcbn1cbi50aGVtZS1kYXJrIC5tb2Qtc2V0dGluZ3MgLmlzYy1zZXR0aW5ncy1jdXN0b20taWNvbiAuZHJhZ292ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zaGFkZS00MCk7XG59XG4ubW9kLXNldHRpbmdzIC5pc2Mtc2V0dGluZ3MtY3VzdG9tLWljb24gLmRyYWdvdmVyID4gKiB7XG4gIGZpbHRlcjogYmx1cig1MHB4KTtcbn1cbiIsICIubW9kLXNldHRpbmdzIC5pc2MtYWRkLXBhY2staW5wdXQuaW52YWxpZCxcbi5pc2MtaWNvbi1tYW5hZ2VyIC5pY29ucyAubmFtZSB0ZXh0YXJlYS5pbnZhbGlkIHtcbiAgY29sb3I6IHZhcigtLXRleHQtZXJyb3IpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnktYWx0KTtcbn1cbiIsICIubW9kYWwubW9kLWJyb3dzZXItcGFja3Mge1xuICB3aWR0aDogODB2dztcbiAgbWF4LXdpZHRoOiA4MHZ3O1xufVxuLm1vZGFsLm1vZC1icm93c2VyLXBhY2tzIC5tb2RhbC1jb250ZW50IHtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG4ubW9kYWwubW9kLWJyb3dzZXItcGFja3MgLm1vZGFsLWNvbnRlbnQgLmljb24tdGV4dCB7XG4gIG1hcmdpbi1sZWZ0OiA0cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAtMXB4O1xufVxuLm1vZGFsLm1vZC1icm93c2VyLXBhY2tzIC5tb2RhbC1jb250ZW50ID4gLmxvYWRpbmcge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4OiBhdXRvO1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cbi5tb2RhbC5tb2QtYnJvd3Nlci1wYWNrcyAubW9kYWwtY29udGVudCA+IC5sb2FkaW5nID4gLmxvYWRpbmctaW5kaWNhdG9yICsgZGl2IHtcbiAgbWFyZ2luOiAwIDIwcHg7XG4gIGZvbnQtc2l6ZTogbWVkaXVtO1xufVxuLm1vZGFsLm1vZC1icm93c2VyLXBhY2tzIC5tb2RhbC1jb250ZW50ID4gLmljb24tcGFjay1saXN0IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZmxleC13cmFwOiB3cmFwO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cbi5tb2RhbC5tb2QtYnJvd3Nlci1wYWNrcyAubW9kYWwtY29udGVudCA+IC5pY29uLXBhY2stbGlzdCAucGFjay1tYW5pZmVzdCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHdpZHRoOiAyNjBweDtcbiAgcGFkZGluZzogMTVweCAxMHB4O1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeS1hbHQpO1xuICBtYXJnaW46IDE1cHggMTBweDtcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcbn1cbi5tb2RhbC5tb2QtYnJvd3Nlci1wYWNrcyAubW9kYWwtY29udGVudCA+IC5pY29uLXBhY2stbGlzdCAucGFjay1tYW5pZmVzdCAucGFjay1tYW5pZmVzdC10aXRsZSB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4ubW9kYWwubW9kLWJyb3dzZXItcGFja3MgLm1vZGFsLWNvbnRlbnQgPiAuaWNvbi1wYWNrLWxpc3QgLnBhY2stbWFuaWZlc3QgLnBhY2stbWFuaWZlc3QtZGV0YWlscyB7XG4gIGZvbnQtc2l6ZTogMC45ZW07XG4gIGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbiAgZGlzcGxheTogZmxleDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLm1vZGFsLm1vZC1icm93c2VyLXBhY2tzIC5tb2RhbC1jb250ZW50ID4gLmljb24tcGFjay1saXN0IC5wYWNrLW1hbmlmZXN0IC5wYWNrLW1hbmlmZXN0LWRldGFpbHMgPiA6bm90KDpsYXN0LWNoaWxkKSB7XG4gIG1hcmdpbi1yaWdodDogNXB4O1xufVxuLm1vZGFsLm1vZC1icm93c2VyLXBhY2tzIC5tb2RhbC1jb250ZW50ID4gLmljb24tcGFjay1saXN0IC5wYWNrLW1hbmlmZXN0IC5wYWNrLW1hbmlmZXN0LWRlc2Mge1xuICBtYXgtd2lkdGg6IDIwMHB4O1xuICBoZWlnaHQ6IGF1dG87XG59XG4ubW9kYWwubW9kLWJyb3dzZXItcGFja3MgLm1vZGFsLWNvbnRlbnQgPiAuaWNvbi1wYWNrLWxpc3QgLnN0eWxlcy1saXN0IHtcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgcGFkZGluZzogNXB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgbWFyZ2luOiAxMHB4IDEwcHggMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLm1vZGFsLm1vZC1icm93c2VyLXBhY2tzIC5tb2RhbC1jb250ZW50ID4gLmljb24tcGFjay1saXN0IC5zdHlsZXMtbGlzdCA+IDpub3QoOmxhc3QtY2hpbGQpIHtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuLm1vZGFsLm1vZC1icm93c2VyLXBhY2tzIC5tb2RhbC1jb250ZW50ID4gLmljb24tcGFjay1saXN0IC5zdHlsZS1pbmZvIHtcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZC1wcmltYXJ5LWFsdCk7XG4gIGZvbnQtc2l6ZTogc21hbGw7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGZsZXgtd3JhcDogbm93cmFwO1xufVxuLm1vZGFsLm1vZC1icm93c2VyLXBhY2tzIC5tb2RhbC1jb250ZW50ID4gLmljb24tcGFjay1saXN0IC5zdHlsZS1pbmZvID4gKiB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgYWxpZ24tY29udGVudDogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWV2ZW5seTtcbn1cbi5tb2RhbC5tb2QtYnJvd3Nlci1wYWNrcyAubW9kYWwtY29udGVudCA+IC5pY29uLXBhY2stbGlzdCAuc3R5bGUtaW5mbyAuc3R5bGUtaW5mby10aXRsZSB7XG4gIGZsZXgtZ3JvdzogMTtcbiAgbWF4LXdpZHRoOiA1ZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjJlbTtcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xufVxuLm1vZGFsLm1vZC1icm93c2VyLXBhY2tzIC5tb2RhbC1jb250ZW50ID4gLmljb24tcGFjay1saXN0IC5zdHlsZS1pbmZvIC5zdHlsZS1pbmZvLXRpdGxlIC5zdHlsZS1pbmZvLXBhY2staWQge1xuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbn1cbi5tb2RhbC5tb2QtYnJvd3Nlci1wYWNrcyAubW9kYWwtY29udGVudCA+IC5pY29uLXBhY2stbGlzdCAuc3R5bGUtaW5mbyAuc3R5bGUtaW5mby10aXRsZSAuc3R5bGUtaW5mby1wYWNrLWlkOjpiZWZvcmUge1xuICBjb250ZW50OiBcIihcIjtcbn1cbi5tb2RhbC5tb2QtYnJvd3Nlci1wYWNrcyAubW9kYWwtY29udGVudCA+IC5pY29uLXBhY2stbGlzdCAuc3R5bGUtaW5mbyAuc3R5bGUtaW5mby10aXRsZSAuc3R5bGUtaW5mby1wYWNrLWlkOjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiKVwiO1xufVxuLm1vZGFsLm1vZC1icm93c2VyLXBhY2tzIC5tb2RhbC1jb250ZW50ID4gLmljb24tcGFjay1saXN0IC5zdHlsZS1pbmZvIC5zdHlsZS1pbmZvLWRldGFpbHMge1xuICBmbGV4LWdyb3c6IDE7XG59XG4ubW9kYWwubW9kLWJyb3dzZXItcGFja3MgLm1vZGFsLWNvbnRlbnQgPiAuaWNvbi1wYWNrLWxpc3QgLnN0eWxlLWluZm8gLnN0eWxlLWluZm8tYnV0dG9uLWNvbnRhaW5lciB7XG4gIGZsZXgtc2hyaW5rOiAwO1xufVxuLm1vZGFsLm1vZC1icm93c2VyLXBhY2tzIC5tb2RhbC1jb250ZW50ID4gLmljb24tcGFjay1saXN0IC5zdHlsZS1pbmZvIC5zdHlsZS1pbmZvLWJ1dHRvbi1jb250YWluZXIgYnV0dG9uIHtcbiAgcGFkZGluZzogNnB4O1xuICBtYXJnaW46IDVweCA1cHggNXB4IDA7XG59XG4iLCAiLmlzYy1pY29uLW1hbmFnZXIgLmljb25zIHtcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC1hdXRvLXJvd3M6IGF1dG87XG4gIGdyaWQtYXV0by1jb2x1bW5zOiAtd2Via2l0LW1heC1jb250ZW50O1xuICBncmlkLWF1dG8tY29sdW1uczogbWF4LWNvbnRlbnQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDkwcHgsIDFmcikpO1xuICBncmlkLWNvbHVtbi1nYXA6IDFyZW07XG4gIGdyaWQtcm93LWdhcDogMXJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLmlzYy1pY29uLW1hbmFnZXIgLmljb25zIC5pdGVtIHtcbiAgb3V0bGluZTogbm9uZTtcbn1cbi5pc2MtaWNvbi1tYW5hZ2VyIC5pY29ucyAuaXRlbSAuaWNvbiB7XG4gIG1pbi1oZWlnaHQ6IDY0cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xuICBib3gtc2hhZG93OiAwIDFweCAzcHggMCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMXB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4wNik7XG4gIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBmb250LXNpemU6IDEuNmVtO1xufVxuLmlzYy1pY29uLW1hbmFnZXIgLmljb25zIC5pdGVtIC5pY29uID4gaW1nIHtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG59XG4uaXNjLWljb24tbWFuYWdlciAuaWNvbnMgLml0ZW0gLm5hbWUge1xuICBoZWlnaHQ6IDQ5cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1jb250ZW50OiBjZW50ZXI7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XG4uaXNjLWljb24tbWFuYWdlciAuaWNvbnMgLml0ZW0gLm5hbWUgc3BhbiB7XG4gIGZvbnQtc2l6ZTogMC43ZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbn1cbi5pc2MtaWNvbi1tYW5hZ2VyIC5pY29ucyAuaXRlbSAubmFtZSB0ZXh0YXJlYSB7XG4gIG1hcmdpbi10b3A6IDVweDtcbiAgd2lkdGg6IDEwMCU7XG4gIHBhZGRpbmc6IDAgMC41ZW07XG4gIGZvbnQtc2l6ZTogMTRweDtcbn1cbi5pc2MtaWNvbi1tYW5hZ2VyIC5pY29ucyAuaXRlbSAubmFtZSB0ZXh0YXJlYTpkaXNhYmxlZCB7XG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgYm9yZGVyOiBoaWRkZW47XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG59XG4uaXNjLWljb24tbWFuYWdlciAuaWNvbnMgLml0ZW0gLmJ1dHRvbnMgYnV0dG9uIHtcbiAgcGFkZGluZzogNHB4IDZweDtcbiAgbWFyZ2luOiAwcHggMXB4O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBQUEsVUFDRSxzQkFFRix3QkFDRSx3QkFFRiw0QkFFRSx5QkFDQSxXQUNBLFVBRUYsMEZBRUUsZUFFRixrSkFJRSwyREFDQSwwREFFRiw0TEFJRSxpQkFDQSxnQkFFRiw0TEFJRSxpQkFDQSxnQkFFRiw0TEFJRSxpQkFDQSxnQkFFRiw0TEFJRSxpQkFDQSxnQkFFRiw0TEFJRSxpQkFDQSxnQkFFRiw0TEFJRSxpQkFDQSxnQkFFRix3RUFFRSxZQUNBLFdBRUYsNENBQ0UsVUFFRixzREFDRSx5QkMxRUYsa0NBQ0UsaUJBRUYsa0RBQ0Usa0JBQ0EsaUNBTEYsa0JBUUEseURBQ0UsZ0NBQ0EsZUFDQSxrQkFDQSxRQUNBLFNBQ0EsK0JBQ0EseUJBRUYsOERBQ0UsaUNBRUYsb0RBQ0Usa0JDckJGLDBGQUVFLHdCQUNBLHlDQ0hGLHlCQUNFLFdBQ0EsZUFFRix3Q0FDRSx1QkFFRixtREFDRSxnQkFDQSxrQkFDQSxTQUVGLGlEQUNFLGFBQ0EsVUFDQSxtQkFDQSxtQkFDQSx1QkFFRix3RUFuQkEsY0FxQkUsaUJBRUYsd0RBQ0UsYUFDQSxtQkFDQSxlQUNBLHVCQUVGLHVFQUNFLGFBQ0Esc0JBQ0EsbUJBQ0EsWUFqQ0Ysa0JBbUNFLDJDQW5DRixvQ0F1Q0EsNEZBQ0Usa0JBQ0EsZ0JBRUYsOEZBQ0UsZUFDQSx3QkFDQSxhQUNBLGtCQUVGLGdIQUNFLGlCQUVGLDJGQUNFLGdCQUNBLFlBRUYscUVBeERBLCtCQTJERSwyQ0FDQSxhQUNBLG1CQUNBLHNCQUNBLGlCQS9ERixtQkFpRUUsa0JBRUYsdUZBQ0Usa0JBRUYsb0VBdEVBLG1CQXdFRSwrQ0FDQSxnQkFDQSxhQUNBLG1CQUNBLGlCQUVGLHNFQUNFLGFBQ0EsZUFDQSxxQkFDQSw2QkFFRixzRkFDRSxZQUNBLGNBQ0Esa0JBQ0EsaUJBQ0EsMEJBRUYsMEdBQ0Usb0JBRUYsaUhBQ0UsWUFFRixnSEFDRSxZQUVGLHdGQUNFLFlBRUYsaUdBQ0UsY0FFRix3R0ExR0EsaUNDQUEseUJBQ0UsZ0JBQ0EsYUFDQSxvQkFDQSxzQ0FDQSw4QkFDQSx5REFDQSxxQkFDQSxrQkFDQSxrQkFFRiwrQkFDRSxhQUVGLHFDQUNFLGdCQUNBLGFBQ0EsbUJBQ0EsdUJBQ0EsaUJBbkJGLGtCQXFCRSxtREFDQSw2QkFDQSxnQkFFRix5Q0FDRSxVQUNBLFdBRUYscUNBQ0UsWUFDQSxhQUNBLHVCQUNBLHFCQUNBLHNCQUVGLDBDQUNFLGVBQ0EsZ0JBQ0EscUJBRUYsOENBQ0UsZUFDQSxXQTNDRixlQTZDRSxlQUVGLHVEQS9DQSxVQWlERSxlQUNBLGNBQ0Esa0JBQ0EsdUJBRUYsK0NBdERBIiwKICAibmFtZXMiOiBbXQp9Cg== */ diff --git a/.obsidian/plugins/obsidian-memos/data.json b/.obsidian/plugins/obsidian-memos/data.json index b2555796..1856dc7a 100644 --- a/.obsidian/plugins/obsidian-memos/data.json +++ b/.obsidian/plugins/obsidian-memos/data.json @@ -1,13 +1,15 @@ { "StartDate": "Sunday", - "InsertAfter": "#### Memos", + "InsertAfter": "### 📝 Memos", "UserName": "Melsmemos", - "ProcessEntriesBelow": "#### Memos", + "ProcessEntriesBelow": "### 📝 Memos", "Language": "en", "SaveMemoButtonLabel": "Save", + "SaveMemoButtonIcon": "✍️", "ShareFooterStart": "{MemosNum} Memos {UsedDay} Day", "ShareFooterEnd": "✍️ by {UserName}", "DefaultPrefix": "Task", + "UseDailyOrPeriodic": "Daily", "InsertDateFormat": "Tasks", "DefaultEditorLocation": "Top", "UseButtonToShowEditor": false, @@ -25,5 +27,11 @@ "UseVaultTags": false, "DefaultLightBackgroundImage": "", "DefaultDarkBackgroundImage": "", - "DefaultMemoComposition": "{TIME} {CONTENT}" + "DefaultMemoComposition": "{TIME} {CONTENT}", + "CommentOnMemos": false, + "CommentsInOriginalNotes": false, + "FetchMemosMark": "#memo", + "FetchMemosFromNote": false, + "ShowCommentOnMemos": false, + "ShowLeftSideBar": false } \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-reminder-plugin/data.json b/.obsidian/plugins/obsidian-reminder-plugin/data.json index 4daf2b7d..bc758f0d 100644 --- a/.obsidian/plugins/obsidian-reminder-plugin/data.json +++ b/.obsidian/plugins/obsidian-reminder-plugin/data.json @@ -41,15 +41,15 @@ } ], "05.02 Networks/Server Cloud.md": [ - { - "title": ":cloud: [[Selfhosting]], [[Server Cloud|Cloud]]: Upgrader & Health checks %%done_del%%", - "time": "2022-09-01", - "rowNumber": 466 - }, { "title": ":cloud: [[Server Cloud]]: Backup server %%done_del%%", "time": "2022-09-06", - "rowNumber": 460 + "rowNumber": 292 + }, + { + "title": ":cloud: [[Selfhosting]], [[Server Cloud|Cloud]]: Upgrader & Health checks %%done_del%%", + "time": "2023-01-01", + "rowNumber": 293 } ], "05.02 Networks/Server Alias.md": [ @@ -128,16 +128,16 @@ } ], "04.01 lebv.org/lebv Research Tasks.md": [ - { - "title": ":fleur_de_lis: [[lebv Research Tasks|Research]]: membres de la famille: éplucher les mentions du Nobiliaire de Guyenne & Gascogne", - "time": "2022-08-31", - "rowNumber": 74 - }, { "title": ":fleur_de_lis: [[lebv Research Tasks|Research]]: Lieux: que sont devenus Fleurimont & Le Pavillon aujourd'hui?", "time": "2022-09-15", "rowNumber": 72 }, + { + "title": ":fleur_de_lis: [[lebv Research Tasks|Research]]: membres de la famille: éplucher les mentions du Nobiliaire de Guyenne & Gascogne", + "time": "2022-09-20", + "rowNumber": 74 + }, { "title": ":fleur_de_lis: [[lebv Research Tasks|Research]]: membres de la famille: reprendre les citations militaires (promotion/décoration)", "time": "2022-09-30", @@ -147,7 +147,7 @@ "01.03 Family/Amaury de Villeneuve.md": [ { "title": ":birthday: **[[Amaury de Villeneuve|Papa]]** %%done_del%%", - "time": "2022-08-30", + "time": "2023-08-30", "rowNumber": 98 } ], @@ -341,30 +341,30 @@ } ], "01.02 Home/Household.md": [ - { - "title": "♻ [[Household]]: *Paper* recycling collection %%done_del%%", - "time": "2022-08-30", - "rowNumber": 75 - }, { "title": ":bed: [[Household]] Change bedsheets %%done_del%%", "time": "2022-09-03", - "rowNumber": 86 + "rowNumber": 87 }, { "title": "🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%%", "time": "2022-09-05", - "rowNumber": 84 + "rowNumber": 85 }, { "title": "♻ [[Household]]: *Cardboard* recycling collection %%done_del%%", "time": "2022-09-06", - "rowNumber": 76 + "rowNumber": 77 + }, + { + "title": "♻ [[Household]]: *Paper* recycling collection %%done_del%%", + "time": "2022-09-13", + "rowNumber": 75 }, { "title": "🛎 🛍 REMINDER [[Household]]: Monthly shop in France %%done_del%%", "time": "2022-09-24", - "rowNumber": 82 + "rowNumber": 83 }, { "title": "🛌 [[Household]]: Buy new bed clothes", @@ -537,13 +537,6 @@ "rowNumber": 91 } ], - "00.01 Admin/Calendars/2022-06-25.md": [ - { - "title": "16:29 :sailboat: [[@Lifestyle]], [[2022-06-25|Memo]]: reprendre inscription pour le club nautique de ZH", - "time": "2022-08-31", - "rowNumber": 91 - } - ], "01.03 Family/Amélie Solanet.md": [ { "title": ":birthday: **[[Amélie Solanet|Amélie]]**", @@ -558,20 +551,6 @@ "rowNumber": 167 } ], - "00.01 Admin/Calendars/2022-02-20.md": [ - { - "title": "00:24 :tv: [[2022-02-20|Memo]], [[@Media France|Documentaire]]: Chercher 'Édouard, mon pote de droite' sur le quinquennat Macron", - "time": "2022-09-25", - "rowNumber": 87 - } - ], - "00.01 Admin/Calendars/2022-08-21.md": [ - { - "title": "09:57 :boot: [[@Lifestyle|Lifestyle]], [[@Sport Zürich|Sport in Zürich]], [[2022-08-21|Memo]]: pick up riding boot from cobbler", - "time": "2022-09-01", - "rowNumber": 86 - } - ], "00.01 Admin/Calendars/2022-08-22.md": [ { "title": "16:14 :ring: [[@life admin|Life]], [[MRCK|Meggi-mo]]: find a ring", @@ -604,6 +583,28 @@ "time": "2022-10-10", "rowNumber": 86 } + ], + "00.01 Admin/Calendars/2022-08-31.md": [ + { + "title": "15:13 :shark: [[2022-08-31|Memo]], [[Server Cloud|Mediatheque]]: write documentation Jellyfin", + "time": "2022-09-04", + "rowNumber": 81 + }, + { + "title": "18:21 📡 [[2022-08-31|Memo]], [[@IT & Computer|Obsidian]]: understand the full toolkit of git", + "time": "2022-09-10", + "rowNumber": 84 + }, + { + "title": "15:14 :shark: [[2022-08-31|Memo]], [[Server Cloud|Mediatheque]]: find iOS & Mac clients that work well", + "time": "2022-09-14", + "rowNumber": 82 + }, + { + "title": "15:15 :shark: [[2022-08-31|Memo]], [[Server Cloud|Mediatheque]]: understand how live TV works", + "time": "2022-09-14", + "rowNumber": 83 + } ] }, "debug": false, diff --git a/.obsidian/plugins/obsidian-wikipedia/data.json b/.obsidian/plugins/obsidian-wikipedia/data.json new file mode 100644 index 00000000..9986efa6 --- /dev/null +++ b/.obsidian/plugins/obsidian-wikipedia/data.json @@ -0,0 +1,7 @@ +{ + "template": "{{text}}\n> [Wikipedia]({{url}})", + "shouldUseParagraphTemplate": true, + "shouldBoldSearchTerm": true, + "paragraphTemplate": "> {{paragraphText}}\n>\n", + "language": "en" +} \ No newline at end of file diff --git a/.obsidian/plugins/podnotes/data.json b/.obsidian/plugins/podnotes/data.json index f3909e6e..47cf6eb5 100644 --- a/.obsidian/plugins/podnotes/data.json +++ b/.obsidian/plugins/podnotes/data.json @@ -116,6 +116,20 @@ "time": 255.3163008, "duration": 1597.5183673469387, "finished": false + }, + "1989: sex, lies and videotape: Rob Lowe and James Spader (Erotic 80s Part 12)": { + "title": "1989: sex, lies and videotape: Rob Lowe and James Spader (Erotic 80s Part 12)", + "podcastName": "You Must Remember This", + "time": 0, + "duration": 0, + "finished": true + }, + "Is a Local Prosecutor Making the Strongest Case Against Trump?": { + "title": "Is a Local Prosecutor Making the Strongest Case Against Trump?", + "podcastName": "The Daily", + "time": 1803.576, + "duration": 1803.576, + "finished": true } }, "favorites": { diff --git a/.obsidian/workspace b/.obsidian/workspace index af68f370..32d412e5 100644 --- a/.obsidian/workspace +++ b/.obsidian/workspace @@ -4,12 +4,12 @@ "type": "split", "children": [ { - "id": "75470b2c05afdfef", + "id": "810e155ef7f6612e", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "00.01 Admin/Obsidian plugins.md", + "file": "01.02 Home/@Main Dashboard.md", "mode": "preview", "source": false } @@ -77,7 +77,7 @@ "state": { "type": "backlink", "state": { - "file": "00.01 Admin/Obsidian plugins.md", + "file": "01.02 Home/@Main Dashboard.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -94,7 +94,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "00.01 Admin/Obsidian plugins.md", + "file": "01.02 Home/@Main Dashboard.md", "linksCollapsed": false, "unlinkedCollapsed": false } @@ -159,17 +159,17 @@ ], "currentTab": 2 }, - "active": "75470b2c05afdfef", + "active": "810e155ef7f6612e", "lastOpenFiles": [ - "00.05 Media/You Must Remember This - 1989 sex lies and videotape Rob Lowe and James Spader (Erotic 80s Part 12).md", - "00.01 Admin/Obsidian plugins.md", "01.02 Home/@Main Dashboard.md", - "03.03 Food & Wine/@@Recipes.md", - "00.03 News/Derinkuyu Mysterious underground city in Turkey found in man’s basement.md", - "03.03 Food & Wine/@Snacks.md", - "03.03 Food & Wine/@Side dishes.md", - "03.03 Food & Wine/@Desserts.md", - "03.03 Food & Wine/@Main dishes.md", - "03.03 Food & Wine/Shakshuka.md" + "01.02 Home/@Shopping list.md", + "00.01 Admin/Test sheet.md", + "05.01 Computer setup/Jellyfin.md", + "05.01 Computer setup/Nextcloud.md", + "05.01 Computer setup/NextDNS.md", + "05.02 Networks/Server Cloud.md", + "03.02 Travels/Geneva.md", + "05.02 Networks/Configuring UFW.md", + "05.02 Networks/Configuring Fail2ban.md" ] } \ No newline at end of file diff --git a/00.01 Admin/Calendars/2022-02-20.md b/00.01 Admin/Calendars/2022-02-20.md index 30a28ade..0f8967f1 100644 --- a/00.01 Admin/Calendars/2022-02-20.md +++ b/00.01 Admin/Calendars/2022-02-20.md @@ -85,7 +85,7 @@ This section does serve for quick memos. %% ### %%   -- [ ] 00:24 :tv: [[2022-02-20|Memo]], [[@Media France|Documentaire]]: Chercher 'Édouard, mon pote de droite' sur le quinquennat Macron 📅 2022-09-25 ^3sl3sd +- [x] 00:24 :tv: [[2022-02-20|Memo]], [[@Media France|Documentaire]]: Chercher 'Édouard, mon pote de droite' sur le quinquennat Macron 📅 2022-09-25 ✅ 2022-08-28 ^3sl3sd --- diff --git a/00.01 Admin/Calendars/2022-06-25.md b/00.01 Admin/Calendars/2022-06-25.md index ac41f4f6..3b835afb 100644 --- a/00.01 Admin/Calendars/2022-06-25.md +++ b/00.01 Admin/Calendars/2022-06-25.md @@ -89,7 +89,7 @@ This section does serve for quick memos. %% ### %%   -- [ ] 16:29 :sailboat: [[@Lifestyle]], [[2022-06-25|Memo]]: reprendre inscription pour le club nautique de ZH 📅 2022-08-31 +- [x] 16:29 :sailboat: [[@Lifestyle]], [[2022-06-25|Memo]]: reprendre inscription pour le club nautique de ZH 📅 2022-08-31 ✅ 2022-08-31 - 19:47 [[Mushroom Fricassée]] for dinns made by [[MRCK|Meggi-mo]] #recipe ^925bhq --- diff --git a/00.01 Admin/Calendars/2022-08-19.md b/00.01 Admin/Calendars/2022-08-19.md index fe6ec28f..a7f9774c 100644 --- a/00.01 Admin/Calendars/2022-08-19.md +++ b/00.01 Admin/Calendars/2022-08-19.md @@ -94,7 +94,7 @@ This section does serve for quick memos.   -Loret ipsum +Diner chez [[Bebek]] avec [[MRCK|Meggi-mo]].   diff --git a/00.01 Admin/Calendars/2022-08-21.md b/00.01 Admin/Calendars/2022-08-21.md index 365691a0..f2254ed0 100644 --- a/00.01 Admin/Calendars/2022-08-21.md +++ b/00.01 Admin/Calendars/2022-08-21.md @@ -84,7 +84,7 @@ This section does serve for quick memos. %% ### %%   -- [ ] 09:57 :boot: [[@Lifestyle|Lifestyle]], [[@Sport Zürich|Sport in Zürich]], [[2022-08-21|Memo]]: pick up riding boot from cobbler 📆2022-09-01 ^otnsxe +- [x] 09:57 :boot: [[@Lifestyle|Lifestyle]], [[@Sport Zürich|Sport in Zürich]], [[2022-08-21|Memo]]: pick up riding boot from cobbler 📅 2022-09-01 ✅ 2022-08-29 ^otnsxe - 20:02 [[Game of Thrones (2011–2019)|Game of Thrones]] with [[MRCK|Meggi-mo]] --- diff --git a/00.01 Admin/Calendars/2022-08-28.md b/00.01 Admin/Calendars/2022-08-28.md index b3ce37cb..6153de75 100644 --- a/00.01 Admin/Calendars/2022-08-28.md +++ b/00.01 Admin/Calendars/2022-08-28.md @@ -13,9 +13,9 @@ Stress: 25 FrontHeadBar: 5 EarHeadBar: 30 BackHeadBar: 20 -Water: 2.5 +Water: 3.5 Coffee: 2 -Steps: +Steps: 12651 Ski: Riding: Racket: @@ -91,7 +91,7 @@ This section does serve for quick memos.   -Loret ipsum +- Farewell party for Francisco & Clara at [[Polo Park Zürich]].   diff --git a/00.01 Admin/Calendars/2022-08-29.md b/00.01 Admin/Calendars/2022-08-29.md new file mode 100644 index 00000000..32a39ddc --- /dev/null +++ b/00.01 Admin/Calendars/2022-08-29.md @@ -0,0 +1,111 @@ +--- + +Date: 2022-08-29 +DocType: Note +Hierarchy: +TimeStamp: +location: +CollapseMetaTable: Yes +Sleep: 8 +Happiness: 90 +Gratefulness: 90 +Stress: 25 +FrontHeadBar: 5 +EarHeadBar: 30 +BackHeadBar: 20 +Water: 3 +Coffee: 5 +Steps: 7887 +Ski: +Riding: +Racket: +Football: +Swim: + +--- + +%% Parent:: [[@Life Admin]] %% + +--- + +[[2022-08-28|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2022-08-30|🗓 Next >>]] + +--- + +  + +```button +name Record today's health +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-2022-08-29Edit + +```button +name Save +type command +action Save current file +id Save +``` +^button-2022-08-29NSave + +  + +# 2022-08-29 + +  + +> [!summary]+ +> Daily note for 2022-08-29 + +  + +```toc +style: number +``` + +  + +--- + +  + +### 📝 Memos + +  + +This section does serve for quick memos. + +  + + +%% ### %% +  + +--- + +  + +### 🗒 Notes + +  + +Loret ipsum + +  + +--- + +  + +### :link: Linked activity + +  + +```dataview +Table from [[2022-08-29]] +``` + +  +  \ No newline at end of file diff --git a/00.01 Admin/Calendars/2022-08-30.md b/00.01 Admin/Calendars/2022-08-30.md new file mode 100644 index 00000000..87fb8e34 --- /dev/null +++ b/00.01 Admin/Calendars/2022-08-30.md @@ -0,0 +1,112 @@ +--- + +Date: 2022-08-30 +DocType: Note +Hierarchy: +TimeStamp: +location: +CollapseMetaTable: Yes +Sleep: 7.5 +Happiness: 90 +Gratefulness: 90 +Stress: 25 +FrontHeadBar: 5 +EarHeadBar: 30 +BackHeadBar: 20 +Water: 3 +Coffee: 5 +Steps: 3237 +Ski: +Riding: +Racket: +Football: +Swim: + +--- + +%% Parent:: [[@Life Admin]] %% + +--- + +[[2022-08-29|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2022-08-31|🗓 Next >>]] + +--- + +  + +```button +name Record today's health +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-2022-08-30Edit + +```button +name Save +type command +action Save current file +id Save +``` +^button-2022-08-30NSave + +  + +# 2022-08-30 + +  + +> [!summary]+ +> Daily note for 2022-08-30 + +  + +```toc +style: number +``` + +  + +--- + +  + +### 📝 Memos + +  + +This section does serve for quick memos. + +  + +- 11:11 Anniversaire de [[Amaury de Villeneuve|Papa]]: [[2022-08-30|66 ans]]. +- 21:51 [[Game of Thrones (2011–2019)|Game of Thrones]] with [[MRCK|Meggi-mo]] +%% ### %% +  + +--- + +  + +### 🗒 Notes + +  + +Loret ipsum + +  + +--- + +  + +### :link: Linked activity + +  + +```dataview +Table from [[2022-08-30]] +``` + +  +  \ No newline at end of file diff --git a/00.01 Admin/Calendars/2022-08-31.md b/00.01 Admin/Calendars/2022-08-31.md new file mode 100644 index 00000000..33024c9e --- /dev/null +++ b/00.01 Admin/Calendars/2022-08-31.md @@ -0,0 +1,114 @@ +--- + +Date: 2022-08-31 +DocType: Note +Hierarchy: +TimeStamp: +location: +CollapseMetaTable: Yes +Sleep: 7.5 +Happiness: 90 +Gratefulness: 90 +Stress: 25 +FrontHeadBar: 5 +EarHeadBar: 30 +BackHeadBar: 20 +Water: 2 +Coffee: 4 +Steps: +Ski: +Riding: +Racket: +Football: +Swim: + +--- + +%% Parent:: [[@Life Admin]] %% + +--- + +[[2022-08-30|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2022-09-01|🗓 Next >>]] + +--- + +  + +```button +name Record today's health +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-2022-08-31Edit + +```button +name Save +type command +action Save current file +id Save +``` +^button-2022-08-31NSave + +  + +# 2022-08-31 + +  + +> [!summary]+ +> Daily note for 2022-08-31 + +  + +```toc +style: number +``` + +  + +--- + +  + +### 📝 Memos + +  + +This section does serve for quick memos. + +  + +- [ ] 15:13 :shark: [[2022-08-31|Memo]], [[Server Cloud|Mediatheque]]: write documentation Jellyfin 📆2022-09-04 +- [ ] 15:14 :shark: [[2022-08-31|Memo]], [[Server Cloud|Mediatheque]]: find iOS & Mac clients that work well 📆2022-09-14 +- [ ] 15:15 :shark: [[2022-08-31|Memo]], [[Server Cloud|Mediatheque]]: understand how live TV works 📆2022-09-14 +- [ ] 18:21 📡 [[2022-08-31|Memo]], [[@IT & Computer|Obsidian]]: understand the full toolkit of git 📅 2022-09-10 +%% --- %% +  + +--- + +  + +### 🗒 Notes + +  + +Loret ipsum + +  + +--- + +  + +### :link: Linked activity + +  + +```dataview +Table from [[2022-08-31]] +``` + +  +  \ No newline at end of file diff --git a/00.01 Admin/Calendars/2022-11-19 Fiancailles Marguerite & Arnold - Paris.md b/00.01 Admin/Calendars/2022-11-19 Fiancailles Marguerite & Arnold - Paris.md new file mode 100644 index 00000000..b5a265e9 --- /dev/null +++ b/00.01 Admin/Calendars/2022-11-19 Fiancailles Marguerite & Arnold - Paris.md @@ -0,0 +1,8 @@ +--- +title: Fiancailles Marguerite & Arnold - Paris +allDay: true +date: 2022-11-19 +endDate: 2022-11-20 +--- + +Reception de fiançailles de [[Marguerite de Villeneuve|Marguerite]] et [[Arnold]] au [[@@Paris|28]] [[2022-11-19|ce jour]]. \ No newline at end of file diff --git a/00.01 Admin/Calendars/2023-01-14 Mariage Marguerite & Arnold.md b/00.01 Admin/Calendars/2023-01-14 Mariage Marguerite & Arnold.md new file mode 100644 index 00000000..771fd183 --- /dev/null +++ b/00.01 Admin/Calendars/2023-01-14 Mariage Marguerite & Arnold.md @@ -0,0 +1,8 @@ +--- +title: Mariage Marguerite & Arnold +allDay: true +date: 2023-01-14 +endDate: 2023-01-15 +--- + +Mariage de [[Marguerite de Villeneuve|Marguerite]] et [[Arnold]] à [[Geneva|Genève]] [[2023-01-14|ce jour]]. \ No newline at end of file diff --git a/00.01 Admin/Templates/Template Daily.md b/00.01 Admin/Templates/Template Daily.md index ea725770..a42a7c14 100644 --- a/00.01 Admin/Templates/Template Daily.md +++ b/00.01 Admin/Templates/Template Daily.md @@ -80,7 +80,7 @@ This section does serve for quick memos.   -%% ### %% +%% --- %%   --- diff --git a/00.01 Admin/Test sheet.md b/00.01 Admin/Test sheet.md index 0af3a9f9..5a0d9462 100644 --- a/00.01 Admin/Test sheet.md +++ b/00.01 Admin/Test sheet.md @@ -7,7 +7,6 @@ Number2: 3 TimeStamp: 2022-01-15 --- - await dv.io.load(dv.page("02.02 Paris/Abri")) `jsx-` @@ -92,6 +91,43 @@ this.container.style.minHeight = "500px"; const { renderCalendar } = app.plugins ``` + +>[!multi-column] +>>[!blank-container] +> +>> [!infobox] +>> # SELF +>>![[175008.jpg|cover]] +>> ##### +>> | | +>> | -- | +>> | [[000. Obsidian\|Obsidian]] - #:inbox_tray: | +>> | [[100 Personal\|Personal]] - #Personal:crown: | +>> | [[200 PKM Library\|PKM Library]] - #PKM | +>> | [[300 MOCS\|MOC Library]] - #MOC:map: | +> +>> [!infobox|] +>> # PERSONAL +>>![[174897.jpg|cover]] +>>##### +>> || +>> | -- | +>> | [[900 Work\|Work]] - #Work +>> | [[600 Life Areas\|Life Areas]] - #Life | +>> | - | +>> | - | +> +>>[!blank-container] +> +>>[!infobox] +>># Activity +>>![[168494.jpg|cover landscape]] +>>![[Activity|clean]] +> +>>[!blank-container] + + + === start-multi-column: Testlist ```column-settings number of columns: 2 diff --git a/00.03 News/Derinkuyu Mysterious underground city in Turkey found in man’s basement.md b/00.03 News/Derinkuyu Mysterious underground city in Turkey found in man’s basement.md index 843d2ba9..0dc856b9 100644 --- a/00.03 News/Derinkuyu Mysterious underground city in Turkey found in man’s basement.md +++ b/00.03 News/Derinkuyu Mysterious underground city in Turkey found in man’s basement.md @@ -12,7 +12,7 @@ CollapseMetaTable: Yes --- Parent:: [[@News|News]] -Read:: No +Read:: [[2022-08-29]] --- @@ -96,8 +96,6 @@ Derinkuyu is now one of Cappadocia’s biggest tourist attractions, so it no lon *For more underground fun, see also Strange Maps #[119](https://bigthink.com/strange-maps/119-all-elephant-and-no-castle-a-secret-bestiary-of-the-london-tube-map/), #[443](https://bigthink.com/strange-maps/443-secret-caves-of-the-lizard-people/) and #[1083](https://bigthink.com/strange-maps/paris-catacombs/).* -*Got a strange map? Let me know at [*\[email protected\]*](https://bigthink.com/cdn-cgi/l/email-protection#41323533202f26242c20313201262c20282d6f222e2c).* - *Follow Strange Maps on [Twitter](https://twitter.com/VeryStrangeMaps) and [Facebook](https://facebook.com/VeryStrangeMaps).*   diff --git a/00.03 News/Opinion Maternal Instinct Is a Myth That Men Created.md b/00.03 News/Opinion Maternal Instinct Is a Myth That Men Created.md index 89b576aa..adb47db1 100644 --- a/00.03 News/Opinion Maternal Instinct Is a Myth That Men Created.md +++ b/00.03 News/Opinion Maternal Instinct Is a Myth That Men Created.md @@ -12,7 +12,7 @@ CollapseMetaTable: Yes --- Parent:: [[@News|News]] -Read:: No +Read:: [[2022-08-31]] --- diff --git a/00.03 News/The Deacon and the Dog City Journal.md b/00.03 News/The Deacon and the Dog City Journal.md index c3c09da0..6497c39f 100644 --- a/00.03 News/The Deacon and the Dog City Journal.md +++ b/00.03 News/The Deacon and the Dog City Journal.md @@ -12,7 +12,7 @@ CollapseMetaTable: Yes --- Parent:: [[@News|News]] -Read:: No +Read:: [[2022-08-29]] --- diff --git a/00.03 News/Was King Arthur a Real Person.md b/00.03 News/Was King Arthur a Real Person.md index e05d7121..58db4e7d 100644 --- a/00.03 News/Was King Arthur a Real Person.md +++ b/00.03 News/Was King Arthur a Real Person.md @@ -12,7 +12,7 @@ CollapseMetaTable: Yes --- Parent:: [[@News|News]] -Read:: No +Read:: [[2022-08-31]] --- diff --git a/00.03 News/Why Don’t Millennials Have Hobbies.md b/00.03 News/Why Don’t Millennials Have Hobbies.md index 5664b021..80980802 100644 --- a/00.03 News/Why Don’t Millennials Have Hobbies.md +++ b/00.03 News/Why Don’t Millennials Have Hobbies.md @@ -12,7 +12,7 @@ CollapseMetaTable: Yes --- Parent:: [[@News|News]] -Read:: No +Read:: [[2022-08-29]] --- diff --git a/01.02 Home/Cinematheque.md b/01.02 Home/Cinematheque.md index 34f89f27..bf565b51 100644 --- a/01.02 Home/Cinematheque.md +++ b/01.02 Home/Cinematheque.md @@ -12,7 +12,7 @@ CollapseMetaTable: Yes TVShow: Name: "Game of Thrones" Season: 2 - Episode: 2 + Episode: 5 Source: Internal --- diff --git a/01.02 Home/Household.md b/01.02 Home/Household.md index 4d2429c3..836ec8f9 100644 --- a/01.02 Home/Household.md +++ b/01.02 Home/Household.md @@ -73,7 +73,8 @@ This section on different household obligations. #### Garbage collection -- [ ] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2022-08-30 +- [ ] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2022-09-13 +- [x] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2022-08-30 ✅ 2022-08-29 - [ ] ♻ [[Household]]: *Cardboard* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2022-09-06   diff --git a/01.03 Family/Amaury de Villeneuve.md b/01.03 Family/Amaury de Villeneuve.md index 90c0040e..4ddf16ff 100644 --- a/01.03 Family/Amaury de Villeneuve.md +++ b/01.03 Family/Amaury de Villeneuve.md @@ -96,7 +96,8 @@ style: number ### Birthday -- [ ] :birthday: **[[Amaury de Villeneuve|Papa]]** %%done_del%% 🔁 every year 📅 2022-08-30 +- [ ] :birthday: **[[Amaury de Villeneuve|Papa]]** %%done_del%% 🔁 every year 📅 2023-08-30 +- [x] :birthday: **[[Amaury de Villeneuve|Papa]]** %%done_del%% 🔁 every year 📅 2022-08-30 ✅ 2022-08-30 - [x] :birthday: Papa 🔁 every year 📅 2021-08-30 ✅ 2021-10-01   diff --git a/02.03 Zürich/Bebek.md b/02.03 Zürich/Bebek.md index d19f87ea..73e42b3d 100644 --- a/02.03 Zürich/Bebek.md +++ b/02.03 Zürich/Bebek.md @@ -87,7 +87,7 @@ style: number   -Loret ipsum +1ere fois le [[2022-08-19|19 aout 2022]] avec [[MRCK|Meggi-mo]].     \ No newline at end of file diff --git a/03.01 Reading list/La promesse de l'aube.md b/03.01 Reading list/La promesse de l'aube.md index 5ebc36f7..6fa64c6c 100644 --- a/03.01 Reading list/La promesse de l'aube.md +++ b/03.01 Reading list/La promesse de l'aube.md @@ -59,7 +59,10 @@ id Save ```ad-abstract title: Summary collapse: open -{{excerpt}} +> Tu seras un héros, tu seras général, Gabriele D'Annunzio, Ambassadeur de France - tous ces voyous ne savent pas qui tu es! + +Je crois que jamais un fils n'a hai sa mère autant que moi, à ce moment-là. Mais, alors que jessayais de lui expliquer dans un murmure rageur qu'elle me compromettait irrémédiablement aux yeux de l'Armée de 'Air, et que je faisais un nouvel effort pour la pousser derrière le taxi, son visage prit une expression désemparée, ses lèvres se mirent à trembler, et j'entendis une fois de plus la formule intolérable, devenue depuis longtemps classique dans nos rapports : +> Alors, tu as honte de ta vieille mère ? ```   diff --git a/03.04 Cinematheque/Squid Game (2021–).md b/03.04 Cinematheque/Squid Game (2021–).md new file mode 100644 index 00000000..a794d62d --- /dev/null +++ b/03.04 Cinematheque/Squid Game (2021–).md @@ -0,0 +1,124 @@ +--- + +type: "series" +title: "Squid Game" +englishTitle: "Squid Game" +year: "2021–" +dataSource: "OMDbAPI" +url: "https://www.imdb.com/title/tt10919420/" +id: "tt10919420" +genres: + - "Action" + - "Drama" + - "Mystery" +studios: + - "N/A" +episodes: 0 +duration: "N/A" +onlineRating: 8 +image: "https://m.media-amazon.com/images/M/MV5BYWE3MDVkN2EtNjQ5MS00ZDQ4LTliNzYtMjc2YWMzMDEwMTA3XkEyXkFqcGdeQXVyMTEzMTI1Mjk3._V1_SX300.jpg" +released: true +airing: false +airedFrom: "17/09/2021" +airedTo: "unknown" +watched: true +lastWatched: "2021/10/30" +personalRating: 7.5 +tags: "#mediaDB/tv/series" + +--- + +Parent:: [[Cinematheque]] + +--- + +```dataviewjs +dv.paragraph(`> [!${dv.current().watched ? 'SUCCESS' : 'WARNING'}] ${dv.current().watched ? 'last watched on ' + dv.current().lastWatched : 'not yet watched'}`) +``` + +  + +# `$= dv.current().title` + +  + +`$= dv.current().watched ? '**Rating**: ' + dv.current().personalRating + ' out of 10' : ''` + +  + +```toc +``` + +  + +### Detail + +  + +**Genres**: +`$= dv.current().genres.length === 0 ? ' - none' : dv.list(dv.current().genres)` + +```dataviewjs +let text = ''; + +if (!dv.current().released) { + text += '**Not released**\n'; + if (dv.current().airedFrom) { + text += 'The series will release on ' + dv.current().release_date + '.'; + } else { + text += 'The series is not released yet.'; + } + +} else if (dv.current().airing) { + text += '**Not finished**\n'; + text += 'The series is not fully released yet.'; +} + +if (text) { + dv.paragraph(text); +} +``` + +```dataview +list without id + "" + + + "" ++ + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "
Type" + this.type + "
Online Rating" + this.onlineRating + "
Episodes" + this.episodes + "
Duration" + this.duration + "
Aired from" + this.airedFrom + "
Aired to" + this.airedTo + "
Studios" + this.studios + "
" +FROM "03.04 Cinematheque/Squid Game (2021–)" +``` + +  + +--- + +  + +### Poster + +  + +`$= '![Image|360](' + dv.current().image + ')'` \ No newline at end of file diff --git a/04.01 lebv.org/lebv Research Tasks.md b/04.01 lebv.org/lebv Research Tasks.md index 45ab903b..07196e25 100644 --- a/04.01 lebv.org/lebv Research Tasks.md +++ b/04.01 lebv.org/lebv Research Tasks.md @@ -72,7 +72,7 @@ Overview of tasks & todos for lebv.org - [ ] :fleur_de_lis: [[lebv Research Tasks|Research]]: Lieux: que sont devenus Fleurimont & Le Pavillon aujourd'hui? 📅 2022-09-15 - [ ] :fleur_de_lis: [[lebv Research Tasks|Research]]: membres de la famille: reprendre les citations militaires (promotion/décoration) 📅 2022-09-30 -- [ ] :fleur_de_lis: [[lebv Research Tasks|Research]]: membres de la famille: éplucher les mentions du Nobiliaire de Guyenne & Gascogne 📅 2022-08-31 +- [ ] :fleur_de_lis: [[lebv Research Tasks|Research]]: membres de la famille: éplucher les mentions du Nobiliaire de Guyenne & Gascogne 📅 2022-09-20 - [x] [[lebv Research Tasks|Research]]: Archivage: compléter les fichiers de Source   diff --git a/05.01 Computer setup/Jellyfin.md b/05.01 Computer setup/Jellyfin.md new file mode 100644 index 00000000..f8f8c3e1 --- /dev/null +++ b/05.01 Computer setup/Jellyfin.md @@ -0,0 +1,127 @@ +--- + +Tag: ["Admin", "Computer", "Cloud", "Media"] +Date: 2022-08-31 +DocType: "Product" +Hierarchy: "NonRoot" +TimeStamp: +location: +Product: + Type: "IT" + Link: "https://jellyfin.org/" + Value: "Free" +CollapseMetaTable: yes + +--- + +Parent:: [[Storage and Syncing]], [[Server Cloud]] + +--- + +  + +```button +name Edit Product parameters +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-JellyfinProdEdit + +```button +name Save +type command +action Save current file +id Save +``` +^button-JellyfinProdSave + +  + +# Jellyfin + +  + +> [!summary]+ +> Product Description + +  + +```toc +style: number +``` + +  + +--- + +  + +### Characteristics + +  + +Loret ipsum + +  + +#### Sub-header 1 + +Loret ipsum + +  + +#### Sub-header 2 + +Loret ipsum + +  + +--- + +  + +### Structure + +  + +Loret ipsum + +  + +--- + +  + +### Pricing + +  + +Loret ipsum + +  + +--- + +  + +### Further steps + +  + +Loret ipsum + +  + +--- + +  + +### Documentation + +  + +Loret ipsum + +  +  \ No newline at end of file diff --git a/05.01 Computer setup/Nextcloud.md b/05.01 Computer setup/Nextcloud.md index 51a33e74..97b72ca4 100644 --- a/05.01 Computer setup/Nextcloud.md +++ b/05.01 Computer setup/Nextcloud.md @@ -16,6 +16,8 @@ Parent:: [[Storage and Syncing]], [[Server Cloud]] --- + ^Top +   ```button @@ -155,6 +157,231 @@ _WebDAV Account_:   +### Selfhosting guide + +  + +```ad-info +title: Installation +[Tutorial](https://www.techrepublic.com/article/how-to-install-nextcloud-22-on-ubuntu-server-20-04/) +[Tutorial2](https://nextcloud.com/athome/) +[Tutorial3](https://blog.ssdnodes.com/blog/installing-nextcloud-docker/) +``` + +  + +#### Installed dependencies +[[#^Top|TOP]] +  + +##### Apache2 + +Webserver for [[Nextcloud]]. +Apache2 has notorious issues with over-clogging memory usage (topping 100% of memory usage). +In order to minimise memory usage, [[#APCu]] has been installed as a cache manager. In addition, Appache has been paired with: + +- **[php-fpm](https://www.php.net/manual/en/install.fpm.php)** for php7.4, enabling faster interaction between apache and backend. +- the '**event**' multi-processing module ([MPM](https://tecadmin.net/apache-mpm-prefork-and-worker-and-event/)) enabling decluttering of processing between ports & Apache + +All relevant dependencies have been installed and the set-up tested. +A comprehensive tutorial on the MPM switch can be found [here](https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04) or [here](https://askubuntu.com/questions/1319861/how-to-configure-apache-http-to-php-fpm-on-ubuntu-20-10). + +**php.ini** files can be found at: + +```ad-path +/etc/php/7.4/fpm/php.ini +/etc/php/7.4/apache2/php.ini +/etc/php/7.4/cli/php.ini +``` + +  + +##### Certbot +[[#^Top|TOP]] +Provides SSL certification from **Let's Encrypt**. Installation dependencies are different from Nginx and explained [here](https://linuxhint.com/secure-apache-lets-encrypt-ubuntu/) + +  + +##### MySQL + +Nothing particular to note on MySQL apart from initial set-up and user management. + +Configuration file is under: + +```ad-path +/etc/mysql/mysql.conf.d/mysqld.cnf +``` + +```ad-code +title: Optimise memory usage of mysql +~~~yaml +[mysqld] +% Disable performance schema to hugely reduce RAM usage +performance_schema = OFF +~~~ +``` + +In order to restart mysql, the command is: + +```ad-command +~~~bash +sudo service mysql restart +~~~ +``` + +  + +##### APCu +[[#^Top|TOP]] +Memory caching addon for Nextcloud. Memory caching management is provided by Nextcloud and needs to be set up as a system cron job. After installing APCu, the webserver needs to be **restarted** and the cron job defined: + +1. **Define the cronjob** + +```ad-command +~~~bash +sudo crontab -u www-data -e +~~~ +``` + +2. **Add cronjob** + +```ad-code +~~~bash + */5 * * * * php -f /var/www/html/nextcloud/cron.php --define apc.enable_cli=1 +~~~ +``` + +3. **Verify that the cron job is added** + +```ad-command +~~~bash +sudo crontab -u www-data -l +~~~ +``` + +  + +##### SVG support +[[#^Top|TOP]] +SVG support is installed in the form of a package. + +```ad-command +~~~bash +sudo apt-get update -y +sudo apt-get install -y libmagickcore-6.q16-6-extra +~~~ +``` + +  + +--- + +  + +#### Service management +[[#^Top|TOP]] +Nextcloud offers two alternatives for managing the service: +1. An admin webpanel +2. A command line tool + +  + +##### Admin webpanel + +Accessed through login into the service with admin credentials. Settings offer an admin section. + +  + +##### Nextcloud command line tool +[[#^Top|TOP]] +From the server's command line, Nextcloud offers the ability to perform some tasks like user management. + +  + +###### Introduction to the command + +[[Nextcloud]] offers a command-line tool which permission needs to be set to "executable". It is located here: + +```ad-path +/var/www/html/nextcloud/occ +``` + +The tool needs to be invoked by the "www-data" user and compiled with PHP: + +```ad-command +~~~bash +sudo -u www-data php /var/www/html/nextcloud/occ +~~~ +``` + +  + +###### Generic commands + +[[Nextcloud]] offers a simple description of all commands [here](https://docs.nextcloud.com/server/22/admin_manual/configuration_server/occ_command.html) + +  + +--- + +  + +#### Nextcloud server hardening +[[#^Top|TOP]] +```ad-bug +title: Nextcloud tutorial +[Here](https://docs.nextcloud.com/server/latest/admin_manual/installation/harden_server.html) +``` + +  + +--- + +  + +#### Data transfer +[[#^Top|TOP]] +After each data transfer, run the following command to refresh [[Nextcloud]]'s webapp: + +```ad-command +~~~bash +sudo -u www-data php /var/www/html/nextcloud/occ files:scan --all +~~~ +``` + +More info can be found [here](https://docs.nextcloud.com/server/22/admin_manual/configuration_server/occ_command.html) + +  + +##### Upload from local + +```ad-bug +[Curl](https://cylab.be/blog/33/how-to-upload-your-files-to-nextcloud-file-drop-using-curl) +[Nextcloud help](https://help.nextcloud.com/t/how-to-upload-and-share-file-automatically/19202) +``` + +  + +##### Directories +[[#^Top|TOP]] +1. **Local file structure** + +```ad-path +/var/www/html/nextcloud/data/USERNAME/files +``` + +2. **Webdav file structure** + +```ad-path +/remote.php/dav/files/USERNAME +``` + +  + +--- + +  + ### Pricing   @@ -184,4 +411,5 @@ _**128G**_ | €4.95 - [x] [[Nextcloud]]: Transfer NetNewsWire to NC ✅ 2021-09-15   -  \ No newline at end of file +  + diff --git a/05.02 Networks/Configuring Docker.md b/05.02 Networks/Configuring Docker.md index 30cd6a08..828226cc 100644 --- a/05.02 Networks/Configuring Docker.md +++ b/05.02 Networks/Configuring Docker.md @@ -109,6 +109,19 @@ sudo newgrp docker   +```ad-warning +title: [[Configuring Docker|docker]] for non root users +[[Configuring Docker|docker]] predominantly works for the root user. In order to let non-root users instruct Docker, users need to be added to the Docker group: + +`sudo usermod -aG docker (username)` + +Potentially, the Docker group needs to be defined: + +`sudo groupadd docker` +``` + +  + #### Installing docker-compose Docker-compose is a script generatir enabling leaner execution and update of each container. The following commands install the wizard. diff --git a/05.02 Networks/Server Cloud.md b/05.02 Networks/Server Cloud.md index 66c33701..0676b1b7 100644 --- a/05.02 Networks/Server Cloud.md +++ b/05.02 Networks/Server Cloud.md @@ -88,7 +88,7 @@ title: Dashboard access ```ad-quote title: Address -The service will be located under **[cloud.mfxm.fr](https://cloud.mfxm.fr)** . +The service is located under **[cloud.mfxm.fr](https://cloud.mfxm.fr)** . ```   @@ -101,10 +101,8 @@ The service will be located under **[cloud.mfxm.fr](https://cloud.mfxm.fr)** . [[#^Top|TOP]]   -```ad-abstract -title: Nextcloud -[[Nextcloud]] is a cloud storage management service offering a variety of Apps to manage data online. -``` +> [!abstract] Jellyfin +[[Jellyfin]] is a media management service offering a variety of Apps to manage media (video, music, photos) online.   @@ -123,70 +121,33 @@ title: Installation [[#^Top|TOP]]   -##### Apache2 - -Webserver for [[Nextcloud]]. -Apache2 has notorious issues with over-clogging memory usage (topping 100% of memory usage). -In order to minimise memory usage, [[#APCu]] has been installed as a cache manager. In addition, Appache has been paired with: - -- **[php-fpm](https://www.php.net/manual/en/install.fpm.php)** for php7.4, enabling faster interaction between apache and backend. -- the '**event**' multi-processing module ([MPM](https://tecadmin.net/apache-mpm-prefork-and-worker-and-event/)) enabling decluttering of processing between ports & Apache +##### Docker -All relevant dependencies have been installed and the set-up tested. -A comprehensive tutorial on the MPM switch can be found [here](https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04) or [here](https://askubuntu.com/questions/1319861/how-to-configure-apache-http-to-php-fpm-on-ubuntu-20-10). +Currently running Docker containers -**php.ini** files can be found at: - -```ad-path -/etc/php/7.4/fpm/php.ini -/etc/php/7.4/apache2/php.ini -/etc/php/7.4/cli/php.ini +```ad-bug +title: docker network +ID: 3a4d267e8155e3ff957e15c86360de1431d177b2131455707bea99038f179481 +IP: 17.27.37.x ```   -##### Certbot +##### Caddy [[#^Top|TOP]] -Provides SSL certification from **Let's Encrypt**. Installation dependencies are different from Nginx and explained [here](https://linuxhint.com/secure-apache-lets-encrypt-ubuntu/) - -  +[[Configuring Caddy|caddy]] is the webserver of choice. Refer to the dedicated note for config and parametrisation. -##### MySQL - -Nothing particular to note on MySQL apart from initial set-up and user management. - -Configuration file is under: - -```ad-path -/etc/mysql/mysql.conf.d/mysqld.cnf -``` - -```ad-code -title: Optimise memory usage of mysql -~~~yaml -[mysqld] -% Disable performance schema to hugely reduce RAM usage -performance_schema = OFF -~~~ -``` - -In order to restart mysql, the command is: - -```ad-command -~~~bash -sudo service mysql restart -~~~ +```ad-bug +title: authentication token +LWERS4M7njDLiAJe5A6gkv9jRDabvnzBGyYk9vPr1F5dY0LMu47FSjB0v21BAE83rYTOksElzcYmioWA ```   -##### Security +##### Logwatch [[#^Top|TOP]] -| Program name | Type | Description -|----------------|------|------------- -| **[[Configuring Fail2ban|fail2ban]]** | Daemon | Blocks suspicious attempts to login -| **unattended-upgrades** | Program | Enables automatic updates of installed programs and OS -| **logwatch** | Daemon | Monitors activity on server and sends activity logs + +TO FILL   @@ -194,14 +155,6 @@ sudo service mysql restart [[#^Top|TOP]] Classic [[Configuring Fail2ban|fail2ban]] installation with a dedicated configuration: -```ad-command -~~~bash -sudo nano /etc/fail2ban/jail.d/sshd.local -~~~ -``` - -With the following parameters: - ```ad-code ~~~yaml [sshd] @@ -212,58 +165,23 @@ bantime = 1m ~~~ ``` -  - -Please refer to the [[Configuring Fail2ban|conf guide]] for a detailed description. - -  - -##### Postfix - -Mail Transfer Agent. Configuration is standard to allow for emails to be sent by programs / deamons / [[Nextcloud]] or others. Such a [[Configuring Postfix|system]] is required for every server to work correctly. - -  - -##### APCu -[[#^Top|TOP]] -Memory caching addon for Nextcloud. Memory caching management is provided by Nextcloud and needs to be set up as a system cron job. After installing APCu, the webserver needs to be **restarted** and the cron job defined: - -1. **Define the cronjob** +under the dedicated jail conf file: ```ad-command ~~~bash -sudo crontab -u www-data -e -~~~ -``` - -2. **Add cronjob** - -```ad-code -~~~bash - */5 * * * * php -f /var/www/html/nextcloud/cron.php --define apc.enable_cli=1 +sudo nano /etc/fail2ban/jail.d/sshd.local ~~~ ``` -3. **Verify that the cron job is added** +  -```ad-command -~~~bash -sudo crontab -u www-data -l -~~~ -``` +Please refer to the [[Configuring Fail2ban|conf guide]] for a detailed description.   -##### SVG support -[[#^Top|TOP]] -SVG support is installed in the form of a package. +##### Postfix -```ad-command -~~~bash -sudo apt-get update -y -sudo apt-get install -y libmagickcore-6.q16-6-extra -~~~ -``` +Mail Transfer Agent. Configuration is standard to allow for emails to be sent by programs / deamons / [[Nextcloud]] or others. Such a [[Configuring Postfix|system]] is required for every server to work correctly. &emsp @@ -302,45 +220,6 @@ List of monitored services: #### Service management [[#^Top|TOP]] -Nextcloud offers two alternatives for managing the service: -1. An admin webpanel -2. A command line tool - -  - -##### Admin webpanel - -Accessed through login into the service with admin credentials. Settings offer an admin section. - -  - -##### Nextcloud command line tool -[[#^Top|TOP]] -From the server's command line, Nextcloud offers the ability to perform some tasks like user management. - -  - -###### Introduction to the command - -[[Nextcloud]] offers a command-line tool which permission needs to be set to "executable". It is located here: - -```ad-path -/var/www/html/nextcloud/occ -``` - -The tool needs to be invoked by the "www-data" user and compiled with PHP: - -```ad-command -~~~bash -sudo -u www-data php /var/www/html/nextcloud/occ -~~~ -``` - -  - -###### Generic commands - -[[Nextcloud]] offers a simple description of all commands [here](https://docs.nextcloud.com/server/22/admin_manual/configuration_server/occ_command.html)   @@ -350,15 +229,6 @@ sudo -u www-data php /var/www/html/nextcloud/occ #### Data transfer [[#^Top|TOP]] -After each data transfer, run the following command to refresh [[Nextcloud]]'s webapp: - -```ad-command -~~~bash -sudo -u www-data php /var/www/html/nextcloud/occ files:scan --all -~~~ -``` - -More info can be found [here](https://docs.nextcloud.com/server/22/admin_manual/configuration_server/occ_command.html)   @@ -369,7 +239,7 @@ title: Data transfer tool [rclone](https://autoize.com/moving-data-from-cloud-to-cloud-with-rclone/) ``` -rClone uses a simple config interface to configure remote hosts (including [[Nextcloud]]): +rClone uses a simple config interface to configure remote hosts: ```ad-command ~~~bash @@ -397,44 +267,6 @@ rclone sync source:'datapath' dest:'datapath'   -##### Upload from local - -```ad-bug -[Curl](https://cylab.be/blog/33/how-to-upload-your-files-to-nextcloud-file-drop-using-curl) -[Nextcloud help](https://help.nextcloud.com/t/how-to-upload-and-share-file-automatically/19202) -``` - -  - -##### Directories -[[#^Top|TOP]] -1. **Local file structure** - -```ad-path -/var/www/html/nextcloud/data/USERNAME/files -``` - -2. **Webdav file structure** - -```ad-path -/remote.php/dav/files/USERNAME -``` - -  - ---- - -  - -#### Nextcloud server hardening -[[#^Top|TOP]] -```ad-bug -title: Nextcloud tutorial -[Here](https://docs.nextcloud.com/server/latest/admin_manual/installation/harden_server.html) -``` - -  - ---   @@ -459,13 +291,7 @@ title: Nextcloud tutorial   - [ ] :cloud: [[Server Cloud]]: Backup server %%done_del%% 🔁 every 6 months on the 1st Tuesday 📅 2022-09-06 -- [x] [[Server Cloud]]: Backup server 🔁 every 6 months on the 1st Tuesday 📅 2022-03-11 ✅ 2022-03-11 -- [x] [[Server Cloud]]: Backup server 🔁 every 6 months on the 1st Tuesday 📅 2021-09-15 ✅ 2022-01-08 -- [x] [[Server Cloud]]: Backup server 🔁 every 6 months on the 1st Tuesday ✅ 2021-09-14 -- [x] Set-up landing page - -- [ ] :cloud: [[Selfhosting]], [[Server Cloud|Cloud]]: Upgrader & Health checks %%done_del%% 🔁 every 4 months 📅 2022-09-01 -- [x] [[Selfhosting]], [[Server Cloud|Cloud]]: Upgrader & Health checks 🔁 every 4 months 📅 2022-05-01 ✅ 2022-05-05 +- [ ] :cloud: [[Selfhosting]], [[Server Cloud|Cloud]]: Upgrader & Health checks %%done_del%% 🔁 every 4 months 📅 2023-01-01 [[#^Top|TOP]]